<?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>touchInlineEdit</name>
	<version>1.8.0</version>
  <mincmsversion>1.6.4</mincmsversion>
	<help><![CDATA[PGgzPlZlcndlbmR1bmc8L2gzPg0KPHVsPg0KICA8bGk+DQogICAgMSkgPHNwYW4gc3R5bGU9JnF1b3Q7Y29sb3I6b3JhbmdlJnF1b3Q7PldpY2h0aWchPC9zcGFuPiBGJnV1bWw7Z2VuIFNpZSBkZW4ge2Ntc19tb2R1bGUgbW9kdWxlPSZxdW90O3RvdWNoSW5saW5lRWRpdCZxdW90O30gVGFnIGluIGplZGVzIFRlbXBsYXRlIGluIGRlbSBTaWUgZGFzIE1vZHVsIG51dHplbiBtJm91bWw7Y2h0ZW4gb2JlbiBkaXJla3QgbmFjaCBkZW0ge3Byb2Nlc3NfcGFnZWRhdGF9IFRhZyBlaW4uPGJyIC8+DQogICAgMikgS29uZmlndXJpZXJlbiBTaWUgZGllIEdydXBwZW5yZWNodGUgKHNldHplIEJlcmVjaHRpZ3VuZzogVXNlIHRvdWNoSW5saW5lRWRpdCkgb2RlciBrb25maWd1cmllcmVuIFNpZSBkaWUgb3B0aW9uYWxlIEZyb250ZW50VXNlciAoRkVVKSBVbnRlcnN0JnV1bWw7dHp1bmcuDQogIDwvbGk+DQo8L3VsPg0KPGgzPiZVdW1sO2JlcjwvaDM+DQo8dWw+DQogIDxsaT5Db3B5cmlnaHQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8iPnRvdWNoRGVzaWduPC9hPjwvbGk+DQogIDxsaT5BdXRvciBDaHJpc3RvcGggR3J1YmVyPC9saT4NCiAgPGxpPkNNU21zIFRvdWNoSW5saW5lRWRpdCA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoaW5saW5lZWRpdCI+UHJvamVrdHNlaXRlPC9hPjwvbGk+DQogIDxsaT5TdXBwb3J0IHZpYSA8YSBocmVmPSJodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wIj5IUEM8L2E+PC9saT4NCiAgPGxpPkxpY2Vuc2UgR1BMIDIuMDwvbGk+DQo8L3VsPjxoMz5SRUFETUU8L2gzPjxwcmU+UkVBRE1FCj09PT09PQoKV2hhdCBpcyBUb3VjaElubGluZUVkaXQ/Ci0tLS0tLS0tLS0tLS0tLS0tCgpUb3VjaElubGluZUVkaXQgaXMgYSBmcm9udGVuZCBpbmxpbmUgZWRpdG9yIG1vZHVsZSBmb3IgdGhlIHBvcHVsYXIgQ29udGVudCBtYW5hZ2VtZW50IApzeXN0ZW0gQ01TbWFkZXNpbXBsZS4gSXQgYWxsb3dzIGFkbWlucyBhbmQgZnJvbnRlbmQgdXNlcnMgdG8gZWRpdCBjb250ZW50IGRpcmVjdGx5IAp3aXRob3V0IHZpc2l0IChvciBsb2dpbiBpbnRvKSB0aGUgYWRtaW4gYmFja2VuZC4KCkZlYXR1cmVzCi0tLS0tLS0tLS0tLS0tLS0KCiogRmxleGlibGUgaW5saW5lIGVkaXRvcnMgbmljRWRpdCwgZWxSVEUKKiBPcHRpb25hbCBGcm9udGVuZFVzZXJzIHN1cHBvcnQKKiBHcm91cCBhbmQgcGVybWlzc2lvbiBtYW5hZ2VtZW50CiogUXVpY2svZmFzdCBlZGl0IG9mIGNvbnRlbnRzCiogUGx1Z2luIHN5c3RlbQoqIGFuZCBtdWNoIG1vcmUuLi4KClRyYW5zbGF0aW9ucwotLS0tLS0tLS0tLS0KCkVuZ2xpc2g6IE1vZHVsZSBkZWZhdWx0Ckdlcm1hbjogQ01TbXMgY29tbXVuaXR5IFRDCkR1dGNoOiBDTVNtcyBjb21tdW5pdHkgVEMKUnVzc2lhbjogQ01TbXMgY29tbXVuaXR5IFRDCgpSZXF1aXJlbWVudHMKLS0tLS0tLS0tLS0tCgpBIG1vZGVybiB3ZWJicm93c2VyIGFuZCBtaW5pbXVtIENNU21zIDEuNi40IG9yIGJldHRlciAxLjkueC4KCkF1dGhvciAmIENvcHlyaWdodAotLS0tLS0tLS0tLS0tLS0tLS0KCkNvcHlyaWdodCBieTogdG91Y2hEZXNpZ24KQ2hpZWYgZGV2ZWxvcGVyOiBDaHJpc3RvcGggR3J1YmVyCgpMaWNlbnNlcwotLS0tLS0tLQoKVG91Y2hJbmxpbmVFZGl0IGlzIHJlbGVhc2VkIHVuZGVyIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIEdQTCAyLjAuCkNNU21hZGVzaW1wbGUgaXMgcmVsZWFzZWQgdW5kZXIgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgR1BMIDIuMC4KVG91Y2hJbmxpbmVFZGl0IHVzZXMgYW5kIGNvbWVzIHdpdGggalF1ZXJ5IGFuZCBqUXVlcnktVUkgd2l0Y2ggYXJlIGlzc3VlZCB1bmRlciBNSVQgYW5kIEdQTCBsaWNlbnNlcy4KVG91Y2hJbmxpbmVFZGl0IHVzZXMgZWxSVEUgaXMgaXNzdWVkIHVuZGVyIGEgMy1jbGF1c2VzIEJTRCBsaWNlbnNlLgpUb3VjaElubGluZUVkaXQgdXNlcyBOaWNFZGl0IGl0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUIGxpY2Vuc2UuClRvdWNoSW5saW5lRWRpdCB1c2VzIHRpbnlNQ0UgaXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBMR1BMLgoKRG9jdW1lbnRhdGlvbgotLS0tLS0tLS0tLS0tCgpQdXQgdGhlIGxvYWQgbW9kdWxlIHRhZyB7Y21zX21vZHVsZSBtb2R1bGU9InRvdWNoSW5saW5lRWRpdCJ9IGludG8gdGhlIGhlYWQgb2YgZWFjaCB0ZW1wbGF0ZSB5b3Ugd2FudCB0byAKdXNlIHRoZSBtb2R1bGUgZGlyZWN0bHkgYWZ0ZXIgdGhlIHtwcm9jZXNzX3BhZ2VkYXRhfSB0YWcuIENvbmZpZ3VyZSB0aGUgZ3JvdXAgcGVybWlzc2lvbnMgZm9yIGFkbWluIAp1c2VycyAoc2V0IHBlcm1pc3Npb246IFVzZSB0b3VjaElubGluZUVkaXQpIG9yIG9wdGlvbmFsIHNldHVwIHRoZSBmcm9udCBlbmQgdXNlciBzdXBwb3J0IChGRVUpIGFuZCB0YWtlIGEgbG9vayAKYXQgdGhlIGNtc21zIGZyb250IGVuZC4KClsxXTogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy90b3VjaGlubGluZWVkaXQKWzJdOiBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wClszXTogaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS9sb2VzdW5nZW4vY21zLW1hZGUtc2ltcGxlL21vZHVsZS5odG08L3ByZT48aDM+UGFyYW1ldGVyPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gRGllc2VyIFBhcmFtZXRlciBsZWd0IGRpZSBTcHJhY2hlIGZlc3QsIGRpZSB2b20gTW9kdWwgZiZ1dW1sO3IgZGllIEF1c2dhYmUgYXVmIGRlciBXZWJzZWl0ZSB2ZXJ3ZW5kZXQgd2lyZC4gRGllcyB3aXJkIGplZG9jaCBuaWNodCB2b24gYWxsZW4gTW9kdWxlbiB1bnRlcnN0JnV1bWw7dHp0IGJ6dy4gYmVuJm91bWw7dGlndC48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0b3I6IENocmlzdG9waCBHcnViZXIgPHRvdWNoRGVzaWduLmRlPiAmbHQ7Yy5ncnViZXJAdG91Y2hkZXNpZ24uZGUmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbiA6IDEuOC4wPGJyIC8+PGJyIC8+JkF1bWw7bmRlcnVuZ3N2ZXJsYXVmOjxiciAvPjxwcmU+Ly8vLyBWZXJzaW9uIDEuOC4wCgpGaXggcGx1Z2luIGVsUlRFIHhodG1sIGxpbmsgZWxlbWVudCBjbG9zZSB0YWcgLz4gIzU5MTgKRml4L1VwZGF0ZSBkZV9ERSB0cmFuc2xhdGlvbgpBZGQgdGlueU1DRSBwbHVnaW4gKHByZXZpZXcpCkFkZCB0cmlnZ2VyX2Vycm9yIGluIGdldFBsdWdpbkluc3RhbmNlCkFkZC9SZXdyaXRlIHRvdWNoSW5saW5lRWRpdFBsdWdpbiBiYXNlIGNsYXNzCkltcHJvdmUgcGx1Z2lucyB0byBzdG9yZSBtb3JlIGluZm9zIGFib3V0IHBsdWdpbnM6IG5hbWUsZGVzY3JpcHRpb24sYXV0aG9yLi4uCkFkZCB0b3VjaE1vZHVsZSBiYXNlIGNsYXNzClJld3JpdGUvVXBkYXRlIHBsdWdpbnMgdGlueU1DRSwgbmljRWRpdCwgZWxSVEUKVXBkYXRlL1Jld3JpdGUgdG91Y2hpbmxpbmVlZGl0LmpzIGFzIGNsZWFuIGphdmFzY3JpcHQgY2xhc3MKQWRkIGFkbWluIGRlc2NyaXB0aW9uIGZvciBtb2R1bGUgbWFuYWdlcgpBZGQgZGVzY3JpcHRpb24gZm9yIG1vZHVsZQpSZW5hbWUgbWV0aG9kIGhhc0lubGluZUVkaXRSaWdodHMgLT4gaXNFbmFibGVkCkltcG9ydCBwbHVnaW4gdGVtcGxhdGVzIHRvIERCIChlZGl0YWJsZSkKQWRkIHBsdWdpbiB1bmluc3RhbGwgbWV0aG9kIChyZW1vdmUgdW51c2VkIHRlbXBsYXRlcywgdmFycy4uLikKRGV0YWNoIGV2ZW50cyBmcm9tIG1vZHVsZSBjbGFzcyBhbmQgY2FsbCBmcm9tIHBhcmVudCBEb0V2ZW50CkNsZWFudXAgY29kZSBhbmQgY29tbWVudHMKVXNlIGNtc21zIGF1dG9sb2FkZXIgZm9yIGludGVybmFsIHRvdWNoIGNsYXNzZXMKQWRkIG1heGhlaWdodCBhbmQgYnV0dG9ubGlzdCBwYXJhbWV0ZXIgaW4gbmljRWRpdCBwbHVnaW4KQWRkIHNvbWUgb3B0aW9ucyBmb3IgdGlueU1DRSBwbHVnaW4gKHRpbnkgcGx1Z2luIHN1cHBvcnQsd2lkdGgsaGVpZ2h0LGVkaXRhYmxlIGJ1dHRvbiBsaXN0LHRoZW1lcyxza2lucyBhbmQgbXVjaCBtb3JlLi4uKQpGaXggbG9zdCBlZGl0b3Igc2V0dGluZ3Mgb24gc2F2ZSBzZXR0aW5ncyBpZiBpcyBjdXJyZW50IGVkaXRvciBidWcgIzU5MjIKQWRkIGNvbmZpcm0gbWVzc2FnZSBvbiBjaGFuZ2Ugc2V0dGluZ3MKQWRkIG11bHRpcGxlIGJsb2NrIHN1cHBvcnQKRml4IG1heEhlaWdodCBJRSBidWcgbmljRWRpdApBZGQgbmV3IGZsYWcgc3VwcG9ydHNNdWx0aXBsZQpEaXNhYmxlIG11bHRpcGxlIHN1cHBvcnQgZm9yIGVsUlRFCkFkZCBmZWVkYmFjayBib3gKUmVtb3ZlIHVudXNlZCB0ZW1wbGF0ZSBhZG1pbmVkaXRvci50cGwKUmVnaXN0ZXIgZXZlbnQgY29udGVudFBvc3RSZW5kZXIKCi8vLyBWZXJzaW9uIDEuNy40CgpBZGQgb3B0aW9uYWwgc3VwcG9ydCBmb3IgRnJvbnRlbmRVc2VycyAoRkVVKSBtb2R1bGUgd2l0aCBncm91cCByZXN0cmljdGlvbnMKQWRkIG5ldyB0YWIgcGVybWlzc2lvbnMKQWRkIEdyYW50L1Jldm9rZSBhZG1pbiBpbmxpbmUgZWRpdCBwZXJtaXNzaW9ucwpSZXBsYWNlIHJhZGlvIGJ1dHRvbnMgd2l0aCBkcm9wZG93bnMKVXBkYXRlIHRydWUgZmFsc2UgKDAsMSkgdmFsdWVzClJlbW92ZSBldmVudCBtZXRob2RzClRyYW5zcGxhbnQgdG91Y2hpbmxpbmVlZGl0IGluamVjdG9yIGZvciBtb3JlIGZsZXhpYmlsaXR5IGFuZCBiZXR0ZXIgcGVyZm9ybWFuY2UKU3VwcG9ydCBmb3IgYWx0ZXJuYXRpdmUgQ29udGVudFR5cGVzIChzdWNoIGFzIEFkdmFuY2VkQ29udGVudCkKQ29udGVudCBhc3NpZ25zIG5vdyBhbGxvd2VkLCBmb3IgZXhhbXBsZSB7Y29udGVudCBhc3NpZ249Im15X2NvbnRlbnQifQpHb29kYnllIGlzZWRpdGFibGU9J3RydWUnIGZsYWcKRml4IGNhbGwgaW5zdGFsbCBtZXRob2Qgb24gY2hhbmdlIGVkaXRvciBwbHVnaW4KCi8vLyBWZXJzaW9uIDEuNy4zCgpTZXQgbWF4IGNtc21zIHZlcnNpb24gMS45LjIKRml4IGFsaWFzIHJlbmFtaW5nICM1ODA1CgovLy8gVmVyc2lvbiAxLjcuMgoKRml4IG5vdGljZSBhdHRlbXB0IHRvIGxvYWQgYWRtaW4gcmVhbG0uLi4KRml4IGFsaWFzQXV0b1JlbmFtZQoKLy8vIFZlcnNpb24gMS43LjEKClVwZGF0ZSBmb3IgY21zbXMgMS45LnggY29tcGF0aWJpbGl0eQpTZXQgbmV3IG1pbi9tYXggY21zbXMgdmVyc2lvbnM6IDEuNi40LTEuOS4xClVwZGF0ZSB0cmFuc2xhdGlvbgpDYWxsIHBhcmVudCBjb25zdHJ1Y3RvciBpbiBwbHVnaW4gaW5zdGFuY2UKVXBkYXRlIHBsdWdpbnMsIHVzZSBwYXJlbnQgbWV0aG9kcywgcmVtb3ZlICRnQ21zCkZpeCBsb2dnZXIgaW52YWxpZCAkY29udGVudElkClBsdWdpbnM6IEZpeCBBdHRlbXB0IHRvIGxvYWQgYWRtaW4gcmVhbG0KQWRkIGZvcmNlX2NvbXBpbGUgZm9yIGRlYnVnZ2luZwoKLy8vIFZlcnNpb24gMS43CgpBZGQgdGVtcGxhdGUgbGlzdCBpbiBCQQpBZGQgcGx1Z2luIHN5c3RlbQpBZGQgbmV3IHRhYiBlZGl0b3IgaW4gQkEKVXBkYXRlIHRyYW5zbGF0aW9ucwpBZGQgcGx1Z2luIG5pY2VkaXQKQWRkIHBsdWdpbiBlbHJ0ZQpSZW1vdmUgalF1ZXJ5IGNvbnRleHRtZW51ClVwZGF0ZSBJbnN0YWxsZXIKVXBkYXRlIGljb25zIHBhdGggZm9yIG5pY2VkaXQKQWRkIENNU21zIG1heCB2ZXJzaW9uCgovLy8gVmVyc2lvbiAxLjYKCkFkZCBvcHRpb24gdG8gZW5hYmxlL2Rpc2FibGUgaW5saW5lRWRpdCBvbiBkYmxjbGljawpBZGQgb3B0aW9uYWwgY29udGV4dCBtZW51ICh0ZXN0aW5nKQpFbmFibGUgbG9nZ2luZyBpbiBpbnN0YWxsZXIgYW5kIHVwZ3JhZGUgbWV0aG9kcwpFbmFibGUgbG9nZ2luZyBvbiBjb250ZW50IGFjdGlvbnMKTW92ZSBzb21lIHN0dWZmIGludG8gZXZlbnQgbWFuYWdlcgpDbGVhbiBjb2RlIAoKLy8vIFZlcnNpb24gMS41CgpBZGQgaHRtbCBzb3VyY2UgY29kZSBlZGl0b3IKQWRkIHhodG1sIHN1cHBvcnQgKGV4cGVyaW1lbnRhbCkKRml4IGFqYXggcmVxdWVzdCBlbmNvZGluZwpCdWdmaXgKCi8vLyBWZXJzaW9uIDEuNAoKTW92ZSBqYXZhc2NyaXB0cyBleHRlcm5hbApVcGRhdGUgZmV0Y2ggdHBsIGNvbnRlbnRzIChwbHVnaW5zLHRhZ3MsbW9kdWxlcykgb24gY29udGVudCB1cGRhdGUKU29tZSBidWdmaXhlcyAKCi8vLyBWZXJzaW9uIDEuMwoKQWRkIGJ1dHRvbiB0ZW1wbGF0ZQpBZGQgb3B0aW9uIHRvIGxvYWQganF1ZXJ5ClVwZGF0ZSBsYW5ndWFnZQpVcGRhdGUgY29udGVudCB1cGRhdGUKQ2xlYW4gY29kZQoKLy8vIFZlcnNpb24gMS4yCgpBZGQgdXBncmFkZSBtZXRob2QKQWRkIENNUyBtaW5pbXVtIHZlcnNpb24KQWRkIGNzcyBjbGFzcyAudG91Y2hJbmxpbmVFZGl0QnV0dG9uIHt9CkZpeCBjb21waWxlZCBjb250ZW50X2lkCgovLy8gVmVyc2lvbiAxLjEKCkFkZCBzb21lIHNldHRpbmdzIGluIGFkbWluIHBhbmVsClVwZGF0ZSB0cmFuc2xhdGlvbgpBZGQgZ2VybWFuIHRyYW5zbGF0aW9uCkFkZCBwb3N0aW5zdGFsbCBtZXNzYWdlCkFkZCBwb3N0dW5pbnN0YWxsIG1lc3NhZ2UKCi8vLyBWZXJzaW9uIDEuMAoKSW5pdGlhbCByZWxlYXNlPC9wcmU+PGJyIC8+]]></about>
	<description><![CDATA[Ein umfangreiches Inlineeditormodul.]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogYWN0aW9uLmRlZmF1bHQucGhwIDEzNiAyMDExLTAxLTA4IDExOjU4OjAyWiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBNb2R1bGUKICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjguMAogKiBAY29weXJpZ2h0IDIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqCiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgokdG91Y2hJbmxpbmVFZGl0ID0gdG91Y2hNb2R1bGU6OmdldENNU01vZHVsZUluc3RhbmNlKCd0b3VjaElubGluZUVkaXQnKTsKCmlmKCR0b3VjaElubGluZUVkaXQpewogIGlmKCR0b3VjaElubGluZUVkaXQtPmlzRW5hYmxlZCgpKXsKICAgIGlmKCR0b3VjaElubGluZUVkaXQtPnRvdWNoLT5pc0FKQVhSZXF1ZXN0KCkpewogICAgICBzd2l0Y2ggKCRfUE9TVFsnbWV0aG9kJ10pewogICAgICAgIGNhc2UgJ3VwZGF0ZUNvbnRlbnQnOgogICAgICAgICAgZGllKCR0b3VjaElubGluZUVkaXQtPnVwZGF0ZUNvbnRlbnQoKSk7CiAgICAgICAgY2FzZSAnZ2V0Q29udGVudCc6CiAgICAgICAgICBkaWUoJHRvdWNoSW5saW5lRWRpdC0+Z2V0Q29udGVudCgpKTsKICAgICAgfQogICAgfQogIH0KfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogYWN0aW9uLmRlZmF1bHRhZG1pbi5waHAgMTMzIDIwMTEtMDEtMDcgMTQ6MzM6MzFaIHRvdWNoZGVzaWduICQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuOC4wCiAqIEBjb3B5cmlnaHQgMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICoKICoKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmlmKCFpc3NldCgkZ0NtcykpewogIGV4aXQ7Cn0KCmlmKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdVc2UgdG91Y2hJbmxpbmVFZGl0JykpewogIGVjaG8gJHRoaXMtPmxhbmcoIm5vcGVybWlzc2lvbiIpOwogIHJldHVybjsKfQoKLy8gQWN0aXZlIHRhYgokYWN0aXZlVGFiID0gIiI7CmlmKCFlbXB0eSgkcGFyYW1zWyJ0YWIiXSkpewogICRhY3RpdmVUYWIgPSAkcGFyYW1zWyJ0YWIiXTsKfQoKLy8gVE9ETzogcmVtb3ZlLCByZXBsYWNlCiR5biA9IGFycmF5KAogICR0aGlzLT5MYW5nKCJ5ZXMiKSA9PiAnWScsCiAgJHRoaXMtPkxhbmcoIm5vIikgPT4gJ04nCik7Ci8vIFRPRE86IHJlbW92ZSwgcmVwbGFjZQokYm9vbCA9IGFycmF5KAogICR0aGlzLT5MYW5nKCJ5ZXMiKSA9PiAndHJ1ZScsCiAgJHRoaXMtPkxhbmcoIm5vIikgPT4gJ2ZhbHNlJwopOwoKJHluID0gYXJyYXkoCiAgJHRoaXMtPkxhbmcoIm5vIikgPT4gMCwKICAkdGhpcy0+TGFuZygieWVzIikgPT4gMQopOwoKZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7CgplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoInNldHRpbmdzIiwkdGhpcy0+TGFuZygic2V0dGluZ3MiKSwoJGFjdGl2ZVRhYiA9PSAnc2V0dGluZ3MnID8gdHJ1ZSA6IGZhbHNlKSk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigicGVybWlzc2lvbnMiLCR0aGlzLT5MYW5nKCJwZXJtaXNzaW9ucyIpLCgkYWN0aXZlVGFiID09ICdwZXJtaXNzaW9ucycgPyB0cnVlIDogZmFsc2UpKTsKZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCJ0ZW1wbGF0ZXMiLCR0aGlzLT5MYW5nKCJ0ZW1wbGF0ZXMiKSwoJGFjdGl2ZVRhYiA9PSAndGVtcGxhdGVzJyA/IHRydWUgOiBmYWxzZSkpOwplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoImVkaXRvciIsJHRoaXMtPkxhbmcoImVkaXRvciIpLCgkYWN0aXZlVGFiID09ICdlZGl0b3InID8gdHJ1ZSA6IGZhbHNlKSk7CgplY2hvICR0aGlzLT5FbmRUYWJIZWFkZXJzKCk7CgplY2hvICR0aGlzLT5TdGFydFRhYkNvbnRlbnQoKTsKCi8vIFRhYiBzZXR0aW5ncwplY2hvICR0aGlzLT5TdGFydFRhYigic2V0dGluZ3MiKTsKaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX3NldHRpbmdzLnBocCcpOwplY2hvICR0aGlzLT5FbmRUYWIoKTsKCi8vIFRhYiBwZXJtaXNzaW9ucwplY2hvICR0aGlzLT5TdGFydFRhYigicGVybWlzc2lvbnMiKTsKaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX3Blcm1pc3Npb25zLnBocCcpOwplY2hvICR0aGlzLT5FbmRUYWIoKTsKCi8vIFRhYiB0ZW1wbGF0ZXMKaWYoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpKXsKCiAgZWNobyAkdGhpcy0+U3RhcnRUYWIoInRlbXBsYXRlcyIpOwogIGluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykuJy9mdW5jdGlvbi5hZG1pbl90ZW1wbGF0ZXMucGhwJyk7CiAgZWNobyAkdGhpcy0+RW5kVGFiKCk7Cgp9CgovLyBFZGl0b3Igc3BlY2lmaWMgc2V0dGluZ3MKaWYobWV0aG9kX2V4aXN0cygkdGhpcy0+Z2V0UGx1Z2luKCksJ2dldEFkbWluQ29uZmlnJykpewoKICBlY2hvICR0aGlzLT5TdGFydFRhYigiZWRpdG9yIik7CiAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX2VkaXRvci5waHAnKTsKICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKCn0KCmVjaG8gJHRoaXMtPkVuZFRhYkNvbnRlbnQoKTsKCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.edittemplate.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZCQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuOC4wCiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICoKICoKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmlmKCFpc3NldCgkZ0NtcykpewogIGV4aXQ7Cn0KCmlmKCEkdGhpcy0+VmlzaWJsZVRvQWRtaW5Vc2VyKCkpewogICR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCJhY2Nlc3NkZW5pZWQiKSk7CiAgcmV0dXJuOwp9CgovLyBGb3JtIHN0YXJ0CiR0aGlzLT5zbWFydHktPmFzc2lnbignZm9ybXN0YXJ0JywkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwic2F2ZXRlbXBsYXRlIiwkcmV0dXJuaWQpKTsKCiR0aGlzLT5zbWFydHktPmFzc2lnbigndGVtcGxhdGUnLCR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsInRlbXBsYXRlIiwkcGFyYW1zWyd0ZW1wbGF0ZSddKSk7CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RlbXBsYXRlX25hbWUnLCRwYXJhbXNbJ3RlbXBsYXRlJ10pOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RlbXBsYXRlX2NvbnRlbnQnLCR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJHRoaXMtPkdldFRlbXBsYXRlKCRwYXJhbXNbJ3RlbXBsYXRlJ10pLAogICd0ZW1wbGF0ZV9jb250ZW50JywicGFnZXNtYWxsdGV4dGFyZWEiLCIiLCIiLCIiLCc0MCcsJzUnKSk7CgovLyBTdWJtaXQgLyBjYW5jZWwKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsInN1Ym1pdCIsJHRoaXMtPkxhbmcoInNhdmUiKSkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Jlc2V0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCJyZXNldCIsJHRoaXMtPkxhbmcoInJlc2V0IikpKTsKCi8vIEZvcm0gZW5kCiR0aGlzLT5zbWFydHktPmFzc2lnbignZm9ybWVuZCcsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CgplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoImFkbWluZWRpdHRlbXBsYXRlLnRwbCIpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.saveeditor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogYWN0aW9uLnNhdmVzZXR0aW5ncy5waHAgNTEgMjAxMC0wOS0xMyAxNDowNjoyNVogdG91Y2hkZXNpZ24gJAogKgogKiB0b3VjaElubGluZUVkaXQgTW9kdWxlCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMCB0b3VjaERlc2lnbiwgPHd3dy50b3VjaGRlc2lnbi5kZT4KICoKICogQGNhdGVnb3J5IE1vZHVsZQogKiBAYXV0aG9yIENocmlzdG9waCBHcnViZXIgPHd3dy50b3VjaGRlc2lnbi5kZT4KICogQHZlcnNpb24gMS44LjAKICogQGNvcHlyaWdodCAwNC4wOC4yMDEwIHRvdWNoRGVzaWduCiAqIEBsaW5rIGh0dHA6Ly93d3cudG91Y2hkZXNpZ24uZGUvCiAqIEBsaW5rIGh0dHA6Ly93d3cuaG9tZXBhZ2UtY29tbXVuaXR5LmRlL2luZGV4LnBocD90b3BpYz0xNjgwLjAKICogQGxpbmsgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy90b3VjaElubGluZUVkaXQKICogQGxpY2Vuc2UgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwgMi4wKQogKgogKiAKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmlmKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBTZXR0aW5ncycpKXsKICBlY2hvICR0aGlzLT5sYW5nKCJub3Blcm1pc3Npb24iKTsKICByZXR1cm47Cn0KCiR0aGlzLT5nZXRQbHVnaW4oKS0+dXBkYXRlKCRwYXJhbXMpOwoKJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RlZmF1bHRhZG1pbicsICcnLCBhcnJheSgibW9kdWxlX21lc3NhZ2UiID0+ICR0aGlzLT5MYW5nKCJzZXR0aW5nc3NhdmVkIiksInRhYiIgPT4gImVkaXRvciIpKTsKCj8+]]></data>
	</file>
	<file>
	  <filename>/action.savepermissions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogYWN0aW9uLnNhdmVwZXJtaXNzaW9ucy5waHAgMTMxIDIwMTEtMDEtMDYgMTU6NDQ6NTdaIHRvdWNoZGVzaWduICQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuOC4wCiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICoKICogCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgppZighJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgU2V0dGluZ3MnKSl7CiAgZWNobyAkdGhpcy0+bGFuZygibm9wZXJtaXNzaW9uIik7CiAgcmV0dXJuOwp9CgppZihpc3NldCgkcGFyYW1zWyJmZUZFVWFsbG93Il0pKXsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlRkVVYWxsb3ciLGludHZhbCgkcGFyYW1zWyJmZUZFVWFsbG93Il0pKTsKfQoKaWYoaXNzZXQoJHBhcmFtc1siZmVGRVVncm91cHMiXSkpewogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuZmVGRVVncm91cHMiLGltcGxvZGUoJywnLCRwYXJhbXNbImZlRkVVZ3JvdXBzIl0pKTsKfWVsc2V7CiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC5mZUZFVWdyb3VwcyIsJycpOwp9CgppZihpc3NldCgkcGFyYW1zWyJmZUFkbWluQWxsb3ciXSkpewogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuZmVBZG1pbkFsbG93IixpbnR2YWwoJHBhcmFtc1siZmVBZG1pbkFsbG93Il0pKTsKfQoKJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RlZmF1bHRhZG1pbicsICcnLCBhcnJheSgibW9kdWxlX21lc3NhZ2UiID0+ICR0aGlzLT5MYW5nKCJzZXR0aW5nc3NhdmVkIiksInRhYiIgPT4gInBlcm1pc3Npb25zIikpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.savesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogYWN0aW9uLnNhdmVzZXR0aW5ncy5waHAgMTQ1IDIwMTEtMDEtMDkgMjA6MTA6NTJaIHRvdWNoZGVzaWduICQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuOC4wCiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICoKICoKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmlmKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBTZXR0aW5ncycpKXsKICBlY2hvICR0aGlzLT5sYW5nKCJub3Blcm1pc3Npb24iKTsKICByZXR1cm47Cn0KCmlmKGlzc2V0KCRwYXJhbXNbImZlRWRpdEJ1dHRvbiJdKSl7CiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC5mZUVkaXRCdXR0b24iLGludHZhbCgkcGFyYW1zWyJmZUVkaXRCdXR0b24iXSkpOwp9CmlmKGlzc2V0KCRwYXJhbXNbImZlRWRpdE9uRGJsQ2xpY2siXSkpewogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuZmVFZGl0T25EYmxDbGljayIsaW50dmFsKCRwYXJhbXNbImZlRWRpdE9uRGJsQ2xpY2siXSkpOwp9CmlmKGlzc2V0KCRwYXJhbXNbImZlVXBkYXRlQWxlcnRNZXNzYWdlIl0pKXsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlVXBkYXRlQWxlcnRNZXNzYWdlIiwkcGFyYW1zWyJmZVVwZGF0ZUFsZXJ0TWVzc2FnZSJdKTsKfQppZihpc3NldCgkcGFyYW1zWyJmZUVkaXRCdXR0b25UZXh0Il0pKXsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlRWRpdEJ1dHRvblRleHQiLCRwYXJhbXNbImZlRWRpdEJ1dHRvblRleHQiXSk7Cn0KaWYoaXNzZXQoJHBhcmFtc1siZmVQbHVnaW4iXSkgJiYgIWVtcHR5KCRwYXJhbXNbImZlUGx1Z2luIl0pKXsKICAkZWRpdG9yID0gJHRoaXMtPmdldFBsdWdpbigkcGFyYW1zWyJmZVBsdWdpbiJdKTsKICBpZihtZXRob2RfZXhpc3RzKCRlZGl0b3IsJ2luc3RhbGwnKSl7CiAgICBpZigkZWRpdG9yLT5pbnN0YWxsKCkpewogICAgICAkdGhpcy0+Z2V0UGx1Z2luKCktPnVuaW5zdGFsbCgpOwogICAgfQogIH0KICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlUGx1Z2luIiwkcGFyYW1zWyJmZVBsdWdpbiJdKTsKfQoKJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RlZmF1bHRhZG1pbicsICcnLCBhcnJheSgibW9kdWxlX21lc3NhZ2UiID0+ICR0aGlzLT5MYW5nKCJzZXR0aW5nc3NhdmVkIiksInRhYiIgPT4gInNldHRpbmdzIikpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.savetemplate.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogYWN0aW9uLnNhdmVzZXR0aW5ncy5waHAgOCAyMDEwLTA4LTI4IDAzOjU2OjA5WiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBNb2R1bGUKICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjguMAogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqCiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgppZighJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpKXsKICBlY2hvICR0aGlzLT5sYW5nKCJub3Blcm1pc3Npb24iKTsKICByZXR1cm47Cn0KCmlmKGlzc2V0KCRwYXJhbXNbJ3Jlc2V0J10pKXsKICAkdGhpcy0+U2V0VGVtcGxhdGUoJHBhcmFtc1sndGVtcGxhdGUnXSwgJHRoaXMtPnRvdWNoLT5nZXRUZW1wbGF0ZSgkcGFyYW1zWyd0ZW1wbGF0ZSddKSk7Cn1lbHNlaWYoaXNzZXQoJHBhcmFtc1sidGVtcGxhdGVfY29udGVudCJdKSAmJiAhZW1wdHkoJHBhcmFtc1sidGVtcGxhdGVfY29udGVudCJdKSl7CiAgJHRoaXMtPlNldFRlbXBsYXRlKCRwYXJhbXNbJ3RlbXBsYXRlJ10sICRwYXJhbXNbJ3RlbXBsYXRlX2NvbnRlbnQnXSk7Cn0KCiR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgYXJyYXkoIm1vZHVsZV9tZXNzYWdlIiA9PiAkdGhpcy0+TGFuZygidGVtcGxhdGVzc2F2ZWQiKSwidGFiIiA9PiAidGVtcGxhdGVzIikpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/CHANGELOG</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8vLyBWZXJzaW9uIDEuOC4wCgpGaXggcGx1Z2luIGVsUlRFIHhodG1sIGxpbmsgZWxlbWVudCBjbG9zZSB0YWcgLz4gIzU5MTgKRml4L1VwZGF0ZSBkZV9ERSB0cmFuc2xhdGlvbgpBZGQgdGlueU1DRSBwbHVnaW4gKHByZXZpZXcpCkFkZCB0cmlnZ2VyX2Vycm9yIGluIGdldFBsdWdpbkluc3RhbmNlCkFkZC9SZXdyaXRlIHRvdWNoSW5saW5lRWRpdFBsdWdpbiBiYXNlIGNsYXNzCkltcHJvdmUgcGx1Z2lucyB0byBzdG9yZSBtb3JlIGluZm9zIGFib3V0IHBsdWdpbnM6IG5hbWUsZGVzY3JpcHRpb24sYXV0aG9yLi4uCkFkZCB0b3VjaE1vZHVsZSBiYXNlIGNsYXNzClJld3JpdGUvVXBkYXRlIHBsdWdpbnMgdGlueU1DRSwgbmljRWRpdCwgZWxSVEUKVXBkYXRlL1Jld3JpdGUgdG91Y2hpbmxpbmVlZGl0LmpzIGFzIGNsZWFuIGphdmFzY3JpcHQgY2xhc3MKQWRkIGFkbWluIGRlc2NyaXB0aW9uIGZvciBtb2R1bGUgbWFuYWdlcgpBZGQgZGVzY3JpcHRpb24gZm9yIG1vZHVsZQpSZW5hbWUgbWV0aG9kIGhhc0lubGluZUVkaXRSaWdodHMgLT4gaXNFbmFibGVkCkltcG9ydCBwbHVnaW4gdGVtcGxhdGVzIHRvIERCIChlZGl0YWJsZSkKQWRkIHBsdWdpbiB1bmluc3RhbGwgbWV0aG9kIChyZW1vdmUgdW51c2VkIHRlbXBsYXRlcywgdmFycy4uLikKRGV0YWNoIGV2ZW50cyBmcm9tIG1vZHVsZSBjbGFzcyBhbmQgY2FsbCBmcm9tIHBhcmVudCBEb0V2ZW50CkNsZWFudXAgY29kZSBhbmQgY29tbWVudHMKVXNlIGNtc21zIGF1dG9sb2FkZXIgZm9yIGludGVybmFsIHRvdWNoIGNsYXNzZXMKQWRkIG1heGhlaWdodCBhbmQgYnV0dG9ubGlzdCBwYXJhbWV0ZXIgaW4gbmljRWRpdCBwbHVnaW4KQWRkIHNvbWUgb3B0aW9ucyBmb3IgdGlueU1DRSBwbHVnaW4gKHRpbnkgcGx1Z2luIHN1cHBvcnQsd2lkdGgsaGVpZ2h0LGVkaXRhYmxlIGJ1dHRvbiBsaXN0LHRoZW1lcyxza2lucyBhbmQgbXVjaCBtb3JlLi4uKQpGaXggbG9zdCBlZGl0b3Igc2V0dGluZ3Mgb24gc2F2ZSBzZXR0aW5ncyBpZiBpcyBjdXJyZW50IGVkaXRvciBidWcgIzU5MjIKQWRkIGNvbmZpcm0gbWVzc2FnZSBvbiBjaGFuZ2Ugc2V0dGluZ3MKQWRkIG11bHRpcGxlIGJsb2NrIHN1cHBvcnQKRml4IG1heEhlaWdodCBJRSBidWcgbmljRWRpdApBZGQgbmV3IGZsYWcgc3VwcG9ydHNNdWx0aXBsZQpEaXNhYmxlIG11bHRpcGxlIHN1cHBvcnQgZm9yIGVsUlRFCkFkZCBmZWVkYmFjayBib3gKUmVtb3ZlIHVudXNlZCB0ZW1wbGF0ZSBhZG1pbmVkaXRvci50cGwKUmVnaXN0ZXIgZXZlbnQgY29udGVudFBvc3RSZW5kZXIKCi8vLyBWZXJzaW9uIDEuNy40CgpBZGQgb3B0aW9uYWwgc3VwcG9ydCBmb3IgRnJvbnRlbmRVc2VycyAoRkVVKSBtb2R1bGUgd2l0aCBncm91cCByZXN0cmljdGlvbnMKQWRkIG5ldyB0YWIgcGVybWlzc2lvbnMKQWRkIEdyYW50L1Jldm9rZSBhZG1pbiBpbmxpbmUgZWRpdCBwZXJtaXNzaW9ucwpSZXBsYWNlIHJhZGlvIGJ1dHRvbnMgd2l0aCBkcm9wZG93bnMKVXBkYXRlIHRydWUgZmFsc2UgKDAsMSkgdmFsdWVzClJlbW92ZSBldmVudCBtZXRob2RzClRyYW5zcGxhbnQgdG91Y2hpbmxpbmVlZGl0IGluamVjdG9yIGZvciBtb3JlIGZsZXhpYmlsaXR5IGFuZCBiZXR0ZXIgcGVyZm9ybWFuY2UKU3VwcG9ydCBmb3IgYWx0ZXJuYXRpdmUgQ29udGVudFR5cGVzIChzdWNoIGFzIEFkdmFuY2VkQ29udGVudCkKQ29udGVudCBhc3NpZ25zIG5vdyBhbGxvd2VkLCBmb3IgZXhhbXBsZSB7Y29udGVudCBhc3NpZ249Im15X2NvbnRlbnQifQpHb29kYnllIGlzZWRpdGFibGU9J3RydWUnIGZsYWcKRml4IGNhbGwgaW5zdGFsbCBtZXRob2Qgb24gY2hhbmdlIGVkaXRvciBwbHVnaW4KCi8vLyBWZXJzaW9uIDEuNy4zCgpTZXQgbWF4IGNtc21zIHZlcnNpb24gMS45LjIKRml4IGFsaWFzIHJlbmFtaW5nICM1ODA1CgovLy8gVmVyc2lvbiAxLjcuMgoKRml4IG5vdGljZSBhdHRlbXB0IHRvIGxvYWQgYWRtaW4gcmVhbG0uLi4KRml4IGFsaWFzQXV0b1JlbmFtZQoKLy8vIFZlcnNpb24gMS43LjEKClVwZGF0ZSBmb3IgY21zbXMgMS45LnggY29tcGF0aWJpbGl0eQpTZXQgbmV3IG1pbi9tYXggY21zbXMgdmVyc2lvbnM6IDEuNi40LTEuOS4xClVwZGF0ZSB0cmFuc2xhdGlvbgpDYWxsIHBhcmVudCBjb25zdHJ1Y3RvciBpbiBwbHVnaW4gaW5zdGFuY2UKVXBkYXRlIHBsdWdpbnMsIHVzZSBwYXJlbnQgbWV0aG9kcywgcmVtb3ZlICRnQ21zCkZpeCBsb2dnZXIgaW52YWxpZCAkY29udGVudElkClBsdWdpbnM6IEZpeCBBdHRlbXB0IHRvIGxvYWQgYWRtaW4gcmVhbG0KQWRkIGZvcmNlX2NvbXBpbGUgZm9yIGRlYnVnZ2luZwoKLy8vIFZlcnNpb24gMS43CgpBZGQgdGVtcGxhdGUgbGlzdCBpbiBCQQpBZGQgcGx1Z2luIHN5c3RlbQpBZGQgbmV3IHRhYiBlZGl0b3IgaW4gQkEKVXBkYXRlIHRyYW5zbGF0aW9ucwpBZGQgcGx1Z2luIG5pY2VkaXQKQWRkIHBsdWdpbiBlbHJ0ZQpSZW1vdmUgalF1ZXJ5IGNvbnRleHRtZW51ClVwZGF0ZSBJbnN0YWxsZXIKVXBkYXRlIGljb25zIHBhdGggZm9yIG5pY2VkaXQKQWRkIENNU21zIG1heCB2ZXJzaW9uCgovLy8gVmVyc2lvbiAxLjYKCkFkZCBvcHRpb24gdG8gZW5hYmxlL2Rpc2FibGUgaW5saW5lRWRpdCBvbiBkYmxjbGljawpBZGQgb3B0aW9uYWwgY29udGV4dCBtZW51ICh0ZXN0aW5nKQpFbmFibGUgbG9nZ2luZyBpbiBpbnN0YWxsZXIgYW5kIHVwZ3JhZGUgbWV0aG9kcwpFbmFibGUgbG9nZ2luZyBvbiBjb250ZW50IGFjdGlvbnMKTW92ZSBzb21lIHN0dWZmIGludG8gZXZlbnQgbWFuYWdlcgpDbGVhbiBjb2RlIAoKLy8vIFZlcnNpb24gMS41CgpBZGQgaHRtbCBzb3VyY2UgY29kZSBlZGl0b3IKQWRkIHhodG1sIHN1cHBvcnQgKGV4cGVyaW1lbnRhbCkKRml4IGFqYXggcmVxdWVzdCBlbmNvZGluZwpCdWdmaXgKCi8vLyBWZXJzaW9uIDEuNAoKTW92ZSBqYXZhc2NyaXB0cyBleHRlcm5hbApVcGRhdGUgZmV0Y2ggdHBsIGNvbnRlbnRzIChwbHVnaW5zLHRhZ3MsbW9kdWxlcykgb24gY29udGVudCB1cGRhdGUKU29tZSBidWdmaXhlcyAKCi8vLyBWZXJzaW9uIDEuMwoKQWRkIGJ1dHRvbiB0ZW1wbGF0ZQpBZGQgb3B0aW9uIHRvIGxvYWQganF1ZXJ5ClVwZGF0ZSBsYW5ndWFnZQpVcGRhdGUgY29udGVudCB1cGRhdGUKQ2xlYW4gY29kZQoKLy8vIFZlcnNpb24gMS4yCgpBZGQgdXBncmFkZSBtZXRob2QKQWRkIENNUyBtaW5pbXVtIHZlcnNpb24KQWRkIGNzcyBjbGFzcyAudG91Y2hJbmxpbmVFZGl0QnV0dG9uIHt9CkZpeCBjb21waWxlZCBjb250ZW50X2lkCgovLy8gVmVyc2lvbiAxLjEKCkFkZCBzb21lIHNldHRpbmdzIGluIGFkbWluIHBhbmVsClVwZGF0ZSB0cmFuc2xhdGlvbgpBZGQgZ2VybWFuIHRyYW5zbGF0aW9uCkFkZCBwb3N0aW5zdGFsbCBtZXNzYWdlCkFkZCBwb3N0dW5pbnN0YWxsIG1lc3NhZ2UKCi8vLyBWZXJzaW9uIDEuMAoKSW5pdGlhbCByZWxlYXNl]]></data>
	</file>
	<file>
	  <filename>/event.Core.ContentPostRender.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogZXZlbnQuQ29yZS5Db250ZW50UG9zdFJlbmRlci5waHAgMTM1IDIwMTEtMDEtMDggMTE6MjM6MzJaIHRvdWNoZGVzaWduICQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuOC4wCiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICoKICoKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmlmKCRvcmlnaW5hdG9yID09ICdDb3JlJyAmJiAkZXZlbnRuYW1lID09ICdDb250ZW50UG9zdFJlbmRlcicpewogIGlmKCR0aGlzLT5pc0VuYWJsZWQoKSl7CiAgICAvLyBCZWZvcmUgY2xvc2UgaGVhZGVyCiAgICAkcGFyYW1zWydjb250ZW50J10gPSBzdHJfcmVwbGFjZSgnPC9oZWFkPicsICR0aGlzLT5nZXRQbHVnaW4oKS0+Z2V0SGVhZGVyKCkgCiAgICAgIC4gJzwvaGVhZD4nLCAkcGFyYW1zWydjb250ZW50J10pOwogIH0KfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/function.admin_editor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZCQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuOC4wCiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICoKICogCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgppZighaXNzZXQoJGdDbXMpKXsgCiAgZXhpdDsKfQoKaWYoISR0aGlzLT5WaXNpYmxlVG9BZG1pblVzZXIoKSl7CiAgJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoImFjY2Vzc2RlbmllZCIpKTsKICByZXR1cm47Cn0KCmVjaG8gJHRoaXMtPmdldFBsdWdpbigpLT5nZXRBZG1pbkNvbmZpZygkaWQsJHJldHVybmlkKTsKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCJyZXNzb3VyY2VzLnRwbCIpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/function.admin_permissions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogZnVuY3Rpb24uYWRtaW5fcGVybWlzc2lvbnMucGhwIDE1NSAyMDExLTAxLTE2IDEwOjUxOjI1WiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBNb2R1bGUKICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjguMAogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqCiAqIAogKiAtLQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogKiBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiAqCiAqLwoKaWYoIWlzc2V0KCRnQ21zKSl7IAogIGV4aXQ7Cn0KCmlmKCEkdGhpcy0+VmlzaWJsZVRvQWRtaW5Vc2VyKCkpewogICR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCJhY2Nlc3NkZW5pZWQiKSk7CiAgcmV0dXJuOwp9CgovLyBGb3JtIHN0YXJ0CiR0aGlzLT5zbWFydHktPmFzc2lnbignZm9ybXN0YXJ0JywkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwic2F2ZXBlcm1pc3Npb25zIiwkcmV0dXJuaWQpKTsKCi8vIEdyYW50IGFkbWlucwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlQWRtaW5BbGxvd19sYWJlbCcsJHRoaXMtPkxhbmcoImZlQWRtaW5BbGxvd19sYWJlbCIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZUFkbWluQWxsb3dfaGVscCcsJHRoaXMtPkxhbmcoImZlQWRtaW5BbGxvd19oZWxwIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlQWRtaW5BbGxvd19pbnB1dCcsJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCJmZUFkbWluQWxsb3ciLAogICR5biwkdGhpcy0+R2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlQWRtaW5BbGxvdyIsMSksIiIsIlxuIikpOwoKLy8gRkVVIHN1cHBvcnQKaWYoJHRoaXMtPmdldE1vZHVsZUluc3RhbmNlKCdGcm9udEVuZFVzZXJzJykpewogIC8vIEZFVSBhbGxvdwogICR0aGlzLT5zbWFydHktPmFzc2lnbignZmVGRVVhbGxvd19sYWJlbCcsJHRoaXMtPkxhbmcoImZlRkVVYWxsb3dfbGFiZWwiKSk7CiAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZUZFVWFsbG93X2hlbHAnLCR0aGlzLT5MYW5nKCJmZUZFVWFsbG93X2hlbHAiKSk7CiAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZUZFVWFsbG93X2lucHV0JywkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigkaWQsImZlRkVVYWxsb3ciLAogICAgJHluLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuZmVGRVVhbGxvdyIsMCksIiIsIlxuIikpOwoKICAvLyBGRVUgZ3JvdXBzCiAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZUZFVWdyb3Vwc19sYWJlbCcsJHRoaXMtPkxhbmcoImZlRkVVZ3JvdXBzX2xhYmVsIikpOwogICR0aGlzLT5zbWFydHktPmFzc2lnbignZmVGRVVncm91cHNfaGVscCcsJHRoaXMtPkxhbmcoImZlRkVVZ3JvdXBzX2hlbHAiKSk7CiAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZUZFVWdyb3Vwc19pbnB1dCcsJHRoaXMtPkNyZWF0ZUlucHV0U2VsZWN0TGlzdCgkaWQsJ2ZlRkVVZ3JvdXBzW10nLAogICAgJHRoaXMtPmdldE1vZHVsZUluc3RhbmNlKCdGcm9udEVuZFVzZXJzJyktPkdldEdyb3VwbGlzdCgpLGV4cGxvZGUoJywnLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuZmVGRVVncm91cHMiLCIiKSkpKTsKfWVsc2V7CiAgLy8gRkVVIGRpc2FibGVkCiAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZUZFVWRpc2FibGVkX2xhYmVsJywkdGhpcy0+TGFuZygiZmVGRVVkaXNhYmxlZF9sYWJlbCIpKTsKICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlRkVVZGlzYWJsZWRfaGVscCcsJHRoaXMtPkxhbmcoImZlRkVVZGlzYWJsZWRfaGVscCIpKTsKfQoKLy8gU3VibWl0IC8gY2FuY2VsCiR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCJzdWJtaXQiLCR0aGlzLT5MYW5nKCJzYXZlIikpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsImNhbmNlbCIsJHRoaXMtPkxhbmcoImNhbmNlbCIpKSk7CgovLyBGb3JtIGVuZAokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Zvcm1lbmQnLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCJhZG1pbnBlcm1pc3Npb25zLnRwbCIpOwplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoInJlc3NvdXJjZXMudHBsIik7Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/function.admin_settings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZCQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuOC4wCiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICoKICogCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgppZighaXNzZXQoJGdDbXMpKXsgCiAgZXhpdDsKfQoKaWYoISR0aGlzLT5WaXNpYmxlVG9BZG1pblVzZXIoKSl7CiAgJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoImFjY2Vzc2RlbmllZCIpKTsKICByZXR1cm47Cn0KCi8vIEZvcm0gc3RhcnQKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmb3Jtc3RhcnQnLCR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCJzYXZlc2V0dGluZ3MiLCRyZXR1cm5pZCkpOwoKLy8gU2VsZWN0IGlubGluZSBlZGl0b3IKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZVBsdWdpbl9sYWJlbCcsJHRoaXMtPkxhbmcoImZlUGx1Z2luX2xhYmVsIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlUGx1Z2luX2hlbHAnLCR0aGlzLT5MYW5nKCJmZVBsdWdpbl9oZWxwIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlUGx1Z2luX2lucHV0JywkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigkaWQsImZlUGx1Z2luIiwkdGhpcy0+Z2V0UGx1Z2lucygpLAogICIiLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuZmVQbHVnaW4iKSwiXG4iKSk7CgovLyBFbmFibGUgZGlzYWJsZSBpbmxpbmVFZGl0IGJ1dHRvbiBpbiBGRQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlRWRpdEJ1dHRvbl9sYWJlbCcsJHRoaXMtPkxhbmcoImZlRWRpdEJ1dHRvbl9sYWJlbCIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZUVkaXRCdXR0b25faGVscCcsJHRoaXMtPkxhbmcoImZlRWRpdEJ1dHRvbl9oZWxwIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlRWRpdEJ1dHRvbl9pbnB1dCcsJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCJmZUVkaXRCdXR0b24iLAogICR5biwkdGhpcy0+R2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlRWRpdEJ1dHRvbiIsIlkiKSwiIiwiXG4iKSk7CgovLyBTZXQgZWRpdCBidXR0b24gdGV4dAokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlRWRpdEJ1dHRvblRleHRfbGFiZWwnLCR0aGlzLT5MYW5nKCJmZUVkaXRCdXR0b25UZXh0X2xhYmVsIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlRWRpdEJ1dHRvblRleHRfaGVscCcsJHRoaXMtPkxhbmcoImZlRWRpdEJ1dHRvblRleHRfaGVscCIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZUVkaXRCdXR0b25UZXh0X2lucHV0JywkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwiZmVFZGl0QnV0dG9uVGV4dCIsCiAgJHRoaXMtPkdldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC5mZUVkaXRCdXR0b25UZXh0IiwiRWRpdE1lIiksIiIsIlxuIikpOwogIAovLyBFbmFibGUgZGlzYWJsZSBpbmxpbmVFZGl0IG9uIGRvdWJsZSBjbGljawokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlRWRpdE9uRGJsQ2xpY2tfbGFiZWwnLCR0aGlzLT5MYW5nKCJmZUVkaXRPbkRibENsaWNrX2xhYmVsIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlRWRpdE9uRGJsQ2xpY2tfaGVscCcsJHRoaXMtPkxhbmcoImZlRWRpdE9uRGJsQ2xpY2tfaGVscCIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZUVkaXRPbkRibENsaWNrX2lucHV0JywkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigkaWQsImZlRWRpdE9uRGJsQ2xpY2siLAogICR5biwkdGhpcy0+R2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlRWRpdE9uRGJsQ2xpY2siLCJ0cnVlIiksIiIsIlxuIikpOwoKLy8gU2V0IHVwZGF0ZSBhbGVydCBtZXNzYWdlIGNvbnRlbnQgdXBkYXRlCiR0aGlzLT5zbWFydHktPmFzc2lnbignZmVVcGRhdGVBbGVydE1lc3NhZ2VfbGFiZWwnLCR0aGlzLT5MYW5nKCJmZVVwZGF0ZUFsZXJ0TWVzc2FnZV9sYWJlbCIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZVVwZGF0ZUFsZXJ0TWVzc2FnZV9oZWxwJywkdGhpcy0+TGFuZygiZmVVcGRhdGVBbGVydE1lc3NhZ2VfaGVscCIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZVVwZGF0ZUFsZXJ0TWVzc2FnZV9pbnB1dCcsJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsImZlVXBkYXRlQWxlcnRNZXNzYWdlIiwKICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlVXBkYXRlQWxlcnRNZXNzYWdlIiwiU3VjY2Vzcy4uLiIpLCIiLCJcbiIpKTsKICAKLy8gU3VibWl0IC8gY2FuY2VsCiR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCJzdWJtaXQiLCR0aGlzLT5MYW5nKCJzYXZlIikKICAsIiIsIiIsJHRoaXMtPkxhbmcoInNldHRpbmdzY29uZmlybSIsJHRoaXMtPkdldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC5mZVBsdWdpbiIpKSkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NhbmNlbCcsJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwiY2FuY2VsIiwkdGhpcy0+TGFuZygiY2FuY2VsIikpKTsKCi8vIEZvcm0gZW5kCiR0aGlzLT5zbWFydHktPmFzc2lnbignZm9ybWVuZCcsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CgplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoImFkbWluc2V0dGluZ3MudHBsIik7CmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgicmVzc291cmNlcy50cGwiKTsKCj8+]]></data>
	</file>
	<file>
	  <filename>/function.admin_templates.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZCQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuOC4wCiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICoKICogCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgppZighaXNzZXQoJGdDbXMpKXsKICBleGl0Owp9CgppZighJHRoaXMtPlZpc2libGVUb0FkbWluVXNlcigpKXsKICAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygiYWNjZXNzZGVuaWVkIikpOwogIHJldHVybjsKfQoKJGl0ZW1zID0gYXJyYXkoKTsgJHJvd2NsYXNzID0gJ3JvdzEnOwpmb3JlYWNoKCR0aGlzLT5MaXN0VGVtcGxhdGVzKCkgQVMgJHRlbXBsYXRlKXsKCiAgJHJvdyA9IG5ldyBTdGRDbGFzcygpOwoKICAkcm93LT5yb3djbGFzcyA9ICRyb3djbGFzczsKICAkcm93LT5uYW1lID0gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCdlZGl0dGVtcGxhdGUnLCRyZXR1cm5pZCwKICAgICR0ZW1wbGF0ZSxhcnJheSgndGVtcGxhdGUnID0+ICR0ZW1wbGF0ZSwnbW9kZSc9PidlZGl0JykpOwogICRyb3ctPmVkaXRsaW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZWRpdHRlbXBsYXRlJywkcmV0dXJuaWQsIAogICAgJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS9lZGl0LmdpZicsIAogICAgJHRoaXMtPkxhbmcoJ2VkaXQnKSwnJywnJywnc3lzdGVtaWNvbicpLGFycmF5KCd0ZW1wbGF0ZScgPT4gJHRlbXBsYXRlLCdtb2RlJz0+J2VkaXQnKSk7CgogICRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSI7CgogICRpdGVtc1tdID0gJHJvdzsKCn0KCiR0aGlzLT5zbWFydHktPmFzc2lnbignaXRlbXMnLCRpdGVtcyk7CiR0aGlzLT5zbWFydHktPmFzc2lnbigndGFibGVfY29sX3RlbXBsYXRlJywkdGhpcy0+TGFuZygidGFibGVjb2x0ZW1wbGF0ZSIpKTsKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgiYWRtaW50ZW1wbGF0ZXMudHBsIik7Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/img/touchBackground.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAMYAAABhCAIAAAAC4ElcAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4MjJCREU0QkU2MUZFMDExODZEN0IyQ0VGODYzM0ZGQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCNjNGNjVFQjIxNTcxMUUwQUVCN0RGOEEwMzg4QTBDNCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCNjNGNjVFQTIxNTcxMUUwQUVCN0RGOEEwMzg4QTBDNCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MzJCREU0QkU2MUZFMDExODZEN0IyQ0VGODYzM0ZGQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4MjJCREU0QkU2MUZFMDExODZEN0IyQ0VGODYzM0ZGQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ptb6+9oAAAg7SURBVHja7J1bbBRVHMbPf2a3TaWkSEGNPBATfPAuT5gIxoREYnwxPPKqD8bAg4kaYvBBeTIxaoLRGB8I4g00GBChKVFEIGkaqSXYcNFCoVBu25aWLdu9zDmemb10Z+bM7MxsLTvb76Nd2u1tpv3l+775z9lZmpzKMAiaPWn4FUBACgJSEJCCICAFASkISEEQkIKAFASkIAhIQUAKAlIQkIIgIAUBKQhIQRCQgoAUBKQgCEhBQAoCUhAEpCAgBQEpCEhBEJCCgBQEpCAISEFACmoqJfArgAKKiDT5Skwjjclb+Y51p/yQMCXfEFwIIAV5MyRTzBSZryY9rHxT+lf8HFa6u3QfkIIUbqSXMWJlHyrdlDCy84Tgg7ykW540A0+ZHSdPSkcrfwBIQVZJ0khzZFoJIRVPTouiatCAFNqS1bmpKuNsLlXNE6vJE5Ca19Isc5ohpmxLqtTz6U7oUlC5NlG1Fc3EXNVxXZknhzv5WBSQmr8HdLY4q8UTBeYJSM37sJuJN9vBXTU6ZPvPcZCn+hH4Lcdbwnr5P3hyRB5zWRS6VHPyFLQ0K8p4BR0fnkJFHpCKO0+C2ftzTZ7IPhVwH9a5eGLqgz3ywxhIxbhnB/QnCspTsLpENSgGUjEmKvC8gEgVb26eFJEXuEIBqfkic/6k4MlhTLNQoYDU/DCy4qkWhT+pPCdMheJieqzQnRcpQ6TTxgnZ1jL8nE6LWug+INXcFmU/92tvQs7I80836wuzfOR6bmfa6E/l93CWU4YxkIp5m6LSkZ+XRTlizpOnWpE3UTh6JbttvHCoICalSfmUOyAVb56KvAgVVrpGjDnOqiiyrSZPU8b5oczWMWOXYIYFk9doVcClmoGnClcOqswGVTEp5j0Od5uMnadL6e9GCp9k2QARt0Zh3H9aT0wDUvHnqQwQ5zN/bHNFnd2Aakaem7SLUzvOT79JiWki059q8oTgiz1PjkSTSSe9ilt2VR4dzDTrsBVqaGr7hexmTc8Rq/DEa22d/Nl4hEyceXJPLC1zMrEiVSVXfSt15I3neq9mv2BalkRBwkTB/KlIFZCKN0/27mPio8vXhKacCChPvCiXa16e/jTHzpo8kUGBI6+UufhTxY4pJ0v2FeIzI6hgkedernkj9/No/gBjBWZWcs5NpAIvoGECSMUHJ9diuKoCbnsEi5unUFOD1PRBTllGgkowCQqzqUAqXvZUHXHuR9gxj1Mt9rt9T7wUxNRo7rCkyJxKCGuBnxACSM2TQzwiRVfynxr4VyhzBEDtzy09s7z1DYMLgwkz9jQGpOZdJfeJvOAVqvq7rVj4/sqObqOQNA8iZUEXLPhiGiDV0BIsUCUnd8MKX6Eca1c6W9asXTraKp40WJJxCp5+QKrxsRIeldwz8pi6UPlVKCeLlnRqW73kxEJaV+CJ4Cv+gFQsjMpuInVEnveDhj2X/z6zeF+H9rIhdCDVTD4lqqHwjrx6K5SXVnXuXsjXAammEueClFmmWqvpdbBIXk4VYPnvqs5fKNgZYSAVGxmcO+yImEeFIu8KpUq8gDXp6fbDQKoJqRLV4ygKX6FckRd8Mt6RWL2sdSOQajqqJFbc/qDQAFODaBXKrYfbtlEtZoBULL1KguU9NXDeXU+FcuvxBfuAVDO2dSFy+YIh7UoReTZ06q9QDnUmX2rXVwKp5lTBMCRYxWWcoacGdeixBbuBVNNKFO1K8DBTA4oWeRW1aSuStARINa2SCT2haW4Dmt0K5dAj93zl9SEsFI6xNI0Suq5rZLOoGsFGs/KjFydfhEs1lWS3TuhaSyLh5Cn81Voja1nrJiDVDNI1LanrrUlJk15NzxxUKIcebHkNwRdfT2LWJaJIr770mP+JF9WSA5rVrVqgPwqkGokSprpiShVDTJSvk0HVTyzl5ino2pVZBqpE1RNTxikEX2NxVXnLsiHroprFl/LzcDiWr9QiM0Tk7f5jqPdsqp4duD+5AV2qoSzKSZbjKclcl4ZyoFXX2pX9vcObPu9575v+4wM3Iu9Im74CSDVc5LkXlns9Li9QhVJ0JsWnnx6+9crHx+Ubf/6T+uingYk7uWj7siS5Hkg1bgBWr7BTDZr8KpRnIVcZ1MkLY8+/3VV599jA9a3fnoy64RqQakiLYupF5d4rNqNPDX7tv/rCO92Orfr6t8Efjw1F26MEdQCpuEeee+2KR+S5ePqy69yGD464N0wItq9nONpO3ZtYC6RiE3mkjjxFW1JGnuOOjZ/1bNnR57Uh3X1XDv01EmEPdGoHUrGJPNUdISKvotuZ/FOv7/3hqF+0SaPqOX0zwn51JNY4oxB/7DkcQKkbkfL5XkmRXVEq1Mhb+1deTgfZyL7B0Ui7psOl7jJWzHVZAxc15BN5tacGZZ4mD5w+tWjLjQ9/D7iBpy9NXLiWrn9H4VKNEnkUMvI8pwaMTewduPTqLmM0w8Jcxmc8nb2cmnrogfZQe8dZHkg1nmPNUuQZk9mx7b1XNx9g5oV8BAt3WShTNyemw34JFxkgNdcSrHgOWGFRrlN2zotDBTzxcmvPqWvvduWHb4kCN3niUXiS6j2bWv/s8lBf4l6PAKTmCixRRMtaX1B8HgN75BFzDjZ9KhTP5NNHBtPd5yYPnjHG7pgkFSySuCjeRtvIbN4I+yVj+S4gdffZEoxVXKSyfKW8oKV8wFb8eJ5n/03lBlPy3em/r2X6r/B0Ln9xXDIkcoZpSHlDGEVnkrfCyrs53Z2cuAmkGo+wkn8pdPv7k7d39rGCIfIWPRIjCZMESNoSt24lQ4ZlS+YbxYv/RmeqJRl6ApDjzgHpfwIMAOKGVAri6L6bAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/js/touchInlineEdit.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqICRJZDogdG91Y2hJbmxpbmVFZGl0LmpzIDE0MSAyMDExLTAxLTA5IDE5OjE4OjU3WiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBNb2R1bGUKICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjguMAogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqCiAqIAogKiAtLQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogKiBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiAqCiAqLwogCmZ1bmN0aW9uIHRvdWNoSW5saW5lRWRpdChpZCx1cmksbWVzc2FnZSxldmVudCl7CgogIC8qKgogICAqIFNlbGYgaW5zdGFuY2UuCiAgICogQHZhciBvYmplY3QKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLyAKICB2YXIgc2VsZiA9IHRoaXM7CgogIC8qKgogICAqIE9wdGlvbmFsIHBhcmFtcy4KICAgKiBAdmFyIG9iamVjdAogICAqIEBhY2Nlc3MgcHVibGljCiAgICovICAKICB0aGlzLnBhcmFtcyA9IG5ldyBPYmplY3QoKTsKCiAgLyoqCiAgICogSG9sZCBlYWNoIGVkaXRvciBpbnN0YW5jZS4KICAgKiBAdmFyIG9iamVjdAogICAqIEBhY2Nlc3MgcHVibGljCiAgICovICAKICB0aGlzLmluc3RhbmNlcyA9IG5ldyBPYmplY3QoKTsKCiAgLyoqCiAgICogUmVxdWVzdCB1cmkuCiAgICogQHZhciBzdHJpbmcKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLwogIHRoaXMudXJpID0gdXJpOwoKICAvKioKICAgKiBBbGVydCBtZXNzYWdlIG9uIHNhdmUgc3VjY2Vzcy4KICAgKiBAdmFyIHN0cmluZwogICAqIEBhY2Nlc3MgcHVibGljCiAgICovCiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKCiAgLyoqCiAgICogSW5pdCBvbiBldmVudC4KICAgKiBAdmFyIGJvb2xlYW4KICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLwogIHRoaXMuZXZlbnQgPSBldmVudDsKICAKICAvKioKICAgKiBBZGQgZWRpdG9yIGluc3RhbmNlLgogICAqLwogIHRoaXMuYWRkSW5zdGFuY2UgPSBmdW5jdGlvbihuYW1lKQogIHsKICAgIC8vY29uc29sZS5kZWJ1ZygnQWRkIGluc3RhbmNlPScgKyBuYW1lKTsKICAgIGlmKCFzZWxmLmluc3RhbmNlc1tuYW1lXSl7CiAgICAgIHNlbGYuaW5zdGFuY2VzW25hbWVdID0gbmV3IHRvdWNoSW5saW5lRWRpdEluc3RhbmNlKAogICAgICAgIGlkcy5pZCwgaWRzLmJsb2NrLCBpZHMuc2VsZWN0b3IpOwogICAgICBzZWxmLmluc3RhbmNlc1tuYW1lXS5fX2NvbnN0cnVjdCgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ291bnQgaW5zdGFuY2VzLgogICAqLwogIHRoaXMuY291bnRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgewogICAgLy9jb25zb2xlLmRlYnVnKCdDb3VudCBpbnN0YW5jZXMnKTsKICAgIHZhciBjb3VudCA9IDA7CiAgICBmb3IodmFyIHByb3AgaW4gc2VsZi5pbnN0YW5jZXMpewogICAgICBjb3VudCsrOwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgLyoqCiAgICogRmluZCBpbnN0YW5jZS4KICAgKi8KICB0aGlzLmZpbmRJbnN0YW5jZSA9IGZ1bmN0aW9uKHNlbGVjdG9yKQogIHsKICAgIC8vY29uc29sZS5kZWJ1ZygnRmluZCBpbnN0YW5jZSBieSBzZWxlY3Rvcj0nICsgc2VsZWN0b3IpOwogICAgZm9yKHZhciBwcm9wIGluIHNlbGYuaW5zdGFuY2VzKXsKICAgICAgaWYoc2VsZi5pbnN0YW5jZXNbcHJvcF0uc2VsZWN0b3IgPT0gc2VsZWN0b3IpewogICAgICAgIHJldHVybiBzZWxmLmdldEluc3RhbmNlKHNlbGYuaW5zdGFuY2VzW3Byb3BdLmJsb2NrKTsKICAgICAgfQogICAgfQogIH0KICAKICAvKioKICAgKiBHZXQgZWRpdG9yIGluc3RhbmNlLgogICAqLwogIHRoaXMuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbihuYW1lKQogIHsKICAgIC8vY29uc29sZS5kZWJ1ZygnR2V0IGluc3RhbmNlIGZvciBibG9jaz0nICsgbmFtZSk7CiAgICBpZighc2VsZi5pc0luc3RhbmNlKG5hbWUpKXsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHNlbGYuaW5zdGFuY2VzW25hbWVdOwogIH0KCiAgLyoqCiAgICogIENoZWNrIGlmIGluc3RhbmNlIGV4aXN0cy4KICAgKi8KICB0aGlzLmlzSW5zdGFuY2UgPSBmdW5jdGlvbihuYW1lKQogIHsKICAgIC8vY29uc29sZS5kZWJ1ZygnQ2hlY2sgaWYgaW5zdGFuY2UgZXhpc3RzIGZvciBibG9jaz0nICsgc2VsZi5ibG9jayk7CiAgICBpZighc2VsZi5pbnN0YW5jZXNbbmFtZV0pewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8qKgogICAqICBjdXJyZW50IGVkaXRvciBpbnN0YW5jZS4KICAgKi8KICB0aGlzLnJlbW92ZUluc3RhbmNlID0gZnVuY3Rpb24obmFtZSkKICB7CiAgICAvL2NvbnNvbGUuZGVidWcoJ1JlbW92ZSBpbnN0YW5jZT0nICsgbmFtZSk7CiAgICBzZWxmLmdldEluc3RhbmNlKG5hbWUpLl9fZGVzdHJ1Y3QoKTsKICAgIGlmKHNlbGYuaXNJbnN0YW5jZShuYW1lKSl7CiAgICAgIGRlbGV0ZShzZWxmLmluc3RhbmNlc1tuYW1lXSk7CiAgICB9CiAgfQoKICAvKioKICAgKiBUb2dnbGUgZWRpdG9yIGluc3RhbmNlLgogICAqLwogIHRoaXMudG9nZ2xlID0gZnVuY3Rpb24obmFtZSkKICB7CiAgICAvL2NvbnNvbGUuZGVidWcoJ1RvZ2dsZSBlZGl0b3IgZm9yIGluc3RhbmNlPScgKyBuYW1lKTsKICAgIGlmKCFzZWxmLmlzSW5zdGFuY2UobmFtZSkpewogICAgICBzZWxmLmZldGNoKGlkcy5pZCwgaWRzLmJsb2NrLCBpZHMuc2VsZWN0b3IsIDApOwogICAgICBzZWxmLmFkZEluc3RhbmNlKG5hbWUpOwogICAgfWVsc2V7CiAgICAgIHNlbGYucmVtb3ZlSW5zdGFuY2UobmFtZSk7CiAgICAgIHNlbGYuZmV0Y2goaWRzLmlkLCBpZHMuYmxvY2ssIGlkcy5zZWxlY3RvciwgMSk7CiAgICB9CiAgfQoKICAvKioKICAgKiBBamF4IHNhdmUgY29udGVudC4KICAgKi8KICB0aGlzLnNhdmUgPSBmdW5jdGlvbihpZCxibG9jayxzZWxlY3Rvcixjb250ZW50KQogIHsKICAgICQucG9zdChzZWxmLnVyaSwgeyBtZXRob2Q6ICJ1cGRhdGVDb250ZW50IiwgaWQ6IGlkLCBibG9jazogYmxvY2ssIGNvbnRlbnQ6IGNvbnRlbnQgfSwKICAgIGZ1bmN0aW9uKGRhdGEpewogICAgICBpZihzZWxmLm1lc3NhZ2UpewogICAgICAgIGFsZXJ0KHNlbGYubWVzc2FnZSk7CiAgICAgIH0KICAgICAgc2VsZi50b2dnbGUoYmxvY2spOwogICAgfSk7CiAgfQoKICAvKioKICAgKiBBamF4IGZldGNoIGNvbnRlbnQuCiAgICovCiAgdGhpcy5mZXRjaCA9IGZ1bmN0aW9uKGlkLGJsb2NrLHNlbGVjdG9yLGZldGNoKQogIHsKICAgICQuYWpheCh7YXN5bmM6ZmFsc2UsCiAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgdXJsOiBzZWxmLnVyaSwKICAgICAgZGF0YTogJ21ldGhvZD1nZXRDb250ZW50JmlkPScgKyBpZCArICcmYmxvY2s9JyArIGJsb2NrICsgJyZmZXRjaD0nICsgZmV0Y2gsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgICQoJyMnICsgc2VsZWN0b3IpLmh0bWwoZGF0YSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLyoqCiAgICogUGFyYW0gc2V0dGVyLgogICAqLwogIHRoaXMuc2V0UGFyYW0gPSBmdW5jdGlvbihuYW1lLHZhbHVlKQogIHsKICAgIC8vY29uc29sZS5kZWJ1ZygnQWRkIHBhcmFtPScgKyBuYW1lICsgJzonICsgdmFsdWUpOwogICAgaWYobmFtZSl7CiAgICAgIHNlbGYucGFyYW1zW25hbWVdID0gdmFsdWU7CiAgICB9CiAgfQoKICAvKioKICAgKiBQYXJhbSBnZXR0ZXIuCiAgICovCiAgdGhpcy5nZXRQYXJhbSA9IGZ1bmN0aW9uKG5hbWUpCiAgewogICAgLy9jb25zb2xlLmRlYnVnKCdHZXQgcGFyYW09JyArIG5hbWUpOwogICAgaWYoc2VsZi5wYXJhbXNbbmFtZV0pewogICAgICByZXR1cm4gc2VsZi5wYXJhbXNbbmFtZV07CiAgICB9CiAgfQoKICAvKioKICAgKiBQYXJzZSBpZHMgZnJvbSBjc3Mgc2VsZWN0b3IuCiAgICovCiAgdGhpcy5zcGxpdElkID0gZnVuY3Rpb24obmFtZSkKICB7CiAgICAvL2NvbnNvbGUuZGVidWcoJ1BhcnNlIGNvbnRlbnRpZD0nICsgbmFtZSk7CiAgICBpZHMgPSBuYW1lLnNwbGl0KCcgJyk7CiAgICByZXR1cm4gcmVzdWx0ID0gewogICAgICBpZDogaWRzWzBdLnN1YnN0cigxKSwKICAgICAgYmxvY2s6IGlkc1sxXS5zdWJzdHIoMSksCiAgICAgIHNlbGVjdG9yOiAndG91Y2hJbmxpbmVFZGl0SWQtJyArIGlkc1swXS5zdWJzdHIoMSkgKyAnLScgKyBpZHNbMV0uc3Vic3RyKDEpCiAgICB9CiAgfQoKfQoKdmFyIG9uRXZlbnQgPSBmdW5jdGlvbigpewogIGlkcyA9IHRvdWNoSW5saW5lRWRpdC5zcGxpdElkKCQodGhpcykuYXR0cignY2xhc3MnKSk7CiAgdG91Y2hJbmxpbmVFZGl0LnRvZ2dsZShpZHMuYmxvY2spOwogIHJldHVybiBmYWxzZTsKfQoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKICAkKCcudG91Y2hJbmxpbmVFZGl0QnV0dG9uJykuY2xpY2sob25FdmVudCk7CiAgaWYodG91Y2hJbmxpbmVFZGl0LmV2ZW50KXsKICAgICQoJy50b3VjaElubGluZUVkaXQnKS5kYmxjbGljayhvbkV2ZW50KTsKICB9Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiRsYW5nWydkZXNjcmlwdGlvbiddID0gJ0EgcG93ZXJmdWxseSBmcm9udGVuZCBpbmxpbmUgZWRpdG9yIG1vZHVsZS4nOwokbGFuZ1snYWRtZGVzY3JpcHRpb24nXSA9ICdBIHBvd2VyZnVsbHkgZnJvbnRlbmQgaW5saW5lIGVkaXRvciBtb2R1bGUuJzsKCiRsYW5nWydoZWxwJ10gPSAnPGgzPlVzYWdlPC9oMz4KPHVsPgogIDxsaT4KICAgIDEpIDxzcGFuIHN0eWxlPSJjb2xvcjpvcmFuZ2UiPkltcG9ydGFudCE8L3NwYW4+IFB1dCB0aGUgbG9hZCBtb2R1bGUgdGFnIHtjbXNfbW9kdWxlIG1vZHVsZT0idG91Y2hJbmxpbmVFZGl0In0gaW50byB0aGUgaGVhZCBvZiBlYWNoIHRlbXBsYXRlIHlvdSB3YW50IHRvIHVzZSB0aGUgbW9kdWxlIGRpcmVjdGx5IGFmdGVyIHRoZSB7cHJvY2Vzc19wYWdlZGF0YX0gdGFnLjxiciAvPgogICAgMikgQ29uZmlndXJlIHRoZSBncm91cCBwZXJtaXNzaW9ucyBmb3IgYWRtaW4gdXNlcnMgKHNldCBwZXJtaXNzaW9uOiBVc2UgdG91Y2hJbmxpbmVFZGl0KSBvciBvcHRpb25hbCBzZXR1cCB0aGUgZnJvbnQgZW5kIHVzZXIgc3VwcG9ydCAoRkVVKSBhbmQgdGFrZSBhIGxvb2sgYXQgdGhlIGNtc21zIGZyb250IGVuZC4KICA8L2xpPgo8L3VsPgo8aDM+QWJvdXQ8L2gzPgo8dWw+CiAgPGxpPkNvcHlyaWdodCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLyI+dG91Y2hEZXNpZ248L2E+PC9saT4KICA8bGk+QXV0aG9yIENocmlzdG9waCBHcnViZXI8L2xpPgogIDxsaT5DTVNtcyBUb3VjaElubGluZUVkaXQgPGEgaHJlZj0iaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy90b3VjaGlubGluZWVkaXQiPnByb2plY3QgcGFnZTwvYT48L2xpPgogIDxsaT5TdXBwb3J0IHZpYSA8YSBocmVmPSJodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wIj5IUEM8L2E+PC9saT4KICA8bGk+TGljZW5zZSBHUEwgMi4wPC9saT4KPC91bD4nOwoKJGxhbmdbJ3NldHRpbmdzJ10gPSAnU2V0dGluZ3MnOwokbGFuZ1sncGVybWlzc2lvbnMnXSA9ICdQZXJtaXNzaW9ucyc7CiRsYW5nWyd0ZW1wbGF0ZXMnXSA9ICdUZW1wbGF0ZXMnOwokbGFuZ1snZWRpdG9yJ10gPSAnRWRpdG9yJzsKCiRsYW5nWyd0YWJsZWNvbHRlbXBsYXRlJ10gPSAnVGVtcGxhdGUnOwokbGFuZ1sneWVzJ10gPSAnWWVzJzsKJGxhbmdbJ25vJ10gPSAnTm8nOwokbGFuZ1snc2F2ZSddID0gJ1NhdmUnOwokbGFuZ1snZWRpdCddID0gJ0VkaXQnOwokbGFuZ1snY2FuY2VsJ10gPSAnQ2FuY2VsJzsKJGxhbmdbJ3Jlc2V0J10gPSAnUmVzZXQnOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ1NldHRpbmdzIHNhdmVkLic7CiRsYW5nWyd0ZW1wbGF0ZXNzYXZlZCddID0gJ1RlbXBsYXRlIHNhdmVkLic7CiRsYW5nWydzZXR0aW5nc2NvbmZpcm0nXSA9ICdPbiBjaGFuZ2UgdGhlIGVkaXRvciBwbHVnaW4gKGFuZCBvbmx5IHRoZW4hKSBhbGwgY3VzdG9taXplZCB0ZW1wbGF0ZXMgYW5kIHNldHRpbmdzIGZvciBjdXJyZW50IGVkaW9yIHBsdWdpbiAlcyB3aWxsIGJlIGxvc3QuJzsKCiRsYW5nWydmZVBsdWdpbl9sYWJlbCddID0gJ1doaWNoIGVkaXRvciB5b3Ugd2FudD8nOwokbGFuZ1snZmVQbHVnaW5faGVscCddID0gJ1NlbGVjdCBhbiBlZGl0b3IuJzsKCiRsYW5nWydmZUVkaXRCdXR0b25fbGFiZWwnXSA9ICdFZGl0IGJ1dHRvbiBpbiBGRT8nOwokbGFuZ1snZmVFZGl0QnV0dG9uX2hlbHAnXSA9ICdBZGQgZW5hYmxlL2Rpc2FibGUgYnV0dG9uIGZvciBJbmxpbmVFZGl0IGluIGZyb250ZW5kLic7CgokbGFuZ1snZmVFZGl0QnV0dG9uVGV4dF9sYWJlbCddID0gJ0VkaXQgYnV0dG9uIHRleHQnOwokbGFuZ1snZmVFZGl0QnV0dG9uVGV4dF9oZWxwJ10gPSAnRWRpdCBidXR0b24gdGV4dC4nOwokbGFuZ1snZmVFZGl0QnV0dG9uVGV4dF9kZWZhdWx0J10gPSAnVG91Y2hJbmxpbmVFZGl0JzsKCiRsYW5nWydmZVVwZGF0ZUFsZXJ0TWVzc2FnZV9sYWJlbCddID0gJ1VwZGF0ZSBtZXNzYWdlPyc7CiRsYW5nWydmZVVwZGF0ZUFsZXJ0TWVzc2FnZV9oZWxwJ10gPSAnVXBkYXRlIG1lc3NhZ2Ugb24gc3VjY2Vzc2Z1bGx5IGNvbnRlbnQgdXBkYXRlLiAoTGVhdmUgaXQgZW1wdHkgZm9yIGRpc2FibGluZyknOwokbGFuZ1snZmVVcGRhdGVBbGVydE1lc3NhZ2VfZGVmYXVsdCddID0gJ1VwZGF0ZSBTdWNjZXNzLi4uJzsKCiRsYW5nWyd0b3VjaElubGluZUVkaXRCdXR0b25fbGFiZWwnXSA9ICdJbmxpbmVFZGl0IGJ1dHRvbiB0ZW1wbGF0ZTonOwokbGFuZ1snZmVFZGl0T25EYmxDbGlja19sYWJlbCddID0gJ0FjdGl2YXRlIElubGluZUVkaXQgb24gZG91YmxlIGNsaWNrPyc7CiRsYW5nWydmZUVkaXRPbkRibENsaWNrX2hlbHAnXSA9ICdBY3RpdmF0ZSBJbmxpbmVFZGl0IG9uIGRvdWJsZSBjbGljayBpbiBjb250ZW50IGFyZWEuJzsKCiRsYW5nWydmZUZFVWFsbG93X2xhYmVsJ10gPSAnQWxsb3cgRkVVPyc7CiRsYW5nWydmZUZFVWFsbG93X2hlbHAnXSA9ICdBbGxvdyBmcm9udGVuZCB1c2VycyB0byB1c2UgSW5saW5lRWRpdC4nOwoKJGxhbmdbJ2ZlRkVVZ3JvdXBzX2xhYmVsJ10gPSAnU2V0IEZFVSBncm91cChzKT8nOwokbGFuZ1snZmVGRVVncm91cHNfaGVscCddID0gJ1NldCBGRVUgZ3JvdXAgcmVzdHJpY3Rpb25zLic7CgokbGFuZ1snZmVGRVVkaXNhYmxlZF9sYWJlbCddID0gJ0Zyb250RW5kVXNlciAoRkVVKSBzdXBwb3J0IGlzIGRpc2FibGVkLic7CiRsYW5nWydmZUZFVWRpc2FibGVkX2hlbHAnXSA9ICdUbyB1c2UgSW5saW5lRWRpdCB3aXRoIGZyb250ZW5kIHVzZXIgc3VwcG9ydCB5b3UgaGF2ZSB0byBpbnN0YWxsIHRoZSBmcm9udGVuZCB1c2VycyAoRkVVKSBtb2R1bGUuJzsKCiRsYW5nWydmZUFkbWluQWxsb3dfbGFiZWwnXSA9ICdBbGxvdyBhZG1pbnM/JzsKJGxhbmdbJ2ZlQWRtaW5BbGxvd19oZWxwJ10gPSAnQWxsb3cgYWRtaW4gdXNlcnMgKHdpdGggIlVzZSB0b3VjaElubGluZUVkaXQiIHBlcm1pc3Npb25zKSB0byB1c2UgSW5saW5lRWRpdC4nOwoKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnSW5zdGFsbCBzdWNjZXNzLi4uJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdVbmluc3RhbGwgc3VjY2Vzcy4uLic7CiRsYW5nWydwb3N0dXBncmFkZSddID0gJ1VwZ3JhZGUgc3VjY2VzcyB2ZXJzaW9uICVzLi4uJzsKJGxhbmdbJ3Bvc3Rjb250ZW50dXBkYXRlJ10gPSAnQ29udGVudCB3aXRoIGNvbnRlbnRfaWQ6JXMgdXBkYXRlZC4nOwokbGFuZ1sncHJldW5pbnN0YWxsJ10gPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVuaW5zdGFsbCB0aGlzIG1vZHVsZSBhbmQgZGVzdHJveSBhbGwgc2V0dGluZ3MvdGVtcGxhdGVzPyc7CgovKiAtLS0tIFBsdWdpbnMgLS0tLSAqLwoKLy8gbmljZWRpdAokbGFuZ1snbmljZWRpdF9mdWxsX3BhbmVsX2xhYmVsJ10gPSAnRXh0ZW5kZWQgdG9vbGJhcj8nOwokbGFuZ1snbmljZWRpdF9mdWxsX3BhbmVsX2hlbHAnXSA9ICdVc2UgZXh0ZW5kZWQgdG9vbGJhci4nOwokbGFuZ1snbmljZWRpdF9qcXVlcnlfbG9hZF9sYWJlbCddID0nTG9hZCBqUXVlcnkgbGliYXJ5JzsKJGxhbmdbJ25pY2VkaXRfanF1ZXJ5X2xvYWRfaGVscCddID0nTGV0IElubGluZUVkaXQgbG9hZCByZXF1aXJlZCBqUXVlcnkgbGliYXJ5IGluIGhlYWRlciBvZiBwYWdlcy4nOwokbGFuZ1snbmljZWRpdF9idXR0b25fbGlzdF9sYWJlbCddID0nQnV0dG9ucyc7CiRsYW5nWyduaWNlZGl0X2J1dHRvbl9saXN0X2hlbHAnXSA9J0N1c3RvbWl6ZSBhbmQgaW5zZXJ0IGJ1dHRvbnMgZm9yIHlvdXIgdG9vbGJhcic7CiRsYW5nWyduaWNlZGl0X2hlaWdodF9sYWJlbCddID0nTWF4aW11bSBoZWlnaHQnOwokbGFuZ1snbmljZWRpdF9oZWlnaHRfaGVscCddID0nU2V0IG1heGltdW0gaGVpZ2h0IGluIHB4IGRlZmF1bHQgaXMgImF1dG8iLic7CgovLyBlbHJ0ZQokbGFuZ1snZWxydGVfdG9vbGJhcl9sYWJlbCddID0gJ1doaWNoIHRvb2xiYXI/JzsKJGxhbmdbJ2VscnRlX3Rvb2xiYXJfaGVscCddID0gJ0Nob29zZSBhbnkgdG9vbGJhciB5b3UgbGlrZS4nOwokbGFuZ1snZWxydGVfanF1ZXJ5X2xvYWRfbGFiZWwnXSA9J0xvYWQgalF1ZXJ5IGxpYmFyeSc7CiRsYW5nWydlbHJ0ZV9qcXVlcnlfbG9hZF9oZWxwJ10gPSdMZXQgSW5saW5lRWRpdCBsb2FkIHJlcXVpcmVkIGpRdWVyeSBsaWJhcnkgaW4gaGVhZGVyIG9mIHBhZ2VzLic7CgovLyB0aW55bWNlCiRsYW5nWyd0aW55X21jZV9qcXVlcnlfbG9hZF9sYWJlbCddID0nTG9hZCBqUXVlcnkgbGliYXJ5JzsKJGxhbmdbJ3RpbnlfbWNlX2pxdWVyeV9sb2FkX2hlbHAnXSA9J0xldCBJbmxpbmVFZGl0IGxvYWQgcmVxdWlyZWQgalF1ZXJ5IGxpYmFyeSBpbiBoZWFkZXIgb2YgcGFnZXMuJzsKJGxhbmdbJ3RpbnlfbWNlX3RoZW1lX2xhYmVsJ10gPSdUaGVtZSc7CiRsYW5nWyd0aW55X21jZV90aGVtZV9oZWxwJ10gPSdDaG9vc2UgYW55IHRoZW1lIHlvdSB3YW50Lic7CiRsYW5nWyd0aW55X21jZV9za2luX2xhYmVsJ10gPSdTa2luJzsKJGxhbmdbJ3RpbnlfbWNlX3NraW5faGVscCddID0nQ2hvb3NlIGFueSBza2luIHlvdSBsaWtlLic7CiRsYW5nWyd0aW55X21jZV9za2luX3ZhcmlhbnRfbGFiZWwnXSA9J1NraW4gdmFyaWFudCc7CiRsYW5nWyd0aW55X21jZV9za2luX3ZhcmlhbnRfaGVscCddID0nQ2hvb3NlIGFueSBza2luIHZhcmlhbnQgeW91IGxpa2UuJzsKJGxhbmdbJ3RpbnlfbWNlX3dpZHRoX2xhYmVsJ10gPSdXaWR0aCc7CiRsYW5nWyd0aW55X21jZV93aWR0aF9oZWxwJ10gPSdFZGl0b3Igd2lkdGggaW4gcGl4ZWwgZGVmYXVsdCBhdXRvLic7CiRsYW5nWyd0aW55X21jZV9oZWlnaHRfbGFiZWwnXSA9J0hlaWdodCc7CiRsYW5nWyd0aW55X21jZV9oZWlnaHRfaGVscCddID0nRWRpdG9yIGhlaWdodCBpbiBwaXhlbCBkZWZhdWx0IGF1dG8uJzsKJGxhbmdbJ3RpbnlfbWNlX3BsdWdpbnNfbGFiZWwnXSA9J1BsdWdpbnMnOwokbGFuZ1sndGlueV9tY2VfcGx1Z2luc19oZWxwJ10gPSdDaGVjayB0aGUgcGx1Z2lucyB5b3Ugd2FudCB0byB1c2UgKHN0cmcgZm9yIG11bHRpcGxlIHBsdWdpbnMpLic7CiRsYW5nWyd0aW55X21jZV9idXR0b25zMV9sYWJlbCddID0nRmlyc3QgdG9vbGJhcic7CiRsYW5nWyd0aW55X21jZV9idXR0b25zMV9oZWxwJ10gPSdDdXN0b21pemUgYW5kIGluc2VydCBidXR0b25zIGZvciB5b3VyIGZpcnN0IHRvb2xiYXIuJzsKJGxhbmdbJ3RpbnlfbWNlX2J1dHRvbnMyX2xhYmVsJ10gPSdTZWNvbmQgdG9vbGJhcic7CiRsYW5nWyd0aW55X21jZV9idXR0b25zMl9oZWxwJ10gPSdDdXN0b21pemUgYW5kIGluc2VydCBidXR0b25zIGZvciB5b3VyIHNlY29uZCB0b29sYmFyLic7CiRsYW5nWyd0aW55X21jZV9idXR0b25zM19sYWJlbCddID0nVGhpcmQgdG9vbGJhcic7CiRsYW5nWyd0aW55X21jZV9idXR0b25zM19oZWxwJ10gPSdDdXN0b21pemUgYW5kIGluc2VydCBidXR0b25zIGZvciB5b3VyIHRoaXJkIHRvb2xiYXIuJzsKJGxhbmdbJ3RpbnlfbWNlX2ZvcmNlZF9yb290X2Jsb2NrX2xhYmVsJ10gPSdGb3JjZSByb290IGJsb2NrJzsKJGxhbmdbJ3RpbnlfbWNlX2ZvcmNlZF9yb290X2Jsb2NrX2hlbHAnXSA9J0VuYWJsZSBmb2NyZSByb290IGJsb2NrLic7CiRsYW5nWyd0aW55X21jZV9mb3JjZV9icl9uZXdsaW5lc19sYWJlbCddID0nTmV3bGluZXMgQlInOwokbGFuZ1sndGlueV9tY2VfZm9yY2VfYnJfbmV3bGluZXNfaGVscCddID0nRW5hYmxlIGJyZWFrIHRhZyBCUiBmb3IgbmV3bGluZXMuJzsKJGxhbmdbJ3RpbnlfbWNlX2ZvcmNlX3BfbmV3bGluZXNfbGFiZWwnXSA9J05ld2xpbmVzIFAnOwokbGFuZ1sndGlueV9tY2VfZm9yY2VfcF9uZXdsaW5lc19oZWxwJ10gPSdFbmFibGUgcGFyYWdyYXBoIHRhZyBQIGZvciBuZXdsaW5lcy4nOwokbGFuZ1sndGlueV9tY2VfZW50aXR5X2VuY29kaW5nX2xhYmVsJ10gPSdFbnRpdHkgZW5jb2RpbmcnOwokbGFuZ1sndGlueV9tY2VfZW50aXR5X2VuY29kaW5nX2hlbHAnXSA9J0Nob29zZSBlbnRpdHkgZW5jb2RpbmcuJzsKJGxhbmdbJ3RpbnlfbWNlX3RoZW1lX2FkdmFuY2VkX3Jlc2l6aW5nX2xhYmVsJ10gPSdSZXNpemluZyc7CiRsYW5nWyd0aW55X21jZV90aGVtZV9hZHZhbmNlZF9yZXNpemluZ19oZWxwJ10gPSdFbmFibGUgcmVzaXppbmcuJzsKCj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2Rlc2NyaXB0aW9uJ10gPSAnRWluIHVtZmFuZ3JlaWNoZXMgSW5saW5lZWRpdG9ybW9kdWwuJzsKJGxhbmdbJ2FkbWRlc2NyaXB0aW9uJ10gPSAnRWluIHVtZmFuZ3JlaWNoZXMgSW5saW5lZWRpdG9ybW9kdWwuJzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+VmVyd2VuZHVuZzwvaDM+DQo8dWw+DQogIDxsaT4NCiAgICAxKSA8c3BhbiBzdHlsZT0mcXVvdDtjb2xvcjpvcmFuZ2UmcXVvdDs+V2ljaHRpZyE8L3NwYW4+IEYmdXVtbDtnZW4gU2llIGRlbiB7Y21zX21vZHVsZSBtb2R1bGU9JnF1b3Q7dG91Y2hJbmxpbmVFZGl0JnF1b3Q7fSBUYWcgaW4gamVkZXMgVGVtcGxhdGUgaW4gZGVtIFNpZSBkYXMgTW9kdWwgbnV0emVuIG0mb3VtbDtjaHRlbiBvYmVuIGRpcmVrdCBuYWNoIGRlbSB7cHJvY2Vzc19wYWdlZGF0YX0gVGFnIGVpbi48YnIgLz4NCiAgICAyKSBLb25maWd1cmllcmVuIFNpZSBkaWUgR3J1cHBlbnJlY2h0ZSAoc2V0emUgQmVyZWNodGlndW5nOiBVc2UgdG91Y2hJbmxpbmVFZGl0KSBvZGVyIGtvbmZpZ3VyaWVyZW4gU2llIGRpZSBvcHRpb25hbGUgRnJvbnRlbnRVc2VyIChGRVUpIFVudGVyc3QmdXVtbDt0enVuZy4NCiAgPC9saT4NCjwvdWw+DQo8aDM+JlV1bWw7YmVyPC9oMz4NCjx1bD4NCiAgPGxpPkNvcHlyaWdodCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLyI+dG91Y2hEZXNpZ248L2E+PC9saT4NCiAgPGxpPkF1dG9yIENocmlzdG9waCBHcnViZXI8L2xpPg0KICA8bGk+Q01TbXMgVG91Y2hJbmxpbmVFZGl0IDxhIGhyZWY9Imh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hpbmxpbmVlZGl0Ij5Qcm9qZWt0c2VpdGU8L2E+PC9saT4NCiAgPGxpPlN1cHBvcnQgdmlhIDxhIGhyZWY9Imh0dHA6Ly93d3cuaG9tZXBhZ2UtY29tbXVuaXR5LmRlL2luZGV4LnBocD90b3BpYz0xNjgwLjAiPkhQQzwvYT48L2xpPg0KICA8bGk+TGljZW5zZSBHUEwgMi4wPC9saT4NCjwvdWw+JzsKJGxhbmdbJ3NldHRpbmdzJ10gPSAnRWluc3RlbGx1bmdlbic7CiRsYW5nWydwZXJtaXNzaW9ucyddID0gJ0JlcmVjaHRpZ3VuZ2VuJzsKJGxhbmdbJ3RlbXBsYXRlcyddID0gJ1RlbXBsYXRlcyc7CiRsYW5nWydlZGl0b3InXSA9ICdFZGl0b3InOwokbGFuZ1sndGFibGVjb2x0ZW1wbGF0ZSddID0gJ1RlbXBsYXRlJzsKJGxhbmdbJ3llcyddID0gJ0phJzsKJGxhbmdbJ25vJ10gPSAnTmVpbic7CiRsYW5nWydzYXZlJ10gPSAnU3BlaWNoZXJuJzsKJGxhbmdbJ2VkaXQnXSA9ICdCZWFyYmVpdGVuJzsKJGxhbmdbJ2NhbmNlbCddID0gJ0FiYnJlY2hlbic7CiRsYW5nWydyZXNldCddID0gJ1p1ciZ1dW1sO2Nrc2V0emVuJzsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICdFaW5zdGVsbHVuZ2VuIGdlc3BlaWNoZXJ0Lic7CiRsYW5nWyd0ZW1wbGF0ZXNzYXZlZCddID0gJ1RlbXBsYXRlIGdlc3BlaWNoZXJ0Lic7CiRsYW5nWydzZXR0aW5nc2NvbmZpcm0nXSA9ICdXZW5uIFNpZSBkZW4gSW5saW5lRWRpdG9yIHdlY2hzZWxuIHdlcmRlbiBhbGxlIEVpbnN0ZWxsdW5nZW4gdW5kIFRlbXBsYXRlcyBkaWUgU2llIGYmdXVtbDtyICVzIGVpbmdlcmljaHRldCBoYWJlbiB6dXImdXVtbDtja2dlc2V0enQuJzsKJGxhbmdbJ2ZlUGx1Z2luX2xhYmVsJ10gPSAnV2VsY2hlciBJbmxpbmVlZGl0b3Igc29sbCB2ZXJ3ZW5kZXQgd2VyZGVuLic7CiRsYW5nWydmZVBsdWdpbl9oZWxwJ10gPSAnSW5saW5lZWRpdG9yJzsKJGxhbmdbJ2ZlRWRpdEJ1dHRvbl9sYWJlbCddID0gJ0VkaXRidXR0b24gaW0gRnJvbnRlbmQnOwokbGFuZ1snZmVFZGl0QnV0dG9uX2hlbHAnXSA9ICdTb2xsIGVpbiBCdXR0b24genVtIGRlLS9ha3RpdmllcmVuIHZvbiBJbmxpbmVFZGl0IGFuZ2V6ZWlndCB3ZXJkZW4/JzsKJGxhbmdbJ2ZlRWRpdEJ1dHRvblRleHRfbGFiZWwnXSA9ICdFZGl0YnV0dG9uIHRleHQnOwokbGFuZ1snZmVFZGl0QnV0dG9uVGV4dF9oZWxwJ10gPSAnRWRpdGJ1dHRvbiB0ZXh0Lic7CiRsYW5nWydmZUVkaXRCdXR0b25UZXh0X2RlZmF1bHQnXSA9ICdUb3VjaElubGluZUVkaXQnOwokbGFuZ1snZmVVcGRhdGVBbGVydE1lc3NhZ2VfbGFiZWwnXSA9ICdVcGRhdGVuYWNocmljaHQ/JzsKJGxhbmdbJ2ZlVXBkYXRlQWxlcnRNZXNzYWdlX2hlbHAnXSA9ICdNJm91bWw7Y2h0ZW4gU2llIGVpbmVuIEhpbndlaXMgbmFjaCBlcm9sZ3JlaWNoZW0gc3BlaWNoZXJuIGRlcyBJbmhhbHRlcyBpbSBCcm93c2VyIGF1c2dlYmVuPyc7CiRsYW5nWydmZVVwZGF0ZUFsZXJ0TWVzc2FnZV9kZWZhdWx0J10gPSAnSW5oYWx0IGVyZm9sZ3JlaWNoIGdlc3BlaWNoZXJ0Li4uJzsKJGxhbmdbJ3RvdWNoSW5saW5lRWRpdEJ1dHRvbl9sYWJlbCddID0gJ0VkaXRidXR0b24tVGVtcGxhdGUnOwokbGFuZ1snZmVFZGl0T25EYmxDbGlja19sYWJlbCddID0gJ0FrdGl2aWVyZSBJbmxpbmVFZGl0IGR1cmNoIERvcHBlbGtsaWNrJzsKJGxhbmdbJ2ZlRWRpdE9uRGJsQ2xpY2tfaGVscCddID0gJ0FrdGl2aWVyZSBJbmxpbmVFZGl0IGR1cmNoIGVpbmVuIERvcHBlbGtsaWNrIGluIGRlbiBJbmhhbHRzYmVyZWljaC4nOwokbGFuZ1snZmVGRVVhbGxvd19sYWJlbCddID0gJ0VybGF1YmUgRkVVPyc7CiRsYW5nWydmZUZFVWFsbG93X2hlbHAnXSA9ICdFcmxhdWJlIEZyb250ZW5kIFVzZXJuIGRhcyBudXR6ZW4gdm9uIElubGluZUVkaXQuJzsKJGxhbmdbJ2ZlRkVVZ3JvdXBzX2xhYmVsJ10gPSAnRkVVIEdydXBwZW4nOwokbGFuZ1snZmVGRVVncm91cHNfaGVscCddID0gJ0Zyb250ZW5kIFVzZXIgR3J1cHBlbmJlc2NociZhdW1sO25rdW5nZW4gZWlucmljaHRlbi4nOwokbGFuZ1snZmVGRVVkaXNhYmxlZF9sYWJlbCddID0gJ0Zyb250RW5kVXNlciAoRkVVKSBTdXBwb3J0IGlzdCBkZWFrdGl2aWVydC4nOwokbGFuZ1snZmVGRVVkaXNhYmxlZF9oZWxwJ10gPSAnVW0gSW5saW5lRWRpdCBtaXQgRnJvbnRlbmQgVXNlciBTdXBwb3J0IChGRVUpIHp1IG51dHplbiBtdXNzIHp1dm9yIGRpZSBGcm9udGVuZFVzZXIgRXJ3ZWl0ZXJ1bmcgaW5zdGFsbGllcnQgd2VyZGVuLic7CiRsYW5nWydmZUFkbWluQWxsb3dfbGFiZWwnXSA9ICdFcmxhdWJlIEFkbWlucz8nOwokbGFuZ1snZmVBZG1pbkFsbG93X2hlbHAnXSA9ICdFcmxhdWJlIEFkbWluaXN0cmF0b3JlbiAobWl0ICZxdW90O1VzZSB0b3VjaElubGluZUVkaXQmcXVvdDsgQmVyZWNodGlndW5nKSBkYXMgbnV0emVuIHZvbiBJbmxpbmVFZGl0Lic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0luc3RhbGxhdGlvbiBlcmZvbGdyZWljaC4uLic7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnRGVpbnN0YWxsYXRpb24gZXJmb2xncmVpY2guLi4nOwokbGFuZ1sncG9zdHVwZ3JhZGUnXSA9ICdVcGdyYWRlIGVyZm9sZ3JlaWNoIGF1ZiBWZXJzaW9uICVzLi4uJzsKJGxhbmdbJ3Bvc3Rjb250ZW50dXBkYXRlJ10gPSAnSW5oYWx0IG1pdCBjb250ZW50X2lkOiVzIGFrdHVhbGlzaWVydC4nOwokbGFuZ1sncHJldW5pbnN0YWxsJ10gPSAnRHVyY2ggZGllIERlaW5zdGFsbGF0aW9uIGdlaGVuIGFsbGUgRWluc3RlbGx1bmdlbiB1bmQgVGVtcGxhdGVzIHZlcmxvcmVuISBNaXQgZGVyIERlaW5zdGFsbGF0aW9uIHZvbiBJbmxpbmVFZGl0IGZvcnRmYWhyZW4/JzsKJGxhbmdbJ25pY2VkaXRfZnVsbF9wYW5lbF9sYWJlbCddID0gJ0Vyd2VpdGVydGUgV2Vya3pldWdsZWlzdGU/JzsKJGxhbmdbJ25pY2VkaXRfZnVsbF9wYW5lbF9oZWxwJ10gPSAnQWt0aXZpZXJlIGVyd2VpdGVydGUgV2Vya3plZ2xlaXN0ZS4nOwokbGFuZ1snbmljZWRpdF9qcXVlcnlfbG9hZF9sYWJlbCddID0gJ0xhZGUgalF1ZXJ5IFNjcmlwdGUuJzsKJGxhbmdbJ25pY2VkaXRfanF1ZXJ5X2xvYWRfaGVscCddID0gJ0xhc3NlIGRpZSBiZW4mb3VtbDt0aWd0ZW4galF1ZXJ5IFNjcmlwdGUgZHVyY2ggVG91Y2hJbmxpbmVFZGl0IGxhZGVuLic7CiRsYW5nWyduaWNlZGl0X2J1dHRvbl9saXN0X2xhYmVsJ10gPSAnQnV0dG9ucyc7CiRsYW5nWyduaWNlZGl0X2J1dHRvbl9saXN0X2hlbHAnXSA9ICdQYXNzZW4gU2llIHNpY2ggaGllciBJaHJlIFdlcmt6ZWlnbGVpc3RlIHVuZCBkaWUgdmVyZiZ1dW1sO2diYXJlbiBLbiZvdW1sO3BmZSBhbi4nOwokbGFuZ1snbmljZWRpdF9oZWlnaHRfbGFiZWwnXSA9ICdNYXhpbWFsaCZvdW1sO2hlJzsKJGxhbmdbJ25pY2VkaXRfaGVpZ2h0X2hlbHAnXSA9ICdNYXhpbWFsZSBIJm91bWw7aGUgZGVzIElubGluZUVkaXRvcnMgaW4gUGl4ZWwgZGVyIFN0YW5kYXJkIGlzdCZxdW90O2F1dG8mcXVvdDsuJzsKJGxhbmdbJ2VscnRlX3Rvb2xiYXJfbGFiZWwnXSA9ICdXZWxjaGUgV2Vya3pldWdsZWlzdGU/JzsKJGxhbmdbJ2VscnRlX3Rvb2xiYXJfaGVscCddID0gJ1cmYXVtbDtobGVuIFNpZSBlaW5lIFdlcmt6ZXVnbGVpc3RlIGRpZSBTaWUgbnV0emVuIG0mb3VtbDtjaHRlbi4nOwokbGFuZ1snZWxydGVfanF1ZXJ5X2xvYWRfbGFiZWwnXSA9ICdMb2FkIGpRdWVyeSBsaWJhcnknOwokbGFuZ1snZWxydGVfanF1ZXJ5X2xvYWRfaGVscCddID0gJ0xldCBJbmxpbmVFZGl0IGxvYWQgcmVxdWlyZWQgalF1ZXJ5IGxpYmFyeSBpbiBoZWFkZXIgb2YgcGFnZXMuJzsKJGxhbmdbJ3RpbnlfbWNlX2pxdWVyeV9sb2FkX2xhYmVsJ10gPSAnTGFkZSBqUXVlcnkgU2NyaXB0ZS4nOwokbGFuZ1sndGlueV9tY2VfanF1ZXJ5X2xvYWRfaGVscCddID0gJ0xldCBJbmxpbmVFZGl0IGxvYWQgcmVxdWlyZWQgalF1ZXJ5IGxpYmFyeSBpbiBoZWFkZXIgb2YgcGFnZXMuJzsKJGxhbmdbJ3RpbnlfbWNlX3RoZW1lX2xhYmVsJ10gPSAnVGhlbWUnOwokbGFuZ1sndGlueV9tY2VfdGhlbWVfaGVscCddID0gJ0Nob29zZSBhbnkgdGhlbWUgeW91IHdhbnQuJzsKJGxhbmdbJ3RpbnlfbWNlX3NraW5fbGFiZWwnXSA9ICdTa2luJzsKJGxhbmdbJ3RpbnlfbWNlX3NraW5faGVscCddID0gJ0Nob29zZSBhbnkgc2tpbiB5b3UgbGlrZS4nOwokbGFuZ1sndGlueV9tY2Vfc2tpbl92YXJpYW50X2xhYmVsJ10gPSAnU2tpbiB2YXJpYW50JzsKJGxhbmdbJ3RpbnlfbWNlX3NraW5fdmFyaWFudF9oZWxwJ10gPSAnQ2hvb3NlIGFueSBza2luIHZhcmlhbnQgeW91IGxpa2UuJzsKJGxhbmdbJ3RpbnlfbWNlX3dpZHRoX2xhYmVsJ10gPSAnV2lkdGgnOwokbGFuZ1sndGlueV9tY2Vfd2lkdGhfaGVscCddID0gJ0VkaXRvciB3aWR0aCBpbiBwaXhlbCBkZWZhdWx0IGF1dG8uJzsKJGxhbmdbJ3RpbnlfbWNlX2hlaWdodF9sYWJlbCddID0gJ0hlaWdodCc7CiRsYW5nWyd0aW55X21jZV9oZWlnaHRfaGVscCddID0gJ0VkaXRvciBoZWlnaHQgaW4gcGl4ZWwgZGVmYXVsdCBhdXRvLic7CiRsYW5nWyd0aW55X21jZV9wbHVnaW5zX2xhYmVsJ10gPSAnUGx1Z2lucyc7CiRsYW5nWyd0aW55X21jZV9wbHVnaW5zX2hlbHAnXSA9ICdDaGVjayB0aGUgcGx1Z2lucyB5b3Ugd2FudCB0byB1c2UgKHN0cmcgZm9yIG11bHRpcGxlIHBsdWdpbnMpLic7CiRsYW5nWyd0aW55X21jZV9idXR0b25zMV9sYWJlbCddID0gJ0ZpcnN0IHRvb2xiYXInOwokbGFuZ1sndGlueV9tY2VfYnV0dG9uczFfaGVscCddID0gJ0N1c3RvbWl6ZSBhbmQgaW5zZXJ0IGJ1dHRvbnMgZm9yIHlvdXIgZmlyc3QgdG9vbGJhci4nOwokbGFuZ1sndGlueV9tY2VfYnV0dG9uczJfbGFiZWwnXSA9ICdTZWNvbmQgdG9vbGJhcic7CiRsYW5nWyd0aW55X21jZV9idXR0b25zMl9oZWxwJ10gPSAnQ3VzdG9taXplIGFuZCBpbnNlcnQgYnV0dG9ucyBmb3IgeW91ciBzZWNvbmQgdG9vbGJhci4nOwokbGFuZ1sndGlueV9tY2VfYnV0dG9uczNfbGFiZWwnXSA9ICdUaGlyZCB0b29sYmFyJzsKJGxhbmdbJ3RpbnlfbWNlX2J1dHRvbnMzX2hlbHAnXSA9ICdDdXN0b21pemUgYW5kIGluc2VydCBidXR0b25zIGZvciB5b3VyIHRoaXJkIHRvb2xiYXIuJzsKJGxhbmdbJ3RpbnlfbWNlX2ZvcmNlZF9yb290X2Jsb2NrX2xhYmVsJ10gPSAnRm9yY2Ugcm9vdCBibG9jayc7CiRsYW5nWyd0aW55X21jZV9mb3JjZWRfcm9vdF9ibG9ja19oZWxwJ10gPSAnRW5hYmxlIGZvY3JlIHJvb3QgYmxvY2suJzsKJGxhbmdbJ3RpbnlfbWNlX2ZvcmNlX2JyX25ld2xpbmVzX2xhYmVsJ10gPSAnTmV3bGluZXMgQlInOwokbGFuZ1sndGlueV9tY2VfZm9yY2VfYnJfbmV3bGluZXNfaGVscCddID0gJ0VuYWJsZSBicmVhayB0YWcgQlIgZm9yIG5ld2xpbmVzLic7CiRsYW5nWyd0aW55X21jZV9mb3JjZV9wX25ld2xpbmVzX2xhYmVsJ10gPSAnTmV3bGluZXMgUCc7CiRsYW5nWyd0aW55X21jZV9mb3JjZV9wX25ld2xpbmVzX2hlbHAnXSA9ICdFbmFibGUgcGFyYWdyYXBoIHRhZyBQIGZvciBuZXdsaW5lcy4nOwokbGFuZ1sndGlueV9tY2VfZW50aXR5X2VuY29kaW5nX2xhYmVsJ10gPSAnRW50aXR5IGVuY29kaW5nJzsKJGxhbmdbJ3RpbnlfbWNlX2VudGl0eV9lbmNvZGluZ19oZWxwJ10gPSAnQ2hvb3NlIGVudGl0eSBlbmNvZGluZy4nOwokbGFuZ1sndGlueV9tY2VfdGhlbWVfYWR2YW5jZWRfcmVzaXppbmdfbGFiZWwnXSA9ICdSZXNpemluZyc7CiRsYW5nWyd0aW55X21jZV90aGVtZV9hZHZhbmNlZF9yZXNpemluZ19oZWxwJ10gPSAnRW5hYmxlIHJlc2l6aW5nLic7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjE0NTk2MjMwNjAuMTI4MDg0ODEyNS4xMjk1MDc3NjUwLjEyOTUxNzUxNDMuMTg4JzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTI5NDc0OTUxMy4xODIuMTUudXRtY3NyPXRvdWNoZGVzaWduLmJpenx1dG1jY249KHJlZmVycmFsKXx1dG1jbWQ9cmVmZXJyYWx8dXRtY2N0PS9jbXNtcy9saXZlLyc7CiRsYW5nWydxY2EnXSA9ICdQMC0xMDIxMzI4ODkxLTEyODA4NDgxMjQ5MjEnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+VXNhZ2U8L2gzPg0KPHVsPg0KICA8bGk+TG9hZCBtb2R1bGUgLSB7Y21zX21vZHVsZSBtb2R1bGU9JnF1b3Q7dG91Y2hJbmxpbmVFZGl0JnF1b3Q7fTwvbGk+DQo8L3VsPg0KPGgzPkFib3V0PC9oMz4NCjx1bD4NCiAgPGxpPkNvcHlyaWdodCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLyI+dG91Y2hEZXNpZ248L2E+PC9saT4NCiAgPGxpPkF1dGhvciBDaHJpc3RvcGggR3J1YmVyPC9saT4NCiAgPGxpPlN1cHBvcnQgdmlhIDxhIGhyZWY9Imh0dHA6Ly93d3cuaG9tZXBhZ2UtY29tbXVuaXR5LmRlL2luZGV4LnBocD90b3BpYz0xNjgwLjAiPkhQQzwvYT48L2xpPg0KICA8bGk+TGljZW5zZSBHUEwgMi4wPC9saT4NCjwvdWw+JzsKJGxhbmdbJ3NldHRpbmdzJ10gPSAnU2V0dGluZ3MnOwokbGFuZ1sncGVybWlzc2lvbnMnXSA9ICdQZXJtaXNzaW9ucyc7CiRsYW5nWyd0ZW1wbGF0ZXMnXSA9ICdUZW1wbGF0ZXMnOwokbGFuZ1snZWRpdG9yJ10gPSAnRWRpdG9yJzsKJGxhbmdbJ3RhYmxlY29sdGVtcGxhdGUnXSA9ICdUZW1wbGF0ZSc7CiRsYW5nWyd5ZXMnXSA9ICdZZXMnOwokbGFuZ1snbm8nXSA9ICdObyc7CiRsYW5nWydzYXZlJ10gPSAnU2F2ZSc7CiRsYW5nWydlZGl0J10gPSAnRWRpdCc7CiRsYW5nWydjYW5jZWwnXSA9ICdDYW5jZWwnOwokbGFuZ1sncmVzZXQnXSA9ICdSZXNldCc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnU2V0dGluZ3Mgc2F2ZWQuJzsKJGxhbmdbJ3RlbXBsYXRlc3NhdmVkJ10gPSAnVGVtcGxhdGUgc2F2ZWQuJzsKJGxhbmdbJ2ZlUGx1Z2luX2xhYmVsJ10gPSAnV2hpY2ggZWRpdG9yIHlvdSB3YW50Pyc7CiRsYW5nWydmZVBsdWdpbl9oZWxwJ10gPSAnU2VsZWN0IGFuIGVkaXRvci4nOwokbGFuZ1snZmVFZGl0QnV0dG9uX2xhYmVsJ10gPSAnRWRpdCBidXR0b24gaW4gRkU/JzsKJGxhbmdbJ2ZlRWRpdEJ1dHRvbl9oZWxwJ10gPSAnQWRkIGVuYWJsZS9kaXNhYmxlIGJ1dHRvbiBmb3IgaW5saW5lIGVkaXQgaW4gZnJvbnRlbmQuJzsKJGxhbmdbJ2ZlRnVsbFBhbmVsX2xhYmVsJ10gPSAnQWR2YW5jZWQgdG9vbGJhcj8nOwokbGFuZ1snZmVGdWxsUGFuZWxfaGVscCddID0gJ0VuYWJsZSBhZHZhbmNlZCB0b29sYmFyIGZvciBpbmxpbmUgZWRpdC4nOwokbGFuZ1snZmVVcGRhdGVBbGVydF9sYWJlbCddID0gJ1VwZGF0ZSBhbGVydD8nOwokbGFuZ1snZmVVcGRhdGVBbGVydF9oZWxwJ10gPSAnRW5hYmxlIHVwZGF0ZSBhbGVydCBpbiBmcm9udGVuZC4nOwokbGFuZ1sndG91Y2hJbmxpbmVFZGl0QnV0dG9uX2xhYmVsJ10gPSAnSW5saW5lIGVkaXQgYnV0dG9uIHRlbXBsYXRlOic7CiRsYW5nWydmZUVkaXRPbkRibENsaWNrX2xhYmVsJ10gPSAnQWN0aXZhdGUgaW5saW5lIGVkaXQgb24gZG91YmxlIGNsaWNrPyc7CiRsYW5nWydmZUVkaXRPbkRibENsaWNrX2hlbHAnXSA9ICdBY3RpdmF0ZSBpbmxpbmUgZWRpdCBvbiBkb3VibGUgY2xpY2sgaW4gY29udGVudCBhcmVhLic7CiRsYW5nWydmZUlubGluZUVkaXRCdXR0b24nXSA9ICdFZGl0JzsKJGxhbmdbJ2ZlVXBkYXRlQWxlcnQnXSA9ICdDb250ZW50IGhhcyBiZWVuIHNhdmVkLi4uJzsKJGxhbmdbJ2ZlRkVVYWxsb3dfbGFiZWwnXSA9ICdBbGxvdyBGRVU/JzsKJGxhbmdbJ2ZlRkVVYWxsb3dfaGVscCddID0gJ0FsbG93IGZyb250ZW5kIHVzZXJzIHRvIHVzZSBpbmxpbmUgZWRpdC4nOwokbGFuZ1snZmVGRVVncm91cHNfbGFiZWwnXSA9ICdTZXQgRkVVIGdyb3VwKHMpPyc7CiRsYW5nWydmZUZFVWdyb3Vwc19oZWxwJ10gPSAnU2V0IEZFVSBncm91cCByZXN0cmljdGlvbnMuJzsKJGxhbmdbJ2ZlRkVVZGlzYWJsZWRfbGFiZWwnXSA9ICdGcm9udEVuZFVzZXIgKEZFVSkgc3VwcG9ydCBpcyBkaXNhYmxlZC4nOwokbGFuZ1snZmVGRVVkaXNhYmxlZF9oZWxwJ10gPSAnVG8gdXNlIGlubGluZSBlZGl0IHdpdGggZnJvbnRlbmQgdXNlciBzdXBwb3J0IHlvdSBoYXZlIHRvIGluc3RhbGwgdGhlIGZyb250ZW5kIHVzZXJzIChGRVUpIG1vZHVsZS4nOwokbGFuZ1snZmVBZG1pbkFsbG93X2xhYmVsJ10gPSAnQWxsb3cgYWRtaW5zPyc7CiRsYW5nWydmZUFkbWluQWxsb3dfaGVscCddID0gJ0FsbG93IGFkbWluIHVzZXJzICh3aXRoICZxdW90O1VzZSB0b3VjaElubGluZUVkaXQmcXVvdDsgcGVybWlzc2lvbnMpIHRvIHVzZSBpbmxpbmUgZWRpdC4nOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdJbnN0YWxsIHN1Y2Nlc3MuLi4nOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ1VuaW5zdGFsbCBzdWNjZXNzLi4uJzsKJGxhbmdbJ3Bvc3R1cGdyYWRlJ10gPSAnVXBncmFkZSBzdWNjZXNzIHZlcnNpb24gJXMuLi4nOwokbGFuZ1sncG9zdGNvbnRlbnR1cGRhdGUnXSA9ICdDb250ZW50IHdpdGggY29udGVudF9pZDolcyB1cGRhdGVkLic7CiRsYW5nWydwcmV1bmluc3RhbGwnXSA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gdW5pbnN0YWxsIHRoaXMgbW9kdWxlIGFuZCBkZXN0cm95IGFsbCBzZXR0aW5ncy90ZW1wbGF0ZXM/JzsKJGxhbmdbJ25pY2VkaXRGdWxsUGFuZWxfbGFiZWwnXSA9ICdFeHRlbmRlZCB0b29sYmFyPyc7CiRsYW5nWyduaWNlZGl0RnVsbFBhbmVsX2hlbHAnXSA9ICdVc2UgZXh0ZW5kZWQgdG9vbGJhci4nOwokbGFuZ1snbmljZWRpdEpRdWVyeUxvYWRfbGFiZWwnXSA9ICdMb2FkIGpRdWVyeSBsaWJhcnknOwokbGFuZ1snbmljZWRpdEpRdWVyeUxvYWRfaGVscCddID0gJ0xldCBpbmxpbmUgZWRpdCBsb2FkIHJlcXVpcmVkIGpRdWVyeSBsaWJhcnkgaW4gaGVhZGVyIG9mIHBhZ2VzLic7CiRsYW5nWydlbHJ0ZVRvb2xiYXJfbGFiZWwnXSA9ICdXaGljaCB0b29sYmFyPyc7CiRsYW5nWydlbHJ0ZVRvb2xiYXJfaGVscCddID0gJ0Nob29zZSBhbnkgdG9vbGJhciB5b3UgbGlrZS4nOwokbGFuZ1snZWxydGVKUXVlcnlMb2FkX2xhYmVsJ10gPSAnTG9hZCBqUXVlcnkgbGliYXJ5JzsKJGxhbmdbJ2VscnRlSlF1ZXJ5TG9hZF9oZWxwJ10gPSAnTGV0IGlubGluZSBlZGl0IGxvYWQgcmVxdWlyZWQgalF1ZXJ5IGxpYmFyeSBpbiBoZWFkZXIgb2YgcGFnZXMuJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTI5MjA3MTE5Ny4zNDU4Ljc5LnV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY249KHJlZmVycmFsKXx1dG1jbWQ9cmVmZXJyYWx8dXRtY2N0PS9pbmRleC5waHAvdG9waWMsNDk5ODkuMC90b3BpY3NlZW4uaHRtbCc7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjE3OTA1MjYyMzA4NDExMDEwMC4xMjEwNDIzNTc3LjEyOTM2NTkzMzcuMTI5MzY2MTY0NS4zNDgzJzsKJGxhbmdbJ3FjYSddID0gJzEyMTA5NzE2OTAtMjczMDgwNzMtODE5NTI4MzInOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xLjEwLjEyOTM2NjE2NDUnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+VXNhZ2U8L2gzPg0KPHVsPg0KICA8bGk+TG9hZCBtb2R1bGUgLSB7Y21zX21vZHVsZSBtb2R1bGU9JnF1b3Q7dG91Y2hJbmxpbmVFZGl0JnF1b3Q7fTwvbGk+DQo8L3VsPg0KPGgzPkFib3V0PC9oMz4NCjx1bD4NCiAgPGxpPkNvcHlyaWdodCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLyI+dG91Y2hEZXNpZ248L2E+PC9saT4NCiAgPGxpPkF1dGhvciBDaHJpc3RvcGggR3J1YmVyPC9saT4NCiAgPGxpPlN1cHBvcnQgdmlhIDxhIGhyZWY9Imh0dHA6Ly93d3cuaG9tZXBhZ2UtY29tbXVuaXR5LmRlL2luZGV4LnBocD90b3BpYz0xNjgwLjAiPkhQQzwvYT48L2xpPg0KICA8bGk+TGljZW5zZSBHUEwgMi4wPC9saT4NCjwvdWw+JzsKJGxhbmdbJ3NldHRpbmdzJ10gPSAnSW5zdGVsbGluZ2VuJzsKJGxhbmdbJ3Blcm1pc3Npb25zJ10gPSAnUGVybWlzc2llcyc7CiRsYW5nWyd0ZW1wbGF0ZXMnXSA9ICdTamFibG9uZW4nOwokbGFuZ1snZWRpdG9yJ10gPSAnRWRpdG9yICc7CiRsYW5nWyd0YWJsZWNvbHRlbXBsYXRlJ10gPSAnU2phYmxvb24nOwokbGFuZ1sneWVzJ10gPSAnSmEnOwokbGFuZ1snbm8nXSA9ICdOZWUnOwokbGFuZ1snc2F2ZSddID0gJ09wc2xhYW4nOwokbGFuZ1snZWRpdCddID0gJ1dpanppZyc7CiRsYW5nWydjYW5jZWwnXSA9ICdBbm51bGVlcic7CiRsYW5nWydyZXNldCddID0gJ1Jlc2V0ICc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5zdGVsbGluZ2VuIG9wZ2VzbGFnZW4uJzsKJGxhbmdbJ3RlbXBsYXRlc3NhdmVkJ10gPSAnU2phYmxvb24gb3BnZXNsYWdlbi4nOwokbGFuZ1snZmVQbHVnaW5fbGFiZWwnXSA9ICdXZWxrZSBlZGl0b3Igd2lsdCB1IGdlYnJ1aWtlbj8nOwokbGFuZ1snZmVQbHVnaW5faGVscCddID0gJ1NlbGVjdGVlciBlZW4gZWRpdG9yLic7CiRsYW5nWydmZUVkaXRCdXR0b25fbGFiZWwnXSA9ICdXaWp6aWcgYnV0dG9uIGluIEZFPyc7CiRsYW5nWydmZUVkaXRCdXR0b25faGVscCddID0gJ0FkZCBlbmFibGUvZGlzYWJsZSBidXR0b24gZm9yIGlubGluZSBlZGl0IGluIGZyb250ZW5kLic7CiRsYW5nWydmZUZ1bGxQYW5lbF9sYWJlbCddID0gJ1VpdGdlYnJlaWRkZSB0b29sYmFyPyc7CiRsYW5nWydmZUZ1bGxQYW5lbF9oZWxwJ10gPSAnRW5hYmxlIGFkdmFuY2VkIHRvb2xiYXIgZm9yIGlubGluZSBlZGl0Lic7CiRsYW5nWydmZVVwZGF0ZUFsZXJ0X2xhYmVsJ10gPSAnVXBkYXRlIHNpZ25hbGVyaW5nPyc7CiRsYW5nWydmZVVwZGF0ZUFsZXJ0X2hlbHAnXSA9ICdFbmFibGUgdXBkYXRlIGFsZXJ0IGluIGZyb250ZW5kLic7CiRsYW5nWyd0b3VjaElubGluZUVkaXRCdXR0b25fbGFiZWwnXSA9ICdJbmxpbmUgZWRpdCBidXR0b24gdGVtcGxhdGU6JzsKJGxhbmdbJ2ZlRWRpdE9uRGJsQ2xpY2tfbGFiZWwnXSA9ICdBY3RpdmF0ZSBpbmxpbmUgZWRpdCBvbiBkb3VibGUgY2xpY2s/JzsKJGxhbmdbJ2ZlRWRpdE9uRGJsQ2xpY2tfaGVscCddID0gJ0FjdGl2YXRlIGlubGluZSBlZGl0IG9uIGRvdWJsZSBjbGljayBpbiBjb250ZW50IGFyZWEuJzsKJGxhbmdbJ2ZlSW5saW5lRWRpdEJ1dHRvbiddID0gJ1dpanppZyc7CiRsYW5nWydmZVVwZGF0ZUFsZXJ0J10gPSAnQ29udGVudCBpcyBvcGdlc2xhZ2VuLi4uJzsKJGxhbmdbJ2ZlRkVVYWxsb3dfbGFiZWwnXSA9ICdBbGxvdyBGRVU/JzsKJGxhbmdbJ2ZlRkVVYWxsb3dfaGVscCddID0gJ0FsbG93IGZyb250ZW5kIHVzZXJzIHRvIHVzZSBpbmxpbmUgZWRpdC4nOwokbGFuZ1snZmVGRVVncm91cHNfbGFiZWwnXSA9ICdTZXQgRkVVIGdyb3VwKHMpPyc7CiRsYW5nWydmZUZFVWdyb3Vwc19oZWxwJ10gPSAnU2V0IEZFVSBncm91cCByZXN0cmljdGlvbnMuJzsKJGxhbmdbJ2ZlRkVVZGlzYWJsZWRfbGFiZWwnXSA9ICdGcm9udEVuZFVzZXIgKEZFVSkgc3VwcG9ydCBpcyBkaXNhYmxlZC4nOwokbGFuZ1snZmVGRVVkaXNhYmxlZF9oZWxwJ10gPSAnVG8gdXNlIGlubGluZSBlZGl0IHdpdGggZnJvbnRlbmQgdXNlciBzdXBwb3J0IHlvdSBoYXZlIHRvIGluc3RhbGwgdGhlIGZyb250ZW5kIHVzZXJzIChGRVUpIG1vZHVsZS4nOwokbGFuZ1snZmVBZG1pbkFsbG93X2xhYmVsJ10gPSAnQWxsb3cgYWRtaW5zPyc7CiRsYW5nWydmZUFkbWluQWxsb3dfaGVscCddID0gJ0FsbG93IGFkbWluIHVzZXJzICh3aXRoICZxdW90O1VzZSB0b3VjaElubGluZUVkaXQmcXVvdDsgcGVybWlzc2lvbnMpIHRvIHVzZSBpbmxpbmUgZWRpdC4nOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdJbnN0YWxsIHN1Y2Nlc3MuLi4nOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ1VuaW5zdGFsbCBzdWNjZXNzLi4uJzsKJGxhbmdbJ3Bvc3R1cGdyYWRlJ10gPSAnVXBncmFkZSBzdWNjZXNzIHZlcnNpb24gJXMuLi4nOwokbGFuZ1sncG9zdGNvbnRlbnR1cGRhdGUnXSA9ICdDb250ZW50IHdpdGggY29udGVudF9pZDolcyB1cGRhdGVkLic7CiRsYW5nWydwcmV1bmluc3RhbGwnXSA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gdW5pbnN0YWxsIHRoaXMgbW9kdWxlIGFuZCBkZXN0cm95IGFsbCBzZXR0aW5ncy90ZW1wbGF0ZXM/JzsKJGxhbmdbJ25pY2VkaXRGdWxsUGFuZWxfbGFiZWwnXSA9ICdFeHRlbmRlZCB0b29sYmFyPyc7CiRsYW5nWyduaWNlZGl0RnVsbFBhbmVsX2hlbHAnXSA9ICdVc2UgZXh0ZW5kZWQgdG9vbGJhci4nOwokbGFuZ1snbmljZWRpdEpRdWVyeUxvYWRfbGFiZWwnXSA9ICdMb2FkIGpRdWVyeSBsaWJhcnknOwokbGFuZ1snbmljZWRpdEpRdWVyeUxvYWRfaGVscCddID0gJ0xldCBpbmxpbmUgZWRpdCBsb2FkIHJlcXVpcmVkIGpRdWVyeSBsaWJhcnkgaW4gaGVhZGVyIG9mIHBhZ2VzLic7CiRsYW5nWydlbHJ0ZVRvb2xiYXJfbGFiZWwnXSA9ICdXZWxrZSB0b29sYmFyPyc7CiRsYW5nWydlbHJ0ZVRvb2xiYXJfaGVscCddID0gJ0Nob29zZSBhbnkgdG9vbGJhciB5b3UgbGlrZS4nOwokbGFuZ1snZWxydGVKUXVlcnlMb2FkX2xhYmVsJ10gPSAnTGFhZHQgalF1ZXJ5IGxpYnJhcnknOwokbGFuZ1snZWxydGVKUXVlcnlMb2FkX2hlbHAnXSA9ICdMZXQgaW5saW5lIGVkaXQgbG9hZCByZXF1aXJlZCBqUXVlcnkgbGliYXJ5IGluIGhlYWRlciBvZiBwYWdlcy4nOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4xMzM1Njk4NzA4LjEyODQ1ODYyMTcuMTI5MzczMzUwNy4xMjkzNzQwMDE4LjY4NSc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyOTM0NTM0OTUuNjUzLjU3LnV0bWNzcj1kZXYuY21zbWFkZXNpbXBsZS5vcmd8dXRtY2NuPShyZWZlcnJhbCl8dXRtY21kPXJlZmVycmFsfHV0bWNjdD0vYnVnL2xpc3QvNic7CiRsYW5nWydxY2EnXSA9ICdQMC0xNTUxMzA2MTc5LTEyODQ1ODYyMTY3MTEnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzLjIuMTAuMTI5Mzc0MDAxOCc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ru_RU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+0JLQvdC10LTRgNC10L3QuNC1PC9oMz4NCjx1bD4NCiAgPGxpPtCS0YHRgtCw0LLRjNGC0LUg0YLQtdCzIHtjbXNfbW9kdWxlIG1vZHVsZT0idG91Y2hJbmxpbmVFZGl0In0g0LzQtdC20LTRgyDRgtC10LPQsNC80LggPGhlYWQ+INCyINGI0LDQsdC70L7QvdC1LjwvbGk+DQo8L3VsPg0KPGgzPkFib3V0PC9oMz4NCjx1bD4NCiAgPGxpPkNvcHlyaWdodCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLyI+dG91Y2hEZXNpZ248L2E+PC9saT4NCiAgPGxpPkF1dGhvciBDaHJpc3RvcGggR3J1YmVyPC9saT4NCiAgPGxpPkNNU21zIFRvdWNoSW5saW5lRWRpdCA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoaW5saW5lZWRpdCI+cHJvamVjdCBwYWdlPC9hPjwvbGk+DQogIDxsaT5TdXBwb3J0IHZpYSA8YSBocmVmPSJodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wIj5IUEM8L2E+PC9saT4NCiAgPGxpPkxpY2Vuc2UgR1BMIDIuMDwvbGk+DQo8L3VsPic7CiRsYW5nWydzZXR0aW5ncyddID0gJ9Cd0LDRgdGC0YDQvtC50LrQuCc7CiRsYW5nWydwZXJtaXNzaW9ucyddID0gJ9Cf0YDQsNCy0LAnOwokbGFuZ1sndGVtcGxhdGVzJ10gPSAn0KjQsNCx0LvQvtC90YsnOwokbGFuZ1snZWRpdG9yJ10gPSAn0KDQtdC00LDQutGC0L7RgCc7CiRsYW5nWyd0YWJsZWNvbHRlbXBsYXRlJ10gPSAn0KjQsNCx0LvQvtC9JzsKJGxhbmdbJ3llcyddID0gJ9CU0LAnOwokbGFuZ1snbm8nXSA9ICfQndC10YInOwokbGFuZ1snc2F2ZSddID0gJ9Ch0L7RhdGA0LDQvdC40YLRjCc7CiRsYW5nWydlZGl0J10gPSAn0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0YwnOwokbGFuZ1snY2FuY2VsJ10gPSAn0J7RgtC80LXQvdC40YLRjCc7CiRsYW5nWydyZXNldCddID0gJ9CS0LXRgNC90YPRgtGMINC90LDRgdGC0YDQvtC50LrQuCDQv9C+INGD0LzQvtC70YfQsNC90LjRjic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAn0J3QsNGB0YLRgNC+0LnQutC4INGB0L7RhdGA0LDQvdC10L3Riy4nOwokbGFuZ1sndGVtcGxhdGVzc2F2ZWQnXSA9ICfQqNCw0LHQu9C+0L0g0YHQvtGF0YDQsNC90LXQvS4nOwokbGFuZ1snZmVQbHVnaW5fbGFiZWwnXSA9ICfQmtCw0LrQvtC5INGA0LXQtNCw0LrRgtC+0YAg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMPyc7CiRsYW5nWydmZVBsdWdpbl9oZWxwJ10gPSAn0JLRi9Cx0L7RgCDRgNC10LTQsNC60YLQvtGA0LAnOwokbGFuZ1snZmVFZGl0QnV0dG9uX2xhYmVsJ10gPSAn0JrQvdC+0L/QutCwICLQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCIg0LLQviDRhNGA0L7QvdGC0LXQvdC00LUnOwokbGFuZ1snZmVFZGl0QnV0dG9uX2hlbHAnXSA9ICfQlNC+0LHQsNCy0LjRgtGMINCy0LrQu9GO0YfQuNGC0Ywv0L7RgtC60LvRjtGH0LjRgtGMINC60L3QvtC/0LrRgyDQtNC70Y8g0YDQtdC00LDQutGC0L7RgNCwINCy0L4g0YTRgNC+0L3RgtC10L3QtNC1Lic7CiRsYW5nWydmZVVwZGF0ZUFsZXJ0X2xhYmVsJ10gPSAn0KPQstC10LTQvtC80LvRj9GC0Ywg0L4g0YHQvtGF0YDQsNC90LXQvdC40Y/RhT8nOwokbGFuZ1snZmVVcGRhdGVBbGVydF9oZWxwJ10gPSAn0JLQutC70Y7Rh9C40YLRjCDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjQtSDQviDRgdC+0YXRgNCw0L3QtdC90LjQuCDQstC+INGE0YDQvtC90YLQtdC90LTQtSc7CiRsYW5nWyd0b3VjaElubGluZUVkaXRCdXR0b25fbGFiZWwnXSA9ICfQqNCw0LHQu9C+0L0g0LTQu9GPINC60L3QvtC/0LrQuCDRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPJzsKJGxhbmdbJ2ZlRWRpdE9uRGJsQ2xpY2tfbGFiZWwnXSA9ICfQl9Cw0LPRgNGD0LfQutCwINGA0LXQtNCw0LrRgtC+0YDQsCDQtNCy0L7QudC90YvQvCDRidC10LvRh9C60L7QvD8nOwokbGFuZ1snZmVFZGl0T25EYmxDbGlja19oZWxwJ10gPSAn0JfQsNCz0YDRg9C20LDRgtGMINGA0LXQtNCw0LrRgtC+0YAg0LTQstC+0LnQvdGL0Lwg0L3QsNC20LDRgtC40LXQvCDQvNGL0YjQuCDQvdCwINC60L7QvdGC0LXQvdGCLic7CiRsYW5nWydmZUlubGluZUVkaXRCdXR0b24nXSA9ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCc7CiRsYW5nWydmZVVwZGF0ZUFsZXJ0J10gPSAn0KHRgtGA0LDQvdC40YbQsCDRgdC+0YXRgNCw0L3QtdC90LAuLi4nOwokbGFuZ1snZmVGRVVhbGxvd19sYWJlbCddID0gJ9Cg0LDQt9GA0LXRiNC40YLRjCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjQtSBGRVUgKEZyb250RW5kVXNlcnMpJzsKJGxhbmdbJ2ZlRkVVYWxsb3dfaGVscCddID0gJ9Cg0LDQt9GA0LXRiNC40YLRjCDRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNC1INC00LvRjyDQv9C+0LvRjNC30L7QstCw0YLQtdC70LXQuSDRgdCw0LnRgtCwJzsKJGxhbmdbJ2ZlRkVVZ3JvdXBzX2xhYmVsJ10gPSAn0J3QsNGB0YLRgNC+0LjRgtGMINCz0YDRg9C/0L/RiyBGRVU/JzsKJGxhbmdbJ2ZlRkVVZ3JvdXBzX2hlbHAnXSA9ICfQndCw0YHRgtGA0L7QuNGC0Ywg0L7Qs9GA0LDQvdC40YfQtdC90LjRjyDQs9GA0YPQv9C/INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQtdC5Lic7CiRsYW5nWydmZUZFVWRpc2FibGVkX2xhYmVsJ10gPSAn0J7RgtC60LvRjtGH0LjRgtGMINC/0L7QtNC00LXRgNC20LrRgyBGRVUgKEZyb250RW5kVXNlcnMpLic7CiRsYW5nWydmZUZFVWRpc2FibGVkX2hlbHAnXSA9ICfQlNC70Y8g0YLQvtCz0L4sINGH0YLQvtCx0Ysg0YDQsNC30YDQtdGI0LjRgtGMINGA0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40LUg0LrQvtC90YLQtdC90YLQsCDQv9C+0LvRjNC30L7QstCw0YLQtdC70Y/QvNC4INGB0LDQudGC0LAsINC90LXQvtCx0YXQvtC00LjQvNCwINGD0YHRgtCw0L3QvtCy0LrQsCDQvNC+0LTRg9C70Y8gRkVVIChGcm9udEVuZFVzZXJzKS4nOwokbGFuZ1snZmVBZG1pbkFsbG93X2xhYmVsJ10gPSAn0J/RgNCw0LLQsCDRgNC10LTQsNC60YLQvtGA0L7Qsj8nOwokbGFuZ1snZmVBZG1pbkFsbG93X2hlbHAnXSA9ICfQoNCw0LfRgNC10YjQuNGC0Ywg0YDQtdC00LDQutGC0L7RgNCw0LwgKNGBINC/0YDQsNCy0LDQvNC4ICJVc2UgdG91Y2hJbmxpbmVFZGl0Iikg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LUg0LzQvtC00YPQu9GPIElubGluZUVkaXQuJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAn0KPRgdGC0LDQvdC+0LLQutCwINC/0YDQvtGI0LvQsCDRg9GB0L/QtdGI0L3Qvi4uLic7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAn0JzQvtC00YPQu9GMINCx0YvQuyDRg9C00LDQu9C10L0uLi4nOwokbGFuZ1sncG9zdHVwZ3JhZGUnXSA9ICfQo9GB0L/QtdGI0L3QvtC1INC+0LHQvdC+0LLQu9C10L3QuNC1INC00L4g0LLQtdGA0YHQuNC4ICVzLi4uJzsKJGxhbmdbJ3Bvc3Rjb250ZW50dXBkYXRlJ10gPSAn0KHRgtGA0LDQvdC40YbQsCDRgSBjb250ZW50X2lkOiVzINC+0LHQvdC+0LLQu9C10L3QsC4nOwokbGFuZ1sncHJldW5pbnN0YWxsJ10gPSAn0JLRiyDRg9Cy0LXRgNC10L3Riywg0YfRgtC+INGF0L7RgtC40YLQtSDRg9C00LDQu9C40YLRjCDQvNC+0LTRg9C70YwuINCS0YHQtSDQvdCw0YHRgtGA0L7QudC60Lgg0LHRg9C00YPRgiDRgdCx0YDQvtGI0LXQvdGLLCDQsCDRiNCw0LHQu9C+0L3RiyDRg9C00LDQu9C10L3Riy4nOwokbGFuZ1snbmljZWRpdEZ1bGxQYW5lbF9sYWJlbCddID0gJ9Cg0LDRgdGI0LjRgNC10L3QvdCw0Y8g0L/QsNC90LXQu9GMPyc7CiRsYW5nWyduaWNlZGl0RnVsbFBhbmVsX2hlbHAnXSA9ICfQmNGB0L/QvtC70YzQt9C+0LLQsNGC0Ywg0YDQsNGB0YjQuNGA0LXQvdC90YPRjiDQv9Cw0L3QtdC70Ywg0YDQtdC00LDQutGC0L7RgNCwLic7CiRsYW5nWyduaWNlZGl0SlF1ZXJ5TG9hZF9sYWJlbCddID0gJ9Cf0L7QtNCz0YDRg9C20LDRgtGMINCx0LjQsdC70LjQvtGC0LXQutGDIEpRdWVyeS4nOwokbGFuZ1snbmljZWRpdEpRdWVyeUxvYWRfaGVscCddID0gJ9Cf0L7Qt9Cy0L7Qu9C40YLRjCDQvNC+0LTRg9C70Y4g0LfQsNCz0YDRg9C20LDRgtGMINCx0LjQsdC70LjQvtGC0LXQutGDIEpRZXVyeSDQsiA8aGVhZD4uJzsKJGxhbmdbJ2VscnRlVG9vbGJhcl9sYWJlbCddID0gJ9Cf0LDQvdC10LvRjCDRgNC10LTQsNC60YLQvtGA0LA/JzsKJGxhbmdbJ2VscnRlVG9vbGJhcl9oZWxwJ10gPSAn0JLRi9Cx0LXRgNC40YLQtSDQv9Cw0L3QtdC70Ywg0LTQu9GPINGA0LXQtNCw0LrRgtC+0YDQsC4nOwokbGFuZ1snZWxydGVKUXVlcnlMb2FkX2xhYmVsJ10gPSAn0JfQsNCz0YDRg9C20LDRgtGMINCx0LjQsdC70LjQvtGC0LXQutGDIEpRdWVyeS4nOwokbGFuZ1snZWxydGVKUXVlcnlMb2FkX2hlbHAnXSA9ICfQn9C+0LfQstC+0LvQuNGC0Ywg0LzQvtC00YPQu9GOINC30LDQs9GA0YPQttCw0YLRjCDQsdC40LHQu9C40L7RgtC10LrRgyBKUWV1cnkg0LIgPGhlYWQ+Lic7CiRsYW5nWydxY2EnXSA9ICdQMC0xOTM4Mzg4ODgzLTEyNzc4NTU4MTMxNDQnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My40Mjk1OTM2NTguMTI3Nzg1NTgxMy4xMjkzOTc2MDY5LjEyOTM5ODQ2MjkuMTU1JzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTI5MzkzNzkwNS4xNTIuNzMudXRtY3NyPXdpa2kuY21zbWFkZXNpbXBsZS5vcmd8dXRtY2NuPShyZWZlcnJhbCl8dXRtY21kPXJlZmVycmFsfHV0bWNjdD0vaW5kZXgucGhwL1VzZXJfSGFuZGJvb2svQWRtaW5fUGFuZWwvVGFncy9jb250ZW50X2R1bXAnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.touchInlineEditPlugin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogY2xhc3MudG91Y2hJbmxpbmVFZGl0UGx1Z2luLnBocCAxNTQgMjAxMS0wMS0xNCAxMzowNjowNFogdG91Y2hkZXNpZ24gJAogKgogKiB0b3VjaElubGluZUVkaXQgTW9kdWxlCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMCB0b3VjaERlc2lnbiwgPHd3dy50b3VjaGRlc2lnbi5kZT4KICoKICogQGNhdGVnb3J5IE1vZHVsZQogKiBAYXV0aG9yIENocmlzdG9waCBHcnViZXIgPHd3dy50b3VjaGRlc2lnbi5kZT4KICogQHZlcnNpb24gMS44LjAKICogQGNvcHlyaWdodCAwNC4wOC4yMDEwIHRvdWNoRGVzaWduCiAqIEBsaW5rIGh0dHA6Ly93d3cudG91Y2hkZXNpZ24uZGUvCiAqIEBsaW5rIGh0dHA6Ly93d3cuaG9tZXBhZ2UtY29tbXVuaXR5LmRlL2luZGV4LnBocD90b3BpYz0xNjgwLjAKICogQGxpbmsgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy90b3VjaElubGluZUVkaXQKICogQGxpY2Vuc2UgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwgMi4wKQogKgogKgogKiAtLQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogKiBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiAqCiAqLwoKY2xhc3MgdG91Y2hJbmxpbmVFZGl0UGx1Z2luIHsKCiAgLyoqCiAgICogTW9kdWxlIHBhcmVudCBpbnN0YW5jZS4KICAgKiBAdmFyIG9iamVjdAogICAqIEBhY2Nlc3MgcHVibGljCiAgICovCiAgdmFyICRtb2R1bGU7CgogIC8qKgogICAqIFBsdWdpbiBuYW1lLgogICAqIEB2YXIgc3RyaW5nCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8KICB2YXIgJG5hbWU7CgogIC8qKgogICAqIFBsdWdpbiBkaXNwbGF5IG5hbWUuCiAgICogQHZhciBzdHJpbmcKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLwogIHZhciAkZGlzcGxheU5hbWU7CgogIC8qKgogICAqIE5hbWUgb2YgdGhlIHBsdWdpbiBhdXRob3IuCiAgICogQHZhciBzdHJpbmcKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLwogIHZhciAkYXV0aG9yOwoKICAvKioKICAgKiBQbHVnaW4gZGVzY3JpcHRpb24uCiAgICogQHZhciBzdHJpbmcKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLwogIHZhciAkZGVzY3JpcHRpb247CiAgCiAgLyoqCiAgICogUGx1Z2luIHZlcnNpb24uCiAgICogQHZhciBzdHJpbmcKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLwogIHZhciAkdmVyc2lvbjsKICAKICAvKioKICAgKiBQbHVnaW4gZGlyLgogICAqIEB2YXIgc3RyaW5nCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gIAogIHZhciAkcGF0aDsKCiAgLyoqCiAgICogSXMgdGhpcyBlZGl0b3IgcGx1Z2luIHRoZSBjdXJyZW50IGluc3RhbGxlZCBwbHVnaW4/CiAgICogQHZhciBib29sZWFuCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gIAogIHZhciAkaW5zdGFsbGVkID0gZmFsc2U7CgogIC8qKgogICAqIFBsdWdpbiBzcGVjaWZpYyB0ZW1wbGF0ZXMuCiAgICogQHZhciBhcnJheQogICAqIEBhY2Nlc3MgcHVibGljCiAgICovICAKICBwdWJsaWMgJHRlbXBsYXRlcyA9IGFycmF5KAogICAgJ2hlYWRlcicgPT4gCic8IS0tIHskdGllLT5nZXROYW1lKCl9IDo6IHskdGllLT5wbHVnaW4tPmRpc3BsYXlOYW1lfSBtb2R1bGUgLS0+CjxzY3JpcHQgc3JjPSJ7JHRpZS0+cGx1Z2luLT5wYXRofS9qcy97JHRpZS0+cGx1Z2luLT5uYW1lfS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4Ke2lmICR0aWUtPnBsdWdpbi0+Z2V0KFwnanF1ZXJ5X2xvYWRcJyl9CjxzY3JpcHQgc3JjPSJ7JHRpZS0+cGx1Z2luLT5wYXRofS9qcy9qcXVlcnkuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CnsvaWZ9CjxzY3JpcHQgc3JjPSJ7JHRpZS0+dG91Y2gtPnBhdGh9L2pzL3RvdWNoSW5saW5lRWRpdC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InskdGllLT5wbHVnaW4tPnBhdGh9L2pzL3RvdWNoSW5saW5lRWRpdEluc3RhbmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgogIHskdGllRXh0cmFTY3JpcHR9CiAgdmFyIHRvdWNoSW5saW5lRWRpdCA9IG5ldyB0b3VjaElubGluZUVkaXQoCiAgICB7JHRpZS0+Z2V0Q29udGVudElkKCl9LAogICAgInskdGllLT50b3VjaC0+Z2V0UmVxdWVzdFVyaSgpfSIsCiAgICAieyR0aWUtPnRvdWNoLT5nZXQoXCdmZVVwZGF0ZUFsZXJ0TWVzc2FnZVwnKX0iLAogICAgeyR0aWUtPnRvdWNoLT5nZXQoXCdmZUVkaXRPbkRibENsaWNrXCcpfQogICk7Cntmb3JlYWNoIGZyb209JHRpZS0+cGx1Z2luLT5nZXRTZXR0aW5ncygpIGtleT1uYW1lIGl0ZW09dmFsdWV9CiAgdG91Y2hJbmxpbmVFZGl0LnNldFBhcmFtKCJ7JG5hbWV9IiwieyR2YWx1ZX0iKTsKey9mb3JlYWNofQo8L3NjcmlwdD4KPCEtLSB7JHRpZS0+Z2V0TmFtZSgpfSA6OiB7JHRpZS0+cGx1Z2luLT5kaXNwbGF5TmFtZX0gbW9kdWxlIC0tPicpOwogIAogIC8qKgogICAqIFBsdWdpbiBzcGVjaWZpYyBzZXR0aW5ncy4KICAgKiBAdmFyIGFycmF5CiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gIAogIHZhciAkc2V0dGluZ3MgPSBhcnJheSgpOyAgCgogIC8qKgogICAqIFN1cHBvcnRzIG11bHRpcGxlIGNvbnRlbnQgYmxvY2tzLgogICAqIEB2YXIgYm9vbGVhbgogICAqIEBhY2Nlc3MgcHVibGljCiAgICovICAKICB2YXIgJHN1cHBvcnRzTXVsdGlwbGUgPSBmYWxzZTsKCiAgLyoqCiAgICogQ29uc3RydWN0IGEgbmV3IGVkaXRvciBwbHVnaW4uCiAgICovCiAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJiRtb2R1bGUpCiAgewogICAgJHRoaXMtPm1vZHVsZSA9ICRtb2R1bGU7CiAgICAkdGhpcy0+cGF0aCA9ICdtb2R1bGVzLycgLiAkdGhpcy0+bW9kdWxlLT5nZXROYW1lKCkgLiAnLycgCiAgICAgIC4gVElFX1BMVUdJTl9ESVIgLiAkdGhpcy0+bmFtZTsKICAgICR0aGlzLT5pbnN0YWxsZWQgPSAkdGhpcy0+bW9kdWxlLT50b3VjaC0+Z2V0KCdmZVBsdWdpbicpID09ICR0aGlzLT5uYW1lID8gdHJ1ZSA6IGZhbHNlOwogIH0KCiAgLyoqCiAgICogUGx1Z2luIGluc3RhbGwgbWV0aG9kLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKCkKICB7CiAgICBpZighJHRoaXMtPmluc3RhbGxlZCl7CiAgICAgICR0aGlzLT51cGRhdGUoJHRoaXMtPnNldHRpbmdzKTsKICAgICAgZm9yZWFjaCgkdGhpcy0+dGVtcGxhdGVzIGFzICRuYW1lID0+ICRjb250ZW50KXsKICAgICAgICAkdGhpcy0+bW9kdWxlLT5zZXRUZW1wbGF0ZSgndG91Y2hJbmxpbmVFZGl0LicuJHRoaXMtPm5hbWUuJy4nLiRuYW1lLCAkY29udGVudCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIAogIC8qKgogICAqIFBsdWdpbiB1bmluc3RhbGwgbWV0aG9kLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGwoKQogIHsKICAgIGZvcmVhY2goJHRoaXMtPnRlbXBsYXRlcyBhcyAkbmFtZSA9PiAkY29udGVudCl7CiAgICAgICR0aGlzLT5tb2R1bGUtPmRlbGV0ZVRlbXBsYXRlKCd0b3VjaElubGluZUVkaXQuJy4kdGhpcy0+bmFtZS4nLicuJG5hbWUpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIAogIC8qKgogICAqIFNldCBwbHVnaW4gY29uZmlnCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHNldCgkbmFtZSwkdmFsdWUpCiAgewogICAgcmV0dXJuICR0aGlzLT5tb2R1bGUtPnRvdWNoLT5zZXQoJHRoaXMtPm5hbWUuJy4nLiRuYW1lLCR2YWx1ZSk7CiAgfQogIAogIC8qKgogICAqIEdldCBwbHVnaW4gY29uZmlnCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldCgkbmFtZSwkZGVmYXVsdD1udWxsKQogIHsKICAgIHJldHVybiAkdGhpcy0+bW9kdWxlLT50b3VjaC0+Z2V0KCR0aGlzLT5uYW1lLicuJy4kbmFtZSwkZGVmYXVsdCk7CiAgfQogIAogIC8qKgogICAqIEZldGNoIHNtYXJ0eSB0ZW1wbGF0ZSByZWxhdGl2ZSB0byAkcGF0aC4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZmV0Y2goJHRlbXBsYXRlLCRkYXRhYmFzZT1mYWxzZSkKICB7CiAgICBpZigkZGF0YWJhc2UpewogICAgICByZXR1cm4gJHRoaXMtPm1vZHVsZS0+dG91Y2gtPmZldGNoKCR0aGlzLT5uYW1lLicuJy4kdGVtcGxhdGUsJGRhdGFiYXNlKTsKICAgIH0KICAgICRjb25maWcgPSAkdGhpcy0+bW9kdWxlLT50b3VjaC0+Y21zbXMoJ2NvbmZpZycpOwogICAgJHNtYXJ0eSA9ICR0aGlzLT5tb2R1bGUtPnRvdWNoLT5jbXNtcygnc21hcnR5Jyk7CiAgICAKICAgIHJldHVybiAkc21hcnR5LT5mZXRjaCgkY29uZmlnWydyb290X3BhdGgnXSAuICcvJwogICAgICAuICR0aGlzLT5wYXRoIC4gJy90ZW1wbGF0ZXMvJyAuICR0ZW1wbGF0ZSk7CiAgfQoKICAvKioKICAgKiBHZXQgYWxsIHNldHRpbmdzIGZvciB0aGlzIHBsdWdpbiBhcyBhcnJheS4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKQogIHsKICAgICRzZXR0aW5ncz1hcnJheSgpOwogICAgZm9yZWFjaCgkdGhpcy0+c2V0dGluZ3MgYXMgJG5hbWUgPT4gJHZhbHVlKXsKICAgICAgJHNldHRpbmdzWyRuYW1lXSA9ICR0aGlzLT5nZXQoJG5hbWUsJHRoaXMtPnNldHRpbmdzWyRuYW1lXSk7CiAgICB9CiAgICAKICAgIHJldHVybiAkc2V0dGluZ3M7CiAgfQogIAogIC8qKgogICAqIEdldCBhZG1pbiBjb25maWcgdGFiIGNvZGUsIG92ZXJyaWRlIGJ5IHBsdWdpbi4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWRtaW5Db25maWcoJGlkLCRyZXR1cm5pZCl7fQogIAogIC8qKgogICAqIEdldCBodG1sIGhlYWRlciBpbmZvcyBmb3IgdGhpcyBwbHVnaW4sIG92ZXJyaWRlIGJ5IHBsdWdpbi4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0SGVhZGVyKCl7fQoKICAvKioKICAgKiBTZXQgb3IgdXBkYXRlIGFkbWluIGNvbmZpZyBmb3IgdGhpcyBwbHVnaW4uIAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoJHBhcmFtcykKICB7CiAgICBmb3JlYWNoKCRwYXJhbXMgYXMgJG5hbWUgPT4gJHZhbHVlKXsKICAgICAgaWYoaXNzZXQoJHRoaXMtPnNldHRpbmdzWyRuYW1lXSkpewogICAgICAgICR0aGlzLT5zZXQoJG5hbWUsJHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCn0KCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.touchModule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogY2xhc3MudG91Y2hNb2R1bGUucGhwIDEzOSAyMDExLTAxLTA4IDIwOjE2OjIzWiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBNb2R1bGUKICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjguMAogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqCiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCiAgCmNsYXNzIHRvdWNoTW9kdWxlIHsKCiAgLyoqCiAgICogQ3VycmVudCBDTVNtcyBtb2R1bGUgaW5zdGFuY2UuCiAgICogQHZhciBvYmplY3QKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLwogIHZhciAkbW9kdWxlOwoKICAvKioKICAgKiBNb2R1bGUgbmFtZS4KICAgKiBAdmFyIHN0cmluZwogICAqIEBhY2Nlc3MgcHVibGljCiAgICovCiAgdmFyICRuYW1lOwogIAogIC8qKgogICAqIE1vZHVsZSBwYXRoLgogICAqIEB2YXIgc3RyaW5nCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8KICB2YXIgJHBhdGg7CiAgCiAgLyoqCiAgICogQ29uc3RydWN0b3IuCiAgICovCiAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJiRtb2R1bGUpCiAgewogICAgJHRoaXMtPm1vZHVsZSA9ICRtb2R1bGU7CiAgICAkdGhpcy0+bmFtZSA9ICRtb2R1bGUtPmdldE5hbWUoKTsKICAgICR0aGlzLT5wYXRoID0gJ21vZHVsZXMvJyAuICRtb2R1bGUtPmdldE5hbWUoKTsKICB9CiAgCiAgLyoqCiAgICogU2V0IHBsdWdpbiBjb25maWcuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHNldCgkbmFtZSwkdmFsdWUpCiAgewogICAgcmV0dXJuICR0aGlzLT5tb2R1bGUtPnNldFByZWZlcmVuY2UoJHRoaXMtPm5hbWUuJy4nLiRuYW1lLAogICAgICBpc19hcnJheSgkdmFsdWUpID8gaW1wbG9kZSgnLCcsJHZhbHVlKSA6ICR2YWx1ZSk7CiAgfQogIAogIC8qKgogICAqIEdldCBtb2R1bGUgY29uZmlnLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXQoJG5hbWUsJGRlZmF1bHQ9bnVsbCkKICB7CiAgICByZXR1cm4gJHRoaXMtPm1vZHVsZS0+Z2V0UHJlZmVyZW5jZSgkdGhpcy0+bmFtZS4nLicuJG5hbWUsJGRlZmF1bHQpOwogIH0KICAKICAvKioKICAgKiBGZXRjaCBzbWFydHkgdGVtcGxhdGUgcmVsYXRpdmUgdG8gbW9kdWxlLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBmZXRjaCgkdGVtcGxhdGUsJGRhdGFiYXNlPWZhbHNlKQogIHsKICAgICRjb25maWcgPSAkdGhpcy0+Y21zbXMoJ2NvbmZpZycpOwogICAgJHNtYXJ0eSA9ICR0aGlzLT5jbXNtcygnc21hcnR5Jyk7CiAgICAKICAgIGlmKCRkYXRhYmFzZSl7CiAgICAgIHJldHVybiAkdGhpcy0+bW9kdWxlLT5wcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJHRoaXMtPm5hbWUuJy4nLiR0ZW1wbGF0ZSk7CiAgICB9CiAgICAKICAgIHJldHVybiAkc21hcnR5LT5mZXRjaCgkY29uZmlnWydyb290X3BhdGgnXSAuICcvJwogICAgICAuICR0aGlzLT5wYXRoIC4gJy90ZW1wbGF0ZXMvJyAuICR0ZW1wbGF0ZSk7CiAgfQoKICAvKioKICAgKiBTZXQgb3IgdXBkYXRlIGNvbmZpZyBmb3IgdGhpcyBtb2R1bGUuIAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoJHBhcmFtcykKICB7CiAgICBmb3JlYWNoKCRwYXJhbXMgYXMgJG5hbWUgPT4gJHZhbHVlKXsKICAgICAgaWYoaXNzZXQoJHRoaXMtPnNldHRpbmdzWyRuYW1lXSkpewogICAgICAgICR0aGlzLT5zZXQoJG5hbWUsJHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KICAKICAvKioKICAgKiBDaGVjayBmb3IgQUpBWCByZXF1ZXN0LiAKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gaXNBSkFYUmVxdWVzdCgpCiAgewogICAgcmV0dXJuIGlzc2V0KCRfU0VSVkVSWydIVFRQX1hfUkVRVUVTVEVEX1dJVEgnXSkgCiAgICAgICYmIHN0cnRvbG93ZXIoJF9TRVJWRVJbJ0hUVFBfWF9SRVFVRVNURURfV0lUSCddKSAKICAgICAgPT0gJ3htbGh0dHByZXF1ZXN0JyA/IHRydWUgOiBmYWxzZTsKICB9CgogIC8qKgogICAqIEdldCBtYWdpYyBjbXNtcyBvYmplY3RzLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBjbXNtcygkY2FzZT1udWxsKQogIHsgIAogICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdjbXNtcycpKXsKICAgICAgJGNtc21zID0gY21zbXMoKTsKICAgIH1lbHNlewogICAgICBnbG9iYWwgJGdDbXM7CiAgICAgICRjbXNtcyA9JiAkZ0NtczsKICAgIH0KICAgIAogICAgc3dpdGNoKCRjYXNlKXsKICAgICAgY2FzZSAnc21hcnR5JzoKICAgICAgICBpZihtZXRob2RfZXhpc3RzKCRjbXNtcywnZ2V0U21hcnR5JykpewogICAgICAgICAgcmV0dXJuICRjbXNtcy0+Z2V0U21hcnR5KCk7CiAgICAgICAgfQogICAgICAgIGdsb2JhbCAkZ0NtczsKICAgICAgICByZXR1cm4gJGdDbXMtPnNtYXJ0eTsKICAgICAgY2FzZSAnY29uZmlnJzoKICAgICAgICBpZihtZXRob2RfZXhpc3RzKCRjbXNtcywnZ2V0Q29uZmlnJykpewogICAgICAgICAgcmV0dXJuICRjbXNtcy0+Z2V0Q29uZmlnKCk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICBnbG9iYWwgJGdDbXM7CiAgICAgICAgICByZXR1cm4gJGdDbXMtPmNvbmZpZzsKICAgICAgICB9CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuICRjbXNtczsKICAgIH0KICB9CiAgCiAgLyoqCiAgICogV3JhcHBlciBmb3IgY21zbXMgaW50ZXJuYWwgZ2V0IG1vZHVsZSBhcyBpbnN0YW5jZS4KICAgKi8KICBzdGF0aWMgcHVibGljIGZ1bmN0aW9uIGdldENNU01vZHVsZUluc3RhbmNlKCRuYW1lKQogIHsKICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnY21zbXMnKSAmJiBtZXRob2RfZXhpc3RzKGNtc21zKCksJ0dldE1vZHVsZUluc3RhbmNlJykpewogICAgICByZXR1cm4gY21zbXMoKS0+R2V0TW9kdWxlSW5zdGFuY2UoJG5hbWUpOwogICAgfWVsc2V7CiAgICAgIGdsb2JhbCAkZ0NtczsKICAgICAgcmV0dXJuIGlzc2V0KCRnQ21zLT5tb2R1bGVzWyRuYW1lXSkgPyAkZ0Ntcy0+bW9kdWxlc1skbmFtZV1bJ29iamVjdCddIDogZmFsc2U7CiAgICB9CiAgfQogIAogIC8qKgogICAqIEdldCBkZWZhdWx0IHRlbXBsYXRlIGJ5IG5hbWUgZm9yIGN1cnJlbnQgbW9kdWxlLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRUZW1wbGF0ZSgkdGVtcGxhdGUpCiAgewogICAgaWYoaXNzZXQoJHRoaXMtPm1vZHVsZS0+dGVtcGxhdGVzWyR0ZW1wbGF0ZV0pKXsKICAgICAgcmV0dXJuICR0aGlzLT5tb2R1bGUtPnRlbXBsYXRlc1skdGVtcGxhdGVdOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogR2V0IGN1cnJlbnQgcmVxdWVzdCB1cmkgZm9yIHNtYXJ0eSBjYWxscy4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVxdWVzdFVyaSgpCiAgewogICAgcmV0dXJuICRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdOwogIH0KICAKfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/ICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQ0KICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQ0KDQogQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwNCiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBDQogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzDQogb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQ0KDQogIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXINCmZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljDQpMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlDQpzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcw0KR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUNCkZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8NCnVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkNCnRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvDQp5b3VyIHByb2dyYW1zLCB0b28uDQoNCiAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdA0KcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQ0KaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcg0KdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0DQppZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdA0KaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLg0KDQogIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQNCmFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4NClRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91DQpkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuDQoNCiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcg0KZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0DQp5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQ0Kc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcg0KcmlnaHRzLg0KDQogIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQNCigyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksDQpkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLg0KDQogIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluDQp0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQ0Kc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlDQp3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbw0KdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwNCmF1dGhvcnMnIHJlcHV0YXRpb25zLg0KDQogIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlDQpwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlDQpwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlDQpwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkNCnBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuDQoNCiAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQNCm1vZGlmaWNhdGlvbiBmb2xsb3cuDQoNCiAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UNCiAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTg0KDQogIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMNCmEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkDQp1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csDQpyZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSINCm1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6DQp0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LA0KZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXINCmxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4NCnRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLg0KDQpBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdA0KY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZg0KcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQ0KaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUNClByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuDQpXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4NCg0KICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MNCnNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQ0KY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQ0KY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQ0Kbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5Ow0KYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQ0KYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4NCg0KWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kDQp5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLg0KDQogIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24NCm9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQNCmRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQ0KYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoNCg0KICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuDQoNCiAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4NCiAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkNCiAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZA0KICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4NCg0KICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkNCiAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoDQogICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbg0KICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQ0KICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQ0KICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXINCiAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcw0KICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0DQogICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbg0KICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQ0KDQpUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmDQppZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLA0KYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluDQp0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlDQpzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UNCmRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZA0Kb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mDQp0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQ0KZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0Lg0KDQpUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QNCnlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bw0KZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yDQpjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLg0KDQpJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtDQp3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YNCmEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyDQp0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLg0KDQogIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LA0KdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mDQpTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6DQoNCiAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlDQogICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zDQogICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsDQoNCiAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQ0KICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyDQogICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQ0KICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUNCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQ0KICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwNCg0KICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyDQogICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMNCiAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQ0KICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gNCiAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikNCg0KVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcg0KbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UNCmNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55DQphc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8NCmNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGENCnNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQ0KYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkNCmZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlDQpvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudA0KaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLg0KDQpJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nDQphY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50DQphY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMNCmRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdA0KY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4NCg0KICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0NCmV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQNCm90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcw0Kdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXINCnRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoDQpwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuDQoNCiAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90DQpzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcg0KZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlDQpwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5DQptb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUNClByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kDQphbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nDQp0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4NCg0KICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlDQpQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQ0Kb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bw0KdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXINCnJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4NCllvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvDQp0aGlzIExpY2Vuc2UuDQoNCiAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudA0KaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwNCmNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3INCm90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QNCmV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90DQpkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzDQpMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91DQptYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50DQpsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5DQphbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4NCnRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8NCnJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uDQoNCklmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcg0KYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bw0KYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXINCmNpcmN1bXN0YW5jZXMuDQoNCkl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkNCnBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55DQpzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlDQppbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMNCmltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQ0KZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZA0KdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQNCnN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcNCnRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdA0KaW1wb3NlIHRoYXQgY2hvaWNlLg0KDQpUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8NCmJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLg0KDQogIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluDQpjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUNCm9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UNCm1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZw0KdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZw0KY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzDQp0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4NCg0KICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucw0Kb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsDQpiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8NCmFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLg0KDQpFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtDQpzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQ0KbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNClNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YNCnRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUNCkZvdW5kYXRpb24uDQoNCiAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQ0KcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcg0KdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlDQpTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMNCm1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzDQpvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kDQpvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PIFdBUlJBTlRZDQoNCiAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZDQpGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4NCk9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMNClBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEDQpPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUw0KVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQ0KUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsDQpSRVBBSVIgT1IgQ09SUkVDVElPTi4NCg0KICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HDQpXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SDQpSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLA0KSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HDQpPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEDQpUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkNCllPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSDQpQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUNClBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4NCg0KICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQoNCiAgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcw0KDQogIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QNCnBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQNCmZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLg0KDQogIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0DQp0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5DQpjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdA0KdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuDQoNCiAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPg0KICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+DQoNCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KDQogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCg0KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nDQogICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwNCiAgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLg0KDQpBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4NCg0KSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcw0Kd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToNCg0KICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcg0KICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4NCiAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0DQogICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLg0KDQpUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUNCnBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkNCmJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQ0KbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4NCg0KWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXINCnNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmDQpuZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6DQoNCiAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQ0KICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4NCg0KICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkNCiAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UNCg0KVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvDQpwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQ0KY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlDQpsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbA0KUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuDQo=]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogbWV0aG9kLmluc3RhbGwucGhwIDE1OCAyMDExLTAxLTE2IDEyOjAyOjIyWiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBNb2R1bGUKICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjguMAogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqCiAqIAogKiAtLQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogKiBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiAqCiAqLwoKJHNtYXJ0eS0+Y2xlYXJfY29tcGlsZWRfdHBsKCk7CiRzbWFydHktPmNsZWFyX2FsbF9jYWNoZSgpOwoKJHRoaXMtPkNyZWF0ZVBlcm1pc3Npb24oJ1VzZSB0b3VjaElubGluZUVkaXQnLCAnVXNlIHRvdWNoSW5saW5lRWRpdCcpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlRWRpdEJ1dHRvbicsIDEpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlRWRpdEJ1dHRvblRleHQnLCAkdGhpcy0+TGFuZygnZmVFZGl0QnV0dG9uVGV4dF9kZWZhdWx0JykpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlRWRpdE9uRGJsQ2xpY2snLCAxKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZVVwZGF0ZUFsZXJ0TWVzc2FnZScsICR0aGlzLT5MYW5nKCdmZVVwZGF0ZUFsZXJ0TWVzc2FnZV9kZWZhdWx0JykpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlRkVVYWxsb3cnLCAwKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZUZFVWdyb3VwcycsICcnKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZUFkbWluQWxsb3cnLCAxKTsKaWYobWV0aG9kX2V4aXN0cygkdGhpcy0+Z2V0UGx1Z2luKCksJ2luc3RhbGwnKSl7CiAgJHRoaXMtPmdldFBsdWdpbigpLT5pbnN0YWxsKFRJRV9QTFVHSU5fREVGQVVMVCk7Cn0KJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZVBsdWdpbicsIFRJRV9QTFVHSU5fREVGQVVMVCk7CiR0aGlzLT5TZXRUZW1wbGF0ZSgndG91Y2hJbmxpbmVFZGl0LmJ1dHRvbicsICR0aGlzLT50b3VjaC0+Z2V0VGVtcGxhdGUoJ2J1dHRvbicpKTsKJHRoaXMtPkFkZEV2ZW50SGFuZGxlcignQ29yZScsICdDb250ZW50UG9zdFJlbmRlcicsIGZhbHNlKTsKCi8vIExvZyBpbnN0YWxsIGluZm8KJHRoaXMtPkF1ZGl0KDAsICR0aGlzLT5HZXRGcmllbmRseU5hbWUoKSwgJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJykpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogbWV0aG9kLnVuaW5zdGFsbC5waHAgMTU4IDIwMTEtMDEtMTYgMTI6MDI6MjJaIHRvdWNoZGVzaWduICQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuOC4wCiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICoKICogCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgokdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgpOwokdGhpcy0+UmVtb3ZlUGVybWlzc2lvbignVXNlIHRvdWNoSW5saW5lRWRpdCcpOwokdGhpcy0+RGVsZXRlVGVtcGxhdGUoKTsKCiR0aGlzLT5zbWFydHktPmNsZWFyX2NvbXBpbGVkX3RwbCgpOwokdGhpcy0+c21hcnR5LT5jbGVhcl9hbGxfY2FjaGUoKTsKJHRoaXMtPlJlbW92ZUV2ZW50SGFuZGxlcignQ29yZScsICdDb250ZW50UG9zdFJlbmRlcicpOwoKLy8gTG9nIHVuaW5zdGFsbCBpbmZvCiR0aGlzLT5BdWRpdCgwLCAkdGhpcy0+R2V0RnJpZW5kbHlOYW1lKCksICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJykpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZCQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuOC4wCiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICoKICogCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgokdGhpcy0+c21hcnR5LT5jbGVhcl9jb21waWxlZF90cGwoKTsKJHRoaXMtPnNtYXJ0eS0+Y2xlYXJfYWxsX2NhY2hlKCk7CgppZih2ZXJzaW9uX2NvbXBhcmUoJG9sZHZlcnNpb24sICcxLjYnLCAnPCcpKXsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlQ29udGV4dE1lbnUnLCAnZmFsc2UnKTsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlRWRpdE9uRGJsQ2xpY2snLCAndHJ1ZScpOwogICR0aGlzLT5BZGRFdmVudEhhbmRsZXIoJ0NvcmUnLCAnQ29udGVudFBvc3RSZW5kZXInLCBmYWxzZSk7CiAgJHRoaXMtPkFkZEV2ZW50SGFuZGxlcignQ29yZScsICdTbWFydHlQcmVDb21waWxlJywgZmFsc2UpOwogICR0aGlzLT5TZXRUZW1wbGF0ZSgndG91Y2hJbmxpbmVFZGl0Q29udGV4dE1lbnUnLCAkdGhpcy0+dG91Y2gtPmdldFRlbXBsYXRlKCd0b3VjaElubGluZUVkaXRDb250ZXh0TWVudScpKTsKfQppZih2ZXJzaW9uX2NvbXBhcmUoJG9sZHZlcnNpb24sICcxLjcnLCAnPCcpKXsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlUGx1Z2luJywgJ25pY2VkaXQnKTsKICBpZihtZXRob2RfZXhpc3RzKCR0aGlzLT5nZXRQbHVnaW4oKSwnaW5zdGFsbCcpKXsKICAgICR0aGlzLT5nZXRQbHVnaW4oKS0+aW5zdGFsbCgpOwogIH0KICAkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ3RvdWNoSW5saW5lRWRpdENvbnRleHRNZW51Jyk7CiAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZUNvbnRleHRNZW51Jyk7CiAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZUZ1bGxQYW5lbCcpOwogICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCd0b3VjaElubGluZUVkaXQuZmVKUXVlcnlMb2FkJyk7Cn0KaWYodmVyc2lvbl9jb21wYXJlKCRvbGR2ZXJzaW9uLCAnMS43LjQnLCAnPCcpKXsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlRkVVYWxsb3cnLCAwKTsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlRkVVZ3JvdXBzJywgJycpOwogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCd0b3VjaElubGluZUVkaXQuZmVBZG1pbkFsbG93JywgMSk7CiAgCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZUVkaXRCdXR0b24nLCAKICAgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd0b3VjaElubGluZUVkaXQuZmVFZGl0QnV0dG9uJykgPT0gJ3RydWUnID8gMSA6IDApOwogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCd0b3VjaElubGluZUVkaXQuZmVFZGl0T25EYmxDbGljaycsCiAgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlRWRpdE9uRGJsQ2xpY2snKSA9PSAndHJ1ZScgPyAxIDogMCk7CiAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZVVwZGF0ZUFsZXJ0JywKICAgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd0b3VjaElubGluZUVkaXQuZmVVcGRhdGVBbGVydCcpID09ICd0cnVlJyA/IDEgOiAwKTsKICAKICBpZihtZXRob2RfZXhpc3RzKCR0aGlzLT5nZXRQbHVnaW4oKSwnaW5zdGFsbCcpKXsKICAgICR0aGlzLT5nZXRQbHVnaW4oKS0+aW5zdGFsbCgpOwogIH0KCiAgJHRoaXMtPlJlbW92ZUV2ZW50SGFuZGxlcignQ29yZScsICdDb250ZW50UG9zdFJlbmRlcicpOwogICR0aGlzLT5SZW1vdmVFdmVudEhhbmRsZXIoJ0NvcmUnLCAnU21hcnR5UHJlQ29tcGlsZScpOwp9CmlmKHZlcnNpb25fY29tcGFyZSgkb2xkdmVyc2lvbiwgJzEuOC4wJywgJzwnKSl7CiAgJHRoaXMtPkRlbGV0ZVRlbXBsYXRlKCd0b3VjaElubGluZUVkaXRCdXR0b24nKTsKICAkdGhpcy0+U2V0VGVtcGxhdGUoJ3RvdWNoSW5saW5lRWRpdC5idXR0b24nLCAkdGhpcy0+dG91Y2gtPmdldFRlbXBsYXRlKCdidXR0b24nKSk7CiAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZVVwZGF0ZUFsZXJ0Jyk7CiAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZUVkaXRCdXR0b25UZXh0JywgJHRoaXMtPkxhbmcoJ2ZlRWRpdEJ1dHRvblRleHRfZGVmYXVsdCcpKTsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlVXBkYXRlQWxlcnRNZXNzYWdlJywgJHRoaXMtPkxhbmcoJ2ZlVXBkYXRlQWxlcnRNZXNzYWdlX2RlZmF1bHQnKSk7CiAgJHRoaXMtPkFkZEV2ZW50SGFuZGxlcignQ29yZScsICdDb250ZW50UG9zdFJlbmRlcicsIGZhbHNlKTsKfQoKLy8gTG9nIHVwZ3JhZGUgaW5mbwokdGhpcy0+QXVkaXQoMCwgJHRoaXMtPkdldEZyaWVuZGx5TmFtZSgpLCAKICAkdGhpcy0+TGFuZygncG9zdHVwZ3JhZGUnLCAkdGhpcy0+R2V0VmVyc2lvbigpKSk7Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/plugins/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/Changelog</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[MjAxMC0wOS0xNSAgVHJvZXggTmV2ZWxpbiAgPHRyb2V4QGZ1cnkuc2NhbmNvZGUucnU+CgoJKiBlbFJURSAoMS4wLjEpOgoJCS0gW2ZlYXR1cmVdIFRBQiBub3cga2V5IGluc2VydHMgJ1x0JyBpbnN0ZWFkIHN3aXRjaCB0byBuZXh0IGVsZW1lbnQgaW4KCQkgIHNvdXJjZSB2aWV3CgkJLSBbZmVhdHVyZV0gY29tcGxldGVkIFJUTCBzdXBwb3J0CgkJLSBbZmVhdHVyZV0gcGFnZWJyZWFrIGJ1dHRvbiBhZGRlZAoJCS0gW2ZlYXR1cmVdIHNtaWxleXMgYnV0dG9uIGFkZGVkCgkJLSBbYnVnZml4XSB0ZXh0YXJlYSB1c2VzIElEIGluc3RlYWQgTkFNRSBvbiBwb3N0CgkJLSBbYnVnZml4XSBjbGVhbiBzZWxlY3RlZCBhcmVhIG9uIHBhc3RlCgkJLSBbYnVnZml4XSBmdWxsc2NyZWVuIG1vZGUgaW4gRmlyZWZveAoJCS0gW2J1Z2ZpeF0gR29vZ2xlIE1hcHMgaW5zZXJ0aW9uCgkJLSBbYnVnZml4XSBuZXcgVmltZW8gZW1iZWQgY29kZQoJCS0gW3RyYW5zbGF0aW9uXSBGcmVuY2gsIEZyYW5jb2lzIE1hemVyb2xsZSA8Zm1hejAwOEBnbWFpbC5jb20+CgkJLSBbdHJhbnNsYXRpb25dIEh1bmdhcmlhbiwgVmlrdG9yIFRhbWFzIDx0YW1hcy52aWt0b3JAdG90YWxzdHVkaW8uaHU+CgkJLSBbdHJhbnNsYXRpb25dIER1dGNoLCBLdXJ0IEFlcnRzIGh0dHA6Ly9pbGFic29sdXRpb25zLm5ldC8KCQktIFt0cmFuc2xhdGlvbl0gUG9saXNoLCBBbmRyemVqIEJvcm93aWN6IGh0dHA6Ly9ib3Jvd2ljei5pbmZvLwoJCS0gW3RyYW5zbGF0aW9uXSBUcmFkaXRpb25hbCBDaGluZXNlLCBUYWQgPHRhZDA2MTZAZ21haWwuY29tPgoJCS0gW3RyYW5zbGF0aW9uXSBBcmFiaWMsIHRhd2ZlayBkYWdoaXN0YW5pIDx0YXdmZWtvdkBnbWFpbC5jb20+CgkJLSBbdHJhbnNsYXRpb25dIFBlcnNpYW4gKEZhcnNpKSwgU2FsZWggc29vemFuY2hpIDxpbmZvQHNvb3phbmNoaS5pcj4KCQktIFt0cmFuc2xhdGlvbl0gSXRhbGlhbiwgVWdvIFB1bnpvbG8gPHNhZHJhY3plcm91bm9AZ21haWwuY29tPgoKCgoyMDEwLTA4LTI1ICBUcm9leCBOZXZlbGluICA8dHJvZXhAZnVyeS5zY2FuY29kZS5ydT4KCgkqIGVsUlRFICgxLjApOgoJCS0gW2ZlYXR1cmVdIHVwZGF0ZSBqUXVlcnkgdG8gMS40LjIgYW5kIFVJIHRvIDEuOC40CgkJLSBbZmVhdHVyZV0gbmV3IGZpbHRlciwgZml4ZXMgIzEzNCwgIzE0MCwgIzE1MgoJCS0gW2ZlYXR1cmVdIGFkZGVkIFJUTC9MVFIgYnV0dG9uICMxMTEKCQktIFtmZWF0dXJlXSBiZXR0ZXIgcGxhY2Vob2xkZXJzICh5b3V0dWJlLCBnb29nbGUgbWFwcywgZXRjLi4uKQoJCS0gW2ZlYXR1cmVdIHVzZXItZGVmaW5lZCByZXBsYWNlbWVudHMKCQktIFtmZWF0dXJlXSBiZXR0ZXIgaWNvbnMgZnJvbSBmYW1mYW1mYW0ub3JnCgkJLSBbYnVnZml4XSByZW1vdmUgbmVlZGxlc3MgZWwtc2VsZWN0IHBhcmFtIGJlZm9yZSBwb3N0ICMxNTUKCQktIFtidWdmaXhdIHRhYmxlIGNlbGwgcHJvcGVydGllcyAjMTU2CgkJLSBbYnVnZml4XSB0ZXh0YXJlYSBub3QgcG9zdGVkIHdpdGhvdXQgbmFtZSAjMTg5CgkJLSBbdHJhbnNsYXRpb25dIExhdHZpYW4sIFVsZGlzIFBsb3RpxYbFoSA8dWxkaXMucGxvdGluc0BnbWFpbC5jb20+CgkJLSBbdHJhbnNsYXRpb25dIFNwYW5pc2gsIFJpY2FyZG8gT2JyZWfDs24gPHJvYnJlZ29ubUBnbWFpbC5jb20+CgkJLSBbdHJhbnNsYXRpb25dIEphcGFuZXNlLCBUb21vYWtpIFlvc2hpZGEgPGluZm9AeW9zaGlkYS1zdHVkaW8uanA+CgkJICBodHRwOi8veW9zaGlkYS1zdHVkaW8uanAvcmFrdWdha2lzLwoKCjIwMTAtMDMtMjkgIERtaXRyeSBMZXZhc2hvdiAgPGRpb0BzdGQ0Mi5ydT4KCgkqIGVsUlRFICgxLjByYzQpOgoJCS0gW2ZlYXR1cmVdIGJldHRlciBkaXNwbGF5IGltYWdlIG1hcmdpbiBhdHRyaWJ1dGVzCgkJLSBbZmVhdHVyZV0gbmV3IGJ1dHRvbiAiQ1NTIiBmb3IgY2xhc3MgYW5kIHN0eWxlIHNldAoJCS0gW2J1Z2ZpeF0gYmV0dGVyIFhIVE1MIHN1cHBvcnQKCQktIFtidWdmaXhdIG1vcmUgdW51c2VkIHRhZ3MvYXR0cmlidXRlcyBjbGVhbnVwIGFuZCByZXBsYWNlCgkJLSBbYnVnZml4XSByZXN0b3JlIHNlbGVjdGlvbiBhZnRlciB1bmRvL3JlZG8KCQktIFtidWdmaXhdIGxpbmtzIGFkZC9yZW1vdmUgcHJvYmxlbQoJCS0gW2J1Z2ZpeF0gSUUgc291cmNlIHdpbmRvdyBoZWlnaHQKCQktIFtidWdmaXhdIGVtYmVkIGZsYXNoIHByb2JsZW0KCgoyMDEwLTAzLTE1ICBUcm9leCBOZXZlbGluICA8dHJvZXhAZnVyeS5zY2FuY29kZS5ydT4KCgkqIGVsUlRFICgxLjByYzMpOgoJCS0gW2ZlYXR1cmVdIEFkZCBGbGFzaCBidXR0b24KCQktIFtidWdmaXhdIG5vIG1vcmUgY29uZmxpY3Qgd2l0aCBtb290b29scwoJCS0gW2J1Z2ZpeF0gdGV4dCBhbGlnbm1lbnQgZml4CgkJLSBbYnVnZml4XSBwYXJ0bHkgZml4ZXMgYmxvY2sgc2VsZWN0aW9uCgkJLSBbYnVnZml4XSBpbnNlcnQgbmV3IHJvdyBpbiB0YWJsZSBub3cgd29ya3MKCQktIFtidWdmaXhdIGZpeGVkIHVuZG8vcmVkbwoJCS0gW2J1Z2ZpeF0gZW50ZXIvc2hpZnQrZW50ZXIgZml4ZWQgaW4gU2FmYXJpCgkJLSBbYnVnZml4XSBqcXVlcnkgcGx1Z2luIG5vdyBjb250YWlucyBuZXcgY29tbWFuZHMgKG9wZW4sIGNsb3NlLAoJCSAgdXBkYXRlU291cmNlLCB2YWwpCgoKMjAwOS0xMS0wOSAgRG1pdHJ5IExldmFzaG92ICA8ZGlvQHN0ZDQyLnJ1PgoKCSogZWxSVEUgKDEuMHJjMik6CgkJLSBbYnVnZml4XSBsaW5rcyBhbmQgaW1hZ2VzIHVybHMgY29udmVydHMgdG8gbG93ZXIgY2FzZQoJCS0gW2J1Z2ZpeF0gbGluayB0byBhbmNob3Igbm90IHdvcmsKCQktIFtidWdmaXhdIG5ldyB0YWJsZSBkbyBub3Qgc2F2ZSBtYXJnaW5zCgkJLSBbYnVnZml4XSBpbnZhbGlkIHNlbGVjdGlvbiBhZnRlciBpbnNlcnQgbm9kZSBpbiBTYWZhcmkKCQktIFtidWdmaXhdIGRpYWxvZyB3aW5kb3dzIHVuZGVyIGZ1bGxzY3JlZW4gZWRpdG9yCgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/css/elrte-inner.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CmJvZHkuZWwtcnRlLXJ0bCwgYm9keS5lbC1ydGUtcnRsICogewoJZGlyZWN0aW9uOnJ0bDsKfSAKCmJvZHkuZWwtcnRlLXN0cnVjdHVyZSB0YWJsZSwgCmJvZHkuZWwtcnRlLXN0cnVjdHVyZSBjYXB0aW9uLApib2R5LmVsLXJ0ZS1zdHJ1Y3R1cmUgdGQsIApib2R5LmVsLXJ0ZS1zdHJ1Y3R1cmUgdGgsIApib2R5LmVsLXJ0ZS1zdHJ1Y3R1cmUgcCwgCmJvZHkuZWwtcnRlLXN0cnVjdHVyZSBkaXYsCmJvZHkuZWwtcnRlLXN0cnVjdHVyZSBibG9ja3F1b3RlCnsgb3V0bGluZToxcHggZG90dGVkICM5OWNjZmY7IH0KCmJvZHkuZWwtcnRlLXN0cnVjdHVyZSBhW25hbWVdIHsKCWRpc3BsYXk6aW5saW5lLWJsb2NrOwoJdmVydGljYWwtYWxpZ246YmFzZWxpbmU7Cgl3aWR0aDoxMnB4OyAKCWhlaWdodDoxMnB4OyAKCWJvcmRlcjoxcHggZG90dGVkICNjY2M7CgliYWNrZ3JvdW5kOiB1cmwoJy4uL2ltYWdlcy9lbHJ0ZS10b29sYmFyLnBuZycpIC01NjRweCAtOHB4IG5vLXJlcGVhdDsKfQppbWcgeyBjdXJzb3I6IGRlZmF1bHQ7IH0KCmltZy5lbHJ0ZS13ZWJraXQtaGwgeyBvdXRsaW5lOjFweCBkYXNoZWQgIzc3NzsgfQoKLmVscnRlYm0gewp9CgouZWxydGUtbWVkaWEteC1zaG9ja3dhdmUtZmxhc2gsCi5lbHJ0ZS1tZWRpYS1xdWlja3RpbWUsCi5lbHJ0ZS1tZWRpYS14LWRpcmVjdG9yLAouZWxydGUtbWVkaWEteC1tcGxheWVyMiwKLmVscnRlLW1lZGlhLXgtcG4tcmVhbGF1ZGlvLXBsdWdpbiwKLmVscnRlLW1lZGlhLXlvdXR1YmUsCi5lbHJ0ZS1tZWRpYS1ydXR1YmUsCi5lbHJ0ZS1tZWRpYS12aW1lbywKLmVscnRlLXlhbmRleC1tYXBzLAouZWxydGUtZ29vZ2xlLW1hcHMsCi5lbHJ0ZS1tZWRpYSB7Cglib3JkZXI6MXB4IHNvbGlkICNjY2M7CgliYWNrZ3JvdW5kOiNlZWUgdXJsKC4uL2ltYWdlcy9tZWRpYS1mbGFzaC5wbmcpIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0Owp9Ci5lbHJ0ZS1tZWRpYS14LXNob2Nrd2F2ZS1mbGFzaCB7CgliYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWFnZXMvbWVkaWEtZmxhc2gucG5nKTsKfQouZWxydGUtbWVkaWEteW91dHViZSB7CgliYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWFnZXMvbWVkaWEteW91dHViZS5wbmcpOwp9Ci5lbHJ0ZS1tZWRpYS12aW1lbyB7CgliYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWFnZXMvbWVkaWEtdmltZW8ucG5nKTsKfQouZWxydGUtbWVkaWEtcnV0dWJlIHsKCWJhY2tncm91bmQtaW1hZ2U6dXJsKC4uL2ltYWdlcy9tZWRpYS1ydXR1YmUucG5nKTsKfQouZWxydGUtbWVkaWEtcXVpY2t0aW1lIHsKCWJhY2tncm91bmQtaW1hZ2U6dXJsKC4uL2ltYWdlcy9tZWRpYS1xdWlja3RpbWUucG5nKTsKfQouZWxydGUtbWVkaWEteC1kaXJlY3RvciB7CgliYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWFnZXMvbWVkaWEtZGlyZWN0b3IucG5nKTsKfQouZWxydGUtbWVkaWEteC1tcGxheWVyMiB7CgliYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWFnZXMvbWVkaWEtd2lubWVkaWEucG5nKTsKfQouZWxydGUtbWVkaWEteC1wbi1yZWFsYXVkaW8tcGx1Z2luIHsKCWJhY2tncm91bmQtaW1hZ2U6dXJsKC4uL2ltYWdlcy9tZWRpYS1yZWFsYXVkaW8ucG5nKTsKfQouZWxydGUteWFuZGV4LW1hcHMgewoJYmFja2dyb3VuZC1pbWFnZTp1cmwoLi4vaW1hZ2VzL3lhbmRleC1tYXBzLnBuZyk7Cn0KLmVscnRlLWdvb2dsZS1tYXBzIHsKCWRpc3BsYXk6IGJsb2NrOwoJYmFja2dyb3VuZC1pbWFnZTp1cmwoLi4vaW1hZ2VzL2dvb2dsZS1tYXBzLnBuZyk7Cn0KCi5lbHJ0ZS1wYWdlYnJlYWsgewoKCWRpc3BsYXk6YmxvY2s7CgljbGVhcjpib3RoOwoJd2lkdGg6MTAwJTsKCWhlaWdodDo3cHg7CglvdXRsaW5lOjFweCBkb3R0ZWQgIzc3NzsKCW91dGxpbmUtbGVmdDpub25lOwoJb3V0bGluZS1yaWdodDpub25lOwoJYmFja2dyb3VuZDp0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL3BhZ2VicmVhay5naWYpIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0Owp9CgouZWxydGUtcGFnZWJyZWFrOmFmdGVyIHsKICBjb250ZW50OiAiLiI7CiAgZGlzcGxheTogYmxvY2s7CiAgZm9udC1zaXplOjA7CiAgaGVpZ2h0OiAwOwogIGNsZWFyOiBib3RoOwogIHZpc2liaWxpdHk6IGhpZGRlbjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/css/elrte.full.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGVsUlRFIFdZU0lXWUcgSFRNTC1lZGl0b3IKICogVmVyc2lvbiAxLjEgKDIwMTAtMDktMjApCiAqIGh0dHA6Ly9lbHJ0ZS5vcmcKICoKICogTW9kaWZpZWQgZm9yIHRvdWNoSW5saW5lRWRpdCBjbXNtcyBtb2R1bGU6IEFkZCBzb21lIGltcG9ydGFudCBydWxlcwogKgogKiBDb3B5cmlnaHQgMjAxMCwgU3R1ZGlvIDQyIEx0ZC4KICogTGljZW5zZWQgdW5kZXIgYSAzIGNsYXVzZXMgQlNEIGxpY2Vuc2UKICovCgpAY2hhcnNldCAiVVRGLTgiOwphIHsgb3V0bGluZTogbm9uZTsgfQoKLyoqKioqKioqKioqKiogIGNsZWFyZml4ICAqKioqKioqKioqKioqKioqKioqKioqLwoKLmNsZWFyZml4OmFmdGVyIHsKICBjb250ZW50OiAiLiI7CiAgZGlzcGxheTogYmxvY2s7CiAgZm9udC1zaXplOjA7CiAgaGVpZ2h0OiAwOwogIGNsZWFyOiBib3RoOwogIHZpc2liaWxpdHk6IGhpZGRlbjsKfQoKLmNsZWFyZml4IHsgZGlzcGxheTogYmxvY2s7IH0KCi5yb3VuZGVkLTIgeyAtbW96LWJvcmRlci1yYWRpdXM6IDJweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7IGJvcmRlci1yYWRpdXM6IDJweDsgfQoucm91bmRlZC0zIHsgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OyBib3JkZXItcmFkaXVzOiAzcHg7IH0KLnJvdW5kZWQtNCB7IC1tb3otYm9yZGVyLXJhZGl1czogNHB4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsgYm9yZGVyLXJhZGl1czogNHB4OyB9Ci5yb3VuZGVkLTUgeyAtbW96LWJvcmRlci1yYWRpdXM6IDVweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7IGJvcmRlci1yYWRpdXM6IDVweDsgfQoucm91bmRlZC02IHsgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4OyBib3JkZXItcmFkaXVzOiA2cHg7IH0KLnJvdW5kZWQtNyB7IC1tb3otYm9yZGVyLXJhZGl1czogN3B4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDdweDsgYm9yZGVyLXJhZGl1czogN3B4OyB9Ci5yb3VuZGVkLWxlZnQtMyB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiAzcHg7IC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogM3B4OyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDogM3B4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDsgfQoucm91bmRlZC1ib3R0b20tNyB7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OjdweDsgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OjdweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA3cHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogN3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA3cHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA3cHg7fQkKCgoudWktd2lkZ2V0IHsgZm9udC1zaXplOi45ZW07fQoudWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZSBidXR0b24geyBwYWRkaW5nOiAuMWVtIC42ZW0gLjJlbSAuNmVtOyB9CgovKiBjb2xvcnBpY2tlciAiYnV0dG9uIiAqLwouZWwtY29sb3JwaWNrZXIgewoJd2lkdGggIDogMTZweDsKCWhlaWdodCA6IDE2cHg7Cglib3JkZXI6MXB4IHNvbGlkICNjY2M7Cglwb3NpdGlvbjpyZWxhdGl2ZTsKCWN1cnNvcjpkZWZhdWx0Owp9CgovKiBjb2xvcnMgcGFsZXR0ZSAqLwouZWwtcGFsZXR0ZSB7Cgl3aWR0aDogMTgycHg7Cglib3JkZXI6MXB4IHNvbGlkICNjY2M7CgliYWNrZ3JvdW5kOiNmZmY7CglwYWRkaW5nOjNweCAycHggM3B4IDNweDsKCXotaW5kZXg6MTAwMDA7IC8qIGZpZ2h0IHdpdGggdWkuZGlhbG9nIDBfbyAqLwoJcG9zaXRpb246YWJzb2x1dGU7Cgl0b3A6MTZweDsKCWxlZnQ6MDsKfQoKLyogY29sb3IgY2VsbCBpbiBwYWxldHRlICovCi5lbC1wYWxldHRlIC5jb2xvciB7CglmbG9hdDpsZWZ0OwoJd2lkdGg6MTRweDsKCWhlaWdodDoxNHB4OwoJbGluZS1oZWlnaHQ6MXB4OwoJYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7Cglib3JkZXItbGVmdDoxcHggc29saWQgI2VlZTsKfQoKLyogc2lkZSBiZWxvdyBjb2xvciBjZWxscyAqLwouZWwtcGFsZXR0ZSAucGFuZWwgewoJYm9yZGVyLXRvcDoxcHggc29saWQgI2NjYzsKCW1hcmdpbi10b3A6N3B4OwoJcGFkZGluZzo1cHggM3B4IDVweCAzcHg7Cn0KCi8qICJ3aW5kb3ciIHdpdGggc2VsZWN0ZWQgY29sb3IgKi8KLmVsLXBhbGV0dGUgLnBhbmVsIC5wcmV2aWV3IHsKCWZsb2F0OnJpZ2h0OwoJd2lkdGg6MThweDsKCWhlaWdodDoxOHB4OwoJYm9yZGVyOjFweCBzb2xpZCAjY2NjOwp9CgovKiBjb2xvciB2YWx1ZSB0ZXh0IGZpZWxkICovCi5lbC1wYWxldHRlIC5wYW5lbCBpbnB1dCB7Cglib3JkZXI6MXB4IHNvbGlkICNjY2M7Cn0KLyogZGlhbG9nIGNvbnRhaW5lciAqLwoudWktd2lkZ2V0IC5lbC1kaWFsb2dmb3JtIHsKCXBhZGRpbmc6NXB4IDNweDsKCn0KCi51aS13aWRnZXQgLmVsLWRpYWxvZ2Zvcm0tcnRsIHsKCWRpcmVjdGlvbjogcnRsOwp9CgoudWktd2lkZ2V0IC5lbC1kaWFsb2dmb3JtLXJ0bCAudWktdGFicy1uYXYgbGkgewoJZmxvYXQ6cmlnaHQ7Cn0KCi5lbC1kaWFsb2dmb3JtIGRpdi50YWI6aG92ZXIgeyBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50OyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZSwgLnVpLWRpYWxvZyAudWktZGlhbG9nLWNvbnRlbnQgewoJZm9udC1zaXplOi45ZW07Cn0KCi8qIHRhYnMgbmF2ICovCi51aS10YWJzIC51aS10YWJzLW5hdiBsaSBhIHsKCXBhZGRpbmc6LjJlbSAuN2VtOwp9CgovKiB0YWIgY29udGFpbmVyICovCi5lbC1kaWFsb2dmb3JtIC50YWIgewoJcGFkZGluZzo1cHggMCAxMnB4IDA7Cglib3JkZXI6bm9uZTsKfQovKiBsaW5lIHNlcGFyYXRvciAqLwouZWwtZGlhbG9nZm9ybSAuc2VwYXJhdG9yIHsKCWJvcmRlci10b3A6MXB4IHNvbGlkICNjY2M7CgltYXJnaW46IDVweCAycHg7Cn0KCi8qIHRhYmxlIGluIGRpYWxvZyBvciBpbiB0YWIgKi8KLmVsLWRpYWxvZ2Zvcm0gdGFibGUgewoJd2lkdGg6MTAwJTsKCWJvcmRlcjogbm9uZTsKfQoKLmVsLWRpYWxvZ2Zvcm0gIHRhYmxlIHRkIHsKCXBhZGRpbmc6IDJweDsKfQoKLmVsLWRpYWxvZ2Zvcm0gaW5wdXQsIC5lbC1kaWFsb2dmb3JtIHRleHRhcmVhIHsKCWJvcmRlcjoxcHggc29saWQgI2NjYzsKfQoKLmVsLWRpYWxvZ2Zvcm0gc2VsZWN0IHsKCXBhZGRpbmc6MDsKLyoJZm9udC1zaXplOjExcHg7Ki8KfQoKLmVsLWRpYWxvZ2Zvcm0gLnNwaW5uZXIgewoJYmFja2dyb3VuZDp1cmwoLi4vaW1hZ2VzL2xvYWRpbmcuZ2lmKSA1MCUgNTAlIG5vLXJlcGVhdDsKCXRleHQtYWxpZ246Y2VudGVyOwoJd2lkdGg6MTUwcHg7CgloZWlnaHQ6NTBweDsKCW1hcmdpbjoxMHB4IGF1dG87CglwYWRkaW5nLXRvcDozM3B4OwoJZm9udC13ZWlnaHQ6Ym9sZDsKfQouZWwtZGlhbG9nZm9ybS1lcnJvciB7CgliYWNrZ3JvdW5kOiAjZmVlOyBjb2xvcjojZmYwMDAwOyBib3JkZXI6IDJweCAjODQ0IHNvbGlkOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW4tYm90dG9tOiAxZW0gMDsKCQp9Ci5lbC1kaWFsb2dmb3JtLW1lc3NhZ2UgewoJYmFja2dyb3VuZDogI2VmZTsgY29sb3I6ICMwNDA7IGJvcmRlcjogMnB4ICM0ODQgc29saWQ7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbi1ib3R0b206IDFlbSAwOwp9CgoKLmVsLWRpYWxvZ2Zvcm0gIHRhYmxlIHRkIC5lbC1ib3JkZXJzZWxlY3QgdGFibGUgewoJd2lkdGg6YXV0bzsKfQoKLmVsLWRpYWxvZ2Zvcm0gIHRhYmxlIHRkIC5lbC1ib3JkZXJzZWxlY3QgdGFibGUgdGQgewoJcGFkZGluZy1sZWZ0IDowOwoJcGFkZGluZy1yaWdodDoycHg7Cn0KLmVsLXBhZGRpbmdpbnB1dCB7CglkaXNwbGF5OiBibG9jazsKCXdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLmVsLXBhZGRpbmdpbnB1dCBpbnB1dCB7CgltYXJnaW4gOjAgMXB4IDAgMDsKCWJvcmRlcjoxcHggc29saWQgI2NjYzsKfQouZWwtcGFkZGluZ2lucHV0IHNlbGVjdCB7CglwYWRkaW5nOjA7Cn0vKiBjb250YWluZXIgZm9yIGVsc2VsZWN0ICovCi5lbC1zZWxlY3QgewoJaGVpZ2h0OjE3cHg7Cgl3aWR0aCA6IDExMHB4OwoJYm9yZGVyOjFweCBzb2xpZCAjY2NjOwoJY3Vyc29yOiBkZWZhdWx0OwoJcG9zaXRpb246cmVsYXRpdmU7Cn0KLmVsLXNlbGVjdC5ob3ZlciB7CgliYWNrZ3JvdW5kLWNvbG9yOiNlZWU7Cn0KCi8qIHNlbGVjdGVkIGVsZW1lbnQgKi8KLmVsLXNlbGVjdCBsYWJlbCB7CgloZWlnaHQ6MTdweDsKCWxpbmUtaGVpZ2h0OjE3cHg7Ci8qCWZvbnQtc2l6ZTouOTJlbTsqLwoJcGFkZGluZzogMCA1cHg7CgltYXJnaW46IDAgMTJweCAwIDA7CglkaXNwbGF5OmJsb2NrOwoJd2hpdGUtc3BhY2U6bm93cmFwOwoJb3ZlcmZsb3c6aGlkZGVuOwoJYmFja2dyb3VuZDogI2ZmZjsKCWJvcmRlci1yaWdodDoxcHggc29saWQgI2NjYzsKfQovKiBkcm9wLWRvd24gbGlzdCAqLwouZWwtc2VsZWN0IC5saXN0IHsKCWJvcmRlcjoxcHggc29saWQgI2NjYzsKCWRpc3BsYXk6YmxvY2s7Cglwb3NpdGlvbjphYnNvbHV0ZTsKCW92ZXJmbG93OmF1dG87CgliYWNrZ3JvdW5kOiNmZmY7Cgl6LWluZGV4OjEwMDA7Ci8qCWhlaWdodDoxNjEwcHgqLwp9Ci8qIGRyb3AtZG93biBsaXN0IGl0ZW0gKi8KLmVsLXNlbGVjdCAubGlzdCBkaXYgewoJcG9zaXRpb246cmVsYXRpdmU7CglwYWRkaW5nOjNweCAyNXB4IDNweCA3cHg7Cglib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlOwp9Ci8qIGRyb3AtZG93biBsaXN0IGl0ZW0gaG92ZXJlZCAqLwouZWwtc2VsZWN0IC5saXN0IC5ob3ZlciB7CgliYWNrZ3JvdW5kOiNlZmVmZWY7Cn0KLyogZHJvcC1kb3duIGxpc3QgaXRlbSBzZWxlY3RlZCAqLwouZWwtc2VsZWN0IC5saXN0IC5hY3RpdmUgewoJYmFja2dyb3VuZC1jb2xvcjojYzNkYmVmOwp9Ci8qIGFueSBlbGVtZW50cyBpbiBkcm9wLWRvd24gbGlzdCBpdGVtICovCi5lbC1zZWxlY3QgLmxpc3QgZGl2ICogewoJcGFkZGluZzowOwoJbWFyZ2luOjA7Cglib3JkZXI6bm9uZTsKCXdoaXRlLXNwYWNlOm5vd3JhcDsKCWRpc3BsYXk6YmxvY2s7Cn0KCi8qICDQutC+0L3RgtC10LnQvdC10YAgKi8KLmVsLXJ0ZSB7IAoJZm9udC1mYW1pbHk6IFRyZWJ1Y2hldCBNUywgVmVyZGFuYSwgR2VuZXZhLHNhbnMtc2VyaWY7Ci8qCWJvcmRlcjoxcHggc29saWQgI2FhYTsqLwp9Ci5lbC1ydGUuZWwtZnVsbHNjcmVlbiB7Cglwb3NpdGlvbjphYnNvbHV0ZTsKCXdpZHRoOjk5JTsKLyoJaGVpZ2h0OjEwMCU7Ki8KCXRvcDowOwoJbGVmdDowOwoJbWFyZ2luOjA7Ci8qCXotaW5kZXg6MTAxOyovCn0KCi5lbHJ0ZS1zd2YtcGxhY2Vob2xkZXIgewoJd2lkdGg6MXB4OwoJYmFja2dyb3VuZDogdXJsKCcuLi9pbWFnZXMvc3dmLnBuZycpIDAgMCBuby1yZXBlYXQ7CQp9CgovKiBzdHlsZSB0byBkZXRlY3QgaW1hZ2VzIHVybCAqLwovKi5lbC1ydGUgKi8KLmVscnRldGVzdHVybCB7IGNvbG9yOnJlZDsgYmFja2dyb3VuZC1pbWFnZTp1cmwoLi4vaW1hZ2VzL3BpeGVsLmdpZik7fQoKLyog0L/QsNC90LXQu9GMINC40L3RgdGC0YDRg9C80LXQvdGC0L7QsiAqLwouZWwtcnRlIC50b29sYmFyIHsgIGJhY2tncm91bmQtY29sb3I6I2VlZTsgcGFkZGluZzozcHggN3B4IDJweCA3cHg7IGJvcmRlcjoxcHggc29saWQgI2NjYzsgd2hpdGUtc3BhY2U6bm9ybWFsOyB9CgouZWwtcnRlLXJ0bCAudG9vbGJhciB7IGRpcmVjdGlvbjogcnRsOyB9CgovKiDQv9Cw0L3QtdC70Ywg0LrQvdC+0L/QvtC6ICovCi5lbC1ydGUgLnRvb2xiYXIgdWwgewoJcG9zaXRpb246cmVsYXRpdmU7CglkaXNwbGF5OmlubGluZS1ibG9jazsgCglkaXNwbGF5OiAtbW96LWlubGluZS1zdGFjazsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICB6b29tOiAxOwogICAgKmRpc3BsYXk6IGlubGluZTsKCW1hcmdpbjowICFpbXBvcnRhbnQ7CglsaXN0LXN0eWxlOm5vbmU7CglwYWRkaW5nOjAgMnB4IDAgNXB4OwoJYmFja2dyb3VuZDogdXJsKCcuLi9pbWFnZXMvZWxydGUtdG9vbGJhci5wbmcnKSAtOTM0cHggLTJweCBuby1yZXBlYXQ7CQp9Ci8qINC/0LXRgNCy0LDRjyDQv9Cw0L3QtdC70Ywg0LrQvdC+0L/QvtC6ICovCi5lbC1ydGUgLnRvb2xiYXIgdWwuZmlyc3QgewoJYmFja2dyb3VuZDp0cmFuc3BhcmVudDsKCXBhZGRpbmctbGVmdDowOwp9Ci8qINC60L3QvtC/0LrQsCAqLwouZWwtcnRlIC50b29sYmFyIHVsIGxpIHsKCWRpc3BsYXk6aW5saW5lLWJsb2NrOyAKCWRpc3BsYXk6IC1tb3otaW5saW5lLXN0YWNrOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwoJaGVpZ2h0OjIycHg7IAoJd2lkdGg6MjJweDsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICB6b29tOiAxOwogICAgKmRpc3BsYXk6IGlubGluZTsKCW1hcmdpbjoxcHggMXB4ICFpbXBvcnRhbnQ7CglwYWRkaW5nOjAgIWltcG9ydGFudDsgLyogSm9vbWxhIDEuNiBjb21wYXQgKi8KCWJhY2tncm91bmQ6dXJsKCcuLi9pbWFnZXMvZWxydGUtdG9vbGJhci5wbmcnKSBuby1yZXBlYXQ7IAoJYm9yZGVyOjFweCBzb2xpZCAjY2NjOwp9Ci8qINCw0LrRgtC40LLQvdCw0Y8g0Lgg0L/QvtC00YHQstC10YfQtdC90L3QsNGPINC4INC90LXQsNC60YLQuNCy0L3QsNGPINC60L3QvtC/0LrQsCAqLwouZWwtcnRlIC50b29sYmFyIHVsIGxpLmhvdmVyICAgIHsgYm9yZGVyOjFweCBzb2xpZCAjNTRiOWJmOyB9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuYWN0aXZlICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiNjM2RiZWY7IGJvcmRlcjoxcHggc29saWQgI2ZmZjsgfQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmRpc2FibGVkIHsgb3BhY2l0eTphbHBoYSgwLjMpOyBvcGFjaXR5OiAwLjM7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTMwKTt9Ci8qICDQutC90L7Qv9C60LggICovCi5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuYWJvdXQgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTgyOXB4IC01cHg7fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLnNhdmUgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTMwcHggLTJweDt9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkubmV3ICAgICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTVweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmNvcHkgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTc4cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5jc3MgICAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MDFweCAtNXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmN1dCAgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTEwNHB4IC0ycHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkucGFzdGUgICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5wYXN0ZXRleHQgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01MzRweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLnBhc3RlZm9ybWF0dGV4dCAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTE1NHB4IC0ycHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkucmVtb3ZlZm9ybWF0ICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTgwcHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5kb2NzdHJ1Y3R1cmUgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MTJweCAtNHB4fSAgCi5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudW5kbyAgICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA1cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5yZWRvICAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMzBweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmJvbGQgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTI1MnB4IC0ycHg7IH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5pdGFsaWMgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNzBweCAtMnB4O30KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS51bmRlcmxpbmUgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yOTBweCAtMnB4OyB9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuc3RyaWtldGhyb3VnaCAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ5cHggLTI5cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuc3Vic2NyaXB0ICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTRweCAtMjlweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5zdXBlcnNjcmlwdCAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03NnB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmp1c3RpZnlsZWZ0ICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTMxMXB4IC0ycHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuanVzdGlmeWNlbnRlciAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMzM1cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5qdXN0aWZ5cmlnaHQgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNjBweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmp1c3RpZnlmdWxsICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTE3NHB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmluc2VydHVub3JkZXJlZGxpc3Qge2JhY2tncm91bmQtcG9zaXRpb246LTEwMHB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmluc2VydG9yZGVyZWRsaXN0ICAge2JhY2tncm91bmQtcG9zaXRpb246LTEyNHB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLm91dGRlbnQgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTZweCAgIC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmluZGVudCAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTMycHggIC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmJsb2NrcXVvdGUgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTIyMHB4IC0zMHB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmRpdiAgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTY1NXB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLnN0b3BmbG9hdCAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTc3MXB4IC01cHh9ICAKLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5uYnNwICAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01ODBweCAtMnB4fSAKLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5mb3JlY29sb3IgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNzJweCAtMzBweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5oaWxpdGVjb2xvciAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zOTVweCAtMzBweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5saW5rICAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDRweCAtMjlweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS51bmxpbmsgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNzBweCAtMjlweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5hbmNob3IgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yOTZweCAtMzBweH0gCi5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuaW1hZ2UgICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMzg0cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5mbGFzaCAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MTBweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmZpbGUgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTQzNnB4IC0zcHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGFibGUgICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDIxcHggLTMwcHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGFibGVwcm9wcyAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNjAycHggLTI5cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjZWxscHJvcHMgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotODA2cHggLTI3cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGFibGVybSAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDYxcHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS50YnJvd2JlZm9yZSAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02ODNweCAtNHB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLnRicm93YWZ0ZXIgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTY1NHB4IC00cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJyb3dybSAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTAwcHggLTMwcHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjb2xiZWZvcmUgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNzQxcHggLTI3cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjb2xhZnRlciAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNzcycHggLTI3cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjb2xybSAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTI2cHggLTMwcHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjZWxsc21lcmdlICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTUycHggLTMwcHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjZWxsc3BsaXQgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNjI5cHggLTI5cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuc21pbGV5ICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMzIycHggLTI5cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuc3BlYy10ZXh0ICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDg3cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5wcmludCAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01MDlweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmhvcml6b250YWxydWxlICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTE5OXB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmZ1bGxzY3JlZW4gICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTM0OHB4IC0zMHB4fSAgCi5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuZWxmaW5kZXIgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDM2cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5sdHIgICAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04NTVweCAtMjdweH0gIAouZWwtcnRlIC50b29sYmFyIHVsIGxpLnJ0bCAgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTg1NXB4IC0zcHh9IAouZWwtcnRlIC50b29sYmFyIHVsIGxpLnBhZ2VicmVhayAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTcxMXB4IC0yOHB4fSAgCgoKLyog0YDQsNCx0L7Rh9Cw0Y8g0LfQvtC90LAgKNC+0LHQtdGA0YLQutCwINC90LDQtCBpZnJhbWUpICovCi5lbC1ydGUgLndvcmt6b25lIHsgYm9yZGVyOjFweCBzb2xpZCAjZWVlOyBib3JkZXItdG9wOm5vbmU7IGhlaWdodDo0MDBweDt9Ci5lbC1ydGUuc21hbGwgLndvcmt6b25lIHsgbWluLWhlaWdodDoyNTBweDsgfQoKLyogc291cmNlIGNvZGUgKi8KLmVsLXJ0ZSB0ZXh0YXJlYSAgeyB3aWR0aDoxMDAlOyAgaGVpZ2h0OjEwMCU7ICBib3JkZXI6bm9uZTsgem9vbToxOyBvdXRsaW5lOm5vbmU7fQouZWwtcnRlLnNtYWxsIHRleHRhcmVhICB7IG1pbi1oZWlnaHQ6MjUwcHg7fQovKiDRgNC10LTQsNC60YLQvtGAICovCi5lbC1ydGUgaWZyYW1lICAgIHsgCgl3aWR0aDogMTAwJTsgCgloZWlnaHQ6NDAwcHg7IAoKCW91dGxpbmU6bm9uZTsgCglib3JkZXI6MCBzb2xpZDsgCglwYWRkaW5nOjA7IAoJbWFyZ2luOjA7CgliYWNrZ3JvdW5kOiNmZmY7IAoJei1pbmRleDoxMDA7Cn0KLmVsLXJ0ZS5zbWFsbCBpZnJhbWUgIHsgbWluLWhlaWdodDoyNTBweDt9CgovKiDQv9Cw0L3QtdC70Ywg0YHRgtCw0YLRg9GB0LAgKNC/0YPRgtGMKSAqLwouZWwtcnRlIC5zdGF0dXNiYXIgewoJaGVpZ2h0OiAyMXB4OwoJcGFkZGluZzogMCA5cHg7Cglmb250OiAxMXB4LzIxcHggJ21vbmFjbycsICdhbmRhbGUgbW9ubycsICdsdWNpZGEgY29uc29sZScsIG1vbm9zcGFjZTsKCWJhY2tncm91bmQtY29sb3I6I2VlZTsKCWJvcmRlci10b3A6MXB4IHNvbGlkICNjY2M7CQoJYm9yZGVyLXRvcDpub25lOwp9CgouZWwtcnRlLXJ0bCAuc3RhdHVzYmFyIHsKCWRpcmVjdGlvbjpydGw7Ci8qCXRleHQtYWxpZ246cmlnaHQ7Ki8KfQoKLyog0YLQsNCx0YsgKi8KLmVsLXJ0ZSAudGFic2JhciB7IGRpc3BsYXk6IGJsb2NrOyAgfQouZWwtcnRlIC50YWJzYmFyIC50YWIgewoJZmxvYXQ6bGVmdDsgIAoJbWFyZ2luLXJpZ2h0OjJweDsgCglwYWRkaW5nOiA2cHggMTdweDsKCWZvbnQtc2l6ZTogLjgyZW07IAoJZm9udC13ZWlnaHQ6Ym9sZDsKCWNvbG9yOiM3Nzc7Cgl0ZXh0LWFsaWduOmNlbnRlcjsgIAoJYm9yZGVyOjFweCBzb2xpZCAjZWVlOwoJYm9yZGVyLXRvcDpub25lOwoJYmFja2dyb3VuZDogI2ZmZjsKCWN1cnNvcjogZGVmYXVsdDsKfQouZWwtcnRlIC50YWJzYmFyIGRpdi5hY3RpdmUgeyBiYWNrZ3JvdW5kOiAjZWVlOyBjb2xvcjojNDQ0OyB9Ci5lbC1ydGUtcnRsIC50YWJzYmFyIC50YWIgIHsgZmxvYXQ6cmlnaHQ7IH0KCi8qINCy0YvQv9Cw0LTQsNGO0YnQuNC1INC80LXQvdGOICovCi8qIGNvbnRhaW5lciBmb3IgZWxzZWxlY3QgKi8KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5lbC1zZWxlY3QgewoJaGVpZ2h0OjIycHg7Cgl3aWR0aCA6IDEyMHB4OwoJYm9yZGVyOjFweCBzb2xpZCAjY2NjOwoJZm9udC1zaXplOi44MmVtOwoJY3Vyc29yOiBkZWZhdWx0OwoJYmFja2dyb3VuZC1wb3NpdGlvbjotNDc1cHggLTMwcHg7Cn0KCi5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuZWwtc2VsZWN0LmhvdmVyIHsKCWJhY2tncm91bmQtY29sb3I6I2ZlZmVmZTsKfQoKLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5lbC1zZWxlY3QgbGFiZWwgewoJaGVpZ2h0OjE5cHg7CglwYWRkaW5nOiAzcHggNXB4IDAgNXB4OwoJZmxvYXQ6bm9uZTsgLyogSm9vbWxhIDEuNiBjb21wYXQgKi8KCXdpZHRoOjk2cHg7IC8qIEpvb21sYSAxLjYgY29tcGF0ICovCn0KCi8qIHRleHRhcmVhICYgaWZyYW1lINCyINC00LjQv9C70L7Qs9Cw0YUg0LLRgdGC0LDQstC60Lgg0YLQtdC60YHRgtCwICovCi5lbC1ydGUtcGFzdGUtaW5wdXQgewoJd2lkdGggOiA5OSU7CgloZWlnaHQ6IDI1MHB4OwoJYm9yZGVyOiAxcHggc29saWQgI2NjYzsKCXBhZGRpbmc6MDsKCW1hcmdpbjowOwoJb3V0bGluZTpub25lOwp9Ci8qINC40L3QtNC40LrQsNGC0L7RgCDQstGL0LHRgNCw0L3QvtCz0L4g0YbQstC10YLQsCDQvdCwINC60L3QvtC/0LrQtSAqLwouZWwtcnRlIC50b29sYmFyIHVsIGxpIGRpdi5jb2xvci1pbmRpY2F0b3IgewoJd2lkdGg6MThweDsKCWhlaWdodDo0cHg7CgltYXJnaW46MTZweCAwIDJweCAycHg7CgliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOwp9Ci5lbC1ydGUtcnRsIC50b29sYmFyIHVsIGxpIGRpdi5jb2xvci1pbmRpY2F0b3IgewoJbWFyZ2luOjE2cHggMnB4IDJweCAwOwp9Ci8qIGNvbG9ycyBwYWxldHRlICovCi5lbC1wYWxldHRlIHsgdG9wOjIwcHg7IH0KCi5lbC1kaWFsb2dmb3JtLCAuZWwtZGlhbG9nZm9ybSB0ZCAgeyBmb250LXNpemU6LjllbTsgfQouZWwtZGlhbG9nZm9ybSBzZWxlY3QgeyBmb250LXNpemU6LjllbTt9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIHsgcGFkZGluZzogLjRlbSwgMWVtO30KLnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgYnV0dG9uIHsgbWFyZ2luOiAuM2VtIC40ZW0gLjFlbSAwOyBmb250LXNpemU6LjllbTt9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZWJhciB7IHBhZGRpbmc6IC4zZW0gMWVtIC4zZW07ICAgfQovKi51aS1kaWFsb2ctYnV0dG9uc2V0IHsgcGFkZGluZzowOyBiYWNrZ3JvdW5kLWNvbG9yOiMzMzM7fSovCi8qINC00LjQsNC70L7Qs9C+0LLRi9C1INC+0LrQvdCwICovCi5lbC1kaWFsb2dmb3JtIGxhYmVsIHsKCWRpc3BsYXk6YmxvY2s7Cn0KLmVsLWRpYWxvZ2Zvcm0gbGFiZWwgaW5wdXQgewoJbWFyZ2luLXJpZ2h0OjJweDsKfQouZWwtZGlhbG9nZm9ybSBpZnJhbWUuZWwtcnRlLXByZXZpZXcgewoJd2lkdGggOiAxMDAlOwoJaGVpZ2h0IDogMjM1cHg7CgltYXJnaW46MDsKCXBhZGRpbmc6MDsKCW91dGxpbmU6bm9uZTsKCWJvcmRlcjpub25lOwp9Ci5lbC1kaWFsb2dmb3JtIGZpZWxkc2V0IHsKCWJvcmRlcjoxcHggc29saWQgI2NjYzsKCXBhZGRpbmcgOiAwOwp9Ci5lbC1kaWFsb2dmb3JtIGZpZWxkc2V0IGxlZ2VuZCB7Cglmb250LXNpemU6LjllbTsKCXBhZGRpbmc6IC4xZW0gLjVlbTsKCW1hcmdpbjogMCAwIDVweCAxZW07Cglib3JkZXI6MXB4IHNvbGlkICNjY2M7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwp9Ci5lbC1kaWFsb2dmb3JtIHAgeyBwYWRkaW5nOi4yZW0gLjNlbTt9Ci5lbC1kaWFsb2dmb3JtIGgzIHsgY29sb3I6IzU1NTsgcGFkZGluZzoxLjJlbSAwIDAgMDsgbWFyZ2luOjA7IGZvbnQtc2l6ZToxLjJlbTsgfQoKLmVsLWRpYWxvZ2Zvcm0gaDQgeyBjb2xvcjojNTU1O2ZvbnQtc2l6ZToxZW07IHBhZGRpbmc6MDsgbWFyZ2luOiAzcHggOXB4OyB9CgouZWxydGUtbG9nbyB7IAoJd2lkdGg6NDhweDsgCgloZWlnaHQ6NDZweDsKCWZsb2F0OmxlZnQ7IAoJbWFyZ2luOi41ZW0gMWVtOwoJYmFja2dyb3VuZDp1cmwoJy4uL2ltYWdlcy9lbHJ0ZS10b29sYmFyLnBuZycpIC04ODBweCAtN3B4IG5vLXJlcGVhdDsKfQouZWxydGUtdmVyIHsgZm9udC1zaXplOi45ZW07IHBhZGRpbmctbGVmdDouN2VtO30KLmVscnRlLWNvcHkgeyBmb250LXNpemU6LjllbTsgcGFkZGluZy1sZWZ0Oi4zZW07fQp0YWJsZS5lbHJ0ZS1hdXRob3JzIHsgbWFyZ2luLWJvdHRvbToxZW07fQp0YWJsZS5lbHJ0ZS1hdXRob3JzIHRkIHsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTt9Ci8qIHdpZGdldHMgKi8KLmVsLWJvcmRlcnNlbGVjdCB7fQouZWwtYm9yZGVyc2VsZWN0IHRhYmxlICAgICAgeyAgbWFyZ2luOjA7IH0KLmVsLWJvcmRlcnNlbGVjdCB0YWJsZSB0ZCAgIHsgcGFkZGluZyA6IDAgMnB4IDAgMDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyB9Ci5lbC1ib3JkZXJzZWxlY3QgaW5wdXQgICAgICB7IG1hcmdpbjowOyAgYm9yZGVyOjFweCBzb2xpZCAjY2NjOyB9CgouZWwtcGFkZGluZ2lucHV0ICAgICAgICB7IGRpc3BsYXk6IGJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9Ci5lbC1wYWRkaW5naW5wdXQgaW5wdXQgIHsgbWFyZ2luIDowIDFweCAwIDA7IGJvcmRlcjoxcHggc29saWQgI2NjYzsgfQouZWwtcGFkZGluZ2lucHV0IHNlbGVjdCB7IHBhZGRpbmc6MDsgfQoKLmVsLXJ0ZS1zbWlsZXkgeyBtYXJnaW46NXB4OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/elrte.plugin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogZWxydGUucGx1Z2luLnBocCAxNTIgMjAxMS0wMS0xMyAyMzowODoyMlogdG91Y2hkZXNpZ24gJAogKgogKiB0b3VjaElubGluZUVkaXQgTW9kdWxlCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMCB0b3VjaERlc2lnbiwgPHd3dy50b3VjaGRlc2lnbi5kZT4KICoKICogQGNhdGVnb3J5IE1vZHVsZQogKiBAYXV0aG9yIENocmlzdG9waCBHcnViZXIgPHd3dy50b3VjaGRlc2lnbi5kZT4KICogQHZlcnNpb24gMS44LjAKICogQGNvcHlyaWdodCAwNC4wOC4yMDEwIHRvdWNoRGVzaWduCiAqIEBsaW5rIGh0dHA6Ly93d3cudG91Y2hkZXNpZ24uZGUvCiAqIEBsaW5rIGh0dHA6Ly93d3cuaG9tZXBhZ2UtY29tbXVuaXR5LmRlL2luZGV4LnBocD90b3BpYz0xNjgwLjAKICogQGxpbmsgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy90b3VjaElubGluZUVkaXQKICogQGxpY2Vuc2UgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwgMi4wKQogKgogKiAKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmNsYXNzIGVscnRlIGV4dGVuZHMgdG91Y2hJbmxpbmVFZGl0UGx1Z2luIHsKCiAgLyoqCiAgICogUGx1Z2luIHNwZWNpZmljIHRlbXBsYXRlcy4KICAgKiBAdmFyIGFycmF5CiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gIAogIHB1YmxpYyAkdGVtcGxhdGVzID0gYXJyYXkoCiAgICAnaGVhZGVyJyA9PiAKJzwhLS0geyR0aWUtPmdldE5hbWUoKX0gOjogeyR0aWUtPnBsdWdpbi0+ZGlzcGxheU5hbWV9IG1vZHVsZSAtLT4KPHNjcmlwdCBzcmM9InskdGllLT5wbHVnaW4tPnBhdGh9L2pzL3skdGllLT5wbHVnaW4tPm5hbWV9L3skdGllLT5wbHVnaW4tPm5hbWV9LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0Pgp7aWYgJHRpZS0+cGx1Z2luLT5nZXQoXCdqcXVlcnlfbG9hZFwnKX0KPHNjcmlwdCBzcmM9InskdGllLT5wbHVnaW4tPnBhdGh9L2pzL2pxdWVyeS0xLjQuMi5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJ7JHRpZS0+cGx1Z2luLT5wYXRofS9qcy9qcXVlcnktdWktMS44LjUuY3VzdG9tLm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7JHRpZS0+cGx1Z2luLT5wYXRofS9qcy91aS10aGVtZXMvc21vb3RobmVzcy9qcXVlcnktdWktMS44LjUuY3VzdG9tLmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIGNoYXJzZXQ9InV0Zi04IiAvPgp7L2lmfQo8c2NyaXB0IHNyYz0ieyR0aWUtPnBsdWdpbi0+cGF0aH0vanMvZWxydGUubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ieyR0aWUtPnBsdWdpbi0+cGF0aH0vanMvaTE4bi9lbHJ0ZS5ydS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7JHRpZS0+cGx1Z2luLT5wYXRofS9jc3MvZWxydGUuZnVsbC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiBjaGFyc2V0PSJ1dGYtOCIgLz4KPHNjcmlwdCBzcmM9InskdGllLT50b3VjaC0+cGF0aH0vanMvdG91Y2hJbmxpbmVFZGl0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ieyR0aWUtPnBsdWdpbi0+cGF0aH0vanMvdG91Y2hJbmxpbmVFZGl0SW5zdGFuY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CiAgeyR0aWVFeHRyYVNjcmlwdH0KICB2YXIgdG91Y2hJbmxpbmVFZGl0ID0gbmV3IHRvdWNoSW5saW5lRWRpdCgKICAgIHskdGllLT5nZXRDb250ZW50SWQoKX0sCiAgICAieyR0aWUtPnRvdWNoLT5nZXRSZXF1ZXN0VXJpKCl9IiwKICAgICJ7JHRpZS0+dG91Y2gtPmdldChcJ2ZlVXBkYXRlQWxlcnRNZXNzYWdlXCcpfSIsCiAgICB7JHRpZS0+dG91Y2gtPmdldChcJ2ZlRWRpdE9uRGJsQ2xpY2tcJyl9CiAgKTsKe2ZvcmVhY2ggZnJvbT0kdGllLT5wbHVnaW4tPmdldFNldHRpbmdzKCkga2V5PW5hbWUgaXRlbT12YWx1ZX0KICB0b3VjaElubGluZUVkaXQuc2V0UGFyYW0oInskbmFtZX0iLCJ7JHZhbHVlfSIpOwp7L2ZvcmVhY2h9Cjwvc2NyaXB0Pgo8IS0tIHskdGllLT5nZXROYW1lKCl9IDo6IHskdGllLT5wbHVnaW4tPmRpc3BsYXlOYW1lfSBtb2R1bGUgLS0+Jyk7CgogIC8qKgogICAqIENvbnN0cnVjdCBhIG5ldyBwbHVnaW4gYW5kIGNhbGwgcGFyZW50LgogICAqLwogIGZ1bmN0aW9uIF9fY29uc3RydWN0KCYkbW9kdWxlKQogIHsKICAgICR0aGlzLT5uYW1lID0gJ2VscnRlJzsKICAgICR0aGlzLT5kaXNwbGF5TmFtZSA9ICdlbFJURSc7ICAgIAogICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbW9kdWxlKTsKICAgICR0aGlzLT5zZXR0aW5ncyA9IGFycmF5KAogICAgICAnanF1ZXJ5X2xvYWQnID0+IDEsCiAgICAgICd0b29sYmFyJyA9PiAnY29tcGxldGUnCiAgICApOwogIH0KCiAgLyoqCiAgICogR2V0IGFkbWluIGNvbmZpZyB0YWIgY29kZS4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWRtaW5Db25maWcoJGlkLCRyZXR1cm5pZCkKICB7CiAgICAkeW4gPSBhcnJheSgKICAgICAgJHRoaXMtPm1vZHVsZS0+bGFuZygibm8iKSA9PiAwLAogICAgICAkdGhpcy0+bW9kdWxlLT5sYW5nKCJ5ZXMiKSA9PiAxCiAgICApOwoKICAgIC8vIEZvcm0gc3RhcnQKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCdmb3Jtc3RhcnQnLCR0aGlzLT5tb2R1bGUtPmNyZWF0ZUZvcm1TdGFydCgkaWQsInNhdmVlZGl0b3IiLCRyZXR1cm5pZCkpOwoKICAgIC8vIGpxdWVyeQogICAgJG5hbWUgPSAnanF1ZXJ5X2xvYWQnOwogICAgJG9wdGlvbnMgPSAkeW47CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2lucHV0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwkbmFtZSwKICAgICAgJG9wdGlvbnMsJHRoaXMtPmdldCgkbmFtZSwkdGhpcy0+c2V0dGluZ3NbJG5hbWVdKSwkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pKSk7CiAgICAKICAgIC8vIFRvb2xiYXIKICAgICRuYW1lID0gJ3Rvb2xiYXInOwogICAgJG9wdGlvbnMgPSBhcnJheSgndGlueScgPT4gJ3RpbnknLCdjb21wYWN0JyA9PiAnY29tcGFjdCcsJ25vcm1hbCcgPT4gJ25vcm1hbCcsJ2NvbXBsZXRlJyA9PiAnY29tcGxldGUnLCdtYXhpJyA9PiAnbWF4aScpOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfbGFiZWwnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfbGFiZWwnKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19oZWxwJywkdGhpcy0+bW9kdWxlLT5sYW5nKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19pbnB1dCcsJHRoaXMtPm1vZHVsZS0+Y3JlYXRlSW5wdXREcm9wZG93bigkaWQsJG5hbWUsCiAgICAgICRvcHRpb25zLCR0aGlzLT5nZXQoJG5hbWUsJHRoaXMtPnNldHRpbmdzWyRuYW1lXSksJHRoaXMtPmdldCgkbmFtZSwkdGhpcy0+c2V0dGluZ3NbJG5hbWVdKSkpOwogICAgICAKICAgIC8vIFN1Ym1pdCAvIGNhbmNlbAogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsJHRoaXMtPm1vZHVsZS0+Y3JlYXRlSW5wdXRTdWJtaXQoJGlkLCJzdWJtaXQiLCR0aGlzLT5tb2R1bGUtPmxhbmcoInNhdmUiKSkpOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJ2NhbmNlbCcsJHRoaXMtPm1vZHVsZS0+Y3JlYXRlSW5wdXRTdWJtaXQoJGlkLCJjYW5jZWwiLCR0aGlzLT5tb2R1bGUtPmxhbmcoImNhbmNlbCIpKSk7CiAgICAKICAgIC8vIEZvcm0gZW5kCiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbignZm9ybWVuZCcsJHRoaXMtPm1vZHVsZS0+Y3JlYXRlRm9ybUVuZCgpKTsKICAgIAogICAgcmV0dXJuICR0aGlzLT5mZXRjaCgiYWRtaW5lZGl0b3IudHBsIik7CiAgfQoKICAvKioKICAgKiBHZXQgcGx1Z2luIGhlYWRlciBodG1sLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRIZWFkZXIoKQogIHsKICAgIHJldHVybiAkdGhpcy0+ZmV0Y2goJ2hlYWRlcicsdHJ1ZSk7CiAgfQogIAp9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/images/elrte-toolbar.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAA6wAAAA3CAYAAAAIcsdZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzExODQ0QkZCNzg0MTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzExODQ0QzBCNzg0MTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMTE4NDRCREI3ODQxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMTE4NDRCRUI3ODQxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkPSkp0AAGrUSURBVHja7F0FfBRHF3+7Z7lc3CEhIUGDO4XixT5cChR3aCjeBpcAxV0KxZ0Cwd2luCcEkhAgaIi7nO9+M3u3l7sjwN0lQCj7/2Wyu3O7M7uj7z/vzQxB0zRw4MCBAwcOHDhw4MCBAwcOhQ0klwQcOHDgwIEDBw4cOHDgwIEjrBw4cODAgQMHDhw4cODAgQNHWDlw4MCBAwcOHDhw4MCBA0dYOXDgwIEDBw4cOHDgwIEDhwIGP78BnD17lq5duzbY29sTH7rnUws71R5+fgw6+CBXDzk/5GzQU/jdCNA+yiMJIJGjaQooCtKEAngmlSvno/v23V7d6r0wCeL91xm1/8VqIIkA9p3yugcoes3yzr7D8psu+nGx4PF4+omyZkl7b4vi2bRp09Pw8PDpixYt2vWpe1u0aNEDfeuoM2fO1P7YfWwerR3ky3qVQ+5xHremI+dg7LmDvwIIkoR/V7f+YPrrx5XfeK6sacPVXg5gSpnm8Om28XOlF47rW8+Hj7VlXDk2rUwVRL/ytfOBAwcOHDiZ5BsmrAWEcusD6w7C/LSMp4jhqDRFg0KFnJJiyKpYRALur7KkFGTJ1PbRsVlVtp5+/nfEyyR7dPtGUyJR01TAsnZ+iEd++J4R+58HBOx9Cmu6lsoXaVVR6oCVHUvAh8rniP3PUDxRKJ7SZsfj6+t7Nz4+fssff/wRh0jrhQ/d17x58ybosBlVkolmBF8NuSDk2to4uUOPSdMhO+k284PEpRZsnz7BXpqdgb8Kk+UDyO23MIm+VDxfDkFBZEtxg1KUWj5MJpM1U6qUJZQKBaVQKkMVcsWh1OyMlfHbA7PzIxeW7LvCT2gjHiUUCP+HnK9QJFDy+cJnIqHwCMUj/zo7vvm777lR54Tab6cDHTt27COKonyQS0Aokdc9SqUyHLkSKpUq+sSJE/5cjn2z+O+19xw4fGPtMdc/cuSUI6z5R33MUg/eyYBxHVxxVsPIlXdgwdDquIaBgK/RrsoReZUip6KAUAPJ79uihPOMLRl/mUpYkdDDkNUnqViRqvGjIPe8ojPAmKYlYOGpJwG//hMJf3cvazFpXfWzhqw+Snn/twpOSFir7w3zLzwPGLTzMWzoWd6seEJCQgKaNWvWMTg4+MCYMWPqL126NMz4nqZNm1bUdvwpWVlZa8wI/kDLIX8UcypSFJLPbmEqnVqerauA9SsWA0mVn/B520NrV7bDgsWFUsEAL2LNTaIvFc8XQfUhawXF7Ev/BgS5tEKFWkzHIJVKITs7G5KTk2unpqbWVkQ/H+nTe2mvV9vHXLAgAoFPef/ePLFwvW9xX9Le3h5bNYCNjQ3P1ta2AoqrQsiDBwFtl1767eiYRv987kbVuOP7XCRzyZIl/dBhKXIOiNgsQ8cxKD3Znw8qFIoOcrl8zKpVq5ZxzXn+sGzZsvVOTk4dLHk2LS1t/8iRI3815xmUnyXVavV25AYxjX7ehBW7Jci1LIxpNmjHY5ML/vKB1WDUxvsG5xt6lf9eJMj/VHtfUGgUdKQfasN7ojawOioIVjQetWfaRNANdlNq9XPUf5xPf/Y48HFwkKIwha+PrsfL6OrC3tZPvki5/hpxcuBQWJDfAQjU3pZEYTzTu/ZD19HomLJz505H/7JloVr16neQX63CQOoLC2H1oBkBhgalisoVVtC1gKchrPg3qYJCv9NMS3spLBP+V80OpHKV0NRIkHDLHA00rLTmmo01WwUQ2LIMzD32OGDgtjDY2KeiSWTS2AR49KFXBr8XLVoUWpUQ5L6LXAgTmpSGGSfDAvpsegDbBlQ1mbQikpp24MCBXQ0aNOh/8eLFk+i6NiKtMezvTZo08SRJ8iQqZPZIKJx548YNqRl54ePk4QVpT28BpcyBF3uWans2GpLoe+g/DYlh18CpbC1bfPODCisB5Bbl+ZeK5wsIHRf5Lq7CkSX8SixydXVliCoSAHTlzdrammlYkCsSERFxxKPH/LZxu8ZfNDmCLl14RUVl/ufi6rrRzc0N7OzsQCQSYYEfZDIZU+kdHBygyU8/OcbFxW3suOKK4ODI+tvM+QYtMRyFyEMV5NLQuy9DJKEKco0QITyESSHmJatXr/5kWDNnztS/DEJhjVapVPboXdPReQgKo5EZr7YFub7onRqh9MPvwKSvFv1ReMVRWTeZrC5evJjG6YbCYwawtIRId47zjHXom2H37t1m9Qhs+Dg8HId++DhM/TjyEz4btv43sGGzR3PDt7e379C9e3eL6sCOHTs6o8Ov5nSk6BtEyHVC36B0HbhEZUWKNFY1qDEe7PoXFLMB6D36Bh99T0PkylnyXlHHa4ZY2ZUrRxCkQaMvz3z+Rq1KqwPGrYrmtbPLtAlTmRrHvE7ldP0HjmXCgXCY06mc7hr/JnG00hFVjKdiMez5o933JFt9lfa+29q7XZqXsd/BJwnhifDUvnt+rbmtMCWKlZVw4Lqhjf35PLBDlzyD+qEtVLHZUP6fu7HlY/18B8k9nJyerRwpLyzhGwifKLylDSfBmEuzv1j6fY04OXx53Lp1ayDq93rh/g65HY0bN974rX5L45UJZ6uUEjY16HNIEp7GKu5FPpUNfTbL695nqy80/ROSnyojWUzq6Oh4BfXTj4wIMCartVC/HLb2778bNG/eHBPW+8jPCf2Wkkd4zu/evavu6el5pqDflZ1uiuRdorARVmsVpem8MCnVkEqCIZMCPonykwAZ1q7KaaBomtGI4uO7ZBlOMZMFMizIsaOL7602pSX6Uq2YMrFNeZh5MCSgz4b7sG1QtU+SSaVaFbCqY8n3/Fnt7Yh9T+E47QNtS2r4dZli+D14sLlvFei5/jYmumZpWW/evDkKCZfdSpQo4RkdHX1yyJAh9detW5fetGlTey1Z9USF6RkqTKvMLtQqBVAqJZDeFYBSqxhCtFs9EptU4/nDDNKjsoGoh+pc2jv8hRHIVcfJVxjjyTP9oigapSFznpCQwBw7tGsPtUqbPWRFuBYR+fMoclHt0u4QmSCHnJyc9wR2fC2RSLA5t+Tp06e7oG1QCTgalGNKBG7yKi48EbHO1taWIb95AZM4kVAAdUp7iKOjX67stOLmhQMjf3hrDjFEHYEPevcq6F1DkJuBPVHDthnVm34o/CrosqopAaWnpxsQVlQe+6EwMGEdjc63mJO4uIPSr7tGSEPvlWZOeIjEEfpEUp/kYYKH3YfS2NTygPNCP3yWrOKw8REPMuCjhfHoChbW3uvHw4bPfgd25gCnC0bzrS8+0ekR2jKtadzO9PXVPWtm3j5Ezx1Fxw6hgnXlqwv7gEjtBzQK6gVUggriM/h7ItC3bUHOor6KoMmyxeptFhDa/oT5h85VsiS/+JAZb2g9zS5PaEfTamVCVuyFQHS519Q4MhTaQU86dzA0y0hPNUmjTYVskYi5rpKWBoN2XGP8vhd8jfY+5FFY9TYexYTWAhJCH72uibwKFWElCLKMFR8cQpNQ8dMKJXhMHpNJGaoHOajZa+sH8EPpInCDpq1rUj+kwogVjqaSSlPDL+NdBAamjbXmNa0oy67SHIjsN30rj4wwKa067S+FxxtAjWS35PQE5thpH/JDdcFJeuiTz1tiZfCxOMNvPvvk85ELaU4b+xGMX3Fqsb21pGeajLLSDrbb0xSd27ETFMiRbBB6bP5ofHnx4sUCT8979+75o3Y/5tSpU1mon5jr4+PjituMGzdulA8KCtpcsmRJGz6f7/nLL79EFFSc55/KSgjUdA81DX1QXB4UpUb1hY6j1PQ2uUq2q2MN9+f5bwhRu/RUcQ6R1mah0YqzLSuJm4qFBLhai6qLxSTud0p8JrIqSk5OLjtg8JDKfIKXsWfPrmjk/SiPW6mIiAjh7Tt3QIHkisBx4yQikSjPBXoRv/Bu1KRp5dlz59abNCEwnCD4uz9nuSwkhJXmq1FBxAOucpVGfpjarwpDVtEfIoM05MixKbCmY8MtFU1hbauaWYTJXMJKasU+/CRPzzQGo5a7ngSP3qHHOtPIJBt2WHKu8KIh3gDlnQCG/1QKlp2OgMOULwj8rXTPlbBjSIHZKbZgwYJMFxeXEe3bt98YFxdXERXGA126dGmPyMIB1LhUZEodRY1+/Pix2SY+lFrJCBaUUg5quYypYWo+BVM7lYXELIqRmPGAgRL1enxeRdh6K82fR/Ci3758VwrLavmNZxqK531Ug/nnEi2KJy+yevg2AbN61NH53Y2m4dCRw8xvP5QmTW58GwVd5AkIQWCVapVBilJapVSxFRlQvjDn/v7+UKRIEYiMjARHR0fwcPdwVanejkwEmGeS0GHFG+ni6uKOTYCZMlOiBBP+o0ePQCgUMtr74sWLg1Qmh2wbG6hVs4bkYVjoFNDTeH0KmGSzpIUlH5jII4L5EncSmMhamNxVEHHywdpVc8kqBqulZokrRmxsbD67i0+mBfHmzRuL6iUmkQi/IfepgaLhKJ6/zA0/JSWFSQvtgIgp9jQml2UcLs5re2shIFYPJIV4Ak8EalKgC8bQOEVD/vAz+vljRnx2yDVUYfW7IASuZN+FGrzFQKrLwOmUjhCaVhHlfz8Valu74QEPi3JbRcuAUojkcWuQUMtDDbIdemVbsCr6ExStNV+oafwpjaoGfQ9B2ng8PVJvmjmEdc6x8E/6zXV4Bsu1ZJUpJ+h81HcmBH+pfkUfPt5FZ+2NVDaTy+R2Pn4e0yMLWZqgNtEGyQo8K56RUIaEFJLSDK5jWcLHFqBotaJwVCgUv415uxlRsh4FFX5YEkDrxAkgrtgL7H2rQtqLMhB5Zv0CANMIqxrJZitbjWMCS0x7B8uaBTJKhuHH58OSjn5aYRng90PRsLiDn6aeaQd0xx6MtijdPhbn5j9nM+e4feo/ZbLumm2zsF9+UW3C6eoVSruu9fT0qo4tXvRNG6OePj13aFSDZt9yXXWwlfQa2Kasq7W1jX6Tr2uDs+RK+Cv4Qb/PQVQxQkND1yM5ZAAqJwlNmjSphtp/NR6AxemMyJO6YsWK7ijd7yN/t+3bt2/q3bv34PzGeSEipzOlVK0s6iwoQtC5chBJ8koq1DAz/C0RsOfauxHdfiyar/n1DGehSXjwRAHY8EdraAK2fAK87Ei/z5WnT58+7d6n/+Be2a+v10iTkakHDx0Ro/SMQ2kcanRrkzNnzlTH6Y3yAcLCwhrUqFEDr3K6xYgAlwn4bURvifxZy78WBTm9fvUODxx8D4QVCEqtadVmbXnANGaYMmi0q3gBIywQUQbSmYODEyKsPAAzbKBZAVRHR9g5HISGuD5N05vbio7+TmCyloINm68lwqSRFjcT8dnhzf1h0ZEHEEyXhW7lxLrfzNWEsBg3btwmLy+vPi1btmx48ODBJk5OTiEZGRns6MyWc+fOHbdIsFDJmRFwLMSxc114JAmpOTQ8S6RRBdaYbmdIVdCwtBjqlXEAiZD0uEqrQ9DjJfMTz45r4R8grMDEs+nUVQ9aTGeaI4gbk1WsWdUnqxg1/FBw7drBkSNHzArP9TFKkKK27Wp7CuBGjJL5jpTUVDrmXcxFVXZmdyWlEl2/fmPjDz/UblayZEmIiooCiY0NSRAkXk7ZNMJKQDNsBozh5+cH72Jj6bt37hwUyJUDcpwdhfS7mO2IzLbw8PCA+Cwl1Ckm5IWGQQdzCCs74IIJIiYfaWlpuB46SKXSfriTQETMZLJpVJ774Q4dhXPIkvxiCau+hlVLCi0CJqPGprP62k98tISo6n87Sr+/UNh/4XN981z98C3RgBqnC9YW47xiNbb62lXsZ+53sKTTVaACefIFoDPuACmpCqT7j8CzdgOaGWnXtJu0ER22kLAqkXuB0qiiO+JyNZ1tIE0xDLJyKkFKenOIynTF6Uchh+9xtyihlARJUwpEVoXMQn6U9DUos+MhK+ESCKyKoA9B5Qr9TtP4/VVgW3Y8vtHHnCimtjO0Vp51JPw9vxjvHyENlYXuzhqZ75/k9O9Ku/ol+xWm0dn82MPKWjjUWiR0zpAqXNUUZWUntppTMvhpcoY0Z/n2PpUTCsVQPeJuqMlm0gPLDni8ntQKZvgaE83odABPGwAx8iz6gwvcuCHoAiYSVprOnbOaV/jYOsAveSZISv0IKc8jQEgowNbOA2ycvU0eIFIh8hhwaB5DCoMadYWAg7ndWpLSyuDeZJWVTgaj8rEmzcfiFBFOrEDNHIXgqOtICwo1Knrv9fbx9sNTc3C7e+/evXMHRtZv1mH5v2dpivrm62paDi3CZDXyXQZcfRUI9nZJkKNQwusEZ6hb9E/4oawnU4IaN278Xi7ml8Q+ePBgskQiGYQH91NSUjzevXv3FJFHa9yfUYzSisJk9Wnx4sUlSP7Fa7oMWrhw4cvAwECL7cJPPcrsrFAot5YpIpSkZ2VDxJtseJ2cDWpUSN3shVDe0w4qeouLXI9I27ru1EsY0rK4xaQVWxARhLaMaKeq4KKaIqUgNFpx7nPk5+XLV3s2a9E6sJJbTLljf3nA0X+lrtOmTh/YoGF9B6zsAo01iz3iD40jIyP77d69W8Dymu3bt3sj2TIQnRdB5f1f7eCh/5mz5zscC97S7dISd0hHPj9PX+3epGnrt7t2bFyF7p/3Ob6jcBBWxsQXF0Q1uLl7MkIQoZOKtCbA2lEsxiSY0gwNKpUq7ci4hYQV8iauNJ3boJoq9GEhUadVZUc3iVzyW8NNc765X1Xotf42dC9fS1+ItjjpLl261N7T0zOqevXqbnfv3i2B5zjGx8ffzszMtHjBKIox3UJCnEqJnFrT8As1aWPF1zT8BE2AlZCEhDQplHEUQGU3e7j0L+2X33g+Ngn7x2ICeLKoI5T+/YBF38WS1eFGZDU2LZe0HjE30DpeQj6fZy/hg27wJCE+HifPxOuL+jBCUflhm/ugvIkd0LsHHuUCOztbPCZTz4zqURObj+K08fUqAufPXwCKVA+7t25oevXxe+3VamohyvMW7u7ugM5RHhEgshK7dV971wXVEGXw0BrpppJMLekpjk6nI5LZAcVZPD09/VJSUlJ/U8upPqEkSbIDJjPo2XwRVv16mJ/6AqZpJQ3GC76X8DG5xmUsI+YEyN5uAFKRDWJbROKsbMHeqTHwBNYavQVun2ntjmOERjD8gMn2p+JTaAlr+RbuJZCwbI0ooy9k2yciyXwHao+VsFEzsIDvqWbZUChtRamkoEBFhkbfo8zMQKS0L1g5+2uThtWwaoa5Cb4DgJo0q1/Myx5D30QYH1etugbHx9SDm88104B+KOEEg5Ze/a5I65fqV5iyJcjM4avs7mSplUJarW7OQ4HnSKmbFKFOlmXycwpTuiy/9IZp5wY2KAF7b79l5Js2Vb1BwNMQzMhUvJ6Hxoy3mQ+zPZ5Zo0NYQmLNgYXa8ojDS0NNfnt6Gtj7tQB57G4QWhPwKiQS0nNQFc9KqWxq+EUEx5jj2+xW6N3ljPbTS3KC8TO2NMjLGsESPA9/yRyLl/TWxfny2WvGr8dkg90EoeeUYQWeZ45OjgxZZYkxpe37aSNt67cKJKDYMUN46HtsbBJALHBC5QjJuMJXEJ+aw8jrBEnbseS0y6anrnxadBmdunfpTZcLHuBjcUajtp6Mi4vDiUhguQSRHwmSI3R9jL+/P/aX4N9evXqFyNhlGskHpKXxHbuT5qeQK1eU97KSxKZkw9lHiVDEXgA9GngzGvm7z1LhWGgsNCzjArVK2UnOhcSvmLv/4YOJnStZaB6AQmUtHlClzpHTEJ+phuuPpcEJiaqhBZ2X27fvGta+fYdxfRsrfeYNdQYrAQU9m0tgz4Xn8OefCzr/FjCw+alTp96ivJSEh4d7I1kSEH+Anzt3BmwWvGrVKti1a1c5b2/vOVWqVHnZunXrnCpVqnlNnjTdbnRHIZTwpplG5uIyT+gx85xn4yYtJz18+FBQqVKlWf9NworzTZ2rLCV0J6AxAdYKE5oDzfyO1epKJWGWSTCr4ueRWmECPkxc9YU4cwRrAe+9EU6Izsi99tOaAON3YAUd9llLgOetpqamrpg4ceKfM2bMAFSYsNnp5hUrVlg87webbNFKLFhQ6FyTMWormhmgFGiV2jSSMqz4JESn0JAVJ4ea3iJGI57feExZrMWSDuFTZLUIklOnLTsM2BTUVPTf8nATkq/6lSxRAuL1RCCs6UTveKvu5OB/rs/u0pMQqFA/JqDBQq0wRdFqFB6PWVkTy3hCAaHKkjITIEU8coGzs/NgvNgTW4RjsgDKli5FvHjxMhGVLbw4waBPxcEuZITJJTp/iToIPId1RkpKymaBQNAPD3wi1xgPvprx6lVQWcfzYrE5sEWElSWq+IgXssImsdjhPY1xWTHY29gEZGVlEcZzPY3nfeZ3DmtGRsZ7Gk9jh9PbxsbGovDZExwPq13V16yy82TN1eCyhFWizgZZhhBkcjUo1G/BsWgMuKAkEVoJ9Hig1hwY8kVY7ZBr7+7uXvl0YExeVBB/S2l8D77XMumHBL7YDRz8B+mIKRIvgVLEgCrtHNDqdNT+YJeBzrPAymsygNy89mXG4XCT/Fojgoq1r+z59wD9fXg/1a8smfx+M/Xn0nVm9Std9u7lecRV5a/sVQr3ugxr+vmva2NRO+GQoUj55+TIVkylGLL2riDVUUwEdy2v+FppUydor5PE2lrI5/OZQTgsE2AZBa91cOhONLSq7sdoVbVyrUGamjy6pU17HmnIYFNQs9pEPgnsS7YDWczfQApVILDxATH1FgIzflMeC2waZc63TGlbDgZvp2HKif26ETVsZaBtJhiwlgfGfpagXuVH2jh9dHFiP1PjjIT8DRRFR0efs7KyaorziiWqOvJKffuEFX1HBp4dkpmjgFTUl6jpbMhC9TclB/XDeDU0PGBJQQarYZXGvoWmtcozppIXI9Iu/2/OzYYnJ/1gUebWqlVr1tWrV61QHzYJ92N4AByvi/H69WtAsgheBwRwneFn3wWHhOswsE5FIjvp/sz+K/xfmTrv2kDGUCt7lfUQF03LlMOpkHiQy5TQs01JXVfbooo7hL1Mhsvh8dCyqidU9XMoeunhu17op5kWpS0uH+wUaj4Nt5/K7kU8kTXz8BSkGtVvlA2Wz7VGpNNtxYpV44YOGTA8qKetKLCHA4pbY84hsFLDot+coMWEtbBj+0bbtNRUgy3jcPqOGj0a1q5dixdUhKSkJMbdv3+/+KZNm8DVzQOqFpPCiM7YEEOFGigCfNxpOL7AA4YseGrbokWrCSdOnaJatWxZoKuhFRrCqlJTOsaIRQpCM3Sv0brhUSugtY2BmslwLHTIlbRlGlZW7NOONhprVfV1GKaSSbbDYVeFZI959S1YWOUT75MFc1C+S3kbR4GsjHW6RwUkuM6YP38+U7D279+PhMycFT0DmkFM0tkdl4LNn/ujGQlXM0IFhVdtpjQjiDhPsAmXVmLVNMwiRBxIDXGgCyAenMeDDicBPysBRFbW0Khycdh/7y3U9BDCtZu3QSwWfzayihHxLMSMRj15mEptX8/dTlwyTa7JalZAS0tPjyCUGXi0jH60fHA8LhLDlvSyqG4kBk/knwrWnB81+k2elDw8hc+r6Ojo+APbuMlQ+2FvbYXL+yuVjBdoShxsGcSj+6wGE8+TRRiD6kA/lO5VEhMTMXFdZkpd0KIfLheowzlkabugDSsEEelG6IjNnPXDaoTCDjG3vzAhTkT2X1hkGozJNJg4hxWRZ7PnsOI8wURUS9QLdA6rjrAioeB5sjUkZ1iBSmgNjl6O4IhIPF9A6AVK6BIzH4Q1A7nDKK1VZaYfri4mRYB5jAIFOtBlLXjZEFCn0b1IlPdH0X2dLSOs6O3UMqByHmrIqToTEaY01OakMteItWr9MWHNRh+DhDEzP2VWB0Pz36mHwhk/fS3r5IPhMLtjOQMzSHzf9wRT+pUxszfC0skDYdC0tbBh5lCz+5VS1jUmFfNXuo3eG37qSVzGlZMjf8iQyxRYuuYlRL2huiy5Lnb3cmpW1oFokKwWWKFmdfjXSItGQYd/KVOm7GZbWxsSDzx1qVuGkQnaVvOBA7eeMYNmh25EAjZ5rO9rg+VB0C7vYdGALStv4DDuJwC0lk0A+wodEFldA6RABYoMX0i4FgLp7Y+BbMNJs21acee3qe8rgwEbkni/9SH15C4ynxa6XyNOFrceqbtmZt9dW7F8uS6IuOYOymAZhlL/J+or/qRMGQWv3pUCSvQIEdYcSEv1gdLuuXPxXXqvc8Oa1ZpeAv8KbjxIz6ShjAO4XInJmIt+bm9unDdu3LiH2ns35CSYNGF5Cmv7kP8NdJyG0xr1sTMbVlHWKcJLNph3HXZ68wZT510b9PcyRW8BaQW3X6SBVKYANZKBUjIVEPoyFSRWPKhdygUalHeBfddewP0XSdC4ggfkSFW9LSes2BJYW4dVBJI31Jiopporp3xiYL7K8BFjpx7as7HT5t/doGtTPtCo3SVIHpy/S4OdNUDNygSM7WQNv69N1GMsWn5RvjzUqVOHWS8E84r3uFRGIswd5I7aZzUcvkRCpRIAvp4UOFhTsGOqC0zZkGr9S5dfJqBb/4uElWZsxXEWTevuZdITgesfg0pFW7boEqFXHAjdoKOOzOrPrzBnDiuu4HgwGDekmH9/aFwYhymmcxtdcwXjal1GBCaIfOciMYtH2aOun6J4finP04+e/HeGu5/3gm2XnAU07bfGAyqtqtZFNfF+8PKFZuUGKti0Qq0RLpBjE4fSiaoUQ/KFeI4xM4hAaImambmeRzw4nHYVXeDotTioVLY4nLsZCqmv3kAx7wpw7UUqjOxcFa6/vGkWWTVeYIkhFlnvk9UzF4/C778OhO7HTVsxfUv/xrKe6+/1OXvtzoWA1jXFMZkEowV89eqVVKlSdLm2YGDW564599YNVdaftL/zmzdv7tra2BR19ygCxewATp+6j+cc9t2VcCDdlHBYwqpdYIk5x4tGIYExDecJ7jwQOTRpXhMeDcWCJjYH1hJAiwmr9r2WozrSD7npmLwi9xLLfCjcpej3juaEh96NyEvzyc75zO/cUm0YeP7qX3nNKc3PHFNjIo/nsLIaYpxOeX2PmQSSyf+KFWuBMw+1ySHngF+/FfiVbABia5GeIKi/CABhMWFF7y1Ez/kix7spnwvsKsGYtD7PdINyVmcY8zB8DxJghBYlFF6ng1IhkpSo0aQyGtU07XmqVrOaoSOszFxWM7OfR37Yj0cYCtjs9fe4p/yn+pVxczfq+l2RgIQBU9aZ3a+IFFk/dSyjbrhNJe4U8pr6CXllSHOkKFw1gdtKl6V3XcqLYGMnnxyX/c9pPCJnCmGlTRz8MfU+KFGi5FonJ0crbH7XuV4FcLXWkEl8/LFiSbh4L5zZquzZs2fQ0K+KZpEkbMqr1gwqmgrWqowlu3fiAOq+Gw9u9duAIm4D8IQ0yNJ9EFm9D0+bn4AqEvPC1w3aHDHNyiAvP0vxNeJk8XpN/dTXAF1jAlY7lq1Y9SyrVaX+I2QVVTw7XAzSpGqo7D4Rqr4aA4+jXkNaw0XMwpJMy08Sdork9Ee1ynm4VfIQwt0nGeBmJ4TY+FRIT0y2SPbB2+qVLl2axHutYzkCa1RxHUGyxLRFixYx8ztvBrdu4O1ao46tveG8azsnT4FFfalc6YlthV4mZoAK7yCgVsK8/SHQukYxqFzcBTJy8NzdLFCrKHgZmwr8SkUhSyr3tLgdpPRaCh7NaCe9iwr0KWq+egckC3p27NhtUuS9051OzvOAHyqhr1PhNoCEBdvlMGN7Krg5COHyCmcI6EzAiVu2cD4kwyCMNm3aMDJcw4YNoVixYkaWhyQEdnWFalUFsPYfOfy6PAnKFrOCtb87QoOqNAhQZAsC7MHbXW4zeaPw1YixE/6YPXtm8H+GsOItbNTs6r8oq5Zf/7gF48g661HBVjF79pnTm7GCqPE+rB8irqwAaqLwxXS2zJY5hCaAD43m4fewl+RqX80R9jx7LQ6Ip+khqMevoVDmPBMIbSaTJG/QE3vv1tcnj75dvN+KyY4ODtdj4173iBW4lyRIXrBnjwVZMbvGrTE1DtwgqfEouFqtNd3CKzxqVm/gM99F6jTTJDNBRrMghLkjv3nFg8No5a2C4zd5cD/8ORy98RgquApg8/kQcBEooWUVT9h02nQTsbwWWMpLs6ojq23rmjUGu3Nw9Zvd1tyaffZJSlCFYs78iIhkPPjS/1okFZnfhsdUXJnTOfanOcd+iYuPP12xpLf4fFQaXop9ufLN8xsQFGSS9MHOO9WapzmwW/0gjMZmT1FRUXgLma3mKBHwNjm400lMTDyUz098id6vKias6B02a983BLn+6H1fmj06ZmbX/b2Ezy6cFJ8+E+yKO0L6k1ggbQ/Cs5htoHqT88GoW3lft2jRJdRmCrSElfjQKsFK5RGWsFokjIACmx0goqRK0RLVtFwzYOaYmUtWKZmmBzDzUyYdCLfY73uCqf0KQzzxNGIL+pWHb1PHHJfY33C1Auv0LFlp5BWpUsrlSF5gOvKY5NQyLuWsBRfegPJiVPrYr5UWoaEhQ8uV899sZ2dvtedSCHRrVAW8bJk9UeHc7TDGLBgPGOKF+oRk7gC6RABmbSHF7Nms7QFS7vwDdeARKImiEBu2EhzdhCBLKQZJdyLhGSKrDiLzw9eRRz2LAgzWyiBXxtNYGRhbI8w/99pywvoV4jRG2JphqT6LLqTqa1UtSb/CN7pEM+sVPHz7GyOf3sFTXIoIQPGoG1iDFNSlp0NlyRmiiFtft1JeYh1ZPXfnGdx5FH1e+jp1kEXNtXaQl93HHMsjeOoMu0PCm+MlWkp8qkyx92tmMO8aL8C69Y7cotWucnLkDI3AdEKhkmssONF5vXIekJolh0XBD0Cm0JB0FUEBTdCQJcvHTALc9PFyz9nt4TC8HHnwIndxBYvQpn2nxlTSg2b/rvKA4nhdQdSfJSE+OnZVFuy4kM5EGpOsgIl/C2DPTAnMGWQDzcfJID1HzgwQ4rnZ7dtrlON4TRy8F+vGjblKnFplbGBMdyFEhFMwbSsmuiqIfJMFHaYoYP4QFxjUms9Y0AzvYgUli7p5d54+E+85+98hrJq5qrROsqrr1fvTDTFqhdVKGvTV2KZUBv3G7GNjo+xKv6YKYpjYkkSu6Q1JfJiwMveiTsin7zLtiAu1xoyGZCxqofvE/DOOMYW06xK00E5kOyE5eMptTWOpcn4Z97pfRnAQHuEK8ey+sA/B42EzCZPjoBUqRqCg1WpmvhGt7RHUlOqDRYbCtYIyT/bOKx5mhWgS1WaFDC6HPYfhzSvCvWcxEHLrGrQYPBEqOtNmE2N9gqp/zC9ZZbEnoPbsn1debU2pS9VJTUlZHiNPPwjBXb9or3V+UpsrLeefnhD1NmHRq5evorNBOeN4UFdzWtV+eOsaRAgvaQdpluJ/2LQEkddlqBNZjvLGVHIYhJ5rhMK5rNWQYsLawSKm+lITJZ5Xi8JjFn7C74ePOGxziRLWsBprO401oOy8JEtbM6xlz0uDy85dZeeY5ncfVjYeNmzjo7lpw2pY5YoUkMmTAX7koTY2/pP1LR8mwenI7UEu4COrBAvQd+xBziIBiFZQqaqcZGtlltAWKFuSppFETiFmQLugdgcPYCqAJjVHglSDWiaj0TNm6ViXdjUUiMfsDYflyI8y8mPvY42vsN/3hC/Rr7x8FPloj7TEuPaV3ZeM+MF28b+rz5W8/iTRU6mmxEPWnPu9urftECAo+z0P06e/y8g6+pkHiz6Iu4t67o4buORM2eKlE/1KlCC3nb4FgR1rwz8XQ5n2Bw/09WpaDeyFGkLGakgFJJZJTG/WmVVVtfuuJoZthEYBG+HJ7j8g6sp1EHlXBnVWMiS2PwkuQk0c5obPgkeyqz4b+uV1X16DZJbga8SZdxobk9Vv33yCpKk3tFrhPaPT4dyJejit006C8PkwoLP3QptadSDrUWs482QZIqut4NSNSLgV8vT8q4SctnBjrEVrqMTExISEhoa6OTo6SipXruyI+0tPT088f3LmpZ3ta0m8y822L9HGYN41lR5ObXzgmPgmlYqxiLDKFDEKtbqkp4MVZGTmoPxUMfXmj3XXNHmqXdwVK9SKeDiDVK7EJDfG8oZQQ1SZ0w9vdGIxaf3xxx/pSwcfiBwkKHC1CnLkBPSdlwUnb6eCg4Mj9OrVE5tYw74rIbDlmAj6/yyAkR0dYNbORMZitVatWlCzZk1deL/88gts2bKFWdBTLOLBXERwrcUA49ZmMovjtWzZktm2cdu2nTBsWQJ6c1cY3Jpk0swW3ScSi21ylNICKZeFgrDimcVqimZ3dofrb7d/9P4axRowDQPen5U2g72whJXQM8v6FHE1dQ6rblubDyj/9Ocu4UpIEJatsY4eK5mhynrCXtvyJWXQO9/WvT5F38Z+GQA38HWmKvuJPd/OnC0BrkizsurbFCvLrOTImG4xScwHuQpzYIc8H8K/EZRZM0Tyjued5seLYS9gbKvKMKSRLxT99R4Ur/wTLKjPR2TWvGTDmsKwZ8maxtDJCTydiALRrL6XLxT8EhERsTJbrpr+2DyiWGA4Nb7FCtHSy3WFPGLJ8ZQL6eY8e+DAgS1gtM+WmeXSgLCacW9BCIpEAYaFtbeEuYs5sdDuvfvZ9mE1iqdA57DiNhU3pxNa/Wtu+22RVgG1rZURIe2BXPHGLj60kBCDUuwF2TaJAO6bEalTQqhSWQwJmD+g8Ctbkk60TL4g+u+OtVBKNUUpYfvJkkFcxaYy283qRD+wSjD5kftI+O5gUr8yd3x/5rhkcn/4beZms/sVbPaLDisVUw/aNapQZFaDEk6Lm5SwZ0ZC5WpYGJ+pJC5GPF8c9+jBvMfBQYqvmSBvN45N8Zt2QJGVlWWFB5i2XtPMm8eLm+C5q0fvPNfVLxbVOpQ0a5FGXC8xEd189QW4Pk8ExeNj4Fu5PjbZhOchz+FywyPAe/DM4vAxroZWgAah7/ub6mcpCotlg+E+rDQj2H/ryJFK9yzbHVKHIsiKeIVe1F7Zo69KLyt+JOhcvo61sPQYJMhGgE2NjdDw396w/O4cuHZXdD4mRWUxWcXo3bt3dXwMDg6ejfrHSeze4KWcU+uU8ixbR7NIWO6867h/78LJly5bl2/cM8DSODOl0u3vErNnVPF1hGdvU0Ch1AxozOn/AzPHPnDtZS1ZoqBmGXeIepWKZHjZdovLC80sAZPbOZPv96cWyDU6zP1zxp0Wdx+GjVp+q9bmqU4gU6gh8pVmDLZJk8awcuVKOHToEHTs2BGmbUmDBlVd4I+eIkRobeDu0wyoUKECXLt2DapXr44VFswAj6enF7x+/QoGt3KAJvX48Nc/Sjh2K4NZU2b58uVQunRpuHPnDjx69AilIWo/hGKIj+fBwIVvYejwCS/mzSmYqaz5JqzNmzfP9zR2lIEvFSrKt3oJa4ZMjv5xwyefcbelUMPAZGyqOY03Dt9J9L5woT8hnz0nzNCwYg0D3tPMVQw6UmxMpVnSmp8RPlSYb9gIbQJFXYJmC/mSigRJbKAopW4pbHfF89/jhX4bPLsvHKRQZYeJrOwC0XffMCOKeZdO7MOCXRUD4lehCwhIP7C3UmqJPqEj/gQzimmHR8MV+Y2HcKjLkNKoxZ1yhfP1/T5UoT+Jdnp7q2LzBgy8v1dBklWmgR1V7zV02dvpS2tWjXH4enxPc96BIAgozLhy5YrFDfcHiPln/eCTJ0/iw19aV+DYvHmzpUT9k0Dt0uYpU6b0t/TVLCCsqNlUrhcKhZvOTIg3pnzIibAWWpKSkhKM2rDWlrxUmYlhyz53GR2xJ9xiv+8IJvUr85ev1+tXVJb0K0wXkRgZuuDsi9uX+UVKdHS2k3QgabUgIVt1WBUXsTeLcrlnJln9bG0GJjvzO1eAdSFSKFsU9UvlfEGh5TvGvOdZTAKTRjKZOYRVycx7xfNhHz9LgCXr1kDNsr4gLVoZ3rU4BzVFGmkZk9qX7zTTQGQWmDtu+XM2aDYj1PTN/adMZvw0s9w1/thvM/LLXbBN42cp8rJsMMXvj/1PCjQP9ddR+S+QVYzlgf8bl5d/1lHoQUOPnbQ0DF3cAb5tExCXGAqC+xefxqQ0zRdZZbFnz56pqF+YiMss3g+eTr0LLuJ4cCvf1nDe9ZW7kFVxLLyKONZvyJAhL9atW2fRNioZ6fIdh6+/GNq3eZmi/6vhBYdvPGcWX9p9MTK3N6KU0KJOWRDwSNh86vE7qYrekY9Kj0o+qWtZiAKWGO3t7aPCwsIuNG7crNbWo3Lo30UMk3vaw+ClCkREr8Ps2bPhwoULmkGzZBlMWJsDe/+0gT8H2EK7qdmAVwHGc1ax3IwXhPv111+ZxR5LeYphSl8riIyiYdY2bLZIgUIug5kzZ4K3dzF4+iwafD2s4LcOYlCrSBi7IgVcSjRST544IaTQENaCAMqzw/O23y+Nqn6dedtpR5wQDCnBanjcGOgdQbdXJ3NDJhBkhKnxKFWqNT59lwWY1RiZaEqLRK81lYaYFjZthnnue0Klgu7JFxI7hULbQNSxX1VRqv5x/0zQaVjvBa++6tFjfn/UKSwQCGzq0RR1G/VZPc2I4oTWGeDpW9Xl7jNvl0JV1wN9Qba+xQKmrhStzrKXCMT5jQdrzPE+q+xqu7SJW918CD+U1gxDbD0aQZ87l7sn8/blI5ijdoElukCElK9MVgvNO3D4JrFs2TIspIz7UvEhwhqNBJO12dnZ99BljbzuQWT1CSKrh5B7XhjTrPUPhnPm9AcmWT/d/tx5/L7h+yleX6pfYaAlpFe0bmxhTRS5QolXTaRR+SbCXiUY94W6I9sfCkg8Bdj0EW8cPpaacPi+40IBm92c07H6REg0Cp9PmBc+CwE4asIA0I3Us3763yIER23vmv8xgLwsG0zxK+g5pvjTKL1tbf7LQCXDhk/YgFQqAZGgDijT1aBIewadvP79488bJwrE7hP1CZSHhweBtXf3Tm+A6mXFoKQ8DeZdv718h37m1JkoZV8EnJ2didDQUItHCtaMqR/da+7ZkSsOhmwNaFdR8nODUnD90VsIi45n5mL6ethD3fKewOfzIGjz9WyFih55fVW3aEvjuz7Tq5neZbPPkU8VKlQIWbx4kWzi2KFWNcrxoX9bARy/ZQsHr8XBlClTDITcA1czYPMRAQzoJIaBLR1gzbEUCAt7BOfOnYUnT6I01lyo05oz0BGc7EnoNycL4tPk2r6Mhp07dzLnPJIH8wa4grcf6td2yeDaC1c4fWZ1rI2NzdsC44r5rWCfa9/MfH9YIdccFTYUdB59LP0tjYvLUw5fs0z/V6Bfjz5XGn2JOL6XvuRbSL/P0d5/D+1/5VFbo8/O6OaSraIlKJ1IZiEq7W/22k1YcfKJEVNFn0+JhWSmf8DamKi1AeVNDf/ErD4u2WqQqCmNWocdMHGyyh1AwYst8RAZlvAhs2zA3yaHj1E2kMhXBkcuNH+vyf5bH9LGZQObrrLmucZE2fjeTX0qFlhhavrn8bM4nvNT2zRrPPPoWex3cVrbZoWxrue3DiXtg9XJokYBThALsuQnIWoVhCGXmJ4C86pNYsY/CgRBQUHrU1NTB/xY9BHZRTvv+t1LzbzrjNgUKkNq1fTAK49dUqnUTaFQbDp16tTg/MbZYdqRzpSaWNmlUckiZXycQCTUTAuSylTw6HkibDoZFou+dcStv3vsLyzt9ofyE8XdMyQkZG2t2g0k9f0Bji2wg5g4AhqOSYZ3KcbjCiR4OlvBleWO4GjHg9rDUiHqbaZ+LNCvmTNsnimGVduVMGJ1IjMHztCEFN3T3Ak2TxFD2BOARqNioWKtRnDh/JkEVC/7ofc8aW4anT17lq5duzbY2dkRHGHl8NUIKwcOnKDPEVaOsH4fhJXDh1Fl9JbflEpVR4IkqgJNWH8ozzUkDGRqNXUf3bsrYvXgjYUhfIzDz2maog2tCXSicB5+xr+3L2F+4fkacf4X6roZ9TTPF9k720/xo3f0drkCFvoNhMiPRZXfdx02bJi/h/Lyw/EDAvhAqiHk3CF49eY1/CurlLpqy0GXnj172qSlpXkeP348oqDSp8mI3SXUPF4P9Pl91CrKAy8Gq6bVcSo1vQ1Aveveun7PC0tefig/UbxO6DBn0KBBQzWr+5IwpacrzBougg3BchiyNNHAjF1j00JC2x8coWYZEpYFJ0KqlGAWf8NTHfH8+rr+VtDnf44wc2savEuWvjfn0c9DApeWO4OzAw2tAzPg0kPNlkSnT5+Gxo0b4wU8fyeI9we2zE0jjrBy4MCBI6zfKWH9r+TDf7m95wgrBw5cn/W162nsJnDFy6OVGlBwmtRPoUt9R2lVX3d+TX9fMkWpyjj1WPAkVS5cf+jQoY3fe17mlZ/h4eEV7t5/8OvbmPhf//xzNi8nM1n7iwAOz3SDNvV50GVqBhy4mvb+8AJ63aKexaFfv97wv5bNmYXf8AKxISEhsGPXbjhxDCtJle+NS/BIEnZMdINfWvIhcIUUFgUn6X6tW68JdO/RPbtoEbel9X+sM9/NzS2r0BNWDhw4cOAEfY5ccOAIKwcOHL49wsqh8OWvfn6OHD32t13bt/b1ts+p6VtEDRIJD/2uWdwJb8LiV8QaJvUSwetYgEZjUiAmWbO3Ojt/vWvXrsyKvx4eHhD94jVEPX0GtrY2UL1qZbCyEsHBgwchICAA4uPjdc8A8KB/C3vYNEECr2IomLMrBxRqhU49j6fDp2USEPkGxWRd/J+JE/9YOGjQoAccYeXAgQMHjrBybTYHDhw4cH0W1/Z/B4Q1LS3Nt3fvAROe3D08ZNEwV2hWXYAIJuTuncOSR2zerAIQimjYeJSGX5cmgEq7h3Dbtm3xVkLMNpB//DERnoScBU9HGWTLALJJHxg4dBT8OnQgnDlzBjp37sxsd4NREpHgi8ucwNMZL2ZGAJ9Pa7fp0StniCwnp9Gw+ZQUZmxPvzlh2swFUyZOPMgRVg4cOHDgwIEDBw4cOMLKyev/7fztNPaP8UOO7VzY4sxiLyjuRQOtRPmMl8b+UFYjf4WchIYjU+FmRAa4urrCjRs3QGJjA21btYKfSkTBqG5O4OGo2VP4RrgSxq7KgE4DZ8LECYEQGBgIixYtYgJaPrwIjOzJQwHS8MEI1eidkCOsSDh2SQ2956a82xl8cF2rVi3x1kBmrf7PEVYOHDhw4MCBAwcOHDhw+EYIa3hEROpPDes5/DNeBI1q8oBSEJCDyOjeC1J4FiMF0oif4Us5IqFhLyiISnCEd/HJ0LVbV9i6ZSuMHPU7UC/WwapAJ0RA1aBSE4yWli8CePYSoP0MJew7cQ34JA01qtcAaxsJOFtJ4YeySijiQILxp+FLPsmHVnUlUNsfmwfTwBOTMPmvDLjwpipcvnj6oVAorGzO9/K5IsSBAwcOXGf4KXCDkxw4cODAgUPhwLLlqx3Ke0mhYVUJUHKa2RJr5MpMuBLtCR07dwJrsfg9IilG3XjXVl5Q3r80tGnTGur9WA9ypDK4dukk7Bxty2y2q1KTWqGCAKWMhpLFCWhSXgaHDh+HCYEjwcvLE5q3aAGdOneBa9dvQ052HuSYJJl9XNdO2wd7p9hAgyoE0AoKhrS1gd3jQuHh4/BKNapWMet7OcLKgQMHDhw4cODAgQMHDt8I9u87AAOb2DMmwASlhreJBBy5ngU7gpdAyxZNP/rs27dvIScnG9zc3CAlJRlIVQoUcSSAUvEMiafW1Le4O8Dz12+YgWs7e3vIzMyE+vXqMu5jaNQkFvZduAoNqjsCrVKDuzMBLjY5EBkZBV+csBbWhU04bQAHDhw4cODAgQOHbxldj5fRCdp7Wz8hvpe4OXwcrm6ukC17i4iYECiaBHtbAryc+bBu/Wbg8/kgEAqAzmNTYkcHe7CxsQYrKzGkpqaCg70DUKQdJGVKwd4Ok1b9Z2isLoXYZBrcq7kxPnjRJfzMu3ex8OLlK1AolTpiy4LkkfAi+gU8fBgG3XpYoWBUDP1VqwEUiBRLJDZmf+9/XsP6La0UypHswpOPXF5w4MCBAwcOHL66/EMBLG04CcZcmv1dxc3h4xg+/FdYu2A0ZGZagw3ihPbWAKtHO8H4dQdh5IB9wOMZzi1lxFqCB1kyK7Bz0eyzevPmTejXrx9UqtkItpz6B2YNcwJSTQPmufh2ngDgXRwNZx/yYNPUlvD69WuIiYmBo0ePweFDB4GvTAaBQMEQYwMpHT1MIXY6sIkd9GkpAbVCjcKiITRcDSlyB6hcoVwGR1g5fBXiZ0zw/gtbinyOb/geifAxF9shbZIy13G1zxCNZxyhtQXtSALIuzwO6qr42P3lg/YK3UAUjApRO3x9cXo7blSFA4f/OLZu3UorlUoYNGjQd1vfP6c8YUqfjOOvM3EvfX1OV4jPAWCVVpT2d/aafU187W0L8OOkPXBzXjfCUhmg0/5SDAtQKyhITk9gjp32IT8UhJP00Cef39CrvMVlxtS4z52poEkIUu9hdP1yB10g5XXQjsf5yvwPpcHXLlMlp76tXraU1dpSRYTVgaJAn+2FPFWcuzjCrdmnwujercvD5UuXV1p9MB7G95OASkZB3YoEXFjqCtlylS5M/DY0S1jRVZoUYNTSF/AwJweOHTsG7969g2lTJ0PrFufBZVsyDO1kB1ZWNDOH9clLCn5dFA8/dfgdqletBLNmzWK0sump6bAx0AM61LdBIWrJqhFj5fFosBWTiLhSTNxqNQ9mbU2E+j/1+tfPr/hfHGH9SpgwYQKoVCpQKBQgl8sZJ5PJQF1/PntLcV830SF7MVn8VkTWMnQddCTQ77NXok9VnBFb3pasVVLyVFum4fExzfuq1Wrme3BHib8JH/E34fN9+/ZxGc4hT+wF4LXqVlF14nR01a5p2SHYr9FPxdfCnjCGsO51Ftdq1bTkrRN7wvhdUTEriDgHbHs4gcfjz8XnSpXq9y19Ky0pyG86NQaceDbkEFSXaqFaUh01yjxUre7RFH1PoaLWtJoLiZaGvaZbadRXUe2Qk6s7hurqHXvUd7gOsse/I8WmE+N5T/LybsTjQzMhj7RXKGmlWknjlsJanqpMk6XKZ6nk6qzQHbU+2hjRERvy/p3QzoGhc7OX8P9ywnbP9XeZ99o5uIZFcX4pEzg2HtxG72kV+VXJSLZIREvkcsL4/FuN51vHyZMn6aSkJPD19WX6XCwXrFmzpglqFzalp6efmjx58q+F7Z27rb75GomtxdC7RgT/Vrfcx+5t+fuqi3I10UimoiNurBpe7lvIEyz/YJD6JZaGXEagR2BZ7oZlwPxALadgZatxDNNITHsHy5oFMqaXw4/PhyUd/XQk+fdD0bC4gx/zQqzMN/Zg9GePO52ygguXAYJXrTZ4tsvwYQWa9rnfqtk+hf1eVrzF7zHjcDhMb29YlLBfYUXVStZ7qxYV+NkKCJAqCDj1UHqusp+wGSKrZ8FEGuDs7NxpxozpvYYM7DXE211QtHsLISqEBAj4FDjwyffux9uukgKAhHQaQl4omb4aa0snTpyIB8bgn32H4PcxY2H/uHvg4ySDTBkPXqY7Qvuu02BG0FS4ffs2LF++nMkDPHJxKUQO/f4nRl29JiOI96LU+JNCGtUFEsavToPQOI/jF3YFTkfl9J65fMckwjp+/Hhd9USC1XtCFOtYYoOP2J0/f97szkgb12eP50tBcWYkuHZgBhKWRb7M6aBWqfvV8redjgmrqWEgUjna39NqdESMDBPdZZLIVQVGKrVkFfTJKgcOFgvhqFhuOf+y/c8t/B5sRqS1v5a0Ymx1tkNk1efWwbOv/te7gMgq1jqmpaXPXdnZj6kPIw+8WAxd9i6H4K4FEv756fy5ArHDhCJVe4Fd0SpgU6QSaoJJyIx76JkVG9ou5v72GeempSxsOlM1ztywUWO9D73zz0WLekFaRoZG8qC1MhCtGbFkGnSa1vk5OjogYfY4OrUyedTIcD5Kbl9XobikeylXkS/T1qLUepesVIUqss5mxzNM06KRM36FoaB6tDaXuOqR1pnLNjAfMm3M5yOv3dbcpJvWra5pH/++Re/+tbbZcX0pEzgcz7JGk2D0pTlftc5i4qh/fCoWg62jF50Z95z4FuMp7DBFY5SSEgLVq1eH5ORk8PLyApJkJMHzeM/Ew4cPD0XnJhHWWVey6A+0PTpio39ujKn1bUzPGwKK9Wz+A2w9ftV/8tkkGoeLHW5fjI8PzuyFrkN+h5WrVvl/K/mG5SoWpHGq5EFc8T1YPssPVIg0BhyaxxDFoEZdIeDgPN1vSUorg3uTVVa6d6MKQO9hStwC1MTz8hg75YkLNu1xfMbfxX4v+x7fGrzsSD9bvF8qre36UVf54AlbxijTqhxB4H1MZ8ydu+DhoJnTxp+5w6s9oLUdeLqSwOPx9eq7Jh4vFwrUiKcGrsmAV/FSXYHdtm0bSGwksGjhIjh3/ixcv3kbwiOegp2tHdT7sSYULeIB//77LwwYMIBpkzSElYLt59KhWQ0R9GxJQk4GAXFpPBSvvraYBgWSy8Keq2FZcBqEJzjt3LN700x/f/8oi+QLU26KcB4KJErYMvF/Ew71JkLSpVmMP554q08cjZ0lcKrPEFYi6fJcnd/niOdL4vU/A8C7+6YOGSly8POTdHibqnxlzvOYrBZ3Ffqg09Gvzy/CpPU35FZ9svswtZsBoPXqR0GGrcPChQuNvRxRYz4PuXuIZDui/PVDeYmH0QzMIJYuXWpyHIsXLzYY6MAEhiXyxgMdmNjv3r2bG93/DOiXlHlEcfpl+x6ItKbuCbPeefb1ur8AbDojsroDkdVfUzJOFVRcdunAS6aTISpKxQhdSUnJBfYdZ6fzVjr5NRperuMa4An4QCnigZI9QURDBg5FvcHJtyYUqz0IIo+PCzw/7YTNTzPVZg0rJ4K8JyasaenpMHLFNdPq0dCaTPnFz5oaj1qRp/RyKyFV+UxEEi7og3iUCsh7YRlbM+Jko9Fv5qsF9MmpsYYVXU9f9Df9E0skF6+lZ/w+1OS6Z6pJWFpaGrRsUBs6lgCQZiTB2/LlofPKq/T+EfVMiutjJnBV3R58UOhnR4mnNbA1Lx4kECalJTBHxg8h/OYzg3t7tsu0mESYmm6jgDGbw0SSua6C0nHQjmuMn6XxVJtczbCXQHdsRdfDXsoLNB5zkB/zyILGnE6GmqBJB8IN/EKuxjBHvBLn9evXwcrKCipUqMCQPVtb281mDIrBsBq5i5vgbj7o2DOY2aakgTZwGvILQn76+PtulnkER6W+v+XYlWoOKHudnJyAJawsSWXi15JWDxsRLFy2ElRK1TX4RsDKmiy3x9X+U8Q1v/Lps7CXzNG3jDdKOznTVrx48hrqV3sEc44Zag+Nr/OLIoJjzPFtditd3F6SE+/FRSIW0WOiYddHFrDtZl7flpdfYdaoGiM0WnHOvizZ1ElM5pYdbT0x19By4sRxBxFeL1i4bHyXueFdrAUUSHOkWmKJ+hoU7IiOjjBtEAF/B6vh8PUsowILsGb1Gvj3yi0Y/ttQ+KlJY+jauS1Tfp9EPoGgoJmwecs2UCmyDZ6jUB8/eVMa1KvkBI6o+xu1KhtuRWYBj9S0PQI+H/giMcgp0esGDX5eN3/Ub0vq1q0rtTTNzCpW8sq4a4NHLo2mVojcx5xHfIprWfhej7IqjqoQ9TQbir78s0DjmTBhwiUj091+MplsC558jB1CI+Nnzpw5Y0rQl4zlduS2sBeRj9Ib8YVkULZMDa+isjpIM5UA/YuZ9M5azapGw1p2OEgiV2GV7V8FVG/YEkuXbzWeeHxifkGGnTvixuNBTk5OboNGks8ReZyPjoypKMqH8Sgfhug/s3btWrMIKwqD0NfGs/nMap5Z7TNrrm0usNm3fg1nCTEOC38bdtnZ2YzDgyz4iFuMqKgoc9OKRmETpvoXRgxJyzySdfKV81jEHSAlfSgjfJ0Jc5iQCukFGc+NpV2lpYesGfHHsayVWgFvBAQH5Fu7enYa/0+3Us2Gl+/8F6ilz0CeFY0EFR5qhFHQaikiM0igTEUNs3VJKNduAYQTZMC5acezzNG04jmrqnb3dSXKq5g32FgLoZirBKxEfJApaVCqKFDiKNE9N2+HMAsb4PL7OGigyZKQItnwVp6IAL4Vr2dRB0H9Ry+kJ1Q5qsyGVez6oiNhFlmNuQT8Fv8wp8pTvwDh1VjTqZQfZOA35VAO/K9JXahaoSyko3pRNSkFJs9bRc+eMNzksjwPCfP6AvYEPQEfXw9cexlaN23IkFU5Sq/HUhdITX1rlobjYyZwAdUlBgI/K9yTWj9zhHsmntbjGZlWE88fjGAxAsWz58/17NA5dJs8iIlX/7v/upNpVjlejE3ptJOLMLnGZoKseR0rGCkunYHlWhKJgQnlKDPri8YcMReHphPQbtRcnXSPhRe1nx/07dw1X/HM0yN1lJbofaxs6BPCwoQsxfuasCxtNb18cAuUL18eXFxc4NSpU9BjmKZJOb13E/j7+2Pi2n/69On9Z8yY8cn6g/uoLGXuNY7PwcFB58fG7+joCDlKzTX7XvhZc7B/xI/VJ5+Kpx3Re7PE1Ji0ssey/+sDdu/ewboe/vW+FYKB0wMXZyeRoT+bXix5Zc+JAtCw4rG/nX+uhgnr58KUE/s1VRmFO7VdOabusuR51pHwPP3yCxzmoG10btxaP7btwHE1fwCwa46hSXDPKQVrEmwcJ/u9xn7fkknwyxfyrjlZ6rV1y4u72ApJoNVU7pRACySYjh073kNy58iExMS47GzpiCGDB8ONG5rxoCp+Ehj5Mw1PnhMwfWsqHl4yLmng42YD1T2iYVpgAPxBiUEoFDJ1NSsrG6r6ktDvJzvYcloBKkppQB9exefApHVi2BEkgUm9hNAsUA3ZMiXz2+w58+DnnzvftBZLFhYrVvTAnj0785Vm5hBWTAr3SZUqWpqr2fT9kNbT0pElJa0AtWYfoMfI/fzELjDCN2l2gcWDGpBl6BlMUO0RkVmempqKh7AuoeviyAXp3+vYbmtBhtsBcbbi0eEZjdRKwJsPFcdl1sTgl2ldgQNlJ6FGFeXCY40g5POF+AwieY6oA3DEWhEsgNvY2MxH6aTbOAqbKOSDfJvcH5jbYeFnPkVSWX9LSPHnIKuj9r9YjXrQAANPil6zvLPvMFN+tzQebEYwShsO/i0W/TYqn3Hkhah1Aat+C37GENa/upRcld/wzk8GT4G1w+QyreeAKushIhivkeAghsO7gqF9jy5AIyni6L5/oW3HGqDKDAValQllmk+CjLd3A89Pjln+02yIMbn+KZW6TgoTihyZCuLSZODmIEbXJKgQU1WoaFDRRC7ByL9ViV8ZP+vfUtIUcSmvsjHjrKBQYjMe0kaaaMbgZ/HWoHrSWtORlOmFztto2sInOwDenAN+0y3w+4xa0PanHxmyqkDCW1pqOqSkpqLvNq9HzlC8LxiyAv5va89C25bNoGspACnqh8OSAU6GvIHIyEjw9PQ0vQ3/iAlchl6S6wv3rMBqjmCK4xmGwsZq1qCG3dD5fF0ZeEZtMmjEspSGpIbVVJmKVJWVAQnBSNH66b6tV19IQ+Wwu7M9c/1PcrrJWk8WUoUy15wdwZZHgGLnTJ0wiY9xUXS+4zEmX/p++t9kTL4KGz6mMaqC+pCMjAymbcBljRW6q6Eqg/uX2NhYZt6ZKcDlZddjw36o4ejiYDyrvQFyxn51LSF1eWhTWZLKOvbaXEL8taFUqdb49F0WYKZAsqYg4p43eKIBGWTaQOJ94gxGbWR+gcPZ0OeVLjxcFnVha4/vz1sseLD1mEcafa/ZUtzXBerjafaNfQNfY+bY9cCZDEf/MlZnmbqi0htJtABIjo5D4WAtT7FRI0d0uHX7FkhEJKwa5QB2NnzoNycLEtJkebwXCTP62EDfjkLo+DvAsbs5zMrBL168gBMnTsKg1u4wtAsPPauAIzeUBpZF+GP2XM6AVqdE0LMdH6b2dIIJG+OgnH85GDpkULyzs/MadP+Bgkg/Uwmrv7sTf1txZ345Eglrr5KA9mq/mAjfPtiKJY2s9krf7NJC0O72PBALBZCUKtiWmSLvgxrvgoznEAqjA3r2InoWy88vEVFqBHqa1Tojg8FeTMKtiKwCC9fBWbDFy8OqocrHum+mVJ0eeT/NwdSAZQoasmQUxGk1Jdaow9Jf3El/kSf23AKSVwrLS7EFG7YBrK2tIT2dUbBFa/MP2387IrfuzZs390iSZCbRWrqoEyKJRF5znI01q5ZqWD83Kcak1Bx/k0YGdoavlsplAUvaFdMJCFjbPfbImwD0m0bY/Mjv63qWG5bfeNDpsIKI4704d0XQ+sTP2G9dD3+LujKKxw/wqjUQvaMK5BmPUIcs0WhWmX5EnWvqiichAoVI6wPgWZeDolW6wfN/V6DvVU0xh7BSub0G0xFk5qhQ5ywHB4kA+HwekHi5eBVrgkPll7DyrO2F80R8wjX0TvoopVR1AsVRQ42IsbUdvyLiekJ0j2kRxN8GfoMVudcC+9yjX2cYMbkMtG5cB6pXLgdylRJi38XDzbsPICzqJXRv0wgWTM2/gI871I5tW0OPMhrNKiarx+69hPDwcOjZsRVce2D6CLun6ASIRCJ4mtRYZwJX2vUS0zHvDpfpCwUGJEC/8zY1HhxGeGw99JwcVApUhqSaMjV52g2De/c+URnMLzRXyP/zaPin/VZdg+Nj6kHrpVeZy+7ofBA6N4dMTjnxxuC6E0nCvXQ56K1PCeABMBCVjfzEY/zuo5PaQJaRgSy2ac/cbNjwYr8NhUhw/bjGqBzEPLoOCQkJUKpUKVBFXGcESr+SvszqnPfv39+4YcOGQaYOsvasYDjXMRK5equPffLZq8PamP1dKhSfPmHNa/4qe8yv9vFL4/XW0bifGval4zXQVuoRR2N8Dm2iqfH0nDrMwlUPLHuPTceuMu4bBW0kF6bm5KhTGa2qth+hKcsDR/3FC1THQuvUrdPBztYZ/uighh9r8WHNbhkcuZ6RhwhLQLcGjtC3nQD2nZLDsdvpUL5iZVi1ahWEP34MZ86chzn/pECrOs6waJg93HmigNgUmcHHqCklTN6YDvUqOsHYX0Rw+rY1iLxL40WhcHNzpaASzlTCGhH1JKtPplS1X2JlRdmJoAIiq9j/0Seeq2BJej+KUTxKSJWS0eGZfXh8IuIzxHMJEZblmFii41JELB3ZHzx+2ZGf9PxguJCHqbEZGK11Ba5pPX4nleDxyJI/lNGsFBx67/PWVHt7Rqg9hwjqOSSsN0Ud1xCUXtgU+F52dvaEkydP5rch+CxkEiMuLo555lNaVTx/x2wWoSWlxlrUD/mbiqzs7IC/upTERE4nbIvFYsYh6EaLJ59NYkzi8fdg4Gd+C34WYGoHbRyPjvzRNDPCnJGZuQb9ZjA6bW4cxtAnpP22hDLptKVf5XyPtyIBsrVj8RqgzLiNPgCvpKdgTHSKSFIYc2CgFcw5jYdDmSFRNShTz4KzX22IvgIdsfxuDmGltQIeoUdapQo1YK2nxFrI7KXGjibje80lrIoMBRMmKSSAL+J1L13Mqk1ckjIKEbI4WkUV51vzPXDw9ja84q9UapGphBWTVVWshmDxi9QBELtofkDH35acgZ/bNIWaVSsymtXY2AS4eusuhEZGQ58OTaFWrVpm5RMrzLNgBfxeC59AplQOUpWIIatH7kTDw4cPoX+3DtCqaCYirKbHgU0wh9R2gcHbc03gfHx84OdShq+67ylt4IdljHW3Ms2KZ1RNEfTeCbp43r59CwtntkX5X1XXkgVOOwrdyhp20WtvmifJTGlbDvTX0/mQ6eDN5yk6v6ntUsw2J5zduphBo/pgDkBlW2+9zeRpeJDxhoknN0/Nj8e4HCh3kuDTqfb7jbpWq8vS5Zf7bxUqifVTGqMHDx5A7dq1ITExEWrW1Mxbx/sfSiQS3BcMRHeZRFgxMdTXtn1ubfOHSKrxuSWDL98rsEmwPvB80VkdyhmUm8kHww38MOafe52veLGsML6pt2H9OxQOszuWMyhHje4D7Jr7+UyC83oPTFaH/dzUwG/1vnPfkkkwQ1qFePujogLNGDjWsKpz+5T8QKVS8SdMmg5VvTPg914uEPVUBUFb00Eg5EH9+g3gyZMnTJ+D4e0mhnlDrSExCZWjzZmgQpkbhX4fPWo0RL+IRvUUtT0JKO83ZMKWIEeY3scJApbFow/QvKx/OX9wdHCC69dvwIT1ObBzhgRWj3GGpn+cgvXrNwsHD+5fYIlmjkkwlkTL5SjoRzkKktVQlTQ2z9XXcFmC6Hhdh8yUPEn4KDypqsDiefpUtyhuEPqGUbjxREQjKCUlZTTW/v2fveuAi+L4/m/vDo6jg4qiiKIo9thiTEyisXc0UUyMIiYqYiwYRcSG2BtRohGVaKyxRhTl/7OXRKNiL0RULKiASBPu6HD7n5kr3B2H3F5BSebLZz97zJa3szvlfee9eVNLzxdZ0X0/6aP/R2rgZObv4iiol+Zs4Z9yPMjYQZfc2zcSPcrMLWaeHyVuJyYJuoQQgLYVin/q1q1LOjA8ioyJIFIy2z158uSklmtW6UzOJBJG1TqsucSQIk3x2wSkGNfgK+ibd1q47wngZbDuvch9p60idi1Dz0P2R6d3Y7zWX2JVLZ0qxBi+234X9k34mOm/6jSruEZfOZrH9/h2UBud1kfG22Do8gEan7iZlb0TFGZcRiVdIPvgvCJo3+dLRBhzCIlt36Mb6lxy0f+F5H9p3lOwqNUVX+vORRJpv1Rcgok1jZGp+XihmdyCEmB4pVE8pYa5BNdo0tT6JwdLvuh5UgFPZCUYw4r4fGtHYUMhjwd8YITSItYWnacT+yq+Eiwjqgo8P6Ykr6OnzEHtXx6qA4isJr2CPy/FwPV7D2GMV1+siHNuP7S5uOG0yVl+cPzxGdhcUp+sJXfjxg04MhO7KeP549x81RRz1Hx7lsbESxCzanPTNAmHfIyBk/JN5KC/cT2fKa+fvYkH5oxjmRZWk2xwVfLxvXnluA5qS9PXnZAn9wtkyWIHsoiUjKMzuSmjSEeEVdu71LccSOXRNYFnJ39lGg8u975j4P3zGqzIcmUlNod7mzcD74PB8HlBHInMeauwNhQeDQeJWHxCVznYirnvIVtmdF8f66muZVub+6829+CqZmF1HbVmPaMyyKujshAut8zqOXqqJYmvPtCh7MN5Zb+9gaRHqxzcpvAZ9ecxiobI8TmqOBgXB74sOIXKwKeSqBowloPqmHB9+KamJ6N2wvkwZ9JmBm7MJa7AAwcOxFHGYe+evfD1N1+TFQ8W+thDvfo88F+ZAw9fyqYE5eXnQdjPYWr3/f1MDgztbAXjBpvB8RhbiPw7kxg+9uzeDc2bt4CWLVvB3rNxMKCjEIYP5MOi0bbw44zAph06tMVNztNKI6wl5yeBJdpn3SHKUgsV4mihSSJVN32QEkkst0SGNSYXJpAjD650CO2nYn9v1HhiF168EvI5kM0tPSTfk/VSjXHf48Eyt6dR6+M5P2/MA/GaDInI//Y/4jVQZyY4Jy4zWmCk9o2sHuUXkkEC1rX/UkxaTRJ0CWGlfMOjOw6IrGR27NiRHMjJyRlXu3btwAYIycnJ12NjY9ubgEwaTLybDQkFl2pmjPaOmoViKQ6QwwIukkV6jh4b29KKB0uw1RTvP5t7kE1ISIDOwY+1NwYCATkHn3tL2gBdc1tvOSqNZ/iFRV9N+HTOH+sR6fJTPZ+rjCkHn/RAaq8fwzIHkkpyDuz3aq5kbtoGIIbuizV35ouGoR52MANseNiXDU7qWCgKS4ok5th6micRg4W1LTBSgWyyDiuVWValSJ40j+wL8nJBKOQjAst9EAS3Zzx5b5zwrOI2nS/g60tYGRsH4RJXJ2GNk6dfb6pW15oEwkp9nIX4ts3h3HxLDwGfMWdLSoTFhTq2qVa1S5ewUSgXsTLHywPrZ0L843pQIi2BxMRkuHIrFn4Y+SVny+rbFPz4JS4wKHAeNL/jDyMjR5G0Nm3aQNDRBL3q3uEzzmgrmx4BuqVxUep3PLEq01xNmVs2ZoIm2eBCWIcs7gD3F5c2dPhOQ9EWq7FazxB5GqPyRDiNiwut5jvH1998FlPayMoHXAy1eGhePxPdNuHACTWLsTInrEIuawwFmjWWWl6e5Uo9UFQzEigKW4yWB00iEbCXhu9A+W8Mf4xo3otLWRvuwagNsOzang3fNuGpDQLsjGPJeaogFrpB9TiXbbyVZ1nVjBhclSDg8/2ebJlEypq2IEuagzC4WW/4/Tq9PYgUpU7pbqtSQbUFETN2YDE8CKyrHGJRVfH+N6Z7cHnPgS2quvQT7yNZlZV/bRVIT01WlS/ExLQNnjur2arxDtDMHeB1WglciZMR0bj7cXDo0CE4dvwYeQyvzrYwoj8D5y4VQ0R0NsjGy3nQo0cP6NKlC0jEEog6chju3r0HReiBg7ZI4OPWdrB0vA1cRvdMeVMEBw8ehNu370BKSjIZmLx8Px+G9xKBd18LOH8n3X7c+IltkbAjlUZYK4sQVJIcPHd0DSKVh9LT0zEhrS8SibALLyaWXews+fP1XC/1rfdFG1mPctsEFQPMVp3JtsmCLmXlFTO4oa2svgNbQOR6k0N0dPRyvDh6rVq1cKTgTS9fvmRxMKb69evDs2fPuOclK4vRnH+rOmdVkYYHFvS0sJ5GW1eO12AVuJs+xNUYwZeysrPDvbfc9Fs+dRS0EMgCddwrrgOBq7cpA0LgUeO3HeciZ8/4j/CyCyQNzwfsviiadNhisdjv1Jx+yveuj4zCouITP7ZlAJHuwQcz6u0aOj9WuH++jLRqWljRMfMaYF7gaf8UXF1d4acb7GBd2wlEiuPzMl+2FgodIePVNUh6egfqNq4LdtUcwMLSDBRE9k1qJiQ9S4U69SzB2a0xFEheYwGc/LBweTU3E8CyMa3JoIeZmRm8TkkBK0SSsXKXmYnqR81aisEw4IFec1gt0YWfdGhtOyb+RX56TlrhzrT4RESwWeCZ86u9Scy7IcktGWhujmg9w8OdC658FbYITFPt66meDarDYiL56M5uWHSoNenEBn3xod5kFUPT3e3CtJrQae5skIqPgKggA0Y8nwgPh8TAkr4usuVm5OcFRHFrR7YuWgyypQBkXdDoObNJmsJWh9Nx2m8oTWHRU6RxUeq/a5QHhXxLpbIbQWQvUcrF9/aZMwtGNGHUFOEVL3UnrPjp2g0oXa4TW+mvRoVDe5ym4jd77cgGaD/Qr3SYH513/Qi3WDErB9ZXV5qWMNCuv29pxCW0v4Zka35HTNS4lgNVcjD3UBQH90iDQgpqquF6l2WuFqPApWvBUFmsivsxLgemstAplpMrz7Kquq9qLsF4QBe/x8ScUt8NnhZPCMXASXULmeeSodi1sKy7rTbXV1O4w+oip8ftsm7Lxo4SrClT12d73wgsy7LKkvLpoiT1g9LSuauG8P2AgCCb4tx04RdtGqB75kN1W4DQ8dXhh7A0ePjoIY4mTM7DrsBLx9pAQS7ArF+zIBfpFXj60eLFiyEwMLD0fjOmw+jR30FkZCTcfSqBlTvRdf5CCBllB76r0yEkZIGySfy8pQ34f2UNUtQO8CxYGPCpPWwNvmBvtDqoy0kqbnuMtqBHqtZOoVBo0APJZZlMDiaUWPnLzc19g/5tjX63zszMPC8nM2u2jXPz7zT9zjOu66VWdF+QzUG9pc8zpyfng52tAHJzZB3IvXv3yri9qr4jjh2NWids5Hur4eLFi6qjZjgEJyaqmThwCn53PB4vE+3JMjd4nhcms+/TgIpLNbOuTralVUaKtKYSKUt8/ouLGbQHsgRJsUCKfgsIAantYN71XTaQd8J8JjT4fh38sPAXP40XFf5k80TSq1R0nIuc/qtOl7kP3oslkvCOM/caJCMnR7Lu1aucic2aNYOoywUgrPvGDeTBLTUHIMxdC9zNzKzIMhB4WSGxxG6l7p0KRGcmXG3t0v5LcHaJBWtbZ3gR/wri/oqDAlY2yCRkBFCzkQ00bmEPVlZSMHPsC2n3TuE+h9Mas6ge/HTu3NnOuG4lZOS3a+hkgwdw4PXrZFLXLK2s4NSpE3D/ZTrY8fKvYyUPnRvJRYbIWrCzkYf1oNS0QsjPK2FYqXQQSr6LttpCC8HMmu42vZNeFZJybO8k8kt7WYBN8Df1KW/7fZ3YTj/MUBLJD9MjoFa3IBg2bJhBNi5NZToltRAipgQrOZbY/wUUPX+OFEeGuFIrD3CEGTjIgiipXK9IkyscsvIFDuraKQfgb83weErXOsVjmoG9GrlU3J6vkh0uHkXEW9bJqUzryKvhJKdfchqO3Yar15C788qEcn11qO1WimDk74mpUUOWD7a0sTXUtU+TfAFUjnukBmk1qCxzsVwZqnDjfO+4X/ZjlpemWFtYMbCijzwpdgvWcP/VRlqrGmHFy3yQfl+1BGi8Rh6j3uworqGgKDtyWba9Lg22pL8Fadq0KbcnTXp6fUBQstuOOdWgVWMGvumJCWoN8A3NgNjn+aQALxztAG6NAJZvLIRL93PJE2Cr6owZM+Ds2bMwe/Zsoots2LABQkND4c8//yRTE9ZHvYGBn9SAMZ4iOBZjAwcvZpLea3QvGwidYAUOtkXk/93RJYjQJhb27t37Pl6eq9IIKxdCgNfCVHRehgxEmFBOl7f9/9Fkwik5r5d64sSJLhXIMQQmC7qESy7uQy5fzWxkyrqpuZYt6rQxOcUumvsxaUWbg0Qi2cTn85frK+PNmzeMpjW1vN/6uqwnZxaVcf3Fc1XJeplS3GFLCXHl3HaVlDCq0YAVVtTy0rlATgon6HtcXzn7UH/tJQ/gg4/ts7YO9pJIUvW9fxYivRsfWE2caPYcNZwCyMnN7a0grJoW1txsSb90pFkkJBTChjgR5IizdTYZ8UqKw5PvRM92btUH+JZNwVp6C5q2qQE3j+ZBZ6sahBTdyM+CxoNsSQAmvlUL1NGUwIvrB4EpLOFkmho+fPg0xW+7QfPXd6yT5dfQPhG+7dcF7OwcYOeuHXA5hYGb6YLwrEOr9PpGl8LbfFlelUGbtzHruSaRbO+9Gj4bNNpgh8wyyvyXF9X/fy4zbE879MQgOdosA7qm6QqsrG9+ICzTzWm75/Z/pAZFCb66eUEZhhWzZUGZ0bqrWxYYNKqv+d6xS/C13xYprasKq7ehbou6Ej3NNOy5YKz+0hg30dU6ZKjFCJe1cS3VH3njHSn4tuKVk1Z67vSH3Doye8+Q57t37wY7ayvwHv2d0tKqSlYVz7R27VqA67sBLOz+gfysZlWBX2ALq2LetFSzNGghrkYhrIz2duG9ixKs+YzMu3mOKuISTHAhuLbqvz3K+c0Znp6eKXFx8euHffOtc8/p1zrtnOUM3TsCdGolheiljhCwUQJ1qgtgZC8zuI3q/Yr9mUr2/Nlnn5H+Zt68eXDpkiygIp5mM3fuXPBo4gF/X/wbsvMKIWhzFhwLtYcV460hN5+Bru2E8ONQAVlZgZUKYMXuPJizOQ18vh+7JTBwxjYc7bzSCOtff/1lomJYrqx3EiOhzXgy58aQ9VJNggYe1v6t61thfyb/u78OMWrQpWJUTjFZ7fihw6Ozqz0ZMFHQJY0Rlk3yzdgwqYV15KcOJi2X5ZFRfSMEv0vsq2bdtW93t9P79t61hOo2IyFN/Hvffm6v951+7OmVlhulzz0PT/78n+6Lj/puFjXYGPhRMSy7zK7pvvj/PJiS4r2Z2bI4QT0WRHUGHn+kyFL0/cyOQvjphjmkpiaMOT23v86T/vE6qqfmpa6MP/NLgEevqahUFUGx+DrY1BdAZmIRKTRWrnzUMOeBwLoVmDl0hUdnNkCBOC2s+1LQucfsMv/Qb+fmDxo9OPAE+0WdOKeioiK/Ro0ag2O16lBchKNSp4LnwMHQ8vEDiIm54h0GMAGfG7m8J9Nl/uFfz833HPO+ffeJB9+ol9WDxokQuNpLXaeduu8fCENpWHHkk0jOAJP3P4Kfh8g6RsVSM5MPPNJZRue292HVVx5qaZvusjAeKfxSjTRMArB6r0ifdiAO4shS5TrVc/BrUUI03xKejEhF7AE4tfSi0jqDOWr3oE6ERKjK4UIiIuddL5Mf/N60vUvNNJwfGN5UZ1lrhzaWWZ/lX//PxUhBWn9E2cjibF3w669VtqHlQJe06X88gP8icFkTaMaiQoVLlzSugyP5Bfl1sWI7Z9ZMPG2jjCVVNUIwJqvTfr8GoYMaNGWryLu0sJAtD0Tc+BUDAhUQV0M9Dpf7SsudI1vRGsNkDVUDZA/4uFmF98fH+3WUlknDe88VxlFbdH0ObWmGvoOqiiZN3M+mpKTMGOPrFzR43sH+66fUgpH9BFCvFgt751gDw2eJN+CsjW8gQ1w6xQjPlcdo5O4OFy7Ilg1yc3Mj9RbPZ1UU8vN3xPDLAUuYNtIMkWBLpHKxpDYUFgogIFwC645ICkMWLAqbO3f2jF9/jTBavgRAQfDJ9MuKn/76rpdqKsTHSYhLMd6LPt0KeRd8jBkYiUVkFa7ezFpu3WU7SM55myrokskRGRnJ0JL87rHD0a5H3+6uJw6eePaZN0CepFv9jdZ7727aevp5+yHdGl7beiKhv09mdrQ+9z41u/+mjwL3iEILm6wJ7mwLT5+m++14UdtPnPuYuCU6Odc+51M/E1xdbWHhXxJ4GP9oRsyyrzdzldN9QfGM0/POW6Pq4ef+xXiwsP0IXPrshQcRD1Bjz0DjXvVAVMeLzP1+dCYcUmJPh3dfUOLPabSE4fl8ERLlExnck/lo2bI+eO52nz69iVudwiqB89S+XSvIyEi3Gjt2bK8IRFbRNYruecx/pUwplGkeFKspJQL0P6sygYyn8pvh6K6rTblXyOGV+zygVMZ1BT6XuAIzjJpHsRC7GctvqHA91pTDhURgOdryo0sa14A4smAdjHLKKga/WjVFZpQ6vYAxTjlQALv865Kf9839tLIsRjjfE36/q1YncNn6IZZRc//FvyfcK0tiORLWG7MDpraBfPGV3b4dPn77h7Q4GTqgbneWlV6sKm3Q5WWyaQ1udrpfc2mpl0EyPRsy70yneZey38fnqGqoWbPm34iATg4OrvdyzE9rxydlOELAN0JUr0tw9EbYfDgPHmXVhZCQYcSgdPnSZYiKioKAgAAIW/sztG7ThrgEe3l5QXT0URKwydbWFvr16wceHk3g5w1roHd7ATRvgBsLKWRkm8O4lRlw/DY/dfv235aPGDEi1Nh5YliW/Vd+LKaKlnFjfw/N92Cq711Zciqz/JgiD8y/vO0diprC34a1LN6FyKpvppgM0UmGtWQRYSUZX29n1867t+u10XvvCvYbELy9+Q8RK2xt7QKwu8rXtZLBxcWFpOO1xXYlOpF1DHNyJCtjfxk7w5D8nJonWCG0sg+o/UE/qO7eESzsZAtf5We/hvQnMZB0OxrpZ2k/dQ8pnsb13griiZS2rdjSGhIScq2oqKgdJqyqG1Y60f5qREREB2yVxUQXX3c2eCBTmXXuXZXdMTtjDcrYryOa6/Tgo7fdYVUVeM15q+W9D8Xx30a10lmOZhtz6d4HWs/9uMXtMrK4yFGVofhdUdumOK6rHG3fZ+gSvDYqCypGV2J8OjA7Ru/vg+WoEk/N/Lzte+FjW7xbvheN7+HHqMYbYDHiosArZOlroXtfyIIp2zZd2jVjymco/4L/apkytX5fjsxqa9b8PDsoaNbUsT3NYNUkG3idhvqWiamwYt02+OZrLzJNzsfHB/bs2QPdunUjc1Y/+OADon8cPXoUJk2aRHQrPJ913LhxL5Bc4Xff+zkl39oK/1tdE54msvDtglfwTOycn5yYIDLVN6CElRJWSlhpp1IlMWDAALd7NXr4oS/VFRW3ZrLvBv+wLHOseerxcNTQJhpDzslAcOVZCPxQqR6CJLjLy/dTJCyyuKA4vPcyiP83th3vS52IjC/NWEVromo7PthdtwePfqL+ArGN8W1REjSP92ugmxzV/OhKHlTP0Tc/FeVJ3/wcQXJ4HN6bJnSV828hXxSUsFJQwlqZZQnJbXv4yJGQsWPG9+/UUAx4kgvfxRP27t7+lMfnx6DjbHJycjsvL69GODgqnnuN553i2CCPH8uWQZwyZTKsWhV6RiAQ4KU+rF8mJfXq2rmL25B2qRD5pwRsXT+BHdsjDnh4eAylhJWCgoKCgoKCgoKCguI/Dg6EFUd4mnn9+o1Jw7/1hlcpKXAt5hIipe7/Q/foKz9nT1pa2ldhYWGC/fv3Q1JSEgk0hqdd+Pr6wsiR32YwDH8/Ol+5Vtr27TtYb28fGDLUCzZuWAeOjo6r0fEfKWGloKCgoKCgoKCgoKCghFUXUmiFzsvhQCJZsVgMr169ItHV69SpQ/aMFmHZ2Vnsz2vXwY9Tp4JIJMLXRvF4PE+0N0enF+ogixJWCgoKCgoKCgoKCgoKiqoPHn0FFBQUFBQUFBQUFBQUFJSwUlBQUFBQUFBQUFBQUFBQwkpBQUFBQUFBQUFBQUFRlfH/AgwArPAYCBigNJAAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/google-maps.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAK4AAAAlCAMAAADspSLHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NEExM0Y1NkFCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NEExM0Y1NkJCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0QTEzRjU2OEI3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0QTEzRjU2OUI3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Prv1NI0AAAAYUExURY+Pj25ubtTU1LGxsTc3N1RUVPX19f///9+GG0kAAAAIdFJOU/////////8A3oO9WQAABBNJREFUeNrMmO2a6yAIhBGE3P8dHxg/gm2y7W6a5zR/2qRRX0ccsLR9+jJmFt7uuSiNEwMxm12jFSEqd+MaF1yqhYgvEQsVvTjnV7gOS2JxsThxIbuCq2p3qmsSgF0RMx+uXuC9G9dESw5Zo6r8tbiNdhmw8PcGgxQta/d2aafci+uh+lsxsSf/E+6zuA+uLyTrdNyfRVZ/7p7NYiuuNyb5IDuZu+S5DRj5cOS+sb/ieaBfMxewJwaFa9OCa+RvLY13DaDA+FweHt36DWZN5pnhNBacI7ACeCSqEFtCx7g6f7zkjBpumHDRGo1zcFCxUuOyjfHZrL8/rBjGqhDupLfBjfdCHLin2nry4JZFSnvLggHfpr6iBH7nhYwDF63jhaJ5/Ur14PPgqUo1MhOB0BzUvHet1u4qeZel8Qpe9Mn5cpXTjeHZo6NtrC3CWyT3LeWSWmioxJ1KEy5aN0CtmnGbnDE6vtQC/Xr84FcbuhY8ni0oou5MXReexk+x1t4Dh7hzG0lsIxpvhbyccF1cxuJ7kHDGHWAyHkRnc6A6oZuugdvf9FX6AZcSLmOpQ9z5aIvay2KrjnG1JmeIPRZ9IL2n9QMdkDgB7oMuuJuG9FpnfRDBcGw1lnGx1BKCLrgldv54q7RSo+M2s0DhtHR7hsux15R0xW3S19oRKWRbfdfa5Xv1Abce4Fq8VQYuPGbilnKUT45xLXagd+XIz7ibxfOQAkaWo8GgSiieQBZ1ZdtzgE9UWlRjzUraag/+tePqES4NwCN127YPyyNsouQzLkfEh8/FQL2P4ts7UkTGdf22mC9mNZL5HrvHuEfqGuxh/vyM2wpF8ZpBdbUyh3Jcxp5fcJ1tiQamAnPDEUQicizVDFaO0+Whug98D1vNsgfSU/Ry4G6YyIwGRWBa5GTeTzkjlRYEji0ljqt95DknuEPdHgz9lsPDuBuD2xo1dVbejpvC0seuoHHfHfIyzUoOdja6mFlNNa3Oi62m/Y76VstpYsJ71I5+8+HVU2GdiUp6CugLG7zSvyTzT4FTRhUSphMR4tHFr3A9J0sk8uEMtRZJSRge4+maenmB+mQ61Cg1/BuOxppOR+CVliJSwMeMZZpO8whnaBctJc7AtbFwPSejwpGmp0gucWSUP70cimlhw/gMfd334IBNKGX7RGqj9MjVixlF+1EP9x9b60LvnE4MRfSu/FMBGXf7/wzUhEB5mt3dnr1+eYRjdK8gn0PV7Oejxwl65Vf/4uBPht/37mcn1MRR7umnTj1v4P6xY9JUZWr9zEnnNtw46c0IkJ6GvxeXNJVB26dw3/kH8k9XWRxblb8bV7Id0N3iXt9qsOWeQJXsy3GjrIusghrndtrruBv+EUaqtttpP4A7M9f9sNv2T4ABAMfSlyPJQ0q7AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/loading.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhHwAfANUAAP///5qamiYmJuTk5Ly8vMzMzKqqqrCwsKKioujo6NTU1Pb29qioqKCgoK6urtLS0tzc3NjY2Li4uObm5nBwcMbGxmhoaEZGRkhISDIyMvj4+Pr6+lBQUDY2NsTExFZWVpKSkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAHwAfAAAG/0CAcEhMPAgOBKDDoQQKxKh0CJEErleAYLu1HDRT6YCALWu5XEolPIwYymY0GmNgAxrwuJybCUcaAHlYZ3sCdxFRA28BgVgHBQMLAAkeIB9ojQYDRGSDAQwKYRsIF4ZlBFR5AJt2a3kQQlZlDBN2QxMMcBKTeaG2Qwp5RnAHv1EHcEdwUMZDBXBIcKzNq3BJcJLUAAtwStrNCNjf3GUIDtLfA9adWMzUz6cPxN/IZQ8JvdTBcAkAsli0jOHSJQSCqmlhNr0awo7RJ19TFORqdAXVEEVZyjyKtG1AgXoZA2iK8oeiKkFZGiCaggelSTiA2LhxidLASjZjBL2siNBOFQ84LyXA+mYEiRJzBO7ZCQIAIfkEAQoAIQAsEAAAAA8ADwAABldAhIPwSISOyGRguZRAAEkkc0oYREPTqSESzU4bXe8ylDEgF4PCYRoSCDCVKEDBCLTdAormasXjD1chFRd+AhaBIQiFAgWBGx+FdoEghRSIHoUciAmFHUEAIfkEAQoAIQAsFgAFAAkAFQAABlnAkDDUiAyHgYBhcEwmCQCh0wkJTRjTgESoyAYSIcAh+xAWsgThIOsQLrKIo1yYENjtHaHnbucIQXwCFCEbH4EBIQiBAgUVF4EWQosHQ3wUGkd2GBVzGQZDQQAh+QQBCgAhACwQABAADwAPAAAGWcCQcChcBI5HBJE4QB4dy2HBGSBEQ4AD9XFVUAOJ6IRBlUQroS+EuEFcBGkkARBKeEAfgR5+NAyEe4F6IQ0RQ4KBGUuIehgGi4gUaJB7FgcaVx0cFAEFV0NBACH5BAEKACEALAUAFgAVAAkAAAZUwJAwVBkajYOjUHBBbJQhgIIROAqugg/IkwgtBoVDYFxdYs+CEHk9DmXQZzWb3DBg4Ff53BAhUvB6awRJQhoHFmiBARIQAFAFARQcHSEIDgQPXUZBACH5BAEKACEALAAAEAAPAA8AAAZZwI5gOEyEjsgjhzj0JJMUpgD0RAakn001VJAKENuQRXqpbA/e0KCqiRJDAYYC8KxghvCA/lAYLJAGGXl6hHpPDYWJTxEGiYRVAwSOAVsAEBKKYSEJDwQOCEEAIfkEAQoAIQAsAAAFAAkAFQAABlnAkNCQERpDFYxAcNRQlkvjAQoVWqiCS6WAFSBCAexnE3pSQUIO1iPsYBPHuBARqNcXQoe9PhAS9gEFQg+ABwAhCYABCkISgAwTIRCKQgB/dkcDBnVyEQ1HQQAh+QQBCgAhACwAAAAADwAPAAAGWMCQcEgsBCicDnGoOVgEUOgyVKFEr0sD5oolZrjdUKQRAkeFA0MgUI5+QJ5ECEBYr8sXxIYIsdupUxJ+AQwTUwmDAQpTIQ+DBwCMdX4FjCEOgwOWCIMLlkEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-director.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NEExM0Y1NzJCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6N0VBMjJFMTJCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0QTEzRjU3MEI3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0QTEzRjU3MUI3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pul8LuAAAABaUExURefn5zExMTY2NtjY2Do6Oj09PVVVVVpaWlFRUUFBQZiYmKioqGlpaUlJSYKCgvPz82FhYUVFRXl5eU1NTV1dXWVlZXV1df7+/m1tbXFxcX5+foyMjCwsLLy8vKLUL1YAAAPpSURBVHjapJWLtpsgEEVBefkganxEo/7/b3YGEAFNmq6e1a6GXveegcEbMi0T5BlnclmWZTapbcZxbG2GQdqQx9e8Md5pfbGL2JL4HDztiJhZ5pAaXQO2AyGI599h1WdS1RkCgUwFcdtegPxyw0eCqP61gWgLbbID20G6gesRzPEQ7gTvBH9OgeD+CIWIBD5XPm2g9ScQTcHSN/tPJo8NJB1cMk23d6C9bAAE00dBfI/DAwgEilzehLN60v91Al5g8zw/pvhnXpFlinNOrY75sZViuPAgwJw8YG45j+3QnuVHKedaSDtBIQ/eCXzqdc8JaTAk38tZDsfxy2F/vXYh4vogmPFlWY5Nt/BUkKaaRWt3ryr8j7I/B2j4nsxR2uoVp1nBgGcnclzu/dG+4z8JmsYrSjg6ECjT265DHPie+BM3/wxGsMOn5WEIEK0Kh6dqWJG2T3gvcJEVFt+hqBSqzmEBhlrg9PqxXActE/6DQLY4OiGsYe/N7JTWSp644bUmI46pHmFa+MELTMTQmNOolZQDPKy7Pi6vURBFuC24916vpoVSw+ym9fFY617FPAjMnPEPTkv4MzC3Xkhi1lBYmzOtihgHQRvFC2xkb9ZEKhRgL0XCpwJVWoF07wzuAW52rVFAiBEEdCqAaYOAvHblvviknlDwWk5BH/FdR4YoICBeACeu5wYFU6c6K+AxDgIYkP+mlbK3gv648LoGAXktIKicIMKNIIw+BOKTIMa7IhRAWSfQxxvbzcCTpi76IhI4GkLE0a2t6ATKXbjiCWtCpBewsLoTiIug0u6+Kb7Cutlh41awsoMvXBJBZwXdcWERy+H+ac2rV56DoIvwghP7dhxvGAhyFPT2vnV93gD2YF6QxTjnREUpSnwMBDbsCUtCBD8FRRfQN4LVCAqN4+65Ng1UuHF2CGIeBH0YI2hwz8jwHRtoBINzY1UTCPgRRgIaynLTQUkZhA/I5693hufOShA0VnDijBFtSRe+wmNkn+Z5eVSkQb6EbcO5ZVZATxpxFERhKICu8R3GTw00zc2xWcGDxjjLbgVH4DdD7fhEwByeHYIOtwl/M/NL0CXfJ06PM6f2Jm4xDoIuSqGm91qaPGaVUeYPnUn45l5UxnhAJwJ4suP0+AmlGQ8OvKAbhCY4CIqbcOSieQWNR3hGbwT8JozfwKZN8g2zdYPSEU4BB8EnLqyKZFLaVL8VsHCzd12b0o4OBCxu1de9Fj5ZK7hC2T1nJ0sTwUa+bvNbaYNvG8l+Cs1uYHO1yF+r3hT29L2AUprdY5alB3sR0L9nu4TQH7PdwL8KtmDL/ybYfgj5dl6/hGz/mT8CDADjKsdAvs51GAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-flash.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NEExM0Y1NkVCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NEExM0Y1NkZCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0QTEzRjU2Q0I3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0QTEzRjU2REI3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjX722wAAABgUExURVVVVUFBQcjIyK2trf///yQkJDIyMj09PTAwMIaGhjU1NTY2Ni4uLiwsLDg4OEhISExMTEpKSllZWXd3d0VFRVBQUCoqKujo6PLy8lJSUk5OTkNDQygoKDo6OmdnZ/n5+UguIlgAAAQOSURBVHjafFbrmqsgDBS1gKJovdYq9v3f8gS5BXTPfLvdPzuTySRAs2yIkFlss8b32wPe7w4waewEwAhjTCklpaxplmIzVMf1zItqmEAUogZQwIOALd774r605pvSQitoPjesIRsCf0scXArGAXMOpKixAOrdK1gHXoAkAokDHB8W6F182IFrIWQwPAjM0QD2JAMfAvf8IeV//+dAxg6exvCfDBTiP45xuwx8rw6exijvY7zxsQO3gkzpwoK5EOljC16gj5d4Z4p1wzlWp4gc0L/4c7yIjPVjka+/X1nQKAOebSnfZogWsdtZV+UfYAMKLmUkgNjZliyyFSDszD+f0uAmsG2aGQRux7gjpFo/v/JvgQjzzcCu+WUZCQR+KjCjEdoIyYj5yAE1DuZtTvnRDMkQ8RMHWgBwaeg/zkAYAelyxP8V41zjs8iNgKei/l0DVcjvUxHeUL2PvgPrYP6L35E5GCgUr+EoRCchFfh+Hd80AAZ8/fGiKxlHwLOv5tnfOaZfBpxAxdX9LHMQ6HXVb1Tcr1AXDOS1dGcZJ8CbTP//t8dsZGDyBk5KorvAzsAKJHD1O3K6BD+SwgUgmOELz38ScGw4xqRwBtYTbs6zEzKaAfBTgffblYdLgMyrn0H5+Xx+I8cGgsC7Nx+BbW+R8VdGqJokAS3QvQ06xDbXIAkdOIE23kIj0HWBiOhgYFjLZwHP502bdTdM9h5m1e8mkCZgHERkVx/uwfxRIErAOpii0uYlm1QaoROgKAEQmB6ww0vIbhFeAjXaYs2/C+yaDu+QPP1FUPXm+T0nKlL+TcCw9SsYtlC01i6V6BhyJwDt4uLEPKNyDAYad4b8g2gNXAI7AvGQs79KV0WvEyD9FzPcwZJd/7/7DwOxh5tsbJQ/QvEKtBoZuUOJLvfHKOfC32JxgpeBJRWAdgU8heEYdo3yl4BvoLEJPgh0fTYW6Ck82/gS8hMwdC3APBmuLFKs6y/Qy6KtfXnbP0UBaAFmcH39YZLl0eoV8I6IiO82IDhgGIlAwRshRHIFcI7oy/E/gaJpGBOc1tECoAlYAeXoSgksMC6UDlU1jrB+oX+O+l+O48iUBlMGQnmBnCy1pNNZrYXkUf5N6zoA/itTGLUTKLZFt0/JsI0nu/fvDRyZtIBxg4AEgbUYp7atdXQCWEsTx48CvBxIDCH7earbpanj2YXyIYDDCsApk/ZHK/CWU0dO+SF/GwDwQeCO2tKp58cGFoPjBfwngbh21H4YoPGvBWpdD5W90TmiNzj/lxO4ISr+VP44DmfglVHHupMdPYnf52cFNPyyxux0eDY+zLcCD+DOPFo+439x7f8tENVOyy+4/oMA92g45i8hPlQfBMziPSzC0yqFcdgwXq9/AgwA8GvBY7FPyEMAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-quicktime.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDFENkYzN0RCNzhCMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDFENkYzN0VCNzhCMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMUQ2RjM3QkI3OEIxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMUQ2RjM3Q0I3OEIxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlRVESAAAABgUExURYWFhfz8/ImJibOzs5GRkY2NjWtra319fUJCQru7u5WVlYCAgJmZmZ6enoKCgnl5efX19cvLy1NTU6KioltbW6ampsPDw9ra2tPT02RkZOzs7OPj43V1dXFxca2trf///3i74KEAAAAgdFJOU/////////////////////////////////////////8AXFwb7QAABitJREFUeNqMl4l24yAMRQEDtjF4AeMV4///yxHCSZql6ejMOWk7eRchQDzI+Utsg2c8yHWVnRD1TH/7Hvn419lIK5mLwzzPyxQdkSup6f8C+ihtiMu+z8swTNMwLPu2DUaOav8fwKYqy4d9qYsYY4GRPqd5m8qq3P8EFJXVw1B4H5MwRvgBOdHHaV+aStGvgF1W5TR5573RXDAC0RLCGFfGRe+KubB2+QKoK6tqZ7RibVNCNE0LgT+WDRHamALm4X8FiGo1XglSdh18nzAhBIeAD0Za+GPXMGVqXnX9RwBtK2k0K0PomhbUnCulNAR8wHQSI/2X8Lwa+w8AGqpDsy6EPDioIWPjDIZGBiCkDKXidu3fAaw6RHMfPamdj9cquoSAuTRN0cgQSGsfOZD7/GXTHTD3FuXaeFA6DSXQJq1oQrBypjsQZNdV8gUwVStkj7XD4WPhOCG6ruuphjURDhCqnWlPeyK74zgq9wTYqvHIehhfa1c4oqa9z5uG9tvAW1PwhfZ9TykQwrFW80/AYY/QXXqloyd8ft4udPPrQBMAciiP7pCjpQ/AVMkj3OcfdbN8OKB22jKA7mWAWVT6DqB2zXqcQBS8f9cv4+AYzIGm0AdMQlb7DRB/TsAzd37SL4ViYUB9EZoSCJZcADquqMcEDNOfGgzoOYc9Pif90cDx6IK0WwZMFieQE+Dko34AfdsywiitO0KanILPgHIE/a0CcvtV36QB6qlLxwIAkMJIE2CzEhMAAFNd/Vmv0viM+0KuCgEwiRBSbyBnfSWQMmDdl/wF995vAsYhKQXIYTQJIMYOWwecQX5M3/WGnrPkCEgEKelJKDT+C0CYpF/0LunPsyN3QIB1IPOIFcAMgnvXT7f6+aw/iyMBEgHmMJxkyDPADOTyro+X/hof/rbmDFIKtj6JXzEBALREvrT9faxBT570Zy+h3gkAhNWcxKxlBrTQ855LsK31Y3x9PyBNmVo1Ao7mJHpFPQCarnxOwKi0f3P9H/pThQvQlOE4ofJYgfSva5/vyCYqWLKX8c/TybbNCNhLJ2lCk6NtwvM52ErPGVwOL/rTr3lEiNCdpAw3fROep0C54+l2gPV7ahBGljdJeWAGt4SOl408CGjGJkb93GCERHESdZABP7IecGF9/ib1uqiLl/HPE+4WrBmoAjvJj5J040srPSdv3Ksz2cZwW/dWethIuC+wJt34dpjp/tYfpzFvfQiywk4cZLIAGbC259+hxtvZga0LZ2Ff0UbkKtrtT31v8yKg91jhNJ5HiwTcCFb9CYi2uwFgBaEfnC4dT0wBbm/b/5nA2uEiJsCBHWleBbaIVJRgmz8A3HZ5E6X+sw4JQA/octAnU0chshq+6udK5jXHDFbsyqcPAgkAUGyt9i/63Y6EJUJugNe9sK08A6BvO2a/EDZrGceKJ4AYr5vp1F0mpIul4NbOv+uVSXYLLxFestvluo0JAIWEo2dqM1b1R31djR46FGOoF6rc7v7AHwouFdaCI9Vuqo9PnngDfzgVYJrElYASD4NBV8GTmyQC7JWrB2cr8TyPTVdjXAqd3F6TAVEWD4szr/pOAFc8LGatDjdveBC33R2V9Mvkktdj2D4B4CY8e1cXi8EkU5tWEiyeK5a5ZtKmbV+mD1EvQ0SvSFL/TwShisEOD5/YkURIPZQngosTvlUMOL56WIbaZ7tKmtvJgSIUA+RwA9BDGKUwiVQI8KnOFzW8VyZ4eSSnim6XoBzPUSMUmIVquTfiXnKfbDW/aqnNIy7DnXZfDsihRALXj07eH8rry1WjXb2FunGz/0/uH2/HFnaN8D+ugr7kd1sNtbgMPz4Y2PU7T7+m/0aXQrgufwJOqpt4zTd/6REoxok5czGhDoR3/vkyGg4DJXPXtPkt8OWRiuEi77jDvPAdI14BsOMaD1eBd+6q3lVMlwIsfGl2x7xWGumMhfhmC2fBXA1LB4bKo8zniEXtCE8OhHN/LQ0XxzvgpIsiKsJLIT8c87OxrqMmarkeVzziYwgIHzLAxlOoVuiYdAhKrw8e78eLlio/hbxrPgPw8Z7MBcMVFMIP+88LjjYlLiSYJEd+b4CUbnuKrX8zf7S+Im7/BBgAB/EthwyrYnkAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-realaudio.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0VGNjQ0MURCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0VGNjQ0MUVCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyN0JFMjZDRUI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDRUY2NDQxQ0I3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pjqzd0QAAAAYUExURTAwMBEREU5OTv7+/nFxcdLS0qenp/////tiJQYAAAAIdFJOU/////////8A3oO9WQAAAoVJREFUeNq0lom26yAIRRGB/v8fvwMOMU0aNXc9VqdY2TIFQp8QpX2R0KQCsL8C9L8AUpddwFXtjvMLEDtZTDUfomrCdGbcAkLZRtVRNCD3gNS186OocbPjkkasT7SbHcWML8CqeggQ34CUJO8Ipy8Aa94TIx4A2fK+8CfnCtBdfVWvEvs0wPb5QkxSCPRGX5kDAIID9v1HADmSrgNAzax9lm8bSvp8DQ+YCwqAagBj0W8YIs3mJkK41ka/rsluHng0G0AdGrskDsBuf4VGu/AtOnoQv+td64vYIlL1RXus3bjyXQ+WRhoBoRWrSs1AD3ZZgvvoCA3gy5LPgNhLR4S6ICIKs8I7Lpbr4EEHDG4J1WAUAZuaejFo9KADjsTETwmjS+ZcP5rU6AEfJVGycCQGFtb0GXtIc+hHOxs8kC/AmJgsyW3w/Zy4GodLGjwg7XdVqURJUUCd2vtmKbGQ+NJoJXR4UEvZAz3eEiZxqh6FiL9NYsWGveVe+LzpJs2Al/3g0H/ZkQ793lRf9cTTXNjuyon/OBcugK3J5Nu/J9M6QsrTwg0AMpvOqLm29R4QDF1QfwDUJxS7mwfjpidA/P+sPgXIZZhcdjwCaKY+A+hMfQKwa9q3AHKbt3UALag/An7kbRmgK+oPgDoUUnoJ4J95WwPQovovAA3qMWX9sXgLwGM1IZyUflXS7G5ENhVvo4y9MMuNwVssTJMlADpvxqRO3hxgD/JDPvE9T7YAoNK9Vf3EDFbCnPUXWueSCzjPw4d5rhiqiTVswGilEpUpQHMpCxhPEQ4MA0BFUo5I8wxgVlpsIjzsiAP8WMUzU9k9BVw9Oi9sAvhSDieApH2hvwKKBf8EGAAURy0yTo2KDgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-rutube.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHsAAAA2CAMAAADQ3xb/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDFENkYzNzlCNzhCMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDFENkYzN0FCNzhCMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMUQ2RjM3N0I3OEIxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMUQ2RjM3OEI3OEIxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqDWAxgAAABgUExURQAAAKOjo6urq////8TExLS0tLu7uyAgIGpqatPT025ubsvLy3l5edvb2+Pj45mZmXV1dZWVlXFxcYmJiX19fZGRkfX19Z2dnYGBgY2NjYWFhezs7GZmZvr6+kFBQf///yOhgu8AAAAgdFJOU/////////////////////////////////////////8AXFwb7QAABWZJREFUeNrEmet2gygQgAUBUfEKqHhJ3/8td7io2CSb/WG609OWEg/fzDAXsMnP/yfJq8ltWCov9bD9JXuoGMNBEEKMVcMfsRdiwZQxYoUxCnxKlj9gD4whTEmZ587jeV4SSx8pG77NzinCjORVDeLQeRngDc2/yt4YBffuZMstnds9HLPte+yBjpiVnuwtdmBGQTBqug4P32IPeMQkP0wOYEem2Bqu9d3w5EA3mFRvyDbbxk6bm+GBveEGgdUX8gm2eQ6GS4PTL7CpRiz3SfVERk7GsTNS0vvZJSRR+TvAYvQI0nRmHsu72cuoweOvvI0OsoVrOY/DzWw8g9mfyA4+T/i/rqwyEPKJvTQS2fpdpocseeTsk91J1YTanl0EPa/8SEDyT2w0aSiljOVpJBt14MZ+N00YdHJS3vAhS2J5YZ99IBs+sIdu6rB19YWdbqh5FjOJzq2XX9DJM8Mpl33a71zNDbY7XF/YKXtGd3oWyvmRXtDZc613yn1kN0KOLrIWSxzKMuhAuq6BLy+N/9ZSiMaxlVKr4z5gpJ4XJvYz9YE9aGC7uHLEGsyrdvaTALvttti05M25QtnP0Ad2LYRsbERjRyyBQHa294eFhpGWqhd1bJp39zaAhI0G2UKYk59cK0WjaFisw1Ad2MSyIYwbz2Zaax90VGvn/RJmtMu/Wjt2GZuWHUOfzCjzvnZ5gB7u15GCi/87yR61Z7dCdjaOvLVIG+oGQ6e1iwBi2U6LXBspipbEGfw4h/WhEPmVgwGOzsmstmzdi1nDTgZrz1AzxnhtYGCWMDWLosdRBodwOpM58yVlueag+4wGo5OgM7CLdjZaG1NdMqwG4OhGjTm1kMAudOi72VFVomQOWhCPsZKEqPOuEPszC7BN0U7SQH8cYnSupZQ+AmAgfQ6MUk6CFyZsXnI4Oj+8v2uhHVofjlZhNx5wAMfcK538SN6rGZY3EblsLFAy5wAZaTGrlnMTh/lwTeZdCwfSZyzs0ReXYcsuxDTvpgWr5QwyuQjIJxgGLeZJ9JxLz9bXME/oUe8CKFQ75afyF+yO81bB+j66/c90nCYlhIsAKoRSXosZJgvOcZRiUZiTuKRE1Xz1LiBHAHjJgc047wXAmQ8s30gX0fZF4YaYF33rwpyBOmA2Zy/D3PeTR5Ri3m4/zD2bXutaDqu1APdhPuk0EDlffbFZ19XvR9O2PV85ryI2vQ7zS5ivduYRtobsM6DOzl6AUrRKOdNqpcIJouXrGgIP+6kBwoxb9hJ1cHKyM0R0FvaBXlMsA72WLNS++pFlijh2qmC9vhVu/Uq0Uwg3MPea8RhmgMxVGjXJ4dzvo46QsO3nzHo8tGvz8D3UWHMK6UOtL7jf+FSvq47RFV89vAnH6qhBL9mv+vl4RscPZY/Ns0vnSc8ZATCHI1ux8maIrObB7vKpk8BmhvIFq5KjuvmsyjL6u5OEGWBvwhouXDWxYcylPMY9XBlASFPwXYLLfds8u6NtltAu67ORDj8Dgqn4KFfbCZRHZ8WRnyt/koLTW8/ny1QUJ714I+6Dvp+2e+8GrLCV5LP0fduzm+8lqWyhjn0WeEqmd98FayNE66Vv34oQwtT334EZROmBf0dWSt/o8fO9A1Wuc/2LwAPdrdfvg50iaKPqLV3ZLtvcanX0ridFcCKCBv1a7OFivBkdv19jyJ7aJisAU9MpADYG3Y2+vFeskO7gBA7npZhrwTCPqu++09zg1mMvfEYeYoALcxh/4V32r/fINcL2nm9vnWBr1/lrP/6C0a/en9cUWx5C+8sWuJvXPz9/wgbP1wTjcNmnuKy+9p+D5PX0ti1Wti/+x+It+0/kHwEGAC6nMT5Phf96AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-vimeo.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAIAAAAAlCAMAAAC9MRGkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjdCRTI2QzhCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjdCRTI2QzlCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyN0JFMjZDNkI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyN0JFMjZDN0I3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtoQdhgAAAAMUExURRkZGW9vb9bW1v///5zkxWUAAAAEdFJOU////wBAKqn0AAACKUlEQVR42sxXi47DMAjDzv//87V7NDYQLSfd1Is0aUkomDeJ8XEREcHxpRUfKU7xX0QQm/IDNwFg3AwA/wUAeK8LcF8W4LvyN9KQxxrjRgBfXv8HgNmZBK4Dvfkbb5DTrzHr/RVp1OqrN+d/GhN2PFUNxPGjtxZoZoVIhMt/CKNicViSHm8GzD2sVBE9fRyHHjKRcOgNr5IoJMhfdIIyUD2OpLFU/+NeC/F1TmNDV7WXX3W76MMEunwjnOfOxuEgtTAD0LFmMLYAKEy/QRQA7DQQ/TFRM3JQnMHcAd1b8BY+BUEaq1oDh0Ep7s0tkNPQ5CYAFXqxLkIuOIOySwAoJYFqWLeSYEPu4FODVZjYzgFAU089q2J8x+GaTgWQrNwDQIbTAoCPSsmEaKhQZ0sHIIRS5dJI7E5Eu6NXtTnO5DCTGCg+0P9ohJhvfQf/K/WaebR831UAKyweqWyrpwFQSy49gPDSOZ0FponQOwZWUYNUoMAxap7NfeTptxODGqhok5qaHa8MHR0Azgo7+updmi7xawBzqGH6Wgy4AJBqutTUBG1NJ6MLlow5RzJ07burtlwXjqQEzr4ClM+pEdwCAMcnAPZm3m1VL1z23IvR+ICdX1qvbwNA16JpALq5yqixBaCT9BCFVr68C1ifoXTXocosox5Y7fFMhmYeTA+TbrI14icLqsWwppuh2Bu0vozOgM2v0HOyh07/yk82mQ6vxfLesfJ0rB8BBgD+th6zPgbVaQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-winmedia.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAEAAAAA+CAMAAACsn+1dAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0VGNjQ0MjFCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0VGNjQ0MjJCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDRUY2NDQxRkI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDRUY2NDQyMEI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvZqmwEAAABUUExURePj4zk5Odzc3EpKSsTExLOzs/7+/qurq8zMzPn5+VNTU9TU1FxcXPX19by8vHx8fKOjo2RkZIODg4yMjJqammtra5OTk3R0dO3t7fHx8enp6f///4EE12UAAAAcdFJOU////////////////////////////////////wAXsuLXAAAFfUlEQVR42oyXiZKzKhCFCbKKLIoLkvd/z9sNGM3i/PdM1SRlPJ9Ns3RLnjcShPE5rn6NM2fkeavfP+1sHTtU/ygf3bgy+/8BNPZdU/8Yuu4Bgq8r/X8A6qt1iZIZSghVfN76wvD034AUi9u7LFBalw+R3NQjYrX/ADgMfghZ6EyLSFXSIssRED37C6Dx8X1ImppD9CWiU8CcrveAtHQ4zmTUKXMRtdRDEJu9AZABH58Nu0q9iSbZPbox/QRk9DvqDp0Epk4eYTCM0f4A7CP6FW8q/g9WEUXCJr4BE/g5ky+/407hMiDU4Hf3oikOo4hfgAD5m52sco5zRaw4ZGFfAMNVuJrhXvkBMJh/F4ok2pN4V4bgGoAzD7NJ3wEbLB8e5jmEWTrJifgW4TC+EiDnw6PzbwBcgBH8IPA7LX7JAlmWGPkKAbMLQI99N4YVFXhg4k4uNIKEKVsuAN53/QSnBx4ewQnxF6HEKadXCAWw9d2wRhQM0P4B2CEDZaAzrDr/Api+78d1AkEARPwlGmQZasBtQw/ADIAtgj/yoF4poz9RLMgVxjp73DcNoBcA+An+Vi5fE2Ccoj9Gk2AMMNR1grRtDUDBP3iUPAMQCldy1r9CKNkaur7fK4AfgInLfN7IGRwGlHxGQWAMMNgCYAWwzwdg5fzyJIm7EDayeY9CczljvgcwzRkBdCqAbduCPEcg+Czr1pRSvSGYDAdgMghgmMMB/JuU9LxPxhm3Bmhe5+viNEFCwhHQe4UAN/bDgADP5WXmgo8vTT6aYwSCSAB4j4DFFcA2juPiPQLgOD8AM1yaquD2ZVl1qxNEcr9sGHY3cgTIUrqGcdg4T69KItZxu2hZOl78UB84h0FFzHpkCOAYDCRhmTjP5Zai2I9LE0Q4dCPF3zACzmnKeNZRshdAX0vh4hugIqZuOAWnRao/WRwCJVhpYJWkMgt4nEMICwyhPQUJHi9WdY/N1PgRQLl7B5it3jpu3BlhD8LWOgPI0OBedmu14o6QVu0sAsjUHjRKpsotBbA8ukexd+Gw44/WMq5yBZgkyl4IJYnD0EfFst4LAgFVcb/Y990S50xuIbTNRLviH4YF6g7cgwghxmJf6Bk8+pM1jpE6B5Tqdh4M1T8OQbG0o6wugAGWcLUWN/hTZk6l3GZRtBMpVv8Im4NRuAkhgj86+WVPCWo3AUAuXcdxpLHqB3GqSM54464zzPzerNWMT1bM2FRDIPYA2KX4YclNxBggFITWxXSa0QS9R7IVRbJ4Heuy+kEhlYqcG+RQbkHD4iEQU71iz7qQlwqAXcPS0Vjli+qVunbKZCBAXGqjbH6/TWYn9GQQ0swl66T4CyEney2u+1afD0d7pLouNHJVuZBJPuYEciPeyjurAfgpTnD47IC4NHi4ailJ+NRzVvVHhzIXPxxjUHeYFjYRem3wSMKH4iI/EJ8tzu5rACtWTmwwNDDqiifw5GOTHQAtvposipVlingQyyAZ0a1XLoeDPmURpn90aU9TAGto5YDRdBalNwDutZ+dqlmhYq0zNnm1M4TiSPer+QhA3PTKrFRu6WqDWrKnsv6UtfS2W4eig/0LK012yR/dv1NA7rp1oZ9qxS6KM9NWUm7F+QJQ5qnvItDEhG120A/iu07dT/o9jTRKQ+4BmQXfL1IxBwmE6ceVc7XnafAB0nILSIZH6J4Wacqpjwh9+in0dsvKTboHWKJk3KDQDNFB+vTZF2g6Q285bKvEJvz+nSnBO16Ifiwtx8zxfMvEuDBBK9svPga4tOv7ly44BIlhPKxx2pZxaGc1/ls2XOWQXPCLP177yhaikEQJHe0aW38AyxPmFhILm9J++L9ePCFhcNzAXlbqeOep67Km9NP+fP4nwABAqd+58y5bpgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-youtube.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAGgAAAAsCAMAAAC+Cw3pAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0VGNjQ0MjVCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0VGNjQ0MjZCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDRUY2NDQyM0I3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDRUY2NDQyNEI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pjwud7AAAAAwUExURXJyciUlJb29vXp6elZWVqWlpZSUlGZmZkhISP7+/v///4iIiLS0tMvLy9XV1enp6UUA9FQAAAALdFJOU/////////////8ASk8B8gAAAsVJREFUeNrU2Il2qyAQAFBkG5Dt///2zQJqNhN8bU875yQo2rkBEbFq/aFQvxeKsWHUwqHzQ8iBQie1GC9DNWf1OoyhD0WvyLpdg04ZQVLy3jvnsi4ue5XLFeic6VQ6UKWkXOeh+h66oTJRKcdp6BPngdKmDIjGByfaNl6MN4TAHOI+PdxT1H/Z5wFVaz03z1ubT6BGOeIe+gbCCn83KoTaoZisbYfy5SX6HLoZgHyRVG+Jo19sbYonUKG//xQ6UKoNqIRg6FqHkNY30MipH4bAA7RdKrNBUQWDTTEhlI8G3adQp/YWEVHXaJibgABDigGBtWPoWYzegWWDNHVaDYH3WsLjWm5npaoMgqeQlhJ3O2SphiXwOKM2HvBG7VCEAKsLgYZEhYABnuqBWkq/APptdA7lFnsHQpHx4vj8HcKM0PBTJTlL5QFS7yAJ6gA/dvim1jvkliUsi+W7d1n0il90BAuC5Mh7qCZVZQeLagw2kHsh71DDlJLbc9YsuSch7LS07SRuV7uDVoa0QHgzacwduRZ7sExAVMCo8lLcQAad0I7QglAYUJiBtm/1BKLM9LPX9FWQM8Y9gRpmdl8K9biH4sI5/yKUHcf3Q4epVU9CGXoQRCXPbMBZudKPnV41osxB6zRE9xGf9wIChsJlCMB8ADnO6iW3QNAh9xSy+Qj13DSdArgOtWdQo8kVm7UYmZhMgXDSomZ03KDoaR6l3Ig3T2h+Ccms1+ejJJuvIHkY1A1qsmYB6cEYx5C4gcKAog2UXMuqZQmhjWtUbQ/KRiUviTIRwJU+8yNoO9S3fTwuiXE9PhYMJSXXt13CeSnisRsIl1BJNnRWFnAXuFLZhCtgOQec1hnkrOm1t7eX4segPA3pdMVJ868tqw/zkfSVV0ufLjrTL8t6jkq+XX/9bxVDy9PGp4eQA5lO+p/X/9//n5N/AgwARJd9XoSn+uIAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/pagebreak.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDwAFAIABAJmZmf///yH5BAEAAAEALAAAAAAPAAUAAAINRI6JwO1vlFywsilBAQA7]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/pixel.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/evilgrin.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAr9JREFUeNpkU11IFFEU/mZ3dtzM9f8vSsulzAIjqSDZHsLIIoIeeogSXzJ6SSjoR0osTIgifDDyISJ7UCgjI18SpQRD60lKEC1tNVcT/1fXNd2Z2bmdM+OW1WHO3HvP+c53D+fcI+Ef6byBWiOMs8KAE4IMEn02rNjsqDtwBxfWYoUQ7Lbk4y0UQkdrVsEppOUdA+LSCWGY0ViYwOSnNxhubwRkHMmvRFuEwMabDxUokmWp9f2PPYh25wLxGqANAuo3a6Uz29nPOMIXRi42CcIaGvKKK7E9O4C756vQVf+MrKOA7jNXPrOd/YwjfOtvgs5y1GbuPwS7vRe7rg1gPMqDt819uHzwHhF4zZXP44oHuVcHTBzjOc4kMAyUpGzdDX32BTZKE3Al52AxvRjXu6iCcz0o6xQIpBfBlZqDTeQPE47xHMcEMlU6yqHYoQeAqLFyPHj6xEzNwBLUuSEkuYOorr1vVX2kBKGfgCPZDo4zCSTqg1AXYNOpXr46YLiOqssEloQ7XFahrHaaexFagLTaP5MAmh+PHgOpCUAiqSI7oDjWwalEQwuHEFKXoeohzM9LmJoDzl3y/yGgm9QV/5ji3ncUW860IEYG1juBGErQydykQfotqaSU5VDDcRCeM1TNIs4E8Xpq2AtP1meMtVwx0xcENDTrBnqV5pntvsYS5G/uBuM5LtLKTGqJmHyZIaaf28W76jzh/dojloUlGun3wV7RUbPX9DOO8RzHL5EShq97BBU2ebTKnZ2A3A198L7yYDLhMGLj0xBcnKZ2tmFnhoqwHouh/lG0f0Epx63W1pTE2ydxumAHHqakyYiPo1bJYWtYCKHpMvzzwMyUjvZ+lN5sQj3FBP4aJpJY0m1NF1GW4sIJmwQlMo2GgDq9iOaTNaDniUEO/m8a10gmaVJkTlaFn8VsJO214/xLgAEAIi4/dUpx5wsAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/grin.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAthJREFUeNpkk2tIVFEQx3/33n2p66uHpYVFGVRECJIR9a2ygkAoCiIiKiKoMCShSBTUKHpQGAZJFER+yd7RA6NASInK7ENgQpi6kZkPzLe77r2nObttWA1nLoe5////zJmZY/CPNZzgsmOzVzn4UBIwZJlMmBbX15zi0FSsUkr/jlpjCXl2iLqstdtIz9kMqbPBccA0YaCb782PaXtxG9PDhtUVPP9LQMg7BVeTe+Ai5ix/9NjJCbAlBUv2bl8kpH4M87a6ENuOimgBlxZwJjW5jPs3anlX/wZ7UnHuUREEJQOPSdGm83h8Funz5nLweDmvr5TWRU+RBBuKuTxv1TpcnlaGvFtYf7ITd/ZRGO8QD8DYFzaVPcPMPk3SkgIswWm85kUE5Jr7ZmZlY/fXsqdwI3XXqgn2tsJIJ/aYCIwGeHKlivDPYXYX5OH01aLxmqcFXKaB1xtn4vTbqI9rOFugL2sSHpKYY8hWcaG4TRJukP+VOMEw3mkmUlpvRMCS3ZNGB+M9JLoH8UlVEmfp3GRpLY2ypaZBaUa/lEXirIgj0Yx2z2UYOstXZOyqJyHOz4zMHPwJICtyhHAZ++2qtZnR8VE6H+wnKSYgnQotWeD1tDVexMqvobenmxHDxue2iHdZBG2HibC4XMdJXcbwhxIWz/fo2oYiAj3DPJgz0bo9YciN+fUp6Su3ywhCvAU+PQ6yH5duylQQeHMH1VJF6kI/HcKLDWGmDJLqvpWhHh+PV433SlRPSKmgilpYfEA+TXWV6mmxP4LTeM2LDVKgqZ0S0+qqyF2exLfAJZrLrpKcuQp/chpjI30MBl6TNn2c7CyD9k9dvGzhsOYRmyaxaeVb2bF2KVUz0yxSUnR7pK1yji5yOGwxMAh9PXaEXHqXm8IZ+usxiSWJL7p7hGNpieQL0RN7jYILSa0ebq3kjEQ+a/J/r3GKZYpPj07CH5My0h9Le+pz/iXAAHtZPk46B+yfAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/happy.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtpJREFUeNpkk1tIVFEUhr85Z2YcKy8ZZVfToqhIyC5YGT1EVg9BDxJRvmU3aCAfikAxqCiKKLKy20Mv+lCYohCIVkIxZRBGQWQho1ZGmpZOWurMnLNb+0wDWouzzubs8/9rr7X+tV38Y4ESKmyLvcrGh5INlzwGo4bJnQ1nOTweq5TSv2P2rIwtdpjGhZt3MmvVdkidqRHCFshgD19bHxB8VI3hZWveaZomBBByoWlStebAZYyZSTGSCkPUBtMAw4POxu4Z4uXtYiwrFkQHcOsAdoSq3H1nuHLyOl86v2BbNh6vh3M1fi7sr6Snux9DAs3NmoO/5AwtN0obY8WBO1BKxfy1+ZiTgizLNii+uktOtmBE/Gcnxy5tBJ+c4zWpv/jUwWXmbSFQ2lQh/MNuyaIoffEKntfe5HH9GA/rOgiP2pRX5mJFbEyPwZEdL/D6TAwpLWN2NctzD9HV0lTkBJDaEjwJJq0vhthVmMLK9SmoiCIc6kLZCstwcfnWbFweF6+ehwg0h8jZaOqeJDgl6Jf1ewD/QV1ViGh/SDcJW0v4V0YlLjKyYinkLInh4+aONXyACqloRhqkpbrwuBPwehPxiUeiY4xFRp11MAS93232Fw84QjkBRKjwyI9ub9aabWTuaWCK5DTZB1MkQVmIiA/L65eo+isKiVXbETyapwMY/cPUfesMkpf1mu6Go87sqKgjrWMylc633v90r4h181vReM2Ll5EhUqre+/NU311TPb6Yo4If3qgRFbOIeFf7W/WkfLXzX+M0XvPig/Sp9SNlhvvz6QWLp5I96x3B2jx6p+aTnJrO8FAf/Ghi2bwwVjSZjrbPNL/Hr3nEp0ks7VQBuzct5dr0dDepKUgjrdisCyISdTMwCP3fojS34T9RQ6Vwfk64TGLJ4otqjnB8ehI7RH5vXEaRNNw3RH1BOedlp12T/7uN4yxDfJpu8Lg9aTrf42mPv85/BBgAoT1JaMKxwuQAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/smile.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArVJREFUeNpkk1tIFGEUx387ey1QXHNruymhCT1FFyvLKFIqKOpBeogiym4PCeGDBFmYhEEERaAPWxp0Q+gCBhFsJBXdoIuhEUW5lpJo7bquZrbuNrOdb7fBrQ4zzHzn+///c+Z/vmPhn3h8mEZDpyJh4CIhCYtcGlHNyoWSExxIxyYSCbWdiidHWavH8BeUbWH6oo3g9oIhCppAhgbof3WbrnvXsTpYt+I4d/8SEPI2TePKkv1n0LwZ8klJJ+KgG2DVZG1XaIyB7zz3VWEYKRElYFMCRlyR62i9dI2XD14I2EI0qnPaX01V6SmcLiua1ULR6iI27azjma/Wn/o50X9cQ2PesrIi9+yftHWuonj7fvpDw9Sf3wGjr1m7YztZhYsJRApITC5m6cK34omX8vzuqblrjt3RpJzdOfnz0UMt7Du0ixvn7tEXnEWvswbCb+h1HaHJFyb8zcne6gr0YAsKr3iqAps47bQ5bMSD4Og5TMPFpqSpsYif8ZEvzBjz47vqS+aMz3uI/RBSjvy58FICaiM6jD4OP7ubIdA80SbVwvb1xM2E5U9bBW+GTRluxCIYv8zekmz/v5Hk/mm6wpvvmnwlFpU+J3QXne0Cks5ZdNlRgvHUU61VvkP2FS6JF15SIDRK62DPR3F2Nh43PLwPoX7hRSfEgrJ++ghmeUniFF7xzMpypZU9BQvycdqH6Pscpr0DxqKmETDJBSuXy+H0ZDP+y03X6wAl9eTJQepVJva+7OGoZgscn1PoYfpMNxs8I6rWNDOtchgzif6w8ulDgLb3VCqeWYGK7LpytpbOoyFnmoOsLDt2+4SBcfEiEokT+hqj7R2VtTe5LOmRv4ZJIlPuuTcPcsiTwWaZIYc5jTJTseB3bpWf5aRkPiryf9OYFrlyT1EGp+XETgbNstPH+bcAAwDqTx9DvZUusgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/surprised.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAq5JREFUeNpkk1tsTGEQx3/nnN21aAVL8bAqmkpIqHvSlCei9aAN4hZP6vZAUpFIhbQiIuFFEBJVlbpEeWiCt5XwgohoSQitFKtSt26vqG539+wxc3aXYrKT2W/m/5+Zb858Bv/Ig4OcdWzKnSR+HHEY8jOJGhYXlxxl13Cs4zgaTsnDKlY4cUL5xRvJWVQKo6eI1xa1YOAznU9u0xa6juGluOgIdzIJzDR5s2URKtpzkp/+IDdrr3KwbL1E3rtWz+rXuOK0WKaw28H9/TiFOw9z60aIV03PmVuYx8wF08lbPIM3j1/T0hzm+eMwsxbOpnRDMY/OVbP0GIbbgd45t3A5lq+VT5RSVFHP0w9TmFYwD3pfkDtnHjnzSxjKXSfxVYJrQfHK0+JmMsnWCXkF2F0N7KjcQmPtXT53B/k4qgqn/yUdo6u5WNtDb2QEO/aVY0caULzyNIFHJj3C4/MQj4Cv/QBnLl1w75boD2EPdBCMhqi5dt71Jd9vIzYgpAkelJdKoIFoP/YQDL6rwwzX4RWvx6v9ibaWkIhDPCE4Jz04wWfEY8gYk0N92PGUwxRi0zM4UQfRKPj9sHc7FMziD0bwRnoBTMcgFu37gpOQvRGAlYSay7IG0uCkQMrW1Kf8Glecixeem6DrBze72tvkX9C9RjKW+rbZUjnLl7J6Vr/GFad45bkJ1pxm39fwRwYHpIQ5noS0PTZLBioLqLNQq2f1a1xxilce6TF9aG6nKvziLbGfFrYzjk0rLUbKLAzJ6Rdbvjrl17ji7rWyW3m/N1Fk/OG1bFo2kzMTJ/sIBLyMlLvroGTZGJTq3T1xIl9i3G1h96FGrgjn21+PSWSMaH5jBZU52ZSZJr5MQJYm1vmdW2tPcVyObUr+7zUOk6migfT1fucQ7c60Pfw5/xJgACgUIR+c+CDRAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/tongue.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtZJREFUeNpkk21IFFEUhp+d3dYtU7I0tyL9kQVREBQrlZGRpkSikARFIlGEVEL0Q4o+MJGCCJIif0RkUP2xEiz6QLHow5A+xELBQMvKajcyF3Xddsfdmc6d1dC6zOXOOed93znnnjk2/lmtR6k1ouw2DVyY4rDJoxHS7NStO82ByVjTNFU4tl6cIC+q05SRu415qwogyQ2GKGgC8fvwtt+jt+UWdif5WdU0TxEQ8k5N40ZmWQ2aO0E+KW5zDKIG2DWxpyk0hm+EV5cOYRgxESXgUALGmCJX0XjtJm+evBawjVAoyrmmCg7lnCXOZUez2/Bs8FC4q4q2S5VNseJEv/UYtemrcz1Jab953JnN2pIyfAPDnLpcCoEO8kpLSFri4cPQEohfQ+bKLrkTN8WLPs5N23jygSbp7EnJWAGD9eyv2Evj1Wd4B9Ppdx0TXxf9049Td2WIYX88+ySOvx6FVzyVgcNmEud0OXh+xyDQvJnCvHIWrdrCvGAL+shXFvxu4UhlNb1v7vOwJp+ZGGQVOVA8S0DKJRIcItMj9TheSf2lRL+D3k+six2bSLXD/IVipMm9RmJ4c7x/mrrwaHiISBju3oZ3byEo74ZcvOGMncpWfhVXOIW3jQs45Ct6yO912iMusteHaGuHOfW5mHEGvuanuPOysYU1vNktEhfymAvd71XZ6VYGAwEaBz73SK4LsUnb12VBuL+biLebhOWp1qls5VdxhVN4xbMEtl6g4kffN4IBFZ1NNAihdD8DvlHM+HjrHFs2aPlVXOEUXvEsAdlf2j9zoq/zA+Gg3JY5i5TtIQKhIJ9e9lnn7IKw5VdxhXv8nnLFY+JvUtJVxezIWcrFZLeTpGQHzhnWECFDhT4q7f8VkWx0HnVTXtnAdeEMTxkmWYmyFzcc5HBKIkUyQ86JgMyU/nOYO8XnOSNmjyL/N42TlnSbOePl/dWQ/Wsi7cnj/EeAAQBuJUZ/HpqiqwAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/unhappy.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAqxJREFUeNpkk1tIVFEUhr9zZhwHpbC0gShTGg0M0uwGYr1EpC8pJFlRD2VhDwn2IkWhUBHUW0VBZUpRZD0I2tsECWFRkRUYpjGaFzTLS45pNvfT2ufMmNXiLDb7X/9a699rn63xjz0/w3UjQoURxYkhgCafjl+z0bj1AscXcg3DUGHLXtSy0wjhyS7ah2tzCSQvFzQiboOfo4y9eYzX8xAtgaLC8zyJF9BjyQdsNjyFJy4z50ynpf4+Z0rLJTJgrmqvcBVXPNUs3thU0H4Ko+DYWVofefjY0cn6Ajc5G1fj3rKG3tef6H7bT+frftZuWkfJ3iJe3qhj20U0U4E6c0bBDmyOHr5QQmH1Hd4NLSczLx+mPpCRm49rQzGBjD0S3yW8bhRf5anmejTKkTR3HpGJJipPHqa5/imjk+mMJNViTHcxnFxHY/13psYTqaypIDLehOKrPFXALpNOtDvshMbBMXiaa3dvm2cL+jwEZ4ZZ8cvDzQe3TCw6cJTgT0lKs6PyrAIq4J8mEoC5zw1ofQ3WYLSYvy8mbE5cXIvBwo+bXRMkGvARCWFeuy57XbfWuIlcyw2rgC58LRa3S9Wg3/fVoYedUsGPJpran4G3F5OkOmdnwdZtwg4rFU6Er9QEzQITs7RMDHrLXSvTic55edcBKYvh0ME/Cro+wptXsD5XuielI3xUnnkLu69S861/hF+zolFfSrID1mRCQIYVmLVWtVe4iiue4qs8s4D40NtBavs/9AnZhjtrCeGAjYhfFMtgrdXCVVzx2nqoUnnzf6LY0nNl7N+ew7VUl4OUlAQSEoi/JUIyYJ8vxORYkLZuquqauSfwj78ek5icnOzmak4uW0Sp3IIjXkGmHxyfobXsCpcE8ark/17jAlslnho73vxNik/GZS98zr8FGADkBCPaDyrVMQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/waii.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArNJREFUeNpkk1tIFGEUx387szeCSlcq09TCioyKLoSS1UMXewkipKR6604J+hJBEhFhFFF0s9tDL/YWhkIEWvlQawZlQT0UbNumZG612Zhd3NlmpvPttLHaYc7AnPmf/3fO/5zPwxgLH6LJttju2ARxJOCRR2NE07m+/Dj7s7GO46jfrnUdpso2aS9ds4mpS9ZDTr5CSLZAjDgDPbeJ3ruJ5mdd5TE6RhFI8jZd58bS3WfR8se7SY4Jv23QNdB8qGrs+DBPrtVjWS6JIvAqAjvFjfKdjZw/eon+WD+2ZePz+zjRUsupXc3E3yfQhGjajEJqDzXSfbmh3W0OvOEGmkoq1qKPizJ3vkb9hRo52YJf4t9iHDizEoJyjl+n7fSDNG56ZRXhho4myd/vlSp2TJm9kEe3rnC/Lcnd1reYIzbnmsuxUja6T6Nuw2P8QR1NWisuuMm88r286+7YkSaQ3gK+gE5P9zA1W3NYvGwijvRuGu+wRQJLJDh7tQCPED3rGiLcabBopa40CaRbUK/fPwz27ZGYx8BMGIgE6QGkhfO4rgnRgjLxOS4+Y14lhZ0covMO5BdAKIQIKFPMcQFqIJ/irmSDgxD/AKs2DpFZAK8cYv78OuCvqAjy7OkIL55DKjV6uRSJV2qdVggKJ3hVnJkmSHynNRGLbJ5SVMTiBRGWLHQTxppqyVFr4S3iYyyCyuPvLIsfNtA7c1Epfu2rtDOY3uCxpoBaIIRp5/LmeZQVjZTIIvWJNPT19HI49jJK8qeoq+VimzpWkn+uvlVc/Ve4ztfUqrwMsbLQ0Wq2rC7jYt5kvwjow+dubxqgNDGMFF8+mdx/Re2RFpol/G3UZRKbID6rpY6Dk8azQfPgzzDYDubnYdqqz3FSIhGV/N9tzLJi8TzVclZM5ONLpuzs6/xHgAEARVUbYg/cRp4AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/wink.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsRJREFUeNpkk11IVFEQx3/33v0KtfxIrazMMqKXKEuiLAg0fYl6KIIQopIiUKieiixMpCAKoUjCh3ypp2IpQQ3LgsgoClMIKlitVgMl13LLr73Xvducu7thNezcnTNn5n9mzv+Mxj/SfZYmO8qRmI2PmDg0+enM6AYt2y5RPTc2Foup7bi8OEd5NELnyrJ9LN64Cz1jUXxDk5DxEYZ72ujvuofhoaKkgUd/AUhypVh3ig5fwbcwFXSVOCv/su11ie1W0dgjv3jdfArbjoMoAJcCiFrc2VRVjy9tSBY+sGyFD26dk+VX8c1zoRsaxTuK2X2onpfNdZ3x5sDVXUtT/uadzEv9JMsQ2Auc09QxWBaNbQ287ZukrT3EiFaI4e0jf0sZ3bVdTZJQ7ZLYqtw16+luvcn9uzMOcMyOMWvNcv32Or5m+Wm5VY3Pm8KFy0fh/UKyC0/x5VVXlQMglXrdHoPeVxNUHlxA0dZ0OV36jUaxwoMsmX7KmboGAm/aedhYQYpmU7LHhSZ5TgvqY02Oc/yYGHqYyGjYqV51IVSi9ZSSI93m5sl+XtwfnQoTS/Cnq6uIzoQxp+HZYznckrWZULFnRU2xI9NxtaTLaCTssOsACKA5/WNYEn1kZ0GrH0aG4qUJeRgSoCtShFXbxImbkXiV57QQmuDBWDCwP2fpMlbkBZzAjg6YmEgw6YGC/IQWCGDKMkLBACqPBJfLn9cSLNywCo/xQ3C/C+f8KTF5F+peNE8mpp1Bf+8A2y+SLw9pUL25wZ4g5z+/GyAyaWCTgTllEJEKlJqTqm9DLi2DiPhV3NOP1Ki8ZAVKMuv3cqB0LTeycjykp7txu0nOknpPjI9bjH0zefKBmjo/t8X9869hEpkvutp/gtPZaeyRMfAkEeRZmKO/aN17jcviCajk/6ZxjiwXzSI+UklRPIwly547zr8FGAAr1TRVoSlw5QAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/yandex-maps.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAF8AAAA9CAMAAAD8rkWWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjdCRTI2Q0NCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjdCRTI2Q0RCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyN0JFMjZDQUI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyN0JFMjZDQkI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlM+Y38AAAAYUExURYeHh/39/ejo6NTU1Kqqqg0NDXR0dP///72IN64AAAAIdFJOU/////////8A3oO9WQAAAr9JREFUeNrsl4lu5CAMhn3BvP8bL7440iTtZIu6qtZSOyHAh/nBhsDLjUTA7PW95jwCqG5b+Jz0PXxSvLQH2cNXvBX28FUd3sjv7u/hI7j4u/hUU549fO7y/GN8YrqttepTPpXir2opwZASlg6wlaI2nyA7UrVqCf5Bf+2b/fjAr2uZZj7lC8rWCBa98i5fAVV6Mbg1yqjzxDYHPt//J3yfeZ2Eq1O983VQnGViiy+px/j9lI+mrZVh8LOEY2GUrwHmA3yZnw0gfg2I6b70VfL8ZukZ7vnuW/JrNJBAGh98TlYrt/n/nC+DX6Z5UPAxO029xvn1gc9qC587H0/40Nt2nQb/hY0MAhM/jbtPY9tQOTTQ8brodMJ35emSj5/yS5enqzv4bQsBr/xVH/rABwlFqfsfbU/4sXHocn3ZwRN/yW06Xu4p673qQ+7+DR88dG74lDF3ws91vebHi2n/8JFvwZBa8iG+gG75uPJfZYqgJX5lSh7z/STC4IovkVmO8bvwLVtENJf1fuLuX/OzPOcf+cBPx2Wq9ftDRMEVn/PYqlPCnweI9Y4J4BSXYHuTbvl1DqdiG94isIpG/MTHOD8laltahsn9K35ZjZfzbOTPMYHhkSYdSPf1mg5TNN3xM4fYbDo/J5DDC37lPjJvFhl7W28geHc/wZHfnvDf+H75aX4/TlV2+m7+33/f/ef/Wv52qzvt1/KBUCq3b5D2gKgXGGrfc4jta4rC9I03ZqK3+Ygijdx+zWo+cD5oVWDbuE/46r6oy9xgimUbUVpFexSw2Tznt1724aE44zdv2wBi/8GbiB3Bz/hovTjEcG8PfDN67j8rinQhLviiay6P9UfQP/XP9BdwzTo/RnzIN4FDBBlqHPV5zK8xAVPKBfMdufKlzY+ex2+0sAHfjvav5wfjb8w/u/n1USbcfrr8EWAAvpV+aDrS8qEAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/js/elrte.full.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGVsUlRFIFdZU0lXWUcgSFRNTC1lZGl0b3IKICogVmVyc2lvbiAxLjEgKDIwMTAtMDktMjApCiAqIGh0dHA6Ly9lbHJ0ZS5vcmcKICoKICogQ29weXJpZ2h0IDIwMTAsIFN0dWRpbyA0MiBMdGQuCiAqIExpY2Vuc2VkIHVuZGVyIGEgMyBjbGF1c2VzIEJTRCBsaWNlbnNlCiAqLwoKLyoqCiAqIEBjbGFzcyBlbGkxOG4KICogSmF2YXNjcmlwdCBhcHBsaWNhdGlvbnMgbG9jYWxpemF0aW9uIAogKgogKiBAcGFyYW0gT2JqZWN0IG8gLSBjbGFzcyBvcHRpb25zLiBPYmplY3QuIHt0ZXh0ZG9tYWluIDogJ9C40LzRj1/Qs9GA0YPQv9C/0Ytf0YHQvtC+0LHRidC10L3QuNC5JywgbWVzc2FnZXMgOiB7dGV4dGRvbWFpbjEgOiB7fVssIHRleHRkb21haW4yIDoge31dLi4ufX0KICoKICogVXNhZ2U6CiAqIAogKiB2YXIgbXNncyA9IHsgSGVsbG8gOiAn0J/RgNC10LLRjdC0JywgJ0hlbGxvICV1c2VyJyA6ICfQn9GA0LXQstC10LQgJXVzZXInIH07CiAqIC8vbG9hZCBtZXNzYWdlcyBhbmQgc2V0IGRlZmF1bHQgdGV4dGRvbWFpbgogKiB2YXIgdHJhbnNsYXRvciA9IG5ldyBlbGkxOG4oIHt0ZXh0ZG9tYWluIDogJ3Rlc3QnLCBtZXNzYWdlcyA6IHt0ZXN0IDogbXNnc319ICkKICogd2luZG93LmNvbnNvbGUubG9nKHRyYW5zbGF0b3IudHJhbnNsYXRlKCdIZWxsbycpKTsKICogd2luZG93LmNvbnNvbGUubG9nKHRyYW5zbGF0b3IuZm9ybWF0KCdIZWxsbyAldXNlcicsIHt1c2VyIDogJ0RhdmlkIEJsYWluJ30pKQogKiAvLyBjcmVhdGUgbmV3IHRleHRkb21haW4KICogdHJhbnNsYXRvci5sb2FkKHt0ZXN0MiA6IHsnR29vZGJ5ZScgOiAnSmEsIGRldmEgbWF0YSEnfSB9KQogKiAvLyBhbmQgdXNlIGl0LCB3aXRob3V0IGNoYW5naW5nIGRlZmF1bHQgb25lCiAqIHdpbmRvdy5jb25zb2xlLmxvZyh0cmFuc2xhdG9yLnRyYW5zbGF0ZSgnR29vZGJ5ZScsICd0ZXN0MicpKTsKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IChkaW8pIExldmFzaG92IGRpb0BzdGQ0Mi5ydQogKiBsaWNlbnNlOiAgIEJTRCBsaWNlbnNlCiAqKi8KZnVuY3Rpb24gZWxpMThuKG8pIHsKCQoJLyoqCgkgKiBHZXQvc2V0IGRlZmF1bHQgdGV4dGRvbWFpbgoJICoKCSAqIEBwYXJhbSBTdHJpbmcgZCBuZXcgdGV4dGRvbWFpbiBuYW1lCgkgKiBAcmV0dXJuIFN0cmluZyAgZGVmYXVsdCB0ZXh0ZG9tYWluCgkgKiovCgl0aGlzLnRleHRkb21haW4gPSBmdW5jdGlvbihkKSB7CgkJcmV0dXJuIHRoaXMubWVzc2FnZXNbZF0gPyB0aGlzLl9kb21haW4gPSBkIDogdGhpcy5fZG9tYWluOwoJfQoJCglvICYmIG8ubWVzc2FnZXMgICAmJiB0aGlzLmxvYWQoby5tZXNzYWdlcyk7CglvICYmIG8udGV4dGRvbWFpbiAmJiB0aGlzLnRleHRkb21haW4oby50ZXh0ZG9tYWluKTsKfQoKZWxpMThuLnByb3RvdHlwZSA9IG5ldyBmdW5jdGlvbigpIHsKCQoJLyoqCgkgKiBAdmFyIE9iamVjdCBtZXNzYWdlcyAoa2V5IC0gbWVzc2FnZXMgaW4gRW5nbGlzaCBvciBtZXNzYWdlIGhhbmRsZXIsIHZhbHVlIC0gbWVzc2FnZSBpbiBzZWxlY3RlZCBsYW5ndWFnZSkKCSAqKi8KCXRoaXMubWVzc2FnZXMgPSB7fTsKCS8qKgoJICogQHZhciBTdHJpbmcgZGVmYXVsdCB0ZXh0ZG9tYWluCgkgKiovCgl0aGlzLl9kb21haW4gICA9ICcnOwoJCgkvKioKCSAqIExvYWQgbmV3IG1lc3NhZ2VzCgkgKgoJICogQHBhcmFtIE9iamVjdCBtc2dzIC0gbWVzc2FnZXMgKGtleSAtIHRleHRkb21haW4gbmFtZSwgdmFsdWUgLSBtZXNzYWdlcyBPYmplY3QpCgkgKiBAcmV0dXJuIE9iamVjdCB0aGlzCgkgKiovCgl0aGlzLmxvYWQgPSBmdW5jdGlvbihtc2dzKSB7CgkJaWYgKHR5cGVvZihtc2dzKSA9PSAnb2JqZWN0JykgewoJCQlmb3IgKHZhciBkIGluIG1zZ3MpIHsKCQkJCXZhciBfbXNncyA9IG1zZ3NbZF07CgkJCQlpZiAodHlwZW9mKF9tc2dzKSA9PSAnb2JqZWN0JykgewoJCQkJCWlmICghdGhpcy5tZXNzYWdlc1tkXSkgewoJCQkJCQl0aGlzLm1lc3NhZ2VzW2RdID0ge307IAoJCQkJCX0KCQkJCQlmb3IgKHZhciBrIGluIF9tc2dzKSB7CgkJCQkJCWlmICh0eXBlb2YoX21zZ3Nba10pID09ICdzdHJpbmcnKSB7CgkJCQkJCQl0aGlzLm1lc3NhZ2VzW2RdW2tdID0gX21zZ3Nba107CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIHRoaXM7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdHJhbnNsYXRlZCBtZXNzYWdlLCBpZiBtZXNzYWdlIGV4aXN0cyBpbiByZXF1aXJlZCBvciBkZWZhdWx0IHRleHRkb21haW4sIG90aGVyd2lzZSByZXR1cm5zIG9yaWdpbmFsIG1lc3NhZ2UKCSAqCgkgKiBAcGFyYW0gIFN0cmluZyBtc2cgLSBtZXNzYWdlCgkgKiBAcGFyYW0gIFN0cmluZyBkIC0gdGV4dGRvbWFpbi4gSWYgZW1wdHksIGRlZmF1bHQgdGV4dGRvbWFpbiB3aWxsIGJlIHVzZWQKCSAqIEByZXR1cm4gU3RyaW5nIHRyYW5zbGF0ZWQgbWVzc2FnZQoJICoqLwoJdGhpcy50cmFuc2xhdGUgPSBmdW5jdGlvbihtc2csIGQpIHsKCQl2YXIgZCA9IGQgJiYgdGhpcy5tZXNzYWdlc1tkXSA/IGQgOiB0aGlzLl9kb21haW47CgkJcmV0dXJuIHRoaXMubWVzc2FnZXNbZF0gJiYgdGhpcy5tZXNzYWdlc1tkXVttc2ddID8gdGhpcy5tZXNzYWdlc1tkXVttc2ddIDogbXNnOwoJCQoJfQoJCgkvKioKCSAqIFRyYW5zbGF0ZSBtZXNzYWdlIGFuZCByZXBsYWNlIHBsYWNlaG9sZGVycyAoJXBsYWNlaG9sZGVyKQoJICoKCSAqIEBwYXJhbSAgU3RyaW5nICBtc2cgLSBtZXNzYWdlCgkgKiBAcGFyYW0gIE9iamVjdCAgcmVwbGFjZW1lbnQgZm9yIHBsYWNlaG9sZGVycyAoa2V5cyAtIHBsYWNlaG9sZGVycyBuYW1lIHdpdGhvdXQgbGVhZGluZyAlLCB2YWx1ZXMgLSByZXBsYWNlbWVudHMpCgkgKiBAcGFyYW0gIFN0cmluZyAgZCAtIHRleHRkb21haW4uIElmIGVtcHR5LCBkZWZhdWx0IHRleHRkb21haW4gd2lsbCBiZSB1c2VkCgkgKiBAcmV0dXJuIFN0cmluZyAgdHJhbnNsYXRlZCBtZXNzYWdlCgkgKiovCgl0aGlzLmZvcm1hdCA9IGZ1bmN0aW9uKG1zZywgZGF0YSwgZCkgewoJCW1zZyA9IHRoaXMudHJhbnNsYXRlKG1zZywgZCk7CgkJaWYgKHR5cGVvZihkYXRhKSA9PSAnb2JqZWN0JykgewoJCQlmb3IgKHZhciBpIGluIGRhdGEpIHsKCQkJCW1zZyA9IG1zZy5yZXBsYWNlKCclJytpLCB0aGlzLnRyYW5zbGF0ZShkYXRhW2ldLCBkKSk7CgkJCX0KCQl9CgkJcmV0dXJuIG1zZzsKCX0KfQovKioKICogQGNsYXNzIGVsRGlhbG9nRm9ybQogKiBXcmFwZXIgZm9yIGpxdWVyeS51aS5kaWFsb2cgYW5kIGpxdWVyeS51aS50YWJzCiAqICBDcmVhdGUgZm9ybSBpbiBkaWFsb2cuIFlvdSBjYW4gZGVjb3JhdGUgaXQgYXMgeW91IHdpc2ggLSB3aXRoIHRhYnMgb3IvYW5kIHRhYmxlcwogKgogKiBVc2FnZToKICogICB2YXIgZCA9IG5ldyBlbERpYWxvZ0Zvcm0ob3B0cykKICogICBkLmFwcGVuZChbJ0ZpZWxkIG5hbWU6ICcsICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmMSIgLz4nKV0pCiAqCQkuc2VwYXJhdG9yKCkKICoJCS5hcHBlbmQoWydBbm90aGVyIGZpZWxkIG5hbWU6ICcsICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmMiIgLz4nKV0pCiAqICAgICAgLm9wZW4oKQogKiB3aWxsIGNyZWF0ZSBkaWFsb2cgd2l0aCBwYWlyIHRleHQgZmllbGQgc2VwYXJhdGVkIGJ5IGhvcml6b250YWwgcnVsZQogKiBDYWxsaW5nIGFwcGVuZCgpIHdpdGggMiBhZGRpdGlvbmFsIGFyZ3VtZW50cyAoIGQuYXBwZW5kKFsuLl0sIG51bGwsIHRydWUpKSAKICogIC0gd2lsbCBjcmVhdGUgdGFibGUgaW4gZGlhbG9nIGFuZCBwdXQgdGV4dCBpbnB1dHMgYW5kIGxhYmVscyBpbiB0YWJsZSBjZWxscwogKgogKiBEaWFsb2cgd2l0aCB0YWJzOgogKiAgIHZhciBkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKQogKiAgIGQudGFiKCdmaXJzdCcsICdGaXJzdCB0YWIgbGFiZWwpCiAqIAkgIC50YWIoJ3NlY29uZCcsICdTZWNvbmQgdGFiIGxhYmVsKQogKiAgICAuYXBwZW5kKFsnRmllbGQgbmFtZTogJywgJCgnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImYxIiAvPicpXSwgJ2ZpcnN0JywgdHJ1ZSkgIC0gYWRkIGxhYmVsIGFuZCBpbnB1dCB0byBmaXJzdCB0YWIgaW4gdGFibGUgKHRhYmxlIHdpbGwgY3JlYXRlIGF1dG9tYWdpY2FseSkKICogICAgLmFwcGVuZChbJ0ZpZWxkIG5hbWUgMjogJywgJCgnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImYyIiAvPicpXSwgJ3NlY29uZCcsIHRydWUpICAtIHNhbWUgaW4gc2Vjb24gdGFiCiAqCiAqIE9wdGlvbnM6CiAqICAgY2xhc3MgICAgIC0gY3NzIGNsYXNzIGZvciBkaWFsb2cKICogICBzdWJtaXQgICAgLSBmb3JtIHN1Ym1pdCBldmVudCBjYWxsYmFjay4gQWNjZXB0IDIgYXJncyAtIGV2ZW50IGFuZCB0aGlzIG9iamVjdAogKiAgIGFqYXhGb3JtICAtIGFyZ3VtZW50cyBmb3IgYWpheEZvcm0sIGlmIG5lZWRlZCAoZG9udCBmb3JnZXQgaW5jbHVkZSBqcXVlcnkuZm9ybS5qcykKICogICB0YWJzICAgICAgLSBhcmd1bWVudHMgZm9yIHVpLnRhYnMKICogICBkaWFsb2cgICAgLSBhcmd1bWVudHMgZm9yIHVpLmRpYWxvZwogKiAgIG5hbWUgICAgICAtIGhpZGRlbiB0ZXh0IGZpZWxkIGluIHdpY2ggc2VsZWN0ZWQgdmFsdWUgd2lsbCBzYXZlZAogKgogKiBOb3RpY2UhCiAqIFdoZW4gY2xvc2UgZGlhbG9nLCBpdCB3aWxsIGRlc3Ryb2luZyBpbnNlYWQgb2YgZGlhbG9nKCdjbG9zZScpLiBSZWFzb24gLSBzdHJhbmdlIGJ1ZyB3aXRoIHRhYnMgaW4gZGlhbG9nIG9uIHNlY29uZGFyeSBvcGVuaW5nLiAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKgogKiovCgpmdW5jdGlvbiBlbERpYWxvZ0Zvcm0obykgewoJdmFyIHNlbGYgPSB0aGlzOwoJCgl2YXIgZGVmYXVsdHMgPSB7CgkJJ2NsYXNzJyAgIDogJ2VsLWRpYWxvZ2Zvcm0nLAoJCXN1Ym1pdCAgICA6IGZ1bmN0aW9uKGUsIGQpIHsgd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUubG9nICYmIHdpbmRvdy5jb25zb2xlLmxvZygnc3VibWl0IGNhbGxlZCcpOyBkLmNsb3NlKCk7IH0sCgkJZm9ybSAgICAgIDogeyBhY3Rpb24gOiB3aW5kb3cubG9jYXRpb24uaHJlZiwJbWV0aG9kIDogJ3Bvc3QnCX0sCgkJYWpheEZvcm0gIDogbnVsbCwKCQl2YWxpZGF0ZSAgOiBudWxsLAoJCXNwaW5uZXIgICA6ICdMb2FkaW5nJywKCQl0YWJzICAgICAgOiB7IGFjdGl2ZTogMCB9LAoJCXRhYlByZWZpeCA6ICdlbC1kZi10YWItJywKCQlkaWFsb2cgICAgOiB7CgkJCXRpdGxlICAgICA6ICdkaWFsb2cnLAoJCQlhdXRvT3BlbiAgOiBmYWxzZSwKCQkJbW9kYWwgICAgIDogdHJ1ZSwKCQkJcmVzaXphYmxlIDogZmFsc2UsCgkJCWJ1dHRvbnMgIDogewoJCQkJQ2FuY2VsIDogZnVuY3Rpb24oKSB7IHNlbGYuY2xvc2UoKTsgfSwKCQkJCU9rICAgICA6IGZ1bmN0aW9uKCkgeyBzZWxmLmZvcm0udHJpZ2dlcignc3VibWl0Jyk7IH0KCQkJfQoJCX0KCX07CgoJdGhpcy5vcHRzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBkZWZhdWx0cywgbywge2RpYWxvZyA6IHsgYXV0b09wZW4gOiBmYWxzZSwgY2xvc2UgOiBmdW5jdGlvbigpIHsgc2VsZi5jbG9zZSgpOyB9IH19KTsKCQoJaWYgKHRoaXMub3B0cy5ydGwpIHsKCQl0aGlzLm9wdHNbJ2NsYXNzJ10gKz0gJyBlbC1kaWFsb2dmb3JtLXJ0bCc7Cgl9CgkKCWlmIChvICYmIG8uZGlhbG9nICYmIG8uZGlhbG9nLmJ1dHRvbnMgJiYgdHlwZW9mKG8uZGlhbG9nLmJ1dHRvbnMpID09ICdvYmplY3QnKSB7CgkJdGhpcy5vcHRzLmRpYWxvZy5idXR0b25zID0gby5kaWFsb2cuYnV0dG9uczsKCX0KCXRoaXMudWwgICAgID0gbnVsbDsKCXRoaXMudGFicyAgID0ge307Cgl0aGlzLl90YWJsZSA9IG51bGw7Cgl0aGlzLmRpYWxvZyA9IGpRdWVyeSgnPGRpdiAvPicpLmFkZENsYXNzKHRoaXMub3B0c1snY2xhc3MnXSkuZGlhbG9nKHRoaXMub3B0cy5kaWFsb2cpOwoJdGhpcy5tZXNzYWdlID0galF1ZXJ5KCc8ZGl2IGNsYXNzPSJlbC1kaWFsb2dmb3JtLW1lc3NhZ2Ugcm91bmRlZC01IiAvPicpLmhpZGUoKS5hcHBlbmRUbyh0aGlzLmRpYWxvZyk7Cgl0aGlzLmVycm9yICAgPSBqUXVlcnkoJzxkaXYgY2xhc3M9ImVsLWRpYWxvZ2Zvcm0tZXJyb3Igcm91bmRlZC01IiAvPicpLmhpZGUoKS5hcHBlbmRUbyh0aGlzLmRpYWxvZyk7Cgl0aGlzLnNwaW5uZXIgPSBqUXVlcnkoJzxkaXYgY2xhc3M9InNwaW5uZXIiIC8+JykuaGlkZSgpLmFwcGVuZFRvKHRoaXMuZGlhbG9nKTsKCXRoaXMuY29udGVudCA9IGpRdWVyeSgnPGRpdiBjbGFzcz0iZWwtZGlhbG9nZm9ybS1jb250ZW50IiAvPicpLmFwcGVuZFRvKHRoaXMuZGlhbG9nKQoJdGhpcy5mb3JtICAgPSBqUXVlcnkoJzxmb3JtIC8+JykuYXR0cih0aGlzLm9wdHMuZm9ybSkuYXBwZW5kVG8odGhpcy5jb250ZW50KTsKCglpZiAodGhpcy5vcHRzLnN1Ym1pdCkgewoJCXRoaXMuZm9ybS5iaW5kKCdzdWJtaXQnLCBmdW5jdGlvbihlKSB7IHNlbGYub3B0cy5zdWJtaXQoZSwgc2VsZikgfSkKCX0KCWlmICh0aGlzLm9wdHMuYWpheEZvcm0gJiYgalF1ZXJ5LmZuLmFqYXhGb3JtKSB7CgkJdGhpcy5mb3JtLmFqYXhGb3JtKHRoaXMub3B0cy5hamF4Rm9ybSk7Cgl9CglpZiAodGhpcy5vcHRzLnZhbGlkYXRlKSB7CgkJdGhpcy5mb3JtLnZhbGlkYXRlKHRoaXMub3B0cy52YWxpZGF0ZSk7Cgl9CgkKCXRoaXMub3B0aW9uID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKCQlyZXR1cm4gdGhpcy5kaWFsb2cuZGlhbG9nKCdvcHRpb24nLCBuYW1lLCB2YWx1ZSkKCX0KCQoJdGhpcy5zaG93RXJyb3IgPSBmdW5jdGlvbihtc2csIGhpZGVDb250ZW50KSB7CgkJdGhpcy5oaWRlTWVzc2FnZSgpOwoJCXRoaXMuaGlkZVNwaW5uZXIoKTsKCQl0aGlzLmVycm9yLmh0bWwobXNnKS5zaG93KCk7CgkJaGlkZUNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmhpZGUoKTsKCQlyZXR1cm4gdGhpczsKCX0KCQoJdGhpcy5oaWRlRXJyb3I9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZXJyb3IudGV4dCgnJykuaGlkZSgpOwoJCXRoaXMuY29udGVudC5zaG93KCk7CgkJcmV0dXJuIHRoaXM7CQkKCX0KCQoJdGhpcy5zaG93U3Bpbm5lciA9IGZ1bmN0aW9uKHR4dCkgewoJCXRoaXMuZXJyb3IuaGlkZSgpOwoJCXRoaXMubWVzc2FnZS5oaWRlKCk7CgkJdGhpcy5jb250ZW50LmhpZGUoKTsKCQl0aGlzLnNwaW5uZXIudGV4dCh0eHR8fHRoaXMub3B0cy5zcGlubmVyKS5zaG93KCk7CgkJdGhpcy5vcHRpb24oJ2J1dHRvbnMnLCB7fSk7CgkJcmV0dXJuIHRoaXM7CQkKCX0KCQoJdGhpcy5oaWRlU3Bpbm5lciA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29udGVudC5zaG93KCk7CgkJdGhpcy5zcGlubmVyLmhpZGUoKTsKCQlyZXR1cm4gdGhpczsJCQoJfQoJCgl0aGlzLnNob3dNZXNzYWdlID0gZnVuY3Rpb24odHh0LCBoaWRlQ29udGVudCkgewoJCXRoaXMuaGlkZUVycm9yKCk7CgkJdGhpcy5oaWRlU3Bpbm5lcigpOwoJCXRoaXMubWVzc2FnZS5odG1sKHR4dHx8JycpLnNob3coKTsKCQloaWRlQ29udGVudCAmJiB0aGlzLmNvbnRlbnQuaGlkZSgpOwoJCXJldHVybiB0aGlzOwoJfQoJCgl0aGlzLmhpZGVNZXNzYWdlID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5tZXNzYWdlLmhpZGUoKTsKCQl0aGlzLmNvbnRlbnQuc2hvdygpOwoJCXJldHVybiB0aGlzOwkJCgl9CgkKCS8qKgoJICogQ3JlYXRlIG5ldyB0YWIKCSAqIEBwYXJhbSBzdHJpbmcgaWQgICAgLSB0YWIgaWQKCSAqIEBwYXJhbSBzdHJpbmcgdGl0bGUgLSB0YWIgbmFtZQoJICogQHJldHVybiBlbERpYWxvZ0Zvcm0JCgkqKi8KCXRoaXMudGFiID0gZnVuY3Rpb24oaWQsIHRpdGxlKSB7CgkJaWQgPSB0aGlzLm9wdHMudGFiUHJlZml4K2lkOwoJCQoJCWlmICghdGhpcy51bCkgewoJCQl0aGlzLnVsID0galF1ZXJ5KCc8dWwgLz4nKS5wcmVwZW5kVG8odGhpcy5mb3JtKTsKCQl9CgkJalF1ZXJ5KCc8bGkgLz4nKS5hcHBlbmQoalF1ZXJ5KCc8YSAvPicpLmF0dHIoJ2hyZWYnLCAnIycraWQpLmh0bWwodGl0bGUpKS5hcHBlbmRUbyh0aGlzLnVsKTsKCQl0aGlzLnRhYnNbaWRdID0ge3RhYiA6IGpRdWVyeSgnPGRpdiAvPicpLmF0dHIoJ2lkJywgaWQpLmFkZENsYXNzKCd0YWInKS5hcHBlbmRUbyh0aGlzLmZvcm0pLCB0YWJsZSA6IG51bGx9OwoJCXJldHVybiB0aGlzOwoJfQoJCgkvKioKCSAqIENyZWF0ZSBuZXcgdGFibGUKCSAqIEBwYXJhbSBzdHJpbmcgaWQgIHRhYiBpZCwgaWYgc2V0IC0gdGFibGUgd2lsbCBjcmVhdGUgaW4gdGFiLCBvdGhlcndpc2UgLSBpbiBkaWFsb2cKCSAqIEByZXR1cm4gZWxEaWFsb2dGb3JtCQoJKiovCgl0aGlzLnRhYmxlID0gZnVuY3Rpb24oaWQpIHsKCQlpZCA9IGlkICYmIGlkLmluZGV4T2YodGhpcy5vcHRzLnRhYlByZWZpeCkgPT0gLTEgPyB0aGlzLm9wdHMudGFiUHJlZml4K2lkIDogaWQ7CgkJaWYgKGlkICYmIHRoaXMudGFicyAmJiB0aGlzLnRhYnNbaWRdKSB7CgkJCXRoaXMudGFic1tpZF0udGFibGUgPSBqUXVlcnkoJzx0YWJsZSAvPicpLmFwcGVuZFRvKHRoaXMudGFic1tpZF0udGFiKTsKCQl9IGVsc2UgewoJCQl0aGlzLl90YWJsZSA9IGpRdWVyeSgnPHRhYmxlIC8+JykuYXBwZW5kVG8odGhpcy5mb3JtKTsgCgkJfQoJCXJldHVybiB0aGlzOwoJfQoJCgkvKioKCSAqIEFwcGVuZCBodG1sLCBkb20gbm9kZXMgb3IgalF1ZXJ5IG9iamVjdHMgdG8gZGlhbG9nIG9yIHRhYgoJICogQHBhcmFtIGFycmF5fG9iamVjdHxzdHJpbmcgIGRhdGEgb2JqZWN0KHMpIHRvIGFwcGVuZCB0byBkaWFsb2cKCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICB0aWQgIHRhYiBpZCwgaWYgYWRkaW5nIHRvIHRhYgoJICogQHBhcmFtIGJvb2wgICAgICAgICAgICAgICAgIHQgICAgaWYgdHJ1ZSAtIGRhdGEgd2lsbCBhZGRlZCBpbiB0YWJsZSAoY3JlYXRpbmcgYXV0b21hZ2ljYWx5KQoJICogQHJldHVybiBlbERpYWxvZ0Zvcm0JCgkqKi8KCXRoaXMuYXBwZW5kID0gZnVuY3Rpb24oZGF0YSwgdGlkLCB0KSB7CgkJdGlkID0gdGlkID8gJ2VsLWRmLXRhYi0nK3RpZCA6ICcnOwoKCQlpZiAoIWRhdGEpIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoJCQoJCWlmICh0aWQgJiYgdGhpcy50YWJzW3RpZF0pIHsKCQkJaWYgKHQpIHsKCQkJCSF0aGlzLnRhYnNbdGlkXS50YWJsZSAmJiB0aGlzLnRhYmxlKHRpZCk7CgkJCQl2YXIgdHIgPSBqUXVlcnkoJzx0ciAvPicpLmFwcGVuZFRvKHRoaXMudGFic1t0aWRdLnRhYmxlKTsKCQkJCWlmICghalF1ZXJ5LmlzQXJyYXkoZGF0YSkpIHsKCQkJCQl0ci5hcHBlbmQoalF1ZXJ5KCc8dGQgLz4nKS5hcHBlbmQoZGF0YSkpOwoJCQkJfSBlbHNlIHsKCQkJCQlmb3IgKHZhciBpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CgkJCQkJCXRyLmFwcGVuZChqUXVlcnkoJzx0ZCAvPicpLmFwcGVuZChkYXRhW2ldKSk7CgkJCQkJfTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWlmICghalF1ZXJ5LmlzQXJyYXkoZGF0YSkpIHsKCQkJCQl0aGlzLnRhYnNbdGlkXS50YWIuYXBwZW5kKGRhdGEpCgkJCQl9IGVsc2UgewoJCQkJCWZvciAodmFyIGk9MDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKCQkJCQkJdGhpcy50YWJzW3RpZF0udGFiLmFwcGVuZChkYXRhW2ldKTsKCQkJCQl9OwoJCQkJfQoJCQl9CgkJCQoJCX0gZWxzZSB7CgkJCWlmICghdCkgewoJCQkJaWYgKCFqUXVlcnkuaXNBcnJheShkYXRhKSkgewoJCQkJCXRoaXMuZm9ybS5hcHBlbmQoZGF0YSk7CgkJCQl9IGVsc2UgewoJCQkJCWZvciAodmFyIGk9MDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKCQkJCQkJdGhpcy5mb3JtLmFwcGVuZChkYXRhW2ldKTsKCQkJCQl9OwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJaWYgKCF0aGlzLl90YWJsZSkgewoJCQkJCXRoaXMudGFibGUoKTsKCQkJCX0KCQkJCXZhciB0ciA9IGpRdWVyeSgnPHRyIC8+JykuYXBwZW5kVG8odGhpcy5fdGFibGUpOwoJCQkJaWYgKCFqUXVlcnkuaXNBcnJheShkYXRhKSkgewoJCQkJCXRyLmFwcGVuZChqUXVlcnkoJzx0ZCAvPicpLmFwcGVuZChkYXRhKSk7CgkJCQl9IGVsc2UgewoJCQkJCWZvciAodmFyIGk9MDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKCQkJCQkJdHIuYXBwZW5kKGpRdWVyeSgnPHRkIC8+JykuYXBwZW5kKGRhdGFbaV0pKTsKCQkJCQl9OwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiB0aGlzOwoJfQoJCgkvKioKCSAqIEFwcGVuZCBzZXBhcmF0b3IgKGRpdiBjbGFzcz0ic2VwYXJhdG9yIikgdG8gZGlhbG9nIG9yIHRhYgoJICogQHBhcmFtICBzdHJpbmcgdGlkICB0YWIgaWQsIGlmIGFkZGluZyB0byB0YWIKCSAqIEByZXR1cm4gZWxEaWFsb2dGb3JtCQoJKiovCgl0aGlzLnNlcGFyYXRvciA9IGZ1bmN0aW9uKHRpZCkgewoJCXRpZCA9ICdlbC1kZi10YWItJyt0aWQ7CgkJaWYgKHRoaXMudGFicyAmJiB0aGlzLnRhYnNbdGlkXSkgewoJCQl0aGlzLnRhYnNbdGlkXS50YWIuYXBwZW5kKGpRdWVyeSgnPGRpdiAvPicpLmFkZENsYXNzKCdzZXBhcmF0b3InKSk7CgkJCXRoaXMudGFic1t0aWRdLnRhYmxlICYmIHRoaXMudGFibGUodGlkKTsKCQl9IGVsc2UgewoJCQl0aGlzLmZvcm0uYXBwZW5kKGpRdWVyeSgnPGRpdiAvPicpLmFkZENsYXNzKCdzZXBhcmF0b3InKSk7CgkJfQoJCXJldHVybiB0aGlzOwoJfQoJCgkvKioKCSAqIE9wZW4gZGlhbG9nIHdpbmRvdwoJICogQHJldHVybiBlbERpYWxvZ0Zvcm0JCgkqKi8KCXRoaXMub3BlbiA9IGZ1bmN0aW9uKCkgewoJCXRoaXMudWwgJiYgdGhpcy5mb3JtLnRhYnModGhpcy5vcHRzLnRhYnMpOwoJCXRoaXMuZm9ybS5maW5kKCc6dGV4dCcpLmtleXVwKGZ1bmN0aW9uKGUpIHsKCQkJaWYgKGUua2V5Q29kZSA9PSAxMykgewoJCQkJc2VsZi5mb3JtLnN1Ym1pdCgpOwoJCQl9CgkJfSk7CgoJCXRoaXMuZGlhbG9nLmF0dHIoJ3Vuc2VsZWN0YWJsZScsICdvbicpLmRpYWxvZygnb3BlbicpOwoJCXZhciBzZWxmID0gdGhpczsKCQlpZiAodGhpcy5mb3JtICYmIHRoaXMuZm9ybS5maW5kKCc6dGV4dCcpLmxlbmd0aCkgewoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxmLmZvcm0uZmluZCgnOnRleHQnKVswXS5mb2N1cygpOyB9LCAyMCk7CgkJfQoJCQoJCXJldHVybiB0aGlzOwoJfQoJCgkvKioKCSAqIENsb3NlIGRpYWxvZyB3aW5kb3cgYW5kIGRlc3Ryb3kgY29udGVudAoJICogQHJldHVybiB2b2lkCQoJKiovCgl0aGlzLmNsb3NlID0gZnVuY3Rpb24oKSB7CgkJaWYgKHR5cGVvZih0aGlzLm9wdHMuY2xvc2UpID09ICdmdW5jdGlvbicpIHsKCQkJdGhpcy5vcHRzLmNsb3NlKCk7CgkJfQoJCXRoaXMuZGlhbG9nLmRpYWxvZygnZGVzdHJveScpLnJlbW92ZSgpOwoJfQoJCn0KCi8qKgogKiBlbENvbG9yUGlja2VyLiBKUXVlcnkgcGx1Z2luCiAqIENyZWF0ZSBkcm9wLWRvd24gY29sb3JzIHBhbGV0dGUuCiAqCiAqIFVzYWdlOgogKiAkKHNlbGVjdG9yKS5lbENvbG9yUGlja2VyKG9wdHMpCiAqCiAqIHNldCBjb2xvciBhZnRlciBpbml0OgogKiB2YXIgYyA9ICQoc2VsZWN0b3IpLmVsQ29sb3JQaWNrZXIob3B0cykKICogYy52YWwoJyNmZmZmOTkpCiAqCiAqIEdldCBzZWxlY3RlZCBjb2xvcjoKICogdmFyIGNvbG9yID0gYy52YWwoKTsKICoKICogTm90aWNlIQogKiAgIFBhbGV0dGUgY3JlYXRlZCBvbmx5IGFmdGVyIGZpcnN0IGNsaWNrIG9uIGVsZW1lbnQgKGxhenp5IGxvYWRpbmcpCiAqCiAqIE9wdGlvbnM6CiAqICAgY29sb3JzIC0gY29sb3JzIGFycmF5IChieSBkZWZhdWx0IGRpc3BsYXkgMjU2IHdlYiBzYWZlIGNvbG9ycykKICogICBjb2xvciAgLSBjdXJyZW50IChzZWxlY3RlZCkgY29sb3IKICogICBjbGFzcyAtIGNzcyBjbGFzcyBmb3IgZGlzcGxheSAiYnV0dG9uIiAoZWxlbWVudCBvbiB3aWNoIHBsdWdpbiB3YXMgY2FsbGVkKQogKiAgIHBhbGV0dGVDbGFzcyAtIGNzcyBjbGFzcyBmb3IgY29sb3JzIHBhbGV0dGUKICogICBwYWxldHRlUG9zaXRpb24gLSBzdHJpbmcgaW5kaWNhdGUgd2hlcmUgcGFsZXR0ZSB3aWxsIGNyZWF0ZWQ6CiAqICAgICAgJ2lubmVyJyAtIHBhbGV0dGUgd2lsbCBhdHRhY2ggdG8gZWxlbWVudCAoYWNjZXB0YWJsZSBpbiBtb3N0IGNhc2VzKQogKiAgICAgICdvdXRlcicgLSBwYWxldHRlIHdpbGwgYXR0YWNoIHRvIGRvY3VtZW50LmJvZHkuIAogKiAgICAgICAgICAgICAgICBVc2UsIHdoZW4gY3JlYXRlIGNvbG9yIHBpY2tlciBpbnNpZGUgZWxlbWVudCB3aXRoIG92ZXJmbG93ID09ICdoaWRkZW4nLCBmb3IgZXhhbXBsZSBpbiB1aS5kaWFsb2cKICogICB1cGRhdGUgLSBmdW5jdGlvbiB3aWNoIHVwZGF0ZSBidXR0b24gdmlldyBvbiBzZWxlY3QgY29sb3IgKGJ5IGRlZmF1bHQgc2V0IHNlbGVjdGVkIGNvbG9yIGFzIGJhY2tncm91bmQpCiAqICAgY2hhbmdlIC0gY2FsbGJhY2ssIGNhbGxlZCB3aGVuIGNvbG9yIHdhcyBzZWxlY3RlZCAoYnkgZGVmYXVsdCB3cml0ZSBjb2xvciB0byBjb25zb2xlLmxvZykKICogICBuYW1lICAgLSBoaWRkZW4gdGV4dCBmaWVsZCBpbiB3aWNoIHNlbGVjdGVkIGNvbG9yIHZhbHVlIHdpbGwgc2F2ZWQKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKgogKiovCihmdW5jdGlvbigkKSB7CgoJJC5mbi5lbENvbG9yUGlja2VyID0gZnVuY3Rpb24obykgewoJCXZhciBzZWxmICAgICA9IHRoaXM7CgkJdmFyIG9wdHMgICAgID0gJC5leHRlbmQoe30sICQuZm4uZWxDb2xvclBpY2tlci5kZWZhdWx0cywgbyk7CgkJdGhpcy5oaWRkZW4gID0gJCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgLz4nKS5hdHRyKCduYW1lJywgb3B0cy5uYW1lKS52YWwob3B0cy5jb2xvcnx8JycpLmFwcGVuZFRvKHRoaXMpOwoJCXRoaXMucGFsZXR0ZSA9IG51bGw7CgkJdGhpcy5wcmV2aWV3ID0gbnVsbDsKCQl0aGlzLmlucHV0ICAgPSBudWxsOwoKCQlmdW5jdGlvbiBzZXRDb2xvcihjKSB7CgkJCXNlbGYudmFsKGMpOwoJCQlvcHRzLmNoYW5nZSAmJiBvcHRzLmNoYW5nZShzZWxmLnZhbCgpKTsKCQkJc2VsZi5wYWxldHRlLnNsaWRlVXAoKTsKCQl9CgoJCWZ1bmN0aW9uIGluaXQoKSB7CgkJCXNlbGYucGFsZXR0ZSAgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3Mob3B0cy5wYWxldHRlQ2xhc3MrJyByb3VuZGVkLTMnKTsKCQkJZm9yICh2YXIgaT0wOyBpIDwgb3B0cy5jb2xvcnMubGVuZ3RoOyBpKyspIHsKCQkJCSQoJzxkaXYgLz4nKQoJCQkJCS5hZGRDbGFzcygnY29sb3InKQoJCQkJCS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCBvcHRzLmNvbG9yc1tpXSkKCQkJCQkuYXR0cih7dGl0bGUgOiBvcHRzLmNvbG9yc1tpXSwgdW5zZWxlY3RhYmxlIDogJ29uJ30pCgkJCQkJLmFwcGVuZFRvKHNlbGYucGFsZXR0ZSkKCQkJCQkubW91c2VlbnRlcihmdW5jdGlvbigpIHsKCQkJCQkJdmFyIHYgPSAkKHRoaXMpLmF0dHIoJ3RpdGxlJyk7CgkJCQkJCXNlbGYuaW5wdXQudmFsKHYpOwoJCQkJCQlzZWxmLnByZXZpZXcuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgdik7CgkJCQkJfSkKCQkJCQkuY2xpY2soZnVuY3Rpb24oZSkgewoJCQkJCQllLnN0b3BQcm9wYWdhdGlvbigpOyAKCQkJCQkJc2V0Q29sb3IoJCh0aGlzKS5hdHRyKCd0aXRsZScpKTsKCQkJCQl9KTsKCQkJfTsKCQkJc2VsZi5pbnB1dCA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpCgkJCQkuYWRkQ2xhc3MoJ3JvdW5kZWQtMycpCgkJCQkuYXR0cignc2l6ZScsIDgpCgkJCQkuY2xpY2soZnVuY3Rpb24oZSkgewoJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQl9KQoJCQkJLmtleWRvd24oZnVuY3Rpb24oZSkgewoJCQkJCWlmIChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCQl2YXIgayA9IGUua2V5Q29kZTsKCQkJCQkvLyBvbiBlc2MgLSBjbG9zZSBwYWxldHRlCgkJCQkJaWYgKGsgPT0gMjcpIHsKCQkJCQkJcmV0dXJuIHNlbGYubW91c2VsZWF2ZSgpOwoJCQkJCX0KCQkJCQkvLyBhbGxvdyBpbnB1dCBvbmx5IGhleCBjb2xvciB2YWx1ZQoJCQkJCWlmIChrIT04ICYmIGsgIT0gMTMgJiYgayE9NDYgJiYgayE9MzcgJiYgayAhPSAzOSAmJiAoazw0OCB8fCBrPjU3KSAmJiAoazw2NSB8fCBrID4gNzApKSB7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJdmFyIGMgPSAkKHRoaXMpLnZhbCgpOwoJCQkJCWlmIChjLmxlbmd0aCA9PSA3IHx8IGMubGVuZ3RoID09IDApIHsKCQkJCQkJaWYgKGsgPT0gMTMpIHsKCQkJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlzZXRDb2xvcihjKTsKCQkJCQkJCXNlbGYucGFsZXR0ZS5zbGlkZVVwKCk7CgkJCQkJCX0KCQkJCQkJaWYgKGUua2V5Q29kZSAhPSA4ICYmIGUua2V5Q29kZSAhPSA0NiAmJiBrIT0zNyAmJiBrICE9IDM5KSB7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQl9CgkJCQl9KQoJCQkJLmtleXVwKGZ1bmN0aW9uKGUpIHsKCQkJCQl2YXIgYyA9ICQodGhpcykudmFsKCk7IAoJCQkJCWMubGVuZ3RoID09IDcgJiYgL14jWzAtOWFiY2RlZl17Nn0kL2kudGVzdChjKSAmJiBzZWxmLnZhbChjKTsKCQkJCX0pOwoJCQkJCgkJCXNlbGYucHJldmlldyA9ICQoJzxkaXYgLz4nKQoJCQkJLmFkZENsYXNzKCdwcmV2aWV3IHJvdW5kZWQtMycpCgkJCQkuY2xpY2soZnVuY3Rpb24oZSkgewoJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkJc2V0Q29sb3Ioc2VsZi5pbnB1dC52YWwoKSk7CgkJCQl9KTsKCQkJCgkJCXNlbGYucGFsZXR0ZQoJCQkJLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2NsZWFyZml4JykpCgkJCQkuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcygncGFuZWwnKS5hcHBlbmQoc2VsZi5pbnB1dCkuYXBwZW5kKHNlbGYucHJldmlldykpOwoJCQkKCQkJaWYgKG9wdHMucGFsZXR0ZVBvc2l0aW9uID09ICdvdXRlcicpIHsKCQkJCXNlbGYucGFsZXR0ZS5oaWRlKCkKCQkJCQkuYXBwZW5kVG8oc2VsZi5wYXJlbnRzKCdib2R5JykuZXEoMCkpCgkJCQkJLm1vdXNlbGVhdmUoZnVuY3Rpb24oKSB7CgkJCQkJCSQodGhpcykuc2xpZGVVcCgpOwoJCQkJCQlzZWxmLnZhbChzZWxmLnZhbCgpKTsKCQkJCQl9KQoJCQkJc2VsZi5tb3VzZWxlYXZlKGZ1bmN0aW9uKGUpIHsKCQkJCQlpZiAoZS5yZWxhdGVkVGFyZ2V0ICE9IHNlbGYucGFsZXR0ZS5nZXQoMCkpIHsKCQkJCQkJc2VsZi5wYWxldHRlLnNsaWRlVXAoKTsKCQkJCQkJc2VsZi52YWwoc2VsZi52YWwoKSk7CgkJCQkJfQoJCQkJfSkKCQkJfSBlbHNlIHsKCQkJCXNlbGYuYXBwZW5kKHNlbGYucGFsZXR0ZS5oaWRlKCkpCgkJCQkJLm1vdXNlbGVhdmUoZnVuY3Rpb24oZSkgewoJCQkJCQlzZWxmLnBhbGV0dGUuc2xpZGVVcCgpOwoJCQkJCQlzZWxmLnZhbChzZWxmLnZhbCgpKTsKCQkJCQl9KTsKCQkJfQoJCQlzZWxmLnZhbChzZWxmLnZhbCgpKTsKCQl9CgkJCgkJdGhpcy5lbXB0eSgpLmFkZENsYXNzKG9wdHNbJ2NsYXNzJ10rJyByb3VuZGVkLTMnKQoJCQkuY3NzKHsncG9zaXRpb24nIDogJ3JlbGF0aXZlJywgJ2JhY2tncm91bmQtY29sb3InIDogb3B0cy5jb2xvcnx8Jyd9KQoJCS5jbGljayhmdW5jdGlvbihlKSB7IAoJCQlpZiAoIXNlbGYuaGFzQ2xhc3MoJ2Rpc2FibGVkJykpIHsKCQkJCSFzZWxmLnBhbGV0dGUgJiYgaW5pdCgpOwoJCQkJaWYgKG9wdHMucGFsZXR0ZVBvc2l0aW9uID09ICdvdXRlcicgJiYgc2VsZi5wYWxldHRlLmNzcygnZGlzcGxheScpID09ICdub25lJykgewoJCQkJCXZhciBvID0gJCh0aGlzKS5vZmZzZXQoKTsKCQkJCQl2YXIgdyA9IHNlbGYucGFsZXR0ZS53aWR0aCgpOwoJCQkJCXZhciBsID0gc2VsZi5wYXJlbnRzKCdib2R5Jykud2lkdGgoKSAtIG8ubGVmdCA+PSB3ID8gby5sZWZ0IDogby5sZWZ0ICsgJCh0aGlzKS5vdXRlcldpZHRoKCkgLSB3OwoJCQkJCXNlbGYucGFsZXR0ZS5jc3Moe2xlZnQgOiBsKydweCcsIHRvcCA6IG8udG9wKyQodGhpcykuaGVpZ2h0KCkrMSsncHgnfSk7CgkJCQl9CgkJCQlzZWxmLnBhbGV0dGUuc2xpZGVUb2dnbGUoKTsKCQkJfQoJCX0pOwoJCQoJCXRoaXMudmFsID0gZnVuY3Rpb24odikgewoJCQlpZiAoIXYgJiYgdiE9PScnKSB7CgkJCQlyZXR1cm4gdGhpcy5oaWRkZW4udmFsKCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmhpZGRlbi52YWwodik7CgkJCQlpZiAob3B0cy51cGRhdGUpIHsKCQkJCQlvcHRzLnVwZGF0ZSh0aGlzLmhpZGRlbi52YWwoKSk7CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgdik7CgkJCQl9CgkJCQkKCQkJCWlmIChzZWxmLnBhbGV0dGUpIHsKCQkJCQlzZWxmLnByZXZpZXcuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgdik7CgkJCQkJc2VsZi5pbnB1dC52YWwodik7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRoaXM7CgkJfQoJCQoJCXJldHVybiB0aGlzOwoJfQoKCSQuZm4uZWxDb2xvclBpY2tlci5kZWZhdWx0cyA9IHsKCQknY2xhc3MnICAgICAgICAgOiAnZWwtY29sb3JwaWNrZXInLAoJCXBhbGV0dGVDbGFzcyAgICA6ICdlbC1wYWxldHRlJywKCQlwYWxldHRlUG9zaXRpb24gOiAnaW5uZXInLAoJCW5hbWUgICAgICAgICAgICA6ICdjb2xvcicsCgkJY29sb3IgICAgICAgICAgIDogJycsCgkJdXBkYXRlICAgICAgICAgIDogbnVsbCwKCQljaGFuZ2UgICAgICAgICAgOiBmdW5jdGlvbihjKSB7ICB9LAoJCWNvbG9ycyAgICAgICAgICA6IFsKCQkJJyNmZmZmZmYnLCAnI2NjY2NjYycsICcjOTk5OTk5JywgJyM2NjY2NjYnLCAnIzMzMzMzMycsICcjMDAwMDAwJywgCgkJCScjZmZjY2NjJywgJyNjYzk5OTknLCAnIzk5NjY2NicsICcjNjYzMzMzJywgJyMzMzAwMDAnLCAKCQkJJyNmZjk5OTknLCAnI2NjNjY2NicsICcjY2MzMzMzJywgJyM5OTMzMzMnLCAnIzY2MDAwMCcsIAoJCQknI2ZmNjY2NicsICcjZmYzMzMzJywgJyNmZjAwMDAnLCAnI2NjMDAwMCcsICcjOTkwMDAwJywKCQkJJyNmZjk5NjYnLCAnI2ZmNjYzMycsICcjZmYzMzAwJywgJyNjYzMzMDAnLCAnIzk5MzMwMCcsCgkJCScjZmZjYzk5JywgJyNjYzk5NjYnLCAnI2NjNjYzMycsICcjOTk2NjMzJywgJyM2NjMzMDAnLAoJCQknI2ZmOTkzMycsICcjZmY2NjAwJywgJyNmZjk5MDAnLCAnI2NjNjYwMCcsICcjY2M5OTMzJywKCQkJJyNmZmNjNjYnLCAnI2ZmY2MzMycsICcjZmZjYzAwJywgJyNjYzk5MDAnLCAnIzk5NjYwMCcsCgkJCScjZmZmZmNjJywgJyNjY2NjOTknLCAnIzk5OTk2NicsICcjNjY2NjMzJywgJyMzMzMzMDAnLAoJCQknI2ZmZmY5OScsICcjY2NjYzY2JywgJyNjY2NjMzMnLCAnIzk5OTkzMycsICcjNjY2NjAwJywKCQkJJyNmZmZmNjYnLCAnI2ZmZmYzMycsICcjZmZmZjAwJywgJyNjY2NjMDAnLCAnIzk5OTkwMCcsCgkJCScjY2NmZjY2JywgJyNjY2ZmMzMnLCAnI2NjZmYwMCcsICcjOTljYzAwJywgJyM2Njk5MDAnLAoJCQknI2NjZmY5OScsICcjOTljYzY2JywgJyM5OWNjMzMnLCAnIzY2OTkzMycsICcjMzM2NjAwJywKCQkJJyM5OWZmMzMnLCAnIzk5ZmYwMCcsICcjNjZmZjAwJywgJyM2NmNjMDAnLCAnIzY2Y2MzMycsCgkJCScjOTlmZjY2JywgJyM2NmZmMzMnLCAnIzMzZmYwMCcsICcjMzNjYzAwJywgJyMzMzk5MDAnLAoJCQknI2NjZmZjYycsICcjOTljYzk5JywgJyM2Njk5NjYnLCAnIzMzNjYzMycsICcjMDAzMzAwJywKCQkJJyM5OWZmOTknLCAnIzY2Y2M2NicsICcjMzNjYzMzJywgJyMzMzk5MzMnLCAnIzAwNjYwMCcsCgkJCScjNjZmZjY2JywgJyMzM2ZmMzMnLCAnIzAwZmYwMCcsICcjMDBjYzAwJywgJyMwMDk5MDAnLAoJCQknIzY2ZmY5OScsICcjMzNmZjY2JywgJyMwMGZmMzMnLCAnIzAwY2MzMycsICcjMDA5OTMzJywJCQkKCQkJJyM5OWZmY2MnLCAnIzY2Y2M5OScsICcjMzNjYzY2JywgJyMzMzk5NjYnLCAnIzAwNjYzMycsCQkJCQkJCgkJCScjMzNmZjk5JywgJyMwMGZmNjYnLCAnIzAwZmY5OScsICcjMDBjYzY2JywgJyMzM2NjOTknLAkJCQkJCQoJCQknIzY2ZmZjYycsICcjMzNmZmNjJywgJyMwMGZmY2MnLCAnIzAwY2M5OScsICcjMDA5OTY2JywJCQkJCQkKCQkJJyNjY2ZmZmYnLCAnIzk5Y2NjYycsICcjNjY5OTk5JywgJyMzMzY2NjYnLCAnIzAwMzMzMycsCQkJCQkJCgkJCScjOTlmZmZmJywgJyM2NmNjY2MnLCAnIzMzY2NjYycsICcjMzM5OTk5JywgJyMwMDY2NjYnLAkJCQkJCQoJCQknIzY2Y2NjYycsICcjMzNmZmZmJywgJyMwMGZmZmYnLCAnIzAwY2NjYycsICcjMDA5OTk5JywJCQkJCQkKCQkJJyM2NmNjZmYnLCAnIzMzY2NmZicsICcjMDBjY2ZmJywgJyMwMDk5Y2MnLCAnIzAwNjY5OScsCQkJCQkJCQkJCQkJCQkJCQkJCgkJCScjOTljY2ZmJywgJyM2Njk5Y2MnLCAnIzMzOTljYycsICcjMzM2Njk5JywgJyMwMDMzNjYnLAkJCQkJCQoJCQknIzMzOTlmZicsICcjMDA5OWZmJywgJyMwMDY2ZmYnLCAnIzA2NmNjYycsICcjMzM2NmNjJywJCQkJCQkJCQkJCQkJCQkJCQkKCQkJJyM2Njk5ZmYnLCAnIzMzNjZmZicsICcjMDAzM2ZmJywgJyMwMDMzY2MnLCAnIzAwMzM5OScsCQkJCQkJCgkJCScjY2NjY2ZmJywgJyM5OTk5Y2MnLCAnIzY2NjY5OScsICcjMzMzMzY2JywgJyMwMDAwMzMnLAkJCQkJCQkJCQkJCQkJCQkJCQoJCQknIzk5OTlmZicsICcjNjY2NmNjJywgJyMzMzMzY2MnLCAnIzMzMzM5OScsICcjMDAwMDY2JywJCQkJCQkJCQkJCQkJCQkJCQkKCQkJJyM2NjY2ZmYnLCAnIzMzMzNmZicsICcjMDAwMGZmJywgJyMwMDAwY2MnLCAnIzAwOTk5OScsCQkJCQkJCQkJCQkJCQkJCQkJCgkJCScjOTk2NmZmJywgJyM2NjMzZmYnLCAnIzMzMDBmZicsICcjMzMwMGNjJywgJyMzMzAwOTknLAkJCQkJCQkJCQkJCQkJCQkJCQoJCQknI2NjOTlmZicsICcjOTk2NmNjJywgJyM2NjMzY2MnLCAnIzY2MzM5OScsICcjMzMwMDY2JywKCQkJJyM5OTMzZmYnLCAnIzY2MDBmZicsICcjOTkwMGZmJywgJyM2NjAwY2MnLCAnIzk5MzNjYycsCQkJCgkJCScjY2M2NmZmJywgJyNjYzMzZmYnLCAnI2NjMDBmZicsICcjOTkwMGNjJywgJyM2NjAwOTknLAoJCQknI2ZmY2NmZicsICcjY2M5OWNjJywgJyM5OTY2OTknLCAnIzY2MzM2NicsICcjMzMwMDMzJywJCQkKCQkJJyNmZjk5ZmYnLCAnI2NjNjZjYycsICcjY2MzM2NjJywgJyM5OTMzOTknLCAnIzY2MDA2NicsCgkJCScjZmY2NmZmJywgJyNmZjMzZmYnLCAnI2ZmMDBmZicsICcjY2MwMGNjJywgJyM5OTAwOTknLAkJCQoJCQknI2ZmNjZjYycsICcjZmYzM2NjJywgJyNmZjAwY2MnLCAnI2NjMDA5OScsICcjOTkwMDY2JywKCQkJJyNmZjk5Y2MnLCAnI2NjNjY5OScsICcjY2MzMzk5JywgJyM5OTMzNjYnLCAnIzY2MDAzMycsCQkJCgkJCScjZmYzMzk5JywgJyNmZjAwOTknLCAnI2ZmMDA2NicsICcjY2MwMDY2JywgJyNjYzMzNjYnLAoJCQknI2ZmNjY5OScsICcjZmYzMzY2JywgJyNmZjAwMzMnLCAnI2NjMDAzMycsICcjOTkwMDMzJwkJCgkJCV0KCX07Cgp9KShqUXVlcnkpOwovKioKICogalF1ZXJ5IHBsdWdpbi4gQ3JlYXRlIGdyb3VwIG9mIHRleHQgaW5wdXQsIGVsU2VsZWN0IGFuZCBlbENvbG9yUGlja2VyLiAKICogQWxsb3cgaW5wdXQgYm9yZGVyLXdpZHRoLCBib3JkZXItc3R5bGUgYW5kIGJvcmRlci1jb2xvci4gVXNlZCBpbiBlbFJURQogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKCQoJJC5mbi5lbEJvcmRlclNlbGVjdCA9IGZ1bmN0aW9uKG8pIHsKCQkKCQl2YXIgJHNlbGYgPSB0aGlzOwoJCXZhciBzZWxmICA9IHRoaXMuZXEoMCk7CgkJdmFyIG9wdHMgID0gJC5leHRlbmQoe30sICQuZm4uZWxCb3JkZXJTZWxlY3QuZGVmYXVsdHMsIG8pOwoJCXZhciB3aWR0aCA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpCgkJCS5hdHRyKHsnbmFtZScgOiBvcHRzLm5hbWUrJ1t3aWR0aF0nLCBzaXplIDogM30pLmNzcygndGV4dC1hbGlnbicsICdyaWdodCcpCgkJCS5jaGFuZ2UoZnVuY3Rpb24oKSB7ICRzZWxmLmNoYW5nZSgpOyB9KTsKCQkKCQl2YXIgY29sb3IgPSAkKCc8ZGl2IC8+JykuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpCgkJCS5lbENvbG9yUGlja2VyKHsKCQkJCSdjbGFzcycgICAgICAgICA6ICdlbC1jb2xvcnBpY2tlciB1aS1pY29uIHVpLWljb24tcGVuY2lsJywKCQkJCW5hbWUgICAgICAgICAgICA6IG9wdHMubmFtZSsnW2NvbG9yXScsIAoJCQkJcGFsZXR0ZVBvc2l0aW9uIDogJ291dGVyJywKCQkJCWNoYW5nZSAgICAgICAgICA6IGZ1bmN0aW9uKCkgeyAkc2VsZi5jaGFuZ2UoKTsgfQoJCQl9KTsKCQkKCQkKCQl2YXIgc3R5bGUgPSAkKCc8ZGl2IC8+JykuZWxTZWxlY3QoewoJCQl0cGwgICAgICAgOiAnPGRpdiBzdHlsZT0iYm9yZGVyLWJvdHRvbTo0cHggJXZhbCAjMDAwO3dpZHRoOjEwMCU7bWFyZ2luOjdweCAwIj4gPC9kaXY+JywKCQkJdHBscyAgICAgIDogeyAnJyA6ICclbGFiZWwnfSwKCQkJbWF4SGVpZ2h0IDogb3B0cy5zdHlsZUhlaWdodCB8fCBudWxsLAoJCQlzZWxlY3QgICAgOiBmdW5jdGlvbigpIHsgJHNlbGYuY2hhbmdlKCk7IH0sCgkJCXNyYyAgICAgICA6IHsKCQkJCScnICAgICAgIDogJ25vbmUnLAoJCQkJc29saWQgICAgOiAnc29saWQnLAoJCQkJZGFzaGVkICAgOiAnZGFzaGVkJywKCQkJCWRvdHRlZCAgIDogJ2RvdHRlZCcsCgkJCQknZG91YmxlJyA6ICdkb3VibGUnLAoJCQkJZ3Jvb3ZlICAgOiAnZ3Jvb3ZlJywKCQkJCXJpZGdlICAgIDogJ3JpZGdlJywKCQkJCWluc2V0ICAgIDogJ2luc2V0JywKCQkJCW91dHNldCAgIDogJ291dHNldCcKCQkJfQoJCX0pOwoJCQoJCXNlbGYuZW1wdHkoKQoJCQkuYWRkQ2xhc3Mob3B0c1snY2xhc3MnXSkKCQkJLmF0dHIoJ25hbWUnLCBvcHRzLm5hbWV8fCcnKQoJCQkuYXBwZW5kKAoJCQkJJCgnPHRhYmxlIC8+JykuYXR0cignY2VsbHNwYWNpbmcnLCAwKS5hcHBlbmQoCgkJCQkJJCgnPHRyIC8+JykKCQkJCQkJLmFwcGVuZCgkKCc8dGQgLz4nKS5hcHBlbmQod2lkdGgpLmFwcGVuZCgnIHB4JykpCgkJCQkJCS5hcHBlbmQoJCgnPHRkIC8+JykuYXBwZW5kKHN0eWxlKSkKCQkJCQkJLmFwcGVuZCgkKCc8dGQgLz4nKS5hcHBlbmQoY29sb3IpKQoJCQkJKQoJCQkpOwoJCQoJCWZ1bmN0aW9uIHJnYjJoZXgoc3RyKSB7CgkJICAgIGZ1bmN0aW9uIGhleCh4KSAgewoJCSAgICAJaGV4RGlnaXRzID0gWyIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsIjkiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiXTsKCQkgICAgICAgIHJldHVybiAheCAgPyAiMDAiIDogaGV4RGlnaXRzWyh4IC0geCAlIDE2KSAvIDE2XSArIGhleERpZ2l0c1t4JSAxNl07CgkJICAgIH0KCQkJdmFyIHJnYiA9IChzdHJ8fCcnKS5tYXRjaCgvXCgoWzAtOV17MSwzfSksXHMqKFswLTldezEsM30pLFxzKihbMC05XXsxLDN9KVwpLyk7IAoJCQlyZXR1cm4gcmdiID8gIiMiICsgaGV4KHJnYlsxXSkgKyBoZXgocmdiWzJdKSArIGhleChyZ2JbM10pIDogJyc7CgkJfQoJCQoJCWZ1bmN0aW9uIHRvUGl4ZWxzKG51bSkgewoJCQlpZiAoIW51bSkgewoJCQkJcmV0dXJuIG51bTsKCQkJfQoJCQl2YXIgbSA9IG51bS5tYXRjaCgvKFswLTldK1wuP1swLTldKilccyoocHh8cHR8ZW18JSkvKTsKCQkJaWYgKG0pIHsKCQkJCW51bSAgPSBtWzFdOwoJCQkJdW5pdCA9IG1bMl07CgkJCX0gCgkJCWlmIChudW1bMF0gPT0gJy4nKSB7CgkJCQludW0gPSAnMCcrbnVtOwoJCQl9CgkJCW51bSA9IHBhcnNlRmxvYXQobnVtKTsKCgkJCWlmIChpc05hTihudW0pKSB7CgkJCQlyZXR1cm4gJyc7CgkJCX0KCQkJdmFyIGJhc2UgPSBwYXJzZUludCgkKGRvY3VtZW50LmJvZHkpLmNzcygnZm9udC1zaXplJykpIHx8IDE2OwoJCQlzd2l0Y2ggKHVuaXQpIHsKCQkJCWNhc2UgJ2VtJzogcmV0dXJuIHBhcnNlSW50KG51bSpiYXNlKTsKCQkJCWNhc2UgJ3B0JzogcmV0dXJuIHBhcnNlSW50KG51bSpiYXNlLzEyKTsKCQkJCWNhc2UgJyUnIDogcmV0dXJuIHBhcnNlSW50KG51bSpiYXNlLzEwMCk7CgkJCX0KCQkJcmV0dXJuIG51bTsKCQl9CgkJCgkJdGhpcy5jaGFuZ2UgPSBmdW5jdGlvbigpIHsKCQkJb3B0cy5jaGFuZ2UgJiYgb3B0cy5jaGFuZ2UodGhpcy52YWwoKSk7CgkJfQoJCQoJCXRoaXMudmFsID0gZnVuY3Rpb24odikgewoJCQlpZiAoIXYgJiYgdiAhPT0gJycpIHsKCQkJCXZhciB3ID0gcGFyc2VJbnQod2lkdGgudmFsKCkpOwoJCQkJcmV0dXJuIHt3aWR0aCA6ICFpc05hTih3KSA/IHcrJ3B4JyA6ICcnLCBzdHlsZSA6IHN0eWxlLnZhbCgpLCBjb2xvciA6IGNvbG9yLnZhbCgpfTsKCQkJfSBlbHNlIHsKCQkJCXZhciBtLCB3LCBzLCBjLCBiID0gJyc7CgkJCQlpZiAodi5ub2RlTmFtZSB8fCB2LmNzcykgewoJCQkJCWlmICghdi5jc3MpIHsKCQkJCQkJdiA9ICQodik7CQkJCQkKCQkJCQl9CgkJCQkJdmFyIGIgPSB2LmNzcygnYm9yZGVyJykKCQkJCQlpZiAoKGIgPSB2LmNzcygnYm9yZGVyJykpKSB7CgkJCQkJCXcgPSBzID0gYyA9IGI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJdyA9IHYuY3NzKCdib3JkZXItd2lkdGgnKTsKCQkJCQkJcyA9IHYuY3NzKCdib3JkZXItc3R5bGUnKTsKCQkJCQkJYyA9IHYuY3NzKCdib3JkZXItY29sb3InKTsKCQkJCQl9CgoJCQkJfSBlbHNlIHsKCQkJCQl3ID0gdi53aWR0aHx8Jyc7CgkJCQkJcyA9IHYuc3R5bGV8fCcnOwoJCQkJCWMgPSB2LmNvbG9yfHwnJzsKCQkJCX0KCgkJCQl3aWR0aC52YWwodG9QaXhlbHModykpOwoJCQkJdmFyIG0gPSBzID8gcy5tYXRjaCgvKHNvbGlkfGRhc2hlZHxkb3R0ZWR8ZG91YmxlfGdyb292ZXxyaWRnZXxpbnNldHxvdXRzZXQpL2kpIDonJzsKCQkJCXN0eWxlLnZhbChtID8gbVsxXSA6ICcnKTsKCQkJCWNvbG9yLnZhbChyZ2IyaGV4KGMpKTsKCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfQoJCQoJCXRoaXMudmFsKG9wdHMudmFsdWUpOwoJCXJldHVybiB0aGlzOwoJfQoJCgkkLmZuLmVsQm9yZGVyU2VsZWN0LmRlZmF1bHRzID0gewoJCW5hbWUgICAgICA6ICdlbC1ib3JkZXJzZWxlY3QnLAoJCSdjbGFzcycgICA6ICdlbC1ib3JkZXJzZWxlY3QnLAoJCXZhbHVlICAgICA6IHt9LAoJCWNoYW5nZSAgICA6IG51bGwKCX0KCQp9KShqUXVlcnkpOwovKioKICogalF1ZXJ5IHBsdWdpbi4gQ3JlYXRlIGdyb3VwIG9mIHRleHQgaW5wdXQgZmllbGRzIGFuZCBzZWxlY3RzIGZvciBzZXR0aW5nIHBhZGRpbmcvbWFyZ2luLiBVc2VkIGluIGVsUlRFCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewoJCgkkLmZuLmVsUGFkZGluZ0lucHV0ID0gZnVuY3Rpb24obykgewoJCXZhciBzZWxmID0gdGhpczsKCQl2YXIgb3B0cyA9ICQuZXh0ZW5kKHt9LCAkLmZuLmVsUGFkZGluZ0lucHV0LmRlZmF1bHRzLCB7bmFtZSA6IHRoaXMuYXR0cignbmFtZScpfSwgbyk7CgkJdGhpcy5yZWdleHBzID0gewoJCQltYWluICAgOiBuZXcgUmVnRXhwKG9wdHMudHlwZSA9PSAncGFkZGluZycgPyAncGFkZGluZ1xzKjpccyooW147Il0rKScgICAgICAgIDogJ21hcmdpblxzKjpccyooW147Il0rKScsICAgICAgICdpbScpLAoJCQlsZWZ0ICAgOiBuZXcgUmVnRXhwKG9wdHMudHlwZSA9PSAncGFkZGluZycgPyAncGFkZGluZy1sZWZ0XHMqOlxzKihbXjsiXSspJyAgIDogJ21hcmdpbi1sZWZ0XHMqOlxzKihbXjsiXSspJywgICdpbScpLAoJCQl0b3AgICAgOiBuZXcgUmVnRXhwKG9wdHMudHlwZSA9PSAncGFkZGluZycgPyAncGFkZGluZy10b3Bccyo6XHMqKFteOyJdKyknICAgIDogJ21hcmdpbi10b3Bccyo6XHMqKFteOyJdKyknLCAgICAnaW0nKSwKCQkJcmlnaHQgIDogbmV3IFJlZ0V4cChvcHRzLnR5cGUgPT0gJ3BhZGRpbmcnID8gJ3BhZGRpbmctcmlnaHRccyo6XHMqKFteOyJdKyknICA6ICdtYXJnaW4tcmlnaHRccyo6XHMqKFteOyJdKyknLCAgJ2ltJyksCgkJCWJvdHRvbSA6IG5ldyBSZWdFeHAob3B0cy50eXBlID09ICdwYWRkaW5nJyA/ICdwYWRkaW5nLWJvdHRvbVxzKjpccyooW147Il0rKScgOiAnbWFyZ2luLWJvdHRvbVxzKjpccyooW147Il0rKScsICdpbScpCgkJfTsKCQkJCgkJJC5lYWNoKFsnbGVmdCcsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJ10sIGZ1bmN0aW9uKCkgewoJCQkKCQkJc2VsZlt0aGlzXSA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpCgkJCQkuYXR0cignc2l6ZScsIDMpCgkJCQkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JykKCQkJCS5jc3MoJ2JvcmRlci0nK3RoaXMsICcycHggc29saWQgcmVkJykKCQkJCS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsgJCh0aGlzKS52YWwocGFyc2VOdW0oJCh0aGlzKS52YWwoKSkpOyBjaGFuZ2UoKTsgfSkKCQkJCS5hdHRyKCduYW1lJywgb3B0cy5uYW1lKydbJyt0aGlzKyddJyk7CgkJfSk7CgkJJC5lYWNoKFsndWxlZnQnLCAndXRvcCcsICd1cmlnaHQnLCAndWJvdHRvbSddLCBmdW5jdGlvbigpIHsKCQkJc2VsZlt0aGlzXSA9ICQoJzxzZWxlY3QgLz4nKQoJCQkJLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0icHgiPnB4PC9vcHRpb24+JykKCQkJCS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9ImVtIj5lbTwvb3B0aW9uPicpCgkJCQkuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSJwdCI+cHQ8L29wdGlvbj4nKQoJCQkJLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyBjaGFuZ2UoKTsgfSkKCQkJCS5hdHRyKCduYW1lJywgb3B0cy5uYW1lKydbJyt0aGlzKyddJyk7CgkJCWlmIChvcHRzLnBlcmNlbnRzKSB7CgkJCQlzZWxmW3RoaXNdLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0iJSI+JTwvb3B0aW9uPicpOwoJCQl9CgkJfSk7CgkJCgkJdGhpcy5lbXB0eSgpLmFkZENsYXNzKG9wdHNbJ2NsYXNzJ10pCgkJCS5hcHBlbmQodGhpcy5sZWZ0KS5hcHBlbmQodGhpcy51bGVmdCkuYXBwZW5kKCcgeCAnKQoJCQkuYXBwZW5kKHRoaXMudG9wKS5hcHBlbmQodGhpcy51dG9wKS5hcHBlbmQoJyB4ICcpCgkJCS5hcHBlbmQodGhpcy5yaWdodCkuYXBwZW5kKHRoaXMudXJpZ2h0KS5hcHBlbmQoJyB4ICcpCgkJCS5hcHBlbmQodGhpcy5ib3R0b20pLmFwcGVuZCh0aGlzLnVib3R0b20pOwoJCQkKCQl0aGlzLnZhbCA9IGZ1bmN0aW9uKHYpIHsKCQkJaWYgKCF2ICYmIHYhPT0nJykgewoJCQkJdmFyIGwgPSBwYXJzZU51bSh0aGlzLmxlZnQudmFsKCkpOwoJCQkJdmFyIHQgPSBwYXJzZU51bSh0aGlzLnRvcC52YWwoKSk7CgkJCQl2YXIgciA9IHBhcnNlTnVtKHRoaXMucmlnaHQudmFsKCkpOwoJCQkJdmFyIGIgPSBwYXJzZU51bSh0aGlzLmJvdHRvbS52YWwoKSk7CgkJCQl2YXIgcmV0ID0gewoJCQkJCWxlZnQgICA6IGw9PSdhdXRvJyB8fCBsPT0wID8gbCA6IChsIT09JycgPyBsK3RoaXMudWxlZnQudmFsKCkgICA6ICcnKSwgCgkJCQkJdG9wICAgIDogdD09J2F1dG8nIHx8IHQ9PTAgPyB0IDogKHQhPT0nJyA/IHQrdGhpcy51dG9wLnZhbCgpICAgIDogJycpLAoJCQkJCXJpZ2h0ICA6IHI9PSdhdXRvJyB8fCByPT0wID8gciA6IChyIT09JycgPyByK3RoaXMudXJpZ2h0LnZhbCgpICA6ICcnKSwKCQkJCQlib3R0b20gOiBiPT0nYXV0bycgfHwgYj09MCA/IGIgOiAoYiE9PScnID8gYit0aGlzLnVib3R0b20udmFsKCkgOiAnJyksCgkJCQkJY3NzICAgIDogJycKCQkJCX07CgkJCQlpZiAocmV0LmxlZnQhPT0nJyAmJiByZXQucmlnaHQhPT0nJyAmJiByZXQudG9wIT09JycgJiYgcmV0LmJvdHRvbSE9PScnKSB7CgkJCQkJaWYgKHJldC5sZWZ0ID09IHJldC5yaWdodCAmJiByZXQudG9wID09IHJldC5ib3R0b20pIHsKCQkJCQkJcmV0LmNzcyA9IHJldC50b3ArJyAnK3JldC5sZWZ0OwoJCQkJCX0gZWxzZXsKCQkJCQkJcmV0LmNzcyA9IHJldC50b3ArJyAnK3JldC5yaWdodCsnICcrcmV0LmJvdHRvbSsnICcrcmV0LmxlZnQ7CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQlyZXR1cm4gcmV0OwoJCQl9IGVsc2UgewoJCQkJCgkJCQlpZiAodi5ub2RlTmFtZSB8fCB2LmNzcykgewoJCQkJCWlmICghdi5jc3MpIHsKCQkJCQkJdiA9ICQodik7CgkJCQkJfQoJCQkJCXZhciB2YWwgICA9IHtsZWZ0IDogJycsIHRvcCA6ICcnLCByaWdodDogJycsIGJvdHRvbSA6ICcnfTsKCQkJCQl2YXIgc3R5bGUgPSAodi5hdHRyKCdzdHlsZScpfHwnJykudG9Mb3dlckNhc2UoKTsKCgkJCQkJaWYgKHN0eWxlKSB7CgkJCQkJCXN0eWxlICAgPSAkLnRyaW0oc3R5bGUpOwoJCQkJCQl2YXIgbSA9IHN0eWxlLm1hdGNoKHRoaXMucmVnZXhwcy5tYWluKTsKCQkJCQkJaWYgKG0pIHsKCQkJCQkJCXZhciB0bXAgICAgPSAkLnRyaW0obVsxXSkucmVwbGFjZSgvXHMrL2csICcgJykuc3BsaXQoJyAnLCA0KTsKCQkJCQkJCXZhbC50b3AgICAgPSB0bXBbMF07CgkJCQkJCQl2YWwucmlnaHQgID0gdG1wWzFdICYmIHRtcFsxXSE9PScnID8gdG1wWzFdIDogdmFsLnRvcDsKCQkJCQkJCXZhbC5ib3R0b20gPSB0bXBbMl0gJiYgdG1wWzJdIT09JycgPyB0bXBbMl0gOiB2YWwudG9wOwoJCQkJCQkJdmFsLmxlZnQgICA9IHRtcFszXSAmJiB0bXBbM10hPT0nJyA/IHRtcFszXSA6IHZhbC5yaWdodDsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSQuZWFjaChbJ2xlZnQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbSddLCBmdW5jdGlvbigpIHsKCQkJCQkJCQl2YXIgbmFtZSA9IHRoaXMudG9TdHJpbmcoKTsKCQkJCQkJCQltID0gc3R5bGUubWF0Y2goc2VsZi5yZWdleHBzW25hbWVdKTsKCQkJCQkJCQlpZiAobSkgewoJCQkJCQkJCQl2YWxbbmFtZV0gPSBtWzFdOwoJCQkJCQkJCX0KCQkJCQkJCX0pOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXZhciB2ID0gdmFsOwoJCQkJfSAKCgkJCQkkLmVhY2goWydsZWZ0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nXSwgZnVuY3Rpb24oKSB7CgkJCQkJdmFyIG5hbWUgPSB0aGlzLnRvU3RyaW5nKCk7CgkJCQkJaWYgKHR5cGVvZih2W25hbWVdKSAhPSAndW5kZWZpbmVkJyAmJiB2W25hbWVdICE9PSBudWxsKSB7CgkJCQkJCXZbbmFtZV0gPSB2W25hbWVdLnRvU3RyaW5nKCk7CgkJCQkJCXZhciBfdiA9IHBhcnNlTnVtKHZbbmFtZV0pOwoJCQkJCQlzZWxmW25hbWVdLnZhbChfdik7CgkJCQkJCXZhciBtID0gdltuYW1lXS5tYXRjaCgvKHB4fGVtfHB0fCUpL2kpOwoJCQkJCQlzZWxmWyd1JytuYW1lXS52YWwobSA/IG1bMV0gOiAncHgnKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfQoJCQkKCQlmdW5jdGlvbiBwYXJzZU51bShudW0pIHsKCQkJbnVtID0gJC50cmltKG51bS50b1N0cmluZygpKTsKCQkJaWYgKG51bVswXSA9PSAnLicpIHsgCgkJCQludW0gPSAnMCcrbnVtOwoJCQl9CgkJCW4gPSBwYXJzZUZsb2F0KG51bSk7CgkJCXJldHVybiAhaXNOYU4obikgPyBuIDogKG51bSA9PSAnYXV0bycgPyBudW0gOiAnJyk7CgkJfQoJCQkKCQlmdW5jdGlvbiBjaGFuZ2UoKSB7CgkJCW9wdHMuY2hhbmdlICYmIG9wdHMuY2hhbmdlKHNlbGYpOwoJCX0KCQkKCQl0aGlzLnZhbChvcHRzLnZhbHVlKTsKCQkKCQlyZXR1cm4gdGhpczsKCX0KCQoJJC5mbi5lbFBhZGRpbmdJbnB1dC5kZWZhdWx0cyA9IHsKCQluYW1lICAgICA6ICdlbC1wYWRkaW5naW5wdXQnLAoJCSdjbGFzcycgIDogJ2VsLXBhZGRpbmdpbnB1dCcsCgkJdHlwZSAgICAgOiAncGFkZGluZycsCgkJdmFsdWUgICAgOiB7fSwKCQlwZXJjZW50cyA6IHRydWUsCgkJY2hhbmdlICAgOiBudWxsCgl9CgkKfSkoalF1ZXJ5KTsKLyoqCiAqIGVsU2VsZWN0IEpRdWVyeSBwbHVnaW4KICogUmVwbGFjZW1lbnQgZm9yIHNlbGVjdCBpbnB1dAogKiBBbGxvdyB0byBwdXQgYW55IGh0bWwgYW5kIGNzcyBkZWNvcmF0aW9uIGluIGRyb3AtZG93biBsaXN0CiAqCiAqIFVzYWdlOgogKiAgICQoc2VsZWN0b3IpLmVsU2VsZWN0KG9wdHMpCiAqCiAqIHNldCB2YWx1ZSBhZnRlciBpbml0OgogKiAgIHZhciBjID0gJChzZWxlY3RvcikuZWxTZWxlY3Qob3B0cykKICogICBjLnZhbCgnc29tZSB2YWx1ZScpCiAqCiAqIEdldCBzZWxlY3RlZCB2YWx1ZToKICogICB2YXIgdmFsID0gYy52YWwoKTsKICoKICogTm90aWNlIQogKiAgIDEuIFdoZW4gY2FsbGVkIG9uIG11bHRpcGx5IGVsZW1lbnRzLCBlbFNlbGVjdCBjcmVhdGUgZHJvcC1kb3duIGxpc3Qgb25seSBmb3IgZmlzdCBlbGVtZW50CiAqICAgMi4gRWxlbWVudHMgbGlzdCBjcmVhdGVkIG9ubHkgYWZ0ZXIgZmlyc3QgY2xpY2sgb24gZWxlbWVudCAobGF6enkgbG9hZGluZykKICoKICogT3B0aW9uczoKICogICBzcmMgICAgICAgLSBvYmplY3Qgd2l0aCBwYWlycyB2YWx1ZTpsYWJlbCB0byBjcmVhdGUgZHJvcC1kb3duIGxpc3QgCiAqICAgdmFsdWUgICAgIC0gY3VycmVudCAoc2VsZWN0ZWQpIHZhbHVlCiAqICAgY2xhc3MgICAgIC0gY3NzIGNsYXNzIGZvciBkaXNwbGF5ICJidXR0b24iIChlbGVtZW50IG9uIHdpY2ggcGx1Z2luIHdhcyBjYWxsZWQpCiAqICAgbGlzdENsYXNzIC0gY3NzIGNsYXNzIGZvciBkcm9wIGRvd24gZWxlbWVudHMgbGlzdAogKiAgIHNlbGVjdCAgICAtIGNhbGxiYWNrLCBjYWxsZWQgd2hlbiB2YWx1ZSB3YXMgc2VsZWN0ZWQgKGJ5IGRlZmF1bHQgd3JpdGUgdmFsdWUgdG8gY29uc29sZS5sb2cpCiAqICAgbmFtZSAgICAgIC0gaGlkZGVuIHRleHQgZmllbGQgaW4gd2ljaCBzZWxlY3RlZCB2YWx1ZSB3aWxsIHNhdmVkCiAqICAgbWF4SGVpZ2h0IC0gZWxlbWVudHMgbGlzdCBtYXggaGVpZ2h0IChpZiBoZWlnaHQgZ3JlYXRlciAtIHNjcm9sbCB3aWxsIGFwcGVhcikKICogICB0cGwgICAgICAgLSB0ZW1wbGF0ZSBmb3IgZWxlbWVudCBpbiBsaXN0IChjb250YWlucyAyIHZhcnM6ICV2YXIgLSBmb3Igc3JjIGtleSwgJWxhYmVsIC0gZm9yIHNyY1t2YWxdICkKICogICBsYWJlbFRwbCAgLSB0ZW1wbGF0ZSBmb3IgbGFiZWwgKGN1cnJlbnQgc2VsZWN0ZWQgZWxlbWVudCkgKGNvbnRhaW5zIDIgcGxhY2Vob2xkZXJzOiAldmFyIC0gZm9yIHNyYyBrZXksICVsYWJlbCAtIGZvciBzcmNbdmFsXSApCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewoJCgkkLmZuLmVsU2VsZWN0ID0gZnVuY3Rpb24obykgewoJCXZhciAkc2VsZiAgICA9IHRoaXM7CgkJdmFyIHNlbGYgICAgID0gdGhpcy5lcSgwKTsKCQl2YXIgb3B0cyAgICAgPSAkLmV4dGVuZCh7fSwgJC5mbi5lbFNlbGVjdC5kZWZhdWx0cywgbyk7CgkJdmFyIGhpZGRlbiAgID0gJCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgLz4nKS5hdHRyKCduYW1lJywgb3B0cy5uYW1lKTsKCQl2YXIgbGFiZWwgICAgPSAkKCc8bGFiZWwgLz4nKS5hdHRyKHt1bnNlbGVjdGFibGUgOiAnb24nfSkuYWRkQ2xhc3MoJ3JvdW5kZWQtbGVmdC0zJyk7CgkJdmFyIGxpc3QgICAgID0gbnVsbDsKCQl2YXIgaWVXaWR0aCAgPSBudWxsOwoKCQlpZiAoc2VsZi5nZXQoMCkubm9kZU5hbWUgPT0gJ1NFTEVDVCcpIHsKCQkJb3B0cy5zcmMgPSB7fTsKCQkJc2VsZi5jaGlsZHJlbignb3B0aW9uJykuZWFjaChmdW5jdGlvbigpIHsKCQkJCW9wdHMuc3JjWyQodGhpcykudmFsKCldID0gJCh0aGlzKS50ZXh0KCk7CgkJCX0pOwoJCQlvcHRzLnZhbHVlID0gc2VsZi52YWwoKTsKCQkJb3B0cy5uYW1lICA9IHNlbGYuYXR0cignbmFtZScpOwoJCQlzZWxmLnJlcGxhY2VXaXRoKChzZWxmID0gJCgnPGRpdiAvPicpKSk7CgkJfQoJCQoJCWlmICghb3B0cy52YWx1ZSB8fCAhb3B0cy5zcmNbb3B0cy52YWxdKSB7CgkJCW9wdHMudmFsdWUgPSBudWxsOwoJCQl2YXIgaSA9IDA7CgkJCWZvciAodmFyIHYgaW4gb3B0cy5zcmMpIHsKCQkJCWlmIChpKysgPT0gMCkgewoJCQkJCW9wdHMudmFsdWUgPSB2OwoJCQkJfQoJCQl9CgkJfQoKCQl0aGlzLnZhbCA9IGZ1bmN0aW9uKHYpIHsKCQkJaWYgKCF2ICYmIHYhPT0nJykgewoJCQkJcmV0dXJuIGhpZGRlbi52YWwoKTsKCQkJfSBlbHNlIHsKCQkJCWlmIChvcHRzLnNyY1t2XSkgewoJCQkJCWhpZGRlbi52YWwodik7CgkJCQkJdXBkYXRlTGFiZWwodik7CgkJCQkJaWYgKGxpc3QpIHsKCQkJCQkJbGlzdC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJCQlpZiAoJCh0aGlzKS5hdHRyKCduYW1lJykgPT0gdikgewoJCQkJCQkJCSQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkkKHRoaXMpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKCQkJCQkJCX0KCQkJCQkJfSk7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0KCQl9CgkKCQkvLyB1cGRhdGUgbGFiZWwgY29udGVudAoJCWZ1bmN0aW9uIHVwZGF0ZUxhYmVsKHYpIHsKCQkJdmFyIHRwbCA9IG9wdHMubGFiZWxUcGwgfHwgb3B0cy50cGxzW3ZdIHx8IG9wdHMudHBsOwoJCQlsYWJlbC5odG1sKHRwbC5yZXBsYWNlKC8ldmFsL2csIHYpLnJlcGxhY2UoLyVsYWJlbC8sIG9wdHMuc3JjW3ZdKSkuY2hpbGRyZW4oKS5hdHRyKHt1bnNlbGVjdGFibGUgOiAnb24nfSk7CgkJfQoJCQoJCS8vIGluaXQgInNlbGVjdCIKCQlzZWxmLmVtcHR5KCkKCQkJLmFkZENsYXNzKG9wdHNbJ2NsYXNzJ10rJyByb3VuZGVkLTMnKQoJCQkuYXR0cih7dW5zZWxlY3RhYmxlIDogJ29uJ30pCgkJCS5hcHBlbmQoaGlkZGVuKQoJCQkuYXBwZW5kKGxhYmVsKQoJCQkuaG92ZXIoCgkJCQlmdW5jdGlvbigpIHsgJCh0aGlzKS5hZGRDbGFzcygnaG92ZXInKSB9LAoJCQkJZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlQ2xhc3MoJ2hvdmVyJykgfQoJCQkpCgkJCS5jbGljayhmdW5jdGlvbihlKSB7CgkJCQkhbGlzdCAmJiBpbml0KCk7CgkJCQlsaXN0LnNsaWRlVG9nZ2xlKCk7CgkJCQkvLyBzdHVwaWQgaWUgaW5oZXJpdCB3aWR0aCBmcm9tIHBhcmVudAoJCQkJaWYgKCQuYnJvd3Nlci5tc2llICYmICFpZVdpZHRoKSB7IAoJCQkJCWxpc3QuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCQlpZVdpZHRoID0gTWF0aC5tYXgoaWVXaWR0aCwgJCh0aGlzKS53aWR0aCgpKTsKCQkJCQl9KTsKCQkJCQlpZiAoaWVXaWR0aCA+IGxpc3Qud2lkdGgoKSkgewoJCQkJCQlsaXN0LndpZHRoKGllV2lkdGgrNDApOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJCQoJCXRoaXMudmFsKG9wdHMudmFsdWUpOwoJCgkJLy8gY3JlYXRlIGRyb3AtZG93biBsaXN0CgkJZnVuY3Rpb24gaW5pdCgpIHsKCQkJLy8gbm90IHVsIGJlY2F1c2Ugb2YgaWUgaXMgc3R1cGlkIHdpdGggbW91c2VsZWF2ZSBpbiBpdCA6KAoJCQlsaXN0ID0gJCgnPGRpdiAvPicpCgkJCQkuYWRkQ2xhc3Mob3B0cy5saXN0Q2xhc3MrJyByb3VuZGVkLTMnKQoJCQkJLmhpZGUoKQoJCQkJLmFwcGVuZFRvKHNlbGYubW91c2VsZWF2ZShmdW5jdGlvbihlKSB7IGxpc3Quc2xpZGVVcCgpOyB9KSk7CgoJCQlmb3IgKHZhciB2IGluIG9wdHMuc3JjKSB7CgkJCQl2YXIgdHBsID0gb3B0cy50cGxzW3ZdIHx8IG9wdHMudHBsOyAKCQkJCSQoJzxkaXYgLz4nKQoJCQkJCS5hdHRyKCduYW1lJywgdikKCQkJCQkuYXBwZW5kKCAkKHRwbC5yZXBsYWNlKC8ldmFsL2csIHYpLnJlcGxhY2UoLyVsYWJlbC9nLCBvcHRzLnNyY1t2XSkpLmF0dHIoe3Vuc2VsZWN0YWJsZSA6ICdvbid9KSApCgkJCQkJLmFwcGVuZFRvKGxpc3QpCgkJCQkJLmhvdmVyKAoJCQkJCQlmdW5jdGlvbigpIHsgJCh0aGlzKS5hZGRDbGFzcygnaG92ZXInKSB9LAoJCQkJCQlmdW5jdGlvbigpIHsgJCh0aGlzKS5yZW1vdmVDbGFzcygnaG92ZXInKSB9CgkJCQkJKQoJCQkJCS5jbGljayhmdW5jdGlvbihlKSB7CgkJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJCgkJCQkJCXZhciB2ID0gJCh0aGlzKS5hdHRyKCduYW1lJyk7CgkJCQkJCSRzZWxmLnZhbCh2KTsKCQkJCQkJb3B0cy5zZWxlY3Qodik7CgkJCQkJCWxpc3Quc2xpZGVVcCgpOwoJCQkJCX0pOwoJCQl9OwoJCQkKCQkJdmFyIHcgPSBzZWxmLm91dGVyV2lkdGgoKTsKCQkJaWYgKGxpc3Qud2lkdGgoKSA8IHcpIHsKCQkJCWxpc3Qud2lkdGgodyk7CgkJCX0KCQkJCgkJCXZhciBoID0gbGlzdC5oZWlnaHQoKTsKCQkJaWYgKG9wdHMubWF4SGVpZ2h0PjAgJiYgaD5vcHRzLm1heEhlaWdodCkgewoJCQkJbGlzdC5oZWlnaHQob3B0cy5tYXhIZWlnaHQpOwoJCQl9CgkJCQoJCQkkc2VsZi52YWwoaGlkZGVuLnZhbCgpKTsKCQl9CgkJCgkJcmV0dXJuIHRoaXM7Cgl9CgkKCSQuZm4uZWxTZWxlY3QuZGVmYXVsdHMgPSB7CgkJbmFtZSAgICAgIDogJ2VsLXNlbGVjdCcsCgkJJ2NsYXNzJyAgIDogJ2VsLXNlbGVjdCcsCgkJbGlzdENsYXNzIDogJ2xpc3QnLAoJCWxhYmVsVHBsICA6IG51bGwsCgkJdHBsICAgICAgIDogJzwldmFsPiVsYWJlbDwvJXZhbD4nLAoJCXRwbHMgICAgICA6IHt9LAoJCXZhbHVlICAgICA6IG51bGwsCgkJc3JjICAgICAgIDoge30sCgkJc2VsZWN0ICAgIDogZnVuY3Rpb24odikgeyAgd2luZG93LmNvbnNvbGUgJiYgIHdpbmRvdy5jb25zb2xlLmxvZyAmJiB3aW5kb3cuY29uc29sZS5sb2coJ3NlbGVjdGVkOiAnK3YpOyB9LAoJCW1heEhlaWdodCA6IDQxMAoJfQoJCn0pKGpRdWVyeSk7Ci8qCiAqIGVsUlRFIC0gV1NXSU5HIGVkaXRvciBmb3Igd2ViCiAqCiAqIFVzYWdlOgogKiB2YXIgb3B0cyA9IHsKICoJLi4uLiAvLyBzZWUgZWxSVEUub3B0aW9ucy5qcwogKiB9CiAqIHZhciBlZGl0b3IgPSBuZXcgZWxSVEUoJCgnI215LWlkJykuZ2V0KDApLCBvcHRzKQogKiBvcgogKiAkKCcjbXktaWQnKS5lbHJ0ZShvcHRzKQogKgogKiAkKCcjbXktaWQpIG1heSBiZSB0ZXh0YXJlYSBvciBhbnkgRE9NIEVsZW1lbnQgd2l0aCB0ZXh0CiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQ29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICovCihmdW5jdGlvbigkKSB7CgplbFJURSA9IGZ1bmN0aW9uKHRhcmdldCwgb3B0cykgewoJaWYgKCF0YXJnZXQgfHwgIXRhcmdldC5ub2RlTmFtZSkgewoJCXJldHVybiBhbGVydCgnZWxSVEU6IGFyZ3VtZW50ICJ0YXJnZXQiIGlzIG5vdCBET00gRWxlbWVudCcpOwoJfQoJdmFyIHNlbGYgICAgID0gdGhpcywgaHRtbDsKCXRoaXMudmVyc2lvbiA9ICcxLjEnOwoJdGhpcy5idWlsZCAgID0gJzIwMTAtMDktMjAnOwoJdGhpcy5vcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMub3B0aW9ucywgb3B0cyk7Cgl0aGlzLmJyb3dzZXIgPSAkLmJyb3dzZXI7Cgl0aGlzLnRhcmdldCAgPSAkKHRhcmdldCk7CgkKCXRoaXMubGFuZyAgICAgID0gKCcnK3RoaXMub3B0aW9ucy5sYW5nKS50b0xvd2VyQ2FzZSgpOwoJdGhpcy5faTE4biAgICAgPSBuZXcgZWxpMThuKHt0ZXh0ZG9tYWluIDogJ3J0ZScsIG1lc3NhZ2VzIDogeyBydGUgOiB0aGlzLmkxOE1lc3NhZ2VzW3RoaXMubGFuZ10gfHwge319IH0pOwoJdGhpcy5ydGwgPSAhISgvXihhcnxmYXxoZSkkLy50ZXN0KHRoaXMubGFuZykgJiYgdGhpcy5pMThNZXNzYWdlc1t0aGlzLmxhbmddKTsKCQoJaWYgKHRoaXMucnRsKSB7CgkJdGhpcy5vcHRpb25zLmNzc0NsYXNzICs9ICcgZWwtcnRlLXJ0bCc7Cgl9Cgl0aGlzLnRvb2xiYXIgICA9ICQoJzxkaXYgY2xhc3M9InRvb2xiYXIiLz4nKTsKCXRoaXMuaWZyYW1lICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CgkvLyB0aGlzLnNvdXJjZSAgICA9ICQoJzx0ZXh0YXJlYSAvPicpLmhpZGUoKTsKCXRoaXMud29ya3pvbmUgID0gJCgnPGRpdiBjbGFzcz0id29ya3pvbmUiLz4nKS5hcHBlbmQodGhpcy5pZnJhbWUpLmFwcGVuZCh0aGlzLnNvdXJjZSk7Cgl0aGlzLnN0YXR1c2JhciA9ICQoJzxkaXYgY2xhc3M9InN0YXR1c2JhciIvPicpOwoJdGhpcy50YWJzYmFyICAgPSAkKCc8ZGl2IGNsYXNzPSJ0YWJzYmFyIi8+Jyk7Cgl0aGlzLmVkaXRvciAgICA9ICQoJzxkaXYgY2xhc3M9IicrdGhpcy5vcHRpb25zLmNzc0NsYXNzKyciIC8+JykuYXBwZW5kKHRoaXMudG9vbGJhcikuYXBwZW5kKHRoaXMud29ya3pvbmUpLmFwcGVuZCh0aGlzLnN0YXR1c2JhcikuYXBwZW5kKHRoaXMudGFic2Jhcik7CgkKCXRoaXMuZG9jICAgICA9IG51bGw7Cgl0aGlzLiRkb2MgICAgPSBudWxsOwoJdGhpcy53aW5kb3cgID0gbnVsbDsKCQoJdGhpcy51dGlscyAgPSBuZXcgdGhpcy51dGlscyh0aGlzKTsKCXRoaXMuZG9tICAgID0gbmV3IHRoaXMuZG9tKHRoaXMpOwoJdGhpcy5maWx0ZXIgPSBuZXcgdGhpcy5maWx0ZXIodGhpcykKCQoJLyoqCgkgKiBTeW5jIGlmcmFtZXMvdGV4dGFyZWFzIGhlaWdodCB3aXRoIHdvcmt6b25lIGhlaWdodCAKCSAqCgkgKiBAcmV0dXJuIHZvaWQKCSAqLwoJdGhpcy51cGRhdGVIZWlnaHQgPSBmdW5jdGlvbigpIHsKCQlzZWxmLndvcmt6b25lLmFkZChzZWxmLmlmcmFtZSkuYWRkKHNlbGYuc291cmNlKS5oZWlnaHQoc2VsZi53b3Jrem9uZS5oZWlnaHQoKSk7Cgl9CgkKCS8qKgoJICogVHVybiBlZGl0b3IgcmVzaXphYmxlIG9uL29mZiBpZiBhbGxvd2VkCgkgKgoJICogQHBhcmFtICBCb29sZWFuIAoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLnJlc2l6YWJsZSA9IGZ1bmN0aW9uKHIpIHsKCQl2YXIgc2VsZiA9IHRoaXM7CgkJaWYgKHRoaXMub3B0aW9ucy5yZXNpemFibGUgJiYgJC5mbi5yZXNpemFibGUpIHsKCQkJaWYgKHIpIHsKCQkJCXRoaXMuZWRpdG9yLnJlc2l6YWJsZSh7aGFuZGxlcyA6ICdzZScsIGFsc29SZXNpemUgOiB0aGlzLndvcmt6b25lLCBtaW5XaWR0aCA6MzAwLCBtaW5IZWlnaHQgOiAyMDAgfSkuYmluZCgncmVzaXplJywgc2VsZi51cGRhdGVIZWlnaHQpOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5lZGl0b3IucmVzaXphYmxlKCdkZXN0cm95JykudW5iaW5kKCdyZXNpemUnLCBzZWxmLnVwZGF0ZUhlaWdodCk7CgkJCX0KCQl9Cgl9CgkKCS8qIGF0dGFjaCBlZGl0b3IgdG8gZG9jdW1lbnQgKi8KCXRoaXMuZWRpdG9yLmluc2VydEFmdGVyKHRhcmdldCk7CgkvKiBpbml0IGVkaXRvciB0ZXh0YXJlYSAqLwoJdmFyIGNvbnRlbnQgPSAnJzsKCWlmICh0YXJnZXQubm9kZU5hbWUgPT0gJ1RFWFRBUkVBJykgewoJCXRoaXMuc291cmNlID0gdGhpcy50YXJnZXQ7CgkJdGhpcy5zb3VyY2UuaW5zZXJ0QWZ0ZXIodGhpcy5pZnJhbWUpLmhpZGUoKTsKCQljb250ZW50ID0gdGhpcy50YXJnZXQudmFsKCk7Cgl9IGVsc2UgewoJCXRoaXMuc291cmNlID0gJCgnPHRleHRhcmVhIC8+JykuaW5zZXJ0QWZ0ZXIodGhpcy5pZnJhbWUpLmhpZGUoKTsKCQljb250ZW50ID0gdGhpcy50YXJnZXQuaGlkZSgpLmh0bWwoKTsKCX0KCXRoaXMuc291cmNlLmF0dHIoJ25hbWUnLCB0aGlzLnRhcmdldC5hdHRyKCduYW1lJyl8fHRoaXMudGFyZ2V0LmF0dHIoJ2lkJykpOwoJY29udGVudCA9ICQudHJpbShjb250ZW50KTsKCWlmICghY29udGVudCkgewoJCWNvbnRlbnQgPSAnICc7Cgl9CgoJLyogYWRkIHRhYnMgKi8KCWlmICh0aGlzLm9wdGlvbnMuYWxsb3dTb3VyY2UpIHsKCQl0aGlzLnRhYnNiYXIuYXBwZW5kKCc8ZGl2IGNsYXNzPSJ0YWIgZWRpdG9yIHJvdW5kZWQtYm90dG9tLTcgYWN0aXZlIj4nK3NlbGYuaTE4bignRWRpdG9yJykrJzwvZGl2PjxkaXYgY2xhc3M9InRhYiBzb3VyY2Ugcm91bmRlZC1ib3R0b20tNyI+JytzZWxmLmkxOG4oJ1NvdXJjZScpKyc8L2Rpdj48ZGl2IGNsYXNzPSJjbGVhcmZpeCIgc3R5bGU9ImNsZWFyOmJvdGgiLz4nKQoJCQkuY2hpbGRyZW4oJy50YWInKS5jbGljayhmdW5jdGlvbihlKSB7CgkJCQlpZiAoISQodGhpcykuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7CgkJCQkJc2VsZi50YWJzYmFyLmNoaWxkcmVuKCcudGFiJykudG9nZ2xlQ2xhc3MoJ2FjdGl2ZScpOwoJCQkJCXNlbGYud29ya3pvbmUuY2hpbGRyZW4oKS50b2dnbGUoKTsKCgkJCQkJaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2VkaXRvcicpKSB7CgkJCQkJCXNlbGYudXBkYXRlRWRpdG9yKCk7CgkJCQkJCXNlbGYud2luZG93LmZvY3VzKCk7CgkJCQkJCXNlbGYudWkudXBkYXRlKHRydWUpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXNlbGYudXBkYXRlU291cmNlKCk7CgkJCQkJCXNlbGYuc291cmNlLmZvY3VzKCk7CgkJCQkJCWlmICgkLmJyb3dzZXIubXNpZSkgewoJCQkJCQkJLy8gQHRvZG8KCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXNlbGYuc291cmNlWzBdLnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwoJCQkJCQl9CgkJCQkJCXNlbGYudWkuZGlzYWJsZSgpOwoJCQkJCQlzZWxmLnN0YXR1c2Jhci5lbXB0eSgpOwoJCQkJCQkKCQkJCQl9CgkJCQl9CgkJCQkKCQkJfSk7Cgl9CgkKCXRoaXMud2luZG93ID0gdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdzsKCXRoaXMuZG9jICAgID0gdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDsKCXRoaXMuJGRvYyAgID0gJCh0aGlzLmRvYyk7CgkKCS8qIHB1dCBjb250ZW50IGludG8gaWZyYW1lICovCglodG1sID0gJzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4nOwoJJC5lYWNoKHNlbGYub3B0aW9ucy5jc3NmaWxlcywgZnVuY3Rpb24oKSB7CgkJaHRtbCArPSAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyt0aGlzKyciIC8+JzsKCX0pOwoJdGhpcy5kb2Mub3BlbigpOwoJdmFyIHMgPSB0aGlzLmZpbHRlci53eXNpd3lnKGNvbnRlbnQpLAoJCWNsID0gdGhpcy5ydGwgPyAnIGNsYXNzPSJlbC1ydGUtcnRsIicgOiAnJzsKCXRoaXMuZG9jLndyaXRlKHNlbGYub3B0aW9ucy5kb2N0eXBlK2h0bWwrJzwvaGVhZD48Ym9keScrY2wrJz4nKyhzKSsnPC9ib2R5PjwvaHRtbD4nKTsKCXRoaXMuZG9jLmNsb3NlKCk7CgkKCS8qIG1ha2UgaWZyYW1lIGVkaXRhYmxlICovCglpZiAoJC5icm93c2VyLm1zaWUpIHsKCQl0aGlzLmRvYy5ib2R5LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7Cgl9IGVsc2UgewoJCXRyeSB7IHRoaXMuZG9jLmRlc2lnbk1vZGUgPSAib24iOyB9IAoJCWNhdGNoKGUpIHsgfQoJCXRoaXMuZG9jLmV4ZWNDb21tYW5kKCdzdHlsZVdpdGhDU1MnLCBmYWxzZSwgdGhpcy5vcHRpb25zLnN0eWxlV2l0aENTUyk7Cgl9CgkKCWlmICh0aGlzLm9wdGlvbnMuaGVpZ2h0PjApIHsKCQl0aGlzLndvcmt6b25lLmhlaWdodCh0aGlzLm9wdGlvbnMuaGVpZ2h0KTsKCQkKCX0KCXRoaXMudXBkYXRlSGVpZ2h0KCk7Cgl0aGlzLnJlc2l6YWJsZSh0cnVlKTsKCXRoaXMud2luZG93LmZvY3VzKCk7CgkKCXRoaXMuaGlzdG9yeSA9IG5ldyB0aGlzLmhpc3RvcnkodGhpcyk7CgkKCS8qIGluaXQgc2VsZWN0aW9uIG9iamVjdCAqLwoJdGhpcy5zZWxlY3Rpb24gPSBuZXcgdGhpcy5zZWxlY3Rpb24odGhpcyk7CgkvKiBpbml0IGJ1dHRvbnMgKi8KCXRoaXMudWkgPSBuZXcgdGhpcy51aSh0aGlzKTsKCQoJCgkvKiBiaW5kIHVwZGF0ZVNvdXJjZSB0byBwYXJlbnQgZm9ybSBzdWJtaXQgKi8KCXRoaXMudGFyZ2V0LnBhcmVudHMoJ2Zvcm0nKS5iaW5kKCdzdWJtaXQnLCBmdW5jdGlvbihlKSB7CgkJc2VsZi5zb3VyY2UucGFyZW50cygnZm9ybScpLmZpbmQoJ1tuYW1lPSJlbC1zZWxlY3QiXScpLnJlbW92ZSgpCgkJc2VsZi5iZWZvcmVTYXZlKCk7Cgl9KTsKCQoJLy8gb24gdGFiIHByZXNzIC0gaW5zZXJ0IFx0IGFuZCBwcmV2ZW50IG1vdmUgZm9jdXMKCXRoaXMuc291cmNlLmJpbmQoJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7CgkJaWYgKGUua2V5Q29kZSA9PSA5KSB7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQoJCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJCXZhciByID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CgkJCQlyLnRleHQgPSAiXHQiK3IudGV4dDsKCQkJCXRoaXMuZm9jdXMoKTsKCQkJfSBlbHNlIHsKCQkJCXZhciBiZWZvcmUgPSB0aGlzLnZhbHVlLnN1YnN0cigwLCB0aGlzLnNlbGVjdGlvblN0YXJ0KSwKCQkJCQlhZnRlciA9IHRoaXMudmFsdWUuc3Vic3RyKHRoaXMuc2VsZWN0aW9uRW5kKTsKCQkJCXRoaXMudmFsdWUgPSBiZWZvcmUrIlx0IithZnRlcjsKCQkJCXRoaXMuc2V0U2VsZWN0aW9uUmFuZ2UoYmVmb3JlLmxlbmd0aCsxLCBiZWZvcmUubGVuZ3RoKzEpOwoJCQl9CgkJfQoJfSk7CgkKCS8qIHVwZGF0ZSBidXR0b25zIG9uIGNsaWNrIGFuZCBrZXl1cCAqLwoJdGhpcy4kZG9jLmJpbmQoJ21vdXNldXAnLCBmdW5jdGlvbigpIHsKCQlzZWxmLnVpLnVwZGF0ZSgpOwoJfSkKCS5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbihlKSB7CgkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCWUuc3RvcFByb3BhZ2F0aW9uKCk7Cgl9KQoJLmJpbmQoJ2tleXVwJywgZnVuY3Rpb24oZSkgewoJCWlmICgoZS5rZXlDb2RlID49IDggJiYgZS5rZXlDb2RlIDw9IDEzKSB8fCAoZS5rZXlDb2RlPj0zMiAmJiBlLmtleUNvZGU8PSA0MCkgfHwgZS5rZXlDb2RlID09IDQ2IHx8IChlLmtleUNvZGUgPj05NiAmJiBlLmtleUNvZGUgPD0gMTExKSkgewoJCQkvLyBzZWxmLmxvZygna2V5dXAgJytlLmtleUNvZGUpCgkJCXNlbGYudWkudXBkYXRlKCk7CgkJfQoJfSkKCS5iaW5kKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewoJCWlmICgoZS5tZXRhS2V5IHx8IGUuY3RybEtleSkgJiYgZS5rZXlDb2RlID09IDY1KSB7CgkJCXNlbGYudWkudXBkYXRlKCk7CgkJfSBlbHNlIGlmIChlLmtleUNvZGUgPT0gMTMpIHsKCQkJdmFyIG4gPSBzZWxmLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJCS8vIHNlbGYubG9nKG4pCgkJCWlmIChzZWxmLmRvbS5zZWxmT3JQYXJlbnQobiwgL15QUkUkLykpIHsKCQkJCXNlbGYuc2VsZWN0aW9uLmluc2VydE5vZGUoc2VsZi5kb2MuY3JlYXRlVGV4dE5vZGUoIlxyXG4iKSk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoJC5icm93c2VyLnNhZmFyaSAmJiBlLnNoaWZ0S2V5KSB7CgkJCQlzZWxmLnNlbGVjdGlvbi5pbnNlcnROb2RlKHNlbGYuZG9jLmNyZWF0ZUVsZW1lbnQoJ2JyJykpCgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9Cgl9KQoJCgl0aGlzLnR5cGluZyA9IGZhbHNlOwoJdGhpcy5sYXN0S2V5ID0gbnVsbDsKCQoJdGhpcy4kZG9jLmJpbmQoJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7CgkJaWYgKChlLmtleUNvZGU+PTQ4ICYmIGUua2V5Q29kZSA8PTU3KSB8fCBlLmtleUNvZGU9PTYxIHx8IGUua2V5Q29kZSA9PSAxMDkgfHwgKGUua2V5Q29kZT49NjUgJiYgZS5rZXlDb2RlPD05MCkgfHwgZS5rZXlDb2RlPT0xODggfHxlLmtleUNvZGU9PTE5MCB8fCBlLmtleUNvZGU9PTE5MSB8fCAoZS5rZXlDb2RlPj0yMTkgJiYgZS5rZXlDb2RlPD0yMjIpKSB7CgkJCWlmICghc2VsZi50eXBpbmcpIHsKCQkJCXNlbGYuaGlzdG9yeS5hZGQodHJ1ZSk7CgkJCX0KCQkJc2VsZi50eXBpbmcgPSB0cnVlOwoJCQlzZWxmLmxhc3RLZXkgPSBudWxsOwoJCX0gZWxzZSBpZiAoZS5rZXlDb2RlID09IDggfHwgZS5rZXlDb2RlID09IDQ2IHx8IGUua2V5Q29kZSA9PSAzMiB8fCBlLmtleUNvZGUgPT0gMTMpIHsKCQkJaWYgKGUua2V5Q29kZSAhPSBzZWxmLmxhc3RLZXkpIHsKCQkJCXNlbGYuaGlzdG9yeS5hZGQodHJ1ZSk7CgkJCX0KCQkJc2VsZi5sYXN0S2V5ID0gZS5rZXlDb2RlOwoJCQlzZWxmLnR5cGluZyA9IGZhbHNlOwoJCX0KCgl9KQoJLmJpbmQoJ21vdXNldXAnLCBmdW5jdGlvbigpIHsKCQlzZWxmLnR5cGluZyA9IGZhbHNlOwoJCXNlbGYubGFzdEtleSA9IG51bGw7Cgl9KQoJLmJpbmQoJ3Bhc3RlJywgZnVuY3Rpb24oZSkgewoJCWlmICghc2VsZi5vcHRpb25zLmFsbG93UGFzdGUpIHsKCQkJLy8gcGFzdGUgZGVuaWVkIAoJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfSBlbHNlIHsKCQkJdmFyIG4gPSAkKHNlbGYuZG9tLmNyZWF0ZSgnZGl2JykpWzBdLAoJCQkJciA9IHNlbGYuZG9jLmNyZWF0ZVRleHROb2RlKCdfJyk7CgkJCXNlbGYuaGlzdG9yeS5hZGQodHJ1ZSk7CgkJCXNlbGYudHlwaW5nID0gdHJ1ZTsKCQkJc2VsZi5sYXN0S2V5ID0gbnVsbDsKCQkJbi5hcHBlbmRDaGlsZChyKTsKCQkJc2VsZi5zZWxlY3Rpb24uZGVsZXRlQ29udGVudHMoKS5pbnNlcnROb2RlKG4pOwoJCQlzZWxmLnNlbGVjdGlvbi5zZWxlY3Qocik7CgkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCQlpZiAobi5wYXJlbnROb2RlKSB7CgkJCQkJLy8gY2xlYW4gc2FuZGJveCBjb250ZW50CgkJCQkJJChuKS5odG1sKHNlbGYuZmlsdGVyLnByb2NjZXNzKCdwYXN0ZScsICQobikuaHRtbCgpKSk7CgkJCQkJciA9IG4ubGFzdENoaWxkOwoJCQkJCXNlbGYuZG9tLnVud3JhcChuKTsKCQkJCQlpZiAocikgewoJCQkJCQlzZWxmLnNlbGVjdGlvbi5zZWxlY3Qocik7CgkJCQkJCXNlbGYuc2VsZWN0aW9uLmNvbGxhcHNlKGZhbHNlKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCS8vIHNtdGggd3JvbmcgLSBjbGVhbiBhbGwgZG9jCgkJCQkJbi5wYXJlbnROb2RlICYmIG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTsKCQkJCQlzZWxmLnZhbChzZWxmLmZpbHRlci5wcm9jY2VzcygncGFzdGUnLCBzZWxmLmZpbHRlci53eXNpd3lnMnd5c2l3eWcoJChzZWxmLmRvYy5ib2R5KS5odG1sKCkpKSk7CgkJCQkJc2VsZi5zZWxlY3Rpb24uc2VsZWN0KHNlbGYuZG9jLmJvZHkuZmlyc3RDaGlsZCk7CgkJCQkJc2VsZi5zZWxlY3Rpb24uY29sbGFwc2UodHJ1ZSk7CgkJCQl9CgkJCQkkKHNlbGYuZG9jLmJvZHkpLm1vdXNldXAoKTsgLy8gdG8gYWN0aXZhdGUgaGlzdG9yeSBidXV0b25zCgkJCX0sIDE1KTsKCQl9Cgl9KTsKCQoJaWYgKCQuYnJvd3Nlci5tc2llKSB7CgkJdGhpcy4kZG9jLmJpbmQoJ2tleXVwJywgZnVuY3Rpb24oZSkgewoJCQlpZiAoZS5rZXlDb2RlID09IDg2ICYmIChlLm1ldGFLZXl8fGUuY3RybEtleSkpIHsKCQkJCXNlbGYuaGlzdG9yeS5hZGQodHJ1ZSk7CgkJCQlzZWxmLnR5cGluZyA9IHRydWU7CgkJCQlzZWxmLmxhc3RLZXkgPSBudWxsOwoJCQkJc2VsZi5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCQkJCXNlbGYudmFsKHNlbGYuZmlsdGVyLnByb2NjZXNzKCdwYXN0ZScsIHNlbGYuZmlsdGVyLnd5c2l3eWcyd3lzaXd5ZygkKHNlbGYuZG9jLmJvZHkpLmh0bWwoKSkpKTsKCQkJCXNlbGYuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJCQkkKHNlbGYuZG9jLmJvZHkpLm1vdXNldXAoKTsKCQkJCXRoaXMudWkudXBkYXRlKCk7CgkJCX0KCQl9KTsKCX0KCQoJaWYgKCQuYnJvd3Nlci5zYWZhcmkpIHsKCQl0aGlzLiRkb2MuYmluZCgnY2xpY2snLCBmdW5jdGlvbihlKSB7CgkJCSQoc2VsZi5kb2MuYm9keSkuZmluZCgnLmVscnRlLXdlYmtpdC1obCcpLnJlbW92ZUNsYXNzKCdlbHJ0ZS13ZWJraXQtaGwnKTsKCQkJaWYgKGUudGFyZ2V0Lm5vZGVOYW1lID09ICdJTUcnKSB7CgkJCQkkKGUudGFyZ2V0KS5hZGRDbGFzcygnZWxydGUtd2Via2l0LWhsJyk7CgkJCX0KCQl9KS5iaW5kKCdrZXl1cCcsIGZ1bmN0aW9uKGUpIHsKCQkJJChzZWxmLmRvYy5ib2R5KS5maW5kKCcuZWxydGUtd2Via2l0LWhsJykucmVtb3ZlQ2xhc3MoJ2VscnRlLXdlYmtpdC1obCcpOwoJCX0pCgl9CgkKCS8vIHRoaXMucmVzaXphYmxlKHRydWUpCgl0aGlzLndpbmRvdy5mb2N1cygpOwoJLy8gdGhpcy5sb2codGhpcy5lZGl0b3IucGFyZW50cygnZm9ybScpLmZpbmQoJ1tuYW1lPSJlbC1zZWxlY3QiXScpKQoJCgkKfQoKLyoqCiAqIFJldHVybiBtZXNzYWdlIHRyYW5zbGF0ZWQgdG8gc2VsZWN0ZWQgbGFuZ3VhZ2UKICoKICogQHBhcmFtICBzdHJpbmcgIG1zZyAgbWVzc2FnZSB0ZXh0IGluIGVuZ2xpc2gKICogQHJldHVybiBzdHJpbmcKICoqLwplbFJURS5wcm90b3R5cGUuaTE4biA9IGZ1bmN0aW9uKG1zZykgewoJcmV0dXJuIHRoaXMuX2kxOG4udHJhbnNsYXRlKG1zZyk7Cn0KCgoKLyoqCiAqIERpc3BsYXkgZWRpdG9yCiAqCiAqIEByZXR1cm4gdm9pZAogKiovCmVsUlRFLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7Cgl0aGlzLmVkaXRvci5zaG93KCk7Cn0KCi8qKgogKiBIaWRlIGVkaXRvciBhbmQgZGlzcGxheSBlbGVtZW50cyBvbiB3aWNoIGVkaXRvciB3YXMgY3JlYXRlZAogKgogKiBAcmV0dXJuIHZvaWQKICoqLwplbFJURS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHsKCXRoaXMuZWRpdG9yLmhpZGUoKTsKfQoKZWxSVEUucHJvdG90eXBlLnVwZGF0ZUVkaXRvciA9IGZ1bmN0aW9uKCkgewoJdGhpcy52YWwodGhpcy5zb3VyY2UudmFsKCkpOwp9CgplbFJURS5wcm90b3R5cGUudXBkYXRlU291cmNlID0gZnVuY3Rpb24oKSB7Cgl0aGlzLnNvdXJjZS52YWwodGhpcy5maWx0ZXIuc291cmNlKCQodGhpcy5kb2MuYm9keSkuaHRtbCgpKSk7Cn0KCi8qKgogKiBSZXR1cm4gZWRpdGVkIHRleHQKICoKICogQHJldHVybiBTdHJpbmcKICoqLwplbFJURS5wcm90b3R5cGUudmFsID0gZnVuY3Rpb24odikgewoJaWYgKHR5cGVvZih2KSA9PSAnc3RyaW5nJykgewoJCXYgPSAnJyt2OwoJCWlmICh0aGlzLnNvdXJjZS5pcygnOnZpc2libGUnKSkgewoJCQl0aGlzLnNvdXJjZS52YWwodGhpcy5maWx0ZXIuc291cmNlMnNvdXJjZSh2KSk7CgkJfSBlbHNlIHsKCQkJaWYgKCQuYnJvd3Nlci5tc2llKSB7CgkJCQl0aGlzLmRvYy5ib2R5LmlubmVySFRNTCA9ICc8YnIgLz4nK3RoaXMuZmlsdGVyLnd5c2l3eWcodik7CgkJCQl0aGlzLmRvYy5ib2R5LnJlbW92ZUNoaWxkKHRoaXMuZG9jLmJvZHkuZmlyc3RDaGlsZCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmRvYy5ib2R5LmlubmVySFRNTCA9IHRoaXMuZmlsdGVyLnd5c2l3eWcodik7CgkJCX0KCQkJCgkJfQoJfSBlbHNlIHsKCQlpZiAodGhpcy5zb3VyY2UuaXMoJzp2aXNpYmxlJykpIHsKCQkJcmV0dXJuIHRoaXMuZmlsdGVyLnNvdXJjZTJzb3VyY2UodGhpcy5zb3VyY2UudmFsKCkpOwoJCX0gZWxzZSB7CgkJCXJldHVybiB0aGlzLmZpbHRlci5zb3VyY2UoJCh0aGlzLmRvYy5ib2R5KS5odG1sKCkpOwoJCX0KCX0KfQoKZWxSVEUucHJvdG90eXBlLmJlZm9yZVNhdmUgPSBmdW5jdGlvbigpIHsKCXRoaXMuc291cmNlLnZhbCh0aGlzLnZhbCgpfHwnJyk7Cn0KCi8qKgogKiBTdWJtaXQgZm9ybQogKgogKiBAcmV0dXJuIHZvaWQKICoqLwplbFJURS5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uKCkgewoJdGhpcy5iZWZvcmVTYXZlKCk7Cgl0aGlzLmVkaXRvci5wYXJlbnRzKCdmb3JtJykuc3VibWl0KCk7Cn0KCmVsUlRFLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbihtc2cpIHsKCWlmICh3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cpIHsKCQl3aW5kb3cuY29uc29sZS5sb2cobXNnKTsKCX0KICAgICAgICAKfQoKZWxSVEUucHJvdG90eXBlLmkxOE1lc3NhZ2VzID0ge307CgokLmZuLmVscnRlID0gZnVuY3Rpb24obywgdikgeyAKCXZhciBjbWQgPSB0eXBlb2YobykgPT0gJ3N0cmluZycgPyBvIDogJycsIHJldDsKCQoJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCWlmICghdGhpcy5lbHJ0ZSkgewoJCQl0aGlzLmVscnRlID0gbmV3IGVsUlRFKHRoaXMsIHR5cGVvZihvKSA9PSAnb2JqZWN0JyA/IG8gOiB7fSk7CgkJfQoJCXN3aXRjaCAoY21kKSB7CgkJCWNhc2UgJ29wZW4nOgoJCQljYXNlICdzaG93JzoKCQkJCXRoaXMuZWxydGUub3BlbigpOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2Nsb3NlJzoKCQkJY2FzZSAnaGlkZSc6CgkJCQl0aGlzLmVscnRlLmNsb3NlKCk7CgkJCQlicmVhazsKCQkJY2FzZSAndXBkYXRlU291cmNlJzoKCQkJCXRoaXMuZWxydGUudXBkYXRlU291cmNlKCk7CgkJCQlicmVhazsKCQl9Cgl9KTsKCQoJaWYgKGNtZCA9PSAndmFsJykgewoJCWlmICghdGhpcy5sZW5ndGgpIHsKCQkJcmV0dXJuICcnOwoJCX0gZWxzZSBpZiAodGhpcy5sZW5ndGggPT0gMSkgewoJCQlyZXR1cm4gdiA/IHRoaXNbMF0uZWxydGUudmFsKHYpIDogdGhpc1swXS5lbHJ0ZS52YWwoKTsKCQl9IGVsc2UgewoJCQlyZXQgPSB7fQoJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlyZXRbdGhpcy5lbHJ0ZS5zb3VyY2UuYXR0cignbmFtZScpXSA9IHRoaXMuZWxydGUudmFsKCk7CgkJCX0pOwoJCQlyZXR1cm4gcmV0OwoJCX0KCX0KCXJldHVybiB0aGlzOwp9Cgp9KShqUXVlcnkpOwovKgogKiBET00gdXRpbGl0ZXMgZm9yIGVsUlRFIAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuZG9tID0gZnVuY3Rpb24ocnRlKSB7Cgl0aGlzLnJ0ZSA9IHJ0ZTsKCXZhciBzZWxmID0gdGhpczsKCXRoaXMucmVnRXhwID0gewoJCXRleHROb2RlcyAgICAgICAgIDogL14oQXxBQkJSfEFDUk9OWU18QUREUkVTU3xCfEJET3xCSUd8QkxPQ0tRVU9URXxDQVBUSU9OfENFTlRFUnxDSVRFfENPREV8RER8REVMfERGTnxESVZ8RFR8RU18RklFTERTRVR8Rk9OVHxIWzEtNl18SXxJTlN8S0JEfExBQkVMfExFR0VORHxMSXxNQVJRVUVFfE5PQlJ8Tk9FTUJFRHxQfFBSRXxRfFNBTVB8U01BTEx8U1BBTnxTVFJJS0V8U1RST05HfFNVQnxTVVB8VER8VEh8VFR8VkFSKSQvLAoJCXRleHRDb250YWluc05vZGVzIDogL14oQXxBQkJSfEFDUk9OWU18QUREUkVTU3xCfEJET3xCSUd8QkxPQ0tRVU9URXxDQVBUSU9OfENFTlRFUnxDSVRFfENPREV8RER8REVMfERGTnxESVZ8REx8RFR8RU18RklFTERTRVR8Rk9OVHxIWzEtNl18SXxJTlN8S0JEfExBQkVMfExFR0VORHxMSXxNQVJRVUVFfE5PQlJ8Tk9FTUJFRHxPTHxQfFBSRXxRfFNBTVB8U01BTEx8U1BBTnxTVFJJS0V8U1RST05HfFNVQnxTVVB8VEFCTEV8VEhFQUR8VEJPRFl8VEZPT1R8VER8VEh8VFJ8VFR8VUx8VkFSKSQvLAoJCWJsb2NrICAgICAgICAgICAgIDogL14oQVBQTEVUfEJMT0NLUVVPVEV8QlJ8Q0FQVElPTnxDRU5URVJ8Q09MfENPTEdST1VQfEREfERJVnxETHxEVHxIWzEtNl18RU1CRUR8RklFTERTRVR8TEl8TUFSUVVFRXxOT0JSfE9CSkVDVHxPTHxQfFBSRXxUQUJMRXxUSEVBRHxUQk9EWXxURk9PVHxURHxUSHxUUnxVTCkkLywKCQlzZWxlY3Rpb25CbG9jayAgICA6IC9eKEFQUExFVHxCTE9DS1FVT1RFfEJSfENBUFRJT058Q0VOVEVSfENPTHxDT0xHUk9VUHxERHxESVZ8REx8RFR8SFsxLTZdfEVNQkVEfEZJRUxEU0VUfExJfE1BUlFVRUV8Tk9CUnxPQkpFQ1R8T0x8UHxQUkV8VER8VEh8VFJ8VUwpJC8sCQkKCQloZWFkZXIgICAgICAgICAgICA6IC9eSFsxLTZdJC8sCgkJZm9ybUVsZW1lbnQgICAgICAgOiAvXihGT1JNfElOUFVUfEhJRERFTnxURVhUQVJFQXxTRUxFQ1R8QlVUVE9OKSQvCgl9OwoJCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgkvKiAgICAgICAgICAgICAgICAgICAgICDQo9GC0LjQu9C40YLRiyAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKCQoJLyoqCgkgKiDQktC+0LfQstGA0LDRidCw0LXRgiBib2R5INGA0LXQtNCw0LrRgtC40YDRg9C10LzQvtCz0L4g0LTQvtC60YPQvNC10L3RgtCwCgkgKgoJICogQHJldHVybiBFbGVtZW50CgkgKiovCgl0aGlzLnJvb3QgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5ydGUuYm9keTsKCX0KCgl0aGlzLmNyZWF0ZSA9IGZ1bmN0aW9uKHQpIHsKCQlyZXR1cm4gdGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQodCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gbm9kZSBmb3IgYm9va21hcmsgd2l0aCB1bmlxdWUgSUQKCSAqCgkgKiBAcmV0dXJuIERPTUVsZW1lbnQKCSAqKi8KCXRoaXMuY3JlYXRlQm9va21hcmsgPSBmdW5jdGlvbigpIHsKCQl2YXIgYiA9IHRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CgkJYi5pZCA9ICdlbHJ0ZS1ibS0nK01hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zdWJzdHIoMik7CgkJJChiKS5hZGRDbGFzcygnZWxydGVibScpOwoJCXJldHVybiBiOwoJfQoKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCINC40L3QtNC10LrRgSDRjdC70LXQvNC10L3RgtCwINCy0L3Rg9GC0YDQuCDRgNC+0LTQuNGC0LXQu9GPCgkgKgoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwCgkgKiBAcmV0dXJuIGludGVnZXIKCSAqKi8KCXRoaXMuaW5kZXhPZiA9IGZ1bmN0aW9uKG4pIHsKCQl2YXIgbmR4ID0gMDsKCQluID0gJChuKTsKCQl3aGlsZSAoKG4gPSBuLnByZXYoKSkgJiYgbi5sZW5ndGgpIHsKCQkJbmR4Kys7CgkJfQoJCXJldHVybiBuZHg7Cgl9CgkKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCINC30L3QsNGH0LXQvdC40LUg0LDRgtGC0YDQuNCx0YPRgtCwINCyINC90LjQttC90LXQvCDRgNC10LPQuNGB0YLRgNC1ICjQvtGFINGD0LYg0Y3RgtC+0YIgSUUpCgkgKgoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwCgkgKiBAcGFyYW0gIFN0cmluZyAgYXR0ciDQuNC80Y8g0LDRgtGC0YDQuNCx0YPRgtCwCgkgKiBAcmV0dXJuIHN0cmluZwoJICoqLwoJdGhpcy5hdHRyID0gZnVuY3Rpb24obiwgYXR0cikgewoJCXZhciB2ID0gJyc7CgkJaWYgKG4ubm9kZVR5cGUgPT0gMSkgewoJCQl2ID0gJChuKS5hdHRyKGF0dHIpOwoJCQlpZiAodiAmJiBhdHRyICE9ICdzcmMnICYmIGF0dHIgIT0gJ2hyZWYnKSB7CgkJCQl2ID0gdi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7CgkJCX0KCQl9IAoJCXJldHVybiB2fHwnJzsKCX0KCQoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIg0LHQu9C40LbQsNC50YjQuNC5INC+0LHRidC40Lkg0LrQvtC90YLQtdC50L3QtdGAINC00LvRjyAyLdGFINGN0Lst0YLQvtCyCgkgKgoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwMQoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwMgoJICogQHJldHVybiBFbGVtZW50CgkgKiovCgl0aGlzLmZpbmRDb21tb25BbmNlc3RvciA9IGZ1bmN0aW9uKG4xLCBuMikgewoJCWlmICghbjEgfHwgIW4yKSB7CgkJCXJldHVybiB0aGlzLnJ0ZS5sb2coJ2RvbS5maW5kQ29tbW9uQW5jZXN0b3IgaW52YWxpZCBhcmd1bWVudHMnKTsKCQl9CgkJaWYgKG4xID09IG4yKSB7CgkJCXJldHVybiBuMTsKCQl9IGVsc2UgaWYgKG4xLm5vZGVOYW1lID09ICdCT0RZJyB8fCBuMi5ub2RlTmFtZSA9PSAnQk9EWScpIHsKCQkJcmV0dXJuIHRoaXMucnRlLmRvYy5ib2R5OwoJCX0KCQl2YXIgcDEgPSAkKG4xKS5wYXJlbnRzKCksIHAyID0gJChuMikucGFyZW50cygpLCBsICA9IHAyLmxlbmd0aC0xLCBjICA9IHAyW2xdOwoJCWZvciAodmFyIGkgPSBwMS5sZW5ndGggLSAxOyBpID49IDA7IGktLSwgbC0tKXsKCQkJaWYgKHAxW2ldID09IHAyW2xdKSB7CgkJCQljID0gcDFbaV07CgkJCX0gZWxzZSB7CgkJCQlicmVhazsKCQkJfQoJCX07CgkJcmV0dXJuIGM7Cgl9CgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiBUUlVFLCDQtdGB0LvQuCDQvdC+0LTQsCDQv9GD0YHRgtCw0Y8KCSAqINC/0YPRgdGC0L7QuSDRgdGH0LjRgtCw0LXQvCDQvdC+0LTRizoKCSAqICAtINGC0LXQutGB0YLQvtCy0YvQtSDRjdC7LdGC0YssINGB0L7QtNC10YDQttCw0YnQuNC1INC/0YPRgdGC0YPRjiDRgdGC0YDQvtC60YMg0LjQu9C4INGC0LXQsyBicgoJICogIC0g0YLQtdC60YHRgtC+0LLRi9C1INC90L7QtNGLINGBINC/0YPRgdGC0L7QuSDRgdGC0YDQvtC60L7QuQoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBib29sCgkgKiovCgl0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbihuKSB7CgkJaWYgKG4ubm9kZVR5cGUgPT0gMSkgewoJCQlyZXR1cm4gdGhpcy5yZWdFeHAudGV4dE5vZGVzLnRlc3Qobi5ub2RlTmFtZSkgPyAkLnRyaW0oJChuKS50ZXh0KCkpLmxlbmd0aCA9PSAwIDogZmFsc2U7CgkJfSBlbHNlIGlmIChuLm5vZGVUeXBlID09IDMpIHsKCQkJcmV0dXJuIC9eKFRBQkxFfFRIRUFEfFRGT09UfFRCT0RZfFRSfFVMfE9MfERMKSQvLnRlc3Qobi5wYXJlbnROb2RlLm5vZGVOYW1lKQoJCQkJfHwgbi5ub2RlVmFsdWUgPT0gJycKCQkJCXx8ICgkLnRyaW0obi5ub2RlVmFsdWUpLmxlbmd0aD09IDAgJiYgIShuLm5leHRTaWJsaW5nICYmIG4ucHJldmlvdXNTaWJsaW5nICYmIG4ubmV4dFNpYmxpbmcubm9kZVR5cGU9PTEgJiYgbi5wcmV2aW91c1NpYmxpbmcubm9kZVR5cGU9PTEgJiYgIXRoaXMucmVnRXhwLmJsb2NrLnRlc3Qobi5uZXh0U2libGluZy5ub2RlTmFtZSkgJiYgIXRoaXMucmVnRXhwLmJsb2NrLnRlc3Qobi5wcmV2aW91c1NpYmxpbmcubm9kZU5hbWUpICkpOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgkvKiAgICAgICAgICAgICAgICAgINCf0LXRgNC10LzQtdGJ0LXQvdC40LUg0L/QviBET00gICAgICAgICAgICAgICAgICAqLwoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCINGB0LvQtdC00YPRjtGJ0YPRjiDRgdC+0YHQtdC00L3RjtGOINC90L7QtNGDICjQvdC1INCy0LrQu9GO0YfQsNGO0YLRgdGPINGC0LXQutGB0YLQvtCy0YvQtSDQvdC+0LTRiyDQvdC1INGB0L7Qt9C00LDRjtGJ0LjQtSDQt9C90LDRh9C40LzRi9C1INC/0YDQvtCx0LXQu9GLINC80LXQttC00YMg0LjQvdC70LDQudC9INGN0LvQtdC80LXQvdGC0LDQvNC4KQoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBET01FbGVtZW50CgkgKiovCgl0aGlzLm5leHQgPSBmdW5jdGlvbihuKSB7CgkJd2hpbGUgKG4ubmV4dFNpYmxpbmcgJiYgKG4gPSBuLm5leHRTaWJsaW5nKSkgewoJCQlpZiAobi5ub2RlVHlwZSA9PSAxIHx8IChuLm5vZGVUeXBlID09IDMgJiYgIXRoaXMuaXNFbXB0eShuKSkpIHsKCQkJCXJldHVybiBuOwoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCINC/0YDQtdC00YvQtNGD0Y7RidGD0Y4g0YHQvtGB0LXQtNC90Y7RjiDQvdC+0LTRgyAo0L3QtSDQstC60LvRjtGH0LDRjtGC0YHRjyDRgtC10LrRgdGC0L7QstGL0LUg0L3QvtC00Ysg0L3QtSDRgdC+0LfQtNCw0Y7RidC40LUg0LfQvdCw0YfQuNC80YvQtSDQv9GA0L7QsdC10LvRiyDQvNC10LbQtNGDINC40L3Qu9Cw0LnQvSDRjdC70LXQvNC10L3RgtCw0LzQuCkKCSAqCgkgKiBAcGFyYW0gIERPTUVsZW1lbnQgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gRE9NRWxlbWVudAoJICoqLwoJdGhpcy5wcmV2ID0gZnVuY3Rpb24obikgewoJCXdoaWxlIChuLnByZXZpb3VzU2libGluZyAmJiAobiA9IG4ucHJldmlvdXNTaWJsaW5nKSkgewoJCQlpZiAobi5ub2RlVHlwZSA9PSAxIHx8IChuLm5vZGVUeXBlID09MyAmJiAhdGhpcy5pc0VtcHR5KG4pKSkgewoJCQkJcmV0dXJuIG47CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJdGhpcy5pc1ByZXYgPSBmdW5jdGlvbihuLCBwcmV2KSB7CgkJd2hpbGUgKChuID0gdGhpcy5wcmV2KG4pKSkgewoJCQlpZiAobiA9PSBwcmV2KSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIg0LLRgdC1INGB0LvQtdC00YPRjtGJ0LjQtSDRgdC+0YHQtdC00L3QuNC4INC90L7QtNGLICjQvdC1INCy0LrQu9GO0YfQsNGO0YLRgdGPINGC0LXQutGB0YLQvtCy0YvQtSDQvdC+0LTRiyDQvdC1INGB0L7Qt9C00LDRjtGJ0LjQtSDQt9C90LDRh9C40LzRi9C1INC/0YDQvtCx0LXQu9GLINC80LXQttC00YMg0LjQvdC70LDQudC9INGN0LvQtdC80LXQvdGC0LDQvNC4KQoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBBcnJheQoJICoqLwoJdGhpcy5uZXh0QWxsID0gZnVuY3Rpb24obikgewoJCXZhciByZXQgPSBbXTsKCQl3aGlsZSAoKG4gPSB0aGlzLm5leHQobikpKSB7CgkJCXJldC5wdXNoKG4pOwoJCX0KCQlyZXR1cm4gcmV0OwoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQstGB0LUg0L/RgNC10LTRi9C00YPRjtGJ0LjQtSDRgdC+0YHQtdC00L3QuNC4INC90L7QtNGLICjQvdC1INCy0LrQu9GO0YfQsNGO0YLRgdGPINGC0LXQutGB0YLQvtCy0YvQtSDQvdC+0LTRiyDQvdC1INGB0L7Qt9C00LDRjtGJ0LjQtSDQt9C90LDRh9C40LzRi9C1INC/0YDQvtCx0LXQu9GLINC80LXQttC00YMg0LjQvdC70LDQudC9INGN0LvQtdC80LXQvdGC0LDQvNC4KQoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBBcnJheQoJICoqLwoJdGhpcy5wcmV2QWxsID0gZnVuY3Rpb24obikgewoJCXZhciByZXQgPSBbXTsKCQl3aGlsZSAoKG4gPSB0aGlzLnByZXYobikpKSB7CgkJCXJldC5wdXNoKG4pOwoJCX0KCQlyZXR1cm4gcmV0OwoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQstGB0LUg0YHQu9C10LTRg9GO0YnQuNC1INGB0L7RgdC10LTQvdC40LggaW5saW5lINC90L7QtNGLICjQvdC1INCy0LrQu9GO0YfQsNGO0YLRgdGPINGC0LXQutGB0YLQvtCy0YvQtSDQvdC+0LTRiyDQvdC1INGB0L7Qt9C00LDRjtGJ0LjQtSDQt9C90LDRh9C40LzRi9C1INC/0YDQvtCx0LXQu9GLINC80LXQttC00YMg0LjQvdC70LDQudC9INGN0LvQtdC80LXQvdGC0LDQvNC4KQoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBBcnJheQoJICoqLwoJdGhpcy50b0xpbmVFbmQgPSBmdW5jdGlvbihuKSB7CgkJdmFyIHJldCA9IFtdOwoJCXdoaWxlICgobiA9IHRoaXMubmV4dChuKSkgJiYgbi5ub2RlTmFtZSAhPSAnQlInICYmIG4ubm9kZU5hbWUgIT0gJ0hSJyAmJiB0aGlzLmlzSW5saW5lKG4pKSB7CgkJCXJldC5wdXNoKG4pOwoJCX0KCQlyZXR1cm4gcmV0OwoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQstGB0LUg0L/RgNC10LTRi9C00YPRjtGJ0LjQtSDRgdC+0YHQtdC00L3QuNC4IGlubGluZSDQvdC+0LTRiyAo0L3QtSDQstC60LvRjtGH0LDRjtGC0YHRjyDRgtC10LrRgdGC0L7QstGL0LUg0L3QvtC00Ysg0L3QtSDRgdC+0LfQtNCw0Y7RidC40LUg0LfQvdCw0YfQuNC80YvQtSDQv9GA0L7QsdC10LvRiyDQvNC10LbQtNGDINC40L3Qu9Cw0LnQvSDRjdC70LXQvNC10L3RgtCw0LzQuCkKCSAqCgkgKiBAcGFyYW0gIERPTUVsZW1lbnQgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gQXJyYXkKCSAqKi8KCXRoaXMudG9MaW5lU3RhcnQgPSBmdW5jdGlvbihuKSB7CgkJdmFyIHJldCA9IFtdOwoJCXdoaWxlICgobiA9IHRoaXMucHJldihuKSkgJiYgbi5ub2RlTmFtZSAhPSAnQlInICYmIG4ubm9kZU5hbWUgIT0gJ0hSJyAmJiB0aGlzLmlzSW5saW5lKG4pICkgewoJCQlyZXQudW5zaGlmdChuKTsKCQl9CgkJcmV0dXJuIHJldDsKCX0KCQoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIgVFJVRSwg0LXRgdC70Lgg0L3QvtC00LAgLSDQv9C10YDQstGL0Lkg0L3QtdC/0YPRgdGC0L7QuSDRjdC7LdGCINCy0L3Rg9GC0YDQuCDRgNC+0LTQuNGC0LXQu9GPCgkgKgoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwCgkgKiBAcmV0dXJuIGJvb2wKCSAqKi8KCXRoaXMuaXNGaXJzdE5vdEVtcHR5ID0gZnVuY3Rpb24obikgewoJCXdoaWxlICgobiA9IHRoaXMucHJldihuKSkpIHsKCQkJaWYgKG4ubm9kZVR5cGUgPT0gMSB8fCAobi5ub2RlVHlwZSA9PSAzICYmICQudHJpbShuLm5vZGVWYWx1ZSkhPScnICkgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJcmV0dXJuIHRydWU7Cgl9CgkKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCIFRSVUUsINC10YHQu9C4INC90L7QtNCwIC0g0L/QvtGB0LvQtdC00L3QuNC5INC90LXQv9GD0YHRgtC+0Lkg0Y3Quy3RgiDQstC90YPRgtGA0Lgg0YDQvtC00LjRgtC10LvRjwoJICoKCSAqIEBwYXJhbSAgRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBib29sCgkgKiovCgl0aGlzLmlzTGFzdE5vdEVtcHR5ID0gZnVuY3Rpb24obikgewoJCXdoaWxlICgobiA9IHRoaXMubmV4dChuKSkpIHsKCQkJaWYgKCF0aGlzLmlzRW1wdHkobikpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCQoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIgVFJVRSwg0LXRgdC70Lgg0L3QvtC00LAgLSDQtdC00LjQvdGB0YLQstC10L3QvdGL0Lkg0L3QtdC/0YPRgdGC0L7QuSDRjdC7LdGCINCy0L3Rg9GC0YDQuCDRgNC+0LTQuNGC0LXQu9GPCgkgKgoJICogQHBhcmFtICBET01FbGVtZW50IG4gINC90L7QtNCwCgkgKiBAcmV0dXJuIGJvb2wKCSAqKi8KCXRoaXMuaXNPbmx5Tm90RW1wdHkgPSBmdW5jdGlvbihuKSB7CgkJcmV0dXJuIHRoaXMuaXNGaXJzdE5vdEVtcHR5KG4pICYmIHRoaXMuaXNMYXN0Tm90RW1wdHkobik7Cgl9CgkKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCINC/0L7RgdC70LXQtNC90LjQuSDQvdC10L/Rg9GB0YLQvtC5INC00L7Rh9C10YDQvdC40Lkg0Y3Quy3RgiDQvdC+0LTRiyDQuNC70LggRkFMU0UKCSAqCgkgKiBAcGFyYW0gIEVsZW1lbnQgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gRWxlbWVudAoJICoqLwoJdGhpcy5maW5kTGFzdE5vdEVtcHR5ID0gZnVuY3Rpb24obikgewoJCXRoaXMucnRlLmxvZygnZmluZExhc3ROb3RFbXB0eSBXaG8gaXMgaGVyZSAwX28nKTsKCQlpZiAobi5ub2RlVHlwZSA9PSAxICYmIChsID0gbi5sYXN0Q2hpbGQpKSB7CgkJCWlmICghdGhpcy5pc0VtcHR5KGwpKSB7CgkJCQlyZXR1cm4gbDsKCQkJfQoJCQl3aGlsZSAobC5wcmV2aW91c1NpYmxpbmcgJiYgKGwgPSBsLnByZXZpb3VzU2libGluZykpIHsKCQkJCWlmICghdGhpcy5pc0VtcHR5KGwpKSB7CgkJCQkJcmV0dXJuIGw7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoJCgkvKioKCSAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCIFRSVUUsINC10YHQu9C4INC90L7QtNCwICJpbmxpbmUiIAoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBib29sCgkgKiovCgl0aGlzLmlzSW5saW5lID0gZnVuY3Rpb24obikgewoJCWlmIChuLm5vZGVUeXBlID09IDMpIHsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIGlmIChuLm5vZGVUeXBlID09IDEpIHsKCQkJbiA9ICQobik7CgkJCXZhciBkID0gbi5jc3MoJ2Rpc3BsYXknKTsKCQkJdmFyIGYgPSBuLmNzcygnZmxvYXQnKTsKCQkJcmV0dXJuIGQgPT0gJ2lubGluZScgfHwgZCA9PSAnaW5saW5lLWJsb2NrJyB8fCBmID09ICdsZWZ0JyB8fCBmID09ICdyaWdodCc7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoJCgkKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCS8qICAgICAgICAgICAgICAgICAg0J/QvtC40YHQuiDRjdC70LXQvNC10L3RgtC+0LIgICAgICAgICAgICAgICAgICAgICAqLwoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJCgl0aGlzLmlzID0gZnVuY3Rpb24obiwgZikgewoJCWlmIChuICYmIG4ubm9kZU5hbWUpIHsKCQkJaWYgKHR5cGVvZihmKSA9PSAnc3RyaW5nJykgewoJCQkJZiA9IHRoaXMucmVnRXhwW2ZdfHwvLj8vOwoJCQl9CgkJCWlmIChmIGluc3RhbmNlb2YgUmVnRXhwICYmIG4ubm9kZU5hbWUpIHsKCQkJCXJldHVybiBmLnRlc3Qobi5ub2RlTmFtZSk7CgkJCX0gZWxzZSBpZiAodHlwZW9mKGYpID09ICdmdW5jdGlvbicpIHsKCQkJCXJldHVybiBmKG4pOwoJCQl9CgkJfQoJCQoJCXJldHVybiBmYWxzZTsKCX0KCQoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIg0Y3Qu9C10LzQtdC90YIo0YspINC+0YLQstC10YfQsNGO0YnQuNC1INGD0YHQu9C+0LLQuNGP0Lwg0L/QvtC40YHQutCwCgkgKgoJICogQHBhcmFtICBET01FbGVtZW50fHxBcnJheSAgbiAgICAgICDQvdC+0LTQsAoJICogQHBhcmFtICBSZWdFeHB8fFN0cmluZyAgICAgZmlsdGVyICDRhNC40LvRjNGC0YAg0YPRgdC70L7QstC40Y8g0L/QvtC40YHQutCwIChSZWdFeHAg0LjQu9C4INC40LzRjyDQutC70Y7Rh9CwIHRoaXMucmVnRXhwINC40LvQuCAqKQoJICogQHJldHVybiBET01FbGVtZW50fHxBcnJheQoJICoqLwoJdGhpcy5maWx0ZXIgPSBmdW5jdGlvbihuLCBmaWx0ZXIpIHsKCQl2YXIgcmV0ID0gW10sIGk7CgkJaWYgKCFuLnB1c2gpIHsKCQkJcmV0dXJuIHRoaXMuaXMobiwgZmlsdGVyKSA/IG4gOiBudWxsOwoJCX0KCQlmb3IgKGk9MDsgaSA8IG4ubGVuZ3RoOyBpKyspIHsKCQkJaWYgKHRoaXMuaXMobltpXSwgZmlsdGVyKSkgewoJCQkJcmV0LnB1c2gobltpXSk7CgkJCX0KCQl9OwoJCXJldHVybiByZXQ7Cgl9CgkKCQoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIg0LzQsNGB0YHQuNCyINGA0L7QtNC40YLQtdC70YzRgdC60LjRhSDRjdC70LXQvNC10L3RgtC+0LIsINC+0YLQstC10YfQsNGO0YnQuNGFINGD0YHQu9C+0LLQuNGP0Lwg0L/QvtC40YHQutCwCgkgKgoJICogQHBhcmFtICBET01FbGVtZW50ICAgICAgbiAg0L3QvtC00LAsINGA0L7QtNC40YLQtdC70LXQuSwg0LrQvtGC0L7RgNC+0Lkg0LjRidC10LwKCSAqIEBwYXJhbSAgUmVnRXhwfHxTdHJpbmcgIGZpbHRlciAgINGE0LjQu9GM0YLRgCDRg9GB0LvQvtCy0LjRjyDQv9C+0LjRgdC60LAgKFJlZ0V4cCDQuNC70Lgg0LjQvNGPINC60LvRjtGH0LAgdGhpcy5yZWdFeHAg0LjQu9C4ICopCgkgKiBAcmV0dXJuIEFycmF5CgkgKiovCgl0aGlzLnBhcmVudHMgPSBmdW5jdGlvbihuLCBmaWx0ZXIpIHsKCQl2YXIgcmV0ID0gW107CgoJCXdoaWxlIChuICYmIChuID0gbi5wYXJlbnROb2RlKSAmJiBuLm5vZGVOYW1lICE9ICdCT0RZJyAmJiBuLm5vZGVOYW1lICE9ICdIVE1MJykgewoJCQlpZiAodGhpcy5pcyhuLCBmaWx0ZXIpKSB7CgkJCQlyZXQucHVzaChuKTsKCQkJfQoJCX0KCQlyZXR1cm4gcmV0OwoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQsdC70LjQttCw0LnRiNC40Lkg0YDQvtC00LjRgtC10LvRjNGB0LrQuNC5INGN0Lst0YIsINC+0YLQstC10YfQsNGO0YnQuNC5INGD0YHQu9C+0LLQuNGP0Lwg0L/QvtC40YHQutCwCgkgKgoJICogQHBhcmFtICBET01FbGVtZW50ICAgICBuICDQvdC+0LTQsCwg0YDQvtC00LjRgtC10LvRjywg0LrQvtGC0L7RgNC+0Lkg0LjRidC10LwKCSAqIEBwYXJhbSAgUmVnRXhwfHxTdHJpbmcgZiAgINGE0LjQu9GM0YLRgCDRg9GB0LvQvtCy0LjRjyDQv9C+0LjRgdC60LAgKFJlZ0V4cCDQuNC70Lgg0LjQvNGPINC60LvRjtGH0LAgdGhpcy5yZWdFeHAg0LjQu9C4ICopCgkgKiBAcmV0dXJuIERPTUVsZW1lbnQKCSAqKi8KCXRoaXMucGFyZW50ID0gZnVuY3Rpb24obiwgZikgeyAKCQlyZXR1cm4gdGhpcy5wYXJlbnRzKG4sIGYpWzBdIHx8IG51bGw7IAoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQuNC70Lgg0YHQsNC80YMg0L3QvtC00YMg0LjQu9C4INC10LUg0LHQu9C40LbQsNC50YjQtdCz0L4g0YDQvtC00LjRgtC10LvRjywg0LXRgdC70Lgg0LLRi9C/0L7Qu9C90Y/RjtGC0YHRjyDRg9GB0LvQvtCy0LjRjyBzZiDQtNC70Y8g0YHQsNC80L7QuSDQvdC+0LTRiyDQuNC70LggcGYg0LTQu9GPINGA0L7QtNC40YLQtdC70Y8KCSAqCgkgKiBAcGFyYW0gIERPTUVsZW1lbnQgICAgIG4gINC90L7QtNCwLCDRgNC+0LTQuNGC0LXQu9GPLCDQutC+0YLQvtGA0L7QuSDQuNGJ0LXQvAoJICogQHBhcmFtICBSZWdFeHB8fFN0cmluZyBzZiAgINGE0LjQu9GM0YLRgCDRg9GB0LvQvtCy0LjRjyDQtNC70Y8g0YHQsNC80L7QuSDQvdC+0LTRiwoJKiBAcGFyYW0gIFJlZ0V4cHx8U3RyaW5nICBwZiAgINGE0LjQu9GM0YLRgCDRg9GB0LvQvtCy0LjRjyDQtNC70Y8g0YDQvtC00LjRgtC10LvRjwoJICogQHJldHVybiBET01FbGVtZW50CgkgKiovCgl0aGlzLnNlbGZPclBhcmVudCA9IGZ1bmN0aW9uKG4sIHNmLCBwZikgewoJCXJldHVybiB0aGlzLmlzKG4sIHNmKSA/IG4gOiB0aGlzLnBhcmVudChuLCBwZnx8c2YpOwoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDRgNC+0LTQuNGC0LXQu9GM0YHQutGD0Y4g0L3QvtC00YMgLSDRgdGB0YvQu9C60YMKCSAqCgkgKiBAcGFyYW0gIEVsZW1lbnQgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gRWxlbWVudAoJICoqLwoJdGhpcy5zZWxmT3JQYXJlbnRMaW5rID0gZnVuY3Rpb24obikgewoJCW4gPSB0aGlzLnNlbGZPclBhcmVudChuLCAvXkEkLyk7CgkJcmV0dXJuIG4gJiYgbi5ocmVmID8gbiA6IG51bGw7Cgl9CgoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIgVFJVRSwg0LXRgdC70Lgg0L3QvtC00LAgLSAgYW5jaG9yCgkgKgoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwCgkgKiBAcmV0dXJuIGJvb2wKCSAqKi8KCXRoaXMuc2VsZk9yUGFyZW50QW5jaG9yID0gZnVuY3Rpb24obikgewoJCW4gPSB0aGlzLnNlbGZPclBhcmVudChuLCAvXkEkLyk7CgkJcmV0dXJuIG4gJiYgIW4uaHJlZiAmJiBuLm5hbWUgPyBuIDogbnVsbDsKCX0KCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQvNCw0YHRgdC40LIg0LTQvtGH0LXRgNC90LjRhSDRgdGB0YvQu9C+0LoKCSAqCgkgKiBAcGFyYW0gIERPTUVsZW1lbnQgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gQXJyYXkKCSAqKi8KCXRoaXMuY2hpbGRMaW5rcyA9IGZ1bmN0aW9uKG4pIHsKCQl2YXIgcmVzID0gW107CgkJJCgnYVtocmVmXScsIG4pLmVhY2goZnVuY3Rpb24oKSB7IHJlcy5wdXNoKHRoaXMpOyB9KTsKCQlyZXR1cm4gcmVzOwoJfQoJCgl0aGlzLnNlbGVjdGlvbkhhcyA9IGZ1bmN0aW9uKGYpIHsKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5jbG9uZUNvbnRlbnRzKCksIGk7CgkJaWYgKG4gJiYgbi5jaGlsZE5vZGVzICYmIG4uY2hpbGROb2Rlcy5sZW5ndGgpIHsKCQkJZm9yIChpPTA7IGkgPCBuLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJCWlmICh0eXBlb2YoZikgPT0gJ2Z1bmN0aW9uJykgewoJCQkJCWlmIChmKG4uY2hpbGROb2Rlc1tpXSkpIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgUmVnRXhwKSB7CgkJCQkJaWYgKGYudGVzdChuLmNoaWxkTm9kZXNbaV0ubm9kZU5hbWUpKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfTsKCQl9CgkJCgkJcmV0dXJuIGZhbHNlOwoJfQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJLyogICAgICAgICAgICAgICAgICAgINCY0LfQvNC10L3QtdC90LjRjyBET00gICAgICAgICAgICAgICAgICAgICAqLwoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJCgkvKioKCSAqINCe0LHQvtGA0LDRh9C40LLQsNC10YIg0L7QtNC90YMg0L3QvtC00YMg0LTRgNGD0LPQvtC5CgkgKgoJICogQHBhcmFtICBET01FbGVtZW50IG4gINC+0LHQvtGA0LDRh9C40LLQsNC10LzQsNGPINC90L7QtNCwCgkgKiBAcGFyYW0gIERPTUVsZW1lbnQgdyAg0L3QvtC00LAg0L7QsdC10YDRgtC60LAg0LjQu9C4INC40LzRjyDRgtC10LPQsAoJICogQHJldHVybiBET01FbGVtZW50CgkgKiovCgl0aGlzLndyYXAgPSBmdW5jdGlvbihuLCB3KSB7CgkJbiA9ICQuaXNBcnJheShuKSA/IG4gOiBbbl07CgkJdyA9IHcubm9kZU5hbWUgPyB3IDogdGhpcy5jcmVhdGUodyk7CgkJCgkJaWYgKG5bMF0gJiYgblswXS5ub2RlVHlwZSAmJiBuWzBdLnBhcmVudE5vZGUpIHsKCQkJdyA9IG5bMF0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodywgblswXSk7CgkJCSQobikuZWFjaChmdW5jdGlvbigpIHsKCQkJCWlmICh0aGlzIT13KSB7CgkJCQkJdy5hcHBlbmRDaGlsZCh0aGlzKTsKCQkJCX0KCQkJfSk7CgkJfQoJCQoJCXJldHVybiB3OwoJfQoJCgkvKioKCSAqIFJlcGxhY2Ugbm9kZSB3aXRoIGl0cyBjb250ZW50cwoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuIG5vZGUKCSAqIEByZXR1cm4gdm9pZAoJICoqLwoJdGhpcy51bndyYXAgPSBmdW5jdGlvbihuKSB7CgkJd2hpbGUgKG4uZmlyc3RDaGlsZCkgewoJCQluLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG4uZmlyc3RDaGlsZCwgbik7CgkJfQoJCW4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTsKCX0KCQoJLyoqCgkgKiDQntCx0L7RgNCw0YfQuNCy0LDQtdGCINCy0YHQtSDRgdC+0LTQtdGA0LbQuNC80L7QtSDQvdC+0LTRiwoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvtCx0L7RgNCw0YfQuNCy0LDQtdC80LDRjyDQvdC+0LTQsAoJICogQHBhcmFtICBET01FbGVtZW50IHcgINC90L7QtNCwINC+0LHQtdGA0YLQutCwINC40LvQuCDQuNC80Y8g0YLQtdCz0LAKCSAqIEByZXR1cm4gRE9NRWxlbWVudAoJICoqLwoJdGhpcy53cmFwQ29udGVudHMgPSBmdW5jdGlvbihuLCB3KSB7CgkJdyA9IHcubm9kZU5hbWUgPyB3IDogdGhpcy5jcmVhdGUodyk7CgkJZm9yICh2YXIgaT0wOyBpIDwgbi5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CgkJCXcuYXBwZW5kQ2hpbGQobi5jaGlsZE5vZGVzW2ldKTsKCQl9OwoJCW4uYXBwZW5kQ2hpbGQodyk7CgkJcmV0dXJuIHc7Cgl9CgkKCXRoaXMuY2xlYW5Ob2RlID0gZnVuY3Rpb24obikgewoKCQlpZiAobi5ub2RlVHlwZSAhPSAxKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKC9eKFB8TEkpJC8udGVzdChuLm5vZGVOYW1lKSAmJiAobCA9IHRoaXMuZmluZExhc3ROb3RFbXB0eShuKSkgJiYgbC5ub2RlTmFtZSA9PSAnQlInKSB7CgkJCSQobCkucmVtb3ZlKCk7CgkJfQoJCSRuID0gJChuKTsKCQkkbi5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7CgkJCXRoaXMuY2xlYW5Ob2RlKHRoaXMpOwoJCX0pOwoJCWlmIChuLm5vZGVOYW1lICE9ICdCT0RZJyAmJiAhL14oVEFCTEV8VFJ8VEQpJC8udGVzdChuKSAmJiB0aGlzLmlzRW1wdHkobikpIHsKCQkJcmV0dXJuICRuLnJlbW92ZSgpOwoJCX0KCQlpZiAoJG4uYXR0cignc3R5bGUnKSA9PT0gJycpIHsKCQkJJG4ucmVtb3ZlQXR0cignc3R5bGUnKTsKCQl9CgkJaWYgKHRoaXMucnRlLmJyb3dzZXIuc2FmYXJpICYmICRuLmhhc0NsYXNzKCdBcHBsZS1zcGFuJykpIHsKCQkJJG4ucmVtb3ZlQ2xhc3MoJ0FwcGxlLXNwYW4nKTsKCQl9CgkJaWYgKG4ubm9kZU5hbWUgPT0gJ1NQQU4nICYmICEkbi5hdHRyKCdzdHlsZScpICYmICEkbi5hdHRyKCdjbGFzcycpICYmICEkbi5hdHRyKCdpZCcpKSB7CgkJCSRuLnJlcGxhY2VXaXRoKCRuLmh0bWwoKSk7CgkJfQoJfQoJCgl0aGlzLmNsZWFuQ2hpbGROb2RlcyA9IGZ1bmN0aW9uKG4pIHsKCQl2YXIgY21kID0gdGhpcy5jbGVhbk5vZGU7CgkJJChuKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7IGNtZCh0aGlzKTsgfSk7Cgl9CgkKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCS8qICAgICAgICAgICAgICAgICAgICAgICDQotCw0LHQu9C40YbRiyAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgkKCXRoaXMudGFibGVNYXRyaXggPSBmdW5jdGlvbihuKSB7CgkJdmFyIG14ID0gW107CgkJaWYgKG4gJiYgbi5ub2RlTmFtZSA9PSAnVEFCTEUnKSB7CgkJCXZhciBtYXggPSAwOwoJCQlmdW5jdGlvbiBfcG9zKHIpIHsKCQkJCWZvciAodmFyIGk9MDsgaTw9bWF4OyBpKyspIHsKCQkJCQlpZiAoIW14W3JdW2ldKSB7CgkJCQkJCXJldHVybiBpOwoJCQkJCX0KCQkJCX07CgkJCX0KCQkJCgkJCSQobikuZmluZCgndHInKS5lYWNoKGZ1bmN0aW9uKHIpIHsKCQkJCWlmICghJC5pc0FycmF5KG14W3JdKSkgewoJCQkJCW14W3JdID0gW107CgkJCQl9CgkJCQkKCQkJCSQodGhpcykuY2hpbGRyZW4oJ3RkLHRoJykuZWFjaChmdW5jdGlvbigpIHsKCQkJCQl2YXIgdyA9IHBhcnNlSW50KCQodGhpcykuYXR0cignY29sc3BhbicpfHwxKTsKCQkJCQl2YXIgaCA9IHBhcnNlSW50KCQodGhpcykuYXR0cigncm93c3BhbicpfHwxKTsKCQkJCQl2YXIgaSA9IF9wb3Mocik7CgkJCQkJZm9yICh2YXIgeT0wOyB5PGg7IHkrKykgewoJCQkJCQlmb3IgKHZhciB4PTA7IHg8dzsgeCsrKSB7CgkJCQkJCQl2YXIgX3kgPSByK3k7CgkJCQkJCQlpZiAoISQuaXNBcnJheShteFtfeV0pKSB7CgkJCQkJCQkJbXhbX3ldID0gW107CgkJCQkJCQl9CgkJCQkJCQl2YXIgZCA9IHg9PTAgJiYgeT09MCA/IHRoaXMgOiAoeT09MCA/IHggOiAiLSIpOwoJCQkJCQkJbXhbX3ldW2kreF0gPSBkOwoJCQkJCQl9CgkJCQkJfTsKCQkJCQltYXg9IE1hdGgubWF4KG1heCwgbXhbcl0ubGVuZ3RoKTsKCQkJCX0pOwoJCQl9KTsKCQl9CgkJcmV0dXJuIG14OwoJfQoJCgl0aGlzLmluZGV4ZXNPZkNlbGwgPSBmdW5jdGlvbihuLCB0Ym0pIHsKCQlmb3IgKHZhciBybnVtPTA7IHJudW0gPCB0Ym0ubGVuZ3RoOyBybnVtKyspIHsKCQkJZm9yICh2YXIgY251bT0wOyBjbnVtIDwgdGJtW3JudW1dLmxlbmd0aDsgY251bSsrKSB7CgkJCQlpZiAodGJtW3JudW1dW2NudW1dID09IG4pIHsKCQkJCQlyZXR1cm4gW3JudW0sIGNudW1dOwoJCQkJfQoJCQkJCgkJCX07CgkJfTsKCX0KCQoJdGhpcy5maXhUYWJsZSA9IGZ1bmN0aW9uKG4pIHsKCQlpZiAobiAmJiBuLm5vZGVOYW1lID09ICdUQUJMRScpIHsKCQkJdmFyIHRiID0gJChuKTsKCQkJLy90Yi5maW5kKCd0cjplbXB0eScpLnJlbW92ZSgpOwoJCQl2YXIgbXggPSB0aGlzLnRhYmxlTWF0cml4KG4pOwoJCQl2YXIgeCAgPSAwOwoJCQkkLmVhY2gobXgsIGZ1bmN0aW9uKCkgewoJCQkJeCA9IE1hdGgubWF4KHgsIHRoaXMubGVuZ3RoKTsKCQkJfSk7CgkJCWlmICh4PT0wKSB7CgkJCQlyZXR1cm4gdGIucmVtb3ZlKCk7CgkJCX0KCQkJLy8gZm9yICh2YXIgaT0wOyBpPG14Lmxlbmd0aDsgaSsrKSB7CgkJCS8vIAl0aGlzLnJ0ZS5sb2cobXhbaV0pOwoJCQkvLyB9CgkJCQoJCQlmb3IgKHZhciByPTA7IHI8bXgubGVuZ3RoOyByKyspIHsKCQkJCXZhciBsID0gbXhbcl0ubGVuZ3RoOwoJCQkJLy90aGlzLnJ0ZS5sb2cocisnIDogJytsKQoJCQkJCgkJCQlpZiAobD09MCkgewoJCQkJCS8vdGhpcy5ydGUubG9nKCdyZW1vdmU6ICcrdGIuZmluZCgndHInKS5lcShyKSkKCQkJCQl0Yi5maW5kKCd0cicpLmVxKHIpLnJlbW92ZSgpOwovLwkJCQkJdGIuZmluZCgndHInKS5lcShyKS5hcHBlbmQoJzx0ZD5yZW1vdmU8L3RkPicpCgkJCQl9IGVsc2UgaWYgKGw8eCkgewoJCQkJCXZhciBjbnQgPSB4LWw7CgkJCQkJdmFyIHJvdyA9IHRiLmZpbmQoJ3RyJykuZXEocik7CgkJCQkJZm9yIChpPTA7IGk8Y250OyBpKyspIHsKCQkJCQkJcm93LmFwcGVuZCgnPHRkPiZuYnNwOzwvdGQ+Jyk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCX0KCX0KCQoJdGhpcy50YWJsZUNvbHVtbiA9IGZ1bmN0aW9uKG4sIGV4dCwgZml4KSB7CgkJbiAgICAgID0gdGhpcy5zZWxmT3JQYXJlbnQobiwgL15URHxUSCQvKTsKCQl2YXIgdGIgPSB0aGlzLnNlbGZPclBhcmVudChuLCAvXlRBQkxFJC8pOwoJCXJldCAgICA9IFtdOwoJCWluZm8gICA9IHtvZmZzZXQgOiBbXSwgZGVsdGEgOiBbXX07CgkJaWYgKG4gJiYgdGIpIHsKCQkJZml4ICYmIHRoaXMuZml4VGFibGUodGIpOwoJCQl2YXIgbXggPSB0aGlzLnRhYmxlTWF0cml4KHRiKTsKCQkJdmFyIF9zID0gZmFsc2U7CgkJCXZhciB4OwoJCQlmb3IgKHZhciByPTA7IHI8bXgubGVuZ3RoOyByKyspIHsKCQkJCWZvciAodmFyIF94PTA7IF94PG14W3JdLmxlbmd0aDsgX3grKykgewoJCQkJCWlmIChteFtyXVtfeF0gPT0gbikgewoJCQkJCQl4ID0gX3g7CgkJCQkJCV9zID0gdHJ1ZTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKF9zKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJCgkJCS8vIHRoaXMucnRlLmxvZygnbWF0cml4Jyk7CgkJCS8vIGZvciAodmFyIGk9MDsgaTxteC5sZW5ndGg7IGkrKykgewoJCQkvLyAJdGhpcy5ydGUubG9nKG14W2ldKTsKCQkJLy8gfQoJCQlpZiAoeD49MCkgewoJCQkJZm9yKHZhciByPTA7IHI8bXgubGVuZ3RoOyByKyspIHsKCQkJCQl2YXIgdG1wID0gbXhbcl1beF18fG51bGw7CgkJCQkJaWYgKHRtcCkgewoJCQkJCQlpZiAodG1wLm5vZGVOYW1lKSB7CgkJCQkJCQlyZXQucHVzaCh0bXApOwoJCQkJCQkJaWYgKGV4dCkgewoJCQkJCQkJCWluZm8uZGVsdGEucHVzaCgwKTsKCQkJCQkJCQlpbmZvLm9mZnNldC5wdXNoKHgpOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJdmFyIGQgPSBwYXJzZUludCh0bXApOwoJCQkJCQkJaWYgKCFpc05hTihkKSAmJiBteFtyXVt4LWRdICYmIG14W3JdW3gtZF0ubm9kZU5hbWUpIHsKCQkJCQkJCQlyZXQucHVzaChteFtyXVt4LWRdKTsKCQkJCQkJCQlpZiAoZXh0KSB7CgkJCQkJCQkJCWluZm8uZGVsdGEucHVzaChkKTsKCQkJCQkJCQkJaW5mby5vZmZzZXQucHVzaCh4KTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuICFleHQgPyByZXQgOiB7Y29sdW1uIDogcmV0LCBpbmZvIDogaW5mb307Cgl9Cn0KCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgkvKioKCSAqIEBjbGFzcyBGaWx0ZXIgLSBjbGVhbiBlZGl0b3IgY29udGVudAoJICogQHBhcmFtIGVsUlRFIGVkaXRvciBpbnN0YW5jZQoJICogQGF1dGhvciBEbWl0cnkgKGRpbykgTGV2YXNob3YsIGRpb0BzdGQ0Mi5ydQoJICovCgllbFJURS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24ocnRlKSB7CgkJdmFyIHNlbGYgPSB0aGlzLAoJCQluID0gJCgnPHNwYW4vPicpLmFkZENsYXNzKCdlbHJ0ZXRlc3R1cmwnKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KVswXTsKCQkvLyBtZWRpYSByZXBsYWNlbWVudCBpbWFnZSBiYXNlIHVybAoJCXRoaXMudXJsID0gKHR5cGVvZihuLmN1cnJlbnRTdHlsZSApIT0gInVuZGVmaW5lZCIgPyBuLmN1cnJlbnRTdHlsZVsnYmFja2dyb3VuZEltYWdlJ10gOiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG4sIG51bGwpWydiYWNrZ3JvdW5kSW1hZ2UnXSkucmVwbGFjZSgvXnVybFwoKFsnIl0/KShbXHNcU10rXC8pW1xzXFNdK1wxXCkkL2ksICIkMiIpOwoJCSQobikucmVtb3ZlKCk7CgoJCXRoaXMucnRlID0gcnRlOwoJCS8vIGZsYWcgLSByZXR1cm4geGh0bWwgdGFncz8KCQl0aGlzLnhodG1sID0gL3hodG1sL2kudGVzdChydGUub3B0aW9ucy5kb2N0eXBlKTsKCQkvLyBib29sZWFuIGF0dHJpYnV0ZXMKCQl0aGlzLmJvb2xBdHRycyA9IHJ0ZS51dGlscy5tYWtlT2JqZWN0KCdjaGVja2VkLGNvbXBhY3QsZGVjbGFyZSxkZWZlcixkaXNhYmxlZCxpc21hcCxtdWx0aXBsZSxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3dyYXAscmVhZG9ubHksc2VsZWN0ZWQnLnNwbGl0KCcsJykpOwoJCS8vIHRhZyByZWdleHAKCQl0aGlzLnRhZ1JlZ0V4cCA9IC88KFwvPykoW1x3Ol0rKSgoPzpccytcdysoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKlwvPz4vZzsKCQkvLyBvcGVuZWQgdGFnIHJlZ2V4cAoJCXRoaXMub3BlblRhZ1JlZ0V4cCA9IC88KFtcdzpdKykoKD86XHMrXHcrKD86XHMqPVxzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKilccypcLz8+L2c7CgkJLy8gYXR0cmlidXRlcyByZWdleHAKCQl0aGlzLmF0dHJSZWdFeHAgPSAvKFx3KykoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W15cc10rKSk/L2c7CgkJLy8gc2NyaXB0IHRhZyByZWdleHAKCQl0aGlzLnNjcmlwdFJlZ0V4cCA9IC88c2NyaXB0KFtePl0qKT4oW1xzXFNdKj8pPFwvc2NyaXB0Pi9naTsKCQkvLyBzdHlsZSB0YWcgcmVnZXhwCgkJdGhpcy5zdHlsZVJlZ0V4cCA9IC8oPHN0eWxlKFtePl0qKT5bXHNcU10qPzxcL3N0eWxlPikvZ2k7CgkJLy8gbGluayB0YWcgcmVnZXhwCgkJdGhpcy5saW5rUmVnRXhwID0gLyg8bGluayhbXj5dKyk+KS9naTsKCQkvLyBjZGF0YSByZWdleHAKCQl0aGlzLmNkYXRhUmVnRXhwID0gLzwhXFtDREFUQVxbKFtcc1xTXSspXF1cXT4vZzsKCQkvLyBvYmplY3QgdGFnIHJlZ2V4cAoJCXRoaXMub2JqUmVnRXhwID0gLzxvYmplY3QoW14+XSopPihbXHNcU10qPyk8XC9vYmplY3Q+L2dpOwoJCS8vIGVtYmVkIHRhZyByZWdleHAKCQl0aGlzLmVtYlJlZ0V4cCA9IC88KGVtYmVkKSgoPzpccytcdysoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKj4vZ2k7CgkJLy8gcGFyYW0gdGFnIHJlZ2V4cAoJCXRoaXMucGFyYW1SZWdFeHAgPSAvPChwYXJhbSkoKD86XHMrXHcrKD86XHMqPVxzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKilccyo+L2dpOwoJCXRoaXMudmltZW9SZWdFeHAgPSAvPChpZnJhbWUpXHMrKFtePl0qc3JjXHMqPVxzKiJodHRwOlwvXC9bXiJdK3ZpbWVvXC5jb21cL1x3K1tePl0qKT4oW1xzXFNdKj8pPFwvaWZyYW1lPi9naTsKCQkvLyB5YW5kZXggbWFwcyByZWdleHAKCQl0aGlzLnlNYXBzUmVnRXhwID0gLzxkaXZccysoW14+XSppZFxzKj1ccyooJ3wiKT9ZTWFwc0lEW14+XSopPi9naTsKCQkvLyBnb29nbGUgbWFwcyByZWdleHAKCQl0aGlzLmdNYXBzUmVnRXhwID0gLzxpZnJhbWVccysoW14+XSpzcmNccyo9XHMqImh0dHA6XC9cL21hcHNcLmdvb2dsZVwuXHcrW14+XSopPihbXHNcU10qPyk8XC9pZnJhbWU+L2dpOwoJCS8vIHZpZGVvIGhvc3RpbmdzIHVybCByZWdleHAKCQl0aGlzLnZpZGVvSG9zdFJlZ0V4cCA9IC9eKGh0dHA6XC9cL1tcd1wuXSopPyh5b3V0dWJlfHZpbWVvfHJ1dHViZSkuKi9pOwoJCS8vIGVscnRlIHNlcnZpY2VzIGNsYXNzZXMgcmVnZXhwCgkJdGhpcy5zZXJ2aWNlQ2xhc3NSZWdFeHAgPSAvPChcdyspKFtePl0qY2xhc3Nccyo9XHMqIltePl0qZWxydGUtW14+XSopPlxzKig8XC9cMT4pPy9naTsKCQl0aGlzLnBhZ2VicmVha1JlZ0V4cCA9IC88KFx3KykoW14+XSpzdHlsZVxzKj1ccyoiW14+XSpwYWdlLWJyZWFrW14+XSopPlxzKig8XC9cMT4pPy9naTsKCQkKCQl0aGlzLnBiUmVnRXhwID0gbmV3IFJlZ0V4cCgnPCEtLSBwYWdlYnJlYWsgLS0+JywgJ2dpJyk7CgkJLy8gYWxsb3dlZCB0YWdzCgkJdGhpcy5hbGxvd1RhZ3MgPSBydGUub3B0aW9ucy5hbGxvd1RhZ3MubGVuZ3RoID8gcnRlLnV0aWxzLm1ha2VPYmplY3QocnRlLm9wdGlvbnMuYWxsb3dUYWdzKSA6IG51bGw7CgkJLy8gZGVuaWVkIHRhZ3MKCQl0aGlzLmRlbnlUYWdzID0gcnRlLm9wdGlvbnMuZGVueVRhZ3MubGVuZ3RoID8gcnRlLnV0aWxzLm1ha2VPYmplY3QocnRlLm9wdGlvbnMuZGVueVRhZ3MpIDogbnVsbDsKCQkvLyBkZW55IGF0dHJpYnV0ZXMKCQl0aGlzLmRlbnlBdHRyID0gcnRlLm9wdGlvbnMuZGVueUF0dHIgPyBydGUudXRpbHMubWFrZU9iamVjdChydGUub3B0aW9ucy5kZW55QXR0cikgOiBudWxsOwoJCS8vIGRlbnkgYXR0cmlidXRlcyBmb3IgcGFzdGVkIGh0bWwKCQl0aGlzLnBhc3RlRGVueUF0dHIgPSBydGUub3B0aW9ucy5wYXN0ZURlbnlBdHRyID8gcnRlLnV0aWxzLm1ha2VPYmplY3QocnRlLm9wdGlvbnMucGFzdGVEZW55QXR0cikgOiBudWxsOwoJCS8vIGZvbnQgc2l6ZXMgdG8gY29udmVydCBzaXplIGF0dHIgaW50byBjc3MgcHJvcGVydHkKCQl0aGlzLmZvbnRTaXplID0gWydtZWRpdW0nLCAneHgtc21hbGwnLCAnc21hbGwnLCAnbWVkaXVtJywnbGFyZ2UnLCd4LWxhcmdlJywneHgtbGFyZ2UnIF07CgkJLy8gZm9udCBmYW1pbGllcyByZWdleHAgdG8gZGV0ZWN0IGZhbWlseSBieSBmb250IG5hbWUKCQl0aGlzLmZvbnRGYW1pbHkgPSB7CgkJCSdzYW5zLXNlcmlmJyA6IC9eKGFyaWFsfHRhaG9tYXx2ZXJkYW5hKSQvaSwKCQkJJ3NlcmlmJyAgICAgIDogL14odGltZXN8dGltZXMgbmV3IHJvbWFuKSQvaSwKCQkJJ21vbm9zcGFjZScgIDogL15jb3VyaWVyJC9pCgkJfQoJCS8vIHNjcmlwdHMgc3RvcmFnZQoJCXRoaXMuc2NyaXB0cyA9IHt9OwoJCS8vIGNhY2hlZCBjaGFpbnMgb2YgcnVsZXMKCQl0aGlzLl9jaGFpbnMgPSB7fTsKCQkKCQkvLyBjYWNoZSBjaGFpbnMKCQkkLmVhY2godGhpcy5jaGFpbnMsIGZ1bmN0aW9uKG4pIHsKCQkJc2VsZi5fY2hhaW5zW25dID0gW107CgkJCSQuZWFjaCh0aGlzLCBmdW5jdGlvbihpLCByKSB7CgkJCQl0eXBlb2Yoc2VsZi5ydWxlc1tyXSkgPT0gJ2Z1bmN0aW9uJyAmJiBzZWxmLl9jaGFpbnNbbl0ucHVzaChzZWxmLnJ1bGVzW3JdKTsKCQkJfSk7CgkJfSk7CgoJCS8qKgoJCSAqIGZpbHRlcmluZyB0aHJvdWdoIHJlcXVpcmVkIGNoYWluCgkJICoKCQkgKiBAcGFyYW0gIFN0cmluZyAgY2hhaW4gbmFtZQoJCSAqIEBwYXJhbSAgU3RyaW5nICBodG1sLWNvZGUKCQkgKiBAcmV0dXJuIFN0cmluZwoJCSAqKi8KCQl0aGlzLnByb2NjZXNzID0gZnVuY3Rpb24oY2hhaW4sIGh0bWwpIHsKCQkJLy8gcmVtb3ZlIHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2luIGFuZCBlbmQKCQkJaHRtbCA9ICQudHJpbShodG1sKS5yZXBsYWNlKC9eXHMqKCZuYnNwOykrL2dpLCAnJykucmVwbGFjZSgvKCZuYnNwO3w8YnJbXj5dKj4pK1xzKiQvZ2ksICcnKTsKCQkJLy8gcGFzcyBodG1sIHRocm91Z2ggY2hhaW4KCQkJJC5lYWNoKHRoaXMuX2NoYWluc1tjaGFpbl18fFtdLCBmdW5jdGlvbigpIHsKCQkJCWh0bWwgPSB0aGlzLmNhbGwoc2VsZiwgaHRtbCk7CgkJCX0pOwoJCQlyZXR1cm4gaHRtbC5yZXBsYWNlKC9cdC9nLCAnICAnKS5yZXBsYWNlKC9cci9nLCAnJykucmVwbGFjZSgvXHMqXG5ccypcbisvZywgIlxuIikrJyAgJzsKCQl9CgkJCgkJLyoqCgkJICogd3JhcHBlciBmb3IgInd5c2l3eWciIGNoYWluIGZpbHRlcmluZwoJCSAqCgkJICogQHBhcmFtICBTdHJpbmcgIAoJCSAqIEByZXR1cm4gU3RyaW5nCgkJICoqLwoJCXRoaXMud3lzaXd5ZyA9IGZ1bmN0aW9uKGh0bWwpIHsKCQkJcmV0dXJuIHRoaXMucHJvY2Nlc3MoJ3d5c2l3eWcnLCBodG1sKTsKCQl9CgkJCgkJLyoqCgkJICogd3JhcHBlciBmb3IgInNvdXJjZSIgY2hhaW4gZmlsdGVyaW5nCgkJICoKCQkgKiBAcGFyYW0gIFN0cmluZyAgCgkJICogQHJldHVybiBTdHJpbmcKCQkgKiovCgkJdGhpcy5zb3VyY2UgPSBmdW5jdGlvbihodG1sKSB7CgkJCXJldHVybiB0aGlzLnByb2NjZXNzKCdzb3VyY2UnLCBodG1sKTsKCQl9CgkJCgkJLyoqCgkJICogd3JhcHBlciBmb3IgInNvdXJjZTJzb3VyY2UiIGNoYWluIGZpbHRlcmluZwoJCSAqCgkJICogQHBhcmFtICBTdHJpbmcgIAoJCSAqIEByZXR1cm4gU3RyaW5nCgkJICoqLwoJCXRoaXMuc291cmNlMnNvdXJjZSA9IGZ1bmN0aW9uKGh0bWwpIHsKCQkJcmV0dXJuIHRoaXMucHJvY2Nlc3MoJ3NvdXJjZTJzb3VyY2UnLCBodG1sKTsKCQl9CgkJCgkJLyoqCgkJICogd3JhcHBlciBmb3IgInd5c2l3eWcyd3lzaXd5ZyIgY2hhaW4gZmlsdGVyaW5nCgkJICoKCQkgKiBAcGFyYW0gIFN0cmluZyAgCgkJICogQHJldHVybiBTdHJpbmcKCQkgKiovCgkJdGhpcy53eXNpd3lnMnd5c2l3eWcgPSBmdW5jdGlvbihodG1sKSB7CgkJCXJldHVybiB0aGlzLnByb2NjZXNzKCd3eXNpd3lnMnd5c2l3eWcnLCBodG1sKTsKCQl9CgkJCgkJLyoqCgkJICogUGFyc2UgYXR0cmlidXRlcyBmcm9tIHN0cmluZyBpbnRvIG9iamVjdAoJCSAqCgkJICogQHBhcmFtICBTdHJpbmcgIHN0cmluZyBvZiBhdHRyaWJ1dGVzICAKCQkgKiBAcmV0dXJuIE9iamVjdAoJCSAqKi8KCQl0aGlzLnBhcnNlQXR0cnMgPSBmdW5jdGlvbihzKSB7CgkJCXZhciBhID0ge30sCgkJCQliID0gdGhpcy5ib29sQXR0cnMsCgkJCQltID0gcy5tYXRjaCh0aGlzLmF0dHJSZWdFeHApLAoJCQkJdCwgbiwgdjsKCgkJCW0gJiYgJC5lYWNoKG0sIGZ1bmN0aW9uKGksIHMpIHsKCQkJCXQgPSBzLnNwbGl0KCc9Jyk7CgkJCQluID0gJC50cmltKHRbMF0pLnRvTG93ZXJDYXNlKCk7CgkJCQkKCQkJCWlmICh0Lmxlbmd0aD4yKSB7CgkJCQkJdC5zaGlmdCgpOwoJCQkJCXYgPSB0LmpvaW4oJz0nKTsKCQkJCX0gZWxzZSB7CgkJCQkJdiA9IGJbbl0gfHx0WzFdfHwnJzsKCQkJCX0KCQkJCWFbbl0gPSAkLnRyaW0odikucmVwbGFjZSgvXignfCIpKC4qKShcMSkkLywgIiQyIik7CgkJCX0pOwoKCQkJYS5zdHlsZSA9IHRoaXMucnRlLnV0aWxzLnBhcnNlU3R5bGUoYS5zdHlsZSk7CgkJCWFbJ2NsYXNzJ10gPSB0aGlzLnJ0ZS51dGlscy5wYXJzZUNsYXNzKGFbJ2NsYXNzJ118fCcnKQoJCQlyZXR1cm4gYTsKCQl9CgkJCgkJLyoqCgkJICogUmVzdG9yZSBhdHRyaWJ1dGVzIHN0cmluZyBmcm9tIGhhc2gKCQkgKgoJCSAqIEBwYXJhbSAgT2JqZWN0ICBhdHRyaWJ1dGVzIGhhc2gKCQkgKiBAcmV0dXJuIFN0cmluZwoJCSAqKi8KCQl0aGlzLnNlcmlhbGl6ZUF0dHJzID0gZnVuY3Rpb24oYSwgYykgewoJCQl2YXIgcyA9IFtdLCBzZWxmID0gdGhpczsKCgkJCSQuZWFjaChhLCBmdW5jdGlvbihuLCB2KSB7CgkJCQlpZiAobj09J3N0eWxlJykgewoJCQkJCXYgPSBzZWxmLnJ0ZS51dGlscy5zZXJpYWxpemVTdHlsZSh2LCBjKTsKCQkJCX0gZWxzZSBpZiAobj09J2NsYXNzJykgewoJCQkJCXYgPSBzZWxmLnJ0ZS51dGlscy5zZXJpYWxpemVDbGFzcyh2KTsKCQkJCX0gCgkJCQl2ICYmIHMucHVzaChuKyc9IicrdisnIicpOwoJCQl9KTsKCQkJcmV0dXJuIHMuam9pbignICcpOwoJCX0KCQkKCQkvKioKCQkgKiBSZW1vdmUvcmVwbGFjZSBkZW5pZWQgYXR0cmlidXRlcy9zdHlsZSBwcm9wZXJ0aWVzCgkJICoKCQkgKiBAcGFyYW0gIE9iamVjdCAgYXR0cmlidXRlcyBoYXNoCgkJICogQHBhcmFtICBTdHJpbmcgIHRhZyBuYW1lIHRvIHdpY2ggYXR0cnMgYmVsb25ncyAKCQkgKiBAcmV0dXJuIE9iamVjdAoJCSAqKi8KCQl0aGlzLmNsZWFuQXR0cnMgPSBmdW5jdGlvbihhLCB0KSB7CgkJCXZhciBzZWxmID0gdGhpcywgcmEgPSB0aGlzLnJlcGxhY2VBdHRyczsKCgkJCS8vIHJlbW92ZSBzYWZhcmkgYW5kIG1zbyBjbGFzc2VzCgkJCSQuZWFjaChhWydjbGFzcyddLCBmdW5jdGlvbihuKSB7CgkJCQkvXihBcHBsZS1zdHlsZS1zcGFufG1zb1x3KykkL2kudGVzdChuKSAmJiBkZWxldGUgYVsnY2xhc3MnXVtuXTsKCQkJfSk7CgoJCQlmdW5jdGlvbiB2YWx1ZSh2KSB7CgkJCQlyZXR1cm4gdisoL1xkJC8udGVzdCh2KSA/ICdweCcgOiAnJyk7CgkJCX0KCgkJCSQuZWFjaChhLCBmdW5jdGlvbihuLCB2KSB7CgkJCQkvLyByZXBsYWNlIHJlcXVpcmVkIGF0dHJzIHdpdGggY3NzCgkJCQlyYVtuXSAmJiByYVtuXS5jYWxsKHNlbGYsIGEsIHQpOwoJCQkJLy8gcmVtb3ZlL2ZpeCBtc28gc3R5bGVzCgkJCQlpZiAobiA9PSAnc3R5bGUnKSB7CgkJCQkJJC5lYWNoKHYsIGZ1bmN0aW9uKHNuLCBzdikgewoJCQkJCQlzd2l0Y2ggKHNuKSB7CgkJCQkJCQljYXNlICJtc28tcGFkZGluZy1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLXBhZGRpbmctdG9wLWFsdCI6CgkJCQkJCQljYXNlICJtc28tcGFkZGluZy1yaWdodC1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLXBhZGRpbmctYm90dG9tLWFsdCI6CgkJCQkJCQljYXNlICJtc28tcGFkZGluZy1sZWZ0LWFsdCI6CgkJCQkJCQljYXNlICJtc28tbWFyZ2luLWFsdCI6CgkJCQkJCQljYXNlICJtc28tbWFyZ2luLXRvcC1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLW1hcmdpbi1yaWdodC1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLW1hcmdpbi1ib3R0b20tYWx0IjoKCQkJCQkJCWNhc2UgIm1zby1tYXJnaW4tbGVmdC1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLXRhYmxlLWxheW91dC1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLWhlaWdodCI6CgkJCQkJCQljYXNlICJtc28td2lkdGgiOgoJCQkJCQkJY2FzZSAibXNvLXZlcnRpY2FsLWFsaWduLWFsdCI6CgkJCQkJCQkJYS5zdHlsZVtzbi5yZXBsYWNlKC9ebXNvLXwtYWx0JC9nLCAnJyldID0gdmFsdWUoc3YpOwoJCQkJCQkJCWRlbGV0ZSBhLnN0eWxlW3NuXTsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICJob3Jpei1hbGlnbiI6CgkJCQkJCQkJYS5zdHlsZVsndGV4dC1hbGlnbiddID0gc3Y7CgkJCQkJCQkJZGVsZXRlIGEuc3R5bGVbc25dOwoJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCWNhc2UgInZlcnQtYWxpZ24iOgoJCQkJCQkJCWEuc3R5bGVbJ3ZlcnRpY2FsLWFsaWduJ10gPSBzdjsKCQkJCQkJCQlkZWxldGUgYS5zdHlsZVtzbl07CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAiZm9udC1jb2xvciI6CgkJCQkJCQljYXNlICJtc28tZm9yZWdyb3VuZCI6CgkJCQkJCQkJYS5zdHlsZS5jb2xvciA9IHN2OwoJCQkJCQkJCWRlbGV0ZSBhLnN0eWxlW3NuXTsKCQkJCQkJCWJyZWFrOwoKCQkJCQkJCWNhc2UgIm1zby1iYWNrZ3JvdW5kIjoKCQkJCQkJCWNhc2UgIm1zby1oaWdobGlnaHQiOgoJCQkJCQkJCWEuc3R5bGUuYmFja2dyb3VuZCA9IHN2OwoJCQkJCQkJCWRlbGV0ZSBhLnN0eWxlW3NuXTsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICJtc28tZGVmYXVsdC1oZWlnaHQiOgoJCQkJCQkJCWEuc3R5bGVbJ21pbi1oZWlnaHQnXSA9IHZhbHVlKHN2KTsKCQkJCQkJCQlkZWxldGUgYS5zdHlsZVtzbl07CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAibXNvLWRlZmF1bHQtd2lkdGgiOgoJCQkJCQkJCWEuc3R5bGVbJ21pbi13aWR0aCddID0gdmFsdWUoc3YpOwoJCQkJCQkJCWRlbGV0ZSBhLnN0eWxlW3NuXTsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICJtc28tcGFkZGluZy1iZXR3ZWVuLWFsdCI6CgkJCQkJCQkJYS5zdHlsZVsnYm9yZGVyLWNvbGxhcHNlJ10gPSAnc2VwYXJhdGUnOwoJCQkJCQkJCWEuc3R5bGVbJ2JvcmRlci1zcGFjaW5nJ10gPSB2YWx1ZShzdik7CgkJCQkJCQkJZGVsZXRlIGEuc3R5bGVbc25dOwoJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCWNhc2UgInRleHQtbGluZS10aHJvdWdoIjoKCQkJCQkJCQlpZiAoc3YubWF0Y2goLyhzaW5nbGV8ZG91YmxlKS9pKSkgewoJCQkJCQkJCQlhLnN0eWxlWyd0ZXh0LWRlY29yYXRpb24nXSA9ICdsaW5lLXRocm91Z2gnOwoJCQkJCQkJCX0KCQkJCQkJCQlkZWxldGUgYS5zdHlsZVtzbl07CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAibXNvLXplcm8taGVpZ2h0IjoKCQkJCQkJCQlpZiAoc3YgPT0gJ3llcycpIHsKCQkJCQkJCQkJYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoJCQkJCQkJCX0KCQkJCQkJCQlkZWxldGUgYS5zdHlsZVtzbl07CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAnZm9udC13ZWlnaHQnOgoJCQkJCQkJCWlmIChzdiA9PSA3MDApIHsKCQkJCQkJCQkJYS5zdHlsZVsnZm9udC13ZWlnaHQnXSA9ICdib2xkJzsKCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQlpZiAoc24ubWF0Y2goL14obXNvfGNvbHVtbnxmb250LWVtcGh8bGFuZ3xsYXlvdXR8bGluZS1icmVha3xsaXN0LWltYWdlfG5hdnxwYW5vc2V8cHVuY3R8cm93fHJ1Ynl8c2VwfHNpemV8c3JjfHRhYi18dGFibGUtYm9yZGVyfHRleHQtKD8hYWxpZ258ZGVjb3J8aW5kZW50fHRyYW5zKXx0b3AtYmFyfHZlcnNpb258dm5kfHdvcmQtYnJlYWspLykpIHsKCQkJCQkJCQkJZGVsZXRlIGEuc3R5bGVbc25dCgkJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9CgkJCX0pOwoJCQlyZXR1cm4gYTsKCQl9CgkJCgl9CgoJLy8gcnVsZXMgdG8gcmVwbGFjZSB0YWdzCgllbFJURS5wcm90b3R5cGUuZmlsdGVyLnByb3RvdHlwZS5yZXBsYWNlVGFncyA9IHsKCQliICAgICAgICAgOiB7IHRhZyA6ICdzdHJvbmcnIH0sCgkJYmlnICAgICAgIDogeyB0YWcgOiAnc3BhbicsIHN0eWxlIDogeydmb250LXNpemUnIDogJ2xhcmdlJ30gfSwKCQljZW50ZXIgICAgOiB7IHRhZyA6ICdkaXYnLCAgc3R5bGUgOiB7J3RleHQtYWxpZ24nIDogJ2NlbnRlcid9IH0sCgkJaSAgICAgICAgIDogeyB0YWcgOiAnZW0nIH0sCgkJZm9udCAgICAgIDogeyB0YWcgOiAnc3BhbicgfSwKCQlub2JyICAgICAgOiB7IHRhZyA6ICdzcGFuJywgc3R5bGUgOiB7J3doaXRlLXNwYWNlJyA6ICdub3dyYXAnfSB9LAoJCW1lbnUgICAgICA6IHsgdGFnIDogJ3VsJyB9LAoJCXBsYWludGV4dCA6IHsgdGFnIDogJ3ByZScgfSwKCQlzICAgICAgICAgOiB7IHRhZyA6ICdzdHJpa2UnIH0sCgkJc21hbGwgICAgIDogeyB0YWcgOiAnc3BhbicsIHN0eWxlIDogeydmb250LXNpemUnIDogJ3NtYWxsJ319LAoJCXUgICAgICAgICA6IHsgdGFnIDogJ3NwYW4nLCBzdHlsZSA6IHsndGV4dC1kZWNvcmF0aW9uJyA6ICd1bmRlcmxpbmUnfSB9LAoJCXhtcCAgICAgICA6IHsgdGFnIDogJ3ByZScgfQoJfQoJCgkvLyBydWxlcyB0byByZXBsYWNlIGF0dHJpYnV0ZXMKCWVsUlRFLnByb3RvdHlwZS5maWx0ZXIucHJvdG90eXBlLnJlcGxhY2VBdHRycyA9IHsKCQlhbGlnbiA6IGZ1bmN0aW9uKGEsIG4pIHsKCQkJc3dpdGNoIChuKSB7CgkJCQljYXNlICdpbWcnOgoJCQkJCWEuc3R5bGVbYS5hbGlnbi5tYXRjaCgvKGxlZnR8cmlnaHQpLykgPyAnZmxvYXQnIDogJ3ZlcnRpY2FsLWFsaWduJ10gPSBhLmFsaWduOwoJCQkJCWJyZWFrOwoJCQkJCgkJCQljYXNlICd0YWJsZSc6CgkJCQkJaWYgKGEuYWxpZ24gPT0gJ2NlbnRlcicpIHsKCQkJCQkJYS5zdHlsZVsnbWFyZ2luLWxlZnQnXSA9IGEuc3R5bGVbJ21hcmdpbi1yaWdodCddID0gJ2F1dG8nOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWEuc3R5bGVbJ2Zsb2F0J10gPSBhLmFsaWduOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkJYS5zdHlsZVsndGV4dC1hbGlnbiddID0gYS5hbGlnbjsKCQkJfQoJCQlkZWxldGUgYS5hbGlnbjsKCQl9LAoJCWJvcmRlciA6IGZ1bmN0aW9uKGEpIHsKCQkJIWEuc3R5bGVbJ2JvcmRlci13aWR0aCddICYmIChhLnN0eWxlWydib3JkZXItd2lkdGgnXSA9IChwYXJzZUludChhLmJvcmRlcil8fDEpKydweCcpOwoJCQkhYS5zdHlsZVsnYm9yZGVyLXN0eWxlJ10gJiYgKGEuc3R5bGVbJ2JvcmRlci1zdHlsZSddID0gJ3NvbGlkJyk7CgkJCWRlbGV0ZSBhLmJvcmRlcjsKCQl9LAoJCWJvcmRlcmNvbG9yIDogZnVuY3Rpb24oYSkgewoJCQkhYS5zdHlsZVsnYm9yZGVyLWNvbG9yJ10gJiYgKGEuc3R5bGVbJ2JvcmRlci1jb2xvciddID0gYS5ib3JkZXJjb2xvcik7CgkJCWRlbGV0ZSBhLmJvcmRlcmNvbG9yOwoJCX0sCgkJYmFja2dyb3VuZCA6IGZ1bmN0aW9uKGEpIHsKCQkJIWEuc3R5bGVbJ2JhY2tncm91bmQtaW1hZ2UnXSAmJiAoYS5zdHlsZVsnYmFja2dyb3VuZC1pbWFnZSddID0gJ3VybCgnK2EuYmFja2dyb3VuZCsnKScpOwoJCQlkZWxldGUgYS5iYWNrZ3JvdW5kOwoJCX0sCgkJYmdjb2xvciA6IGZ1bmN0aW9uKGEpIHsKCQkJIWEuc3R5bGVbJ2JhY2tncm91bmQtY29sb3InXSAmJiAoYS5zdHlsZVsnYmFja2dyb3VuZC1jb2xvciddID0gYS5iZ2NvbG9yKTsKCQkJZGVsZXRlIGEuYmdjb2xvcjsKCQl9LAoJCWNsZWFyIDogZnVuY3Rpb24oYSkgewoJCQlhLnN0eWxlLmNsZWFyID0gYS5jbGVhciA9PSAnYWxsJyA/ICdib3RoJyA6IGEuY2xlYXI7CgkJCWRlbGV0ZSBhLmNsZWFyOwoJCX0sCgkJY29sb3IgOiBmdW5jdGlvbihhKSB7CgkJCSFhLnN0eWxlLmNvbG9yICYmIChhLnN0eWxlLmNvbG9yID0gYS5jb2xvcik7CgkJCWRlbGV0ZSBhLmNvbG9yOwoJCX0sCgkJZmFjZSA6IGZ1bmN0aW9uKGEpIHsKCQkJdmFyIGYgPSBhLmZhY2UudG9Mb3dlckNhc2UoKTsKCQkJJC5lYWNoKHRoaXMuZm9udEZhbWlseSwgZnVuY3Rpb24obiwgcikgewoJCQkJaWYgKGYubWF0Y2gocikpIHsKCQkJCQlhLnN0eWxlWydmb250LWZhbWlseSddID0gZisnLCcrbjsKCQkJCX0KCQkJfSk7CgkJCWRlbGV0ZSBhLmZhY2U7CgkJfSwKCQloc3BhY2UgOiBmdW5jdGlvbihhLCBuKSB7CgkJCWlmIChuID09ICdpbWcnKSB7CgkJCQl2YXIgdiA9IHBhcnNlSW50KGEuaHNwYWNlKXx8MDsKCQkJCSFhLnN0eWxlWydtYXJnaW4tbGVmdCddICYmIChhLnN0eWxlWydtYXJnaW4tbGVmdCddID0gdisncHgnKTsKCQkJCSFhLnN0eWxlWydtYXJnaW4tcmlnaHQnXSAmJiAoYS5zdHlsZVsnbWFyZ2luLXJpZ2h0J10gPSB2KydweCcpCgkJCQlkZWxldGUgYS5oc3BhY2U7CgkJCX0KCQl9LAoJCXNpemUgOiBmdW5jdGlvbihhLCBuKSB7CgkJCWlmIChuICE9ICdpbnB1dCcpIHsKCQkJCWEuc3R5bGVbJ2ZvbnQtc2l6ZSddID0gdGhpcy5mb250U2l6ZVtwYXJzZUludChhLnNpemUpfHwwXXx8J21lZGl1bSc7CgkJCQlkZWxldGUgYS5zaXplOwoJCQl9CgkJfSwKCQl2YWxpZ24gOiBmdW5jdGlvbihhKSB7CgkJCWlmICghYS5zdHlsZVsndmVydGljYWwtYWxpZ24nXSkgewoJCQkJYS5zdHlsZVsndmVydGljYWwtYWxpZ24nXSA9IGEudmFsaWduOwoJCQl9CgkJCWRlbGV0ZSBhLnZhbGlnbjsKCQl9LAoJCXZzcGFjZSA6IGZ1bmN0aW9uKGEsIG4pIHsKCQkJaWYgKG4gPT0gJ2ltZycpIHsKCQkJCXZhciB2ID0gcGFyc2VJbnQoYS52c3BhY2UpfHwwOwoJCQkJIWEuc3R5bGVbJ21hcmdpbi10b3AnXSAmJiAoYS5zdHlsZVsnbWFyZ2luLXRvcCddID0gdisncHgnKTsKCQkJCSFhLnN0eWxlWydtYXJnaW4tYm90dG9tJ10gJiYgKGEuc3R5bGVbJ21hcmdpbi1ib3R0b20nXSA9IHYrJ3B4JykKCQkJCWRlbGV0ZSBhLmhzcGFjZTsKCQkJfQoJCX0KCX0KCQoJLy8gcnVsZXMgY29sbGVjdGlvbgoJZWxSVEUucHJvdG90eXBlLmZpbHRlci5wcm90b3R5cGUucnVsZXMgPSB7CgkJLyoqCgkJICogSWYgdGhpcy5ydGUub3B0aW9ucy5hbGxvd1RhZ3MgaXMgc2V0IC0gcmVtb3ZlIGFsbCBleGNlcHQgdGhpcyBvbmVzCgkJICoKCQkgKiBAcGFyYW0gU3RyaW5nICBodG1sIGNvZGUKCQkgKiBAcmV0dXJuIFN0cmluZwoJCSAqKi8KCQlhbGxvd2VkVGFncyA6IGZ1bmN0aW9uKGh0bWwpIHsKCQkJdmFyIGEgPSB0aGlzLmFsbG93VGFnczsKCQkJcmV0dXJuIGEgPyBodG1sLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsIGZ1bmN0aW9uKHQsIGMsIG4pIHsgcmV0dXJuIGFbbi50b0xvd2VyQ2FzZSgpXSA/IHQgOiAnJzsgfSkgOiBodG1sOwoJCX0sCgkJLyoqCgkJICogSWYgdGhpcy5ydGUub3B0aW9ucy5kZW55VGFncyBpcyBzZXQgLSByZW1vdmUgYWxsIGRlbnkgdGFncwoJCSAqCgkJICogQHBhcmFtIFN0cmluZyAgaHRtbCBjb2RlCgkJICogQHJldHVybiBTdHJpbmcKCQkgKiovCgkJZGVuaWVkVGFncyA6IGZ1bmN0aW9uKGh0bWwpIHsKCQkJdmFyIGQgPSB0aGlzLmRlbnlUYWdzOyAKCQkJcmV0dXJuIGQgPyBodG1sLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsIGZ1bmN0aW9uKHQsIGMsIG4pIHsgcmV0dXJuIGRbbi50b0xvd2VyQ2FzZSgpXSA/ICcnIDogdCB9KSA6IGh0bWw7CgkJfSwKCQkKCQkvKioKCQkgKiBSZXBsYWNlIG5vdCBhbGxvd2VkIHRhZ3MvYXR0cmlidXRlcwoJCSAqCgkJICogQHBhcmFtIFN0cmluZyAgaHRtbCBjb2RlCgkJICogQHJldHVybiBTdHJpbmcKCQkgKiovCgkJY2xlYW4gOiBmdW5jdGlvbihodG1sKSB7CgkJCXZhciBzZWxmID0gdGhpcywgCgkJCQlydCAgID0gdGhpcy5yZXBsYWNlVGFncywKCQkJCXJhICAgPSB0aGlzLnJlcGxhY2VBdHRycywgCgkJCQlkYSAgID0gdGhpcy5kZW55QXR0ciwKCQkJCW47CgkJCQoJCQlyZXR1cm4gaHRtbC5yZXBsYWNlKC88IURPQ1RZUEUoW1xzXFNdKik+L2dpLCAnJykKCQkJCS5yZXBsYWNlKC88cCBbXj5dKmNsYXNzPSI/TXNvSGVhZGluZyI/W14+XSo+KC4qPyk8XC9wPi9naSwgIjxwPjxzdHJvbmc+JDE8L3N0cm9uZz48L3A+IikKCQkJCS5yZXBsYWNlKC88c3BhblxzK3N0eWxlXHMqPVxzKiJccyptc28tc3BhY2VydW5ccyo6XHMqeWVzXHMqOz9ccyoiXHMqPihbXHMmbmJzcDtdKik8XC9zcGFuPi9naSwgIiQxIikKCQkJCS5yZXBsYWNlKC8oPHBbXj5dKj5ccyo8XC9wPnw8cFtePl0qXC8+KS9naSwgJzxicj4nKQoJCQkJLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsIGZ1bmN0aW9uKHQsIGMsIG4sIGEpIHsKCQkJCQluID0gbi50b0xvd2VyQ2FzZSgpOwoJCQkJCQoJCQkJCWlmIChjKSB7CgkJCQkJCXJldHVybiAnPC8nKyhydFtuXSA/IHJ0W25dLnRhZyA6IG4pKyc+JzsKCQkJCQl9CgkJCQkJCgkJCQkJLy8gY3JlYXRlIGF0dHJpYnV0ZXMgaGFzaCBhbmQgY2xlYW4gaXQKCQkJCQlhID0gc2VsZi5jbGVhbkF0dHJzKHNlbGYucGFyc2VBdHRycyhhfHwnJyksIG4pOwoJCQkJCQoJCQkJCWlmIChydFtuXSkgewoJCQkJCQlydFtuXS5zdHlsZSAmJiAkLmV4dGVuZChhLnN0eWxlLCBydFtuXS5zdHlsZSk7CgkJCQkJCW4gPSBydFtuXS50YWc7CgkJCQkJfQoJCQkJCQoJCQkJCWRhICYmICQuZWFjaChhLCBmdW5jdGlvbihuYSkgewoJCQkJCQlpZiAoZGFbbmFdKSB7CgkJCQkJCQlkZWxldGUgYVtuYV07CgkJCQkJCX0KCQkJCQl9KTsKCQkJCQlhID0gc2VsZi5zZXJpYWxpemVBdHRycyhhKTsKCQkJCQlyZXR1cm4gJzwnK24rKGE/JyAnOicnKSthKyc+JzsKCQkJCX0pOwoJCX0sCgkJCgkJLyoqCgkJICogQ2xlYW4gcGFzdGVkIGh0bWwKCQkgKgoJCSAqIEBwYXJhbSBTdHJpbmcgIGh0bWwgY29kZQoJCSAqIEByZXR1cm4gU3RyaW5nCgkJICoqLwoJCWNsZWFuUGFzdGUgOiBmdW5jdGlvbihodG1sKSB7CgkJCXZhciBzZWxmID0gdGhpcywgZCA9IHRoaXMucGFzdGVEZW55QXR0cjsKCgkJCWh0bWwgPSBodG1sCgkJCQkucmVwbGFjZSh0aGlzLnNjcmlwdFJlZ0V4cCwgJycpCgkJCQkucmVwbGFjZSh0aGlzLnN0eWxlUmVnRXhwLCAnJykKCQkJCS5yZXBsYWNlKHRoaXMubGlua1JlZ0V4cCwgJycpCgkJCQkucmVwbGFjZSh0aGlzLmNkYXRhUmVnRXhwLCAnJykKCQkJCS5yZXBsYWNlKC9cPFwhLS1bXHNcU10qPy0tXD4vZywgJycpOwoJCQkKCQkJaWYgKHRoaXMucnRlLm9wdGlvbnMucGFzdGVPbmx5VGV4dCkgewoJCQkJaHRtbCA9IGh0bWwucmVwbGFjZSh0aGlzLnRhZ1JlZ0V4cCwgZnVuY3Rpb24odCwgYywgbikgewoJCQkJCXJldHVybiAvYnIvaS50ZXN0KG4pIHx8IChjICYmIC9oWzEtNl18cHxvbHx1bHxsaXxkaXZ8YmxvY2txdW90ZXx0ci9pKSA/ICc8YnI+JyA6ICcnOwoJCQkJfSkucmVwbGFjZSgvKCZuYnNwO3w8YnJbXj5dKj4pK1xzKiQvZ2ksICcnKTsKCQkJfSBlbHNlIGlmIChkKSB7CgkJCQlodG1sID0gaHRtbC5yZXBsYWNlKHRoaXMub3BlblRhZ1JlZ0V4cCwgZnVuY3Rpb24odCwgbiwgYSkgewoJCQkJCWEgPSBzZWxmLnBhcnNlQXR0cnMoYSk7CgkJCQkJJC5lYWNoKGEsIGZ1bmN0aW9uKGFuKSB7CgkJCQkJCWlmIChkW2FuXSkgewoJCQkJCQkJZGVsZXRlIGFbYW5dOwoJCQkJCQl9CgkJCQkJfSk7CgkJCQkJYSA9IHNlbGYuc2VyaWFsaXplQXR0cnMoYSwgdHJ1ZSk7CgkJCQkJcmV0dXJuICc8JytuKyhhPycgJzonJykrYSsnPic7CgkJCQl9KTsKCQkJfQoJCQlyZXR1cm4gaHRtbDsgCgkJfSwKCQkKCQkvKioKCQkgKiBSZXBsYWNlIHNjcmlwdC9zdHlsZS9tZWRpYSBldGMgd2l0aCBwbGFjZWhvbGRlcnMKCQkgKgoJCSAqIEBwYXJhbSBTdHJpbmcgIGh0bWwgY29kZQoJCSAqIEByZXR1cm4gU3RyaW5nCgkJICoqLwoJCXJlcGxhY2UgOiBmdW5jdGlvbihodG1sKSB7CgkJCXZhciBzZWxmID0gdGhpcywgciA9IHRoaXMucnRlLm9wdGlvbnMucmVwbGFjZXx8W10sIG47CgoJCQkvLyBjdXN0b20gcmVwbGFjZXMgaWYgc2V0CgkJCWlmIChyLmxlbmd0aCkgewoJCQkJJC5lYWNoKHIsIGZ1bmN0aW9uKGksIGYpIHsKCQkJCQlpZiAodHlwZW9mKGYpID09ICdmdW5jdGlvbicpIHsKCQkJCQkJaHRtbCA9IGYuY2FsbChzZWxmLCBodG1sKTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoKCQkJLyoqCgkJCSAqIFJldHVybiBtZWRpYSByZXBsYWNlbWVudCAtIGltZyBodG1sIGNvZGUKCQkJICoKCQkJICogQHBhcmFtIE9iamVjdCAgb2JqZWN0IHRvIHN0b3JlIGluIHJlbCBhdHRyCgkJCSAqIEBwYXJhbSBTdHJpbmcgIG1lZGlhIG1pbWUtdHlwZQoJCQkgKiBAcmV0dXJuIFN0cmluZwoJCQkgKiovCgkJCWZ1bmN0aW9uIGltZyhvLCB0KSB7CgkJCQl2YXIgcyA9IHNyYygpLAoJCQkJCWMgPSBzICYmIHNlbGYudmlkZW9Ib3N0UmVnRXhwLnRlc3QocykgPyBzLnJlcGxhY2Uoc2VsZi52aWRlb0hvc3RSZWdFeHAsICIkMiIpIDogdC5yZXBsYWNlKC9eXHcrXC8oLispLywgIiQxIiksCgkJCQkJdyA9IHBhcnNlSW50KChvLm9iaiA/IG8ub2JqLndpZHRoIHx8IG8ub2JqLnN0eWxlLndpZHRoIDogMCl8fChvLmVtYmVkID8gby5lbWJlZC53aWR0aCB8fCBvLmVtYmVkLnN0eWxlLndpZHRoIDogMCkpfHwxNTAsCgkJCQkJaCA9IHBhcnNlSW50KChvLm9iaiA/IG8ub2JqLmhlaWdodCB8fCBvLm9iai5zdHlsZS5oZWlnaHQgOiAwKXx8KG8uZW1iZWQgPyBvLmVtYmVkLmhlaWdodCB8fCBvLmVtYmVkLnN0eWxlLmhlaWdodCA6IDApKXx8MTAwLAoJCQkJCWlkID0gJ21lZGlhJytNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLAoJCQkJCXN0eWxlID0nJywKCQkJCQlsOwoKCQkJCS8vIGZpbmQgbWVkaWEgc3JjCgkJCQlmdW5jdGlvbiBzcmMoKSB7CgkJCQkJaWYgKG8uZW1iZWQgJiYgby5lbWJlZC5zcmMpIHsKCQkJCQkJcmV0dXJuIG8uZW1iZWQuc3JjOwoJCQkJCX0KCQkJCQlpZiAoby5wYXJhbXMgJiYgby5wYXJhbXMubGVuZ3RoKSB7CgkJCQkJCWwgPSBvLnBhcmFtcy5sZW5ndGg7CgkJCQkJCXdoaWxlIChsLS0pIHsKCQkJCQkJCWlmIChvLnBhcmFtc1tsXS5uYW1lID09ICdzcmMnIHx8IG8ucGFyYW1zW2xdLm5hbWUgPT0gJ21vdmllJykgewoJCQkJCQkJCXJldHVybiBvLnBhcmFtc1tsXS52YWx1ZTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWlmIChvLm9iaiAmJiBvLm9iai5zdHlsZSAmJiBvLm9iai5zdHlsZVsnZmxvYXQnXSkgewoJCQkJCXN0eWxlID0gJyBzdHlsZT0iZmxvYXQ6JytvLm9iai5zdHlsZVsnZmxvYXQnXSsnIic7CgkJCQl9CgkJCQlzZWxmLnNjcmlwdHNbaWRdID0gbzsKCQkJCXJldHVybiAnPGltZyBzcmM9Iicrc2VsZi51cmwrJ3BpeGVsLmdpZiIgY2xhc3M9ImVscnRlLW1lZGlhIGVscnRlLW1lZGlhLScrYysnIGVscnRlLXByb3RlY3RlZCIgdGl0bGU9IicrKHMgPyBzZWxmLnJ0ZS51dGlscy5lbmNvZGUocykgOiAnJykrJyIgcmVsPSInK2lkKyciIHdpZHRoPSInK3crJyIgaGVpZ2h0PSInK2grJyInK3N0eWxlKyc+JzsKCQkJfQoJCQkKCQkJaHRtbCA9IGh0bWwKCQkJCS5yZXBsYWNlKHRoaXMuc3R5bGVSZWdFeHAsICI8IS0tIEVMUlRFX0NPTU1FTlQkMSAtLT4iKQoJCQkJLnJlcGxhY2UodGhpcy5saW5rUmVnRXhwLCAgIjwhLS0gRUxSVEVfQ09NTUVOVCQxLS0+IikKCQkJCS5yZXBsYWNlKHRoaXMuY2RhdGFSZWdFeHAsICI8IS0tW0NEQVRBWyQxXV0tLT4iKQoJCQkJLnJlcGxhY2UodGhpcy5zY3JpcHRSZWdFeHAsIGZ1bmN0aW9uKHQsIGEsIHMpIHsKCQkJCQl2YXIgaWQ7CgkJCQkJaWYgKHNlbGYuZGVueVRhZ3Muc2NyaXB0KSB7CgkJCQkJCXJldHVybiAnJzsKCQkJCQl9CgkJCQkJaWQgPSAnc2NyaXB0JytNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpOwoJCQkJCWEgPSBzZWxmLnBhcnNlQXR0cnMoYSk7CgkJCQkJIWEudHlwZSAmJiAoYS50eXBlID0gJ3RleHQvamF2YXNjcmlwdCcpOwoJCQkJCXNlbGYuc2NyaXB0c1tpZF0gPSAnPHNjcmlwdCAnK3NlbGYuc2VyaWFsaXplQXR0cnMoYSkrIj4iK3MrIjwvc2NyaXB0PiI7CgkJCQkJcmV0dXJuICc8IS0tIEVMUlRFX1NDUklQVDonKyhpZCkrJyAtLT4nOwoJCQkJfSkKCQkJCS5yZXBsYWNlKHRoaXMueU1hcHNSZWdFeHAsIGZ1bmN0aW9uKHQsIGEpIHsKCQkJCQlhID0gc2VsZi5wYXJzZUF0dHJzKGEpOwoJCQkJCWFbJ2NsYXNzJ11bJ2VscnRlLXlhbmRleC1tYXBzJ10gPSAnZWxydGUteWFuZGV4LW1hcHMnOwoJCQkJCWFbJ2NsYXNzJ11bJ2VscnRlLXByb3RlY3RlZCddID0gJ2VscnRlLXByb3RlY3RlZCc7CgkJCQkJcmV0dXJuICc8ZGl2ICcrc2VsZi5zZXJpYWxpemVBdHRycyhhKSsnPic7CgkJCQl9KQoJCQkJLnJlcGxhY2UodGhpcy5nTWFwc1JlZ0V4cCwgZnVuY3Rpb24odCwgYSkgewoJCQkJCXZhciBpZCA9ICdnbWFwcycrTWF0aC5yYW5kb20oKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwgdywgaDsKCQkJCQlhID0gc2VsZi5wYXJzZUF0dHJzKGEpOwoJCQkJCXcgPSBwYXJzZUludChhLndpZHRofHxhLnN0eWxlLndpZHRofHwxMDApOwoJCQkJCWggPSBwYXJzZUludChhLmhlaWdodHx8YS5zdHlsZS5oZWlnaHR8fDEwMCk7CgkJCQkJc2VsZi5zY3JpcHRzW2lkXSA9IHQ7CgkJCQkJcmV0dXJuICc8aW1nIHNyYz0iJytzZWxmLnVybCsncGl4ZWwuZ2lmIiBjbGFzcz0iZWxydGUtZ29vZ2xlLW1hcHMgZWxydGUtcHJvdGVjdGVkIiBpZD0iJytpZCsnIiBzdHlsZT0id2lkdGg6Jyt3KydweDtoZWlnaHQ6JytoKydweCI+JzsKCQkJCX0pCgkJCQkucmVwbGFjZSh0aGlzLm9ialJlZ0V4cCwgZnVuY3Rpb24odCwgYSwgYykgewoJCQkJCXZhciBtID0gYy5tYXRjaChzZWxmLmVtYlJlZ0V4cCksCgkJCQkJCW8gPSB7IG9iaiA6IHNlbGYucGFyc2VBdHRycyhhKSwgZW1iZWQgOiBtICYmIG0ubGVuZ3RoID8gc2VsZi5wYXJzZUF0dHJzKG1bMF0uc3Vic3RyaW5nKDcpKSA6IG51bGwsIHBhcmFtcyA6IFtdIH0sCgkJCQkJCWkgPSBzZWxmLnJ0ZS51dGlscy5tZWRpYUluZm8oby5lbWJlZCA/IG8uZW1iZWQudHlwZXx8JycgOiAnJywgby5vYmouY2xhc3NpZHx8JycpOwoJCQkJCQoJCQkJCWlmIChpKSB7CgkJCQkJCWlmICgobSA9IGMubWF0Y2goc2VsZi5wYXJhbVJlZ0V4cCkpKSB7CgkJCQkJCQkkLmVhY2gobSwgZnVuY3Rpb24oaSwgcCkgewoJCQkJCQkJCW8ucGFyYW1zLnB1c2goc2VsZi5wYXJzZUF0dHJzKHAuc3Vic3RyaW5nKDYpKSk7CgkJCQkJCQl9KTsKCQkJCQkJfQoJCQkJCQkhby5vYmouY2xhc3NpZCAgJiYgKG8ub2JqLmNsYXNzaWQgID0gaS5jbGFzc2lkWzBdKTsKCQkJCQkJIW8ub2JqLmNvZGViYXNlICYmIChvLm9iai5jb2RlYmFzZSA9IGkuY29kZWJhc2UpOwoJCQkJCQlvLmVtYmVkICYmICFvLmVtYmVkLnR5cGUgJiYgKG8uZW1iZWQudHlwZSA9IGkudHlwZSk7CgkJCQkJCS8vIGllIGJ1ZyB3aXRoIGVtcHR5IGF0dHJzCgkJCQkJCW8ub2JqLndpZHRoID09ICcxJyAmJiBkZWxldGUgby5vYmoud2lkdGg7CgkJCQkJCW8ub2JqLmhlaWdodCA9PSAnMScgJiYgZGVsZXRlIG8ub2JqLmhlaWdodDsKCQkJCQkJaWYgKG8uZW1iZWQpIHsKCQkJCQkJCW8uZW1iZWQud2lkdGggPT0gJzEnICYmIGRlbGV0ZSBvLmVtYmVkLndpZHRoOwoJCQkJCQkJby5lbWJlZC5oZWlnaHQgPT0gJzEnICYmIGRlbGV0ZSBvLmVtYmVkLmhlaWdodDsKCQkJCQkJfQoJCQkJCQlyZXR1cm4gaW1nKG8sIGkudHlwZSk7CgkJCQkJfQoJCQkJCXJldHVybiB0OwoJCQkJfSkKCQkJCS5yZXBsYWNlKHRoaXMuZW1iUmVnRXhwLCBmdW5jdGlvbih0LCBuLCBhKSB7CgkJCQkJdmFyIGEgPSBzZWxmLnBhcnNlQXR0cnMoYSksCgkJCQkJCWkgPSBzZWxmLnJ0ZS51dGlscy5tZWRpYUluZm8oYS50eXBlfHwnJyk7CgkJCQkJLy8gaWUgYnVnIHdpdGggZW1wdHkgYXR0cnMKCQkJCQlhLndpZHRoID09ICcxJyAmJiBkZWxldGUgYS53aWR0aDsKCQkJCQlhLmhlaWdodCA9PSAnMScgJiYgZGVsZXRlIGEuaGVpZ2h0OwoJCQkJCXJldHVybiBpID8gaW1nKHsgZW1iZWQgOiBhIH0sIGkudHlwZSkgOiB0OwoJCQkJfSkKCQkJCS5yZXBsYWNlKHRoaXMudmltZW9SZWdFeHAsIGZ1bmN0aW9uKHQsIG4sIGEpIHsKCQkJCQlhID0gc2VsZi5wYXJzZUF0dHJzKGEpOwoJCQkJCWRlbGV0ZSBhLmZyYW1lYm9yZGVyOwoJCQkJCWEud2lkdGggPT0gJzEnICYmIGRlbGV0ZSBhLndpZHRoOwoJCQkJCWEuaGVpZ2h0ID09ICcxJyAmJiBkZWxldGUgYS5oZWlnaHQ7CgkJCQkJYS50eXBlID0gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJzsKCQkJCQlyZXR1cm4gaW1nKHsgZW1iZWQgOiBhIH0sICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcpOwoJCQkJfSkKCQkJCS5yZXBsYWNlKC88XC8oZW1iZWR8cGFyYW0pPi9naSwgJycpCgkJCQkucmVwbGFjZSh0aGlzLnBiUmVnRXhwLCBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gJzxpbWcgc3JjPSInK3NlbGYudXJsKydwaXhlbC5naWYiIGNsYXNzPSJlbHJ0ZS1wcm90ZWN0ZWQgZWxydGUtcGFnZWJyZWFrIj4nOwoJCQkJfSk7CgoKCQkJbiA9ICQoJzxkaXY+JytodG1sKyc8L2Rpdj4nKTsKCQkJLy8gcmVtb3ZlIGVtcHR5IHNwYW5zIGFuZCBtZXJnZSBuZXN0ZWQgc3BhbnMKCQkJbi5maW5kKCdzcGFuOm5vdChbaWRdKTpub3QoW2NsYXNzXSknKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIHQgPSAkKHRoaXMpOwoJCQkJCgkJCQlpZiAoIXQuYXR0cignc3R5bGUnKSkgewoJCQkJCXQuY2hpbGRyZW4oKS5sZW5ndGggPyBzZWxmLnJ0ZS5kb20udW53cmFwKHRoaXMpIDogdC5yZW1vdmUoKTsKCQkJCX0KCQkJfSkuZW5kKCkuZmluZCgnc3BhbiBzcGFuOm9ubHktY2hpbGQnKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIHQgICA9ICQodGhpcyksIAoJCQkJCXAgICA9IHQucGFyZW50KCkuZXEoMCksIAoJCQkJCXRpZCA9IHQuYXR0cignaWQnKSwgCgkJCQkJcGlkID0gcC5hdHRyKCdpZCcpLCBpZCwgcywgYzsKCgkJCQlpZiAoc2VsZi5ydGUuZG9tLmlzKHRoaXMsICdvbmx5Q2hpbGQnKSAmJiAoIXRpZCB8fCAhcGlkKSkgewoJCQkJCWMgPSAkLnRyaW0ocC5hdHRyKCdjbGFzcycpKycgJyt0LmF0dHIoJ2NsYXNzJykpCgkJCQkJYyAmJiBwLmF0dHIoJ2NsYXNzJywgYyk7CgkJCQkJcyA9IHNlbGYucnRlLnV0aWxzLnNlcmlhbGl6ZVN0eWxlKCQuZXh0ZW5kKHNlbGYucnRlLnV0aWxzLnBhcnNlU3R5bGUoJCh0aGlzKS5hdHRyKCdzdHlsZScpfHwnJyksIHNlbGYucnRlLnV0aWxzLnBhcnNlU3R5bGUoJChwKS5hdHRyKCdzdHlsZScpfHwnJykpKTsKCQkJCQlzICYmIHAuYXR0cignc3R5bGUnLCBzKTsKCQkJCQlpZCA9IHRpZHx8cGlkOwoJCQkJCWlkICYmIHAuYXR0cignaWQnLCBpZCk7CgkJCQkJdGhpcy5maXJzdENoaWxkID8gJCh0aGlzLmZpcnN0Q2hpbGQpLnVud3JhcCgpIDogdC5yZW1vdmUoKTsKCQkJCX0KCQkJfSk7CgoJCQkKCgkJCWlmICghdGhpcy5ydGUub3B0aW9ucy5hbGxvd1RleHROb2RlcykgewoJCQkJLy8gd3JhcCBpbmxpbmUgbm9kZXMgd2l0aCBwCgkJCQl2YXIgZG9tID0gdGhpcy5ydGUuZG9tLAoJCQkJCW5vZGVzID0gW10sCgkJCQkJdyA9IFtdOwoJCQkJCgkJCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJCQlmb3IgKHZhciBpID0gMDsgaTxuWzBdLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJCQkJbm9kZXMucHVzaChuWzBdLmNoaWxkTm9kZXNbaV0pCgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlub2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5bMF0uY2hpbGROb2Rlcyk7CgkJCQl9CgkJCQkKCgkJCQlmdW5jdGlvbiB3cmFwKCkgewoJCQkJCWlmICh3Lmxlbmd0aCAmJiBkb20uZmlsdGVyKHcsICdub3RFbXB0eScpLmxlbmd0aCkgewoJCQkJCQlkb20ud3JhcCh3LCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJykpOwoJCQkJCX0KCQkJCQl3ID0gW107CgkJCQl9CQoJCQkJJC5lYWNoKG5vZGVzLCBmdW5jdGlvbihpLCBuKSB7CgkJCQkJaWYgKGRvbS5pcyhuLCAnYmxvY2snKSkgewoJCQkJCQl3cmFwKCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaWYgKHcubGVuZ3RoICYmIG4ucHJldmlvdXNTaWJsaW5nICE9IHdbdy5sZW5ndGgtMV0pIHsKCQkJCQkJCXdyYXAoKTsKCQkJCQkJfQoJCQkJCQl3LnB1c2gobik7CgkJCQkJfQoJCQkJfSk7CgkJCQl3cmFwKCk7CgkJCX0KCQkJCgkJCXJldHVybiBuLmh0bWwoKTsKCQl9LAoJCS8qKgoJCSAqIFJlc3RvcmUgc2NyaXB0L3N0eWxlL21lZGlhIGV0YyBmcm9tIHBsYWNlaG9sZGVycwoJCSAqCgkJICogQHBhcmFtIFN0cmluZyAgaHRtbCBjb2RlCgkJICogQHJldHVybiBTdHJpbmcKCQkgKiovCgkJcmVzdG9yZSA6IGZ1bmN0aW9uKGh0bWwpIHsKCQkJdmFyIHNlbGYgPXRoaXMsIHIgPSB0aGlzLnJ0ZS5vcHRpb25zLnJlc3RvcmV8W107CgoJCQkvLyBjdXN0b20gcmVzdG9yZSBpZiBzZXQKCQkJaWYgKHIubGVuZ3RoKSB7CgkJCQkkLmVhY2gociwgZnVuY3Rpb24oaSwgZikgewoJCQkJCWlmICh0eXBlb2YoZikgPT0gJ2Z1bmN0aW9uJykgewoJCQkJCQlodG1sID0gZi5jYWxsKHNlbGYsIGh0bWwpOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJCQoJCQlodG1sID0gaHRtbAoJCQkJLnJlcGxhY2UoL1w8XCEtLVxbQ0RBVEFcWyhbXHNcU10qPylcXVxdLS1cPi9naSwgIjwhW0NEQVRBWyQxXV0+IikKCQkJCS5yZXBsYWNlKC9cPFwhLS1ccypFTFJURV9TQ1JJUFRcOlxzKihzY3JpcHRcZCspXHMqLS1cPi9naSwgZnVuY3Rpb24odCwgbikgewoJCQkJCWlmIChzZWxmLnNjcmlwdHNbbl0pIHsKCQkJCQkJdCA9IHNlbGYuc2NyaXB0c1tuXTsKCQkJCQkJZGVsZXRlIHNlbGYuc2NyaXB0c1tuXTsKCQkJCQl9CgkJCQkJcmV0dXJuIHR8fCcnOwoJCQkJfSkKCQkJCS5yZXBsYWNlKC9cPFwhLS0gRUxSVEVfQ09NTUVOVChbXHNcU10qPykgLS1cPi9naSwgIiQxIikKCQkJCS5yZXBsYWNlKHRoaXMuc2VydmljZUNsYXNzUmVnRXhwLCBmdW5jdGlvbih0LCBuLCBhLCBlKSB7CgkJCQkJdmFyIGEgPSBzZWxmLnBhcnNlQXR0cnMoYSksIGosIG8gPSAnJzsKCQkJCQkvLyBhbGVydCh0KQoJCQkJCWlmIChhWydjbGFzcyddWydlbHJ0ZS1tZWRpYSddKSB7CgkJCQkJCS8vIGFsZXJ0KGEucmVsKQoJCQkJCQkvLyByZXR1cm4gJycKCQkJCQkJLy8gaiA9IGEucmVsID8gSlNPTi5wYXJzZShzZWxmLnJ0ZS51dGlscy5kZWNvZGUoYS5yZWwpKSA6IHt9OwoJCQkJCQlqID0gc2VsZi5zY3JpcHRzW2EucmVsXXx8e307CgkJCQkJCS8vIGFsZXJ0KGopCgkJCQkJCS8vIGogPSBhLnJlbCA/ICQucGFyc2VKU09OKHNlbGYucnRlLnV0aWxzLmRlY29kZShhLnJlbCkpIDoge307CgkJCQkJCWoucGFyYW1zICYmICQuZWFjaChqLnBhcmFtcywgZnVuY3Rpb24oaSwgcCkgewoJCQkJCQkJbyArPSAnPHBhcmFtICcrc2VsZi5zZXJpYWxpemVBdHRycyhwKSsiPlxuIjsKCQkJCQkJfSk7CgkJCQkJCWouZW1iZWQgJiYgKG8rPSc8ZW1iZWQgJytzZWxmLnNlcmlhbGl6ZUF0dHJzKGouZW1iZWQpKyI+Iik7CgkJCQkJCWoub2JqICYmIChvID0gJzxvYmplY3QgJytzZWxmLnNlcmlhbGl6ZUF0dHJzKGoub2JqKSsiPlxuIitvKyJcbjwvb2JqZWN0PlxuIik7CgkJCQkJCXJldHVybiBvfHx0OwoJCQkJCX0gZWxzZSBpZiAoYVsnY2xhc3MnXVsnZWxydGUtZ29vZ2xlLW1hcHMnXSkgewoJCQkJCQl2YXIgdCA9ICcnOwoJCQkJCQlpZiAoc2VsZi5zY3JpcHRzW2EuaWRdKSB7CgkJCQkJCQl0ID0gc2VsZi5zY3JpcHRzW2EuaWRdOwoJCQkJCQkJZGVsZXRlIHNlbGYuc2NyaXB0c1thLmlkXQoJCQkJCQl9CgkJCQkJCXJldHVybiB0OwoJCQkJCX0gZWxzZSBpZiAoYVsnY2xhc3MnXVsnZWxydGUtcGFnZWJyZWFrJ10pIHsKCQkJCQkJcmV0dXJuICc8IS0tIHBhZ2VicmVhayAtLT4nOwoJCQkJCX0KCQkJCQkkLmVhY2goYVsnY2xhc3MnXSwgZnVuY3Rpb24obikgewoJCQkJCQkvXmVscnRlLVx3Ky9pLnRlc3QobikgJiYgZGVsZXRlKGFbJ2NsYXNzJ11bbl0pOyAKCQkJCQl9KTsKCQkJCQlyZXR1cm4gJzwnK24rJyAnK3NlbGYuc2VyaWFsaXplQXR0cnMoYSkrJz4nKyhlfHwnJyk7CgoJCQkJfSk7CgkJCQoJCQlyZXR1cm4gaHRtbDsKCQl9LAoJCS8qKgoJCSAqIGNvbXBhY3Qgc3R5bGVzIGFuZCBtb3ZlIHRhZ3MgYW5kIGF0dHJpYnV0ZXMgbmFtZXMgaW4gbG93ZXIgY2FzZShmb3IgaWUmb3BlcmEpCgkJICoKCQkgKiBAcGFyYW0gU3RyaW5nICBodG1sIGNvZGUKCQkgKiByZXR1cm4gU3RyaW5nCgkJICoqLwoJCWNvbXBhY3RTdHlsZXMgOiBmdW5jdGlvbihodG1sKSB7CgkJCXZhciBzZWxmID0gdGhpczsKCgkJCXJldHVybiBodG1sLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsIGZ1bmN0aW9uKHQsIGMsIG4sIGEpIHsKCQkJCWEgPSAhYyAmJiBhID8gc2VsZi5zZXJpYWxpemVBdHRycyhzZWxmLnBhcnNlQXR0cnMoYSksIHRydWUpIDogJyc7CgkJCQlyZXR1cm4gJzwnK2Mrbi50b0xvd2VyQ2FzZSgpKyhhPycgJzonJykrYSsnPic7CgkJCX0pOwoJCX0sCgkJLyoqCgkJICogcmV0dXJuIHhodG1sIHRhZ3MKCQkgKgoJCSAqIEBwYXJhbSBTdHJpbmcgIGh0bWwgY29kZQoJCSAqIHJldHVybiBTdHJpbmcKCQkgKiovCgkJeGh0bWxUYWdzIDogZnVuY3Rpb24oaHRtbCkgewoJCQlyZXR1cm4gdGhpcy54aHRtbCA/IGh0bWwucmVwbGFjZSgvPChpbWd8aHJ8YnJ8ZW1iZWR8cGFyYW18bGluaykoW14+XSpcLyopPi9naSwgIjwkMSQyIC8+IikgOiBodG1sOwoJCX0KCX0KCQoJLyoqCgkgKiBDaGFpbnMgY29uZmlndXJhdGlvbgoJICogRGVmYXVsdCBjaGFpbnMgCgkgKiB3eXNpd3lnIC0gcHJvY2Nlc3MgaHRtbCBmcm9tIHNvdXJjZSBmb3Igd3lzaXd5ZyBlZGl0b3IgbW9kZQoJICogc291cmNlICAtIHByb2NjZXNzIGh0bWwgZnJvbSB3eXNpd3lnIGZvciBzb3VyY2UgZWRpdG9yIG1vZGUKCSAqIHBhc3RlICAgLSBjbGVhbiBwYXN0ZWQgaHRtbAoJICogd3lzaXd5ZzJ3eXNpd3lnIC0gY2ljbHljIHJ1bGUgdG8gY2xlYW4gaHRtbCBmcm9tIHd5c2l3eWcgZm9yIHd5c2l3eWcgcGFzdGUKCSAqIHNvdXJjZTJzb3VyY2UgLSBjaWNseWMgcnVsZSB0byBjbGVhbiBodG1sIGZyb20gc291cmNlIGZvciBzb3VyY2UgcGFzdGUKCSAqIGRlbmllZFRhZ3MgaXMgaW4gdGhlIGVuZCBvZiBjaGFpbiB0byBwcm90ZWN0IGdvb2dsZSBtYXBzIGlmcmFtZSBmcm9tIHJlbW92ZWQKCSAqKi8KCWVsUlRFLnByb3RvdHlwZS5maWx0ZXIucHJvdG90eXBlLmNoYWlucyA9IHsKCQl3eXNpd3lnICAgICAgICAgOiBbJ2NsZWFuJywnYWxsb3dlZFRhZ3MnLCAncmVwbGFjZScsICdkZW5pZWRUYWdzJywgJ2NvbXBhY3RTdHlsZXMnXSwKCQlzb3VyY2UgICAgICAgICAgOiBbJ2NsZWFuJywnYWxsb3dlZFRhZ3MnLCAncmVzdG9yZScsICdjb21wYWN0U3R5bGVzJywgJ3hodG1sVGFncyddLAoJCXBhc3RlICAgICAgICAgICA6IFsnY2xlYW4nLCdhbGxvd2VkVGFncycsICdjbGVhblBhc3RlJywgJ3JlcGxhY2UnLCAnZGVuaWVkVGFncycsICdjb21wYWN0U3R5bGVzJ10sCgkJd3lzaXd5ZzJ3eXNpd3lnIDogWydjbGVhbicsJ2FsbG93ZWRUYWdzJywgJ3Jlc3RvcmUnLCAncmVwbGFjZScsICdkZW5pZWRUYWdzJywgJ2NvbXBhY3RTdHlsZXMnXSwKCQlzb3VyY2Uyc291cmNlICAgOiBbJ2NsZWFuJywnYWxsb3dlZFRhZ3MnLCAncmVwbGFjZScsICdkZW5pZWRUYWdzJywgJ3Jlc3RvcmUnLCAnY29tcGFjdFN0eWxlcycsICd4aHRtbFRhZ3MnXQoJfQoJCgoJCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5oaXN0b3J5ID0gZnVuY3Rpb24ocnRlKSB7Cgl0aGlzLnJ0ZSA9IHJ0ZTsKCXRoaXMuX3ByZXYgPSBbXQoJdGhpcy5fbmV4dCA9IFtdOwoKCQoJdGhpcy5hZGQgPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5ydGUub3B0aW9ucy5oaXN0b3J5TGVuZ3RoPjAgJiYgdGhpcy5fcHJldi5sZW5ndGg+PSB0aGlzLnJ0ZS5vcHRpb25zLmhpc3RvcnlMZW5ndGgpIHsKCQkJdGhpcy5fcHJldi5zbGljZSh0aGlzLnJ0ZS5vcHRpb25zLmhpc3RvcnlMZW5ndGgpOwoJCX0KCQl2YXIgYiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXRCb29rbWFyaygpOwoJCXRoaXMuX3ByZXYucHVzaChbJCh0aGlzLnJ0ZS5kb2MuYm9keSkuaHRtbCgpLCBiXSk7CgkJdGhpcy5ydGUuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGIpOwoJCS8vIHRoaXMuX3ByZXYucHVzaCgkKHRoaXMucnRlLmRvYy5ib2R5KS5odG1sKCkpOwoJCXRoaXMuX25leHQgPSBbXTsKCX0KCQoJdGhpcy5iYWNrID0gZnVuY3Rpb24oKSB7CgkJCgkJaWYgKHRoaXMuX3ByZXYubGVuZ3RoKSB7CgkJCXZhciBiID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCksIAoJCQkJZGF0YSA9IHRoaXMuX3ByZXYucG9wKCk7CgkJCXRoaXMuX25leHQucHVzaChbJCh0aGlzLnJ0ZS5kb2MuYm9keSkuaHRtbCgpLCBiXSk7CgkJCQoJCQkkKHRoaXMucnRlLmRvYy5ib2R5KS5odG1sKGRhdGFbMF0pOwoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoZGF0YVsxXSk7CgkJfQoJfQoKCXRoaXMuZndkID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuX25leHQubGVuZ3RoKSB7CgkJCXZhciBiID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCksIAoJCQkJZGF0YSA9IHRoaXMuX25leHQucG9wKCk7CgkJCXRoaXMuX3ByZXYucHVzaChbJCh0aGlzLnJ0ZS5kb2MuYm9keSkuaHRtbCgpLCBiXSk7CgkJCQoJCQkkKHRoaXMucnRlLmRvYy5ib2R5KS5odG1sKGRhdGFbMF0pOwoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoZGF0YVsxXSk7CgkJfQoJfQoJCgl0aGlzLmNhbkJhY2sgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5fcHJldi5sZW5ndGg7Cgl9CgkKCXRoaXMuY2FuRndkID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX25leHQubGVuZ3RoOwoJfQoKfQp9KShqUXVlcnkpOy8qCiAqIGVsUlRFIGNvbmZpZ3VyYXRpb24KICoKICogQHBhcmFtIGRvY3R5cGUgICAgICAgICAtIGRvY3R5cGUgZm9yIGVkaXRvciBpZnJhbWUKICogQHBhcmFtIGNzc0NsYXNzICAgICAgICAtIGNzcyBjbGFzcyBmb3IgZWRpdG9yCiAqIEBwYXJhbSBjc3NGaWxlcyAgICAgICAgLSBhcnJheSBvZiBjc3MgZmlsZXMsIHdpdGNoIHdpbGwgaW5sdWRlIGluIGlmcmFtZQogKiBAcGFyYW0gaGVpZ2h0ICAgICAgICAgIC0gbm90IHVzZWQgbm93IChtYXkgYmUgZGVsZXRlZCBpbiBmdXR1cmUpCiAqIEBwYXJhbSBsYW5nICAgICAgICAgICAgLSBpbnRlcmZhY2UgbGFuZ3VhZ2UgKHJlcXVpcmVzIGZpbGUgaW4gaTE4biBkaXIpCiAqIEBwYXJhbSB0b29sYmFyICAgICAgICAgLSBuYW1lIG9mIHRvb2xiYXIgdG8gbG9hZAogKiBAcGFyYW0gYWJzb2x1dGVVUkxzICAgIC0gY29udmVydCBmaWxlcyBhbmQgaW1hZ2VzIHVybHMgdG8gYWJzb2x1dGUgb3Igbm90CiAqIEBwYXJhbSBhbGxvd1NvdXJjZSAgICAgLSBpcyBzb3VyY2UgZWRpdGluZyBhbGxvd2luZwogKiBAcGFyYW0gc3RyaXBXaGl0ZVNwYWNlIC0gc3RyaXAg0LvQuNGI0L3QuNC1IHdoaXRlc3BhY2VzL3RhYnMgb3Igbm90CiAqIEBwYXJhbSBzdHlsZVdpdGhDU1MgICAgLSB1c2Ugc3R5bGU9Li4uIGluc3RlYWQgb2Ygc3Ryb25nIGV0Yy4KICogQHBhcmFtIGZtQWxsb3cgICAgICAgICAtIGFsbG93IHVzaW5nIGZpbGUgbWFuZ2VyIChlbEZpbmRlcikKICogQHBhcmFtIGZtT3BlbiAgICAgICAgICAtIGNhbGxiYWNrIGZvciBvcGVuIGZpbGUgbWFuYWdlcgogKiBAcGFyYW0gYnV0dG9ucyAgICAgICAgIC0gb2JqZWN0IHdpdGggcGFpcnMgb2YgYnV0dG9ucyBjbGFzc2VzIG5hbWVzIGFuZCB0aXRsZXMgKHdoZW4gY3JlYXRlIG5ldyBidXR0b24sIHlvdSBoYXZlIHRvIGFkZCBpeXMgbmFtZSBoZXJlKQogKiBAcGFyYW0gcGFuZWxzICAgICAgICAgIC0gbmFtZWQgZ3JvdXBzIG9mIGJ1dHRvbnMKICogQHBhcmFtIHBhbmVsTmFtZXMgICAgICAtIHRpdGxlIG9mIHBhbmVscyAocmVxdWlyZWQgZm9yIG9uZSBwbGFubmVkIGZlYXR1cmUpCiAqIEBwYXJhbSB0b29sYmFycyAgICAgICAgLSBuYW1lZCByZWR5IHRvIHVzZSB0b29sYmFscyAoeW91IG1heSBjb21iaW5lIHlvdXIgb3duIHRvb2xiYXIpCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQ29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5vcHRpb25zICAgPSB7Cglkb2N0eXBlICAgICAgICAgOiAnPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+JywKCWNzc0NsYXNzICAgICAgICA6ICdlbC1ydGUnLAoJY3NzZmlsZXMgICAgICAgIDogW10sCgloZWlnaHQgICAgICAgICAgOiBudWxsLAoJcmVzaXphYmxlICAgICAgIDogdHJ1ZSwKCWxhbmcgICAgICAgICAgICA6ICdlbicsCgl0b29sYmFyICAgICAgICAgOiAnbm9ybWFsJywKCWFic29sdXRlVVJMcyAgICA6IHRydWUsCglhbGxvd1NvdXJjZSAgICAgOiB0cnVlLAoJc3RyaXBXaGl0ZVNwYWNlIDogdHJ1ZSwKCXN0eWxlV2l0aENTUyAgICA6IGZhbHNlLAoJZm1BbGxvdyAgICAgICAgIDogdHJ1ZSwKCWZtT3BlbiAgICAgICAgICA6IG51bGwsCgkvKiBpZiBzZXQgYWxsIG90aGVyIHRhZyB3aWxsIGJlIHJlbW92ZWQgKi8KCWFsbG93VGFncyA6IFtdLAoJLyogaWYgc2V0IHRoaXMgdGFncyB3aWxsIGJlIHJlbW92ZWQgKi8KCWRlbnlUYWdzIDogWydhcHBsZXQnLCAnYmFzZScsICdiYXNlZm9udCcsICdiZ3NvdW5kJywgJ2JsaW5rJywgJ2JvZHknLCAnY29sJywgJ2NvbGdyb3VwJywgJ2lmcmFtZScsICdpc2luZGV4JywgJ2ZyYW1lc2V0JywgJ2h0bWwnLCAnaGVhZCcsICdtZXRhJywgJ21hcnF1ZWUnLCAnbm9mcmFtZXMnLCAnbm9lbWJlZCcsICdvOnAnLCAndGl0bGUnLCAneG1sJ10sCglkZW55QXR0ciA6IFtdLAoJLyogb24gcGFzdGUgZXZlbnQgdGhpcyBhdHRyaWJ1dGVzIHdpbGwgcmVtb3ZlZCBmcm9tIHBhc3RlZCBodG1sICovCglwYXN0ZURlbnlBdHRyIDogWydpZCcsICduYW1lJywgJ2NsYXNzJywgJ3N0eWxlJywgJ2xhbmd1YWdlJywgJ29uY2xpY2snLCAnb25kYmxjbGljaycsICdvbmhvdmVyJywgJ29ua2V1cCcsICdvbmtleWRvd24nLCAnb25rZXlwcmVzcyddLAoJLyogSWYgZmFsc2UgLSBhbGwgdGV4dCBub2RlcyB3aWxsIGJlIHdyYXBwZWQgYnkgcGFyYWdyYXBoIHRhZyAqLwoJYWxsb3dUZXh0Tm9kZXMgOiBmYWxzZSwKCS8qIGFsbG93IGJyb3dzZXIgc3BlY2lmaWMgc3R5bGVzIGxpa2UgLW1venwtd2Via2l0fC1vICovCglhbGxvd0Jyb3dzZXJzU3BlY1N0eWxlcyA6IGZhbHNlLAoJLyogYWxsb3cgcGFzdGUgY29udGVudCBpbnRvIGVkaXRvciAqLwoJYWxsb3dQYXN0ZSA6IHRydWUsCgkvKiBpZiB0cnVlIC0gb25seSB0ZXh0IHdpbGwgYmUgcGFzdGVkIChub3QgaW4gaWUpICovCglwYXN0ZU9ubHlUZXh0IDogZmFsc2UsCgkvKiB1c2VyIHJlcGxhY2VtZW50IHJ1bGVzICovCglyZXBsYWNlIDogW10sCgkvKiB1c2VyIHJlc3RvcmUgcnVsZXMgKi8KCXJlc3RvcmUgOiBbXSwKCXBhZ2VicmVhayA6ICc8ZGl2IHN0eWxlPSJwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXM7Ij48L2Rpdj4nLCAvLyc8IS0tIHBhZ2VicmVhayAtLT4nLAoJYnV0dG9ucyAgICAgICAgIDogewoJCSdzYXZlJyAgICAgICAgICAgICAgICA6ICdTYXZlJywKCQknY29weScgICAgICAgICAgICAgICAgOiAnQ29weScsCgkJJ2N1dCcgICAgICAgICAgICAgICAgIDogJ0N1dCcsCgkJJ2NzcycgICAgICAgICAgICAgICAgIDogJ0NzcyBzdHlsZSBhbmQgY2xhc3MnLAoJCSdwYXN0ZScgICAgICAgICAgICAgICA6ICdQYXN0ZScsCgkJJ3Bhc3RldGV4dCcgICAgICAgICAgIDogJ1Bhc3RlIG9ubHkgdGV4dCcsCgkJJ3Bhc3RlZm9ybWF0dGV4dCcgICAgIDogJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JywKCQkncmVtb3ZlZm9ybWF0JyAgICAgICAgOiAnQ2xlYW4gZm9ybWF0JywgCgkJJ3VuZG8nICAgICAgICAgICAgICAgIDogJ1VuZG8gbGFzdCBhY3Rpb24nLAoJCSdyZWRvJyAgICAgICAgICAgICAgICA6ICdSZWRvIHByZXZpb3VzIGFjdGlvbicsCgkJJ2JvbGQnICAgICAgICAgICAgICAgIDogJ0JvbGQnLAoJCSdpdGFsaWMnICAgICAgICAgICAgICA6ICdJdGFsaWMnLAoJCSd1bmRlcmxpbmUnICAgICAgICAgICA6ICdVbmRlcmxpbmUnLAoJCSdzdHJpa2V0aHJvdWdoJyAgICAgICA6ICdTdHJpa2V0aHJvdWdoJywKCQknc3VwZXJzY3JpcHQnICAgICAgICAgOiAnU3VwZXJzY3JpcHQnLAoJCSdzdWJzY3JpcHQnICAgICAgICAgICA6ICdTdWJzY3JpcHQnLAoJCSdqdXN0aWZ5bGVmdCcgICAgICAgICA6ICdBbGlnbiBsZWZ0JywKCQknanVzdGlmeXJpZ2h0JyAgICAgICAgOiAnQWlsZ24gcmlnaHQnLAoJCSdqdXN0aWZ5Y2VudGVyJyAgICAgICA6ICdBbGlnbiBjZW50ZXInLAoJCSdqdXN0aWZ5ZnVsbCcgICAgICAgICA6ICdBbGlnbiBmdWxsJywKCQknaW5kZW50JyAgICAgICAgICAgICAgOiAnSW5kZW50JywKCQknb3V0ZGVudCcgICAgICAgICAgICAgOiAnT3V0ZGVudCcsCgkJJ3J0bCcgOiAnUmlnaHQgdG8gbGVmdCcsCgkJJ2x0cicgOiAnTGVmdCB0byByaWdodCcsCgkJJ2ZvcmVjb2xvcicgICAgICAgICAgIDogJ0ZvbnQgY29sb3InLAoJCSdoaWxpdGVjb2xvcicgICAgICAgICA6ICdCYWNrZ3JvdW5kIGNvbG9yJywKCQknZm9ybWF0YmxvY2snICAgICAgICAgOiAnRm9ybWF0JywKCQknZm9udHNpemUnICAgICAgICAgICAgOiAnRm9udCBzaXplJywKCQknZm9udG5hbWUnICAgICAgICAgICAgOiAnRm9udCcsCgkJJ2luc2VydG9yZGVyZWRsaXN0JyAgIDogJ09yZGVyZWQgbGlzdCcsCgkJJ2luc2VydHVub3JkZXJlZGxpc3QnIDogJ1Vub3JkZXJlZCBsaXN0JywKCQknaG9yaXpvbnRhbHJ1bGUnICAgICAgOiAnSG9yaXpvbnRhbCBydWxlJywKCQknYmxvY2txdW90ZScgICAgICAgICAgOiAnQmxvY2txdW90ZScsCgkJJ2RpdicgICAgICAgICAgICAgICAgIDogJ0Jsb2NrIGVsZW1lbnQgKERJViknLAoJCSdsaW5rJyAgICAgICAgICAgICAgICA6ICdMaW5rJywKCQkndW5saW5rJyAgICAgICAgICAgICAgOiAnRGVsZXRlIGxpbmsnLAoJCSdhbmNob3InICAgICAgICAgICAgICA6ICdCb29rbWFyaycsCgkJJ2ltYWdlJyAgICAgICAgICAgICAgIDogJ0ltYWdlJywKCQkncGFnZWJyZWFrJyAgICAgICAgICAgOiAnUGFnZSBicmVhaycsCgkJJ3NtaWxleScgICAgICAgICAgICAgIDogJ1NtaWxleScsCgkJJ2ZsYXNoJyAgICAgICAgICAgICAgIDogJ0ZsYXNoJywKCQkndGFibGUnICAgICAgICAgICAgICAgOiAnVGFibGUnLAoJCSd0YWJsZXJtJyAgICAgICAgICAgICA6ICdEZWxldGUgdGFibGUnLAoJCSd0YWJsZXByb3BzJyAgICAgICAgICA6ICdUYWJsZSBwcm9wZXJ0aWVzJywKCQkndGJjZWxscHJvcHMnICAgICAgICAgOiAnVGFibGUgY2VsbCBwcm9wZXJ0aWVzJywKCQkndGJyb3diZWZvcmUnICAgICAgICAgOiAnSW5zZXJ0IHJvdyBiZWZvcmUnLAoJCSd0YnJvd2FmdGVyJyAgICAgICAgICA6ICdJbnNlcnQgcm93IGFmdGVyJywKCQkndGJyb3dybScgICAgICAgICAgICAgOiAnRGVsZXRlIHJvdycsCgkJJ3RiY29sYmVmb3JlJyAgICAgICAgIDogJ0luc2VydCBjb2x1bW4gYmVmb3JlJywKCQkndGJjb2xhZnRlcicgICAgICAgICAgOiAnSW5zZXJ0IGNvbHVtbiBhZnRlcicsCgkJJ3RiY29scm0nICAgICAgICAgICAgIDogJ0RlbGV0ZSBjb2x1bW4nLAoJCSd0YmNlbGxzbWVyZ2UnICAgICAgICA6ICdNZXJnZSB0YWJsZSBjZWxscycsCgkJJ3RiY2VsbHNwbGl0JyAgICAgICAgIDogJ1NwbGl0IHRhYmxlIGNlbGwnLAoJCSdkb2NzdHJ1Y3R1cmUnICAgICAgICA6ICdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnLAoJCSdlbGZpbmRlcicgICAgICAgICAgICA6ICdPcGVuIGZpbGUgbWFuYWdlcicsCgkJJ2Z1bGxzY3JlZW4nICAgICAgICAgIDogJ1RvZ2dsZSBmdWxsIHNjcmVlbiBtb2RlJywKCQknbmJzcCcgICAgICAgICAgICAgICAgOiAnTm9uIGJyZWFrYWJsZSBzcGFjZScsCgkJJ3N0b3BmbG9hdCcgICAgICAgICAgIDogJ1N0b3AgZWxlbWVudCBmbG9hdGluZycsCgkJJ2Fib3V0JyAgICAgICAgICAgICAgIDogJ0Fib3V0IHRoaXMgc29mdHdhcmUnCgl9LAoJcGFuZWxzICAgICAgOiB7CgkJc2F2ZSAgICAgICA6IFsnc2F2ZSddLAoJCWNvcHlwYXN0ZSAgOiBbJ2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ3Bhc3RldGV4dCcsICdwYXN0ZWZvcm1hdHRleHQnLCAncmVtb3ZlZm9ybWF0JywgJ2RvY3N0cnVjdHVyZSddLAoJCXVuZG9yZWRvICAgOiBbJ3VuZG8nLCAncmVkbyddLAoJCXN0eWxlICAgICAgOiBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3N1YnNjcmlwdCcsICdzdXBlcnNjcmlwdCddLAoJCWNvbG9ycyAgICAgOiBbJ2ZvcmVjb2xvcicsICdoaWxpdGVjb2xvciddLAoJCWFsaWdubWVudCAgOiBbJ2p1c3RpZnlsZWZ0JywgJ2p1c3RpZnljZW50ZXInLCAnanVzdGlmeXJpZ2h0JywgJ2p1c3RpZnlmdWxsJ10sCgkJaW5kZW50ICAgICA6IFsnb3V0ZGVudCcsICdpbmRlbnQnXSwKCQlmb3JtYXQgICAgIDogWydmb3JtYXRibG9jaycsICdmb250c2l6ZScsICdmb250bmFtZSddLAoJCWxpc3RzICAgICAgOiBbJ2luc2VydG9yZGVyZWRsaXN0JywgJ2luc2VydHVub3JkZXJlZGxpc3QnXSwKCQllbGVtZW50cyAgIDogWydob3Jpem9udGFscnVsZScsICdibG9ja3F1b3RlJywgJ2RpdicsICdzdG9wZmxvYXQnLCAnY3NzJywgJ25ic3AnLCAnc21pbGV5JywgJ3BhZ2VicmVhayddLAoJCWRpcmVjdGlvbiAgOiBbJ2x0cicsICdydGwnXSwKCQlsaW5rcyAgICAgIDogWydsaW5rJywgJ3VubGluaycsICdhbmNob3InXSwKCQlpbWFnZXMgICAgIDogWydpbWFnZSddLAoJCW1lZGlhICAgICAgOiBbJ2ltYWdlJywgJ2ZsYXNoJ10sCQkKCQl0YWJsZXMgICAgIDogWyd0YWJsZScsICd0YWJsZXByb3BzJywgJ3RhYmxlcm0nLCAgJ3Ricm93YmVmb3JlJywgJ3Ricm93YWZ0ZXInLCAndGJyb3dybScsICd0YmNvbGJlZm9yZScsICd0YmNvbGFmdGVyJywgJ3RiY29scm0nLCAndGJjZWxscHJvcHMnLCAndGJjZWxsc21lcmdlJywgJ3RiY2VsbHNwbGl0J10sCgkJZWxmaW5kZXIgICA6IFsnZWxmaW5kZXInXSwKCQlmdWxsc2NyZWVuIDogWydmdWxsc2NyZWVuJywgJ2Fib3V0J10KCX0sCgl0b29sYmFycyAgICA6IHsKCQl0aW55ICAgICA6IFsnc3R5bGUnXSwKCQljb21wYWN0ICA6IFsnc2F2ZScsICd1bmRvcmVkbycsICdzdHlsZScsICdhbGlnbm1lbnQnLCAnbGlzdHMnLCAnbGlua3MnLCAnZnVsbHNjcmVlbiddLAoJCW5vcm1hbCAgIDogWydzYXZlJywgJ2NvcHlwYXN0ZScsICd1bmRvcmVkbycsICdzdHlsZScsICdhbGlnbm1lbnQnLCAnY29sb3JzJywgJ2luZGVudCcsICdsaXN0cycsICdsaW5rcycsICdlbGVtZW50cycsICdpbWFnZXMnLCAnZnVsbHNjcmVlbiddLAoJCWNvbXBsZXRlIDogWydzYXZlJywgJ2NvcHlwYXN0ZScsICd1bmRvcmVkbycsICdzdHlsZScsICdhbGlnbm1lbnQnLCAnY29sb3JzJywgJ2Zvcm1hdCcsICdpbmRlbnQnLCAnbGlzdHMnLCAnbGlua3MnLCAnZWxlbWVudHMnLCAnbWVkaWEnLCAnZnVsbHNjcmVlbiddLAoJCW1heGkgICAgIDogWydzYXZlJywgJ2NvcHlwYXN0ZScsICd1bmRvcmVkbycsICdlbGZpbmRlcicsICdzdHlsZScsICdhbGlnbm1lbnQnLCAnZGlyZWN0aW9uJywgJ2NvbG9ycycsICdmb3JtYXQnLCAnaW5kZW50JywgJ2xpc3RzJywgJ2xpbmtzJywgJ2VsZW1lbnRzJywgJ21lZGlhJywgJ3RhYmxlcycsICdmdWxsc2NyZWVuJ10sCgkJZWxkb3JhZG8gOiBbJ3NhdmUnLCAnY29weXBhc3RlJywgJ2VsZmluZGVyJywgJ3VuZG9yZWRvJywgJ3N0eWxlJywgJ2FsaWdubWVudCcsICdjb2xvcnMnLCAnZm9ybWF0JywgJ2luZGVudCcsICdsaXN0cycsICdsaW5rcycsICdlbGVtZW50cycsICdtZWRpYScsICd0YWJsZXMnLCAnZnVsbHNjcmVlbiddCgkJCgl9LAoJcGFuZWxOYW1lcyA6IHsKCQlzYXZlICAgICAgOiAnU2F2ZScsCgkJY29weXBhc3RlIDogJ0NvcHkvUGFzZScsCgkJdW5kb3JlZG8gIDogJ1VuZG8vUmVkbycsCgkJc3R5bGUgICAgIDogJ1RleHQgc3R5bGVzJywKCQljb2xvcnMgICAgOiAnQ29sb3JzJywKCQlhbGlnbm1lbnQgOiAnQWxpZ25tZW50JywKCQlpbmRlbnQgICAgOiAnSW5kZW50L091dGRlbnQnLAoJCWZvcm1hdCAgICA6ICdUZXh0IGZvcm1hdCcsCgkJbGlzdHMgICAgIDogJ0xpc3RzJywKCQllbGVtZW50cyAgOiAnTWlzYyBlbGVtZW50cycsCgkJZGlyZWN0aW9uIDogJ1NjcmlwdCBkaXJlY3Rpb24nLAoJCWxpbmtzICAgICA6ICdMaW5rcycsCgkJaW1hZ2VzICAgIDogJ0ltYWdlcycsCgkJbWVkaWEgICAgIDogJ01lZGlhJywKCQl0YWJsZXMgICAgOiAnVGFibGVzJywKCQllbGZpbmRlciAgOiAnRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknCgl9Cn07Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3Mgc2VsZWN0aW9uICAtIGVsUlRFIHV0aWxzIGZvciB3b3JraW5nIHdpdGggdGV4dCBzZWxlY3Rpb24KICoKICogQHBhcmFtICBlbFJURSAgcnRlICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKHJ0ZSkgewoJdGhpcy5ydGUgICAgICA9IHJ0ZTsKCXZhciBzZWxmICAgICAgPSB0aGlzOwoJdGhpcy53M2NSYW5nZSA9IG51bGw7Cgl2YXIgc3RhcnQsIGVuZCwgbm9kZSwgYm07CgkKCSQodGhpcy5ydGUuZG9jKQoJCS5rZXl1cChmdW5jdGlvbihlKSB7CgkJCWlmIChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5IHx8IChlLmtleUNvZGUgPj0gOCAmJiBlLmtleUNvZGUgPD0gMTMpIHx8IChlLmtleUNvZGU+PTMyICYmIGUua2V5Q29kZTw9IDQwKSB8fCBlLmtleUNvZGUgPT0gNDYgfHwgKGUua2V5Q29kZSA+PTk2ICYmIGUua2V5Q29kZSA8PSAxMTEpKSB7CgkJCQlzZWxmLmNsZWFuQ2FjaGUoKTsKCQkJfQoJCX0pCgkJLm1vdXNlZG93bihmdW5jdGlvbihlKSB7CgkJCS8vIHNlbGYucnRlLmxvZyhlKQoJCQlpZiAoZS50YXJnZXQubm9kZU5hbWUgPT0gJ0hUTUwnKSB7CgkJCQlzdGFydCA9IHNlbGYucnRlLmRvYy5ib2R5OwoJCQl9IGVsc2UgewoJCQkJc3RhcnQgPSBlLnRhcmdldDsKCQkJfQoJCQllbmQgICA9IG5vZGUgPSBudWxsOwoJCX0pCgkJLm1vdXNldXAoZnVuY3Rpb24oZSkgewoJCQlpZiAoZS50YXJnZXQubm9kZU5hbWUgPT0gJ0hUTUwnKSB7CgkJCQllbmQgPSBzZWxmLnJ0ZS5kb2MuYm9keTsKCQkJfSBlbHNlIHsKCQkJCWVuZCA9IGUudGFyZ2V0OwoJCQl9CgkJCWVuZCAgPSBlLnRhcmdldDsKCQkJbm9kZSA9IG51bGw7CgkJfSkuY2xpY2soKTsKCQkKCS8qKgoJICog0LLQvtC30LLRgNCw0YnQsNC10YIgc2VsZWN0aW9uCgkgKgoJICogQHJldHVybiAgU2VsZWN0aW9uCgkgKiovCglmdW5jdGlvbiBzZWxlY3Rpb24oKSB7CgkJcmV0dXJuIHNlbGYucnRlLndpbmRvdy5nZXRTZWxlY3Rpb24gPyBzZWxmLnJ0ZS53aW5kb3cuZ2V0U2VsZWN0aW9uKCkgOiBzZWxmLnJ0ZS53aW5kb3cuZG9jdW1lbnQuc2VsZWN0aW9uOwoJfQoJCgkvKioKCSAqINCS0YHQv9C+0LzQvtCz0LDRgtC10LvRjNC90LDRjyDRhNGD0L3QutGG0LjRjwoJICog0JLQvtC30LLRgNCw0YnQsNC10YIg0YHQsNC80L7Qs9C+INCy0LXRgNGF0L3QtdCz0L4g0YDQvtC00LjRgtC10LvRjywg0L7RgtCy0LXRh9Cw0Y7RidC10LPQviDRg9GB0LvQvtCy0LjRjiAtINGC0LXQutGD0YnQsNGPINC90L7QtNCwIC0g0LXQs9C+INC10LTQuNC90YHRgtCy0LXQvdC90LDRjyDQvdC10L/Rg9GB0YLQsNGPINC00L7Rh9C10YDQvdGP0Y8g0L3QvtC00LAKCSAqCgkgKiBAcGFyYW0gICBET01FbGVtZW50ICBuINC90L7QtNCwLCDQtNC70Y8g0LrQvtGC0L7RgNC+0Lkg0LjRidC10Lwg0YDQvtC00LjRgtC10LvRjwoJICogQHBhcmFtICAgRE9NRWxlbWVudCAgcCDQtdGB0LvQuCDQt9Cw0LTQsNC90LAgLSDQvdC+0LTQsCwg0LLRi9GI0LUg0LrQvtGC0L7RgNC+0Lkg0L3QtSDQv9C+0LTQvdC40LzQsNC10LzRgdGPCgkgKiBAcGFyYW0gICBTdHJpbmcgICAgICBzINGB0YLRgNC+0L3QsCDQv9C+0LjRgdC60LAgKGxlZnR8fHJpZ2h0fHxudWxsKQoJICogQHJldHVybiAgRE9NRWxlbWVudAoJICoqLwoJZnVuY3Rpb24gcmVhbFNlbGVjdGVkKG4sIHAsIHMpIHsKCQl3aGlsZSAobi5ub2RlTmFtZSAhPSAnQk9EWScgJiYgbi5wYXJlbnROb2RlICYmIG4ucGFyZW50Tm9kZS5ub2RlTmFtZSAhPSAnQk9EWScgJiYgKHAgPyBuIT09IHAgJiYgbi5wYXJlbnROb2RlICE9IHAgOiAxKSAmJiAoKHM9PSdsZWZ0JyAmJiBzZWxmLnJ0ZS5kb20uaXNGaXJzdE5vdEVtcHR5KG4pKSB8fCAocz09J3JpZ2h0JyAmJiBzZWxmLnJ0ZS5kb20uaXNMYXN0Tm90RW1wdHkobikpIHx8IChzZWxmLnJ0ZS5kb20uaXNGaXJzdE5vdEVtcHR5KG4pICYmIHNlbGYucnRlLmRvbS5pc0xhc3ROb3RFbXB0eShuKSkpICkgewoJCQluID0gbi5wYXJlbnROb2RlOwoJCX0KCQlyZXR1cm4gbjsKCX0KCQoJLyoqCgkgKiDQktC+0LfQstGA0LDRidCw0LXRgiBUUlVFLCDQtdGB0LvQuCDQstGL0LTQtdC70LXQvdC40LUgItGB0YXQu9C+0L/QvdGD0YLQviIKCSAqCgkgKiBAcmV0dXJuICBib29sCgkgKiovCgl0aGlzLmNvbGxhcHNlZCA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmdldFJhbmdlQXQoKS5pc0NvbGxhcHNlZCgpOwoJfQoJCgkvKioKCSAqICLQodGF0LvQvtC/0YvQstCw0LXRgiIg0LLRi9C00LXQu9C10L3QuNC1IAoJICoKCSAqIEBwYXJhbSAgIGJvb2wgIHRvU3RhcnQgINGB0YXQu9C+0L/QvdGD0YLRjCDQuiDQvdCw0YfQsNC70YzQvdC+0Lkg0YLQvtGH0LrQtQoJICogQHJldHVybiAgdm9pZAoJICoqLwoJdGhpcy5jb2xsYXBzZSA9IGZ1bmN0aW9uKHN0KSB7CgkJdmFyIHMgPSBzZWxlY3Rpb24oKSwKCQkJciA9IHRoaXMuZ2V0UmFuZ2VBdCgpOwoJCXIuY29sbGFwc2Uoc3Q/dHJ1ZTpmYWxzZSk7CgkJaWYgKCEkLmJyb3dzZXIubXNpZSkgewoJCQlzLnJlbW92ZUFsbFJhbmdlcygpOwoJCQlzLmFkZFJhbmdlKHIpOwoJCQkKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9CgkKCS8qKgoJICog0JLQvtC30LLRgNCw0YnQsNC10YIgVGV4dFJhbmdlCgkgKiDQlNC70Y8g0L3QvtGA0LzQsNC70YzQvdGL0YUg0LHRgNCw0YPQt9C10YDQvtCyIC0g0L3QsNGC0LjQstC90YvQuSByYW5nZQoJICog0LTQu9GPICLRgdCw0LzQuNC30L3QsNC10YLQtdGH0LXQs9C+IiAtINGN0LzRg9C70Y/RhtC40Y4gdzNjIHJhbmdlCgkgKgoJICogQHJldHVybiAgcmFuZ2V8dzNjUmFuZ2UKCSAqKi8KCXRoaXMuZ2V0UmFuZ2VBdCA9IGZ1bmN0aW9uKHVwZGF0ZVczY1JhbmdlKSB7CgkJaWYgKHRoaXMucnRlLmJyb3dzZXIubXNpZSkgewoJCQlpZiAoIXRoaXMudzNjUmFuZ2UpIHsKCQkJCXRoaXMudzNjUmFuZ2UgPSBuZXcgdGhpcy5ydGUudzNjUmFuZ2UodGhpcy5ydGUpOwoJCQl9CgkJCXVwZGF0ZVczY1JhbmdlICYmIHRoaXMudzNjUmFuZ2UudXBkYXRlKCk7CgkJCXJldHVybiB0aGlzLnczY1JhbmdlOwoJCX0KCQkKCQl2YXIgcyA9IHNlbGVjdGlvbigpOwoJCXZhciByID0gcy5yYW5nZUNvdW50ID4gMCA/IHMuZ2V0UmFuZ2VBdCgwKSA6IHRoaXMucnRlLmRvYy5jcmVhdGVSYW5nZSgpOwoJCXIuZ2V0U3RhcnQgPSBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHRoaXMuc3RhcnRDb250YWluZXIubm9kZVR5cGU9PTEgCgkJCQk/IHRoaXMuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tNYXRoLm1pbih0aGlzLnN0YXJ0T2Zmc2V0LCB0aGlzLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoLTEpXSAKCQkJCTogdGhpcy5zdGFydENvbnRhaW5lcjsKCQl9CgkJCgkJci5nZXRFbmQgPSBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHRoaXMuZW5kQ29udGFpbmVyLm5vZGVUeXBlPT0xIAoJCQkJPyB0aGlzLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzWyBNYXRoLm1pbih0aGlzLnN0YXJ0T2Zmc2V0ID09IHRoaXMuZW5kT2Zmc2V0ID8gdGhpcy5lbmRPZmZzZXQgOiB0aGlzLmVuZE9mZnNldC0xLCB0aGlzLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aC0xKV0gCgkJCQk6IHRoaXMuZW5kQ29udGFpbmVyOwoJCX0KCQlyLmlzQ29sbGFwc2VkID0gZnVuY3Rpb24oKSB7CgkJCXJldHVybiB0aGlzLmNvbGxhcHNlZDsKCQl9CgkJcmV0dXJuIHI7Cgl9CgkKCXRoaXMuc2F2ZUlFUmFuZ2UgPSBmdW5jdGlvbigpIHsKCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJYm0gPSB0aGlzLmdldFJhbmdlQXQoKS5nZXRCb29rbWFyaygpOwoJCX0KCX0KCQoJdGhpcy5yZXN0b3JlSUVSYW5nZSA9IGZ1bmN0aW9uKCkgewoJCSQuYnJvd3Nlci5tc2llICYmIGJtICYmIHRoaXMuZ2V0UmFuZ2VBdCgpLm1vdmVUb0Jvb2ttYXJrKGJtKTsKCX0KCQoJdGhpcy5jbG9uZUNvbnRlbnRzID0gZnVuY3Rpb24oKSB7CgkJdmFyIG4gPSB0aGlzLnJ0ZS5kb20uY3JlYXRlKCdkaXYnKSwgciwgYywgaTsKCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJdHJ5IHsgCgkJCQlyID0gdGhpcy5ydGUud2luZG93LmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOyAKCQkJfSBjYXRjaChlKSB7IAoJCQkJciA9IHRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOyAKCQkJfQoJCQkkKG4pLmh0bWwoci5odG1sVGV4dCk7CgkJfSBlbHNlIHsKCQkJYyA9IHRoaXMuZ2V0UmFuZ2VBdCgpLmNsb25lQ29udGVudHMoKTsKCQkJZm9yIChpPTA7IGk8Yy5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CgkJCQluLmFwcGVuZENoaWxkKGMuY2hpbGROb2Rlc1tpXS5jbG9uZU5vZGUodHJ1ZSkpOwoJCQl9CgkJfQoJCXJldHVybiBuOwoJfQoJCgkvKioKCSAqINCS0YvQtNC10LvRj9C10YIg0L3QvtC00YsKCSAqCgkgKiBAcGFyYW0gICBET01Ob2RlICBzICDQvdC+0LTQsCDQvdCw0YfQsNC70LAg0LLRi9C00LXQu9C10L3QuNGPCgkgKiBAcGFyYW0gICBET01Ob2RlICBlICDQvdC+0LTQsCDQutC+0L3RhtCwINCy0YvQtNC10LvQtdC90LjRjwoJICogQHJldHVybiAgc2VsZWN0aW9uCgkgKiovCgl0aGlzLnNlbGVjdCA9IGZ1bmN0aW9uKHMsIGUpIHsKCQllID0gZXx8czsKCQkKCQlpZiAodGhpcy5ydGUuYnJvd3Nlci5tc2llKSB7CgkJCXZhciByICA9IHRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpLAoJCQkJcjEgPSByLmR1cGxpY2F0ZSgpLAoJCQkJcjIgPSByLmR1cGxpY2F0ZSgpOwoJCQkKCQkJcjEubW92ZVRvRWxlbWVudFRleHQocyk7CgkJCXIyLm1vdmVUb0VsZW1lbnRUZXh0KGUpOwoJCQlyLnNldEVuZFBvaW50KCdTdGFydFRvU3RhcnQnLCByMSk7CgkJCXIuc2V0RW5kUG9pbnQoJ0VuZFRvRW5kJywgICAgIHIyKTsKCQkJci5zZWxlY3QoKTsKCQl9IGVsc2UgewoJCQkKCQkJdmFyIHNlbCA9IHNlbGVjdGlvbigpLAoJCQkJciA9IHRoaXMuZ2V0UmFuZ2VBdCgpOwoJCQlyLnNldFN0YXJ0QmVmb3JlKHMpOwoJCQlyLnNldEVuZEFmdGVyKGUpOwoJCQlzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CgkJCXNlbC5hZGRSYW5nZShyKTsKCQl9CgkJcmV0dXJuIHRoaXMuY2xlYW5DYWNoZSgpOwoJfQoJCgkvKioKCSAqINCS0YvQtNC10LvRj9C10YIg0YHQvtC00LXRgNC20LjQvNC+0LUg0L3QvtC00YsKCSAqCgkgKiBAcGFyYW0gICBFbGVtZW50ICBuICDQvdC+0LTQsAoJICogQHJldHVybiAgc2VsZWN0aW9uCgkgKiovCgl0aGlzLnNlbGVjdENvbnRlbnRzID0gZnVuY3Rpb24obikgewoJCXZhciByID0gdGhpcy5nZXRSYW5nZUF0KCk7CgkJaWYgKG4gJiYgbi5ub2RlVHlwZSA9PSAxKSB7CgkJCWlmICh0aGlzLnJ0ZS5icm93c2VyLm1zaWUpIHsKCQkJCXIucmFuZ2UoKTsKCQkJCXIuci5tb3ZlVG9FbGVtZW50VGV4dChuLnBhcmVudE5vZGUpOwoJCQkJci5yLnNlbGVjdCgpOwoJCQl9IGVsc2UgewoJCQkJdHJ5IHsKCQkJCQlyLnNlbGVjdE5vZGVDb250ZW50cyhuKTsKCQkJCX0gY2F0Y2ggKGUpIHsKCQkJCQlyZXR1cm4gdGhpcy5ydGUubG9nKCd1bmFibGUgc2VsZWN0IG5vZGUgY29udGVudHMgJytuKTsKCQkJCX0KCQkJCXZhciBzID0gc2VsZWN0aW9uKCk7CgkJCQlzLnJlbW92ZUFsbFJhbmdlcygpOwoJCQkJcy5hZGRSYW5nZShyKTsKCQkJfQoJCX0KCQlyZXR1cm4gdGhpczsKCX0KCQoJdGhpcy5kZWxldGVDb250ZW50cyA9IGZ1bmN0aW9uKCkgewoJCWlmICghJC5icm93c2VyLm1zaWUpIHsKCQkJdGhpcy5nZXRSYW5nZUF0KCkuZGVsZXRlQ29udGVudHMoKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9CgkKCS8qKgoJICog0JLRgdGC0LDQstC70Y/QtdGCINC90L7QtNGDINCyINGC0LXQutGD0YnQtdC1INCy0YvQtNC10LvQtdC90LjQtQoJICoKCSAqIEBwYXJhbSAgIEVsZW1lbnQgIG4gINC90L7QtNCwCgkgKiBAcmV0dXJuICBzZWxlY3Rpb24KCSAqKi8KCXRoaXMuaW5zZXJ0Tm9kZSA9IGZ1bmN0aW9uKG4sIGNvbGxhcHNlKSB7CgkJaWYgKGNvbGxhcHNlICYmICF0aGlzLmNvbGxhcHNlZCgpKSB7CgkJCXRoaXMuY29sbGFwc2UoKTsKCQl9CgoJCWlmICh0aGlzLnJ0ZS5icm93c2VyLm1zaWUpIHsKCQkJdmFyIGh0bWwgPSBuLm5vZGVUeXBlID09IDMgPyBuLm5vZGVWYWx1ZSA6ICQodGhpcy5ydGUuZG9tLmNyZWF0ZSgnc3BhbicpKS5hcHBlbmQoJChuKSkuaHRtbCgpOwoJCQkgdmFyIHIgPSB0aGlzLmdldFJhbmdlQXQoKTsKCQkJci5pbnNlcnROb2RlKGh0bWwpOwoJCX0gZWxzZSB7CgkJCXZhciByID0gdGhpcy5nZXRSYW5nZUF0KCk7CgkJCXIuaW5zZXJ0Tm9kZShuKTsKCQkJci5zZXRTdGFydEFmdGVyKG4pOwoJCQlyLnNldEVuZEFmdGVyKG4pOwoJCQl2YXIgcyA9IHNlbGVjdGlvbigpOwoJCQlzLnJlbW92ZUFsbFJhbmdlcygpOwoJCQlzLmFkZFJhbmdlKHIpOwoJCX0KCQlyZXR1cm4gdGhpcy5jbGVhbkNhY2hlKCk7Cgl9CgoJLyoqCgkgKiDQktGB0YLQsNCy0LvRj9C10YIgaHRtbCDQsiDRgtC10LrRg9GJ0LXQtSDQstGL0LTQtdC70LXQvdC40LUKCSAqCgkgKiBAcGFyYW0gICBFbGVtZW50ICBuICDQvdC+0LTQsAoJICogQHJldHVybiAgc2VsZWN0aW9uCgkgKiovCgl0aGlzLmluc2VydEh0bWwgPSBmdW5jdGlvbihodG1sLCBjb2xsYXBzZSkgewoJCWlmIChjb2xsYXBzZSAmJiAhdGhpcy5jb2xsYXBzZWQoKSkgewoJCQl0aGlzLmNvbGxhcHNlKCk7CgkJfQoJCQoJCWlmICh0aGlzLnJ0ZS5icm93c2VyLm1zaWUpIHsKCQkJdGhpcy5nZXRSYW5nZUF0KCkucmFuZ2UoKS5wYXN0ZUhUTUwoaHRtbCk7CgkJfSBlbHNlIHsKCQkJdmFyIG4gPSAkKHRoaXMucnRlLmRvbS5jcmVhdGUoJ3NwYW4nKSkuaHRtbChodG1sfHwnJykuZ2V0KDApOwoJCQl0aGlzLmluc2VydE5vZGUobik7CgkJCSQobikucmVwbGFjZVdpdGgoJChuKS5odG1sKCkpOwoJCX0KCQlyZXR1cm4gdGhpcy5jbGVhbkNhY2hlKCk7Cgl9CgoJLyoqCgkgKiDQktGB0YLQsNCy0LvRj9C10YIg0L3QvtC00YMg0LIg0YLQtdC60YPRidC10LUg0LLRi9C00LXQu9C10L3QuNC1CgkgKgoJICogQHBhcmFtICAgRWxlbWVudCAgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gIHNlbGVjdGlvbgoJICoqLwoJdGhpcy5pbnNlcnRUZXh0ID0gZnVuY3Rpb24odGV4dCwgY29sbGFwc2UpIHsKCQl2YXIgbiA9IHRoaXMucnRlLmRvYy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTsKCQlyZXR1cm4gdGhpcy5pbnNlcnRIdG1sKG4ubm9kZVZhbHVlKTsKCX0KCgl0aGlzLmdldEJvb2ttYXJrID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5ydGUud2luZG93LmZvY3VzKCk7CgkJdmFyIHIsIHIxLCByMiwgX3MsIF9lLAoJCQlzID0gdGhpcy5ydGUuZG9tLmNyZWF0ZUJvb2ttYXJrKCksCgkJCWUgPSB0aGlzLnJ0ZS5kb20uY3JlYXRlQm9va21hcmsoKTsKCQkJCgkJCgkJCgkJaWYgKCQuYnJvd3Nlci5tc2llKSB7CgkJCXRyeSB7IAoJCQkJciA9IHRoaXMucnRlLndpbmRvdy5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsgCgkJCX0gY2F0Y2goZSkgeyAKCQkJCXIgPSB0aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsgCgkJCX0KCQkJCgkJCWlmIChyLml0ZW0pIHsKCQkJCXZhciBuID0gci5pdGVtKDApOwoJCQkJciA9IHRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOwoJCQkJci5tb3ZlVG9FbGVtZW50VGV4dChuKTsKCQkJfQoJCQkKCQkJcjEgPSByLmR1cGxpY2F0ZSgpOwoJCQlyMiA9IHIuZHVwbGljYXRlKCk7CgkJCV9zID0gdGhpcy5ydGUuZG9tLmNyZWF0ZSgnc3BhbicpOwoJCQlfZSA9IHRoaXMucnRlLmRvbS5jcmVhdGUoJ3NwYW4nKTsKCgkJCV9zLmFwcGVuZENoaWxkKHMpOwoJCQlfZS5hcHBlbmRDaGlsZChlKTsKCgkJCXIxLmNvbGxhcHNlKHRydWUpOwoJCQlyMS5wYXN0ZUhUTUwoX3MuaW5uZXJIVE1MKTsKCQkJcjIuY29sbGFwc2UoZmFsc2UpOwoJCQlyMi5wYXN0ZUhUTUwoX2UuaW5uZXJIVE1MKTsKCQl9IGVsc2UgewoJCQkJdmFyIHNlbCA9IHNlbGVjdGlvbigpOwoJCQkJdmFyIHIgPSBzZWwucmFuZ2VDb3VudCA+IDAgPyBzZWwuZ2V0UmFuZ2VBdCgwKSA6IHRoaXMucnRlLmRvYy5jcmVhdGVSYW5nZSgpOwoJCQkJCgkJCS8vIHIgID0gdGhpcy5nZXRSYW5nZUF0KCk7CgkJCXIxID0gci5jbG9uZVJhbmdlKCk7CgkJCXIyID0gci5jbG9uZVJhbmdlKCk7CgkJCQoJCQkvLyB0aGlzLmluc2VydE5vZGUodGhpcy5ydGUuZG9tLmNyZWF0ZSgnaHInKSkKCQkJLy8gcmV0dXJuCgkJCXIyLmNvbGxhcHNlKGZhbHNlKTsKCQkJcjIuaW5zZXJ0Tm9kZShlKTsKCQkJcjEuY29sbGFwc2UodHJ1ZSk7CgkJCXIxLmluc2VydE5vZGUocyk7CgkJCXRoaXMuc2VsZWN0KHMsIGUpOwoJCX0KCQkKCQlyZXR1cm4gW3MuaWQsIGUuaWRdOwoJfQoKCXRoaXMubW92ZVRvQm9va21hcmsgPSBmdW5jdGlvbihiKSB7CgkJdGhpcy5ydGUud2luZG93LmZvY3VzKCk7CgkJCgkJaWYgKGIgJiYgYi5sZW5ndGg9PTIpIHsKCQkJdmFyIHMgPSB0aGlzLnJ0ZS5kb2MuZ2V0RWxlbWVudEJ5SWQoYlswXSksCgkJCQllID0gdGhpcy5ydGUuZG9jLmdldEVsZW1lbnRCeUlkKGJbMV0pLAoJCQkJc2VsLCByOwoJCQlpZiAocyAmJiBlKSB7CgkJCQl0aGlzLnNlbGVjdChzLCBlKTsKCQkJCWlmICh0aGlzLnJ0ZS5kb20ubmV4dChzKSA9PSBlKSB7CgkJCQkJdGhpcy5jb2xsYXBzZSh0cnVlKTsKCQkJCX0KCQkJCWlmICghJC5icm93c2VyLm1zaWUpIHsKCQkJCQlzZWwgPSBzZWxlY3Rpb24oKTsKCQkJCQlyID0gc2VsLnJhbmdlQ291bnQgPiAwID8gc2VsLmdldFJhbmdlQXQoMCkgOiB0aGlzLnJ0ZS5kb2MuY3JlYXRlUmFuZ2UoKTsKCQkJCQlzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CgkJCQkJc2VsLmFkZFJhbmdlKHIpOwoJCQkJfQoJCQkJCgkJCQlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocyk7CgkJCQllLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7CgkJCX0KCQl9CgkJcmV0dXJuIHRoaXM7CQoJfQoKCXRoaXMucmVtb3ZlQm9va21hcmsgPSBmdW5jdGlvbihiKSB7CgkJdGhpcy5ydGUud2luZG93LmZvY3VzKCk7CgkJaWYgKGIubGVuZ3RoPT0yKSB7CgkJCXZhciBzID0gdGhpcy5ydGUuZG9jLmdldEVsZW1lbnRCeUlkKGJbMF0pLAoJCQkJZSA9IHRoaXMucnRlLmRvYy5nZXRFbGVtZW50QnlJZChiWzFdKTsKCQkJaWYgKHMgJiYgZSkgewoJCQkJcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHMpOwoJCQkJZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpOwoJCQl9CgkJfQoJfQoKCS8qKgoJICog0J7Rh9C40YnQsNC10YIg0LrRjdGICgkgKgoJICogQHJldHVybiAgc2VsZWN0aW9uCgkgKiovCgl0aGlzLmNsZWFuQ2FjaGUgPSBmdW5jdGlvbigpIHsKCQlzdGFydCA9IGVuZCA9IG5vZGUgPSBudWxsOwoJCXJldHVybiB0aGlzOwoJfQoKCQoJLyoqCgkgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQvdC+0LTRgyDQvdCw0YfQsNC70LAg0LLRi9C00LXQu9C10L3QuNGPCgkgKgoJICogQHJldHVybiAgRE9NRWxlbWVudAoJICoqLwoJdGhpcy5nZXRTdGFydCA9IGZ1bmN0aW9uKCkgewoJCWlmICghc3RhcnQpIHsKCQkJdmFyIHIgPSB0aGlzLmdldFJhbmdlQXQoKTsKCQkJc3RhcnQgPSByLmdldFN0YXJ0KCk7CgkJfQoJCXJldHVybiBzdGFydDsKCX0KCQoJLyoqCgkgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQvdC+0LTRgyDQutC+0L3RhtCwINCy0YvQtNC10LvQtdC90LjRjwoJICoKCSAqIEByZXR1cm4gIERPTUVsZW1lbnQKCSAqKi8KCXRoaXMuZ2V0RW5kID0gZnVuY3Rpb24oKSB7CgkJaWYgKCFlbmQpIHsKCQkJdmFyIHIgPSB0aGlzLmdldFJhbmdlQXQoKTsKCQkJZW5kID0gci5nZXRFbmQoKTsKCQl9CgkJcmV0dXJuIGVuZDsKCX0KCgkvKioKCSAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCy0YvQsdGA0LDQvdGD0Y4g0L3QvtC00YMgKNC+0LHRidC40Lkg0LrQvtC90YLQtdC50L3QtdGAINCy0YHQtdGFINCy0YvQsdGA0LDQvdC90YvRhSDQvdC+0LQpCgkgKgoJICogQHJldHVybiAgRWxlbWVudAoJICoqLwoJdGhpcy5nZXROb2RlID0gZnVuY3Rpb24oKSB7CgkJaWYgKCFub2RlKSB7CgkJCW5vZGUgPSB0aGlzLnJ0ZS5kb20uZmluZENvbW1vbkFuY2VzdG9yKHRoaXMuZ2V0U3RhcnQoKSwgdGhpcy5nZXRFbmQoKSk7CgkJfQoJCXJldHVybiBub2RlOwoJfQoKCQoJLyoqCgkgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQvNCw0YHRgdC40LIg0LLRi9Cx0YDQsNC90L3Ri9GFINC90L7QtAoJICoKCSAqIEBwYXJhbSAgIE9iamVjdCAgbyAg0L/QsNGA0LDQvNC10YLRgNGLINC/0L7Qu9GD0YfQtdC90LjRjyDQuCDQvtCx0YDQsNCx0L7RgtC60Lgg0LLRi9Cx0YDQsNC90YvRhSDQvdC+0LQKCSAqIEByZXR1cm4gIEFycmF5CgkgKiovCgl0aGlzLnNlbGVjdGVkID0gZnVuY3Rpb24obykgewoJCXZhciBvcHRzID0gewoJCQljb2xsYXBzZWQgOiBmYWxzZSwgIC8vINCy0LXRgNC90YPRgtGMINCy0YvQtNC10LvQtdC90LjQtSwg0LTQsNC20LUg0LXRgdC70Lgg0L7QvdC+INGB0YXQu9C+0L/QvdGD0YLQvgoJCQlibG9ja3MgICAgOiBmYWxzZSwgIC8vINCx0LvQvtGH0L3QvtC1INCy0YvQtNC10LvQtdC90LjQtQoJCQlmaWx0ZXIgICAgOiBmYWxzZSwgIC8vINGE0LjQu9GM0YLRgCDRgNC10LfRg9C70YzRgtCw0YLQvtCyCgkJCXdyYXAgICAgICA6ICd0ZXh0JywgLy8g0YfRgtC+INC+0LHQvtGA0LDRh9C40LLQsNC10LwKCQkJdGFnICAgICAgIDogJ3NwYW4nICAvLyDQstC+INGH0YLQviDQvtCx0L7RgNCw0YfQuNCy0LDQtdC8CgkJfQoJCW9wdHMgPSAkLmV4dGVuZCh7fSwgb3B0cywgbyk7CgkJCgkJLy8g0LHQu9C+0YfQvdC+0LUg0LLRi9C00LXQu9C10L3QuNC1IC0g0LjRidC10Lwg0LHQu9C+0YfQvdGD0Y4g0L3QvtC00YMsINC90L4g0L3QtSDRgtCw0LHQu9C40YbRgwoJCWlmIChvcHRzLmJsb2NrcykgewoJCQl2YXIgbiAgPSB0aGlzLmdldE5vZGUoKSwgX24gPSBudWxsOwoJCQlpZiAoX24gPSB0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KG4sICdzZWxlY3Rpb25CbG9jaycpICkgewoJCQkJcmV0dXJuIFtfbl07CgkJCX0gCgkJfQoKCQl2YXIgc2VsICAgID0gdGhpcy5zZWxlY3RlZFJhdyhvcHRzLmNvbGxhcHNlZCwgb3B0cy5ibG9ja3MpOwoJCXZhciByZXQgICAgPSBbXTsKCQl2YXIgYnVmZmVyID0gW107CgkJdmFyIG5keCAgICA9IG51bGw7CgoJCS8vINC+0LHQvtGA0LDRh9C40LLQsNC10Lwg0L3QvtC00Ysg0LIg0LHRg9GE0YTQtdGA0LUKCQlmdW5jdGlvbiB3cmFwKCkgewoJCQkKCQkJZnVuY3Rpb24gYWxsb3dQYXJhZ3JhcGgoKSB7CgkJCQlmb3IgKHZhciBpPTA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKCQkJCQlpZiAoYnVmZmVyW2ldLm5vZGVUeXBlID09IDEgJiYgKHNlbGYucnRlLmRvbS5zZWxmT3JQYXJlbnQoYnVmZmVyW2ldLCAvXlAkLykgfHwgJChidWZmZXJbaV0pLmZpbmQoJ3AnKS5sZW5ndGg+MCkpIHsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX07CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSAKCQkJCgkJCWlmIChidWZmZXIubGVuZ3RoPjApIHsKCQkJCXZhciB0YWcgID0gb3B0cy50YWcgPT0gJ3AnICYmICFhbGxvd1BhcmFncmFwaCgpID8gJ2RpdicgOiBvcHRzLnRhZzsKCQkJCXZhciBuICAgID0gc2VsZi5ydGUuZG9tLndyYXAoYnVmZmVyLCB0YWcpOwoJCQkJcmV0W25keF0gPSBuOwoJCQkJbmR4ICAgICAgPSBudWxsOwoJCQkJYnVmZmVyICAgPSBbXTsKCQkJfQoJCX0KCQkKCQkvLyDQtNC+0LHQsNCy0LvRj9C10Lwg0L3QvtC00Ysg0LIg0LHRg9GE0YTQtdGACgkJZnVuY3Rpb24gYWRkVG9CdWZmZXIobikgewoJCQlpZiAobi5ub2RlVHlwZSA9PSAxKSB7CgkJCQlpZiAoL14oVEhFQUR8VEZPT1R8VEJPRFl8Q09MfENPTEdST1VQfFRSKSQvLnRlc3Qobi5ub2RlTmFtZSkpIHsKCQkJCQkkKG4pLmZpbmQoJ3RkLHRoJykuZWFjaChmdW5jdGlvbigpIHsKCQkJCQkJdmFyIHRhZyA9IG9wdHMudGFnID09ICdwJyAmJiAkKHRoaXMpLmZpbmQoJ3AnKS5sZW5ndGg+MCA/ICdkaXYnIDogb3B0cy50YWc7CgkJCQkJCXZhciBuID0gc2VsZi5ydGUuZG9tLndyYXBDb250ZW50cyh0aGlzLCB0YWcpOwoJCQkJCQlyZXR1cm4gcmV0LnB1c2gobik7CgkJCQkJfSkKCQkJCX0gZWxzZSBpZiAoL14oQ0FQVElPTnxURHxUSHxMSXxEVHxERCkkLy50ZXN0KG4ubm9kZU5hbWUpKSB7CgkJCQkJdmFyIHRhZyA9IG9wdHMudGFnID09ICdwJyAmJiAkKG4pLmZpbmQoJ3AnKS5sZW5ndGg+MCA/ICdkaXYnIDogb3B0cy50YWc7CgkJCQkJdmFyIG4gPSBzZWxmLnJ0ZS5kb20ud3JhcENvbnRlbnRzKG4sIHRhZyk7CgkJCQkJcmV0dXJuIHJldC5wdXNoKG4pOwoJCQkJfSAKCQkJfSAKCQkJdmFyIHByZXYgPSBidWZmZXIubGVuZ3RoPjAgPyBidWZmZXJbYnVmZmVyLmxlbmd0aC0xXSA6IG51bGw7CgkJCWlmIChwcmV2ICYmIHByZXYgIT0gc2VsZi5ydGUuZG9tLnByZXYobikpIHsKCQkJCXdyYXAoKTsKCQkJfQoJCQlidWZmZXIucHVzaChuKTsgCgkJCWlmIChuZHggPT09IG51bGwpIHsKCQkJCW5keCA9IHJldC5sZW5ndGg7CgkJCQlyZXQucHVzaCgnZHVtbXknKTsgLy8g0LfQsNCz0LvRg9GI0LrQsCDQtNC70Y8g0L7QsdC+0YDQsNGH0LjQstCw0LXQvNGL0YUg0Y3Qu9C10LzQtdC90YLQvtCyCgkJCX0KCQl9CgkJCgkJaWYgKHNlbC5ub2Rlcy5sZW5ndGg+MCkgewoJCQkKCQkJZm9yICh2YXIgaT0wOyBpIDwgc2VsLm5vZGVzLmxlbmd0aDsgaSsrKSB7CgkJCQl2YXIgbiA9IHNlbC5ub2Rlc1tpXTsKCQkJCQkvLyDQv9C10YDQstGD0Y4g0Lgg0L/QvtGB0Lsg0YLQtdC60YHRgtC+0LLRi9C1INC90L7QtNGLINGA0LDQt9GA0LXQt9Cw0LXQvCwg0LXRgdC70Lgg0L3QtdC+0LHRhdC+0LTQuNC80L4KCQkJCQkgaWYgKG4ubm9kZVR5cGUgPT0gMyAmJiAoaT09MCB8fCBpID09IHNlbC5ub2Rlcy5sZW5ndGgtMSkgJiYgJC50cmltKG4ubm9kZVZhbHVlKS5sZW5ndGg+MCkgewoJCQkJCQlpZiAoaT09MCAmJiBzZWwuc28+MCkgewoJCQkJCQkJbiA9IG4uc3BsaXRUZXh0KHNlbC5zbyk7CgkJCQkJCX0KCQkJCQkJaWYgKGkgPT0gc2VsLm5vZGVzLmxlbmd0aC0xICYmIHNlbC5lbz4wKSB7CgkJCQkJCQluLnNwbGl0VGV4dChpPT0wICYmIHNlbC5zbz4wID8gc2VsLmVvIC0gc2VsLnNvIDogc2VsLmVvKTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJc3dpdGNoIChvcHRzLndyYXApIHsKCQkJCQkJLy8g0L7QsdC+0YDQsNGH0LjQstCw0LXQvCDRgtC+0LvRjNC60L4g0YLQtdC60YHRgtC+0LLRi9C1INC90L7QtNGLINGBIGJyCgkJCQkJCWNhc2UgJ3RleHQnOgoJCQkJCQkJaWYgKChuLm5vZGVUeXBlID09IDEgJiYgbi5ub2RlTmFtZSA9PSAnQlInKSB8fCAobi5ub2RlVHlwZSA9PSAzICYmICQudHJpbShuLm5vZGVWYWx1ZSkubGVuZ3RoPjApKSB7CgkJCQkJCQkJYWRkVG9CdWZmZXIobik7CgkJCQkJCQl9IGVsc2UgaWYgKG4ubm9kZVR5cGUgPT0gMSkgewoJCQkJCQkJCXJldC5wdXNoKG4pOwoJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCS8vINC+0LHQvtGA0LDRh9C40LLQsNC10Lwg0LLRgdC1INC40L3Qu9Cw0LnQvSDRjdC70LXQvNC10L3RgtGLCQoJCQkJCQljYXNlICdpbmxpbmUnOgoJCQkJCQkJaWYgKHRoaXMucnRlLmRvbS5pc0lubGluZShuKSkgewoJCQkJCQkJCWFkZFRvQnVmZmVyKG4pOwoJCQkJCQkJfSBlbHNlIGlmIChuLm5vZGVUeXBlID09IDEpIHsKCQkJCQkJCQkKCQkJCQkJCQlyZXQucHVzaChuKTsKCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQkvLyDQvtCx0L7RgNCw0YfQuNCy0LDQtdC8INCy0YHQtQkKCQkJCQkJY2FzZSAnYWxsJzoKCQkJCQkJCWlmIChuLm5vZGVUeXBlID09IDEgfHwgIXRoaXMucnRlLmRvbS5pc0VtcHR5KG4pKSB7CgkJCQkJCQkJYWRkVG9CdWZmZXIobik7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJLy8g0L3QuNGH0LXQs9C+INC90LUg0L7QsdC+0YDQsNGH0LjQstCw0LXQvAoJCQkJCQlkZWZhdWx0OgoJCQkJCQkJaWYgKG4ubm9kZVR5cGUgPT0gMSB8fCAhdGhpcy5ydGUuZG9tLmlzRW1wdHkobikpIHsKCQkJCQkJCQlyZXQucHVzaChuKTsKCQkJCQkJCX0KCQkJCQl9CgkJCX07CgkJCXdyYXAoKTsKCQl9CgkKCQlpZiAocmV0Lmxlbmd0aCkgewoJCQl0aGlzLnJ0ZS53aW5kb3cuZm9jdXMoKTsKCQkJCgkJCXRoaXMuc2VsZWN0KHJldFswXSwgcmV0W3JldC5sZW5ndGgtMV0pOwoJCX0JCgkJcmV0dXJuIG9wdHMuZmlsdGVyID8gdGhpcy5ydGUuZG9tLmZpbHRlcihyZXQsIG9wdHMuZmlsdGVyKSA6IHJldDsKCX0KCgl0aGlzLmR1bXAgPSBmdW5jdGlvbihjYSwgcywgZSwgc28sIGVvKSB7CgkJdmFyIHIgPSB0aGlzLmdldFJhbmdlQXQoKTsKCQl0aGlzLnJ0ZS5sb2coJ2NvbW1vbkFuY2VzdG9yQ29udGFpbmVyJyk7CgkJdGhpcy5ydGUubG9nKGNhIHx8IHIuY29tbW9uQW5jZXN0b3JDb250YWluZXIpOwoJCS8vIHRoaXMucnRlLmxvZygnY29tbW9uQW5jZXN0b3JDb250YWluZXIgY2hpbGRzIG51bScpCgkJLy8gdGhpcy9ydGUubG9nKChjYXx8ci5jb21tb25BbmNlc3RvckNvbnRhaW5lcikuY2hpbGROb2Rlcy5sZW5ndGgpCgkJdGhpcy5ydGUubG9nKCdzdGFydENvbnRhaW5lcicpOwoJCXRoaXMucnRlLmxvZyhzIHx8IHIuc3RhcnRDb250YWluZXIpOwoJCXRoaXMucnRlLmxvZygnc3RhcnRPZmZzZXQ6ICcrKHNvPj0wID8gc28gOiByLnN0YXJ0T2Zmc2V0KSk7CgkJdGhpcy5ydGUubG9nKCdlbmRDb250YWluZXInKTsKCQl0aGlzLnJ0ZS5sb2coZXx8ci5lbmRDb250YWluZXIpOwoJCXRoaXMucnRlLmxvZygnZW5kT2Zmc2V0OiAnKyhlbz49MCA/IGVvIDogci5lbmRPZmZzZXQpKTsKCX0KCgkvKioKCSAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC80LDRgdGB0LjQsiDQstGL0LHRgNCw0L3QvdGL0YUg0L3QvtC0LCDQutCw0Log0LXRgdGC0YwKCSAqCgkgKiBAcGFyYW0gICBib29sICAgICAgICAgICDQstC+0LfQstGA0LDRidCw0YLRjCDQtdGB0LvQuCDQstGL0LTQtdC70LXQvdC40LUg0YHRhdC70L7Qv9C90YPRgtC+CgkgKiBAcGFyYW0gICBib29sICAgICAgICAgICAi0LHQu9C+0YfQvdC+0LUiINCy0YvQtNC10LvQtdC90LjQtSAo0YLQtdC60YHRgtC+0LLRi9C1INC90L7QtNGLINCy0LrQu9GO0YfQsNGO0YLRgdGPINC/0L7Qu9C90L7RgdGC0YzRjiwg0L3QtSDQt9Cw0LLQuNGB0LjQvNC+INC+0YIgb2Zmc2V0KQoJICogQHJldHVybiAgQXJyYXkKCSAqKi8KCXRoaXMuc2VsZWN0ZWRSYXcgPSBmdW5jdGlvbihjb2xsYXBzZWQsIGJsb2NrcykgewoJCXZhciByZXMgPSB7c28gOiBudWxsLCBlbyA6IG51bGwsIG5vZGVzIDogW119OwoJCXZhciByICAgPSB0aGlzLmdldFJhbmdlQXQodHJ1ZSk7CgkJdmFyIGNhICA9IHIuY29tbW9uQW5jZXN0b3JDb250YWluZXI7CgkJdmFyIHMsIGU7ICAvLyBzdGFydCAmIGVuZCBub2RlcwoJCXZhciBzZiAgPSBmYWxzZTsgLy8gc3RhcnQgbm9kZSBmdWxseSBzZWxlY3RlZAoJCXZhciBlZiAgPSBmYWxzZTsgLy8gZW5kIG5vZGUgZnVsbHkgc2VsZWN0ZWQKCQkKCQkvLyDQstC+0LfQstGA0LDRidCw0LXRgiB0cnVlLCDQtdGB0LvQuCDQvdC+0LTQsCDQvdC1INGC0LXQutGB0YLQvtCy0LDRjyDQuNC70Lgg0LLRi9C00LXQu9C10L3QsCDQv9C+0LvQvdC+0YHRgtGM0Y4KCQlmdW5jdGlvbiBpc0Z1bGx5U2VsZWN0ZWQobiwgcywgZSkgewoJCQlpZiAobi5ub2RlVHlwZSA9PSAzKSB7CgkJCQllID0gZT49MCA/IGUgOiBuLm5vZGVWYWx1ZS5sZW5ndGg7CgkJCQlyZXR1cm4gKHM9PTAgJiYgZT09bi5ub2RlVmFsdWUubGVuZ3RoKSB8fCAkLnRyaW0obi5ub2RlVmFsdWUpLmxlbmd0aCA9PSAkLnRyaW0obi5ub2RlVmFsdWUuc3Vic3RyaW5nKHMsIGUpKS5sZW5ndGg7CgkJCX0gCgkJCXJldHVybiB0cnVlOwoJCX0KCQkKCQkvLyDQstC+0LfQstGA0LDRidCw0LXRgiB0cnVlLCDQtdGB0LvQuCDQvdC+0LTQsCDQv9GD0YHRgtCw0Y8g0LjQu9C4INCyINC90LXQuSDQvdC1INCy0YvQtNC10LvQtdC90L4g0L3QuCDQvtC00L3QvtCz0L4g0L3QtdC/0YDQvtCx0LXQu9GM0L3QvtCz0L4g0YHQuNC80LLQvtC70LAKCQlmdW5jdGlvbiBpc0VtcHR5U2VsZWN0ZWQobiwgcywgZSkgewoJCQlpZiAobi5ub2RlVHlwZSA9PSAxKSB7CgkJCQlyZXR1cm4gc2VsZi5ydGUuZG9tLmlzRW1wdHkobik7CgkJCX0gZWxzZSBpZiAobi5ub2RlVHlwZSA9PSAzKSB7CgkJCQlyZXR1cm4gJC50cmltKG4ubm9kZVZhbHVlLnN1YnN0cmluZyhzfHwwLCBlPj0wID8gZSA6IG4ubm9kZVZhbHVlLmxlbmd0aCkpLmxlbmd0aCA9PSAwOwoJCQl9IAoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJCgkJCgkJLy90aGlzLmR1bXAoKQoJCS8vINC90LDRh9Cw0LvRjNC90LDRjyDQvdC+0LTQsAoJCWlmIChyLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDEpIHsKCQkJaWYgKHIuc3RhcnRPZmZzZXQ8ci5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCkgewoJCQkJcyA9IHIuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tyLnN0YXJ0T2Zmc2V0XTsKCQkJCXJlcy5zbyA9IHMubm9kZVR5cGUgPT0gMSA/IG51bGwgOiAwOwoJCQl9IGVsc2UgewoJCQkJcyA9IHIuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tyLnN0YXJ0T2Zmc2V0LTFdOwoJCQkJcmVzLnNvID0gcy5ub2RlVHlwZSA9PSAxID8gbnVsbCA6IHMubm9kZVZhbHVlLmxlbmd0aDsKCQkJfQoJCX0gZWxzZSB7CgkJCXMgPSByLnN0YXJ0Q29udGFpbmVyOwoJCQlyZXMuc28gPSByLnN0YXJ0T2Zmc2V0OwoJCX0gCgkJCgkJLy8g0LLRi9C00LXQu9C10L3QuNC1INGB0YXQu9C+0L/QvdGD0YLQvgoJCWlmIChyLmNvbGxhcHNlZCkgewoJCQlpZiAoY29sbGFwc2VkKSB7CgkJCQkvLyAg0LHQu9C+0YfQvdC+0LUg0LLRi9C00LXQu9C10L3QuNC1CgkJCQlpZiAoYmxvY2tzKSB7CgkJCQkJcyA9IHJlYWxTZWxlY3RlZChzKTsKCQkJCQlpZiAoIXRoaXMucnRlLmRvbS5pc0VtcHR5KHMpIHx8IChzID0gdGhpcy5ydGUuZG9tLm5leHQocykpKSB7CgkJCQkJCXJlcy5ub2RlcyA9IFtzXTsKCQkJCQl9IAoJCQkJCQoJCQkJCS8vINC00L7QsdCw0LLQu9GP0LXQvCDQuNC90LvQsNC50L0g0YHQvtGB0LXQtNC10LkgCgkJCQkJaWYgKHRoaXMucnRlLmRvbS5pc0lubGluZShzKSkgewoJCQkJCQlyZXMubm9kZXMgPSB0aGlzLnJ0ZS5kb20udG9MaW5lU3RhcnQocykuY29uY2F0KHJlcy5ub2RlcywgdGhpcy5ydGUuZG9tLnRvTGluZUVuZChzKSk7CgkJCQkJfQoJCQkJCQoJCQkJCS8vIG9mZnNldCDQtNC70Y8g0YLQtdC60YHRgtC+0LLRi9GFINC90L7QtAoJCQkJCWlmIChyZXMubm9kZXMubGVuZ3RoPjApIHsKCQkJCQkJcmVzLnNvID0gcmVzLm5vZGVzWzBdLm5vZGVUeXBlID09IDEgPyBudWxsIDogMDsKCQkJCQkJcmVzLmVvID0gcmVzLm5vZGVzW3Jlcy5ub2Rlcy5sZW5ndGgtMV0ubm9kZVR5cGUgPT0gMSA/IG51bGwgOiByZXMubm9kZXNbcmVzLm5vZGVzLmxlbmd0aC0xXS5ub2RlVmFsdWUubGVuZ3RoOwoJCQkJCX0KCQkJCQkKCQkJCX0gZWxzZSBpZiAoIXRoaXMucnRlLmRvbS5pc0VtcHR5KHMpKSB7CgkJCQkJcmVzLm5vZGVzID0gW3NdOwoJCQkJfQoJCQkJCgkJCX0KCQkJcmV0dXJuIHJlczsKCQl9CgkJCgkJLy8g0LrQvtC90LXRh9C90LDRjyDQvdC+0LTQsAoJCWlmIChyLmVuZENvbnRhaW5lci5ub2RlVHlwZSA9PSAxKSB7CgkJCWUgPSByLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzW3IuZW5kT2Zmc2V0LTFdOwoJCQlyZXMuZW8gPSBlLm5vZGVUeXBlID09IDEgPyBudWxsIDogZS5ub2RlVmFsdWUubGVuZ3RoOwoJCX0gZWxzZSB7CgkJCWUgPSByLmVuZENvbnRhaW5lcjsKCQkJcmVzLmVvID0gci5lbmRPZmZzZXQ7CgkJfSAKCQkvLyB0aGlzLnJ0ZS5sb2coJ3NlbGVjdCAxJykKCQkvL3RoaXMuZHVtcChjYSwgcywgZSwgcmVzLnNvLCByZXMuZW8pCgkJCgkJLy8g0L3QsNGH0LDQu9GM0L3QsNGPINC90L7QtNCwINCy0YvQtNC10LvQtdC90LAg0L/QvtC70L3QvtGB0YLRjNGOIC0g0L/QvtC00L3QuNC80LDQtdC80YHRjyDQvdCw0LLQtdGA0YUg0L/QviDQu9C10LLQvtC5INGB0YLQvtGA0L7QvdC1CgkJaWYgKHMubm9kZVR5cGUgPT0gMSB8fCBibG9ja3MgfHwgaXNGdWxseVNlbGVjdGVkKHMsIHJlcy5zbywgcy5ub2RlVmFsdWUubGVuZ3RoKSkgewovLwkJCXRoaXMucnRlLmxvZygnc3RhcnQgdGV4dCBub2RlIGlzIGZ1bGx5IHNlbGVjdGVkJykKCQkJcyA9IHJlYWxTZWxlY3RlZChzLCBjYSwgJ2xlZnQnKTsKCQkJc2YgPSB0cnVlOwoJCQlyZXMuc28gPSBzLm5vZGVUeXBlID09IDEgPyBudWxsIDogMDsKCQl9CgkJLy8g0LrQvtC90LXRh9C90LDRjyDQvdC+0LTQsCDQstGL0LTQtdC70LXQvdCwINC/0L7Qu9C90L7RgdGC0YzRjiAtINC/0L7QtNC90LjQvNCw0LXQvNGB0Y8g0L3QsNCy0LXRgNGFINC/0L4g0L/RgNCw0LLQvtC5INGB0YLQvtGA0L7QvdC1CgkJaWYgKGUubm9kZVR5cGUgPT0gMSB8fCBibG9ja3MgfHwgaXNGdWxseVNlbGVjdGVkKGUsIDAsICByZXMuZW8pKSB7Ci8vCQkJdGhpcy5ydGUubG9nKCdlbmQgdGV4dCBub2RlIGlzIGZ1bGx5IHNlbGVjdGVkJykKCQkJZSA9IHJlYWxTZWxlY3RlZChlLCBjYSwgJ3JpZ2h0Jyk7CgkJCWVmID0gdHJ1ZTsKCQkJcmVzLmVvID0gZS5ub2RlVHlwZSA9PSAxID8gbnVsbCA6IGUubm9kZVZhbHVlLmxlbmd0aDsKCQl9CgoJCS8vINCx0LvQvtGH0L3QvtC1INCy0YvQtNC10LvQtdC90LjQtSAtINC10YHQu9C4INC90L7QtNGLINC90LUg0Y3Qu9C10LzQtdC90YLRiyAtINC/0L7QtNC90LjQvNCw0LXQvNGB0Y8g0Log0YDQvtC00LjRgtC10LvRjiwg0L3QviDQvdC40LbQtSDQutC+0L3RgtC10LnQvdC10YDQsAoJCWlmIChibG9ja3MpIHsKCQkJaWYgKHMubm9kZVR5cGUgIT0gMSAmJiBzLnBhcmVudE5vZGUgIT0gY2EgJiYgcy5wYXJlbnROb2RlLm5vZGVOYW1lICE9ICdCT0RZJykgewoJCQkJcyA9IHMucGFyZW50Tm9kZTsKCQkJCXJlcy5zbyA9IG51bGw7CgkJCX0KCQkJaWYgKGUubm9kZVR5cGUgIT0gMSAmJiBlLnBhcmVudE5vZGUgIT0gY2EgJiYgZS5wYXJlbnROb2RlLm5vZGVOYW1lICE9ICdCT0RZJykgewoJCQkJZSA9IGUucGFyZW50Tm9kZTsKCQkJCXJlcy5lbyA9IG51bGw7CgkJCX0KCQl9CgoJCS8vINC10YHQu9C4INC60L7QvdGC0LXQvdC10YAg0LLRi9C00LXQu9C10L0g0L/QvtC70L3QvtGB0YLRjNGOLCDQv9C+0LTQvdC40LzQsNC10LzRgdGPINC90LDQstC10YDRhSDQvdCw0YHQutC+0LvRjNC60L4g0LzQvtC20L3QvgoJCWlmIChzLnBhcmVudE5vZGUgPT0gZS5wYXJlbnROb2RlICYmIHMucGFyZW50Tm9kZS5ub2RlTmFtZSAhPSAnQk9EWScgJiYgKHNmICYmIHRoaXMucnRlLmRvbS5pc0ZpcnN0Tm90RW1wdHkocykpICYmIChlZiAmJiB0aGlzLnJ0ZS5kb20uaXNMYXN0Tm90RW1wdHkoZSkpKSB7Ci8vCQkJdGhpcy5ydGUubG9nKCdjb21tb24gcGFyZW50JykKCQkJcyA9IGUgPSBzLnBhcmVudE5vZGU7CgkJCXJlcy5zbyA9IHMubm9kZVR5cGUgPT0gMSA/IG51bGwgOiAwOwoJCQlyZXMuZW8gPSBlLm5vZGVUeXBlID09IDEgPyBudWxsIDogZS5ub2RlVmFsdWUubGVuZ3RoOwoJCX0KCQkvLyDQvdCw0YfQsNC70YzQvdCw0Y8g0L3QvtC00LAgPT0g0LrQvtC90LXRh9C90L7QuSDQvdC+0LTQtQoJCWlmIChzID09IGUpIHsKLy8JCQl0aGlzLnJ0ZS5sb2coJ3N0YXJ0IGlzIGVuZCcpCgkJCWlmICghdGhpcy5ydGUuZG9tLmlzRW1wdHkocykpIHsKCQkJCXJlcy5ub2Rlcy5wdXNoKHMpOwoJCQl9CgkJCXJldHVybiByZXM7CgkJfQoJCSAvLyB0aGlzLnJ0ZS5sb2coJ3N0YXJ0IDInKQoJCSAgLy90aGlzLmR1bXAoY2EsIHMsIGUsIHJlcy5zbywgcmVzLmVvKQoJCQoJCS8vINC90LDRhdC+0LTQuNC8INC90LDRh9Cw0LvRjNC90YPRjiDQuCDQutC+0L3QtdGH0L3Rg9GOINGC0L7Rh9C60LggLSDQvdC+0LTRiyDQuNC3INC40LXRgNCw0YDRhdC40Lgg0YDQvtC00LjRgtC10LvQtdC5INC90LDRh9Cw0LvRjNC90L7QuSDQuCDQutC+0L3QtdGH0L3QviDQvdC+0LTRiywg0YMg0LrQvtGC0L7RgNGL0YUg0YDQvtC00LjRgtC10LvRjCAtINC60L7QvdGC0LXQudC90LXRgAoJCXZhciBzcCA9IHM7CgkJd2hpbGUgKHNwLm5vZGVOYW1lICE9ICdCT0RZJyAmJiBzcC5wYXJlbnROb2RlICE9PSBjYSAmJiBzcC5wYXJlbnROb2RlLm5vZGVOYW1lICE9ICdCT0RZJykgewoJCQlzcCA9IHNwLnBhcmVudE5vZGU7CgkJfQoJCS8vdGhpcy5ydGUubG9nKHMubm9kZU5hbWUpCgkJLy8gdGhpcy5ydGUubG9nKCdzdGFydCBwb2ludCcpCgkJLy8gdGhpcy5ydGUubG9nKHNwKQoJCQoJCXZhciBlcCA9IGU7Ci8vCQl0aGlzLnJ0ZS5sb2coZXApCgkJd2hpbGUgKGVwLm5vZGVOYW1lICE9ICdCT0RZJyAmJiBlcC5wYXJlbnROb2RlICE9PSBjYSAmJiBlcC5wYXJlbnROb2RlLm5vZGVOYW1lICE9ICdCT0RZJykgewoJCQkvLyB0aGlzLnJ0ZS5sb2coZXApCgkJCWVwID0gZXAucGFyZW50Tm9kZTsKCQl9CgkJLy8gdGhpcy5ydGUubG9nKCdlbmQgcG9pbnQnKQoJCS8vIHRoaXMucnRlLmxvZyhlcCkKCQkKCQkKCQkvLyAg0LXRgdC70Lgg0L3QsNGH0LDQu9GM0L3QsNGPINC90L7QtNCwINC90LUg0L/Rg9GB0YLQsNGPIC0g0LTQvtCx0LDQstC70Y/QtdC8INC10LUKCQlpZiAoIWlzRW1wdHlTZWxlY3RlZChzLCByZXMuc28sIHMubm9kZVR5cGU9PTMgPyBzLm5vZGVWYWx1ZS5sZW5ndGggOiBudWxsKSkgewoJCQlyZXMubm9kZXMucHVzaChzKTsKCQl9CgkJLy8g0L/QvtC00L3QuNC80LDQtdC80YHRjyDQvtGCINC90LDRh9Cw0LvRjNC90L7QuSDQvdC+0LTRiyDQtNC+INC90LDRh9Cw0LvRjNC90L7QuSDRgtC+0YfQutC4CgkJdmFyIG4gPSBzOwoJCXdoaWxlIChuICE9PSBzcCkgewoJCQl2YXIgX24gPSBuOwoJCQl3aGlsZSAoKF9uID0gdGhpcy5ydGUuZG9tLm5leHQoX24pKSkgewoJCQkJCXJlcy5ub2Rlcy5wdXNoKF9uKTsKCQkJfQoJCQluID0gbi5wYXJlbnROb2RlOwoJCX0KCQkvLyDQvtGCINC90LDRh9Cw0LvRjNC90L7QuSDRgtC+0YfQutC4INC00L4g0LrQvtC90LXRh9C90L7QuSDRgtC+0YfQutC4CgkJbiA9IHNwOwoJCXdoaWxlICgobiA9IHRoaXMucnRlLmRvbS5uZXh0KG4pKSAmJiBuIT0gZXAgKSB7Ci8vCQkJdGhpcy5ydGUubG9nKG4pCgkJCXJlcy5ub2Rlcy5wdXNoKG4pOwoJCX0KCQkvLyDQv9C+0LTQvdC40LzQsNC10LzRgdGPINC+0YIg0LrQvtC90LXRh9C90L7QuSDQvdC+0LTRiyDQtNC+INC60L7QvdC10YfQvdC+0Lkg0YLQvtGH0LrQuCwg0YDQtdC30YPQu9GM0YLQsNGCINC/0LXRgNC10LLQvtGA0LDRh9C40LLQsNC10LwKCQl2YXIgdG1wID0gW107CgkJbiA9IGU7CgkJd2hpbGUgKG4gIT09IGVwKSB7CgkJCXZhciBfbiA9IG47CgkJCXdoaWxlICgoX24gPSB0aGlzLnJ0ZS5kb20ucHJldihfbikpKSB7CgkJCQl0bXAucHVzaChfbik7CgkJCX0KCQkJbiA9IG4ucGFyZW50Tm9kZTsKCQl9CgkJaWYgKHRtcC5sZW5ndGgpIHsKCQkJcmVzLm5vZGVzID0gcmVzLm5vZGVzLmNvbmNhdCh0bXAucmV2ZXJzZSgpKTsKCQl9CgkJLy8gINC10YHQu9C4INC60L7QvdC10YfQvdCw0Y8g0L3QvtC00LAg0L3QtSDQv9GD0YHRgtCw0Y8g0LggIT0g0L3QsNGH0LDQu9GM0L3QvtC5IC0g0LTQvtCx0LDQstC70Y/QtdC8INC10LUKCQlpZiAoIWlzRW1wdHlTZWxlY3RlZChlLCAwLCBlLm5vZGVUeXBlPT0zID8gcmVzLmVvIDogbnVsbCkpIHsKCQkJcmVzLm5vZGVzLnB1c2goZSk7CgkJfQoJCQoJCWlmIChibG9ja3MpIHsKCQkJLy8g0LTQvtCx0LDQstC70Y/QtdC8INC40L3Qu9Cw0LnQvSDRgdC+0YHQtdC00LXQuSDRgdC70LXQstCwCgkJCWlmICh0aGlzLnJ0ZS5kb20uaXNJbmxpbmUocykpIHsKCQkJCXJlcy5ub2RlcyA9IHRoaXMucnRlLmRvbS50b0xpbmVTdGFydChzKS5jb25jYXQocmVzLm5vZGVzKTsKCQkJCXJlcy5zbyAgICA9IHJlcy5ub2Rlc1swXS5ub2RlVHlwZSA9PSAxID8gbnVsbCA6IDA7CgkJCX0KCQkJLy8g0LTQvtCx0LDQstC70Y/QtdC8INC40L3Qu9Cw0LnQvSDRgdC+0YHQtdC00LXQuSDRgdC/0YDQsNCy0LAKCQkJaWYgKHRoaXMucnRlLmRvbS5pc0lubGluZShlKSkgewoJCQkJcmVzLm5vZGVzID0gcmVzLm5vZGVzLmNvbmNhdCh0aGlzLnJ0ZS5kb20udG9MaW5lRW5kKGUpKTsKCQkJCXJlcy5lbyAgICA9IHJlcy5ub2Rlc1tyZXMubm9kZXMubGVuZ3RoLTFdLm5vZGVUeXBlID09IDEgPyBudWxsIDogcmVzLm5vZGVzW3Jlcy5ub2Rlcy5sZW5ndGgtMV0ubm9kZVZhbHVlLmxlbmd0aDsKCQkJfQoJCX0KCQkKCQkvLyDQstGB0LUg0YDQsNC00YPRjtGC0YHRjyEgOikKCQlyZXR1cm4gcmVzOwoJfQoJCn0KCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBlbFJURSBVc2VyIGludGVyZmFjZSBjb250cm9sbGVyCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEB0b2RvOiB0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJykgLSBtb3ZlIHRvIHVpLnVwZGF0ZTsKICogQHRvZG86IGFkZCBkb20gYW5kIHNlbGVjdGlvbiBhcyBidXR0b24gbWVtYmVycwogKiBDb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aSA9IGZ1bmN0aW9uKHJ0ZSkgewoJdGhpcy5ydGUgICAgICA9IHJ0ZTsKCXRoaXMuX2J1dHRvbnMgPSBbXTsKCXZhciBzZWxmICAgICAgPSB0aGlzLAoJCXRiICAgICAgICA9IHRoaXMucnRlLm9wdGlvbnMudG9vbGJhcnNbcnRlLm9wdGlvbnMudG9vbGJhciAmJiBydGUub3B0aW9ucy50b29sYmFyc1tydGUub3B0aW9ucy50b29sYmFyXSA/IHJ0ZS5vcHRpb25zLnRvb2xiYXIgOiAnbm9ybWFsJ10sCgkJdGJsICAgICAgID0gdGIubGVuZ3RoLAoJCXAsIHBuYW1lLCBwbCwgbiwgYywgYiwgaTsKCQoJLy8gYWRkIHByb3RvdHlwZSB0byBhbGwgYnV0dG9ucwoJZm9yIChpIGluIHRoaXMuYnV0dG9ucykgewoJCWlmICh0aGlzLmJ1dHRvbnMuaGFzT3duUHJvcGVydHkoaSkgJiYgaSAhPSAnYnV0dG9uJykgewoJCQl0aGlzLmJ1dHRvbnNbaV0ucHJvdG90eXBlID0gdGhpcy5idXR0b25zLmJ1dHRvbi5wcm90b3R5cGU7CgkJfQoJfQoJCgkvLyBjcmVhdGUgYnV0dG9ucyBhbmQgcHV0IG9uIHRvb2xiYXIKCXdoaWxlICh0YmwtLSkgewoJCXBuYW1lID0gdGJbdGJsXTsKCQlwID0gJCgnPHVsIGNsYXNzPSJwYW5lbC0nK3BuYW1lKyh0YmwgPT0gMCA/ICcgZmlyc3QnIDogJycpKyciIC8+JykucHJlcGVuZFRvKHRoaXMucnRlLnRvb2xiYXIpOwoJCXAuYmluZCgnbW91c2Vkb3duJywgZnVuY3Rpb24oZSkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfSkKCQlwbCA9IHRoaXMucnRlLm9wdGlvbnMucGFuZWxzW3BuYW1lXS5sZW5ndGg7CgkJd2hpbGUgKHBsLS0pIHsKCQkJbiA9IHRoaXMucnRlLm9wdGlvbnMucGFuZWxzW3BuYW1lXVtwbF07CgkJCWMgPSB0aGlzLmJ1dHRvbnNbbl0gfHwgdGhpcy5idXR0b25zLmJ1dHRvbjsKCQkJdGhpcy5fYnV0dG9ucy5wdXNoKChiID0gbmV3IGModGhpcy5ydGUsIG4pKSk7CgkJCXAucHJlcGVuZChiLmRvbUVsZW0pOwoJCX0KCX0KCQoJdGhpcy51cGRhdGUoKTsKCQoJdGhpcy5kaXNhYmxlID0gZnVuY3Rpb24oKSB7CgkJJC5lYWNoKHNlbGYuX2J1dHRvbnMsIGZ1bmN0aW9uKCkgewoJCQkhdGhpcy5hY3RpdmUgJiYgdGhpcy5kb21FbGVtLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoJCX0pOwoJfQoJCn0KCi8qKgogKiDQntCx0L3QvtCy0LvRj9C10YIg0LrQvdC+0L/QutC4IC0g0LLRi9C30YvQstCw0LXRgiDQvNC10YLQvtC0IHVwZGF0ZSgpINC00LvRjyDQutCw0LbQtNC+0Lkg0LrQvdC+0L/QutC4CiAqCiAqIEByZXR1cm4gdm9pZAogKiovCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oY2xlYW5DYWNoZSkgewoJY2xlYW5DYWNoZSAmJiB0aGlzLnJ0ZS5zZWxlY3Rpb24uY2xlYW5DYWNoZSgpOwoJdmFyIG4gICAgPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLAoJCXAgICAgPSB0aGlzLnJ0ZS5kb20ucGFyZW50cyhuLCAnKicpLAoJCXJ0bCA9IHRoaXMucnRlLnJ0bCwKCQlzZXAgID0gcnRsID8gJyAmbGFxdW87ICcgOiAnICZyYXF1bzsgJywgCgkJcGF0aCA9ICcnLCBuYW1lLCBpOwoJCQoJZnVuY3Rpb24gX25hbWUobikgewoJCXZhciBuYW1lID0gbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCW4gPSAkKG4pCgkJaWYgKG5hbWUgPT0gJ2ltZycpIHsKCQkJaWYgKG4uaGFzQ2xhc3MoJ2VscnRlLW1lZGlhJykpIHsKCQkJCW5hbWUgPSAnbWVkaWEnOwoJCQl9IGVsc2UgaWYgKG4uaGFzQ2xhc3MoJ2VscnRlLWdvb2dsZS1tYXBzJykpIHsKCQkJCW5hbWUgPSAnZ29vZ2xlIG1hcCc7CgkJCX0gZWxzZSBpZiAobi5oYXNDbGFzcygnZWxydGUteWFuZGV4LW1hcHMnKSkgewoJCQkJbmFtZSA9ICd5YW5kZXggbWFwJzsKCQkJfSBlbHNlIGlmIChuLmhhc0NsYXNzKCdlbHJ0ZS1wYWdlYnJlYWsnKSkgewoJCQkJbmFtZSA9ICdwYWdlYnJlYWsnOwoJCQl9CgkJfQoJCXJldHVybiBuYW1lOwoJfQoJCglpZiAobiAmJiBuLm5vZGVUeXBlID09IDEgJiYgbi5ub2RlTmFtZSAhPSAnQk9EWScpIHsKCQlwLnVuc2hpZnQobik7Cgl9CgkKCWlmICghcnRsKSB7CgkJcCA9IHAucmV2ZXJzZSgpOwoJfQoJCglmb3IgKGk9MDsgaSA8IHAubGVuZ3RoOyBpKyspIHsKCQlwYXRoICs9IChpPjAgPyBzZXAgOiAnJykrX25hbWUocFtpXSk7Cgl9CgkKCXRoaXMucnRlLnN0YXR1c2Jhci5odG1sKHBhdGgpOwoJJC5lYWNoKHRoaXMuX2J1dHRvbnMsIGZ1bmN0aW9uKCkgewoJCXRoaXMudXBkYXRlKCk7Cgl9KTsKCXRoaXMucnRlLndpbmRvdy5mb2N1cygpOwp9CgoKCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucyA9IHsKCQoJLyoqCgkgKiBAY2xhc3Mg0LrQvdC+0L/QutCwINC90LAgdG9vbGJhciDRgNC10LTQsNC60YLQvtGA0LAgCgkgKiDRgNC10LDQu9C40LfRg9C10YIg0L/QvtCy0LXQtNC10L3QuNC1INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC4INGP0LLQu9GP0LXRgtGB0Y8g0YDQvtC00LjRgtC10LvQtdC8INC00LvRjyDQtNGA0YPQs9C40YUg0LrQvdC+0L/QvtC6CgkgKgoJICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKCSAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4ICjQutC+0LzQsNC90LTQsCDQuNGB0L/QvtC70L3Rj9C10LzQsNGPIGRvY3VtZW50LmV4ZWNDb21tYW5kKCkpCgkgKiovCglidXR0b24gOiBmdW5jdGlvbihydGUsIG5hbWUpIHsKCQl2YXIgc2VsZiAgICAgPSB0aGlzOwoJCXRoaXMucnRlICAgICA9IHJ0ZTsKCQl0aGlzLmFjdGl2ZSA9IGZhbHNlOwoJCXRoaXMubmFtZSAgICA9IG5hbWU7CgkJdGhpcy52YWwgICAgID0gbnVsbDsKCQl0aGlzLmRvbUVsZW0gPSAkKCc8bGkgc3R5bGU9Ii1tb3otdXNlci1zZWxlY3Q6LW1vei1ub25lIiBjbGFzcz0iJytuYW1lKycgcm91bmRlZC0zIiBuYW1lPSInK25hbWUrJyIgdGl0bGU9IicrdGhpcy5ydGUuaTE4bih0aGlzLnJ0ZS5vcHRpb25zLmJ1dHRvbnNbbmFtZV0gfHwgbmFtZSkrJyIgdW5zZWxlY3RhYmxlPSJvbiIgLz4nKQoJCQkuaG92ZXIoCgkJCQlmdW5jdGlvbigpIHsgJCh0aGlzKS5hZGRDbGFzcygnaG92ZXInKTsgfSwKCQkJCWZ1bmN0aW9uKCkgeyAkKHRoaXMpLnJlbW92ZUNsYXNzKCdob3ZlcicpOyB9CgkJCSkKCQkJLmNsaWNrKCBmdW5jdGlvbihlKSB7CgkJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJaWYgKCEkKHRoaXMpLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7CgkJCQkJc2VsZi5jb21tYW5kKCk7CgkJCQl9CgkJCQlzZWxmLnJ0ZS53aW5kb3cuZm9jdXMoKTsKCQkJfSk7Cgl9Cn0KCi8qKgogKiDQntCx0YDQsNCx0L7RgtGH0LjQuiDQvdCw0LbQsNGC0LjRjyDQvdCwINC60L3QvtC/0LrRgyDQvdCwINGC0YPQu9Cx0LDRgNC1LiDQktGL0L/QvtC70L3QtdC90LjQtSDQutC+0LzQsNC90LTRiyDQuNC70Lgg0L7RgtC60YDRi9GC0LjQtSDQvtC60L3QsHzQvNC10L3RjiDQuCDRgtC0CiAqCiAqIEByZXR1cm4gdm9pZAogKiovCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5idXR0b24ucHJvdG90eXBlLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7Cgl0cnkgewoJCXRoaXMucnRlLmRvYy5leGVjQ29tbWFuZCh0aGlzLm5hbWUsIGZhbHNlLCB0aGlzLnZhbCk7Cgl9IGNhdGNoKGUpIHsKCQlyZXR1cm4gdGhpcy5ydGUubG9nKCdjb21tYW5kcyBmYWlsZWQ6ICcrdGhpcy5uYW1lKTsKCX0KCQoJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwp9CgovKioKICog0J7QsdC90L7QstC70Y/QtdGCINGB0L7RgdGC0L7Rj9C90LjQtSDQutC90L7Qv9C60LgKICoKICogQHJldHVybiB2b2lkCiAqKi8KZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmJ1dHRvbi5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oKSB7Cgl0cnkgewoJCWlmICghdGhpcy5ydGUuZG9jLnF1ZXJ5Q29tbWFuZEVuYWJsZWQodGhpcy5uYW1lKSkgewoJCQlyZXR1cm4gdGhpcy5kb21FbGVtLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9IGNhdGNoIChlKSB7CgkJcmV0dXJuOwoJfQoJdHJ5IHsKCQlpZiAodGhpcy5ydGUuZG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKHRoaXMubmFtZSkpIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdhY3RpdmUnKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCX0gY2F0Y2ggKGUpIHsgfQp9Cgp9KShqUXVlcnkpOy8qCiAqIE1pc2MgdXRpbHMgZm9yIGVsUlRFCiAqCiAqIEBwYXJhbSBPYmplY3QgcnRlIC0gZWRpdG9yCiAqIEB0b2RvINCf0L7QtNGD0LzQsNGC0YwsINGH0YLQviDQuNC3INGN0YLQvtCz0L4g0YDQtdCw0LvRjNC90L4g0L3Rg9C20L3QviDQuCDQvdCw0LLQtdGB0YLQuCDQv9C+0YDRj9C00L7Qui4g0JLQvtC30LzQvtC20L3QviDRh9Cw0YHRgtGMINC/0LXRgNC10L3QtdGB0YLQuCDQsiBlbGxpYgogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIENvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudXRpbHMgPSBmdW5jdGlvbihydGUpIHsKCXRoaXMucnRlICAgICA9IHJ0ZTsKCXRoaXMudXJsICAgICA9IG51bGw7CgkvLyBkb21vIGFyaWdhdG8sIFN0ZWF2ZSwgaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL3BhcnNldXJpCgl0aGlzLnJlZyAgICAgPSAvXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLzsKCXRoaXMuYmFzZVVSTCA9ICcnOwoJdGhpcy5wYXRoICAgID0gJyc7CgkvKioKCSAqIGVudGl0aWVzIG1hcAoJICoqLwoJdGhpcy5lbnRpdGllcyA9IHsnJicgOiAnJmFtcDsnLCAnIicgOiAnJnF1b3Q7JywgJzwnIDogJyZsdDsnLCAnPicgOiAnJmd0Oyd9OwoJLyoqCgkgKiBlbnRpdGllcyByZWdleHAKCSAqKi8KCXRoaXMuZW50aXRpZXNSZWdFeHAgPSAvWzw+JlwiXS9nOwoJLyoqCgkgKiBtZWRpYSBpbmZvCgkgKiovCgl0aGlzLm1lZGlhID0gW3sgCgkJCXR5cGUgICAgIDogJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywgCgkJCWNsYXNzaWQgIDogWydjbHNpZDpkMjdjZGI2ZS1hZTZkLTExY2YtOTZiOC00NDQ1NTM1NDAwMDAnXSwgCgkJCWNvZGViYXNlIDogJ2h0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5jYWIjdmVyc2lvbj02LDAsNDAsMCcgCgkJfSwgeyAKCQkJdHlwZSAgICAgOiAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsIAoJCQljbGFzc2lkICA6IFsnY2xzaWQ6MTY2YjFiY2EtM2Y5Yy0xMWNmLTgwNzUtNDQ0NTUzNTQwMDAwJ10sIAoJCQljb2RlYmFzZSA6ICdodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL3Nob2Nrd2F2ZS9jYWJzL2RpcmVjdG9yL3N3LmNhYiN2ZXJzaW9uPTgsNSwxLDAnIAoJCX0sIHsgCgkJCXR5cGUgICAgIDogJ2FwcGxpY2F0aW9uL3gtbXBsYXllcjInLCAKCQkJY2xhc3NpZCAgOiBbJ2Nsc2lkOjZiZjUyYTUyLTM5NGEtMTFkMy1iMTUzLTAwYzA0Zjc5ZmFhNicsICdjbHNpZDoyMmQ2ZjMxMi1iMGY2LTExZDAtOTRhYi0wMDgwYzc0YzdlOTUnLCAnY2xzaWQ6MDU1ODlmYTEtYzM1Ni0xMWNlLWJmMDEtMDBhYTAwNTU1OTVhJ10sIAoJCQljb2RlYmFzZSA6ICdodHRwOi8vYWN0aXZleC5taWNyb3NvZnQuY29tL2FjdGl2ZXgvY29udHJvbHMvbXBsYXllci9lbi9uc21wMmluZi5jYWIjVmVyc2lvbj01LDEsNTIsNzAxJyAKCQl9LCB7IAoJCQl0eXBlICAgICA6ICd2aWRlby9xdWlja3RpbWUnLCAKCQkJY2xhc3NpZCAgOiBbJ2Nsc2lkOjAyYmYyNWQ1LThjMTctNGIyMy1iYzgwLWQzNDg4YWJkZGM2YiddLCAKCQkJY29kZWJhc2UgOiAnaHR0cDovL3d3dy5hcHBsZS5jb20vcXRhY3RpdmV4L3F0cGx1Z2luLmNhYiN2ZXJzaW9uPTYsMCwyLDAnIAoJCX0sIHsgCgkJCXR5cGUgICAgIDogJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsIAoJCQljbGFzc2lkICA6IFsnY2xzaWQ6Y2ZjZGFhMDMtOGJlNC0xMWNmLWI4NGItMDAyMGFmYmJjY2ZhJ10sIAoJCQljb2RlYmFzZSA6ICdodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL3Nob2Nrd2F2ZS9jYWJzL2ZsYXNoL3N3Zmxhc2guY2FiI3ZlcnNpb249NiwwLDQwLDAnCgkJfV07CgkKCS8vIHJnYiBjb2xvciByZWdleHAKCXRoaXMucmdiUmVnRXhwID0gL1xzKnJnYlxzKj9cKFxzKj8oWzAtOV0rKVxzKj8sXHMqPyhbMC05XSspXHMqPyxccyo/KFswLTldKylccyo/XClccyovaTsKCS8vIHJlZ2V4cCB0byBkZXRlY3QgY29sb3IgaW4gYm9yZGVyL2JhY2tncm91bmQgcHJvcGVydGllcwoJdGhpcy5jb2xvcnNSZWdFeHAgPSAvYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvd3xyZ2JccypcKFteXCldK1wpL2k7CgkvLyB3ZWIgc2FmZSBjb2xvcnMKCXRoaXMuY29sb3JzID0gewoJCWFxdWEgICAgOiAnIzAwZmZmZicsCgkJYmxhY2sgICA6ICcjMDAwMDAwJywKCQlibHVlICAgIDogJyMwMDAwZmYnLAoJCWZ1Y2hzaWEgOiAnI2ZmMDBmZicsCgkJZ3JheSAgICA6ICcjODA4MDgwJywKCQlncmVlbiAgIDogJyMwMDgwMDAnLAoJCWxpbWUgICAgOiAnIzAwZmYwMCcsCgkJbWFyb29uICA6ICcjODAwMDAwJywKCQluYXZ5ICAgIDogJyMwMDAwODAnLAoJCW9saXZlICAgOiAnIzgwODAwMCcsCgkJb3JhbmdlICA6ICcjZmZhNTAwJywKCQlwdXJwbGUgIDogJyM4MDAwODAnLAoJCXJlZCAgICAgOiAnI2ZmMDAwMCcsCgkJc2lsdmVyICA6ICcjYzBjMGMwJywKCQl0ZWFsICAgIDogJyMwMDgwODAnLAoJCXdoaXRlICAgOiAnI2ZmZmZmZmYnLAoJCXllbGxvdyAgOiAnI2ZmZmYwMCcKCX0KCQoJdmFyIHNlbGYgICAgID0gdGhpczsKCQoJdGhpcy5yZ2IyaGV4ID0gZnVuY3Rpb24oc3RyKSB7CgkJcmV0dXJuIHRoaXMuY29sb3IySGV4KCcnK3N0cikKCX0KCQoJdGhpcy50b1BpeGVscyA9IGZ1bmN0aW9uKG51bSkgewoJCXZhciBtID0gbnVtLm1hdGNoKC8oWzAtOV0rXC4/WzAtOV0qKVxzKihweHxwdHxlbXwlKS8pOwoJCWlmIChtKSB7CgkJCW51bSAgPSBtWzFdOwoJCQl1bml0ID0gbVsyXTsKCQl9IAoJCWlmIChudW1bMF0gPT0gJy4nKSB7CgkJCW51bSA9ICcwJytudW07CgkJfQoJCW51bSA9IHBhcnNlRmxvYXQobnVtKTsKCgkJaWYgKGlzTmFOKG51bSkpIHsKCQkJcmV0dXJuICcnOwoJCX0KCQl2YXIgYmFzZSA9IHBhcnNlSW50KCQoZG9jdW1lbnQuYm9keSkuY3NzKCdmb250LXNpemUnKSkgfHwgMTY7CgkJc3dpdGNoICh1bml0KSB7CgkJCWNhc2UgJ2VtJzogcmV0dXJuIHBhcnNlSW50KG51bSpiYXNlKTsKCQkJY2FzZSAncHQnOiByZXR1cm4gcGFyc2VJbnQobnVtKmJhc2UvMTIpOwoJCQljYXNlICclJyA6IHJldHVybiBwYXJzZUludChudW0qYmFzZS8xMDApOwoJCX0KCQlyZXR1cm4gbnVtOwoJfQoJCgkvLyBUT0RPOiBhZGQgcGFyc2UgcmVsIHBhdGggLi4vLi4vZXRjCgl0aGlzLmFic29sdXRlVVJMID0gZnVuY3Rpb24odXJsKSB7CgkJIXRoaXMudXJsICYmIHRoaXMuX3VybCgpOwoJCXVybCA9ICQudHJpbSh1cmwpOwoJCWlmICghdXJsKSB7CgkJCXJldHVybiAnJzsKCQl9CgkJLy8g0YHRgdGL0LvQutC4INC90LAg0Y/QutC+0YDRjyDQvdC1INC/0LXRgNC10LLQvtC00LjQvCDQsiDQsNCx0YEKCQlpZiAodXJsWzBdID09ICcjJykgewoJCQlyZXR1cm4gdXJsOwoJCX0KCQl2YXIgdSA9IHRoaXMucGFyc2VVUkwodXJsKTsKCgkJaWYgKCF1Lmhvc3QgJiYgIXUucGF0aCAmJiAhdS5hbmNob3IpIHsKCQkJLy90aGlzLnJ0ZS5sb2coJ0ludmFsaWQgVVJMOiAnK3VybCkKCQkJcmV0dXJuICcnOwoJCX0KCQlpZiAoIXRoaXMucnRlLm9wdGlvbnMuYWJzb2x1dGVVUkxzKSB7IAoJCQlyZXR1cm4gdXJsOwoJCX0KCQlpZiAodS5wcm90b2NvbCkgewoJCQkvL3RoaXMucnRlLmxvZygndXJsIGFscmVhZHkgYWJzb2x1dGU6ICcrdXJsKTsKCQkJcmV0dXJuIHVybDsKCQl9CgkJaWYgKHUuaG9zdCAmJiAodS5ob3N0LmluZGV4T2YoJy4nKSE9LTEgfHwgdS5ob3N0ID09ICdsb2NhbGhvc3QnKSkgewoJCQkvL3RoaXMucnRlLmxvZygnbm8gcHJvdG9jb2wnKTsKCQkJcmV0dXJuIHRoaXMudXJsLnByb3RvY29sKyc6Ly8nK3VybDsKCQl9CgkJaWYgKHVybFswXSA9PSAnLycpIHsKCQkJdXJsID0gdGhpcy5iYXNlVVJMK3VybDsKCQl9IGVsc2UgewoJCQlpZiAodXJsLmluZGV4T2YoJy4vJykgPT0gMCkgewoJCQkJdXJsID0gdXJsLnN1YnN0cmluZygyKTsKCQkJfQoJCQl1cmwgPSB0aGlzLmJhc2VVUkwrdGhpcy5wYXRoK3VybDsKCQl9CgkJcmV0dXJuIHVybDsKCX0KCQoJdGhpcy5wYXJzZVVSTCA9IGZ1bmN0aW9uKHVybCkgewoJCXZhciB1ICAgPSB1cmwubWF0Y2godGhpcy5yZWcpOwoJCXZhciByZXQgPSB7fTsKCQkkLmVhY2goWyJzb3VyY2UiLCJwcm90b2NvbCIsImF1dGhvcml0eSIsInVzZXJJbmZvIiwidXNlciIsInBhc3N3b3JkIiwiaG9zdCIsInBvcnQiLCJyZWxhdGl2ZSIsInBhdGgiLCJkaXJlY3RvcnkiLCJmaWxlIiwicXVlcnkiLCJhbmNob3IiXSwgZnVuY3Rpb24oaSkgewoJCQlyZXRbdGhpc10gPSB1W2ldOwoJCX0pOwoJCWlmICghcmV0Lmhvc3QubWF0Y2goL1thLXowLTldL2kpKSB7CgkJCXJldC5ob3N0ID0gJyc7CgkJfQoJCXJldHVybiByZXQ7Cgl9CgkKCXRoaXMudHJpbUV2ZW50Q2FsbGJhY2sgPSBmdW5jdGlvbihjKSB7CgkJYyA9IGMgPyBjLnRvU3RyaW5nKCkgOiAnJzsKCQlyZXR1cm4gJC50cmltKGMucmVwbGFjZSgvXHIqXG4vbWcsICcnKS5yZXBsYWNlKC9eZnVuY3Rpb25ccypvblthLXpdK1xzKlwoXHMqZXZlbnRccypcKVxzKlx7KC4rKVx9JC9pZ20sICckMScpKTsKCX0KCQoJdGhpcy5fdXJsID0gZnVuY3Rpb24oKSB7CgkJdGhpcy51cmwgICAgID0gdGhpcy5wYXJzZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7CgkJdGhpcy5iYXNlVVJMID0gdGhpcy51cmwucHJvdG9jb2wrJzovLycrKHRoaXMudXJsLnVzZXJJbmZvID8gIHBhcnRzLnVzZXJJbmZvKydAJyA6ICcnKSt0aGlzLnVybC5ob3N0Kyh0aGlzLnVybC5wb3J0ID8gJzonK3RoaXMudXJsLnBvcnQgOiAnJyk7CgkJdGhpcy5wYXRoICAgID0gIXRoaXMudXJsLmZpbGUgPyB0aGlzLnVybC5wYXRoIDogdGhpcy51cmwucGF0aC5zdWJzdHJpbmcoMCwgdGhpcy51cmwucGF0aC5sZW5ndGggLSB0aGlzLnVybC5maWxlLmxlbmd0aCk7Cgl9CgoKCS8qKgoJICogQ3JlYXRlIG9iamVjdCAobWFwKSBmcm9tIGFycmF5CgkgKgoJICogQHBhcmFtICAgQXJyYXkKCSAqIEByZXR1cm4gIE9iamVjdAoJICoqLwoJdGhpcy5tYWtlT2JqZWN0ID0gZnVuY3Rpb24obykgewoJCXZhciBtID0ge307CgkJJC5lYWNoKG8sIGZ1bmN0aW9uKGksIGUpIHsKCQkJbVtlXSA9IGU7CgkJfSk7CgkJcmV0dXJuIG07Cgl9CgoJLyoqCgkgKiBFbmNvZGUgZW50aXRpZXMgaW4gc3RyaW5nCgkgKgoJICogQHBhcmFtICAgU3RyaW5nCgkgKiBAcmV0dXJuICBTdHJpbmcKCSAqKi8KCXRoaXMuZW5jb2RlID0gZnVuY3Rpb24ocykgewoJCXZhciBlID0gdGhpcy5lbnRpdGllczsKCQlyZXR1cm4gKCcnK3MpLnJlcGxhY2UodGhpcy5lbnRpdGllc1JlZ0V4cCwgZnVuY3Rpb24oYykgewoJCQlyZXR1cm4gZVtjXTsKCQl9KTsKCX0KCQoJLyoqCgkgKiBEZWNvZGUgZW50aXRpZXMgaW4gc3RyaW5nCgkgKgoJICogQHBhcmFtICAgU3RyaW5nCgkgKiBAcmV0dXJuICBTdHJpbmcKCSAqKi8KCXRoaXMuZGVjb2RlID0gZnVuY3Rpb24ocykgewoJCXJldHVybiAkKCc8ZGl2Lz4nKS5odG1sKHN8fCcnKS50ZXh0KCk7Cgl9CgkKCS8qKgoJICogUGFyc2Ugc3R5bGUgc3RyaW5nIGludG8gb2JqZWN0CgkgKgoJICogQHBhcmFtICAgU3RyaW5nCgkgKiBAcmV0dXJuICBPYmplY3QKCSAqKi8KCXRoaXMucGFyc2VTdHlsZSA9IGZ1bmN0aW9uKHMpIHsKCQl2YXIgc3QgPSB7fSwgYSA9IHRoaXMucnRlLm9wdGlvbnMuYWxsb3dCcm93c2Vyc1NwZWNTdHlsZXMsIHQsIG4sIHY7CgkJCgkJaWYgKHR5cGVvZihzKSA9PSAnc3RyaW5nJyAmJiBzLmxlbmd0aCkgewoJCQkkLmVhY2gocy5yZXBsYWNlKC8mcXVvdDsvZ2ksICInIikuc3BsaXQoJzsnKSwgZnVuY3Rpb24oKSB7CgkJCQl0ID0gdGhpcy50b1N0cmluZygpLnNwbGl0KCc6Jyk7CgkJCQlpZiAodFswXSAmJiB0WzFdKSB7CgkJCQkJbiA9ICQudHJpbSh0WzBdKS50b0xvd2VyQ2FzZSgpOwoJCQkJCXYgPSAkLnRyaW0odFsxXSk7CgkJCQkJaWYgKG4gPT0gJ2NvbG9yJyB8fCBuID09ICdiYWNrZ3JvdW5kLWNvbG9yJykgewoJCQkJCQl2ID0gdi50b0xvd2VyQ2FzZSgpOwoJCQkJCX0KCQkJCQlpZiAobiAmJiB2ICYmIChhIHx8IG4uc3Vic3RyaW5nKDAsIDEpICE9ICctJykpIHsKCQkJCQkJc3Rbbl0gPSB2OwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJfQoJCXJldHVybiBzdDsKCX0KCQoJCgkvKioKCSAqIENvbXBhY3Qgc29tZSBzdHlsZSBwcm9wZXJ0aWVzIGFuZCBjb252ZXJ0IGNvbG9ycyBpbiBoZXgKCSAqCgkgKiBAcGFyYW0gICBPYmplY3QKCSAqIEByZXR1cm4gIE9iamVjdAoJICoqLwoJdGhpcy5jb21wYWN0U3R5bGUgPSBmdW5jdGlvbihzKSB7CgkJdmFyIHNlbGYgPSB0aGlzOwoKCQlpZiAocy5ib3JkZXIgPT0gJ21lZGl1bSBub25lJykgewoJCQlkZWxldGUgcy5ib3JkZXI7CgkJfQoJCQoJCSQuZWFjaChzLCBmdW5jdGlvbihuLCB2KSB7CgkJCWlmICgvY29sb3IkL2kudGVzdChuKSkgewoJCQkJc1tuXSA9IHNlbGYuY29sb3IySGV4KHYpOwoJCQl9IGVsc2UgaWYgKC9eKGJvcmRlcnxiYWNrZ3JvdW5kKSQvaS50ZXN0KG4pKSB7CgkJCQlzW25dID0gdi5yZXBsYWNlKHNlbGYuY29sb3JzUmVnRXhwLCBmdW5jdGlvbihtKSB7CgkJCQkJcmV0dXJuIHNlbGYuY29sb3IySGV4KG0pOwoJCQkJfSk7CgkJCX0KCQl9KTsKCQkKCQlpZiAoc1snYm9yZGVyLXdpZHRoJ10pIHsKCQkJcy5ib3JkZXIgPSBzWydib3JkZXItd2lkdGgnXSsnICcrKHNbJ2JvcmRlci1zdHlsZSddfHwnc29saWQnKSsnICcrKHNbJ2JvcmRlci1jb2xvciddfHwnIzAwMCcpOwoJCQlkZWxldGUgc1snYm9yZGVyLXdpZHRoJ107CgkJCWRlbGV0ZSBzWydib3JkZXItc3R5bGUnXTsKCQkJZGVsZXRlIHNbJ2JvcmRlci1jb2xvciddOwoJCX0KCQkKCQlpZiAoc1snYmFja2dyb3VuZC1pbWFnZSddKSB7CgkJCXMuYmFja2dyb3VuZCA9IChzWydiYWNrZ3JvdW5kLWNvbG9yJ10rJyAnKXx8Jycrc1snYmFja2dyb3VuZC1pbWFnZSddKycgJytzWydiYWNrZ3JvdW5kLXBvc2l0aW9uJ118fCcwIDAnKycgJytzWydiYWNrZ3JvdW5kLXJlcGVhdCddfHwncmVwZWF0JzsKCQkJZGVsZXRlIHNbJ2JhY2tncm91bmQtaW1hZ2UnXTsKCQkJZGVsZXRlWydiYWNrZ3JvdW5kLWltYWdlJ107CgkJCWRlbGV0ZVsnYmFja2dyb3VuZC1wb3NpdGlvbiddOwoJCQlkZWxldGVbJ2JhY2tncm91bmQtcmVwZWF0J107CgkJfQoJCQoJCWlmIChzWydtYXJnaW4tdG9wJ10gJiYgc1snbWFyZ2luLXJpZ2h0J10gJiYgc1snbWFyZ2luLWJvdHRvbSddICYmIHNbJ21hcmdpbi1sZWZ0J10pIHsKCQkJcy5tYXJnaW4gPSBzWydtYXJnaW4tdG9wJ10rJyAnK3NbJ21hcmdpbi1yaWdodCddKycgJytzWydtYXJnaW4tYm90dG9tJ10rJyAnK3NbJ21hcmdpbi1sZWZ0J107CgkJCWRlbGV0ZSBzWydtYXJnaW4tdG9wJ107CgkJCWRlbGV0ZSBzWydtYXJnaW4tcmlnaHQnXTsKCQkJZGVsZXRlIHNbJ21hcmdpbi1ib3R0b20nXTsKCQkJZGVsZXRlIHNbJ21hcmdpbi1sZWZ0J107CgkJfQoJCQoJCWlmIChzWydwYWRkaW5nLXRvcCddICYmIHNbJ3BhZGRpbmctcmlnaHQnXSAmJiBzWydwYWRkaW5nLWJvdHRvbSddICYmIHNbJ3BhZGRpbmctbGVmdCddKSB7CgkJCXMucGFkZGluZyA9IHNbJ3BhZGRpbmctdG9wJ10rJyAnK3NbJ3BhZGRpbmctcmlnaHQnXSsnICcrc1sncGFkZGluZy1ib3R0b20nXSsnICcrc1sncGFkZGluZy1sZWZ0J107CgkJCWRlbGV0ZSBzWydwYWRkaW5nLXRvcCddOwoJCQlkZWxldGUgc1sncGFkZGluZy1yaWdodCddOwoJCQlkZWxldGUgc1sncGFkZGluZy1ib3R0b20nXTsKCQkJZGVsZXRlIHNbJ3BhZGRpbmctbGVmdCddOwoJCX0KCQkKCQlpZiAoc1snbGlzdC1zdHlsZS10eXBlJ10gfHwgc1snbGlzdC1zdHlsZS1wb3NpdGlvbiddIHx8IHNbJ2xpc3Qtc3R5bGUtaW1hZ2UnXSkgewoJCQlzWydsaXN0LXN0eWxlJ10gPSAkLnRyaW0oc1snbGlzdC1zdHlsZS10eXBlJ118fCcgJytzWydsaXN0LXN0eWxlLXBvc2l0aW9uJ118fCcnK3NbJ2xpc3Qtc3R5bGUtaW1hZ2UnXXx8JycpOwoJCQlkZWxldGUgc1snbGlzdC1zdHlsZS10eXBlJ107CgkJCWRlbGV0ZSBzWydsaXN0LXN0eWxlLXBvc2l0aW9uJ107CgkJCWRlbGV0ZSBzWydsaXN0LXN0eWxlLWltYWdlJ107CgkJfQoJCQoJCXJldHVybiBzOwoJfQoJCgkvKioKCSAqIFNlcmlhbGl6ZSBzdHlsZSBvYmplY3QgaW50byBzdHJpbmcKCSAqCgkgKiBAcGFyYW0gICBPYmplY3QgIHN0eWxlIG1hcAoJICogQHBhcmFtICAgQm9vbGVhbiBmbGFnIC0gY29tcGFjdCBzdHlsZT8KCSAqIEByZXR1cm4gIFN0cmluZwoJICoqLwoJdGhpcy5zZXJpYWxpemVTdHlsZSA9IGZ1bmN0aW9uKG8sIGMpIHsKCQl2YXIgcyA9IFtdOwoJCS8vIGM9dHJ1ZQoJCSQuZWFjaChjID8gdGhpcy5jb21wYWN0U3R5bGUobykgOiBvLCBmdW5jdGlvbihuLCB2KSB7CgkJCXYgJiYgcy5wdXNoKG4rJzonK3YpOwoJCX0pOwoJCXJldHVybiBzLmpvaW4oJzsnKTsKCX0KCgkvKioKCSAqIFBhcnNlIGNsYXNzIHN0cmluZyBpbnRvIG9iamVjdAoJICoKCSAqIEBwYXJhbSAgIFN0cmluZwoJICogQHJldHVybiAgT2JqZWN0CgkgKiovCgl0aGlzLnBhcnNlQ2xhc3MgPSBmdW5jdGlvbihjKSB7CgkJYyA9ICQudHJpbShjKTsgCgkJLy8gdGhpcy5ydGUubG9nKGMpCgkJcmV0dXJuIGMubGVuZ3RoID8gdGhpcy5tYWtlT2JqZWN0KGMuc3BsaXQoL1xzKy8pKSA6IHt9OwoJCXJldHVybiBjLmxlbmd0aCA/IGMuc3BsaXQoL1xzKy8pIDogW107Cgl9CgoJLyoqCgkgKiBTZXJpYWxpemUgY2xhc3Mgb2JqZWN0IGludG8gc3RyaW5nCgkgKgoJICogQHBhcmFtICAgT2JqZWN0CgkgKiBAcmV0dXJuICBTdHJpbmcKCSAqKi8KCXRoaXMuc2VyaWFsaXplQ2xhc3MgPSBmdW5jdGlvbihjKSB7CgkJLy8gcmV0dXJuIGMuam9pbignICcpCgkJdmFyIHMgPSBbXTsKCQkkLmVhY2goYywgZnVuY3Rpb24obikgewoJCQlzLnB1c2gobik7CgkJfSk7CgkJcmV0dXJuIHMuam9pbignICcpOwoJfQoJCgkvKioKCSAqIFJldHVybiByZXF1aXJlZCBtZWRpYSB0eXBlIGluZm8KCSAqCgkgKiBAcGFyYW0gICBTdHJpbmcgIG1pbWV0eXBlCgkgKiBAcGFyYW0gICBTdHJpbmcgIGNsYXNzaWQKCSAqIEByZXR1cm4gIE9iamVjdAoJICoqLwoJdGhpcy5tZWRpYUluZm8gPSBmdW5jdGlvbih0LCBjKSB7CgkJdmFyIGwgPSB0aGlzLm1lZGlhLmxlbmd0aDsKCQkKCQl3aGlsZSAobC0tKSB7CgkJCWlmICh0ID09PSB0aGlzLm1lZGlhW2xdLnR5cGUgfHwgKGMgJiYgJC5pbkFycmF5KGMsIHRoaXMubWVkaWFbbF0uY2xhc3NpZCkgIT0gLTEpKSB7CgkJCQlyZXR1cm4gdGhpcy5tZWRpYVtsXTsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFJldHVybiBjb2xvciBoZXggdmFsdWUKCSAqCgkgKiBAcGFyYW0gICBTdHJpbmcgICBjb2xvciBuYW1lIG9yIHJnYgoJICogQHJldHVybiAgU3RyaW5nCgkgKiovCgl0aGlzLmNvbG9yMkhleCA9IGZ1bmN0aW9uKGMpIHsKCQl2YXIgbTsKCQkKCQlpZiAoYy5pbmRleE9mKCcjJykgPT09IDApIHsKCQkJcmV0dXJuIGM7CgkJfQoJCQoJCWMgPSBjfHwnJzsKCQlmdW5jdGlvbiBoZXgocykgewoJCQlzID0gcGFyc2VJbnQocykudG9TdHJpbmcoMTYpOwoJCQlyZXR1cm4gcy5sZW5ndGggPiAxID8gcyA6ICcwJyArIHM7IAoJCX07CgkJCgkJaWYgKHRoaXMuY29sb3JzW2NdKSB7CgkJCXJldHVybiB0aGlzLmNvbG9yc1tjXTsKCQl9CgkJaWYgKChtID0gYy5tYXRjaCh0aGlzLnJnYlJlZ0V4cCkpKSB7CgkJCXJldHVybiAnIycraGV4KG1bMV0pK2hleChtWzJdKStoZXgobVszXSk7CgkJfQoJCXJldHVybiAnJzsKCX0KCQoKCQoJCn0KCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyB3M2NSYW5nZSAgLSB3M2MgdGV4dCByYW5nZSBlbXVsYXRpb24gZm9yICJzdHJhbmdlIiBicm93c2VycwogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQ29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudzNjUmFuZ2UgPSBmdW5jdGlvbihydGUpIHsKCXZhciBzZWxmICAgICAgICAgICAgICAgICAgICAgPSB0aGlzOwoJdGhpcy5ydGUgICAgICAgICAgICAgICAgICAgICA9IHJ0ZTsKCXRoaXMuciAgICAgICAgICAgICAgICAgICAgICAgPSBudWxsOwoJdGhpcy5jb2xsYXBzZWQgICAgICAgICAgICAgICA9IHRydWU7Cgl0aGlzLnN0YXJ0Q29udGFpbmVyICAgICAgICAgID0gbnVsbDsKCXRoaXMuZW5kQ29udGFpbmVyICAgICAgICAgICAgPSBudWxsOwoJdGhpcy5zdGFydE9mZnNldCAgICAgICAgICAgICA9IDA7Cgl0aGlzLmVuZE9mZnNldCAgICAgICAgICAgICAgID0gMDsKCXRoaXMuY29tbW9uQW5jZXN0b3JDb250YWluZXIgPSBudWxsOwoJCgl0aGlzLnJhbmdlID0gZnVuY3Rpb24oKSB7CgkJdHJ5IHsgCgkJCXRoaXMuciA9IHRoaXMucnRlLndpbmRvdy5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsgCgkJfSBjYXRjaChlKSB7IAoJCQl0aGlzLnIgPSB0aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsgCgkJfQoJCXJldHVybiB0aGlzLnI7Cgl9CgkKCXRoaXMuaW5zZXJ0Tm9kZSA9IGZ1bmN0aW9uKGh0bWwpIHsKCQl0aGlzLnJhbmdlKCk7CgkJc2VsZi5yLmNvbGxhcHNlKGZhbHNlKQoJCXZhciByID0gc2VsZi5yLmR1cGxpY2F0ZSgpOwoJCXIucGFzdGVIVE1MKGh0bWwpOwoJfQoJCgl0aGlzLmdldEJvb2ttYXJrID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5yYW5nZSgpOwoJCWlmICh0aGlzLnIuaXRlbSkgewoJCQl2YXIgbiA9IHRoaXMuci5pdGVtKDApOwoJCQl0aGlzLnIgPSB0aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKCQkJdGhpcy5yLm1vdmVUb0VsZW1lbnRUZXh0KG4pOwoJCX0KCQlyZXR1cm4gdGhpcy5yLmdldEJvb2ttYXJrKCk7Cgl9CgkKCXRoaXMubW92ZVRvQm9va21hcmsgPSBmdW5jdGlvbihibSkgewoJCXRoaXMucnRlLndpbmRvdy5mb2N1cygpOwoJCXRoaXMucmFuZ2UoKS5tb3ZlVG9Cb29rbWFyayhibSk7CgkJdGhpcy5yLnNlbGVjdCgpOwoJfQoJCgkvKioKCSAqINCe0LHQvdC+0LLQu9GP0LXRgiDQtNCw0L3QvdGL0LUg0L4g0LLRi9C00LXQu9C10L3QvdGL0YUg0L3QvtC00LDRhQoJICoKCSAqIEByZXR1cm4gdm9pZAoJICoqLwoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCgkJZnVuY3Rpb24gX2ZpbmRQb3Moc3RhcnQpIHsKCQkJdmFyIG1hcmtlciA9ICdcdUZFRkYnOwoJCQl2YXIgbmR4ID0gb2Zmc2V0ID0gMDsKCQkJdmFyIHIgPSBzZWxmLnIuZHVwbGljYXRlKCk7CgkJCXIuY29sbGFwc2Uoc3RhcnQpOwoJCQl2YXIgcCA9IHIucGFyZW50RWxlbWVudCgpOwoJCQlpZiAoIXAgfHwgcC5ub2RlTmFtZSA9PSAnSFRNTCcpIHsKCQkJCXJldHVybiB7cGFyZW50IDogc2VsZi5ydGUuZG9jLmJvZHksIG5keCA6IG5keCwgb2Zmc2V0IDogb2Zmc2V0fTsKCQkJfQoKCQkJci5wYXN0ZUhUTUwobWFya2VyKTsKCQkJCgkJCWNoaWxkcyA9IHAuY2hpbGROb2RlczsKCQkJZm9yICh2YXIgaT0wOyBpIDwgY2hpbGRzLmxlbmd0aDsgaSsrKSB7CgkJCQl2YXIgbiA9IGNoaWxkc1tpXTsKCQkJCWlmIChpPjAgJiYgKG4ubm9kZVR5cGUhPT0zIHx8IGNoaWxkc1tpLTFdLm5vZGVUeXBlICE9PTMpKSB7CgkJCQkJbmR4Kys7CgkJCQl9CgkJCQlpZiAobi5ub2RlVHlwZSAhPT0gMykgewoJCQkJCW9mZnNldCA9IDA7CgkJCQl9IGVsc2UgewoJCQkJCXZhciBwb3MgPSBuLm5vZGVWYWx1ZS5pbmRleE9mKG1hcmtlcik7CgkJCQkJaWYgKHBvcyAhPT0gLTEpIHsKCQkJCQkJb2Zmc2V0ICs9IHBvczsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCW9mZnNldCArPSBuLm5vZGVWYWx1ZS5sZW5ndGg7CgkJCQl9CgkJCX07CgkJCXIubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCAtMSk7CgkJCXIudGV4dCA9ICcnOwoJCQlyZXR1cm4ge3BhcmVudCA6IHAsIG5keCA6IE1hdGgubWluKG5keCwgcC5jaGlsZE5vZGVzLmxlbmd0aC0xKSwgb2Zmc2V0IDogb2Zmc2V0fTsKCQl9CgoJCXRoaXMucmFuZ2UoKTsKCQl0aGlzLnN0YXJ0Q29udGFpbmVyID0gdGhpcy5lbmRDb250YWluZXIgPSBudWxsOwoKCQlpZiAodGhpcy5yLml0ZW0pIHsKCQkJdGhpcy5jb2xsYXBzZWQgPSBmYWxzZTsKCQkJdmFyIGkgPSB0aGlzLnIuaXRlbSgwKTsKCQkJdGhpcy5zZXRTdGFydChpLnBhcmVudE5vZGUsIHRoaXMucnRlLmRvbS5pbmRleE9mKGkpKTsKCQkJdGhpcy5zZXRFbmQoaS5wYXJlbnROb2RlLCB0aGlzLnN0YXJ0T2Zmc2V0KzEpOwoJCX0gZWxzZSB7CgkJCXRoaXMuY29sbGFwc2VkID0gdGhpcy5yLmJvdW5kaW5nV2lkdGggPT0gMDsKCQkJdmFyIHN0YXJ0ID0gX2ZpbmRQb3ModHJ1ZSk7IAoJCQl2YXIgZW5kICAgPSBfZmluZFBvcyhmYWxzZSk7CgkJCQoJCQlzdGFydC5wYXJlbnQubm9ybWFsaXplKCk7CgkJCWVuZC5wYXJlbnQubm9ybWFsaXplKCk7CgkJCXN0YXJ0Lm5keCA9IE1hdGgubWluKHN0YXJ0Lm5keCwgc3RhcnQucGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoLTEpOwoJCQllbmQubmR4ID0gTWF0aC5taW4oZW5kLm5keCwgZW5kLnBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aC0xKTsKCQkJaWYgKHN0YXJ0LnBhcmVudC5jaGlsZE5vZGVzW3N0YXJ0Lm5keF0ubm9kZVR5cGUgJiYgc3RhcnQucGFyZW50LmNoaWxkTm9kZXNbc3RhcnQubmR4XS5ub2RlVHlwZSA9PSAxKSB7CgkJCQl0aGlzLnNldFN0YXJ0KHN0YXJ0LnBhcmVudCwgc3RhcnQubmR4KTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuc2V0U3RhcnQoc3RhcnQucGFyZW50LmNoaWxkTm9kZXNbc3RhcnQubmR4XSwgc3RhcnQub2Zmc2V0KTsKCQkJfQoJCQlpZiAoZW5kLnBhcmVudC5jaGlsZE5vZGVzW2VuZC5uZHhdLm5vZGVUeXBlICYmIGVuZC5wYXJlbnQuY2hpbGROb2Rlc1tlbmQubmR4XS5ub2RlVHlwZSA9PSAxKSB7CgkJCQl0aGlzLnNldEVuZChlbmQucGFyZW50LCBlbmQubmR4KTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuc2V0RW5kKGVuZC5wYXJlbnQuY2hpbGROb2Rlc1tlbmQubmR4XSwgZW5kLm9mZnNldCk7CgkJCX0KCQkJLy8gdGhpcy5kdW1wKCk7CgkJCXRoaXMuc2VsZWN0KCk7CgkJfQoJCXJldHVybiB0aGlzOwoJfQoJCgl0aGlzLmlzQ29sbGFwc2VkID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5yYW5nZSgpOwoJCXRoaXMuY29sbGFwc2VkID0gdGhpcy5yLml0ZW0gPyBmYWxzZSA6IHRoaXMuci5ib3VuZGluZ1dpZHRoID09IDA7CgkJcmV0dXJuIHRoaXMuY29sbGFwc2VkOwoJfQoJCgkvKioKCSAqICLQodGF0LvQvtC/0YvQstCw0LXRgiIg0LLRi9C00LXQu9C10L3QuNC1CgkgKgoJICogQHBhcmFtICBib29sICB0b1N0YXJ0IC0g0YHRhdC70L7Qv9GL0LLQsNGC0Ywg0LLRi9C00LXQu9C10L3QuNC1INC6INC90LDRh9Cw0LvRgyDQuNC70Lgg0Log0LrQvtC90YbRgwoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLmNvbGxhcHNlID0gZnVuY3Rpb24odG9TdGFydCkgewoJCXRoaXMucmFuZ2UoKTsKCQlpZiAodGhpcy5yLml0ZW0pIHsKCQkJdmFyIG4gPSB0aGlzLnIuaXRlbSgwKTsKCQkJdGhpcy5yID0gdGhpcy5ydGUuZG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7CgkJCXRoaXMuci5tb3ZlVG9FbGVtZW50VGV4dChuKTsKCQl9CgkJdGhpcy5yLmNvbGxhcHNlKHRvU3RhcnQpOwoJCXRoaXMuci5zZWxlY3QoKTsKCQl0aGlzLmNvbGxhcHNlZCA9IHRydWU7Cgl9CgoJdGhpcy5nZXRTdGFydCA9IGZ1bmN0aW9uKCkgewoJCXRoaXMucmFuZ2UoKTsKCQlpZiAodGhpcy5yLml0ZW0pIHsKCQkJcmV0dXJuIHRoaXMuci5pdGVtKDApOwoJCX0KCQl2YXIgciA9IHRoaXMuci5kdXBsaWNhdGUoKTsKCQlyLmNvbGxhcHNlKHRydWUpOwoJCXZhciBzID0gci5wYXJlbnRFbGVtZW50KCk7CgkJcmV0dXJuIHMgJiYgcy5ub2RlTmFtZSA9PSAnQk9EWScgPyBzLmZpcnN0Q2hpbGQgOiBzOwoJfQoJCgkKCXRoaXMuZ2V0RW5kID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5yYW5nZSgpOwoJCWlmICh0aGlzLnIuaXRlbSkgewoJCQlyZXR1cm4gdGhpcy5yLml0ZW0oMCk7CgkJfQoJCXZhciByID0gdGhpcy5yLmR1cGxpY2F0ZSgpOwoJCXIuY29sbGFwc2UoZmFsc2UpOwoJCXZhciBlID0gci5wYXJlbnRFbGVtZW50KCk7CgkJcmV0dXJuIGUgJiYgZS5ub2RlTmFtZSA9PSAnQk9EWScgPyBlLmxhc3RDaGlsZCA6IGU7Cgl9CgoJCgkvKioKCSAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC90LDRh2HQu9C+INCy0YvQtNC10LvQtdC90LjRjyDQvdCwINGD0LrQsNC30LDQvdGD0Y4g0L3QvtC00YMKCSAqCgkgKiBAcGFyYW0gIEVsZW1lbnQgIG5vZGUgICAg0L3QvtC00LAKCSAqIEBwYXJhbSAgTnVtYmVyICAgb2Zmc2V0ICDQvtGC0YHRgtGD0L8g0L7RgiDQvdCw0YfQsNC70LAg0L3QvtC00YsKCSAqIEByZXR1cm4gdm9pZAoJICoqLwoJdGhpcy5zZXRTdGFydCA9IGZ1bmN0aW9uKG5vZGUsIG9mZnNldCkgewoJCXRoaXMuc3RhcnRDb250YWluZXIgPSBub2RlOwoJCXRoaXMuc3RhcnRPZmZzZXQgICAgPSBvZmZzZXQ7CgkJaWYgKHRoaXMuZW5kQ29udGFpbmVyKSB7CgkJCXRoaXMuY29tbW9uQW5jZXN0b3JDb250YWluZXIgPSB0aGlzLnJ0ZS5kb20uZmluZENvbW1vbkFuY2VzdG9yKHRoaXMuc3RhcnRDb250YWluZXIsIHRoaXMuZW5kQ29udGFpbmVyKTsKCQl9Cgl9CgkKCS8qKgoJICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0LrQvtC90LXRhiDQstGL0LTQtdC70LXQvdC40Y8g0L3QsCDRg9C60LDQt9Cw0L3Rg9GOINC90L7QtNGDCgkgKgoJICogQHBhcmFtICBFbGVtZW50ICBub2RlICAgINC90L7QtNCwCgkgKiBAcGFyYW0gIE51bWJlciAgIG9mZnNldCAg0L7RgtGB0YLRg9C/INC+0YIg0LrQvtC90YbQsCDQvdC+0LTRiwoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLnNldEVuZCA9IGZ1bmN0aW9uKG5vZGUsIG9mZnNldCkgewoJCXRoaXMuZW5kQ29udGFpbmVyID0gbm9kZTsKCQl0aGlzLmVuZE9mZnNldCAgICA9IG9mZnNldDsKCQlpZiAodGhpcy5zdGFydENvbnRhaW5lcikgewoJCQl0aGlzLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyID0gdGhpcy5ydGUuZG9tLmZpbmRDb21tb25BbmNlc3Rvcih0aGlzLnN0YXJ0Q29udGFpbmVyLCB0aGlzLmVuZENvbnRhaW5lcik7CgkJfQoJfQoJCgkvKioKCSAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC90LDRh2HQu9C+INCy0YvQtNC10LvQtdC90LjRjyDQv9C10YDQtdC0INGD0LrQsNC30LDQvdC+0Lkg0L3QvtC00L7QuQoJICoKCSAqIEBwYXJhbSAgRWxlbWVudCAgbm9kZSAgICDQvdC+0LTQsAoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLnNldFN0YXJ0QmVmb3JlID0gZnVuY3Rpb24obikgewoJCWlmIChuLnBhcmVudE5vZGUpIHsKCQkJdGhpcy5zZXRTdGFydChuLnBhcmVudE5vZGUsIHRoaXMucnRlLmRvbS5pbmRleE9mKG4pKTsKCQl9Cgl9CgkKCS8qKgoJICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0L3QsNGHYdC70L4g0LLRi9C00LXQu9C10L3QuNGPINC/0L7RgdC70LUg0YPQutCw0LfQsNC90L7QuSDQvdC+0LTRiwoJICoKCSAqIEBwYXJhbSAgRWxlbWVudCAgbm9kZSAgICDQvdC+0LTQsAoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLnNldFN0YXJ0QWZ0ZXIgPSBmdW5jdGlvbihuKSB7CgkJaWYgKG4ucGFyZW50Tm9kZSkgewoJCQl0aGlzLnNldFN0YXJ0KG4ucGFyZW50Tm9kZSwgdGhpcy5ydGUuZG9tLmluZGV4T2YobikrMSk7CgkJfQoJfQoJCgkvKioKCSAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC60L7QvdC10YYg0LLRi9C00LXQu9C10L3QuNGPINC/0LXRgNC10LQg0YPQutCw0LfQsNC90L7QuSDQvdC+0LTQvtC5CgkgKgoJICogQHBhcmFtICBFbGVtZW50ICBub2RlICAgINC90L7QtNCwCgkgKiBAcmV0dXJuIHZvaWQKCSAqKi8KCXRoaXMuc2V0RW5kQmVmb3JlID0gZnVuY3Rpb24obikgewoJCWlmIChuLnBhcmVudE5vZGUpIHsKCQkJdGhpcy5zZXRFbmQobi5wYXJlbnROb2RlLCB0aGlzLnJ0ZS5kb20uaW5kZXhPZihuKSk7CgkJfQoJfQoJCgkvKioKCSAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC60L7QvdC10YYg0LLRi9C00LXQu9C10L3QuNGPINC/0L7RgdC70LUg0YPQutCw0LfQsNC90L7QuSDQvdC+0LTRiwoJICoKCSAqIEBwYXJhbSAgRWxlbWVudCAgbm9kZSAgICDQvdC+0LTQsAoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLnNldEVuZEFmdGVyID0gZnVuY3Rpb24obikgewoJCWlmIChuLnBhcmVudE5vZGUpIHsKCQkJdGhpcy5zZXRFbmQobi5wYXJlbnROb2RlLCB0aGlzLnJ0ZS5kb20uaW5kZXhPZihuKSsxKTsKCQl9Cgl9CgkKCS8qKgoJICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0L3QvtCy0L7QtSDQstGL0LTQtdC70LXQvdC40LUg0L/QvtGB0LvQtSDQuNC30LzQtdC90LXQvdC40LkKCSAqCgkgKiBAcmV0dXJuIHZvaWQKCSAqKi8KCXRoaXMuc2VsZWN0ID0gZnVuY3Rpb24oKSB7CgkJLy8gdGhhbmtzIHRpbnltaWNlIGF1dGhvcnMKCQlmdW5jdGlvbiBnZXRQb3MobiwgbykgewoJCQlpZiAobi5ub2RlVHlwZSAhPSAzKSB7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCQkJdmFyIGMgICA9J1x1RkVGRic7CgkJCXZhciB2YWwgPSBuLm5vZGVWYWx1ZTsKCQkJdmFyIHIgICA9IHNlbGYucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOwoJCQluLm5vZGVWYWx1ZSA9IHZhbC5zdWJzdHJpbmcoMCwgbykgKyBjICsgdmFsLnN1YnN0cmluZyhvKTsKCQkJci5tb3ZlVG9FbGVtZW50VGV4dChuLnBhcmVudE5vZGUpOwoJCQlyLmZpbmRUZXh0KGMpOwoJCQl2YXIgcCA9IE1hdGguYWJzKHIubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCAtMHhGRkZGRikpOwoJCQluLm5vZGVWYWx1ZSA9IHZhbDsKCQkJcmV0dXJuIHA7CgkJfTsKCQkKCQl0aGlzLnIgPSB0aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsgCgkJdmFyIHNvID0gdGhpcy5zdGFydE9mZnNldDsKCQl2YXIgZW8gPSB0aGlzLmVuZE9mZnNldDsKCQl2YXIgcyA9IHRoaXMuc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMSAKCQkJPyB0aGlzLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbTWF0aC5taW4oc28sIHRoaXMuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggLSAxKV0KCQkJOiB0aGlzLnN0YXJ0Q29udGFpbmVyOwoJCXZhciBlID0gdGhpcy5lbmRDb250YWluZXIubm9kZVR5cGUgPT0gMSAKCQkJPyB0aGlzLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzW01hdGgubWluKHNvID09IGVvID8gZW8gOiBlbyAtIDEsIHRoaXMuZW5kQ29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoIC0gMSldCgkJCTogdGhpcy5lbmRDb250YWluZXI7CgoJCWlmICh0aGlzLmNvbGxhcHNlZCkgewoJCQlpZiAocy5ub2RlVHlwZSA9PSAzKSB7CgkJCQl2YXIgcCA9IGdldFBvcyhzLCBzbyk7CgkJCQl0aGlzLnIubW92ZSgnY2hhcmFjdGVyJywgcCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLnIubW92ZVRvRWxlbWVudFRleHQocyk7CgkJCQl0aGlzLnIuY29sbGFwc2UodHJ1ZSk7CgkJCX0KCQl9IGVsc2UgewoJCQl2YXIgciAgPSB0aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsgCgkJCXZhciBzcCA9IGdldFBvcyhzLCBzbyk7CgkJCXZhciBlcCA9IGdldFBvcyhlLCBlbyk7CgkJCWlmIChzLm5vZGVUeXBlID09IDMpIHsKCQkJCXRoaXMuci5tb3ZlKCdjaGFyYWN0ZXInLCBzcCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLnIubW92ZVRvRWxlbWVudFRleHQocyk7CgkJCX0KCQkJaWYgKGUubm9kZVR5cGUgPT0gMykgewoJCQkJci5tb3ZlKCdjaGFyYWN0ZXInLCBlcCk7CgkJCX0gZWxzZSB7CgkJCQlyLm1vdmVUb0VsZW1lbnRUZXh0KGUpOwoJCQl9CgkJCXRoaXMuci5zZXRFbmRQb2ludCgnRW5kVG9FbmQnLCByKTsKCQl9CgkJCgkJdHJ5IHsKCQkJdGhpcy5yLnNlbGVjdCgpOwoJCX0gY2F0Y2goZSkgewoJCQkKCQl9CgkJaWYgKHIpIHsKCQkJciA9IG51bGw7CgkJfQoJfQoJCgl0aGlzLmR1bXAgPSBmdW5jdGlvbigpIHsKCQl0aGlzLnJ0ZS5sb2coJ2NvbGxhcHNlZDogJyt0aGlzLmNvbGxhcHNlZCk7CgkJLy90aGlzLnJ0ZS5sb2coJ2NvbW1vbkFuY2VzdG9yQ29udGFpbmVyOiAnK3RoaXMuY29tbW9uQW5jZXN0b3JDb250YWluZXIubm9kZU5hbWV8fCcjdGV4dCcpCgkJdGhpcy5ydGUubG9nKCdzdGFydENvbnRhaW5lcjogJysodGhpcy5zdGFydENvbnRhaW5lciA/IHRoaXMuc3RhcnRDb250YWluZXIubm9kZU5hbWUgOiAnbm9uJykpOwoJCXRoaXMucnRlLmxvZygnc3RhcnRPZmZzZXQ6ICcrdGhpcy5zdGFydE9mZnNldCk7CgkJdGhpcy5ydGUubG9nKCdlbmRDb250YWluZXI6ICcrKHRoaXMuZW5kQ29udGFpbmVyID8gdGhpcy5lbmRDb250YWluZXIubm9kZU5hbWUgOiAnbm9uZScpKTsKCQl0aGlzLnJ0ZS5sb2coJ2VuZE9mZnNldDogJyt0aGlzLmVuZE9mZnNldCk7Cgl9CgkKfQp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoJZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmFib3V0ID0gZnVuY3Rpb24ocnRlLCBuYW1lKSAgewoJCQoJCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQl0aGlzLmFjdGl2ZSAgPSB0cnVlOwoJCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCQl2YXIgb3B0cywgZCwgdHh0OwoJCQkKCQkJb3B0cyA9IHsKCQkJCXJ0bCA6IHJ0ZS5ydGwsCgkJCQlzdWJtaXQgOiBmdW5jdGlvbihlLCBkKSB7ICBkLmNsb3NlKCk7IH0sCgkJCQlkaWFsb2cgOiB7CgkJCQkJd2lkdGggOiA1NjAsCgkJCQkJdGl0bGUgOiB0aGlzLnJ0ZS5pMThuKCdBYm91dCB0aGlzIHNvZnR3YXJlJyksCgkJCQkJYnV0dG9ucyAgICAgOiB7CgkJCQkJCU9rIDogZnVuY3Rpb24oKSB7ICQodGhpcykuZGlhbG9nKCdkZXN0cm95Jyk7IH0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCXR4dCA9ICc8ZGl2IGNsYXNzPSJlbHJ0ZS1sb2dvIj48L2Rpdj48aDM+Jyt0aGlzLnJ0ZS5pMThuKCdBYm91dCBlbFJURScpKyc8L2gzPjxiciBjbGVhcj0iYWxsIi8+JwoJCQkJKyc8ZGl2IGNsYXNzPSJlbHJ0ZS12ZXIiPicrdGhpcy5ydGUuaTE4bignVmVyc2lvbicpKyc6ICcrdGhpcy5ydGUudmVyc2lvbisnICgnK3RoaXMucnRlLmJ1aWxkKycpPC9kaXY+JyAKCQkJCSsnPGRpdiBjbGFzcz0iZWxydGUtdmVyIj5qUXVlcnk6ICcrJCgnPGRpdi8+JykuanF1ZXJ5Kyc8L2Rpdj4nIAoJCQkJKyc8ZGl2IGNsYXNzPSJlbHJ0ZS12ZXIiPmpRdWVyeVVJOiAnKyQudWkudmVyc2lvbisnPC9kaXY+JyAKCQkJCSsnPGRpdiBjbGFzcz0iZWxydGUtdmVyIj4nK3RoaXMucnRlLmkxOG4oJ0xpY2VuY2UnKSsnOiBCU0QgTGljZW5jZTwvZGl2PicKCQkJCSsnPHA+JwoJCQkJK3RoaXMucnRlLmkxOG4oJ2VsUlRFIGlzIGFuIG9wZW4tc291cmNlIEphdmFTY3JpcHQgYmFzZWQgV1lTSVdZRyBIVE1MLWVkaXRvci4nKSsnPGJyLz4nCgkJCQkrdGhpcy5ydGUuaTE4bignTWFpbiBnb2FsIG9mIHRoZSBlZGl0b3IgLSBzaW1wbGlmeSB3b3JrIHdpdGggdGV4dCBhbmQgZm9ybWF0aW5nIChIVE1MKSBvbiBzaXRlcywgYmxvZ3MsIGZvcnVtcyBhbmQgb3RoZXIgb25saW5lIHNlcnZpY2VzLicpKyc8YnIvPicKCQkJCSt0aGlzLnJ0ZS5pMThuKCdZb3UgY2FuIHVzZSBpdCBpbiBhbnkgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCBwcm9qZWN0cy4nKQoJCQkJKyc8L3A+JwoJCQkJKyc8aDQ+Jyt0aGlzLnJ0ZS5pMThuKCdBdXRob3JzJykrJzwvaDQ+JwoJCQkJKyc8dGFibGUgY2xhc3M9ImVscnRlLWF1dGhvcnMiPicKCQkJCSsnPHRyPjx0ZD5EbWl0cnkgKGRpbykgTGV2YXNob3YgJmx0O2Rpb0BzdGQ0Mi5ydSZndDs8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ0NoaWVmIGRldmVsb3BlcicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlRyb2V4IE5ldmVsaW4gJmx0O3Ryb2V4QGZ1cnkuc2NhbmNvZGUucnUmZ3Q7PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdEZXZlbG9wZXIsIHRlY2ggc3VwcG9ydCcpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlZhbGVudGluIFJhenVtbnloICZsdDtjb250ZW50QHN0ZDQyLnJ1Jmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignSW50ZXJmYWNlIGRlc2lnbmVyJykrJzwvdGQ+PC90cj4nCgkJCQkrJzx0cj48dGQ+RXZnZW55IGVTYWJiYXRoICZsdDtzYWJiYXRoLmNvZGVtZ0BnbWFpbC5jb20mZ3Q7PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdEZXZlbG9wZXInKSsnPC90ZD48L3RyPicKCQkJCSsnPHRyPjx0ZD5BbmRyemVqIEJvcm93aWN6ICZsdDtlbHRyZUBib3Jvd2ljei5pbmZvJmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignUG9saXNoIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPkFydGVtIFZhc2lsaWV2PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdVa3JhbmlhbiBsb2NhbGl6YXRpb24nKSsnPC90ZD48L3RyPicKCQkJCSsnPHRyPjx0ZD5GcmFuY29pcyBNYXplcm9sbGUgJmx0O2ZtYXowMDhAZ21haWwuY29tJmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignRnJlbmNoIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPkt1cnQgQWVydHM8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ0R1dGNoIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPk1pY2hhbCBNYXJlayAmbHQ7Zm1pY2gubWFyZWtAZ21haWwuY29tJmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignQ3plY2ggbG9jYWxpemF0aW9uJykrJzwvdGQ+PC90cj4nCgkJCQkrJzx0cj48dGQ+UmljYXJkbyBPYnJlZ8OzbiAmbHQ7cm9icmVnb25tQGdtYWlsLmNvbSZndDs8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ1NwYW5pc2ggbG9jYWxpemF0aW9uJykrJzwvdGQ+PC90cj4nCgkJCQkrJzx0cj48dGQ+U2FsZWggU291emFuY2hpICZsdDtzYWxlaC5zb3V6YW5jaGlAZ21haWwuY29tJmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignUGVyc2lhbiAoZmFyc2kpIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlRhd2ZlayBEYWdoaXN0YW5pICZsdDt0YXdmZWtvdkBnbWFpbC5jb20mZ3Q7PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdBcmFiaWMgbG9jYWxpemF0aW9uJykrJywgJyt0aGlzLnJ0ZS5pMThuKCdSVEwgc3VwcG9ydCcpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlRhZCAmbHQ7dGFkMDYxNkBnbWFpbC5jb20mZ3Q7PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdUcmFkaXRpb25hbCBDaGluZXNlIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlRvbW9ha2kgWW9zaGlkYSAmbHQ7aW5mb0B5b3NoaWRhLXN0dWRpby5qcCZndDs8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ0phcGFuZXNlIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlVsZGlzIFBsb3RpxYbFoSAmbHQ7dWxkaXMucGxvdGluc0BnbWFpbC5jb20mZ3Q7PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdMYXR2aWFuIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlZhc2lsaXkgUmF6dW1ueWggJmx0O3J2bkBzdGQ0Mi5ydSZndDs8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ0dlcm1hbiBsb2NhbGl6YXRpb24nKSsnPC90ZD48L3RyPicKCQkJCSsnPHRyPjx0ZD5WaWt0b3IgVGFtYXMgJmx0O3RhbWFzLnZpa3RvckB0b3RhbHN0dWRpby5odSZndDs8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ0h1bmdhcmlhbiBsb2NhbGl6YXRpb24nKSsnPC90ZD48L3RyPicKCQkJCSsnPHRyPjx0ZD5VZ28gUHVuem9sbywgJmx0O3NhZHJhY3plcm91bm9AZ21haWwuY29tJmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignSXRhbGlhbiBsb2NhbGl6YXRpb24nKSsnPC90ZD48L3RyPicKCQkJCSsnPC90YWJsZT4nCgkJCQkrJzxkaXYgY2xhc3M9ImVscnRlLWNvcHkiPkNvcHlyaWdodCAmY29weTsgMjAwOS0yMDEwLCA8YSBocmVmPSJodHRwOi8vd3d3LnN0ZDQyLnJ1Ij5TdHVkaW8gNDIgTFREPC9hPjwvZGl2PicKCQkJCSsnPGRpdiBjbGFzcz0iZWxydGUtY29weSI+Jyt0aGlzLnJ0ZS5pMThuKCdGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNvZnR3YXJlIHZpc2l0IHRoZScpKycgPGEgaHJlZj0iaHR0cDovL2VscnRlLm9yZyI+Jyt0aGlzLnJ0ZS5pMThuKCdlbFJURSB3ZWJzaXRlJykrJy48L2E+PC9kaXY+JwoJCQkJKyc8ZGl2IGNsYXNzPSJlbHJ0ZS1jb3B5Ij5Ud2l0dGVyOiA8YSBocmVmPSJodHRwOi8vdHdpdHRlci5jb20vZWxydGVfZWxmaW5kZXIiPmVscnRlX2VsZmluZGVyPC9hPjwvZGl2Pic7CgkJCQoJCQlkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKTsKCQkJZC5hcHBlbmQodHh0KTsKCQkJZC5vcGVuKCk7CgkJfQoJCQoJCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl9CgkJCgl9CgkKfSkoalF1ZXJ5KTsKLyoqCiAqIEBjbGFzcyDQutC90L7Qv9C60LAgLSDQl9Cw0LrQu9Cw0LTQutCwICjQvtGC0LrRgNGL0LLQsNC10YIg0LTQuNCw0LvQvtCz0L7QstC+0LUg0L7QutC90L4pCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmFuY2hvciA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdGhpcy5pbnB1dCA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ25hbWUnLCAnYW5jaG9yJykuYXR0cignc2l6ZScsICcxNicpCgl2YXIgc2VsZiA9IHRoaXM7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXZhciBvcHRzID0gewoJCQlydGwgOiB0aGlzLnJ0ZS5ydGwsCgkJCXN1Ym1pdCA6IGZ1bmN0aW9uKGUsIGQpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyBkLmNsb3NlKCk7IHNlbGYuc2V0KCk7ICB9LAoJCQlkaWFsb2cgOiB7CgkJCQl0aXRsZSA6IHRoaXMucnRlLmkxOG4oJ0Jvb2ttYXJrJykKCQkJfQoJCX0KCgkJCgkJdGhpcy5hbmNob3IgPSB0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50QW5jaG9yKHRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSkgfHwgcnRlLmRvbS5jcmVhdGUoJ2EnKTsKCQkhdGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpICYmIHRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZShmYWxzZSk7CgkJdGhpcy5pbnB1dC52YWwoJCh0aGlzLmFuY2hvcikuYWRkQ2xhc3MoJ2VsLXJ0ZS1hbmNob3InKS5hdHRyKCduYW1lJykpOwoJCXRoaXMucnRlLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpOwoJCXZhciBkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKTsKCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQm9va21hcmsgbmFtZScpLCB0aGlzLmlucHV0XSwgbnVsbCwgdHJ1ZSkub3BlbigpOwoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGYuaW5wdXQuZm9jdXMoKX0sIDIwKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJaWYgKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnRMaW5rKG4pKSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9IGVsc2UgaWYgKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnRBbmNob3IobikpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpLmFkZENsYXNzKCdhY3RpdmUnKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCX0KCQoJdGhpcy5zZXQgPSBmdW5jdGlvbigpIHsKCQl2YXIgbiA9ICQudHJpbSh0aGlzLmlucHV0LnZhbCgpKTsKCgkJaWYgKG4pIHsKCQkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQkJaWYgKCF0aGlzLmFuY2hvci5wYXJlbnROb2RlKSB7CgkJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0SHRtbCgnPGEgbmFtZT0iJytuKyciIHRpdGxlPSInK3RoaXMucnRlLmkxOG4oJ0Jvb2ttYXJrJykrJzogJytuKyciIGNsYXNzPSJlbC1ydGUtYW5jaG9yIj48L2E+Jyk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmFuY2hvci5uYW1lID0gbjsKCQkJCXRoaXMuYW5jaG9yLnRpdGxlID0gdGhpcy5ydGUuaTE4bignQm9va21hcmsnKSsnOiAnK247CgkJCX0KCQl9IGVsc2UgaWYgKHRoaXMuYW5jaG9yLnBhcmVudE5vZGUpIHsKCQkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQkJdGhpcy5hbmNob3IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmFuY2hvcik7CgkJfQoJfQp9Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3Mg0LrQvdC+0L/QutCwIC0g0KbQuNGC0LDRgtCwCiAqINCV0YHQu9C4INCy0YvQtNC10LvQtdC90LjQtSDRgdGF0LvQvtC/0L3Rg9GC0L4g0Lgg0L3QsNGF0L7QtNC40YLRgdGPINCy0L3Rg9GC0YDQuCDRhtC40YLQsNGC0YsgLSDQvtC90LAg0YPQtNCw0LvRj9C10YLRgdGPCiAqINCd0L7QstGL0LUg0YbQuNGC0LDRgtGLINGB0L7Qt9C00LDRjtGC0YHRjyDRgtC+0LvRjNC60L4g0LjQtyDQvdC10YHRhdC70L7Qv9C90YPRgtC+0LPQviDQstGL0LTQtdC70LXQvdC40Y8KICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmJsb2NrcXVvdGUgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdmFyIG4sIG5vZGVzOwoJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJaWYgKHRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSAmJiAobiA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15CTE9DS1FVT1RFJC8pKSkgewoJCQkkKG4pLnJlcGxhY2VXaXRoKCQobikuaHRtbCgpKTsKCQl9IGVsc2UgewoJCQlub2RlcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7d3JhcCA6ICdhbGwnLCB0YWcgOiAnYmxvY2txdW90ZSd9KTsKCQkJbm9kZXMubGVuZ3RoICYmIHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3Qobm9kZXNbMF0sIG5vZGVzW25vZGVzLmxlbmd0aC0xXSk7CgkJfQoJCXRoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpKSB7CgkJCWlmICh0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksIC9eQkxPQ0tRVU9URSQvKSkgewoJCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpLmFkZENsYXNzKCdhY3RpdmUnKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CgkJCX0KCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkIGFjdGl2ZScpOwoJCX0KCX0KfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzINC60L3QvtC/0LrQuCAi0LrQvtC/0LjRgNC+0LLQsNGC0Ywv0LLRi9GA0LXQt9Cw0YLRjC/QstGB0YLQsNCy0LjRgtGMIiAKICog0LIgZmlyZWZveCDQv9C+0LrQsNC30YvQstCw0LXRgiDQv9GA0LXQtNC70L7QttC10L3QuNC1INC90LDQttCw0YLRjCBDdGwrYywg0LIg0L7RgdGC0LDQu9GM0L3Ri9GFIC0g0LrQvtC/0LjRgNGD0LXRggogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuY29weSA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQkKCQlpZiAodGhpcy5ydGUuYnJvd3Nlci5tb3ppbGxhKSB7CgkJCXRyeSB7CgkJCQl0aGlzLnJ0ZS5kb2MuZXhlY0NvbW1hbmQodGhpcy5uYW1lLCBmYWxzZSwgbnVsbCk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXZhciBzID0gJyBDdGwgKyBDJzsKCQkJCWlmICh0aGlzLm5hbWUgPT0gJ2N1dCcpIHsKCQkJCQlzID0gJyBDdGwgKyBYJzsKCQkJCX0gZWxzZSBpZiAodGhpcy5uYW1lID09ICdwYXN0ZScpIHsKCQkJCQlzID0gJyBDdGwgKyBWJzsKCQkJCX0KCQkJCXZhciBvcHRzID0gewoJCQkJCWRpYWxvZyA6IHsKCQkJCQkJdGl0bGUgICA6IHRoaXMucnRlLmkxOG4oJ1dhcm5pbmcnKSwKCQkJCQkJYnV0dG9ucyA6IHsgT2sgOiBmdW5jdGlvbigpIHsgJCh0aGlzKS5kaWFsb2coJ2Nsb3NlJyk7IH0gfQoJCQkJCX0KCQkJCX0KCgkJCQl2YXIgZCA9IG5ldyBlbERpYWxvZ0Zvcm0ob3B0cyk7CgkJCQlkLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdUaGlzIG9wZXJhdGlvbiBpcyBkaXNhYmxlZCBpbiB5b3VyIGJyb3dzZXIgb24gc2VjdXJpdHkgcmVhc29uLiBVc2Ugc2hvcnRjdXQgaW5zdGVhZC4nKSsnOiAnK3MpLm9wZW4oKTsKCQkJfQoJCX0gZWxzZSB7CgkJCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbW1hbmQuY2FsbCh0aGlzKTsKCQl9Cgl9Cn0KCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5jdXQgICA9IGVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5jb3B5OwplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMucGFzdGUgPSBlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuY29weTsKCn0pKGpRdWVyeSk7KGZ1bmN0aW9uKCQpIHsKCQoJZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmNzcyA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJCXZhciBzZWxmID0gdGhpczsKCQl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7CgkJdGhpcy5jc3NTdHlsZSA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI0MiIgbmFtZT0ic3R5bGUiIC8+Jyk7CgkJdGhpcy5jc3NDbGFzcyA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI0MiIgbmFtZT0iY2xhc3MiIC8+Jyk7CgkJCgkJCgkJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJCXZhciBuID0gdGhpcy5ub2RlKCksIG9wdHM7CgkJCXRoaXMucnRlLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpOwoJCQlpZiAobikgewoJCQkJdmFyIG9wdHMgPSB7CgkJCQkJCgkJCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IGQuY2xvc2UoKTsgc2VsZi5zZXQoKTsgIH0sCgkJCQkJZGlhbG9nIDogewoJCQkJCQl0aXRsZSA6IHRoaXMucnRlLmkxOG4oJ1N0eWxlJyksCgkJCQkJCXdpZHRoIDogNDUwLAoJCQkJCQlyZXNpemFibGUgOiB0cnVlLAoJCQkJCQltb2RhbCA6IHRydWUKCQkJCQl9CgkJCQl9CgkJCQl0aGlzLmNzc1N0eWxlLnZhbCgkKG4pLmF0dHIoJ3N0eWxlJykpOwoJCQkJdGhpcy5jc3NDbGFzcy52YWwoJChuKS5hdHRyKCdjbGFzcycpKTsKCQkJCXZhciBkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKTsKCQkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdDc3Mgc3R5bGUnKSwgdGhpcy5jc3NTdHlsZV0sIG51bGwsIHRydWUpCgkJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQ3NzIGNsYXNzJyksIHRoaXMuY3NzQ2xhc3NdLCBudWxsLCB0cnVlKS5vcGVuKCk7CgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxmLmNzc1N0eWxlLmZvY3VzKCkgfSwgMjApCgkJCX0KCQl9CgkJCgkJdGhpcy5zZXQgPSBmdW5jdGlvbigpIHsKCQkJdmFyIG4gPSB0aGlzLm5vZGUoKTsKCQkJdGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJCWlmIChuKSB7CgkJCQkkKG4pLmF0dHIoJ3N0eWxlJywgdGhpcy5jc3NTdHlsZS52YWwoKSk7CgkJCQkkKG4pLmF0dHIoJ2NsYXNzJywgdGhpcy5jc3NDbGFzcy52YWwoKSk7CgkJCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCQkJfQoJCX0KCQkKCQl0aGlzLm5vZGUgPSBmdW5jdGlvbigpIHsKCQkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpOwoJCQlpZiAobi5ub2RlVHlwZSA9PSAzKSB7CgkJCQluID0gbi5wYXJlbnROb2RlOwoJCQl9CgkJCXJldHVybiBuLm5vZGVUeXBlID09IDEgJiYgbi5ub2RlTmFtZSAhPSAnQk9EWScgPyBuIDogbnVsbDsKCQl9CgkJCgkJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQkJdGhpcy5kb21FbGVtLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsIHRoaXMubm9kZSgpP2ZhbHNlOnRydWUpOwoJCX0KCQkKCX0KCQp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoJLyoqCgkgKiBAY2xhc3MgYnV0dG9uIC0gcmlnaHQgdG8gbGVmdCBkaXJlY3Rpb24gKG5vdCB3b3JrIHlldCB3aXRoIHRleHQgbm9kZXMgaW4gYm9keSkKCSAqCgkgKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAoJICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCgkgKgoJICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQoJICogQ29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKCSAqKi8KCWVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5ydGwgPSBmdW5jdGlvbihydGUsIG5hbWUpICB7CgkJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCXZhciBzZWxmID0gdGhpczsKCQoJCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksIHNlbGYgPSB0aGlzOwoJCQlpZiAoJChuKS5hdHRyKCdkaXInKSA9PSAncnRsJyB8fCAkKG4pLnBhcmVudHMoJ1tkaXI9InJ0bCJdJykubGVuZ3RoIHx8ICQobikuZmluZCgnW2Rpcj0icnRsIl0nKS5sZW5ndGgpIHsKCQkJCSQobikucmVtb3ZlQXR0cignZGlyJyk7CgkJCQkkKG4pLnBhcmVudHMoJ1tkaXI9InJ0bCJdJykucmVtb3ZlQXR0cignZGlyJyk7CgkJCQkkKG4pLmZpbmQoJ1tkaXI9InJ0bCJdJykucmVtb3ZlQXR0cignZGlyJyk7CgkJCX0gZWxzZSB7CgkJCQlpZiAodGhpcy5ydGUuZG9tLmlzKG4sICd0ZXh0Tm9kZXMnKSAmJiB0aGlzLnJ0ZS5kb20uaXMobiwgJ2Jsb2NrJykpIHsKCQkJCQkkKG4pLmF0dHIoJ2RpcicsICdydGwnKTsKCQkJCX0gZWxzZSB7CgkJCQkJJC5lYWNoKHRoaXMucnRlLmRvbS5wYXJlbnRzKG4sICd0ZXh0Tm9kZXMnKSwgZnVuY3Rpb24oaSwgbikgewoJCQkJCQlpZiAoc2VsZi5ydGUuZG9tLmlzKG4sICdibG9jaycpKSB7CgkJCQkJCQkkKG4pLmF0dHIoJ2RpcicsICdydGwnKTsKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfQoJCQl9CgkJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCX0KCgkJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpOwoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJCWlmICgkKG4pLmF0dHIoJ2RpcicpID09ICdydGwnIHx8ICQobikucGFyZW50cygnW2Rpcj0icnRsIl0nKS5sZW5ndGggfHwgJChuKS5maW5kKCdbZGlyPSJydGwiXScpLmxlbmd0aCkgewoJCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdhY3RpdmUnKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CgkJCX0KCQl9Cgl9CgkKCS8qKgoJICogQGNsYXNzIGJ1dHRvbiAtIGxlZnQgdG8gcmlnaHQgZGlyZWN0aW9uIChub3Qgd29yayB5ZXQgd2l0aCB0ZXh0IG5vZGVzIGluIGJvZHkpCgkgKgoJICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKCSAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAoJICoKCSAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKCSAqIENvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CgkgKiovCgllbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMubHRyID0gZnVuY3Rpb24ocnRlLCBuYW1lKSAgewoJCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQl2YXIgc2VsZiA9IHRoaXM7CgkKCQl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCBzZWxmID0gdGhpczsKCQkJaWYgKCQobikuYXR0cignZGlyJykgPT0gJ2x0cicgfHwgJChuKS5wYXJlbnRzKCdbZGlyPSJsdHIiXScpLmxlbmd0aCB8fCAkKG4pLmZpbmQoJ1tkaXI9Imx0ciJdJykubGVuZ3RoKSB7CgkJCQkkKG4pLnJlbW92ZUF0dHIoJ2RpcicpOwoJCQkJJChuKS5wYXJlbnRzKCdbZGlyPSJsdHIiXScpLnJlbW92ZUF0dHIoJ2RpcicpOwoJCQkJJChuKS5maW5kKCdbZGlyPSJsdHIiXScpLnJlbW92ZUF0dHIoJ2RpcicpOwoJCQl9IGVsc2UgewoJCQkJaWYgKHRoaXMucnRlLmRvbS5pcyhuLCAndGV4dE5vZGVzJykgJiYgdGhpcy5ydGUuZG9tLmlzKG4sICdibG9jaycpKSB7CgkJCQkJJChuKS5hdHRyKCdkaXInLCAnbHRyJyk7CgkJCQl9IGVsc2UgewoJCQkJCSQuZWFjaCh0aGlzLnJ0ZS5kb20ucGFyZW50cyhuLCAndGV4dE5vZGVzJyksIGZ1bmN0aW9uKGksIG4pIHsKCQkJCQkJaWYgKHNlbGYucnRlLmRvbS5pcyhuLCAnYmxvY2snKSkgewoJCQkJCQkJJChuKS5hdHRyKCdkaXInLCAnbHRyJyk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJfQoJCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCQl9CgoJCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJCXZhciBuID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCQlpZiAoJChuKS5hdHRyKCdkaXInKSA9PSAnbHRyJyB8fCAkKG4pLnBhcmVudHMoJ1tkaXI9Imx0ciJdJykubGVuZ3RoIHx8ICQobikuZmluZCgnW2Rpcj0ibHRyIl0nKS5sZW5ndGgpIHsKCQkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnYWN0aXZlJyk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCQl9CgkJfQoJfQoJCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyDQutC90L7Qv9C60LAgLSBESVYKICog0JXRgdC70Lgg0LLRi9C00LXQu9C10L3QuNC1INGB0YXQu9C+0L/QvdGD0YLQviDQuCDQvdCw0YXQvtC00LjRgtGB0Y8g0LLQvdGD0YLRgNC4IGRpdidhIC0g0L7QvSDRg9C00LDQu9GP0LXRgtGB0Y8KICog0J3QvtCy0YvQtSBkaXYn0Ysg0YHQvtC30LTQsNGO0YLRgdGPINGC0L7Qu9GM0LrQviDQuNC3INC90LXRgdGF0LvQvtC/0L3Rg9GC0L7Qs9C+INCy0YvQtNC10LvQtdC90LjRjwogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICogCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZGl2ID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXZhciBuLCBub2RlczsKCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoKCQlpZiAodGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpKSB7CgkJCW4gPSB0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksIC9eRElWJC8pOwoJCQlpZiAobikgewoJCQkJJChuKS5yZXBsYWNlV2l0aCgkKG4pLmh0bWwoKSk7CgkJCX0KCQl9IGVsc2UgewoJCQlub2RlcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7d3JhcCA6ICdhbGwnLCB0YWcgOiAnZGl2J30pOwoJCQlub2Rlcy5sZW5ndGggJiYgdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdChub2Rlc1swXSwgbm9kZXNbbm9kZXMubGVuZ3RoLTFdKTsKCQl9CgkJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLnJ0ZS5zZWxlY3Rpb24uY29sbGFwc2VkKCkpIHsKCQkJaWYgKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15ESVYkLykpIHsKCQkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKS5hZGRDbGFzcygnYWN0aXZlJyk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoJ2Rpc2FibGVkIGFjdGl2ZScpOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCBhY3RpdmUnKTsKCQl9Cgl9Cn0KfSkoalF1ZXJ5KTsKLyoqCiAqIEBjbGFzcyDQutC90L7Qv9C60LAgLSDQktC60LvRjtGH0LXQvdC40LUv0LLRi9C60LvRjtGH0LXQvdC40LUg0L/QvtC60LDQt9CwINGB0YLRgNGD0LrRgtGD0YDRiyDQtNC+0LrRg9C80LXQvdGC0LAKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqIAogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5kb2NzdHJ1Y3R1cmUgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5kb21FbGVtLnRvZ2dsZUNsYXNzKCdhY3RpdmUnKTsKCQkkKHRoaXMucnRlLmRvYy5ib2R5KS50b2dnbGVDbGFzcygnZWwtcnRlLXN0cnVjdHVyZScpOwoJfQoJdGhpcy5jb21tYW5kKCk7CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CQoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCX0KfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIG9wZW4gZWxmaW5kZXIgd2luZG93IChub3QgbmVlZGVkIGZvciBpbWFnZSBvciBsaW5rIGJ1dHRvbnMpLlVzZWQgaW4gRUxET1JBRE8uQ01TIGZvciBlYXN5IGZpbGUgbWFuaXB1bGF0aW9ucy4KICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmVsZmluZGVyID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl2YXIgc2VsZiA9IHRoaXM7Cgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQlpZiAoc2VsZi5ydGUub3B0aW9ucy5mbUFsbG93ICYmIHR5cGVvZihzZWxmLnJ0ZS5vcHRpb25zLmZtT3BlbikgPT0gJ2Z1bmN0aW9uJykgewoJCQlzZWxmLnJ0ZS5vcHRpb25zLmZtT3BlbiggZnVuY3Rpb24odXJsKSB7IHNlbGYucnRlLmxvZyh1cmwpIH0gKTsKCQl9Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJaWYgKHNlbGYucnRlLm9wdGlvbnMuZm1BbGxvdyAmJiB0eXBlb2Yoc2VsZi5ydGUub3B0aW9ucy5mbU9wZW4pID09ICdmdW5jdGlvbicpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KCn0pKGpRdWVyeSk7KGZ1bmN0aW9uKCQpIHsKCQoJZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZsYXNoID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7CgkJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCXZhciBzZWxmID0gdGhpczsKCQl0aGlzLnN3ZiA9IG51bGw7CgkJdGhpcy5wbGFjZWhvbGRlciA9IG51bGw7CgkJdGhpcy5zcmMgPSB7CgkJCXVybCAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1cmwiIC8+JykuY3NzKCd3aWR0aCcsICc5OSUnKSwKCQkJdHlwZSAgIDogJCgnPHNlbGVjdCBuYW1lPSJ0eXBlIi8+JykKCQkJCQkJLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giPkZsYXNoPC9vcHRpb24+JykKCQkJCQkJLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0idmlkZW8vcXVpY2t0aW1lIj5RdWlja3RpbWUgbW92aWU8L29wdGlvbj4nKQoJCQkJCQkuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyIj5XaW5kb3dzIG1lZGlhPC9vcHRpb24+JyksCgkJCXdpZHRoICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ3NpemUnLCA1KS5jc3MoJ3RleHQtYWxpZ24nLCAncmlnaHQnKSwKCQkJaGVpZ2h0IDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cignc2l6ZScsIDUpLmNzcygndGV4dC1hbGlnbicsICdyaWdodCcpLAoJCQl3bW9kZSAgOiAkKCc8c2VsZWN0IC8+JykKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCcnKS50ZXh0KHRoaXMucnRlLmkxOG4oJ05vdCBzZXQnLCAnZGlhbG9ncycpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd0cmFuc3BhcmVudCcpLnRleHQodGhpcy5ydGUuaTE4bignVHJhbnNwYXJlbnQnKSkpLAoJCQlhbGlnbiAgOiAkKCc8c2VsZWN0IC8+JykKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCcnKS50ZXh0KHRoaXMucnRlLmkxOG4oJ05vdCBzZXQnLCAnZGlhbG9ncycpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdsZWZ0JyAgICAgICApLnRleHQodGhpcy5ydGUuaTE4bignTGVmdCcpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdyaWdodCcgICAgICApLnRleHQodGhpcy5ydGUuaTE4bignUmlnaHQnKSkpCgkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgndG9wJyAgICAgICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ1RvcCcpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd0ZXh0LXRvcCcgICApLnRleHQodGhpcy5ydGUuaTE4bignVGV4dCB0b3AnKSkpCgkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnbWlkZGxlJyAgICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ21pZGRsZScpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdiYXNlbGluZScgICApLnRleHQodGhpcy5ydGUuaTE4bignQmFzZWxpbmUnKSkpCgkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnYm90dG9tJyAgICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ0JvdHRvbScpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd0ZXh0LWJvdHRvbScpLnRleHQodGhpcy5ydGUuaTE4bignVGV4dCBib3R0b20nKSkpLAoJCQltYXJnaW4gOiAkKCc8ZGl2IC8+JykKCQl9CgkJCgkJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgoJCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSwgb3B0cywgdXJsPScnLCB3PScnLCBoPScnLCBmLCBhLCBkLCBtaWQsIG8sIHdtOwoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCQkJdGhpcy5zcmMubWFyZ2luLmVsUGFkZGluZ0lucHV0KHsgdHlwZSA6ICdtYXJnaW4nIH0pOwoJCQl0aGlzLnBsYWNlaG9sZGVyID0gbnVsbDsKCQkJdGhpcy5zd2YgPSBudWxsOwoJCQlpZiAoJChuKS5oYXNDbGFzcygnZWxydGUtbWVkaWEnKSAmJiAobWlkID0gJChuKS5hdHRyKCdyZWwnKSkgJiYgIHRoaXMucnRlLmZpbHRlci5zY3JpcHRzW21pZF0pIHsKCQkJCXRoaXMucGxhY2Vob2xkZXIgPSAkKG4pOwoJCQkJbyA9IHRoaXMucnRlLmZpbHRlci5zY3JpcHRzW21pZF07CgkJCQl1cmwgPSAnJzsKCQkJCWlmIChvLmVtYmVkICYmIG8uZW1iZWQuc3JjKSB7CgkJCQkJdXJsID0gby5lbWJlZC5zcmM7CgkJCQl9CgkJCQlpZiAoby5wYXJhbXMgJiYgby5wYXJhbXMubGVuZ3RoKSB7CgkJCQkJbCA9IG8ucGFyYW1zLmxlbmd0aDsKCQkJCQl3aGlsZSAobC0tKSB7CgkJCQkJCWlmIChvLnBhcmFtc1tsXS5uYW1lID09ICdzcmMnIHx8IG8ucGFyYW1zW2xdLm5hbWUgPT0gJ21vdmllJykgewoJCQkJCQkJdXJsID0gIG8ucGFyYW1zW2xdLnZhbHVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQlpZiAoby5lbWJlZCkgewoJCQkJCXcgPSBvLmVtYmVkLndpZHRofHxwYXJzZUludChvLmVtYmVkLnN0eWxlLndpZHRoKXx8Jyc7CgkJCQkJaCA9IG8uZW1iZWQuaGVpZ2h0fHxwYXJzZUludChvLmVtYmVkLnN0eWxlLmhlaWdodCl8fCcnOwoJCQkJCXdtID0gby5lbWJlZC53bW9kZXx8Jyc7CgkJCQl9IGVsc2UgaWYgKG8ub2JqKSB7CgkJCQkJdyA9IG8ub2JqLndpZHRofHxwYXJzZUludChvLm9iai5zdHlsZS53aWR0aCl8fCcnOwoJCQkJCWggPSBvLm9iai5oZWlnaHR8fHBhcnNlSW50KG8ub2JqLnN0eWxlLmhlaWdodCl8fCcnOwoJCQkJCXdtID0gby5vYmoud21vZGV8fCcnOwoJCQkJfQoJCQkJCgkJCQlpZiAoby5vYmopIHsKCQkJCQlmID0gby5vYmouc3R5bGVbJ2Zsb2F0J118fCcnOwoJCQkJCWEgPSBvLm9iai5zdHlsZVsndmVydGljYWwtYWxpZ24nXXx8Jyc7CgkJCQl9IGVsc2UgaWYgKG8uZW1iZWQpIHsKCQkJCQlmID0gby5lbWJlZC5zdHlsZVsnZmxvYXQnXXx8Jyc7CgkJCQkJYSA9IG8uZW1iZWQuc3R5bGVbJ3ZlcnRpY2FsLWFsaWduJ118fCcnOwoJCQkJfQoJCQkJdGhpcy5zcmMubWFyZ2luLnZhbChuKTsKCQkJCXRoaXMuc3JjLnR5cGUudmFsKG8uZW1iZWQgPyBvLmVtYmVkLnR5cGUgOiAnJyk7CgkJCX0KCQkJaWYgKCQobikuaGFzQ2xhc3MoJ2VscnRlLXN3Zi1wbGFjZWhvbGRlcicpKSB7CgkJCQl0aGlzLnBsYWNlaG9sZGVyID0gJChuKTsKCQkJCXVybCA9ICQobikuYXR0cigncmVsJyk7CgkJCQl3ID0gcGFyc2VJbnQoJChuKS5jc3MoJ3dpZHRoJykpfHwnJzsKCQkJCWggPSBwYXJzZUludCgkKG4pLmNzcygnaGVpZ2h0JykpfHwnJzsKCQkJCWYgPSAkKG4pLmNzcygnZmxvYXQnKTsKCQkJCWEgPSAkKG4pLmNzcygndmVydGljYWwtYWxpZ24nKTsKCQkJCXRoaXMuc3JjLm1hcmdpbi52YWwobik7CgkJCQl0aGlzLnNyYy53bW9kZS52YWwoJChuKS5hdHRyKCd3bW9kZScpKTsKCQkJfSAKCQkJdGhpcy5zcmMudXJsLnZhbCh1cmwpOwoJCQl0aGlzLnNyYy53aWR0aC52YWwodyk7CgkJCXRoaXMuc3JjLmhlaWdodC52YWwoaCk7CgkJCXRoaXMuc3JjLmFsaWduLnZhbChmfHxhKTsKCQkJdGhpcy5zcmMud21vZGUudmFsKHdtKTsKCQkJCgoJCQkKCgkJCXZhciBvcHRzID0gewoJCQkJcnRsIDogdGhpcy5ydGUucnRsLAoJCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuc2V0KCk7IGQuY2xvc2UoKTsgfSwKCQkJCWRpYWxvZyA6IHsKCQkJCQl3aWR0aCAgICA6IDU4MCwKCQkJCQlwb3NpdGlvbiA6ICd0b3AnLAoJCQkJCXRpdGxlICAgIDogdGhpcy5ydGUuaTE4bignRmxhc2gnKQoJCQkJfQoJCQl9CgkJCXZhciBkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKTsKCQkJCgkJCWlmICh0aGlzLnJ0ZS5vcHRpb25zLmZtQWxsb3cgJiYgdGhpcy5ydGUub3B0aW9ucy5mbU9wZW4pIHsKCQkJCXZhciBzcmMgPSAkKCc8c3BhbiAvPicpLmFwcGVuZCh0aGlzLnNyYy51cmwuY3NzKCd3aWR0aCcsICc4NSUnKSkKCQkJCQkJLmFwcGVuZCgKCQkJCQkJCSQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ3VpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCcpCgkJCQkJCQkJLmNzcyh7J2Zsb2F0JyA6ICdyaWdodCcsICdtYXJnaW4tcmlnaHQnIDogJzNweCd9KQoJCQkJCQkJCS5hdHRyKCd0aXRsZScsIHNlbGYucnRlLmkxOG4oJ09wZW4gZmlsZSBtYW5nZXInKSkKCQkJCQkJCQkuYXBwZW5kKCQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ3VpLWljb24gdWktaWNvbi1mb2xkZXItb3BlbicpKQoJCQkJCQkJCQkuY2xpY2soIGZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJc2VsZi5ydGUub3B0aW9ucy5mbU9wZW4oIGZ1bmN0aW9uKHVybCkgeyBzZWxmLnNyYy51cmwudmFsKHVybCkuY2hhbmdlKCk7IH0gKTsKCQkJCQkJCQkJfSkKCQkJCQkJCQkJLmhvdmVyKGZ1bmN0aW9uKCkgeyQodGhpcykuYWRkQ2xhc3MoJ3VpLXN0YXRlLWhvdmVyJyl9LCBmdW5jdGlvbigpIHsgJCh0aGlzKS5yZW1vdmVDbGFzcygndWktc3RhdGUtaG92ZXInKX0pCgkJCQkJCQkpOwoJCQl9IGVsc2UgewoJCQkJdmFyIHNyYyA9IHRoaXMuc3JjLnVybDsKCQkJfQoJCQkKCQkJZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ1VSTCcpLCBzcmNdLCBudWxsLCB0cnVlKTsKCQkJZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ1R5cGUnKSwgdGhpcy5zcmMudHlwZV0sIG51bGwsIHRydWUpOwoJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignU2l6ZScpLCAkKCc8c3BhbiAvPicpLmFwcGVuZCh0aGlzLnNyYy53aWR0aCkuYXBwZW5kKCcgeCAnKS5hcHBlbmQodGhpcy5zcmMuaGVpZ2h0KS5hcHBlbmQoJyBweCcpXSwgbnVsbCwgdHJ1ZSkKCQkJZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ1dtb2RlJyksIHRoaXMuc3JjLndtb2RlXSwgbnVsbCwgdHJ1ZSk7CgkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdBbGlnbm1lbnQnKSwgdGhpcy5zcmMuYWxpZ25dLCBudWxsLCB0cnVlKTsKCQkJZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ01hcmdpbnMnKSwgdGhpcy5zcmMubWFyZ2luXSwgbnVsbCwgdHJ1ZSk7CgkJCQoJCQkKCQkJCgkJCWQub3BlbigpOwoJCQlzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtzZWxmLnNyYy51cmwuZm9jdXMoKX0sIDEwMCkKCQkJCgkJCQoJCQl2YXIgZnMgPSAkKCc8ZmllbGRzZXQgLz4nKS5hcHBlbmQoJCgnPGxlZ2VuZCAvPicpLnRleHQodGhpcy5ydGUuaTE4bignUHJldmlldycpKSkKCQkJZC5hcHBlbmQoZnMsICdtYWluJyk7CgkJCXZhciBmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOwoJCQkkKGZyYW1lKS5hdHRyKCdzcmMnLCAnIycpLmFkZENsYXNzKCdlbC1ydGUtcHJldmlldycpLmFwcGVuZFRvKGZzKTsKCQkJaHRtbCA9IHRoaXMucnRlLm9wdGlvbnMuZG9jdHlwZSsnPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPjwvaGVhZD48Ym9keSBzdHlsZT0icGFkZGluZzowO21hcmdpbjowO2ZvbnQtc2l6ZTo5cHgiPiBQcm9pbiBlbGl0IGFyY3UsIHJ1dHJ1bSBjb21tb2RvLCB2ZWhpY3VsYSB0ZW1wdXMsIGNvbW1vZG8gYSwgcmlzdXMuIEN1cmFiaXR1ciBuZWMgYXJjdS4gRG9uZWMgc29sbGljaXR1ZGluIG1pIHNpdCBhbWV0IG1hdXJpcy4gTmFtIGVsZW1lbnR1bSBxdWFtIHVsbGFtY29ycGVyIGFudGUuIEV0aWFtIGFsaXF1ZXQgbWFzc2EgZXQgbG9yZW0uIE1hdXJpcyBkYXBpYnVzIGxhY3VzIGF1Y3RvciByaXN1cy4gQWVuZWFuIHRlbXBvciB1bGxhbWNvcnBlciBsZW8uIFZpdmFtdXMgc2VkIG1hZ25hIHF1aXMgbGlndWxhIGVsZWlmZW5kIGFkaXBpc2NpbmcuIER1aXMgb3JjaS4gQWxpcXVhbSBzb2RhbGVzIHRvcnRvciB2aXRhZSBpcHN1bS4gQWxpcXVhbSBudWxsYS4gRHVpcyBhbGlxdWFtIG1vbGVzdGllIGVyYXQuIFV0IGV0IG1hdXJpcyB2ZWwgcGVkZSB2YXJpdXMgc29sbGljaXR1ZGluPC9ib2R5PjwvaHRtbD4nOwoJCQlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50Lm9wZW4oKTsKCQkJZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShodG1sKTsKCQkJZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5jbG9zZSgpOwoJCQl0aGlzLmZyYW1lID0gZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDsKCQkJdGhpcy5wcmV2aWV3ID0gJChmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkpOwoJCQkgCQkJCSAKCQkJdGhpcy5zcmMudHlwZS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCQlzZWxmLnNyYy51cmwuY2hhbmdlKCk7CgkJCX0pOwoKCQkJdGhpcy5zcmMud2lkdGguY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQkJaWYgKHNlbGYuc3dmKSB7CgkJCQkJdmFyIHcgPSBwYXJzZUludCgkKHRoaXMpLnZhbCgpKXx8Jyc7CgkJCQkJJCh0aGlzKS52YWwodyk7CgkJCQkJc2VsZi5zd2YuY3NzKCd3aWR0aCcsIHcpOwoJCQkJCXNlbGYuc3dmLmNoaWxkcmVuKCdlbWJlZCcpLmNzcygnd2lkdGgnLCB3KTsKCQkJCX0gZWxzZSB7CgkJCQkJJCh0aGlzKS52YWwoJycpOwoJCQkJfQoJCQl9KTsKCgkJCXRoaXMuc3JjLmhlaWdodC5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCQlpZiAoc2VsZi5zd2YpIHsKCQkJCQl2YXIgaCA9IHBhcnNlSW50KCQodGhpcykudmFsKCkpfHwnJzsKCQkJCQkkKHRoaXMpLnZhbChoKTsKCQkJCQlzZWxmLnN3Zi5jc3MoJ2hlaWdodCcsIGgpOwoJCQkJCXNlbGYuc3dmLmNoaWxkcmVuKCdlbWJlZCcpLmNzcygnaGVpZ2h0JywgaCk7CgkJCQl9IGVsc2UgewoJCQkJCSQodGhpcykudmFsKCcnKTsKCQkJCX0KCQkJfSk7CgkJCQoJCQl0aGlzLnNyYy53bW9kZS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCQlpZiAoc2VsZi5zd2YpIHsKCQkJCQl2YXIgd20gPSAkKHRoaXMpLnZhbCgpOwoJCQkJCWlmICh3bSkgewoJCQkJCQlzZWxmLnN3Zi5hdHRyKCd3bW9kZScsIHdtKTsKCQkJCQkJc2VsZi5zd2YuY2hpbGRyZW4oJ2VtYmVkJykuYXR0cignd21vZGUnLCB3bSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5zd2YucmVtb3ZlQXR0cignd21vZGUnKTsKCQkJCQkJc2VsZi5zd2YuY2hpbGRyZW4oJ2VtYmVkJykucmVtb3ZlQXR0cignd21vZGUnKTsKCQkJCQl9CgkJCQl9CgkJCX0pOwoJCQkKCQkJdGhpcy5zcmMuYWxpZ24uY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQkJdmFyIHYgPSAkKHRoaXMpLnZhbCgpLCBmID0gdj09J2xlZnQnIHx8IHY9PSdyaWdodCc7CgkJCQlpZiAoc2VsZi5zd2YpIHsKCQkJCQlzZWxmLnN3Zi5jc3MoewoJCQkJCQknZmxvYXQnIDogZiA/IHYgOiAnJywKCQkJCQkJJ3ZlcnRpY2FsLWFsaWduJyA6IGYgPyAnJyA6IHYKCQkJCQl9KTsKCQkJCX0gZWxzZSB7CgkJCQkJJCh0aGlzKS52YWwoJycpOwoJCQkJfQoJCQl9KTsKCQkJCgkJCXRoaXMuc3JjLm1hcmdpbi5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCQlpZiAoc2VsZi5zd2YpIHsKCQkJCQl2YXIgbSA9IHNlbGYuc3JjLm1hcmdpbi52YWwoKTsKCQkJCQlpZiAobS5jc3MpIHsKCQkJCQkJc2VsZi5zd2YuY3NzKCdtYXJnaW4nLCBtLmNzcyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5zd2YuY3NzKCdtYXJnaW4tdG9wJywgbS50b3ApOwoJCQkJCQlzZWxmLnN3Zi5jc3MoJ21hcmdpbi1yaWdodCcsIG0ucmlnaHQpOwoJCQkJCQlzZWxmLnN3Zi5jc3MoJ21hcmdpbi1ib3R0b20nLCBtLmJvdHRvbSk7CgkJCQkJCXNlbGYuc3dmLmNzcygnbWFyZ2luLWxlZnQnLCBtLmxlZnQpOwkJCQkJCQoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJCQoJCQl0aGlzLnNyYy51cmwuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQkJdmFyIHVybCA9IHNlbGYucnRlLnV0aWxzLmFic29sdXRlVVJMKCQodGhpcykudmFsKCkpLCBpLCBzd2Y7CgkJCQlpZiAodXJsKSB7CgkJCQkJaSA9IHNlbGYucnRlLnV0aWxzLm1lZGlhSW5mbyhzZWxmLnNyYy50eXBlLnZhbCgpKTsKCQkJCQlpZiAoIWkpIHsKCQkJCQkJaSA9IHNlbGYucnRlLnV0aWwubWVkaWFJbmZvKCdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcpOwoJCQkJCX0KCQkJCQlzd2YgPSAnPG9iamVjdCBjbGFzc2lkPSInK2kuY2xhc3NpZCsnIiBjb2RlYmFzZT0iJytpLmNvZGViYXNlKyciPjxwYXJhbSBuYW1lPSJzcmMiIHZhbHVlPSInK3VybCsnIiAvPjxlbWJlZCBxdWFsaXR5PSJoaWdoIiBzcmM9IicrdXJsKyciIHR5cGU9IicraS50eXBlKyciPjwvb2JqZWN0Pic7CgkJCQkJc2VsZi5wcmV2aWV3LmNoaWxkcmVuKCdvYmplY3QnKS5yZW1vdmUoKS5lbmQoKS5wcmVwZW5kKHN3Zik7CgkJCQkJc2VsZi5zd2YgPSBzZWxmLnByZXZpZXcuY2hpbGRyZW4oJ29iamVjdCcpLmVxKDApOwoJCQkJfSBlbHNlIGlmIChzZWxmLnN3Zil7CgkJCQkJc2VsZi5zd2YucmVtb3ZlKCk7CgkJCQkJc2VsZi5zd2YgPSBudWxsOwoJCQkJfQoJCQkJc2VsZi5zcmMud2lkdGgudHJpZ2dlcignY2hhbmdlJyk7CgkJCQlzZWxmLnNyYy5oZWlnaHQudHJpZ2dlcignY2hhbmdlJyk7CgkJCQlzZWxmLnNyYy5hbGlnbi50cmlnZ2VyKCdjaGFuZ2UnKTsKCgkJCX0pLnRyaWdnZXIoJ2NoYW5nZScpOwoJCX07CgkJCgkJdGhpcy5zZXQgPSBmdW5jdGlvbigpIHsKCQkJc2VsZi5zd2YgPSBudWxsCgkJCXZhciB1cmwgPSB0aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCh0aGlzLnNyYy51cmwudmFsKCkpLAoJCQkJdyA9IHBhcnNlSW50KHRoaXMuc3JjLndpZHRoLnZhbCgpKSB8fCAnJywKCQkJCWggPSBwYXJzZUludCh0aGlzLnNyYy5oZWlnaHQudmFsKCkpIHx8ICcnLAoJCQkJd20gPSB0aGlzLnNyYy53bW9kZS52YWwoKSwKCQkJCWEgPSB0aGlzLnNyYy5hbGlnbi52YWwoKSwKCQkJCWYgPSBhID09ICdsZWZ0JyB8fCBhID09ICdyaWdodCcgPyBhIDogJycsCgkJCQltaWQgPSB0aGlzLnBsYWNlaG9sZGVyID8gdGhpcy5wbGFjZWhvbGRlci5hdHRyKCdyZWwnKSA6ICcnLCBvLCBfbywgYywgCgkJCQltID0gdGhpcy5zcmMubWFyZ2luLnZhbCgpLCBtYXJnaW47CgoJCQkKCQkJCgkJCWlmICghdXJsKSB7CgkJCQlpZiAodGhpcy5wbGFjZWhvbGRlcikgewoJCQkJCXRoaXMucGxhY2Vob2xkZXIucmVtb3ZlKCk7CgkJCQkJZGVsZXRlIHRoaXMucnRlLmZpbHRlci5zY3JpcHRzW21pZF07CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpID0gc2VsZi5ydGUudXRpbHMubWVkaWFJbmZvKHNlbGYuc3JjLnR5cGUudmFsKCkpOwoJCQkJaWYgKCFpKSB7CgkJCQkJaSA9IHNlbGYucnRlLnV0aWwubWVkaWFJbmZvKCdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcpOwoJCQkJfQoJCQkJYyA9IHRoaXMucnRlLmZpbHRlci52aWRlb0hvc3RSZWdFeHAudGVzdCh1cmwpID8gdXJsLnJlcGxhY2UodGhpcy5ydGUuZmlsdGVyLnZpZGVvSG9zdFJlZ0V4cCwgIiQyIikgOiBpLnR5cGUucmVwbGFjZSgvXlx3K1wvKC4rKS8sICIkMSIpOwoKCQkJCW8gPSB7CgkJCQkJb2JqIDogewoJCQkJCQljbGFzc2lkIDogaS5jbGFzc2lkWzBdLAoJCQkJCQljb2RlYmFzZSA6IGkuY29kZWJhc2UsCgkJCQkJCXN0eWxlIDoge30KCQkJCQl9LAoJCQkJCXBhcmFtcyA6WyB7IG5hbWUgOiAnc3JjJywgdmFsdWUgOiB1cmwgfSBdLAoJCQkJCWVtYmVkIDp7CgkJCQkJCXNyYyA6IHVybCwKCQkJCQkJdHlwZSA6IGkudHlwZSwKCQkJCQkJcXVhbGl0eSA6ICdoaWdoJywKCQkJCQkJd21vZGUgOiB3bSwKCQkJCQkJc3R5bGUgOiB7fQoJCQkJCX0KCQkJCX07CgkJCQkKCQkJCWlmICh3KSB7CgkJCQkJby5vYmoud2lkdGggPSB3OwoJCQkJCW8uZW1iZWQud2lkdGggPSB3OwoJCQkJfQoJCQkJaWYgKGgpIHsKCQkJCQlvLm9iai5oZWlnaHQgPSBoOwoJCQkJCW8uZW1iZWQuaGVpZ2h0ID0gaDsKCQkJCX0KCQkJCWlmIChmKSB7CgkJCQkJby5vYmouc3R5bGVbJ2Zsb2F0J10gPSBmOwoJCQkJfSBlbHNlIGlmIChhKSB7CgkJCQkJby5vYmouc3R5bGVbJ3ZlcnRpY2FsLWFsaWduJ10gPSBhOwoJCQkJfQoJCQkJCgkJCQlpZiAobS5jc3MpIHsKCQkJCQltYXJnaW4gPSB7IG1hcmdpbiA6IG0uY3NzIH07CgkJCQl9IGVsc2UgewoJCQkJCW1hcmdpbiA9IHsKCQkJCQkJJ21hcmdpbi10b3AnIDogbS50b3AsCgkJCQkJCSdtYXJnaW4tcmlnaHQnIDogbS5yaWdodCwKCQkJCQkJJ21hcmdpbi1ib3R0b20nIDogbS5ib3R0b20sCgkJCQkJCSdtYXJnaW4tbGVmdCcgOiBtLmxlZnQKCQkJCQl9OwoJCQkJfQoJCQkJCgkJCQlvLm9iai5zdHlsZSA9ICQuZXh0ZW5kKHt9LCBvLm9iai5zdHlsZSwgbWFyZ2luKTsKCQkJCQoJCQkJaWYgKHRoaXMucGxhY2Vob2xkZXIgJiYgbWlkKSB7CgkJCQkJX28gPSB0aGlzLnJ0ZS5maWx0ZXIuc2NyaXB0c1ttaWRdfHx7fTsKCgkJCQkJbyA9ICQuZXh0ZW5kKHRydWUsIF9vLCBvKTsKCQkJCQlkZWxldGUgby5vYmouc3R5bGUud2lkdGg7CgkJCQkJZGVsZXRlIG8ub2JqLnN0eWxlLmhlaWdodDsKCQkJCQlkZWxldGUgby5lbWJlZC5zdHlsZS53aWR0aDsKCQkJCQlkZWxldGUgby5lbWJlZC5zdHlsZS5oZWlnaHQ7CgkJCQkJdGhpcy5ydGUuZmlsdGVyLnNjcmlwdHNbbWlkXSA9IG87CgkJCQkJdGhpcy5wbGFjZWhvbGRlci5yZW1vdmVBdHRyKCdjbGFzcycpOwoJCQkJfSBlbHNlIHsKCQkJCQl2YXIgaWQgPSAnbWVkaWEnK01hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMik7CgkJCQkJdGhpcy5ydGUuZmlsdGVyLnNjcmlwdHNbaWRdID0gbzsKCQkJCQl0aGlzLnBsYWNlaG9sZGVyID0gJCh0aGlzLnJ0ZS5kb20uY3JlYXRlKCdpbWcnKSkuYXR0cigncmVsJywgaWQpLmF0dHIoJ3NyYycsIHRoaXMucnRlLmZpbHRlci51cmwrJ3BpeGVsLmdpZicpOwoJCQkJCXZhciBpbnMgPSB0cnVlOwoJCQkJfQoJCQkJdGhpcy5wbGFjZWhvbGRlci5hdHRyKCd0aXRsZScsIHRoaXMucnRlLnV0aWxzLmVuY29kZSh1cmwpKS5hdHRyKCd3aWR0aCcsIHd8fDE1MCkuYXR0cignaGVpZ2h0JywgaHx8MTAwKS5hZGRDbGFzcygnZWxydGUtcHJvdGVjdGVkIGVscnRlLW1lZGlhIGVscnRlLW1lZGlhLScrYykuY3NzKG8ub2JqLnN0eWxlKTsKCQkJCWlmIChmKSB7CgkJCQkJdGhpcy5wbGFjZWhvbGRlci5jc3MoJ2Zsb2F0JywgZikuY3NzKCd2ZXJ0aWNhbC1hbGlnbicsICcnKTsKCQkJCX0gZWxzZSBpZiAoYSkgewoJCQkJCXRoaXMucGxhY2Vob2xkZXIuY3NzKCdmbG9hdCcsICcnKS5jc3MoJ3ZlcnRpY2FsLWFsaWduJywgYSk7CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMucGxhY2Vob2xkZXIuY3NzKCdmbG9hdCcsICcnKS5jc3MoJ3ZlcnRpY2FsLWFsaWduJywgJycpOwoJCQkJfQoJCQkJCgkJCQlpZiAoaW5zKSB7CgkJCQkJdGhpcy5ydGUud2luZG93LmZvY3VzKCk7CgkJCQkJdGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJCQkJdGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydE5vZGUodGhpcy5wbGFjZWhvbGRlci5nZXQoMCkpOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpOwoJCQl0aGlzLmRvbUVsZW0udG9nZ2xlQ2xhc3MoJ2FjdGl2ZScsIG4gJiYgbi5ub2RlTmFtZSA9PSAnSU1HJyAmJiAkKG4pLmhhc0NsYXNzKCdlbHJ0ZS1tZWRpYScpKQoJCQkKCQl9CgkJCgkJCgl9Cn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBkcm9wLWRvd24gbWVudSAtIGZvbnQtZmFtaWx5IGZvciBzZWxlY3RlZCB0ZXh0CiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5mb250bmFtZSA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdmFyIHNlbGYgPSB0aGlzOwoJdmFyIG9wdHMgPSB7CgkJdHBsICAgICAgOiAnPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiV2YWwiPiVsYWJlbDwvc3Bhbj4nLAoJCXNlbGVjdCAgIDogZnVuY3Rpb24odikgeyBzZWxmLnNldCh2KTsgfSwKCQlzcmMgICAgICA6IHsKCQkJJycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnJ0ZS5pMThuKCdGb250JyksCgkJCSdhbmRhbGUgbW9ubyxzYW5zLXNlcmlmJyAgICAgICAgICAgICAgICAgICAgICAgIDogJ0FuZGFsZSBNb25vJywKCQkJJ2FyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmJyAgICAgICAgICAgICAgICAgICAgOiAnQXJpYWwnLAoJCQknYXJpYWwgYmxhY2ssZ2FkZ2V0LHNhbnMtc2VyaWYnICAgICAgICAgICAgICAgICA6ICdBcmlhbCBCbGFjaycsCgkJCSdib29rIGFudGlxdWEscGFsYXRpbm8sc2Fucy1zZXJpZicgICAgICAgICAgICAgIDogJ0Jvb2sgQW50aXF1YScsCgkJCSdjb21pYyBzYW5zIG1zLGN1cnNpdmUnICAgICAgICAgICAgICAgICAgICAgICAgIDogJ0NvbWljIFNhbnMgTVMnLAoJCQknY291cmllciBuZXcsY291cmllcixtb25vc3BhY2UnICAgICAgICAgICAgICAgICA6ICdDb3VyaWVyIE5ldycsCgkJCSdnZW9yZ2lhLHBhbGF0aW5vLHNlcmlmJyAgICAgICAgICAgICAgICAgICAgICAgIDogJ0dlb3JnaWEnLAoJCQknaGVsdmV0aWNhLHNhbnMtc2VyaWYnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdIZWx2ZXRpY2EnLAoJCQknaW1wYWN0LHNhbnMtc2VyaWYnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdJbXBhY3QnLAoJCQknbHVjaWRhIGNvbnNvbGUsbW9uYWNvLG1vbm9zcGFjZScgICAgICAgICAgICAgICA6ICdMdWNpZGEgY29uc29sZScsCgkJCSdsdWNpZGEgc2FucyB1bmljb2RlLGx1Y2lkYSBncmFuZGUsc2Fucy1zZXJpZicgIDogJ0x1Y2lkYSBncmFuZGUnLAoJCQkndGFob21hLHNhbnMtc2VyaWYnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdUYWhvbWEnLAoJCQkndGltZXMgbmV3IHJvbWFuLHRpbWVzLHNlcmlmJyAgICAgICAgICAgICAgICAgICA6ICdUaW1lcyBOZXcgUm9tYW4nLAoJCQkndHJlYnVjaGV0IG1zLGx1Y2lkYSBncmFuZGUsdmVyZGFuYSxzYW5zLXNlcmlmJyA6ICdUcmVidWNoZXQgTVMnLAoJCQkndmVyZGFuYSxnZW5ldmEsc2Fucy1zZXJpZicgICAgICAgICAgICAgICAgICAgICA6ICdWZXJkYW5hJwoJCX0KCX0KCQoJdGhpcy5zZWxlY3QgPSB0aGlzLmRvbUVsZW0uZWxTZWxlY3Qob3B0cyk7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJfQoJCgl0aGlzLnNldCA9IGZ1bmN0aW9uKHNpemUpIHsKCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCXZhciBub2RlcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7ZmlsdGVyIDogJ3RleHRDb250YWluc05vZGVzJ30pOwoJCSQuZWFjaChub2RlcywgZnVuY3Rpb24oKSB7CgkJCSR0aGlzID0gL14oVEhFQUR8VEZPT1R8VEJPRFl8Q09MfENPTEdST1VQfFRSKSQvLnRlc3QodGhpcy5ub2RlTmFtZSkgPyAkKHRoaXMpLmZpbmQoJ3RkLHRoJykgOiAkKHRoaXMpOwoJCQkkKHRoaXMpLmNzcygnZm9udC1mYW1pbHknLCBzaXplKS5maW5kKCdbc3R5bGVdJykuY3NzKCdmb250LWZhbWlseScsICcnKTsKCQl9KTsKCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7IAoJCXZhciBuID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTsKCQlpZiAobi5ub2RlVHlwZSAhPSAxKSB7CgkJCW4gPSBuLnBhcmVudE5vZGU7CgkJfQoJCXZhciB2ID0gJChuKS5jc3MoJ2ZvbnQtZmFtaWx5Jyk7CgkJdiA9IHYgPyB2LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8sXHMrL2csICcsJykucmVwbGFjZSgvJ3wiL2csICcnKSA6ICcnOwoJCXRoaXMuc2VsZWN0LnZhbChvcHRzLnNyY1t2XSA/IHYgOiAnJyk7Cgl9Cn0KCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBkcm9wLWRvd24gbWVudSAtIGZvbnQgc2l6ZSBmb3Igc2VsZWN0ZWQgdGV4dAogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZm9udHNpemUgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCXZhciBvcHRzID0gewoJCWxhYmVsVHBsIDogJyVsYWJlbCcsCgkJdHBsICAgICAgOiAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToldmFsO2xpbmUtaGVpZ2h0OjEuMmVtIj4lbGFiZWw8L3NwYW4+JywKCQlzZWxlY3QgICA6IGZ1bmN0aW9uKHYpIHsgc2VsZi5zZXQodik7IH0sCgkJc3JjICAgICAgOiB7CgkJCScnICAgICAgICAgOiB0aGlzLnJ0ZS5pMThuKCdGb250IHNpemUnKSwKCQkJJ3h4LXNtYWxsJyA6IHRoaXMucnRlLmkxOG4oJ1NtYWxsICg4cHQpJyksIAoJCQkneC1zbWFsbCcgIDogdGhpcy5ydGUuaTE4bignU21hbGwgKDEwcHgpJyksIAoJCQknc21hbGwnICAgIDogdGhpcy5ydGUuaTE4bignU21hbGwgKDEycHQpJyksIAoJCQknbWVkaXVtJyAgIDogdGhpcy5ydGUuaTE4bignTm9ybWFsICgxNHB0KScpLAoJCQknbGFyZ2UnICAgIDogdGhpcy5ydGUuaTE4bignTGFyZ2UgKDE4cHQpJyksCgkJCSd4LWxhcmdlJyAgOiB0aGlzLnJ0ZS5pMThuKCdMYXJnZSAoMjRwdCknKSwKCQkJJ3h4LWxhcmdlJyA6IHRoaXMucnRlLmkxOG4oJ0xhcmdlICgzNnB0KScpCgkJfQoJfQoJCgl0aGlzLnNlbGVjdCA9IHRoaXMuZG9tRWxlbS5lbFNlbGVjdChvcHRzKTsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7Cgl9CgkKCXRoaXMuc2V0ID0gZnVuY3Rpb24oc2l6ZSkgewoJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJdmFyIG5vZGVzID0gdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdGVkKHtmaWx0ZXIgOiAndGV4dENvbnRhaW5zTm9kZXMnfSk7CgkJJC5lYWNoKG5vZGVzLCBmdW5jdGlvbigpIHsKCQkJJHRoaXMgPSAvXihUSEVBRHxURk9PVHxUQk9EWXxDT0x8Q09MR1JPVVB8VFIpJC8udGVzdCh0aGlzLm5vZGVOYW1lKSA/ICQodGhpcykuZmluZCgndGQsdGgnKSA6ICQodGhpcyk7CgkJCSR0aGlzLmNzcygnZm9udC1zaXplJywgc2l6ZSkuZmluZCgiW3N0eWxlXSIpLmNzcygnZm9udC1zaXplJywgJycpOwoJCX0pOwoJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJdGhpcy5zZWxlY3QudmFsKChtID0gdGhpcy5ydGUuZG9tLmF0dHIobiwgJ3N0eWxlJykubWF0Y2goL2ZvbnQtc2l6ZTpccyooW147XSspL2kpKSA/IG1bMV0gOiAnJyk7Cgl9Cn0KCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBjb2xvciBwYWxsZXRlIGZvciB0ZXh0IGNvbG9yIGFuZCBiYWNrZ3JvdW5kCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5mb3JlY29sb3IgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXZhciBzZWxmID0gdGhpczsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBvcHRzID0gewoJCSdjbGFzcycgOiAnJywKCQljb2xvciAgIDogdGhpcy5kZWZhdWx0Q29sb3IsCgkJdXBkYXRlICA6IGZ1bmN0aW9uKGMpIHsgc2VsZi5pbmRpY2F0b3IuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgYyk7IH0sCgkJY2hhbmdlICA6IGZ1bmN0aW9uKGMpIHsgc2VsZi5zZXQoYykgfQoJfQoJCgl0aGlzLmRlZmF1bHRDb2xvciA9IHRoaXMubmFtZSA9PSAnZm9yZWNvbG9yJyA/ICcjMDAwMDAwJyA6ICcjZmZmZmZmJzsKCXRoaXMucGlja2VyICAgICAgID0gdGhpcy5kb21FbGVtLmVsQ29sb3JQaWNrZXIob3B0cyk7Cgl0aGlzLmluZGljYXRvciAgICA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnY29sb3ItaW5kaWNhdG9yJykucHJlcGVuZFRvKHRoaXMuZG9tRWxlbSk7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJfQoJCgl0aGlzLnNldCA9IGZ1bmN0aW9uKGMpIHsKCQlpZiAoIXRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSkgewoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQl2YXIgbm9kZXMgPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe2NvbGxhcHNlIDogZmFsc2UsIHdyYXAgOiAndGV4dCd9KSwKCQkJCWNzcyAgID0gdGhpcy5uYW1lID09ICdmb3JlY29sb3InID8gJ2NvbG9yJyA6ICdiYWNrZ3JvdW5kLWNvbG9yJzsJCQkKCQkJJC5lYWNoKG5vZGVzLCBmdW5jdGlvbigpIHsKCQkJCWlmICgvXihUSEVBRHxUQk9EWXxURk9PVHxUUikkLy50ZXN0KHRoaXMubm9kZU5hbWUpKSB7CgkJCQkJJCh0aGlzKS5maW5kKCd0ZCx0aCcpLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJCSQodGhpcykuY3NzKGNzcywgYykuZmluZCgnKicpLmNzcyhjc3MsICcnKTsKCQkJCQl9KQoJCQkJfSBlbHNlIHsKCQkJCQkkKHRoaXMpLmNzcyhjc3MsIGMpLmZpbmQoJyonKS5jc3MoY3NzLCAnJyk7CgkJCQl9CgkJCX0pOwoJCQl0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSk7CgkJfQoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJdGhpcy5waWNrZXIudmFsKHRoaXMucnRlLnV0aWxzLnJnYjJoZXgoJChuLm5vZGVUeXBlICE9IDEgPyBuLnBhcmVudE5vZGUgOiBuKS5jc3ModGhpcy5uYW1lID09ICdmb3JlY29sb3InID8gJ2NvbG9yJyA6ICdiYWNrZ3JvdW5kLWNvbG9yJykpfHx0aGlzLmRlZmF1bHRDb2xvcikKCX0KfQoKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmhpbGl0ZWNvbG9yID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZvcmVjb2xvcjsKCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBkcm9wLWRvd24gbWVudSAtIGZvcm1hdHRpbmcgdGV4dCBibG9jawogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZm9ybWF0YmxvY2sgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCgl2YXIgY21kID0gdGhpcy5ydGUuYnJvd3Nlci5tc2llIAoJCT8gZnVuY3Rpb24odikgeyBzZWxmLnZhbCA9IHY7IHNlbGYuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbW1hbmQuY2FsbChzZWxmKTsgfQoJCTogZnVuY3Rpb24odikgeyBzZWxmLmllQ29tbWFuZCh2KTsgfSAKCXZhciBzZWxmID0gdGhpczsKCXZhciBvcHRzID0gewoJCWxhYmVsVHBsIDogJyVsYWJlbCcsCgkJdHBscyAgICAgOiB7JycgOiAnJWxhYmVsJ30sCgkJc2VsZWN0ICAgOiBmdW5jdGlvbih2KSB7IHNlbGYuZm9ybWF0QmxvY2sodik7IH0sCgkJc3JjICAgICAgOiB7CgkJCSdzcGFuJyAgICA6IHRoaXMucnRlLmkxOG4oJ0Zvcm1hdCcpLAoJCQknaDEnICAgICAgOiB0aGlzLnJ0ZS5pMThuKCdIZWFkaW5nIDEnKSwKCQkJJ2gyJyAgICAgIDogdGhpcy5ydGUuaTE4bignSGVhZGluZyAyJyksCgkJCSdoMycgICAgICA6IHRoaXMucnRlLmkxOG4oJ0hlYWRpbmcgMycpLAoJCQknaDQnICAgICAgOiB0aGlzLnJ0ZS5pMThuKCdIZWFkaW5nIDQnKSwKCQkJJ2g1JyAgICAgIDogdGhpcy5ydGUuaTE4bignSGVhZGluZyA1JyksCgkJCSdoNicgICAgICA6IHRoaXMucnRlLmkxOG4oJ0hlYWRpbmcgNicpLAoJCQkncCcgICAgICAgOiB0aGlzLnJ0ZS5pMThuKCdQYXJhZ3JhcGgnKSwKCQkJJ2FkZHJlc3MnIDogdGhpcy5ydGUuaTE4bignQWRkcmVzcycpLAoJCQkncHJlJyAgICAgOiB0aGlzLnJ0ZS5pMThuKCdQcmVmb3JtYXR0ZWQnKSwKCQkJJ2RpdicgICAgIDogdGhpcy5ydGUuaTE4bignTm9ybWFsIChESVYpJykKCQl9Cgl9CgoJdGhpcy5zZWxlY3QgPSB0aGlzLmRvbUVsZW0uZWxTZWxlY3Qob3B0cyk7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoKCX0KCQoJdGhpcy5mb3JtYXRCbG9jayA9IGZ1bmN0aW9uKHYpIHsKCgkJZnVuY3Rpb24gZm9ybWF0KG4sIHRhZykgewoJCQkKCQkJZnVuY3Rpb24gcmVwbGFjZUNoaWxkcyhwKSB7CgkJCQkkKHApLmZpbmQoJ2gxLGgyLGgzLGg0LGg1LGg2LHAsYWRkcmVzcyxwcmUnKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCSQodGhpcykucmVwbGFjZVdpdGgoJCh0aGlzKS5odG1sKCkpOwoJCQkJfSk7CgkJCQlyZXR1cm4gcDsKCQkJfQoJCQkKCQkJaWYgKC9eKExJfERUfEREfFREfFRIfENBUFRJT04pJC8udGVzdChuLm5vZGVOYW1lKSkgewoJCQkJIXNlbGYucnRlLmRvbS5pc0VtcHR5KG4pICYmIHNlbGYucnRlLmRvbS53cmFwQ29udGVudHMocmVwbGFjZUNoaWxkcyhuKSwgdGFnKTsKCQkJfSBlbHNlIGlmICgvXihVTHxPTHxETHxUQUJMRSkkLy50ZXN0KG4ubm9kZU5hbWUpKSB7CgkJCQlzZWxmLnJ0ZS5kb20ud3JhcChuLCB0YWcpOwoJCQl9IGVsc2UgewoJCQkJIXNlbGYucnRlLmRvbS5pc0VtcHR5KG4pICYmICQocmVwbGFjZUNoaWxkcyhuKSkucmVwbGFjZVdpdGgoICQoc2VsZi5ydGUuZG9tLmNyZWF0ZSh0YWcpKS5odG1sKCQobikuaHRtbCgpKSk7CgkJCX0KCQkJCgkJfQoJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgoJCXZhciB0YWcgPSB2LnRvVXBwZXJDYXNlKCksCgkJCWksIG4sICRuLAoJCQljID0gdGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpLAoJCQlibSA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXRCb29rbWFyaygpLAoJCQlub2RlcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7CgkJCQljb2xsYXBzZWQgOiB0cnVlLAoJCQkJYmxvY2tzICAgIDogdHJ1ZSwKCQkJCWZpbHRlciAgICA6ICd0ZXh0Q29udGFpbnNOb2RlcycsCgkJCQl3cmFwICAgICAgOiAnaW5saW5lJywKCQkJCXRhZyAgICAgICA6ICdzcGFuJwoJCQl9KQoJCQlsID0gbm9kZXMubGVuZ3RoLAoJCQlzID0gJChub2Rlc1swXSkucHJldigpLAoJCQllID0gJChub2Rlc1tub2Rlcy5sZW5ndGgtMV0pLm5leHQoKTsKCgkJd2hpbGUgKGwtLSkgewoJCQluID0gbm9kZXNbbF07CgkJCSRuID0gJChuKTsKCQkJaWYgKHRhZyA9PSAnRElWJyB8fCB0YWcgPT0gJ1NQQU4nKSB7CgkJCQlpZiAoL14oSFsxLTZdfFB8QUREUkVTU3xQUkUpJC8udGVzdChuLm5vZGVOYW1lKSkgewoJCQkJCSRuLnJlcGxhY2VXaXRoKCQodGhpcy5ydGUuZG9tLmNyZWF0ZSgnZGl2JykpLmh0bWwoJG4uaHRtbCgpfHwnJykpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJaWYgKC9eKFRIRUFEfFRCT0RZfFRGT09UfFRSKSQvLnRlc3Qobi5ub2RlTmFtZSkpIHsKCQkJCQkkbi5maW5kKCd0ZCx0aCcpLmVhY2goZnVuY3Rpb24oKSB7IGZvcm1hdCh0aGlzLCB0YWcpOyB9KTsKCQkJCX0gZWxzZSBpZiAobi5ub2RlTmFtZSAhPSB0YWcpIHsKCQkJCQlmb3JtYXQobiwgdGFnKTsKCQkJCX0KCQkJfQoJCX0KCgkJdGhpcy5ydGUuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJtKTsKCgkJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl2YXIgbiA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL14oSFsxLTZdfFB8QUREUkVTU3xQUkUpJC8pOwoJCXRoaXMuc2VsZWN0LnZhbChuID8gbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogJ3NwYW4nKTsKCX0KfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIHN3aXRjaCB0byBmdWxsc2NyZWVuIG1vZGUgYW5kIGJhY2sKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZ1bGxzY3JlZW4gPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXZhciBzZWxmICAgICA9IHRoaXM7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl0aGlzLmFjdGl2ZSAgPSB0cnVlOwoJdGhpcy5lZGl0b3IgPSBydGUuZWRpdG9yOwoJdGhpcy53eiA9IHJ0ZS53b3Jrem9uZTsKCXRoaXMuaGVpZ2h0ICA9IDA7Cgl0aGlzLmRlbHRhID0gMDsKCXRoaXMuX2NsYXNzID0gJ2VsLWZ1bGxzY3JlZW4nOwoJCglzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCXNlbGYuaGVpZ2h0ICA9IHNlbGYud3ouaGVpZ2h0KCk7CgkJc2VsZi5kZWx0YSAgID0gc2VsZi5lZGl0b3Iub3V0ZXJIZWlnaHQoKS1zZWxmLmhlaWdodDsKCX0sIDUwKTsKCQoJCgkvKioKCSAqIFVwZGF0ZSBlZGl0b3IgaGVpZ2h0IG9uIHdpbmRvdyByZXNpemUgaW4gZnVsbHNjcmVlbiB2aWV3CgkgKgoJICoqLwoJZnVuY3Rpb24gcmVzaXplKCkgewoJCXNlbGYud3ouaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKS1zZWxmLmRlbHRhKTsKCQlzZWxmLnJ0ZS51cGRhdGVIZWlnaHQoKTsKCX0KCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdmFyIHcgPSAkKHdpbmRvdyksCgkJCWUgPSB0aGlzLmVkaXRvciwKCQkJcCA9IGUucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbihpLCBuKSB7IHJldHVybiAgIS9eKGh0bWx8Ym9keSkkL2kudGVzdChuLm5vZGVOYW1lKSAmJiAkKG4pLmNzcygncG9zaXRpb24nKSA9PSAncmVsYXRpdmUnOyB9KSwKCQkJd3ogPSB0aGlzLnd6LAoJCQljID0gdGhpcy5fY2xhc3MsCgkJCWYgPSBlLmhhc0NsYXNzKGMpLAoJCQlydGUgPSB0aGlzLnJ0ZSwKCQkJcyA9IHRoaXMucnRlLnNlbGVjdGlvbiwKCQkJbSA9ICQuYnJvd3Nlci5tb3ppbGxhLAoJCQliLCBoOwoKCQlmdW5jdGlvbiBzYXZlKCkgewoJCQlpZiAobSkgewoJCQkJYiA9IHMuZ2V0Qm9va21hcmsoKTsKCQkJfQoJCX0KCQkKCQlmdW5jdGlvbiByZXN0b3JlKCkgewoJCQlpZiAobSkgewoJCQkJc2VsZi53ei5jaGlsZHJlbigpLnRvZ2dsZSgpOwoJCQkJc2VsZi5ydGUuc291cmNlLmZvY3VzKCk7CgkJCQlzZWxmLnd6LmNoaWxkcmVuKCkudG9nZ2xlKCk7CgkJCQlzLm1vdmVUb0Jvb2ttYXJrKGIpOwoJCQl9CgkJfQoKCQlzYXZlKCk7CgkJcC5jc3MoJ3Bvc2l0aW9uJywgZiA/ICdyZWxhdGl2ZScgOiAnc3RhdGljJyk7CQoJCQoJCWlmIChmKSB7CgkJCWUucmVtb3ZlQ2xhc3MoYyk7CgkJCXd6LmhlaWdodCh0aGlzLmhlaWdodCk7CgkJCXcudW5iaW5kKCdyZXNpemUnLCByZXNpemUpOwoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0gZWxzZSB7CgkJCWUuYWRkQ2xhc3MoYykucmVtb3ZlQXR0cignc3R5bGUnKTsKCQkJd3ouaGVpZ2h0KHcuaGVpZ2h0KCkgLSB0aGlzLmRlbHRhKS5jc3MoJ3dpZHRoJywgJzEwMCUnKTsKCQkJdy5iaW5kKCdyZXNpemUnLCByZXNpemUpOwoJCQl0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCQlydGUudXBkYXRlSGVpZ2h0KCk7CQoJCXJ0ZS5yZXNpemFibGUoZik7CgkJcmVzdG9yZSgpOwoJCQoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCX0KfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIGhvcml6b250YWwgcnVsZSAob3BlbiBkaWFsb2cgd2luZG93KQogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuaG9yaXpvbnRhbHJ1bGUgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCXRoaXMuc3JjID0gewoJCXdpZHRoICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKHsnbmFtZScgOiAnd2lkdGgnLCAnc2l6ZScgOiA0fSkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JyksCgkJd3VuaXQgICA6ICQoJzxzZWxlY3QgLz4nKS5hdHRyKCduYW1lJywgJ3d1bml0JykKCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJyUnKS50ZXh0KCclJykpCgkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdweCcpLnRleHQoJ3B4JykpCgkJCQkJLnZhbCgnJScpLAoJCWhlaWdodCAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKHsnbmFtZScgOiAnaGVpZ2h0JywgJ3NpemUnIDogNH0pLmNzcygndGV4dC1hbGlnbicsICdyaWdodCcpLAoJCWJnICAgICAgOiAkKCc8ZGl2IC8+JyksCgkJYm9yZGVyICA6ICQoJzxkaXYgLz4nKSwKCQknY2xhc3MnIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCd3aWR0aCcsICcxMDAlJyksCgkJc3R5bGUgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmNzcygnd2lkdGgnLCAnMTAwJScpCgl9CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuc3JjLmJnLmVsQ29sb3JQaWNrZXIoe3BhbGV0dGVQb3NpdGlvbiA6ICdvdXRlcicsICdjbGFzcycgOiAnZWwtY29sb3JwaWNrZXIgdWktaWNvbiB1aS1pY29uLXBlbmNpbCd9KTsKCQkKCQl2YXIgbiAgID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldEVuZCgpOwoJCXRoaXMuaHIgPSBuLm5vZGVOYW1lID09ICdIUicgPyAkKG4pIDogJChydGUuZG9jLmNyZWF0ZUVsZW1lbnQoJ2hyJykpLmNzcyh7d2lkdGggOiAnMTAwJScsIGhlaWdodCA6ICcxcHgnfSk7CgkJdGhpcy5zcmMuYm9yZGVyLmVsQm9yZGVyU2VsZWN0KHtzdHlsZUhlaWdodCA6IDczLCB2YWx1ZSA6IHRoaXMuaHJ9KTsKCQkKCQl2YXIgX3cgID0gdGhpcy5oci5jc3MoJ3dpZHRoJykgfHwgdGhpcy5oci5hdHRyKCd3aWR0aCcpOwoJCXRoaXMuc3JjLndpZHRoLnZhbChwYXJzZUludChfdykgfHwgMTAwKTsKCQl0aGlzLnNyYy53dW5pdC52YWwoX3cuaW5kZXhPZigncHgnKSAhPSAtMSA/ICdweCcgOiAnJScpOwoJCQoJCXRoaXMuc3JjLmhlaWdodC52YWwoIHRoaXMucnRlLnV0aWxzLnRvUGl4ZWxzKHRoaXMuaHIuY3NzKCdoZWlnaHQnKSB8fCB0aGlzLmhyLmF0dHIoJ2hlaWdodCcpKSB8fCAxKSA7CgkJCgkJdGhpcy5zcmMuYmcudmFsKHRoaXMucnRlLnV0aWxzLmNvbG9yMkhleCh0aGlzLmhyLmNzcygnYmFja2dyb3VuZC1jb2xvcicpKSk7CgkJdGhpcy5zcmNbJ2NsYXNzJ10udmFsKHRoaXMucnRlLmRvbS5hdHRyKHRoaXMuaHIsICdjbGFzcycpKTsKCQl0aGlzLnNyYy5zdHlsZS52YWwodGhpcy5ydGUuZG9tLmF0dHIodGhpcy5ociwgJ3N0eWxlJykpOwoJCQoJCXZhciBvcHRzID0gewoJCQlydGwgOiB0aGlzLnJ0ZS5ydGwsCgkJCXN1Ym1pdCA6IGZ1bmN0aW9uKGUsIGQpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzZWxmLnNldCgpOyBkLmNsb3NlKCk7IH0sCgkJCWRpYWxvZyA6IHsKCQkJCXRpdGxlIDogdGhpcy5ydGUuaTE4bignSG9yaXpvbnRhbCBydWxlJykKCQkJfQoJCX0KCgkJdmFyIGQgPSBuZXcgZWxEaWFsb2dGb3JtKG9wdHMpOwoJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdXaWR0aCcpLCAgICAgICAgICAkKCc8c3BhbiAvPicpLmFwcGVuZCh0aGlzLnNyYy53aWR0aCkuYXBwZW5kKHRoaXMuc3JjLnd1bml0KSBdLCBudWxsLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdIZWlnaHQnKSwgICAgICAkKCc8c3BhbiAvPicpLmFwcGVuZCh0aGlzLnNyYy5oZWlnaHQpLmFwcGVuZCgnIHB4JyldLCBudWxsLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdCb3JkZXInKSwgICAgICB0aGlzLnNyYy5ib3JkZXJdLCBudWxsLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdCYWNrZ3JvdW5kJyksICB0aGlzLnNyYy5iZ10sIG51bGwsIHRydWUpCgkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ0NzcyBjbGFzcycpLCAgIHRoaXMuc3JjWydjbGFzcyddXSwgbnVsbCwgdHJ1ZSkKCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQ3NzIHN0eWxlJyksICAgdGhpcy5zcmMuc3R5bGVdLCBudWxsLCB0cnVlKQoJCQkub3BlbigpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQlpZiAodGhpcy5ydGUuc2VsZWN0aW9uLmdldEVuZCgpLm5vZGVOYW1lID09ICdIUicpIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdhY3RpdmUnKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCX0KCQoJdGhpcy5zZXQgPSBmdW5jdGlvbigpIHsKCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCSF0aGlzLmhyLnBhcmVudE5vZGUgJiYgdGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydE5vZGUodGhpcy5oci5nZXQoMCkpOwoJCXZhciBhdHRyID0gewoJCQlub3NoYWRlIDogdHJ1ZSwKCQkJc3R5bGUgICA6IHRoaXMuc3JjLnN0eWxlLnZhbCgpCgkJfQoJCXZhciBiID0gdGhpcy5zcmMuYm9yZGVyLnZhbCgpOwoJCXZhciBjc3MgPSB7CgkJCXdpZHRoICA6IChwYXJzZUludCh0aGlzLnNyYy53aWR0aC52YWwoKSkgfHwgMTAwKSt0aGlzLnNyYy53dW5pdC52YWwoKSwKCQkJaGVpZ2h0IDogcGFyc2VJbnQodGhpcy5zcmMuaGVpZ2h0LnZhbCgpKSB8fCAxLAoJCQknYmFja2dyb3VuZC1jb2xvcicgOiB0aGlzLnNyYy5iZy52YWwoKSwKCQkJYm9yZGVyIDogYi53aWR0aCAmJiBiLnN0eWxlID8gYi53aWR0aCsnICcrYi5zdHlsZSsnICcrYi5jb2xvciA6ICcnCgkJfQoKCQl0aGlzLmhyLnJlbW92ZUF0dHIoJ2NsYXNzJykKCQkJLnJlbW92ZUF0dHIoJ3N0eWxlJykKCQkJLnJlbW92ZUF0dHIoJ3dpZHRoJykKCQkJLnJlbW92ZUF0dHIoJ2hlaWdodCcpCgkJCS5yZW1vdmVBdHRyKCdhbGlnbicpCgkJCS5hdHRyKGF0dHIpCgkJCS5jc3MoY3NzKTsKCQkKCQlpZiAodGhpcy5zcmNbJ2NsYXNzJ10udmFsKCkpIHsKCQkJdGhpcy5oci5hdHRyKCdjbGFzcycsIHRoaXMuc3JjWydjbGFzcyddLnZhbCgpKTsJCgkJfQoJCXRoaXMucnRlLnVpLnVwZGF0ZSgpCgl9CgkKfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIGluc2VydC9lZGl0IGltYWdlIChvcGVuIGRpYWxvZyB3aW5kb3cpCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIENvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmltYWdlID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl2YXIgc2VsZiA9IHRoaXM7Cgl0aGlzLmltZyA9IG51bGwKCXRoaXMuaW5pdCA9IGZ1bmN0aW9uKCkgewoJCQoJCXRoaXMubGFiZWxzID0gewoJCQltYWluICAgOiAnUHJvcGVyaWVzJywKCQkJbGluayAgIDogJ0xpbmsnLAoJCQlhZHYgICAgOiAnQWR2YW5jZWQnLAoJCQlldmVudHMgOiAnRXZlbnRzJywKCQkJaWQgICAgICAgOiAnSUQnLAoJCQknY2xhc3MnICA6ICdDc3MgY2xhc3MnLAoJCQlzdHlsZSAgICA6ICdDc3Mgc3R5bGUnLAoJCQlsb25nZGVzYyA6ICdEZXRhaWwgZGVzY3JpcHRpb24gVVJMJywKCQkJaHJlZiAgICA6ICdVUkwnLAoJCQl0YXJnZXQgIDogJ09wZW4gaW4nLAoJCQl0aXRsZSAgIDogJ1RpdGxlJwoJCX0KCQkKCQl0aGlzLnNyYyA9IHsKCQkJbWFpbiA6IHsKCQkJCXNyYyAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmNzcygnd2lkdGgnLCAnMTAwJScpLAoJCQkJdGl0bGUgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCd3aWR0aCcsICcxMDAlJyksCgkJCQlhbHQgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKSwKCQkJCXdpZHRoICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ3NpemUnLCA1KS5jc3MoJ3RleHQtYWxpZ24nLCAncmlnaHQnKSwKCQkJCWhlaWdodCA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ3NpemUnLCA1KS5jc3MoJ3RleHQtYWxpZ24nLCAncmlnaHQnKSwKCQkJCW1hcmdpbiA6ICQoJzxkaXYgLz4nKSwKCQkJCWFsaWduICA6ICQoJzxzZWxlY3QgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCcnKS50ZXh0KHRoaXMucnRlLmkxOG4oJ05vdCBzZXQnLCAnZGlhbG9ncycpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnbGVmdCcgICAgICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ0xlZnQnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3JpZ2h0JyAgICAgICkudGV4dCh0aGlzLnJ0ZS5pMThuKCdSaWdodCcpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgndG9wJyAgICAgICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ1RvcCcpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgndGV4dC10b3AnICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ1RleHQgdG9wJykpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdtaWRkbGUnICAgICApLnRleHQodGhpcy5ydGUuaTE4bignbWlkZGxlJykpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdiYXNlbGluZScgICApLnRleHQodGhpcy5ydGUuaTE4bignQmFzZWxpbmUnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ2JvdHRvbScgICAgICkudGV4dCh0aGlzLnJ0ZS5pMThuKCdCb3R0b20nKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3RleHQtYm90dG9tJykudGV4dCh0aGlzLnJ0ZS5pMThuKCdUZXh0IGJvdHRvbScpKSksCgkJCQlib3JkZXIgOiAkKCc8ZGl2IC8+JykKCQkJfSwKCgkJCWFkdiA6IHsKCQkJCWlkICAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCd3aWR0aCcsICcxMDAlJyksCgkJCQknY2xhc3MnICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmNzcygnd2lkdGgnLCAnMTAwJScpLAoJCQkJc3R5bGUgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKSwKCQkJCWxvbmdkZXNjIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCd3aWR0aCcsICcxMDAlJykKCQkJfSwKCQkJZXZlbnRzIDoge30KCQl9CgkJCgkJJC5lYWNoKAoJCQlbJ29uYmx1cicsICdvbmZvY3VzJywgJ29uY2xpY2snLCAnb25kYmxjbGljaycsICdvbm1vdXNlZG93bicsICdvbm1vdXNldXAnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbm1vdXNlbGVhdmUnLCAnb25rZXlkb3duJywgJ29ua2V5cHJlc3MnLCAnb25rZXl1cCddLCAKCQkJZnVuY3Rpb24oKSB7CgkJCQlzZWxmLnNyYy5ldmVudHNbdGhpc10gPSAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKTsKCQl9KTsKCQkKCQkkLmVhY2goc2VsZi5zcmMsIGZ1bmN0aW9uKCkgewoJCQlmb3IgKHZhciBuIGluIHRoaXMpIHsKCQkJCXRoaXNbbl0uYXR0cignbmFtZScsIG4pOwoJCQl9CgkJfSk7CgkJCgl9CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCSF0aGlzLnNyYyAmJiB0aGlzLmluaXQoKTsKCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCQl0aGlzLnNyYy5tYWluLmJvcmRlci5lbEJvcmRlclNlbGVjdCh7IGNoYW5nZSA6IGZ1bmN0aW9uKCkgeyBzZWxmLnVwZGF0ZUltZygpOyB9LCBuYW1lIDogJ2JvcmRlcicgfSk7CgkJdGhpcy5zcmMubWFpbi5tYXJnaW4uZWxQYWRkaW5nSW5wdXQoeyB0eXBlIDogJ21hcmdpbicgfSk7CgoJCXRoaXMuY2xlYW5WYWx1ZXMoKTsKCQl0aGlzLnNyYy5tYWluLnNyYy52YWwoJycpOwoJCQoJCXZhciBuID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldEVuZCgpLAoJCQkkbiA9ICQobik7CgkJdGhpcy5wcmV2aWV3ID0gbnVsbDsKCQl0aGlzLnByZXZJbWcgPSBudWxsOwoJCXRoaXMubGluayAgICA9IG51bGw7CgkJaWYgKG4ubm9kZU5hbWUgPT0gJ0lNRycgJiYgISRuLmhhc0NsYXNzKCdlbHJ0ZS1wcm90ZWN0ZWQnKSkgewoJCQl0aGlzLmltZyAgICAgPSAkKG4pOwoJCX0gZWxzZSB7CgkJCXRoaXMuaW1nID0gJCh0aGlzLnJ0ZS5kb2MuY3JlYXRlRWxlbWVudCgnaW1nJykpOwoJCQkKCQl9CgkJCgkJdmFyIG9wdHMgPSB7CgkJCXJ0bCA6IHRoaXMucnRlLnJ0bCwKCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuc2V0KCk7IGQuY2xvc2UoKTsgfSwKCQkJZGlhbG9nIDogewoJCQkJd2lkdGggICAgOiA1NzAsCgkJCQlwb3NpdGlvbiA6ICd0b3AnLAoJCQkJdGl0bGUgICAgOiB0aGlzLnJ0ZS5pMThuKCdJbWFnZScpCgkJCX0KCQl9CgkJdmFyIGQgPSBuZXcgZWxEaWFsb2dGb3JtKG9wdHMpOwoJCQoJCWlmICh0aGlzLnJ0ZS5vcHRpb25zLmZtQWxsb3cgJiYgdGhpcy5ydGUub3B0aW9ucy5mbU9wZW4pIHsKCQkJdmFyIHNyYyA9ICQoJzxzcGFuIC8+JykuYXBwZW5kKHRoaXMuc3JjLm1haW4uc3JjLmNzcygnd2lkdGgnLCAnODglJykpCgkJCQkJLmFwcGVuZCgKCQkJCQkJJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygndWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsJykKCQkJCQkJCS5jc3MoeydmbG9hdCcgOiAncmlnaHQnLCAnbWFyZ2luLXJpZ2h0JyA6ICczcHgnfSkKCQkJCQkJCS5hdHRyKCd0aXRsZScsIHNlbGYucnRlLmkxOG4oJ09wZW4gZmlsZSBtYW5nZXInKSkKCQkJCQkJCS5hcHBlbmQoJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygndWktaWNvbiB1aS1pY29uLWZvbGRlci1vcGVuJykpCgkJCQkJCQkJLmNsaWNrKCBmdW5jdGlvbigpIHsKCQkJCQkJCQkJc2VsZi5ydGUub3B0aW9ucy5mbU9wZW4oIGZ1bmN0aW9uKHVybCkgeyBzZWxmLnNyYy5tYWluLnNyYy52YWwodXJsKS5jaGFuZ2UoKSB9ICk7CgkJCQkJCQkJfSkKCQkJCQkJCQkuaG92ZXIoZnVuY3Rpb24oKSB7JCh0aGlzKS5hZGRDbGFzcygndWktc3RhdGUtaG92ZXInKX0sIGZ1bmN0aW9uKCkgeyAkKHRoaXMpLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpfSkKCQkJCQkJKTsKCQl9IGVsc2UgewoJCQl2YXIgc3JjID0gdGhpcy5zcmMubWFpbi5zcmM7CgkJfQoJCQoJCWQudGFiKCdtYWluJywgdGhpcy5ydGUuaTE4bignUHJvcGVyaWVzJykpCgkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ0ltYWdlIFVSTCcpLCBzcmNdLCAgICAgICAgICAgICAgICAgJ21haW4nLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdUaXRsZScpLCAgICAgdGhpcy5zcmMubWFpbi50aXRsZV0sICdtYWluJywgdHJ1ZSkKCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQWx0IHRleHQnKSwgIHRoaXMuc3JjLm1haW4uYWx0XSwgICAnbWFpbicsIHRydWUpCgkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ1NpemUnKSwgJCgnPHNwYW4gLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi53aWR0aCkuYXBwZW5kKCcgeCAnKS5hcHBlbmQodGhpcy5zcmMubWFpbi5oZWlnaHQpLmFwcGVuZCgnIHB4JyldLCAnbWFpbicsIHRydWUpCgkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ0FsaWdubWVudCcpLCB0aGlzLnNyYy5tYWluLmFsaWduXSwgICdtYWluJywgdHJ1ZSkKCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignTWFyZ2lucycpLCAgIHRoaXMuc3JjLm1haW4ubWFyZ2luXSwgJ21haW4nLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdCb3JkZXInKSwgICAgdGhpcy5zcmMubWFpbi5ib3JkZXJdLCAnbWFpbicsIHRydWUpCgoJCWZvciAodmFyIHRhYiBpbiB0aGlzLnNyYykgewoJCQlpZiAodGFiICE9ICdtYWluJykgewoJCQkJZC50YWIodGFiLCB0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW3RhYl0pKTsKCQkJCWZvciAodmFyIG5hbWUgaW4gdGhpcy5zcmNbdGFiXSkgewoJCQkJCXZhciBsID0gdGhpcy5ydGUuaTE4bih0aGlzLmxhYmVsc1tuYW1lXSA/IHRoaXMubGFiZWxzW25hbWVdIDogbmFtZSk7CgkJCQkJaWYgKHRhYiA9PSAnZXZlbnRzJykgewoJCQkJCQl0aGlzLnNyY1t0YWJdW25hbWVdLnZhbCh0aGlzLnJ0ZS51dGlscy50cmltRXZlbnRDYWxsYmFjayh0aGlzLmltZy5hdHRyKG5hbWUpKSk7CgkJCQkJfSBlbHNlIGlmICh0YWIgPT0gJ2xpbmsnKSB7CgkJCQkJCWlmICh0aGlzLmxpbmspIHsKCQkJCQkJCXRoaXMuc3JjW3RhYl1bbmFtZV0udmFsKG5hbWUgPT0gJ2hyZWYnID8gdGhpcy5ydGUudXRpbHMuYWJzb2x1dGVVUkwodGhpcy5saW5rLmF0dHIobmFtZSkpIDogdGhpcy5saW5rLmF0dHIobmFtZSkpOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGhpcy5zcmNbdGFiXVtuYW1lXS52YWwodGhpcy5pbWcuYXR0cihuYW1lKXx8JycpOwoJCQkJCX0KCQkJCQlkLmFwcGVuZChbbCwgdGhpcy5zcmNbdGFiXVtuYW1lXV0sIHRhYiwgdHJ1ZSk7CgkJCQl9CgkJCX0KCQl9OwoJCQkJCgkJZC5vcGVuKCk7CgkJCgkJdmFyIGZzID0gJCgnPGZpZWxkc2V0IC8+JykuYXBwZW5kKCQoJzxsZWdlbmQgLz4nKS50ZXh0KHRoaXMucnRlLmkxOG4oJ1ByZXZpZXcnKSkpCgkJZC5hcHBlbmQoZnMsICdtYWluJyk7CgkJdmFyIGZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CgkJJChmcmFtZSkuYXR0cignc3JjJywgJyMnKS5hZGRDbGFzcygnZWwtcnRlLXByZXZpZXcnKS5hcHBlbmRUbyhmcyk7CgoJCWh0bWwgPSB0aGlzLnJ0ZS5vcHRpb25zLmRvY3R5cGUrJzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz48L2hlYWQ+PGJvZHkgc3R5bGU9InBhZGRpbmc6MDttYXJnaW46MDtmb250LXNpemU6OXB4Ij4gPC9ib2R5PjwvaHRtbD4nOwoJCWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQub3BlbigpOwoJCWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoaHRtbCk7CgkJZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5jbG9zZSgpOwoJCXRoaXMuZnJhbWUgPSBmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50CgkJdGhpcy5wcmV2aWV3ID0gJChmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkpCgkJIAkJCQkgLnRleHQoJ1Byb2luIGVsaXQgYXJjdSwgcnV0cnVtIGNvbW1vZG8sIHZlaGljdWxhIHRlbXB1cywgY29tbW9kbyBhLCByaXN1cy4gQ3VyYWJpdHVyIG5lYyBhcmN1LiBEb25lYyBzb2xsaWNpdHVkaW4gbWkgc2l0IGFtZXQgbWF1cmlzLiBOYW0gZWxlbWVudHVtIHF1YW0gdWxsYW1jb3JwZXIgYW50ZS4gRXRpYW0gYWxpcXVldCBtYXNzYSBldCBsb3JlbS4gTWF1cmlzIGRhcGlidXMgbGFjdXMgYXVjdG9yIHJpc3VzLiBBZW5lYW4gdGVtcG9yIHVsbGFtY29ycGVyIGxlby4gVml2YW11cyBzZWQgbWFnbmEgcXVpcyBsaWd1bGEgZWxlaWZlbmQgYWRpcGlzY2luZy4gRHVpcyBvcmNpLiBBbGlxdWFtIHNvZGFsZXMgdG9ydG9yIHZpdGFlIGlwc3VtLiBBbGlxdWFtIG51bGxhLiBEdWlzIGFsaXF1YW0gbW9sZXN0aWUgZXJhdC4gVXQgZXQgbWF1cmlzIHZlbCBwZWRlIHZhcml1cyBzb2xsaWNpdHVkaW4nKTsKCQkKCQlpZiAodGhpcy5pbWcuYXR0cignc3JjJykpIHsKCQkJCgkJCXRoaXMucHJldkltZyA9ICQodGhpcy5mcmFtZS5jcmVhdGVFbGVtZW50KCdpbWcnKSkKCQkJCS5hdHRyKCdzcmMnLCAgdGhpcy5ydGUudXRpbHMuYWJzb2x1dGVVUkwodGhpcy5pbWcuYXR0cignc3JjJykpKQoJCQkJCgkJCXRoaXMucHJldkltZy5hdHRyKCd3aWR0aCcsIHRoaXMuaW1nLmF0dHIoJ3dpZHRoJykpCgkJCQkuYXR0cignaGVpZ2h0JywgdGhpcy5pbWcuYXR0cignaGVpZ2h0JykpCgkJCQkuYXR0cigndGl0bGUnLCB0aGlzLmltZy5hdHRyKCd0aXRsZScpfHwnJykKCQkJCS5hdHRyKCdhbHQnLCB0aGlzLmltZy5hdHRyKCdhbHQnKXx8JycpCgkJCQkuYXR0cignc3R5bGUnLCB0aGlzLmltZy5hdHRyKCdzdHlsZScpfHwnJykKCQkJZm9yICh2YXIgbiBpbiB0aGlzLnNyYy5hZHYpIHsKCQkJCXZhciBhID0gdGhpcy5pbWcuYXR0cihuKTsKCQkJCWlmIChhKSB7CgkJCQkJdGhpcy5wcmV2SW1nLmF0dHIobiwgYSkKCQkJCX0KCQkJfQkKCQkJCQoJCQl0aGlzLnByZXZpZXcucHJlcGVuZCh0aGlzLnByZXZJbWcpOwoJCQl0aGlzLnVwZGF0ZVZhbHVlcygpOwoJCX0KCQkKCQkkLmVhY2godGhpcy5zcmMsIGZ1bmN0aW9uKCkgewoJCQkkLmVhY2godGhpcywgZnVuY3Rpb24oKSB7CgkJCQlpZiAodGhpcyA9PT0gc2VsZi5zcmMubWFpbi5zcmMpIHsKCQkJCQl0aGlzLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyBzZWxmLnVwZGF0ZVByZXZpZXcoKTsgfSk7CgkJCQl9IGVsc2UgaWYgKHRoaXMgPT0gc2VsZi5zcmMubWFpbi53aWR0aCB8fCB0aGlzID09IHNlbGYuc3JjLm1haW4uaGVpZ2h0KSB7CgkJCQkJdGhpcy5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbihlKSB7c2VsZi51cGRhdGVEaW1lc2lvbnMoZSk7fSk7CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24oKSB7IHNlbGYudXBkYXRlSW1nKCk7IH0pOwoJCQkJfQoJCQl9KTsKCQl9KTsKCQkKCQkvLyB0aGlzLnNyYy5saW5rLmhyZWYuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCS8vIAl2YXIgJHRoaXMgPSAkKHRoaXMpOwoJCS8vIAkkdGhpcy52YWwoc2VsZi5ydGUudXRpbHMuYWJzb2x1dGVVUkwoJHRoaXMudmFsKCkpKTsKCQkvLyB9KTsKCQkKCX0KCQoKCQoJLyoqCgkgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiDQt9C90LDRh9C10L3QuNGPINC/0L7Qu9C10Lkg0YTQvtGA0LzRiyDQuNC3INCw0YLRgtGA0LjQsdGD0YLQvtCyIHByZXZJbWcKCSAqINCS0YvQt9GL0LLQsNC10YLRgdGPINC/0L7RgdC70LUg0LfQsNCz0YDRg9C30LrQuCBwcmV2SW1nCgkgKgoJICoqLwoJdGhpcy51cGRhdGVWYWx1ZXMgPSBmdW5jdGlvbigpIHsKCQkKCQl2YXIgaSA9IHRoaXMucHJldkltZy5nZXQoMCk7CgkJCgkJdGhpcy5vcmlnVyA9IHRoaXMucHJldkltZy5hdHRyKCd3aWR0aCcpOyAKCQl0aGlzLm9yaWdIID0gdGhpcy5wcmV2SW1nLmF0dHIoJ2hlaWdodCcpOwoJCQoJCXRoaXMuc3JjLm1haW4uc3JjLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihpLCAnc3JjJykpOwoJCXRoaXMuc3JjLm1haW4udGl0bGUudmFsKHRoaXMucnRlLmRvbS5hdHRyKGksICd0aXRsZScpKTsJCQoJCXRoaXMuc3JjLm1haW4uYWx0LnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihpLCAnYWx0JykpOwoJCXRoaXMuc3JjLm1haW4ud2lkdGgudmFsKHRoaXMub3JpZ1cpOwoJCXRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCh0aGlzLm9yaWdIKTsKCQl0aGlzLnNyYy5hZHZbJ2NsYXNzJ10udmFsKHRoaXMucnRlLmRvbS5hdHRyKGksICdjbGFzcycpKTsKCQl0aGlzLnNyYy5tYWluLm1hcmdpbi52YWwodGhpcy5wcmV2SW1nKQoJCXZhciBmID0gdGhpcy5wcmV2SW1nLmNzcygnZmxvYXQnKTsKCQl0aGlzLnNyYy5tYWluLmFsaWduLnZhbChmID09ICdsZWZ0JyB8fCBmID09ICdyaWdodCcgPyBmIDogKHRoaXMucHJldkltZy5jc3MoJ3ZlcnRpY2FsLWFsaWduJyl8fCcnKSk7CgkJdGhpcy5zcmMubWFpbi5ib3JkZXIudmFsKHRoaXMucHJldkltZykKCQl0aGlzLnNyYy5hZHYuc3R5bGUudmFsKHRoaXMucnRlLmRvbS5hdHRyKGksICdzdHlsZScpKTsKCX0KCQoJLyoqCgkgKiDQntGH0LjRidCw0LXRgiDQv9C+0LvRjyDRhNC+0YDQvNGLCgkgKgoJICoqLwoJdGhpcy5jbGVhblZhbHVlcyA9IGZ1bmN0aW9uKCkgewoJCSQuZWFjaCh0aGlzLnNyYywgZnVuY3Rpb24oKSB7CgkJCSQuZWFjaCh0aGlzLCBmdW5jdGlvbigpIHsKCQkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCQlpZiAoJHRoaXMuYXR0cignbmFtZScpICE9ICdzcmMnKSB7CgkJCQkJJHRoaXMudmFsKCcnKTsKCQkJCX0KCQkJfSk7CgkJfSk7Cgl9CgkKCS8qKgoJICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0LDRgtGC0YDQuNCx0YPRgtGLIHByZXZJbWcg0LjQtyDQv9C+0LvQtdC5INGE0L7RgNC80YsKCSAqCgkgKiovCgl0aGlzLnVwZGF0ZUltZyA9IGZ1bmN0aW9uKCkgewoJCXRoaXMucHJldkltZy5hdHRyKHsKCQkJCXN0eWxlICA6ICQudHJpbSh0aGlzLnNyYy5hZHYuc3R5bGUudmFsKCkpLAoJCQkJdGl0bGUgIDogJC50cmltKHRoaXMuc3JjLm1haW4udGl0bGUudmFsKCkpLAoJCQkJYWx0ICAgIDogJC50cmltKHRoaXMuc3JjLm1haW4uYWx0LnZhbCgpKSwKCQkJCXdpZHRoICA6IHBhcnNlSW50KHRoaXMuc3JjLm1haW4ud2lkdGgudmFsKCkpLAoJCQkJaGVpZ2h0IDogcGFyc2VJbnQodGhpcy5zcmMubWFpbi5oZWlnaHQudmFsKCkpCgkJCX0pOwoKCQl2YXIgYSA9IHRoaXMuc3JjLm1haW4uYWxpZ24udmFsKCk7CgkJdmFyIGYgPSBhID09ICdsZWZ0JyB8fCBhID09ICdyaWdodCcgPyBhIDogJyc7CgkJCgkJdmFyIGIgPSB0aGlzLnNyYy5tYWluLmJvcmRlci52YWwoKTsgCgkJdmFyIG0gPSB0aGlzLnNyYy5tYWluLm1hcmdpbi52YWwoKTsKCQl0aGlzLnByZXZJbWcuY3NzKCdmbG9hdCcsIGYpOwoJCXRoaXMucHJldkltZy5jc3MoJ3ZlcnRpY2FsLWFsaWduJywgZiA/ICcnIDogYSk7CgkJdGhpcy5wcmV2SW1nLmNzcygnYm9yZGVyJywgJC50cmltKGIud2lkdGgrJyAnK2Iuc3R5bGUrJyAnK2IuY29sb3IpKTsKCQlpZiAobS5jc3MpIHsKCQkJdGhpcy5wcmV2SW1nLmNzcygnbWFyZ2luJywgbS5jc3MpOwoJCX0gZWxzZSB7CgkJCXRoaXMucHJldkltZy5jc3MoJ21hcmdpbi10b3AnLCBtLnRvcCk7CgkJCXRoaXMucHJldkltZy5jc3MoJ21hcmdpbi1yaWdodCcsIG0ucmlnaHQpOwoJCQl0aGlzLnByZXZJbWcuY3NzKCdtYXJnaW4tYm90dG9tJywgbS5ib3R0b20pOwoJCQl0aGlzLnByZXZJbWcuY3NzKCdtYXJnaW4tbGVmdCcsIG0ubGVmdCk7CQkJCQkJCgkJfQoKCQkkLmVhY2goW3RoaXMuc3JjLmV2ZW50cywgdGhpcy5zcmMuYWR2XSwgZnVuY3Rpb24oKSB7CgkJCSQuZWFjaCh0aGlzLCBmdW5jdGlvbigpIHsKCQkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCQl2YXIgbiA9ICR0aGlzLmF0dHIoJ25hbWUnKTsKCQkJCWlmIChuICE9ICdzdHlsZScpIHsKCQkJCQl2YXIgdiA9ICQudHJpbSgkdGhpcy52YWwoKSk7CgkJCQkJaWYgKHYpIHsKCQkJCQkJc2VsZi5wcmV2SW1nLmF0dHIobiwgdik7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5wcmV2SW1nLnJlbW92ZUF0dHIobik7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9KTsKCQkKCX0KCQoJLyoqCgkgKiDQntCx0L3QvtCy0LvRj9C10YIg0YTQvtGA0LzRgyDQstGL0LHQvtGA0LAg0LjQt9C+0LHRgNCw0LbQtdC90LjRjwoJICoKCSAqKi8KCXRoaXMudXBkYXRlUHJldmlldyA9IGZ1bmN0aW9uKCkgewoJCQoJCXZhciBpbWdzcmMgPSB0aGlzLnByZXZJbWcgPyB0aGlzLnByZXZJbWcuYXR0cignc3JjJykgOiAnJzsKCQl2YXIgc3JjICAgID0gJC50cmltKHRoaXMuc3JjLm1haW4uc3JjLnZhbCgpKTsKCQlpZiAoIXNyYyB8fCBzcmMgIT1pbWdzcmMpIHsgLy8gbmV3IGltYWdlIG9yIGVtcHR5IHNyYwoJCQlpZiAodGhpcy5wcmV2SW1nKSB7CgkJCQl0aGlzLnByZXZJbWcucmVtb3ZlKCk7CgkJCQl0aGlzLnByZXZJbWcgPSBudWxsOwoJCQl9CgkJCXRoaXMuY2xlYW5WYWx1ZXMoKTsKCQkJaWYgKHNyYykgeyAgLy8gbmV3IGltYWdlCgkJCQkKCQkJCXRoaXMucHJldkltZyA9ICQodGhpcy5mcmFtZS5jcmVhdGVFbGVtZW50KCdpbWcnKSkKCQkJCQkuYXR0cignc3JjJywgIHRoaXMucnRlLnV0aWxzLmFic29sdXRlVVJMKHNyYykpCgkJCQkJLmJpbmQoJ2xvYWQnLCBmdW5jdGlvbigpIHsKCQkJCQkJc2VsZi51cGRhdGVWYWx1ZXMoKTsKCQkJCQl9KQoJCQkJdGhpcy5wcmV2aWV3LnByZXBlbmQodGhpcy5wcmV2SW1nKTsKCQkJCXNlbGYudXBkYXRlVmFsdWVzKCk7CgkJCX0KCQl9IGVsc2UgeyAvLyB1cGRhdGUgZXhpc3RzZWQgaW1hZ2UKCQkJdGhpcy51cGRhdGVJbWcoKTsKCQl9Cgl9CgkKCXRoaXMudXBkYXRlRGltZXNpb25zID0gZnVuY3Rpb24oZSkgewoJCQoJCXZhciB3ID0gcGFyc2VJbnQodGhpcy5zcmMubWFpbi53aWR0aC52YWwoKSkgIHx8IDA7CgkJdmFyIGggPSBwYXJzZUludCh0aGlzLnNyYy5tYWluLmhlaWdodC52YWwoKSkgfHwgMDsKCQlpZiAodyA+IDAgJiYgaCA+IDApIHsKCQkJaWYgKGUuY3VycmVudFRhcmdldCA9PSB0aGlzLnNyYy5tYWluLndpZHRoLmdldCgwKSkgewoJCQkJCgkJCQl0aGlzLnNyYy5tYWluLmhlaWdodC52YWwocGFyc2VJbnQodyp0aGlzLm9yaWdIL3RoaXMub3JpZ1cpKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuc3JjLm1haW4ud2lkdGgudmFsKHBhcnNlSW50KGgqdGhpcy5vcmlnVy90aGlzLm9yaWdIKSk7CgkJCX0JCgkJfSBlbHNlIHsKCQkJdGhpcy5zcmMubWFpbi53aWR0aC52YWwodGhpcy5vcmlnVyk7CgkJCXRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCh0aGlzLm9yaWdIKTsJCQkKCQl9CgoJCXRoaXMudXBkYXRlSW1nKCk7CgoJfQoJCgl0aGlzLnNldCA9IGZ1bmN0aW9uKCkgewoJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJdGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJaWYgKCF0aGlzLnByZXZJbWcgfHwgIXRoaXMucHJldkltZy5hdHRyKCd3aWR0aCcpKSB7CgkJCXRoaXMuaW1nICAmJiB0aGlzLmltZy5yZW1vdmUoKTsKCQkJdGhpcy5saW5rICYmIHRoaXMucnRlLmRvYy5leGVjQ29tbWFuZCgndW5saW5rJywgZmFsc2UsIG51bGwpOwoJCX0gZWxzZSB7CgkJCWlmICghdGhpcy5pbWdbMF0ucGFyZW50Tm9kZSkgewoJCQkJdGhpcy5pbWcgPSAkKHRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCdpbWcnKSk7CgkJCX0gCgkJCQoJCQl0aGlzLmltZy5hdHRyKHsKCQkJCQlzcmMgICAgOiB0aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCgkLnRyaW0odGhpcy5zcmMubWFpbi5zcmMudmFsKCkpKSwKCQkJCQlzdHlsZSAgOiAkLnRyaW0odGhpcy5ydGUuZG9tLmF0dHIodGhpcy5wcmV2SW1nLmdldCgwKSwgJ3N0eWxlJykpLAoJCQkJCXRpdGxlICA6ICQudHJpbSh0aGlzLnNyYy5tYWluLnRpdGxlLnZhbCgpKSwKCQkJCQlhbHQgICAgOiAkLnRyaW0odGhpcy5zcmMubWFpbi5hbHQudmFsKCkpLAoJCQkJCXdpZHRoICA6IHBhcnNlSW50KHRoaXMuc3JjLm1haW4ud2lkdGgudmFsKCkpLAoJCQkJCWhlaWdodCA6IHBhcnNlSW50KHRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCgpKQoJCQkJfSk7CgkJCQkKCQkJZm9yICh2YXIgX24gaW4gdGhpcy5zcmMuYWR2KSB7CgkJCQlpZiAoX24gIT0gJ3N0eWxlJykgewoJCQkJCXZhciB2YWwgPSB0aGlzLnNyYy5hZHZbX25dLnZhbCgpOwoJCQkJCWlmICh2YWwpIHsKCQkJCQkJdGhpcy5pbWcuYXR0cihfbiwgdmFsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0aGlzLmltZy5yZW1vdmVBdHRyKF9uKQoJCQkJCX0KCQkJCQkKCQkJCX0KCQkJfQoJCQlmb3IgKHZhciBfbiBpbiB0aGlzLnNyYy5ldmVudHMpIHsKCQkJCXZhciB2YWwgPSB0aGlzLnNyYy5ldmVudHNbX25dLnZhbCgpOwoJCQkJaWYgKHZhbCkgewoJCQkJCXRoaXMuaW1nLmF0dHIoX24sIHZhbCk7CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMuaW1nLnJlbW92ZUF0dHIoX24pCgkJCQl9CgkJCX0KCQkJCQoJCQlpZiAoIXRoaXMuaW1nWzBdLnBhcmVudE5vZGUpIHsKCQkJCXRoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnROb2RlKHRoaXMuaW1nLmdldCgwKSkKCQkJfQoJCX0KCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCX0KCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSwKCQkJJG4gPSAkKG4pOwoJCWlmIChuLm5vZGVOYW1lID09ICdJTUcnICYmICEkbi5oYXNDbGFzcygnZWxydGUtcHJvdGVjdGVkJykpIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdhY3RpdmUnKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCX0KCQp9Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3Mg0KPQstC10LvQuNGH0LXQvdC40LUg0L7RgtGB0YLRg9C/0LAKICog0YHQv9C40YHQutC4IC0g0LXRgdC70Lgg0LLRi9C00LXQu9C10L0g0L7QtNC40L0g0Y3Qu9C10LzQtdC90YIgLSDRg9Cy0LXQu9C40YfQuNCy0LDQtdGC0YHRjyDQstC70L7QttC10L3QvdC+0YHRgtGMINGB0L/QuNGB0LrQsCwg0LIg0L7RgdGC0LDQu9GM0L3Ri9GFINGB0LvRg9GH0LDRj9GFIC0gcGFkZGluZyDRgyDRgNC+0LTQuNGC0LXQu9GM0YHQutC+0LPQviB1bHxvbAogKiDQldGB0LvQuCDRgtCw0LHQu9C40YbQsCDQstGL0LTQtdC70LXQvdCwINC/0L7Qu9C90L7RgdGC0YzRjiAtINC10Lkg0LTQvtCx0LDQstC70Y/QtdGC0YHRjyBtYXJnaW4sINC10YHQu9C4INGH0LDRgdGC0LjRh9C90L4gLSDRg9Cy0LXQu9C40YfQuNCy0LDQtdGC0YHRjyBwYWRkaW5nINC00LvRjyDRj9GH0LXQtdC6CiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5pbmRlbnQgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQl2YXIgbm9kZXMgPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe2NvbGxhcHNlZCA6IHRydWUsIGJsb2NrcyA6IHRydWUsIHdyYXAgOiAnaW5saW5lJywgdGFnIDogJ3AnfSk7CgoJCWZ1bmN0aW9uIGluZGVudChuKSB7CgkJCXZhciBjc3MgPSAvKElNR3xIUnxUQUJMRXxFTUJFRHxPQkpFQ1QpLy50ZXN0KG4ubm9kZU5hbWUpID8gJ21hcmdpbi1sZWZ0JyA6ICdwYWRkaW5nLWxlZnQnOwoJCQl2YXIgdmFsID0gc2VsZi5ydGUuZG9tLmF0dHIobiwgJ3N0eWxlJykuaW5kZXhPZihjc3MpICE9IC0xID8gcGFyc2VJbnQoJChuKS5jc3MoY3NzKSl8fDAgOiAwOwoJCQkkKG4pLmNzcyhjc3MsIHZhbCs0MCsncHgnKTsKCQl9CgkJCgkJZm9yICh2YXIgaT0wOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJaWYgKC9eKFRBQkxFfFRIRUFEfFRGT09UfFRCT0RZfENPTHxDT0xHUk9VUHxUUikkLy50ZXN0KG5vZGVzW2ldLm5vZGVOYW1lKSkgewoJCQkJJChub2Rlc1tpXSkuZmluZCgndGQsdGgnKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCWluZGVudCh0aGlzKTsKCQkJCX0pOwoJCQl9IGVsc2UgaWYgKC9eTEkkLy50ZXN0KG5vZGVzW2ldLm5vZGVOYW1lKSkgewoJCQkJdmFyIG4gPSAkKG5vZGVzW2ldKTsKCQkJCSQodGhpcy5ydGUuZG9tLmNyZWF0ZShub2Rlc1tpXS5wYXJlbnROb2RlLm5vZGVOYW1lKSkKCQkJCQkuYXBwZW5kKCQodGhpcy5ydGUuZG9tLmNyZWF0ZSgnbGknKSkuaHRtbChuLmh0bWwoKXx8JycpKS5hcHBlbmRUbyhuLmh0bWwoJyZuYnNwOycpKTsKCQkJfSBlbHNlIHsKCQkJCWluZGVudChub2Rlc1tpXSk7CgkJCX0KCQl9OwoJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCX0KCn0KfSkoalF1ZXJ5KTsKLyoqCiAqIEBjbGFzcyBidXR0b24gLSBqdXN0aWZ5IHRleHQKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlsZWZ0ID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl0aGlzLmFsaWduID0gdGhpcy5uYW1lID09ICdqdXN0aWZ5ZnVsbCcgPyAnanVzdGlmeScgOiB0aGlzLm5hbWUucmVwbGFjZSgnanVzdGlmeScsICcnKTsKCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7Y29sbGFwc2VkOnRydWUsIGJsb2NrcyA6IHRydWUsIHRhZyA6ICdkaXYnfSksCgkJCWwgPSBzLmxlbmd0aDsKCQlsICYmIHRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJd2hpbGUgKGwtLSkgewoJCQl0aGlzLnJ0ZS5kb20uZmlsdGVyKHNbbF0sICd0ZXh0Tm9kZXMnKSAmJiAkKHNbbF0pLmNzcygndGV4dC1hbGlnbicsIHRoaXMuYWxpZ24pOwoJCX0KCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl2YXIgcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksIAoJCQluID0gcy5ub2RlTmFtZSA9PSAnQk9EWScgPyBzIDogdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudChzLCAndGV4dE5vZGVzJyl8fChzLnBhcmVudE5vZGUgJiYgcy5wYXJlbnROb2RlLm5vZGVOYW1lID09ICdCT0RZJyA/IHMucGFyZW50Tm9kZSA6IG51bGwpOwoJCWlmIChuKSB7CgkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKS50b2dnbGVDbGFzcygnYWN0aXZlJywgJChuKS5jc3MoJ3RleHQtYWxpZ24nKSA9PSB0aGlzLmFsaWduKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJfQoJfQoJCn0KCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5qdXN0aWZ5Y2VudGVyID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlsZWZ0OwplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuanVzdGlmeXJpZ2h0ICA9IGVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5qdXN0aWZ5bGVmdDsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlmdWxsICAgPSBlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuanVzdGlmeWxlZnQ7Cgp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIGluc2VydC9lZGl0IGxpbmsgKG9wZW4gZGlhbG9nIHdpbmRvdykKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQ29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMubGluayA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdmFyIHNlbGYgPSB0aGlzOwoJdGhpcy5pbWcgPSBmYWxzZTsKCQoJZnVuY3Rpb24gaW5pdCgpIHsKCQlzZWxmLmxhYmVscyA9IHsKCQkJaWQgICAgICAgIDogJ0lEJywKCQkJJ2NsYXNzJyAgIDogJ0NzcyBjbGFzcycsCgkJCXN0eWxlICAgICA6ICdDc3Mgc3R5bGUnLAoJCQlkaXIgICAgICAgOiAnU2NyaXB0IGRpcmVjdGlvbicsCgkJCWxhbmcgICAgICA6ICdMYW5ndWFnZScsCgkJCWNoYXJzZXQgICA6ICdDaGFyc2V0JywKCQkJdHlwZSAgICAgIDogJ1RhcmdldCBNSU1FIHR5cGUnLAoJCQlyZWwgICAgICAgOiAnUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJywKCQkJcmV2ICAgICAgIDogJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KScsCgkJCXRhYmluZGV4ICA6ICdUYWIgaW5kZXgnLAoJCQlhY2Nlc3NrZXkgOiAnQWNjZXNzIGtleScKCQl9CgkJc2VsZi5zcmMgPSB7CgkJCW1haW4gOiB7CgkJCQlocmVmICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCXRpdGxlICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJYW5jaG9yIDogJCgnPHNlbGVjdCAvPicpLmF0dHIoJ25hbWUnLCAnYW5jaG9yJyksCgkJCQl0YXJnZXQgOiAkKCc8c2VsZWN0IC8+JykKCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0luIHRoaXMgd2luZG93JykpLnZhbCgnJykpCgkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdJbiBuZXcgd2luZG93IChfYmxhbmspJykpLnZhbCgnX2JsYW5rJykpCgkJCQkvLyAJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknKSkudmFsKCdfcGFyZW50JykpCgkJCQkvLyAJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdJbiB0b3AgZnJhbWUgKF90b3ApJykpLnZhbCgnX3RvcCcpKQoJCQl9LAoKCQkJcG9wdXAgOiB7CgkJCQl1c2UgICAgICAgIDogJCgnPGlucHV0IHR5cGU9ImNoZWNrYm94IC8+IicpLAoJCQkJdXJsICAgICAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicgICAgKS52YWwoJ2h0dHA6Ly8nKSwKCQkJCW5hbWUgICAgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nICAgICksCgkJCQl3aWR0aCAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyAgICApLmF0dHIoe3NpemUgOiA2LCB0aXRsZSA6IHNlbGYucnRlLmkxOG4oJ1dpZHRoJyl9ICkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JyksCgkJCQloZWlnaHQgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyAgICApLmF0dHIoe3NpemUgOiA2LCB0aXRsZSA6IHNlbGYucnRlLmkxOG4oJ0hlaWdodCcpfSkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JyksCgkJCQlsZWZ0ICAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyAgICApLmF0dHIoe3NpemUgOiA2LCB0aXRsZSA6IHNlbGYucnRlLmkxOG4oJ0xlZnQnKX0gICkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JyksCgkJCQl0b3AgICAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyAgICApLmF0dHIoe3NpemUgOiA2LCB0aXRsZSA6IHNlbGYucnRlLmkxOG4oJ1RvcCcpfSAgICkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JyksCgkJCQlsb2NhdGlvbiAgIDogJCgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLAkJCQkKCQkJCW1lbnViYXIgICAgOiAkKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giIC8+JyksCgkJCQl0b29sYmFyICAgIDogJCgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLAoJCQkJc2Nyb2xsYmFycyA6ICQoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz4nKSwKCQkJCXN0YXR1cyAgICAgOiAkKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giIC8+JyksCgkJCQlyZXNpemFibGUgIDogJCgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLAoJCQkJZGVwZW5kZW50ICA6ICQoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz4nKSwKCQkJCXJldGZhbHNlICAgOiAkKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giIC8+JykuYXR0cignY2hlY2tlZCcsIHRydWUpCgkJCX0sCgoJCQlhZHYgOiB7CgkJCQlpZCAgICAgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCSdjbGFzcycgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJc3R5bGUgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQlkaXIgICAgICAgOiAkKCc8c2VsZWN0IC8+JykKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnRleHQoc2VsZi5ydGUuaTE4bignTm90IHNldCcpKS52YWwoJycpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdMZWZ0IHRvIHJpZ2h0JykpLnZhbCgnbHRyJykpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ1JpZ2h0IHRvIGxlZnQnKSkudmFsKCdydGwnKSksCgkJCQlsYW5nICAgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCWNoYXJzZXQgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJdHlwZSAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQlyZWwgICAgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCXJldiAgICAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJdGFiaW5kZXggIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQlhY2Nlc3NrZXkgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKQoJCQl9LAoJCQlldmVudHMgOiB7fQoJCX0KCgkJJC5lYWNoKAoJCQlbJ29uYmx1cicsICdvbmZvY3VzJywgJ29uY2xpY2snLCAnb25kYmxjbGljaycsICdvbm1vdXNlZG93bicsICdvbm1vdXNldXAnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbm1vdXNlbGVhdmUnLCAnb25rZXlkb3duJywgJ29ua2V5cHJlc3MnLCAnb25rZXl1cCddLCAKCQkJZnVuY3Rpb24oKSB7CgkJCQlzZWxmLnNyYy5ldmVudHNbdGhpc10gPSAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKTsKCQl9KTsKCgkJJC5lYWNoKHNlbGYuc3JjLCBmdW5jdGlvbigpIHsKCQkJZm9yICh2YXIgbiBpbiB0aGlzKSB7CgkJCQl0aGlzW25dLmF0dHIoJ25hbWUnLCBuKTsKCQkJCXZhciB0ID0gdGhpc1tuXS5hdHRyKCd0eXBlJyk7CgkJCQlpZiAoIXQgfHwgKHQgPT0gJ3RleHQnICAmJiAhdGhpc1tuXS5hdHRyKCdzaXplJykpICkgewoJCQkJCXRoaXNbbl0uY3NzKCd3aWR0aCcsICcxMDAlJyk7CgkJCQl9CgkJCX0KCQl9KTsKCQkKCX0KCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLAoJCQlzZWwsIGksIHYsIG9wdHMsIGwsIHIsIGxpbmssIGhyZWYsIHM7CgkJCgkJIXRoaXMuc3JjICYmIGluaXQoKTsKCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCgkJZnVuY3Rpb24gaXNMaW5rKG4pIHsgcmV0dXJuIG4ubm9kZU5hbWUgPT0gJ0EnICYmIG4uaHJlZjsgfQoJCQoJCXRoaXMubGluayA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnRMaW5rKG4pOwoJCQoJCWlmICghdGhpcy5saW5rKSB7CgkJCXNlbCA9ICQuYnJvd3Nlci5tc2llID8gdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdGVkKCkgOiB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe3dyYXAgOiBmYWxzZX0pOwoJCQlpZiAoc2VsLmxlbmd0aCkgewoJCQkJZm9yIChpPTA7IGkgPCBzZWwubGVuZ3RoOyBpKyspIHsKCQkJCQlpZiAoaXNMaW5rKHNlbFtpXSkpIHsKCQkJCQkJdGhpcy5saW5rID0gc2VsW2ldOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9OwoJCQkJaWYgKCF0aGlzLmxpbmspIHsKCQkJCQl0aGlzLmxpbmsgPSB0aGlzLnJ0ZS5kb20ucGFyZW50KHNlbFswXSwgaXNMaW5rKSB8fCB0aGlzLnJ0ZS5kb20ucGFyZW50KHNlbFtzZWwubGVuZ3RoLTFdLCBpc0xpbmspOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXRoaXMubGluayA9IHRoaXMubGluayA/ICQodGhpcy5saW5rKSA6ICQodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoJ2EnKSk7CgkJdGhpcy5pbWcgPSBuLm5vZGVOYW1lID09ICdJTUcnID8gbiA6IG51bGw7CgkJdGhpcy51cGRhdGVQb3B1cCgpOwoJCQoJCXRoaXMuc3JjLm1haW4uYW5jaG9yLmVtcHR5KCk7CgkJJCgnYVtocmVmIT0iIl1bbmFtZV0nLCB0aGlzLnJ0ZS5kb2MpLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBuID0gJCh0aGlzKS5hdHRyKCduYW1lJyk7CgkJCXNlbGYuc3JjLm1haW4uYW5jaG9yLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKG4pLnRleHQobikpOwoJCX0pOwoJCWlmICh0aGlzLnNyYy5tYWluLmFuY2hvci5jaGlsZHJlbigpLmxlbmd0aCkgewoJCQl0aGlzLnNyYy5tYWluLmFuY2hvci5wcmVwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJycpLnRleHQodGhpcy5ydGUuaTE4bignU2VsZWN0IGJvb2ttYXJrJykpICkKCQkJCS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCQkJdmFyIHYgPSAkKHRoaXMpLnZhbCgpOwoJCQkJCWlmICh2KSB7CgkJCQkJCXNlbGYuc3JjLm1haW4uaHJlZi52YWwoJyMnK3YpOwoJCQkJCX0KCQkJCX0pOwoJCX0KCQkKCQlvcHRzID0gewoJCQlydGwgOiB0aGlzLnJ0ZS5ydGwsCgkJCXN1Ym1pdCA6IGZ1bmN0aW9uKGUsIGQpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzZWxmLnNldCgpOyBkLmNsb3NlKCk7IH0sCgkJCXRhYnMgOiB7IHNob3cgOiBmdW5jdGlvbihlLCB1aSkgeyBpZiAodWkuaW5kZXg9PTMpIHsgc2VsZi51cGRhdGVPbmNsaWNrKCk7IH0gfSB9LAoJCQljbG9zZSA6IGZ1bmN0aW9uKCkge3NlbGYucnRlLmJyb3dzZXIubXNpZSAmJiBzZWxmLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTsgfSwKCQkJZGlhbG9nIDogewoJCQkJd2lkdGggOiAnYXV0bycsCgkJCQl3aWR0aCA6IDQzMCwKCQkJCXRpdGxlIDogdGhpcy5ydGUuaTE4bignTGluaycpCgkJCQkKCQkJfQoJCX0KCQlkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKTsKCQkKCQlsID0gJCgnPGRpdiAvPicpCgkJCS5hcHBlbmQoICQoJzxsYWJlbCAvPicpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbikuYXBwZW5kKHRoaXMucnRlLmkxOG4oJ0xvY2F0aW9uIGJhcicpKSkKCQkJLmFwcGVuZCggJCgnPGxhYmVsIC8+JykuYXBwZW5kKHRoaXMuc3JjLnBvcHVwLm1lbnViYXIpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdNZW51IGJhcicpKSkKCQkJLmFwcGVuZCggJCgnPGxhYmVsIC8+JykuYXBwZW5kKHRoaXMuc3JjLnBvcHVwLnRvb2xiYXIpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdUb29sYmFyJykpKQkJCQkKCQkJLmFwcGVuZCggJCgnPGxhYmVsIC8+JykuYXBwZW5kKHRoaXMuc3JjLnBvcHVwLnNjcm9sbGJhcnMpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdTY3JvbGxiYXJzJykpKTsKCQlyID0gJCgnPGRpdiAvPicpCgkJCS5hcHBlbmQoICQoJzxsYWJlbCAvPicpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5zdGF0dXMpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdTdGF0dXMgYmFyJykpKQoJCQkuYXBwZW5kKCAkKCc8bGFiZWwgLz4nKS5hcHBlbmQodGhpcy5zcmMucG9wdXAucmVzaXphYmxlKS5hcHBlbmQodGhpcy5ydGUuaTE4bignUmVzaXphYmxlJykpKQoJCQkuYXBwZW5kKCAkKCc8bGFiZWwgLz4nKS5hcHBlbmQodGhpcy5zcmMucG9wdXAuZGVwZW5kZW50KS5hcHBlbmQodGhpcy5ydGUuaTE4bignRGVwZWRlbnQnKSkpCQkJCQoJCQkuYXBwZW5kKCAkKCc8bGFiZWwgLz4nKS5hcHBlbmQodGhpcy5zcmMucG9wdXAucmV0ZmFsc2UpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdBZGQgcmV0dXJuIGZhbHNlJykpKTsKCQkKCQlkLnRhYignbWFpbicsIHRoaXMucnRlLmkxOG4oJ1Byb3BlcmllcycpKQoJCQkudGFiKCdwb3B1cCcsICB0aGlzLnJ0ZS5pMThuKCdQb3B1cCcpKQoJCQkudGFiKCdhZHYnLCAgICB0aGlzLnJ0ZS5pMThuKCdBZHZhbmNlZCcpKQoJCQkudGFiKCdldmVudHMnLCB0aGlzLnJ0ZS5pMThuKCdFdmVudHMnKSkKCQkJLmFwcGVuZCgkKCc8bGFiZWwgLz4nKS5hcHBlbmQodGhpcy5zcmMucG9wdXAudXNlKS5hcHBlbmQodGhpcy5ydGUuaTE4bignT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdycpKSwgJ3BvcHVwJykKCQkJLnNlcGFyYXRvcigncG9wdXAnKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdVUkwnKSwgIHRoaXMuc3JjLnBvcHVwLnVybF0sICAncG9wdXAnLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdXaW5kb3cgbmFtZScpLCB0aGlzLnNyYy5wb3B1cC5uYW1lXSwgJ3BvcHVwJywgdHJ1ZSkKCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignV2luZG93IHNpemUnKSwgJCgnPHNwYW4gLz4nKS5hcHBlbmQodGhpcy5zcmMucG9wdXAud2lkdGgpLmFwcGVuZCgnIHggJykuYXBwZW5kKHRoaXMuc3JjLnBvcHVwLmhlaWdodCkuYXBwZW5kKCcgcHgnKV0sICdwb3B1cCcsIHRydWUpCgkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ1dpbmRvdyBwb3NpdGlvbicpLCAkKCc8c3BhbiAvPicpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5sZWZ0KS5hcHBlbmQoJyB4ICcpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC50b3ApLmFwcGVuZCgnIHB4JyldLCAncG9wdXAnLCB0cnVlKQkJCQkKCQkJLnNlcGFyYXRvcigncG9wdXAnKQoJCQkuYXBwZW5kKFtsLCByXSwgJ3BvcHVwJywgdHJ1ZSk7CgoJCWxpbmsgPSB0aGlzLmxpbmsuZ2V0KDApOwoJCWhyZWYgPSB0aGlzLnJ0ZS5kb20uYXR0cihsaW5rLCAnaHJlZicpOwoJCXRoaXMuc3JjLm1haW4uaHJlZi52YWwoaHJlZikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQkkKHRoaXMpLnZhbChzZWxmLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCgkKHRoaXMpLnZhbCgpKSk7CgkJfSk7CgkJCgkJaWYgKHRoaXMucnRlLm9wdGlvbnMuZm1BbGxvdyAmJiB0aGlzLnJ0ZS5vcHRpb25zLmZtT3BlbikgewoJCQl2YXIgcyA9ICQoJzxzcGFuIC8+JykuYXBwZW5kKHRoaXMuc3JjLm1haW4uaHJlZi5jc3MoJ3dpZHRoJywgJzg3JScpKQoJCQkJLmFwcGVuZCgKCQkJCQkkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwnKQoJCQkJCQkuY3NzKHsnZmxvYXQnIDogJ3JpZ2h0JywgJ21hcmdpbi1yaWdodCcgOiAnM3B4J30pCgkJCQkJCS5hdHRyKCd0aXRsZScsIHNlbGYucnRlLmkxOG4oJ09wZW4gZmlsZSBtYW5nZXInKSkKCQkJCQkJLmFwcGVuZCgkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd1aS1pY29uIHVpLWljb24tZm9sZGVyLW9wZW4nKSkKCQkJCQkJCS5jbGljayggZnVuY3Rpb24oKSB7CgkJCQkJCQkJc2VsZi5ydGUub3B0aW9ucy5mbU9wZW4oIGZ1bmN0aW9uKHVybCkgeyBzZWxmLnNyYy5tYWluLmhyZWYudmFsKHVybCkuY2hhbmdlKCk7IH0gKTsKCQkJCQkJCX0pCgkJCQkJCQkuaG92ZXIoZnVuY3Rpb24oKSB7JCh0aGlzKS5hZGRDbGFzcygndWktc3RhdGUtaG92ZXInKX0sIGZ1bmN0aW9uKCkgeyAkKHRoaXMpLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpfSkKCQkJCSk7CgkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdMaW5rIFVSTCcpLCBzXSwgJ21haW4nLCB0cnVlKTsKCQl9IGVsc2UgewoJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignTGluayBVUkwnKSwgdGhpcy5zcmMubWFpbi5ocmVmXSwgJ21haW4nLCB0cnVlKTsKCQl9CgkJdGhpcy5zcmMubWFpbi5ocmVmLmNoYW5nZSgpOwoJCQoJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdUaXRsZScpLCB0aGlzLnNyYy5tYWluLnRpdGxlLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihsaW5rLCAndGl0bGUnKSldLCAnbWFpbicsIHRydWUpOwoJCWlmICh0aGlzLnNyYy5tYWluLmFuY2hvci5jaGlsZHJlbigpLmxlbmd0aCkgewoJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQm9va21hcmsnKSwgdGhpcy5zcmMubWFpbi5hbmNob3IudmFsKGhyZWYpXSwgJ21haW4nLCB0cnVlKQoJCX0KCQlpZiAoIXRoaXMucnRlLm9wdGlvbnMuZG9jdHlwZS5tYXRjaCgveGh0bWwvKSkgewoJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignVGFyZ2V0JyksIHRoaXMuc3JjLm1haW4udGFyZ2V0LnZhbCh0aGlzLmxpbmsuYXR0cigndGFyZ2V0Jyl8fCcnKV0sICdtYWluJywgdHJ1ZSk7CgkJfQoJCQoKCgkJZm9yICh2YXIgbiBpbiB0aGlzLnNyYy5hZHYpIHsKCQkJdGhpcy5zcmMuYWR2W25dLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihsaW5rLCBuKSk7CgkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW25dID8gdGhpcy5sYWJlbHNbbl0gOiBuKSwgdGhpcy5zcmMuYWR2W25dXSwgJ2FkdicsIHRydWUpOwoJCX0KCQlmb3IgKHZhciBuIGluIHRoaXMuc3JjLmV2ZW50cykgewoJCQl2YXIgdiA9IHRoaXMucnRlLnV0aWxzLnRyaW1FdmVudENhbGxiYWNrKHRoaXMucnRlLmRvbS5hdHRyKGxpbmssIG4pKTsKCQkJdGhpcy5zcmMuZXZlbnRzW25dLnZhbCh2KTsKCQkJZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbbl0gPyB0aGlzLmxhYmVsc1tuXSA6IG4pLCB0aGlzLnNyYy5ldmVudHNbbl1dLCAnZXZlbnRzJywgdHJ1ZSk7CgkJfQoJCQoJCXRoaXMuc3JjLnBvcHVwLnVzZS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCXZhciBjID0gJCh0aGlzKS5hdHRyKCdjaGVja2VkJyk7CgkJCSQuZWFjaChzZWxmLnNyYy5wb3B1cCwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoJCh0aGlzKS5hdHRyKCduYW1lJykgIT0gJ3VzZScpIHsKCQkJCQlpZiAoYykgewoJCQkJCQkkKHRoaXMpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJCh0aGlzKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpOwoJCQkJCX0KCQkJCX0KCQkJfSkKCQl9KTsKCQl0aGlzLnNyYy5wb3B1cC51c2UuY2hhbmdlKCk7CgkJZC5vcGVuKCk7Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpOwoJCQoJCS8vIHZhciB0ID0gdGhpcy5ydGUuZG9tLnNlbGVjdGlvbkhhcyhmdW5jdGlvbihuKSB7IHJldHVybiBuLm5vZGVOYW1lID09ICdBJyAmJiBuLmhyZWY7IH0pOwoJCS8vIHRoaXMucnRlLmxvZyh0KQoJCQoJCWlmICh0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50TGluayhuKSkgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoJCX0gZWxzZSBpZiAodGhpcy5ydGUuZG9tLnNlbGVjdGlvbkhhcyhmdW5jdGlvbihuKSB7IHJldHVybiBuLm5vZGVOYW1lID09ICdBJyAmJiBuLmhyZWY7IH0pKSB7CgkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKS5hZGRDbGFzcygnYWN0aXZlJyk7CgkJfSBlbHNlIGlmICghdGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpIHx8IG4ubm9kZU5hbWUgPT0gJ0lNRycpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCBhY3RpdmUnKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoJ2Rpc2FibGVkJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCX0KCQoJdGhpcy51cGRhdGVQb3B1cCA9IGZ1bmN0aW9uKCkgewoJCXZhciBvbmNsaWNrID0gdGhpcy5ydGUuZG9tLmF0dHIodGhpcy5saW5rLmdldCgwKSwgJ29uY2xpY2snKTsKCQlvbmNsaWNrID0gb25jbGljayA/ICQudHJpbShvbmNsaWNrLnRvU3RyaW5nKCkpIDogJycKCQlpZiAoIG9uY2xpY2subGVuZ3RoPjAgJiYgKG0gPSBvbmNsaWNrLm1hdGNoKC93aW5kb3cub3BlblwoIihbXiJdKykiLFxzKiIoW14iXSopIixccyoiKFteIl0qKSJccyouKlwpO1xzKihyZXR1cm5ccytmYWxzZSk/LykpKSB7CgkJCXRoaXMuc3JjLnBvcHVwLnVzZS5hdHRyKCdjaGVja2VkJywgJ29uJykKCQkJdGhpcy5zcmMucG9wdXAudXJsLnZhbChtWzFdKTsKCQkJdGhpcy5zcmMucG9wdXAubmFtZS52YWwobVsyXSk7CgoJCQlpZiAoIC9sb2NhdGlvbj15ZXMvLnRlc3QobVszXSkgKSB7CgkJCQl0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbi5hdHRyKCdjaGVja2VkJywgdHJ1ZSk7CgkJCX0KCQkJaWYgKCAvbWVudWJhcj15ZXMvLnRlc3QobVszXSkgKSB7CgkJCQl0aGlzLnNyYy5wb3B1cC5tZW51YmFyLmF0dHIoJ2NoZWNrZWQnLCB0cnVlKTsKCQkJfQoJCQlpZiAoIC90b29sYmFyPXllcy8udGVzdChtWzNdKSApIHsKCQkJCXRoaXMuc3JjLnBvcHVwLnRvb2xiYXIuYXR0cignY2hlY2tlZCcsIHRydWUpOwoJCQl9CgkJCWlmICggL3Njcm9sbGJhcnM9eWVzLy50ZXN0KG1bM10pICkgewoJCQkJdGhpcy5zcmMucG9wdXAuc2Nyb2xsYmFycy5hdHRyKCdjaGVja2VkJywgdHJ1ZSk7CgkJCX0KCQkJaWYgKCAvc3RhdHVzPXllcy8udGVzdChtWzNdKSApIHsKCQkJCXRoaXMuc3JjLnBvcHVwLnN0YXR1cy5hdHRyKCdjaGVja2VkJywgdHJ1ZSk7CgkJCX0KCQkJaWYgKCAvcmVzaXphYmxlPXllcy8udGVzdChtWzNdKSApIHsKCQkJCXRoaXMuc3JjLnBvcHVwLnJlc2l6YWJsZS5hdHRyKCdjaGVja2VkJywgdHJ1ZSk7CgkJCX0KCQkJaWYgKCAvZGVwZW5kZW50PXllcy8udGVzdChtWzNdKSApIHsKCQkJCXRoaXMuc3JjLnBvcHVwLmRlcGVuZGVudC5hdHRyKCdjaGVja2VkJywgdHJ1ZSk7CgkJCX0KCQkJaWYgKChfbSA9IG1bM10ubWF0Y2goL3dpZHRoPShbXixdKykvKSkpIHsKCQkJCXRoaXMuc3JjLnBvcHVwLndpZHRoLnZhbChfbVsxXSk7CgkJCX0KCQkJaWYgKChfbSA9IG1bM10ubWF0Y2goL2hlaWdodD0oW14sXSspLykpKSB7CgkJCQl0aGlzLnNyYy5wb3B1cC5oZWlnaHQudmFsKF9tWzFdKTsKCQkJfQoJCQlpZiAoKF9tID0gbVszXS5tYXRjaCgvbGVmdD0oW14sXSspLykpKSB7CgkJCQl0aGlzLnNyYy5wb3B1cC5sZWZ0LnZhbChfbVsxXSk7CgkJCX0KCQkJaWYgKChfbSA9IG1bM10ubWF0Y2goL3RvcD0oW14sXSspLykpKSB7CgkJCQl0aGlzLnNyYy5wb3B1cC50b3AudmFsKF9tWzFdKTsKCQkJfQoJCQlpZiAobVs0XSkgewoJCQkJdGhpcy5zcmMucG9wdXAucmV0ZmFsc2UuYXR0cignY2hlY2tlZCcsIHRydWUpOwoJCQl9CgkJfSBlbHNlIHsKCQkJJC5lYWNoKHRoaXMuc3JjLnBvcHVwLCBmdW5jdGlvbigpIHsKCQkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCQlpZiAoJHRoaXMuYXR0cigndHlwZScpID09ICd0ZXh0JykgewoJCQkJCSR0aGlzLnZhbCgkdGhpcy5hdHRyKCduYW1lJykgPT0gJ3VybCcgPyAnaHR0cDovLycgOiAnJyk7CgkJCQl9IGVsc2UgewoJCQkJCWlmICgkdGhpcy5hdHRyKCduYW1lJykgPT0gJ3JldGZhbHNlJykgewoJCQkJCQl0aGlzLmF0dHIoJ2NoZWNrZWQnLCB0cnVlKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGhpcy5yZW1vdmVBdHRyKCdjaGVja2VkJyk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9CgkJCgl9CgkKCXRoaXMudXBkYXRlT25jbGljayA9IGZ1bmN0aW9uICgpIHsKCQl2YXIgdXJsID0gdGhpcy5zcmMucG9wdXAudXJsLnZhbCgpOwoJCWlmICh0aGlzLnNyYy5wb3B1cC51c2UuYXR0cignY2hlY2tlZCcpICYmIHVybCkgewoJCQl2YXIgcGFyYW1zID0gJyc7CgkJCWlmICh0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbi5hdHRyKCdjaGVja2VkJykpIHsKCQkJCXBhcmFtcyArPSAnbG9jYXRpb249eWVzLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLm1lbnViYXIuYXR0cignY2hlY2tlZCcpKSB7CgkJCQlwYXJhbXMgKz0gJ21lbnViYXI9eWVzLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLnRvb2xiYXIuYXR0cignY2hlY2tlZCcpKSB7CgkJCQlwYXJhbXMgKz0gJ3Rvb2xiYXI9eWVzLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLnNjcm9sbGJhcnMuYXR0cignY2hlY2tlZCcpKSB7CgkJCQlwYXJhbXMgKz0gJ3Njcm9sbGJhcnM9eWVzLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLnN0YXR1cy5hdHRyKCdjaGVja2VkJykpIHsKCQkJCXBhcmFtcyArPSAnc3RhdHVzPXllcywnOwoJCQl9CgkJCWlmICh0aGlzLnNyYy5wb3B1cC5yZXNpemFibGUuYXR0cignY2hlY2tlZCcpKSB7CgkJCQlwYXJhbXMgKz0gJ3Jlc2l6YWJsZT15ZXMsJzsKCQkJfQoJCQlpZiAodGhpcy5zcmMucG9wdXAuZGVwZW5kZW50LmF0dHIoJ2NoZWNrZWQnKSkgewoJCQkJcGFyYW1zICs9ICdkZXBlbmRlbnQ9eWVzLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLndpZHRoLnZhbCgpKSB7CgkJCQlwYXJhbXMgKz0gJ3dpZHRoPScrdGhpcy5zcmMucG9wdXAud2lkdGgudmFsKCkrJywnOwoJCQl9CgkJCWlmICh0aGlzLnNyYy5wb3B1cC5oZWlnaHQudmFsKCkpIHsKCQkJCXBhcmFtcyArPSAnaGVpZ2h0PScrdGhpcy5zcmMucG9wdXAuaGVpZ2h0LnZhbCgpKycsJzsKCQkJfQoJCQlpZiAodGhpcy5zcmMucG9wdXAubGVmdC52YWwoKSkgewoJCQkJcGFyYW1zICs9ICdsZWZ0PScrdGhpcy5zcmMucG9wdXAubGVmdC52YWwoKSsnLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLnRvcC52YWwoKSkgewoJCQkJcGFyYW1zICs9ICd0b3A9Jyt0aGlzLnNyYy5wb3B1cC50b3AudmFsKCkrJywnOwoJCQl9CgkJCWlmIChwYXJhbXMubGVuZ3RoPjApIHsKCQkJCXBhcmFtcyA9IHBhcmFtcy5zdWJzdHJpbmcoMCwgcGFyYW1zLmxlbmd0aC0xKQoJCQl9CgkJCXZhciByZXRmYWxzZSA9IHRoaXMuc3JjLnBvcHVwLnJldGZhbHNlLmF0dHIoJ2NoZWNrZWQnKSA/ICdyZXR1cm4gZmFsc2U7JyA6ICcnOwoJCQl2YXIgb25jbGljayA9ICd3aW5kb3cub3BlbigiJyt1cmwrJyIsICInKyQudHJpbSh0aGlzLnNyYy5wb3B1cC5uYW1lLnZhbCgpKSsnIiwgIicrcGFyYW1zKyciKTsnK3JldGZhbHNlOwoJCQl0aGlzLnNyYy5ldmVudHMub25jbGljay52YWwob25jbGljayk7CgkJCWlmICghdGhpcy5zcmMubWFpbi5ocmVmLnZhbCgpKSB7CgkJCQl0aGlzLnNyYy5tYWluLmhyZWYudmFsKCcjJyk7CgkJCX0KCQl9IGVsc2UgewoJCQl2YXIgdiA9IHRoaXMuc3JjLmV2ZW50cy5vbmNsaWNrLnZhbCgpOwoJCQl2ID0gdi5yZXBsYWNlKC93aW5kb3dcLm9wZW5cKFteXCldK1wpXHMqOz9ccypyZXR1cm5ccypmYWxzZVxzKjs/L2ksICcnKTsKCQkJdGhpcy5zcmMuZXZlbnRzLm9uY2xpY2sudmFsKHYpOwoJCX0KCX0KCQoJdGhpcy5zZXQgPSBmdW5jdGlvbigpIHsKCQl2YXIgaHJlZiwgZmFrZVVSTDsKCQl0aGlzLnVwZGF0ZU9uY2xpY2soKTsKCQl0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTsKCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCWhyZWYgPSB0aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCh0aGlzLnNyYy5tYWluLmhyZWYudmFsKCkpOwoJCWlmICghaHJlZikgewoJCQkvLyB0aGlzLmxpbmsucGFyZW50Tm9kZSAmJiB0aGlzLnJ0ZS5kb2MuZXhlY0NvbW1hbmQoJ3VubGluaycsIGZhbHNlLCBudWxsKTsKCQkJdmFyIGJtID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCk7CgkJCXRoaXMucnRlLmRvbS51bndyYXAodGhpcy5saW5rWzBdKTsKCQkJdGhpcy5ydGUuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJtKQoJCX0gZWxzZSB7CgkJCWlmICghdGhpcy5saW5rWzBdLnBhcmVudE5vZGUpIHsKCQkJCWlmICh0aGlzLmltZyAmJiB0aGlzLmltZy5wYXJlbnROb2RlKSB7CgkJCQkJdGhpcy5saW5rID0gJCh0aGlzLnJ0ZS5kb20uY3JlYXRlKCdhJykpLmF0dHIoJ2hyZWYnLCBocmVmKTsKCQkJCQl0aGlzLnJ0ZS5kb20ud3JhcCh0aGlzLmltZywgdGhpcy5saW5rWzBdKTsKCQkJCX0gZWxzZSB7CgkJCQkJZmFrZVVSTCA9ICcjLS1lbC1lZGl0b3ItLS0nK01hdGgucmFuZG9tKCk7CgkJCQkJdGhpcy5ydGUuZG9jLmV4ZWNDb21tYW5kKCdjcmVhdGVMaW5rJywgZmFsc2UsIGZha2VVUkwpOwoJCQkJCXRoaXMubGluayA9ICQoJ2FbaHJlZj0iJytmYWtlVVJMKyciXScsIHRoaXMucnRlLmRvYyk7CgkJCQkJdGhpcy5saW5rLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCQkJCS8vINGD0LTQsNC70Y/QtdC8INGB0YHRi9C70LrQuCDQstC+0LrRgNGD0LMg0L/Rg9GB0YLRi9GFINGN0LvQtdC80LXQvdGC0L7QsgoJCQkJCQlpZiAoISQudHJpbSgkdGhpcy5odG1sKCkpICYmICEkLnRyaW0oJHRoaXMudGV4dCgpKSkgewoJCQkJCQkJJHRoaXMucmVwbGFjZVdpdGgoJHRoaXMudGV4dCgpKTsgLy8gINGB0L7RhdGA0LDQvdGP0LXQvCDQv9GA0L7QsdC10LvRiyA6KQoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9CgkJCX0KCgkJCXRoaXMuc3JjLm1haW4uaHJlZi52YWwoaHJlZik7CgkJCWZvciAodmFyIHRhYiBpbiB0aGlzLnNyYykgewoJCQkJaWYgKHRhYiAhPSAncG9wdXAnKSB7CgkJCQkJZm9yICh2YXIgbiBpbiB0aGlzLnNyY1t0YWJdKSB7CgkJCQkJCWlmIChuICE9ICdhbmNob3JzJykgewoJCQkJCQkJdmFyIHYgPSAkLnRyaW0odGhpcy5zcmNbdGFiXVtuXS52YWwoKSk7CgkJCQkJCQlpZiAodikgewoJCQkJCQkJCXRoaXMubGluay5hdHRyKG4sIHYpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQl0aGlzLmxpbmsucmVtb3ZlQXR0cihuKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfTsKCQkJdGhpcy5pbWcgJiYgdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdCh0aGlzLmltZyk7CgkJfQoJCXRoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKTsKCX0KCQp9Cgp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIGluc2VydCBub24gYnJlYWthYmxlIHNwYWNlCiAqINCV0YHQu9C4INCy0YvQtNC10LvQtdC90LjQtSDRgdGF0LvQvtC/0L3Rg9GC0L4g0Lgg0L3QsNGF0L7QtNC40YLRgdGPINCy0L3Rg9GC0YDQuCBkaXYnYSAtINC+0L0g0YPQtNCw0LvRj9C10YLRgdGPCiAqINCd0L7QstGL0LUgZGl2J9GLINGB0L7Qt9C00LDRjtGC0YHRjyDRgtC+0LvRjNC60L4g0LjQtyDQvdC10YHRhdC70L7Qv9C90YPRgtC+0LPQviDQstGL0LTQtdC70LXQvdC40Y8KICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLm5ic3AgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0SHRtbCgnJm5ic3A7JywgdHJ1ZSk7CgkJdGhpcy5ydGUud2luZG93LmZvY3VzKCk7CgkJdGhpcy5ydGUudWkudXBkYXRlKCk7Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJfQp9Cn0pKGpRdWVyeSk7CgovKioKICogQGNsYXNzIGJ1dHRvbiAtIG91dGRlbnQgdGV4dAogKiDRg9C80LXQvdGM0YjQsNC10YIgcGFkZGluZy9tYXJnaW4v0YHQsNC80L7QvNC90LXQvdC40LUgOykKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqIEB0b2RvIGRlY3JlYXNlIGxpc3RzIG5lc3RpbmcgbGV2ZWwhCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLm91dGRlbnQgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgdiA9IHRoaXMuZmluZCgpOwoJCWlmICh2Lm5vZGUpIHsKCQkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQkJJCh2Lm5vZGUpLmNzcyh2LnR5cGUsICh2LnZhbD40MCA/IHYudmFsLTQwIDogMCkrJ3B4Jyk7CgkJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCX0KCX0KCQoJdGhpcy5maW5kID0gZnVuY3Rpb24obikgewoJCWZ1bmN0aW9uIGNoZWNrTm9kZShuKSB7CgkJCXZhciByZXQgPSB7dHlwZSA6ICcnLCB2YWwgOiAwfTsKCQkJdmFyIHM7CgkJCWlmICgocyA9IHNlbGYucnRlLmRvbS5hdHRyKG4sICdzdHlsZScpKSkgewoJCQkJcmV0LnR5cGUgPSBzLmluZGV4T2YoJ3BhZGRpbmctbGVmdCcpICE9IC0xCgkJCQkJPyAncGFkZGluZy1sZWZ0JwoJCQkJCTogKHMuaW5kZXhPZignbWFyZ2luLWxlZnQnKSAhPSAtMSA/ICdtYXJnaW4tbGVmdCcgOiAnJyk7CgkJCQlyZXQudmFsID0gcmV0LnR5cGUgPyBwYXJzZUludCgkKG4pLmNzcyhyZXQudHlwZSkpfHwwIDogMDsKCQkJfQoJCQlyZXR1cm4gcmV0OwoJCX0KCQkKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJdmFyIHJldCA9IGNoZWNrTm9kZShuKTsKCQlpZiAocmV0LnZhbCkgewoJCQlyZXQubm9kZSA9IG47CgkJfSBlbHNlIHsKCQkJJC5lYWNoKHRoaXMucnRlLmRvbS5wYXJlbnRzKG4sICcqJyksIGZ1bmN0aW9uKCkgewoJCQkJcmV0ID0gY2hlY2tOb2RlKHRoaXMpOwoJCQkJaWYgKHJldC52YWwpIHsKCQkJCQlyZXQubm9kZSA9IHRoaXM7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX0KCQkJfSkKCQl9CgkJcmV0dXJuIHJldDsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl2YXIgdiA9IHRoaXMuZmluZCgpOwoJCWlmICh2Lm5vZGUpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9CgoJCn0KCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgllbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMucGFnZWJyZWFrID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7CgkJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCQoJCS8vIHByZXZlbnQgcmVzaXplCgkJJCh0aGlzLnJ0ZS5kb2MuYm9keSkuYmluZCgnbW91c2Vkb3duJywgZnVuY3Rpb24oZSkgewoJCQlpZiAoJChlLnRhcmdldCkuaGFzQ2xhc3MoJ2VscnRlLXBhZ2VicmVhaycpKSB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCX0KCQl9KQoJCQoJCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0SHRtbCgnPGltZyBzcmM9IicrdGhpcy5ydGUuZmlsdGVyLnVybCsncGl4ZWwuZ2lmIiBjbGFzcz0iZWxydGUtcHJvdGVjdGVkIGVscnRlLXBhZ2VicmVhayIvPicsIGZhbHNlKTsKCQl9CgkJCgkJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0KCX0KCQp9KShqUXVlcnkpOy8qKgogKiBAY2xhc3MgYnV0dG9uIC0gaW5zZXJ0IGZvcm1hdHRlZCB0ZXh0IChvcGVuIGRpYWxvZyB3aW5kb3cpCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5wYXN0ZWZvcm1hdHRleHQgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXRoaXMuaWZyYW1lID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKSkuYWRkQ2xhc3MoJ2VsLXJ0ZS1wYXN0ZS1pbnB1dCcpOwoJdGhpcy5kb2MgICAgPSBudWxsOwoJdmFyIHNlbGYgICAgPSB0aGlzOwoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCW9wdHMgPSB7CgkJCXN1Ym1pdCA6IGZ1bmN0aW9uKGUsIGQpIHsKCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlzZWxmLnBhc3RlKCk7CgkJCQlkLmNsb3NlKCk7CgkJCX0sCgkJCWRpYWxvZyA6IHsKCQkJCXdpZHRoIDogNTAwLAoJCQkJdGl0bGUgOiB0aGlzLnJ0ZS5pMThuKCdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcpCgkJCX0KCQl9LAoJCWQgPSBuZXcgZWxEaWFsb2dGb3JtKG9wdHMpOwoJCWQuYXBwZW5kKHRoaXMuaWZyYW1lKS5vcGVuKCk7CgkJdGhpcy5kb2MgPSB0aGlzLmlmcmFtZS5nZXQoMCkuY29udGVudFdpbmRvdy5kb2N1bWVudDsKCQlodG1sID0gdGhpcy5ydGUub3B0aW9ucy5kb2N0eXBlCgkJCSsnPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPic7CgkJaHRtbCArPSAnPC9oZWFkPjxib2R5PiA8YnIgLz4gPC9ib2R5PjwvaHRtbD4nOwkKCQkKCQl0aGlzLmRvYy5vcGVuKCk7CgkJdGhpcy5kb2Mud3JpdGUoaHRtbCk7CgkJdGhpcy5kb2MuY2xvc2UoKTsKCgkJaWYgKCF0aGlzLnJ0ZS5icm93c2VyLm1zaWUpIHsKCQkJdHJ5IHsgdGhpcy5kb2MuZGVzaWduTW9kZSA9ICJvbiI7IH0gCgkJCWNhdGNoKGUpIHsgfQoJCX0gZWxzZSB7CgkJCXRoaXMuZG9jLmJvZHkuY29udGVudEVkaXRhYmxlID0gdHJ1ZTsKCQl9CgkJc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZi5pZnJhbWVbMF0uY29udGVudFdpbmRvdy5mb2N1cygpOyB9LCA1MCk7Cgl9CgkKCXRoaXMucGFzdGUgPSBmdW5jdGlvbigpIHsKCQkkKHRoaXMuZG9jLmJvZHkpLmZpbmQoJ1tjbGFzc10nKS5yZW1vdmVBdHRyKCdjbGFzcycpOwoJCXZhciBodG1sID0gJC50cmltKCQodGhpcy5kb2MuYm9keSkuaHRtbCgpKTsKCQlpZiAoaHRtbCkgewoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTsKCQkJdGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydEh0bWwodGhpcy5ydGUuZmlsdGVyLnd5c2l3eWcyd3lzaXd5Zyh0aGlzLnJ0ZS5maWx0ZXIucHJvY2Nlc3MoJ3Bhc3RlJywgaHRtbCkpKTsKCQkJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwoJCX0KCX0KCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCX0KfQp9KShqUXVlcnkpOwoKLyoqCiAqIEBjbGFzcyDQutC90L7Qv9C60LAgItCy0YHRgtCw0LLQuNGC0Ywg0YLQvtC70YzQutC+INGC0LXQutGB0YIiIAogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMucGFzdGV0ZXh0ID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl0aGlzLmlucHV0ID0gJCgnPHRleHRhcmVhIC8+JykuYWRkQ2xhc3MoJ2VsLXJ0ZS1wYXN0ZS1pbnB1dCcpOwoJdmFyIHNlbGYgICA9IHRoaXM7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXRoaXMucnRlLmJyb3dzZXIubXNpZSAmJiB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCQl2YXIgb3B0cyA9IHsKCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgewoJCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCXNlbGYucGFzdGUoKTsKCQkJCWQuY2xvc2UoKTsKCQkJfSwKCQkJZGlhbG9nIDogewoJCQkJd2lkdGggOiA1MDAsCgkJCQl0aXRsZSA6IHRoaXMucnRlLmkxOG4oJ1Bhc3RlIG9ubHkgdGV4dCcpCgkJCX0KCQl9CgkJdmFyIGQgPSBuZXcgZWxEaWFsb2dGb3JtKG9wdHMpOwoJCWQuYXBwZW5kKHRoaXMuaW5wdXQpLm9wZW4oKTsKCX0KCQoJdGhpcy5wYXN0ZSA9IGZ1bmN0aW9uKCkgewoJCXZhciB0eHQgPSAkLnRyaW0odGhpcy5pbnB1dC52YWwoKSk7CgkJaWYgKHR4dCkgewoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQl0aGlzLnJ0ZS5icm93c2VyLm1zaWUgJiYgdGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJCXRoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnRUZXh0KHR4dC5yZXBsYWNlKC9ccj9cbi9nLCAnPGJyIC8+JyksIHRydWUpOwoJCQl0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSk7CgkJfQoJCXRoaXMuaW5wdXQudmFsKCcnKTsKCX0KCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCX0KCQp9Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3MgYnV0dG9uIC0gc2F2ZSBlZGl0b3IgY29udGVudCAoc3VibWl0IGZvcm0pCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5zYXZlID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl0aGlzLmFjdGl2ZSA9IHRydWU7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXRoaXMucnRlLnNhdmUoKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsgfQp9Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3MgYnV0dG9uIC0gaW5zZXJ0IHNtaWxleSAob3BlbiBkaWFsb2cgd2luZG93KQogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuAogKgogKiBAYXV0aG9yOiAgICBlU2FiYmF0aAogKgogKiovCihmdW5jdGlvbigkKSB7IAplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuc21pbGV5ID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl2YXIgc2VsZiA9IHRoaXM7Cgl0aGlzLmltZyA9IG51bGw7Cgl0aGlzLnVybCA9IHRoaXMucnRlLmZpbHRlci51cmwrJ3NtaWxleXMvJzsKCXRoaXMuc21pbGV5cyA9IHsKCQknc21pbGUnIDogJ3NtaWxlLnBuZycsCgkJJ2hhcHB5JyA6ICdoYXBweS5wbmcnLAoJCSd0b25ndWUnIDogJ3Rvbmd1ZS5wbmcnLAoJCSdzdXJwcmlzZWQnIDogJ3N1cnByaXNlZC5wbmcnLAoJCSd3YWlpJyA6ICd3YWlpLnBuZycsCgkJJ3dpbmsnIDogJ3dpbmsucG5nJywKCQknZXZpbGdyaW4nIDogJ2V2aWxncmluLnBuZycsCgkJJ2dyaW4nIDogJ2dyaW4ucG5nJywKCQkKCQkKCQkndW5oYXBweScgOiAndW5oYXBweS5wbmcnCgl9OwoJdGhpcy53aWR0aCA9IDEyMDsKCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgc2VsZiA9IHRoaXMsIHVybCA9IHRoaXMudXJsLCBkLCBvcHRzLCBpbWc7CgoJCXRoaXMucnRlLmJyb3dzZXIubXNpZSAmJiB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCgkJb3B0cyA9IHsKCQkJZGlhbG9nIDogewoJCQkJaGVpZ2h0ICA6IDEyMCwKCQkJCXdpZHRoICAgOiB0aGlzLndpZHRoLAoJCQkJdGl0bGUgICA6IHRoaXMucnRlLmkxOG4oJ1NtaWxleScpLAoJCQkJYnV0dG9ucyA6IHt9CgkJCX0KCQl9CgkJZCA9IG5ldyBlbERpYWxvZ0Zvcm0ob3B0cyk7CgkJJC5lYWNoKHRoaXMuc21pbGV5cywgZnVuY3Rpb24obmFtZSwgaW1nKSB7CgkJCWQuYXBwZW5kKCQoJzxpbWcgc3JjPSInK3VybCtpbWcrJyIgdGl0bGU9IicrbmFtZSsnIiBpZD0iJytuYW1lKyciIGNsYXNzPSJlbC1ydGUtc21pbGV5Ii8+JykuY2xpY2soZnVuY3Rpb24oKSB7IHNlbGYuc2V0KHRoaXMuaWQsIGQpOwl9KSk7CgkJfSk7CgkJZC5vcGVuKCk7Cgl9CgoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKCX0KCgl0aGlzLnNldCA9IGZ1bmN0aW9uKHMsIGQpIHsKCQl0aGlzLnJ0ZS5icm93c2VyLm1zaWUgJiYgdGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJaWYgKHRoaXMuc21pbGV5c1tzXSkgewoJCQl0aGlzLmltZyA9ICQodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoJ2ltZycpKTsKCQkJdGhpcy5pbWcuYXR0cih7CgkJCQlzcmMgICAgOiB0aGlzLnVybCArIHRoaXMuc21pbGV5c1tzXSwKCQkJCXRpdGxlICA6IHMsCgkJCQlhbHQgICAgOiBzCgkJCX0pOwoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0Tm9kZSh0aGlzLmltZy5nZXQoMCkpOwoJCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCQl9CgkJZC5jbG9zZSgpOwoJfQp9Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3MgYnV0dG9uIC0gc3RvcHMgZWxlbWVudHMgZmxvYXRpbmcuIEluc2VydCBkaXYgd2l0aCBzdHlsZT0iY2xlYXI6YWxsIgogKiDQldGB0LvQuCDQstGL0LTQtdC70LXQvdC40LUg0YHRhdC70L7Qv9C90YPRgtC+INC4INC90LDRhdC+0LTQuNGC0YHRjyDQstC90YPRgtGA0LggZGl2J2Eg0YEg0LDRgtGC0YDQuNCx0YPRgtC+0Lwg0LjQu9C4IGNzcyBjbGVhciAtINC+0L0g0YPQtNCw0LvRj9C10YLRgdGPCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5zdG9wZmxvYXQgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCgl0aGlzLmZpbmQgPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpKSB7CgkJCXZhciBuID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCksIC9eRElWJC8pOwoJCQlpZiAobiAmJiAodGhpcy5ydGUuZG9tLmF0dHIobiwgJ2NsZWFyJykgfHwgJChuKS5jc3MoJ2NsZWFyJykgIT0gJ25vbmUnKSkgewoJCQkJcmV0dXJuIG47CgkJCX0KCQl9Cgl9CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXZhciBuOwoJCWlmICgobiA9IHRoaXMuZmluZCgpKSkgewoJCQl2YXIgbiA9ICQobik7CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCWlmICghbi5jaGlsZHJlbigpLmxlbmd0aCAmJiAhJC50cmltKG4udGV4dCgpKS5sZW5ndGgpIHsKCQkJCW4ucmVtb3ZlKCk7CgkJCX0gZWxzZSB7CgkJCQluLnJlbW92ZUF0dHIoJ2NsZWFyJykuY3NzKCdjbGVhcicsICcnKTsKCQkJfQoJCX0gZWxzZSB7CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCXRoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnROb2RlKCQodGhpcy5ydGUuZG9tLmNyZWF0ZSgnZGl2JykpLmNzcygnY2xlYXInLCAnYm90aCcpLmdldCgwKSwgdHJ1ZSk7CgkJfQoJCXRoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJaWYgKHRoaXMuZmluZCgpKSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnYWN0aXZlJyk7CgkJfSBlbHNlIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKCQl9Cgl9Cn0KCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBidXR0b24gLSBjcmVhdGUvZWRpdCB0YWJsZSAob3BlbiBkaWFsb2cgd2luZG93KQogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBDb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YWJsZSA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdmFyIHNlbGYgICAgPSB0aGlzOwoJdGhpcy5zcmMgICAgPSBudWxsOwoJdGhpcy5sYWJlbHMgPSBudWxsOwoJCglmdW5jdGlvbiBpbml0KCkgewoJCXNlbGYubGFiZWxzID0gewoJCQltYWluICAgICAgOiAnUHJvcGVyaWVzJywKCQkJYWR2ICAgICAgIDogJ0FkdmFuY2VkJywKCQkJZXZlbnRzICAgIDogJ0V2ZW50cycsCgkJCWlkICAgICAgICA6ICdJRCcsCgkJCSdjbGFzcycgICA6ICdDc3MgY2xhc3MnLAoJCQlzdHlsZSAgICAgOiAnQ3NzIHN0eWxlJywKCQkJZGlyICAgICAgIDogJ1NjcmlwdCBkaXJlY3Rpb24nLAoJCQlzdW1tYXJ5ICAgOiAnU3VtbWFyeScsCgkJCWxhbmcgICAgICA6ICdMYW5ndWFnZScsCgkJCWhyZWYgICAgICA6ICdVUkwnCgkJfQoJCQoJCXNlbGYuc3JjID0gewoJCQltYWluIDogewoJCQkJY2FwdGlvbiA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJcm93cyAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ3NpemUnLCA1KS52YWwoMiksCgkJCQljb2xzICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cignc2l6ZScsIDUpLnZhbCgyKSwKCQkJCXdpZHRoICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCdzaXplJywgNSksCgkJCQl3dW5pdCAgIDogJCgnPHNlbGVjdCAvPicpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJyUnKS50ZXh0KCclJykpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3B4JykudGV4dCgncHgnKSksCQkJCQoJCQkJaGVpZ2h0ICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ3NpemUnLCA1KSwJCgkJCQlodW5pdCAgIDogJCgnPHNlbGVjdCAvPicpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJyUnKS50ZXh0KCclJykpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3B4JykudGV4dCgncHgnKSksCQoJCQkJYWxpZ24gICA6ICQoJzxzZWxlY3QgLz4nKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCcnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ05vdCBzZXQnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ2xlZnQnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0xlZnQnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ2NlbnRlcicpLnRleHQoc2VsZi5ydGUuaTE4bignQ2VudGVyJykpKQkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgncmlnaHQnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ1JpZ2h0JykpKSwJCgkJCQlzcGFjaW5nIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cignc2l6ZScsIDUpLAkKCQkJCXBhZGRpbmcgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCdzaXplJywgNSksCgkJCQlib3JkZXIgIDogJCgnPGRpdiAvPicpLAoJCQkJLy8gZnJhbWUgICA6ICQoJzxzZWxlY3QgLz4nKQoJCQkJLy8gCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd2b2lkJykudGV4dChzZWxmLnJ0ZS5pMThuKCdObycpKSkKCQkJCS8vIAkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnYm9yZGVyJykudGV4dChzZWxmLnJ0ZS5pMThuKCdZZXMnKSkpLAoJCQkJcnVsZXMgICA6ICQoJzxzZWxlY3QgLz4nKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdub25lJykudGV4dChzZWxmLnJ0ZS5pMThuKCdObycpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnYWxsJykudGV4dChzZWxmLnJ0ZS5pMThuKCdDZWxscycpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnZ3JvdXBzJykudGV4dChzZWxmLnJ0ZS5pMThuKCdHcm91cHMnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3Jvd3MnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ1Jvd3MnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ2NvbHMnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0NvbHVtbnMnKSkpLAoJCQkJbWFyZ2luICA6ICQoJzxkaXYgLz4nKSwKCQkJCWJnICAgICAgOiAkKCc8ZGl2IC8+JyksCgkJCQliZ2ltZyAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCd3aWR0aCcsICc5MCUnKQoJCQl9LAoJCQkKCQkJYWR2IDogewoJCQkJaWQgICAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQlzdW1tYXJ5ICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCSdjbGFzcycgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJc3R5bGUgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQlkaXIgICAgICAgOiAkKCc8c2VsZWN0IC8+JykKCQkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ05vdCBzZXQnKSkudmFsKCcnKSkKCQkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0xlZnQgdG8gcmlnaHQnKSkudmFsKCdsdHInKSkKCQkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ1JpZ2h0IHRvIGxlZnQnKSkudmFsKCdydGwnKSksCgkJCQlsYW5nICAgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKQoJCQl9LAoJCQkKCQkJZXZlbnRzIDoge30KCQl9CgkJCgkJJC5lYWNoKHNlbGYuc3JjLCBmdW5jdGlvbigpIHsKCQkJZm9yICh2YXIgbiBpbiB0aGlzKSB7CgkJCQl0aGlzW25dLmF0dHIoJ25hbWUnLCBuKTsKCQkJCXZhciB0ID0gdGhpc1tuXS5nZXQoMCkubm9kZU5hbWU7IAoJCQkJaWYgKHQgPT0gJ0lOUFVUJyAmJiBuICE9ICdiZ2ltZycpIHsKCQkJCQl0aGlzW25dLmNzcyh0aGlzW25dLmF0dHIoJ3NpemUnKSA/IHsndGV4dC1hbGlnbicgOiAncmlnaHQnfSA6IHt3aWR0aCA6ICcxMDAlJ30pOwoJCQkJfSBlbHNlIGlmICh0ID09ICdTRUxFQ1QnICYmIG4hPSd3dW5pdCcgJiYgbiE9J2h1bml0JykgewoJCQkJCXRoaXNbbl0uY3NzKCd3aWR0aCcsICcxMDAlJyk7CgkJCQl9CgkJCX0KCQl9KTsKCQkKCQkkLmVhY2goCgkJCVsnb25ibHVyJywgJ29uZm9jdXMnLCAnb25jbGljaycsICdvbmRibGNsaWNrJywgJ29ubW91c2Vkb3duJywgJ29ubW91c2V1cCcsICdvbm1vdXNlb3ZlcicsICdvbm1vdXNlb3V0JywgJ29ubW91c2VsZWF2ZScsICdvbmtleWRvd24nLCAnb25rZXlwcmVzcycsICdvbmtleXVwJ10sIAoJCQlmdW5jdGlvbigpIHsKCQkJCXNlbGYuc3JjLmV2ZW50c1t0aGlzXSA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ25hbWUnLCB0aGlzKS5jc3MoJ3dpZHRoJywgJzEwMCUnKTsKCQl9KTsKCQkKCQlzZWxmLnNyYy5tYWluLmFsaWduLmNoYW5nZShmdW5jdGlvbigpIHsKCQkJdmFyIHYgPSAkKHRoaXMpLnZhbCgpOwoJCQlpZiAodiA9PSAnY2VudGVyJykgewoJCQkJc2VsZi5zcmMubWFpbi5tYXJnaW4udmFsKHtsZWZ0IDogJ2F1dG8nLCByaWdodCA6ICdhdXRvJ30pOwoJCQl9IGVsc2UgewoJCQkJdmFyIG0gPSBzZWxmLnNyYy5tYWluLm1hcmdpbi52YWwoKTsKCQkJCWlmIChtLmxlZnQgPT0gJ2F1dG8nICYmIG0ucmlnaHQgPT0gJ2F1dG8nKSB7CgkJCQkJc2VsZi5zcmMubWFpbi5tYXJnaW4udmFsKHtsZWZ0IDogJycsIHJpZ2h0IDogJyd9KTsKCQkJCX0KCQkJfQoJCX0pOwoJCQoJCXNlbGYuc3JjLm1haW4uYmdpbWcuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQl2YXIgdCA9ICQodGhpcyk7CgkJCXQudmFsKHNlbGYucnRlLnV0aWxzLmFic29sdXRlVVJMKHQudmFsKCkpKTsKCQl9KQoJCQoJfQoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgbiA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15UQUJMRSQvKTsKCQkKCQlpZiAodGhpcy5uYW1lID09ICd0YWJsZScpIHsKCQkJdGhpcy50YWJsZSA9ICQodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJykpOwkKCQl9IGVsc2UgewoJCQl0aGlzLnRhYmxlID0gbiA/ICQobikgOiAkKHRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCd0YWJsZScpKTsJCQkJCQoJCX0KCQkKCQkhdGhpcy5zcmMgJiYgaW5pdCgpOwoJCXRoaXMuc3JjLm1haW4uYm9yZGVyLmVsQm9yZGVyU2VsZWN0KHtzdHlsZUhlaWdodCA6IDExN30pOwoJCXRoaXMuc3JjLm1haW4uYmcuZWxDb2xvclBpY2tlcih7cGFsZXR0ZVBvc2l0aW9uIDogJ291dGVyJywgJ2NsYXNzJyA6ICdlbC1jb2xvcnBpY2tlciB1aS1pY29uIHVpLWljb24tcGVuY2lsJ30pOwoJCXRoaXMuc3JjLm1haW4ubWFyZ2luLmVsUGFkZGluZ0lucHV0KHsgdHlwZSA6ICdtYXJnaW4nLCB2YWx1ZSA6IHRoaXMudGFibGV9KTsKCQkKCQlpZiAodGhpcy50YWJsZS5wYXJlbnRzKCkubGVuZ3RoKSB7CgkJCXRoaXMuc3JjLm1haW4ucm93cy52YWwoJycpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CgkJCXRoaXMuc3JjLm1haW4uY29scy52YWwoJycpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5zcmMubWFpbi5yb3dzLnZhbCgyKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwoJCQl0aGlzLnNyYy5tYWluLmNvbHMudmFsKDIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CgkJfQoJCQoJCXZhciB3ID0gdGhpcy50YWJsZS5jc3MoJ3dpZHRoJykgfHwgdGhpcy50YWJsZS5hdHRyKCd3aWR0aCcpOwoJCXRoaXMuc3JjLm1haW4ud2lkdGgudmFsKHBhcnNlSW50KHcpfHwnJyk7CgkJdGhpcy5zcmMubWFpbi53dW5pdC52YWwody5pbmRleE9mKCdweCcpICE9IC0xID8gJ3B4JyA6ICclJyk7CgkJCgkJdmFyIGggPSB0aGlzLnRhYmxlLmNzcygnaGVpZ2h0JykgfHwgdGhpcy50YWJsZS5hdHRyKCdoZWlnaHQnKTsJCgkJdGhpcy5zcmMubWFpbi5oZWlnaHQudmFsKHBhcnNlSW50KGgpfHwnJyk7CgkJdGhpcy5zcmMubWFpbi5odW5pdC52YWwoaCAmJiBoLmluZGV4T2YoJ3B4JykgIT0gLTEgPyAncHgnIDogJyUnKTsKCgkJdmFyIGYgPSB0aGlzLnRhYmxlLmNzcygnZmxvYXQnKTsKCQl0aGlzLnNyYy5tYWluLmFsaWduLnZhbCgnJyk7CgkJaWYgKGYgPT0gJ2xlZnQnIHx8IGYgPT0gJ3JpZ2h0JykgewoJCQl0aGlzLnNyYy5tYWluLmFsaWduLnZhbChmKTsKCQl9IGVsc2UgewoJCQl2YXIgbWwgPSB0aGlzLnRhYmxlLmNzcygnbWFyZ2luLWxlZnQnKTsKCQkJdmFyIG1yID0gdGhpcy50YWJsZS5jc3MoJ21hcmdpbi1yaWdodCcpOwoJCQlpZiAobWwgPT0gJ2F1dG8nICYmIG1yID09ICdhdXRvJykgewoJCQkJdGhpcy5zcmMubWFpbi5hbGlnbi52YWwoJ2NlbnRlcicpOwoJCQl9CgkJfQoKCQl0aGlzLnNyYy5tYWluLmJvcmRlci52YWwodGhpcy50YWJsZSk7CgkJLy90aGlzLnNyYy5tYWluLmZyYW1lLnZhbCh0aGlzLnRhYmxlLmF0dHIoJ2ZyYW1lJykpOwoJCXRoaXMuc3JjLm1haW4ucnVsZXMudmFsKHRoaXMucnRlLmRvbS5hdHRyKHRoaXMudGFibGUuZ2V0KDApLCAncnVsZXMnKSk7CgoJCXRoaXMuc3JjLm1haW4uYmcudmFsKHRoaXMudGFibGUuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJykpOwoJCXZhciBiZ2ltZyA9ICh0aGlzLnRhYmxlLmNzcygnYmFja2dyb3VuZC1pbWFnZScpfHwnJykucmVwbGFjZSgvdXJsXCgoW15cKV0rKVwpL2ksICIkMSIpOwoJCXRoaXMuc3JjLm1haW4uYmdpbWcudmFsKGJnaW1nIT0nbm9uZScgPyBiZ2ltZyA6ICcnKTsKCgkJdmFyIG9wdHMgPSB7CgkJCXJ0bCA6IHRoaXMucnRlLnJ0bCwKCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuc2V0KCk7IGQuY2xvc2UoKTsgfSwKCQkJZGlhbG9nIDogewoJCQkJd2lkdGggOiA1MzAsCgkJCQl0aXRsZSA6IHRoaXMucnRlLmkxOG4oJ1RhYmxlJykKCQkJfQoJCX0KCQl2YXIgZCA9IG5ldyBlbERpYWxvZ0Zvcm0ob3B0cyk7CgkJCgkJZm9yICh2YXIgdGFiIGluIHRoaXMuc3JjKSB7CgkJCWQudGFiKHRhYiwgdGhpcy5ydGUuaTE4bih0aGlzLmxhYmVsc1t0YWJdKSk7CgkJCWlmICh0YWIgPT0gJ21haW4nKSB7CgkJCQl2YXIgdDEgPSAkKCc8dGFibGUgLz4nKQoJCQkJCS5hcHBlbmQoJCgnPHRyIC8+JykuYXBwZW5kKCc8dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdSb3dzJykrJzwvdGQ+JykuYXBwZW5kKCQoJzx0ZCAvPicpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnJvd3MpKSkKCQkJCQkuYXBwZW5kKCQoJzx0ciAvPicpLmFwcGVuZCgnPHRkPicrdGhpcy5ydGUuaTE4bignQ29sdW1ucycpKyc8L3RkPicpLmFwcGVuZCgkKCc8dGQgLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi5jb2xzKSkpOwoJCQkJdmFyIHQyID0gJCgnPHRhYmxlIC8+JykKCQkJCQkuYXBwZW5kKCQoJzx0ciAvPicpLmFwcGVuZCgnPHRkPicrdGhpcy5ydGUuaTE4bignV2lkdGgnKSsnPC90ZD4nKS5hcHBlbmQoJCgnPHRkIC8+JykuYXBwZW5kKHRoaXMuc3JjLm1haW4ud2lkdGgpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnd1bml0KSkpCgkJCQkJLmFwcGVuZCgkKCc8dHIgLz4nKS5hcHBlbmQoJzx0ZD4nK3RoaXMucnRlLmkxOG4oJ0hlaWdodCcpKyc8L3RkPicpLmFwcGVuZCgkKCc8dGQgLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi5oZWlnaHQpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmh1bml0KSkpOwoJCQkJdmFyIHQzID0gJCgnPHRhYmxlIC8+JykKCQkJCQkuYXBwZW5kKCQoJzx0ciAvPicpLmFwcGVuZCgnPHRkPicrdGhpcy5ydGUuaTE4bignU3BhY2luZycpKyc8L3RkPicpLmFwcGVuZCgkKCc8dGQgLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi5zcGFjaW5nLnZhbCh0aGlzLnRhYmxlLmF0dHIoJ2NlbGxzcGFjaW5nJyl8fCcnKSkpKQoJCQkJCS5hcHBlbmQoJCgnPHRyIC8+JykuYXBwZW5kKCc8dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdQYWRkaW5nJykrJzwvdGQ+JykuYXBwZW5kKCQoJzx0ZCAvPicpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnBhZGRpbmcudmFsKHRoaXMudGFibGUuYXR0cignY2VsbHBhZGRpbmcnKXx8JycpKSkpOwoJCQkJCgkJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQ2FwdGlvbicpLCB0aGlzLnNyYy5tYWluLmNhcHRpb24udmFsKHRoaXMudGFibGUuZmluZCgnY2FwdGlvbicpLmVxKDApLnRleHQoKSB8fCAnJyldLCAnbWFpbicsIHRydWUpCgkJCQkJLnNlcGFyYXRvcignbWFpbicpCgkJCQkJLmFwcGVuZChbdDEsIHQyLCB0M10sICdtYWluJywgdHJ1ZSkKCQkJCQkuc2VwYXJhdG9yKCdtYWluJykKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdCb3JkZXInKSwgICAgICAgIHRoaXMuc3JjLm1haW4uYm9yZGVyXSwgJ21haW4nLCB0cnVlKQoJCQkJCS8vLmFwcGVuZChbdGhpcy5ydGUuaTE4bignRnJhbWUnKSwgICAgICAgdGhpcy5zcmMubWFpbi5mcmFtZV0sICdtYWluJywgdHJ1ZSkKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdJbm5lciBib3JkZXJzJyksIHRoaXMuc3JjLm1haW4ucnVsZXNdLCAnbWFpbicsIHRydWUpCgkJCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQWxpZ25tZW50JyksICAgICB0aGlzLnNyYy5tYWluLmFsaWduXSwgJ21haW4nLCB0cnVlKQoJCQkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ01hcmdpbnMnKSwgICAgICAgdGhpcy5zcmMubWFpbi5tYXJnaW5dLCAnbWFpbicsIHRydWUpCgkJCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQmFja2dyb3VuZCcpLCAgICAkKCc8c3BhbiAvPicpLmFwcGVuZCgkKCc8c3BhbiAvPicpLmNzcyh7J2Zsb2F0JyA6ICdsZWZ0JywgJ21hcmdpbi1yaWdodCcgOiAnM3B4J30pLmFwcGVuZCh0aGlzLnNyYy5tYWluLmJnKSkuYXBwZW5kKHRoaXMuc3JjLm1haW4uYmdpbWcpXSwgJ21haW4nLCB0cnVlKQoJCQl9IGVsc2UgewoJCQkJZm9yICh2YXIgbmFtZSBpbiB0aGlzLnNyY1t0YWJdKSB7CgkJCQkJdmFyIHYgPSB0aGlzLnJ0ZS5kb20uYXR0cih0aGlzLnRhYmxlLCBuYW1lKTsKCQkJCQlpZiAodGFiID09ICdldmVudHMnKSB7CgkJCQkJCXYgPSB0aGlzLnJ0ZS51dGlscy50cmltRXZlbnRDYWxsYmFjayh2KTsKCQkJCQl9IAoJCQkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW25hbWVdID8gdGhpcy5sYWJlbHNbbmFtZV0gOiBuYW1lKSwgdGhpcy5zcmNbdGFiXVtuYW1lXS52YWwodildLCB0YWIsIHRydWUpOwoJCQkJfQoJCQl9CgkJfQoJCQoJCWQub3BlbigpOwoJfQoJCgl0aGlzLnNldCA9IGZ1bmN0aW9uKCkgewoJCQoJCWlmICghdGhpcy50YWJsZS5wYXJlbnRzKCkubGVuZ3RoKSB7CgkJCXZhciByID0gcGFyc2VJbnQodGhpcy5zcmMubWFpbi5yb3dzLnZhbCgpKSB8fCAwOwoJCQl2YXIgYyA9IHBhcnNlSW50KHRoaXMuc3JjLm1haW4uY29scy52YWwoKSkgfHwgMDsKCQkJaWYgKHI8PTAgfHwgYzw9MCkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7IAoJCQl2YXIgYiA9ICQodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoJ3Rib2R5JykpLmFwcGVuZFRvKHRoaXMudGFibGUpOwoJCQkKCQkJZm9yICh2YXIgaT0wOyBpIDwgcjsgaSsrKSB7CgkJCQl2YXIgdHIgPSAnPHRyPic7CgkJCQlmb3IgKHZhciBqPTA7IGogPCBjOyBqKyspIHsKCQkJCQl0ciArPSAnPHRkPiZuYnNwOzwvdGQ+JzsKCQkJCX0KCQkJCWIuYXBwZW5kKHRyKyc8L3RyPicpOwoJCQl9OwoJCQkKCQkJLy8gdmFyIHRyID0gJCh0aGlzLnJ0ZS5kb2MuY3JlYXRlRWxlbWVudCgndHInKSk7CgkJCS8vIAoJCQkvLyBmb3IgKHZhciBpPTA7IGkgPCBjOyBpKyspIHsKCQkJLy8gCXRyLmFwcGVuZCgkKHRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCd0ZCcpKS5odG1sKCcmbmJzcDsnKSk7CgkJCS8vIH07CgkJCS8vIAoJCQkvLyBmb3IgKHZhciBpPTA7IGk8cjsgaSsrKSB7CgkJCS8vIAliLmFwcGVuZCh0ci5jbG9uZSh0cnVlKSk7CgkJCS8vIH07CgkJCQoJCQkvLyB0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0Tm9kZSh0aGlzLnRhYmxlLmdldCgwKSwgdHJ1ZSk7CgkJfSBlbHNlIHsKCQkJdGhpcy50YWJsZQoJCQkJLnJlbW92ZUF0dHIoJ3dpZHRoJykKCQkJCS5yZW1vdmVBdHRyKCdoZWlnaHQnKQoJCQkJLnJlbW92ZUF0dHIoJ2JvcmRlcicpCgkJCQkucmVtb3ZlQXR0cignYWxpZ24nKQoJCQkJLnJlbW92ZUF0dHIoJ2JvcmRlcmNvbG9yJykKCQkJCS5yZW1vdmVBdHRyKCdiZ2NvbG9yJykKCQkJCS5yZW1vdmVBdHRyKCdjZWxsc3BhY2luZycpCgkJCQkucmVtb3ZlQXR0cignY2VsbHBhZGRpbmcnKQoJCQkJLnJlbW92ZUF0dHIoJ2ZyYW1lJykKCQkJCS5yZW1vdmVBdHRyKCdydWxlcycpCgkJCQkucmVtb3ZlQXR0cignc3R5bGUnKTsKCQl9CgkJCgkJdmFyIGNhcCA9ICQudHJpbSh0aGlzLnNyYy5tYWluLmNhcHRpb24udmFsKCkpOwoJCWlmIChjYXApIHsKCQkJaWYgKCF0aGlzLnRhYmxlLmNoaWxkcmVuKCdjYXB0aW9uJykubGVuZ3RoKSB7CgkJCQl0aGlzLnRhYmxlLnByZXBlbmQoJzxjYXB0aW9uIC8+JyApOwoJCQl9CgkJCXRoaXMudGFibGUuY2hpbGRyZW4oJ2NhcHRpb24nKS50ZXh0KGNhcCk7CgkJfSBlbHNlIHsKCQkJdGhpcy50YWJsZS5jaGlsZHJlbignY2FwdGlvbicpLnJlbW92ZSgpOwoJCX0KCQkKCQkKCQlmb3IgKHZhciB0YWIgaW4gdGhpcy5zcmMpIHsKCQkJaWYgKHRhYiAhPSAnbWFpbicpIHsKCQkJCWZvciAodmFyIG4gaW4gdGhpcy5zcmNbdGFiXSkgewoJCQkJCXZhciB2ID0gJC50cmltKHRoaXMuc3JjW3RhYl1bbl0udmFsKCkpOwoJCQkJCWlmICh2KSB7CgkJCQkJCXRoaXMudGFibGUuYXR0cihuLCB2KTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0aGlzLnRhYmxlLnJlbW92ZUF0dHIobik7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCXZhciBzcGFjaW5nLCBwYWRkaW5nLCBydWxlczsKCgkJaWYgKChzcGFjaW5nID0gcGFyc2VJbnQodGhpcy5zcmMubWFpbi5zcGFjaW5nLnZhbCgpKSkgJiYgc3BhY2luZz49MCkgewoJCQl0aGlzLnRhYmxlLmF0dHIoJ2NlbGxzcGFjaW5nJywgc3BhY2luZyk7CgkJfSAKCgkJaWYgKChwYWRkaW5nID0gcGFyc2VJbnQodGhpcy5zcmMubWFpbi5wYWRkaW5nLnZhbCgpKSkgJiYgcGFkZGluZz49MCkgewoJCQl0aGlzLnRhYmxlLmF0dHIoJ2NlbGxwYWRkaW5nJywgcGFkZGluZyk7CgkJfSAKCQkKCQlpZiAoKHJ1bGVzID0gdGhpcy5zcmMubWFpbi5ydWxlcy52YWwoKSkpIHsKCQkJdGhpcy50YWJsZS5hdHRyKCdydWxlcycsIHJ1bGVzKTsKCQl9CgkJCgkJdmFyCgkJCXcgPSBwYXJzZUludCh0aGlzLnNyYy5tYWluLndpZHRoLnZhbCgpKSB8fCAnJywKCQkJaCA9IHBhcnNlSW50KHRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCgpKSB8fCAnJywKCQkJaSA9ICQudHJpbSh0aGlzLnNyYy5tYWluLmJnaW1nLnZhbCgpKSwKCQkJYiA9IHRoaXMuc3JjLm1haW4uYm9yZGVyLnZhbCgpLAoJCQltID0gdGhpcy5zcmMubWFpbi5tYXJnaW4udmFsKCksCgkJCWYgPSB0aGlzLnNyYy5tYWluLmFsaWduLnZhbCgpOwoJCXRoaXMudGFibGUuY3NzKHsKCQkJd2lkdGggICAgICAgICAgICAgIDogdyA/IHcrdGhpcy5zcmMubWFpbi53dW5pdC52YWwoKSA6ICcnLAoJCQloZWlnaHQgICAgICAgICAgICAgOiBoID8gaCt0aGlzLnNyYy5tYWluLmh1bml0LnZhbCgpIDogJycsCgkJCWJvcmRlciAgICAgICAgICAgICA6ICQudHJpbShiLndpZHRoKycgJytiLnN0eWxlKycgJytiLmNvbG9yKSwKCQkJJ2JhY2tncm91bmQtY29sb3InIDogdGhpcy5zcmMubWFpbi5iZy52YWwoKSwKCQkJJ2JhY2tncm91bmQtaW1hZ2UnIDogaSA/ICd1cmwoJytpKycpJyA6ICcnCgkJfSk7CQoJCWlmIChtLmNzcykgewoJCQl0aGlzLnRhYmxlLmNzcygnbWFyZ2luJywgbS5jc3MpOwoJCX0gZWxzZSB7CgkJCXRoaXMudGFibGUuY3NzKHsKCQkJCSdtYXJnaW4tdG9wJyAgICA6IG0udG9wLAoJCQkJJ21hcmdpbi1yaWdodCcgIDogbS5yaWdodCwKCQkJCSdtYXJnaW4tYm90dG9tJyA6IG0uYm90dG9tLAoJCQkJJ21hcmdpbi1sZWZ0JyAgIDogbS5sZWZ0CgkJCX0pOwoJCX0KCQlpZiAoKGY9PSdsZWZ0JyB8fCBmPT0ncmlnaHQnKSAmJiB0aGlzLnRhYmxlLmNzcygnbWFyZ2luLWxlZnQnKSE9J2F1dG8nICAmJiB0aGlzLnRhYmxlLmNzcygnbWFyZ2luLXJpZ2h0JykhPSdhdXRvJykgewoJCQl0aGlzLnRhYmxlLmNzcygnZmxvYXQnLCBmKTsKCQl9CgkJaWYgKCF0aGlzLnRhYmxlLmF0dHIoJ3N0eWxlJykpIHsKCQkJdGhpcy50YWJsZS5yZW1vdmVBdHRyKCdzdHlsZScpOwoJCX0KCQlpZiAoIXRoaXMudGFibGUucGFyZW50cygpLmxlbmd0aCkgewoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0Tm9kZSh0aGlzLnRhYmxlLmdldCgwKSwgdHJ1ZSk7CgkJfQoJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQlpZiAodGhpcy5uYW1lID09ICd0YWJsZXByb3BzJyAmJiAhdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXlRBQkxFJC8pKSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CgkJfQoJfQoJCn0KCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YWJsZXByb3BzID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRhYmxlOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBAY2xhc3MgYnV0dG9uIC0gcmVtb3ZlIHRhYmxlCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YWJsZXJtID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXZhciB0ID0gdGhpcy5ydGUuZG9tLnBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXlRBQkxFJC8pOwoJCS8vIHQgJiYgJCh0KS5yZW1vdmUoKTsKCQlpZiAodCkgewoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQkkKHQpLnJlbW92ZSgpOwoJCX0KCQl0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSk7Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMucnRlLmRvbS5wYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15UQUJMRSQvKSkgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJfSBlbHNlIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoJCX0KCX0KfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIHRhYmxlIGNlbGwgcHJvcGVydGllcwogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjZWxscHJvcHMgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCXRoaXMuc3JjID0gbnVsbDsKCXRoaXMubGFiZWxzID0gbnVsbDsKCQoJZnVuY3Rpb24gaW5pdCgpIHsKCQlzZWxmLmxhYmVscyA9IHsKCQkJbWFpbiAgICA6ICdQcm9wZXJpZXMnLAoJCQlhZHYgICAgIDogJ0FkdmFuY2VkJywKCQkJZXZlbnRzICA6ICdFdmVudHMnLAoJCQlpZCAgICAgIDogJ0lEJywKCQkJJ2NsYXNzJyA6ICdDc3MgY2xhc3MnLAoJCQlzdHlsZSAgIDogJ0NzcyBzdHlsZScsCgkJCWRpciAgICAgOiAnU2NyaXB0IGRpcmVjdGlvbicsCgkJCWxhbmcgICAgOiAnTGFuZ3VhZ2UnCgkJfQoJCQoJCXNlbGYuc3JjID0gewoJCQltYWluIDogewoJCQkJdHlwZSAgICA6ICQoJzxzZWxlY3QgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd0ZCcpLnRleHQoc2VsZi5ydGUuaTE4bignRGF0YScpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgndGgnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0hlYWRlcicpKSksCgkJCQl3aWR0aCAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cignc2l6ZScsIDQpLAoJCQkJd3VuaXQgICA6ICQoJzxzZWxlY3QgLz4nKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCclJykudGV4dCgnJScpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdweCcpLnRleHQoJ3B4JykpLAkJCQkKCQkJCWhlaWdodCAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCdzaXplJywgNCksCQoJCQkJaHVuaXQgICA6ICQoJzxzZWxlY3QgLz4nKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCclJykudGV4dCgnJScpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdweCcpLnRleHQoJ3B4JykpLAkKCQkJCWFsaWduICAgOiAkKCc8c2VsZWN0IC8+JykuY3NzKCd3aWR0aCcsICcxMDAlJykKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnJykudGV4dChzZWxmLnJ0ZS5pMThuKCdOb3Qgc2V0JykpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdsZWZ0JykudGV4dChzZWxmLnJ0ZS5pMThuKCdMZWZ0JykpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdjZW50ZXInKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0NlbnRlcicpKSkJCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3JpZ2h0JykudGV4dChzZWxmLnJ0ZS5pMThuKCdSaWdodCcpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnanVzdGlmeScpLnRleHQoc2VsZi5ydGUuaTE4bignSnVzdGlmeScpKSksCQoJCQkJYm9yZGVyICA6ICQoJzxkaXYgLz4nKSwKCQkJCXBhZGRpbmcgIDogJCgnPGRpdiAvPicpLAoJCQkJYmcgICAgICA6ICQoJzxkaXYgLz4nKSwKCQkJCWJnaW1nICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoJ3dpZHRoJywgJzkwJScpLAoJCQkJYXBwbHkgICA6ICQoJzxzZWxlY3QgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCcnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0N1cnJlbnQgY2VsbCcpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgncm93JykudGV4dChzZWxmLnJ0ZS5pMThuKCdBbGwgY2VsbHMgaW4gcm93JykpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdjb2x1bW4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0FsbCBjZWxscyBpbiBjb2x1bW4nKSkpCQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd0YWJsZScpLnRleHQoc2VsZi5ydGUuaTE4bignQWxsIGNlbGxzIGluIHRhYmxlJykpKQoJCQl9LAoJCQkKCQkJYWR2IDogewoJCQkJaWQgICAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQknY2xhc3MnICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCXN0eWxlICAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJZGlyICAgICAgIDogJCgnPHNlbGVjdCAvPicpLmNzcygnd2lkdGgnLCAnMTAwJScpCgkJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdOb3Qgc2V0JykpLnZhbCgnJykpCgkJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdMZWZ0IHRvIHJpZ2h0JykpLnZhbCgnbHRyJykpCgkJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdSaWdodCB0byBsZWZ0JykpLnZhbCgncnRsJykpLAoJCQkJbGFuZyAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykKCQkJfSwKCQkJCgkJCWV2ZW50cyA6IHt9CgkJfQoJCQoJCSQuZWFjaChzZWxmLnNyYywgZnVuY3Rpb24oKSB7CgkJCWZvciAodmFyIG4gaW4gdGhpcykgewoJCQkJdGhpc1tuXS5hdHRyKCduYW1lJywgbik7CgkJCQlpZiAodGhpc1tuXS5hdHRyKCd0eXBlJykgPT0gJ3RleHQnICYmICF0aGlzW25dLmF0dHIoJ3NpemUnKSAmJiBuIT0nYmdpbWcnKSB7CgkJCQkJdGhpc1tuXS5jc3MoJ3dpZHRoJywgJzEwMCUnKQoJCQkJfQoJCQl9CgkJfSk7CgkJCgkJJC5lYWNoKAoJCQlbJ29uYmx1cicsICdvbmZvY3VzJywgJ29uY2xpY2snLCAnb25kYmxjbGljaycsICdvbm1vdXNlZG93bicsICdvbm1vdXNldXAnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbm1vdXNlbGVhdmUnLCAnb25rZXlkb3duJywgJ29ua2V5cHJlc3MnLCAnb25rZXl1cCddLCAKCQkJZnVuY3Rpb24oKSB7CgkJCQlzZWxmLnNyYy5ldmVudHNbdGhpc10gPSAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCduYW1lJywgdGhpcykuY3NzKCd3aWR0aCcsICcxMDAlJyk7CgkJfSk7CgkJCgl9CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCSF0aGlzLnNyYyAmJiBpbml0KCk7CgkJdGhpcy5jZWxsID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXihURHxUSCkkLyk7CgkJaWYgKCF0aGlzLmNlbGwpIHsKCQkJcmV0dXJuOwoJCX0KCQl0aGlzLnNyYy5tYWluLnR5cGUudmFsKHRoaXMuY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTsKCQl0aGlzLmNlbGwgPSAkKHRoaXMuY2VsbCk7CgkJdGhpcy5zcmMubWFpbi5ib3JkZXIuZWxCb3JkZXJTZWxlY3Qoe3N0eWxlSGVpZ2h0IDogMTE3LCB2YWx1ZSA6IHRoaXMuY2VsbH0pOwoJCXRoaXMuc3JjLm1haW4uYmcuZWxDb2xvclBpY2tlcih7cGFsZXR0ZVBvc2l0aW9uIDogJ291dGVyJywgJ2NsYXNzJyA6ICdlbC1jb2xvcnBpY2tlciB1aS1pY29uIHVpLWljb24tcGVuY2lsJ30pOwoJCXRoaXMuc3JjLm1haW4ucGFkZGluZy5lbFBhZGRpbmdJbnB1dCh7IHZhbHVlIDogdGhpcy5jZWxsfSk7CgkJCgkJdmFyIHcgPSB0aGlzLmNlbGwuY3NzKCd3aWR0aCcpIHx8IHRoaXMuY2VsbC5hdHRyKCd3aWR0aCcpOwoJCXRoaXMuc3JjLm1haW4ud2lkdGgudmFsKHBhcnNlSW50KHcpfHwnJyk7CgkJdGhpcy5zcmMubWFpbi53dW5pdC52YWwody5pbmRleE9mKCdweCcpICE9IC0xID8gJ3B4JyA6ICclJyk7CgkJCgkJdmFyIGggPSB0aGlzLmNlbGwuY3NzKCdoZWlnaHQnKSB8fCB0aGlzLmNlbGwuYXR0cignaGVpZ2h0Jyk7CQoJCXRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbChwYXJzZUludChoKXx8JycpOwoJCXRoaXMuc3JjLm1haW4uaHVuaXQudmFsKGguaW5kZXhPZigncHgnKSAhPSAtMSA/ICdweCcgOiAnJScpOwoJCQoJCXRoaXMuc3JjLm1haW4uYWxpZ24udmFsKHRoaXMuY2VsbC5hdHRyKCdhbGlnbicpIHx8IHRoaXMuY2VsbC5jc3MoJ3RleHQtYWxpZ24nKSk7CgkJdGhpcy5zcmMubWFpbi5iZy52YWwodGhpcy5jZWxsLmNzcygnYmFja2dyb3VuZC1jb2xvcicpKTsKCQl2YXIgYmdpbWcgPSB0aGlzLmNlbGwuY3NzKCdiYWNrZ3JvdW5kLWltYWdlJyk7CgkJdGhpcy5zcmMubWFpbi5iZ2ltZy52YWwoYmdpbWcgJiYgYmdpbWchPSdub25lJyA/IGJnaW1nLnJlcGxhY2UoL3VybFwoKFteXCldKylcKS9pLCAiJDEiKSA6ICcnKTsKCQl0aGlzLnNyYy5tYWluLmFwcGx5LnZhbCgnJyk7CgkJCgkJdmFyIG9wdHMgPSB7CgkJCXJ0bCA6IHRoaXMucnRlLnJ0bCwKCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuc2V0KCk7IGQuY2xvc2UoKTsgfSwKCQkJZGlhbG9nIDogewoJCQkJd2lkdGggOiA1MjAsCgkJCQl0aXRsZSA6IHRoaXMucnRlLmkxOG4oJ1RhYmxlIGNlbGwgcHJvcGVydGllcycpCgkJCX0KCQl9CgkJdmFyIGQgPSBuZXcgZWxEaWFsb2dGb3JtKG9wdHMpOwoJCWZvciAodmFyIHRhYiBpbiB0aGlzLnNyYykgewoJCQlkLnRhYih0YWIsIHRoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbdGFiXSkpOwoJCQkKCQkJaWYgKHRhYiA9PSAnbWFpbicpIHsKCQkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdXaWR0aCcpLCAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi53aWR0aCkuYXBwZW5kKHRoaXMuc3JjLm1haW4ud3VuaXQpXSwgICdtYWluJywgdHJ1ZSkKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdIZWlnaHQnKSwgICAgICAgICAgJCgnPHNwYW4gLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi5oZWlnaHQpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmh1bml0KV0sICdtYWluJywgdHJ1ZSkKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdUYWJsZSBjZWxsIHR5cGUnKSwgdGhpcy5zcmMubWFpbi50eXBlXSwgICAgJ21haW4nLCB0cnVlKQoJCQkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ0JvcmRlcicpLCAgICAgICAgICB0aGlzLnNyYy5tYWluLmJvcmRlcl0sICAnbWFpbicsIHRydWUpCgkJCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQWxpZ25tZW50JyksICAgICAgIHRoaXMuc3JjLm1haW4uYWxpZ25dLCAgICdtYWluJywgdHJ1ZSkKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdQYWRkaW5ncycpLCAgICAgICAgdGhpcy5zcmMubWFpbi5wYWRkaW5nXSwgJ21haW4nLCB0cnVlKQoJCQkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ0JhY2tncm91bmQnKSwgICAgICAkKCc8c3BhbiAvPicpLmFwcGVuZCgkKCc8c3BhbiAvPicpLmNzcyh7J2Zsb2F0JyA6ICdsZWZ0JywgJ21hcmdpbi1yaWdodCcgOiAnM3B4J30pLmFwcGVuZCh0aGlzLnNyYy5tYWluLmJnKSkuYXBwZW5kKHRoaXMuc3JjLm1haW4uYmdpbWcpXSwgICdtYWluJywgdHJ1ZSkKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdBcHBseSB0bycpLCAgICAgICAgdGhpcy5zcmMubWFpbi5hcHBseV0sICAgJ21haW4nLCB0cnVlKTsKCQkJfSBlbHNlIHsKCQkJCWZvciAodmFyIG5hbWUgaW4gdGhpcy5zcmNbdGFiXSkgewoJCQkJCXZhciB2ID0gdGhpcy5jZWxsLmF0dHIobmFtZSkgfHwgJyc7CgkJCQkJaWYgKHRhYiA9PSAnZXZlbnRzJykgewoJCQkJCQl2ID0gdGhpcy5ydGUudXRpbHMudHJpbUV2ZW50Q2FsbGJhY2sodik7CgkJCQkJfSAKCQkJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bih0aGlzLmxhYmVsc1tuYW1lXSA/IHRoaXMubGFiZWxzW25hbWVdIDogbmFtZSksIHRoaXMuc3JjW3RhYl1bbmFtZV0udmFsKHYpXSwgdGFiLCB0cnVlKTsKCQkJCX0KCQkJfQoJCX0KCQlkLm9wZW4oKQoJfQoJCgl0aGlzLnNldCA9IGZ1bmN0aW9uKCkgewoJCS8vICQodCkucmVtb3ZlKCk7CgkJdmFyIHRhcmdldCA9IHRoaXMuY2VsbCwKCQkJYXBwbHkgID0gdGhpcy5zcmMubWFpbi5hcHBseS52YWwoKTsKCQlzd2l0Y2ggKHRoaXMuc3JjLm1haW4uYXBwbHkudmFsKCkpIHsKCQkJY2FzZSAncm93JzoKCQkJCXRhcmdldCA9IHRoaXMuY2VsbC5wYXJlbnQoJ3RyJykuY2hpbGRyZW4oJ3RkLHRoJyk7CgkJCQlicmVhazsKCQkJCQoJCQljYXNlICdjb2x1bW4nOgoJCQkJdGFyZ2V0ID0gJCh0aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4odGhpcy5jZWxsLmdldCgwKSkpOwoJCQkJYnJlYWs7CgkJCQkKCQkJY2FzZSAndGFibGUnOgoJCQkJdGFyZ2V0ID0gdGhpcy5jZWxsLnBhcmVudHMoJ3RhYmxlJykuZmluZCgndGQsdGgnKTsKCQkJCWJyZWFrOwoJCX0KCgkJZm9yICh2YXIgdGFiIGluIHRoaXMuc3JjKSB7CgkJCWlmICh0YWIgIT0gJ21haW4nKSB7CgkJCQlmb3IgKHZhciBuIGluIHRoaXMuc3JjW3RhYl0pIHsKCQkJCQl2YXIgdiA9ICQudHJpbSh0aGlzLnNyY1t0YWJdW25dLnZhbCgpKTsKCQkJCQlpZiAodikgewoJCQkJCQl0YXJnZXQuYXR0cihuLCB2KTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0YXJnZXQucmVtb3ZlQXR0cihuKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJCgkJdGFyZ2V0LnJlbW92ZUF0dHIoJ3dpZHRoJykKCQkJLnJlbW92ZUF0dHIoJ2hlaWdodCcpCgkJCS5yZW1vdmVBdHRyKCdib3JkZXInKQoJCQkucmVtb3ZlQXR0cignYWxpZ24nKQoJCQkucmVtb3ZlQXR0cignYm9yZGVyY29sb3InKQoJCQkucmVtb3ZlQXR0cignYmdjb2xvcicpOwoJCQkKCQl2YXIgdCA9IHRoaXMuc3JjLm1haW4udHlwZS52YWwoKTsKCQl2YXIgdyA9IHBhcnNlSW50KHRoaXMuc3JjLm1haW4ud2lkdGgudmFsKCkpIHx8ICcnOwoJCXZhciBoID0gcGFyc2VJbnQodGhpcy5zcmMubWFpbi5oZWlnaHQudmFsKCkpIHx8ICcnOwoJCXZhciBpID0gJC50cmltKHRoaXMuc3JjLm1haW4uYmdpbWcudmFsKCkpOwoJCXZhciBiID0gdGhpcy5zcmMubWFpbi5ib3JkZXIudmFsKCk7CgkJdmFyIGNzcyA9IHsKCQkJJ3dpZHRoJyAgICAgICAgICAgIDogdyA/IHcrdGhpcy5zcmMubWFpbi53dW5pdC52YWwoKSA6ICcnLAoJCQknaGVpZ2h0JyAgICAgICAgICAgOiBoID8gaCt0aGlzLnNyYy5tYWluLmh1bml0LnZhbCgpIDogJycsCgkJCSdiYWNrZ3JvdW5kLWNvbG9yJyA6IHRoaXMuc3JjLm1haW4uYmcudmFsKCksCgkJCSdiYWNrZ3JvdW5kLWltYWdlJyA6IGkgPyAndXJsKCcraSsnKScgOiAnJywKCQkJJ2JvcmRlcicgICAgICAgICAgIDogJC50cmltKGIud2lkdGgrJyAnK2Iuc3R5bGUrJyAnK2IuY29sb3IpLAoJCQkndGV4dC1hbGlnbicgICAgICAgOiB0aGlzLnNyYy5tYWluLmFsaWduLnZhbCgpIHx8ICcnCgkJfTsKCQl2YXIgcCA9IHRoaXMuc3JjLm1haW4ucGFkZGluZy52YWwoKTsKCQlpZiAocC5jc3MpIHsKCQkJY3NzLnBhZGRpbmcgPSBwLmNzczsKCQl9IGVsc2UgewoJCQljc3NbJ3BhZGRpbmctdG9wJ10gICAgPSBwLnRvcDsKCQkJY3NzWydwYWRkaW5nLXJpZ2h0J10gID0gcC5yaWdodDsKCQkJY3NzWydwYWRkaW5nLWJvdHRvbSddID0gcC5ib3R0b207CgkJCWNzc1sncGFkZGluZy1sZWZ0J10gICA9IHAubGVmdDsKCQl9CgkJCgkJdGFyZ2V0ID0gdGFyZ2V0LmdldCgpOwoKCQkkLmVhY2godGFyZ2V0LCBmdW5jdGlvbigpIHsKCQkJdmFyIHR5cGUgPSB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCWlmICh0eXBlICE9IHQpIHsKCQkJCQoJCQkJdmFyIGF0dHIgPSB7fQoJCQkJZm9yICh2YXIgaSBpbiBzZWxmLnNyYy5hZHYpIHsKCQkJCQl2YXIgdiA9ICR0aGlzLmF0dHIoaSkKCQkJCQlpZiAodikgewoJCQkJCQlhdHRyW2ldID0gdi50b1N0cmluZygpOwoJCQkJCX0KCQkJCX0KCQkJCWZvciAodmFyIGkgaW4gc2VsZi5zcmMuZXZlbnRzKSB7CgkJCQkJdmFyIHYgPSAkdGhpcy5hdHRyKGkpCgkJCQkJaWYgKHYpIHsKCQkJCQkJYXR0cltpXSA9IHYudG9TdHJpbmcoKTsKCQkJCQl9CgkJCQl9CgkJCQl2YXIgY29sc3BhbiA9ICR0aGlzLmF0dHIoJ2NvbHNwYW4nKXx8MTsKCQkJCXZhciByb3dzcGFuID0gJHRoaXMuYXR0cigncm93c3BhbicpfHwxOwoJCQkJaWYgKGNvbHNwYW4+MSkgewoJCQkJCWF0dHIuY29sc3BhbiA9IGNvbHNwYW47CgkJCQl9CgkJCQlpZiAocm93c3Bhbj4xKSB7CgkJCQkJYXR0ci5yb3dzcGFuID0gcm93c3BhbjsKCQkJCX0KCQkJCQoJCQkJJHRoaXMucmVwbGFjZVdpdGgoJCgnPCcrdCsnIC8+JykuaHRtbCgkdGhpcy5odG1sKCkpLmF0dHIoYXR0cikuY3NzKGNzcykgKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkJJHRoaXMuY3NzKGNzcyk7CgkJCX0KCQl9KTsKCgkJdGhpcy5ydGUudWkudXBkYXRlKCk7Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMucnRlLmRvbS5wYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15UQUJMRSQvKSkgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJfSBlbHNlIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoJCX0KCX0KCQp9Cgp9KShqUXVlcnkpOy8qKgogKiBAY2xhc3MgYnV0dG9uIC0gdGFibGUgY2VsbHMgbWVyZ2UKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRiY2VsbHNtZXJnZSA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdmFyIHNlbGYgPSB0aGlzOwoJCglmdW5jdGlvbiBzZWxlY3RlZENlbGxzKCkgewoJCXZhciBjMSA9IHNlbGYucnRlLmRvbS5zZWxmT3JQYXJlbnQoc2VsZi5ydGUuc2VsZWN0aW9uLmdldFN0YXJ0KCksIC9eKFREfFRIKSQvKTsKCQl2YXIgYzIgPSBzZWxmLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHNlbGYucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSwgL14oVER8VEgpJC8pOwkJCgkJaWYgKGMxICYmIGMyICYmIGMxIT1jMiAmJiAkKGMxKS5wYXJlbnRzKCd0YWJsZScpLmdldCgwKSA9PSAkKGMyKS5wYXJlbnRzKCd0YWJsZScpLmdldCgwKSkgewoJCQlyZXR1cm4gW2MxLCBjMl07CgkJfQoJCXJldHVybiBudWxsOwoJfQoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgY2VsbHMgPSBzZWxlY3RlZENlbGxzKCk7CgoJCWlmIChjZWxscykgewoJCQkKCQkJdmFyIF9zICA9IHRoaXMucnRlLmRvbS5pbmRleE9mKCQoY2VsbHNbMF0pLnBhcmVudCgndHInKS5nZXQoMCkpOwoJCQl2YXIgX2UgID0gdGhpcy5ydGUuZG9tLmluZGV4T2YoJChjZWxsc1sxXSkucGFyZW50KCd0cicpLmdldCgwKSk7CgkJCXZhciBybyAgPSBNYXRoLm1pbihfcywgX2UpOyAvLyByb3cgb2Zmc2V0CgkJCXZhciBybCAgPSBNYXRoLm1heChfcywgX2UpIC0gcm8gKyAxOyAvLyByb3cgbGVuZ3RoCgkJCXZhciBfYzEgPSB0aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4oY2VsbHNbMF0sIHRydWUsIHRydWUpOyAKCQkJdmFyIF9jMiA9IHRoaXMucnRlLmRvbS50YWJsZUNvbHVtbihjZWxsc1sxXSwgdHJ1ZSk7CgkJCXZhciBfaTEgPSAkLmluQXJyYXkoY2VsbHNbMF0sIF9jMS5jb2x1bW4pOyAKCQkJdmFyIF9pMiA9ICQuaW5BcnJheShjZWxsc1sxXSwgX2MyLmNvbHVtbik7CgkJCQoJCQl2YXIgY29sQmVnaW4gPSBfYzEuaW5mby5vZmZzZXRbX2kxXSA8IF9jMi5pbmZvLm9mZnNldFtfaTJdICA/IF9jMSA6IF9jMjsKCQkJdmFyIGNvbEVuZCAgID0gX2MxLmluZm8ub2Zmc2V0W19pMV0gPj0gX2MyLmluZm8ub2Zmc2V0W19pMl0gPyBfYzEgOiBfYzI7CgkJCXZhciBsZW5ndGggICA9IDA7CgkJCXZhciB0YXJnZXQgICA9IG51bGw7CgkJCXZhciBodG1sICAgICA9ICcnOwoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQl2YXIgcm93cyA9ICQoJChjZWxsc1swXSkucGFyZW50cygndGFibGUnKS5lcSgwKS5maW5kKCd0cicpLmdldCgpLnNsaWNlKHJvLCBybytybCkpCgkJCQkuZWFjaCggZnVuY3Rpb24oaSkgewoJCQkJCXZhciBfbCA9IGh0bWwubGVuZ3RoOwoJCQkJCXZhciBhY2NlcHQgPSBmYWxzZTsKCQkJCQkkKHRoaXMpLmNoaWxkcmVuKCd0ZCx0aCcpLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJCXZhciAkdGhpcyAgID0gJCh0aGlzKTsKCQkJCQkJdmFyIGluQmVnaW4gPSAkLmluQXJyYXkodGhpcywgY29sQmVnaW4uY29sdW1uKTsKCQkJCQkJdmFyIGluRW5kICAgPSAkLmluQXJyYXkodGhpcywgY29sRW5kLmNvbHVtbik7CgkJCQkJCQoJCQkJCQlpZiAoaW5CZWdpbiE9LTEgfHwgaW5FbmQhPS0xKSB7CgkJCQkJCQlhY2NlcHQgPSBpbkJlZ2luIT0tMSAmJiBpbkVuZD09LTE7CgkJCQkJCQl2YXIgbGVuID0gcGFyc2VJbnQoJHRoaXMuYXR0cignY29sc3BhbicpfHwxKQoJCQkJCQkJaWYgKGkgPT0gMCkgewoJCQkJCQkJCWxlbmd0aCArPSBsZW47CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCWlmIChpbkJlZ2luIT0tMSAmJiBpPjApIHsKCQkJCQkJCQl2YXIgZGVsdGEgPSBjb2xCZWdpbi5pbmZvLmRlbHRhW2luQmVnaW5dOwoJCQkJCQkJCWlmIChkZWx0YT4wKSB7CgkJCQkJCQkJCWlmICgkdGhpcy5jc3MoJ3RleHQtYWxpZ24nKSA9PSAnbGVmdCcpIHsKCQkJCQkJCQkJCXZhciBjZWxsID0gJHRoaXMuY2xvbmUodHJ1ZSk7CgkJCQkJCQkJCQkkdGhpcy5odG1sKCcmbmJzcDsnKTsKCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJCXZhciBjZWxsID0gJHRoaXMuY2xvbmUoKS5odG1sKCcmbmJzcDsnKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQljZWxsLnJlbW92ZUF0dHIoJ2NvbHNwYW4nKS5yZW1vdmVBdHRyKCdpZCcpLmluc2VydEJlZm9yZSh0aGlzKTsKCQkJCQkJCQkJaWYgKGRlbHRhPjEpIHsKCQkJCQkJCQkJCWNlbGwuYXR0cignY29sc3BhbicsIGRlbHRhKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJaWYgKGluRW5kIT0tMSkgewoJCQkJCQkJCXZhciBkZWx0YSA9IGNvbEVuZC5pbmZvLmRlbHRhW2luRW5kXTsKCQkJCQkJCQlpZiAobGVuLWRlbHRhPjEpIHsKCQkJCQkJCQkJdmFyIGNwID0gbGVuLWRlbHRhLTE7CgkJCQkJCQkJCWlmICgkdGhpcy5jc3MoJ3RleHQtYWxpZ24nKSA9PSAncmlnaHQnKSB7CgkJCQkJCQkJCQl2YXIgY2VsbCA9ICR0aGlzLmNsb25lKHRydWUpOwoJCQkJCQkJCQkJJHRoaXMuaHRtbCgnJm5ic3A7Jyk7CgkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQl2YXIgY2VsbCA9ICR0aGlzLmNsb25lKCkuaHRtbCgnJm5ic3A7Jyk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJY2VsbC5yZW1vdmVBdHRyKCdjb2xzcGFuJykucmVtb3ZlQXR0cignaWQnKS5pbnNlcnRBZnRlcih0aGlzKTsKCQkJCQkJCQkJaWYgKGNwPjEpIHsKCQkJCQkJCQkJCWNlbGwuYXR0cignY29sc3BhbicsIGNwKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmICghdGFyZ2V0KSB7CgkJCQkJCQkJdGFyZ2V0ID0gJHRoaXM7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWh0bWwgKz0gJHRoaXMuaHRtbCgpOwoJCQkJCQkJCSR0aGlzLnJlbW92ZSgpOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgaWYgKGFjY2VwdCkgewoJCQkJCQkJaWYgKGkgPT0gMCkgewoJCQkJCQkJCWxlbmd0aCArPSBwYXJzZUludCgkdGhpcy5hdHRyKCdjb2xzcGFuJyl8fDEpOwoJCQkJCQkJfQoJCQkJCQkJaHRtbCArPSAkdGhpcy5odG1sKCk7CgkJCQkJCQkkdGhpcy5yZW1vdmUoKTsKCQkJCQkJCQoKCQkJCQkJfQoJCQkJCX0pCgkJCQkJaHRtbCArPSBfbCE9aHRtbC5sZW5ndGggPyAnPGJyIC8+JyA6ICcnOwoJCQkJfSk7CgoJCQl0YXJnZXQucmVtb3ZlQXR0cignY29sc3BhbicpLnJlbW92ZUF0dHIoJ3Jvd3NwYW4nKS5odG1sKHRhcmdldC5odG1sKCkraHRtbCkKCQkJaWYgKGxlbmd0aD4xKSB7CgkJCQl0YXJnZXQuYXR0cignY29sc3BhbicsIGxlbmd0aCk7CgkJCX0KCQkJaWYgKHJsPjEpIHsKCQkJCXRhcmdldC5hdHRyKCdyb3dzcGFuJywgcmwpOwoJCQl9CgkJCS8vIHNvbWV0aW1lcyB3aGVuIG1lcmdlIGNlbGxzIHdpdGggZGlmZmVyZW50IHJvd3NwYW5zIHdlIGdldCAibG9zdCIgY2VsbHMgaW4gcm93cyAKCQkJLy8gdGhpcyBhZGQgY2VsbHMgaWYgbmVlZGVkCgkJCXRoaXMucnRlLmRvbS5maXhUYWJsZSgkKGNlbGxzWzBdKS5wYXJlbnRzKCd0YWJsZScpLmdldCgwKSk7CgkJfQoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmIChzZWxlY3RlZENlbGxzKCkpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KfSkoalF1ZXJ5KTsKLyoqCiAqIEBjbGFzcyBidXR0b24gLSBzcGxpdCBtZXJnZWQgY2VsbAogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuAogKiBAdG9kbyBzcGxpdCBub3QgbWVyZ2VkIGNlbGwgCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1IAogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YmNlbGxzcGxpdCA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgbiA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL14oVER8VEgpJC8pOwoJCWlmIChuKSB7CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCXZhciBjb2xzcGFuID0gcGFyc2VJbnQodGhpcy5ydGUuZG9tLmF0dHIobiwgJ2NvbHNwYW4nKSk7CgkJCXZhciByb3dzcGFuID0gcGFyc2VJbnQodGhpcy5ydGUuZG9tLmF0dHIobiwgJ3Jvd3NwYW4nKSk7CgkJCWlmIChjb2xzcGFuPjEgfHwgcm93c3Bhbj4xKSB7CgkJCQl2YXIgY251bSA9IGNvbHNwYW4tMTsKCQkJCXZhciBybnVtID0gcm93c3Bhbi0xOwoJCQkJdmFyIHRiICAgPSB0aGlzLnJ0ZS5kb20ucGFyZW50KG4sIC9eVEFCTEUkLyk7CgkJCQl2YXIgdGJtICA9IHRoaXMucnRlLmRvbS50YWJsZU1hdHJpeCh0Yik7CgkJCQkKCQkJCS8vINGP0YfQtdC50LrQuCDQsiDRgtC10LrRg9GJ0LXQvCDRgNGP0LTRgwoJCQkJaWYgKGNudW0pIHsKCQkJCQlmb3IgKHZhciBpPTA7IGk8Y251bTsgaSsrKSB7CgkJCQkJCSQodGhpcy5ydGUuZG9tLmNyZWF0ZShuLm5vZGVOYW1lKSkuaHRtbCgnJm5ic3A7JykuaW5zZXJ0QWZ0ZXIobik7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKHJudW0pIHsKCQkJCQl2YXIgbmR4ICA9IHRoaXMucnRlLmRvbS5pbmRleGVzT2ZDZWxsKG4sIHRibSkKCQkJCQl2YXIgcm5keCA9IG5keFswXTsKCQkJCQl2YXIgY25keCA9IG5keFsxXTsKCQkJCQkvLyDRj9GH0LXQudC60Lgg0LIg0YHQu9C10LTRg9GJ0LjRhSDRgNGP0LTQsNGFCgkJCQkJZm9yICh2YXIgcj1ybmR4KzE7IHIgPCBybmR4K3JudW0rMTsgcisrKSB7CgkJCQkJCXZhciBjZWxsOwoJCQkJCQkKCQkJCQkJaWYgKCF0Ym1bcl1bY25keF0ubm9kZU5hbWUpIHsKCQkJCQkJCWlmICh0Ym1bcl1bY25keC0xXS5ub2RlTmFtZSkgewoJCQkJCQkJCWNlbGwgPSB0Ym1bcl1bY25keC0xXTsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJZm9yICh2YXIgaT1jbmR4LTE7IGk+PTA7IGktLSkgewoJCQkJCQkJCQlpZiAodGJtW3JdW2ldLm5vZGVOYW1lKSB7CgkJCQkJCQkJCQljZWxsID10Ym1bcl1baV07CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmIChjZWxsKSB7CgkJCQkJCQkJZm9yICh2YXIgaT0wOyBpPD0gY251bTsgaSsrKSB7CgkJCQkJCQkJCSQodGhpcy5ydGUuZG9tLmNyZWF0ZShjZWxsLm5vZGVOYW1lKSkuaHRtbCgnJm5ic3A7JykuaW5zZXJ0QWZ0ZXIoY2VsbCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX0KCQkJCSQobikucmVtb3ZlQXR0cignY29sc3BhbicpLnJlbW92ZUF0dHIoJ3Jvd3NwYW4nKTsKCQkJCXRoaXMucnRlLmRvbS5maXhUYWJsZSh0Yik7CgkJCX0KCQl9CgkJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXZhciBuID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXihURHxUSCkkLyk7CgkJaWYgKG4gJiYgKHBhcnNlSW50KHRoaXMucnRlLmRvbS5hdHRyKG4sICdjb2xzcGFuJykpPjEgfHwgcGFyc2VJbnQodGhpcy5ydGUuZG9tLmF0dHIobiwgJ3Jvd3NwYW4nKSk+MSkpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KCn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3MgYnV0dG9uIC0gSW5zZXJ0IG5ldyBjb2x1bW4gaW4gdGFibGUoYmVmb3JlIG9yIGFmdGVyIGN1cnJlbnQpCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YmNvbGJlZm9yZSA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdmFyIHNlbGYgPSB0aGlzOwoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgY2VsbHMgPSB0aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4odGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgZmFsc2UsIHRydWUpOwoJCWlmIChjZWxscy5sZW5ndGgpIHsKCQkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQkJJC5lYWNoKGNlbGxzLCBmdW5jdGlvbigpIHsKCQkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCQl2YXIgY3AgPSBwYXJzZUludCgkdGhpcy5hdHRyKCdjb2xzcGFuJyl8fDEpCgkJCQlpZiAoY3AgPjEpIHsKCQkJCQkkdGhpcy5hdHRyKCdjb2xzcGFuJywgY3ArMSk7CgkJCQl9IGVsc2UgewoJCQkJCXZhciBjID0gJHRoaXMuY2xvbmUoKS5odG1sKCcmbmJzcDsnKS5yZW1vdmVBdHRyKCdjb2xzcGFuJykucmVtb3ZlQXR0cignd2lkdGgnKS5yZW1vdmVBdHRyKCdpZCcpOwoJCQkJCWlmIChzZWxmLm5hbWUgPT0gJ3RiY29sYmVmb3JlJykgewoJCQkJCQljLmluc2VydEJlZm9yZSh0aGlzKTsKCQkJCQl9IGVsc2UgewoJCQkJCQljLmluc2VydEFmdGVyKHRoaXMpOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCX0KCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXihURHxUSCkkLykpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YmNvbGFmdGVyID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRiY29sYmVmb3JlOwoKfSkoalF1ZXJ5KTsKLyoqCiAqIEBjbGFzcyBidXR0b24gLSByZW1vdmUgdGFibGUgY29sdW5tCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YmNvbHJtID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl2YXIgc2VsZiA9IHRoaXM7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXZhciBuICAgICA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJdmFyIGMgICAgID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudChuLCAvXihURHxUSCkkLyk7CgkJdmFyIHByZXYgID0gJChjKS5wcmV2KCd0ZCx0aCcpLmdldCgwKTsKCQl2YXIgbmV4dCAgPSAkKGMpLm5leHQoJ3RkLHRoJykuZ2V0KDApOwkJCQoJCXZhciB0YiAgICA9IHRoaXMucnRlLmRvbS5wYXJlbnQobiwgL15UQUJMRSQvKTsKCQl2YXIgY2VsbHMgPSB0aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4obiwgZmFsc2UsIHRydWUpOwoKCQlpZiAoY2VsbHMubGVuZ3RoKSB7CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCSQuZWFjaChjZWxscywgZnVuY3Rpb24oKSB7CgkJCQl2YXIgJHRoaXMgPSAkKHRoaXMpOwoJCQkJdmFyIGNwICAgID0gcGFyc2VJbnQoJHRoaXMuYXR0cignY29sc3BhbicpfHwxKTsKCQkJCWlmICggY3A+MSApIHsKCQkJCQkkdGhpcy5hdHRyKCdjb2xzcGFuJywgY3AtMSk7CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLnJlbW92ZSgpOwoJCQkJfQoJCQl9KTsKCQkJdGhpcy5ydGUuZG9tLmZpeFRhYmxlKHRiKTsKCQkJaWYgKHByZXYgfHwgbmV4dCkgewoJCQkJdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdENvbnRlbnRzKHByZXYgPyBwcmV2IDogbmV4dCkuY29sbGFwc2UodHJ1ZSk7CgkJCX0KCQkJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwoJCX0KCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXihURHxUSCkkLykpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KCn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3Mg0LzQtdC90Y4gLSDQndC+0LLRi9C5INGA0Y/QtCDQsiDRgtCw0LHQu9C40YbQtQogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoqLwplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJyb3diZWZvcmUgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdmFyIG4gID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTsKCQl2YXIgYyAgPSB0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KG4sIC9eKFREfFRIKSQvKTsKCQl2YXIgciAgPSB0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KGMsIC9eVFIkLyk7CgkJdmFyIG14ID0gdGhpcy5ydGUuZG9tLnRhYmxlTWF0cml4KHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQoYywgL15UQUJMRSQvKSk7CgkJaWYgKGMgJiYgciAmJiBteCkgewoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQl2YXIgYmVmb3JlID0gdGhpcy5uYW1lID09ICd0YnJvd2JlZm9yZSc7CgkJCXZhciBybyAgICAgPSAkKHIpLnByZXZBbGwoJ3RyJykubGVuZ3RoOwoJCQl2YXIgY250ICAgID0gMDsKCQkJdmFyIG1kZiAgICA9IFtdOwoJCQkKCQkJZnVuY3Rpb24gX2ZpbmQoeCwgeSkgewoJCQkJd2hpbGUgKHk+MCkgewoJCQkJCXktLTsKCQkJCQlpZiAobXhbeV0gJiYgbXhbeV1beF0gJiYgbXhbeV1beF0ubm9kZU5hbWUpIHsKCQkJCQkJcmV0dXJuIG14W3ldW3hdOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQkKCQkJZm9yICh2YXIgaT0wOyBpPG14W3JvXS5sZW5ndGg7IGkrKykgewoJCQkJaWYgKG14W3JvXVtpXSAmJiBteFtyb11baV0ubm9kZU5hbWUpIHsKCQkJCQl2YXIgY2VsbCAgICA9ICQobXhbcm9dW2ldKTsKCQkJCQl2YXIgY29sc3BhbiA9IHBhcnNlSW50KGNlbGwuYXR0cignY29sc3BhbicpfHwxKTsKCQkJCQlpZiAocGFyc2VJbnQoY2VsbC5hdHRyKCdyb3dzcGFuJyl8fDEpID4gMSkgewoJCQkJCQlpZiAoYmVmb3JlKSB7CgkJCQkJCQljbnQgKz0gY29sc3BhbjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCW1kZi5wdXNoKGNlbGwpOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJY250ICs9IGNvbHNwYW47CgkJCQkJfQoJCQkJfSBlbHNlIGlmIChteFtyb11baV0gPT0gJy0nKSB7CgkJCQkJY2VsbCA9IF9maW5kKGksIHJvKTsKCQkJCQljZWxsICYmIG1kZi5wdXNoKCQoY2VsbCkpOwoJCQkJfQoJCQl9CgkJCXZhciByb3cgPSAkKCc8dHIgLz4nKTsKCQkJZm9yICh2YXIgaT0wOyBpPGNudDsgaSsrKSB7CgkJCQlyb3cuYXBwZW5kKCc8dGQ+Jm5ic3A7PC90ZD4nKTsKCQkJfQoJCQlpZiAoYmVmb3JlKSB7CgkJCQlyb3cuaW5zZXJ0QmVmb3JlKHIpOwoJCQl9IGVsc2UgewoJCQkJcm93Lmluc2VydEFmdGVyKHIpOwoJCQl9CgkJCSQuZWFjaChtZGYsIGZ1bmN0aW9uKCkgewoJCQkJJCh0aGlzKS5hdHRyKCdyb3dzcGFuJywgcGFyc2VJbnQoJCh0aGlzKS5hdHRyKCdyb3dzcGFuJyl8fDEpKzEpOwoJCQl9KTsKCQkJdGhpcy5ydGUudWkudXBkYXRlKCk7CgkJfQoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksIC9eVFIkLykpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YnJvd2FmdGVyID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRicm93YmVmb3JlOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIHJlbW92ZSB0YWJsZSByb3cKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRicm93cm0gPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCQoJCXZhciBuICA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksCgkJCWMgID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudChuLCAvXihURHxUSCkkLyksCgkJCXIgID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudChjLCAvXlRSJC8pLAoJCQl0YiA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQoYywgL15UQUJMRSQvKSwKCQkJbXggPSB0aGlzLnJ0ZS5kb20udGFibGVNYXRyaXgodGIpOwoJCQoJCWlmIChjICYmIHIgJiYgbXgubGVuZ3RoKSB7CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCWlmIChteC5sZW5ndGg9PTEpIHsKCQkJCSQodGIpLnJlbW92ZSgpOwoJCQkJcmV0dXJuIHRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCQl9CgkJCXZhciBtZGYgPSBbXTsKCQkJdmFyIHJvICA9ICQocikucHJldkFsbCgndHInKS5sZW5ndGg7CgkJCQoJCQlmdW5jdGlvbiBfZmluZCh4LCB5KSB7CgkJCQl3aGlsZSAoeT4wKSB7CgkJCQkJeS0tOwoJCQkJCWlmIChteFt5XSAmJiBteFt5XVt4XSAmJiBteFt5XVt4XS5ub2RlTmFtZSkgewoJCQkJCQlyZXR1cm4gbXhbeV1beF07CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCQkvLyBtb3ZlIGNlbGwgd2l0aCByb3dzcGFuPjEgdG8gbmV4dCByb3cKCQkJZnVuY3Rpb24gX21vdmUoY2VsbCwgeCkgewoJCQkJeSA9IHJvKzE7CgkJCQl2YXIgc2libGluZz0gbnVsbDsKCQkJCWlmIChteFt5XSkgewoJCQkJCWZvciAodmFyIF94PTA7IF94PHg7IF94KyspIHsKCQkJCQkJaWYgKG14W3ldW194XSAmJiBteFt5XVtfeF0ubm9kZU5hbWUpIHsKCQkJCQkJCXNpYmxpbmcgPSBteFt5XVtfeF07CgkJCQkJCX0KCQkJCQl9OwoJCQkJCQoJCQkJCWNlbGwgPSBjZWxsLnJlbW92ZSgpOwoJCQkJCWlmIChzaWJsaW5nKSB7CgkJCQkJCWNlbGwuaW5zZXJ0QWZ0ZXIoc2libGluZyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY2VsbC5wcmVwZW5kVG8oJChyKS5uZXh0KCd0cicpLmVxKDApKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJCgkJCWZ1bmN0aW9uIF9jdXJzb3JQb3MoY29sdW1uKSB7CgkJCQlmb3IgKHZhciBpID0gMDsgaTxjb2x1bW4ubGVuZ3RoOyBpKyspIHsKCQkJCQlpZiAoY29sdW1uW2ldID09IGMpIHsKCQkJCQkJcmV0dXJuIGk8Y29sdW1uLmxlbmd0aC0xID8gY29sdW1uW2krMV0gOiBjb2x1bW5baS0xXTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJCgkJCWZvciAodmFyIGk9MDsgaTxteFtyb10ubGVuZ3RoOyBpKyspIHsKCQkJCXZhciBjZWxsID0gbnVsbDsKCQkJCXZhciBtb3ZlID0gZmFsc2U7CgkJCQlpZiAobXhbcm9dW2ldICYmIG14W3JvXVtpXS5ub2RlTmFtZSkgewoJCQkJCWNlbGwgPSBteFtyb11baV07CgkJCQkJbW92ZSA9IHRydWU7CgkJCQl9IGVsc2UgaWYgKG14W3JvXVtpXSA9PSAnLScgJiYgKGNlbGwgPSBfZmluZChpLCBybykpKSB7CgkJCQkJbW92ZSA9IGZhbHNlOwoJCQkJfQoJCQkJaWYgKGNlbGwpIHsKCQkJCQljZWxsID0gJChjZWxsKTsKCQkJCQl2YXIgcm93c3BhbiA9IHBhcnNlSW50KGNlbGwuYXR0cigncm93c3BhbicpfHwxKTsKCQkJCQlpZiAocm93c3Bhbj4xKSB7CgkJCQkJCWNlbGwuYXR0cigncm93c3BhbicsIHJvd3NwYW4tMSk7CgkJCQkJCW1vdmUgJiYgX21vdmUoY2VsbCwgaSwgcm8pOwoJCQkJCX0gCgkJCQl9CgkJCX07CgkJCQoJCQl2YXIgX2MgPSBfY3Vyc29yUG9zKHRoaXMucnRlLmRvbS50YWJsZUNvbHVtbihjKSk7CgkJCWlmIChfYykgewoJCQkJdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdENvbnRlbnRzKF9jKS5jb2xsYXBzZSh0cnVlKTsKCQkJfQoKCQkJJChyKS5yZW1vdmUoKTsKCQl9CgkJdGhpcy5ydGUudWkudXBkYXRlKCk7Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15UUiQvKSkgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJfSBlbHNlIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoJCX0KCX0KfQoKfSkoalF1ZXJ5KTsvKioKICogQGNsYXNzINC60L3QvtC/0LrQsCAtINC+0YLQvNC10L3QsCDQv9C+0LLRgtC+0YAg0LTQtdC50YHRgtCy0LjQuQogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICogCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKCWVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy51bmRvID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7CgkJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCgkJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJCWlmICh0aGlzLm5hbWUgPT0gJ3VuZG8nICYmIHRoaXMucnRlLmhpc3RvcnkuY2FuQmFjaygpKSB7CgkJCQl0aGlzLnJ0ZS5oaXN0b3J5LmJhY2soKTsKCQkJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCQl9IGVsc2UgaWYgKHRoaXMubmFtZSA9PSAncmVkbycgJiYgdGhpcy5ydGUuaGlzdG9yeS5jYW5Gd2QoKSkgewoJCQkJdGhpcy5ydGUuaGlzdG9yeS5md2QoKTsKCQkJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCQl9CgkJfQoJCgkJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQkJdGhpcy5kb21FbGVtLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsIHRoaXMubmFtZSA9PSAndW5kbycgPyAhdGhpcy5ydGUuaGlzdG9yeS5jYW5CYWNrKCkgOiAhdGhpcy5ydGUuaGlzdG9yeS5jYW5Gd2QoKSk7CgkJfQoJfQoKCWVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5yZWRvID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnVuZG87Cgp9KShqUXVlcnkpOy8qKgogKiBAY2xhc3MgYnV0dG9uIC0gcmVtb3ZlIGxpbmsKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LgKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUgCiAqKi8KKGZ1bmN0aW9uKCQpIHsKCgllbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudW5saW5rID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7CgkJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoKCQl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCgkJCXZhciBuID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgCgkJCQlsID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudExpbmsobik7CgoJCQlmdW5jdGlvbiBpc0xpbmsobikgeyByZXR1cm4gbi5ub2RlTmFtZSA9PSAnQScgJiYgbi5ocmVmOyB9CgoJCQlpZiAoIWwpIHsKCgkJCQl2YXIgc2VsID0gJC5icm93c2VyLm1zaWUgPyB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoKSA6IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7d3JhcCA6IGZhbHNlfSk7CgkJCQlpZiAoc2VsLmxlbmd0aCkgewoJCQkJCWZvciAodmFyIGk9MDsgaSA8IHNlbC5sZW5ndGg7IGkrKykgewoJCQkJCQlpZiAoaXNMaW5rKHNlbFtpXSkpIHsKCQkJCQkJCWwgPSBzZWxbaV07CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX07CgkJCQkJaWYgKCFsKSB7CgkJCQkJCWwgPSB0aGlzLnJ0ZS5kb20ucGFyZW50KHNlbFswXSwgaXNMaW5rKSB8fCB0aGlzLnJ0ZS5kb20ucGFyZW50KHNlbFtzZWwubGVuZ3RoLTFdLCBpc0xpbmspOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaWYgKGwpIHsKCQkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0KGwpOwoJCQkJdGhpcy5ydGUuZG9jLmV4ZWNDb21tYW5kKCd1bmxpbmsnLCBmYWxzZSwgbnVsbCk7CgkJCQl0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSk7CgkJCX0KCQkKCQl9CgkKCQl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJCWlmICh0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50TGluayhuKSkgewoJCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpLmFkZENsYXNzKCdhY3RpdmUnKTsKCQkJfSBlbHNlIGlmICh0aGlzLnJ0ZS5kb20uc2VsZWN0aW9uSGFzKGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4ubm9kZU5hbWUgPT0gJ0EnICYmIG4uaHJlZjsgfSkpIHsKCQkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKS5hZGRDbGFzcygnYWN0aXZlJyk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoJ2Rpc2FibGVkJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCQl9CgkJfQoJfQoKfSkoalF1ZXJ5KTsKCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/elrte.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogZWxSVEUgV1lTSVdZRyBIVE1MLWVkaXRvcgogKiBWZXJzaW9uIDEuMSAoMjAxMC0wOS0yMCkKICogaHR0cDovL2VscnRlLm9yZwogKgogKiBDb3B5cmlnaHQgMjAxMCwgU3R1ZGlvIDQyIEx0ZC4KICogTGljZW5zZWQgdW5kZXIgYSAzIGNsYXVzZXMgQlNEIGxpY2Vuc2UKICovCmZ1bmN0aW9uIGVsaTE4bihhKXt0aGlzLnRleHRkb21haW49ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubWVzc2FnZXNbYl0/dGhpcy5fZG9tYWluPWI6dGhpcy5fZG9tYWlufTthJiZhLm1lc3NhZ2VzJiZ0aGlzLmxvYWQoYS5tZXNzYWdlcyk7YSYmYS50ZXh0ZG9tYWluJiZ0aGlzLnRleHRkb21haW4oYS50ZXh0ZG9tYWluKX1lbGkxOG4ucHJvdG90eXBlPW5ldyBmdW5jdGlvbigpe3RoaXMubWVzc2FnZXM9e307dGhpcy5fZG9tYWluPSIiO3RoaXMubG9hZD1mdW5jdGlvbihjKXtpZih0eXBlb2YoYyk9PSJvYmplY3QiKXtmb3IodmFyIGYgaW4gYyl7dmFyIGI9Y1tmXTtpZih0eXBlb2YoYik9PSJvYmplY3QiKXtpZighdGhpcy5tZXNzYWdlc1tmXSl7dGhpcy5tZXNzYWdlc1tmXT17fX1mb3IodmFyIGEgaW4gYil7aWYodHlwZW9mKGJbYV0pPT0ic3RyaW5nIil7dGhpcy5tZXNzYWdlc1tmXVthXT1iW2FdfX19fX1yZXR1cm4gdGhpc307dGhpcy50cmFuc2xhdGU9ZnVuY3Rpb24oYixhKXt2YXIgYT1hJiZ0aGlzLm1lc3NhZ2VzW2FdP2E6dGhpcy5fZG9tYWluO3JldHVybiB0aGlzLm1lc3NhZ2VzW2FdJiZ0aGlzLm1lc3NhZ2VzW2FdW2JdP3RoaXMubWVzc2FnZXNbYV1bYl06Yn07dGhpcy5mb3JtYXQ9ZnVuY3Rpb24oZixiLGMpe2Y9dGhpcy50cmFuc2xhdGUoZixjKTtpZih0eXBlb2YoYik9PSJvYmplY3QiKXtmb3IodmFyIGEgaW4gYil7Zj1mLnJlcGxhY2UoIiUiK2EsdGhpcy50cmFuc2xhdGUoYlthXSxjKSl9fXJldHVybiBmfX07ZnVuY3Rpb24gZWxEaWFsb2dGb3JtKGMpe3ZhciBhPXRoaXM7dmFyIGI9eyJjbGFzcyI6ImVsLWRpYWxvZ2Zvcm0iLHN1Ym1pdDpmdW5jdGlvbihmLGcpe3dpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2cmJndpbmRvdy5jb25zb2xlLmxvZygic3VibWl0IGNhbGxlZCIpO2cuY2xvc2UoKX0sZm9ybTp7YWN0aW9uOndpbmRvdy5sb2NhdGlvbi5ocmVmLG1ldGhvZDoicG9zdCJ9LGFqYXhGb3JtOm51bGwsdmFsaWRhdGU6bnVsbCxzcGlubmVyOiJMb2FkaW5nIix0YWJzOnthY3RpdmU6MH0sdGFiUHJlZml4OiJlbC1kZi10YWItIixkaWFsb2c6e3RpdGxlOiJkaWFsb2ciLGF1dG9PcGVuOmZhbHNlLG1vZGFsOnRydWUscmVzaXphYmxlOmZhbHNlLGJ1dHRvbnM6e0NhbmNlbDpmdW5jdGlvbigpe2EuY2xvc2UoKX0sT2s6ZnVuY3Rpb24oKXthLmZvcm0udHJpZ2dlcigic3VibWl0Iil9fX19O3RoaXMub3B0cz1qUXVlcnkuZXh0ZW5kKHRydWUsYixjLHtkaWFsb2c6e2F1dG9PcGVuOmZhbHNlLGNsb3NlOmZ1bmN0aW9uKCl7YS5jbG9zZSgpfX19KTtpZih0aGlzLm9wdHMucnRsKXt0aGlzLm9wdHNbImNsYXNzIl0rPSIgZWwtZGlhbG9nZm9ybS1ydGwifWlmKGMmJmMuZGlhbG9nJiZjLmRpYWxvZy5idXR0b25zJiZ0eXBlb2YoYy5kaWFsb2cuYnV0dG9ucyk9PSJvYmplY3QiKXt0aGlzLm9wdHMuZGlhbG9nLmJ1dHRvbnM9Yy5kaWFsb2cuYnV0dG9uc310aGlzLnVsPW51bGw7dGhpcy50YWJzPXt9O3RoaXMuX3RhYmxlPW51bGw7dGhpcy5kaWFsb2c9alF1ZXJ5KCI8ZGl2IC8+IikuYWRkQ2xhc3ModGhpcy5vcHRzWyJjbGFzcyJdKS5kaWFsb2codGhpcy5vcHRzLmRpYWxvZyk7dGhpcy5tZXNzYWdlPWpRdWVyeSgnPGRpdiBjbGFzcz0iZWwtZGlhbG9nZm9ybS1tZXNzYWdlIHJvdW5kZWQtNSIgLz4nKS5oaWRlKCkuYXBwZW5kVG8odGhpcy5kaWFsb2cpO3RoaXMuZXJyb3I9alF1ZXJ5KCc8ZGl2IGNsYXNzPSJlbC1kaWFsb2dmb3JtLWVycm9yIHJvdW5kZWQtNSIgLz4nKS5oaWRlKCkuYXBwZW5kVG8odGhpcy5kaWFsb2cpO3RoaXMuc3Bpbm5lcj1qUXVlcnkoJzxkaXYgY2xhc3M9InNwaW5uZXIiIC8+JykuaGlkZSgpLmFwcGVuZFRvKHRoaXMuZGlhbG9nKTt0aGlzLmNvbnRlbnQ9alF1ZXJ5KCc8ZGl2IGNsYXNzPSJlbC1kaWFsb2dmb3JtLWNvbnRlbnQiIC8+JykuYXBwZW5kVG8odGhpcy5kaWFsb2cpO3RoaXMuZm9ybT1qUXVlcnkoIjxmb3JtIC8+IikuYXR0cih0aGlzLm9wdHMuZm9ybSkuYXBwZW5kVG8odGhpcy5jb250ZW50KTtpZih0aGlzLm9wdHMuc3VibWl0KXt0aGlzLmZvcm0uYmluZCgic3VibWl0IixmdW5jdGlvbihmKXthLm9wdHMuc3VibWl0KGYsYSl9KX1pZih0aGlzLm9wdHMuYWpheEZvcm0mJmpRdWVyeS5mbi5hamF4Rm9ybSl7dGhpcy5mb3JtLmFqYXhGb3JtKHRoaXMub3B0cy5hamF4Rm9ybSl9aWYodGhpcy5vcHRzLnZhbGlkYXRlKXt0aGlzLmZvcm0udmFsaWRhdGUodGhpcy5vcHRzLnZhbGlkYXRlKX10aGlzLm9wdGlvbj1mdW5jdGlvbihmLGcpe3JldHVybiB0aGlzLmRpYWxvZy5kaWFsb2coIm9wdGlvbiIsZixnKX07dGhpcy5zaG93RXJyb3I9ZnVuY3Rpb24oZixnKXt0aGlzLmhpZGVNZXNzYWdlKCk7dGhpcy5oaWRlU3Bpbm5lcigpO3RoaXMuZXJyb3IuaHRtbChmKS5zaG93KCk7ZyYmdGhpcy5jb250ZW50LmhpZGUoKTtyZXR1cm4gdGhpc307dGhpcy5oaWRlRXJyb3I9ZnVuY3Rpb24oKXt0aGlzLmVycm9yLnRleHQoIiIpLmhpZGUoKTt0aGlzLmNvbnRlbnQuc2hvdygpO3JldHVybiB0aGlzfTt0aGlzLnNob3dTcGlubmVyPWZ1bmN0aW9uKGYpe3RoaXMuZXJyb3IuaGlkZSgpO3RoaXMubWVzc2FnZS5oaWRlKCk7dGhpcy5jb250ZW50LmhpZGUoKTt0aGlzLnNwaW5uZXIudGV4dChmfHx0aGlzLm9wdHMuc3Bpbm5lcikuc2hvdygpO3RoaXMub3B0aW9uKCJidXR0b25zIix7fSk7cmV0dXJuIHRoaXN9O3RoaXMuaGlkZVNwaW5uZXI9ZnVuY3Rpb24oKXt0aGlzLmNvbnRlbnQuc2hvdygpO3RoaXMuc3Bpbm5lci5oaWRlKCk7cmV0dXJuIHRoaXN9O3RoaXMuc2hvd01lc3NhZ2U9ZnVuY3Rpb24oZixnKXt0aGlzLmhpZGVFcnJvcigpO3RoaXMuaGlkZVNwaW5uZXIoKTt0aGlzLm1lc3NhZ2UuaHRtbChmfHwiIikuc2hvdygpO2cmJnRoaXMuY29udGVudC5oaWRlKCk7cmV0dXJuIHRoaXN9O3RoaXMuaGlkZU1lc3NhZ2U9ZnVuY3Rpb24oKXt0aGlzLm1lc3NhZ2UuaGlkZSgpO3RoaXMuY29udGVudC5zaG93KCk7cmV0dXJuIHRoaXN9O3RoaXMudGFiPWZ1bmN0aW9uKGcsZil7Zz10aGlzLm9wdHMudGFiUHJlZml4K2c7aWYoIXRoaXMudWwpe3RoaXMudWw9alF1ZXJ5KCI8dWwgLz4iKS5wcmVwZW5kVG8odGhpcy5mb3JtKX1qUXVlcnkoIjxsaSAvPiIpLmFwcGVuZChqUXVlcnkoIjxhIC8+IikuYXR0cigiaHJlZiIsIiMiK2cpLmh0bWwoZikpLmFwcGVuZFRvKHRoaXMudWwpO3RoaXMudGFic1tnXT17dGFiOmpRdWVyeSgiPGRpdiAvPiIpLmF0dHIoImlkIixnKS5hZGRDbGFzcygidGFiIikuYXBwZW5kVG8odGhpcy5mb3JtKSx0YWJsZTpudWxsfTtyZXR1cm4gdGhpc307dGhpcy50YWJsZT1mdW5jdGlvbihmKXtmPWYmJmYuaW5kZXhPZih0aGlzLm9wdHMudGFiUHJlZml4KT09LTE/dGhpcy5vcHRzLnRhYlByZWZpeCtmOmY7aWYoZiYmdGhpcy50YWJzJiZ0aGlzLnRhYnNbZl0pe3RoaXMudGFic1tmXS50YWJsZT1qUXVlcnkoIjx0YWJsZSAvPiIpLmFwcGVuZFRvKHRoaXMudGFic1tmXS50YWIpfWVsc2V7dGhpcy5fdGFibGU9alF1ZXJ5KCI8dGFibGUgLz4iKS5hcHBlbmRUbyh0aGlzLmZvcm0pfXJldHVybiB0aGlzfTt0aGlzLmFwcGVuZD1mdW5jdGlvbihqLGssZyl7az1rPyJlbC1kZi10YWItIitrOiIiO2lmKCFqKXtyZXR1cm4gdGhpc31pZihrJiZ0aGlzLnRhYnNba10pe2lmKGcpeyF0aGlzLnRhYnNba10udGFibGUmJnRoaXMudGFibGUoayk7dmFyIGg9alF1ZXJ5KCI8dHIgLz4iKS5hcHBlbmRUbyh0aGlzLnRhYnNba10udGFibGUpO2lmKCFqUXVlcnkuaXNBcnJheShqKSl7aC5hcHBlbmQoalF1ZXJ5KCI8dGQgLz4iKS5hcHBlbmQoaikpfWVsc2V7Zm9yKHZhciBmPTA7ZjxqLmxlbmd0aDtmKyspe2guYXBwZW5kKGpRdWVyeSgiPHRkIC8+IikuYXBwZW5kKGpbZl0pKX19fWVsc2V7aWYoIWpRdWVyeS5pc0FycmF5KGopKXt0aGlzLnRhYnNba10udGFiLmFwcGVuZChqKX1lbHNle2Zvcih2YXIgZj0wO2Y8ai5sZW5ndGg7ZisrKXt0aGlzLnRhYnNba10udGFiLmFwcGVuZChqW2ZdKX19fX1lbHNle2lmKCFnKXtpZighalF1ZXJ5LmlzQXJyYXkoaikpe3RoaXMuZm9ybS5hcHBlbmQoail9ZWxzZXtmb3IodmFyIGY9MDtmPGoubGVuZ3RoO2YrKyl7dGhpcy5mb3JtLmFwcGVuZChqW2ZdKX19fWVsc2V7aWYoIXRoaXMuX3RhYmxlKXt0aGlzLnRhYmxlKCl9dmFyIGg9alF1ZXJ5KCI8dHIgLz4iKS5hcHBlbmRUbyh0aGlzLl90YWJsZSk7aWYoIWpRdWVyeS5pc0FycmF5KGopKXtoLmFwcGVuZChqUXVlcnkoIjx0ZCAvPiIpLmFwcGVuZChqKSl9ZWxzZXtmb3IodmFyIGY9MDtmPGoubGVuZ3RoO2YrKyl7aC5hcHBlbmQoalF1ZXJ5KCI8dGQgLz4iKS5hcHBlbmQoaltmXSkpfX19fXJldHVybiB0aGlzfTt0aGlzLnNlcGFyYXRvcj1mdW5jdGlvbihmKXtmPSJlbC1kZi10YWItIitmO2lmKHRoaXMudGFicyYmdGhpcy50YWJzW2ZdKXt0aGlzLnRhYnNbZl0udGFiLmFwcGVuZChqUXVlcnkoIjxkaXYgLz4iKS5hZGRDbGFzcygic2VwYXJhdG9yIikpO3RoaXMudGFic1tmXS50YWJsZSYmdGhpcy50YWJsZShmKX1lbHNle3RoaXMuZm9ybS5hcHBlbmQoalF1ZXJ5KCI8ZGl2IC8+IikuYWRkQ2xhc3MoInNlcGFyYXRvciIpKX1yZXR1cm4gdGhpc307dGhpcy5vcGVuPWZ1bmN0aW9uKCl7dGhpcy51bCYmdGhpcy5mb3JtLnRhYnModGhpcy5vcHRzLnRhYnMpO3RoaXMuZm9ybS5maW5kKCI6dGV4dCIpLmtleXVwKGZ1bmN0aW9uKGcpe2lmKGcua2V5Q29kZT09MTMpe2YuZm9ybS5zdWJtaXQoKX19KTt0aGlzLmRpYWxvZy5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmRpYWxvZygib3BlbiIpO3ZhciBmPXRoaXM7aWYodGhpcy5mb3JtJiZ0aGlzLmZvcm0uZmluZCgiOnRleHQiKS5sZW5ndGgpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmZvcm0uZmluZCgiOnRleHQiKVswXS5mb2N1cygpfSwyMCl9cmV0dXJuIHRoaXN9O3RoaXMuY2xvc2U9ZnVuY3Rpb24oKXtpZih0eXBlb2YodGhpcy5vcHRzLmNsb3NlKT09ImZ1bmN0aW9uIil7dGhpcy5vcHRzLmNsb3NlKCl9dGhpcy5kaWFsb2cuZGlhbG9nKCJkZXN0cm95IikucmVtb3ZlKCl9fShmdW5jdGlvbihhKXthLmZuLmVsQ29sb3JQaWNrZXI9ZnVuY3Rpb24oaCl7dmFyIGI9dGhpczt2YXIgZj1hLmV4dGVuZCh7fSxhLmZuLmVsQ29sb3JQaWNrZXIuZGVmYXVsdHMsaCk7dGhpcy5oaWRkZW49YSgnPGlucHV0IHR5cGU9ImhpZGRlbiIgLz4nKS5hdHRyKCJuYW1lIixmLm5hbWUpLnZhbChmLmNvbG9yfHwiIikuYXBwZW5kVG8odGhpcyk7dGhpcy5wYWxldHRlPW51bGw7dGhpcy5wcmV2aWV3PW51bGw7dGhpcy5pbnB1dD1udWxsO2Z1bmN0aW9uIGMoail7Yi52YWwoaik7Zi5jaGFuZ2UmJmYuY2hhbmdlKGIudmFsKCkpO2IucGFsZXR0ZS5zbGlkZVVwKCl9ZnVuY3Rpb24gZygpe2IucGFsZXR0ZT1hKCI8ZGl2IC8+IikuYWRkQ2xhc3MoZi5wYWxldHRlQ2xhc3MrIiByb3VuZGVkLTMiKTtmb3IodmFyIGo9MDtqPGYuY29sb3JzLmxlbmd0aDtqKyspe2EoIjxkaXYgLz4iKS5hZGRDbGFzcygiY29sb3IiKS5jc3MoImJhY2tncm91bmQtY29sb3IiLGYuY29sb3JzW2pdKS5hdHRyKHt0aXRsZTpmLmNvbG9yc1tqXSx1bnNlbGVjdGFibGU6Im9uIn0pLmFwcGVuZFRvKGIucGFsZXR0ZSkubW91c2VlbnRlcihmdW5jdGlvbigpe3ZhciBrPWEodGhpcykuYXR0cigidGl0bGUiKTtiLmlucHV0LnZhbChrKTtiLnByZXZpZXcuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIixrKX0pLmNsaWNrKGZ1bmN0aW9uKGspe2suc3RvcFByb3BhZ2F0aW9uKCk7YyhhKHRoaXMpLmF0dHIoInRpdGxlIikpfSl9Yi5pbnB1dD1hKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hZGRDbGFzcygicm91bmRlZC0zIikuYXR0cigic2l6ZSIsOCkuY2xpY2soZnVuY3Rpb24oayl7ay5zdG9wUHJvcGFnYXRpb24oKX0pLmtleWRvd24oZnVuY3Rpb24ocCl7aWYocC5jdHJsS2V5fHxwLm1ldGFLZXkpe3JldHVybiB0cnVlfXZhciBvPXAua2V5Q29kZTtpZihvPT0yNyl7cmV0dXJuIGIubW91c2VsZWF2ZSgpfWlmKG8hPTgmJm8hPTEzJiZvIT00NiYmbyE9MzcmJm8hPTM5JiYobzw0OHx8bz41NykmJihvPDY1fHxvPjcwKSl7cmV0dXJuIGZhbHNlfXZhciBxPWEodGhpcykudmFsKCk7aWYocS5sZW5ndGg9PTd8fHEubGVuZ3RoPT0wKXtpZihvPT0xMyl7cC5zdG9wUHJvcGFnYXRpb24oKTtwLnByZXZlbnREZWZhdWx0KCk7YyhxKTtiLnBhbGV0dGUuc2xpZGVVcCgpfWlmKHAua2V5Q29kZSE9OCYmcC5rZXlDb2RlIT00NiYmbyE9MzcmJm8hPTM5KXtyZXR1cm4gZmFsc2V9fX0pLmtleXVwKGZ1bmN0aW9uKGspe3ZhciBvPWEodGhpcykudmFsKCk7by5sZW5ndGg9PTcmJi9eI1swLTlhYmNkZWZdezZ9JC9pLnRlc3QobykmJmIudmFsKG8pfSk7Yi5wcmV2aWV3PWEoIjxkaXYgLz4iKS5hZGRDbGFzcygicHJldmlldyByb3VuZGVkLTMiKS5jbGljayhmdW5jdGlvbihrKXtrLnN0b3BQcm9wYWdhdGlvbigpO2MoYi5pbnB1dC52YWwoKSl9KTtiLnBhbGV0dGUuYXBwZW5kKGEoIjxkaXYgLz4iKS5hZGRDbGFzcygiY2xlYXJmaXgiKSkuYXBwZW5kKGEoIjxkaXYgLz4iKS5hZGRDbGFzcygicGFuZWwiKS5hcHBlbmQoYi5pbnB1dCkuYXBwZW5kKGIucHJldmlldykpO2lmKGYucGFsZXR0ZVBvc2l0aW9uPT0ib3V0ZXIiKXtiLnBhbGV0dGUuaGlkZSgpLmFwcGVuZFRvKGIucGFyZW50cygiYm9keSIpLmVxKDApKS5tb3VzZWxlYXZlKGZ1bmN0aW9uKCl7YSh0aGlzKS5zbGlkZVVwKCk7Yi52YWwoYi52YWwoKSl9KTtiLm1vdXNlbGVhdmUoZnVuY3Rpb24oayl7aWYoay5yZWxhdGVkVGFyZ2V0IT1iLnBhbGV0dGUuZ2V0KDApKXtiLnBhbGV0dGUuc2xpZGVVcCgpO2IudmFsKGIudmFsKCkpfX0pfWVsc2V7Yi5hcHBlbmQoYi5wYWxldHRlLmhpZGUoKSkubW91c2VsZWF2ZShmdW5jdGlvbihrKXtiLnBhbGV0dGUuc2xpZGVVcCgpO2IudmFsKGIudmFsKCkpfSl9Yi52YWwoYi52YWwoKSl9dGhpcy5lbXB0eSgpLmFkZENsYXNzKGZbImNsYXNzIl0rIiByb3VuZGVkLTMiKS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsImJhY2tncm91bmQtY29sb3IiOmYuY29sb3J8fCIifSkuY2xpY2soZnVuY3Rpb24ocCl7aWYoIWIuaGFzQ2xhc3MoImRpc2FibGVkIikpeyFiLnBhbGV0dGUmJmcoKTtpZihmLnBhbGV0dGVQb3NpdGlvbj09Im91dGVyIiYmYi5wYWxldHRlLmNzcygiZGlzcGxheSIpPT0ibm9uZSIpe3ZhciBxPWEodGhpcykub2Zmc2V0KCk7dmFyIGs9Yi5wYWxldHRlLndpZHRoKCk7dmFyIGo9Yi5wYXJlbnRzKCJib2R5Iikud2lkdGgoKS1xLmxlZnQ+PWs/cS5sZWZ0OnEubGVmdCthKHRoaXMpLm91dGVyV2lkdGgoKS1rO2IucGFsZXR0ZS5jc3Moe2xlZnQ6aisicHgiLHRvcDpxLnRvcCthKHRoaXMpLmhlaWdodCgpKzErInB4In0pfWIucGFsZXR0ZS5zbGlkZVRvZ2dsZSgpfX0pO3RoaXMudmFsPWZ1bmN0aW9uKGope2lmKCFqJiZqIT09IiIpe3JldHVybiB0aGlzLmhpZGRlbi52YWwoKX1lbHNle3RoaXMuaGlkZGVuLnZhbChqKTtpZihmLnVwZGF0ZSl7Zi51cGRhdGUodGhpcy5oaWRkZW4udmFsKCkpfWVsc2V7dGhpcy5jc3MoImJhY2tncm91bmQtY29sb3IiLGopfWlmKGIucGFsZXR0ZSl7Yi5wcmV2aWV3LmNzcygiYmFja2dyb3VuZC1jb2xvciIsaik7Yi5pbnB1dC52YWwoail9fXJldHVybiB0aGlzfTtyZXR1cm4gdGhpc307YS5mbi5lbENvbG9yUGlja2VyLmRlZmF1bHRzPXsiY2xhc3MiOiJlbC1jb2xvcnBpY2tlciIscGFsZXR0ZUNsYXNzOiJlbC1wYWxldHRlIixwYWxldHRlUG9zaXRpb246ImlubmVyIixuYW1lOiJjb2xvciIsY29sb3I6IiIsdXBkYXRlOm51bGwsY2hhbmdlOmZ1bmN0aW9uKGIpe30sY29sb3JzOlsiI2ZmZmZmZiIsIiNjY2NjY2MiLCIjOTk5OTk5IiwiIzY2NjY2NiIsIiMzMzMzMzMiLCIjMDAwMDAwIiwiI2ZmY2NjYyIsIiNjYzk5OTkiLCIjOTk2NjY2IiwiIzY2MzMzMyIsIiMzMzAwMDAiLCIjZmY5OTk5IiwiI2NjNjY2NiIsIiNjYzMzMzMiLCIjOTkzMzMzIiwiIzY2MDAwMCIsIiNmZjY2NjYiLCIjZmYzMzMzIiwiI2ZmMDAwMCIsIiNjYzAwMDAiLCIjOTkwMDAwIiwiI2ZmOTk2NiIsIiNmZjY2MzMiLCIjZmYzMzAwIiwiI2NjMzMwMCIsIiM5OTMzMDAiLCIjZmZjYzk5IiwiI2NjOTk2NiIsIiNjYzY2MzMiLCIjOTk2NjMzIiwiIzY2MzMwMCIsIiNmZjk5MzMiLCIjZmY2NjAwIiwiI2ZmOTkwMCIsIiNjYzY2MDAiLCIjY2M5OTMzIiwiI2ZmY2M2NiIsIiNmZmNjMzMiLCIjZmZjYzAwIiwiI2NjOTkwMCIsIiM5OTY2MDAiLCIjZmZmZmNjIiwiI2NjY2M5OSIsIiM5OTk5NjYiLCIjNjY2NjMzIiwiIzMzMzMwMCIsIiNmZmZmOTkiLCIjY2NjYzY2IiwiI2NjY2MzMyIsIiM5OTk5MzMiLCIjNjY2NjAwIiwiI2ZmZmY2NiIsIiNmZmZmMzMiLCIjZmZmZjAwIiwiI2NjY2MwMCIsIiM5OTk5MDAiLCIjY2NmZjY2IiwiI2NjZmYzMyIsIiNjY2ZmMDAiLCIjOTljYzAwIiwiIzY2OTkwMCIsIiNjY2ZmOTkiLCIjOTljYzY2IiwiIzk5Y2MzMyIsIiM2Njk5MzMiLCIjMzM2NjAwIiwiIzk5ZmYzMyIsIiM5OWZmMDAiLCIjNjZmZjAwIiwiIzY2Y2MwMCIsIiM2NmNjMzMiLCIjOTlmZjY2IiwiIzY2ZmYzMyIsIiMzM2ZmMDAiLCIjMzNjYzAwIiwiIzMzOTkwMCIsIiNjY2ZmY2MiLCIjOTljYzk5IiwiIzY2OTk2NiIsIiMzMzY2MzMiLCIjMDAzMzAwIiwiIzk5ZmY5OSIsIiM2NmNjNjYiLCIjMzNjYzMzIiwiIzMzOTkzMyIsIiMwMDY2MDAiLCIjNjZmZjY2IiwiIzMzZmYzMyIsIiMwMGZmMDAiLCIjMDBjYzAwIiwiIzAwOTkwMCIsIiM2NmZmOTkiLCIjMzNmZjY2IiwiIzAwZmYzMyIsIiMwMGNjMzMiLCIjMDA5OTMzIiwiIzk5ZmZjYyIsIiM2NmNjOTkiLCIjMzNjYzY2IiwiIzMzOTk2NiIsIiMwMDY2MzMiLCIjMzNmZjk5IiwiIzAwZmY2NiIsIiMwMGZmOTkiLCIjMDBjYzY2IiwiIzMzY2M5OSIsIiM2NmZmY2MiLCIjMzNmZmNjIiwiIzAwZmZjYyIsIiMwMGNjOTkiLCIjMDA5OTY2IiwiI2NjZmZmZiIsIiM5OWNjY2MiLCIjNjY5OTk5IiwiIzMzNjY2NiIsIiMwMDMzMzMiLCIjOTlmZmZmIiwiIzY2Y2NjYyIsIiMzM2NjY2MiLCIjMzM5OTk5IiwiIzAwNjY2NiIsIiM2NmNjY2MiLCIjMzNmZmZmIiwiIzAwZmZmZiIsIiMwMGNjY2MiLCIjMDA5OTk5IiwiIzY2Y2NmZiIsIiMzM2NjZmYiLCIjMDBjY2ZmIiwiIzAwOTljYyIsIiMwMDY2OTkiLCIjOTljY2ZmIiwiIzY2OTljYyIsIiMzMzk5Y2MiLCIjMzM2Njk5IiwiIzAwMzM2NiIsIiMzMzk5ZmYiLCIjMDA5OWZmIiwiIzAwNjZmZiIsIiMwNjZjY2MiLCIjMzM2NmNjIiwiIzY2OTlmZiIsIiMzMzY2ZmYiLCIjMDAzM2ZmIiwiIzAwMzNjYyIsIiMwMDMzOTkiLCIjY2NjY2ZmIiwiIzk5OTljYyIsIiM2NjY2OTkiLCIjMzMzMzY2IiwiIzAwMDAzMyIsIiM5OTk5ZmYiLCIjNjY2NmNjIiwiIzMzMzNjYyIsIiMzMzMzOTkiLCIjMDAwMDY2IiwiIzY2NjZmZiIsIiMzMzMzZmYiLCIjMDAwMGZmIiwiIzAwMDBjYyIsIiMwMDk5OTkiLCIjOTk2NmZmIiwiIzY2MzNmZiIsIiMzMzAwZmYiLCIjMzMwMGNjIiwiIzMzMDA5OSIsIiNjYzk5ZmYiLCIjOTk2NmNjIiwiIzY2MzNjYyIsIiM2NjMzOTkiLCIjMzMwMDY2IiwiIzk5MzNmZiIsIiM2NjAwZmYiLCIjOTkwMGZmIiwiIzY2MDBjYyIsIiM5OTMzY2MiLCIjY2M2NmZmIiwiI2NjMzNmZiIsIiNjYzAwZmYiLCIjOTkwMGNjIiwiIzY2MDA5OSIsIiNmZmNjZmYiLCIjY2M5OWNjIiwiIzk5NjY5OSIsIiM2NjMzNjYiLCIjMzMwMDMzIiwiI2ZmOTlmZiIsIiNjYzY2Y2MiLCIjY2MzM2NjIiwiIzk5MzM5OSIsIiM2NjAwNjYiLCIjZmY2NmZmIiwiI2ZmMzNmZiIsIiNmZjAwZmYiLCIjY2MwMGNjIiwiIzk5MDA5OSIsIiNmZjY2Y2MiLCIjZmYzM2NjIiwiI2ZmMDBjYyIsIiNjYzAwOTkiLCIjOTkwMDY2IiwiI2ZmOTljYyIsIiNjYzY2OTkiLCIjY2MzMzk5IiwiIzk5MzM2NiIsIiM2NjAwMzMiLCIjZmYzMzk5IiwiI2ZmMDA5OSIsIiNmZjAwNjYiLCIjY2MwMDY2IiwiI2NjMzM2NiIsIiNmZjY2OTkiLCIjZmYzMzY2IiwiI2ZmMDAzMyIsIiNjYzAwMzMiLCIjOTkwMDMzIl19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7YS5mbi5lbEJvcmRlclNlbGVjdD1mdW5jdGlvbihoKXt2YXIgaz10aGlzO3ZhciBxPXRoaXMuZXEoMCk7dmFyIGI9YS5leHRlbmQoe30sYS5mbi5lbEJvcmRlclNlbGVjdC5kZWZhdWx0cyxoKTt2YXIgZj1hKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKHtuYW1lOmIubmFtZSsiW3dpZHRoXSIsc2l6ZTozfSkuY3NzKCJ0ZXh0LWFsaWduIiwicmlnaHQiKS5jaGFuZ2UoZnVuY3Rpb24oKXtrLmNoYW5nZSgpfSk7dmFyIGo9YSgiPGRpdiAvPiIpLmNzcygicG9zaXRpb24iLCJyZWxhdGl2ZSIpLmVsQ29sb3JQaWNrZXIoeyJjbGFzcyI6ImVsLWNvbG9ycGlja2VyIHVpLWljb24gdWktaWNvbi1wZW5jaWwiLG5hbWU6Yi5uYW1lKyJbY29sb3JdIixwYWxldHRlUG9zaXRpb246Im91dGVyIixjaGFuZ2U6ZnVuY3Rpb24oKXtrLmNoYW5nZSgpfX0pO3ZhciBjPWEoIjxkaXYgLz4iKS5lbFNlbGVjdCh7dHBsOic8ZGl2IHN0eWxlPSJib3JkZXItYm90dG9tOjRweCAldmFsICMwMDA7d2lkdGg6MTAwJTttYXJnaW46N3B4IDAiPiA8L2Rpdj4nLHRwbHM6eyIiOiIlbGFiZWwifSxtYXhIZWlnaHQ6Yi5zdHlsZUhlaWdodHx8bnVsbCxzZWxlY3Q6ZnVuY3Rpb24oKXtrLmNoYW5nZSgpfSxzcmM6eyIiOiJub25lIixzb2xpZDoic29saWQiLGRhc2hlZDoiZGFzaGVkIixkb3R0ZWQ6ImRvdHRlZCIsImRvdWJsZSI6ImRvdWJsZSIsZ3Jvb3ZlOiJncm9vdmUiLHJpZGdlOiJyaWRnZSIsaW5zZXQ6Imluc2V0IixvdXRzZXQ6Im91dHNldCJ9fSk7cS5lbXB0eSgpLmFkZENsYXNzKGJbImNsYXNzIl0pLmF0dHIoIm5hbWUiLGIubmFtZXx8IiIpLmFwcGVuZChhKCI8dGFibGUgLz4iKS5hdHRyKCJjZWxsc3BhY2luZyIsMCkuYXBwZW5kKGEoIjx0ciAvPiIpLmFwcGVuZChhKCI8dGQgLz4iKS5hcHBlbmQoZikuYXBwZW5kKCIgcHgiKSkuYXBwZW5kKGEoIjx0ZCAvPiIpLmFwcGVuZChjKSkuYXBwZW5kKGEoIjx0ZCAvPiIpLmFwcGVuZChqKSkpKTtmdW5jdGlvbiBnKHQpe2Z1bmN0aW9uIHIodSl7aGV4RGlnaXRzPVsiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiJdO3JldHVybiAhdT8iMDAiOmhleERpZ2l0c1sodS11JTE2KS8xNl0raGV4RGlnaXRzW3UlMTZdfXZhciBvPSh0fHwiIikubWF0Y2goL1woKFswLTldezEsM30pLFxzKihbMC05XXsxLDN9KSxccyooWzAtOV17MSwzfSlcKS8pO3JldHVybiBvPyIjIityKG9bMV0pK3Iob1syXSkrcihvWzNdKToiIn1mdW5jdGlvbiBwKHIpe2lmKCFyKXtyZXR1cm4gcn12YXIgbz1yLm1hdGNoKC8oWzAtOV0rXC4/WzAtOV0qKVxzKihweHxwdHxlbXwlKS8pO2lmKG8pe3I9b1sxXTt1bml0PW9bMl19aWYoclswXT09Ii4iKXtyPSIwIityfXI9cGFyc2VGbG9hdChyKTtpZihpc05hTihyKSl7cmV0dXJuIiJ9dmFyIHQ9cGFyc2VJbnQoYShkb2N1bWVudC5ib2R5KS5jc3MoImZvbnQtc2l6ZSIpKXx8MTY7c3dpdGNoKHVuaXQpe2Nhc2UiZW0iOnJldHVybiBwYXJzZUludChyKnQpO2Nhc2UicHQiOnJldHVybiBwYXJzZUludChyKnQvMTIpO2Nhc2UiJSI6cmV0dXJuIHBhcnNlSW50KHIqdC8xMDApfXJldHVybiByfXRoaXMuY2hhbmdlPWZ1bmN0aW9uKCl7Yi5jaGFuZ2UmJmIuY2hhbmdlKHRoaXMudmFsKCkpfTt0aGlzLnZhbD1mdW5jdGlvbih1KXtpZighdSYmdSE9PSIiKXt2YXIgdD1wYXJzZUludChmLnZhbCgpKTtyZXR1cm57d2lkdGg6IWlzTmFOKHQpP3QrInB4IjoiIixzdHlsZTpjLnZhbCgpLGNvbG9yOmoudmFsKCl9fWVsc2V7dmFyIHIsdCx4LHosbz0iIjtpZih1Lm5vZGVOYW1lfHx1LmNzcyl7aWYoIXUuY3NzKXt1PWEodSl9dmFyIG89dS5jc3MoImJvcmRlciIpO2lmKChvPXUuY3NzKCJib3JkZXIiKSkpe3Q9eD16PW99ZWxzZXt0PXUuY3NzKCJib3JkZXItd2lkdGgiKTt4PXUuY3NzKCJib3JkZXItc3R5bGUiKTt6PXUuY3NzKCJib3JkZXItY29sb3IiKX19ZWxzZXt0PXUud2lkdGh8fCIiO3g9dS5zdHlsZXx8IiI7ej11LmNvbG9yfHwiIn1mLnZhbChwKHQpKTt2YXIgcj14P3gubWF0Y2goLyhzb2xpZHxkYXNoZWR8ZG90dGVkfGRvdWJsZXxncm9vdmV8cmlkZ2V8aW5zZXR8b3V0c2V0KS9pKToiIjtjLnZhbChyP3JbMV06IiIpO2oudmFsKGcoeikpO3JldHVybiB0aGlzfX07dGhpcy52YWwoYi52YWx1ZSk7cmV0dXJuIHRoaXN9O2EuZm4uZWxCb3JkZXJTZWxlY3QuZGVmYXVsdHM9e25hbWU6ImVsLWJvcmRlcnNlbGVjdCIsImNsYXNzIjoiZWwtYm9yZGVyc2VsZWN0Iix2YWx1ZTp7fSxjaGFuZ2U6bnVsbH19KShqUXVlcnkpOyhmdW5jdGlvbihhKXthLmZuLmVsUGFkZGluZ0lucHV0PWZ1bmN0aW9uKGcpe3ZhciBjPXRoaXM7dmFyIGY9YS5leHRlbmQoe30sYS5mbi5lbFBhZGRpbmdJbnB1dC5kZWZhdWx0cyx7bmFtZTp0aGlzLmF0dHIoIm5hbWUiKX0sZyk7dGhpcy5yZWdleHBzPXttYWluOm5ldyBSZWdFeHAoZi50eXBlPT0icGFkZGluZyI/J3BhZGRpbmdzKjpzKihbXjsiXSspJzonbWFyZ2lucyo6cyooW147Il0rKScsImltIiksbGVmdDpuZXcgUmVnRXhwKGYudHlwZT09InBhZGRpbmciPydwYWRkaW5nLWxlZnRzKjpzKihbXjsiXSspJzonbWFyZ2luLWxlZnRzKjpzKihbXjsiXSspJywiaW0iKSx0b3A6bmV3IFJlZ0V4cChmLnR5cGU9PSJwYWRkaW5nIj8ncGFkZGluZy10b3BzKjpzKihbXjsiXSspJzonbWFyZ2luLXRvcHMqOnMqKFteOyJdKyknLCJpbSIpLHJpZ2h0Om5ldyBSZWdFeHAoZi50eXBlPT0icGFkZGluZyI/J3BhZGRpbmctcmlnaHRzKjpzKihbXjsiXSspJzonbWFyZ2luLXJpZ2h0cyo6cyooW147Il0rKScsImltIiksYm90dG9tOm5ldyBSZWdFeHAoZi50eXBlPT0icGFkZGluZyI/J3BhZGRpbmctYm90dG9tcyo6cyooW147Il0rKSc6J21hcmdpbi1ib3R0b21zKjpzKihbXjsiXSspJywiaW0iKX07YS5lYWNoKFsibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIl0sZnVuY3Rpb24oKXtjW3RoaXNdPWEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoInNpemUiLDMpLmNzcygidGV4dC1hbGlnbiIsInJpZ2h0IikuY3NzKCJib3JkZXItIit0aGlzLCIycHggc29saWQgcmVkIikuYmluZCgiY2hhbmdlIixmdW5jdGlvbigpe2EodGhpcykudmFsKGIoYSh0aGlzKS52YWwoKSkpO2goKX0pLmF0dHIoIm5hbWUiLGYubmFtZSsiWyIrdGhpcysiXSIpfSk7YS5lYWNoKFsidWxlZnQiLCJ1dG9wIiwidXJpZ2h0IiwidWJvdHRvbSJdLGZ1bmN0aW9uKCl7Y1t0aGlzXT1hKCI8c2VsZWN0IC8+IikuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSJweCI+cHg8L29wdGlvbj4nKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9ImVtIj5lbTwvb3B0aW9uPicpLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0icHQiPnB0PC9vcHRpb24+JykuYmluZCgiY2hhbmdlIixmdW5jdGlvbigpe2goKX0pLmF0dHIoIm5hbWUiLGYubmFtZSsiWyIrdGhpcysiXSIpO2lmKGYucGVyY2VudHMpe2NbdGhpc10uYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSIlIj4lPC9vcHRpb24+Jyl9fSk7dGhpcy5lbXB0eSgpLmFkZENsYXNzKGZbImNsYXNzIl0pLmFwcGVuZCh0aGlzLmxlZnQpLmFwcGVuZCh0aGlzLnVsZWZ0KS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLnRvcCkuYXBwZW5kKHRoaXMudXRvcCkuYXBwZW5kKCIgeCAiKS5hcHBlbmQodGhpcy5yaWdodCkuYXBwZW5kKHRoaXMudXJpZ2h0KS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLmJvdHRvbSkuYXBwZW5kKHRoaXMudWJvdHRvbSk7dGhpcy52YWw9ZnVuY3Rpb24oeil7aWYoIXomJnohPT0iIil7dmFyIHE9Yih0aGlzLmxlZnQudmFsKCkpO3ZhciBBPWIodGhpcy50b3AudmFsKCkpO3ZhciBqPWIodGhpcy5yaWdodC52YWwoKSk7dmFyIHg9Yih0aGlzLmJvdHRvbS52YWwoKSk7dmFyIHc9e2xlZnQ6cT09ImF1dG8ifHxxPT0wP3E6KHEhPT0iIj9xK3RoaXMudWxlZnQudmFsKCk6IiIpLHRvcDpBPT0iYXV0byJ8fEE9PTA/QTooQSE9PSIiP0ErdGhpcy51dG9wLnZhbCgpOiIiKSxyaWdodDpqPT0iYXV0byJ8fGo9PTA/ajooaiE9PSIiP2ordGhpcy51cmlnaHQudmFsKCk6IiIpLGJvdHRvbTp4PT0iYXV0byJ8fHg9PTA/eDooeCE9PSIiP3grdGhpcy51Ym90dG9tLnZhbCgpOiIiKSxjc3M6IiJ9O2lmKHcubGVmdCE9PSIiJiZ3LnJpZ2h0IT09IiImJncudG9wIT09IiImJncuYm90dG9tIT09IiIpe2lmKHcubGVmdD09dy5yaWdodCYmdy50b3A9PXcuYm90dG9tKXt3LmNzcz13LnRvcCsiICIrdy5sZWZ0fWVsc2V7dy5jc3M9dy50b3ArIiAiK3cucmlnaHQrIiAiK3cuYm90dG9tKyIgIit3LmxlZnR9fXJldHVybiB3fWVsc2V7aWYoei5ub2RlTmFtZXx8ei5jc3Mpe2lmKCF6LmNzcyl7ej1hKHopfXZhciBvPXtsZWZ0OiIiLHRvcDoiIixyaWdodDoiIixib3R0b206IiJ9O3ZhciBrPSh6LmF0dHIoInN0eWxlIil8fCIiKS50b0xvd2VyQ2FzZSgpO2lmKGspe2s9YS50cmltKGspO3ZhciBwPWsubWF0Y2godGhpcy5yZWdleHBzLm1haW4pO2lmKHApe3ZhciB1PWEudHJpbShwWzFdKS5yZXBsYWNlKC9ccysvZywiICIpLnNwbGl0KCIgIiw0KTtvLnRvcD11WzBdO28ucmlnaHQ9dVsxXSYmdVsxXSE9PSIiP3VbMV06by50b3A7by5ib3R0b209dVsyXSYmdVsyXSE9PSIiP3VbMl06by50b3A7by5sZWZ0PXVbM10mJnVbM10hPT0iIj91WzNdOm8ucmlnaHR9ZWxzZXthLmVhY2goWyJsZWZ0IiwidG9wIiwicmlnaHQiLCJib3R0b20iXSxmdW5jdGlvbigpe3ZhciByPXRoaXMudG9TdHJpbmcoKTtwPWsubWF0Y2goYy5yZWdleHBzW3JdKTtpZihwKXtvW3JdPXBbMV19fSl9fXZhciB6PW99YS5lYWNoKFsibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIl0sZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRvU3RyaW5nKCk7aWYodHlwZW9mKHpbdF0pIT0idW5kZWZpbmVkIiYmelt0XSE9PW51bGwpe3pbdF09elt0XS50b1N0cmluZygpO3ZhciB2PWIoelt0XSk7Y1t0XS52YWwodik7dmFyIHI9elt0XS5tYXRjaCgvKHB4fGVtfHB0fCUpL2kpO2NbInUiK3RdLnZhbChyP3JbMV06InB4Iil9fSk7cmV0dXJuIHRoaXN9fTtmdW5jdGlvbiBiKGope2o9YS50cmltKGoudG9TdHJpbmcoKSk7aWYoalswXT09Ii4iKXtqPSIwIitqfW49cGFyc2VGbG9hdChqKTtyZXR1cm4gIWlzTmFOKG4pP246KGo9PSJhdXRvIj9qOiIiKX1mdW5jdGlvbiBoKCl7Zi5jaGFuZ2UmJmYuY2hhbmdlKGMpfXRoaXMudmFsKGYudmFsdWUpO3JldHVybiB0aGlzfTthLmZuLmVsUGFkZGluZ0lucHV0LmRlZmF1bHRzPXtuYW1lOiJlbC1wYWRkaW5naW5wdXQiLCJjbGFzcyI6ImVsLXBhZGRpbmdpbnB1dCIsdHlwZToicGFkZGluZyIsdmFsdWU6e30scGVyY2VudHM6dHJ1ZSxjaGFuZ2U6bnVsbH19KShqUXVlcnkpOyhmdW5jdGlvbihhKXthLmZuLmVsU2VsZWN0PWZ1bmN0aW9uKGMpe3ZhciBxPXRoaXM7dmFyIHU9dGhpcy5lcSgwKTt2YXIgYj1hLmV4dGVuZCh7fSxhLmZuLmVsU2VsZWN0LmRlZmF1bHRzLGMpO3ZhciBnPWEoJzxpbnB1dCB0eXBlPSJoaWRkZW4iIC8+JykuYXR0cigibmFtZSIsYi5uYW1lKTt2YXIgcD1hKCI8bGFiZWwgLz4iKS5hdHRyKHt1bnNlbGVjdGFibGU6Im9uIn0pLmFkZENsYXNzKCJyb3VuZGVkLWxlZnQtMyIpO3ZhciBoPW51bGw7dmFyIGs9bnVsbDtpZih1LmdldCgwKS5ub2RlTmFtZT09IlNFTEVDVCIpe2Iuc3JjPXt9O3UuY2hpbGRyZW4oIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXtiLnNyY1thKHRoaXMpLnZhbCgpXT1hKHRoaXMpLnRleHQoKX0pO2IudmFsdWU9dS52YWwoKTtiLm5hbWU9dS5hdHRyKCJuYW1lIik7dS5yZXBsYWNlV2l0aCgodT1hKCI8ZGl2IC8+IikpKX1pZighYi52YWx1ZXx8IWIuc3JjW2IudmFsXSl7Yi52YWx1ZT1udWxsO3ZhciBmPTA7Zm9yKHZhciByIGluIGIuc3JjKXtpZihmKys9PTApe2IudmFsdWU9cn19fXRoaXMudmFsPWZ1bmN0aW9uKG8pe2lmKCFvJiZvIT09IiIpe3JldHVybiBnLnZhbCgpfWVsc2V7aWYoYi5zcmNbb10pe2cudmFsKG8pO2oobyk7aWYoaCl7aC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXtpZihhKHRoaXMpLmF0dHIoIm5hbWUiKT09byl7YSh0aGlzKS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXthKHRoaXMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKX19KX19cmV0dXJuIHRoaXN9fTtmdW5jdGlvbiBqKG8pe3ZhciB3PWIubGFiZWxUcGx8fGIudHBsc1tvXXx8Yi50cGw7cC5odG1sKHcucmVwbGFjZSgvJXZhbC9nLG8pLnJlcGxhY2UoLyVsYWJlbC8sYi5zcmNbb10pKS5jaGlsZHJlbigpLmF0dHIoe3Vuc2VsZWN0YWJsZToib24ifSl9dS5lbXB0eSgpLmFkZENsYXNzKGJbImNsYXNzIl0rIiByb3VuZGVkLTMiKS5hdHRyKHt1bnNlbGVjdGFibGU6Im9uIn0pLmFwcGVuZChnKS5hcHBlbmQocCkuaG92ZXIoZnVuY3Rpb24oKXthKHRoaXMpLmFkZENsYXNzKCJob3ZlciIpfSxmdW5jdGlvbigpe2EodGhpcykucmVtb3ZlQ2xhc3MoImhvdmVyIil9KS5jbGljayhmdW5jdGlvbihvKXshaCYmdCgpO2guc2xpZGVUb2dnbGUoKTtpZihhLmJyb3dzZXIubXNpZSYmIWspe2guY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7az1NYXRoLm1heChrLGEodGhpcykud2lkdGgoKSl9KTtpZihrPmgud2lkdGgoKSl7aC53aWR0aChrKzQwKX19fSk7dGhpcy52YWwoYi52YWx1ZSk7ZnVuY3Rpb24gdCgpe2g9YSgiPGRpdiAvPiIpLmFkZENsYXNzKGIubGlzdENsYXNzKyIgcm91bmRlZC0zIikuaGlkZSgpLmFwcGVuZFRvKHUubW91c2VsZWF2ZShmdW5jdGlvbih2KXtoLnNsaWRlVXAoKX0pKTtmb3IodmFyIHggaW4gYi5zcmMpe3ZhciB6PWIudHBsc1t4XXx8Yi50cGw7YSgiPGRpdiAvPiIpLmF0dHIoIm5hbWUiLHgpLmFwcGVuZChhKHoucmVwbGFjZSgvJXZhbC9nLHgpLnJlcGxhY2UoLyVsYWJlbC9nLGIuc3JjW3hdKSkuYXR0cih7dW5zZWxlY3RhYmxlOiJvbiJ9KSkuYXBwZW5kVG8oaCkuaG92ZXIoZnVuY3Rpb24oKXthKHRoaXMpLmFkZENsYXNzKCJob3ZlciIpfSxmdW5jdGlvbigpe2EodGhpcykucmVtb3ZlQ2xhc3MoImhvdmVyIil9KS5jbGljayhmdW5jdGlvbihCKXtCLnN0b3BQcm9wYWdhdGlvbigpO0IucHJldmVudERlZmF1bHQoKTt2YXIgdz1hKHRoaXMpLmF0dHIoIm5hbWUiKTtxLnZhbCh3KTtiLnNlbGVjdCh3KTtoLnNsaWRlVXAoKX0pfXZhciBvPXUub3V0ZXJXaWR0aCgpO2lmKGgud2lkdGgoKTxvKXtoLndpZHRoKG8pfXZhciBBPWguaGVpZ2h0KCk7aWYoYi5tYXhIZWlnaHQ+MCYmQT5iLm1heEhlaWdodCl7aC5oZWlnaHQoYi5tYXhIZWlnaHQpfXEudmFsKGcudmFsKCkpfXJldHVybiB0aGlzfTthLmZuLmVsU2VsZWN0LmRlZmF1bHRzPXtuYW1lOiJlbC1zZWxlY3QiLCJjbGFzcyI6ImVsLXNlbGVjdCIsbGlzdENsYXNzOiJsaXN0IixsYWJlbFRwbDpudWxsLHRwbDoiPCV2YWw+JWxhYmVsPC8ldmFsPiIsdHBsczp7fSx2YWx1ZTpudWxsLHNyYzp7fSxzZWxlY3Q6ZnVuY3Rpb24oYil7d2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmxvZyYmd2luZG93LmNvbnNvbGUubG9nKCJzZWxlY3RlZDogIitiKX0sbWF4SGVpZ2h0OjQxMH19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURT1mdW5jdGlvbihvLGope2lmKCFvfHwhby5ub2RlTmFtZSl7cmV0dXJuIGFsZXJ0KCdlbFJURTogYXJndW1lbnQgInRhcmdldCIgaXMgbm90IERPTSBFbGVtZW50Jyl9dmFyIGM9dGhpcyxmO3RoaXMudmVyc2lvbj0iMS4xIjt0aGlzLmJ1aWxkPSIyMDEwLTA5LTIwIjt0aGlzLm9wdGlvbnM9YS5leHRlbmQodHJ1ZSx7fSx0aGlzLm9wdGlvbnMsaik7dGhpcy5icm93c2VyPWEuYnJvd3Nlcjt0aGlzLnRhcmdldD1hKG8pO3RoaXMubGFuZz0oIiIrdGhpcy5vcHRpb25zLmxhbmcpLnRvTG93ZXJDYXNlKCk7dGhpcy5faTE4bj1uZXcgZWxpMThuKHt0ZXh0ZG9tYWluOiJydGUiLG1lc3NhZ2VzOntydGU6dGhpcy5pMThNZXNzYWdlc1t0aGlzLmxhbmddfHx7fX19KTt0aGlzLnJ0bD0hISgvXihhcnxmYXxoZSkkLy50ZXN0KHRoaXMubGFuZykmJnRoaXMuaTE4TWVzc2FnZXNbdGhpcy5sYW5nXSk7aWYodGhpcy5ydGwpe3RoaXMub3B0aW9ucy5jc3NDbGFzcys9IiBlbC1ydGUtcnRsIn10aGlzLnRvb2xiYXI9YSgnPGRpdiBjbGFzcz0idG9vbGJhciIvPicpO3RoaXMuaWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMud29ya3pvbmU9YSgnPGRpdiBjbGFzcz0id29ya3pvbmUiLz4nKS5hcHBlbmQodGhpcy5pZnJhbWUpLmFwcGVuZCh0aGlzLnNvdXJjZSk7dGhpcy5zdGF0dXNiYXI9YSgnPGRpdiBjbGFzcz0ic3RhdHVzYmFyIi8+Jyk7dGhpcy50YWJzYmFyPWEoJzxkaXYgY2xhc3M9InRhYnNiYXIiLz4nKTt0aGlzLmVkaXRvcj1hKCc8ZGl2IGNsYXNzPSInK3RoaXMub3B0aW9ucy5jc3NDbGFzcysnIiAvPicpLmFwcGVuZCh0aGlzLnRvb2xiYXIpLmFwcGVuZCh0aGlzLndvcmt6b25lKS5hcHBlbmQodGhpcy5zdGF0dXNiYXIpLmFwcGVuZCh0aGlzLnRhYnNiYXIpO3RoaXMuZG9jPW51bGw7dGhpcy4kZG9jPW51bGw7dGhpcy53aW5kb3c9bnVsbDt0aGlzLnV0aWxzPW5ldyB0aGlzLnV0aWxzKHRoaXMpO3RoaXMuZG9tPW5ldyB0aGlzLmRvbSh0aGlzKTt0aGlzLmZpbHRlcj1uZXcgdGhpcy5maWx0ZXIodGhpcyk7dGhpcy51cGRhdGVIZWlnaHQ9ZnVuY3Rpb24oKXtjLndvcmt6b25lLmFkZChjLmlmcmFtZSkuYWRkKGMuc291cmNlKS5oZWlnaHQoYy53b3Jrem9uZS5oZWlnaHQoKSl9O3RoaXMucmVzaXphYmxlPWZ1bmN0aW9uKHEpe3ZhciBwPXRoaXM7aWYodGhpcy5vcHRpb25zLnJlc2l6YWJsZSYmYS5mbi5yZXNpemFibGUpe2lmKHEpe3RoaXMuZWRpdG9yLnJlc2l6YWJsZSh7aGFuZGxlczoic2UiLGFsc29SZXNpemU6dGhpcy53b3Jrem9uZSxtaW5XaWR0aDozMDAsbWluSGVpZ2h0OjIwMH0pLmJpbmQoInJlc2l6ZSIscC51cGRhdGVIZWlnaHQpfWVsc2V7dGhpcy5lZGl0b3IucmVzaXphYmxlKCJkZXN0cm95IikudW5iaW5kKCJyZXNpemUiLHAudXBkYXRlSGVpZ2h0KX19fTt0aGlzLmVkaXRvci5pbnNlcnRBZnRlcihvKTt2YXIgaD0iIjtpZihvLm5vZGVOYW1lPT0iVEVYVEFSRUEiKXt0aGlzLnNvdXJjZT10aGlzLnRhcmdldDt0aGlzLnNvdXJjZS5pbnNlcnRBZnRlcih0aGlzLmlmcmFtZSkuaGlkZSgpO2g9dGhpcy50YXJnZXQudmFsKCl9ZWxzZXt0aGlzLnNvdXJjZT1hKCI8dGV4dGFyZWEgLz4iKS5pbnNlcnRBZnRlcih0aGlzLmlmcmFtZSkuaGlkZSgpO2g9dGhpcy50YXJnZXQuaGlkZSgpLmh0bWwoKX10aGlzLnNvdXJjZS5hdHRyKCJuYW1lIix0aGlzLnRhcmdldC5hdHRyKCJuYW1lIil8fHRoaXMudGFyZ2V0LmF0dHIoImlkIikpO2g9YS50cmltKGgpO2lmKCFoKXtoPSIgIn1pZih0aGlzLm9wdGlvbnMuYWxsb3dTb3VyY2Upe3RoaXMudGFic2Jhci5hcHBlbmQoJzxkaXYgY2xhc3M9InRhYiBlZGl0b3Igcm91bmRlZC1ib3R0b20tNyBhY3RpdmUiPicrYy5pMThuKCJFZGl0b3IiKSsnPC9kaXY+PGRpdiBjbGFzcz0idGFiIHNvdXJjZSByb3VuZGVkLWJvdHRvbS03Ij4nK2MuaTE4bigiU291cmNlIikrJzwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyZml4IiBzdHlsZT0iY2xlYXI6Ym90aCIvPicpLmNoaWxkcmVuKCIudGFiIikuY2xpY2soZnVuY3Rpb24ocCl7aWYoIWEodGhpcykuaGFzQ2xhc3MoImFjdGl2ZSIpKXtjLnRhYnNiYXIuY2hpbGRyZW4oIi50YWIiKS50b2dnbGVDbGFzcygiYWN0aXZlIik7Yy53b3Jrem9uZS5jaGlsZHJlbigpLnRvZ2dsZSgpO2lmKGEodGhpcykuaGFzQ2xhc3MoImVkaXRvciIpKXtjLnVwZGF0ZUVkaXRvcigpO2Mud2luZG93LmZvY3VzKCk7Yy51aS51cGRhdGUodHJ1ZSl9ZWxzZXtjLnVwZGF0ZVNvdXJjZSgpO2Muc291cmNlLmZvY3VzKCk7aWYoYS5icm93c2VyLm1zaWUpe31lbHNle2Muc291cmNlWzBdLnNldFNlbGVjdGlvblJhbmdlKDAsMCl9Yy51aS5kaXNhYmxlKCk7Yy5zdGF0dXNiYXIuZW1wdHkoKX19fSl9dGhpcy53aW5kb3c9dGhpcy5pZnJhbWUuY29udGVudFdpbmRvdzt0aGlzLmRvYz10aGlzLmlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O3RoaXMuJGRvYz1hKHRoaXMuZG9jKTtmPSc8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+JzthLmVhY2goYy5vcHRpb25zLmNzc2ZpbGVzLGZ1bmN0aW9uKCl7Zis9JzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicrdGhpcysnIiAvPid9KTt0aGlzLmRvYy5vcGVuKCk7dmFyIGc9dGhpcy5maWx0ZXIud3lzaXd5ZyhoKSxiPXRoaXMucnRsPycgY2xhc3M9ImVsLXJ0ZS1ydGwiJzoiIjt0aGlzLmRvYy53cml0ZShjLm9wdGlvbnMuZG9jdHlwZStmKyI8L2hlYWQ+PGJvZHkiK2IrIj4iKyhnKSsiPC9ib2R5PjwvaHRtbD4iKTt0aGlzLmRvYy5jbG9zZSgpO2lmKGEuYnJvd3Nlci5tc2llKXt0aGlzLmRvYy5ib2R5LmNvbnRlbnRFZGl0YWJsZT10cnVlfWVsc2V7dHJ5e3RoaXMuZG9jLmRlc2lnbk1vZGU9Im9uIn1jYXRjaChrKXt9dGhpcy5kb2MuZXhlY0NvbW1hbmQoInN0eWxlV2l0aENTUyIsZmFsc2UsdGhpcy5vcHRpb25zLnN0eWxlV2l0aENTUyl9aWYodGhpcy5vcHRpb25zLmhlaWdodD4wKXt0aGlzLndvcmt6b25lLmhlaWdodCh0aGlzLm9wdGlvbnMuaGVpZ2h0KX10aGlzLnVwZGF0ZUhlaWdodCgpO3RoaXMucmVzaXphYmxlKHRydWUpO3RoaXMud2luZG93LmZvY3VzKCk7dGhpcy5oaXN0b3J5PW5ldyB0aGlzLmhpc3RvcnkodGhpcyk7dGhpcy5zZWxlY3Rpb249bmV3IHRoaXMuc2VsZWN0aW9uKHRoaXMpO3RoaXMudWk9bmV3IHRoaXMudWkodGhpcyk7dGhpcy50YXJnZXQucGFyZW50cygiZm9ybSIpLmJpbmQoInN1Ym1pdCIsZnVuY3Rpb24ocCl7Yy5zb3VyY2UucGFyZW50cygiZm9ybSIpLmZpbmQoJ1tuYW1lPSJlbC1zZWxlY3QiXScpLnJlbW92ZSgpO2MuYmVmb3JlU2F2ZSgpfSk7dGhpcy5zb3VyY2UuYmluZCgia2V5ZG93biIsZnVuY3Rpb24odCl7aWYodC5rZXlDb2RlPT05KXt0LnByZXZlbnREZWZhdWx0KCk7aWYoYS5icm93c2VyLm1zaWUpe3ZhciBwPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO3AudGV4dD0iXHQiK3AudGV4dDt0aGlzLmZvY3VzKCl9ZWxzZXt2YXIgcT10aGlzLnZhbHVlLnN1YnN0cigwLHRoaXMuc2VsZWN0aW9uU3RhcnQpLHU9dGhpcy52YWx1ZS5zdWJzdHIodGhpcy5zZWxlY3Rpb25FbmQpO3RoaXMudmFsdWU9cSsiXHQiK3U7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZShxLmxlbmd0aCsxLHEubGVuZ3RoKzEpfX19KTt0aGlzLiRkb2MuYmluZCgibW91c2V1cCIsZnVuY3Rpb24oKXtjLnVpLnVwZGF0ZSgpfSkuYmluZCgiZHJhZ3N0YXJ0IixmdW5jdGlvbihwKXtwLnByZXZlbnREZWZhdWx0KCk7cC5zdG9wUHJvcGFnYXRpb24oKX0pLmJpbmQoImtleXVwIixmdW5jdGlvbihwKXtpZigocC5rZXlDb2RlPj04JiZwLmtleUNvZGU8PTEzKXx8KHAua2V5Q29kZT49MzImJnAua2V5Q29kZTw9NDApfHxwLmtleUNvZGU9PTQ2fHwocC5rZXlDb2RlPj05NiYmcC5rZXlDb2RlPD0xMTEpKXtjLnVpLnVwZGF0ZSgpfX0pLmJpbmQoImtleWRvd24iLGZ1bmN0aW9uKHApe2lmKChwLm1ldGFLZXl8fHAuY3RybEtleSkmJnAua2V5Q29kZT09NjUpe2MudWkudXBkYXRlKCl9ZWxzZXtpZihwLmtleUNvZGU9PTEzKXt2YXIgcT1jLnNlbGVjdGlvbi5nZXROb2RlKCk7aWYoYy5kb20uc2VsZk9yUGFyZW50KHEsL15QUkUkLykpe2Muc2VsZWN0aW9uLmluc2VydE5vZGUoYy5kb2MuY3JlYXRlVGV4dE5vZGUoIlxyXG4iKSk7cmV0dXJuIGZhbHNlfWVsc2V7aWYoYS5icm93c2VyLnNhZmFyaSYmcC5zaGlmdEtleSl7Yy5zZWxlY3Rpb24uaW5zZXJ0Tm9kZShjLmRvYy5jcmVhdGVFbGVtZW50KCJiciIpKTtyZXR1cm4gZmFsc2V9fX19fSk7dGhpcy50eXBpbmc9ZmFsc2U7dGhpcy5sYXN0S2V5PW51bGw7dGhpcy4kZG9jLmJpbmQoImtleWRvd24iLGZ1bmN0aW9uKHApe2lmKChwLmtleUNvZGU+PTQ4JiZwLmtleUNvZGU8PTU3KXx8cC5rZXlDb2RlPT02MXx8cC5rZXlDb2RlPT0xMDl8fChwLmtleUNvZGU+PTY1JiZwLmtleUNvZGU8PTkwKXx8cC5rZXlDb2RlPT0xODh8fHAua2V5Q29kZT09MTkwfHxwLmtleUNvZGU9PTE5MXx8KHAua2V5Q29kZT49MjE5JiZwLmtleUNvZGU8PTIyMikpe2lmKCFjLnR5cGluZyl7Yy5oaXN0b3J5LmFkZCh0cnVlKX1jLnR5cGluZz10cnVlO2MubGFzdEtleT1udWxsfWVsc2V7aWYocC5rZXlDb2RlPT04fHxwLmtleUNvZGU9PTQ2fHxwLmtleUNvZGU9PTMyfHxwLmtleUNvZGU9PTEzKXtpZihwLmtleUNvZGUhPWMubGFzdEtleSl7Yy5oaXN0b3J5LmFkZCh0cnVlKX1jLmxhc3RLZXk9cC5rZXlDb2RlO2MudHlwaW5nPWZhbHNlfX19KS5iaW5kKCJtb3VzZXVwIixmdW5jdGlvbigpe2MudHlwaW5nPWZhbHNlO2MubGFzdEtleT1udWxsfSkuYmluZCgicGFzdGUiLGZ1bmN0aW9uKHEpe2lmKCFjLm9wdGlvbnMuYWxsb3dQYXN0ZSl7cS5zdG9wUHJvcGFnYXRpb24oKTtxLnByZXZlbnREZWZhdWx0KCl9ZWxzZXt2YXIgdD1hKGMuZG9tLmNyZWF0ZSgiZGl2IikpWzBdLHA9Yy5kb2MuY3JlYXRlVGV4dE5vZGUoIl8iKTtjLmhpc3RvcnkuYWRkKHRydWUpO2MudHlwaW5nPXRydWU7Yy5sYXN0S2V5PW51bGw7dC5hcHBlbmRDaGlsZChwKTtjLnNlbGVjdGlvbi5kZWxldGVDb250ZW50cygpLmluc2VydE5vZGUodCk7Yy5zZWxlY3Rpb24uc2VsZWN0KHApO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtpZih0LnBhcmVudE5vZGUpe2EodCkuaHRtbChjLmZpbHRlci5wcm9jY2VzcygicGFzdGUiLGEodCkuaHRtbCgpKSk7cD10Lmxhc3RDaGlsZDtjLmRvbS51bndyYXAodCk7aWYocCl7Yy5zZWxlY3Rpb24uc2VsZWN0KHApO2Muc2VsZWN0aW9uLmNvbGxhcHNlKGZhbHNlKX19ZWxzZXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KTtjLnZhbChjLmZpbHRlci5wcm9jY2VzcygicGFzdGUiLGMuZmlsdGVyLnd5c2l3eWcyd3lzaXd5ZyhhKGMuZG9jLmJvZHkpLmh0bWwoKSkpKTtjLnNlbGVjdGlvbi5zZWxlY3QoYy5kb2MuYm9keS5maXJzdENoaWxkKTtjLnNlbGVjdGlvbi5jb2xsYXBzZSh0cnVlKX1hKGMuZG9jLmJvZHkpLm1vdXNldXAoKX0sMTUpfX0pO2lmKGEuYnJvd3Nlci5tc2llKXt0aGlzLiRkb2MuYmluZCgia2V5dXAiLGZ1bmN0aW9uKHApe2lmKHAua2V5Q29kZT09ODYmJihwLm1ldGFLZXl8fHAuY3RybEtleSkpe2MuaGlzdG9yeS5hZGQodHJ1ZSk7Yy50eXBpbmc9dHJ1ZTtjLmxhc3RLZXk9bnVsbDtjLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpO2MudmFsKGMuZmlsdGVyLnByb2NjZXNzKCJwYXN0ZSIsYy5maWx0ZXIud3lzaXd5ZzJ3eXNpd3lnKGEoYy5kb2MuYm9keSkuaHRtbCgpKSkpO2Muc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7YShjLmRvYy5ib2R5KS5tb3VzZXVwKCk7dGhpcy51aS51cGRhdGUoKX19KX1pZihhLmJyb3dzZXIuc2FmYXJpKXt0aGlzLiRkb2MuYmluZCgiY2xpY2siLGZ1bmN0aW9uKHApe2EoYy5kb2MuYm9keSkuZmluZCgiLmVscnRlLXdlYmtpdC1obCIpLnJlbW92ZUNsYXNzKCJlbHJ0ZS13ZWJraXQtaGwiKTtpZihwLnRhcmdldC5ub2RlTmFtZT09IklNRyIpe2EocC50YXJnZXQpLmFkZENsYXNzKCJlbHJ0ZS13ZWJraXQtaGwiKX19KS5iaW5kKCJrZXl1cCIsZnVuY3Rpb24ocCl7YShjLmRvYy5ib2R5KS5maW5kKCIuZWxydGUtd2Via2l0LWhsIikucmVtb3ZlQ2xhc3MoImVscnRlLXdlYmtpdC1obCIpfSl9dGhpcy53aW5kb3cuZm9jdXMoKX07ZWxSVEUucHJvdG90eXBlLmkxOG49ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2kxOG4udHJhbnNsYXRlKGIpfTtlbFJURS5wcm90b3R5cGUub3Blbj1mdW5jdGlvbigpe3RoaXMuZWRpdG9yLnNob3coKX07ZWxSVEUucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5lZGl0b3IuaGlkZSgpfTtlbFJURS5wcm90b3R5cGUudXBkYXRlRWRpdG9yPWZ1bmN0aW9uKCl7dGhpcy52YWwodGhpcy5zb3VyY2UudmFsKCkpfTtlbFJURS5wcm90b3R5cGUudXBkYXRlU291cmNlPWZ1bmN0aW9uKCl7dGhpcy5zb3VyY2UudmFsKHRoaXMuZmlsdGVyLnNvdXJjZShhKHRoaXMuZG9jLmJvZHkpLmh0bWwoKSkpfTtlbFJURS5wcm90b3R5cGUudmFsPWZ1bmN0aW9uKGIpe2lmKHR5cGVvZihiKT09InN0cmluZyIpe2I9IiIrYjtpZih0aGlzLnNvdXJjZS5pcygiOnZpc2libGUiKSl7dGhpcy5zb3VyY2UudmFsKHRoaXMuZmlsdGVyLnNvdXJjZTJzb3VyY2UoYikpfWVsc2V7aWYoYS5icm93c2VyLm1zaWUpe3RoaXMuZG9jLmJvZHkuaW5uZXJIVE1MPSI8YnIgLz4iK3RoaXMuZmlsdGVyLnd5c2l3eWcoYik7dGhpcy5kb2MuYm9keS5yZW1vdmVDaGlsZCh0aGlzLmRvYy5ib2R5LmZpcnN0Q2hpbGQpfWVsc2V7dGhpcy5kb2MuYm9keS5pbm5lckhUTUw9dGhpcy5maWx0ZXIud3lzaXd5ZyhiKX19fWVsc2V7aWYodGhpcy5zb3VyY2UuaXMoIjp2aXNpYmxlIikpe3JldHVybiB0aGlzLmZpbHRlci5zb3VyY2Uyc291cmNlKHRoaXMuc291cmNlLnZhbCgpKX1lbHNle3JldHVybiB0aGlzLmZpbHRlci5zb3VyY2UoYSh0aGlzLmRvYy5ib2R5KS5odG1sKCkpfX19O2VsUlRFLnByb3RvdHlwZS5iZWZvcmVTYXZlPWZ1bmN0aW9uKCl7dGhpcy5zb3VyY2UudmFsKHRoaXMudmFsKCl8fCIiKX07ZWxSVEUucHJvdG90eXBlLnNhdmU9ZnVuY3Rpb24oKXt0aGlzLmJlZm9yZVNhdmUoKTt0aGlzLmVkaXRvci5wYXJlbnRzKCJmb3JtIikuc3VibWl0KCl9O2VsUlRFLnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oYil7aWYod2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmxvZyl7d2luZG93LmNvbnNvbGUubG9nKGIpfX07ZWxSVEUucHJvdG90eXBlLmkxOE1lc3NhZ2VzPXt9O2EuZm4uZWxydGU9ZnVuY3Rpb24oZyxiKXt2YXIgZj10eXBlb2YoZyk9PSJzdHJpbmciP2c6IiIsYzt0aGlzLmVhY2goZnVuY3Rpb24oKXtpZighdGhpcy5lbHJ0ZSl7dGhpcy5lbHJ0ZT1uZXcgZWxSVEUodGhpcyx0eXBlb2YoZyk9PSJvYmplY3QiP2c6e30pfXN3aXRjaChmKXtjYXNlIm9wZW4iOmNhc2Uic2hvdyI6dGhpcy5lbHJ0ZS5vcGVuKCk7YnJlYWs7Y2FzZSJjbG9zZSI6Y2FzZSJoaWRlIjp0aGlzLmVscnRlLmNsb3NlKCk7YnJlYWs7Y2FzZSJ1cGRhdGVTb3VyY2UiOnRoaXMuZWxydGUudXBkYXRlU291cmNlKCk7YnJlYWt9fSk7aWYoZj09InZhbCIpe2lmKCF0aGlzLmxlbmd0aCl7cmV0dXJuIiJ9ZWxzZXtpZih0aGlzLmxlbmd0aD09MSl7cmV0dXJuIGI/dGhpc1swXS5lbHJ0ZS52YWwoYik6dGhpc1swXS5lbHJ0ZS52YWwoKX1lbHNle2M9e307dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y1t0aGlzLmVscnRlLnNvdXJjZS5hdHRyKCJuYW1lIildPXRoaXMuZWxydGUudmFsKCl9KTtyZXR1cm4gY319fXJldHVybiB0aGlzfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS5kb209ZnVuY3Rpb24oYyl7dGhpcy5ydGU9Yzt2YXIgYj10aGlzO3RoaXMucmVnRXhwPXt0ZXh0Tm9kZXM6L14oQXxBQkJSfEFDUk9OWU18QUREUkVTU3xCfEJET3xCSUd8QkxPQ0tRVU9URXxDQVBUSU9OfENFTlRFUnxDSVRFfENPREV8RER8REVMfERGTnxESVZ8RFR8RU18RklFTERTRVR8Rk9OVHxIWzEtNl18SXxJTlN8S0JEfExBQkVMfExFR0VORHxMSXxNQVJRVUVFfE5PQlJ8Tk9FTUJFRHxQfFBSRXxRfFNBTVB8U01BTEx8U1BBTnxTVFJJS0V8U1RST05HfFNVQnxTVVB8VER8VEh8VFR8VkFSKSQvLHRleHRDb250YWluc05vZGVzOi9eKEF8QUJCUnxBQ1JPTllNfEFERFJFU1N8QnxCRE98QklHfEJMT0NLUVVPVEV8Q0FQVElPTnxDRU5URVJ8Q0lURXxDT0RFfEREfERFTHxERk58RElWfERMfERUfEVNfEZJRUxEU0VUfEZPTlR8SFsxLTZdfEl8SU5TfEtCRHxMQUJFTHxMRUdFTkR8TEl8TUFSUVVFRXxOT0JSfE5PRU1CRUR8T0x8UHxQUkV8UXxTQU1QfFNNQUxMfFNQQU58U1RSSUtFfFNUUk9OR3xTVUJ8U1VQfFRBQkxFfFRIRUFEfFRCT0RZfFRGT09UfFREfFRIfFRSfFRUfFVMfFZBUikkLyxibG9jazovXihBUFBMRVR8QkxPQ0tRVU9URXxCUnxDQVBUSU9OfENFTlRFUnxDT0x8Q09MR1JPVVB8RER8RElWfERMfERUfEhbMS02XXxFTUJFRHxGSUVMRFNFVHxMSXxNQVJRVUVFfE5PQlJ8T0JKRUNUfE9MfFB8UFJFfFRBQkxFfFRIRUFEfFRCT0RZfFRGT09UfFREfFRIfFRSfFVMKSQvLHNlbGVjdGlvbkJsb2NrOi9eKEFQUExFVHxCTE9DS1FVT1RFfEJSfENBUFRJT058Q0VOVEVSfENPTHxDT0xHUk9VUHxERHxESVZ8REx8RFR8SFsxLTZdfEVNQkVEfEZJRUxEU0VUfExJfE1BUlFVRUV8Tk9CUnxPQkpFQ1R8T0x8UHxQUkV8VER8VEh8VFJ8VUwpJC8saGVhZGVyOi9eSFsxLTZdJC8sZm9ybUVsZW1lbnQ6L14oRk9STXxJTlBVVHxISURERU58VEVYVEFSRUF8U0VMRUNUfEJVVFRPTikkL307dGhpcy5yb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnRlLmJvZHl9O3RoaXMuY3JlYXRlPWZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLnJ0ZS5kb2MuY3JlYXRlRWxlbWVudChmKX07dGhpcy5jcmVhdGVCb29rbWFyaz1mdW5jdGlvbigpe3ZhciBmPXRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCJzcGFuIik7Zi5pZD0iZWxydGUtYm0tIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyKDIpO2EoZikuYWRkQ2xhc3MoImVscnRlYm0iKTtyZXR1cm4gZn07dGhpcy5pbmRleE9mPWZ1bmN0aW9uKGcpe3ZhciBmPTA7Zz1hKGcpO3doaWxlKChnPWcucHJldigpKSYmZy5sZW5ndGgpe2YrK31yZXR1cm4gZn07dGhpcy5hdHRyPWZ1bmN0aW9uKGgsZil7dmFyIGc9IiI7aWYoaC5ub2RlVHlwZT09MSl7Zz1hKGgpLmF0dHIoZik7aWYoZyYmZiE9InNyYyImJmYhPSJocmVmIil7Zz1nLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKX19cmV0dXJuIGd8fCIifTt0aGlzLmZpbmRDb21tb25BbmNlc3Rvcj1mdW5jdGlvbihqLGgpe2lmKCFqfHwhaCl7cmV0dXJuIHRoaXMucnRlLmxvZygiZG9tLmZpbmRDb21tb25BbmNlc3RvciBpbnZhbGlkIGFyZ3VtZW50cyIpfWlmKGo9PWgpe3JldHVybiBqfWVsc2V7aWYoai5ub2RlTmFtZT09IkJPRFkifHxoLm5vZGVOYW1lPT0iQk9EWSIpe3JldHVybiB0aGlzLnJ0ZS5kb2MuYm9keX19dmFyIG89YShqKS5wYXJlbnRzKCksaz1hKGgpLnBhcmVudHMoKSxmPWsubGVuZ3RoLTEscD1rW2ZdO2Zvcih2YXIgZz1vLmxlbmd0aC0xO2c+PTA7Zy0tLGYtLSl7aWYob1tnXT09a1tmXSl7cD1vW2ddfWVsc2V7YnJlYWt9fXJldHVybiBwfTt0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oZil7aWYoZi5ub2RlVHlwZT09MSl7cmV0dXJuIHRoaXMucmVnRXhwLnRleHROb2Rlcy50ZXN0KGYubm9kZU5hbWUpP2EudHJpbShhKGYpLnRleHQoKSkubGVuZ3RoPT0wOmZhbHNlfWVsc2V7aWYoZi5ub2RlVHlwZT09Myl7cmV0dXJuL14oVEFCTEV8VEhFQUR8VEZPT1R8VEJPRFl8VFJ8VUx8T0x8REwpJC8udGVzdChmLnBhcmVudE5vZGUubm9kZU5hbWUpfHxmLm5vZGVWYWx1ZT09IiJ8fChhLnRyaW0oZi5ub2RlVmFsdWUpLmxlbmd0aD09MCYmIShmLm5leHRTaWJsaW5nJiZmLnByZXZpb3VzU2libGluZyYmZi5uZXh0U2libGluZy5ub2RlVHlwZT09MSYmZi5wcmV2aW91c1NpYmxpbmcubm9kZVR5cGU9PTEmJiF0aGlzLnJlZ0V4cC5ibG9jay50ZXN0KGYubmV4dFNpYmxpbmcubm9kZU5hbWUpJiYhdGhpcy5yZWdFeHAuYmxvY2sudGVzdChmLnByZXZpb3VzU2libGluZy5ub2RlTmFtZSkpKX19cmV0dXJuIHRydWV9O3RoaXMubmV4dD1mdW5jdGlvbihmKXt3aGlsZShmLm5leHRTaWJsaW5nJiYoZj1mLm5leHRTaWJsaW5nKSl7aWYoZi5ub2RlVHlwZT09MXx8KGYubm9kZVR5cGU9PTMmJiF0aGlzLmlzRW1wdHkoZikpKXtyZXR1cm4gZn19cmV0dXJuIG51bGx9O3RoaXMucHJldj1mdW5jdGlvbihmKXt3aGlsZShmLnByZXZpb3VzU2libGluZyYmKGY9Zi5wcmV2aW91c1NpYmxpbmcpKXtpZihmLm5vZGVUeXBlPT0xfHwoZi5ub2RlVHlwZT09MyYmIXRoaXMuaXNFbXB0eShmKSkpe3JldHVybiBmfX1yZXR1cm4gbnVsbH07dGhpcy5pc1ByZXY9ZnVuY3Rpb24oZyxmKXt3aGlsZSgoZz10aGlzLnByZXYoZykpKXtpZihnPT1mKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfTt0aGlzLm5leHRBbGw9ZnVuY3Rpb24oZyl7dmFyIGY9W107d2hpbGUoKGc9dGhpcy5uZXh0KGcpKSl7Zi5wdXNoKGcpfXJldHVybiBmfTt0aGlzLnByZXZBbGw9ZnVuY3Rpb24oZyl7dmFyIGY9W107d2hpbGUoKGc9dGhpcy5wcmV2KGcpKSl7Zi5wdXNoKGcpfXJldHVybiBmfTt0aGlzLnRvTGluZUVuZD1mdW5jdGlvbihnKXt2YXIgZj1bXTt3aGlsZSgoZz10aGlzLm5leHQoZykpJiZnLm5vZGVOYW1lIT0iQlIiJiZnLm5vZGVOYW1lIT0iSFIiJiZ0aGlzLmlzSW5saW5lKGcpKXtmLnB1c2goZyl9cmV0dXJuIGZ9O3RoaXMudG9MaW5lU3RhcnQ9ZnVuY3Rpb24oZyl7dmFyIGY9W107d2hpbGUoKGc9dGhpcy5wcmV2KGcpKSYmZy5ub2RlTmFtZSE9IkJSIiYmZy5ub2RlTmFtZSE9IkhSIiYmdGhpcy5pc0lubGluZShnKSl7Zi51bnNoaWZ0KGcpfXJldHVybiBmfTt0aGlzLmlzRmlyc3ROb3RFbXB0eT1mdW5jdGlvbihmKXt3aGlsZSgoZj10aGlzLnByZXYoZikpKXtpZihmLm5vZGVUeXBlPT0xfHwoZi5ub2RlVHlwZT09MyYmYS50cmltKGYubm9kZVZhbHVlKSE9IiIpKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfTt0aGlzLmlzTGFzdE5vdEVtcHR5PWZ1bmN0aW9uKGYpe3doaWxlKChmPXRoaXMubmV4dChmKSkpe2lmKCF0aGlzLmlzRW1wdHkoZikpe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9O3RoaXMuaXNPbmx5Tm90RW1wdHk9ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuaXNGaXJzdE5vdEVtcHR5KGYpJiZ0aGlzLmlzTGFzdE5vdEVtcHR5KGYpfTt0aGlzLmZpbmRMYXN0Tm90RW1wdHk9ZnVuY3Rpb24oZil7dGhpcy5ydGUubG9nKCJmaW5kTGFzdE5vdEVtcHR5IFdobyBpcyBoZXJlIDBfbyIpO2lmKGYubm9kZVR5cGU9PTEmJihsPWYubGFzdENoaWxkKSl7aWYoIXRoaXMuaXNFbXB0eShsKSl7cmV0dXJuIGx9d2hpbGUobC5wcmV2aW91c1NpYmxpbmcmJihsPWwucHJldmlvdXNTaWJsaW5nKSl7aWYoIXRoaXMuaXNFbXB0eShsKSl7cmV0dXJuIGx9fX1yZXR1cm4gZmFsc2V9O3RoaXMuaXNJbmxpbmU9ZnVuY3Rpb24oail7aWYoai5ub2RlVHlwZT09Myl7cmV0dXJuIHRydWV9ZWxzZXtpZihqLm5vZGVUeXBlPT0xKXtqPWEoaik7dmFyIGg9ai5jc3MoImRpc3BsYXkiKTt2YXIgZz1qLmNzcygiZmxvYXQiKTtyZXR1cm4gaD09ImlubGluZSJ8fGg9PSJpbmxpbmUtYmxvY2sifHxnPT0ibGVmdCJ8fGc9PSJyaWdodCJ9fXJldHVybiB0cnVlfTt0aGlzLmlzPWZ1bmN0aW9uKGgsZyl7aWYoaCYmaC5ub2RlTmFtZSl7aWYodHlwZW9mKGcpPT0ic3RyaW5nIil7Zz10aGlzLnJlZ0V4cFtnXXx8Ly4/L31pZihnIGluc3RhbmNlb2YgUmVnRXhwJiZoLm5vZGVOYW1lKXtyZXR1cm4gZy50ZXN0KGgubm9kZU5hbWUpfWVsc2V7aWYodHlwZW9mKGcpPT0iZnVuY3Rpb24iKXtyZXR1cm4gZyhoKX19fXJldHVybiBmYWxzZX07dGhpcy5maWx0ZXI9ZnVuY3Rpb24oaixoKXt2YXIgZj1bXSxnO2lmKCFqLnB1c2gpe3JldHVybiB0aGlzLmlzKGosaCk/ajpudWxsfWZvcihnPTA7ZzxqLmxlbmd0aDtnKyspe2lmKHRoaXMuaXMoaltnXSxoKSl7Zi5wdXNoKGpbZ10pfX1yZXR1cm4gZn07dGhpcy5wYXJlbnRzPWZ1bmN0aW9uKGgsZyl7dmFyIGY9W107d2hpbGUoaCYmKGg9aC5wYXJlbnROb2RlKSYmaC5ub2RlTmFtZSE9IkJPRFkiJiZoLm5vZGVOYW1lIT0iSFRNTCIpe2lmKHRoaXMuaXMoaCxnKSl7Zi5wdXNoKGgpfX1yZXR1cm4gZn07dGhpcy5wYXJlbnQ9ZnVuY3Rpb24oaCxnKXtyZXR1cm4gdGhpcy5wYXJlbnRzKGgsZylbMF18fG51bGx9O3RoaXMuc2VsZk9yUGFyZW50PWZ1bmN0aW9uKGgsZyxmKXtyZXR1cm4gdGhpcy5pcyhoLGcpP2g6dGhpcy5wYXJlbnQoaCxmfHxnKX07dGhpcy5zZWxmT3JQYXJlbnRMaW5rPWZ1bmN0aW9uKGYpe2Y9dGhpcy5zZWxmT3JQYXJlbnQoZiwvXkEkLyk7cmV0dXJuIGYmJmYuaHJlZj9mOm51bGx9O3RoaXMuc2VsZk9yUGFyZW50QW5jaG9yPWZ1bmN0aW9uKGYpe2Y9dGhpcy5zZWxmT3JQYXJlbnQoZiwvXkEkLyk7cmV0dXJuIGYmJiFmLmhyZWYmJmYubmFtZT9mOm51bGx9O3RoaXMuY2hpbGRMaW5rcz1mdW5jdGlvbihnKXt2YXIgZj1bXTthKCJhW2hyZWZdIixnKS5lYWNoKGZ1bmN0aW9uKCl7Zi5wdXNoKHRoaXMpfSk7cmV0dXJuIGZ9O3RoaXMuc2VsZWN0aW9uSGFzPWZ1bmN0aW9uKGgpe3ZhciBqPXRoaXMucnRlLnNlbGVjdGlvbi5jbG9uZUNvbnRlbnRzKCksZztpZihqJiZqLmNoaWxkTm9kZXMmJmouY2hpbGROb2Rlcy5sZW5ndGgpe2ZvcihnPTA7ZzxqLmNoaWxkTm9kZXMubGVuZ3RoO2crKyl7aWYodHlwZW9mKGgpPT0iZnVuY3Rpb24iKXtpZihoKGouY2hpbGROb2Rlc1tnXSkpe3JldHVybiB0cnVlfX1lbHNle2lmKGogaW5zdGFuY2VvZiBSZWdFeHApe2lmKGgudGVzdChqLmNoaWxkTm9kZXNbZ10ubm9kZU5hbWUpKXtyZXR1cm4gdHJ1ZX19fX19cmV0dXJuIGZhbHNlfTt0aGlzLndyYXA9ZnVuY3Rpb24oZyxmKXtnPWEuaXNBcnJheShnKT9nOltnXTtmPWYubm9kZU5hbWU/Zjp0aGlzLmNyZWF0ZShmKTtpZihnWzBdJiZnWzBdLm5vZGVUeXBlJiZnWzBdLnBhcmVudE5vZGUpe2Y9Z1swXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLGdbMF0pO2EoZykuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMhPWYpe2YuYXBwZW5kQ2hpbGQodGhpcyl9fSl9cmV0dXJuIGZ9O3RoaXMudW53cmFwPWZ1bmN0aW9uKGYpe3doaWxlKGYuZmlyc3RDaGlsZCl7Zi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLmZpcnN0Q2hpbGQsZil9Zi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfTt0aGlzLndyYXBDb250ZW50cz1mdW5jdGlvbihoLGYpe2Y9Zi5ub2RlTmFtZT9mOnRoaXMuY3JlYXRlKGYpO2Zvcih2YXIgZz0wO2c8aC5jaGlsZE5vZGVzLmxlbmd0aDtnKyspe2YuYXBwZW5kQ2hpbGQoaC5jaGlsZE5vZGVzW2ddKX1oLmFwcGVuZENoaWxkKGYpO3JldHVybiBmfTt0aGlzLmNsZWFuTm9kZT1mdW5jdGlvbihmKXtpZihmLm5vZGVUeXBlIT0xKXtyZXR1cm59aWYoL14oUHxMSSkkLy50ZXN0KGYubm9kZU5hbWUpJiYobD10aGlzLmZpbmRMYXN0Tm90RW1wdHkoZikpJiZsLm5vZGVOYW1lPT0iQlIiKXthKGwpLnJlbW92ZSgpfSRuPWEoZik7JG4uY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5jbGVhbk5vZGUodGhpcyl9KTtpZihmLm5vZGVOYW1lIT0iQk9EWSImJiEvXihUQUJMRXxUUnxURCkkLy50ZXN0KGYpJiZ0aGlzLmlzRW1wdHkoZikpe3JldHVybiAkbi5yZW1vdmUoKX1pZigkbi5hdHRyKCJzdHlsZSIpPT09IiIpeyRuLnJlbW92ZUF0dHIoInN0eWxlIil9aWYodGhpcy5ydGUuYnJvd3Nlci5zYWZhcmkmJiRuLmhhc0NsYXNzKCJBcHBsZS1zcGFuIikpeyRuLnJlbW92ZUNsYXNzKCJBcHBsZS1zcGFuIil9aWYoZi5ub2RlTmFtZT09IlNQQU4iJiYhJG4uYXR0cigic3R5bGUiKSYmISRuLmF0dHIoImNsYXNzIikmJiEkbi5hdHRyKCJpZCIpKXskbi5yZXBsYWNlV2l0aCgkbi5odG1sKCkpfX07dGhpcy5jbGVhbkNoaWxkTm9kZXM9ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcy5jbGVhbk5vZGU7YShnKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpfSl9O3RoaXMudGFibGVNYXRyaXg9ZnVuY3Rpb24oail7dmFyIGg9W107aWYoaiYmai5ub2RlTmFtZT09IlRBQkxFIil7dmFyIGc9MDtmdW5jdGlvbiBmKG8pe2Zvcih2YXIgaz0wO2s8PWc7aysrKXtpZighaFtvXVtrXSl7cmV0dXJuIGt9fX1hKGopLmZpbmQoInRyIikuZWFjaChmdW5jdGlvbihrKXtpZighYS5pc0FycmF5KGhba10pKXtoW2tdPVtdfWEodGhpcykuY2hpbGRyZW4oInRkLHRoIikuZWFjaChmdW5jdGlvbigpe3ZhciBwPXBhcnNlSW50KGEodGhpcykuYXR0cigiY29sc3BhbiIpfHwxKTt2YXIgdD1wYXJzZUludChhKHRoaXMpLmF0dHIoInJvd3NwYW4iKXx8MSk7dmFyIHI9ZihrKTtmb3IodmFyIHY9MDt2PHQ7disrKXtmb3IodmFyIG89MDtvPHA7bysrKXt2YXIgcT1rK3Y7aWYoIWEuaXNBcnJheShoW3FdKSl7aFtxXT1bXX12YXIgdT1vPT0wJiZ2PT0wP3RoaXM6KHY9PTA/bzoiLSIpO2hbcV1bcitvXT11fX1nPU1hdGgubWF4KGcsaFtrXS5sZW5ndGgpfSl9KX1yZXR1cm4gaH07dGhpcy5pbmRleGVzT2ZDZWxsPWZ1bmN0aW9uKGosaCl7Zm9yKHZhciBmPTA7ZjxoLmxlbmd0aDtmKyspe2Zvcih2YXIgZz0wO2c8aFtmXS5sZW5ndGg7ZysrKXtpZihoW2ZdW2ddPT1qKXtyZXR1cm5bZixnXX19fX07dGhpcy5maXhUYWJsZT1mdW5jdGlvbihxKXtpZihxJiZxLm5vZGVOYW1lPT0iVEFCTEUiKXt2YXIgaD1hKHEpO3ZhciBwPXRoaXMudGFibGVNYXRyaXgocSk7dmFyIGY9MDthLmVhY2gocCxmdW5jdGlvbigpe2Y9TWF0aC5tYXgoZix0aGlzLmxlbmd0aCl9KTtpZihmPT0wKXtyZXR1cm4gaC5yZW1vdmUoKX1mb3IodmFyIGs9MDtrPHAubGVuZ3RoO2srKyl7dmFyIGc9cFtrXS5sZW5ndGg7aWYoZz09MCl7aC5maW5kKCJ0ciIpLmVxKGspLnJlbW92ZSgpfWVsc2V7aWYoZzxmKXt2YXIgaj1mLWc7dmFyIG89aC5maW5kKCJ0ciIpLmVxKGspO2ZvcihpPTA7aTxqO2krKyl7by5hcHBlbmQoIjx0ZD4mbmJzcDs8L3RkPiIpfX19fX19O3RoaXMudGFibGVDb2x1bW49ZnVuY3Rpb24oaCxnLG8pe2g9dGhpcy5zZWxmT3JQYXJlbnQoaCwvXlREfFRIJC8pO3ZhciBqPXRoaXMuc2VsZk9yUGFyZW50KGgsL15UQUJMRSQvKTtyZXQ9W107aW5mbz17b2Zmc2V0OltdLGRlbHRhOltdfTtpZihoJiZqKXtvJiZ0aGlzLmZpeFRhYmxlKGopO3ZhciB1PXRoaXMudGFibGVNYXRyaXgoaik7dmFyIHY9ZmFsc2U7dmFyIHQ7Zm9yKHZhciBmPTA7Zjx1Lmxlbmd0aDtmKyspe2Zvcih2YXIgcT0wO3E8dVtmXS5sZW5ndGg7cSsrKXtpZih1W2ZdW3FdPT1oKXt0PXE7dj10cnVlO2JyZWFrfX1pZih2KXticmVha319aWYodD49MCl7Zm9yKHZhciBmPTA7Zjx1Lmxlbmd0aDtmKyspe3ZhciBrPXVbZl1bdF18fG51bGw7aWYoayl7aWYoay5ub2RlTmFtZSl7cmV0LnB1c2goayk7aWYoZyl7aW5mby5kZWx0YS5wdXNoKDApO2luZm8ub2Zmc2V0LnB1c2godCl9fWVsc2V7dmFyIHA9cGFyc2VJbnQoayk7aWYoIWlzTmFOKHApJiZ1W2ZdW3QtcF0mJnVbZl1bdC1wXS5ub2RlTmFtZSl7cmV0LnB1c2godVtmXVt0LXBdKTtpZihnKXtpbmZvLmRlbHRhLnB1c2gocCk7aW5mby5vZmZzZXQucHVzaCh0KX19fX19fX1yZXR1cm4gIWc/cmV0Ontjb2x1bW46cmV0LGluZm86aW5mb319fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24oYyl7dmFyIGI9dGhpcyxmPWEoIjxzcGFuLz4iKS5hZGRDbGFzcygiZWxydGV0ZXN0dXJsIikuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSlbMF07dGhpcy51cmw9KHR5cGVvZihmLmN1cnJlbnRTdHlsZSkhPSJ1bmRlZmluZWQiP2YuY3VycmVudFN0eWxlLmJhY2tncm91bmRJbWFnZTpkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGYsbnVsbClbImJhY2tncm91bmRJbWFnZSJdKS5yZXBsYWNlKC9edXJsXCgoWyciXT8pKFtcc1xTXStcLylbXHNcU10rXDFcKSQvaSwiJDIiKTthKGYpLnJlbW92ZSgpO3RoaXMucnRlPWM7dGhpcy54aHRtbD0veGh0bWwvaS50ZXN0KGMub3B0aW9ucy5kb2N0eXBlKTt0aGlzLmJvb2xBdHRycz1jLnV0aWxzLm1ha2VPYmplY3QoImNoZWNrZWQsY29tcGFjdCxkZWNsYXJlLGRlZmVyLGRpc2FibGVkLGlzbWFwLG11bHRpcGxlLG5vaHJlZixub3Jlc2l6ZSxub3NoYWRlLG5vd3JhcCxyZWFkb25seSxzZWxlY3RlZCIuc3BsaXQoIiwiKSk7dGhpcy50YWdSZWdFeHA9LzwoXC8/KShbXHc6XSspKCg/OlxzK1x3Kyg/OlxzKj1ccyooPzooPzoiW14iXSoiKXwoPzonW14nXSonKXxbXj5cc10rKSk/KSopXHMqXC8/Pi9nO3RoaXMub3BlblRhZ1JlZ0V4cD0vPChbXHc6XSspKCg/OlxzK1x3Kyg/OlxzKj1ccyooPzooPzoiW14iXSoiKXwoPzonW14nXSonKXxbXj5cc10rKSk/KSopXHMqXC8/Pi9nO3RoaXMuYXR0clJlZ0V4cD0vKFx3KykoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W15cc10rKSk/L2c7dGhpcy5zY3JpcHRSZWdFeHA9LzxzY3JpcHQoW14+XSopPihbXHNcU10qPyk8XC9zY3JpcHQ+L2dpO3RoaXMuc3R5bGVSZWdFeHA9Lyg8c3R5bGUoW14+XSopPltcc1xTXSo/PFwvc3R5bGU+KS9naTt0aGlzLmxpbmtSZWdFeHA9Lyg8bGluayhbXj5dKyk+KS9naTt0aGlzLmNkYXRhUmVnRXhwPS88IVxbQ0RBVEFcWyhbXHNcU10rKVxdXF0+L2c7dGhpcy5vYmpSZWdFeHA9LzxvYmplY3QoW14+XSopPihbXHNcU10qPyk8XC9vYmplY3Q+L2dpO3RoaXMuZW1iUmVnRXhwPS88KGVtYmVkKSgoPzpccytcdysoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKj4vZ2k7dGhpcy5wYXJhbVJlZ0V4cD0vPChwYXJhbSkoKD86XHMrXHcrKD86XHMqPVxzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKilccyo+L2dpO3RoaXMudmltZW9SZWdFeHA9LzwoaWZyYW1lKVxzKyhbXj5dKnNyY1xzKj1ccyoiaHR0cDpcL1wvW14iXSt2aW1lb1wuY29tXC9cdytbXj5dKik+KFtcc1xTXSo/KTxcL2lmcmFtZT4vZ2k7dGhpcy55TWFwc1JlZ0V4cD0vPGRpdlxzKyhbXj5dKmlkXHMqPVxzKignfCIpP1lNYXBzSURbXj5dKik+L2dpO3RoaXMuZ01hcHNSZWdFeHA9LzxpZnJhbWVccysoW14+XSpzcmNccyo9XHMqImh0dHA6XC9cL21hcHNcLmdvb2dsZVwuXHcrW14+XSopPihbXHNcU10qPyk8XC9pZnJhbWU+L2dpO3RoaXMudmlkZW9Ib3N0UmVnRXhwPS9eKGh0dHA6XC9cL1tcd1wuXSopPyh5b3V0dWJlfHZpbWVvfHJ1dHViZSkuKi9pO3RoaXMuc2VydmljZUNsYXNzUmVnRXhwPS88KFx3KykoW14+XSpjbGFzc1xzKj1ccyoiW14+XSplbHJ0ZS1bXj5dKik+XHMqKDxcL1wxPik/L2dpO3RoaXMucGFnZWJyZWFrUmVnRXhwPS88KFx3KykoW14+XSpzdHlsZVxzKj1ccyoiW14+XSpwYWdlLWJyZWFrW14+XSopPlxzKig8XC9cMT4pPy9naTt0aGlzLnBiUmVnRXhwPW5ldyBSZWdFeHAoIjwhLS0gcGFnZWJyZWFrIC0tPiIsImdpIik7dGhpcy5hbGxvd1RhZ3M9Yy5vcHRpb25zLmFsbG93VGFncy5sZW5ndGg/Yy51dGlscy5tYWtlT2JqZWN0KGMub3B0aW9ucy5hbGxvd1RhZ3MpOm51bGw7dGhpcy5kZW55VGFncz1jLm9wdGlvbnMuZGVueVRhZ3MubGVuZ3RoP2MudXRpbHMubWFrZU9iamVjdChjLm9wdGlvbnMuZGVueVRhZ3MpOm51bGw7dGhpcy5kZW55QXR0cj1jLm9wdGlvbnMuZGVueUF0dHI/Yy51dGlscy5tYWtlT2JqZWN0KGMub3B0aW9ucy5kZW55QXR0cik6bnVsbDt0aGlzLnBhc3RlRGVueUF0dHI9Yy5vcHRpb25zLnBhc3RlRGVueUF0dHI/Yy51dGlscy5tYWtlT2JqZWN0KGMub3B0aW9ucy5wYXN0ZURlbnlBdHRyKTpudWxsO3RoaXMuZm9udFNpemU9WyJtZWRpdW0iLCJ4eC1zbWFsbCIsInNtYWxsIiwibWVkaXVtIiwibGFyZ2UiLCJ4LWxhcmdlIiwieHgtbGFyZ2UiXTt0aGlzLmZvbnRGYW1pbHk9eyJzYW5zLXNlcmlmIjovXihhcmlhbHx0YWhvbWF8dmVyZGFuYSkkL2ksc2VyaWY6L14odGltZXN8dGltZXMgbmV3IHJvbWFuKSQvaSxtb25vc3BhY2U6L15jb3VyaWVyJC9pfTt0aGlzLnNjcmlwdHM9e307dGhpcy5fY2hhaW5zPXt9O2EuZWFjaCh0aGlzLmNoYWlucyxmdW5jdGlvbihnKXtiLl9jaGFpbnNbZ109W107YS5lYWNoKHRoaXMsZnVuY3Rpb24oaCxqKXt0eXBlb2YoYi5ydWxlc1tqXSk9PSJmdW5jdGlvbiImJmIuX2NoYWluc1tnXS5wdXNoKGIucnVsZXNbal0pfSl9KTt0aGlzLnByb2NjZXNzPWZ1bmN0aW9uKGgsZyl7Zz1hLnRyaW0oZykucmVwbGFjZSgvXlxzKigmbmJzcDspKy9naSwiIikucmVwbGFjZSgvKCZuYnNwO3w8YnJbXj5dKj4pK1xzKiQvZ2ksIiIpO2EuZWFjaCh0aGlzLl9jaGFpbnNbaF18fFtdLGZ1bmN0aW9uKCl7Zz10aGlzLmNhbGwoYixnKX0pO3JldHVybiBnLnJlcGxhY2UoL1x0L2csIiAgIikucmVwbGFjZSgvXHIvZywiIikucmVwbGFjZSgvXHMqXG5ccypcbisvZywiXG4iKSsiICAifTt0aGlzLnd5c2l3eWc9ZnVuY3Rpb24oZyl7cmV0dXJuIHRoaXMucHJvY2Nlc3MoInd5c2l3eWciLGcpfTt0aGlzLnNvdXJjZT1mdW5jdGlvbihnKXtyZXR1cm4gdGhpcy5wcm9jY2Vzcygic291cmNlIixnKX07dGhpcy5zb3VyY2Uyc291cmNlPWZ1bmN0aW9uKGcpe3JldHVybiB0aGlzLnByb2NjZXNzKCJzb3VyY2Uyc291cmNlIixnKX07dGhpcy53eXNpd3lnMnd5c2l3eWc9ZnVuY3Rpb24oZyl7cmV0dXJuIHRoaXMucHJvY2Nlc3MoInd5c2l3eWcyd3lzaXd5ZyIsZyl9O3RoaXMucGFyc2VBdHRycz1mdW5jdGlvbihwKXt2YXIgaj17fSxoPXRoaXMuYm9vbEF0dHJzLGc9cC5tYXRjaCh0aGlzLmF0dHJSZWdFeHApLG8scSxrO2cmJmEuZWFjaChnLGZ1bmN0aW9uKHIsdCl7bz10LnNwbGl0KCI9Iik7cT1hLnRyaW0ob1swXSkudG9Mb3dlckNhc2UoKTtpZihvLmxlbmd0aD4yKXtvLnNoaWZ0KCk7az1vLmpvaW4oIj0iKX1lbHNle2s9aFtxXXx8b1sxXXx8IiJ9altxXT1hLnRyaW0oaykucmVwbGFjZSgvXignfCIpKC4qKShcMSkkLywiJDIiKX0pO2ouc3R5bGU9dGhpcy5ydGUudXRpbHMucGFyc2VTdHlsZShqLnN0eWxlKTtqWyJjbGFzcyJdPXRoaXMucnRlLnV0aWxzLnBhcnNlQ2xhc3MoalsiY2xhc3MiXXx8IiIpO3JldHVybiBqfTt0aGlzLnNlcmlhbGl6ZUF0dHJzPWZ1bmN0aW9uKGcsayl7dmFyIGo9W10saD10aGlzO2EuZWFjaChnLGZ1bmN0aW9uKHAsbyl7aWYocD09InN0eWxlIil7bz1oLnJ0ZS51dGlscy5zZXJpYWxpemVTdHlsZShvLGspfWVsc2V7aWYocD09ImNsYXNzIil7bz1oLnJ0ZS51dGlscy5zZXJpYWxpemVDbGFzcyhvKX19byYmai5wdXNoKHArJz0iJytvKyciJyl9KTtyZXR1cm4gai5qb2luKCIgIil9O3RoaXMuY2xlYW5BdHRycz1mdW5jdGlvbihnLGope3ZhciBoPXRoaXMsbz10aGlzLnJlcGxhY2VBdHRyczthLmVhY2goZ1siY2xhc3MiXSxmdW5jdGlvbihwKXsvXihBcHBsZS1zdHlsZS1zcGFufG1zb1x3KykkL2kudGVzdChwKSYmZGVsZXRlIGdbImNsYXNzIl1bcF19KTtmdW5jdGlvbiBrKHApe3JldHVybiBwKygvXGQkLy50ZXN0KHApPyJweCI6IiIpfWEuZWFjaChnLGZ1bmN0aW9uKHEscCl7b1txXSYmb1txXS5jYWxsKGgsZyxqKTtpZihxPT0ic3R5bGUiKXthLmVhY2gocCxmdW5jdGlvbih0LHIpe3N3aXRjaCh0KXtjYXNlIm1zby1wYWRkaW5nLWFsdCI6Y2FzZSJtc28tcGFkZGluZy10b3AtYWx0IjpjYXNlIm1zby1wYWRkaW5nLXJpZ2h0LWFsdCI6Y2FzZSJtc28tcGFkZGluZy1ib3R0b20tYWx0IjpjYXNlIm1zby1wYWRkaW5nLWxlZnQtYWx0IjpjYXNlIm1zby1tYXJnaW4tYWx0IjpjYXNlIm1zby1tYXJnaW4tdG9wLWFsdCI6Y2FzZSJtc28tbWFyZ2luLXJpZ2h0LWFsdCI6Y2FzZSJtc28tbWFyZ2luLWJvdHRvbS1hbHQiOmNhc2UibXNvLW1hcmdpbi1sZWZ0LWFsdCI6Y2FzZSJtc28tdGFibGUtbGF5b3V0LWFsdCI6Y2FzZSJtc28taGVpZ2h0IjpjYXNlIm1zby13aWR0aCI6Y2FzZSJtc28tdmVydGljYWwtYWxpZ24tYWx0IjpnLnN0eWxlW3QucmVwbGFjZSgvXm1zby18LWFsdCQvZywiIildPWsocik7ZGVsZXRlIGcuc3R5bGVbdF07YnJlYWs7Y2FzZSJob3Jpei1hbGlnbiI6Zy5zdHlsZVsidGV4dC1hbGlnbiJdPXI7ZGVsZXRlIGcuc3R5bGVbdF07YnJlYWs7Y2FzZSJ2ZXJ0LWFsaWduIjpnLnN0eWxlWyJ2ZXJ0aWNhbC1hbGlnbiJdPXI7ZGVsZXRlIGcuc3R5bGVbdF07YnJlYWs7Y2FzZSJmb250LWNvbG9yIjpjYXNlIm1zby1mb3JlZ3JvdW5kIjpnLnN0eWxlLmNvbG9yPXI7ZGVsZXRlIGcuc3R5bGVbdF07YnJlYWs7Y2FzZSJtc28tYmFja2dyb3VuZCI6Y2FzZSJtc28taGlnaGxpZ2h0IjpnLnN0eWxlLmJhY2tncm91bmQ9cjtkZWxldGUgZy5zdHlsZVt0XTticmVhaztjYXNlIm1zby1kZWZhdWx0LWhlaWdodCI6Zy5zdHlsZVsibWluLWhlaWdodCJdPWsocik7ZGVsZXRlIGcuc3R5bGVbdF07YnJlYWs7Y2FzZSJtc28tZGVmYXVsdC13aWR0aCI6Zy5zdHlsZVsibWluLXdpZHRoIl09ayhyKTtkZWxldGUgZy5zdHlsZVt0XTticmVhaztjYXNlIm1zby1wYWRkaW5nLWJldHdlZW4tYWx0IjpnLnN0eWxlWyJib3JkZXItY29sbGFwc2UiXT0ic2VwYXJhdGUiO2cuc3R5bGVbImJvcmRlci1zcGFjaW5nIl09ayhyKTtkZWxldGUgZy5zdHlsZVt0XTticmVhaztjYXNlInRleHQtbGluZS10aHJvdWdoIjppZihyLm1hdGNoKC8oc2luZ2xlfGRvdWJsZSkvaSkpe2cuc3R5bGVbInRleHQtZGVjb3JhdGlvbiJdPSJsaW5lLXRocm91Z2gifWRlbGV0ZSBnLnN0eWxlW3RdO2JyZWFrO2Nhc2UibXNvLXplcm8taGVpZ2h0IjppZihyPT0ieWVzIil7Zy5zdHlsZS5kaXNwbGF5PSJub25lIn1kZWxldGUgZy5zdHlsZVt0XTticmVhaztjYXNlImZvbnQtd2VpZ2h0IjppZihyPT03MDApe2cuc3R5bGVbImZvbnQtd2VpZ2h0Il09ImJvbGQifWJyZWFrO2RlZmF1bHQ6aWYodC5tYXRjaCgvXihtc298Y29sdW1ufGZvbnQtZW1waHxsYW5nfGxheW91dHxsaW5lLWJyZWFrfGxpc3QtaW1hZ2V8bmF2fHBhbm9zZXxwdW5jdHxyb3d8cnVieXxzZXB8c2l6ZXxzcmN8dGFiLXx0YWJsZS1ib3JkZXJ8dGV4dC0oPyFhbGlnbnxkZWNvcnxpbmRlbnR8dHJhbnMpfHRvcC1iYXJ8dmVyc2lvbnx2bmR8d29yZC1icmVhaykvKSl7ZGVsZXRlIGcuc3R5bGVbdF19fX0pfX0pO3JldHVybiBnfX07ZWxSVEUucHJvdG90eXBlLmZpbHRlci5wcm90b3R5cGUucmVwbGFjZVRhZ3M9e2I6e3RhZzoic3Ryb25nIn0sYmlnOnt0YWc6InNwYW4iLHN0eWxlOnsiZm9udC1zaXplIjoibGFyZ2UifX0sY2VudGVyOnt0YWc6ImRpdiIsc3R5bGU6eyJ0ZXh0LWFsaWduIjoiY2VudGVyIn19LGk6e3RhZzoiZW0ifSxmb250Ont0YWc6InNwYW4ifSxub2JyOnt0YWc6InNwYW4iLHN0eWxlOnsid2hpdGUtc3BhY2UiOiJub3dyYXAifX0sbWVudTp7dGFnOiJ1bCJ9LHBsYWludGV4dDp7dGFnOiJwcmUifSxzOnt0YWc6InN0cmlrZSJ9LHNtYWxsOnt0YWc6InNwYW4iLHN0eWxlOnsiZm9udC1zaXplIjoic21hbGwifX0sdTp7dGFnOiJzcGFuIixzdHlsZTp7InRleHQtZGVjb3JhdGlvbiI6InVuZGVybGluZSJ9fSx4bXA6e3RhZzoicHJlIn19O2VsUlRFLnByb3RvdHlwZS5maWx0ZXIucHJvdG90eXBlLnJlcGxhY2VBdHRycz17YWxpZ246ZnVuY3Rpb24oYixjKXtzd2l0Y2goYyl7Y2FzZSJpbWciOmIuc3R5bGVbYi5hbGlnbi5tYXRjaCgvKGxlZnR8cmlnaHQpLyk/ImZsb2F0IjoidmVydGljYWwtYWxpZ24iXT1iLmFsaWduO2JyZWFrO2Nhc2UidGFibGUiOmlmKGIuYWxpZ249PSJjZW50ZXIiKXtiLnN0eWxlWyJtYXJnaW4tbGVmdCJdPWIuc3R5bGVbIm1hcmdpbi1yaWdodCJdPSJhdXRvIn1lbHNle2Iuc3R5bGVbImZsb2F0Il09Yi5hbGlnbn1icmVhaztkZWZhdWx0OmIuc3R5bGVbInRleHQtYWxpZ24iXT1iLmFsaWdufWRlbGV0ZSBiLmFsaWdufSxib3JkZXI6ZnVuY3Rpb24oYil7IWIuc3R5bGVbImJvcmRlci13aWR0aCJdJiYoYi5zdHlsZVsiYm9yZGVyLXdpZHRoIl09KHBhcnNlSW50KGIuYm9yZGVyKXx8MSkrInB4Iik7IWIuc3R5bGVbImJvcmRlci1zdHlsZSJdJiYoYi5zdHlsZVsiYm9yZGVyLXN0eWxlIl09InNvbGlkIik7ZGVsZXRlIGIuYm9yZGVyfSxib3JkZXJjb2xvcjpmdW5jdGlvbihiKXshYi5zdHlsZVsiYm9yZGVyLWNvbG9yIl0mJihiLnN0eWxlWyJib3JkZXItY29sb3IiXT1iLmJvcmRlcmNvbG9yKTtkZWxldGUgYi5ib3JkZXJjb2xvcn0sYmFja2dyb3VuZDpmdW5jdGlvbihiKXshYi5zdHlsZVsiYmFja2dyb3VuZC1pbWFnZSJdJiYoYi5zdHlsZVsiYmFja2dyb3VuZC1pbWFnZSJdPSJ1cmwoIitiLmJhY2tncm91bmQrIikiKTtkZWxldGUgYi5iYWNrZ3JvdW5kfSxiZ2NvbG9yOmZ1bmN0aW9uKGIpeyFiLnN0eWxlWyJiYWNrZ3JvdW5kLWNvbG9yIl0mJihiLnN0eWxlWyJiYWNrZ3JvdW5kLWNvbG9yIl09Yi5iZ2NvbG9yKTtkZWxldGUgYi5iZ2NvbG9yfSxjbGVhcjpmdW5jdGlvbihiKXtiLnN0eWxlLmNsZWFyPWIuY2xlYXI9PSJhbGwiPyJib3RoIjpiLmNsZWFyO2RlbGV0ZSBiLmNsZWFyfSxjb2xvcjpmdW5jdGlvbihiKXshYi5zdHlsZS5jb2xvciYmKGIuc3R5bGUuY29sb3I9Yi5jb2xvcik7ZGVsZXRlIGIuY29sb3J9LGZhY2U6ZnVuY3Rpb24oYil7dmFyIGM9Yi5mYWNlLnRvTG93ZXJDYXNlKCk7YS5lYWNoKHRoaXMuZm9udEZhbWlseSxmdW5jdGlvbihnLGYpe2lmKGMubWF0Y2goZikpe2Iuc3R5bGVbImZvbnQtZmFtaWx5Il09YysiLCIrZ319KTtkZWxldGUgYi5mYWNlfSxoc3BhY2U6ZnVuY3Rpb24oYixmKXtpZihmPT0iaW1nIil7dmFyIGM9cGFyc2VJbnQoYi5oc3BhY2UpfHwwOyFiLnN0eWxlWyJtYXJnaW4tbGVmdCJdJiYoYi5zdHlsZVsibWFyZ2luLWxlZnQiXT1jKyJweCIpOyFiLnN0eWxlWyJtYXJnaW4tcmlnaHQiXSYmKGIuc3R5bGVbIm1hcmdpbi1yaWdodCJdPWMrInB4Iik7ZGVsZXRlIGIuaHNwYWNlfX0sc2l6ZTpmdW5jdGlvbihiLGMpe2lmKGMhPSJpbnB1dCIpe2Iuc3R5bGVbImZvbnQtc2l6ZSJdPXRoaXMuZm9udFNpemVbcGFyc2VJbnQoYi5zaXplKXx8MF18fCJtZWRpdW0iO2RlbGV0ZSBiLnNpemV9fSx2YWxpZ246ZnVuY3Rpb24oYil7aWYoIWIuc3R5bGVbInZlcnRpY2FsLWFsaWduIl0pe2Iuc3R5bGVbInZlcnRpY2FsLWFsaWduIl09Yi52YWxpZ259ZGVsZXRlIGIudmFsaWdufSx2c3BhY2U6ZnVuY3Rpb24oYixmKXtpZihmPT0iaW1nIil7dmFyIGM9cGFyc2VJbnQoYi52c3BhY2UpfHwwOyFiLnN0eWxlWyJtYXJnaW4tdG9wIl0mJihiLnN0eWxlWyJtYXJnaW4tdG9wIl09YysicHgiKTshYi5zdHlsZVsibWFyZ2luLWJvdHRvbSJdJiYoYi5zdHlsZVsibWFyZ2luLWJvdHRvbSJdPWMrInB4Iik7ZGVsZXRlIGIuaHNwYWNlfX19O2VsUlRFLnByb3RvdHlwZS5maWx0ZXIucHJvdG90eXBlLnJ1bGVzPXthbGxvd2VkVGFnczpmdW5jdGlvbihjKXt2YXIgYj10aGlzLmFsbG93VGFncztyZXR1cm4gYj9jLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsZnVuY3Rpb24oZixoLGcpe3JldHVybiBiW2cudG9Mb3dlckNhc2UoKV0/ZjoiIn0pOmN9LGRlbmllZFRhZ3M6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5kZW55VGFncztyZXR1cm4gYz9iLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsZnVuY3Rpb24oZixoLGcpe3JldHVybiBjW2cudG9Mb3dlckNhc2UoKV0/IiI6Zn0pOmJ9LGNsZWFuOmZ1bmN0aW9uKGcpe3ZhciBjPXRoaXMsYj10aGlzLnJlcGxhY2VUYWdzLGg9dGhpcy5yZXBsYWNlQXR0cnMsZj10aGlzLmRlbnlBdHRyLGo7cmV0dXJuIGcucmVwbGFjZSgvPCFET0NUWVBFKFtcc1xTXSopPi9naSwiIikucmVwbGFjZSgvPHAgW14+XSpjbGFzcz0iP01zb0hlYWRpbmciP1tePl0qPiguKj8pPFwvcD4vZ2ksIjxwPjxzdHJvbmc+JDE8L3N0cm9uZz48L3A+IikucmVwbGFjZSgvPHNwYW5ccytzdHlsZVxzKj1ccyoiXHMqbXNvLXNwYWNlcnVuXHMqOlxzKnllc1xzKjs/XHMqIlxzKj4oW1xzJm5ic3A7XSopPFwvc3Bhbj4vZ2ksIiQxIikucmVwbGFjZSgvKDxwW14+XSo+XHMqPFwvcD58PHBbXj5dKlwvPikvZ2ksIjxicj4iKS5yZXBsYWNlKHRoaXMudGFnUmVnRXhwLGZ1bmN0aW9uKG8scSxwLGspe3A9cC50b0xvd2VyQ2FzZSgpO2lmKHEpe3JldHVybiI8LyIrKGJbcF0/YltwXS50YWc6cCkrIj4ifWs9Yy5jbGVhbkF0dHJzKGMucGFyc2VBdHRycyhrfHwiIikscCk7aWYoYltwXSl7YltwXS5zdHlsZSYmYS5leHRlbmQoay5zdHlsZSxiW3BdLnN0eWxlKTtwPWJbcF0udGFnfWYmJmEuZWFjaChrLGZ1bmN0aW9uKHIpe2lmKGZbcl0pe2RlbGV0ZSBrW3JdfX0pO2s9Yy5zZXJpYWxpemVBdHRycyhrKTtyZXR1cm4iPCIrcCsoaz8iICI6IiIpK2srIj4ifSl9LGNsZWFuUGFzdGU6ZnVuY3Rpb24oYyl7dmFyIGI9dGhpcyxmPXRoaXMucGFzdGVEZW55QXR0cjtjPWMucmVwbGFjZSh0aGlzLnNjcmlwdFJlZ0V4cCwiIikucmVwbGFjZSh0aGlzLnN0eWxlUmVnRXhwLCIiKS5yZXBsYWNlKHRoaXMubGlua1JlZ0V4cCwiIikucmVwbGFjZSh0aGlzLmNkYXRhUmVnRXhwLCIiKS5yZXBsYWNlKC9cPFwhLS1bXHNcU10qPy0tXD4vZywiIik7aWYodGhpcy5ydGUub3B0aW9ucy5wYXN0ZU9ubHlUZXh0KXtjPWMucmVwbGFjZSh0aGlzLnRhZ1JlZ0V4cCxmdW5jdGlvbihnLGosaCl7cmV0dXJuL2JyL2kudGVzdChoKXx8KGomJi9oWzEtNl18cHxvbHx1bHxsaXxkaXZ8YmxvY2txdW90ZXx0ci9pKT8iPGJyPiI6IiJ9KS5yZXBsYWNlKC8oJm5ic3A7fDxicltePl0qPikrXHMqJC9naSwiIil9ZWxzZXtpZihmKXtjPWMucmVwbGFjZSh0aGlzLm9wZW5UYWdSZWdFeHAsZnVuY3Rpb24oaCxqLGcpe2c9Yi5wYXJzZUF0dHJzKGcpO2EuZWFjaChnLGZ1bmN0aW9uKGspe2lmKGZba10pe2RlbGV0ZSBnW2tdfX0pO2c9Yi5zZXJpYWxpemVBdHRycyhnLHRydWUpO3JldHVybiI8IitqKyhnPyIgIjoiIikrZysiPiJ9KX19cmV0dXJuIGN9LHJlcGxhY2U6ZnVuY3Rpb24obyl7dmFyIHE9dGhpcyxiPXRoaXMucnRlLm9wdGlvbnMucmVwbGFjZXx8W10sZztpZihiLmxlbmd0aCl7YS5lYWNoKGIsZnVuY3Rpb24ocix0KXtpZih0eXBlb2YodCk9PSJmdW5jdGlvbiIpe289dC5jYWxsKHEsbyl9fSl9ZnVuY3Rpb24gayh4LEQpe3ZhciBFPXIoKSxCPUUmJnEudmlkZW9Ib3N0UmVnRXhwLnRlc3QoRSk/RS5yZXBsYWNlKHEudmlkZW9Ib3N0UmVnRXhwLCIkMiIpOkQucmVwbGFjZSgvXlx3K1wvKC4rKS8sIiQxIiksQz1wYXJzZUludCgoeC5vYmo/eC5vYmoud2lkdGh8fHgub2JqLnN0eWxlLndpZHRoOjApfHwoeC5lbWJlZD94LmVtYmVkLndpZHRofHx4LmVtYmVkLnN0eWxlLndpZHRoOjApKXx8MTUwLEE9cGFyc2VJbnQoKHgub2JqP3gub2JqLmhlaWdodHx8eC5vYmouc3R5bGUuaGVpZ2h0OjApfHwoeC5lbWJlZD94LmVtYmVkLmhlaWdodHx8eC5lbWJlZC5zdHlsZS5oZWlnaHQ6MCkpfHwxMDAsdj0ibWVkaWEiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksdT0iIix6O2Z1bmN0aW9uIHIoKXtpZih4LmVtYmVkJiZ4LmVtYmVkLnNyYyl7cmV0dXJuIHguZW1iZWQuc3JjfWlmKHgucGFyYW1zJiZ4LnBhcmFtcy5sZW5ndGgpe3o9eC5wYXJhbXMubGVuZ3RoO3doaWxlKHotLSl7aWYoeC5wYXJhbXNbel0ubmFtZT09InNyYyJ8fHgucGFyYW1zW3pdLm5hbWU9PSJtb3ZpZSIpe3JldHVybiB4LnBhcmFtc1t6XS52YWx1ZX19fX1pZih4Lm9iaiYmeC5vYmouc3R5bGUmJngub2JqLnN0eWxlWyJmbG9hdCJdKXt1PScgc3R5bGU9ImZsb2F0OicreC5vYmouc3R5bGVbImZsb2F0Il0rJyInfXEuc2NyaXB0c1t2XT14O3JldHVybic8aW1nIHNyYz0iJytxLnVybCsncGl4ZWwuZ2lmIiBjbGFzcz0iZWxydGUtbWVkaWEgZWxydGUtbWVkaWEtJytCKycgZWxydGUtcHJvdGVjdGVkIiB0aXRsZT0iJysoRT9xLnJ0ZS51dGlscy5lbmNvZGUoRSk6IiIpKyciIHJlbD0iJyt2KyciIHdpZHRoPSInK0MrJyIgaGVpZ2h0PSInK0ErJyInK3UrIj4ifW89by5yZXBsYWNlKHRoaXMuc3R5bGVSZWdFeHAsIjwhLS0gRUxSVEVfQ09NTUVOVCQxIC0tPiIpLnJlcGxhY2UodGhpcy5saW5rUmVnRXhwLCI8IS0tIEVMUlRFX0NPTU1FTlQkMS0tPiIpLnJlcGxhY2UodGhpcy5jZGF0YVJlZ0V4cCwiPCEtLVtDREFUQVskMV1dLS0+IikucmVwbGFjZSh0aGlzLnNjcmlwdFJlZ0V4cCxmdW5jdGlvbih1LHIsdil7dmFyIHc7aWYocS5kZW55VGFncy5zY3JpcHQpe3JldHVybiIifXc9InNjcmlwdCIrTWF0aC5yYW5kb20oKS50b1N0cmluZygpLnN1YnN0cmluZygyKTtyPXEucGFyc2VBdHRycyhyKTshci50eXBlJiYoci50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiKTtxLnNjcmlwdHNbd109IjxzY3JpcHQgIitxLnNlcmlhbGl6ZUF0dHJzKHIpKyI+Iit2KyI8XC9zY3JpcHQ+IjtyZXR1cm4iPCEtLSBFTFJURV9TQ1JJUFQ6IisodykrIiAtLT4ifSkucmVwbGFjZSh0aGlzLnlNYXBzUmVnRXhwLGZ1bmN0aW9uKHUscil7cj1xLnBhcnNlQXR0cnMocik7clsiY2xhc3MiXVsiZWxydGUteWFuZGV4LW1hcHMiXT0iZWxydGUteWFuZGV4LW1hcHMiO3JbImNsYXNzIl1bImVscnRlLXByb3RlY3RlZCJdPSJlbHJ0ZS1wcm90ZWN0ZWQiO3JldHVybiI8ZGl2ICIrcS5zZXJpYWxpemVBdHRycyhyKSsiPiJ9KS5yZXBsYWNlKHRoaXMuZ01hcHNSZWdFeHAsZnVuY3Rpb24odix1KXt2YXIgej0iZ21hcHMiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMikscix4O3U9cS5wYXJzZUF0dHJzKHUpO3I9cGFyc2VJbnQodS53aWR0aHx8dS5zdHlsZS53aWR0aHx8MTAwKTt4PXBhcnNlSW50KHUuaGVpZ2h0fHx1LnN0eWxlLmhlaWdodHx8MTAwKTtxLnNjcmlwdHNbel09djtyZXR1cm4nPGltZyBzcmM9IicrcS51cmwrJ3BpeGVsLmdpZiIgY2xhc3M9ImVscnRlLWdvb2dsZS1tYXBzIGVscnRlLXByb3RlY3RlZCIgaWQ9IicreisnIiBzdHlsZT0id2lkdGg6JytyKyJweDtoZWlnaHQ6Iit4KydweCI+J30pLnJlcGxhY2UodGhpcy5vYmpSZWdFeHAsZnVuY3Rpb24odyx1LHope3ZhciByPXoubWF0Y2gocS5lbWJSZWdFeHApLHg9e29iajpxLnBhcnNlQXR0cnModSksZW1iZWQ6ciYmci5sZW5ndGg/cS5wYXJzZUF0dHJzKHJbMF0uc3Vic3RyaW5nKDcpKTpudWxsLHBhcmFtczpbXX0sdj1xLnJ0ZS51dGlscy5tZWRpYUluZm8oeC5lbWJlZD94LmVtYmVkLnR5cGV8fCIiOiIiLHgub2JqLmNsYXNzaWR8fCIiKTtpZih2KXtpZigocj16Lm1hdGNoKHEucGFyYW1SZWdFeHApKSl7YS5lYWNoKHIsZnVuY3Rpb24odCxBKXt4LnBhcmFtcy5wdXNoKHEucGFyc2VBdHRycyhBLnN1YnN0cmluZyg2KSkpfSl9IXgub2JqLmNsYXNzaWQmJih4Lm9iai5jbGFzc2lkPXYuY2xhc3NpZFswXSk7IXgub2JqLmNvZGViYXNlJiYoeC5vYmouY29kZWJhc2U9di5jb2RlYmFzZSk7eC5lbWJlZCYmIXguZW1iZWQudHlwZSYmKHguZW1iZWQudHlwZT12LnR5cGUpO3gub2JqLndpZHRoPT0iMSImJmRlbGV0ZSB4Lm9iai53aWR0aDt4Lm9iai5oZWlnaHQ9PSIxIiYmZGVsZXRlIHgub2JqLmhlaWdodDtpZih4LmVtYmVkKXt4LmVtYmVkLndpZHRoPT0iMSImJmRlbGV0ZSB4LmVtYmVkLndpZHRoO3guZW1iZWQuaGVpZ2h0PT0iMSImJmRlbGV0ZSB4LmVtYmVkLmhlaWdodH1yZXR1cm4gayh4LHYudHlwZSl9cmV0dXJuIHd9KS5yZXBsYWNlKHRoaXMuZW1iUmVnRXhwLGZ1bmN0aW9uKHYsdyxyKXt2YXIgcj1xLnBhcnNlQXR0cnMociksdT1xLnJ0ZS51dGlscy5tZWRpYUluZm8oci50eXBlfHwiIik7ci53aWR0aD09IjEiJiZkZWxldGUgci53aWR0aDtyLmhlaWdodD09IjEiJiZkZWxldGUgci5oZWlnaHQ7cmV0dXJuIHU/ayh7ZW1iZWQ6cn0sdS50eXBlKTp2fSkucmVwbGFjZSh0aGlzLnZpbWVvUmVnRXhwLGZ1bmN0aW9uKHUsdixyKXtyPXEucGFyc2VBdHRycyhyKTtkZWxldGUgci5mcmFtZWJvcmRlcjtyLndpZHRoPT0iMSImJmRlbGV0ZSByLndpZHRoO3IuaGVpZ2h0PT0iMSImJmRlbGV0ZSByLmhlaWdodDtyLnR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIjtyZXR1cm4gayh7ZW1iZWQ6cn0sImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIil9KS5yZXBsYWNlKC88XC8oZW1iZWR8cGFyYW0pPi9naSwiIikucmVwbGFjZSh0aGlzLnBiUmVnRXhwLGZ1bmN0aW9uKCl7cmV0dXJuJzxpbWcgc3JjPSInK3EudXJsKydwaXhlbC5naWYiIGNsYXNzPSJlbHJ0ZS1wcm90ZWN0ZWQgZWxydGUtcGFnZWJyZWFrIj4nfSk7Zz1hKCI8ZGl2PiIrbysiPC9kaXY+Iik7Zy5maW5kKCJzcGFuOm5vdChbaWRdKTpub3QoW2NsYXNzXSkiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9YSh0aGlzKTtpZighci5hdHRyKCJzdHlsZSIpKXtyLmNoaWxkcmVuKCkubGVuZ3RoP3EucnRlLmRvbS51bndyYXAodGhpcyk6ci5yZW1vdmUoKX19KS5lbmQoKS5maW5kKCJzcGFuIHNwYW46b25seS1jaGlsZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgdT1hKHRoaXMpLHg9dS5wYXJlbnQoKS5lcSgwKSx3PXUuYXR0cigiaWQiKSxyPXguYXR0cigiaWQiKSxBLHYsejtpZihxLnJ0ZS5kb20uaXModGhpcywib25seUNoaWxkIikmJighd3x8IXIpKXt6PWEudHJpbSh4LmF0dHIoImNsYXNzIikrIiAiK3UuYXR0cigiY2xhc3MiKSk7eiYmeC5hdHRyKCJjbGFzcyIseik7dj1xLnJ0ZS51dGlscy5zZXJpYWxpemVTdHlsZShhLmV4dGVuZChxLnJ0ZS51dGlscy5wYXJzZVN0eWxlKGEodGhpcykuYXR0cigic3R5bGUiKXx8IiIpLHEucnRlLnV0aWxzLnBhcnNlU3R5bGUoYSh4KS5hdHRyKCJzdHlsZSIpfHwiIikpKTt2JiZ4LmF0dHIoInN0eWxlIix2KTtBPXd8fHI7QSYmeC5hdHRyKCJpZCIsQSk7dGhpcy5maXJzdENoaWxkP2EodGhpcy5maXJzdENoaWxkKS51bndyYXAoKTp1LnJlbW92ZSgpfX0pO2lmKCF0aGlzLnJ0ZS5vcHRpb25zLmFsbG93VGV4dE5vZGVzKXt2YXIgaD10aGlzLnJ0ZS5kb20sYz1bXSxwPVtdO2lmKGEuYnJvd3Nlci5tc2llKXtmb3IodmFyIGo9MDtqPGdbMF0uY2hpbGROb2Rlcy5sZW5ndGg7aisrKXtjLnB1c2goZ1swXS5jaGlsZE5vZGVzW2pdKX19ZWxzZXtjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGdbMF0uY2hpbGROb2Rlcyl9ZnVuY3Rpb24gZigpe2lmKHAubGVuZ3RoJiZoLmZpbHRlcihwLCJub3RFbXB0eSIpLmxlbmd0aCl7aC53cmFwKHAsZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpKX1wPVtdfWEuZWFjaChjLGZ1bmN0aW9uKHIsdCl7aWYoaC5pcyh0LCJibG9jayIpKXtmKCl9ZWxzZXtpZihwLmxlbmd0aCYmdC5wcmV2aW91c1NpYmxpbmchPXBbcC5sZW5ndGgtMV0pe2YoKX1wLnB1c2godCl9fSk7ZigpfXJldHVybiBnLmh0bWwoKX0scmVzdG9yZTpmdW5jdGlvbihjKXt2YXIgYj10aGlzLGY9dGhpcy5ydGUub3B0aW9ucy5yZXN0b3JlfFtdO2lmKGYubGVuZ3RoKXthLmVhY2goZixmdW5jdGlvbihnLGgpe2lmKHR5cGVvZihoKT09ImZ1bmN0aW9uIil7Yz1oLmNhbGwoYixjKX19KX1jPWMucmVwbGFjZSgvXDxcIS0tXFtDREFUQVxbKFtcc1xTXSo/KVxdXF0tLVw+L2dpLCI8IVtDREFUQVskMV1dPiIpLnJlcGxhY2UoL1w8XCEtLVxzKkVMUlRFX1NDUklQVFw6XHMqKHNjcmlwdFxkKylccyotLVw+L2dpLGZ1bmN0aW9uKGcsaCl7aWYoYi5zY3JpcHRzW2hdKXtnPWIuc2NyaXB0c1toXTtkZWxldGUgYi5zY3JpcHRzW2hdfXJldHVybiBnfHwiIn0pLnJlcGxhY2UoL1w8XCEtLSBFTFJURV9DT01NRU5UKFtcc1xTXSo/KSAtLVw+L2dpLCIkMSIpLnJlcGxhY2UodGhpcy5zZXJ2aWNlQ2xhc3NSZWdFeHAsZnVuY3Rpb24oayxyLGcscCl7dmFyIGc9Yi5wYXJzZUF0dHJzKGcpLGgscT0iIjtpZihnWyJjbGFzcyJdWyJlbHJ0ZS1tZWRpYSJdKXtoPWIuc2NyaXB0c1tnLnJlbF18fHt9O2gucGFyYW1zJiZhLmVhY2goaC5wYXJhbXMsZnVuY3Rpb24oaixvKXtxKz0iPHBhcmFtICIrYi5zZXJpYWxpemVBdHRycyhvKSsiPlxuIn0pO2guZW1iZWQmJihxKz0iPGVtYmVkICIrYi5zZXJpYWxpemVBdHRycyhoLmVtYmVkKSsiPiIpO2gub2JqJiYocT0iPG9iamVjdCAiK2Iuc2VyaWFsaXplQXR0cnMoaC5vYmopKyI+XG4iK3ErIlxuPC9vYmplY3Q+XG4iKTtyZXR1cm4gcXx8a31lbHNle2lmKGdbImNsYXNzIl1bImVscnRlLWdvb2dsZS1tYXBzIl0pe3ZhciBrPSIiO2lmKGIuc2NyaXB0c1tnLmlkXSl7az1iLnNjcmlwdHNbZy5pZF07ZGVsZXRlIGIuc2NyaXB0c1tnLmlkXX1yZXR1cm4ga31lbHNle2lmKGdbImNsYXNzIl1bImVscnRlLXBhZ2VicmVhayJdKXtyZXR1cm4iPCEtLSBwYWdlYnJlYWsgLS0+In19fWEuZWFjaChnWyJjbGFzcyJdLGZ1bmN0aW9uKGopey9eZWxydGUtXHcrL2kudGVzdChqKSYmZGVsZXRlIChnWyJjbGFzcyJdW2pdKX0pO3JldHVybiI8IityKyIgIitiLnNlcmlhbGl6ZUF0dHJzKGcpKyI+IisocHx8IiIpfSk7cmV0dXJuIGN9LGNvbXBhY3RTdHlsZXM6ZnVuY3Rpb24oYyl7dmFyIGI9dGhpcztyZXR1cm4gYy5yZXBsYWNlKHRoaXMudGFnUmVnRXhwLGZ1bmN0aW9uKGcsaixoLGYpe2Y9IWomJmY/Yi5zZXJpYWxpemVBdHRycyhiLnBhcnNlQXR0cnMoZiksdHJ1ZSk6IiI7cmV0dXJuIjwiK2oraC50b0xvd2VyQ2FzZSgpKyhmPyIgIjoiIikrZisiPiJ9KX0seGh0bWxUYWdzOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnhodG1sP2IucmVwbGFjZSgvPChpbWd8aHJ8YnJ8ZW1iZWR8cGFyYW18bGluaykoW14+XSpcLyopPi9naSwiPCQxJDIgLz4iKTpifX07ZWxSVEUucHJvdG90eXBlLmZpbHRlci5wcm90b3R5cGUuY2hhaW5zPXt3eXNpd3lnOlsiY2xlYW4iLCJhbGxvd2VkVGFncyIsInJlcGxhY2UiLCJkZW5pZWRUYWdzIiwiY29tcGFjdFN0eWxlcyJdLHNvdXJjZTpbImNsZWFuIiwiYWxsb3dlZFRhZ3MiLCJyZXN0b3JlIiwiY29tcGFjdFN0eWxlcyIsInhodG1sVGFncyJdLHBhc3RlOlsiY2xlYW4iLCJhbGxvd2VkVGFncyIsImNsZWFuUGFzdGUiLCJyZXBsYWNlIiwiZGVuaWVkVGFncyIsImNvbXBhY3RTdHlsZXMiXSx3eXNpd3lnMnd5c2l3eWc6WyJjbGVhbiIsImFsbG93ZWRUYWdzIiwicmVzdG9yZSIsInJlcGxhY2UiLCJkZW5pZWRUYWdzIiwiY29tcGFjdFN0eWxlcyJdLHNvdXJjZTJzb3VyY2U6WyJjbGVhbiIsImFsbG93ZWRUYWdzIiwicmVwbGFjZSIsImRlbmllZFRhZ3MiLCJyZXN0b3JlIiwiY29tcGFjdFN0eWxlcyIsInhodG1sVGFncyJdfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS5oaXN0b3J5PWZ1bmN0aW9uKGIpe3RoaXMucnRlPWI7dGhpcy5fcHJldj1bXTt0aGlzLl9uZXh0PVtdO3RoaXMuYWRkPWZ1bmN0aW9uKCl7aWYodGhpcy5ydGUub3B0aW9ucy5oaXN0b3J5TGVuZ3RoPjAmJnRoaXMuX3ByZXYubGVuZ3RoPj10aGlzLnJ0ZS5vcHRpb25zLmhpc3RvcnlMZW5ndGgpe3RoaXMuX3ByZXYuc2xpY2UodGhpcy5ydGUub3B0aW9ucy5oaXN0b3J5TGVuZ3RoKX12YXIgYz10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKTt0aGlzLl9wcmV2LnB1c2goW2EodGhpcy5ydGUuZG9jLmJvZHkpLmh0bWwoKSxjXSk7dGhpcy5ydGUuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGMpO3RoaXMuX25leHQ9W119O3RoaXMuYmFjaz1mdW5jdGlvbigpe2lmKHRoaXMuX3ByZXYubGVuZ3RoKXt2YXIgYz10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKSxmPXRoaXMuX3ByZXYucG9wKCk7dGhpcy5fbmV4dC5wdXNoKFthKHRoaXMucnRlLmRvYy5ib2R5KS5odG1sKCksY10pO2EodGhpcy5ydGUuZG9jLmJvZHkpLmh0bWwoZlswXSk7dGhpcy5ydGUuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGZbMV0pfX07dGhpcy5md2Q9ZnVuY3Rpb24oKXtpZih0aGlzLl9uZXh0Lmxlbmd0aCl7dmFyIGM9dGhpcy5ydGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCksZj10aGlzLl9uZXh0LnBvcCgpO3RoaXMuX3ByZXYucHVzaChbYSh0aGlzLnJ0ZS5kb2MuYm9keSkuaHRtbCgpLGNdKTthKHRoaXMucnRlLmRvYy5ib2R5KS5odG1sKGZbMF0pO3RoaXMucnRlLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhmWzFdKX19O3RoaXMuY2FuQmFjaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmV2Lmxlbmd0aH07dGhpcy5jYW5Gd2Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV4dC5sZW5ndGh9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS5vcHRpb25zPXtkb2N0eXBlOic8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4nLGNzc0NsYXNzOiJlbC1ydGUiLGNzc2ZpbGVzOltdLGhlaWdodDpudWxsLHJlc2l6YWJsZTp0cnVlLGxhbmc6ImVuIix0b29sYmFyOiJub3JtYWwiLGFic29sdXRlVVJMczp0cnVlLGFsbG93U291cmNlOnRydWUsc3RyaXBXaGl0ZVNwYWNlOnRydWUsc3R5bGVXaXRoQ1NTOmZhbHNlLGZtQWxsb3c6dHJ1ZSxmbU9wZW46bnVsbCxhbGxvd1RhZ3M6W10sZGVueVRhZ3M6WyJhcHBsZXQiLCJiYXNlIiwiYmFzZWZvbnQiLCJiZ3NvdW5kIiwiYmxpbmsiLCJib2R5IiwiY29sIiwiY29sZ3JvdXAiLCJpZnJhbWUiLCJpc2luZGV4IiwiZnJhbWVzZXQiLCJodG1sIiwiaGVhZCIsIm1ldGEiLCJtYXJxdWVlIiwibm9mcmFtZXMiLCJub2VtYmVkIiwibzpwIiwidGl0bGUiLCJ4bWwiXSxkZW55QXR0cjpbXSxwYXN0ZURlbnlBdHRyOlsiaWQiLCJuYW1lIiwiY2xhc3MiLCJzdHlsZSIsImxhbmd1YWdlIiwib25jbGljayIsIm9uZGJsY2xpY2siLCJvbmhvdmVyIiwib25rZXVwIiwib25rZXlkb3duIiwib25rZXlwcmVzcyJdLGFsbG93VGV4dE5vZGVzOmZhbHNlLGFsbG93QnJvd3NlcnNTcGVjU3R5bGVzOmZhbHNlLGFsbG93UGFzdGU6dHJ1ZSxwYXN0ZU9ubHlUZXh0OmZhbHNlLHJlcGxhY2U6W10scmVzdG9yZTpbXSxwYWdlYnJlYWs6JzxkaXYgc3R5bGU9InBhZ2UtYnJlYWstYWZ0ZXI6IGFsd2F5czsiPjwvZGl2PicsYnV0dG9uczp7c2F2ZToiU2F2ZSIsY29weToiQ29weSIsY3V0OiJDdXQiLGNzczoiQ3NzIHN0eWxlIGFuZCBjbGFzcyIscGFzdGU6IlBhc3RlIixwYXN0ZXRleHQ6IlBhc3RlIG9ubHkgdGV4dCIscGFzdGVmb3JtYXR0ZXh0OiJQYXN0ZSBmb3JtYXR0ZWQgdGV4dCIscmVtb3ZlZm9ybWF0OiJDbGVhbiBmb3JtYXQiLHVuZG86IlVuZG8gbGFzdCBhY3Rpb24iLHJlZG86IlJlZG8gcHJldmlvdXMgYWN0aW9uIixib2xkOiJCb2xkIixpdGFsaWM6Ikl0YWxpYyIsdW5kZXJsaW5lOiJVbmRlcmxpbmUiLHN0cmlrZXRocm91Z2g6IlN0cmlrZXRocm91Z2giLHN1cGVyc2NyaXB0OiJTdXBlcnNjcmlwdCIsc3Vic2NyaXB0OiJTdWJzY3JpcHQiLGp1c3RpZnlsZWZ0OiJBbGlnbiBsZWZ0IixqdXN0aWZ5cmlnaHQ6IkFpbGduIHJpZ2h0IixqdXN0aWZ5Y2VudGVyOiJBbGlnbiBjZW50ZXIiLGp1c3RpZnlmdWxsOiJBbGlnbiBmdWxsIixpbmRlbnQ6IkluZGVudCIsb3V0ZGVudDoiT3V0ZGVudCIscnRsOiJSaWdodCB0byBsZWZ0IixsdHI6IkxlZnQgdG8gcmlnaHQiLGZvcmVjb2xvcjoiRm9udCBjb2xvciIsaGlsaXRlY29sb3I6IkJhY2tncm91bmQgY29sb3IiLGZvcm1hdGJsb2NrOiJGb3JtYXQiLGZvbnRzaXplOiJGb250IHNpemUiLGZvbnRuYW1lOiJGb250IixpbnNlcnRvcmRlcmVkbGlzdDoiT3JkZXJlZCBsaXN0IixpbnNlcnR1bm9yZGVyZWRsaXN0OiJVbm9yZGVyZWQgbGlzdCIsaG9yaXpvbnRhbHJ1bGU6Ikhvcml6b250YWwgcnVsZSIsYmxvY2txdW90ZToiQmxvY2txdW90ZSIsZGl2OiJCbG9jayBlbGVtZW50IChESVYpIixsaW5rOiJMaW5rIix1bmxpbms6IkRlbGV0ZSBsaW5rIixhbmNob3I6IkJvb2ttYXJrIixpbWFnZToiSW1hZ2UiLHBhZ2VicmVhazoiUGFnZSBicmVhayIsc21pbGV5OiJTbWlsZXkiLGZsYXNoOiJGbGFzaCIsdGFibGU6IlRhYmxlIix0YWJsZXJtOiJEZWxldGUgdGFibGUiLHRhYmxlcHJvcHM6IlRhYmxlIHByb3BlcnRpZXMiLHRiY2VsbHByb3BzOiJUYWJsZSBjZWxsIHByb3BlcnRpZXMiLHRicm93YmVmb3JlOiJJbnNlcnQgcm93IGJlZm9yZSIsdGJyb3dhZnRlcjoiSW5zZXJ0IHJvdyBhZnRlciIsdGJyb3dybToiRGVsZXRlIHJvdyIsdGJjb2xiZWZvcmU6Ikluc2VydCBjb2x1bW4gYmVmb3JlIix0YmNvbGFmdGVyOiJJbnNlcnQgY29sdW1uIGFmdGVyIix0YmNvbHJtOiJEZWxldGUgY29sdW1uIix0YmNlbGxzbWVyZ2U6Ik1lcmdlIHRhYmxlIGNlbGxzIix0YmNlbGxzcGxpdDoiU3BsaXQgdGFibGUgY2VsbCIsZG9jc3RydWN0dXJlOiJUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUiLGVsZmluZGVyOiJPcGVuIGZpbGUgbWFuYWdlciIsZnVsbHNjcmVlbjoiVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUiLG5ic3A6Ik5vbiBicmVha2FibGUgc3BhY2UiLHN0b3BmbG9hdDoiU3RvcCBlbGVtZW50IGZsb2F0aW5nIixhYm91dDoiQWJvdXQgdGhpcyBzb2Z0d2FyZSJ9LHBhbmVsczp7c2F2ZTpbInNhdmUiXSxjb3B5cGFzdGU6WyJjb3B5IiwiY3V0IiwicGFzdGUiLCJwYXN0ZXRleHQiLCJwYXN0ZWZvcm1hdHRleHQiLCJyZW1vdmVmb3JtYXQiLCJkb2NzdHJ1Y3R1cmUiXSx1bmRvcmVkbzpbInVuZG8iLCJyZWRvIl0sc3R5bGU6WyJib2xkIiwiaXRhbGljIiwidW5kZXJsaW5lIiwic3RyaWtldGhyb3VnaCIsInN1YnNjcmlwdCIsInN1cGVyc2NyaXB0Il0sY29sb3JzOlsiZm9yZWNvbG9yIiwiaGlsaXRlY29sb3IiXSxhbGlnbm1lbnQ6WyJqdXN0aWZ5bGVmdCIsImp1c3RpZnljZW50ZXIiLCJqdXN0aWZ5cmlnaHQiLCJqdXN0aWZ5ZnVsbCJdLGluZGVudDpbIm91dGRlbnQiLCJpbmRlbnQiXSxmb3JtYXQ6WyJmb3JtYXRibG9jayIsImZvbnRzaXplIiwiZm9udG5hbWUiXSxsaXN0czpbImluc2VydG9yZGVyZWRsaXN0IiwiaW5zZXJ0dW5vcmRlcmVkbGlzdCJdLGVsZW1lbnRzOlsiaG9yaXpvbnRhbHJ1bGUiLCJibG9ja3F1b3RlIiwiZGl2Iiwic3RvcGZsb2F0IiwiY3NzIiwibmJzcCIsInNtaWxleSIsInBhZ2VicmVhayJdLGRpcmVjdGlvbjpbImx0ciIsInJ0bCJdLGxpbmtzOlsibGluayIsInVubGluayIsImFuY2hvciJdLGltYWdlczpbImltYWdlIl0sbWVkaWE6WyJpbWFnZSIsImZsYXNoIl0sdGFibGVzOlsidGFibGUiLCJ0YWJsZXByb3BzIiwidGFibGVybSIsInRicm93YmVmb3JlIiwidGJyb3dhZnRlciIsInRicm93cm0iLCJ0YmNvbGJlZm9yZSIsInRiY29sYWZ0ZXIiLCJ0YmNvbHJtIiwidGJjZWxscHJvcHMiLCJ0YmNlbGxzbWVyZ2UiLCJ0YmNlbGxzcGxpdCJdLGVsZmluZGVyOlsiZWxmaW5kZXIiXSxmdWxsc2NyZWVuOlsiZnVsbHNjcmVlbiIsImFib3V0Il19LHRvb2xiYXJzOnt0aW55Olsic3R5bGUiXSxjb21wYWN0Olsic2F2ZSIsInVuZG9yZWRvIiwic3R5bGUiLCJhbGlnbm1lbnQiLCJsaXN0cyIsImxpbmtzIiwiZnVsbHNjcmVlbiJdLG5vcm1hbDpbInNhdmUiLCJjb3B5cGFzdGUiLCJ1bmRvcmVkbyIsInN0eWxlIiwiYWxpZ25tZW50IiwiY29sb3JzIiwiaW5kZW50IiwibGlzdHMiLCJsaW5rcyIsImVsZW1lbnRzIiwiaW1hZ2VzIiwiZnVsbHNjcmVlbiJdLGNvbXBsZXRlOlsic2F2ZSIsImNvcHlwYXN0ZSIsInVuZG9yZWRvIiwic3R5bGUiLCJhbGlnbm1lbnQiLCJjb2xvcnMiLCJmb3JtYXQiLCJpbmRlbnQiLCJsaXN0cyIsImxpbmtzIiwiZWxlbWVudHMiLCJtZWRpYSIsImZ1bGxzY3JlZW4iXSxtYXhpOlsic2F2ZSIsImNvcHlwYXN0ZSIsInVuZG9yZWRvIiwiZWxmaW5kZXIiLCJzdHlsZSIsImFsaWdubWVudCIsImRpcmVjdGlvbiIsImNvbG9ycyIsImZvcm1hdCIsImluZGVudCIsImxpc3RzIiwibGlua3MiLCJlbGVtZW50cyIsIm1lZGlhIiwidGFibGVzIiwiZnVsbHNjcmVlbiJdLGVsZG9yYWRvOlsic2F2ZSIsImNvcHlwYXN0ZSIsImVsZmluZGVyIiwidW5kb3JlZG8iLCJzdHlsZSIsImFsaWdubWVudCIsImNvbG9ycyIsImZvcm1hdCIsImluZGVudCIsImxpc3RzIiwibGlua3MiLCJlbGVtZW50cyIsIm1lZGlhIiwidGFibGVzIiwiZnVsbHNjcmVlbiJdfSxwYW5lbE5hbWVzOntzYXZlOiJTYXZlIixjb3B5cGFzdGU6IkNvcHkvUGFzZSIsdW5kb3JlZG86IlVuZG8vUmVkbyIsc3R5bGU6IlRleHQgc3R5bGVzIixjb2xvcnM6IkNvbG9ycyIsYWxpZ25tZW50OiJBbGlnbm1lbnQiLGluZGVudDoiSW5kZW50L091dGRlbnQiLGZvcm1hdDoiVGV4dCBmb3JtYXQiLGxpc3RzOiJMaXN0cyIsZWxlbWVudHM6Ik1pc2MgZWxlbWVudHMiLGRpcmVjdGlvbjoiU2NyaXB0IGRpcmVjdGlvbiIsbGlua3M6IkxpbmtzIixpbWFnZXM6IkltYWdlcyIsbWVkaWE6Ik1lZGlhIix0YWJsZXM6IlRhYmxlcyIsZWxmaW5kZXI6IkZpbGUgbWFuYWdlciAoZWxGaW5kZXIpIn19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnNlbGVjdGlvbj1mdW5jdGlvbihnKXt0aGlzLnJ0ZT1nO3ZhciBjPXRoaXM7dGhpcy53M2NSYW5nZT1udWxsO3ZhciBvLGIsaixrO2EodGhpcy5ydGUuZG9jKS5rZXl1cChmdW5jdGlvbihwKXtpZihwLmN0cmxLZXl8fHAubWV0YUtleXx8KHAua2V5Q29kZT49OCYmcC5rZXlDb2RlPD0xMyl8fChwLmtleUNvZGU+PTMyJiZwLmtleUNvZGU8PTQwKXx8cC5rZXlDb2RlPT00Nnx8KHAua2V5Q29kZT49OTYmJnAua2V5Q29kZTw9MTExKSl7Yy5jbGVhbkNhY2hlKCl9fSkubW91c2Vkb3duKGZ1bmN0aW9uKHApe2lmKHAudGFyZ2V0Lm5vZGVOYW1lPT0iSFRNTCIpe289Yy5ydGUuZG9jLmJvZHl9ZWxzZXtvPXAudGFyZ2V0fWI9aj1udWxsfSkubW91c2V1cChmdW5jdGlvbihwKXtpZihwLnRhcmdldC5ub2RlTmFtZT09IkhUTUwiKXtiPWMucnRlLmRvYy5ib2R5fWVsc2V7Yj1wLnRhcmdldH1iPXAudGFyZ2V0O2o9bnVsbH0pLmNsaWNrKCk7ZnVuY3Rpb24gaCgpe3JldHVybiBjLnJ0ZS53aW5kb3cuZ2V0U2VsZWN0aW9uP2MucnRlLndpbmRvdy5nZXRTZWxlY3Rpb24oKTpjLnJ0ZS53aW5kb3cuZG9jdW1lbnQuc2VsZWN0aW9ufWZ1bmN0aW9uIGYodCxyLHEpe3doaWxlKHQubm9kZU5hbWUhPSJCT0RZIiYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUubm9kZU5hbWUhPSJCT0RZIiYmKHI/dCE9PXImJnQucGFyZW50Tm9kZSE9cjoxKSYmKChxPT0ibGVmdCImJmMucnRlLmRvbS5pc0ZpcnN0Tm90RW1wdHkodCkpfHwocT09InJpZ2h0IiYmYy5ydGUuZG9tLmlzTGFzdE5vdEVtcHR5KHQpKXx8KGMucnRlLmRvbS5pc0ZpcnN0Tm90RW1wdHkodCkmJmMucnRlLmRvbS5pc0xhc3ROb3RFbXB0eSh0KSkpKXt0PXQucGFyZW50Tm9kZX1yZXR1cm4gdH10aGlzLmNvbGxhcHNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhbmdlQXQoKS5pc0NvbGxhcHNlZCgpfTt0aGlzLmNvbGxhcHNlPWZ1bmN0aW9uKHApe3ZhciBxPWgoKSx0PXRoaXMuZ2V0UmFuZ2VBdCgpO3QuY29sbGFwc2UocD90cnVlOmZhbHNlKTtpZighYS5icm93c2VyLm1zaWUpe3EucmVtb3ZlQWxsUmFuZ2VzKCk7cS5hZGRSYW5nZSh0KX1yZXR1cm4gdGhpc307dGhpcy5nZXRSYW5nZUF0PWZ1bmN0aW9uKHQpe2lmKHRoaXMucnRlLmJyb3dzZXIubXNpZSl7aWYoIXRoaXMudzNjUmFuZ2Upe3RoaXMudzNjUmFuZ2U9bmV3IHRoaXMucnRlLnczY1JhbmdlKHRoaXMucnRlKX10JiZ0aGlzLnczY1JhbmdlLnVwZGF0ZSgpO3JldHVybiB0aGlzLnczY1JhbmdlfXZhciBwPWgoKTt2YXIgcT1wLnJhbmdlQ291bnQ+MD9wLmdldFJhbmdlQXQoMCk6dGhpcy5ydGUuZG9jLmNyZWF0ZVJhbmdlKCk7cS5nZXRTdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlPT0xP3RoaXMuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tNYXRoLm1pbih0aGlzLnN0YXJ0T2Zmc2V0LHRoaXMuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGgtMSldOnRoaXMuc3RhcnRDb250YWluZXJ9O3EuZ2V0RW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kQ29udGFpbmVyLm5vZGVUeXBlPT0xP3RoaXMuZW5kQ29udGFpbmVyLmNoaWxkTm9kZXNbTWF0aC5taW4odGhpcy5zdGFydE9mZnNldD09dGhpcy5lbmRPZmZzZXQ/dGhpcy5lbmRPZmZzZXQ6dGhpcy5lbmRPZmZzZXQtMSx0aGlzLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aC0xKV06dGhpcy5lbmRDb250YWluZXJ9O3EuaXNDb2xsYXBzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xsYXBzZWR9O3JldHVybiBxfTt0aGlzLnNhdmVJRVJhbmdlPWZ1bmN0aW9uKCl7aWYoYS5icm93c2VyLm1zaWUpe2s9dGhpcy5nZXRSYW5nZUF0KCkuZ2V0Qm9va21hcmsoKX19O3RoaXMucmVzdG9yZUlFUmFuZ2U9ZnVuY3Rpb24oKXthLmJyb3dzZXIubXNpZSYmayYmdGhpcy5nZXRSYW5nZUF0KCkubW92ZVRvQm9va21hcmsoayl9O3RoaXMuY2xvbmVDb250ZW50cz1mdW5jdGlvbigpe3ZhciB2PXRoaXMucnRlLmRvbS5jcmVhdGUoImRpdiIpLHEsdSxwO2lmKGEuYnJvd3Nlci5tc2llKXt0cnl7cT10aGlzLnJ0ZS53aW5kb3cuZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCl9Y2F0Y2godCl7cT10aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKX1hKHYpLmh0bWwocS5odG1sVGV4dCl9ZWxzZXt1PXRoaXMuZ2V0UmFuZ2VBdCgpLmNsb25lQ29udGVudHMoKTtmb3IocD0wO3A8dS5jaGlsZE5vZGVzLmxlbmd0aDtwKyspe3YuYXBwZW5kQ2hpbGQodS5jaGlsZE5vZGVzW3BdLmNsb25lTm9kZSh0cnVlKSl9fXJldHVybiB2fTt0aGlzLnNlbGVjdD1mdW5jdGlvbih0LHcpe3c9d3x8dDtpZih0aGlzLnJ0ZS5icm93c2VyLm1zaWUpe3ZhciB1PXRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpLHE9dS5kdXBsaWNhdGUoKSxwPXUuZHVwbGljYXRlKCk7cS5tb3ZlVG9FbGVtZW50VGV4dCh0KTtwLm1vdmVUb0VsZW1lbnRUZXh0KHcpO3Uuc2V0RW5kUG9pbnQoIlN0YXJ0VG9TdGFydCIscSk7dS5zZXRFbmRQb2ludCgiRW5kVG9FbmQiLHApO3Uuc2VsZWN0KCl9ZWxzZXt2YXIgdj1oKCksdT10aGlzLmdldFJhbmdlQXQoKTt1LnNldFN0YXJ0QmVmb3JlKHQpO3Uuc2V0RW5kQWZ0ZXIodyk7di5yZW1vdmVBbGxSYW5nZXMoKTt2LmFkZFJhbmdlKHUpfXJldHVybiB0aGlzLmNsZWFuQ2FjaGUoKX07dGhpcy5zZWxlY3RDb250ZW50cz1mdW5jdGlvbih1KXt2YXIgcT10aGlzLmdldFJhbmdlQXQoKTtpZih1JiZ1Lm5vZGVUeXBlPT0xKXtpZih0aGlzLnJ0ZS5icm93c2VyLm1zaWUpe3EucmFuZ2UoKTtxLnIubW92ZVRvRWxlbWVudFRleHQodS5wYXJlbnROb2RlKTtxLnIuc2VsZWN0KCl9ZWxzZXt0cnl7cS5zZWxlY3ROb2RlQ29udGVudHModSl9Y2F0Y2godCl7cmV0dXJuIHRoaXMucnRlLmxvZygidW5hYmxlIHNlbGVjdCBub2RlIGNvbnRlbnRzICIrdSl9dmFyIHA9aCgpO3AucmVtb3ZlQWxsUmFuZ2VzKCk7cC5hZGRSYW5nZShxKX19cmV0dXJuIHRoaXN9O3RoaXMuZGVsZXRlQ29udGVudHM9ZnVuY3Rpb24oKXtpZighYS5icm93c2VyLm1zaWUpe3RoaXMuZ2V0UmFuZ2VBdCgpLmRlbGV0ZUNvbnRlbnRzKCl9cmV0dXJuIHRoaXN9O3RoaXMuaW5zZXJ0Tm9kZT1mdW5jdGlvbih2LHUpe2lmKHUmJiF0aGlzLmNvbGxhcHNlZCgpKXt0aGlzLmNvbGxhcHNlKCl9aWYodGhpcy5ydGUuYnJvd3Nlci5tc2llKXt2YXIgcD12Lm5vZGVUeXBlPT0zP3Yubm9kZVZhbHVlOmEodGhpcy5ydGUuZG9tLmNyZWF0ZSgic3BhbiIpKS5hcHBlbmQoYSh2KSkuaHRtbCgpO3ZhciB0PXRoaXMuZ2V0UmFuZ2VBdCgpO3QuaW5zZXJ0Tm9kZShwKX1lbHNle3ZhciB0PXRoaXMuZ2V0UmFuZ2VBdCgpO3QuaW5zZXJ0Tm9kZSh2KTt0LnNldFN0YXJ0QWZ0ZXIodik7dC5zZXRFbmRBZnRlcih2KTt2YXIgcT1oKCk7cS5yZW1vdmVBbGxSYW5nZXMoKTtxLmFkZFJhbmdlKHQpfXJldHVybiB0aGlzLmNsZWFuQ2FjaGUoKX07dGhpcy5pbnNlcnRIdG1sPWZ1bmN0aW9uKHAscSl7aWYocSYmIXRoaXMuY29sbGFwc2VkKCkpe3RoaXMuY29sbGFwc2UoKX1pZih0aGlzLnJ0ZS5icm93c2VyLm1zaWUpe3RoaXMuZ2V0UmFuZ2VBdCgpLnJhbmdlKCkucGFzdGVIVE1MKHApfWVsc2V7dmFyIHI9YSh0aGlzLnJ0ZS5kb20uY3JlYXRlKCJzcGFuIikpLmh0bWwocHx8IiIpLmdldCgwKTt0aGlzLmluc2VydE5vZGUocik7YShyKS5yZXBsYWNlV2l0aChhKHIpLmh0bWwoKSl9cmV0dXJuIHRoaXMuY2xlYW5DYWNoZSgpfTt0aGlzLmluc2VydFRleHQ9ZnVuY3Rpb24ocSxwKXt2YXIgcj10aGlzLnJ0ZS5kb2MuY3JlYXRlVGV4dE5vZGUocSk7cmV0dXJuIHRoaXMuaW5zZXJ0SHRtbChyLm5vZGVWYWx1ZSl9O3RoaXMuZ2V0Qm9va21hcms9ZnVuY3Rpb24oKXt0aGlzLnJ0ZS53aW5kb3cuZm9jdXMoKTt2YXIgcCx2LHQseix3LEE9dGhpcy5ydGUuZG9tLmNyZWF0ZUJvb2ttYXJrKCkseD10aGlzLnJ0ZS5kb20uY3JlYXRlQm9va21hcmsoKTtpZihhLmJyb3dzZXIubXNpZSl7dHJ5e3A9dGhpcy5ydGUud2luZG93LmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpfWNhdGNoKHgpe3A9dGhpcy5ydGUuZG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCl9aWYocC5pdGVtKXt2YXIgdT1wLml0ZW0oMCk7cD10aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTtwLm1vdmVUb0VsZW1lbnRUZXh0KHUpfXY9cC5kdXBsaWNhdGUoKTt0PXAuZHVwbGljYXRlKCk7ej10aGlzLnJ0ZS5kb20uY3JlYXRlKCJzcGFuIik7dz10aGlzLnJ0ZS5kb20uY3JlYXRlKCJzcGFuIik7ei5hcHBlbmRDaGlsZChBKTt3LmFwcGVuZENoaWxkKHgpO3YuY29sbGFwc2UodHJ1ZSk7di5wYXN0ZUhUTUwoei5pbm5lckhUTUwpO3QuY29sbGFwc2UoZmFsc2UpO3QucGFzdGVIVE1MKHcuaW5uZXJIVE1MKX1lbHNle3ZhciBxPWgoKTt2YXIgcD1xLnJhbmdlQ291bnQ+MD9xLmdldFJhbmdlQXQoMCk6dGhpcy5ydGUuZG9jLmNyZWF0ZVJhbmdlKCk7dj1wLmNsb25lUmFuZ2UoKTt0PXAuY2xvbmVSYW5nZSgpO3QuY29sbGFwc2UoZmFsc2UpO3QuaW5zZXJ0Tm9kZSh4KTt2LmNvbGxhcHNlKHRydWUpO3YuaW5zZXJ0Tm9kZShBKTt0aGlzLnNlbGVjdChBLHgpfXJldHVybltBLmlkLHguaWRdfTt0aGlzLm1vdmVUb0Jvb2ttYXJrPWZ1bmN0aW9uKHApe3RoaXMucnRlLndpbmRvdy5mb2N1cygpO2lmKHAmJnAubGVuZ3RoPT0yKXt2YXIgcT10aGlzLnJ0ZS5kb2MuZ2V0RWxlbWVudEJ5SWQocFswXSksdj10aGlzLnJ0ZS5kb2MuZ2V0RWxlbWVudEJ5SWQocFsxXSksdSx0O2lmKHEmJnYpe3RoaXMuc2VsZWN0KHEsdik7aWYodGhpcy5ydGUuZG9tLm5leHQocSk9PXYpe3RoaXMuY29sbGFwc2UodHJ1ZSl9aWYoIWEuYnJvd3Nlci5tc2llKXt1PWgoKTt0PXUucmFuZ2VDb3VudD4wP3UuZ2V0UmFuZ2VBdCgwKTp0aGlzLnJ0ZS5kb2MuY3JlYXRlUmFuZ2UoKTt1LnJlbW92ZUFsbFJhbmdlcygpO3UuYWRkUmFuZ2UodCl9cS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHEpO3YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh2KX19cmV0dXJuIHRoaXN9O3RoaXMucmVtb3ZlQm9va21hcms9ZnVuY3Rpb24ocCl7dGhpcy5ydGUud2luZG93LmZvY3VzKCk7aWYocC5sZW5ndGg9PTIpe3ZhciBxPXRoaXMucnRlLmRvYy5nZXRFbGVtZW50QnlJZChwWzBdKSxyPXRoaXMucnRlLmRvYy5nZXRFbGVtZW50QnlJZChwWzFdKTtpZihxJiZyKXtxLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocSk7ci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpfX19O3RoaXMuY2xlYW5DYWNoZT1mdW5jdGlvbigpe289Yj1qPW51bGw7cmV0dXJuIHRoaXN9O3RoaXMuZ2V0U3RhcnQ9ZnVuY3Rpb24oKXtpZighbyl7dmFyIHA9dGhpcy5nZXRSYW5nZUF0KCk7bz1wLmdldFN0YXJ0KCl9cmV0dXJuIG99O3RoaXMuZ2V0RW5kPWZ1bmN0aW9uKCl7aWYoIWIpe3ZhciBwPXRoaXMuZ2V0UmFuZ2VBdCgpO2I9cC5nZXRFbmQoKX1yZXR1cm4gYn07dGhpcy5nZXROb2RlPWZ1bmN0aW9uKCl7aWYoIWope2o9dGhpcy5ydGUuZG9tLmZpbmRDb21tb25BbmNlc3Rvcih0aGlzLmdldFN0YXJ0KCksdGhpcy5nZXRFbmQoKSl9cmV0dXJuIGp9O3RoaXMuc2VsZWN0ZWQ9ZnVuY3Rpb24ocil7dmFyIHA9e2NvbGxhcHNlZDpmYWxzZSxibG9ja3M6ZmFsc2UsZmlsdGVyOmZhbHNlLHdyYXA6InRleHQiLHRhZzoic3BhbiJ9O3A9YS5leHRlbmQoe30scCxyKTtpZihwLmJsb2Nrcyl7dmFyIHY9dGhpcy5nZXROb2RlKCksdT1udWxsO2lmKHU9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh2LCJzZWxlY3Rpb25CbG9jayIpKXtyZXR1cm5bdV19fXZhciB0PXRoaXMuc2VsZWN0ZWRSYXcocC5jb2xsYXBzZWQscC5ibG9ja3MpO3ZhciBBPVtdO3ZhciB3PVtdO3ZhciBCPW51bGw7ZnVuY3Rpb24gcSgpe2Z1bmN0aW9uIEQoKXtmb3IodmFyIEY9MDtGPHcubGVuZ3RoO0YrKyl7aWYod1tGXS5ub2RlVHlwZT09MSYmKGMucnRlLmRvbS5zZWxmT3JQYXJlbnQod1tGXSwvXlAkLyl8fGEod1tGXSkuZmluZCgicCIpLmxlbmd0aD4wKSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX1pZih3Lmxlbmd0aD4wKXt2YXIgQz1wLnRhZz09InAiJiYhRCgpPyJkaXYiOnAudGFnO3ZhciBFPWMucnRlLmRvbS53cmFwKHcsQyk7QVtCXT1FO0I9bnVsbDt3PVtdfX1mdW5jdGlvbiB6KEUpe2lmKEUubm9kZVR5cGU9PTEpe2lmKC9eKFRIRUFEfFRGT09UfFRCT0RZfENPTHxDT0xHUk9VUHxUUikkLy50ZXN0KEUubm9kZU5hbWUpKXthKEUpLmZpbmQoInRkLHRoIikuZWFjaChmdW5jdGlvbigpe3ZhciBGPXAudGFnPT0icCImJmEodGhpcykuZmluZCgicCIpLmxlbmd0aD4wPyJkaXYiOnAudGFnO3ZhciBHPWMucnRlLmRvbS53cmFwQ29udGVudHModGhpcyxGKTtyZXR1cm4gQS5wdXNoKEcpfSl9ZWxzZXtpZigvXihDQVBUSU9OfFREfFRIfExJfERUfEREKSQvLnRlc3QoRS5ub2RlTmFtZSkpe3ZhciBDPXAudGFnPT0icCImJmEoRSkuZmluZCgicCIpLmxlbmd0aD4wPyJkaXYiOnAudGFnO3ZhciBFPWMucnRlLmRvbS53cmFwQ29udGVudHMoRSxDKTtyZXR1cm4gQS5wdXNoKEUpfX19dmFyIEQ9dy5sZW5ndGg+MD93W3cubGVuZ3RoLTFdOm51bGw7aWYoRCYmRCE9Yy5ydGUuZG9tLnByZXYoRSkpe3EoKX13LnB1c2goRSk7aWYoQj09PW51bGwpe0I9QS5sZW5ndGg7QS5wdXNoKCJkdW1teSIpfX1pZih0Lm5vZGVzLmxlbmd0aD4wKXtmb3IodmFyIHg9MDt4PHQubm9kZXMubGVuZ3RoO3grKyl7dmFyIHY9dC5ub2Rlc1t4XTtpZih2Lm5vZGVUeXBlPT0zJiYoeD09MHx8eD09dC5ub2Rlcy5sZW5ndGgtMSkmJmEudHJpbSh2Lm5vZGVWYWx1ZSkubGVuZ3RoPjApe2lmKHg9PTAmJnQuc28+MCl7dj12LnNwbGl0VGV4dCh0LnNvKX1pZih4PT10Lm5vZGVzLmxlbmd0aC0xJiZ0LmVvPjApe3Yuc3BsaXRUZXh0KHg9PTAmJnQuc28+MD90LmVvLXQuc286dC5lbyl9fXN3aXRjaChwLndyYXApe2Nhc2UidGV4dCI6aWYoKHYubm9kZVR5cGU9PTEmJnYubm9kZU5hbWU9PSJCUiIpfHwodi5ub2RlVHlwZT09MyYmYS50cmltKHYubm9kZVZhbHVlKS5sZW5ndGg+MCkpe3oodil9ZWxzZXtpZih2Lm5vZGVUeXBlPT0xKXtBLnB1c2godil9fWJyZWFrO2Nhc2UiaW5saW5lIjppZih0aGlzLnJ0ZS5kb20uaXNJbmxpbmUodikpe3oodil9ZWxzZXtpZih2Lm5vZGVUeXBlPT0xKXtBLnB1c2godil9fWJyZWFrO2Nhc2UiYWxsIjppZih2Lm5vZGVUeXBlPT0xfHwhdGhpcy5ydGUuZG9tLmlzRW1wdHkodikpe3oodil9YnJlYWs7ZGVmYXVsdDppZih2Lm5vZGVUeXBlPT0xfHwhdGhpcy5ydGUuZG9tLmlzRW1wdHkodikpe0EucHVzaCh2KX19fXEoKX1pZihBLmxlbmd0aCl7dGhpcy5ydGUud2luZG93LmZvY3VzKCk7dGhpcy5zZWxlY3QoQVswXSxBW0EubGVuZ3RoLTFdKX1yZXR1cm4gcC5maWx0ZXI/dGhpcy5ydGUuZG9tLmZpbHRlcihBLHAuZmlsdGVyKTpBfTt0aGlzLmR1bXA9ZnVuY3Rpb24ocCx0LHcsdixxKXt2YXIgdT10aGlzLmdldFJhbmdlQXQoKTt0aGlzLnJ0ZS5sb2coImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIik7dGhpcy5ydGUubG9nKHB8fHUuY29tbW9uQW5jZXN0b3JDb250YWluZXIpO3RoaXMucnRlLmxvZygic3RhcnRDb250YWluZXIiKTt0aGlzLnJ0ZS5sb2codHx8dS5zdGFydENvbnRhaW5lcik7dGhpcy5ydGUubG9nKCJzdGFydE9mZnNldDogIisodj49MD92OnUuc3RhcnRPZmZzZXQpKTt0aGlzLnJ0ZS5sb2coImVuZENvbnRhaW5lciIpO3RoaXMucnRlLmxvZyh3fHx1LmVuZENvbnRhaW5lcik7dGhpcy5ydGUubG9nKCJlbmRPZmZzZXQ6ICIrKHE+PTA/cTp1LmVuZE9mZnNldCkpfTt0aGlzLnNlbGVjdGVkUmF3PWZ1bmN0aW9uKHoscCl7dmFyIEY9e3NvOm51bGwsZW86bnVsbCxub2RlczpbXX07dmFyIHE9dGhpcy5nZXRSYW5nZUF0KHRydWUpO3ZhciB3PXEuY29tbW9uQW5jZXN0b3JDb250YWluZXI7dmFyIEgsRTt2YXIgRD1mYWxzZTt2YXIgQj1mYWxzZTtmdW5jdGlvbiBDKEoscixJKXtpZihKLm5vZGVUeXBlPT0zKXtJPUk+PTA/STpKLm5vZGVWYWx1ZS5sZW5ndGg7cmV0dXJuKHI9PTAmJkk9PUoubm9kZVZhbHVlLmxlbmd0aCl8fGEudHJpbShKLm5vZGVWYWx1ZSkubGVuZ3RoPT1hLnRyaW0oSi5ub2RlVmFsdWUuc3Vic3RyaW5nKHIsSSkpLmxlbmd0aH1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiB4KEoscixJKXtpZihKLm5vZGVUeXBlPT0xKXtyZXR1cm4gYy5ydGUuZG9tLmlzRW1wdHkoSil9ZWxzZXtpZihKLm5vZGVUeXBlPT0zKXtyZXR1cm4gYS50cmltKEoubm9kZVZhbHVlLnN1YnN0cmluZyhyfHwwLEk+PTA/STpKLm5vZGVWYWx1ZS5sZW5ndGgpKS5sZW5ndGg9PTB9fXJldHVybiB0cnVlfWlmKHEuc3RhcnRDb250YWluZXIubm9kZVR5cGU9PTEpe2lmKHEuc3RhcnRPZmZzZXQ8cS5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCl7SD1xLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbcS5zdGFydE9mZnNldF07Ri5zbz1ILm5vZGVUeXBlPT0xP251bGw6MH1lbHNle0g9cS5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3Euc3RhcnRPZmZzZXQtMV07Ri5zbz1ILm5vZGVUeXBlPT0xP251bGw6SC5ub2RlVmFsdWUubGVuZ3RofX1lbHNle0g9cS5zdGFydENvbnRhaW5lcjtGLnNvPXEuc3RhcnRPZmZzZXR9aWYocS5jb2xsYXBzZWQpe2lmKHope2lmKHApe0g9ZihIKTtpZighdGhpcy5ydGUuZG9tLmlzRW1wdHkoSCl8fChIPXRoaXMucnRlLmRvbS5uZXh0KEgpKSl7Ri5ub2Rlcz1bSF19aWYodGhpcy5ydGUuZG9tLmlzSW5saW5lKEgpKXtGLm5vZGVzPXRoaXMucnRlLmRvbS50b0xpbmVTdGFydChIKS5jb25jYXQoRi5ub2Rlcyx0aGlzLnJ0ZS5kb20udG9MaW5lRW5kKEgpKX1pZihGLm5vZGVzLmxlbmd0aD4wKXtGLnNvPUYubm9kZXNbMF0ubm9kZVR5cGU9PTE/bnVsbDowO0YuZW89Ri5ub2Rlc1tGLm5vZGVzLmxlbmd0aC0xXS5ub2RlVHlwZT09MT9udWxsOkYubm9kZXNbRi5ub2Rlcy5sZW5ndGgtMV0ubm9kZVZhbHVlLmxlbmd0aH19ZWxzZXtpZighdGhpcy5ydGUuZG9tLmlzRW1wdHkoSCkpe0Yubm9kZXM9W0hdfX19cmV0dXJuIEZ9aWYocS5lbmRDb250YWluZXIubm9kZVR5cGU9PTEpe0U9cS5lbmRDb250YWluZXIuY2hpbGROb2Rlc1txLmVuZE9mZnNldC0xXTtGLmVvPUUubm9kZVR5cGU9PTE/bnVsbDpFLm5vZGVWYWx1ZS5sZW5ndGh9ZWxzZXtFPXEuZW5kQ29udGFpbmVyO0YuZW89cS5lbmRPZmZzZXR9aWYoSC5ub2RlVHlwZT09MXx8cHx8QyhILEYuc28sSC5ub2RlVmFsdWUubGVuZ3RoKSl7SD1mKEgsdywibGVmdCIpO0Q9dHJ1ZTtGLnNvPUgubm9kZVR5cGU9PTE/bnVsbDowfWlmKEUubm9kZVR5cGU9PTF8fHB8fEMoRSwwLEYuZW8pKXtFPWYoRSx3LCJyaWdodCIpO0I9dHJ1ZTtGLmVvPUUubm9kZVR5cGU9PTE/bnVsbDpFLm5vZGVWYWx1ZS5sZW5ndGh9aWYocCl7aWYoSC5ub2RlVHlwZSE9MSYmSC5wYXJlbnROb2RlIT13JiZILnBhcmVudE5vZGUubm9kZU5hbWUhPSJCT0RZIil7SD1ILnBhcmVudE5vZGU7Ri5zbz1udWxsfWlmKEUubm9kZVR5cGUhPTEmJkUucGFyZW50Tm9kZSE9dyYmRS5wYXJlbnROb2RlLm5vZGVOYW1lIT0iQk9EWSIpe0U9RS5wYXJlbnROb2RlO0YuZW89bnVsbH19aWYoSC5wYXJlbnROb2RlPT1FLnBhcmVudE5vZGUmJkgucGFyZW50Tm9kZS5ub2RlTmFtZSE9IkJPRFkiJiYoRCYmdGhpcy5ydGUuZG9tLmlzRmlyc3ROb3RFbXB0eShIKSkmJihCJiZ0aGlzLnJ0ZS5kb20uaXNMYXN0Tm90RW1wdHkoRSkpKXtIPUU9SC5wYXJlbnROb2RlO0Yuc289SC5ub2RlVHlwZT09MT9udWxsOjA7Ri5lbz1FLm5vZGVUeXBlPT0xP251bGw6RS5ub2RlVmFsdWUubGVuZ3RofWlmKEg9PUUpe2lmKCF0aGlzLnJ0ZS5kb20uaXNFbXB0eShIKSl7Ri5ub2Rlcy5wdXNoKEgpfXJldHVybiBGfXZhciB0PUg7d2hpbGUodC5ub2RlTmFtZSE9IkJPRFkiJiZ0LnBhcmVudE5vZGUhPT13JiZ0LnBhcmVudE5vZGUubm9kZU5hbWUhPSJCT0RZIil7dD10LnBhcmVudE5vZGV9dmFyIEc9RTt3aGlsZShHLm5vZGVOYW1lIT0iQk9EWSImJkcucGFyZW50Tm9kZSE9PXcmJkcucGFyZW50Tm9kZS5ub2RlTmFtZSE9IkJPRFkiKXtHPUcucGFyZW50Tm9kZX1pZigheChILEYuc28sSC5ub2RlVHlwZT09Mz9ILm5vZGVWYWx1ZS5sZW5ndGg6bnVsbCkpe0Yubm9kZXMucHVzaChIKX12YXIgdj1IO3doaWxlKHYhPT10KXt2YXIgdT12O3doaWxlKCh1PXRoaXMucnRlLmRvbS5uZXh0KHUpKSl7Ri5ub2Rlcy5wdXNoKHUpfXY9di5wYXJlbnROb2RlfXY9dDt3aGlsZSgodj10aGlzLnJ0ZS5kb20ubmV4dCh2KSkmJnYhPUcpe0Yubm9kZXMucHVzaCh2KX12YXIgQT1bXTt2PUU7d2hpbGUodiE9PUcpe3ZhciB1PXY7d2hpbGUoKHU9dGhpcy5ydGUuZG9tLnByZXYodSkpKXtBLnB1c2godSl9dj12LnBhcmVudE5vZGV9aWYoQS5sZW5ndGgpe0Yubm9kZXM9Ri5ub2Rlcy5jb25jYXQoQS5yZXZlcnNlKCkpfWlmKCF4KEUsMCxFLm5vZGVUeXBlPT0zP0YuZW86bnVsbCkpe0Yubm9kZXMucHVzaChFKX1pZihwKXtpZih0aGlzLnJ0ZS5kb20uaXNJbmxpbmUoSCkpe0Yubm9kZXM9dGhpcy5ydGUuZG9tLnRvTGluZVN0YXJ0KEgpLmNvbmNhdChGLm5vZGVzKTtGLnNvPUYubm9kZXNbMF0ubm9kZVR5cGU9PTE/bnVsbDowfWlmKHRoaXMucnRlLmRvbS5pc0lubGluZShFKSl7Ri5ub2Rlcz1GLm5vZGVzLmNvbmNhdCh0aGlzLnJ0ZS5kb20udG9MaW5lRW5kKEUpKTtGLmVvPUYubm9kZXNbRi5ub2Rlcy5sZW5ndGgtMV0ubm9kZVR5cGU9PTE/bnVsbDpGLm5vZGVzW0Yubm9kZXMubGVuZ3RoLTFdLm5vZGVWYWx1ZS5sZW5ndGh9fXJldHVybiBGfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWk9ZnVuY3Rpb24oZil7dGhpcy5ydGU9Zjt0aGlzLl9idXR0b25zPVtdO3ZhciB2PXRoaXMsbz10aGlzLnJ0ZS5vcHRpb25zLnRvb2xiYXJzW2Yub3B0aW9ucy50b29sYmFyJiZmLm9wdGlvbnMudG9vbGJhcnNbZi5vcHRpb25zLnRvb2xiYXJdP2Yub3B0aW9ucy50b29sYmFyOiJub3JtYWwiXSxyPW8ubGVuZ3RoLGcsayxqLGgsdCx1LHE7Zm9yKHEgaW4gdGhpcy5idXR0b25zKXtpZih0aGlzLmJ1dHRvbnMuaGFzT3duUHJvcGVydHkocSkmJnEhPSJidXR0b24iKXt0aGlzLmJ1dHRvbnNbcV0ucHJvdG90eXBlPXRoaXMuYnV0dG9ucy5idXR0b24ucHJvdG90eXBlfX13aGlsZShyLS0pe2s9b1tyXTtnPWEoJzx1bCBjbGFzcz0icGFuZWwtJytrKyhyPT0wPyIgZmlyc3QiOiIiKSsnIiAvPicpLnByZXBlbmRUbyh0aGlzLnJ0ZS50b29sYmFyKTtnLmJpbmQoIm1vdXNlZG93biIsZnVuY3Rpb24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpfSk7aj10aGlzLnJ0ZS5vcHRpb25zLnBhbmVsc1trXS5sZW5ndGg7d2hpbGUoai0tKXtoPXRoaXMucnRlLm9wdGlvbnMucGFuZWxzW2tdW2pdO3Q9dGhpcy5idXR0b25zW2hdfHx0aGlzLmJ1dHRvbnMuYnV0dG9uO3RoaXMuX2J1dHRvbnMucHVzaCgodT1uZXcgdCh0aGlzLnJ0ZSxoKSkpO2cucHJlcGVuZCh1LmRvbUVsZW0pfX10aGlzLnVwZGF0ZSgpO3RoaXMuZGlzYWJsZT1mdW5jdGlvbigpe2EuZWFjaCh2Ll9idXR0b25zLGZ1bmN0aW9uKCl7IXRoaXMuYWN0aXZlJiZ0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9KX19O2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGgpe2gmJnRoaXMucnRlLnNlbGVjdGlvbi5jbGVhbkNhY2hlKCk7dmFyIGY9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSxjPXRoaXMucnRlLmRvbS5wYXJlbnRzKGYsIioiKSxqPXRoaXMucnRlLnJ0bCxxPWo/IiAmbGFxdW87ICI6IiAmcmFxdW87ICIsbz0iIixiLGc7ZnVuY3Rpb24gayhyKXt2YXIgcD1yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cj1hKHIpO2lmKHA9PSJpbWciKXtpZihyLmhhc0NsYXNzKCJlbHJ0ZS1tZWRpYSIpKXtwPSJtZWRpYSJ9ZWxzZXtpZihyLmhhc0NsYXNzKCJlbHJ0ZS1nb29nbGUtbWFwcyIpKXtwPSJnb29nbGUgbWFwIn1lbHNle2lmKHIuaGFzQ2xhc3MoImVscnRlLXlhbmRleC1tYXBzIikpe3A9InlhbmRleCBtYXAifWVsc2V7aWYoci5oYXNDbGFzcygiZWxydGUtcGFnZWJyZWFrIikpe3A9InBhZ2VicmVhayJ9fX19fXJldHVybiBwfWlmKGYmJmYubm9kZVR5cGU9PTEmJmYubm9kZU5hbWUhPSJCT0RZIil7Yy51bnNoaWZ0KGYpfWlmKCFqKXtjPWMucmV2ZXJzZSgpfWZvcihnPTA7ZzxjLmxlbmd0aDtnKyspe28rPShnPjA/cToiIikrayhjW2ddKX10aGlzLnJ0ZS5zdGF0dXNiYXIuaHRtbChvKTthLmVhY2godGhpcy5fYnV0dG9ucyxmdW5jdGlvbigpe3RoaXMudXBkYXRlKCl9KTt0aGlzLnJ0ZS53aW5kb3cuZm9jdXMoKX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zPXtidXR0b246ZnVuY3Rpb24oZixjKXt2YXIgYj10aGlzO3RoaXMucnRlPWY7dGhpcy5hY3RpdmU9ZmFsc2U7dGhpcy5uYW1lPWM7dGhpcy52YWw9bnVsbDt0aGlzLmRvbUVsZW09YSgnPGxpIHN0eWxlPSItbW96LXVzZXItc2VsZWN0Oi1tb3otbm9uZSIgY2xhc3M9IicrYysnIHJvdW5kZWQtMyIgbmFtZT0iJytjKyciIHRpdGxlPSInK3RoaXMucnRlLmkxOG4odGhpcy5ydGUub3B0aW9ucy5idXR0b25zW2NdfHxjKSsnIiB1bnNlbGVjdGFibGU9Im9uIiAvPicpLmhvdmVyKGZ1bmN0aW9uKCl7YSh0aGlzKS5hZGRDbGFzcygiaG92ZXIiKX0sZnVuY3Rpb24oKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJob3ZlciIpfSkuY2xpY2soZnVuY3Rpb24oZyl7Zy5zdG9wUHJvcGFnYXRpb24oKTtnLnByZXZlbnREZWZhdWx0KCk7aWYoIWEodGhpcykuaGFzQ2xhc3MoImRpc2FibGVkIikpe2IuY29tbWFuZCgpfWIucnRlLndpbmRvdy5mb2N1cygpfSl9fTtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuYnV0dG9uLnByb3RvdHlwZS5jb21tYW5kPWZ1bmN0aW9uKCl7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt0cnl7dGhpcy5ydGUuZG9jLmV4ZWNDb21tYW5kKHRoaXMubmFtZSxmYWxzZSx0aGlzLnZhbCl9Y2F0Y2goYil7cmV0dXJuIHRoaXMucnRlLmxvZygiY29tbWFuZHMgZmFpbGVkOiAiK3RoaXMubmFtZSl9dGhpcy5ydGUudWkudXBkYXRlKHRydWUpfTtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuYnV0dG9uLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0cnl7aWYoIXRoaXMucnRlLmRvYy5xdWVyeUNvbW1hbmRFbmFibGVkKHRoaXMubmFtZSkpe3JldHVybiB0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9ZWxzZXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9fWNhdGNoKGIpe3JldHVybn10cnl7aWYodGhpcy5ydGUuZG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKHRoaXMubmFtZSkpe3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX1jYXRjaChiKXt9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51dGlscz1mdW5jdGlvbihjKXt0aGlzLnJ0ZT1jO3RoaXMudXJsPW51bGw7dGhpcy5yZWc9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS87dGhpcy5iYXNlVVJMPSIiO3RoaXMucGF0aD0iIjt0aGlzLmVudGl0aWVzPXsiJiI6IiZhbXA7IiwnIic6IiZxdW90OyIsIjwiOiImbHQ7IiwiPiI6IiZndDsifTt0aGlzLmVudGl0aWVzUmVnRXhwPS9bPD4mXCJdL2c7dGhpcy5tZWRpYT1be3R5cGU6ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIixjbGFzc2lkOlsiY2xzaWQ6ZDI3Y2RiNmUtYWU2ZC0xMWNmLTk2YjgtNDQ0NTUzNTQwMDAwIl0sY29kZWJhc2U6Imh0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5jYWIjdmVyc2lvbj02LDAsNDAsMCJ9LHt0eXBlOiJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIixjbGFzc2lkOlsiY2xzaWQ6MTY2YjFiY2EtM2Y5Yy0xMWNmLTgwNzUtNDQ0NTUzNTQwMDAwIl0sY29kZWJhc2U6Imh0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZGlyZWN0b3Ivc3cuY2FiI3ZlcnNpb249OCw1LDEsMCJ9LHt0eXBlOiJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyIixjbGFzc2lkOlsiY2xzaWQ6NmJmNTJhNTItMzk0YS0xMWQzLWIxNTMtMDBjMDRmNzlmYWE2IiwiY2xzaWQ6MjJkNmYzMTItYjBmNi0xMWQwLTk0YWItMDA4MGM3NGM3ZTk1IiwiY2xzaWQ6MDU1ODlmYTEtYzM1Ni0xMWNlLWJmMDEtMDBhYTAwNTU1OTVhIl0sY29kZWJhc2U6Imh0dHA6Ly9hY3RpdmV4Lm1pY3Jvc29mdC5jb20vYWN0aXZleC9jb250cm9scy9tcGxheWVyL2VuL25zbXAyaW5mLmNhYiNWZXJzaW9uPTUsMSw1Miw3MDEifSx7dHlwZToidmlkZW8vcXVpY2t0aW1lIixjbGFzc2lkOlsiY2xzaWQ6MDJiZjI1ZDUtOGMxNy00YjIzLWJjODAtZDM0ODhhYmRkYzZiIl0sY29kZWJhc2U6Imh0dHA6Ly93d3cuYXBwbGUuY29tL3F0YWN0aXZleC9xdHBsdWdpbi5jYWIjdmVyc2lvbj02LDAsMiwwIn0se3R5cGU6ImF1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbiIsY2xhc3NpZDpbImNsc2lkOmNmY2RhYTAzLThiZTQtMTFjZi1iODRiLTAwMjBhZmJiY2NmYSJdLGNvZGViYXNlOiJodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL3Nob2Nrd2F2ZS9jYWJzL2ZsYXNoL3N3Zmxhc2guY2FiI3ZlcnNpb249NiwwLDQwLDAifV07dGhpcy5yZ2JSZWdFeHA9L1xzKnJnYlxzKj9cKFxzKj8oWzAtOV0rKVxzKj8sXHMqPyhbMC05XSspXHMqPyxccyo/KFswLTldKylccyo/XClccyovaTt0aGlzLmNvbG9yc1JlZ0V4cD0vYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvd3xyZ2JccypcKFteXCldK1wpL2k7dGhpcy5jb2xvcnM9e2FxdWE6IiMwMGZmZmYiLGJsYWNrOiIjMDAwMDAwIixibHVlOiIjMDAwMGZmIixmdWNoc2lhOiIjZmYwMGZmIixncmF5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsbGltZToiIzAwZmYwMCIsbWFyb29uOiIjODAwMDAwIixuYXZ5OiIjMDAwMDgwIixvbGl2ZToiIzgwODAwMCIsb3JhbmdlOiIjZmZhNTAwIixwdXJwbGU6IiM4MDAwODAiLHJlZDoiI2ZmMDAwMCIsc2lsdmVyOiIjYzBjMGMwIix0ZWFsOiIjMDA4MDgwIix3aGl0ZToiI2ZmZmZmZmYiLHllbGxvdzoiI2ZmZmYwMCJ9O3ZhciBiPXRoaXM7dGhpcy5yZ2IyaGV4PWZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLmNvbG9yMkhleCgiIitmKX07dGhpcy50b1BpeGVscz1mdW5jdGlvbihnKXt2YXIgZj1nLm1hdGNoKC8oWzAtOV0rXC4/WzAtOV0qKVxzKihweHxwdHxlbXwlKS8pO2lmKGYpe2c9ZlsxXTt1bml0PWZbMl19aWYoZ1swXT09Ii4iKXtnPSIwIitnfWc9cGFyc2VGbG9hdChnKTtpZihpc05hTihnKSl7cmV0dXJuIiJ9dmFyIGg9cGFyc2VJbnQoYShkb2N1bWVudC5ib2R5KS5jc3MoImZvbnQtc2l6ZSIpKXx8MTY7c3dpdGNoKHVuaXQpe2Nhc2UiZW0iOnJldHVybiBwYXJzZUludChnKmgpO2Nhc2UicHQiOnJldHVybiBwYXJzZUludChnKmgvMTIpO2Nhc2UiJSI6cmV0dXJuIHBhcnNlSW50KGcqaC8xMDApfXJldHVybiBnfTt0aGlzLmFic29sdXRlVVJMPWZ1bmN0aW9uKGcpeyF0aGlzLnVybCYmdGhpcy5fdXJsKCk7Zz1hLnRyaW0oZyk7aWYoIWcpe3JldHVybiIifWlmKGdbMF09PSIjIil7cmV0dXJuIGd9dmFyIGY9dGhpcy5wYXJzZVVSTChnKTtpZighZi5ob3N0JiYhZi5wYXRoJiYhZi5hbmNob3Ipe3JldHVybiIifWlmKCF0aGlzLnJ0ZS5vcHRpb25zLmFic29sdXRlVVJMcyl7cmV0dXJuIGd9aWYoZi5wcm90b2NvbCl7cmV0dXJuIGd9aWYoZi5ob3N0JiYoZi5ob3N0LmluZGV4T2YoIi4iKSE9LTF8fGYuaG9zdD09ImxvY2FsaG9zdCIpKXtyZXR1cm4gdGhpcy51cmwucHJvdG9jb2wrIjovLyIrZ31pZihnWzBdPT0iLyIpe2c9dGhpcy5iYXNlVVJMK2d9ZWxzZXtpZihnLmluZGV4T2YoIi4vIik9PTApe2c9Zy5zdWJzdHJpbmcoMil9Zz10aGlzLmJhc2VVUkwrdGhpcy5wYXRoK2d9cmV0dXJuIGd9O3RoaXMucGFyc2VVUkw9ZnVuY3Rpb24oaCl7dmFyIGc9aC5tYXRjaCh0aGlzLnJlZyk7dmFyIGY9e307YS5lYWNoKFsic291cmNlIiwicHJvdG9jb2wiLCJhdXRob3JpdHkiLCJ1c2VySW5mbyIsInVzZXIiLCJwYXNzd29yZCIsImhvc3QiLCJwb3J0IiwicmVsYXRpdmUiLCJwYXRoIiwiZGlyZWN0b3J5IiwiZmlsZSIsInF1ZXJ5IiwiYW5jaG9yIl0sZnVuY3Rpb24oail7Zlt0aGlzXT1nW2pdfSk7aWYoIWYuaG9zdC5tYXRjaCgvW2EtejAtOV0vaSkpe2YuaG9zdD0iIn1yZXR1cm4gZn07dGhpcy50cmltRXZlbnRDYWxsYmFjaz1mdW5jdGlvbihmKXtmPWY/Zi50b1N0cmluZygpOiIiO3JldHVybiBhLnRyaW0oZi5yZXBsYWNlKC9ccipcbi9tZywiIikucmVwbGFjZSgvXmZ1bmN0aW9uXHMqb25bYS16XStccypcKFxzKmV2ZW50XHMqXClccypceyguKylcfSQvaWdtLCIkMSIpKX07dGhpcy5fdXJsPWZ1bmN0aW9uKCl7dGhpcy51cmw9dGhpcy5wYXJzZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7dGhpcy5iYXNlVVJMPXRoaXMudXJsLnByb3RvY29sKyI6Ly8iKyh0aGlzLnVybC51c2VySW5mbz9wYXJ0cy51c2VySW5mbysiQCI6IiIpK3RoaXMudXJsLmhvc3QrKHRoaXMudXJsLnBvcnQ/IjoiK3RoaXMudXJsLnBvcnQ6IiIpO3RoaXMucGF0aD0hdGhpcy51cmwuZmlsZT90aGlzLnVybC5wYXRoOnRoaXMudXJsLnBhdGguc3Vic3RyaW5nKDAsdGhpcy51cmwucGF0aC5sZW5ndGgtdGhpcy51cmwuZmlsZS5sZW5ndGgpfTt0aGlzLm1ha2VPYmplY3Q9ZnVuY3Rpb24oZyl7dmFyIGY9e307YS5lYWNoKGcsZnVuY3Rpb24oaCxqKXtmW2pdPWp9KTtyZXR1cm4gZn07dGhpcy5lbmNvZGU9ZnVuY3Rpb24oZil7dmFyIGc9dGhpcy5lbnRpdGllcztyZXR1cm4oIiIrZikucmVwbGFjZSh0aGlzLmVudGl0aWVzUmVnRXhwLGZ1bmN0aW9uKGgpe3JldHVybiBnW2hdfSl9O3RoaXMuZGVjb2RlPWZ1bmN0aW9uKGYpe3JldHVybiBhKCI8ZGl2Lz4iKS5odG1sKGZ8fCIiKS50ZXh0KCl9O3RoaXMucGFyc2VTdHlsZT1mdW5jdGlvbihrKXt2YXIgaD17fSxmPXRoaXMucnRlLm9wdGlvbnMuYWxsb3dCcm93c2Vyc1NwZWNTdHlsZXMsaixvLGc7aWYodHlwZW9mKGspPT0ic3RyaW5nIiYmay5sZW5ndGgpe2EuZWFjaChrLnJlcGxhY2UoLyZxdW90Oy9naSwiJyIpLnNwbGl0KCI7IiksZnVuY3Rpb24oKXtqPXRoaXMudG9TdHJpbmcoKS5zcGxpdCgiOiIpO2lmKGpbMF0mJmpbMV0pe289YS50cmltKGpbMF0pLnRvTG93ZXJDYXNlKCk7Zz1hLnRyaW0oalsxXSk7aWYobz09ImNvbG9yInx8bz09ImJhY2tncm91bmQtY29sb3IiKXtnPWcudG9Mb3dlckNhc2UoKX1pZihvJiZnJiYoZnx8by5zdWJzdHJpbmcoMCwxKSE9Ii0iKSl7aFtvXT1nfX19KX1yZXR1cm4gaH07dGhpcy5jb21wYWN0U3R5bGU9ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcztpZihnLmJvcmRlcj09Im1lZGl1bSBub25lIil7ZGVsZXRlIGcuYm9yZGVyfWEuZWFjaChnLGZ1bmN0aW9uKGosaCl7aWYoL2NvbG9yJC9pLnRlc3Qoaikpe2dbal09Zi5jb2xvcjJIZXgoaCl9ZWxzZXtpZigvXihib3JkZXJ8YmFja2dyb3VuZCkkL2kudGVzdChqKSl7Z1tqXT1oLnJlcGxhY2UoZi5jb2xvcnNSZWdFeHAsZnVuY3Rpb24oayl7cmV0dXJuIGYuY29sb3IySGV4KGspfSl9fX0pO2lmKGdbImJvcmRlci13aWR0aCJdKXtnLmJvcmRlcj1nWyJib3JkZXItd2lkdGgiXSsiICIrKGdbImJvcmRlci1zdHlsZSJdfHwic29saWQiKSsiICIrKGdbImJvcmRlci1jb2xvciJdfHwiIzAwMCIpO2RlbGV0ZSBnWyJib3JkZXItd2lkdGgiXTtkZWxldGUgZ1siYm9yZGVyLXN0eWxlIl07ZGVsZXRlIGdbImJvcmRlci1jb2xvciJdfWlmKGdbImJhY2tncm91bmQtaW1hZ2UiXSl7Zy5iYWNrZ3JvdW5kPShnWyJiYWNrZ3JvdW5kLWNvbG9yIl0rIiAiKXx8IiIrZ1siYmFja2dyb3VuZC1pbWFnZSJdKyIgIitnWyJiYWNrZ3JvdW5kLXBvc2l0aW9uIl18fCIwIDAgIitnWyJiYWNrZ3JvdW5kLXJlcGVhdCJdfHwicmVwZWF0IjtkZWxldGUgZ1siYmFja2dyb3VuZC1pbWFnZSJdO2RlbGV0ZSBbImJhY2tncm91bmQtaW1hZ2UiXTtkZWxldGUgWyJiYWNrZ3JvdW5kLXBvc2l0aW9uIl07ZGVsZXRlIFsiYmFja2dyb3VuZC1yZXBlYXQiXX1pZihnWyJtYXJnaW4tdG9wIl0mJmdbIm1hcmdpbi1yaWdodCJdJiZnWyJtYXJnaW4tYm90dG9tIl0mJmdbIm1hcmdpbi1sZWZ0Il0pe2cubWFyZ2luPWdbIm1hcmdpbi10b3AiXSsiICIrZ1sibWFyZ2luLXJpZ2h0Il0rIiAiK2dbIm1hcmdpbi1ib3R0b20iXSsiICIrZ1sibWFyZ2luLWxlZnQiXTtkZWxldGUgZ1sibWFyZ2luLXRvcCJdO2RlbGV0ZSBnWyJtYXJnaW4tcmlnaHQiXTtkZWxldGUgZ1sibWFyZ2luLWJvdHRvbSJdO2RlbGV0ZSBnWyJtYXJnaW4tbGVmdCJdfWlmKGdbInBhZGRpbmctdG9wIl0mJmdbInBhZGRpbmctcmlnaHQiXSYmZ1sicGFkZGluZy1ib3R0b20iXSYmZ1sicGFkZGluZy1sZWZ0Il0pe2cucGFkZGluZz1nWyJwYWRkaW5nLXRvcCJdKyIgIitnWyJwYWRkaW5nLXJpZ2h0Il0rIiAiK2dbInBhZGRpbmctYm90dG9tIl0rIiAiK2dbInBhZGRpbmctbGVmdCJdO2RlbGV0ZSBnWyJwYWRkaW5nLXRvcCJdO2RlbGV0ZSBnWyJwYWRkaW5nLXJpZ2h0Il07ZGVsZXRlIGdbInBhZGRpbmctYm90dG9tIl07ZGVsZXRlIGdbInBhZGRpbmctbGVmdCJdfWlmKGdbImxpc3Qtc3R5bGUtdHlwZSJdfHxnWyJsaXN0LXN0eWxlLXBvc2l0aW9uIl18fGdbImxpc3Qtc3R5bGUtaW1hZ2UiXSl7Z1sibGlzdC1zdHlsZSJdPWEudHJpbShnWyJsaXN0LXN0eWxlLXR5cGUiXXx8IiAiK2dbImxpc3Qtc3R5bGUtcG9zaXRpb24iXXx8IiIrZ1sibGlzdC1zdHlsZS1pbWFnZSJdfHwiIik7ZGVsZXRlIGdbImxpc3Qtc3R5bGUtdHlwZSJdO2RlbGV0ZSBnWyJsaXN0LXN0eWxlLXBvc2l0aW9uIl07ZGVsZXRlIGdbImxpc3Qtc3R5bGUtaW1hZ2UiXX1yZXR1cm4gZ307dGhpcy5zZXJpYWxpemVTdHlsZT1mdW5jdGlvbihnLGgpe3ZhciBmPVtdO2EuZWFjaChoP3RoaXMuY29tcGFjdFN0eWxlKGcpOmcsZnVuY3Rpb24oayxqKXtqJiZmLnB1c2goaysiOiIrail9KTtyZXR1cm4gZi5qb2luKCI7Iil9O3RoaXMucGFyc2VDbGFzcz1mdW5jdGlvbihmKXtmPWEudHJpbShmKTtyZXR1cm4gZi5sZW5ndGg/dGhpcy5tYWtlT2JqZWN0KGYuc3BsaXQoL1xzKy8pKTp7fTtyZXR1cm4gZi5sZW5ndGg/Zi5zcGxpdCgvXHMrLyk6W119O3RoaXMuc2VyaWFsaXplQ2xhc3M9ZnVuY3Rpb24oZyl7dmFyIGY9W107YS5lYWNoKGcsZnVuY3Rpb24oaCl7Zi5wdXNoKGgpfSk7cmV0dXJuIGYuam9pbigiICIpfTt0aGlzLm1lZGlhSW5mbz1mdW5jdGlvbihnLGgpe3ZhciBmPXRoaXMubWVkaWEubGVuZ3RoO3doaWxlKGYtLSl7aWYoZz09PXRoaXMubWVkaWFbZl0udHlwZXx8KGgmJmEuaW5BcnJheShoLHRoaXMubWVkaWFbZl0uY2xhc3NpZCkhPS0xKSl7cmV0dXJuIHRoaXMubWVkaWFbZl19fX07dGhpcy5jb2xvcjJIZXg9ZnVuY3Rpb24oaCl7dmFyIGY7aWYoaC5pbmRleE9mKCIjIik9PT0wKXtyZXR1cm4gaH1oPWh8fCIiO2Z1bmN0aW9uIGcoail7aj1wYXJzZUludChqKS50b1N0cmluZygxNik7cmV0dXJuIGoubGVuZ3RoPjE/ajoiMCIran1pZih0aGlzLmNvbG9yc1toXSl7cmV0dXJuIHRoaXMuY29sb3JzW2hdfWlmKChmPWgubWF0Y2godGhpcy5yZ2JSZWdFeHApKSl7cmV0dXJuIiMiK2coZlsxXSkrZyhmWzJdKStnKGZbM10pfXJldHVybiIifX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudzNjUmFuZ2U9ZnVuY3Rpb24oYyl7dmFyIGI9dGhpczt0aGlzLnJ0ZT1jO3RoaXMucj1udWxsO3RoaXMuY29sbGFwc2VkPXRydWU7dGhpcy5zdGFydENvbnRhaW5lcj1udWxsO3RoaXMuZW5kQ29udGFpbmVyPW51bGw7dGhpcy5zdGFydE9mZnNldD0wO3RoaXMuZW5kT2Zmc2V0PTA7dGhpcy5jb21tb25BbmNlc3RvckNvbnRhaW5lcj1udWxsO3RoaXMucmFuZ2U9ZnVuY3Rpb24oKXt0cnl7dGhpcy5yPXRoaXMucnRlLndpbmRvdy5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKX1jYXRjaChmKXt0aGlzLnI9dGhpcy5ydGUuZG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCl9cmV0dXJuIHRoaXMucn07dGhpcy5pbnNlcnROb2RlPWZ1bmN0aW9uKGYpe3RoaXMucmFuZ2UoKTtiLnIuY29sbGFwc2UoZmFsc2UpO3ZhciBnPWIuci5kdXBsaWNhdGUoKTtnLnBhc3RlSFRNTChmKX07dGhpcy5nZXRCb29rbWFyaz1mdW5jdGlvbigpe3RoaXMucmFuZ2UoKTtpZih0aGlzLnIuaXRlbSl7dmFyIGY9dGhpcy5yLml0ZW0oMCk7dGhpcy5yPXRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO3RoaXMuci5tb3ZlVG9FbGVtZW50VGV4dChmKX1yZXR1cm4gdGhpcy5yLmdldEJvb2ttYXJrKCl9O3RoaXMubW92ZVRvQm9va21hcms9ZnVuY3Rpb24oZil7dGhpcy5ydGUud2luZG93LmZvY3VzKCk7dGhpcy5yYW5nZSgpLm1vdmVUb0Jvb2ttYXJrKGYpO3RoaXMuci5zZWxlY3QoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKHgpe3ZhciBrPSJcdUZFRkYiO3ZhciBvPW9mZnNldD0wO3ZhciB0PWIuci5kdXBsaWNhdGUoKTt0LmNvbGxhcHNlKHgpO3ZhciB1PXQucGFyZW50RWxlbWVudCgpO2lmKCF1fHx1Lm5vZGVOYW1lPT0iSFRNTCIpe3JldHVybntwYXJlbnQ6Yi5ydGUuZG9jLmJvZHksbmR4Om8sb2Zmc2V0Om9mZnNldH19dC5wYXN0ZUhUTUwoayk7Y2hpbGRzPXUuY2hpbGROb2Rlcztmb3IodmFyIHE9MDtxPGNoaWxkcy5sZW5ndGg7cSsrKXt2YXIgdz1jaGlsZHNbcV07aWYocT4wJiYody5ub2RlVHlwZSE9PTN8fGNoaWxkc1txLTFdLm5vZGVUeXBlIT09Mykpe28rK31pZih3Lm5vZGVUeXBlIT09Myl7b2Zmc2V0PTB9ZWxzZXt2YXIgdj13Lm5vZGVWYWx1ZS5pbmRleE9mKGspO2lmKHYhPT0tMSl7b2Zmc2V0Kz12O2JyZWFrfW9mZnNldCs9dy5ub2RlVmFsdWUubGVuZ3RofX10Lm1vdmVTdGFydCgiY2hhcmFjdGVyIiwtMSk7dC50ZXh0PSIiO3JldHVybntwYXJlbnQ6dSxuZHg6TWF0aC5taW4obyx1LmNoaWxkTm9kZXMubGVuZ3RoLTEpLG9mZnNldDpvZmZzZXR9fXRoaXMucmFuZ2UoKTt0aGlzLnN0YXJ0Q29udGFpbmVyPXRoaXMuZW5kQ29udGFpbmVyPW51bGw7aWYodGhpcy5yLml0ZW0pe3RoaXMuY29sbGFwc2VkPWZhbHNlO3ZhciBnPXRoaXMuci5pdGVtKDApO3RoaXMuc2V0U3RhcnQoZy5wYXJlbnROb2RlLHRoaXMucnRlLmRvbS5pbmRleE9mKGcpKTt0aGlzLnNldEVuZChnLnBhcmVudE5vZGUsdGhpcy5zdGFydE9mZnNldCsxKX1lbHNle3RoaXMuY29sbGFwc2VkPXRoaXMuci5ib3VuZGluZ1dpZHRoPT0wO3ZhciBqPWgodHJ1ZSk7dmFyIGY9aChmYWxzZSk7ai5wYXJlbnQubm9ybWFsaXplKCk7Zi5wYXJlbnQubm9ybWFsaXplKCk7ai5uZHg9TWF0aC5taW4oai5uZHgsai5wYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGgtMSk7Zi5uZHg9TWF0aC5taW4oZi5uZHgsZi5wYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGgtMSk7aWYoai5wYXJlbnQuY2hpbGROb2Rlc1tqLm5keF0ubm9kZVR5cGUmJmoucGFyZW50LmNoaWxkTm9kZXNbai5uZHhdLm5vZGVUeXBlPT0xKXt0aGlzLnNldFN0YXJ0KGoucGFyZW50LGoubmR4KX1lbHNle3RoaXMuc2V0U3RhcnQoai5wYXJlbnQuY2hpbGROb2Rlc1tqLm5keF0sai5vZmZzZXQpfWlmKGYucGFyZW50LmNoaWxkTm9kZXNbZi5uZHhdLm5vZGVUeXBlJiZmLnBhcmVudC5jaGlsZE5vZGVzW2YubmR4XS5ub2RlVHlwZT09MSl7dGhpcy5zZXRFbmQoZi5wYXJlbnQsZi5uZHgpfWVsc2V7dGhpcy5zZXRFbmQoZi5wYXJlbnQuY2hpbGROb2Rlc1tmLm5keF0sZi5vZmZzZXQpfXRoaXMuc2VsZWN0KCl9cmV0dXJuIHRoaXN9O3RoaXMuaXNDb2xsYXBzZWQ9ZnVuY3Rpb24oKXt0aGlzLnJhbmdlKCk7dGhpcy5jb2xsYXBzZWQ9dGhpcy5yLml0ZW0/ZmFsc2U6dGhpcy5yLmJvdW5kaW5nV2lkdGg9PTA7cmV0dXJuIHRoaXMuY29sbGFwc2VkfTt0aGlzLmNvbGxhcHNlPWZ1bmN0aW9uKGYpe3RoaXMucmFuZ2UoKTtpZih0aGlzLnIuaXRlbSl7dmFyIGc9dGhpcy5yLml0ZW0oMCk7dGhpcy5yPXRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO3RoaXMuci5tb3ZlVG9FbGVtZW50VGV4dChnKX10aGlzLnIuY29sbGFwc2UoZik7dGhpcy5yLnNlbGVjdCgpO3RoaXMuY29sbGFwc2VkPXRydWV9O3RoaXMuZ2V0U3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnJhbmdlKCk7aWYodGhpcy5yLml0ZW0pe3JldHVybiB0aGlzLnIuaXRlbSgwKX12YXIgZz10aGlzLnIuZHVwbGljYXRlKCk7Zy5jb2xsYXBzZSh0cnVlKTt2YXIgZj1nLnBhcmVudEVsZW1lbnQoKTtyZXR1cm4gZiYmZi5ub2RlTmFtZT09IkJPRFkiP2YuZmlyc3RDaGlsZDpmfTt0aGlzLmdldEVuZD1mdW5jdGlvbigpe3RoaXMucmFuZ2UoKTtpZih0aGlzLnIuaXRlbSl7cmV0dXJuIHRoaXMuci5pdGVtKDApfXZhciBmPXRoaXMuci5kdXBsaWNhdGUoKTtmLmNvbGxhcHNlKGZhbHNlKTt2YXIgZz1mLnBhcmVudEVsZW1lbnQoKTtyZXR1cm4gZyYmZy5ub2RlTmFtZT09IkJPRFkiP2cubGFzdENoaWxkOmd9O3RoaXMuc2V0U3RhcnQ9ZnVuY3Rpb24oZixnKXt0aGlzLnN0YXJ0Q29udGFpbmVyPWY7dGhpcy5zdGFydE9mZnNldD1nO2lmKHRoaXMuZW5kQ29udGFpbmVyKXt0aGlzLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyPXRoaXMucnRlLmRvbS5maW5kQ29tbW9uQW5jZXN0b3IodGhpcy5zdGFydENvbnRhaW5lcix0aGlzLmVuZENvbnRhaW5lcil9fTt0aGlzLnNldEVuZD1mdW5jdGlvbihmLGcpe3RoaXMuZW5kQ29udGFpbmVyPWY7dGhpcy5lbmRPZmZzZXQ9ZztpZih0aGlzLnN0YXJ0Q29udGFpbmVyKXt0aGlzLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyPXRoaXMucnRlLmRvbS5maW5kQ29tbW9uQW5jZXN0b3IodGhpcy5zdGFydENvbnRhaW5lcix0aGlzLmVuZENvbnRhaW5lcil9fTt0aGlzLnNldFN0YXJ0QmVmb3JlPWZ1bmN0aW9uKGYpe2lmKGYucGFyZW50Tm9kZSl7dGhpcy5zZXRTdGFydChmLnBhcmVudE5vZGUsdGhpcy5ydGUuZG9tLmluZGV4T2YoZikpfX07dGhpcy5zZXRTdGFydEFmdGVyPWZ1bmN0aW9uKGYpe2lmKGYucGFyZW50Tm9kZSl7dGhpcy5zZXRTdGFydChmLnBhcmVudE5vZGUsdGhpcy5ydGUuZG9tLmluZGV4T2YoZikrMSl9fTt0aGlzLnNldEVuZEJlZm9yZT1mdW5jdGlvbihmKXtpZihmLnBhcmVudE5vZGUpe3RoaXMuc2V0RW5kKGYucGFyZW50Tm9kZSx0aGlzLnJ0ZS5kb20uaW5kZXhPZihmKSl9fTt0aGlzLnNldEVuZEFmdGVyPWZ1bmN0aW9uKGYpe2lmKGYucGFyZW50Tm9kZSl7dGhpcy5zZXRFbmQoZi5wYXJlbnROb2RlLHRoaXMucnRlLmRvbS5pbmRleE9mKGYpKzEpfX07dGhpcy5zZWxlY3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvKEIseil7aWYoQi5ub2RlVHlwZSE9Myl7cmV0dXJuIC0xfXZhciBBPSJcdUZFRkYiO3ZhciB4PUIubm9kZVZhbHVlO3ZhciB2PWIucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO0Iubm9kZVZhbHVlPXguc3Vic3RyaW5nKDAseikrQSt4LnN1YnN0cmluZyh6KTt2Lm1vdmVUb0VsZW1lbnRUZXh0KEIucGFyZW50Tm9kZSk7di5maW5kVGV4dChBKTt2YXIgdz1NYXRoLmFicyh2Lm1vdmVTdGFydCgiY2hhcmFjdGVyIiwtMTA0ODU3NSkpO0Iubm9kZVZhbHVlPXg7cmV0dXJuIHd9dGhpcy5yPXRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO3ZhciBrPXRoaXMuc3RhcnRPZmZzZXQ7dmFyIGc9dGhpcy5lbmRPZmZzZXQ7dmFyIHU9dGhpcy5zdGFydENvbnRhaW5lci5ub2RlVHlwZT09MT90aGlzLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbTWF0aC5taW4oayx0aGlzLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoLTEpXTp0aGlzLnN0YXJ0Q29udGFpbmVyO3ZhciBxPXRoaXMuZW5kQ29udGFpbmVyLm5vZGVUeXBlPT0xP3RoaXMuZW5kQ29udGFpbmVyLmNoaWxkTm9kZXNbTWF0aC5taW4oaz09Zz9nOmctMSx0aGlzLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aC0xKV06dGhpcy5lbmRDb250YWluZXI7aWYodGhpcy5jb2xsYXBzZWQpe2lmKHUubm9kZVR5cGU9PTMpe3ZhciBoPW8odSxrKTt0aGlzLnIubW92ZSgiY2hhcmFjdGVyIixoKX1lbHNle3RoaXMuci5tb3ZlVG9FbGVtZW50VGV4dCh1KTt0aGlzLnIuY29sbGFwc2UodHJ1ZSl9fWVsc2V7dmFyIGY9dGhpcy5ydGUuZG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7dmFyIGo9byh1LGspO3ZhciB0PW8ocSxnKTtpZih1Lm5vZGVUeXBlPT0zKXt0aGlzLnIubW92ZSgiY2hhcmFjdGVyIixqKX1lbHNle3RoaXMuci5tb3ZlVG9FbGVtZW50VGV4dCh1KX1pZihxLm5vZGVUeXBlPT0zKXtmLm1vdmUoImNoYXJhY3RlciIsdCl9ZWxzZXtmLm1vdmVUb0VsZW1lbnRUZXh0KHEpfXRoaXMuci5zZXRFbmRQb2ludCgiRW5kVG9FbmQiLGYpfXRyeXt0aGlzLnIuc2VsZWN0KCl9Y2F0Y2gocSl7fWlmKGYpe2Y9bnVsbH19O3RoaXMuZHVtcD1mdW5jdGlvbigpe3RoaXMucnRlLmxvZygiY29sbGFwc2VkOiAiK3RoaXMuY29sbGFwc2VkKTt0aGlzLnJ0ZS5sb2coInN0YXJ0Q29udGFpbmVyOiAiKyh0aGlzLnN0YXJ0Q29udGFpbmVyP3RoaXMuc3RhcnRDb250YWluZXIubm9kZU5hbWU6Im5vbiIpKTt0aGlzLnJ0ZS5sb2coInN0YXJ0T2Zmc2V0OiAiK3RoaXMuc3RhcnRPZmZzZXQpO3RoaXMucnRlLmxvZygiZW5kQ29udGFpbmVyOiAiKyh0aGlzLmVuZENvbnRhaW5lcj90aGlzLmVuZENvbnRhaW5lci5ub2RlTmFtZToibm9uZSIpKTt0aGlzLnJ0ZS5sb2coImVuZE9mZnNldDogIit0aGlzLmVuZE9mZnNldCl9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5hYm91dD1mdW5jdGlvbihjLGIpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjLGIpO3RoaXMuYWN0aXZlPXRydWU7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGcsaCxmO2c9e3J0bDpjLnJ0bCxzdWJtaXQ6ZnVuY3Rpb24oaixrKXtrLmNsb3NlKCl9LGRpYWxvZzp7d2lkdGg6NTYwLHRpdGxlOnRoaXMucnRlLmkxOG4oIkFib3V0IHRoaXMgc29mdHdhcmUiKSxidXR0b25zOntPazpmdW5jdGlvbigpe2EodGhpcykuZGlhbG9nKCJkZXN0cm95Iil9fX19O2Y9JzxkaXYgY2xhc3M9ImVscnRlLWxvZ28iPjwvZGl2PjxoMz4nK3RoaXMucnRlLmkxOG4oIkFib3V0IGVsUlRFIikrJzwvaDM+PGJyIGNsZWFyPSJhbGwiLz48ZGl2IGNsYXNzPSJlbHJ0ZS12ZXIiPicrdGhpcy5ydGUuaTE4bigiVmVyc2lvbiIpKyI6ICIrdGhpcy5ydGUudmVyc2lvbisiICgiK3RoaXMucnRlLmJ1aWxkKycpPC9kaXY+PGRpdiBjbGFzcz0iZWxydGUtdmVyIj5qUXVlcnk6ICcrYSgiPGRpdi8+IikuanF1ZXJ5Kyc8L2Rpdj48ZGl2IGNsYXNzPSJlbHJ0ZS12ZXIiPmpRdWVyeVVJOiAnK2EudWkudmVyc2lvbisnPC9kaXY+PGRpdiBjbGFzcz0iZWxydGUtdmVyIj4nK3RoaXMucnRlLmkxOG4oIkxpY2VuY2UiKSsiOiBCU0QgTGljZW5jZTwvZGl2PjxwPiIrdGhpcy5ydGUuaTE4bigiZWxSVEUgaXMgYW4gb3Blbi1zb3VyY2UgSmF2YVNjcmlwdCBiYXNlZCBXWVNJV1lHIEhUTUwtZWRpdG9yLiIpKyI8YnIvPiIrdGhpcy5ydGUuaTE4bigiTWFpbiBnb2FsIG9mIHRoZSBlZGl0b3IgLSBzaW1wbGlmeSB3b3JrIHdpdGggdGV4dCBhbmQgZm9ybWF0aW5nIChIVE1MKSBvbiBzaXRlcywgYmxvZ3MsIGZvcnVtcyBhbmQgb3RoZXIgb25saW5lIHNlcnZpY2VzLiIpKyI8YnIvPiIrdGhpcy5ydGUuaTE4bigiWW91IGNhbiB1c2UgaXQgaW4gYW55IGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwgcHJvamVjdHMuIikrIjwvcD48aDQ+Iit0aGlzLnJ0ZS5pMThuKCJBdXRob3JzIikrJzwvaDQ+PHRhYmxlIGNsYXNzPSJlbHJ0ZS1hdXRob3JzIj48dHI+PHRkPkRtaXRyeSAoZGlvKSBMZXZhc2hvdiAmbHQ7ZGlvQHN0ZDQyLnJ1Jmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bigiQ2hpZWYgZGV2ZWxvcGVyIikrIjwvdGQ+PC90cj48dHI+PHRkPlRyb2V4IE5ldmVsaW4gJmx0O3Ryb2V4QGZ1cnkuc2NhbmNvZGUucnUmZ3Q7PC90ZD48dGQ+Iit0aGlzLnJ0ZS5pMThuKCJEZXZlbG9wZXIsIHRlY2ggc3VwcG9ydCIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5WYWxlbnRpbiBSYXp1bW55aCAmbHQ7Y29udGVudEBzdGQ0Mi5ydSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkludGVyZmFjZSBkZXNpZ25lciIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5FdmdlbnkgZVNhYmJhdGggJmx0O3NhYmJhdGguY29kZW1nQGdtYWlsLmNvbSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkRldmVsb3BlciIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5BbmRyemVqIEJvcm93aWN6ICZsdDtlbHRyZUBib3Jvd2ljei5pbmZvJmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiUG9saXNoIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5BcnRlbSBWYXNpbGlldjwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiVWtyYW5pYW4gbG9jYWxpemF0aW9uIikrIjwvdGQ+PC90cj48dHI+PHRkPkZyYW5jb2lzIE1hemVyb2xsZSAmbHQ7Zm1hejAwOEBnbWFpbC5jb20mZ3Q7PC90ZD48dGQ+Iit0aGlzLnJ0ZS5pMThuKCJGcmVuY2ggbG9jYWxpemF0aW9uIikrIjwvdGQ+PC90cj48dHI+PHRkPkt1cnQgQWVydHM8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkR1dGNoIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5NaWNoYWwgTWFyZWsgJmx0O2ZtaWNoLm1hcmVrQGdtYWlsLmNvbSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkN6ZWNoIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5SaWNhcmRvIE9icmVnw7NuICZsdDtyb2JyZWdvbm1AZ21haWwuY29tJmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiU3BhbmlzaCBsb2NhbGl6YXRpb24iKSsiPC90ZD48L3RyPjx0cj48dGQ+U2FsZWggU291emFuY2hpICZsdDtzYWxlaC5zb3V6YW5jaGlAZ21haWwuY29tJmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiUGVyc2lhbiAoZmFyc2kpIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5UYXdmZWsgRGFnaGlzdGFuaSAmbHQ7dGF3ZmVrb3ZAZ21haWwuY29tJmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiQXJhYmljIGxvY2FsaXphdGlvbiIpKyIsICIrdGhpcy5ydGUuaTE4bigiUlRMIHN1cHBvcnQiKSsiPC90ZD48L3RyPjx0cj48dGQ+VGFkICZsdDt0YWQwNjE2QGdtYWlsLmNvbSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIlRyYWRpdGlvbmFsIENoaW5lc2UgbG9jYWxpemF0aW9uIikrIjwvdGQ+PC90cj48dHI+PHRkPlRvbW9ha2kgWW9zaGlkYSAmbHQ7aW5mb0B5b3NoaWRhLXN0dWRpby5qcCZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkphcGFuZXNlIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5VbGRpcyBQbG90acWGxaEgJmx0O3VsZGlzLnBsb3RpbnNAZ21haWwuY29tJmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiTGF0dmlhbiBsb2NhbGl6YXRpb24iKSsiPC90ZD48L3RyPjx0cj48dGQ+VmFzaWxpeSBSYXp1bW55aCAmbHQ7cnZuQHN0ZDQyLnJ1Jmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiR2VybWFuIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5WaWt0b3IgVGFtYXMgJmx0O3RhbWFzLnZpa3RvckB0b3RhbHN0dWRpby5odSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkh1bmdhcmlhbiBsb2NhbGl6YXRpb24iKSsiPC90ZD48L3RyPjx0cj48dGQ+VWdvIFB1bnpvbG8sICZsdDtzYWRyYWN6ZXJvdW5vQGdtYWlsLmNvbSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkl0YWxpYW4gbG9jYWxpemF0aW9uIikrJzwvdGQ+PC90cj48L3RhYmxlPjxkaXYgY2xhc3M9ImVscnRlLWNvcHkiPkNvcHlyaWdodCAmY29weTsgMjAwOS0yMDEwLCA8YSBocmVmPSJodHRwOi8vd3d3LnN0ZDQyLnJ1Ij5TdHVkaW8gNDIgTFREPC9hPjwvZGl2PjxkaXYgY2xhc3M9ImVscnRlLWNvcHkiPicrdGhpcy5ydGUuaTE4bigiRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzb2Z0d2FyZSB2aXNpdCB0aGUiKSsnIDxhIGhyZWY9Imh0dHA6Ly9lbHJ0ZS5vcmciPicrdGhpcy5ydGUuaTE4bigiZWxSVEUgd2Vic2l0ZSIpKycuPC9hPjwvZGl2PjxkaXYgY2xhc3M9ImVscnRlLWNvcHkiPlR3aXR0ZXI6IDxhIGhyZWY9Imh0dHA6Ly90d2l0dGVyLmNvbS9lbHJ0ZV9lbGZpbmRlciI+ZWxydGVfZWxmaW5kZXI8L2E+PC9kaXY+JztoPW5ldyBlbERpYWxvZ0Zvcm0oZyk7aC5hcHBlbmQoZik7aC5vcGVuKCl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuYW5jaG9yPWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dGhpcy5pbnB1dD1hKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJuYW1lIiwiYW5jaG9yIikuYXR0cigic2l6ZSIsIjE2Iik7dmFyIGI9dGhpczt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgZz17cnRsOnRoaXMucnRlLnJ0bCxzdWJtaXQ6ZnVuY3Rpb24oaixrKXtqLnN0b3BQcm9wYWdhdGlvbigpO2oucHJldmVudERlZmF1bHQoKTtrLmNsb3NlKCk7Yi5zZXQoKX0sZGlhbG9nOnt0aXRsZTp0aGlzLnJ0ZS5pMThuKCJCb29rbWFyayIpfX07dGhpcy5hbmNob3I9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudEFuY2hvcih0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCkpfHxmLmRvbS5jcmVhdGUoImEiKTshdGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24uY29sbGFwc2UoZmFsc2UpO3RoaXMuaW5wdXQudmFsKGEodGhpcy5hbmNob3IpLmFkZENsYXNzKCJlbC1ydGUtYW5jaG9yIikuYXR0cigibmFtZSIpKTt0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTt2YXIgaD1uZXcgZWxEaWFsb2dGb3JtKGcpO2guYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJCb29rbWFyayBuYW1lIiksdGhpcy5pbnB1dF0sbnVsbCx0cnVlKS5vcGVuKCk7c2V0VGltZW91dChmdW5jdGlvbigpe2IuaW5wdXQuZm9jdXMoKX0sMjApfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBnPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7aWYodGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudExpbmsoZykpe3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQiKX1lbHNle2lmKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnRBbmNob3IoZykpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX19O3RoaXMuc2V0PWZ1bmN0aW9uKCl7dmFyIGc9YS50cmltKHRoaXMuaW5wdXQudmFsKCkpO2lmKGcpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7aWYoIXRoaXMuYW5jaG9yLnBhcmVudE5vZGUpe3RoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnRIdG1sKCc8YSBuYW1lPSInK2crJyIgdGl0bGU9IicrdGhpcy5ydGUuaTE4bigiQm9va21hcmsiKSsiOiAiK2crJyIgY2xhc3M9ImVsLXJ0ZS1hbmNob3IiPjwvYT4nKX1lbHNle3RoaXMuYW5jaG9yLm5hbWU9Zzt0aGlzLmFuY2hvci50aXRsZT10aGlzLnJ0ZS5pMThuKCJCb29rbWFyayIpKyI6ICIrZ319ZWxzZXtpZih0aGlzLmFuY2hvci5wYXJlbnROb2RlKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO3RoaXMuYW5jaG9yLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5hbmNob3IpfX19fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5ibG9ja3F1b3RlPWZ1bmN0aW9uKGMsYil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMsYik7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGcsZjt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO2lmKHRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSYmKGc9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eQkxPQ0tRVU9URSQvKSkpe2EoZykucmVwbGFjZVdpdGgoYShnKS5odG1sKCkpfWVsc2V7Zj10aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe3dyYXA6ImFsbCIsdGFnOiJibG9ja3F1b3RlIn0pO2YubGVuZ3RoJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0KGZbMF0sZltmLmxlbmd0aC0xXSl9dGhpcy5ydGUudWkudXBkYXRlKHRydWUpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKHRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSl7aWYodGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eQkxPQ0tRVU9URSQvKSl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpLmFkZENsYXNzKCJhY3RpdmUiKX1lbHNle3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQiKS5yZW1vdmVDbGFzcygiYWN0aXZlIil9fWVsc2V7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCBhY3RpdmUiKX19fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5jb3B5PWZ1bmN0aW9uKGMsYil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMsYik7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7aWYodGhpcy5ydGUuYnJvd3Nlci5tb3ppbGxhKXt0cnl7dGhpcy5ydGUuZG9jLmV4ZWNDb21tYW5kKHRoaXMubmFtZSxmYWxzZSxudWxsKX1jYXRjaChoKXt2YXIgZj0iIEN0bCArIEMiO2lmKHRoaXMubmFtZT09ImN1dCIpe2Y9IiBDdGwgKyBYIn1lbHNle2lmKHRoaXMubmFtZT09InBhc3RlIil7Zj0iIEN0bCArIFYifX12YXIgZz17ZGlhbG9nOnt0aXRsZTp0aGlzLnJ0ZS5pMThuKCJXYXJuaW5nIiksYnV0dG9uczp7T2s6ZnVuY3Rpb24oKXthKHRoaXMpLmRpYWxvZygiY2xvc2UiKX19fX07dmFyIGo9bmV3IGVsRGlhbG9nRm9ybShnKTtqLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCJUaGlzIG9wZXJhdGlvbiBpcyBkaXNhYmxlZCBpbiB5b3VyIGJyb3dzZXIgb24gc2VjdXJpdHkgcmVhc29uLiBVc2Ugc2hvcnRjdXQgaW5zdGVhZC4iKSsiOiAiK2YpLm9wZW4oKX19ZWxzZXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb21tYW5kLmNhbGwodGhpcyl9fX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmN1dD1lbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuY29weTtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMucGFzdGU9ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmNvcHl9KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuY3NzPWZ1bmN0aW9uKGYsYyl7dmFyIGI9dGhpczt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt0aGlzLmNzc1N0eWxlPWEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI0MiIgbmFtZT0ic3R5bGUiIC8+Jyk7dGhpcy5jc3NDbGFzcz1hKCc8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iNDIiIG5hbWU9ImNsYXNzIiAvPicpO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciBqPXRoaXMubm9kZSgpLGc7dGhpcy5ydGUuc2VsZWN0aW9uLnNhdmVJRVJhbmdlKCk7aWYoail7dmFyIGc9e3N1Ym1pdDpmdW5jdGlvbihrLG8pe2suc3RvcFByb3BhZ2F0aW9uKCk7ay5wcmV2ZW50RGVmYXVsdCgpO28uY2xvc2UoKTtiLnNldCgpfSxkaWFsb2c6e3RpdGxlOnRoaXMucnRlLmkxOG4oIlN0eWxlIiksd2lkdGg6NDUwLHJlc2l6YWJsZTp0cnVlLG1vZGFsOnRydWV9fTt0aGlzLmNzc1N0eWxlLnZhbChhKGopLmF0dHIoInN0eWxlIikpO3RoaXMuY3NzQ2xhc3MudmFsKGEoaikuYXR0cigiY2xhc3MiKSk7dmFyIGg9bmV3IGVsRGlhbG9nRm9ybShnKTtoLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQ3NzIHN0eWxlIiksdGhpcy5jc3NTdHlsZV0sbnVsbCx0cnVlKTtoLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQ3NzIGNsYXNzIiksdGhpcy5jc3NDbGFzc10sbnVsbCx0cnVlKS5vcGVuKCk7c2V0VGltZW91dChmdW5jdGlvbigpe2IuY3NzU3R5bGUuZm9jdXMoKX0sMjApfX07dGhpcy5zZXQ9ZnVuY3Rpb24oKXt2YXIgZz10aGlzLm5vZGUoKTt0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTtpZihnKXthKGcpLmF0dHIoInN0eWxlIix0aGlzLmNzc1N0eWxlLnZhbCgpKTthKGcpLmF0dHIoImNsYXNzIix0aGlzLmNzc0NsYXNzLnZhbCgpKTt0aGlzLnJ0ZS51aS51cGRhdGUoKX19O3RoaXMubm9kZT1mdW5jdGlvbigpe3ZhciBnPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7aWYoZy5ub2RlVHlwZT09Myl7Zz1nLnBhcmVudE5vZGV9cmV0dXJuIGcubm9kZVR5cGU9PTEmJmcubm9kZU5hbWUhPSJCT0RZIj9nOm51bGx9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnRvZ2dsZUNsYXNzKCJkaXNhYmxlZCIsdGhpcy5ub2RlKCk/ZmFsc2U6dHJ1ZSl9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5ydGw9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgYj10aGlzO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksZz10aGlzO2lmKGEoaCkuYXR0cigiZGlyIik9PSJydGwifHxhKGgpLnBhcmVudHMoJ1tkaXI9InJ0bCJdJykubGVuZ3RofHxhKGgpLmZpbmQoJ1tkaXI9InJ0bCJdJykubGVuZ3RoKXthKGgpLnJlbW92ZUF0dHIoImRpciIpO2EoaCkucGFyZW50cygnW2Rpcj0icnRsIl0nKS5yZW1vdmVBdHRyKCJkaXIiKTthKGgpLmZpbmQoJ1tkaXI9InJ0bCJdJykucmVtb3ZlQXR0cigiZGlyIil9ZWxzZXtpZih0aGlzLnJ0ZS5kb20uaXMoaCwidGV4dE5vZGVzIikmJnRoaXMucnRlLmRvbS5pcyhoLCJibG9jayIpKXthKGgpLmF0dHIoImRpciIsInJ0bCIpfWVsc2V7YS5lYWNoKHRoaXMucnRlLmRvbS5wYXJlbnRzKGgsInRleHROb2RlcyIpLGZ1bmN0aW9uKGosayl7aWYoZy5ydGUuZG9tLmlzKGssImJsb2NrIikpe2EoaykuYXR0cigiZGlyIiwicnRsIik7cmV0dXJuIGZhbHNlfX0pfX10aGlzLnJ0ZS51aS51cGRhdGUoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgZz10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpO3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTtpZihhKGcpLmF0dHIoImRpciIpPT0icnRsInx8YShnKS5wYXJlbnRzKCdbZGlyPSJydGwiXScpLmxlbmd0aHx8YShnKS5maW5kKCdbZGlyPSJydGwiXScpLmxlbmd0aCl7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJhY3RpdmUiKX1lbHNle3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiYWN0aXZlIil9fX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmx0cj1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSxnPXRoaXM7aWYoYShoKS5hdHRyKCJkaXIiKT09Imx0ciJ8fGEoaCkucGFyZW50cygnW2Rpcj0ibHRyIl0nKS5sZW5ndGh8fGEoaCkuZmluZCgnW2Rpcj0ibHRyIl0nKS5sZW5ndGgpe2EoaCkucmVtb3ZlQXR0cigiZGlyIik7YShoKS5wYXJlbnRzKCdbZGlyPSJsdHIiXScpLnJlbW92ZUF0dHIoImRpciIpO2EoaCkuZmluZCgnW2Rpcj0ibHRyIl0nKS5yZW1vdmVBdHRyKCJkaXIiKX1lbHNle2lmKHRoaXMucnRlLmRvbS5pcyhoLCJ0ZXh0Tm9kZXMiKSYmdGhpcy5ydGUuZG9tLmlzKGgsImJsb2NrIikpe2EoaCkuYXR0cigiZGlyIiwibHRyIil9ZWxzZXthLmVhY2godGhpcy5ydGUuZG9tLnBhcmVudHMoaCwidGV4dE5vZGVzIiksZnVuY3Rpb24oaixrKXtpZihnLnJ0ZS5kb20uaXMoaywiYmxvY2siKSl7YShrKS5hdHRyKCJkaXIiLCJsdHIiKTtyZXR1cm4gZmFsc2V9fSl9fXRoaXMucnRlLnVpLnVwZGF0ZSgpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBnPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO2lmKGEoZykuYXR0cigiZGlyIik9PSJsdHIifHxhKGcpLnBhcmVudHMoJ1tkaXI9Imx0ciJdJykubGVuZ3RofHxhKGcpLmZpbmQoJ1tkaXI9Imx0ciJdJykubGVuZ3RoKXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImFjdGl2ZSIpfWVsc2V7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJhY3RpdmUiKX19fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5kaXY9ZnVuY3Rpb24oYyxiKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYyxiKTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgZyxmO3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7aWYodGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpKXtnPXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXkRJViQvKTtpZihnKXthKGcpLnJlcGxhY2VXaXRoKGEoZykuaHRtbCgpKX19ZWxzZXtmPXRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7d3JhcDoiYWxsIix0YWc6ImRpdiJ9KTtmLmxlbmd0aCYmdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdChmWzBdLGZbZi5sZW5ndGgtMV0pfXRoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXtpZih0aGlzLnJ0ZS5zZWxlY3Rpb24uY29sbGFwc2VkKCkpe2lmKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXkRJViQvKSl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpLmFkZENsYXNzKCJhY3RpdmUiKX1lbHNle3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQgYWN0aXZlIil9fWVsc2V7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCBhY3RpdmUiKX19fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5kb2NzdHJ1Y3R1cmU9ZnVuY3Rpb24oYyxiKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYyxiKTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0udG9nZ2xlQ2xhc3MoImFjdGl2ZSIpO2EodGhpcy5ydGUuZG9jLmJvZHkpLnRvZ2dsZUNsYXNzKCJlbC1ydGUtc3RydWN0dXJlIil9O3RoaXMuY29tbWFuZCgpO3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZWxmaW5kZXI9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgYj10aGlzO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe2lmKGIucnRlLm9wdGlvbnMuZm1BbGxvdyYmdHlwZW9mKGIucnRlLm9wdGlvbnMuZm1PcGVuKT09ImZ1bmN0aW9uIil7Yi5ydGUub3B0aW9ucy5mbU9wZW4oZnVuY3Rpb24oZyl7Yi5ydGUubG9nKGcpfSl9fTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKGIucnRlLm9wdGlvbnMuZm1BbGxvdyYmdHlwZW9mKGIucnRlLm9wdGlvbnMuZm1PcGVuKT09ImZ1bmN0aW9uIil7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfWVsc2V7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJkaXNhYmxlZCIpfX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZsYXNoPWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGI9dGhpczt0aGlzLnN3Zj1udWxsO3RoaXMucGxhY2Vob2xkZXI9bnVsbDt0aGlzLnNyYz17dXJsOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1cmwiIC8+JykuY3NzKCJ3aWR0aCIsIjk5JSIpLHR5cGU6YSgnPHNlbGVjdCBuYW1lPSJ0eXBlIi8+JykuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCI+Rmxhc2g8L29wdGlvbj4nKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9InZpZGVvL3F1aWNrdGltZSI+UXVpY2t0aW1lIG1vdmllPC9vcHRpb24+JykuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyIj5XaW5kb3dzIG1lZGlhPC9vcHRpb24+Jyksd2lkdGg6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cigic2l6ZSIsNSkuY3NzKCJ0ZXh0LWFsaWduIiwicmlnaHQiKSxoZWlnaHQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cigic2l6ZSIsNSkuY3NzKCJ0ZXh0LWFsaWduIiwicmlnaHQiKSx3bW9kZTphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiIpLnRleHQodGhpcy5ydGUuaTE4bigiTm90IHNldCIsImRpYWxvZ3MiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0cmFuc3BhcmVudCIpLnRleHQodGhpcy5ydGUuaTE4bigiVHJhbnNwYXJlbnQiKSkpLGFsaWduOmEoIjxzZWxlY3QgLz4iKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJOb3Qgc2V0IiwiZGlhbG9ncyIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoImxlZnQiKS50ZXh0KHRoaXMucnRlLmkxOG4oIkxlZnQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJyaWdodCIpLnRleHQodGhpcy5ydGUuaTE4bigiUmlnaHQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0b3AiKS50ZXh0KHRoaXMucnRlLmkxOG4oIlRvcCIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoInRleHQtdG9wIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJUZXh0IHRvcCIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIm1pZGRsZSIpLnRleHQodGhpcy5ydGUuaTE4bigibWlkZGxlIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiYmFzZWxpbmUiKS50ZXh0KHRoaXMucnRlLmkxOG4oIkJhc2VsaW5lIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiYm90dG9tIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJCb3R0b20iKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0ZXh0LWJvdHRvbSIpLnRleHQodGhpcy5ydGUuaTE4bigiVGV4dCBib3R0b20iKSkpLG1hcmdpbjphKCI8ZGl2IC8+Iil9O3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciByPXRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSxqLGs9IiIsQj0iIix0PSIiLHYseix4LEEscSxDO3RoaXMucnRlLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpO3RoaXMuc3JjLm1hcmdpbi5lbFBhZGRpbmdJbnB1dCh7dHlwZToibWFyZ2luIn0pO3RoaXMucGxhY2Vob2xkZXI9bnVsbDt0aGlzLnN3Zj1udWxsO2lmKGEocikuaGFzQ2xhc3MoImVscnRlLW1lZGlhIikmJihBPWEocikuYXR0cigicmVsIikpJiZ0aGlzLnJ0ZS5maWx0ZXIuc2NyaXB0c1tBXSl7dGhpcy5wbGFjZWhvbGRlcj1hKHIpO3E9dGhpcy5ydGUuZmlsdGVyLnNjcmlwdHNbQV07az0iIjtpZihxLmVtYmVkJiZxLmVtYmVkLnNyYyl7az1xLmVtYmVkLnNyY31pZihxLnBhcmFtcyYmcS5wYXJhbXMubGVuZ3RoKXtsPXEucGFyYW1zLmxlbmd0aDt3aGlsZShsLS0pe2lmKHEucGFyYW1zW2xdLm5hbWU9PSJzcmMifHxxLnBhcmFtc1tsXS5uYW1lPT0ibW92aWUiKXtrPXEucGFyYW1zW2xdLnZhbHVlfX19aWYocS5lbWJlZCl7Qj1xLmVtYmVkLndpZHRofHxwYXJzZUludChxLmVtYmVkLnN0eWxlLndpZHRoKXx8IiI7dD1xLmVtYmVkLmhlaWdodHx8cGFyc2VJbnQocS5lbWJlZC5zdHlsZS5oZWlnaHQpfHwiIjtDPXEuZW1iZWQud21vZGV8fCIifWVsc2V7aWYocS5vYmope0I9cS5vYmoud2lkdGh8fHBhcnNlSW50KHEub2JqLnN0eWxlLndpZHRoKXx8IiI7dD1xLm9iai5oZWlnaHR8fHBhcnNlSW50KHEub2JqLnN0eWxlLmhlaWdodCl8fCIiO0M9cS5vYmoud21vZGV8fCIifX1pZihxLm9iail7dj1xLm9iai5zdHlsZVsiZmxvYXQiXXx8IiI7ej1xLm9iai5zdHlsZVsidmVydGljYWwtYWxpZ24iXXx8IiJ9ZWxzZXtpZihxLmVtYmVkKXt2PXEuZW1iZWQuc3R5bGVbImZsb2F0Il18fCIiO3o9cS5lbWJlZC5zdHlsZVsidmVydGljYWwtYWxpZ24iXXx8IiJ9fXRoaXMuc3JjLm1hcmdpbi52YWwocik7dGhpcy5zcmMudHlwZS52YWwocS5lbWJlZD9xLmVtYmVkLnR5cGU6IiIpfWlmKGEocikuaGFzQ2xhc3MoImVscnRlLXN3Zi1wbGFjZWhvbGRlciIpKXt0aGlzLnBsYWNlaG9sZGVyPWEocik7az1hKHIpLmF0dHIoInJlbCIpO0I9cGFyc2VJbnQoYShyKS5jc3MoIndpZHRoIikpfHwiIjt0PXBhcnNlSW50KGEocikuY3NzKCJoZWlnaHQiKSl8fCIiO3Y9YShyKS5jc3MoImZsb2F0Iik7ej1hKHIpLmNzcygidmVydGljYWwtYWxpZ24iKTt0aGlzLnNyYy5tYXJnaW4udmFsKHIpO3RoaXMuc3JjLndtb2RlLnZhbChhKHIpLmF0dHIoIndtb2RlIikpfXRoaXMuc3JjLnVybC52YWwoayk7dGhpcy5zcmMud2lkdGgudmFsKEIpO3RoaXMuc3JjLmhlaWdodC52YWwodCk7dGhpcy5zcmMuYWxpZ24udmFsKHZ8fHopO3RoaXMuc3JjLndtb2RlLnZhbChDKTt2YXIgaj17cnRsOnRoaXMucnRlLnJ0bCxzdWJtaXQ6ZnVuY3Rpb24oaCxvKXtoLnN0b3BQcm9wYWdhdGlvbigpO2gucHJldmVudERlZmF1bHQoKTtiLnNldCgpO28uY2xvc2UoKX0sZGlhbG9nOnt3aWR0aDo1ODAscG9zaXRpb246InRvcCIsdGl0bGU6dGhpcy5ydGUuaTE4bigiRmxhc2giKX19O3ZhciB4PW5ldyBlbERpYWxvZ0Zvcm0oaik7aWYodGhpcy5ydGUub3B0aW9ucy5mbUFsbG93JiZ0aGlzLnJ0ZS5vcHRpb25zLmZtT3Blbil7dmFyIGc9YSgiPHNwYW4gLz4iKS5hcHBlbmQodGhpcy5zcmMudXJsLmNzcygid2lkdGgiLCI4NSUiKSkuYXBwZW5kKGEoIjxzcGFuIC8+IikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLmNzcyh7ImZsb2F0IjoicmlnaHQiLCJtYXJnaW4tcmlnaHQiOiIzcHgifSkuYXR0cigidGl0bGUiLGIucnRlLmkxOG4oIk9wZW4gZmlsZSBtYW5nZXIiKSkuYXBwZW5kKGEoIjxzcGFuIC8+IikuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1mb2xkZXItb3BlbiIpKS5jbGljayhmdW5jdGlvbigpe2IucnRlLm9wdGlvbnMuZm1PcGVuKGZ1bmN0aW9uKGgpe2Iuc3JjLnVybC52YWwoaCkuY2hhbmdlKCl9KX0pLmhvdmVyKGZ1bmN0aW9uKCl7YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKX0sZnVuY3Rpb24oKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSkpfWVsc2V7dmFyIGc9dGhpcy5zcmMudXJsfXguYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJVUkwiKSxnXSxudWxsLHRydWUpO3guYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJUeXBlIiksdGhpcy5zcmMudHlwZV0sbnVsbCx0cnVlKTt4LmFwcGVuZChbdGhpcy5ydGUuaTE4bigiU2l6ZSIpLGEoIjxzcGFuIC8+IikuYXBwZW5kKHRoaXMuc3JjLndpZHRoKS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLnNyYy5oZWlnaHQpLmFwcGVuZCgiIHB4IildLG51bGwsdHJ1ZSk7eC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIldtb2RlIiksdGhpcy5zcmMud21vZGVdLG51bGwsdHJ1ZSk7eC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkFsaWdubWVudCIpLHRoaXMuc3JjLmFsaWduXSxudWxsLHRydWUpO3guYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJNYXJnaW5zIiksdGhpcy5zcmMubWFyZ2luXSxudWxsLHRydWUpO3gub3BlbigpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtiLnNyYy51cmwuZm9jdXMoKX0sMTAwKTt2YXIgdT1hKCI8ZmllbGRzZXQgLz4iKS5hcHBlbmQoYSgiPGxlZ2VuZCAvPiIpLnRleHQodGhpcy5ydGUuaTE4bigiUHJldmlldyIpKSk7eC5hcHBlbmQodSwibWFpbiIpO3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2EocCkuYXR0cigic3JjIiwiIyIpLmFkZENsYXNzKCJlbC1ydGUtcHJldmlldyIpLmFwcGVuZFRvKHUpO2h0bWw9dGhpcy5ydGUub3B0aW9ucy5kb2N0eXBlKyc8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+PC9oZWFkPjxib2R5IHN0eWxlPSJwYWRkaW5nOjA7bWFyZ2luOjA7Zm9udC1zaXplOjlweCI+IFByb2luIGVsaXQgYXJjdSwgcnV0cnVtIGNvbW1vZG8sIHZlaGljdWxhIHRlbXB1cywgY29tbW9kbyBhLCByaXN1cy4gQ3VyYWJpdHVyIG5lYyBhcmN1LiBEb25lYyBzb2xsaWNpdHVkaW4gbWkgc2l0IGFtZXQgbWF1cmlzLiBOYW0gZWxlbWVudHVtIHF1YW0gdWxsYW1jb3JwZXIgYW50ZS4gRXRpYW0gYWxpcXVldCBtYXNzYSBldCBsb3JlbS4gTWF1cmlzIGRhcGlidXMgbGFjdXMgYXVjdG9yIHJpc3VzLiBBZW5lYW4gdGVtcG9yIHVsbGFtY29ycGVyIGxlby4gVml2YW11cyBzZWQgbWFnbmEgcXVpcyBsaWd1bGEgZWxlaWZlbmQgYWRpcGlzY2luZy4gRHVpcyBvcmNpLiBBbGlxdWFtIHNvZGFsZXMgdG9ydG9yIHZpdGFlIGlwc3VtLiBBbGlxdWFtIG51bGxhLiBEdWlzIGFsaXF1YW0gbW9sZXN0aWUgZXJhdC4gVXQgZXQgbWF1cmlzIHZlbCBwZWRlIHZhcml1cyBzb2xsaWNpdHVkaW48L2JvZHk+PC9odG1sPic7cC5jb250ZW50V2luZG93LmRvY3VtZW50Lm9wZW4oKTtwLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoaHRtbCk7cC5jb250ZW50V2luZG93LmRvY3VtZW50LmNsb3NlKCk7dGhpcy5mcmFtZT1wLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7dGhpcy5wcmV2aWV3PWEocC5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkpO3RoaXMuc3JjLnR5cGUuY2hhbmdlKGZ1bmN0aW9uKCl7Yi5zcmMudXJsLmNoYW5nZSgpfSk7dGhpcy5zcmMud2lkdGguY2hhbmdlKGZ1bmN0aW9uKCl7aWYoYi5zd2Ype3ZhciBoPXBhcnNlSW50KGEodGhpcykudmFsKCkpfHwiIjthKHRoaXMpLnZhbChoKTtiLnN3Zi5jc3MoIndpZHRoIixoKTtiLnN3Zi5jaGlsZHJlbigiZW1iZWQiKS5jc3MoIndpZHRoIixoKX1lbHNle2EodGhpcykudmFsKCIiKX19KTt0aGlzLnNyYy5oZWlnaHQuY2hhbmdlKGZ1bmN0aW9uKCl7aWYoYi5zd2Ype3ZhciBvPXBhcnNlSW50KGEodGhpcykudmFsKCkpfHwiIjthKHRoaXMpLnZhbChvKTtiLnN3Zi5jc3MoImhlaWdodCIsbyk7Yi5zd2YuY2hpbGRyZW4oImVtYmVkIikuY3NzKCJoZWlnaHQiLG8pfWVsc2V7YSh0aGlzKS52YWwoIiIpfX0pO3RoaXMuc3JjLndtb2RlLmNoYW5nZShmdW5jdGlvbigpe2lmKGIuc3dmKXt2YXIgaD1hKHRoaXMpLnZhbCgpO2lmKGgpe2Iuc3dmLmF0dHIoIndtb2RlIixoKTtiLnN3Zi5jaGlsZHJlbigiZW1iZWQiKS5hdHRyKCJ3bW9kZSIsaCl9ZWxzZXtiLnN3Zi5yZW1vdmVBdHRyKCJ3bW9kZSIpO2Iuc3dmLmNoaWxkcmVuKCJlbWJlZCIpLnJlbW92ZUF0dHIoIndtb2RlIil9fX0pO3RoaXMuc3JjLmFsaWduLmNoYW5nZShmdW5jdGlvbigpe3ZhciBoPWEodGhpcykudmFsKCksbz1oPT0ibGVmdCJ8fGg9PSJyaWdodCI7aWYoYi5zd2Ype2Iuc3dmLmNzcyh7ImZsb2F0IjpvP2g6IiIsInZlcnRpY2FsLWFsaWduIjpvPyIiOmh9KX1lbHNle2EodGhpcykudmFsKCIiKX19KTt0aGlzLnNyYy5tYXJnaW4uY2hhbmdlKGZ1bmN0aW9uKCl7aWYoYi5zd2Ype3ZhciBoPWIuc3JjLm1hcmdpbi52YWwoKTtpZihoLmNzcyl7Yi5zd2YuY3NzKCJtYXJnaW4iLGguY3NzKX1lbHNle2Iuc3dmLmNzcygibWFyZ2luLXRvcCIsaC50b3ApO2Iuc3dmLmNzcygibWFyZ2luLXJpZ2h0IixoLnJpZ2h0KTtiLnN3Zi5jc3MoIm1hcmdpbi1ib3R0b20iLGguYm90dG9tKTtiLnN3Zi5jc3MoIm1hcmdpbi1sZWZ0IixoLmxlZnQpfX19KTt0aGlzLnNyYy51cmwuY2hhbmdlKGZ1bmN0aW9uKCl7dmFyIGg9Yi5ydGUudXRpbHMuYWJzb2x1dGVVUkwoYSh0aGlzKS52YWwoKSksbyx3O2lmKGgpe289Yi5ydGUudXRpbHMubWVkaWFJbmZvKGIuc3JjLnR5cGUudmFsKCkpO2lmKCFvKXtvPWIucnRlLnV0aWwubWVkaWFJbmZvKCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpfXc9JzxvYmplY3QgY2xhc3NpZD0iJytvLmNsYXNzaWQrJyIgY29kZWJhc2U9Iicrby5jb2RlYmFzZSsnIj48cGFyYW0gbmFtZT0ic3JjIiB2YWx1ZT0iJytoKyciIC8+PGVtYmVkIHF1YWxpdHk9ImhpZ2giIHNyYz0iJytoKyciIHR5cGU9Iicrby50eXBlKyciPjwvb2JqZWN0Pic7Yi5wcmV2aWV3LmNoaWxkcmVuKCJvYmplY3QiKS5yZW1vdmUoKS5lbmQoKS5wcmVwZW5kKHcpO2Iuc3dmPWIucHJldmlldy5jaGlsZHJlbigib2JqZWN0IikuZXEoMCl9ZWxzZXtpZihiLnN3Zil7Yi5zd2YucmVtb3ZlKCk7Yi5zd2Y9bnVsbH19Yi5zcmMud2lkdGgudHJpZ2dlcigiY2hhbmdlIik7Yi5zcmMuaGVpZ2h0LnRyaWdnZXIoImNoYW5nZSIpO2Iuc3JjLmFsaWduLnRyaWdnZXIoImNoYW5nZSIpfSkudHJpZ2dlcigiY2hhbmdlIil9O3RoaXMuc2V0PWZ1bmN0aW9uKCl7Yi5zd2Y9bnVsbDt2YXIgZz10aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCh0aGlzLnNyYy51cmwudmFsKCkpLEI9cGFyc2VJbnQodGhpcy5zcmMud2lkdGgudmFsKCkpfHwiIix0PXBhcnNlSW50KHRoaXMuc3JjLmhlaWdodC52YWwoKSl8fCIiLEM9dGhpcy5zcmMud21vZGUudmFsKCksej10aGlzLnNyYy5hbGlnbi52YWwoKSx2PXo9PSJsZWZ0Inx8ej09InJpZ2h0Ij96OiIiLEE9dGhpcy5wbGFjZWhvbGRlcj90aGlzLnBsYWNlaG9sZGVyLmF0dHIoInJlbCIpOiIiLHAsayx4LHE9dGhpcy5zcmMubWFyZ2luLnZhbCgpLHI7aWYoIWcpe2lmKHRoaXMucGxhY2Vob2xkZXIpe3RoaXMucGxhY2Vob2xkZXIucmVtb3ZlKCk7ZGVsZXRlIHRoaXMucnRlLmZpbHRlci5zY3JpcHRzW0FdfX1lbHNle2k9Yi5ydGUudXRpbHMubWVkaWFJbmZvKGIuc3JjLnR5cGUudmFsKCkpO2lmKCFpKXtpPWIucnRlLnV0aWwubWVkaWFJbmZvKCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpfXg9dGhpcy5ydGUuZmlsdGVyLnZpZGVvSG9zdFJlZ0V4cC50ZXN0KGcpP2cucmVwbGFjZSh0aGlzLnJ0ZS5maWx0ZXIudmlkZW9Ib3N0UmVnRXhwLCIkMiIpOmkudHlwZS5yZXBsYWNlKC9eXHcrXC8oLispLywiJDEiKTtwPXtvYmo6e2NsYXNzaWQ6aS5jbGFzc2lkWzBdLGNvZGViYXNlOmkuY29kZWJhc2Usc3R5bGU6e319LHBhcmFtczpbe25hbWU6InNyYyIsdmFsdWU6Z31dLGVtYmVkOntzcmM6Zyx0eXBlOmkudHlwZSxxdWFsaXR5OiJoaWdoIix3bW9kZTpDLHN0eWxlOnt9fX07aWYoQil7cC5vYmoud2lkdGg9QjtwLmVtYmVkLndpZHRoPUJ9aWYodCl7cC5vYmouaGVpZ2h0PXQ7cC5lbWJlZC5oZWlnaHQ9dH1pZih2KXtwLm9iai5zdHlsZVsiZmxvYXQiXT12fWVsc2V7aWYoeil7cC5vYmouc3R5bGVbInZlcnRpY2FsLWFsaWduIl09en19aWYocS5jc3Mpe3I9e21hcmdpbjpxLmNzc319ZWxzZXtyPXsibWFyZ2luLXRvcCI6cS50b3AsIm1hcmdpbi1yaWdodCI6cS5yaWdodCwibWFyZ2luLWJvdHRvbSI6cS5ib3R0b20sIm1hcmdpbi1sZWZ0IjpxLmxlZnR9fXAub2JqLnN0eWxlPWEuZXh0ZW5kKHt9LHAub2JqLnN0eWxlLHIpO2lmKHRoaXMucGxhY2Vob2xkZXImJkEpe2s9dGhpcy5ydGUuZmlsdGVyLnNjcmlwdHNbQV18fHt9O3A9YS5leHRlbmQodHJ1ZSxrLHApO2RlbGV0ZSBwLm9iai5zdHlsZS53aWR0aDtkZWxldGUgcC5vYmouc3R5bGUuaGVpZ2h0O2RlbGV0ZSBwLmVtYmVkLnN0eWxlLndpZHRoO2RlbGV0ZSBwLmVtYmVkLnN0eWxlLmhlaWdodDt0aGlzLnJ0ZS5maWx0ZXIuc2NyaXB0c1tBXT1wO3RoaXMucGxhY2Vob2xkZXIucmVtb3ZlQXR0cigiY2xhc3MiKX1lbHNle3ZhciBqPSJtZWRpYSIrTWF0aC5yYW5kb20oKS50b1N0cmluZygpLnN1YnN0cmluZygyKTt0aGlzLnJ0ZS5maWx0ZXIuc2NyaXB0c1tqXT1wO3RoaXMucGxhY2Vob2xkZXI9YSh0aGlzLnJ0ZS5kb20uY3JlYXRlKCJpbWciKSkuYXR0cigicmVsIixqKS5hdHRyKCJzcmMiLHRoaXMucnRlLmZpbHRlci51cmwrInBpeGVsLmdpZiIpO3ZhciB1PXRydWV9dGhpcy5wbGFjZWhvbGRlci5hdHRyKCJ0aXRsZSIsdGhpcy5ydGUudXRpbHMuZW5jb2RlKGcpKS5hdHRyKCJ3aWR0aCIsQnx8MTUwKS5hdHRyKCJoZWlnaHQiLHR8fDEwMCkuYWRkQ2xhc3MoImVscnRlLXByb3RlY3RlZCBlbHJ0ZS1tZWRpYSBlbHJ0ZS1tZWRpYS0iK3gpLmNzcyhwLm9iai5zdHlsZSk7aWYodil7dGhpcy5wbGFjZWhvbGRlci5jc3MoImZsb2F0Iix2KS5jc3MoInZlcnRpY2FsLWFsaWduIiwiIil9ZWxzZXtpZih6KXt0aGlzLnBsYWNlaG9sZGVyLmNzcygiZmxvYXQiLCIiKS5jc3MoInZlcnRpY2FsLWFsaWduIix6KX1lbHNle3RoaXMucGxhY2Vob2xkZXIuY3NzKCJmbG9hdCIsIiIpLmNzcygidmVydGljYWwtYWxpZ24iLCIiKX19aWYodSl7dGhpcy5ydGUud2luZG93LmZvY3VzKCk7dGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7dGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydE5vZGUodGhpcy5wbGFjZWhvbGRlci5nZXQoMCkpfX19O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3ZhciBnPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7dGhpcy5kb21FbGVtLnRvZ2dsZUNsYXNzKCJhY3RpdmUiLGcmJmcubm9kZU5hbWU9PSJJTUciJiZhKGcpLmhhc0NsYXNzKCJlbHJ0ZS1tZWRpYSIpKX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZvbnRuYW1lPWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGI9dGhpczt2YXIgZz17dHBsOic8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JXZhbCI+JWxhYmVsPC9zcGFuPicsc2VsZWN0OmZ1bmN0aW9uKGgpe2Iuc2V0KGgpfSxzcmM6eyIiOnRoaXMucnRlLmkxOG4oIkZvbnQiKSwiYW5kYWxlIG1vbm8sc2Fucy1zZXJpZiI6IkFuZGFsZSBNb25vIiwiYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWYiOiJBcmlhbCIsImFyaWFsIGJsYWNrLGdhZGdldCxzYW5zLXNlcmlmIjoiQXJpYWwgQmxhY2siLCJib29rIGFudGlxdWEscGFsYXRpbm8sc2Fucy1zZXJpZiI6IkJvb2sgQW50aXF1YSIsImNvbWljIHNhbnMgbXMsY3Vyc2l2ZSI6IkNvbWljIFNhbnMgTVMiLCJjb3VyaWVyIG5ldyxjb3VyaWVyLG1vbm9zcGFjZSI6IkNvdXJpZXIgTmV3IiwiZ2VvcmdpYSxwYWxhdGlubyxzZXJpZiI6Ikdlb3JnaWEiLCJoZWx2ZXRpY2Esc2Fucy1zZXJpZiI6IkhlbHZldGljYSIsImltcGFjdCxzYW5zLXNlcmlmIjoiSW1wYWN0IiwibHVjaWRhIGNvbnNvbGUsbW9uYWNvLG1vbm9zcGFjZSI6Ikx1Y2lkYSBjb25zb2xlIiwibHVjaWRhIHNhbnMgdW5pY29kZSxsdWNpZGEgZ3JhbmRlLHNhbnMtc2VyaWYiOiJMdWNpZGEgZ3JhbmRlIiwidGFob21hLHNhbnMtc2VyaWYiOiJUYWhvbWEiLCJ0aW1lcyBuZXcgcm9tYW4sdGltZXMsc2VyaWYiOiJUaW1lcyBOZXcgUm9tYW4iLCJ0cmVidWNoZXQgbXMsbHVjaWRhIGdyYW5kZSx2ZXJkYW5hLHNhbnMtc2VyaWYiOiJUcmVidWNoZXQgTVMiLCJ2ZXJkYW5hLGdlbmV2YSxzYW5zLXNlcmlmIjoiVmVyZGFuYSJ9fTt0aGlzLnNlbGVjdD10aGlzLmRvbUVsZW0uZWxTZWxlY3QoZyk7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7fTt0aGlzLnNldD1mdW5jdGlvbihqKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7ZmlsdGVyOiJ0ZXh0Q29udGFpbnNOb2RlcyJ9KTthLmVhY2goaCxmdW5jdGlvbigpeyR0aGlzPS9eKFRIRUFEfFRGT09UfFRCT0RZfENPTHxDT0xHUk9VUHxUUikkLy50ZXN0KHRoaXMubm9kZU5hbWUpP2EodGhpcykuZmluZCgidGQsdGgiKTphKHRoaXMpO2EodGhpcykuY3NzKCJmb250LWZhbWlseSIsaikuZmluZCgiW3N0eWxlXSIpLmNzcygiZm9udC1mYW1pbHkiLCIiKX0pO3RoaXMucnRlLnVpLnVwZGF0ZSgpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTt2YXIgaj10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpO2lmKGoubm9kZVR5cGUhPTEpe2o9ai5wYXJlbnROb2RlfXZhciBoPWEoaikuY3NzKCJmb250LWZhbWlseSIpO2g9aD9oLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8sXHMrL2csIiwiKS5yZXBsYWNlKC8nfCIvZywiIik6IiI7dGhpcy5zZWxlY3QudmFsKGcuc3JjW2hdP2g6IiIpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZm9udHNpemU9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgYj10aGlzO3ZhciBnPXtsYWJlbFRwbDoiJWxhYmVsIix0cGw6JzxzcGFuIHN0eWxlPSJmb250LXNpemU6JXZhbDtsaW5lLWhlaWdodDoxLjJlbSI+JWxhYmVsPC9zcGFuPicsc2VsZWN0OmZ1bmN0aW9uKGgpe2Iuc2V0KGgpfSxzcmM6eyIiOnRoaXMucnRlLmkxOG4oIkZvbnQgc2l6ZSIpLCJ4eC1zbWFsbCI6dGhpcy5ydGUuaTE4bigiU21hbGwgKDhwdCkiKSwieC1zbWFsbCI6dGhpcy5ydGUuaTE4bigiU21hbGwgKDEwcHgpIiksc21hbGw6dGhpcy5ydGUuaTE4bigiU21hbGwgKDEycHQpIiksbWVkaXVtOnRoaXMucnRlLmkxOG4oIk5vcm1hbCAoMTRwdCkiKSxsYXJnZTp0aGlzLnJ0ZS5pMThuKCJMYXJnZSAoMThwdCkiKSwieC1sYXJnZSI6dGhpcy5ydGUuaTE4bigiTGFyZ2UgKDI0cHQpIiksInh4LWxhcmdlIjp0aGlzLnJ0ZS5pMThuKCJMYXJnZSAoMzZwdCkiKX19O3RoaXMuc2VsZWN0PXRoaXMuZG9tRWxlbS5lbFNlbGVjdChnKTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt9O3RoaXMuc2V0PWZ1bmN0aW9uKGope3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7dmFyIGg9dGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdGVkKHtmaWx0ZXI6InRleHRDb250YWluc05vZGVzIn0pO2EuZWFjaChoLGZ1bmN0aW9uKCl7JHRoaXM9L14oVEhFQUR8VEZPT1R8VEJPRFl8Q09MfENPTEdST1VQfFRSKSQvLnRlc3QodGhpcy5ub2RlTmFtZSk/YSh0aGlzKS5maW5kKCJ0ZCx0aCIpOmEodGhpcyk7JHRoaXMuY3NzKCJmb250LXNpemUiLGopLmZpbmQoIltzdHlsZV0iKS5jc3MoImZvbnQtc2l6ZSIsIiIpfSk7dGhpcy5ydGUudWkudXBkYXRlKCl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7dGhpcy5zZWxlY3QudmFsKChtPXRoaXMucnRlLmRvbS5hdHRyKGgsInN0eWxlIikubWF0Y2goL2ZvbnQtc2l6ZTpccyooW147XSspL2kpKT9tWzFdOiIiKX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZvcmVjb2xvcj1mdW5jdGlvbihmLGMpe3ZhciBiPXRoaXM7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGc9eyJjbGFzcyI6IiIsY29sb3I6dGhpcy5kZWZhdWx0Q29sb3IsdXBkYXRlOmZ1bmN0aW9uKGgpe2IuaW5kaWNhdG9yLmNzcygiYmFja2dyb3VuZC1jb2xvciIsaCl9LGNoYW5nZTpmdW5jdGlvbihoKXtiLnNldChoKX19O3RoaXMuZGVmYXVsdENvbG9yPXRoaXMubmFtZT09ImZvcmVjb2xvciI/IiMwMDAwMDAiOiIjZmZmZmZmIjt0aGlzLnBpY2tlcj10aGlzLmRvbUVsZW0uZWxDb2xvclBpY2tlcihnKTt0aGlzLmluZGljYXRvcj1hKCI8ZGl2IC8+IikuYWRkQ2xhc3MoImNvbG9yLWluZGljYXRvciIpLnByZXBlbmRUbyh0aGlzLmRvbUVsZW0pO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe307dGhpcy5zZXQ9ZnVuY3Rpb24oayl7aWYoIXRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSl7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt2YXIgaD10aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe2NvbGxhcHNlOmZhbHNlLHdyYXA6InRleHQifSksaj10aGlzLm5hbWU9PSJmb3JlY29sb3IiPyJjb2xvciI6ImJhY2tncm91bmQtY29sb3IiO2EuZWFjaChoLGZ1bmN0aW9uKCl7aWYoL14oVEhFQUR8VEJPRFl8VEZPT1R8VFIpJC8udGVzdCh0aGlzLm5vZGVOYW1lKSl7YSh0aGlzKS5maW5kKCJ0ZCx0aCIpLmVhY2goZnVuY3Rpb24oKXthKHRoaXMpLmNzcyhqLGspLmZpbmQoIioiKS5jc3MoaiwiIil9KX1lbHNle2EodGhpcykuY3NzKGosaykuZmluZCgiKiIpLmNzcyhqLCIiKX19KTt0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9fTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTt2YXIgaD10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpO3RoaXMucGlja2VyLnZhbCh0aGlzLnJ0ZS51dGlscy5yZ2IyaGV4KGEoaC5ub2RlVHlwZSE9MT9oLnBhcmVudE5vZGU6aCkuY3NzKHRoaXMubmFtZT09ImZvcmVjb2xvciI/ImNvbG9yIjoiYmFja2dyb3VuZC1jb2xvciIpKXx8dGhpcy5kZWZhdWx0Q29sb3IpfX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmhpbGl0ZWNvbG9yPWVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5mb3JlY29sb3J9KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZm9ybWF0YmxvY2s9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgaD10aGlzLnJ0ZS5icm93c2VyLm1zaWU/ZnVuY3Rpb24oail7Yi52YWw9ajtiLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb21tYW5kLmNhbGwoYil9OmZ1bmN0aW9uKGope2IuaWVDb21tYW5kKGopfTt2YXIgYj10aGlzO3ZhciBnPXtsYWJlbFRwbDoiJWxhYmVsIix0cGxzOnsiIjoiJWxhYmVsIn0sc2VsZWN0OmZ1bmN0aW9uKGope2IuZm9ybWF0QmxvY2soail9LHNyYzp7c3Bhbjp0aGlzLnJ0ZS5pMThuKCJGb3JtYXQiKSxoMTp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDEiKSxoMjp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDIiKSxoMzp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDMiKSxoNDp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDQiKSxoNTp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDUiKSxoNjp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDYiKSxwOnRoaXMucnRlLmkxOG4oIlBhcmFncmFwaCIpLGFkZHJlc3M6dGhpcy5ydGUuaTE4bigiQWRkcmVzcyIpLHByZTp0aGlzLnJ0ZS5pMThuKCJQcmVmb3JtYXR0ZWQiKSxkaXY6dGhpcy5ydGUuaTE4bigiTm9ybWFsIChESVYpIil9fTt0aGlzLnNlbGVjdD10aGlzLmRvbUVsZW0uZWxTZWxlY3QoZyk7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7fTt0aGlzLmZvcm1hdEJsb2NrPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHQoeix2KXtmdW5jdGlvbiB4KEEpe2EoQSkuZmluZCgiaDEsaDIsaDMsaDQsaDUsaDYscCxhZGRyZXNzLHByZSIpLmVhY2goZnVuY3Rpb24oKXthKHRoaXMpLnJlcGxhY2VXaXRoKGEodGhpcykuaHRtbCgpKX0pO3JldHVybiBBfWlmKC9eKExJfERUfEREfFREfFRIfENBUFRJT04pJC8udGVzdCh6Lm5vZGVOYW1lKSl7IWIucnRlLmRvbS5pc0VtcHR5KHopJiZiLnJ0ZS5kb20ud3JhcENvbnRlbnRzKHgoeiksdil9ZWxzZXtpZigvXihVTHxPTHxETHxUQUJMRSkkLy50ZXN0KHoubm9kZU5hbWUpKXtiLnJ0ZS5kb20ud3JhcCh6LHYpfWVsc2V7IWIucnRlLmRvbS5pc0VtcHR5KHopJiZhKHgoeikpLnJlcGxhY2VXaXRoKGEoYi5ydGUuZG9tLmNyZWF0ZSh2KSkuaHRtbChhKHopLmh0bWwoKSkpfX19dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt2YXIgdz11LnRvVXBwZXJDYXNlKCkscCxvLHIscT10aGlzLnJ0ZS5zZWxlY3Rpb24uY29sbGFwc2VkKCksaz10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKSxqPXRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7Y29sbGFwc2VkOnRydWUsYmxvY2tzOnRydWUsZmlsdGVyOiJ0ZXh0Q29udGFpbnNOb2RlcyIsd3JhcDoiaW5saW5lIix0YWc6InNwYW4ifSk7bD1qLmxlbmd0aCxzPWEoalswXSkucHJldigpLGU9YShqW2oubGVuZ3RoLTFdKS5uZXh0KCk7d2hpbGUobC0tKXtvPWpbbF07cj1hKG8pO2lmKHc9PSJESVYifHx3PT0iU1BBTiIpe2lmKC9eKEhbMS02XXxQfEFERFJFU1N8UFJFKSQvLnRlc3Qoby5ub2RlTmFtZSkpe3IucmVwbGFjZVdpdGgoYSh0aGlzLnJ0ZS5kb20uY3JlYXRlKCJkaXYiKSkuaHRtbChyLmh0bWwoKXx8IiIpKX19ZWxzZXtpZigvXihUSEVBRHxUQk9EWXxURk9PVHxUUikkLy50ZXN0KG8ubm9kZU5hbWUpKXtyLmZpbmQoInRkLHRoIikuZWFjaChmdW5jdGlvbigpe3QodGhpcyx3KX0pfWVsc2V7aWYoby5ub2RlTmFtZSE9dyl7dChvLHcpfX19fXRoaXMucnRlLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhrKTt0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3ZhciBqPXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXihIWzEtNl18UHxBRERSRVNTfFBSRSkkLyk7dGhpcy5zZWxlY3QudmFsKGo/ai5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOiJzcGFuIil9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5mdWxsc2NyZWVuPWZ1bmN0aW9uKGcsZil7dmFyIGI9dGhpczt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZyxmKTt0aGlzLmFjdGl2ZT10cnVlO3RoaXMuZWRpdG9yPWcuZWRpdG9yO3RoaXMud3o9Zy53b3Jrem9uZTt0aGlzLmhlaWdodD0wO3RoaXMuZGVsdGE9MDt0aGlzLl9jbGFzcz0iZWwtZnVsbHNjcmVlbiI7c2V0VGltZW91dChmdW5jdGlvbigpe2IuaGVpZ2h0PWIud3ouaGVpZ2h0KCk7Yi5kZWx0YT1iLmVkaXRvci5vdXRlckhlaWdodCgpLWIuaGVpZ2h0fSw1MCk7ZnVuY3Rpb24gYygpe2Iud3ouaGVpZ2h0KGEod2luZG93KS5oZWlnaHQoKS1iLmRlbHRhKTtiLnJ0ZS51cGRhdGVIZWlnaHQoKX10aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgQj1hKHdpbmRvdyksdT10aGlzLmVkaXRvcixrPXUucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbihoLHApe3JldHVybiAhL14oaHRtbHxib2R5KSQvaS50ZXN0KHAubm9kZU5hbWUpJiZhKHApLmNzcygicG9zaXRpb24iKT09InJlbGF0aXZlIn0pLHE9dGhpcy53eix6PXRoaXMuX2NsYXNzLHQ9dS5oYXNDbGFzcyh6KSxqPXRoaXMucnRlLEM9dGhpcy5ydGUuc2VsZWN0aW9uLG89YS5icm93c2VyLm1vemlsbGEsQSxyO2Z1bmN0aW9uIHgoKXtpZihvKXtBPUMuZ2V0Qm9va21hcmsoKX19ZnVuY3Rpb24gdigpe2lmKG8pe2Iud3ouY2hpbGRyZW4oKS50b2dnbGUoKTtiLnJ0ZS5zb3VyY2UuZm9jdXMoKTtiLnd6LmNoaWxkcmVuKCkudG9nZ2xlKCk7Qy5tb3ZlVG9Cb29rbWFyayhBKX19eCgpO2suY3NzKCJwb3NpdGlvbiIsdD8icmVsYXRpdmUiOiJzdGF0aWMiKTtpZih0KXt1LnJlbW92ZUNsYXNzKHopO3EuaGVpZ2h0KHRoaXMuaGVpZ2h0KTtCLnVuYmluZCgicmVzaXplIixjKTt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfWVsc2V7dS5hZGRDbGFzcyh6KS5yZW1vdmVBdHRyKCJzdHlsZSIpO3EuaGVpZ2h0KEIuaGVpZ2h0KCktdGhpcy5kZWx0YSkuY3NzKCJ3aWR0aCIsIjEwMCUiKTtCLmJpbmQoInJlc2l6ZSIsYyk7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJhY3RpdmUiKX1qLnVwZGF0ZUhlaWdodCgpO2oucmVzaXphYmxlKHQpO3YoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5ob3Jpem9udGFscnVsZT1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5zcmM9e3dpZHRoOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoe25hbWU6IndpZHRoIixzaXplOjR9KS5jc3MoInRleHQtYWxpZ24iLCJyaWdodCIpLHd1bml0OmEoIjxzZWxlY3QgLz4iKS5hdHRyKCJuYW1lIiwid3VuaXQiKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiJSIpLnRleHQoIiUiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoInB4IikudGV4dCgicHgiKSkudmFsKCIlIiksaGVpZ2h0OmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoe25hbWU6ImhlaWdodCIsc2l6ZTo0fSkuY3NzKCJ0ZXh0LWFsaWduIiwicmlnaHQiKSxiZzphKCI8ZGl2IC8+IiksYm9yZGVyOmEoIjxkaXYgLz4iKSwiY2xhc3MiOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmNzcygid2lkdGgiLCIxMDAlIiksc3R5bGU6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCJ3aWR0aCIsIjEwMCUiKX07dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dGhpcy5zcmMuYmcuZWxDb2xvclBpY2tlcih7cGFsZXR0ZVBvc2l0aW9uOiJvdXRlciIsImNsYXNzIjoiZWwtY29sb3JwaWNrZXIgdWktaWNvbiB1aS1pY29uLXBlbmNpbCJ9KTt2YXIgaz10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCk7dGhpcy5ocj1rLm5vZGVOYW1lPT0iSFIiP2Eoayk6YShmLmRvYy5jcmVhdGVFbGVtZW50KCJociIpKS5jc3Moe3dpZHRoOiIxMDAlIixoZWlnaHQ6IjFweCJ9KTt0aGlzLnNyYy5ib3JkZXIuZWxCb3JkZXJTZWxlY3Qoe3N0eWxlSGVpZ2h0OjczLHZhbHVlOnRoaXMuaHJ9KTt2YXIgZz10aGlzLmhyLmNzcygid2lkdGgiKXx8dGhpcy5oci5hdHRyKCJ3aWR0aCIpO3RoaXMuc3JjLndpZHRoLnZhbChwYXJzZUludChnKXx8MTAwKTt0aGlzLnNyYy53dW5pdC52YWwoZy5pbmRleE9mKCJweCIpIT0tMT8icHgiOiIlIik7dGhpcy5zcmMuaGVpZ2h0LnZhbCh0aGlzLnJ0ZS51dGlscy50b1BpeGVscyh0aGlzLmhyLmNzcygiaGVpZ2h0Iil8fHRoaXMuaHIuYXR0cigiaGVpZ2h0IikpfHwxKTt0aGlzLnNyYy5iZy52YWwodGhpcy5ydGUudXRpbHMuY29sb3IySGV4KHRoaXMuaHIuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIikpKTt0aGlzLnNyY1siY2xhc3MiXS52YWwodGhpcy5ydGUuZG9tLmF0dHIodGhpcy5ociwiY2xhc3MiKSk7dGhpcy5zcmMuc3R5bGUudmFsKHRoaXMucnRlLmRvbS5hdHRyKHRoaXMuaHIsInN0eWxlIikpO3ZhciBoPXtydGw6dGhpcy5ydGUucnRsLHN1Ym1pdDpmdW5jdGlvbihvLHApe28uc3RvcFByb3BhZ2F0aW9uKCk7by5wcmV2ZW50RGVmYXVsdCgpO2Iuc2V0KCk7cC5jbG9zZSgpfSxkaWFsb2c6e3RpdGxlOnRoaXMucnRlLmkxOG4oIkhvcml6b250YWwgcnVsZSIpfX07dmFyIGo9bmV3IGVsRGlhbG9nRm9ybShoKTtqLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiV2lkdGgiKSxhKCI8c3BhbiAvPiIpLmFwcGVuZCh0aGlzLnNyYy53aWR0aCkuYXBwZW5kKHRoaXMuc3JjLnd1bml0KV0sbnVsbCx0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkhlaWdodCIpLGEoIjxzcGFuIC8+IikuYXBwZW5kKHRoaXMuc3JjLmhlaWdodCkuYXBwZW5kKCIgcHgiKV0sbnVsbCx0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkJvcmRlciIpLHRoaXMuc3JjLmJvcmRlcl0sbnVsbCx0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkJhY2tncm91bmQiKSx0aGlzLnNyYy5iZ10sbnVsbCx0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkNzcyBjbGFzcyIpLHRoaXMuc3JjWyJjbGFzcyJdXSxudWxsLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQ3NzIHN0eWxlIiksdGhpcy5zcmMuc3R5bGVdLG51bGwsdHJ1ZSkub3BlbigpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTtpZih0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCkubm9kZU5hbWU9PSJIUiIpe3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX07dGhpcy5zZXQ9ZnVuY3Rpb24oKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOyF0aGlzLmhyLnBhcmVudE5vZGUmJnRoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnROb2RlKHRoaXMuaHIuZ2V0KDApKTt2YXIgaD17bm9zaGFkZTp0cnVlLHN0eWxlOnRoaXMuc3JjLnN0eWxlLnZhbCgpfTt2YXIgZz10aGlzLnNyYy5ib3JkZXIudmFsKCk7dmFyIGo9e3dpZHRoOihwYXJzZUludCh0aGlzLnNyYy53aWR0aC52YWwoKSl8fDEwMCkrdGhpcy5zcmMud3VuaXQudmFsKCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuc3JjLmhlaWdodC52YWwoKSl8fDEsImJhY2tncm91bmQtY29sb3IiOnRoaXMuc3JjLmJnLnZhbCgpLGJvcmRlcjpnLndpZHRoJiZnLnN0eWxlP2cud2lkdGgrIiAiK2cuc3R5bGUrIiAiK2cuY29sb3I6IiJ9O3RoaXMuaHIucmVtb3ZlQXR0cigiY2xhc3MiKS5yZW1vdmVBdHRyKCJzdHlsZSIpLnJlbW92ZUF0dHIoIndpZHRoIikucmVtb3ZlQXR0cigiaGVpZ2h0IikucmVtb3ZlQXR0cigiYWxpZ24iKS5hdHRyKGgpLmNzcyhqKTtpZih0aGlzLnNyY1siY2xhc3MiXS52YWwoKSl7dGhpcy5oci5hdHRyKCJjbGFzcyIsdGhpcy5zcmNbImNsYXNzIl0udmFsKCkpfXRoaXMucnRlLnVpLnVwZGF0ZSgpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuaW1hZ2U9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgYj10aGlzO3RoaXMuaW1nPW51bGw7dGhpcy5pbml0PWZ1bmN0aW9uKCl7dGhpcy5sYWJlbHM9e21haW46IlByb3BlcmllcyIsbGluazoiTGluayIsYWR2OiJBZHZhbmNlZCIsZXZlbnRzOiJFdmVudHMiLGlkOiJJRCIsImNsYXNzIjoiQ3NzIGNsYXNzIixzdHlsZToiQ3NzIHN0eWxlIixsb25nZGVzYzoiRGV0YWlsIGRlc2NyaXB0aW9uIFVSTCIsaHJlZjoiVVJMIix0YXJnZXQ6Ik9wZW4gaW4iLHRpdGxlOiJUaXRsZSJ9O3RoaXMuc3JjPXttYWluOntzcmM6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCJ3aWR0aCIsIjEwMCUiKSx0aXRsZTphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiMTAwJSIpLGFsdDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiMTAwJSIpLHdpZHRoOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoInNpemUiLDUpLmNzcygidGV4dC1hbGlnbiIsInJpZ2h0IiksaGVpZ2h0OmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoInNpemUiLDUpLmNzcygidGV4dC1hbGlnbiIsInJpZ2h0IiksbWFyZ2luOmEoIjxkaXYgLz4iKSxhbGlnbjphKCI8c2VsZWN0IC8+IikuY3NzKCJ3aWR0aCIsIjEwMCUiKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJOb3Qgc2V0IiwiZGlhbG9ncyIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoImxlZnQiKS50ZXh0KHRoaXMucnRlLmkxOG4oIkxlZnQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJyaWdodCIpLnRleHQodGhpcy5ydGUuaTE4bigiUmlnaHQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0b3AiKS50ZXh0KHRoaXMucnRlLmkxOG4oIlRvcCIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoInRleHQtdG9wIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJUZXh0IHRvcCIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIm1pZGRsZSIpLnRleHQodGhpcy5ydGUuaTE4bigibWlkZGxlIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiYmFzZWxpbmUiKS50ZXh0KHRoaXMucnRlLmkxOG4oIkJhc2VsaW5lIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiYm90dG9tIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJCb3R0b20iKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0ZXh0LWJvdHRvbSIpLnRleHQodGhpcy5ydGUuaTE4bigiVGV4dCBib3R0b20iKSkpLGJvcmRlcjphKCI8ZGl2IC8+Iil9LGFkdjp7aWQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCJ3aWR0aCIsIjEwMCUiKSwiY2xhc3MiOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmNzcygid2lkdGgiLCIxMDAlIiksc3R5bGU6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCJ3aWR0aCIsIjEwMCUiKSxsb25nZGVzYzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiMTAwJSIpfSxldmVudHM6e319O2EuZWFjaChbIm9uYmx1ciIsIm9uZm9jdXMiLCJvbmNsaWNrIiwib25kYmxjbGljayIsIm9ubW91c2Vkb3duIiwib25tb3VzZXVwIiwib25tb3VzZW92ZXIiLCJvbm1vdXNlb3V0Iiwib25tb3VzZWxlYXZlIiwib25rZXlkb3duIiwib25rZXlwcmVzcyIsIm9ua2V5dXAiXSxmdW5jdGlvbigpe2Iuc3JjLmV2ZW50c1t0aGlzXT1hKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiMTAwJSIpfSk7YS5lYWNoKGIuc3JjLGZ1bmN0aW9uKCl7Zm9yKHZhciBnIGluIHRoaXMpe3RoaXNbZ10uYXR0cigibmFtZSIsZyl9fSl9O3RoaXMuY29tbWFuZD1mdW5jdGlvbigpeyF0aGlzLnNyYyYmdGhpcy5pbml0KCk7dGhpcy5ydGUuc2VsZWN0aW9uLnNhdmVJRVJhbmdlKCk7dGhpcy5zcmMubWFpbi5ib3JkZXIuZWxCb3JkZXJTZWxlY3Qoe2NoYW5nZTpmdW5jdGlvbigpe2IudXBkYXRlSW1nKCl9LG5hbWU6ImJvcmRlciJ9KTt0aGlzLnNyYy5tYWluLm1hcmdpbi5lbFBhZGRpbmdJbnB1dCh7dHlwZToibWFyZ2luIn0pO3RoaXMuY2xlYW5WYWx1ZXMoKTt0aGlzLnNyYy5tYWluLnNyYy52YWwoIiIpO3ZhciBvPXRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSx1PWEobyk7dGhpcy5wcmV2aWV3PW51bGw7dGhpcy5wcmV2SW1nPW51bGw7dGhpcy5saW5rPW51bGw7aWYoby5ub2RlTmFtZT09IklNRyImJiF1Lmhhc0NsYXNzKCJlbHJ0ZS1wcm90ZWN0ZWQiKSl7dGhpcy5pbWc9YShvKX1lbHNle3RoaXMuaW1nPWEodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoImltZyIpKX12YXIgaD17cnRsOnRoaXMucnRlLnJ0bCxzdWJtaXQ6ZnVuY3Rpb24odyx4KXt3LnN0b3BQcm9wYWdhdGlvbigpO3cucHJldmVudERlZmF1bHQoKTtiLnNldCgpO3guY2xvc2UoKX0sZGlhbG9nOnt3aWR0aDo1NzAscG9zaXRpb246InRvcCIsdGl0bGU6dGhpcy5ydGUuaTE4bigiSW1hZ2UiKX19O3ZhciB0PW5ldyBlbERpYWxvZ0Zvcm0oaCk7aWYodGhpcy5ydGUub3B0aW9ucy5mbUFsbG93JiZ0aGlzLnJ0ZS5vcHRpb25zLmZtT3Blbil7dmFyIGc9YSgiPHNwYW4gLz4iKS5hcHBlbmQodGhpcy5zcmMubWFpbi5zcmMuY3NzKCJ3aWR0aCIsIjg4JSIpKS5hcHBlbmQoYSgiPHNwYW4gLz4iKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuY3NzKHsiZmxvYXQiOiJyaWdodCIsIm1hcmdpbi1yaWdodCI6IjNweCJ9KS5hdHRyKCJ0aXRsZSIsYi5ydGUuaTE4bigiT3BlbiBmaWxlIG1hbmdlciIpKS5hcHBlbmQoYSgiPHNwYW4gLz4iKS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWZvbGRlci1vcGVuIikpLmNsaWNrKGZ1bmN0aW9uKCl7Yi5ydGUub3B0aW9ucy5mbU9wZW4oZnVuY3Rpb24odyl7Yi5zcmMubWFpbi5zcmMudmFsKHcpLmNoYW5nZSgpfSl9KS5ob3ZlcihmdW5jdGlvbigpe2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pKX1lbHNle3ZhciBnPXRoaXMuc3JjLm1haW4uc3JjfXQudGFiKCJtYWluIix0aGlzLnJ0ZS5pMThuKCJQcm9wZXJpZXMiKSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJJbWFnZSBVUkwiKSxnXSwibWFpbiIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJUaXRsZSIpLHRoaXMuc3JjLm1haW4udGl0bGVdLCJtYWluIix0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkFsdCB0ZXh0IiksdGhpcy5zcmMubWFpbi5hbHRdLCJtYWluIix0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIlNpemUiKSxhKCI8c3BhbiAvPiIpLmFwcGVuZCh0aGlzLnNyYy5tYWluLndpZHRoKS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmhlaWdodCkuYXBwZW5kKCIgcHgiKV0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQWxpZ25tZW50IiksdGhpcy5zcmMubWFpbi5hbGlnbl0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiTWFyZ2lucyIpLHRoaXMuc3JjLm1haW4ubWFyZ2luXSwibWFpbiIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJCb3JkZXIiKSx0aGlzLnNyYy5tYWluLmJvcmRlcl0sIm1haW4iLHRydWUpO2Zvcih2YXIgcCBpbiB0aGlzLnNyYyl7aWYocCE9Im1haW4iKXt0LnRhYihwLHRoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbcF0pKTtmb3IodmFyIGogaW4gdGhpcy5zcmNbcF0pe3ZhciBxPXRoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbal0/dGhpcy5sYWJlbHNbal06aik7aWYocD09ImV2ZW50cyIpe3RoaXMuc3JjW3BdW2pdLnZhbCh0aGlzLnJ0ZS51dGlscy50cmltRXZlbnRDYWxsYmFjayh0aGlzLmltZy5hdHRyKGopKSl9ZWxzZXtpZihwPT0ibGluayIpe2lmKHRoaXMubGluayl7dGhpcy5zcmNbcF1bal0udmFsKGo9PSJocmVmIj90aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCh0aGlzLmxpbmsuYXR0cihqKSk6dGhpcy5saW5rLmF0dHIoaikpfX1lbHNle3RoaXMuc3JjW3BdW2pdLnZhbCh0aGlzLmltZy5hdHRyKGopfHwiIil9fXQuYXBwZW5kKFtxLHRoaXMuc3JjW3BdW2pdXSxwLHRydWUpfX19dC5vcGVuKCk7dmFyIHI9YSgiPGZpZWxkc2V0IC8+IikuYXBwZW5kKGEoIjxsZWdlbmQgLz4iKS50ZXh0KHRoaXMucnRlLmkxOG4oIlByZXZpZXciKSkpO3QuYXBwZW5kKHIsIm1haW4iKTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTthKGspLmF0dHIoInNyYyIsIiMiKS5hZGRDbGFzcygiZWwtcnRlLXByZXZpZXciKS5hcHBlbmRUbyhyKTtodG1sPXRoaXMucnRlLm9wdGlvbnMuZG9jdHlwZSsnPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPjwvaGVhZD48Ym9keSBzdHlsZT0icGFkZGluZzowO21hcmdpbjowO2ZvbnQtc2l6ZTo5cHgiPiA8L2JvZHk+PC9odG1sPic7ay5jb250ZW50V2luZG93LmRvY3VtZW50Lm9wZW4oKTtrLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoaHRtbCk7ay5jb250ZW50V2luZG93LmRvY3VtZW50LmNsb3NlKCk7dGhpcy5mcmFtZT1rLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7dGhpcy5wcmV2aWV3PWEoay5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkpLnRleHQoIlByb2luIGVsaXQgYXJjdSwgcnV0cnVtIGNvbW1vZG8sIHZlaGljdWxhIHRlbXB1cywgY29tbW9kbyBhLCByaXN1cy4gQ3VyYWJpdHVyIG5lYyBhcmN1LiBEb25lYyBzb2xsaWNpdHVkaW4gbWkgc2l0IGFtZXQgbWF1cmlzLiBOYW0gZWxlbWVudHVtIHF1YW0gdWxsYW1jb3JwZXIgYW50ZS4gRXRpYW0gYWxpcXVldCBtYXNzYSBldCBsb3JlbS4gTWF1cmlzIGRhcGlidXMgbGFjdXMgYXVjdG9yIHJpc3VzLiBBZW5lYW4gdGVtcG9yIHVsbGFtY29ycGVyIGxlby4gVml2YW11cyBzZWQgbWFnbmEgcXVpcyBsaWd1bGEgZWxlaWZlbmQgYWRpcGlzY2luZy4gRHVpcyBvcmNpLiBBbGlxdWFtIHNvZGFsZXMgdG9ydG9yIHZpdGFlIGlwc3VtLiBBbGlxdWFtIG51bGxhLiBEdWlzIGFsaXF1YW0gbW9sZXN0aWUgZXJhdC4gVXQgZXQgbWF1cmlzIHZlbCBwZWRlIHZhcml1cyBzb2xsaWNpdHVkaW4iKTtpZih0aGlzLmltZy5hdHRyKCJzcmMiKSl7dGhpcy5wcmV2SW1nPWEodGhpcy5mcmFtZS5jcmVhdGVFbGVtZW50KCJpbWciKSkuYXR0cigic3JjIix0aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCh0aGlzLmltZy5hdHRyKCJzcmMiKSkpO3RoaXMucHJldkltZy5hdHRyKCJ3aWR0aCIsdGhpcy5pbWcuYXR0cigid2lkdGgiKSkuYXR0cigiaGVpZ2h0Iix0aGlzLmltZy5hdHRyKCJoZWlnaHQiKSkuYXR0cigidGl0bGUiLHRoaXMuaW1nLmF0dHIoInRpdGxlIil8fCIiKS5hdHRyKCJhbHQiLHRoaXMuaW1nLmF0dHIoImFsdCIpfHwiIikuYXR0cigic3R5bGUiLHRoaXMuaW1nLmF0dHIoInN0eWxlIil8fCIiKTtmb3IodmFyIG8gaW4gdGhpcy5zcmMuYWR2KXt2YXIgdj10aGlzLmltZy5hdHRyKG8pO2lmKHYpe3RoaXMucHJldkltZy5hdHRyKG8sdil9fXRoaXMucHJldmlldy5wcmVwZW5kKHRoaXMucHJldkltZyk7dGhpcy51cGRhdGVWYWx1ZXMoKX1hLmVhY2godGhpcy5zcmMsZnVuY3Rpb24oKXthLmVhY2godGhpcyxmdW5jdGlvbigpe2lmKHRoaXM9PT1iLnNyYy5tYWluLnNyYyl7dGhpcy5iaW5kKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7Yi51cGRhdGVQcmV2aWV3KCl9KX1lbHNle2lmKHRoaXM9PWIuc3JjLm1haW4ud2lkdGh8fHRoaXM9PWIuc3JjLm1haW4uaGVpZ2h0KXt0aGlzLmJpbmQoImNoYW5nZSIsZnVuY3Rpb24odyl7Yi51cGRhdGVEaW1lc2lvbnModyl9KX1lbHNle3RoaXMuYmluZCgiY2hhbmdlIixmdW5jdGlvbigpe2IudXBkYXRlSW1nKCl9KX19fSl9KX07dGhpcy51cGRhdGVWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgZz10aGlzLnByZXZJbWcuZ2V0KDApO3RoaXMub3JpZ1c9dGhpcy5wcmV2SW1nLmF0dHIoIndpZHRoIik7dGhpcy5vcmlnSD10aGlzLnByZXZJbWcuYXR0cigiaGVpZ2h0Iik7dGhpcy5zcmMubWFpbi5zcmMudmFsKHRoaXMucnRlLmRvbS5hdHRyKGcsInNyYyIpKTt0aGlzLnNyYy5tYWluLnRpdGxlLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihnLCJ0aXRsZSIpKTt0aGlzLnNyYy5tYWluLmFsdC52YWwodGhpcy5ydGUuZG9tLmF0dHIoZywiYWx0IikpO3RoaXMuc3JjLm1haW4ud2lkdGgudmFsKHRoaXMub3JpZ1cpO3RoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCh0aGlzLm9yaWdIKTt0aGlzLnNyYy5hZHZbImNsYXNzIl0udmFsKHRoaXMucnRlLmRvbS5hdHRyKGcsImNsYXNzIikpO3RoaXMuc3JjLm1haW4ubWFyZ2luLnZhbCh0aGlzLnByZXZJbWcpO3ZhciBoPXRoaXMucHJldkltZy5jc3MoImZsb2F0Iik7dGhpcy5zcmMubWFpbi5hbGlnbi52YWwoaD09ImxlZnQifHxoPT0icmlnaHQiP2g6KHRoaXMucHJldkltZy5jc3MoInZlcnRpY2FsLWFsaWduIil8fCIiKSk7dGhpcy5zcmMubWFpbi5ib3JkZXIudmFsKHRoaXMucHJldkltZyk7dGhpcy5zcmMuYWR2LnN0eWxlLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihnLCJzdHlsZSIpKX07dGhpcy5jbGVhblZhbHVlcz1mdW5jdGlvbigpe2EuZWFjaCh0aGlzLnNyYyxmdW5jdGlvbigpe2EuZWFjaCh0aGlzLGZ1bmN0aW9uKCl7dmFyIGc9YSh0aGlzKTtpZihnLmF0dHIoIm5hbWUiKSE9InNyYyIpe2cudmFsKCIiKX19KX0pfTt0aGlzLnVwZGF0ZUltZz1mdW5jdGlvbigpe3RoaXMucHJldkltZy5hdHRyKHtzdHlsZTphLnRyaW0odGhpcy5zcmMuYWR2LnN0eWxlLnZhbCgpKSx0aXRsZTphLnRyaW0odGhpcy5zcmMubWFpbi50aXRsZS52YWwoKSksYWx0OmEudHJpbSh0aGlzLnNyYy5tYWluLmFsdC52YWwoKSksd2lkdGg6cGFyc2VJbnQodGhpcy5zcmMubWFpbi53aWR0aC52YWwoKSksaGVpZ2h0OnBhcnNlSW50KHRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCgpKX0pO3ZhciBqPXRoaXMuc3JjLm1haW4uYWxpZ24udmFsKCk7dmFyIGs9aj09ImxlZnQifHxqPT0icmlnaHQiP2o6IiI7dmFyIGg9dGhpcy5zcmMubWFpbi5ib3JkZXIudmFsKCk7dmFyIGc9dGhpcy5zcmMubWFpbi5tYXJnaW4udmFsKCk7dGhpcy5wcmV2SW1nLmNzcygiZmxvYXQiLGspO3RoaXMucHJldkltZy5jc3MoInZlcnRpY2FsLWFsaWduIixrPyIiOmopO3RoaXMucHJldkltZy5jc3MoImJvcmRlciIsYS50cmltKGgud2lkdGgrIiAiK2guc3R5bGUrIiAiK2guY29sb3IpKTtpZihnLmNzcyl7dGhpcy5wcmV2SW1nLmNzcygibWFyZ2luIixnLmNzcyl9ZWxzZXt0aGlzLnByZXZJbWcuY3NzKCJtYXJnaW4tdG9wIixnLnRvcCk7dGhpcy5wcmV2SW1nLmNzcygibWFyZ2luLXJpZ2h0IixnLnJpZ2h0KTt0aGlzLnByZXZJbWcuY3NzKCJtYXJnaW4tYm90dG9tIixnLmJvdHRvbSk7dGhpcy5wcmV2SW1nLmNzcygibWFyZ2luLWxlZnQiLGcubGVmdCl9YS5lYWNoKFt0aGlzLnNyYy5ldmVudHMsdGhpcy5zcmMuYWR2XSxmdW5jdGlvbigpe2EuZWFjaCh0aGlzLGZ1bmN0aW9uKCl7dmFyIHA9YSh0aGlzKTt2YXIgcT1wLmF0dHIoIm5hbWUiKTtpZihxIT0ic3R5bGUiKXt2YXIgbz1hLnRyaW0ocC52YWwoKSk7aWYobyl7Yi5wcmV2SW1nLmF0dHIocSxvKX1lbHNle2IucHJldkltZy5yZW1vdmVBdHRyKHEpfX19KX0pfTt0aGlzLnVwZGF0ZVByZXZpZXc9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLnByZXZJbWc/dGhpcy5wcmV2SW1nLmF0dHIoInNyYyIpOiIiO3ZhciBnPWEudHJpbSh0aGlzLnNyYy5tYWluLnNyYy52YWwoKSk7aWYoIWd8fGchPWgpe2lmKHRoaXMucHJldkltZyl7dGhpcy5wcmV2SW1nLnJlbW92ZSgpO3RoaXMucHJldkltZz1udWxsfXRoaXMuY2xlYW5WYWx1ZXMoKTtpZihnKXt0aGlzLnByZXZJbWc9YSh0aGlzLmZyYW1lLmNyZWF0ZUVsZW1lbnQoImltZyIpKS5hdHRyKCJzcmMiLHRoaXMucnRlLnV0aWxzLmFic29sdXRlVVJMKGcpKS5iaW5kKCJsb2FkIixmdW5jdGlvbigpe2IudXBkYXRlVmFsdWVzKCl9KTt0aGlzLnByZXZpZXcucHJlcGVuZCh0aGlzLnByZXZJbWcpO2IudXBkYXRlVmFsdWVzKCl9fWVsc2V7dGhpcy51cGRhdGVJbWcoKX19O3RoaXMudXBkYXRlRGltZXNpb25zPWZ1bmN0aW9uKGspe3ZhciBnPXBhcnNlSW50KHRoaXMuc3JjLm1haW4ud2lkdGgudmFsKCkpfHwwO3ZhciBqPXBhcnNlSW50KHRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCgpKXx8MDtpZihnPjAmJmo+MCl7aWYoay5jdXJyZW50VGFyZ2V0PT10aGlzLnNyYy5tYWluLndpZHRoLmdldCgwKSl7dGhpcy5zcmMubWFpbi5oZWlnaHQudmFsKHBhcnNlSW50KGcqdGhpcy5vcmlnSC90aGlzLm9yaWdXKSl9ZWxzZXt0aGlzLnNyYy5tYWluLndpZHRoLnZhbChwYXJzZUludChqKnRoaXMub3JpZ1cvdGhpcy5vcmlnSCkpfX1lbHNle3RoaXMuc3JjLm1haW4ud2lkdGgudmFsKHRoaXMub3JpZ1cpO3RoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCh0aGlzLm9yaWdIKX10aGlzLnVwZGF0ZUltZygpfTt0aGlzLnNldD1mdW5jdGlvbigpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7dGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7aWYoIXRoaXMucHJldkltZ3x8IXRoaXMucHJldkltZy5hdHRyKCJ3aWR0aCIpKXt0aGlzLmltZyYmdGhpcy5pbWcucmVtb3ZlKCk7dGhpcy5saW5rJiZ0aGlzLnJ0ZS5kb2MuZXhlY0NvbW1hbmQoInVubGluayIsZmFsc2UsbnVsbCl9ZWxzZXtpZighdGhpcy5pbWdbMF0ucGFyZW50Tm9kZSl7dGhpcy5pbWc9YSh0aGlzLnJ0ZS5kb2MuY3JlYXRlRWxlbWVudCgiaW1nIikpfXRoaXMuaW1nLmF0dHIoe3NyYzp0aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTChhLnRyaW0odGhpcy5zcmMubWFpbi5zcmMudmFsKCkpKSxzdHlsZTphLnRyaW0odGhpcy5ydGUuZG9tLmF0dHIodGhpcy5wcmV2SW1nLmdldCgwKSwic3R5bGUiKSksdGl0bGU6YS50cmltKHRoaXMuc3JjLm1haW4udGl0bGUudmFsKCkpLGFsdDphLnRyaW0odGhpcy5zcmMubWFpbi5hbHQudmFsKCkpLHdpZHRoOnBhcnNlSW50KHRoaXMuc3JjLm1haW4ud2lkdGgudmFsKCkpLGhlaWdodDpwYXJzZUludCh0aGlzLnNyYy5tYWluLmhlaWdodC52YWwoKSl9KTtmb3IodmFyIGcgaW4gdGhpcy5zcmMuYWR2KXtpZihnIT0ic3R5bGUiKXt2YXIgaD10aGlzLnNyYy5hZHZbZ10udmFsKCk7aWYoaCl7dGhpcy5pbWcuYXR0cihnLGgpfWVsc2V7dGhpcy5pbWcucmVtb3ZlQXR0cihnKX19fWZvcih2YXIgZyBpbiB0aGlzLnNyYy5ldmVudHMpe3ZhciBoPXRoaXMuc3JjLmV2ZW50c1tnXS52YWwoKTtpZihoKXt0aGlzLmltZy5hdHRyKGcsaCl9ZWxzZXt0aGlzLmltZy5yZW1vdmVBdHRyKGcpfX1pZighdGhpcy5pbWdbMF0ucGFyZW50Tm9kZSl7dGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydE5vZGUodGhpcy5pbWcuZ2V0KDApKX19dGhpcy5ydGUudWkudXBkYXRlKCl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSxnPWEoaCk7aWYoaC5ub2RlTmFtZT09IklNRyImJiFnLmhhc0NsYXNzKCJlbHJ0ZS1wcm90ZWN0ZWQiKSl7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJhY3RpdmUiKX1lbHNle3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiYWN0aXZlIil9fX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuaW5kZW50PWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGI9dGhpczt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7Y29sbGFwc2VkOnRydWUsYmxvY2tzOnRydWUsd3JhcDoiaW5saW5lIix0YWc6InAifSk7ZnVuY3Rpb24gZyhxKXt2YXIgbz0vKElNR3xIUnxUQUJMRXxFTUJFRHxPQkpFQ1QpLy50ZXN0KHEubm9kZU5hbWUpPyJtYXJnaW4tbGVmdCI6InBhZGRpbmctbGVmdCI7dmFyIHA9Yi5ydGUuZG9tLmF0dHIocSwic3R5bGUiKS5pbmRleE9mKG8pIT0tMT9wYXJzZUludChhKHEpLmNzcyhvKSl8fDA6MDthKHEpLmNzcyhvLHArNDArInB4Iil9Zm9yKHZhciBqPTA7ajxoLmxlbmd0aDtqKyspe2lmKC9eKFRBQkxFfFRIRUFEfFRGT09UfFRCT0RZfENPTHxDT0xHUk9VUHxUUikkLy50ZXN0KGhbal0ubm9kZU5hbWUpKXthKGhbal0pLmZpbmQoInRkLHRoIikuZWFjaChmdW5jdGlvbigpe2codGhpcyl9KX1lbHNle2lmKC9eTEkkLy50ZXN0KGhbal0ubm9kZU5hbWUpKXt2YXIgaz1hKGhbal0pO2EodGhpcy5ydGUuZG9tLmNyZWF0ZShoW2pdLnBhcmVudE5vZGUubm9kZU5hbWUpKS5hcHBlbmQoYSh0aGlzLnJ0ZS5kb20uY3JlYXRlKCJsaSIpKS5odG1sKGsuaHRtbCgpfHwiIikpLmFwcGVuZFRvKGsuaHRtbCgiJm5ic3A7IikpfWVsc2V7ZyhoW2pdKX19fXRoaXMucnRlLnVpLnVwZGF0ZSgpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlsZWZ0PWZ1bmN0aW9uKGMsYil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMsYik7dGhpcy5hbGlnbj10aGlzLm5hbWU9PSJqdXN0aWZ5ZnVsbCI/Imp1c3RpZnkiOnRoaXMubmFtZS5yZXBsYWNlKCJqdXN0aWZ5IiwiIik7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdGVkKHtjb2xsYXBzZWQ6dHJ1ZSxibG9ja3M6dHJ1ZSx0YWc6ImRpdiJ9KSxmPWcubGVuZ3RoO2YmJnRoaXMucnRlLmhpc3RvcnkuYWRkKCk7d2hpbGUoZi0tKXt0aGlzLnJ0ZS5kb20uZmlsdGVyKGdbZl0sInRleHROb2RlcyIpJiZhKGdbZl0pLmNzcygidGV4dC1hbGlnbiIsdGhpcy5hbGlnbil9dGhpcy5ydGUudWkudXBkYXRlKCl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSxnPWYubm9kZU5hbWU9PSJCT0RZIj9mOnRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQoZiwidGV4dE5vZGVzIil8fChmLnBhcmVudE5vZGUmJmYucGFyZW50Tm9kZS5ub2RlTmFtZT09IkJPRFkiP2YucGFyZW50Tm9kZTpudWxsKTtpZihnKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikudG9nZ2xlQ2xhc3MoImFjdGl2ZSIsYShnKS5jc3MoInRleHQtYWxpZ24iKT09dGhpcy5hbGlnbil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9fX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnljZW50ZXI9ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlsZWZ0O2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5qdXN0aWZ5cmlnaHQ9ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlsZWZ0O2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5qdXN0aWZ5ZnVsbD1lbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuanVzdGlmeWxlZnR9KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMubGluaz1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5pbWc9ZmFsc2U7ZnVuY3Rpb24gZygpe2IubGFiZWxzPXtpZDoiSUQiLCJjbGFzcyI6IkNzcyBjbGFzcyIsc3R5bGU6IkNzcyBzdHlsZSIsZGlyOiJTY3JpcHQgZGlyZWN0aW9uIixsYW5nOiJMYW5ndWFnZSIsY2hhcnNldDoiQ2hhcnNldCIsdHlwZToiVGFyZ2V0IE1JTUUgdHlwZSIscmVsOiJSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCkiLHJldjoiUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpIix0YWJpbmRleDoiVGFiIGluZGV4IixhY2Nlc3NrZXk6IkFjY2VzcyBrZXkifTtiLnNyYz17bWFpbjp7aHJlZjphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSx0aXRsZTphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSxhbmNob3I6YSgiPHNlbGVjdCAvPiIpLmF0dHIoIm5hbWUiLCJhbmNob3IiKSx0YXJnZXQ6YSgiPHNlbGVjdCAvPiIpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudGV4dChiLnJ0ZS5pMThuKCJJbiB0aGlzIHdpbmRvdyIpKS52YWwoIiIpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnRleHQoYi5ydGUuaTE4bigiSW4gbmV3IHdpbmRvdyAoX2JsYW5rKSIpKS52YWwoIl9ibGFuayIpKX0scG9wdXA6e3VzZTphKCc8aW5wdXQgdHlwZT0iY2hlY2tib3ggLz4iJyksdXJsOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLnZhbCgiaHR0cDovLyIpLG5hbWU6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+Jyksd2lkdGg6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cih7c2l6ZTo2LHRpdGxlOmIucnRlLmkxOG4oIldpZHRoIil9KS5jc3MoInRleHQtYWxpZ24iLCJyaWdodCIpLGhlaWdodDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKHtzaXplOjYsdGl0bGU6Yi5ydGUuaTE4bigiSGVpZ2h0Iil9KS5jc3MoInRleHQtYWxpZ24iLCJyaWdodCIpLGxlZnQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cih7c2l6ZTo2LHRpdGxlOmIucnRlLmkxOG4oIkxlZnQiKX0pLmNzcygidGV4dC1hbGlnbiIsInJpZ2h0IiksdG9wOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoe3NpemU6Nix0aXRsZTpiLnJ0ZS5pMThuKCJUb3AiKX0pLmNzcygidGV4dC1hbGlnbiIsInJpZ2h0IiksbG9jYXRpb246YSgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLG1lbnViYXI6YSgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLHRvb2xiYXI6YSgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLHNjcm9sbGJhcnM6YSgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLHN0YXR1czphKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giIC8+JykscmVzaXphYmxlOmEoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz4nKSxkZXBlbmRlbnQ6YSgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLHJldGZhbHNlOmEoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz4nKS5hdHRyKCJjaGVja2VkIix0cnVlKX0sYWR2OntpZDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwiY2xhc3MiOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLHN0eWxlOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLGRpcjphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIk5vdCBzZXQiKSkudmFsKCIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIkxlZnQgdG8gcmlnaHQiKSkudmFsKCJsdHIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIlJpZ2h0IHRvIGxlZnQiKSkudmFsKCJydGwiKSksbGFuZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSxjaGFyc2V0OmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLHR5cGU6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykscmVsOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLHJldjphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSx0YWJpbmRleDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSxhY2Nlc3NrZXk6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+Jyl9LGV2ZW50czp7fX07YS5lYWNoKFsib25ibHVyIiwib25mb2N1cyIsIm9uY2xpY2siLCJvbmRibGNsaWNrIiwib25tb3VzZWRvd24iLCJvbm1vdXNldXAiLCJvbm1vdXNlb3ZlciIsIm9ubW91c2VvdXQiLCJvbm1vdXNlbGVhdmUiLCJvbmtleWRvd24iLCJvbmtleXByZXNzIiwib25rZXl1cCJdLGZ1bmN0aW9uKCl7Yi5zcmMuZXZlbnRzW3RoaXNdPWEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpfSk7YS5lYWNoKGIuc3JjLGZ1bmN0aW9uKCl7Zm9yKHZhciBqIGluIHRoaXMpe3RoaXNbal0uYXR0cigibmFtZSIsaik7dmFyIGg9dGhpc1tqXS5hdHRyKCJ0eXBlIik7aWYoIWh8fChoPT0idGV4dCImJiF0aGlzW2pdLmF0dHIoInNpemUiKSkpe3RoaXNbal0uY3NzKCJ3aWR0aCIsIjEwMCUiKX19fSl9dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIHA9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSxvLHUseCxoLHQsaix3LGssejshdGhpcy5zcmMmJmcoKTt0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTtmdW5jdGlvbiBxKHIpe3JldHVybiByLm5vZGVOYW1lPT0iQSImJnIuaHJlZn10aGlzLmxpbms9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudExpbmsocCk7aWYoIXRoaXMubGluayl7bz1hLmJyb3dzZXIubXNpZT90aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoKTp0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe3dyYXA6ZmFsc2V9KTtpZihvLmxlbmd0aCl7Zm9yKHU9MDt1PG8ubGVuZ3RoO3UrKyl7aWYocShvW3VdKSl7dGhpcy5saW5rPW9bdV07YnJlYWt9fWlmKCF0aGlzLmxpbmspe3RoaXMubGluaz10aGlzLnJ0ZS5kb20ucGFyZW50KG9bMF0scSl8fHRoaXMucnRlLmRvbS5wYXJlbnQob1tvLmxlbmd0aC0xXSxxKX19fXRoaXMubGluaz10aGlzLmxpbms/YSh0aGlzLmxpbmspOmEodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoImEiKSk7dGhpcy5pbWc9cC5ub2RlTmFtZT09IklNRyI/cDpudWxsO3RoaXMudXBkYXRlUG9wdXAoKTt0aGlzLnNyYy5tYWluLmFuY2hvci5lbXB0eSgpO2EoJ2FbaHJlZiE9IiJdW25hbWVdJyx0aGlzLnJ0ZS5kb2MpLmVhY2goZnVuY3Rpb24oKXt2YXIgcj1hKHRoaXMpLmF0dHIoIm5hbWUiKTtiLnNyYy5tYWluLmFuY2hvci5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbChyKS50ZXh0KHIpKX0pO2lmKHRoaXMuc3JjLm1haW4uYW5jaG9yLmNoaWxkcmVuKCkubGVuZ3RoKXt0aGlzLnNyYy5tYWluLmFuY2hvci5wcmVwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiIpLnRleHQodGhpcy5ydGUuaTE4bigiU2VsZWN0IGJvb2ttYXJrIikpKS5jaGFuZ2UoZnVuY3Rpb24oKXt2YXIgcj1hKHRoaXMpLnZhbCgpO2lmKHIpe2Iuc3JjLm1haW4uaHJlZi52YWwoIiMiK3IpfX0pfWg9e3J0bDp0aGlzLnJ0ZS5ydGwsc3VibWl0OmZ1bmN0aW9uKHIsdil7ci5zdG9wUHJvcGFnYXRpb24oKTtyLnByZXZlbnREZWZhdWx0KCk7Yi5zZXQoKTt2LmNsb3NlKCl9LHRhYnM6e3Nob3c6ZnVuY3Rpb24odixyKXtpZihyLmluZGV4PT0zKXtiLnVwZGF0ZU9uY2xpY2soKX19fSxjbG9zZTpmdW5jdGlvbigpe2IucnRlLmJyb3dzZXIubXNpZSYmYi5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCl9LGRpYWxvZzp7d2lkdGg6ImF1dG8iLHdpZHRoOjQzMCx0aXRsZTp0aGlzLnJ0ZS5pMThuKCJMaW5rIil9fTtkPW5ldyBlbERpYWxvZ0Zvcm0oaCk7dD1hKCI8ZGl2IC8+IikuYXBwZW5kKGEoIjxsYWJlbCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbikuYXBwZW5kKHRoaXMucnRlLmkxOG4oIkxvY2F0aW9uIGJhciIpKSkuYXBwZW5kKGEoIjxsYWJlbCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5tZW51YmFyKS5hcHBlbmQodGhpcy5ydGUuaTE4bigiTWVudSBiYXIiKSkpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAudG9vbGJhcikuYXBwZW5kKHRoaXMucnRlLmkxOG4oIlRvb2xiYXIiKSkpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAuc2Nyb2xsYmFycykuYXBwZW5kKHRoaXMucnRlLmkxOG4oIlNjcm9sbGJhcnMiKSkpO2o9YSgiPGRpdiAvPiIpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAuc3RhdHVzKS5hcHBlbmQodGhpcy5ydGUuaTE4bigiU3RhdHVzIGJhciIpKSkuYXBwZW5kKGEoIjxsYWJlbCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5yZXNpemFibGUpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCJSZXNpemFibGUiKSkpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAuZGVwZW5kZW50KS5hcHBlbmQodGhpcy5ydGUuaTE4bigiRGVwZWRlbnQiKSkpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAucmV0ZmFsc2UpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCJBZGQgcmV0dXJuIGZhbHNlIikpKTtkLnRhYigibWFpbiIsdGhpcy5ydGUuaTE4bigiUHJvcGVyaWVzIikpLnRhYigicG9wdXAiLHRoaXMucnRlLmkxOG4oIlBvcHVwIikpLnRhYigiYWR2Iix0aGlzLnJ0ZS5pMThuKCJBZHZhbmNlZCIpKS50YWIoImV2ZW50cyIsdGhpcy5ydGUuaTE4bigiRXZlbnRzIikpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAudXNlKS5hcHBlbmQodGhpcy5ydGUuaTE4bigiT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdyIpKSwicG9wdXAiKS5zZXBhcmF0b3IoInBvcHVwIikuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJVUkwiKSx0aGlzLnNyYy5wb3B1cC51cmxdLCJwb3B1cCIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJXaW5kb3cgbmFtZSIpLHRoaXMuc3JjLnBvcHVwLm5hbWVdLCJwb3B1cCIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJXaW5kb3cgc2l6ZSIpLGEoIjxzcGFuIC8+IikuYXBwZW5kKHRoaXMuc3JjLnBvcHVwLndpZHRoKS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5oZWlnaHQpLmFwcGVuZCgiIHB4IildLCJwb3B1cCIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJXaW5kb3cgcG9zaXRpb24iKSxhKCI8c3BhbiAvPiIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5sZWZ0KS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC50b3ApLmFwcGVuZCgiIHB4IildLCJwb3B1cCIsdHJ1ZSkuc2VwYXJhdG9yKCJwb3B1cCIpLmFwcGVuZChbdCxqXSwicG9wdXAiLHRydWUpO3c9dGhpcy5saW5rLmdldCgwKTtrPXRoaXMucnRlLmRvbS5hdHRyKHcsImhyZWYiKTt0aGlzLnNyYy5tYWluLmhyZWYudmFsKGspLmNoYW5nZShmdW5jdGlvbigpe2EodGhpcykudmFsKGIucnRlLnV0aWxzLmFic29sdXRlVVJMKGEodGhpcykudmFsKCkpKX0pO2lmKHRoaXMucnRlLm9wdGlvbnMuZm1BbGxvdyYmdGhpcy5ydGUub3B0aW9ucy5mbU9wZW4pe3ZhciB6PWEoIjxzcGFuIC8+IikuYXBwZW5kKHRoaXMuc3JjLm1haW4uaHJlZi5jc3MoIndpZHRoIiwiODclIikpLmFwcGVuZChhKCI8c3BhbiAvPiIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5jc3MoeyJmbG9hdCI6InJpZ2h0IiwibWFyZ2luLXJpZ2h0IjoiM3B4In0pLmF0dHIoInRpdGxlIixiLnJ0ZS5pMThuKCJPcGVuIGZpbGUgbWFuZ2VyIikpLmFwcGVuZChhKCI8c3BhbiAvPiIpLmFkZENsYXNzKCJ1aS1pY29uIHVpLWljb24tZm9sZGVyLW9wZW4iKSkuY2xpY2soZnVuY3Rpb24oKXtiLnJ0ZS5vcHRpb25zLmZtT3BlbihmdW5jdGlvbihyKXtiLnNyYy5tYWluLmhyZWYudmFsKHIpLmNoYW5nZSgpfSl9KS5ob3ZlcihmdW5jdGlvbigpe2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pKTtkLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiTGluayBVUkwiKSx6XSwibWFpbiIsdHJ1ZSl9ZWxzZXtkLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiTGluayBVUkwiKSx0aGlzLnNyYy5tYWluLmhyZWZdLCJtYWluIix0cnVlKX10aGlzLnNyYy5tYWluLmhyZWYuY2hhbmdlKCk7ZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIlRpdGxlIiksdGhpcy5zcmMubWFpbi50aXRsZS52YWwodGhpcy5ydGUuZG9tLmF0dHIodywidGl0bGUiKSldLCJtYWluIix0cnVlKTtpZih0aGlzLnNyYy5tYWluLmFuY2hvci5jaGlsZHJlbigpLmxlbmd0aCl7ZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkJvb2ttYXJrIiksdGhpcy5zcmMubWFpbi5hbmNob3IudmFsKGspXSwibWFpbiIsdHJ1ZSl9aWYoIXRoaXMucnRlLm9wdGlvbnMuZG9jdHlwZS5tYXRjaCgveGh0bWwvKSl7ZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIlRhcmdldCIpLHRoaXMuc3JjLm1haW4udGFyZ2V0LnZhbCh0aGlzLmxpbmsuYXR0cigidGFyZ2V0Iil8fCIiKV0sIm1haW4iLHRydWUpfWZvcih2YXIgcCBpbiB0aGlzLnNyYy5hZHYpe3RoaXMuc3JjLmFkdltwXS52YWwodGhpcy5ydGUuZG9tLmF0dHIodyxwKSk7ZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbcF0/dGhpcy5sYWJlbHNbcF06cCksdGhpcy5zcmMuYWR2W3BdXSwiYWR2Iix0cnVlKX1mb3IodmFyIHAgaW4gdGhpcy5zcmMuZXZlbnRzKXt2YXIgeD10aGlzLnJ0ZS51dGlscy50cmltRXZlbnRDYWxsYmFjayh0aGlzLnJ0ZS5kb20uYXR0cih3LHApKTt0aGlzLnNyYy5ldmVudHNbcF0udmFsKHgpO2QuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW3BdP3RoaXMubGFiZWxzW3BdOnApLHRoaXMuc3JjLmV2ZW50c1twXV0sImV2ZW50cyIsdHJ1ZSl9dGhpcy5zcmMucG9wdXAudXNlLmNoYW5nZShmdW5jdGlvbigpe3ZhciByPWEodGhpcykuYXR0cigiY2hlY2tlZCIpO2EuZWFjaChiLnNyYy5wb3B1cCxmdW5jdGlvbigpe2lmKGEodGhpcykuYXR0cigibmFtZSIpIT0idXNlIil7aWYocil7YSh0aGlzKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpfWVsc2V7YSh0aGlzKS5hdHRyKCJkaXNhYmxlZCIsdHJ1ZSl9fX0pfSk7dGhpcy5zcmMucG9wdXAudXNlLmNoYW5nZSgpO2Qub3BlbigpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7aWYodGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudExpbmsoaCkpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXtpZih0aGlzLnJ0ZS5kb20uc2VsZWN0aW9uSGFzKGZ1bmN0aW9uKGope3JldHVybiBqLm5vZGVOYW1lPT0iQSImJmouaHJlZn0pKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikuYWRkQ2xhc3MoImFjdGl2ZSIpfWVsc2V7aWYoIXRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKXx8aC5ub2RlTmFtZT09IklNRyIpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQgYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX19fTt0aGlzLnVwZGF0ZVBvcHVwPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5ydGUuZG9tLmF0dHIodGhpcy5saW5rLmdldCgwKSwib25jbGljayIpO2g9aD9hLnRyaW0oaC50b1N0cmluZygpKToiIjtpZihoLmxlbmd0aD4wJiYobT1oLm1hdGNoKC93aW5kb3cub3BlblwoIihbXiJdKykiLFxzKiIoW14iXSopIixccyoiKFteIl0qKSJccyouKlwpO1xzKihyZXR1cm5ccytmYWxzZSk/LykpKXt0aGlzLnNyYy5wb3B1cC51c2UuYXR0cigiY2hlY2tlZCIsIm9uIik7dGhpcy5zcmMucG9wdXAudXJsLnZhbChtWzFdKTt0aGlzLnNyYy5wb3B1cC5uYW1lLnZhbChtWzJdKTtpZigvbG9jYXRpb249eWVzLy50ZXN0KG1bM10pKXt0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbi5hdHRyKCJjaGVja2VkIix0cnVlKX1pZigvbWVudWJhcj15ZXMvLnRlc3QobVszXSkpe3RoaXMuc3JjLnBvcHVwLm1lbnViYXIuYXR0cigiY2hlY2tlZCIsdHJ1ZSl9aWYoL3Rvb2xiYXI9eWVzLy50ZXN0KG1bM10pKXt0aGlzLnNyYy5wb3B1cC50b29sYmFyLmF0dHIoImNoZWNrZWQiLHRydWUpfWlmKC9zY3JvbGxiYXJzPXllcy8udGVzdChtWzNdKSl7dGhpcy5zcmMucG9wdXAuc2Nyb2xsYmFycy5hdHRyKCJjaGVja2VkIix0cnVlKX1pZigvc3RhdHVzPXllcy8udGVzdChtWzNdKSl7dGhpcy5zcmMucG9wdXAuc3RhdHVzLmF0dHIoImNoZWNrZWQiLHRydWUpfWlmKC9yZXNpemFibGU9eWVzLy50ZXN0KG1bM10pKXt0aGlzLnNyYy5wb3B1cC5yZXNpemFibGUuYXR0cigiY2hlY2tlZCIsdHJ1ZSl9aWYoL2RlcGVuZGVudD15ZXMvLnRlc3QobVszXSkpe3RoaXMuc3JjLnBvcHVwLmRlcGVuZGVudC5hdHRyKCJjaGVja2VkIix0cnVlKX1pZigoX209bVszXS5tYXRjaCgvd2lkdGg9KFteLF0rKS8pKSl7dGhpcy5zcmMucG9wdXAud2lkdGgudmFsKF9tWzFdKX1pZigoX209bVszXS5tYXRjaCgvaGVpZ2h0PShbXixdKykvKSkpe3RoaXMuc3JjLnBvcHVwLmhlaWdodC52YWwoX21bMV0pfWlmKChfbT1tWzNdLm1hdGNoKC9sZWZ0PShbXixdKykvKSkpe3RoaXMuc3JjLnBvcHVwLmxlZnQudmFsKF9tWzFdKX1pZigoX209bVszXS5tYXRjaCgvdG9wPShbXixdKykvKSkpe3RoaXMuc3JjLnBvcHVwLnRvcC52YWwoX21bMV0pfWlmKG1bNF0pe3RoaXMuc3JjLnBvcHVwLnJldGZhbHNlLmF0dHIoImNoZWNrZWQiLHRydWUpfX1lbHNle2EuZWFjaCh0aGlzLnNyYy5wb3B1cCxmdW5jdGlvbigpe3ZhciBqPWEodGhpcyk7aWYoai5hdHRyKCJ0eXBlIik9PSJ0ZXh0Iil7ai52YWwoai5hdHRyKCJuYW1lIik9PSJ1cmwiPyJodHRwOi8vIjoiIil9ZWxzZXtpZihqLmF0dHIoIm5hbWUiKT09InJldGZhbHNlIil7dGhpcy5hdHRyKCJjaGVja2VkIix0cnVlKX1lbHNle2oucmVtb3ZlQXR0cigiY2hlY2tlZCIpfX19KX19O3RoaXMudXBkYXRlT25jbGljaz1mdW5jdGlvbigpe3ZhciBvPXRoaXMuc3JjLnBvcHVwLnVybC52YWwoKTtpZih0aGlzLnNyYy5wb3B1cC51c2UuYXR0cigiY2hlY2tlZCIpJiZvKXt2YXIgcD0iIjtpZih0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbi5hdHRyKCJjaGVja2VkIikpe3ArPSJsb2NhdGlvbj15ZXMsIn1pZih0aGlzLnNyYy5wb3B1cC5tZW51YmFyLmF0dHIoImNoZWNrZWQiKSl7cCs9Im1lbnViYXI9eWVzLCJ9aWYodGhpcy5zcmMucG9wdXAudG9vbGJhci5hdHRyKCJjaGVja2VkIikpe3ArPSJ0b29sYmFyPXllcywifWlmKHRoaXMuc3JjLnBvcHVwLnNjcm9sbGJhcnMuYXR0cigiY2hlY2tlZCIpKXtwKz0ic2Nyb2xsYmFycz15ZXMsIn1pZih0aGlzLnNyYy5wb3B1cC5zdGF0dXMuYXR0cigiY2hlY2tlZCIpKXtwKz0ic3RhdHVzPXllcywifWlmKHRoaXMuc3JjLnBvcHVwLnJlc2l6YWJsZS5hdHRyKCJjaGVja2VkIikpe3ArPSJyZXNpemFibGU9eWVzLCJ9aWYodGhpcy5zcmMucG9wdXAuZGVwZW5kZW50LmF0dHIoImNoZWNrZWQiKSl7cCs9ImRlcGVuZGVudD15ZXMsIn1pZih0aGlzLnNyYy5wb3B1cC53aWR0aC52YWwoKSl7cCs9IndpZHRoPSIrdGhpcy5zcmMucG9wdXAud2lkdGgudmFsKCkrIiwifWlmKHRoaXMuc3JjLnBvcHVwLmhlaWdodC52YWwoKSl7cCs9ImhlaWdodD0iK3RoaXMuc3JjLnBvcHVwLmhlaWdodC52YWwoKSsiLCJ9aWYodGhpcy5zcmMucG9wdXAubGVmdC52YWwoKSl7cCs9ImxlZnQ9Iit0aGlzLnNyYy5wb3B1cC5sZWZ0LnZhbCgpKyIsIn1pZih0aGlzLnNyYy5wb3B1cC50b3AudmFsKCkpe3ArPSJ0b3A9Iit0aGlzLnNyYy5wb3B1cC50b3AudmFsKCkrIiwifWlmKHAubGVuZ3RoPjApe3A9cC5zdWJzdHJpbmcoMCxwLmxlbmd0aC0xKX12YXIgaj10aGlzLnNyYy5wb3B1cC5yZXRmYWxzZS5hdHRyKCJjaGVja2VkIik/InJldHVybiBmYWxzZTsiOiIiO3ZhciBrPSd3aW5kb3cub3BlbigiJytvKyciLCAiJythLnRyaW0odGhpcy5zcmMucG9wdXAubmFtZS52YWwoKSkrJyIsICInK3ArJyIpOycrajt0aGlzLnNyYy5ldmVudHMub25jbGljay52YWwoayk7aWYoIXRoaXMuc3JjLm1haW4uaHJlZi52YWwoKSl7dGhpcy5zcmMubWFpbi5ocmVmLnZhbCgiIyIpfX1lbHNle3ZhciBoPXRoaXMuc3JjLmV2ZW50cy5vbmNsaWNrLnZhbCgpO2g9aC5yZXBsYWNlKC93aW5kb3dcLm9wZW5cKFteXCldK1wpXHMqOz9ccypyZXR1cm5ccypmYWxzZVxzKjs/L2ksIiIpO3RoaXMuc3JjLmV2ZW50cy5vbmNsaWNrLnZhbChoKX19O3RoaXMuc2V0PWZ1bmN0aW9uKCl7dmFyIGosazt0aGlzLnVwZGF0ZU9uY2xpY2soKTt0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO2o9dGhpcy5ydGUudXRpbHMuYWJzb2x1dGVVUkwodGhpcy5zcmMubWFpbi5ocmVmLnZhbCgpKTtpZighail7dmFyIHA9dGhpcy5ydGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCk7dGhpcy5ydGUuZG9tLnVud3JhcCh0aGlzLmxpbmtbMF0pO3RoaXMucnRlLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhwKX1lbHNle2lmKCF0aGlzLmxpbmtbMF0ucGFyZW50Tm9kZSl7aWYodGhpcy5pbWcmJnRoaXMuaW1nLnBhcmVudE5vZGUpe3RoaXMubGluaz1hKHRoaXMucnRlLmRvbS5jcmVhdGUoImEiKSkuYXR0cigiaHJlZiIsaik7dGhpcy5ydGUuZG9tLndyYXAodGhpcy5pbWcsdGhpcy5saW5rWzBdKX1lbHNle2s9IiMtLWVsLWVkaXRvci0tLSIrTWF0aC5yYW5kb20oKTt0aGlzLnJ0ZS5kb2MuZXhlY0NvbW1hbmQoImNyZWF0ZUxpbmsiLGZhbHNlLGspO3RoaXMubGluaz1hKCdhW2hyZWY9IicraysnIl0nLHRoaXMucnRlLmRvYyk7dGhpcy5saW5rLmVhY2goZnVuY3Rpb24oKXt2YXIgcj1hKHRoaXMpO2lmKCFhLnRyaW0oci5odG1sKCkpJiYhYS50cmltKHIudGV4dCgpKSl7ci5yZXBsYWNlV2l0aChyLnRleHQoKSl9fSl9fXRoaXMuc3JjLm1haW4uaHJlZi52YWwoaik7Zm9yKHZhciBvIGluIHRoaXMuc3JjKXtpZihvIT0icG9wdXAiKXtmb3IodmFyIHEgaW4gdGhpcy5zcmNbb10pe2lmKHEhPSJhbmNob3JzIil7dmFyIGg9YS50cmltKHRoaXMuc3JjW29dW3FdLnZhbCgpKTtpZihoKXt0aGlzLmxpbmsuYXR0cihxLGgpfWVsc2V7dGhpcy5saW5rLnJlbW92ZUF0dHIocSl9fX19fXRoaXMuaW1nJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0KHRoaXMuaW1nKX10aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5uYnNwPWZ1bmN0aW9uKGMsYil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMsYik7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0SHRtbCgiJm5ic3A7Iix0cnVlKTt0aGlzLnJ0ZS53aW5kb3cuZm9jdXMoKTt0aGlzLnJ0ZS51aS51cGRhdGUoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5vdXRkZW50PWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGI9dGhpczt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgZz10aGlzLmZpbmQoKTtpZihnLm5vZGUpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7YShnLm5vZGUpLmNzcyhnLnR5cGUsKGcudmFsPjQwP2cudmFsLTQwOjApKyJweCIpO3RoaXMucnRlLnVpLnVwZGF0ZSgpfX07dGhpcy5maW5kPWZ1bmN0aW9uKGope2Z1bmN0aW9uIGcocCl7dmFyIGs9e3R5cGU6IiIsdmFsOjB9O3ZhciBvO2lmKChvPWIucnRlLmRvbS5hdHRyKHAsInN0eWxlIikpKXtrLnR5cGU9by5pbmRleE9mKCJwYWRkaW5nLWxlZnQiKSE9LTE/InBhZGRpbmctbGVmdCI6KG8uaW5kZXhPZigibWFyZ2luLWxlZnQiKSE9LTE/Im1hcmdpbi1sZWZ0IjoiIik7ay52YWw9ay50eXBlP3BhcnNlSW50KGEocCkuY3NzKGsudHlwZSkpfHwwOjB9cmV0dXJuIGt9dmFyIGo9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTt2YXIgaD1nKGopO2lmKGgudmFsKXtoLm5vZGU9an1lbHNle2EuZWFjaCh0aGlzLnJ0ZS5kb20ucGFyZW50cyhqLCIqIiksZnVuY3Rpb24oKXtoPWcodGhpcyk7aWYoaC52YWwpe2gubm9kZT10aGlzO3JldHVybiBofX0pfXJldHVybiBofTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBnPXRoaXMuZmluZCgpO2lmKGcubm9kZSl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfWVsc2V7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJkaXNhYmxlZCIpfX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnBhZ2VicmVhaz1mdW5jdGlvbihjLGIpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjLGIpO2EodGhpcy5ydGUuZG9jLmJvZHkpLmJpbmQoIm1vdXNlZG93biIsZnVuY3Rpb24oZil7aWYoYShmLnRhcmdldCkuaGFzQ2xhc3MoImVscnRlLXBhZ2VicmVhayIpKXtmLnByZXZlbnREZWZhdWx0KCl9fSk7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydEh0bWwoJzxpbWcgc3JjPSInK3RoaXMucnRlLmZpbHRlci51cmwrJ3BpeGVsLmdpZiIgY2xhc3M9ImVscnRlLXByb3RlY3RlZCBlbHJ0ZS1wYWdlYnJlYWsiLz4nLGZhbHNlKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5wYXN0ZWZvcm1hdHRleHQ9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt0aGlzLmlmcmFtZT1hKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpKS5hZGRDbGFzcygiZWwtcnRlLXBhc3RlLWlucHV0Iik7dGhpcy5kb2M9bnVsbDt2YXIgYj10aGlzO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3RoaXMucnRlLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpO3ZhciBnPXRoaXMsaD17c3VibWl0OmZ1bmN0aW9uKG8scCl7by5zdG9wUHJvcGFnYXRpb24oKTtvLnByZXZlbnREZWZhdWx0KCk7Zy5wYXN0ZSgpO3AuY2xvc2UoKX0sZGlhbG9nOnt3aWR0aDo1MDAsdGl0bGU6dGhpcy5ydGUuaTE4bigiUGFzdGUgZm9ybWF0dGVkIHRleHQiKX19LGs9bmV3IGVsRGlhbG9nRm9ybShoKTtrLmFwcGVuZCh0aGlzLmlmcmFtZSkub3BlbigpO3RoaXMuZG9jPXRoaXMuaWZyYW1lLmdldCgwKS5jb250ZW50V2luZG93LmRvY3VtZW50O2h0bWw9dGhpcy5ydGUub3B0aW9ucy5kb2N0eXBlKyc8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+JztodG1sKz0iPC9oZWFkPjxib2R5PiA8YnIgLz4gPC9ib2R5PjwvaHRtbD4iO3RoaXMuZG9jLm9wZW4oKTt0aGlzLmRvYy53cml0ZShodG1sKTt0aGlzLmRvYy5jbG9zZSgpO2lmKCF0aGlzLnJ0ZS5icm93c2VyLm1zaWUpe3RyeXt0aGlzLmRvYy5kZXNpZ25Nb2RlPSJvbiJ9Y2F0Y2goail7fX1lbHNle3RoaXMuZG9jLmJvZHkuY29udGVudEVkaXRhYmxlPXRydWV9c2V0VGltZW91dChmdW5jdGlvbigpe2cuaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cuZm9jdXMoKX0sNTApfTt0aGlzLnBhc3RlPWZ1bmN0aW9uKCl7YSh0aGlzLmRvYy5ib2R5KS5maW5kKCJbY2xhc3NdIikucmVtb3ZlQXR0cigiY2xhc3MiKTt2YXIgZz1hLnRyaW0oYSh0aGlzLmRvYy5ib2R5KS5odG1sKCkpO2lmKGcpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7dGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7dGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydEh0bWwodGhpcy5ydGUuZmlsdGVyLnd5c2l3eWcyd3lzaXd5Zyh0aGlzLnJ0ZS5maWx0ZXIucHJvY2Nlc3MoInBhc3RlIixnKSkpO3RoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKX19O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMucGFzdGV0ZXh0PWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dGhpcy5pbnB1dD1hKCI8dGV4dGFyZWEgLz4iKS5hZGRDbGFzcygiZWwtcnRlLXBhc3RlLWlucHV0Iik7dmFyIGI9dGhpczt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt0aGlzLnJ0ZS5icm93c2VyLm1zaWUmJnRoaXMucnRlLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpO3ZhciBnPXtzdWJtaXQ6ZnVuY3Rpb24oaixrKXtqLnN0b3BQcm9wYWdhdGlvbigpO2oucHJldmVudERlZmF1bHQoKTtiLnBhc3RlKCk7ay5jbG9zZSgpfSxkaWFsb2c6e3dpZHRoOjUwMCx0aXRsZTp0aGlzLnJ0ZS5pMThuKCJQYXN0ZSBvbmx5IHRleHQiKX19O3ZhciBoPW5ldyBlbERpYWxvZ0Zvcm0oZyk7aC5hcHBlbmQodGhpcy5pbnB1dCkub3BlbigpfTt0aGlzLnBhc3RlPWZ1bmN0aW9uKCl7dmFyIGc9YS50cmltKHRoaXMuaW5wdXQudmFsKCkpO2lmKGcpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7dGhpcy5ydGUuYnJvd3Nlci5tc2llJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTt0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0VGV4dChnLnJlcGxhY2UoL1xyP1xuL2csIjxiciAvPiIpLHRydWUpO3RoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKX10aGlzLmlucHV0LnZhbCgiIil9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuc2F2ZT1mdW5jdGlvbihjLGIpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjLGIpO3RoaXMuYWN0aXZlPXRydWU7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dGhpcy5ydGUuc2F2ZSgpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe319fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnNtaWxleT1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5pbWc9bnVsbDt0aGlzLnVybD10aGlzLnJ0ZS5maWx0ZXIudXJsKyJzbWlsZXlzLyI7dGhpcy5zbWlsZXlzPXtzbWlsZToic21pbGUucG5nIixoYXBweToiaGFwcHkucG5nIix0b25ndWU6InRvbmd1ZS5wbmciLHN1cnByaXNlZDoic3VycHJpc2VkLnBuZyIsd2FpaToid2FpaS5wbmciLHdpbms6IndpbmsucG5nIixldmlsZ3JpbjoiZXZpbGdyaW4ucG5nIixncmluOiJncmluLnBuZyIsdW5oYXBweToidW5oYXBweS5wbmcifTt0aGlzLndpZHRoPTEyMDt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLGo9dGhpcy51cmwsbyxrLGc7dGhpcy5ydGUuYnJvd3Nlci5tc2llJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTtrPXtkaWFsb2c6e2hlaWdodDoxMjAsd2lkdGg6dGhpcy53aWR0aCx0aXRsZTp0aGlzLnJ0ZS5pMThuKCJTbWlsZXkiKSxidXR0b25zOnt9fX07bz1uZXcgZWxEaWFsb2dGb3JtKGspO2EuZWFjaCh0aGlzLnNtaWxleXMsZnVuY3Rpb24ocSxwKXtvLmFwcGVuZChhKCc8aW1nIHNyYz0iJytqK3ArJyIgdGl0bGU9IicrcSsnIiBpZD0iJytxKyciIGNsYXNzPSJlbC1ydGUtc21pbGV5Ii8+JykuY2xpY2soZnVuY3Rpb24oKXtoLnNldCh0aGlzLmlkLG8pfSkpfSk7by5vcGVuKCl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiYWN0aXZlIil9O3RoaXMuc2V0PWZ1bmN0aW9uKGcsaCl7dGhpcy5ydGUuYnJvd3Nlci5tc2llJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTtpZih0aGlzLnNtaWxleXNbZ10pe3RoaXMuaW1nPWEodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoImltZyIpKTt0aGlzLmltZy5hdHRyKHtzcmM6dGhpcy51cmwrdGhpcy5zbWlsZXlzW2ddLHRpdGxlOmcsYWx0Omd9KTt0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0Tm9kZSh0aGlzLmltZy5nZXQoMCkpO3RoaXMucnRlLnVpLnVwZGF0ZSgpfWguY2xvc2UoKX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnN0b3BmbG9hdD1mdW5jdGlvbihjLGIpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjLGIpO3RoaXMuZmluZD1mdW5jdGlvbigpe2lmKHRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSl7dmFyIGY9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCksL15ESVYkLyk7aWYoZiYmKHRoaXMucnRlLmRvbS5hdHRyKGYsImNsZWFyIil8fGEoZikuY3NzKCJjbGVhciIpIT0ibm9uZSIpKXtyZXR1cm4gZn19fTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgZjtpZigoZj10aGlzLmZpbmQoKSkpe3ZhciBmPWEoZik7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTtpZighZi5jaGlsZHJlbigpLmxlbmd0aCYmIWEudHJpbShmLnRleHQoKSkubGVuZ3RoKXtmLnJlbW92ZSgpfWVsc2V7Zi5yZW1vdmVBdHRyKCJjbGVhciIpLmNzcygiY2xlYXIiLCIiKX19ZWxzZXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO3RoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnROb2RlKGEodGhpcy5ydGUuZG9tLmNyZWF0ZSgiZGl2IikpLmNzcygiY2xlYXIiLCJib3RoIikuZ2V0KDApLHRydWUpfXRoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7aWYodGhpcy5maW5kKCkpe3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRhYmxlPWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGI9dGhpczt0aGlzLnNyYz1udWxsO3RoaXMubGFiZWxzPW51bGw7ZnVuY3Rpb24gZygpe2IubGFiZWxzPXttYWluOiJQcm9wZXJpZXMiLGFkdjoiQWR2YW5jZWQiLGV2ZW50czoiRXZlbnRzIixpZDoiSUQiLCJjbGFzcyI6IkNzcyBjbGFzcyIsc3R5bGU6IkNzcyBzdHlsZSIsZGlyOiJTY3JpcHQgZGlyZWN0aW9uIixzdW1tYXJ5OiJTdW1tYXJ5IixsYW5nOiJMYW5ndWFnZSIsaHJlZjoiVVJMIn07Yi5zcmM9e21haW46e2NhcHRpb246YSgnPGlucHV0IHR5cGU9InRleHQiIC8+Jykscm93czphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJzaXplIiw1KS52YWwoMiksY29sczphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJzaXplIiw1KS52YWwoMiksd2lkdGg6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cigic2l6ZSIsNSksd3VuaXQ6YSgiPHNlbGVjdCAvPiIpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCIlIikudGV4dCgiJSIpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgicHgiKS50ZXh0KCJweCIpKSxoZWlnaHQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cigic2l6ZSIsNSksaHVuaXQ6YSgiPHNlbGVjdCAvPiIpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCIlIikudGV4dCgiJSIpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgicHgiKS50ZXh0KCJweCIpKSxhbGlnbjphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiIpLnRleHQoYi5ydGUuaTE4bigiTm90IHNldCIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoImxlZnQiKS50ZXh0KGIucnRlLmkxOG4oIkxlZnQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJjZW50ZXIiKS50ZXh0KGIucnRlLmkxOG4oIkNlbnRlciIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoInJpZ2h0IikudGV4dChiLnJ0ZS5pMThuKCJSaWdodCIpKSksc3BhY2luZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJzaXplIiw1KSxwYWRkaW5nOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoInNpemUiLDUpLGJvcmRlcjphKCI8ZGl2IC8+IikscnVsZXM6YSgiPHNlbGVjdCAvPiIpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJub25lIikudGV4dChiLnJ0ZS5pMThuKCJObyIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoImFsbCIpLnRleHQoYi5ydGUuaTE4bigiQ2VsbHMiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJncm91cHMiKS50ZXh0KGIucnRlLmkxOG4oIkdyb3VwcyIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoInJvd3MiKS50ZXh0KGIucnRlLmkxOG4oIlJvd3MiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJjb2xzIikudGV4dChiLnJ0ZS5pMThuKCJDb2x1bW5zIikpKSxtYXJnaW46YSgiPGRpdiAvPiIpLGJnOmEoIjxkaXYgLz4iKSxiZ2ltZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiOTAlIil9LGFkdjp7aWQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+Jyksc3VtbWFyeTphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwiY2xhc3MiOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLHN0eWxlOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLGRpcjphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIk5vdCBzZXQiKSkudmFsKCIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIkxlZnQgdG8gcmlnaHQiKSkudmFsKCJsdHIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIlJpZ2h0IHRvIGxlZnQiKSkudmFsKCJydGwiKSksbGFuZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKX0sZXZlbnRzOnt9fTthLmVhY2goYi5zcmMsZnVuY3Rpb24oKXtmb3IodmFyIGogaW4gdGhpcyl7dGhpc1tqXS5hdHRyKCJuYW1lIixqKTt2YXIgaD10aGlzW2pdLmdldCgwKS5ub2RlTmFtZTtpZihoPT0iSU5QVVQiJiZqIT0iYmdpbWciKXt0aGlzW2pdLmNzcyh0aGlzW2pdLmF0dHIoInNpemUiKT97InRleHQtYWxpZ24iOiJyaWdodCJ9Ont3aWR0aDoiMTAwJSJ9KX1lbHNle2lmKGg9PSJTRUxFQ1QiJiZqIT0id3VuaXQiJiZqIT0iaHVuaXQiKXt0aGlzW2pdLmNzcygid2lkdGgiLCIxMDAlIil9fX19KTthLmVhY2goWyJvbmJsdXIiLCJvbmZvY3VzIiwib25jbGljayIsIm9uZGJsY2xpY2siLCJvbm1vdXNlZG93biIsIm9ubW91c2V1cCIsIm9ubW91c2VvdmVyIiwib25tb3VzZW91dCIsIm9ubW91c2VsZWF2ZSIsIm9ua2V5ZG93biIsIm9ua2V5cHJlc3MiLCJvbmtleXVwIl0sZnVuY3Rpb24oKXtiLnNyYy5ldmVudHNbdGhpc109YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cigibmFtZSIsdGhpcykuY3NzKCJ3aWR0aCIsIjEwMCUiKX0pO2Iuc3JjLm1haW4uYWxpZ24uY2hhbmdlKGZ1bmN0aW9uKCl7dmFyIGo9YSh0aGlzKS52YWwoKTtpZihqPT0iY2VudGVyIil7Yi5zcmMubWFpbi5tYXJnaW4udmFsKHtsZWZ0OiJhdXRvIixyaWdodDoiYXV0byJ9KX1lbHNle3ZhciBoPWIuc3JjLm1haW4ubWFyZ2luLnZhbCgpO2lmKGgubGVmdD09ImF1dG8iJiZoLnJpZ2h0PT0iYXV0byIpe2Iuc3JjLm1haW4ubWFyZ2luLnZhbCh7bGVmdDoiIixyaWdodDoiIn0pfX19KTtiLnNyYy5tYWluLmJnaW1nLmNoYW5nZShmdW5jdGlvbigpe3ZhciBoPWEodGhpcyk7aC52YWwoYi5ydGUudXRpbHMuYWJzb2x1dGVVUkwoaC52YWwoKSkpfSl9dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eVEFCTEUkLyk7aWYodGhpcy5uYW1lPT0idGFibGUiKXt0aGlzLnRhYmxlPWEodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoInRhYmxlIikpfWVsc2V7dGhpcy50YWJsZT1yP2Eocik6YSh0aGlzLnJ0ZS5kb2MuY3JlYXRlRWxlbWVudCgidGFibGUiKSl9IXRoaXMuc3JjJiZnKCk7dGhpcy5zcmMubWFpbi5ib3JkZXIuZWxCb3JkZXJTZWxlY3Qoe3N0eWxlSGVpZ2h0OjExN30pO3RoaXMuc3JjLm1haW4uYmcuZWxDb2xvclBpY2tlcih7cGFsZXR0ZVBvc2l0aW9uOiJvdXRlciIsImNsYXNzIjoiZWwtY29sb3JwaWNrZXIgdWktaWNvbiB1aS1pY29uLXBlbmNpbCJ9KTt0aGlzLnNyYy5tYWluLm1hcmdpbi5lbFBhZGRpbmdJbnB1dCh7dHlwZToibWFyZ2luIix2YWx1ZTp0aGlzLnRhYmxlfSk7aWYodGhpcy50YWJsZS5wYXJlbnRzKCkubGVuZ3RoKXt0aGlzLnNyYy5tYWluLnJvd3MudmFsKCIiKS5hdHRyKCJkaXNhYmxlZCIsdHJ1ZSk7dGhpcy5zcmMubWFpbi5jb2xzLnZhbCgiIikuYXR0cigiZGlzYWJsZWQiLHRydWUpfWVsc2V7dGhpcy5zcmMubWFpbi5yb3dzLnZhbCgyKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpO3RoaXMuc3JjLm1haW4uY29scy52YWwoMikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKX12YXIgRD10aGlzLnRhYmxlLmNzcygid2lkdGgiKXx8dGhpcy50YWJsZS5hdHRyKCJ3aWR0aCIpO3RoaXMuc3JjLm1haW4ud2lkdGgudmFsKHBhcnNlSW50KEQpfHwiIik7dGhpcy5zcmMubWFpbi53dW5pdC52YWwoRC5pbmRleE9mKCJweCIpIT0tMT8icHgiOiIlIik7dmFyIHo9dGhpcy50YWJsZS5jc3MoImhlaWdodCIpfHx0aGlzLnRhYmxlLmF0dHIoImhlaWdodCIpO3RoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbChwYXJzZUludCh6KXx8IiIpO3RoaXMuc3JjLm1haW4uaHVuaXQudmFsKHomJnouaW5kZXhPZigicHgiKSE9LTE/InB4IjoiJSIpO3ZhciBCPXRoaXMudGFibGUuY3NzKCJmbG9hdCIpO3RoaXMuc3JjLm1haW4uYWxpZ24udmFsKCIiKTtpZihCPT0ibGVmdCJ8fEI9PSJyaWdodCIpe3RoaXMuc3JjLm1haW4uYWxpZ24udmFsKEIpfWVsc2V7dmFyIHQ9dGhpcy50YWJsZS5jc3MoIm1hcmdpbi1sZWZ0Iik7dmFyIHA9dGhpcy50YWJsZS5jc3MoIm1hcmdpbi1yaWdodCIpO2lmKHQ9PSJhdXRvIiYmcD09ImF1dG8iKXt0aGlzLnNyYy5tYWluLmFsaWduLnZhbCgiY2VudGVyIil9fXRoaXMuc3JjLm1haW4uYm9yZGVyLnZhbCh0aGlzLnRhYmxlKTt0aGlzLnNyYy5tYWluLnJ1bGVzLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cih0aGlzLnRhYmxlLmdldCgwKSwicnVsZXMiKSk7dGhpcy5zcmMubWFpbi5iZy52YWwodGhpcy50YWJsZS5jc3MoImJhY2tncm91bmQtY29sb3IiKSk7dmFyIGo9KHRoaXMudGFibGUuY3NzKCJiYWNrZ3JvdW5kLWltYWdlIil8fCIiKS5yZXBsYWNlKC91cmxcKChbXlwpXSspXCkvaSwiJDEiKTt0aGlzLnNyYy5tYWluLmJnaW1nLnZhbChqIT0ibm9uZSI/ajoiIik7dmFyIGs9e3J0bDp0aGlzLnJ0ZS5ydGwsc3VibWl0OmZ1bmN0aW9uKGgsdil7aC5zdG9wUHJvcGFnYXRpb24oKTtoLnByZXZlbnREZWZhdWx0KCk7Yi5zZXQoKTt2LmNsb3NlKCl9LGRpYWxvZzp7d2lkdGg6NTMwLHRpdGxlOnRoaXMucnRlLmkxOG4oIlRhYmxlIil9fTt2YXIgQz1uZXcgZWxEaWFsb2dGb3JtKGspO2Zvcih2YXIgcSBpbiB0aGlzLnNyYyl7Qy50YWIocSx0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW3FdKSk7aWYocT09Im1haW4iKXt2YXIgQT1hKCI8dGFibGUgLz4iKS5hcHBlbmQoYSgiPHRyIC8+IikuYXBwZW5kKCI8dGQ+Iit0aGlzLnJ0ZS5pMThuKCJSb3dzIikrIjwvdGQ+IikuYXBwZW5kKGEoIjx0ZCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnJvd3MpKSkuYXBwZW5kKGEoIjx0ciAvPiIpLmFwcGVuZCgiPHRkPiIrdGhpcy5ydGUuaTE4bigiQ29sdW1ucyIpKyI8L3RkPiIpLmFwcGVuZChhKCI8dGQgLz4iKS5hcHBlbmQodGhpcy5zcmMubWFpbi5jb2xzKSkpO3ZhciB4PWEoIjx0YWJsZSAvPiIpLmFwcGVuZChhKCI8dHIgLz4iKS5hcHBlbmQoIjx0ZD4iK3RoaXMucnRlLmkxOG4oIldpZHRoIikrIjwvdGQ+IikuYXBwZW5kKGEoIjx0ZCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5tYWluLndpZHRoKS5hcHBlbmQodGhpcy5zcmMubWFpbi53dW5pdCkpKS5hcHBlbmQoYSgiPHRyIC8+IikuYXBwZW5kKCI8dGQ+Iit0aGlzLnJ0ZS5pMThuKCJIZWlnaHQiKSsiPC90ZD4iKS5hcHBlbmQoYSgiPHRkIC8+IikuYXBwZW5kKHRoaXMuc3JjLm1haW4uaGVpZ2h0KS5hcHBlbmQodGhpcy5zcmMubWFpbi5odW5pdCkpKTt2YXIgdT1hKCI8dGFibGUgLz4iKS5hcHBlbmQoYSgiPHRyIC8+IikuYXBwZW5kKCI8dGQ+Iit0aGlzLnJ0ZS5pMThuKCJTcGFjaW5nIikrIjwvdGQ+IikuYXBwZW5kKGEoIjx0ZCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnNwYWNpbmcudmFsKHRoaXMudGFibGUuYXR0cigiY2VsbHNwYWNpbmciKXx8IiIpKSkpLmFwcGVuZChhKCI8dHIgLz4iKS5hcHBlbmQoIjx0ZD4iK3RoaXMucnRlLmkxOG4oIlBhZGRpbmciKSsiPC90ZD4iKS5hcHBlbmQoYSgiPHRkIC8+IikuYXBwZW5kKHRoaXMuc3JjLm1haW4ucGFkZGluZy52YWwodGhpcy50YWJsZS5hdHRyKCJjZWxscGFkZGluZyIpfHwiIikpKSk7Qy5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkNhcHRpb24iKSx0aGlzLnNyYy5tYWluLmNhcHRpb24udmFsKHRoaXMudGFibGUuZmluZCgiY2FwdGlvbiIpLmVxKDApLnRleHQoKXx8IiIpXSwibWFpbiIsdHJ1ZSkuc2VwYXJhdG9yKCJtYWluIikuYXBwZW5kKFtBLHgsdV0sIm1haW4iLHRydWUpLnNlcGFyYXRvcigibWFpbiIpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQm9yZGVyIiksdGhpcy5zcmMubWFpbi5ib3JkZXJdLCJtYWluIix0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIklubmVyIGJvcmRlcnMiKSx0aGlzLnNyYy5tYWluLnJ1bGVzXSwibWFpbiIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJBbGlnbm1lbnQiKSx0aGlzLnNyYy5tYWluLmFsaWduXSwibWFpbiIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJNYXJnaW5zIiksdGhpcy5zcmMubWFpbi5tYXJnaW5dLCJtYWluIix0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkJhY2tncm91bmQiKSxhKCI8c3BhbiAvPiIpLmFwcGVuZChhKCI8c3BhbiAvPiIpLmNzcyh7ImZsb2F0IjoibGVmdCIsIm1hcmdpbi1yaWdodCI6IjNweCJ9KS5hcHBlbmQodGhpcy5zcmMubWFpbi5iZykpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmJnaW1nKV0sIm1haW4iLHRydWUpfWVsc2V7Zm9yKHZhciBvIGluIHRoaXMuc3JjW3FdKXt2YXIgRT10aGlzLnJ0ZS5kb20uYXR0cih0aGlzLnRhYmxlLG8pO2lmKHE9PSJldmVudHMiKXtFPXRoaXMucnRlLnV0aWxzLnRyaW1FdmVudENhbGxiYWNrKEUpfUMuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW29dP3RoaXMubGFiZWxzW29dOm8pLHRoaXMuc3JjW3FdW29dLnZhbChFKV0scSx0cnVlKX19fUMub3BlbigpfTt0aGlzLnNldD1mdW5jdGlvbigpe2lmKCF0aGlzLnRhYmxlLnBhcmVudHMoKS5sZW5ndGgpe3ZhciBrPXBhcnNlSW50KHRoaXMuc3JjLm1haW4ucm93cy52YWwoKSl8fDA7dmFyIEI9cGFyc2VJbnQodGhpcy5zcmMubWFpbi5jb2xzLnZhbCgpKXx8MDtpZihrPD0wfHxCPD0wKXtyZXR1cm59dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt2YXIgRD1hKHRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKS5hcHBlbmRUbyh0aGlzLnRhYmxlKTtmb3IodmFyIHU9MDt1PGs7dSsrKXt2YXIgQz0iPHRyPiI7Zm9yKHZhciB0PTA7dDxCO3QrKyl7Qys9Ijx0ZD4mbmJzcDs8L3RkPiJ9RC5hcHBlbmQoQysiPC90cj4iKX19ZWxzZXt0aGlzLnRhYmxlLnJlbW92ZUF0dHIoIndpZHRoIikucmVtb3ZlQXR0cigiaGVpZ2h0IikucmVtb3ZlQXR0cigiYm9yZGVyIikucmVtb3ZlQXR0cigiYWxpZ24iKS5yZW1vdmVBdHRyKCJib3JkZXJjb2xvciIpLnJlbW92ZUF0dHIoImJnY29sb3IiKS5yZW1vdmVBdHRyKCJjZWxsc3BhY2luZyIpLnJlbW92ZUF0dHIoImNlbGxwYWRkaW5nIikucmVtb3ZlQXR0cigiZnJhbWUiKS5yZW1vdmVBdHRyKCJydWxlcyIpLnJlbW92ZUF0dHIoInN0eWxlIil9dmFyIEk9YS50cmltKHRoaXMuc3JjLm1haW4uY2FwdGlvbi52YWwoKSk7aWYoSSl7aWYoIXRoaXMudGFibGUuY2hpbGRyZW4oImNhcHRpb24iKS5sZW5ndGgpe3RoaXMudGFibGUucHJlcGVuZCgiPGNhcHRpb24gLz4iKX10aGlzLnRhYmxlLmNoaWxkcmVuKCJjYXB0aW9uIikudGV4dChJKX1lbHNle3RoaXMudGFibGUuY2hpbGRyZW4oImNhcHRpb24iKS5yZW1vdmUoKX1mb3IodmFyIHAgaW4gdGhpcy5zcmMpe2lmKHAhPSJtYWluIil7Zm9yKHZhciBvIGluIHRoaXMuc3JjW3BdKXt2YXIgRz1hLnRyaW0odGhpcy5zcmNbcF1bb10udmFsKCkpO2lmKEcpe3RoaXMudGFibGUuYXR0cihvLEcpfWVsc2V7dGhpcy50YWJsZS5yZW1vdmVBdHRyKG8pfX19fXZhciBBLEUsSDtpZigoQT1wYXJzZUludCh0aGlzLnNyYy5tYWluLnNwYWNpbmcudmFsKCkpKSYmQT49MCl7dGhpcy50YWJsZS5hdHRyKCJjZWxsc3BhY2luZyIsQSl9aWYoKEU9cGFyc2VJbnQodGhpcy5zcmMubWFpbi5wYWRkaW5nLnZhbCgpKSkmJkU+PTApe3RoaXMudGFibGUuYXR0cigiY2VsbHBhZGRpbmciLEUpfWlmKChIPXRoaXMuc3JjLm1haW4ucnVsZXMudmFsKCkpKXt0aGlzLnRhYmxlLmF0dHIoInJ1bGVzIixIKX12YXIgRj1wYXJzZUludCh0aGlzLnNyYy5tYWluLndpZHRoLnZhbCgpKXx8IiIseD1wYXJzZUludCh0aGlzLnNyYy5tYWluLmhlaWdodC52YWwoKSl8fCIiLHU9YS50cmltKHRoaXMuc3JjLm1haW4uYmdpbWcudmFsKCkpLEQ9dGhpcy5zcmMubWFpbi5ib3JkZXIudmFsKCkscT10aGlzLnNyYy5tYWluLm1hcmdpbi52YWwoKSx6PXRoaXMuc3JjLm1haW4uYWxpZ24udmFsKCk7dGhpcy50YWJsZS5jc3Moe3dpZHRoOkY/Rit0aGlzLnNyYy5tYWluLnd1bml0LnZhbCgpOiIiLGhlaWdodDp4P3grdGhpcy5zcmMubWFpbi5odW5pdC52YWwoKToiIixib3JkZXI6YS50cmltKEQud2lkdGgrIiAiK0Quc3R5bGUrIiAiK0QuY29sb3IpLCJiYWNrZ3JvdW5kLWNvbG9yIjp0aGlzLnNyYy5tYWluLmJnLnZhbCgpLCJiYWNrZ3JvdW5kLWltYWdlIjp1PyJ1cmwoIit1KyIpIjoiIn0pO2lmKHEuY3NzKXt0aGlzLnRhYmxlLmNzcygibWFyZ2luIixxLmNzcyl9ZWxzZXt0aGlzLnRhYmxlLmNzcyh7Im1hcmdpbi10b3AiOnEudG9wLCJtYXJnaW4tcmlnaHQiOnEucmlnaHQsIm1hcmdpbi1ib3R0b20iOnEuYm90dG9tLCJtYXJnaW4tbGVmdCI6cS5sZWZ0fSl9aWYoKHo9PSJsZWZ0Inx8ej09InJpZ2h0IikmJnRoaXMudGFibGUuY3NzKCJtYXJnaW4tbGVmdCIpIT0iYXV0byImJnRoaXMudGFibGUuY3NzKCJtYXJnaW4tcmlnaHQiKSE9ImF1dG8iKXt0aGlzLnRhYmxlLmNzcygiZmxvYXQiLHopfWlmKCF0aGlzLnRhYmxlLmF0dHIoInN0eWxlIikpe3RoaXMudGFibGUucmVtb3ZlQXR0cigic3R5bGUiKX1pZighdGhpcy50YWJsZS5wYXJlbnRzKCkubGVuZ3RoKXt0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0Tm9kZSh0aGlzLnRhYmxlLmdldCgwKSx0cnVlKX10aGlzLnJ0ZS51aS51cGRhdGUoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7aWYodGhpcy5uYW1lPT0idGFibGVwcm9wcyImJiF0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksL15UQUJMRSQvKSl7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJkaXNhYmxlZCIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKX19fTtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGFibGVwcm9wcz1lbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGFibGV9KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGFibGVybT1mdW5jdGlvbihjLGIpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjLGIpO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciBmPXRoaXMucnRlLmRvbS5wYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXlRBQkxFJC8pO2lmKGYpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7YShmKS5yZW1vdmUoKX10aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7aWYodGhpcy5ydGUuZG9tLnBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eVEFCTEUkLykpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKX1lbHNle3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQiKX19fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YmNlbGxwcm9wcz1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5zcmM9bnVsbDt0aGlzLmxhYmVscz1udWxsO2Z1bmN0aW9uIGcoKXtiLmxhYmVscz17bWFpbjoiUHJvcGVyaWVzIixhZHY6IkFkdmFuY2VkIixldmVudHM6IkV2ZW50cyIsaWQ6IklEIiwiY2xhc3MiOiJDc3MgY2xhc3MiLHN0eWxlOiJDc3Mgc3R5bGUiLGRpcjoiU2NyaXB0IGRpcmVjdGlvbiIsbGFuZzoiTGFuZ3VhZ2UifTtiLnNyYz17bWFpbjp7dHlwZTphKCI8c2VsZWN0IC8+IikuY3NzKCJ3aWR0aCIsIjEwMCUiKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgidGQiKS50ZXh0KGIucnRlLmkxOG4oIkRhdGEiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0aCIpLnRleHQoYi5ydGUuaTE4bigiSGVhZGVyIikpKSx3aWR0aDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJzaXplIiw0KSx3dW5pdDphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiUiKS50ZXh0KCIlIikpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJweCIpLnRleHQoInB4IikpLGhlaWdodDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJzaXplIiw0KSxodW5pdDphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiUiKS50ZXh0KCIlIikpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJweCIpLnRleHQoInB4IikpLGFsaWduOmEoIjxzZWxlY3QgLz4iKS5jc3MoIndpZHRoIiwiMTAwJSIpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCIiKS50ZXh0KGIucnRlLmkxOG4oIk5vdCBzZXQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJsZWZ0IikudGV4dChiLnJ0ZS5pMThuKCJMZWZ0IikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiY2VudGVyIikudGV4dChiLnJ0ZS5pMThuKCJDZW50ZXIiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJyaWdodCIpLnRleHQoYi5ydGUuaTE4bigiUmlnaHQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJqdXN0aWZ5IikudGV4dChiLnJ0ZS5pMThuKCJKdXN0aWZ5IikpKSxib3JkZXI6YSgiPGRpdiAvPiIpLHBhZGRpbmc6YSgiPGRpdiAvPiIpLGJnOmEoIjxkaXYgLz4iKSxiZ2ltZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiOTAlIiksYXBwbHk6YSgiPHNlbGVjdCAvPiIpLmNzcygid2lkdGgiLCIxMDAlIikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiIpLnRleHQoYi5ydGUuaTE4bigiQ3VycmVudCBjZWxsIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgicm93IikudGV4dChiLnJ0ZS5pMThuKCJBbGwgY2VsbHMgaW4gcm93IikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiY29sdW1uIikudGV4dChiLnJ0ZS5pMThuKCJBbGwgY2VsbHMgaW4gY29sdW1uIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgidGFibGUiKS50ZXh0KGIucnRlLmkxOG4oIkFsbCBjZWxscyBpbiB0YWJsZSIpKSl9LGFkdjp7aWQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksImNsYXNzIjphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSxzdHlsZTphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSxkaXI6YSgiPHNlbGVjdCAvPiIpLmNzcygid2lkdGgiLCIxMDAlIikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIk5vdCBzZXQiKSkudmFsKCIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIkxlZnQgdG8gcmlnaHQiKSkudmFsKCJsdHIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIlJpZ2h0IHRvIGxlZnQiKSkudmFsKCJydGwiKSksbGFuZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKX0sZXZlbnRzOnt9fTthLmVhY2goYi5zcmMsZnVuY3Rpb24oKXtmb3IodmFyIGggaW4gdGhpcyl7dGhpc1toXS5hdHRyKCJuYW1lIixoKTtpZih0aGlzW2hdLmF0dHIoInR5cGUiKT09InRleHQiJiYhdGhpc1toXS5hdHRyKCJzaXplIikmJmghPSJiZ2ltZyIpe3RoaXNbaF0uY3NzKCJ3aWR0aCIsIjEwMCUiKX19fSk7YS5lYWNoKFsib25ibHVyIiwib25mb2N1cyIsIm9uY2xpY2siLCJvbmRibGNsaWNrIiwib25tb3VzZWRvd24iLCJvbm1vdXNldXAiLCJvbm1vdXNlb3ZlciIsIm9ubW91c2VvdXQiLCJvbm1vdXNlbGVhdmUiLCJvbmtleWRvd24iLCJvbmtleXByZXNzIiwib25rZXl1cCJdLGZ1bmN0aW9uKCl7Yi5zcmMuZXZlbnRzW3RoaXNdPWEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoIm5hbWUiLHRoaXMpLmNzcygid2lkdGgiLCIxMDAlIil9KX10aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXshdGhpcy5zcmMmJmcoKTt0aGlzLmNlbGw9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eKFREfFRIKSQvKTtpZighdGhpcy5jZWxsKXtyZXR1cm59dGhpcy5zcmMubWFpbi50eXBlLnZhbCh0aGlzLmNlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7dGhpcy5jZWxsPWEodGhpcy5jZWxsKTt0aGlzLnNyYy5tYWluLmJvcmRlci5lbEJvcmRlclNlbGVjdCh7c3R5bGVIZWlnaHQ6MTE3LHZhbHVlOnRoaXMuY2VsbH0pO3RoaXMuc3JjLm1haW4uYmcuZWxDb2xvclBpY2tlcih7cGFsZXR0ZVBvc2l0aW9uOiJvdXRlciIsImNsYXNzIjoiZWwtY29sb3JwaWNrZXIgdWktaWNvbiB1aS1pY29uLXBlbmNpbCJ9KTt0aGlzLnNyYy5tYWluLnBhZGRpbmcuZWxQYWRkaW5nSW5wdXQoe3ZhbHVlOnRoaXMuY2VsbH0pO3ZhciBqPXRoaXMuY2VsbC5jc3MoIndpZHRoIil8fHRoaXMuY2VsbC5hdHRyKCJ3aWR0aCIpO3RoaXMuc3JjLm1haW4ud2lkdGgudmFsKHBhcnNlSW50KGopfHwiIik7dGhpcy5zcmMubWFpbi53dW5pdC52YWwoai5pbmRleE9mKCJweCIpIT0tMT8icHgiOiIlIik7dmFyIHE9dGhpcy5jZWxsLmNzcygiaGVpZ2h0Iil8fHRoaXMuY2VsbC5hdHRyKCJoZWlnaHQiKTt0aGlzLnNyYy5tYWluLmhlaWdodC52YWwocGFyc2VJbnQocSl8fCIiKTt0aGlzLnNyYy5tYWluLmh1bml0LnZhbChxLmluZGV4T2YoInB4IikhPS0xPyJweCI6IiUiKTt0aGlzLnNyYy5tYWluLmFsaWduLnZhbCh0aGlzLmNlbGwuYXR0cigiYWxpZ24iKXx8dGhpcy5jZWxsLmNzcygidGV4dC1hbGlnbiIpKTt0aGlzLnNyYy5tYWluLmJnLnZhbCh0aGlzLmNlbGwuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIikpO3ZhciB0PXRoaXMuY2VsbC5jc3MoImJhY2tncm91bmQtaW1hZ2UiKTt0aGlzLnNyYy5tYWluLmJnaW1nLnZhbCh0JiZ0IT0ibm9uZSI/dC5yZXBsYWNlKC91cmxcKChbXlwpXSspXCkvaSwiJDEiKToiIik7dGhpcy5zcmMubWFpbi5hcHBseS52YWwoIiIpO3ZhciByPXtydGw6dGhpcy5ydGUucnRsLHN1Ym1pdDpmdW5jdGlvbihoLHYpe2guc3RvcFByb3BhZ2F0aW9uKCk7aC5wcmV2ZW50RGVmYXVsdCgpO2Iuc2V0KCk7di5jbG9zZSgpfSxkaWFsb2c6e3dpZHRoOjUyMCx0aXRsZTp0aGlzLnJ0ZS5pMThuKCJUYWJsZSBjZWxsIHByb3BlcnRpZXMiKX19O3ZhciB1PW5ldyBlbERpYWxvZ0Zvcm0ocik7Zm9yKHZhciBwIGluIHRoaXMuc3JjKXt1LnRhYihwLHRoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbcF0pKTtpZihwPT0ibWFpbiIpe3UuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJXaWR0aCIpLGEoIjxzcGFuIC8+IikuYXBwZW5kKHRoaXMuc3JjLm1haW4ud2lkdGgpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnd1bml0KV0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiSGVpZ2h0IiksYSgiPHNwYW4gLz4iKS5hcHBlbmQodGhpcy5zcmMubWFpbi5oZWlnaHQpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmh1bml0KV0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiVGFibGUgY2VsbCB0eXBlIiksdGhpcy5zcmMubWFpbi50eXBlXSwibWFpbiIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJCb3JkZXIiKSx0aGlzLnNyYy5tYWluLmJvcmRlcl0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQWxpZ25tZW50IiksdGhpcy5zcmMubWFpbi5hbGlnbl0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiUGFkZGluZ3MiKSx0aGlzLnNyYy5tYWluLnBhZGRpbmddLCJtYWluIix0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkJhY2tncm91bmQiKSxhKCI8c3BhbiAvPiIpLmFwcGVuZChhKCI8c3BhbiAvPiIpLmNzcyh7ImZsb2F0IjoibGVmdCIsIm1hcmdpbi1yaWdodCI6IjNweCJ9KS5hcHBlbmQodGhpcy5zcmMubWFpbi5iZykpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmJnaW1nKV0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQXBwbHkgdG8iKSx0aGlzLnNyYy5tYWluLmFwcGx5XSwibWFpbiIsdHJ1ZSl9ZWxzZXtmb3IodmFyIG8gaW4gdGhpcy5zcmNbcF0pe3ZhciBrPXRoaXMuY2VsbC5hdHRyKG8pfHwiIjtpZihwPT0iZXZlbnRzIil7az10aGlzLnJ0ZS51dGlscy50cmltRXZlbnRDYWxsYmFjayhrKX11LmFwcGVuZChbdGhpcy5ydGUuaTE4bih0aGlzLmxhYmVsc1tvXT90aGlzLmxhYmVsc1tvXTpvKSx0aGlzLnNyY1twXVtvXS52YWwoayldLHAsdHJ1ZSl9fX11Lm9wZW4oKX07dGhpcy5zZXQ9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLmNlbGwsQj10aGlzLnNyYy5tYWluLmFwcGx5LnZhbCgpO3N3aXRjaCh0aGlzLnNyYy5tYWluLmFwcGx5LnZhbCgpKXtjYXNlInJvdyI6eD10aGlzLmNlbGwucGFyZW50KCJ0ciIpLmNoaWxkcmVuKCJ0ZCx0aCIpO2JyZWFrO2Nhc2UiY29sdW1uIjp4PWEodGhpcy5ydGUuZG9tLnRhYmxlQ29sdW1uKHRoaXMuY2VsbC5nZXQoMCkpKTticmVhaztjYXNlInRhYmxlIjp4PXRoaXMuY2VsbC5wYXJlbnRzKCJ0YWJsZSIpLmZpbmQoInRkLHRoIik7YnJlYWt9Zm9yKHZhciBvIGluIHRoaXMuc3JjKXtpZihvIT0ibWFpbiIpe2Zvcih2YXIgayBpbiB0aGlzLnNyY1tvXSl7dmFyIEM9YS50cmltKHRoaXMuc3JjW29dW2tdLnZhbCgpKTtpZihDKXt4LmF0dHIoayxDKX1lbHNle3gucmVtb3ZlQXR0cihrKX19fX14LnJlbW92ZUF0dHIoIndpZHRoIikucmVtb3ZlQXR0cigiaGVpZ2h0IikucmVtb3ZlQXR0cigiYm9yZGVyIikucmVtb3ZlQXR0cigiYWxpZ24iKS5yZW1vdmVBdHRyKCJib3JkZXJjb2xvciIpLnJlbW92ZUF0dHIoImJnY29sb3IiKTt2YXIgRD10aGlzLnNyYy5tYWluLnR5cGUudmFsKCk7dmFyIEE9cGFyc2VJbnQodGhpcy5zcmMubWFpbi53aWR0aC52YWwoKSl8fCIiO3ZhciByPXBhcnNlSW50KHRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCgpKXx8IiI7dmFyIHE9YS50cmltKHRoaXMuc3JjLm1haW4uYmdpbWcudmFsKCkpO3ZhciB6PXRoaXMuc3JjLm1haW4uYm9yZGVyLnZhbCgpO3ZhciB1PXt3aWR0aDpBP0ErdGhpcy5zcmMubWFpbi53dW5pdC52YWwoKToiIixoZWlnaHQ6cj9yK3RoaXMuc3JjLm1haW4uaHVuaXQudmFsKCk6IiIsImJhY2tncm91bmQtY29sb3IiOnRoaXMuc3JjLm1haW4uYmcudmFsKCksImJhY2tncm91bmQtaW1hZ2UiOnE/InVybCgiK3ErIikiOiIiLGJvcmRlcjphLnRyaW0oei53aWR0aCsiICIrei5zdHlsZSsiICIrei5jb2xvciksInRleHQtYWxpZ24iOnRoaXMuc3JjLm1haW4uYWxpZ24udmFsKCl8fCIifTt2YXIgaj10aGlzLnNyYy5tYWluLnBhZGRpbmcudmFsKCk7aWYoai5jc3Mpe3UucGFkZGluZz1qLmNzc31lbHNle3VbInBhZGRpbmctdG9wIl09ai50b3A7dVsicGFkZGluZy1yaWdodCJdPWoucmlnaHQ7dVsicGFkZGluZy1ib3R0b20iXT1qLmJvdHRvbTt1WyJwYWRkaW5nLWxlZnQiXT1qLmxlZnR9eD14LmdldCgpO2EuZWFjaCh4LGZ1bmN0aW9uKCl7dmFyIHc9dGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3ZhciBGPWEodGhpcyk7aWYodyE9RCl7dmFyIGg9e307Zm9yKHZhciB0IGluIGIuc3JjLmFkdil7dmFyIHA9Ri5hdHRyKHQpO2lmKHApe2hbdF09cC50b1N0cmluZygpfX1mb3IodmFyIHQgaW4gYi5zcmMuZXZlbnRzKXt2YXIgcD1GLmF0dHIodCk7aWYocCl7aFt0XT1wLnRvU3RyaW5nKCl9fXZhciBHPUYuYXR0cigiY29sc3BhbiIpfHwxO3ZhciBFPUYuYXR0cigicm93c3BhbiIpfHwxO2lmKEc+MSl7aC5jb2xzcGFuPUd9aWYoRT4xKXtoLnJvd3NwYW49RX1GLnJlcGxhY2VXaXRoKGEoIjwiK0QrIiAvPiIpLmh0bWwoRi5odG1sKCkpLmF0dHIoaCkuY3NzKHUpKX1lbHNle0YuY3NzKHUpfX0pO3RoaXMucnRlLnVpLnVwZGF0ZSgpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKHRoaXMucnRlLmRvbS5wYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXlRBQkxFJC8pKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9fX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjZWxsc21lcmdlPWZ1bmN0aW9uKGcsZil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGcsZik7dmFyIGM9dGhpcztmdW5jdGlvbiBiKCl7dmFyIGo9Yy5ydGUuZG9tLnNlbGZPclBhcmVudChjLnJ0ZS5zZWxlY3Rpb24uZ2V0U3RhcnQoKSwvXihURHxUSCkkLyk7dmFyIGg9Yy5ydGUuZG9tLnNlbGZPclBhcmVudChjLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCksL14oVER8VEgpJC8pO2lmKGomJmgmJmohPWgmJmEoaikucGFyZW50cygidGFibGUiKS5nZXQoMCk9PWEoaCkucGFyZW50cygidGFibGUiKS5nZXQoMCkpe3JldHVybltqLGhdfXJldHVybiBudWxsfXRoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciB6PWIoKTtpZih6KXt2YXIgeD10aGlzLnJ0ZS5kb20uaW5kZXhPZihhKHpbMF0pLnBhcmVudCgidHIiKS5nZXQoMCkpO3ZhciByPXRoaXMucnRlLmRvbS5pbmRleE9mKGEoelsxXSkucGFyZW50KCJ0ciIpLmdldCgwKSk7dmFyIHE9TWF0aC5taW4oeCxyKTt2YXIgdT1NYXRoLm1heCh4LHIpLXErMTt2YXIgaj10aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4oelswXSx0cnVlLHRydWUpO3ZhciBoPXRoaXMucnRlLmRvbS50YWJsZUNvbHVtbih6WzFdLHRydWUpO3ZhciBCPWEuaW5BcnJheSh6WzBdLGouY29sdW1uKTt2YXIgdz1hLmluQXJyYXkoelsxXSxoLmNvbHVtbik7dmFyIHA9ai5pbmZvLm9mZnNldFtCXTxoLmluZm8ub2Zmc2V0W3ddP2o6aDt2YXIgdj1qLmluZm8ub2Zmc2V0W0JdPj1oLmluZm8ub2Zmc2V0W3ddP2o6aDt2YXIgaz0wO3ZhciB0PW51bGw7dmFyIG89IiI7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt2YXIgQT1hKGEoelswXSkucGFyZW50cygidGFibGUiKS5lcSgwKS5maW5kKCJ0ciIpLmdldCgpLnNsaWNlKHEscSt1KSkuZWFjaChmdW5jdGlvbihFKXt2YXIgRD1vLmxlbmd0aDt2YXIgQz1mYWxzZTthKHRoaXMpLmNoaWxkcmVuKCJ0ZCx0aCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgSz1hKHRoaXMpO3ZhciBJPWEuaW5BcnJheSh0aGlzLHAuY29sdW1uKTt2YXIgSD1hLmluQXJyYXkodGhpcyx2LmNvbHVtbik7aWYoSSE9LTF8fEghPS0xKXtDPUkhPS0xJiZIPT0tMTt2YXIgRz1wYXJzZUludChLLmF0dHIoImNvbHNwYW4iKXx8MSk7aWYoRT09MCl7ays9R31pZihJIT0tMSYmRT4wKXt2YXIgTD1wLmluZm8uZGVsdGFbSV07aWYoTD4wKXtpZihLLmNzcygidGV4dC1hbGlnbiIpPT0ibGVmdCIpe3ZhciBGPUsuY2xvbmUodHJ1ZSk7Sy5odG1sKCImbmJzcDsiKX1lbHNle3ZhciBGPUsuY2xvbmUoKS5odG1sKCImbmJzcDsiKX1GLnJlbW92ZUF0dHIoImNvbHNwYW4iKS5yZW1vdmVBdHRyKCJpZCIpLmluc2VydEJlZm9yZSh0aGlzKTtpZihMPjEpe0YuYXR0cigiY29sc3BhbiIsTCl9fX1pZihIIT0tMSl7dmFyIEw9di5pbmZvLmRlbHRhW0hdO2lmKEctTD4xKXt2YXIgSj1HLUwtMTtpZihLLmNzcygidGV4dC1hbGlnbiIpPT0icmlnaHQiKXt2YXIgRj1LLmNsb25lKHRydWUpO0suaHRtbCgiJm5ic3A7Iil9ZWxzZXt2YXIgRj1LLmNsb25lKCkuaHRtbCgiJm5ic3A7Iil9Ri5yZW1vdmVBdHRyKCJjb2xzcGFuIikucmVtb3ZlQXR0cigiaWQiKS5pbnNlcnRBZnRlcih0aGlzKTtpZihKPjEpe0YuYXR0cigiY29sc3BhbiIsSil9fX1pZighdCl7dD1LfWVsc2V7bys9Sy5odG1sKCk7Sy5yZW1vdmUoKX19ZWxzZXtpZihDKXtpZihFPT0wKXtrKz1wYXJzZUludChLLmF0dHIoImNvbHNwYW4iKXx8MSl9bys9Sy5odG1sKCk7Sy5yZW1vdmUoKX19fSk7bys9RCE9by5sZW5ndGg/IjxiciAvPiI6IiJ9KTt0LnJlbW92ZUF0dHIoImNvbHNwYW4iKS5yZW1vdmVBdHRyKCJyb3dzcGFuIikuaHRtbCh0Lmh0bWwoKStvKTtpZihrPjEpe3QuYXR0cigiY29sc3BhbiIsayl9aWYodT4xKXt0LmF0dHIoInJvd3NwYW4iLHUpfXRoaXMucnRlLmRvbS5maXhUYWJsZShhKHpbMF0pLnBhcmVudHMoInRhYmxlIikuZ2V0KDApKX19O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7aWYoYigpKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9fX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjZWxsc3BsaXQ9ZnVuY3Rpb24oYyxiKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYyxiKTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgaj10aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksL14oVER8VEgpJC8pO2lmKGope3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7dmFyIGs9cGFyc2VJbnQodGhpcy5ydGUuZG9tLmF0dHIoaiwiY29sc3BhbiIpKTt2YXIgbz1wYXJzZUludCh0aGlzLnJ0ZS5kb20uYXR0cihqLCJyb3dzcGFuIikpO2lmKGs+MXx8bz4xKXt2YXIgdT1rLTE7dmFyIHY9by0xO3ZhciBxPXRoaXMucnRlLmRvbS5wYXJlbnQoaiwvXlRBQkxFJC8pO3ZhciBwPXRoaXMucnRlLmRvbS50YWJsZU1hdHJpeChxKTtpZih1KXtmb3IodmFyIHQ9MDt0PHU7dCsrKXthKHRoaXMucnRlLmRvbS5jcmVhdGUoai5ub2RlTmFtZSkpLmh0bWwoIiZuYnNwOyIpLmluc2VydEFmdGVyKGopfX1pZih2KXt2YXIgeD10aGlzLnJ0ZS5kb20uaW5kZXhlc09mQ2VsbChqLHApO3ZhciBoPXhbMF07dmFyIGc9eFsxXTtmb3IodmFyIGY9aCsxO2Y8aCt2KzE7ZisrKXt2YXIgdztpZighcFtmXVtnXS5ub2RlTmFtZSl7aWYocFtmXVtnLTFdLm5vZGVOYW1lKXt3PXBbZl1bZy0xXX1lbHNle2Zvcih2YXIgdD1nLTE7dD49MDt0LS0pe2lmKHBbZl1bdF0ubm9kZU5hbWUpe3c9cFtmXVt0XTticmVha319fWlmKHcpe2Zvcih2YXIgdD0wO3Q8PXU7dCsrKXthKHRoaXMucnRlLmRvbS5jcmVhdGUody5ub2RlTmFtZSkpLmh0bWwoIiZuYnNwOyIpLmluc2VydEFmdGVyKHcpfX19fX1hKGopLnJlbW92ZUF0dHIoImNvbHNwYW4iKS5yZW1vdmVBdHRyKCJyb3dzcGFuIik7dGhpcy5ydGUuZG9tLmZpeFRhYmxlKHEpfX10aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eKFREfFRIKSQvKTtpZihmJiYocGFyc2VJbnQodGhpcy5ydGUuZG9tLmF0dHIoZiwiY29sc3BhbiIpKT4xfHxwYXJzZUludCh0aGlzLnJ0ZS5kb20uYXR0cihmLCJyb3dzcGFuIikpPjEpKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9fX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjb2xiZWZvcmU9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgYj10aGlzO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciBnPXRoaXMucnRlLmRvbS50YWJsZUNvbHVtbih0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLGZhbHNlLHRydWUpO2lmKGcubGVuZ3RoKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO2EuZWFjaChnLGZ1bmN0aW9uKCl7dmFyIGo9YSh0aGlzKTt2YXIgaD1wYXJzZUludChqLmF0dHIoImNvbHNwYW4iKXx8MSk7aWYoaD4xKXtqLmF0dHIoImNvbHNwYW4iLGgrMSl9ZWxzZXt2YXIgaz1qLmNsb25lKCkuaHRtbCgiJm5ic3A7IikucmVtb3ZlQXR0cigiY29sc3BhbiIpLnJlbW92ZUF0dHIoIndpZHRoIikucmVtb3ZlQXR0cigiaWQiKTtpZihiLm5hbWU9PSJ0YmNvbGJlZm9yZSIpe2suaW5zZXJ0QmVmb3JlKHRoaXMpfWVsc2V7ay5pbnNlcnRBZnRlcih0aGlzKX19fSk7dGhpcy5ydGUudWkudXBkYXRlKCl9fTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXihURHxUSCkkLykpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKX1lbHNle3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQiKX19fTtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjb2xhZnRlcj1lbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjb2xiZWZvcmV9KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjb2xybT1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIHA9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTt2YXIgbz10aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHAsL14oVER8VEgpJC8pO3ZhciBrPWEobykucHJldigidGQsdGgiKS5nZXQoMCk7dmFyIGo9YShvKS5uZXh0KCJ0ZCx0aCIpLmdldCgwKTt2YXIgZz10aGlzLnJ0ZS5kb20ucGFyZW50KHAsL15UQUJMRSQvKTt2YXIgaD10aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4ocCxmYWxzZSx0cnVlKTtpZihoLmxlbmd0aCl7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTthLmVhY2goaCxmdW5jdGlvbigpe3ZhciByPWEodGhpcyk7dmFyIHE9cGFyc2VJbnQoci5hdHRyKCJjb2xzcGFuIil8fDEpO2lmKHE+MSl7ci5hdHRyKCJjb2xzcGFuIixxLTEpfWVsc2V7ci5yZW1vdmUoKX19KTt0aGlzLnJ0ZS5kb20uZml4VGFibGUoZyk7aWYoa3x8ail7dGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdENvbnRlbnRzKGs/azpqKS5jb2xsYXBzZSh0cnVlKX10aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9fTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXihURHxUSCkkLykpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKX1lbHNle3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQiKX19fX0pKGpRdWVyeSk7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRicm93YmVmb3JlPWZ1bmN0aW9uKGIsYSl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGIsYSk7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTt2YXIgdD10aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KGgsL14oVER8VEgpJC8pO3ZhciBmPXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodCwvXlRSJC8pO3ZhciB3PXRoaXMucnRlLmRvbS50YWJsZU1hdHJpeCh0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHQsL15UQUJMRSQvKSk7aWYodCYmZiYmdyl7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt2YXIgdT10aGlzLm5hbWU9PSJ0YnJvd2JlZm9yZSI7dmFyIHE9JChmKS5wcmV2QWxsKCJ0ciIpLmxlbmd0aDt2YXIgaj0wO3ZhciBwPVtdO2Z1bmN0aW9uIGsoYyxyKXt3aGlsZShyPjApe3ItLTtpZih3W3JdJiZ3W3JdW2NdJiZ3W3JdW2NdLm5vZGVOYW1lKXtyZXR1cm4gd1tyXVtjXX19fWZvcih2YXIgbz0wO288d1txXS5sZW5ndGg7bysrKXtpZih3W3FdW29dJiZ3W3FdW29dLm5vZGVOYW1lKXt2YXIgdj0kKHdbcV1bb10pO3ZhciBnPXBhcnNlSW50KHYuYXR0cigiY29sc3BhbiIpfHwxKTtpZihwYXJzZUludCh2LmF0dHIoInJvd3NwYW4iKXx8MSk+MSl7aWYodSl7ais9Z31lbHNle3AucHVzaCh2KX19ZWxzZXtqKz1nfX1lbHNle2lmKHdbcV1bb109PSItIil7dj1rKG8scSk7diYmcC5wdXNoKCQodikpfX19dmFyIHg9JCgiPHRyIC8+Iik7Zm9yKHZhciBvPTA7bzxqO28rKyl7eC5hcHBlbmQoIjx0ZD4mbmJzcDs8L3RkPiIpfWlmKHUpe3guaW5zZXJ0QmVmb3JlKGYpfWVsc2V7eC5pbnNlcnRBZnRlcihmKX0kLmVhY2gocCxmdW5jdGlvbigpeyQodGhpcykuYXR0cigicm93c3BhbiIscGFyc2VJbnQoJCh0aGlzKS5hdHRyKCJyb3dzcGFuIil8fDEpKzEpfSk7dGhpcy5ydGUudWkudXBkYXRlKCl9fTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXlRSJC8pKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9fX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRicm93YWZ0ZXI9ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRicm93YmVmb3JlOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJyb3dybT1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSx4PXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQoaCwvXihURHxUSCkkLyksZz10aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHgsL15UUiQvKSxxPXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQoeCwvXlRBQkxFJC8pLEE9dGhpcy5ydGUuZG9tLnRhYmxlTWF0cml4KHEpO2lmKHgmJmcmJkEubGVuZ3RoKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO2lmKEEubGVuZ3RoPT0xKXthKHEpLnJlbW92ZSgpO3JldHVybiB0aGlzLnJ0ZS51aS51cGRhdGUoKX12YXIgdT1bXTt2YXIgdj1hKGcpLnByZXZBbGwoInRyIikubGVuZ3RoO2Z1bmN0aW9uIHAocixDKXt3aGlsZShDPjApe0MtLTtpZihBW0NdJiZBW0NdW3JdJiZBW0NdW3JdLm5vZGVOYW1lKXtyZXR1cm4gQVtDXVtyXX19fWZ1bmN0aW9uIEIoQyxyKXt5PXYrMTt2YXIgRT1udWxsO2lmKEFbeV0pe2Zvcih2YXIgRD0wO0Q8cjtEKyspe2lmKEFbeV1bRF0mJkFbeV1bRF0ubm9kZU5hbWUpe0U9QVt5XVtEXX19Qz1DLnJlbW92ZSgpO2lmKEUpe0MuaW5zZXJ0QWZ0ZXIoRSl9ZWxzZXtDLnByZXBlbmRUbyhhKGcpLm5leHQoInRyIikuZXEoMCkpfX19ZnVuY3Rpb24gbyhDKXtmb3IodmFyIHI9MDtyPEMubGVuZ3RoO3IrKyl7aWYoQ1tyXT09eCl7cmV0dXJuIHI8Qy5sZW5ndGgtMT9DW3IrMV06Q1tyLTFdfX19Zm9yKHZhciB0PTA7dDxBW3ZdLmxlbmd0aDt0Kyspe3ZhciB6PW51bGw7dmFyIGo9ZmFsc2U7aWYoQVt2XVt0XSYmQVt2XVt0XS5ub2RlTmFtZSl7ej1BW3ZdW3RdO2o9dHJ1ZX1lbHNle2lmKEFbdl1bdF09PSItIiYmKHo9cCh0LHYpKSl7aj1mYWxzZX19aWYoeil7ej1hKHopO3ZhciBrPXBhcnNlSW50KHouYXR0cigicm93c3BhbiIpfHwxKTtpZihrPjEpe3ouYXR0cigicm93c3BhbiIsay0xKTtqJiZCKHosdCx2KX19fXZhciB3PW8odGhpcy5ydGUuZG9tLnRhYmxlQ29sdW1uKHgpKTtpZih3KXt0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0Q29udGVudHModykuY29sbGFwc2UodHJ1ZSl9YShnKS5yZW1vdmUoKX10aGlzLnJ0ZS51aS51cGRhdGUoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXtpZih0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksL15UUiQvKSl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfWVsc2V7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJkaXNhYmxlZCIpfX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnVuZG89ZnVuY3Rpb24oYyxiKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYyxiKTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXtpZih0aGlzLm5hbWU9PSJ1bmRvIiYmdGhpcy5ydGUuaGlzdG9yeS5jYW5CYWNrKCkpe3RoaXMucnRlLmhpc3RvcnkuYmFjaygpO3RoaXMucnRlLnVpLnVwZGF0ZSgpfWVsc2V7aWYodGhpcy5uYW1lPT0icmVkbyImJnRoaXMucnRlLmhpc3RvcnkuY2FuRndkKCkpe3RoaXMucnRlLmhpc3RvcnkuZndkKCk7dGhpcy5ydGUudWkudXBkYXRlKCl9fX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0udG9nZ2xlQ2xhc3MoImRpc2FibGVkIix0aGlzLm5hbWU9PSJ1bmRvIj8hdGhpcy5ydGUuaGlzdG9yeS5jYW5CYWNrKCk6IXRoaXMucnRlLmhpc3RvcnkuY2FuRndkKCkpfX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnJlZG89ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnVuZG99KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudW5saW5rPWZ1bmN0aW9uKGMsYil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMsYik7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSxmPXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnRMaW5rKGspO2Z1bmN0aW9uIGoobyl7cmV0dXJuIG8ubm9kZU5hbWU9PSJBIiYmby5ocmVmfWlmKCFmKXt2YXIgaD1hLmJyb3dzZXIubXNpZT90aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoKTp0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe3dyYXA6ZmFsc2V9KTtpZihoLmxlbmd0aCl7Zm9yKHZhciBnPTA7ZzxoLmxlbmd0aDtnKyspe2lmKGooaFtnXSkpe2Y9aFtnXTticmVha319aWYoIWYpe2Y9dGhpcy5ydGUuZG9tLnBhcmVudChoWzBdLGopfHx0aGlzLnJ0ZS5kb20ucGFyZW50KGhbaC5sZW5ndGgtMV0sail9fX1pZihmKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO3RoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3QoZik7dGhpcy5ydGUuZG9jLmV4ZWNDb21tYW5kKCJ1bmxpbmsiLGZhbHNlLG51bGwpO3RoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKX19O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTtpZih0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50TGluayhmKSl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpLmFkZENsYXNzKCJhY3RpdmUiKX1lbHNle2lmKHRoaXMucnRlLmRvbS5zZWxlY3Rpb25IYXMoZnVuY3Rpb24oZyl7cmV0dXJuIGcubm9kZU5hbWU9PSJBIiYmZy5ocmVmfSkpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX19fX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.ar.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEFyYWJpYyB0cmFuc2xhdGlvbgogKiBAYXV0aG9yIHRhd2ZlayBkYWdoaXN0YW5pIDx0YXdmZWtvdkBnbWFpbC5jb20+CiAqIEB2ZXJzaW9uIDIwMTAtMDktMTgKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5pMThNZXNzYWdlcy5hciA9IHsKCSdFZGl0b3InIDogJ9in2YTZhdit2LHYsScsCgknU291cmNlJyA6ICfYp9mE2YXYtdiv2LEnLAoJLy8gUGFuZWwgTmFtZQoJJ0NvcHkvUGFzZScgICAgICA6ICfZhtiz2K4v2YTYtdmCJywKCSdVbmRvL1JlZG8nICAgICAgOiAn2KrYsdin2KzYuS/YqtmD2LHYp9ixJywKCSdUZXh0IHN0eWxlcycgICAgOiAn2KrZhtiz2YrZgiDYp9mE2YbYtScsCgknQ29sb3JzJyAgICAgICAgIDogJ9in2YTYo9mE2YjYp9mGJywKCSdBbGlnbm1lbnQnICAgICAgOiAn2KfZhNmF2K3Yp9iw2KfYqScsCgknSW5kZW50L091dGRlbnQnIDogJ9mF2LPYp9mB2Kkg2KjYp9iv2KbYqSAvINmF2LPYp9mB2Kkg2K7Yp9iq2YXYqScsCgknSW5kZW50L091dGRlbnQnIDogJycsCgknVGV4dCBmb3JtYXQnICAgIDogJ9in2YTYqtmG2LPZitmCJywKCSdMaXN0cycgICAgICAgICAgOiAn2YLZiNin2KbZhScsCgknTWlzYyBlbGVtZW50cycgIDogJ9i52YbYp9i12LEg2YXYqtmG2YjYudipJywKCSdMaW5rcycgICAgICAgICAgOiAn2LHYp9io2Lcg2KrYtNi52KjZiicsCgknSW1hZ2VzJyAgICAgICAgIDogJ9i12YjYsdipJywKCSdNZWRpYScgICAgICAgICAgOiAn2LnZhti12LEg2LXZiNiqINij2Ygg2YHZitiv2YrZiCcsCgknVGFibGVzJyAgICAgICAgIDogJ9is2K/ZiNmEJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAn2YXYs9iq2YPYtNmBINin2YTZhdmE2YHYp9iqJywKCS8vIGJ1dHRvbiBuYW1lcwoJJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICfYrdmB2LgnLAoJJ0NvcHknICAgICAgICAgICAgICAgICAgICA6ICfZhtiz2K4nLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICfZgti1JywKCSdQYXN0ZScgICAgICAgICAgICAgICAgICAgOiAn2YTYtdmCJywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAn2YTYtdmCINin2YTZhti12YjYtSDZgdmC2LcnLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICfZhNi12YIg2KfZhNmG2LXZiNi1INin2YTZhdmG2LPZgtipJywKCSdDbGVhbiBmb3JtYXQnICAgICAgICAgICAgOiAn2KXYstin2YTYqSDYp9mE2KrZhtiz2YrZgtin2KonLCAKCSdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAn2KfZhNiq2LHYp9is2Lkg2LnZhiDYo9iu2LEg2YHYudmEJywKCSdSZWRvIHByZXZpb3VzIGFjdGlvbicgICAgOiAn2KrZg9ix2KfYsSDYo9iu2LEg2YHYudmEICcsCgknQm9sZCcgICAgICAgICAgICAgICAgICAgIDogJ9i52LHZiti2JywKCSdJdGFsaWMnICAgICAgICAgICAgICAgICAgOiAn2YXYp9im2YQnLAoJJ1VuZGVybGluZScgICAgICAgICAgICAgICA6ICfYqtit2KrZhyDYrti3JywKCSdTdHJpa2V0aHJvdWdoJyAgICAgICAgICAgOiAn2YrYqtmI2LPYt9mHINiu2LcnLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICfZiti52YTZiNmHINiu2LcnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICfYqtit2KrZhyDYrti3JywKCSdBbGlnbiBsZWZ0JyAgICAgICAgICAgICAgOiAn2YXYrdin2LDYp9ipINil2YTZiSDYp9mE2YrYs9in2LEnLAoJJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICfZhdit2KfYsNin2Kkg2KXZhNmJINin2YTZitmF2YrZhiAnLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICfZhdit2KfYsNin2Kkg2KXZhNmJINin2YTZhdmG2KrYtdmBJywKCSdBbGlnbiBmdWxsJyAgICAgICAgICAgICAgOiAn2YXYrdin2LDYp9ipINio2LnYsdi2INin2YTYtdmB2K3YqScsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ9mE2YjZhiDYp9mE2K7YtycsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ9mE2YjZhiDYp9mE2K7ZhNmB2YrYqScsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ9mF2LPYp9mB2Kkg2KjYp9iv2KbYqScsIAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICfZhdiz2KfZgdipINiu2KfYqtmF2KknLCAKCSdVbmRlcmxpbmUnICAgICAgICAgICAgICAgOiAnJywKCSdTdHJpa2V0aHJvdWdoJyAgICAgICAgICAgOiAnJywKCSdTdXBlcnNjcmlwdCcgICAgICAgICAgICAgOiAnJywKCSdTdWJzY3JpcHQnICAgICAgICAgICAgICAgOiAnJywKCSdBbGlnbiBsZWZ0JyAgICAgICAgICAgICAgOiAn2YXYrdin2LDYp9ipINil2YTZiSDYp9mE2YrYs9in2LEnLAoJJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICfZhdit2KfYsNin2Kkg2KXZhNmJINin2YTZitmF2YrZhiAnLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICfZhdit2KfYsNin2Kkg2KXZhCDYp9mE2YXZhtiq2LXZgScsCgknQWxpZ24gZnVsbCcgICAgICAgICAgICAgIDogJycsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ9mE2YjZhiDYp9mE2K7YtycsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ9mE2YjZhiDYp9mE2K7ZhNmB2YrYqScsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJycsCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJycsCgknRm9ybWF0JyAgICAgICAgICAgICAgICAgIDogJ9in2YTZhtiq2LPZitmCJywKCSdGb250IHNpemUnICAgICAgICAgICAgICAgOiAn2YLZitin2LMg2KfZhNiu2LcnLAoJJ0ZvbnQnICAgICAgICAgICAgICAgICAgICA6ICfYp9mE2K7YtycsCgknT3JkZXJlZCBsaXN0JyAgICAgICAgICAgIDogJ9mB2KfYptmF2Kkg2YXYsdmC2YXYqScsCgknVW5vcmRlcmVkIGxpc3QnICAgICAgICAgIDogJ9mC2KfYptmF2Kkg2YXYsdiq2KjYqScsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ9iu2Lcg2KfZgdmC2YonLAoJJ0Jsb2NrcXVvdGUnICAgICAgICAgICAgICA6ICfYp9mC2KrYqNin2LMnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICfYp9mC2KrYqNin2LMgKERJViknLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICfYsdin2KjYtycsCgknRGVsZXRlIGxpbmsnICAgICAgICAgICAgIDogJ9it2LDZgSDYp9mE2LHYp9io2LcnLAoJJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICfYrdmB2Lgg2YPYudmE2KfZhdipJywKCSdJbWFnZScgICAgICAgICAgICAgICAgICAgOiAn2LXZiNix2KknLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICfYrNiv2YjZhCcsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ9it2LDZgSDYp9mE2KzYr9mI2YQnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICfYpdiv2LHYp9isINin2YTYtdmBINmC2KjZhCAnLAoJJ0luc2VydCByb3cgYWZ0ZXInICAgICAgICA6ICfYpdiv2LHYp9isINin2YTYtdmBINio2LnYr9mHJywKCSdEZWxldGUgcm93JyAgICAgICAgICAgICAgOiAn2K3YsNmBINin2YTYtdmBJywKCSdJbnNlcnQgY29sdW1uIGJlZm9yZScgICAgOiAn2KXYr9ix2KfYrCDYudmF2YjYryDZgtio2YQgJywKCSdJbnNlcnQgY29sdW1uIGFmdGVyJyAgICAgOiAn2KXYr9ix2KfYrCDYudmF2YjYryDYqNi52K8gJywKCSdEZWxldGUgY29sdW1uJyAgICAgICAgICAgOiAn2K3YsNmBINin2YTYudmF2YjYrycsCgknTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ9iv2YXYrCDYp9mE2K7ZhNin2YrYpycsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ9iq2YLYs9mK2YUg2KfZhNiu2YTZitipJywKCSdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnIDogJ9il2K7Zgdin2KEvINil2LjZh9in2LEgJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAn2K7Ytdin2KbYtSDYp9mE2K7ZhNin2YrYpycsCgknVGFibGUgcHJvcGVydGllcycgICAgICAgIDogJ9iu2LXYp9im2LUg2KfZhNis2K/ZiNmEJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAn2LnYsdi2INio2YPYp9mF2YQg2KfZhNi02KfYtNipJywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAn2KfZgdiq2K0g2YXYs9iq2YPYtNmBINin2YTZhdmE2YHYp9iqJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAnJywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAnJywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICfYqtmG2KjZitmHJywKCSdQcm9wZXJpZXMnIDogJ9iu2LXYp9im2LUnLAoJJ1BvcHVwJyA6ICfZhtin2YHYsNipINmF2YbYqNim2YLYqScsCgknQWR2YW5jZWQnIDogJ9mF2KrZgtiv2YUnLAoJJ0V2ZW50cycgOiAn2KfZhNij2K3Yr9in2KsnLAoJJ1BvcHVwJyA6ICcnLAoJJ0FkdmFuY2VkJyA6ICcnLAoJJ0V2ZW50cycgOiAnJywKCSdXaWR0aCcgOiAn2KfZhNi52LHYticsCgknSGVpZ2h0JyA6ICfYp9mE2KfYsdiq2YHYp9i5JywKCSdMZWZ0JyAgIDogJ9in2YTZitiz2KfYsScsCgknQ2VudGVyJyA6ICfYp9mE2YXZhtiq2LXZgScsCgknUmlnaHQnICA6ICfYp9mE2YrZhdmK2YYnLAoJJ0JvcmRlcicgOiAn2K3Yr9mI2K8nLAoJJ0JhY2tncm91bmQnIDogJ9in2YTYrtmE2YHZitipJywKCSdDc3MgY2xhc3MnIDogJ0NzcyDZhtmF2LcnLAoJJ0NzcyBzdHlsZScgOiAnQ3NzINiq2YbYs9mK2YInLAoJJ0JvcmRlcicgOiAnJywKCSdCYWNrZ3JvdW5kJyA6ICcnLAoJJ0NzcyBjbGFzcycgOiAnJywKCSdDc3Mgc3R5bGUnIDogJycsCgknTm8nIDogJ9mE2KcnLAoJJ1RpdGxlJyA6ICfYp9mE2LnZhtmI2KfZhicsCgknU2NyaXB0IGRpcmVjdGlvbicgOiAn2KfYqtis2KfZhyDYp9mE2YbYtScsCgknTGFuZ3VhZ2UnIDogJ9in2YTZhNi62KknLAoJJ0NoYXJzZXQnIDogJ9in2YTYqtix2YXZitiyJywKCSdOb3Qgc2V0JyA6ICfYutmK2LEg2YXYrdiv2K8nLAoJJ0xlZnQgdG8gcmlnaHQnIDogJ9mF2YYg2KfZhNmK2LPYp9ixINil2YTZiSDYp9mE2YrZhdmK2YYnLAoJJ1JpZ2h0IHRvIGxlZnQnIDogJ9mF2YYg2KfZhNmK2YXZitmGINil2YTZiSDYp9mE2YrYs9in2LEnLAoJJ0luIHRoaXMgd2luZG93JyA6ICcoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICcoX2JsYW5rKScsCgknSW4gbmV3IHBhcmVudCB3aW5kb3cgKF9wYXJlbnQpJyA6ICcoX3BhcmVudCknLAoJJ0luIHRvcCBmcmFtZSAoX3RvcCknIDogJyhfdG9wKScsCgknVVJMJyA6ICcnLAoJJ09wZW4gaW4nIDogJycsCgkvLyBjb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuJyA6ICfZh9iw2Ycg2KfZhNi52YXZhNmK2Kkg2YXYudi32YTYqSDZhNij2LPYqNin2Kgg2KPZhdmG2YrYqSAsINin2LPYqtiu2K/ZhSDYp9mE2KfYrtiq2LXYp9ixINio2K/ZhNin2Ysg2LnZhtmH2KcnLAoJLy8gZm9ybWF0IAoJJ0hlYWRpbmcgMScgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDEnLAoJJ0hlYWRpbmcgMicgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDInLAoJJ0hlYWRpbmcgMycgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDMnLAoJJ0hlYWRpbmcgNCcgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDQnLAoJJ0hlYWRpbmcgNScgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDUnLAoJJ0hlYWRpbmcgNicgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDYnLAkKCSdQYXJhZ3JhcGgnIDogJ9mF2YLYt9i5INmG2LXZiiAnLAoJJ0FkZHJlc3MnIDogJ9in2YTYudmG2YjYp9mGJywKCSdQcmVmb3JtYXR0ZWQnIDogJycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICcnLAoJJ1NtYWxsICgxMHB4KScgIDogJycsCgknU21hbGwgKDEycHQpJyAgOiAnJywKCSdOb3JtYWwgKDE0cHQpJyA6ICcnLAoJJ0xhcmdlICgxOHB0KScgIDogJycsCgknTGFyZ2UgKDI0cHQpJyAgOiAnJywKCSdMYXJnZSAoMzZwdCknICA6ICcnLAkJCQkKCS8vIGJvb2ttYXJrCgknQm9va21hcmsgbmFtZScgOiAn2KfYs9mFINin2YTYudmE2KfZhdipJywKCS8vIGxpbmsKCSdMaW5rIFVSTCcgOiAnKNin2LHYqtio2KfYtyknLAoJJ1RhcmdldCcgOiAn2KfZhNmH2K/ZgScsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdycgOiAn2KfZgdiq2K0g2YHZiiDZhtin2YHYsNipINi12LrZitix2KknLAoJJ1VSTCcgOiAn2KfYsdiq2KjYp9i3JywKCSdXaW5kb3cgbmFtZScgOiAn2KfYs9mFINin2YTZhtin2YHYsNipJywKCSdXaW5kb3cgc2l6ZScgOiAn2K3YrNmFINin2YTZhtin2YHYsNipJywKCSdXaW5kb3cgcG9zaXRpb24nIDogJ9in2YTZhdmI2LbYuScsCgknTG9jYXRpb24gYmFyJyA6ICfYp9mE2LnZhtmI2KfZhicsCgknTWVudSBiYXInIDogJ9i02LHZiti3INin2YTZgtmI2KfYptmFJywKCSdUb29sYmFyJyA6ICfZgtin2KbZhdipINin2YTYo9iv2YjYp9iqJywKCSdTY3JvbGxiYXJzJyA6ICfYtNix2YrYtyDYp9mE2KrZhdix2YrYsScsCgknU3RhdHVzIGJhcicgOiAn2LTYsdmK2Lcg2KfZhNmF2LnZhNmI2YXYp9iqJywKCSdSZXNpemFibGUnIDogJ9mF2KrYutmK2LEg2KfZhNit2KzZhScsCgknRGVwZWRlbnQnIDogJycsCgknQWRkIHJldHVybiBmYWxzZScgOiAn2KXYttin2YHYqSAocmV0dXJuIGZhbHNlKScsCgknTWVudSBiYXInIDogJycsCgknVG9vbGJhcicgOiAn2YLYp9im2YXYqSDYp9mE2KPYr9mI2KfYqicsCgknU2Nyb2xsYmFycycgOiAnJywKCSdTdGF0dXMgYmFyJyA6ICcnLAoJJ1Jlc2l6YWJsZScgOiAn2YXYqti62YrYsSDYp9mE2K3YrNmFJywKCSdEZXBlZGVudCcgOiAnJywKCSdBZGQgcmV0dXJuIGZhbHNlJyA6ICcnLAoJJ1RhcmdldCBNSU1FIHR5cGUnIDogJ01JTUUgdHlwZScsCgknUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJyA6ICcnLAoJJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KScgOiAnJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAn2LLYsSDYp9iu2KrYtdin2LEnLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICfYp9mE2K3YrNmFJywKCSdQcmV2aWV3JyA6ICfZhdi52KfZitmG2KknLAoJJ01hcmdpbnMnIDogJycsCgknQWx0IHRleHQnIDogJ9mG2LUg2KjYr9mK2YQnLAoJJ0ltYWdlIFVSTCcgOiAn2LHYp9io2Lcg2LXZiNix2KknLAoJLy8gdGFibGUKCSdTcGFjaW5nJyAgICAgICA6ICfZhdiz2KfZgdin2KogKHNwYWNpbmcpJywKCSdQYWRkaW5nJyAgICAgICA6ICfYp9mE2YfYp9mF2LQgKHBhZGRpbmcpJywKCSdTcGFjaW5nJyAgICAgICA6ICcnLAoJJ1BhZGRpbmcnICAgICAgIDogJycsCgknUm93cycgICAgICAgICAgOiAn2KfZhNi12YHZiNmBJywKCSdDb2x1bW5zJyAgICAgICA6ICfYp9mE2KPYudmF2K/YqScsCgknR3JvdXBzJyAgICAgICAgOiAn2KfZhNmF2KzZhdmI2LnYp9iqJywKCSdDZWxscycgICAgICAgICA6ICfYrtmE2KfZitinJywKCSdDYXB0aW9uJyAgICAgICA6ICfYp9mE2LnZhtmI2KfZhicsCgknSW5uZXIgYm9yZGVycycgOiAn2K3Yr9mI2K8g2K/Yp9iu2YTZitipJwp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.cs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogQ3plY2ggdHJhbnNsYXRpb24KICogQGF1dGhvciBNaWNoYWwgTWFyZWsgPG1pY2gubWFyZWtAZ21haWwuY29tPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE5CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuY3MgPSB7CgknRWRpdG9yJyA6ICdFZGl0b3InLAoJJ1NvdXJjZScgOiAnS8OzZCcsCgkvLyBQYW5lbCBOYW1lCgknQ29weS9QYXNlJyAgICAgIDogJ0tvcMOtcm92YXQvVmxvxb5pdCcsCgknVW5kby9SZWRvJyAgICAgIDogJ1pwxJt0L1pub3Z1JywKCSdUZXh0IHN0eWxlcycgICAgOiAnU3R5bHknLAoJJ0NvbG9ycycgICAgICAgICA6ICdCYXJ2eScsCgknQWxpZ25tZW50JyAgICAgIDogJ1phcm92bsOhbsOtJywKCSdJbmRlbnQvT3V0ZGVudCcgOiAnT2RzYWRpdCAvIFDFmWVkc2FkaXQnLAoJJ1RleHQgZm9ybWF0JyAgICA6ICdGb3Jtw6F0JywKCSdMaXN0cycgICAgICAgICAgOiAnU2V6bmFteScsCgknTWlzYyBlbGVtZW50cycgIDogJ09zdGF0bsOtIGVsZW1lbnR5JywKCSdMaW5rcycgICAgICAgICAgOiAnT2RrYXp5JywKCSdJbWFnZXMnICAgICAgICAgOiAnT2Jyw6F6a3knLAoJJ01lZGlhJyAgICAgICAgICA6ICdNw6lkaWEnLAoJJ1RhYmxlcycgICAgICAgICA6ICdUYWJ1bGt5JywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAnU3Byw6F2Y2Ugc291Ym9yxa8gKGVsRmluZGVyKScsCgknZWxmaW5kZXInIDogJ1NwcsOhdmNlIHNvdWJvcsWvJywKCS8vIGJ1dHRvbiBuYW1lcwoJJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICdVbG/Fvml0JywKCSdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAnS29ww61yb3ZhdCcsCgknQ3V0JyAgICAgICAgICAgICAgICAgICAgIDogJ1Z5am1vdXQnLAoJJ1Bhc3RlJyAgICAgICAgICAgICAgICAgICA6ICdWbG/Fvml0JywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAnVmxvxb5pdCBwb3V6ZSB0ZXh0JywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAnVmxvxb5pdCBmb3Jtw6F0b3ZhbsO9IHRleHQnLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICdWecSNaXN0aXQnLCAKCSdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAnWnDEm3QnLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICdabm92dScsCgknQm9sZCcgICAgICAgICAgICAgICAgICAgIDogJ1R1xI1uw6knLAoJJ0l0YWxpYycgICAgICAgICAgICAgICAgICA6ICdLdXJ6w612YScsCgknVW5kZXJsaW5lJyAgICAgICAgICAgICAgIDogJ1BvZHRyxb5lbsOpJywKCSdTdHJpa2V0aHJvdWdoJyAgICAgICAgICAgOiAnxaBrcnRudXTDqScsCgknU3VwZXJzY3JpcHQnICAgICAgICAgICAgIDogJ0hvcm7DrSBpbmRleCcsCgknU3Vic2NyaXB0JyAgICAgICAgICAgICAgIDogJ0RvbG7DrSBpbmRleCcsCgknQWxpZ24gbGVmdCcgICAgICAgICAgICAgIDogJ1phcm92bmF0IHZsZXZvJywKCSdBaWxnbiByaWdodCcgICAgICAgICAgICAgOiAnWmFyb3ZuYSB2cHJhdm8nLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICdaYXJvdm5hdCBuYSBzdMWZZWQnLAoJJ0FsaWduIGZ1bGwnICAgICAgICAgICAgICA6ICdEbyBibG9rdScsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ0JhcnZhIHDDrXNtYScsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ0JhcnZhIHBvemFkw60nLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICdPZHNhZGl0JywgCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ1DFmWVkc2FkaXQnLCAKCSdGb3JtYXQnICAgICAgICAgICAgICAgICAgOiAnRm9ybcOhdCcsCgknRm9udCBzaXplJyAgICAgICAgICAgICAgIDogJ1ZlbGlrb3N0JywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAnUMOtc21vJywKCSdPcmRlcmVkIGxpc3QnICAgICAgICAgICAgOiAnxIzDrXNsb3ZhbsO9IHNlem5hbScsCgknVW5vcmRlcmVkIGxpc3QnICAgICAgICAgIDogJ1Nlem5hbScsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ1ZvZG9yb3Zuw6EgxI3DoXJhJywKCSdCbG9ja3F1b3RlJyAgICAgICAgICAgICAgOiAnQ2l0w6F0JywKCSdCbG9jayBlbGVtZW50IChESVYpJyAgICAgOiAnRElWIGVsZW1lbnQnLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICdPZGtheicsCgknRGVsZXRlIGxpbmsnICAgICAgICAgICAgIDogJ09kc3RyYW5pdCBvZGtheicsCgknQm9va21hcmsnICAgICAgICAgICAgICAgIDogJ1rDoWxvxb5rYScsCgknSW1hZ2UnICAgICAgICAgICAgICAgICAgIDogJ09icsOhemVrJywKCSdUYWJsZScgICAgICAgICAgICAgICAgICAgOiAnVGFidWxrYScsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ1NtYXphdCB0YWJ1bGt1JywKCSdJbnNlcnQgcm93IGJlZm9yZScgICAgICAgOiAnVmxvxb5pdCDFmcOhZGVrIG5hZCcsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ1Zsb8W+aXQgxZnDoWRlayBwb2QnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICdTbWF6YXQgxZnDoWRlaycsCgknSW5zZXJ0IGNvbHVtbiBiZWZvcmUnICAgIDogJ1Zsb8W+aXQgc2xvdXBlYyBwxZllZCcsCgknSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ1Zsb8W+aXQgc2xvdXBlYyB6YScsCgknRGVsZXRlIGNvbHVtbicgICAgICAgICAgIDogJ1NtYXphdCBzbG91cGVjJywKCSdNZXJnZSB0YWJsZSBjZWxscycgICAgICAgOiAnU2xvdcSNaXQgYnXFiGt5JywKCSdTcGxpdCB0YWJsZSBjZWxsJyAgICAgICAgOiAnUm96ZMSbbGl0IGJ1xYhrdScsCgknVG9nZ2xlIGRpc3BsYXkgZG9jdW1lbnQgc3RydWN0dXJlJyA6ICdab2JyYXppdCBzdHJ1a3R1cnUnLAoJJ1RhYmxlIGNlbGwgcHJvcGVydGllcycgICA6ICdWbGFzdG5vc3RpIGJ1xYhreScsCgknVGFibGUgcHJvcGVydGllcycgICAgICAgIDogJ1ZsYXN0bm9zdGkgdGFidWxreScsCgknVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUnIDogJ0Z1bGxzY3JlZW4nLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICdPdGV2xZnDrXQgc3Byw6F2Y2Ugc291Ym9yxa8nLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICdOZWTEm2xpdGVsbsOhIG1lemVyYScsCgknU3RvcCBlbGVtZW50IGZsb2F0aW5nJyAgIDogJ1pydcWhaXQgb2J0w6lrw6Fuw60gZWxlbWVudHUnLAoJLy8gZGlhbG9ncwoJJ1dhcm5pbmcnIDogJ1Bvem9yJywKCSdQcm9wZXJpZXMnIDogJ1ZsYXN0bm9zdGknLAoJJ1BvcHVwJyA6ICdQb3AtdXAnLAoJJ0FkdmFuY2VkJyA6ICdWw61jZScsCgknRXZlbnRzJyA6ICdVZMOhbG9zdGknLAoJJ1dpZHRoJyA6ICfFoMOtxZlrYScsCgknSGVpZ2h0JyA6ICdWw73FoWthJywKCSdMZWZ0JyAgIDogJ1ZsZXZvJywKCSdDZW50ZXInIDogJ05hIHN0xZllZCcsCgknUmlnaHQnICA6ICdWcHJhdm8nLAoJJ0JvcmRlcicgOiAnUsOhbWXEjWVrJywKCSdCYWNrZ3JvdW5kJyA6ICdQb3phZMOtJywKCSdDc3MgY2xhc3MnIDogJ0NTUyB0xZnDrWRhJywKCSdDc3Mgc3R5bGUnIDogJ0NTUyBzdHlsJywKCSdObycgOiAnTmUnLAoJJ1RpdGxlJyA6ICdUaXR1bGVrJywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICdQcmF2aWRsYSBzY3JpcHR1JywKCSdMYW5ndWFnZScgOiAnSmF6eWsnLAoJJ0NoYXJzZXQnIDogJ1puYWtvdsOhIHNhZGEnLAoJJ05vdCBzZXQnIDogJ05lbmFzdGF2ZW5vJywKCSdMZWZ0IHRvIHJpZ2h0JyA6ICdabGV2YSBkb3ByYXZhJywKCSdSaWdodCB0byBsZWZ0JyA6ICdacHJhdmEgZG9sZXZhJywKCSdJbiB0aGlzIHdpbmRvdycgOiAnViB0b210byBva27EmyAoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICdWIG5vdsOpbSBva27EmyAoX2JsYW5rKScsCgknSW4gbmV3IHBhcmVudCB3aW5kb3cgKF9wYXJlbnQpJyA6ICdWIG5vdsOpbSByb2RpxI1vdnNrw6ltIG9rbsSbIChfcGFyZW50KScsCgknSW4gdG9wIGZyYW1lIChfdG9wKScgOiAnViBobGF2bsOtbSBva27EmyAoX3RvcCknLAoJJ1VSTCcgOiAnVVJMJywKCSdPcGVuIGluJyA6ICdPdGV2xZnDrXQgdicsCgkvLyBjb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuJyA6ICdUYXRvIG9wZXJhY2UgamUgdmUgdmHFoWVtIHByb2hsw63FvmXEjWkgdnlwbnV0w6Ega3bFr2xpIGJlenBlxI1ub3N0aS4gUG91xb5panRlIGtsw6F2ZXNvdm91IHprcmF0a3UuJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ05hZHBpcyAxJywKCSdIZWFkaW5nIDInIDogJ05hZHBpcyAyJywKCSdIZWFkaW5nIDMnIDogJ05hZHBpcyAzJywKCSdIZWFkaW5nIDQnIDogJ05hZHBpcyA0JywKCSdIZWFkaW5nIDUnIDogJ05hZHBpcyA1JywKCSdIZWFkaW5nIDYnIDogJ05hZHBpcyA2JywJCgknUGFyYWdyYXBoJyA6ICdPZHN0YXZlYycsCgknQWRkcmVzcycgOiAnQWRyZXNhJywKCSdQcmVmb3JtYXR0ZWQnIDogJ1DFmWVkZm9ybcOhdG92w6FubycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICdNYWzDqSAoOCBwdCknLAoJJ1NtYWxsICgxMHB4KScgIDogJ01hbMOpICgxMCBwdCknLAoJJ1NtYWxsICgxMnB0KScgIDogJ01hbMOpICgxMiBwdCknLAoJJ05vcm1hbCAoMTRwdCknIDogJ05vcm3DoWxuw60gKDE0IHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAnVmVsa8OpICgxOCBwdCknLAoJJ0xhcmdlICgyNHB0KScgIDogJ1ZlbGvDqSAoMjQgcHQpJywKCSdMYXJnZSAoMzZwdCknICA6ICdWZWxrw6kgKDM2IHB0KScsCQkJCQoJLy8gYm9va21hcmsKCSdCb29rbWFyayBuYW1lJyA6ICdKbcOpbm8gesOhbG/Fvmt5JywKCS8vIGxpbmsKCSdMaW5rIFVSTCcgOiAnVVJMJywKCSdUYXJnZXQnIDogJ0PDrWwnLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ090ZXbDrXJhdCBvZGtheiB2IHBvcHVwIG9rbsSbLicsCgknVVJMJyA6ICdVUkwnLAoJJ1dpbmRvdyBuYW1lJyA6ICdKbcOpbm8gb2tuYScsCgknV2luZG93IHNpemUnIDogJ1ZlbGlrb3N0IG9rbmEnLAoJJ1dpbmRvdyBwb3NpdGlvbicgOiAnUG96aWNlIG9rbmEnLAoJJ0xvY2F0aW9uIGJhcicgOiAnQWRyZXNuw60gxZnDoWRlaycsCgknTWVudSBiYXInIDogJ01lbnUgbmFiw61kZWsnLAoJJ1Rvb2xiYXInIDogJ0xpxaF0YSBuw6FzdHJvasWvJywKCSdTY3JvbGxiYXJzJyA6ICdQb3N1dm7DrWt5JywKCSdTdGF0dXMgYmFyJyA6ICdTdGF2b3bDvSDFmcOhZGVrJywKCSdSZXNpemFibGUnIDogJ1ptxJtuYSB2ZWxpa29zdGknLAoJJ0RlcGVkZW50JyA6ICcnLAoJJ0FkZCByZXR1cm4gZmFsc2UnIDogJ1DFmWlkYXQgcmV0dXJuIGZhbHNlJywKCSdUYXJnZXQgTUlNRSB0eXBlJyA6ICdDw61sb3bDvSBNSU1FIHR5cCcsCgknUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJyA6ICcnLAoJJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KScgOiAnJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAnJywKCS8vIGltYWdlCgknU2l6ZScgOiAnVmVsaWtvc3QnLAoJJ1ByZXZpZXcnIDogJ07DoWhsZWQnLAoJJ01hcmdpbnMnIDogJ09rcmFqZScsCgknQWx0IHRleHQnIDogJ0FsdGVybmF0aXZuw60gdGV4dCcsCgknSW1hZ2UgVVJMJyA6ICdVUkwnLAoJLy8gdGFibGUKCSdTcGFjaW5nJyAgICAgICA6ICdWbsSbasWhw60gb2tyYWplJywKCSdQYWRkaW5nJyAgICAgICA6ICdWbml0xZluw60gb2tyYWplJywKCSdSb3dzJyAgICAgICAgICA6ICfFmMOhZGt5JywKCSdDb2x1bW5zJyAgICAgICA6ICdTbG91cGNlJywKCSdHcm91cHMnICAgICAgICA6ICdTa3VwaW55JywKCSdDZWxscycgICAgICAgICA6ICdCdcWIa3knLAoJJ0NhcHRpb24nICAgICAgIDogJ1BvcGlzZWsnLAoJJ0lubmVyIGJvcmRlcnMnIDogJ1ZuaXTFmW7DrSByw6FtZcSNa3knCgkKCQp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.de.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogR2VybWFuIHRyYW5zbGF0aW9uCiAqIEBhdXRob3IgVmFzaWxpeSBSYXp1bW55aCA8cnZuQHN0ZDQyLnJ1PgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuZGUgPSB7CgknRWRpdG9yJyA6ICdFZGl0b3InLAoJJ1NvdXJjZScgOiAnUXVlbGxjb2RlJywKCS8vIFBhbmVsIE5hbWUKCSdDb3B5L1Bhc2UnICAgICAgOiAnS29waWVyZW4vRWluZsO8Z2VuJywKCSdVbmRvL1JlZG8nICAgICAgOiAnUsO8Y2tnw6RuZ2lnL1dpZWRlcmhlcnN0ZWxsZW4nLAoJJ1RleHQgc3R5bGVzJyAgICA6ICdUZXh0c3RpbGUnLAoJJ0NvbG9ycycgICAgICAgICA6ICdGYXJiZScsCgknQWxpZ25tZW50JyAgICAgIDogJ0FsaWdubWVudCcsCgknSW5kZW50L091dGRlbnQnIDogJ0VpbnLDvGNrZW4gLyBBdXNyw7xja2VuJywKCSdUZXh0IGZvcm1hdCcgICAgOiAnRm9ybWF0JywKCSdMaXN0cycgICAgICAgICAgOiAnTGlzdGVuJywKCSdNaXNjIGVsZW1lbnRzJyAgOiAnU29uc3RpZ2UgZWxlbWVudGUnLAoJJ0xpbmtzJyAgICAgICAgICA6ICdMaW5rJywKCSdJbWFnZXMnICAgICAgICAgOiAnQmlsZCcsCgknTWVkaWEnICAgICAgICAgIDogJ01lZGlhIGRhdGVpJywKCSdUYWJsZXMnICAgICAgICAgOiAnVGFiZWxsZScsCgknRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknIDogJ0RhdGVpLU1hbmFnZXIgKGVsRmluZGVyKScsCgkvLyBidXR0b24gbmFtZXMKCSdTYXZlJyAgICAgICAgICAgICAgICAgICAgOiAnU3BlaWNoZXJuJywKCSdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAnQXVzc2NobmVpZGVuJywKCSdDdXQnICAgICAgICAgICAgICAgICAgICAgOiAnS29waWVyZW4nLAoJJ1Bhc3RlJyAgICAgICAgICAgICAgICAgICA6ICdFaW5mw7xnZW4nLAoJJ1Bhc3RlIG9ubHkgdGV4dCcgICAgICAgICA6ICdGw7xnZW4gc2llIG51ciB0ZXh0JywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAnRsO8Z2VuIHNpZSBmb3JtYXRpZXJ0ZW4gdGV4dCcsCgknQ2xlYW4gZm9ybWF0JyAgICAgICAgICAgIDogJ0Zvcm1hdGllcnVuZ2VuIGVudGZlcm5lbicsIAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICdSw7xja2fDpG5naWcnLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICdXaWVkZXJoZXJzdGVsbGVuJywKCSdCb2xkJyAgICAgICAgICAgICAgICAgICAgOiAnRmV0dCcsCgknSXRhbGljJyAgICAgICAgICAgICAgICAgIDogJ0t1cnNpdicsCgknVW5kZXJsaW5lJyAgICAgICAgICAgICAgIDogJ1VudGVyc3RyaWNoZW4nLAoJJ1N0cmlrZXRocm91Z2gnICAgICAgICAgICA6ICdEdXJjaGdlc3RyaWNoZW4nLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICdIb2NoZ2VzdGVsbHQnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICdUaWVmZ2VzdGVsbHQnLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICdMaW5rc2LDvG5kaWcnLAoJJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICdSZWNodHNiw7xuZGlnJywKCSdBbGlnbiBjZW50ZXInICAgICAgICAgICAgOiAnWmVudHJpZXJ0JywKCSdBbGlnbiBmdWxsJyAgICAgICAgICAgICAgOiAnQmxvY2tzYXR6JywKCSdGb250IGNvbG9yJyAgICAgICAgICAgICAgOiAnVGV4dGZhcmJlJywKCSdCYWNrZ3JvdW5kIGNvbG9yJyAgICAgICAgOiAnSGludGVyZ3J1bmRmYXJiZScsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ0Vpbnp1ZyBlcmjDtmhlbicsIAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICdFaW56dWcgdmVycmluZ2VybicsIAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICdGb3JtYXQnLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICdHcsO2w59lJywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAnU2NocmlmdGFydCcsCgknT3JkZXJlZCBsaXN0JyAgICAgICAgICAgIDogJ051bW1lcmllcnRlIExpc3RlJywKCSdVbm9yZGVyZWQgbGlzdCcgICAgICAgICAgOiAnTGlzdGUnLAoJJ0hvcml6b250YWwgcnVsZScgICAgICAgICA6ICdIb3Jpem9udGFsZSBMaW5pZScsCgknQmxvY2txdW90ZScgICAgICAgICAgICAgIDogJ1ppdGF0YmxvY2snLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICdCbG9jay1FbGVtZW50IChESVYpJywKCSdMaW5rJyAgICAgICAgICAgICAgICAgICAgOiAnTGluaycsCgknRGVsZXRlIGxpbmsnICAgICAgICAgICAgIDogJ0xpbmsgZW50ZmVybmVuJywKCSdCb29rbWFyaycgICAgICAgICAgICAgICAgOiAnQW5rZXIgZWluZsO8Z2VuL2VkaXRpZXJlbicsCgknSW1hZ2UnICAgICAgICAgICAgICAgICAgIDogJ0JpbGQnLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICdUYWJlbGxlJywKCSdEZWxldGUgdGFibGUnICAgICAgICAgICAgOiAnVGFiZWxsZSBsw7ZzY2hlbicsCgknSW5zZXJ0IHJvdyBiZWZvcmUnICAgICAgIDogJ1plaWxlIG9iZXJoYWxiIGVpbmbDvGdlbicsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ1plaWxlIHVudGVyaGFsYiBlaW5mw7xnZW4nLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICdaZWlsZSBlbnRmZXJuZW4nLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICdTcGFsdGUgbGlua3MgZGF2b3IgZWluZsO8Z2VuJywKCSdJbnNlcnQgY29sdW1uIGFmdGVyJyAgICAgOiAnU3BhbHRlIHJlY2h0cyBkYW5hY2ggZWluZsO8Z2VuJywKCSdEZWxldGUgY29sdW1uJyAgICAgICAgICAgOiAnU3BhbHRlIGzDtnNjaGVuJywKCSdNZXJnZSB0YWJsZSBjZWxscycgICAgICAgOiAnWmVsbGVuIHZlcmJpbmRlbicsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ1plbGxlIHRlaWxlbicsCgknVG9nZ2xlIGRpc3BsYXkgZG9jdW1lbnQgc3RydWN0dXJlJyA6ICdCbMO2Y2tlIGFuemVpZ2VuJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAnWmVsbGVuLUVpZ2Vuc2NoYWZ0ZW4nLAoJJ1RhYmxlIHByb3BlcnRpZXMnICAgICAgICA6ICdUYWJlbGxlbi1FaWdlbnNjaGFmdGVuJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAnRWRpdG9yIG1heGltaWVyZW4nLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICdTZXJ2ZXInLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICdOb24tYnJlYWtpbmcgc3BhY2UnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgICA6ICdEZWFrdGl2aWVyZW4gU2llIGZsb3ctRWxlbWVudCBUZXh0JywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICdBQ0hUVU5HJywKCSdQcm9wZXJpZXMnIDogJ1Byb3BlcmllcycsCgknUG9wdXAnIDogJ1BvcC11cCcsCgknQWR2YW5jZWQnIDogJ21laHInLAoJJ0V2ZW50cycgOiAnVmVyYW5zdGFsdHVuZ2VuJywKCSdXaWR0aCcgOiAnQnJlaXRlJywKCSdIZWlnaHQnIDogJ0jDtmhlJywKCSdMZWZ0JyAgIDogJ0xpbmtzJywKCSdDZW50ZXInIDogJ1plbnRydW0nLAoJJ1JpZ2h0JyAgOiAnUmVjaHRzJywKCSdCb3JkZXInIDogJ1JhaG1lbicsCgknQmFja2dyb3VuZCcgOiAnSGludGVyZ3J1bmRmYXJiZScsCgknQ3NzIGNsYXNzJyA6ICdDc3MgY2xhc3MnLAoJJ0NzcyBzdHlsZScgOiAnQ3NzIHN0eWxlJywKCSdObycgOiAnTmVpbicsCgknVGl0bGUnIDogJ1RpdGVsJywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICdSaWNodHVuZyBTY2hyZWliZW4nLAoJJ0xhbmd1YWdlJyA6ICdTcHJhY2hlJywKCSdDaGFyc2V0JyA6ICdDaGFyc2V0JywKCSdOb3Qgc2V0JyA6ICduaWNodCcsCgknTGVmdCB0byByaWdodCcgOiAnTGlua3MgbmFjaCBSZWNodHMnLAoJJ1JpZ2h0IHRvIGxlZnQnIDogJ1JlY2h0cyBuYWNoIExpbmtzJywKCSdJbiB0aGlzIHdpbmRvdycgOiAnR2xlaWNoZXMgRmVuc3RlciAoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICdOZXVlcyBGZW5zdGVyIChfYmxhbmspJywKCSdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknIDogJ09iZXJlcyBGZW5zdGVyIChfcGFyZW50KScsCgknSW4gdG9wIGZyYW1lIChfdG9wKScgOiAnT2JlcnN0ZXMgRmVuc3RlciAoX3RvcCknLAoJJ1VSTCcgOiAnJywKCSdPcGVuIGluJyA6ICcnLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAnRGllc2VyIFZvcmdhbmcgaXN0IGluIElocmVtIEJyb3dzZXIgYXVzIFNpY2hlcmhlaXRzZ3LDvG5kZW4gZGVha3RpdmllcnQuIFRhc3RlbmtvbWJpbmF0aW9uIHN0YXR0LicsCgkvLyBmb3JtYXQgCgknSGVhZGluZyAxJyA6ICfDnGJlcnNjaHJpZnQgMScsCgknSGVhZGluZyAyJyA6ICfDnGJlcnNjaHJpZnQgMicsCgknSGVhZGluZyAzJyA6ICfDnGJlcnNjaHJpZnQgMycsCgknSGVhZGluZyA0JyA6ICfDnGJlcnNjaHJpZnQgNCcsCgknSGVhZGluZyA1JyA6ICfDnGJlcnNjaHJpZnQgNScsCgknSGVhZGluZyA2JyA6ICfDnGJlcnNjaHJpZnQgNicsCQoJJ1BhcmFncmFwaCcgOiAnRm9ybWF0aWVydCcsCgknQWRkcmVzcycgOiAnQWRkcmVzc2UnLAoJJ1ByZWZvcm1hdHRlZCcgOiAnJywKCS8vIGZvbnQgc2l6ZQoJJ1NtYWxsICg4cHQpJyAgIDogJycsCgknU21hbGwgKDEwcHgpJyAgOiAnJywKCSdTbWFsbCAoMTJwdCknICA6ICcnLAoJJ05vcm1hbCAoMTRwdCknIDogJycsCgknTGFyZ2UgKDE4cHQpJyAgOiAnJywKCSdMYXJnZSAoMjRwdCknICA6ICcnLAoJJ0xhcmdlICgzNnB0KScgIDogJycsCQkJCQoJLy8gYm9va21hcmsKCSdCb29rbWFyayBuYW1lJyA6ICdBbmtlciBOYW1lJywKCS8vIGxpbmsKCSdMaW5rIFVSTCcgOiAnKFVSTCknLAoJJ1RhcmdldCcgOiAnWmllbHNlaXRlJywKCSdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JyA6ICdMaW5rIGluIGVpbmVtIFBvcHVwLUZlbnN0ZXInLAoJJ1VSTCcgOiAnJywKCSdXaW5kb3cgbmFtZScgOiAnUG9wLXVwIEZlbnN0ZXItTmFtZScsCgknV2luZG93IHNpemUnIDogJ0dyw7bDn2UnLAoJJ1dpbmRvdyBwb3NpdGlvbicgOiAnUG9zaXRpb24nLAoJJ0xvY2F0aW9uIGJhcicgOiAnQWRyZXNzLUxlaXN0ZScsCgknTWVudSBiYXInIDogJ01lbsO8LUxlaXN0ZScsCgknVG9vbGJhcicgOiAnV2Vya3pldWdsZWlzdGUnLAoJJ1Njcm9sbGJhcnMnIDogJ1JvbGxiYWxrZW4nLAoJJ1N0YXR1cyBiYXInIDogJ1N0YXR1c2xlaXN0ZScsCgknUmVzaXphYmxlJyA6ICdWZXJncsO2w59lcmJhcicsCgknRGVwZWRlbnQnIDogJ0FiaMOkbmdpZyAoTmV0c2NhcGUpJywKCSdBZGQgcmV0dXJuIGZhbHNlJyA6ICdhZGQgKHJldHVybiBmYWxzZSknLAoJJ1RhcmdldCBNSU1FIHR5cGUnIDogJ01JTUUgdHlwZScsCgknUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJyA6ICcnLAoJJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KScgOiAnJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAnWnVncmlmZnN0YXN0ZScsCgkvLyBpbWFnZQoJJ1NpemUnIDogJ0dyw7bDn2UnLAoJJ1ByZXZpZXcnIDogJ1ZvcnNjaGF1JywKCSdNYXJnaW5zJyA6ICcnLAoJJ0FsdCB0ZXh0JyA6ICdBbHQnLAoJJ0ltYWdlIFVSTCcgOiAnVVJMJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAnQWJzdGFuZCAoc3BhY2luZyknLAoJJ1BhZGRpbmcnICAgICAgIDogJ0Fic3RhbmQgKHBhZGRpbmcpJywKCSdSb3dzJyAgICAgICAgICA6ICdaZWlsZScsCgknQ29sdW1ucycgICAgICAgOiAnU3BhbHRlJywKCSdHcm91cHMnICAgICAgICA6ICdHcnVwcGVuJywKCSdDZWxscycgICAgICAgICA6ICdaZWxsZW4nLAoJJ0NhcHRpb24nICAgICAgIDogJ1RhYmVsbGVuLUVpZ2Vuc2NoYWZ0ZW4nLAoJJ0lubmVyIGJvcmRlcnMnIDogJ0lubmVyZSBHcmVuemVuJwoJCgkKfQp9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.es.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFNwYW5pc2ggdHJhbnNsYXRpb24KICogQGF1dGhvciBSaWNhcmRvIE9icmVnw7NuIDxyb2JyZWdvbm1AZ21haWwuY29tPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuZXMgPSB7CgknRWRpdG9yJyA6ICdFZGl0b3InLAoJJ1NvdXJjZScgOiAnQ8OzZGlnbyBGdWVudGUnLAoJLy8gUGFuZWwgTmFtZQoJJ0NvcHkvUGFzZScgICAgICA6ICdDb3BpYXIvUGVnYXInLAoJJ1VuZG8vUmVkbycgICAgICA6ICdEZXNoYWNlci9SZWhhY2VyJywKCSdUZXh0IHN0eWxlcycgICAgOiAnRXN0aWxvcyBkZSBUZXh0bycsCgknQ29sb3JzJyAgICAgICAgIDogJ0NvbG9yZXMnLAoJJ0FsaWdubWVudCcgICAgICA6ICdBbGluZWFjacOzbicsCgknSW5kZW50L091dGRlbnQnIDogJ0F1bWVudGFyL0Rpc21pbnVpciBTYW5ncsOtYScsCgknVGV4dCBmb3JtYXQnICAgIDogJ0Zvcm1hdG8gZGUgdGV4dG8nLAoJJ0xpc3RzJyAgICAgICAgICA6ICdMaXN0YXMnLAoJJ01pc2MgZWxlbWVudHMnICA6ICdFbGVtZW50b3MgdmFyaW9zJywKCSdMaW5rcycgICAgICAgICAgOiAnVsOtbmN1bG9zJywKCSdJbWFnZXMnICAgICAgICAgOiAnSW3DoWdlbmVzJywKCSdNZWRpYScgICAgICAgICAgOiAnTXVsdGltZWRpYScsCgknVGFibGVzJyAgICAgICAgIDogJ1RhYmxhcycsCgknRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknIDogJ0FkbWluaXN0cmFkb3IgZGUgYXJjaGl2b3MnLAoJLy8gYnV0dG9uIG5hbWVzCgknU2F2ZScgICAgICAgICAgICAgICAgICAgIDogJ0d1YXJkYXInLAoJJ0NvcHknICAgICAgICAgICAgICAgICAgICA6ICdDb3BpYXInLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICdDb3J0YXInLAoJJ1Bhc3RlJyAgICAgICAgICAgICAgICAgICA6ICdQZWdhcicsCgknUGFzdGUgb25seSB0ZXh0JyAgICAgICAgIDogJ1BlZ2FyIHNvbG8gdGV4dG8nLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICdQZWdhciB0ZXh0byBmb3JtYXRlYWRvJywKCSdDbGVhbiBmb3JtYXQnICAgICAgICAgICAgOiAnTGltcGlhciBmb3JtYXRvJywKCSdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAnRGVzaGFjZXIgbGEgw7psdGltYSBhY2Npw7NuJywKCSdSZWRvIHByZXZpb3VzIGFjdGlvbicgICAgOiAnUmVoYWNlciBsYSDDumx0aW1hIGFjY2nDs24nLAoJJ0JvbGQnICAgICAgICAgICAgICAgICAgICA6ICdOZWdyaXRhJywKCSdJdGFsaWMnICAgICAgICAgICAgICAgICAgOiAnQ3Vyc2l2YScsCgknVW5kZXJsaW5lJyAgICAgICAgICAgICAgIDogJ1N1YnJheWFkbycsCgknU3RyaWtldGhyb3VnaCcgICAgICAgICAgIDogJ1RhY2hhZG8nLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICdTdXBlcsOtbmRpY2UnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICdTdWLDrW5kaWNlJywKCSdBbGlnbiBsZWZ0JyAgICAgICAgICAgICAgOiAnQWxpbmVhciBhIGxhIGl6cXVpZXJkYScsCgknQWlsZ24gcmlnaHQnICAgICAgICAgICAgIDogJ0FsaW5lYXIgYSBsYSBkZXJlY2hhJywKCSdBbGlnbiBjZW50ZXInICAgICAgICAgICAgOiAnQ2VudHJhcicsCgknQWxpZ24gZnVsbCcgICAgICAgICAgICAgIDogJ0p1c3RpZmljYWRvJywKCSdGb250IGNvbG9yJyAgICAgICAgICAgICAgOiAnQ29sb3IgZGUgdGV4dG8nLAoJJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICdDb2xvciBkZSBmb25kbycsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ0F1bWVudGFyIHNhbmdyw61hJywKCSdPdXRkZW50JyAgICAgICAgICAgICAgICAgOiAnUmVkdWNpciBzYW5ncsOtYScsCgknRm9ybWF0JyAgICAgICAgICAgICAgICAgIDogJ0Zvcm1hdG8nLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICdUYW1hw7FvIGRlIGxldHJhJywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAnRnVlbnRlJywKCSdPcmRlcmVkIGxpc3QnICAgICAgICAgICAgOiAnTGlzdGEgb3JkZW5hZGEnLAoJJ1Vub3JkZXJlZCBsaXN0JyAgICAgICAgICA6ICdMaXN0YSBkZXNvcmRlbmFkYScsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ0zDrW5lYSBob3Jpem9udGFsJywKCSdCbG9ja3F1b3RlJyAgICAgICAgICAgICAgOiAnQ2l0YScsCgknQmxvY2sgZWxlbWVudCAoRElWKScgICAgIDogJ0Jsb3F1ZSBkZSBFbGVtZW50b3MgKERJViknLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICdWw61uY3VsbycsCgknRGVsZXRlIGxpbmsnICAgICAgICAgICAgIDogJ0VsaW1pbmFyIHbDrW5jdWxvJywKCSdCb29rbWFyaycgICAgICAgICAgICAgICAgOiAnTWFyY2Fkb3InLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICdJbWFnZW4nLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICdUYWJsYScsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ0VsaW1pbmFyIHRhYmxhJywKCSdJbnNlcnQgcm93IGJlZm9yZScgICAgICAgOiAnSW5zZXJ0YXIgZmlsYSBhbnRlcycsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ0luc2VydGFyIGZpbGEgZGVzcHXDqXMnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICdFbGltaW5hciBmaWxhJywKCSdJbnNlcnQgY29sdW1uIGJlZm9yZScgICAgOiAnSW5zZXJ0YXIgY29sdW1uYSBhbnRlcycsCgknSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ0luc2VydGFyIGNvbHVtbmEgZGVzcHXDqXMnLAoJJ0RlbGV0ZSBjb2x1bW4nICAgICAgICAgICA6ICdFbGltaW5hciBjb2x1bW5hJywKCSdNZXJnZSB0YWJsZSBjZWxscycgICAgICAgOiAnRnVuZGlyIGNlbGRhcycsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ0RpdmlkaXIgY2VsZGEnLAoJJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAnUGFudGFsbGEgZGUgZXN0cnVjdHVyYSBkZSBkb2N1bWVudG8nLAoJJ1RhYmxlIGNlbGwgcHJvcGVydGllcycgICA6ICdQcm9waWVkYWRlcyBkZSBjZWxkYScsCgknVGFibGUgcHJvcGVydGllcycgICAgICAgIDogJ1Byb3BpZWRhZGVzIGRlIHRhYmxhJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAnTW9kbyBkZSBwYW50YWxsYSBjb21wbGV0YScsCgknT3BlbiBmaWxlIG1hbmFnZXInICAgICAgIDogJ0FicmlyIGFkbWluaXN0cmFkb3IgZGUgYXJjaGl2b3MnLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICdFc3BhY2lvIGluZGl2aXNpYmxlJywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAnRGV0ZW5lciBlbGVtZW50byBmbG90YW50ZScsCgkvLyBkaWFsb2dzCgknV2FybmluZycgOiAnQWR2ZXJ0ZW5jaWEnLAoJJ1Byb3BlcmllcycgOiAnUHJvcGllZGFkZXMnLAoJJ1BvcHVwJyA6ICdWZW50YW5hIGVtZXJnZW50ZScsCgknQWR2YW5jZWQnIDogJ0F2YW56YWRvJywKCSdFdmVudHMnIDogJ0V2ZW50b3MnLAoJJ1dpZHRoJyA6ICdBbmNobycsCgknSGVpZ2h0JyA6ICdBbHRvJywKCSdMZWZ0JyAgIDogJ0l6cXVpZXJkYScsCgknQ2VudGVyJyA6ICdDZW50cmFkbycsCgknUmlnaHQnICA6ICdEZXJlY2hhJywKCSdCb3JkZXInIDogJ0JvcmRlJywKCSdCYWNrZ3JvdW5kJyA6ICdGb25kbycsCgknQ3NzIGNsYXNzJyA6ICdDbGFzZSBDU1MnLAoJJ0NzcyBzdHlsZScgOiAnRXN0aWxvIENTUycsCgknTm8nIDogJ05vJywKCSdUaXRsZScgOiAnVMOtdHVsbycsCgknU2NyaXB0IGRpcmVjdGlvbicgOiAnRGlyZWNjacOzbiBkZWwgc2NyaXB0JywKCSdMYW5ndWFnZScgOiAnSWRpb21hJywKCSdDaGFyc2V0JyA6ICdDaGFyc2V0JywKCSdOb3Qgc2V0JyA6ICdObyBlc3RhYmxlY2lkbycsCgknTGVmdCB0byByaWdodCcgOiAnSXpxdWllcmRhIGEgZGVyZWNoYScsCgknUmlnaHQgdG8gbGVmdCcgOiAnRGVyZWNoYSBhIGl6cXVpZXJkYScsCgknSW4gdGhpcyB3aW5kb3cnIDogJ0VuIGVzdGEgdmVudGFuYSAoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICdFbiBudWV2YSB2ZW50YW5hIChfYmxhbmspJywKCSdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknIDogJ0VuIG51ZXZhIHZlbnRhbmEgcGFkcmUgKF9wYXJlbnQpJywKCSdJbiB0b3AgZnJhbWUgKF90b3ApJyA6ICdFbiBtYXJjbyBzdXBlcmlvciAoX3RvcCknLAoJJ1VSTCcgOiAnVVJMJywKCSdPcGVuIGluJyA6ICdBYnJpciBlbicsCgkvLyBjb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuJyA6ICdFc3RhIG9wZXJhY2nDs24gZXN0w6EgZGVzYWN0aXZhZGEgZW4gc3UgbmF2ZWdhZG9yIHBvciByYXpvbmVzIGRlIHNlZ3VyaWRhZC4gVXRpbGljZSBlbiBzdSBsdWdhciB1biBjb21hbmRvIGRlIHRlY2xhZG8uJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ0VuY2FiZXphZG8gMScsCgknSGVhZGluZyAyJyA6ICdFbmNhYmV6YWRvIDInLAoJJ0hlYWRpbmcgMycgOiAnRW5jYWJlemFkbyAzJywKCSdIZWFkaW5nIDQnIDogJ0VuY2FiZXphZG8gNCcsCgknSGVhZGluZyA1JyA6ICdFbmNhYmV6YWRvIDUnLAoJJ0hlYWRpbmcgNicgOiAnRW5jYWJlemFkbyA2JywKCSdQYXJhZ3JhcGgnIDogJ1DDoXJyYWZvJywKCSdBZGRyZXNzJyA6ICdEaXJlY2Npw7NuJywKCSdQcmVmb3JtYXR0ZWQnIDogJ1ByZWZvcm1hdGVhZG8nLAoJLy8gZm9udCBzaXplCgknU21hbGwgKDhwdCknICAgOiAnUGVxdWXDsW8gKDhwdCknLAoJJ1NtYWxsICgxMHB4KScgIDogJ1BlcXVlw7FvICgxMHB4KScsCgknU21hbGwgKDEycHQpJyAgOiAnUGVxdWXDsW8gKDEycHQpJywKCSdOb3JtYWwgKDE0cHQpJyA6ICdOb3JtYWwgKDE0cHQpJywKCSdMYXJnZSAoMThwdCknICA6ICdHcmFuZGUgKDE4cHQpJywKCSdMYXJnZSAoMjRwdCknICA6ICdHcmFuZGUgKDI0cHQpJywKCSdMYXJnZSAoMzZwdCknICA6ICdHcmFuZGUgKDM2cHQpJywKCS8vIGJvb2ttYXJrCgknQm9va21hcmsgbmFtZScgOiAnTm9tYnJlIGRlbCBtYXJjYWRvcicsCgkvLyBsaW5rCgknTGluayBVUkwnIDogJ1VSTCBkZWwgdsOtbmN1bG8nLAoJJ1RhcmdldCcgOiAnT2JqZXRpdm8nLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ0FicmlyIHbDrW5jdWxvIGVuIHZlbnRhbmEgZW1lcmdlbnRlJywKCSdXaW5kb3cgbmFtZScgOiAnTm9tYnJlIGRlIGxhIHZlbnRhbmEnLAoJJ1dpbmRvdyBzaXplJyA6ICdUYW1hw7FvIGRlIGxhIHZlbnRhbmEnLAoJJ1dpbmRvdyBwb3NpdGlvbicgOiAnUG9zaWNpw7NuIGRlIGxhIHZlbnRhbmEnLAoJJ0xvY2F0aW9uIGJhcicgOiAnQmFycmEgZGUgZGlyZWNjacOzbicsCgknTWVudSBiYXInIDogJ0JhcnJhIGRlIE1lbsO6JywKCSdUb29sYmFyJyA6ICdCYXJyYSBkZSBoZXJyYW1pZW50YXMnLAoJJ1Njcm9sbGJhcnMnIDogJ0JhcnJhcyBkZSBkZXNwbGF6YW1pZW50bycsCgknU3RhdHVzIGJhcicgOiAnQmFycmEgZGUgZXN0YWRvJywKCSdSZXNpemFibGUnIDogJ1JlZGltZW5zaW9uYWJsZScsCgknRGVwZWRlbnQnIDogJ0RlcGVuZGllbnRlIChOZXRzY2FwZSknLAoJJ0FkZCByZXR1cm4gZmFsc2UnIDogJ0FncmVnYXIgKHJldHVybiBmYWxzZSknLAoJJ1RhcmdldCBNSU1FIHR5cGUnIDogJ09iamV0aXZvIGRlIFRpcG8gTUlNRScsCgknUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJyA6ICcnLAoJJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KScgOiAnJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAnVGVjbGEgZGUgYWNjZXNvJywKCS8vIGltYWdlCgknU2l6ZScgOiAnVGFtYcOxbycsCgknUHJldmlldycgOiAnUHJldmlzdWFsaXphY2nDs24nLAoJJ01hcmdpbnMnIDogJ03DoXJnZW5lcycsCgknQWx0IHRleHQnIDogJ1RleHRvIGFsdGVybmF0aXZvJywKCSdJbWFnZSBVUkwnIDogJ1VSTCBkZSBsYSBpbWFnZW4nLAoJLy8gdGFibGUKCSdTcGFjaW5nJyAgICAgICA6ICdFc3BhY2lhZG8gKFNwYWNpbmcpJywKCSdQYWRkaW5nJyAgICAgICA6ICdSZWxsZW5vIChQYWRkaW5nKScsCgknUm93cycgICAgICAgICAgOiAnRmlsYXMnLAoJJ0NvbHVtbnMnICAgICAgIDogJ0NvbHVtbmFzJywKCSdHcm91cHMnICAgICAgICA6ICdHcnVwb3MnLAoJJ0NlbGxzJyAgICAgICAgIDogJ0NlbGRhcycsCgknQ2FwdGlvbicgICAgICAgOiAnTGV5ZW5kYScsCgknSW5uZXIgYm9yZGVycycgOiAnQm9yZGVzIGludGVybm9zJwoJCgkKfQp9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.fa.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFBlcnNpYW4gdHJhbnNsYXRpb24KICogQGF1dGhvciBTYWxlaCBzb296YW5jaGkgPGluZm9Ac29vemFuY2hpLmlyPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuZmEgPSB7CgknRWRpdG9yJyA6ICfZiNuM2LHYp9iz2KrYp9ixJywKCSdTb3VyY2UnIDogJ9qp2K8g2YXZhtio2LknLAoJLy8gUGFuZWwgTmFtZQoJJ0NvcHkvUGFzZScgICAgICA6ICfaqdm+24wg2K/YsSDYrdin2YHYuNmHINmF2YjZgdiqL9io2KfYstqv2LHYr9in2YbbjCDYp9iyINit2KfZgdi42YcnLAoJJ1VuZG8vUmVkbycgICAgICA6ICfYp9mG2KzYp9mFINi52YXZhCDYqNi52K8v2KjYsdqv2LTYqiDYqNmHINi52YXZhCDZgtio2YQnLAoJJ1RleHQgc3R5bGVzJyAgICA6ICfYp9iz2KrYp9uM2YQg2YXYqtmGJywKCSdDb2xvcnMnICAgICAgICAgOiAn2LHZhtqv2YfYpycsCgknQWxpZ25tZW50JyAgICAgIDogJ9i12YHYrdmHINio2YbYr9uMJywKCSdJbmRlbnQvT3V0ZGVudCcgOiAn2KrZiCDYsdmB2Krar9uMLyDYqNix2YjZhiDYsdmB2Krar9uMJywKCSdUZXh0IGZvcm1hdCcgICAgOiAn2YLYp9mE2Kgg2YXYqtmI2YYnLAoJJ0xpc3RzJyAgICAgICAgICA6ICfZhNuM2LPYqiDZh9inJywKCSdNaXNjIGVsZW1lbnRzJyAgOiAn2LnZhtin2LXYsSDZhdiq2YHYsdmC2YcnLAoJJ0xpbmtzJyAgICAgICAgICA6ICfZvtuM2YjZhtiv2YfYpycsCgknSW1hZ2VzJyAgICAgICAgIDogJ9iq2LXYp9mI24zYsScsCgknTWVkaWEnICAgICAgICAgIDogJ9mF2YjZhNiq24wg2YXYr9uM2KcnLAoJJ1RhYmxlcycgICAgICAgICA6ICfYrNiv2YjZhCDZh9inJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAnKGVsRmluZGVyKdmF2K/bjNix24zYqiDZgdin24zZhCcsCgkvLyBidXR0b24gbmFtZXMKCSdTYXZlJyAgICAgICAgICAgICAgICAgICAgOiAn2LDYrtuM2LHZhyDaqdix2K/ZhicsCgknQ29weScgICAgICAgICAgICAgICAgICAgIDogJ9qp2b7bjCDaqdix2K/ZhicsCgknQ3V0JyAgICAgICAgICAgICAgICAgICAgIDogJ9io2LHYtCDYr9in2K/ZhicsCgknUGFzdGUnICAgICAgICAgICAgICAgICAgIDogJ9io2KfYstqv2LHYr9in2YbbjCcsCgknUGFzdGUgb25seSB0ZXh0JyAgICAgICAgIDogJ9io2KfYstqv2LHYp9iv2YbbjCDZgdmC2Lcg2YXYqtmG2YfYpycsCgknUGFzdGUgZm9ybWF0dGVkIHRleHQnICAgIDogJ9io2KfYstqv2LHYr9in2YbbjCDZhdiq2YYg2YfYp9uMINiv2KfYsdin24wg2YLYp9mE2KgnLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICfYrdiw2YEg2YLYp9mE2Kgg2YfYpycsIAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICfYqNin2LLar9i02KrZhiDYqNmHINii2K7YsduM2YYg2K3Ysdqp2KonLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICfYqtqp2LHYp9ixINit2LHaqdiqINmC2KjZhNuMJywKCSdCb2xkJyAgICAgICAgICAgICAgICAgICAgOiAn2K/Ysdi02KonLAoJJ0l0YWxpYycgICAgICAgICAgICAgICAgICA6ICfYrtmI2KfYqNuM2K/ZhycsCgknVW5kZXJsaW5lJyAgICAgICAgICAgICAgIDogJ9iu2Lcg2LLbjNixINmF2KrZhicsCgknU3RyaWtldGhyb3VnaCcgICAgICAgICAgIDogJ9iu2Lcg2LHZiNuMINmF2KrZhicsCgknU3VwZXJzY3JpcHQnICAgICAgICAgICAgIDogJ9io2KfZhNin2YbZiNuM2LMnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICfYstuM2LHZhtmI24zYsycsCgknQWxpZ24gbGVmdCcgICAgICAgICAgICAgIDogJ9qG2b4g2obbjNmGJywKCSdBaWxnbiByaWdodCcgICAgICAgICAgICAgOiAn2LHYp9iz2Kog2obbjNmGJywKCSdBbGlnbiBjZW50ZXInICAgICAgICAgICAgOiAn2YjYs9i3INqG24zZhicsCgknQWxpZ24gZnVsbCcgICAgICAgICAgICAgIDogJ9io2Ycg2LXZiNix2Kog2qnYtNiv2Ycg2Ygg2qnYp9mF2YQnLAoJJ0ZvbnQgY29sb3InICAgICAgICAgICAgICA6ICfYsdmG2q8g2YLZhNmFINmH2KcnLAoJJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICfYsdmG2q8g2LbZhduM2YbZhycsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ9iq2YjYsdmB2Krar9uMJywgCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ9io24zYsdmI2YYg2LHZgdiq2q/bjCcsIAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICfZgtin2YTYqCcsCgknRm9udCBzaXplJyAgICAgICAgICAgICAgIDogJ9in2YbYr9in2LLZhyDZgtmE2YUnLAoJJ0ZvbnQnICAgICAgICAgICAgICAgICAgICA6ICfZgtmE2YUnLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICfZhdix2KrYqCDYs9in2LLbjCDZhNuM2LPYqicsCgknVW5vcmRlcmVkIGxpc3QnICAgICAgICAgIDogJ9io2Ycg2YfZhSDYsduM2K7YqtmGINmE24zYs9iqJywKCSdIb3Jpem9udGFsIHJ1bGUnICAgICAgICAgOiAn2K7YtyDYp9mB2YLbjCcsCgknQmxvY2txdW90ZScgICAgICAgICAgICAgIDogJ9mG2YLZhCDZgtmI2YQnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICfYudmG2LEg2Ybar9mHINiv2KfYsdmG2K/ZhyAoRElWKScsCgknTGluaycgICAgICAgICAgICAgICAgICAgIDogJ9m+24zZiNmG2K8nLAoJJ0RlbGV0ZSBsaW5rJyAgICAgICAgICAgICA6ICfYrdiw2YEg2YTbjNmG2qknLAoJJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICfZhti02KfZhtmHINqv2LLYp9ix24wnLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICfYqti12YjbjNixJywKCSdUYWJsZScgICAgICAgICAgICAgICAgICAgOiAn2KzYr9mI2YQnLAoJJ0RlbGV0ZSB0YWJsZScgICAgICAgICAgICA6ICfYrdiw2YEg2KzYr9mI2YQnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICfYr9ix2Kwg2LPYt9ixINmC2KjZhCDYp9iyINin24zZhicsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ9iv2LHYrCDYs9i32LEg2KjYudivINin2LIg2KfbjNmGJywKCSdEZWxldGUgcm93JyAgICAgICAgICAgICAgOiAn2K3YsNmBINiz2LfYsScsCgknSW5zZXJ0IGNvbHVtbiBiZWZvcmUnICAgIDogJ9iv2LHYrCDYs9iq2YjZhiDZgtio2YQg2KfYsicsCgknSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ9iv2LHYrCDYs9iq2YjZhiDYqNi52K8g2KfYsicsCgknRGVsZXRlIGNvbHVtbicgICAgICAgICAgIDogJ9it2LDZgSDYs9iq2YjZhicsCgknTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ9in2K/Yutin2YUg2qnYsdiv2YYgINiu2KfZhtmHINmH2KfbjCDYrNiv2YjZhCcsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ9iq2YLYs9uM2YUg2Ygg2YXYrNiy2Kcg2qnYsdiv2YYg2K7Yp9mG2Ycg2YfYp9uMINis2K/ZiNmEJywKCSdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnIDogJ9iy2YbYrNuM2LEg2LTYr9mHINio2Ycg2LPYp9iu2KrYp9ixINiz2YbYryDYr9ixINit2KfZhCDZhtmF2KfbjNi0JywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAn2KrZhti424zZhdin2Kog2K7ZiNmG2Ycg2KzYr9mI2YQnLAoJJ1RhYmxlIHByb3BlcnRpZXMnICAgICAgICA6ICfYqtmG2LjbjNmF2KfYqiDYrNiv2YjZhCcsCgknVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUnIDogJ9mG2YXYp9uM2LQg2Ygg2b7ZiNi02KfZhtuM2K/ZhiDaqdmEINmG2YXYp9uM2LTar9ixJywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAn2KjYp9iy2qnYsdiv2YYg2YXYr9uM2LHbjNiqINmB2KfbjNmEJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAn2YHYttin24wg2LrbjNixINmC2KfYqNmEINi02qnYs9iq2YYnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgICA6ICfZhdiq2YjZgtmBINiz2KfYrtiqINi52YbYsSDYtNmG2KfZiNixJywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICfYp9iu2LfYp9ixJywKCSdQcm9wZXJpZXMnIDogJ9iu2LXZiNi124zYp9iqJywKCSdQb3B1cCcgOiAn2b7Zhtis2LEg2KjYp9iy2LTZiCcsCgknQWR2YW5jZWQnIDogJ9m+24zYtNix2YHYqtmHJywKCSdFdmVudHMnIDogJ9ix2YjbjNiv2KfYrycsCgknV2lkdGgnIDogJ9i32YjZhCcsCgknSGVpZ2h0JyA6ICfYudix2LYnLAoJJ0xlZnQnICAgOiAn2obZvicsCgknQ2VudGVyJyA6ICfZiNiz2LcnLAoJJ1JpZ2h0JyAgOiAn2LHYp9iz2KonLAoJJ0JvcmRlcicgOiAn2qnYp9iv2LEg2K3Yp9uM2YcnLAoJJ0JhY2tncm91bmQnIDogJ9m+2LTYqiDYtdit2YbZhy/YttmF24zZhtmHJywKCSdDc3MgY2xhc3MnIDogJ9qp2YTYp9izINiz24wg2KfYsyDYp9izJywKCSdDc3Mgc3R5bGUnIDogJ9in2LPYqtin24zZhCDYs9uMINin2LMg2KfYsycsCgknTm8nIDogJ9iu24zYsScsCgknVGl0bGUnIDogJ9i52YbZiNin2YYnLAoJJ1NjcmlwdCBkaXJlY3Rpb24nIDogJ9in2LPaqdix24zZvtiqINmH2YUg2LPZiCcsCgknTGFuZ3VhZ2UnIDogJ9ix2KjYp9mGJywKCSdDaGFyc2V0JyA6ICfaqdiv2b7bjNisINiy24zYp9mGJywKCSdOb3Qgc2V0JyA6ICfYp9i52YXYp9mEINmG2LTYrycsCgknTGVmdCB0byByaWdodCcgOiAn2obZviDYqNmHINix2KfYs9iqJywKCSdSaWdodCB0byBsZWZ0JyA6ICfYsdin2LPYqiDYqNmHINqG2b4nLAoJJ0luIHRoaXMgd2luZG93JyA6ICcoX3NlbGYpINmG2YXYp9uM2LQg2K/YsSDZh9mF24zZhiDZvtmG2KzYsdmHJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICcoX2JsYW5rKSDZhtmF2KfbjNi0INiv2LEg2b7Zhtis2LHZhyDYrNiv24zYryAnLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KScgOiAnKF9wYXJlbnQpINmG2YXYp9uM2LQg2K/YsSDZvtmG2KzYsdmHINin2LXZhNuMJywKCSdJbiB0b3AgZnJhbWUgKF90b3ApJyA6ICcoX3RvcCkg2YbZhdin24zYtCDYr9ixINio2KfZhNin24wg2YLYp9ioJywKCSdVUkwnIDogJycsCgknT3BlbiBpbicgOiAn2KjYp9iyINqp2LHYr9mGINiv2LEnLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAn2KfbjNmGINi52YXZhNuM2KfYqiDYqNmHINiv2YTYp9uM2YQg2KfZhdmG24zYqtuMINiv2LEg2YXYsdmI2LHar9ixINmI2Kgg2LTZhdinINmF2LPYr9mI2K8g2LTYr9mHINiMINmE2LfZgdinINin2LIg2YXbjNin2YbYqNixINmH2Kcg2KfYs9iq2YHYp9iv2Ycg2qnZhtuM2K8uJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ9iz2LEg2YHYtdmEIDEnLAoJJ0hlYWRpbmcgMicgOiAn2LPYsSDZgdi12YQgMicsCgknSGVhZGluZyAzJyA6ICfYs9ixINmB2LXZhCAzJywKCSdIZWFkaW5nIDQnIDogJ9iz2LEg2YHYtdmEIDQnLAoJJ0hlYWRpbmcgNScgOiAn2LPYsSDZgdi12YQgNScsCgknSGVhZGluZyA2JyA6ICfYs9ixINmB2LXZhCA2JywJCgknUGFyYWdyYXBoJyA6ICfZvtix2Kfar9ix2KfZgScsCgknQWRkcmVzcycgOiAn2KLYr9ix2LMnLAoJJ1ByZWZvcm1hdHRlZCcgOiAn2YLYp9mE2Kgg2KjZhtiv24wg2LTYr9mHJywKCS8vIGZvbnQgc2l6ZQoJJ1NtYWxsICg4cHQpJyAgIDogJycsCgknU21hbGwgKDEwcHgpJyAgOiAnJywKCSdTbWFsbCAoMTJwdCknICA6ICcnLAoJJ05vcm1hbCAoMTRwdCknIDogJycsCgknTGFyZ2UgKDE4cHQpJyAgOiAnJywKCSdMYXJnZSAoMjRwdCknICA6ICcnLAoJJ0xhcmdlICgzNnB0KScgIDogJycsCQkJCQoJLy8gYm9va21hcmsKCSdCb29rbWFyayBuYW1lJyA6ICfZhtin2YUg2YbYtNin2YbZhycsCgkvLyBsaW5rCgknTGluayBVUkwnIDogJyhVUkwpINm+24zZiNmG2K8nLAoJJ1RhcmdldCcgOiAn2YXZgti12K8nLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ9io2KfYsiDaqdix2K/ZhiDZvtuM2YjZhtivINiv2LEg24zaqSDZvtmG2KzYsdmHINio2KfYsti02YgnLAoJJ1VSTCcgOiAnJywKCSdXaW5kb3cgbmFtZScgOiAn2YbYp9mFINm+2YbYrNix2YcnLAoJJ1dpbmRvdyBzaXplJyA6ICfYs9in24zYsiDZvtmG2KzYsdmHJywKCSdXaW5kb3cgcG9zaXRpb24nIDogJ9mF2YjZgti524zYqiDZvtmG2KzYsdmHJywKCSdMb2NhdGlvbiBiYXInIDogJ9mF2K3ZhCDZhtqv2Ycg2K/Yp9ix2YbYr9mHJywKCSdNZW51IGJhcicgOiAn2Ybar9mHINiv2KfYsdmG2K/ZhyDZhdmG2YgnLAoJJ1Rvb2xiYXInIDogJ9is2LnYqNmHINin2KjYstin2LEnLAoJJ1Njcm9sbGJhcnMnIDogJ9mF2K3ZhCDYp9iz2qnYsdmI2YQnLAoJJ1N0YXR1cyBiYXInIDogJ9mF2K3ZhCDZiNi22LnbjNiqJywKCSdSZXNpemFibGUnIDogJ9iq2LrbjNuM2LEg2LPYp9iyINm+2LDbjNixINio2YjYr9mGJywKCSdEZXBlZGVudCcgOiAn2YXYrdiq2KfYrCcsCgknQWRkIHJldHVybiBmYWxzZScgOiAnKHJldHVybiBmYWxzZSkg2KfZgdiy2YjYr9mGJywKCSdUYXJnZXQgTUlNRSB0eXBlJyA6ICdNSU1FIHR5cGUnLAoJJ1JlbGF0aW9uc2hpcCBwYWdlIHRvIHRhcmdldCAocmVsKScgOiAnJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknIDogJycsCgknVGFiIGluZGV4JyA6ICcnLAoJJ0FjY2VzcyBrZXknIDogJ9qp24zZhNuM2K8g2K/Ys9iq2LHYs9uMJywKCS8vIGltYWdlCgknU2l6ZScgOiAn2LPYp9uM2LInLAoJJ1ByZXZpZXcnIDogJ9m+24zYtCDZhtmF2KfbjNi0JywKCSdNYXJnaW5zJyA6ICfYrdin2LTbjNmHINmH2KcnLAoJJ0FsdCB0ZXh0JyA6ICdBbHQnLAoJJ0ltYWdlIFVSTCcgOiAnVVJMJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAnKHNwYWNpbmcp2YHYp9i12Ycg2YfYp9uMINmF24zYp9mG24wnLAoJJ1BhZGRpbmcnICAgICAgIDogJyhwYWRkaW5nKSDYrdin2LTbjNmHINmH2Kcg2K/YsdmI2YbbjCcsCgknUm93cycgICAgICAgICAgOiAn2LPYt9ix2YfYpycsCgknQ29sdW1ucycgICAgICAgOiAn2LPYqtmI2YYg2YfYpycsCgknR3JvdXBzJyAgICAgICAgOiAn2q/YsdmI2Ycg2YfYp9izJywKCSdDZWxscycgICAgICAgICA6ICfYrtin2YbZhyDZh9in2LMnLAoJJ0NhcHRpb24nICAgICAgIDogJ9i52YbZiNin2YYnLAoJJ0lubmVyIGJvcmRlcnMnIDogJ9qp2KfYr9ixINiv2LHZiNmG24wnCgkKCQp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.fr.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEZyZW5jaCB0cmFuc2xhdGlvbgogKiBAYXV0aG9yIEZyYW5jb2lzIE1hemVyb2xsZSA8Zm1hejAwOEBnbWFpbC5jb20+CiAqIEB2ZXJzaW9uIDIwMTAtMDktMTgKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5pMThNZXNzYWdlcy5mciA9IHsKCSdFZGl0b3InIDogJ0VkaXRldXInLAoJJ1NvdXJjZScgOiAnQ29kZSBTb3VyY2UnLAoJLy8gUGFuZWwgTmFtZQoJJ0NvcHkvUGFzZScgICAgICA6ICdDb3BpZXIvQ29sbGVyJywKCSdVbmRvL1JlZG8nICAgICAgOiAnQW5udWxlci9Sw6lww6l0ZXInLAoJJ1RleHQgc3R5bGVzJyAgICA6ICdTdHlsZXMgZGUgdGV4dGUnLAoJJ0NvbG9ycycgICAgICAgICA6ICdDb3VsZXVycycsCgknQWxpZ25tZW50JyAgICAgIDogJ0FsaWduZW1lbnQnLAoJJ0luZGVudC9PdXRkZW50JyA6ICdBdWdtZW50ZXIvRGltaW51ZXIgbFwnaW5jcsOpbWVudCcsCgknVGV4dCBmb3JtYXQnICAgIDogJ0Zvcm1hdCBkZSB0ZXh0ZScsCgknTGlzdHMnICAgICAgICAgIDogJ0xpc3RlcycsCgknTWlzYyBlbGVtZW50cycgIDogJ8OJbMOpbWVudHMgZGl2ZXJzJywKCSdMaW5rcycgICAgICAgICAgOiAnTGllbnMnLAoJJ0ltYWdlcycgICAgICAgICA6ICdJbWFnZXMnLAoJJ01lZGlhJyAgICAgICAgICA6ICdNdWx0aW3DqWRpYScsCgknVGFibGVzJyAgICAgICAgIDogJ1RhYmxlYXV4JywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAnR2VzdGlvbm5haXJlIGRlIGZpY2hpZXJzJywKCS8vIGJ1dHRvbiBuYW1lcwoJJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICdFbnJlZ2lzdHJlcicsCgknQ29weScgICAgICAgICAgICAgICAgICAgIDogJ0NvcGllcicsCgknQ3V0JyAgICAgICAgICAgICAgICAgICAgIDogJ0NvdXBlcicsCgknUGFzdGUnICAgICAgICAgICAgICAgICAgIDogJ0NvbGxlcicsCgknUGFzdGUgb25seSB0ZXh0JyAgICAgICAgIDogJ0NvbGxlciBzZXVsZW1lbnQgbGUgdGV4dGUnLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICdDb2xsZXIgbGUgdGV4dGUgZm9ybWF0w6knLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICdFZmZhY2VyIGxlIGZvcm1hdGFnZScsCgknVW5kbyBsYXN0IGFjdGlvbicgICAgICAgIDogJ0FubnVsZXIgbGEgZGVybmnDqHJlIGFjdGlvbicsCgknUmVkbyBwcmV2aW91cyBhY3Rpb24nICAgIDogJ1LDqXDDqXRlciBsYSBkZXJuacOocmUgYWN0aW9uJywKCSdCb2xkJyAgICAgICAgICAgICAgICAgICAgOiAnR3JhcycsCgknSXRhbGljJyAgICAgICAgICAgICAgICAgIDogJ0l0YWxpcXVlJywKCSdVbmRlcmxpbmUnICAgICAgICAgICAgICAgOiAnU291bGlnbmVyJywKCSdTdHJpa2V0aHJvdWdoJyAgICAgICAgICAgOiAnQmFycsOpJywKCSdTdXBlcnNjcmlwdCcgICAgICAgICAgICAgOiAnRXhwb3NhbnQnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICdJbmRpY2UnLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICdBbGlnbmVyIMOgIGdhdWNoZScsCgknQWlsZ24gcmlnaHQnICAgICAgICAgICAgIDogJ0FsaWduZXIgw6AgZHJvaXRlJywKCSdBbGlnbiBjZW50ZXInICAgICAgICAgICAgOiAnQ2VudHJlcicsCgknQWxpZ24gZnVsbCcgICAgICAgICAgICAgIDogJ0p1c3RpZmllcicsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ0NvdWxldXIgZGUgdGV4dGUnLAoJJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICdDb3VsZXVyIGRcJ2FycmnDqHJlIHBsYW4nLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICdBdW1lbnRlciBsYSBtYXJnZScsCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ1LDqWR1aXJlIGxhIG1hcmdlJywKCSdGb3JtYXQnICAgICAgICAgICAgICAgICAgOiAnRm9ybWF0ZXInLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICdUYWlsbGUgZGUgcG9saWNlJywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAnUG9saWNlJywKCSdPcmRlcmVkIGxpc3QnICAgICAgICAgICAgOiAnTGlzdGUgb3Jkb25uw6llJywKCSdVbm9yZGVyZWQgbGlzdCcgICAgICAgICAgOiAnTGlzdGUgZMOpc29yZG9ubsOpZScsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ0xpZ25lIGhvcml6b250YWxlJywKCSdCbG9ja3F1b3RlJyAgICAgICAgICAgICAgOiAnQ2l0YXRpb24nLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICdCbG9jIMOpbMOpbWVudCAoRElWKScsCgknTGluaycgICAgICAgICAgICAgICAgICAgIDogJ0xpZW4nLAoJJ0RlbGV0ZSBsaW5rJyAgICAgICAgICAgICA6ICdTdXBwcmltZXIgbGUgbGllbicsCgknQm9va21hcmsnICAgICAgICAgICAgICAgIDogJ01hcnF1ZSBwYWdlJywKCSdJbWFnZScgICAgICAgICAgICAgICAgICAgOiAnSW1hZ2UnLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICdUYWJsZWF1JywKCSdEZWxldGUgdGFibGUnICAgICAgICAgICAgOiAnU3VwcHJpbWVyIHRhYmxlYXUnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICdJbnPDqXJlciB1bmUgbGlnbmUgYXZhbnQnLAoJJ0luc2VydCByb3cgYWZ0ZXInICAgICAgICA6ICdJbnPDqXJlciB1bmUgbGlnbmUgYXByw6hzJywKCSdEZWxldGUgcm93JyAgICAgICAgICAgICAgOiAnU3VwcHJpbWVyIHVuZSBsaWduZScsCgknSW5zZXJ0IGNvbHVtbiBiZWZvcmUnICAgIDogJ0luc8OpcmVyIHVuZSBjb2xvbmUgYXZhbnQnLAoJJ0luc2VydCBjb2x1bW4gYWZ0ZXInICAgICA6ICdJbnPDqXJlciB1bmUgY29sb25lIGFwcsOocycsCgknRGVsZXRlIGNvbHVtbicgICAgICAgICAgIDogJ1N1cHByaW1lciB1bmUgY29sb25lJywKCSdNZXJnZSB0YWJsZSBjZWxscycgICAgICAgOiAnRnVzaW9ubmVyIGxlcyBjZWxsdWxlcycsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ0RpdmlzZXIgbGEgY2VsbHVsZScsCgknVG9nZ2xlIGRpc3BsYXkgZG9jdW1lbnQgc3RydWN0dXJlJyA6ICdBbHRlcm5lciBsYSB2dWUgZHUgZG9jdW1lbnQnLAoJJ1RhYmxlIGNlbGwgcHJvcGVydGllcycgICA6ICdQcm9wcmnDqXTDqSBkZSBsYSBjZWxsdWxlJywKCSdUYWJsZSBwcm9wZXJ0aWVzJyAgICAgICAgOiAnUHJvcHJpw6l0w6kgZHUgdGFibGVhdScsCgknVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUnIDogJ0FsdGVybmVyIGxhIHZ1ZSBwbGVpbiDDqWNyYW4nLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICdPdXZyaXIgbGUgZ2VzdGlvbm5haXJlIGRlIGZpY2hpZXJzJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAnRXNwYWNlIGluc8OpY2FibGUnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgICA6ICdJbnRlcnJvbXByZSBsZSBmbG90dGVtZW50IGRlIGxcJ8OpbMOpbWVudCcsCgkvLyBkaWFsb2dzCgknV2FybmluZycgOiAnQXR0ZW50aW9uJywKCSdQcm9wZXJpZXMnIDogJ1Byb3ByacOpdMOpJywKCSdQb3B1cCcgOiAnTm91dmVsbGUgZmVuw6p0cmUnLAoJJ0FkdmFuY2VkJyA6ICdBdmFuY8OpJywKCSdFdmVudHMnIDogJ8OJdsOobmVtZW50cycsCgknV2lkdGgnIDogJ0xhcmdldXInLAoJJ0hlaWdodCcgOiAnSGF1dGV1cicsCgknTGVmdCcgICA6ICdHYXVjaGUnLAoJJ0NlbnRlcicgOiAnQ2VudHJlJywKCSdSaWdodCcgIDogJ0Ryb2l0ZScsCgknQm9yZGVyJyA6ICdCb3JkdXJlJywKCSdCYWNrZ3JvdW5kJyA6ICdBcnJpw6hyZSBwbGFuJywKCSdDc3MgY2xhc3MnIDogJ0NsYXNzZSBDU1MnLAoJJ0NzcyBzdHlsZScgOiAnU3R5bGUgQ1NTJywKCSdObycgOiAnTm9uJywKCSdUaXRsZScgOiAnVGl0cmUnLAoJJ1NjcmlwdCBkaXJlY3Rpb24nIDogJ0RpcmVjdGlvbiBkZSBzY3JpcHQnLAoJJ0xhbmd1YWdlJyA6ICdMYW5ndWUnLAoJJ0NoYXJzZXQnIDogJ0pldSBkZSBjYXJhY3TDqHJlcycsCgknTm90IHNldCcgOiAnTm8gc2V0JywKCSdMZWZ0IHRvIHJpZ2h0JyA6ICdHYXVjaGUgw6AgZHJvaXRlJywKCSdSaWdodCB0byBsZWZ0JyA6ICdEcm9pdGUgw6AgZ2F1Y2hlJywKCSdJbiB0aGlzIHdpbmRvdycgOiAnRGFucyBjZXR0ZSBmZW7DqnRyZSAoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICdEYW5zIHVuZSBub3V2ZWxsZSBmZW7DqnRyZSAoX2JsYW5rKScsCgknSW4gbmV3IHBhcmVudCB3aW5kb3cgKF9wYXJlbnQpJyA6ICdEYW5zIHVuZSBub3V2ZWxsZSBmZW7DqnRyZSBwYXJlbnRlIChfcGFyZW50KScsCgknSW4gdG9wIGZyYW1lIChfdG9wKScgOiAnRGFucyBsZSBjYWRyZSBtYWl0cmUgKF90b3ApJywKCSdVUkwnIDogJ1VSTCcsCgknT3BlbiBpbicgOiAnT3V2cmlyIGRhbnMnLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAnQ2V0dGUgb3DDqXJhdGlvbiBlc3QgZMOpc2FjdGl2w6llIGRhbnMgdm90cmUgbmF2aWdhdGV1ciBwb3VyIGRlcyByYWlzb25zIGRlIHPDqWN1cml0w6kuIFV0aWxpc2V6IGxlIHJhY2NvdXJjaS4nLAoJLy8gZm9ybWF0IAoJJ0hlYWRpbmcgMScgOiAnRW50w6p0ZSAxJywKCSdIZWFkaW5nIDInIDogJ0VudMOqdGUgMicsCgknSGVhZGluZyAzJyA6ICdFbnTDqnRlIDMnLAoJJ0hlYWRpbmcgNCcgOiAnRW50w6p0ZSA0JywKCSdIZWFkaW5nIDUnIDogJ0VudMOqdGUgNScsCgknSGVhZGluZyA2JyA6ICdFbnTDqnRlIDYnLAoJJ1BhcmFncmFwaCcgOiAnUGFyYWdyYXBoZScsCgknQWRkcmVzcycgOiAnQWRyZXNzZScsCgknUHJlZm9ybWF0dGVkJyA6ICdQcsOpZm9ybWF0w6knLAoJLy8gZm9udCBzaXplCgknU21hbGwgKDhwdCknICAgOiAnUGV0aXRlICg4cHQpJywKCSdTbWFsbCAoMTBweCknICA6ICdQZXRpdGUgKDEwcHgpJywKCSdTbWFsbCAoMTJwdCknICA6ICdQZXRpdGUgKDEycHQpJywKCSdOb3JtYWwgKDE0cHQpJyA6ICdOb3JtYWxlICgxNHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAnR3JhbmRlICgxOHB0KScsCgknTGFyZ2UgKDI0cHQpJyAgOiAnR3JhbmRlICgyNHB0KScsCgknTGFyZ2UgKDM2cHQpJyAgOiAnR3JhbmRlICgzNnB0KScsCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ05vbSBkdSBmYXZvcmknLAoJLy8gbGluawoJJ0xpbmsgVVJMJyA6ICdBZHJlc3NlIGR1IGxpZW4nLAoJJ1RhcmdldCcgOiAnQ2libGUnLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ091dnJpciBkYW5zIHVuZSBub3V2ZWxsZSBmZW7DqnRyZScsCgknV2luZG93IG5hbWUnIDogJ05vbSBkZSBsYSBmZW7DqnRyZScsCgknV2luZG93IHNpemUnIDogJ1RhaWxsZSBkZSBsYSBmZW7DqnRyZScsCgknV2luZG93IHBvc2l0aW9uJyA6ICdQb3NpdGlvbiBkZSBsYSBmZW7DqnRyZScsCgknTG9jYXRpb24gYmFyJyA6ICdCYXJyZSBkXCdhZHJlc3NlJywKCSdNZW51IGJhcicgOiAnQmFycmUgZGUgbWVudScsCgknVG9vbGJhcicgOiAnQmFycmUgZFwnb3V0aWxzJywKCSdTY3JvbGxiYXJzJyA6ICdCYXJyZXMgZGUgZMOpZmlsbGVtZW50JywKCSdTdGF0dXMgYmFyJyA6ICdCYXJyZSBkXCfDqXRhdCcsCgknUmVzaXphYmxlJyA6ICdSZWRpbWVuc2lvbmFibGUnLAoJJ0RlcGVkZW50JyA6ICdEw6lwZW5kZW50IChOZXRzY2FwZSknLAoJJ0FkZCByZXR1cm4gZmFsc2UnIDogJ0Fqb3V0ZXIgdW4gcmV0b3VyIG7DqWdhdGlmIChyZXR1cm4gZmFsc2UpJywKCSdUYXJnZXQgTUlNRSB0eXBlJyA6ICdUeXBlIE1JTUUgY2libGUnLAoJJ1JlbGF0aW9uc2hpcCBwYWdlIHRvIHRhcmdldCAocmVsKScgOiAnJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknIDogJycsCgknVGFiIGluZGV4JyA6ICdJbmRleCBkZSB0YWJ1bGF0aW9uJywKCSdBY2Nlc3Mga2V5JyA6ICdUZWNsYSBkZSBhY2Nlc28nLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICdUYWlsbGUnLAoJJ1ByZXZpZXcnIDogJ1Byw6l2aXN1YWxpc2F0aW9uJywKCSdNYXJnaW5zJyA6ICdNYXJnZXMnLAoJJ0FsdCB0ZXh0JyA6ICdUZXh0ZSBBTFQnLAoJJ0ltYWdlIFVSTCcgOiAnVVJMIGRlIGxcJ2ltYWdlJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAnRXNwYWNlIChTcGFjaW5nKScsCgknUGFkZGluZycgICAgICAgOiAnTWFyZ2UgaW50w6lyaWV1cmUgKFBhZGRpbmcpJywKCSdSb3dzJyAgICAgICAgICA6ICdMaWduZXMnLAoJJ0NvbHVtbnMnICAgICAgIDogJ0NvbG9uZXMnLAoJJ0dyb3VwcycgICAgICAgIDogJ0dyb3VwZXMnLAoJJ0NlbGxzJyAgICAgICAgIDogJ0NlbGx1bGVzJywKCSdDYXB0aW9uJyAgICAgICA6ICfDiXRpcXVldHRlJywKCSdJbm5lciBib3JkZXJzJyA6ICdCb3JkdXJlcyBpbnTDqXJpZXVyZXMnCgkKCQp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.hu.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEh1bmdhcmlhbiB0cmFuc2xhdGlvbgogKiBAYXV0aG9yIFZpa3RvciBUYW1hcyA8dGFtYXMudmlrdG9yQHRvdGFsc3R1ZGlvLmh1PgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwogKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLmkxOE1lc3NhZ2VzLmh1ID0gewogICAgJ0VkaXRvcicgOiAnU3plcmtlc3p0xZEnLAogICAgJ1NvdXJjZScgOiAnRm9ycsOhcycsCiAgICAvLyDQvdCw0LfQstCw0L3QuNGPINC/0LDQvdC10LvQtdC5CiAgICAnQ29weS9QYXNlJyAgICAgIDogJ03DoXNvbMOhcy9CZWlsbGVzenTDqXMnLAogICAgJ1VuZG8vUmVkbycgICAgICA6ICdWaXNzemF2b27DoXMvSXNtw6l0JywKICAgICdUZXh0IHN0eWxlcycgICAgOiAnU3rDtnZlZyBzdMOtbHVzJywKICAgICdDb2xvcnMnICAgICAgICAgOiAnU3rDrW5laycsCiAgICAnQWxpZ25tZW50JyAgICAgIDogJ0VscmVuZGV6w6lzJywKICAgICdJbmRlbnQvT3V0ZGVudCcgOiAn0J7RgtGB0YLRg9C/0YsnLAogICAgJ1RleHQgZm9ybWF0JyAgICA6ICdTesO2dmVnIGZvcm1hJywKICAgICdMaXN0cycgICAgICAgICAgOiAnTGlzdMOhaycsCiAgICAnTWlzYyBlbGVtZW50cycgIDogJ0VnecOpYiBlbGVtZWsnLAogICAgJ0xpbmtzJyAgICAgICAgICA6ICdMaW5rZWsnLAogICAgJ0ltYWdlcycgICAgICAgICA6ICdLw6lwZWsnLAogICAgJ01lZGlhJyAgICAgICAgICA6ICdNw6lkaWEnLAogICAgJ1RhYmxlcycgICAgICAgICA6ICdUw6FibMOhemF0b2snLAogICAgJ0ZpbGUgbWFuYWdlciAoZWxGaW5kZXIpJyA6ICdGw6FqbCBrZXplbMWRIChlbEZpbmRlciknLAogICAgLy8g0L3QsNC30LLQsNC90LjRjyDQutC90L7Qv9C+0LoKICAgICdBYm91dCB0aGlzIHNvZnR3YXJlJyAgICAgOiAnQSBzem9mdHZlcnLFkWwnLAogICAgJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICdNZW50w6lzJywKICAgICdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAnTcOhc29sw6FzJywKICAgICdDdXQnICAgICAgICAgICAgICAgICAgICAgOiAnS2l2w6Fnw6FzJywKICAgICdQYXN0ZScgICAgICAgICAgICAgICAgICAgOiAnQmVpbGxlc3p0w6lzJywKICAgICdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAnQmVpbGxlc3p0w6lzIGNzYWsgc3rDtnZlZ2vDqW50JywKICAgICdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAnQmVpbGxlc3p0w6lzIGZvcm3DoXpvdHQgc3rDtnZlZ2vDqW50JywKICAgICdDbGVhbiBmb3JtYXQnICAgICAgICAgICAgOiAnRm9ybcOhesOhcyB0w7ZybMOpc2UnLCAKICAgICdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAnVXRvbHPDsyBtxbF2ZWxldCB2aXNzemF2b27DoXNhJywKICAgICdSZWRvIHByZXZpb3VzIGFjdGlvbicgICAgOiAnRWzFkXrFkSBtxbF2ZWxldCDDumpyYScsCiAgICAnQm9sZCcgICAgICAgICAgICAgICAgICAgIDogJ0bDqWxrw7Z2w6lyJywKICAgICdJdGFsaWMnICAgICAgICAgICAgICAgICAgOiAnRMWRbHQnLAogICAgJ1VuZGVybGluZScgICAgICAgICAgICAgICA6ICdBbMOhaMO6em90dCcsCiAgICAnU3RyaWtldGhyb3VnaCcgICAgICAgICAgIDogJ8OBdGjDunpvdHQnLAogICAgJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICdGZWxzxZEgaW5kZXgnLAogICAgJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICdBbHPDsyBpbmRleCcsCiAgICAnQWxpZ24gbGVmdCcgICAgICAgICAgICAgIDogJ0JhbHJhIGlnYXrDrXTDoXMnLAogICAgJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICdKb2JicmEgaWdhesOtdMOhcycsCiAgICAnQWxpZ24gY2VudGVyJyAgICAgICAgICAgIDogJ0vDtnrDqXByZSBpZ2F6w610w6FzJywKICAgICdBbGlnbiBmdWxsJyAgICAgICAgICAgICAgOiAnU8OzcmtpesOhcnQgaWdhesOtdMOhcycsCiAgICAnRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ0JldMWxc3rDrW4nLAogICAgJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICdIw6F0dMOpciBzesOtbicsCiAgICAnSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ0JlaMO6esOhcycsCiAgICAnT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ0tpaMO6esOhcycsCiAgICAnRm9ybWF0JyAgICAgICAgICAgICAgICAgIDogJ0Zvcm3DoXR1bScsCiAgICAnRm9udCBzaXplJyAgICAgICAgICAgICAgIDogJ0JldMWxIG3DqXJldCcsCiAgICAnRm9udCcgICAgICAgICAgICAgICAgICAgIDogJ0JldMWxIHTDrXB1cycsCiAgICAnT3JkZXJlZCBsaXN0JyAgICAgICAgICAgIDogJ1N6w6Ftb3pvdHQgbGlzdGEnLAogICAgJ1Vub3JkZXJlZCBsaXN0JyAgICAgICAgICA6ICdMaXN0YScsCiAgICAnSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ1bDrXpzemludGVzIHZvbmFsJywKICAgICdCbG9ja3F1b3RlJyAgICAgICAgICAgICAgOiAnSWTDqXpldCcsCiAgICAnQmxvY2sgZWxlbWVudCAoRElWKScgICAgIDogJ0Jsb2trIGVsZW0gKERJViknLAogICAgJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICdMaW5rJywKICAgICdEZWxldGUgbGluaycgICAgICAgICAgICAgOiAnTGluayB0w7ZybMOpc2UnLAogICAgJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICdIb3Jnb255JywKICAgICdJbWFnZScgICAgICAgICAgICAgICAgICAgOiAnS8OpcCcsCiAgICAnVGFibGUnICAgICAgICAgICAgICAgICAgIDogJ1TDoWJsw6F6YXQnLAogICAgJ0RlbGV0ZSB0YWJsZScgICAgICAgICAgICA6ICdUw6FibMOhemF0IHTDtnJsw6lzZScsCiAgICAnSW5zZXJ0IHJvdyBiZWZvcmUnICAgICAgIDogJ1NvciBiZXN6w7pyw6FzYSBzb3IgZWzDqScsCiAgICAnSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ1NvciBiZXN6w7pyw6FzYSBzb3IgbcO2Z8OpJywKICAgICdEZWxldGUgcm93JyAgICAgICAgICAgICAgOiAnU29yIHTDtnJsw6lzZScsCiAgICAnSW5zZXJ0IGNvbHVtbiBiZWZvcmUnICAgIDogJ09zemxvcCBiZXN6w7pyw6FzYSBvc3psb3AgZWzDqScsCiAgICAnSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ09zemxvcCBiZXN6w7pyw6FzYSBvc3psb3AgbcO2Z8OpJywKICAgICdEZWxldGUgY29sdW1uJyAgICAgICAgICAgOiAnT3N6bG9wIHTDtnJsw6lzZScsCiAgICAnTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ0NlbGzDoWsgw7Zzc3pldm9uw6FzYScsCiAgICAnU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ0NlbGzDoWsgc3rDqXTDoXZsYXN6dMOhc2EnLAogICAgJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAnRG9rdW1lbnR1bSBzemVya2V6ZXQgbWVndGVraW50w6lzZScsCiAgICAnVGFibGUgY2VsbCBwcm9wZXJ0aWVzJyAgIDogJ1TDoWJsw6F6YXQgY2VsbGEgdHVsYWpkb25zw6FnYWknLAogICAgJ1RhYmxlIHByb3BlcnRpZXMnICAgICAgICA6ICdUw6FibGEgdHVsYWpkb25zw6Fnb2snLAogICAgJ1RvZ2dsZSBmdWxsIHNjcmVlbiBtb2RlJyA6ICdUZWxqZXMga8OpcGVybnnFkXMgbcOzZCcsCiAgICAnT3BlbiBmaWxlIG1hbmFnZXInICAgICAgIDogJ0bDoWpsIGtlemVsxZEgbWVnbnlpdMOhc2EnLAogICAgJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICdTesOza8O2eicsCiAgICAnU3RvcCBlbGVtZW50IGZsb2F0aW5nJyAgIDogJ0VsZW0gZWxyZW5kZXrDqXNlayB0w7ZybMOpc2UnLAogICAgLy8gZGlhbG9ncwogICAgJ1dhcm5pbmcnIDogJ0ZpZ3llbG1lenRldMOpcycsCiAgICAnUHJvcGVyaWVzJyA6ICdUdWxhamRvbnPDoWdvaycsCiAgICAnUG9wdXAnIDogJ1BvcHVwJywKICAgICdBZHZhbmNlZCcgOiAnRWd5w6luaScsCiAgICAnRXZlbnRzJyA6ICdFc2Vtw6lueWVrJywKICAgICdXaWR0aCcgOiAnU3rDqWxlc3PDqWcnLAogICAgJ0hlaWdodCcgOiAnTWFnYXNzw6FnJywKICAgICdMZWZ0JyAgIDogJ0JhbCcsCiAgICAnQ2VudGVyJyA6ICdLw7Z6w6lwJywKICAgICdSaWdodCcgIDogJ0pvYmInLAogICAgJ0JvcmRlcicgOiAnS2VyZXQnLAogICAgJ0JhY2tncm91bmQnIDogJ0jDoXR0w6lyJywKICAgICdDc3MgY2xhc3MnIDogJ0NzcyBjbGFzcycsCiAgICAnQ3NzIHN0eWxlJyA6ICdDc3Mgc3TDrWx1cycsCiAgICAnTm8nIDogJ05lbScsCiAgICAnVGl0bGUnIDogJ0PDrW0nLAogICAgJ1NjcmlwdCBkaXJlY3Rpb24nIDogJ1NjcmlwdCBoaXZhdGtvesOhcycsCiAgICAnTGFuZ3VhZ2UnIDogJ055ZWx2JywKICAgICdDaGFyc2V0JyA6ICdLYXJha3RlcnTDoWJsYScsCiAgICAnTm90IHNldCcgOiAnTmluY3MgYmXDoWxsw610dmEnLAogICAgJ0xlZnQgdG8gcmlnaHQnIDogJ0JhbHLDs2wgam9iYnJhJywKICAgICdSaWdodCB0byBsZWZ0JyA6ICdKb2JicsOzbCBiYWxyYScsCiAgICAnSW4gdGhpcyB3aW5kb3cnIDogJ0ViYmUgYXogYWJsYWtiYScsCiAgICAnSW4gbmV3IHdpbmRvdyAoX2JsYW5rKScgOiAnw5pqIGFibGFrYmEgKF9ibGFuayknLAogICAgJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KScgOiAnRWd5IMO6aiBhYmxha2JhIChfcGFyZW50KScsCiAgICAnSW4gdG9wIGZyYW1lIChfdG9wKScgOiAnQSB0b3AgZnJhbWUtYmUgKF90b3ApJywKICAgICdVUkwnIDogJycsCiAgICAnT3BlbiBpbicgOiAnTWVnbnlpdMOhcycsCiAgICAnT3BlbiBmaWxlIG1hbmdlcicgOiAnRsOhamxrZXplbMWRIG1lZ255aXTDoXNhJywKICAgIC8vIGNvcHkKICAgICdUaGlzIG9wZXJhdGlvbiBpcyBkaXNhYmxlZCBpbiB5b3VyIGJyb3dzZXIgb24gc2VjdXJpdHkgcmVhc29uLiBVc2Ugc2hvcnRjdXQgaW5zdGVhZC4nIDogJ0V6IGEgbcWxdmVsZXQgbGUgdmFuIHRpbHR2YSBhIGLDtm5nw6lzesWRasOpYmVuIGEgYml6dG9uc8OhZ2kgb2tiw7NsLiBIYXN6bsOhbGphIGEgcGFyYW5jc2lrb250IGVoZWx5ZXR0LicsCiAgICAvLyBmb3JtYXQgCiAgICAnSGVhZGluZyAxJyA6ICdDw61tc29yIDEnLAogICAgJ0hlYWRpbmcgMicgOiAnQ8OtbXNvciAyJywKICAgICdIZWFkaW5nIDMnIDogJ0PDrW1zb3IgMycsCiAgICAnSGVhZGluZyA0JyA6ICdDw61tc29yIDQnLAogICAgJ0hlYWRpbmcgNScgOiAnQ8OtbXNvciA1JywKICAgICdIZWFkaW5nIDYnIDogJ0PDrW1zb3IgNicsICAgIAogICAgJ1BhcmFncmFwaCcgOiAnQmVrZXpkw6lzJywKICAgICdBZGRyZXNzJyA6ICdDw61tJywKICAgICdQcmVmb3JtYXR0ZWQnIDogJ0VsxZFyZSBmb3Jtw6F6b3R0JywKICAgIC8vIGZvbnQgc2l6ZQogICAgJ1NtYWxsICg4cHQpJyAgIDogJ0tpY3NpICg4cHQpJywKICAgICdTbWFsbCAoMTBweCknICA6ICdLaWNzaSAoMTBweCknLAogICAgJ1NtYWxsICgxMnB0KScgIDogJ0tpY3NpICgxMnB0KScsCiAgICAnTm9ybWFsICgxNHB0KScgOiAnTm9ybcOhbCAoMTRwdCknLAogICAgJ0xhcmdlICgxOHB0KScgIDogJ05hZ3kgKDE4cHQpJywKICAgICdMYXJnZSAoMjRwdCknICA6ICdOYWd5ICgyNHB0KScsCiAgICAnTGFyZ2UgKDM2cHQpJyAgOiAnTmFneSAoMzZwdCknLCAgICAgICAgICAgICAgICAKICAgIC8vIGJvb2ttYXJrCiAgICAnQm9va21hcmsgbmFtZScgOiAnSG9yZ29ueSBuZXZlJywKICAgIC8vIGxpbmsKICAgICdMaW5rIFVSTCcgOiAnTGluayBjw61tZSAoVVJMKScsCiAgICAnVGFyZ2V0JyA6ICdDw6lsJywKICAgICdTZWxlY3QgYm9va21hcmsnIDogJ0hvcmdvbnkgdsOhbGFzenTDoXNhJywKICAgICdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JyA6ICdIaXZhdGtvesOhcyBtZWdueWl0w6FzYSDDumogcG9wdXAgYWJsYWtiYW4nLAogICAgJ1VSTCcgOiAnJywKICAgICdXaW5kb3cgbmFtZScgOiAnQWJsYWsgbmV2ZScsCiAgICAnV2luZG93IHNpemUnIDogJ0FibGFrIG3DqXJldGUnLAogICAgJ1dpbmRvdyBwb3NpdGlvbicgOiAnQWJsYWsgcG96w61jacOzamEnLAogICAgJ0xvY2F0aW9uIGJhcicgOiAnQ8OtbXNvcicsCiAgICAnTWVudSBiYXInIDogJ01lbsO8c29yJywKICAgICdUb29sYmFyJyA6ICdFc3prw7Z6dMOhcicsCiAgICAnU2Nyb2xsYmFycycgOiAnR8O2cmfFkXPDoXYnLAogICAgJ1N0YXR1cyBiYXInIDogJ1N0w6F0dXN6IHNvcicsCiAgICAnUmVzaXphYmxlJyA6ICfDgXRtw6lyZXRlemhldMWRJywKICAgICdEZXBlZGVudCcgOiAnJywKICAgICdBZGQgcmV0dXJuIGZhbHNlJyA6ICdIb3p6w6FhZMOhcyAocmV0dXJuIGZhbHNlKScsCiAgICAnVGFyZ2V0IE1JTUUgdHlwZScgOiAnTUlNRSB0w61wdXPDuiBjw6lsJywKICAgICdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJ0PDqWxob3oga2FwY3NvbMOzZMOzIGxhcCAocmVsKScsCiAgICAnUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpJyA6ICdMYXBob3oga2FwY3NvbMOzZMOzIGPDqWwgKHJldiknLAogICAgJ1RhYiBpbmRleCcgOiAnVGFidWzDoXRvciBpbmRleCcsCiAgICAnQWNjZXNzIGtleScgOiAnSG96esOhZsOpcsOpc2kga3VsY3MnLAogICAgLy8gaW1hZ2UKICAgICdTaXplJyA6ICdNw6lyZXQnLAogICAgJ1ByZXZpZXcnIDogJ0VsxZFuw6l6ZXQnLAogICAgJ01hcmdpbnMnIDogJ01hcmfDs2snLAogICAgJ0FsdCB0ZXh0JyA6ICdBbHQgc3rDtnZlZycsCiAgICAnSW1hZ2UgVVJMJyA6ICdLw6lwIFVSTCcsCiAgICAvLyB0YWJsZQogICAgJ1NwYWNpbmcnICAgICAgIDogJ0NlbGxha8O2eicsCiAgICAnUGFkZGluZycgICAgICAgOiAnJywKICAgICdSb3dzJyAgICAgICAgICA6ICdTb3JvaycsCiAgICAnQ29sdW1ucycgICAgICAgOiAnT3N6bG9wb2snLAogICAgJ0dyb3VwcycgICAgICAgIDogJ0Nzb3BvcnRvaycsCiAgICAnQ2VsbHMnICAgICAgICAgOiAnQ2VsbMOhaycsCiAgICAnQ2FwdGlvbicgICAgICAgOiAnRmVsaXJhdCcsCiAgICAnSW5uZXIgYm9yZGVycycgOiAnQmVsc8WRIGtlcmV0JywKICAgIC8vIHRhYmxlIGNlbGwKICAgICdUYWJsZSBjZWxsIHR5cGUnIDogJ1TDoWJsw6F6YXQgY2VsbGEgdMOtcHVzJywKICAgICdEYXRhJyA6ICdBZGF0JywKICAgICdIZWFkZXInIDogJ0PDrW1zb3InLAogICAgJ0p1c3RpZnknIDogJ1NvcmtpesOhcnQnLAogICAgJ1BhZGRpbmdzJyA6ICdQYWRkaW5nJywKICAgICdBcHBseSB0bycgOiAnQWxrYWxtYXrDoXMgYScsCiAgICAnQ3VycmVudCBjZWxsJyA6ICdKZWxlbmxlZ2kgY2VsbGEnLAogICAgJ0FsbCBjZWxscyBpbiByb3cnIDogJ8OWc3N6ZXMgY2VsbGEgYSBzb3JiYW4nLAogICAgJ0FsbCBjZWxscyBpbiBjb2x1bW4nIDogJ8OWc3N6ZXMgY2VsbGEgYXogb3N6bG9wYmFuJywKICAgICdBbGwgY2VsbHMgaW4gdGFibGUnIDogJ8OWc3N6ZXMgY2VsbGEgYSB0w6FibMOhemF0YmFuJywKICAgIC8vIGFib3V0CiAgICAnQWJvdXQgZWxSVEUnIDogJ0F6IGVsUlRFLXLFkWwnLAogICAgJ1ZlcnNpb24nIDogJ1Zlcnppw7MnLAogICAgJ0xpY2VuY2UnIDogJ0xpc3plbnN6JywKICAgICdlbFJURSBpcyBhbiBvcGVuLXNvdXJjZSBKYXZhU2NyaXB0IGJhc2VkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJyA6ICdBeiBlbFJURSBlZ3kgbnnDrWx0Zm9ycsOhc2vDs2TDuiBKYXZhU2NyaXB0IGFsYXDDuiBXWVNJV1lHIEhUTUwtc3plcmtlc3p0xZEuJywKICAgICdNYWluIGdvYWwgb2YgdGhlIGVkaXRvciAtIHNpbXBsaWZ5IHdvcmsgd2l0aCB0ZXh0IGFuZCBmb3JtYXRpbmcgKEhUTUwpIG9uIHNpdGVzLCBibG9ncywgZm9ydW1zIGFuZCBvdGhlciBvbmxpbmUgc2VydmljZXMuJyA6ICdBIHN6ZXJrZXN6dMWRIGbFkSBjw6lsamEsIGhvZ3kgZWd5c3plcsWxc8OtdHNlIGEgbXVua8OhdCDDqXMgYSBzesO2dmVnIGZvcm3DoXrDoXN0IChIVE1MKSBheiBvbGRhbGFrb24sIGJsb2dva29uLCBmw7NydW1va29uIGlsbGV0dmUgbcOhcyBvbmxpbmUgc3pvbGfDoWx0YXTDoXNva2Jhbi4nLAogICAgJ1lvdSBjYW4gdXNlIGl0IGluIGFueSBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsIHByb2plY3RzLicgOiAnSGFzem7DoWxoYXRvZCBiw6FybWlseWVuIGtlcmVza2VkZWxuaSB2YWd5IG5lbS1rZXJlc2tlZGVsbWkgY8OpbMO6IHByb2pla3RiZW4uJywKICAgICdBdXRob3JzJyA6ICdLw6lzesOtdMWRaycsCiAgICAnQ2hpZWYgZGV2ZWxvcGVyJyA6ICdGxZEgZmVqbGVzenTFkScsCiAgICAnRGV2ZWxvcGVyLCB0ZWNoIHN1cHBvcnQnIDogJ0ZlamVsc2F6dMWRLCB0ZWNoIGthcGNzb2xhdCcsCiAgICAnSW50ZXJmYWNlIGRlc2lnbmVyJyA6ICdJbnRlcmZhY2UgdGVydmV6xZEnLAogICAgJ1NwYW5pc2ggbG9jYWxpemF0aW9uJyA6ICdTcGFueW9sIGZvcmTDrXTDsycsCiAgICAnSmFwYW5lc2UgbG9jYWxpemF0aW9uJyA6ICdKYXDDoW4gZm9yZMOtdMOzJywKICAgICdMYXR2aWFuIGxvY2FsaXphdGlvbicgOiAnTGl0dsOhbiBmb3Jkw610w7MnLAogICAgJ0dlcm1hbiBsb2NhbGl6YXRpb24nIDogJ07DqW1ldCBmb3Jkw610w7MnLAogICAgJ1VrcmFuaWFuIGxvY2FsaXphdGlvbicgOiAnVWtyw6FuIGZvcmTDrXTDsycsCiAgICAnTWFneWFyIGxvY2FsaXphdGlvbicgOiAnTWFneWFyIGZvcmTDrXTDsycsCiAgICAnRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzb2Z0d2FyZSB2aXNpdCB0aGUnIDogJ1RvdsOhYmJpIGluZm9ybcOhY2nDs2vDqXJ0IGEgc3pvZnR2ZXJyxZFsIGtlcmVzc2UgZmVsIGEgJywKICAgICdlbFJURSB3ZWJzaXRlJyA6ICdlbFJURSBob25sYXBqw6F0JyAKICAgIAogICAgCn0KfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.it.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEl0YWxpYW4gdHJhbnNsYXRpb24KICogQGF1dGhvciBVZ28gUHVuem9sbyA8c2FkcmFjemVyb3Vub0BnbWFpbC5jb20+CiAqIEB2ZXJzaW9uIDIwMTAtMDktMjAKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5pMThNZXNzYWdlcy5pdCA9IHsKCSdFZGl0b3InIDogJ0VkaXRvcicsCgknU291cmNlJyA6ICdDb2RpY2UgU29yZ2VudGUnLAoJLy8gUGFuZWwgTmFtZQoJJ0NvcHkvUGFzZScgICAgICA6ICdDb3BpYS9JbmNvbGxhJywKCSdVbmRvL1JlZG8nICAgICAgOiAnQW5udWxsYS9SaXByaXN0aW5hJywKCSdUZXh0IHN0eWxlcycgICAgOiAnU3RpbGUgZGVsIHRlc3RvJywKCSdDb2xvcnMnICAgICAgICAgOiAnQ29sb3JpJywKCSdBbGlnbm1lbnQnICAgICAgOiAnQWxsaW5lYW1lbnRvJywKCSdJbmRlbnQvT3V0ZGVudCcgOiAnQXVtZW50YS9SaWR1Y2kgaW5kZW50YXppb25lJywKCSdUZXh0IGZvcm1hdCcgICAgOiAnRm9ybWF0byBkZWwgdGVzdG8nLAoJJ0xpc3RzJyAgICAgICAgICA6ICdMaXN0ZScsCgknTWlzYyBlbGVtZW50cycgIDogJ0VsZW1lbnRpIHZhcmknLAoJJ0xpbmtzJyAgICAgICAgICA6ICdDb2xsZWdhbWVudGknLAoJJ0ltYWdlcycgICAgICAgICA6ICdJbW1hZ2luaScsCgknTWVkaWEnICAgICAgICAgIDogJ011bHRpbWVkaWEnLAoJJ1RhYmxlcycgICAgICAgICA6ICdUYWJlbGxlJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAnRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknLAoJLy8gYnV0dG9uIG5hbWVzCgknU2F2ZScgICAgICAgICAgICAgICAgICAgIDogJ1NhbHZhJywKCSdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAnQ29waWEnLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICdUYWdsaWEnLAoJJ1Bhc3RlJyAgICAgICAgICAgICAgICAgICA6ICdJbmNvbGxhJywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAnSW5jb2xsYSBzb2xvIHRlc3RvJywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAnSW5jb2xsYSB0ZXN0byBmb3JtYXR0YXRvJywKCSdDbGVhbiBmb3JtYXQnICAgICAgICAgICAgOiAnUHVsaXNjaSBmb3JtYXRvJywKCSdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAnQW5udWxsYSB1bHRpbWEgYXppb25lJywKCSdSZWRvIHByZXZpb3VzIGFjdGlvbicgICAgOiAnUmlwcmlzdGluYSB1bHRpbWEgYXppb25lJywKCSdCb2xkJyAgICAgICAgICAgICAgICAgICAgOiAnTmVyZXR0bycsCgknSXRhbGljJyAgICAgICAgICAgICAgICAgIDogJ0NvcnNpdm8nLAoJJ1VuZGVybGluZScgICAgICAgICAgICAgICA6ICdTb3R0b2xpbmVhdG8nLAoJJ1N0cmlrZXRocm91Z2gnICAgICAgICAgICA6ICdCYXJyYXRvJywKCSdTdXBlcnNjcmlwdCcgICAgICAgICAgICAgOiAnSW5kaWNlJywKCSdTdWJzY3JpcHQnICAgICAgICAgICAgICAgOiAnUGVkaWNlL0RlcG9uZW50ZScsCgknQWxpZ24gbGVmdCcgICAgICAgICAgICAgIDogJ0FsbGluZWEgYSBzaW5pc3RyYScsCgknQWlsZ24gcmlnaHQnICAgICAgICAgICAgIDogJ0FsbGluZWEgYSBkZXN0cmEnLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICdDZW50cmEnLAoJJ0FsaWduIGZ1bGwnICAgICAgICAgICAgICA6ICdHaXVzdGlmaWNhJywKCSdGb250IGNvbG9yJyAgICAgICAgICAgICAgOiAnQ29sb3JlIGRlbCB0ZXN0bycsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ0NvbG9yZSBkaSBzZm9uZG8nLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICdBdW1lbnRhIGluZGVudGF6aW9uZScsCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ1JpZHVjaSBpbmRlbnRhemlvbmUnLAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICdGb3JtYXRvJywKCSdGb250IHNpemUnICAgICAgICAgICAgICAgOiAnR3JhbmRlenphIGNhcmF0dGVyaScsCgknRm9udCcgICAgICAgICAgICAgICAgICAgIDogJ0NhcmF0dGVyZScsCgknT3JkZXJlZCBsaXN0JyAgICAgICAgICAgIDogJ0xpc3RhIG9yZGluYXRhJywKCSdVbm9yZGVyZWQgbGlzdCcgICAgICAgICAgOiAnTGlzdGEgbm9uIG9yZGluYXRhJywKCSdIb3Jpem9udGFsIHJ1bGUnICAgICAgICAgOiAnTGluZWEgb3JpenpvbnRhbGUnLAoJJ0Jsb2NrcXVvdGUnICAgICAgICAgICAgICA6ICdDaXRhemlvbmUnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICdCbG9jY28gZWxlbWVudG8gKERJViknLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICdDb2xsZWdhbWVudG8nLAoJJ0RlbGV0ZSBsaW5rJyAgICAgICAgICAgICA6ICdFbGltaW5hIGNvbGxlZ2FtZW50bycsCgknQm9va21hcmsnICAgICAgICAgICAgICAgIDogJ1NlZ25hbGlicm8nLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICdJbW1hZ2luZScsCgknVGFibGUnICAgICAgICAgICAgICAgICAgIDogJ1RhYmVsbGEnLAoJJ0RlbGV0ZSB0YWJsZScgICAgICAgICAgICA6ICdFbGltaW5hIHRhYmVsbGEnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICdJbnNlcmlzY2kgcmlnYSBzb3ByYScsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ0luc2VyaXNjaSByaWdhIHNvdHRvJywKCSdEZWxldGUgcm93JyAgICAgICAgICAgICAgOiAnRWxpbWluYSByaWdhJywKCSdJbnNlcnQgY29sdW1uIGJlZm9yZScgICAgOiAnSW5zZXJpc2NpIGNvbG9ubmEgYSBzaW5pc3RyYScsCgknSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ0luc2VyaXNjaSBjb2xvbm5hIGEgZGVzdHJhJywKCSdEZWxldGUgY29sdW1uJyAgICAgICAgICAgOiAnRWxpbWluYSBjb2xvbm5hJywKCSdNZXJnZSB0YWJsZSBjZWxscycgICAgICAgOiAnVW5pc2NpIGNlbGxlJywKCSdTcGxpdCB0YWJsZSBjZWxsJyAgICAgICAgOiAnU2VwYXJhIGNlbGxlJywKCSdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnIDogJ1Bhc3NhIGFsbGEgbW9kYWxpdCZhZ3JhdmU7ICJ2aXN1YWxpenphemlvbmUgc3RydXR0dXJhIGRlbCBkb2N1bWVudG8iJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAnUHJvcHJpZXQmYWdyYXZlOyBjZWxsZScsCgknVGFibGUgcHJvcGVydGllcycgICAgICAgIDogJ1Byb3ByaWV0JmFncmF2ZTsgdGFiZWxsYScsCgknVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUnIDogJ1Bhc3NhIGFsbGEgbW9kYWxpdCZhZ3JhdmU7ICJzY2hlcm1vIGludGVybyInLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICdBcHJpIGlsIGZpbGUgbWFuYWdlcicsCgknTm9uIGJyZWFrYWJsZSBzcGFjZScgICAgIDogJ1NwYXppbyBub24gZGl2aXNpYmlsZScsCgknU3RvcCBlbGVtZW50IGZsb2F0aW5nJyAgIDogJ0Jsb2NjYSBlbGVtZW50byBmbHV0dHVhbnRlJywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICdBdHRlbnppb25lJywKCSdQcm9wZXJpZXMnIDogJ1Byb3ByaWV0JmFncmF2ZTsnLAoJJ1BvcHVwJyA6ICdQb3B1cCcsCgknQWR2YW5jZWQnIDogJ0F2YW56YXRlJywKCSdFdmVudHMnIDogJ0V2ZW50aScsCgknV2lkdGgnIDogJ0xhcmdoZXp6YScsCgknSGVpZ2h0JyA6ICdBbHRlenphJywKCSdMZWZ0JyAgIDogJ1NpbmlzdHJhJywKCSdDZW50ZXInIDogJ0NlbnRybycsCgknUmlnaHQnICA6ICdEZXN0cmEnLAoJJ0JvcmRlcicgOiAnQm9yZG8nLAoJJ0JhY2tncm91bmQnIDogJ1Nmb25kbycsCgknQ3NzIGNsYXNzJyA6ICdDbGFzc2UgQ1NTJywKCSdDc3Mgc3R5bGUnIDogJ1N0aWxlIENTUycsCgknTm8nIDogJ05vJywKCSdUaXRsZScgOiAnVGl0b2xvJywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICdEaXJlemlvbmUgZGVsbG8gc2NyaXB0JywKCSdMYW5ndWFnZScgOiAnTGluZ3VhJywKCSdDaGFyc2V0JyA6ICdDaGFyc2V0JywKCSdOb3Qgc2V0JyA6ICdOb24gc2V0dGF0bycsCgknTGVmdCB0byByaWdodCcgOiAnRGEgc2luaXN0cmEgYSBkZXN0cmEnLAoJJ1JpZ2h0IHRvIGxlZnQnIDogJ0RhIGRlc3RyYSBhIHNpbmlzdHJhJywKCSdJbiB0aGlzIHdpbmRvdycgOiAnSW4gcXVlc3RhIGZpbmVzdHJhIChfc2VsZiknLAoJJ0luIG5ldyB3aW5kb3cgKF9ibGFuayknIDogJ0luIHVuYSBudW92YSBmaW5lc3RyYSAoX2JsYW5rKScsCgknSW4gbmV3IHBhcmVudCB3aW5kb3cgKF9wYXJlbnQpJyA6ICdJbiB1bmEgbnVvdmEgZmluZXN0cmEgbWFkcmUgKF9wYXJlbnQpJywKCSdJbiB0b3AgZnJhbWUgKF90b3ApJyA6ICdJbiBhbHRvIGFsIGZyYW1lIChfdG9wKScsCgknVVJMJyA6ICdVUkwnLAoJJ09wZW4gaW4nIDogJ0FwcmkgaW4nLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAnUXVlc3RhIG9wZXJhemlvbmUgJmVncmF2ZTsgZGlzYWJpbGl0YXRhIG5lbCB0dW8gYnJvd3NlciBwZXIgbW90aXZpIGRpIHNpY3VyZXp6YS4gUHVvaSBjb211bnF1ZSB1dGlsaXp6YXJlIHVuIGNvbWFuZG8gZGEgdGFzdGllcmEuJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ0ludGVzdGF6aW9uZSAxJywKCSdIZWFkaW5nIDInIDogJ0ludGVzdGF6aW9uZSAyJywKCSdIZWFkaW5nIDMnIDogJ0ludGVzdGF6aW9uZSAzJywKCSdIZWFkaW5nIDQnIDogJ0ludGVzdGF6aW9uZSA0JywKCSdIZWFkaW5nIDUnIDogJ0ludGVzdGF6aW9uZSA1JywKCSdIZWFkaW5nIDYnIDogJ0ludGVzdGF6aW9uZSA2JywKCSdQYXJhZ3JhcGgnIDogJ1BhcmFncmFmbycsCgknQWRkcmVzcycgOiAnSW5kaXJpenpvJywKCSdQcmVmb3JtYXR0ZWQnIDogJ1ByZWZvcm1hdHRhdG8nLAoJLy8gZm9udCBzaXplCgknU21hbGwgKDhwdCknICAgOiAnUGljY29sbyAoOHB0KScsCgknU21hbGwgKDEwcHgpJyAgOiAnUGljY29sbyAoMTBweCknLAoJJ1NtYWxsICgxMnB0KScgIDogJ1BpY2NvbG8gKDEycHQpJywKCSdOb3JtYWwgKDE0cHQpJyA6ICdOb3JtYWxlICgxNHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAnR3JhbmRlICgxOHB0KScsCgknTGFyZ2UgKDI0cHQpJyAgOiAnR3JhbmRlICgyNHB0KScsCgknTGFyZ2UgKDM2cHQpJyAgOiAnR3JhbmRlICgzNnB0KScsCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ05vbWUgZGVsIHNlZ25hbGlicm8nLAoJLy8gbGluawoJJ0xpbmsgVVJMJyA6ICdVUkwgZGVsIGNvbGxlZ2FtZW50bycsCgknVGFyZ2V0JyA6ICdUYXJnZXQnLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ0FwcmkgaWwgbGluayBpbiB1bmEgZmluZXN0cmEgcG9wdXAnLAoJJ1dpbmRvdyBuYW1lJyA6ICdOb21lIGRlbGxhIGZpbmVzdHJhJywKCSdXaW5kb3cgc2l6ZScgOiAnRGltZW5zaW9uaSBkZWxsYSBmaW5lc3RyYScsCgknV2luZG93IHBvc2l0aW9uJyA6ICdQb3NpemlvbmUgZGVsbGEgZmluZXN0cmEnLAoJJ0xvY2F0aW9uIGJhcicgOiAnQmFycmEgZGlyZXppb25hbGUnLAoJJ01lbnUgYmFyJyA6ICdCYXJyYSBkZWwgbWVudScsCgknVG9vbGJhcicgOiAnQmFycmEgZGVnbGkgc3RydW1lbnRpJywKCSdTY3JvbGxiYXJzJyA6ICdCYXJyYSBkaSBzY29ycmltZW50bycsCgknU3RhdHVzIGJhcicgOiAnQmFycmEgZGkgc3RhdG8nLAoJJ1Jlc2l6YWJsZScgOiAnUmlkaW1lbnNpb25hYmlsZScsCgknRGVwZWRlbnQnIDogJ0RpcGVuZGVudGUgKE5ldHNjYXBlKScsCgknQWRkIHJldHVybiBmYWxzZScgOiAnQWdnaXVuZ2kgY29uZGl6aW9uZSBmYWxzYSAocmV0dXJuIGZhbHNlKScsCgknVGFyZ2V0IE1JTUUgdHlwZScgOiAnT2JpZXR0aXZvIGRlbCB0aXBvIGRpIE1JTUUgKE1JTUUgdHlwZSknLAoJJ1JlbGF0aW9uc2hpcCBwYWdlIHRvIHRhcmdldCAocmVsKScgOiAnRGFsbGEgcGFnaW5hIGNvcnJlbGF0YSBhbGxcJ29iaWV0dGl2bycsCgknUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpJyA6ICdEYWxsXCdvYmlldHRpdm8gYWxsYSBwYWdpbmEgY29ycmVsYXRhJywKCSdUYWIgaW5kZXgnIDogJ0luZGljZSBkaSB0YWJ1bGF6aW9uZScsCgknQWNjZXNzIGtleScgOiAnQ2hpYXZlIGRpIGFjY2Vzc28nLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICdEaW1lbnNpb25lJywKCSdQcmV2aWV3JyA6ICdBbnRlcHJpbWEnLAoJJ01hcmdpbnMnIDogJ01hcmdpbmknLAoJJ0FsdCB0ZXh0JyA6ICdUZXN0byBhbHRlcm5hdGl2bycsCgknSW1hZ2UgVVJMJyA6ICdVUkwgZGVsbFwnaW1tYWdpbmUnLAoJLy8gdGFibGUKCSdTcGFjaW5nJyAgICAgICA6ICdTcGF6aWF0dXJhIChTcGFjaW5nKScsCgknUGFkZGluZycgICAgICAgOiAnUmllbXBpbWVudG8gKFBhZGRpbmcpJywKCSdSb3dzJyAgICAgICAgICA6ICdSaWdoZScsCgknQ29sdW1ucycgICAgICAgOiAnQ29sb25uZScsCgknR3JvdXBzJyAgICAgICAgOiAnR3J1cHBpJywKCSdDZWxscycgICAgICAgICA6ICdDZWxsZScsCgknQ2FwdGlvbicgICAgICAgOiAnRGlkYXNjYWxpYScsCgknSW5uZXIgYm9yZGVycycgOiAnQm9yZGkgaW50ZXJuaScKCQoJCn0KfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.jp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEphcGFuZXNlIHRyYW5zbGF0aW9uCiAqIEBhdXRob3IgVG9tb2FraSBZb3NoaWRhIDxpbmZvQHlvc2hpZGEtc3R1ZGlvLmpwPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuanAgPSB7CgknRWRpdG9yJyA6ICfjgqjjg4fjgqPjgr/jg7wnLAoJJ1NvdXJjZScgOiAn44K944O844K5JywKCS8vIFBhbmVsIE5hbWUKCSdDb3B5L1Bhc2UnICAgICAgOiAn44Kz44OU44O8L+ODmuODvOOCueODiCcsCgknVW5kby9SZWRvJyAgICAgIDogJ+WFg+OBq+aIu+OBmS/jgoTjgornm7TjgZcnLAoJJ1RleHQgc3R5bGVzJyAgICA6ICfjg4bjgq3jgrnjg4jjgrnjgr/jgqTjg6snLAoJJ0NvbG9ycycgICAgICAgICA6ICfoibInLAoJJ0FsaWdubWVudCcgICAgICA6ICfooYzmj4PjgYgnLAoJJ0luZGVudC9PdXRkZW50JyA6ICfjgqTjg7Pjg4fjg7Pjg4gv44Ki44Km44OI44OH44Oz44OIJywKCSdUZXh0IGZvcm1hdCcgICAgOiAn44OG44Kt44K544OI44OV44Kp44O844Oe44OD44OIJywKCSdMaXN0cycgICAgICAgICAgOiAn44Oq44K544OIJywKCSdNaXNjIGVsZW1lbnRzJyAgOiAn44Gd44Gu5LuWJywKCSdMaW5rcycgICAgICAgICAgOiAn44Oq44Oz44KvJywKCSdJbWFnZXMnICAgICAgICAgOiAn55S75YOPJywKCSdNZWRpYScgICAgICAgICAgOiAn44Oh44OH44Kj44KiJywKCSdUYWJsZXMnICAgICAgICAgOiAn44OG44O844OW44OrJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAn44OV44Kh44Kk44Or44Oe44ON44O844K444OjKGVsRmluZGVyKScsCgkvLyBidXR0b24gbmFtZXMKCSdBYm91dCB0aGlzIHNvZnR3YXJlJyAgICAgOiAn44GT44Gu44K944OV44OI44Km44Kn44Ki44Gr44Gk44GE44GmJywKCSdTYXZlJyAgICAgICAgICAgICAgICAgICAgOiAn5L+d5a2YJywKCSdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAn44Kz44OU44O8JywKCSdDdXQnICAgICAgICAgICAgICAgICAgICAgOiAn5YiH44KK5Y+W44KKJywKCSdQYXN0ZScgICAgICAgICAgICAgICAgICAgOiAn6LK844KK5LuY44GRJywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAn44OG44Kt44K544OI44Gu44G/6LK844KK5LuY44GRJywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAn44OV44Kp44O844Oe44OD44OI44GV44KM44Gf44OG44Kt44K544OI44Gu6LK844KK5LuY44GRJywKCSdDbGVhbiBmb3JtYXQnICAgICAgICAgICAgOiAn44OV44Kp44O844Oe44OD44OI5raI5Y67JywgCgknVW5kbyBsYXN0IGFjdGlvbicgICAgICAgIDogJ+WFg+OBq+aIu+OBmScsCgknUmVkbyBwcmV2aW91cyBhY3Rpb24nICAgIDogJ+OChOOCiuebtOOBlycsCgknQm9sZCcgICAgICAgICAgICAgICAgICAgIDogJ+WkquWtlycsCgknSXRhbGljJyAgICAgICAgICAgICAgICAgIDogJ+aWnOS9kycsCgknVW5kZXJsaW5lJyAgICAgICAgICAgICAgIDogJ+S4i+e3micsCgknU3RyaWtldGhyb3VnaCcgICAgICAgICAgIDogJ+aJk+OBoea2iOOBl+e3micsCgknU3VwZXJzY3JpcHQnICAgICAgICAgICAgIDogJ+S4iuS7mOOBjeaWh+WtlycsCgknU3Vic2NyaXB0JyAgICAgICAgICAgICAgIDogJ+a3u+OBiOWtlycsCgknQWxpZ24gbGVmdCcgICAgICAgICAgICAgIDogJ+W3puaPg+OBiCcsCgknQWlsZ24gcmlnaHQnICAgICAgICAgICAgIDogJ+WPs+aPg+OBiCcsCgknQWxpZ24gY2VudGVyJyAgICAgICAgICAgIDogJ+S4reWkruaPg+OBiCcsCgknQWxpZ24gZnVsbCcgICAgICAgICAgICAgIDogJ+S4oeerr+aPg+OBiCcsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ+ODhuOCreOCueODiOiJsicsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ+iDjOaZr+iJsicsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ+OCpOODs+ODh+ODs+ODiCcsIAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICfjgqLjgqbjg4jjg4fjg7Pjg4gnLCAKCSdGb3JtYXQnICAgICAgICAgICAgICAgICAgOiAn44OV44Kp44O844Oe44OD44OIJywKCSdGb250IHNpemUnICAgICAgICAgICAgICAgOiAn44K144Kk44K6JywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAn44OV44Kp44Oz44OIJywKCSdPcmRlcmVkIGxpc3QnICAgICAgICAgICAgOiAn5q616JC955Wq5Y+3JywKCSdVbm9yZGVyZWQgbGlzdCcgICAgICAgICAgOiAn566H5p2h5pu444GNJywKCSdIb3Jpem9udGFsIHJ1bGUnICAgICAgICAgOiAn5qiq572r57eaJywKCSdCbG9ja3F1b3RlJyAgICAgICAgICAgICAgOiAn44OW44Ot44OD44Kv5byV55SoJywKCSdCbG9jayBlbGVtZW50IChESVYpJyAgICAgOiAn44OW44Ot44OD44Kv6KaB57SgIChESVYpJywKCSdMaW5rJyAgICAgICAgICAgICAgICAgICAgOiAn44Oq44Oz44KvJywKCSdEZWxldGUgbGluaycgICAgICAgICAgICAgOiAn44Oq44Oz44Kv5YmK6ZmkJywKCSdCb29rbWFyaycgICAgICAgICAgICAgICAgOiAn44Ki44Oz44Kr44O85oy/5YWlL+e3qOmbhicsCgknSW1hZ2UnICAgICAgICAgICAgICAgICAgIDogJ+OCpOODoeODvOOCuCcsCgknVGFibGUnICAgICAgICAgICAgICAgICAgIDogJ+ODhuODvOODluODqycsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ+ODhuODvOODluODq+WJiumZpCcsCgknSW5zZXJ0IHJvdyBiZWZvcmUnICAgICAgIDogJ+WJjeOBq+ihjOOCkuaMv+WFpScsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ+W+jOOCjeOBq+ihjOOCkuaMv+WFpScsCgknRGVsZXRlIHJvdycgICAgICAgICAgICAgIDogJ+ihjOOCkuWJiumZpCcsCgknSW5zZXJ0IGNvbHVtbiBiZWZvcmUnICAgIDogJ+WJjeOBq+WIl+OCkuaMv+WFpScsCgknSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ+W+jOOCjeOBq+WIl+OCkuaMv+WFpScsCgknRGVsZXRlIGNvbHVtbicgICAgICAgICAgIDogJ+WIl+OCkuWJiumZpCcsCgknTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ+OCu+ODq+OCkue1kOWQiOOBmeOCiycsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ+OCu+ODq+OCkuWIhuWJsuOBmeOCiycsCgknVG9nZ2xlIGRpc3BsYXkgZG9jdW1lbnQgc3RydWN0dXJlJyA6ICfmp4vmiJDopoHntKDjga7ooajnpLonLAoJJ1RhYmxlIGNlbGwgcHJvcGVydGllcycgICA6ICfjg4bjg7zjg5bjg6vjgrvjg6vjg5fjg63jg5Hjg4bjgqMnLAoJJ1RhYmxlIHByb3BlcnRpZXMnICAgICAgICA6ICfjg4bjg7zjg5bjg6vjg5fjg63jg5Hjg4bjgqMnLAoJJ1RvZ2dsZSBmdWxsIHNjcmVlbiBtb2RlJyA6ICfmnIDlpKfljJYnLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICfjg5XjgqHjgqTjg6vjg57jg43jg7zjgrjjg6PjgpLplovjgY8nLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICfmlLnooYzjgarjgZfjgrnjg5rjg7zjgrknLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgICA6ICfjg5Xjg63jg7zjg4jjga7op6PpmaQnLAoJLy8gZGlhbG9ncwoJJ1dhcm5pbmcnIDogJ+itpuWRiicsCgknUHJvcGVyaWVzJyA6ICfjg5fjg63jg5Hjg4bjgqMnLAoJJ1BvcHVwJyA6ICfjg53jg4Pjg5fjgqLjg4Pjg5cnLAoJJ0FkdmFuY2VkJyA6ICfjgqLjg4njg5Djg7PjgrknLAoJJ0V2ZW50cycgOiAn44Kk44OZ44Oz44OIJywKCSdXaWR0aCcgOiAn5bmFJywKCSdIZWlnaHQnIDogJ+mrmOOBlScsCgknTGVmdCcgICA6ICflt6YnLAoJJ0NlbnRlcicgOiAn5Lit5aSuJywKCSdSaWdodCcgIDogJ+WPsycsCgknQm9yZGVyJyA6ICfjg5zjg7zjg4Djg7wnLAoJJ0JhY2tncm91bmQnIDogJ+iDjOaZrycsCgknQ3NzIGNsYXNzJyA6ICdDU1MgY2xhc3MnLAoJJ0NzcyBzdHlsZScgOiAnQ1NTIHN0eWxlJywKCSdObycgOiAnTm8nLAoJJ1RpdGxlJyA6ICfjgr/jgqTjg4jjg6snLAoJJ1NjcmlwdCBkaXJlY3Rpb24nIDogJ+aWh+Wtl+ihqOiomOaWueWQkScsCgknTGFuZ3VhZ2UnIDogJ+iogOiqnicsCgknQ2hhcnNldCcgOiAnQ2hhcnNldCcsCgknTm90IHNldCcgOiAn6Kit5a6a44GX44Gq44GEJywKCSdMZWZ0IHRvIHJpZ2h0JyA6ICflt6bjgYvjgonlj7MnLAoJJ1JpZ2h0IHRvIGxlZnQnIDogJ+WPs+OBi+OCieW3picsCgknSW4gdGhpcyB3aW5kb3cnIDogJ+WQjOOBmOOCpuOCo+ODs+ODieOCpiAoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICfmlrDjgZfjgYTjgqbjgqPjg7Pjg4njgqYgKF9ibGFuayknLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KScgOiAn5paw44GX44GE6Kaq44Km44Kj44Oz44OJ44KmIChfcGFyZW50KScsCgknSW4gdG9wIGZyYW1lIChfdG9wKScgOiAn44OI44OD44OX44OV44Os44O844OgIChfdG9wKScsCgknVVJMJyA6ICdVUkwnLAoJJ09wZW4gaW4nIDogJ09wZW4gaW4nLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAn44GT44Gu5qmf6IO944Gv44GK5L2/44GE44Gu44OW44Op44Km44K244Gn44Gv44K744Kt44Ol44Oq44OG44Kj44Gu6Kaz54K544GL44KJ44GU5Yip55So44Gn44GN44G+44Gb44KT44CC44K344On44O844OI44Kr44OD44OI44KS44GU5Yip55So44GP44Gg44GV44GE44CCJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ+imi+WHuuOBlzEnLAoJJ0hlYWRpbmcgMicgOiAn6KaL5Ye644GXMicsCgknSGVhZGluZyAzJyA6ICfopovlh7rjgZczJywKCSdIZWFkaW5nIDQnIDogJ+imi+WHuuOBlzQnLAoJJ0hlYWRpbmcgNScgOiAn6KaL5Ye644GXNScsCgknSGVhZGluZyA2JyA6ICfopovlh7rjgZc2JywKCSdQYXJhZ3JhcGgnIDogJ+auteiQvScsCgknQWRkcmVzcycgOiAn44Ki44OJ44Os44K5JywKCSdQcmVmb3JtYXR0ZWQnIDogJycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICflsI8oOHB0KScsCgknU21hbGwgKDEwcHgpJyAgOiAn5bCPKDEwcHQpJywKCSdTbWFsbCAoMTJwdCknICA6ICflsI8oMTJwdCknLAoJJ05vcm1hbCAoMTRwdCknIDogJ+S4rSgxNHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAn5aSnKDE4cHQpJywKCSdMYXJnZSAoMjRwdCknICA6ICflpKcoMjRwdCknLAoJJ0xhcmdlICgzNnB0KScgIDogJ+WkpygzNnB0KScsCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ+OCouODs+OCq+ODvOWQjScsCgkvLyBsaW5rCgknTGluayBVUkwnIDogJyhVUkwpJywKCSdUYXJnZXQnIDogJ+OCv+ODvOOCsuODg+ODiCcsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdycgOiAn44Oq44Oz44Kv5YWI44KS44Od44OD44OX44Ki44OD44OX44Gn6ZaL44GPJywKCSdVUkwnIDogJ1VSTCcsCgknV2luZG93IG5hbWUnIDogJ+OCpuOCo+ODs+ODieOCpuWQjScsCgknV2luZG93IHNpemUnIDogJ+OCpuOCo+ODs+ODieOCpuOCteOCpOOCuicsCgknV2luZG93IHBvc2l0aW9uJyA6ICfjgqbjgqPjg7Pjg4njgqbkvY3nva4nLAoJJ0xvY2F0aW9uIGJhcicgOiAn44Ot44Kx44O844K344On44Oz44OQ44O8JywKCSdNZW51IGJhcicgOiAn44Oh44OL44Ol44O844OQ44O8JywKCSdUb29sYmFyJyA6ICfjg4Tjg7zjg6vjg5Djg7wnLAoJJ1Njcm9sbGJhcnMnIDogJ+OCueOCr+ODreODvOODq+ODkOODvCcsCgknU3RhdHVzIGJhcicgOiAn44K544OG44O844K/44K544OQ44O8JywKCSdSZXNpemFibGUnIDogJ+OCteOCpOOCuuWPr+WkiScsCgknRGVwZWRlbnQnIDogJ+OCpuOCo+ODs+ODieOCpumAo+WLlScsCgknQWRkIHJldHVybiBmYWxzZScgOiAncmV0dXJuIGZhbHNl44KS5Yqg44GI44KLJywKCSdUYXJnZXQgTUlNRSB0eXBlJyA6ICdUYXJnZXQgTUlNRSB0eXBlJywKCSdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJ+ODmuODvOOCuOOBi+OCieOCv+ODvOOCsuODg+ODiOOBrumWouS/giAocmVsKScsCgknUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpJyA6ICfjgr/jg7zjgrLjg4Pjg4jjgYvjgonjg5rjg7zjgrjjga7plqLkv4IgKHJldiknLAoJJ1RhYiBpbmRleCcgOiAn44K/44OW44Kk44Oz44OH44OD44Kv44K5JywKCSdBY2Nlc3Mga2V5JyA6ICfjgqLjgq/jgrvjgrnjgq3jg7wnLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICfjgrXjgqTjgronLAoJJ1ByZXZpZXcnIDogJ+ODl+ODrOODk+ODpeODvCcsCgknTWFyZ2lucycgOiAn44Oe44O844K444OzJywKCSdBbHQgdGV4dCcgOiAn5Luj5pu/44OG44Kt44K544OIJywKCSdJbWFnZSBVUkwnIDogJ+eUu+WDj1VSTCcsCgkvLyB0YWJsZQoJJ1NwYWNpbmcnICAgICAgIDogJ+OCu+ODq+mWk+malCAoc3BhY2luZyknLAoJJ1BhZGRpbmcnICAgICAgIDogJ+OCu+ODq+WGheS9meeZvSAocGFkZGluZyknLAoJJ1Jvd3MnICAgICAgICAgIDogJ+ihjCcsCgknQ29sdW1ucycgICAgICAgOiAn5YiXJywKCSdHcm91cHMnICAgICAgICA6ICfjgrDjg6vjg7zjg5cnLAoJJ0NlbGxzJyAgICAgICAgIDogJ+OCu+ODqycsCgknQ2FwdGlvbicgICAgICAgOiAn44Kt44Oj44OX44K344On44OzJywKCSdJbm5lciBib3JkZXJzJyA6ICflhoXpg6jjg5zjg7zjg4Djg7wnLAoJLy8gYWJvdXQKCSdBYm91dCBlbFJURScgOiAnZWxSVEXjgavjgaTjgYTjgaYnLAoJJ1ZlcnNpb24nIDogJ+ODkOODvOOCuOODp+ODsycsCgknTGljZW5jZScgOiAn44Op44Kk44K744Oz44K5JywKCSdlbFJURSBpcyBhbiBvcGVuLXNvdXJjZSBKYXZhU2NyaXB0IGJhc2VkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJyA6ICdlbFJUReOBr0phdmFzY3JpcHTjg5njg7zjgrnjga7jgqrjg7zjg5fjg7Pjgr3jg7zjgrlXWVNJV1lHIEhUTUzjgqjjg4fjgqPjgr/jgafjgZnjgIInLAoJJ01haW4gZ29hbCBvZiB0aGUgZWRpdG9yIC0gc2ltcGxpZnkgd29yayB3aXRoIHRleHQgYW5kIGZvcm1hdGluZyAoSFRNTCkgb24gc2l0ZXMsIGJsb2dzLCBmb3J1bXMgYW5kIG90aGVyIG9ubGluZSBzZXJ2aWNlcy4nIDogJ+OBk+OBruOCqOODh+OCo+OCv+OBruS4u+OBquebrueahOOBr+OAgeOCpuOCp+ODluOCteOCpOODiOOAgeODluODreOCsOOAgeODleOCqeODvOODqeODoOOChOOBneOBruS7luOBruOCquODs+ODqeOCpOODs+OCteODvOODk+OCueOBruODhuOCreOCueODiOOBqEhUTUzjg5Xjgqnjg7zjg57jg4Pjg4jlhaXlipvkvZzmpa3jgpLjgrfjg7Pjg5fjg6vjgavjgZnjgovjgZPjgajjgafjgZnjgIInLAoJJ1lvdSBjYW4gdXNlIGl0IGluIGFueSBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsIHByb2plY3RzLicgOiAn5ZWG55So44O76Z2e5ZWG55So44Gr6Zai44KP44KJ44Ga44GU5Yip55So44GE44Gf44Gg44GR44G+44GZ44CCJywKCSdBdXRob3JzJyA6ICfokZfkvZzogIUnLAoJJ0NoaWVmIGRldmVsb3BlcicgOiAn44OB44O844OV44OH44OZ44Ot44OD44OR44O8JywKCSdEZXZlbG9wZXIsIHRlY2ggc3VwcG9ydCcgOiAn44OH44OZ44Ot44OD44OR44O844O744OG44Kv44OL44Kr44Or44K144Od44O844OIJywKCSdJbnRlcmZhY2UgZGVzaWduZXInIDogJ+OCpOODs+OCv+ODvOODleOCp+OCpOOCueODh+OCtuOCpOODiuODvCcsCgknU3BhbmlzaCBsb2NhbGl6YXRpb24nIDogJ+OCueODmuOCpOODs+iqnuWMluODreODvOOCq+ODqeOCpOOCvOODvOOCt+ODp+ODsycsCgknSmFwYW5lc2UgbG9jYWxpemF0aW9uJyA6ICfml6XmnKzoqp7ljJbjg63jg7zjgqvjg6njgqTjgrzjg7zjgrfjg6fjg7MnLAoJJ0xhdHZpYW4gbG9jYWxpemF0aW9uJyA6ICfjg6njg4jjg5PjgqLoqp7ljJbjg63jg7zjgqvjg6njgqTjgrzjg7zjgrfjg6fjg7MnLAoJJ0dlcm1hbiBsb2NhbGl6YXRpb24nIDogJ+ODieOCpOODhOiqnuWMluODreODvOOCq+ODqeOCpOOCvOODvOOCt+ODp+ODsycsCgknVWtyYW5pYW4gbG9jYWxpemF0aW9uJyA6ICfjgqbjgq/jg6njgqTjg4roqp7ljJbjg63jg7zjgqvjg6njgqTjgrzjg7zjgrfjg6fjg7MnLAoJJ0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc29mdHdhcmUgdmlzaXQgdGhlJyA6ICfmrKHjga5VUkzjgavjgabjgZPjga7jgr3jg5Xjg4jjgqbjgqfjgqLjga7jgojjgoroqbPjgZfjgYTmg4XloLHjgpLlhazplovjgZfjgabjgYTjgb7jgZnjgIInLAoJJ2VsUlRFIHdlYnNpdGUnIDogJ2VsUlRFIOOCpuOCp+ODluOCteOCpOODiCcKCQoJCn0KfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.lv.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIExhdHZpYW4gdHJhbnNsYXRpb24KICogQGF1dGhvciBVbGRpcyBQbG90acWGxaEgPHVsZGlzLnBsb3RpbnNAZ21haWwuY29tPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMubHYgPSB7CgknRWRpdG9yJyA6ICdSZWRha3RvcnMnLAoJJ1NvdXJjZScgOiAnSXplamFzIGtvZHMnLAoJLy8gcGFuZWwgbmFtZXMKCSdDb3B5L1Bhc2UnICAgICAgOiAnS29wxJN0L0lldmlldG90JywKCSdVbmRvL1JlZG8nICAgICAgOiAnQXRjZWx0L0F0a8SBcnRvdCBkYXJixKtidScsCgknVGV4dCBzdHlsZXMnICAgIDogJ1Rla3N0YSBzdGlsaScsCgknQ29sb3JzJyAgICAgICAgIDogJ0tyxIFzYScsCgknQWxpZ25tZW50JyAgICAgIDogJ0l6bMSrZHppbsSBxaFhbmEnLAoJJ0luZGVudC9PdXRkZW50JyA6ICdBdGvEgXBlcycsCgknVGV4dCBmb3JtYXQnICAgIDogJ0Zvcm1hdMSTxaFhbmEnLAoJJ0xpc3RzJyAgICAgICAgICA6ICdTYXJha3N0aScsCgknTWlzYyBlbGVtZW50cycgIDogJ0Rhxb7EgWRpIGVsZW1lbnRpJywKCSdMaW5rcycgICAgICAgICAgOiAnU2FpdGVzJywKCSdJbWFnZXMnICAgICAgICAgOiAnQXR0xJNsaScsCgknTWVkaWEnICAgICAgICAgIDogJ03Ek2RpanUgZmFpbGknLAoJJ1RhYmxlcycgICAgICAgICA6ICdUYWJ1bGFzJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAnRmFpbHUgcMSBcnZhbGRuaWVrcyAoZWxGaW5kZXIpJywKCS8vIGJ1dHRvbiBuYW1lcwoJJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICdTYWdsYWLEgXQnLAoJJ0NvcHknICAgICAgICAgICAgICAgICAgICA6ICdLb3DEk3QnLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICdJemdyaWV6dCcsCgknUGFzdGUnICAgICAgICAgICAgICAgICAgIDogJ0lldmlldG90JywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAnSWV2aWV0b3QgdGlrYWkgdGVrc3R1JywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAnSWV2aWV0b3QgZm9ybWF0xJN0dSB0ZWtzdHUnLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICdBdGNlbHQgZm9ybWF0xJPFoWFudScsIAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICdBdGNlbHQgcMSTZMSTam8gZGFyYsSrYnUnLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICdBdGvEgXJ0b3QgcMSTZMSTam8gZGFyYsSrYnUnLAoJJ0JvbGQnICAgICAgICAgICAgICAgICAgICA6ICdUcmVrbnJha3N0cycsCgknSXRhbGljJyAgICAgICAgICAgICAgICAgIDogJ1NsxKtwcmFrc3RzJywKCSdVbmRlcmxpbmUnICAgICAgICAgICAgICAgOiAnUGFzdsSrdHJvdHMnLAoJJ1N0cmlrZXRocm91Z2gnICAgICAgICAgICA6ICdJenN2xKt0cm90cycsCgknU3VwZXJzY3JpcHQnICAgICAgICAgICAgIDogJ0F1Z8WhcmFrc3RzJywKCSdTdWJzY3JpcHQnICAgICAgICAgICAgICAgOiAnQXBha8WhcmFrc3RzJywKCSdBbGlnbiBsZWZ0JyAgICAgICAgICAgICAgOiAnSXpsxKtkemluxIF0IHBhIGtyZWlzbyBtYWx1JywKCSdBaWxnbiByaWdodCcgICAgICAgICAgICAgOiAnSXpsxKtkemluxIF0IHBhIGxhYm8gbWFsdScsCgknQWxpZ24gY2VudGVyJyAgICAgICAgICAgIDogJ0NlbnRyxJN0JywKCSdBbGlnbiBmdWxsJyAgICAgICAgICAgICAgOiAnSXpsxKtkemluxIF0IHBhIG1hbMSBbScsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ8WgcmlmdGEga3LEgXNhJywKCSdCYWNrZ3JvdW5kIGNvbG9yJyAgICAgICAgOiAnRm9uYSBrcsSBc2EnLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICdQYWxpZWxpbsSBdCBhdGvEgXBpJywKCSdPdXRkZW50JyAgICAgICAgICAgICAgICAgOiAnU2FtYXppbsSBdCBhdGvEgXBpJywKCSdGb3JtYXQnICAgICAgICAgICAgICAgICAgOiAnRm9ybWF0xJPFoWFuYScsCgknRm9udCBzaXplJyAgICAgICAgICAgICAgIDogJ8WgcmlmdGEgbGllbHVtcycsCgknRm9udCcgICAgICAgICAgICAgICAgICAgIDogJ8WgcmlmdHMnLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICdOdW11csSTdHMgc2FyYWtzdHMnLAoJJ1Vub3JkZXJlZCBsaXN0JyAgICAgICAgICA6ICdOZW51bXVyxJN0cyBzYXJha3N0cycsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ0hvcml6b250xIFsxIEgbMSrbmlqYScsCgknQmxvY2txdW90ZScgICAgICAgICAgICAgIDogJ0NpdMSBdHMnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICdCbG9rYSBlbGVtZW50cyAoRElWKScsCgknTGluaycgICAgICAgICAgICAgICAgICAgIDogJ1NhaXRlJywKCSdEZWxldGUgbGluaycgICAgICAgICAgICAgOiAnRHrEk3N0IHNhaXRpJywKCSdCb29rbWFyaycgICAgICAgICAgICAgICAgOiAnR3LEgW1hdHrEq21lJywKCSdJbWFnZScgICAgICAgICAgICAgICAgICAgOiAnQXR0xJNscycsCgknVGFibGUnICAgICAgICAgICAgICAgICAgIDogJ1RhYnVsYScsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ0R6xJNzdCB0YWJ1bHUnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICdJZXZpZXRvdCByaW5kdSBwaXJtcycsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ0lldmlldG90IHJpbmR1IHDEk2MnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICdEesSTc3QgcmluZHUnLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICdJZXZpZXRvdCBrb2xvbm51IHBpcm1zJywKCSdJbnNlcnQgY29sdW1uIGFmdGVyJyAgICAgOiAnSWV2aWV0b3Qga29sb25udSBwxJNjJywKCSdEZWxldGUgY29sdW1uJyAgICAgICAgICAgOiAnRHrEk3N0IGtvbG9ubnUnLAoJJ01lcmdlIHRhYmxlIGNlbGxzJyAgICAgICA6ICdBcHZpZW5vdCBhaWxlcycsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ1NhZGFsxKt0IGFpbGknLAoJJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAnUsSBZMSrdCBkb2t1bWVudGEgc3RydWt0xatydS9uZXJlZHphbW9zIGVsZW1lbnR1cycsCgknVGFibGUgY2VsbCBwcm9wZXJ0aWVzJyAgIDogJ0FpbGVzIGllc3RhdMSranVtaScsCgknVGFibGUgcHJvcGVydGllcycgICAgICAgIDogJ1RhYnVsYXMgaWVzdGF0xKtqdW1pJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAnUGlsbnMgZWtyxIFucycsCgknT3BlbiBmaWxlIG1hbmFnZXInICAgICAgIDogJ0F0dsSTcnQgZmFpbHUgcMSBcnZhbGRuaWVrdScsCgknTm9uIGJyZWFrYWJsZSBzcGFjZScgICAgIDogJ05lcMSBcnRyYXVrdMSBIGF0c3RhcnBlJywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAnQXRzbMSTZ3QgZWxlbWVudHUgYXBrbMSBxaFhbnUgYXIgdGVrc3R1JywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICdVem1hbsSrYnUnLAoJJ1Byb3BlcmllcycgOiAnSWVzdGF0xKtqdW1pJywKCSdQb3B1cCcgOiAnSmF1bnMgbG9ncycsCgknQWR2YW5jZWQnIDogJ1BhcGlsZHVzJywKCSdFdmVudHMnIDogJ05vdGlrdW1pJywKCSdXaWR0aCcgOiAnUGxhdHVtcycsCgknSGVpZ2h0JyA6ICdBdWdzdHVtcycsCgknTGVmdCcgICA6ICdQYSBrcmVzaScsCgknQ2VudGVyJyA6ICdQYSBjZW50cnUnLAoJJ1JpZ2h0JyAgOiAnUGEgbGFiaScsCgknQm9yZGVyJyA6ICdNYWxhJywKCSdCYWNrZ3JvdW5kJyA6ICdGb25zJywKCSdDc3MgY2xhc3MnIDogJ0NzcyBrbGFzZScsCgknQ3NzIHN0eWxlJyA6ICdDc3Mgc3RpbHMnLAoJJ05vJyA6ICdOxJMnLAoJJ1RpdGxlJyA6ICdWaXJzcmFrc3RzJywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICdWxJNzdHVsZXMgdmlyemllbnMnLAoJJ0xhbmd1YWdlJyA6ICdWYWxvZGEnLAoJJ0NoYXJzZXQnIDogJ0tvZMSTanVtcycsCgknTm90IHNldCcgOiAnTmF2IHV6c3TEgWTEq+KAoHMnLAoJJ0xlZnQgdG8gcmlnaHQnIDogJ05vIGtyZWlzxIFzIHV6IGxhYm8nLAoJJ1JpZ2h0IHRvIGxlZnQnIDogJ05vIGxhYsSBcyB1eiBrcmVpc28nLAoJJ0luIHRoaXMgd2luZG93JyA6ICdEb3RhasSBIGxvZ8SBJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICdKYXVuxIEgbG9nxIEgKF9ibGFuayknLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KScgOiAnVmVjxIFrdSBsb2fEgSAoX3BhcmVudCknLAoJJ0luIHRvcCBmcmFtZSAoX3RvcCknIDogJ0F1Z8WhxJNqxIEgcsSBbcSrIChfdG9wKScsCgknVVJMJyA6ICdVUkwnLAoJJ09wZW4gaW4nIDogJ0F0dsSTcnQnLAoJJ09wZW4gZmlsZSBtYW5nZXInIDogJ0F0dsSTcnQgZmFpbHUgcMSBcnZhbGRuaWVrdScsCgkvLyBjb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuJyA6ICdEb3TEgSBkYXJixKtiYSBqxatzdSBwxIFybMWra2FtIGlyIGxpZWd0YSBzYWlzdMSrYsSBIGFyIGRyb8WhxKtiYXMgYXNwZWt0aWVtLiBJem1hbnRvamlldCB0YXVzdGnFhnUga29tYmluxIFjaWp1LicsCgkvLyBmb3JtYXQgCgknSGVhZGluZyAxJyA6ICdWaXJzcmFrc3RzIDEnLAoJJ0hlYWRpbmcgMicgOiAnVmlyc3Jha3N0cyAyJywKCSdIZWFkaW5nIDMnIDogJ1ZpcnNyYWtzdHMgMycsCgknSGVhZGluZyA0JyA6ICdWaXJzcmFrc3RzIDQnLAoJJ0hlYWRpbmcgNScgOiAnVmlyc3Jha3N0cyA1JywKCSdIZWFkaW5nIDYnIDogJ1ZpcnNyYWtzdHMgNicsCQoJJ1BhcmFncmFwaCcgOiAnUGFyYWdyxIFmcycsCgknQWRkcmVzcycgOiAnQWRyZXNlJywKCSdQcmVmb3JtYXR0ZWQnIDogJycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICdTxKtrcyAoOHB0KScsCgknU21hbGwgKDEwcHgpJyAgOiAnTWF6cyAoMTBweCknLAoJJ1NtYWxsICgxMnB0KScgIDogJ05lbGllbHMgKDEycHQpJywKCSdOb3JtYWwgKDE0cHQpJyA6ICdQYXJhc3RzICgxNHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAnTGllbHMgKDE4cHQpJywKCSdMYXJnZSAoMjRwdCknICA6ICfEu290aSBsaWVscygyNHB0KScsCgknTGFyZ2UgKDM2cHQpJyAgOiAnTWlsesSrZ3MgKDM2cHQpJywJCQkJCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ0dyxIFtYXR6xKttZXMgdsSBcmRzJywKCS8vIGxpbmsKCSdMaW5rIFVSTCcgOiAnU2FpdGVzIGFkcmVzZSAoVVJMKScsCgknVGFyZ2V0JyA6ICdNxJNyxLdpcycsCgknU2VsZWN0IGJvb2ttYXJrJyA6ICdJenbEk2zEk3RpZXMgZ3LEgW1hdHrEq21pJywKCSdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JyA6ICdBdHbEk3J0IHNhaXRpIGphdW7EgSBsb2fEgScsCgknVVJMJyA6ICdVUkwnLAoJJ1dpbmRvdyBuYW1lJyA6ICdMb2dhIG5vc2F1a3VtcycsCgknV2luZG93IHNpemUnIDogJ0xvZ2EgaXptxJNycycsCgknV2luZG93IHBvc2l0aW9uJyA6ICdMb2dhIHBvesSrY2lqYScsCgknTG9jYXRpb24gYmFyJyA6ICdWaWV0YXMgcGFuZWxpcycsCgknTWVudSBiYXInIDogJ0l6dsSTbG5lcyBwYW5lbGlzJywKCSdUb29sYmFyJyA6ICdJbnN0cnVtZW50dSBwYW5lbGlzJywKCSdTY3JvbGxiYXJzJyA6ICdSaXRqb3NsYXMnLAoJJ1N0YXR1cyBiYXInIDogJ1N0xIF2b2vEvGEgcGFuZWxpcycsCgknUmVzaXphYmxlJyA6ICdJem3Ek3JhIGl6bWFpxYZhcycsCgknRGVwZWRlbnQnIDogJ0F0a2FyxKtncyAoTmV0c2NhcGUpJywKCSdBZGQgcmV0dXJuIGZhbHNlJyA6ICdQaWV2aWVub3QgKHJldHVybiBmYWxzZSknLAoJJ1RhcmdldCBNSU1FIHR5cGUnIDogJ01JTUUgdHlwZSBtxJNyxLdpJywKCSdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJ0xhcGFzIGF0dGllY8SrYmFhIHByZXQgbcSTcsS3aSAocmVsKScsCgknUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpJyA6ICdNxJNyxLdhIGF0dGllY8SrYmEgcHJldCBsYXB1IChyZXYpJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAnUGllZWphcyB0YXVzdGnFhsWhJywKCS8vIGltYWdlCgknU2l6ZScgOiAnSXptxJNycycsCgknUHJldmlldycgOiAnUHJpZWvFoXNrYXRzJywKCSdNYXJnaW5zJyA6ICdBdGvEgXBlcycsCgknQWx0IHRleHQnIDogJ0FwcmFrc3RhIHRla3N0cycsCgknSW1hZ2UgVVJMJyA6ICdCaWxkZXMgVVJMJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAnQXRzdGFycGUnLAoJJ1BhZGRpbmcnICAgICAgIDogJ0F0a8SBcGUnLAoJJ1Jvd3MnICAgICAgICAgIDogJ1JpbmRhcycsCgknQ29sdW1ucycgICAgICAgOiAnS29sb25uYXMnLAoJJ0dyb3VwcycgICAgICAgIDogJ0dydXBhcycsCgknQ2VsbHMnICAgICAgICAgOiAnQWlsZXMnLAoJJ0NhcHRpb24nICAgICAgIDogJ1RhYnVsYXMgdmlyc3Jha3N0cycsCgknSW5uZXIgYm9yZGVycycgOiAnSWVrxaHEk2rEgXMgcm9iZcW+YXMnLAoJLy8gdGFibGUgY2VsbAoJJ1RhYmxlIGNlbGwgdHlwZScgOiAnVGFidWxhcyBhaWxlcyB0aXBzJywKCSdEYXRhJyA6ICdEYXRpJywKCSdIZWFkZXInIDogJ1ZpcnNyYWtzdHMnLAoJJ0p1c3RpZnknIDogJ1BhIG1hbMSBbScsCgknUGFkZGluZ3MnIDogJ0F0a8SBcGVzJywKCSdBcHBseSB0bycgOiAnUGllbGlldG90IHV6JywKCSdDdXJyZW50IGNlbGwnIDogJ0l6dsSTbMSTdMSBIGFpbGUnLAoJJ0FsbCBjZWxscyBpbiByb3cnIDogJ1Zpc2FzIHJpbmRhcyBhaWxlcycsCgknQWxsIGNlbGxzIGluIGNvbHVtbicgOiAnVmlzYXMgc3RhYmnFhmEgYWlsZXMnLAoJJ0FsbCBjZWxscyBpbiB0YWJsZScgOiAnVmlzYXMgdGFidWxhcyBhaWxlcycKfQp9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.nl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIER1dGNoIHRyYW5zbGF0aW9uCiAqIEBhdXRob3IgS3VydCBBZXJ0cwogKiBAbGluayBodHRwOi8vaWxhYnNvbHV0aW9ucy5uZXQvCiAqIEB2ZXJzaW9uIDIwMTAtMDktMTgKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5pMThNZXNzYWdlcy5ubCA9IHsKCSdFZGl0b3InIDogJ0VkaXRvcicsCgknU291cmNlJyA6ICdCcm9uY29kZScsCi8vIFBhbmVsIG5hbWVzCgknQ29weSAvIFBhc2UnIDogJ0tvcGllZWVyIC8gUGxha2tlbicsCgknVW5kbyAvIFJlZG8nIDogJ09uZ2VkYWFuIG1ha2VuIC8gSGVyaGFsZW4gdHlwZW4nLAoJJ1RleHQgc3R5bGVzJyA6ICdUZWtzdCBzdGlqbGVuJywKCSdDb2xvcnMnOiAnS2xldXJlbjonLAoJJ0FsaWdubWVudCc6ICdBbGluZWEnLAoJJ0luZGVudCAvIE91dGRlbnQnOiAnJywKCSdUZXh0IGZvcm1hdCc6ICdUZWtzdCBvcG1hYWsnLAoJJ0xpc3RzJzogJ0xpanN0ZW4nLAoJJ01pc2MgZWxlbWVudHMnOiAnJywKCSdMaW5rcyc6ICdMaW5rcycsCgknSW1hZ2VzJzogJ0FmYmVlbGRpbmdlbicsCgknTWVkaWEnOiAnTWVkaWEnLAoJJ1RhYmxlcyc6ICdUYWJlbGxsZW4nLAoJJ0ZpbGUgbWFuYWdlciAoZWxGaW5kZXIpJyA6ICdCZXN0YW5kc21hbmFnZXIgKGVsRmluZGVyKScsCi8vIEJ1dHRvbiBuYW1lcwoJJ0Fib3V0IHRoaXMgc29mdHdhcmUnICAgICA6ICdPdmVyIGRlemUgc29mdHdhcmUnLAoJJ1NhdmUnOiAnT3BzbGFhbicsCgknQ29weSc6ICdLb3BpZWVyJywKCSdDdXQnOiAnS25pcCcsCgknUGFzdGUnOiAnUGxhaycsCgknUGFzdGUgb25seSB0ZXh0JzogJ1BsYWsgYWxsZWVuIHRla3N0JywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCc6ICdQbGFrIG9wZ2VtYWFrdGUgdGVrc3QnLAoJJ0NsZWFuIGZvcm1hdCc6ICdPcG1hYWsgb3BzY2hvbmVuJywKCSdVbmRvIGxhc3QgYWN0aW9uJzogJ01hYWsgbGFhc3RlIGFjdGllIG9uZ2VkYWFuJywKCSdSZWRvIHByZXZpb3VzIGFjdGlvbic6ICdIZXJkb2UgbGFhdHN0IGdlZGFuZSBhY3RpZScsCgknQm9sZCc6ICdWZXQnLAoJJ0l0YWxpYyc6ICdDdXJzaWVmJywKCSdVbmRlcmxpbmUnOiAnT25kZXJsaWpudCcsCgknU3RyaWtldGhyb3VnaCc6ICdEb29yc3RyZWVwdCcsCgknU3VwZXJzY3JpcHQnOiAnJywKCSdTdWJzY3JpcHQnOiAnJywKCSdBbGlnbiBsZWZ0JzogJ0xpbmtzIHVpdGxpam5lbicsCgknQWlsZ24gcmlnaHQnOiAnUmVjaHRzIHVpdGxpam5lbicsCgknQWxpZ24gY2VudGVyJzogJ0NlbnRyZXJlbicsCgknQWxpZ24gZnVsbCc6ICdVaXR2dWxsZW4nLAoJJ0ZvbnQgY29sb3InOiAnVGVrc3Qga2xldXInLAoJJ0JhY2tncm91bmQgY29sb3InOiAnQWNodGVyZ3JvbmQga2xldXInLAoJJ0luZGVudCc6ICdJbnNwcmluZ2luZyB2ZXJncm90ZW4nLAoJJ091dGRlbnQnOiAnSW5zcHJpbmdpbmcgVmVya2xlaW5lbicsCgknRm9ybWF0JzogJ09wbWFhaycsCgknRm9udCBzaXplJzogJ1Rla3N0IGdyb290dGUnLAoJJ0ZvbnQnOiAnTGV0dGVydHlwZScsCgknT3JkZXJlZCBsaXN0JzogJ0dlb3JkZW5kZSBsaWpzdCcsCgknVW5vcmRlcmVkIGxpc3QnOiAnT25nZW9yZGVuZGUgbGlqc3QnLAoJJ0hvcml6b250YWwgcnVsZSc6ICdIb3Jpem9udGFsZSByZWdlbCcsCgknQmxvY2txdW90ZSc6ICcnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICA6ICcnLAoJJ0xpbmsnOiAnTGluaycsCgknRGVsZXRlIGxpbmsnOiAnVmVyd2lqZGVyIG1vLGwnLAoJJ0Jvb2ttYXJrJzogJycsCgknSW1hZ2UnOiAnQWZiZWVsZGluZycsCgknVGFibGUnOiAnVGFiZWwnLAoJJ0RlbGV0ZSB0YWJsZSc6ICdWZXJ3aWpkZXIgdGFiZWwnLAoJJ0luc2VydCByb3cgYmVmb3JlJzogJ0ludm9lZ2VuIHZvb3IgcmlqJywKCSdJbnNlcnQgcm93IGFmdGVyJzogJ0ludm9lZ2VuIG5hIHJpaicsCgknRGVsZXRlIHJvdyc6ICdWZXJ3aWpkZXIgcmlqJywKCSdJbnNlcnQgY29sdW1uIGJlZm9yZSc6ICdJbnZvZWdlbiB2b29yIGtvbG9tJywKCSdJbnNlcnQgY29sdW1uIGFmdGVyJzogJ0ludm9lZ2VuIG5hIGtvbG9tJywKCSdEZWxldGUgY29sdW1uJzogJ1ZlcndpamRlciBrb2xvbScsCgknTWVyZ2UgdGFibGUgY2VsbHMnOiAnU2FtZW52b2VnZW4gdGFiZWwgY2VsbGVuJywKCSdTcGxpdCB0YWJsZSBjZWxsJzogJycsCgknVG9nZ2xlIGRpc3BsYXkgZG9jdW1lbnQgc3RydWN0dXJlJzogJycsCgknVGFibGUgY2VsbCBwcm9wZXJ0aWVzJzogJycsCgknVGFibGUgcHJvcGVydGllcyc6ICcnLAoJJ1RvZ2dsZSBmdWxsIHNjcmVlbiBtb2RlJyA6ICcodG9nZ2xlKSBWb2xsZWRpZyBzY2hlcm0nLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICdPcGVuIGJlc3RhbmRzbWFuYWdlcicsCgknTm9uIGJyZWFrYWJsZSBzcGFjZScgICA6ICcnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgOiAnJywKLy8gRGlhbG9ncwoJJ1dhcm5pbmcnOiAnV2FhcnNjaHV3aW5nJywKCSdQcm9wZXJpZXMnOiAnT3B0aWVzJywKCSdQb3B1cCc6ICdQb3B1cCcsCgknQWR2YW5jZWQnOiAnR2VhdmFuY2VlcmQnLAoJJ0V2ZW50cyc6ICdFdmVudHMnLAoJJ1dpZHRoJzogJ0JyZWVkdGUnLAoJJ0hlaWdodCc6ICdIb29ndGUnLAoJJ0xlZnQnICAgOiAnTGlua3MnLAoJJ0NlbnRlcicgOiAnTWlkZGVuJywKCSdSaWdodCcgIDogJ1JlY2h0cycsCgknQm9yZGVyJzogJ0JvcmRlcicsCgknQmFja2dyb3VuZCc6ICdBY2h0ZXJncm9uZCcsCgknQ3NzIGNsYXNzJzogJ0NzcyBDbGFzcycsCgknQ3NzIHN0eWxlJzogJ0NzcyBzdHlsZScsCgknTm8nOiAnTmVlJywKCSdUaXRsZSc6ICdUaXRlbCcsCgknU2NyaXB0IGRpcmVjdGlvbic6ICcnLAoJJ0xhbmd1YWdlJzogJ1RhYWwnLAoJJ0NoYXJzZXQnOiAnQ2hhcnNldCcsCgknTm90IHNldCc6ICdOaWV0IGdlemV0JywKCSdMZWZ0IHRvIHJpZ2h0JzogJ0xpbmtzIG5hYXIgcmVjaHRzJywKCSdSaWdodCB0byBsZWZ0JzogJ1JlY2h0cyBuYWFyIGxpbmsnLAoJJ0luIHRoaXMgd2luZG93JzogJ0luIGRpdCB2ZW5zdGVyJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJzogJ0luIG5pZXV3IHZlbnN0ZXIgKF9ibGFuayknLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KSc6ICdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknLAoJJ0luIHRvcCBmcmFtZSAoX3RvcCknOiAnSW4gdG9wIGZyYW1lIChfdG9wKScsCgknVVJMJzonJywKCSdPcGVuIGluJzogJ09wZW4gaW4nLAovLyBDb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuICcgOiAnRGV6ZSBvcGVyYXRpZSBpcyB1aXRnZXNjaGFrZWxkIGluIGpvdSBicm93c2VyIHZvb3IgYmV2ZWlsaWdpbmdzIHJlZGVuZW4uIEdlYnJ1aWsgZGUgc25lbGtvcHBlbGluZy4nLAovLyBGb3JtYXQKCSdIZWFkaW5nIDEnIDogJycsCgknSGVhZGluZyAyJyA6ICcnLAoJJ0hlYWRpbmcgMycgOiAnJywKCSdIZWFkaW5nIDQnIDogJycsCgknSGVhZGluZyA1JyA6ICcnLAoJJ0hlYWRpbmcgNicgOiAnJywKCSdQYXJhZ3JhcGgnIDogJycsCgknQWRkcmVzcycgOiAnJywKCSdQcmVmb3JtYXR0ZWQnOicnLAovLyBGb250IHNpemUKCSdTbWFsbCAoOHB0KSc6ICdLbGVpbnN0ICg4cHQpJywKCSdTbWFsbCAoMTBweCknOiAnS2xlaW5lciAoMTBweCknLAoJJ1NtYWxsICgxMnB0KSc6ICdLbGVpbiAoMTJwdCknLAoJJ05vcm1hbCAoMTRwdCknOiAnTm9ybWFhbCAoMTRwdCknLAoJJ0xhcmdlICgxOHB0KSc6ICdHcm9vdCAoMThwdCknLAoJJ0xhcmdlICgyNHB0KSc6ICdHcm90ZXIgKDI0cHQpJywKCSdMYXJnZSAoMzZwdCknOiAnR3Jvb3RzdCAoMzZwdCknLAovLyBCb29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnOiAnJywKLy8gTGluawoJJ0xpbmsgVVJMJzogJycsCgknVGFyZ2V0JzogJ0RvZWwnLAoJJ1NlbGVjdCBib29rbWFyaycgOiAnJywKCSdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JzogJycsCgknVVJMJzonJywKCSdXaW5kb3cgbmFtZSc6ICdWZW5zdGVyIG5hYW0nLAoJJ1dpbmRvdyBzaXplJzogJ1ZlbnN0ZXIgZ3Jvb3R0ZScsCgknV2luZG93IHBvc2l0aW9uJzogJ1ZlbnN0ZXIgUG9zaXRpZScsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdyc6ICdPcGVuIGxpbmsgaW4gZWVuIHBvcHVwIGVuc3RlcicsCgknTG9jYXRpb24gYmFyJzogJ0xvY2F0aWUgYmFsaycsCgknTWVudSBiYXInOiAnTWVudSBiYWxrJywKCSdUb29sYmFyJzogJ1Rvb2xiYXInLAoJJ1Njcm9sbGJhcnMnOiAnU2Nyb2xsYmFyJywKCSdTdGF0dXMgYmFyJzogJ1N0YXR1cyBiYWxrJywKCSdSZXNpemFibGUnOiAnU2NoYWFsYmFhcicsCgknRGVwZWRlbnQnOiAnJywKCSdBZGQgcmV0dXJuIGZhbHNlJzogJycsCgknVGFyZ2V0IE1JTUUgdHlwZSc6ICcnLAoJJ1JlbGF0aW9uc2hpcCBwYWdlIHRvIHRhcmdldCAocmVsKSc6ICcnLAoJJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KSc6ICcnLAoJJ1RhYiBpbmRleCc6JycsCgknQWNjZXNzIGtleSc6ICcnLAovLyBJbWFnZQoJJ1NpemUnOiAnR3Jvb3R0ZScsCgknUHJldmlldyc6ICdWb29yYmVlbGQnLAoJJ01hcmdpbnMnOiAnJywKCSdBbHQgdGV4dCc6ICdBbHQgdGVrc3QnLAoJJ0ltYWdlIFVSTCc6ICdBZmJlZWxkaW5nIFVSTCcsCi8vIFRhYmxlCgknU3BhY2luZycgICAgICAgOiAnJywKCSdQYWRkaW5nJyAgICAgICA6ICcnLAoJJ1Jvd3MnICAgICAgICAgIDogJycsCgknQ29sdW1ucycgICAgICAgOiAnJywKCSdHcm91cHMnICAgICAgICA6ICcnLAoJJ0NlbGxzJyAgICAgICAgIDogJycsCgknQ2FwdGlvbicgICAgICAgOiAnJywKCSdJbm5lciBib3JkZXJzJyA6ICcnICwKCS8vIHRhYmxlIGNlbGwKCSdUYWJsZSBjZWxsIHR5cGUnIDogJycsCgknRGF0YScgOiAnJywKCSdIZWFkZXInIDogJycsCgknSnVzdGlmeScgOiAnJywKCSdQYWRkaW5ncycgOiAnJywKCSdBcHBseSB0bycgOiAnVG9lcGFzc2VuIG9wJywKCSdDdXJyZW50IGNlbGwnIDogJ0h1aWRpZ2UgY2VsbCcsCgknQWxsIGNlbGxzIGluIHJvdycgOiAnQWxsZSBjZWxsZW4gaW4gcmlqJywKCSdBbGwgY2VsbHMgaW4gY29sdW1uJyA6ICdBbGxlIGNlbGxlbiBpbiBrb2xvbScsCgknQWxsIGNlbGxzIGluIHRhYmxlJyA6ICdBbGxlIGNlbGxlbiBpbiB0YWJlbCcsCgkvLyBhYm91dAoJJ0Fib3V0IGVsUlRFJyA6ICdPdmVyIGVsUlRFJywKCSdWZXJzaW9uJyA6ICdWZXJzaWUnLAoJJ0xpY2VuY2UnIDogJ0xpY2VudGllJywKCSdlbFJURSBpcyBhbiBvcGVuLXNvdXJjZSBKYXZhU2NyaXB0IGJhc2VkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJyA6ICdlbFJURSBpcyBlZW4gb3Blbi1zb3VyY2UgSmF2YXNjcmlwdCBnZWJhc3NlZXJkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJywKCSdNYWluIGdvYWwgb2YgdGhlIGVkaXRvciAtIHNpbXBsaWZ5IHdvcmsgd2l0aCB0ZXh0IGFuZCBmb3JtYXRpbmcgKEhUTUwpIG9uIHNpdGVzLCBibG9ncywgZm9ydW1zIGFuZCBvdGhlciBvbmxpbmUgc2VydmljZXMuJyA6ICdIb29mZGRvZWwgdmFuIGRlIGVkaXRvciAtIFNpbXBlbCB3ZWtyZW4gbWV0IHRla3N0IGVuIG9wbWFhayAoSFRNTCkgb3Agd2Vic2l0ZXMsIGZvcnVtcyBlbiBhbmRlcmUgb25saW5lIGRpZW5zdGVuLicsCgknWW91IGNhbiB1c2UgaXQgaW4gYW55IGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwgcHJvamVjdHMuJyA6ICdKZSBrYW4gaGV0IGdlYnJ1aWtlbiBpbiBjb21tZXJjaWVsZSBlbiBuaWV0IGNvbW1lcmljaWVsZSBwcm9qZWN0ZW4uJywKCSdBdXRob3JzJyA6ICdBdXRldXJzJywKCSdDaGllZiBkZXZlbG9wZXInIDogJycsCgknRGV2ZWxvcGVyLCB0ZWNoIHN1cHBvcnQnIDogJycsCgknSW50ZXJmYWNlIGRlc2lnbmVyJyA6ICcnLAoJJ1NwYW5pc2ggbG9jYWxpemF0aW9uJyA6ICcnLAoJJ0phcGFuZXNlIGxvY2FsaXphdGlvbicgOiAnJywKCSdMYXR2aWFuIGxvY2FsaXphdGlvbicgOiAnJywKCSdHZXJtYW4gbG9jYWxpemF0aW9uJyA6ICcnLAoJJ1VrcmFuaWFuIGxvY2FsaXphdGlvbicgOiAnJywKCSdGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNvZnR3YXJlIHZpc2l0IHRoZScgOiAnVm9vciBtZWVyIGluZm9ybWF0aWUgb3ZlciBkZXplIHNvZnR3YXJlIGJlem9layBkZScsCgknZWxSVEUgd2Vic2l0ZScgOiAnJwp9Owp9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.pl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFBvbGlzaCB0cmFuc2xhdGlvbgogKiBAYXV0aG9yIEFuZHJ6ZWogQm9yb3dpY3oKICogQHZlcnNpb24gMjAxMC0wOS0xOAogKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLmkxOE1lc3NhZ2VzLnBsID0gewoJJ0VkaXRvcicgOiAnRWR5dG9yJywKCSdTb3VyY2UnIDogJ0tvZCDFunLDs2TFgm93eScsCgkvLyBQYW5lbCBOYW1lCgknQ29weS9QYXNlJyAgICAgIDogJ0tvcGl1ai9Xa2xlaicsCgknVW5kby9SZWRvJyAgICAgIDogJ0NvZm5pai9Qb27Ds3cnLAoJJ1RleHQgc3R5bGVzJyAgICA6ICdTdHlsZSB0ZWtzdG93ZScsCgknQ29sb3JzJyAgICAgICAgIDogJ0tvbG9yJywKCSdBbGlnbm1lbnQnICAgICAgOiAnV3lyw7N3bmFuaWUnLAoJJ0luZGVudC9PdXRkZW50JyA6ICdXY2nEmWNpZSAvIHd5c3luacSZY2llJywKCSdUZXh0IGZvcm1hdCcgICAgOiAnRm9ybWF0JywKCSdMaXN0cycgICAgICAgICAgOiAnTGlzdGEnLAoJJ01pc2MgZWxlbWVudHMnICA6ICdJbm5lIGVsZW1lbnR5JywKCSdMaW5rcycgICAgICAgICAgOiAnTGluaycsCgknSW1hZ2VzJyAgICAgICAgIDogJ09icmF6JywKCSdNZWRpYScgICAgICAgICAgOiAnUGxpa2kgbXVsdGltZWRpYWxuZScsCgknVGFibGVzJyAgICAgICAgIDogJ1RhYmVsYScsCgknRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknIDogJ01lbmFkxbxlciBwbGlrw7N3IChlbEZpbmRlciknLAoJLy8gYnV0dG9uIG5hbWVzCgknU2F2ZScgICAgICAgICAgICAgICAgICAgIDogJ1phcGlzeicsCgknQ29weScgICAgICAgICAgICAgICAgICAgIDogJ1d5dG5paicsCgknQ3V0JyAgICAgICAgICAgICAgICAgICAgIDogJ0tvcGl1aicsCgknUGFzdGUnICAgICAgICAgICAgICAgICAgIDogJ1drbGVqJywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAnV2tsZWogdHlsa28gdGVrc3QnLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICdXa2xlaiB0ZWtzdCBzZm9ybWF0b3dhbnknLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICdXeWN6ecWbxIcgZm9ybWF0eScsIAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICdDb2ZuaWonLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICdQb27Ds3cnLAoJJ0JvbGQnICAgICAgICAgICAgICAgICAgICA6ICdQb2dyw7NiaWVuaWUnLAoJJ0l0YWxpYycgICAgICAgICAgICAgICAgICA6ICdLdXJzeXdhJywKCSdVbmRlcmxpbmUnICAgICAgICAgICAgICAgOiAnUG9ka3JlxZtsZW5pZScsCgknU3RyaWtldGhyb3VnaCcgICAgICAgICAgIDogJ1ByemVrcmXFm2xlbmllJywKCSdTdXBlcnNjcmlwdCcgICAgICAgICAgICAgOiAnSW5kZXggZ8Ozcm55JywKCSdTdWJzY3JpcHQnICAgICAgICAgICAgICAgOiAnaW5kZXggZG9sbnknLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICdXeXLDs3duYW5pZSBkbyBsZXdlaicsCgknQWlsZ24gcmlnaHQnICAgICAgICAgICAgIDogJ1d5csOzd25hbmllIGRvIHByYXdlaicsCgknQWxpZ24gY2VudGVyJyAgICAgICAgICAgIDogJ1d5Y2VudHJvd2FuaWUnLAoJJ0FsaWduIGZ1bGwnICAgICAgICAgICAgICA6ICdXeWp1c3Rvd2FuaWUnLAoJJ0ZvbnQgY29sb3InICAgICAgICAgICAgICA6ICdLb2xvciBjemNpb25raScsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ0tvbG9yIHTFgmEnLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICdXY2nEmWNpZScsIAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICdXeXN1bmnEmWNpZScsIAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICdGb3JtYXQnLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICdSb3ptaWFyIGN6Y2lvbmtpJywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAnQ3pjaW9ua2EnLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICdMaXN0YSBudW1lcm93YW5hJywKCSdVbm9yZGVyZWQgbGlzdCcgICAgICAgICAgOiAnTGlzdGEnLAoJJ0hvcml6b250YWwgcnVsZScgICAgICAgICA6ICdMaW5pYSBwb3ppb21hZScsCgknQmxvY2txdW90ZScgICAgICAgICAgICAgIDogJ0N5dGF0JywKCSdCbG9jayBlbGVtZW50IChESVYpJyAgICAgOiAnRWxlbWVudCBibG9rb3d5IChESVYpJywKCSdMaW5rJyAgICAgICAgICAgICAgICAgICAgOiAnTGluaycsCgknRGVsZXRlIGxpbmsnICAgICAgICAgICAgIDogJ1VzdcWEIGxpbmsnLAoJJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICdXc3Rhdy9ldHl0dWoga290d2ljxJknLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICdPYnJheicsCgknVGFibGUnICAgICAgICAgICAgICAgICAgIDogJ1RhYmVsYScsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ1NrYXN1aiBUYWJlbMSZJywKCSdJbnNlcnQgcm93IGJlZm9yZScgICAgICAgOiAnV3N0YXcgd2llcnMgcHJ6ZWQnLAoJJ0luc2VydCByb3cgYWZ0ZXInICAgICAgICA6ICdXc3RhdyB3aWVycyBwbycsCgknRGVsZXRlIHJvdycgICAgICAgICAgICAgIDogJ1NrYXN1aiB3aWVyc3onLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICdXc3RhdyBrb2x1bW7EmSBTcGFsdGUgcHJ6ZWQnLAoJJ0luc2VydCBjb2x1bW4gYWZ0ZXInICAgICA6ICdXc3RhdyBrb2x1bW7EmSBwbycsCgknRGVsZXRlIGNvbHVtbicgICAgICAgICAgIDogJ1NrYXN1aiBrb2x1bW7EmScsCgknTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ1BvxYLEhWN6IGtvbcOzcmtpJywKCSdTcGxpdCB0YWJsZSBjZWxsJyAgICAgICAgOiAnUm96xYLEhWN6IGtvbcOzcmtpJywKCSdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnIDogJ1Bva2HFvCBibG9raScsCgknVGFibGUgY2VsbCBwcm9wZXJ0aWVzJyAgIDogJ1fFgmHFm2Npd2/Fm2NpIGtvbcOzcmtpJywKCSdUYWJsZSBwcm9wZXJ0aWVzJyAgICAgICAgOiAnV8WCYcWbY2l3b8WbY2kgdGFiZWxpJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAnUGXFgm55IGVrcmFuJywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAnTWVuYWTFumVyIHBsaWvDs3cnLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICdUd2FyZGEgc3BhY2phJywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAnV3nFgsSFY3ogb3RhY3phbmllIGVsZW1lbnTDs3cnLAoJLy8gZGlhbG9ncwoJJ1dhcm5pbmcnIDogJ09zdHJ6ZcW8ZW5pZScsCgknUHJvcGVyaWVzJyA6ICdXxYJhxZtjaXdvxZtjaScsCgknUG9wdXAnIDogJ29raWVua28gUG9wLXVwJywKCSdBZHZhbmNlZCcgOiAnV2nEmWNlaicsCgknRXZlbnRzJyA6ICdXeWRhcnplbmlhJywKCSdXaWR0aCcgOiAnU3plcm9rb8WbxIcnLAoJJ0hlaWdodCcgOiAnV3lzb2tvxZvEhycsCgknTGVmdCcgICA6ICdMZXd5JywKCSdDZW50ZXInIDogJ0NlbnRydW0nLAoJJ1JpZ2h0JyAgOiAnUHJhd3knLAoJJ0JvcmRlcicgOiAnUmFta2EnLAoJJ0JhY2tncm91bmQnIDogJ0tvbG9yIHTFgmEnLAoJJ0NzcyBjbGFzcycgOiAna2xhc2EgQ3NzJywKCSdDc3Mgc3R5bGUnIDogJ3N0eWwgQ3NzJywKCSdObycgOiAnTmllJywKCSdUaXRsZScgOiAnVHl0dcWCJywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICdLb21lbnRhcnogc2t0eXB0dScsCgknTGFuZ3VhZ2UnIDogJ0rEmXp5aycsCgknQ2hhcnNldCcgOiAnU3Ryb25hIGtvZG93YScsCgknTm90IHNldCcgOiAnbmljJywKCSdMZWZ0IHRvIHJpZ2h0JyA6ICdaIGxld2VqIGRvIHByYXdlaicsCgknUmlnaHQgdG8gbGVmdCcgOiAnWiBwcmF3ZWogZG8gbGV3ZWonLAoJJ0luIHRoaXMgd2luZG93JyA6ICdUbyBzYW1vIG9rbm8gKF9zZWxmKScsCgknSW4gbmV3IHdpbmRvdyAoX2JsYW5rKScgOiAnTm93ZSBva25vIChfYmxhbmspJywKCSdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknIDogJ09rbm8gbmFkcnrEmWRuZSAoX3BhcmVudCknLAoJJ0luIHRvcCBmcmFtZSAoX3RvcCknIDogJ0fDs3JuYSByYW1rYSAoX3RvcCknLAoJJ1VSTCcgOiAnJywKCSdPcGVuIGluJyA6ICdPdHfDs3J6IHcnLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAnVGEgb3BlcmFjamEgamVzdCB6YWJyb25pb25hIHcgdHdvamVqIHByemVnbMSFZGFyY2UgeiBwb3dvZHUgemFiZXpwaWVjemXFhC4gUG9taW1vIHRvIG1vxbxlc3ogdcW8eXdhxIcga2xhd2lzenkgc2tyw7N0w7N3LicsCgkvLyBmb3JtYXQgCgknSGVhZGluZyAxJyA6ICdOYWfFgsOzd2VrIDEnLAoJJ0hlYWRpbmcgMicgOiAnTmFnxYLDs3dlayAyJywKCSdIZWFkaW5nIDMnIDogJ05hZ8WCw7N3ZWsgMycsCgknSGVhZGluZyA0JyA6ICdOYWfFgsOzd2VrIDQnLAoJJ0hlYWRpbmcgNScgOiAnTmFnxYLDs3dlayA1JywKCSdIZWFkaW5nIDYnIDogJ05hZ8WCw7N3ZWsgNicsCQoJJ1BhcmFncmFwaCcgOiAnUGFyYWdyYWYnLAoJJ0FkZHJlc3MnIDogJ0FkZHJlc3NlJywKCSdQcmVmb3JtYXR0ZWQnIDogJycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICdNYcWCeSAoOHB0KScsCgknU21hbGwgKDEwcHgpJyAgOiAnTWHFgnkgKDEwcHQpJywKCSdTbWFsbCAoMTJwdCknICA6ICdNYcWCeSAoMTJwdCknLAoJJ05vcm1hbCAoMTRwdCknIDogJ8WacmVkbmkgKDE0cHQpJywKCSdMYXJnZSAoMThwdCknICA6ICdEdcW8eSAoMThwdCknLAoJJ0xhcmdlICgyNHB0KScgIDogJ0R1xbx5ICgyNHB0KScsCgknTGFyZ2UgKDM2cHQpJyAgOiAnRHXFvHkgKDM2cHQpJywJCQkJCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ05hendhIGtvdHdpY3knLAoJLy8gbGluawoJJ0xpbmsgVVJMJyA6ICcoVVJMKScsCgknVGFyZ2V0JyA6ICdDZWwnLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ090d8OzcnogbGluayB3IG5vd3ltIG9rbmllJywKCSdVUkwnIDogJycsCgknV2luZG93IG5hbWUnIDogJ09raWVua28gUG9wLXVwIE5hendhJywKCSdXaW5kb3cgc2l6ZScgOiAnUm96bWlhcicsCgknV2luZG93IHBvc2l0aW9uJyA6ICdQb3p5Y2phJywKCSdMb2NhdGlvbiBiYXInIDogJ3Bhc2VrIGFkcmVzdScsCgknTWVudSBiYXInIDogJ1Bhc2VrIG1lbnUnLAoJJ1Rvb2xiYXInIDogJ1Bhc2VrIG5hcnrEmWR6aScsCgknU2Nyb2xsYmFycycgOiAnUGFza2kgcHJ6ZXdpamFuaWEnLAoJJ1N0YXR1cyBiYXInIDogJ3Bhc2VrIHN0YXR1c3knLAoJJ1Jlc2l6YWJsZScgOiAnWm1pYW5hIHJvem1pYXJ1IG9rbmEnLAoJJ0RlcGVkZW50JyA6ICdaYWxlxbxuZSAoTmV0c2NhcGUpJywKCSdBZGQgcmV0dXJuIGZhbHNlJyA6ICdkb2RhaiAocmV0dXJuIGZhbHNlKScsCgknVGFyZ2V0IE1JTUUgdHlwZScgOiAnTUlNRSB0eXBlJywKCSdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJ1phbGXFvG5vxZtjIHN0cm9ueSBkbyBjZWx1IChyZWwpJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknIDogJ1phbGXFvG5vxZtjIHN0cm9ueSBkbyBzdHJvbnkgKHJldiknLAoJJ1RhYiBpbmRleCcgOiAnSW5kZXggdGFiJywKCSdBY2Nlc3Mga2V5JyA6ICdLbGF3aXN6IGRvc3RlcHUnLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICdSb3ptaWFyJywKCSdQcmV2aWV3JyA6ICdQb2RnbMSFZCcsCgknTWFyZ2lucycgOiAnTWFyZ2luZXN5JywKCSdBbHQgdGV4dCcgOiAnVGV4dCBhbHRlcm5hdHl3bnknLAoJJ0ltYWdlIFVSTCcgOiAnVVJMJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAnRHlzdGFucyAoc3BhY2luZyknLAoJJ1BhZGRpbmcnICAgICAgIDogJ0R5c3RhbnMgKHBhZGRpbmcpJywKCSdSb3dzJyAgICAgICAgICA6ICdXaWVyc3onLAoJJ0NvbHVtbnMnICAgICAgIDogJ0tvbHVtbmEnLAoJJ0dyb3VwcycgICAgICAgIDogJ0dydXBhJywKCSdDZWxscycgICAgICAgICA6ICdLb23Ds3JraScsCgknQ2FwdGlvbicgICAgICAgOiAnTGVnZW5kYScsCgknSW5uZXIgYm9yZGVycycgOiAnV2V3bsSZdHJ6bmUgcmFta2knCgkKCQp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.ru.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogUnVzc2lhbiB0cmFuc2xhdGlvbgogKiBAYXV0aG9yIERtaXRyeSBMZXZhc2hvdiA8ZGlvQHN0ZDQyLnJ1PgogKiBAdmVyc2lvbiAyMDEwLTA5LTIwCiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMucnUgPSB7CgknRWRpdG9yJyA6ICfQoNC10LTQsNC60YLQvtGAJywKCSdTb3VyY2UnIDogJ9CY0YHRhdC+0LTQvdC40LonLAoJLy8g0L3QsNC30LLQsNC90LjRjyDQv9Cw0L3QtdC70LXQuQoJJ0NvcHkvUGFzZScgICAgICA6ICfQmtC+0L/QuNGA0L7QstCw0L3QuNC1L9CS0YHRgtCw0LLQutCwJywKCSdVbmRvL1JlZG8nICAgICAgOiAn0J7RgtC80LXQvdCwL9Cf0L7QstGC0L7RgCDQtNC10LnRgdGC0LLQuNGPJywKCSdUZXh0IHN0eWxlcycgICAgOiAn0KHRgtC40LvQuCDRgtC10LrRgdGC0LAnLAoJJ0NvbG9ycycgICAgICAgICA6ICfQptCy0LXRgtCwJywKCSdBbGlnbm1lbnQnICAgICAgOiAn0JLRi9GA0LDQstC90LjQstCw0L3QuNC1JywKCSdJbmRlbnQvT3V0ZGVudCcgOiAn0J7RgtGB0YLRg9C/0YsnLAoJJ1RleHQgZm9ybWF0JyAgICA6ICfQpNC+0YDQvNCw0YLQuNGA0L7QstCw0L3QuNC1JywKCSdMaXN0cycgICAgICAgICAgOiAn0KHQv9C40YHQutC4JywKCSdNaXNjIGVsZW1lbnRzJyAgOiAn0KDQsNC30L3Ri9C1INGN0LvQtdC80LXQvdGC0YsnLAoJJ0xpbmtzJyAgICAgICAgICA6ICfQodGB0YvQu9C60LgnLAoJJ0ltYWdlcycgICAgICAgICA6ICfQmNC30L7QsdGA0LDQttC10L3QuNGPJywKCSdNZWRpYScgICAgICAgICAgOiAnTWVkaWEg0YTQsNC50LvRiycsCgknVGFibGVzJyAgICAgICAgIDogJ9Ci0LDQsdC70LjRhtGLJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAn0KTQsNC50LvQvtCy0YvQuSDQvNC10L3QtdC00LbQtdGAIChlbEZpbmRlciknLAoJLy8g0L3QsNC30LLQsNC90LjRjyDQutC90L7Qv9C+0LoKCSdBYm91dCB0aGlzIHNvZnR3YXJlJyAgICAgOiAn0J4g0L/RgNC+0LPRgNCw0LzQvNC1JywKCSdTYXZlJyAgICAgICAgICAgICAgICAgICAgOiAn0KHQvtGF0YDQsNC90LjRgtGMJywKCSdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAn0JrQvtC/0LjRgNC+0LLQsNGC0YwnLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICfQktGL0YDQtdC30LDRgtGMJywKCSdQYXN0ZScgICAgICAgICAgICAgICAgICAgOiAn0JLRgdGC0LDQstC40YLRjCcsCgknUGFzdGUgb25seSB0ZXh0JyAgICAgICAgIDogJ9CS0YHRgtCw0LLQuNGC0Ywg0YLQvtC70YzQutC+INGC0LXQutGB0YInLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICfQktGB0YLQsNCy0LjRgtGMINGE0L7RgNC80LDRgtC40YDQvtCy0LDQvdGL0Lkg0YLQtdC60YHRgicsCgknQ2xlYW4gZm9ybWF0JyAgICAgICAgICAgIDogJ9Cj0LTQsNC70LjRgtGMINGE0L7RgNC80LDRgtC40YDQvtCy0LDQvdC40LUnLCAKCSdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAn0J7RgtC80LXQvdC40YLRjCDQtNC10LnRgdGC0LLQuNC1JywKCSdSZWRvIHByZXZpb3VzIGFjdGlvbicgICAgOiAn0J/QvtCy0YLQvtGA0LjRgtGMINC00LXQudGB0YLQstC40LUgJywKCSdCb2xkJyAgICAgICAgICAgICAgICAgICAgOiAn0JbQuNGA0L3Ri9C5JywKCSdJdGFsaWMnICAgICAgICAgICAgICAgICAgOiAn0JrRg9GA0YHQuNCyJywKCSdVbmRlcmxpbmUnICAgICAgICAgICAgICAgOiAn0J/QvtC00YfQtdGA0LrQvdGD0YLRi9C5JywKCSdTdHJpa2V0aHJvdWdoJyAgICAgICAgICAgOiAn0J/QtdGA0LXRh9C10YDQutC90YPRgtGL0LknLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICfQndCw0LTRgdGC0YDQvtGH0L3Ri9C5INGC0LXQutGB0YInLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICfQn9C+0LTRgdGC0YDQvtGH0L3Ri9C5INGC0LXQutGB0YInLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICfQktGL0YDQvtCy0L3Rj9GC0Ywg0L3QsNC70LXQstC+JywKCSdBaWxnbiByaWdodCcgICAgICAgICAgICAgOiAn0JLRi9GA0L7QstC90Y/RgtGMINC90LDQv9GA0LDQstC+JywKCSdBbGlnbiBjZW50ZXInICAgICAgICAgICAgOiAn0JLRi9GA0L7QstC90Y/RgtGMINC/0L4g0YbQtdC90YLRgNGDJywKCSdBbGlnbiBmdWxsJyAgICAgICAgICAgICAgOiAn0JLRi9GA0L7QstC90Y/RgtGMINC/0L4g0LrRgNCw0Y/QvCcsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ9Cm0LLQtdGCINGI0YDQuNGE0YLQsCcsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ9Cm0LLQtdGCINC30LDQu9C40LLQutC4JywKCSdJbmRlbnQnICAgICAgICAgICAgICAgICAgOiAn0KPQstC10LvQuNGH0LjRgtGMINC+0YLRgdGC0YPQvycsCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ9Cj0LzQtdC90YzRiNC40YLRjCDQvtGC0YHRgtGD0L8nLAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICfQpNC+0YDQvNCw0YLQuNGA0L7QstCw0L3QuNC1JywKCSdGb250IHNpemUnICAgICAgICAgICAgICAgOiAn0KDQsNC30LzQtdGAINGI0YDQuNGE0YLQsCcsCgknRm9udCcgICAgICAgICAgICAgICAgICAgIDogJ9Co0YDQuNGE0YInLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICfQndGD0LzQtdGA0L7QstCw0L3Ri9C5INGB0L/QuNGB0L7QuicsCgknVW5vcmRlcmVkIGxpc3QnICAgICAgICAgIDogJ9Cd0LXQvdGD0LzQtdGA0L7QstCw0L3Ri9C5INGB0L/QuNGB0L7QuicsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ9CT0L7RgNC40LfQvtC90YLQsNC70YzQvdCw0Y8g0LvQuNC90LjRjycsCgknQmxvY2txdW90ZScgICAgICAgICAgICAgIDogJ9Cm0LjRgtCw0YLQsCcsCgknQmxvY2sgZWxlbWVudCAoRElWKScgICAgIDogJ9CR0LvQvtGH0L3Ri9C5INGN0LvQtdC80LXQvdGCIChESVYpJywKCSdMaW5rJyAgICAgICAgICAgICAgICAgICAgOiAn0KHRgdGL0LvQutCwJywKCSdEZWxldGUgbGluaycgICAgICAgICAgICAgOiAn0KPQtNCw0LvQuNGC0Ywg0YHRgdGL0LvQutGDJywKCSdCb29rbWFyaycgICAgICAgICAgICAgICAgOiAn0JfQsNC60LvQsNC00LrQsCcsCgknSW1hZ2UnICAgICAgICAgICAgICAgICAgIDogJ9CY0LfQvtCx0YDQsNC20LXQvdC40LUnLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICfQotCw0LHQu9C40YbQsCcsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ9Cj0LTQsNC70LjRgtGMINGC0LDQsdC70LjRhtGDJywKCSdJbnNlcnQgcm93IGJlZm9yZScgICAgICAgOiAn0JLRgdGC0LDQstC40YLRjCDRgNGP0LQg0LTQvicsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ9CS0YHRgtCw0LLQuNGC0Ywg0YDRj9C0INC/0L7RgdC70LUnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICfQo9C00LDQu9C40YLRjCDRgNGP0LQnLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICfQktGB0YLQsNCy0LjRgtGMINC60L7Qu9C+0L3QutGDINC00L4nLAoJJ0luc2VydCBjb2x1bW4gYWZ0ZXInICAgICA6ICfQktGB0YLQsNCy0LjRgtGMINC60L7Qu9C+0L3QutGDINC/0L7RgdC70LUnLAoJJ0RlbGV0ZSBjb2x1bW4nICAgICAgICAgICA6ICfQo9C00LDQu9C40YLRjCDQutC+0LvQvtC90LrRgycsCgknTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ9Ch0LrQu9C10LjRgtGMINGP0YfQtdC50LrQuCcsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ9Cg0LDQt9C00LXQu9C40YLRjCDRj9GH0LXQudC60YMnLAoJJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAn0J/QvtC60LDQt9Cw0YLRjCDRgdGC0YDRg9C60YLRg9GA0YMg0LTQvtC60YPQvNC10L3RgtCwL9C90LXQstC40LTQuNC80YvQtSDRjdC70LXQvNC10L3RgtGLJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAn0KHQstC+0LnRgdGC0LLQviDRj9GH0LXQudC60LgnLAoJJ1RhYmxlIHByb3BlcnRpZXMnICAgICAgICA6ICfQodCy0L7QudGB0YLQstC+INGC0LDQsdC70LjRhtGLJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAn0JLQviDQstC10YHRjCDRjdC60YDQsNC9JywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAn0J7RgtC60YDRi9GC0Ywg0YTQsNC50LvQvtCy0YvQuSDQvNC10L3QtdC00LbQtdGAJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAn0J3QtdGA0LDQt9GA0YvQstC90YvQuSDQv9GA0L7QsdC10LsnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgICA6ICfQntGC0LrQu9GO0YfQuNGC0Ywg0L7QsdGC0LXQutCw0L3QuNC1INGN0LvQtdC80LXQvdGC0L7QsiDRgtC10LrRgdGC0L7QvCcsCgkvLyBkaWFsb2dzCgknV2FybmluZycgOiAn0JLQvdC40LzQsNC90LjQtScsCgknUHJvcGVyaWVzJyA6ICfQodCy0L7QudGB0YLQstCwJywKCSdQb3B1cCcgOiAn0J3QvtCy0L7QtSDQvtC60L3QvicsCgknQWR2YW5jZWQnIDogJ9CU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdC+JywKCSdFdmVudHMnIDogJ9Ch0L7QsdGL0YLQuNGPJywKCSdXaWR0aCcgOiAn0KjQuNGA0LjQvdCwJywKCSdIZWlnaHQnIDogJ9CS0YvRgdC+0YLQsCcsCgknTGVmdCcgICA6ICfQodC70LXQstCwJywKCSdDZW50ZXInIDogJ9Cf0L4g0YbQtdC90YLRgNGDJywKCSdSaWdodCcgIDogJ9Ch0L/RgNCw0LLQsCcsCgknQm9yZGVyJyA6ICfQkdC+0YDQtNGO0YAnLAoJJ0JhY2tncm91bmQnIDogJ9Ck0L7QvScsCgknQ3NzIGNsYXNzJyA6ICdDc3Mg0LrQu9Cw0YHRgScsCgknQ3NzIHN0eWxlJyA6ICdDc3MgY9GC0LjQu9GMJywKCSdObycgOiAn0J3QtdGCJywKCSdUaXRsZScgOiAn0JfQsNCz0L7Qu9C+0LLQvtC6JywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICfQndCw0L/RgNCw0LLQu9C10L3QuNC1INC/0LjRgdGM0LzQsCcsCgknTGFuZ3VhZ2UnIDogJ9Cv0LfRi9C6JywKCSdDaGFyc2V0JyA6ICfQmtC+0LTQuNGA0L7QstC60LAnLAoJJ05vdCBzZXQnIDogJ9Cd0LUg0YPRgdGC0LDQvdC+0LLQu9C10L3QvicsCgknTGVmdCB0byByaWdodCcgOiAn0KHQu9C10LLQviDQvdCw0L/RgNCw0LLQvicsCgknUmlnaHQgdG8gbGVmdCcgOiAn0KHQv9GA0LDQstCwINC90LDQu9C10LLQvicsCgknSW4gdGhpcyB3aW5kb3cnIDogJ9CSINGN0YLQvtC8INC+0LrQvdC1JywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICfQkiDQvdC+0LLQvtC8INC+0LrQvdC1IChfYmxhbmspJywKCSdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknIDogJ9CSINGA0L7QtNC40YLQtdC70YzRgdC60L7QvCDQvtC60L3QtSAoX3BhcmVudCknLAoJJ0luIHRvcCBmcmFtZSAoX3RvcCknIDogJ9CSINCy0LXRgNGF0L3QtdC8INGE0YDQtdC50LzQtSAoX3RvcCknLAoJJ1VSTCcgOiAnJywKCSdPcGVuIGluJyA6ICfQntGC0LrRgNGL0YLRjCcsCgknT3BlbiBmaWxlIG1hbmdlcicgOiAn0J7RgtC60YDRi9GC0Ywg0YTQsNC50LvQvtCy0YvQuSDQvNC10L3QtdC00LbQtdGAJywKCS8vIGNvcHkKCSdUaGlzIG9wZXJhdGlvbiBpcyBkaXNhYmxlZCBpbiB5b3VyIGJyb3dzZXIgb24gc2VjdXJpdHkgcmVhc29uLiBVc2Ugc2hvcnRjdXQgaW5zdGVhZC4nIDogJ9CU0LXQudGB0YLQstC40LUg0LfQsNC/0YDQtdGJ0LXQvdC+INCyINCy0LDRiNC10Lwg0LHRgNCw0YPQt9C10YDQtSDQv9C+INGB0L7QvtCx0YDQsNC20LXQvdC40Y/QvCDQsdC10LfQvtC/0LDRgdGC0L3QvtGB0YLQuC4g0JjRgdC/0L7Qu9GM0LfRg9C50YLQtSDRgdC+0YfQtdGC0LDQvdC40LUg0LrQu9Cw0LLQuNGIJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAxJywKCSdIZWFkaW5nIDInIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAyJywKCSdIZWFkaW5nIDMnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAzJywKCSdIZWFkaW5nIDQnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA0JywKCSdIZWFkaW5nIDUnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA1JywKCSdIZWFkaW5nIDYnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA2JywJCgknUGFyYWdyYXBoJyA6ICfQn9Cw0YDQsNCz0YDQsNGEJywKCSdBZGRyZXNzJyA6ICfQkNC00YDQtdGBJywKCSdQcmVmb3JtYXR0ZWQnIDogJycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICfQnNC10LvQutC40LkgKDhwdCknLAoJJ1NtYWxsICgxMHB4KScgIDogJ9Cc0LDQu9C10L3RjNC60LjQuSAoMTBweCknLAoJJ1NtYWxsICgxMnB0KScgIDogJ9Cd0LXQsdC+0LvRjNGI0L7QuSAoMTJwdCknLAoJJ05vcm1hbCAoMTRwdCknIDogJ9Ce0LHRi9GH0L3Ri9C5ICgxNHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAn0JHQvtC70YzRiNC+0LkgKDE4cHQpJywKCSdMYXJnZSAoMjRwdCknICA6ICfQmtGA0YPQv9C90YvQuSAoMjRwdCknLAoJJ0xhcmdlICgzNnB0KScgIDogJ9Ce0LPRgNC+0LzQvdGL0LkgKDM2cHQpJywJCQkJCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ9CY0LzRjyDQt9Cw0LrQu9Cw0LTQutC4JywKCS8vIGxpbmsKCSdMaW5rIFVSTCcgOiAn0JDQtNGA0LXRgSDRgdGB0YvQu9C60LggKFVSTCknLAoJJ1RhcmdldCcgOiAn0KbQtdC70YwnLAoJJ1NlbGVjdCBib29rbWFyaycgOiAn0JLRi9Cx0YDQsNGC0Ywg0LfQsNC60LvQsNC00LrRgycsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdycgOiAn0J7RgtC60YDRi9GC0Ywg0YHRgdGL0LvQutGDINCy0L4g0LLRgdC/0LvRi9Cy0LDRjtGJ0LXQvCDQvtC60L3QtScsCgknVVJMJyA6ICcnLAoJJ1dpbmRvdyBuYW1lJyA6ICfQndCw0LfQstCw0L3QuNC1INC+0LrQvdCwJywKCSdXaW5kb3cgc2l6ZScgOiAn0KDQsNC30LzQtdGAINC+0LrQvdCwJywKCSdXaW5kb3cgcG9zaXRpb24nIDogJ9Cf0L7Qt9C40YbQuNGPINC+0LrQvdCwJywKCSdMb2NhdGlvbiBiYXInIDogJ9Cf0LDQvdC10LvRjCDQu9C+0LrQsNGG0LjQuCcsCgknTWVudSBiYXInIDogJ9Cf0LDQvdC10LvRjCDQvNC10L3RjicsCgknVG9vbGJhcicgOiAn0J/QsNC90LXQu9GMINC40L3RgdGC0YDRg9C80LXQvdGC0L7QsicsCgknU2Nyb2xsYmFycycgOiAn0J/QvtC70L7RgdGLINC/0YDQvtC60YDRg9GC0LrQuCcsCgknU3RhdHVzIGJhcicgOiAn0KHRgtGA0L7QutCwINGB0L7RgdGC0L7Rj9C90LjRjycsCgknUmVzaXphYmxlJyA6ICfQmNC30LzQtdC90LXQvdC40LUg0YDQsNC30LzQtdGA0LAnLAoJJ0RlcGVkZW50JyA6ICfQl9Cw0LLQuNGB0LjQvNGL0LkgKE5ldHNjYXBlKScsCgknQWRkIHJldHVybiBmYWxzZScgOiAn0JTQvtCx0LDQstC40YLRjCAocmV0dXJuIGZhbHNlKScsCgknVGFyZ2V0IE1JTUUgdHlwZScgOiAnTUlNRSB0eXBlINGG0LXQu9C4JywKCSdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJ9Ce0YLQvdC+0YjQtdC90LjQtSDRgdGC0YDQsNC90LjRhtGLINC6INGG0LXQu9C4IChyZWwpJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknIDogJ9Ce0YLQvdC+0YjQtdC90LjQtSDRhtC10LvQuCDQuiDRgdGC0YDQsNC90LjRhtC1IChyZXYpJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAn0JrQu9Cw0LLQuNGI0LAg0LTQvtGB0YLRg9C/0LAnLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICfQoNCw0LfQvNC10YAnLAoJJ1ByZXZpZXcnIDogJ9Cf0YDQtdC00LLQsNGA0LjRgtC10LvRjNC90YvQuSDQv9GA0L7RgdC80L7RgtGAJywKCSdNYXJnaW5zJyA6ICfQntGC0YHRgtGD0L/RiycsCgknQWx0IHRleHQnIDogJ9Ce0L/QuNGB0LDQvdC40LUgKEFsdCknLAoJJ0ltYWdlIFVSTCcgOiAnVVJMJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAn0J/RgNC+0LzQtdC20YPRgtC+0LogKHNwYWNpbmcpJywKCSdQYWRkaW5nJyAgICAgICA6ICfQntGC0YHRgtGD0L8gKHBhZGRpbmcpJywKCSdSb3dzJyAgICAgICAgICA6ICfQodGC0YDQvtC60LgnLAoJJ0NvbHVtbnMnICAgICAgIDogJ9Ca0L7Qu9C+0L3QutC4JywKCSdHcm91cHMnICAgICAgICA6ICfQk9GA0YPQv9C/0YsnLAoJJ0NlbGxzJyAgICAgICAgIDogJ9Cv0YfQtdC50LrQuCcsCgknQ2FwdGlvbicgICAgICAgOiAn0JfQsNCz0L7Qu9C+0LLQvtC6INGC0LDQsdC70LjRhtGLJywKCSdJbm5lciBib3JkZXJzJyA6ICfQktC90YPRgtGA0LXQvdC90LjQuSDQsdC+0YDQtNGO0YAnLAoJLy8gdGFibGUgY2VsbAoJJ1RhYmxlIGNlbGwgdHlwZScgOiAn0KLQuNC/INGP0YfQtdC50LrQuCcsCgknRGF0YScgOiAn0JTQsNC90L3Ri9C1JywKCSdIZWFkZXInIDogJ9CX0LDQs9C+0LvQvtCy0L7QuicsCgknSnVzdGlmeScgOiAn0J/QviDQutGA0LDRj9C8JywKCSdQYWRkaW5ncycgOiAn0J7RgtGB0YLRg9C/0YsnLAoJJ0FwcGx5IHRvJyA6ICfQn9GA0LjQvNC10L3QuNGC0Ywg0LonLAoJJ0N1cnJlbnQgY2VsbCcgOiAn0JLRi9Cx0YDQsNC90L3QsNGPINGP0YfQtdC50LrQsCcsCgknQWxsIGNlbGxzIGluIHJvdycgOiAn0JLRgdC1INGP0YfQtdC50LrQuCDQsiDRgNGP0LTRgycsCgknQWxsIGNlbGxzIGluIGNvbHVtbicgOiAn0JLRgdC1INGP0YfQtdC50LrQuCDQsiDRgdGC0L7Qu9Cx0YbQtScsCgknQWxsIGNlbGxzIGluIHRhYmxlJyA6ICfQktGB0LUg0Y/Rh9C10LnQutC4INGC0LDQsdC70LjRhtGLJywKCS8vIGFib3V0CgknQWJvdXQgZWxSVEUnIDogJ9CeINGA0LXQtNCw0LrRgtC+0YDQtSBlbFJURScsCgknVmVyc2lvbicgOiAn0JLQtdGA0YHQuNGPJywKCSdMaWNlbmNlJyA6ICfQm9C40YbQtdC90LfQuNGPJywKCSdlbFJURSBpcyBhbiBvcGVuLXNvdXJjZSBKYXZhU2NyaXB0IGJhc2VkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJyA6ICdlbFJURSAtINGN0YLQviDRgdCy0L7QsdC+0LTQvdGL0LkgV1lTSVdZRyDRgNC10LTQsNC60YLQvtGAINC00LvRjyDRgdCw0LnRgtC+0LIg0Lgg0YHQuNGB0YLQtdC8INGD0L/RgNCw0LLQu9C10L3QuNGPINC60L7QvdGC0LXQvdGC0L7QvCAoQ01TKSwg0L3QsNC/0LjRgdCw0L3QvdGL0Lkg0L3QsCBKYXZhU2NyaXB0LicsCgknTWFpbiBnb2FsIG9mIHRoZSBlZGl0b3IgLSBzaW1wbGlmeSB3b3JrIHdpdGggdGV4dCBhbmQgZm9ybWF0aW5nIChIVE1MKSBvbiBzaXRlcywgYmxvZ3MsIGZvcnVtcyBhbmQgb3RoZXIgb25saW5lIHNlcnZpY2VzLicgOiAn0J7RgdC90L7QstC90LDRjyDRhtC10LvRjCDRgNC10LTQsNC60YLQvtGA0LAgLSDQvNCw0LrRgdC40LzQsNC70YzQvdC+INGD0L/RgNC+0YHRgtC40YLRjCDRgNCw0LHQvtGC0YMg0YEg0YLQtdC60YHRgtC+0Lwg0Lgg0YDQsNC30LzQtdGC0LrQvtC5IChIVE1MKSDQvdCwINGB0LDQudGC0LDRhSwg0LHQu9C+0LPQsNGFLCDRhNC+0YDRg9C80LDRhSDQuCDQv9GA0L7Rh9C40YUgb25saW5lINGB0LXRgNCy0LjRgdCw0YUuJywKCSdZb3UgY2FuIHVzZSBpdCBpbiBhbnkgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCBwcm9qZWN0cy4nIDogJ9CS0Ysg0LzQvtC20LXRgtC1INC40YHQv9C+0LvRjNC30L7QstCw0YLRjCDQtdCz0L4g0LIg0LvRjtCx0YvRhSDQutC+0LzQvNC10YDRh9C10YHQutC40YUg0Lgg0L3QtdC60L7QvNC80LXRgNGH0LXRgdC60LjRhSDQv9GA0L7QtdC60YLQsNGFLicsCgknQXV0aG9ycycgOiAn0JDQstGC0L7RgNGLJywKCSdDaGllZiBkZXZlbG9wZXInIDogJ9CS0LXQtNGD0YnQuNC5INGA0LDQt9GA0LDQsdC+0YLRh9C40LonLAoJJ0RldmVsb3BlciwgdGVjaCBzdXBwb3J0JyA6ICfQoNCw0LfRgNCw0LHQvtGC0YfQuNC6LCDRgtC10YXQvdC40YfQtdGB0LrQsNGPINC/0L7QtNC00LXRgNC20LrQsCcsCgknRGV2ZWxvcGVyJyA6ICfQoNCw0LfRgNCw0LHQvtGC0YfQuNC6JywKCSdJbnRlcmZhY2UgZGVzaWduZXInIDogJ9CU0LjQt9Cw0LnQvdC10YAg0LjQvdGC0LXRgNGE0LXQudGB0LAnLAoJJ1NwYW5pc2ggbG9jYWxpemF0aW9uJyA6ICfQmNGB0L/QsNC90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknQ3plY2ggbG9jYWxpemF0aW9uJyA6ICfQp9C10YjRgdC60LDRjyDQu9C+0LrQsNC70LjQt9Cw0YbQuNGPJywKCSdKYXBhbmVzZSBsb2NhbGl6YXRpb24nIDogJ9Cv0L/QvtC90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknTGF0dmlhbiBsb2NhbGl6YXRpb24nIDogJ9Cb0LDRgtGL0YjRgdC60LDRjyDQu9C+0LrQsNC70LjQt9Cw0YbQuNGPJywKCSdHZXJtYW4gbG9jYWxpemF0aW9uJyA6ICfQndC10LzQtdGG0LrQsNGPINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ1VrcmFuaWFuIGxvY2FsaXphdGlvbicgOiAn0KPQutGA0LDQuNC90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknUGVyc2lhbiAoZmFyc2kpIGxvY2FsaXphdGlvbicgOiAn0J/QtdGA0YHQuNC00YHQutCw0Y8gKNGE0LDRgNGB0LgpINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ0FyYWJpYyBsb2NhbGl6YXRpb24nIDogJ9CQ0YDQsNCx0YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknUlRMIHN1cHBvcnQnIDogJ9Cf0L7QtNC00LXRgNC20LrQsCBSVEwnLAoJJ0ZyZW5jaCBsb2NhbGl6YXRpb24nIDogJ9Ck0YDQsNC90YbRg9C30YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknRHV0Y2ggbG9jYWxpemF0aW9uJyA6ICfQk9C+0LvQu9Cw0L3QtNGB0LrQsNGPINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ0h1bmdhcmlhbiBsb2NhbGl6YXRpb24nIDogJ9CS0LXQvdCz0LXRgNGB0LrQsNGPINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ1BvbGlzaCBsb2NhbGl6YXRpb24nIDogJ9Cf0L7Qu9GM0YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknSXRhbGlhbiBsb2NhbGl6YXRpb24nIDogJ9CY0YLQsNC70YzRj9C90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknVHJhZGl0aW9uYWwgQ2hpbmVzZSBsb2NhbGl6YXRpb24nIDogJ9Ca0LjRgtCw0LnRgdC60LDRjyAo0YLRgNCw0LTQuNGG0LjQvtC90L3QsNGPKSDQu9C+0LrQsNC70LjQt9Cw0YbQuNGPJywKCSdGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNvZnR3YXJlIHZpc2l0IHRoZScgOiAn0J/QvtC00YDQvtCx0L3QsNGPINC40L3RhNC+0YDQvNCw0YbQuNGPINC4INGE0L7RgNGD0Lwg0YLQtdGFLiDQv9C+0LTQtNC10YDQttC60LgnLAoJJ2VsUlRFIHdlYnNpdGUnIDogJ9C90LAg0YHQsNC50YLQtSBlbFJURScgCgkKCQp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.ua.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogVWtyYW5pYW4gdHJhbnNsYXRpb24KICogQGF1dGhvciBBcnRlbSBWYXNpbHlldgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMudWEgPSB7CgknRWRpdG9yJyA6ICfQoNC10LTQsNC60YLQvtGAJywKCSdTb3VyY2UnIDogJ9CU0LbQtdGA0LXQu9C+JywKLy8g0J3QsNC30LLQuCDQv9Cw0L3QtdC70LXQuQoJJ0NvcHkgLyBQYXNlJyA6ICfQmtC+0L/RltGO0LLQsNC90L3RjyAvINCS0YHRgtCw0LLQutCwJywKCSdVbmRvIC8gUmVkbycgOiAn0KHQutCw0YHRg9Cy0LDRgtC4IC8g0J/QvtCy0YLQvtGAINC00ZbRlycsCgknVGV4dCBzdHlsZXMnIDogJ9Ch0YLQuNC70ZYg0YLQtdC60YHRgtGDJywKCSdDb2xvcnMnOiAn0JrQvtC70YzQvtGA0LgnLAoJJ0FsaWdubWVudCc6ICfQktC40YDRltCy0L3RjtCy0LDQvdC90Y8nLAoJJ0luZGVudCAvIE91dGRlbnQnOiAn0JLRltC00YHRgtGD0L/QuCcsCgknVGV4dCBmb3JtYXQnOiAn0KTQvtGA0LzQsNGC0YPQstCw0L3QvdGPJywKCSdMaXN0cyc6ICfQodC/0LjRgdC60LgnLAoJJ01pc2MgZWxlbWVudHMnOiAn0KDRltC30L3RliDQtdC70LXQvNC10L3RgtC4JywKCSdMaW5rcyc6ICfQn9C+0YHQuNC70LDQvdC90Y8nLAoJJ0ltYWdlcyc6ICfQnNCw0LvRjtC90LrQuCcsCgknTWVkaWEnOiAnTWVkaWEg0YTQsNC50LvQuCcsCgknVGFibGVzJzogJ9Ci0LDQsdC70LjRhtGWJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAn0KTQsNC50LvQvtCy0YvQuSDQvNC10L3QtdC00LbQtdGAIChlbEZpbmRlciknLAovLyDQndCw0LfQstC4INC60L3QvtC/0L7QugoJJ0Fib3V0IHRoaXMgc29mdHdhcmUnICAgICA6ICfQniDQv9GA0L7Qs9GA0LDQvNC80LUnLAoJJ1NhdmUnOiAn0JfQsdC10YDQtdCz0YLQuCcsCgknQ29weSc6ICfQmtC+0L/RltGO0LLQsNGC0LgnLAoJJ0N1dCc6ICfQktC40YDRltC30LDRgtC4JywKCSdQYXN0ZSc6ICfQktGB0YLQsNCy0LjRgtC4JywKCSdQYXN0ZSBvbmx5IHRleHQnOiAn0JLRgdGC0LDQstC40YLQuCDRgtGW0LvRjNC60Lgg0YLQtdC60YHRgicsCgknUGFzdGUgZm9ybWF0dGVkIHRleHQnOiAn0JLRgdGC0LDQstC40YLQuCDRhNC+0YDQvNCw0YLRg9Cy0LDQvdC90Y8g0YLQtdC60YHRgtGDJywKCSdDbGVhbiBmb3JtYXQnOiAn0JLQuNC00LDQu9C40YLQuCDRhNC+0YDQvNCw0YLRg9Cy0LDQvdC90Y8nLAoJJ1VuZG8gbGFzdCBhY3Rpb24nOiAn0KHQutCw0YHRg9Cy0LDRgtC4INC00ZbRjicsCgknUmVkbyBwcmV2aW91cyBhY3Rpb24nOiAn0J/QvtCy0YLQvtGA0LjRgtC4INC00ZbRjicsCgknQm9sZCc6ICfQotC+0LLRgdGC0LjQuScsCgknSXRhbGljJzogJ9Ca0YPRgNGB0LjQsicsCgknVW5kZXJsaW5lJzogJ9Cf0ZbQtNC60YDQtdGB0LvQtdC90LjQuScsCgknU3RyaWtldGhyb3VnaCc6ICfQn9C10YDQtdC60YDQtdGB0LvQtdC90LjQuScsCgknU3VwZXJzY3JpcHQnOiAn0JLQtdGA0YXQvdGW0Lkg0YDQtdCz0ZbRgdGC0YAnLAoJJ1N1YnNjcmlwdCc6ICfQndC40LbQvdGW0Lkg0YDQtdCz0ZbRgdGC0YAnLAoJJ0FsaWduIGxlZnQnOiAn0JLQuNGA0ZbQstC90Y/RgtC4INC70ZbQstC+0YDRg9GHJywKCSdBaWxnbiByaWdodCc6ICfQktC40YDRltCy0L3Rj9GC0Lgg0L/RgNCw0LLQvtGA0YPRhycsCgknQWxpZ24gY2VudGVyJzogJ9CS0LjRgNGW0LLQvdGP0YLQuCDQv9C+INGG0LXQvdGC0YDRgycsCgknQWxpZ24gZnVsbCc6ICfQktC40YDRltCy0L3Rj9GC0Lgg0L/QviDQutGA0LDRj9GFJywKCSdGb250IGNvbG9yJzogJ9Ca0L7Qu9GW0YAg0YLQtdC60YHRgtGDJywKCSdCYWNrZ3JvdW5kIGNvbG9yJzogJ9Ca0L7Qu9GW0YAg0LfQsNC70ZbQutCy0ZYnLAoJJ0luZGVudCc6ICfQl9Cx0ZbQu9GM0YjQuNGC0Lgg0LLRltC00YHRgtGD0L8nLAoJJ091dGRlbnQnOiAn0JfQvNC10L3RiNC40YLQuCDQstGW0LTRgdGC0YPQvycsCgknRm9ybWF0JzogJ9Ck0L7RgNC80LDRgtGD0LLQsNC90L3RjycsCgknRm9udCBzaXplJzogJ9Cg0L7Qt9C80ZbRgCDRiNGA0LjRhNGC0YMnLAoJJ0ZvbnQnOiAn0KjRgNC40YTRgicsCgknT3JkZXJlZCBsaXN0JzogJ9Cd0YPQvNC10YDQvtCy0LDQvdC40Lkg0YHQv9C40YHQvtC6JywKCSdVbm9yZGVyZWQgbGlzdCc6ICfQndC10L3Rg9C80LXRgNC+0LLQsNC90LjQuSDRgdC/0LjRgdC+0LonLAoJJ0hvcml6b250YWwgcnVsZSc6ICfQk9C+0YDQuNC30L7QvdGC0LDQu9GM0L3QsCDQu9GW0L3RltGPJywKCSdCbG9ja3F1b3RlJzogJ9Cm0LjRgtCw0YLQsCcsCgknQmxvY2sgZWxlbWVudCAoRElWKScgIDogJ9CR0LvQvtGH0L3Ri9C5INGN0LvQtdC80LXQvdGCIChESVYpJywKCSdMaW5rJzogJ9Cf0L7RgdC40LvQsNC90L3RjycsCgknRGVsZXRlIGxpbmsnOiAn0JLQuNC00LDQu9C40YLQuCDQv9C+0YHQuNC70LDQvdC90Y8nLAoJJ0Jvb2ttYXJrJzogJ9CX0LDQutC70LDQtNC60LAnLAoJJ0ltYWdlJzogJ9CX0L7QsdGA0LDQttC10L3QvdGPJywKCSdUYWJsZSc6ICfQotCw0LHQu9C40YbRjycsCgknRGVsZXRlIHRhYmxlJzogJ9CS0LjQtNCw0LvQuNGC0Lgg0YLQsNCx0LvQuNGG0Y4nLAoJJ0luc2VydCByb3cgYmVmb3JlJzogJ9CS0YHRgtCw0LLQuNGC0Lgg0YDRj9C0INC00L4nLAoJJ0luc2VydCByb3cgYWZ0ZXInOiAn0JLRgdGC0LDQstC40YLQuCDRgNGP0LQg0L/RltGB0LvRjycsCgknRGVsZXRlIHJvdyc6ICfQktC40LTQsNC70LjRgtC4INGA0Y/QtCcsCgknSW5zZXJ0IGNvbHVtbiBiZWZvcmUnOiAn0JLRgdGC0LDQstC40YLQuCDQutC+0LvQvtC90LrRgyDQtNC+JywKCSdJbnNlcnQgY29sdW1uIGFmdGVyJzogJ9CS0YHRgtCw0LLQuNGC0Lgg0LrQvtC70L7QvdC60YMg0L/RltGB0LvRjycsCgknRGVsZXRlIGNvbHVtbic6ICfQktC40LTQsNC70LjRgtC4INC60L7Qu9C+0L3QutGDJywKCSdNZXJnZSB0YWJsZSBjZWxscyc6ICfRgdC60LvQtdGX0YLQuCDQvtGB0LXRgNC10LTQutGDJywKCSdTcGxpdCB0YWJsZSBjZWxsJzogJ9Cg0L7Qt9C00ZbQu9C40YLQuCDQutC70ZbRgtC40L3QutGDJywKCSdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnOiAn0J/QvtC60LDQt9Cw0YLQuCDRgdGC0YDRg9C60YLRg9GA0YMg0LTQvtC60YPQvNC10L3RgtCwIC8g0L3QtdCy0LjQtNC40LzRliDQtdC70LXQvNC10L3RgtC4JywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnOiAn0JLQu9Cw0YHRgtC40LLRltGB0YLRjCDQutC70ZbRgtC40L3QutGDJywKCSdUYWJsZSBwcm9wZXJ0aWVzJzogJ9CS0LvQsNGB0YLQuNCy0ZbRgdGC0Ywg0YLQsNCx0LvQuNGG0ZYnLAoJJ1RvZ2dsZSBmdWxsIHNjcmVlbiBtb2RlJyA6ICfQktC+INCy0LXRgdGMINGN0LrRgNCw0L0nLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICfQntGC0LrRgNGL0YLRjCDRhNCw0LnQu9C+0LLRi9C5INC80LXQvdC10LTQttC10YAnLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgOiAn0J3QtdGA0LDQt9GA0YvQstC90YvQuSDQv9GA0L7QsdC10LsnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgOiAn0J7RgtC60LvRjtGH0LjRgtGMINC+0LHRgtC10LrQsNC90LjQtSDRjdC70LXQvNC10L3RgtC+0LIg0YLQtdC60YHRgtC+0LwnLAovL0RpYWxvZ3MKCSdXYXJuaW5nJzogJ9Cj0LLQsNCz0LAnLAoJJ1Byb3Blcmllcyc6ICfQktC70LDRgdGC0LjQstC+0YHRgtGWJywKCSdQb3B1cCc6ICfQndC+0LLQtSDQstGW0LrQvdC+JywKCSdBZHZhbmNlZCc6ICfQkdGW0LvRjNGI0LUnLAoJJ0V2ZW50cyc6ICfQn9C+0LTRltGXJywKCSdXaWR0aCc6ICfQqNC40YDQuNC90LAnLAoJJ0hlaWdodCc6ICfQktC40YHQvtGC0LAnLAoJJ0xlZnQnICAgOiAn0KHQu9C10LLQsCcsCgknQ2VudGVyJyA6ICfQn9C+INGG0LXQvdGC0YDRgycsCgknUmlnaHQnICA6ICfQodC/0YDQsNCy0LAnLAoJJ0JvcmRlcic6ICfQkdC+0YDQtNGO0YAnLAoJJ0JhY2tncm91bmQnOiAn0KTQvtC9JywKCSdDc3MgY2xhc3MnOiAnQ3NzINC60LvQsNGBJywKCSdDc3Mgc3R5bGUnOiAnQ3NzIHN0eWxlJywKCSdObyc6ICfQndGWJywKCSdUaXRsZSc6ICfQl9Cw0LPQvtC70L7QstC+0LonLAoJJ1NjcmlwdCBkaXJlY3Rpb24nOiAn0J3QsNC/0YDQsNCy0LvQtdC90L3RjyDQv9C40YHRjNC80LAnLAoJJ0xhbmd1YWdlJzogJ9Cc0L7QstCwJywKCSdDaGFyc2V0JzogJ9Ca0L7QtNGD0LLQsNC90L3RjycsCgknTm90IHNldCc6ICfQndC1INCy0YHRgtCw0L3QvtCy0LvQtdC90L4nLAoJJ0xlZnQgdG8gcmlnaHQnOiAn0JfQu9GW0LLQsCDQvdCw0L/RgNCw0LLQvicsCgknUmlnaHQgdG8gbGVmdCc6ICfQodC/0YDQsNCy0LAg0L3QsNC70ZbQstC+JywKCSdJbiB0aGlzIHdpbmRvdyc6ICfQoyDRhtGM0L7QvNGDINCy0ZbQutC90ZYnLAoJJ0luIG5ldyB3aW5kb3cgKF9ibGFuayknOiAn0KMg0L3QvtCy0L7QvNGDINCy0ZbQutC90ZYgKF9ibGFuayknLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KSc6ICfQoyDQsdCw0YLRjNC60ZbQstGB0YzQutC+0LzRgyDQstGW0LrQvdGWIChfcGFyZW50KScsCgknSW4gdG9wIGZyYW1lIChfdG9wKSc6ICfQoyDQstC10YDRhdC90YzQvtC80YMg0YTRgNC10LnQvNGWIChfdG9wKScsCgknVVJMJzonJywKCSdPcGVuIGluJzogJ9CS0ZbQtNC60YDQuNGC0LgnLAovLyBDb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuICcgOiAn0JTRltGPINC30LDQsdC+0YDQvtC90LXQvdC+INGDINCy0LDRiNC+0LzRgyDQsdGA0LDRg9C30LXRgNGWINC3INC80ZbRgNC60YPQstCw0L3RjCDQsdC10LfQv9C10LrQuC4g0JLQuNC60L7RgNC40YHRgtC+0LLRg9C50YLQtSDQutC70LDQstGW0YjRliAnLAovLyBGb3JtYXQKCSdIZWFkaW5nIDEnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAxJywKCSdIZWFkaW5nIDInIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAyJywKCSdIZWFkaW5nIDMnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAzJywKCSdIZWFkaW5nIDQnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA0JywKCSdIZWFkaW5nIDUnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA1JywKCSdIZWFkaW5nIDYnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA2JywJCgknUGFyYWdyYXBoJyA6ICfQn9Cw0YDQsNCz0YDQsNGEJywKCSdBZGRyZXNzJyA6ICfQkNC00YDQtdGBJywKCSdQcmVmb3JtYXR0ZWQnOicnLAovLyBGb250IHNpemUKCSdTbWFsbCAoOHB0KSc6ICfQlNGA0ZbQsdC90LjQuSAoOHB0KScsCgknU21hbGwgKDEwcHgpJzogJ9Cc0LDQu9C10L3RjNC60LjQuSAoMTBweCknLAoJJ1NtYWxsICgxMnB0KSc6ICfQndC10LLQtdC70LjQutC40LkgKDEycHQpJywKCSdOb3JtYWwgKDE0cHQpJzogJ9CX0LLQuNGH0LDQudC90LjQuSAoMTRwdCknLAoJJ0xhcmdlICgxOHB0KSc6ICfQktC10LvQuNC60LjQuSAoMThwdCknLAoJJ0xhcmdlICgyNHB0KSc6ICfQmtGA0YPQv9C90LjQuSAoMjRwdCknLAoJJ0xhcmdlICgzNnB0KSc6ICfQktC10LvQuNGH0LXQt9C90LjQuSAoMzZwdCknLAovLyBCb29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnOiAn0IbQvCZyc3F1bzvRjyDQt9Cw0LrQu9Cw0LTQutC4JywKLy8gTGluawoJJ0xpbmsgVVJMJzogJ9CQ0LTRgNC10YHQsCDRgdGB0LjQutC70ZYgKFVSTCknLAoJJ1RhcmdldCc6ICfQnNC10YLQsCcsCgknU2VsZWN0IGJvb2ttYXJrJyA6ICfQktGL0LHRgNCw0YLRjCDQt9Cw0LrQu9Cw0LTQutGDJywKCSdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JzogJ9CS0ZbQtNC60YDQuNGC0Lgg0L/QvtGB0LjQu9Cw0L3QvdGPINGDINGB0L/Qu9C40LLQsNGO0YfQvtC80YMg0LLRltC60L3RlicsCgknVVJMJzonJywKCSdXaW5kb3cgbmFtZSc6ICfQndCw0LfQstCwINCy0ZbQutC90LAnLAoJJ1dpbmRvdyBzaXplJzogJ9Cg0L7Qt9C80ZbRgCDQstGW0LrQvdCwJywKCSdXaW5kb3cgcG9zaXRpb24nOiAn0J/QvtC30LjRhtGW0Y8g0LLRltC60L3QsCcsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdyc6ICfQktGW0LTQutGA0LjRgtC4INC/0L7RgdC40LvQsNC90L3RjyDRgyDRgdC/0LvQuNCy0LDRjtGH0L7QvNGDINCy0ZbQutC90ZYnLAoJJ1dpbmRvdyBuYW1lJzogJ9Cd0LDQt9Cy0LAg0LLRltC60L3QsCcsCgknV2luZG93IHNpemUnOiAn0KDQvtC30LzRltGAINCy0ZbQutC90LAnLAoJJ1dpbmRvdyBwb3NpdGlvbic6ICfQn9C+0LfQuNGG0ZbRjyDQstGW0LrQvdCwJywKCSdMb2NhdGlvbiBiYXInOiAn0J/QsNC90LXQu9GMINC70L7QutCw0YbRltGXJywKCSdNZW51IGJhcic6ICfQn9Cw0L3QtdC70Ywg0LzQtdC90Y4nLAoJJ1Rvb2xiYXInOiAn0J/QsNC90LXQu9GMINGW0L3RgdGC0YDRg9C80LXQvdGC0ZbQsicsCgknU2Nyb2xsYmFycyc6ICfQodC80YPQs9C4INC/0YDQvtC60YDRg9GC0LrQuCcsCgknU3RhdHVzIGJhcic6ICfQoNGP0LTQvtC6INGB0YLQsNC90YMnLAoJJ1Jlc2l6YWJsZSc6ICfQl9C80ZbQvdCwINGA0L7Qt9C80ZbRgNGDJywKCSdEZXBlZGVudCc6ICfQl9Cw0LvQtdC20L3QuNC5IChOZXRzY2FwZSknLAoJJ0FkZCByZXR1cm4gZmFsc2UnOiAn0JTQvtC00LDRgtC4IChyZXR1cm4gZmFsc2UpJywKCSdUYXJnZXQgTUlNRSB0eXBlJzogJ01JTUUgdHlwZSDRhtGW0LvRlicsCgknUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJzogJ9Ch0YLQsNCy0LvQtdC90L3RjyDRgdGC0L7RgNGW0L3QutC4INC00L4g0LzQtdGC0LggKHJlbCkgJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknOiAn0JLRltC00L3QvtGI0LXQvdC90Y8g0LzQtdGC0Lgg0LTQviDRgdGC0L7RgNGW0L3QutC4IChyZXYpJywKCSdUYWIgaW5kZXgnOicnLAoJJ0FjY2VzcyBrZXknOiAn0JrQu9Cw0LLRltGI0LAg0LTQvtGB0YLRg9C/0YMnLAovLyBJbWFnZQoJJ1NpemUnOiAn0KDQvtC30LzRltGAJywKCSdQcmV2aWV3JzogJ9Cf0L7Qv9C10YDQtdC00L3RltC5INC/0LXRgNC10LPQu9GP0LQnLAoJJ01hcmdpbnMnOiAn0JLRltC00YHRgtGD0L/QuCcsCgknQWx0IHRleHQnOiAn0J7Qv9C40YEgKEFsdCknLAoJJ0ltYWdlIFVSTCc6ICdVUkwnLAovLyBUYWJsZQoJJ1NwYWNpbmcnICAgICAgIDogJ9Cf0YDQvtC80ZbQttC+0LogKHNwYWNpbmcpJywKCSdQYWRkaW5nJyAgICAgICA6ICfQktGW0LTRgdGC0YPQvyAocGFkZGluZyknLAoJJ1Jvd3MnICAgICAgICAgIDogJ9Cg0Y/QtNC+0LogJywKCSdDb2x1bW5zJyAgICAgICA6ICfQmtC+0LvQvtC90LrQuCcsCgknR3JvdXBzJyAgICAgICAgOiAn0JPRgNGD0L/Qv9GLJywKCSdDZWxscycgICAgICAgICA6ICfQr9GH0LXQudC60LgnLAoJJ0NhcHRpb24nICAgICAgIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiDRgtCw0LHQu9C40YbRlicsCgknSW5uZXIgYm9yZGVycycgOiAn0JLQvdGD0YLRgNGW0YjQvdGW0Lkg0LHQvtGA0LTRjtGAJyAsCgkvLyB0YWJsZSBjZWxsCgknVGFibGUgY2VsbCB0eXBlJyA6ICfQotC40L8g0Y/Rh9C10LnQutC4JywKCSdEYXRhJyA6ICfQlNCw0L3QvdGL0LUnLAoJJ0hlYWRlcicgOiAn0JfQsNCz0L7Qu9C+0LLQvtC6JywKCSdKdXN0aWZ5JyA6ICfQn9C+INC60YDQsNGP0LwnLAoJJ1BhZGRpbmdzJyA6ICfQntGC0YHRgtGD0L/RiycsCgknQXBwbHkgdG8nIDogJ9Cf0YDQuNC80LXQvdC40YLRjCDQuicsCgknQ3VycmVudCBjZWxsJyA6ICfQktGL0LHRgNCw0L3QvdCw0Y8g0Y/Rh9C10LnQutCwJywKCSdBbGwgY2VsbHMgaW4gcm93JyA6ICfQktGB0LUg0Y/Rh9C10LnQutC4INCyINGA0Y/QtNGDJywKCSdBbGwgY2VsbHMgaW4gY29sdW1uJyA6ICfQktGB0LUg0Y/Rh9C10LnQutC4INCyINGB0YLQvtC70LHRhtC1JywKCSdBbGwgY2VsbHMgaW4gdGFibGUnIDogJ9CS0YHQtSDRj9GH0LXQudC60Lgg0YLQsNCx0LvQuNGG0YsnLAoJLy8gYWJvdXQKCSdBYm91dCBlbFJURScgOiAn0J4g0YDQtdC00LDQutGC0L7RgNC1IGVsUlRFJywKCSdWZXJzaW9uJyA6ICfQktC10YDRgdC40Y8nLAoJJ0xpY2VuY2UnIDogJ9Cb0LjRhtC10L3Qt9C40Y8nLAoJJ2VsUlRFIGlzIGFuIG9wZW4tc291cmNlIEphdmFTY3JpcHQgYmFzZWQgV1lTSVdZRyBIVE1MLWVkaXRvci4nIDogJ2VsUlRFIC0g0Y3RgtC+INGB0LLQvtCx0L7QtNC90YvQuSBXWVNJV1lHINGA0LXQtNCw0LrRgtC+0YAg0LTQu9GPINGB0LDQudGC0L7QsiDQuCDRgdC40YHRgtC10Lwg0YPQv9GA0LDQstC70LXQvdC40Y8g0LrQvtC90YLQtdC90YLQvtC8IChDTVMpLCDQvdCw0L/QuNGB0LDQvdC90YvQuSDQvdCwIEphdmFTY3JpcHQuJywKCSdNYWluIGdvYWwgb2YgdGhlIGVkaXRvciAtIHNpbXBsaWZ5IHdvcmsgd2l0aCB0ZXh0IGFuZCBmb3JtYXRpbmcgKEhUTUwpIG9uIHNpdGVzLCBibG9ncywgZm9ydW1zIGFuZCBvdGhlciBvbmxpbmUgc2VydmljZXMuJyA6ICfQntGB0L3QvtCy0L3QsNGPINGG0LXQu9GMINGA0LXQtNCw0LrRgtC+0YDQsCAtINC80LDQutGB0LjQvNCw0LvRjNC90L4g0YPQv9GA0L7RgdGC0LjRgtGMINGA0LDQsdC+0YLRgyDRgSDRgtC10LrRgdGC0L7QvCDQuCDRgNCw0LfQvNC10YLQutC+0LkgKEhUTUwpINC90LAg0YHQsNC50YLQsNGFLCDQsdC70L7Qs9Cw0YUsINGE0L7RgNGD0LzQsNGFINC4INC/0YDQvtGH0LjRhSBvbmxpbmUg0YHQtdGA0LLQuNGB0LDRhS4nLAoJJ1lvdSBjYW4gdXNlIGl0IGluIGFueSBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsIHByb2plY3RzLicgOiAn0JLRiyDQvNC+0LbQtdGC0LUg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINC10LPQviDQsiDQu9GO0LHRi9GFINC60L7QvNC80LXRgNGH0LXRgdC60LjRhSDQuCDQvdC10LrQvtC80LzQtdGA0YfQtdGB0LrQuNGFINC/0YDQvtC10LrRgtCw0YUuJywKCSdBdXRob3JzJyA6ICfQkNCy0YLQvtGA0YsnLAoJJ0NoaWVmIGRldmVsb3BlcicgOiAn0JLQtdC00YPRidC40Lkg0YDQsNC30YDQsNCx0L7RgtGH0LjQuicsCgknRGV2ZWxvcGVyLCB0ZWNoIHN1cHBvcnQnIDogJ9Cg0LDQt9GA0LDQsdC+0YLRh9C40LosINGC0LXRhdC90LjRh9C10YHQutCw0Y8g0L/QvtC00LTQtdGA0LbQutCwJywKCSdJbnRlcmZhY2UgZGVzaWduZXInIDogJ9CU0LjQt9Cw0LnQvdC10YAg0LjQvdGC0LXRgNGE0LXQudGB0LAnLAoJJ1NwYW5pc2ggbG9jYWxpemF0aW9uJyA6ICfQmNGB0L/QsNC90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknSmFwYW5lc2UgbG9jYWxpemF0aW9uJyA6ICfQr9C/0L7QvdGB0LrQsNGPINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ0xhdHZpYW4gbG9jYWxpemF0aW9uJyA6ICfQm9Cw0YLQstC40LnRgdC60LDRjyDQu9C+0LrQsNC70LjQt9Cw0YbQuNGPJywKCSdHZXJtYW4gbG9jYWxpemF0aW9uJyA6ICfQndC10LzQtdGG0LrQsNGPINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ1VrcmFuaWFuIGxvY2FsaXphdGlvbicgOiAn0KPQutGA0LDQuNC90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzb2Z0d2FyZSB2aXNpdCB0aGUnIDogJ9Cf0L7QtNGA0L7QsdC90LDRjyDQuNC90YTQvtGA0LzQsNGG0LjRjyDQuCDRhNC+0YDRg9C8INGC0LXRhS4g0L/QvtC00LTQtdGA0LbQutC4JywKCSdlbFJURSB3ZWJzaXRlJyA6ICfQvdCwINGB0LDQudGC0LUgZWxSVEUnCn07Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.YOUR_LANG.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogV0FSTklORyEgWW91IHRoaXMgZmlsZSBpZiB5b3Ugd2FudCB0byBtYWtlIHlvdXIgb3duIHRyYW5zbGF0aW9uCiAqLwovKgogKiBZT1VSX0xBTkdVQUdFX1RSQU5TTEFUSU9OIHRyYW5zbGF0aW9uCiAqIEBhdXRob3IgTkFNRSA8RU1BSUw+CiAqIEB2ZXJzaW9uIDIwMXgteHgteHgKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5pMThNZXNzYWdlcy5UV09fTEVUVEVSX0xBTkdfQ09ERSA9IHsKCSdFZGl0b3InIDogJycsCgknU291cmNlJyA6ICcnLAoJLy8gcGFuZWxzIG5hbWVzCgknQ29weS9QYXNlJyAgICAgIDogJycsCgknVW5kby9SZWRvJyAgICAgIDogJycsCgknVGV4dCBzdHlsZXMnICAgIDogJycsCgknQ29sb3JzJyAgICAgICAgIDogJycsCgknQWxpZ25tZW50JyAgICAgIDogJycsCgknSW5kZW50L091dGRlbnQnIDogJycsCgknVGV4dCBmb3JtYXQnICAgIDogJycsCgknTGlzdHMnICAgICAgICAgIDogJycsCgknTWlzYyBlbGVtZW50cycgIDogJycsCgknTGlua3MnICAgICAgICAgIDogJycsCgknSW1hZ2VzJyAgICAgICAgIDogJycsCgknTWVkaWEnICAgICAgICAgIDogJycsCgknVGFibGVzJyAgICAgICAgIDogJycsCgknRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknIDogJycsCgkvLyBidXR0b25zIG5hbWVzCgknQWJvdXQgdGhpcyBzb2Z0d2FyZScgICAgIDogJycsCgknU2F2ZScgICAgICAgICAgICAgICAgICAgIDogJycsCgknQ29weScgICAgICAgICAgICAgICAgICAgIDogJycsCgknQ3V0JyAgICAgICAgICAgICAgICAgICAgIDogJycsCgknUGFzdGUnICAgICAgICAgICAgICAgICAgIDogJycsCgknUGFzdGUgb25seSB0ZXh0JyAgICAgICAgIDogJycsCgknUGFzdGUgZm9ybWF0dGVkIHRleHQnICAgIDogJycsCgknQ2xlYW4gZm9ybWF0JyAgICAgICAgICAgIDogJycsIAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICcnLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICcnLAoJJ0JvbGQnICAgICAgICAgICAgICAgICAgICA6ICcnLAoJJ0l0YWxpYycgICAgICAgICAgICAgICAgICA6ICcnLAoJJ1VuZGVybGluZScgICAgICAgICAgICAgICA6ICcnLAoJJ1N0cmlrZXRocm91Z2gnICAgICAgICAgICA6ICcnLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICcnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICcnLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICcnLAoJJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICcnLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICcnLAoJJ0FsaWduIGZ1bGwnICAgICAgICAgICAgICA6ICcnLAoJJ0ZvbnQgY29sb3InICAgICAgICAgICAgICA6ICcnLAoJJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICcnLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICcnLAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICcnLAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICcnLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICcnLAoJJ0ZvbnQnICAgICAgICAgICAgICAgICAgICA6ICcnLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICcnLAoJJ1Vub3JkZXJlZCBsaXN0JyAgICAgICAgICA6ICcnLAoJJ0hvcml6b250YWwgcnVsZScgICAgICAgICA6ICcnLAoJJ0Jsb2NrcXVvdGUnICAgICAgICAgICAgICA6ICcnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICcnLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICcnLAoJJ0RlbGV0ZSBsaW5rJyAgICAgICAgICAgICA6ICcnLAoJJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICcnLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICcnLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICcnLAoJJ0RlbGV0ZSB0YWJsZScgICAgICAgICAgICA6ICcnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICcnLAoJJ0luc2VydCByb3cgYWZ0ZXInICAgICAgICA6ICcnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICcnLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICcnLAoJJ0luc2VydCBjb2x1bW4gYWZ0ZXInICAgICA6ICcnLAoJJ0RlbGV0ZSBjb2x1bW4nICAgICAgICAgICA6ICcnLAoJJ01lcmdlIHRhYmxlIGNlbGxzJyAgICAgICA6ICcnLAoJJ1NwbGl0IHRhYmxlIGNlbGwnICAgICAgICA6ICcnLAoJJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAnJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAnJywKCSdUYWJsZSBwcm9wZXJ0aWVzJyAgICAgICAgOiAnJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAnJywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAnJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAnJywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAnJywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyAgICAgICAgICA6ICcnLAoJJ1Byb3BlcmllcycgICAgICAgIDogJycsCgknUG9wdXAnICAgICAgICAgICAgOiAnJywKCSdBZHZhbmNlZCcgICAgICAgICA6ICcnLAoJJ0V2ZW50cycgICAgICAgICAgIDogJycsCgknV2lkdGgnICAgICAgICAgICAgOiAnJywKCSdIZWlnaHQnICAgICAgICAgICA6ICcnLAoJJ0xlZnQnICAgICAgICAgICAgIDogJycsCgknQ2VudGVyJyAgICAgICAgICAgOiAnJywKCSdSaWdodCcgICAgICAgICAgICA6ICcnLAoJJ0JvcmRlcicgICAgICAgICAgIDogJycsCgknQmFja2dyb3VuZCcgICAgICAgOiAnJywKCSdDc3MgY2xhc3MnICAgICAgICA6ICcnLAoJJ0NzcyBzdHlsZScgICAgICAgIDogJycsCgknTm8nICAgICAgICAgICAgICAgOiAnJywKCSdUaXRsZScgICAgICAgICAgICA6ICcnLAoJJ1NjcmlwdCBkaXJlY3Rpb24nIDogJycsCgknTGFuZ3VhZ2UnICAgICAgICAgOiAnJywKCSdDaGFyc2V0JyAgICAgICAgICA6ICcnLAoJJ05vdCBzZXQnICAgICAgICAgIDogJycsCgknTGVmdCB0byByaWdodCcgICAgOiAnJywKCSdSaWdodCB0byBsZWZ0JyAgICA6ICcnLAoJJ0luIHRoaXMgd2luZG93JyAgIDogJycsCgknSW4gbmV3IHdpbmRvdyAoX2JsYW5rKScgICAgICAgICA6ICcnLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KScgOiAnJywKCSdJbiB0b3AgZnJhbWUgKF90b3ApJyAgICAgICAgICAgIDogJycsCgknVVJMJyAgICAgICAgICAgICAgOiAnJywKCSdPcGVuIGluJyAgICAgICAgICA6ICcnLAoJJ09wZW4gZmlsZSBtYW5nZXInIDogJycsCgkvLyBjb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuJyA6ICcnLAoJLy8gZm9ybWF0IAoJJ0hlYWRpbmcgMScgICAgIDogJycsCgknSGVhZGluZyAyJyAgICAgOiAnJywKCSdIZWFkaW5nIDMnICAgICA6ICcnLAoJJ0hlYWRpbmcgNCcgICAgIDogJycsCgknSGVhZGluZyA1JyAgICAgOiAnJywKCSdIZWFkaW5nIDYnICAgICA6ICcnLAoJJ1BhcmFncmFwaCcgICAgIDogJycsCgknQWRkcmVzcycgICAgICAgOiAnJywKCSdQcmVmb3JtYXR0ZWQnICA6ICcnLAoJLy8gZm9udCBzaXplCgknU21hbGwgKDhwdCknICAgOiAnJywKCSdTbWFsbCAoMTBweCknICA6ICcnLAoJJ1NtYWxsICgxMnB0KScgIDogJycsCgknTm9ybWFsICgxNHB0KScgOiAnJywKCSdMYXJnZSAoMThwdCknICA6ICcnLAoJJ0xhcmdlICgyNHB0KScgIDogJycsCgknTGFyZ2UgKDM2cHQpJyAgOiAnJywJCQkJCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJycsCgkvLyBsaW5rCgknTGluayBVUkwnICAgICAgICAgOiAnJywKCSdUYXJnZXQnICAgICAgICAgICA6ICcnLAoJJ1NlbGVjdCBib29rbWFyaycgIDogJycsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdycgOiAnJywKCSdXaW5kb3cgbmFtZScgICAgICA6ICcnLAoJJ1dpbmRvdyBzaXplJyAgICAgIDogJycsCgknV2luZG93IHBvc2l0aW9uJyAgOiAnJywKCSdMb2NhdGlvbiBiYXInICAgICA6ICcnLAoJJ01lbnUgYmFyJyAgICAgICAgIDogJycsCgknVG9vbGJhcicgICAgICAgICAgOiAnJywKCSdTY3JvbGxiYXJzJyAgICAgICA6ICcnLAoJJ1N0YXR1cyBiYXInICAgICAgIDogJycsCgknUmVzaXphYmxlJyAgICAgICAgOiAnJywKCSdEZXBlZGVudCcgICAgICAgICA6ICcnLAoJJ0FkZCByZXR1cm4gZmFsc2UnIDogJycsCgknVGFyZ2V0IE1JTUUgdHlwZScgOiAnJywKCSdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJycsCgknUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpJyA6ICcnLAoJJ1RhYiBpbmRleCcgICAgICAgIDogJycsCgknQWNjZXNzIGtleScgICAgICAgOiAnJywKCS8vIGltYWdlCgknU2l6ZScgICAgICAgICAgICAgOiAnJywKCSdQcmV2aWV3JyAgICAgICAgICA6ICcnLAoJJ01hcmdpbnMnICAgICAgICAgIDogJycsCgknQWx0IHRleHQnICAgICAgICAgOiAnJywKCSdJbWFnZSBVUkwnICAgICAgICA6ICcnLAoJLy8gdGFibGUKCSdTcGFjaW5nJyAgICAgICAgICA6ICcnLAoJJ1BhZGRpbmcnICAgICAgICAgIDogJycsCgknUm93cycgICAgICAgICAgICAgOiAnJywKCSdDb2x1bW5zJyAgICAgICAgICA6ICcnLAoJJ0dyb3VwcycgICAgICAgICAgIDogJycsCgknQ2VsbHMnICAgICAgICAgICAgOiAnJywKCSdDYXB0aW9uJyAgICAgICAgICA6ICcnLAoJJ0lubmVyIGJvcmRlcnMnICAgIDogJycsCgkvLyB0YWJsZSBjZWxsCgknVGFibGUgY2VsbCB0eXBlJyAgOiAnJywKCSdEYXRhJyAgICAgICAgICAgICA6ICcnLAoJJ0hlYWRlcicgICAgICAgICAgIDogJycsCgknSnVzdGlmeScgICAgICAgICAgOiAnJywKCSdQYWRkaW5ncycgICAgICAgICA6ICcnLAoJJ0FwcGx5IHRvJyAgICAgICAgIDogJycsCgknQ3VycmVudCBjZWxsJyAgICAgOiAnJywKCSdBbGwgY2VsbHMgaW4gcm93JyA6ICcnLAoJJ0FsbCBjZWxscyBpbiBjb2x1bW4nIDogJycsCgknQWxsIGNlbGxzIGluIHRhYmxlJyA6ICcnLAoJLy8gYWJvdXQKCSdBYm91dCBlbFJURScgICAgICAgICAgICAgICAgICA6ICcnLAoJJ1ZlcnNpb24nICAgICAgICAgICAgICAgICAgICAgIDogJycsCgknTGljZW5jZScgICAgICAgICAgICAgICAgICAgICAgOiAnJywKCSdlbFJURSBpcyBhbiBvcGVuLXNvdXJjZSBKYXZhU2NyaXB0IGJhc2VkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJyA6ICcnLAoJJ01haW4gZ29hbCBvZiB0aGUgZWRpdG9yIC0gc2ltcGxpZnkgd29yayB3aXRoIHRleHQgYW5kIGZvcm1hdGluZyAoSFRNTCkgb24gc2l0ZXMsIGJsb2dzLCBmb3J1bXMgYW5kIG90aGVyIG9ubGluZSBzZXJ2aWNlcy4nIDogJycsCgknWW91IGNhbiB1c2UgaXQgaW4gYW55IGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwgcHJvamVjdHMuJyA6ICcnLAoJJ0F1dGhvcnMnICAgICAgICAgICAgICAgICAgICAgIDogJycsCgknQ2hpZWYgZGV2ZWxvcGVyJyAgICAgICAgICAgICAgOiAnJywKCSdEZXZlbG9wZXIsIHRlY2ggc3VwcG9ydCcgICAgICA6ICcnLAoJJ0RldmVsb3BlcicgICAgICAgICAgICAgICAgICAgIDogJycsCgknSW50ZXJmYWNlIGRlc2lnbmVyJyAgICAgICAgICAgOiAnJywKCSdTcGFuaXNoIGxvY2FsaXphdGlvbicgICAgICAgICA6ICcnLAoJJ0N6ZWNoIGxvY2FsaXphdGlvbicgICAgICAgICAgIDogJycsCgknSmFwYW5lc2UgbG9jYWxpemF0aW9uJyAgICAgICAgOiAnJywKCSdMYXR2aWFuIGxvY2FsaXphdGlvbicgICAgICAgICA6ICcnLAoJJ0dlcm1hbiBsb2NhbGl6YXRpb24nICAgICAgICAgIDogJycsCgknVWtyYW5pYW4gbG9jYWxpemF0aW9uJyAgICAgICAgOiAnJywKCSdQZXJzaWFuIChmYXJzaSkgbG9jYWxpemF0aW9uJyA6ICcnLAoJJ0FyYWJpYyBsb2NhbGl6YXRpb24nICAgICAgICAgIDogJycsCgknUlRMIHN1cHBvcnQnICAgICAgICAgICAgICAgICAgOiAnJywKCSdGcmVuY2ggbG9jYWxpemF0aW9uJyAgICAgICAgICA6ICcnLAoJJ0R1dGNoIGxvY2FsaXphdGlvbicgICAgICAgICAgIDogJycsCgknSHVuZ2FyaWFuIGxvY2FsaXphdGlvbicgICAgICAgOiAnJywKCSdQb2xpc2ggbG9jYWxpemF0aW9uJyAgICAgICAgICA6ICcnLAoJJ0l0YWxpYW4gbG9jYWxpemF0aW9uJyAgICAgICAgIDogJycsCgknVHJhZGl0aW9uYWwgQ2hpbmVzZSBsb2NhbGl6YXRpb24nIDogJycsCgknRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzb2Z0d2FyZSB2aXNpdCB0aGUnIDogJycsCgknZWxSVEUgd2Vic2l0ZScgICAgICAgICAgICAgICAgOiAn0L3QsCDRgdCw0LnRgtC1IGVsUlRFJwp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.zh_TW.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFRyYWRpdGlvbmFsIENoaW5lc2UgdHJhbnNsYXRpb24KICogQGF1dGhvciBUYWQgPHRhZDA2MTZAZ21haWwuY29tPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuemhfVFcgPSB7CgknRWRpdG9yJyA6ICfmiYDopovljbPmiYDlvpcnLAoJJ1NvdXJjZScgOiAn5Y6f5aeL56K8JywKCS8vIFBhbmVsIE5hbWUKCSdDb3B5L1Bhc2UnICAgICAgOiAn6KSH6KO9L+iyvOS4iicsCgknVW5kby9SZWRvJyAgICAgIDogJ+W+qeWOny/ph43lgZonLAoJJ1RleHQgc3R5bGVzJyAgICA6ICfmloflrZfmqKPlvI8nLAoJJ0NvbG9ycycgICAgICAgICA6ICfpoY/oibInLAoJJ0FsaWdubWVudCcgICAgICA6ICflsI3pvYonLAoJJ0luZGVudC9PdXRkZW50JyA6ICfnuK7mjpIv5Ye45o6SJywKCSdUZXh0IGZvcm1hdCcgICAgOiAn5paH5a2X5qC85byPJywKCSdMaXN0cycgICAgICAgICAgOiAn5riF5ZauJywKCSdNaXNjIGVsZW1lbnRzJyAgOiAn5YW25LuW5YWD5Lu2JywKCSdMaW5rcycgICAgICAgICAgOiAn6YCj57WQJywKCSdJbWFnZXMnICAgICAgICAgOiAn5ZyW5qqUJywKCSdNZWRpYScgICAgICAgICAgOiAn5aSa5aqS6auUJywKCSdUYWJsZXMnICAgICAgICAgOiAn6KGo5qC8JywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAn5qqU5qGI566h55CGJywKCS8vIGJ1dHRvbiBuYW1lcwoJJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICflhLLlrZgnLAoJJ0NvcHknICAgICAgICAgICAgICAgICAgICA6ICfopIfoo70nLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICfliarkuIsnLAoJJ1Bhc3RlJyAgICAgICAgICAgICAgICAgICA6ICfosrzkuIonLAoJJ1Bhc3RlIG9ubHkgdGV4dCcgICAgICAgICA6ICfosrzkuIrntJTmloflrZcnLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICfosrzkuIrlt7LmoLzlvI/ljJbmloflrZcnLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICfmuIXpmaTmoLzlvI8nLAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICflvqnljp/mnIDlvozkuIDlgIvli5XkvZwnLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICfph43lgZrkuIrkuIDlgIvli5XkvZwnLAoJJ0JvbGQnICAgICAgICAgICAgICAgICAgICA6ICfnspfpq5QnLAoJJ0l0YWxpYycgICAgICAgICAgICAgICAgICA6ICfmlpzpq5QnLAoJJ1VuZGVybGluZScgICAgICAgICAgICAgICA6ICflupXnt5onLAoJJ1N0cmlrZXRocm91Z2gnICAgICAgICAgICA6ICfliKrpmaTnt5onLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICfkuIrmqJknLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICfkuIvmqJknLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICfpnaDlt6YnLAoJJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICfpnaDlj7MnLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICfnva7kuK0nLAoJJ0FsaWduIGZ1bGwnICAgICAgICAgICAgICA6ICflt6blj7PlsI3pvYonLAoJJ0ZvbnQgY29sb3InICAgICAgICAgICAgICA6ICfmloflrZfpoY/oibInLAoJJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICfog4zmma/poY/oibInLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICfnuK7mjpInLAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICflh7jmjpInLAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICfmoLzlvI8nLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICflrZflnovlpKflsI8nLAoJJ0ZvbnQnICAgICAgICAgICAgICAgICAgICA6ICflrZflnosnLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICfnt6jomZ8nLAoJJ1Vub3JkZXJlZCBsaXN0JyAgICAgICAgICA6ICfpoIXnm67nrKbomZ8nLAoJJ0hvcml6b250YWwgcnVsZScgICAgICAgICA6ICfmsLTlubPnt5onLAoJJ0Jsb2NrcXVvdGUnICAgICAgICAgICAgICA6ICflvJXnlKgnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICfljYDln5/lhYPku7YgKERJViknLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICfpgKPntZAnLAoJJ0RlbGV0ZSBsaW5rJyAgICAgICAgICAgICA6ICfnp7vpmaTpgKPntZAnLAoJJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICfmm7jnsaQnLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICfmj5LlnJYnLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICfooajmoLwnLAoJJ0RlbGV0ZSB0YWJsZScgICAgICAgICAgICA6ICfliKrpmaTooajmoLwnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICfkuIrmlrnmlrDlop7kuIDliJcnLAoJJ0luc2VydCByb3cgYWZ0ZXInICAgICAgICA6ICfkuIvmlrnmlrDlop7kuIDliJcnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICfliKrpmaTliJcnLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICflt6bpgormlrDlop7kuIDmrIQnLAoJJ0luc2VydCBjb2x1bW4gYWZ0ZXInICAgICA6ICflj7PpgormlrDlop7kuIDmrIQnLAoJJ0RlbGV0ZSBjb2x1bW4nICAgICAgICAgICA6ICfliKrpmaTmrIQnLAoJJ01lcmdlIHRhYmxlIGNlbGxzJyAgICAgICA6ICflkIjkvbXlhLLlrZjmoLwnLAoJJ1NwbGl0IHRhYmxlIGNlbGwnICAgICAgICA6ICfliIblibLlhLLlrZjmoLwnLAoJJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAn5YiH5o+b6aGv56S65paH5Lu257WQ5qeLJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAn6KGo5qC85YSy5a2Y5qC85bGs5oCnJywKCSdUYWJsZSBwcm9wZXJ0aWVzJyAgICAgICAgOiAn6KGo5qC85bGs5oCnJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAn5YiH5o+b54K65YWo6J6i5bmVJywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAn6ZaL5ZWf5qqU5qGI566h55CGJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAn5LiN5pa36KGM56m655m9JywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAn5YGc5q2i5YWD5Lu25rWu5YuV5bGs5oCnJywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICforablkYonLAoJJ1Byb3BlcmllcycgOiAn5bGs5oCnJywKCSdQb3B1cCcgOiAn6Lez5Ye65qGGJywKCSdBZHZhbmNlZCcgOiAn6YCy6ZqOJywKCSdFdmVudHMnIDogJ+S6i+S7ticsCgknV2lkdGgnIDogJ+WvrOW6picsCgknSGVpZ2h0JyA6ICfpq5jluqYnLAoJJ0xlZnQnICAgOiAn6Z2g5bemJywKCSdDZW50ZXInIDogJ+e9ruS4rScsCgknUmlnaHQnICA6ICfpnaDlj7MnLAoJJ0JvcmRlcicgOiAn6YKK5qGGJywKCSdCYWNrZ3JvdW5kJyA6ICfog4zmma8nLAoJJ0NzcyBjbGFzcycgOiAnQ1NT6aGe5YilJywKCSdDc3Mgc3R5bGUnIDogJ0NTU+aoo+W8jycsCgknTm8nIDogJ+S4jeioree9ricsCgknVGl0bGUnIDogJ+aomemhjCcsCgknU2NyaXB0IGRpcmVjdGlvbicgOiAn6Kqe6KiA5pa55ZCRJywKCSdMYW5ndWFnZScgOiAn6Kqe6KiAJywKCSdDaGFyc2V0JyA6ICflrZflhYPnt6jnorwnLAoJJ05vdCBzZXQnIDogJ+S4jeioreWumicsCgknTGVmdCB0byByaWdodCcgOiAn5bem6Iez5Y+zJywKCSdSaWdodCB0byBsZWZ0JyA6ICflj7PliLDlt6YnLAoJJ0luIHRoaXMgd2luZG93JyA6ICflnKjmraToppbnqpcnLAoJJ0luIG5ldyB3aW5kb3cgKF9ibGFuayknIDogJ+WcqOaWsOimlueqlyAoX2JsYW5rKScsCgknSW4gbmV3IHBhcmVudCB3aW5kb3cgKF9wYXJlbnQpJyA6ICflnKjniLboppbnqpcgKF9wYXJlbnQpJywKCSdJbiB0b3AgZnJhbWUgKF90b3ApJyA6ICfot7Plh7rmoYbmnrYgKF90b3ApJywKCSdVUkwnIDogJ+e2suWdgCcsCgknT3BlbiBpbicgOiAn6ZaL5ZWf6IezJywKCS8vIGNvcHkKCSdUaGlzIG9wZXJhdGlvbiBpcyBkaXNhYmxlZCBpbiB5b3VyIGJyb3dzZXIgb24gc2VjdXJpdHkgcmVhc29uLiBVc2Ugc2hvcnRjdXQgaW5zdGVhZC4nIDogJ+WfuuaWvOWuieWFqOeQhueUse+8jOatpOWLleS9nOeEoeazleWcqOeAj+imveWZqOS4remAsuihjO+8jOiri+ebtOaOpeaMiSBDdHJsK1Yg6Kmm6Kmm44CCJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ+aomemhjCAxJywKCSdIZWFkaW5nIDInIDogJ+aomemhjCAyJywKCSdIZWFkaW5nIDMnIDogJ+aomemhjCAzJywKCSdIZWFkaW5nIDQnIDogJ+aomemhjCA0JywKCSdIZWFkaW5nIDUnIDogJ+aomemhjCA1JywKCSdIZWFkaW5nIDYnIDogJ+aomemhjCA2JywKCSdQYXJhZ3JhcGgnIDogJ+auteiQvScsCgknQWRkcmVzcycgOiAn5L2N5Z2AJywKCSdQcmVmb3JtYXR0ZWQnIDogJ+WbuuWumuagvOW8jycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICfmpbXlsI8gKDhwdCknLAoJJ1NtYWxsICgxMHB4KScgIDogJ+abtOWwjyAoMTBweCknLAoJJ1NtYWxsICgxMnB0KScgIDogJ+WwjyAoMTJwdCknLAoJJ05vcm1hbCAoMTRwdCknIDogJ+S4rSAoMTRwdCknLAoJJ0xhcmdlICgxOHB0KScgIDogJ+WkpyAoMThwdCknLAoJJ0xhcmdlICgyNHB0KScgIDogJ+abtOWkpyAoMjRwdCknLAoJJ0xhcmdlICgzNnB0KScgIDogJ+alteWkpyAoMzZwdCknLAoJLy8gYm9va21hcmsKCSdCb29rbWFyayBuYW1lJyA6ICfmm7jnsaTlkI3nqLEnLAoJLy8gbGluawoJJ0xpbmsgVVJMJyA6ICfpgKPntZDkvY3lnYAnLAoJJ1RhcmdldCcgOiAn55uu5qiZJywKCSdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JyA6ICflnKjot7Plh7roppbnqpfkuK3plovllZ8nLAoJJ1dpbmRvdyBuYW1lJyA6ICfoppbnqpflkI3nqLEnLAoJJ1dpbmRvdyBzaXplJyA6ICfoppbnqpflsLrlr7gnLAoJJ1dpbmRvdyBwb3NpdGlvbicgOiAn6KaW56qX5L2N572uJywKCSdMb2NhdGlvbiBiYXInIDogJ+S9jeWdgOWIlycsCgknTWVudSBiYXInIDogJ+mBuOWWruWIlycsCgknVG9vbGJhcicgOiAn5bel5YW35YiXJywKCSdTY3JvbGxiYXJzJyA6ICfmjbLou7gnLAoJJ1N0YXR1cyBiYXInIDogJ+eLgOaFi+WIlycsCgknUmVzaXphYmxlJyA6ICflj6/lkKboqr/mlbTlsLrlr7gnLAoJJ0RlcGVkZW50JyA6ICfnm7jpl5wgKE5ldHNjYXBlKScsCgknQWRkIHJldHVybiBmYWxzZScgOiAn5Yqg5YWl5YKz5ZueZmFsc2UgKHJldHVybiBmYWxzZSknLAoJJ1RhcmdldCBNSU1FIHR5cGUnIDogJ+ebruaomeeJqeeahE1JTUXpoZ7lnosnLAoJJ1JlbGF0aW9uc2hpcCBwYWdlIHRvIHRhcmdldCAocmVsKScgOiAn5a6a576p6YCj57WQ55qE6LW36bue5paH5Lu26IiH55uu5qiZ5paH5Lu25LmL6ZaT55qE6Zec5L+CIChyZWwpJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknIDogJ+Wumue+qemAo+e1kOeahOi1t+m7nuaWh+S7tuiIh+ebruaomeaWh+S7tuS5i+mWk+eahOWPjeWQkemXnOS/giAocmV2KScsCgknVGFiIGluZGV4JyA6ICflrprkvY3ntKLlvJUnLAoJJ0FjY2VzcyBrZXknIDogJ+WtmOWPlumNtScsCgkvLyBpbWFnZQoJJ1NpemUnIDogJ+WwuuWvuCcsCgknUHJldmlldycgOiAn6aCQ6Ka9JywKCSdNYXJnaW5zJyA6ICfpgornlYwnLAoJJ0FsdCB0ZXh0JyA6ICfmj5DnpLrmloflrZcnLAoJJ0ltYWdlIFVSTCcgOiAn5ZyW5qqU57ay5Z2AJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAn5YSy5a2Y5qC86ZaT6LedIChTcGFjaW5nKScsCgknUGFkZGluZycgICAgICAgOiAn5YSy5a2Y5qC85YWn6LedIChQYWRkaW5nKScsCgknUm93cycgICAgICAgICAgOiAn5YiXJywKCSdDb2x1bW5zJyAgICAgICA6ICfmrIQnLAoJJ0dyb3VwcycgICAgICAgIDogJ+WEsuWtmOagvOe+pOe1hCcsCgknQ2VsbHMnICAgICAgICAgOiAn5YSy5a2Y5qC8JywKCSdDYXB0aW9uJyAgICAgICA6ICfooajmoLzmqJnpoYwnLAoJJ0lubmVyIGJvcmRlcnMnIDogJ+ahhue3micKCQoJCn0KfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/jquery-1.4.2.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNC4yCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMCwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTAsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBTYXQgRmViIDEzIDIyOjMzOjQ4IDIwMTAgLTA1MDAKICovCihmdW5jdGlvbihBLHcpe2Z1bmN0aW9uIG1hKCl7aWYoIWMuaXNSZWFkeSl7dHJ5e3MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChtYSwxKTtyZXR1cm59Yy5yZWFkeSgpfX1mdW5jdGlvbiBRYShhLGIpe2Iuc3JjP2MuYWpheCh7dXJsOmIuc3JjLGFzeW5jOmZhbHNlLGRhdGFUeXBlOiJzY3JpcHQifSk6Yy5nbG9iYWxFdmFsKGIudGV4dHx8Yi50ZXh0Q29udGVudHx8Yi5pbm5lckhUTUx8fCIiKTtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBYKGEsYixkLGYsZSxqKXt2YXIgaT1hLmxlbmd0aDtpZih0eXBlb2YgYj09PSJvYmplY3QiKXtmb3IodmFyIG8gaW4gYilYKGEsbyxiW29dLGYsZSxkKTtyZXR1cm4gYX1pZihkIT09dyl7Zj0haiYmZiYmYy5pc0Z1bmN0aW9uKGQpO2ZvcihvPTA7bzxpO28rKyllKGFbb10sYixmP2QuY2FsbChhW29dLG8sZShhW29dLGIpKTpkLGopO3JldHVybiBhfXJldHVybiBpPwplKGFbMF0sYik6d31mdW5jdGlvbiBKKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9ZnVuY3Rpb24gWSgpe3JldHVybiBmYWxzZX1mdW5jdGlvbiBaKCl7cmV0dXJuIHRydWV9ZnVuY3Rpb24gbmEoYSxiLGQpe2RbMF0udHlwZT1hO3JldHVybiBjLmV2ZW50LmhhbmRsZS5hcHBseShiLGQpfWZ1bmN0aW9uIG9hKGEpe3ZhciBiLGQ9W10sZj1bXSxlPWFyZ3VtZW50cyxqLGksbyxrLG4scjtpPWMuZGF0YSh0aGlzLCJldmVudHMiKTtpZighKGEubGl2ZUZpcmVkPT09dGhpc3x8IWl8fCFpLmxpdmV8fGEuYnV0dG9uJiZhLnR5cGU9PT0iY2xpY2siKSl7YS5saXZlRmlyZWQ9dGhpczt2YXIgdT1pLmxpdmUuc2xpY2UoMCk7Zm9yKGs9MDtrPHUubGVuZ3RoO2srKyl7aT11W2tdO2kub3JpZ1R5cGUucmVwbGFjZShPLCIiKT09PWEudHlwZT9mLnB1c2goaS5zZWxlY3Rvcik6dS5zcGxpY2Uoay0tLDEpfWo9YyhhLnRhcmdldCkuY2xvc2VzdChmLGEuY3VycmVudFRhcmdldCk7bj0wO2ZvcihyPQpqLmxlbmd0aDtuPHI7bisrKWZvcihrPTA7azx1Lmxlbmd0aDtrKyspe2k9dVtrXTtpZihqW25dLnNlbGVjdG9yPT09aS5zZWxlY3Rvcil7bz1qW25dLmVsZW07Zj1udWxsO2lmKGkucHJlVHlwZT09PSJtb3VzZWVudGVyInx8aS5wcmVUeXBlPT09Im1vdXNlbGVhdmUiKWY9YyhhLnJlbGF0ZWRUYXJnZXQpLmNsb3Nlc3QoaS5zZWxlY3RvcilbMF07aWYoIWZ8fGYhPT1vKWQucHVzaCh7ZWxlbTpvLGhhbmRsZU9iajppfSl9fW49MDtmb3Iocj1kLmxlbmd0aDtuPHI7bisrKXtqPWRbbl07YS5jdXJyZW50VGFyZ2V0PWouZWxlbTthLmRhdGE9ai5oYW5kbGVPYmouZGF0YTthLmhhbmRsZU9iaj1qLmhhbmRsZU9iajtpZihqLmhhbmRsZU9iai5vcmlnSGFuZGxlci5hcHBseShqLmVsZW0sZSk9PT1mYWxzZSl7Yj1mYWxzZTticmVha319cmV0dXJuIGJ9fWZ1bmN0aW9uIHBhKGEsYil7cmV0dXJuImxpdmUuIisoYSYmYSE9PSIqIj9hKyIuIjoiIikrYi5yZXBsYWNlKC9cLi9nLCJgIikucmVwbGFjZSgvIC9nLAoiJiIpfWZ1bmN0aW9uIHFhKGEpe3JldHVybiFhfHwhYS5wYXJlbnROb2RlfHxhLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMX1mdW5jdGlvbiByYShhLGIpe3ZhciBkPTA7Yi5lYWNoKGZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlTmFtZT09PShhW2RdJiZhW2RdLm5vZGVOYW1lKSl7dmFyIGY9Yy5kYXRhKGFbZCsrXSksZT1jLmRhdGEodGhpcyxmKTtpZihmPWYmJmYuZXZlbnRzKXtkZWxldGUgZS5oYW5kbGU7ZS5ldmVudHM9e307Zm9yKHZhciBqIGluIGYpZm9yKHZhciBpIGluIGZbal0pYy5ldmVudC5hZGQodGhpcyxqLGZbal1baV0sZltqXVtpXS5kYXRhKX19fSl9ZnVuY3Rpb24gc2EoYSxiLGQpe3ZhciBmLGUsajtiPWImJmJbMF0/YlswXS5vd25lckRvY3VtZW50fHxiWzBdOnM7aWYoYS5sZW5ndGg9PT0xJiZ0eXBlb2YgYVswXT09PSJzdHJpbmciJiZhWzBdLmxlbmd0aDw1MTImJmI9PT1zJiYhdGEudGVzdChhWzBdKSYmKGMuc3VwcG9ydC5jaGVja0Nsb25lfHwhdWEudGVzdChhWzBdKSkpe2U9CnRydWU7aWYoaj1jLmZyYWdtZW50c1thWzBdXSlpZihqIT09MSlmPWp9aWYoIWYpe2Y9Yi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Yy5jbGVhbihhLGIsZixkKX1pZihlKWMuZnJhZ21lbnRzW2FbMF1dPWo/ZjoxO3JldHVybntmcmFnbWVudDpmLGNhY2hlYWJsZTplfX1mdW5jdGlvbiBLKGEsYil7dmFyIGQ9e307Yy5lYWNoKHZhLmNvbmNhdC5hcHBseShbXSx2YS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2RbdGhpc109YX0pO3JldHVybiBkfWZ1bmN0aW9uIHdhKGEpe3JldHVybiJzY3JvbGxUbyJpbiBhJiZhLmRvY3VtZW50P2E6YS5ub2RlVHlwZT09PTk/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ZmFsc2V9dmFyIGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGMuZm4uaW5pdChhLGIpfSxSYT1BLmpRdWVyeSxTYT1BLiQscz1BLmRvY3VtZW50LFQsVGE9L15bXjxdKig8W1x3XFddKz4pW14+XSokfF4jKFtcdy1dKykkLyxVYT0vXi5bXjojXFtcLixdKiQvLFZhPS9cUy8sCldhPS9eKFxzfFx1MDBBMCkrfChcc3xcdTAwQTApKyQvZyxYYT0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLFA9bmF2aWdhdG9yLnVzZXJBZ2VudCx4YT1mYWxzZSxRPVtdLEwsJD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGFhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYmE9QXJyYXkucHJvdG90eXBlLnB1c2gsUj1BcnJheS5wcm90b3R5cGUuc2xpY2UseWE9QXJyYXkucHJvdG90eXBlLmluZGV4T2Y7Yy5mbj1jLnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhLGIpe3ZhciBkLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YTt0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFiKXt0aGlzLmNvbnRleHQ9czt0aGlzWzBdPXMuYm9keTt0aGlzLnNlbGVjdG9yPSJib2R5Ijt0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT09InN0cmluZyIpaWYoKGQ9VGEuZXhlYyhhKSkmJgooZFsxXXx8IWIpKWlmKGRbMV0pe2Y9Yj9iLm93bmVyRG9jdW1lbnR8fGI6cztpZihhPVhhLmV4ZWMoYSkpaWYoYy5pc1BsYWluT2JqZWN0KGIpKXthPVtzLmNyZWF0ZUVsZW1lbnQoYVsxXSldO2MuZm4uYXR0ci5jYWxsKGEsYix0cnVlKX1lbHNlIGE9W2YuY3JlYXRlRWxlbWVudChhWzFdKV07ZWxzZXthPXNhKFtkWzFdXSxbZl0pO2E9KGEuY2FjaGVhYmxlP2EuZnJhZ21lbnQuY2xvbmVOb2RlKHRydWUpOmEuZnJhZ21lbnQpLmNoaWxkTm9kZXN9cmV0dXJuIGMubWVyZ2UodGhpcyxhKX1lbHNle2lmKGI9cy5nZXRFbGVtZW50QnlJZChkWzJdKSl7aWYoYi5pZCE9PWRbMl0pcmV0dXJuIFQuZmluZChhKTt0aGlzLmxlbmd0aD0xO3RoaXNbMF09Yn10aGlzLmNvbnRleHQ9czt0aGlzLnNlbGVjdG9yPWE7cmV0dXJuIHRoaXN9ZWxzZSBpZighYiYmL15cdyskLy50ZXN0KGEpKXt0aGlzLnNlbGVjdG9yPWE7dGhpcy5jb250ZXh0PXM7YT1zLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO3JldHVybiBjLm1lcmdlKHRoaXMsCmEpfWVsc2UgcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHxUKS5maW5kKGEpOmMoYikuZmluZChhKTtlbHNlIGlmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gVC5yZWFkeShhKTtpZihhLnNlbGVjdG9yIT09dyl7dGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yO3RoaXMuY29udGV4dD1hLmNvbnRleHR9cmV0dXJuIGMubWFrZUFycmF5KGEsdGhpcyl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS40LjIiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gUi5jYWxsKHRoaXMsMCl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD90aGlzLnRvQXJyYXkoKTphPDA/dGhpcy5zbGljZShhKVswXTp0aGlzW2FdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPWMoKTtjLmlzQXJyYXkoYSk/YmEuYXBwbHkoZixhKTpjLm1lcmdlKGYsYSk7Zi5wcmV2T2JqZWN0PXRoaXM7Zi5jb250ZXh0PXRoaXMuY29udGV4dDtpZihiPT09CiJmaW5kIilmLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKStkO2Vsc2UgaWYoYilmLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK2IrIigiK2QrIikiO3JldHVybiBmfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2MuYmluZFJlYWR5KCk7aWYoYy5pc1JlYWR5KWEuY2FsbChzLGMpO2Vsc2UgUSYmUS5wdXNoKGEpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXtyZXR1cm4gYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLCthKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhSLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLFIuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYy5tYXAodGhpcywKZnVuY3Rpb24oYixkKXtyZXR1cm4gYS5jYWxsKGIsZCxiKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8YyhudWxsKX0scHVzaDpiYSxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX07Yy5mbi5pbml0LnByb3RvdHlwZT1jLmZuO2MuZXh0ZW5kPWMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzWzBdfHx7fSxiPTEsZD1hcmd1bWVudHMubGVuZ3RoLGY9ZmFsc2UsZSxqLGksbztpZih0eXBlb2YgYT09PSJib29sZWFuIil7Zj1hO2E9YXJndW1lbnRzWzFdfHx7fTtiPTJ9aWYodHlwZW9mIGEhPT0ib2JqZWN0IiYmIWMuaXNGdW5jdGlvbihhKSlhPXt9O2lmKGQ9PT1iKXthPXRoaXM7LS1ifWZvcig7YjxkO2IrKylpZigoZT1hcmd1bWVudHNbYl0pIT1udWxsKWZvcihqIGluIGUpe2k9YVtqXTtvPWVbal07aWYoYSE9PW8paWYoZiYmbyYmKGMuaXNQbGFpbk9iamVjdChvKXx8Yy5pc0FycmF5KG8pKSl7aT1pJiYoYy5pc1BsYWluT2JqZWN0KGkpfHwKYy5pc0FycmF5KGkpKT9pOmMuaXNBcnJheShvKT9bXTp7fTthW2pdPWMuZXh0ZW5kKGYsaSxvKX1lbHNlIGlmKG8hPT13KWFbal09b31yZXR1cm4gYX07Yy5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYSl7QS4kPVNhO2lmKGEpQS5qUXVlcnk9UmE7cmV0dXJuIGN9LGlzUmVhZHk6ZmFsc2UscmVhZHk6ZnVuY3Rpb24oKXtpZighYy5pc1JlYWR5KXtpZighcy5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGMucmVhZHksMTMpO2MuaXNSZWFkeT10cnVlO2lmKFEpe2Zvcih2YXIgYSxiPTA7YT1RW2IrK107KWEuY2FsbChzLGMpO1E9bnVsbH1jLmZuLnRyaWdnZXJIYW5kbGVyJiZjKHMpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpfX0sYmluZFJlYWR5OmZ1bmN0aW9uKCl7aWYoIXhhKXt4YT10cnVlO2lmKHMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIGMucmVhZHkoKTtpZihzLmFkZEV2ZW50TGlzdGVuZXIpe3MuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsCkwsZmFsc2UpO0EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYy5yZWFkeSxmYWxzZSl9ZWxzZSBpZihzLmF0dGFjaEV2ZW50KXtzLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEwpO0EuYXR0YWNoRXZlbnQoIm9ubG9hZCIsYy5yZWFkeSk7dmFyIGE9ZmFsc2U7dHJ5e2E9QS5mcmFtZUVsZW1lbnQ9PW51bGx9Y2F0Y2goYil7fXMuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsJiZhJiZtYSgpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuICQuY2FsbChhKT09PSJbb2JqZWN0IEZ1bmN0aW9uXSJ9LGlzQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuICQuY2FsbChhKT09PSJbb2JqZWN0IEFycmF5XSJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7aWYoIWF8fCQuY2FsbChhKSE9PSJbb2JqZWN0IE9iamVjdF0ifHxhLm5vZGVUeXBlfHxhLnNldEludGVydmFsKXJldHVybiBmYWxzZTtpZihhLmNvbnN0cnVjdG9yJiYhYWEuY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhYWEuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwKImlzUHJvdG90eXBlT2YiKSlyZXR1cm4gZmFsc2U7dmFyIGI7Zm9yKGIgaW4gYSk7cmV0dXJuIGI9PT13fHxhYS5jYWxsKGEsYil9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfSxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBhO30scGFyc2VKU09OOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT09InN0cmluZyJ8fCFhKXJldHVybiBudWxsO2E9Yy50cmltKGEpO2lmKC9eW1xdLDp7fVxzXSokLy50ZXN0KGEucmVwbGFjZSgvXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLCJAIikucmVwbGFjZSgvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csIl0iKS5yZXBsYWNlKC8oPzpefDp8LCkoPzpccypcWykrL2csIiIpKSlyZXR1cm4gQS5KU09OJiZBLkpTT04ucGFyc2U/QS5KU09OLnBhcnNlKGEpOihuZXcgRnVuY3Rpb24oInJldHVybiAiKwphKSkoKTtlbHNlIGMuZXJyb3IoIkludmFsaWQgSlNPTjogIithKX0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihhKXtpZihhJiZWYS50ZXN0KGEpKXt2YXIgYj1zLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fHMuZG9jdW1lbnRFbGVtZW50LGQ9cy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkLnR5cGU9InRleHQvamF2YXNjcmlwdCI7aWYoYy5zdXBwb3J0LnNjcmlwdEV2YWwpZC5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKGEpKTtlbHNlIGQudGV4dD1hO2IuaW5zZXJ0QmVmb3JlKGQsYi5maXJzdENoaWxkKTtiLnJlbW92ZUNoaWxkKGQpfX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT09Yi50b1VwcGVyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYixkKXt2YXIgZixlPTAsaj1hLmxlbmd0aCxpPWo9PT13fHxjLmlzRnVuY3Rpb24oYSk7aWYoZClpZihpKWZvcihmIGluIGEpe2lmKGIuYXBwbHkoYVtmXSwKZCk9PT1mYWxzZSlicmVha31lbHNlIGZvcig7ZTxqOyl7aWYoYi5hcHBseShhW2UrK10sZCk9PT1mYWxzZSlicmVha31lbHNlIGlmKGkpZm9yKGYgaW4gYSl7aWYoYi5jYWxsKGFbZl0sZixhW2ZdKT09PWZhbHNlKWJyZWFrfWVsc2UgZm9yKGQ9YVswXTtlPGomJmIuY2FsbChkLGUsZCkhPT1mYWxzZTtkPWFbKytlXSk7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuKGF8fCIiKS5yZXBsYWNlKFdhLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7Yj1ifHxbXTtpZihhIT1udWxsKWEubGVuZ3RoPT1udWxsfHx0eXBlb2YgYT09PSJzdHJpbmcifHxjLmlzRnVuY3Rpb24oYSl8fHR5cGVvZiBhIT09ImZ1bmN0aW9uIiYmYS5zZXRJbnRlcnZhbD9iYS5jYWxsKGIsYSk6Yy5tZXJnZShiLGEpO3JldHVybiBifSxpbkFycmF5OmZ1bmN0aW9uKGEsYil7aWYoYi5pbmRleE9mKXJldHVybiBiLmluZGV4T2YoYSk7Zm9yKHZhciBkPTAsZj1iLmxlbmd0aDtkPGY7ZCsrKWlmKGJbZF09PT0KYSlyZXR1cm4gZDtyZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmxlbmd0aCxmPTA7aWYodHlwZW9mIGIubGVuZ3RoPT09Im51bWJlciIpZm9yKHZhciBlPWIubGVuZ3RoO2Y8ZTtmKyspYVtkKytdPWJbZl07ZWxzZSBmb3IoO2JbZl0hPT13OylhW2QrK109YltmKytdO2EubGVuZ3RoPWQ7cmV0dXJuIGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGQpe2Zvcih2YXIgZj1bXSxlPTAsaj1hLmxlbmd0aDtlPGo7ZSsrKSFkIT09IWIoYVtlXSxlKSYmZi5wdXNoKGFbZV0pO3JldHVybiBmfSxtYXA6ZnVuY3Rpb24oYSxiLGQpe2Zvcih2YXIgZj1bXSxlLGo9MCxpPWEubGVuZ3RoO2o8aTtqKyspe2U9YihhW2pdLGosZCk7aWYoZSE9bnVsbClmW2YubGVuZ3RoXT1lfXJldHVybiBmLmNvbmNhdC5hcHBseShbXSxmKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYixkKXtpZihhcmd1bWVudHMubGVuZ3RoPT09MilpZih0eXBlb2YgYj09PSJzdHJpbmciKXtkPWE7YT1kW2JdO2I9d31lbHNlIGlmKGImJgohYy5pc0Z1bmN0aW9uKGIpKXtkPWI7Yj13fWlmKCFiJiZhKWI9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShkfHx0aGlzLGFyZ3VtZW50cyl9O2lmKGEpYi5ndWlkPWEuZ3VpZD1hLmd1aWR8fGIuZ3VpZHx8Yy5ndWlkKys7cmV0dXJuIGJ9LHVhTWF0Y2g6ZnVuY3Rpb24oYSl7YT1hLnRvTG93ZXJDYXNlKCk7YT0vKHdlYmtpdClbIFwvXShbXHcuXSspLy5leGVjKGEpfHwvKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8Lyhtc2llKSAoW1x3Ll0rKS8uZXhlYyhhKXx8IS9jb21wYXRpYmxlLy50ZXN0KGEpJiYvKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmFbMV18fCIiLHZlcnNpb246YVsyXXx8IjAifX0sYnJvd3Nlcjp7fX0pO1A9Yy51YU1hdGNoKFApO2lmKFAuYnJvd3Nlcil7Yy5icm93c2VyW1AuYnJvd3Nlcl09dHJ1ZTtjLmJyb3dzZXIudmVyc2lvbj1QLnZlcnNpb259aWYoYy5icm93c2VyLndlYmtpdCljLmJyb3dzZXIuc2FmYXJpPQp0cnVlO2lmKHlhKWMuaW5BcnJheT1mdW5jdGlvbihhLGIpe3JldHVybiB5YS5jYWxsKGIsYSl9O1Q9YyhzKTtpZihzLmFkZEV2ZW50TGlzdGVuZXIpTD1mdW5jdGlvbigpe3MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsTCxmYWxzZSk7Yy5yZWFkeSgpfTtlbHNlIGlmKHMuYXR0YWNoRXZlbnQpTD1mdW5jdGlvbigpe2lmKHMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpe3MuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsTCk7Yy5yZWFkeSgpfX07KGZ1bmN0aW9uKCl7Yy5zdXBwb3J0PXt9O3ZhciBhPXMuZG9jdW1lbnRFbGVtZW50LGI9cy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkPXMuY3JlYXRlRWxlbWVudCgiZGl2IiksZj0ic2NyaXB0IitKKCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtkLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0nY29sb3I6cmVkO2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiI7CnZhciBlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxqPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTtpZighKCFlfHwhZS5sZW5ndGh8fCFqKSl7Yy5zdXBwb3J0PXtsZWFkaW5nV2hpdGVzcGFjZTpkLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovcmVkLy50ZXN0KGouZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDpqLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41NSQvLnRlc3Qoai5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWouc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjpkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpzLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKHMuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLnNlbGVjdGVkLApwYXJlbnROb2RlOmQucmVtb3ZlQ2hpbGQoZC5hcHBlbmRDaGlsZChzLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSkucGFyZW50Tm9kZT09PW51bGwsZGVsZXRlRXhwYW5kbzp0cnVlLGNoZWNrQ2xvbmU6ZmFsc2Usc2NyaXB0RXZhbDpmYWxzZSxub0Nsb25lRXZlbnQ6dHJ1ZSxib3hNb2RlbDpudWxsfTtiLnR5cGU9InRleHQvamF2YXNjcmlwdCI7dHJ5e2IuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgid2luZG93LiIrZisiPTE7IikpfWNhdGNoKGkpe31hLmluc2VydEJlZm9yZShiLGEuZmlyc3RDaGlsZCk7aWYoQVtmXSl7Yy5zdXBwb3J0LnNjcmlwdEV2YWw9dHJ1ZTtkZWxldGUgQVtmXX10cnl7ZGVsZXRlIGIudGVzdH1jYXRjaChvKXtjLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz1mYWxzZX1hLnJlbW92ZUNoaWxkKGIpO2lmKGQuYXR0YWNoRXZlbnQmJmQuZmlyZUV2ZW50KXtkLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbiBrKCl7Yy5zdXBwb3J0Lm5vQ2xvbmVFdmVudD0KZmFsc2U7ZC5kZXRhY2hFdmVudCgib25jbGljayIsayl9KTtkLmNsb25lTm9kZSh0cnVlKS5maXJlRXZlbnQoIm9uY2xpY2siKX1kPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5pbm5lckhUTUw9IjxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0ncmFkaW90ZXN0JyBjaGVja2VkPSdjaGVja2VkJy8+IjthPXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2EuYXBwZW5kQ2hpbGQoZC5maXJzdENoaWxkKTtjLnN1cHBvcnQuY2hlY2tDbG9uZT1hLmNsb25lTm9kZSh0cnVlKS5jbG9uZU5vZGUodHJ1ZSkubGFzdENoaWxkLmNoZWNrZWQ7YyhmdW5jdGlvbigpe3ZhciBrPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7ay5zdHlsZS53aWR0aD1rLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiO3MuYm9keS5hcHBlbmRDaGlsZChrKTtjLmJveE1vZGVsPWMuc3VwcG9ydC5ib3hNb2RlbD1rLm9mZnNldFdpZHRoPT09MjtzLmJvZHkucmVtb3ZlQ2hpbGQoaykuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KTthPWZ1bmN0aW9uKGspe3ZhciBuPQpzLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2s9Im9uIitrO3ZhciByPWsgaW4gbjtpZighcil7bi5zZXRBdHRyaWJ1dGUoaywicmV0dXJuOyIpO3I9dHlwZW9mIG5ba109PT0iZnVuY3Rpb24ifXJldHVybiByfTtjLnN1cHBvcnQuc3VibWl0QnViYmxlcz1hKCJzdWJtaXQiKTtjLnN1cHBvcnQuY2hhbmdlQnViYmxlcz1hKCJjaGFuZ2UiKTthPWI9ZD1lPWo9bnVsbH19KSgpO2MucHJvcHM9eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLHJlYWRvbmx5OiJyZWFkT25seSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdGFiaW5kZXg6InRhYkluZGV4Iix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIn07dmFyIEc9ImpRdWVyeSIrSigpLFlhPTAsemE9e307Yy5leHRlbmQoe2NhY2hlOnt9LGV4cGFuZG86Ryxub0RhdGE6e2VtYmVkOnRydWUsb2JqZWN0OnRydWUsCmFwcGxldDp0cnVlfSxkYXRhOmZ1bmN0aW9uKGEsYixkKXtpZighKGEubm9kZU5hbWUmJmMubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKXthPWE9PUE/emE6YTt2YXIgZj1hW0ddLGU9Yy5jYWNoZTtpZighZiYmdHlwZW9mIGI9PT0ic3RyaW5nIiYmZD09PXcpcmV0dXJuIG51bGw7Znx8KGY9KytZYSk7aWYodHlwZW9mIGI9PT0ib2JqZWN0Iil7YVtHXT1mO2VbZl09Yy5leHRlbmQodHJ1ZSx7fSxiKX1lbHNlIGlmKCFlW2ZdKXthW0ddPWY7ZVtmXT17fX1hPWVbZl07aWYoZCE9PXcpYVtiXT1kO3JldHVybiB0eXBlb2YgYj09PSJzdHJpbmciP2FbYl06YX19LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtpZighKGEubm9kZU5hbWUmJmMubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKXthPWE9PUE/emE6YTt2YXIgZD1hW0ddLGY9Yy5jYWNoZSxlPWZbZF07aWYoYil7aWYoZSl7ZGVsZXRlIGVbYl07Yy5pc0VtcHR5T2JqZWN0KGUpJiZjLnJlbW92ZURhdGEoYSl9fWVsc2V7aWYoYy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8pZGVsZXRlIGFbYy5leHBhbmRvXTsKZWxzZSBhLnJlbW92ZUF0dHJpYnV0ZSYmYS5yZW1vdmVBdHRyaWJ1dGUoYy5leHBhbmRvKTtkZWxldGUgZltkXX19fX0pO2MuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PT0idW5kZWZpbmVkIiYmdGhpcy5sZW5ndGgpcmV0dXJuIGMuZGF0YSh0aGlzWzBdKTtlbHNlIGlmKHR5cGVvZiBhPT09Im9iamVjdCIpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MuZGF0YSh0aGlzLGEpfSk7dmFyIGQ9YS5zcGxpdCgiLiIpO2RbMV09ZFsxXT8iLiIrZFsxXToiIjtpZihiPT09dyl7dmFyIGY9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrZFsxXSsiISIsW2RbMF1dKTtpZihmPT09dyYmdGhpcy5sZW5ndGgpZj1jLmRhdGEodGhpc1swXSxhKTtyZXR1cm4gZj09PXcmJmRbMV0/dGhpcy5kYXRhKGRbMF0pOmZ9ZWxzZSByZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIitkWzFdKyIhIixbZFswXSxiXSkuZWFjaChmdW5jdGlvbigpe2MuZGF0YSh0aGlzLAphLGIpfSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSk7Yy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixkKXtpZihhKXtiPShifHwiZngiKSsicXVldWUiO3ZhciBmPWMuZGF0YShhLGIpO2lmKCFkKXJldHVybiBmfHxbXTtpZighZnx8Yy5pc0FycmF5KGQpKWY9Yy5kYXRhKGEsYixjLm1ha2VBcnJheShkKSk7ZWxzZSBmLnB1c2goZCk7cmV0dXJuIGZ9fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBkPWMucXVldWUoYSxiKSxmPWQuc2hpZnQoKTtpZihmPT09ImlucHJvZ3Jlc3MiKWY9ZC5zaGlmdCgpO2lmKGYpe2I9PT0iZngiJiZkLnVuc2hpZnQoImlucHJvZ3Jlc3MiKTtmLmNhbGwoYSxmdW5jdGlvbigpe2MuZGVxdWV1ZShhLGIpfSl9fX0pO2MuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhIT09InN0cmluZyIpe2I9YTthPSJmeCJ9aWYoYj09PQp3KXJldHVybiBjLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWMucXVldWUodGhpcyxhLGIpO2E9PT0iZngiJiZkWzBdIT09ImlucHJvZ3Jlc3MiJiZjLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGIpe2E9Yy5meD9jLmZ4LnNwZWVkc1thXXx8YTphO2I9Ynx8ImZ4IjtyZXR1cm4gdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKGQsYil9LGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9fSk7dmFyIEFhPS9bXG5cdF0vZyxjYT0vXHMrLyxaYT0vXHIvZywkYT0vaHJlZnxzcmN8c3R5bGUvLGFiPS8oYnV0dG9ufGlucHV0KS9pLGJiPS8oYnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpL2ksCmNiPS9eKGF8YXJlYSkkL2ksQmE9L3JhZGlvfGNoZWNrYm94LztjLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBYKHRoaXMsYSxiLHRydWUsYy5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5hdHRyKHRoaXMsYSwiIik7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMucmVtb3ZlQXR0cmlidXRlKGEpfSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciByPWModGhpcyk7ci5hZGRDbGFzcyhhLmNhbGwodGhpcyxuLHIuYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nIilmb3IodmFyIGI9KGF8fCIiKS5zcGxpdChjYSksZD0wLGY9dGhpcy5sZW5ndGg7ZDxmO2QrKyl7dmFyIGU9dGhpc1tkXTtpZihlLm5vZGVUeXBlPT09MSlpZihlLmNsYXNzTmFtZSl7Zm9yKHZhciBqPSIgIitlLmNsYXNzTmFtZSsiICIsCmk9ZS5jbGFzc05hbWUsbz0wLGs9Yi5sZW5ndGg7bzxrO28rKylpZihqLmluZGV4T2YoIiAiK2Jbb10rIiAiKTwwKWkrPSIgIitiW29dO2UuY2xhc3NOYW1lPWMudHJpbShpKX1lbHNlIGUuY2xhc3NOYW1lPWF9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGspe3ZhciBuPWModGhpcyk7bi5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxrLG4uYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nInx8YT09PXcpZm9yKHZhciBiPShhfHwiIikuc3BsaXQoY2EpLGQ9MCxmPXRoaXMubGVuZ3RoO2Q8ZjtkKyspe3ZhciBlPXRoaXNbZF07aWYoZS5ub2RlVHlwZT09PTEmJmUuY2xhc3NOYW1lKWlmKGEpe2Zvcih2YXIgaj0oIiAiK2UuY2xhc3NOYW1lKyIgIikucmVwbGFjZShBYSwiICIpLGk9MCxvPWIubGVuZ3RoO2k8bztpKyspaj1qLnJlcGxhY2UoIiAiK2JbaV0rIiAiLAoiICIpO2UuY2xhc3NOYW1lPWMudHJpbShqKX1lbHNlIGUuY2xhc3NOYW1lPSIifXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBkPXR5cGVvZiBhLGY9dHlwZW9mIGI9PT0iYm9vbGVhbiI7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGo9Yyh0aGlzKTtqLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGUsai5hdHRyKCJjbGFzcyIpLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGQ9PT0ic3RyaW5nIilmb3IodmFyIGUsaj0wLGk9Yyh0aGlzKSxvPWIsaz1hLnNwbGl0KGNhKTtlPWtbaisrXTspe289Zj9vOiFpLmhhc0NsYXNzKGUpO2lbbz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGUpfWVsc2UgaWYoZD09PSJ1bmRlZmluZWQifHxkPT09ImJvb2xlYW4iKXt0aGlzLmNsYXNzTmFtZSYmYy5kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKTt0aGlzLmNsYXNzTmFtZT0KdGhpcy5jbGFzc05hbWV8fGE9PT1mYWxzZT8iIjpjLmRhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn19KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7YT0iICIrYSsiICI7Zm9yKHZhciBiPTAsZD10aGlzLmxlbmd0aDtiPGQ7YisrKWlmKCgiICIrdGhpc1tiXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKEFhLCIgIikuaW5kZXhPZihhKT4tMSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9LHZhbDpmdW5jdGlvbihhKXtpZihhPT09dyl7dmFyIGI9dGhpc1swXTtpZihiKXtpZihjLm5vZGVOYW1lKGIsIm9wdGlvbiIpKXJldHVybihiLmF0dHJpYnV0ZXMudmFsdWV8fHt9KS5zcGVjaWZpZWQ/Yi52YWx1ZTpiLnRleHQ7aWYoYy5ub2RlTmFtZShiLCJzZWxlY3QiKSl7dmFyIGQ9Yi5zZWxlY3RlZEluZGV4LGY9W10sZT1iLm9wdGlvbnM7Yj1iLnR5cGU9PT0ic2VsZWN0LW9uZSI7aWYoZDwwKXJldHVybiBudWxsO3ZhciBqPWI/ZDowO2ZvcihkPWI/ZCsxOmUubGVuZ3RoO2o8ZDtqKyspe3ZhciBpPQplW2pdO2lmKGkuc2VsZWN0ZWQpe2E9YyhpKS52YWwoKTtpZihiKXJldHVybiBhO2YucHVzaChhKX19cmV0dXJuIGZ9aWYoQmEudGVzdChiLnR5cGUpJiYhYy5zdXBwb3J0LmNoZWNrT24pcmV0dXJuIGIuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09bnVsbD8ib24iOmIudmFsdWU7cmV0dXJuKGIudmFsdWV8fCIiKS5yZXBsYWNlKFphLCIiKX1yZXR1cm4gd312YXIgbz1jLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihrKXt2YXIgbj1jKHRoaXMpLHI9YTtpZih0aGlzLm5vZGVUeXBlPT09MSl7aWYobylyPWEuY2FsbCh0aGlzLGssbi52YWwoKSk7aWYodHlwZW9mIHI9PT0ibnVtYmVyIilyKz0iIjtpZihjLmlzQXJyYXkocikmJkJhLnRlc3QodGhpcy50eXBlKSl0aGlzLmNoZWNrZWQ9Yy5pbkFycmF5KG4udmFsKCkscik+PTA7ZWxzZSBpZihjLm5vZGVOYW1lKHRoaXMsInNlbGVjdCIpKXt2YXIgdT1jLm1ha2VBcnJheShyKTtjKCJvcHRpb24iLHRoaXMpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPQpjLmluQXJyYXkoYyh0aGlzKS52YWwoKSx1KT49MH0pO2lmKCF1Lmxlbmd0aCl0aGlzLnNlbGVjdGVkSW5kZXg9LTF9ZWxzZSB0aGlzLnZhbHVlPXJ9fSl9fSk7Yy5leHRlbmQoe2F0dHJGbjp7dmFsOnRydWUsY3NzOnRydWUsaHRtbDp0cnVlLHRleHQ6dHJ1ZSxkYXRhOnRydWUsd2lkdGg6dHJ1ZSxoZWlnaHQ6dHJ1ZSxvZmZzZXQ6dHJ1ZX0sYXR0cjpmdW5jdGlvbihhLGIsZCxmKXtpZighYXx8YS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04KXJldHVybiB3O2lmKGYmJmIgaW4gYy5hdHRyRm4pcmV0dXJuIGMoYSlbYl0oZCk7Zj1hLm5vZGVUeXBlIT09MXx8IWMuaXNYTUxEb2MoYSk7dmFyIGU9ZCE9PXc7Yj1mJiZjLnByb3BzW2JdfHxiO2lmKGEubm9kZVR5cGU9PT0xKXt2YXIgaj0kYS50ZXN0KGIpO2lmKGIgaW4gYSYmZiYmIWope2lmKGUpe2I9PT0idHlwZSImJmFiLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSYmYy5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7CmFbYl09ZH1pZihjLm5vZGVOYW1lKGEsImZvcm0iKSYmYS5nZXRBdHRyaWJ1dGVOb2RlKGIpKXJldHVybiBhLmdldEF0dHJpYnV0ZU5vZGUoYikubm9kZVZhbHVlO2lmKGI9PT0idGFiSW5kZXgiKXJldHVybihiPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiSW5kZXgiKSkmJmIuc3BlY2lmaWVkP2IudmFsdWU6YmIudGVzdChhLm5vZGVOYW1lKXx8Y2IudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6dztyZXR1cm4gYVtiXX1pZighYy5zdXBwb3J0LnN0eWxlJiZmJiZiPT09InN0eWxlIil7aWYoZSlhLnN0eWxlLmNzc1RleHQ9IiIrZDtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fWUmJmEuc2V0QXR0cmlidXRlKGIsIiIrZCk7YT0hYy5zdXBwb3J0LmhyZWZOb3JtYWxpemVkJiZmJiZqP2EuZ2V0QXR0cmlidXRlKGIsMik6YS5nZXRBdHRyaWJ1dGUoYik7cmV0dXJuIGE9PT1udWxsP3c6YX1yZXR1cm4gYy5zdHlsZShhLGIsZCl9fSk7dmFyIE89L1wuKC4qKSQvLGRiPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1teXHdcc1wuXHxgXS9nLApmdW5jdGlvbihiKXtyZXR1cm4iXFwiK2J9KX07Yy5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYixkLGYpe2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04KSl7aWYoYS5zZXRJbnRlcnZhbCYmYSE9PUEmJiFhLmZyYW1lRWxlbWVudClhPUE7dmFyIGUsajtpZihkLmhhbmRsZXIpe2U9ZDtkPWUuaGFuZGxlcn1pZighZC5ndWlkKWQuZ3VpZD1jLmd1aWQrKztpZihqPWMuZGF0YShhKSl7dmFyIGk9ai5ldmVudHM9ai5ldmVudHN8fHt9LG89ai5oYW5kbGU7aWYoIW8pai5oYW5kbGU9bz1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgYyE9PSJ1bmRlZmluZWQiJiYhYy5ldmVudC50cmlnZ2VyZWQ/Yy5ldmVudC5oYW5kbGUuYXBwbHkoby5lbGVtLGFyZ3VtZW50cyk6d307by5lbGVtPWE7Yj1iLnNwbGl0KCIgIik7Zm9yKHZhciBrLG49MCxyO2s9YltuKytdOyl7aj1lP2MuZXh0ZW5kKHt9LGUpOntoYW5kbGVyOmQsZGF0YTpmfTtpZihrLmluZGV4T2YoIi4iKT4tMSl7cj1rLnNwbGl0KCIuIik7Cms9ci5zaGlmdCgpO2oubmFtZXNwYWNlPXIuc2xpY2UoMCkuc29ydCgpLmpvaW4oIi4iKX1lbHNle3I9W107ai5uYW1lc3BhY2U9IiJ9ai50eXBlPWs7ai5ndWlkPWQuZ3VpZDt2YXIgdT1pW2tdLHo9Yy5ldmVudC5zcGVjaWFsW2tdfHx7fTtpZighdSl7dT1pW2tdPVtdO2lmKCF6LnNldHVwfHx6LnNldHVwLmNhbGwoYSxmLHIsbyk9PT1mYWxzZSlpZihhLmFkZEV2ZW50TGlzdGVuZXIpYS5hZGRFdmVudExpc3RlbmVyKGssbyxmYWxzZSk7ZWxzZSBhLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrayxvKX1pZih6LmFkZCl7ei5hZGQuY2FsbChhLGopO2lmKCFqLmhhbmRsZXIuZ3VpZClqLmhhbmRsZXIuZ3VpZD1kLmd1aWR9dS5wdXNoKGopO2MuZXZlbnQuZ2xvYmFsW2tdPXRydWV9YT1udWxsfX19LGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGQsZil7aWYoIShhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpKXt2YXIgZSxqPTAsaSxvLGssbixyLHUsej1jLmRhdGEoYSksCkM9eiYmei5ldmVudHM7aWYoeiYmQyl7aWYoYiYmYi50eXBlKXtkPWIuaGFuZGxlcjtiPWIudHlwZX1pZighYnx8dHlwZW9mIGI9PT0ic3RyaW5nIiYmYi5jaGFyQXQoMCk9PT0iLiIpe2I9Ynx8IiI7Zm9yKGUgaW4gQyljLmV2ZW50LnJlbW92ZShhLGUrYil9ZWxzZXtmb3IoYj1iLnNwbGl0KCIgIik7ZT1iW2orK107KXtuPWU7aT1lLmluZGV4T2YoIi4iKTwwO289W107aWYoIWkpe289ZS5zcGxpdCgiLiIpO2U9by5zaGlmdCgpO2s9bmV3IFJlZ0V4cCgiKF58XFwuKSIrYy5tYXAoby5zbGljZSgwKS5zb3J0KCksZGIpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpfWlmKHI9Q1tlXSlpZihkKXtuPWMuZXZlbnQuc3BlY2lhbFtlXXx8e307Zm9yKEI9Znx8MDtCPHIubGVuZ3RoO0IrKyl7dT1yW0JdO2lmKGQuZ3VpZD09PXUuZ3VpZCl7aWYoaXx8ay50ZXN0KHUubmFtZXNwYWNlKSl7Zj09bnVsbCYmci5zcGxpY2UoQi0tLDEpO24ucmVtb3ZlJiZuLnJlbW92ZS5jYWxsKGEsdSl9aWYoZiE9Cm51bGwpYnJlYWt9fWlmKHIubGVuZ3RoPT09MHx8ZiE9bnVsbCYmci5sZW5ndGg9PT0xKXtpZighbi50ZWFyZG93bnx8bi50ZWFyZG93bi5jYWxsKGEsbyk9PT1mYWxzZSlDYShhLGUsei5oYW5kbGUpO2RlbGV0ZSBDW2VdfX1lbHNlIGZvcih2YXIgQj0wO0I8ci5sZW5ndGg7QisrKXt1PXJbQl07aWYoaXx8ay50ZXN0KHUubmFtZXNwYWNlKSl7Yy5ldmVudC5yZW1vdmUoYSxuLHUuaGFuZGxlcixCKTtyLnNwbGljZShCLS0sMSl9fX1pZihjLmlzRW1wdHlPYmplY3QoQykpe2lmKGI9ei5oYW5kbGUpYi5lbGVtPW51bGw7ZGVsZXRlIHouZXZlbnRzO2RlbGV0ZSB6LmhhbmRsZTtjLmlzRW1wdHlPYmplY3QoeikmJmMucmVtb3ZlRGF0YShhKX19fX19LHRyaWdnZXI6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGU9YS50eXBlfHxhO2lmKCFmKXthPXR5cGVvZiBhPT09Im9iamVjdCI/YVtHXT9hOmMuZXh0ZW5kKGMuRXZlbnQoZSksYSk6Yy5FdmVudChlKTtpZihlLmluZGV4T2YoIiEiKT49MCl7YS50eXBlPQplPWUuc2xpY2UoMCwtMSk7YS5leGNsdXNpdmU9dHJ1ZX1pZighZCl7YS5zdG9wUHJvcGFnYXRpb24oKTtjLmV2ZW50Lmdsb2JhbFtlXSYmYy5lYWNoKGMuY2FjaGUsZnVuY3Rpb24oKXt0aGlzLmV2ZW50cyYmdGhpcy5ldmVudHNbZV0mJmMuZXZlbnQudHJpZ2dlcihhLGIsdGhpcy5oYW5kbGUuZWxlbSl9KX1pZighZHx8ZC5ub2RlVHlwZT09PTN8fGQubm9kZVR5cGU9PT04KXJldHVybiB3O2EucmVzdWx0PXc7YS50YXJnZXQ9ZDtiPWMubWFrZUFycmF5KGIpO2IudW5zaGlmdChhKX1hLmN1cnJlbnRUYXJnZXQ9ZDsoZj1jLmRhdGEoZCwiaGFuZGxlIikpJiZmLmFwcGx5KGQsYik7Zj1kLnBhcmVudE5vZGV8fGQub3duZXJEb2N1bWVudDt0cnl7aWYoIShkJiZkLm5vZGVOYW1lJiZjLm5vRGF0YVtkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSlpZihkWyJvbiIrZV0mJmRbIm9uIitlXS5hcHBseShkLGIpPT09ZmFsc2UpYS5yZXN1bHQ9ZmFsc2V9Y2F0Y2goail7fWlmKCFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJgpmKWMuZXZlbnQudHJpZ2dlcihhLGIsZix0cnVlKTtlbHNlIGlmKCFhLmlzRGVmYXVsdFByZXZlbnRlZCgpKXtmPWEudGFyZ2V0O3ZhciBpLG89Yy5ub2RlTmFtZShmLCJhIikmJmU9PT0iY2xpY2siLGs9Yy5ldmVudC5zcGVjaWFsW2VdfHx7fTtpZigoIWsuX2RlZmF1bHR8fGsuX2RlZmF1bHQuY2FsbChkLGEpPT09ZmFsc2UpJiYhbyYmIShmJiZmLm5vZGVOYW1lJiZjLm5vRGF0YVtmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSl7dHJ5e2lmKGZbZV0pe2lmKGk9Zlsib24iK2VdKWZbIm9uIitlXT1udWxsO2MuZXZlbnQudHJpZ2dlcmVkPXRydWU7ZltlXSgpfX1jYXRjaChuKXt9aWYoaSlmWyJvbiIrZV09aTtjLmV2ZW50LnRyaWdnZXJlZD1mYWxzZX19fSxoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGIsZCxmLGU7YT1hcmd1bWVudHNbMF09Yy5ldmVudC5maXgoYXx8QS5ldmVudCk7YS5jdXJyZW50VGFyZ2V0PXRoaXM7Yj1hLnR5cGUuaW5kZXhPZigiLiIpPDAmJiFhLmV4Y2x1c2l2ZTsKaWYoIWIpe2Q9YS50eXBlLnNwbGl0KCIuIik7YS50eXBlPWQuc2hpZnQoKTtmPW5ldyBSZWdFeHAoIihefFxcLikiK2Quc2xpY2UoMCkuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpfWU9Yy5kYXRhKHRoaXMsImV2ZW50cyIpO2Q9ZVthLnR5cGVdO2lmKGUmJmQpe2Q9ZC5zbGljZSgwKTtlPTA7Zm9yKHZhciBqPWQubGVuZ3RoO2U8ajtlKyspe3ZhciBpPWRbZV07aWYoYnx8Zi50ZXN0KGkubmFtZXNwYWNlKSl7YS5oYW5kbGVyPWkuaGFuZGxlcjthLmRhdGE9aS5kYXRhO2EuaGFuZGxlT2JqPWk7aT1pLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKGkhPT13KXthLnJlc3VsdD1pO2lmKGk9PT1mYWxzZSl7YS5wcmV2ZW50RGVmYXVsdCgpO2Euc3RvcFByb3BhZ2F0aW9uKCl9fWlmKGEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVha319fXJldHVybiBhLnJlc3VsdH0scHJvcHM6ImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zmc2V0WCBvZmZzZXRZIG9yaWdpbmFsVGFyZ2V0IHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLApmaXg6ZnVuY3Rpb24oYSl7aWYoYVtHXSlyZXR1cm4gYTt2YXIgYj1hO2E9Yy5FdmVudChiKTtmb3IodmFyIGQ9dGhpcy5wcm9wcy5sZW5ndGgsZjtkOyl7Zj10aGlzLnByb3BzWy0tZF07YVtmXT1iW2ZdfWlmKCFhLnRhcmdldClhLnRhcmdldD1hLnNyY0VsZW1lbnR8fHM7aWYoYS50YXJnZXQubm9kZVR5cGU9PT0zKWEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGU7aWYoIWEucmVsYXRlZFRhcmdldCYmYS5mcm9tRWxlbWVudClhLnJlbGF0ZWRUYXJnZXQ9YS5mcm9tRWxlbWVudD09PWEudGFyZ2V0P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQ7aWYoYS5wYWdlWD09bnVsbCYmYS5jbGllbnRYIT1udWxsKXtiPXMuZG9jdW1lbnRFbGVtZW50O2Q9cy5ib2R5O2EucGFnZVg9YS5jbGllbnRYKyhiJiZiLnNjcm9sbExlZnR8fGQmJmQuc2Nyb2xsTGVmdHx8MCktKGImJmIuY2xpZW50TGVmdHx8ZCYmZC5jbGllbnRMZWZ0fHwwKTthLnBhZ2VZPWEuY2xpZW50WSsoYiYmYi5zY3JvbGxUb3B8fApkJiZkLnNjcm9sbFRvcHx8MCktKGImJmIuY2xpZW50VG9wfHxkJiZkLmNsaWVudFRvcHx8MCl9aWYoIWEud2hpY2gmJihhLmNoYXJDb2RlfHxhLmNoYXJDb2RlPT09MD9hLmNoYXJDb2RlOmEua2V5Q29kZSkpYS53aGljaD1hLmNoYXJDb2RlfHxhLmtleUNvZGU7aWYoIWEubWV0YUtleSYmYS5jdHJsS2V5KWEubWV0YUtleT1hLmN0cmxLZXk7aWYoIWEud2hpY2gmJmEuYnV0dG9uIT09dylhLndoaWNoPWEuYnV0dG9uJjE/MTphLmJ1dHRvbiYyPzM6YS5idXR0b24mND8yOjA7cmV0dXJuIGF9LGd1aWQ6MUU4LHByb3h5OmMucHJveHksc3BlY2lhbDp7cmVhZHk6e3NldHVwOmMuYmluZFJlYWR5LHRlYXJkb3duOmMubm9vcH0sbGl2ZTp7YWRkOmZ1bmN0aW9uKGEpe2MuZXZlbnQuYWRkKHRoaXMsYS5vcmlnVHlwZSxjLmV4dGVuZCh7fSxhLHtoYW5kbGVyOm9hfSkpfSxyZW1vdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dHJ1ZSxkPWEub3JpZ1R5cGUucmVwbGFjZShPLCIiKTtjLmVhY2goYy5kYXRhKHRoaXMsCiJldmVudHMiKS5saXZlfHxbXSxmdW5jdGlvbigpe2lmKGQ9PT10aGlzLm9yaWdUeXBlLnJlcGxhY2UoTywiIikpcmV0dXJuIGI9ZmFsc2V9KTtiJiZjLmV2ZW50LnJlbW92ZSh0aGlzLGEub3JpZ1R5cGUsb2EpfX0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsZCl7aWYodGhpcy5zZXRJbnRlcnZhbCl0aGlzLm9uYmVmb3JldW5sb2FkPWQ7cmV0dXJuIGZhbHNlfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe2lmKHRoaXMub25iZWZvcmV1bmxvYWQ9PT1iKXRoaXMub25iZWZvcmV1bmxvYWQ9bnVsbH19fX07dmFyIENhPXMucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGIsZCxmYWxzZSl9OmZ1bmN0aW9uKGEsYixkKXthLmRldGFjaEV2ZW50KCJvbiIrYixkKX07Yy5FdmVudD1mdW5jdGlvbihhKXtpZighdGhpcy5wcmV2ZW50RGVmYXVsdClyZXR1cm4gbmV3IGMuRXZlbnQoYSk7aWYoYSYmYS50eXBlKXt0aGlzLm9yaWdpbmFsRXZlbnQ9CmE7dGhpcy50eXBlPWEudHlwZX1lbHNlIHRoaXMudHlwZT1hO3RoaXMudGltZVN0YW1wPUooKTt0aGlzW0ddPXRydWV9O2MuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPVo7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKGEpe2EucHJldmVudERlZmF1bHQmJmEucHJldmVudERlZmF1bHQoKTthLnJldHVyblZhbHVlPWZhbHNlfX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1aO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDtpZihhKXthLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKTthLmNhbmNlbEJ1YmJsZT10cnVlfX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1aO3RoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpZLGlzUHJvcGFnYXRpb25TdG9wcGVkOlksCmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOll9O3ZhciBEYT1mdW5jdGlvbihhKXt2YXIgYj1hLnJlbGF0ZWRUYXJnZXQ7dHJ5e2Zvcig7YiYmYiE9PXRoaXM7KWI9Yi5wYXJlbnROb2RlO2lmKGIhPT10aGlzKXthLnR5cGU9YS5kYXRhO2MuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19Y2F0Y2goZCl7fX0sRWE9ZnVuY3Rpb24oYSl7YS50eXBlPWEuZGF0YTtjLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2MuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Yy5ldmVudC5zcGVjaWFsW2FdPXtzZXR1cDpmdW5jdGlvbihkKXtjLmV2ZW50LmFkZCh0aGlzLGIsZCYmZC5zZWxlY3Rvcj9FYTpEYSxhKX0sdGVhcmRvd246ZnVuY3Rpb24oZCl7Yy5ldmVudC5yZW1vdmUodGhpcyxiLGQmJmQuc2VsZWN0b3I/RWE6RGEpfX19KTtpZighYy5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXMpYy5ldmVudC5zcGVjaWFsLnN1Ym1pdD0Ke3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09ImZvcm0iKXtjLmV2ZW50LmFkZCh0aGlzLCJjbGljay5zcGVjaWFsU3VibWl0IixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZigoZD09PSJzdWJtaXQifHxkPT09ImltYWdlIikmJmMoYikuY2xvc2VzdCgiZm9ybSIpLmxlbmd0aClyZXR1cm4gbmEoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSk7Yy5ldmVudC5hZGQodGhpcywia2V5cHJlc3Muc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoKGQ9PT0idGV4dCJ8fGQ9PT0icGFzc3dvcmQiKSYmYyhiKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoJiZhLmtleUNvZGU9PT0xMylyZXR1cm4gbmEoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSl9ZWxzZSByZXR1cm4gZmFsc2V9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Yy5ldmVudC5yZW1vdmUodGhpcywiLnNwZWNpYWxTdWJtaXQiKX19OwppZighYy5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMpe3ZhciBkYT0vdGV4dGFyZWF8aW5wdXR8c2VsZWN0L2ksZWEsRmE9ZnVuY3Rpb24oYSl7dmFyIGI9YS50eXBlLGQ9YS52YWx1ZTtpZihiPT09InJhZGlvInx8Yj09PSJjaGVja2JveCIpZD1hLmNoZWNrZWQ7ZWxzZSBpZihiPT09InNlbGVjdC1tdWx0aXBsZSIpZD1hLnNlbGVjdGVkSW5kZXg+LTE/Yy5tYXAoYS5vcHRpb25zLGZ1bmN0aW9uKGYpe3JldHVybiBmLnNlbGVjdGVkfSkuam9pbigiLSIpOiIiO2Vsc2UgaWYoYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InNlbGVjdCIpZD1hLnNlbGVjdGVkSW5kZXg7cmV0dXJuIGR9LGZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9YS50YXJnZXQsZixlO2lmKCEoIWRhLnRlc3QoZC5ub2RlTmFtZSl8fGQucmVhZE9ubHkpKXtmPWMuZGF0YShkLCJfY2hhbmdlX2RhdGEiKTtlPUZhKGQpO2lmKGEudHlwZSE9PSJmb2N1c291dCJ8fGQudHlwZSE9PSJyYWRpbyIpYy5kYXRhKGQsIl9jaGFuZ2VfZGF0YSIsCmUpO2lmKCEoZj09PXd8fGU9PT1mKSlpZihmIT1udWxsfHxlKXthLnR5cGU9ImNoYW5nZSI7cmV0dXJuIGMuZXZlbnQudHJpZ2dlcihhLGIsZCl9fX07Yy5ldmVudC5zcGVjaWFsLmNoYW5nZT17ZmlsdGVyczp7Zm9jdXNvdXQ6ZmEsY2xpY2s6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoZD09PSJyYWRpbyJ8fGQ9PT0iY2hlY2tib3gifHxiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0ic2VsZWN0IilyZXR1cm4gZmEuY2FsbCh0aGlzLGEpfSxrZXlkb3duOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yi50eXBlO2lmKGEua2V5Q29kZT09PTEzJiZiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0idGV4dGFyZWEifHxhLmtleUNvZGU9PT0zMiYmKGQ9PT0iY2hlY2tib3gifHxkPT09InJhZGlvIil8fGQ9PT0ic2VsZWN0LW11bHRpcGxlIilyZXR1cm4gZmEuY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXthPWEudGFyZ2V0O2MuZGF0YShhLAoiX2NoYW5nZV9kYXRhIixGYShhKSl9fSxzZXR1cDpmdW5jdGlvbigpe2lmKHRoaXMudHlwZT09PSJmaWxlIilyZXR1cm4gZmFsc2U7Zm9yKHZhciBhIGluIGVhKWMuZXZlbnQuYWRkKHRoaXMsYSsiLnNwZWNpYWxDaGFuZ2UiLGVhW2FdKTtyZXR1cm4gZGEudGVzdCh0aGlzLm5vZGVOYW1lKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtjLmV2ZW50LnJlbW92ZSh0aGlzLCIuc3BlY2lhbENoYW5nZSIpO3JldHVybiBkYS50ZXN0KHRoaXMubm9kZU5hbWUpfX07ZWE9Yy5ldmVudC5zcGVjaWFsLmNoYW5nZS5maWx0ZXJzfXMuYWRkRXZlbnRMaXN0ZW5lciYmYy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoZil7Zj1jLmV2ZW50LmZpeChmKTtmLnR5cGU9YjtyZXR1cm4gYy5ldmVudC5oYW5kbGUuY2FsbCh0aGlzLGYpfWMuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYSwKZCx0cnVlKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxkLHRydWUpfX19KTtjLmVhY2goWyJiaW5kIiwib25lIl0sZnVuY3Rpb24oYSxiKXtjLmZuW2JdPWZ1bmN0aW9uKGQsZixlKXtpZih0eXBlb2YgZD09PSJvYmplY3QiKXtmb3IodmFyIGogaW4gZCl0aGlzW2JdKGosZixkW2pdLGUpO3JldHVybiB0aGlzfWlmKGMuaXNGdW5jdGlvbihmKSl7ZT1mO2Y9d312YXIgaT1iPT09Im9uZSI/Yy5wcm94eShlLGZ1bmN0aW9uKGspe2ModGhpcykudW5iaW5kKGssaSk7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSk6ZTtpZihkPT09InVubG9hZCImJmIhPT0ib25lIil0aGlzLm9uZShkLGYsZSk7ZWxzZXtqPTA7Zm9yKHZhciBvPXRoaXMubGVuZ3RoO2o8bztqKyspYy5ldmVudC5hZGQodGhpc1tqXSxkLGksZil9cmV0dXJuIHRoaXN9fSk7Yy5mbi5leHRlbmQoe3VuYmluZDpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09Im9iamVjdCImJgohYS5wcmV2ZW50RGVmYXVsdClmb3IodmFyIGQgaW4gYSl0aGlzLnVuYmluZChkLGFbZF0pO2Vsc2V7ZD0wO2Zvcih2YXIgZj10aGlzLmxlbmd0aDtkPGY7ZCsrKWMuZXZlbnQucmVtb3ZlKHRoaXNbZF0sYSxiKX1yZXR1cm4gdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGQsZil7cmV0dXJuIHRoaXMubGl2ZShiLGQsZixhKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMudW5iaW5kKCJsaXZlIik6dGhpcy5kaWUoYixudWxsLGQsYSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pe2E9Yy5FdmVudChhKTthLnByZXZlbnREZWZhdWx0KCk7YS5zdG9wUHJvcGFnYXRpb24oKTtjLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXNbMF0pO3JldHVybiBhLnJlc3VsdH19LAp0b2dnbGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPWFyZ3VtZW50cyxkPTE7ZDxiLmxlbmd0aDspYy5wcm94eShhLGJbZCsrXSk7cmV0dXJuIHRoaXMuY2xpY2soYy5wcm94eShhLGZ1bmN0aW9uKGYpe3ZhciBlPShjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkLGUrMSk7Zi5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBiW2VdLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ZmFsc2V9KSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pO3ZhciBHYT17Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0Iixtb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In07Yy5lYWNoKFsibGl2ZSIsImRpZSJdLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkLGYsZSxqKXt2YXIgaSxvPTAsayxuLHI9anx8dGhpcy5zZWxlY3RvciwKdT1qP3RoaXM6Yyh0aGlzLmNvbnRleHQpO2lmKGMuaXNGdW5jdGlvbihmKSl7ZT1mO2Y9d31mb3IoZD0oZHx8IiIpLnNwbGl0KCIgIik7KGk9ZFtvKytdKSE9bnVsbDspe2o9Ty5leGVjKGkpO2s9IiI7aWYoail7az1qWzBdO2k9aS5yZXBsYWNlKE8sIiIpfWlmKGk9PT0iaG92ZXIiKWQucHVzaCgibW91c2VlbnRlciIraywibW91c2VsZWF2ZSIrayk7ZWxzZXtuPWk7aWYoaT09PSJmb2N1cyJ8fGk9PT0iYmx1ciIpe2QucHVzaChHYVtpXStrKTtpKz1rfWVsc2UgaT0oR2FbaV18fGkpK2s7Yj09PSJsaXZlIj91LmVhY2goZnVuY3Rpb24oKXtjLmV2ZW50LmFkZCh0aGlzLHBhKGkscikse2RhdGE6ZixzZWxlY3RvcjpyLGhhbmRsZXI6ZSxvcmlnVHlwZTppLG9yaWdIYW5kbGVyOmUscHJlVHlwZTpufSl9KTp1LnVuYmluZChwYShpLHIpLGUpfX1yZXR1cm4gdGhpc319KTtjLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IiLnNwbGl0KCIgIiksCmZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkKXtyZXR1cm4gZD90aGlzLmJpbmQoYixkKTp0aGlzLnRyaWdnZXIoYil9O2lmKGMuYXR0ckZuKWMuYXR0ckZuW2JdPXRydWV9KTtBLmF0dGFjaEV2ZW50JiYhQS5hZGRFdmVudExpc3RlbmVyJiZBLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gYy5jYWNoZSlpZihjLmNhY2hlW2FdLmhhbmRsZSl0cnl7Yy5ldmVudC5yZW1vdmUoYy5jYWNoZVthXS5oYW5kbGUuZWxlbSl9Y2F0Y2goYil7fX0pOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGEoZyl7Zm9yKHZhciBoPSIiLGwsbT0wO2dbbV07bSsrKXtsPWdbbV07aWYobC5ub2RlVHlwZT09PTN8fGwubm9kZVR5cGU9PT00KWgrPWwubm9kZVZhbHVlO2Vsc2UgaWYobC5ub2RlVHlwZSE9PTgpaCs9YShsLmNoaWxkTm9kZXMpfXJldHVybiBofWZ1bmN0aW9uIGIoZyxoLGwsbSxxLHApe3E9MDtmb3IodmFyIHY9bS5sZW5ndGg7cTx2O3ErKyl7dmFyIHQ9bVtxXTsKaWYodCl7dD10W2ddO2Zvcih2YXIgeT1mYWxzZTt0Oyl7aWYodC5zaXpjYWNoZT09PWwpe3k9bVt0LnNpenNldF07YnJlYWt9aWYodC5ub2RlVHlwZT09PTEmJiFwKXt0LnNpemNhY2hlPWw7dC5zaXpzZXQ9cX1pZih0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1oKXt5PXQ7YnJlYWt9dD10W2ddfW1bcV09eX19fWZ1bmN0aW9uIGQoZyxoLGwsbSxxLHApe3E9MDtmb3IodmFyIHY9bS5sZW5ndGg7cTx2O3ErKyl7dmFyIHQ9bVtxXTtpZih0KXt0PXRbZ107Zm9yKHZhciB5PWZhbHNlO3Q7KXtpZih0LnNpemNhY2hlPT09bCl7eT1tW3Quc2l6c2V0XTticmVha31pZih0Lm5vZGVUeXBlPT09MSl7aWYoIXApe3Quc2l6Y2FjaGU9bDt0LnNpenNldD1xfWlmKHR5cGVvZiBoIT09InN0cmluZyIpe2lmKHQ9PT1oKXt5PXRydWU7YnJlYWt9fWVsc2UgaWYoay5maWx0ZXIoaCxbdF0pLmxlbmd0aD4wKXt5PXQ7YnJlYWt9fXQ9dFtnXX1tW3FdPXl9fX12YXIgZj0vKCg/OlwoKD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtbXltcXV0qXF18WyciXVteJyJdKlsnIl18W15bXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywKZT0wLGo9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxpPWZhbHNlLG89dHJ1ZTtbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7bz1mYWxzZTtyZXR1cm4gMH0pO3ZhciBrPWZ1bmN0aW9uKGcsaCxsLG0pe2w9bHx8W107dmFyIHE9aD1ofHxzO2lmKGgubm9kZVR5cGUhPT0xJiZoLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighZ3x8dHlwZW9mIGchPT0ic3RyaW5nIilyZXR1cm4gbDtmb3IodmFyIHA9W10sdix0LHksUyxIPXRydWUsTT14KGgpLEk9ZzsoZi5leGVjKCIiKSx2PWYuZXhlYyhJKSkhPT1udWxsOyl7ST12WzNdO3AucHVzaCh2WzFdKTtpZih2WzJdKXtTPXZbM107YnJlYWt9fWlmKHAubGVuZ3RoPjEmJnIuZXhlYyhnKSlpZihwLmxlbmd0aD09PTImJm4ucmVsYXRpdmVbcFswXV0pdD1nYShwWzBdK3BbMV0saCk7ZWxzZSBmb3IodD1uLnJlbGF0aXZlW3BbMF1dP1toXTprKHAuc2hpZnQoKSxoKTtwLmxlbmd0aDspe2c9cC5zaGlmdCgpO2lmKG4ucmVsYXRpdmVbZ10pZys9cC5zaGlmdCgpOwp0PWdhKGcsdCl9ZWxzZXtpZighbSYmcC5sZW5ndGg+MSYmaC5ub2RlVHlwZT09PTkmJiFNJiZuLm1hdGNoLklELnRlc3QocFswXSkmJiFuLm1hdGNoLklELnRlc3QocFtwLmxlbmd0aC0xXSkpe3Y9ay5maW5kKHAuc2hpZnQoKSxoLE0pO2g9di5leHByP2suZmlsdGVyKHYuZXhwcix2LnNldClbMF06di5zZXRbMF19aWYoaCl7dj1tP3tleHByOnAucG9wKCksc2V0OnoobSl9OmsuZmluZChwLnBvcCgpLHAubGVuZ3RoPT09MSYmKHBbMF09PT0ifiJ8fHBbMF09PT0iKyIpJiZoLnBhcmVudE5vZGU/aC5wYXJlbnROb2RlOmgsTSk7dD12LmV4cHI/ay5maWx0ZXIodi5leHByLHYuc2V0KTp2LnNldDtpZihwLmxlbmd0aD4wKXk9eih0KTtlbHNlIEg9ZmFsc2U7Zm9yKDtwLmxlbmd0aDspe3ZhciBEPXAucG9wKCk7dj1EO2lmKG4ucmVsYXRpdmVbRF0pdj1wLnBvcCgpO2Vsc2UgRD0iIjtpZih2PT1udWxsKXY9aDtuLnJlbGF0aXZlW0RdKHksdixNKX19ZWxzZSB5PVtdfXl8fCh5PXQpO3l8fGsuZXJyb3IoRHx8CmcpO2lmKGouY2FsbCh5KT09PSJbb2JqZWN0IEFycmF5XSIpaWYoSClpZihoJiZoLm5vZGVUeXBlPT09MSlmb3IoZz0wO3lbZ10hPW51bGw7ZysrKXtpZih5W2ddJiYoeVtnXT09PXRydWV8fHlbZ10ubm9kZVR5cGU9PT0xJiZFKGgseVtnXSkpKWwucHVzaCh0W2ddKX1lbHNlIGZvcihnPTA7eVtnXSE9bnVsbDtnKyspeVtnXSYmeVtnXS5ub2RlVHlwZT09PTEmJmwucHVzaCh0W2ddKTtlbHNlIGwucHVzaC5hcHBseShsLHkpO2Vsc2Ugeih5LGwpO2lmKFMpe2soUyxxLGwsbSk7ay51bmlxdWVTb3J0KGwpfXJldHVybiBsfTtrLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZyl7aWYoQil7aT1vO2cuc29ydChCKTtpZihpKWZvcih2YXIgaD0xO2g8Zy5sZW5ndGg7aCsrKWdbaF09PT1nW2gtMV0mJmcuc3BsaWNlKGgtLSwxKX1yZXR1cm4gZ307ay5tYXRjaGVzPWZ1bmN0aW9uKGcsaCl7cmV0dXJuIGsoZyxudWxsLG51bGwsaCl9O2suZmluZD1mdW5jdGlvbihnLGgsbCl7dmFyIG0scTtpZighZylyZXR1cm5bXTsKZm9yKHZhciBwPTAsdj1uLm9yZGVyLmxlbmd0aDtwPHY7cCsrKXt2YXIgdD1uLm9yZGVyW3BdO2lmKHE9bi5sZWZ0TWF0Y2hbdF0uZXhlYyhnKSl7dmFyIHk9cVsxXTtxLnNwbGljZSgxLDEpO2lmKHkuc3Vic3RyKHkubGVuZ3RoLTEpIT09IlxcIil7cVsxXT0ocVsxXXx8IiIpLnJlcGxhY2UoL1xcL2csIiIpO209bi5maW5kW3RdKHEsaCxsKTtpZihtIT1udWxsKXtnPWcucmVwbGFjZShuLm1hdGNoW3RdLCIiKTticmVha319fX1tfHwobT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3JldHVybntzZXQ6bSxleHByOmd9fTtrLmZpbHRlcj1mdW5jdGlvbihnLGgsbCxtKXtmb3IodmFyIHE9ZyxwPVtdLHY9aCx0LHksUz1oJiZoWzBdJiZ4KGhbMF0pO2cmJmgubGVuZ3RoOyl7Zm9yKHZhciBIIGluIG4uZmlsdGVyKWlmKCh0PW4ubGVmdE1hdGNoW0hdLmV4ZWMoZykpIT1udWxsJiZ0WzJdKXt2YXIgTT1uLmZpbHRlcltIXSxJLEQ7RD10WzFdO3k9ZmFsc2U7dC5zcGxpY2UoMSwxKTtpZihELnN1YnN0cihELmxlbmd0aC0KMSkhPT0iXFwiKXtpZih2PT09cClwPVtdO2lmKG4ucHJlRmlsdGVyW0hdKWlmKHQ9bi5wcmVGaWx0ZXJbSF0odCx2LGwscCxtLFMpKXtpZih0PT09dHJ1ZSljb250aW51ZX1lbHNlIHk9ST10cnVlO2lmKHQpZm9yKHZhciBVPTA7KEQ9dltVXSkhPW51bGw7VSsrKWlmKEQpe0k9TShELHQsVSx2KTt2YXIgSGE9bV4hIUk7aWYobCYmSSE9bnVsbClpZihIYSl5PXRydWU7ZWxzZSB2W1VdPWZhbHNlO2Vsc2UgaWYoSGEpe3AucHVzaChEKTt5PXRydWV9fWlmKEkhPT13KXtsfHwodj1wKTtnPWcucmVwbGFjZShuLm1hdGNoW0hdLCIiKTtpZigheSlyZXR1cm5bXTticmVha319fWlmKGc9PT1xKWlmKHk9PW51bGwpay5lcnJvcihnKTtlbHNlIGJyZWFrO3E9Z31yZXR1cm4gdn07ay5lcnJvcj1mdW5jdGlvbihnKXt0aHJvdyJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2c7fTt2YXIgbj1rLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxcLikrKS8sCkNMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxcLikrKVsnIl0qXF0vLEFUVFI6L1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkYtXXxcXC4pKylccyooPzooXFM/PSlccyooWyciXSopKC4qPylcM3wpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCotXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XCgoZXZlbnxvZGR8W1xkbistXSopXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W14tXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkYtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy99LGxlZnRNYXRjaDp7fSxhdHRyTWFwOnsiY2xhc3MiOiJjbGFzc05hbWUiLCJmb3IiOiJodG1sRm9yIn0sYXR0ckhhbmRsZTp7aHJlZjpmdW5jdGlvbihnKXtyZXR1cm4gZy5nZXRBdHRyaWJ1dGUoImhyZWYiKX19LApyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGcsaCl7dmFyIGw9dHlwZW9mIGg9PT0ic3RyaW5nIixtPWwmJiEvXFcvLnRlc3QoaCk7bD1sJiYhbTtpZihtKWg9aC50b0xvd2VyQ2FzZSgpO209MDtmb3IodmFyIHE9Zy5sZW5ndGgscDttPHE7bSsrKWlmKHA9Z1ttXSl7Zm9yKDsocD1wLnByZXZpb3VzU2libGluZykmJnAubm9kZVR5cGUhPT0xOyk7Z1ttXT1sfHxwJiZwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1oP3B8fGZhbHNlOnA9PT1ofWwmJmsuZmlsdGVyKGgsZyx0cnVlKX0sIj4iOmZ1bmN0aW9uKGcsaCl7dmFyIGw9dHlwZW9mIGg9PT0ic3RyaW5nIjtpZihsJiYhL1xXLy50ZXN0KGgpKXtoPWgudG9Mb3dlckNhc2UoKTtmb3IodmFyIG09MCxxPWcubGVuZ3RoO208cTttKyspe3ZhciBwPWdbbV07aWYocCl7bD1wLnBhcmVudE5vZGU7Z1ttXT1sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1oP2w6ZmFsc2V9fX1lbHNle209MDtmb3IocT1nLmxlbmd0aDttPHE7bSsrKWlmKHA9Z1ttXSlnW21dPQpsP3AucGFyZW50Tm9kZTpwLnBhcmVudE5vZGU9PT1oO2wmJmsuZmlsdGVyKGgsZyx0cnVlKX19LCIiOmZ1bmN0aW9uKGcsaCxsKXt2YXIgbT1lKysscT1kO2lmKHR5cGVvZiBoPT09InN0cmluZyImJiEvXFcvLnRlc3QoaCkpe3ZhciBwPWg9aC50b0xvd2VyQ2FzZSgpO3E9Yn1xKCJwYXJlbnROb2RlIixoLG0sZyxwLGwpfSwifiI6ZnVuY3Rpb24oZyxoLGwpe3ZhciBtPWUrKyxxPWQ7aWYodHlwZW9mIGg9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChoKSl7dmFyIHA9aD1oLnRvTG93ZXJDYXNlKCk7cT1ifXEoInByZXZpb3VzU2libGluZyIsaCxtLGcscCxsKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGcsaCxsKXtpZih0eXBlb2YgaC5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYhbClyZXR1cm4oZz1oLmdldEVsZW1lbnRCeUlkKGdbMV0pKT9bZ106W119LE5BTUU6ZnVuY3Rpb24oZyxoKXtpZih0eXBlb2YgaC5nZXRFbGVtZW50c0J5TmFtZSE9PSJ1bmRlZmluZWQiKXt2YXIgbD1bXTsKaD1oLmdldEVsZW1lbnRzQnlOYW1lKGdbMV0pO2Zvcih2YXIgbT0wLHE9aC5sZW5ndGg7bTxxO20rKyloW21dLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09Z1sxXSYmbC5wdXNoKGhbbV0pO3JldHVybiBsLmxlbmd0aD09PTA/bnVsbDpsfX0sVEFHOmZ1bmN0aW9uKGcsaCl7cmV0dXJuIGguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZ1sxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGcsaCxsLG0scSxwKXtnPSIgIitnWzFdLnJlcGxhY2UoL1xcL2csIiIpKyIgIjtpZihwKXJldHVybiBnO3A9MDtmb3IodmFyIHY7KHY9aFtwXSkhPW51bGw7cCsrKWlmKHYpaWYocV4odi5jbGFzc05hbWUmJigiICIrdi5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcbl0vZywiICIpLmluZGV4T2YoZyk+PTApKWx8fG0ucHVzaCh2KTtlbHNlIGlmKGwpaFtwXT1mYWxzZTtyZXR1cm4gZmFsc2V9LElEOmZ1bmN0aW9uKGcpe3JldHVybiBnWzFdLnJlcGxhY2UoL1xcL2csIiIpfSxUQUc6ZnVuY3Rpb24oZyl7cmV0dXJuIGdbMV0udG9Mb3dlckNhc2UoKX0sCkNISUxEOmZ1bmN0aW9uKGcpe2lmKGdbMV09PT0ibnRoIil7dmFyIGg9LygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYyhnWzJdPT09ImV2ZW4iJiYiMm4ifHxnWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChnWzJdKSYmIjBuKyIrZ1syXXx8Z1syXSk7Z1syXT1oWzFdKyhoWzJdfHwxKS0wO2dbM109aFszXS0wfWdbMF09ZSsrO3JldHVybiBnfSxBVFRSOmZ1bmN0aW9uKGcsaCxsLG0scSxwKXtoPWdbMV0ucmVwbGFjZSgvXFwvZywiIik7aWYoIXAmJm4uYXR0ck1hcFtoXSlnWzFdPW4uYXR0ck1hcFtoXTtpZihnWzJdPT09In49IilnWzRdPSIgIitnWzRdKyIgIjtyZXR1cm4gZ30sUFNFVURPOmZ1bmN0aW9uKGcsaCxsLG0scSl7aWYoZ1sxXT09PSJub3QiKWlmKChmLmV4ZWMoZ1szXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChnWzNdKSlnWzNdPWsoZ1szXSxudWxsLG51bGwsaCk7ZWxzZXtnPWsuZmlsdGVyKGdbM10saCxsLHRydWVecSk7bHx8bS5wdXNoLmFwcGx5KG0sCmcpO3JldHVybiBmYWxzZX1lbHNlIGlmKG4ubWF0Y2guUE9TLnRlc3QoZ1swXSl8fG4ubWF0Y2guQ0hJTEQudGVzdChnWzBdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZ30sUE9TOmZ1bmN0aW9uKGcpe2cudW5zaGlmdCh0cnVlKTtyZXR1cm4gZ319LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZGlzYWJsZWQ9PT1mYWxzZSYmZy50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGcpe3JldHVybiBnLmRpc2FibGVkPT09dHJ1ZX0sY2hlY2tlZDpmdW5jdGlvbihnKXtyZXR1cm4gZy5jaGVja2VkPT09dHJ1ZX0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuc2VsZWN0ZWQ9PT10cnVlfSxwYXJlbnQ6ZnVuY3Rpb24oZyl7cmV0dXJuISFnLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGcpe3JldHVybiFnLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihnLGgsbCl7cmV0dXJuISFrKGxbM10sZykubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oZyl7cmV0dXJuL2hcZC9pLnRlc3QoZy5ub2RlTmFtZSl9LAp0ZXh0OmZ1bmN0aW9uKGcpe3JldHVybiJ0ZXh0Ij09PWcudHlwZX0scmFkaW86ZnVuY3Rpb24oZyl7cmV0dXJuInJhZGlvIj09PWcudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oZyl7cmV0dXJuImNoZWNrYm94Ij09PWcudHlwZX0sZmlsZTpmdW5jdGlvbihnKXtyZXR1cm4iZmlsZSI9PT1nLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGcpe3JldHVybiJwYXNzd29yZCI9PT1nLnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihnKXtyZXR1cm4ic3VibWl0Ij09PWcudHlwZX0saW1hZ2U6ZnVuY3Rpb24oZyl7cmV0dXJuImltYWdlIj09PWcudHlwZX0scmVzZXQ6ZnVuY3Rpb24oZyl7cmV0dXJuInJlc2V0Ij09PWcudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGcpe3JldHVybiJidXR0b24iPT09Zy50eXBlfHxnLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oZyl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGcubm9kZU5hbWUpfX0sCnNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGcsaCl7cmV0dXJuIGg9PT0wfSxsYXN0OmZ1bmN0aW9uKGcsaCxsLG0pe3JldHVybiBoPT09bS5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihnLGgpe3JldHVybiBoJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oZyxoKXtyZXR1cm4gaCUyPT09MX0sbHQ6ZnVuY3Rpb24oZyxoLGwpe3JldHVybiBoPGxbM10tMH0sZ3Q6ZnVuY3Rpb24oZyxoLGwpe3JldHVybiBoPmxbM10tMH0sbnRoOmZ1bmN0aW9uKGcsaCxsKXtyZXR1cm4gbFszXS0wPT09aH0sZXE6ZnVuY3Rpb24oZyxoLGwpe3JldHVybiBsWzNdLTA9PT1ofX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oZyxoLGwsbSl7dmFyIHE9aFsxXSxwPW4uZmlsdGVyc1txXTtpZihwKXJldHVybiBwKGcsbCxoLG0pO2Vsc2UgaWYocT09PSJjb250YWlucyIpcmV0dXJuKGcudGV4dENvbnRlbnR8fGcuaW5uZXJUZXh0fHxhKFtnXSl8fCIiKS5pbmRleE9mKGhbM10pPj0wO2Vsc2UgaWYocT09PSJub3QiKXtoPQpoWzNdO2w9MDtmb3IobT1oLmxlbmd0aDtsPG07bCsrKWlmKGhbbF09PT1nKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX1lbHNlIGsuZXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrcSl9LENISUxEOmZ1bmN0aW9uKGcsaCl7dmFyIGw9aFsxXSxtPWc7c3dpdGNoKGwpe2Nhc2UgIm9ubHkiOmNhc2UgImZpcnN0Ijpmb3IoO209bS5wcmV2aW91c1NpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtpZihsPT09ImZpcnN0IilyZXR1cm4gdHJ1ZTttPWc7Y2FzZSAibGFzdCI6Zm9yKDttPW0ubmV4dFNpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlICJudGgiOmw9aFsyXTt2YXIgcT1oWzNdO2lmKGw9PT0xJiZxPT09MClyZXR1cm4gdHJ1ZTtoPWhbMF07dmFyIHA9Zy5wYXJlbnROb2RlO2lmKHAmJihwLnNpemNhY2hlIT09aHx8IWcubm9kZUluZGV4KSl7dmFyIHY9MDtmb3IobT1wLmZpcnN0Q2hpbGQ7bTttPQptLm5leHRTaWJsaW5nKWlmKG0ubm9kZVR5cGU9PT0xKW0ubm9kZUluZGV4PSsrdjtwLnNpemNhY2hlPWh9Zz1nLm5vZGVJbmRleC1xO3JldHVybiBsPT09MD9nPT09MDpnJWw9PT0wJiZnL2w+PTB9fSxJRDpmdW5jdGlvbihnLGgpe3JldHVybiBnLm5vZGVUeXBlPT09MSYmZy5nZXRBdHRyaWJ1dGUoImlkIik9PT1ofSxUQUc6ZnVuY3Rpb24oZyxoKXtyZXR1cm4gaD09PSIqIiYmZy5ub2RlVHlwZT09PTF8fGcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWh9LENMQVNTOmZ1bmN0aW9uKGcsaCl7cmV0dXJuKCIgIisoZy5jbGFzc05hbWV8fGcuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoaCk+LTF9LEFUVFI6ZnVuY3Rpb24oZyxoKXt2YXIgbD1oWzFdO2c9bi5hdHRySGFuZGxlW2xdP24uYXR0ckhhbmRsZVtsXShnKTpnW2xdIT1udWxsP2dbbF06Zy5nZXRBdHRyaWJ1dGUobCk7bD1nKyIiO3ZhciBtPWhbMl07aD1oWzRdO3JldHVybiBnPT1udWxsP209PT0iIT0iOm09PT0KIj0iP2w9PT1oOm09PT0iKj0iP2wuaW5kZXhPZihoKT49MDptPT09In49Ij8oIiAiK2wrIiAiKS5pbmRleE9mKGgpPj0wOiFoP2wmJmchPT1mYWxzZTptPT09IiE9Ij9sIT09aDptPT09Il49Ij9sLmluZGV4T2YoaCk9PT0wOm09PT0iJD0iP2wuc3Vic3RyKGwubGVuZ3RoLWgubGVuZ3RoKT09PWg6bT09PSJ8PSI/bD09PWh8fGwuc3Vic3RyKDAsaC5sZW5ndGgrMSk9PT1oKyItIjpmYWxzZX0sUE9TOmZ1bmN0aW9uKGcsaCxsLG0pe3ZhciBxPW4uc2V0RmlsdGVyc1toWzJdXTtpZihxKXJldHVybiBxKGcsbCxoLG0pfX19LHI9bi5tYXRjaC5QT1M7Zm9yKHZhciB1IGluIG4ubWF0Y2gpe24ubWF0Y2hbdV09bmV3IFJlZ0V4cChuLm1hdGNoW3VdLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpO24ubGVmdE1hdGNoW3VdPW5ldyBSZWdFeHAoLyheKD86LnxccnxcbikqPykvLnNvdXJjZStuLm1hdGNoW3VdLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2csZnVuY3Rpb24oZywKaCl7cmV0dXJuIlxcIisoaC0wKzEpfSkpfXZhciB6PWZ1bmN0aW9uKGcsaCl7Zz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChnLDApO2lmKGgpe2gucHVzaC5hcHBseShoLGcpO3JldHVybiBofXJldHVybiBnfTt0cnl7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocy5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcywwKX1jYXRjaChDKXt6PWZ1bmN0aW9uKGcsaCl7aD1ofHxbXTtpZihqLmNhbGwoZyk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGgsZyk7ZWxzZSBpZih0eXBlb2YgZy5sZW5ndGg9PT0ibnVtYmVyIilmb3IodmFyIGw9MCxtPWcubGVuZ3RoO2w8bTtsKyspaC5wdXNoKGdbbF0pO2Vsc2UgZm9yKGw9MDtnW2xdO2wrKyloLnB1c2goZ1tsXSk7cmV0dXJuIGh9fXZhciBCO2lmKHMuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKUI9ZnVuY3Rpb24oZyxoKXtpZighZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8CiFoLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXtpZihnPT1oKWk9dHJ1ZTtyZXR1cm4gZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxfWc9Zy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihoKSY0Py0xOmc9PT1oPzA6MTtpZihnPT09MClpPXRydWU7cmV0dXJuIGd9O2Vsc2UgaWYoInNvdXJjZUluZGV4ImluIHMuZG9jdW1lbnRFbGVtZW50KUI9ZnVuY3Rpb24oZyxoKXtpZighZy5zb3VyY2VJbmRleHx8IWguc291cmNlSW5kZXgpe2lmKGc9PWgpaT10cnVlO3JldHVybiBnLnNvdXJjZUluZGV4Py0xOjF9Zz1nLnNvdXJjZUluZGV4LWguc291cmNlSW5kZXg7aWYoZz09PTApaT10cnVlO3JldHVybiBnfTtlbHNlIGlmKHMuY3JlYXRlUmFuZ2UpQj1mdW5jdGlvbihnLGgpe2lmKCFnLm93bmVyRG9jdW1lbnR8fCFoLm93bmVyRG9jdW1lbnQpe2lmKGc9PWgpaT10cnVlO3JldHVybiBnLm93bmVyRG9jdW1lbnQ/LTE6MX12YXIgbD1nLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSxtPQpoLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtsLnNldFN0YXJ0KGcsMCk7bC5zZXRFbmQoZywwKTttLnNldFN0YXJ0KGgsMCk7bS5zZXRFbmQoaCwwKTtnPWwuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLlNUQVJUX1RPX0VORCxtKTtpZihnPT09MClpPXRydWU7cmV0dXJuIGd9OyhmdW5jdGlvbigpe3ZhciBnPXMuY3JlYXRlRWxlbWVudCgiZGl2IiksaD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKTtnLmlubmVySFRNTD0iPGEgbmFtZT0nIitoKyInLz4iO3ZhciBsPXMuZG9jdW1lbnRFbGVtZW50O2wuaW5zZXJ0QmVmb3JlKGcsbC5maXJzdENoaWxkKTtpZihzLmdldEVsZW1lbnRCeUlkKGgpKXtuLmZpbmQuSUQ9ZnVuY3Rpb24obSxxLHApe2lmKHR5cGVvZiBxLmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiFwKXJldHVybihxPXEuZ2V0RWxlbWVudEJ5SWQobVsxXSkpP3EuaWQ9PT1tWzFdfHx0eXBlb2YgcS5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJgpxLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09bVsxXT9bcV06dzpbXX07bi5maWx0ZXIuSUQ9ZnVuY3Rpb24obSxxKXt2YXIgcD10eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJm0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbS5ub2RlVHlwZT09PTEmJnAmJnAubm9kZVZhbHVlPT09cX19bC5yZW1vdmVDaGlsZChnKTtsPWc9bnVsbH0pKCk7KGZ1bmN0aW9uKCl7dmFyIGc9cy5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmFwcGVuZENoaWxkKHMuY3JlYXRlQ29tbWVudCgiIikpO2lmKGcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCluLmZpbmQuVEFHPWZ1bmN0aW9uKGgsbCl7bD1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKGhbMV0pO2lmKGhbMV09PT0iKiIpe2g9W107Zm9yKHZhciBtPTA7bFttXTttKyspbFttXS5ub2RlVHlwZT09PTEmJmgucHVzaChsW21dKTtsPWh9cmV0dXJuIGx9O2cuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IjsKaWYoZy5maXJzdENoaWxkJiZ0eXBlb2YgZy5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PSJ1bmRlZmluZWQiJiZnLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyIpbi5hdHRySGFuZGxlLmhyZWY9ZnVuY3Rpb24oaCl7cmV0dXJuIGguZ2V0QXR0cmlidXRlKCJocmVmIiwyKX07Zz1udWxsfSkoKTtzLnF1ZXJ5U2VsZWN0b3JBbGwmJmZ1bmN0aW9uKCl7dmFyIGc9ayxoPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5pbm5lckhUTUw9IjxwIGNsYXNzPSdURVNUJz48L3A+IjtpZighKGgucXVlcnlTZWxlY3RvckFsbCYmaC5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aD09PTApKXtrPWZ1bmN0aW9uKG0scSxwLHYpe3E9cXx8cztpZighdiYmcS5ub2RlVHlwZT09PTkmJiF4KHEpKXRyeXtyZXR1cm4geihxLnF1ZXJ5U2VsZWN0b3JBbGwobSkscCl9Y2F0Y2godCl7fXJldHVybiBnKG0scSxwLHYpfTtmb3IodmFyIGwgaW4gZylrW2xdPWdbbF07aD1udWxsfX0oKTsKKGZ1bmN0aW9uKCl7dmFyIGc9cy5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEoIWcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZXx8Zy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09MCkpe2cubGFzdENoaWxkLmNsYXNzTmFtZT0iZSI7aWYoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MSl7bi5vcmRlci5zcGxpY2UoMSwwLCJDTEFTUyIpO24uZmluZC5DTEFTUz1mdW5jdGlvbihoLGwsbSl7aWYodHlwZW9mIGwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PSJ1bmRlZmluZWQiJiYhbSlyZXR1cm4gbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGhbMV0pfTtnPW51bGx9fX0pKCk7dmFyIEU9cy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihnLGgpe3JldHVybiEhKGcuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaCkmMTYpfToKZnVuY3Rpb24oZyxoKXtyZXR1cm4gZyE9PWgmJihnLmNvbnRhaW5zP2cuY29udGFpbnMoaCk6dHJ1ZSl9LHg9ZnVuY3Rpb24oZyl7cmV0dXJuKGc9KGc/Zy5vd25lckRvY3VtZW50fHxnOjApLmRvY3VtZW50RWxlbWVudCk/Zy5ub2RlTmFtZSE9PSJIVE1MIjpmYWxzZX0sZ2E9ZnVuY3Rpb24oZyxoKXt2YXIgbD1bXSxtPSIiLHE7Zm9yKGg9aC5ub2RlVHlwZT9baF06aDtxPW4ubWF0Y2guUFNFVURPLmV4ZWMoZyk7KXttKz1xWzBdO2c9Zy5yZXBsYWNlKG4ubWF0Y2guUFNFVURPLCIiKX1nPW4ucmVsYXRpdmVbZ10/ZysiKiI6ZztxPTA7Zm9yKHZhciBwPWgubGVuZ3RoO3E8cDtxKyspayhnLGhbcV0sbCk7cmV0dXJuIGsuZmlsdGVyKG0sbCl9O2MuZmluZD1rO2MuZXhwcj1rLnNlbGVjdG9ycztjLmV4cHJbIjoiXT1jLmV4cHIuZmlsdGVycztjLnVuaXF1ZT1rLnVuaXF1ZVNvcnQ7Yy50ZXh0PWE7Yy5pc1hNTERvYz14O2MuY29udGFpbnM9RX0pKCk7dmFyIGViPS9VbnRpbCQvLGZiPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLApnYj0vLC87Uj1BcnJheS5wcm90b3R5cGUuc2xpY2U7dmFyIElhPWZ1bmN0aW9uKGEsYixkKXtpZihjLmlzRnVuY3Rpb24oYikpcmV0dXJuIGMuZ3JlcChhLGZ1bmN0aW9uKGUsail7cmV0dXJuISFiLmNhbGwoZSxqLGUpPT09ZH0pO2Vsc2UgaWYoYi5ub2RlVHlwZSlyZXR1cm4gYy5ncmVwKGEsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1iPT09ZH0pO2Vsc2UgaWYodHlwZW9mIGI9PT0ic3RyaW5nIil7dmFyIGY9Yy5ncmVwKGEsZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZVR5cGU9PT0xfSk7aWYoVWEudGVzdChiKSlyZXR1cm4gYy5maWx0ZXIoYixmLCFkKTtlbHNlIGI9Yy5maWx0ZXIoYixmKX1yZXR1cm4gYy5ncmVwKGEsZnVuY3Rpb24oZSl7cmV0dXJuIGMuaW5BcnJheShlLGIpPj0wPT09ZH0pfTtjLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGQ9MCxmPTAsZT10aGlzLmxlbmd0aDtmPGU7ZisrKXtkPWIubGVuZ3RoOwpjLmZpbmQoYSx0aGlzW2ZdLGIpO2lmKGY+MClmb3IodmFyIGo9ZDtqPGIubGVuZ3RoO2orKylmb3IodmFyIGk9MDtpPGQ7aSsrKWlmKGJbaV09PT1iW2pdKXtiLnNwbGljZShqLS0sMSk7YnJlYWt9fXJldHVybiBifSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9YyhhKTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGQ9MCxmPWIubGVuZ3RoO2Q8ZjtkKyspaWYoYy5jb250YWlucyh0aGlzLGJbZF0pKXJldHVybiB0cnVlfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soSWEodGhpcyxhLGZhbHNlKSwibm90IixhKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhJYSh0aGlzLGEsdHJ1ZSksImZpbHRlciIsYSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhYSYmYy5maWx0ZXIoYSx0aGlzKS5sZW5ndGg+MH0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2lmKGMuaXNBcnJheShhKSl7dmFyIGQ9W10sZj10aGlzWzBdLGUsaj0Ke30saTtpZihmJiZhLmxlbmd0aCl7ZT0wO2Zvcih2YXIgbz1hLmxlbmd0aDtlPG87ZSsrKXtpPWFbZV07altpXXx8KGpbaV09Yy5leHByLm1hdGNoLlBPUy50ZXN0KGkpP2MoaSxifHx0aGlzLmNvbnRleHQpOmkpfWZvcig7ZiYmZi5vd25lckRvY3VtZW50JiZmIT09Yjspe2ZvcihpIGluIGope2U9altpXTtpZihlLmpxdWVyeT9lLmluZGV4KGYpPi0xOmMoZikuaXMoZSkpe2QucHVzaCh7c2VsZWN0b3I6aSxlbGVtOmZ9KTtkZWxldGUgaltpXX19Zj1mLnBhcmVudE5vZGV9fXJldHVybiBkfXZhciBrPWMuZXhwci5tYXRjaC5QT1MudGVzdChhKT9jKGEsYnx8dGhpcy5jb250ZXh0KTpudWxsO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbihuLHIpe2Zvcig7ciYmci5vd25lckRvY3VtZW50JiZyIT09Yjspe2lmKGs/ay5pbmRleChyKT4tMTpjKHIpLmlzKGEpKXJldHVybiByO3I9ci5wYXJlbnROb2RlfXJldHVybiBudWxsfSl9LGluZGV4OmZ1bmN0aW9uKGEpe2lmKCFhfHx0eXBlb2YgYT09PQoic3RyaW5nIilyZXR1cm4gYy5pbkFycmF5KHRoaXNbMF0sYT9jKGEpOnRoaXMucGFyZW50KCkuY2hpbGRyZW4oKSk7cmV0dXJuIGMuaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyl9LGFkZDpmdW5jdGlvbihhLGIpe2E9dHlwZW9mIGE9PT0ic3RyaW5nIj9jKGEsYnx8dGhpcy5jb250ZXh0KTpjLm1ha2VBcnJheShhKTtiPWMubWVyZ2UodGhpcy5nZXQoKSxhKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socWEoYVswXSl8fHFhKGJbMF0pP2I6Yy51bmlxdWUoYikpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSk7Yy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5wYXJlbnROb2RlKSYmYS5ub2RlVHlwZSE9PTExP2E6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmRpcihhLCJwYXJlbnROb2RlIiwKZCl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGMubnRoKGEsMiwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gYy5udGgoYSwyLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuZGlyKGEsIm5leHRTaWJsaW5nIixkKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixkKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLnBhcmVudE5vZGUuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5ub2RlTmFtZShhLCJpZnJhbWUiKT8KYS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpjLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQsZil7dmFyIGU9Yy5tYXAodGhpcyxiLGQpO2ViLnRlc3QoYSl8fChmPWQpO2lmKGYmJnR5cGVvZiBmPT09InN0cmluZyIpZT1jLmZpbHRlcihmLGUpO2U9dGhpcy5sZW5ndGg+MT9jLnVuaXF1ZShlKTplO2lmKCh0aGlzLmxlbmd0aD4xfHxnYi50ZXN0KGYpKSYmZmIudGVzdChhKSllPWUucmV2ZXJzZSgpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUi5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KTtjLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixkKXtpZihkKWE9Ijpub3QoIithKyIpIjtyZXR1cm4gYy5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj1bXTtmb3IoYT1hW2JdO2EmJmEubm9kZVR5cGUhPT05JiYoZD09PXd8fGEubm9kZVR5cGUhPT0xfHwhYyhhKS5pcyhkKSk7KXthLm5vZGVUeXBlPT09CjEmJmYucHVzaChhKTthPWFbYl19cmV0dXJuIGZ9LG50aDpmdW5jdGlvbihhLGIsZCl7Yj1ifHwxO2Zvcih2YXIgZj0wO2E7YT1hW2RdKWlmKGEubm9kZVR5cGU9PT0xJiYrK2Y9PT1iKWJyZWFrO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmZC5wdXNoKGEpO3JldHVybiBkfX0pO3ZhciBKYT0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLFY9L15ccysvLEthPS8oPChbXHc6XSspW14+XSo/KVwvPi9nLGhiPS9eKD86YXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkkL2ksTGE9LzwoW1x3Ol0rKS8saWI9Lzx0Ym9keS9pLGpiPS88fCYjP1x3KzsvLHRhPS88c2NyaXB0fDxvYmplY3R8PGVtYmVkfDxvcHRpb258PHN0eWxlL2ksdWE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksTWE9ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBoYi50ZXN0KGQpPwphOmIrIj48LyIrZCsiPiJ9LEY9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07Ri5vcHRncm91cD1GLm9wdGlvbjtGLnRib2R5PUYudGZvb3Q9Ri5jb2xncm91cD1GLmNhcHRpb249Ri50aGVhZDtGLnRoPUYudGQ7aWYoIWMuc3VwcG9ydC5odG1sU2VyaWFsaXplKUYuX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il07Yy5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGQ9CmModGhpcyk7ZC50ZXh0KGEuY2FsbCh0aGlzLGIsZC50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT09Im9iamVjdCImJmEhPT13KXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fHMpLmNyZWF0ZVRleHROb2RlKGEpKTtyZXR1cm4gYy50ZXh0KHRoaXMpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe2ModGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxkKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1jKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSh0cnVlKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pO2IubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciBkPXRoaXM7ZC5maXJzdENoaWxkJiZkLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xOylkPWQuZmlyc3RDaGlsZDtyZXR1cm4gZH0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sCndyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtjKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Yyh0aGlzKSxkPWIuY29udGVudHMoKTtkLmxlbmd0aD9kLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS53cmFwQWxsKGEpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXtjLm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8Yyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyx0cnVlLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmFwcGVuZENoaWxkKGEpfSl9LApwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLHRydWUsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuaW5zZXJ0QmVmb3JlKGEsdGhpcy5maXJzdENoaWxkKX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZhbHNlLGZ1bmN0aW9uKGIpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYix0aGlzKX0pO2Vsc2UgaWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Yyhhcmd1bWVudHNbMF0pO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZhbHNlLGZ1bmN0aW9uKGIpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYiwKdGhpcy5uZXh0U2libGluZyl9KTtlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGMoYXJndW1lbnRzWzBdKS50b0FycmF5KCkpO3JldHVybiBhfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPTAsZjsoZj10aGlzW2RdKSE9bnVsbDtkKyspaWYoIWF8fGMuZmlsdGVyKGEsW2ZdKS5sZW5ndGgpe2lmKCFiJiZmLm5vZGVUeXBlPT09MSl7Yy5jbGVhbkRhdGEoZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtjLmNsZWFuRGF0YShbZl0pfWYucGFyZW50Tm9kZSYmZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfXJldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI7KGI9dGhpc1thXSkhPW51bGw7YSsrKWZvcihiLm5vZGVUeXBlPT09MSYmYy5jbGVhbkRhdGEoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTsKcmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubWFwKGZ1bmN0aW9uKCl7aWYoIWMuc3VwcG9ydC5ub0Nsb25lRXZlbnQmJiFjLmlzWE1MRG9jKHRoaXMpKXt2YXIgZD10aGlzLm91dGVySFRNTCxmPXRoaXMub3duZXJEb2N1bWVudDtpZighZCl7ZD1mLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuYXBwZW5kQ2hpbGQodGhpcy5jbG9uZU5vZGUodHJ1ZSkpO2Q9ZC5pbm5lckhUTUx9cmV0dXJuIGMuY2xlYW4oW2QucmVwbGFjZShKYSwiIikucmVwbGFjZSgvPShbXj0iJz5cc10rXC8pPi9nLCc9IiQxIj4nKS5yZXBsYWNlKFYsIiIpXSxmKVswXX1lbHNlIHJldHVybiB0aGlzLmNsb25lTm9kZSh0cnVlKX0pO2lmKGE9PT10cnVlKXtyYSh0aGlzLGIpO3JhKHRoaXMuZmluZCgiKiIpLGIuZmluZCgiKiIpKX1yZXR1cm4gYn0saHRtbDpmdW5jdGlvbihhKXtpZihhPT09dylyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5ub2RlVHlwZT09PTE/dGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShKYSwKIiIpOm51bGw7ZWxzZSBpZih0eXBlb2YgYT09PSJzdHJpbmciJiYhdGEudGVzdChhKSYmKGMuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVYudGVzdChhKSkmJiFGWyhMYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoS2EsTWEpO3RyeXtmb3IodmFyIGI9MCxkPXRoaXMubGVuZ3RoO2I8ZDtiKyspaWYodGhpc1tiXS5ub2RlVHlwZT09PTEpe2MuY2xlYW5EYXRhKHRoaXNbYl0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7dGhpc1tiXS5pbm5lckhUTUw9YX19Y2F0Y2goZil7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19ZWxzZSBjLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBqPWModGhpcyksaT1qLmh0bWwoKTtqLmVtcHR5KCkuYXBwZW5kKGZ1bmN0aW9uKCl7cmV0dXJuIGEuY2FsbCh0aGlzLGUsaSl9KX0pOnRoaXMuZW1wdHkoKS5hcHBlbmQoYSk7cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJgp0aGlzWzBdLnBhcmVudE5vZGUpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPWModGhpcyksZj1kLmh0bWwoKTtkLnJlcGxhY2VXaXRoKGEuY2FsbCh0aGlzLGIsZikpfSk7aWYodHlwZW9mIGEhPT0ic3RyaW5nIilhPWMoYSkuZGV0YWNoKCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsZD10aGlzLnBhcmVudE5vZGU7Yyh0aGlzKS5yZW1vdmUoKTtiP2MoYikuYmVmb3JlKGEpOmMoZCkuYXBwZW5kKGEpfSl9ZWxzZSByZXR1cm4gdGhpcy5wdXNoU3RhY2soYyhjLmlzRnVuY3Rpb24oYSk/YSgpOmEpLCJyZXBsYWNlV2l0aCIsYSl9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSx0cnVlKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYodSl7cmV0dXJuIGMubm9kZU5hbWUodSwidGFibGUiKT91LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHwKdS5hcHBlbmRDaGlsZCh1Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6dX12YXIgZSxqLGk9YVswXSxvPVtdLGs7aWYoIWMuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGk9PT0ic3RyaW5nIiYmdWEudGVzdChpKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS5kb21NYW5pcChhLGIsZCx0cnVlKX0pO2lmKGMuaXNGdW5jdGlvbihpKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHUpe3ZhciB6PWModGhpcyk7YVswXT1pLmNhbGwodGhpcyx1LGI/ei5odG1sKCk6dyk7ei5kb21NYW5pcChhLGIsZCl9KTtpZih0aGlzWzBdKXtlPWkmJmkucGFyZW50Tm9kZTtlPWMuc3VwcG9ydC5wYXJlbnROb2RlJiZlJiZlLm5vZGVUeXBlPT09MTEmJmUuY2hpbGROb2Rlcy5sZW5ndGg9PT10aGlzLmxlbmd0aD97ZnJhZ21lbnQ6ZX06c2EoYSx0aGlzLG8pO2s9ZS5mcmFnbWVudDtpZihqPWsuY2hpbGROb2Rlcy5sZW5ndGg9PT0KMT8oaz1rLmZpcnN0Q2hpbGQpOmsuZmlyc3RDaGlsZCl7Yj1iJiZjLm5vZGVOYW1lKGosInRyIik7Zm9yKHZhciBuPTAscj10aGlzLmxlbmd0aDtuPHI7bisrKWQuY2FsbChiP2YodGhpc1tuXSxqKTp0aGlzW25dLG4+MHx8ZS5jYWNoZWFibGV8fHRoaXMubGVuZ3RoPjE/ay5jbG9uZU5vZGUodHJ1ZSk6ayl9by5sZW5ndGgmJmMuZWFjaChvLFFhKX1yZXR1cm4gdGhpc319KTtjLmZyYWdtZW50cz17fTtjLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe2MuZm5bYV09ZnVuY3Rpb24oZCl7dmFyIGY9W107ZD1jKGQpO3ZhciBlPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKGUmJmUubm9kZVR5cGU9PT0xMSYmZS5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJmQubGVuZ3RoPT09MSl7ZFtiXSh0aGlzWzBdKTsKcmV0dXJuIHRoaXN9ZWxzZXtlPTA7Zm9yKHZhciBqPWQubGVuZ3RoO2U8ajtlKyspe3ZhciBpPShlPjA/dGhpcy5jbG9uZSh0cnVlKTp0aGlzKS5nZXQoKTtjLmZuW2JdLmFwcGx5KGMoZFtlXSksaSk7Zj1mLmNvbmNhdChpKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZixhLGQuc2VsZWN0b3IpfX19KTtjLmV4dGVuZCh7Y2xlYW46ZnVuY3Rpb24oYSxiLGQsZil7Yj1ifHxzO2lmKHR5cGVvZiBiLmNyZWF0ZUVsZW1lbnQ9PT0idW5kZWZpbmVkIiliPWIub3duZXJEb2N1bWVudHx8YlswXSYmYlswXS5vd25lckRvY3VtZW50fHxzO2Zvcih2YXIgZT1bXSxqPTAsaTsoaT1hW2pdKSE9bnVsbDtqKyspe2lmKHR5cGVvZiBpPT09Im51bWJlciIpaSs9IiI7aWYoaSl7aWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmIWpiLnRlc3QoaSkpaT1iLmNyZWF0ZVRleHROb2RlKGkpO2Vsc2UgaWYodHlwZW9mIGk9PT0ic3RyaW5nIil7aT1pLnJlcGxhY2UoS2EsTWEpO3ZhciBvPShMYS5leGVjKGkpfHxbIiIsCiIiXSlbMV0udG9Mb3dlckNhc2UoKSxrPUZbb118fEYuX2RlZmF1bHQsbj1rWzBdLHI9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3Ioci5pbm5lckhUTUw9a1sxXStpK2tbMl07bi0tOylyPXIubGFzdENoaWxkO2lmKCFjLnN1cHBvcnQudGJvZHkpe249aWIudGVzdChpKTtvPW89PT0idGFibGUiJiYhbj9yLmZpcnN0Q2hpbGQmJnIuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOmtbMV09PT0iPHRhYmxlPiImJiFuP3IuY2hpbGROb2RlczpbXTtmb3Ioaz1vLmxlbmd0aC0xO2s+PTA7LS1rKWMubm9kZU5hbWUob1trXSwidGJvZHkiKSYmIW9ba10uY2hpbGROb2Rlcy5sZW5ndGgmJm9ba10ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvW2tdKX0hYy5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZWLnRlc3QoaSkmJnIuaW5zZXJ0QmVmb3JlKGIuY3JlYXRlVGV4dE5vZGUoVi5leGVjKGkpWzBdKSxyLmZpcnN0Q2hpbGQpO2k9ci5jaGlsZE5vZGVzfWlmKGkubm9kZVR5cGUpZS5wdXNoKGkpO2Vsc2UgZT0KYy5tZXJnZShlLGkpfX1pZihkKWZvcihqPTA7ZVtqXTtqKyspaWYoZiYmYy5ub2RlTmFtZShlW2pdLCJzY3JpcHQiKSYmKCFlW2pdLnR5cGV8fGVbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWYucHVzaChlW2pdLnBhcmVudE5vZGU/ZVtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVbal0pOmVbal0pO2Vsc2V7ZVtqXS5ub2RlVHlwZT09PTEmJmUuc3BsaWNlLmFwcGx5KGUsW2orMSwwXS5jb25jYXQoYy5tYWtlQXJyYXkoZVtqXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpKSk7ZC5hcHBlbmRDaGlsZChlW2pdKX1yZXR1cm4gZX0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixkLGY9Yy5jYWNoZSxlPWMuZXZlbnQuc3BlY2lhbCxqPWMuc3VwcG9ydC5kZWxldGVFeHBhbmRvLGk9MCxvOyhvPWFbaV0pIT1udWxsO2krKylpZihkPW9bYy5leHBhbmRvXSl7Yj1mW2RdO2lmKGIuZXZlbnRzKWZvcih2YXIgayBpbiBiLmV2ZW50cyllW2tdPwpjLmV2ZW50LnJlbW92ZShvLGspOkNhKG8sayxiLmhhbmRsZSk7aWYoailkZWxldGUgb1tjLmV4cGFuZG9dO2Vsc2Ugby5yZW1vdmVBdHRyaWJ1dGUmJm8ucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyk7ZGVsZXRlIGZbZF19fX0pO3ZhciBrYj0vei0/aW5kZXh8Zm9udC0/d2VpZ2h0fG9wYWNpdHl8em9vbXxsaW5lLT9oZWlnaHQvaSxOYT0vYWxwaGFcKFteKV0qXCkvLE9hPS9vcGFjaXR5PShbXildKikvLGhhPS9mbG9hdC9pLGlhPS8tKFthLXpdKS9pZyxsYj0vKFtBLVpdKS9nLG1iPS9eLT9cZCsoPzpweCk/JC9pLG5iPS9eLT9cZC8sb2I9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LHBiPVsiTGVmdCIsIlJpZ2h0Il0scWI9WyJUb3AiLCJCb3R0b20iXSxyYj1zLmRlZmF1bHRWaWV3JiZzLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUsUGE9Yy5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQiLGphPQpmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O2MuZm4uY3NzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFgodGhpcyxhLGIsdHJ1ZSxmdW5jdGlvbihkLGYsZSl7aWYoZT09PXcpcmV0dXJuIGMuY3VyQ1NTKGQsZik7aWYodHlwZW9mIGU9PT0ibnVtYmVyIiYmIWtiLnRlc3QoZikpZSs9InB4IjtjLnN0eWxlKGQsZixlKX0pfTtjLmV4dGVuZCh7c3R5bGU6ZnVuY3Rpb24oYSxiLGQpe2lmKCFhfHxhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpcmV0dXJuIHc7aWYoKGI9PT0id2lkdGgifHxiPT09ImhlaWdodCIpJiZwYXJzZUZsb2F0KGQpPDApZD13O3ZhciBmPWEuc3R5bGV8fGEsZT1kIT09dztpZighYy5zdXBwb3J0Lm9wYWNpdHkmJmI9PT0ib3BhY2l0eSIpe2lmKGUpe2Yuem9vbT0xO2I9cGFyc2VJbnQoZCwxMCkrIiI9PT0iTmFOIj8iIjoiYWxwaGEob3BhY2l0eT0iK2QqMTAwKyIpIjthPWYuZmlsdGVyfHxjLmN1ckNTUyhhLCJmaWx0ZXIiKXx8IiI7Zi5maWx0ZXI9Ck5hLnRlc3QoYSk/YS5yZXBsYWNlKE5hLGIpOmJ9cmV0dXJuIGYuZmlsdGVyJiZmLmZpbHRlci5pbmRleE9mKCJvcGFjaXR5PSIpPj0wP3BhcnNlRmxvYXQoT2EuZXhlYyhmLmZpbHRlcilbMV0pLzEwMCsiIjoiIn1pZihoYS50ZXN0KGIpKWI9UGE7Yj1iLnJlcGxhY2UoaWEsamEpO2lmKGUpZltiXT1kO3JldHVybiBmW2JdfSxjc3M6ZnVuY3Rpb24oYSxiLGQsZil7aWYoYj09PSJ3aWR0aCJ8fGI9PT0iaGVpZ2h0Iil7dmFyIGUsaj1iPT09IndpZHRoIj9wYjpxYjtmdW5jdGlvbiBpKCl7ZT1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0O2YhPT0iYm9yZGVyIiYmYy5lYWNoKGosZnVuY3Rpb24oKXtmfHwoZS09cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJwYWRkaW5nIit0aGlzLHRydWUpKXx8MCk7aWYoZj09PSJtYXJnaW4iKWUrPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwibWFyZ2luIit0aGlzLHRydWUpKXx8MDtlbHNlIGUtPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwKImJvcmRlciIrdGhpcysiV2lkdGgiLHRydWUpKXx8MH0pfWEub2Zmc2V0V2lkdGghPT0wP2koKTpjLnN3YXAoYSxvYixpKTtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLnJvdW5kKGUpKX1yZXR1cm4gYy5jdXJDU1MoYSxiLGQpfSxjdXJDU1M6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmLGU9YS5zdHlsZTtpZighYy5zdXBwb3J0Lm9wYWNpdHkmJmI9PT0ib3BhY2l0eSImJmEuY3VycmVudFN0eWxlKXtmPU9hLnRlc3QoYS5jdXJyZW50U3R5bGUuZmlsdGVyfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjoiIjtyZXR1cm4gZj09PSIiPyIxIjpmfWlmKGhhLnRlc3QoYikpYj1QYTtpZighZCYmZSYmZVtiXSlmPWVbYl07ZWxzZSBpZihyYil7aWYoaGEudGVzdChiKSliPSJmbG9hdCI7Yj1iLnJlcGxhY2UobGIsIi0kMSIpLnRvTG93ZXJDYXNlKCk7ZT1hLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7aWYoIWUpcmV0dXJuIG51bGw7aWYoYT1lLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKSlmPQphLmdldFByb3BlcnR5VmFsdWUoYik7aWYoYj09PSJvcGFjaXR5IiYmZj09PSIiKWY9IjEifWVsc2UgaWYoYS5jdXJyZW50U3R5bGUpe2Q9Yi5yZXBsYWNlKGlhLGphKTtmPWEuY3VycmVudFN0eWxlW2JdfHxhLmN1cnJlbnRTdHlsZVtkXTtpZighbWIudGVzdChmKSYmbmIudGVzdChmKSl7Yj1lLmxlZnQ7dmFyIGo9YS5ydW50aW1lU3R5bGUubGVmdDthLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQ7ZS5sZWZ0PWQ9PT0iZm9udFNpemUiPyIxZW0iOmZ8fDA7Zj1lLnBpeGVsTGVmdCsicHgiO2UubGVmdD1iO2EucnVudGltZVN0eWxlLmxlZnQ9an19cmV0dXJuIGZ9LHN3YXA6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPXt9O2Zvcih2YXIgZSBpbiBiKXtmW2VdPWEuc3R5bGVbZV07YS5zdHlsZVtlXT1iW2VdfWQuY2FsbChhKTtmb3IoZSBpbiBiKWEuc3R5bGVbZV09ZltlXX19KTtpZihjLmV4cHImJmMuZXhwci5maWx0ZXJzKXtjLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9CmEub2Zmc2V0V2lkdGgsZD1hLm9mZnNldEhlaWdodCxmPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0ciI7cmV0dXJuIGI9PT0wJiZkPT09MCYmIWY/dHJ1ZTpiPjAmJmQ+MCYmIWY/ZmFsc2U6Yy5jdXJDU1MoYSwiZGlzcGxheSIpPT09Im5vbmUifTtjLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFjLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9fXZhciBzYj1KKCksdGI9LzxzY3JpcHQoLnxccykqP1wvc2NyaXB0Pi9naSx1Yj0vc2VsZWN0fHRleHRhcmVhL2ksdmI9L2NvbG9yfGRhdGV8ZGF0ZXRpbWV8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2Vlay9pLE49Lz1cPygmfCQpLyxrYT0vXD8vLHdiPS8oXD98JilfPS4qPygmfCQpLyx4Yj0vXihcdys6KT9cL1wvKFteXC8/I10rKS8seWI9LyUyMC9nLHpiPWMuZm4ubG9hZDtjLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGIsZCl7aWYodHlwZW9mIGEhPT0KInN0cmluZyIpcmV0dXJuIHpiLmNhbGwodGhpcyxhKTtlbHNlIGlmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZj1hLmluZGV4T2YoIiAiKTtpZihmPj0wKXt2YXIgZT1hLnNsaWNlKGYsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGYpfWY9IkdFVCI7aWYoYilpZihjLmlzRnVuY3Rpb24oYikpe2Q9YjtiPW51bGx9ZWxzZSBpZih0eXBlb2YgYj09PSJvYmplY3QiKXtiPWMucGFyYW0oYixjLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7Zj0iUE9TVCJ9dmFyIGo9dGhpcztjLmFqYXgoe3VybDphLHR5cGU6ZixkYXRhVHlwZToiaHRtbCIsZGF0YTpiLGNvbXBsZXRlOmZ1bmN0aW9uKGksbyl7aWYobz09PSJzdWNjZXNzInx8bz09PSJub3Rtb2RpZmllZCIpai5odG1sKGU/YygiPGRpdiAvPiIpLmFwcGVuZChpLnJlc3BvbnNlVGV4dC5yZXBsYWNlKHRiLCIiKSkuZmluZChlKTppLnJlc3BvbnNlVGV4dCk7ZCYmai5lYWNoKGQsW2kucmVzcG9uc2VUZXh0LG8saV0pfX0pO3JldHVybiB0aGlzfSwKc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9jLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fHViLnRlc3QodGhpcy5ub2RlTmFtZSl8fHZiLnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXthPWModGhpcykudmFsKCk7cmV0dXJuIGE9PW51bGw/bnVsbDpjLmlzQXJyYXkoYSk/Yy5tYXAoYSxmdW5jdGlvbihkKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6ZH19KTp7bmFtZTpiLm5hbWUsdmFsdWU6YX19KS5nZXQoKX19KTtjLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLApmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuYmluZChiLGQpfX0pO2MuZXh0ZW5kKHtnZXQ6ZnVuY3Rpb24oYSxiLGQsZil7aWYoYy5pc0Z1bmN0aW9uKGIpKXtmPWZ8fGQ7ZD1iO2I9bnVsbH1yZXR1cm4gYy5hamF4KHt0eXBlOiJHRVQiLHVybDphLGRhdGE6YixzdWNjZXNzOmQsZGF0YVR5cGU6Zn0pfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYy5nZXQoYSxudWxsLGIsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5nZXQoYSxiLGQsImpzb24iKX0scG9zdDpmdW5jdGlvbihhLGIsZCxmKXtpZihjLmlzRnVuY3Rpb24oYikpe2Y9Znx8ZDtkPWI7Yj17fX1yZXR1cm4gYy5hamF4KHt0eXBlOiJQT1NUIix1cmw6YSxkYXRhOmIsc3VjY2VzczpkLGRhdGFUeXBlOmZ9KX0sYWpheFNldHVwOmZ1bmN0aW9uKGEpe2MuZXh0ZW5kKGMuYWpheFNldHRpbmdzLGEpfSxhamF4U2V0dGluZ3M6e3VybDpsb2NhdGlvbi5ocmVmLApnbG9iYWw6dHJ1ZSx0eXBlOiJHRVQiLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLHByb2Nlc3NEYXRhOnRydWUsYXN5bmM6dHJ1ZSx4aHI6QS5YTUxIdHRwUmVxdWVzdCYmKEEubG9jYXRpb24ucHJvdG9jb2whPT0iZmlsZToifHwhQS5BY3RpdmVYT2JqZWN0KT9mdW5jdGlvbigpe3JldHVybiBuZXcgQS5YTUxIdHRwUmVxdWVzdH06ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBBLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYSl7fX0sYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHNjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLHRleHQ6InRleHQvcGxhaW4iLF9kZWZhdWx0OiIqLyoifX0sbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7ZS5zdWNjZXNzJiYKZS5zdWNjZXNzLmNhbGwoayxvLGkseCk7ZS5nbG9iYWwmJmYoImFqYXhTdWNjZXNzIixbeCxlXSl9ZnVuY3Rpb24gZCgpe2UuY29tcGxldGUmJmUuY29tcGxldGUuY2FsbChrLHgsaSk7ZS5nbG9iYWwmJmYoImFqYXhDb21wbGV0ZSIsW3gsZV0pO2UuZ2xvYmFsJiYhLS1jLmFjdGl2ZSYmYy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpfWZ1bmN0aW9uIGYocSxwKXsoZS5jb250ZXh0P2MoZS5jb250ZXh0KTpjLmV2ZW50KS50cmlnZ2VyKHEscCl9dmFyIGU9Yy5leHRlbmQodHJ1ZSx7fSxjLmFqYXhTZXR0aW5ncyxhKSxqLGksbyxrPWEmJmEuY29udGV4dHx8ZSxuPWUudHlwZS50b1VwcGVyQ2FzZSgpO2lmKGUuZGF0YSYmZS5wcm9jZXNzRGF0YSYmdHlwZW9mIGUuZGF0YSE9PSJzdHJpbmciKWUuZGF0YT1jLnBhcmFtKGUuZGF0YSxlLnRyYWRpdGlvbmFsKTtpZihlLmRhdGFUeXBlPT09Impzb25wIil7aWYobj09PSJHRVQiKU4udGVzdChlLnVybCl8fChlLnVybCs9KGthLnRlc3QoZS51cmwpPwoiJiI6Ij8iKSsoZS5qc29ucHx8ImNhbGxiYWNrIikrIj0/Iik7ZWxzZSBpZighZS5kYXRhfHwhTi50ZXN0KGUuZGF0YSkpZS5kYXRhPShlLmRhdGE/ZS5kYXRhKyImIjoiIikrKGUuanNvbnB8fCJjYWxsYmFjayIpKyI9PyI7ZS5kYXRhVHlwZT0ianNvbiJ9aWYoZS5kYXRhVHlwZT09PSJqc29uIiYmKGUuZGF0YSYmTi50ZXN0KGUuZGF0YSl8fE4udGVzdChlLnVybCkpKXtqPWUuanNvbnBDYWxsYmFja3x8Impzb25wIitzYisrO2lmKGUuZGF0YSllLmRhdGE9KGUuZGF0YSsiIikucmVwbGFjZShOLCI9IitqKyIkMSIpO2UudXJsPWUudXJsLnJlcGxhY2UoTiwiPSIraisiJDEiKTtlLmRhdGFUeXBlPSJzY3JpcHQiO0Fbal09QVtqXXx8ZnVuY3Rpb24ocSl7bz1xO2IoKTtkKCk7QVtqXT13O3RyeXtkZWxldGUgQVtqXX1jYXRjaChwKXt9eiYmei5yZW1vdmVDaGlsZChDKX19aWYoZS5kYXRhVHlwZT09PSJzY3JpcHQiJiZlLmNhY2hlPT09bnVsbCllLmNhY2hlPWZhbHNlO2lmKGUuY2FjaGU9PT0KZmFsc2UmJm49PT0iR0VUIil7dmFyIHI9SigpLHU9ZS51cmwucmVwbGFjZSh3YiwiJDFfPSIrcisiJDIiKTtlLnVybD11Kyh1PT09ZS51cmw/KGthLnRlc3QoZS51cmwpPyImIjoiPyIpKyJfPSIrcjoiIil9aWYoZS5kYXRhJiZuPT09IkdFVCIpZS51cmwrPShrYS50ZXN0KGUudXJsKT8iJiI6Ij8iKStlLmRhdGE7ZS5nbG9iYWwmJiFjLmFjdGl2ZSsrJiZjLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO3I9KHI9eGIuZXhlYyhlLnVybCkpJiYoclsxXSYmclsxXSE9PWxvY2F0aW9uLnByb3RvY29sfHxyWzJdIT09bG9jYXRpb24uaG9zdCk7aWYoZS5kYXRhVHlwZT09PSJzY3JpcHQiJiZuPT09IkdFVCImJnIpe3ZhciB6PXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8cy5kb2N1bWVudEVsZW1lbnQsQz1zLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO0Muc3JjPWUudXJsO2lmKGUuc2NyaXB0Q2hhcnNldClDLmNoYXJzZXQ9ZS5zY3JpcHRDaGFyc2V0O2lmKCFqKXt2YXIgQj0KZmFsc2U7Qy5vbmxvYWQ9Qy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZighQiYmKCF0aGlzLnJlYWR5U3RhdGV8fHRoaXMucmVhZHlTdGF0ZT09PSJsb2FkZWQifHx0aGlzLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKSl7Qj10cnVlO2IoKTtkKCk7Qy5vbmxvYWQ9Qy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDt6JiZDLnBhcmVudE5vZGUmJnoucmVtb3ZlQ2hpbGQoQyl9fX16Lmluc2VydEJlZm9yZShDLHouZmlyc3RDaGlsZCk7cmV0dXJuIHd9dmFyIEU9ZmFsc2UseD1lLnhocigpO2lmKHgpe2UudXNlcm5hbWU/eC5vcGVuKG4sZS51cmwsZS5hc3luYyxlLnVzZXJuYW1lLGUucGFzc3dvcmQpOngub3BlbihuLGUudXJsLGUuYXN5bmMpO3RyeXtpZihlLmRhdGF8fGEmJmEuY29udGVudFR5cGUpeC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGUuY29udGVudFR5cGUpO2lmKGUuaWZNb2RpZmllZCl7Yy5sYXN0TW9kaWZpZWRbZS51cmxdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIiwKYy5sYXN0TW9kaWZpZWRbZS51cmxdKTtjLmV0YWdbZS51cmxdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLGMuZXRhZ1tlLnVybF0pfXJ8fHguc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsIlhNTEh0dHBSZXF1ZXN0Iik7eC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGUuZGF0YVR5cGUmJmUuYWNjZXB0c1tlLmRhdGFUeXBlXT9lLmFjY2VwdHNbZS5kYXRhVHlwZV0rIiwgKi8qIjplLmFjY2VwdHMuX2RlZmF1bHQpfWNhdGNoKGdhKXt9aWYoZS5iZWZvcmVTZW5kJiZlLmJlZm9yZVNlbmQuY2FsbChrLHgsZSk9PT1mYWxzZSl7ZS5nbG9iYWwmJiEtLWMuYWN0aXZlJiZjLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIik7eC5hYm9ydCgpO3JldHVybiBmYWxzZX1lLmdsb2JhbCYmZigiYWpheFNlbmQiLFt4LGVdKTt2YXIgZz14Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihxKXtpZigheHx8eC5yZWFkeVN0YXRlPT09MHx8cT09PSJhYm9ydCIpe0V8fApkKCk7RT10cnVlO2lmKHgpeC5vbnJlYWR5c3RhdGVjaGFuZ2U9Yy5ub29wfWVsc2UgaWYoIUUmJngmJih4LnJlYWR5U3RhdGU9PT00fHxxPT09InRpbWVvdXQiKSl7RT10cnVlO3gub25yZWFkeXN0YXRlY2hhbmdlPWMubm9vcDtpPXE9PT0idGltZW91dCI/InRpbWVvdXQiOiFjLmh0dHBTdWNjZXNzKHgpPyJlcnJvciI6ZS5pZk1vZGlmaWVkJiZjLmh0dHBOb3RNb2RpZmllZCh4LGUudXJsKT8ibm90bW9kaWZpZWQiOiJzdWNjZXNzIjt2YXIgcDtpZihpPT09InN1Y2Nlc3MiKXRyeXtvPWMuaHR0cERhdGEoeCxlLmRhdGFUeXBlLGUpfWNhdGNoKHYpe2k9InBhcnNlcmVycm9yIjtwPXZ9aWYoaT09PSJzdWNjZXNzInx8aT09PSJub3Rtb2RpZmllZCIpanx8YigpO2Vsc2UgYy5oYW5kbGVFcnJvcihlLHgsaSxwKTtkKCk7cT09PSJ0aW1lb3V0IiYmeC5hYm9ydCgpO2lmKGUuYXN5bmMpeD1udWxsfX07dHJ5e3ZhciBoPXguYWJvcnQ7eC5hYm9ydD1mdW5jdGlvbigpe3gmJmguY2FsbCh4KTsKZygiYWJvcnQiKX19Y2F0Y2gobCl7fWUuYXN5bmMmJmUudGltZW91dD4wJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eCYmIUUmJmcoInRpbWVvdXQiKX0sZS50aW1lb3V0KTt0cnl7eC5zZW5kKG49PT0iUE9TVCJ8fG49PT0iUFVUInx8bj09PSJERUxFVEUiP2UuZGF0YTpudWxsKX1jYXRjaChtKXtjLmhhbmRsZUVycm9yKGUseCxudWxsLG0pO2QoKX1lLmFzeW5jfHxnKCk7cmV0dXJuIHh9fSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhLGIsZCxmKXtpZihhLmVycm9yKWEuZXJyb3IuY2FsbChhLmNvbnRleHR8fGEsYixkLGYpO2lmKGEuZ2xvYmFsKShhLmNvbnRleHQ/YyhhLmNvbnRleHQpOmMuZXZlbnQpLnRyaWdnZXIoImFqYXhFcnJvciIsW2IsYSxmXSl9LGFjdGl2ZTowLGh0dHBTdWNjZXNzOmZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4hYS5zdGF0dXMmJmxvY2F0aW9uLnByb3RvY29sPT09ImZpbGU6Inx8YS5zdGF0dXM+PTIwMCYmYS5zdGF0dXM8MzAwfHxhLnN0YXR1cz09PTMwNHx8YS5zdGF0dXM9PT0KMTIyM3x8YS5zdGF0dXM9PT0wfWNhdGNoKGIpe31yZXR1cm4gZmFsc2V9LGh0dHBOb3RNb2RpZmllZDpmdW5jdGlvbihhLGIpe3ZhciBkPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIkV0YWciKTtpZihkKWMubGFzdE1vZGlmaWVkW2JdPWQ7aWYoZiljLmV0YWdbYl09ZjtyZXR1cm4gYS5zdGF0dXM9PT0zMDR8fGEuc3RhdHVzPT09MH0saHR0cERhdGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpfHwiIixlPWI9PT0ieG1sInx8IWImJmYuaW5kZXhPZigieG1sIik+PTA7YT1lP2EucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQ7ZSYmYS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWU9PT0icGFyc2VyZXJyb3IiJiZjLmVycm9yKCJwYXJzZXJlcnJvciIpO2lmKGQmJmQuZGF0YUZpbHRlcilhPWQuZGF0YUZpbHRlcihhLGIpO2lmKHR5cGVvZiBhPT09InN0cmluZyIpaWYoYj09PQoianNvbiJ8fCFiJiZmLmluZGV4T2YoImpzb24iKT49MClhPWMucGFyc2VKU09OKGEpO2Vsc2UgaWYoYj09PSJzY3JpcHQifHwhYiYmZi5pbmRleE9mKCJqYXZhc2NyaXB0Iik+PTApYy5nbG9iYWxFdmFsKGEpO3JldHVybiBhfSxwYXJhbTpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoaSxvKXtpZihjLmlzQXJyYXkobykpYy5lYWNoKG8sZnVuY3Rpb24oayxuKXtifHwvXFtcXSQvLnRlc3QoaSk/ZihpLG4pOmQoaSsiWyIrKHR5cGVvZiBuPT09Im9iamVjdCJ8fGMuaXNBcnJheShuKT9rOiIiKSsiXSIsbil9KTtlbHNlIWImJm8hPW51bGwmJnR5cGVvZiBvPT09Im9iamVjdCI/Yy5lYWNoKG8sZnVuY3Rpb24oayxuKXtkKGkrIlsiK2srIl0iLG4pfSk6ZihpLG8pfWZ1bmN0aW9uIGYoaSxvKXtvPWMuaXNGdW5jdGlvbihvKT9vKCk6bztlW2UubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoaSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChvKX12YXIgZT1bXTtpZihiPT09dyliPWMuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsOwppZihjLmlzQXJyYXkoYSl8fGEuanF1ZXJ5KWMuZWFjaChhLGZ1bmN0aW9uKCl7Zih0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcih2YXIgaiBpbiBhKWQoaixhW2pdKTtyZXR1cm4gZS5qb2luKCImIikucmVwbGFjZSh5YiwiKyIpfX0pO3ZhciBsYT17fSxBYj0vdG9nZ2xlfHNob3d8aGlkZS8sQmI9L14oWystXT0pPyhbXGQrLS5dKykoLiopJC8sVyx2YT1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXTtjLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoSygic2hvdyIsMyksYSxiKTtlbHNle2E9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXt2YXIgZD1jLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIpOwp0aGlzW2FdLnN0eWxlLmRpc3BsYXk9ZHx8IiI7aWYoYy5jc3ModGhpc1thXSwiZGlzcGxheSIpPT09Im5vbmUiKXtkPXRoaXNbYV0ubm9kZU5hbWU7dmFyIGY7aWYobGFbZF0pZj1sYVtkXTtlbHNle3ZhciBlPWMoIjwiK2QrIiAvPiIpLmFwcGVuZFRvKCJib2R5Iik7Zj1lLmNzcygiZGlzcGxheSIpO2lmKGY9PT0ibm9uZSIpZj0iYmxvY2siO2UucmVtb3ZlKCk7bGFbZF09Zn1jLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIsZil9fWE9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXRoaXNbYV0uc3R5bGUuZGlzcGxheT1jLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIpfHwiIjtyZXR1cm4gdGhpc319LGhpZGU6ZnVuY3Rpb24oYSxiKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKEsoImhpZGUiLDMpLGEsYik7ZWxzZXthPTA7Zm9yKGI9dGhpcy5sZW5ndGg7YTxiO2ErKyl7dmFyIGQ9Yy5kYXRhKHRoaXNbYV0sIm9sZGRpc3BsYXkiKTshZCYmZCE9PSJub25lIiYmYy5kYXRhKHRoaXNbYV0sCiJvbGRkaXNwbGF5IixjLmNzcyh0aGlzW2FdLCJkaXNwbGF5IikpfWE9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXRoaXNbYV0uc3R5bGUuZGlzcGxheT0ibm9uZSI7cmV0dXJuIHRoaXN9fSxfdG9nZ2xlOmMuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIpe3ZhciBkPXR5cGVvZiBhPT09ImJvb2xlYW4iO2lmKGMuaXNGdW5jdGlvbihhKSYmYy5pc0Z1bmN0aW9uKGIpKXRoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZWxzZSBhPT1udWxsfHxkP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBmPWQ/YTpjKHRoaXMpLmlzKCI6aGlkZGVuIik7Yyh0aGlzKVtmPyJzaG93IjoiaGlkZSJdKCl9KTp0aGlzLmFuaW1hdGUoSygidG9nZ2xlIiwzKSxhLGIpO3JldHVybiB0aGlzfSxmYWRlVG86ZnVuY3Rpb24oYSxiLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxkKX0sCmFuaW1hdGU6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGU9Yy5zcGVlZChiLGQsZik7aWYoYy5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSk7cmV0dXJuIHRoaXNbZS5xdWV1ZT09PWZhbHNlPyJlYWNoIjoicXVldWUiXShmdW5jdGlvbigpe3ZhciBqPWMuZXh0ZW5kKHt9LGUpLGksbz10aGlzLm5vZGVUeXBlPT09MSYmYyh0aGlzKS5pcygiOmhpZGRlbiIpLGs9dGhpcztmb3IoaSBpbiBhKXt2YXIgbj1pLnJlcGxhY2UoaWEsamEpO2lmKGkhPT1uKXthW25dPWFbaV07ZGVsZXRlIGFbaV07aT1ufWlmKGFbaV09PT0iaGlkZSImJm98fGFbaV09PT0ic2hvdyImJiFvKXJldHVybiBqLmNvbXBsZXRlLmNhbGwodGhpcyk7aWYoKGk9PT0iaGVpZ2h0Inx8aT09PSJ3aWR0aCIpJiZ0aGlzLnN0eWxlKXtqLmRpc3BsYXk9Yy5jc3ModGhpcywiZGlzcGxheSIpO2oub3ZlcmZsb3c9dGhpcy5zdHlsZS5vdmVyZmxvd31pZihjLmlzQXJyYXkoYVtpXSkpeyhqLnNwZWNpYWxFYXNpbmc9Cmouc3BlY2lhbEVhc2luZ3x8e30pW2ldPWFbaV1bMV07YVtpXT1hW2ldWzBdfX1pZihqLm92ZXJmbG93IT1udWxsKXRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiI7ai5jdXJBbmltPWMuZXh0ZW5kKHt9LGEpO2MuZWFjaChhLGZ1bmN0aW9uKHIsdSl7dmFyIHo9bmV3IGMuZngoayxqLHIpO2lmKEFiLnRlc3QodSkpelt1PT09InRvZ2dsZSI/bz8ic2hvdyI6ImhpZGUiOnVdKGEpO2Vsc2V7dmFyIEM9QmIuZXhlYyh1KSxCPXouY3VyKHRydWUpfHwwO2lmKEMpe3U9cGFyc2VGbG9hdChDWzJdKTt2YXIgRT1DWzNdfHwicHgiO2lmKEUhPT0icHgiKXtrLnN0eWxlW3JdPSh1fHwxKStFO0I9KHV8fDEpL3ouY3VyKHRydWUpKkI7ay5zdHlsZVtyXT1CK0V9aWYoQ1sxXSl1PShDWzFdPT09Ii09Ij8tMToxKSp1K0I7ei5jdXN0b20oQix1LEUpfWVsc2Ugei5jdXN0b20oQix1LCIiKX19KTtyZXR1cm4gdHJ1ZX0pfSxzdG9wOmZ1bmN0aW9uKGEsYil7dmFyIGQ9Yy50aW1lcnM7YSYmdGhpcy5xdWV1ZShbXSk7CnRoaXMuZWFjaChmdW5jdGlvbigpe2Zvcih2YXIgZj1kLmxlbmd0aC0xO2Y+PTA7Zi0tKWlmKGRbZl0uZWxlbT09PXRoaXMpe2ImJmRbZl0odHJ1ZSk7ZC5zcGxpY2UoZiwxKX19KTtifHx0aGlzLmRlcXVldWUoKTtyZXR1cm4gdGhpc319KTtjLmVhY2goe3NsaWRlRG93bjpLKCJzaG93IiwxKSxzbGlkZVVwOksoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOksoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9fSxmdW5jdGlvbihhLGIpe2MuZm5bYV09ZnVuY3Rpb24oZCxmKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsZCxmKX19KTtjLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPWEmJnR5cGVvZiBhPT09Im9iamVjdCI/YTp7Y29tcGxldGU6ZHx8IWQmJmJ8fGMuaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpkJiZifHxiJiYhYy5pc0Z1bmN0aW9uKGIpJiZifTtmLmR1cmF0aW9uPWMuZngub2ZmPzA6dHlwZW9mIGYuZHVyYXRpb249PT0KIm51bWJlciI/Zi5kdXJhdGlvbjpjLmZ4LnNwZWVkc1tmLmR1cmF0aW9uXXx8Yy5meC5zcGVlZHMuX2RlZmF1bHQ7Zi5vbGQ9Zi5jb21wbGV0ZTtmLmNvbXBsZXRlPWZ1bmN0aW9uKCl7Zi5xdWV1ZSE9PWZhbHNlJiZjKHRoaXMpLmRlcXVldWUoKTtjLmlzRnVuY3Rpb24oZi5vbGQpJiZmLm9sZC5jYWxsKHRoaXMpfTtyZXR1cm4gZn0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGQsZil7cmV0dXJuIGQrZiphfSxzd2luZzpmdW5jdGlvbihhLGIsZCxmKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMiswLjUpKmYrZH19LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsZCl7dGhpcy5vcHRpb25zPWI7dGhpcy5lbGVtPWE7dGhpcy5wcm9wPWQ7aWYoIWIub3JpZyliLm9yaWc9e319fSk7Yy5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKTsoYy5meC5zdGVwW3RoaXMucHJvcF18fApjLmZ4LnN0ZXAuX2RlZmF1bHQpKHRoaXMpO2lmKCh0aGlzLnByb3A9PT0iaGVpZ2h0Inx8dGhpcy5wcm9wPT09IndpZHRoIikmJnRoaXMuZWxlbS5zdHlsZSl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheT0iYmxvY2sifSxjdXI6ZnVuY3Rpb24oYSl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3JldHVybihhPXBhcnNlRmxvYXQoYy5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCxhKSkpJiZhPi0xMDAwMD9hOnBhcnNlRmxvYXQoYy5jdXJDU1ModGhpcy5lbGVtLHRoaXMucHJvcCkpfHwwfSxjdXN0b206ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoail7cmV0dXJuIGUuc3RlcChqKX10aGlzLnN0YXJ0VGltZT1KKCk7dGhpcy5zdGFydD1hO3RoaXMuZW5kPWI7dGhpcy51bml0PWR8fHRoaXMudW5pdHx8InB4Ijt0aGlzLm5vdz10aGlzLnN0YXJ0Owp0aGlzLnBvcz10aGlzLnN0YXRlPTA7dmFyIGU9dGhpcztmLmVsZW09dGhpcy5lbGVtO2lmKGYoKSYmYy50aW1lcnMucHVzaChmKSYmIVcpVz1zZXRJbnRlcnZhbChjLmZ4LnRpY2ssMTMpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1jLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5zaG93PXRydWU7dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpO2ModGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWMuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCk7dGhpcy5vcHRpb25zLmhpZGU9dHJ1ZTt0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiPUooKSxkPXRydWU7aWYoYXx8Yj49dGhpcy5vcHRpb25zLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz0KdGhpcy5lbmQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0xO3RoaXMudXBkYXRlKCk7dGhpcy5vcHRpb25zLmN1ckFuaW1bdGhpcy5wcm9wXT10cnVlO2Zvcih2YXIgZiBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSlpZih0aGlzLm9wdGlvbnMuY3VyQW5pbVtmXSE9PXRydWUpZD1mYWxzZTtpZihkKXtpZih0aGlzLm9wdGlvbnMuZGlzcGxheSE9bnVsbCl7dGhpcy5lbGVtLnN0eWxlLm92ZXJmbG93PXRoaXMub3B0aW9ucy5vdmVyZmxvdzthPWMuZGF0YSh0aGlzLmVsZW0sIm9sZGRpc3BsYXkiKTt0aGlzLmVsZW0uc3R5bGUuZGlzcGxheT1hP2E6dGhpcy5vcHRpb25zLmRpc3BsYXk7aWYoYy5jc3ModGhpcy5lbGVtLCJkaXNwbGF5Iik9PT0ibm9uZSIpdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn10aGlzLm9wdGlvbnMuaGlkZSYmYyh0aGlzLmVsZW0pLmhpZGUoKTtpZih0aGlzLm9wdGlvbnMuaGlkZXx8dGhpcy5vcHRpb25zLnNob3cpZm9yKHZhciBlIGluIHRoaXMub3B0aW9ucy5jdXJBbmltKWMuc3R5bGUodGhpcy5lbGVtLAplLHRoaXMub3B0aW9ucy5vcmlnW2VdKTt0aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCh0aGlzLmVsZW0pfXJldHVybiBmYWxzZX1lbHNle2U9Yi10aGlzLnN0YXJ0VGltZTt0aGlzLnN0YXRlPWUvdGhpcy5vcHRpb25zLmR1cmF0aW9uO2E9dGhpcy5vcHRpb25zLmVhc2luZ3x8KGMuZWFzaW5nLnN3aW5nPyJzd2luZyI6ImxpbmVhciIpO3RoaXMucG9zPWMuZWFzaW5nW3RoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nJiZ0aGlzLm9wdGlvbnMuc3BlY2lhbEVhc2luZ1t0aGlzLnByb3BdfHxhXSh0aGlzLnN0YXRlLGUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik7dGhpcy5ub3c9dGhpcy5zdGFydCsodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3M7dGhpcy51cGRhdGUoKX1yZXR1cm4gdHJ1ZX19O2MuZXh0ZW5kKGMuZngse3RpY2s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9Yy50aW1lcnMsYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0oKXx8YS5zcGxpY2UoYi0tLDEpO2EubGVuZ3RofHwKYy5meC5zdG9wKCl9LHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKFcpO1c9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Yy5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7aWYoYS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbClhLmVsZW0uc3R5bGVbYS5wcm9wXT0oYS5wcm9wPT09IndpZHRoInx8YS5wcm9wPT09ImhlaWdodCI/TWF0aC5tYXgoMCxhLm5vdyk6YS5ub3cpK2EudW5pdDtlbHNlIGEuZWxlbVthLnByb3BdPWEubm93fX19KTtpZihjLmV4cHImJmMuZXhwci5maWx0ZXJzKWMuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBjLmdyZXAoYy50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9O2MuZm4ub2Zmc2V0PSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gcy5kb2N1bWVudEVsZW1lbnQ/CmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsZSl9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGMub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGQ9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPWIub3duZXJEb2N1bWVudDtiPWYuYm9keTtmPWYuZG9jdW1lbnRFbGVtZW50O3JldHVybnt0b3A6ZC50b3ArKHNlbGYucGFnZVlPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmZi5zY3JvbGxUb3B8fGIuc2Nyb2xsVG9wKS0oZi5jbGllbnRUb3B8fGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoc2VsZi5wYWdlWE9mZnNldHx8Yy5zdXBwb3J0LmJveE1vZGVsJiZmLnNjcm9sbExlZnR8fGIuc2Nyb2xsTGVmdCktKGYuY2xpZW50TGVmdHx8Yi5jbGllbnRMZWZ0fHwwKX19OmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzWzBdO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihyKXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLHIpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO2Mub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgZD1iLm9mZnNldFBhcmVudCxmPWIsZT1iLm93bmVyRG9jdW1lbnQsaixpPWUuZG9jdW1lbnRFbGVtZW50LG89ZS5ib2R5O2Y9KGU9ZS5kZWZhdWx0Vmlldyk/ZS5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6Yi5jdXJyZW50U3R5bGU7Zm9yKHZhciBrPWIub2Zmc2V0VG9wLG49Yi5vZmZzZXRMZWZ0OyhiPWIucGFyZW50Tm9kZSkmJmIhPT1vJiZiIT09aTspe2lmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmZi5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7aj1lP2UuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlOwprLT1iLnNjcm9sbFRvcDtuLT1iLnNjcm9sbExlZnQ7aWYoYj09PWQpe2srPWIub2Zmc2V0VG9wO24rPWIub2Zmc2V0TGVmdDtpZihjLm9mZnNldC5kb2VzTm90QWRkQm9yZGVyJiYhKGMub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzJiYvXnQoYWJsZXxkfGgpJC9pLnRlc3QoYi5ub2RlTmFtZSkpKXtrKz1wYXJzZUZsb2F0KGouYm9yZGVyVG9wV2lkdGgpfHwwO24rPXBhcnNlRmxvYXQoai5ib3JkZXJMZWZ0V2lkdGgpfHwwfWY9ZDtkPWIub2Zmc2V0UGFyZW50fWlmKGMub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSYmai5vdmVyZmxvdyE9PSJ2aXNpYmxlIil7ays9cGFyc2VGbG9hdChqLmJvcmRlclRvcFdpZHRoKXx8MDtuKz1wYXJzZUZsb2F0KGouYm9yZGVyTGVmdFdpZHRoKXx8MH1mPWp9aWYoZi5wb3NpdGlvbj09PSJyZWxhdGl2ZSJ8fGYucG9zaXRpb249PT0ic3RhdGljIil7ays9by5vZmZzZXRUb3A7bis9by5vZmZzZXRMZWZ0fWlmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmCmYucG9zaXRpb249PT0iZml4ZWQiKXtrKz1NYXRoLm1heChpLnNjcm9sbFRvcCxvLnNjcm9sbFRvcCk7bis9TWF0aC5tYXgoaS5zY3JvbGxMZWZ0LG8uc2Nyb2xsTGVmdCl9cmV0dXJue3RvcDprLGxlZnQ6bn19O2Mub2Zmc2V0PXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9cy5ib2R5LGI9cy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLGYsZSxqPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwibWFyZ2luVG9wIix0cnVlKSl8fDA7Yy5leHRlbmQoYi5zdHlsZSx7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAsYm9yZGVyOjAsd2lkdGg6IjFweCIsaGVpZ2h0OiIxcHgiLHZpc2liaWxpdHk6ImhpZGRlbiJ9KTtiLmlubmVySFRNTD0iPGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7Jz48ZGl2PjwvZGl2PjwvZGl2Pjx0YWJsZSBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnPjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+IjsKYS5pbnNlcnRCZWZvcmUoYixhLmZpcnN0Q2hpbGQpO2Q9Yi5maXJzdENoaWxkO2Y9ZC5maXJzdENoaWxkO2U9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7dGhpcy5kb2VzTm90QWRkQm9yZGVyPWYub2Zmc2V0VG9wIT09NTt0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzPWUub2Zmc2V0VG9wPT09NTtmLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Zi5zdHlsZS50b3A9IjIwcHgiO3RoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uPWYub2Zmc2V0VG9wPT09MjB8fGYub2Zmc2V0VG9wPT09MTU7Zi5zdHlsZS5wb3NpdGlvbj1mLnN0eWxlLnRvcD0iIjtkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iO2Quc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjt0aGlzLnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZT1mLm9mZnNldFRvcD09PS01O3RoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9YS5vZmZzZXRUb3AhPT1qO2EucmVtb3ZlQ2hpbGQoYik7CmMub2Zmc2V0LmluaXRpYWxpemU9Yy5ub29wfSxib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGQ9YS5vZmZzZXRMZWZ0O2Mub2Zmc2V0LmluaXRpYWxpemUoKTtpZihjLm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCl7Yis9cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJtYXJnaW5Ub3AiLHRydWUpKXx8MDtkKz1wYXJzZUZsb2F0KGMuY3VyQ1NTKGEsIm1hcmdpbkxlZnQiLHRydWUpKXx8MH1yZXR1cm57dG9wOmIsbGVmdDpkfX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixkKXtpZigvc3RhdGljLy50ZXN0KGMuY3VyQ1NTKGEsInBvc2l0aW9uIikpKWEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjt2YXIgZj1jKGEpLGU9Zi5vZmZzZXQoKSxqPXBhcnNlSW50KGMuY3VyQ1NTKGEsInRvcCIsdHJ1ZSksMTApfHwwLGk9cGFyc2VJbnQoYy5jdXJDU1MoYSwibGVmdCIsdHJ1ZSksMTApfHwwO2lmKGMuaXNGdW5jdGlvbihiKSliPWIuY2FsbChhLApkLGUpO2Q9e3RvcDpiLnRvcC1lLnRvcCtqLGxlZnQ6Yi5sZWZ0LWUubGVmdCtpfTsidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxkKTpmLmNzcyhkKX19O2MuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGQ9dGhpcy5vZmZzZXQoKSxmPS9eYm9keXxodG1sJC9pLnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtkLnRvcC09cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJtYXJnaW5Ub3AiLHRydWUpKXx8MDtkLmxlZnQtPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwibWFyZ2luTGVmdCIsdHJ1ZSkpfHwwO2YudG9wKz1wYXJzZUZsb2F0KGMuY3VyQ1NTKGJbMF0sImJvcmRlclRvcFdpZHRoIix0cnVlKSl8fDA7Zi5sZWZ0Kz1wYXJzZUZsb2F0KGMuY3VyQ1NTKGJbMF0sImJvcmRlckxlZnRXaWR0aCIsdHJ1ZSkpfHwwO3JldHVybnt0b3A6ZC50b3AtCmYudG9wLGxlZnQ6ZC5sZWZ0LWYubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8cy5ib2R5O2EmJiEvXmJvZHl8aHRtbCQvaS50ZXN0KGEubm9kZU5hbWUpJiZjLmNzcyhhLCJwb3NpdGlvbiIpPT09InN0YXRpYyI7KWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KTtjLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxiKXt2YXIgZD0ic2Nyb2xsIitiO2MuZm5bZF09ZnVuY3Rpb24oZil7dmFyIGU9dGhpc1swXSxqO2lmKCFlKXJldHVybiBudWxsO2lmKGYhPT13KXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihqPXdhKHRoaXMpKWouc2Nyb2xsVG8oIWE/ZjpjKGopLnNjcm9sbExlZnQoKSxhP2Y6YyhqKS5zY3JvbGxUb3AoKSk7ZWxzZSB0aGlzW2RdPWZ9KTtlbHNlIHJldHVybihqPXdhKGUpKT8icGFnZVhPZmZzZXQiaW4gaj9qW2E/InBhZ2VZT2Zmc2V0IjoKInBhZ2VYT2Zmc2V0Il06Yy5zdXBwb3J0LmJveE1vZGVsJiZqLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8ai5kb2N1bWVudC5ib2R5W2RdOmVbZF19fSk7Yy5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGIpe3ZhciBkPWIudG9Mb3dlckNhc2UoKTtjLmZuWyJpbm5lciIrYl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1swXT9jLmNzcyh0aGlzWzBdLGQsZmFsc2UsInBhZGRpbmciKTpudWxsfTtjLmZuWyJvdXRlciIrYl09ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXNbMF0/Yy5jc3ModGhpc1swXSxkLGZhbHNlLGY/Im1hcmdpbiI6ImJvcmRlciIpOm51bGx9O2MuZm5bZF09ZnVuY3Rpb24oZil7dmFyIGU9dGhpc1swXTtpZighZSlyZXR1cm4gZj09bnVsbD9udWxsOnRoaXM7aWYoYy5pc0Z1bmN0aW9uKGYpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oail7dmFyIGk9Yyh0aGlzKTtpW2RdKGYuY2FsbCh0aGlzLGosaVtkXSgpKSl9KTtyZXR1cm4ic2Nyb2xsVG8iaW4KZSYmZS5kb2N1bWVudD9lLmRvY3VtZW50LmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCImJmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2JdfHxlLmRvY3VtZW50LmJvZHlbImNsaWVudCIrYl06ZS5ub2RlVHlwZT09PTk/TWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYl0sZS5ib2R5WyJzY3JvbGwiK2JdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2JdLGUuYm9keVsib2Zmc2V0IitiXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitiXSk6Zj09PXc/Yy5jc3MoZSxkKTp0aGlzLmNzcyhkLHR5cGVvZiBmPT09InN0cmluZyI/ZjpmKyJweCIpfX0pO0EualF1ZXJ5PUEuJD1jfSkod2luZG93KTsK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/jquery-ui-1.8.5.custom.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBVSSAxLjguNQogKgogKiBDb3B5cmlnaHQgMjAxMCwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkKICovCihmdW5jdGlvbihjLGope2Z1bmN0aW9uIGsoYSl7cmV0dXJuIWMoYSkucGFyZW50cygpLmFuZFNlbGYoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gYy5jdXJDU1ModGhpcywidmlzaWJpbGl0eSIpPT09ImhpZGRlbiJ8fGMuZXhwci5maWx0ZXJzLmhpZGRlbih0aGlzKX0pLmxlbmd0aH1jLnVpPWMudWl8fHt9O2lmKCFjLnVpLnZlcnNpb24pe2MuZXh0ZW5kKGMudWkse3ZlcnNpb246IjEuOC41IixrZXlDb2RlOntBTFQ6MTgsQkFDS1NQQUNFOjgsQ0FQU19MT0NLOjIwLENPTU1BOjE4OCxDT01NQU5EOjkxLENPTU1BTkRfTEVGVDo5MSxDT01NQU5EX1JJR0hUOjkzLENPTlRST0w6MTcsREVMRVRFOjQ2LERPV046NDAsRU5EOjM1LEVOVEVSOjEzLEVTQ0FQRToyNyxIT01FOjM2LElOU0VSVDo0NSxMRUZUOjM3LE1FTlU6OTMsTlVNUEFEX0FERDoxMDcsTlVNUEFEX0RFQ0lNQUw6MTEwLE5VTVBBRF9ESVZJREU6MTExLE5VTVBBRF9FTlRFUjoxMDgsTlVNUEFEX01VTFRJUExZOjEwNiwKTlVNUEFEX1NVQlRSQUNUOjEwOSxQQUdFX0RPV046MzQsUEFHRV9VUDozMyxQRVJJT0Q6MTkwLFJJR0hUOjM5LFNISUZUOjE2LFNQQUNFOjMyLFRBQjo5LFVQOjM4LFdJTkRPV1M6OTF9fSk7Yy5mbi5leHRlbmQoe19mb2N1czpjLmZuLmZvY3VzLGZvY3VzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyhkKS5mb2N1cygpO2ImJmIuY2FsbChkKX0sYSl9KTp0aGlzLl9mb2N1cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHNjcm9sbFBhcmVudDpmdW5jdGlvbigpe3ZhciBhO2E9Yy5icm93c2VyLm1zaWUmJi8oc3RhdGljfHJlbGF0aXZlKS8udGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSl8fC9hYnNvbHV0ZS8udGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSk/dGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuLyhyZWxhdGl2ZXxhYnNvbHV0ZXxmaXhlZCkvLnRlc3QoYy5jdXJDU1ModGhpcywKInBvc2l0aW9uIiwxKSkmJi8oYXV0b3xzY3JvbGwpLy50ZXN0KGMuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKTp0aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKGF1dG98c2Nyb2xsKS8udGVzdChjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdyIsMSkrYy5jdXJDU1ModGhpcywib3ZlcmZsb3cteSIsMSkrYy5jdXJDU1ModGhpcywib3ZlcmZsb3cteCIsMSkpfSkuZXEoMCk7cmV0dXJuL2ZpeGVkLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8IWEubGVuZ3RoP2MoZG9jdW1lbnQpOmF9LHpJbmRleDpmdW5jdGlvbihhKXtpZihhIT09ailyZXR1cm4gdGhpcy5jc3MoInpJbmRleCIsYSk7aWYodGhpcy5sZW5ndGgpe2E9Yyh0aGlzWzBdKTtmb3IodmFyIGI7YS5sZW5ndGgmJmFbMF0hPT1kb2N1bWVudDspe2I9YS5jc3MoInBvc2l0aW9uIik7CmlmKGI9PT0iYWJzb2x1dGUifHxiPT09InJlbGF0aXZlInx8Yj09PSJmaXhlZCIpe2I9cGFyc2VJbnQoYS5jc3MoInpJbmRleCIpKTtpZighaXNOYU4oYikmJmIhPTApcmV0dXJuIGJ9YT1hLnBhcmVudCgpfX1yZXR1cm4gMH0sZGlzYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJpbmQoIm1vdXNlZG93bi51aS1kaXNhYmxlU2VsZWN0aW9uIHNlbGVjdHN0YXJ0LnVpLWRpc2FibGVTZWxlY3Rpb24iLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKX0pfSxlbmFibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmJpbmQoIi51aS1kaXNhYmxlU2VsZWN0aW9uIil9fSk7Yy5lYWNoKFsiV2lkdGgiLCJIZWlnaHQiXSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoZixnLGwsbSl7Yy5lYWNoKGUsZnVuY3Rpb24oKXtnLT1wYXJzZUZsb2F0KGMuY3VyQ1NTKGYsInBhZGRpbmciK3RoaXMsdHJ1ZSkpfHwwO2lmKGwpZy09cGFyc2VGbG9hdChjLmN1ckNTUyhmLAoiYm9yZGVyIit0aGlzKyJXaWR0aCIsdHJ1ZSkpfHwwO2lmKG0pZy09cGFyc2VGbG9hdChjLmN1ckNTUyhmLCJtYXJnaW4iK3RoaXMsdHJ1ZSkpfHwwfSk7cmV0dXJuIGd9dmFyIGU9Yj09PSJXaWR0aCI/WyJMZWZ0IiwiUmlnaHQiXTpbIlRvcCIsIkJvdHRvbSJdLGg9Yi50b0xvd2VyQ2FzZSgpLGk9e2lubmVyV2lkdGg6Yy5mbi5pbm5lcldpZHRoLGlubmVySGVpZ2h0OmMuZm4uaW5uZXJIZWlnaHQsb3V0ZXJXaWR0aDpjLmZuLm91dGVyV2lkdGgsb3V0ZXJIZWlnaHQ6Yy5mbi5vdXRlckhlaWdodH07Yy5mblsiaW5uZXIiK2JdPWZ1bmN0aW9uKGYpe2lmKGY9PT1qKXJldHVybiBpWyJpbm5lciIrYl0uY2FsbCh0aGlzKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5zdHlsZSh0aGlzLGgsZCh0aGlzLGYpKyJweCIpfSl9O2MuZm5bIm91dGVyIitiXT1mdW5jdGlvbihmLGcpe2lmKHR5cGVvZiBmIT09Im51bWJlciIpcmV0dXJuIGlbIm91dGVyIitiXS5jYWxsKHRoaXMsZik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2Muc3R5bGUodGhpcywKaCxkKHRoaXMsZix0cnVlLGcpKyJweCIpfSl9fSk7Yy5leHRlbmQoYy5leHByWyI6Il0se2RhdGE6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiEhYy5kYXRhKGEsZFszXSl9LGZvY3VzYWJsZTpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksZD1jLmF0dHIoYSwidGFiaW5kZXgiKTtpZigiYXJlYSI9PT1iKXtiPWEucGFyZW50Tm9kZTtkPWIubmFtZTtpZighYS5ocmVmfHwhZHx8Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im1hcCIpcmV0dXJuIGZhbHNlO2E9YygiaW1nW3VzZW1hcD0jIitkKyJdIilbMF07cmV0dXJuISFhJiZrKGEpfXJldHVybigvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QvLnRlc3QoYik/IWEuZGlzYWJsZWQ6ImEiPT1iP2EuaHJlZnx8IWlzTmFOKGQpOiFpc05hTihkKSkmJmsoYSl9LHRhYmJhYmxlOmZ1bmN0aW9uKGEpe3ZhciBiPWMuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybihpc05hTihiKXx8Yj49MCkmJmMoYSkuaXMoIjpmb2N1c2FibGUiKX19KTsKYyhmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGI9ZG9jdW1lbnQuYm9keTtjLmV4dGVuZChhLnN0eWxlLHttaW5IZWlnaHQ6IjEwMHB4IixoZWlnaHQ6ImF1dG8iLHBhZGRpbmc6MCxib3JkZXJXaWR0aDowfSk7Yy5zdXBwb3J0Lm1pbkhlaWdodD1iLmFwcGVuZENoaWxkKGEpLm9mZnNldEhlaWdodD09PTEwMDtiLnJlbW92ZUNoaWxkKGEpLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7Yy5leHRlbmQoYy51aSx7cGx1Z2luOnthZGQ6ZnVuY3Rpb24oYSxiLGQpe2E9Yy51aVthXS5wcm90b3R5cGU7Zm9yKHZhciBlIGluIGQpe2EucGx1Z2luc1tlXT1hLnBsdWdpbnNbZV18fFtdO2EucGx1Z2luc1tlXS5wdXNoKFtiLGRbZV1dKX19LGNhbGw6ZnVuY3Rpb24oYSxiLGQpe2lmKChiPWEucGx1Z2luc1tiXSkmJmEuZWxlbWVudFswXS5wYXJlbnROb2RlKWZvcih2YXIgZT0wO2U8Yi5sZW5ndGg7ZSsrKWEub3B0aW9uc1tiW2VdWzBdXSYmYltlXVsxXS5hcHBseShhLmVsZW1lbnQsCmQpfX0sY29udGFpbnM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZG9jdW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNjphIT09YiYmYS5jb250YWlucyhiKX0saGFzU2Nyb2xsOmZ1bmN0aW9uKGEsYil7aWYoYyhhKS5jc3MoIm92ZXJmbG93Iik9PT0iaGlkZGVuIilyZXR1cm4gZmFsc2U7Yj1iJiZiPT09ImxlZnQiPyJzY3JvbGxMZWZ0Ijoic2Nyb2xsVG9wIjt2YXIgZD1mYWxzZTtpZihhW2JdPjApcmV0dXJuIHRydWU7YVtiXT0xO2Q9YVtiXT4wO2FbYl09MDtyZXR1cm4gZH0saXNPdmVyQXhpczpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGE+YiYmYTxiK2R9LGlzT3ZlcjpmdW5jdGlvbihhLGIsZCxlLGgsaSl7cmV0dXJuIGMudWkuaXNPdmVyQXhpcyhhLGQsaCkmJmMudWkuaXNPdmVyQXhpcyhiLGUsaSl9fSl9fSkoalF1ZXJ5KTsKOy8qIQogKiBqUXVlcnkgVUkgV2lkZ2V0IDEuOC41CiAqCiAqIENvcHlyaWdodCAyMDEwLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9XaWRnZXQKICovCihmdW5jdGlvbihiLGope2lmKGIuY2xlYW5EYXRhKXt2YXIgaz1iLmNsZWFuRGF0YTtiLmNsZWFuRGF0YT1mdW5jdGlvbihhKXtmb3IodmFyIGM9MCxkOyhkPWFbY10pIT1udWxsO2MrKyliKGQpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKTtrKGEpfX1lbHNle3ZhciBsPWIuZm4ucmVtb3ZlO2IuZm4ucmVtb3ZlPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCFjKWlmKCFhfHxiLmZpbHRlcihhLFt0aGlzXSkubGVuZ3RoKWIoIioiLHRoaXMpLmFkZChbdGhpc10pLmVhY2goZnVuY3Rpb24oKXtiKHRoaXMpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX0pO3JldHVybiBsLmNhbGwoYih0aGlzKSxhLGMpfSl9fWIud2lkZ2V0PWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1hLnNwbGl0KCIuIilbMF0sZjthPWEuc3BsaXQoIi4iKVsxXTtmPWUrIi0iK2E7aWYoIWQpe2Q9YztjPWIuV2lkZ2V0fWIuZXhwclsiOiJdW2ZdPWZ1bmN0aW9uKGgpe3JldHVybiEhYi5kYXRhKGgsCmEpfTtiW2VdPWJbZV18fHt9O2JbZV1bYV09ZnVuY3Rpb24oaCxnKXthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoaCxnKX07Yz1uZXcgYztjLm9wdGlvbnM9Yi5leHRlbmQodHJ1ZSx7fSxjLm9wdGlvbnMpO2JbZV1bYV0ucHJvdG90eXBlPWIuZXh0ZW5kKHRydWUsYyx7bmFtZXNwYWNlOmUsd2lkZ2V0TmFtZTphLHdpZGdldEV2ZW50UHJlZml4OmJbZV1bYV0ucHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4fHxhLHdpZGdldEJhc2VDbGFzczpmfSxkKTtiLndpZGdldC5icmlkZ2UoYSxiW2VdW2FdKX07Yi53aWRnZXQuYnJpZGdlPWZ1bmN0aW9uKGEsYyl7Yi5mblthXT1mdW5jdGlvbihkKXt2YXIgZT10eXBlb2YgZD09PSJzdHJpbmciLGY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGg9dGhpcztkPSFlJiZmLmxlbmd0aD9iLmV4dGVuZC5hcHBseShudWxsLFt0cnVlLGRdLmNvbmNhdChmKSk6ZDtpZihlJiZkLnN1YnN0cmluZygwLDEpPT09CiJfIilyZXR1cm4gaDtlP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBnPWIuZGF0YSh0aGlzLGEpO2lmKCFnKXRocm93ImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gIithKyIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IGF0dGVtcHRlZCB0byBjYWxsIG1ldGhvZCAnIitkKyInIjtpZighYi5pc0Z1bmN0aW9uKGdbZF0pKXRocm93Im5vIHN1Y2ggbWV0aG9kICciK2QrIicgZm9yICIrYSsiIHdpZGdldCBpbnN0YW5jZSI7dmFyIGk9Z1tkXS5hcHBseShnLGYpO2lmKGkhPT1nJiZpIT09ail7aD1pO3JldHVybiBmYWxzZX19KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZz1iLmRhdGEodGhpcyxhKTtnP2cub3B0aW9uKGR8fHt9KS5faW5pdCgpOmIuZGF0YSh0aGlzLGEsbmV3IGMoZCx0aGlzKSl9KTtyZXR1cm4gaH19O2IuV2lkZ2V0PWZ1bmN0aW9uKGEsYyl7YXJndW1lbnRzLmxlbmd0aCYmdGhpcy5fY3JlYXRlV2lkZ2V0KGEsYyl9O2IuV2lkZ2V0LnByb3RvdHlwZT17d2lkZ2V0TmFtZToid2lkZ2V0IiwKd2lkZ2V0RXZlbnRQcmVmaXg6IiIsb3B0aW9uczp7ZGlzYWJsZWQ6ZmFsc2V9LF9jcmVhdGVXaWRnZXQ6ZnVuY3Rpb24oYSxjKXtiLmRhdGEoYyx0aGlzLndpZGdldE5hbWUsdGhpcyk7dGhpcy5lbGVtZW50PWIoYyk7dGhpcy5vcHRpb25zPWIuZXh0ZW5kKHRydWUse30sdGhpcy5vcHRpb25zLGIubWV0YWRhdGEmJmIubWV0YWRhdGEuZ2V0KGMpW3RoaXMud2lkZ2V0TmFtZV0sYSk7dmFyIGQ9dGhpczt0aGlzLmVsZW1lbnQuYmluZCgicmVtb3ZlLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKCl7ZC5kZXN0cm95KCl9KTt0aGlzLl9jcmVhdGUoKTt0aGlzLl9pbml0KCl9LF9jcmVhdGU6ZnVuY3Rpb24oKXt9LF9pbml0OmZ1bmN0aW9uKCl7fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSk7dGhpcy53aWRnZXQoKS51bmJpbmQoIi4iK3RoaXMud2lkZ2V0TmFtZSkucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpLnJlbW92ZUNsYXNzKHRoaXMud2lkZ2V0QmFzZUNsYXNzKwoiLWRpc2FibGVkIHVpLXN0YXRlLWRpc2FibGVkIil9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnR9LG9wdGlvbjpmdW5jdGlvbihhLGMpe3ZhciBkPWEsZT10aGlzO2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0wKXJldHVybiBiLmV4dGVuZCh7fSxlLm9wdGlvbnMpO2lmKHR5cGVvZiBhPT09InN0cmluZyIpe2lmKGM9PT1qKXJldHVybiB0aGlzLm9wdGlvbnNbYV07ZD17fTtkW2FdPWN9Yi5lYWNoKGQsZnVuY3Rpb24oZixoKXtlLl9zZXRPcHRpb24oZixoKX0pO3JldHVybiBlfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGEsYyl7dGhpcy5vcHRpb25zW2FdPWM7aWYoYT09PSJkaXNhYmxlZCIpdGhpcy53aWRnZXQoKVtjPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0odGhpcy53aWRnZXRCYXNlQ2xhc3MrIi1kaXNhYmxlZCB1aS1zdGF0ZS1kaXNhYmxlZCIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLGMpO3JldHVybiB0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsCmZhbHNlKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIix0cnVlKX0sX3RyaWdnZXI6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPXRoaXMub3B0aW9uc1thXTtjPWIuRXZlbnQoYyk7Yy50eXBlPShhPT09dGhpcy53aWRnZXRFdmVudFByZWZpeD9hOnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrYSkudG9Mb3dlckNhc2UoKTtkPWR8fHt9O2lmKGMub3JpZ2luYWxFdmVudCl7YT1iLmV2ZW50LnByb3BzLmxlbmd0aDtmb3IodmFyIGY7YTspe2Y9Yi5ldmVudC5wcm9wc1stLWFdO2NbZl09Yy5vcmlnaW5hbEV2ZW50W2ZdfX10aGlzLmVsZW1lbnQudHJpZ2dlcihjLGQpO3JldHVybiEoYi5pc0Z1bmN0aW9uKGUpJiZlLmNhbGwodGhpcy5lbGVtZW50WzBdLGMsZCk9PT1mYWxzZXx8Yy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl9fX0pKGpRdWVyeSk7CjsvKiEKICogalF1ZXJ5IFVJIE1vdXNlIDEuOC41CiAqCiAqIENvcHlyaWdodCAyMDEwLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9Nb3VzZQogKgogKiBEZXBlbmRzOgogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqLwooZnVuY3Rpb24oYyl7Yy53aWRnZXQoInVpLm1vdXNlIix7b3B0aW9uczp7Y2FuY2VsOiI6aW5wdXQsb3B0aW9uIixkaXN0YW5jZToxLGRlbGF5OjB9LF9tb3VzZUluaXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuZWxlbWVudC5iaW5kKCJtb3VzZWRvd24uIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24oYil7cmV0dXJuIGEuX21vdXNlRG93bihiKX0pLmJpbmQoImNsaWNrLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGIpe2lmKGEuX3ByZXZlbnRDbGlja0V2ZW50KXthLl9wcmV2ZW50Q2xpY2tFdmVudD1mYWxzZTtiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO3JldHVybiBmYWxzZX19KTt0aGlzLnN0YXJ0ZWQ9ZmFsc2V9LF9tb3VzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQudW5iaW5kKCIuIit0aGlzLndpZGdldE5hbWUpfSxfbW91c2VEb3duOmZ1bmN0aW9uKGEpe2Eub3JpZ2luYWxFdmVudD1hLm9yaWdpbmFsRXZlbnR8fHt9O2lmKCFhLm9yaWdpbmFsRXZlbnQubW91c2VIYW5kbGVkKXt0aGlzLl9tb3VzZVN0YXJ0ZWQmJgp0aGlzLl9tb3VzZVVwKGEpO3RoaXMuX21vdXNlRG93bkV2ZW50PWE7dmFyIGI9dGhpcyxlPWEud2hpY2g9PTEsZj10eXBlb2YgdGhpcy5vcHRpb25zLmNhbmNlbD09InN0cmluZyI/YyhhLnRhcmdldCkucGFyZW50cygpLmFkZChhLnRhcmdldCkuZmlsdGVyKHRoaXMub3B0aW9ucy5jYW5jZWwpLmxlbmd0aDpmYWxzZTtpZighZXx8Znx8IXRoaXMuX21vdXNlQ2FwdHVyZShhKSlyZXR1cm4gdHJ1ZTt0aGlzLm1vdXNlRGVsYXlNZXQ9IXRoaXMub3B0aW9ucy5kZWxheTtpZighdGhpcy5tb3VzZURlbGF5TWV0KXRoaXMuX21vdXNlRGVsYXlUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5tb3VzZURlbGF5TWV0PXRydWV9LHRoaXMub3B0aW9ucy5kZWxheSk7aWYodGhpcy5fbW91c2VEaXN0YW5jZU1ldChhKSYmdGhpcy5fbW91c2VEZWxheU1ldChhKSl7dGhpcy5fbW91c2VTdGFydGVkPXRoaXMuX21vdXNlU3RhcnQoYSkhPT1mYWxzZTtpZighdGhpcy5fbW91c2VTdGFydGVkKXthLnByZXZlbnREZWZhdWx0KCk7CnJldHVybiB0cnVlfX10aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1mdW5jdGlvbihkKXtyZXR1cm4gYi5fbW91c2VNb3ZlKGQpfTt0aGlzLl9tb3VzZVVwRGVsZWdhdGU9ZnVuY3Rpb24oZCl7cmV0dXJuIGIuX21vdXNlVXAoZCl9O2MoZG9jdW1lbnQpLmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpO2MuYnJvd3Nlci5zYWZhcml8fGEucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYS5vcmlnaW5hbEV2ZW50Lm1vdXNlSGFuZGxlZD10cnVlfX0sX21vdXNlTW92ZTpmdW5jdGlvbihhKXtpZihjLmJyb3dzZXIubXNpZSYmIWEuYnV0dG9uKXJldHVybiB0aGlzLl9tb3VzZVVwKGEpO2lmKHRoaXMuX21vdXNlU3RhcnRlZCl7dGhpcy5fbW91c2VEcmFnKGEpO3JldHVybiBhLnByZXZlbnREZWZhdWx0KCl9aWYodGhpcy5fbW91c2VEaXN0YW5jZU1ldChhKSYmCnRoaXMuX21vdXNlRGVsYXlNZXQoYSkpKHRoaXMuX21vdXNlU3RhcnRlZD10aGlzLl9tb3VzZVN0YXJ0KHRoaXMuX21vdXNlRG93bkV2ZW50LGEpIT09ZmFsc2UpP3RoaXMuX21vdXNlRHJhZyhhKTp0aGlzLl9tb3VzZVVwKGEpO3JldHVybiF0aGlzLl9tb3VzZVN0YXJ0ZWR9LF9tb3VzZVVwOmZ1bmN0aW9uKGEpe2MoZG9jdW1lbnQpLnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKTtpZih0aGlzLl9tb3VzZVN0YXJ0ZWQpe3RoaXMuX21vdXNlU3RhcnRlZD1mYWxzZTt0aGlzLl9wcmV2ZW50Q2xpY2tFdmVudD1hLnRhcmdldD09dGhpcy5fbW91c2VEb3duRXZlbnQudGFyZ2V0O3RoaXMuX21vdXNlU3RvcChhKX1yZXR1cm4gZmFsc2V9LF9tb3VzZURpc3RhbmNlTWV0OmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLm1heChNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWC0KYS5wYWdlWCksTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVktYS5wYWdlWSkpPj10aGlzLm9wdGlvbnMuZGlzdGFuY2V9LF9tb3VzZURlbGF5TWV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW91c2VEZWxheU1ldH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oKXt9LF9tb3VzZURyYWc6ZnVuY3Rpb24oKXt9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oKXt9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gdHJ1ZX19KX0pKGpRdWVyeSk7CjsvKgogKiBqUXVlcnkgVUkgUG9zaXRpb24gMS44LjUKICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1Bvc2l0aW9uCiAqLwooZnVuY3Rpb24oYyl7Yy51aT1jLnVpfHx7fTt2YXIgbj0vbGVmdHxjZW50ZXJ8cmlnaHQvLG89L3RvcHxjZW50ZXJ8Ym90dG9tLyx0PWMuZm4ucG9zaXRpb24sdT1jLmZuLm9mZnNldDtjLmZuLnBvc2l0aW9uPWZ1bmN0aW9uKGIpe2lmKCFifHwhYi5vZilyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yj1jLmV4dGVuZCh7fSxiKTt2YXIgYT1jKGIub2YpLGQ9YVswXSxnPShiLmNvbGxpc2lvbnx8ImZsaXAiKS5zcGxpdCgiICIpLGU9Yi5vZmZzZXQ/Yi5vZmZzZXQuc3BsaXQoIiAiKTpbMCwwXSxoLGssajtpZihkLm5vZGVUeXBlPT09OSl7aD1hLndpZHRoKCk7az1hLmhlaWdodCgpO2o9e3RvcDowLGxlZnQ6MH19ZWxzZSBpZihkLnNjcm9sbFRvJiZkLmRvY3VtZW50KXtoPWEud2lkdGgoKTtrPWEuaGVpZ2h0KCk7aj17dG9wOmEuc2Nyb2xsVG9wKCksbGVmdDphLnNjcm9sbExlZnQoKX19ZWxzZSBpZihkLnByZXZlbnREZWZhdWx0KXtiLmF0PSJsZWZ0IHRvcCI7aD1rPTA7aj0Ke3RvcDpiLm9mLnBhZ2VZLGxlZnQ6Yi5vZi5wYWdlWH19ZWxzZXtoPWEub3V0ZXJXaWR0aCgpO2s9YS5vdXRlckhlaWdodCgpO2o9YS5vZmZzZXQoKX1jLmVhY2goWyJteSIsImF0Il0sZnVuY3Rpb24oKXt2YXIgZj0oYlt0aGlzXXx8IiIpLnNwbGl0KCIgIik7aWYoZi5sZW5ndGg9PT0xKWY9bi50ZXN0KGZbMF0pP2YuY29uY2F0KFsiY2VudGVyIl0pOm8udGVzdChmWzBdKT9bImNlbnRlciJdLmNvbmNhdChmKTpbImNlbnRlciIsImNlbnRlciJdO2ZbMF09bi50ZXN0KGZbMF0pP2ZbMF06ImNlbnRlciI7ZlsxXT1vLnRlc3QoZlsxXSk/ZlsxXToiY2VudGVyIjtiW3RoaXNdPWZ9KTtpZihnLmxlbmd0aD09PTEpZ1sxXT1nWzBdO2VbMF09cGFyc2VJbnQoZVswXSwxMCl8fDA7aWYoZS5sZW5ndGg9PT0xKWVbMV09ZVswXTtlWzFdPXBhcnNlSW50KGVbMV0sMTApfHwwO2lmKGIuYXRbMF09PT0icmlnaHQiKWoubGVmdCs9aDtlbHNlIGlmKGIuYXRbMF09PT0iY2VudGVyIilqLmxlZnQrPWgvCjI7aWYoYi5hdFsxXT09PSJib3R0b20iKWoudG9wKz1rO2Vsc2UgaWYoYi5hdFsxXT09PSJjZW50ZXIiKWoudG9wKz1rLzI7ai5sZWZ0Kz1lWzBdO2oudG9wKz1lWzFdO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZj1jKHRoaXMpLGw9Zi5vdXRlcldpZHRoKCksbT1mLm91dGVySGVpZ2h0KCkscD1wYXJzZUludChjLmN1ckNTUyh0aGlzLCJtYXJnaW5MZWZ0Iix0cnVlKSl8fDAscT1wYXJzZUludChjLmN1ckNTUyh0aGlzLCJtYXJnaW5Ub3AiLHRydWUpKXx8MCx2PWwrcCtwYXJzZUludChjLmN1ckNTUyh0aGlzLCJtYXJnaW5SaWdodCIsdHJ1ZSkpfHwwLHc9bStxK3BhcnNlSW50KGMuY3VyQ1NTKHRoaXMsIm1hcmdpbkJvdHRvbSIsdHJ1ZSkpfHwwLGk9Yy5leHRlbmQoe30saikscjtpZihiLm15WzBdPT09InJpZ2h0IilpLmxlZnQtPWw7ZWxzZSBpZihiLm15WzBdPT09ImNlbnRlciIpaS5sZWZ0LT1sLzI7aWYoYi5teVsxXT09PSJib3R0b20iKWkudG9wLT1tO2Vsc2UgaWYoYi5teVsxXT09PQoiY2VudGVyIilpLnRvcC09bS8yO2kubGVmdD1wYXJzZUludChpLmxlZnQpO2kudG9wPXBhcnNlSW50KGkudG9wKTtyPXtsZWZ0OmkubGVmdC1wLHRvcDppLnRvcC1xfTtjLmVhY2goWyJsZWZ0IiwidG9wIl0sZnVuY3Rpb24ocyx4KXtjLnVpLnBvc2l0aW9uW2dbc11dJiZjLnVpLnBvc2l0aW9uW2dbc11dW3hdKGkse3RhcmdldFdpZHRoOmgsdGFyZ2V0SGVpZ2h0OmssZWxlbVdpZHRoOmwsZWxlbUhlaWdodDptLGNvbGxpc2lvblBvc2l0aW9uOnIsY29sbGlzaW9uV2lkdGg6dixjb2xsaXNpb25IZWlnaHQ6dyxvZmZzZXQ6ZSxteTpiLm15LGF0OmIuYXR9KX0pO2MuZm4uYmdpZnJhbWUmJmYuYmdpZnJhbWUoKTtmLm9mZnNldChjLmV4dGVuZChpLHt1c2luZzpiLnVzaW5nfSkpfSl9O2MudWkucG9zaXRpb249e2ZpdDp7bGVmdDpmdW5jdGlvbihiLGEpe3ZhciBkPWMod2luZG93KTtkPWEuY29sbGlzaW9uUG9zaXRpb24ubGVmdCthLmNvbGxpc2lvbldpZHRoLWQud2lkdGgoKS1kLnNjcm9sbExlZnQoKTsKYi5sZWZ0PWQ+MD9iLmxlZnQtZDpNYXRoLm1heChiLmxlZnQtYS5jb2xsaXNpb25Qb3NpdGlvbi5sZWZ0LGIubGVmdCl9LHRvcDpmdW5jdGlvbihiLGEpe3ZhciBkPWMod2luZG93KTtkPWEuY29sbGlzaW9uUG9zaXRpb24udG9wK2EuY29sbGlzaW9uSGVpZ2h0LWQuaGVpZ2h0KCktZC5zY3JvbGxUb3AoKTtiLnRvcD1kPjA/Yi50b3AtZDpNYXRoLm1heChiLnRvcC1hLmNvbGxpc2lvblBvc2l0aW9uLnRvcCxiLnRvcCl9fSxmbGlwOntsZWZ0OmZ1bmN0aW9uKGIsYSl7aWYoYS5hdFswXSE9PSJjZW50ZXIiKXt2YXIgZD1jKHdpbmRvdyk7ZD1hLmNvbGxpc2lvblBvc2l0aW9uLmxlZnQrYS5jb2xsaXNpb25XaWR0aC1kLndpZHRoKCktZC5zY3JvbGxMZWZ0KCk7dmFyIGc9YS5teVswXT09PSJsZWZ0Ij8tYS5lbGVtV2lkdGg6YS5teVswXT09PSJyaWdodCI/YS5lbGVtV2lkdGg6MCxlPWEuYXRbMF09PT0ibGVmdCI/YS50YXJnZXRXaWR0aDotYS50YXJnZXRXaWR0aCxoPS0yKmEub2Zmc2V0WzBdOwpiLmxlZnQrPWEuY29sbGlzaW9uUG9zaXRpb24ubGVmdDwwP2crZStoOmQ+MD9nK2UraDowfX0sdG9wOmZ1bmN0aW9uKGIsYSl7aWYoYS5hdFsxXSE9PSJjZW50ZXIiKXt2YXIgZD1jKHdpbmRvdyk7ZD1hLmNvbGxpc2lvblBvc2l0aW9uLnRvcCthLmNvbGxpc2lvbkhlaWdodC1kLmhlaWdodCgpLWQuc2Nyb2xsVG9wKCk7dmFyIGc9YS5teVsxXT09PSJ0b3AiPy1hLmVsZW1IZWlnaHQ6YS5teVsxXT09PSJib3R0b20iP2EuZWxlbUhlaWdodDowLGU9YS5hdFsxXT09PSJ0b3AiP2EudGFyZ2V0SGVpZ2h0Oi1hLnRhcmdldEhlaWdodCxoPS0yKmEub2Zmc2V0WzFdO2IudG9wKz1hLmNvbGxpc2lvblBvc2l0aW9uLnRvcDwwP2crZStoOmQ+MD9nK2UraDowfX19fTtpZighYy5vZmZzZXQuc2V0T2Zmc2V0KXtjLm9mZnNldC5zZXRPZmZzZXQ9ZnVuY3Rpb24oYixhKXtpZigvc3RhdGljLy50ZXN0KGMuY3VyQ1NTKGIsInBvc2l0aW9uIikpKWIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjt2YXIgZD0KYyhiKSxnPWQub2Zmc2V0KCksZT1wYXJzZUludChjLmN1ckNTUyhiLCJ0b3AiLHRydWUpLDEwKXx8MCxoPXBhcnNlSW50KGMuY3VyQ1NTKGIsImxlZnQiLHRydWUpLDEwKXx8MDtnPXt0b3A6YS50b3AtZy50b3ArZSxsZWZ0OmEubGVmdC1nLmxlZnQraH07InVzaW5nImluIGE/YS51c2luZy5jYWxsKGIsZyk6ZC5jc3MoZyl9O2MuZm4ub2Zmc2V0PWZ1bmN0aW9uKGIpe3ZhciBhPXRoaXNbMF07aWYoIWF8fCFhLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYil9KTtyZXR1cm4gdS5jYWxsKHRoaXMpfX19KShqUXVlcnkpOwo7LyoKICogalF1ZXJ5IFVJIERyYWdnYWJsZSAxLjguNQogKgogKiBDb3B5cmlnaHQgMjAxMCwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRHJhZ2dhYmxlcwogKgogKiBEZXBlbmRzOgogKglqcXVlcnkudWkuY29yZS5qcwogKglqcXVlcnkudWkubW91c2UuanMKICoJanF1ZXJ5LnVpLndpZGdldC5qcwogKi8KKGZ1bmN0aW9uKGQpe2Qud2lkZ2V0KCJ1aS5kcmFnZ2FibGUiLGQudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJkcmFnIixvcHRpb25zOnthZGRDbGFzc2VzOnRydWUsYXBwZW5kVG86InBhcmVudCIsYXhpczpmYWxzZSxjb25uZWN0VG9Tb3J0YWJsZTpmYWxzZSxjb250YWlubWVudDpmYWxzZSxjdXJzb3I6ImF1dG8iLGN1cnNvckF0OmZhbHNlLGdyaWQ6ZmFsc2UsaGFuZGxlOmZhbHNlLGhlbHBlcjoib3JpZ2luYWwiLGlmcmFtZUZpeDpmYWxzZSxvcGFjaXR5OmZhbHNlLHJlZnJlc2hQb3NpdGlvbnM6ZmFsc2UscmV2ZXJ0OmZhbHNlLHJldmVydER1cmF0aW9uOjUwMCxzY29wZToiZGVmYXVsdCIsc2Nyb2xsOnRydWUsc2Nyb2xsU2Vuc2l0aXZpdHk6MjAsc2Nyb2xsU3BlZWQ6MjAsc25hcDpmYWxzZSxzbmFwTW9kZToiYm90aCIsc25hcFRvbGVyYW5jZToyMCxzdGFjazpmYWxzZSx6SW5kZXg6ZmFsc2V9LF9jcmVhdGU6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuaGVscGVyPT0KIm9yaWdpbmFsIiYmIS9eKD86cnxhfGYpLy50ZXN0KHRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIikpKXRoaXMuZWxlbWVudFswXS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiO3RoaXMub3B0aW9ucy5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZSIpO3RoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKTt0aGlzLl9tb3VzZUluaXQoKX0sZGVzdHJveTpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbWVudC5kYXRhKCJkcmFnZ2FibGUiKSl7dGhpcy5lbGVtZW50LnJlbW92ZURhdGEoImRyYWdnYWJsZSIpLnVuYmluZCgiLmRyYWdnYWJsZSIpLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUgdWktZHJhZ2dhYmxlLWRyYWdnaW5nIHVpLWRyYWdnYWJsZS1kaXNhYmxlZCIpO3RoaXMuX21vdXNlRGVzdHJveSgpO3JldHVybiB0aGlzfX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5vcHRpb25zO2lmKHRoaXMuaGVscGVyfHxiLmRpc2FibGVkfHxkKGEudGFyZ2V0KS5pcygiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKSlyZXR1cm4gZmFsc2U7dGhpcy5oYW5kbGU9dGhpcy5fZ2V0SGFuZGxlKGEpO2lmKCF0aGlzLmhhbmRsZSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9uczt0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIoYSk7dGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpO2lmKGQudWkuZGRtYW5hZ2VyKWQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpczt0aGlzLl9jYWNoZU1hcmdpbnMoKTt0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKTt0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKTt0aGlzLm9mZnNldD10aGlzLnBvc2l0aW9uQWJzPXRoaXMuZWxlbWVudC5vZmZzZXQoKTt0aGlzLm9mZnNldD17dG9wOnRoaXMub2Zmc2V0LnRvcC0KdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMub2Zmc2V0LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnR9O2QuZXh0ZW5kKHRoaXMub2Zmc2V0LHtjbGljazp7bGVmdDphLnBhZ2VYLXRoaXMub2Zmc2V0LmxlZnQsdG9wOmEucGFnZVktdGhpcy5vZmZzZXQudG9wfSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0pO3RoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oYSk7dGhpcy5vcmlnaW5hbFBhZ2VYPWEucGFnZVg7dGhpcy5vcmlnaW5hbFBhZ2VZPWEucGFnZVk7Yi5jdXJzb3JBdCYmdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihiLmN1cnNvckF0KTtiLmNvbnRhaW5tZW50JiZ0aGlzLl9zZXRDb250YWlubWVudCgpO2lmKHRoaXMuX3RyaWdnZXIoInN0YXJ0IixhKT09PWZhbHNlKXt0aGlzLl9jbGVhcigpO3JldHVybiBmYWxzZX10aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCk7CmQudWkuZGRtYW5hZ2VyJiYhYi5kcm9wQmVoYXZpb3VyJiZkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLGEpO3RoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKTt0aGlzLl9tb3VzZURyYWcoYSx0cnVlKTtyZXR1cm4gdHJ1ZX0sX21vdXNlRHJhZzpmdW5jdGlvbihhLGIpe3RoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihhKTt0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCFiKXtiPXRoaXMuX3VpSGFzaCgpO2lmKHRoaXMuX3RyaWdnZXIoImRyYWciLGEsYik9PT1mYWxzZSl7dGhpcy5fbW91c2VVcCh7fSk7cmV0dXJuIGZhbHNlfXRoaXMucG9zaXRpb249Yi5wb3NpdGlvbn1pZighdGhpcy5vcHRpb25zLmF4aXN8fHRoaXMub3B0aW9ucy5heGlzIT0ieSIpdGhpcy5oZWxwZXJbMF0uc3R5bGUubGVmdD10aGlzLnBvc2l0aW9uLmxlZnQrInB4IjtpZighdGhpcy5vcHRpb25zLmF4aXN8fAp0aGlzLm9wdGlvbnMuYXhpcyE9IngiKXRoaXMuaGVscGVyWzBdLnN0eWxlLnRvcD10aGlzLnBvc2l0aW9uLnRvcCsicHgiO2QudWkuZGRtYW5hZ2VyJiZkLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsYSk7cmV0dXJuIGZhbHNlfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGEpe3ZhciBiPWZhbHNlO2lmKGQudWkuZGRtYW5hZ2VyJiYhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXIpYj1kLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsYSk7aWYodGhpcy5kcm9wcGVkKXtiPXRoaXMuZHJvcHBlZDt0aGlzLmRyb3BwZWQ9ZmFsc2V9aWYoIXRoaXMuZWxlbWVudFswXXx8IXRoaXMuZWxlbWVudFswXS5wYXJlbnROb2RlKXJldHVybiBmYWxzZTtpZih0aGlzLm9wdGlvbnMucmV2ZXJ0PT0iaW52YWxpZCImJiFifHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT0idmFsaWQiJiZifHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT09dHJ1ZXx8ZC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5yZXZlcnQpJiZ0aGlzLm9wdGlvbnMucmV2ZXJ0LmNhbGwodGhpcy5lbGVtZW50LApiKSl7dmFyIGM9dGhpcztkKHRoaXMuaGVscGVyKS5hbmltYXRlKHRoaXMub3JpZ2luYWxQb3NpdGlvbixwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0RHVyYXRpb24sMTApLGZ1bmN0aW9uKCl7Yy5fdHJpZ2dlcigic3RvcCIsYSkhPT1mYWxzZSYmYy5fY2xlYXIoKX0pfWVsc2UgdGhpcy5fdHJpZ2dlcigic3RvcCIsYSkhPT1mYWxzZSYmdGhpcy5fY2xlYXIoKTtyZXR1cm4gZmFsc2V9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIik/dGhpcy5fbW91c2VVcCh7fSk6dGhpcy5fY2xlYXIoKTtyZXR1cm4gdGhpc30sX2dldEhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj0hdGhpcy5vcHRpb25zLmhhbmRsZXx8IWQodGhpcy5vcHRpb25zLmhhbmRsZSx0aGlzLmVsZW1lbnQpLmxlbmd0aD90cnVlOmZhbHNlO2QodGhpcy5vcHRpb25zLmhhbmRsZSx0aGlzLmVsZW1lbnQpLmZpbmQoIioiKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbigpe2lmKHRoaXM9PQphLnRhcmdldCliPXRydWV9KTtyZXR1cm4gYn0sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnM7YT1kLmlzRnVuY3Rpb24oYi5oZWxwZXIpP2QoYi5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFthXSkpOmIuaGVscGVyPT0iY2xvbmUiP3RoaXMuZWxlbWVudC5jbG9uZSgpOnRoaXMuZWxlbWVudDthLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGEuYXBwZW5kVG8oYi5hcHBlbmRUbz09InBhcmVudCI/dGhpcy5lbGVtZW50WzBdLnBhcmVudE5vZGU6Yi5hcHBlbmRUbyk7YVswXSE9dGhpcy5lbGVtZW50WzBdJiYhLyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3QoYS5jc3MoInBvc2l0aW9uIikpJiZhLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpO3JldHVybiBhfSxfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09InN0cmluZyIpYT1hLnNwbGl0KCIgIik7aWYoZC5pc0FycmF5KGEpKWE9e2xlZnQ6K2FbMF0sdG9wOithWzFdfHwKMH07aWYoImxlZnQiaW4gYSl0aGlzLm9mZnNldC5jbGljay5sZWZ0PWEubGVmdCt0aGlzLm1hcmdpbnMubGVmdDtpZigicmlnaHQiaW4gYSl0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtYS5yaWdodCt0aGlzLm1hcmdpbnMubGVmdDtpZigidG9wImluIGEpdGhpcy5vZmZzZXQuY2xpY2sudG9wPWEudG9wK3RoaXMubWFyZ2lucy50b3A7aWYoImJvdHRvbSJpbiBhKXRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1hLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wfSxfZ2V0UGFyZW50T2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5vZmZzZXRQYXJlbnQ9dGhpcy5oZWxwZXIub2Zmc2V0UGFyZW50KCk7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCk7aWYodGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZkLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLAp0aGlzLm9mZnNldFBhcmVudFswXSkpe2EubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpO2EudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKX1pZih0aGlzLm9mZnNldFBhcmVudFswXT09ZG9jdW1lbnQuYm9keXx8dGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZSYmdGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iaHRtbCImJmQuYnJvd3Nlci5tc2llKWE9e3RvcDowLGxlZnQ6MH07cmV0dXJue3RvcDphLnRvcCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCksbGVmdDphLmxlZnQrKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKX19LF9nZXRSZWxhdGl2ZU9mZnNldDpmdW5jdGlvbigpe2lmKHRoaXMuY3NzUG9zaXRpb249PSJyZWxhdGl2ZSIpe3ZhciBhPXRoaXMuZWxlbWVudC5wb3NpdGlvbigpO3JldHVybnt0b3A6YS50b3AtCihwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksbGVmdDphLmxlZnQtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpfX1lbHNlIHJldHVybnt0b3A6MCxsZWZ0OjB9fSxfY2FjaGVNYXJnaW5zOmZ1bmN0aW9uKCl7dGhpcy5tYXJnaW5zPXtsZWZ0OnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MH19LF9jYWNoZUhlbHBlclByb3BvcnRpb25zOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJQcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5oZWxwZXIub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpfX0sX3NldENvbnRhaW5tZW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zO2lmKGEuY29udGFpbm1lbnQ9PQoicGFyZW50IilhLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGU7aWYoYS5jb250YWlubWVudD09ImRvY3VtZW50Inx8YS5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bMC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LDAtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsZChhLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChkKGEuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/ZG9jdW1lbnQ6d2luZG93KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF07aWYoIS9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQpJC8udGVzdChhLmNvbnRhaW5tZW50KSYmCmEuY29udGFpbm1lbnQuY29uc3RydWN0b3IhPUFycmF5KXt2YXIgYj1kKGEuY29udGFpbm1lbnQpWzBdO2lmKGIpe2E9ZChhLmNvbnRhaW5tZW50KS5vZmZzZXQoKTt2YXIgYz1kKGIpLmNzcygib3ZlcmZsb3ciKSE9ImhpZGRlbiI7dGhpcy5jb250YWlubWVudD1bYS5sZWZ0KyhwYXJzZUludChkKGIpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZChiKS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKS10aGlzLm1hcmdpbnMubGVmdCxhLnRvcCsocGFyc2VJbnQoZChiKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZChiKS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLXRoaXMubWFyZ2lucy50b3AsYS5sZWZ0KyhjP01hdGgubWF4KGIuc2Nyb2xsV2lkdGgsYi5vZmZzZXRXaWR0aCk6Yi5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGQoYikuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChkKGIpLmNzcygicGFkZGluZ1JpZ2h0IiksCjEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCxhLnRvcCsoYz9NYXRoLm1heChiLnNjcm9sbEhlaWdodCxiLm9mZnNldEhlaWdodCk6Yi5vZmZzZXRIZWlnaHQpLShwYXJzZUludChkKGIpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChkKGIpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF19fWVsc2UgaWYoYS5jb250YWlubWVudC5jb25zdHJ1Y3Rvcj09QXJyYXkpdGhpcy5jb250YWlubWVudD1hLmNvbnRhaW5tZW50fSxfY29udmVydFBvc2l0aW9uVG86ZnVuY3Rpb24oYSxiKXtpZighYiliPXRoaXMucG9zaXRpb247YT1hPT0iYWJzb2x1dGUiPzE6LTE7dmFyIGM9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmISh0aGlzLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmQudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sCnRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsZj0vKGh0bWx8Ym9keSkvaS50ZXN0KGNbMF0udGFnTmFtZSk7cmV0dXJue3RvcDpiLnRvcCt0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AqYSt0aGlzLm9mZnNldC5wYXJlbnQudG9wKmEtKGQuYnJvd3Nlci5zYWZhcmkmJmQuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTpmPzA6Yy5zY3JvbGxUb3AoKSkqYSksbGVmdDpiLmxlZnQrdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCphK3RoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KmEtKGQuYnJvd3Nlci5zYWZhcmkmJmQuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6CmY/MDpjLnNjcm9sbExlZnQoKSkqYSl9fSxfZ2VuZXJhdGVQb3NpdGlvbjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYz10aGlzLmNzc1Bvc2l0aW9uPT0iYWJzb2x1dGUiJiYhKHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmZC51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkpP3RoaXMub2Zmc2V0UGFyZW50OnRoaXMuc2Nyb2xsUGFyZW50LGY9LyhodG1sfGJvZHkpL2kudGVzdChjWzBdLnRhZ05hbWUpLGU9YS5wYWdlWCxnPWEucGFnZVk7aWYodGhpcy5vcmlnaW5hbFBvc2l0aW9uKXtpZih0aGlzLmNvbnRhaW5tZW50KXtpZihhLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXSllPXRoaXMuY29udGFpbm1lbnRbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdDtpZihhLnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdKWc9dGhpcy5jb250YWlubWVudFsxXSsKdGhpcy5vZmZzZXQuY2xpY2sudG9wO2lmKGEucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD50aGlzLmNvbnRhaW5tZW50WzJdKWU9dGhpcy5jb250YWlubWVudFsyXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0O2lmKGEucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPnRoaXMuY29udGFpbm1lbnRbM10pZz10aGlzLmNvbnRhaW5tZW50WzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcH1pZihiLmdyaWQpe2c9dGhpcy5vcmlnaW5hbFBhZ2VZK01hdGgucm91bmQoKGctdGhpcy5vcmlnaW5hbFBhZ2VZKS9iLmdyaWRbMV0pKmIuZ3JpZFsxXTtnPXRoaXMuY29udGFpbm1lbnQ/IShnLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdfHxnLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdKT9nOiEoZy10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSk/Zy1iLmdyaWRbMV06ZytiLmdyaWRbMV06ZztlPXRoaXMub3JpZ2luYWxQYWdlWCsKTWF0aC5yb3VuZCgoZS10aGlzLm9yaWdpbmFsUGFnZVgpL2IuZ3JpZFswXSkqYi5ncmlkWzBdO2U9dGhpcy5jb250YWlubWVudD8hKGUtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdfHxlLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXSk/ZTohKGUtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdKT9lLWIuZ3JpZFswXTplK2IuZ3JpZFswXTplfX1yZXR1cm57dG9wOmctdGhpcy5vZmZzZXQuY2xpY2sudG9wLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wKyhkLmJyb3dzZXIuc2FmYXJpJiZkLmJyb3dzZXIudmVyc2lvbjw1MjYmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTpmPzA6Yy5zY3JvbGxUb3AoKSksbGVmdDplLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtCnRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQrKGQuYnJvd3Nlci5zYWZhcmkmJmQuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpmPzA6Yy5zY3JvbGxMZWZ0KCkpfX0sX2NsZWFyOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXIucmVtb3ZlQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpO3RoaXMuaGVscGVyWzBdIT10aGlzLmVsZW1lbnRbMF0mJiF0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwmJnRoaXMuaGVscGVyLnJlbW92ZSgpO3RoaXMuaGVscGVyPW51bGw7dGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsPWZhbHNlfSxfdHJpZ2dlcjpmdW5jdGlvbihhLGIsYyl7Yz1jfHx0aGlzLl91aUhhc2goKTtkLnVpLnBsdWdpbi5jYWxsKHRoaXMsYSxbYixjXSk7aWYoYT09ImRyYWciKXRoaXMucG9zaXRpb25BYnM9CnRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO3JldHVybiBkLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLGEsYixjKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKCl7cmV0dXJue2hlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9uLG9mZnNldDp0aGlzLnBvc2l0aW9uQWJzfX19KTtkLmV4dGVuZChkLnVpLmRyYWdnYWJsZSx7dmVyc2lvbjoiMS44LjUifSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJjb25uZWN0VG9Tb3J0YWJsZSIse3N0YXJ0OmZ1bmN0aW9uKGEsYil7dmFyIGM9ZCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxmPWMub3B0aW9ucyxlPWQuZXh0ZW5kKHt9LGIse2l0ZW06Yy5lbGVtZW50fSk7Yy5zb3J0YWJsZXM9W107ZChmLmNvbm5lY3RUb1NvcnRhYmxlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGc9ZC5kYXRhKHRoaXMsInNvcnRhYmxlIik7CmlmKGcmJiFnLm9wdGlvbnMuZGlzYWJsZWQpe2Muc29ydGFibGVzLnB1c2goe2luc3RhbmNlOmcsc2hvdWxkUmV2ZXJ0Omcub3B0aW9ucy5yZXZlcnR9KTtnLl9yZWZyZXNoSXRlbXMoKTtnLl90cmlnZ2VyKCJhY3RpdmF0ZSIsYSxlKX19KX0sc3RvcDpmdW5jdGlvbihhLGIpe3ZhciBjPWQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZj1kLmV4dGVuZCh7fSxiLHtpdGVtOmMuZWxlbWVudH0pO2QuZWFjaChjLnNvcnRhYmxlcyxmdW5jdGlvbigpe2lmKHRoaXMuaW5zdGFuY2UuaXNPdmVyKXt0aGlzLmluc3RhbmNlLmlzT3Zlcj0wO2MuY2FuY2VsSGVscGVyUmVtb3ZhbD10cnVlO3RoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbD1mYWxzZTtpZih0aGlzLnNob3VsZFJldmVydCl0aGlzLmluc3RhbmNlLm9wdGlvbnMucmV2ZXJ0PXRydWU7dGhpcy5pbnN0YW5jZS5fbW91c2VTdG9wKGEpO3RoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9dGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXI7CmMub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJnRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0uY3NzKHt0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSl9ZWxzZXt0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ZmFsc2U7dGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYSxmKX19KX0sZHJhZzpmdW5jdGlvbihhLGIpe3ZhciBjPWQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZj10aGlzO2QuZWFjaChjLnNvcnRhYmxlcyxmdW5jdGlvbigpe3RoaXMuaW5zdGFuY2UucG9zaXRpb25BYnM9Yy5wb3NpdGlvbkFiczt0aGlzLmluc3RhbmNlLmhlbHBlclByb3BvcnRpb25zPWMuaGVscGVyUHJvcG9ydGlvbnM7dGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2s9Yy5vZmZzZXQuY2xpY2s7aWYodGhpcy5pbnN0YW5jZS5faW50ZXJzZWN0c1dpdGgodGhpcy5pbnN0YW5jZS5jb250YWluZXJDYWNoZSkpe2lmKCF0aGlzLmluc3RhbmNlLmlzT3Zlcil7dGhpcy5pbnN0YW5jZS5pc092ZXI9CjE7dGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbT1kKGYpLmNsb25lKCkuYXBwZW5kVG8odGhpcy5pbnN0YW5jZS5lbGVtZW50KS5kYXRhKCJzb3J0YWJsZS1pdGVtIix0cnVlKTt0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyO3RoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYi5oZWxwZXJbMF19O2EudGFyZ2V0PXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW1bMF07dGhpcy5pbnN0YW5jZS5fbW91c2VDYXB0dXJlKGEsdHJ1ZSk7dGhpcy5pbnN0YW5jZS5fbW91c2VTdGFydChhLHRydWUsdHJ1ZSk7dGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2sudG9wPWMub2Zmc2V0LmNsaWNrLnRvcDt0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay5sZWZ0PWMub2Zmc2V0LmNsaWNrLmxlZnQ7dGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQtPWMub2Zmc2V0LnBhcmVudC5sZWZ0LXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0Owp0aGlzLmluc3RhbmNlLm9mZnNldC5wYXJlbnQudG9wLT1jLm9mZnNldC5wYXJlbnQudG9wLXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3A7Yy5fdHJpZ2dlcigidG9Tb3J0YWJsZSIsYSk7Yy5kcm9wcGVkPXRoaXMuaW5zdGFuY2UuZWxlbWVudDtjLmN1cnJlbnRJdGVtPWMuZWxlbWVudDt0aGlzLmluc3RhbmNlLmZyb21PdXRzaWRlPWN9dGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbSYmdGhpcy5pbnN0YW5jZS5fbW91c2VEcmFnKGEpfWVsc2UgaWYodGhpcy5pbnN0YW5jZS5pc092ZXIpe3RoaXMuaW5zdGFuY2UuaXNPdmVyPTA7dGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPXRydWU7dGhpcy5pbnN0YW5jZS5vcHRpb25zLnJldmVydD1mYWxzZTt0aGlzLmluc3RhbmNlLl90cmlnZ2VyKCJvdXQiLGEsdGhpcy5pbnN0YW5jZS5fdWlIYXNoKHRoaXMuaW5zdGFuY2UpKTt0aGlzLmluc3RhbmNlLl9tb3VzZVN0b3AoYSx0cnVlKTt0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyPQp0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcjt0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtLnJlbW92ZSgpO3RoaXMuaW5zdGFuY2UucGxhY2Vob2xkZXImJnRoaXMuaW5zdGFuY2UucGxhY2Vob2xkZXIucmVtb3ZlKCk7Yy5fdHJpZ2dlcigiZnJvbVNvcnRhYmxlIixhKTtjLmRyb3BwZWQ9ZmFsc2V9fSl9fSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJjdXJzb3IiLHtzdGFydDpmdW5jdGlvbigpe3ZhciBhPWQoImJvZHkiKSxiPWQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztpZihhLmNzcygiY3Vyc29yIikpYi5fY3Vyc29yPWEuY3NzKCJjdXJzb3IiKTthLmNzcygiY3Vyc29yIixiLmN1cnNvcil9LHN0b3A6ZnVuY3Rpb24oKXt2YXIgYT1kKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7YS5fY3Vyc29yJiZkKCJib2R5IikuY3NzKCJjdXJzb3IiLGEuX2N1cnNvcil9fSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJpZnJhbWVGaXgiLHtzdGFydDpmdW5jdGlvbigpe3ZhciBhPQpkKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZChhLmlmcmFtZUZpeD09PXRydWU/ImlmcmFtZSI6YS5pZnJhbWVGaXgpLmVhY2goZnVuY3Rpb24oKXtkKCc8ZGl2IGNsYXNzPSJ1aS1kcmFnZ2FibGUtaWZyYW1lRml4IiBzdHlsZT0iYmFja2dyb3VuZDogI2ZmZjsiPjwvZGl2PicpLmNzcyh7d2lkdGg6dGhpcy5vZmZzZXRXaWR0aCsicHgiLGhlaWdodDp0aGlzLm9mZnNldEhlaWdodCsicHgiLHBvc2l0aW9uOiJhYnNvbHV0ZSIsb3BhY2l0eToiMC4wMDEiLHpJbmRleDoxRTN9KS5jc3MoZCh0aGlzKS5vZmZzZXQoKSkuYXBwZW5kVG8oImJvZHkiKX0pfSxzdG9wOmZ1bmN0aW9uKCl7ZCgiZGl2LnVpLWRyYWdnYWJsZS1pZnJhbWVGaXgiKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpfSl9fSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJvcGFjaXR5Iix7c3RhcnQ6ZnVuY3Rpb24oYSxiKXthPWQoYi5oZWxwZXIpO2I9ZCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zOwppZihhLmNzcygib3BhY2l0eSIpKWIuX29wYWNpdHk9YS5jc3MoIm9wYWNpdHkiKTthLmNzcygib3BhY2l0eSIsYi5vcGFjaXR5KX0sc3RvcDpmdW5jdGlvbihhLGIpe2E9ZCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2EuX29wYWNpdHkmJmQoYi5oZWxwZXIpLmNzcygib3BhY2l0eSIsYS5fb3BhY2l0eSl9fSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzY3JvbGwiLHtzdGFydDpmdW5jdGlvbigpe3ZhciBhPWQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIik7aWYoYS5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZhLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCIpYS5vdmVyZmxvd09mZnNldD1hLnNjcm9sbFBhcmVudC5vZmZzZXQoKX0sZHJhZzpmdW5jdGlvbihhKXt2YXIgYj1kKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGM9Yi5vcHRpb25zLGY9ZmFsc2U7aWYoYi5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZiLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0KIkhUTUwiKXtpZighYy5heGlzfHxjLmF4aXMhPSJ4IilpZihiLm92ZXJmbG93T2Zmc2V0LnRvcCtiLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtYS5wYWdlWTxjLnNjcm9sbFNlbnNpdGl2aXR5KWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtjLnNjcm9sbFNwZWVkO2Vsc2UgaWYoYS5wYWdlWS1iLm92ZXJmbG93T2Zmc2V0LnRvcDxjLnNjcm9sbFNlbnNpdGl2aXR5KWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1jLnNjcm9sbFNwZWVkO2lmKCFjLmF4aXN8fGMuYXhpcyE9InkiKWlmKGIub3ZlcmZsb3dPZmZzZXQubGVmdCtiLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aC1hLnBhZ2VYPGMuc2Nyb2xsU2Vuc2l0aXZpdHkpYi5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1mPWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQrYy5zY3JvbGxTcGVlZDtlbHNlIGlmKGEucGFnZVgtCmIub3ZlcmZsb3dPZmZzZXQubGVmdDxjLnNjcm9sbFNlbnNpdGl2aXR5KWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1iLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LWMuc2Nyb2xsU3BlZWR9ZWxzZXtpZighYy5heGlzfHxjLmF4aXMhPSJ4IilpZihhLnBhZ2VZLWQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHkpZj1kKGRvY3VtZW50KS5zY3JvbGxUb3AoZChkb2N1bWVudCkuc2Nyb2xsVG9wKCktYy5zY3JvbGxTcGVlZCk7ZWxzZSBpZihkKHdpbmRvdykuaGVpZ2h0KCktKGEucGFnZVktZChkb2N1bWVudCkuc2Nyb2xsVG9wKCkpPGMuc2Nyb2xsU2Vuc2l0aXZpdHkpZj1kKGRvY3VtZW50KS5zY3JvbGxUb3AoZChkb2N1bWVudCkuc2Nyb2xsVG9wKCkrYy5zY3JvbGxTcGVlZCk7aWYoIWMuYXhpc3x8Yy5heGlzIT0ieSIpaWYoYS5wYWdlWC1kKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCk8Yy5zY3JvbGxTZW5zaXRpdml0eSlmPWQoZG9jdW1lbnQpLnNjcm9sbExlZnQoZChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpLQpjLnNjcm9sbFNwZWVkKTtlbHNlIGlmKGQod2luZG93KS53aWR0aCgpLShhLnBhZ2VYLWQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSk8Yy5zY3JvbGxTZW5zaXRpdml0eSlmPWQoZG9jdW1lbnQpLnNjcm9sbExlZnQoZChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpK2Muc2Nyb2xsU3BlZWQpfWYhPT1mYWxzZSYmZC51aS5kZG1hbmFnZXImJiFjLmRyb3BCZWhhdmlvdXImJmQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGIsYSl9fSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzbmFwIix7c3RhcnQ6ZnVuY3Rpb24oKXt2YXIgYT1kKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGI9YS5vcHRpb25zO2Euc25hcEVsZW1lbnRzPVtdO2QoYi5zbmFwLmNvbnN0cnVjdG9yIT1TdHJpbmc/Yi5zbmFwLml0ZW1zfHwiOmRhdGEoZHJhZ2dhYmxlKSI6Yi5zbmFwKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9ZCh0aGlzKSxmPWMub2Zmc2V0KCk7dGhpcyE9YS5lbGVtZW50WzBdJiZhLnNuYXBFbGVtZW50cy5wdXNoKHtpdGVtOnRoaXMsCndpZHRoOmMub3V0ZXJXaWR0aCgpLGhlaWdodDpjLm91dGVySGVpZ2h0KCksdG9wOmYudG9wLGxlZnQ6Zi5sZWZ0fSl9KX0sZHJhZzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1kKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGY9Yy5vcHRpb25zLGU9Zi5zbmFwVG9sZXJhbmNlLGc9Yi5vZmZzZXQubGVmdCxuPWcrYy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxtPWIub2Zmc2V0LnRvcCxvPW0rYy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsaD1jLnNuYXBFbGVtZW50cy5sZW5ndGgtMTtoPj0wO2gtLSl7dmFyIGk9Yy5zbmFwRWxlbWVudHNbaF0ubGVmdCxrPWkrYy5zbmFwRWxlbWVudHNbaF0ud2lkdGgsaj1jLnNuYXBFbGVtZW50c1toXS50b3AsbD1qK2Muc25hcEVsZW1lbnRzW2hdLmhlaWdodDtpZihpLWU8ZyYmZzxrK2UmJmotZTxtJiZtPGwrZXx8aS1lPGcmJmc8aytlJiZqLWU8byYmbzxsK2V8fGktZTxuJiZuPGsrZSYmai1lPG0mJm08bCtlfHxpLWU8biYmbjxrK2UmJmotZTxvJiYKbzxsK2Upe2lmKGYuc25hcE1vZGUhPSJpbm5lciIpe3ZhciBwPU1hdGguYWJzKGotbyk8PWUscT1NYXRoLmFicyhsLW0pPD1lLHI9TWF0aC5hYnMoaS1uKTw9ZSxzPU1hdGguYWJzKGstZyk8PWU7aWYocCliLnBvc2l0aW9uLnRvcD1jLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6ai1jLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3AtYy5tYXJnaW5zLnRvcDtpZihxKWIucG9zaXRpb24udG9wPWMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpsLGxlZnQ6MH0pLnRvcC1jLm1hcmdpbnMudG9wO2lmKHIpYi5wb3NpdGlvbi5sZWZ0PWMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6aS1jLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdC1jLm1hcmdpbnMubGVmdDtpZihzKWIucG9zaXRpb24ubGVmdD1jLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omt9KS5sZWZ0LWMubWFyZ2lucy5sZWZ0fXZhciB0PQpwfHxxfHxyfHxzO2lmKGYuc25hcE1vZGUhPSJvdXRlciIpe3A9TWF0aC5hYnMoai1tKTw9ZTtxPU1hdGguYWJzKGwtbyk8PWU7cj1NYXRoLmFicyhpLWcpPD1lO3M9TWF0aC5hYnMoay1uKTw9ZTtpZihwKWIucG9zaXRpb24udG9wPWMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpqLGxlZnQ6MH0pLnRvcC1jLm1hcmdpbnMudG9wO2lmKHEpYi5wb3NpdGlvbi50b3A9Yy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOmwtYy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsbGVmdDowfSkudG9wLWMubWFyZ2lucy50b3A7aWYociliLnBvc2l0aW9uLmxlZnQ9Yy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDppfSkubGVmdC1jLm1hcmdpbnMubGVmdDtpZihzKWIucG9zaXRpb24ubGVmdD1jLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0OmstYy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aH0pLmxlZnQtYy5tYXJnaW5zLmxlZnR9aWYoIWMuc25hcEVsZW1lbnRzW2hdLnNuYXBwaW5nJiYKKHB8fHF8fHJ8fHN8fHQpKWMub3B0aW9ucy5zbmFwLnNuYXAmJmMub3B0aW9ucy5zbmFwLnNuYXAuY2FsbChjLmVsZW1lbnQsYSxkLmV4dGVuZChjLl91aUhhc2goKSx7c25hcEl0ZW06Yy5zbmFwRWxlbWVudHNbaF0uaXRlbX0pKTtjLnNuYXBFbGVtZW50c1toXS5zbmFwcGluZz1wfHxxfHxyfHxzfHx0fWVsc2V7Yy5zbmFwRWxlbWVudHNbaF0uc25hcHBpbmcmJmMub3B0aW9ucy5zbmFwLnJlbGVhc2UmJmMub3B0aW9ucy5zbmFwLnJlbGVhc2UuY2FsbChjLmVsZW1lbnQsYSxkLmV4dGVuZChjLl91aUhhc2goKSx7c25hcEl0ZW06Yy5zbmFwRWxlbWVudHNbaF0uaXRlbX0pKTtjLnNuYXBFbGVtZW50c1toXS5zbmFwcGluZz1mYWxzZX19fX0pO2QudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic3RhY2siLHtzdGFydDpmdW5jdGlvbigpe3ZhciBhPWQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9uczthPWQubWFrZUFycmF5KGQoYS5zdGFjaykpLnNvcnQoZnVuY3Rpb24oYyxmKXtyZXR1cm4ocGFyc2VJbnQoZChjKS5jc3MoInpJbmRleCIpLAoxMCl8fDApLShwYXJzZUludChkKGYpLmNzcygiekluZGV4IiksMTApfHwwKX0pO2lmKGEubGVuZ3RoKXt2YXIgYj1wYXJzZUludChhWzBdLnN0eWxlLnpJbmRleCl8fDA7ZChhKS5lYWNoKGZ1bmN0aW9uKGMpe3RoaXMuc3R5bGUuekluZGV4PWIrY30pO3RoaXNbMF0uc3R5bGUuekluZGV4PWIrYS5sZW5ndGh9fX0pO2QudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24oYSxiKXthPWQoYi5oZWxwZXIpO2I9ZCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2lmKGEuY3NzKCJ6SW5kZXgiKSliLl96SW5kZXg9YS5jc3MoInpJbmRleCIpO2EuY3NzKCJ6SW5kZXgiLGIuekluZGV4KX0sc3RvcDpmdW5jdGlvbihhLGIpe2E9ZCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2EuX3pJbmRleCYmZChiLmhlbHBlcikuY3NzKCJ6SW5kZXgiLGEuX3pJbmRleCl9fSl9KShqUXVlcnkpOwo7LyoKICogalF1ZXJ5IFVJIERyb3BwYWJsZSAxLjguNQogKgogKiBDb3B5cmlnaHQgMjAxMCwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRHJvcHBhYmxlcwogKgogKiBEZXBlbmRzOgogKglqcXVlcnkudWkuY29yZS5qcwogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqCWpxdWVyeS51aS5tb3VzZS5qcwogKglqcXVlcnkudWkuZHJhZ2dhYmxlLmpzCiAqLwooZnVuY3Rpb24oZCl7ZC53aWRnZXQoInVpLmRyb3BwYWJsZSIse3dpZGdldEV2ZW50UHJlZml4OiJkcm9wIixvcHRpb25zOnthY2NlcHQ6IioiLGFjdGl2ZUNsYXNzOmZhbHNlLGFkZENsYXNzZXM6dHJ1ZSxncmVlZHk6ZmFsc2UsaG92ZXJDbGFzczpmYWxzZSxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QifSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLGI9YS5hY2NlcHQ7dGhpcy5pc292ZXI9MDt0aGlzLmlzb3V0PTE7dGhpcy5hY2NlcHQ9ZC5pc0Z1bmN0aW9uKGIpP2I6ZnVuY3Rpb24oYyl7cmV0dXJuIGMuaXMoYil9O3RoaXMucHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLm9mZnNldEhlaWdodH07ZC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1thLnNjb3BlXT1kLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Euc2NvcGVdfHxbXTtkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Euc2NvcGVdLnB1c2godGhpcyk7CmEuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcm9wcGFibGUiKX0sZGVzdHJveTpmdW5jdGlvbigpe2Zvcih2YXIgYT1kLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3RoaXMub3B0aW9ucy5zY29wZV0sYj0wO2I8YS5sZW5ndGg7YisrKWFbYl09PXRoaXMmJmEuc3BsaWNlKGIsMSk7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFibGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIikucmVtb3ZlRGF0YSgiZHJvcHBhYmxlIikudW5iaW5kKCIuZHJvcHBhYmxlIik7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXtpZihhPT0iYWNjZXB0Iil0aGlzLmFjY2VwdD1kLmlzRnVuY3Rpb24oYik/YjpmdW5jdGlvbihjKXtyZXR1cm4gYy5pcyhiKX07ZC5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfYWN0aXZhdGU6ZnVuY3Rpb24oYSl7dmFyIGI9ZC51aS5kZG1hbmFnZXIuY3VycmVudDt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJgp0aGlzLmVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKTtiJiZ0aGlzLl90cmlnZ2VyKCJhY3RpdmF0ZSIsYSx0aGlzLnVpKGIpKX0sX2RlYWN0aXZhdGU6ZnVuY3Rpb24oYSl7dmFyIGI9ZC51aS5kZG1hbmFnZXIuY3VycmVudDt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpO2ImJnRoaXMuX3RyaWdnZXIoImRlYWN0aXZhdGUiLGEsdGhpcy51aShiKSl9LF9vdmVyOmZ1bmN0aW9uKGEpe3ZhciBiPWQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYoISghYnx8KGIuY3VycmVudEl0ZW18fGIuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSkpaWYodGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSl7dGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyk7CnRoaXMuX3RyaWdnZXIoIm92ZXIiLGEsdGhpcy51aShiKSl9fSxfb3V0OmZ1bmN0aW9uKGEpe3ZhciBiPWQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYoISghYnx8KGIuY3VycmVudEl0ZW18fGIuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSkpaWYodGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSl7dGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyk7dGhpcy5fdHJpZ2dlcigib3V0IixhLHRoaXMudWkoYikpfX0sX2Ryb3A6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxkLnVpLmRkbWFuYWdlci5jdXJyZW50O2lmKCFjfHwoYy5jdXJyZW50SXRlbXx8Yy5lbGVtZW50KVswXT09dGhpcy5lbGVtZW50WzBdKXJldHVybiBmYWxzZTt2YXIgZT1mYWxzZTt0aGlzLmVsZW1lbnQuZmluZCgiOmRhdGEoZHJvcHBhYmxlKSIpLm5vdCgiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZz0KZC5kYXRhKHRoaXMsImRyb3BwYWJsZSIpO2lmKGcub3B0aW9ucy5ncmVlZHkmJiFnLm9wdGlvbnMuZGlzYWJsZWQmJmcub3B0aW9ucy5zY29wZT09Yy5vcHRpb25zLnNjb3BlJiZnLmFjY2VwdC5jYWxsKGcuZWxlbWVudFswXSxjLmN1cnJlbnRJdGVtfHxjLmVsZW1lbnQpJiZkLnVpLmludGVyc2VjdChjLGQuZXh0ZW5kKGcse29mZnNldDpnLmVsZW1lbnQub2Zmc2V0KCl9KSxnLm9wdGlvbnMudG9sZXJhbmNlKSl7ZT10cnVlO3JldHVybiBmYWxzZX19KTtpZihlKXJldHVybiBmYWxzZTtpZih0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxjLmN1cnJlbnRJdGVtfHxjLmVsZW1lbnQpKXt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpO3RoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpO3RoaXMuX3RyaWdnZXIoImRyb3AiLAphLHRoaXMudWkoYykpO3JldHVybiB0aGlzLmVsZW1lbnR9cmV0dXJuIGZhbHNlfSx1aTpmdW5jdGlvbihhKXtyZXR1cm57ZHJhZ2dhYmxlOmEuY3VycmVudEl0ZW18fGEuZWxlbWVudCxoZWxwZXI6YS5oZWxwZXIscG9zaXRpb246YS5wb3NpdGlvbixvZmZzZXQ6YS5wb3NpdGlvbkFic319fSk7ZC5leHRlbmQoZC51aS5kcm9wcGFibGUse3ZlcnNpb246IjEuOC41In0pO2QudWkuaW50ZXJzZWN0PWZ1bmN0aW9uKGEsYixjKXtpZighYi5vZmZzZXQpcmV0dXJuIGZhbHNlO3ZhciBlPShhLnBvc2l0aW9uQWJzfHxhLnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0LGc9ZSthLmhlbHBlclByb3BvcnRpb25zLndpZHRoLGY9KGEucG9zaXRpb25BYnN8fGEucG9zaXRpb24uYWJzb2x1dGUpLnRvcCxoPWYrYS5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsaT1iLm9mZnNldC5sZWZ0LGs9aStiLnByb3BvcnRpb25zLndpZHRoLGo9Yi5vZmZzZXQudG9wLGw9aitiLnByb3BvcnRpb25zLmhlaWdodDsKc3dpdGNoKGMpe2Nhc2UgImZpdCI6cmV0dXJuIGk8PWUmJmc8PWsmJmo8PWYmJmg8PWw7Y2FzZSAiaW50ZXJzZWN0IjpyZXR1cm4gaTxlK2EuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmZy1hLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI8ayYmajxmK2EuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzImJmgtYS5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMjxsO2Nhc2UgInBvaW50ZXIiOnJldHVybiBkLnVpLmlzT3ZlcigoYS5wb3NpdGlvbkFic3x8YS5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wKyhhLmNsaWNrT2Zmc2V0fHxhLm9mZnNldC5jbGljaykudG9wLChhLnBvc2l0aW9uQWJzfHxhLnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0KyhhLmNsaWNrT2Zmc2V0fHxhLm9mZnNldC5jbGljaykubGVmdCxqLGksYi5wcm9wb3J0aW9ucy5oZWlnaHQsYi5wcm9wb3J0aW9ucy53aWR0aCk7Y2FzZSAidG91Y2giOnJldHVybihmPj1qJiZmPD1sfHxoPj1qJiZoPD1sfHxmPGomJmg+bCkmJihlPj0KaSYmZTw9a3x8Zz49aSYmZzw9a3x8ZTxpJiZnPmspO2RlZmF1bHQ6cmV0dXJuIGZhbHNlfX07ZC51aS5kZG1hbmFnZXI9e2N1cnJlbnQ6bnVsbCxkcm9wcGFibGVzOnsiZGVmYXVsdCI6W119LHByZXBhcmVPZmZzZXRzOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1thLm9wdGlvbnMuc2NvcGVdfHxbXSxlPWI/Yi50eXBlOm51bGwsZz0oYS5jdXJyZW50SXRlbXx8YS5lbGVtZW50KS5maW5kKCI6ZGF0YShkcm9wcGFibGUpIikuYW5kU2VsZigpLGY9MDthOmZvcig7ZjxjLmxlbmd0aDtmKyspaWYoIShjW2ZdLm9wdGlvbnMuZGlzYWJsZWR8fGEmJiFjW2ZdLmFjY2VwdC5jYWxsKGNbZl0uZWxlbWVudFswXSxhLmN1cnJlbnRJdGVtfHxhLmVsZW1lbnQpKSl7Zm9yKHZhciBoPTA7aDxnLmxlbmd0aDtoKyspaWYoZ1toXT09Y1tmXS5lbGVtZW50WzBdKXtjW2ZdLnByb3BvcnRpb25zLmhlaWdodD0wO2NvbnRpbnVlIGF9Y1tmXS52aXNpYmxlPWNbZl0uZWxlbWVudC5jc3MoImRpc3BsYXkiKSE9CiJub25lIjtpZihjW2ZdLnZpc2libGUpe2NbZl0ub2Zmc2V0PWNbZl0uZWxlbWVudC5vZmZzZXQoKTtjW2ZdLnByb3BvcnRpb25zPXt3aWR0aDpjW2ZdLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0OmNbZl0uZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9O2U9PSJtb3VzZWRvd24iJiZjW2ZdLl9hY3RpdmF0ZS5jYWxsKGNbZl0sYil9fX0sZHJvcDpmdW5jdGlvbihhLGIpe3ZhciBjPWZhbHNlO2QuZWFjaChkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Eub3B0aW9ucy5zY29wZV18fFtdLGZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zKXtpZighdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJmQudWkuaW50ZXJzZWN0KGEsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlKSljPWN8fHRoaXMuX2Ryb3AuY2FsbCh0aGlzLGIpO2lmKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYS5jdXJyZW50SXRlbXx8CmEuZWxlbWVudCkpe3RoaXMuaXNvdXQ9MTt0aGlzLmlzb3Zlcj0wO3RoaXMuX2RlYWN0aXZhdGUuY2FsbCh0aGlzLGIpfX19KTtyZXR1cm4gY30sZHJhZzpmdW5jdGlvbihhLGIpe2Eub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zJiZkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhhLGIpO2QuZWFjaChkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Eub3B0aW9ucy5zY29wZV18fFtdLGZ1bmN0aW9uKCl7aWYoISh0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMuZ3JlZWR5Q2hpbGR8fCF0aGlzLnZpc2libGUpKXt2YXIgYz1kLnVpLmludGVyc2VjdChhLHRoaXMsdGhpcy5vcHRpb25zLnRvbGVyYW5jZSk7aWYoYz0hYyYmdGhpcy5pc292ZXI9PTE/Imlzb3V0IjpjJiZ0aGlzLmlzb3Zlcj09MD8iaXNvdmVyIjpudWxsKXt2YXIgZTtpZih0aGlzLm9wdGlvbnMuZ3JlZWR5KXt2YXIgZz10aGlzLmVsZW1lbnQucGFyZW50cygiOmRhdGEoZHJvcHBhYmxlKTplcSgwKSIpO2lmKGcubGVuZ3RoKXtlPQpkLmRhdGEoZ1swXSwiZHJvcHBhYmxlIik7ZS5ncmVlZHlDaGlsZD1jPT0iaXNvdmVyIj8xOjB9fWlmKGUmJmM9PSJpc292ZXIiKXtlLmlzb3Zlcj0wO2UuaXNvdXQ9MTtlLl9vdXQuY2FsbChlLGIpfXRoaXNbY109MTt0aGlzW2M9PSJpc291dCI/Imlzb3ZlciI6Imlzb3V0Il09MDt0aGlzW2M9PSJpc292ZXIiPyJfb3ZlciI6Il9vdXQiXS5jYWxsKHRoaXMsYik7aWYoZSYmYz09Imlzb3V0Iil7ZS5pc291dD0wO2UuaXNvdmVyPTE7ZS5fb3Zlci5jYWxsKGUsYil9fX19KX19fSkoalF1ZXJ5KTsKOy8qCiAqIGpRdWVyeSBVSSBSZXNpemFibGUgMS44LjUKICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1Jlc2l6YWJsZXMKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LnVpLmNvcmUuanMKICoJanF1ZXJ5LnVpLm1vdXNlLmpzCiAqCWpxdWVyeS51aS53aWRnZXQuanMKICovCihmdW5jdGlvbihlKXtlLndpZGdldCgidWkucmVzaXphYmxlIixlLnVpLm1vdXNlLHt3aWRnZXRFdmVudFByZWZpeDoicmVzaXplIixvcHRpb25zOnthbHNvUmVzaXplOmZhbHNlLGFuaW1hdGU6ZmFsc2UsYW5pbWF0ZUR1cmF0aW9uOiJzbG93IixhbmltYXRlRWFzaW5nOiJzd2luZyIsYXNwZWN0UmF0aW86ZmFsc2UsYXV0b0hpZGU6ZmFsc2UsY29udGFpbm1lbnQ6ZmFsc2UsZ2hvc3Q6ZmFsc2UsZ3JpZDpmYWxzZSxoYW5kbGVzOiJlLHMsc2UiLGhlbHBlcjpmYWxzZSxtYXhIZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1pbkhlaWdodDoxMCxtaW5XaWR0aDoxMCx6SW5kZXg6MUUzfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxhPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZSIpO2UuZXh0ZW5kKHRoaXMse19hc3BlY3RSYXRpbzohIWEuYXNwZWN0UmF0aW8sYXNwZWN0UmF0aW86YS5hc3BlY3RSYXRpbyxvcmlnaW5hbEVsZW1lbnQ6dGhpcy5lbGVtZW50LApfcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50czpbXSxfaGVscGVyOmEuaGVscGVyfHxhLmdob3N0fHxhLmFuaW1hdGU/YS5oZWxwZXJ8fCJ1aS1yZXNpemFibGUtaGVscGVyIjpudWxsfSk7aWYodGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9jYW52YXN8dGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbnxpbWcvaSkpey9yZWxhdGl2ZS8udGVzdCh0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKSYmZS5icm93c2VyLm9wZXJhJiZ0aGlzLmVsZW1lbnQuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLHRvcDoiYXV0byIsbGVmdDoiYXV0byJ9KTt0aGlzLmVsZW1lbnQud3JhcChlKCc8ZGl2IGNsYXNzPSJ1aS13cmFwcGVyIiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbjsiPjwvZGl2PicpLmNzcyh7cG9zaXRpb246dGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSx3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSwKdG9wOnRoaXMuZWxlbWVudC5jc3MoInRvcCIpLGxlZnQ6dGhpcy5lbGVtZW50LmNzcygibGVmdCIpfSkpO3RoaXMuZWxlbWVudD10aGlzLmVsZW1lbnQucGFyZW50KCkuZGF0YSgicmVzaXphYmxlIix0aGlzLmVsZW1lbnQuZGF0YSgicmVzaXphYmxlIikpO3RoaXMuZWxlbWVudElzV3JhcHBlcj10cnVlO3RoaXMuZWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksbWFyZ2luVG9wOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luVG9wIiksbWFyZ2luUmlnaHQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5SaWdodCIpLG1hcmdpbkJvdHRvbTp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpfSk7dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHttYXJnaW5MZWZ0OjAsbWFyZ2luVG9wOjAsbWFyZ2luUmlnaHQ6MCxtYXJnaW5Cb3R0b206MH0pO3RoaXMub3JpZ2luYWxSZXNpemVTdHlsZT0KdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiKTt0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsIm5vbmUiKTt0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLnB1c2godGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjoic3RhdGljIix6b29tOjEsZGlzcGxheToiYmxvY2sifSkpO3RoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7bWFyZ2luOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luIil9KTt0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpfXRoaXMuaGFuZGxlcz1hLmhhbmRsZXN8fCghZSgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiLHRoaXMuZWxlbWVudCkubGVuZ3RoPyJlLHMsc2UiOntuOiIudWktcmVzaXphYmxlLW4iLGU6Ii51aS1yZXNpemFibGUtZSIsczoiLnVpLXJlc2l6YWJsZS1zIix3OiIudWktcmVzaXphYmxlLXciLHNlOiIudWktcmVzaXphYmxlLXNlIixzdzoiLnVpLXJlc2l6YWJsZS1zdyIsbmU6Ii51aS1yZXNpemFibGUtbmUiLApudzoiLnVpLXJlc2l6YWJsZS1udyJ9KTtpZih0aGlzLmhhbmRsZXMuY29uc3RydWN0b3I9PVN0cmluZyl7aWYodGhpcy5oYW5kbGVzPT0iYWxsIil0aGlzLmhhbmRsZXM9Im4sZSxzLHcsc2Usc3csbmUsbnciO3ZhciBjPXRoaXMuaGFuZGxlcy5zcGxpdCgiLCIpO3RoaXMuaGFuZGxlcz17fTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGY9ZS50cmltKGNbZF0pLGc9ZSgnPGRpdiBjbGFzcz0idWktcmVzaXphYmxlLWhhbmRsZSAnKygidWktcmVzaXphYmxlLSIrZikrJyI+PC9kaXY+Jyk7L3N3fHNlfG5lfG53Ly50ZXN0KGYpJiZnLmNzcyh7ekluZGV4OisrYS56SW5kZXh9KTsic2UiPT1mJiZnLmFkZENsYXNzKCJ1aS1pY29uIHVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNlIik7dGhpcy5oYW5kbGVzW2ZdPSIudWktcmVzaXphYmxlLSIrZjt0aGlzLmVsZW1lbnQuYXBwZW5kKGcpfX10aGlzLl9yZW5kZXJBeGlzPWZ1bmN0aW9uKGgpe2g9aHx8dGhpcy5lbGVtZW50O2Zvcih2YXIgaSBpbiB0aGlzLmhhbmRsZXMpe2lmKHRoaXMuaGFuZGxlc1tpXS5jb25zdHJ1Y3Rvcj09ClN0cmluZyl0aGlzLmhhbmRsZXNbaV09ZSh0aGlzLmhhbmRsZXNbaV0sdGhpcy5lbGVtZW50KS5zaG93KCk7aWYodGhpcy5lbGVtZW50SXNXcmFwcGVyJiZ0aGlzLm9yaWdpbmFsRWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvdGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbi9pKSl7dmFyIGo9ZSh0aGlzLmhhbmRsZXNbaV0sdGhpcy5lbGVtZW50KSxrPTA7az0vc3d8bmV8bnd8c2V8bnxzLy50ZXN0KGkpP2oub3V0ZXJIZWlnaHQoKTpqLm91dGVyV2lkdGgoKTtqPVsicGFkZGluZyIsL25lfG53fG4vLnRlc3QoaSk/IlRvcCI6L3NlfHN3fHMvLnRlc3QoaSk/IkJvdHRvbSI6L15lJC8udGVzdChpKT8iUmlnaHQiOiJMZWZ0Il0uam9pbigiIik7aC5jc3MoaixrKTt0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpfWUodGhpcy5oYW5kbGVzW2ldKX19O3RoaXMuX3JlbmRlckF4aXModGhpcy5lbGVtZW50KTt0aGlzLl9oYW5kbGVzPWUoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmRpc2FibGVTZWxlY3Rpb24oKTsKdGhpcy5faGFuZGxlcy5tb3VzZW92ZXIoZnVuY3Rpb24oKXtpZighYi5yZXNpemluZyl7aWYodGhpcy5jbGFzc05hbWUpdmFyIGg9dGhpcy5jbGFzc05hbWUubWF0Y2goL3VpLXJlc2l6YWJsZS0oc2V8c3d8bmV8bnd8bnxlfHN8dykvaSk7Yi5heGlzPWgmJmhbMV0/aFsxXToic2UifX0pO2lmKGEuYXV0b0hpZGUpe3RoaXMuX2hhbmRsZXMuaGlkZSgpO2UodGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIikuaG92ZXIoZnVuY3Rpb24oKXtlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKTtiLl9oYW5kbGVzLnNob3coKX0sZnVuY3Rpb24oKXtpZighYi5yZXNpemluZyl7ZSh0aGlzKS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIik7Yi5faGFuZGxlcy5oaWRlKCl9fSl9dGhpcy5fbW91c2VJbml0KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9tb3VzZURlc3Ryb3koKTt2YXIgYj1mdW5jdGlvbihjKXtlKGMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUgdWktcmVzaXphYmxlLWRpc2FibGVkIHVpLXJlc2l6YWJsZS1yZXNpemluZyIpLnJlbW92ZURhdGEoInJlc2l6YWJsZSIpLnVuYmluZCgiLnJlc2l6YWJsZSIpLmZpbmQoIi51aS1yZXNpemFibGUtaGFuZGxlIikucmVtb3ZlKCl9OwppZih0aGlzLmVsZW1lbnRJc1dyYXBwZXIpe2IodGhpcy5lbGVtZW50KTt2YXIgYT10aGlzLmVsZW1lbnQ7YS5hZnRlcih0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOmEuY3NzKCJwb3NpdGlvbiIpLHdpZHRoOmEub3V0ZXJXaWR0aCgpLGhlaWdodDphLm91dGVySGVpZ2h0KCksdG9wOmEuY3NzKCJ0b3AiKSxsZWZ0OmEuY3NzKCJsZWZ0Iil9KSkucmVtb3ZlKCl9dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZSk7Yih0aGlzLm9yaWdpbmFsRWxlbWVudCk7cmV0dXJuIHRoaXN9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oYil7dmFyIGE9ZmFsc2U7Zm9yKHZhciBjIGluIHRoaXMuaGFuZGxlcylpZihlKHRoaXMuaGFuZGxlc1tjXSlbMF09PWIudGFyZ2V0KWE9dHJ1ZTtyZXR1cm4hdGhpcy5vcHRpb25zLmRpc2FibGVkJiZhfSxfbW91c2VTdGFydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLm9wdGlvbnMsYz10aGlzLmVsZW1lbnQucG9zaXRpb24oKSwKZD10aGlzLmVsZW1lbnQ7dGhpcy5yZXNpemluZz10cnVlO3RoaXMuZG9jdW1lbnRTY3JvbGw9e3RvcDplKGRvY3VtZW50KS5zY3JvbGxUb3AoKSxsZWZ0OmUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKX07aWYoZC5pcygiLnVpLWRyYWdnYWJsZSIpfHwvYWJzb2x1dGUvLnRlc3QoZC5jc3MoInBvc2l0aW9uIikpKWQuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDpjLnRvcCxsZWZ0OmMubGVmdH0pO2UuYnJvd3Nlci5vcGVyYSYmL3JlbGF0aXZlLy50ZXN0KGQuY3NzKCJwb3NpdGlvbiIpKSYmZC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsdG9wOiJhdXRvIixsZWZ0OiJhdXRvIn0pO3RoaXMuX3JlbmRlclByb3h5KCk7Yz1tKHRoaXMuaGVscGVyLmNzcygibGVmdCIpKTt2YXIgZj1tKHRoaXMuaGVscGVyLmNzcygidG9wIikpO2lmKGEuY29udGFpbm1lbnQpe2MrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpfHwwO2YrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsVG9wKCl8fDB9dGhpcy5vZmZzZXQ9CnRoaXMuaGVscGVyLm9mZnNldCgpO3RoaXMucG9zaXRpb249e2xlZnQ6Yyx0b3A6Zn07dGhpcy5zaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6ZC5vdXRlcldpZHRoKCksaGVpZ2h0OmQub3V0ZXJIZWlnaHQoKX06e3dpZHRoOmQud2lkdGgoKSxoZWlnaHQ6ZC5oZWlnaHQoKX07dGhpcy5vcmlnaW5hbFNpemU9dGhpcy5faGVscGVyP3t3aWR0aDpkLm91dGVyV2lkdGgoKSxoZWlnaHQ6ZC5vdXRlckhlaWdodCgpfTp7d2lkdGg6ZC53aWR0aCgpLGhlaWdodDpkLmhlaWdodCgpfTt0aGlzLm9yaWdpbmFsUG9zaXRpb249e2xlZnQ6Yyx0b3A6Zn07dGhpcy5zaXplRGlmZj17d2lkdGg6ZC5vdXRlcldpZHRoKCktZC53aWR0aCgpLGhlaWdodDpkLm91dGVySGVpZ2h0KCktZC5oZWlnaHQoKX07dGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb249e2xlZnQ6Yi5wYWdlWCx0b3A6Yi5wYWdlWX07dGhpcy5hc3BlY3RSYXRpbz10eXBlb2YgYS5hc3BlY3RSYXRpbz09Im51bWJlciI/YS5hc3BlY3RSYXRpbzoKdGhpcy5vcmlnaW5hbFNpemUud2lkdGgvdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0fHwxO2E9ZSgiLnVpLXJlc2l6YWJsZS0iK3RoaXMuYXhpcykuY3NzKCJjdXJzb3IiKTtlKCJib2R5IikuY3NzKCJjdXJzb3IiLGE9PSJhdXRvIj90aGlzLmF4aXMrIi1yZXNpemUiOmEpO2QuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1yZXNpemluZyIpO3RoaXMuX3Byb3BhZ2F0ZSgic3RhcnQiLGIpO3JldHVybiB0cnVlfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuaGVscGVyLGM9dGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb24sZD10aGlzLl9jaGFuZ2VbdGhpcy5heGlzXTtpZighZClyZXR1cm4gZmFsc2U7Yz1kLmFwcGx5KHRoaXMsW2IsYi5wYWdlWC1jLmxlZnR8fDAsYi5wYWdlWS1jLnRvcHx8MF0pO2lmKHRoaXMuX2FzcGVjdFJhdGlvfHxiLnNoaWZ0S2V5KWM9dGhpcy5fdXBkYXRlUmF0aW8oYyxiKTtjPXRoaXMuX3Jlc3BlY3RTaXplKGMsYik7dGhpcy5fcHJvcGFnYXRlKCJyZXNpemUiLApiKTthLmNzcyh7dG9wOnRoaXMucG9zaXRpb24udG9wKyJweCIsbGVmdDp0aGlzLnBvc2l0aW9uLmxlZnQrInB4Iix3aWR0aDp0aGlzLnNpemUud2lkdGgrInB4IixoZWlnaHQ6dGhpcy5zaXplLmhlaWdodCsicHgifSk7IXRoaXMuX2hlbHBlciYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGgmJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCk7dGhpcy5fdXBkYXRlQ2FjaGUoYyk7dGhpcy5fdHJpZ2dlcigicmVzaXplIixiLHRoaXMudWkoKSk7cmV0dXJuIGZhbHNlfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGIpe3RoaXMucmVzaXppbmc9ZmFsc2U7dmFyIGE9dGhpcy5vcHRpb25zLGM9dGhpcztpZih0aGlzLl9oZWxwZXIpe3ZhciBkPXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMsZj1kLmxlbmd0aCYmL3RleHRhcmVhL2kudGVzdChkWzBdLm5vZGVOYW1lKTtkPWYmJmUudWkuaGFzU2Nyb2xsKGRbMF0sImxlZnQiKT8wOmMuc2l6ZURpZmYuaGVpZ2h0OwpmPXt3aWR0aDpjLnNpemUud2lkdGgtKGY/MDpjLnNpemVEaWZmLndpZHRoKSxoZWlnaHQ6Yy5zaXplLmhlaWdodC1kfTtkPXBhcnNlSW50KGMuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGMucG9zaXRpb24ubGVmdC1jLm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGw7dmFyIGc9cGFyc2VJbnQoYy5lbGVtZW50LmNzcygidG9wIiksMTApKyhjLnBvc2l0aW9uLnRvcC1jLm9yaWdpbmFsUG9zaXRpb24udG9wKXx8bnVsbDthLmFuaW1hdGV8fHRoaXMuZWxlbWVudC5jc3MoZS5leHRlbmQoZix7dG9wOmcsbGVmdDpkfSkpO2MuaGVscGVyLmhlaWdodChjLnNpemUuaGVpZ2h0KTtjLmhlbHBlci53aWR0aChjLnNpemUud2lkdGgpO3RoaXMuX2hlbHBlciYmIWEuYW5pbWF0ZSYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKX1lKCJib2R5IikuY3NzKCJjdXJzb3IiLCJhdXRvIik7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKTt0aGlzLl9wcm9wYWdhdGUoInN0b3AiLApiKTt0aGlzLl9oZWxwZXImJnRoaXMuaGVscGVyLnJlbW92ZSgpO3JldHVybiBmYWxzZX0sX3VwZGF0ZUNhY2hlOmZ1bmN0aW9uKGIpe3RoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpO2lmKGwoYi5sZWZ0KSl0aGlzLnBvc2l0aW9uLmxlZnQ9Yi5sZWZ0O2lmKGwoYi50b3ApKXRoaXMucG9zaXRpb24udG9wPWIudG9wO2lmKGwoYi5oZWlnaHQpKXRoaXMuc2l6ZS5oZWlnaHQ9Yi5oZWlnaHQ7aWYobChiLndpZHRoKSl0aGlzLnNpemUud2lkdGg9Yi53aWR0aH0sX3VwZGF0ZVJhdGlvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucG9zaXRpb24sYz10aGlzLnNpemUsZD10aGlzLmF4aXM7aWYoYi5oZWlnaHQpYi53aWR0aD1jLmhlaWdodCp0aGlzLmFzcGVjdFJhdGlvO2Vsc2UgaWYoYi53aWR0aCliLmhlaWdodD1jLndpZHRoL3RoaXMuYXNwZWN0UmF0aW87aWYoZD09InN3Iil7Yi5sZWZ0PWEubGVmdCsoYy53aWR0aC1iLndpZHRoKTtiLnRvcD1udWxsfWlmKGQ9PSJudyIpe2IudG9wPQphLnRvcCsoYy5oZWlnaHQtYi5oZWlnaHQpO2IubGVmdD1hLmxlZnQrKGMud2lkdGgtYi53aWR0aCl9cmV0dXJuIGJ9LF9yZXNwZWN0U2l6ZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLm9wdGlvbnMsYz10aGlzLmF4aXMsZD1sKGIud2lkdGgpJiZhLm1heFdpZHRoJiZhLm1heFdpZHRoPGIud2lkdGgsZj1sKGIuaGVpZ2h0KSYmYS5tYXhIZWlnaHQmJmEubWF4SGVpZ2h0PGIuaGVpZ2h0LGc9bChiLndpZHRoKSYmYS5taW5XaWR0aCYmYS5taW5XaWR0aD5iLndpZHRoLGg9bChiLmhlaWdodCkmJmEubWluSGVpZ2h0JiZhLm1pbkhlaWdodD5iLmhlaWdodDtpZihnKWIud2lkdGg9YS5taW5XaWR0aDtpZihoKWIuaGVpZ2h0PWEubWluSGVpZ2h0O2lmKGQpYi53aWR0aD1hLm1heFdpZHRoO2lmKGYpYi5oZWlnaHQ9YS5tYXhIZWlnaHQ7dmFyIGk9dGhpcy5vcmlnaW5hbFBvc2l0aW9uLmxlZnQrdGhpcy5vcmlnaW5hbFNpemUud2lkdGgsaj10aGlzLnBvc2l0aW9uLnRvcCt0aGlzLnNpemUuaGVpZ2h0LAprPS9zd3xud3x3Ly50ZXN0KGMpO2M9L253fG5lfG4vLnRlc3QoYyk7aWYoZyYmayliLmxlZnQ9aS1hLm1pbldpZHRoO2lmKGQmJmspYi5sZWZ0PWktYS5tYXhXaWR0aDtpZihoJiZjKWIudG9wPWotYS5taW5IZWlnaHQ7aWYoZiYmYyliLnRvcD1qLWEubWF4SGVpZ2h0O2lmKChhPSFiLndpZHRoJiYhYi5oZWlnaHQpJiYhYi5sZWZ0JiZiLnRvcCliLnRvcD1udWxsO2Vsc2UgaWYoYSYmIWIudG9wJiZiLmxlZnQpYi5sZWZ0PW51bGw7cmV0dXJuIGJ9LF9wcm9wb3J0aW9uYWxseVJlc2l6ZTpmdW5jdGlvbigpe2lmKHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKWZvcih2YXIgYj10aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50LGE9MDthPHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1thXTtpZighdGhpcy5ib3JkZXJEaWYpe3ZhciBkPVtjLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwKYy5jc3MoImJvcmRlclJpZ2h0V2lkdGgiKSxjLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSxjLmNzcygiYm9yZGVyTGVmdFdpZHRoIildLGY9W2MuY3NzKCJwYWRkaW5nVG9wIiksYy5jc3MoInBhZGRpbmdSaWdodCIpLGMuY3NzKCJwYWRkaW5nQm90dG9tIiksYy5jc3MoInBhZGRpbmdMZWZ0IildO3RoaXMuYm9yZGVyRGlmPWUubWFwKGQsZnVuY3Rpb24oZyxoKXtnPXBhcnNlSW50KGcsMTApfHwwO2g9cGFyc2VJbnQoZltoXSwxMCl8fDA7cmV0dXJuIGcraH0pfWUuYnJvd3Nlci5tc2llJiYoZShiKS5pcygiOmhpZGRlbiIpfHxlKGIpLnBhcmVudHMoIjpoaWRkZW4iKS5sZW5ndGgpfHxjLmNzcyh7aGVpZ2h0OmIuaGVpZ2h0KCktdGhpcy5ib3JkZXJEaWZbMF0tdGhpcy5ib3JkZXJEaWZbMl18fDAsd2lkdGg6Yi53aWR0aCgpLXRoaXMuYm9yZGVyRGlmWzFdLXRoaXMuYm9yZGVyRGlmWzNdfHwwfSl9fSxfcmVuZGVyUHJveHk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50T2Zmc2V0PQp0aGlzLmVsZW1lbnQub2Zmc2V0KCk7aWYodGhpcy5faGVscGVyKXt0aGlzLmhlbHBlcj10aGlzLmhlbHBlcnx8ZSgnPGRpdiBzdHlsZT0ib3ZlcmZsb3c6aGlkZGVuOyI+PC9kaXY+Jyk7dmFyIGE9ZS5icm93c2VyLm1zaWUmJmUuYnJvd3Nlci52ZXJzaW9uPDcsYz1hPzE6MDthPWE/MjotMTt0aGlzLmhlbHBlci5hZGRDbGFzcyh0aGlzLl9oZWxwZXIpLmNzcyh7d2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSthLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSthLHBvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDp0aGlzLmVsZW1lbnRPZmZzZXQubGVmdC1jKyJweCIsdG9wOnRoaXMuZWxlbWVudE9mZnNldC50b3AtYysicHgiLHpJbmRleDorK2IuekluZGV4fSk7dGhpcy5oZWxwZXIuYXBwZW5kVG8oImJvZHkiKS5kaXNhYmxlU2VsZWN0aW9uKCl9ZWxzZSB0aGlzLmhlbHBlcj10aGlzLmVsZW1lbnR9LF9jaGFuZ2U6e2U6ZnVuY3Rpb24oYixhKXtyZXR1cm57d2lkdGg6dGhpcy5vcmlnaW5hbFNpemUud2lkdGgrCmF9fSx3OmZ1bmN0aW9uKGIsYSl7cmV0dXJue2xlZnQ6dGhpcy5vcmlnaW5hbFBvc2l0aW9uLmxlZnQrYSx3aWR0aDp0aGlzLm9yaWdpbmFsU2l6ZS53aWR0aC1hfX0sbjpmdW5jdGlvbihiLGEsYyl7cmV0dXJue3RvcDp0aGlzLm9yaWdpbmFsUG9zaXRpb24udG9wK2MsaGVpZ2h0OnRoaXMub3JpZ2luYWxTaXplLmhlaWdodC1jfX0sczpmdW5jdGlvbihiLGEsYyl7cmV0dXJue2hlaWdodDp0aGlzLm9yaWdpbmFsU2l6ZS5oZWlnaHQrY319LHNlOmZ1bmN0aW9uKGIsYSxjKXtyZXR1cm4gZS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsW2IsYSxjXSkpfSxzdzpmdW5jdGlvbihiLGEsYyl7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLFtiLGEsY10pKX0sbmU6ZnVuY3Rpb24oYixhLGMpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLAphcmd1bWVudHMpLHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsW2IsYSxjXSkpfSxudzpmdW5jdGlvbihiLGEsYyl7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLFtiLGEsY10pKX19LF9wcm9wYWdhdGU6ZnVuY3Rpb24oYixhKXtlLnVpLnBsdWdpbi5jYWxsKHRoaXMsYixbYSx0aGlzLnVpKCldKTtiIT0icmVzaXplIiYmdGhpcy5fdHJpZ2dlcihiLGEsdGhpcy51aSgpKX0scGx1Z2luczp7fSx1aTpmdW5jdGlvbigpe3JldHVybntvcmlnaW5hbEVsZW1lbnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQsZWxlbWVudDp0aGlzLmVsZW1lbnQsaGVscGVyOnRoaXMuaGVscGVyLHBvc2l0aW9uOnRoaXMucG9zaXRpb24sc2l6ZTp0aGlzLnNpemUsb3JpZ2luYWxTaXplOnRoaXMub3JpZ2luYWxTaXplLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9ufX19KTtlLmV4dGVuZChlLnVpLnJlc2l6YWJsZSwKe3ZlcnNpb246IjEuOC41In0pO2UudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYWxzb1Jlc2l6ZSIse3N0YXJ0OmZ1bmN0aW9uKCl7dmFyIGI9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKS5vcHRpb25zLGE9ZnVuY3Rpb24oYyl7ZShjKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9ZSh0aGlzKTtkLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIix7d2lkdGg6cGFyc2VJbnQoZC53aWR0aCgpLDEwKSxoZWlnaHQ6cGFyc2VJbnQoZC5oZWlnaHQoKSwxMCksbGVmdDpwYXJzZUludChkLmNzcygibGVmdCIpLDEwKSx0b3A6cGFyc2VJbnQoZC5jc3MoInRvcCIpLDEwKSxwb3NpdGlvbjpkLmNzcygicG9zaXRpb24iKX0pfSl9O2lmKHR5cGVvZiBiLmFsc29SZXNpemU9PSJvYmplY3QiJiYhYi5hbHNvUmVzaXplLnBhcmVudE5vZGUpaWYoYi5hbHNvUmVzaXplLmxlbmd0aCl7Yi5hbHNvUmVzaXplPWIuYWxzb1Jlc2l6ZVswXTthKGIuYWxzb1Jlc2l6ZSl9ZWxzZSBlLmVhY2goYi5hbHNvUmVzaXplLApmdW5jdGlvbihjKXthKGMpfSk7ZWxzZSBhKGIuYWxzb1Jlc2l6ZSl9LHJlc2l6ZTpmdW5jdGlvbihiLGEpe3ZhciBjPWUodGhpcykuZGF0YSgicmVzaXphYmxlIik7Yj1jLm9wdGlvbnM7dmFyIGQ9Yy5vcmlnaW5hbFNpemUsZj1jLm9yaWdpbmFsUG9zaXRpb24sZz17aGVpZ2h0OmMuc2l6ZS5oZWlnaHQtZC5oZWlnaHR8fDAsd2lkdGg6Yy5zaXplLndpZHRoLWQud2lkdGh8fDAsdG9wOmMucG9zaXRpb24udG9wLWYudG9wfHwwLGxlZnQ6Yy5wb3NpdGlvbi5sZWZ0LWYubGVmdHx8MH0saD1mdW5jdGlvbihpLGope2UoaSkuZWFjaChmdW5jdGlvbigpe3ZhciBrPWUodGhpcykscT1lKHRoaXMpLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIikscD17fSxyPWomJmoubGVuZ3RoP2o6ay5wYXJlbnRzKGEub3JpZ2luYWxFbGVtZW50WzBdKS5sZW5ndGg/WyJ3aWR0aCIsImhlaWdodCJdOlsid2lkdGgiLCJoZWlnaHQiLCJ0b3AiLCJsZWZ0Il07ZS5lYWNoKHIsZnVuY3Rpb24obixvKXtpZigobj0KKHFbb118fDApKyhnW29dfHwwKSkmJm4+PTApcFtvXT1ufHxudWxsfSk7aWYoZS5icm93c2VyLm9wZXJhJiYvcmVsYXRpdmUvLnRlc3Qoay5jc3MoInBvc2l0aW9uIikpKXtjLl9yZXZlcnRUb1JlbGF0aXZlUG9zaXRpb249dHJ1ZTtrLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSl9ay5jc3MocCl9KX07dHlwZW9mIGIuYWxzb1Jlc2l6ZT09Im9iamVjdCImJiFiLmFsc29SZXNpemUubm9kZVR5cGU/ZS5lYWNoKGIuYWxzb1Jlc2l6ZSxmdW5jdGlvbihpLGope2goaSxqKX0pOmgoYi5hbHNvUmVzaXplKX0sc3RvcDpmdW5jdGlvbigpe3ZhciBiPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYT1iLm9wdGlvbnMsYz1mdW5jdGlvbihkKXtlKGQpLmVhY2goZnVuY3Rpb24oKXt2YXIgZj1lKHRoaXMpO2YuY3NzKHtwb3NpdGlvbjpmLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIikucG9zaXRpb259KX0pfTtpZihiLl9yZXZlcnRUb1JlbGF0aXZlUG9zaXRpb24pe2IuX3JldmVydFRvUmVsYXRpdmVQb3NpdGlvbj0KZmFsc2U7dHlwZW9mIGEuYWxzb1Jlc2l6ZT09Im9iamVjdCImJiFhLmFsc29SZXNpemUubm9kZVR5cGU/ZS5lYWNoKGEuYWxzb1Jlc2l6ZSxmdW5jdGlvbihkKXtjKGQpfSk6YyhhLmFsc29SZXNpemUpfWUodGhpcykucmVtb3ZlRGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiKX19KTtlLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImFuaW1hdGUiLHtzdG9wOmZ1bmN0aW9uKGIpe3ZhciBhPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYz1hLm9wdGlvbnMsZD1hLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLGY9ZC5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoZFswXS5ub2RlTmFtZSksZz1mJiZlLnVpLmhhc1Njcm9sbChkWzBdLCJsZWZ0Iik/MDphLnNpemVEaWZmLmhlaWdodDtmPXt3aWR0aDphLnNpemUud2lkdGgtKGY/MDphLnNpemVEaWZmLndpZHRoKSxoZWlnaHQ6YS5zaXplLmhlaWdodC1nfTtnPXBhcnNlSW50KGEuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGEucG9zaXRpb24ubGVmdC0KYS5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsO3ZhciBoPXBhcnNlSW50KGEuZWxlbWVudC5jc3MoInRvcCIpLDEwKSsoYS5wb3NpdGlvbi50b3AtYS5vcmlnaW5hbFBvc2l0aW9uLnRvcCl8fG51bGw7YS5lbGVtZW50LmFuaW1hdGUoZS5leHRlbmQoZixoJiZnP3t0b3A6aCxsZWZ0Omd9Ont9KSx7ZHVyYXRpb246Yy5hbmltYXRlRHVyYXRpb24sZWFzaW5nOmMuYW5pbWF0ZUVhc2luZyxzdGVwOmZ1bmN0aW9uKCl7dmFyIGk9e3dpZHRoOnBhcnNlSW50KGEuZWxlbWVudC5jc3MoIndpZHRoIiksMTApLGhlaWdodDpwYXJzZUludChhLmVsZW1lbnQuY3NzKCJoZWlnaHQiKSwxMCksdG9wOnBhcnNlSW50KGEuZWxlbWVudC5jc3MoInRvcCIpLDEwKSxsZWZ0OnBhcnNlSW50KGEuZWxlbWVudC5jc3MoImxlZnQiKSwxMCl9O2QmJmQubGVuZ3RoJiZlKGRbMF0pLmNzcyh7d2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHR9KTthLl91cGRhdGVDYWNoZShpKTthLl9wcm9wYWdhdGUoInJlc2l6ZSIsCmIpfX0pfX0pO2UudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiY29udGFpbm1lbnQiLHtzdGFydDpmdW5jdGlvbigpe3ZhciBiPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYT1iLmVsZW1lbnQsYz1iLm9wdGlvbnMuY29udGFpbm1lbnQ7aWYoYT1jIGluc3RhbmNlb2YgZT9jLmdldCgwKTovcGFyZW50Ly50ZXN0KGMpP2EucGFyZW50KCkuZ2V0KDApOmMpe2IuY29udGFpbmVyRWxlbWVudD1lKGEpO2lmKC9kb2N1bWVudC8udGVzdChjKXx8Yz09ZG9jdW1lbnQpe2IuY29udGFpbmVyT2Zmc2V0PXtsZWZ0OjAsdG9wOjB9O2IuY29udGFpbmVyUG9zaXRpb249e2xlZnQ6MCx0b3A6MH07Yi5wYXJlbnREYXRhPXtlbGVtZW50OmUoZG9jdW1lbnQpLGxlZnQ6MCx0b3A6MCx3aWR0aDplKGRvY3VtZW50KS53aWR0aCgpLGhlaWdodDplKGRvY3VtZW50KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodH19ZWxzZXt2YXIgZD1lKGEpLGY9W107ZShbIlRvcCIsCiJSaWdodCIsIkxlZnQiLCJCb3R0b20iXSkuZWFjaChmdW5jdGlvbihpLGope2ZbaV09bShkLmNzcygicGFkZGluZyIraikpfSk7Yi5jb250YWluZXJPZmZzZXQ9ZC5vZmZzZXQoKTtiLmNvbnRhaW5lclBvc2l0aW9uPWQucG9zaXRpb24oKTtiLmNvbnRhaW5lclNpemU9e2hlaWdodDpkLmlubmVySGVpZ2h0KCktZlszXSx3aWR0aDpkLmlubmVyV2lkdGgoKS1mWzFdfTtjPWIuY29udGFpbmVyT2Zmc2V0O3ZhciBnPWIuY29udGFpbmVyU2l6ZS5oZWlnaHQsaD1iLmNvbnRhaW5lclNpemUud2lkdGg7aD1lLnVpLmhhc1Njcm9sbChhLCJsZWZ0Iik/YS5zY3JvbGxXaWR0aDpoO2c9ZS51aS5oYXNTY3JvbGwoYSk/YS5zY3JvbGxIZWlnaHQ6ZztiLnBhcmVudERhdGE9e2VsZW1lbnQ6YSxsZWZ0OmMubGVmdCx0b3A6Yy50b3Asd2lkdGg6aCxoZWlnaHQ6Z319fX0scmVzaXplOmZ1bmN0aW9uKGIpe3ZhciBhPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYz1hLm9wdGlvbnMsZD1hLmNvbnRhaW5lck9mZnNldCwKZj1hLnBvc2l0aW9uO2I9YS5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXk7dmFyIGc9e3RvcDowLGxlZnQ6MH0saD1hLmNvbnRhaW5lckVsZW1lbnQ7aWYoaFswXSE9ZG9jdW1lbnQmJi9zdGF0aWMvLnRlc3QoaC5jc3MoInBvc2l0aW9uIikpKWc9ZDtpZihmLmxlZnQ8KGEuX2hlbHBlcj9kLmxlZnQ6MCkpe2Euc2l6ZS53aWR0aCs9YS5faGVscGVyP2EucG9zaXRpb24ubGVmdC1kLmxlZnQ6YS5wb3NpdGlvbi5sZWZ0LWcubGVmdDtpZihiKWEuc2l6ZS5oZWlnaHQ9YS5zaXplLndpZHRoL2MuYXNwZWN0UmF0aW87YS5wb3NpdGlvbi5sZWZ0PWMuaGVscGVyP2QubGVmdDowfWlmKGYudG9wPChhLl9oZWxwZXI/ZC50b3A6MCkpe2Euc2l6ZS5oZWlnaHQrPWEuX2hlbHBlcj9hLnBvc2l0aW9uLnRvcC1kLnRvcDphLnBvc2l0aW9uLnRvcDtpZihiKWEuc2l6ZS53aWR0aD1hLnNpemUuaGVpZ2h0KmMuYXNwZWN0UmF0aW87YS5wb3NpdGlvbi50b3A9YS5faGVscGVyP2QudG9wOjB9YS5vZmZzZXQubGVmdD0KYS5wYXJlbnREYXRhLmxlZnQrYS5wb3NpdGlvbi5sZWZ0O2Eub2Zmc2V0LnRvcD1hLnBhcmVudERhdGEudG9wK2EucG9zaXRpb24udG9wO2M9TWF0aC5hYnMoKGEuX2hlbHBlcj9hLm9mZnNldC5sZWZ0LWcubGVmdDphLm9mZnNldC5sZWZ0LWcubGVmdCkrYS5zaXplRGlmZi53aWR0aCk7ZD1NYXRoLmFicygoYS5faGVscGVyP2Eub2Zmc2V0LnRvcC1nLnRvcDphLm9mZnNldC50b3AtZC50b3ApK2Euc2l6ZURpZmYuaGVpZ2h0KTtmPWEuY29udGFpbmVyRWxlbWVudC5nZXQoMCk9PWEuZWxlbWVudC5wYXJlbnQoKS5nZXQoMCk7Zz0vcmVsYXRpdmV8YWJzb2x1dGUvLnRlc3QoYS5jb250YWluZXJFbGVtZW50LmNzcygicG9zaXRpb24iKSk7aWYoZiYmZyljLT1hLnBhcmVudERhdGEubGVmdDtpZihjK2Euc2l6ZS53aWR0aD49YS5wYXJlbnREYXRhLndpZHRoKXthLnNpemUud2lkdGg9YS5wYXJlbnREYXRhLndpZHRoLWM7aWYoYilhLnNpemUuaGVpZ2h0PWEuc2l6ZS53aWR0aC9hLmFzcGVjdFJhdGlvfWlmKGQrCmEuc2l6ZS5oZWlnaHQ+PWEucGFyZW50RGF0YS5oZWlnaHQpe2Euc2l6ZS5oZWlnaHQ9YS5wYXJlbnREYXRhLmhlaWdodC1kO2lmKGIpYS5zaXplLndpZHRoPWEuc2l6ZS5oZWlnaHQqYS5hc3BlY3RSYXRpb319LHN0b3A6ZnVuY3Rpb24oKXt2YXIgYj1lKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGE9Yi5vcHRpb25zLGM9Yi5jb250YWluZXJPZmZzZXQsZD1iLmNvbnRhaW5lclBvc2l0aW9uLGY9Yi5jb250YWluZXJFbGVtZW50LGc9ZShiLmhlbHBlciksaD1nLm9mZnNldCgpLGk9Zy5vdXRlcldpZHRoKCktYi5zaXplRGlmZi53aWR0aDtnPWcub3V0ZXJIZWlnaHQoKS1iLnNpemVEaWZmLmhlaWdodDtiLl9oZWxwZXImJiFhLmFuaW1hdGUmJi9yZWxhdGl2ZS8udGVzdChmLmNzcygicG9zaXRpb24iKSkmJmUodGhpcykuY3NzKHtsZWZ0OmgubGVmdC1kLmxlZnQtYy5sZWZ0LHdpZHRoOmksaGVpZ2h0Omd9KTtiLl9oZWxwZXImJiFhLmFuaW1hdGUmJi9zdGF0aWMvLnRlc3QoZi5jc3MoInBvc2l0aW9uIikpJiYKZSh0aGlzKS5jc3Moe2xlZnQ6aC5sZWZ0LWQubGVmdC1jLmxlZnQsd2lkdGg6aSxoZWlnaHQ6Z30pfX0pO2UudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ2hvc3QiLHtzdGFydDpmdW5jdGlvbigpe3ZhciBiPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYT1iLm9wdGlvbnMsYz1iLnNpemU7Yi5naG9zdD1iLm9yaWdpbmFsRWxlbWVudC5jbG9uZSgpO2IuZ2hvc3QuY3NzKHtvcGFjaXR5OjAuMjUsZGlzcGxheToiYmxvY2siLHBvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OmMuaGVpZ2h0LHdpZHRoOmMud2lkdGgsbWFyZ2luOjAsbGVmdDowLHRvcDowfSkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1naG9zdCIpLmFkZENsYXNzKHR5cGVvZiBhLmdob3N0PT0ic3RyaW5nIj9hLmdob3N0OiIiKTtiLmdob3N0LmFwcGVuZFRvKGIuaGVscGVyKX0scmVzaXplOmZ1bmN0aW9uKCl7dmFyIGI9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKTtiLmdob3N0JiZiLmdob3N0LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIiwKaGVpZ2h0OmIuc2l6ZS5oZWlnaHQsd2lkdGg6Yi5zaXplLndpZHRofSl9LHN0b3A6ZnVuY3Rpb24oKXt2YXIgYj1lKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpO2IuZ2hvc3QmJmIuaGVscGVyJiZiLmhlbHBlci5nZXQoMCkucmVtb3ZlQ2hpbGQoYi5naG9zdC5nZXQoMCkpfX0pO2UudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ3JpZCIse3Jlc2l6ZTpmdW5jdGlvbigpe3ZhciBiPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYT1iLm9wdGlvbnMsYz1iLnNpemUsZD1iLm9yaWdpbmFsU2l6ZSxmPWIub3JpZ2luYWxQb3NpdGlvbixnPWIuYXhpczthLmdyaWQ9dHlwZW9mIGEuZ3JpZD09Im51bWJlciI/W2EuZ3JpZCxhLmdyaWRdOmEuZ3JpZDt2YXIgaD1NYXRoLnJvdW5kKChjLndpZHRoLWQud2lkdGgpLyhhLmdyaWRbMF18fDEpKSooYS5ncmlkWzBdfHwxKTthPU1hdGgucm91bmQoKGMuaGVpZ2h0LWQuaGVpZ2h0KS8oYS5ncmlkWzFdfHwxKSkqKGEuZ3JpZFsxXXx8MSk7aWYoL14oc2V8c3xlKSQvLnRlc3QoZykpe2Iuc2l6ZS53aWR0aD0KZC53aWR0aCtoO2Iuc2l6ZS5oZWlnaHQ9ZC5oZWlnaHQrYX1lbHNlIGlmKC9eKG5lKSQvLnRlc3QoZykpe2Iuc2l6ZS53aWR0aD1kLndpZHRoK2g7Yi5zaXplLmhlaWdodD1kLmhlaWdodCthO2IucG9zaXRpb24udG9wPWYudG9wLWF9ZWxzZXtpZigvXihzdykkLy50ZXN0KGcpKXtiLnNpemUud2lkdGg9ZC53aWR0aCtoO2Iuc2l6ZS5oZWlnaHQ9ZC5oZWlnaHQrYX1lbHNle2Iuc2l6ZS53aWR0aD1kLndpZHRoK2g7Yi5zaXplLmhlaWdodD1kLmhlaWdodCthO2IucG9zaXRpb24udG9wPWYudG9wLWF9Yi5wb3NpdGlvbi5sZWZ0PWYubGVmdC1ofX19KTt2YXIgbT1mdW5jdGlvbihiKXtyZXR1cm4gcGFyc2VJbnQoYiwxMCl8fDB9LGw9ZnVuY3Rpb24oYil7cmV0dXJuIWlzTmFOKHBhcnNlSW50KGIsMTApKX19KShqUXVlcnkpOwo7LyoKICogalF1ZXJ5IFVJIFNlbGVjdGFibGUgMS44LjUKICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1NlbGVjdGFibGVzCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS51aS5jb3JlLmpzCiAqCWpxdWVyeS51aS5tb3VzZS5qcwogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqLwooZnVuY3Rpb24oZSl7ZS53aWRnZXQoInVpLnNlbGVjdGFibGUiLGUudWkubW91c2Use29wdGlvbnM6e2FwcGVuZFRvOiJib2R5IixhdXRvUmVmcmVzaDp0cnVlLGRpc3RhbmNlOjAsZmlsdGVyOiIqIix0b2xlcmFuY2U6InRvdWNoIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBjPXRoaXM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RhYmxlIik7dGhpcy5kcmFnZ2VkPWZhbHNlO3ZhciBmO3RoaXMucmVmcmVzaD1mdW5jdGlvbigpe2Y9ZShjLm9wdGlvbnMuZmlsdGVyLGMuZWxlbWVudFswXSk7Zi5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9ZSh0aGlzKSxiPWQub2Zmc2V0KCk7ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIse2VsZW1lbnQ6dGhpcywkZWxlbWVudDpkLGxlZnQ6Yi5sZWZ0LHRvcDpiLnRvcCxyaWdodDpiLmxlZnQrZC5vdXRlcldpZHRoKCksYm90dG9tOmIudG9wK2Qub3V0ZXJIZWlnaHQoKSxzdGFydHNlbGVjdGVkOmZhbHNlLHNlbGVjdGVkOmQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksCnNlbGVjdGluZzpkLmhhc0NsYXNzKCJ1aS1zZWxlY3RpbmciKSx1bnNlbGVjdGluZzpkLmhhc0NsYXNzKCJ1aS11bnNlbGVjdGluZyIpfSl9KX07dGhpcy5yZWZyZXNoKCk7dGhpcy5zZWxlY3RlZXM9Zi5hZGRDbGFzcygidWktc2VsZWN0ZWUiKTt0aGlzLl9tb3VzZUluaXQoKTt0aGlzLmhlbHBlcj1lKCI8ZGl2IGNsYXNzPSd1aS1zZWxlY3RhYmxlLWhlbHBlcic+PC9kaXY+Iil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVlcy5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWUiKS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0ZW0iKTt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGFibGUgdWktc2VsZWN0YWJsZS1kaXNhYmxlZCIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUiKS51bmJpbmQoIi5zZWxlY3RhYmxlIik7dGhpcy5fbW91c2VEZXN0cm95KCk7cmV0dXJuIHRoaXN9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGMpe3ZhciBmPXRoaXM7dGhpcy5vcG9zPVtjLnBhZ2VYLApjLnBhZ2VZXTtpZighdGhpcy5vcHRpb25zLmRpc2FibGVkKXt2YXIgZD10aGlzLm9wdGlvbnM7dGhpcy5zZWxlY3RlZXM9ZShkLmZpbHRlcix0aGlzLmVsZW1lbnRbMF0pO3RoaXMuX3RyaWdnZXIoInN0YXJ0IixjKTtlKGQuYXBwZW5kVG8pLmFwcGVuZCh0aGlzLmhlbHBlcik7dGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmMuY2xpZW50WCx0b3A6Yy5jbGllbnRZLHdpZHRoOjAsaGVpZ2h0OjB9KTtkLmF1dG9SZWZyZXNoJiZ0aGlzLnJlZnJlc2goKTt0aGlzLnNlbGVjdGVlcy5maWx0ZXIoIi51aS1zZWxlY3RlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7Yi5zdGFydHNlbGVjdGVkPXRydWU7aWYoIWMubWV0YUtleSl7Yi4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKTtiLnNlbGVjdGVkPWZhbHNlO2IuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7Yi51bnNlbGVjdGluZz10cnVlO2YuX3RyaWdnZXIoInVuc2VsZWN0aW5nIiwKYyx7dW5zZWxlY3Rpbmc6Yi5lbGVtZW50fSl9fSk7ZShjLnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2lmKGIpe3ZhciBnPSFjLm1ldGFLZXl8fCFiLiRlbGVtZW50Lmhhc0NsYXNzKCJ1aS1zZWxlY3RlZCIpO2IuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoZz8idWktdW5zZWxlY3RpbmciOiJ1aS1zZWxlY3RlZCIpLmFkZENsYXNzKGc/InVpLXNlbGVjdGluZyI6InVpLXVuc2VsZWN0aW5nIik7Yi51bnNlbGVjdGluZz0hZztiLnNlbGVjdGluZz1nOyhiLnNlbGVjdGVkPWcpP2YuX3RyaWdnZXIoInNlbGVjdGluZyIsYyx7c2VsZWN0aW5nOmIuZWxlbWVudH0pOmYuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixjLHt1bnNlbGVjdGluZzpiLmVsZW1lbnR9KTtyZXR1cm4gZmFsc2V9fSl9fSxfbW91c2VEcmFnOmZ1bmN0aW9uKGMpe3ZhciBmPXRoaXM7dGhpcy5kcmFnZ2VkPXRydWU7aWYoIXRoaXMub3B0aW9ucy5kaXNhYmxlZCl7dmFyIGQ9CnRoaXMub3B0aW9ucyxiPXRoaXMub3Bvc1swXSxnPXRoaXMub3Bvc1sxXSxoPWMucGFnZVgsaT1jLnBhZ2VZO2lmKGI+aCl7dmFyIGo9aDtoPWI7Yj1qfWlmKGc+aSl7aj1pO2k9ZztnPWp9dGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmIsdG9wOmcsd2lkdGg6aC1iLGhlaWdodDppLWd9KTt0aGlzLnNlbGVjdGVlcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2lmKCEoIWF8fGEuZWxlbWVudD09Zi5lbGVtZW50WzBdKSl7dmFyIGs9ZmFsc2U7aWYoZC50b2xlcmFuY2U9PSJ0b3VjaCIpaz0hKGEubGVmdD5ofHxhLnJpZ2h0PGJ8fGEudG9wPml8fGEuYm90dG9tPGcpO2Vsc2UgaWYoZC50b2xlcmFuY2U9PSJmaXQiKWs9YS5sZWZ0PmImJmEucmlnaHQ8aCYmYS50b3A+ZyYmYS5ib3R0b208aTtpZihrKXtpZihhLnNlbGVjdGVkKXthLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpO2Euc2VsZWN0ZWQ9ZmFsc2V9aWYoYS51bnNlbGVjdGluZyl7YS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKTsKYS51bnNlbGVjdGluZz1mYWxzZX1pZighYS5zZWxlY3Rpbmcpe2EuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGluZyIpO2Euc2VsZWN0aW5nPXRydWU7Zi5fdHJpZ2dlcigic2VsZWN0aW5nIixjLHtzZWxlY3Rpbmc6YS5lbGVtZW50fSl9fWVsc2V7aWYoYS5zZWxlY3RpbmcpaWYoYy5tZXRhS2V5JiZhLnN0YXJ0c2VsZWN0ZWQpe2EuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpO2Euc2VsZWN0aW5nPWZhbHNlO2EuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIik7YS5zZWxlY3RlZD10cnVlfWVsc2V7YS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIik7YS5zZWxlY3Rpbmc9ZmFsc2U7aWYoYS5zdGFydHNlbGVjdGVkKXthLiRlbGVtZW50LmFkZENsYXNzKCJ1aS11bnNlbGVjdGluZyIpO2EudW5zZWxlY3Rpbmc9dHJ1ZX1mLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsYyx7dW5zZWxlY3Rpbmc6YS5lbGVtZW50fSl9aWYoYS5zZWxlY3RlZClpZighYy5tZXRhS2V5JiYKIWEuc3RhcnRzZWxlY3RlZCl7YS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKTthLnNlbGVjdGVkPWZhbHNlO2EuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7YS51bnNlbGVjdGluZz10cnVlO2YuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixjLHt1bnNlbGVjdGluZzphLmVsZW1lbnR9KX19fX0pO3JldHVybiBmYWxzZX19LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYyl7dmFyIGY9dGhpczt0aGlzLmRyYWdnZWQ9ZmFsc2U7ZSgiLnVpLXVuc2VsZWN0aW5nIix0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKTtkLnVuc2VsZWN0aW5nPWZhbHNlO2Quc3RhcnRzZWxlY3RlZD1mYWxzZTtmLl90cmlnZ2VyKCJ1bnNlbGVjdGVkIixjLHt1bnNlbGVjdGVkOmQuZWxlbWVudH0pfSk7ZSgiLnVpLXNlbGVjdGluZyIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9CmUuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKS5hZGRDbGFzcygidWktc2VsZWN0ZWQiKTtkLnNlbGVjdGluZz1mYWxzZTtkLnNlbGVjdGVkPXRydWU7ZC5zdGFydHNlbGVjdGVkPXRydWU7Zi5fdHJpZ2dlcigic2VsZWN0ZWQiLGMse3NlbGVjdGVkOmQuZWxlbWVudH0pfSk7dGhpcy5fdHJpZ2dlcigic3RvcCIsYyk7dGhpcy5oZWxwZXIucmVtb3ZlKCk7cmV0dXJuIGZhbHNlfX0pO2UuZXh0ZW5kKGUudWkuc2VsZWN0YWJsZSx7dmVyc2lvbjoiMS44LjUifSl9KShqUXVlcnkpOwo7LyoKICogalF1ZXJ5IFVJIERpYWxvZyAxLjguNQogKgogKiBDb3B5cmlnaHQgMjAxMCwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRGlhbG9nCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS51aS5jb3JlLmpzCiAqCWpxdWVyeS51aS53aWRnZXQuanMKICogIGpxdWVyeS51aS5idXR0b24uanMKICoJanF1ZXJ5LnVpLmRyYWdnYWJsZS5qcwogKglqcXVlcnkudWkubW91c2UuanMKICoJanF1ZXJ5LnVpLnBvc2l0aW9uLmpzCiAqCWpxdWVyeS51aS5yZXNpemFibGUuanMKICovCihmdW5jdGlvbihjLGope2Mud2lkZ2V0KCJ1aS5kaWFsb2ciLHtvcHRpb25zOnthdXRvT3Blbjp0cnVlLGJ1dHRvbnM6e30sY2xvc2VPbkVzY2FwZTp0cnVlLGNsb3NlVGV4dDoiY2xvc2UiLGRpYWxvZ0NsYXNzOiIiLGRyYWdnYWJsZTp0cnVlLGhpZGU6bnVsbCxoZWlnaHQ6ImF1dG8iLG1heEhlaWdodDpmYWxzZSxtYXhXaWR0aDpmYWxzZSxtaW5IZWlnaHQ6MTUwLG1pbldpZHRoOjE1MCxtb2RhbDpmYWxzZSxwb3NpdGlvbjp7bXk6ImNlbnRlciIsYXQ6ImNlbnRlciIsb2Y6d2luZG93LGNvbGxpc2lvbjoiZml0Iix1c2luZzpmdW5jdGlvbihhKXt2YXIgYj1jKHRoaXMpLmNzcyhhKS5vZmZzZXQoKS50b3A7YjwwJiZjKHRoaXMpLmNzcygidG9wIixhLnRvcC1iKX19LHJlc2l6YWJsZTp0cnVlLHNob3c6bnVsbCxzdGFjazp0cnVlLHRpdGxlOiIiLHdpZHRoOjMwMCx6SW5kZXg6MUUzfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcmlnaW5hbFRpdGxlPXRoaXMuZWxlbWVudC5hdHRyKCJ0aXRsZSIpOwppZih0eXBlb2YgdGhpcy5vcmlnaW5hbFRpdGxlIT09InN0cmluZyIpdGhpcy5vcmlnaW5hbFRpdGxlPSIiO3RoaXMub3B0aW9ucy50aXRsZT10aGlzLm9wdGlvbnMudGl0bGV8fHRoaXMub3JpZ2luYWxUaXRsZTt2YXIgYT10aGlzLGI9YS5vcHRpb25zLGQ9Yi50aXRsZXx8IiYjMTYwOyIsZj1jLnVpLmRpYWxvZy5nZXRUaXRsZUlkKGEuZWxlbWVudCksZz0oYS51aURpYWxvZz1jKCI8ZGl2PjwvZGl2PiIpKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5oaWRlKCkuYWRkQ2xhc3MoInVpLWRpYWxvZyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCAiK2IuZGlhbG9nQ2xhc3MpLmNzcyh7ekluZGV4OmIuekluZGV4fSkuYXR0cigidGFiSW5kZXgiLC0xKS5jc3MoIm91dGxpbmUiLDApLmtleWRvd24oZnVuY3Rpb24oaSl7aWYoYi5jbG9zZU9uRXNjYXBlJiZpLmtleUNvZGUmJmkua2V5Q29kZT09PWMudWkua2V5Q29kZS5FU0NBUEUpe2EuY2xvc2UoaSk7aS5wcmV2ZW50RGVmYXVsdCgpfX0pLmF0dHIoe3JvbGU6ImRpYWxvZyIsCiJhcmlhLWxhYmVsbGVkYnkiOmZ9KS5tb3VzZWRvd24oZnVuY3Rpb24oaSl7YS5tb3ZlVG9Ub3AoZmFsc2UsaSl9KTthLmVsZW1lbnQuc2hvdygpLnJlbW92ZUF0dHIoInRpdGxlIikuYWRkQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikuYXBwZW5kVG8oZyk7dmFyIGU9KGEudWlEaWFsb2dUaXRsZWJhcj1jKCI8ZGl2PjwvZGl2PiIpKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlYmFyIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCB1aS1oZWxwZXItY2xlYXJmaXgiKS5wcmVwZW5kVG8oZyksaD1jKCc8YSBocmVmPSIjIj48L2E+JykuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSB1aS1jb3JuZXItYWxsIikuYXR0cigicm9sZSIsImJ1dHRvbiIpLmhvdmVyKGZ1bmN0aW9uKCl7aC5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKX0sZnVuY3Rpb24oKXtoLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSkuZm9jdXMoZnVuY3Rpb24oKXtoLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSkuYmx1cihmdW5jdGlvbigpe2gucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9KS5jbGljayhmdW5jdGlvbihpKXthLmNsb3NlKGkpOwpyZXR1cm4gZmFsc2V9KS5hcHBlbmRUbyhlKTsoYS51aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0PWMoIjxzcGFuPjwvc3Bhbj4iKSkuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1jbG9zZXRoaWNrIikudGV4dChiLmNsb3NlVGV4dCkuYXBwZW5kVG8oaCk7YygiPHNwYW4+PC9zcGFuPiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGUiKS5hdHRyKCJpZCIsZikuaHRtbChkKS5wcmVwZW5kVG8oZSk7aWYoYy5pc0Z1bmN0aW9uKGIuYmVmb3JlY2xvc2UpJiYhYy5pc0Z1bmN0aW9uKGIuYmVmb3JlQ2xvc2UpKWIuYmVmb3JlQ2xvc2U9Yi5iZWZvcmVjbG9zZTtlLmZpbmQoIioiKS5hZGQoZSkuZGlzYWJsZVNlbGVjdGlvbigpO2IuZHJhZ2dhYmxlJiZjLmZuLmRyYWdnYWJsZSYmYS5fbWFrZURyYWdnYWJsZSgpO2IucmVzaXphYmxlJiZjLmZuLnJlc2l6YWJsZSYmYS5fbWFrZVJlc2l6YWJsZSgpO2EuX2NyZWF0ZUJ1dHRvbnMoYi5idXR0b25zKTthLl9pc09wZW49ZmFsc2U7Yy5mbi5iZ2lmcmFtZSYmCmcuYmdpZnJhbWUoKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXV0b09wZW4mJnRoaXMub3BlbigpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLm92ZXJsYXkmJmEub3ZlcmxheS5kZXN0cm95KCk7YS51aURpYWxvZy5oaWRlKCk7YS5lbGVtZW50LnVuYmluZCgiLmRpYWxvZyIpLnJlbW92ZURhdGEoImRpYWxvZyIpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudCIpLmhpZGUoKS5hcHBlbmRUbygiYm9keSIpO2EudWlEaWFsb2cucmVtb3ZlKCk7YS5vcmlnaW5hbFRpdGxlJiZhLmVsZW1lbnQuYXR0cigidGl0bGUiLGEub3JpZ2luYWxUaXRsZSk7cmV0dXJuIGF9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVpRGlhbG9nfSxjbG9zZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGQ7aWYoZmFsc2UhPT1iLl90cmlnZ2VyKCJiZWZvcmVDbG9zZSIsYSkpe2Iub3ZlcmxheSYmYi5vdmVybGF5LmRlc3Ryb3koKTtiLnVpRGlhbG9nLnVuYmluZCgia2V5cHJlc3MudWktZGlhbG9nIik7CmIuX2lzT3Blbj1mYWxzZTtpZihiLm9wdGlvbnMuaGlkZSliLnVpRGlhbG9nLmhpZGUoYi5vcHRpb25zLmhpZGUsZnVuY3Rpb24oKXtiLl90cmlnZ2VyKCJjbG9zZSIsYSl9KTtlbHNle2IudWlEaWFsb2cuaGlkZSgpO2IuX3RyaWdnZXIoImNsb3NlIixhKX1jLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpO2lmKGIub3B0aW9ucy5tb2RhbCl7ZD0wO2MoIi51aS1kaWFsb2ciKS5lYWNoKGZ1bmN0aW9uKCl7aWYodGhpcyE9PWIudWlEaWFsb2dbMF0pZD1NYXRoLm1heChkLGModGhpcykuY3NzKCJ6LWluZGV4IikpfSk7Yy51aS5kaWFsb2cubWF4Wj1kfXJldHVybiBifX0saXNPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzT3Blbn0sbW92ZVRvVG9wOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dGhpcyxmPWQub3B0aW9ucztpZihmLm1vZGFsJiYhYXx8IWYuc3RhY2smJiFmLm1vZGFsKXJldHVybiBkLl90cmlnZ2VyKCJmb2N1cyIsYik7aWYoZi56SW5kZXg+Yy51aS5kaWFsb2cubWF4WiljLnVpLmRpYWxvZy5tYXhaPQpmLnpJbmRleDtpZihkLm92ZXJsYXkpe2MudWkuZGlhbG9nLm1heForPTE7ZC5vdmVybGF5LiRlbC5jc3MoInotaW5kZXgiLGMudWkuZGlhbG9nLm92ZXJsYXkubWF4Wj1jLnVpLmRpYWxvZy5tYXhaKX1hPXtzY3JvbGxUb3A6ZC5lbGVtZW50LmF0dHIoInNjcm9sbFRvcCIpLHNjcm9sbExlZnQ6ZC5lbGVtZW50LmF0dHIoInNjcm9sbExlZnQiKX07Yy51aS5kaWFsb2cubWF4Wis9MTtkLnVpRGlhbG9nLmNzcygiei1pbmRleCIsYy51aS5kaWFsb2cubWF4Wik7ZC5lbGVtZW50LmF0dHIoYSk7ZC5fdHJpZ2dlcigiZm9jdXMiLGIpO3JldHVybiBkfSxvcGVuOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2lzT3Blbil7dmFyIGE9dGhpcyxiPWEub3B0aW9ucyxkPWEudWlEaWFsb2c7YS5vdmVybGF5PWIubW9kYWw/bmV3IGMudWkuZGlhbG9nLm92ZXJsYXkoYSk6bnVsbDtkLm5leHQoKS5sZW5ndGgmJmQuYXBwZW5kVG8oImJvZHkiKTthLl9zaXplKCk7YS5fcG9zaXRpb24oYi5wb3NpdGlvbik7ZC5zaG93KGIuc2hvdyk7CmEubW92ZVRvVG9wKHRydWUpO2IubW9kYWwmJmQuYmluZCgia2V5cHJlc3MudWktZGlhbG9nIixmdW5jdGlvbihmKXtpZihmLmtleUNvZGU9PT1jLnVpLmtleUNvZGUuVEFCKXt2YXIgZz1jKCI6dGFiYmFibGUiLHRoaXMpLGU9Zy5maWx0ZXIoIjpmaXJzdCIpO2c9Zy5maWx0ZXIoIjpsYXN0Iik7aWYoZi50YXJnZXQ9PT1nWzBdJiYhZi5zaGlmdEtleSl7ZS5mb2N1cygxKTtyZXR1cm4gZmFsc2V9ZWxzZSBpZihmLnRhcmdldD09PWVbMF0mJmYuc2hpZnRLZXkpe2cuZm9jdXMoMSk7cmV0dXJuIGZhbHNlfX19KTtjKGEuZWxlbWVudC5maW5kKCI6dGFiYmFibGUiKS5nZXQoKS5jb25jYXQoZC5maW5kKCIudWktZGlhbG9nLWJ1dHRvbnBhbmUgOnRhYmJhYmxlIikuZ2V0KCkuY29uY2F0KGQuZ2V0KCkpKSkuZXEoMCkuZm9jdXMoKTthLl9pc09wZW49dHJ1ZTthLl90cmlnZ2VyKCJvcGVuIik7cmV0dXJuIGF9fSxfY3JlYXRlQnV0dG9uczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGQ9ZmFsc2UsCmY9YygiPGRpdj48L2Rpdj4iKS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IiksZz1jKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9uc2V0IikuYXBwZW5kVG8oZik7Yi51aURpYWxvZy5maW5kKCIudWktZGlhbG9nLWJ1dHRvbnBhbmUiKS5yZW1vdmUoKTt0eXBlb2YgYT09PSJvYmplY3QiJiZhIT09bnVsbCYmYy5lYWNoKGEsZnVuY3Rpb24oKXtyZXR1cm4hKGQ9dHJ1ZSl9KTtpZihkKXtjLmVhY2goYSxmdW5jdGlvbihlLGgpe2g9Yy5pc0Z1bmN0aW9uKGgpP3tjbGljazpoLHRleHQ6ZX06aDtlPWMoIjxidXR0b24+PC9idXR0b24+IixoKS51bmJpbmQoImNsaWNrIikuY2xpY2soZnVuY3Rpb24oKXtoLmNsaWNrLmFwcGx5KGIuZWxlbWVudFswXSxhcmd1bWVudHMpfSkuYXBwZW5kVG8oZyk7Yy5mbi5idXR0b24mJmUuYnV0dG9uKCl9KTtmLmFwcGVuZFRvKGIudWlEaWFsb2cpfX0sX21ha2VEcmFnZ2FibGU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGUpe3JldHVybntwb3NpdGlvbjplLnBvc2l0aW9uLApvZmZzZXQ6ZS5vZmZzZXR9fXZhciBiPXRoaXMsZD1iLm9wdGlvbnMsZj1jKGRvY3VtZW50KSxnO2IudWlEaWFsb2cuZHJhZ2dhYmxlKHtjYW5jZWw6Ii51aS1kaWFsb2ctY29udGVudCwgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIsaGFuZGxlOiIudWktZGlhbG9nLXRpdGxlYmFyIixjb250YWlubWVudDoiZG9jdW1lbnQiLHN0YXJ0OmZ1bmN0aW9uKGUsaCl7Zz1kLmhlaWdodD09PSJhdXRvIj8iYXV0byI6Yyh0aGlzKS5oZWlnaHQoKTtjKHRoaXMpLmhlaWdodChjKHRoaXMpLmhlaWdodCgpKS5hZGRDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIik7Yi5fdHJpZ2dlcigiZHJhZ1N0YXJ0IixlLGEoaCkpfSxkcmFnOmZ1bmN0aW9uKGUsaCl7Yi5fdHJpZ2dlcigiZHJhZyIsZSxhKGgpKX0sc3RvcDpmdW5jdGlvbihlLGgpe2QucG9zaXRpb249W2gucG9zaXRpb24ubGVmdC1mLnNjcm9sbExlZnQoKSxoLnBvc2l0aW9uLnRvcC1mLnNjcm9sbFRvcCgpXTtjKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctZHJhZ2dpbmciKS5oZWlnaHQoZyk7CmIuX3RyaWdnZXIoImRyYWdTdG9wIixlLGEoaCkpO2MudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCl9fSl9LF9tYWtlUmVzaXphYmxlOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoZSl7cmV0dXJue29yaWdpbmFsUG9zaXRpb246ZS5vcmlnaW5hbFBvc2l0aW9uLG9yaWdpbmFsU2l6ZTplLm9yaWdpbmFsU2l6ZSxwb3NpdGlvbjplLnBvc2l0aW9uLHNpemU6ZS5zaXplfX1hPWE9PT1qP3RoaXMub3B0aW9ucy5yZXNpemFibGU6YTt2YXIgZD10aGlzLGY9ZC5vcHRpb25zLGc9ZC51aURpYWxvZy5jc3MoInBvc2l0aW9uIik7YT10eXBlb2YgYT09PSJzdHJpbmciP2E6Im4sZSxzLHcsc2Usc3csbmUsbnciO2QudWlEaWFsb2cucmVzaXphYmxlKHtjYW5jZWw6Ii51aS1kaWFsb2ctY29udGVudCIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixhbHNvUmVzaXplOmQuZWxlbWVudCxtYXhXaWR0aDpmLm1heFdpZHRoLG1heEhlaWdodDpmLm1heEhlaWdodCxtaW5XaWR0aDpmLm1pbldpZHRoLG1pbkhlaWdodDpkLl9taW5IZWlnaHQoKSwKaGFuZGxlczphLHN0YXJ0OmZ1bmN0aW9uKGUsaCl7Yyh0aGlzKS5hZGRDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIik7ZC5fdHJpZ2dlcigicmVzaXplU3RhcnQiLGUsYihoKSl9LHJlc2l6ZTpmdW5jdGlvbihlLGgpe2QuX3RyaWdnZXIoInJlc2l6ZSIsZSxiKGgpKX0sc3RvcDpmdW5jdGlvbihlLGgpe2ModGhpcykucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1yZXNpemluZyIpO2YuaGVpZ2h0PWModGhpcykuaGVpZ2h0KCk7Zi53aWR0aD1jKHRoaXMpLndpZHRoKCk7ZC5fdHJpZ2dlcigicmVzaXplU3RvcCIsZSxiKGgpKTtjLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpfX0pLmNzcygicG9zaXRpb24iLGcpLmZpbmQoIi51aS1yZXNpemFibGUtc2UiKS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWdyaXAtZGlhZ29uYWwtc2UiKX0sX21pbkhlaWdodDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucztyZXR1cm4gYS5oZWlnaHQ9PT0iYXV0byI/YS5taW5IZWlnaHQ6TWF0aC5taW4oYS5taW5IZWlnaHQsCmEuaGVpZ2h0KX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9WzAsMF0sZjtpZihhKXtpZih0eXBlb2YgYT09PSJzdHJpbmcifHx0eXBlb2YgYT09PSJvYmplY3QiJiYiMCJpbiBhKXtiPWEuc3BsaXQ/YS5zcGxpdCgiICIpOlthWzBdLGFbMV1dO2lmKGIubGVuZ3RoPT09MSliWzFdPWJbMF07Yy5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKGcsZSl7aWYoK2JbZ109PT1iW2ddKXtkW2ddPWJbZ107YltnXT1lfX0pO2E9e215OmIuam9pbigiICIpLGF0OmIuam9pbigiICIpLG9mZnNldDpkLmpvaW4oIiAiKX19YT1jLmV4dGVuZCh7fSxjLnVpLmRpYWxvZy5wcm90b3R5cGUub3B0aW9ucy5wb3NpdGlvbixhKX1lbHNlIGE9Yy51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb247KGY9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKSl8fHRoaXMudWlEaWFsb2cuc2hvdygpO3RoaXMudWlEaWFsb2cuY3NzKHt0b3A6MCxsZWZ0OjB9KS5wb3NpdGlvbihhKTsKZnx8dGhpcy51aURpYWxvZy5oaWRlKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzLGY9ZC51aURpYWxvZyxnPWYuaXMoIjpkYXRhKHJlc2l6YWJsZSkiKSxlPWZhbHNlO3N3aXRjaChhKXtjYXNlICJiZWZvcmVjbG9zZSI6YT0iYmVmb3JlQ2xvc2UiO2JyZWFrO2Nhc2UgImJ1dHRvbnMiOmQuX2NyZWF0ZUJ1dHRvbnMoYik7ZT10cnVlO2JyZWFrO2Nhc2UgImNsb3NlVGV4dCI6ZC51aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0LnRleHQoIiIrYik7YnJlYWs7Y2FzZSAiZGlhbG9nQ2xhc3MiOmYucmVtb3ZlQ2xhc3MoZC5vcHRpb25zLmRpYWxvZ0NsYXNzKS5hZGRDbGFzcygidWktZGlhbG9nIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsICIrYik7YnJlYWs7Y2FzZSAiZGlzYWJsZWQiOmI/Zi5hZGRDbGFzcygidWktZGlhbG9nLWRpc2FibGVkIik6Zi5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRpc2FibGVkIik7YnJlYWs7Y2FzZSAiZHJhZ2dhYmxlIjpiPwpkLl9tYWtlRHJhZ2dhYmxlKCk6Zi5kcmFnZ2FibGUoImRlc3Ryb3kiKTticmVhaztjYXNlICJoZWlnaHQiOmU9dHJ1ZTticmVhaztjYXNlICJtYXhIZWlnaHQiOmcmJmYucmVzaXphYmxlKCJvcHRpb24iLCJtYXhIZWlnaHQiLGIpO2U9dHJ1ZTticmVhaztjYXNlICJtYXhXaWR0aCI6ZyYmZi5yZXNpemFibGUoIm9wdGlvbiIsIm1heFdpZHRoIixiKTtlPXRydWU7YnJlYWs7Y2FzZSAibWluSGVpZ2h0IjpnJiZmLnJlc2l6YWJsZSgib3B0aW9uIiwibWluSGVpZ2h0IixiKTtlPXRydWU7YnJlYWs7Y2FzZSAibWluV2lkdGgiOmcmJmYucmVzaXphYmxlKCJvcHRpb24iLCJtaW5XaWR0aCIsYik7ZT10cnVlO2JyZWFrO2Nhc2UgInBvc2l0aW9uIjpkLl9wb3NpdGlvbihiKTticmVhaztjYXNlICJyZXNpemFibGUiOmcmJiFiJiZmLnJlc2l6YWJsZSgiZGVzdHJveSIpO2cmJnR5cGVvZiBiPT09InN0cmluZyImJmYucmVzaXphYmxlKCJvcHRpb24iLCJoYW5kbGVzIixiKTshZyYmYiE9PWZhbHNlJiYKZC5fbWFrZVJlc2l6YWJsZShiKTticmVhaztjYXNlICJ0aXRsZSI6YygiLnVpLWRpYWxvZy10aXRsZSIsZC51aURpYWxvZ1RpdGxlYmFyKS5odG1sKCIiKyhifHwiJiMxNjA7IikpO2JyZWFrO2Nhc2UgIndpZHRoIjplPXRydWU7YnJlYWt9Yy5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkoZCxhcmd1bWVudHMpO2UmJmQuX3NpemUoKX0sX3NpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMsYjt0aGlzLmVsZW1lbnQuY3NzKHt3aWR0aDoiYXV0byIsbWluSGVpZ2h0OjAsaGVpZ2h0OjB9KTtpZihhLm1pbldpZHRoPmEud2lkdGgpYS53aWR0aD1hLm1pbldpZHRoO2I9dGhpcy51aURpYWxvZy5jc3Moe2hlaWdodDoiYXV0byIsd2lkdGg6YS53aWR0aH0pLmhlaWdodCgpO3RoaXMuZWxlbWVudC5jc3MoYS5oZWlnaHQ9PT0iYXV0byI/e21pbkhlaWdodDpNYXRoLm1heChhLm1pbkhlaWdodC1iLDApLGhlaWdodDpjLnN1cHBvcnQubWluSGVpZ2h0PyJhdXRvIjpNYXRoLm1heChhLm1pbkhlaWdodC0KYiwwKX06e21pbkhlaWdodDowLGhlaWdodDpNYXRoLm1heChhLmhlaWdodC1iLDApfSkuc2hvdygpO3RoaXMudWlEaWFsb2cuaXMoIjpkYXRhKHJlc2l6YWJsZSkiKSYmdGhpcy51aURpYWxvZy5yZXNpemFibGUoIm9wdGlvbiIsIm1pbkhlaWdodCIsdGhpcy5fbWluSGVpZ2h0KCkpfX0pO2MuZXh0ZW5kKGMudWkuZGlhbG9nLHt2ZXJzaW9uOiIxLjguNSIsdXVpZDowLG1heFo6MCxnZXRUaXRsZUlkOmZ1bmN0aW9uKGEpe2E9YS5hdHRyKCJpZCIpO2lmKCFhKXt0aGlzLnV1aWQrPTE7YT10aGlzLnV1aWR9cmV0dXJuInVpLWRpYWxvZy10aXRsZS0iK2F9LG92ZXJsYXk6ZnVuY3Rpb24oYSl7dGhpcy4kZWw9Yy51aS5kaWFsb2cub3ZlcmxheS5jcmVhdGUoYSl9fSk7Yy5leHRlbmQoYy51aS5kaWFsb2cub3ZlcmxheSx7aW5zdGFuY2VzOltdLG9sZEluc3RhbmNlczpbXSxtYXhaOjAsZXZlbnRzOmMubWFwKCJmb2N1cyxtb3VzZWRvd24sbW91c2V1cCxrZXlkb3duLGtleXByZXNzLGNsaWNrIi5zcGxpdCgiLCIpLApmdW5jdGlvbihhKXtyZXR1cm4gYSsiLmRpYWxvZy1vdmVybGF5In0pLmpvaW4oIiAiKSxjcmVhdGU6ZnVuY3Rpb24oYSl7aWYodGhpcy5pbnN0YW5jZXMubGVuZ3RoPT09MCl7c2V0VGltZW91dChmdW5jdGlvbigpe2MudWkuZGlhbG9nLm92ZXJsYXkuaW5zdGFuY2VzLmxlbmd0aCYmYyhkb2N1bWVudCkuYmluZChjLnVpLmRpYWxvZy5vdmVybGF5LmV2ZW50cyxmdW5jdGlvbihkKXtpZihjKGQudGFyZ2V0KS56SW5kZXgoKTxjLnVpLmRpYWxvZy5vdmVybGF5Lm1heFopcmV0dXJuIGZhbHNlfSl9LDEpO2MoZG9jdW1lbnQpLmJpbmQoImtleWRvd24uZGlhbG9nLW92ZXJsYXkiLGZ1bmN0aW9uKGQpe2lmKGEub3B0aW9ucy5jbG9zZU9uRXNjYXBlJiZkLmtleUNvZGUmJmQua2V5Q29kZT09PWMudWkua2V5Q29kZS5FU0NBUEUpe2EuY2xvc2UoZCk7ZC5wcmV2ZW50RGVmYXVsdCgpfX0pO2Mod2luZG93KS5iaW5kKCJyZXNpemUuZGlhbG9nLW92ZXJsYXkiLGMudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKX12YXIgYj0KKHRoaXMub2xkSW5zdGFuY2VzLnBvcCgpfHxjKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS13aWRnZXQtb3ZlcmxheSIpKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5jc3Moe3dpZHRoOnRoaXMud2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWlnaHQoKX0pO2MuZm4uYmdpZnJhbWUmJmIuYmdpZnJhbWUoKTt0aGlzLmluc3RhbmNlcy5wdXNoKGIpO3JldHVybiBifSxkZXN0cm95OmZ1bmN0aW9uKGEpe3RoaXMub2xkSW5zdGFuY2VzLnB1c2godGhpcy5pbnN0YW5jZXMuc3BsaWNlKGMuaW5BcnJheShhLHRoaXMuaW5zdGFuY2VzKSwxKVswXSk7dGhpcy5pbnN0YW5jZXMubGVuZ3RoPT09MCYmYyhbZG9jdW1lbnQsd2luZG93XSkudW5iaW5kKCIuZGlhbG9nLW92ZXJsYXkiKTthLnJlbW92ZSgpO3ZhciBiPTA7Yy5lYWNoKHRoaXMuaW5zdGFuY2VzLGZ1bmN0aW9uKCl7Yj1NYXRoLm1heChiLHRoaXMuY3NzKCJ6LWluZGV4IikpfSk7dGhpcy5tYXhaPWJ9LGhlaWdodDpmdW5jdGlvbigpe3ZhciBhLApiO2lmKGMuYnJvd3Nlci5tc2llJiZjLmJyb3dzZXIudmVyc2lvbjw3KXthPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpO2I9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCk7cmV0dXJuIGE8Yj9jKHdpbmRvdykuaGVpZ2h0KCkrInB4IjphKyJweCJ9ZWxzZSByZXR1cm4gYyhkb2N1bWVudCkuaGVpZ2h0KCkrInB4In0sd2lkdGg6ZnVuY3Rpb24oKXt2YXIgYSxiO2lmKGMuYnJvd3Nlci5tc2llJiZjLmJyb3dzZXIudmVyc2lvbjw3KXthPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCxkb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoKTtiPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCxkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoKTtyZXR1cm4gYTwKYj9jKHdpbmRvdykud2lkdGgoKSsicHgiOmErInB4In1lbHNlIHJldHVybiBjKGRvY3VtZW50KS53aWR0aCgpKyJweCJ9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBhPWMoW10pO2MuZWFjaChjLnVpLmRpYWxvZy5vdmVybGF5Lmluc3RhbmNlcyxmdW5jdGlvbigpe2E9YS5hZGQodGhpcyl9KTthLmNzcyh7d2lkdGg6MCxoZWlnaHQ6MH0pLmNzcyh7d2lkdGg6Yy51aS5kaWFsb2cub3ZlcmxheS53aWR0aCgpLGhlaWdodDpjLnVpLmRpYWxvZy5vdmVybGF5LmhlaWdodCgpfSl9fSk7Yy5leHRlbmQoYy51aS5kaWFsb2cub3ZlcmxheS5wcm90b3R5cGUse2Rlc3Ryb3k6ZnVuY3Rpb24oKXtjLnVpLmRpYWxvZy5vdmVybGF5LmRlc3Ryb3kodGhpcy4kZWwpfX0pfSkoalF1ZXJ5KTsKOy8qCiAqIGpRdWVyeSBVSSBUYWJzIDEuOC41CiAqCiAqIENvcHlyaWdodCAyMDEwLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9UYWJzCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS51aS5jb3JlLmpzCiAqCWpxdWVyeS51aS53aWRnZXQuanMKICovCihmdW5jdGlvbihkLHApe2Z1bmN0aW9uIHUoKXtyZXR1cm4rK3Z9ZnVuY3Rpb24gdygpe3JldHVybisreH12YXIgdj0wLHg9MDtkLndpZGdldCgidWkudGFicyIse29wdGlvbnM6e2FkZDpudWxsLGFqYXhPcHRpb25zOm51bGwsY2FjaGU6ZmFsc2UsY29va2llOm51bGwsY29sbGFwc2libGU6ZmFsc2UsZGlzYWJsZTpudWxsLGRpc2FibGVkOltdLGVuYWJsZTpudWxsLGV2ZW50OiJjbGljayIsZng6bnVsbCxpZFByZWZpeDoidWktdGFicy0iLGxvYWQ6bnVsbCxwYW5lbFRlbXBsYXRlOiI8ZGl2PjwvZGl2PiIscmVtb3ZlOm51bGwsc2VsZWN0Om51bGwsc2hvdzpudWxsLHNwaW5uZXI6IjxlbT5Mb2FkaW5nJiM4MjMwOzwvZW0+Iix0YWJUZW1wbGF0ZToiPGxpPjxhIGhyZWY9JyN7aHJlZn0nPjxzcGFuPiN7bGFiZWx9PC9zcGFuPjwvYT48L2xpPiJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl90YWJpZnkodHJ1ZSl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxlKXtpZihhPT0ic2VsZWN0ZWQiKXRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSYmCmU9PXRoaXMub3B0aW9ucy5zZWxlY3RlZHx8dGhpcy5zZWxlY3QoZSk7ZWxzZXt0aGlzLm9wdGlvbnNbYV09ZTt0aGlzLl90YWJpZnkoKX19LF90YWJJZDpmdW5jdGlvbihhKXtyZXR1cm4gYS50aXRsZSYmYS50aXRsZS5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZSgvW15cd1x1MDBjMC1cdUZGRkYtXS9nLCIiKXx8dGhpcy5vcHRpb25zLmlkUHJlZml4K3UoKX0sX3Nhbml0aXplU2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvOi9nLCJcXDoiKX0sX2Nvb2tpZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY29va2llfHwodGhpcy5jb29raWU9dGhpcy5vcHRpb25zLmNvb2tpZS5uYW1lfHwidWktdGFicy0iK3coKSk7cmV0dXJuIGQuY29va2llLmFwcGx5KG51bGwsW2FdLmNvbmNhdChkLm1ha2VBcnJheShhcmd1bWVudHMpKSl9LF91aTpmdW5jdGlvbihhLGUpe3JldHVybnt0YWI6YSxwYW5lbDplLGluZGV4OnRoaXMuYW5jaG9ycy5pbmRleChhKX19LF9jbGVhbnVwOmZ1bmN0aW9uKCl7dGhpcy5saXMuZmlsdGVyKCIudWktc3RhdGUtcHJvY2Vzc2luZyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1wcm9jZXNzaW5nIikuZmluZCgic3BhbjpkYXRhKGxhYmVsLnRhYnMpIikuZWFjaChmdW5jdGlvbigpe3ZhciBhPQpkKHRoaXMpO2EuaHRtbChhLmRhdGEoImxhYmVsLnRhYnMiKSkucmVtb3ZlRGF0YSgibGFiZWwudGFicyIpfSl9LF90YWJpZnk6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShnLGYpe2cuY3NzKCJkaXNwbGF5IiwiIik7IWQuc3VwcG9ydC5vcGFjaXR5JiZmLm9wYWNpdHkmJmdbMF0uc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKX12YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zLGg9L14jLisvO3RoaXMubGlzdD10aGlzLmVsZW1lbnQuZmluZCgib2wsdWwiKS5lcSgwKTt0aGlzLmxpcz1kKCIgPiBsaTpoYXMoYVtocmVmXSkiLHRoaXMubGlzdCk7dGhpcy5hbmNob3JzPXRoaXMubGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBkKCJhIix0aGlzKVswXX0pO3RoaXMucGFuZWxzPWQoW10pO3RoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGcsZil7dmFyIGk9ZChmKS5hdHRyKCJocmVmIiksbD1pLnNwbGl0KCIjIilbMF0scTtpZihsJiYobD09PWxvY2F0aW9uLnRvU3RyaW5nKCkuc3BsaXQoIiMiKVswXXx8CihxPWQoImJhc2UiKVswXSkmJmw9PT1xLmhyZWYpKXtpPWYuaGFzaDtmLmhyZWY9aX1pZihoLnRlc3QoaSkpYi5wYW5lbHM9Yi5wYW5lbHMuYWRkKGIuX3Nhbml0aXplU2VsZWN0b3IoaSkpO2Vsc2UgaWYoaSYmaSE9PSIjIil7ZC5kYXRhKGYsImhyZWYudGFicyIsaSk7ZC5kYXRhKGYsImxvYWQudGFicyIsaS5yZXBsYWNlKC8jLiokLywiIikpO2k9Yi5fdGFiSWQoZik7Zi5ocmVmPSIjIitpO2Y9ZCgiIyIraSk7aWYoIWYubGVuZ3RoKXtmPWQoYy5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaSkuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmluc2VydEFmdGVyKGIucGFuZWxzW2ctMV18fGIubGlzdCk7Zi5kYXRhKCJkZXN0cm95LnRhYnMiLHRydWUpfWIucGFuZWxzPWIucGFuZWxzLmFkZChmKX1lbHNlIGMuZGlzYWJsZWQucHVzaChnKX0pO2lmKGEpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpOwp0aGlzLmxpc3QuYWRkQ2xhc3MoInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIik7dGhpcy5saXMuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpO3RoaXMucGFuZWxzLmFkZENsYXNzKCJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iKTtpZihjLnNlbGVjdGVkPT09cCl7bG9jYXRpb24uaGFzaCYmdGhpcy5hbmNob3JzLmVhY2goZnVuY3Rpb24oZyxmKXtpZihmLmhhc2g9PWxvY2F0aW9uLmhhc2gpe2Muc2VsZWN0ZWQ9ZztyZXR1cm4gZmFsc2V9fSk7aWYodHlwZW9mIGMuc2VsZWN0ZWQhPT0ibnVtYmVyIiYmYy5jb29raWUpYy5zZWxlY3RlZD1wYXJzZUludChiLl9jb29raWUoKSwxMCk7aWYodHlwZW9mIGMuc2VsZWN0ZWQhPT0ibnVtYmVyIiYmdGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpLmxlbmd0aCljLnNlbGVjdGVkPQp0aGlzLmxpcy5pbmRleCh0aGlzLmxpcy5maWx0ZXIoIi51aS10YWJzLXNlbGVjdGVkIikpO2Muc2VsZWN0ZWQ9Yy5zZWxlY3RlZHx8KHRoaXMubGlzLmxlbmd0aD8wOi0xKX1lbHNlIGlmKGMuc2VsZWN0ZWQ9PT1udWxsKWMuc2VsZWN0ZWQ9LTE7Yy5zZWxlY3RlZD1jLnNlbGVjdGVkPj0wJiZ0aGlzLmFuY2hvcnNbYy5zZWxlY3RlZF18fGMuc2VsZWN0ZWQ8MD9jLnNlbGVjdGVkOjA7Yy5kaXNhYmxlZD1kLnVuaXF1ZShjLmRpc2FibGVkLmNvbmNhdChkLm1hcCh0aGlzLmxpcy5maWx0ZXIoIi51aS1zdGF0ZS1kaXNhYmxlZCIpLGZ1bmN0aW9uKGcpe3JldHVybiBiLmxpcy5pbmRleChnKX0pKSkuc29ydCgpO2QuaW5BcnJheShjLnNlbGVjdGVkLGMuZGlzYWJsZWQpIT0tMSYmYy5kaXNhYmxlZC5zcGxpY2UoZC5pbkFycmF5KGMuc2VsZWN0ZWQsYy5kaXNhYmxlZCksMSk7dGhpcy5wYW5lbHMuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpO3RoaXMubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpOwppZihjLnNlbGVjdGVkPj0wJiZ0aGlzLmFuY2hvcnMubGVuZ3RoKXt0aGlzLnBhbmVscy5lcShjLnNlbGVjdGVkKS5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIik7dGhpcy5saXMuZXEoYy5zZWxlY3RlZCkuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIik7Yi5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe2IuX3RyaWdnZXIoInNob3ciLG51bGwsYi5fdWkoYi5hbmNob3JzW2Muc2VsZWN0ZWRdLGIucGFuZWxzW2Muc2VsZWN0ZWRdKSl9KTt0aGlzLmxvYWQoYy5zZWxlY3RlZCl9ZCh3aW5kb3cpLmJpbmQoInVubG9hZCIsZnVuY3Rpb24oKXtiLmxpcy5hZGQoYi5hbmNob3JzKS51bmJpbmQoIi50YWJzIik7Yi5saXM9Yi5hbmNob3JzPWIucGFuZWxzPW51bGx9KX1lbHNlIGMuc2VsZWN0ZWQ9dGhpcy5saXMuaW5kZXgodGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpKTt0aGlzLmVsZW1lbnRbYy5jb2xsYXBzaWJsZT8iYWRkQ2xhc3MiOgoicmVtb3ZlQ2xhc3MiXSgidWktdGFicy1jb2xsYXBzaWJsZSIpO2MuY29va2llJiZ0aGlzLl9jb29raWUoYy5zZWxlY3RlZCxjLmNvb2tpZSk7YT0wO2Zvcih2YXIgajtqPXRoaXMubGlzW2FdO2ErKylkKGopW2QuaW5BcnJheShhLGMuZGlzYWJsZWQpIT0tMSYmIWQoaikuaGFzQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQiKT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpO2MuY2FjaGU9PT1mYWxzZSYmdGhpcy5hbmNob3JzLnJlbW92ZURhdGEoImNhY2hlLnRhYnMiKTt0aGlzLmxpcy5hZGQodGhpcy5hbmNob3JzKS51bmJpbmQoIi50YWJzIik7aWYoYy5ldmVudCE9PSJtb3VzZW92ZXIiKXt2YXIgaz1mdW5jdGlvbihnLGYpe2YuaXMoIjpub3QoLnVpLXN0YXRlLWRpc2FibGVkKSIpJiZmLmFkZENsYXNzKCJ1aS1zdGF0ZS0iK2cpfSxuPWZ1bmN0aW9uKGcsZil7Zi5yZW1vdmVDbGFzcygidWktc3RhdGUtIitnKX07dGhpcy5saXMuYmluZCgibW91c2VvdmVyLnRhYnMiLApmdW5jdGlvbigpe2soImhvdmVyIixkKHRoaXMpKX0pO3RoaXMubGlzLmJpbmQoIm1vdXNlb3V0LnRhYnMiLGZ1bmN0aW9uKCl7bigiaG92ZXIiLGQodGhpcykpfSk7dGhpcy5hbmNob3JzLmJpbmQoImZvY3VzLnRhYnMiLGZ1bmN0aW9uKCl7aygiZm9jdXMiLGQodGhpcykuY2xvc2VzdCgibGkiKSl9KTt0aGlzLmFuY2hvcnMuYmluZCgiYmx1ci50YWJzIixmdW5jdGlvbigpe24oImZvY3VzIixkKHRoaXMpLmNsb3Nlc3QoImxpIikpfSl9dmFyIG0sbztpZihjLmZ4KWlmKGQuaXNBcnJheShjLmZ4KSl7bT1jLmZ4WzBdO289Yy5meFsxXX1lbHNlIG09bz1jLmZ4O3ZhciByPW8/ZnVuY3Rpb24oZyxmKXtkKGcpLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIik7Zi5oaWRlKCkucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLmFuaW1hdGUobyxvLmR1cmF0aW9ufHwibm9ybWFsIixmdW5jdGlvbigpe2UoZixvKTtiLl90cmlnZ2VyKCJzaG93IiwKbnVsbCxiLl91aShnLGZbMF0pKX0pfTpmdW5jdGlvbihnLGYpe2QoZykuY2xvc2VzdCgibGkiKS5hZGRDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKTtmLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWhpZGUiKTtiLl90cmlnZ2VyKCJzaG93IixudWxsLGIuX3VpKGcsZlswXSkpfSxzPW0/ZnVuY3Rpb24oZyxmKXtmLmFuaW1hdGUobSxtLmR1cmF0aW9ufHwibm9ybWFsIixmdW5jdGlvbigpe2IubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpO2YuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpO2UoZixtKTtiLmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpfSl9OmZ1bmN0aW9uKGcsZil7Yi5saXMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIik7Zi5hZGRDbGFzcygidWktdGFicy1oaWRlIik7Yi5lbGVtZW50LmRlcXVldWUoInRhYnMiKX07dGhpcy5hbmNob3JzLmJpbmQoYy5ldmVudCsiLnRhYnMiLApmdW5jdGlvbigpe3ZhciBnPXRoaXMsZj1kKGcpLmNsb3Nlc3QoImxpIiksaT1iLnBhbmVscy5maWx0ZXIoIjpub3QoLnVpLXRhYnMtaGlkZSkiKSxsPWQoYi5fc2FuaXRpemVTZWxlY3RvcihnLmhhc2gpKTtpZihmLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikmJiFjLmNvbGxhcHNpYmxlfHxmLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHxmLmhhc0NsYXNzKCJ1aS1zdGF0ZS1wcm9jZXNzaW5nIil8fGIucGFuZWxzLmZpbHRlcigiOmFuaW1hdGVkIikubGVuZ3RofHxiLl90cmlnZ2VyKCJzZWxlY3QiLG51bGwsYi5fdWkodGhpcyxsWzBdKSk9PT1mYWxzZSl7dGhpcy5ibHVyKCk7cmV0dXJuIGZhbHNlfWMuc2VsZWN0ZWQ9Yi5hbmNob3JzLmluZGV4KHRoaXMpO2IuYWJvcnQoKTtpZihjLmNvbGxhcHNpYmxlKWlmKGYuaGFzQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQiKSl7Yy5zZWxlY3RlZD0tMTtjLmNvb2tpZSYmYi5fY29va2llKGMuc2VsZWN0ZWQsYy5jb29raWUpO2IuZWxlbWVudC5xdWV1ZSgidGFicyIsCmZ1bmN0aW9uKCl7cyhnLGkpfSkuZGVxdWV1ZSgidGFicyIpO3RoaXMuYmx1cigpO3JldHVybiBmYWxzZX1lbHNlIGlmKCFpLmxlbmd0aCl7Yy5jb29raWUmJmIuX2Nvb2tpZShjLnNlbGVjdGVkLGMuY29va2llKTtiLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7cihnLGwpfSk7Yi5sb2FkKGIuYW5jaG9ycy5pbmRleCh0aGlzKSk7dGhpcy5ibHVyKCk7cmV0dXJuIGZhbHNlfWMuY29va2llJiZiLl9jb29raWUoYy5zZWxlY3RlZCxjLmNvb2tpZSk7aWYobC5sZW5ndGgpe2kubGVuZ3RoJiZiLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7cyhnLGkpfSk7Yi5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe3IoZyxsKX0pO2IubG9hZChiLmFuY2hvcnMuaW5kZXgodGhpcykpfWVsc2UgdGhyb3cialF1ZXJ5IFVJIFRhYnM6IE1pc21hdGNoaW5nIGZyYWdtZW50IGlkZW50aWZpZXIuIjtkLmJyb3dzZXIubXNpZSYmdGhpcy5ibHVyKCl9KTt0aGlzLmFuY2hvcnMuYmluZCgiY2xpY2sudGFicyIsCmZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlfSl9LF9nZXRJbmRleDpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09InN0cmluZyIpYT10aGlzLmFuY2hvcnMuaW5kZXgodGhpcy5hbmNob3JzLmZpbHRlcigiW2hyZWYkPSIrYSsiXSIpKTtyZXR1cm4gYX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9uczt0aGlzLmFib3J0KCk7dGhpcy5lbGVtZW50LnVuYmluZCgiLnRhYnMiKS5yZW1vdmVDbGFzcygidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS10YWJzLWNvbGxhcHNpYmxlIikucmVtb3ZlRGF0YSgidGFicyIpO3RoaXMubGlzdC5yZW1vdmVDbGFzcygidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiKTt0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWQuZGF0YSh0aGlzLCJocmVmLnRhYnMiKTtpZihlKXRoaXMuaHJlZj0KZTt2YXIgYj1kKHRoaXMpLnVuYmluZCgiLnRhYnMiKTtkLmVhY2goWyJocmVmIiwibG9hZCIsImNhY2hlIl0sZnVuY3Rpb24oYyxoKXtiLnJlbW92ZURhdGEoaCsiLnRhYnMiKX0pfSk7dGhpcy5saXMudW5iaW5kKCIudGFicyIpLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2QuZGF0YSh0aGlzLCJkZXN0cm95LnRhYnMiKT9kKHRoaXMpLnJlbW92ZSgpOmQodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCB1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1ob3ZlciB1aS1zdGF0ZS1mb2N1cyB1aS1zdGF0ZS1kaXNhYmxlZCB1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20gdWktdGFicy1oaWRlIil9KTthLmNvb2tpZSYmdGhpcy5fY29va2llKG51bGwsYS5jb29raWUpO3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSxlLGIpe2lmKGI9PT1wKWI9dGhpcy5hbmNob3JzLmxlbmd0aDsKdmFyIGM9dGhpcyxoPXRoaXMub3B0aW9ucztlPWQoaC50YWJUZW1wbGF0ZS5yZXBsYWNlKC8jXHtocmVmXH0vZyxhKS5yZXBsYWNlKC8jXHtsYWJlbFx9L2csZSkpO2E9IWEuaW5kZXhPZigiIyIpP2EucmVwbGFjZSgiIyIsIiIpOnRoaXMuX3RhYklkKGQoImEiLGUpWzBdKTtlLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiKS5kYXRhKCJkZXN0cm95LnRhYnMiLHRydWUpO3ZhciBqPWQoIiMiK2EpO2oubGVuZ3RofHwoaj1kKGgucGFuZWxUZW1wbGF0ZSkuYXR0cigiaWQiLGEpLmRhdGEoImRlc3Ryb3kudGFicyIsdHJ1ZSkpO2ouYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS10YWJzLWhpZGUiKTtpZihiPj10aGlzLmxpcy5sZW5ndGgpe2UuYXBwZW5kVG8odGhpcy5saXN0KTtqLmFwcGVuZFRvKHRoaXMubGlzdFswXS5wYXJlbnROb2RlKX1lbHNle2UuaW5zZXJ0QmVmb3JlKHRoaXMubGlzW2JdKTsKai5pbnNlcnRCZWZvcmUodGhpcy5wYW5lbHNbYl0pfWguZGlzYWJsZWQ9ZC5tYXAoaC5kaXNhYmxlZCxmdW5jdGlvbihrKXtyZXR1cm4gaz49Yj8rK2s6a30pO3RoaXMuX3RhYmlmeSgpO2lmKHRoaXMuYW5jaG9ycy5sZW5ndGg9PTEpe2guc2VsZWN0ZWQ9MDtlLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpO2oucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpO3RoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtjLl90cmlnZ2VyKCJzaG93IixudWxsLGMuX3VpKGMuYW5jaG9yc1swXSxjLnBhbmVsc1swXSkpfSk7dGhpcy5sb2FkKDApfXRoaXMuX3RyaWdnZXIoImFkZCIsbnVsbCx0aGlzLl91aSh0aGlzLmFuY2hvcnNbYl0sdGhpcy5wYW5lbHNbYl0pKTtyZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKGEpe2E9dGhpcy5fZ2V0SW5kZXgoYSk7dmFyIGU9dGhpcy5vcHRpb25zLGI9dGhpcy5saXMuZXEoYSkucmVtb3ZlKCksYz10aGlzLnBhbmVscy5lcShhKS5yZW1vdmUoKTsKaWYoYi5oYXNDbGFzcygidWktdGFicy1zZWxlY3RlZCIpJiZ0aGlzLmFuY2hvcnMubGVuZ3RoPjEpdGhpcy5zZWxlY3QoYSsoYSsxPHRoaXMuYW5jaG9ycy5sZW5ndGg/MTotMSkpO2UuZGlzYWJsZWQ9ZC5tYXAoZC5ncmVwKGUuZGlzYWJsZWQsZnVuY3Rpb24oaCl7cmV0dXJuIGghPWF9KSxmdW5jdGlvbihoKXtyZXR1cm4gaD49YT8tLWg6aH0pO3RoaXMuX3RhYmlmeSgpO3RoaXMuX3RyaWdnZXIoInJlbW92ZSIsbnVsbCx0aGlzLl91aShiLmZpbmQoImEiKVswXSxjWzBdKSk7cmV0dXJuIHRoaXN9LGVuYWJsZTpmdW5jdGlvbihhKXthPXRoaXMuX2dldEluZGV4KGEpO3ZhciBlPXRoaXMub3B0aW9ucztpZihkLmluQXJyYXkoYSxlLmRpc2FibGVkKSE9LTEpe3RoaXMubGlzLmVxKGEpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpO2UuZGlzYWJsZWQ9ZC5ncmVwKGUuZGlzYWJsZWQsZnVuY3Rpb24oYil7cmV0dXJuIGIhPWF9KTt0aGlzLl90cmlnZ2VyKCJlbmFibGUiLG51bGwsCnRoaXMuX3VpKHRoaXMuYW5jaG9yc1thXSx0aGlzLnBhbmVsc1thXSkpO3JldHVybiB0aGlzfX0sZGlzYWJsZTpmdW5jdGlvbihhKXthPXRoaXMuX2dldEluZGV4KGEpO3ZhciBlPXRoaXMub3B0aW9ucztpZihhIT1lLnNlbGVjdGVkKXt0aGlzLmxpcy5lcShhKS5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKTtlLmRpc2FibGVkLnB1c2goYSk7ZS5kaXNhYmxlZC5zb3J0KCk7dGhpcy5fdHJpZ2dlcigiZGlzYWJsZSIsbnVsbCx0aGlzLl91aSh0aGlzLmFuY2hvcnNbYV0sdGhpcy5wYW5lbHNbYV0pKX1yZXR1cm4gdGhpc30sc2VsZWN0OmZ1bmN0aW9uKGEpe2E9dGhpcy5fZ2V0SW5kZXgoYSk7aWYoYT09LTEpaWYodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlJiZ0aGlzLm9wdGlvbnMuc2VsZWN0ZWQhPS0xKWE9dGhpcy5vcHRpb25zLnNlbGVjdGVkO2Vsc2UgcmV0dXJuIHRoaXM7dGhpcy5hbmNob3JzLmVxKGEpLnRyaWdnZXIodGhpcy5vcHRpb25zLmV2ZW50KyIudGFicyIpO3JldHVybiB0aGlzfSwKbG9hZDpmdW5jdGlvbihhKXthPXRoaXMuX2dldEluZGV4KGEpO3ZhciBlPXRoaXMsYj10aGlzLm9wdGlvbnMsYz10aGlzLmFuY2hvcnMuZXEoYSlbMF0saD1kLmRhdGEoYywibG9hZC50YWJzIik7dGhpcy5hYm9ydCgpO2lmKCFofHx0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiKS5sZW5ndGghPT0wJiZkLmRhdGEoYywiY2FjaGUudGFicyIpKXRoaXMuZWxlbWVudC5kZXF1ZXVlKCJ0YWJzIik7ZWxzZXt0aGlzLmxpcy5lcShhKS5hZGRDbGFzcygidWktc3RhdGUtcHJvY2Vzc2luZyIpO2lmKGIuc3Bpbm5lcil7dmFyIGo9ZCgic3BhbiIsYyk7ai5kYXRhKCJsYWJlbC50YWJzIixqLmh0bWwoKSkuaHRtbChiLnNwaW5uZXIpfXRoaXMueGhyPWQuYWpheChkLmV4dGVuZCh7fSxiLmFqYXhPcHRpb25zLHt1cmw6aCxzdWNjZXNzOmZ1bmN0aW9uKGssbil7ZChlLl9zYW5pdGl6ZVNlbGVjdG9yKGMuaGFzaCkpLmh0bWwoayk7ZS5fY2xlYW51cCgpO2IuY2FjaGUmJmQuZGF0YShjLCJjYWNoZS50YWJzIiwKdHJ1ZSk7ZS5fdHJpZ2dlcigibG9hZCIsbnVsbCxlLl91aShlLmFuY2hvcnNbYV0sZS5wYW5lbHNbYV0pKTt0cnl7Yi5hamF4T3B0aW9ucy5zdWNjZXNzKGssbil9Y2F0Y2gobSl7fX0sZXJyb3I6ZnVuY3Rpb24oayxuKXtlLl9jbGVhbnVwKCk7ZS5fdHJpZ2dlcigibG9hZCIsbnVsbCxlLl91aShlLmFuY2hvcnNbYV0sZS5wYW5lbHNbYV0pKTt0cnl7Yi5hamF4T3B0aW9ucy5lcnJvcihrLG4sYSxjKX1jYXRjaChtKXt9fX0pKTtlLmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpO3JldHVybiB0aGlzfX0sYWJvcnQ6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucXVldWUoW10pO3RoaXMucGFuZWxzLnN0b3AoZmFsc2UsdHJ1ZSk7dGhpcy5lbGVtZW50LnF1ZXVlKCJ0YWJzIix0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiKS5zcGxpY2UoLTIsMikpO2lmKHRoaXMueGhyKXt0aGlzLnhoci5hYm9ydCgpO2RlbGV0ZSB0aGlzLnhocn10aGlzLl9jbGVhbnVwKCk7cmV0dXJuIHRoaXN9LHVybDpmdW5jdGlvbihhLAplKXt0aGlzLmFuY2hvcnMuZXEoYSkucmVtb3ZlRGF0YSgiY2FjaGUudGFicyIpLmRhdGEoImxvYWQudGFicyIsZSk7cmV0dXJuIHRoaXN9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuY2hvcnMubGVuZ3RofX0pO2QuZXh0ZW5kKGQudWkudGFicyx7dmVyc2lvbjoiMS44LjUifSk7ZC5leHRlbmQoZC51aS50YWJzLnByb3RvdHlwZSx7cm90YXRpb246bnVsbCxyb3RhdGU6ZnVuY3Rpb24oYSxlKXt2YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zLGg9Yi5fcm90YXRlfHwoYi5fcm90YXRlPWZ1bmN0aW9uKGope2NsZWFyVGltZW91dChiLnJvdGF0aW9uKTtiLnJvdGF0aW9uPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgaz1jLnNlbGVjdGVkO2Iuc2VsZWN0KCsrazxiLmFuY2hvcnMubGVuZ3RoP2s6MCl9LGEpO2omJmouc3RvcFByb3BhZ2F0aW9uKCl9KTtlPWIuX3Vucm90YXRlfHwoYi5fdW5yb3RhdGU9IWU/ZnVuY3Rpb24oail7ai5jbGllbnRYJiZiLnJvdGF0ZShudWxsKX06CmZ1bmN0aW9uKCl7dD1jLnNlbGVjdGVkO2goKX0pO2lmKGEpe3RoaXMuZWxlbWVudC5iaW5kKCJ0YWJzc2hvdyIsaCk7dGhpcy5hbmNob3JzLmJpbmQoYy5ldmVudCsiLnRhYnMiLGUpO2goKX1lbHNle2NsZWFyVGltZW91dChiLnJvdGF0aW9uKTt0aGlzLmVsZW1lbnQudW5iaW5kKCJ0YWJzc2hvdyIsaCk7dGhpcy5hbmNob3JzLnVuYmluZChjLmV2ZW50KyIudGFicyIsZSk7ZGVsZXRlIHRoaXMuX3JvdGF0ZTtkZWxldGUgdGhpcy5fdW5yb3RhdGV9cmV0dXJuIHRoaXN9fSl9KShqUXVlcnkpOwo7]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/touchInlineEditInstance.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqICRJZDogdG91Y2hJbmxpbmVFZGl0LmpzIDE0MSAyMDExLTAxLTA5IDE5OjE4OjU3WiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBNb2R1bGUKICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjguMAogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqCiAqIAogKiAtLQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogKiBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiAqCiAqLwoKZnVuY3Rpb24gdG91Y2hJbmxpbmVFZGl0SW5zdGFuY2UoaWQsYmxvY2ssc2VsZWN0b3IpewogIAogIC8qKgogICAqIFNlbGYgaW5zdGFuY2UuCiAgICogQHZhciBvYmplY3QKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLyAKICB2YXIgc2VsZiA9IHRoaXM7CgogIC8qKgogICAqIFBhZ2UgaWQuCiAgICogQHZhciBpbnRlZ2VyCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gCiAgdGhpcy5pZCA9IGlkOwogIAogIC8qKgogICAqIFBhZ2UgYmxvY2suCiAgICogQHZhciBuYW1lCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gCiAgdGhpcy5ibG9jayA9IGJsb2NrOwogIAogIC8qKgogICAqIFNlbGVjdG9yIGh0bWwgaWQuCiAgICogQHZhciBpbnRlZ2VyCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gCiAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOwogIAogIC8qKgogICAqIEVkaXRvciBpbnN0YW5jZS4KICAgKiBAdmFyIG9iamVjdAogICAqIEBhY2Nlc3MgcHVibGljCiAgICovIAogIHRoaXMuZWRpdG9yOwoKICAvKioKICAgKiBDb25zdHJ1Y3QgZWRpdG9yIGluc3RhbmNlLgogICAqLwogIHRoaXMuX19jb25zdHJ1Y3QgPSBmdW5jdGlvbigpCiAgewogICAgLy9jb25zb2xlLmRlYnVnKCdDb25zdHJ1Y3QgJyArIHNlbGYuYmxvY2spOwogICAgc2VsZi5lZGl0b3IgPSBuZXcgZWxSVEUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5zZWxlY3RvciksCiAgICAgIHsKICAgICAgICBjc3NDbGFzczogJ2VsLXJ0ZScsCiAgICAgICAgbGFuZzogJ2VuJywKICAgICAgICB0b29sYmFyOiB0b3VjaElubGluZUVkaXQuZ2V0UGFyYW0oJ3Rvb2xiYXInKSwKICAgICAgICBjc3NmaWxlczogWydjc3MvZWxydGUtaW5uZXIuY3NzJ10KICAgICAgfQogICAgKTsKICAgIC8vIEFkZCBzYXZlIGhhbmRsZXIKICAgIGVsUlRFLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24oKXsKICAgICAgc2VsZi5zYXZlKHRoaXMuZmlsdGVyLnNvdXJjZSgkKHRoaXMuZG9jLmJvZHkpLmh0bWwoKSkpOwogICAgfTsKICB9CgogIC8qKgogICAqIFNhdmUgY29udGVudHMuCiAgICovCiAgdGhpcy5zYXZlID0gZnVuY3Rpb24oY29udGVudCkKICB7CiAgICBjb25zb2xlLmRlYnVnKCdTYXZlICcgKyBzZWxmLmJsb2NrKTsKICAgIHRvdWNoSW5saW5lRWRpdC5zYXZlKHNlbGYuaWQsc2VsZi5ibG9jayxzZWxmLnNlbGVjdG9yLGNvbnRlbnQpOwogIH0KCiAgLyoqCiAgICogRGVzdHJ1Y3QgZWRpdG9yIGluc3RhbmNlLgogICAqLwogIHRoaXMuX19kZXN0cnVjdCA9IGZ1bmN0aW9uKCkKICB7CiAgICAvL2NvbnNvbGUuZGVidWcoJ0Rlc3RydWN0ICcgKyBzZWxmLmJsb2NrKTsKICAgIHNlbGYuZWRpdG9yLmVkaXRvci5oaWRlKCk7IC8vIFJlbW92ZSBlZGl0b3IKICAgIHNlbGYuZWRpdG9yLmVkaXRvci5wcmV2KCkuc2hvdygpOyAvLyBEaXNwbGF5IGRpdgogIH0KCn0K]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAe0lEQVRoge3OMQHAIBAAMcC/kjdZJHTI0A4XBdkz86wfO18H3hRUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUF8O8A8WdY6opAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAeUlEQVRoge3OMQHAIBAAsVL/nh8JDDfAkCjImpn5HvbfDpwIVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVhtqiwTEKTLXTgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAP0lEQVQ4je3PMQrAMABC0a/3v2zX0mCXNkOgc6C4PARd5DqPGKCU8luS8SbAQhiCQRgJE56kZTfbbP9RSvnkBsWcEAZRWcgqAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAMElEQVQ4je3LIQ4AIBTD0O3f/8wrFgmKhMy8pKJKwkhSKeVbbGuAPU9f4PIopTxgAeS0DRtI4yK0AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANklEQVQ4jWN48uTJfyYGBgaGUWKUGCWGLfHt2zcoi5GREYNgYmJCZiG42IiB98woMUqMEtgIAMdjCdyg+eEBAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANUlEQVQ4je3LMQoAIBADwb38/6t5wFXaWAiCtUiaYZvF9hBACOFbuntVVe11B0CSjjeE8BwThQIJ8dhEl0YAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAPklEQVQ4je3PMQqAMABD0Z/c/7aCIAXjJIhD10LJ8vgZw30eMUApZV/GhZNgSTjoLYElY/hNMJ/S6gullCkPiCIPCr4NiEwAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAABkCAYAAABHLFpgAAAALElEQVQYlWN49OjRfyYGBgaGIUT8//8fSqBx0Yh///4RL8vAwAAVQ2MNOwIAl6g6KkOJwk8AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-icons_2e83ff_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAAGvTnpvAAAA7VBMVEUsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvzLrJBNAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAATX0lEQVR4nO1dC2PbthEGyUpaqJii/JgbZ3bTLNmyJns/Oi1bM7vp0q7r/f+fM+JxwOEAkNTTSoxPlqHD83AE7gAQBIUYBHSfQv0XnbsJgH02A3g5ibVzDFNtlkPI1VjIuOUa8eMclOLS1uRSPBETURnOrkbmID9T9fuPyu+cSGYYKya5efeddN9TRS1H8eD4kDjrPutBpptt2apkiqX57A4gfloj7ua9AXMQ3dWvNs8n7NCwZk6bqYSg1CgNsaCBHDAluMQjcihEWBNYSxamUYNMs15KmwMUKhm0S5UBwMQFjcqxelSYskHBtLC26X7/eWQtVB1MaWXzF1OrUyhLgOrFiBwalDwg6+tigfzbnNbM40UlTrrO3clTftcuX7jyY9gkv81RVWI9K0OxNa8Hruw+EFctu6xaqDhCGkjQ2hyMitiXKyR+7xSqx6u6AitlpI3wrBj5OSo5xv8ZShoq5VZE+p/hb/OVzuPHyHGXQLoug9b4af/OzArAqtlvq8PidqZSflOYigVIpTZ33192wQ1jHVXLgjWWeZdAfhn3UteqH43NI9EGSjns7CJ//g8h6o6++UrLBTrOZJUkhy4NxDNAblZld53kJZl34z4jE5cB0HbA5RHnzg9Txud28wwG4aS1pwzKH7t/IyxlEvW2XVQLcf0vyeCWfL9j39vk95iA1alinhtmcHDr34tiSDECRgCXwFMgynMfrB0PlAxMhdUoPyKDo7qq2yNZHa+Li9BQoynz/I9DNkNcFCQSVi2aQbTOJA7S1tIXYpwM9t+PgBYzwFI0mNdt9JjxuGBHXJuwuJO+fq8KYzpDLtDll1XoYZ6k53P9dUNdNzwQZTcsvLw0Cafa0snfyq/WGVUVDo/VxBxXF5ynLZn6zUO/FvTIdjeiw3VUeyUqv7Q5+dIiz+W/VoTs03r+4U/ERpyHVbkIFAU44dGMKQBZfrwrGeAl4litNO9TVGFXRN1TDlfTyGVqdQaVEV7T0ZNJGO/NTQ9nL18aDk29b2Ui2SaqfhltIIMn4gpz+k+TiNNXkjf0LYWzf+DXO4UzHuF49WYS9pIIN3mjcoga1CNDuZ3kKzlja00XXS71OHFZjBhkI1K98WCQ/QC/r9n3qudrYVVea6aE9iP8L1A/KnWuJMZ+jwiyz+P3SFkcguW26os1MoON1p+35uAIgB3fXnzm2hscgvkD0PBi23t8YcEsP2u+gEUvdsXAg4VrA0y2zD/ZBgCjbz07ZNd4bBvYHQMPFcBFznsTv/hBOj9hkE0yvyRHcYZCK5VoEwGHQwU+dJBlX08BOMGx8MBk+I2oMHdQbLZFkGDADfVBQcmCx8Nb6S6fwJqRehFktWEAVsSA0yNP5DQm8wcW6tNr9D/T6PzGVgS2gP3iCoyPB/L4YF2A2ZICUKoZI06GSjdZYhdlxzeOLANIWxfoGkaofzK2BDRlWaq76VMAuRDbiXyhQiYTtV1L7hBS64vLpRJ/xbYMQRcPVPRT4802P5ruaHvrAv3BtDmzxwz3IsFcru92uL4GysByOVV7H4Rx7Xaqax2xvqiNEQId74svvjAcglfgwis/o+vnFdpxsCJHV8uomprlYHfNpPvrV79B4+G75+dG5i3NEGBh0+urAGWrXZ1uItAYmWJNQl28cCs1pd6/AX+c/Q0znEddU8OOLjEDWWF4qcsp8d7DgweI1Vv85bs8or6kK+g+8scLc22/Ed/oVI3WF9iGKrNzybSd8sQsS9u2sFyqiPXbaWpgH2Xg3x0Dclm+whsRABfKOXlh2tCpCqhMo3wGz54pBkxbsAxUN0ejCKbq/xXAt/dS/BPA9VC+EFC6jiTkrS8w3Raj+Sp2U/vcdFdGprxDRcPbAOa7LwYyOtEZlWh08EyUjdA/GtU4Gjs+bDxRN0bi6HbezUEZQGzNwIMHiB+NDMugG1UD7o4YwLne9MIbbEYGKNT9dIA2gLs/ALzrc1PphlwOAO/BC/n7Vk/DuL+lE67wdleAuQEH8sEik0/U0KMNuDMF3XWkvO3+wdDEFZQm6Vh6pAX47qfXeHYGMwcMXHc/wHc/PQYyAslWXNUPjNf3xEAlocNxqJjbQEYcW6sHO6bEH/6+VSgKf75S2AReOLiEa5Y/dEuF3/yKd0ootu+mvgQCzYt04TNUmPsNG0tga4ze+ZSRkYK3DiJCPYDdAb2ZHiiA78JZt/yge6XcIk67fLbVA1jASD1QILmlBDIy9o7Bxsn1APMeG5/b6SB9cHc9sO9sApTgPNXfXbJUuC2AxWPjjUiOzI3Hc8UmphFJCWQ8eAwehjEYbs2338j4cD+Vn4vgNfOwURsvXhxPDzwDay39+UVkOhCsiHrhwPovDyfxPIXC0xVJPeBqWlCPgvVzJ0FWgPEtyGZUxuCe9MB9zUcydgZ7BdksfFhBGKTM8tg2BkGHTlnJuEKx/d56r9m6gRXF7+ByBiJW11NAm8AoCKvj9HyfP7SfkkAwkjq0nc/jio8frDsFw+P0cYU7uvrh4NWz53avCrHwyOAuOAhvZiV6HVMIUk/uyA6GEwJGl0bReIzu8CZc0AY44o0gd/9PBvIcKObhX91HzAPMHrUK2L0tqD/T/oAbEAVx56B3qorHj9VZBNJHBTSN2lQrThpbkD4EC/RmWWQAhN78BuA2yanYE9x9e1pp9+yMdWug0QXeRJ+b8krTnxr80fGjU1xeegxMBSx1Rrr8EnS8y0t5aIIQ9RN9auPZZHJmJOXNM9w8QTEwh8efewwUGHE+n+uI1zpDZKCaLpfGVcGV2b173UGlr29qUk6EgQml57CQG4QcA5TRn1EJGgbsFlOMv4AFnbEALxBdvgfNVlSXn3EMAF/XRwaVyuM5wHNFJFp3uM8A82HXGs7NjxbbRlWKSCMSv/rVCWUgCEfU5jH8Whh3ot1WNz6WbmHTT1vbzSvKgBXBye+/NByKSEYSqpteGwauDQPXhoGW9PvGT69OZr2wvcNUcHph+gXwGgvGgFZATy8vvxby0FPtz11Tf93Pjat3eL9UbtvagQ+qWkfjIwhO/iLZBsC/zWFdc4G1itWc6Lb2WDcKy2DG/aMO1vH6R3t27PjCtIXpP75Wrum0V1/Bjc5GWc2paSvKVSeR8940C1az4gykFNA34hvQJXkPVGDrh6py4wHtoY1Y+WapTwOfBt3Ob+WkQI9BG28+V/sLG+N/bgYypUt/Kt0XZsemTffmjcloOqs3kACgNcVN+ivQjx24eYRO9uwZPMOKUAlMb27YyT4DDJBoOh/HmXbeGkl+hTnp55W6SyA1ZroNZJjnG8S3AGPO9t89njijpTk4Mw+ruUs0avB2BrDuEf+mHHnAE2mlfBlAdjBjThWFg8z2++/ZAw+btanGdivMqTEVhlea0uW7ckrbzTw9UZ2dbbTjWz3h0RgG7igDlkEzTBiQwKbdStXgTB7hhRlYCQiPzMhIAxvLpsnBNjrVrRqhH3ppSv1jpg8nlP9mJoGJj+lM2910mZzNBwDMdn0xw+410wzMfIXDxiWb27aNJeAy0PHvb0PAlm0g497xX3iqXIDt3mO0KVb/A2FGszM8bg9GfHcGm2EN+KCVHh8sl4V+mL7Qy3MAS/NwPezy9UJi1op2pjkxi7ZuJWPR4+4O7+H9TvPLWBs4H+DuO4Af+txUuiGXQ40JrxLu6wE3la7HjTCgmz3OC9TDdhDxd0/Tob+I+/PvTz9h/JuYAjFzAueCHHjHMjIF8PhheogycCPiT9vjfEBVVLq3nced8f9g/FPuHU3PXAG+Czdm3sGA8wHufjfgptINuRkZIfD+YOCyWe/eGlFQEDIg/P1B+2PgviWQkREg3dYO9FRZwACWe6in2gwD+NBtV26B7kElgAwcvPxEGyiKw3GQ8QBRHPv+9K35692kXajXyBZe5INKRO5gouVBMPIoIHi4koV6Ebge4cnDAoLIQYl7hCyKn8naK4CYgHorGAqgh4HDC2AE9tsFeBM8eBfIyMjI6MfeleD9qjw+DnBbmxGRCDy6byf9ChVhdn1mtVBLnIeTCUB05MOieGZqxDigEH4CP3xo2HBQAYzAJ94FMjIyHjq2XnbfMoNgdtx7J2CD2wT9CfANgl4ZfTlAkCNwisfvzz3yLCewQEgEmgxDflgCSAXGyh8Rg1UwfMtiT+KIgHwGY8n7r9BwCT2BkfRrY9sM9pu+dwUqIyPjoaPgkzfRf0s+EhCJ3G/HvdAEAyRc0PnYCIXGz0blRotPziJ2mZcCvQyEwwaP/3CUMzDskBGARqd6HDgHTIAmMnAPR4c+veMwVn5Yg1HBwQKDT7L4rH6CryEERfAKFLQFsJsMMHQbJNrIe4oPCgiCw/wYf/wKRhIwjnsFEEbO44CMjI8ae+3BgZliWiksXKYoPLsSYIDjwDDz6W+wjN4XviWMlUrewFZBPff/I0rWn9+GDPeZBUwLNACCiLuUAJ5sTwsBL9yrYsSqhwz1iShYgIm0ACaAsIXs3K75A5lgnZ7dGBlYxx9a8hkad/QPmzIyMo4O4bvWPipEZxa+4imDCRuf//HnMIcV3bHcEYXYKrJvdUooPbPk2U3pll4OIDhJBVYgfSytZoQAgvj+AoU+rSshAL4+gZU/mgYghrpAtL2T+GX8akLkl0Q48v4EcE/PYWdkfBxQx1SucfLOZ/Ik0c/2x48POGmaKdFz9jAsF0N+F1wLOlXWVpo2h+dVuApcxelg8jc34eZgVjGp5QOE9cRjQARmhE4vg8mqx79mnpeIHlDKg1ZdKmiaotTADLrr4Zd3LpESAOiXooN7N7ppAUjrdX3C8blKbjOcwOnF/OdABSCPdmX15fUP7BSxYr4AZPU/d+FQ+hKFgnnIV+EVy4KsAMHFxUW6BcBy2bWiqXlJvCq4Un9WADJ+RQTwVKZ++hQ9TuXpf7U4ZdUhCSp76CxG8C2576EE8As6Llm0j8EdZxMIICjvmQKT+MReIS6AaqmAHAY0yF42Be+K1LXtAjWWbw8YCRj6Qn18fvpbAA3XXa4RO0NVtQpbvFLaKYCR0WGr0VQ+8zfjoeHLL3uDS3kmqR3Nz6TNe1FPnc551CmRxSOrw6K9r3L+z40Sfo7pYSHBJle+Havreg1az9Tsob2NVOSl7delPHZoQdcnXgK89NmVZyK3F5iZttOWv4LxB3pUQNYDvnr6+s3VUzJaqrqhEzl9VAsgVWH4Lfyu+8xIBaXmrxlNzU43KpqQ8NZn0NgxO27xy/sSSdIKZnDSQmslBLIFuPoFAtAC9wTwi3n3IdWnI11ACVi6BDXYQvoP8Jfu81e3QOJfYUVXjCbh6up1QMPRqKKcZUO7Turntbc2sCEAZPYfWbvSR0Yn7Q6wgf5zw4DrAnJBia8vWCbkxWbZ9dOCn1gddKmSVl+8/vtCiMXfXxuylVe/b/pe94QdLdY5DbRt85HfGfeOKR2MSy0G133R97uMWMNsOn0LtO/3bxsbQtvlVTtNBfI48BXXwxdOKf5T4l9OC6+mXQatm67FzHJkyZXO76nhli9OkYev2/J0gDOrnQ1fyUK9Cvu1Z1rWAwThej7nBLpS9MrSpR9fu3Ob/F0XNAMiwIkCEYBvReTAjUSQ50F3VboQVADdOIxIqr65kXbV0m8lc25cEkiceSTItAD+rWgci5V64OU0cb1SuPCTO3l1NTo/P/cEQASnVicunnZ/bIFjlWwBNzfd7Jxez9rnV+y+C7yUo1Fn97nNWi0WfyaFNd1f6UQAnoM/5+gxRfmbkakSiEKiBcBUAqLnDN4TTu/uTgnZnshxSokvAgt7oF6B2WL9ISPDx3sg58x+h03uu3vk6LB4Ly0HSuCD7m7y/wcbgynBmFFsnGprPSUf8eA0qBcWuNc29BjdfaC7/tJ0vvcK93lYsJONu+gzS8iKN0S3Bzqrq23Z0vWN77t/33sRzrwUhxWAqzAtvJ8HMttUVfdM29YCUMSG7/FYH0Ag6deOfE0jsUSE8KsvdtAFehYfDoEf5FgU3v1wnzwc0SAlI+PTB8zY7MRfJd0DHj3y6cYvrTnkKEAYQ0CF4AnAhFlNr7hrZsAj2C0UcsxAw0Obyq1kOAiQ5GFHAocUQKrGjDygAA7cBfhA6d67QEbGg8eDfj9s2c1s4ceG3C+sm3dskVQC9dLCTJUWG9LHhlK+bvHHRryit5NXF2Lm30Eli6qT80n3Z9ep4RzO6cK9pMGnJ/IzOVLNXur3TVIB6Fax8tahiQC+1sBV2XXpo0MN8OrFK9rm1TCgacg9p8hZUxkZGZ8I+H2AIfoW6dvN6HXL25YeAr8P8AEskFYvQrs19J2Kr8LvLA2cFsnwDy78Q7J8Ab3hcvmUhfu0zsLd1+gDkLu2CVpeO/vSMHAFJuOTaCLiBvHBjz/Ij8BvgpY3fm9swmEBcAYsbLlyX1Wa4WHaz89GSAgIXKy0gHpo/Y67sQLg9wGG6CtHX21Cr1vetvQI8PsAQ/TVt5L+9mpTet3ytqUzMjIGYHTG3uijh5yr0+k6+PvyhJ7PexUU/QIQ9LnA40cWwEPvAhkZGftA/3tFjgqFGDocrRpc0+XV/ahenOIJAAr8ED8qADvbojmAL4BCvUFvX/zuHNsKQMcXlP6IW0AM/V0gUf2PtQVsC3UAp/lmHDv+D/qKcxyg6AblAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-icons_222222_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEUkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiTww4gUAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-icons_454545_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEVERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkQfbf86AAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-icons_888888_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEWMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMiozJxoFPAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-icons_cd0a0a_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEXMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzrDkZjAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/jquery-ui-1.8.5.custom.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IFVJIENTUyBGcmFtZXdvcmsgQFZFUlNJT04KICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1RoZW1pbmcvQVBJCiAqLwoKLyogTGF5b3V0IGhlbHBlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi51aS1oZWxwZXItaGlkZGVuIHsgZGlzcGxheTogbm9uZTsgfQoudWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIHsgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtOTk5OTk5OTlweDsgfQoudWktaGVscGVyLXJlc2V0IHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBib3JkZXI6IDA7IG91dGxpbmU6IDA7IGxpbmUtaGVpZ2h0OiAxLjM7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1zaXplOiAxMDAlOyBsaXN0LXN0eWxlOiBub25lOyB9Ci51aS1oZWxwZXItY2xlYXJmaXg6YWZ0ZXIgeyBjb250ZW50OiAiLiI7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDA7IGNsZWFyOiBib3RoOyB2aXNpYmlsaXR5OiBoaWRkZW47IH0KLnVpLWhlbHBlci1jbGVhcmZpeCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgfQovKiByZXF1aXJlZCBjb21tZW50IGZvciBjbGVhcmZpeCB0byB3b3JrIGluIE9wZXJhIFwqLwoqIGh0bWwgLnVpLWhlbHBlci1jbGVhcmZpeCB7IGhlaWdodDoxJTsgfQoudWktaGVscGVyLWNsZWFyZml4IHsgZGlzcGxheTpibG9jazsgfQovKiBlbmQgY2xlYXJmaXggKi8KLnVpLWhlbHBlci16Zml4IHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgdG9wOiAwOyBsZWZ0OiAwOyBwb3NpdGlvbjogYWJzb2x1dGU7IG9wYWNpdHk6IDA7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTApOyB9CgoKLyogSW50ZXJhY3Rpb24gQ3VlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLnVpLXN0YXRlLWRpc2FibGVkIHsgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7IH0KCgovKiBJY29ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovCi51aS1pY29uIHsgZGlzcGxheTogYmxvY2s7IHRleHQtaW5kZW50OiAtOTk5OTlweDsgb3ZlcmZsb3c6IGhpZGRlbjsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgfQoKCi8qIE1pc2MgdmlzdWFscwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIE92ZXJsYXlzICovCi51aS13aWRnZXQtb3ZlcmxheSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB9CgoKLyoKICogalF1ZXJ5IFVJIENTUyBGcmFtZXdvcmsgQFZFUlNJT04KICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1RoZW1pbmcvQVBJCiAqCiAqIFRvIHZpZXcgYW5kIG1vZGlmeSB0aGlzIHRoZW1lLCB2aXNpdCBodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyLz9mZkRlZmF1bHQ9VmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmJmZ3RGVmYXVsdD1ub3JtYWwmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz00cHgmYmdDb2xvckhlYWRlcj1jY2NjY2MmYmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9NzUmYm9yZGVyQ29sb3JIZWFkZXI9YWFhYWFhJmZjSGVhZGVyPTIyMjIyMiZpY29uQ29sb3JIZWFkZXI9MjIyMjIyJmJnQ29sb3JDb250ZW50PWZmZmZmZiZiZ1RleHR1cmVDb250ZW50PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9NzUmYm9yZGVyQ29sb3JDb250ZW50PWFhYWFhYSZmY0NvbnRlbnQ9MjIyMjIyJmljb25Db2xvckNvbnRlbnQ9MjIyMjIyJmJnQ29sb3JEZWZhdWx0PWU2ZTZlNiZiZ1RleHR1cmVEZWZhdWx0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTc1JmJvcmRlckNvbG9yRGVmYXVsdD1kM2QzZDMmZmNEZWZhdWx0PTU1NTU1NSZpY29uQ29sb3JEZWZhdWx0PTg4ODg4OCZiZ0NvbG9ySG92ZXI9ZGFkYWRhJmJnVGV4dHVyZUhvdmVyPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIb3Zlcj03NSZib3JkZXJDb2xvckhvdmVyPTk5OTk5OSZmY0hvdmVyPTIxMjEyMSZpY29uQ29sb3JIb3Zlcj00NTQ1NDUmYmdDb2xvckFjdGl2ZT1mZmZmZmYmYmdUZXh0dXJlQWN0aXZlPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYm9yZGVyQ29sb3JBY3RpdmU9YWFhYWFhJmZjQWN0aXZlPTIxMjEyMSZpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmJnQ29sb3JIaWdobGlnaHQ9ZmJmOWVlJmJnVGV4dHVyZUhpZ2hsaWdodD0wMl9nbGFzcy5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTU1JmJvcmRlckNvbG9ySGlnaGxpZ2h0PWZjZWZhMSZmY0hpZ2hsaWdodD0zNjM2MzYmaWNvbkNvbG9ySGlnaGxpZ2h0PTJlODNmZiZiZ0NvbG9yRXJyb3I9ZmVmMWVjJmJnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlFcnJvcj05NSZib3JkZXJDb2xvckVycm9yPWNkMGEwYSZmY0Vycm9yPWNkMGEwYSZpY29uQ29sb3JFcnJvcj1jZDBhMGEmYmdDb2xvck92ZXJsYXk9YWFhYWFhJmJnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5T3ZlcmxheT0wJm9wYWNpdHlPdmVybGF5PTMwJmJnQ29sb3JTaGFkb3c9YWFhYWFhJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MCZvcGFjaXR5U2hhZG93PTMwJnRoaWNrbmVzc1NoYWRvdz04cHgmb2Zmc2V0VG9wU2hhZG93PS04cHgmb2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmNvcm5lclJhZGl1c1NoYWRvdz04cHgKICovCgoKLyogQ29tcG9uZW50IGNvbnRhaW5lcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi51aS13aWRnZXQgeyBmb250LWZhbWlseTogVmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEuMWVtOyB9Ci51aS13aWRnZXQgLnVpLXdpZGdldCB7IGZvbnQtc2l6ZTogMWVtOyB9Ci51aS13aWRnZXQgaW5wdXQsIC51aS13aWRnZXQgc2VsZWN0LCAudWktd2lkZ2V0IHRleHRhcmVhLCAudWktd2lkZ2V0IGJ1dHRvbiB7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLEFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMWVtOyB9Ci51aS13aWRnZXQtY29udGVudCB7IGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7IGJhY2tncm91bmQ6ICNmZmZmZmYgdXJsKGltYWdlcy91aS1iZ19mbGF0Xzc1X2ZmZmZmZl80MHgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogIzIyMjIyMjsgfQoudWktd2lkZ2V0LWNvbnRlbnQgYSB7IGNvbG9yOiAjMjIyMjIyOyB9Ci51aS13aWRnZXQtaGVhZGVyIHsgYm9yZGVyOiAxcHggc29saWQgI2FhYWFhYTsgYmFja2dyb3VuZDogI2NjY2NjYyB1cmwoaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0Xzc1X2NjY2NjY18xeDEwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGNvbG9yOiAjMjIyMjIyOyBmb250LXdlaWdodDogYm9sZDsgfQoudWktd2lkZ2V0LWhlYWRlciBhIHsgY29sb3I6ICMyMjIyMjI7IH0KCi8qIEludGVyYWN0aW9uIHN0YXRlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLnVpLXN0YXRlLWRlZmF1bHQsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGVmYXVsdCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRlZmF1bHQgeyBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzOyBiYWNrZ3JvdW5kOiAjZTZlNmU2IHVybChpbWFnZXMvdWktYmdfZ2xhc3NfNzVfZTZlNmU2XzF4NDAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgY29sb3I6ICM1NTU1NTU7IH0KLnVpLXN0YXRlLWRlZmF1bHQgYSwgLnVpLXN0YXRlLWRlZmF1bHQgYTpsaW5rLCAudWktc3RhdGUtZGVmYXVsdCBhOnZpc2l0ZWQgeyBjb2xvcjogIzU1NTU1NTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9Ci51aS1zdGF0ZS1ob3ZlciwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1ob3ZlciwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhvdmVyLCAudWktc3RhdGUtZm9jdXMsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZm9jdXMsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1mb2N1cyB7IGJvcmRlcjogMXB4IHNvbGlkICM5OTk5OTk7IGJhY2tncm91bmQ6ICNkYWRhZGEgdXJsKGltYWdlcy91aS1iZ19nbGFzc183NV9kYWRhZGFfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBmb250LXdlaWdodDogbm9ybWFsOyBjb2xvcjogIzIxMjEyMTsgfQoudWktc3RhdGUtaG92ZXIgYSwgLnVpLXN0YXRlLWhvdmVyIGE6aG92ZXIgeyBjb2xvcjogIzIxMjEyMTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9Ci51aS1zdGF0ZS1hY3RpdmUsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtYWN0aXZlLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtYWN0aXZlIHsgYm9yZGVyOiAxcHggc29saWQgI2FhYWFhYTsgYmFja2dyb3VuZDogI2ZmZmZmZiB1cmwoaW1hZ2VzL3VpLWJnX2dsYXNzXzY1X2ZmZmZmZl8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGNvbG9yOiAjMjEyMTIxOyB9Ci51aS1zdGF0ZS1hY3RpdmUgYSwgLnVpLXN0YXRlLWFjdGl2ZSBhOmxpbmssIC51aS1zdGF0ZS1hY3RpdmUgYTp2aXNpdGVkIHsgY29sb3I6ICMyMTIxMjE7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQoudWktd2lkZ2V0IDphY3RpdmUgeyBvdXRsaW5lOiBub25lOyB9CgovKiBJbnRlcmFjdGlvbiBDdWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoudWktc3RhdGUtaGlnaGxpZ2h0LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhpZ2hsaWdodCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodCAge2JvcmRlcjogMXB4IHNvbGlkICNmY2VmYTE7IGJhY2tncm91bmQ6ICNmYmY5ZWUgdXJsKGltYWdlcy91aS1iZ19nbGFzc181NV9mYmY5ZWVfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogIzM2MzYzNjsgfQoudWktc3RhdGUtaGlnaGxpZ2h0IGEsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0IGEsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodCBhIHsgY29sb3I6ICMzNjM2MzY7IH0KLnVpLXN0YXRlLWVycm9yLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNjZDBhMGE7IGJhY2tncm91bmQ6ICNmZWYxZWMgdXJsKGltYWdlcy91aS1iZ19nbGFzc185NV9mZWYxZWNfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogI2NkMGEwYTsgfQoudWktc3RhdGUtZXJyb3IgYSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvciBhLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3IgYSB7IGNvbG9yOiAjY2QwYTBhOyB9Ci51aS1zdGF0ZS1lcnJvci10ZXh0LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLXRleHQsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvci10ZXh0IHsgY29sb3I6ICNjZDBhMGE7IH0KLnVpLXByaW9yaXR5LXByaW1hcnksIC51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktcHJpbWFyeSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXByaW9yaXR5LXByaW1hcnkgeyBmb250LXdlaWdodDogYm9sZDsgfQoudWktcHJpb3JpdHktc2Vjb25kYXJ5LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXByaW9yaXR5LXNlY29uZGFyeSwgIC51aS13aWRnZXQtaGVhZGVyIC51aS1wcmlvcml0eS1zZWNvbmRhcnkgeyBvcGFjaXR5OiAuNzsgZmlsdGVyOkFscGhhKE9wYWNpdHk9NzApOyBmb250LXdlaWdodDogbm9ybWFsOyB9Ci51aS1zdGF0ZS1kaXNhYmxlZCwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1kaXNhYmxlZCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRpc2FibGVkIHsgb3BhY2l0eTogLjM1OyBmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zNSk7IGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IH0KCi8qIEljb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogc3RhdGVzIGFuZCBpbWFnZXMgKi8KLnVpLWljb24geyB3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4OyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyk7IH0KLnVpLXdpZGdldC1jb250ZW50IC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyk7IH0KLnVpLXdpZGdldC1oZWFkZXIgLnVpLWljb24ge2JhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfMjIyMjIyXzI1NngyNDAucG5nKTsgfQoudWktc3RhdGUtZGVmYXVsdCAudWktaWNvbiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfODg4ODg4XzI1NngyNDAucG5nKTsgfQoudWktc3RhdGUtaG92ZXIgLnVpLWljb24sIC51aS1zdGF0ZS1mb2N1cyAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc180NTQ1NDVfMjU2eDI0MC5wbmcpOyB9Ci51aS1zdGF0ZS1hY3RpdmUgLnVpLWljb24ge2JhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfNDU0NTQ1XzI1NngyNDAucG5nKTsgfQoudWktc3RhdGUtaGlnaGxpZ2h0IC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzJlODNmZl8yNTZ4MjQwLnBuZyk7IH0KLnVpLXN0YXRlLWVycm9yIC51aS1pY29uLCAudWktc3RhdGUtZXJyb3ItdGV4dCAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc19jZDBhMGFfMjU2eDI0MC5wbmcpOyB9CgovKiBwb3NpdGlvbmluZyAqLwoudWktaWNvbi1jYXJhdC0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7IH0KLnVpLWljb24tY2FyYXQtMS1uZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IDA7IH0KLnVpLWljb24tY2FyYXQtMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggMDsgfQoudWktaWNvbi1jYXJhdC0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggMDsgfQoudWktaWNvbi1jYXJhdC0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAwOyB9Ci51aS1pY29uLWNhcmF0LTEtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAwOyB9Ci51aS1pY29uLWNhcmF0LTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IDA7IH0KLnVpLWljb24tY2FyYXQtMS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAwOyB9Ci51aS1pY29uLWNhcmF0LTItbi1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IDA7IH0KLnVpLWljb24tY2FyYXQtMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggMDsgfQoudWktaWNvbi10cmlhbmdsZS0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMi1uLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTE2cHg7IH0KLnVpLWljb24tYXJyb3ctMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTEtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTItbi1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTItbmUtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMi1zZS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMzJweDsgfQoudWktaWNvbi1hcnJvd3N0b3AtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93c3RvcC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3dzdG9wLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMzJweDsgfQoudWktaWNvbi1hcnJvd3N0b3AtMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLXN3IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0yLW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTItbmUtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0yLWUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTItc2UtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JlZnJlc2gtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmVmcmVzaC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtNjRweDsgfQoudWktaWNvbi1hcnJvdy00IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtODBweDsgfQoudWktaWNvbi1hcnJvdy00LWRpYWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtODBweDsgfQoudWktaWNvbi1leHRsaW5rIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTgwcHg7IH0KLnVpLWljb24tbmV3d2luIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTgwcHg7IH0KLnVpLWljb24tcmVmcmVzaCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC04MHB4OyB9Ci51aS1pY29uLXNodWZmbGUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtODBweDsgfQoudWktaWNvbi10cmFuc2Zlci1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtODBweDsgfQoudWktaWNvbi10cmFuc2ZlcnRoaWNrLWUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtODBweDsgfQoudWktaWNvbi1mb2xkZXItY29sbGFwc2VkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtOTZweDsgfQoudWktaWNvbi1mb2xkZXItb3BlbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC05NnB4OyB9Ci51aS1pY29uLWRvY3VtZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTk2cHg7IH0KLnVpLWljb24tZG9jdW1lbnQtYiB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC05NnB4OyB9Ci51aS1pY29uLW5vdGUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtOTZweDsgfQoudWktaWNvbi1tYWlsLWNsb3NlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC05NnB4OyB9Ci51aS1pY29uLW1haWwtb3BlbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC05NnB4OyB9Ci51aS1pY29uLXN1aXRjYXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC05NnB4OyB9Ci51aS1pY29uLWNvbW1lbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTk2cHg7IH0KLnVpLWljb24tcGVyc29uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC05NnB4OyB9Ci51aS1pY29uLXByaW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC05NnB4OyB9Ci51aS1pY29uLXRyYXNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC05NnB4OyB9Ci51aS1pY29uLWxvY2tlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtOTZweDsgfQoudWktaWNvbi11bmxvY2tlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtOTZweDsgfQoudWktaWNvbi1ib29rbWFyayB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtOTZweDsgfQoudWktaWNvbi10YWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTk2cHg7IH0KLnVpLWljb24taG9tZSB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTExMnB4OyB9Ci51aS1pY29uLWZsYWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTEycHg7IH0KLnVpLWljb24tY2FsZW5kYXIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTEycHg7IH0KLnVpLWljb24tY2FydCB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xMTJweDsgfQoudWktaWNvbi1wZW5jaWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTEycHg7IH0KLnVpLWljb24tY2xvY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTEycHg7IH0KLnVpLWljb24tZGlzayB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xMTJweDsgfQoudWktaWNvbi1jYWxjdWxhdG9yIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMTJweDsgfQoudWktaWNvbi16b29taW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTExMnB4OyB9Ci51aS1pY29uLXpvb21vdXQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTExMnB4OyB9Ci51aS1pY29uLXNlYXJjaCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMTEycHg7IH0KLnVpLWljb24td3JlbmNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMTJweDsgfQoudWktaWNvbi1nZWFyIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xMTJweDsgfQoudWktaWNvbi1oZWFydCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTEycHg7IH0KLnVpLWljb24tc3RhciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMTEycHg7IH0KLnVpLWljb24tbGluayB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMTEycHg7IH0KLnVpLWljb24tY2FuY2VsIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTI4cHg7IH0KLnVpLWljb24tcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xMjhweDsgfQoudWktaWNvbi1wbHVzdGhpY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7IH0KLnVpLWljb24tbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTI4cHg7IH0KLnVpLWljb24tbWludXN0aGljayB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xMjhweDsgfQoudWktaWNvbi1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xMjhweDsgfQoudWktaWNvbi1jbG9zZXRoaWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTEyOHB4OyB9Ci51aS1pY29uLWtleSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7IH0KLnVpLWljb24tbGlnaHRidWxiIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsgfQoudWktaWNvbi1zY2lzc29ycyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTI4cHg7IH0KLnVpLWljb24tY2xpcGJvYXJkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xMjhweDsgfQoudWktaWNvbi1jb3B5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMjhweDsgfQoudWktaWNvbi1jb250YWN0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xMjhweDsgfQoudWktaWNvbi1pbWFnZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTI4cHg7IH0KLnVpLWljb24tdmlkZW8geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTEyOHB4OyB9Ci51aS1pY29uLXNjcmlwdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMTI4cHg7IH0KLnVpLWljb24tYWxlcnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNDRweDsgfQoudWktaWNvbi1pbmZvIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE0NHB4OyB9Ci51aS1pY29uLW5vdGljZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNDRweDsgfQoudWktaWNvbi1oZWxwIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE0NHB4OyB9Ci51aS1pY29uLWNoZWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE0NHB4OyB9Ci51aS1pY29uLWJ1bGxldCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNDRweDsgfQoudWktaWNvbi1yYWRpby1vZmYgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTQ0cHg7IH0KLnVpLWljb24tcmFkaW8tb24geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE0NHB4OyB9Ci51aS1pY29uLXBpbi13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xNDRweDsgfQoudWktaWNvbi1waW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTQ0cHg7IH0KLnVpLWljb24tcGxheSB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE2MHB4OyB9Ci51aS1pY29uLXBhdXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE2MHB4OyB9Ci51aS1pY29uLXNlZWstbmV4dCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNjBweDsgfQoudWktaWNvbi1zZWVrLXByZXYgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTYwcHg7IH0KLnVpLWljb24tc2Vlay1lbmQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTYwcHg7IH0KLnVpLWljb24tc2Vlay1zdGFydCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNjBweDsgfQovKiB1aS1pY29uLXNlZWstZmlyc3QgaXMgZGVwcmVjYXRlZCwgdXNlIHVpLWljb24tc2Vlay1zdGFydCBpbnN0ZWFkICovCi51aS1pY29uLXNlZWstZmlyc3QgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTYwcHg7IH0KLnVpLWljb24tc3RvcCB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNjBweDsgfQoudWktaWNvbi1lamVjdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTYwcHg7IH0KLnVpLWljb24tdm9sdW1lLW9mZiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTYwcHg7IH0KLnVpLWljb24tdm9sdW1lLW9uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNjBweDsgfQoudWktaWNvbi1wb3dlciB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE3NnB4OyB9Ci51aS1pY29uLXNpZ25hbC1kaWFnIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE3NnB4OyB9Ci51aS1pY29uLXNpZ25hbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNzZweDsgfQoudWktaWNvbi1iYXR0ZXJ5LTAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTc2cHg7IH0KLnVpLWljb24tYmF0dGVyeS0xIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE3NnB4OyB9Ci51aS1pY29uLWJhdHRlcnktMiB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNzZweDsgfQoudWktaWNvbi1iYXR0ZXJ5LTMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTc2cHg7IH0KLnVpLWljb24tY2lyY2xlLXBsdXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWNsb3NlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS1hcnJvdy1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtYXJyb3ctcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWFycm93LXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS1hcnJvdy1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtem9vbWluIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtem9vbW91dCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWNoZWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGVzbWFsbC1wbHVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMjA4cHg7IH0KLnVpLWljb24tY2lyY2xlc21hbGwtbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMjA4cHg7IH0KLnVpLWljb24tY2lyY2xlc21hbGwtY2xvc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMjA4cHg7IH0KLnVpLWljb24tc3F1YXJlc21hbGwtcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0yMDhweDsgfQoudWktaWNvbi1zcXVhcmVzbWFsbC1taW51cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0yMDhweDsgfQoudWktaWNvbi1zcXVhcmVzbWFsbC1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0yMDhweDsgfQoudWktaWNvbi1ncmlwLWRvdHRlZC12ZXJ0aWNhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTIyNHB4OyB9Ci51aS1pY29uLWdyaXAtZG90dGVkLWhvcml6b250YWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMjI0cHg7IH0KLnVpLWljb24tZ3JpcC1zb2xpZC12ZXJ0aWNhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0yMjRweDsgfQoudWktaWNvbi1ncmlwLXNvbGlkLWhvcml6b250YWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMjI0cHg7IH0KLnVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTIyNHB4OyB9Ci51aS1pY29uLWdyaXAtZGlhZ29uYWwtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMjI0cHg7IH0KCgovKiBNaXNjIHZpc3VhbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBDb3JuZXIgcmFkaXVzICovCi51aS1jb3JuZXItdGwgeyAtbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDogNHB4OyAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItdHIgeyAtbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6IDRweDsgLXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItYmwgeyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDogNHB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItYnIgeyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDRweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItdG9wIHsgLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDRweDsgLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7IGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiA0cHg7IC13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsgfQoudWktY29ybmVyLWJvdHRvbSB7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA0cHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogNHB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7IH0KLnVpLWNvcm5lci1yaWdodCB7ICAtbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6IDRweDsgLXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDRweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItbGVmdCB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiA0cHg7IC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA0cHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7IH0KLnVpLWNvcm5lci1hbGwgeyAtbW96LWJvcmRlci1yYWRpdXM6IDRweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgfQoKLyogT3ZlcmxheXMgKi8KLnVpLXdpZGdldC1vdmVybGF5IHsgYmFja2dyb3VuZDogI2FhYWFhYSB1cmwoaW1hZ2VzL3VpLWJnX2ZsYXRfMF9hYWFhYWFfNDB4MTAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgb3BhY2l0eTogLjMwO2ZpbHRlcjpBbHBoYShPcGFjaXR5PTMwKTsgfQoudWktd2lkZ2V0LXNoYWRvdyB7IG1hcmdpbjogLThweCAwIDAgLThweDsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kOiAjYWFhYWFhIHVybChpbWFnZXMvdWktYmdfZmxhdF8wX2FhYWFhYV80MHgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBvcGFjaXR5OiAuMzA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzApOyAtbW96LWJvcmRlci1yYWRpdXM6IDhweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgfS8qCiAqIGpRdWVyeSBVSSBSZXNpemFibGUgQFZFUlNJT04KICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1Jlc2l6YWJsZSN0aGVtaW5nCiAqLwoudWktcmVzaXphYmxlIHsgcG9zaXRpb246IHJlbGF0aXZlO30KLnVpLXJlc2l6YWJsZS1oYW5kbGUgeyBwb3NpdGlvbjogYWJzb2x1dGU7Zm9udC1zaXplOiAwLjFweDt6LWluZGV4OiA5OTk5OTsgZGlzcGxheTogYmxvY2s7fQoudWktcmVzaXphYmxlLWRpc2FibGVkIC51aS1yZXNpemFibGUtaGFuZGxlLCAudWktcmVzaXphYmxlLWF1dG9oaWRlIC51aS1yZXNpemFibGUtaGFuZGxlIHsgZGlzcGxheTogbm9uZTsgfQoudWktcmVzaXphYmxlLW4geyBjdXJzb3I6IG4tcmVzaXplOyBoZWlnaHQ6IDdweDsgd2lkdGg6IDEwMCU7IHRvcDogLTVweDsgbGVmdDogMDsgfQoudWktcmVzaXphYmxlLXMgeyBjdXJzb3I6IHMtcmVzaXplOyBoZWlnaHQ6IDdweDsgd2lkdGg6IDEwMCU7IGJvdHRvbTogLTVweDsgbGVmdDogMDsgfQoudWktcmVzaXphYmxlLWUgeyBjdXJzb3I6IGUtcmVzaXplOyB3aWR0aDogN3B4OyByaWdodDogLTVweDsgdG9wOiAwOyBoZWlnaHQ6IDEwMCU7IH0KLnVpLXJlc2l6YWJsZS13IHsgY3Vyc29yOiB3LXJlc2l6ZTsgd2lkdGg6IDdweDsgbGVmdDogLTVweDsgdG9wOiAwOyBoZWlnaHQ6IDEwMCU7IH0KLnVpLXJlc2l6YWJsZS1zZSB7IGN1cnNvcjogc2UtcmVzaXplOyB3aWR0aDogMTJweDsgaGVpZ2h0OiAxMnB4OyByaWdodDogMXB4OyBib3R0b206IDFweDsgfQoudWktcmVzaXphYmxlLXN3IHsgY3Vyc29yOiBzdy1yZXNpemU7IHdpZHRoOiA5cHg7IGhlaWdodDogOXB4OyBsZWZ0OiAtNXB4OyBib3R0b206IC01cHg7IH0KLnVpLXJlc2l6YWJsZS1udyB7IGN1cnNvcjogbnctcmVzaXplOyB3aWR0aDogOXB4OyBoZWlnaHQ6IDlweDsgbGVmdDogLTVweDsgdG9wOiAtNXB4OyB9Ci51aS1yZXNpemFibGUtbmUgeyBjdXJzb3I6IG5lLXJlc2l6ZTsgd2lkdGg6IDlweDsgaGVpZ2h0OiA5cHg7IHJpZ2h0OiAtNXB4OyB0b3A6IC01cHg7fS8qCiAqIGpRdWVyeSBVSSBTZWxlY3RhYmxlIEBWRVJTSU9OCiAqCiAqIENvcHlyaWdodCAyMDEwLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9TZWxlY3RhYmxlI3RoZW1pbmcKICovCi51aS1zZWxlY3RhYmxlLWhlbHBlciB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogMTAwOyBib3JkZXI6MXB4IGRvdHRlZCBibGFjazsgfQovKgogKiBqUXVlcnkgVUkgRGlhbG9nIEBWRVJTSU9OCiAqCiAqIENvcHlyaWdodCAyMDEwLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9EaWFsb2cjdGhlbWluZwogKi8KLnVpLWRpYWxvZyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcGFkZGluZzogLjJlbTsgd2lkdGg6IDMwMHB4OyBvdmVyZmxvdzogaGlkZGVuOyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZWJhciB7IHBhZGRpbmc6IC41ZW0gMWVtIC4zZW07IHBvc2l0aW9uOiByZWxhdGl2ZTsgIH0KLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlIHsgZmxvYXQ6IGxlZnQ7IG1hcmdpbjogLjFlbSAxNnB4IC4yZW0gMDsgfSAKLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIHsgcG9zaXRpb246IGFic29sdXRlOyByaWdodDogLjNlbTsgdG9wOiA1MCU7IHdpZHRoOiAxOXB4OyBtYXJnaW46IC0xMHB4IDAgMCAwOyBwYWRkaW5nOiAxcHg7IGhlaWdodDogMThweDsgfQoudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2Ugc3BhbiB7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IDFweDsgfQoudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2U6aG92ZXIsIC51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZTpmb2N1cyB7IHBhZGRpbmc6IDA7IH0KLnVpLWRpYWxvZyAudWktZGlhbG9nLWNvbnRlbnQgeyBwb3NpdGlvbjogcmVsYXRpdmU7IGJvcmRlcjogMDsgcGFkZGluZzogLjVlbSAxZW07IGJhY2tncm91bmQ6IG5vbmU7IG92ZXJmbG93OiBhdXRvOyB6b29tOiAxOyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIHsgdGV4dC1hbGlnbjogbGVmdDsgYm9yZGVyLXdpZHRoOiAxcHggMCAwIDA7IGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IG1hcmdpbjogLjVlbSAwIDAgMDsgcGFkZGluZzogLjNlbSAxZW0gLjVlbSAuNGVtOyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIC51aS1kaWFsb2ctYnV0dG9uc2V0IHsgZmxvYXQ6IHJpZ2h0OyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIGJ1dHRvbiB7IG1hcmdpbjogLjVlbSAuNGVtIC41ZW0gMDsgY3Vyc29yOiBwb2ludGVyOyB9Ci51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1zZSB7IHdpZHRoOiAxNHB4OyBoZWlnaHQ6IDE0cHg7IHJpZ2h0OiAzcHg7IGJvdHRvbTogM3B4OyB9Ci51aS1kcmFnZ2FibGUgLnVpLWRpYWxvZy10aXRsZWJhciB7IGN1cnNvcjogbW92ZTsgfQovKgogKiBqUXVlcnkgVUkgVGFicyBAVkVSU0lPTgogKgogKiBDb3B5cmlnaHQgMjAxMCwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvVGFicyN0aGVtaW5nCiAqLwoudWktdGFicyB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZzogLjJlbTsgem9vbTogMTsgfSAvKiBwb3NpdGlvbjogcmVsYXRpdmUgcHJldmVudHMgSUUgc2Nyb2xsIGJ1ZyAoZWxlbWVudCB3aXRoIHBvc2l0aW9uOiByZWxhdGl2ZSBpbnNpZGUgY29udGFpbmVyIHdpdGggb3ZlcmZsb3c6IGF1dG8gYXBwZWFyIGFzICJmaXhlZCIpICovCi51aS10YWJzIC51aS10YWJzLW5hdiB7IG1hcmdpbjogMDsgcGFkZGluZzogLjJlbSAuMmVtIDA7IH0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIHsgbGlzdC1zdHlsZTogbm9uZTsgZmxvYXQ6IGxlZnQ7IHBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAxcHg7IG1hcmdpbjogMCAuMmVtIDFweCAwOyBib3JkZXItYm90dG9tOiAwICFpbXBvcnRhbnQ7IHBhZGRpbmc6IDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEgeyBmbG9hdDogbGVmdDsgcGFkZGluZzogLjVlbSAxZW07IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQoudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1zZWxlY3RlZCB7IG1hcmdpbi1ib3R0b206IDA7IHBhZGRpbmctYm90dG9tOiAxcHg7IH0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgYSwgLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXN0YXRlLWRpc2FibGVkIGEsIC51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS1zdGF0ZS1wcm9jZXNzaW5nIGEgeyBjdXJzb3I6IHRleHQ7IH0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEsIC51aS10YWJzLnVpLXRhYnMtY29sbGFwc2libGUgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgYSB7IGN1cnNvcjogcG9pbnRlcjsgfSAvKiBmaXJzdCBzZWxlY3RvciBpbiBncm91cCBzZWVtcyBvYnNvbGV0ZSwgYnV0IHJlcXVpcmVkIHRvIG92ZXJjb21lIGJ1ZyBpbiBPcGVyYSBhcHBseWluZyBjdXJzb3I6IHRleHQgb3ZlcmFsbCBpZiBkZWZpbmVkIGVsc2V3aGVyZS4uLiAqLwoudWktdGFicyAudWktdGFicy1wYW5lbCB7IGRpc3BsYXk6IGJsb2NrOyBib3JkZXItd2lkdGg6IDA7IHBhZGRpbmc6IDFlbSAxLjRlbTsgYmFja2dyb3VuZDogbm9uZTsgfQoudWktdGFicyAudWktdGFicy1oaWRlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/README</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ICAgICAgICBfICAgX19fX18gICAgX19fX19fXyAgIF9fX19fXyAKICAgICAgIHwgfCB8ICBfXyBcICB8X18gICBfX3wgfCAgX19fX3wKICBfX18gIHwgfCB8IHxfXykgfCAgICB8IHwgICAgfCB8X18gICAKIC8gXyBcIHwgfCB8ICBfICAvICAgICB8IHwgICAgfCAgX198ICAKfCAgX18vIHwgfCB8IHwgXCBcICAgICB8IHwgICAgfCB8X19fXyAKIFxfX198IHxffCB8X3wgIFxfXCAgICB8X3wgICAgfF9fX19fX3wKCgoKRGVzY3JpcHRpb24KPT09PT09PT09PT0KCkhvbWVwYWdlOiBodHRwOi8vZWxydGUub3JnCkUtbWFpbDogICBkZXZAc3RkNDIucnUKCmVsUlRFIGlzIGFuIG9wZW4tc291cmNlIFdZU0lXWUcgSFRNTC1lZGl0b3Igd3JpdHRlbiBpbiBKYXZhU2NyaXB0IHVzaW5nCmpRdWVyeSBVSS4gSXQgZmVhdHVyZXMgcmljaCB0ZXh0IGVkaXRpbmcsIG9wdGlvbnMgZm9yIGNoYW5naW5nIGl0cyBhcHBlYXJhbmNlLApzdHlsZSBhbmQgbWFueSBtb3JlLiBZb3UgY2FuIHVzZSBpdCBpbiBhbnkgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbApwcm9qZWN0cy4gTWFpbiBnb2FsIG9mIHRoZSBlZGl0b3IgLSBzaW1wbGlmeSB3b3JrIHdpdGggdGV4dCBhbmQgZm9ybWF0aW5nCihIVE1MKSBvbiBzaXRlcywgYmxvZ3MsIGZvcnVtcyBhbmQgb3RoZXIgb25saW5lIHNlcnZpY2VzLgoKClVzYWdlCj09PT09CgogKiBSaWNoIHRleHQgZWRpdGluZywgY2hhbmdlIGl0cyBhcHBlYXJhbmNlIGFuZCBzdHlsZQogKiBJbnNlcnQgYW5kIG1hbmFnZSB2YXJpb3VzIEhUTUwgZWxlbWVudHMgd2l0aCBmb3JtYXR0aW5nIChpbWFnZXMsIHRhYmxlcywKICAgbGlzdHMgYW5kIGV0Yy4pCiAqIFZpZXcgYW5kIGVkaXQgSFRNTC1jb2RlCgoKRmVhdHVyZXMKPT09PT09PT0KCiAqIEFkdmFuY2VkIHdvcmsgd2l0aCBDU1MKICAgLSBTZXR0aW5nIGluZGVudGF0aW9uIChtYXJnaW5zLCBwYWRkaW5ncykgZm9yIGltYWdlcyBhbmQgdGFibGUgY2VsbHMKICAgICAoc2VwZXJhdGUgZm9yIGVhY2ggZGlyZWN0aW9uKQogICAtIENvbnRyb2xsaW5nIGJvcmRlciBwcm9wZXJ0aWVzICh3aWR0aCwgc3R5bGUsIGNvbG9yKSB3aXRoIGNvbnZlbmllbnQgZGlhbG9ncwogICAtIFdyaXRpbmcgZWxlbWVudCBwcm9wZXJ0aWVzIGFzIENTUy1zdHlsZSBhbHdheXMgd2hlbiBwb3NzaWJsZQogKiBMaWdodHdlaWdodCwgZmFzdCBhbmQgZWFzeSB0byBpbnRlZ3JhdGUKICogSW50ZXJmYWNlIGFwcGVhcmFuY2UgaXMgY29uZmlndXJlZCBmcm9tIG9uZSBDU1MgZmlsZQogKiBObyB0ZW1wbGF0ZXMgdXNlZAogKiBpMThuLiBUaGUgZWRpdG9yIGNhbiBiZSBlYXNpbHkgbG9jYWxpemVkIGludG8gYW55IGxhbmd1YWdlLiBDdXJyZW50bHkKICAgYXZhaWxhYmxlIGluIEVuZ2xpc2gsIEdlcm1hbiwgSmFwYW5lc2UsIExhdHZpYW4sIFNwYW5pc2gsIFJ1c3NpYW4gYW5kCiAgIFVrcmFpbmlhbiBsYW5ndWFnZXMKICogRGVzaWduZWQgdG8gd29yayB3aXRoIGVsRmluZGVyIGZpbGUgbWFuYWdlciAoaHR0cDovL2VscnRlLm9yZy9lbGZpbmRlciksCiAgIGJ1dCBhbHNvIGNhbiBiZSB1c2VkIHdpdGggYW55IG90aGVyCiAqIEZsZXhpYmxlIGZvciBleHRlbnNpb25zCgoKUmVxdWlyZW1lbnRzCj09PT09PT09PT09PQoKTW9kZXJuIGJyb3dzZXIuIGVsUlRFIGhhcyBiZWVuIHRlc3RlZCBpbiBGaXJlZm94IDMuNSssIEludGVybmV0IEV4cGxvcmVyIDcgJiA4LApTYWZhcmkgNC81LCBPcGVyYSAxMCBhbmQgQ2hyb21lIDQvNS82CgoKRG9jdW1lbnRhdGlvbgo9PT09PT09PT09PT09CgpodHRwOi8vZWxydGUub3JnL3JlZG1pbmUvd2lraS9lbHJ0ZQoKCkF1dGhvcnMKPT09PT09PQoKQ2hpZWYgZGV2ZWxvcGVyOiBEbWl0cnkgImRpbyIgTGV2YXNob3YgPGRpb0BzdGQ0Mi5ydT4KRGV2ZWxvcGVyLCB0ZWNoIHN1cHBvcnQ6IFRyb2V4IE5ldmVsaW4gPHRyb2V4QGZ1cnkuc2NhbmNvZGUucnU+CkRlc2lnbjogVmFsZW50aW4gUmF6dW1uaWgKCgpUcmFuc2xhdG9ycwo9PT09PT09PT09PQoKQXJhYmljOiAgICAgICAgICAgICAgIHRhd2ZlayBkYWdoaXN0YW5pIDx0YXdmZWtvdkBnbWFpbC5jb20+CkR1dGNoOiAgICAgICAgICAgICAgICBLdXJ0IEFlcnRzIGh0dHA6Ly9pbGFic29sdXRpb25zLm5ldC8KRW5nbGlzaDogICAgICAgICAgICAgIERtaXRyeSAiZGlvIiBMZXZhc2hvdiA8ZGlvQHN0ZDQyLnJ1PgpGcmVuY2g6ICAgICAgICAgICAgICAgRnJhbmNvaXMgTWF6ZXJvbGxlIDxmbWF6MDA4QGdtYWlsLmNvbT4KR2VybWFuOiAgICAgICAgICAgICAgIFZhc2lsaXkgUmF6dW1ueWggPHJ2bkBzdGQ0Mi5ydT4KSHVuZ2FyaWFuOiAgICAgICAgICAgIFZpa3RvciBUYW1hcyA8dGFtYXMudmlrdG9yQHRvdGFsc3R1ZGlvLmh1PgpJdGFsaWFuOiAgICAgICAgICAgICAgVWdvIFB1bnpvbG8gPHNhZHJhY3plcm91bm9AZ21haWwuY29tPgpKYXBhbmVzZTogICAgICAgICAgICAgVG9tb2FraSBZb3NoaWRhIDxpbmZvQHlvc2hpZGEtc3R1ZGlvLmpwPgpMYXR2aWFuOiAgICAgICAgICAgICAgVWxkaXMgUGxvdGnFhsWhIDx1bGRpcy5wbG90aW5zQGdtYWlsLmNvbT4KUGVyc2lhbiAoRmFyc2kpOiAgICAgIFNhbGVoIHNvb3phbmNoaSA8aW5mb0Bzb296YW5jaGkuaXI+ClBvbGlzaDogICAgICAgICAgICAgICBBbmRyemVqIEJvcm93aWN6IGh0dHA6Ly9ib3Jvd2ljei5pbmZvLwpTcGFuaXNoOiAgICAgICAgICAgICAgUmljYXJkbyBPYnJlZ8OzbiA8cm9icmVnb25tQGdtYWlsLmNvbT4KUnVzc2lhbjogICAgICAgICAgICAgIERtaXRyeSAiZGlvIiBMZXZhc2hvdiA8ZGlvQHN0ZDQyLnJ1PgpUcmFkaXRpb25hbCBDaGluZXNlOiAgVGFkIDx0YWQwNjE2QGdtYWlsLmNvbT4KVWtyYW5pYW46ICAgICAgICAgICAgIEFydGVtIFZhc2lseWV2CgoKV2UgaG9wZSBvdXIgdG9vbHMgd2lsbCBiZSBoZWxwZnVsIGZvciB5b3UuCgoKTGljZW5zZToKPT09PT09PT0KCmVsUlRFIGlzIGlzc3VlZCB1bmRlciBhIDMtY2xhdXNlcyBCU0QgbGljZW5zZS4KZWxSVEUgdXNlcyBhbmQgY29tZXMgd2l0aCBqUXVlcnkgYW5kIGpRdWVyeS1VSSB3aXRjaCBhcmUgaXNzdWVkIHVuZGVyCk1JVCBhbmQgR1BMIGxpY2Vuc2VzLgoKClRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHVuZGVyIGEgMyBjbGF1c2VzIEJTRCBsaWNlbnNlOgoKQ29weXJpZ2h0IChjKSAyMDA5LCBTdHVkaW8gNDIgTHRkLgpBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU3R1ZGlvIDQyIEx0ZC4gbm9yIHRoZQogICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgU3R1ZGlvIDQyIEx0ZC4gJydBUyBJUycnIEFORCBBTlkKRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRApXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFN0dWRpbyA0MiBMdGQuIEJFIExJQUJMRSBGT1IgQU5ZCkRJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCihJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECk9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTClNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/templates/admineditor.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBpZD0idG91Y2hGb3JtIj4KeyRmb3Jtc3RhcnR9CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRlbHJ0ZV9qcXVlcnlfbG9hZF9sYWJlbH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGVscnRlX2pxdWVyeV9sb2FkX2lucHV0fTxici8+eyRlbHJ0ZV9qcXVlcnlfbG9hZF9oZWxwfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGVscnRlX3Rvb2xiYXJfbGFiZWx9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRlbHJ0ZV90b29sYmFyX2lucHV0fTxici8+eyRlbHJ0ZV90b29sYmFyX2hlbHB9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskZWxydGVfYnV0dG9uX2xpc3RfbGFiZWx9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRlbHJ0ZV9idXR0b25fbGlzdF9pbnB1dH08YnIvPnskZWxydGVfYnV0dG9uX2xpc3RfaGVscH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgogIDwvZGl2Pgp7JGZvcm1lbmR9CjwvZGl2Pg==]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/nicedit/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/nicedit/img/icons.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlh1AESAPcAAAAAABERESIiIjMzMzNmIndVIkR3IkRERFVVVWZmZnd3d90iIu4zM7tEEbtVIqp3M91mAO53EcxmM7t3RIhmd+5ERO5EVe5VVf9VVf9mZv9md+53d/93d1WIIlWIRGaIVXe7RGaIZruIM7uZM/+qM//MM4iIRKqIVYi7RIiqVZm7VbuqVZmZd4i7ZsyZVd2ZVe6ZVcyqRMyZZt2ZZt2qZsyqd92qd8y7d+67ZpnMZt3MVe7MZu7dZv/dZu7MdxEzuxFEuxFVuzNmqjNmuzN3u0R3uyJmzDN3zER3zJl3iP93iGaZmUSZqlWIu2aIqlWIzESI3VWI3VWZ3WaIzGaZzHeZzGaI3WaZ3XeZ3VWq3Waq3Xeq3VWq7maq7neq7ma7/4iIiJmZmZmqiLuqmYiqqqqqqru7u/+IiN2qiMy7iN27iMy7md27me6qiO6qme67mf+7u5nMiLvMmbvdu93MiO7MiN3Mqu7Mqv/Mu+7du8zuu//uqoiZ3YiqzJmqzIiq3Zm73aq73Yiq7oi77pm77qq77rvM3YjM7pnd/6rM7rvM7rvd7szMzMzM3czd3d3d3f/MzO7dzO7d3f/d3f//zO7u3f/u3czd7szd/93d/93u7t3u/+7u7v/u7u7u/+7//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKEALAAAAADUARIAAAj+AEMJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo0eLhrZQeTJyJMk+oBhWelOjxptKH2PKnEnTIKhDgw7hHLQpY6A/U4oMGUp0aJEpimoqpdgokJ+nUKP6abTUYUqCP4MWLXo06dItnsKKDatJ5NWDldTYUHPnjhoZMvJUnUt3oadCShclunSJp8Y/fEGB+iT2E+FNiqgkqsv4YCBOYyN74uSHcadJBifBgUQQ8CXBhMMa9oRY8VIqnjCp5ntpEahFIjvdoFPwjow3eXqUKJHnzhsZbOgqGK4gQQIECA4cGCCgscxCeGseSpRzy9mLTS5tMTxFLCjSiBX+FXHOcFGhRREZgVFQZmAYBGYK+vH0lEyc+3GWLPFDOSMoQpuA4kUomXhBCEKdcMABZgNNkkEGZzAYSnbbfdJdWN9tEt54Ewni4YeCbLHFFVdIEQUUSBwh0BOpqbaaa5hs0kcae4ww0Epo4EACCSXohgYabU0AE0GMhDGcGWEkEAYnCBFnnHHIJXcARk5CGaVyC5nxpAJNDvfkcchhWVCVVkppUHSMkImcQWpeOaVBiSwyyCWHbKFdF1rkuQVBZIJp5kBFaEfYhYOBZ+cQB3FShhlmlAFGQmFECgYn63EZkSeDDBLdQIUogpcZbSJkJEGcWErQfIDYF0cOrJKxX3/+GSkiSCYAeiEIghwoocSCAjmogRIZwHFVoNt5QuhhmxxKkSCKNKtIItBGSwghHhqxIigxutiaJp5UQsceMdwwkFt5kKAjDiXgoAIIKNzRkkFaPhrKewloVByYyjEnQAABeKQAfI1Bt+lHm0x3ScFbwJZFF11gceBEQ2gXVnejabgJFokgymZ8oZSBQEJpJtCeo0xGNMhdtxJkHnoRJTmmQajax2oOLeSgH6ykmgFGGGA8QinPZpR8kKygCDIgQqAoeAYHGUziK9MVnBUxWMZ6UrGGGGssEbPRJjKth3+IeMUf1obCosWbvGjItzvccFUlMrhxwQvm/ogGCDmAgMb+GxPAm4C8Hr95kJZ+KndAexg9HIqXZS70yJoJ3Vt4vgOw+aSbHD3MuJ8GDaLXtNptokUWUmjxx3UDTb5c5QNNbbHV4G1yCRaBaD0QIyIPZOpBjyNQxu5bH42Ry3zC7Emqq7agfAtLkEFDDS7IJRAokXLyCJJhPHJ9pNdxojPPj/4MRtA2aZAr0w9CfZ3rGsJu8ey1LwuKIt8RMtYlf2hSVhArxq4hJpdwBNtO0ImBvOENG9jABdjSFjSsAAUrsMEbHmAQj4UvOfLCSJiWI4B9Cc4g1OqJm1a3kPdksC7T8sRDNjGIh41wAKybHrS2AK1pbYEQWpDCIqTwh4pMbQr+QKSCEIEIRNoJwSCPOE72QsGIhQROaJCSFKWGEwpCbCETGgFDvQiyxVMdjwysWl4KUlCHPFgiDy4YCKgeAYYDKKk4BwDD7zgWCuplb3vz0h72UFfHDPxKQRy4QNQK8sMgDpGIRkSi9rTHiCYaxDqfKZon/uCJLWwiEYK5Av/M5r8YCXAPOxiBEwhSgzug4QIbsM0EZHAHJrhyBhOsIAJElgA3JqRMhoMhcy4iCEIMwpITqSUdD4JLyu2yIMVc3TEJgimHsLCFe2IICwlxCYFsImxSkMIlEiEFLCBTdTDsIEGmJqJyYuGc6ATEEQ0ChjAlwJEJ4YRyToiQkI1sUpf+EIQnDkYQRRDCKxBpJzJhxglAAGIJYkyBD/JQxjzQwD1gYAQoDmAGRjTqAKBQTxjUqAD1uLGJcJSjAoY5EFBcgAMYwAAHBklI7ZRTROhM5zoJsshFwpMgW6AfJj0BCrBcYRM89cQVgNA/tF3CDDcA5Qgc8QSCsNI3QOrbBN7gSia8IJYF8ZilwDAABECRIgIL67SmNQgPFSREPSnTnxDyCDE1ppmhMMMGV9ccgiTraGp1ayhy0sJQaIcQVshCD7lpBR+69KUxPac6OUocOAoAAJAFAD0Fwh4YNhFTmuIdcn4nkBGRqCCESMSt5ColuiJEoAT5mHyOBwg/mOC1JvD+ASV44AMa0ECFAvmdRw03zzQhbl4RVYBgUiKYR3R0ZweZxElTulIJte6w5kzsYgsCCptK9CBXmF9YfOoJKSCGW1IgKict5ogxjGEEMYiBGTzRVAPKoAYMlMEDbsMCJrBADTWgYFYRYClOdHCjBwmcMjv4W045q1nRKsRYozkQ4Rmzg3UV1QGAZ5C56hLC/SqIhcOJEEGELSJHe7A4FZKILGghCQ5ogAMowMdQiHhf41TES7eQ2HP+YaYDEVoZlvNBUskxFFwdACNOVoiUyfIAX4WTIBbTMorebrL8GWMKTOACF8iWB7R1wZAEksQwlKEMRlJAGMTwgQ94QAwD0W3+G7HU1jj6NjMXyICCNKABDFTAuaEYgowRW+MbHySjjWxxKKIACkoKtbueiIImoPCZTfxgRZrQkCH6YIZImOEEY/gMEQqykhpMwCW+scELXoAGNUzADhW0pUA6OFmJKHisZQ3bjDeCgAGQlDw1uYSJkiCBNuChDb2miJ6tM9xiC4YKfi5IowgigBiO6W+9U04TjYYQecYxJvL0KhMP8AiCzuHbc6jBlbNMBuomMQFHYkQIWiAHPbSgA2gORZe/PCox0zsB3SaIcuUsyApYIAMWYIBzh21sYyMbxwTJqKBDAYUQkahEUTgRilIUhUdzkgsi6kMfnuAELngcFJtGy1T+ZzDqq6Lh0wcJwwFUG4YO5rsguQxnB/mVYYvEXF/74hfIlpmQm8+cXwAwiM9/XvPOiggiQ8950Q2CBR72GgYRiAAMHECQodM86K1TBBZAsbyut+ATB6/gAIQmgFYrxIpYPEhlhYztf/H3pgPhD7jXUIPZZlkSlWGIB+QgB663gADTO/eRFse4R1xn34GMGigYUIEMVEDgWd+615cH9mRL5AgeLufDsxnxiFucCJr4ghNGP/otIAIRXwB5QuDyBgn+5gHBgVdxELAe/r4c1w5JEnK62Bhg0uQShIh4IhqAh+FGoAHCljEowM38OYC9Cgjv2Mq9PCqI5HOfPfFxe4L+DHeCFGILA+PIY8JC9zXoIMuVwJlCDNB3wcgB8Ezf+hUAahBIxNnOV1m8vxnAGYEQvPng9nzR5xBGUIBBcIBAkIBA8AMM2IACAXpfEIESOIGqhxCV8AA/Il9CohFlgHNKB2AXQVcYtnQ2J3NKF1lCZ4I5lxDJ0jH6AnSQlYIeqHMK0XlRYAUOAHVRBwHIZxAjGAAoGHl+N3kWAn0e4VlXYDk9s0Hd11m/5IInGIMHMYJBSBBN8RQiYAkuIAJbCBVUwRAGoDx+B38EgQVXkAl8cAlXEH4EAQkWwFLTswD8F2OSN3lfNwVGqBQsoj98OBaC0V4IwQYP8GlbhnuGOBOhIqI4SwFsO9gAbUARRQAtBVdsVVAFHHKIBfF9bOgRBVAHdSACIiAJESEGHcBu7xZvA8EHV1BNV+AJmbB1CQEJfAQK/QcokjiJglGJl0gThkAFRPCLwBiMT2AImFiMxriIKeYAj0gRf4AFQjEUQhCN0iiNTXCMdVEABeACNFCIDyEGBEAABoCKNdGMzzgE03iO1WiN6riO7NiO7viO8CgRAQEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/nicedit/js/jquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMy4yCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlcy4KICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9MaWNlbnNlCiAqCiAqIERhdGU6IDIwMDktMDItMTkgMTc6MzQ6MjEgLTA1MDAgKFRodSwgMTkgRmViIDIwMDkpCiAqIFJldmlzaW9uOiA2MjQ2CiAqLwooZnVuY3Rpb24oKXsKCnZhciAKCS8vIFdpbGwgc3BlZWQgdXAgcmVmZXJlbmNlcyB0byB3aW5kb3csIGFuZCBhbGxvd3MgbXVuZ2luZyBpdHMgbmFtZS4KCXdpbmRvdyA9IHRoaXMsCgkvLyBXaWxsIHNwZWVkIHVwIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkLCBhbmQgYWxsb3dzIG11bmdpbmcgaXRzIG5hbWUuCgl1bmRlZmluZWQsCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoJLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV8kID0gd2luZG93LiQsCgoJalF1ZXJ5ID0gd2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCS8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJwoJCXJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7Cgl9LAoKCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzIG9yIElEIHN0cmluZ3MKCS8vIChib3RoIG9mIHdoaWNoIHdlIG9wdGltaXplIGZvcikKCXF1aWNrRXhwciA9IC9eW148XSooPCgufFxzKSs+KVtePl0qJHxeIyhbXHctXSspJC8sCgkvLyBJcyBpdCBhIHNpbXBsZSBzZWxlY3RvcgoJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvOwoKalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKCWluaXQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGlvbiB3YXMgcHJvdmlkZWQKCQlzZWxlY3RvciA9IHNlbGVjdG9yIHx8IGRvY3VtZW50OwoKCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXNbMF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQl0aGlzLmNvbnRleHQgPSBzZWxlY3RvcjsKCQkJcmV0dXJuIHRoaXM7CgkJfQoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJpbmcgb3IgYW4gSUQ/CgkJCXZhciBtYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwoKCQkJLy8gVmVyaWZ5IGEgbWF0Y2gsIGFuZCB0aGF0IG5vIGNvbnRleHQgd2FzIHNwZWNpZmllZCBmb3IgI2lkCgkJCWlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHsKCgkJCQkvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSkKCQkJCWlmICggbWF0Y2hbMV0gKQoJCQkJCXNlbGVjdG9yID0galF1ZXJ5LmNsZWFuKCBbIG1hdGNoWzFdIF0sIGNvbnRleHQgKTsKCgkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCgkJCQllbHNlIHsKCQkJCQl2YXIgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFszXSApOwoKCQkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcwoJCQkJCS8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCWlmICggZWxlbSAmJiBlbGVtLmlkICE9IG1hdGNoWzNdICkKCQkJCQkJcmV0dXJuIGpRdWVyeSgpLmZpbmQoIHNlbGVjdG9yICk7CgoJCQkJCS8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQl2YXIgcmV0ID0galF1ZXJ5KCBlbGVtIHx8IFtdICk7CgkJCQkJcmV0LmNvbnRleHQgPSBkb2N1bWVudDsKCQkJCQlyZXQuc2VsZWN0b3IgPSBzZWxlY3RvcjsKCQkJCQlyZXR1cm4gcmV0OwoJCQkJfQoKCQkJLy8gSEFORExFOiAkKGV4cHIsIFtjb250ZXh0XSkKCQkJLy8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZW50KS5maW5kKGV4cHIpCgkJCX0gZWxzZQoJCQkJcmV0dXJuIGpRdWVyeSggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApCgkJCXJldHVybiBqUXVlcnkoIGRvY3VtZW50ICkucmVhZHkoIHNlbGVjdG9yICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IG9sZCBzZWxlY3RvciBzdGF0ZSBpcyBwYXNzZWQgYWxvbmcKCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICYmIHNlbGVjdG9yLmNvbnRleHQgKSB7CgkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKCQl9CgoJCXJldHVybiB0aGlzLnNldEFycmF5KGpRdWVyeS5pc0FycmF5KCBzZWxlY3RvciApID8KCQkJc2VsZWN0b3IgOgoJCQlqUXVlcnkubWFrZUFycmF5KHNlbGVjdG9yKSk7Cgl9LAoKCS8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3IKCXNlbGVjdG9yOiAiIiwKCgkvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCglqcXVlcnk6ICIxLjMuMiIsCgoJLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQKCXNpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmxlbmd0aDsKCX0sCgoJLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgoJLy8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXkKCWdldDogZnVuY3Rpb24oIG51bSApIHsKCQlyZXR1cm4gbnVtID09PSB1bmRlZmluZWQgPwoKCQkJLy8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJheQoJCQlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdGhpcyApIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKCQkJdGhpc1sgbnVtIF07Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgewoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IGpRdWVyeSggZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCXJldC5jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoKCQlpZiAoIG5hbWUgPT09ICJmaW5kIiApCgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSArIHNlbGVjdG9yOwoJCWVsc2UgaWYgKCBuYW1lICkKCQkJcmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciArICIuIiArIG5hbWUgKyAiKCIgKyBzZWxlY3RvciArICIpIjsKCgkJLy8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCgkvLyBGb3JjZSB0aGUgY3VycmVudCBtYXRjaGVkIHNldCBvZiBlbGVtZW50cyB0byBiZWNvbWUKCS8vIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZWxlbWVudHMgKGRlc3Ryb3lpbmcgdGhlIHN0YWNrIGluIHRoZSBwcm9jZXNzKQoJLy8gWW91IHNob3VsZCB1c2UgcHVzaFN0YWNrKCkgaW4gb3JkZXIgdG8gZG8gdGhpcywgYnV0IG1haW50YWluIHRoZSBzdGFjawoJc2V0QXJyYXk6IGZ1bmN0aW9uKCBlbGVtcyApIHsKCQkvLyBSZXNldHRpbmcgdGhlIGxlbmd0aCB0byAwLCB0aGVuIHVzaW5nIHRoZSBuYXRpdmUgQXJyYXkgcHVzaAoJCS8vIGlzIGEgc3VwZXItZmFzdCB3YXkgdG8gcG9wdWxhdGUgYW4gb2JqZWN0IHdpdGggYXJyYXktbGlrZSBwcm9wZXJ0aWVzCgkJdGhpcy5sZW5ndGggPSAwOwoJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCB0aGlzLCBlbGVtcyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCgkvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pCgllYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7CgkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtICYmIGVsZW0uanF1ZXJ5ID8gZWxlbVswXSA6IGVsZW0KCQksIHRoaXMgKTsKCX0sCgoJYXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlLCB0eXBlICkgewoJCXZhciBvcHRpb25zID0gbmFtZTsKCgkJLy8gTG9vayBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UncmUgYWNjZXNzaW5nIGEgc3R5bGUgdmFsdWUKCQlpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApCgkJCQlyZXR1cm4gdGhpc1swXSAmJiBqUXVlcnlbIHR5cGUgfHwgImF0dHIiIF0oIHRoaXNbMF0sIG5hbWUgKTsKCgkJCWVsc2UgewoJCQkJb3B0aW9ucyA9IHt9OwoJCQkJb3B0aW9uc1sgbmFtZSBdID0gdmFsdWU7CgkJCX0KCgkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHNldHRpbmcgc3R5bGUgdmFsdWVzCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXsKCQkJLy8gU2V0IGFsbCB0aGUgc3R5bGVzCgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApCgkJCQlqUXVlcnkuYXR0cigKCQkJCQl0eXBlID8KCQkJCQkJdGhpcy5zdHlsZSA6CgkJCQkJCXRoaXMsCgkJCQkJbmFtZSwgalF1ZXJ5LnByb3AoIHRoaXMsIG9wdGlvbnNbIG5hbWUgXSwgdHlwZSwgaSwgbmFtZSApCgkJCQkpOwoJCX0pOwoJfSwKCgljc3M6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCS8vIGlnbm9yZSBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcwoJCWlmICggKGtleSA9PSAnd2lkdGgnIHx8IGtleSA9PSAnaGVpZ2h0JykgJiYgcGFyc2VGbG9hdCh2YWx1ZSkgPCAwICkKCQkJdmFsdWUgPSB1bmRlZmluZWQ7CgkJcmV0dXJuIHRoaXMuYXR0cigga2V5LCB2YWx1ZSwgImN1ckNTUyIgKTsKCX0sCgoJdGV4dDogZnVuY3Rpb24oIHRleHQgKSB7CgkJaWYgKCB0eXBlb2YgdGV4dCAhPT0gIm9iamVjdCIgJiYgdGV4dCAhPSBudWxsICkKCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOwoKCQl2YXIgcmV0ID0gIiI7CgoJCWpRdWVyeS5lYWNoKCB0ZXh0IHx8IHRoaXMsIGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5lYWNoKCB0aGlzLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCl7CgkJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gOCApCgkJCQkJcmV0ICs9IHRoaXMubm9kZVR5cGUgIT0gMSA/CgkJCQkJCXRoaXMubm9kZVZhbHVlIDoKCQkJCQkJalF1ZXJ5LmZuLnRleHQoIFsgdGhpcyBdICk7CgkJCX0pOwoJCX0pOwoKCQlyZXR1cm4gcmV0OwoJfSwKCgl3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCS8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kCgkJCXZhciB3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWzBdLm93bmVyRG9jdW1lbnQgKS5jbG9uZSgpOwoKCQkJaWYgKCB0aGlzWzBdLnBhcmVudE5vZGUgKQoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbMF0gKTsKCgkJCXdyYXAubWFwKGZ1bmN0aW9uKCl7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKQoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7CgoJCQkJcmV0dXJuIGVsZW07CgkJCX0pLmFwcGVuZCh0aGlzKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5KCB0aGlzICkuY29udGVudHMoKS53cmFwQWxsKCBodG1sICk7CgkJfSk7Cgl9LAoKCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbCApOwoJCX0pOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oZWxlbSl7CgkJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCgkJCQl0aGlzLmFwcGVuZENoaWxkKCBlbGVtICk7CgkJfSk7Cgl9LAoKCXByZXBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oZWxlbSl7CgkJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCgkJCQl0aGlzLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5maXJzdENoaWxkICk7CgkJfSk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oZWxlbSl7CgkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQl9KTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKGVsZW0pewoJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJfSk7Cgl9LAoKCWVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCBqUXVlcnkoIFtdICk7Cgl9LAoKCS8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgoJcHVzaDogW10ucHVzaCwKCXNvcnQ6IFtdLnNvcnQsCglzcGxpY2U6IFtdLnNwbGljZSwKCglmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJaWYgKCB0aGlzLmxlbmd0aCA9PT0gMSApIHsKCQkJdmFyIHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSwgImZpbmQiLCBzZWxlY3RvciApOwoJCQlyZXQubGVuZ3RoID0gMDsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCB0aGlzWzBdLCByZXQgKTsKCQkJcmV0dXJuIHJldDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtKXsKCQkJCXJldHVybiBqUXVlcnkuZmluZCggc2VsZWN0b3IsIGVsZW0gKTsKCQkJfSkpLCAiZmluZCIsIHNlbGVjdG9yICk7CgkJfQoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGV2ZW50cyApIHsKCQkvLyBEbyB0aGUgY2xvbmUKCQl2YXIgcmV0ID0gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ICYmICFqUXVlcnkuaXNYTUxEb2ModGhpcykgKSB7CgkJCQkvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuCgkJCQkvLyB1c2luZyBjbG9uZU5vZGUuIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlCgkJCQkvLyBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ25hbAoJCQkJLy8gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2UgaW5uZXJIVE1MLgoJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyBzb21lIG1vZGlmaWNhdGlvbnMgdG8KCQkJCS8vIGF0dHJpYnV0ZXMgaW4gSUUgdGhhdCBhcmUgYWN0dWFsbHkgb25seSBzdG9yZWQKCQkJCS8vIGFzIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQoJCQkJLy8gdGhlIG5hbWUgYXR0cmlidXRlIG9uIGFuIGlucHV0KS4KCQkJCXZhciBodG1sID0gdGhpcy5vdXRlckhUTUw7CgkJCQlpZiAoICFodG1sICkgewoJCQkJCXZhciBkaXYgPSB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJCQkJZGl2LmFwcGVuZENoaWxkKCB0aGlzLmNsb25lTm9kZSh0cnVlKSApOwoJCQkJCWh0bWwgPSBkaXYuaW5uZXJIVE1MOwoJCQkJfQoKCQkJCXJldHVybiBqUXVlcnkuY2xlYW4oW2h0bWwucmVwbGFjZSgvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLCAiIikucmVwbGFjZSgvXlxzKi8sICIiKV0pWzBdOwoJCQl9IGVsc2UKCQkJCXJldHVybiB0aGlzLmNsb25lTm9kZSh0cnVlKTsKCQl9KTsKCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZXZlbnRzID09PSB0cnVlICkgewoJCQl2YXIgb3JpZyA9IHRoaXMuZmluZCgiKiIpLmFuZFNlbGYoKSwgaSA9IDA7CgoJCQlyZXQuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7CgkJCQlpZiAoIHRoaXMubm9kZU5hbWUgIT09IG9yaWdbaV0ubm9kZU5hbWUgKQoJCQkJCXJldHVybjsKCgkJCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoIG9yaWdbaV0sICJldmVudHMiICk7CgoJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJCWZvciAoIHZhciBoYW5kbGVyIGluIGV2ZW50c1sgdHlwZSBdICkgewoJCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLmRhdGEgKTsKCQkJCQl9CgkJCQl9CgoJCQkJaSsrOwoJCQl9KTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiByZXQ7Cgl9LAoKCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgJiYKCQkJalF1ZXJ5LmdyZXAodGhpcywgZnVuY3Rpb24oZWxlbSwgaSl7CgkJCQlyZXR1cm4gc2VsZWN0b3IuY2FsbCggZWxlbSwgaSApOwoJCQl9KSB8fAoKCQkJalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgalF1ZXJ5LmdyZXAodGhpcywgZnVuY3Rpb24oZWxlbSl7CgkJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCQkJfSkgKSwgImZpbHRlciIsIHNlbGVjdG9yICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgcG9zID0galF1ZXJ5LmV4cHIubWF0Y2guUE9TLnRlc3QoIHNlbGVjdG9yICkgPyBqUXVlcnkoc2VsZWN0b3IpIDogbnVsbCwKCQkJY2xvc2VyID0gMDsKCgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CgkJCXZhciBjdXIgPSB0aGlzOwoJCQl3aGlsZSAoIGN1ciAmJiBjdXIub3duZXJEb2N1bWVudCApIHsKCQkJCWlmICggcG9zID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeShjdXIpLmlzKHNlbGVjdG9yKSApIHsKCQkJCQlqUXVlcnkuZGF0YShjdXIsICJjbG9zZXN0IiwgY2xvc2VyKTsKCQkJCQlyZXR1cm4gY3VyOwoJCQkJfQoJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CgkJCQljbG9zZXIrKzsKCQkJfQoJCX0pOwoJfSwKCglub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKQoJCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSB3aGVyZSBqdXN0IG9uZSBzZWxlY3RvciBpcyBwYXNzZWQgaW4KCQkJaWYgKCBpc1NpbXBsZS50ZXN0KCBzZWxlY3RvciApICkKCQkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcywgdHJ1ZSApLCAibm90Iiwgc2VsZWN0b3IgKTsKCQkJZWxzZQoJCQkJc2VsZWN0b3IgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzICk7CgoJCXZhciBpc0FycmF5TGlrZSA9IHNlbGVjdG9yLmxlbmd0aCAmJiBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXSAhPT0gdW5kZWZpbmVkICYmICFzZWxlY3Rvci5ub2RlVHlwZTsKCQlyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCXJldHVybiBpc0FycmF5TGlrZSA/IGpRdWVyeS5pbkFycmF5KCB0aGlzLCBzZWxlY3RvciApIDwgMCA6IHRoaXMgIT0gc2VsZWN0b3I7CgkJfSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZSggalF1ZXJ5Lm1lcmdlKAoJCQl0aGlzLmdldCgpLAoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJCWpRdWVyeSggc2VsZWN0b3IgKSA6CgkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciApCgkJKSkpOwoJfSwKCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXNlbGVjdG9yICYmIGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwOwoJfSwKCgloYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXNlbGVjdG9yICYmIHRoaXMuaXMoICIuIiArIHNlbGVjdG9yICk7Cgl9LAoKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsJCQkKCQkJdmFyIGVsZW0gPSB0aGlzWzBdOwoKCQkJaWYgKCBlbGVtICkgewoJCQkJaWYoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgJ29wdGlvbicgKSApCgkJCQkJcmV0dXJuIChlbGVtLmF0dHJpYnV0ZXMudmFsdWUgfHwge30pLnNwZWNpZmllZCA/IGVsZW0udmFsdWUgOiBlbGVtLnRleHQ7CgkJCQkKCQkJCS8vIFdlIG5lZWQgdG8gaGFuZGxlIHNlbGVjdCBib3hlcyBzcGVjaWFsCgkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInNlbGVjdCIgKSApIHsKCQkJCQl2YXIgaW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsCgkJCQkJCXZhbHVlcyA9IFtdLAoJCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCQlvbmUgPSBlbGVtLnR5cGUgPT0gInNlbGVjdC1vbmUiOwoKCQkJCQkvLyBOb3RoaW5nIHdhcyBzZWxlY3RlZAoJCQkJCWlmICggaW5kZXggPCAwICkKCQkJCQkJcmV0dXJuIG51bGw7CgoJCQkJCS8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnMKCQkJCQlmb3IgKCB2YXIgaSA9IG9uZSA/IGluZGV4IDogMCwgbWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQkJdmFyIG9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKCgkJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkICkgewoJCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZjIHZhbHVlIGZvciB0aGUgb3B0aW9uCgkJCQkJCQl2YWx1ZSA9IGpRdWVyeShvcHRpb24pLnZhbCgpOwoKCQkJCQkJCS8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCgkJCQkJCQlpZiAoIG9uZSApCgkJCQkJCQkJcmV0dXJuIHZhbHVlOwoKCQkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCQl2YWx1ZXMucHVzaCggdmFsdWUgKTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJcmV0dXJuIHZhbHVlczsJCQkJCgkJCQl9CgoJCQkJLy8gRXZlcnl0aGluZyBlbHNlLCB3ZSBqdXN0IGdyYWIgdGhlIHZhbHVlCgkJCQlyZXR1cm4gKGVsZW0udmFsdWUgfHwgIiIpLnJlcGxhY2UoL1xyL2csICIiKTsKCgkJCX0KCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgKQoJCQl2YWx1ZSArPSAnJzsKCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gMSApCgkJCQlyZXR1cm47CgoJCQlpZiAoIGpRdWVyeS5pc0FycmF5KHZhbHVlKSAmJiAvcmFkaW98Y2hlY2tib3gvLnRlc3QoIHRoaXMudHlwZSApICkKCQkJCXRoaXMuY2hlY2tlZCA9IChqUXVlcnkuaW5BcnJheSh0aGlzLnZhbHVlLCB2YWx1ZSkgPj0gMCB8fAoJCQkJCWpRdWVyeS5pbkFycmF5KHRoaXMubmFtZSwgdmFsdWUpID49IDApOwoKCQkJZWxzZSBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVjdCIgKSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KHZhbHVlKTsKCgkJCQlqUXVlcnkoICJvcHRpb24iLCB0aGlzICkuZWFjaChmdW5jdGlvbigpewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSAoalF1ZXJ5LmluQXJyYXkoIHRoaXMudmFsdWUsIHZhbHVlcyApID49IDAgfHwKCQkJCQkJalF1ZXJ5LmluQXJyYXkoIHRoaXMudGV4dCwgdmFsdWVzICkgPj0gMCk7CgkJCQl9KTsKCgkJCQlpZiAoICF2YWx1ZXMubGVuZ3RoICkKCQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKCgkJCX0gZWxzZQoJCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwoJCX0pOwoJfSwKCglodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoJCQkodGhpc1swXSA/CgkJCQl0aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKC8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csICIiKSA6CgkJCQludWxsKSA6CgkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHRoaXMuYWZ0ZXIoIHZhbHVlICkucmVtb3ZlKCk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQlyZXR1cm4gdGhpcy5zbGljZSggaSwgK2kgKyAxICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICksCgkJCSJzbGljZSIsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQl9KSk7Cgl9LAoKCWFuZFNlbGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9LAoKCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgewoJCWlmICggdGhpc1swXSApIHsKCQkJdmFyIGZyYWdtZW50ID0gKHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCB0aGlzWzBdKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksCgkJCQlzY3JpcHRzID0galF1ZXJ5LmNsZWFuKCBhcmdzLCAodGhpc1swXS5vd25lckRvY3VtZW50IHx8IHRoaXNbMF0pLCBmcmFnbWVudCApLAoJCQkJZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkOwoKCQkJaWYgKCBmaXJzdCApCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApCgkJCQkJY2FsbGJhY2suY2FsbCggcm9vdCh0aGlzW2ldLCBmaXJzdCksIHRoaXMubGVuZ3RoID4gMSB8fCBpID4gMCA/CgkJCQkJCQlmcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkgOiBmcmFnbWVudCApOwoJCQoJCQlpZiAoIHNjcmlwdHMgKQoJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGV2YWxTY3JpcHQgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJCQoJCWZ1bmN0aW9uIHJvb3QoIGVsZW0sIGN1ciApIHsKCQkJcmV0dXJuIHRhYmxlICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUiKSAmJiBqUXVlcnkubm9kZU5hbWUoY3VyLCAidHIiKSA/CgkJCQkoZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXSB8fAoJCQkJZWxlbS5hcHBlbmRDaGlsZChlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSkpIDoKCQkJCWVsZW07CgkJfQoJfQp9OwoKLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbgpqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgpmdW5jdGlvbiBldmFsU2NyaXB0KCBpLCBlbGVtICkgewoJaWYgKCBlbGVtLnNyYyApCgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IGVsZW0uc3JjLAoJCQlhc3luYzogZmFsc2UsCgkJCWRhdGFUeXBlOiAic2NyaXB0IgoJCX0pOwoKCWVsc2UKCQlqUXVlcnkuZ2xvYmFsRXZhbCggZWxlbS50ZXh0IHx8IGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lckhUTUwgfHwgIiIgKTsKCglpZiAoIGVsZW0ucGFyZW50Tm9kZSApCgkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7Cn0KCmZ1bmN0aW9uIG5vdygpewoJcmV0dXJuICtuZXcgRGF0ZTsKfQoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCS8vIGNvcHkgcmVmZXJlbmNlIHRvIHRhcmdldCBvYmplY3QKCXZhciB0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sIGkgPSAxLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLCBkZWVwID0gZmFsc2UsIG9wdGlvbnM7CgoJLy8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvbgoJaWYgKCB0eXBlb2YgdGFyZ2V0ID09PSAiYm9vbGVhbiIgKSB7CgkJZGVlcCA9IHRhcmdldDsKCQl0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307CgkJLy8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldAoJCWkgPSAyOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApCgkJdGFyZ2V0ID0ge307CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PSBpICkgewoJCXRhcmdldCA9IHRoaXM7CgkJLS1pOwoJfQoKCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQkJdmFyIHNyYyA9IHRhcmdldFsgbmFtZSBdLCBjb3B5ID0gb3B0aW9uc1sgbmFtZSBdOwoKCQkJCS8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKCQkJCWlmICggdGFyZ2V0ID09PSBjb3B5ICkKCQkJCQljb250aW51ZTsKCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgb2JqZWN0IHZhbHVlcwoJCQkJaWYgKCBkZWVwICYmIGNvcHkgJiYgdHlwZW9mIGNvcHkgPT09ICJvYmplY3QiICYmICFjb3B5Lm5vZGVUeXBlICkKCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIAoJCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQkJc3JjIHx8ICggY29weS5sZW5ndGggIT0gbnVsbCA/IFsgXSA6IHsgfSApCgkJCQkJLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApCgkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBjb3B5OwoKCQkJfQoKCS8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0CglyZXR1cm4gdGFyZ2V0Owp9OwoKLy8gZXhjbHVkZSB0aGUgZm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAp2YXIJZXhjbHVkZSA9IC96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9pLAoJLy8gY2FjaGUgZGVmYXVsdFZpZXcKCWRlZmF1bHRWaWV3ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwge30sCgl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgpqUXVlcnkuZXh0ZW5kKHsKCW5vQ29uZmxpY3Q6IGZ1bmN0aW9uKCBkZWVwICkgewoJCXdpbmRvdy4kID0gXyQ7CgoJCWlmICggZGVlcCApCgkJCXdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5OwoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKCX0sCgoJaXNBcnJheTogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBBcnJheV0iOwoJfSwKCgkvLyBjaGVjayBpZiBhbiBlbGVtZW50IGlzIGluIGEgKG9yIGlzIGFuKSBYTUwgZG9jdW1lbnQKCWlzWE1MRG9jOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJCSEhZWxlbS5vd25lckRvY3VtZW50ICYmIGpRdWVyeS5pc1hNTERvYyggZWxlbS5vd25lckRvY3VtZW50ICk7Cgl9LAoKCS8vIEV2YWx1bGF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dAoJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCBkYXRhICYmIC9cUy8udGVzdChkYXRhKSApIHsKCQkJLy8gSW5zcGlyZWQgYnkgY29kZSBieSBBbmRyZWEgR2lhbW1hcmNoaQoJCQkvLyBodHRwOi8vd2VicmVmbGVjdGlvbi5ibG9nc3BvdC5jb20vMjAwNy8wOC9nbG9iYWwtc2NvcGUtZXZhbHVhdGlvbi1hbmQtZG9tLmh0bWwKCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoKCQkJc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5zY3JpcHRFdmFsICkKCQkJCXNjcmlwdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIGRhdGEgKSApOwoJCQllbHNlCgkJCQlzY3JpcHQudGV4dCA9IGRhdGE7CgoJCQkvLyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgYXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQgYW4gSUU2IGJ1Zy4KCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSkuCgkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOwoJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQl9Cgl9LAoKCW5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gbmFtZS50b1VwcGVyQ2FzZSgpOwoJfSwKCgkvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgllYWNoOiBmdW5jdGlvbiggb2JqZWN0LCBjYWxsYmFjaywgYXJncyApIHsKCQl2YXIgbmFtZSwgaSA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7CgoJCWlmICggYXJncyApIHsKCQkJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkKCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmplY3RbIG5hbWUgXSwgYXJncyApID09PSBmYWxzZSApCgkJCQkJCWJyZWFrOwoJCQl9IGVsc2UKCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKQoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgaSsrIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKQoJCQkJCQlicmVhazsKCgkJLy8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2gKCQl9IGVsc2UgewoJCQlpZiAoIGxlbmd0aCA9PT0gdW5kZWZpbmVkICkgewoJCQkJZm9yICggbmFtZSBpbiBvYmplY3QgKQoJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2JqZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVjdFsgbmFtZSBdICkgPT09IGZhbHNlICkKCQkJCQkJYnJlYWs7CgkJCX0gZWxzZQoJCQkJZm9yICggdmFyIHZhbHVlID0gb2JqZWN0WzBdOwoJCQkJCWkgPCBsZW5ndGggJiYgY2FsbGJhY2suY2FsbCggdmFsdWUsIGksIHZhbHVlICkgIT09IGZhbHNlOyB2YWx1ZSA9IG9iamVjdFsrK2ldICl7fQoJCX0KCgkJcmV0dXJuIG9iamVjdDsKCX0sCgoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCB0eXBlLCBpLCBuYW1lICkgewoJCS8vIEhhbmRsZSBleGVjdXRhYmxlIGZ1bmN0aW9ucwoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKQoJCQl2YWx1ZSA9IHZhbHVlLmNhbGwoIGVsZW0sIGkgKTsKCgkJLy8gSGFuZGxlIHBhc3NpbmcgaW4gYSBudW1iZXIgdG8gYSBDU1MgcHJvcGVydHkKCQlyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiAmJiB0eXBlID09ICJjdXJDU1MiICYmICFleGNsdWRlLnRlc3QoIG5hbWUgKSA/CgkJCXZhbHVlICsgInB4IiA6CgkJCXZhbHVlOwoJfSwKCgljbGFzc05hbWU6IHsKCQkvLyBpbnRlcm5hbCBvbmx5LCB1c2UgYWRkQ2xhc3MoImNsYXNzIikKCQlhZGQ6IGZ1bmN0aW9uKCBlbGVtLCBjbGFzc05hbWVzICkgewoJCQlqUXVlcnkuZWFjaCgoY2xhc3NOYW1lcyB8fCAiIikuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpLCBjbGFzc05hbWUpewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDEgJiYgIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBlbGVtLmNsYXNzTmFtZSwgY2xhc3NOYW1lICkgKQoJCQkJCWVsZW0uY2xhc3NOYW1lICs9IChlbGVtLmNsYXNzTmFtZSA/ICIgIiA6ICIiKSArIGNsYXNzTmFtZTsKCQkJfSk7CgkJfSwKCgkJLy8gaW50ZXJuYWwgb25seSwgdXNlIHJlbW92ZUNsYXNzKCJjbGFzcyIpCgkJcmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKCQkJaWYgKGVsZW0ubm9kZVR5cGUgPT0gMSkKCQkJCWVsZW0uY2xhc3NOYW1lID0gY2xhc3NOYW1lcyAhPT0gdW5kZWZpbmVkID8KCQkJCQlqUXVlcnkuZ3JlcChlbGVtLmNsYXNzTmFtZS5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGNsYXNzTmFtZSl7CgkJCQkJCXJldHVybiAhalF1ZXJ5LmNsYXNzTmFtZS5oYXMoIGNsYXNzTmFtZXMsIGNsYXNzTmFtZSApOwoJCQkJCX0pLmpvaW4oIiAiKSA6CgkJCQkJIiI7CgkJfSwKCgkJLy8gaW50ZXJuYWwgb25seSwgdXNlIGhhc0NsYXNzKCJjbGFzcyIpCgkJaGFzOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lICkgewoJCQlyZXR1cm4gZWxlbSAmJiBqUXVlcnkuaW5BcnJheSggY2xhc3NOYW1lLCAoZWxlbS5jbGFzc05hbWUgfHwgZWxlbSkudG9TdHJpbmcoKS5zcGxpdCgvXHMrLykgKSA+IC0xOwoJCX0KCX0sCgoJLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBwcm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucwoJc3dhcDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkgewoJCXZhciBvbGQgPSB7fTsKCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOwoJCX0KCgkJY2FsbGJhY2suY2FsbCggZWxlbSApOwoKCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlLCBleHRyYSApIHsKCQlpZiAoIG5hbWUgPT0gIndpZHRoIiB8fCBuYW1lID09ICJoZWlnaHQiICkgewoJCQl2YXIgdmFsLCBwcm9wcyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiJibG9jayIgfSwgd2hpY2ggPSBuYW1lID09ICJ3aWR0aCIgPyBbICJMZWZ0IiwgIlJpZ2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXTsKCgkJCWZ1bmN0aW9uIGdldFdIKCkgewoJCQkJdmFsID0gbmFtZSA9PSAid2lkdGgiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0OwoKCQkJCWlmICggZXh0cmEgPT09ICJib3JkZXIiICkKCQkJCQlyZXR1cm47CgoJCQkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoICFleHRyYSApCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMsIHRydWUpKSB8fCAwOwoJCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkKCQkJCQkJdmFsICs9IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgIm1hcmdpbiIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKCQkJCQllbHNlCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJib3JkZXIiICsgdGhpcyArICJXaWR0aCIsIHRydWUpKSB8fCAwOwoJCQkJfSk7CgkJCX0KCgkJCWlmICggZWxlbS5vZmZzZXRXaWR0aCAhPT0gMCApCgkJCQlnZXRXSCgpOwoJCQllbHNlCgkJCQlqUXVlcnkuc3dhcCggZWxlbSwgcHJvcHMsIGdldFdIICk7CgoJCQlyZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh2YWwpKTsKCQl9CgoJCXJldHVybiBqUXVlcnkuY3VyQ1NTKCBlbGVtLCBuYW1lLCBmb3JjZSApOwoJfSwKCgljdXJDU1M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBmb3JjZSApIHsKCQl2YXIgcmV0LCBzdHlsZSA9IGVsZW0uc3R5bGU7CgoJCS8vIFdlIG5lZWQgdG8gaGFuZGxlIG9wYWNpdHkgc3BlY2lhbCBpbiBJRQoJCWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7CgkJCXJldCA9IGpRdWVyeS5hdHRyKCBzdHlsZSwgIm9wYWNpdHkiICk7CgoJCQlyZXR1cm4gcmV0ID09ICIiID8KCQkJCSIxIiA6CgkJCQlyZXQ7CgkJfQoKCQkvLyBNYWtlIHN1cmUgd2UncmUgdXNpbmcgdGhlIHJpZ2h0IG5hbWUgZm9yIGdldHRpbmcgdGhlIGZsb2F0IHZhbHVlCgkJaWYgKCBuYW1lLm1hdGNoKCAvZmxvYXQvaSApICkKCQkJbmFtZSA9IHN0eWxlRmxvYXQ7CgoJCWlmICggIWZvcmNlICYmIHN0eWxlICYmIHN0eWxlWyBuYW1lIF0gKQoJCQlyZXQgPSBzdHlsZVsgbmFtZSBdOwoKCQllbHNlIGlmICggZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKCgkJCS8vIE9ubHkgImZsb2F0IiBpcyBuZWVkZWQgaGVyZQoJCQlpZiAoIG5hbWUubWF0Y2goIC9mbG9hdC9pICkgKQoJCQkJbmFtZSA9ICJmbG9hdCI7CgoJCQluYW1lID0gbmFtZS5yZXBsYWNlKCAvKFtBLVpdKS9nLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CgoJCQl2YXIgY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTsKCgkJCWlmICggY29tcHV0ZWRTdHlsZSApCgkJCQlyZXQgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKTsKCgkJCS8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5CgkJCWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgcmV0ID09ICIiICkKCQkJCXJldCA9ICIxIjsKCgkJfSBlbHNlIGlmICggZWxlbS5jdXJyZW50U3R5bGUgKSB7CgkJCXZhciBjYW1lbENhc2UgPSBuYW1lLnJlcGxhY2UoL1wtKFx3KS9nLCBmdW5jdGlvbihhbGwsIGxldHRlcil7CgkJCQlyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7CgkJCX0pOwoKCQkJcmV0ID0gZWxlbS5jdXJyZW50U3R5bGVbIG5hbWUgXSB8fCBlbGVtLmN1cnJlbnRTdHlsZVsgY2FtZWxDYXNlIF07CgoJCQkvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCgkJCS8vIGh0dHA6Ly9lcmlrLmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8jY29tbWVudC0xMDIyOTEKCgkJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcgoJCQkvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHMKCQkJaWYgKCAhL15cZCsocHgpPyQvaS50ZXN0KCByZXQgKSAmJiAvXlxkLy50ZXN0KCByZXQgKSApIHsKCQkJCS8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKCQkJCXZhciBsZWZ0ID0gc3R5bGUubGVmdCwgcnNMZWZ0ID0gZWxlbS5ydW50aW1lU3R5bGUubGVmdDsKCgkJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gZWxlbS5jdXJyZW50U3R5bGUubGVmdDsKCQkJCXN0eWxlLmxlZnQgPSByZXQgfHwgMDsKCQkJCXJldCA9IHN0eWxlLnBpeGVsTGVmdCArICJweCI7CgoJCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcwoJCQkJc3R5bGUubGVmdCA9IGxlZnQ7CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0OwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCApIHsKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JwoJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKQoJCQljb250ZXh0ID0gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHRbMF0gJiYgY29udGV4dFswXS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OwoKCQkvLyBJZiBhIHNpbmdsZSBzdHJpbmcgaXMgcGFzc2VkIGluIGFuZCBpdCdzIGEgc2luZ2xlIHRhZwoJCS8vIGp1c3QgZG8gYSBjcmVhdGVFbGVtZW50IGFuZCBza2lwIHRoZSByZXN0CgkJaWYgKCAhZnJhZ21lbnQgJiYgZWxlbXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBlbGVtc1swXSA9PT0gInN0cmluZyIgKSB7CgkJCXZhciBtYXRjaCA9IC9ePChcdyspXHMqXC8/PiQvLmV4ZWMoZWxlbXNbMF0pOwoJCQlpZiAoIG1hdGNoICkKCQkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggbWF0Y2hbMV0gKSBdOwoJCX0KCgkJdmFyIHJldCA9IFtdLCBzY3JpcHRzID0gW10sIGRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgoJCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbihpLCBlbGVtKXsKCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gIm51bWJlciIgKQoJCQkJZWxlbSArPSAnJzsKCgkJCWlmICggIWVsZW0gKQoJCQkJcmV0dXJuOwoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCS8vIEZpeCAiWEhUTUwiLXN0eWxlIHRhZ3MgaW4gYWxsIGJyb3dzZXJzCgkJCQllbGVtID0gZWxlbS5yZXBsYWNlKC8oPChcdyspW14+XSo/KVwvPi9nLCBmdW5jdGlvbihhbGwsIGZyb250LCB0YWcpewoJCQkJCXJldHVybiB0YWcubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbXxocnxhcmVhfGVtYmVkKSQvaSkgPwoJCQkJCQlhbGwgOgoJCQkJCQlmcm9udCArICI+PC8iICsgdGFnICsgIj4iOwoJCQkJfSk7CgoJCQkJLy8gVHJpbSB3aGl0ZXNwYWNlLCBvdGhlcndpc2UgaW5kZXhPZiB3b24ndCB3b3JrIGFzIGV4cGVjdGVkCgkJCQl2YXIgdGFncyA9IGVsZW0ucmVwbGFjZSgvXlxzKy8sICIiKS5zdWJzdHJpbmcoMCwgMTApLnRvTG93ZXJDYXNlKCk7CgoJCQkJdmFyIHdyYXAgPQoJCQkJCS8vIG9wdGlvbiBvciBvcHRncm91cAoJCQkJCSF0YWdzLmluZGV4T2YoIjxvcHQiKSAmJgoJCQkJCVsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjxsZWciKSAmJgoJCQkJCVsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0gfHwKCgkJCQkJdGFncy5tYXRjaCgvXjwodGhlYWR8dGJvZHl8dGZvb3R8Y29sZ3xjYXApLykgJiYKCQkJCQlbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjx0ciIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSB8fAoKCQkJCSAJLy8gPHRoZWFkPiBtYXRjaGVkIGFib3ZlCgkJCQkJKCF0YWdzLmluZGV4T2YoIjx0ZCIpIHx8ICF0YWdzLmluZGV4T2YoIjx0aCIpKSAmJgoJCQkJCVsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0gfHwKCgkJCQkJIXRhZ3MuaW5kZXhPZigiPGNvbCIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIgXSB8fAoKCQkJCQkvLyBJRSBjYW4ndCBzZXJpYWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5CgkJCQkJIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgJiYKCQkJCQlbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF0gfHwKCgkJCQkJWyAwLCAiIiwgIiIgXTsKCgkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCgkJCQlkaXYuaW5uZXJIVE1MID0gd3JhcFsxXSArIGVsZW0gKyB3cmFwWzJdOwoKCQkJCS8vIE1vdmUgdG8gdGhlIHJpZ2h0IGRlcHRoCgkJCQl3aGlsZSAoIHdyYXBbMF0tLSApCgkJCQkJZGl2ID0gZGl2Lmxhc3RDaGlsZDsKCgkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQudGJvZHkgKSB7CgoJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KCQkJCQl2YXIgaGFzQm9keSA9IC88dGJvZHkvaS50ZXN0KGVsZW0pLAoJCQkJCQl0Ym9keSA9ICF0YWdzLmluZGV4T2YoIjx0YWJsZSIpICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIGJhcmUgPHRoZWFkPiBvciA8dGZvb3Q+CgkJCQkJCXdyYXBbMV0gPT0gIjx0YWJsZT4iICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5jaGlsZE5vZGVzIDoKCQkJCQkJCVtdOwoKCQkJCQlmb3IgKCB2YXIgaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApCgkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKQoJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgoJCQkJCX0KCgkJCQkvLyBJRSBjb21wbGV0ZWx5IGtpbGxzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIGlubmVySFRNTCBpcyB1c2VkCgkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiAvXlxzLy50ZXN0KCBlbGVtICkgKQoJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0ubWF0Y2goL15ccyovKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoJCQkJCgkJCQllbGVtID0galF1ZXJ5Lm1ha2VBcnJheSggZGl2LmNoaWxkTm9kZXMgKTsKCQkJfQoKCQkJaWYgKCBlbGVtLm5vZGVUeXBlICkKCQkJCXJldC5wdXNoKCBlbGVtICk7CgkJCWVsc2UKCQkJCXJldCA9IGpRdWVyeS5tZXJnZSggcmV0LCBlbGVtICk7CgoJCX0pOwoKCQlpZiAoIGZyYWdtZW50ICkgewoJCQlmb3IgKCB2YXIgaSA9IDA7IHJldFtpXTsgaSsrICkgewoJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHJldFtpXSwgInNjcmlwdCIgKSAmJiAoIXJldFtpXS50eXBlIHx8IHJldFtpXS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICJ0ZXh0L2phdmFzY3JpcHQiKSApIHsKCQkJCQlzY3JpcHRzLnB1c2goIHJldFtpXS5wYXJlbnROb2RlID8gcmV0W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHJldFtpXSApIDogcmV0W2ldICk7CgkJCQl9IGVsc2UgewoJCQkJCWlmICggcmV0W2ldLm5vZGVUeXBlID09PSAxICkKCQkJCQkJcmV0LnNwbGljZS5hcHBseSggcmV0LCBbaSArIDEsIDBdLmNvbmNhdChqUXVlcnkubWFrZUFycmF5KHJldFtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpKSApOwoJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCByZXRbaV0gKTsKCQkJCX0KCQkJfQoJCQkKCQkJcmV0dXJuIHNjcmlwdHM7CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJLy8gZG9uJ3Qgc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICghZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4KQoJCQlyZXR1cm4gdW5kZWZpbmVkOwoKCQl2YXIgbm90eG1sID0gIWpRdWVyeS5pc1hNTERvYyggZWxlbSApLAoJCQkvLyBXaGV0aGVyIHdlIGFyZSBzZXR0aW5nIChvciBnZXR0aW5nKQoJCQlzZXQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkOwoKCQkvLyBUcnkgdG8gbm9ybWFsaXplL2ZpeCB0aGUgbmFtZQoJCW5hbWUgPSBub3R4bWwgJiYgalF1ZXJ5LnByb3BzWyBuYW1lIF0gfHwgbmFtZTsKCgkJLy8gT25seSBkbyBhbGwgdGhlIGZvbGxvd2luZyBpZiB0aGlzIGlzIGEgbm9kZSAoZmFzdGVyIGZvciBzdHlsZSkKCQkvLyBJRSBlbGVtLmdldEF0dHJpYnV0ZSBwYXNzZXMgZXZlbiBmb3Igc3R5bGUKCQlpZiAoIGVsZW0udGFnTmFtZSApIHsKCgkJCS8vIFRoZXNlIGF0dHJpYnV0ZXMgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudAoJCQl2YXIgc3BlY2lhbCA9IC9ocmVmfHNyY3xzdHlsZS8udGVzdCggbmFtZSApOwoKCQkJLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHByb3BlcnR5IG9mIGEgaGlkZGVuIG9wdGlvbgoJCQkvLyBBY2Nlc3NpbmcgdGhlIHBhcmVudCdzIHNlbGVjdGVkSW5kZXggcHJvcGVydHkgZml4ZXMgaXQKCQkJaWYgKCBuYW1lID09ICJzZWxlY3RlZCIgJiYgZWxlbS5wYXJlbnROb2RlICkKCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoKCQkJLy8gSWYgYXBwbGljYWJsZSwgYWNjZXNzIHRoZSBhdHRyaWJ1dGUgdmlhIHRoZSBET00gMCB3YXkKCQkJaWYgKCBuYW1lIGluIGVsZW0gJiYgbm90eG1sICYmICFzcGVjaWFsICkgewoJCQkJaWYgKCBzZXQgKXsKCQkJCQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCgkJCQkJaWYgKCBuYW1lID09ICJ0eXBlIiAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSAmJiBlbGVtLnBhcmVudE5vZGUgKQoJCQkJCQl0aHJvdyAidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIjsKCgkJCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgoJCQkJLy8gYnJvd3NlcnMgaW5kZXggZWxlbWVudHMgYnkgaWQvbmFtZSBvbiBmb3JtcywgZ2l2ZSBwcmlvcml0eSB0byBhdHRyaWJ1dGVzLgoJCQkJaWYoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImZvcm0iICkgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpICkKCQkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkubm9kZVZhbHVlOwoKCQkJCS8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvCgkJCQlpZiAoIG5hbWUgPT0gInRhYkluZGV4IiApIHsKCQkJCQl2YXIgYXR0cmlidXRlTm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggInRhYkluZGV4IiApOwoJCQkJCXJldHVybiBhdHRyaWJ1dGVOb2RlICYmIGF0dHJpYnV0ZU5vZGUuc3BlY2lmaWVkCgkJCQkJCT8gYXR0cmlidXRlTm9kZS52YWx1ZQoJCQkJCQk6IGVsZW0ubm9kZU5hbWUubWF0Y2goLyhidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkvaSkKCQkJCQkJCT8gMAoJCQkJCQkJOiBlbGVtLm5vZGVOYW1lLm1hdGNoKC9eKGF8YXJlYSkkL2kpICYmIGVsZW0uaHJlZgoJCQkJCQkJCT8gMAoJCQkJCQkJCTogdW5kZWZpbmVkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CgkJCX0KCgkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnN0eWxlICYmIG5vdHhtbCAmJiAgbmFtZSA9PSAic3R5bGUiICkKCQkJCXJldHVybiBqUXVlcnkuYXR0ciggZWxlbS5zdHlsZSwgImNzc1RleHQiLCB2YWx1ZSApOwoKCQkJaWYgKCBzZXQgKQoJCQkJLy8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgKGFsbCBicm93c2VycyBkbyB0aGlzIGJ1dCBJRSkgc2VlICMxMDcwCgkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgIiIgKyB2YWx1ZSApOwoKCQkJdmFyIGF0dHIgPSAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgJiYgbm90eG1sICYmIHNwZWNpYWwKCQkJCQkvLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJRQoJCQkJCT8gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDIgKQoJCQkJCTogZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJCS8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCgkJCXJldHVybiBhdHRyID09PSBudWxsID8gdW5kZWZpbmVkIDogYXR0cjsKCQl9CgoJCS8vIGVsZW0gaXMgYWN0dWFsbHkgZWxlbS5zdHlsZSAuLi4gc2V0IHRoZSBzdHlsZQoKCQkvLyBJRSB1c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5vcGFjaXR5ICYmIG5hbWUgPT0gIm9wYWNpdHkiICkgewoJCQlpZiAoIHNldCApIHsKCQkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAoJCQkJLy8gRm9yY2UgaXQgYnkgc2V0dGluZyB0aGUgem9vbSBsZXZlbAoJCQkJZWxlbS56b29tID0gMTsKCgkJCQkvLyBTZXQgdGhlIGFscGhhIGZpbHRlciB0byBzZXQgdGhlIG9wYWNpdHkKCQkJCWVsZW0uZmlsdGVyID0gKGVsZW0uZmlsdGVyIHx8ICIiKS5yZXBsYWNlKCAvYWxwaGFcKFteKV0qXCkvLCAiIiApICsKCQkJCQkocGFyc2VJbnQoIHZhbHVlICkgKyAnJyA9PSAiTmFOIiA/ICIiIDogImFscGhhKG9wYWNpdHk9IiArIHZhbHVlICogMTAwICsgIikiKTsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZmlsdGVyICYmIGVsZW0uZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9IikgPj0gMCA/CgkJCQkocGFyc2VGbG9hdCggZWxlbS5maWx0ZXIubWF0Y2goL29wYWNpdHk9KFteKV0qKS8pWzFdICkgLyAxMDApICsgJyc6CgkJCQkiIjsKCQl9CgoJCW5hbWUgPSBuYW1lLnJlcGxhY2UoLy0oW2Etel0pL2lnLCBmdW5jdGlvbihhbGwsIGxldHRlcil7CgkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKCQl9KTsKCgkJaWYgKCBzZXQgKQoJCQllbGVtWyBuYW1lIF0gPSB2YWx1ZTsKCgkJcmV0dXJuIGVsZW1bIG5hbWUgXTsKCX0sCgoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuICh0ZXh0IHx8ICIiKS5yZXBsYWNlKCAvXlxzK3xccyskL2csICIiICk7Cgl9LAoKCW1ha2VBcnJheTogZnVuY3Rpb24oIGFycmF5ICkgewoJCXZhciByZXQgPSBbXTsKCgkJaWYoIGFycmF5ICE9IG51bGwgKXsKCQkJdmFyIGkgPSBhcnJheS5sZW5ndGg7CgkJCS8vIFRoZSB3aW5kb3csIHN0cmluZ3MgKGFuZCBmdW5jdGlvbnMpIGFsc28gaGF2ZSAnbGVuZ3RoJwoJCQlpZiggaSA9PSBudWxsIHx8IHR5cGVvZiBhcnJheSA9PT0gInN0cmluZyIgfHwgalF1ZXJ5LmlzRnVuY3Rpb24oYXJyYXkpIHx8IGFycmF5LnNldEludGVydmFsICkKCQkJCXJldFswXSA9IGFycmF5OwoJCQllbHNlCgkJCQl3aGlsZSggaSApCgkJCQkJcmV0Wy0taV0gPSBhcnJheVtpXTsKCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCWluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnJheSApIHsKCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkKCQkvLyBVc2UgPT09IGJlY2F1c2Ugb24gSUUsIHdpbmRvdyA9PSBkb2N1bWVudAoJCQlpZiAoIGFycmF5WyBpIF0gPT09IGVsZW0gKQoJCQkJcmV0dXJuIGk7CgoJCXJldHVybiAtMTsKCX0sCgoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCS8vIFdlIGhhdmUgdG8gbG9vcCB0aGlzIHdheSBiZWNhdXNlIElFICYgT3BlcmEgb3ZlcndyaXRlIHRoZSBsZW5ndGgKCQkvLyBleHBhbmRvIG9mIGdldEVsZW1lbnRzQnlUYWdOYW1lCgkJdmFyIGkgPSAwLCBlbGVtLCBwb3MgPSBmaXJzdC5sZW5ndGg7CgkJLy8gQWxzbywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29ycmVjdCBlbGVtZW50cyBhcmUgYmVpbmcgcmV0dXJuZWQKCQkvLyAoSUUgcmV0dXJucyBjb21tZW50IG5vZGVzIGluIGEgJyonIHF1ZXJ5KQoJCWlmICggIWpRdWVyeS5zdXBwb3J0LmdldEFsbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IHNlY29uZFsgaSsrIF0pICE9IG51bGwgKQoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlICE9IDggKQoJCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCgkJfSBlbHNlCgkJCXdoaWxlICggKGVsZW0gPSBzZWNvbmRbIGkrKyBdKSAhPSBudWxsICkKCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCgkJcmV0dXJuIGZpcnN0OwoJfSwKCgl1bmlxdWU6IGZ1bmN0aW9uKCBhcnJheSApIHsKCQl2YXIgcmV0ID0gW10sIGRvbmUgPSB7fTsKCgkJdHJ5IHsKCgkJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YXIgaWQgPSBqUXVlcnkuZGF0YSggYXJyYXlbIGkgXSApOwoKCQkJCWlmICggIWRvbmVbIGlkIF0gKSB7CgkJCQkJZG9uZVsgaWQgXSA9IHRydWU7CgkJCQkJcmV0LnB1c2goIGFycmF5WyBpIF0gKTsKCQkJCX0KCQkJfQoKCQl9IGNhdGNoKCBlICkgewoJCQlyZXQgPSBhcnJheTsKCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCWdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludiApIHsKCQl2YXIgcmV0ID0gW107CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKQoJCQlpZiAoICFpbnYgIT0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICkgKQoJCQkJcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKCgkJcmV0dXJuIHJldDsKCX0sCgoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrICkgewoJCXZhciByZXQgPSBbXTsKCgkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyCgkJLy8gbmV3IHZhbHVlIChvciB2YWx1ZXMpLgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCXZhciB2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgoJCQlpZiAoIHZhbHVlICE9IG51bGwgKQoJCQkJcmV0WyByZXQubGVuZ3RoIF0gPSB2YWx1ZTsKCQl9CgoJCXJldHVybiByZXQuY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7Cgl9Cn0pOwoKLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGRlcHJlY2F0ZWQuCi8vIEl0J3MgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBwbHVnaW5zLAovLyBhbHRob3VnaCB0aGV5IHNob3VsZCB3b3JrIHRvIG1pZ3JhdGUgYXdheS4KCnZhciB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CgovLyBGaWd1cmUgb3V0IHdoYXQgYnJvd3NlciBpcyBiZWluZyB1c2VkCmpRdWVyeS5icm93c2VyID0gewoJdmVyc2lvbjogKHVzZXJBZ2VudC5tYXRjaCggLy4rKD86cnZ8aXR8cmF8aWUpW1wvOiBdKFtcZC5dKykvICkgfHwgWzAsJzAnXSlbMV0sCglzYWZhcmk6IC93ZWJraXQvLnRlc3QoIHVzZXJBZ2VudCApLAoJb3BlcmE6IC9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCgltc2llOiAvbXNpZS8udGVzdCggdXNlckFnZW50ICkgJiYgIS9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCgltb3ppbGxhOiAvbW96aWxsYS8udGVzdCggdXNlckFnZW50ICkgJiYgIS8oY29tcGF0aWJsZXx3ZWJraXQpLy50ZXN0KCB1c2VyQWdlbnQgKQp9OwoKalF1ZXJ5LmVhY2goewoJcGFyZW50OiBmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5wYXJlbnROb2RlO30sCglwYXJlbnRzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwYXJlbnROb2RlIik7fSwKCW5leHQ6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwibmV4dFNpYmxpbmciKTt9LAoJcHJldjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJwcmV2aW91c1NpYmxpbmciKTt9LAoJbmV4dEFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwibmV4dFNpYmxpbmciKTt9LAoJcHJldkFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicHJldmlvdXNTaWJsaW5nIik7fSwKCXNpYmxpbmdzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsZWxlbSk7fSwKCWNoaWxkcmVuOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5maXJzdENoaWxkKTt9LAoJY29udGVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubm9kZU5hbWUoZWxlbSwiaWZyYW1lIik/ZWxlbS5jb250ZW50RG9jdW1lbnR8fGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudDpqUXVlcnkubWFrZUFycmF5KGVsZW0uY2hpbGROb2Rlcyk7fQp9LCBmdW5jdGlvbihuYW1lLCBmbil7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4gKTsKCgkJaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT0gInN0cmluZyIgKQoJCQlyZXQgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKCByZXQgKSwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKG5hbWUsIG9yaWdpbmFsKXsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBbXSwgaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApOwoKCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbnNlcnQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQl2YXIgZWxlbXMgPSAoaSA+IDAgPyB0aGlzLmNsb25lKHRydWUpIDogdGhpcykuZ2V0KCk7CgkJCWpRdWVyeS5mblsgb3JpZ2luYWwgXS5hcHBseSggalF1ZXJ5KGluc2VydFtpXSksIGVsZW1zICk7CgkJCXJldCA9IHJldC5jb25jYXQoIGVsZW1zICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2goewoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7CgkJalF1ZXJ5LmF0dHIoIHRoaXMsIG5hbWUsICIiICk7CgkJaWYgKHRoaXMubm9kZVR5cGUgPT0gMSkKCQkJdGhpcy5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCX0sCgoJYWRkQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzICkgewoJCWpRdWVyeS5jbGFzc05hbWUuYWRkKCB0aGlzLCBjbGFzc05hbWVzICk7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggY2xhc3NOYW1lcyApIHsKCQlqUXVlcnkuY2xhc3NOYW1lLnJlbW92ZSggdGhpcywgY2xhc3NOYW1lcyApOwoJfSwKCgl0b2dnbGVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMsIHN0YXRlICkgewoJCWlmKCB0eXBlb2Ygc3RhdGUgIT09ICJib29sZWFuIiApCgkJCXN0YXRlID0gIWpRdWVyeS5jbGFzc05hbWUuaGFzKCB0aGlzLCBjbGFzc05hbWVzICk7CgkJalF1ZXJ5LmNsYXNzTmFtZVsgc3RhdGUgPyAiYWRkIiA6ICJyZW1vdmUiIF0oIHRoaXMsIGNsYXNzTmFtZXMgKTsKCX0sCgoJcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJaWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIFsgdGhpcyBdICkubGVuZ3RoICkgewoJCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrcwoJCQlqUXVlcnkoICIqIiwgdGhpcyApLmFkZChbdGhpc10pLmVhY2goZnVuY3Rpb24oKXsKCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUodGhpcyk7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSh0aGlzKTsKCQkJfSk7CgkJCWlmICh0aGlzLnBhcmVudE5vZGUpCgkJCQl0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMgKTsKCQl9Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQlqUXVlcnkodGhpcykuY2hpbGRyZW4oKS5yZW1vdmUoKTsKCgkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXMKCQl3aGlsZSAoIHRoaXMuZmlyc3RDaGlsZCApCgkJCXRoaXMucmVtb3ZlQ2hpbGQoIHRoaXMuZmlyc3RDaGlsZCApOwoJfQp9LCBmdW5jdGlvbihuYW1lLCBmbil7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCl7CgkJcmV0dXJuIHRoaXMuZWFjaCggZm4sIGFyZ3VtZW50cyApOwoJfTsKfSk7CgovLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgZGltZW5zaW9ucyBhbmQgb2Zmc2V0IG1vZHVsZXMKZnVuY3Rpb24gbnVtKGVsZW0sIHByb3ApIHsKCXJldHVybiBlbGVtWzBdICYmIHBhcnNlSW50KCBqUXVlcnkuY3VyQ1NTKGVsZW1bMF0sIHByb3AsIHRydWUpLCAxMCApIHx8IDA7Cn0KdmFyIGV4cGFuZG8gPSAialF1ZXJ5IiArIG5vdygpLCB1dWlkID0gMCwgd2luZG93RGF0YSA9IHt9OwoKalF1ZXJ5LmV4dGVuZCh7CgljYWNoZToge30sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJZWxlbSA9IGVsZW0gPT0gd2luZG93ID8KCQkJd2luZG93RGF0YSA6CgkJCWVsZW07CgoJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsKCgkJLy8gQ29tcHV0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhlIGVsZW1lbnQKCQlpZiAoICFpZCApCgkJCWlkID0gZWxlbVsgZXhwYW5kbyBdID0gKyt1dWlkOwoKCQkvLyBPbmx5IGdlbmVyYXRlIHRoZSBkYXRhIGNhY2hlIGlmIHdlJ3JlCgkJLy8gdHJ5aW5nIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIGl0CgkJaWYgKCBuYW1lICYmICFqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQlqUXVlcnkuY2FjaGVbIGlkIF0gPSB7fTsKCgkJLy8gUHJldmVudCBvdmVycmlkaW5nIHRoZSBuYW1lZCBjYWNoZSB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMKCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApCgkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdID0gZGF0YTsKCgkJLy8gUmV0dXJuIHRoZSBuYW1lZCBjYWNoZSBkYXRhLCBvciB0aGUgSUQgZm9yIHRoZSBlbGVtZW50CgkJcmV0dXJuIG5hbWUgPwoJCQlqUXVlcnkuY2FjaGVbIGlkIF1bIG5hbWUgXSA6CgkJCWlkOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPwoJCQl3aW5kb3dEYXRhIDoKCQkJZWxlbTsKCgkJdmFyIGlkID0gZWxlbVsgZXhwYW5kbyBdOwoKCQkvLyBJZiB3ZSB3YW50IHRvIHJlbW92ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJaWYgKCBuYW1lICkgewoJCQlpZiAoIGpRdWVyeS5jYWNoZVsgaWQgXSApIHsKCQkJCS8vIFJlbW92ZSB0aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhCgkJCQlkZWxldGUgalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF07CgoJCQkJLy8gSWYgd2UndmUgcmVtb3ZlZCBhbGwgdGhlIGRhdGEsIHJlbW92ZSB0aGUgZWxlbWVudCdzIGNhY2hlCgkJCQluYW1lID0gIiI7CgoJCQkJZm9yICggbmFtZSBpbiBqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQkJCWJyZWFrOwoKCQkJCWlmICggIW5hbWUgKQoJCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtICk7CgkJCX0KCgkJLy8gT3RoZXJ3aXNlLCB3ZSB3YW50IHRvIHJlbW92ZSBhbGwgb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJfSBlbHNlIHsKCQkJLy8gQ2xlYW4gdXAgdGhlIGVsZW1lbnQgZXhwYW5kbwoJCQl0cnkgewoJCQkJZGVsZXRlIGVsZW1bIGV4cGFuZG8gXTsKCQkJfSBjYXRjaChlKXsKCQkJCS8vIElFIGhhcyB0cm91YmxlIGRpcmVjdGx5IHJlbW92aW5nIHRoZSBleHBhbmRvCgkJCQkvLyBidXQgaXQncyBvayB3aXRoIHVzaW5nIHJlbW92ZUF0dHJpYnV0ZQoJCQkJaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApCgkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGV4cGFuZG8gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGVseSByZW1vdmUgdGhlIGRhdGEgY2FjaGUKCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsgaWQgXTsKCQl9Cgl9LAoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCWlmICggZWxlbSApewoJCgkJCXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJxdWV1ZSI7CgkKCQkJdmFyIHEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSApOwoJCgkJCWlmICggIXEgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgKQoJCQkJcSA9IGpRdWVyeS5kYXRhKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7CgkJCWVsc2UgaWYoIGRhdGEgKQoJCQkJcS5wdXNoKCBkYXRhICk7CgkKCQl9CgkJcmV0dXJuIHE7Cgl9LAoKCWRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICl7CgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkKCQlpZiggIXR5cGUgfHwgdHlwZSA9PT0gImZ4IiApCgkJCWZuID0gcXVldWVbMF07CgkJCQoJCWlmKCBmbiAhPT0gdW5kZWZpbmVkICkKCQkJZm4uY2FsbChlbGVtKTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICl7CgkJdmFyIHBhcnRzID0ga2V5LnNwbGl0KCIuIik7CgkJcGFydHNbMV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7CgoJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJdmFyIGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoICkKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoJCX0gZWxzZQoJCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF0sIHZhbHVlXSkuZWFjaChmdW5jdGlvbigpewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSk7Cgl9LAoKCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTsKCQl9KTsKCX0sCglxdWV1ZTogZnVuY3Rpb24odHlwZSwgZGF0YSl7CgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCWRhdGEgPSB0eXBlOwoJCQl0eXBlID0gImZ4IjsKCQl9CgoJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOwoJCQkKCQkJIGlmKCB0eXBlID09ICJmeCIgJiYgcXVldWUubGVuZ3RoID09IDEgKQoJCQkJcXVldWVbMF0uY2FsbCh0aGlzKTsKCQl9KTsKCX0sCglkZXF1ZXVlOiBmdW5jdGlvbih0eXBlKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSk7Cgl9Cn0pOy8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSAtIHYwLjkuMwogKiAgQ29weXJpZ2h0IDIwMDksIFRoZSBEb2pvIEZvdW5kYXRpb24KICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9zaXp6bGVqcy5jb20vCiAqLwooZnVuY3Rpb24oKXsKCnZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15bXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPy9nLAoJZG9uZSA9IDAsCgl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7Cgp2YXIgU2l6emxlID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQpIHsKCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOwoJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKQoJCXJldHVybiBbXTsKCQoJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4gcmVzdWx0czsKCX0KCgl2YXIgcGFydHMgPSBbXSwgbSwgc2V0LCBjaGVja1NldCwgY2hlY2ssIG1vZGUsIGV4dHJhLCBwcnVuZSA9IHRydWU7CgkKCS8vIFJlc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2h1bmtlciByZWdleHAgKHN0YXJ0IGZyb20gaGVhZCkKCWNodW5rZXIubGFzdEluZGV4ID0gMDsKCQoJd2hpbGUgKCAobSA9IGNodW5rZXIuZXhlYyhzZWxlY3RvcikpICE9PSBudWxsICkgewoJCXBhcnRzLnB1c2goIG1bMV0gKTsKCQkKCQlpZiAoIG1bMl0gKSB7CgkJCWV4dHJhID0gUmVnRXhwLnJpZ2h0Q29udGV4dDsKCQkJYnJlYWs7CgkJfQoJfQoKCWlmICggcGFydHMubGVuZ3RoID4gMSAmJiBvcmlnUE9TLmV4ZWMoIHNlbGVjdG9yICkgKSB7CgkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsKCQkJc2V0ID0gcG9zUHJvY2VzcyggcGFydHNbMF0gKyBwYXJ0c1sxXSwgY29udGV4dCApOwoJCX0gZWxzZSB7CgkJCXNldCA9IEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gPwoJCQkJWyBjb250ZXh0IF0gOgoJCQkJU2l6emxlKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0ICk7CgoJCQl3aGlsZSAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCXNlbGVjdG9yID0gcGFydHMuc2hpZnQoKTsKCgkJCQlpZiAoIEV4cHIucmVsYXRpdmVbIHNlbGVjdG9yIF0gKQoJCQkJCXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CgoJCQkJc2V0ID0gcG9zUHJvY2Vzcyggc2VsZWN0b3IsIHNldCApOwoJCQl9CgkJfQoJfSBlbHNlIHsKCQl2YXIgcmV0ID0gc2VlZCA/CgkJCXsgZXhwcjogcGFydHMucG9wKCksIHNldDogbWFrZUFycmF5KHNlZWQpIH0gOgoJCQlTaXp6bGUuZmluZCggcGFydHMucG9wKCksIHBhcnRzLmxlbmd0aCA9PT0gMSAmJiBjb250ZXh0LnBhcmVudE5vZGUgPyBjb250ZXh0LnBhcmVudE5vZGUgOiBjb250ZXh0LCBpc1hNTChjb250ZXh0KSApOwoJCXNldCA9IFNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0ICk7CgoJCWlmICggcGFydHMubGVuZ3RoID4gMCApIHsKCQkJY2hlY2tTZXQgPSBtYWtlQXJyYXkoc2V0KTsKCQl9IGVsc2UgewoJCQlwcnVuZSA9IGZhbHNlOwoJCX0KCgkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCXZhciBjdXIgPSBwYXJ0cy5wb3AoKSwgcG9wID0gY3VyOwoKCQkJaWYgKCAhRXhwci5yZWxhdGl2ZVsgY3VyIF0gKSB7CgkJCQljdXIgPSAiIjsKCQkJfSBlbHNlIHsKCQkJCXBvcCA9IHBhcnRzLnBvcCgpOwoJCQl9CgoJCQlpZiAoIHBvcCA9PSBudWxsICkgewoJCQkJcG9wID0gY29udGV4dDsKCQkJfQoKCQkJRXhwci5yZWxhdGl2ZVsgY3VyIF0oIGNoZWNrU2V0LCBwb3AsIGlzWE1MKGNvbnRleHQpICk7CgkJfQoJfQoKCWlmICggIWNoZWNrU2V0ICkgewoJCWNoZWNrU2V0ID0gc2V0OwoJfQoKCWlmICggIWNoZWNrU2V0ICkgewoJCXRocm93ICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgKGN1ciB8fCBzZWxlY3Rvcik7Cgl9CgoJaWYgKCB0b1N0cmluZy5jYWxsKGNoZWNrU2V0KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKCQlpZiAoICFwcnVuZSApIHsKCQkJcmVzdWx0cy5wdXNoLmFwcGx5KCByZXN1bHRzLCBjaGVja1NldCApOwoJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZVR5cGUgPT09IDEgKSB7CgkJCWZvciAoIHZhciBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgY29udGFpbnMoY29udGV4dCwgY2hlY2tTZXRbaV0pKSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CgkJCQl9CgkJCX0KCQl9Cgl9IGVsc2UgewoJCW1ha2VBcnJheSggY2hlY2tTZXQsIHJlc3VsdHMgKTsKCX0KCglpZiAoIGV4dHJhICkgewoJCVNpenpsZSggZXh0cmEsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKCgkJaWYgKCBzb3J0T3JkZXIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IGZhbHNlOwoJCQlyZXN1bHRzLnNvcnQoc29ydE9yZGVyKTsKCgkJCWlmICggaGFzRHVwbGljYXRlICkgewoJCQkJZm9yICggdmFyIGkgPSAxOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKyApIHsKCQkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbaS0xXSApIHsKCQkJCQkJcmVzdWx0cy5zcGxpY2UoaS0tLCAxKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgpTaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKGV4cHIsIHNldCl7CglyZXR1cm4gU2l6emxlKGV4cHIsIG51bGwsIG51bGwsIHNldCk7Cn07CgpTaXp6bGUuZmluZCA9IGZ1bmN0aW9uKGV4cHIsIGNvbnRleHQsIGlzWE1MKXsKCXZhciBzZXQsIG1hdGNoOwoKCWlmICggIWV4cHIgKSB7CgkJcmV0dXJuIFtdOwoJfQoKCWZvciAoIHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciB0eXBlID0gRXhwci5vcmRlcltpXSwgbWF0Y2g7CgkJCgkJaWYgKCAobWF0Y2ggPSBFeHByLm1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSApIHsKCQkJdmFyIGxlZnQgPSBSZWdFeHAubGVmdENvbnRleHQ7CgoJCQlpZiAoIGxlZnQuc3Vic3RyKCBsZWZ0Lmxlbmd0aCAtIDEgKSAhPT0gIlxcIiApIHsKCQkJCW1hdGNoWzFdID0gKG1hdGNoWzFdIHx8ICIiKS5yZXBsYWNlKC9cXC9nLCAiIik7CgkJCQlzZXQgPSBFeHByLmZpbmRbIHR5cGUgXSggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICk7CgkJCQlpZiAoIHNldCAhPSBudWxsICkgewoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAoICFzZXQgKSB7CgkJc2V0ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOwoJfQoKCXJldHVybiB7c2V0OiBzZXQsIGV4cHI6IGV4cHJ9Owp9OwoKU2l6emxlLmZpbHRlciA9IGZ1bmN0aW9uKGV4cHIsIHNldCwgaW5wbGFjZSwgbm90KXsKCXZhciBvbGQgPSBleHByLCByZXN1bHQgPSBbXSwgY3VyTG9vcCA9IHNldCwgbWF0Y2gsIGFueUZvdW5kLAoJCWlzWE1MRmlsdGVyID0gc2V0ICYmIHNldFswXSAmJiBpc1hNTChzZXRbMF0pOwoKCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgewoJCWZvciAoIHZhciB0eXBlIGluIEV4cHIuZmlsdGVyICkgewoJCQlpZiAoIChtYXRjaCA9IEV4cHIubWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICE9IG51bGwgKSB7CgkJCQl2YXIgZmlsdGVyID0gRXhwci5maWx0ZXJbIHR5cGUgXSwgZm91bmQsIGl0ZW07CgkJCQlhbnlGb3VuZCA9IGZhbHNlOwoKCQkJCWlmICggY3VyTG9vcCA9PSByZXN1bHQgKSB7CgkJCQkJcmVzdWx0ID0gW107CgkJCQl9CgoJCQkJaWYgKCBFeHByLnByZUZpbHRlclsgdHlwZSBdICkgewoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOwoKCQkJCQlpZiAoICFtYXRjaCApIHsKCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CgkJCQkJfSBlbHNlIGlmICggbWF0Y2ggPT09IHRydWUgKSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoIG1hdGNoICkgewoJCQkJCWZvciAoIHZhciBpID0gMDsgKGl0ZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCQkJCWlmICggaXRlbSApIHsKCQkJCQkJCWZvdW5kID0gZmlsdGVyKCBpdGVtLCBtYXRjaCwgaSwgY3VyTG9vcCApOwoJCQkJCQkJdmFyIHBhc3MgPSBub3QgXiAhIWZvdW5kOwoKCQkJCQkJCWlmICggaW5wbGFjZSAmJiBmb3VuZCAhPSBudWxsICkgewoJCQkJCQkJCWlmICggcGFzcyApIHsKCQkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgewoJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CgkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZm91bmQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQljdXJMb29wID0gcmVzdWx0OwoJCQkJCX0KCgkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOwoKCQkJCQlpZiAoICFhbnlGb3VuZCApIHsKCQkJCQkJcmV0dXJuIFtdOwoJCQkJCX0KCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KCQlpZiAoIGV4cHIgPT0gb2xkICkgewoJCQlpZiAoIGFueUZvdW5kID09IG51bGwgKSB7CgkJCQl0aHJvdyAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIGV4cHI7CgkJCX0gZWxzZSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJb2xkID0gZXhwcjsKCX0KCglyZXR1cm4gY3VyTG9vcDsKfTsKCnZhciBFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCW9yZGVyOiBbICJJRCIsICJOQU1FIiwgIlRBRyIgXSwKCW1hdGNoOiB7CgkJSUQ6IC8jKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLywKCQlDTEFTUzogL1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLywKCQlOQU1FOiAvXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspWyciXSpcXS8sCgkJQVRUUjogL1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKFsnIl0qKSguKj8pXDN8KVxzKlxdLywKCQlUQUc6IC9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKl8tXXxcXC4pKykvLAoJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoKGV2ZW58b2RkfFtcZG4rLV0qKVwpKT8vLAoJCVBPUzogLzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXi1dfCQpLywKCQlQU0VVRE86IC86KCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspKD86XCgoWyciXSopKCg/OlwoW15cKV0rXCl8W15cMlwoXCldKikrKVwyXCkpPy8KCX0sCglhdHRyTWFwOiB7CgkJImNsYXNzIjogImNsYXNzTmFtZSIsCgkJImZvciI6ICJodG1sRm9yIgoJfSwKCWF0dHJIYW5kbGU6IHsKCQlocmVmOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIik7CgkJfQoJfSwKCXJlbGF0aXZlOiB7CgkJIisiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciLAoJCQkJaXNUYWcgPSBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSwKCQkJCWlzUGFydFN0ck5vdFRhZyA9IGlzUGFydFN0ciAmJiAhaXNUYWc7CgoJCQlpZiAoIGlzVGFnICYmICFpc1hNTCApIHsKCQkJCXBhcnQgPSBwYXJ0LnRvVXBwZXJDYXNlKCk7CgkJCX0KCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aCwgZWxlbTsgaSA8IGw7IGkrKyApIHsKCQkJCWlmICggKGVsZW0gPSBjaGVja1NldFtpXSkgKSB7CgkJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW0ucHJldmlvdXNTaWJsaW5nKSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICkge30KCgkJCQkJY2hlY2tTZXRbaV0gPSBpc1BhcnRTdHJOb3RUYWcgfHwgZWxlbSAmJiBlbGVtLm5vZGVOYW1lID09PSBwYXJ0ID8KCQkJCQkJZWxlbSB8fCBmYWxzZSA6CgkJCQkJCWVsZW0gPT09IHBhcnQ7CgkJCQl9CgkJCX0KCgkJCWlmICggaXNQYXJ0U3RyTm90VGFnICkgewoJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKCQkJfQoJCX0sCgkJIj4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciOwoKCQkJaWYgKCBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSApIHsKCQkJCXBhcnQgPSBpc1hNTCA/IHBhcnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CgkJCQkJaWYgKCBlbGVtICkgewoJCQkJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOwoJCQkJCQljaGVja1NldFtpXSA9IHBhcmVudC5ub2RlTmFtZSA9PT0gcGFydCA/IHBhcmVudCA6IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJY2hlY2tTZXRbaV0gPSBpc1BhcnRTdHIgPwoJCQkJCQkJZWxlbS5wYXJlbnROb2RlIDoKCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA9PT0gcGFydDsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBpc1BhcnRTdHIgKSB7CgkJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKCQkJCX0KCQkJfQoJCX0sCgkJIiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CgkJCXZhciBkb25lTmFtZSA9IGRvbmUrKywgY2hlY2tGbiA9IGRpckNoZWNrOwoKCQkJaWYgKCAhcGFydC5tYXRjaCgvXFcvKSApIHsKCQkJCXZhciBub2RlQ2hlY2sgPSBwYXJ0ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOwoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKCQkJfQoKCQkJY2hlY2tGbigicGFyZW50Tm9kZSIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCk7CgkJfSwKCQkifiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CgkJCXZhciBkb25lTmFtZSA9IGRvbmUrKywgY2hlY2tGbiA9IGRpckNoZWNrOwoKCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIXBhcnQubWF0Y2goL1xXLykgKSB7CgkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBlckNhc2UoKTsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oInByZXZpb3VzU2libGluZyIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCk7CgkJfQoJfSwKCWZpbmQ6IHsKCQlJRDogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgewoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKCQkJCXJldHVybiBtID8gW21dIDogW107CgkJCX0KCQl9LAoJCU5BTUU6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJdmFyIHJldCA9IFtdLCByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZShtYXRjaFsxXSk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBtYXRjaFsxXSApIHsKCQkJCQkJcmV0LnB1c2goIHJlc3VsdHNbaV0gKTsKCQkJCQl9CgkJCQl9CgoJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OwoJCQl9CgkJfSwKCQlUQUc6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0KXsKCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOwoJCX0KCX0sCglwcmVGaWx0ZXI6IHsKCQlDTEFTUzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCl7CgkJCW1hdGNoID0gIiAiICsgbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpICsgIiAiOwoKCQkJaWYgKCBpc1hNTCApIHsKCQkJCXJldHVybiBtYXRjaDsKCQkJfQoKCQkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGN1ckxvb3BbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJCWlmICggZWxlbSApIHsKCQkJCQlpZiAoIG5vdCBeIChlbGVtLmNsYXNzTmFtZSAmJiAoIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIpLmluZGV4T2YobWF0Y2gpID49IDApICkgewoJCQkJCQlpZiAoICFpbnBsYWNlICkKCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CgkJCQkJfSBlbHNlIGlmICggaW5wbGFjZSApIHsKCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0sCgkJSUQ6IGZ1bmN0aW9uKG1hdGNoKXsKCQkJcmV0dXJuIG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKTsKCQl9LAoJCVRBRzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3ApewoJCQlmb3IgKCB2YXIgaSA9IDA7IGN1ckxvb3BbaV0gPT09IGZhbHNlOyBpKysgKXt9CgkJCXJldHVybiBjdXJMb29wW2ldICYmIGlzWE1MKGN1ckxvb3BbaV0pID8gbWF0Y2hbMV0gOiBtYXRjaFsxXS50b1VwcGVyQ2FzZSgpOwoJCX0sCgkJQ0hJTEQ6IGZ1bmN0aW9uKG1hdGNoKXsKCQkJaWYgKCBtYXRjaFsxXSA9PSAibnRoIiApIHsKCQkJCS8vIHBhcnNlIGVxdWF0aW9ucyBsaWtlICdldmVuJywgJ29kZCcsICc1JywgJzJuJywgJzNuKzInLCAnNG4tMScsICctbis2JwoJCQkJdmFyIHRlc3QgPSAvKC0/KShcZCopbigoPzpcK3wtKT9cZCopLy5leGVjKAoJCQkJCW1hdGNoWzJdID09ICJldmVuIiAmJiAiMm4iIHx8IG1hdGNoWzJdID09ICJvZGQiICYmICIybisxIiB8fAoJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CgoJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOwoJCQkJbWF0Y2hbM10gPSB0ZXN0WzNdIC0gMDsKCQkJfQoKCQkJLy8gVE9ETzogTW92ZSB0byBub3JtYWwgY2FjaGluZyBzeXN0ZW0KCQkJbWF0Y2hbMF0gPSBkb25lKys7CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCQlBVFRSOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7CgkJCQoJCQlpZiAoICFpc1hNTCAmJiBFeHByLmF0dHJNYXBbbmFtZV0gKSB7CgkJCQltYXRjaFsxXSA9IEV4cHIuYXR0ck1hcFtuYW1lXTsKCQkJfQoKCQkJaWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKCQkJCW1hdGNoWzRdID0gIiAiICsgbWF0Y2hbNF0gKyAiICI7CgkJCX0KCgkJCXJldHVybiBtYXRjaDsKCQl9LAoJCVBTRVVETzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90KXsKCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CgkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQoJCQkJaWYgKCBtYXRjaFszXS5tYXRjaChjaHVua2VyKS5sZW5ndGggPiAxIHx8IC9eXHcvLnRlc3QobWF0Y2hbM10pICkgewoJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKCQkJCX0gZWxzZSB7CgkJCQkJdmFyIHJldCA9IFNpenpsZS5maWx0ZXIobWF0Y2hbM10sIGN1ckxvb3AsIGlucGxhY2UsIHRydWUgXiBub3QpOwoJCQkJCWlmICggIWlucGxhY2UgKSB7CgkJCQkJCXJlc3VsdC5wdXNoLmFwcGx5KCByZXN1bHQsIHJldCApOwoJCQkJCX0KCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0gZWxzZSBpZiAoIEV4cHIubWF0Y2guUE9TLnRlc3QoIG1hdGNoWzBdICkgfHwgRXhwci5tYXRjaC5DSElMRC50ZXN0KCBtYXRjaFswXSApICkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJCgkJCXJldHVybiBtYXRjaDsKCQl9LAoJCVBPUzogZnVuY3Rpb24obWF0Y2gpewoJCQltYXRjaC51bnNoaWZ0KCB0cnVlICk7CgkJCXJldHVybiBtYXRjaDsKCQl9Cgl9LAoJZmlsdGVyczogewoJCWVuYWJsZWQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgJiYgZWxlbS50eXBlICE9PSAiaGlkZGVuIjsKCQl9LAoJCWRpc2FibGVkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CgkJfSwKCQljaGVja2VkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uY2hlY2tlZCA9PT0gdHJ1ZTsKCQl9LAoJCXNlbGVjdGVkOiBmdW5jdGlvbihlbGVtKXsKCQkJLy8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdAoJCQkvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5CgkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKCQl9LAoJCXBhcmVudDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAhIWVsZW0uZmlyc3RDaGlsZDsKCQl9LAoJCWVtcHR5OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCQloYXM6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuICEhU2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKCQl9LAoJCWhlYWRlcjogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAvaFxkL2kudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgkJdGV4dDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAidGV4dCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCXJhZGlvOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJyYWRpbyIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWNoZWNrYm94OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJjaGVja2JveCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWZpbGU6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gImZpbGUiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlwYXNzd29yZDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAicGFzc3dvcmQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlzdWJtaXQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gInN1Ym1pdCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWltYWdlOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJpbWFnZSIgPT09IGVsZW0udHlwZTsKCQl9LAoJCXJlc2V0OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJyZXNldCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWJ1dHRvbjogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAiYnV0dG9uIiA9PT0gZWxlbS50eXBlIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gIkJVVFRPTiI7CgkJfSwKCQlpbnB1dDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoZWxlbS5ub2RlTmFtZSk7CgkJfQoJfSwKCXNldEZpbHRlcnM6IHsKCQlmaXJzdDogZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBpID09PSAwOwoJCX0sCgkJbGFzdDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gsIGFycmF5KXsKCQkJcmV0dXJuIGkgPT09IGFycmF5Lmxlbmd0aCAtIDE7CgkJfSwKCQlldmVuOiBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGkgJSAyID09PSAwOwoJCX0sCgkJb2RkOiBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGkgJSAyID09PSAxOwoJCX0sCgkJbHQ6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIGkgPCBtYXRjaFszXSAtIDA7CgkJfSwKCQlndDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpewoJCQlyZXR1cm4gaSA+IG1hdGNoWzNdIC0gMDsKCQl9LAoJCW50aDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpewoJCQlyZXR1cm4gbWF0Y2hbM10gLSAwID09IGk7CgkJfSwKCQllcTogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpewoJCQlyZXR1cm4gbWF0Y2hbM10gLSAwID09IGk7CgkJfQoJfSwKCWZpbHRlcjogewoJCVBTRVVETzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwgZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAiY29udGFpbnMiICkgewoJCQkJcmV0dXJuIChlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8ICIiKS5pbmRleE9mKG1hdGNoWzNdKSA+PSAwOwoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsKCQkJCXZhciBub3QgPSBtYXRjaFszXTsKCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBub3QubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggbm90W2ldID09PSBlbGVtICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfSwKCQlDSElMRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQl2YXIgdHlwZSA9IG1hdGNoWzFdLCBub2RlID0gZWxlbTsKCQkJc3dpdGNoICh0eXBlKSB7CgkJCQljYXNlICdvbmx5JzoKCQkJCWNhc2UgJ2ZpcnN0JzoKCQkJCQl3aGlsZSAobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSAgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSByZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCWlmICggdHlwZSA9PSAnZmlyc3QnKSByZXR1cm4gdHJ1ZTsKCQkJCQlub2RlID0gZWxlbTsKCQkJCWNhc2UgJ2xhc3QnOgoJCQkJCXdoaWxlIChub2RlID0gbm9kZS5uZXh0U2libGluZykgIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCWNhc2UgJ250aCc6CgkJCQkJdmFyIGZpcnN0ID0gbWF0Y2hbMl0sIGxhc3QgPSBtYXRjaFszXTsKCgkJCQkJaWYgKCBmaXJzdCA9PSAxICYmIGxhc3QgPT0gMCApIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJCQoJCQkJCXZhciBkb25lTmFtZSA9IG1hdGNoWzBdLAoJCQkJCQlwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkKCQkJCQlpZiAoIHBhcmVudCAmJiAocGFyZW50LnNpemNhY2hlICE9PSBkb25lTmFtZSB8fCAhZWxlbS5ub2RlSW5kZXgpICkgewoJCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgewoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKCQkJCQkJCX0KCQkJCQkJfSAKCQkJCQkJcGFyZW50LnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJfQoJCQkJCQoJCQkJCXZhciBkaWZmID0gZWxlbS5ub2RlSW5kZXggLSBsYXN0OwoJCQkJCWlmICggZmlyc3QgPT0gMCApIHsKCQkJCQkJcmV0dXJuIGRpZmYgPT0gMDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gKCBkaWZmICUgZmlyc3QgPT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJfQoJCX0sCgkJSUQ6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IG1hdGNoOwoJCX0sCgkJVEFHOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXJldHVybiAobWF0Y2ggPT09ICIqIiAmJiBlbGVtLm5vZGVUeXBlID09PSAxKSB8fCBlbGVtLm5vZGVOYW1lID09PSBtYXRjaDsKCQl9LAoJCUNMQVNTOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXJldHVybiAoIiAiICsgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSArICIgIikKCQkJCS5pbmRleE9mKCBtYXRjaCApID4gLTE7CgkJfSwKCQlBVFRSOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXZhciBuYW1lID0gbWF0Y2hbMV0sCgkJCQlyZXN1bHQgPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSA/CgkJCQkJRXhwci5hdHRySGFuZGxlWyBuYW1lIF0oIGVsZW0gKSA6CgkJCQkJZWxlbVsgbmFtZSBdICE9IG51bGwgPwoJCQkJCQllbGVtWyBuYW1lIF0gOgoJCQkJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLAoJCQkJdmFsdWUgPSByZXN1bHQgKyAiIiwKCQkJCXR5cGUgPSBtYXRjaFsyXSwKCQkJCWNoZWNrID0gbWF0Y2hbNF07CgoJCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPwoJCQkJdHlwZSA9PT0gIiE9IiA6CgkJCQl0eXBlID09PSAiPSIgPwoJCQkJdmFsdWUgPT09IGNoZWNrIDoKCQkJCXR5cGUgPT09ICIqPSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPj0gMCA6CgkJCQl0eXBlID09PSAifj0iID8KCQkJCSgiICIgKyB2YWx1ZSArICIgIikuaW5kZXhPZihjaGVjaykgPj0gMCA6CgkJCQkhY2hlY2sgPwoJCQkJdmFsdWUgJiYgcmVzdWx0ICE9PSBmYWxzZSA6CgkJCQl0eXBlID09PSAiIT0iID8KCQkJCXZhbHVlICE9IGNoZWNrIDoKCQkJCXR5cGUgPT09ICJePSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPT09IDAgOgoJCQkJdHlwZSA9PT0gIiQ9IiA/CgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gInw9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CgkJCQlmYWxzZTsKCQl9LAoJCVBPUzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsyXSwgZmlsdGVyID0gRXhwci5zZXRGaWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoJCQl9CgkJfQoJfQp9OwoKdmFyIG9yaWdQT1MgPSBFeHByLm1hdGNoLlBPUzsKCmZvciAoIHZhciB0eXBlIGluIEV4cHIubWF0Y2ggKSB7CglFeHByLm1hdGNoWyB0eXBlIF0gPSBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UgKTsKfQoKdmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHRzKSB7CglhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOwoKCWlmICggcmVzdWx0cyApIHsKCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7CgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgkKCXJldHVybiBhcnJheTsKfTsKCi8vIFBlcmZvcm0gYSBzaW1wbGUgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93c2VyIGlzIGNhcGFibGUgb2YKLy8gY29udmVydGluZyBhIE5vZGVMaXN0IHRvIGFuIGFycmF5IHVzaW5nIGJ1aWx0aW4gbWV0aG9kcy4KdHJ5IHsKCUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcyApOwoKLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCn0gY2F0Y2goZSl7CgltYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIHRvU3RyaW5nLmNhbGwoYXJyYXkpID09PSAiW29iamVjdCBBcnJheV0iICkgewoJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggcmV0LCBhcnJheSApOwoJCX0gZWxzZSB7CgkJCWlmICggdHlwZW9mIGFycmF5Lmxlbmd0aCA9PT0gIm51bWJlciIgKSB7CgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgaSA9IDA7IGFycmF5W2ldOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9Owp9Cgp2YXIgc29ydE9yZGVyOwoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgcmV0ID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IGEgPT09IGIgPyAwIDogMTsKCQlpZiAoIHJldCA9PT0gMCApIHsKCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gZWxzZSBpZiAoICJzb3VyY2VJbmRleCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJdmFyIHJldCA9IGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4OwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfSBlbHNlIGlmICggZG9jdW1lbnQuY3JlYXRlUmFuZ2UgKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgYVJhbmdlID0gYS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9IGIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoJCWFSYW5nZS5zZWxlY3ROb2RlKGEpOwoJCWFSYW5nZS5jb2xsYXBzZSh0cnVlKTsKCQliUmFuZ2Uuc2VsZWN0Tm9kZShiKTsKCQliUmFuZ2UuY29sbGFwc2UodHJ1ZSk7CgkJdmFyIHJldCA9IGFSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBiUmFuZ2UpOwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfQoKLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZSB3aGVuCi8vIHF1ZXJ5aW5nIGJ5IGdldEVsZW1lbnRCeUlkIChhbmQgcHJvdmlkZSBhIHdvcmthcm91bmQpCihmdW5jdGlvbigpewoJLy8gV2UncmUgZ29pbmcgdG8gaW5qZWN0IGEgZmFrZSBpbnB1dCBlbGVtZW50IHdpdGggYSBzcGVjaWZpZWQgbmFtZQoJdmFyIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIiksCgkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOwoJZm9ybS5pbm5lckhUTUwgPSAiPGlucHV0IG5hbWU9JyIgKyBpZCArICInLz4iOwoKCS8vIEluamVjdCBpdCBpbnRvIHRoZSByb290IGVsZW1lbnQsIGNoZWNrIGl0cyBzdGF0dXMsIGFuZCByZW1vdmUgaXQgcXVpY2tseQoJdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Cglyb290Lmluc2VydEJlZm9yZSggZm9ybSwgcm9vdC5maXJzdENoaWxkICk7CgoJLy8gVGhlIHdvcmthcm91bmQgaGFzIHRvIGRvIGFkZGl0aW9uYWwgY2hlY2tzIGFmdGVyIGEgZ2V0RWxlbWVudEJ5SWQKCS8vIFdoaWNoIHNsb3dzIHRoaW5ncyBkb3duIGZvciBvdGhlciBicm93c2VycyAoaGVuY2UgdGhlIGJyYW5jaGluZykKCWlmICggISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKCQlFeHByLmZpbmQuSUQgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOwoJCQkJcmV0dXJuIG0gPyBtLmlkID09PSBtYXRjaFsxXSB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlID09PSBtYXRjaFsxXSA/IFttXSA6IHVuZGVmaW5lZCA6IFtdOwoJCQl9CgkJfTsKCgkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlICYmIG5vZGUubm9kZVZhbHVlID09PSBtYXRjaDsKCQl9OwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKfSkoKTsKCihmdW5jdGlvbigpewoJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgb25seSBlbGVtZW50cwoJLy8gd2hlbiBkb2luZyBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpCgoJLy8gQ3JlYXRlIGEgZmFrZSBlbGVtZW50Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CglkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpICk7CgoJLy8gTWFrZSBzdXJlIG5vIGNvbW1lbnRzIGFyZSBmb3VuZAoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGggPiAwICkgewoJCUV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7CgkJCXZhciByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShtYXRjaFsxXSk7CgoJCQkvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCgkJCWlmICggbWF0Y2hbMV0gPT09ICIqIiApIHsKCQkJCXZhciB0bXAgPSBbXTsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IHJlc3VsdHNbaV07IGkrKyApIHsKCQkJCQlpZiAoIHJlc3VsdHNbaV0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCXRtcC5wdXNoKCByZXN1bHRzW2ldICk7CgkJCQkJfQoJCQkJfQoKCQkJCXJlc3VsdHMgPSB0bXA7CgkJCX0KCgkJCXJldHVybiByZXN1bHRzOwoJCX07Cgl9CgoJLy8gQ2hlY2sgdG8gc2VlIGlmIGFuIGF0dHJpYnV0ZSByZXR1cm5zIG5vcm1hbGl6ZWQgaHJlZiBhdHRyaWJ1dGVzCglkaXYuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJaWYgKCBkaXYuZmlyc3RDaGlsZCAmJiB0eXBlb2YgZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlICE9PSAidW5kZWZpbmVkIiAmJgoJCQlkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSAhPT0gIiMiICkgewoJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIsIDIpOwoJCX07Cgl9Cn0pKCk7CgppZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSAoZnVuY3Rpb24oKXsKCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CgoJLy8gU2FmYXJpIGNhbid0IGhhbmRsZSB1cHBlcmNhc2Ugb3IgdW5pY29kZSBjaGFyYWN0ZXJzIHdoZW4KCS8vIGluIHF1aXJrcyBtb2RlLgoJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CgkJcmV0dXJuOwoJfQoJCglTaXp6bGUgPSBmdW5jdGlvbihxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpewoJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCQkvLyBPbmx5IHVzZSBxdWVyeVNlbGVjdG9yQWxsIG9uIG5vbi1YTUwgZG9jdW1lbnRzCgkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKCQlpZiAoICFzZWVkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWlzWE1MKGNvbnRleHQpICkgewoJCQl0cnkgewoJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsKCQkJfSBjYXRjaChlKXt9CgkJfQoJCQoJCXJldHVybiBvbGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKTsKCX07CgoJU2l6emxlLmZpbmQgPSBvbGRTaXp6bGUuZmluZDsKCVNpenpsZS5maWx0ZXIgPSBvbGRTaXp6bGUuZmlsdGVyOwoJU2l6emxlLnNlbGVjdG9ycyA9IG9sZFNpenpsZS5zZWxlY3RvcnM7CglTaXp6bGUubWF0Y2hlcyA9IG9sZFNpenpsZS5tYXRjaGVzOwp9KSgpOwoKaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkgKGZ1bmN0aW9uKCl7Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CglkaXYuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjsKCgkvLyBPcGVyYSBjYW4ndCBmaW5kIGEgc2Vjb25kIGNsYXNzbmFtZSAoaW4gOS42KQoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApCgkJcmV0dXJuOwoKCS8vIFNhZmFyaSBjYWNoZXMgY2xhc3MgYXR0cmlidXRlcywgZG9lc24ndCBjYXRjaCBjaGFuZ2VzIChpbiAzLjIpCglkaXYubGFzdENoaWxkLmNsYXNzTmFtZSA9ICJlIjsKCglpZiAoIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAxICkKCQlyZXR1cm47CgoJRXhwci5vcmRlci5zcGxpY2UoMSwgMCwgIkNMQVNTIik7CglFeHByLmZpbmQuQ0xBU1MgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpIHsKCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShtYXRjaFsxXSk7CgkJfQoJfTsKfSkoKTsKCmZ1bmN0aW9uIGRpck5vZGVDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZpb3VzU2libGluZyIgJiYgIWlzWE1MOwoJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CgkJaWYgKCBlbGVtICkgewoJCQlpZiAoIHNpYkRpciAmJiBlbGVtLm5vZGVUeXBlID09PSAxICl7CgkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQllbGVtLnNpenNldCA9IGk7CgkJCX0KCQkJZWxlbSA9IGVsZW1bZGlyXTsKCQkJdmFyIG1hdGNoID0gZmFsc2U7CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZSA9PT0gY3VyICkgewoJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKZnVuY3Rpb24gZGlyQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7Cgl2YXIgc2liRGlyID0gZGlyID09ICJwcmV2aW91c1NpYmxpbmciICYmICFpc1hNTDsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCWlmICggZWxlbSApIHsKCQkJaWYgKCBzaWJEaXIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsKCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJfQoJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKCgkJCXdoaWxlICggZWxlbSApIHsKCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWlzWE1MICkgewoJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJCQl9CgkJCQkJaWYgKCB0eXBlb2YgY3VyICE9PSAic3RyaW5nIiApIHsKCQkJCQkJaWYgKCBlbGVtID09PSBjdXIgKSB7CgkJCQkJCQltYXRjaCA9IHRydWU7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoKCQkJCQl9IGVsc2UgaWYgKCBTaXp6bGUuZmlsdGVyKCBjdXIsIFtlbGVtXSApLmxlbmd0aCA+IDAgKSB7CgkJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9Cgp2YXIgY29udGFpbnMgPSBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/ICBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTY7Cn0gOiBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5jb250YWlucyhiKSA6IHRydWUpOwp9OwoKdmFyIGlzWE1MID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJISFlbGVtLm93bmVyRG9jdW1lbnQgJiYgaXNYTUwoIGVsZW0ub3duZXJEb2N1bWVudCApOwp9OwoKdmFyIHBvc1Byb2Nlc3MgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCl7Cgl2YXIgdG1wU2V0ID0gW10sIGxhdGVyID0gIiIsIG1hdGNoLAoJCXJvb3QgPSBjb250ZXh0Lm5vZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4dDsKCgkvLyBQb3NpdGlvbiBzZWxlY3RvcnMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBmaWx0ZXIKCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0byB0aGUgZW5kCgl3aGlsZSAoIChtYXRjaCA9IEV4cHIubWF0Y2guUFNFVURPLmV4ZWMoIHNlbGVjdG9yICkpICkgewoJCWxhdGVyICs9IG1hdGNoWzBdOwoJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7Cgl9CgoJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7CgoJZm9yICggdmFyIGkgPSAwLCBsID0gcm9vdC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7Cgl9CgoJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsKfTsKCi8vIEVYUE9TRQpqUXVlcnkuZmluZCA9IFNpenpsZTsKalF1ZXJ5LmZpbHRlciA9IFNpenpsZS5maWx0ZXI7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKalF1ZXJ5LmV4cHJbIjoiXSA9IGpRdWVyeS5leHByLmZpbHRlcnM7CgpTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCB8fCBlbGVtLm9mZnNldEhlaWdodCA9PT0gMDsKfTsKClNpenpsZS5zZWxlY3RvcnMuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA+IDAgfHwgZWxlbS5vZmZzZXRIZWlnaHQgPiAwOwp9OwoKU2l6emxlLnNlbGVjdG9ycy5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oZm4pewoJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOwoJfSkubGVuZ3RoOwp9OwoKalF1ZXJ5Lm11bHRpRmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7CglpZiAoIG5vdCApIHsKCQlleHByID0gIjpub3QoIiArIGV4cHIgKyAiKSI7Cgl9CgoJcmV0dXJuIFNpenpsZS5tYXRjaGVzKGV4cHIsIGVsZW1zKTsKfTsKCmpRdWVyeS5kaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyICl7Cgl2YXIgbWF0Y2hlZCA9IFtdLCBjdXIgPSBlbGVtW2Rpcl07Cgl3aGlsZSAoIGN1ciAmJiBjdXIgIT0gZG9jdW1lbnQgKSB7CgkJaWYgKCBjdXIubm9kZVR5cGUgPT0gMSApCgkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJY3VyID0gY3VyW2Rpcl07Cgl9CglyZXR1cm4gbWF0Y2hlZDsKfTsKCmpRdWVyeS5udGggPSBmdW5jdGlvbihjdXIsIHJlc3VsdCwgZGlyLCBlbGVtKXsKCXJlc3VsdCA9IHJlc3VsdCB8fCAxOwoJdmFyIG51bSA9IDA7CgoJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkKCQlpZiAoIGN1ci5ub2RlVHlwZSA9PSAxICYmICsrbnVtID09IHJlc3VsdCApCgkJCWJyZWFrOwoKCXJldHVybiBjdXI7Cn07CgpqUXVlcnkuc2libGluZyA9IGZ1bmN0aW9uKG4sIGVsZW0pewoJdmFyIHIgPSBbXTsKCglmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgewoJCWlmICggbi5ub2RlVHlwZSA9PSAxICYmIG4gIT0gZWxlbSApCgkJCXIucHVzaCggbiApOwoJfQoKCXJldHVybiByOwp9OwoKcmV0dXJuOwoKd2luZG93LlNpenpsZSA9IFNpenpsZTsKCn0pKCk7Ci8qCiAqIEEgbnVtYmVyIG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgbWFuYWdpbmcgZXZlbnRzLgogKiBNYW55IG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhpcyBjb2RlIG9yaWdpbmF0ZWQgZnJvbQogKiBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkuCiAqLwpqUXVlcnkuZXZlbnQgPSB7CgoJLy8gQmluZCBhbiBldmVudCB0byBhbiBlbGVtZW50CgkvLyBPcmlnaW5hbCBieSBEZWFuIEVkd2FyZHMKCWFkZDogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEpIHsKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQoJCQlyZXR1cm47CgoJCS8vIEZvciB3aGF0ZXZlciByZWFzb24sIElFIGhhcyB0cm91YmxlIHBhc3NpbmcgdGhlIHdpbmRvdyBvYmplY3QKCQkvLyBhcm91bmQsIGNhdXNpbmcgaXQgdG8gYmUgY2xvbmVkIGluIHRoZSBwcm9jZXNzCgkJaWYgKCBlbGVtLnNldEludGVydmFsICYmIGVsZW0gIT0gd2luZG93ICkKCQkJZWxlbSA9IHdpbmRvdzsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJRAoJCWlmICggIWhhbmRsZXIuZ3VpZCApCgkJCWhhbmRsZXIuZ3VpZCA9IHRoaXMuZ3VpZCsrOwoKCQkvLyBpZiBkYXRhIGlzIHBhc3NlZCwgYmluZCB0byBoYW5kbGVyCgkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCS8vIENyZWF0ZSB0ZW1wb3JhcnkgZnVuY3Rpb24gcG9pbnRlciB0byBvcmlnaW5hbCBoYW5kbGVyCgkJCXZhciBmbiA9IGhhbmRsZXI7CgoJCQkvLyBDcmVhdGUgdW5pcXVlIGhhbmRsZXIgZnVuY3Rpb24sIHdyYXBwZWQgYXJvdW5kIG9yaWdpbmFsIGhhbmRsZXIKCQkJaGFuZGxlciA9IHRoaXMucHJveHkoIGZuICk7CgoJCQkvLyBTdG9yZSBkYXRhIGluIHVuaXF1ZSBoYW5kbGVyCgkJCWhhbmRsZXIuZGF0YSA9IGRhdGE7CgkJfQoKCQkvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlCgkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKGVsZW0sICJldmVudHMiKSB8fCBqUXVlcnkuZGF0YShlbGVtLCAiZXZlbnRzIiwge30pLAoJCQloYW5kbGUgPSBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIikgfHwgalF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIsIGZ1bmN0aW9uKCl7CgkJCQkvLyBIYW5kbGUgdGhlIHNlY29uZCBldmVudCBvZiBhIHRyaWdnZXIgYW5kIHdoZW4KCQkJCS8vIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkCgkJCQlyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gInVuZGVmaW5lZCIgJiYgIWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPwoJCQkJCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoYXJndW1lbnRzLmNhbGxlZS5lbGVtLCBhcmd1bWVudHMpIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX0pOwoJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmdW5jdGlvbgoJCS8vIFRoaXMgaXMgdG8gcHJldmVudCBhIG1lbW9yeSBsZWFrIHdpdGggbm9uLW5hdGl2ZQoJCS8vIGV2ZW50IGluIElFLgoJCWhhbmRsZS5lbGVtID0gZWxlbTsKCgkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQoJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQlqUXVlcnkuZWFjaCh0eXBlcy5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGluZGV4LCB0eXBlKSB7CgkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCWhhbmRsZXIudHlwZSA9IG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLiIpOwoKCQkJLy8gR2V0IHRoZSBjdXJyZW50IGxpc3Qgb2YgZnVuY3Rpb25zIGJvdW5kIHRvIHRoaXMgZXZlbnQKCQkJdmFyIGhhbmRsZXJzID0gZXZlbnRzW3R5cGVdOwoJCQkKCQkJaWYgKCBqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXSApCgkJCQlqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXS5zZXR1cC5jYWxsKGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMpOwoKCQkJLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZQoJCQlpZiAoIWhhbmRsZXJzKSB7CgkJCQloYW5kbGVycyA9IGV2ZW50c1t0eXBlXSA9IHt9OwoKCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZlbnQgaGFuZGxlcgoJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbAoJCQkJLy8gZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0uc2V0dXAuY2FsbChlbGVtLCBkYXRhLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CgkJCQkJLy8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQKCQkJCQlpZiAoZWxlbS5hZGRFdmVudExpc3RlbmVyKQoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlLCBmYWxzZSk7CgkJCQkJZWxzZSBpZiAoZWxlbS5hdHRhY2hFdmVudCkKCQkJCQkJZWxlbS5hdHRhY2hFdmVudCgib24iICsgdHlwZSwgaGFuZGxlKTsKCQkJCX0KCQkJfQoKCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAoJCQloYW5kbGVyc1toYW5kbGVyLmd1aWRdID0gaGFuZGxlcjsKCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgYmVlbiB1c2VkLCBmb3IgZ2xvYmFsIHRyaWdnZXJpbmcKCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFt0eXBlXSA9IHRydWU7CgkJfSk7CgoJCS8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQoJCWVsZW0gPSBudWxsOwoJfSwKCglndWlkOiAxLAoJZ2xvYmFsOiB7fSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIpIHsKCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT0gOCApCgkJCXJldHVybjsKCgkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKGVsZW0sICJldmVudHMiKSwgcmV0LCBpbmRleDsKCgkJaWYgKCBldmVudHMgKSB7CgkJCS8vIFVuYmluZCBhbGwgZXZlbnRzIGZvciB0aGUgZWxlbWVudAoJCQlpZiAoIHR5cGVzID09PSB1bmRlZmluZWQgfHwgKHR5cGVvZiB0eXBlcyA9PT0gInN0cmluZyIgJiYgdHlwZXMuY2hhckF0KDApID09ICIuIikgKQoJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkKCQkJCQl0aGlzLnJlbW92ZSggZWxlbSwgdHlwZSArICh0eXBlcyB8fCAiIikgKTsKCQkJZWxzZSB7CgkJCQkvLyB0eXBlcyBpcyBhY3R1YWxseSBhbiBldmVudCBvYmplY3QgaGVyZQoJCQkJaWYgKCB0eXBlcy50eXBlICkgewoJCQkJCWhhbmRsZXIgPSB0eXBlcy5oYW5kbGVyOwoJCQkJCXR5cGVzID0gdHlwZXMudHlwZTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGVyYXRlZCBieSBhIHNwYWNlCgkJCQkvLyBqUXVlcnkoLi4uKS51bmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQkJCWpRdWVyeS5lYWNoKHR5cGVzLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5kZXgsIHR5cGUpewoJCQkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJCQl2YXIgbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwoJCQkJCXZhciBuYW1lc3BhY2UgPSBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5qb2luKCIuKlxcLiIpICsgIihcXC58JCkiKTsKCgkJCQkJaWYgKCBldmVudHNbdHlwZV0gKSB7CgkJCQkJCS8vIHJlbW92ZSB0aGUgZ2l2ZW4gaGFuZGxlciBmb3IgdGhlIGdpdmVuIHR5cGUKCQkJCQkJaWYgKCBoYW5kbGVyICkKCQkJCQkJCWRlbGV0ZSBldmVudHNbdHlwZV1baGFuZGxlci5ndWlkXTsKCgkJCQkJCS8vIHJlbW92ZSBhbGwgaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiB0eXBlCgkJCQkJCWVsc2UKCQkJCQkJCWZvciAoIHZhciBoYW5kbGUgaW4gZXZlbnRzW3R5cGVdICkKCQkJCQkJCQkvLyBIYW5kbGUgdGhlIHJlbW92YWwgb2YgbmFtZXNwYWNlZCBldmVudHMKCQkJCQkJCQlpZiAoIG5hbWVzcGFjZS50ZXN0KGV2ZW50c1t0eXBlXVtoYW5kbGVdLnR5cGUpICkKCQkJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVdOwoJCQkJCQkJCQkKCQkJCQkJaWYgKCBqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXSApCgkJCQkJCQlqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXS50ZWFyZG93bi5jYWxsKGVsZW0sIG5hbWVzcGFjZXMpOwoKCQkJCQkJLy8gcmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiBubyBtb3JlIGhhbmRsZXJzIGV4aXN0CgkJCQkJCWZvciAoIHJldCBpbiBldmVudHNbdHlwZV0gKSBicmVhazsKCQkJCQkJaWYgKCAhcmV0ICkgewoJCQkJCQkJaWYgKCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0udGVhcmRvd24uY2FsbChlbGVtLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CgkJCQkJCQkJaWYgKGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcikKCQkJCQkJCQkJZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSwgZmFsc2UpOwoJCQkJCQkJCWVsc2UgaWYgKGVsZW0uZGV0YWNoRXZlbnQpCgkJCQkJCQkJCWVsZW0uZGV0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSk7CgkJCQkJCQl9CgkJCQkJCQlyZXQgPSBudWxsOwoJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAoJCQlmb3IgKCByZXQgaW4gZXZlbnRzICkgYnJlYWs7CgkJCWlmICggIXJldCApIHsKCQkJCXZhciBoYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKTsKCQkJCWlmICggaGFuZGxlICkgaGFuZGxlLmVsZW0gPSBudWxsOwoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJldmVudHMiICk7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgImhhbmRsZSIgKTsKCQkJfQoJCX0KCX0sCgoJLy8gYnViYmxpbmcgaXMgaW50ZXJuYWwKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgYnViYmxpbmcgKSB7CgkJLy8gRXZlbnQgb2JqZWN0IG9yIGV2ZW50IHR5cGUKCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgZXZlbnQ7CgoJCWlmKCAhYnViYmxpbmcgKXsKCQkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiID8KCQkJCS8vIGpRdWVyeS5FdmVudCBvYmplY3QKCQkJCWV2ZW50W2V4cGFuZG9dID8gZXZlbnQgOgoJCQkJLy8gT2JqZWN0IGxpdGVyYWwKCQkJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5FdmVudCh0eXBlKSwgZXZlbnQgKSA6CgkJCQkvLyBKdXN0IHRoZSBldmVudCB0eXBlIChzdHJpbmcpCgkJCQlqUXVlcnkuRXZlbnQodHlwZSk7CgoJCQlpZiAoIHR5cGUuaW5kZXhPZigiISIpID49IDAgKSB7CgkJCQlldmVudC50eXBlID0gdHlwZSA9IHR5cGUuc2xpY2UoMCwgLTEpOwoJCQkJZXZlbnQuZXhjbHVzaXZlID0gdHJ1ZTsKCQkJfQoKCQkJLy8gSGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKCQkJaWYgKCAhZWxlbSApIHsKCQkJCS8vIERvbid0IGJ1YmJsZSBjdXN0b20gZXZlbnRzIHdoZW4gZ2xvYmFsICh0byBhdm9pZCB0b28gbXVjaCBvdmVyaGVhZCkKCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoJCQkJLy8gT25seSB0cmlnZ2VyIGlmIHdlJ3ZlIGV2ZXIgYm91bmQgYW4gZXZlbnQgZm9yIGl0CgkJCQlpZiAoIHRoaXMuZ2xvYmFsW3R5cGVdICkKCQkJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LmNhY2hlLCBmdW5jdGlvbigpewoJCQkJCQlpZiAoIHRoaXMuZXZlbnRzICYmIHRoaXMuZXZlbnRzW3R5cGVdICkKCQkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgdGhpcy5oYW5kbGUuZWxlbSApOwoJCQkJCX0pOwoJCQl9CgoJCQkvLyBIYW5kbGUgdHJpZ2dlcmluZyBhIHNpbmdsZSBlbGVtZW50CgoJCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQoJCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQkJCgkJCS8vIENsZWFuIHVwIGluIGNhc2UgaXQgaXMgcmV1c2VkCgkJCWV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQkJCgkJCS8vIENsb25lIHRoZSBpbmNvbWluZyBkYXRhLCBpZiBhbnkKCQkJZGF0YSA9IGpRdWVyeS5tYWtlQXJyYXkoZGF0YSk7CgkJCWRhdGEudW5zaGlmdCggZXZlbnQgKTsKCQl9CgoJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtOwoKCQkvLyBUcmlnZ2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1lZCB0aGF0ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24KCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIpOwoJCWlmICggaGFuZGxlICkKCQkJaGFuZGxlLmFwcGx5KCBlbGVtLCBkYXRhICk7CgoJCS8vIEhhbmRsZSB0cmlnZ2VyaW5nIG5hdGl2ZSAub25mb28gaGFuZGxlcnMgKGFuZCBvbiBsaW5rcyBzaW5jZSB3ZSBkb24ndCBjYWxsIC5jbGljaygpIGZvciBsaW5rcykKCQlpZiAoICghZWxlbVt0eXBlXSB8fCAoalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICdhJykgJiYgdHlwZSA9PSAiY2xpY2siKSkgJiYgZWxlbVsib24iK3R5cGVdICYmIGVsZW1bIm9uIit0eXBlXS5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApCgkJCWV2ZW50LnJlc3VsdCA9IGZhbHNlOwoKCQkvLyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnRzIChleGNlcHQgZm9yIGNsaWNrcyBvbiBsaW5rcykKCQlpZiAoICFidWJibGluZyAmJiBlbGVtW3R5cGVdICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSAmJiAhKGpRdWVyeS5ub2RlTmFtZShlbGVtLCAnYScpICYmIHR5cGUgPT0gImNsaWNrIikgKSB7CgkJCXRoaXMudHJpZ2dlcmVkID0gdHJ1ZTsKCQkJdHJ5IHsKCQkJCWVsZW1bIHR5cGUgXSgpOwoJCQkvLyBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgYW4gZXJyb3IgZm9yIHNvbWUgaGlkZGVuIGVsZW1lbnRzCgkJCX0gY2F0Y2ggKGUpIHt9CgkJfQoKCQl0aGlzLnRyaWdnZXJlZCA9IGZhbHNlOwoKCQlpZiAoICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlIHx8IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJaWYgKCBwYXJlbnQgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoZXZlbnQsIGRhdGEsIHBhcmVudCwgdHJ1ZSk7CgkJfQoJfSwKCgloYW5kbGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy8gcmV0dXJuZWQgdW5kZWZpbmVkIG9yIGZhbHNlCgkJdmFyIGFsbCwgaGFuZGxlcnM7CgoJCWV2ZW50ID0gYXJndW1lbnRzWzBdID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgfHwgd2luZG93LmV2ZW50ICk7CgkJZXZlbnQuY3VycmVudFRhcmdldCA9IHRoaXM7CgkJCgkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycwoJCXZhciBuYW1lc3BhY2VzID0gZXZlbnQudHlwZS5zcGxpdCgiLiIpOwoJCWV2ZW50LnR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgoJCS8vIENhY2hlIHRoaXMgbm93LCBhbGwgPSB0cnVlIG1lYW5zLCBhbnkgaGFuZGxlcgoJCWFsbCA9ICFuYW1lc3BhY2VzLmxlbmd0aCAmJiAhZXZlbnQuZXhjbHVzaXZlOwoJCQoJCXZhciBuYW1lc3BhY2UgPSBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5qb2luKCIuKlxcLiIpICsgIihcXC58JCkiKTsKCgkJaGFuZGxlcnMgPSAoIGpRdWVyeS5kYXRhKHRoaXMsICJldmVudHMiKSB8fCB7fSApW2V2ZW50LnR5cGVdOwoKCQlmb3IgKCB2YXIgaiBpbiBoYW5kbGVycyApIHsKCQkJdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tqXTsKCgkJCS8vIEZpbHRlciB0aGUgZnVuY3Rpb25zIGJ5IGNsYXNzCgkJCWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KGhhbmRsZXIudHlwZSkgKSB7CgkJCQkvLyBQYXNzIGluIGEgcmVmZXJlbmNlIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGl0c2VsZgoJCQkJLy8gU28gdGhhdCB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIGl0CgkJCQlldmVudC5oYW5kbGVyID0gaGFuZGxlcjsKCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVyLmRhdGE7CgoJCQkJdmFyIHJldCA9IGhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCgkJCQlpZiggcmV0ICE9PSB1bmRlZmluZWQgKXsKCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CgkJCQkJaWYgKCByZXQgPT09IGZhbHNlICkgewoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYoIGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKQoJCQkJCWJyZWFrOwoKCQkJfQoJCX0KCX0sCgoJcHJvcHM6ICJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbWV0YUtleSBuZXdWYWx1ZSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKCglmaXg6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJaWYgKCBldmVudFtleHBhbmRvXSApCgkJCXJldHVybiBldmVudDsKCgkJLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QKCQkvLyBhbmQgImNsb25lIiB0byBzZXQgcmVhZC1vbmx5IHByb3BlcnRpZXMKCQl2YXIgb3JpZ2luYWxFdmVudCA9IGV2ZW50OwoJCWV2ZW50ID0galF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CgoJCWZvciAoIHZhciBpID0gdGhpcy5wcm9wcy5sZW5ndGgsIHByb3A7IGk7ICl7CgkJCXByb3AgPSB0aGlzLnByb3BzWyAtLWkgXTsKCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKCQl9CgoJCS8vIEZpeCB0YXJnZXQgcHJvcGVydHksIGlmIG5lY2Vzc2FyeQoJCWlmICggIWV2ZW50LnRhcmdldCApCgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7IC8vIEZpeGVzICMxOTI1IHdoZXJlIHNyY0VsZW1lbnQgbWlnaHQgbm90IGJlIGRlZmluZWQgZWl0aGVyCgoJCS8vIGNoZWNrIGlmIHRhcmdldCBpcyBhIHRleHRub2RlIChzYWZhcmkpCgkJaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT0gMyApCgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOwoKCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApCgkJCWV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBldmVudC5mcm9tRWxlbWVudCA9PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKCgkJLy8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZQoJCWlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBldmVudC5jbGllbnRYICE9IG51bGwgKSB7CgkJCXZhciBkb2MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGJvZHkgPSBkb2N1bWVudC5ib2R5OwoJCQlldmVudC5wYWdlWCA9IGV2ZW50LmNsaWVudFggKyAoZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvYy5jbGllbnRMZWZ0IHx8IDApOwoJCQlldmVudC5wYWdlWSA9IGV2ZW50LmNsaWVudFkgKyAoZG9jICYmIGRvYy5zY3JvbGxUb3AgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCB8fCAwKSAtIChkb2MuY2xpZW50VG9wIHx8IDApOwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgKChldmVudC5jaGFyQ29kZSB8fCBldmVudC5jaGFyQ29kZSA9PT0gMCkgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGUpICkKCQkJZXZlbnQud2hpY2ggPSBldmVudC5jaGFyQ29kZSB8fCBldmVudC5rZXlDb2RlOwoKCQkvLyBBZGQgbWV0YUtleSB0byBub24tTWFjIGJyb3dzZXJzICh1c2UgY3RybCBmb3IgUEMncyBhbmQgTWV0YSBmb3IgTWFjcykKCQlpZiAoICFldmVudC5tZXRhS2V5ICYmIGV2ZW50LmN0cmxLZXkgKQoJCQlldmVudC5tZXRhS2V5ID0gZXZlbnQuY3RybEtleTsKCgkJLy8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PSBsZWZ0OyAyID09IG1pZGRsZTsgMyA9PSByaWdodAoJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgZXZlbnQuYnV0dG9uICkKCQkJZXZlbnQud2hpY2ggPSAoZXZlbnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0b24gJiA0ID8gMiA6IDAgKSApKTsKCgkJcmV0dXJuIGV2ZW50OwoJfSwKCglwcm94eTogZnVuY3Rpb24oIGZuLCBwcm94eSApewoJCXByb3h5ID0gcHJveHkgfHwgZnVuY3Rpb24oKXsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07CgkJLy8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCgkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IHByb3h5Lmd1aWQgfHwgdGhpcy5ndWlkKys7CgkJLy8gU28gcHJveHkgY2FuIGJlIGRlY2xhcmVkIGFzIGFuIGFyZ3VtZW50CgkJcmV0dXJuIHByb3h5OwoJfSwKCglzcGVjaWFsOiB7CgkJcmVhZHk6IHsKCQkJLy8gTWFrZSBzdXJlIHRoZSByZWFkeSBldmVudCBpcyBzZXR1cAoJCQlzZXR1cDogYmluZFJlYWR5LAoJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7fQoJCX0KCX0sCgkKCXNwZWNpYWxBbGw6IHsKCQlsaXZlOiB7CgkJCXNldHVwOiBmdW5jdGlvbiggc2VsZWN0b3IsIG5hbWVzcGFjZXMgKXsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIG5hbWVzcGFjZXNbMF0sIGxpdmVIYW5kbGVyICk7CgkJCX0sCgkJCXRlYXJkb3duOiAgZnVuY3Rpb24oIG5hbWVzcGFjZXMgKXsKCQkJCWlmICggbmFtZXNwYWNlcy5sZW5ndGggKSB7CgkJCQkJdmFyIHJlbW92ZSA9IDAsIG5hbWUgPSBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlc1swXSArICIoXFwufCQpIik7CgkJCQkJCgkJCQkJalF1ZXJ5LmVhY2goIChqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCB7fSksIGZ1bmN0aW9uKCl7CgkJCQkJCWlmICggbmFtZS50ZXN0KHRoaXMudHlwZSkgKQoJCQkJCQkJcmVtb3ZlKys7CgkJCQkJfSk7CgkJCQkJCgkJCQkJaWYgKCByZW1vdmUgPCAxICkKCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgbmFtZXNwYWNlc1swXSwgbGl2ZUhhbmRsZXIgKTsKCQkJCX0KCQkJfQoJCX0KCX0KfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMgKXsKCS8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAoJaWYoICF0aGlzLnByZXZlbnREZWZhdWx0ICkKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudChzcmMpOwoJCgkvLyBFdmVudCBvYmplY3QKCWlmKCBzcmMgJiYgc3JjLnR5cGUgKXsKCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CgkJdGhpcy50eXBlID0gc3JjLnR5cGU7CgkvLyBFdmVudCB0eXBlCgl9ZWxzZQoJCXRoaXMudHlwZSA9IHNyYzsKCgkvLyB0aW1lU3RhbXAgaXMgYnVnZ3kgZm9yIHNvbWUgZXZlbnRzIG9uIEZpcmVmb3goIzM4NDMpCgkvLyBTbyB3ZSB3b24ndCByZWx5IG9uIHRoZSBuYXRpdmUgdmFsdWUKCXRoaXMudGltZVN0YW1wID0gbm93KCk7CgkKCS8vIE1hcmsgaXQgYXMgZml4ZWQKCXRoaXNbZXhwYW5kb10gPSB0cnVlOwp9OwoKZnVuY3Rpb24gcmV0dXJuRmFsc2UoKXsKCXJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiByZXR1cm5UcnVlKCl7CglyZXR1cm4gdHJ1ZTsKfQoKLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbApqUXVlcnkuRXZlbnQucHJvdG90eXBlID0gewoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYoICFlICkKCQkJcmV0dXJuOwoJCS8vIGlmIHByZXZlbnREZWZhdWx0IGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKGUucHJldmVudERlZmF1bHQpCgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQoJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsKCX0sCglzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKCQlpZiggIWUgKQoJCQlyZXR1cm47CgkJLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKGUuc3RvcFByb3BhZ2F0aW9uKQoJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCS8vIG90aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAoSUUpCgkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOwoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpewoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoJCXRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7Cgl9LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZQp9OwovLyBDaGVja3MgaWYgYW4gZXZlbnQgaGFwcGVuZWQgb24gYW4gZWxlbWVudCB3aXRoaW4gYW5vdGhlciBlbGVtZW50Ci8vIFVzZWQgaW4galF1ZXJ5LmV2ZW50LnNwZWNpYWwubW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZSBoYW5kbGVycwp2YXIgd2l0aGluRWxlbWVudCA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkvLyBDaGVjayBpZiBtb3VzZShvdmVyfG91dCkgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgZWxlbWVudAoJdmFyIHBhcmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CgkvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZQoJd2hpbGUgKCBwYXJlbnQgJiYgcGFyZW50ICE9IHRoaXMgKQoJCXRyeSB7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOyB9CgkJY2F0Y2goZSkgeyBwYXJlbnQgPSB0aGlzOyB9CgkKCWlmKCBwYXJlbnQgIT0gdGhpcyApewoJCS8vIHNldCB0aGUgY29ycmVjdCBldmVudCB0eXBlCgkJZXZlbnQudHlwZSA9IGV2ZW50LmRhdGE7CgkJLy8gaGFuZGxlIGV2ZW50IGlmIHdlIGFjdHVhbGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgbm9uIHN1Yi1lbGVtZW50CgkJalF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cgl9Cn07CgkKalF1ZXJ5LmVhY2goeyAKCW1vdXNlb3ZlcjogJ21vdXNlZW50ZXInLCAKCW1vdXNlb3V0OiAnbW91c2VsZWF2ZScKfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApewoJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0gewoJCXNldHVwOiBmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCBvcmlnLCB3aXRoaW5FbGVtZW50LCBmaXggKTsKCQl9LAoJCXRlYXJkb3duOiBmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCBvcmlnLCB3aXRoaW5FbGVtZW50ICk7CgkJfQoJfTsJCQkgICAKfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWJpbmQ6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdHlwZSA9PSAidW5sb2FkIiA/IHRoaXMub25lKHR5cGUsIGRhdGEsIGZuKSA6IHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBmbiB8fCBkYXRhLCBmbiAmJiBkYXRhICk7CgkJfSk7Cgl9LAoKCW9uZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgewoJCXZhciBvbmUgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuIHx8IGRhdGEsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCWpRdWVyeSh0aGlzKS51bmJpbmQoZXZlbnQsIG9uZSk7CgkJCXJldHVybiAoZm4gfHwgZGF0YSkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX0pOwoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgb25lLCBmbiAmJiBkYXRhKTsKCQl9KTsKCX0sCgoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlLCBmbiApOwoJCX0pOwoJfSwKCgl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CgkJfSk7Cgl9LAoKCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlpZiggdGhpc1swXSApewoJCQl2YXIgZXZlbnQgPSBqUXVlcnkuRXZlbnQodHlwZSk7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZXZlbnQsIGRhdGEsIHRoaXNbMF0gKTsKCQkJcmV0dXJuIGV2ZW50LnJlc3VsdDsKCQl9CQkKCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLCBpID0gMTsKCgkJLy8gbGluayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXIKCQl3aGlsZSggaSA8IGFyZ3MubGVuZ3RoICkKCQkJalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgYXJnc1tpKytdICk7CgoJCXJldHVybiB0aGlzLmNsaWNrKCBqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBmdW5jdGlvbihldmVudCkgewoJCQkvLyBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRvIGV4ZWN1dGUKCQkJdGhpcy5sYXN0VG9nZ2xlID0gKCB0aGlzLmxhc3RUb2dnbGUgfHwgMCApICUgaTsKCgkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCQkvLyBhbmQgZXhlY3V0ZSB0aGUgZnVuY3Rpb24KCQkJcmV0dXJuIGFyZ3NbIHRoaXMubGFzdFRvZ2dsZSsrIF0uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIHx8IGZhbHNlOwoJCX0pKTsKCX0sCgoJaG92ZXI6IGZ1bmN0aW9uKGZuT3ZlciwgZm5PdXQpIHsKCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGZuT3ZlcikubW91c2VsZWF2ZShmbk91dCk7Cgl9LAoKCXJlYWR5OiBmdW5jdGlvbihmbikgewoJCS8vIEF0dGFjaCB0aGUgbGlzdGVuZXJzCgkJYmluZFJlYWR5KCk7CgoJCS8vIElmIHRoZSBET00gaXMgYWxyZWFkeSByZWFkeQoJCWlmICggalF1ZXJ5LmlzUmVhZHkgKQoJCQkvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQoJCQlmbi5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CgoJCS8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhlIGZ1bmN0aW9uIGZvciBsYXRlcgoJCWVsc2UKCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgd2FpdCBsaXN0CgkJCWpRdWVyeS5yZWFkeUxpc3QucHVzaCggZm4gKTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoJCglsaXZlOiBmdW5jdGlvbiggdHlwZSwgZm4gKXsKCQl2YXIgcHJveHkgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuICk7CgkJcHJveHkuZ3VpZCArPSB0aGlzLnNlbGVjdG9yICsgdHlwZTsKCgkJalF1ZXJ5KGRvY3VtZW50KS5iaW5kKCBsaXZlQ29udmVydCh0eXBlLCB0aGlzLnNlbGVjdG9yKSwgdGhpcy5zZWxlY3RvciwgcHJveHkgKTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoJCglkaWU6IGZ1bmN0aW9uKCB0eXBlLCBmbiApewoJCWpRdWVyeShkb2N1bWVudCkudW5iaW5kKCBsaXZlQ29udmVydCh0eXBlLCB0aGlzLnNlbGVjdG9yKSwgZm4gPyB7IGd1aWQ6IGZuLmd1aWQgKyB0aGlzLnNlbGVjdG9yICsgdHlwZSB9IDogbnVsbCApOwoJCXJldHVybiB0aGlzOwoJfQp9KTsKCmZ1bmN0aW9uIGxpdmVIYW5kbGVyKCBldmVudCApewoJdmFyIGNoZWNrID0gUmVnRXhwKCIoXnxcXC4pIiArIGV2ZW50LnR5cGUgKyAiKFxcLnwkKSIpLAoJCXN0b3AgPSB0cnVlLAoJCWVsZW1zID0gW107CgoJalF1ZXJ5LmVhY2goalF1ZXJ5LmRhdGEodGhpcywgImV2ZW50cyIpLmxpdmUgfHwgW10sIGZ1bmN0aW9uKGksIGZuKXsKCQlpZiAoIGNoZWNrLnRlc3QoZm4udHlwZSkgKSB7CgkJCXZhciBlbGVtID0galF1ZXJ5KGV2ZW50LnRhcmdldCkuY2xvc2VzdChmbi5kYXRhKVswXTsKCQkJaWYgKCBlbGVtICkKCQkJCWVsZW1zLnB1c2goeyBlbGVtOiBlbGVtLCBmbjogZm4gfSk7CgkJfQoJfSk7CgoJZWxlbXMuc29ydChmdW5jdGlvbihhLGIpIHsKCQlyZXR1cm4galF1ZXJ5LmRhdGEoYS5lbGVtLCAiY2xvc2VzdCIpIC0galF1ZXJ5LmRhdGEoYi5lbGVtLCAiY2xvc2VzdCIpOwoJfSk7CgkKCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbigpewoJCWlmICggdGhpcy5mbi5jYWxsKHRoaXMuZWxlbSwgZXZlbnQsIHRoaXMuZm4uZGF0YSkgPT09IGZhbHNlICkKCQkJcmV0dXJuIChzdG9wID0gZmFsc2UpOwoJfSk7CgoJcmV0dXJuIHN0b3A7Cn0KCmZ1bmN0aW9uIGxpdmVDb252ZXJ0KHR5cGUsIHNlbGVjdG9yKXsKCXJldHVybiBbImxpdmUiLCB0eXBlLCBzZWxlY3Rvci5yZXBsYWNlKC9cLi9nLCAiYCIpLnJlcGxhY2UoLyAvZywgInwiKV0uam9pbigiLiIpOwp9CgpqUXVlcnkuZXh0ZW5kKHsKCWlzUmVhZHk6IGZhbHNlLAoJcmVhZHlMaXN0OiBbXSwKCS8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKCXJlYWR5OiBmdW5jdGlvbigpIHsKCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgRE9NIGlzIG5vdCBhbHJlYWR5IGxvYWRlZAoJCWlmICggIWpRdWVyeS5pc1JlYWR5ICkgewoJCQkvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKCQkJalF1ZXJ5LmlzUmVhZHkgPSB0cnVlOwoKCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCQlpZiAoIGpRdWVyeS5yZWFkeUxpc3QgKSB7CgkJCQkvLyBFeGVjdXRlIGFsbCBvZiB0aGVtCgkJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LnJlYWR5TGlzdCwgZnVuY3Rpb24oKXsKCQkJCQl0aGlzLmNhbGwoIGRvY3VtZW50LCBqUXVlcnkgKTsKCQkJCX0pOwoKCQkJCS8vIFJlc2V0IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucwoJCQkJalF1ZXJ5LnJlYWR5TGlzdCA9IG51bGw7CgkJCX0KCgkJCS8vIFRyaWdnZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50cwoJCQlqUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpOwoJCX0KCX0KfSk7Cgp2YXIgcmVhZHlCb3VuZCA9IGZhbHNlOwoKZnVuY3Rpb24gYmluZFJlYWR5KCl7CglpZiAoIHJlYWR5Qm91bmQgKSByZXR1cm47CglyZWFkeUJvdW5kID0gdHJ1ZTsKCgkvLyBNb3ppbGxhLCBPcGVyYSBhbmQgd2Via2l0IG5pZ2h0bGllcyBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIGV2ZW50CglpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7CgkJLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjawoJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKXsKCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBhcmd1bWVudHMuY2FsbGVlLCBmYWxzZSApOwoJCQlqUXVlcnkucmVhZHkoKTsKCQl9LCBmYWxzZSApOwoKCS8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWQKCX0gZWxzZSBpZiAoIGRvY3VtZW50LmF0dGFjaEV2ZW50ICkgewoJCS8vIGVuc3VyZSBmaXJpbmcgYmVmb3JlIG9ubG9hZCwKCQkvLyBtYXliZSBsYXRlIGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXMKCQlkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKXsKCQkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewoJCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlICk7CgkJCQlqUXVlcnkucmVhZHkoKTsKCQkJfQoJCX0pOwoKCQkvLyBJZiBJRSBhbmQgbm90IGFuIGlmcmFtZQoJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQlpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCAmJiB3aW5kb3cgPT0gd2luZG93LnRvcCApIChmdW5jdGlvbigpewoJCQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkgcmV0dXJuOwoKCQkJdHJ5IHsKCQkJCS8vIElmIElFIGlzIHVzZWQsIHVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pCgkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwoJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iik7CgkJCX0gY2F0Y2goIGVycm9yICkgewoJCQkJc2V0VGltZW91dCggYXJndW1lbnRzLmNhbGxlZSwgMCApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMKCQkJalF1ZXJ5LnJlYWR5KCk7CgkJfSkoKTsKCX0KCgkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yawoJalF1ZXJ5LmV2ZW50LmFkZCggd2luZG93LCAibG9hZCIsIGpRdWVyeS5yZWFkeSApOwp9CgpqUXVlcnkuZWFjaCggKCJibHVyLGZvY3VzLGxvYWQscmVzaXplLHNjcm9sbCx1bmxvYWQsY2xpY2ssZGJsY2xpY2ssIiArCgkibW91c2Vkb3duLG1vdXNldXAsbW91c2Vtb3ZlLG1vdXNlb3Zlcixtb3VzZW91dCxtb3VzZWVudGVyLG1vdXNlbGVhdmUsIiArCgkiY2hhbmdlLHNlbGVjdCxzdWJtaXQsa2V5ZG93bixrZXlwcmVzcyxrZXl1cCxlcnJvciIpLnNwbGl0KCIsIiksIGZ1bmN0aW9uKGksIG5hbWUpewoKCS8vIEhhbmRsZSBldmVudCBiaW5kaW5nCglqUXVlcnkuZm5bbmFtZV0gPSBmdW5jdGlvbihmbil7CgkJcmV0dXJuIGZuID8gdGhpcy5iaW5kKG5hbWUsIGZuKSA6IHRoaXMudHJpZ2dlcihuYW1lKTsKCX07Cn0pOwoKLy8gUHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKLy8gQW5kIHByZXZlbnQgZXJyb3JzIG9uIHJlZnJlc2ggd2l0aCBldmVudHMgbGlrZSBtb3VzZW92ZXIgaW4gb3RoZXIgYnJvd3NlcnMKLy8gV2luZG93IGlzbid0IGluY2x1ZGVkIHNvIGFzIG5vdCB0byB1bmJpbmQgZXhpc3RpbmcgdW5sb2FkIGV2ZW50cwpqUXVlcnkoIHdpbmRvdyApLmJpbmQoICd1bmxvYWQnLCBmdW5jdGlvbigpeyAKCWZvciAoIHZhciBpZCBpbiBqUXVlcnkuY2FjaGUgKQoJCS8vIFNraXAgdGhlIHdpbmRvdwoJCWlmICggaWQgIT0gMSAmJiBqUXVlcnkuY2FjaGVbIGlkIF0uaGFuZGxlICkKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggalF1ZXJ5LmNhY2hlWyBpZCBdLmhhbmRsZS5lbGVtICk7Cn0pOyAKKGZ1bmN0aW9uKCl7CgoJalF1ZXJ5LnN1cHBvcnQgPSB7fTsKCgl2YXIgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKCQlzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7CgoJZGl2LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CglkaXYuaW5uZXJIVE1MID0gJyAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPSIvYSIgc3R5bGU9ImNvbG9yOnJlZDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU7Ij5hPC9hPjxzZWxlY3Q+PG9wdGlvbj50ZXh0PC9vcHRpb24+PC9zZWxlY3Q+PG9iamVjdD48cGFyYW0vPjwvb2JqZWN0Pic7CgoJdmFyIGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLAoJCWEgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTsKCgkvLyBDYW4ndCBnZXQgYmFzaWMgdGVzdCBzdXBwb3J0CglpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7CgkJcmV0dXJuOwoJfQoKCWpRdWVyeS5zdXBwb3J0ID0gewoJCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKCQlsZWFkaW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMywKCQkKCQkvLyBNYWtlIHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRlZAoJCS8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50byBlbXB0eSB0YWJsZXMKCQl0Ym9keTogIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsCgkJCgkJLy8gTWFrZSBzdXJlIHRoYXQgeW91IGNhbiBnZXQgYWxsIGVsZW1lbnRzIGluIGFuIDxvYmplY3Q+IGVsZW1lbnQKCQkvLyBJRSA3IGFsd2F5cyByZXR1cm5zIG5vIHJlc3VsdHMKCQlvYmplY3RBbGw6ICEhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXQoJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGgsCgkJCgkJLy8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MCgkJLy8gVGhpcyByZXF1aXJlcyBhIHdyYXBwZXIgZWxlbWVudCBpbiBJRQoJCWh0bWxTZXJpYWxpemU6ICEhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLAoJCQoJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGUKCQkvLyAoSUUgdXNlcyAuY3NzVGV4dCBpbnN0ZWQpCgkJc3R5bGU6IC9yZWQvLnRlc3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICksCgkJCgkJLy8gTWFrZSBzdXJlIHRoYXQgVVJMcyBhcmVuJ3QgbWFuaXB1bGF0ZWQKCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KQoJCWhyZWZOb3JtYWxpemVkOiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiL2EiLAoJCQoJCS8vIE1ha2Ugc3VyZSB0aGF0IGVsZW1lbnQgb3BhY2l0eSBleGlzdHMKCQkvLyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVhZCkKCQlvcGFjaXR5OiBhLnN0eWxlLm9wYWNpdHkgPT09ICIwLjUiLAoJCQoJCS8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKCQkvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpCgkJY3NzRmxvYXQ6ICEhYS5zdHlsZS5jc3NGbG9hdCwKCgkJLy8gV2lsbCBiZSBkZWZpbmVkIGxhdGVyCgkJc2NyaXB0RXZhbDogZmFsc2UsCgkJbm9DbG9uZUV2ZW50OiB0cnVlLAoJCWJveE1vZGVsOiBudWxsCgl9OwoJCglzY3JpcHQudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiOwoJdHJ5IHsKCQlzY3JpcHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCAid2luZG93LiIgKyBpZCArICI9MTsiICkgKTsKCX0gY2F0Y2goZSl7fQoKCXJvb3QuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIHJvb3QuZmlyc3RDaGlsZCApOwoJCgkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZXhlY3V0aW9uIG9mIGNvZGUgd29ya3MgYnkgaW5qZWN0aW5nIGEgc2NyaXB0CgkvLyB0YWcgd2l0aCBhcHBlbmRDaGlsZC9jcmVhdGVUZXh0Tm9kZQoJLy8gKElFIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzLCBmYWlscywgYW5kIHVzZXMgLnRleHQgaW5zdGVhZCkKCWlmICggd2luZG93WyBpZCBdICkgewoJCWpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgPSB0cnVlOwoJCWRlbGV0ZSB3aW5kb3dbIGlkIF07Cgl9CgoJcm9vdC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CgoJaWYgKCBkaXYuYXR0YWNoRXZlbnQgJiYgZGl2LmZpcmVFdmVudCApIHsKCQlkaXYuYXR0YWNoRXZlbnQoIm9uY2xpY2siLCBmdW5jdGlvbigpewoJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQoJCQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9lcyB0aGlzKQoJCQlqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgPSBmYWxzZTsKCQkJZGl2LmRldGFjaEV2ZW50KCJvbmNsaWNrIiwgYXJndW1lbnRzLmNhbGxlZSk7CgkJfSk7CgkJZGl2LmNsb25lTm9kZSh0cnVlKS5maXJlRXZlbnQoIm9uY2xpY2siKTsKCX0KCgkvLyBGaWd1cmUgb3V0IGlmIHRoZSBXM0MgYm94IG1vZGVsIHdvcmtzIGFzIGV4cGVjdGVkCgkvLyBkb2N1bWVudC5ib2R5IG11c3QgZXhpc3QgYmVmb3JlIHdlIGNhbiBkbyB0aGlzCglqUXVlcnkoZnVuY3Rpb24oKXsKCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJZGl2LnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLnBhZGRpbmdMZWZ0ID0gIjFweCI7CgoJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIGRpdiApOwoJCWpRdWVyeS5ib3hNb2RlbCA9IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsID0gZGl2Lm9mZnNldFdpZHRoID09PSAyOwoJCWRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoIGRpdiApLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Cgl9KTsKfSkoKTsKCnZhciBzdHlsZUZsb2F0ID0galF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiOwoKalF1ZXJ5LnByb3BzID0gewoJImZvciI6ICJodG1sRm9yIiwKCSJjbGFzcyI6ICJjbGFzc05hbWUiLAoJImZsb2F0Ijogc3R5bGVGbG9hdCwKCWNzc0Zsb2F0OiBzdHlsZUZsb2F0LAoJc3R5bGVGbG9hdDogc3R5bGVGbG9hdCwKCXJlYWRvbmx5OiAicmVhZE9ubHkiLAoJbWF4bGVuZ3RoOiAibWF4TGVuZ3RoIiwKCWNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAoJcm93c3BhbjogInJvd1NwYW4iLAoJdGFiaW5kZXg6ICJ0YWJJbmRleCIKfTsKalF1ZXJ5LmZuLmV4dGVuZCh7CgkvLyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQKCV9sb2FkOiBqUXVlcnkuZm4ubG9hZCwKCglsb2FkOiBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkgewoJCWlmICggdHlwZW9mIHVybCAhPT0gInN0cmluZyIgKQoJCQlyZXR1cm4gdGhpcy5fbG9hZCggdXJsICk7CgoJCXZhciBvZmYgPSB1cmwuaW5kZXhPZigiICIpOwoJCWlmICggb2ZmID49IDAgKSB7CgkJCXZhciBzZWxlY3RvciA9IHVybC5zbGljZShvZmYsIHVybC5sZW5ndGgpOwoJCQl1cmwgPSB1cmwuc2xpY2UoMCwgb2ZmKTsKCQl9CgoJCS8vIERlZmF1bHQgdG8gYSBHRVQgcmVxdWVzdAoJCXZhciB0eXBlID0gIkdFVCI7CgoJCS8vIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHdhcyBwcm92aWRlZAoJCWlmICggcGFyYW1zICkKCQkJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCgkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoJCQkJLy8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gcGFyYW1zOwoJCQkJcGFyYW1zID0gbnVsbDsKCgkJCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKCQkJfSBlbHNlIGlmKCB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0IiApIHsKCQkJCXBhcmFtcyA9IGpRdWVyeS5wYXJhbSggcGFyYW1zICk7CgkJCQl0eXBlID0gIlBPU1QiOwoJCQl9CgoJCXZhciBzZWxmID0gdGhpczsKCgkJLy8gUmVxdWVzdCB0aGUgcmVtb3RlIGRvY3VtZW50CgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IHVybCwKCQkJdHlwZTogdHlwZSwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zLAoJCQljb21wbGV0ZTogZnVuY3Rpb24ocmVzLCBzdGF0dXMpewoJCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaW5qZWN0IHRoZSBIVE1MIGludG8gYWxsIHRoZSBtYXRjaGVkIGVsZW1lbnRzCgkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2VzcyIgfHwgc3RhdHVzID09ICJub3Rtb2RpZmllZCIgKQoJCQkJCS8vIFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQKCQkJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCQkJCQkJLy8gQ3JlYXRlIGEgZHVtbXkgZGl2IHRvIGhvbGQgdGhlIHJlc3VsdHMKCQkJCQkJalF1ZXJ5KCI8ZGl2Lz4iKQoJCQkJCQkJLy8gaW5qZWN0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgaW4sIHJlbW92aW5nIHRoZSBzY3JpcHRzCgkJCQkJCQkvLyB0byBhdm9pZCBhbnkgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMgaW4gSUUKCQkJCQkJCS5hcHBlbmQocmVzLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC88c2NyaXB0KC58XHMpKj9cL3NjcmlwdD4vZywgIiIpKQoKCQkJCQkJCS8vIExvY2F0ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzCgkJCQkJCQkuZmluZChzZWxlY3RvcikgOgoKCQkJCQkJLy8gSWYgbm90LCBqdXN0IGluamVjdCB0aGUgZnVsbCByZXN1bHQKCQkJCQkJcmVzLnJlc3BvbnNlVGV4dCApOwoKCQkJCWlmKCBjYWxsYmFjayApCgkJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgW3Jlcy5yZXNwb25zZVRleHQsIHN0YXR1cywgcmVzXSApOwoJCQl9CgkJfSk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGpRdWVyeS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpOwoJfSwKCXNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMuZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpIDogdGhpczsKCQl9KQoJCS5maWx0ZXIoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJgoJCQkJKHRoaXMuY2hlY2tlZCB8fCAvc2VsZWN0fHRleHRhcmVhL2kudGVzdCh0aGlzLm5vZGVOYW1lKSB8fAoJCQkJCS90ZXh0fGhpZGRlbnxwYXNzd29yZHxzZWFyY2gvaS50ZXN0KHRoaXMudHlwZSkpOwoJCX0pCgkJLm1hcChmdW5jdGlvbihpLCBlbGVtKXsKCQkJdmFyIHZhbCA9IGpRdWVyeSh0aGlzKS52YWwoKTsKCQkJcmV0dXJuIHZhbCA9PSBudWxsID8gbnVsbCA6CgkJCQlqUXVlcnkuaXNBcnJheSh2YWwpID8KCQkJCQlqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKHZhbCwgaSl7CgkJCQkJCXJldHVybiB7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKCQkJCQl9KSA6CgkJCQkJe25hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbH07CgkJfSkuZ2V0KCk7Cgl9Cn0pOwoKLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHMKalF1ZXJ5LmVhY2goICJhamF4U3RhcnQsYWpheFN0b3AsYWpheENvbXBsZXRlLGFqYXhFcnJvcixhamF4U3VjY2VzcyxhamF4U2VuZCIuc3BsaXQoIiwiKSwgZnVuY3Rpb24oaSxvKXsKCWpRdWVyeS5mbltvXSA9IGZ1bmN0aW9uKGYpewoJCXJldHVybiB0aGlzLmJpbmQobywgZik7Cgl9Owp9KTsKCnZhciBqc2MgPSBub3coKTsKCmpRdWVyeS5leHRlbmQoewogIAoJZ2V0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21taXRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJY2FsbGJhY2sgPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6ICJHRVQiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQodXJsLCBudWxsLCBjYWxsYmFjaywgInNjcmlwdCIpOwoJfSwKCglnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIpOwoJfSwKCglwb3N0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHt9OwoJCX0KCgkJcmV0dXJuIGpRdWVyeS5hamF4KHsKCQkJdHlwZTogIlBPU1QiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWFqYXhTZXR1cDogZnVuY3Rpb24oIHNldHRpbmdzICkgewoJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHNldHRpbmdzICk7Cgl9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQlnbG9iYWw6IHRydWUsCgkJdHlwZTogIkdFVCIsCgkJY29udGVudFR5cGU6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAoJCXByb2Nlc3NEYXRhOiB0cnVlLAoJCWFzeW5jOiB0cnVlLAoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCSovCgkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdDsgTWljcm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQoJCS8vIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3LCBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCQkvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZW4gYnkgY2FsbGluZyBqUXVlcnkuYWpheFNldHVwCgkJeGhyOmZ1bmN0aW9uKCl7CgkJCXJldHVybiB3aW5kb3cuQWN0aXZlWE9iamVjdCA/IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgkJfSwKCQlhY2NlcHRzOiB7CgkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJc2NyaXB0OiAidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiwKCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCgkJCXRleHQ6ICJ0ZXh0L3BsYWluIiwKCQkJX2RlZmF1bHQ6ICIqLyoiCgkJfQoJfSwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoKCWFqYXg6IGZ1bmN0aW9uKCBzICkgewoJCS8vIEV4dGVuZCB0aGUgc2V0dGluZ3MsIGJ1dCByZS1leHRlbmQgJ3MnIHNvIHRoYXQgaXQgY2FuIGJlCgkJLy8gY2hlY2tlZCBhZ2FpbiBsYXRlciAoaW4gdGhlIHRlc3Qgc3VpdGUsIHNwZWNpZmljYWxseSkKCQlzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBzLCBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBqUXVlcnkuYWpheFNldHRpbmdzLCBzKSk7CgoJCXZhciBqc29ucCwganNyZSA9IC89XD8oJnwkKS9nLCBzdGF0dXMsIGRhdGEsCgkJCXR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gY29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApCgkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbShzLmRhdGEpOwoKCQkvLyBIYW5kbGUgSlNPTlAgUGFyYW1ldGVyIENhbGxiYWNrcwoJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbnAiICkgewoJCQlpZiAoIHR5cGUgPT0gIkdFVCIgKSB7CgkJCQlpZiAoICFzLnVybC5tYXRjaChqc3JlKSApCgkJCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKCQkJfSBlbHNlIGlmICggIXMuZGF0YSB8fCAhcy5kYXRhLm1hdGNoKGpzcmUpICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgPyBzLmRhdGEgKyAiJiIgOiAiIikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CgkJCXMuZGF0YVR5cGUgPSAianNvbiI7CgkJfQoKCQkvLyBCdWlsZCB0ZW1wb3JhcnkgSlNPTlAgZnVuY3Rpb24KCQlpZiAoIHMuZGF0YVR5cGUgPT0gImpzb24iICYmIChzLmRhdGEgJiYgcy5kYXRhLm1hdGNoKGpzcmUpIHx8IHMudXJsLm1hdGNoKGpzcmUpKSApIHsKCQkJanNvbnAgPSAianNvbnAiICsganNjKys7CgoJCQkvLyBSZXBsYWNlIHRoZSA9PyBzZXF1ZW5jZSBib3RoIGluIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHRoZSBkYXRhCgkJCWlmICggcy5kYXRhICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOwoJCQlzLnVybCA9IHMudXJsLnJlcGxhY2UoanNyZSwgIj0iICsganNvbnAgKyAiJDEiKTsKCgkJCS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCgkJCS8vIHRoYXQgYSBKU09OUCBzdHlsZSByZXNwb25zZSBpcyBleGVjdXRlZCBwcm9wZXJseQoJCQlzLmRhdGFUeXBlID0gInNjcmlwdCI7CgoJCQkvLyBIYW5kbGUgSlNPTlAtc3R5bGUgbG9hZGluZwoJCQl3aW5kb3dbIGpzb25wIF0gPSBmdW5jdGlvbih0bXApewoJCQkJZGF0YSA9IHRtcDsKCQkJCXN1Y2Nlc3MoKTsKCQkJCWNvbXBsZXRlKCk7CgkJCQkvLyBHYXJiYWdlIGNvbGxlY3QKCQkJCXdpbmRvd1sganNvbnAgXSA9IHVuZGVmaW5lZDsKCQkJCXRyeXsgZGVsZXRlIHdpbmRvd1sganNvbnAgXTsgfSBjYXRjaChlKXt9CgkJCQlpZiAoIGhlYWQgKQoJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJCQl9OwoJCX0KCgkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHMuY2FjaGUgPT0gbnVsbCApCgkJCXMuY2FjaGUgPSBmYWxzZTsKCgkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSAmJiB0eXBlID09ICJHRVQiICkgewoJCQl2YXIgdHMgPSBub3coKTsKCQkJLy8gdHJ5IHJlcGxhY2luZyBfPSBpZiBpdCBpcyB0aGVyZQoJCQl2YXIgcmV0ID0gcy51cmwucmVwbGFjZSgvKFw/fCYpXz0uKj8oJnwkKS8sICIkMV89IiArIHRzICsgIiQyIik7CgkJCS8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKCQkJcy51cmwgPSByZXQgKyAoKHJldCA9PSBzLnVybCkgPyAocy51cmwubWF0Y2goL1w/LykgPyAiJiIgOiAiPyIpICsgIl89IiArIHRzIDogIiIpOwoJCX0KCgkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybCBmb3IgZ2V0IHJlcXVlc3RzCgkJaWYgKCBzLmRhdGEgJiYgdHlwZSA9PSAiR0VUIiApIHsKCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIHMuZGF0YTsKCgkJCS8vIElFIGxpa2VzIHRvIHNlbmQgYm90aCBnZXQgYW5kIHBvc3QgZGF0YSwgcHJldmVudCB0aGlzCgkJCXMuZGF0YSA9IG51bGw7CgkJfQoKCQkvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzCgkJaWYgKCBzLmdsb2JhbCAmJiAhIGpRdWVyeS5hY3RpdmUrKyApCgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0YXJ0IiApOwoKCQkvLyBNYXRjaGVzIGFuIGFic29sdXRlIFVSTCwgYW5kIHNhdmVzIHRoZSBkb21haW4KCQl2YXIgcGFydHMgPSAvXihcdys6KT9cL1wvKFteXC8/I10rKS8uZXhlYyggcy51cmwgKTsKCgkJLy8gSWYgd2UncmUgcmVxdWVzdGluZyBhIHJlbW90ZSBkb2N1bWVudAoJCS8vIGFuZCB0cnlpbmcgdG8gbG9hZCBKU09OIG9yIFNjcmlwdCB3aXRoIGEgR0VUCgkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHR5cGUgPT0gIkdFVCIgJiYgcGFydHMKCQkJJiYgKCBwYXJ0c1sxXSAmJiBwYXJ0c1sxXSAhPSBsb2NhdGlvbi5wcm90b2NvbCB8fCBwYXJ0c1syXSAhPSBsb2NhdGlvbi5ob3N0ICkpewoKCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOwoJCQl2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CgkJCXNjcmlwdC5zcmMgPSBzLnVybDsKCQkJaWYgKHMuc2NyaXB0Q2hhcnNldCkKCQkJCXNjcmlwdC5jaGFyc2V0ID0gcy5zY3JpcHRDaGFyc2V0OwoKCQkJLy8gSGFuZGxlIFNjcmlwdCBsb2FkaW5nCgkJCWlmICggIWpzb25wICkgewoJCQkJdmFyIGRvbmUgPSBmYWxzZTsKCgkJCQkvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBicm93c2VycwoJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpewoJCQkJCWlmICggIWRvbmUgJiYgKCF0aGlzLnJlYWR5U3RhdGUgfHwKCQkJCQkJCXRoaXMucmVhZHlTdGF0ZSA9PSAibG9hZGVkIiB8fCB0aGlzLnJlYWR5U3RhdGUgPT0gImNvbXBsZXRlIikgKSB7CgkJCQkJCWRvbmUgPSB0cnVlOwoJCQkJCQlzdWNjZXNzKCk7CgkJCQkJCWNvbXBsZXRlKCk7CgoJCQkJCQkvLyBIYW5kbGUgbWVtb3J5IGxlYWsgaW4gSUUKCQkJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQkJCQl9CgkJCQl9OwoJCQl9CgoJCQloZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7CgoJCQkvLyBXZSBoYW5kbGUgZXZlcnl0aGluZyB1c2luZyB0aGUgc2NyaXB0IGVsZW1lbnQgaW5qZWN0aW9uCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQl2YXIgcmVxdWVzdERvbmUgPSBmYWxzZTsKCgkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdAoJCXZhciB4aHIgPSBzLnhocigpOwoKCQkvLyBPcGVuIHRoZSBzb2NrZXQKCQkvLyBQYXNzaW5nIG51bGwgdXNlcm5hbWUsIGdlbmVyYXRlcyBhIGxvZ2luIHBvcHVwIG9uIE9wZXJhICgjMjg2NSkKCQlpZiggcy51c2VybmFtZSApCgkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkKTsKCQllbHNlCgkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jKTsKCgkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMKCQl0cnkgewoJCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQkJaWYgKCBzLmRhdGEgKQoJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUpOwoKCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBoZWFkZXIsIGlmIGlmTW9kaWZpZWQgbW9kZS4KCQkJaWYgKCBzLmlmTW9kaWZpZWQgKQoJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIiwKCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkW3MudXJsXSB8fCAiVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQiICk7CgoJCQkvLyBTZXQgaGVhZGVyIHNvIHRoZSBjYWxsZWQgc2NyaXB0IGtub3dzIHRoYXQgaXQncyBhbiBYTUxIdHRwUmVxdWVzdAoJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsICJYTUxIdHRwUmVxdWVzdCIpOwoKCQkJLy8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZQoJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0Iiwgcy5kYXRhVHlwZSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSArICIsICovKiIgOgoJCQkJcy5hY2NlcHRzLl9kZWZhdWx0ICk7CgkJfSBjYXRjaChlKXt9CgoJCS8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKCQlpZiAoIHMuYmVmb3JlU2VuZCAmJiBzLmJlZm9yZVNlbmQoeGhyLCBzKSA9PT0gZmFsc2UgKSB7CgkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgoJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCS8vIGNsb3NlIG9wZW5kZWQgc29ja2V0CgkJCXhoci5hYm9ydCgpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoIHMuZ2xvYmFsICkKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTZW5kIiwgW3hociwgc10pOwoKCQkvLyBXYWl0IGZvciBhIHJlc3BvbnNlIHRvIGNvbWUgYmFjawoJCXZhciBvbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbihpc1RpbWVvdXQpewoJCQkvLyBUaGUgcmVxdWVzdCB3YXMgYWJvcnRlZCwgY2xlYXIgdGhlIGludGVydmFsIGFuZCBkZWNyZW1lbnQgalF1ZXJ5LmFjdGl2ZQoJCQlpZiAoeGhyLnJlYWR5U3RhdGUgPT0gMCkgewoJCQkJaWYgKGl2YWwpIHsKCQkJCQkvLyBjbGVhciBwb2xsIGludGVydmFsCgkJCQkJY2xlYXJJbnRlcnZhbChpdmFsKTsKCQkJCQlpdmFsID0gbnVsbDsKCQkJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKCQkJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKCQkJCX0KCQkJLy8gVGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlIGFuZCB0aGUgZGF0YSBpcyBhdmFpbGFibGUsIG9yIHRoZSByZXF1ZXN0IHRpbWVkIG91dAoJCQl9IGVsc2UgaWYgKCAhcmVxdWVzdERvbmUgJiYgeGhyICYmICh4aHIucmVhZHlTdGF0ZSA9PSA0IHx8IGlzVGltZW91dCA9PSAidGltZW91dCIpICkgewoJCQkJcmVxdWVzdERvbmUgPSB0cnVlOwoKCQkJCS8vIGNsZWFyIHBvbGwgaW50ZXJ2YWwKCQkJCWlmIChpdmFsKSB7CgkJCQkJY2xlYXJJbnRlcnZhbChpdmFsKTsKCQkJCQlpdmFsID0gbnVsbDsKCQkJCX0KCgkJCQlzdGF0dXMgPSBpc1RpbWVvdXQgPT0gInRpbWVvdXQiID8gInRpbWVvdXQiIDoKCQkJCQkhalF1ZXJ5Lmh0dHBTdWNjZXNzKCB4aHIgKSA/ICJlcnJvciIgOgoJCQkJCXMuaWZNb2RpZmllZCAmJiBqUXVlcnkuaHR0cE5vdE1vZGlmaWVkKCB4aHIsIHMudXJsICkgPyAibm90bW9kaWZpZWQiIDoKCQkJCQkic3VjY2VzcyI7CgoJCQkJaWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiICkgewoJCQkJCS8vIFdhdGNoIGZvciwgYW5kIGNhdGNoLCBYTUwgZG9jdW1lbnQgcGFyc2UgZXJyb3JzCgkJCQkJdHJ5IHsKCQkJCQkJLy8gcHJvY2VzcyB0aGUgZGF0YSAocnVucyB0aGUgeG1sIHRocm91Z2ggaHR0cERhdGEgcmVnYXJkbGVzcyBvZiBjYWxsYmFjaykKCQkJCQkJZGF0YSA9IGpRdWVyeS5odHRwRGF0YSggeGhyLCBzLmRhdGFUeXBlLCBzICk7CgkJCQkJfSBjYXRjaChlKSB7CgkJCQkJCXN0YXR1cyA9ICJwYXJzZXJlcnJvciI7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdG1vZGlmaWVkCgkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2VzcyIgKSB7CgkJCQkJLy8gQ2FjaGUgTGFzdC1Nb2RpZmllZCBoZWFkZXIsIGlmIGlmTW9kaWZpZWQgbW9kZS4KCQkJCQl2YXIgbW9kUmVzOwoJCQkJCXRyeSB7CgkJCQkJCW1vZFJlcyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpOwoJCQkJCX0gY2F0Y2goZSkge30gLy8gc3dhbGxvdyBleGNlcHRpb24gdGhyb3duIGJ5IEZGIGlmIGhlYWRlciBpcyBub3QgYXZhaWxhYmxlCgoJCQkJCWlmICggcy5pZk1vZGlmaWVkICYmIG1vZFJlcyApCgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdID0gbW9kUmVzOwoKCQkJCQkvLyBKU09OUCBoYW5kbGVzIGl0cyBvd24gc3VjY2VzcyBjYWxsYmFjawoJCQkJCWlmICggIWpzb25wICkKCQkJCQkJc3VjY2VzcygpOwoJCQkJfSBlbHNlCgkJCQkJalF1ZXJ5LmhhbmRsZUVycm9yKHMsIHhociwgc3RhdHVzKTsKCgkJCQkvLyBGaXJlIHRoZSBjb21wbGV0ZSBoYW5kbGVycwoJCQkJY29tcGxldGUoKTsKCgkJCQlpZiAoIGlzVGltZW91dCApCgkJCQkJeGhyLmFib3J0KCk7CgoJCQkJLy8gU3RvcCBtZW1vcnkgbGVha3MKCQkJCWlmICggcy5hc3luYyApCgkJCQkJeGhyID0gbnVsbDsKCQkJfQoJCX07CgoJCWlmICggcy5hc3luYyApIHsKCQkJLy8gZG9uJ3QgYXR0YWNoIHRoZSBoYW5kbGVyIHRvIHRoZSByZXF1ZXN0LCBqdXN0IHBvbGwgaXQgaW5zdGVhZAoJCQl2YXIgaXZhbCA9IHNldEludGVydmFsKG9ucmVhZHlzdGF0ZWNoYW5nZSwgMTMpOwoKCQkJLy8gVGltZW91dCBjaGVja2VyCgkJCWlmICggcy50aW1lb3V0ID4gMCApCgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSByZXF1ZXN0IGlzIHN0aWxsIGhhcHBlbmluZwoJCQkJCWlmICggeGhyICYmICFyZXF1ZXN0RG9uZSApCgkJCQkJCW9ucmVhZHlzdGF0ZWNoYW5nZSggInRpbWVvdXQiICk7CgkJCQl9LCBzLnRpbWVvdXQpOwoJCX0KCgkJLy8gU2VuZCB0aGUgZGF0YQoJCXRyeSB7CgkJCXhoci5zZW5kKHMuZGF0YSk7CgkJfSBjYXRjaChlKSB7CgkJCWpRdWVyeS5oYW5kbGVFcnJvcihzLCB4aHIsIG51bGwsIGUpOwoJCX0KCgkJLy8gZmlyZWZveCAxLjUgZG9lc24ndCBmaXJlIHN0YXRlY2hhbmdlIGZvciBzeW5jIHJlcXVlc3RzCgkJaWYgKCAhcy5hc3luYyApCgkJCW9ucmVhZHlzdGF0ZWNoYW5nZSgpOwoKCQlmdW5jdGlvbiBzdWNjZXNzKCl7CgkJCS8vIElmIGEgbG9jYWwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgZmlyZSBpdCBhbmQgcGFzcyBpdCB0aGUgZGF0YQoJCQlpZiAoIHMuc3VjY2VzcyApCgkJCQlzLnN1Y2Nlc3MoIGRhdGEsIHN0YXR1cyApOwoKCQkJLy8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCgkJCWlmICggcy5nbG9iYWwgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3VjY2VzcyIsIFt4aHIsIHNdICk7CgkJfQoKCQlmdW5jdGlvbiBjb21wbGV0ZSgpewoJCQkvLyBQcm9jZXNzIHJlc3VsdAoJCQlpZiAoIHMuY29tcGxldGUgKQoJCQkJcy5jb21wbGV0ZSh4aHIsIHN0YXR1cyk7CgoJCQkvLyBUaGUgcmVxdWVzdCB3YXMgY29tcGxldGVkCgkJCWlmICggcy5nbG9iYWwgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4Q29tcGxldGUiLCBbeGhyLCBzXSApOwoKCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCWlmICggcy5nbG9iYWwgJiYgISAtLWpRdWVyeS5hY3RpdmUgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKCQl9CgoJCS8vIHJldHVybiBYTUxIdHRwUmVxdWVzdCB0byBhbGxvdyBhYm9ydGluZyB0aGUgcmVxdWVzdCBldGMuCgkJcmV0dXJuIHhocjsKCX0sCgoJaGFuZGxlRXJyb3I6IGZ1bmN0aW9uKCBzLCB4aHIsIHN0YXR1cywgZSApIHsKCQkvLyBJZiBhIGxvY2FsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIGZpcmUgaXQKCQlpZiAoIHMuZXJyb3IgKSBzLmVycm9yKCB4aHIsIHN0YXR1cywgZSApOwoKCQkvLyBGaXJlIHRoZSBnbG9iYWwgY2FsbGJhY2sKCQlpZiAoIHMuZ2xvYmFsICkKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4RXJyb3IiLCBbeGhyLCBzLCBlXSApOwoJfSwKCgkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKCWFjdGl2ZTogMCwKCgkvLyBEZXRlcm1pbmVzIGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdAoJaHR0cFN1Y2Nlc3M6IGZ1bmN0aW9uKCB4aHIgKSB7CgkJdHJ5IHsKCQkJLy8gSUUgZXJyb3Igc29tZXRpbWVzIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDQgc28gdHJlYXQgaXQgYXMgc3VjY2Vzcywgc2VlICMxNDUwCgkJCXJldHVybiAheGhyLnN0YXR1cyAmJiBsb2NhdGlvbi5wcm90b2NvbCA9PSAiZmlsZToiIHx8CgkJCQkoIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDAgKSB8fCB4aHIuc3RhdHVzID09IDMwNCB8fCB4aHIuc3RhdHVzID09IDEyMjM7CgkJfSBjYXRjaChlKXt9CgkJcmV0dXJuIGZhbHNlOwoJfSwKCgkvLyBEZXRlcm1pbmVzIGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHJldHVybnMgTm90TW9kaWZpZWQKCWh0dHBOb3RNb2RpZmllZDogZnVuY3Rpb24oIHhociwgdXJsICkgewoJCXRyeSB7CgkJCXZhciB4aHJSZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKCgkJCS8vIEZpcmVmb3ggYWx3YXlzIHJldHVybnMgMjAwLiBjaGVjayBMYXN0LU1vZGlmaWVkIGRhdGUKCQkJcmV0dXJuIHhoci5zdGF0dXMgPT0gMzA0IHx8IHhoclJlcyA9PSBqUXVlcnkubGFzdE1vZGlmaWVkW3VybF07CgkJfSBjYXRjaChlKXt9CgkJcmV0dXJuIGZhbHNlOwoJfSwKCglodHRwRGF0YTogZnVuY3Rpb24oIHhociwgdHlwZSwgcyApIHsKCQl2YXIgY3QgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpLAoJCQl4bWwgPSB0eXBlID09ICJ4bWwiIHx8ICF0eXBlICYmIGN0ICYmIGN0LmluZGV4T2YoInhtbCIpID49IDAsCgkJCWRhdGEgPSB4bWwgPyB4aHIucmVzcG9uc2VYTUwgOiB4aHIucmVzcG9uc2VUZXh0OwoKCQlpZiAoIHhtbCAmJiBkYXRhLmRvY3VtZW50RWxlbWVudC50YWdOYW1lID09ICJwYXJzZXJlcnJvciIgKQoJCQl0aHJvdyAicGFyc2VyZXJyb3IiOwoJCQkKCQkvLyBBbGxvdyBhIHByZS1maWx0ZXJpbmcgZnVuY3Rpb24gdG8gc2FuaXRpemUgdGhlIHJlc3BvbnNlCgkJLy8gcyAhPSBudWxsIGlzIGNoZWNrZWQgdG8ga2VlcCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoJCWlmKCBzICYmIHMuZGF0YUZpbHRlciApCgkJCWRhdGEgPSBzLmRhdGFGaWx0ZXIoIGRhdGEsIHR5cGUgKTsKCgkJLy8gVGhlIGZpbHRlciBjYW4gYWN0dWFsbHkgcGFyc2UgdGhlIHJlc3BvbnNlCgkJaWYoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApewoKCQkJLy8gSWYgdGhlIHR5cGUgaXMgInNjcmlwdCIsIGV2YWwgaXQgaW4gZ2xvYmFsIGNvbnRleHQKCQkJaWYgKCB0eXBlID09ICJzY3JpcHQiICkKCQkJCWpRdWVyeS5nbG9iYWxFdmFsKCBkYXRhICk7CgoJCQkvLyBHZXQgdGhlIEphdmFTY3JpcHQgb2JqZWN0LCBpZiBKU09OIGlzIHVzZWQuCgkJCWlmICggdHlwZSA9PSAianNvbiIgKQoJCQkJZGF0YSA9IHdpbmRvd1siZXZhbCJdKCIoIiArIGRhdGEgKyAiKSIpOwoJCX0KCQkKCQlyZXR1cm4gZGF0YTsKCX0sCgoJLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKCS8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwoJcGFyYW06IGZ1bmN0aW9uKCBhICkgewoJCXZhciBzID0gWyBdOwoKCQlmdW5jdGlvbiBhZGQoIGtleSwgdmFsdWUgKXsKCQkJc1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKCQl9OwoKCQkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheQoJCS8vIG9mIGZvcm0gZWxlbWVudHMKCQlpZiAoIGpRdWVyeS5pc0FycmF5KGEpIHx8IGEuanF1ZXJ5ICkKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpewoJCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQkJfSk7CgoJCS8vIE90aGVyd2lzZSwgYXNzdW1lIHRoYXQgaXQncyBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzCgkJZWxzZQoJCQkvLyBTZXJpYWxpemUgdGhlIGtleS92YWx1ZXMKCQkJZm9yICggdmFyIGogaW4gYSApCgkJCQkvLyBJZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiB0aGUga2V5IG5hbWVzIG5lZWQgdG8gYmUgcmVwZWF0ZWQKCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoYVtqXSkgKQoJCQkJCWpRdWVyeS5lYWNoKCBhW2pdLCBmdW5jdGlvbigpewoJCQkJCQlhZGQoIGosIHRoaXMgKTsKCQkJCQl9KTsKCQkJCWVsc2UKCQkJCQlhZGQoIGosIGpRdWVyeS5pc0Z1bmN0aW9uKGFbal0pID8gYVtqXSgpIDogYVtqXSApOwoKCQkvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uCgkJcmV0dXJuIHMuam9pbigiJiIpLnJlcGxhY2UoLyUyMC9nLCAiKyIpOwoJfQoKfSk7CnZhciBlbGVtZGlzcGxheSA9IHt9LAoJdGltZXJJZCwKCWZ4QXR0cnMgPSBbCgkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJLy8gd2lkdGggYW5pbWF0aW9ucwoJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucwoJCVsgIm9wYWNpdHkiIF0KCV07CgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgbnVtICl7Cgl2YXIgb2JqID0ge307CglqUXVlcnkuZWFjaCggZnhBdHRycy5jb25jYXQuYXBwbHkoW10sIGZ4QXR0cnMuc2xpY2UoMCxudW0pKSwgZnVuY3Rpb24oKXsKCQlvYmpbIHRoaXMgXSA9IHR5cGU7Cgl9KTsKCXJldHVybiBvYmo7Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJc2hvdzogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2spewoJCWlmICggc3BlZWQgKSB7CgkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJzaG93IiwgMyksIHNwZWVkLCBjYWxsYmFjayk7CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKCQkJCXZhciBvbGQgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpOwoJCQkJCgkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSBvbGQgfHwgIiI7CgkJCQkKCQkJCWlmICggalF1ZXJ5LmNzcyh0aGlzW2ldLCAiZGlzcGxheSIpID09PSAibm9uZSIgKSB7CgkJCQkJdmFyIHRhZ05hbWUgPSB0aGlzW2ldLnRhZ05hbWUsIGRpc3BsYXk7CgkJCQkJCgkJCQkJaWYgKCBlbGVtZGlzcGxheVsgdGFnTmFtZSBdICkgewoJCQkJCQlkaXNwbGF5ID0gZWxlbWRpc3BsYXlbIHRhZ05hbWUgXTsKCQkJCQl9IGVsc2UgewoJCQkJCQl2YXIgZWxlbSA9IGpRdWVyeSgiPCIgKyB0YWdOYW1lICsgIiAvPiIpLmFwcGVuZFRvKCJib2R5Iik7CgkJCQkJCQoJCQkJCQlkaXNwbGF5ID0gZWxlbS5jc3MoImRpc3BsYXkiKTsKCQkJCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKQoJCQkJCQkJZGlzcGxheSA9ICJibG9jayI7CgkJCQkJCQoJCQkJCQllbGVtLnJlbW92ZSgpOwoJCQkJCQkKCQkJCQkJZWxlbWRpc3BsYXlbIHRhZ05hbWUgXSA9IGRpc3BsYXk7CgkJCQkJfQoJCQkJCQoJCQkJCWpRdWVyeS5kYXRhKHRoaXNbaV0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSk7CgkJCQl9CgkJCX0KCgkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAoJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpIHx8ICIiOwoJCQl9CgkJCQoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCWhpZGU6IGZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXsKCQlpZiAoIHNwZWVkICkgewoJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgiaGlkZSIsIDMpLCBzcGVlZCwgY2FsbGJhY2spOwoJCX0gZWxzZSB7CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl2YXIgb2xkID0galF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKTsKCQkJCWlmICggIW9sZCAmJiBvbGQgIT09ICJub25lIiApCgkJCQkJalF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBqUXVlcnkuY3NzKHRoaXNbaV0sICJkaXNwbGF5IikpOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApewoJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCS8vIFNhdmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rpb24KCV90b2dnbGU6IGpRdWVyeS5mbi50b2dnbGUsCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4sIGZuMiApewoJCXZhciBib29sID0gdHlwZW9mIGZuID09PSAiYm9vbGVhbiI7CgoJCXJldHVybiBqUXVlcnkuaXNGdW5jdGlvbihmbikgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oZm4yKSA/CgkJCXRoaXMuX3RvZ2dsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOgoJCQlmbiA9PSBudWxsIHx8IGJvb2wgPwoJCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCQkJdmFyIHN0YXRlID0gYm9vbCA/IGZuIDogalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIik7CgkJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCQl9KSA6CgkJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yKTsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbihzcGVlZCx0byxjYWxsYmFjayl7CgkJcmV0dXJuIHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTogdG99LCBzcGVlZCwgY2FsbGJhY2spOwoJfSwKCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIG9wdGFsbCA9IGpRdWVyeS5zcGVlZChzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CgoJCXJldHVybiB0aGlzWyBvcHRhbGwucXVldWUgPT09IGZhbHNlID8gImVhY2giIDogInF1ZXVlIiBdKGZ1bmN0aW9uKCl7CgkJCgkJCXZhciBvcHQgPSBqUXVlcnkuZXh0ZW5kKHt9LCBvcHRhbGwpLCBwLAoJCQkJaGlkZGVuID0gdGhpcy5ub2RlVHlwZSA9PSAxICYmIGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLAoJCQkJc2VsZiA9IHRoaXM7CgkKCQkJZm9yICggcCBpbiBwcm9wICkgewoJCQkJaWYgKCBwcm9wW3BdID09ICJoaWRlIiAmJiBoaWRkZW4gfHwgcHJvcFtwXSA9PSAic2hvdyIgJiYgIWhpZGRlbiApCgkJCQkJcmV0dXJuIG9wdC5jb21wbGV0ZS5jYWxsKHRoaXMpOwoKCQkJCWlmICggKCBwID09ICJoZWlnaHQiIHx8IHAgPT0gIndpZHRoIiApICYmIHRoaXMuc3R5bGUgKSB7CgkJCQkJLy8gU3RvcmUgZGlzcGxheSBwcm9wZXJ0eQoJCQkJCW9wdC5kaXNwbGF5ID0galF1ZXJ5LmNzcyh0aGlzLCAiZGlzcGxheSIpOwoKCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXQKCQkJCQlvcHQub3ZlcmZsb3cgPSB0aGlzLnN0eWxlLm92ZXJmbG93OwoJCQkJfQoJCQl9CgoJCQlpZiAoIG9wdC5vdmVyZmxvdyAhPSBudWxsICkKCQkJCXRoaXMuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKCgkJCW9wdC5jdXJBbmltID0galF1ZXJ5LmV4dGVuZCh7fSwgcHJvcCk7CgoJCQlqUXVlcnkuZWFjaCggcHJvcCwgZnVuY3Rpb24obmFtZSwgdmFsKXsKCQkJCXZhciBlID0gbmV3IGpRdWVyeS5meCggc2VsZiwgb3B0LCBuYW1lICk7CgoJCQkJaWYgKCAvdG9nZ2xlfHNob3d8aGlkZS8udGVzdCh2YWwpICkKCQkJCQllWyB2YWwgPT0gInRvZ2dsZSIgPyBoaWRkZW4gPyAic2hvdyIgOiAiaGlkZSIgOiB2YWwgXSggcHJvcCApOwoJCQkJZWxzZSB7CgkJCQkJdmFyIHBhcnRzID0gdmFsLnRvU3RyaW5nKCkubWF0Y2goL14oWystXT0pPyhbXGQrLS5dKykoLiopJC8pLAoJCQkJCQlzdGFydCA9IGUuY3VyKHRydWUpIHx8IDA7CgoJCQkJCWlmICggcGFydHMgKSB7CgkJCQkJCXZhciBlbmQgPSBwYXJzZUZsb2F0KHBhcnRzWzJdKSwKCQkJCQkJCXVuaXQgPSBwYXJ0c1szXSB8fCAicHgiOwoKCQkJCQkJLy8gV2UgbmVlZCB0byBjb21wdXRlIHN0YXJ0aW5nIHZhbHVlCgkJCQkJCWlmICggdW5pdCAhPSAicHgiICkgewoJCQkJCQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gKGVuZCB8fCAxKSArIHVuaXQ7CgkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8gZS5jdXIodHJ1ZSkpICogc3RhcnQ7CgkJCQkJCQlzZWxmLnN0eWxlWyBuYW1lIF0gPSBzdGFydCArIHVuaXQ7CgkJCQkJCX0KCgkJCQkJCS8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvbgoJCQkJCQlpZiAoIHBhcnRzWzFdICkKCQkJCQkJCWVuZCA9ICgocGFydHNbMV0gPT0gIi09IiA/IC0xIDogMSkgKiBlbmQpICsgc3RhcnQ7CgoJCQkJCQllLmN1c3RvbSggc3RhcnQsIGVuZCwgdW5pdCApOwoJCQkJCX0gZWxzZQoJCQkJCQllLmN1c3RvbSggc3RhcnQsIHZhbCwgIiIgKTsKCQkJCX0KCQkJfSk7CgoJCQkvLyBGb3IgSlMgc3RyaWN0IGNvbXBsaWFuY2UKCQkJcmV0dXJuIHRydWU7CgkJfSk7Cgl9LAoKCXN0b3A6IGZ1bmN0aW9uKGNsZWFyUXVldWUsIGdvdG9FbmQpewoJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOwoKCQlpZiAoY2xlYXJRdWV1ZSkKCQkJdGhpcy5xdWV1ZShbXSk7CgoJCXRoaXMuZWFjaChmdW5jdGlvbigpewoJCQkvLyBnbyBpbiByZXZlcnNlIG9yZGVyIHNvIGFueXRoaW5nIGFkZGVkIHRvIHRoZSBxdWV1ZSBkdXJpbmcgdGhlIGxvb3AgaXMgaWdub3JlZAoJCQlmb3IgKCB2YXIgaSA9IHRpbWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSApCgkJCQlpZiAoIHRpbWVyc1tpXS5lbGVtID09IHRoaXMgKSB7CgkJCQkJaWYgKGdvdG9FbmQpCgkJCQkJCS8vIGZvcmNlIHRoZSBuZXh0IHN0ZXAgdG8gYmUgdGhlIGxhc3QKCQkJCQkJdGltZXJzW2ldKHRydWUpOwoJCQkJCXRpbWVycy5zcGxpY2UoaSwgMSk7CgkJCQl9CgkJfSk7CgoJCS8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKCQlpZiAoIWdvdG9FbmQpCgkJCXRoaXMuZGVxdWV1ZSgpOwoKCQlyZXR1cm4gdGhpczsKCX0KCn0pOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCh7CglzbGlkZURvd246IGdlbkZ4KCJzaG93IiwgMSksCglzbGlkZVVwOiBnZW5GeCgiaGlkZSIsIDEpLAoJc2xpZGVUb2dnbGU6IGdlbkZ4KCJ0b2dnbGUiLCAxKSwKCWZhZGVJbjogeyBvcGFjaXR5OiAic2hvdyIgfSwKCWZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0KfSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICl7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgY2FsbGJhY2sgKXsKCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGNhbGxiYWNrICk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoKCXNwZWVkOiBmdW5jdGlvbihzcGVlZCwgZWFzaW5nLCBmbikgewoJCXZhciBvcHQgPSB0eXBlb2Ygc3BlZWQgPT09ICJvYmplY3QiID8gc3BlZWQgOiB7CgkJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKCQkJZHVyYXRpb246IHNwZWVkLAoJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKGVhc2luZykgJiYgZWFzaW5nCgkJfTsKCgkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CgkJCWpRdWVyeS5meC5zcGVlZHNbb3B0LmR1cmF0aW9uXSB8fCBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0OwoKCQkvLyBRdWV1ZWluZwoJCW9wdC5vbGQgPSBvcHQuY29tcGxldGU7CgkJb3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKXsKCQkJaWYgKCBvcHQucXVldWUgIT09IGZhbHNlICkKCQkJCWpRdWVyeSh0aGlzKS5kZXF1ZXVlKCk7CgkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApCgkJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9OwoKCQlyZXR1cm4gb3B0OwoJfSwKCgllYXNpbmc6IHsKCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKCQkJcmV0dXJuIGZpcnN0TnVtICsgZGlmZiAqIHA7CgkJfSwKCQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgewoJCQlyZXR1cm4gKCgtTWF0aC5jb3MocCpNYXRoLlBJKS8yKSArIDAuNSkgKiBkaWZmICsgZmlyc3ROdW07CgkJfQoJfSwKCgl0aW1lcnM6IFtdLAoKCWZ4OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCApewoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5lbGVtID0gZWxlbTsKCQl0aGlzLnByb3AgPSBwcm9wOwoKCQlpZiAoICFvcHRpb25zLm9yaWcgKQoJCQlvcHRpb25zLm9yaWcgPSB7fTsKCX0KCn0pOwoKalF1ZXJ5LmZ4LnByb3RvdHlwZSA9IHsKCgkvLyBTaW1wbGUgZnVuY3Rpb24gZm9yIHNldHRpbmcgYSBzdHlsZSB2YWx1ZQoJdXBkYXRlOiBmdW5jdGlvbigpewoJCWlmICggdGhpcy5vcHRpb25zLnN0ZXAgKQoJCQl0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7CgoJCShqUXVlcnkuZnguc3RlcFt0aGlzLnByb3BdIHx8IGpRdWVyeS5meC5zdGVwLl9kZWZhdWx0KSggdGhpcyApOwoKCQkvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBibG9jayBmb3IgaGVpZ2h0L3dpZHRoIGFuaW1hdGlvbnMKCQlpZiAoICggdGhpcy5wcm9wID09ICJoZWlnaHQiIHx8IHRoaXMucHJvcCA9PSAid2lkdGgiICkgJiYgdGhpcy5lbGVtLnN0eWxlICkKCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoJfSwKCgkvLyBHZXQgdGhlIGN1cnJlbnQgc2l6ZQoJY3VyOiBmdW5jdGlvbihmb3JjZSl7CgkJaWYgKCB0aGlzLmVsZW1bdGhpcy5wcm9wXSAhPSBudWxsICYmICghdGhpcy5lbGVtLnN0eWxlIHx8IHRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdID09IG51bGwpICkKCQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CgoJCXZhciByID0gcGFyc2VGbG9hdChqUXVlcnkuY3NzKHRoaXMuZWxlbSwgdGhpcy5wcm9wLCBmb3JjZSkpOwoJCXJldHVybiByICYmIHIgPiAtMTAwMDAgPyByIDogcGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKHRoaXMuZWxlbSwgdGhpcy5wcm9wKSkgfHwgMDsKCX0sCgoJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51bWJlciB0byBhbm90aGVyCgljdXN0b206IGZ1bmN0aW9uKGZyb20sIHRvLCB1bml0KXsKCQl0aGlzLnN0YXJ0VGltZSA9IG5vdygpOwoJCXRoaXMuc3RhcnQgPSBmcm9tOwoJCXRoaXMuZW5kID0gdG87CgkJdGhpcy51bml0ID0gdW5pdCB8fCB0aGlzLnVuaXQgfHwgInB4IjsKCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQ7CgkJdGhpcy5wb3MgPSB0aGlzLnN0YXRlID0gMDsKCgkJdmFyIHNlbGYgPSB0aGlzOwoJCWZ1bmN0aW9uIHQoZ290b0VuZCl7CgkJCXJldHVybiBzZWxmLnN0ZXAoZ290b0VuZCk7CgkJfQoKCQl0LmVsZW0gPSB0aGlzLmVsZW07CgoJCWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0KSAmJiAhdGltZXJJZCApIHsKCQkJdGltZXJJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVyczsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKQoJCQkJCWlmICggIXRpbWVyc1tpXSgpICkKCQkJCQkJdGltZXJzLnNwbGljZShpLS0sIDEpOwoKCQkJCWlmICggIXRpbWVycy5sZW5ndGggKSB7CgkJCQkJY2xlYXJJbnRlcnZhbCggdGltZXJJZCApOwoJCQkJCXRpbWVySWQgPSB1bmRlZmluZWQ7CgkJCQl9CgkJCX0sIDEzKTsKCQl9Cgl9LAoKCS8vIFNpbXBsZSAnc2hvdycgZnVuY3Rpb24KCXNob3c6IGZ1bmN0aW9uKCl7CgkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgoJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuYXR0ciggdGhpcy5lbGVtLnN0eWxlLCB0aGlzLnByb3AgKTsKCQl0aGlzLm9wdGlvbnMuc2hvdyA9IHRydWU7CgoJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBzdGFydCBhdCBhIHNtYWxsIHdpZHRoL2hlaWdodCB0byBhdm9pZCBhbnkKCQkvLyBmbGFzaCBvZiBjb250ZW50CgkJdGhpcy5jdXN0b20odGhpcy5wcm9wID09ICJ3aWR0aCIgfHwgdGhpcy5wcm9wID09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOwoKCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CgkJalF1ZXJ5KHRoaXMuZWxlbSkuc2hvdygpOwoJfSwKCgkvLyBTaW1wbGUgJ2hpZGUnIGZ1bmN0aW9uCgloaWRlOiBmdW5jdGlvbigpewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LmF0dHIoIHRoaXMuZWxlbS5zdHlsZSwgdGhpcy5wcm9wICk7CgkJdGhpcy5vcHRpb25zLmhpZGUgPSB0cnVlOwoKCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCgkJdGhpcy5jdXN0b20odGhpcy5jdXIoKSwgMCk7Cgl9LAoKCS8vIEVhY2ggc3RlcCBvZiBhbiBhbmltYXRpb24KCXN0ZXA6IGZ1bmN0aW9uKGdvdG9FbmQpewoJCXZhciB0ID0gbm93KCk7CgoJCWlmICggZ290b0VuZCB8fCB0ID49IHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIHRoaXMuc3RhcnRUaW1lICkgewoJCQl0aGlzLm5vdyA9IHRoaXMuZW5kOwoJCQl0aGlzLnBvcyA9IHRoaXMuc3RhdGUgPSAxOwoJCQl0aGlzLnVwZGF0ZSgpOwoKCQkJdGhpcy5vcHRpb25zLmN1ckFuaW1bIHRoaXMucHJvcCBdID0gdHJ1ZTsKCgkJCXZhciBkb25lID0gdHJ1ZTsKCQkJZm9yICggdmFyIGkgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0gKQoJCQkJaWYgKCB0aGlzLm9wdGlvbnMuY3VyQW5pbVtpXSAhPT0gdHJ1ZSApCgkJCQkJZG9uZSA9IGZhbHNlOwoKCQkJaWYgKCBkb25lICkgewoJCQkJaWYgKCB0aGlzLm9wdGlvbnMuZGlzcGxheSAhPSBudWxsICkgewoJCQkJCS8vIFJlc2V0IHRoZSBvdmVyZmxvdwoJCQkJCXRoaXMuZWxlbS5zdHlsZS5vdmVyZmxvdyA9IHRoaXMub3B0aW9ucy5vdmVyZmxvdzsKCgkJCQkJLy8gUmVzZXQgdGhlIGRpc3BsYXkKCQkJCQl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9IHRoaXMub3B0aW9ucy5kaXNwbGF5OwoJCQkJCWlmICggalF1ZXJ5LmNzcyh0aGlzLmVsZW0sICJkaXNwbGF5IikgPT0gIm5vbmUiICkKCQkJCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoJCQkJfQoKCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYgdGhlICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKCQkJCWlmICggdGhpcy5vcHRpb25zLmhpZGUgKQoJCQkJCWpRdWVyeSh0aGlzLmVsZW0pLmhpZGUoKTsKCgkJCQkvLyBSZXNldCB0aGUgcHJvcGVydGllcywgaWYgdGhlIGl0ZW0gaGFzIGJlZW4gaGlkZGVuIG9yIHNob3duCgkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlIHx8IHRoaXMub3B0aW9ucy5zaG93ICkKCQkJCQlmb3IgKCB2YXIgcCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSApCgkJCQkJCWpRdWVyeS5hdHRyKHRoaXMuZWxlbS5zdHlsZSwgcCwgdGhpcy5vcHRpb25zLm9yaWdbcF0pOwoJCQkJCQoJCQkJLy8gRXhlY3V0ZSB0aGUgY29tcGxldGUgZnVuY3Rpb24KCQkJCXRoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKCB0aGlzLmVsZW0gKTsKCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCXZhciBuID0gdCAtIHRoaXMuc3RhcnRUaW1lOwoJCQl0aGlzLnN0YXRlID0gbiAvIHRoaXMub3B0aW9ucy5kdXJhdGlvbjsKCgkJCS8vIFBlcmZvcm0gdGhlIGVhc2luZyBmdW5jdGlvbiwgZGVmYXVsdHMgdG8gc3dpbmcKCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nW3RoaXMub3B0aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNpbmcuc3dpbmcgPyAic3dpbmciIDogImxpbmVhciIpXSh0aGlzLnN0YXRlLCBuLCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24pOwoJCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQgKyAoKHRoaXMuZW5kIC0gdGhpcy5zdGFydCkgKiB0aGlzLnBvcyk7CgoJCQkvLyBQZXJmb3JtIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGFuaW1hdGlvbgoJCQl0aGlzLnVwZGF0ZSgpOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9Cgp9OwoKalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmZ4LCB7CglzcGVlZHM6ewoJCXNsb3c6IDYwMCwKIAkJZmFzdDogMjAwLAogCQkvLyBEZWZhdWx0IHNwZWVkCiAJCV9kZWZhdWx0OiA0MDAKCX0sCglzdGVwOiB7CgoJCW9wYWNpdHk6IGZ1bmN0aW9uKGZ4KXsKCQkJalF1ZXJ5LmF0dHIoZnguZWxlbS5zdHlsZSwgIm9wYWNpdHkiLCBmeC5ub3cpOwoJCX0sCgoJCV9kZWZhdWx0OiBmdW5jdGlvbihmeCl7CgkJCWlmICggZnguZWxlbS5zdHlsZSAmJiBmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0gIT0gbnVsbCApCgkJCQlmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0gPSBmeC5ub3cgKyBmeC51bml0OwoJCQllbHNlCgkJCQlmeC5lbGVtWyBmeC5wcm9wIF0gPSBmeC5ub3c7CgkJfQoJfQp9KTsKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImdldEJvdW5kaW5nQ2xpZW50UmVjdCJdICkKCWpRdWVyeS5mbi5vZmZzZXQgPSBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07CgkJaWYgKCB0aGlzWzBdID09PSB0aGlzWzBdLm93bmVyRG9jdW1lbnQuYm9keSApIHJldHVybiBqUXVlcnkub2Zmc2V0LmJvZHlPZmZzZXQoIHRoaXNbMF0gKTsKCQl2YXIgYm94ICA9IHRoaXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvYyA9IHRoaXNbMF0ub3duZXJEb2N1bWVudCwgYm9keSA9IGRvYy5ib2R5LCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCwKCQkJY2xpZW50VG9wID0gZG9jRWxlbS5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMCwgY2xpZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMCwKCQkJdG9wICA9IGJveC50b3AgICsgKHNlbGYucGFnZVlPZmZzZXQgfHwgalF1ZXJ5LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsVG9wICB8fCBib2R5LnNjcm9sbFRvcCApIC0gY2xpZW50VG9wLAoJCQlsZWZ0ID0gYm94LmxlZnQgKyAoc2VsZi5wYWdlWE9mZnNldCB8fCBqUXVlcnkuYm94TW9kZWwgJiYgZG9jRWxlbS5zY3JvbGxMZWZ0IHx8IGJvZHkuc2Nyb2xsTGVmdCkgLSBjbGllbnRMZWZ0OwoJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9OwplbHNlIAoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCkgewoJCWlmICggIXRoaXNbMF0gKSByZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCQlpZiAoIHRoaXNbMF0gPT09IHRoaXNbMF0ub3duZXJEb2N1bWVudC5ib2R5ICkgcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggdGhpc1swXSApOwoJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZWQgfHwgalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCXZhciBlbGVtID0gdGhpc1swXSwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQsIHByZXZPZmZzZXRQYXJlbnQgPSBlbGVtLAoJCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsIGNvbXB1dGVkU3R5bGUsIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAoJCQlib2R5ID0gZG9jLmJvZHksIGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3LAoJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCksCgkJCXRvcCA9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0OwoKCQl3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtICE9PSBib2R5ICYmIGVsZW0gIT09IGRvY0VsZW0gKSB7CgkJCWNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpOwoJCQl0b3AgLT0gZWxlbS5zY3JvbGxUb3AsIGxlZnQgLT0gZWxlbS5zY3JvbGxMZWZ0OwoJCQlpZiAoIGVsZW0gPT09IG9mZnNldFBhcmVudCApIHsKCQkJCXRvcCArPSBlbGVtLm9mZnNldFRvcCwgbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CgkJCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEFkZEJvcmRlciAmJiAhKGpRdWVyeS5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgJiYgL150KGFibGV8ZHxoKSQvaS50ZXN0KGVsZW0udGFnTmFtZSkpICkKCQkJCQl0b3AgICs9IHBhcnNlSW50KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoLCAgMTApIHx8IDAsCgkJCQkJbGVmdCArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSB8fCAwOwoJCQkJcHJldk9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudCwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CgkJCX0KCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSAmJiBjb21wdXRlZFN0eWxlLm92ZXJmbG93ICE9PSAidmlzaWJsZSIgKQoJCQkJdG9wICArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwgIDEwKSB8fCAwLAoJCQkJbGVmdCArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSB8fCAwOwoJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGNvbXB1dGVkU3R5bGU7CgkJfQoKCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAicmVsYXRpdmUiIHx8IHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAic3RhdGljIiApCgkJCXRvcCAgKz0gYm9keS5vZmZzZXRUb3AsCgkJCWxlZnQgKz0gYm9keS5vZmZzZXRMZWZ0OwoKCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAiZml4ZWQiICkKCQkJdG9wICArPSBNYXRoLm1heChkb2NFbGVtLnNjcm9sbFRvcCwgYm9keS5zY3JvbGxUb3ApLAoJCQlsZWZ0ICs9IE1hdGgubWF4KGRvY0VsZW0uc2Nyb2xsTGVmdCwgYm9keS5zY3JvbGxMZWZ0KTsKCgkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKCX07CgpqUXVlcnkub2Zmc2V0ID0gewoJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzLmluaXRpYWxpemVkICkgcmV0dXJuOwoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGlubmVyRGl2LCBjaGVja0RpdiwgdGFibGUsIHRkLCBydWxlcywgcHJvcCwgYm9keU1hcmdpblRvcCA9IGJvZHkuc3R5bGUubWFyZ2luVG9wLAoJCQlodG1sID0gJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyI+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPic7CgoJCXJ1bGVzID0geyBwb3NpdGlvbjogJ2Fic29sdXRlJywgdG9wOiAwLCBsZWZ0OiAwLCBtYXJnaW46IDAsIGJvcmRlcjogMCwgd2lkdGg6ICcxcHgnLCBoZWlnaHQ6ICcxcHgnLCB2aXNpYmlsaXR5OiAnaGlkZGVuJyB9OwoJCWZvciAoIHByb3AgaW4gcnVsZXMgKSBjb250YWluZXIuc3R5bGVbcHJvcF0gPSBydWxlc1twcm9wXTsKCgkJY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7CgkJYm9keS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBib2R5LmZpcnN0Q2hpbGQpOwoJCWlubmVyRGl2ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQsIGNoZWNrRGl2ID0gaW5uZXJEaXYuZmlyc3RDaGlsZCwgdGQgPSBpbm5lckRpdi5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7CgoJCXRoaXMuZG9lc05vdEFkZEJvcmRlciA9IChjaGVja0Rpdi5vZmZzZXRUb3AgIT09IDUpOwoJCXRoaXMuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgPSAodGQub2Zmc2V0VG9wID09PSA1KTsKCgkJaW5uZXJEaXYuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJywgaW5uZXJEaXYuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOwoJCXRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gLTUpOwoKCQlib2R5LnN0eWxlLm1hcmdpblRvcCA9ICcxcHgnOwoJCXRoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoYm9keS5vZmZzZXRUb3AgPT09IDApOwoJCWJvZHkuc3R5bGUubWFyZ2luVG9wID0gYm9keU1hcmdpblRvcDsKCgkJYm9keS5yZW1vdmVDaGlsZChjb250YWluZXIpOwoJCXRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOwoJfSwKCglib2R5T2Zmc2V0OiBmdW5jdGlvbihib2R5KSB7CgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplZCB8fCBqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUoKTsKCQl2YXIgdG9wID0gYm9keS5vZmZzZXRUb3AsIGxlZnQgPSBib2R5Lm9mZnNldExlZnQ7CgkJaWYgKCBqUXVlcnkub2Zmc2V0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ICkKCQkJdG9wICArPSBwYXJzZUludCggalF1ZXJ5LmN1ckNTUyhib2R5LCAnbWFyZ2luVG9wJywgIHRydWUpLCAxMCApIHx8IDAsCgkJCWxlZnQgKz0gcGFyc2VJbnQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdpbkxlZnQnLCB0cnVlKSwgMTAgKSB8fCAwOwoJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9Cn07CgoKalF1ZXJ5LmZuLmV4dGVuZCh7Cglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGxlZnQgPSAwLCB0b3AgPSAwLCByZXN1bHRzOwoKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCS8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50CgkJCXZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAoKCQkJLy8gR2V0IGNvcnJlY3Qgb2Zmc2V0cwoJCQlvZmZzZXQgICAgICAgPSB0aGlzLm9mZnNldCgpLAoJCQlwYXJlbnRPZmZzZXQgPSAvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNldFBhcmVudFswXS50YWdOYW1lKSA/IHsgdG9wOiAwLCBsZWZ0OiAwIH0gOiBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7CgoJCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKCQkJLy8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnQgCgkJCS8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCgkJCW9mZnNldC50b3AgIC09IG51bSggdGhpcywgJ21hcmdpblRvcCcgICk7CgkJCW9mZnNldC5sZWZ0IC09IG51bSggdGhpcywgJ21hcmdpbkxlZnQnICk7CgoJCQkvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKCQkJcGFyZW50T2Zmc2V0LnRvcCAgKz0gbnVtKCBvZmZzZXRQYXJlbnQsICdib3JkZXJUb3BXaWR0aCcgICk7CgkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IG51bSggb2Zmc2V0UGFyZW50LCAnYm9yZGVyTGVmdFdpZHRoJyApOwoKCQkJLy8gU3VidHJhY3QgdGhlIHR3byBvZmZzZXRzCgkJCXJlc3VsdHMgPSB7CgkJCQl0b3A6ICBvZmZzZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AsCgkJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0CgkJCX07CgkJfQoKCQlyZXR1cm4gcmVzdWx0czsKCX0sCgoJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpc1swXS5vZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTsKCQl3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoIS9eYm9keXxodG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50LnRhZ05hbWUpICYmIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PSAnc3RhdGljJykgKQoJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OwoJCXJldHVybiBqUXVlcnkob2Zmc2V0UGFyZW50KTsKCX0KfSk7CgoKLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzCmpRdWVyeS5lYWNoKCBbJ0xlZnQnLCAnVG9wJ10sIGZ1bmN0aW9uKGksIG5hbWUpIHsKCXZhciBtZXRob2QgPSAnc2Nyb2xsJyArIG5hbWU7CgkKCWpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbih2YWwpIHsKCQlpZiAoIXRoaXNbMF0pIHJldHVybiBudWxsOwoKCQlyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPwoKCQkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXRoaXMgPT0gd2luZG93IHx8IHRoaXMgPT0gZG9jdW1lbnQgPwoJCQkJCXdpbmRvdy5zY3JvbGxUbygKCQkJCQkJIWkgPyB2YWwgOiBqUXVlcnkod2luZG93KS5zY3JvbGxMZWZ0KCksCgkJCQkJCSBpID8gdmFsIDogalF1ZXJ5KHdpbmRvdykuc2Nyb2xsVG9wKCkKCQkJCQkpIDoKCQkJCQl0aGlzWyBtZXRob2QgXSA9IHZhbDsKCQkJfSkgOgoKCQkJLy8gUmV0dXJuIHRoZSBzY3JvbGwgb2Zmc2V0CgkJCXRoaXNbMF0gPT0gd2luZG93IHx8IHRoaXNbMF0gPT0gZG9jdW1lbnQgPwoJCQkJc2VsZlsgaSA/ICdwYWdlWU9mZnNldCcgOiAncGFnZVhPZmZzZXQnIF0gfHwKCQkJCQlqUXVlcnkuYm94TW9kZWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSB8fAoJCQkJCWRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKCQkJCXRoaXNbMF1bIG1ldGhvZCBdOwoJfTsKfSk7Ci8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKGksIG5hbWUpewoKCXZhciB0bCA9IGkgPyAiTGVmdCIgIDogIlRvcCIsICAvLyB0b3Agb3IgbGVmdAoJCWJyID0gaSA/ICJSaWdodCIgOiAiQm90dG9tIiwgLy8gYm90dG9tIG9yIHJpZ2h0CgkJbG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CgoJLy8gaW5uZXJIZWlnaHQgYW5kIGlubmVyV2lkdGgKCWpRdWVyeS5mblsiaW5uZXIiICsgbmFtZV0gPSBmdW5jdGlvbigpewoJCXJldHVybiB0aGlzWzBdID8KCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwgbG93ZXIsIGZhbHNlLCAicGFkZGluZyIgKSA6CgkJCW51bGw7Cgl9OwoKCS8vIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoCglqUXVlcnkuZm5bIm91dGVyIiArIG5hbWVdID0gZnVuY3Rpb24obWFyZ2luKSB7CgkJcmV0dXJuIHRoaXNbMF0gPwoJCQlqUXVlcnkuY3NzKCB0aGlzWzBdLCBsb3dlciwgZmFsc2UsIG1hcmdpbiA/ICJtYXJnaW4iIDogImJvcmRlciIgKSA6CgkJCW51bGw7Cgl9OwoJCgl2YXIgdHlwZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCglqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBzaXplICkgewoJCS8vIEdldCB3aW5kb3cgd2lkdGggb3IgaGVpZ2h0CgkJcmV0dXJuIHRoaXNbMF0gPT0gd2luZG93ID8KCQkJLy8gRXZlcnlvbmUgZWxzZSB1c2UgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IG9yIGRvY3VtZW50LmJvZHkgZGVwZW5kaW5nIG9uIFF1aXJrcyB2cyBTdGFuZGFyZHMgbW9kZQoJCQlkb2N1bWVudC5jb21wYXRNb2RlID09ICJDU1MxQ29tcGF0IiAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdIHx8CgkJCWRvY3VtZW50LmJvZHlbICJjbGllbnQiICsgbmFtZSBdIDoKCgkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJdGhpc1swXSA9PSBkb2N1bWVudCA/CgkJCQkvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0sIHdoaWNoZXZlciBpcyBncmVhdGVyCgkJCQlNYXRoLm1heCgKCQkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKCQkJCQlkb2N1bWVudC5ib2R5WyJzY3JvbGwiICsgbmFtZV0sIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIiArIG5hbWVdLAoJCQkJCWRvY3VtZW50LmJvZHlbIm9mZnNldCIgKyBuYW1lXSwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0KCQkJCSkgOgoKCQkJCS8vIEdldCBvciBzZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50CgkJCQlzaXplID09PSB1bmRlZmluZWQgPwoJCQkJCS8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQkodGhpcy5sZW5ndGggPyBqUXVlcnkuY3NzKCB0aGlzWzBdLCB0eXBlICkgOiBudWxsKSA6CgoJCQkJCS8vIFNldCB0aGUgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50IChkZWZhdWx0IHRvIHBpeGVscyBpZiB2YWx1ZSBpcyB1bml0bGVzcykKCQkJCQl0aGlzLmNzcyggdHlwZSwgdHlwZW9mIHNpemUgPT09ICJzdHJpbmciID8gc2l6ZSA6IHNpemUgKyAicHgiICk7Cgl9OwoKfSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/js/nicedit.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogTmljRWRpdCAtIE1pY3JvIElubGluZSBXWVNJV1lHCiAqIENvcHlyaWdodCAyMDA3LTIwMDggQnJpYW4gS2lyY2hvZmYKICoKICogTmljRWRpdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVCBsaWNlbnNlCiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHZpc2l0IGh0dHA6Ly9uaWNlZGl0LmNvbS8KICogRG8gbm90IHJlbW92ZSB0aGlzIGNvcHlyaWdodCBtZXNzYWdlCiAqLwp2YXIgYmtFeHRlbmQgPSBmdW5jdGlvbigpewoJdmFyIGFyZ3MgPSBhcmd1bWVudHM7CglpZiAoYXJncy5sZW5ndGggPT0gMSkgYXJncyA9IFt0aGlzLCBhcmdzWzBdXTsKCWZvciAodmFyIHByb3AgaW4gYXJnc1sxXSkgYXJnc1swXVtwcm9wXSA9IGFyZ3NbMV1bcHJvcF07CglyZXR1cm4gYXJnc1swXTsKfTsKZnVuY3Rpb24gYmtDbGFzcygpIHsgfQpia0NsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3QgPSBmdW5jdGlvbigpIHt9Owpia0NsYXNzLmV4dGVuZCA9IGZ1bmN0aW9uKGRlZikgewogIHZhciBjbGFzc0RlZiA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoYXJndW1lbnRzWzBdICE9PSBia0NsYXNzKSB7IHJldHVybiB0aGlzLmNvbnN0cnVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9CiAgfTsKICB2YXIgcHJvdG8gPSBuZXcgdGhpcyhia0NsYXNzKTsKICBia0V4dGVuZChwcm90byxkZWYpOwogIGNsYXNzRGVmLnByb3RvdHlwZSA9IHByb3RvOwogIGNsYXNzRGVmLmV4dGVuZCA9IHRoaXMuZXh0ZW5kOyAgICAgIAogIHJldHVybiBjbGFzc0RlZjsKfTsKCnZhciBia0VsZW1lbnQgPSBia0NsYXNzLmV4dGVuZCh7Cgljb25zdHJ1Y3QgOiBmdW5jdGlvbihlbG0sZCkgewoJCWlmKHR5cGVvZihlbG0pID09ICJzdHJpbmciKSB7CgkJCWVsbSA9IChkIHx8IGRvY3VtZW50KS5jcmVhdGVFbGVtZW50KGVsbSk7CgkJfQoJCWVsbSA9ICRCSyhlbG0pOwoJCXJldHVybiBlbG07Cgl9LAoJCglhcHBlbmRUbyA6IGZ1bmN0aW9uKGVsbSkgewoJCWVsbS5hcHBlbmRDaGlsZCh0aGlzKTsJCgkJcmV0dXJuIHRoaXM7Cgl9LAoJCglhcHBlbmRCZWZvcmUgOiBmdW5jdGlvbihlbG0pIHsKCQllbG0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyxlbG0pOwkKCQlyZXR1cm4gdGhpczsKCX0sCgkKCWFkZEV2ZW50IDogZnVuY3Rpb24odHlwZSwgZm4pIHsKCQlia0xpYi5hZGRFdmVudCh0aGlzLHR5cGUsZm4pOwoJCXJldHVybiB0aGlzOwkKCX0sCgkKCXNldENvbnRlbnQgOiBmdW5jdGlvbihjKSB7CgkJdGhpcy5pbm5lckhUTUwgPSBjOwoJCXJldHVybiB0aGlzOwoJfSwKCQoJcG9zIDogZnVuY3Rpb24oKSB7CgkJdmFyIGN1cmxlZnQgPSBjdXJ0b3AgPSAwOwoJCXZhciBvID0gb2JqID0gdGhpczsKCQlpZiAob2JqLm9mZnNldFBhcmVudCkgewoJCQlkbyB7CgkJCQljdXJsZWZ0ICs9IG9iai5vZmZzZXRMZWZ0OwoJCQkJY3VydG9wICs9IG9iai5vZmZzZXRUb3A7CgkJCX0gd2hpbGUgKG9iaiA9IG9iai5vZmZzZXRQYXJlbnQpOwoJCX0KCQl2YXIgYiA9ICghd2luZG93Lm9wZXJhKSA/IHBhcnNlSW50KHRoaXMuZ2V0U3R5bGUoJ2JvcmRlci13aWR0aCcpIHx8IHRoaXMuc3R5bGUuYm9yZGVyKSB8fCAwIDogMDsKCQlyZXR1cm4gW2N1cmxlZnQrYixjdXJ0b3ArYit0aGlzLm9mZnNldEhlaWdodF07Cgl9LAoJCglub1NlbGVjdCA6IGZ1bmN0aW9uKCkgewoJCWJrTGliLm5vU2VsZWN0KHRoaXMpOwoJCXJldHVybiB0aGlzOwoJfSwKCQoJcGFyZW50VGFnIDogZnVuY3Rpb24odCkgewoJCXZhciBlbG0gPSB0aGlzOwoJCSBkbyB7CgkJCWlmKGVsbSAmJiBlbG0ubm9kZU5hbWUgJiYgZWxtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gdCkgewoJCQkJcmV0dXJuIGVsbTsKCQkJfQoJCQllbG0gPSBlbG0ucGFyZW50Tm9kZTsKCQl9IHdoaWxlKGVsbSk7CgkJcmV0dXJuIGZhbHNlOwoJfSwKCQoJaGFzQ2xhc3MgOiBmdW5jdGlvbihjbHMpIHsKCQlyZXR1cm4gdGhpcy5jbGFzc05hbWUubWF0Y2gobmV3IFJlZ0V4cCgnKFxcc3xeKW5pY0VkaXQtJytjbHMrJyhcXHN8JCknKSk7Cgl9LAoJCglhZGRDbGFzcyA6IGZ1bmN0aW9uKGNscykgewoJCWlmICghdGhpcy5oYXNDbGFzcyhjbHMpKSB7IHRoaXMuY2xhc3NOYW1lICs9ICIgbmljRWRpdC0iK2NscyB9OwoJCXJldHVybiB0aGlzOwoJfSwKCQoJcmVtb3ZlQ2xhc3MgOiBmdW5jdGlvbihjbHMpIHsKCQlpZiAodGhpcy5oYXNDbGFzcyhjbHMpKSB7CgkJCXRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKCcoXFxzfF4pbmljRWRpdC0nK2NscysnKFxcc3wkKScpLCcgJyk7CgkJfQoJCXJldHVybiB0aGlzOwoJfSwKCglzZXRTdHlsZSA6IGZ1bmN0aW9uKHN0KSB7CgkJdmFyIGVsbVN0eWxlID0gdGhpcy5zdHlsZTsKCQlmb3IodmFyIGl0bSBpbiBzdCkgewoJCQlzd2l0Y2goaXRtKSB7CgkJCQljYXNlICdmbG9hdCc6CgkJCQkJZWxtU3R5bGVbJ2Nzc0Zsb2F0J10gPSBlbG1TdHlsZVsnc3R5bGVGbG9hdCddID0gc3RbaXRtXTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ29wYWNpdHknOgoJCQkJCWVsbVN0eWxlLm9wYWNpdHkgPSBzdFtpdG1dOwoJCQkJCWVsbVN0eWxlLmZpbHRlciA9ICJhbHBoYShvcGFjaXR5PSIgKyBNYXRoLnJvdW5kKHN0W2l0bV0qMTAwKSArICIpIjsgCgkJCQkJYnJlYWs7CgkJCQljYXNlICdjbGFzc05hbWUnOgoJCQkJCXRoaXMuY2xhc3NOYW1lID0gc3RbaXRtXTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJaWYoZG9jdW1lbnQuY29tcGF0TW9kZSB8fCBpdG0gIT0gImN1cnNvciIpIHsgLy8gTmFzdHkgV29ya2Fyb3VuZCBmb3IgSUUgNS41CgkJCQkJCWlmKGJrTGliLmlzTVNJRSAmJiBpdG0gPT0gIm1heEhlaWdodCIpewogICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBGaXg6IElFIGJ1ZwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsbVN0eWxlW2l0bV0gPSBzdFtpdG1dOwogICAgICAgICAgfQoJCQl9CgkJfQoJCXJldHVybiB0aGlzOwoJfSwKCQoJZ2V0U3R5bGUgOiBmdW5jdGlvbiggY3NzUnVsZSwgZCApIHsKCQl2YXIgZG9jID0gKCFkKSA/IGRvY3VtZW50LmRlZmF1bHRWaWV3IDogZDsgCgkJaWYodGhpcy5ub2RlVHlwZSA9PSAxKQoJCXJldHVybiAoZG9jICYmIGRvYy5nZXRDb21wdXRlZFN0eWxlKSA/IGRvYy5nZXRDb21wdXRlZFN0eWxlKCB0aGlzLCBudWxsICkuZ2V0UHJvcGVydHlWYWx1ZShjc3NSdWxlKSA6IHRoaXMuY3VycmVudFN0eWxlWyBia0xpYi5jYW1lbGl6ZShjc3NSdWxlKSBdOwoJfSwKCQoJcmVtb3ZlIDogZnVuY3Rpb24oKSB7CgkJdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpOwoJCXJldHVybiB0aGlzOwkKCX0sCgkKCXNldEF0dHJpYnV0ZXMgOiBmdW5jdGlvbihhdCkgewoJCWZvcih2YXIgaXRtIGluIGF0KSB7CgkJCXRoaXNbaXRtXSA9IGF0W2l0bV07CgkJfQoJCXJldHVybiB0aGlzOwoJfQp9KTsKCnZhciBia0xpYiA9IHsKCWlzTVNJRSA6IChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCJNU0lFIikgIT0gLTEpLAoJCglhZGRFdmVudCA6IGZ1bmN0aW9uKG9iaiwgdHlwZSwgZm4pIHsKCQkob2JqLmFkZEV2ZW50TGlzdGVuZXIpID8gb2JqLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGZuLCBmYWxzZSApIDogb2JqLmF0dGFjaEV2ZW50KCJvbiIrdHlwZSwgZm4pOwkKCX0sCgkKCXRvQXJyYXkgOiBmdW5jdGlvbihpdGVyYWJsZSkgewoJCXZhciBsZW5ndGggPSBpdGVyYWJsZS5sZW5ndGgsIHJlc3VsdHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgIAl3aGlsZSAobGVuZ3RoLS0pIHsgcmVzdWx0c1tsZW5ndGhdID0gaXRlcmFibGVbbGVuZ3RoXSB9OwogICAgCXJldHVybiByZXN1bHRzOwkKCX0sCgkKCW5vU2VsZWN0IDogZnVuY3Rpb24oZWxlbWVudCkgewoJCWlmKGVsZW1lbnQuc2V0QXR0cmlidXRlICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAnaW5wdXQnICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAndGV4dGFyZWEnKSB7CgkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCd1bnNlbGVjdGFibGUnLCdvbicpOwoJCX0KCQlmb3IodmFyIGk9MDtpPGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7aSsrKSB7CgkJCWJrTGliLm5vU2VsZWN0KGVsZW1lbnQuY2hpbGROb2Rlc1tpXSk7CgkJfQoJfSwKCWNhbWVsaXplIDogZnVuY3Rpb24ocykgewoJCXJldHVybiBzLnJlcGxhY2UoL1wtKC4pL2csIGZ1bmN0aW9uKG0sIGwpe3JldHVybiBsLnRvVXBwZXJDYXNlKCl9KTsKCX0sCglpbkFycmF5IDogZnVuY3Rpb24oYXJyLGl0ZW0pIHsKCSAgICByZXR1cm4gKGJrTGliLnNlYXJjaChhcnIsaXRlbSkgIT0gbnVsbCk7Cgl9LAoJc2VhcmNoIDogZnVuY3Rpb24oYXJyLGl0bSkgewoJCWZvcih2YXIgaT0wOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CgkJCWlmKGFycltpXSA9PSBpdG0pCgkJCQlyZXR1cm4gaTsKCQl9CgkJcmV0dXJuIG51bGw7CQoJfSwKCWNhbmNlbEV2ZW50IDogZnVuY3Rpb24oZSkgewoJCWUgPSBlIHx8IHdpbmRvdy5ldmVudDsKCQlpZihlLnByZXZlbnREZWZhdWx0ICYmIGUuc3RvcFByb3BhZ2F0aW9uKSB7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfSwKCWRvbUxvYWQgOiBbXSwKCWRvbUxvYWRlZCA6IGZ1bmN0aW9uKCkgewoJCWlmIChhcmd1bWVudHMuY2FsbGVlLmRvbmUpIHJldHVybjsKCQlhcmd1bWVudHMuY2FsbGVlLmRvbmUgPSB0cnVlOwoJCWZvciAoaSA9IDA7aSA8IGJrTGliLmRvbUxvYWQubGVuZ3RoO2krKykgYmtMaWIuZG9tTG9hZFtpXSgpOwoJfSwKCW9uRG9tTG9hZGVkIDogZnVuY3Rpb24oZmlyZVRoaXMpIHsKCQl0aGlzLmRvbUxvYWQucHVzaChmaXJlVGhpcyk7CgkJaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGJrTGliLmRvbUxvYWRlZCwgbnVsbCk7CgkJfSBlbHNlIGlmKGJrTGliLmlzTVNJRSkgewoJCQlkb2N1bWVudC53cml0ZSgiPHN0eWxlPi5uaWNFZGl0LW1haW4gcCB7IG1hcmdpbjogMDsgfTwvc3R5bGU+PHNjciIrImlwdCBpZD1fX2llX29ubG9hZCBkZWZlciAiICsgKChsb2NhdGlvbi5wcm90b2NvbCA9PSAiaHR0cHM6IikgPyAic3JjPSdqYXZhc2NyaXB0OnZvaWQoMCknIiA6ICJzcmM9Ly8wIikgKyAiPjxcL3NjciIrImlwdD4iKTsKCQkJJEJLKCJfX2llX29ubG9hZCIpLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewoJCQkgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKXtia0xpYi5kb21Mb2FkZWQoKTt9CgkJCX07CgkJfQoJICAgIHdpbmRvdy5vbmxvYWQgPSBia0xpYi5kb21Mb2FkZWQ7Cgl9Cn07CgpmdW5jdGlvbiAkQksoZWxtKSB7CglpZih0eXBlb2YoZWxtKSA9PSAic3RyaW5nIikgewoJCWVsbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsbSk7Cgl9CglyZXR1cm4gKGVsbSAmJiAhZWxtLmFwcGVuZFRvKSA/IGJrRXh0ZW5kKGVsbSxia0VsZW1lbnQucHJvdG90eXBlKSA6IGVsbTsKfQoKdmFyIGJrRXZlbnQgPSB7CglhZGRFdmVudCA6IGZ1bmN0aW9uKGV2VHlwZSwgZXZGdW5jKSB7CgkJaWYoZXZGdW5jKSB7CgkJCXRoaXMuZXZlbnRMaXN0ID0gdGhpcy5ldmVudExpc3QgfHwge307CgkJCXRoaXMuZXZlbnRMaXN0W2V2VHlwZV0gPSB0aGlzLmV2ZW50TGlzdFtldlR5cGVdIHx8IFtdOwoJCQl0aGlzLmV2ZW50TGlzdFtldlR5cGVdLnB1c2goZXZGdW5jKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9LAoJZmlyZUV2ZW50IDogZnVuY3Rpb24oKSB7CgkJdmFyIGFyZ3MgPSBia0xpYi50b0FycmF5KGFyZ3VtZW50cyksIGV2VHlwZSA9IGFyZ3Muc2hpZnQoKTsKCQlpZih0aGlzLmV2ZW50TGlzdCAmJiB0aGlzLmV2ZW50TGlzdFtldlR5cGVdKSB7CgkJCWZvcih2YXIgaT0wO2k8dGhpcy5ldmVudExpc3RbZXZUeXBlXS5sZW5ndGg7aSsrKSB7CgkJCQl0aGlzLmV2ZW50TGlzdFtldlR5cGVdW2ldLmFwcGx5KHRoaXMsYXJncyk7CgkJCX0KCQl9Cgl9CQp9OwoKZnVuY3Rpb24gX18ocykgewoJcmV0dXJuIHM7Cn0KCkZ1bmN0aW9uLnByb3RvdHlwZS5jbG9zdXJlID0gZnVuY3Rpb24oKSB7CiAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9IGJrTGliLnRvQXJyYXkoYXJndW1lbnRzKSwgb2JqID0gYXJncy5zaGlmdCgpOwogIHJldHVybiBmdW5jdGlvbigpIHsgaWYodHlwZW9mKGJrTGliKSAhPSAndW5kZWZpbmVkJykgeyByZXR1cm4gX19tZXRob2QuYXBwbHkob2JqLGFyZ3MuY29uY2F0KGJrTGliLnRvQXJyYXkoYXJndW1lbnRzKSkpOyB9IH07Cn0KCQpGdW5jdGlvbi5wcm90b3R5cGUuY2xvc3VyZUxpc3RlbmVyID0gZnVuY3Rpb24oKSB7CiAgCXZhciBfX21ldGhvZCA9IHRoaXMsIGFyZ3MgPSBia0xpYi50b0FycmF5KGFyZ3VtZW50cyksIG9iamVjdCA9IGFyZ3Muc2hpZnQoKTsgCiAgCXJldHVybiBmdW5jdGlvbihlKSB7IAogIAllID0gZSB8fCB3aW5kb3cuZXZlbnQ7CiAgCWlmKGUudGFyZ2V0KSB7IHZhciB0YXJnZXQgPSBlLnRhcmdldDsgfSBlbHNlIHsgdmFyIHRhcmdldCA9ICBlLnNyY0VsZW1lbnQgfTsKCSAgCXJldHVybiBfX21ldGhvZC5hcHBseShvYmplY3QsIFtlLHRhcmdldF0uY29uY2F0KGFyZ3MpICk7IAoJfTsKfQkJCgoKLyogU1RBUlQgQ09ORklHICovCgp2YXIgbmljRWRpdG9yQ29uZmlnID0gYmtDbGFzcy5leHRlbmQoewoJYnV0dG9ucyA6IHsKCQknYm9sZCcgOiB7bmFtZSA6IF9fKCdDbGljayB0byBCb2xkJyksIGNvbW1hbmQgOiAnQm9sZCcsIHRhZ3MgOiBbJ0InLCdTVFJPTkcnXSwgY3NzIDogeydmb250LXdlaWdodCcgOiAnYm9sZCd9LCBrZXkgOiAnYid9LAoJCSdpdGFsaWMnIDoge25hbWUgOiBfXygnQ2xpY2sgdG8gSXRhbGljJyksIGNvbW1hbmQgOiAnSXRhbGljJywgdGFncyA6IFsnRU0nLCdJJ10sIGNzcyA6IHsnZm9udC1zdHlsZScgOiAnaXRhbGljJ30sIGtleSA6ICdpJ30sCgkJJ3VuZGVybGluZScgOiB7bmFtZSA6IF9fKCdDbGljayB0byBVbmRlcmxpbmUnKSwgY29tbWFuZCA6ICdVbmRlcmxpbmUnLCB0YWdzIDogWydVJ10sIGNzcyA6IHsndGV4dC1kZWNvcmF0aW9uJyA6ICd1bmRlcmxpbmUnfSwga2V5IDogJ3UnfSwKCQknbGVmdCcgOiB7bmFtZSA6IF9fKCdMZWZ0IEFsaWduJyksIGNvbW1hbmQgOiAnanVzdGlmeWxlZnQnLCBub0FjdGl2ZSA6IHRydWV9LAoJCSdjZW50ZXInIDoge25hbWUgOiBfXygnQ2VudGVyIEFsaWduJyksIGNvbW1hbmQgOiAnanVzdGlmeWNlbnRlcicsIG5vQWN0aXZlIDogdHJ1ZX0sCgkJJ3JpZ2h0JyA6IHtuYW1lIDogX18oJ1JpZ2h0IEFsaWduJyksIGNvbW1hbmQgOiAnanVzdGlmeXJpZ2h0Jywgbm9BY3RpdmUgOiB0cnVlfSwKCQknanVzdGlmeScgOiB7bmFtZSA6IF9fKCdKdXN0aWZ5IEFsaWduJyksIGNvbW1hbmQgOiAnanVzdGlmeWZ1bGwnLCBub0FjdGl2ZSA6IHRydWV9LAoJCSdvbCcgOiB7bmFtZSA6IF9fKCdJbnNlcnQgT3JkZXJlZCBMaXN0JyksIGNvbW1hbmQgOiAnaW5zZXJ0b3JkZXJlZGxpc3QnLCB0YWdzIDogWydPTCddfSwKCQkndWwnIDogCXtuYW1lIDogX18oJ0luc2VydCBVbm9yZGVyZWQgTGlzdCcpLCBjb21tYW5kIDogJ2luc2VydHVub3JkZXJlZGxpc3QnLCB0YWdzIDogWydVTCddfSwKCQknc3Vic2NyaXB0JyA6IHtuYW1lIDogX18oJ0NsaWNrIHRvIFN1YnNjcmlwdCcpLCBjb21tYW5kIDogJ3N1YnNjcmlwdCcsIHRhZ3MgOiBbJ1NVQiddfSwKCQknc3VwZXJzY3JpcHQnIDoge25hbWUgOiBfXygnQ2xpY2sgdG8gU3VwZXJzY3JpcHQnKSwgY29tbWFuZCA6ICdzdXBlcnNjcmlwdCcsIHRhZ3MgOiBbJ1NVUCddfSwKCQknc3RyaWtldGhyb3VnaCcgOiB7bmFtZSA6IF9fKCdDbGljayB0byBTdHJpa2UgVGhyb3VnaCcpLCBjb21tYW5kIDogJ3N0cmlrZVRocm91Z2gnLCBjc3MgOiB7J3RleHQtZGVjb3JhdGlvbicgOiAnbGluZS10aHJvdWdoJ319LAoJCSdyZW1vdmVmb3JtYXQnIDoge25hbWUgOiBfXygnUmVtb3ZlIEZvcm1hdHRpbmcnKSwgY29tbWFuZCA6ICdyZW1vdmVmb3JtYXQnLCBub0FjdGl2ZSA6IHRydWV9LAoJCSdpbmRlbnQnIDoge25hbWUgOiBfXygnSW5kZW50IFRleHQnKSwgY29tbWFuZCA6ICdpbmRlbnQnLCBub0FjdGl2ZSA6IHRydWV9LAoJCSdvdXRkZW50JyA6IHtuYW1lIDogX18oJ1JlbW92ZSBJbmRlbnQnKSwgY29tbWFuZCA6ICdvdXRkZW50Jywgbm9BY3RpdmUgOiB0cnVlfSwKCQknaHInIDoge25hbWUgOiBfXygnSG9yaXpvbnRhbCBSdWxlJyksIGNvbW1hbmQgOiAnaW5zZXJ0SG9yaXpvbnRhbFJ1bGUnLCBub0FjdGl2ZSA6IHRydWV9Cgl9LAoJaWNvbnNQYXRoIDogJy4uL25pY0VkaXRvckljb25zLmdpZicsCglidXR0b25MaXN0IDogWydzYXZlJywnYm9sZCcsJ2l0YWxpYycsJ3VuZGVybGluZScsJ2xlZnQnLCdjZW50ZXInLCdyaWdodCcsJ2p1c3RpZnknLCdvbCcsJ3VsJywnZm9udFNpemUnLCdmb250RmFtaWx5JywnZm9udEZvcm1hdCcsJ2luZGVudCcsJ291dGRlbnQnLCdpbWFnZScsJ3VwbG9hZCcsJ2xpbmsnLCd1bmxpbmsnLCdmb3JlY29sb3InLCdiZ2NvbG9yJ10sCglpY29uTGlzdCA6IHsieGh0bWwiOjEsImJnY29sb3IiOjIsImZvcmVjb2xvciI6MywiYm9sZCI6NCwiY2VudGVyIjo1LCJociI6NiwiaW5kZW50Ijo3LCJpdGFsaWMiOjgsImp1c3RpZnkiOjksImxlZnQiOjEwLCJvbCI6MTEsIm91dGRlbnQiOjEyLCJyZW1vdmVmb3JtYXQiOjEzLCJyaWdodCI6MTQsInNhdmUiOjI1LCJzdHJpa2V0aHJvdWdoIjoxNiwic3Vic2NyaXB0IjoxNywic3VwZXJzY3JpcHQiOjE4LCJ1bCI6MTksInVuZGVybGluZSI6MjAsImltYWdlIjoyMSwibGluayI6MjIsInVubGluayI6MjMsImNsb3NlIjoyNCwiYXJyb3ciOjI2fQoJCn0pOwovKiBFTkQgQ09ORklHICovCgoKdmFyIG5pY0VkaXRvcnMgPSB7CgluaWNQbHVnaW5zIDogW10sCgllZGl0b3JzIDogW10sCgkKCXJlZ2lzdGVyUGx1Z2luIDogZnVuY3Rpb24ocGx1Z2luLG9wdGlvbnMpIHsKCQl0aGlzLm5pY1BsdWdpbnMucHVzaCh7cCA6IHBsdWdpbiwgbyA6IG9wdGlvbnN9KTsKCX0sCgoJYWxsVGV4dEFyZWFzIDogZnVuY3Rpb24obmljT3B0aW9ucykgewoJCXZhciB0ZXh0YXJlYXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGV4dGFyZWEiKTsKCQlmb3IodmFyIGk9MDtpPHRleHRhcmVhcy5sZW5ndGg7aSsrKSB7CgkJCW5pY0VkaXRvcnMuZWRpdG9ycy5wdXNoKG5ldyBuaWNFZGl0b3IobmljT3B0aW9ucykucGFuZWxJbnN0YW5jZSh0ZXh0YXJlYXNbaV0pKTsKCQl9CgkJcmV0dXJuIG5pY0VkaXRvcnMuZWRpdG9yczsKCX0sCgkKCWZpbmRFZGl0b3IgOiBmdW5jdGlvbihlKSB7CgkJdmFyIGVkaXRvcnMgPSBuaWNFZGl0b3JzLmVkaXRvcnM7CgkJZm9yKHZhciBpPTA7aTxlZGl0b3JzLmxlbmd0aDtpKyspIHsKCQkJaWYoZWRpdG9yc1tpXS5pbnN0YW5jZUJ5SWQoZSkpIHsKCQkJCXJldHVybiBlZGl0b3JzW2ldLmluc3RhbmNlQnlJZChlKTsKCQkJfQoJCX0KCX0KfTsKCgp2YXIgbmljRWRpdG9yID0gYmtDbGFzcy5leHRlbmQoewoJY29uc3RydWN0IDogZnVuY3Rpb24obykgewoJCXRoaXMub3B0aW9ucyA9IG5ldyBuaWNFZGl0b3JDb25maWcoKTsKCQlia0V4dGVuZCh0aGlzLm9wdGlvbnMsbyk7CgkJdGhpcy5uaWNJbnN0YW5jZXMgPSBuZXcgQXJyYXkoKTsKCQl0aGlzLmxvYWRlZFBsdWdpbnMgPSBuZXcgQXJyYXkoKTsKCQkKCQl2YXIgcGx1Z2lucyA9IG5pY0VkaXRvcnMubmljUGx1Z2luczsKCQlmb3IodmFyIGk9MDtpPHBsdWdpbnMubGVuZ3RoO2krKykgewoJCQl0aGlzLmxvYWRlZFBsdWdpbnMucHVzaChuZXcgcGx1Z2luc1tpXS5wKHRoaXMscGx1Z2luc1tpXS5vKSk7CgkJfQoJCW5pY0VkaXRvcnMuZWRpdG9ycy5wdXNoKHRoaXMpOwoJCWJrTGliLmFkZEV2ZW50KGRvY3VtZW50LmJvZHksJ21vdXNlZG93bicsIHRoaXMuc2VsZWN0Q2hlY2suY2xvc3VyZUxpc3RlbmVyKHRoaXMpICk7Cgl9LAoJCglwYW5lbEluc3RhbmNlIDogZnVuY3Rpb24oZSxvKSB7CgkJZSA9IHRoaXMuY2hlY2tSZXBsYWNlKCRCSyhlKSk7CgkJdmFyIHBhbmVsRWxtID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUoe3dpZHRoIDogKHBhcnNlSW50KGUuZ2V0U3R5bGUoJ3dpZHRoJykpIHx8IGUuY2xpZW50V2lkdGgpKydweCd9KS5hcHBlbmRCZWZvcmUoZSk7CgkJdGhpcy5zZXRQYW5lbChwYW5lbEVsbSk7CgkJcmV0dXJuIHRoaXMuYWRkSW5zdGFuY2UoZSxvKTsJCgl9LAoKCWNoZWNrUmVwbGFjZSA6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgciA9IG5pY0VkaXRvcnMuZmluZEVkaXRvcihlKTsKCQlpZihyKSB7CgkJCXIucmVtb3ZlSW5zdGFuY2UoZSk7CgkJCXIucmVtb3ZlUGFuZWwoKTsKCQl9CgkJcmV0dXJuIGU7Cgl9LAoKCWFkZEluc3RhbmNlIDogZnVuY3Rpb24oZSxvKSB7CgkJZSA9IHRoaXMuY2hlY2tSZXBsYWNlKCRCSyhlKSk7CgkJaWYoIGUuY29udGVudEVkaXRhYmxlIHx8ICEhd2luZG93Lm9wZXJhICkgewoJCQl2YXIgbmV3SW5zdGFuY2UgPSBuZXcgbmljRWRpdG9ySW5zdGFuY2UoZSxvLHRoaXMpOwoJCX0gZWxzZSB7CgkJCXZhciBuZXdJbnN0YW5jZSA9IG5ldyBuaWNFZGl0b3JJRnJhbWVJbnN0YW5jZShlLG8sdGhpcyk7CgkJfQoJCXRoaXMubmljSW5zdGFuY2VzLnB1c2gobmV3SW5zdGFuY2UpOwoJCXJldHVybiB0aGlzOwoJfSwKCQoJcmVtb3ZlSW5zdGFuY2UgOiBmdW5jdGlvbihlKSB7CgkJZSA9ICRCSyhlKTsKCQl2YXIgaW5zdGFuY2VzID0gdGhpcy5uaWNJbnN0YW5jZXM7CgkJZm9yKHZhciBpPTA7aTxpbnN0YW5jZXMubGVuZ3RoO2krKykgewkKCQkJaWYoaW5zdGFuY2VzW2ldLmUgPT0gZSkgewoJCQkJaW5zdGFuY2VzW2ldLnJlbW92ZSgpOwoJCQkJdGhpcy5uaWNJbnN0YW5jZXMuc3BsaWNlKGksMSk7CgkJCX0KCQl9Cgl9LAoKCXJlbW92ZVBhbmVsIDogZnVuY3Rpb24oZSkgewoJCWlmKHRoaXMubmljUGFuZWwpIHsKCQkJdGhpcy5uaWNQYW5lbC5yZW1vdmUoKTsKCQkJdGhpcy5uaWNQYW5lbCA9IG51bGw7CgkJfQkKCX0sCgoJaW5zdGFuY2VCeUlkIDogZnVuY3Rpb24oZSkgewoJCWUgPSAkQksoZSk7CgkJdmFyIGluc3RhbmNlcyA9IHRoaXMubmljSW5zdGFuY2VzOwoJCWZvcih2YXIgaT0wO2k8aW5zdGFuY2VzLmxlbmd0aDtpKyspIHsKCQkJaWYoaW5zdGFuY2VzW2ldLmUgPT0gZSkgewoJCQkJcmV0dXJuIGluc3RhbmNlc1tpXTsKCQkJfQoJCX0JCgl9LAoKCXNldFBhbmVsIDogZnVuY3Rpb24oZSkgewoJCXRoaXMubmljUGFuZWwgPSBuZXcgbmljRWRpdG9yUGFuZWwoJEJLKGUpLHRoaXMub3B0aW9ucyx0aGlzKTsKCQl0aGlzLmZpcmVFdmVudCgncGFuZWwnLHRoaXMubmljUGFuZWwpOwoJCXJldHVybiB0aGlzOwoJfSwKCQoJbmljQ29tbWFuZCA6IGZ1bmN0aW9uKGNtZCxhcmdzKSB7CQoJCWlmKHRoaXMuc2VsZWN0ZWRJbnN0YW5jZSkgewoJCQl0aGlzLnNlbGVjdGVkSW5zdGFuY2UubmljQ29tbWFuZChjbWQsYXJncyk7CgkJfQoJfSwKCQoJZ2V0SWNvbiA6IGZ1bmN0aW9uKGljb25OYW1lLG9wdGlvbnMpIHsKCQl2YXIgaWNvbiA9IHRoaXMub3B0aW9ucy5pY29uTGlzdFtpY29uTmFtZV07CgkJdmFyIGZpbGUgPSAob3B0aW9ucy5pY29uRmlsZXMpID8gb3B0aW9ucy5pY29uRmlsZXNbaWNvbk5hbWVdIDogJyc7CgkJcmV0dXJuIHtiYWNrZ3JvdW5kSW1hZ2UgOiAidXJsKCciKygoaWNvbikgPyB0aGlzLm9wdGlvbnMuaWNvbnNQYXRoIDogZmlsZSkrIicpIiwgYmFja2dyb3VuZFBvc2l0aW9uIDogKChpY29uKSA/ICgoaWNvbi0xKSotMTgpIDogMCkrJ3B4IDBweCd9OwkKCX0sCgkJCglzZWxlY3RDaGVjayA6IGZ1bmN0aW9uKGUsdCkgewoJCXZhciBmb3VuZCA9IGZhbHNlOwoJCWRvewoJCQlpZih0LmNsYXNzTmFtZSAmJiB0LmNsYXNzTmFtZS5pbmRleE9mKCduaWNFZGl0JykgIT0gLTEpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0gd2hpbGUodCA9IHQucGFyZW50Tm9kZSk7CgkJdGhpcy5maXJlRXZlbnQoJ2JsdXInLHRoaXMuc2VsZWN0ZWRJbnN0YW5jZSx0KTsKCQl0aGlzLmxhc3RTZWxlY3RlZEluc3RhbmNlID0gdGhpcy5zZWxlY3RlZEluc3RhbmNlOwoJCXRoaXMuc2VsZWN0ZWRJbnN0YW5jZSA9IG51bGw7CgkJcmV0dXJuIGZhbHNlOwoJfQoJCn0pOwpuaWNFZGl0b3IgPSBuaWNFZGl0b3IuZXh0ZW5kKGJrRXZlbnQpOwoKIAp2YXIgbmljRWRpdG9ySW5zdGFuY2UgPSBia0NsYXNzLmV4dGVuZCh7Cglpc1NlbGVjdGVkIDogZmFsc2UsCgkKCWNvbnN0cnVjdCA6IGZ1bmN0aW9uKGUsb3B0aW9ucyxuaWNFZGl0b3IpIHsKCQl0aGlzLm5lID0gbmljRWRpdG9yOwoJCXRoaXMuZWxtID0gdGhpcy5lID0gZTsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCQoJCW5ld1ggPSBwYXJzZUludChlLmdldFN0eWxlKCd3aWR0aCcpKSB8fCBlLmNsaWVudFdpZHRoOwoJCW5ld1kgPSBwYXJzZUludChlLmdldFN0eWxlKCdoZWlnaHQnKSkgfHwgZS5jbGllbnRIZWlnaHQ7CgkJdGhpcy5pbml0aWFsSGVpZ2h0ID0gbmV3WS04OwoJCQoJCXZhciBpc1RleHRhcmVhID0gKGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAidGV4dGFyZWEiKTsKCQlpZihpc1RleHRhcmVhIHx8IHRoaXMub3B0aW9ucy5oYXNQYW5lbCkgewoJCQl2YXIgaWU3cyA9IChia0xpYi5pc01TSUUgJiYgISgodHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGUubWF4SGVpZ2h0ICE9ICJ1bmRlZmluZWQiKSAmJiBkb2N1bWVudC5jb21wYXRNb2RlID09ICJDU1MxQ29tcGF0IikpCgkJCXZhciBzID0ge3dpZHRoOiBuZXdYKydweCcsIGJvcmRlciA6ICcxcHggc29saWQgI2NjYycsIGJvcmRlclRvcCA6IDAsIG92ZXJmbG93WSA6ICdhdXRvJywgb3ZlcmZsb3dYOiAnaGlkZGVuJyB9OwoJCQlzWyhpZTdzKSA/ICdoZWlnaHQnIDogJ21heEhlaWdodCddID0gKHRoaXMubmUub3B0aW9ucy5tYXhIZWlnaHQpID8gdGhpcy5uZS5vcHRpb25zLm1heEhlaWdodCsncHgnIDogbnVsbDsKCQkJdGhpcy5lZGl0b3JDb250YWluID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUocykuYXBwZW5kQmVmb3JlKGUpOwoJCQl2YXIgZWRpdG9yRWxtID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUoe3dpZHRoIDogKG5ld1gtOCkrJ3B4JywgbWFyZ2luOiAnNHB4JywgbWluSGVpZ2h0IDogbmV3WSsncHgnfSkuYWRkQ2xhc3MoJ21haW4nKS5hcHBlbmRUbyh0aGlzLmVkaXRvckNvbnRhaW4pOwoKCQkJZS5zZXRTdHlsZSh7ZGlzcGxheSA6ICdub25lJ30pOwoJCQkJCgkJCWVkaXRvckVsbS5pbm5lckhUTUwgPSBlLmlubmVySFRNTDsJCQoJCQlpZihpc1RleHRhcmVhKSB7CgkJCQllZGl0b3JFbG0uc2V0Q29udGVudChlLnZhbHVlKTsKCQkJCXRoaXMuY29weUVsbSA9IGU7CgkJCQl2YXIgZiA9IGUucGFyZW50VGFnKCdGT1JNJyk7CgkJCQlpZihmKSB7IGJrTGliLmFkZEV2ZW50KCBmLCAnc3VibWl0JywgdGhpcy5zYXZlQ29udGVudC5jbG9zdXJlKHRoaXMpKTsgfQoJCQl9CgkJCWVkaXRvckVsbS5zZXRTdHlsZSgoaWU3cykgPyB7aGVpZ2h0IDogbmV3WSsncHgnfSA6IHtvdmVyZmxvdzogJ2hpZGRlbid9KTsKCQkJdGhpcy5lbG0gPSBlZGl0b3JFbG07CQoJCX0KCQl0aGlzLm5lLmFkZEV2ZW50KCdibHVyJyx0aGlzLmJsdXIuY2xvc3VyZSh0aGlzKSk7CgoJCXRoaXMuaW5pdCgpOwoJCXRoaXMuYmx1cigpOwoJfSwKCQoJaW5pdCA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxtLnNldEF0dHJpYnV0ZSgnY29udGVudEVkaXRhYmxlJywndHJ1ZScpOwkKCQlpZih0aGlzLmdldENvbnRlbnQoKSA9PSAiIikgewoJCQl0aGlzLnNldENvbnRlbnQoJzxiciAvPicpOwoJCX0KCQl0aGlzLmluc3RhbmNlRG9jID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7CgkJdGhpcy5lbG0uYWRkRXZlbnQoJ21vdXNlZG93bicsdGhpcy5zZWxlY3RlZC5jbG9zdXJlTGlzdGVuZXIodGhpcykpLmFkZEV2ZW50KCdrZXlwcmVzcycsdGhpcy5rZXlEb3duLmNsb3N1cmVMaXN0ZW5lcih0aGlzKSkuYWRkRXZlbnQoJ2ZvY3VzJyx0aGlzLnNlbGVjdGVkLmNsb3N1cmUodGhpcykpLmFkZEV2ZW50KCdibHVyJyx0aGlzLmJsdXIuY2xvc3VyZSh0aGlzKSkuYWRkRXZlbnQoJ2tleXVwJyx0aGlzLnNlbGVjdGVkLmNsb3N1cmUodGhpcykpOwoJCXRoaXMubmUuZmlyZUV2ZW50KCdhZGQnLHRoaXMpOwoJfSwKCQoJcmVtb3ZlIDogZnVuY3Rpb24oKSB7CgkJdGhpcy5zYXZlQ29udGVudCgpOwoJCWlmKHRoaXMuY29weUVsbSB8fCB0aGlzLm9wdGlvbnMuaGFzUGFuZWwpIHsKCQkJdGhpcy5lZGl0b3JDb250YWluLnJlbW92ZSgpOwoJCQl0aGlzLmUuc2V0U3R5bGUoeydkaXNwbGF5JyA6ICdibG9jayd9KTsKCQkJdGhpcy5uZS5yZW1vdmVQYW5lbCgpOwoJCX0KCQl0aGlzLmRpc2FibGUoKTsKCQl0aGlzLm5lLmZpcmVFdmVudCgncmVtb3ZlJyx0aGlzKTsKCX0sCgkKCWRpc2FibGUgOiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsbS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRFZGl0YWJsZScsJ2ZhbHNlJyk7Cgl9LAoJCglnZXRTZWwgOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gKHdpbmRvdy5nZXRTZWxlY3Rpb24pID8gd2luZG93LmdldFNlbGVjdGlvbigpIDogZG9jdW1lbnQuc2VsZWN0aW9uOwkKCX0sCgkKCWdldFJuZyA6IGZ1bmN0aW9uKCkgewoJCXZhciBzID0gdGhpcy5nZXRTZWwoKTsKCQlpZighcykgeyByZXR1cm4gbnVsbDsgfQoJCXJldHVybiAocy5yYW5nZUNvdW50ID4gMCkgPyBzLmdldFJhbmdlQXQoMCkgOiBzLmNyZWF0ZVJhbmdlKCk7Cgl9LAoJCglzZWxSbmcgOiBmdW5jdGlvbihybmcscykgewoJCWlmKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHsKCQkJcy5yZW1vdmVBbGxSYW5nZXMoKTsKCQkJcy5hZGRSYW5nZShybmcpOwoJCX0gZWxzZSB7CgkJCXJuZy5zZWxlY3QoKTsKCQl9Cgl9LAoJCglzZWxFbG0gOiBmdW5jdGlvbigpIHsKCQl2YXIgciA9IHRoaXMuZ2V0Um5nKCk7CgkJaWYoci5zdGFydENvbnRhaW5lcikgewoJCQl2YXIgY29udGFpbiA9IHIuc3RhcnRDb250YWluZXI7CgkJCWlmKHIuY2xvbmVDb250ZW50cygpLmNoaWxkTm9kZXMubGVuZ3RoID09IDEpIHsKCQkJCWZvcih2YXIgaT0wO2k8Y29udGFpbi5jaGlsZE5vZGVzLmxlbmd0aDtpKyspIHsKCQkJCQl2YXIgcm5nID0gY29udGFpbi5jaGlsZE5vZGVzW2ldLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKCQkJCQlybmcuc2VsZWN0Tm9kZShjb250YWluLmNoaWxkTm9kZXNbaV0pOwkJCQkJCgkJCQkJaWYoci5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fU1RBUlQscm5nKSAhPSAxICYmIAoJCQkJCQlyLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5FTkRfVE9fRU5ELHJuZykgIT0gLTEpIHsKCQkJCQkJcmV0dXJuICRCSyhjb250YWluLmNoaWxkTm9kZXNbaV0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gJEJLKGNvbnRhaW4pOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkQksoKHRoaXMuZ2V0U2VsKCkudHlwZSA9PSAiQ29udHJvbCIpID8gci5pdGVtKDApIDogci5wYXJlbnRFbGVtZW50KCkpOwoJCX0KCX0sCgkKCXNhdmVSbmcgOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNhdmVkUmFuZ2UgPSB0aGlzLmdldFJuZygpOwoJCXRoaXMuc2F2ZWRTZWwgPSB0aGlzLmdldFNlbCgpOwoJfSwKCQoJcmVzdG9yZVJuZyA6IGZ1bmN0aW9uKCkgewoJCWlmKHRoaXMuc2F2ZWRSYW5nZSkgewoJCQl0aGlzLnNlbFJuZyh0aGlzLnNhdmVkUmFuZ2UsdGhpcy5zYXZlZFNlbCk7CgkJfQoJfSwKCQoJa2V5RG93biA6IGZ1bmN0aW9uKGUsdCkgewoJCWlmKGUuY3RybEtleSkgewoJCQl0aGlzLm5lLmZpcmVFdmVudCgna2V5Jyx0aGlzLGUpOwoJCX0KCX0sCgkKCXNlbGVjdGVkIDogZnVuY3Rpb24oZSx0KSB7CgkJaWYoIXQpIHt0ID0gdGhpcy5zZWxFbG0oKX0KCQlpZighZS5jdHJsS2V5KSB7CgkJCXZhciBzZWxJbnN0YW5jZSA9IHRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZTsKCQkJaWYoc2VsSW5zdGFuY2UgIT0gdGhpcykgewoJCQkJaWYoc2VsSW5zdGFuY2UpIHsKCQkJCQl0aGlzLm5lLmZpcmVFdmVudCgnYmx1cicsc2VsSW5zdGFuY2UsdCk7CgkJCQl9CgkJCQl0aGlzLm5lLnNlbGVjdGVkSW5zdGFuY2UgPSB0aGlzOwkKCQkJCXRoaXMubmUuZmlyZUV2ZW50KCdmb2N1cycsc2VsSW5zdGFuY2UsdCk7CgkJCX0KCQkJdGhpcy5uZS5maXJlRXZlbnQoJ3NlbGVjdGVkJyxzZWxJbnN0YW5jZSx0KTsKCQkJdGhpcy5pc0ZvY3VzZWQgPSB0cnVlOwoJCQl0aGlzLmVsbS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfSwKCQoJYmx1ciA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNGb2N1c2VkID0gZmFsc2U7CgkJdGhpcy5lbG0ucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7Cgl9LAoJCglzYXZlQ29udGVudCA6IGZ1bmN0aW9uKCkgewoJCWlmKHRoaXMuY29weUVsbSB8fCB0aGlzLm9wdGlvbnMuaGFzUGFuZWwpIHsKCQkJdGhpcy5uZS5maXJlRXZlbnQoJ3NhdmUnLHRoaXMpOwoJCQkodGhpcy5jb3B5RWxtKSA/IHRoaXMuY29weUVsbS52YWx1ZSA9IHRoaXMuZ2V0Q29udGVudCgpIDogdGhpcy5lLmlubmVySFRNTCA9IHRoaXMuZ2V0Q29udGVudCgpOwoJCX0JCgl9LAoJCglnZXRFbG0gOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5lbG07Cgl9LAoJCglnZXRDb250ZW50IDogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb250ZW50ID0gdGhpcy5nZXRFbG0oKS5pbm5lckhUTUw7CgkJdGhpcy5uZS5maXJlRXZlbnQoJ2dldCcsdGhpcyk7CgkJcmV0dXJuIHRoaXMuY29udGVudDsKCX0sCgkKCXNldENvbnRlbnQgOiBmdW5jdGlvbihlKSB7CgkJdGhpcy5jb250ZW50ID0gZTsKCQl0aGlzLm5lLmZpcmVFdmVudCgnc2V0Jyx0aGlzKTsKCQl0aGlzLmVsbS5pbm5lckhUTUwgPSB0aGlzLmNvbnRlbnQ7CQoJfSwKCQoJbmljQ29tbWFuZCA6IGZ1bmN0aW9uKGNtZCxhcmdzKSB7CgkJZG9jdW1lbnQuZXhlY0NvbW1hbmQoY21kLGZhbHNlLGFyZ3MpOwoJfQkJCn0pOwoKdmFyIG5pY0VkaXRvcklGcmFtZUluc3RhbmNlID0gbmljRWRpdG9ySW5zdGFuY2UuZXh0ZW5kKHsKCXNhdmVkU3R5bGVzIDogW10sCgkKCWluaXQgOiBmdW5jdGlvbigpIHsJCgkJdmFyIGMgPSB0aGlzLmVsbS5pbm5lckhUTUwucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKCQl0aGlzLmVsbS5pbm5lckhUTUwgPSAnJzsKCQkoIWMpID8gYyA9ICI8YnIgLz4iIDogYzsKCQl0aGlzLmluaXRpYWxDb250ZW50ID0gYzsKCQkKCQl0aGlzLmVsbUZyYW1lID0gbmV3IGJrRWxlbWVudCgnaWZyYW1lJykuc2V0QXR0cmlidXRlcyh7J3NyYycgOiAnamF2YXNjcmlwdDo7JywgJ2ZyYW1lQm9yZGVyJyA6IDAsICdhbGxvd1RyYW5zcGFyZW5jeScgOiAndHJ1ZScsICdzY3JvbGxpbmcnIDogJ25vJ30pLnNldFN0eWxlKHtoZWlnaHQ6ICcxMDBweCcsIHdpZHRoOiAnMTAwJSd9KS5hZGRDbGFzcygnZnJhbWUnKS5hcHBlbmRUbyh0aGlzLmVsbSk7CgoJCWlmKHRoaXMuY29weUVsbSkgeyB0aGlzLmVsbUZyYW1lLnNldFN0eWxlKHt3aWR0aCA6ICh0aGlzLmVsbS5vZmZzZXRXaWR0aC00KSsncHgnfSk7IH0KCQkKCQl2YXIgc3R5bGVMaXN0ID0gWydmb250LXNpemUnLCdmb250LWZhbWlseScsJ2ZvbnQtd2VpZ2h0JywnY29sb3InXTsKCQlmb3IoaXRtIGluIHN0eWxlTGlzdCkgewoJCQl0aGlzLnNhdmVkU3R5bGVzW2JrTGliLmNhbWVsaXplKGl0bSldID0gdGhpcy5lbG0uZ2V0U3R5bGUoaXRtKTsKCQl9CiAgICAgCQoJCXNldFRpbWVvdXQodGhpcy5pbml0RnJhbWUuY2xvc3VyZSh0aGlzKSw1MCk7Cgl9LAoJCglkaXNhYmxlIDogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbG0uaW5uZXJIVE1MID0gdGhpcy5nZXRDb250ZW50KCk7Cgl9LAoJCglpbml0RnJhbWUgOiBmdW5jdGlvbigpIHsKCQl2YXIgZmQgPSAkQksodGhpcy5lbG1GcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50KTsKCQlmZC5kZXNpZ25Nb2RlID0gIm9uIjsJCQoJCWZkLm9wZW4oKTsKCQl2YXIgY3NzID0gdGhpcy5uZS5vcHRpb25zLmV4dGVybmFsQ1NTOwoJCWZkLndyaXRlKCc8aHRtbD48aGVhZD4nKygoY3NzKSA/ICc8bGluayBocmVmPSInK2NzcysnIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiAvPicgOiAnJykrJzwvaGVhZD48Ym9keSBpZD0ibmljRWRpdENvbnRlbnQiIHN0eWxlPSJtYXJnaW46IDAgIWltcG9ydGFudDsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsiPicrdGhpcy5pbml0aWFsQ29udGVudCsnPC9ib2R5PjwvaHRtbD4nKTsKCQlmZC5jbG9zZSgpOwoJCXRoaXMuZnJhbWVEb2MgPSBmZDsKCgkJdGhpcy5mcmFtZVdpbiA9ICRCSyh0aGlzLmVsbUZyYW1lLmNvbnRlbnRXaW5kb3cpOwoJCXRoaXMuZnJhbWVDb250ZW50ID0gJEJLKHRoaXMuZnJhbWVXaW4uZG9jdW1lbnQuYm9keSkuc2V0U3R5bGUodGhpcy5zYXZlZFN0eWxlcyk7CgkJdGhpcy5pbnN0YW5jZURvYyA9IHRoaXMuZnJhbWVXaW4uZG9jdW1lbnQuZGVmYXVsdFZpZXc7CgkJCgkJdGhpcy5oZWlnaHRVcGRhdGUoKTsKCQl0aGlzLmZyYW1lRG9jLmFkZEV2ZW50KCdtb3VzZWRvd24nLCB0aGlzLnNlbGVjdGVkLmNsb3N1cmVMaXN0ZW5lcih0aGlzKSkuYWRkRXZlbnQoJ2tleXVwJyx0aGlzLmhlaWdodFVwZGF0ZS5jbG9zdXJlTGlzdGVuZXIodGhpcykpLmFkZEV2ZW50KCdrZXlkb3duJyx0aGlzLmtleURvd24uY2xvc3VyZUxpc3RlbmVyKHRoaXMpKS5hZGRFdmVudCgna2V5dXAnLHRoaXMuc2VsZWN0ZWQuY2xvc3VyZSh0aGlzKSk7CgkJdGhpcy5uZS5maXJlRXZlbnQoJ2FkZCcsdGhpcyk7Cgl9LAoJCglnZXRFbG0gOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5mcmFtZUNvbnRlbnQ7Cgl9LAoJCglzZXRDb250ZW50IDogZnVuY3Rpb24oYykgewoJCXRoaXMuY29udGVudCA9IGM7CgkJdGhpcy5uZS5maXJlRXZlbnQoJ3NldCcsdGhpcyk7CgkJdGhpcy5mcmFtZUNvbnRlbnQuaW5uZXJIVE1MID0gdGhpcy5jb250ZW50OwkKCQl0aGlzLmhlaWdodFVwZGF0ZSgpOwoJfSwKCQoJZ2V0U2VsIDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICh0aGlzLmZyYW1lV2luKSA/IHRoaXMuZnJhbWVXaW4uZ2V0U2VsZWN0aW9uKCkgOiB0aGlzLmZyYW1lRG9jLnNlbGVjdGlvbjsKCX0sCgkKCWhlaWdodFVwZGF0ZSA6IGZ1bmN0aW9uKCkgewkKCQl0aGlzLmVsbUZyYW1lLnN0eWxlLmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZnJhbWVDb250ZW50Lm9mZnNldEhlaWdodCx0aGlzLmluaXRpYWxIZWlnaHQpKydweCc7Cgl9LAogICAgCgluaWNDb21tYW5kIDogZnVuY3Rpb24oY21kLGFyZ3MpIHsKCQl0aGlzLmZyYW1lRG9jLmV4ZWNDb21tYW5kKGNtZCxmYWxzZSxhcmdzKTsKCQlzZXRUaW1lb3V0KHRoaXMuaGVpZ2h0VXBkYXRlLmNsb3N1cmUodGhpcyksMTAwKTsKCX0KCgkKfSk7CnZhciBuaWNFZGl0b3JQYW5lbCA9IGJrQ2xhc3MuZXh0ZW5kKHsKCWNvbnN0cnVjdCA6IGZ1bmN0aW9uKGUsb3B0aW9ucyxuaWNFZGl0b3IpIHsKCQl0aGlzLmVsbSA9IGU7CgkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCQl0aGlzLm5lID0gbmljRWRpdG9yOwoJCXRoaXMucGFuZWxCdXR0b25zID0gbmV3IEFycmF5KCk7CgkJdGhpcy5idXR0b25MaXN0ID0gYmtFeHRlbmQoW10sdGhpcy5uZS5vcHRpb25zLmJ1dHRvbkxpc3QpOwoJCQoJCXRoaXMucGFuZWxDb250YWluID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUoe292ZXJmbG93IDogJ2hpZGRlbicsIHdpZHRoIDogJzEwMCUnLCBib3JkZXIgOiAnMXB4IHNvbGlkICNjY2NjY2MnLCBiYWNrZ3JvdW5kQ29sb3IgOiAnI2VmZWZlZid9KS5hZGRDbGFzcygncGFuZWxDb250YWluJyk7CgkJdGhpcy5wYW5lbEVsbSA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHttYXJnaW4gOiAnMnB4JywgbWFyZ2luVG9wIDogJzBweCcsIHpvb20gOiAxLCBvdmVyZmxvdyA6ICdoaWRkZW4nfSkuYWRkQ2xhc3MoJ3BhbmVsJykuYXBwZW5kVG8odGhpcy5wYW5lbENvbnRhaW4pOwoJCXRoaXMucGFuZWxDb250YWluLmFwcGVuZFRvKGUpOwoKCQl2YXIgb3B0ID0gdGhpcy5uZS5vcHRpb25zOwoJCXZhciBidXR0b25zID0gb3B0LmJ1dHRvbnM7CgkJZm9yKGJ1dHRvbiBpbiBidXR0b25zKSB7CgkJCQl0aGlzLmFkZEJ1dHRvbihidXR0b24sb3B0LHRydWUpOwoJCX0KCQl0aGlzLnJlb3JkZXIoKTsKCQllLm5vU2VsZWN0KCk7Cgl9LAoJCglhZGRCdXR0b24gOiBmdW5jdGlvbihidXR0b25OYW1lLG9wdGlvbnMsbm9PcmRlcikgewoJCXZhciBidXR0b24gPSBvcHRpb25zLmJ1dHRvbnNbYnV0dG9uTmFtZV07CgkJdmFyIHR5cGUgPSAoYnV0dG9uWyd0eXBlJ10pID8gZXZhbCgnKHR5cGVvZignK2J1dHRvblsndHlwZSddKycpID09ICJ1bmRlZmluZWQiKSA/IG51bGwgOiAnK2J1dHRvblsndHlwZSddKyc7JykgOiBuaWNFZGl0b3JCdXR0b247CgkJdmFyIGhhc0J1dHRvbiA9IGJrTGliLmluQXJyYXkodGhpcy5idXR0b25MaXN0LGJ1dHRvbk5hbWUpOwoJCWlmKHR5cGUgJiYgKGhhc0J1dHRvbiB8fCB0aGlzLm5lLm9wdGlvbnMuZnVsbFBhbmVsKSkgewoJCQl0aGlzLnBhbmVsQnV0dG9ucy5wdXNoKG5ldyB0eXBlKHRoaXMucGFuZWxFbG0sYnV0dG9uTmFtZSxvcHRpb25zLHRoaXMubmUpKTsKCQkJaWYoIWhhc0J1dHRvbikgewkKCQkJCXRoaXMuYnV0dG9uTGlzdC5wdXNoKGJ1dHRvbk5hbWUpOwoJCQl9CgkJfQoJfSwKCQoJZmluZEJ1dHRvbiA6IGZ1bmN0aW9uKGl0bSkgewoJCWZvcih2YXIgaT0wO2k8dGhpcy5wYW5lbEJ1dHRvbnMubGVuZ3RoO2krKykgewoJCQlpZih0aGlzLnBhbmVsQnV0dG9uc1tpXS5uYW1lID09IGl0bSkKCQkJCXJldHVybiB0aGlzLnBhbmVsQnV0dG9uc1tpXTsKCQl9CQoJfSwKCQoJcmVvcmRlciA6IGZ1bmN0aW9uKCkgewoJCXZhciBibCA9IHRoaXMuYnV0dG9uTGlzdDsKCQlmb3IodmFyIGk9MDtpPGJsLmxlbmd0aDtpKyspIHsKCQkJdmFyIGJ1dHRvbiA9IHRoaXMuZmluZEJ1dHRvbihibFtpXSk7CgkJCWlmKGJ1dHRvbikgewoJCQkJdGhpcy5wYW5lbEVsbS5hcHBlbmRDaGlsZChidXR0b24ubWFyZ2luKTsKCQkJfQoJCX0JCgl9LAoJCglyZW1vdmUgOiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsbS5yZW1vdmUoKTsKCX0KfSk7CnZhciBuaWNFZGl0b3JCdXR0b24gPSBia0NsYXNzLmV4dGVuZCh7CgkKCWNvbnN0cnVjdCA6IGZ1bmN0aW9uKGUsYnV0dG9uTmFtZSxvcHRpb25zLG5pY0VkaXRvcikgewoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnMuYnV0dG9uc1tidXR0b25OYW1lXTsKCQl0aGlzLm5hbWUgPSBidXR0b25OYW1lOwoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJdGhpcy5lbG0gPSBlOwoKCQl0aGlzLm1hcmdpbiA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHsnZmxvYXQnIDogJ2xlZnQnLCBtYXJnaW5Ub3AgOiAnMnB4J30pLmFwcGVuZFRvKGUpOwoJCXRoaXMuY29udGFpbiA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHt3aWR0aCA6ICcyMHB4JywgaGVpZ2h0IDogJzIwcHgnfSkuYWRkQ2xhc3MoJ2J1dHRvbkNvbnRhaW4nKS5hcHBlbmRUbyh0aGlzLm1hcmdpbik7CgkJdGhpcy5ib3JkZXIgPSBuZXcgYmtFbGVtZW50KCdESVYnKS5zZXRTdHlsZSh7YmFja2dyb3VuZENvbG9yIDogJyNlZmVmZWYnLCBib3JkZXIgOiAnMXB4IHNvbGlkICNlZmVmZWYnfSkuYXBwZW5kVG8odGhpcy5jb250YWluKTsKCQl0aGlzLmJ1dHRvbiA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHt3aWR0aCA6ICcxOHB4JywgaGVpZ2h0IDogJzE4cHgnLCBvdmVyZmxvdyA6ICdoaWRkZW4nLCB6b29tIDogMSwgY3Vyc29yIDogJ3BvaW50ZXInfSkuYWRkQ2xhc3MoJ2J1dHRvbicpLnNldFN0eWxlKHRoaXMubmUuZ2V0SWNvbihidXR0b25OYW1lLG9wdGlvbnMpKS5hcHBlbmRUbyh0aGlzLmJvcmRlcik7CgkJdGhpcy5idXR0b24uYWRkRXZlbnQoJ21vdXNlb3ZlcicsIHRoaXMuaG92ZXJPbi5jbG9zdXJlKHRoaXMpKS5hZGRFdmVudCgnbW91c2VvdXQnLHRoaXMuaG92ZXJPZmYuY2xvc3VyZSh0aGlzKSkuYWRkRXZlbnQoJ21vdXNlZG93bicsdGhpcy5tb3VzZUNsaWNrLmNsb3N1cmUodGhpcykpLm5vU2VsZWN0KCk7CgkJCgkJaWYoIXdpbmRvdy5vcGVyYSkgewoJCQl0aGlzLmJ1dHRvbi5vbm1vdXNlZG93biA9IHRoaXMuYnV0dG9uLm9uY2xpY2sgPSBia0xpYi5jYW5jZWxFdmVudDsKCQl9CgkJCgkJbmljRWRpdG9yLmFkZEV2ZW50KCdzZWxlY3RlZCcsIHRoaXMuZW5hYmxlLmNsb3N1cmUodGhpcykpLmFkZEV2ZW50KCdibHVyJywgdGhpcy5kaXNhYmxlLmNsb3N1cmUodGhpcykpLmFkZEV2ZW50KCdrZXknLHRoaXMua2V5LmNsb3N1cmUodGhpcykpOwoJCQoJCXRoaXMuZGlzYWJsZSgpOwoJCXRoaXMuaW5pdCgpOwoJfSwKCQoJaW5pdCA6IGZ1bmN0aW9uKCkgeyAgfSwKCQoJaGlkZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29udGFpbi5zZXRTdHlsZSh7ZGlzcGxheSA6ICdub25lJ30pOwoJfSwKCQoJdXBkYXRlU3RhdGUgOiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLmlzRGlzYWJsZWQpIHsgdGhpcy5zZXRCZygpOyB9CgkJZWxzZSBpZih0aGlzLmlzSG92ZXIpIHsgdGhpcy5zZXRCZygnaG92ZXInKTsgfQoJCWVsc2UgaWYodGhpcy5pc0FjdGl2ZSkgeyB0aGlzLnNldEJnKCdhY3RpdmUnKTsgfQoJCWVsc2UgeyB0aGlzLnNldEJnKCk7IH0KCX0sCgkKCXNldEJnIDogZnVuY3Rpb24oc3RhdGUpIHsKCQlzd2l0Y2goc3RhdGUpIHsKCQkJY2FzZSAnaG92ZXInOgoJCQkJdmFyIHN0YXRlU3R5bGUgPSB7Ym9yZGVyIDogJzFweCBzb2xpZCAjNjY2JywgYmFja2dyb3VuZENvbG9yIDogJyNkZGQnfTsKCQkJCWJyZWFrOwoJCQljYXNlICdhY3RpdmUnOgoJCQkJdmFyIHN0YXRlU3R5bGUgPSB7Ym9yZGVyIDogJzFweCBzb2xpZCAjNjY2JywgYmFja2dyb3VuZENvbG9yIDogJyNjY2MnfTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJdmFyIHN0YXRlU3R5bGUgPSB7Ym9yZGVyIDogJzFweCBzb2xpZCAjZWZlZmVmJywgYmFja2dyb3VuZENvbG9yIDogJyNlZmVmZWYnfTsJCgkJfQoJCXRoaXMuYm9yZGVyLnNldFN0eWxlKHN0YXRlU3R5bGUpLmFkZENsYXNzKCdidXR0b24tJytzdGF0ZSk7Cgl9LAoJCgljaGVja05vZGVzIDogZnVuY3Rpb24oZSkgewoJCXZhciBlbG0gPSBlOwkKCQlkbyB7CgkJCWlmKHRoaXMub3B0aW9ucy50YWdzICYmIGJrTGliLmluQXJyYXkodGhpcy5vcHRpb25zLnRhZ3MsZWxtLm5vZGVOYW1lKSkgewoJCQkJdGhpcy5hY3RpdmF0ZSgpOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9IHdoaWxlKGVsbSA9IGVsbS5wYXJlbnROb2RlICYmIGVsbS5jbGFzc05hbWUgIT0gIm5pY0VkaXQiKTsKCQllbG0gPSAkQksoZSk7CgkJd2hpbGUoZWxtLm5vZGVUeXBlID09IDMpIHsKCQkJZWxtID0gJEJLKGVsbS5wYXJlbnROb2RlKTsKCQl9CgkJaWYodGhpcy5vcHRpb25zLmNzcykgewoJCQlmb3IoaXRtIGluIHRoaXMub3B0aW9ucy5jc3MpIHsKCQkJCWlmKGVsbS5nZXRTdHlsZShpdG0sdGhpcy5uZS5zZWxlY3RlZEluc3RhbmNlLmluc3RhbmNlRG9jKSA9PSB0aGlzLm9wdGlvbnMuY3NzW2l0bV0pIHsKCQkJCQl0aGlzLmFjdGl2YXRlKCk7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9CgkJdGhpcy5kZWFjdGl2YXRlKCk7CgkJcmV0dXJuIGZhbHNlOwoJfSwKCQoJYWN0aXZhdGUgOiBmdW5jdGlvbigpIHsKCQlpZighdGhpcy5pc0Rpc2FibGVkKSB7CgkJCXRoaXMuaXNBY3RpdmUgPSB0cnVlOwoJCQl0aGlzLnVwZGF0ZVN0YXRlKCk7CQoJCQl0aGlzLm5lLmZpcmVFdmVudCgnYnV0dG9uQWN0aXZhdGUnLHRoaXMpOwoJCX0KCX0sCgkKCWRlYWN0aXZhdGUgOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlzQWN0aXZlID0gZmFsc2U7CgkJdGhpcy51cGRhdGVTdGF0ZSgpOwkKCQlpZighdGhpcy5pc0Rpc2FibGVkKSB7CgkJCXRoaXMubmUuZmlyZUV2ZW50KCdidXR0b25EZWFjdGl2YXRlJyx0aGlzKTsKCQl9Cgl9LAoJCgllbmFibGUgOiBmdW5jdGlvbihpbnMsdCkgewoJCXRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlOwoJCXRoaXMuY29udGFpbi5zZXRTdHlsZSh7J29wYWNpdHknIDogMX0pLmFkZENsYXNzKCdidXR0b25FbmFibGVkJyk7CgkJdGhpcy51cGRhdGVTdGF0ZSgpOwoJCXRoaXMuY2hlY2tOb2Rlcyh0KTsKCX0sCgkKCWRpc2FibGUgOiBmdW5jdGlvbihpbnMsdCkgewkJCgkJdGhpcy5pc0Rpc2FibGVkID0gdHJ1ZTsKCQl0aGlzLmNvbnRhaW4uc2V0U3R5bGUoeydvcGFjaXR5JyA6IDAuNn0pLnJlbW92ZUNsYXNzKCdidXR0b25FbmFibGVkJyk7CgkJdGhpcy51cGRhdGVTdGF0ZSgpOwkKCX0sCgkKCXRvZ2dsZUFjdGl2ZSA6IGZ1bmN0aW9uKCkgewoJCSh0aGlzLmlzQWN0aXZlKSA/IHRoaXMuZGVhY3RpdmF0ZSgpIDogdGhpcy5hY3RpdmF0ZSgpOwkKCX0sCgkKCWhvdmVyT24gOiBmdW5jdGlvbigpIHsKCQlpZighdGhpcy5pc0Rpc2FibGVkKSB7CgkJCXRoaXMuaXNIb3ZlciA9IHRydWU7CgkJCXRoaXMudXBkYXRlU3RhdGUoKTsKCQkJdGhpcy5uZS5maXJlRXZlbnQoImJ1dHRvbk92ZXIiLHRoaXMpOwoJCX0KCX0sIAoJCglob3Zlck9mZiA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNIb3ZlciA9IGZhbHNlOwoJCXRoaXMudXBkYXRlU3RhdGUoKTsKCQl0aGlzLm5lLmZpcmVFdmVudCgiYnV0dG9uT3V0Iix0aGlzKTsKCX0sCgkKCW1vdXNlQ2xpY2sgOiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLm9wdGlvbnMuY29tbWFuZCkgewoJCQl0aGlzLm5lLm5pY0NvbW1hbmQodGhpcy5vcHRpb25zLmNvbW1hbmQsdGhpcy5vcHRpb25zLmNvbW1hbmRBcmdzKTsKCQkJaWYoIXRoaXMub3B0aW9ucy5ub0FjdGl2ZSkgewoJCQkJdGhpcy50b2dnbGVBY3RpdmUoKTsKCQkJfQoJCX0KCQl0aGlzLm5lLmZpcmVFdmVudCgiYnV0dG9uQ2xpY2siLHRoaXMpOwoJfSwKCQoJa2V5IDogZnVuY3Rpb24obmljSW5zdGFuY2UsZSkgewoJCWlmKHRoaXMub3B0aW9ucy5rZXkgJiYgZS5jdHJsS2V5ICYmIFN0cmluZy5mcm9tQ2hhckNvZGUoZS5rZXlDb2RlIHx8IGUuY2hhckNvZGUpLnRvTG93ZXJDYXNlKCkgPT0gdGhpcy5vcHRpb25zLmtleSkgewoJCQl0aGlzLm1vdXNlQ2xpY2soKTsKCQkJaWYoZS5wcmV2ZW50RGVmYXVsdCkgZS5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCX0KCQp9KTsKCiAKdmFyIG5pY1BsdWdpbiA9IGJrQ2xhc3MuZXh0ZW5kKHsKCQoJY29uc3RydWN0IDogZnVuY3Rpb24obmljRWRpdG9yLG9wdGlvbnMpIHsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJdGhpcy5uZS5hZGRFdmVudCgncGFuZWwnLHRoaXMubG9hZFBhbmVsLmNsb3N1cmUodGhpcykpOwoJCQoJCXRoaXMuaW5pdCgpOwoJfSwKCglsb2FkUGFuZWwgOiBmdW5jdGlvbihucCkgewoJCXZhciBidXR0b25zID0gdGhpcy5vcHRpb25zLmJ1dHRvbnM7CgkJZm9yKHZhciBidXR0b24gaW4gYnV0dG9ucykgewoJCQlucC5hZGRCdXR0b24oYnV0dG9uLHRoaXMub3B0aW9ucyk7CgkJfQoJCW5wLnJlb3JkZXIoKTsKCX0sCgoJaW5pdCA6IGZ1bmN0aW9uKCkgeyAgfQp9KTsKCgoKIAogLyogU1RBUlQgQ09ORklHICovCnZhciBuaWNQYW5lT3B0aW9ucyA9IHsgfTsKLyogRU5EIENPTkZJRyAqLwoKdmFyIG5pY0VkaXRvclBhbmUgPSBia0NsYXNzLmV4dGVuZCh7Cgljb25zdHJ1Y3QgOiBmdW5jdGlvbihlbG0sbmljRWRpdG9yLG9wdGlvbnMsb3BlbkJ1dHRvbikgewoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJdGhpcy5lbG0gPSBlbG07CgkJdGhpcy5wb3MgPSBlbG0ucG9zKCk7CgkJCgkJdGhpcy5jb250YWluID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe3pJbmRleCA6ICc5OTk5OScsIG92ZXJmbG93IDogJ2hpZGRlbicsIHBvc2l0aW9uIDogJ2Fic29sdXRlJywgbGVmdCA6IHRoaXMucG9zWzBdKydweCcsIHRvcCA6IHRoaXMucG9zWzFdKydweCd9KQoJCXRoaXMucGFuZSA9IG5ldyBia0VsZW1lbnQoJ2RpdicpLnNldFN0eWxlKHtmb250U2l6ZSA6ICcxMnB4JywgYm9yZGVyIDogJzFweCBzb2xpZCAjY2NjJywgJ292ZXJmbG93JzogJ2hpZGRlbicsIHBhZGRpbmcgOiAnNHB4JywgdGV4dEFsaWduOiAnbGVmdCcsIGJhY2tncm91bmRDb2xvciA6ICcjZmZmZmM5J30pLmFkZENsYXNzKCdwYW5lJykuc2V0U3R5bGUob3B0aW9ucykuYXBwZW5kVG8odGhpcy5jb250YWluKTsKCQkKCQlpZihvcGVuQnV0dG9uICYmICFvcGVuQnV0dG9uLm9wdGlvbnMubm9DbG9zZSkgewoJCQl0aGlzLmNsb3NlID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoeydmbG9hdCcgOiAncmlnaHQnLCBoZWlnaHQ6ICcxNnB4Jywgd2lkdGggOiAnMTZweCcsIGN1cnNvciA6ICdwb2ludGVyJ30pLnNldFN0eWxlKHRoaXMubmUuZ2V0SWNvbignY2xvc2UnLG5pY1BhbmVPcHRpb25zKSkuYWRkRXZlbnQoJ21vdXNlZG93bicsb3BlbkJ1dHRvbi5yZW1vdmVQYW5lLmNsb3N1cmUodGhpcykpLmFwcGVuZFRvKHRoaXMucGFuZSk7CgkJfQoJCQoJCXRoaXMuY29udGFpbi5ub1NlbGVjdCgpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwoJCQoJCXRoaXMucG9zaXRpb24oKTsKCQl0aGlzLmluaXQoKTsJCgl9LAoJCglpbml0IDogZnVuY3Rpb24oKSB7IH0sCgkKCXBvc2l0aW9uIDogZnVuY3Rpb24oKSB7CgkJaWYodGhpcy5uZS5uaWNQYW5lbCkgewoJCQl2YXIgcGFuZWxFbG0gPSB0aGlzLm5lLm5pY1BhbmVsLmVsbTsJCgkJCXZhciBwYW5lbFBvcyA9IHBhbmVsRWxtLnBvcygpOwoJCQl2YXIgbmV3TGVmdCA9IHBhbmVsUG9zWzBdK3BhcnNlSW50KHBhbmVsRWxtLmdldFN0eWxlKCd3aWR0aCcpKS0ocGFyc2VJbnQodGhpcy5wYW5lLmdldFN0eWxlKCd3aWR0aCcpKSs4KTsKCQkJaWYobmV3TGVmdCA8IHRoaXMucG9zWzBdKSB7CgkJCQl0aGlzLmNvbnRhaW4uc2V0U3R5bGUoe2xlZnQgOiBuZXdMZWZ0KydweCd9KTsKCQkJfQoJCX0KCX0sCgkKCXRvZ2dsZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNWaXNpYmxlID0gIXRoaXMuaXNWaXNpYmxlOwoJCXRoaXMuY29udGFpbi5zZXRTdHlsZSh7ZGlzcGxheSA6ICgodGhpcy5pc1Zpc2libGUpID8gJ2Jsb2NrJyA6ICdub25lJyl9KTsKCX0sCgkKCXJlbW92ZSA6IGZ1bmN0aW9uKCkgewoJCWlmKHRoaXMuY29udGFpbikgewoJCQl0aGlzLmNvbnRhaW4ucmVtb3ZlKCk7CgkJCXRoaXMuY29udGFpbiA9IG51bGw7CgkJfQoJfSwKCQoJYXBwZW5kIDogZnVuY3Rpb24oYykgewoJCWMuYXBwZW5kVG8odGhpcy5wYW5lKTsKCX0sCgkKCXNldENvbnRlbnQgOiBmdW5jdGlvbihjKSB7CgkJdGhpcy5wYW5lLnNldENvbnRlbnQoYyk7Cgl9CgkKfSk7CgoKIAp2YXIgbmljRWRpdG9yQWR2YW5jZWRCdXR0b24gPSBuaWNFZGl0b3JCdXR0b24uZXh0ZW5kKHsKCQoJaW5pdCA6IGZ1bmN0aW9uKCkgewoJCXRoaXMubmUuYWRkRXZlbnQoJ3NlbGVjdGVkJyx0aGlzLnJlbW92ZVBhbmUuY2xvc3VyZSh0aGlzKSkuYWRkRXZlbnQoJ2JsdXInLHRoaXMucmVtb3ZlUGFuZS5jbG9zdXJlKHRoaXMpKTsJCgl9LAoJCgltb3VzZUNsaWNrIDogZnVuY3Rpb24oKSB7CgkJaWYoIXRoaXMuaXNEaXNhYmxlZCkgewoJCQlpZih0aGlzLnBhbmUgJiYgdGhpcy5wYW5lLnBhbmUpIHsKCQkJCXRoaXMucmVtb3ZlUGFuZSgpOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5wYW5lID0gbmV3IG5pY0VkaXRvclBhbmUodGhpcy5jb250YWluLHRoaXMubmUse3dpZHRoIDogKHRoaXMud2lkdGggfHwgJzI3MHB4JyksIGJhY2tncm91bmRDb2xvciA6ICcjZmZmJ30sdGhpcyk7CgkJCQl0aGlzLmFkZFBhbmUoKTsKCQkJCXRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZS5zYXZlUm5nKCk7CgkJCX0KCQl9Cgl9LAoJCglhZGRGb3JtIDogZnVuY3Rpb24oZixlbG0pIHsKCQl0aGlzLmZvcm0gPSBuZXcgYmtFbGVtZW50KCdmb3JtJykuYWRkRXZlbnQoJ3N1Ym1pdCcsdGhpcy5zdWJtaXQuY2xvc3VyZUxpc3RlbmVyKHRoaXMpKTsKCQl0aGlzLnBhbmUuYXBwZW5kKHRoaXMuZm9ybSk7CgkJdGhpcy5pbnB1dHMgPSB7fTsKCQkKCQlmb3IoaXRtIGluIGYpIHsKCQkJdmFyIGZpZWxkID0gZltpdG1dOwoJCQl2YXIgdmFsID0gJyc7CgkJCWlmKGVsbSkgewoJCQkJdmFsID0gZWxtLmdldEF0dHJpYnV0ZShpdG0pOwoJCQl9CgkJCWlmKCF2YWwpIHsKCQkJCXZhbCA9IGZpZWxkWyd2YWx1ZSddIHx8ICcnOwoJCQl9CgkJCXZhciB0eXBlID0gZltpdG1dLnR5cGU7CgkJCQoJCQlpZih0eXBlID09ICd0aXRsZScpIHsKCQkJCQluZXcgYmtFbGVtZW50KCdkaXYnKS5zZXRDb250ZW50KGZpZWxkLnR4dCkuc2V0U3R5bGUoe2ZvbnRTaXplIDogJzE0cHgnLCBmb250V2VpZ2h0OiAnYm9sZCcsIHBhZGRpbmcgOiAnMHB4JywgbWFyZ2luIDogJzJweCAwJ30pLmFwcGVuZFRvKHRoaXMuZm9ybSk7CgkJCX0gZWxzZSB7CgkJCQl2YXIgY29udGFpbiA9IG5ldyBia0VsZW1lbnQoJ2RpdicpLnNldFN0eWxlKHtvdmVyZmxvdyA6ICdoaWRkZW4nLCBjbGVhciA6ICdib3RoJ30pLmFwcGVuZFRvKHRoaXMuZm9ybSk7CgkJCQlpZihmaWVsZC50eHQpIHsKCQkJCQluZXcgYmtFbGVtZW50KCdsYWJlbCcpLnNldEF0dHJpYnV0ZXMoeydmb3InIDogaXRtfSkuc2V0Q29udGVudChmaWVsZC50eHQpLnNldFN0eWxlKHttYXJnaW4gOiAnMnB4IDRweCcsIGZvbnRTaXplIDogJzEzcHgnLCB3aWR0aDogJzUwcHgnLCBsaW5lSGVpZ2h0IDogJzIwcHgnLCB0ZXh0QWxpZ24gOiAncmlnaHQnLCAnZmxvYXQnIDogJ2xlZnQnfSkuYXBwZW5kVG8oY29udGFpbik7CgkJCQl9CgkJCQkKCQkJCXN3aXRjaCh0eXBlKSB7CgkJCQkJY2FzZSAndGV4dCc6CgkJCQkJCXRoaXMuaW5wdXRzW2l0bV0gPSBuZXcgYmtFbGVtZW50KCdpbnB1dCcpLnNldEF0dHJpYnV0ZXMoe2lkIDogaXRtLCAndmFsdWUnIDogdmFsLCAndHlwZScgOiAndGV4dCd9KS5zZXRTdHlsZSh7bWFyZ2luIDogJzJweCAwJywgZm9udFNpemUgOiAnMTNweCcsICdmbG9hdCcgOiAnbGVmdCcsIGhlaWdodCA6ICcyMHB4JywgYm9yZGVyIDogJzFweCBzb2xpZCAjY2NjJywgb3ZlcmZsb3cgOiAnaGlkZGVuJ30pLnNldFN0eWxlKGZpZWxkLnN0eWxlKS5hcHBlbmRUbyhjb250YWluKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnc2VsZWN0JzoKCQkJCQkJdGhpcy5pbnB1dHNbaXRtXSA9IG5ldyBia0VsZW1lbnQoJ3NlbGVjdCcpLnNldEF0dHJpYnV0ZXMoe2lkIDogaXRtfSkuc2V0U3R5bGUoe2JvcmRlciA6ICcxcHggc29saWQgI2NjYycsICdmbG9hdCcgOiAnbGVmdCcsIG1hcmdpbiA6ICcycHggMCd9KS5hcHBlbmRUbyhjb250YWluKTsKCQkJCQkJZm9yKG9wdCBpbiBmaWVsZC5vcHRpb25zKSB7CgkJCQkJCQl2YXIgbyA9IG5ldyBia0VsZW1lbnQoJ29wdGlvbicpLnNldEF0dHJpYnV0ZXMoe3ZhbHVlIDogb3B0LCBzZWxlY3RlZCA6IChvcHQgPT0gdmFsKSA/ICdzZWxlY3RlZCcgOiAnJ30pLnNldENvbnRlbnQoZmllbGQub3B0aW9uc1tvcHRdKS5hcHBlbmRUbyh0aGlzLmlucHV0c1tpdG1dKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlICdjb250ZW50JzoKCQkJCQkJdGhpcy5pbnB1dHNbaXRtXSA9IG5ldyBia0VsZW1lbnQoJ3RleHRhcmVhJykuc2V0QXR0cmlidXRlcyh7aWQgOiBpdG19KS5zZXRTdHlsZSh7Ym9yZGVyIDogJzFweCBzb2xpZCAjY2NjJywgJ2Zsb2F0JyA6ICdsZWZ0J30pLnNldFN0eWxlKGZpZWxkLnN0eWxlKS5hcHBlbmRUbyhjb250YWluKTsKCQkJCQkJdGhpcy5pbnB1dHNbaXRtXS52YWx1ZSA9IHZhbDsKCQkJCX0JCgkJCX0KCQl9CgkJbmV3IGJrRWxlbWVudCgnaW5wdXQnKS5zZXRBdHRyaWJ1dGVzKHsndHlwZScgOiAnc3VibWl0J30pLnNldFN0eWxlKHtiYWNrZ3JvdW5kQ29sb3IgOiAnI2VmZWZlZicsYm9yZGVyIDogJzFweCBzb2xpZCAjY2NjJywgbWFyZ2luIDogJzNweCAwJywgJ2Zsb2F0JyA6ICdsZWZ0JywgJ2NsZWFyJyA6ICdib3RoJ30pLmFwcGVuZFRvKHRoaXMuZm9ybSk7CgkJdGhpcy5mb3JtLm9uc3VibWl0ID0gYmtMaWIuY2FuY2VsRXZlbnQ7CQoJfSwKCQoJc3VibWl0IDogZnVuY3Rpb24oKSB7IH0sCgkKCWZpbmRFbG0gOiBmdW5jdGlvbih0YWcsYXR0cix2YWwpIHsKCQl2YXIgbGlzdCA9IHRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZS5nZXRFbG0oKS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWcpOwoJCWZvcih2YXIgaT0wO2k8bGlzdC5sZW5ndGg7aSsrKSB7CgkJCWlmKGxpc3RbaV0uZ2V0QXR0cmlidXRlKGF0dHIpID09IHZhbCkgewoJCQkJcmV0dXJuICRCSyhsaXN0W2ldKTsKCQkJfQoJCX0KCX0sCgkKCXJlbW92ZVBhbmUgOiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLnBhbmUpIHsKCQkJdGhpcy5wYW5lLnJlbW92ZSgpOwoJCQl0aGlzLnBhbmUgPSBudWxsOwoJCQl0aGlzLm5lLnNlbGVjdGVkSW5zdGFuY2UucmVzdG9yZVJuZygpOwoJCX0JCgl9CQp9KTsKCgp2YXIgbmljQnV0dG9uVGlwcyA9IGJrQ2xhc3MuZXh0ZW5kKHsKCWNvbnN0cnVjdCA6IGZ1bmN0aW9uKG5pY0VkaXRvcikgewoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJbmljRWRpdG9yLmFkZEV2ZW50KCdidXR0b25PdmVyJyx0aGlzLnNob3cuY2xvc3VyZSh0aGlzKSkuYWRkRXZlbnQoJ2J1dHRvbk91dCcsdGhpcy5oaWRlLmNsb3N1cmUodGhpcykpOwoKCX0sCgkKCXNob3cgOiBmdW5jdGlvbihidXR0b24pIHsKCQl0aGlzLnRpbWVyID0gc2V0VGltZW91dCh0aGlzLmNyZWF0ZS5jbG9zdXJlKHRoaXMsYnV0dG9uKSw0MDApOwoJfSwKCQoJY3JlYXRlIDogZnVuY3Rpb24oYnV0dG9uKSB7CgkJdGhpcy50aW1lciA9IG51bGw7CgkJaWYoIXRoaXMucGFuZSkgewoJCQl0aGlzLnBhbmUgPSBuZXcgbmljRWRpdG9yUGFuZShidXR0b24uYnV0dG9uLHRoaXMubmUse2ZvbnRTaXplIDogJzEycHgnLCBtYXJnaW5Ub3AgOiAnNXB4J30pOwoJCQl0aGlzLnBhbmUuc2V0Q29udGVudChidXR0b24ub3B0aW9ucy5uYW1lKTsKCQl9CQkKCX0sCgkKCWhpZGUgOiBmdW5jdGlvbihidXR0b24pIHsKCQlpZih0aGlzLnRpbWVyKSB7CgkJCWNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsKCQl9CgkJaWYodGhpcy5wYW5lKSB7CgkJCXRoaXMucGFuZSA9IHRoaXMucGFuZS5yZW1vdmUoKTsKCQl9Cgl9Cn0pOwpuaWNFZGl0b3JzLnJlZ2lzdGVyUGx1Z2luKG5pY0J1dHRvblRpcHMpOwoKCiAKIC8qIFNUQVJUIENPTkZJRyAqLwp2YXIgbmljU2VsZWN0T3B0aW9ucyA9IHsKCWJ1dHRvbnMgOiB7CgkJJ2ZvbnRTaXplJyA6IHtuYW1lIDogX18oJ1NlbGVjdCBGb250IFNpemUnKSwgdHlwZSA6ICduaWNFZGl0b3JGb250U2l6ZVNlbGVjdCcsIGNvbW1hbmQgOiAnZm9udHNpemUnfSwKCQknZm9udEZhbWlseScgOiB7bmFtZSA6IF9fKCdTZWxlY3QgRm9udCBGYW1pbHknKSwgdHlwZSA6ICduaWNFZGl0b3JGb250RmFtaWx5U2VsZWN0JywgY29tbWFuZCA6ICdmb250bmFtZSd9LAoJCSdmb250Rm9ybWF0JyA6IHtuYW1lIDogX18oJ1NlbGVjdCBGb250IEZvcm1hdCcpLCB0eXBlIDogJ25pY0VkaXRvckZvbnRGb3JtYXRTZWxlY3QnLCBjb21tYW5kIDogJ2Zvcm1hdEJsb2NrJ30KCX0KfTsKLyogRU5EIENPTkZJRyAqLwp2YXIgbmljRWRpdG9yU2VsZWN0ID0gYmtDbGFzcy5leHRlbmQoewoJCgljb25zdHJ1Y3QgOiBmdW5jdGlvbihlLGJ1dHRvbk5hbWUsb3B0aW9ucyxuaWNFZGl0b3IpIHsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zLmJ1dHRvbnNbYnV0dG9uTmFtZV07CgkJdGhpcy5lbG0gPSBlOwoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJdGhpcy5uYW1lID0gYnV0dG9uTmFtZTsKCQl0aGlzLnNlbE9wdGlvbnMgPSBuZXcgQXJyYXkoKTsKCQkKCQl0aGlzLm1hcmdpbiA9IG5ldyBia0VsZW1lbnQoJ2RpdicpLnNldFN0eWxlKHsnZmxvYXQnIDogJ2xlZnQnLCBtYXJnaW4gOiAnMnB4IDFweCAwIDFweCd9KS5hcHBlbmRUbyh0aGlzLmVsbSk7CgkJdGhpcy5jb250YWluID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe3dpZHRoOiAnOTBweCcsIGhlaWdodCA6ICcyMHB4JywgY3Vyc29yIDogJ3BvaW50ZXInLCBvdmVyZmxvdzogJ2hpZGRlbid9KS5hZGRDbGFzcygnc2VsZWN0Q29udGFpbicpLmFkZEV2ZW50KCdjbGljaycsdGhpcy50b2dnbGUuY2xvc3VyZSh0aGlzKSkuYXBwZW5kVG8odGhpcy5tYXJnaW4pOwoJCXRoaXMuaXRlbXMgPSBuZXcgYmtFbGVtZW50KCdkaXYnKS5zZXRTdHlsZSh7b3ZlcmZsb3cgOiAnaGlkZGVuJywgem9vbSA6IDEsIGJvcmRlcjogJzFweCBzb2xpZCAjY2NjJywgcGFkZGluZ0xlZnQgOiAnM3B4JywgYmFja2dyb3VuZENvbG9yIDogJyNmZmYnfSkuYXBwZW5kVG8odGhpcy5jb250YWluKTsKCQl0aGlzLmNvbnRyb2wgPSBuZXcgYmtFbGVtZW50KCdkaXYnKS5zZXRTdHlsZSh7b3ZlcmZsb3cgOiAnaGlkZGVuJywgJ2Zsb2F0JyA6ICdyaWdodCcsIGhlaWdodDogJzE4cHgnLCB3aWR0aCA6ICcxNnB4J30pLmFkZENsYXNzKCdzZWxlY3RDb250cm9sJykuc2V0U3R5bGUodGhpcy5uZS5nZXRJY29uKCdhcnJvdycsb3B0aW9ucykpLmFwcGVuZFRvKHRoaXMuaXRlbXMpOwoJCXRoaXMudHh0ID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe292ZXJmbG93IDogJ2hpZGRlbicsICdmbG9hdCcgOiAnbGVmdCcsIHdpZHRoIDogJzY2cHgnLCBoZWlnaHQgOiAnMTRweCcsIG1hcmdpblRvcCA6ICcxcHgnLCBmb250RmFtaWx5IDogJ3NhbnMtc2VyaWYnLCB0ZXh0QWxpZ24gOiAnY2VudGVyJywgZm9udFNpemUgOiAnMTJweCd9KS5hZGRDbGFzcygnc2VsZWN0VHh0JykuYXBwZW5kVG8odGhpcy5pdGVtcyk7CgkJCgkJaWYoIXdpbmRvdy5vcGVyYSkgewoJCQl0aGlzLmNvbnRhaW4ub25tb3VzZWRvd24gPSB0aGlzLmNvbnRyb2wub25tb3VzZWRvd24gPSB0aGlzLnR4dC5vbm1vdXNlZG93biA9IGJrTGliLmNhbmNlbEV2ZW50OwoJCX0KCQkKCQl0aGlzLm1hcmdpbi5ub1NlbGVjdCgpOwoJCQoJCXRoaXMubmUuYWRkRXZlbnQoJ3NlbGVjdGVkJywgdGhpcy5lbmFibGUuY2xvc3VyZSh0aGlzKSkuYWRkRXZlbnQoJ2JsdXInLCB0aGlzLmRpc2FibGUuY2xvc3VyZSh0aGlzKSk7CgkJCgkJdGhpcy5kaXNhYmxlKCk7CgkJdGhpcy5pbml0KCk7Cgl9LAoJCglkaXNhYmxlIDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc0Rpc2FibGVkID0gdHJ1ZTsKCQl0aGlzLmNsb3NlKCk7CgkJdGhpcy5jb250YWluLnNldFN0eWxlKHtvcGFjaXR5IDogMC42fSk7Cgl9LAoJCgllbmFibGUgOiBmdW5jdGlvbih0KSB7CgkJdGhpcy5pc0Rpc2FibGVkID0gZmFsc2U7CgkJdGhpcy5jbG9zZSgpOwoJCXRoaXMuY29udGFpbi5zZXRTdHlsZSh7b3BhY2l0eSA6IDF9KTsKCX0sCgkKCXNldERpc3BsYXkgOiBmdW5jdGlvbih0eHQpIHsKCQl0aGlzLnR4dC5zZXRDb250ZW50KHR4dCk7Cgl9LAoJCgl0b2dnbGUgOiBmdW5jdGlvbigpIHsKCQlpZighdGhpcy5pc0Rpc2FibGVkKSB7CgkJCSh0aGlzLnBhbmUpID8gdGhpcy5jbG9zZSgpIDogdGhpcy5vcGVuKCk7CgkJfQoJfSwKCQoJb3BlbiA6IGZ1bmN0aW9uKCkgewoJCXRoaXMucGFuZSA9IG5ldyBuaWNFZGl0b3JQYW5lKHRoaXMuaXRlbXMsdGhpcy5uZSx7d2lkdGggOiAnODhweCcsIHBhZGRpbmc6ICcwcHgnLCBib3JkZXJUb3AgOiAwLCBib3JkZXJMZWZ0IDogJzFweCBzb2xpZCAjY2NjJywgYm9yZGVyUmlnaHQgOiAnMXB4IHNvbGlkICNjY2MnLCBib3JkZXJCb3R0b20gOiAnMHB4JywgYmFja2dyb3VuZENvbG9yIDogJyNmZmYnfSk7CgkJCgkJZm9yKHZhciBpPTA7aTx0aGlzLnNlbE9wdGlvbnMubGVuZ3RoO2krKykgewoJCQl2YXIgb3B0ID0gdGhpcy5zZWxPcHRpb25zW2ldOwoJCQl2YXIgaXRtQ29udGFpbiA9IG5ldyBia0VsZW1lbnQoJ2RpdicpLnNldFN0eWxlKHtvdmVyZmxvdyA6ICdoaWRkZW4nLCBib3JkZXJCb3R0b20gOiAnMXB4IHNvbGlkICNjY2MnLCB3aWR0aDogJzg4cHgnLCB0ZXh0QWxpZ24gOiAnbGVmdCcsIG92ZXJmbG93IDogJ2hpZGRlbicsIGN1cnNvciA6ICdwb2ludGVyJ30pOwoJCQl2YXIgaXRtID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe3BhZGRpbmcgOiAnMHB4IDRweCd9KS5zZXRDb250ZW50KG9wdFsxXSkuYXBwZW5kVG8oaXRtQ29udGFpbikubm9TZWxlY3QoKTsKCQkJaXRtLmFkZEV2ZW50KCdjbGljaycsdGhpcy51cGRhdGUuY2xvc3VyZSh0aGlzLG9wdFswXSkpLmFkZEV2ZW50KCdtb3VzZW92ZXInLHRoaXMub3Zlci5jbG9zdXJlKHRoaXMsaXRtKSkuYWRkRXZlbnQoJ21vdXNlb3V0Jyx0aGlzLm91dC5jbG9zdXJlKHRoaXMsaXRtKSkuc2V0QXR0cmlidXRlcygnaWQnLG9wdFswXSk7CgkJCXRoaXMucGFuZS5hcHBlbmQoaXRtQ29udGFpbik7CgkJCWlmKCF3aW5kb3cub3BlcmEpIHsKCQkJCWl0bS5vbm1vdXNlZG93biA9IGJrTGliLmNhbmNlbEV2ZW50OwoJCQl9CgkJfQoJfSwKCQoJY2xvc2UgOiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLnBhbmUpIHsKCQkJdGhpcy5wYW5lID0gdGhpcy5wYW5lLnJlbW92ZSgpOwoJCX0JCgl9LAoJCglvdmVyIDogZnVuY3Rpb24ob3B0KSB7CgkJb3B0LnNldFN0eWxlKHtiYWNrZ3JvdW5kQ29sb3IgOiAnI2NjYyd9KTsJCQkKCX0sCgkKCW91dCA6IGZ1bmN0aW9uKG9wdCkgewoJCW9wdC5zZXRTdHlsZSh7YmFja2dyb3VuZENvbG9yIDogJyNmZmYnfSk7Cgl9LAoJCgkKCWFkZCA6IGZ1bmN0aW9uKGssdikgewoJCXRoaXMuc2VsT3B0aW9ucy5wdXNoKG5ldyBBcnJheShrLHYpKTsJCgl9LAoJCgl1cGRhdGUgOiBmdW5jdGlvbihlbG0pIHsKCQl0aGlzLm5lLm5pY0NvbW1hbmQodGhpcy5vcHRpb25zLmNvbW1hbmQsZWxtKTsKCQl0aGlzLmNsb3NlKCk7CQoJfQp9KTsKCnZhciBuaWNFZGl0b3JGb250U2l6ZVNlbGVjdCA9IG5pY0VkaXRvclNlbGVjdC5leHRlbmQoewoJc2VsIDogezEgOiAnMSZuYnNwOyg4cHQpJywgMiA6ICcyJm5ic3A7KDEwcHQpJywgMyA6ICczJm5ic3A7KDEycHQpJywgNCA6ICc0Jm5ic3A7KDE0cHQpJywgNSA6ICc1Jm5ic3A7KDE4cHQpJywgNiA6ICc2Jm5ic3A7KDI0cHQpJ30sCglpbml0IDogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZXREaXNwbGF5KCdGb250Jm5ic3A7U2l6ZS4uLicpOwoJCWZvcihpdG0gaW4gdGhpcy5zZWwpIHsKCQkJdGhpcy5hZGQoaXRtLCc8Zm9udCBzaXplPSInK2l0bSsnIj4nK3RoaXMuc2VsW2l0bV0rJzwvZm9udD4nKTsKCQl9CQkKCX0KfSk7Cgp2YXIgbmljRWRpdG9yRm9udEZhbWlseVNlbGVjdCA9IG5pY0VkaXRvclNlbGVjdC5leHRlbmQoewoJc2VsIDogeydhcmlhbCcgOiAnQXJpYWwnLCdjb21pYyBzYW5zIG1zJyA6ICdDb21pYyBTYW5zJywnY291cmllciBuZXcnIDogJ0NvdXJpZXIgTmV3JywnZ2VvcmdpYScgOiAnR2VvcmdpYScsICdoZWx2ZXRpY2EnIDogJ0hlbHZldGljYScsICdpbXBhY3QnIDogJ0ltcGFjdCcsICd0aW1lcyBuZXcgcm9tYW4nIDogJ1RpbWVzJywgJ3RyZWJ1Y2hldCBtcycgOiAnVHJlYnVjaGV0JywgJ3ZlcmRhbmEnIDogJ1ZlcmRhbmEnfSwKCQoJaW5pdCA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0RGlzcGxheSgnRm9udCZuYnNwO0ZhbWlseS4uLicpOwoJCWZvcihpdG0gaW4gdGhpcy5zZWwpIHsKCQkJdGhpcy5hZGQoaXRtLCc8Zm9udCBmYWNlPSInK2l0bSsnIj4nK3RoaXMuc2VsW2l0bV0rJzwvZm9udD4nKTsKCQl9Cgl9Cn0pOwoKdmFyIG5pY0VkaXRvckZvbnRGb3JtYXRTZWxlY3QgPSBuaWNFZGl0b3JTZWxlY3QuZXh0ZW5kKHsKCQlzZWwgOiB7J3AnIDogJ1BhcmFncmFwaCcsICdwcmUnIDogJ1ByZScsICdoNicgOiAnSGVhZGluZyZuYnNwOzYnLCAnaDUnIDogJ0hlYWRpbmcmbmJzcDs1JywgJ2g0JyA6ICdIZWFkaW5nJm5ic3A7NCcsICdoMycgOiAnSGVhZGluZyZuYnNwOzMnLCAnaDInIDogJ0hlYWRpbmcmbmJzcDsyJywgJ2gxJyA6ICdIZWFkaW5nJm5ic3A7MSd9LAoJCQoJaW5pdCA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0RGlzcGxheSgnRm9udCZuYnNwO0Zvcm1hdC4uLicpOwoJCWZvcihpdG0gaW4gdGhpcy5zZWwpIHsKCQkJdmFyIHRhZyA9IGl0bS50b1VwcGVyQ2FzZSgpOwoJCQl0aGlzLmFkZCgnPCcrdGFnKyc+JywnPCcraXRtKycgc3R5bGU9InBhZGRpbmc6IDBweDsgbWFyZ2luOiAwcHg7Ij4nK3RoaXMuc2VsW2l0bV0rJzwvJyt0YWcrJz4nKTsKCQl9Cgl9Cn0pOwoKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdpbihuaWNQbHVnaW4sbmljU2VsZWN0T3B0aW9ucyk7CgoKCi8qIFNUQVJUIENPTkZJRyAqLwp2YXIgbmljTGlua09wdGlvbnMgPSB7CglidXR0b25zIDogewoJCSdsaW5rJyA6IHtuYW1lIDogJ0FkZCBMaW5rJywgdHlwZSA6ICduaWNMaW5rQnV0dG9uJywgdGFncyA6IFsnQSddfSwKCQkndW5saW5rJyA6IHtuYW1lIDogJ1JlbW92ZSBMaW5rJywgIGNvbW1hbmQgOiAndW5saW5rJywgbm9BY3RpdmUgOiB0cnVlfQoJfQp9OwovKiBFTkQgQ09ORklHICovCgp2YXIgbmljTGlua0J1dHRvbiA9IG5pY0VkaXRvckFkdmFuY2VkQnV0dG9uLmV4dGVuZCh7CQoJYWRkUGFuZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMubG4gPSB0aGlzLm5lLnNlbGVjdGVkSW5zdGFuY2Uuc2VsRWxtKCkucGFyZW50VGFnKCdBJyk7CgkJdGhpcy5hZGRGb3JtKHsKCQkJJycgOiB7dHlwZSA6ICd0aXRsZScsIHR4dCA6ICdBZGQvRWRpdCBMaW5rJ30sCgkJCSdocmVmJyA6IHt0eXBlIDogJ3RleHQnLCB0eHQgOiAnVVJMJywgdmFsdWUgOiAnaHR0cDovLycsIHN0eWxlIDoge3dpZHRoOiAnMTUwcHgnfX0sCgkJCSd0aXRsZScgOiB7dHlwZSA6ICd0ZXh0JywgdHh0IDogJ1RpdGxlJ30sCgkJCSd0YXJnZXQnIDoge3R5cGUgOiAnc2VsZWN0JywgdHh0IDogJ09wZW4gSW4nLCBvcHRpb25zIDogeycnIDogJ0N1cnJlbnQgV2luZG93JywgJ19ibGFuaycgOiAnTmV3IFdpbmRvdyd9LHN0eWxlIDoge3dpZHRoIDogJzEwMHB4J319CgkJfSx0aGlzLmxuKTsKCX0sCgkKCXN1Ym1pdCA6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgdXJsID0gdGhpcy5pbnB1dHNbJ2hyZWYnXS52YWx1ZTsKCQlpZih1cmwgPT0gImh0dHA6Ly8iIHx8IHVybCA9PSAiIikgewoJCQlhbGVydCgiWW91IG11c3QgZW50ZXIgYSBVUkwgdG8gQ3JlYXRlIGEgTGluayIpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXRoaXMucmVtb3ZlUGFuZSgpOwoJCQoJCWlmKCF0aGlzLmxuKSB7CgkJCXZhciB0bXAgPSAnamF2YXNjcmlwdDpuaWNUZW1wKCk7JzsKCQkJdGhpcy5uZS5uaWNDb21tYW5kKCJjcmVhdGVsaW5rIix0bXApOwoJCQl0aGlzLmxuID0gdGhpcy5maW5kRWxtKCdBJywnaHJlZicsdG1wKTsKCQl9CgkJaWYodGhpcy5sbikgewoJCQl0aGlzLmxuLnNldEF0dHJpYnV0ZXMoewoJCQkJaHJlZiA6IHRoaXMuaW5wdXRzWydocmVmJ10udmFsdWUsCgkJCQl0aXRsZSA6IHRoaXMuaW5wdXRzWyd0aXRsZSddLnZhbHVlLAoJCQkJdGFyZ2V0IDogdGhpcy5pbnB1dHNbJ3RhcmdldCddLm9wdGlvbnNbdGhpcy5pbnB1dHNbJ3RhcmdldCddLnNlbGVjdGVkSW5kZXhdLnZhbHVlCgkJCX0pOwoJCX0KCX0KfSk7CgpuaWNFZGl0b3JzLnJlZ2lzdGVyUGx1Z2luKG5pY1BsdWdpbixuaWNMaW5rT3B0aW9ucyk7CgoKCi8qIFNUQVJUIENPTkZJRyAqLwp2YXIgbmljQ29sb3JPcHRpb25zID0gewoJYnV0dG9ucyA6IHsKCQknZm9yZWNvbG9yJyA6IHtuYW1lIDogX18oJ0NoYW5nZSBUZXh0IENvbG9yJyksIHR5cGUgOiAnbmljRWRpdG9yQ29sb3JCdXR0b24nLCBub0Nsb3NlIDogdHJ1ZX0sCgkJJ2JnY29sb3InIDoge25hbWUgOiBfXygnQ2hhbmdlIEJhY2tncm91bmQgQ29sb3InKSwgdHlwZSA6ICduaWNFZGl0b3JCZ0NvbG9yQnV0dG9uJywgbm9DbG9zZSA6IHRydWV9Cgl9Cn07Ci8qIEVORCBDT05GSUcgKi8KCnZhciBuaWNFZGl0b3JDb2xvckJ1dHRvbiA9IG5pY0VkaXRvckFkdmFuY2VkQnV0dG9uLmV4dGVuZCh7CQoJYWRkUGFuZSA6IGZ1bmN0aW9uKCkgewoJCQl2YXIgY29sb3JMaXN0ID0gezAgOiAnMDAnLDEgOiAnMzMnLDIgOiAnNjYnLDMgOic5OScsNCA6ICdDQycsNSA6ICdGRid9OwoJCQl2YXIgY29sb3JJdGVtcyA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHt3aWR0aDogJzI3MHB4J30pOwoJCQkKCQkJZm9yKHZhciByIGluIGNvbG9yTGlzdCkgewoJCQkJZm9yKHZhciBiIGluIGNvbG9yTGlzdCkgewoJCQkJCWZvcih2YXIgZyBpbiBjb2xvckxpc3QpIHsKCQkJCQkJdmFyIGNvbG9yQ29kZSA9ICcjJytjb2xvckxpc3Rbcl0rY29sb3JMaXN0W2ddK2NvbG9yTGlzdFtiXTsKCQkJCQkJCgkJCQkJCXZhciBjb2xvclNxdWFyZSA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHsnY3Vyc29yJyA6ICdwb2ludGVyJywgJ2hlaWdodCcgOiAnMTVweCcsICdmbG9hdCcgOiAnbGVmdCd9KS5hcHBlbmRUbyhjb2xvckl0ZW1zKTsKCQkJCQkJdmFyIGNvbG9yQm9yZGVyID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUoe2JvcmRlcjogJzJweCBzb2xpZCAnK2NvbG9yQ29kZX0pLmFwcGVuZFRvKGNvbG9yU3F1YXJlKTsKCQkJCQkJdmFyIGNvbG9ySW5uZXIgPSBuZXcgYmtFbGVtZW50KCdESVYnKS5zZXRTdHlsZSh7YmFja2dyb3VuZENvbG9yIDogY29sb3JDb2RlLCBvdmVyZmxvdyA6ICdoaWRkZW4nLCB3aWR0aCA6ICcxMXB4JywgaGVpZ2h0IDogJzExcHgnfSkuYWRkRXZlbnQoJ2NsaWNrJyx0aGlzLmNvbG9yU2VsZWN0LmNsb3N1cmUodGhpcyxjb2xvckNvZGUpKS5hZGRFdmVudCgnbW91c2VvdmVyJyx0aGlzLm9uLmNsb3N1cmUodGhpcyxjb2xvckJvcmRlcikpLmFkZEV2ZW50KCdtb3VzZW91dCcsdGhpcy5vZmYuY2xvc3VyZSh0aGlzLGNvbG9yQm9yZGVyLGNvbG9yQ29kZSkpLmFwcGVuZFRvKGNvbG9yQm9yZGVyKTsKCQkJCQkJCgkJCQkJCWlmKCF3aW5kb3cub3BlcmEpIHsKCQkJCQkJCWNvbG9yU3F1YXJlLm9ubW91c2Vkb3duID0gY29sb3JJbm5lci5vbm1vdXNlZG93biA9IGJrTGliLmNhbmNlbEV2ZW50OwoJCQkJCQl9CgoJCQkJCX0JCgkJCQl9CQoJCQl9CgkJCXRoaXMucGFuZS5hcHBlbmQoY29sb3JJdGVtcy5ub1NlbGVjdCgpKTsJCgl9LAoJCgljb2xvclNlbGVjdCA6IGZ1bmN0aW9uKGMpIHsKCQl0aGlzLm5lLm5pY0NvbW1hbmQoJ2ZvcmVDb2xvcicsYyk7CgkJdGhpcy5yZW1vdmVQYW5lKCk7Cgl9LAoJCglvbiA6IGZ1bmN0aW9uKGNvbG9yQm9yZGVyKSB7CgkJY29sb3JCb3JkZXIuc2V0U3R5bGUoe2JvcmRlciA6ICcycHggc29saWQgIzAwMCd9KTsKCX0sCgkKCW9mZiA6IGZ1bmN0aW9uKGNvbG9yQm9yZGVyLGNvbG9yQ29kZSkgewoJCWNvbG9yQm9yZGVyLnNldFN0eWxlKHtib3JkZXIgOiAnMnB4IHNvbGlkICcrY29sb3JDb2RlfSk7CQkKCX0KfSk7Cgp2YXIgbmljRWRpdG9yQmdDb2xvckJ1dHRvbiA9IG5pY0VkaXRvckNvbG9yQnV0dG9uLmV4dGVuZCh7Cgljb2xvclNlbGVjdCA6IGZ1bmN0aW9uKGMpIHsKCQl0aGlzLm5lLm5pY0NvbW1hbmQoJ2hpbGl0ZUNvbG9yJyxjKTsKCQl0aGlzLnJlbW92ZVBhbmUoKTsKCX0JCn0pOwoKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdpbihuaWNQbHVnaW4sbmljQ29sb3JPcHRpb25zKTsKCgoKLyogU1RBUlQgQ09ORklHICovCnZhciBuaWNJbWFnZU9wdGlvbnMgPSB7CglidXR0b25zIDogewoJCSdpbWFnZScgOiB7bmFtZSA6ICdBZGQgSW1hZ2UnLCB0eXBlIDogJ25pY0ltYWdlQnV0dG9uJywgdGFncyA6IFsnSU1HJ119Cgl9CgkKfTsKLyogRU5EIENPTkZJRyAqLwoKdmFyIG5pY0ltYWdlQnV0dG9uID0gbmljRWRpdG9yQWR2YW5jZWRCdXR0b24uZXh0ZW5kKHsJCglhZGRQYW5lIDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbSA9IHRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZS5zZWxFbG0oKS5wYXJlbnRUYWcoJ0lNRycpOwoJCXRoaXMuYWRkRm9ybSh7CgkJCScnIDoge3R5cGUgOiAndGl0bGUnLCB0eHQgOiAnQWRkL0VkaXQgSW1hZ2UnfSwKCQkJJ3NyYycgOiB7dHlwZSA6ICd0ZXh0JywgdHh0IDogJ1VSTCcsICd2YWx1ZScgOiAnaHR0cDovLycsIHN0eWxlIDoge3dpZHRoOiAnMTUwcHgnfX0sCgkJCSdhbHQnIDoge3R5cGUgOiAndGV4dCcsIHR4dCA6ICdBbHQgVGV4dCcsIHN0eWxlIDoge3dpZHRoOiAnMTAwcHgnfX0sCgkJCSdhbGlnbicgOiB7dHlwZSA6ICdzZWxlY3QnLCB0eHQgOiAnQWxpZ24nLCBvcHRpb25zIDoge25vbmUgOiAnRGVmYXVsdCcsJ2xlZnQnIDogJ0xlZnQnLCAncmlnaHQnIDogJ1JpZ2h0J319CgkJfSx0aGlzLmltKTsKCX0sCgkKCXN1Ym1pdCA6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgc3JjID0gdGhpcy5pbnB1dHNbJ3NyYyddLnZhbHVlOwoJCWlmKHNyYyA9PSAiIiB8fCBzcmMgPT0gImh0dHA6Ly8iKSB7CgkJCWFsZXJ0KCJZb3UgbXVzdCBlbnRlciBhIEltYWdlIFVSTCB0byBpbnNlcnQiKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQl0aGlzLnJlbW92ZVBhbmUoKTsKCgkJaWYoIXRoaXMuaW0pIHsKCQkJdmFyIHRtcCA9ICdqYXZhc2NyaXB0Om5pY0ltVGVtcCgpOyc7CgkJCXRoaXMubmUubmljQ29tbWFuZCgiaW5zZXJ0SW1hZ2UiLHRtcCk7CgkJCXRoaXMuaW0gPSB0aGlzLmZpbmRFbG0oJ0lNRycsJ3NyYycsdG1wKTsKCQl9CgkJaWYodGhpcy5pbSkgewoJCQl0aGlzLmltLnNldEF0dHJpYnV0ZXMoewoJCQkJc3JjIDogdGhpcy5pbnB1dHNbJ3NyYyddLnZhbHVlLAoJCQkJYWx0IDogdGhpcy5pbnB1dHNbJ2FsdCddLnZhbHVlLAoJCQkJYWxpZ24gOiB0aGlzLmlucHV0c1snYWxpZ24nXS52YWx1ZQoJCQl9KTsKCQl9Cgl9Cn0pOwoKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdpbihuaWNQbHVnaW4sbmljSW1hZ2VPcHRpb25zKTsKCgoKCi8qIFNUQVJUIENPTkZJRyAqLwp2YXIgbmljU2F2ZU9wdGlvbnMgPSB7CglidXR0b25zIDogewoJCSdzYXZlJyA6IHtuYW1lIDogX18oJ1NhdmUgdGhpcyBjb250ZW50JyksIHR5cGUgOiAnbmljRWRpdG9yU2F2ZUJ1dHRvbid9Cgl9Cn07Ci8qIEVORCBDT05GSUcgKi8KCnZhciBuaWNFZGl0b3JTYXZlQnV0dG9uID0gbmljRWRpdG9yQnV0dG9uLmV4dGVuZCh7Cglpbml0IDogZnVuY3Rpb24oKSB7CgkJaWYoIXRoaXMubmUub3B0aW9ucy5vblNhdmUpIHsKCQkJdGhpcy5tYXJnaW4uc2V0U3R5bGUoeydkaXNwbGF5JyA6ICdub25lJ30pOwoJCX0KCX0sCgltb3VzZUNsaWNrIDogZnVuY3Rpb24oKSB7CgkJdmFyIG9uU2F2ZSA9IHRoaXMubmUub3B0aW9ucy5vblNhdmU7CgkJdmFyIHNlbGVjdGVkSW5zdGFuY2UgPSB0aGlzLm5lLnNlbGVjdGVkSW5zdGFuY2U7CiAgICAvLyBGaXggc2VsZWN0ZWRJbnN0YW5jZS5lbG0uaWQgLT4gc2VsZWN0ZWRJbnN0YW5jZS5lLmlkCgkJb25TYXZlKHNlbGVjdGVkSW5zdGFuY2UuZ2V0Q29udGVudCgpLCBzZWxlY3RlZEluc3RhbmNlLmUuaWQsIHNlbGVjdGVkSW5zdGFuY2UpOwoJfQp9KTsKCm5pY0VkaXRvcnMucmVnaXN0ZXJQbHVnaW4obmljUGx1Z2luLG5pY1NhdmVPcHRpb25zKTsKCgp2YXIgbmljWEhUTUwgPSBia0NsYXNzLmV4dGVuZCh7CglzdHJpcEF0dHJpYnV0ZXMgOiBbJ19tb3pfZGlydHknLCdfbW96X3Jlc2l6aW5nJywnX2V4dGVuZGVkJ10sCglub1Nob3J0IDogWydzdHlsZScsJ3RpdGxlJywnc2NyaXB0JywndGV4dGFyZWEnLCdhJ10sCgljc3NSZXBsYWNlIDogeydmb250LXdlaWdodDpib2xkOycgOiAnc3Ryb25nJywgJ2ZvbnQtc3R5bGU6aXRhbGljOycgOiAnZW0nfSwKCXNpemVzIDogezEgOiAneHgtc21hbGwnLCAyIDogJ3gtc21hbGwnLCAzIDogJ3NtYWxsJywgNCA6ICdtZWRpdW0nLCA1IDogJ2xhcmdlJywgNiA6ICd4LWxhcmdlJ30sCgkKCWNvbnN0cnVjdCA6IGZ1bmN0aW9uKG5pY0VkaXRvcikgewoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJaWYodGhpcy5uZS5vcHRpb25zLnhodG1sKSB7CgkJCW5pY0VkaXRvci5hZGRFdmVudCgnZ2V0Jyx0aGlzLmNsZWFudXAuY2xvc3VyZSh0aGlzKSk7CgkJfQoJfSwKCQoJY2xlYW51cCA6IGZ1bmN0aW9uKG5pKSB7CgkJdmFyIG5vZGUgPSBuaS5nZXRFbG0oKTsKCQl2YXIgeGh0bWwgPSB0aGlzLnRvWEhUTUwobm9kZSk7CgkJbmkuY29udGVudCA9IHhodG1sOwoJfSwKCQoJdG9YSFRNTCA6IGZ1bmN0aW9uKG4scixkKSB7CgkJdmFyIHR4dCA9ICcnOwoJCXZhciBhdHRyVHh0ID0gJyc7CgkJdmFyIGNzc1R4dCA9ICcnOwoJCXZhciBuVHlwZSA9IG4ubm9kZVR5cGU7CgkJdmFyIG5OYW1lID0gbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXZhciBuQ2hpbGQgPSBuLmhhc0NoaWxkTm9kZXMgJiYgbi5oYXNDaGlsZE5vZGVzKCk7CgkJdmFyIGV4dHJhTm9kZXMgPSBuZXcgQXJyYXkoKTsKCQkKCQlzd2l0Y2goblR5cGUpIHsKCQkJY2FzZSAxOgoJCQkJdmFyIG5BdHRyaWJ1dGVzID0gbi5hdHRyaWJ1dGVzOwoJCQkJCgkJCQlzd2l0Y2gobk5hbWUpIHsKCQkJCQljYXNlICdiJzoKCQkJCQkJbk5hbWUgPSAnc3Ryb25nJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnaSc6CgkJCQkJCW5OYW1lID0gJ2VtJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnZm9udCc6CgkJCQkJCW5OYW1lID0gJ3NwYW4nOwoJCQkJCQlicmVhazsKCQkJCX0KCQkJCQoJCQkJaWYocikgewoJCQkJCWZvcih2YXIgaT0wO2k8bkF0dHJpYnV0ZXMubGVuZ3RoO2krKykgewoJCQkJCQl2YXIgYXR0ciA9IG5BdHRyaWJ1dGVzW2ldOwoJCQkJCQkKCQkJCQkJdmFyIGF0dHJpYnV0ZU5hbWUgPSBhdHRyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCQkJCXZhciBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHIubm9kZVZhbHVlOwoJCQkJCQkKCQkJCQkJaWYoIWF0dHIuc3BlY2lmaWVkIHx8ICFhdHRyaWJ1dGVWYWx1ZSB8fCBia0xpYi5pbkFycmF5KHRoaXMuc3RyaXBBdHRyaWJ1dGVzLGF0dHJpYnV0ZU5hbWUpIHx8IHR5cGVvZihhdHRyaWJ1dGVWYWx1ZSkgPT0gImZ1bmN0aW9uIikgewoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCXN3aXRjaChhdHRyaWJ1dGVOYW1lKSB7CgkJCQkJCQljYXNlICdzdHlsZSc6CgkJCQkJCQkJdmFyIGNzcyA9IGF0dHJpYnV0ZVZhbHVlLnJlcGxhY2UoLyAvZywiIik7CgkJCQkJCQkJZm9yKGl0bSBpbiB0aGlzLmNzc1JlcGxhY2UpIHsKCQkJCQkJCQkJaWYoY3NzLmluZGV4T2YoaXRtKSAhPSAtMSkgewoJCQkJCQkJCQkJZXh0cmFOb2Rlcy5wdXNoKHRoaXMuY3NzUmVwbGFjZVtpdG1dKTsKCQkJCQkJCQkJCWNzcyA9IGNzcy5yZXBsYWNlKGl0bSwnJyk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJY3NzVHh0ICs9IGNzczsKCQkJCQkJCQlhdHRyaWJ1dGVWYWx1ZSA9ICIiOwoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdjbGFzcyc6CgkJCQkJCQkJYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVWYWx1ZS5yZXBsYWNlKCJBcHBsZS1zdHlsZS1zcGFuIiwiIik7CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3NpemUnOgoJCQkJCQkJCWNzc1R4dCArPSAiZm9udC1zaXplOiIrdGhpcy5zaXplc1thdHRyaWJ1dGVWYWx1ZV0rJzsnOwoJCQkJCQkJCWF0dHJpYnV0ZVZhbHVlID0gIiI7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQkKCQkJCQkJaWYoYXR0cmlidXRlVmFsdWUpIHsKCQkJCQkJCWF0dHJUeHQgKz0gJyAnK2F0dHJpYnV0ZU5hbWUrJz0iJythdHRyaWJ1dGVWYWx1ZSsnIic7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWlmKGNzc1R4dCkgewoJCQkJCQlhdHRyVHh0ICs9ICcgc3R5bGU9IicrY3NzVHh0KyciJzsKCQkJCQl9CgoJCQkJCWZvcih2YXIgaT0wO2k8ZXh0cmFOb2Rlcy5sZW5ndGg7aSsrKSB7CgkJCQkJCXR4dCArPSAnPCcrZXh0cmFOb2Rlc1tpXSsnPic7CgkJCQkJfQoJCQkJCgkJCQkJaWYoYXR0clR4dCA9PSAiIiAmJiBuTmFtZSA9PSAic3BhbiIpIHsKCQkJCQkJciA9IGZhbHNlOwoJCQkJCX0KCQkJCQlpZihyKSB7CgkJCQkJCXR4dCArPSAnPCcrbk5hbWU7CgkJCQkJCWlmKG5OYW1lICE9ICdicicpIHsKCQkJCQkJCXR4dCArPSBhdHRyVHh0OwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJCgoJCQkJCgkJCQlpZighbkNoaWxkICYmICFia0xpYi5pbkFycmF5KHRoaXMubm9TaG9ydCxhdHRyaWJ1dGVOYW1lKSkgewoJCQkJCWlmKHIpIHsKCQkJCQkJdHh0ICs9ICcgLz4nOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJaWYocikgewoJCQkJCQl0eHQgKz0gJz4nOwoJCQkJCX0KCQkJCQkKCQkJCQlmb3IodmFyIGk9MDtpPG4uY2hpbGROb2Rlcy5sZW5ndGg7aSsrKSB7CgkJCQkJCXZhciByZXN1bHRzID0gdGhpcy50b1hIVE1MKG4uY2hpbGROb2Rlc1tpXSx0cnVlLHRydWUpOwoJCQkJCQlpZihyZXN1bHRzKSB7CgkJCQkJCQl0eHQgKz0gcmVzdWx0czsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCQkKCQkJCWlmKHIgJiYgbkNoaWxkKSB7CgkJCQkJdHh0ICs9ICc8Lycrbk5hbWUrJz4nOwoJCQkJfQoJCQkJCgkJCQlmb3IodmFyIGk9MDtpPGV4dHJhTm9kZXMubGVuZ3RoO2krKykgewoJCQkJCXR4dCArPSAnPC8nK2V4dHJhTm9kZXNbaV0rJz4nOwoJCQkJfQoKCQkJCWJyZWFrOwoJCQljYXNlIDM6CgkJCQkvL2lmKG4ubm9kZVZhbHVlICE9ICdcbicpIHsKCQkJCQl0eHQgKz0gbi5ub2RlVmFsdWU7CgkJCQkvL30KCQkJCWJyZWFrOwoJCX0KCQkKCQlyZXR1cm4gdHh0OwoJfQp9KTsKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdpbihuaWNYSFRNTCk7CgoKCgovKiBTVEFSVCBDT05GSUcgKi8KdmFyIG5pY0NvZGVPcHRpb25zID0gewoJYnV0dG9ucyA6IHsKCQkneGh0bWwnIDoge25hbWUgOiAnRWRpdCBIVE1MJywgdHlwZSA6ICduaWNDb2RlQnV0dG9uJ30KCX0KCQp9OwovKiBFTkQgQ09ORklHICovCgp2YXIgbmljQ29kZUJ1dHRvbiA9IG5pY0VkaXRvckFkdmFuY2VkQnV0dG9uLmV4dGVuZCh7Cgl3aWR0aCA6ICczNTBweCcsCgkJCglhZGRQYW5lIDogZnVuY3Rpb24oKSB7CgkJdGhpcy5hZGRGb3JtKHsKCQkJJycgOiB7dHlwZSA6ICd0aXRsZScsIHR4dCA6ICdFZGl0IEhUTUwnfSwKCQkJJ2NvZGUnIDoge3R5cGUgOiAnY29udGVudCcsICd2YWx1ZScgOiB0aGlzLm5lLnNlbGVjdGVkSW5zdGFuY2UuZ2V0Q29udGVudCgpLCBzdHlsZSA6IHt3aWR0aDogJzM0MHB4JywgaGVpZ2h0IDogJzIwMHB4J319CgkJfSk7Cgl9LAoJCglzdWJtaXQgOiBmdW5jdGlvbihlKSB7CgkJdmFyIGNvZGUgPSB0aGlzLmlucHV0c1snY29kZSddLnZhbHVlOwoJCXRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZS5zZXRDb250ZW50KGNvZGUpOwoJCXRoaXMucmVtb3ZlUGFuZSgpOwoJfQp9KTsKCm5pY0VkaXRvcnMucmVnaXN0ZXJQbHVnaW4obmljUGx1Z2luLG5pY0NvZGVPcHRpb25zKTsKCgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/js/touchInlineEditInstance.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqICRJZDogdG91Y2hJbmxpbmVFZGl0LmpzIDE0MSAyMDExLTAxLTA5IDE5OjE4OjU3WiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBNb2R1bGUKICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjguMAogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqCiAqIAogKiAtLQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogKiBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiAqCiAqLwoKZnVuY3Rpb24gdG91Y2hJbmxpbmVFZGl0SW5zdGFuY2UoaWQsYmxvY2ssc2VsZWN0b3IpewogIAogIC8qKgogICAqIFNlbGYgaW5zdGFuY2UuCiAgICogQHZhciBvYmplY3QKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLyAKICB2YXIgc2VsZiA9IHRoaXM7CgogIC8qKgogICAqIFBhZ2UgaWQuCiAgICogQHZhciBpbnRlZ2VyCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gCiAgdGhpcy5pZCA9IGlkOwogIAogIC8qKgogICAqIFBhZ2UgYmxvY2suCiAgICogQHZhciBuYW1lCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gCiAgdGhpcy5ibG9jayA9IGJsb2NrOwogIAogIC8qKgogICAqIFNlbGVjdG9yIGh0bWwgaWQuCiAgICogQHZhciBpbnRlZ2VyCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gCiAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOwogIAogIC8qKgogICAqIEVkaXRvciBpbnN0YW5jZS4KICAgKiBAdmFyIG9iamVjdAogICAqIEBhY2Nlc3MgcHVibGljCiAgICovIAogIHRoaXMuZWRpdG9yOwoKICAvKioKICAgKiBDb25zdHJ1Y3QgZWRpdG9yIGluc3RhbmNlLgogICAqLwogIHRoaXMuX19jb25zdHJ1Y3QgPSBmdW5jdGlvbigpCiAgewogICAgLy9jb25zb2xlLmRlYnVnKCdDb25zdHJ1Y3QgJyArIHNlbGYuYmxvY2spOwogICAgc2VsZi5lZGl0b3IgPSBuZXcgbmljRWRpdG9yKHsKICAgICAgaWNvbnNQYXRoOiB0b3VjaElubGluZUVkaXQuZ2V0UGFyYW0oJ2ljb25zX3BhdGgnKSwKICAgICAgYnV0dG9uTGlzdDogdG91Y2hJbmxpbmVFZGl0LmdldFBhcmFtKCdidXR0b25fbGlzdCcpLnNwbGl0KCcsJyksCiAgICAgIG1heEhlaWdodDogdG91Y2hJbmxpbmVFZGl0LmdldFBhcmFtKCdoZWlnaHQnKSwKICAgICAgb25TYXZlOiBmdW5jdGlvbihjb250ZW50LGlkLGluc3RhbmNlKXtzZWxmLnNhdmUoY29udGVudCl9CiAgICB9KS5wYW5lbEluc3RhbmNlKAogICAgICBzZWxmLnNlbGVjdG9yLAogICAgICB7CiAgICAgICAgaGFzUGFuZWw6IHRydWUKICAgICAgfQogICAgKTsKICB9CgogIC8qKgogICAqIFNhdmUgY29udGVudHMuCiAgICovCiAgdGhpcy5zYXZlID0gZnVuY3Rpb24oY29udGVudCkKICB7CiAgICAvL2NvbnNvbGUuZGVidWcoJ1NhdmUgJyArIHNlbGYuYmxvY2spOwogICAgdG91Y2hJbmxpbmVFZGl0LnNhdmUoc2VsZi5pZCxzZWxmLmJsb2NrLHNlbGYuc2VsZWN0b3IsY29udGVudCk7CiAgfQoKICAvKioKICAgKiBEZXN0cnVjdCBlZGl0b3IgaW5zdGFuY2UuCiAgICovCiAgdGhpcy5fX2Rlc3RydWN0ID0gZnVuY3Rpb24oKQogIHsKICAgIC8vY29uc29sZS5kZWJ1ZygnRGVzdHJ1Y3QgJyArIHNlbGYuYmxvY2spOwogICAgc2VsZi5lZGl0b3IucmVtb3ZlSW5zdGFuY2Uoc2VsZi5zZWxlY3Rvcik7CiAgfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/nicedit.plugin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogbmljZWRpdC5wbHVnaW4ucGhwIDE1NCAyMDExLTAxLTE0IDEzOjA2OjA0WiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBNb2R1bGUgbmljRWRpdCBwbHVnaW4KICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjguMAogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqCiAqIAogKiAtLQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogKiBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiAqCiAqLwoKY2xhc3MgbmljZWRpdCBleHRlbmRzIHRvdWNoSW5saW5lRWRpdFBsdWdpbiB7CgogIC8qKgogICAqIENvbnN0cnVjdCBhIG5ldyBwbHVnaW4gYW5kIGNhbGwgcGFyZW50LgogICAqLwogIGZ1bmN0aW9uIF9fY29uc3RydWN0KCYkbW9kdWxlKQogIHsKICAgICR0aGlzLT5uYW1lID0gJ25pY2VkaXQnOwogICAgJHRoaXMtPmRpc3BsYXlOYW1lID0gJ25pY0VkaXQnOwogICAgJHRoaXMtPnN1cHBvcnRzTXVsdGlwbGUgPSB0cnVlOwogICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbW9kdWxlKTsKICAgICR0aGlzLT5zZXR0aW5ncyA9IGFycmF5KAogICAgICAnanF1ZXJ5X2xvYWQnID0+IDEsCiAgICAgICdidXR0b25fbGlzdCcgPT4gJ3NhdmUsYm9sZCxpdGFsaWMsdW5kZXJsaW5lLGxlZnQsY2VudGVyLHJpZ2h0LGp1c3RpZnksb2wsdWwsc3Vic2NyaXB0LHN1cGVyc2NyaXB0LHN0cmlrZXRocm91Z2gscmVtb3ZlZm9ybWF0LGluZGVudCxvdXRkZW50LGhyLGltYWdlLGZvcmVjb2xvcixiZ2NvbG9yLGxpbmssdW5saW5rLGZvbnRTaXplLGZvbnRGYW1pbHksZm9udEZvcm1hdCx4aHRtbCcsCiAgICAgICdoZWlnaHQnID0+ICdhdXRvJywKICAgICAgJ2ljb25zX3BhdGgnID0+ICR0aGlzLT5wYXRoIC4gJy9pbWcvaWNvbnMuZ2lmJwogICAgKTsKICB9CgogIC8qKgogICAqIEdldCBhZG1pbiBjb25maWcgdGFiIGNvZGUuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldEFkbWluQ29uZmlnKCRpZCwkcmV0dXJuaWQpCiAgewogICAgJHluID0gYXJyYXkoCiAgICAgICR0aGlzLT5tb2R1bGUtPmxhbmcoIm5vIikgPT4gMCwKICAgICAgJHRoaXMtPm1vZHVsZS0+bGFuZygieWVzIikgPT4gMQogICAgKTsKCiAgICAvLyBGb3JtIHN0YXJ0CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbignZm9ybXN0YXJ0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVGb3JtU3RhcnQoJGlkLCJzYXZlZWRpdG9yIiwkcmV0dXJuaWQpKTsKCiAgICAvLyBqcXVlcnkKICAgICRuYW1lID0gJ2pxdWVyeV9sb2FkJzsKICAgICRvcHRpb25zID0gJHluOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfbGFiZWwnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfbGFiZWwnKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19oZWxwJywkdGhpcy0+bW9kdWxlLT5sYW5nKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19pbnB1dCcsJHRoaXMtPm1vZHVsZS0+Y3JlYXRlSW5wdXREcm9wZG93bigkaWQsJG5hbWUsCiAgICAgICRvcHRpb25zLCR0aGlzLT5nZXQoJG5hbWUsJHRoaXMtPnNldHRpbmdzWyRuYW1lXSksJHRoaXMtPmdldCgkbmFtZSwkdGhpcy0+c2V0dGluZ3NbJG5hbWVdKSkpOwogICAgCiAgICAvLyBCdXR0b25zCiAgICAkbmFtZSA9ICdidXR0b25fbGlzdCc7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2lucHV0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dFRleHQoJGlkLCRuYW1lLAogICAgICAkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pLDgwLDI1NSkpOwogICAgCiAgICAvLyBIZWlnaHQKICAgICRuYW1lID0gJ2hlaWdodCc7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2lucHV0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dFRleHQoJGlkLCRuYW1lLAogICAgICAkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pLDEwLDQpKTsKICAgIAogICAgLy8gU3VibWl0IC8gY2FuY2VsCiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dFN1Ym1pdCgkaWQsInN1Ym1pdCIsJHRoaXMtPm1vZHVsZS0+bGFuZygic2F2ZSIpKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dFN1Ym1pdCgkaWQsImNhbmNlbCIsJHRoaXMtPm1vZHVsZS0+bGFuZygiY2FuY2VsIikpKTsKICAgIAogICAgLy8gRm9ybSBlbmQKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCdmb3JtZW5kJywkdGhpcy0+bW9kdWxlLT5jcmVhdGVGb3JtRW5kKCkpOwogICAgCiAgICByZXR1cm4gJHRoaXMtPmZldGNoKCJhZG1pbmVkaXRvci50cGwiKTsKICB9CgogIC8qKgogICAqIEdldCBwbHVnaW4gaGVhZGVyIGh0bWwuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlcigpCiAgewogICAgcmV0dXJuICR0aGlzLT5mZXRjaCgnaGVhZGVyJyx0cnVlKTsKICB9CiAgCn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/nicedit/templates/admineditor.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBpZD0idG91Y2hGb3JtIj4KeyRmb3Jtc3RhcnR9CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRuaWNlZGl0X2pxdWVyeV9sb2FkX2xhYmVsfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskbmljZWRpdF9qcXVlcnlfbG9hZF9pbnB1dH08YnIvPnskbmljZWRpdF9qcXVlcnlfbG9hZF9oZWxwfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG5pY2VkaXRfYnV0dG9uX2xpc3RfbGFiZWx9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRuaWNlZGl0X2J1dHRvbl9saXN0X2lucHV0fTxici8+eyRuaWNlZGl0X2J1dHRvbl9saXN0X2hlbHB9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskbmljZWRpdF9oZWlnaHRfbGFiZWx9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRuaWNlZGl0X2hlaWdodF9pbnB1dH08YnIvPnskbmljZWRpdF9oZWlnaHRfaGVscH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgogIDwvZGl2Pgp7JGZvcm1lbmR9CjwvZGl2Pg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/jquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMy4yCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlcy4KICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9MaWNlbnNlCiAqCiAqIERhdGU6IDIwMDktMDItMTkgMTc6MzQ6MjEgLTA1MDAgKFRodSwgMTkgRmViIDIwMDkpCiAqIFJldmlzaW9uOiA2MjQ2CiAqLwooZnVuY3Rpb24oKXsKCnZhciAKCS8vIFdpbGwgc3BlZWQgdXAgcmVmZXJlbmNlcyB0byB3aW5kb3csIGFuZCBhbGxvd3MgbXVuZ2luZyBpdHMgbmFtZS4KCXdpbmRvdyA9IHRoaXMsCgkvLyBXaWxsIHNwZWVkIHVwIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkLCBhbmQgYWxsb3dzIG11bmdpbmcgaXRzIG5hbWUuCgl1bmRlZmluZWQsCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoJLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV8kID0gd2luZG93LiQsCgoJalF1ZXJ5ID0gd2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCS8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJwoJCXJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7Cgl9LAoKCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzIG9yIElEIHN0cmluZ3MKCS8vIChib3RoIG9mIHdoaWNoIHdlIG9wdGltaXplIGZvcikKCXF1aWNrRXhwciA9IC9eW148XSooPCgufFxzKSs+KVtePl0qJHxeIyhbXHctXSspJC8sCgkvLyBJcyBpdCBhIHNpbXBsZSBzZWxlY3RvcgoJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvOwoKalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKCWluaXQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGlvbiB3YXMgcHJvdmlkZWQKCQlzZWxlY3RvciA9IHNlbGVjdG9yIHx8IGRvY3VtZW50OwoKCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXNbMF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQl0aGlzLmNvbnRleHQgPSBzZWxlY3RvcjsKCQkJcmV0dXJuIHRoaXM7CgkJfQoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJpbmcgb3IgYW4gSUQ/CgkJCXZhciBtYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwoKCQkJLy8gVmVyaWZ5IGEgbWF0Y2gsIGFuZCB0aGF0IG5vIGNvbnRleHQgd2FzIHNwZWNpZmllZCBmb3IgI2lkCgkJCWlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHsKCgkJCQkvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSkKCQkJCWlmICggbWF0Y2hbMV0gKQoJCQkJCXNlbGVjdG9yID0galF1ZXJ5LmNsZWFuKCBbIG1hdGNoWzFdIF0sIGNvbnRleHQgKTsKCgkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCgkJCQllbHNlIHsKCQkJCQl2YXIgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFszXSApOwoKCQkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcwoJCQkJCS8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCWlmICggZWxlbSAmJiBlbGVtLmlkICE9IG1hdGNoWzNdICkKCQkJCQkJcmV0dXJuIGpRdWVyeSgpLmZpbmQoIHNlbGVjdG9yICk7CgoJCQkJCS8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQl2YXIgcmV0ID0galF1ZXJ5KCBlbGVtIHx8IFtdICk7CgkJCQkJcmV0LmNvbnRleHQgPSBkb2N1bWVudDsKCQkJCQlyZXQuc2VsZWN0b3IgPSBzZWxlY3RvcjsKCQkJCQlyZXR1cm4gcmV0OwoJCQkJfQoKCQkJLy8gSEFORExFOiAkKGV4cHIsIFtjb250ZXh0XSkKCQkJLy8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZW50KS5maW5kKGV4cHIpCgkJCX0gZWxzZQoJCQkJcmV0dXJuIGpRdWVyeSggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApCgkJCXJldHVybiBqUXVlcnkoIGRvY3VtZW50ICkucmVhZHkoIHNlbGVjdG9yICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IG9sZCBzZWxlY3RvciBzdGF0ZSBpcyBwYXNzZWQgYWxvbmcKCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICYmIHNlbGVjdG9yLmNvbnRleHQgKSB7CgkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKCQl9CgoJCXJldHVybiB0aGlzLnNldEFycmF5KGpRdWVyeS5pc0FycmF5KCBzZWxlY3RvciApID8KCQkJc2VsZWN0b3IgOgoJCQlqUXVlcnkubWFrZUFycmF5KHNlbGVjdG9yKSk7Cgl9LAoKCS8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3IKCXNlbGVjdG9yOiAiIiwKCgkvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCglqcXVlcnk6ICIxLjMuMiIsCgoJLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQKCXNpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmxlbmd0aDsKCX0sCgoJLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgoJLy8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXkKCWdldDogZnVuY3Rpb24oIG51bSApIHsKCQlyZXR1cm4gbnVtID09PSB1bmRlZmluZWQgPwoKCQkJLy8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJheQoJCQlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdGhpcyApIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKCQkJdGhpc1sgbnVtIF07Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgewoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IGpRdWVyeSggZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCXJldC5jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoKCQlpZiAoIG5hbWUgPT09ICJmaW5kIiApCgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSArIHNlbGVjdG9yOwoJCWVsc2UgaWYgKCBuYW1lICkKCQkJcmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciArICIuIiArIG5hbWUgKyAiKCIgKyBzZWxlY3RvciArICIpIjsKCgkJLy8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCgkvLyBGb3JjZSB0aGUgY3VycmVudCBtYXRjaGVkIHNldCBvZiBlbGVtZW50cyB0byBiZWNvbWUKCS8vIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZWxlbWVudHMgKGRlc3Ryb3lpbmcgdGhlIHN0YWNrIGluIHRoZSBwcm9jZXNzKQoJLy8gWW91IHNob3VsZCB1c2UgcHVzaFN0YWNrKCkgaW4gb3JkZXIgdG8gZG8gdGhpcywgYnV0IG1haW50YWluIHRoZSBzdGFjawoJc2V0QXJyYXk6IGZ1bmN0aW9uKCBlbGVtcyApIHsKCQkvLyBSZXNldHRpbmcgdGhlIGxlbmd0aCB0byAwLCB0aGVuIHVzaW5nIHRoZSBuYXRpdmUgQXJyYXkgcHVzaAoJCS8vIGlzIGEgc3VwZXItZmFzdCB3YXkgdG8gcG9wdWxhdGUgYW4gb2JqZWN0IHdpdGggYXJyYXktbGlrZSBwcm9wZXJ0aWVzCgkJdGhpcy5sZW5ndGggPSAwOwoJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCB0aGlzLCBlbGVtcyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCgkvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pCgllYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7CgkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtICYmIGVsZW0uanF1ZXJ5ID8gZWxlbVswXSA6IGVsZW0KCQksIHRoaXMgKTsKCX0sCgoJYXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlLCB0eXBlICkgewoJCXZhciBvcHRpb25zID0gbmFtZTsKCgkJLy8gTG9vayBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UncmUgYWNjZXNzaW5nIGEgc3R5bGUgdmFsdWUKCQlpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApCgkJCQlyZXR1cm4gdGhpc1swXSAmJiBqUXVlcnlbIHR5cGUgfHwgImF0dHIiIF0oIHRoaXNbMF0sIG5hbWUgKTsKCgkJCWVsc2UgewoJCQkJb3B0aW9ucyA9IHt9OwoJCQkJb3B0aW9uc1sgbmFtZSBdID0gdmFsdWU7CgkJCX0KCgkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHNldHRpbmcgc3R5bGUgdmFsdWVzCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXsKCQkJLy8gU2V0IGFsbCB0aGUgc3R5bGVzCgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApCgkJCQlqUXVlcnkuYXR0cigKCQkJCQl0eXBlID8KCQkJCQkJdGhpcy5zdHlsZSA6CgkJCQkJCXRoaXMsCgkJCQkJbmFtZSwgalF1ZXJ5LnByb3AoIHRoaXMsIG9wdGlvbnNbIG5hbWUgXSwgdHlwZSwgaSwgbmFtZSApCgkJCQkpOwoJCX0pOwoJfSwKCgljc3M6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCS8vIGlnbm9yZSBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcwoJCWlmICggKGtleSA9PSAnd2lkdGgnIHx8IGtleSA9PSAnaGVpZ2h0JykgJiYgcGFyc2VGbG9hdCh2YWx1ZSkgPCAwICkKCQkJdmFsdWUgPSB1bmRlZmluZWQ7CgkJcmV0dXJuIHRoaXMuYXR0cigga2V5LCB2YWx1ZSwgImN1ckNTUyIgKTsKCX0sCgoJdGV4dDogZnVuY3Rpb24oIHRleHQgKSB7CgkJaWYgKCB0eXBlb2YgdGV4dCAhPT0gIm9iamVjdCIgJiYgdGV4dCAhPSBudWxsICkKCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOwoKCQl2YXIgcmV0ID0gIiI7CgoJCWpRdWVyeS5lYWNoKCB0ZXh0IHx8IHRoaXMsIGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5lYWNoKCB0aGlzLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCl7CgkJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gOCApCgkJCQkJcmV0ICs9IHRoaXMubm9kZVR5cGUgIT0gMSA/CgkJCQkJCXRoaXMubm9kZVZhbHVlIDoKCQkJCQkJalF1ZXJ5LmZuLnRleHQoIFsgdGhpcyBdICk7CgkJCX0pOwoJCX0pOwoKCQlyZXR1cm4gcmV0OwoJfSwKCgl3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCS8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kCgkJCXZhciB3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWzBdLm93bmVyRG9jdW1lbnQgKS5jbG9uZSgpOwoKCQkJaWYgKCB0aGlzWzBdLnBhcmVudE5vZGUgKQoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbMF0gKTsKCgkJCXdyYXAubWFwKGZ1bmN0aW9uKCl7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKQoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7CgoJCQkJcmV0dXJuIGVsZW07CgkJCX0pLmFwcGVuZCh0aGlzKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5KCB0aGlzICkuY29udGVudHMoKS53cmFwQWxsKCBodG1sICk7CgkJfSk7Cgl9LAoKCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbCApOwoJCX0pOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oZWxlbSl7CgkJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCgkJCQl0aGlzLmFwcGVuZENoaWxkKCBlbGVtICk7CgkJfSk7Cgl9LAoKCXByZXBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oZWxlbSl7CgkJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCgkJCQl0aGlzLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5maXJzdENoaWxkICk7CgkJfSk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oZWxlbSl7CgkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQl9KTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKGVsZW0pewoJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJfSk7Cgl9LAoKCWVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCBqUXVlcnkoIFtdICk7Cgl9LAoKCS8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgoJcHVzaDogW10ucHVzaCwKCXNvcnQ6IFtdLnNvcnQsCglzcGxpY2U6IFtdLnNwbGljZSwKCglmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJaWYgKCB0aGlzLmxlbmd0aCA9PT0gMSApIHsKCQkJdmFyIHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSwgImZpbmQiLCBzZWxlY3RvciApOwoJCQlyZXQubGVuZ3RoID0gMDsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCB0aGlzWzBdLCByZXQgKTsKCQkJcmV0dXJuIHJldDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtKXsKCQkJCXJldHVybiBqUXVlcnkuZmluZCggc2VsZWN0b3IsIGVsZW0gKTsKCQkJfSkpLCAiZmluZCIsIHNlbGVjdG9yICk7CgkJfQoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGV2ZW50cyApIHsKCQkvLyBEbyB0aGUgY2xvbmUKCQl2YXIgcmV0ID0gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ICYmICFqUXVlcnkuaXNYTUxEb2ModGhpcykgKSB7CgkJCQkvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuCgkJCQkvLyB1c2luZyBjbG9uZU5vZGUuIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlCgkJCQkvLyBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ25hbAoJCQkJLy8gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2UgaW5uZXJIVE1MLgoJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyBzb21lIG1vZGlmaWNhdGlvbnMgdG8KCQkJCS8vIGF0dHJpYnV0ZXMgaW4gSUUgdGhhdCBhcmUgYWN0dWFsbHkgb25seSBzdG9yZWQKCQkJCS8vIGFzIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQoJCQkJLy8gdGhlIG5hbWUgYXR0cmlidXRlIG9uIGFuIGlucHV0KS4KCQkJCXZhciBodG1sID0gdGhpcy5vdXRlckhUTUw7CgkJCQlpZiAoICFodG1sICkgewoJCQkJCXZhciBkaXYgPSB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJCQkJZGl2LmFwcGVuZENoaWxkKCB0aGlzLmNsb25lTm9kZSh0cnVlKSApOwoJCQkJCWh0bWwgPSBkaXYuaW5uZXJIVE1MOwoJCQkJfQoKCQkJCXJldHVybiBqUXVlcnkuY2xlYW4oW2h0bWwucmVwbGFjZSgvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLCAiIikucmVwbGFjZSgvXlxzKi8sICIiKV0pWzBdOwoJCQl9IGVsc2UKCQkJCXJldHVybiB0aGlzLmNsb25lTm9kZSh0cnVlKTsKCQl9KTsKCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZXZlbnRzID09PSB0cnVlICkgewoJCQl2YXIgb3JpZyA9IHRoaXMuZmluZCgiKiIpLmFuZFNlbGYoKSwgaSA9IDA7CgoJCQlyZXQuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7CgkJCQlpZiAoIHRoaXMubm9kZU5hbWUgIT09IG9yaWdbaV0ubm9kZU5hbWUgKQoJCQkJCXJldHVybjsKCgkJCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoIG9yaWdbaV0sICJldmVudHMiICk7CgoJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJCWZvciAoIHZhciBoYW5kbGVyIGluIGV2ZW50c1sgdHlwZSBdICkgewoJCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLmRhdGEgKTsKCQkJCQl9CgkJCQl9CgoJCQkJaSsrOwoJCQl9KTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiByZXQ7Cgl9LAoKCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgJiYKCQkJalF1ZXJ5LmdyZXAodGhpcywgZnVuY3Rpb24oZWxlbSwgaSl7CgkJCQlyZXR1cm4gc2VsZWN0b3IuY2FsbCggZWxlbSwgaSApOwoJCQl9KSB8fAoKCQkJalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgalF1ZXJ5LmdyZXAodGhpcywgZnVuY3Rpb24oZWxlbSl7CgkJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCQkJfSkgKSwgImZpbHRlciIsIHNlbGVjdG9yICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgcG9zID0galF1ZXJ5LmV4cHIubWF0Y2guUE9TLnRlc3QoIHNlbGVjdG9yICkgPyBqUXVlcnkoc2VsZWN0b3IpIDogbnVsbCwKCQkJY2xvc2VyID0gMDsKCgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CgkJCXZhciBjdXIgPSB0aGlzOwoJCQl3aGlsZSAoIGN1ciAmJiBjdXIub3duZXJEb2N1bWVudCApIHsKCQkJCWlmICggcG9zID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeShjdXIpLmlzKHNlbGVjdG9yKSApIHsKCQkJCQlqUXVlcnkuZGF0YShjdXIsICJjbG9zZXN0IiwgY2xvc2VyKTsKCQkJCQlyZXR1cm4gY3VyOwoJCQkJfQoJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CgkJCQljbG9zZXIrKzsKCQkJfQoJCX0pOwoJfSwKCglub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKQoJCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSB3aGVyZSBqdXN0IG9uZSBzZWxlY3RvciBpcyBwYXNzZWQgaW4KCQkJaWYgKCBpc1NpbXBsZS50ZXN0KCBzZWxlY3RvciApICkKCQkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcywgdHJ1ZSApLCAibm90Iiwgc2VsZWN0b3IgKTsKCQkJZWxzZQoJCQkJc2VsZWN0b3IgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzICk7CgoJCXZhciBpc0FycmF5TGlrZSA9IHNlbGVjdG9yLmxlbmd0aCAmJiBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXSAhPT0gdW5kZWZpbmVkICYmICFzZWxlY3Rvci5ub2RlVHlwZTsKCQlyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCXJldHVybiBpc0FycmF5TGlrZSA/IGpRdWVyeS5pbkFycmF5KCB0aGlzLCBzZWxlY3RvciApIDwgMCA6IHRoaXMgIT0gc2VsZWN0b3I7CgkJfSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZSggalF1ZXJ5Lm1lcmdlKAoJCQl0aGlzLmdldCgpLAoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJCWpRdWVyeSggc2VsZWN0b3IgKSA6CgkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciApCgkJKSkpOwoJfSwKCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXNlbGVjdG9yICYmIGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwOwoJfSwKCgloYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXNlbGVjdG9yICYmIHRoaXMuaXMoICIuIiArIHNlbGVjdG9yICk7Cgl9LAoKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsJCQkKCQkJdmFyIGVsZW0gPSB0aGlzWzBdOwoKCQkJaWYgKCBlbGVtICkgewoJCQkJaWYoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgJ29wdGlvbicgKSApCgkJCQkJcmV0dXJuIChlbGVtLmF0dHJpYnV0ZXMudmFsdWUgfHwge30pLnNwZWNpZmllZCA/IGVsZW0udmFsdWUgOiBlbGVtLnRleHQ7CgkJCQkKCQkJCS8vIFdlIG5lZWQgdG8gaGFuZGxlIHNlbGVjdCBib3hlcyBzcGVjaWFsCgkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInNlbGVjdCIgKSApIHsKCQkJCQl2YXIgaW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsCgkJCQkJCXZhbHVlcyA9IFtdLAoJCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCQlvbmUgPSBlbGVtLnR5cGUgPT0gInNlbGVjdC1vbmUiOwoKCQkJCQkvLyBOb3RoaW5nIHdhcyBzZWxlY3RlZAoJCQkJCWlmICggaW5kZXggPCAwICkKCQkJCQkJcmV0dXJuIG51bGw7CgoJCQkJCS8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnMKCQkJCQlmb3IgKCB2YXIgaSA9IG9uZSA/IGluZGV4IDogMCwgbWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQkJdmFyIG9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKCgkJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkICkgewoJCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZjIHZhbHVlIGZvciB0aGUgb3B0aW9uCgkJCQkJCQl2YWx1ZSA9IGpRdWVyeShvcHRpb24pLnZhbCgpOwoKCQkJCQkJCS8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCgkJCQkJCQlpZiAoIG9uZSApCgkJCQkJCQkJcmV0dXJuIHZhbHVlOwoKCQkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCQl2YWx1ZXMucHVzaCggdmFsdWUgKTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJcmV0dXJuIHZhbHVlczsJCQkJCgkJCQl9CgoJCQkJLy8gRXZlcnl0aGluZyBlbHNlLCB3ZSBqdXN0IGdyYWIgdGhlIHZhbHVlCgkJCQlyZXR1cm4gKGVsZW0udmFsdWUgfHwgIiIpLnJlcGxhY2UoL1xyL2csICIiKTsKCgkJCX0KCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgKQoJCQl2YWx1ZSArPSAnJzsKCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gMSApCgkJCQlyZXR1cm47CgoJCQlpZiAoIGpRdWVyeS5pc0FycmF5KHZhbHVlKSAmJiAvcmFkaW98Y2hlY2tib3gvLnRlc3QoIHRoaXMudHlwZSApICkKCQkJCXRoaXMuY2hlY2tlZCA9IChqUXVlcnkuaW5BcnJheSh0aGlzLnZhbHVlLCB2YWx1ZSkgPj0gMCB8fAoJCQkJCWpRdWVyeS5pbkFycmF5KHRoaXMubmFtZSwgdmFsdWUpID49IDApOwoKCQkJZWxzZSBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVjdCIgKSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KHZhbHVlKTsKCgkJCQlqUXVlcnkoICJvcHRpb24iLCB0aGlzICkuZWFjaChmdW5jdGlvbigpewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSAoalF1ZXJ5LmluQXJyYXkoIHRoaXMudmFsdWUsIHZhbHVlcyApID49IDAgfHwKCQkJCQkJalF1ZXJ5LmluQXJyYXkoIHRoaXMudGV4dCwgdmFsdWVzICkgPj0gMCk7CgkJCQl9KTsKCgkJCQlpZiAoICF2YWx1ZXMubGVuZ3RoICkKCQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKCgkJCX0gZWxzZQoJCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwoJCX0pOwoJfSwKCglodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoJCQkodGhpc1swXSA/CgkJCQl0aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKC8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csICIiKSA6CgkJCQludWxsKSA6CgkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHRoaXMuYWZ0ZXIoIHZhbHVlICkucmVtb3ZlKCk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQlyZXR1cm4gdGhpcy5zbGljZSggaSwgK2kgKyAxICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICksCgkJCSJzbGljZSIsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQl9KSk7Cgl9LAoKCWFuZFNlbGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9LAoKCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgewoJCWlmICggdGhpc1swXSApIHsKCQkJdmFyIGZyYWdtZW50ID0gKHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCB0aGlzWzBdKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksCgkJCQlzY3JpcHRzID0galF1ZXJ5LmNsZWFuKCBhcmdzLCAodGhpc1swXS5vd25lckRvY3VtZW50IHx8IHRoaXNbMF0pLCBmcmFnbWVudCApLAoJCQkJZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkOwoKCQkJaWYgKCBmaXJzdCApCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApCgkJCQkJY2FsbGJhY2suY2FsbCggcm9vdCh0aGlzW2ldLCBmaXJzdCksIHRoaXMubGVuZ3RoID4gMSB8fCBpID4gMCA/CgkJCQkJCQlmcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkgOiBmcmFnbWVudCApOwoJCQoJCQlpZiAoIHNjcmlwdHMgKQoJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGV2YWxTY3JpcHQgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJCQoJCWZ1bmN0aW9uIHJvb3QoIGVsZW0sIGN1ciApIHsKCQkJcmV0dXJuIHRhYmxlICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUiKSAmJiBqUXVlcnkubm9kZU5hbWUoY3VyLCAidHIiKSA/CgkJCQkoZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXSB8fAoJCQkJZWxlbS5hcHBlbmRDaGlsZChlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSkpIDoKCQkJCWVsZW07CgkJfQoJfQp9OwoKLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbgpqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgpmdW5jdGlvbiBldmFsU2NyaXB0KCBpLCBlbGVtICkgewoJaWYgKCBlbGVtLnNyYyApCgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IGVsZW0uc3JjLAoJCQlhc3luYzogZmFsc2UsCgkJCWRhdGFUeXBlOiAic2NyaXB0IgoJCX0pOwoKCWVsc2UKCQlqUXVlcnkuZ2xvYmFsRXZhbCggZWxlbS50ZXh0IHx8IGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lckhUTUwgfHwgIiIgKTsKCglpZiAoIGVsZW0ucGFyZW50Tm9kZSApCgkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7Cn0KCmZ1bmN0aW9uIG5vdygpewoJcmV0dXJuICtuZXcgRGF0ZTsKfQoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCS8vIGNvcHkgcmVmZXJlbmNlIHRvIHRhcmdldCBvYmplY3QKCXZhciB0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sIGkgPSAxLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLCBkZWVwID0gZmFsc2UsIG9wdGlvbnM7CgoJLy8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvbgoJaWYgKCB0eXBlb2YgdGFyZ2V0ID09PSAiYm9vbGVhbiIgKSB7CgkJZGVlcCA9IHRhcmdldDsKCQl0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307CgkJLy8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldAoJCWkgPSAyOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApCgkJdGFyZ2V0ID0ge307CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PSBpICkgewoJCXRhcmdldCA9IHRoaXM7CgkJLS1pOwoJfQoKCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQkJdmFyIHNyYyA9IHRhcmdldFsgbmFtZSBdLCBjb3B5ID0gb3B0aW9uc1sgbmFtZSBdOwoKCQkJCS8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKCQkJCWlmICggdGFyZ2V0ID09PSBjb3B5ICkKCQkJCQljb250aW51ZTsKCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgb2JqZWN0IHZhbHVlcwoJCQkJaWYgKCBkZWVwICYmIGNvcHkgJiYgdHlwZW9mIGNvcHkgPT09ICJvYmplY3QiICYmICFjb3B5Lm5vZGVUeXBlICkKCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIAoJCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQkJc3JjIHx8ICggY29weS5sZW5ndGggIT0gbnVsbCA/IFsgXSA6IHsgfSApCgkJCQkJLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApCgkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBjb3B5OwoKCQkJfQoKCS8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0CglyZXR1cm4gdGFyZ2V0Owp9OwoKLy8gZXhjbHVkZSB0aGUgZm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAp2YXIJZXhjbHVkZSA9IC96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9pLAoJLy8gY2FjaGUgZGVmYXVsdFZpZXcKCWRlZmF1bHRWaWV3ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwge30sCgl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgpqUXVlcnkuZXh0ZW5kKHsKCW5vQ29uZmxpY3Q6IGZ1bmN0aW9uKCBkZWVwICkgewoJCXdpbmRvdy4kID0gXyQ7CgoJCWlmICggZGVlcCApCgkJCXdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5OwoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKCX0sCgoJaXNBcnJheTogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBBcnJheV0iOwoJfSwKCgkvLyBjaGVjayBpZiBhbiBlbGVtZW50IGlzIGluIGEgKG9yIGlzIGFuKSBYTUwgZG9jdW1lbnQKCWlzWE1MRG9jOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJCSEhZWxlbS5vd25lckRvY3VtZW50ICYmIGpRdWVyeS5pc1hNTERvYyggZWxlbS5vd25lckRvY3VtZW50ICk7Cgl9LAoKCS8vIEV2YWx1bGF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dAoJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCBkYXRhICYmIC9cUy8udGVzdChkYXRhKSApIHsKCQkJLy8gSW5zcGlyZWQgYnkgY29kZSBieSBBbmRyZWEgR2lhbW1hcmNoaQoJCQkvLyBodHRwOi8vd2VicmVmbGVjdGlvbi5ibG9nc3BvdC5jb20vMjAwNy8wOC9nbG9iYWwtc2NvcGUtZXZhbHVhdGlvbi1hbmQtZG9tLmh0bWwKCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoKCQkJc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5zY3JpcHRFdmFsICkKCQkJCXNjcmlwdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIGRhdGEgKSApOwoJCQllbHNlCgkJCQlzY3JpcHQudGV4dCA9IGRhdGE7CgoJCQkvLyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgYXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQgYW4gSUU2IGJ1Zy4KCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSkuCgkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOwoJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQl9Cgl9LAoKCW5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gbmFtZS50b1VwcGVyQ2FzZSgpOwoJfSwKCgkvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgllYWNoOiBmdW5jdGlvbiggb2JqZWN0LCBjYWxsYmFjaywgYXJncyApIHsKCQl2YXIgbmFtZSwgaSA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7CgoJCWlmICggYXJncyApIHsKCQkJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkKCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmplY3RbIG5hbWUgXSwgYXJncyApID09PSBmYWxzZSApCgkJCQkJCWJyZWFrOwoJCQl9IGVsc2UKCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKQoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgaSsrIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKQoJCQkJCQlicmVhazsKCgkJLy8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2gKCQl9IGVsc2UgewoJCQlpZiAoIGxlbmd0aCA9PT0gdW5kZWZpbmVkICkgewoJCQkJZm9yICggbmFtZSBpbiBvYmplY3QgKQoJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2JqZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVjdFsgbmFtZSBdICkgPT09IGZhbHNlICkKCQkJCQkJYnJlYWs7CgkJCX0gZWxzZQoJCQkJZm9yICggdmFyIHZhbHVlID0gb2JqZWN0WzBdOwoJCQkJCWkgPCBsZW5ndGggJiYgY2FsbGJhY2suY2FsbCggdmFsdWUsIGksIHZhbHVlICkgIT09IGZhbHNlOyB2YWx1ZSA9IG9iamVjdFsrK2ldICl7fQoJCX0KCgkJcmV0dXJuIG9iamVjdDsKCX0sCgoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCB0eXBlLCBpLCBuYW1lICkgewoJCS8vIEhhbmRsZSBleGVjdXRhYmxlIGZ1bmN0aW9ucwoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKQoJCQl2YWx1ZSA9IHZhbHVlLmNhbGwoIGVsZW0sIGkgKTsKCgkJLy8gSGFuZGxlIHBhc3NpbmcgaW4gYSBudW1iZXIgdG8gYSBDU1MgcHJvcGVydHkKCQlyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiAmJiB0eXBlID09ICJjdXJDU1MiICYmICFleGNsdWRlLnRlc3QoIG5hbWUgKSA/CgkJCXZhbHVlICsgInB4IiA6CgkJCXZhbHVlOwoJfSwKCgljbGFzc05hbWU6IHsKCQkvLyBpbnRlcm5hbCBvbmx5LCB1c2UgYWRkQ2xhc3MoImNsYXNzIikKCQlhZGQ6IGZ1bmN0aW9uKCBlbGVtLCBjbGFzc05hbWVzICkgewoJCQlqUXVlcnkuZWFjaCgoY2xhc3NOYW1lcyB8fCAiIikuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpLCBjbGFzc05hbWUpewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDEgJiYgIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBlbGVtLmNsYXNzTmFtZSwgY2xhc3NOYW1lICkgKQoJCQkJCWVsZW0uY2xhc3NOYW1lICs9IChlbGVtLmNsYXNzTmFtZSA/ICIgIiA6ICIiKSArIGNsYXNzTmFtZTsKCQkJfSk7CgkJfSwKCgkJLy8gaW50ZXJuYWwgb25seSwgdXNlIHJlbW92ZUNsYXNzKCJjbGFzcyIpCgkJcmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKCQkJaWYgKGVsZW0ubm9kZVR5cGUgPT0gMSkKCQkJCWVsZW0uY2xhc3NOYW1lID0gY2xhc3NOYW1lcyAhPT0gdW5kZWZpbmVkID8KCQkJCQlqUXVlcnkuZ3JlcChlbGVtLmNsYXNzTmFtZS5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGNsYXNzTmFtZSl7CgkJCQkJCXJldHVybiAhalF1ZXJ5LmNsYXNzTmFtZS5oYXMoIGNsYXNzTmFtZXMsIGNsYXNzTmFtZSApOwoJCQkJCX0pLmpvaW4oIiAiKSA6CgkJCQkJIiI7CgkJfSwKCgkJLy8gaW50ZXJuYWwgb25seSwgdXNlIGhhc0NsYXNzKCJjbGFzcyIpCgkJaGFzOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lICkgewoJCQlyZXR1cm4gZWxlbSAmJiBqUXVlcnkuaW5BcnJheSggY2xhc3NOYW1lLCAoZWxlbS5jbGFzc05hbWUgfHwgZWxlbSkudG9TdHJpbmcoKS5zcGxpdCgvXHMrLykgKSA+IC0xOwoJCX0KCX0sCgoJLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBwcm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucwoJc3dhcDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkgewoJCXZhciBvbGQgPSB7fTsKCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOwoJCX0KCgkJY2FsbGJhY2suY2FsbCggZWxlbSApOwoKCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlLCBleHRyYSApIHsKCQlpZiAoIG5hbWUgPT0gIndpZHRoIiB8fCBuYW1lID09ICJoZWlnaHQiICkgewoJCQl2YXIgdmFsLCBwcm9wcyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiJibG9jayIgfSwgd2hpY2ggPSBuYW1lID09ICJ3aWR0aCIgPyBbICJMZWZ0IiwgIlJpZ2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXTsKCgkJCWZ1bmN0aW9uIGdldFdIKCkgewoJCQkJdmFsID0gbmFtZSA9PSAid2lkdGgiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0OwoKCQkJCWlmICggZXh0cmEgPT09ICJib3JkZXIiICkKCQkJCQlyZXR1cm47CgoJCQkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoICFleHRyYSApCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMsIHRydWUpKSB8fCAwOwoJCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkKCQkJCQkJdmFsICs9IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgIm1hcmdpbiIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKCQkJCQllbHNlCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJib3JkZXIiICsgdGhpcyArICJXaWR0aCIsIHRydWUpKSB8fCAwOwoJCQkJfSk7CgkJCX0KCgkJCWlmICggZWxlbS5vZmZzZXRXaWR0aCAhPT0gMCApCgkJCQlnZXRXSCgpOwoJCQllbHNlCgkJCQlqUXVlcnkuc3dhcCggZWxlbSwgcHJvcHMsIGdldFdIICk7CgoJCQlyZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh2YWwpKTsKCQl9CgoJCXJldHVybiBqUXVlcnkuY3VyQ1NTKCBlbGVtLCBuYW1lLCBmb3JjZSApOwoJfSwKCgljdXJDU1M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBmb3JjZSApIHsKCQl2YXIgcmV0LCBzdHlsZSA9IGVsZW0uc3R5bGU7CgoJCS8vIFdlIG5lZWQgdG8gaGFuZGxlIG9wYWNpdHkgc3BlY2lhbCBpbiBJRQoJCWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7CgkJCXJldCA9IGpRdWVyeS5hdHRyKCBzdHlsZSwgIm9wYWNpdHkiICk7CgoJCQlyZXR1cm4gcmV0ID09ICIiID8KCQkJCSIxIiA6CgkJCQlyZXQ7CgkJfQoKCQkvLyBNYWtlIHN1cmUgd2UncmUgdXNpbmcgdGhlIHJpZ2h0IG5hbWUgZm9yIGdldHRpbmcgdGhlIGZsb2F0IHZhbHVlCgkJaWYgKCBuYW1lLm1hdGNoKCAvZmxvYXQvaSApICkKCQkJbmFtZSA9IHN0eWxlRmxvYXQ7CgoJCWlmICggIWZvcmNlICYmIHN0eWxlICYmIHN0eWxlWyBuYW1lIF0gKQoJCQlyZXQgPSBzdHlsZVsgbmFtZSBdOwoKCQllbHNlIGlmICggZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKCgkJCS8vIE9ubHkgImZsb2F0IiBpcyBuZWVkZWQgaGVyZQoJCQlpZiAoIG5hbWUubWF0Y2goIC9mbG9hdC9pICkgKQoJCQkJbmFtZSA9ICJmbG9hdCI7CgoJCQluYW1lID0gbmFtZS5yZXBsYWNlKCAvKFtBLVpdKS9nLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CgoJCQl2YXIgY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTsKCgkJCWlmICggY29tcHV0ZWRTdHlsZSApCgkJCQlyZXQgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKTsKCgkJCS8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5CgkJCWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgcmV0ID09ICIiICkKCQkJCXJldCA9ICIxIjsKCgkJfSBlbHNlIGlmICggZWxlbS5jdXJyZW50U3R5bGUgKSB7CgkJCXZhciBjYW1lbENhc2UgPSBuYW1lLnJlcGxhY2UoL1wtKFx3KS9nLCBmdW5jdGlvbihhbGwsIGxldHRlcil7CgkJCQlyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7CgkJCX0pOwoKCQkJcmV0ID0gZWxlbS5jdXJyZW50U3R5bGVbIG5hbWUgXSB8fCBlbGVtLmN1cnJlbnRTdHlsZVsgY2FtZWxDYXNlIF07CgoJCQkvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCgkJCS8vIGh0dHA6Ly9lcmlrLmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8jY29tbWVudC0xMDIyOTEKCgkJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcgoJCQkvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHMKCQkJaWYgKCAhL15cZCsocHgpPyQvaS50ZXN0KCByZXQgKSAmJiAvXlxkLy50ZXN0KCByZXQgKSApIHsKCQkJCS8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKCQkJCXZhciBsZWZ0ID0gc3R5bGUubGVmdCwgcnNMZWZ0ID0gZWxlbS5ydW50aW1lU3R5bGUubGVmdDsKCgkJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gZWxlbS5jdXJyZW50U3R5bGUubGVmdDsKCQkJCXN0eWxlLmxlZnQgPSByZXQgfHwgMDsKCQkJCXJldCA9IHN0eWxlLnBpeGVsTGVmdCArICJweCI7CgoJCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcwoJCQkJc3R5bGUubGVmdCA9IGxlZnQ7CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0OwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCApIHsKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JwoJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKQoJCQljb250ZXh0ID0gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHRbMF0gJiYgY29udGV4dFswXS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OwoKCQkvLyBJZiBhIHNpbmdsZSBzdHJpbmcgaXMgcGFzc2VkIGluIGFuZCBpdCdzIGEgc2luZ2xlIHRhZwoJCS8vIGp1c3QgZG8gYSBjcmVhdGVFbGVtZW50IGFuZCBza2lwIHRoZSByZXN0CgkJaWYgKCAhZnJhZ21lbnQgJiYgZWxlbXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBlbGVtc1swXSA9PT0gInN0cmluZyIgKSB7CgkJCXZhciBtYXRjaCA9IC9ePChcdyspXHMqXC8/PiQvLmV4ZWMoZWxlbXNbMF0pOwoJCQlpZiAoIG1hdGNoICkKCQkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggbWF0Y2hbMV0gKSBdOwoJCX0KCgkJdmFyIHJldCA9IFtdLCBzY3JpcHRzID0gW10sIGRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgoJCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbihpLCBlbGVtKXsKCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gIm51bWJlciIgKQoJCQkJZWxlbSArPSAnJzsKCgkJCWlmICggIWVsZW0gKQoJCQkJcmV0dXJuOwoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCS8vIEZpeCAiWEhUTUwiLXN0eWxlIHRhZ3MgaW4gYWxsIGJyb3dzZXJzCgkJCQllbGVtID0gZWxlbS5yZXBsYWNlKC8oPChcdyspW14+XSo/KVwvPi9nLCBmdW5jdGlvbihhbGwsIGZyb250LCB0YWcpewoJCQkJCXJldHVybiB0YWcubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbXxocnxhcmVhfGVtYmVkKSQvaSkgPwoJCQkJCQlhbGwgOgoJCQkJCQlmcm9udCArICI+PC8iICsgdGFnICsgIj4iOwoJCQkJfSk7CgoJCQkJLy8gVHJpbSB3aGl0ZXNwYWNlLCBvdGhlcndpc2UgaW5kZXhPZiB3b24ndCB3b3JrIGFzIGV4cGVjdGVkCgkJCQl2YXIgdGFncyA9IGVsZW0ucmVwbGFjZSgvXlxzKy8sICIiKS5zdWJzdHJpbmcoMCwgMTApLnRvTG93ZXJDYXNlKCk7CgoJCQkJdmFyIHdyYXAgPQoJCQkJCS8vIG9wdGlvbiBvciBvcHRncm91cAoJCQkJCSF0YWdzLmluZGV4T2YoIjxvcHQiKSAmJgoJCQkJCVsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjxsZWciKSAmJgoJCQkJCVsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0gfHwKCgkJCQkJdGFncy5tYXRjaCgvXjwodGhlYWR8dGJvZHl8dGZvb3R8Y29sZ3xjYXApLykgJiYKCQkJCQlbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjx0ciIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSB8fAoKCQkJCSAJLy8gPHRoZWFkPiBtYXRjaGVkIGFib3ZlCgkJCQkJKCF0YWdzLmluZGV4T2YoIjx0ZCIpIHx8ICF0YWdzLmluZGV4T2YoIjx0aCIpKSAmJgoJCQkJCVsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0gfHwKCgkJCQkJIXRhZ3MuaW5kZXhPZigiPGNvbCIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIgXSB8fAoKCQkJCQkvLyBJRSBjYW4ndCBzZXJpYWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5CgkJCQkJIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgJiYKCQkJCQlbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF0gfHwKCgkJCQkJWyAwLCAiIiwgIiIgXTsKCgkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCgkJCQlkaXYuaW5uZXJIVE1MID0gd3JhcFsxXSArIGVsZW0gKyB3cmFwWzJdOwoKCQkJCS8vIE1vdmUgdG8gdGhlIHJpZ2h0IGRlcHRoCgkJCQl3aGlsZSAoIHdyYXBbMF0tLSApCgkJCQkJZGl2ID0gZGl2Lmxhc3RDaGlsZDsKCgkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQudGJvZHkgKSB7CgoJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KCQkJCQl2YXIgaGFzQm9keSA9IC88dGJvZHkvaS50ZXN0KGVsZW0pLAoJCQkJCQl0Ym9keSA9ICF0YWdzLmluZGV4T2YoIjx0YWJsZSIpICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIGJhcmUgPHRoZWFkPiBvciA8dGZvb3Q+CgkJCQkJCXdyYXBbMV0gPT0gIjx0YWJsZT4iICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5jaGlsZE5vZGVzIDoKCQkJCQkJCVtdOwoKCQkJCQlmb3IgKCB2YXIgaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApCgkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKQoJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgoJCQkJCX0KCgkJCQkvLyBJRSBjb21wbGV0ZWx5IGtpbGxzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIGlubmVySFRNTCBpcyB1c2VkCgkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiAvXlxzLy50ZXN0KCBlbGVtICkgKQoJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0ubWF0Y2goL15ccyovKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoJCQkJCgkJCQllbGVtID0galF1ZXJ5Lm1ha2VBcnJheSggZGl2LmNoaWxkTm9kZXMgKTsKCQkJfQoKCQkJaWYgKCBlbGVtLm5vZGVUeXBlICkKCQkJCXJldC5wdXNoKCBlbGVtICk7CgkJCWVsc2UKCQkJCXJldCA9IGpRdWVyeS5tZXJnZSggcmV0LCBlbGVtICk7CgoJCX0pOwoKCQlpZiAoIGZyYWdtZW50ICkgewoJCQlmb3IgKCB2YXIgaSA9IDA7IHJldFtpXTsgaSsrICkgewoJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHJldFtpXSwgInNjcmlwdCIgKSAmJiAoIXJldFtpXS50eXBlIHx8IHJldFtpXS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICJ0ZXh0L2phdmFzY3JpcHQiKSApIHsKCQkJCQlzY3JpcHRzLnB1c2goIHJldFtpXS5wYXJlbnROb2RlID8gcmV0W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHJldFtpXSApIDogcmV0W2ldICk7CgkJCQl9IGVsc2UgewoJCQkJCWlmICggcmV0W2ldLm5vZGVUeXBlID09PSAxICkKCQkJCQkJcmV0LnNwbGljZS5hcHBseSggcmV0LCBbaSArIDEsIDBdLmNvbmNhdChqUXVlcnkubWFrZUFycmF5KHJldFtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpKSApOwoJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCByZXRbaV0gKTsKCQkJCX0KCQkJfQoJCQkKCQkJcmV0dXJuIHNjcmlwdHM7CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJLy8gZG9uJ3Qgc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICghZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4KQoJCQlyZXR1cm4gdW5kZWZpbmVkOwoKCQl2YXIgbm90eG1sID0gIWpRdWVyeS5pc1hNTERvYyggZWxlbSApLAoJCQkvLyBXaGV0aGVyIHdlIGFyZSBzZXR0aW5nIChvciBnZXR0aW5nKQoJCQlzZXQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkOwoKCQkvLyBUcnkgdG8gbm9ybWFsaXplL2ZpeCB0aGUgbmFtZQoJCW5hbWUgPSBub3R4bWwgJiYgalF1ZXJ5LnByb3BzWyBuYW1lIF0gfHwgbmFtZTsKCgkJLy8gT25seSBkbyBhbGwgdGhlIGZvbGxvd2luZyBpZiB0aGlzIGlzIGEgbm9kZSAoZmFzdGVyIGZvciBzdHlsZSkKCQkvLyBJRSBlbGVtLmdldEF0dHJpYnV0ZSBwYXNzZXMgZXZlbiBmb3Igc3R5bGUKCQlpZiAoIGVsZW0udGFnTmFtZSApIHsKCgkJCS8vIFRoZXNlIGF0dHJpYnV0ZXMgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudAoJCQl2YXIgc3BlY2lhbCA9IC9ocmVmfHNyY3xzdHlsZS8udGVzdCggbmFtZSApOwoKCQkJLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHByb3BlcnR5IG9mIGEgaGlkZGVuIG9wdGlvbgoJCQkvLyBBY2Nlc3NpbmcgdGhlIHBhcmVudCdzIHNlbGVjdGVkSW5kZXggcHJvcGVydHkgZml4ZXMgaXQKCQkJaWYgKCBuYW1lID09ICJzZWxlY3RlZCIgJiYgZWxlbS5wYXJlbnROb2RlICkKCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoKCQkJLy8gSWYgYXBwbGljYWJsZSwgYWNjZXNzIHRoZSBhdHRyaWJ1dGUgdmlhIHRoZSBET00gMCB3YXkKCQkJaWYgKCBuYW1lIGluIGVsZW0gJiYgbm90eG1sICYmICFzcGVjaWFsICkgewoJCQkJaWYgKCBzZXQgKXsKCQkJCQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCgkJCQkJaWYgKCBuYW1lID09ICJ0eXBlIiAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSAmJiBlbGVtLnBhcmVudE5vZGUgKQoJCQkJCQl0aHJvdyAidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIjsKCgkJCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgoJCQkJLy8gYnJvd3NlcnMgaW5kZXggZWxlbWVudHMgYnkgaWQvbmFtZSBvbiBmb3JtcywgZ2l2ZSBwcmlvcml0eSB0byBhdHRyaWJ1dGVzLgoJCQkJaWYoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImZvcm0iICkgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpICkKCQkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkubm9kZVZhbHVlOwoKCQkJCS8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvCgkJCQlpZiAoIG5hbWUgPT0gInRhYkluZGV4IiApIHsKCQkJCQl2YXIgYXR0cmlidXRlTm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggInRhYkluZGV4IiApOwoJCQkJCXJldHVybiBhdHRyaWJ1dGVOb2RlICYmIGF0dHJpYnV0ZU5vZGUuc3BlY2lmaWVkCgkJCQkJCT8gYXR0cmlidXRlTm9kZS52YWx1ZQoJCQkJCQk6IGVsZW0ubm9kZU5hbWUubWF0Y2goLyhidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkvaSkKCQkJCQkJCT8gMAoJCQkJCQkJOiBlbGVtLm5vZGVOYW1lLm1hdGNoKC9eKGF8YXJlYSkkL2kpICYmIGVsZW0uaHJlZgoJCQkJCQkJCT8gMAoJCQkJCQkJCTogdW5kZWZpbmVkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CgkJCX0KCgkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnN0eWxlICYmIG5vdHhtbCAmJiAgbmFtZSA9PSAic3R5bGUiICkKCQkJCXJldHVybiBqUXVlcnkuYXR0ciggZWxlbS5zdHlsZSwgImNzc1RleHQiLCB2YWx1ZSApOwoKCQkJaWYgKCBzZXQgKQoJCQkJLy8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgKGFsbCBicm93c2VycyBkbyB0aGlzIGJ1dCBJRSkgc2VlICMxMDcwCgkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgIiIgKyB2YWx1ZSApOwoKCQkJdmFyIGF0dHIgPSAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgJiYgbm90eG1sICYmIHNwZWNpYWwKCQkJCQkvLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJRQoJCQkJCT8gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDIgKQoJCQkJCTogZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJCS8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCgkJCXJldHVybiBhdHRyID09PSBudWxsID8gdW5kZWZpbmVkIDogYXR0cjsKCQl9CgoJCS8vIGVsZW0gaXMgYWN0dWFsbHkgZWxlbS5zdHlsZSAuLi4gc2V0IHRoZSBzdHlsZQoKCQkvLyBJRSB1c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5vcGFjaXR5ICYmIG5hbWUgPT0gIm9wYWNpdHkiICkgewoJCQlpZiAoIHNldCApIHsKCQkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAoJCQkJLy8gRm9yY2UgaXQgYnkgc2V0dGluZyB0aGUgem9vbSBsZXZlbAoJCQkJZWxlbS56b29tID0gMTsKCgkJCQkvLyBTZXQgdGhlIGFscGhhIGZpbHRlciB0byBzZXQgdGhlIG9wYWNpdHkKCQkJCWVsZW0uZmlsdGVyID0gKGVsZW0uZmlsdGVyIHx8ICIiKS5yZXBsYWNlKCAvYWxwaGFcKFteKV0qXCkvLCAiIiApICsKCQkJCQkocGFyc2VJbnQoIHZhbHVlICkgKyAnJyA9PSAiTmFOIiA/ICIiIDogImFscGhhKG9wYWNpdHk9IiArIHZhbHVlICogMTAwICsgIikiKTsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZmlsdGVyICYmIGVsZW0uZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9IikgPj0gMCA/CgkJCQkocGFyc2VGbG9hdCggZWxlbS5maWx0ZXIubWF0Y2goL29wYWNpdHk9KFteKV0qKS8pWzFdICkgLyAxMDApICsgJyc6CgkJCQkiIjsKCQl9CgoJCW5hbWUgPSBuYW1lLnJlcGxhY2UoLy0oW2Etel0pL2lnLCBmdW5jdGlvbihhbGwsIGxldHRlcil7CgkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKCQl9KTsKCgkJaWYgKCBzZXQgKQoJCQllbGVtWyBuYW1lIF0gPSB2YWx1ZTsKCgkJcmV0dXJuIGVsZW1bIG5hbWUgXTsKCX0sCgoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuICh0ZXh0IHx8ICIiKS5yZXBsYWNlKCAvXlxzK3xccyskL2csICIiICk7Cgl9LAoKCW1ha2VBcnJheTogZnVuY3Rpb24oIGFycmF5ICkgewoJCXZhciByZXQgPSBbXTsKCgkJaWYoIGFycmF5ICE9IG51bGwgKXsKCQkJdmFyIGkgPSBhcnJheS5sZW5ndGg7CgkJCS8vIFRoZSB3aW5kb3csIHN0cmluZ3MgKGFuZCBmdW5jdGlvbnMpIGFsc28gaGF2ZSAnbGVuZ3RoJwoJCQlpZiggaSA9PSBudWxsIHx8IHR5cGVvZiBhcnJheSA9PT0gInN0cmluZyIgfHwgalF1ZXJ5LmlzRnVuY3Rpb24oYXJyYXkpIHx8IGFycmF5LnNldEludGVydmFsICkKCQkJCXJldFswXSA9IGFycmF5OwoJCQllbHNlCgkJCQl3aGlsZSggaSApCgkJCQkJcmV0Wy0taV0gPSBhcnJheVtpXTsKCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCWluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnJheSApIHsKCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkKCQkvLyBVc2UgPT09IGJlY2F1c2Ugb24gSUUsIHdpbmRvdyA9PSBkb2N1bWVudAoJCQlpZiAoIGFycmF5WyBpIF0gPT09IGVsZW0gKQoJCQkJcmV0dXJuIGk7CgoJCXJldHVybiAtMTsKCX0sCgoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCS8vIFdlIGhhdmUgdG8gbG9vcCB0aGlzIHdheSBiZWNhdXNlIElFICYgT3BlcmEgb3ZlcndyaXRlIHRoZSBsZW5ndGgKCQkvLyBleHBhbmRvIG9mIGdldEVsZW1lbnRzQnlUYWdOYW1lCgkJdmFyIGkgPSAwLCBlbGVtLCBwb3MgPSBmaXJzdC5sZW5ndGg7CgkJLy8gQWxzbywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29ycmVjdCBlbGVtZW50cyBhcmUgYmVpbmcgcmV0dXJuZWQKCQkvLyAoSUUgcmV0dXJucyBjb21tZW50IG5vZGVzIGluIGEgJyonIHF1ZXJ5KQoJCWlmICggIWpRdWVyeS5zdXBwb3J0LmdldEFsbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IHNlY29uZFsgaSsrIF0pICE9IG51bGwgKQoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlICE9IDggKQoJCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCgkJfSBlbHNlCgkJCXdoaWxlICggKGVsZW0gPSBzZWNvbmRbIGkrKyBdKSAhPSBudWxsICkKCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCgkJcmV0dXJuIGZpcnN0OwoJfSwKCgl1bmlxdWU6IGZ1bmN0aW9uKCBhcnJheSApIHsKCQl2YXIgcmV0ID0gW10sIGRvbmUgPSB7fTsKCgkJdHJ5IHsKCgkJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YXIgaWQgPSBqUXVlcnkuZGF0YSggYXJyYXlbIGkgXSApOwoKCQkJCWlmICggIWRvbmVbIGlkIF0gKSB7CgkJCQkJZG9uZVsgaWQgXSA9IHRydWU7CgkJCQkJcmV0LnB1c2goIGFycmF5WyBpIF0gKTsKCQkJCX0KCQkJfQoKCQl9IGNhdGNoKCBlICkgewoJCQlyZXQgPSBhcnJheTsKCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCWdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludiApIHsKCQl2YXIgcmV0ID0gW107CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKQoJCQlpZiAoICFpbnYgIT0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICkgKQoJCQkJcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKCgkJcmV0dXJuIHJldDsKCX0sCgoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrICkgewoJCXZhciByZXQgPSBbXTsKCgkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyCgkJLy8gbmV3IHZhbHVlIChvciB2YWx1ZXMpLgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCXZhciB2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgoJCQlpZiAoIHZhbHVlICE9IG51bGwgKQoJCQkJcmV0WyByZXQubGVuZ3RoIF0gPSB2YWx1ZTsKCQl9CgoJCXJldHVybiByZXQuY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7Cgl9Cn0pOwoKLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGRlcHJlY2F0ZWQuCi8vIEl0J3MgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBwbHVnaW5zLAovLyBhbHRob3VnaCB0aGV5IHNob3VsZCB3b3JrIHRvIG1pZ3JhdGUgYXdheS4KCnZhciB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CgovLyBGaWd1cmUgb3V0IHdoYXQgYnJvd3NlciBpcyBiZWluZyB1c2VkCmpRdWVyeS5icm93c2VyID0gewoJdmVyc2lvbjogKHVzZXJBZ2VudC5tYXRjaCggLy4rKD86cnZ8aXR8cmF8aWUpW1wvOiBdKFtcZC5dKykvICkgfHwgWzAsJzAnXSlbMV0sCglzYWZhcmk6IC93ZWJraXQvLnRlc3QoIHVzZXJBZ2VudCApLAoJb3BlcmE6IC9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCgltc2llOiAvbXNpZS8udGVzdCggdXNlckFnZW50ICkgJiYgIS9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCgltb3ppbGxhOiAvbW96aWxsYS8udGVzdCggdXNlckFnZW50ICkgJiYgIS8oY29tcGF0aWJsZXx3ZWJraXQpLy50ZXN0KCB1c2VyQWdlbnQgKQp9OwoKalF1ZXJ5LmVhY2goewoJcGFyZW50OiBmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5wYXJlbnROb2RlO30sCglwYXJlbnRzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwYXJlbnROb2RlIik7fSwKCW5leHQ6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwibmV4dFNpYmxpbmciKTt9LAoJcHJldjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJwcmV2aW91c1NpYmxpbmciKTt9LAoJbmV4dEFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwibmV4dFNpYmxpbmciKTt9LAoJcHJldkFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicHJldmlvdXNTaWJsaW5nIik7fSwKCXNpYmxpbmdzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsZWxlbSk7fSwKCWNoaWxkcmVuOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5maXJzdENoaWxkKTt9LAoJY29udGVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubm9kZU5hbWUoZWxlbSwiaWZyYW1lIik/ZWxlbS5jb250ZW50RG9jdW1lbnR8fGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudDpqUXVlcnkubWFrZUFycmF5KGVsZW0uY2hpbGROb2Rlcyk7fQp9LCBmdW5jdGlvbihuYW1lLCBmbil7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4gKTsKCgkJaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT0gInN0cmluZyIgKQoJCQlyZXQgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKCByZXQgKSwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKG5hbWUsIG9yaWdpbmFsKXsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBbXSwgaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApOwoKCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbnNlcnQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQl2YXIgZWxlbXMgPSAoaSA+IDAgPyB0aGlzLmNsb25lKHRydWUpIDogdGhpcykuZ2V0KCk7CgkJCWpRdWVyeS5mblsgb3JpZ2luYWwgXS5hcHBseSggalF1ZXJ5KGluc2VydFtpXSksIGVsZW1zICk7CgkJCXJldCA9IHJldC5jb25jYXQoIGVsZW1zICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2goewoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7CgkJalF1ZXJ5LmF0dHIoIHRoaXMsIG5hbWUsICIiICk7CgkJaWYgKHRoaXMubm9kZVR5cGUgPT0gMSkKCQkJdGhpcy5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCX0sCgoJYWRkQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzICkgewoJCWpRdWVyeS5jbGFzc05hbWUuYWRkKCB0aGlzLCBjbGFzc05hbWVzICk7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggY2xhc3NOYW1lcyApIHsKCQlqUXVlcnkuY2xhc3NOYW1lLnJlbW92ZSggdGhpcywgY2xhc3NOYW1lcyApOwoJfSwKCgl0b2dnbGVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMsIHN0YXRlICkgewoJCWlmKCB0eXBlb2Ygc3RhdGUgIT09ICJib29sZWFuIiApCgkJCXN0YXRlID0gIWpRdWVyeS5jbGFzc05hbWUuaGFzKCB0aGlzLCBjbGFzc05hbWVzICk7CgkJalF1ZXJ5LmNsYXNzTmFtZVsgc3RhdGUgPyAiYWRkIiA6ICJyZW1vdmUiIF0oIHRoaXMsIGNsYXNzTmFtZXMgKTsKCX0sCgoJcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJaWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIFsgdGhpcyBdICkubGVuZ3RoICkgewoJCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrcwoJCQlqUXVlcnkoICIqIiwgdGhpcyApLmFkZChbdGhpc10pLmVhY2goZnVuY3Rpb24oKXsKCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUodGhpcyk7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSh0aGlzKTsKCQkJfSk7CgkJCWlmICh0aGlzLnBhcmVudE5vZGUpCgkJCQl0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMgKTsKCQl9Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQlqUXVlcnkodGhpcykuY2hpbGRyZW4oKS5yZW1vdmUoKTsKCgkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXMKCQl3aGlsZSAoIHRoaXMuZmlyc3RDaGlsZCApCgkJCXRoaXMucmVtb3ZlQ2hpbGQoIHRoaXMuZmlyc3RDaGlsZCApOwoJfQp9LCBmdW5jdGlvbihuYW1lLCBmbil7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCl7CgkJcmV0dXJuIHRoaXMuZWFjaCggZm4sIGFyZ3VtZW50cyApOwoJfTsKfSk7CgovLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgZGltZW5zaW9ucyBhbmQgb2Zmc2V0IG1vZHVsZXMKZnVuY3Rpb24gbnVtKGVsZW0sIHByb3ApIHsKCXJldHVybiBlbGVtWzBdICYmIHBhcnNlSW50KCBqUXVlcnkuY3VyQ1NTKGVsZW1bMF0sIHByb3AsIHRydWUpLCAxMCApIHx8IDA7Cn0KdmFyIGV4cGFuZG8gPSAialF1ZXJ5IiArIG5vdygpLCB1dWlkID0gMCwgd2luZG93RGF0YSA9IHt9OwoKalF1ZXJ5LmV4dGVuZCh7CgljYWNoZToge30sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJZWxlbSA9IGVsZW0gPT0gd2luZG93ID8KCQkJd2luZG93RGF0YSA6CgkJCWVsZW07CgoJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsKCgkJLy8gQ29tcHV0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhlIGVsZW1lbnQKCQlpZiAoICFpZCApCgkJCWlkID0gZWxlbVsgZXhwYW5kbyBdID0gKyt1dWlkOwoKCQkvLyBPbmx5IGdlbmVyYXRlIHRoZSBkYXRhIGNhY2hlIGlmIHdlJ3JlCgkJLy8gdHJ5aW5nIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIGl0CgkJaWYgKCBuYW1lICYmICFqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQlqUXVlcnkuY2FjaGVbIGlkIF0gPSB7fTsKCgkJLy8gUHJldmVudCBvdmVycmlkaW5nIHRoZSBuYW1lZCBjYWNoZSB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMKCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApCgkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdID0gZGF0YTsKCgkJLy8gUmV0dXJuIHRoZSBuYW1lZCBjYWNoZSBkYXRhLCBvciB0aGUgSUQgZm9yIHRoZSBlbGVtZW50CgkJcmV0dXJuIG5hbWUgPwoJCQlqUXVlcnkuY2FjaGVbIGlkIF1bIG5hbWUgXSA6CgkJCWlkOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPwoJCQl3aW5kb3dEYXRhIDoKCQkJZWxlbTsKCgkJdmFyIGlkID0gZWxlbVsgZXhwYW5kbyBdOwoKCQkvLyBJZiB3ZSB3YW50IHRvIHJlbW92ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJaWYgKCBuYW1lICkgewoJCQlpZiAoIGpRdWVyeS5jYWNoZVsgaWQgXSApIHsKCQkJCS8vIFJlbW92ZSB0aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhCgkJCQlkZWxldGUgalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF07CgoJCQkJLy8gSWYgd2UndmUgcmVtb3ZlZCBhbGwgdGhlIGRhdGEsIHJlbW92ZSB0aGUgZWxlbWVudCdzIGNhY2hlCgkJCQluYW1lID0gIiI7CgoJCQkJZm9yICggbmFtZSBpbiBqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQkJCWJyZWFrOwoKCQkJCWlmICggIW5hbWUgKQoJCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtICk7CgkJCX0KCgkJLy8gT3RoZXJ3aXNlLCB3ZSB3YW50IHRvIHJlbW92ZSBhbGwgb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJfSBlbHNlIHsKCQkJLy8gQ2xlYW4gdXAgdGhlIGVsZW1lbnQgZXhwYW5kbwoJCQl0cnkgewoJCQkJZGVsZXRlIGVsZW1bIGV4cGFuZG8gXTsKCQkJfSBjYXRjaChlKXsKCQkJCS8vIElFIGhhcyB0cm91YmxlIGRpcmVjdGx5IHJlbW92aW5nIHRoZSBleHBhbmRvCgkJCQkvLyBidXQgaXQncyBvayB3aXRoIHVzaW5nIHJlbW92ZUF0dHJpYnV0ZQoJCQkJaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApCgkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGV4cGFuZG8gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGVseSByZW1vdmUgdGhlIGRhdGEgY2FjaGUKCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsgaWQgXTsKCQl9Cgl9LAoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCWlmICggZWxlbSApewoJCgkJCXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJxdWV1ZSI7CgkKCQkJdmFyIHEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSApOwoJCgkJCWlmICggIXEgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgKQoJCQkJcSA9IGpRdWVyeS5kYXRhKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7CgkJCWVsc2UgaWYoIGRhdGEgKQoJCQkJcS5wdXNoKCBkYXRhICk7CgkKCQl9CgkJcmV0dXJuIHE7Cgl9LAoKCWRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICl7CgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkKCQlpZiggIXR5cGUgfHwgdHlwZSA9PT0gImZ4IiApCgkJCWZuID0gcXVldWVbMF07CgkJCQoJCWlmKCBmbiAhPT0gdW5kZWZpbmVkICkKCQkJZm4uY2FsbChlbGVtKTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICl7CgkJdmFyIHBhcnRzID0ga2V5LnNwbGl0KCIuIik7CgkJcGFydHNbMV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7CgoJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJdmFyIGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoICkKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoJCX0gZWxzZQoJCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF0sIHZhbHVlXSkuZWFjaChmdW5jdGlvbigpewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSk7Cgl9LAoKCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTsKCQl9KTsKCX0sCglxdWV1ZTogZnVuY3Rpb24odHlwZSwgZGF0YSl7CgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCWRhdGEgPSB0eXBlOwoJCQl0eXBlID0gImZ4IjsKCQl9CgoJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOwoJCQkKCQkJIGlmKCB0eXBlID09ICJmeCIgJiYgcXVldWUubGVuZ3RoID09IDEgKQoJCQkJcXVldWVbMF0uY2FsbCh0aGlzKTsKCQl9KTsKCX0sCglkZXF1ZXVlOiBmdW5jdGlvbih0eXBlKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSk7Cgl9Cn0pOy8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSAtIHYwLjkuMwogKiAgQ29weXJpZ2h0IDIwMDksIFRoZSBEb2pvIEZvdW5kYXRpb24KICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9zaXp6bGVqcy5jb20vCiAqLwooZnVuY3Rpb24oKXsKCnZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15bXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPy9nLAoJZG9uZSA9IDAsCgl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7Cgp2YXIgU2l6emxlID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQpIHsKCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOwoJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKQoJCXJldHVybiBbXTsKCQoJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4gcmVzdWx0czsKCX0KCgl2YXIgcGFydHMgPSBbXSwgbSwgc2V0LCBjaGVja1NldCwgY2hlY2ssIG1vZGUsIGV4dHJhLCBwcnVuZSA9IHRydWU7CgkKCS8vIFJlc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2h1bmtlciByZWdleHAgKHN0YXJ0IGZyb20gaGVhZCkKCWNodW5rZXIubGFzdEluZGV4ID0gMDsKCQoJd2hpbGUgKCAobSA9IGNodW5rZXIuZXhlYyhzZWxlY3RvcikpICE9PSBudWxsICkgewoJCXBhcnRzLnB1c2goIG1bMV0gKTsKCQkKCQlpZiAoIG1bMl0gKSB7CgkJCWV4dHJhID0gUmVnRXhwLnJpZ2h0Q29udGV4dDsKCQkJYnJlYWs7CgkJfQoJfQoKCWlmICggcGFydHMubGVuZ3RoID4gMSAmJiBvcmlnUE9TLmV4ZWMoIHNlbGVjdG9yICkgKSB7CgkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsKCQkJc2V0ID0gcG9zUHJvY2VzcyggcGFydHNbMF0gKyBwYXJ0c1sxXSwgY29udGV4dCApOwoJCX0gZWxzZSB7CgkJCXNldCA9IEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gPwoJCQkJWyBjb250ZXh0IF0gOgoJCQkJU2l6emxlKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0ICk7CgoJCQl3aGlsZSAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCXNlbGVjdG9yID0gcGFydHMuc2hpZnQoKTsKCgkJCQlpZiAoIEV4cHIucmVsYXRpdmVbIHNlbGVjdG9yIF0gKQoJCQkJCXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CgoJCQkJc2V0ID0gcG9zUHJvY2Vzcyggc2VsZWN0b3IsIHNldCApOwoJCQl9CgkJfQoJfSBlbHNlIHsKCQl2YXIgcmV0ID0gc2VlZCA/CgkJCXsgZXhwcjogcGFydHMucG9wKCksIHNldDogbWFrZUFycmF5KHNlZWQpIH0gOgoJCQlTaXp6bGUuZmluZCggcGFydHMucG9wKCksIHBhcnRzLmxlbmd0aCA9PT0gMSAmJiBjb250ZXh0LnBhcmVudE5vZGUgPyBjb250ZXh0LnBhcmVudE5vZGUgOiBjb250ZXh0LCBpc1hNTChjb250ZXh0KSApOwoJCXNldCA9IFNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0ICk7CgoJCWlmICggcGFydHMubGVuZ3RoID4gMCApIHsKCQkJY2hlY2tTZXQgPSBtYWtlQXJyYXkoc2V0KTsKCQl9IGVsc2UgewoJCQlwcnVuZSA9IGZhbHNlOwoJCX0KCgkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCXZhciBjdXIgPSBwYXJ0cy5wb3AoKSwgcG9wID0gY3VyOwoKCQkJaWYgKCAhRXhwci5yZWxhdGl2ZVsgY3VyIF0gKSB7CgkJCQljdXIgPSAiIjsKCQkJfSBlbHNlIHsKCQkJCXBvcCA9IHBhcnRzLnBvcCgpOwoJCQl9CgoJCQlpZiAoIHBvcCA9PSBudWxsICkgewoJCQkJcG9wID0gY29udGV4dDsKCQkJfQoKCQkJRXhwci5yZWxhdGl2ZVsgY3VyIF0oIGNoZWNrU2V0LCBwb3AsIGlzWE1MKGNvbnRleHQpICk7CgkJfQoJfQoKCWlmICggIWNoZWNrU2V0ICkgewoJCWNoZWNrU2V0ID0gc2V0OwoJfQoKCWlmICggIWNoZWNrU2V0ICkgewoJCXRocm93ICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgKGN1ciB8fCBzZWxlY3Rvcik7Cgl9CgoJaWYgKCB0b1N0cmluZy5jYWxsKGNoZWNrU2V0KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKCQlpZiAoICFwcnVuZSApIHsKCQkJcmVzdWx0cy5wdXNoLmFwcGx5KCByZXN1bHRzLCBjaGVja1NldCApOwoJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZVR5cGUgPT09IDEgKSB7CgkJCWZvciAoIHZhciBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgY29udGFpbnMoY29udGV4dCwgY2hlY2tTZXRbaV0pKSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CgkJCQl9CgkJCX0KCQl9Cgl9IGVsc2UgewoJCW1ha2VBcnJheSggY2hlY2tTZXQsIHJlc3VsdHMgKTsKCX0KCglpZiAoIGV4dHJhICkgewoJCVNpenpsZSggZXh0cmEsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKCgkJaWYgKCBzb3J0T3JkZXIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IGZhbHNlOwoJCQlyZXN1bHRzLnNvcnQoc29ydE9yZGVyKTsKCgkJCWlmICggaGFzRHVwbGljYXRlICkgewoJCQkJZm9yICggdmFyIGkgPSAxOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKyApIHsKCQkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbaS0xXSApIHsKCQkJCQkJcmVzdWx0cy5zcGxpY2UoaS0tLCAxKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgpTaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKGV4cHIsIHNldCl7CglyZXR1cm4gU2l6emxlKGV4cHIsIG51bGwsIG51bGwsIHNldCk7Cn07CgpTaXp6bGUuZmluZCA9IGZ1bmN0aW9uKGV4cHIsIGNvbnRleHQsIGlzWE1MKXsKCXZhciBzZXQsIG1hdGNoOwoKCWlmICggIWV4cHIgKSB7CgkJcmV0dXJuIFtdOwoJfQoKCWZvciAoIHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciB0eXBlID0gRXhwci5vcmRlcltpXSwgbWF0Y2g7CgkJCgkJaWYgKCAobWF0Y2ggPSBFeHByLm1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSApIHsKCQkJdmFyIGxlZnQgPSBSZWdFeHAubGVmdENvbnRleHQ7CgoJCQlpZiAoIGxlZnQuc3Vic3RyKCBsZWZ0Lmxlbmd0aCAtIDEgKSAhPT0gIlxcIiApIHsKCQkJCW1hdGNoWzFdID0gKG1hdGNoWzFdIHx8ICIiKS5yZXBsYWNlKC9cXC9nLCAiIik7CgkJCQlzZXQgPSBFeHByLmZpbmRbIHR5cGUgXSggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICk7CgkJCQlpZiAoIHNldCAhPSBudWxsICkgewoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAoICFzZXQgKSB7CgkJc2V0ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOwoJfQoKCXJldHVybiB7c2V0OiBzZXQsIGV4cHI6IGV4cHJ9Owp9OwoKU2l6emxlLmZpbHRlciA9IGZ1bmN0aW9uKGV4cHIsIHNldCwgaW5wbGFjZSwgbm90KXsKCXZhciBvbGQgPSBleHByLCByZXN1bHQgPSBbXSwgY3VyTG9vcCA9IHNldCwgbWF0Y2gsIGFueUZvdW5kLAoJCWlzWE1MRmlsdGVyID0gc2V0ICYmIHNldFswXSAmJiBpc1hNTChzZXRbMF0pOwoKCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgewoJCWZvciAoIHZhciB0eXBlIGluIEV4cHIuZmlsdGVyICkgewoJCQlpZiAoIChtYXRjaCA9IEV4cHIubWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICE9IG51bGwgKSB7CgkJCQl2YXIgZmlsdGVyID0gRXhwci5maWx0ZXJbIHR5cGUgXSwgZm91bmQsIGl0ZW07CgkJCQlhbnlGb3VuZCA9IGZhbHNlOwoKCQkJCWlmICggY3VyTG9vcCA9PSByZXN1bHQgKSB7CgkJCQkJcmVzdWx0ID0gW107CgkJCQl9CgoJCQkJaWYgKCBFeHByLnByZUZpbHRlclsgdHlwZSBdICkgewoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOwoKCQkJCQlpZiAoICFtYXRjaCApIHsKCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CgkJCQkJfSBlbHNlIGlmICggbWF0Y2ggPT09IHRydWUgKSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoIG1hdGNoICkgewoJCQkJCWZvciAoIHZhciBpID0gMDsgKGl0ZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCQkJCWlmICggaXRlbSApIHsKCQkJCQkJCWZvdW5kID0gZmlsdGVyKCBpdGVtLCBtYXRjaCwgaSwgY3VyTG9vcCApOwoJCQkJCQkJdmFyIHBhc3MgPSBub3QgXiAhIWZvdW5kOwoKCQkJCQkJCWlmICggaW5wbGFjZSAmJiBmb3VuZCAhPSBudWxsICkgewoJCQkJCQkJCWlmICggcGFzcyApIHsKCQkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgewoJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CgkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZm91bmQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQljdXJMb29wID0gcmVzdWx0OwoJCQkJCX0KCgkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOwoKCQkJCQlpZiAoICFhbnlGb3VuZCApIHsKCQkJCQkJcmV0dXJuIFtdOwoJCQkJCX0KCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KCQlpZiAoIGV4cHIgPT0gb2xkICkgewoJCQlpZiAoIGFueUZvdW5kID09IG51bGwgKSB7CgkJCQl0aHJvdyAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIGV4cHI7CgkJCX0gZWxzZSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJb2xkID0gZXhwcjsKCX0KCglyZXR1cm4gY3VyTG9vcDsKfTsKCnZhciBFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCW9yZGVyOiBbICJJRCIsICJOQU1FIiwgIlRBRyIgXSwKCW1hdGNoOiB7CgkJSUQ6IC8jKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLywKCQlDTEFTUzogL1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLywKCQlOQU1FOiAvXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspWyciXSpcXS8sCgkJQVRUUjogL1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKFsnIl0qKSguKj8pXDN8KVxzKlxdLywKCQlUQUc6IC9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKl8tXXxcXC4pKykvLAoJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoKGV2ZW58b2RkfFtcZG4rLV0qKVwpKT8vLAoJCVBPUzogLzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXi1dfCQpLywKCQlQU0VVRE86IC86KCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspKD86XCgoWyciXSopKCg/OlwoW15cKV0rXCl8W15cMlwoXCldKikrKVwyXCkpPy8KCX0sCglhdHRyTWFwOiB7CgkJImNsYXNzIjogImNsYXNzTmFtZSIsCgkJImZvciI6ICJodG1sRm9yIgoJfSwKCWF0dHJIYW5kbGU6IHsKCQlocmVmOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIik7CgkJfQoJfSwKCXJlbGF0aXZlOiB7CgkJIisiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciLAoJCQkJaXNUYWcgPSBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSwKCQkJCWlzUGFydFN0ck5vdFRhZyA9IGlzUGFydFN0ciAmJiAhaXNUYWc7CgoJCQlpZiAoIGlzVGFnICYmICFpc1hNTCApIHsKCQkJCXBhcnQgPSBwYXJ0LnRvVXBwZXJDYXNlKCk7CgkJCX0KCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aCwgZWxlbTsgaSA8IGw7IGkrKyApIHsKCQkJCWlmICggKGVsZW0gPSBjaGVja1NldFtpXSkgKSB7CgkJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW0ucHJldmlvdXNTaWJsaW5nKSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICkge30KCgkJCQkJY2hlY2tTZXRbaV0gPSBpc1BhcnRTdHJOb3RUYWcgfHwgZWxlbSAmJiBlbGVtLm5vZGVOYW1lID09PSBwYXJ0ID8KCQkJCQkJZWxlbSB8fCBmYWxzZSA6CgkJCQkJCWVsZW0gPT09IHBhcnQ7CgkJCQl9CgkJCX0KCgkJCWlmICggaXNQYXJ0U3RyTm90VGFnICkgewoJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKCQkJfQoJCX0sCgkJIj4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciOwoKCQkJaWYgKCBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSApIHsKCQkJCXBhcnQgPSBpc1hNTCA/IHBhcnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CgkJCQkJaWYgKCBlbGVtICkgewoJCQkJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOwoJCQkJCQljaGVja1NldFtpXSA9IHBhcmVudC5ub2RlTmFtZSA9PT0gcGFydCA/IHBhcmVudCA6IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJY2hlY2tTZXRbaV0gPSBpc1BhcnRTdHIgPwoJCQkJCQkJZWxlbS5wYXJlbnROb2RlIDoKCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA9PT0gcGFydDsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBpc1BhcnRTdHIgKSB7CgkJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKCQkJCX0KCQkJfQoJCX0sCgkJIiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CgkJCXZhciBkb25lTmFtZSA9IGRvbmUrKywgY2hlY2tGbiA9IGRpckNoZWNrOwoKCQkJaWYgKCAhcGFydC5tYXRjaCgvXFcvKSApIHsKCQkJCXZhciBub2RlQ2hlY2sgPSBwYXJ0ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOwoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKCQkJfQoKCQkJY2hlY2tGbigicGFyZW50Tm9kZSIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCk7CgkJfSwKCQkifiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CgkJCXZhciBkb25lTmFtZSA9IGRvbmUrKywgY2hlY2tGbiA9IGRpckNoZWNrOwoKCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIXBhcnQubWF0Y2goL1xXLykgKSB7CgkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBlckNhc2UoKTsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oInByZXZpb3VzU2libGluZyIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCk7CgkJfQoJfSwKCWZpbmQ6IHsKCQlJRDogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgewoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKCQkJCXJldHVybiBtID8gW21dIDogW107CgkJCX0KCQl9LAoJCU5BTUU6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJdmFyIHJldCA9IFtdLCByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZShtYXRjaFsxXSk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBtYXRjaFsxXSApIHsKCQkJCQkJcmV0LnB1c2goIHJlc3VsdHNbaV0gKTsKCQkJCQl9CgkJCQl9CgoJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OwoJCQl9CgkJfSwKCQlUQUc6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0KXsKCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOwoJCX0KCX0sCglwcmVGaWx0ZXI6IHsKCQlDTEFTUzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCl7CgkJCW1hdGNoID0gIiAiICsgbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpICsgIiAiOwoKCQkJaWYgKCBpc1hNTCApIHsKCQkJCXJldHVybiBtYXRjaDsKCQkJfQoKCQkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGN1ckxvb3BbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJCWlmICggZWxlbSApIHsKCQkJCQlpZiAoIG5vdCBeIChlbGVtLmNsYXNzTmFtZSAmJiAoIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIpLmluZGV4T2YobWF0Y2gpID49IDApICkgewoJCQkJCQlpZiAoICFpbnBsYWNlICkKCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CgkJCQkJfSBlbHNlIGlmICggaW5wbGFjZSApIHsKCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0sCgkJSUQ6IGZ1bmN0aW9uKG1hdGNoKXsKCQkJcmV0dXJuIG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKTsKCQl9LAoJCVRBRzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3ApewoJCQlmb3IgKCB2YXIgaSA9IDA7IGN1ckxvb3BbaV0gPT09IGZhbHNlOyBpKysgKXt9CgkJCXJldHVybiBjdXJMb29wW2ldICYmIGlzWE1MKGN1ckxvb3BbaV0pID8gbWF0Y2hbMV0gOiBtYXRjaFsxXS50b1VwcGVyQ2FzZSgpOwoJCX0sCgkJQ0hJTEQ6IGZ1bmN0aW9uKG1hdGNoKXsKCQkJaWYgKCBtYXRjaFsxXSA9PSAibnRoIiApIHsKCQkJCS8vIHBhcnNlIGVxdWF0aW9ucyBsaWtlICdldmVuJywgJ29kZCcsICc1JywgJzJuJywgJzNuKzInLCAnNG4tMScsICctbis2JwoJCQkJdmFyIHRlc3QgPSAvKC0/KShcZCopbigoPzpcK3wtKT9cZCopLy5leGVjKAoJCQkJCW1hdGNoWzJdID09ICJldmVuIiAmJiAiMm4iIHx8IG1hdGNoWzJdID09ICJvZGQiICYmICIybisxIiB8fAoJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CgoJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOwoJCQkJbWF0Y2hbM10gPSB0ZXN0WzNdIC0gMDsKCQkJfQoKCQkJLy8gVE9ETzogTW92ZSB0byBub3JtYWwgY2FjaGluZyBzeXN0ZW0KCQkJbWF0Y2hbMF0gPSBkb25lKys7CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCQlBVFRSOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7CgkJCQoJCQlpZiAoICFpc1hNTCAmJiBFeHByLmF0dHJNYXBbbmFtZV0gKSB7CgkJCQltYXRjaFsxXSA9IEV4cHIuYXR0ck1hcFtuYW1lXTsKCQkJfQoKCQkJaWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKCQkJCW1hdGNoWzRdID0gIiAiICsgbWF0Y2hbNF0gKyAiICI7CgkJCX0KCgkJCXJldHVybiBtYXRjaDsKCQl9LAoJCVBTRVVETzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90KXsKCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CgkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQoJCQkJaWYgKCBtYXRjaFszXS5tYXRjaChjaHVua2VyKS5sZW5ndGggPiAxIHx8IC9eXHcvLnRlc3QobWF0Y2hbM10pICkgewoJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKCQkJCX0gZWxzZSB7CgkJCQkJdmFyIHJldCA9IFNpenpsZS5maWx0ZXIobWF0Y2hbM10sIGN1ckxvb3AsIGlucGxhY2UsIHRydWUgXiBub3QpOwoJCQkJCWlmICggIWlucGxhY2UgKSB7CgkJCQkJCXJlc3VsdC5wdXNoLmFwcGx5KCByZXN1bHQsIHJldCApOwoJCQkJCX0KCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0gZWxzZSBpZiAoIEV4cHIubWF0Y2guUE9TLnRlc3QoIG1hdGNoWzBdICkgfHwgRXhwci5tYXRjaC5DSElMRC50ZXN0KCBtYXRjaFswXSApICkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJCgkJCXJldHVybiBtYXRjaDsKCQl9LAoJCVBPUzogZnVuY3Rpb24obWF0Y2gpewoJCQltYXRjaC51bnNoaWZ0KCB0cnVlICk7CgkJCXJldHVybiBtYXRjaDsKCQl9Cgl9LAoJZmlsdGVyczogewoJCWVuYWJsZWQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgJiYgZWxlbS50eXBlICE9PSAiaGlkZGVuIjsKCQl9LAoJCWRpc2FibGVkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CgkJfSwKCQljaGVja2VkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uY2hlY2tlZCA9PT0gdHJ1ZTsKCQl9LAoJCXNlbGVjdGVkOiBmdW5jdGlvbihlbGVtKXsKCQkJLy8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdAoJCQkvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5CgkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKCQl9LAoJCXBhcmVudDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAhIWVsZW0uZmlyc3RDaGlsZDsKCQl9LAoJCWVtcHR5OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCQloYXM6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuICEhU2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKCQl9LAoJCWhlYWRlcjogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAvaFxkL2kudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgkJdGV4dDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAidGV4dCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCXJhZGlvOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJyYWRpbyIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWNoZWNrYm94OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJjaGVja2JveCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWZpbGU6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gImZpbGUiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlwYXNzd29yZDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAicGFzc3dvcmQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlzdWJtaXQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gInN1Ym1pdCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWltYWdlOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJpbWFnZSIgPT09IGVsZW0udHlwZTsKCQl9LAoJCXJlc2V0OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJyZXNldCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWJ1dHRvbjogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAiYnV0dG9uIiA9PT0gZWxlbS50eXBlIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gIkJVVFRPTiI7CgkJfSwKCQlpbnB1dDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoZWxlbS5ub2RlTmFtZSk7CgkJfQoJfSwKCXNldEZpbHRlcnM6IHsKCQlmaXJzdDogZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBpID09PSAwOwoJCX0sCgkJbGFzdDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gsIGFycmF5KXsKCQkJcmV0dXJuIGkgPT09IGFycmF5Lmxlbmd0aCAtIDE7CgkJfSwKCQlldmVuOiBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGkgJSAyID09PSAwOwoJCX0sCgkJb2RkOiBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGkgJSAyID09PSAxOwoJCX0sCgkJbHQ6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIGkgPCBtYXRjaFszXSAtIDA7CgkJfSwKCQlndDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpewoJCQlyZXR1cm4gaSA+IG1hdGNoWzNdIC0gMDsKCQl9LAoJCW50aDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpewoJCQlyZXR1cm4gbWF0Y2hbM10gLSAwID09IGk7CgkJfSwKCQllcTogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpewoJCQlyZXR1cm4gbWF0Y2hbM10gLSAwID09IGk7CgkJfQoJfSwKCWZpbHRlcjogewoJCVBTRVVETzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwgZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAiY29udGFpbnMiICkgewoJCQkJcmV0dXJuIChlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8ICIiKS5pbmRleE9mKG1hdGNoWzNdKSA+PSAwOwoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsKCQkJCXZhciBub3QgPSBtYXRjaFszXTsKCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBub3QubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggbm90W2ldID09PSBlbGVtICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfSwKCQlDSElMRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQl2YXIgdHlwZSA9IG1hdGNoWzFdLCBub2RlID0gZWxlbTsKCQkJc3dpdGNoICh0eXBlKSB7CgkJCQljYXNlICdvbmx5JzoKCQkJCWNhc2UgJ2ZpcnN0JzoKCQkJCQl3aGlsZSAobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSAgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSByZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCWlmICggdHlwZSA9PSAnZmlyc3QnKSByZXR1cm4gdHJ1ZTsKCQkJCQlub2RlID0gZWxlbTsKCQkJCWNhc2UgJ2xhc3QnOgoJCQkJCXdoaWxlIChub2RlID0gbm9kZS5uZXh0U2libGluZykgIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCWNhc2UgJ250aCc6CgkJCQkJdmFyIGZpcnN0ID0gbWF0Y2hbMl0sIGxhc3QgPSBtYXRjaFszXTsKCgkJCQkJaWYgKCBmaXJzdCA9PSAxICYmIGxhc3QgPT0gMCApIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJCQoJCQkJCXZhciBkb25lTmFtZSA9IG1hdGNoWzBdLAoJCQkJCQlwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkKCQkJCQlpZiAoIHBhcmVudCAmJiAocGFyZW50LnNpemNhY2hlICE9PSBkb25lTmFtZSB8fCAhZWxlbS5ub2RlSW5kZXgpICkgewoJCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgewoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKCQkJCQkJCX0KCQkJCQkJfSAKCQkJCQkJcGFyZW50LnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJfQoJCQkJCQoJCQkJCXZhciBkaWZmID0gZWxlbS5ub2RlSW5kZXggLSBsYXN0OwoJCQkJCWlmICggZmlyc3QgPT0gMCApIHsKCQkJCQkJcmV0dXJuIGRpZmYgPT0gMDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gKCBkaWZmICUgZmlyc3QgPT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJfQoJCX0sCgkJSUQ6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IG1hdGNoOwoJCX0sCgkJVEFHOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXJldHVybiAobWF0Y2ggPT09ICIqIiAmJiBlbGVtLm5vZGVUeXBlID09PSAxKSB8fCBlbGVtLm5vZGVOYW1lID09PSBtYXRjaDsKCQl9LAoJCUNMQVNTOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXJldHVybiAoIiAiICsgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSArICIgIikKCQkJCS5pbmRleE9mKCBtYXRjaCApID4gLTE7CgkJfSwKCQlBVFRSOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXZhciBuYW1lID0gbWF0Y2hbMV0sCgkJCQlyZXN1bHQgPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSA/CgkJCQkJRXhwci5hdHRySGFuZGxlWyBuYW1lIF0oIGVsZW0gKSA6CgkJCQkJZWxlbVsgbmFtZSBdICE9IG51bGwgPwoJCQkJCQllbGVtWyBuYW1lIF0gOgoJCQkJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLAoJCQkJdmFsdWUgPSByZXN1bHQgKyAiIiwKCQkJCXR5cGUgPSBtYXRjaFsyXSwKCQkJCWNoZWNrID0gbWF0Y2hbNF07CgoJCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPwoJCQkJdHlwZSA9PT0gIiE9IiA6CgkJCQl0eXBlID09PSAiPSIgPwoJCQkJdmFsdWUgPT09IGNoZWNrIDoKCQkJCXR5cGUgPT09ICIqPSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPj0gMCA6CgkJCQl0eXBlID09PSAifj0iID8KCQkJCSgiICIgKyB2YWx1ZSArICIgIikuaW5kZXhPZihjaGVjaykgPj0gMCA6CgkJCQkhY2hlY2sgPwoJCQkJdmFsdWUgJiYgcmVzdWx0ICE9PSBmYWxzZSA6CgkJCQl0eXBlID09PSAiIT0iID8KCQkJCXZhbHVlICE9IGNoZWNrIDoKCQkJCXR5cGUgPT09ICJePSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPT09IDAgOgoJCQkJdHlwZSA9PT0gIiQ9IiA/CgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gInw9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CgkJCQlmYWxzZTsKCQl9LAoJCVBPUzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsyXSwgZmlsdGVyID0gRXhwci5zZXRGaWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoJCQl9CgkJfQoJfQp9OwoKdmFyIG9yaWdQT1MgPSBFeHByLm1hdGNoLlBPUzsKCmZvciAoIHZhciB0eXBlIGluIEV4cHIubWF0Y2ggKSB7CglFeHByLm1hdGNoWyB0eXBlIF0gPSBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UgKTsKfQoKdmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHRzKSB7CglhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOwoKCWlmICggcmVzdWx0cyApIHsKCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7CgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgkKCXJldHVybiBhcnJheTsKfTsKCi8vIFBlcmZvcm0gYSBzaW1wbGUgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93c2VyIGlzIGNhcGFibGUgb2YKLy8gY29udmVydGluZyBhIE5vZGVMaXN0IHRvIGFuIGFycmF5IHVzaW5nIGJ1aWx0aW4gbWV0aG9kcy4KdHJ5IHsKCUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcyApOwoKLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCn0gY2F0Y2goZSl7CgltYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIHRvU3RyaW5nLmNhbGwoYXJyYXkpID09PSAiW29iamVjdCBBcnJheV0iICkgewoJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggcmV0LCBhcnJheSApOwoJCX0gZWxzZSB7CgkJCWlmICggdHlwZW9mIGFycmF5Lmxlbmd0aCA9PT0gIm51bWJlciIgKSB7CgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgaSA9IDA7IGFycmF5W2ldOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9Owp9Cgp2YXIgc29ydE9yZGVyOwoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgcmV0ID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IGEgPT09IGIgPyAwIDogMTsKCQlpZiAoIHJldCA9PT0gMCApIHsKCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gZWxzZSBpZiAoICJzb3VyY2VJbmRleCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJdmFyIHJldCA9IGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4OwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfSBlbHNlIGlmICggZG9jdW1lbnQuY3JlYXRlUmFuZ2UgKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgYVJhbmdlID0gYS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9IGIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoJCWFSYW5nZS5zZWxlY3ROb2RlKGEpOwoJCWFSYW5nZS5jb2xsYXBzZSh0cnVlKTsKCQliUmFuZ2Uuc2VsZWN0Tm9kZShiKTsKCQliUmFuZ2UuY29sbGFwc2UodHJ1ZSk7CgkJdmFyIHJldCA9IGFSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBiUmFuZ2UpOwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfQoKLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZSB3aGVuCi8vIHF1ZXJ5aW5nIGJ5IGdldEVsZW1lbnRCeUlkIChhbmQgcHJvdmlkZSBhIHdvcmthcm91bmQpCihmdW5jdGlvbigpewoJLy8gV2UncmUgZ29pbmcgdG8gaW5qZWN0IGEgZmFrZSBpbnB1dCBlbGVtZW50IHdpdGggYSBzcGVjaWZpZWQgbmFtZQoJdmFyIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIiksCgkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOwoJZm9ybS5pbm5lckhUTUwgPSAiPGlucHV0IG5hbWU9JyIgKyBpZCArICInLz4iOwoKCS8vIEluamVjdCBpdCBpbnRvIHRoZSByb290IGVsZW1lbnQsIGNoZWNrIGl0cyBzdGF0dXMsIGFuZCByZW1vdmUgaXQgcXVpY2tseQoJdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Cglyb290Lmluc2VydEJlZm9yZSggZm9ybSwgcm9vdC5maXJzdENoaWxkICk7CgoJLy8gVGhlIHdvcmthcm91bmQgaGFzIHRvIGRvIGFkZGl0aW9uYWwgY2hlY2tzIGFmdGVyIGEgZ2V0RWxlbWVudEJ5SWQKCS8vIFdoaWNoIHNsb3dzIHRoaW5ncyBkb3duIGZvciBvdGhlciBicm93c2VycyAoaGVuY2UgdGhlIGJyYW5jaGluZykKCWlmICggISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKCQlFeHByLmZpbmQuSUQgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOwoJCQkJcmV0dXJuIG0gPyBtLmlkID09PSBtYXRjaFsxXSB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlID09PSBtYXRjaFsxXSA/IFttXSA6IHVuZGVmaW5lZCA6IFtdOwoJCQl9CgkJfTsKCgkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlICYmIG5vZGUubm9kZVZhbHVlID09PSBtYXRjaDsKCQl9OwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKfSkoKTsKCihmdW5jdGlvbigpewoJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgb25seSBlbGVtZW50cwoJLy8gd2hlbiBkb2luZyBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpCgoJLy8gQ3JlYXRlIGEgZmFrZSBlbGVtZW50Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CglkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpICk7CgoJLy8gTWFrZSBzdXJlIG5vIGNvbW1lbnRzIGFyZSBmb3VuZAoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGggPiAwICkgewoJCUV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7CgkJCXZhciByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShtYXRjaFsxXSk7CgoJCQkvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCgkJCWlmICggbWF0Y2hbMV0gPT09ICIqIiApIHsKCQkJCXZhciB0bXAgPSBbXTsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IHJlc3VsdHNbaV07IGkrKyApIHsKCQkJCQlpZiAoIHJlc3VsdHNbaV0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCXRtcC5wdXNoKCByZXN1bHRzW2ldICk7CgkJCQkJfQoJCQkJfQoKCQkJCXJlc3VsdHMgPSB0bXA7CgkJCX0KCgkJCXJldHVybiByZXN1bHRzOwoJCX07Cgl9CgoJLy8gQ2hlY2sgdG8gc2VlIGlmIGFuIGF0dHJpYnV0ZSByZXR1cm5zIG5vcm1hbGl6ZWQgaHJlZiBhdHRyaWJ1dGVzCglkaXYuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJaWYgKCBkaXYuZmlyc3RDaGlsZCAmJiB0eXBlb2YgZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlICE9PSAidW5kZWZpbmVkIiAmJgoJCQlkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSAhPT0gIiMiICkgewoJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIsIDIpOwoJCX07Cgl9Cn0pKCk7CgppZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSAoZnVuY3Rpb24oKXsKCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CgoJLy8gU2FmYXJpIGNhbid0IGhhbmRsZSB1cHBlcmNhc2Ugb3IgdW5pY29kZSBjaGFyYWN0ZXJzIHdoZW4KCS8vIGluIHF1aXJrcyBtb2RlLgoJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CgkJcmV0dXJuOwoJfQoJCglTaXp6bGUgPSBmdW5jdGlvbihxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpewoJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCQkvLyBPbmx5IHVzZSBxdWVyeVNlbGVjdG9yQWxsIG9uIG5vbi1YTUwgZG9jdW1lbnRzCgkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKCQlpZiAoICFzZWVkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWlzWE1MKGNvbnRleHQpICkgewoJCQl0cnkgewoJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsKCQkJfSBjYXRjaChlKXt9CgkJfQoJCQoJCXJldHVybiBvbGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKTsKCX07CgoJU2l6emxlLmZpbmQgPSBvbGRTaXp6bGUuZmluZDsKCVNpenpsZS5maWx0ZXIgPSBvbGRTaXp6bGUuZmlsdGVyOwoJU2l6emxlLnNlbGVjdG9ycyA9IG9sZFNpenpsZS5zZWxlY3RvcnM7CglTaXp6bGUubWF0Y2hlcyA9IG9sZFNpenpsZS5tYXRjaGVzOwp9KSgpOwoKaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkgKGZ1bmN0aW9uKCl7Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CglkaXYuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjsKCgkvLyBPcGVyYSBjYW4ndCBmaW5kIGEgc2Vjb25kIGNsYXNzbmFtZSAoaW4gOS42KQoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApCgkJcmV0dXJuOwoKCS8vIFNhZmFyaSBjYWNoZXMgY2xhc3MgYXR0cmlidXRlcywgZG9lc24ndCBjYXRjaCBjaGFuZ2VzIChpbiAzLjIpCglkaXYubGFzdENoaWxkLmNsYXNzTmFtZSA9ICJlIjsKCglpZiAoIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAxICkKCQlyZXR1cm47CgoJRXhwci5vcmRlci5zcGxpY2UoMSwgMCwgIkNMQVNTIik7CglFeHByLmZpbmQuQ0xBU1MgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpIHsKCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShtYXRjaFsxXSk7CgkJfQoJfTsKfSkoKTsKCmZ1bmN0aW9uIGRpck5vZGVDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZpb3VzU2libGluZyIgJiYgIWlzWE1MOwoJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CgkJaWYgKCBlbGVtICkgewoJCQlpZiAoIHNpYkRpciAmJiBlbGVtLm5vZGVUeXBlID09PSAxICl7CgkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQllbGVtLnNpenNldCA9IGk7CgkJCX0KCQkJZWxlbSA9IGVsZW1bZGlyXTsKCQkJdmFyIG1hdGNoID0gZmFsc2U7CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZSA9PT0gY3VyICkgewoJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKZnVuY3Rpb24gZGlyQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7Cgl2YXIgc2liRGlyID0gZGlyID09ICJwcmV2aW91c1NpYmxpbmciICYmICFpc1hNTDsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCWlmICggZWxlbSApIHsKCQkJaWYgKCBzaWJEaXIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsKCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJfQoJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKCgkJCXdoaWxlICggZWxlbSApIHsKCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWlzWE1MICkgewoJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJCQl9CgkJCQkJaWYgKCB0eXBlb2YgY3VyICE9PSAic3RyaW5nIiApIHsKCQkJCQkJaWYgKCBlbGVtID09PSBjdXIgKSB7CgkJCQkJCQltYXRjaCA9IHRydWU7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoKCQkJCQl9IGVsc2UgaWYgKCBTaXp6bGUuZmlsdGVyKCBjdXIsIFtlbGVtXSApLmxlbmd0aCA+IDAgKSB7CgkJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9Cgp2YXIgY29udGFpbnMgPSBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/ICBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTY7Cn0gOiBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5jb250YWlucyhiKSA6IHRydWUpOwp9OwoKdmFyIGlzWE1MID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJISFlbGVtLm93bmVyRG9jdW1lbnQgJiYgaXNYTUwoIGVsZW0ub3duZXJEb2N1bWVudCApOwp9OwoKdmFyIHBvc1Byb2Nlc3MgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCl7Cgl2YXIgdG1wU2V0ID0gW10sIGxhdGVyID0gIiIsIG1hdGNoLAoJCXJvb3QgPSBjb250ZXh0Lm5vZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4dDsKCgkvLyBQb3NpdGlvbiBzZWxlY3RvcnMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBmaWx0ZXIKCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0byB0aGUgZW5kCgl3aGlsZSAoIChtYXRjaCA9IEV4cHIubWF0Y2guUFNFVURPLmV4ZWMoIHNlbGVjdG9yICkpICkgewoJCWxhdGVyICs9IG1hdGNoWzBdOwoJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7Cgl9CgoJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7CgoJZm9yICggdmFyIGkgPSAwLCBsID0gcm9vdC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7Cgl9CgoJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsKfTsKCi8vIEVYUE9TRQpqUXVlcnkuZmluZCA9IFNpenpsZTsKalF1ZXJ5LmZpbHRlciA9IFNpenpsZS5maWx0ZXI7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKalF1ZXJ5LmV4cHJbIjoiXSA9IGpRdWVyeS5leHByLmZpbHRlcnM7CgpTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCB8fCBlbGVtLm9mZnNldEhlaWdodCA9PT0gMDsKfTsKClNpenpsZS5zZWxlY3RvcnMuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA+IDAgfHwgZWxlbS5vZmZzZXRIZWlnaHQgPiAwOwp9OwoKU2l6emxlLnNlbGVjdG9ycy5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oZm4pewoJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOwoJfSkubGVuZ3RoOwp9OwoKalF1ZXJ5Lm11bHRpRmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7CglpZiAoIG5vdCApIHsKCQlleHByID0gIjpub3QoIiArIGV4cHIgKyAiKSI7Cgl9CgoJcmV0dXJuIFNpenpsZS5tYXRjaGVzKGV4cHIsIGVsZW1zKTsKfTsKCmpRdWVyeS5kaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyICl7Cgl2YXIgbWF0Y2hlZCA9IFtdLCBjdXIgPSBlbGVtW2Rpcl07Cgl3aGlsZSAoIGN1ciAmJiBjdXIgIT0gZG9jdW1lbnQgKSB7CgkJaWYgKCBjdXIubm9kZVR5cGUgPT0gMSApCgkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJY3VyID0gY3VyW2Rpcl07Cgl9CglyZXR1cm4gbWF0Y2hlZDsKfTsKCmpRdWVyeS5udGggPSBmdW5jdGlvbihjdXIsIHJlc3VsdCwgZGlyLCBlbGVtKXsKCXJlc3VsdCA9IHJlc3VsdCB8fCAxOwoJdmFyIG51bSA9IDA7CgoJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkKCQlpZiAoIGN1ci5ub2RlVHlwZSA9PSAxICYmICsrbnVtID09IHJlc3VsdCApCgkJCWJyZWFrOwoKCXJldHVybiBjdXI7Cn07CgpqUXVlcnkuc2libGluZyA9IGZ1bmN0aW9uKG4sIGVsZW0pewoJdmFyIHIgPSBbXTsKCglmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgewoJCWlmICggbi5ub2RlVHlwZSA9PSAxICYmIG4gIT0gZWxlbSApCgkJCXIucHVzaCggbiApOwoJfQoKCXJldHVybiByOwp9OwoKcmV0dXJuOwoKd2luZG93LlNpenpsZSA9IFNpenpsZTsKCn0pKCk7Ci8qCiAqIEEgbnVtYmVyIG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgbWFuYWdpbmcgZXZlbnRzLgogKiBNYW55IG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhpcyBjb2RlIG9yaWdpbmF0ZWQgZnJvbQogKiBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkuCiAqLwpqUXVlcnkuZXZlbnQgPSB7CgoJLy8gQmluZCBhbiBldmVudCB0byBhbiBlbGVtZW50CgkvLyBPcmlnaW5hbCBieSBEZWFuIEVkd2FyZHMKCWFkZDogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEpIHsKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQoJCQlyZXR1cm47CgoJCS8vIEZvciB3aGF0ZXZlciByZWFzb24sIElFIGhhcyB0cm91YmxlIHBhc3NpbmcgdGhlIHdpbmRvdyBvYmplY3QKCQkvLyBhcm91bmQsIGNhdXNpbmcgaXQgdG8gYmUgY2xvbmVkIGluIHRoZSBwcm9jZXNzCgkJaWYgKCBlbGVtLnNldEludGVydmFsICYmIGVsZW0gIT0gd2luZG93ICkKCQkJZWxlbSA9IHdpbmRvdzsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJRAoJCWlmICggIWhhbmRsZXIuZ3VpZCApCgkJCWhhbmRsZXIuZ3VpZCA9IHRoaXMuZ3VpZCsrOwoKCQkvLyBpZiBkYXRhIGlzIHBhc3NlZCwgYmluZCB0byBoYW5kbGVyCgkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCS8vIENyZWF0ZSB0ZW1wb3JhcnkgZnVuY3Rpb24gcG9pbnRlciB0byBvcmlnaW5hbCBoYW5kbGVyCgkJCXZhciBmbiA9IGhhbmRsZXI7CgoJCQkvLyBDcmVhdGUgdW5pcXVlIGhhbmRsZXIgZnVuY3Rpb24sIHdyYXBwZWQgYXJvdW5kIG9yaWdpbmFsIGhhbmRsZXIKCQkJaGFuZGxlciA9IHRoaXMucHJveHkoIGZuICk7CgoJCQkvLyBTdG9yZSBkYXRhIGluIHVuaXF1ZSBoYW5kbGVyCgkJCWhhbmRsZXIuZGF0YSA9IGRhdGE7CgkJfQoKCQkvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlCgkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKGVsZW0sICJldmVudHMiKSB8fCBqUXVlcnkuZGF0YShlbGVtLCAiZXZlbnRzIiwge30pLAoJCQloYW5kbGUgPSBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIikgfHwgalF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIsIGZ1bmN0aW9uKCl7CgkJCQkvLyBIYW5kbGUgdGhlIHNlY29uZCBldmVudCBvZiBhIHRyaWdnZXIgYW5kIHdoZW4KCQkJCS8vIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkCgkJCQlyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gInVuZGVmaW5lZCIgJiYgIWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPwoJCQkJCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoYXJndW1lbnRzLmNhbGxlZS5lbGVtLCBhcmd1bWVudHMpIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX0pOwoJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmdW5jdGlvbgoJCS8vIFRoaXMgaXMgdG8gcHJldmVudCBhIG1lbW9yeSBsZWFrIHdpdGggbm9uLW5hdGl2ZQoJCS8vIGV2ZW50IGluIElFLgoJCWhhbmRsZS5lbGVtID0gZWxlbTsKCgkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQoJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQlqUXVlcnkuZWFjaCh0eXBlcy5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGluZGV4LCB0eXBlKSB7CgkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCWhhbmRsZXIudHlwZSA9IG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLiIpOwoKCQkJLy8gR2V0IHRoZSBjdXJyZW50IGxpc3Qgb2YgZnVuY3Rpb25zIGJvdW5kIHRvIHRoaXMgZXZlbnQKCQkJdmFyIGhhbmRsZXJzID0gZXZlbnRzW3R5cGVdOwoJCQkKCQkJaWYgKCBqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXSApCgkJCQlqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXS5zZXR1cC5jYWxsKGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMpOwoKCQkJLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZQoJCQlpZiAoIWhhbmRsZXJzKSB7CgkJCQloYW5kbGVycyA9IGV2ZW50c1t0eXBlXSA9IHt9OwoKCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZlbnQgaGFuZGxlcgoJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbAoJCQkJLy8gZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0uc2V0dXAuY2FsbChlbGVtLCBkYXRhLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CgkJCQkJLy8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQKCQkJCQlpZiAoZWxlbS5hZGRFdmVudExpc3RlbmVyKQoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlLCBmYWxzZSk7CgkJCQkJZWxzZSBpZiAoZWxlbS5hdHRhY2hFdmVudCkKCQkJCQkJZWxlbS5hdHRhY2hFdmVudCgib24iICsgdHlwZSwgaGFuZGxlKTsKCQkJCX0KCQkJfQoKCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAoJCQloYW5kbGVyc1toYW5kbGVyLmd1aWRdID0gaGFuZGxlcjsKCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgYmVlbiB1c2VkLCBmb3IgZ2xvYmFsIHRyaWdnZXJpbmcKCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFt0eXBlXSA9IHRydWU7CgkJfSk7CgoJCS8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQoJCWVsZW0gPSBudWxsOwoJfSwKCglndWlkOiAxLAoJZ2xvYmFsOiB7fSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIpIHsKCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT0gOCApCgkJCXJldHVybjsKCgkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKGVsZW0sICJldmVudHMiKSwgcmV0LCBpbmRleDsKCgkJaWYgKCBldmVudHMgKSB7CgkJCS8vIFVuYmluZCBhbGwgZXZlbnRzIGZvciB0aGUgZWxlbWVudAoJCQlpZiAoIHR5cGVzID09PSB1bmRlZmluZWQgfHwgKHR5cGVvZiB0eXBlcyA9PT0gInN0cmluZyIgJiYgdHlwZXMuY2hhckF0KDApID09ICIuIikgKQoJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkKCQkJCQl0aGlzLnJlbW92ZSggZWxlbSwgdHlwZSArICh0eXBlcyB8fCAiIikgKTsKCQkJZWxzZSB7CgkJCQkvLyB0eXBlcyBpcyBhY3R1YWxseSBhbiBldmVudCBvYmplY3QgaGVyZQoJCQkJaWYgKCB0eXBlcy50eXBlICkgewoJCQkJCWhhbmRsZXIgPSB0eXBlcy5oYW5kbGVyOwoJCQkJCXR5cGVzID0gdHlwZXMudHlwZTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGVyYXRlZCBieSBhIHNwYWNlCgkJCQkvLyBqUXVlcnkoLi4uKS51bmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQkJCWpRdWVyeS5lYWNoKHR5cGVzLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5kZXgsIHR5cGUpewoJCQkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJCQl2YXIgbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwoJCQkJCXZhciBuYW1lc3BhY2UgPSBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5qb2luKCIuKlxcLiIpICsgIihcXC58JCkiKTsKCgkJCQkJaWYgKCBldmVudHNbdHlwZV0gKSB7CgkJCQkJCS8vIHJlbW92ZSB0aGUgZ2l2ZW4gaGFuZGxlciBmb3IgdGhlIGdpdmVuIHR5cGUKCQkJCQkJaWYgKCBoYW5kbGVyICkKCQkJCQkJCWRlbGV0ZSBldmVudHNbdHlwZV1baGFuZGxlci5ndWlkXTsKCgkJCQkJCS8vIHJlbW92ZSBhbGwgaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiB0eXBlCgkJCQkJCWVsc2UKCQkJCQkJCWZvciAoIHZhciBoYW5kbGUgaW4gZXZlbnRzW3R5cGVdICkKCQkJCQkJCQkvLyBIYW5kbGUgdGhlIHJlbW92YWwgb2YgbmFtZXNwYWNlZCBldmVudHMKCQkJCQkJCQlpZiAoIG5hbWVzcGFjZS50ZXN0KGV2ZW50c1t0eXBlXVtoYW5kbGVdLnR5cGUpICkKCQkJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVdOwoJCQkJCQkJCQkKCQkJCQkJaWYgKCBqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXSApCgkJCQkJCQlqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXS50ZWFyZG93bi5jYWxsKGVsZW0sIG5hbWVzcGFjZXMpOwoKCQkJCQkJLy8gcmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiBubyBtb3JlIGhhbmRsZXJzIGV4aXN0CgkJCQkJCWZvciAoIHJldCBpbiBldmVudHNbdHlwZV0gKSBicmVhazsKCQkJCQkJaWYgKCAhcmV0ICkgewoJCQkJCQkJaWYgKCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0udGVhcmRvd24uY2FsbChlbGVtLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CgkJCQkJCQkJaWYgKGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcikKCQkJCQkJCQkJZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSwgZmFsc2UpOwoJCQkJCQkJCWVsc2UgaWYgKGVsZW0uZGV0YWNoRXZlbnQpCgkJCQkJCQkJCWVsZW0uZGV0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSk7CgkJCQkJCQl9CgkJCQkJCQlyZXQgPSBudWxsOwoJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAoJCQlmb3IgKCByZXQgaW4gZXZlbnRzICkgYnJlYWs7CgkJCWlmICggIXJldCApIHsKCQkJCXZhciBoYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKTsKCQkJCWlmICggaGFuZGxlICkgaGFuZGxlLmVsZW0gPSBudWxsOwoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJldmVudHMiICk7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgImhhbmRsZSIgKTsKCQkJfQoJCX0KCX0sCgoJLy8gYnViYmxpbmcgaXMgaW50ZXJuYWwKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgYnViYmxpbmcgKSB7CgkJLy8gRXZlbnQgb2JqZWN0IG9yIGV2ZW50IHR5cGUKCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgZXZlbnQ7CgoJCWlmKCAhYnViYmxpbmcgKXsKCQkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiID8KCQkJCS8vIGpRdWVyeS5FdmVudCBvYmplY3QKCQkJCWV2ZW50W2V4cGFuZG9dID8gZXZlbnQgOgoJCQkJLy8gT2JqZWN0IGxpdGVyYWwKCQkJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5FdmVudCh0eXBlKSwgZXZlbnQgKSA6CgkJCQkvLyBKdXN0IHRoZSBldmVudCB0eXBlIChzdHJpbmcpCgkJCQlqUXVlcnkuRXZlbnQodHlwZSk7CgoJCQlpZiAoIHR5cGUuaW5kZXhPZigiISIpID49IDAgKSB7CgkJCQlldmVudC50eXBlID0gdHlwZSA9IHR5cGUuc2xpY2UoMCwgLTEpOwoJCQkJZXZlbnQuZXhjbHVzaXZlID0gdHJ1ZTsKCQkJfQoKCQkJLy8gSGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKCQkJaWYgKCAhZWxlbSApIHsKCQkJCS8vIERvbid0IGJ1YmJsZSBjdXN0b20gZXZlbnRzIHdoZW4gZ2xvYmFsICh0byBhdm9pZCB0b28gbXVjaCBvdmVyaGVhZCkKCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoJCQkJLy8gT25seSB0cmlnZ2VyIGlmIHdlJ3ZlIGV2ZXIgYm91bmQgYW4gZXZlbnQgZm9yIGl0CgkJCQlpZiAoIHRoaXMuZ2xvYmFsW3R5cGVdICkKCQkJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LmNhY2hlLCBmdW5jdGlvbigpewoJCQkJCQlpZiAoIHRoaXMuZXZlbnRzICYmIHRoaXMuZXZlbnRzW3R5cGVdICkKCQkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgdGhpcy5oYW5kbGUuZWxlbSApOwoJCQkJCX0pOwoJCQl9CgoJCQkvLyBIYW5kbGUgdHJpZ2dlcmluZyBhIHNpbmdsZSBlbGVtZW50CgoJCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQoJCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQkJCgkJCS8vIENsZWFuIHVwIGluIGNhc2UgaXQgaXMgcmV1c2VkCgkJCWV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQkJCgkJCS8vIENsb25lIHRoZSBpbmNvbWluZyBkYXRhLCBpZiBhbnkKCQkJZGF0YSA9IGpRdWVyeS5tYWtlQXJyYXkoZGF0YSk7CgkJCWRhdGEudW5zaGlmdCggZXZlbnQgKTsKCQl9CgoJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtOwoKCQkvLyBUcmlnZ2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1lZCB0aGF0ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24KCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIpOwoJCWlmICggaGFuZGxlICkKCQkJaGFuZGxlLmFwcGx5KCBlbGVtLCBkYXRhICk7CgoJCS8vIEhhbmRsZSB0cmlnZ2VyaW5nIG5hdGl2ZSAub25mb28gaGFuZGxlcnMgKGFuZCBvbiBsaW5rcyBzaW5jZSB3ZSBkb24ndCBjYWxsIC5jbGljaygpIGZvciBsaW5rcykKCQlpZiAoICghZWxlbVt0eXBlXSB8fCAoalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICdhJykgJiYgdHlwZSA9PSAiY2xpY2siKSkgJiYgZWxlbVsib24iK3R5cGVdICYmIGVsZW1bIm9uIit0eXBlXS5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApCgkJCWV2ZW50LnJlc3VsdCA9IGZhbHNlOwoKCQkvLyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnRzIChleGNlcHQgZm9yIGNsaWNrcyBvbiBsaW5rcykKCQlpZiAoICFidWJibGluZyAmJiBlbGVtW3R5cGVdICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSAmJiAhKGpRdWVyeS5ub2RlTmFtZShlbGVtLCAnYScpICYmIHR5cGUgPT0gImNsaWNrIikgKSB7CgkJCXRoaXMudHJpZ2dlcmVkID0gdHJ1ZTsKCQkJdHJ5IHsKCQkJCWVsZW1bIHR5cGUgXSgpOwoJCQkvLyBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgYW4gZXJyb3IgZm9yIHNvbWUgaGlkZGVuIGVsZW1lbnRzCgkJCX0gY2F0Y2ggKGUpIHt9CgkJfQoKCQl0aGlzLnRyaWdnZXJlZCA9IGZhbHNlOwoKCQlpZiAoICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlIHx8IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJaWYgKCBwYXJlbnQgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoZXZlbnQsIGRhdGEsIHBhcmVudCwgdHJ1ZSk7CgkJfQoJfSwKCgloYW5kbGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy8gcmV0dXJuZWQgdW5kZWZpbmVkIG9yIGZhbHNlCgkJdmFyIGFsbCwgaGFuZGxlcnM7CgoJCWV2ZW50ID0gYXJndW1lbnRzWzBdID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgfHwgd2luZG93LmV2ZW50ICk7CgkJZXZlbnQuY3VycmVudFRhcmdldCA9IHRoaXM7CgkJCgkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycwoJCXZhciBuYW1lc3BhY2VzID0gZXZlbnQudHlwZS5zcGxpdCgiLiIpOwoJCWV2ZW50LnR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgoJCS8vIENhY2hlIHRoaXMgbm93LCBhbGwgPSB0cnVlIG1lYW5zLCBhbnkgaGFuZGxlcgoJCWFsbCA9ICFuYW1lc3BhY2VzLmxlbmd0aCAmJiAhZXZlbnQuZXhjbHVzaXZlOwoJCQoJCXZhciBuYW1lc3BhY2UgPSBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5qb2luKCIuKlxcLiIpICsgIihcXC58JCkiKTsKCgkJaGFuZGxlcnMgPSAoIGpRdWVyeS5kYXRhKHRoaXMsICJldmVudHMiKSB8fCB7fSApW2V2ZW50LnR5cGVdOwoKCQlmb3IgKCB2YXIgaiBpbiBoYW5kbGVycyApIHsKCQkJdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tqXTsKCgkJCS8vIEZpbHRlciB0aGUgZnVuY3Rpb25zIGJ5IGNsYXNzCgkJCWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KGhhbmRsZXIudHlwZSkgKSB7CgkJCQkvLyBQYXNzIGluIGEgcmVmZXJlbmNlIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGl0c2VsZgoJCQkJLy8gU28gdGhhdCB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIGl0CgkJCQlldmVudC5oYW5kbGVyID0gaGFuZGxlcjsKCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVyLmRhdGE7CgoJCQkJdmFyIHJldCA9IGhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCgkJCQlpZiggcmV0ICE9PSB1bmRlZmluZWQgKXsKCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CgkJCQkJaWYgKCByZXQgPT09IGZhbHNlICkgewoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYoIGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKQoJCQkJCWJyZWFrOwoKCQkJfQoJCX0KCX0sCgoJcHJvcHM6ICJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbWV0YUtleSBuZXdWYWx1ZSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKCglmaXg6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJaWYgKCBldmVudFtleHBhbmRvXSApCgkJCXJldHVybiBldmVudDsKCgkJLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QKCQkvLyBhbmQgImNsb25lIiB0byBzZXQgcmVhZC1vbmx5IHByb3BlcnRpZXMKCQl2YXIgb3JpZ2luYWxFdmVudCA9IGV2ZW50OwoJCWV2ZW50ID0galF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CgoJCWZvciAoIHZhciBpID0gdGhpcy5wcm9wcy5sZW5ndGgsIHByb3A7IGk7ICl7CgkJCXByb3AgPSB0aGlzLnByb3BzWyAtLWkgXTsKCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKCQl9CgoJCS8vIEZpeCB0YXJnZXQgcHJvcGVydHksIGlmIG5lY2Vzc2FyeQoJCWlmICggIWV2ZW50LnRhcmdldCApCgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7IC8vIEZpeGVzICMxOTI1IHdoZXJlIHNyY0VsZW1lbnQgbWlnaHQgbm90IGJlIGRlZmluZWQgZWl0aGVyCgoJCS8vIGNoZWNrIGlmIHRhcmdldCBpcyBhIHRleHRub2RlIChzYWZhcmkpCgkJaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT0gMyApCgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOwoKCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApCgkJCWV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBldmVudC5mcm9tRWxlbWVudCA9PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKCgkJLy8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZQoJCWlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBldmVudC5jbGllbnRYICE9IG51bGwgKSB7CgkJCXZhciBkb2MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGJvZHkgPSBkb2N1bWVudC5ib2R5OwoJCQlldmVudC5wYWdlWCA9IGV2ZW50LmNsaWVudFggKyAoZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvYy5jbGllbnRMZWZ0IHx8IDApOwoJCQlldmVudC5wYWdlWSA9IGV2ZW50LmNsaWVudFkgKyAoZG9jICYmIGRvYy5zY3JvbGxUb3AgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCB8fCAwKSAtIChkb2MuY2xpZW50VG9wIHx8IDApOwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgKChldmVudC5jaGFyQ29kZSB8fCBldmVudC5jaGFyQ29kZSA9PT0gMCkgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGUpICkKCQkJZXZlbnQud2hpY2ggPSBldmVudC5jaGFyQ29kZSB8fCBldmVudC5rZXlDb2RlOwoKCQkvLyBBZGQgbWV0YUtleSB0byBub24tTWFjIGJyb3dzZXJzICh1c2UgY3RybCBmb3IgUEMncyBhbmQgTWV0YSBmb3IgTWFjcykKCQlpZiAoICFldmVudC5tZXRhS2V5ICYmIGV2ZW50LmN0cmxLZXkgKQoJCQlldmVudC5tZXRhS2V5ID0gZXZlbnQuY3RybEtleTsKCgkJLy8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PSBsZWZ0OyAyID09IG1pZGRsZTsgMyA9PSByaWdodAoJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgZXZlbnQuYnV0dG9uICkKCQkJZXZlbnQud2hpY2ggPSAoZXZlbnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0b24gJiA0ID8gMiA6IDAgKSApKTsKCgkJcmV0dXJuIGV2ZW50OwoJfSwKCglwcm94eTogZnVuY3Rpb24oIGZuLCBwcm94eSApewoJCXByb3h5ID0gcHJveHkgfHwgZnVuY3Rpb24oKXsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07CgkJLy8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCgkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IHByb3h5Lmd1aWQgfHwgdGhpcy5ndWlkKys7CgkJLy8gU28gcHJveHkgY2FuIGJlIGRlY2xhcmVkIGFzIGFuIGFyZ3VtZW50CgkJcmV0dXJuIHByb3h5OwoJfSwKCglzcGVjaWFsOiB7CgkJcmVhZHk6IHsKCQkJLy8gTWFrZSBzdXJlIHRoZSByZWFkeSBldmVudCBpcyBzZXR1cAoJCQlzZXR1cDogYmluZFJlYWR5LAoJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7fQoJCX0KCX0sCgkKCXNwZWNpYWxBbGw6IHsKCQlsaXZlOiB7CgkJCXNldHVwOiBmdW5jdGlvbiggc2VsZWN0b3IsIG5hbWVzcGFjZXMgKXsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIG5hbWVzcGFjZXNbMF0sIGxpdmVIYW5kbGVyICk7CgkJCX0sCgkJCXRlYXJkb3duOiAgZnVuY3Rpb24oIG5hbWVzcGFjZXMgKXsKCQkJCWlmICggbmFtZXNwYWNlcy5sZW5ndGggKSB7CgkJCQkJdmFyIHJlbW92ZSA9IDAsIG5hbWUgPSBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlc1swXSArICIoXFwufCQpIik7CgkJCQkJCgkJCQkJalF1ZXJ5LmVhY2goIChqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCB7fSksIGZ1bmN0aW9uKCl7CgkJCQkJCWlmICggbmFtZS50ZXN0KHRoaXMudHlwZSkgKQoJCQkJCQkJcmVtb3ZlKys7CgkJCQkJfSk7CgkJCQkJCgkJCQkJaWYgKCByZW1vdmUgPCAxICkKCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgbmFtZXNwYWNlc1swXSwgbGl2ZUhhbmRsZXIgKTsKCQkJCX0KCQkJfQoJCX0KCX0KfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMgKXsKCS8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAoJaWYoICF0aGlzLnByZXZlbnREZWZhdWx0ICkKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudChzcmMpOwoJCgkvLyBFdmVudCBvYmplY3QKCWlmKCBzcmMgJiYgc3JjLnR5cGUgKXsKCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CgkJdGhpcy50eXBlID0gc3JjLnR5cGU7CgkvLyBFdmVudCB0eXBlCgl9ZWxzZQoJCXRoaXMudHlwZSA9IHNyYzsKCgkvLyB0aW1lU3RhbXAgaXMgYnVnZ3kgZm9yIHNvbWUgZXZlbnRzIG9uIEZpcmVmb3goIzM4NDMpCgkvLyBTbyB3ZSB3b24ndCByZWx5IG9uIHRoZSBuYXRpdmUgdmFsdWUKCXRoaXMudGltZVN0YW1wID0gbm93KCk7CgkKCS8vIE1hcmsgaXQgYXMgZml4ZWQKCXRoaXNbZXhwYW5kb10gPSB0cnVlOwp9OwoKZnVuY3Rpb24gcmV0dXJuRmFsc2UoKXsKCXJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiByZXR1cm5UcnVlKCl7CglyZXR1cm4gdHJ1ZTsKfQoKLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbApqUXVlcnkuRXZlbnQucHJvdG90eXBlID0gewoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYoICFlICkKCQkJcmV0dXJuOwoJCS8vIGlmIHByZXZlbnREZWZhdWx0IGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKGUucHJldmVudERlZmF1bHQpCgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQoJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsKCX0sCglzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKCQlpZiggIWUgKQoJCQlyZXR1cm47CgkJLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKGUuc3RvcFByb3BhZ2F0aW9uKQoJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCS8vIG90aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAoSUUpCgkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOwoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpewoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoJCXRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7Cgl9LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZQp9OwovLyBDaGVja3MgaWYgYW4gZXZlbnQgaGFwcGVuZWQgb24gYW4gZWxlbWVudCB3aXRoaW4gYW5vdGhlciBlbGVtZW50Ci8vIFVzZWQgaW4galF1ZXJ5LmV2ZW50LnNwZWNpYWwubW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZSBoYW5kbGVycwp2YXIgd2l0aGluRWxlbWVudCA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkvLyBDaGVjayBpZiBtb3VzZShvdmVyfG91dCkgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgZWxlbWVudAoJdmFyIHBhcmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CgkvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZQoJd2hpbGUgKCBwYXJlbnQgJiYgcGFyZW50ICE9IHRoaXMgKQoJCXRyeSB7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOyB9CgkJY2F0Y2goZSkgeyBwYXJlbnQgPSB0aGlzOyB9CgkKCWlmKCBwYXJlbnQgIT0gdGhpcyApewoJCS8vIHNldCB0aGUgY29ycmVjdCBldmVudCB0eXBlCgkJZXZlbnQudHlwZSA9IGV2ZW50LmRhdGE7CgkJLy8gaGFuZGxlIGV2ZW50IGlmIHdlIGFjdHVhbGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgbm9uIHN1Yi1lbGVtZW50CgkJalF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cgl9Cn07CgkKalF1ZXJ5LmVhY2goeyAKCW1vdXNlb3ZlcjogJ21vdXNlZW50ZXInLCAKCW1vdXNlb3V0OiAnbW91c2VsZWF2ZScKfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApewoJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0gewoJCXNldHVwOiBmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCBvcmlnLCB3aXRoaW5FbGVtZW50LCBmaXggKTsKCQl9LAoJCXRlYXJkb3duOiBmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCBvcmlnLCB3aXRoaW5FbGVtZW50ICk7CgkJfQoJfTsJCQkgICAKfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWJpbmQ6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdHlwZSA9PSAidW5sb2FkIiA/IHRoaXMub25lKHR5cGUsIGRhdGEsIGZuKSA6IHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBmbiB8fCBkYXRhLCBmbiAmJiBkYXRhICk7CgkJfSk7Cgl9LAoKCW9uZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgewoJCXZhciBvbmUgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuIHx8IGRhdGEsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCWpRdWVyeSh0aGlzKS51bmJpbmQoZXZlbnQsIG9uZSk7CgkJCXJldHVybiAoZm4gfHwgZGF0YSkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX0pOwoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgb25lLCBmbiAmJiBkYXRhKTsKCQl9KTsKCX0sCgoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlLCBmbiApOwoJCX0pOwoJfSwKCgl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CgkJfSk7Cgl9LAoKCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlpZiggdGhpc1swXSApewoJCQl2YXIgZXZlbnQgPSBqUXVlcnkuRXZlbnQodHlwZSk7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZXZlbnQsIGRhdGEsIHRoaXNbMF0gKTsKCQkJcmV0dXJuIGV2ZW50LnJlc3VsdDsKCQl9CQkKCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLCBpID0gMTsKCgkJLy8gbGluayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXIKCQl3aGlsZSggaSA8IGFyZ3MubGVuZ3RoICkKCQkJalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgYXJnc1tpKytdICk7CgoJCXJldHVybiB0aGlzLmNsaWNrKCBqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBmdW5jdGlvbihldmVudCkgewoJCQkvLyBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRvIGV4ZWN1dGUKCQkJdGhpcy5sYXN0VG9nZ2xlID0gKCB0aGlzLmxhc3RUb2dnbGUgfHwgMCApICUgaTsKCgkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCQkvLyBhbmQgZXhlY3V0ZSB0aGUgZnVuY3Rpb24KCQkJcmV0dXJuIGFyZ3NbIHRoaXMubGFzdFRvZ2dsZSsrIF0uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIHx8IGZhbHNlOwoJCX0pKTsKCX0sCgoJaG92ZXI6IGZ1bmN0aW9uKGZuT3ZlciwgZm5PdXQpIHsKCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGZuT3ZlcikubW91c2VsZWF2ZShmbk91dCk7Cgl9LAoKCXJlYWR5OiBmdW5jdGlvbihmbikgewoJCS8vIEF0dGFjaCB0aGUgbGlzdGVuZXJzCgkJYmluZFJlYWR5KCk7CgoJCS8vIElmIHRoZSBET00gaXMgYWxyZWFkeSByZWFkeQoJCWlmICggalF1ZXJ5LmlzUmVhZHkgKQoJCQkvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQoJCQlmbi5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CgoJCS8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhlIGZ1bmN0aW9uIGZvciBsYXRlcgoJCWVsc2UKCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgd2FpdCBsaXN0CgkJCWpRdWVyeS5yZWFkeUxpc3QucHVzaCggZm4gKTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoJCglsaXZlOiBmdW5jdGlvbiggdHlwZSwgZm4gKXsKCQl2YXIgcHJveHkgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuICk7CgkJcHJveHkuZ3VpZCArPSB0aGlzLnNlbGVjdG9yICsgdHlwZTsKCgkJalF1ZXJ5KGRvY3VtZW50KS5iaW5kKCBsaXZlQ29udmVydCh0eXBlLCB0aGlzLnNlbGVjdG9yKSwgdGhpcy5zZWxlY3RvciwgcHJveHkgKTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoJCglkaWU6IGZ1bmN0aW9uKCB0eXBlLCBmbiApewoJCWpRdWVyeShkb2N1bWVudCkudW5iaW5kKCBsaXZlQ29udmVydCh0eXBlLCB0aGlzLnNlbGVjdG9yKSwgZm4gPyB7IGd1aWQ6IGZuLmd1aWQgKyB0aGlzLnNlbGVjdG9yICsgdHlwZSB9IDogbnVsbCApOwoJCXJldHVybiB0aGlzOwoJfQp9KTsKCmZ1bmN0aW9uIGxpdmVIYW5kbGVyKCBldmVudCApewoJdmFyIGNoZWNrID0gUmVnRXhwKCIoXnxcXC4pIiArIGV2ZW50LnR5cGUgKyAiKFxcLnwkKSIpLAoJCXN0b3AgPSB0cnVlLAoJCWVsZW1zID0gW107CgoJalF1ZXJ5LmVhY2goalF1ZXJ5LmRhdGEodGhpcywgImV2ZW50cyIpLmxpdmUgfHwgW10sIGZ1bmN0aW9uKGksIGZuKXsKCQlpZiAoIGNoZWNrLnRlc3QoZm4udHlwZSkgKSB7CgkJCXZhciBlbGVtID0galF1ZXJ5KGV2ZW50LnRhcmdldCkuY2xvc2VzdChmbi5kYXRhKVswXTsKCQkJaWYgKCBlbGVtICkKCQkJCWVsZW1zLnB1c2goeyBlbGVtOiBlbGVtLCBmbjogZm4gfSk7CgkJfQoJfSk7CgoJZWxlbXMuc29ydChmdW5jdGlvbihhLGIpIHsKCQlyZXR1cm4galF1ZXJ5LmRhdGEoYS5lbGVtLCAiY2xvc2VzdCIpIC0galF1ZXJ5LmRhdGEoYi5lbGVtLCAiY2xvc2VzdCIpOwoJfSk7CgkKCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbigpewoJCWlmICggdGhpcy5mbi5jYWxsKHRoaXMuZWxlbSwgZXZlbnQsIHRoaXMuZm4uZGF0YSkgPT09IGZhbHNlICkKCQkJcmV0dXJuIChzdG9wID0gZmFsc2UpOwoJfSk7CgoJcmV0dXJuIHN0b3A7Cn0KCmZ1bmN0aW9uIGxpdmVDb252ZXJ0KHR5cGUsIHNlbGVjdG9yKXsKCXJldHVybiBbImxpdmUiLCB0eXBlLCBzZWxlY3Rvci5yZXBsYWNlKC9cLi9nLCAiYCIpLnJlcGxhY2UoLyAvZywgInwiKV0uam9pbigiLiIpOwp9CgpqUXVlcnkuZXh0ZW5kKHsKCWlzUmVhZHk6IGZhbHNlLAoJcmVhZHlMaXN0OiBbXSwKCS8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKCXJlYWR5OiBmdW5jdGlvbigpIHsKCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgRE9NIGlzIG5vdCBhbHJlYWR5IGxvYWRlZAoJCWlmICggIWpRdWVyeS5pc1JlYWR5ICkgewoJCQkvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKCQkJalF1ZXJ5LmlzUmVhZHkgPSB0cnVlOwoKCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCQlpZiAoIGpRdWVyeS5yZWFkeUxpc3QgKSB7CgkJCQkvLyBFeGVjdXRlIGFsbCBvZiB0aGVtCgkJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LnJlYWR5TGlzdCwgZnVuY3Rpb24oKXsKCQkJCQl0aGlzLmNhbGwoIGRvY3VtZW50LCBqUXVlcnkgKTsKCQkJCX0pOwoKCQkJCS8vIFJlc2V0IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucwoJCQkJalF1ZXJ5LnJlYWR5TGlzdCA9IG51bGw7CgkJCX0KCgkJCS8vIFRyaWdnZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50cwoJCQlqUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpOwoJCX0KCX0KfSk7Cgp2YXIgcmVhZHlCb3VuZCA9IGZhbHNlOwoKZnVuY3Rpb24gYmluZFJlYWR5KCl7CglpZiAoIHJlYWR5Qm91bmQgKSByZXR1cm47CglyZWFkeUJvdW5kID0gdHJ1ZTsKCgkvLyBNb3ppbGxhLCBPcGVyYSBhbmQgd2Via2l0IG5pZ2h0bGllcyBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIGV2ZW50CglpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7CgkJLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjawoJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKXsKCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBhcmd1bWVudHMuY2FsbGVlLCBmYWxzZSApOwoJCQlqUXVlcnkucmVhZHkoKTsKCQl9LCBmYWxzZSApOwoKCS8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWQKCX0gZWxzZSBpZiAoIGRvY3VtZW50LmF0dGFjaEV2ZW50ICkgewoJCS8vIGVuc3VyZSBmaXJpbmcgYmVmb3JlIG9ubG9hZCwKCQkvLyBtYXliZSBsYXRlIGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXMKCQlkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKXsKCQkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewoJCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlICk7CgkJCQlqUXVlcnkucmVhZHkoKTsKCQkJfQoJCX0pOwoKCQkvLyBJZiBJRSBhbmQgbm90IGFuIGlmcmFtZQoJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQlpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCAmJiB3aW5kb3cgPT0gd2luZG93LnRvcCApIChmdW5jdGlvbigpewoJCQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkgcmV0dXJuOwoKCQkJdHJ5IHsKCQkJCS8vIElmIElFIGlzIHVzZWQsIHVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pCgkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwoJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iik7CgkJCX0gY2F0Y2goIGVycm9yICkgewoJCQkJc2V0VGltZW91dCggYXJndW1lbnRzLmNhbGxlZSwgMCApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMKCQkJalF1ZXJ5LnJlYWR5KCk7CgkJfSkoKTsKCX0KCgkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yawoJalF1ZXJ5LmV2ZW50LmFkZCggd2luZG93LCAibG9hZCIsIGpRdWVyeS5yZWFkeSApOwp9CgpqUXVlcnkuZWFjaCggKCJibHVyLGZvY3VzLGxvYWQscmVzaXplLHNjcm9sbCx1bmxvYWQsY2xpY2ssZGJsY2xpY2ssIiArCgkibW91c2Vkb3duLG1vdXNldXAsbW91c2Vtb3ZlLG1vdXNlb3Zlcixtb3VzZW91dCxtb3VzZWVudGVyLG1vdXNlbGVhdmUsIiArCgkiY2hhbmdlLHNlbGVjdCxzdWJtaXQsa2V5ZG93bixrZXlwcmVzcyxrZXl1cCxlcnJvciIpLnNwbGl0KCIsIiksIGZ1bmN0aW9uKGksIG5hbWUpewoKCS8vIEhhbmRsZSBldmVudCBiaW5kaW5nCglqUXVlcnkuZm5bbmFtZV0gPSBmdW5jdGlvbihmbil7CgkJcmV0dXJuIGZuID8gdGhpcy5iaW5kKG5hbWUsIGZuKSA6IHRoaXMudHJpZ2dlcihuYW1lKTsKCX07Cn0pOwoKLy8gUHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKLy8gQW5kIHByZXZlbnQgZXJyb3JzIG9uIHJlZnJlc2ggd2l0aCBldmVudHMgbGlrZSBtb3VzZW92ZXIgaW4gb3RoZXIgYnJvd3NlcnMKLy8gV2luZG93IGlzbid0IGluY2x1ZGVkIHNvIGFzIG5vdCB0byB1bmJpbmQgZXhpc3RpbmcgdW5sb2FkIGV2ZW50cwpqUXVlcnkoIHdpbmRvdyApLmJpbmQoICd1bmxvYWQnLCBmdW5jdGlvbigpeyAKCWZvciAoIHZhciBpZCBpbiBqUXVlcnkuY2FjaGUgKQoJCS8vIFNraXAgdGhlIHdpbmRvdwoJCWlmICggaWQgIT0gMSAmJiBqUXVlcnkuY2FjaGVbIGlkIF0uaGFuZGxlICkKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggalF1ZXJ5LmNhY2hlWyBpZCBdLmhhbmRsZS5lbGVtICk7Cn0pOyAKKGZ1bmN0aW9uKCl7CgoJalF1ZXJ5LnN1cHBvcnQgPSB7fTsKCgl2YXIgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKCQlzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7CgoJZGl2LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CglkaXYuaW5uZXJIVE1MID0gJyAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPSIvYSIgc3R5bGU9ImNvbG9yOnJlZDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU7Ij5hPC9hPjxzZWxlY3Q+PG9wdGlvbj50ZXh0PC9vcHRpb24+PC9zZWxlY3Q+PG9iamVjdD48cGFyYW0vPjwvb2JqZWN0Pic7CgoJdmFyIGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLAoJCWEgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTsKCgkvLyBDYW4ndCBnZXQgYmFzaWMgdGVzdCBzdXBwb3J0CglpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7CgkJcmV0dXJuOwoJfQoKCWpRdWVyeS5zdXBwb3J0ID0gewoJCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKCQlsZWFkaW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMywKCQkKCQkvLyBNYWtlIHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRlZAoJCS8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50byBlbXB0eSB0YWJsZXMKCQl0Ym9keTogIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsCgkJCgkJLy8gTWFrZSBzdXJlIHRoYXQgeW91IGNhbiBnZXQgYWxsIGVsZW1lbnRzIGluIGFuIDxvYmplY3Q+IGVsZW1lbnQKCQkvLyBJRSA3IGFsd2F5cyByZXR1cm5zIG5vIHJlc3VsdHMKCQlvYmplY3RBbGw6ICEhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXQoJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGgsCgkJCgkJLy8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MCgkJLy8gVGhpcyByZXF1aXJlcyBhIHdyYXBwZXIgZWxlbWVudCBpbiBJRQoJCWh0bWxTZXJpYWxpemU6ICEhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLAoJCQoJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGUKCQkvLyAoSUUgdXNlcyAuY3NzVGV4dCBpbnN0ZWQpCgkJc3R5bGU6IC9yZWQvLnRlc3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICksCgkJCgkJLy8gTWFrZSBzdXJlIHRoYXQgVVJMcyBhcmVuJ3QgbWFuaXB1bGF0ZWQKCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KQoJCWhyZWZOb3JtYWxpemVkOiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiL2EiLAoJCQoJCS8vIE1ha2Ugc3VyZSB0aGF0IGVsZW1lbnQgb3BhY2l0eSBleGlzdHMKCQkvLyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVhZCkKCQlvcGFjaXR5OiBhLnN0eWxlLm9wYWNpdHkgPT09ICIwLjUiLAoJCQoJCS8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKCQkvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpCgkJY3NzRmxvYXQ6ICEhYS5zdHlsZS5jc3NGbG9hdCwKCgkJLy8gV2lsbCBiZSBkZWZpbmVkIGxhdGVyCgkJc2NyaXB0RXZhbDogZmFsc2UsCgkJbm9DbG9uZUV2ZW50OiB0cnVlLAoJCWJveE1vZGVsOiBudWxsCgl9OwoJCglzY3JpcHQudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiOwoJdHJ5IHsKCQlzY3JpcHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCAid2luZG93LiIgKyBpZCArICI9MTsiICkgKTsKCX0gY2F0Y2goZSl7fQoKCXJvb3QuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIHJvb3QuZmlyc3RDaGlsZCApOwoJCgkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZXhlY3V0aW9uIG9mIGNvZGUgd29ya3MgYnkgaW5qZWN0aW5nIGEgc2NyaXB0CgkvLyB0YWcgd2l0aCBhcHBlbmRDaGlsZC9jcmVhdGVUZXh0Tm9kZQoJLy8gKElFIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzLCBmYWlscywgYW5kIHVzZXMgLnRleHQgaW5zdGVhZCkKCWlmICggd2luZG93WyBpZCBdICkgewoJCWpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgPSB0cnVlOwoJCWRlbGV0ZSB3aW5kb3dbIGlkIF07Cgl9CgoJcm9vdC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CgoJaWYgKCBkaXYuYXR0YWNoRXZlbnQgJiYgZGl2LmZpcmVFdmVudCApIHsKCQlkaXYuYXR0YWNoRXZlbnQoIm9uY2xpY2siLCBmdW5jdGlvbigpewoJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQoJCQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9lcyB0aGlzKQoJCQlqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgPSBmYWxzZTsKCQkJZGl2LmRldGFjaEV2ZW50KCJvbmNsaWNrIiwgYXJndW1lbnRzLmNhbGxlZSk7CgkJfSk7CgkJZGl2LmNsb25lTm9kZSh0cnVlKS5maXJlRXZlbnQoIm9uY2xpY2siKTsKCX0KCgkvLyBGaWd1cmUgb3V0IGlmIHRoZSBXM0MgYm94IG1vZGVsIHdvcmtzIGFzIGV4cGVjdGVkCgkvLyBkb2N1bWVudC5ib2R5IG11c3QgZXhpc3QgYmVmb3JlIHdlIGNhbiBkbyB0aGlzCglqUXVlcnkoZnVuY3Rpb24oKXsKCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJZGl2LnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLnBhZGRpbmdMZWZ0ID0gIjFweCI7CgoJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIGRpdiApOwoJCWpRdWVyeS5ib3hNb2RlbCA9IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsID0gZGl2Lm9mZnNldFdpZHRoID09PSAyOwoJCWRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoIGRpdiApLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Cgl9KTsKfSkoKTsKCnZhciBzdHlsZUZsb2F0ID0galF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiOwoKalF1ZXJ5LnByb3BzID0gewoJImZvciI6ICJodG1sRm9yIiwKCSJjbGFzcyI6ICJjbGFzc05hbWUiLAoJImZsb2F0Ijogc3R5bGVGbG9hdCwKCWNzc0Zsb2F0OiBzdHlsZUZsb2F0LAoJc3R5bGVGbG9hdDogc3R5bGVGbG9hdCwKCXJlYWRvbmx5OiAicmVhZE9ubHkiLAoJbWF4bGVuZ3RoOiAibWF4TGVuZ3RoIiwKCWNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAoJcm93c3BhbjogInJvd1NwYW4iLAoJdGFiaW5kZXg6ICJ0YWJJbmRleCIKfTsKalF1ZXJ5LmZuLmV4dGVuZCh7CgkvLyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQKCV9sb2FkOiBqUXVlcnkuZm4ubG9hZCwKCglsb2FkOiBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkgewoJCWlmICggdHlwZW9mIHVybCAhPT0gInN0cmluZyIgKQoJCQlyZXR1cm4gdGhpcy5fbG9hZCggdXJsICk7CgoJCXZhciBvZmYgPSB1cmwuaW5kZXhPZigiICIpOwoJCWlmICggb2ZmID49IDAgKSB7CgkJCXZhciBzZWxlY3RvciA9IHVybC5zbGljZShvZmYsIHVybC5sZW5ndGgpOwoJCQl1cmwgPSB1cmwuc2xpY2UoMCwgb2ZmKTsKCQl9CgoJCS8vIERlZmF1bHQgdG8gYSBHRVQgcmVxdWVzdAoJCXZhciB0eXBlID0gIkdFVCI7CgoJCS8vIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHdhcyBwcm92aWRlZAoJCWlmICggcGFyYW1zICkKCQkJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCgkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoJCQkJLy8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gcGFyYW1zOwoJCQkJcGFyYW1zID0gbnVsbDsKCgkJCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKCQkJfSBlbHNlIGlmKCB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0IiApIHsKCQkJCXBhcmFtcyA9IGpRdWVyeS5wYXJhbSggcGFyYW1zICk7CgkJCQl0eXBlID0gIlBPU1QiOwoJCQl9CgoJCXZhciBzZWxmID0gdGhpczsKCgkJLy8gUmVxdWVzdCB0aGUgcmVtb3RlIGRvY3VtZW50CgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IHVybCwKCQkJdHlwZTogdHlwZSwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zLAoJCQljb21wbGV0ZTogZnVuY3Rpb24ocmVzLCBzdGF0dXMpewoJCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaW5qZWN0IHRoZSBIVE1MIGludG8gYWxsIHRoZSBtYXRjaGVkIGVsZW1lbnRzCgkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2VzcyIgfHwgc3RhdHVzID09ICJub3Rtb2RpZmllZCIgKQoJCQkJCS8vIFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQKCQkJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCQkJCQkJLy8gQ3JlYXRlIGEgZHVtbXkgZGl2IHRvIGhvbGQgdGhlIHJlc3VsdHMKCQkJCQkJalF1ZXJ5KCI8ZGl2Lz4iKQoJCQkJCQkJLy8gaW5qZWN0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgaW4sIHJlbW92aW5nIHRoZSBzY3JpcHRzCgkJCQkJCQkvLyB0byBhdm9pZCBhbnkgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMgaW4gSUUKCQkJCQkJCS5hcHBlbmQocmVzLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC88c2NyaXB0KC58XHMpKj9cL3NjcmlwdD4vZywgIiIpKQoKCQkJCQkJCS8vIExvY2F0ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzCgkJCQkJCQkuZmluZChzZWxlY3RvcikgOgoKCQkJCQkJLy8gSWYgbm90LCBqdXN0IGluamVjdCB0aGUgZnVsbCByZXN1bHQKCQkJCQkJcmVzLnJlc3BvbnNlVGV4dCApOwoKCQkJCWlmKCBjYWxsYmFjayApCgkJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgW3Jlcy5yZXNwb25zZVRleHQsIHN0YXR1cywgcmVzXSApOwoJCQl9CgkJfSk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGpRdWVyeS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpOwoJfSwKCXNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMuZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpIDogdGhpczsKCQl9KQoJCS5maWx0ZXIoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJgoJCQkJKHRoaXMuY2hlY2tlZCB8fCAvc2VsZWN0fHRleHRhcmVhL2kudGVzdCh0aGlzLm5vZGVOYW1lKSB8fAoJCQkJCS90ZXh0fGhpZGRlbnxwYXNzd29yZHxzZWFyY2gvaS50ZXN0KHRoaXMudHlwZSkpOwoJCX0pCgkJLm1hcChmdW5jdGlvbihpLCBlbGVtKXsKCQkJdmFyIHZhbCA9IGpRdWVyeSh0aGlzKS52YWwoKTsKCQkJcmV0dXJuIHZhbCA9PSBudWxsID8gbnVsbCA6CgkJCQlqUXVlcnkuaXNBcnJheSh2YWwpID8KCQkJCQlqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKHZhbCwgaSl7CgkJCQkJCXJldHVybiB7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKCQkJCQl9KSA6CgkJCQkJe25hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbH07CgkJfSkuZ2V0KCk7Cgl9Cn0pOwoKLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHMKalF1ZXJ5LmVhY2goICJhamF4U3RhcnQsYWpheFN0b3AsYWpheENvbXBsZXRlLGFqYXhFcnJvcixhamF4U3VjY2VzcyxhamF4U2VuZCIuc3BsaXQoIiwiKSwgZnVuY3Rpb24oaSxvKXsKCWpRdWVyeS5mbltvXSA9IGZ1bmN0aW9uKGYpewoJCXJldHVybiB0aGlzLmJpbmQobywgZik7Cgl9Owp9KTsKCnZhciBqc2MgPSBub3coKTsKCmpRdWVyeS5leHRlbmQoewogIAoJZ2V0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21taXRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJY2FsbGJhY2sgPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6ICJHRVQiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQodXJsLCBudWxsLCBjYWxsYmFjaywgInNjcmlwdCIpOwoJfSwKCglnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIpOwoJfSwKCglwb3N0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHt9OwoJCX0KCgkJcmV0dXJuIGpRdWVyeS5hamF4KHsKCQkJdHlwZTogIlBPU1QiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWFqYXhTZXR1cDogZnVuY3Rpb24oIHNldHRpbmdzICkgewoJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHNldHRpbmdzICk7Cgl9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQlnbG9iYWw6IHRydWUsCgkJdHlwZTogIkdFVCIsCgkJY29udGVudFR5cGU6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAoJCXByb2Nlc3NEYXRhOiB0cnVlLAoJCWFzeW5jOiB0cnVlLAoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCSovCgkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdDsgTWljcm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQoJCS8vIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3LCBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCQkvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZW4gYnkgY2FsbGluZyBqUXVlcnkuYWpheFNldHVwCgkJeGhyOmZ1bmN0aW9uKCl7CgkJCXJldHVybiB3aW5kb3cuQWN0aXZlWE9iamVjdCA/IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgkJfSwKCQlhY2NlcHRzOiB7CgkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJc2NyaXB0OiAidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiwKCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCgkJCXRleHQ6ICJ0ZXh0L3BsYWluIiwKCQkJX2RlZmF1bHQ6ICIqLyoiCgkJfQoJfSwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoKCWFqYXg6IGZ1bmN0aW9uKCBzICkgewoJCS8vIEV4dGVuZCB0aGUgc2V0dGluZ3MsIGJ1dCByZS1leHRlbmQgJ3MnIHNvIHRoYXQgaXQgY2FuIGJlCgkJLy8gY2hlY2tlZCBhZ2FpbiBsYXRlciAoaW4gdGhlIHRlc3Qgc3VpdGUsIHNwZWNpZmljYWxseSkKCQlzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBzLCBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBqUXVlcnkuYWpheFNldHRpbmdzLCBzKSk7CgoJCXZhciBqc29ucCwganNyZSA9IC89XD8oJnwkKS9nLCBzdGF0dXMsIGRhdGEsCgkJCXR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gY29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApCgkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbShzLmRhdGEpOwoKCQkvLyBIYW5kbGUgSlNPTlAgUGFyYW1ldGVyIENhbGxiYWNrcwoJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbnAiICkgewoJCQlpZiAoIHR5cGUgPT0gIkdFVCIgKSB7CgkJCQlpZiAoICFzLnVybC5tYXRjaChqc3JlKSApCgkJCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKCQkJfSBlbHNlIGlmICggIXMuZGF0YSB8fCAhcy5kYXRhLm1hdGNoKGpzcmUpICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgPyBzLmRhdGEgKyAiJiIgOiAiIikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CgkJCXMuZGF0YVR5cGUgPSAianNvbiI7CgkJfQoKCQkvLyBCdWlsZCB0ZW1wb3JhcnkgSlNPTlAgZnVuY3Rpb24KCQlpZiAoIHMuZGF0YVR5cGUgPT0gImpzb24iICYmIChzLmRhdGEgJiYgcy5kYXRhLm1hdGNoKGpzcmUpIHx8IHMudXJsLm1hdGNoKGpzcmUpKSApIHsKCQkJanNvbnAgPSAianNvbnAiICsganNjKys7CgoJCQkvLyBSZXBsYWNlIHRoZSA9PyBzZXF1ZW5jZSBib3RoIGluIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHRoZSBkYXRhCgkJCWlmICggcy5kYXRhICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOwoJCQlzLnVybCA9IHMudXJsLnJlcGxhY2UoanNyZSwgIj0iICsganNvbnAgKyAiJDEiKTsKCgkJCS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCgkJCS8vIHRoYXQgYSBKU09OUCBzdHlsZSByZXNwb25zZSBpcyBleGVjdXRlZCBwcm9wZXJseQoJCQlzLmRhdGFUeXBlID0gInNjcmlwdCI7CgoJCQkvLyBIYW5kbGUgSlNPTlAtc3R5bGUgbG9hZGluZwoJCQl3aW5kb3dbIGpzb25wIF0gPSBmdW5jdGlvbih0bXApewoJCQkJZGF0YSA9IHRtcDsKCQkJCXN1Y2Nlc3MoKTsKCQkJCWNvbXBsZXRlKCk7CgkJCQkvLyBHYXJiYWdlIGNvbGxlY3QKCQkJCXdpbmRvd1sganNvbnAgXSA9IHVuZGVmaW5lZDsKCQkJCXRyeXsgZGVsZXRlIHdpbmRvd1sganNvbnAgXTsgfSBjYXRjaChlKXt9CgkJCQlpZiAoIGhlYWQgKQoJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJCQl9OwoJCX0KCgkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHMuY2FjaGUgPT0gbnVsbCApCgkJCXMuY2FjaGUgPSBmYWxzZTsKCgkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSAmJiB0eXBlID09ICJHRVQiICkgewoJCQl2YXIgdHMgPSBub3coKTsKCQkJLy8gdHJ5IHJlcGxhY2luZyBfPSBpZiBpdCBpcyB0aGVyZQoJCQl2YXIgcmV0ID0gcy51cmwucmVwbGFjZSgvKFw/fCYpXz0uKj8oJnwkKS8sICIkMV89IiArIHRzICsgIiQyIik7CgkJCS8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKCQkJcy51cmwgPSByZXQgKyAoKHJldCA9PSBzLnVybCkgPyAocy51cmwubWF0Y2goL1w/LykgPyAiJiIgOiAiPyIpICsgIl89IiArIHRzIDogIiIpOwoJCX0KCgkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybCBmb3IgZ2V0IHJlcXVlc3RzCgkJaWYgKCBzLmRhdGEgJiYgdHlwZSA9PSAiR0VUIiApIHsKCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIHMuZGF0YTsKCgkJCS8vIElFIGxpa2VzIHRvIHNlbmQgYm90aCBnZXQgYW5kIHBvc3QgZGF0YSwgcHJldmVudCB0aGlzCgkJCXMuZGF0YSA9IG51bGw7CgkJfQoKCQkvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzCgkJaWYgKCBzLmdsb2JhbCAmJiAhIGpRdWVyeS5hY3RpdmUrKyApCgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0YXJ0IiApOwoKCQkvLyBNYXRjaGVzIGFuIGFic29sdXRlIFVSTCwgYW5kIHNhdmVzIHRoZSBkb21haW4KCQl2YXIgcGFydHMgPSAvXihcdys6KT9cL1wvKFteXC8/I10rKS8uZXhlYyggcy51cmwgKTsKCgkJLy8gSWYgd2UncmUgcmVxdWVzdGluZyBhIHJlbW90ZSBkb2N1bWVudAoJCS8vIGFuZCB0cnlpbmcgdG8gbG9hZCBKU09OIG9yIFNjcmlwdCB3aXRoIGEgR0VUCgkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHR5cGUgPT0gIkdFVCIgJiYgcGFydHMKCQkJJiYgKCBwYXJ0c1sxXSAmJiBwYXJ0c1sxXSAhPSBsb2NhdGlvbi5wcm90b2NvbCB8fCBwYXJ0c1syXSAhPSBsb2NhdGlvbi5ob3N0ICkpewoKCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOwoJCQl2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CgkJCXNjcmlwdC5zcmMgPSBzLnVybDsKCQkJaWYgKHMuc2NyaXB0Q2hhcnNldCkKCQkJCXNjcmlwdC5jaGFyc2V0ID0gcy5zY3JpcHRDaGFyc2V0OwoKCQkJLy8gSGFuZGxlIFNjcmlwdCBsb2FkaW5nCgkJCWlmICggIWpzb25wICkgewoJCQkJdmFyIGRvbmUgPSBmYWxzZTsKCgkJCQkvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBicm93c2VycwoJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpewoJCQkJCWlmICggIWRvbmUgJiYgKCF0aGlzLnJlYWR5U3RhdGUgfHwKCQkJCQkJCXRoaXMucmVhZHlTdGF0ZSA9PSAibG9hZGVkIiB8fCB0aGlzLnJlYWR5U3RhdGUgPT0gImNvbXBsZXRlIikgKSB7CgkJCQkJCWRvbmUgPSB0cnVlOwoJCQkJCQlzdWNjZXNzKCk7CgkJCQkJCWNvbXBsZXRlKCk7CgoJCQkJCQkvLyBIYW5kbGUgbWVtb3J5IGxlYWsgaW4gSUUKCQkJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQkJCQl9CgkJCQl9OwoJCQl9CgoJCQloZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7CgoJCQkvLyBXZSBoYW5kbGUgZXZlcnl0aGluZyB1c2luZyB0aGUgc2NyaXB0IGVsZW1lbnQgaW5qZWN0aW9uCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQl2YXIgcmVxdWVzdERvbmUgPSBmYWxzZTsKCgkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdAoJCXZhciB4aHIgPSBzLnhocigpOwoKCQkvLyBPcGVuIHRoZSBzb2NrZXQKCQkvLyBQYXNzaW5nIG51bGwgdXNlcm5hbWUsIGdlbmVyYXRlcyBhIGxvZ2luIHBvcHVwIG9uIE9wZXJhICgjMjg2NSkKCQlpZiggcy51c2VybmFtZSApCgkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkKTsKCQllbHNlCgkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jKTsKCgkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMKCQl0cnkgewoJCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQkJaWYgKCBzLmRhdGEgKQoJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUpOwoKCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBoZWFkZXIsIGlmIGlmTW9kaWZpZWQgbW9kZS4KCQkJaWYgKCBzLmlmTW9kaWZpZWQgKQoJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIiwKCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkW3MudXJsXSB8fCAiVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQiICk7CgoJCQkvLyBTZXQgaGVhZGVyIHNvIHRoZSBjYWxsZWQgc2NyaXB0IGtub3dzIHRoYXQgaXQncyBhbiBYTUxIdHRwUmVxdWVzdAoJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsICJYTUxIdHRwUmVxdWVzdCIpOwoKCQkJLy8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZQoJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0Iiwgcy5kYXRhVHlwZSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSArICIsICovKiIgOgoJCQkJcy5hY2NlcHRzLl9kZWZhdWx0ICk7CgkJfSBjYXRjaChlKXt9CgoJCS8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKCQlpZiAoIHMuYmVmb3JlU2VuZCAmJiBzLmJlZm9yZVNlbmQoeGhyLCBzKSA9PT0gZmFsc2UgKSB7CgkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgoJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCS8vIGNsb3NlIG9wZW5kZWQgc29ja2V0CgkJCXhoci5hYm9ydCgpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoIHMuZ2xvYmFsICkKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTZW5kIiwgW3hociwgc10pOwoKCQkvLyBXYWl0IGZvciBhIHJlc3BvbnNlIHRvIGNvbWUgYmFjawoJCXZhciBvbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbihpc1RpbWVvdXQpewoJCQkvLyBUaGUgcmVxdWVzdCB3YXMgYWJvcnRlZCwgY2xlYXIgdGhlIGludGVydmFsIGFuZCBkZWNyZW1lbnQgalF1ZXJ5LmFjdGl2ZQoJCQlpZiAoeGhyLnJlYWR5U3RhdGUgPT0gMCkgewoJCQkJaWYgKGl2YWwpIHsKCQkJCQkvLyBjbGVhciBwb2xsIGludGVydmFsCgkJCQkJY2xlYXJJbnRlcnZhbChpdmFsKTsKCQkJCQlpdmFsID0gbnVsbDsKCQkJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKCQkJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKCQkJCX0KCQkJLy8gVGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlIGFuZCB0aGUgZGF0YSBpcyBhdmFpbGFibGUsIG9yIHRoZSByZXF1ZXN0IHRpbWVkIG91dAoJCQl9IGVsc2UgaWYgKCAhcmVxdWVzdERvbmUgJiYgeGhyICYmICh4aHIucmVhZHlTdGF0ZSA9PSA0IHx8IGlzVGltZW91dCA9PSAidGltZW91dCIpICkgewoJCQkJcmVxdWVzdERvbmUgPSB0cnVlOwoKCQkJCS8vIGNsZWFyIHBvbGwgaW50ZXJ2YWwKCQkJCWlmIChpdmFsKSB7CgkJCQkJY2xlYXJJbnRlcnZhbChpdmFsKTsKCQkJCQlpdmFsID0gbnVsbDsKCQkJCX0KCgkJCQlzdGF0dXMgPSBpc1RpbWVvdXQgPT0gInRpbWVvdXQiID8gInRpbWVvdXQiIDoKCQkJCQkhalF1ZXJ5Lmh0dHBTdWNjZXNzKCB4aHIgKSA/ICJlcnJvciIgOgoJCQkJCXMuaWZNb2RpZmllZCAmJiBqUXVlcnkuaHR0cE5vdE1vZGlmaWVkKCB4aHIsIHMudXJsICkgPyAibm90bW9kaWZpZWQiIDoKCQkJCQkic3VjY2VzcyI7CgoJCQkJaWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiICkgewoJCQkJCS8vIFdhdGNoIGZvciwgYW5kIGNhdGNoLCBYTUwgZG9jdW1lbnQgcGFyc2UgZXJyb3JzCgkJCQkJdHJ5IHsKCQkJCQkJLy8gcHJvY2VzcyB0aGUgZGF0YSAocnVucyB0aGUgeG1sIHRocm91Z2ggaHR0cERhdGEgcmVnYXJkbGVzcyBvZiBjYWxsYmFjaykKCQkJCQkJZGF0YSA9IGpRdWVyeS5odHRwRGF0YSggeGhyLCBzLmRhdGFUeXBlLCBzICk7CgkJCQkJfSBjYXRjaChlKSB7CgkJCQkJCXN0YXR1cyA9ICJwYXJzZXJlcnJvciI7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdG1vZGlmaWVkCgkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2VzcyIgKSB7CgkJCQkJLy8gQ2FjaGUgTGFzdC1Nb2RpZmllZCBoZWFkZXIsIGlmIGlmTW9kaWZpZWQgbW9kZS4KCQkJCQl2YXIgbW9kUmVzOwoJCQkJCXRyeSB7CgkJCQkJCW1vZFJlcyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpOwoJCQkJCX0gY2F0Y2goZSkge30gLy8gc3dhbGxvdyBleGNlcHRpb24gdGhyb3duIGJ5IEZGIGlmIGhlYWRlciBpcyBub3QgYXZhaWxhYmxlCgoJCQkJCWlmICggcy5pZk1vZGlmaWVkICYmIG1vZFJlcyApCgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdID0gbW9kUmVzOwoKCQkJCQkvLyBKU09OUCBoYW5kbGVzIGl0cyBvd24gc3VjY2VzcyBjYWxsYmFjawoJCQkJCWlmICggIWpzb25wICkKCQkJCQkJc3VjY2VzcygpOwoJCQkJfSBlbHNlCgkJCQkJalF1ZXJ5LmhhbmRsZUVycm9yKHMsIHhociwgc3RhdHVzKTsKCgkJCQkvLyBGaXJlIHRoZSBjb21wbGV0ZSBoYW5kbGVycwoJCQkJY29tcGxldGUoKTsKCgkJCQlpZiAoIGlzVGltZW91dCApCgkJCQkJeGhyLmFib3J0KCk7CgoJCQkJLy8gU3RvcCBtZW1vcnkgbGVha3MKCQkJCWlmICggcy5hc3luYyApCgkJCQkJeGhyID0gbnVsbDsKCQkJfQoJCX07CgoJCWlmICggcy5hc3luYyApIHsKCQkJLy8gZG9uJ3QgYXR0YWNoIHRoZSBoYW5kbGVyIHRvIHRoZSByZXF1ZXN0LCBqdXN0IHBvbGwgaXQgaW5zdGVhZAoJCQl2YXIgaXZhbCA9IHNldEludGVydmFsKG9ucmVhZHlzdGF0ZWNoYW5nZSwgMTMpOwoKCQkJLy8gVGltZW91dCBjaGVja2VyCgkJCWlmICggcy50aW1lb3V0ID4gMCApCgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSByZXF1ZXN0IGlzIHN0aWxsIGhhcHBlbmluZwoJCQkJCWlmICggeGhyICYmICFyZXF1ZXN0RG9uZSApCgkJCQkJCW9ucmVhZHlzdGF0ZWNoYW5nZSggInRpbWVvdXQiICk7CgkJCQl9LCBzLnRpbWVvdXQpOwoJCX0KCgkJLy8gU2VuZCB0aGUgZGF0YQoJCXRyeSB7CgkJCXhoci5zZW5kKHMuZGF0YSk7CgkJfSBjYXRjaChlKSB7CgkJCWpRdWVyeS5oYW5kbGVFcnJvcihzLCB4aHIsIG51bGwsIGUpOwoJCX0KCgkJLy8gZmlyZWZveCAxLjUgZG9lc24ndCBmaXJlIHN0YXRlY2hhbmdlIGZvciBzeW5jIHJlcXVlc3RzCgkJaWYgKCAhcy5hc3luYyApCgkJCW9ucmVhZHlzdGF0ZWNoYW5nZSgpOwoKCQlmdW5jdGlvbiBzdWNjZXNzKCl7CgkJCS8vIElmIGEgbG9jYWwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgZmlyZSBpdCBhbmQgcGFzcyBpdCB0aGUgZGF0YQoJCQlpZiAoIHMuc3VjY2VzcyApCgkJCQlzLnN1Y2Nlc3MoIGRhdGEsIHN0YXR1cyApOwoKCQkJLy8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCgkJCWlmICggcy5nbG9iYWwgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3VjY2VzcyIsIFt4aHIsIHNdICk7CgkJfQoKCQlmdW5jdGlvbiBjb21wbGV0ZSgpewoJCQkvLyBQcm9jZXNzIHJlc3VsdAoJCQlpZiAoIHMuY29tcGxldGUgKQoJCQkJcy5jb21wbGV0ZSh4aHIsIHN0YXR1cyk7CgoJCQkvLyBUaGUgcmVxdWVzdCB3YXMgY29tcGxldGVkCgkJCWlmICggcy5nbG9iYWwgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4Q29tcGxldGUiLCBbeGhyLCBzXSApOwoKCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCWlmICggcy5nbG9iYWwgJiYgISAtLWpRdWVyeS5hY3RpdmUgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKCQl9CgoJCS8vIHJldHVybiBYTUxIdHRwUmVxdWVzdCB0byBhbGxvdyBhYm9ydGluZyB0aGUgcmVxdWVzdCBldGMuCgkJcmV0dXJuIHhocjsKCX0sCgoJaGFuZGxlRXJyb3I6IGZ1bmN0aW9uKCBzLCB4aHIsIHN0YXR1cywgZSApIHsKCQkvLyBJZiBhIGxvY2FsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIGZpcmUgaXQKCQlpZiAoIHMuZXJyb3IgKSBzLmVycm9yKCB4aHIsIHN0YXR1cywgZSApOwoKCQkvLyBGaXJlIHRoZSBnbG9iYWwgY2FsbGJhY2sKCQlpZiAoIHMuZ2xvYmFsICkKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4RXJyb3IiLCBbeGhyLCBzLCBlXSApOwoJfSwKCgkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKCWFjdGl2ZTogMCwKCgkvLyBEZXRlcm1pbmVzIGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdAoJaHR0cFN1Y2Nlc3M6IGZ1bmN0aW9uKCB4aHIgKSB7CgkJdHJ5IHsKCQkJLy8gSUUgZXJyb3Igc29tZXRpbWVzIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDQgc28gdHJlYXQgaXQgYXMgc3VjY2Vzcywgc2VlICMxNDUwCgkJCXJldHVybiAheGhyLnN0YXR1cyAmJiBsb2NhdGlvbi5wcm90b2NvbCA9PSAiZmlsZToiIHx8CgkJCQkoIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDAgKSB8fCB4aHIuc3RhdHVzID09IDMwNCB8fCB4aHIuc3RhdHVzID09IDEyMjM7CgkJfSBjYXRjaChlKXt9CgkJcmV0dXJuIGZhbHNlOwoJfSwKCgkvLyBEZXRlcm1pbmVzIGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHJldHVybnMgTm90TW9kaWZpZWQKCWh0dHBOb3RNb2RpZmllZDogZnVuY3Rpb24oIHhociwgdXJsICkgewoJCXRyeSB7CgkJCXZhciB4aHJSZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKCgkJCS8vIEZpcmVmb3ggYWx3YXlzIHJldHVybnMgMjAwLiBjaGVjayBMYXN0LU1vZGlmaWVkIGRhdGUKCQkJcmV0dXJuIHhoci5zdGF0dXMgPT0gMzA0IHx8IHhoclJlcyA9PSBqUXVlcnkubGFzdE1vZGlmaWVkW3VybF07CgkJfSBjYXRjaChlKXt9CgkJcmV0dXJuIGZhbHNlOwoJfSwKCglodHRwRGF0YTogZnVuY3Rpb24oIHhociwgdHlwZSwgcyApIHsKCQl2YXIgY3QgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpLAoJCQl4bWwgPSB0eXBlID09ICJ4bWwiIHx8ICF0eXBlICYmIGN0ICYmIGN0LmluZGV4T2YoInhtbCIpID49IDAsCgkJCWRhdGEgPSB4bWwgPyB4aHIucmVzcG9uc2VYTUwgOiB4aHIucmVzcG9uc2VUZXh0OwoKCQlpZiAoIHhtbCAmJiBkYXRhLmRvY3VtZW50RWxlbWVudC50YWdOYW1lID09ICJwYXJzZXJlcnJvciIgKQoJCQl0aHJvdyAicGFyc2VyZXJyb3IiOwoJCQkKCQkvLyBBbGxvdyBhIHByZS1maWx0ZXJpbmcgZnVuY3Rpb24gdG8gc2FuaXRpemUgdGhlIHJlc3BvbnNlCgkJLy8gcyAhPSBudWxsIGlzIGNoZWNrZWQgdG8ga2VlcCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoJCWlmKCBzICYmIHMuZGF0YUZpbHRlciApCgkJCWRhdGEgPSBzLmRhdGFGaWx0ZXIoIGRhdGEsIHR5cGUgKTsKCgkJLy8gVGhlIGZpbHRlciBjYW4gYWN0dWFsbHkgcGFyc2UgdGhlIHJlc3BvbnNlCgkJaWYoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApewoKCQkJLy8gSWYgdGhlIHR5cGUgaXMgInNjcmlwdCIsIGV2YWwgaXQgaW4gZ2xvYmFsIGNvbnRleHQKCQkJaWYgKCB0eXBlID09ICJzY3JpcHQiICkKCQkJCWpRdWVyeS5nbG9iYWxFdmFsKCBkYXRhICk7CgoJCQkvLyBHZXQgdGhlIEphdmFTY3JpcHQgb2JqZWN0LCBpZiBKU09OIGlzIHVzZWQuCgkJCWlmICggdHlwZSA9PSAianNvbiIgKQoJCQkJZGF0YSA9IHdpbmRvd1siZXZhbCJdKCIoIiArIGRhdGEgKyAiKSIpOwoJCX0KCQkKCQlyZXR1cm4gZGF0YTsKCX0sCgoJLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKCS8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwoJcGFyYW06IGZ1bmN0aW9uKCBhICkgewoJCXZhciBzID0gWyBdOwoKCQlmdW5jdGlvbiBhZGQoIGtleSwgdmFsdWUgKXsKCQkJc1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKCQl9OwoKCQkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheQoJCS8vIG9mIGZvcm0gZWxlbWVudHMKCQlpZiAoIGpRdWVyeS5pc0FycmF5KGEpIHx8IGEuanF1ZXJ5ICkKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpewoJCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQkJfSk7CgoJCS8vIE90aGVyd2lzZSwgYXNzdW1lIHRoYXQgaXQncyBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzCgkJZWxzZQoJCQkvLyBTZXJpYWxpemUgdGhlIGtleS92YWx1ZXMKCQkJZm9yICggdmFyIGogaW4gYSApCgkJCQkvLyBJZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiB0aGUga2V5IG5hbWVzIG5lZWQgdG8gYmUgcmVwZWF0ZWQKCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoYVtqXSkgKQoJCQkJCWpRdWVyeS5lYWNoKCBhW2pdLCBmdW5jdGlvbigpewoJCQkJCQlhZGQoIGosIHRoaXMgKTsKCQkJCQl9KTsKCQkJCWVsc2UKCQkJCQlhZGQoIGosIGpRdWVyeS5pc0Z1bmN0aW9uKGFbal0pID8gYVtqXSgpIDogYVtqXSApOwoKCQkvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uCgkJcmV0dXJuIHMuam9pbigiJiIpLnJlcGxhY2UoLyUyMC9nLCAiKyIpOwoJfQoKfSk7CnZhciBlbGVtZGlzcGxheSA9IHt9LAoJdGltZXJJZCwKCWZ4QXR0cnMgPSBbCgkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJLy8gd2lkdGggYW5pbWF0aW9ucwoJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucwoJCVsgIm9wYWNpdHkiIF0KCV07CgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgbnVtICl7Cgl2YXIgb2JqID0ge307CglqUXVlcnkuZWFjaCggZnhBdHRycy5jb25jYXQuYXBwbHkoW10sIGZ4QXR0cnMuc2xpY2UoMCxudW0pKSwgZnVuY3Rpb24oKXsKCQlvYmpbIHRoaXMgXSA9IHR5cGU7Cgl9KTsKCXJldHVybiBvYmo7Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJc2hvdzogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2spewoJCWlmICggc3BlZWQgKSB7CgkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJzaG93IiwgMyksIHNwZWVkLCBjYWxsYmFjayk7CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKCQkJCXZhciBvbGQgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpOwoJCQkJCgkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSBvbGQgfHwgIiI7CgkJCQkKCQkJCWlmICggalF1ZXJ5LmNzcyh0aGlzW2ldLCAiZGlzcGxheSIpID09PSAibm9uZSIgKSB7CgkJCQkJdmFyIHRhZ05hbWUgPSB0aGlzW2ldLnRhZ05hbWUsIGRpc3BsYXk7CgkJCQkJCgkJCQkJaWYgKCBlbGVtZGlzcGxheVsgdGFnTmFtZSBdICkgewoJCQkJCQlkaXNwbGF5ID0gZWxlbWRpc3BsYXlbIHRhZ05hbWUgXTsKCQkJCQl9IGVsc2UgewoJCQkJCQl2YXIgZWxlbSA9IGpRdWVyeSgiPCIgKyB0YWdOYW1lICsgIiAvPiIpLmFwcGVuZFRvKCJib2R5Iik7CgkJCQkJCQoJCQkJCQlkaXNwbGF5ID0gZWxlbS5jc3MoImRpc3BsYXkiKTsKCQkJCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKQoJCQkJCQkJZGlzcGxheSA9ICJibG9jayI7CgkJCQkJCQoJCQkJCQllbGVtLnJlbW92ZSgpOwoJCQkJCQkKCQkJCQkJZWxlbWRpc3BsYXlbIHRhZ05hbWUgXSA9IGRpc3BsYXk7CgkJCQkJfQoJCQkJCQoJCQkJCWpRdWVyeS5kYXRhKHRoaXNbaV0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSk7CgkJCQl9CgkJCX0KCgkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAoJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpIHx8ICIiOwoJCQl9CgkJCQoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCWhpZGU6IGZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXsKCQlpZiAoIHNwZWVkICkgewoJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgiaGlkZSIsIDMpLCBzcGVlZCwgY2FsbGJhY2spOwoJCX0gZWxzZSB7CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl2YXIgb2xkID0galF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKTsKCQkJCWlmICggIW9sZCAmJiBvbGQgIT09ICJub25lIiApCgkJCQkJalF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBqUXVlcnkuY3NzKHRoaXNbaV0sICJkaXNwbGF5IikpOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApewoJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCS8vIFNhdmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rpb24KCV90b2dnbGU6IGpRdWVyeS5mbi50b2dnbGUsCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4sIGZuMiApewoJCXZhciBib29sID0gdHlwZW9mIGZuID09PSAiYm9vbGVhbiI7CgoJCXJldHVybiBqUXVlcnkuaXNGdW5jdGlvbihmbikgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oZm4yKSA/CgkJCXRoaXMuX3RvZ2dsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOgoJCQlmbiA9PSBudWxsIHx8IGJvb2wgPwoJCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCQkJdmFyIHN0YXRlID0gYm9vbCA/IGZuIDogalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIik7CgkJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCQl9KSA6CgkJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yKTsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbihzcGVlZCx0byxjYWxsYmFjayl7CgkJcmV0dXJuIHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTogdG99LCBzcGVlZCwgY2FsbGJhY2spOwoJfSwKCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIG9wdGFsbCA9IGpRdWVyeS5zcGVlZChzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CgoJCXJldHVybiB0aGlzWyBvcHRhbGwucXVldWUgPT09IGZhbHNlID8gImVhY2giIDogInF1ZXVlIiBdKGZ1bmN0aW9uKCl7CgkJCgkJCXZhciBvcHQgPSBqUXVlcnkuZXh0ZW5kKHt9LCBvcHRhbGwpLCBwLAoJCQkJaGlkZGVuID0gdGhpcy5ub2RlVHlwZSA9PSAxICYmIGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLAoJCQkJc2VsZiA9IHRoaXM7CgkKCQkJZm9yICggcCBpbiBwcm9wICkgewoJCQkJaWYgKCBwcm9wW3BdID09ICJoaWRlIiAmJiBoaWRkZW4gfHwgcHJvcFtwXSA9PSAic2hvdyIgJiYgIWhpZGRlbiApCgkJCQkJcmV0dXJuIG9wdC5jb21wbGV0ZS5jYWxsKHRoaXMpOwoKCQkJCWlmICggKCBwID09ICJoZWlnaHQiIHx8IHAgPT0gIndpZHRoIiApICYmIHRoaXMuc3R5bGUgKSB7CgkJCQkJLy8gU3RvcmUgZGlzcGxheSBwcm9wZXJ0eQoJCQkJCW9wdC5kaXNwbGF5ID0galF1ZXJ5LmNzcyh0aGlzLCAiZGlzcGxheSIpOwoKCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXQKCQkJCQlvcHQub3ZlcmZsb3cgPSB0aGlzLnN0eWxlLm92ZXJmbG93OwoJCQkJfQoJCQl9CgoJCQlpZiAoIG9wdC5vdmVyZmxvdyAhPSBudWxsICkKCQkJCXRoaXMuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKCgkJCW9wdC5jdXJBbmltID0galF1ZXJ5LmV4dGVuZCh7fSwgcHJvcCk7CgoJCQlqUXVlcnkuZWFjaCggcHJvcCwgZnVuY3Rpb24obmFtZSwgdmFsKXsKCQkJCXZhciBlID0gbmV3IGpRdWVyeS5meCggc2VsZiwgb3B0LCBuYW1lICk7CgoJCQkJaWYgKCAvdG9nZ2xlfHNob3d8aGlkZS8udGVzdCh2YWwpICkKCQkJCQllWyB2YWwgPT0gInRvZ2dsZSIgPyBoaWRkZW4gPyAic2hvdyIgOiAiaGlkZSIgOiB2YWwgXSggcHJvcCApOwoJCQkJZWxzZSB7CgkJCQkJdmFyIHBhcnRzID0gdmFsLnRvU3RyaW5nKCkubWF0Y2goL14oWystXT0pPyhbXGQrLS5dKykoLiopJC8pLAoJCQkJCQlzdGFydCA9IGUuY3VyKHRydWUpIHx8IDA7CgoJCQkJCWlmICggcGFydHMgKSB7CgkJCQkJCXZhciBlbmQgPSBwYXJzZUZsb2F0KHBhcnRzWzJdKSwKCQkJCQkJCXVuaXQgPSBwYXJ0c1szXSB8fCAicHgiOwoKCQkJCQkJLy8gV2UgbmVlZCB0byBjb21wdXRlIHN0YXJ0aW5nIHZhbHVlCgkJCQkJCWlmICggdW5pdCAhPSAicHgiICkgewoJCQkJCQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gKGVuZCB8fCAxKSArIHVuaXQ7CgkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8gZS5jdXIodHJ1ZSkpICogc3RhcnQ7CgkJCQkJCQlzZWxmLnN0eWxlWyBuYW1lIF0gPSBzdGFydCArIHVuaXQ7CgkJCQkJCX0KCgkJCQkJCS8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvbgoJCQkJCQlpZiAoIHBhcnRzWzFdICkKCQkJCQkJCWVuZCA9ICgocGFydHNbMV0gPT0gIi09IiA/IC0xIDogMSkgKiBlbmQpICsgc3RhcnQ7CgoJCQkJCQllLmN1c3RvbSggc3RhcnQsIGVuZCwgdW5pdCApOwoJCQkJCX0gZWxzZQoJCQkJCQllLmN1c3RvbSggc3RhcnQsIHZhbCwgIiIgKTsKCQkJCX0KCQkJfSk7CgoJCQkvLyBGb3IgSlMgc3RyaWN0IGNvbXBsaWFuY2UKCQkJcmV0dXJuIHRydWU7CgkJfSk7Cgl9LAoKCXN0b3A6IGZ1bmN0aW9uKGNsZWFyUXVldWUsIGdvdG9FbmQpewoJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOwoKCQlpZiAoY2xlYXJRdWV1ZSkKCQkJdGhpcy5xdWV1ZShbXSk7CgoJCXRoaXMuZWFjaChmdW5jdGlvbigpewoJCQkvLyBnbyBpbiByZXZlcnNlIG9yZGVyIHNvIGFueXRoaW5nIGFkZGVkIHRvIHRoZSBxdWV1ZSBkdXJpbmcgdGhlIGxvb3AgaXMgaWdub3JlZAoJCQlmb3IgKCB2YXIgaSA9IHRpbWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSApCgkJCQlpZiAoIHRpbWVyc1tpXS5lbGVtID09IHRoaXMgKSB7CgkJCQkJaWYgKGdvdG9FbmQpCgkJCQkJCS8vIGZvcmNlIHRoZSBuZXh0IHN0ZXAgdG8gYmUgdGhlIGxhc3QKCQkJCQkJdGltZXJzW2ldKHRydWUpOwoJCQkJCXRpbWVycy5zcGxpY2UoaSwgMSk7CgkJCQl9CgkJfSk7CgoJCS8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKCQlpZiAoIWdvdG9FbmQpCgkJCXRoaXMuZGVxdWV1ZSgpOwoKCQlyZXR1cm4gdGhpczsKCX0KCn0pOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCh7CglzbGlkZURvd246IGdlbkZ4KCJzaG93IiwgMSksCglzbGlkZVVwOiBnZW5GeCgiaGlkZSIsIDEpLAoJc2xpZGVUb2dnbGU6IGdlbkZ4KCJ0b2dnbGUiLCAxKSwKCWZhZGVJbjogeyBvcGFjaXR5OiAic2hvdyIgfSwKCWZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0KfSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICl7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgY2FsbGJhY2sgKXsKCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGNhbGxiYWNrICk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoKCXNwZWVkOiBmdW5jdGlvbihzcGVlZCwgZWFzaW5nLCBmbikgewoJCXZhciBvcHQgPSB0eXBlb2Ygc3BlZWQgPT09ICJvYmplY3QiID8gc3BlZWQgOiB7CgkJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKCQkJZHVyYXRpb246IHNwZWVkLAoJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKGVhc2luZykgJiYgZWFzaW5nCgkJfTsKCgkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CgkJCWpRdWVyeS5meC5zcGVlZHNbb3B0LmR1cmF0aW9uXSB8fCBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0OwoKCQkvLyBRdWV1ZWluZwoJCW9wdC5vbGQgPSBvcHQuY29tcGxldGU7CgkJb3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKXsKCQkJaWYgKCBvcHQucXVldWUgIT09IGZhbHNlICkKCQkJCWpRdWVyeSh0aGlzKS5kZXF1ZXVlKCk7CgkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApCgkJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9OwoKCQlyZXR1cm4gb3B0OwoJfSwKCgllYXNpbmc6IHsKCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKCQkJcmV0dXJuIGZpcnN0TnVtICsgZGlmZiAqIHA7CgkJfSwKCQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgewoJCQlyZXR1cm4gKCgtTWF0aC5jb3MocCpNYXRoLlBJKS8yKSArIDAuNSkgKiBkaWZmICsgZmlyc3ROdW07CgkJfQoJfSwKCgl0aW1lcnM6IFtdLAoKCWZ4OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCApewoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5lbGVtID0gZWxlbTsKCQl0aGlzLnByb3AgPSBwcm9wOwoKCQlpZiAoICFvcHRpb25zLm9yaWcgKQoJCQlvcHRpb25zLm9yaWcgPSB7fTsKCX0KCn0pOwoKalF1ZXJ5LmZ4LnByb3RvdHlwZSA9IHsKCgkvLyBTaW1wbGUgZnVuY3Rpb24gZm9yIHNldHRpbmcgYSBzdHlsZSB2YWx1ZQoJdXBkYXRlOiBmdW5jdGlvbigpewoJCWlmICggdGhpcy5vcHRpb25zLnN0ZXAgKQoJCQl0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7CgoJCShqUXVlcnkuZnguc3RlcFt0aGlzLnByb3BdIHx8IGpRdWVyeS5meC5zdGVwLl9kZWZhdWx0KSggdGhpcyApOwoKCQkvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBibG9jayBmb3IgaGVpZ2h0L3dpZHRoIGFuaW1hdGlvbnMKCQlpZiAoICggdGhpcy5wcm9wID09ICJoZWlnaHQiIHx8IHRoaXMucHJvcCA9PSAid2lkdGgiICkgJiYgdGhpcy5lbGVtLnN0eWxlICkKCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoJfSwKCgkvLyBHZXQgdGhlIGN1cnJlbnQgc2l6ZQoJY3VyOiBmdW5jdGlvbihmb3JjZSl7CgkJaWYgKCB0aGlzLmVsZW1bdGhpcy5wcm9wXSAhPSBudWxsICYmICghdGhpcy5lbGVtLnN0eWxlIHx8IHRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdID09IG51bGwpICkKCQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CgoJCXZhciByID0gcGFyc2VGbG9hdChqUXVlcnkuY3NzKHRoaXMuZWxlbSwgdGhpcy5wcm9wLCBmb3JjZSkpOwoJCXJldHVybiByICYmIHIgPiAtMTAwMDAgPyByIDogcGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKHRoaXMuZWxlbSwgdGhpcy5wcm9wKSkgfHwgMDsKCX0sCgoJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51bWJlciB0byBhbm90aGVyCgljdXN0b206IGZ1bmN0aW9uKGZyb20sIHRvLCB1bml0KXsKCQl0aGlzLnN0YXJ0VGltZSA9IG5vdygpOwoJCXRoaXMuc3RhcnQgPSBmcm9tOwoJCXRoaXMuZW5kID0gdG87CgkJdGhpcy51bml0ID0gdW5pdCB8fCB0aGlzLnVuaXQgfHwgInB4IjsKCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQ7CgkJdGhpcy5wb3MgPSB0aGlzLnN0YXRlID0gMDsKCgkJdmFyIHNlbGYgPSB0aGlzOwoJCWZ1bmN0aW9uIHQoZ290b0VuZCl7CgkJCXJldHVybiBzZWxmLnN0ZXAoZ290b0VuZCk7CgkJfQoKCQl0LmVsZW0gPSB0aGlzLmVsZW07CgoJCWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0KSAmJiAhdGltZXJJZCApIHsKCQkJdGltZXJJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVyczsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKQoJCQkJCWlmICggIXRpbWVyc1tpXSgpICkKCQkJCQkJdGltZXJzLnNwbGljZShpLS0sIDEpOwoKCQkJCWlmICggIXRpbWVycy5sZW5ndGggKSB7CgkJCQkJY2xlYXJJbnRlcnZhbCggdGltZXJJZCApOwoJCQkJCXRpbWVySWQgPSB1bmRlZmluZWQ7CgkJCQl9CgkJCX0sIDEzKTsKCQl9Cgl9LAoKCS8vIFNpbXBsZSAnc2hvdycgZnVuY3Rpb24KCXNob3c6IGZ1bmN0aW9uKCl7CgkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgoJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuYXR0ciggdGhpcy5lbGVtLnN0eWxlLCB0aGlzLnByb3AgKTsKCQl0aGlzLm9wdGlvbnMuc2hvdyA9IHRydWU7CgoJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBzdGFydCBhdCBhIHNtYWxsIHdpZHRoL2hlaWdodCB0byBhdm9pZCBhbnkKCQkvLyBmbGFzaCBvZiBjb250ZW50CgkJdGhpcy5jdXN0b20odGhpcy5wcm9wID09ICJ3aWR0aCIgfHwgdGhpcy5wcm9wID09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOwoKCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CgkJalF1ZXJ5KHRoaXMuZWxlbSkuc2hvdygpOwoJfSwKCgkvLyBTaW1wbGUgJ2hpZGUnIGZ1bmN0aW9uCgloaWRlOiBmdW5jdGlvbigpewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LmF0dHIoIHRoaXMuZWxlbS5zdHlsZSwgdGhpcy5wcm9wICk7CgkJdGhpcy5vcHRpb25zLmhpZGUgPSB0cnVlOwoKCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCgkJdGhpcy5jdXN0b20odGhpcy5jdXIoKSwgMCk7Cgl9LAoKCS8vIEVhY2ggc3RlcCBvZiBhbiBhbmltYXRpb24KCXN0ZXA6IGZ1bmN0aW9uKGdvdG9FbmQpewoJCXZhciB0ID0gbm93KCk7CgoJCWlmICggZ290b0VuZCB8fCB0ID49IHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIHRoaXMuc3RhcnRUaW1lICkgewoJCQl0aGlzLm5vdyA9IHRoaXMuZW5kOwoJCQl0aGlzLnBvcyA9IHRoaXMuc3RhdGUgPSAxOwoJCQl0aGlzLnVwZGF0ZSgpOwoKCQkJdGhpcy5vcHRpb25zLmN1ckFuaW1bIHRoaXMucHJvcCBdID0gdHJ1ZTsKCgkJCXZhciBkb25lID0gdHJ1ZTsKCQkJZm9yICggdmFyIGkgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0gKQoJCQkJaWYgKCB0aGlzLm9wdGlvbnMuY3VyQW5pbVtpXSAhPT0gdHJ1ZSApCgkJCQkJZG9uZSA9IGZhbHNlOwoKCQkJaWYgKCBkb25lICkgewoJCQkJaWYgKCB0aGlzLm9wdGlvbnMuZGlzcGxheSAhPSBudWxsICkgewoJCQkJCS8vIFJlc2V0IHRoZSBvdmVyZmxvdwoJCQkJCXRoaXMuZWxlbS5zdHlsZS5vdmVyZmxvdyA9IHRoaXMub3B0aW9ucy5vdmVyZmxvdzsKCgkJCQkJLy8gUmVzZXQgdGhlIGRpc3BsYXkKCQkJCQl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9IHRoaXMub3B0aW9ucy5kaXNwbGF5OwoJCQkJCWlmICggalF1ZXJ5LmNzcyh0aGlzLmVsZW0sICJkaXNwbGF5IikgPT0gIm5vbmUiICkKCQkJCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoJCQkJfQoKCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYgdGhlICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKCQkJCWlmICggdGhpcy5vcHRpb25zLmhpZGUgKQoJCQkJCWpRdWVyeSh0aGlzLmVsZW0pLmhpZGUoKTsKCgkJCQkvLyBSZXNldCB0aGUgcHJvcGVydGllcywgaWYgdGhlIGl0ZW0gaGFzIGJlZW4gaGlkZGVuIG9yIHNob3duCgkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlIHx8IHRoaXMub3B0aW9ucy5zaG93ICkKCQkJCQlmb3IgKCB2YXIgcCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSApCgkJCQkJCWpRdWVyeS5hdHRyKHRoaXMuZWxlbS5zdHlsZSwgcCwgdGhpcy5vcHRpb25zLm9yaWdbcF0pOwoJCQkJCQoJCQkJLy8gRXhlY3V0ZSB0aGUgY29tcGxldGUgZnVuY3Rpb24KCQkJCXRoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKCB0aGlzLmVsZW0gKTsKCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCXZhciBuID0gdCAtIHRoaXMuc3RhcnRUaW1lOwoJCQl0aGlzLnN0YXRlID0gbiAvIHRoaXMub3B0aW9ucy5kdXJhdGlvbjsKCgkJCS8vIFBlcmZvcm0gdGhlIGVhc2luZyBmdW5jdGlvbiwgZGVmYXVsdHMgdG8gc3dpbmcKCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nW3RoaXMub3B0aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNpbmcuc3dpbmcgPyAic3dpbmciIDogImxpbmVhciIpXSh0aGlzLnN0YXRlLCBuLCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24pOwoJCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQgKyAoKHRoaXMuZW5kIC0gdGhpcy5zdGFydCkgKiB0aGlzLnBvcyk7CgoJCQkvLyBQZXJmb3JtIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGFuaW1hdGlvbgoJCQl0aGlzLnVwZGF0ZSgpOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9Cgp9OwoKalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmZ4LCB7CglzcGVlZHM6ewoJCXNsb3c6IDYwMCwKIAkJZmFzdDogMjAwLAogCQkvLyBEZWZhdWx0IHNwZWVkCiAJCV9kZWZhdWx0OiA0MDAKCX0sCglzdGVwOiB7CgoJCW9wYWNpdHk6IGZ1bmN0aW9uKGZ4KXsKCQkJalF1ZXJ5LmF0dHIoZnguZWxlbS5zdHlsZSwgIm9wYWNpdHkiLCBmeC5ub3cpOwoJCX0sCgoJCV9kZWZhdWx0OiBmdW5jdGlvbihmeCl7CgkJCWlmICggZnguZWxlbS5zdHlsZSAmJiBmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0gIT0gbnVsbCApCgkJCQlmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0gPSBmeC5ub3cgKyBmeC51bml0OwoJCQllbHNlCgkJCQlmeC5lbGVtWyBmeC5wcm9wIF0gPSBmeC5ub3c7CgkJfQoJfQp9KTsKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImdldEJvdW5kaW5nQ2xpZW50UmVjdCJdICkKCWpRdWVyeS5mbi5vZmZzZXQgPSBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07CgkJaWYgKCB0aGlzWzBdID09PSB0aGlzWzBdLm93bmVyRG9jdW1lbnQuYm9keSApIHJldHVybiBqUXVlcnkub2Zmc2V0LmJvZHlPZmZzZXQoIHRoaXNbMF0gKTsKCQl2YXIgYm94ICA9IHRoaXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvYyA9IHRoaXNbMF0ub3duZXJEb2N1bWVudCwgYm9keSA9IGRvYy5ib2R5LCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCwKCQkJY2xpZW50VG9wID0gZG9jRWxlbS5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMCwgY2xpZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMCwKCQkJdG9wICA9IGJveC50b3AgICsgKHNlbGYucGFnZVlPZmZzZXQgfHwgalF1ZXJ5LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsVG9wICB8fCBib2R5LnNjcm9sbFRvcCApIC0gY2xpZW50VG9wLAoJCQlsZWZ0ID0gYm94LmxlZnQgKyAoc2VsZi5wYWdlWE9mZnNldCB8fCBqUXVlcnkuYm94TW9kZWwgJiYgZG9jRWxlbS5zY3JvbGxMZWZ0IHx8IGJvZHkuc2Nyb2xsTGVmdCkgLSBjbGllbnRMZWZ0OwoJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9OwplbHNlIAoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCkgewoJCWlmICggIXRoaXNbMF0gKSByZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCQlpZiAoIHRoaXNbMF0gPT09IHRoaXNbMF0ub3duZXJEb2N1bWVudC5ib2R5ICkgcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggdGhpc1swXSApOwoJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZWQgfHwgalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCXZhciBlbGVtID0gdGhpc1swXSwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQsIHByZXZPZmZzZXRQYXJlbnQgPSBlbGVtLAoJCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsIGNvbXB1dGVkU3R5bGUsIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAoJCQlib2R5ID0gZG9jLmJvZHksIGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3LAoJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCksCgkJCXRvcCA9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0OwoKCQl3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtICE9PSBib2R5ICYmIGVsZW0gIT09IGRvY0VsZW0gKSB7CgkJCWNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpOwoJCQl0b3AgLT0gZWxlbS5zY3JvbGxUb3AsIGxlZnQgLT0gZWxlbS5zY3JvbGxMZWZ0OwoJCQlpZiAoIGVsZW0gPT09IG9mZnNldFBhcmVudCApIHsKCQkJCXRvcCArPSBlbGVtLm9mZnNldFRvcCwgbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CgkJCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEFkZEJvcmRlciAmJiAhKGpRdWVyeS5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgJiYgL150KGFibGV8ZHxoKSQvaS50ZXN0KGVsZW0udGFnTmFtZSkpICkKCQkJCQl0b3AgICs9IHBhcnNlSW50KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoLCAgMTApIHx8IDAsCgkJCQkJbGVmdCArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSB8fCAwOwoJCQkJcHJldk9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudCwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CgkJCX0KCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSAmJiBjb21wdXRlZFN0eWxlLm92ZXJmbG93ICE9PSAidmlzaWJsZSIgKQoJCQkJdG9wICArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwgIDEwKSB8fCAwLAoJCQkJbGVmdCArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSB8fCAwOwoJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGNvbXB1dGVkU3R5bGU7CgkJfQoKCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAicmVsYXRpdmUiIHx8IHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAic3RhdGljIiApCgkJCXRvcCAgKz0gYm9keS5vZmZzZXRUb3AsCgkJCWxlZnQgKz0gYm9keS5vZmZzZXRMZWZ0OwoKCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAiZml4ZWQiICkKCQkJdG9wICArPSBNYXRoLm1heChkb2NFbGVtLnNjcm9sbFRvcCwgYm9keS5zY3JvbGxUb3ApLAoJCQlsZWZ0ICs9IE1hdGgubWF4KGRvY0VsZW0uc2Nyb2xsTGVmdCwgYm9keS5zY3JvbGxMZWZ0KTsKCgkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKCX07CgpqUXVlcnkub2Zmc2V0ID0gewoJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzLmluaXRpYWxpemVkICkgcmV0dXJuOwoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGlubmVyRGl2LCBjaGVja0RpdiwgdGFibGUsIHRkLCBydWxlcywgcHJvcCwgYm9keU1hcmdpblRvcCA9IGJvZHkuc3R5bGUubWFyZ2luVG9wLAoJCQlodG1sID0gJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyI+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPic7CgoJCXJ1bGVzID0geyBwb3NpdGlvbjogJ2Fic29sdXRlJywgdG9wOiAwLCBsZWZ0OiAwLCBtYXJnaW46IDAsIGJvcmRlcjogMCwgd2lkdGg6ICcxcHgnLCBoZWlnaHQ6ICcxcHgnLCB2aXNpYmlsaXR5OiAnaGlkZGVuJyB9OwoJCWZvciAoIHByb3AgaW4gcnVsZXMgKSBjb250YWluZXIuc3R5bGVbcHJvcF0gPSBydWxlc1twcm9wXTsKCgkJY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7CgkJYm9keS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBib2R5LmZpcnN0Q2hpbGQpOwoJCWlubmVyRGl2ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQsIGNoZWNrRGl2ID0gaW5uZXJEaXYuZmlyc3RDaGlsZCwgdGQgPSBpbm5lckRpdi5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7CgoJCXRoaXMuZG9lc05vdEFkZEJvcmRlciA9IChjaGVja0Rpdi5vZmZzZXRUb3AgIT09IDUpOwoJCXRoaXMuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgPSAodGQub2Zmc2V0VG9wID09PSA1KTsKCgkJaW5uZXJEaXYuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJywgaW5uZXJEaXYuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOwoJCXRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gLTUpOwoKCQlib2R5LnN0eWxlLm1hcmdpblRvcCA9ICcxcHgnOwoJCXRoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoYm9keS5vZmZzZXRUb3AgPT09IDApOwoJCWJvZHkuc3R5bGUubWFyZ2luVG9wID0gYm9keU1hcmdpblRvcDsKCgkJYm9keS5yZW1vdmVDaGlsZChjb250YWluZXIpOwoJCXRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOwoJfSwKCglib2R5T2Zmc2V0OiBmdW5jdGlvbihib2R5KSB7CgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplZCB8fCBqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUoKTsKCQl2YXIgdG9wID0gYm9keS5vZmZzZXRUb3AsIGxlZnQgPSBib2R5Lm9mZnNldExlZnQ7CgkJaWYgKCBqUXVlcnkub2Zmc2V0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ICkKCQkJdG9wICArPSBwYXJzZUludCggalF1ZXJ5LmN1ckNTUyhib2R5LCAnbWFyZ2luVG9wJywgIHRydWUpLCAxMCApIHx8IDAsCgkJCWxlZnQgKz0gcGFyc2VJbnQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdpbkxlZnQnLCB0cnVlKSwgMTAgKSB8fCAwOwoJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9Cn07CgoKalF1ZXJ5LmZuLmV4dGVuZCh7Cglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGxlZnQgPSAwLCB0b3AgPSAwLCByZXN1bHRzOwoKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCS8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50CgkJCXZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAoKCQkJLy8gR2V0IGNvcnJlY3Qgb2Zmc2V0cwoJCQlvZmZzZXQgICAgICAgPSB0aGlzLm9mZnNldCgpLAoJCQlwYXJlbnRPZmZzZXQgPSAvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNldFBhcmVudFswXS50YWdOYW1lKSA/IHsgdG9wOiAwLCBsZWZ0OiAwIH0gOiBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7CgoJCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKCQkJLy8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnQgCgkJCS8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCgkJCW9mZnNldC50b3AgIC09IG51bSggdGhpcywgJ21hcmdpblRvcCcgICk7CgkJCW9mZnNldC5sZWZ0IC09IG51bSggdGhpcywgJ21hcmdpbkxlZnQnICk7CgoJCQkvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKCQkJcGFyZW50T2Zmc2V0LnRvcCAgKz0gbnVtKCBvZmZzZXRQYXJlbnQsICdib3JkZXJUb3BXaWR0aCcgICk7CgkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IG51bSggb2Zmc2V0UGFyZW50LCAnYm9yZGVyTGVmdFdpZHRoJyApOwoKCQkJLy8gU3VidHJhY3QgdGhlIHR3byBvZmZzZXRzCgkJCXJlc3VsdHMgPSB7CgkJCQl0b3A6ICBvZmZzZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AsCgkJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0CgkJCX07CgkJfQoKCQlyZXR1cm4gcmVzdWx0czsKCX0sCgoJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpc1swXS5vZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTsKCQl3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoIS9eYm9keXxodG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50LnRhZ05hbWUpICYmIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PSAnc3RhdGljJykgKQoJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OwoJCXJldHVybiBqUXVlcnkob2Zmc2V0UGFyZW50KTsKCX0KfSk7CgoKLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzCmpRdWVyeS5lYWNoKCBbJ0xlZnQnLCAnVG9wJ10sIGZ1bmN0aW9uKGksIG5hbWUpIHsKCXZhciBtZXRob2QgPSAnc2Nyb2xsJyArIG5hbWU7CgkKCWpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbih2YWwpIHsKCQlpZiAoIXRoaXNbMF0pIHJldHVybiBudWxsOwoKCQlyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPwoKCQkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXRoaXMgPT0gd2luZG93IHx8IHRoaXMgPT0gZG9jdW1lbnQgPwoJCQkJCXdpbmRvdy5zY3JvbGxUbygKCQkJCQkJIWkgPyB2YWwgOiBqUXVlcnkod2luZG93KS5zY3JvbGxMZWZ0KCksCgkJCQkJCSBpID8gdmFsIDogalF1ZXJ5KHdpbmRvdykuc2Nyb2xsVG9wKCkKCQkJCQkpIDoKCQkJCQl0aGlzWyBtZXRob2QgXSA9IHZhbDsKCQkJfSkgOgoKCQkJLy8gUmV0dXJuIHRoZSBzY3JvbGwgb2Zmc2V0CgkJCXRoaXNbMF0gPT0gd2luZG93IHx8IHRoaXNbMF0gPT0gZG9jdW1lbnQgPwoJCQkJc2VsZlsgaSA/ICdwYWdlWU9mZnNldCcgOiAncGFnZVhPZmZzZXQnIF0gfHwKCQkJCQlqUXVlcnkuYm94TW9kZWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSB8fAoJCQkJCWRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKCQkJCXRoaXNbMF1bIG1ldGhvZCBdOwoJfTsKfSk7Ci8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKGksIG5hbWUpewoKCXZhciB0bCA9IGkgPyAiTGVmdCIgIDogIlRvcCIsICAvLyB0b3Agb3IgbGVmdAoJCWJyID0gaSA/ICJSaWdodCIgOiAiQm90dG9tIiwgLy8gYm90dG9tIG9yIHJpZ2h0CgkJbG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CgoJLy8gaW5uZXJIZWlnaHQgYW5kIGlubmVyV2lkdGgKCWpRdWVyeS5mblsiaW5uZXIiICsgbmFtZV0gPSBmdW5jdGlvbigpewoJCXJldHVybiB0aGlzWzBdID8KCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwgbG93ZXIsIGZhbHNlLCAicGFkZGluZyIgKSA6CgkJCW51bGw7Cgl9OwoKCS8vIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoCglqUXVlcnkuZm5bIm91dGVyIiArIG5hbWVdID0gZnVuY3Rpb24obWFyZ2luKSB7CgkJcmV0dXJuIHRoaXNbMF0gPwoJCQlqUXVlcnkuY3NzKCB0aGlzWzBdLCBsb3dlciwgZmFsc2UsIG1hcmdpbiA/ICJtYXJnaW4iIDogImJvcmRlciIgKSA6CgkJCW51bGw7Cgl9OwoJCgl2YXIgdHlwZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCglqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBzaXplICkgewoJCS8vIEdldCB3aW5kb3cgd2lkdGggb3IgaGVpZ2h0CgkJcmV0dXJuIHRoaXNbMF0gPT0gd2luZG93ID8KCQkJLy8gRXZlcnlvbmUgZWxzZSB1c2UgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IG9yIGRvY3VtZW50LmJvZHkgZGVwZW5kaW5nIG9uIFF1aXJrcyB2cyBTdGFuZGFyZHMgbW9kZQoJCQlkb2N1bWVudC5jb21wYXRNb2RlID09ICJDU1MxQ29tcGF0IiAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdIHx8CgkJCWRvY3VtZW50LmJvZHlbICJjbGllbnQiICsgbmFtZSBdIDoKCgkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJdGhpc1swXSA9PSBkb2N1bWVudCA/CgkJCQkvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0sIHdoaWNoZXZlciBpcyBncmVhdGVyCgkJCQlNYXRoLm1heCgKCQkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKCQkJCQlkb2N1bWVudC5ib2R5WyJzY3JvbGwiICsgbmFtZV0sIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIiArIG5hbWVdLAoJCQkJCWRvY3VtZW50LmJvZHlbIm9mZnNldCIgKyBuYW1lXSwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0KCQkJCSkgOgoKCQkJCS8vIEdldCBvciBzZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50CgkJCQlzaXplID09PSB1bmRlZmluZWQgPwoJCQkJCS8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQkodGhpcy5sZW5ndGggPyBqUXVlcnkuY3NzKCB0aGlzWzBdLCB0eXBlICkgOiBudWxsKSA6CgoJCQkJCS8vIFNldCB0aGUgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50IChkZWZhdWx0IHRvIHBpeGVscyBpZiB2YWx1ZSBpcyB1bml0bGVzcykKCQkJCQl0aGlzLmNzcyggdHlwZSwgdHlwZW9mIHNpemUgPT09ICJzdHJpbmciID8gc2l6ZSA6IHNpemUgKyAicHgiICk7Cgl9OwoKfSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/adapter/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/adapter/jquery/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/adapter/jquery/adapter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBhZGFwdGVyLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KLy8gI2lmZGVmIGpxdWVyeV9hZGFwdGVyDQoNCihmdW5jdGlvbigkLCB0aW55bWNlKSB7DQoJdmFyIGlzID0gdGlueW1jZS5pcywgYXR0clJlZ0V4cCA9IC9eKGhyZWZ8c3JjfHN0eWxlKSQvaSwgdW5kZWZpbmVkOw0KDQoJLy8galF1ZXJ5IGlzIHVuZGVmaW5lZA0KCWlmICghJCkNCgkJcmV0dXJuIGFsZXJ0KCJMb2FkIGpRdWVyeSBmaXJzdCEiKTsNCg0KCS8vIFN0aWNrIGpRdWVyeSBpbnRvIHRoZSB0aW55bWNlIG5hbWVzcGFjZQ0KCXRpbnltY2UuJCA9ICQ7DQoNCgkvLyBTZXR1cCBhZGFwdGVyDQoJdGlueW1jZS5hZGFwdGVyID0gew0KCQlwYXRjaEVkaXRvciA6IGZ1bmN0aW9uKGVkaXRvcikgew0KCQkJdmFyIGZuID0gJC5mbjsNCg0KCQkJLy8gQWRhcHQgdGhlIGNzcyBmdW5jdGlvbiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgX21jZV9zdHlsZQ0KCQkJLy8gYXR0cmlidXRlIGdldHMgdXBkYXRlZCB3aXRoIHRoZSBuZXcgc3R5bGUgaW5mb3JtYXRpb24NCgkJCWZ1bmN0aW9uIGNzcyhuYW1lLCB2YWx1ZSkgew0KCQkJCXZhciBzZWxmID0gdGhpczsNCg0KCQkJCS8vIFJlbW92ZSBfbWNlX3N0eWxlIHdoZW4gc2V0IG9wZXJhdGlvbiBvY2N1cnMNCgkJCQlpZiAodmFsdWUpDQoJCQkJCXNlbGYucmVtb3ZlQXR0cignX21jZV9zdHlsZScpOw0KDQoJCQkJcmV0dXJuIGZuLmNzcy5hcHBseShzZWxmLCBhcmd1bWVudHMpOw0KCQkJfTsNCg0KCQkJLy8gQXBhcHQgdGhlIGF0dHIgZnVuY3Rpb24gdG8gbWFrZSBzdXJlIHRoYXQgaXQgdXNlcyB0aGUgX21jZV8gcHJlZml4ZWQgdmFyaWFudHMNCgkJCWZ1bmN0aW9uIGF0dHIobmFtZSwgdmFsdWUpIHsNCgkJCQl2YXIgc2VsZiA9IHRoaXM7DQoNCgkJCQkvLyBVcGRhdGUvcmV0cml2ZSBfbWNlXyBhdHRyaWJ1dGUgdmFyaWFudHMNCgkJCQlpZiAoYXR0clJlZ0V4cC50ZXN0KG5hbWUpKSB7DQoJCQkJCWlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7DQoJCQkJCQkvLyBVc2UgVGlueU1DRSBiZWhhdmlvciB3aGVuIHNldHRpbmcgdGhlIHNwZWNpZmMgYXR0cmlidXRlcw0KCQkJCQkJc2VsZi5lYWNoKGZ1bmN0aW9uKGksIG5vZGUpIHsNCgkJCQkJCQllZGl0b3IuZG9tLnNldEF0dHJpYihub2RlLCBuYW1lLCB2YWx1ZSk7DQoJCQkJCQl9KTsNCg0KCQkJCQkJcmV0dXJuIHNlbGY7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJcmV0dXJuIHNlbGYuYXR0cignX21jZV8nICsgbmFtZSk7DQoJCQkJfQ0KDQoJCQkJLy8gRGVmYXVsdCBiZWhhdmlvcg0KCQkJCXJldHVybiBmbi5hdHRyLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBodG1sUGF0Y2hGdW5jKGZ1bmMpIHsNCgkJCQkvLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gdGhhdCBwcm9jZXNzZXMNCgkJCQkvLyB0aGUgSFRNTCBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb24gdGhpcyBtYWtlcyBzdXJlDQoJCQkJLy8gdGhhdCBocmVmL3NyYyBldGMgZ2V0cyBtb3ZlZCBpbnRvIHRoZSBfbWNlXyB2YXJpYW50cw0KCQkJCXJldHVybiBmdW5jdGlvbihjb250ZW50KSB7DQoJCQkJCWlmIChjb250ZW50KQ0KCQkJCQkJY29udGVudCA9IGVkaXRvci5kb20ucHJvY2Vzc0hUTUwoY29udGVudCk7DQoNCgkJCQkJcmV0dXJuIGZ1bmMuY2FsbCh0aGlzLCBjb250ZW50KTsNCgkJCQl9Ow0KCQkJfTsNCg0KCQkJLy8gUGF0Y2ggdmFyaW91cyBqUXVlcnkgZnVuY3Rpb25zIHRvIGhhbmRsZSB0aW55bWNlIHNwZWNpZmljIGF0dHJpYnV0ZSBhbmQgY29udGVudCBiZWhhdmlvcg0KCQkJLy8gd2UgZG9uJ3QgcGF0Y2ggdGhlIGpRdWVyeS5mbiBkaXJlY3RseSBzaW5jZSBpdCB3aWxsIG1vc3QgbGlrZWx5IGJyZWFrIGNvbXBhdGliaWxpdHkNCgkJCS8vIHdpdGggb3RoZXIgalF1ZXJ5IGxvZ2ljIG9uIHRoZSBwYWdlLiBPbmx5IGluc3RhbmNlcyBjcmVhdGVkIGJ5IFRpbnlNQ0Ugc2hvdWxkIGJlIHBhdGNoZWQuDQoJCQlmdW5jdGlvbiBwYXRjaChqcSkgew0KCQkJCS8vIFBhdGNoIHNvbWUgZnVuY3Rpb25zLCBvbmx5IHBhdGNoIHRoZSBvYmplY3Qgb25jZQ0KCQkJCWlmIChqcS5jc3MgIT09IGNzcykgew0KCQkJCQkvLyBQYXRjaCBjc3MvYXR0ciB0byB1c2UgdGhlIF9tY2VfIHByZWZpeGVkIGF0dHJpYnV0ZSB2YXJpYW50cw0KCQkJCQlqcS5jc3MgPSBjc3M7DQoJCQkJCWpxLmF0dHIgPSBhdHRyOw0KDQoJCQkJCS8vIFBhdGNoIEhUTUwgZnVuY3Rpb25zIHRvIHVzZSB0aGUgRE9NVXRpbHMucHJvY2Vzc0hUTUwgZmlsdGVyIGxvZ2ljDQoJCQkJCWpxLmh0bWwgPSBodG1sUGF0Y2hGdW5jKGZuLmh0bWwpOw0KCQkJCQlqcS5hcHBlbmQgPSBodG1sUGF0Y2hGdW5jKGZuLmFwcGVuZCk7DQoJCQkJCWpxLnByZXBlbmQgPSBodG1sUGF0Y2hGdW5jKGZuLnByZXBlbmQpOw0KCQkJCQlqcS5hZnRlciA9IGh0bWxQYXRjaEZ1bmMoZm4uYWZ0ZXIpOw0KCQkJCQlqcS5iZWZvcmUgPSBodG1sUGF0Y2hGdW5jKGZuLmJlZm9yZSk7DQoJCQkJCWpxLnJlcGxhY2VXaXRoID0gaHRtbFBhdGNoRnVuYyhmbi5yZXBsYWNlV2l0aCk7DQoJCQkJCWpxLnRpbnltY2UgPSBlZGl0b3I7DQoNCgkJCQkJLy8gRWFjaCBwdXNoZWQgalF1ZXJ5IGluc3RhbmNlIG5lZWRzIHRvIGJlIHBhdGNoZWQNCgkJCQkJLy8gYXMgd2VsbCBmb3IgZXhhbXBsZSB3aGVuIHRyYXZlcnNpbmcgdGhlIERPTQ0KCQkJCQlqcS5wdXNoU3RhY2sgPSBmdW5jdGlvbigpIHsNCgkJCQkJCXJldHVybiBwYXRjaChmbi5wdXNoU3RhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKSk7DQoJCQkJCX07DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGpxOw0KCQkJfTsNCg0KCQkJLy8gQWRkIGEgJCBmdW5jdGlvbiBvbiBlYWNoIGVkaXRvciBpbnN0YW5jZSB0aGlzIG9uZSBpcyBzY29wZWQgZm9yIHRoZSBlZGl0b3IgZG9jdW1lbnQgb2JqZWN0DQoJCQkvLyB0aGlzIHdheSB5b3UgY2FuIGRvIGNoYWluaW5nIGxpa2UgdGhpcyB0aW55bWNlLmdldCgwKS4kKCdwJykuYXBwZW5kKCd0ZXh0JykuY3NzKCdjb2xvcicsICdyZWQnKTsNCgkJCWVkaXRvci4kID0gZnVuY3Rpb24oc2VsZWN0b3IsIHNjb3BlKSB7DQoJCQkJdmFyIGRvYyA9IGVkaXRvci5nZXREb2MoKTsNCg0KCQkJCXJldHVybiBwYXRjaCgkKHNlbGVjdG9yIHx8IGRvYywgZG9jIHx8IHNjb3BlKSk7DQoJCQl9Ow0KCQl9DQoJfTsNCg0KCS8vIFBhdGNoIGluIGNvcmUgTlMgZnVuY3Rpb25zDQoJdGlueW1jZS5leHRlbmQgPSAkLmV4dGVuZDsNCgl0aW55bWNlLmV4dGVuZCh0aW55bWNlLCB7DQoJCW1hcCA6ICQubWFwLA0KCQlncmVwIDogZnVuY3Rpb24oYSwgZikge3JldHVybiAkLmdyZXAoYSwgZiB8fCBmdW5jdGlvbigpe3JldHVybiAxO30pO30sDQoJCWluQXJyYXkgOiBmdW5jdGlvbihhLCB2KSB7cmV0dXJuICQuaW5BcnJheSh2LCBhIHx8IFtdKTt9DQoNCgkJLyogRGlkbid0IGl0ZXJhdGUgc3R5bGVzaGVldHMNCgkJZWFjaCA6IGZ1bmN0aW9uKG8sIGNiLCBzKSB7DQoJCQlpZiAoIW8pDQoJCQkJcmV0dXJuIDA7DQoNCgkJCXZhciByID0gMTsNCg0KCQkJJC5lYWNoKG8sIGZ1bmN0aW9uKG5yLCBlbCl7DQoJCQkJaWYgKGNiLmNhbGwocywgZWwsIG5yLCBvKSA9PT0gZmFsc2UpIHsNCgkJCQkJciA9IDA7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJcmV0dXJuIHI7DQoJCX0qLw0KCX0pOw0KDQoJLy8gUGF0Y2ggaW4gZnVuY3Rpb25zIGluIHZhcmlvdXMgY2xhc2VzDQoJLy8gQWRkIGEgIiNpZm5kZWZqcXVlcnkiIHN0YXRlbWVudCBhcm91bmQgZWFjaCBjb3JlIEFQSSBmdW5jdGlvbiB5b3UgYWRkIGJlbG93DQoJdmFyIHBhdGNoZXMgPSB7DQoJCSd0aW55bWNlLmRvbS5ET01VdGlscycgOiB7DQoJCQkvKg0KCQkJYWRkQ2xhc3MgOiBmdW5jdGlvbihlLCBjKSB7DQoJCQkJaWYgKGlzKGUsICdhcnJheScpICYmIGlzKGVbMF0sICdzdHJpbmcnKSkNCgkJCQkJZSA9IGUuam9pbignLCMnKTsNCgkJCQlyZXR1cm4gKGUgJiYgJChpcyhlLCAnc3RyaW5nJykgPyAnIycgKyBlIDogZSkNCgkJCQkJLmFkZENsYXNzKGMpDQoJCQkJCS5hdHRyKCdjbGFzcycpKSB8fCBmYWxzZTsNCgkJCX0sDQoNCgkJCWhhc0NsYXNzIDogZnVuY3Rpb24obiwgYykgew0KCQkJCXJldHVybiAkKGlzKG4sICdzdHJpbmcnKSA/ICcjJyArIG4gOiBuKS5oYXNDbGFzcyhjKTsNCgkJCX0sDQoNCgkJCXJlbW92ZUNsYXNzIDogZnVuY3Rpb24oZSwgYykgew0KCQkJCWlmICghZSkNCgkJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQkJdmFyIHIgPSBbXTsNCg0KCQkJCSQoaXMoZSwgJ3N0cmluZycpID8gJyMnICsgZSA6IGUpDQoJCQkJCS5yZW1vdmVDbGFzcyhjKQ0KCQkJCQkuZWFjaChmdW5jdGlvbigpew0KCQkJCQkJci5wdXNoKHRoaXMuY2xhc3NOYW1lKTsNCgkJCQkJfSk7DQoNCgkJCQlyZXR1cm4gci5sZW5ndGggPT0gMSA/IHJbMF0gOiByOw0KCQkJfSwNCgkJCSovDQoNCgkJCXNlbGVjdCA6IGZ1bmN0aW9uKHBhdHRlcm4sIHNjb3BlKSB7DQoJCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQkJcmV0dXJuICQuZmluZChwYXR0ZXJuLCB0LmdldChzY29wZSkgfHwgdC5nZXQodC5zZXR0aW5ncy5yb290X2VsZW1lbnQpIHx8IHQuZG9jLCBbXSk7DQoJCQl9LA0KDQoJCQlpcyA6IGZ1bmN0aW9uKG4sIHBhdHQpIHsNCgkJCQlyZXR1cm4gJCh0aGlzLmdldChuKSkuaXMocGF0dCk7DQoJCQl9DQoNCgkJCS8qDQoJCQlzaG93IDogZnVuY3Rpb24oZSkgew0KCQkJCWlmIChpcyhlLCAnYXJyYXknKSAmJiBpcyhlWzBdLCAnc3RyaW5nJykpDQoJCQkJCWUgPSBlLmpvaW4oJywjJyk7DQoNCgkJCQkkKGlzKGUsICdzdHJpbmcnKSA/ICcjJyArIGUgOiBlKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTsNCgkJCX0sDQoNCgkJCWhpZGUgOiBmdW5jdGlvbihlKSB7DQoJCQkJaWYgKGlzKGUsICdhcnJheScpICYmIGlzKGVbMF0sICdzdHJpbmcnKSkNCgkJCQkJZSA9IGUuam9pbignLCMnKTsNCg0KCQkJCSQoaXMoZSwgJ3N0cmluZycpID8gJyMnICsgZSA6IGUpLmNzcygnZGlzcGxheScsICdub25lJyk7DQoJCQl9LA0KDQoJCQlpc0hpZGRlbiA6IGZ1bmN0aW9uKGUpIHsNCgkJCQlyZXR1cm4gJChpcyhlLCAnc3RyaW5nJykgPyAnIycgKyBlIDogZSkuaXMoJzpoaWRkZW4nKTsNCgkJCX0sDQoNCgkJCWluc2VydEFmdGVyIDogZnVuY3Rpb24obiwgZSkgew0KCQkJCXJldHVybiAkKGlzKGUsICdzdHJpbmcnKSA/ICcjJyArIGUgOiBlKS5hZnRlcihuKTsNCgkJCX0sDQoNCgkJCXJlcGxhY2UgOiBmdW5jdGlvbihvLCBuLCBrKSB7DQoJCQkJbiA9ICQoaXMobiwgJ3N0cmluZycpID8gJyMnICsgbiA6IG4pOw0KDQoJCQkJaWYgKGspDQoJCQkJCW4uY2hpbGRyZW4oKS5hcHBlbmRUbyhvKTsNCg0KCQkJCW4ucmVwbGFjZVdpdGgobyk7DQoJCQl9LA0KDQoJCQlzZXRTdHlsZSA6IGZ1bmN0aW9uKG4sIG5hLCB2KSB7DQoJCQkJaWYgKGlzKG4sICdhcnJheScpICYmIGlzKG5bMF0sICdzdHJpbmcnKSkNCgkJCQkJbiA9IG4uam9pbignLCMnKTsNCg0KCQkJCSQoaXMobiwgJ3N0cmluZycpID8gJyMnICsgbiA6IG4pLmNzcyhuYSwgdik7DQoJCQl9LA0KDQoJCQlnZXRTdHlsZSA6IGZ1bmN0aW9uKG4sIG5hLCBjKSB7DQoJCQkJcmV0dXJuICQoaXMobiwgJ3N0cmluZycpID8gJyMnICsgbiA6IG4pLmNzcyhuYSk7DQoJCQl9LA0KDQoJCQlzZXRTdHlsZXMgOiBmdW5jdGlvbihlLCBvKSB7DQoJCQkJaWYgKGlzKGUsICdhcnJheScpICYmIGlzKGVbMF0sICdzdHJpbmcnKSkNCgkJCQkJZSA9IGUuam9pbignLCMnKTsNCgkJCQkkKGlzKGUsICdzdHJpbmcnKSA/ICcjJyArIGUgOiBlKS5jc3Mobyk7DQoJCQl9LA0KDQoJCQlzZXRBdHRyaWIgOiBmdW5jdGlvbihlLCBuLCB2KSB7DQoJCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJCWlmIChpcyhlLCAnYXJyYXknKSAmJiBpcyhlWzBdLCAnc3RyaW5nJykpDQoJCQkJCWUgPSBlLmpvaW4oJywjJyk7DQoNCgkJCQllID0gJChpcyhlLCAnc3RyaW5nJykgPyAnIycgKyBlIDogZSk7DQoNCgkJCQlzd2l0Y2ggKG4pIHsNCgkJCQkJY2FzZSAic3R5bGUiOg0KCQkJCQkJZS5lYWNoKGZ1bmN0aW9uKGksIHYpew0KCQkJCQkJCWlmIChzLmtlZXBfdmFsdWVzKQ0KCQkJCQkJCQkkKHYpLmF0dHIoJ19tY2Vfc3R5bGUnLCB2KTsNCg0KCQkJCQkJCXYuc3R5bGUuY3NzVGV4dCA9IHY7DQoJCQkJCQl9KTsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgImNsYXNzIjoNCgkJCQkJCWUuZWFjaChmdW5jdGlvbigpew0KCQkJCQkJCXRoaXMuY2xhc3NOYW1lID0gdjsNCgkJCQkJCX0pOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAic3JjIjoNCgkJCQkJY2FzZSAiaHJlZiI6DQoJCQkJCQllLmVhY2goZnVuY3Rpb24oaSwgdil7DQoJCQkJCQkJaWYgKHMua2VlcF92YWx1ZXMpIHsNCgkJCQkJCQkJaWYgKHMudXJsX2NvbnZlcnRlcikNCgkJCQkJCQkJCXYgPSBzLnVybF9jb252ZXJ0ZXIuY2FsbChzLnVybF9jb252ZXJ0ZXJfc2NvcGUgfHwgdCwgdiwgbiwgdik7DQoNCgkJCQkJCQkJdC5zZXRBdHRyaWIodiwgJ19tY2VfJyArIG4sIHYpOw0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KDQoJCQkJCQlicmVhazsNCgkJCQl9DQoNCgkJCQlpZiAodiAhPT0gbnVsbCAmJiB2Lmxlbmd0aCAhPT0gMCkNCgkJCQkJZS5hdHRyKG4sICcnICsgdik7DQoJCQkJZWxzZQ0KCQkJCQllLnJlbW92ZUF0dHIobik7DQoJCQl9LA0KDQoJCQlzZXRBdHRyaWJzIDogZnVuY3Rpb24oZSwgbykgew0KCQkJCXZhciB0ID0gdGhpczsNCg0KCQkJCSQuZWFjaChvLCBmdW5jdGlvbihuLCB2KXsNCgkJCQkJdC5zZXRBdHRyaWIoZSxuLHYpOw0KCQkJCX0pOw0KCQkJfQ0KCQkJKi8NCgkJfQ0KDQovKg0KCQkndGlueW1jZS5kb20uRXZlbnQnIDogew0KCQkJYWRkIDogZnVuY3Rpb24gKG8sIG4sIGYsIHMpIHsNCgkJCQl2YXIgbG8sIGNiOw0KDQoJCQkJY2IgPSBmdW5jdGlvbihlKSB7DQoJCQkJCWUudGFyZ2V0ID0gZS50YXJnZXQgfHwgdGhpczsNCgkJCQkJZi5jYWxsKHMgfHwgdGhpcywgZSk7DQoJCQkJfTsNCg0KCQkJCWlmIChpcyhvLCAnYXJyYXknKSAmJiBpcyhvWzBdLCAnc3RyaW5nJykpDQoJCQkJCW8gPSBvLmpvaW4oJywjJyk7DQoJCQkJbyA9ICQoaXMobywgJ3N0cmluZycpID8gJyMnICsgbyA6IG8pOw0KCQkJCWlmIChuID09ICdpbml0Jykgew0KCQkJCQlvLnJlYWR5KGNiLCBzKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlpZiAocykgew0KCQkJCQkJby5iaW5kKG4sIHMsIGNiKTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCW8uYmluZChuLCBjYik7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlsbyA9IHRoaXMuX2pxTG9va3VwIHx8ICh0aGlzLl9qcUxvb2t1cCA9IFtdKTsNCgkJCQlsby5wdXNoKHtmdW5jIDogZiwgY2Z1bmMgOiBjYn0pOw0KDQoJCQkJcmV0dXJuIGNiOw0KCQkJfSwNCg0KCQkJcmVtb3ZlIDogZnVuY3Rpb24obywgbiwgZikgew0KCQkJCS8vIEZpbmQgY2Z1bmMNCgkJCQkkKHRoaXMuX2pxTG9va3VwKS5lYWNoKGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAodGhpcy5mdW5jID09PSBmKQ0KCQkJCQkJZiA9IHRoaXMuY2Z1bmM7DQoJCQkJfSk7DQoNCgkJCQlpZiAoaXMobywgJ2FycmF5JykgJiYgaXMob1swXSwgJ3N0cmluZycpKQ0KCQkJCQlvID0gby5qb2luKCcsIycpOw0KDQoJCQkJJChpcyhvLCAnc3RyaW5nJykgPyAnIycgKyBvIDogbykudW5iaW5kKG4sZik7DQoNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJfQ0KKi8NCgl9Ow0KDQoJLy8gUGF0Y2ggZnVuY3Rpb25zIGFmdGVyIGEgY2xhc3MgaXMgY3JlYXRlZA0KCXRpbnltY2Uub25DcmVhdGUgPSBmdW5jdGlvbih0eSwgYywgcCkgew0KCQl0aW55bWNlLmV4dGVuZChwLCBwYXRjaGVzW2NdKTsNCgl9Ow0KfSkod2luZG93LmpRdWVyeSwgdGlueW1jZSk7DQoNCi8vICNlbmRpZg0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/adapter/jquery/jquery.tinymce.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqcXVlcnkudGlueW1jZS5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigkKSB7DQoJdmFyIHVuZGVmaW5lZCwNCgkJbGF6eUxvYWRpbmcsDQoJCWRlbGF5ZWRJbml0cyA9IFtdLA0KCQl3aW4gPSB3aW5kb3c7DQoNCgkkLmZuLnRpbnltY2UgPSBmdW5jdGlvbihzZXR0aW5ncykgew0KCQl2YXIgc2VsZiA9IHRoaXMsIHVybCwgZWQsIGJhc2UsIHBvcywgbGFuZywgcXVlcnkgPSAiIiwgc3VmZml4ID0gIiI7DQoNCgkJLy8gTm8gbWF0Y2ggdGhlbiBqdXN0IGlnbm9yZSB0aGUgY2FsbA0KCQlpZiAoIXNlbGYubGVuZ3RoKQ0KCQkJcmV0dXJuIHNlbGY7DQoNCgkJLy8gR2V0IGVkaXRvciBpbnN0YW5jZQ0KCQlpZiAoIXNldHRpbmdzKQ0KCQkJcmV0dXJuIHRpbnlNQ0UuZ2V0KHNlbGZbMF0uaWQpOw0KDQoJCWZ1bmN0aW9uIGluaXQoKSB7DQoJCQl2YXIgZWRpdG9ycyA9IFtdLCBpbml0Q291bnQgPSAwOw0KDQoJCQkvLyBBcHBseSBwYXRjaGVzIHRvIHRoZSBqUXVlcnkgb2JqZWN0LCBvbmx5IG9uY2UNCgkJCWlmIChhcHBseVBhdGNoKSB7DQoJCQkJYXBwbHlQYXRjaCgpOw0KCQkJCWFwcGx5UGF0Y2ggPSBudWxsOw0KCQkJfQ0KDQoJCQkvLyBDcmVhdGUgYW4gZWRpdG9yIGluc3RhbmNlIGZvciBlYWNoIG1hdGNoZWQgbm9kZQ0KCQkJc2VsZi5lYWNoKGZ1bmN0aW9uKGksIG5vZGUpIHsNCgkJCQl2YXIgZWQsIGlkID0gbm9kZS5pZCwgb25pbml0ID0gc2V0dGluZ3Mub25pbml0Ow0KDQoJCQkJLy8gR2VuZXJhdGUgdW5pcXVlIGlkIGZvciB0YXJnZXQgZWxlbWVudCBpZiBuZWVkZWQNCgkJCQlpZiAoIWlkKQ0KCQkJCQlub2RlLmlkID0gaWQgPSB0aW55bWNlLkRPTS51bmlxdWVJZCgpOw0KDQoJCQkJLy8gQ3JlYXRlIGVkaXRvciBpbnN0YW5jZSBhbmQgcmVuZGVyIGl0DQoJCQkJZWQgPSBuZXcgdGlueW1jZS5FZGl0b3IoaWQsIHNldHRpbmdzKTsNCgkJCQllZGl0b3JzLnB1c2goZWQpOw0KDQoJCQkJLy8gQWRkIG9uSW5pdCBldmVudCBsaXN0ZW5lciBpZiB0aGUgb25pbml0IHNldHRpbmcgaXMgZGVmaW5lZA0KCQkJCS8vIHRoaXMgbG9naWMgd2lsbCBmaXJlIHRoZSBvbmluaXQgY2FsbGJhY2sgb25lcyBlYWNoDQoJCQkJLy8gbWF0Y2hlZCBlZGl0b3IgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQNCgkJCQlpZiAob25pbml0KSB7DQoJCQkJCWVkLm9uSW5pdC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCQl2YXIgc2NvcGUsIGZ1bmMgPSBvbmluaXQ7DQoNCgkJCQkJCS8vIEZpcmUgdGhlIG9uaW5pdCBldmVudCBvbmVzIGVhY2ggZWRpdG9yIGluc3RhbmNlIGlzIGluaXRpYWxpemVkDQoJCQkJCQlpZiAoKytpbml0Q291bnQgPT0gZWRpdG9ycy5sZW5ndGgpIHsNCgkJCQkJCQlpZiAodGlueW1jZS5pcyhmdW5jLCAic3RyaW5nIikpIHsNCgkJCQkJCQkJc2NvcGUgPSAoZnVuYy5pbmRleE9mKCIuIikgPT09IC0xKSA/IG51bGwgOiB0aW55bWNlLnJlc29sdmUoZnVuYy5yZXBsYWNlKC9cLlx3KyQvLCAiIikpOw0KCQkJCQkJCQlmdW5jID0gdGlueW1jZS5yZXNvbHZlKGZ1bmMpOw0KCQkJCQkJCX0NCg0KCQkJCQkJCS8vIENhbGwgdGhlIG9uaW5pdCBmdW5jdGlvbiB3aXRoIHRoZSBvYmplY3QNCgkJCQkJCQlmdW5jLmFwcGx5KHNjb3BlIHx8IHRpbnltY2UsIGVkaXRvcnMpOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJLy8gUmVuZGVyIHRoZSBlZGl0b3IgaW5zdGFuY2VzIGluIGEgc2VwYXJhdGUgbG9vcCBzaW5jZSB3ZQ0KCQkJLy8gbmVlZCB0byBoYXZlIHRoZSBmdWxsIGVkaXRvcnMgYXJyYXkgdXNlZCBpbiB0aGUgb25Jbml0IGNhbGxzDQoJCQkkLmVhY2goZWRpdG9ycywgZnVuY3Rpb24oaSwgZWQpIHsNCgkJCQllZC5yZW5kZXIoKTsNCgkJCX0pOw0KCQl9DQoNCgkJLy8gTG9hZCBUaW55TUNFIG9uIGRlbWFuZCwgaWYgd2UgbmVlZCB0bw0KCQlpZiAoIXdpblsidGlueW1jZSJdICYmICFsYXp5TG9hZGluZyAmJiAodXJsID0gc2V0dGluZ3Muc2NyaXB0X3VybCkpIHsNCgkJCWxhenlMb2FkaW5nID0gMTsNCgkJCWJhc2UgPSB1cmwuc3Vic3RyaW5nKDAsIHVybC5sYXN0SW5kZXhPZigiLyIpKTsNCg0KCQkJLy8gQ2hlY2sgaWYgaXQncyBhIGRldi9zcmMgdmVyc2lvbiB0aGV5IHdhbnQgdG8gbG9hZCB0aGVuDQoJCQkvLyBtYWtlIHN1cmUgdGhhdCBhbGwgcGx1Z2lucywgdGhlbWVzIGV0YyBhcmUgbG9hZGVkIGluIHNvdXJjZSBtb2RlIGFzd2VsbA0KCQkJaWYgKC9fKHNyY3xkZXYpXC5qcy9nLnRlc3QodXJsKSkNCgkJCQlzdWZmaXggPSAiX3NyYyI7DQoNCgkJCS8vIFBhcnNlIG91dCBxdWVyeSBwYXJ0LCB0aGlzIHdpbGwgYmUgYXBwZW5kZWQgdG8gYWxsIHNjcmlwdHMsIGNzcyBldGMgdG8gY2xlYXIgYnJvd3NlciBjYWNoZQ0KCQkJcG9zID0gdXJsLmxhc3RJbmRleE9mKCI/Iik7DQoJCQlpZiAocG9zICE9IC0xKQ0KCQkJCXF1ZXJ5ID0gdXJsLnN1YnN0cmluZyhwb3MgKyAxKTsNCg0KCQkJLy8gU2V0dXAgdGlueU1DRVByZUluaXQgb2JqZWN0IHRoaXMgd2lsbCBsYXRlciBiZSB1c2VkIGJ5IHRoZSBUaW55TUNFDQoJCQkvLyBjb3JlIHNjcmlwdCB0byBsb2NhdGUgb3RoZXIgcmVzb3VyY2VzIGxpa2UgQ1NTIGZpbGVzLCBkaWFsb2dzIGV0Yw0KCQkJLy8gWW91IGNhbiBhbHNvIHByZWRlZmluZWQgYSB0aW55TUNFUHJlSW5pdCBvYmplY3QgYW5kIHRoZW4gaXQgd2lsbCB1c2UgdGhhdCBpbnN0ZWFkDQoJCQl3aW4udGlueU1DRVByZUluaXQgPSB3aW4udGlueU1DRVByZUluaXQgfHwgew0KCQkJCWJhc2UgOiBiYXNlLA0KCQkJCXN1ZmZpeCA6IHN1ZmZpeCwNCgkJCQlxdWVyeSA6IHF1ZXJ5DQoJCQl9Ow0KDQoJCQkvLyB1cmwgY29udGFpbnMgZ3ppcCB0aGVuIHdlIGFzc3VtZSBpdCdzIGEgY29tcHJlc3Nvcg0KCQkJaWYgKHVybC5pbmRleE9mKCdnemlwJykgIT0gLTEpIHsNCgkJCQlsYW5nID0gc2V0dGluZ3MubGFuZ3VhZ2UgfHwgImVuIjsNCgkJCQl1cmwgPSB1cmwgKyAoL1w/Ly50ZXN0KHVybCkgPyAnJicgOiAnPycpICsgImpzPXRydWUmY29yZT10cnVlJnN1ZmZpeD0iICsgZXNjYXBlKHN1ZmZpeCkgKyAiJnRoZW1lcz0iICsgZXNjYXBlKHNldHRpbmdzLnRoZW1lKSArICImcGx1Z2lucz0iICsgZXNjYXBlKHNldHRpbmdzLnBsdWdpbnMpICsgIiZsYW5ndWFnZXM9IiArIGxhbmc7DQoNCgkJCQkvLyBDaGVjayBpZiBjb21wcmVzc29yIHNjcmlwdCBpcyBhbHJlYWR5IGxvYWRlZCBvdGhlcndpc2Ugc2V0dXAgYSBiYXNpYyBvbmUNCgkJCQlpZiAoIXdpblsidGlueU1DRV9HWiJdKSB7DQoJCQkJCXRpbnlNQ0VfR1ogPSB7DQoJCQkJCQlzdGFydCA6IGZ1bmN0aW9uKCkgew0KCQkJCQkJCXRpbnltY2Uuc3VmZml4ID0gc3VmZml4Ow0KDQoJCQkJCQkJZnVuY3Rpb24gbG9hZCh1cmwpIHsNCgkJCQkJCQkJdGlueW1jZS5TY3JpcHRMb2FkZXIubWFya0RvbmUodGlueU1DRS5iYXNlVVJJLnRvQWJzb2x1dGUodXJsKSk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gQWRkIGNvcmUgbGFuZ3VhZ2VzDQoJCQkJCQkJbG9hZCgibGFuZ3MvIiArIGxhbmcgKyAiLmpzIik7DQoNCgkJCQkJCQkvLyBBZGQgdGhlbWVzIHdpdGggbGFuZ3VhZ2VzDQoJCQkJCQkJbG9hZCgidGhlbWVzLyIgKyBzZXR0aW5ncy50aGVtZSArICIvZWRpdG9yX3RlbXBsYXRlIiArIHN1ZmZpeCArICIuanMiKTsNCgkJCQkJCQlsb2FkKCJ0aGVtZXMvIiArIHNldHRpbmdzLnRoZW1lICsgIi9sYW5ncy8iICsgbGFuZyArICIuanMiKTsNCg0KCQkJCQkJCS8vIEFkZCBwbHVnaW5zIHdpdGggbGFuZ3VhZ2VzDQoJCQkJCQkJJC5lYWNoKHNldHRpbmdzLnBsdWdpbnMuc3BsaXQoIiwiKSwgZnVuY3Rpb24oaSwgbmFtZSkgew0KCQkJCQkJCQlpZiAobmFtZSkgew0KCQkJCQkJCQkJbG9hZCgicGx1Z2lucy8iICsgbmFtZSArICIvZWRpdG9yX3BsdWdpbiIgKyBzdWZmaXggKyAiLmpzIik7DQoJCQkJCQkJCQlsb2FkKCJwbHVnaW5zLyIgKyBuYW1lICsgIi9sYW5ncy8iICsgbGFuZyArICIuanMiKTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0pOw0KCQkJCQkJfSwNCg0KCQkJCQkJZW5kIDogZnVuY3Rpb24oKSB7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCS8vIExvYWQgdGhlIHNjcmlwdCBjYWNoZWQgYW5kIGV4ZWN1dGUgdGhlIGluaXRzIG9uY2UgaXQncyBkb25lDQoJCQkkLmFqYXgoew0KCQkJCXR5cGUgOiAiR0VUIiwNCgkJCQl1cmwgOiB1cmwsDQoJCQkJZGF0YVR5cGUgOiAic2NyaXB0IiwNCgkJCQljYWNoZSA6IHRydWUsDQoJCQkJc3VjY2VzcyA6IGZ1bmN0aW9uKCkgew0KCQkJCQl0aW55bWNlLmRvbS5FdmVudC5kb21Mb2FkZWQgPSAxOw0KCQkJCQlsYXp5TG9hZGluZyA9IDI7DQoNCgkJCQkJLy8gRXhlY3V0ZSBjYWxsYmFjayBhZnRlciBtYWluc2NyaXB0IGhhcyBiZWVuIGxvYWRlZCBhbmQgYmVmb3JlIHRoZSBpbml0aWFsaXphdGlvbiBvY2N1cnMNCgkJCQkJaWYgKHNldHRpbmdzLnNjcmlwdF9sb2FkZWQpDQoJCQkJCQlzZXR0aW5ncy5zY3JpcHRfbG9hZGVkKCk7DQoNCgkJCQkJaW5pdCgpOw0KDQoJCQkJCSQuZWFjaChkZWxheWVkSW5pdHMsIGZ1bmN0aW9uKGksIGluaXQpIHsNCgkJCQkJCWluaXQoKTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0gZWxzZSB7DQoJCQkvLyBEZWxheSB0aGUgaW5pdCBjYWxsIHVudGlsIHRpbnltY2UgaXMgbG9hZGVkDQoJCQlpZiAobGF6eUxvYWRpbmcgPT09IDEpDQoJCQkJZGVsYXllZEluaXRzLnB1c2goaW5pdCk7DQoJCQllbHNlDQoJCQkJaW5pdCgpOw0KCQl9DQoNCgkJcmV0dXJuIHNlbGY7DQoJfTsNCg0KCS8vIEFkZCA6dGlueW1jZSBwc3VlZG8gc2VsZWN0b3IgdGhpcyB3aWxsIHNlbGVjdCBlbGVtZW50cyB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZCBpbnRvIGVkaXRvciBpbnN0YW5jZXMNCgkvLyBpdCdzIG5vdyBwb3NzaWJsZSB0byB1c2UgdGhpbmdzIGxpa2UgJCgnKjp0aW55bWNlJykgdG8gZ2V0IGFsbCBUaW55TUNFIGJvdW5kIGVsZW1lbnRzLg0KCSQuZXh0ZW5kKCQuZXhwclsiOiJdLCB7DQoJCXRpbnltY2UgOiBmdW5jdGlvbihlKSB7DQoJCQlyZXR1cm4gZS5pZCAmJiAhIXRpbnlNQ0UuZ2V0KGUuaWQpOw0KCQl9DQoJfSk7DQoNCgkvLyBUaGlzIGZ1bmN0aW9uIHBhdGNoZXMgaW50ZXJuYWwgalF1ZXJ5IGZ1bmN0aW9ucyBzbyB0aGF0IGlmDQoJLy8geW91IGZvciBleGFtcGxlIHJlbW92ZSBhbiBkaXYgZWxlbWVudCBjb250YWluaW5nIGFuIGVkaXRvciBpdCdzDQoJLy8gYXV0b21hdGljYWxseSBkZXN0cm95ZWQgYnkgdGhlIFRpbnlNQ0UgQVBJDQoJZnVuY3Rpb24gYXBwbHlQYXRjaCgpIHsNCgkJLy8gUmVtb3ZlcyBhbnkgY2hpbGQgZWRpdG9yIGluc3RhbmNlcyBieSBsb29raW5nIGZvciBlZGl0b3Igd3JhcHBlciBlbGVtZW50cw0KCQlmdW5jdGlvbiByZW1vdmVFZGl0b3JzKG5hbWUpIHsNCgkJCS8vIElmIHRoZSBmdW5jdGlvbiBpcyByZW1vdmUNCgkJCWlmIChuYW1lID09PSAicmVtb3ZlIikgew0KCQkJCXRoaXMuZWFjaChmdW5jdGlvbihpLCBub2RlKSB7DQoJCQkJCXZhciBlZCA9IHRpbnlNQ0VJbnN0YW5jZShub2RlKTsNCg0KCQkJCQlpZiAoZWQpDQoJCQkJCQllZC5yZW1vdmUoKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJdGhpcy5maW5kKCJzcGFuLm1jZUVkaXRvcixkaXYubWNlRWRpdG9yIikuZWFjaChmdW5jdGlvbihpLCBub2RlKSB7DQoJCQkJdmFyIGVkID0gdGlueU1DRS5nZXQobm9kZS5pZC5yZXBsYWNlKC9fcGFyZW50JC8sICIiKSk7DQoNCgkJCQlpZiAoZWQpDQoJCQkJCWVkLnJlbW92ZSgpOw0KCQkJfSk7DQoJCX0NCg0KCQkvLyBMb2FkcyBvciBzYXZlcyBjb250ZW50cyBmcm9tL3RvIHRleHRhcmVhIGlmIHRoZSB2YWx1ZQ0KCQkvLyBhcmd1bWVudCBpcyBkZWZpbmVkIGl0IHdpbGwgc2V0IHRoZSBUaW55TUNFIGludGVybmFsIGNvbnRlbnRzDQoJCWZ1bmN0aW9uIGxvYWRPclNhdmUodmFsdWUpIHsNCgkJCXZhciBzZWxmID0gdGhpcywgZWQ7DQoNCgkJCS8vIEhhbmRsZSBzZXQgdmFsdWUNCgkJCWlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7DQoJCQkJcmVtb3ZlRWRpdG9ycy5jYWxsKHNlbGYpOw0KDQoJCQkJLy8gU2F2ZXMgdGhlIGNvbnRlbnRzIGJlZm9yZSBnZXQvc2V0IHZhbHVlIG9mIHRleHRhcmVhL2Rpdg0KCQkJCXNlbGYuZWFjaChmdW5jdGlvbihpLCBub2RlKSB7DQoJCQkJCXZhciBlZDsNCg0KCQkJCQlpZiAoZWQgPSB0aW55TUNFLmdldChub2RlLmlkKSkNCgkJCQkJCWVkLnNldENvbnRlbnQodmFsdWUpOw0KCQkJCX0pOw0KCQkJfSBlbHNlIGlmIChzZWxmLmxlbmd0aCA+IDApIHsNCgkJCQkvLyBIYW5kbGUgZ2V0IHZhbHVlDQoJCQkJaWYgKGVkID0gdGlueU1DRS5nZXQoc2VsZlswXS5pZCkpDQoJCQkJCXJldHVybiBlZC5nZXRDb250ZW50KCk7DQoJCQl9DQoJCX0NCg0KCQkvLyBSZXR1cm5zIHRpbnltY2UgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBvciBudWxsIGlmIGl0IHdhc24ndCBmb3VuZA0KCQlmdW5jdGlvbiB0aW55TUNFSW5zdGFuY2UoZWxlbWVudCkgew0KCQkJdmFyIGVkID0gbnVsbDsNCg0KCQkJKGVsZW1lbnQpICYmIChlbGVtZW50LmlkKSAmJiAod2luWyJ0aW55bWNlIl0pICYmIChlZCA9IHRpbnlNQ0UuZ2V0KGVsZW1lbnQuaWQpKTsNCg0KCQkJcmV0dXJuIGVkOw0KCQl9DQoNCgkJLy8gQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgc2V0IGNvbnRhaW5zIHRpbnltY2UgaW5zdGFuY2VzDQoJCWZ1bmN0aW9uIGNvbnRhaW5zVGlueU1DRShtYXRjaGVkU2V0KSB7DQoJCQlyZXR1cm4gISEoKG1hdGNoZWRTZXQpICYmIChtYXRjaGVkU2V0Lmxlbmd0aCkgJiYgKHdpblsidGlueW1jZSJdKSAmJiAobWF0Y2hlZFNldC5pcygiOnRpbnltY2UiKSkpOw0KCQl9DQoNCgkJLy8gUGF0Y2ggdmFyaW91cyBqUXVlcnkgZnVuY3Rpb25zDQoJCXZhciBqUXVlcnlGbiA9IHt9Ow0KDQoJCS8vIFBhdGNoIHNvbWUgc2V0dGVyL2dldHRlciBmdW5jdGlvbnMgdGhlc2Ugd2lsbA0KCQkvLyBub3cgYmUgYWJsZSB0byBzZXQvZ2V0IHRoZSBjb250ZW50cyBvZiBlZGl0b3IgaW5zdGFuY2VzIGZvcg0KCQkvLyBleGFtcGxlICQoJyNlZGl0b3JpZCcpLmh0bWwoJ0NvbnRlbnQnKTsgd2lsbCB1cGRhdGUgdGhlIFRpbnlNQ0UgaWZyYW1lIGluc3RhbmNlDQoJCSQuZWFjaChbInRleHQiLCAiaHRtbCIsICJ2YWwiXSwgZnVuY3Rpb24oaSwgbmFtZSkgew0KCQkJdmFyIG9yaWdGbiA9IGpRdWVyeUZuW25hbWVdID0gJC5mbltuYW1lXSwNCgkJCQl0ZXh0UHJvYyA9IChuYW1lID09PSAidGV4dCIpOw0KDQoJCQkgJC5mbltuYW1lXSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQoJCQkJdmFyIHNlbGYgPSB0aGlzOw0KDQoJCQkJaWYgKCFjb250YWluc1RpbnlNQ0Uoc2VsZikpDQoJCQkJCXJldHVybiBvcmlnRm4uYXBwbHkoc2VsZiwgYXJndW1lbnRzKTsNCg0KCQkJCWlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7DQoJCQkJCWxvYWRPclNhdmUuY2FsbChzZWxmLmZpbHRlcigiOnRpbnltY2UiKSwgdmFsdWUpOw0KCQkJCQlvcmlnRm4uYXBwbHkoc2VsZi5ub3QoIjp0aW55bWNlIiksIGFyZ3VtZW50cyk7DQoNCgkJCQkJcmV0dXJuIHNlbGY7IC8vIHJldHVybiBvcmlnaW5hbCBzZXQgZm9yIGNoYWluaW5nDQoJCQkJfSBlbHNlIHsNCgkJCQkJdmFyIHJldCA9ICIiOw0KCQkJCQl2YXIgYXJncyA9IGFyZ3VtZW50czsNCgkJCQkJDQoJCQkJCSh0ZXh0UHJvYyA/IHNlbGYgOiBzZWxmLmVxKDApKS5lYWNoKGZ1bmN0aW9uKGksIG5vZGUpIHsNCgkJCQkJCXZhciBlZCA9IHRpbnlNQ0VJbnN0YW5jZShub2RlKTsNCg0KCQkJCQkJcmV0ICs9IGVkID8gKHRleHRQcm9jID8gZWQuZ2V0Q29udGVudCgpLnJlcGxhY2UoLzwoPzoiW14iXSoifCdbXiddKid8W14nIj5dKSo+L2csICIiKSA6IGVkLmdldENvbnRlbnQoKSkgOiBvcmlnRm4uYXBwbHkoJChub2RlKSwgYXJncyk7DQoJCQkJCX0pOw0KDQoJCQkJCXJldHVybiByZXQ7DQoJCQkJfQ0KCQkJIH07DQoJCX0pOw0KDQoJCS8vIE1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSAkKCcjaWQnKS5hcHBlbmQoImNvbnRlbnQiKTsgdG8gYXBwZW5kIGNvbnRlbnRzIHRvIHRoZSBUaW55TUNFIGVkaXRvciBpZnJhbWUNCgkJJC5lYWNoKFsiYXBwZW5kIiwgInByZXBlbmQiXSwgZnVuY3Rpb24oaSwgbmFtZSkgew0KCQkJdmFyIG9yaWdGbiA9IGpRdWVyeUZuW25hbWVdID0gJC5mbltuYW1lXSwNCgkJCQlwcmVwZW5kID0gKG5hbWUgPT09ICJwcmVwZW5kIik7DQoNCgkJCSAkLmZuW25hbWVdID0gZnVuY3Rpb24odmFsdWUpIHsNCgkJCQl2YXIgc2VsZiA9IHRoaXM7DQoNCgkJCQlpZiAoIWNvbnRhaW5zVGlueU1DRShzZWxmKSkNCgkJCQkJcmV0dXJuIG9yaWdGbi5hcHBseShzZWxmLCBhcmd1bWVudHMpOw0KDQoJCQkJaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsNCgkJCQkJc2VsZi5maWx0ZXIoIjp0aW55bWNlIikuZWFjaChmdW5jdGlvbihpLCBub2RlKSB7DQoJCQkJCQl2YXIgZWQgPSB0aW55TUNFSW5zdGFuY2Uobm9kZSk7DQoNCgkJCQkJCWVkICYmIGVkLnNldENvbnRlbnQocHJlcGVuZCA/IHZhbHVlICsgZWQuZ2V0Q29udGVudCgpIDogZWQuZ2V0Q29udGVudCgpICsgdmFsdWUpOw0KCQkJCQl9KTsNCg0KCQkJCQlvcmlnRm4uYXBwbHkoc2VsZi5ub3QoIjp0aW55bWNlIiksIGFyZ3VtZW50cyk7DQoNCgkJCQkJcmV0dXJuIHNlbGY7IC8vIHJldHVybiBvcmlnaW5hbCBzZXQgZm9yIGNoYWluaW5nDQoJCQkJfQ0KCQkJIH07DQoJCX0pOw0KDQoJCS8vIE1ha2VzIHN1cmUgdGhhdCB0aGUgZWRpdG9yIGluc3RhbmNlIGdldHMgcHJvcGVybHkgZGVzdHJveWVkIHdoZW4gdGhlIHBhcmVudCBlbGVtZW50IGlzIHJlbW92ZWQNCgkJJC5lYWNoKFsicmVtb3ZlIiwgInJlcGxhY2VXaXRoIiwgInJlcGxhY2VBbGwiLCAiZW1wdHkiXSwgZnVuY3Rpb24oaSwgbmFtZSkgew0KCQkJdmFyIG9yaWdGbiA9IGpRdWVyeUZuW25hbWVdID0gJC5mbltuYW1lXTsNCg0KCQkJJC5mbltuYW1lXSA9IGZ1bmN0aW9uKCkgew0KCQkJCXJlbW92ZUVkaXRvcnMuY2FsbCh0aGlzLCBuYW1lKTsNCg0KCQkJCXJldHVybiBvcmlnRm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCgkJCX07DQoJCX0pOw0KDQoJCWpRdWVyeUZuLmF0dHIgPSAkLmZuLmF0dHI7DQoNCgkJLy8gTWFrZXMgc3VyZSB0aGF0ICQoJyN0aW55bWNlX2lkJykuYXR0cigndmFsdWUnKSBnZXRzIHRoZSBlZGl0b3JzIGN1cnJlbnQgSFRNTCBjb250ZW50cw0KCQkkLmZuLmF0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgdHlwZSkgew0KCQkJdmFyIHNlbGYgPSB0aGlzOw0KDQoJCQlpZiAoKCFuYW1lKSB8fCAobmFtZSAhPT0gInZhbHVlIikgfHwgKCFjb250YWluc1RpbnlNQ0Uoc2VsZikpKQ0KCQkJCXJldHVybiBqUXVlcnlGbi5hdHRyLmNhbGwoc2VsZiwgbmFtZSwgdmFsdWUsIHR5cGUpOw0KDQoJCQlpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgew0KCQkJCWxvYWRPclNhdmUuY2FsbChzZWxmLmZpbHRlcigiOnRpbnltY2UiKSwgdmFsdWUpOw0KCQkJCWpRdWVyeUZuLmF0dHIuY2FsbChzZWxmLm5vdCgiOnRpbnltY2UiKSwgbmFtZSwgdmFsdWUsIHR5cGUpOw0KDQoJCQkJcmV0dXJuIHNlbGY7IC8vIHJldHVybiBvcmlnaW5hbCBzZXQgZm9yIGNoYWluaW5nDQoJCQl9IGVsc2Ugew0KCQkJCXZhciBub2RlID0gc2VsZlswXSwgZWQgPSB0aW55TUNFSW5zdGFuY2Uobm9kZSk7DQoNCgkJCQlyZXR1cm4gZWQgPyBlZC5nZXRDb250ZW50KCkgOiBqUXVlcnlGbi5hdHRyLmNhbGwoJChub2RlKSwgbmFtZSwgdmFsdWUsIHR5cGUpOw0KCQkJfQ0KCQl9Ow0KCX0NCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/adapter/prototype/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/adapter/prototype/adapter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGFkYXB0ZXIuanMKICoKICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4KICoKICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcKICovCgovLyAjaWZkZWYgcHJvdG90eXBlX2FkYXB0ZXIKCihmdW5jdGlvbigpIHsKCWlmICghd2luZG93LlByb3RvdHlwZSkKCQlyZXR1cm4gYWxlcnQoIkxvYWQgcHJvdG90eXBlIGZpcnN0ISIpOwoKCS8vIFBhdGNoIGluIGNvcmUgTlMgZnVuY3Rpb25zCgl0aW55bWNlLmV4dGVuZCh0aW55bWNlLCB7CgkJdHJpbSA6IGZ1bmN0aW9uKHMpIHtyZXR1cm4gcyA/IHMuc3RyaXAoKSA6ICcnO30sCgkJaW5BcnJheSA6IGZ1bmN0aW9uKGEsIHYpIHtyZXR1cm4gYSAmJiBhLmluZGV4T2YgPyBhLmluZGV4T2YodikgOiAtMTt9Cgl9KTsKCgkvLyBQYXRjaCBpbiBmdW5jdGlvbnMgaW4gdmFyaW91cyBjbGFzZXMKCS8vIEFkZCBhICIjaWZuZGVmanF1ZXJ5IiBzdGF0ZW1lbnQgYXJvdW5kIGVhY2ggY29yZSBBUEkgZnVuY3Rpb24geW91IGFkZCBiZWxvdwoJdmFyIHBhdGNoZXMgPSB7CgkJJ3RpbnltY2UudXRpbC5KU09OJyA6IHsKCQkJLypzZXJpYWxpemUgOiBmdW5jdGlvbihvKSB7CgkJCQlyZXR1cm4gby50b0pTT04oKTsKCQkJfSovCgkJfSwKCX07CgoJLy8gUGF0Y2ggZnVuY3Rpb25zIGFmdGVyIGEgY2xhc3MgaXMgY3JlYXRlZAoJdGlueW1jZS5vbkNyZWF0ZSA9IGZ1bmN0aW9uKHR5LCBjLCBwKSB7CgkJdGlueW1jZS5leHRlbmQocCwgcGF0Y2hlc1tjXSk7Cgl9Owp9KSgpOwoKLy8gI2VuZGlmCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/AddOnManager.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBBZGRPbk1hbmFnZXIuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXIsIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgkvKioNCgkgKiBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlIGxvYWRpbmcgb2YgdGhlbWVzL3BsdWdpbnMgb3Igb3RoZXIgYWRkLW9ucyBhbmQgdGhlaXIgbGFuZ3VhZ2UgcGFja3MuDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS5BZGRPbk1hbmFnZXINCgkgKi8NCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5BZGRPbk1hbmFnZXInLCB7DQoJCUFkZE9uTWFuYWdlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHNlbGYgPSB0aGlzOw0KDQoJCQlzZWxmLml0ZW1zID0gW107DQoJCQlzZWxmLnVybHMgPSB7fTsNCgkJCXNlbGYubG9va3VwID0ge307DQoJCQlzZWxmLm9uQWRkID0gbmV3IERpc3BhdGNoZXIoc2VsZik7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEZpcmVzIHdoZW4gYSBpdGVtIGlzIGFkZGVkLg0KCQkgKg0KCQkgKiBAZXZlbnQgb25BZGQNCgkJICovDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBhZGQgb24gYnkgdGhlIHNob3J0IG5hbWUuDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIEFkZC1vbiB0byBsb29rIGZvci4NCgkJICogQHJldHVybiB7dGlueW1jZS5UaGVtZS90aW55bWNlLlBsdWdpbn0gVGhlbWUgb3IgcGx1Z2luIGFkZC1vbiBpbnN0YW5jZSBvciB1bmRlZmluZWQuDQoJCSAqLw0KCQlnZXQgOiBmdW5jdGlvbihuKSB7DQoJCQlyZXR1cm4gdGhpcy5sb29rdXBbbl07DQoJCX0sDQoNCgkJLyoqDQoJCSAqIExvYWRzIGEgbGFuZ3VhZ2UgcGFjayBmb3IgdGhlIHNwZWNpZmllZCBhZGQtb24uDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVxdWlyZUxhbmdQYWNrDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIFNob3J0IG5hbWUgb2YgdGhlIGFkZC1vbi4NCgkJICovDQoJCXJlcXVpcmVMYW5nUGFjayA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciBzID0gdGlueW1jZS5zZXR0aW5nczsNCg0KCQkJaWYgKHMgJiYgcy5sYW5ndWFnZSkNCgkJCQl0aW55bWNlLlNjcmlwdExvYWRlci5hZGQodGhpcy51cmxzW25dICsgJy9sYW5ncy8nICsgcy5sYW5ndWFnZSArICcuanMnKTsNCgkJfSwNCg0KCQkvKioNCgkJICogQWRkcyBhIGluc3RhbmNlIG9mIHRoZSBhZGQtb24gYnkgaXQncyBzaG9ydCBuYW1lLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGFkZA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWQgU2hvcnQgbmFtZS9pZCBmb3IgdGhlIGFkZC1vbi4NCgkJICogQHBhcmFtIHt0aW55bWNlLlRoZW1lL3RpbnltY2UuUGx1Z2lufSBvIFRoZW1lIG9yIHBsdWdpbiB0byBhZGQuDQoJCSAqIEByZXR1cm4ge3RpbnltY2UuVGhlbWUvdGlueW1jZS5QbHVnaW59IFRoZSBzYW1lIHRoZW1lIG9yIHBsdWdpbiBpbnN0YW5jZSB0aGF0IGdvdCBwYXNzZWQgaW4uDQoJCSAqLw0KCQlhZGQgOiBmdW5jdGlvbihpZCwgbykgew0KCQkJdGhpcy5pdGVtcy5wdXNoKG8pOw0KCQkJdGhpcy5sb29rdXBbaWRdID0gbzsNCgkJCXRoaXMub25BZGQuZGlzcGF0Y2godGhpcywgaWQsIG8pOw0KDQoJCQlyZXR1cm4gbzsNCgkJfSwNCg0KCQkvKioNCgkJICogTG9hZHMgYW4gYWRkLW9uIGZyb20gYSBzcGVjaWZpYyB1cmwuDQoJCSAqDQoJCSAqIEBtZXRob2QgbG9hZA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBTaG9ydCBuYW1lIG9mIHRoZSBhZGQtb24gdGhhdCBnZXRzIGxvYWRlZC4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHUgVVJMIHRvIHRoZSBhZGQtb24gdGhhdCB3aWxsIGdldCBsb2FkZWQuDQoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGNiIE9wdGlvbmFsIGNhbGxiYWNrIHRvIGV4ZWN1dGUgb25lcyB0aGUgYWRkLW9uIGlzIGxvYWRlZC4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgc2NvcGUgdG8gZXhlY3V0ZSB0aGUgY2FsbGJhY2sgaW4uDQoJCSAqLw0KCQlsb2FkIDogZnVuY3Rpb24obiwgdSwgY2IsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKHQudXJsc1tuXSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICh1LmluZGV4T2YoJy8nKSAhPSAwICYmIHUuaW5kZXhPZignOi8vJykgPT0gLTEpDQoJCQkJdSA9IHRpbnltY2UuYmFzZVVSTCArICcvJyArICB1Ow0KDQoJCQl0LnVybHNbbl0gPSB1LnN1YnN0cmluZygwLCB1Lmxhc3RJbmRleE9mKCcvJykpOw0KDQoJCQlpZiAoIXQubG9va3VwW25dKQ0KCQkJCXRpbnltY2UuU2NyaXB0TG9hZGVyLmFkZCh1LCBjYiwgcyk7DQoJCX0NCgl9KTsNCg0KCS8vIENyZWF0ZSBwbHVnaW4gYW5kIHRoZW1lIG1hbmFnZXJzDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyID0gbmV3IHRpbnltY2UuQWRkT25NYW5hZ2VyKCk7DQoJdGlueW1jZS5UaGVtZU1hbmFnZXIgPSBuZXcgdGlueW1jZS5BZGRPbk1hbmFnZXIoKTsNCn0odGlueW1jZSkpOw0KDQovKioNCiAqIFRpbnlNQ0UgdGhlbWUgY2xhc3MuDQogKg0KICogQGNsYXNzIHRpbnltY2UuVGhlbWUNCiAqLw0KDQovKioNCiAqIFRpbnlNQ0UgcGx1Z2luIGNsYXNzLg0KICoNCiAqIEBjbGFzcyB0aW55bWNlLlBsdWdpbg0KICovDQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/CommandManager.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBUaW55TUNFIC0gQ29udGVudE1hbmFnZXIgY2xhc3MuDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCglmdW5jdGlvbiBDb21tYW5kTWFuYWdlcigpIHsNCgkJdmFyIGV4ZWNDb21tYW5kcyA9IHt9LCBxdWVyeVN0YXRlQ29tbWFuZHMgPSB7fSwgcXVlcnlWYWx1ZUNvbW1hbmRzID0ge307DQoNCgkJZnVuY3Rpb24gYWRkKGNvbGxlY3Rpb24sIGNtZCwgZnVuYywgc2NvcGUpIHsNCgkJCWlmICh0eXBlb2YoY21kKSA9PSAnc3RyaW5nJykNCgkJCQljbWQgPSBbY21kXTsNCg0KCQkJdGlueW1jZS5lYWNoKGNtZCwgZnVuY3Rpb24oY21kKSB7DQoJCQkJY29sbGVjdGlvbltjbWQudG9Mb3dlckNhc2UoKV0gPSB7ZnVuYyA6IGZ1bmMsIHNjb3BlIDogc2NvcGV9Ow0KCQkJfSk7DQoJCX07DQoNCgkJdGlueW1jZS5leHRlbmQodGhpcywgew0KCQkJYWRkIDogZnVuY3Rpb24oY21kLCBmdW5jLCBzY29wZSkgew0KCQkJCWFkZChleGVjQ29tbWFuZHMsIGNtZCwgZnVuYywgc2NvcGUpOw0KCQkJfSwNCg0KCQkJYWRkUXVlcnlTdGF0ZUhhbmRsZXIgOiBmdW5jdGlvbihjbWQsIGZ1bmMsIHNjb3BlKSB7DQoJCQkJYWRkKHF1ZXJ5U3RhdGVDb21tYW5kcywgY21kLCBmdW5jLCBzY29wZSk7DQoJCQl9LA0KDQoJCQlhZGRRdWVyeVZhbHVlSGFuZGxlciA6IGZ1bmN0aW9uKGNtZCwgZnVuYywgc2NvcGUpIHsNCgkJCQlhZGQocXVlcnlWYWx1ZUNvbW1hbmRzLCBjbWQsIGZ1bmMsIHNjb3BlKTsNCgkJCX0sDQoNCgkJCWV4ZWNDb21tYW5kIDogZnVuY3Rpb24oc2NvcGUsIGNtZCwgdWksIHZhbHVlLCBhcmdzKSB7DQoJCQkJaWYgKGNtZCA9IGV4ZWNDb21tYW5kc1tjbWQudG9Mb3dlckNhc2UoKV0pIHsNCgkJCQkJaWYgKGNtZC5mdW5jLmNhbGwoc2NvcGUgfHwgY21kLnNjb3BlLCB1aSwgdmFsdWUsIGFyZ3MpICE9PSBmYWxzZSkNCgkJCQkJCXJldHVybiB0cnVlOw0KCQkJCX0NCgkJCX0sDQoNCgkJCXF1ZXJ5Q29tbWFuZFZhbHVlIDogZnVuY3Rpb24oKSB7DQoJCQkJaWYgKGNtZCA9IHF1ZXJ5VmFsdWVDb21tYW5kc1tjbWQudG9Mb3dlckNhc2UoKV0pDQoJCQkJCXJldHVybiBjbWQuZnVuYy5jYWxsKHNjb3BlIHx8IGNtZC5zY29wZSwgdWksIHZhbHVlLCBhcmdzKTsNCgkJCX0sDQoNCgkJCXF1ZXJ5Q29tbWFuZFN0YXRlIDogZnVuY3Rpb24oKSB7DQoJCQkJaWYgKGNtZCA9IHF1ZXJ5U3RhdGVDb21tYW5kc1tjbWQudG9Mb3dlckNhc2UoKV0pDQoJCQkJCXJldHVybiBjbWQuZnVuYy5jYWxsKHNjb3BlIHx8IGNtZC5zY29wZSwgdWksIHZhbHVlLCBhcmdzKTsNCgkJCX0NCgkJfSk7DQoJfTsNCg0KCXRpbnltY2UuR2xvYmFsQ29tbWFuZHMgPSBuZXcgQ29tbWFuZE1hbmFnZXIoKTsNCn0pKHRpbnltY2UpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ControlManager.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBDb250cm9sTWFuYWdlci5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBET00gPSB0aW55bWNlLkRPTSwgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwgZWFjaCA9IHRpbnltY2UuZWFjaCwgZXh0ZW5kID0gdGlueW1jZS5leHRlbmQ7DQoNCgkvKioNCgkgKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBVSSBjb250cm9sIGluc3RhbmNlcy4gSXQncyBib3RoIGEgZmFjdG9yeSBhbmQgYSBjb2xsZWN0aW9uIGZvciB0aGUgY29udHJvbHMuDQoJICogQGNsYXNzIHRpbnltY2UuQ29udHJvbE1hbmFnZXINCgkgKi8NCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5Db250cm9sTWFuYWdlcicsIHsNCgkJLyoqDQoJCSAqIENvbnN0cnVjdHMgYSBuZXcgY29udHJvbCBtYW5hZ2VyIGluc3RhbmNlLg0KCQkgKiBDb25zdWx0IHRoZSBXaWtpIGZvciBtb3JlIGRldGFpbHMgb24gdGhpcyBjbGFzcy4NCgkJICoNCgkJICogQGNvbnN0cnVjdG9yDQoJCSAqIEBtZXRob2QgQ29udHJvbE1hbmFnZXINCgkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gZWQgVGlueU1DRSBlZGl0b3IgaW5zdGFuY2UgdG8gYWRkIHRoZSBjb250cm9sIHRvLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBjb250cm9sIG1hbmFnZXIuDQoJCSAqLw0KCQlDb250cm9sTWFuYWdlciA6IGZ1bmN0aW9uKGVkLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGk7DQoNCgkJCXMgPSBzIHx8IHt9Ow0KCQkJdC5lZGl0b3IgPSBlZDsNCgkJCXQuY29udHJvbHMgPSB7fTsNCgkJCXQub25BZGQgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodCk7DQoJCQl0Lm9uUG9zdFJlbmRlciA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0KTsNCgkJCXQucHJlZml4ID0gcy5wcmVmaXggfHwgZWQuaWQgKyAnXyc7DQoJCQl0Ll9jbHMgPSB7fTsNCg0KCQkJdC5vblBvc3RSZW5kZXIuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCWVhY2godC5jb250cm9scywgZnVuY3Rpb24oYykgew0KCQkJCQljLnBvc3RSZW5kZXIoKTsNCgkJCQl9KTsNCgkJCX0pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIGEgY29udHJvbCBieSBpZCBvciB1bmRlZmluZWQgaXQgaXQgd2Fzbid0IGZvdW5kLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29udHJvbCBpbnN0YW5jZSBuYW1lLg0KCQkgKiBAcmV0dXJuIHt0aW55bWNlLnVpLkNvbnRyb2x9IENvbnRyb2wgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkLg0KCQkgKi8NCgkJZ2V0IDogZnVuY3Rpb24oaWQpIHsNCgkJCXJldHVybiB0aGlzLmNvbnRyb2xzW3RoaXMucHJlZml4ICsgaWRdIHx8IHRoaXMuY29udHJvbHNbaWRdOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIHRoZSBhY3RpdmUgc3RhdGUgb2YgYSBjb250cm9sIGJ5IGlkLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldEFjdGl2ZQ0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29udHJvbCBpZCB0byBzZXQgc3RhdGUgb24uDQoJCSAqIEBwYXJhbSB7Qm9vbGVhbn0gcyBBY3RpdmUgc3RhdGUgdHJ1ZS9mYWxzZS4NCgkJICogQHJldHVybiB7dGlueW1jZS51aS5Db250cm9sfSBDb250cm9sIGluc3RhbmNlIHRoYXQgZ290IGFjdGl2YXRlZCBvciBudWxsIGlmIGl0IHdhc24ndCBmb3VuZC4NCgkJICovDQoJCXNldEFjdGl2ZSA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl2YXIgYyA9IG51bGw7DQoNCgkJCWlmIChjID0gdGhpcy5nZXQoaWQpKQ0KCQkJCWMuc2V0QWN0aXZlKHMpOw0KDQoJCQlyZXR1cm4gYzsNCgkJfSwNCg0KCQkvKioNCgkJICogU2V0cyB0aGUgZHNpYWJsZWQgc3RhdGUgb2YgYSBjb250cm9sIGJ5IGlkLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldERpc2FibGVkDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb250cm9sIGlkIHRvIHNldCBzdGF0ZSBvbi4NCgkJICogQHBhcmFtIHtCb29sZWFufSBzIEFjdGl2ZSBzdGF0ZSB0cnVlL2ZhbHNlLg0KCQkgKiBAcmV0dXJuIHt0aW55bWNlLnVpLkNvbnRyb2x9IENvbnRyb2wgaW5zdGFuY2UgdGhhdCBnb3QgZGlzYWJsZWQgb3IgbnVsbCBpZiBpdCB3YXNuJ3QgZm91bmQuDQoJCSAqLw0KCQlzZXREaXNhYmxlZCA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl2YXIgYyA9IG51bGw7DQoNCgkJCWlmIChjID0gdGhpcy5nZXQoaWQpKQ0KCQkJCWMuc2V0RGlzYWJsZWQocyk7DQoNCgkJCXJldHVybiBjOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBBZGRzIGEgY29udHJvbCB0byB0aGUgY29udHJvbCBjb2xsZWN0aW9uIGluc2lkZSB0aGUgbWFuYWdlci4NCgkJICoNCgkJICogQG1ldGhvZCBhZGQNCgkJICogQHBhcmFtIHt0aW55bWNlLnVpLkNvbnRyb2x9IENvbnRyb2wgaW5zdGFuY2UgdG8gYWRkIHRvIGNvbGxlY3Rpb24uDQoJCSAqIEByZXR1cm4ge3RpbnltY2UudWkuQ29udHJvbH0gQ29udHJvbCBpbnN0YW5jZSB0aGF0IGdvdCBwYXNzZWQgaW4uDQoJCSAqLw0KCQlhZGQgOiBmdW5jdGlvbihjKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWlmIChjKSB7DQoJCQkJdC5jb250cm9sc1tjLmlkXSA9IGM7DQoJCQkJdC5vbkFkZC5kaXNwYXRjaChjLCB0KTsNCgkJCX0NCg0KCQkJcmV0dXJuIGM7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENyZWF0ZXMgYSBjb250cm9sIGJ5IG5hbWUsIHdoZW4gYSBjb250cm9sIGlzIGNyZWF0ZWQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCBpdCB0byB0aGUgY29udHJvbCBjb2xsZWN0aW9uLg0KCQkgKiBJdCBmaXJzdCBhc2sgYWxsIHBsdWdpbnMgZm9yIHRoZSBzcGVjaWZpZWQgY29udHJvbCBpZiB0aGUgcGx1Z2lucyBkaWRuJ3QgcmV0dXJuIGEgY29udHJvbCB0aGVuIHRoZSBkZWZhdWx0IGJlaGF2aW9yDQoJCSAqIHdpbGwgYmUgdXNlZC4NCgkJICoNCgkJICogQG1ldGhvZCBjcmVhdGVDb250cm9sDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIENvbnRyb2wgbmFtZSB0byBjcmVhdGUgZm9yIGV4YW1wbGUgInNlcGFyYXRvciIuDQoJCSAqIEByZXR1cm4ge3RpbnltY2UudWkuQ29udHJvbH0gQ29udHJvbCBpbnN0YW5jZSB0aGF0IGdvdCBjcmVhdGVkIGFuZCBhZGRlZC4NCgkJICovDQoJCWNyZWF0ZUNvbnRyb2wgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgYywgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3I7DQoNCgkJCWVhY2goZWQucGx1Z2lucywgZnVuY3Rpb24ocCkgew0KCQkJCWlmIChwLmNyZWF0ZUNvbnRyb2wpIHsNCgkJCQkJYyA9IHAuY3JlYXRlQ29udHJvbChuLCB0KTsNCg0KCQkJCQlpZiAoYykNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJc3dpdGNoIChuKSB7DQoJCQkJY2FzZSAifCI6DQoJCQkJY2FzZSAic2VwYXJhdG9yIjoNCgkJCQkJcmV0dXJuIHQuY3JlYXRlU2VwYXJhdG9yKCk7DQoJCQl9DQoNCgkJCWlmICghYyAmJiBlZC5idXR0b25zICYmIChjID0gZWQuYnV0dG9uc1tuXSkpDQoJCQkJcmV0dXJuIHQuY3JlYXRlQnV0dG9uKG4sIGMpOw0KDQoJCQlyZXR1cm4gdC5hZGQoYyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENyZWF0ZXMgYSBkcm9wIG1lbnUgY29udHJvbCBpbnN0YW5jZSBieSBpZC4NCgkJICoNCgkJICogQG1ldGhvZCBjcmVhdGVEcm9wTWVudQ0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWQgVW5pcXVlIGlkIGZvciB0aGUgbmV3IGRyb3Bkb3duIGluc3RhbmNlLiBGb3IgZXhhbXBsZSAic29tZSBtZW51Ii4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgc2V0dGluZ3Mgb2JqZWN0IGZvciB0aGUgY29udHJvbC4NCgkJICogQHBhcmFtIHtPYmplY3R9IGNjIE9wdGlvbmFsIGNvbnRyb2wgY2xhc3MgdG8gdXNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lLg0KCQkgKiBAcmV0dXJuIHt0aW55bWNlLnVpLkNvbnRyb2x9IENvbnRyb2wgaW5zdGFuY2UgdGhhdCBnb3QgY3JlYXRlZCBhbmQgYWRkZWQuDQoJCSAqLw0KCQljcmVhdGVEcm9wTWVudSA6IGZ1bmN0aW9uKGlkLCBzLCBjYykgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBjLCBibSwgdiwgY2xzOw0KDQoJCQlzID0gZXh0ZW5kKHsNCgkJCQknY2xhc3MnIDogJ21jZURyb3BEb3duJywNCgkJCQljb25zdHJhaW4gOiBlZC5zZXR0aW5ncy5jb25zdHJhaW5fbWVudXMNCgkJCX0sIHMpOw0KDQoJCQlzWydjbGFzcyddID0gc1snY2xhc3MnXSArICcgJyArIGVkLmdldFBhcmFtKCdza2luJykgKyAnU2tpbic7DQoJCQlpZiAodiA9IGVkLmdldFBhcmFtKCdza2luX3ZhcmlhbnQnKSkNCgkJCQlzWydjbGFzcyddICs9ICcgJyArIGVkLmdldFBhcmFtKCdza2luJykgKyAnU2tpbicgKyB2LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgdi5zdWJzdHJpbmcoMSk7DQoNCgkJCWlkID0gdC5wcmVmaXggKyBpZDsNCgkJCWNscyA9IGNjIHx8IHQuX2Nscy5kcm9wbWVudSB8fCB0aW55bWNlLnVpLkRyb3BNZW51Ow0KCQkJYyA9IHQuY29udHJvbHNbaWRdID0gbmV3IGNscyhpZCwgcyk7DQoJCQljLm9uQWRkSXRlbS5hZGQoZnVuY3Rpb24oYywgbykgew0KCQkJCXZhciBzID0gby5zZXR0aW5nczsNCg0KCQkJCXMudGl0bGUgPSBlZC5nZXRMYW5nKHMudGl0bGUsIHMudGl0bGUpOw0KDQoJCQkJaWYgKCFzLm9uY2xpY2spIHsNCgkJCQkJcy5vbmNsaWNrID0gZnVuY3Rpb24odikgew0KCQkJCQkJaWYgKHMuY21kKQ0KCQkJCQkJCWVkLmV4ZWNDb21tYW5kKHMuY21kLCBzLnVpIHx8IGZhbHNlLCBzLnZhbHVlKTsNCgkJCQkJfTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJZWQub25SZW1vdmUuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCWMuZGVzdHJveSgpOw0KCQkJfSk7DQoNCgkJCS8vIEZpeCBmb3IgYnVnICMxODk3Nzg1LCAjMTg5ODAwNw0KCQkJaWYgKHRpbnltY2UuaXNJRSkgew0KCQkJCWMub25TaG93TWVudS5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCS8vIElFIDggbmVlZHMgZm9jdXMgaW4gb3JkZXIgdG8gc3RvcmUgYXdheSBhIHJhbmdlIHdpdGggdGhlIGN1cnJlbnQgY29sbGFwc2VkIGNhcmV0IGxvY2F0aW9uDQoJCQkJCWVkLmZvY3VzKCk7DQoNCgkJCQkJYm0gPSBlZC5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMSk7DQoJCQkJfSk7DQoNCgkJCQljLm9uSGlkZU1lbnUuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoYm0pIHsNCgkJCQkJCWVkLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhibSk7DQoJCQkJCQlibSA9IDA7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJcmV0dXJuIHQuYWRkKGMpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDcmVhdGVzIGEgbGlzdCBib3ggY29udHJvbCBpbnN0YW5jZSBieSBpZC4gQSBsaXN0IGJveCBpcyBlaXRoZXIgYSBuYXRpdmUgc2VsZWN0IGVsZW1lbnQgb3IgYSBET00vSlMgYmFzZWQgbGlzdCBib3ggY29udHJvbC4gVGhpcw0KCQkgKiBkZXBlbmRzIG9uIHRoZSB1c2VfbmF0aXZlX3NlbGVjdHMgc2V0dGluZ3Mgc3RhdGUuDQoJCSAqDQoJCSAqIEBtZXRob2QgY3JlYXRlTGlzdEJveA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWQgVW5pcXVlIGlkIGZvciB0aGUgbmV3IGxpc3Rib3ggaW5zdGFuY2UuIEZvciBleGFtcGxlICJzdHlsZXMiLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBjb250cm9sLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gY2MgT3B0aW9uYWwgY29udHJvbCBjbGFzcyB0byB1c2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvbmUuDQoJCSAqIEByZXR1cm4ge3RpbnltY2UudWkuQ29udHJvbH0gQ29udHJvbCBpbnN0YW5jZSB0aGF0IGdvdCBjcmVhdGVkIGFuZCBhZGRlZC4NCgkJICovDQoJCWNyZWF0ZUxpc3RCb3ggOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgY21kLCBjLCBjbHM7DQoNCgkJCWlmICh0LmdldChpZCkpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCXMudGl0bGUgPSBlZC50cmFuc2xhdGUocy50aXRsZSk7DQoJCQlzLnNjb3BlID0gcy5zY29wZSB8fCBlZDsNCg0KCQkJaWYgKCFzLm9uc2VsZWN0KSB7DQoJCQkJcy5vbnNlbGVjdCA9IGZ1bmN0aW9uKHYpIHsNCgkJCQkJZWQuZXhlY0NvbW1hbmQocy5jbWQsIHMudWkgfHwgZmFsc2UsIHYgfHwgcy52YWx1ZSk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJcyA9IGV4dGVuZCh7DQoJCQkJdGl0bGUgOiBzLnRpdGxlLA0KCQkJCSdjbGFzcycgOiAnbWNlXycgKyBpZCwNCgkJCQlzY29wZSA6IHMuc2NvcGUsDQoJCQkJY29udHJvbF9tYW5hZ2VyIDogdA0KCQkJfSwgcyk7DQoNCgkJCWlkID0gdC5wcmVmaXggKyBpZDsNCg0KCQkJaWYgKGVkLnNldHRpbmdzLnVzZV9uYXRpdmVfc2VsZWN0cykNCgkJCQljID0gbmV3IHRpbnltY2UudWkuTmF0aXZlTGlzdEJveChpZCwgcyk7DQoJCQllbHNlIHsNCgkJCQljbHMgPSBjYyB8fCB0Ll9jbHMubGlzdGJveCB8fCB0aW55bWNlLnVpLkxpc3RCb3g7DQoJCQkJYyA9IG5ldyBjbHMoaWQsIHMpOw0KCQkJfQ0KDQoJCQl0LmNvbnRyb2xzW2lkXSA9IGM7DQoNCgkJCS8vIEZpeCBmb2N1cyBwcm9ibGVtIGluIFNhZmFyaQ0KCQkJaWYgKHRpbnltY2UuaXNXZWJLaXQpIHsNCgkJCQljLm9uUG9zdFJlbmRlci5hZGQoZnVuY3Rpb24oYywgbikgew0KCQkJCQkvLyBTdG9yZSBib29rbWFyayBvbiBtb3VzZWRvd24NCgkJCQkJRXZlbnQuYWRkKG4sICdtb3VzZWRvd24nLCBmdW5jdGlvbigpIHsNCgkJCQkJCWVkLmJvb2ttYXJrID0gZWQuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpOw0KCQkJCQl9KTsNCg0KCQkJCQkvLyBSZXN0b3JlIG9uIGZvY3VzLCBzaW5jZSBpdCBtaWdodCBiZSBsb3N0DQoJCQkJCUV2ZW50LmFkZChuLCAnZm9jdXMnLCBmdW5jdGlvbigpIHsNCgkJCQkJCWVkLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhlZC5ib29rbWFyayk7DQoJCQkJCQllZC5ib29rbWFyayA9IG51bGw7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAoYy5oaWRlTWVudSkNCgkJCQllZC5vbk1vdXNlRG93bi5hZGQoYy5oaWRlTWVudSwgYyk7DQoNCgkJCXJldHVybiB0LmFkZChjKTsNCgkJfSwNCg0KCQkvKioNCgkJICogQ3JlYXRlcyBhIGJ1dHRvbiBjb250cm9sIGluc3RhbmNlIGJ5IGlkLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGNyZWF0ZUJ1dHRvbg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWQgVW5pcXVlIGlkIGZvciB0aGUgbmV3IGJ1dHRvbiBpbnN0YW5jZS4gRm9yIGV4YW1wbGUgImJvbGQiLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBjb250cm9sLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gY2MgT3B0aW9uYWwgY29udHJvbCBjbGFzcyB0byB1c2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvbmUuDQoJCSAqIEByZXR1cm4ge3RpbnltY2UudWkuQ29udHJvbH0gQ29udHJvbCBpbnN0YW5jZSB0aGF0IGdvdCBjcmVhdGVkIGFuZCBhZGRlZC4NCgkJICovDQoJCWNyZWF0ZUJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzLCBjYykgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBvLCBjLCBjbHM7DQoNCgkJCWlmICh0LmdldChpZCkpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCXMudGl0bGUgPSBlZC50cmFuc2xhdGUocy50aXRsZSk7DQoJCQlzLmxhYmVsID0gZWQudHJhbnNsYXRlKHMubGFiZWwpOw0KCQkJcy5zY29wZSA9IHMuc2NvcGUgfHwgZWQ7DQoNCgkJCWlmICghcy5vbmNsaWNrICYmICFzLm1lbnVfYnV0dG9uKSB7DQoJCQkJcy5vbmNsaWNrID0gZnVuY3Rpb24oKSB7DQoJCQkJCWVkLmV4ZWNDb21tYW5kKHMuY21kLCBzLnVpIHx8IGZhbHNlLCBzLnZhbHVlKTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQlzID0gZXh0ZW5kKHsNCgkJCQl0aXRsZSA6IHMudGl0bGUsDQoJCQkJJ2NsYXNzJyA6ICdtY2VfJyArIGlkLA0KCQkJCXVuYXZhaWxhYmxlX3ByZWZpeCA6IGVkLmdldExhbmcoJ3VuYXZhaWxhYmxlJywgJycpLA0KCQkJCXNjb3BlIDogcy5zY29wZSwNCgkJCQljb250cm9sX21hbmFnZXIgOiB0DQoJCQl9LCBzKTsNCg0KCQkJaWQgPSB0LnByZWZpeCArIGlkOw0KDQoJCQlpZiAocy5tZW51X2J1dHRvbikgew0KCQkJCWNscyA9IGNjIHx8IHQuX2Nscy5tZW51YnV0dG9uIHx8IHRpbnltY2UudWkuTWVudUJ1dHRvbjsNCgkJCQljID0gbmV3IGNscyhpZCwgcyk7DQoJCQkJZWQub25Nb3VzZURvd24uYWRkKGMuaGlkZU1lbnUsIGMpOw0KCQkJfSBlbHNlIHsNCgkJCQljbHMgPSB0Ll9jbHMuYnV0dG9uIHx8IHRpbnltY2UudWkuQnV0dG9uOw0KCQkJCWMgPSBuZXcgY2xzKGlkLCBzKTsNCgkJCX0NCg0KCQkJcmV0dXJuIHQuYWRkKGMpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDcmVhdGVzIGEgbWVudSBidXR0b24gY29udHJvbCBpbnN0YW5jZSBieSBpZC4NCgkJICoNCgkJICogQG1ldGhvZCBjcmVhdGVNZW51QnV0dG9uDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBpZCBVbmlxdWUgaWQgZm9yIHRoZSBuZXcgbWVudSBidXR0b24gaW5zdGFuY2UuIEZvciBleGFtcGxlICJtZW51MSIuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIHNldHRpbmdzIG9iamVjdCBmb3IgdGhlIGNvbnRyb2wuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBjYyBPcHRpb25hbCBjb250cm9sIGNsYXNzIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZS4NCgkJICogQHJldHVybiB7dGlueW1jZS51aS5Db250cm9sfSBDb250cm9sIGluc3RhbmNlIHRoYXQgZ290IGNyZWF0ZWQgYW5kIGFkZGVkLg0KCQkgKi8NCgkJY3JlYXRlTWVudUJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzLCBjYykgew0KCQkJcyA9IHMgfHwge307DQoJCQlzLm1lbnVfYnV0dG9uID0gMTsNCg0KCQkJcmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKGlkLCBzLCBjYyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENyZWF0ZXMgYSBzcGxpdCBidXR0b24gY29udHJvbCBpbnN0YW5jZSBieSBpZC4NCgkJICoNCgkJICogQG1ldGhvZCBjcmVhdGVTcGxpdEJ1dHRvbg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWQgVW5pcXVlIGlkIGZvciB0aGUgbmV3IHNwbGl0IGJ1dHRvbiBpbnN0YW5jZS4gRm9yIGV4YW1wbGUgInNwZWxsY2hlY2tlciIuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIHNldHRpbmdzIG9iamVjdCBmb3IgdGhlIGNvbnRyb2wuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBjYyBPcHRpb25hbCBjb250cm9sIGNsYXNzIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZS4NCgkJICogQHJldHVybiB7dGlueW1jZS51aS5Db250cm9sfSBDb250cm9sIGluc3RhbmNlIHRoYXQgZ290IGNyZWF0ZWQgYW5kIGFkZGVkLg0KCQkgKi8NCgkJY3JlYXRlU3BsaXRCdXR0b24gOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgY21kLCBjLCBjbHM7DQoNCgkJCWlmICh0LmdldChpZCkpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCXMudGl0bGUgPSBlZC50cmFuc2xhdGUocy50aXRsZSk7DQoJCQlzLnNjb3BlID0gcy5zY29wZSB8fCBlZDsNCg0KCQkJaWYgKCFzLm9uY2xpY2spIHsNCgkJCQlzLm9uY2xpY2sgPSBmdW5jdGlvbih2KSB7DQoJCQkJCWVkLmV4ZWNDb21tYW5kKHMuY21kLCBzLnVpIHx8IGZhbHNlLCB2IHx8IHMudmFsdWUpOw0KCQkJCX07DQoJCQl9DQoNCgkJCWlmICghcy5vbnNlbGVjdCkgew0KCQkJCXMub25zZWxlY3QgPSBmdW5jdGlvbih2KSB7DQoJCQkJCWVkLmV4ZWNDb21tYW5kKHMuY21kLCBzLnVpIHx8IGZhbHNlLCB2IHx8IHMudmFsdWUpOw0KCQkJCX07DQoJCQl9DQoNCgkJCXMgPSBleHRlbmQoew0KCQkJCXRpdGxlIDogcy50aXRsZSwNCgkJCQknY2xhc3MnIDogJ21jZV8nICsgaWQsDQoJCQkJc2NvcGUgOiBzLnNjb3BlLA0KCQkJCWNvbnRyb2xfbWFuYWdlciA6IHQNCgkJCX0sIHMpOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoJCQljbHMgPSBjYyB8fCB0Ll9jbHMuc3BsaXRidXR0b24gfHwgdGlueW1jZS51aS5TcGxpdEJ1dHRvbjsNCgkJCWMgPSB0LmFkZChuZXcgY2xzKGlkLCBzKSk7DQoJCQllZC5vbk1vdXNlRG93bi5hZGQoYy5oaWRlTWVudSwgYyk7DQoNCgkJCXJldHVybiBjOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDcmVhdGVzIGEgY29sb3Igc3BsaXQgYnV0dG9uIGNvbnRyb2wgaW5zdGFuY2UgYnkgaWQuDQoJCSAqDQoJCSAqIEBtZXRob2QgY3JlYXRlQ29sb3JTcGxpdEJ1dHRvbg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWQgVW5pcXVlIGlkIGZvciB0aGUgbmV3IGNvbG9yIHNwbGl0IGJ1dHRvbiBpbnN0YW5jZS4gRm9yIGV4YW1wbGUgImZvcmVjb2xvciIuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIHNldHRpbmdzIG9iamVjdCBmb3IgdGhlIGNvbnRyb2wuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBjYyBPcHRpb25hbCBjb250cm9sIGNsYXNzIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZS4NCgkJICogQHJldHVybiB7dGlueW1jZS51aS5Db250cm9sfSBDb250cm9sIGluc3RhbmNlIHRoYXQgZ290IGNyZWF0ZWQgYW5kIGFkZGVkLg0KCQkgKi8NCgkJY3JlYXRlQ29sb3JTcGxpdEJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzLCBjYykgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBjbWQsIGMsIGNscywgYm07DQoNCgkJCWlmICh0LmdldChpZCkpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCXMudGl0bGUgPSBlZC50cmFuc2xhdGUocy50aXRsZSk7DQoJCQlzLnNjb3BlID0gcy5zY29wZSB8fCBlZDsNCg0KCQkJaWYgKCFzLm9uY2xpY2spIHsNCgkJCQlzLm9uY2xpY2sgPSBmdW5jdGlvbih2KSB7DQoJCQkJCWlmICh0aW55bWNlLmlzSUUpDQoJCQkJCQlibSA9IGVkLnNlbGVjdGlvbi5nZXRCb29rbWFyaygxKTsNCg0KCQkJCQllZC5leGVjQ29tbWFuZChzLmNtZCwgcy51aSB8fCBmYWxzZSwgdiB8fCBzLnZhbHVlKTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQlpZiAoIXMub25zZWxlY3QpIHsNCgkJCQlzLm9uc2VsZWN0ID0gZnVuY3Rpb24odikgew0KCQkJCQllZC5leGVjQ29tbWFuZChzLmNtZCwgcy51aSB8fCBmYWxzZSwgdiB8fCBzLnZhbHVlKTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQlzID0gZXh0ZW5kKHsNCgkJCQl0aXRsZSA6IHMudGl0bGUsDQoJCQkJJ2NsYXNzJyA6ICdtY2VfJyArIGlkLA0KCQkJCSdtZW51X2NsYXNzJyA6IGVkLmdldFBhcmFtKCdza2luJykgKyAnU2tpbicsDQoJCQkJc2NvcGUgOiBzLnNjb3BlLA0KCQkJCW1vcmVfY29sb3JzX3RpdGxlIDogZWQuZ2V0TGFuZygnbW9yZV9jb2xvcnMnKQ0KCQkJfSwgcyk7DQoNCgkJCWlkID0gdC5wcmVmaXggKyBpZDsNCgkJCWNscyA9IGNjIHx8IHQuX2Nscy5jb2xvcnNwbGl0YnV0dG9uIHx8IHRpbnltY2UudWkuQ29sb3JTcGxpdEJ1dHRvbjsNCgkJCWMgPSBuZXcgY2xzKGlkLCBzKTsNCgkJCWVkLm9uTW91c2VEb3duLmFkZChjLmhpZGVNZW51LCBjKTsNCg0KCQkJLy8gUmVtb3ZlIHRoZSBtZW51IGVsZW1lbnQgd2hlbiB0aGUgZWRpdG9yIGlzIHJlbW92ZWQNCgkJCWVkLm9uUmVtb3ZlLmFkZChmdW5jdGlvbigpIHsNCgkJCQljLmRlc3Ryb3koKTsNCgkJCX0pOw0KDQoJCQkvLyBGaXggZm9yIGJ1ZyAjMTg5Nzc4NSwgIzE4OTgwMDcNCgkJCWlmICh0aW55bWNlLmlzSUUpIHsNCgkJCQljLm9uU2hvd01lbnUuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQkvLyBJRSA4IG5lZWRzIGZvY3VzIGluIG9yZGVyIHRvIHN0b3JlIGF3YXkgYSByYW5nZSB3aXRoIHRoZSBjdXJyZW50IGNvbGxhcHNlZCBjYXJldCBsb2NhdGlvbg0KCQkJCQllZC5mb2N1cygpOw0KCQkJCQlibSA9IGVkLnNlbGVjdGlvbi5nZXRCb29rbWFyaygxKTsNCgkJCQl9KTsNCg0KCQkJCWMub25IaWRlTWVudS5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCWlmIChibSkgew0KCQkJCQkJZWQuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJtKTsNCgkJCQkJCWJtID0gMDsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlyZXR1cm4gdC5hZGQoYyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENyZWF0ZXMgYSB0b29sYmFyIGNvbnRhaW5lciBjb250cm9sIGluc3RhbmNlIGJ5IGlkLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGNyZWF0ZVRvb2xiYXINCgkJICogQHBhcmFtIHtTdHJpbmd9IGlkIFVuaXF1ZSBpZCBmb3IgdGhlIG5ldyB0b29sYmFyIGNvbnRhaW5lciBjb250cm9sIGluc3RhbmNlLiBGb3IgZXhhbXBsZSAidG9vbGJhcjEiLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBjb250cm9sLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gY2MgT3B0aW9uYWwgY29udHJvbCBjbGFzcyB0byB1c2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvbmUuDQoJCSAqIEByZXR1cm4ge3RpbnltY2UudWkuQ29udHJvbH0gQ29udHJvbCBpbnN0YW5jZSB0aGF0IGdvdCBjcmVhdGVkIGFuZCBhZGRlZC4NCgkJICovDQoJCWNyZWF0ZVRvb2xiYXIgOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciBjLCB0ID0gdGhpcywgY2xzOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoJCQljbHMgPSBjYyB8fCB0Ll9jbHMudG9vbGJhciB8fCB0aW55bWNlLnVpLlRvb2xiYXI7DQoJCQljID0gbmV3IGNscyhpZCwgcyk7DQoNCgkJCWlmICh0LmdldChpZCkpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCXJldHVybiB0LmFkZChjKTsNCgkJfSwNCg0KCQkvKioNCgkJICogQ3JlYXRlcyBhIHNlcGFyYXRvciBjb250cm9sIGluc3RhbmNlLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGNyZWF0ZVNlcGFyYXRvcg0KCQkgKiBAcGFyYW0ge09iamVjdH0gY2MgT3B0aW9uYWwgY29udHJvbCBjbGFzcyB0byB1c2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvbmUuDQoJCSAqIEByZXR1cm4ge3RpbnltY2UudWkuQ29udHJvbH0gQ29udHJvbCBpbnN0YW5jZSB0aGF0IGdvdCBjcmVhdGVkIGFuZCBhZGRlZC4NCgkJICovDQoJCWNyZWF0ZVNlcGFyYXRvciA6IGZ1bmN0aW9uKGNjKSB7DQoJCQl2YXIgY2xzID0gY2MgfHwgdGhpcy5fY2xzLnNlcGFyYXRvciB8fCB0aW55bWNlLnVpLlNlcGFyYXRvcjsNCg0KCQkJcmV0dXJuIG5ldyBjbHMoKTsNCgkJfSwNCg0KCQkvKioNCgkJICogT3ZlcnJpZGVzIGEgc3BlY2lmaWMgY29udHJvbCB0eXBlIHdpdGggYSBjdXN0b20gY2xhc3MuDQoJCSAqDQoJCSAqIEBtZXRob2Qgc2V0Q29udHJvbFR5cGUNCgkJICogQHBhcmFtIHtzdHJpbmd9IG4gTmFtZSBvZiB0aGUgY29udHJvbCB0byBvdmVycmlkZSBmb3IgZXhhbXBsZSBidXR0b24gb3IgZHJvcG1lbnUuDQoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGMgQ2xhc3MgcmVmZXJlbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZS4NCgkJICogQHJldHVybiB7ZnVuY3Rpb259IFNhbWUgYXMgdGhlIGNsYXNzIHJlZmVyZW5jZS4NCgkJICovDQoJCXNldENvbnRyb2xUeXBlIDogZnVuY3Rpb24obiwgYykgew0KCQkJcmV0dXJuIHRoaXMuX2Nsc1tuLnRvTG93ZXJDYXNlKCldID0gYzsNCgkJfSwNCgkNCgkJLyoqDQoJCSAqIERlc3Ryb3kuDQoJCSAqDQoJCSAqIEBtZXRob2QgZGVzdHJveQ0KCQkgKi8NCgkJZGVzdHJveSA6IGZ1bmN0aW9uKCkgew0KCQkJZWFjaCh0aGlzLmNvbnRyb2xzLCBmdW5jdGlvbihjKSB7DQoJCQkJYy5kZXN0cm95KCk7DQoJCQl9KTsNCg0KCQkJdGhpcy5jb250cm9scyA9IG51bGw7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/Developer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBEZXZlbG9wZXIuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24oKSB7DQoJdmFyIEVkaXRvck1hbmFnZXIgPSB0aW55bWNlLkVkaXRvck1hbmFnZXIsIGVhY2ggPSB0aW55bWNlLmVhY2gsIERPTSA9IHRpbnltY2UuRE9NOw0KDQoJLyoqDQoJICogVGhpcyBjbGFzcyBwYXRjaGVzIGluIHZhcmlvdXMgZGV2ZWxvcG1lbnQgZmVhdHVyZXMuIFRoaXMgY2xhc3MgaXMgb25seSBhdmFpbGFibGUgZm9yIHRoZSBkZXYgdmVyc2lvbiBvZiBUaW55TUNFLg0KCSAqLw0KCXRpbnltY2UuY3JlYXRlKCdzdGF0aWMgdGlueW1jZS5EZXZlbG9wZXInLCB7DQoJCV9waWdneUJhY2sgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZW0gPSB0aW55bWNlLkVkaXRvck1hbmFnZXIsIGxvID0gZmFsc2U7DQoNCgkJCS8vIE1ha2VzIHN1cmUgdGhhdCBYTUwgbGFuZ3VhZ2UgcGFjayBpcyB1c2VkIGluc3RlYWQgb2YgSlMgZmlsZXMNCgkJCXQuX3J1bkJlZm9yZShlbSwgJ2luaXQnLCBmdW5jdGlvbihzKSB7DQoJCQkJdmFyIHBhciA9IG5ldyB0aW55bWNlLnhtbC5QYXJzZXIoe2FzeW5jIDogZmFsc2V9KSwgbG5nID0gcy5sYW5ndWFnZSB8fCAiZW4iLCBpMThuID0gdGlueW1jZS5FZGl0b3JNYW5hZ2VyLmkxOG4sIHNsID0gdGlueW1jZS5TY3JpcHRMb2FkZXI7DQoNCgkJCQlpZiAoIXMudHJhbnNsYXRlX21vZGUpDQoJCQkJCXJldHVybjsNCg0KCQkJCWlmIChsbykNCgkJCQkJcmV0dXJuOw0KDQoJCQkJbG8gPSB0cnVlOw0KDQoJCQkJLy8gQ29tbW9uIGxhbmd1YWdlIGxvYWRlZA0KCQkJCXNsLm1hcmtEb25lKHRpbnltY2UuYmFzZVVSTCArICcvbGFuZ3MvJyArIGxuZyArICcuanMnKTsNCg0KCQkJCS8vIFRoZW1lIGxhbmd1YWdlcyBsb2FkZWQNCgkJCQlzbC5tYXJrRG9uZSh0aW55bWNlLmJhc2VVUkwgKyAnL3RoZW1lcy9zaW1wbGUvbGFuZ3MvJyArIGxuZyArICcuanMnKTsNCgkJCQlzbC5tYXJrRG9uZSh0aW55bWNlLmJhc2VVUkwgKyAnL3RoZW1lcy9hZHZhbmNlZC9sYW5ncy8nICsgbG5nICsgJy5qcycpOw0KDQoJCQkJLy8gQWxsIHBsdWdpbiBwYWNrcyBsb2FkZWQNCgkJCQllYWNoKHMucGx1Z2lucy5zcGxpdCgnLCcpLCBmdW5jdGlvbihwKSB7DQoJCQkJCXNsLm1hcmtEb25lKHRpbnltY2UuYmFzZVVSTCArICcvcGx1Z2lucy8nICsgcCArICcvbGFuZ3MvJyArIGxuZyArICcuanMnKTsNCgkJCQl9KTsNCg0KCQkJCS8vIExvYWQgWE1MIGxhbmd1YWdlIHBhY2sNCgkJCQlwYXIubG9hZCh0aW55bWNlLmJhc2VVUkwgKyAnL2xhbmdzLycgKyBsbmcgKyAnLnhtbCcsIGZ1bmN0aW9uKGRvYywgZXgpIHsNCgkJCQkJdmFyIGM7DQoNCgkJCQkJaWYgKCFkb2MpIHsNCgkJCQkJCWFsZXJ0KGV4Lm1lc3NhZ2UpOw0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoNCgkJCQkJaWYgKGRvYy5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgPT0gJ3BhcnNlcmVycm9yJykgew0KCQkJCQkJYWxlcnQoJ1BhcnNlIGVycm9yISEnKTsNCgkJCQkJCXJldHVybjsNCgkJCQkJfQ0KDQoJCQkJCWMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xhbmd1YWdlJylbMF0uZ2V0QXR0cmlidXRlKCJjb2RlIik7DQoNCgkJCQkJZWFjaChkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2dyb3VwJyksIGZ1bmN0aW9uKGcpIHsNCgkJCQkJCXZhciBnbiA9IGcuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSwgbyA9IHt9Ow0KDQoJCQkJCQkvLyBCdWlsZCBvYmplY3QgZnJvbSBYTUwgaXRlbXMNCgkJCQkJCWVhY2goZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaXRlbScpLCBmdW5jdGlvbihpdCkgew0KCQkJCQkJCXZhciBpdG4gPSBpdC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsNCg0KCQkJCQkJCWlmIChnbiA9PSAiY29tbW9uIikNCgkJCQkJCQkJaTE4bltjICsgJy4nICsgaXRuXSA9IHBhci5nZXRUZXh0KGl0KTsNCgkJCQkJCQllbHNlDQoJCQkJCQkJCWkxOG5bYyArICcuJyArIGduICsgIi4iICsgaXRuXSA9IHBhci5nZXRUZXh0KGl0KTsNCgkJCQkJCX0pOw0KCQkJCQl9KTsNCgkJCQl9LCB7DQoJCQkJCWFzeW5jIDogZmFsc2UNCgkJCQl9KTsNCgkJCX0pOw0KCQl9LA0KDQoJCV9ydW5CZWZvcmUgOiBmdW5jdGlvbihvLCBuLCBmKSB7DQoJCQl2YXIgZSA9IG9bbl07DQoNCgkJCW9bbl0gPSBmdW5jdGlvbigpIHsNCgkJCQl2YXIgcyA9IGYuYXBwbHkobywgYXJndW1lbnRzKTsNCg0KCQkJCWlmIChzICE9PSBmYWxzZSkNCgkJCQkJcmV0dXJuIGUuYXBwbHkobywgYXJndW1lbnRzKTsNCgkJCX07DQoJCX0NCgl9KTsNCg0KCXRpbnltY2UuRGV2ZWxvcGVyLl9waWdneUJhY2soKTsNCn0pKCk7DQoNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/DOMUtils.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBET01VdGlscy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBlYWNoID0gdGlueW1jZS5lYWNoLA0KCQlpcyA9IHRpbnltY2UuaXMsDQoJCWlzV2ViS2l0ID0gdGlueW1jZS5pc1dlYktpdCwNCgkJaXNJRSA9IHRpbnltY2UuaXNJRSwNCgkJYmxvY2tSZSA9IC9eKEhbMS02Ul18UHxESVZ8QUREUkVTU3xQUkV8Rk9STXxUKEFCTEV8Qk9EWXxIRUFEfEZPT1R8SHxSfEQpfExJfE9MfFVMfENBUFRJT058QkxPQ0tRVU9URXxDRU5URVJ8REx8RFR8RER8RElSfEZJRUxEU0VUfE5PU0NSSVBUfE1FTlV8SVNJTkRFWHxTQU1QKSQvLA0KCQlib29sQXR0cnMgPSBtYWtlTWFwKCdjaGVja2VkLGNvbXBhY3QsZGVjbGFyZSxkZWZlcixkaXNhYmxlZCxpc21hcCxtdWx0aXBsZSxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3dyYXAscmVhZG9ubHksc2VsZWN0ZWQnKSwNCgkJbWNlQXR0cmlicyA9IG1ha2VNYXAoJ3NyYyxocmVmLHN0eWxlLGNvb3JkcyxzaGFwZScpLA0KCQllbmNvZGVkQ2hhcnMgPSB7JyYnIDogJyZhbXA7JywgJyInIDogJyZxdW90OycsICc8JyA6ICcmbHQ7JywgJz4nIDogJyZndDsnfSwNCgkJZW5jb2RlQ2hhcnNSZSA9IC9bPD4mXCJdL2csDQoJCXNpbXBsZVNlbGVjdG9yUmUgPSAvXihbYS16MC05XSw/KSskL2ksDQoJCXRhZ1JlZ0V4cCA9IC88KFx3KykoKD86XHMrXHcrKD86XHMqPVxzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKikoXHMqXC8/KT4vZywNCgkJYXR0clJlZ0V4cCA9IC8oXHcrKSg/OlxzKj1ccyooPzooPzoiKCg/OlxcLnxbXiJdKSopIil8KD86JygoPzpcXC58W14nXSkqKScpfChbXj5cc10rKSkpPy9nOw0KDQoJZnVuY3Rpb24gbWFrZU1hcChzdHIpIHsNCgkJdmFyIG1hcCA9IHt9LCBpOw0KDQoJCXN0ciA9IHN0ci5zcGxpdCgnLCcpOw0KCQlmb3IgKGkgPSBzdHIubGVuZ3RoOyBpID49IDA7IGktLSkNCgkJCW1hcFtzdHJbaV1dID0gMTsNCg0KCQlyZXR1cm4gbWFwOw0KCX07DQoNCgkvKioNCgkgKiBVdGlsaXR5IGNsYXNzIGZvciB2YXJpb3VzIERPTSBtYW5pcHVsYXRpb24gYW5kIHJldHJpdmFsIGZ1bmN0aW9ucy4NCgkgKiBAY2xhc3MgdGlueW1jZS5kb20uRE9NVXRpbHMNCgkgKi8NCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5kb20uRE9NVXRpbHMnLCB7DQoJCWRvYyA6IG51bGwsDQoJCXJvb3QgOiBudWxsLA0KCQlmaWxlcyA6IG51bGwsDQoJCXBpeGVsU3R5bGVzIDogL14odG9wfGxlZnR8Ym90dG9tfHJpZ2h0fHdpZHRofGhlaWdodHxib3JkZXJXaWR0aCkkLywNCgkJcHJvcHMgOiB7DQoJCQkiZm9yIiA6ICJodG1sRm9yIiwNCgkJCSJjbGFzcyIgOiAiY2xhc3NOYW1lIiwNCgkJCWNsYXNzTmFtZSA6ICJjbGFzc05hbWUiLA0KCQkJY2hlY2tlZCA6ICJjaGVja2VkIiwNCgkJCWRpc2FibGVkIDogImRpc2FibGVkIiwNCgkJCW1heGxlbmd0aCA6ICJtYXhMZW5ndGgiLA0KCQkJcmVhZG9ubHkgOiAicmVhZE9ubHkiLA0KCQkJc2VsZWN0ZWQgOiAic2VsZWN0ZWQiLA0KCQkJdmFsdWUgOiAidmFsdWUiLA0KCQkJaWQgOiAiaWQiLA0KCQkJbmFtZSA6ICJuYW1lIiwNCgkJCXR5cGUgOiAidHlwZSINCgkJfSwNCg0KCQkvKioNCgkJICogQ29uc3RydWN0cyBhIG5ldyBET01VdGlscyBpbnN0YW5jZS4gQ29uc3VsdCB0aGUgV2lraSBmb3IgbW9yZSBkZXRhaWxzIG9uIHNldHRpbmdzIGV0YyBmb3IgdGhpcyBjbGFzcy4NCgkJICoNCgkJICogQGNvbnN0cnVjdG9yDQoJCSAqIEBtZXRob2QgRE9NVXRpbHMNCgkJICogQHBhcmFtIHtEb2N1bWVudH0gZCBEb2N1bWVudCByZWZlcmVuY2UgdG8gYmluZCB0aGUgdXRpbGl0eSBjbGFzcyB0by4NCgkJICogQHBhcmFtIHtzZXR0aW5nc30gcyBPcHRpb25hbCBzZXR0aW5ncyBjb2xsZWN0aW9uLg0KCQkgKi8NCgkJRE9NVXRpbHMgOiBmdW5jdGlvbihkLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGdsb2JhbFN0eWxlOw0KDQoJCQl0LmRvYyA9IGQ7DQoJCQl0LndpbiA9IHdpbmRvdzsNCgkJCXQuZmlsZXMgPSB7fTsNCgkJCXQuY3NzRmxpY2tlciA9IGZhbHNlOw0KCQkJdC5jb3VudGVyID0gMDsNCgkJCXQuc3RkTW9kZSA9IGQuZG9jdW1lbnRNb2RlID49IDg7DQoJCQl0LmJveE1vZGVsID0gIXRpbnltY2UuaXNJRSB8fCBkLmNvbXBhdE1vZGUgPT0gIkNTUzFDb21wYXQiIHx8IHQuc3RkTW9kZTsNCg0KCQkJdC5zZXR0aW5ncyA9IHMgPSB0aW55bWNlLmV4dGVuZCh7DQoJCQkJa2VlcF92YWx1ZXMgOiBmYWxzZSwNCgkJCQloZXhfY29sb3JzIDogMSwNCgkJCQlwcm9jZXNzX2h0bWwgOiAxDQoJCQl9LCBzKTsNCg0KCQkJLy8gRml4IElFNlNQMiBmbGlja2VyIGFuZCBjaGVjayBpdCBmYWlsZWQgZm9yIHByZSBTUDINCgkJCWlmICh0aW55bWNlLmlzSUU2KSB7DQoJCQkJdHJ5IHsNCgkJCQkJZC5leGVjQ29tbWFuZCgnQmFja2dyb3VuZEltYWdlQ2FjaGUnLCBmYWxzZSwgdHJ1ZSk7DQoJCQkJfSBjYXRjaCAoZSkgew0KCQkJCQl0LmNzc0ZsaWNrZXIgPSB0cnVlOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gQnVpbGQgc3R5bGVzIGxpc3QNCgkJCWlmIChzLnZhbGlkX3N0eWxlcykgew0KCQkJCXQuX3N0eWxlcyA9IHt9Ow0KDQoJCQkJLy8gQ29udmVydCBzdHlsZXMgaW50byBhIHJ1bGUgbGlzdA0KCQkJCWVhY2gocy52YWxpZF9zdHlsZXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsNCgkJCQkJdC5fc3R5bGVzW2tleV0gPSB0aW55bWNlLmV4cGxvZGUodmFsdWUpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQl0aW55bWNlLmFkZFVubG9hZCh0LmRlc3Ryb3ksIHQpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhlIGRvY3VtZW50IHRoaXMgaXMgbm9ybWFsbHkgdGhlIGJvZHkgYnV0IG1pZ2h0IGJlIGEgRElWLiBQYXJlbnRzIGxpa2UgZ2V0UGFyZW50IHdpbGwgbm90DQoJCSAqIGdvIGFib3ZlIHRoZSBwb2ludCBvZiB0aGlzIHJvb3Qgbm9kZS4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRSb290DQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IFJvb3QgZWxlbWVudCBmb3IgdGhlIHV0aWxpdHkgY2xhc3MuDQoJCSAqLw0KCQlnZXRSb290IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzOw0KDQoJCQlyZXR1cm4gKHMgJiYgdC5nZXQocy5yb290X2VsZW1lbnQpKSB8fCB0LmRvYy5ib2R5Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRoZSB2aWV3cG9ydCBvZiB0aGUgd2luZG93Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldFZpZXdQb3J0DQoJCSAqIEBwYXJhbSB7V2luZG93fSB3IE9wdGlvbmFsIHdpbmRvdyB0byBnZXQgdmlld3BvcnQgb2YuDQoJCSAqIEByZXR1cm4ge09iamVjdH0gVmlld3BvcnQgb2JqZWN0IHdpdGggZmllbGRzIHgsIHksIHcgYW5kIGguDQoJCSAqLw0KCQlnZXRWaWV3UG9ydCA6IGZ1bmN0aW9uKHcpIHsNCgkJCXZhciBkLCBiOw0KDQoJCQl3ID0gIXcgPyB0aGlzLndpbiA6IHc7DQoJCQlkID0gdy5kb2N1bWVudDsNCgkJCWIgPSB0aGlzLmJveE1vZGVsID8gZC5kb2N1bWVudEVsZW1lbnQgOiBkLmJvZHk7DQoNCgkJCS8vIFJldHVybnMgdmlld3BvcnQgc2l6ZSBleGNsdWRpbmcgc2Nyb2xsYmFycw0KCQkJcmV0dXJuIHsNCgkJCQl4IDogdy5wYWdlWE9mZnNldCB8fCBiLnNjcm9sbExlZnQsDQoJCQkJeSA6IHcucGFnZVlPZmZzZXQgfHwgYi5zY3JvbGxUb3AsDQoJCQkJdyA6IHcuaW5uZXJXaWR0aCB8fCBiLmNsaWVudFdpZHRoLA0KCQkJCWggOiB3LmlubmVySGVpZ2h0IHx8IGIuY2xpZW50SGVpZ2h0DQoJCQl9Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRoZSByZWN0YW5nbGUgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRSZWN0DQoJCSAqIEBwYXJhbSB7RWxlbWVudC9TdHJpbmd9IGUgRWxlbWVudCBvYmplY3Qgb3IgZWxlbWVudCBJRCB0byBnZXQgcmVjdGFuZ2UgZnJvbS4NCgkJICogQHJldHVybiB7b2JqZWN0fSBSZWN0YW5nZSBmb3Igc3BlY2lmaWVkIGVsZW1lbnQgb2JqZWN0IHdpdGggeCwgeSwgdywgaCBmaWVsZHMuDQoJCSAqLw0KCQlnZXRSZWN0IDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHAsIHQgPSB0aGlzLCBzcjsNCg0KCQkJZSA9IHQuZ2V0KGUpOw0KCQkJcCA9IHQuZ2V0UG9zKGUpOw0KCQkJc3IgPSB0LmdldFNpemUoZSk7DQoNCgkJCXJldHVybiB7DQoJCQkJeCA6IHAueCwNCgkJCQl5IDogcC55LA0KCQkJCXcgOiBzci53LA0KCQkJCWggOiBzci5oDQoJCQl9Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRoZSBzaXplIGRpbWVuc2lvbnMgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldFNpemUNCgkJICogQHBhcmFtIHtFbGVtZW50L1N0cmluZ30gZSBFbGVtZW50IG9iamVjdCBvciBlbGVtZW50IElEIHRvIGdldCByZWN0YW5nZSBmcm9tLg0KCQkgKiBAcmV0dXJuIHtvYmplY3R9IFJlY3RhbmdlIGZvciBzcGVjaWZpZWQgZWxlbWVudCBvYmplY3Qgd2l0aCB3LCBoIGZpZWxkcy4NCgkJICovDQoJCWdldFNpemUgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHcsIGg7DQoNCgkJCWUgPSB0LmdldChlKTsNCgkJCXcgPSB0LmdldFN0eWxlKGUsICd3aWR0aCcpOw0KCQkJaCA9IHQuZ2V0U3R5bGUoZSwgJ2hlaWdodCcpOw0KDQoJCQkvLyBOb24gcGl4ZWwgdmFsdWUsIHRoZW4gZm9yY2Ugb2Zmc2V0L2NsaWVudFdpZHRoDQoJCQlpZiAody5pbmRleE9mKCdweCcpID09PSAtMSkNCgkJCQl3ID0gMDsNCg0KCQkJLy8gTm9uIHBpeGVsIHZhbHVlLCB0aGVuIGZvcmNlIG9mZnNldC9jbGllbnRXaWR0aA0KCQkJaWYgKGguaW5kZXhPZigncHgnKSA9PT0gLTEpDQoJCQkJaCA9IDA7DQoNCgkJCXJldHVybiB7DQoJCQkJdyA6IHBhcnNlSW50KHcpIHx8IGUub2Zmc2V0V2lkdGggfHwgZS5jbGllbnRXaWR0aCwNCgkJCQloIDogcGFyc2VJbnQoaCkgfHwgZS5vZmZzZXRIZWlnaHQgfHwgZS5jbGllbnRIZWlnaHQNCgkJCX07DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgYSBub2RlIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbA0KCQkgKiBsb29wIHRocm91Z2ggYWxsIHBhcmVudCBub2RlcyBhbmQgY2FsbCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGZvciBlYWNoIG5vZGUuDQoJCSAqIElmIHRoZSBmdW5jdGlvbiB0aGVuIHJldHVybnMgdHJ1ZSBpbmRpY2F0aW5nIHRoYXQgaXQgaGFzIGZvdW5kIHdoYXQgaXQgd2FzIGxvb2tpbmcgZm9yLCB0aGUgbG9vcCBleGVjdXRpb24gd2lsbCB0aGVuIGVuZA0KCQkgKiBhbmQgdGhlIG5vZGUgaXQgZm91bmQgd2lsbCBiZSByZXR1cm5lZC4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRQYXJlbnQNCgkJICogQHBhcmFtIHtOb2RlL1N0cmluZ30gbiBET00gbm9kZSB0byBzZWFyY2ggcGFyZW50cyBvbiBvciBJRCBzdHJpbmcuDQoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGYgU2VsZWN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBub2RlIG9yIENTUyBwYXR0ZXJuLg0KCQkgKiBAcGFyYW0ge05vZGV9IHIgT3B0aW9uYWwgcm9vdCBlbGVtZW50LCBuZXZlciBnbyBiZWxvdyB0aGlzIHBvaW50Lg0KCQkgKiBAcmV0dXJuIHtOb2RlfSBET00gTm9kZSBvciBudWxsIGlmIGl0IHdhc24ndCBmb3VuZC4NCgkJICovDQoJCWdldFBhcmVudCA6IGZ1bmN0aW9uKG4sIGYsIHIpIHsNCgkJCXJldHVybiB0aGlzLmdldFBhcmVudHMobiwgZiwgciwgZmFsc2UpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIGEgbm9kZSBsaXN0IG9mIGFsbCBwYXJlbnRzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IgZnVuY3Rpb24gb3IgcGF0dGVybi4NCgkJICogSWYgdGhlIGZ1bmN0aW9uIHRoZW4gcmV0dXJucyB0cnVlIGluZGljYXRpbmcgdGhhdCBpdCBoYXMgZm91bmQgd2hhdCBpdCB3YXMgbG9va2luZyBmb3IgYW5kIHRoYXQgbm9kZSB3aWxsIGJlIGNvbGxlY3RlZC4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRQYXJlbnRzDQoJCSAqIEBwYXJhbSB7Tm9kZS9TdHJpbmd9IG4gRE9NIG5vZGUgdG8gc2VhcmNoIHBhcmVudHMgb24gb3IgSUQgc3RyaW5nLg0KCQkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmIFNlbGVjdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlIG9uIGVhY2ggbm9kZSBvciBDU1MgcGF0dGVybi4NCgkJICogQHBhcmFtIHtOb2RlfSByIE9wdGlvbmFsIHJvb3QgZWxlbWVudCwgbmV2ZXIgZ28gYmVsb3cgdGhpcyBwb2ludC4NCgkJICogQHJldHVybiB7QXJyYXl9IEFycmF5IG9mIG5vZGVzIG9yIG51bGwgaWYgaXQgd2Fzbid0IGZvdW5kLg0KCQkgKi8NCgkJZ2V0UGFyZW50cyA6IGZ1bmN0aW9uKG4sIGYsIHIsIGMpIHsNCgkJCXZhciB0ID0gdGhpcywgbmEsIHNlID0gdC5zZXR0aW5ncywgbyA9IFtdOw0KDQoJCQluID0gdC5nZXQobik7DQoJCQljID0gYyA9PT0gdW5kZWZpbmVkOw0KDQoJCQlpZiAoc2Uuc3RyaWN0X3Jvb3QpDQoJCQkJciA9IHIgfHwgdC5nZXRSb290KCk7DQoNCgkJCS8vIFdyYXAgbm9kZSBuYW1lIGFzIGZ1bmMNCgkJCWlmIChpcyhmLCAnc3RyaW5nJykpIHsNCgkJCQluYSA9IGY7DQoNCgkJCQlpZiAoZiA9PT0gJyonKSB7DQoJCQkJCWYgPSBmdW5jdGlvbihuKSB7cmV0dXJuIG4ubm9kZVR5cGUgPT0gMTt9Ow0KCQkJCX0gZWxzZSB7DQoJCQkJCWYgPSBmdW5jdGlvbihuKSB7DQoJCQkJCQlyZXR1cm4gdC5pcyhuLCBuYSk7DQoJCQkJCX07DQoJCQkJfQ0KCQkJfQ0KDQoJCQl3aGlsZSAobikgew0KCQkJCWlmIChuID09IHIgfHwgIW4ubm9kZVR5cGUgfHwgbi5ub2RlVHlwZSA9PT0gOSkNCgkJCQkJYnJlYWs7DQoNCgkJCQlpZiAoIWYgfHwgZihuKSkgew0KCQkJCQlpZiAoYykNCgkJCQkJCW8ucHVzaChuKTsNCgkJCQkJZWxzZQ0KCQkJCQkJcmV0dXJuIG47DQoJCQkJfQ0KDQoJCQkJbiA9IG4ucGFyZW50Tm9kZTsNCgkJCX0NCg0KCQkJcmV0dXJuIGMgPyBvIDogbnVsbDsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYnkgSUQgb3IgdGhlIGlucHV0IGVsZW1lbnQgaWYgaXQgaXNuJ3QgYSBzdHJpbmcuDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0DQoJCSAqIEBwYXJhbSB7U3RyaW5nL0VsZW1lbnR9IG4gRWxlbWVudCBpZCB0byBsb29rIGZvciBvciBlbGVtZW50IHRvIGp1c3QgcGFzcyB0aG91Z2guDQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IEVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBpZCBvciBudWxsIGlmIGl0IHdhc24ndCBmb3VuZC4NCgkJICovDQoJCWdldCA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciBuOw0KDQoJCQlpZiAoZSAmJiB0aGlzLmRvYyAmJiB0eXBlb2YoZSkgPT0gJ3N0cmluZycpIHsNCgkJCQluID0gZTsNCgkJCQllID0gdGhpcy5kb2MuZ2V0RWxlbWVudEJ5SWQoZSk7DQoNCgkJCQkvLyBJRSBhbmQgT3BlcmEgcmV0dXJucyBtZXRhIGVsZW1lbnRzIHdoZW4gdGhleSBtYXRjaCB0aGUgc3BlY2lmaWVkIGlucHV0IElELCBidXQgZ2V0RWxlbWVudHNCeU5hbWUgc2VlbXMgdG8gZG8gdGhlIHRyaWNrDQoJCQkJaWYgKGUgJiYgZS5pZCAhPT0gbikNCgkJCQkJcmV0dXJuIHRoaXMuZG9jLmdldEVsZW1lbnRzQnlOYW1lKG4pWzFdOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0aGUgbmV4dCBub2RlIHRoYXQgbWF0Y2hlcyBzZWxlY3RvciBvciBmdW5jdGlvbg0KCQkgKg0KCQkgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBmaW5kIHNpYmxpbmdzIGZyb20uDQoJCSAqIEBwYXJhbSB7U3RyaW5nL2Z1bmN0aW9ufSBzZWxlY3RvciBTZWxlY3RvciBDU1MgZXhwcmVzc2lvbiBvciBmdW5jdGlvbi4NCgkJICogQHJldHVybiB7Tm9kZX0gTmV4dCBub2RlIGl0ZW0gbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIG9yIG51bGwgaWYgaXQgd2Fzbid0IGZvdW5kLg0KCQkgKi8NCgkJZ2V0TmV4dCA6IGZ1bmN0aW9uKG5vZGUsIHNlbGVjdG9yKSB7DQoJCQlyZXR1cm4gdGhpcy5fZmluZFNpYihub2RlLCBzZWxlY3RvciwgJ25leHRTaWJsaW5nJyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdGhlIHByZXZpb3VzIG5vZGUgdGhhdCBtYXRjaGVzIHNlbGVjdG9yIG9yIGZ1bmN0aW9uDQoJCSAqDQoJCSAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIGZpbmQgc2libGluZ3MgZnJvbS4NCgkJICogQHBhcmFtIHtTdHJpbmcvZnVuY3Rpb259IHNlbGVjdG9yIFNlbGVjdG9yIENTUyBleHByZXNzaW9uIG9yIGZ1bmN0aW9uLg0KCQkgKiBAcmV0dXJuIHtOb2RlfSBQcmV2aW91cyBub2RlIGl0ZW0gbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIG9yIG51bGwgaWYgaXQgd2Fzbid0IGZvdW5kLg0KCQkgKi8NCgkJZ2V0UHJldiA6IGZ1bmN0aW9uKG5vZGUsIHNlbGVjdG9yKSB7DQoJCQlyZXR1cm4gdGhpcy5fZmluZFNpYihub2RlLCBzZWxlY3RvciwgJ3ByZXZpb3VzU2libGluZycpOw0KCQl9LA0KDQoJCS8vICNpZm5kZWYganF1ZXJ5DQoNCgkJLyoqDQoJCSAqIFNlbGVjdHMgc3BlY2lmaWMgZWxlbWVudHMgYnkgYSBDU1MgbGV2ZWwgMyBwYXR0ZXJuLiBGb3IgZXhhbXBsZSAiZGl2I2ExIHAudGVzdCIuDQoJCSAqIFRoaXMgZnVuY3Rpb24gaXMgb3B0aW1pemVkIGZvciB0aGUgbW9zdCBjb21tb24gcGF0dGVybnMgbmVlZGVkIGluIFRpbnlNQ0UgYnV0IGl0IGFsc28gcGVyZm9ybWVzIGdvb2QgZW5vdWdoDQoJCSAqIG9uIG1vcmUgY29tcGxleCBwYXR0ZXJucy4NCgkJICoNCgkJICogQG1ldGhvZCBzZWxlY3QNCgkJICogQHBhcmFtIHtTdHJpbmd9IHAgQ1NTIGxldmVsIDEgcGF0dGVybiB0byBzZWxlY3QvZmluZCBlbGVtZW50cyBieS4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgcm9vdCBlbGVtZW50L3Njb3BlIGVsZW1lbnQgdG8gc2VhcmNoIGluLg0KCQkgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgd2l0aCBhbGwgbWF0Y2hlZCBlbGVtZW50cy4NCgkJICovDQoJCXNlbGVjdCA6IGZ1bmN0aW9uKHBhLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXJldHVybiB0aW55bWNlLmRvbS5TaXp6bGUocGEsIHQuZ2V0KHMpIHx8IHQuZ2V0KHQuc2V0dGluZ3Mucm9vdF9lbGVtZW50KSB8fCB0LmRvYywgW10pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRydWUvZmFsc2UgaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBjc3MgcGF0dGVybi4NCgkJICoNCgkJICogQG1ldGhvZCBpcw0KCQkgKiBAcGFyYW0ge05vZGUvTm9kZUxpc3R9IG4gRE9NIG5vZGUgdG8gbWF0Y2ggb3IgYW4gYXJyYXkgb2Ygbm9kZXMgdG8gbWF0Y2guDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBDU1MgcGF0dGVybiB0byBtYXRjaCB0aGUgZWxlbWVudCBhZ2FpbnMuDQoJCSAqLw0KCQlpcyA6IGZ1bmN0aW9uKG4sIHNlbGVjdG9yKSB7DQoJCQl2YXIgaTsNCg0KCQkJLy8gSWYgaXQgaXNuJ3QgYW4gYXJyYXkgdGhlbiB0cnkgdG8gZG8gc29tZSBzaW1wbGUgc2VsZWN0b3JzIGluc3RlYWQgb2YgU2l6emxlIGZvciB0byBib29zdCBwZXJmb3JtYW5jZQ0KCQkJaWYgKG4ubGVuZ3RoID09PSB1bmRlZmluZWQpIHsNCgkJCQkvLyBTaW1wbGUgYWxsIHNlbGVjdG9yDQoJCQkJaWYgKHNlbGVjdG9yID09PSAnKicpDQoJCQkJCXJldHVybiBuLm5vZGVUeXBlID09IDE7DQoNCgkJCQkvLyBTaW1wbGUgc2VsZWN0b3IganVzdCBlbGVtZW50cw0KCQkJCWlmIChzaW1wbGVTZWxlY3RvclJlLnRlc3Qoc2VsZWN0b3IpKSB7DQoJCQkJCXNlbGVjdG9yID0gc2VsZWN0b3IudG9Mb3dlckNhc2UoKS5zcGxpdCgvLC8pOw0KCQkJCQluID0gbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KDQoJCQkJCWZvciAoaSA9IHNlbGVjdG9yLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQlpZiAoc2VsZWN0b3JbaV0gPT0gbikNCgkJCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiB0aW55bWNlLmRvbS5TaXp6bGUubWF0Y2hlcyhzZWxlY3Rvciwgbi5ub2RlVHlwZSA/IFtuXSA6IG4pLmxlbmd0aCA+IDA7DQoJCX0sDQoNCgkJLy8gI2VuZGlmDQoNCgkJLyoqDQoJCSAqIEFkZHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIGFub3RoZXIgZWxlbWVudCBvciBlbGVtZW50cy4NCgkJICoNCgkJICogQG1ldGhvZCBhZGQNCgkJICogQHBhcmFtIHtTdHJpbmcvRWxlbWVudC9BcnJheX0gRWxlbWVudCBpZCBzdHJpbmcsIERPTSBub2RlIGVsZW1lbnQgb3IgYXJyYXkgb2YgaWQncyBvciBlbGVtZW50cyB0byBhZGQgdG8uDQoJCSAqIEBwYXJhbSB7U3RyaW5nL0VsZW1lbnR9IG4gTmFtZSBvZiBuZXcgZWxlbWVudCB0byBhZGQgb3IgZXhpc3RpbmcgZWxlbWVudCB0byBhZGQuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBhIE9wdGlvbmFsIG9iamVjdCBjb2xsZWN0aW9uIHdpdGggYXJndW1lbnRzIHRvIGFkZCB0byB0aGUgbmV3IGVsZW1lbnQocykuDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBoIE9wdGlvbmFsIGlubmVyIEhUTUwgY29udGVudHMgdG8gYWRkIGZvciBlYWNoIGVsZW1lbnQuDQoJCSAqIEBwYXJhbSB7Qm9vbGVhbn0gYyBPcHRpb25hbCBpbnRlcm5hbCBzdGF0ZSB0byBpbmRpY2F0ZSBpZiBpdCBzaG91bGQgY3JlYXRlIG9yIGFkZC4NCgkJICogQHJldHVybiB7RWxlbWVudC9BcnJheX0gRWxlbWVudCB0aGF0IGdvdCBjcmVhdGVkIG9yIGFycmF5IHdpdGggZWxlbWVudHMgaWYgbXVsdGlwbGUgZWxlbWVudHMgd2hlcmUgcGFzc2VkLg0KCQkgKi8NCgkJYWRkIDogZnVuY3Rpb24ocCwgbiwgYSwgaCwgYykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlyZXR1cm4gdGhpcy5ydW4ocCwgZnVuY3Rpb24ocCkgew0KCQkJCXZhciBlLCBrOw0KDQoJCQkJZSA9IGlzKG4sICdzdHJpbmcnKSA/IHQuZG9jLmNyZWF0ZUVsZW1lbnQobikgOiBuOw0KCQkJCXQuc2V0QXR0cmlicyhlLCBhKTsNCg0KCQkJCWlmIChoKSB7DQoJCQkJCWlmIChoLm5vZGVUeXBlKQ0KCQkJCQkJZS5hcHBlbmRDaGlsZChoKTsNCgkJCQkJZWxzZQ0KCQkJCQkJdC5zZXRIVE1MKGUsIGgpOw0KCQkJCX0NCg0KCQkJCXJldHVybiAhYyA/IHAuYXBwZW5kQ2hpbGQoZSkgOiBlOw0KCQkJfSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENyZWF0ZXMgYSBuZXcgZWxlbWVudC4NCgkJICoNCgkJICogQG1ldGhvZCBjcmVhdGUNCgkJICogQHBhcmFtIHtTdHJpbmd9IG4gTmFtZSBvZiBuZXcgZWxlbWVudC4NCgkJICogQHBhcmFtIHtPYmplY3R9IGEgT3B0aW9uYWwgb2JqZWN0IG5hbWUvdmFsdWUgY29sbGVjdGlvbiB3aXRoIGVsZW1lbnQgYXR0cmlidXRlcy4NCgkJICogQHBhcmFtIHtTdHJpbmd9IGggT3B0aW9uYWwgSFRNTCBzdHJpbmcgdG8gc2V0IGFzIGlubmVyIEhUTUwgb2YgdGhlIGVsZW1lbnQuDQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IEhUTUwgRE9NIG5vZGUgZWxlbWVudCB0aGF0IGdvdCBjcmVhdGVkLg0KCQkgKi8NCgkJY3JlYXRlIDogZnVuY3Rpb24obiwgYSwgaCkgew0KCQkJcmV0dXJuIHRoaXMuYWRkKHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQobiksIG4sIGEsIGgsIDEpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDcmVhdGUgSFRNTCBzdHJpbmcgZm9yIGVsZW1lbnQuIFRoZSBlbGVtdG4gd2lsbCBiZSBjbG9zZWQgdW5sZXNzIGFuIGVtcHR5IGlubmVyIEhUTUwgc3RyaW5nIGlzIHBhc3NlZC4NCgkJICoNCgkJICogQG1ldGhvZCBjcmVhdGVIVE1MDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIE5hbWUgb2YgbmV3IGVsZW1lbnQuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBhIE9wdGlvbmFsIG9iamVjdCBuYW1lL3ZhbHVlIGNvbGxlY3Rpb24gd2l0aCBlbGVtZW50IGF0dHJpYnV0ZXMuDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBoIE9wdGlvbmFsIEhUTUwgc3RyaW5nIHRvIHNldCBhcyBpbm5lciBIVE1MIG9mIHRoZSBlbGVtZW50Lg0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IFN0cmluZyB3aXRoIG5ldyBIVE1MIGVsZW1lbnQgbGlrZSBmb3IgZXhhbXBsZTogPGEgaHJlZj0iIyI+dGVzdDwvYT4uDQoJCSAqLw0KCQljcmVhdGVIVE1MIDogZnVuY3Rpb24obiwgYSwgaCkgew0KCQkJdmFyIG8gPSAnJywgdCA9IHRoaXMsIGs7DQoNCgkJCW8gKz0gJzwnICsgbjsNCg0KCQkJZm9yIChrIGluIGEpIHsNCgkJCQlpZiAoYS5oYXNPd25Qcm9wZXJ0eShrKSkNCgkJCQkJbyArPSAnICcgKyBrICsgJz0iJyArIHQuZW5jb2RlKGFba10pICsgJyInOw0KCQkJfQ0KDQoJCQkvLyBBIGNhbGwgdG8gdGlueW1jZS5pcyBkb2Vzbid0IHdvcmsgZm9yIHNvbWUgb2RkIHJlYXNvbiBvbiBJRTkgcG9zc2libGUgYnVnIGluc2lkZSB0aGVpciBKUyBydW50aW1lDQoJCQlpZiAodHlwZW9mKGgpICE9ICJ1bmRlZmluZWQiKQ0KCQkJCXJldHVybiBvICsgJz4nICsgaCArICc8LycgKyBuICsgJz4nOw0KDQoJCQlyZXR1cm4gbyArICcgLz4nOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZW1vdmVzL2RlbGV0ZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50KHMpIGZyb20gdGhlIERPTS4NCgkJICoNCgkJICogQG1ldGhvZCByZW1vdmUNCgkJICogQHBhcmFtIHtTdHJpbmcvRWxlbWVudC9BcnJheX0gbm9kZSBJRCBvZiBlbGVtZW50IG9yIERPTSBlbGVtZW50IG9iamVjdCBvciBhcnJheSBjb250YWluaW5nIG11bHRpcGxlIGVsZW1lbnRzL2lkcy4NCgkJICogQHBhcmFtIHtCb29sZWFufSBrZWVwX2NoaWxkcmVuIE9wdGlvbmFsIHN0YXRlIHRvIGtlZXAgY2hpbGRyZW4gb3Igbm90LiBJZiBzZXQgdG8gdHJ1ZSBhbGwgY2hpbGRyZW4gd2lsbCBiZSBwbGFjZWQgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSByZW1vdmVkIGVsZW1lbnQuDQoJCSAqIEByZXR1cm4ge0VsZW1lbnQvQXJyYXl9IEhUTUwgRE9NIGVsZW1lbnQgdGhhdCBnb3QgcmVtb3ZlZCBvciBhcnJheSBvZiBlbGVtZW50cyBkZXBlbmRpbmcgb24gaW5wdXQuDQoJCSAqLw0KCQlyZW1vdmUgOiBmdW5jdGlvbihub2RlLCBrZWVwX2NoaWxkcmVuKSB7DQoJCQlyZXR1cm4gdGhpcy5ydW4obm9kZSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCXZhciBwYXJlbnQsIGNoaWxkOw0KDQoJCQkJcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOw0KDQoJCQkJaWYgKCFwYXJlbnQpDQoJCQkJCXJldHVybiBudWxsOw0KDQoJCQkJaWYgKGtlZXBfY2hpbGRyZW4pIHsNCgkJCQkJd2hpbGUgKGNoaWxkID0gbm9kZS5maXJzdENoaWxkKSB7DQoJCQkJCQkvLyBJRSA4IHdpbGwgY3Jhc2ggaWYgeW91IGRvbid0IHJlbW92ZSBjb21wbGV0ZWx5IGVtcHR5IHRleHQgbm9kZXMNCgkJCQkJCWlmICghdGlueW1jZS5pc0lFIHx8IGNoaWxkLm5vZGVUeXBlICE9PSAzIHx8IGNoaWxkLm5vZGVWYWx1ZSkNCgkJCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBub2RlKTsNCgkJCQkJCWVsc2UNCgkJCQkJCQlub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCXJldHVybiBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7DQoJCQl9KTsNCgkJfSwNCg0KCQkvKioNCgkJICogU2V0cyB0aGUgQ1NTIHN0eWxlIHZhbHVlIG9uIGEgSFRNTCBlbGVtZW50LiBUaGUgbmFtZSBjYW4gYmUgYSBjYW1lbGNhc2Ugc3RyaW5nDQoJCSAqIG9yIHRoZSBDU1Mgc3R5bGUgbmFtZSBsaWtlIGJhY2tncm91bmQtY29sb3IuDQoJCSAqDQoJCSAqIEBtZXRob2Qgc2V0U3R5bGUNCgkJICogQHBhcmFtIHtTdHJpbmcvRWxlbWVudC9BcnJheX0gbiBIVE1MIGVsZW1lbnQvRWxlbWVudCBJRCBvciBBcnJheSBvZiBlbGVtZW50cy9pZHMgdG8gc2V0IENTUyBzdHlsZSB2YWx1ZSBvbi4NCgkJICogQHBhcmFtIHtTdHJpbmd9IG5hIE5hbWUgb2YgdGhlIHN0eWxlIHZhbHVlIHRvIHNldC4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHYgVmFsdWUgdG8gc2V0IG9uIHRoZSBzdHlsZS4NCgkJICovDQoJCXNldFN0eWxlIDogZnVuY3Rpb24obiwgbmEsIHYpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJcmV0dXJuIHQucnVuKG4sIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgcywgaTsNCg0KCQkJCXMgPSBlLnN0eWxlOw0KDQoJCQkJLy8gQ2FtZWxjYXNlIGl0LCBpZiBuZWVkZWQNCgkJCQluYSA9IG5hLnJlcGxhY2UoLy0oXEQpL2csIGZ1bmN0aW9uKGEsIGIpew0KCQkJCQlyZXR1cm4gYi50b1VwcGVyQ2FzZSgpOw0KCQkJCX0pOw0KDQoJCQkJLy8gRGVmYXVsdCBweCBzdWZmaXggb24gdGhlc2UNCgkJCQlpZiAodC5waXhlbFN0eWxlcy50ZXN0KG5hKSAmJiAodGlueW1jZS5pcyh2LCAnbnVtYmVyJykgfHwgL15bXC0wLTlcLl0rJC8udGVzdCh2KSkpDQoJCQkJCXYgKz0gJ3B4JzsNCg0KCQkJCXN3aXRjaCAobmEpIHsNCgkJCQkJY2FzZSAnb3BhY2l0eSc6DQoJCQkJCQkvLyBJRSBzcGVjaWZpYyBvcGFjaXR5DQoJCQkJCQlpZiAoaXNJRSkgew0KCQkJCQkJCXMuZmlsdGVyID0gdiA9PT0gJycgPyAnJyA6ICJhbHBoYShvcGFjaXR5PSIgKyAodiAqIDEwMCkgKyAiKSI7DQoNCgkJCQkJCQlpZiAoIW4uY3VycmVudFN0eWxlIHx8ICFuLmN1cnJlbnRTdHlsZS5oYXNMYXlvdXQpDQoJCQkJCQkJCXMuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBGaXggZm9yIG9sZGVyIGJyb3dzZXJzDQoJCQkJCQlzW25hXSA9IHNbJy1tb3otb3BhY2l0eSddID0gc1snLWtodG1sLW9wYWNpdHknXSA9IHYgfHwgJyc7DQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICdmbG9hdCc6DQoJCQkJCQlpc0lFID8gcy5zdHlsZUZsb2F0ID0gdiA6IHMuY3NzRmxvYXQgPSB2Ow0KCQkJCQkJYnJlYWs7DQoJCQkJCQ0KCQkJCQlkZWZhdWx0Og0KCQkJCQkJc1tuYV0gPSB2IHx8ICcnOw0KCQkJCX0NCg0KCQkJCS8vIEZvcmNlIHVwZGF0ZSBvZiB0aGUgc3R5bGUgZGF0YQ0KCQkJCWlmICh0LnNldHRpbmdzLnVwZGF0ZV9zdHlsZXMpDQoJCQkJCXQuc2V0QXR0cmliKGUsICdfbWNlX3N0eWxlJyk7DQoJCQl9KTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0aGUgY3VycmVudCBzdHlsZSBvciBydW50aW1lL2NvbXB1dGVkIHZhbHVlIG9mIGEgZWxlbWVudC4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRTdHlsZQ0KCQkgKiBAcGFyYW0ge1N0cmluZy9FbGVtZW50fSBuIEhUTUwgZWxlbWVudCBvciBlbGVtZW50IGlkIHN0cmluZyB0byBnZXQgc3R5bGUgZnJvbS4NCgkJICogQHBhcmFtIHtTdHJpbmd9IG5hIFN0eWxlIG5hbWUgdG8gcmV0dXJuLg0KCQkgKiBAcGFyYW0ge0Jvb2xlYW59IGMgQ29tcHV0ZWQgc3R5bGUuDQoJCSAqIEByZXR1cm4ge1N0cmluZ30gQ3VycmVudCBzdHlsZSBvciBjb21wdXRlZCBzdHlsZSB2YWx1ZSBvZiBhIGVsZW1lbnQuDQoJCSAqLw0KCQlnZXRTdHlsZSA6IGZ1bmN0aW9uKG4sIG5hLCBjKSB7DQoJCQluID0gdGhpcy5nZXQobik7DQoNCgkJCWlmICghbikNCgkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCS8vIEdlY2tvDQoJCQlpZiAodGhpcy5kb2MuZGVmYXVsdFZpZXcgJiYgYykgew0KCQkJCS8vIFJlbW92ZSBjYW1lbGNhc2UNCgkJCQluYSA9IG5hLnJlcGxhY2UoL1tBLVpdL2csIGZ1bmN0aW9uKGEpew0KCQkJCQlyZXR1cm4gJy0nICsgYTsNCgkJCQl9KTsNCg0KCQkJCXRyeSB7DQoJCQkJCXJldHVybiB0aGlzLmRvYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG4sIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmEpOw0KCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCS8vIE9sZCBzYWZhcmkgbWlnaHQgZmFpbA0KCQkJCQlyZXR1cm4gbnVsbDsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIENhbWVsY2FzZSBpdCwgaWYgbmVlZGVkDQoJCQluYSA9IG5hLnJlcGxhY2UoLy0oXEQpL2csIGZ1bmN0aW9uKGEsIGIpew0KCQkJCXJldHVybiBiLnRvVXBwZXJDYXNlKCk7DQoJCQl9KTsNCg0KCQkJaWYgKG5hID09ICdmbG9hdCcpDQoJCQkJbmEgPSBpc0lFID8gJ3N0eWxlRmxvYXQnIDogJ2Nzc0Zsb2F0JzsNCg0KCQkJLy8gSUUgJiBPcGVyYQ0KCQkJaWYgKG4uY3VycmVudFN0eWxlICYmIGMpDQoJCQkJcmV0dXJuIG4uY3VycmVudFN0eWxlW25hXTsNCg0KCQkJcmV0dXJuIG4uc3R5bGVbbmFdOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIG11bHRpcGxlIHN0eWxlcyBvbiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQocykuDQoJCSAqDQoJCSAqIEBtZXRob2Qgc2V0U3R5bGVzDQoJCSAqIEBwYXJhbSB7RWxlbWVudC9TdHJpbmcvQXJyYXl9IGUgRE9NIGVsZW1lbnQsIGVsZW1lbnQgaWQgc3RyaW5nIG9yIGFycmF5IG9mIGVsZW1lbnRzL2lkcyB0byBzZXQgc3R5bGVzIG9uLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gbyBOYW1lL1ZhbHVlIGNvbGxlY3Rpb24gb2Ygc3R5bGUgaXRlbXMgdG8gYWRkIHRvIHRoZSBlbGVtZW50KHMpLg0KCQkgKi8NCgkJc2V0U3R5bGVzIDogZnVuY3Rpb24oZSwgbykgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgb2w7DQoNCgkJCW9sID0gcy51cGRhdGVfc3R5bGVzOw0KCQkJcy51cGRhdGVfc3R5bGVzID0gMDsNCg0KCQkJZWFjaChvLCBmdW5jdGlvbih2LCBuKSB7DQoJCQkJdC5zZXRTdHlsZShlLCBuLCB2KTsNCgkJCX0pOw0KDQoJCQkvLyBVcGRhdGUgc3R5bGUgaW5mbw0KCQkJcy51cGRhdGVfc3R5bGVzID0gb2w7DQoJCQlpZiAocy51cGRhdGVfc3R5bGVzKQ0KCQkJCXQuc2V0QXR0cmliKGUsIHMuY3NzVGV4dCk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFNldHMgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVzIHZhbHVlIG9mIGEgZWxlbWVudCBvciBlbGVtZW50cy4NCgkJICoNCgkJICogQG1ldGhvZCBzZXRBdHRyaWINCgkJICogQHBhcmFtIHtFbGVtZW50L1N0cmluZy9BcnJheX0gZSBET00gZWxlbWVudCwgZWxlbWVudCBpZCBzdHJpbmcgb3IgYXJyYXkgb2YgZWxlbWVudHMvaWRzIHRvIHNldCBhdHRyaWJ1dGUgb24uDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIE5hbWUgb2YgYXR0cmlidXRlIHRvIHNldC4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHYgVmFsdWUgdG8gc2V0IG9uIHRoZSBhdHRyaWJ1dGUgb2YgdGhpcyB2YWx1ZSBpcyBmYWxzeSBsaWtlIG51bGwgMCBvciAnJyBpdCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGluc3RlYWQuDQoJCSAqLw0KCQlzZXRBdHRyaWIgOiBmdW5jdGlvbihlLCBuLCB2KSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCS8vIFdoYXRzIHRoZSBwb2ludA0KCQkJaWYgKCFlIHx8ICFuKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gU3RyaWN0IFhNTCBtb2RlDQoJCQlpZiAodC5zZXR0aW5ncy5zdHJpY3QpDQoJCQkJbiA9IG4udG9Mb3dlckNhc2UoKTsNCg0KCQkJcmV0dXJuIHRoaXMucnVuKGUsIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgcyA9IHQuc2V0dGluZ3M7DQoNCgkJCQlzd2l0Y2ggKG4pIHsNCgkJCQkJY2FzZSAic3R5bGUiOg0KCQkJCQkJaWYgKCFpcyh2LCAnc3RyaW5nJykpIHsNCgkJCQkJCQllYWNoKHYsIGZ1bmN0aW9uKHYsIG4pIHsNCgkJCQkJCQkJdC5zZXRTdHlsZShlLCBuLCB2KTsNCgkJCQkJCQl9KTsNCg0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gTm8gbWNlX3N0eWxlIGZvciBlbGVtZW50cyB3aXRoIHRoZXNlIHNpbmNlIHRoZXkgbWlnaHQgZ2V0IHJlc2l6ZWQgYnkgdGhlIHVzZXINCgkJCQkJCWlmIChzLmtlZXBfdmFsdWVzKSB7DQoJCQkJCQkJaWYgKHYgJiYgIXQuX2lzUmVzKHYpKQ0KCQkJCQkJCQllLnNldEF0dHJpYnV0ZSgnX21jZV9zdHlsZScsIHYsIDIpOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJZS5yZW1vdmVBdHRyaWJ1dGUoJ19tY2Vfc3R5bGUnLCAyKTsNCgkJCQkJCX0NCg0KCQkJCQkJZS5zdHlsZS5jc3NUZXh0ID0gdjsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgImNsYXNzIjoNCgkJCQkJCWUuY2xhc3NOYW1lID0gdiB8fCAnJzsgLy8gRml4IElFIG51bGwgYnVnDQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICJzcmMiOg0KCQkJCQljYXNlICJocmVmIjoNCgkJCQkJCWlmIChzLmtlZXBfdmFsdWVzKSB7DQoJCQkJCQkJaWYgKHMudXJsX2NvbnZlcnRlcikNCgkJCQkJCQkJdiA9IHMudXJsX2NvbnZlcnRlci5jYWxsKHMudXJsX2NvbnZlcnRlcl9zY29wZSB8fCB0LCB2LCBuLCBlKTsNCg0KCQkJCQkJCXQuc2V0QXR0cmliKGUsICdfbWNlXycgKyBuLCB2LCAyKTsNCgkJCQkJCX0NCg0KCQkJCQkJYnJlYWs7DQoJCQkJCQ0KCQkJCQljYXNlICJzaGFwZSI6DQoJCQkJCQllLnNldEF0dHJpYnV0ZSgnX21jZV9zdHlsZScsIHYpOw0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJaWYgKGlzKHYpICYmIHYgIT09IG51bGwgJiYgdi5sZW5ndGggIT09IDApDQoJCQkJCWUuc2V0QXR0cmlidXRlKG4sICcnICsgdiwgMik7DQoJCQkJZWxzZQ0KCQkJCQllLnJlbW92ZUF0dHJpYnV0ZShuLCAyKTsNCgkJCX0pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlcyBvZiBhIGVsZW1lbnQgb3IgZWxlbWVudHMuDQoJCSAqDQoJCSAqIEBtZXRob2Qgc2V0QXR0cmlicw0KCQkgKiBAcGFyYW0ge0VsZW1lbnQvU3RyaW5nL0FycmF5fSBlIERPTSBlbGVtZW50LCBlbGVtZW50IGlkIHN0cmluZyBvciBhcnJheSBvZiBlbGVtZW50cy9pZHMgdG8gc2V0IGF0dHJpYnV0ZXMgb24uDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBvIE5hbWUvVmFsdWUgY29sbGVjdGlvbiBvZiBhdHRyaWJ1dGUgaXRlbXMgdG8gYWRkIHRvIHRoZSBlbGVtZW50KHMpLg0KCQkgKi8NCgkJc2V0QXR0cmlicyA6IGZ1bmN0aW9uKGUsIG8pIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJcmV0dXJuIHRoaXMucnVuKGUsIGZ1bmN0aW9uKGUpIHsNCgkJCQllYWNoKG8sIGZ1bmN0aW9uKHYsIG4pIHsNCgkJCQkJdC5zZXRBdHRyaWIoZSwgbiwgdik7DQoJCQkJfSk7DQoJCQl9KTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBieSBuYW1lLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldEF0dHJpYg0KCQkgKiBAcGFyYW0ge1N0cmluZy9FbGVtZW50fSBlIEVsZW1lbnQgc3RyaW5nIGlkIG9yIERPTSBlbGVtZW50IHRvIGdldCBhdHRyaWJ1dGUgZnJvbS4NCgkJICogQHBhcmFtIHtTdHJpbmd9IG4gTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZ2V0Lg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gZHYgT3B0aW9uYWwgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIGF0dHJpYnV0ZSBkaWRuJ3QgZXhpc3QuDQoJCSAqIEByZXR1cm4ge1N0cmluZ30gQXR0cmlidXRlIHZhbHVlIHN0cmluZywgZGVmYXVsdCB2YWx1ZSBvciBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgd2Fzbid0IGZvdW5kLg0KCQkgKi8NCgkJZ2V0QXR0cmliIDogZnVuY3Rpb24oZSwgbiwgZHYpIHsNCgkJCXZhciB2LCB0ID0gdGhpczsNCg0KCQkJZSA9IHQuZ2V0KGUpOw0KDQoJCQlpZiAoIWUgfHwgZS5ub2RlVHlwZSAhPT0gMSkNCgkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCWlmICghaXMoZHYpKQ0KCQkJCWR2ID0gJyc7DQoNCgkJCS8vIFRyeSB0aGUgbWNlIHZhcmlhbnQgZm9yIHRoZXNlDQoJCQlpZiAoL14oc3JjfGhyZWZ8c3R5bGV8Y29vcmRzfHNoYXBlKSQvLnRlc3QobikpIHsNCgkJCQl2ID0gZS5nZXRBdHRyaWJ1dGUoIl9tY2VfIiArIG4pOw0KDQoJCQkJaWYgKHYpDQoJCQkJCXJldHVybiB2Ow0KCQkJfQ0KDQoJCQlpZiAoaXNJRSAmJiB0LnByb3BzW25dKSB7DQoJCQkJdiA9IGVbdC5wcm9wc1tuXV07DQoJCQkJdiA9IHYgJiYgdi5ub2RlVmFsdWUgPyB2Lm5vZGVWYWx1ZSA6IHY7DQoJCQl9DQoNCgkJCWlmICghdikNCgkJCQl2ID0gZS5nZXRBdHRyaWJ1dGUobiwgMik7DQoNCgkJCS8vIENoZWNrIGJvb2xlYW4gYXR0cmlicw0KCQkJaWYgKC9eKGNoZWNrZWR8Y29tcGFjdHxkZWNsYXJlfGRlZmVyfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfG5vaHJlZnxub3NoYWRlfG5vd3JhcHxyZWFkb25seXxzZWxlY3RlZCkkLy50ZXN0KG4pKSB7DQoJCQkJaWYgKGVbdC5wcm9wc1tuXV0gPT09IHRydWUgJiYgdiA9PT0gJycpDQoJCQkJCXJldHVybiBuOw0KDQoJCQkJcmV0dXJuIHYgPyBuIDogJyc7DQoJCQl9DQoNCgkJCS8vIElubmVyIGlucHV0IGVsZW1lbnRzIHdpbGwgb3ZlcnJpZGUgYXR0cmlidXRlcyBvbiBmb3JtIGVsZW1lbnRzDQoJCQlpZiAoZS5ub2RlTmFtZSA9PT0gIkZPUk0iICYmIGUuZ2V0QXR0cmlidXRlTm9kZShuKSkNCgkJCQlyZXR1cm4gZS5nZXRBdHRyaWJ1dGVOb2RlKG4pLm5vZGVWYWx1ZTsNCg0KCQkJaWYgKG4gPT09ICdzdHlsZScpIHsNCgkJCQl2ID0gdiB8fCBlLnN0eWxlLmNzc1RleHQ7DQoNCgkJCQlpZiAodikgew0KCQkJCQl2ID0gdC5zZXJpYWxpemVTdHlsZSh0LnBhcnNlU3R5bGUodiksIGUubm9kZU5hbWUpOw0KDQoJCQkJCWlmICh0LnNldHRpbmdzLmtlZXBfdmFsdWVzICYmICF0Ll9pc1Jlcyh2KSkNCgkJCQkJCWUuc2V0QXR0cmlidXRlKCdfbWNlX3N0eWxlJywgdik7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBSZW1vdmUgQXBwbGUgYW5kIFdlYktpdCBzdHVmZg0KCQkJaWYgKGlzV2ViS2l0ICYmIG4gPT09ICJjbGFzcyIgJiYgdikNCgkJCQl2ID0gdi5yZXBsYWNlKC8oYXBwbGV8d2Via2l0KVwtW2EtelwtXSsvZ2ksICcnKTsNCg0KCQkJLy8gSGFuZGxlIElFIGlzc3Vlcw0KCQkJaWYgKGlzSUUpIHsNCgkJCQlzd2l0Y2ggKG4pIHsNCgkJCQkJY2FzZSAncm93c3Bhbic6DQoJCQkJCWNhc2UgJ2NvbHNwYW4nOg0KCQkJCQkJLy8gSUUgcmV0dXJucyAxIGFzIGRlZmF1bHQgdmFsdWUNCgkJCQkJCWlmICh2ID09PSAxKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnc2l6ZSc6DQoJCQkJCQkvLyBJRSByZXR1cm5zICswIGFzIGRlZmF1bHQgdmFsdWUgZm9yIHNpemUNCgkJCQkJCWlmICh2ID09PSAnKzAnIHx8IHYgPT09IDIwIHx8IHYgPT09IDApDQoJCQkJCQkJdiA9ICcnOw0KDQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICd3aWR0aCc6DQoJCQkJCWNhc2UgJ2hlaWdodCc6DQoJCQkJCWNhc2UgJ3ZzcGFjZSc6DQoJCQkJCWNhc2UgJ2NoZWNrZWQnOg0KCQkJCQljYXNlICdkaXNhYmxlZCc6DQoJCQkJCWNhc2UgJ3JlYWRvbmx5JzoNCgkJCQkJCWlmICh2ID09PSAwKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnaHNwYWNlJzoNCgkJCQkJCS8vIElFIHJldHVybnMgLTEgYXMgZGVmYXVsdCB2YWx1ZQ0KCQkJCQkJaWYgKHYgPT09IC0xKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnbWF4bGVuZ3RoJzoNCgkJCQkJY2FzZSAndGFiaW5kZXgnOg0KCQkJCQkJLy8gSUUgcmV0dXJucyBkZWZhdWx0IHZhbHVlDQoJCQkJCQlpZiAodiA9PT0gMzI3NjggfHwgdiA9PT0gMjE0NzQ4MzY0NyB8fCB2ID09PSAnMzI3NjgnKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnbXVsdGlwbGUnOg0KCQkJCQljYXNlICdjb21wYWN0JzoNCgkJCQkJY2FzZSAnbm9zaGFkZSc6DQoJCQkJCWNhc2UgJ25vd3JhcCc6DQoJCQkJCQlpZiAodiA9PT0gNjU1MzUpDQoJCQkJCQkJcmV0dXJuIG47DQoNCgkJCQkJCXJldHVybiBkdjsNCg0KCQkJCQljYXNlICdzaGFwZSc6DQoJCQkJCQl2ID0gdi50b0xvd2VyQ2FzZSgpOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJZGVmYXVsdDoNCgkJCQkJCS8vIElFIGhhcyBvZGQgYW5vbnltb3VzIGZ1bmN0aW9uIGZvciBldmVudCBhdHRyaWJ1dGVzDQoJCQkJCQlpZiAobi5pbmRleE9mKCdvbicpID09PSAwICYmIHYpDQoJCQkJCQkJdiA9IHRpbnltY2UuX3JlcGxhY2UoL15mdW5jdGlvblxzK1x3K1woXClccytce1xzKyguKilccytcfSQvLCAnJDEnLCAnJyArIHYpOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuICh2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCAmJiB2ICE9PSAnJykgPyAnJyArIHYgOiBkdjsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0aGUgYWJzb2x1dGUgeCwgeSBwb3NpdGlvbiBvZiBhIG5vZGUuIFRoZSBwb3NpdGlvbiB3aWxsIGJlIHJldHVybmVkIGluIGEgb2JqZWN0IHdpdGggeCwgeSBmaWVsZHMuDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0UG9zDQoJCSAqIEBwYXJhbSB7RWxlbWVudC9TdHJpbmd9IG4gSFRNTCBlbGVtZW50IG9yIGVsZW1lbnQgaWQgdG8gZ2V0IHgsIHkgcG9zaXRpb24gZnJvbS4NCgkJICogQHBhcmFtIHtFbGVtZW50fSBybyBPcHRpb25hbCByb290IGVsZW1lbnQgdG8gc3RvcCBjYWxjdWxhdGlvbnMgYXQuDQoJCSAqIEByZXR1cm4ge29iamVjdH0gQWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IG9iamVjdCB3aXRoIHgsIHkgZmllbGRzLg0KCQkgKi8NCgkJZ2V0UG9zIDogZnVuY3Rpb24obiwgcm8pIHsNCgkJCXZhciB0ID0gdGhpcywgeCA9IDAsIHkgPSAwLCBlLCBkID0gdC5kb2MsIHI7DQoNCgkJCW4gPSB0LmdldChuKTsNCgkJCXJvID0gcm8gfHwgZC5ib2R5Ow0KDQoJCQlpZiAobikgew0KCQkJCS8vIFVzZSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gSUUsIE9wZXJhIGhhcyBpdCBidXQgaXQncyBub3QgcGVyZmVjdA0KCQkJCWlmIChpc0lFICYmICF0LnN0ZE1vZGUpIHsNCgkJCQkJbiA9IG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7DQoJCQkJCWUgPSB0LmJveE1vZGVsID8gZC5kb2N1bWVudEVsZW1lbnQgOiBkLmJvZHk7DQoJCQkJCXggPSB0LmdldFN0eWxlKHQuc2VsZWN0KCdodG1sJylbMF0sICdib3JkZXJXaWR0aCcpOyAvLyBSZW1vdmUgYm9yZGVyDQoJCQkJCXggPSAoeCA9PSAnbWVkaXVtJyB8fCB0LmJveE1vZGVsICYmICF0LmlzSUU2KSAmJiAyIHx8IHg7DQoNCgkJCQkJcmV0dXJuIHt4IDogbi5sZWZ0ICsgZS5zY3JvbGxMZWZ0IC0geCwgeSA6IG4udG9wICsgZS5zY3JvbGxUb3AgLSB4fTsNCgkJCQl9DQoNCgkJCQlyID0gbjsNCgkJCQl3aGlsZSAociAmJiByICE9IHJvICYmIHIubm9kZVR5cGUpIHsNCgkJCQkJeCArPSByLm9mZnNldExlZnQgfHwgMDsNCgkJCQkJeSArPSByLm9mZnNldFRvcCB8fCAwOw0KCQkJCQlyID0gci5vZmZzZXRQYXJlbnQ7DQoJCQkJfQ0KDQoJCQkJciA9IG4ucGFyZW50Tm9kZTsNCgkJCQl3aGlsZSAociAmJiByICE9IHJvICYmIHIubm9kZVR5cGUpIHsNCgkJCQkJeCAtPSByLnNjcm9sbExlZnQgfHwgMDsNCgkJCQkJeSAtPSByLnNjcm9sbFRvcCB8fCAwOw0KCQkJCQlyID0gci5wYXJlbnROb2RlOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIHt4IDogeCwgeSA6IHl9Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBzdHlsZSB2YWx1ZSBpbnRvIGFuIG9iamVjdCBjb2xsZWN0aW9uLiBUaGlzIHBhcnNlciB3aWxsIGFsc28NCgkJICogbWVyZ2UgYW5kIHJlbW92ZSBhbnkgcmVkdW5kYW50IGl0ZW1zIHRoYXQgYnJvd3NlcnMgbWlnaHQgaGF2ZSBhZGRlZC4gSXQgd2lsbCBhbHNvIGNvbnZlcnQgbm9uIGhleA0KCQkgKiBjb2xvcnMgdG8gaGV4IHZhbHVlcy4gVXJscyBpbnNpZGUgdGhlIHN0eWxlcyB3aWxsIGFsc28gYmUgY29udmVydGVkIHRvIGFic29sdXRlL3JlbGF0aXZlIGJhc2VkIG9uIHNldHRpbmdzLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHBhcnNlU3R5bGUNCgkJICogQHBhcmFtIHtTdHJpbmd9IHN0IFN0eWxlIHZhbHVlIHRvIHBhcnNlIGZvciBleGFtcGxlOiBib3JkZXI6MXB4IHNvbGlkIHJlZDsuDQoJCSAqIEByZXR1cm4ge09iamVjdH0gT2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoYXQgc3R5bGUgbGlrZSB7Ym9yZGVyIDogJzFweCBzb2xpZCByZWQnfQ0KCQkgKi8NCgkJcGFyc2VTdHlsZSA6IGZ1bmN0aW9uKHN0KSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBvID0ge307DQoNCgkJCWlmICghc3QpDQoJCQkJcmV0dXJuIG87DQoNCgkJCWZ1bmN0aW9uIGNvbXByZXNzKHAsIHMsIG90KSB7DQoJCQkJdmFyIHQsIHIsIGIsIGw7DQoNCgkJCQkvLyBHZXQgdmFsdWVzIGFuZCBjaGVjayBpdCBpdCBuZWVkcyBjb21wcmVzc2luZw0KCQkJCXQgPSBvW3AgKyAnLXRvcCcgKyBzXTsNCgkJCQlpZiAoIXQpDQoJCQkJCXJldHVybjsNCg0KCQkJCXIgPSBvW3AgKyAnLXJpZ2h0JyArIHNdOw0KCQkJCWlmICh0ICE9IHIpDQoJCQkJCXJldHVybjsNCg0KCQkJCWIgPSBvW3AgKyAnLWJvdHRvbScgKyBzXTsNCgkJCQlpZiAociAhPSBiKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlsID0gb1twICsgJy1sZWZ0JyArIHNdOw0KCQkJCWlmIChiICE9IGwpDQoJCQkJCXJldHVybjsNCg0KCQkJCS8vIENvbXByZXNzDQoJCQkJb1tvdF0gPSBsOw0KCQkJCWRlbGV0ZSBvW3AgKyAnLXRvcCcgKyBzXTsNCgkJCQlkZWxldGUgb1twICsgJy1yaWdodCcgKyBzXTsNCgkJCQlkZWxldGUgb1twICsgJy1ib3R0b20nICsgc107DQoJCQkJZGVsZXRlIG9bcCArICctbGVmdCcgKyBzXTsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIGNvbXByZXNzMih0YSwgYSwgYiwgYykgew0KCQkJCXZhciB0Ow0KDQoJCQkJdCA9IG9bYV07DQoJCQkJaWYgKCF0KQ0KCQkJCQlyZXR1cm47DQoNCgkJCQl0ID0gb1tiXTsNCgkJCQlpZiAoIXQpDQoJCQkJCXJldHVybjsNCg0KCQkJCXQgPSBvW2NdOw0KCQkJCWlmICghdCkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJLy8gQ29tcHJlc3MNCgkJCQlvW3RhXSA9IG9bYV0gKyAnICcgKyBvW2JdICsgJyAnICsgb1tjXTsNCgkJCQlkZWxldGUgb1thXTsNCgkJCQlkZWxldGUgb1tiXTsNCgkJCQlkZWxldGUgb1tjXTsNCgkJCX07DQoNCgkJCXN0ID0gc3QucmVwbGFjZSgvJigjP1thLXowLTldKyk7L2csICcmJDFfTUNFX1NFTUlfJyk7IC8vIFByb3RlY3QgZW50aXRpZXMNCg0KCQkJZWFjaChzdC5zcGxpdCgnOycpLCBmdW5jdGlvbih2KSB7DQoJCQkJdmFyIHN2LCB1ciA9IFtdOw0KDQoJCQkJaWYgKHYpIHsNCgkJCQkJdiA9IHYucmVwbGFjZSgvX01DRV9TRU1JXy9nLCAnOycpOyAvLyBSZXN0b3JlIGVudGl0aWVzDQoJCQkJCXYgPSB2LnJlcGxhY2UoL3VybFwoW15cKV0rXCkvZywgZnVuY3Rpb24odikge3VyLnB1c2godik7cmV0dXJuICd1cmwoJyArIHVyLmxlbmd0aCArICcpJzt9KTsNCgkJCQkJdiA9IHYuc3BsaXQoJzonKTsNCgkJCQkJc3YgPSB0aW55bWNlLnRyaW0odlsxXSk7DQoJCQkJCXN2ID0gc3YucmVwbGFjZSgvdXJsXCgoW15cKV0rKVwpL2csIGZ1bmN0aW9uKGEsIGIpIHtyZXR1cm4gdXJbcGFyc2VJbnQoYikgLSAxXTt9KTsNCg0KCQkJCQlzdiA9IHN2LnJlcGxhY2UoL3JnYlwoW15cKV0rXCkvZywgZnVuY3Rpb24odikgew0KCQkJCQkJcmV0dXJuIHQudG9IZXgodik7DQoJCQkJCX0pOw0KDQoJCQkJCWlmIChzLnVybF9jb252ZXJ0ZXIpIHsNCgkJCQkJCXN2ID0gc3YucmVwbGFjZSgvdXJsXChbXCdcIl0/KFteXClcJ1wiXSspW1wnXCJdP1wpL2csIGZ1bmN0aW9uKHgsIGMpIHsNCgkJCQkJCQlyZXR1cm4gJ3VybCgnICsgcy51cmxfY29udmVydGVyLmNhbGwocy51cmxfY29udmVydGVyX3Njb3BlIHx8IHQsIHQuZGVjb2RlKGMpLCAnc3R5bGUnLCBudWxsKSArICcpJzsNCgkJCQkJCX0pOw0KCQkJCQl9DQoNCgkJCQkJb1t0aW55bWNlLnRyaW0odlswXSkudG9Mb3dlckNhc2UoKV0gPSBzdjsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJY29tcHJlc3MoImJvcmRlciIsICIiLCAiYm9yZGVyIik7DQoJCQljb21wcmVzcygiYm9yZGVyIiwgIi13aWR0aCIsICJib3JkZXItd2lkdGgiKTsNCgkJCWNvbXByZXNzKCJib3JkZXIiLCAiLWNvbG9yIiwgImJvcmRlci1jb2xvciIpOw0KCQkJY29tcHJlc3MoImJvcmRlciIsICItc3R5bGUiLCAiYm9yZGVyLXN0eWxlIik7DQoJCQljb21wcmVzcygicGFkZGluZyIsICIiLCAicGFkZGluZyIpOw0KCQkJY29tcHJlc3MoIm1hcmdpbiIsICIiLCAibWFyZ2luIik7DQoJCQljb21wcmVzczIoJ2JvcmRlcicsICdib3JkZXItd2lkdGgnLCAnYm9yZGVyLXN0eWxlJywgJ2JvcmRlci1jb2xvcicpOw0KDQoJCQlpZiAoaXNJRSkgew0KCQkJCS8vIFJlbW92ZSBwb2ludGxlc3MgYm9yZGVyDQoJCQkJaWYgKG8uYm9yZGVyID09ICdtZWRpdW0gbm9uZScpDQoJCQkJCW8uYm9yZGVyID0gJyc7DQoJCQl9DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXJpYWxpemVzIHRoZSBzcGVjaWZpZWQgc3R5bGUgb2JqZWN0IGludG8gYSBzdHJpbmcuDQoJCSAqDQoJCSAqIEBtZXRob2Qgc2VyaWFsaXplU3R5bGUNCgkJICogQHBhcmFtIHtPYmplY3R9IG8gT2JqZWN0IHRvIHNlcmlhbGl6ZSBhcyBzdHJpbmcgZm9yIGV4YW1wbGU6IHtib3JkZXIgOiAnMXB4IHNvbGlkIHJlZCd9DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE9wdGlvbmFsIGVsZW1lbnQgbmFtZS4NCgkJICogQHJldHVybiB7U3RyaW5nfSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0eWxlIG9iamVjdCBmb3IgZXhhbXBsZTogYm9yZGVyOiAxcHggc29saWQgcmVkLg0KCQkgKi8NCgkJc2VyaWFsaXplU3R5bGUgOiBmdW5jdGlvbihvLCBuYW1lKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSAnJzsNCg0KCQkJZnVuY3Rpb24gYWRkKHYsIGspIHsNCgkJCQlpZiAoayAmJiB2KSB7DQoJCQkJCS8vIFJlbW92ZSBicm93c2VyIHNwZWNpZmljIHN0eWxlcyBsaWtlIC1tb3otIG9yIC13ZWJraXQtDQoJCQkJCWlmIChrLmluZGV4T2YoJy0nKSA9PT0gMCkNCgkJCQkJCXJldHVybjsNCg0KCQkJCQlzd2l0Y2ggKGspIHsNCgkJCQkJCWNhc2UgJ2ZvbnQtd2VpZ2h0JzoNCgkJCQkJCQkvLyBPcGVyYSB3aWxsIG91dHB1dCBib2xkIGFzIDcwMA0KCQkJCQkJCWlmICh2ID09IDcwMCkNCgkJCQkJCQkJdiA9ICdib2xkJzsNCg0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQljYXNlICdjb2xvcic6DQoJCQkJCQljYXNlICdiYWNrZ3JvdW5kLWNvbG9yJzoNCgkJCQkJCQl2ID0gdi50b0xvd2VyQ2FzZSgpOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQl9DQoNCgkJCQkJcyArPSAocyA/ICcgJyA6ICcnKSArIGsgKyAnOiAnICsgdiArICc7JzsNCgkJCQl9DQoJCQl9Ow0KDQoJCQkvLyBWYWxpZGF0ZSBzdHlsZSBvdXRwdXQNCgkJCWlmIChuYW1lICYmIHQuX3N0eWxlcykgew0KCQkJCWVhY2godC5fc3R5bGVzWycqJ10sIGZ1bmN0aW9uKG5hbWUpIHsNCgkJCQkJYWRkKG9bbmFtZV0sIG5hbWUpOw0KCQkJCX0pOw0KDQoJCQkJZWFjaCh0Ll9zdHlsZXNbbmFtZS50b0xvd2VyQ2FzZSgpXSwgZnVuY3Rpb24obmFtZSkgew0KCQkJCQlhZGQob1tuYW1lXSwgbmFtZSk7DQoJCQkJfSk7DQoJCQl9IGVsc2UNCgkJCQllYWNoKG8sIGFkZCk7DQoNCgkJCXJldHVybiBzOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBJbXBvcnRzL2xvYWRzIHRoZSBzcGVjaWZpZWQgQ1NTIGZpbGUgaW50byB0aGUgZG9jdW1lbnQgYm91bmQgdG8gdGhlIGNsYXNzLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGxvYWRDU1MNCgkJICogQHBhcmFtIHtTdHJpbmd9IHUgVVJMIHRvIENTUyBmaWxlIHRvIGxvYWQuDQoJCSAqLw0KCQlsb2FkQ1NTIDogZnVuY3Rpb24odSkgew0KCQkJdmFyIHQgPSB0aGlzLCBkID0gdC5kb2MsIGhlYWQ7DQoNCgkJCWlmICghdSkNCgkJCQl1ID0gJyc7DQoNCgkJCWhlYWQgPSB0LnNlbGVjdCgnaGVhZCcpWzBdOw0KDQoJCQllYWNoKHUuc3BsaXQoJywnKSwgZnVuY3Rpb24odSkgew0KCQkJCXZhciBsaW5rOw0KDQoJCQkJaWYgKHQuZmlsZXNbdV0pDQoJCQkJCXJldHVybjsNCg0KCQkJCXQuZmlsZXNbdV0gPSB0cnVlOw0KCQkJCWxpbmsgPSB0LmNyZWF0ZSgnbGluaycsIHtyZWwgOiAnc3R5bGVzaGVldCcsIGhyZWYgOiB0aW55bWNlLl9hZGRWZXIodSl9KTsNCg0KCQkJCS8vIElFIDggaGFzIGEgYnVnIHdoZXJlIGR5bmFtaWNhbGx5IGxvYWRpbmcgc3R5bGVzaGVldHMgd291bGQgcHJvZHVjZSBhIDEgaXRlbSByZW1haW5pbmcgYnVnDQoJCQkJLy8gVGhpcyBmaXggc2VlbXMgdG8gcmVzb2x2ZSB0aGF0IGlzc3VlIGJ5IHJlYWxjaW5nIHRoZSBkb2N1bWVudCBvbmVzIGEgc3R5bGVzaGVldCBmaW5pc2hlcyBsb2FkaW5nDQoJCQkJLy8gSXQncyB1Z2x5IGJ1dCBpdCBzZWVtcyB0byB3b3JrIGZpbmUuDQoJCQkJaWYgKGlzSUUgJiYgZC5kb2N1bWVudE1vZGUgJiYgZC5yZWNhbGMpIHsNCgkJCQkJbGluay5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQkJCWQucmVjYWxjKCk7DQoJCQkJCQlsaW5rLm9ubG9hZCA9IG51bGw7DQoJCQkJCX07DQoJCQkJfQ0KDQoJCQkJaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsNCgkJCX0pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBBZGRzIGEgY2xhc3MgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50IG9yIGVsZW1lbnRzLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGFkZENsYXNzDQoJCSAqIEBwYXJhbSB7U3RyaW5nL0VsZW1lbnQvQXJyYXl9IEVsZW1lbnQgSUQgc3RyaW5nIG9yIERPTSBlbGVtZW50IG9yIGFycmF5IHdpdGggZWxlbWVudHMgb3IgSURzLg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gYyBDbGFzcyBuYW1lIHRvIGFkZCB0byBlYWNoIGVsZW1lbnQuDQoJCSAqIEByZXR1cm4ge1N0cmluZy9BcnJheX0gU3RyaW5nIHdpdGggbmV3IGNsYXNzIHZhbHVlIG9yIGFycmF5IHdpdGggbmV3IGNsYXNzIHZhbHVlcyBmb3IgYWxsIGVsZW1lbnRzLg0KCQkgKi8NCgkJYWRkQ2xhc3MgOiBmdW5jdGlvbihlLCBjKSB7DQoJCQlyZXR1cm4gdGhpcy5ydW4oZSwgZnVuY3Rpb24oZSkgew0KCQkJCXZhciBvOw0KDQoJCQkJaWYgKCFjKQ0KCQkJCQlyZXR1cm4gMDsNCg0KCQkJCWlmICh0aGlzLmhhc0NsYXNzKGUsIGMpKQ0KCQkJCQlyZXR1cm4gZS5jbGFzc05hbWU7DQoNCgkJCQlvID0gdGhpcy5yZW1vdmVDbGFzcyhlLCBjKTsNCg0KCQkJCXJldHVybiBlLmNsYXNzTmFtZSA9IChvICE9ICcnID8gKG8gKyAnICcpIDogJycpICsgYzsNCgkJCX0pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgb3IgZWxlbWVudHMuDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVtb3ZlQ2xhc3MNCgkJICogQHBhcmFtIHtTdHJpbmcvRWxlbWVudC9BcnJheX0gRWxlbWVudCBJRCBzdHJpbmcgb3IgRE9NIGVsZW1lbnQgb3IgYXJyYXkgd2l0aCBlbGVtZW50cyBvciBJRHMuDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBjIENsYXNzIG5hbWUgdG8gcmVtb3ZlIHRvIGVhY2ggZWxlbWVudC4NCgkJICogQHJldHVybiB7U3RyaW5nL0FycmF5fSBTdHJpbmcgd2l0aCBuZXcgY2xhc3MgdmFsdWUgb3IgYXJyYXkgd2l0aCBuZXcgY2xhc3MgdmFsdWVzIGZvciBhbGwgZWxlbWVudHMuDQoJCSAqLw0KCQlyZW1vdmVDbGFzcyA6IGZ1bmN0aW9uKGUsIGMpIHsNCgkJCXZhciB0ID0gdGhpcywgcmU7DQoNCgkJCXJldHVybiB0LnJ1bihlLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIHY7DQoNCgkJCQlpZiAodC5oYXNDbGFzcyhlLCBjKSkgew0KCQkJCQlpZiAoIXJlKQ0KCQkJCQkJcmUgPSBuZXcgUmVnRXhwKCIoXnxcXHMrKSIgKyBjICsgIihcXHMrfCQpIiwgImciKTsNCg0KCQkJCQl2ID0gZS5jbGFzc05hbWUucmVwbGFjZShyZSwgJyAnKTsNCgkJCQkJdiA9IHRpbnltY2UudHJpbSh2ICE9ICcgJyA/IHYgOiAnJyk7DQoNCgkJCQkJZS5jbGFzc05hbWUgPSB2Ow0KDQoJCQkJCS8vIEVtcHR5IGNsYXNzIGF0dHINCgkJCQkJaWYgKCF2KSB7DQoJCQkJCQllLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsNCgkJCQkJCWUucmVtb3ZlQXR0cmlidXRlKCdjbGFzc05hbWUnKTsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiB2Ow0KCQkJCX0NCg0KCQkJCXJldHVybiBlLmNsYXNzTmFtZTsNCgkJCX0pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIGNsYXNzLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGhhc0NsYXNzDQoJCSAqIEBwYXJhbSB7U3RyaW5nL0VsZW1lbnR9IG4gSFRNTCBlbGVtZW50IG9yIGVsZW1lbnQgaWQgc3RyaW5nIHRvIGNoZWNrIENTUyBjbGFzcyBvbi4NCgkJICogQHBhcmFtIHtTdHJpbmd9IGMgQ1NTIGNsYXNzIHRvIGNoZWNrIGZvci4NCgkJICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZS9mYWxzZSBpZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgY2xhc3MuDQoJCSAqLw0KCQloYXNDbGFzcyA6IGZ1bmN0aW9uKG4sIGMpIHsNCgkJCW4gPSB0aGlzLmdldChuKTsNCg0KCQkJaWYgKCFuIHx8ICFjKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJcmV0dXJuICgnICcgKyBuLmNsYXNzTmFtZSArICcgJykuaW5kZXhPZignICcgKyBjICsgJyAnKSAhPT0gLTE7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFNob3dzIHRoZSBzcGVjaWZpZWQgZWxlbWVudChzKSBieSBJRCBieSBzZXR0aW5nIHRoZSAiZGlzcGxheSIgc3R5bGUuDQoJCSAqDQoJCSAqIEBtZXRob2Qgc2hvdw0KCQkgKiBAcGFyYW0ge1N0cmluZy9FbGVtZW50L0FycmF5fSBlIElEIG9mIERPTSBlbGVtZW50IG9yIERPTSBlbGVtZW50IG9yIGFycmF5IHdpdGggZWxlbWVudHMgb3IgSURzIHRvIHNob3cuDQoJCSAqLw0KCQlzaG93IDogZnVuY3Rpb24oZSkgew0KCQkJcmV0dXJuIHRoaXMuc2V0U3R5bGUoZSwgJ2Rpc3BsYXknLCAnYmxvY2snKTsNCgkJfSwNCg0KCQkvKioNCgkJICogSGlkZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50KHMpIGJ5IElEIGJ5IHNldHRpbmcgdGhlICJkaXNwbGF5IiBzdHlsZS4NCgkJICoNCgkJICogQG1ldGhvZCBoaWRlDQoJCSAqIEBwYXJhbSB7U3RyaW5nL0VsZW1lbnQvQXJyYXl9IGUgSUQgb2YgRE9NIGVsZW1lbnQgb3IgRE9NIGVsZW1lbnQgb3IgYXJyYXkgd2l0aCBlbGVtZW50cyBvciBJRHMgdG8gaGlkZS4NCgkJICovDQoJCWhpZGUgOiBmdW5jdGlvbihlKSB7DQoJCQlyZXR1cm4gdGhpcy5zZXRTdHlsZShlLCAnZGlzcGxheScsICdub25lJyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdHJ1ZS9mYWxzZSBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3Igbm90IGJ5IGNoZWNraW5nIHRoZSAiZGlzcGxheSIgc3R5bGUuDQoJCSAqDQoJCSAqIEBtZXRob2QgaXNIaWRkZW4NCgkJICogQHBhcmFtIHtTdHJpbmcvRWxlbWVudH0gZSBJZCBvciBlbGVtZW50IHRvIGNoZWNrIGRpc3BsYXkgc3RhdGUgb24uDQoJCSAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUvZmFsc2UgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIG5vdC4NCgkJICovDQoJCWlzSGlkZGVuIDogZnVuY3Rpb24oZSkgew0KCQkJZSA9IHRoaXMuZ2V0KGUpOw0KDQoJCQlyZXR1cm4gIWUgfHwgZS5zdHlsZS5kaXNwbGF5ID09ICdub25lJyB8fCB0aGlzLmdldFN0eWxlKGUsICdkaXNwbGF5JykgPT0gJ25vbmUnOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIGEgdW5pcXVlIGlkLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBnZW5lcmF0aW5nIGVsZW1lbnRzIG9uIHRoZSBmbHkuDQoJCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNoZWNrIGlmIHRoZSBlbGVtZW50IGFsbHJlYWR5IGV4aXN0cy4NCgkJICoNCgkJICogQG1ldGhvZCB1bmlxdWVJZA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gcCBPcHRpb25hbCBwcmVmaXggdG8gYWRkIGluZnJvbnQgb2YgYWxsIGlkcyBkZWZhdWx0cyB0byAibWNlXyIuDQoJCSAqIEByZXR1cm4ge1N0cmluZ30gVW5pcXVlIGlkLg0KCQkgKi8NCgkJdW5pcXVlSWQgOiBmdW5jdGlvbihwKSB7DQoJCQlyZXR1cm4gKCFwID8gJ21jZV8nIDogcCkgKyAodGhpcy5jb3VudGVyKyspOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgSFRNTCBjb250ZW50IGluc2lkZSB0aGUgZWxlbWVudCBvciBlbGVtZW50cy4gVGhlIEhUTUwgd2lsbCBmaXJzdCBiZSBwcm9jZXNzZWQgdGhpcyBtZWFucw0KCQkgKiBVUkxzIHdpbGwgZ2V0IGNvbnZlcnRlZCwgaGV4IGNvbG9yIHZhbHVlcyBmaXhlZCBldGMuIENoZWNrIHByb2Nlc3NIVE1MIGZvciBkZXRhaWxzLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldEhUTUwNCgkJICogQHBhcmFtIHtFbGVtZW50L1N0cmluZy9BcnJheX0gZSBET00gZWxlbWVudCwgZWxlbWVudCBpZCBzdHJpbmcgb3IgYXJyYXkgb2YgZWxlbWVudHMvaWRzIHRvIHNldCBIVE1MIGluc2lkZS4NCgkJICogQHBhcmFtIHtTdHJpbmd9IGggSFRNTCBjb250ZW50IHRvIHNldCBhcyBpbm5lciBIVE1MIG9mIHRoZSBlbGVtZW50Lg0KCQkgKi8NCgkJc2V0SFRNTCA6IGZ1bmN0aW9uKGUsIGgpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJcmV0dXJuIHRoaXMucnVuKGUsIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgeCwgaSwgbmwsIG4sIHAsIHg7DQoNCgkJCQloID0gdC5wcm9jZXNzSFRNTChoKTsNCg0KCQkJCWlmIChpc0lFKSB7DQoJCQkJCWZ1bmN0aW9uIHNldCgpIHsNCgkJCQkJCS8vIFJlbW92ZSBhbGwgY2hpbGQgbm9kZXMNCgkJCQkJCXdoaWxlIChlLmZpcnN0Q2hpbGQpDQoJCQkJCQkJZS5maXJzdENoaWxkLnJlbW92ZU5vZGUoKTsNCg0KCQkJCQkJdHJ5IHsNCgkJCQkJCQkvLyBJRSB3aWxsIHJlbW92ZSBjb21tZW50cyBmcm9tIHRoZSBiZWdpbm5pbmcNCgkJCQkJCQkvLyB1bmxlc3MgeW91IHBhZGQgdGhlIGNvbnRlbnRzIHdpdGggc29tZXRoaW5nDQoJCQkJCQkJZS5pbm5lckhUTUwgPSAnPGJyIC8+JyArIGg7DQoJCQkJCQkJZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpOw0KCQkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCQkvLyBJRSBzb21ldGltZXMgcHJvZHVjZXMgYW4gdW5rbm93biBydW50aW1lIGVycm9yIG9uIGlubmVySFRNTCBpZiBpdCdzIGFuIGJsb2NrIGVsZW1lbnQgd2l0aGluIGEgYmxvY2sgZWxlbWVudCBmb3IgZXhhbXBsZSBhIGRpdiBpbnNpZGUgYSBwDQoJCQkJCQkJLy8gVGhpcyBzZWVtcyB0byBmaXggdGhpcyBwcm9ibGVtDQoNCgkJCQkJCQkvLyBDcmVhdGUgbmV3IGRpdiB3aXRoIEhUTUwgY29udGVudHMgYW5kIGEgQlIgaW5mcm9udCB0byBrZWVwIGNvbW1lbnRzDQoJCQkJCQkJeCA9IHQuY3JlYXRlKCdkaXYnKTsNCgkJCQkJCQl4LmlubmVySFRNTCA9ICc8YnIgLz4nICsgaDsNCg0KCQkJCQkJCS8vIEFkZCBhbGwgY2hpbGRyZW4gZnJvbSBkaXYgdG8gdGFyZ2V0DQoJCQkJCQkJZWFjaCAoeC5jaGlsZE5vZGVzLCBmdW5jdGlvbihuLCBpKSB7DQoJCQkJCQkJCS8vIFNraXAgYnIgZWxlbWVudA0KCQkJCQkJCQlpZiAoaSkNCgkJCQkJCQkJCWUuYXBwZW5kQ2hpbGQobik7DQoJCQkJCQkJfSk7DQoJCQkJCQl9DQoJCQkJCX07DQoNCgkJCQkJLy8gSUUgaGFzIGEgc2VyaW91cyBidWcgd2hlbiBpdCBjb21lcyB0byBwYXJhZ3JhcGhzIGl0IGNhbiBwcm9kdWNlIGFuIGludmFsaWQNCgkJCQkJLy8gRE9NIHRyZWUgaWYgY29udGVudHMgbGlrZSB0aGlzIDxwPjx1bD48bGk+SXRlbSAxPC9saT48L3VsPjwvcD4gaXMgaW5zZXJ0ZWQNCgkJCQkJLy8gSXQgc2VlbXMgdG8gYmUgdGhhdCBJRSBkb2Vzbid0IGxpa2UgYSByb290IGJsb2NrIGVsZW1lbnQgcGxhY2VkIGluc2lkZSBhbm90aGVyIHJvb3QgYmxvY2sgZWxlbWVudA0KCQkJCQlpZiAodC5zZXR0aW5ncy5maXhfaWVfcGFyYWdyYXBocykNCgkJCQkJCWggPSBoLnJlcGxhY2UoLzxwPjxcL3A+fDxwKFtePl0rKT48XC9wPnw8cFteXC8rXVwvPi9naSwgJzxwJDEgX21jZV9rZWVwPSJ0cnVlIj4mbmJzcDs8L3A+Jyk7DQoNCgkJCQkJc2V0KCk7DQoNCgkJCQkJaWYgKHQuc2V0dGluZ3MuZml4X2llX3BhcmFncmFwaHMpIHsNCgkJCQkJCS8vIENoZWNrIGZvciBvZGQgcGFyYWdyYXBocyB0aGlzIGlzIGEgc2lnbiBvZiBhIGJyb2tlbiBET00NCgkJCQkJCW5sID0gZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicCIpOw0KCQkJCQkJZm9yIChpID0gbmwubGVuZ3RoIC0gMSwgeCA9IDA7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQkJbiA9IG5sW2ldOw0KDQoJCQkJCQkJaWYgKCFuLmhhc0NoaWxkTm9kZXMoKSkgew0KCQkJCQkJCQlpZiAoIW4uX21jZV9rZWVwKSB7DQoJCQkJCQkJCQl4ID0gMTsgLy8gSXMgYnJva2VuDQoJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCW4ucmVtb3ZlQXR0cmlidXRlKCdfbWNlX2tlZXAnKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkvLyBUaW1lIHRvIGZpeCB0aGUgbWFkbmVzcyBJRSBsZWZ0IHVzDQoJCQkJCWlmICh4KSB7DQoJCQkJCQkvLyBTbyBpZiB3ZSByZXBsYWNlIHRoZSBwIGVsZW1lbnRzIHdpdGggZGl2cyBhbmQgbWFyayB0aGVtIGFuZCB0aGVuIHJlcGxhY2UgdGhlbSBiYWNrIHRvIHBhcmFncmFwaHMNCgkJCQkJCS8vIGFmdGVyIHdlIHVzZSBpbm5lckhUTUwgd2UgY2FuIGZpeCB0aGUgRE9NIHRyZWUNCgkJCQkJCWggPSBoLnJlcGxhY2UoLzxwIChbXj5dKyk+fDxwPi9pZywgJzxkaXYgJDEgX21jZV90bXA9IjEiPicpOw0KCQkJCQkJaCA9IGgucmVwbGFjZSgvPFwvcD4vZ2ksICc8L2Rpdj4nKTsNCg0KCQkJCQkJLy8gU2V0IHRoZSBuZXcgSFRNTCB3aXRoIERJVnMNCgkJCQkJCXNldCgpOw0KDQoJCQkJCQkvLyBSZXBsYWNlIGFsbCBESVYgZWxlbWVudHMgd2l0aCB0aGUgX21jZV90bXAgYXR0aWJ1dGUgYmFjayB0byBwYXJhZ3JhcGhzDQoJCQkJCQkvLyBUaGlzIGlzIG5lZWRlZCBzaW5jZSBJRSBoYXMgYSBhbm5veWluZyBidWcgc2VlIGFib3ZlIGZvciBkZXRhaWxzDQoJCQkJCQkvLyBUaGlzIGlzIGEgc2xvdyBwcm9jZXNzIGJ1dCBpdCBoYXMgdG8gYmUgZG9uZS4gOigNCgkJCQkJCWlmICh0LnNldHRpbmdzLmZpeF9pZV9wYXJhZ3JhcGhzKSB7DQoJCQkJCQkJbmwgPSBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJESVYiKTsNCgkJCQkJCQlmb3IgKGkgPSBubC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCQkJCQluID0gbmxbaV07DQoNCgkJCQkJCQkJLy8gSXMgaXQgYSB0ZW1wIGRpdg0KCQkJCQkJCQlpZiAobi5fbWNlX3RtcCkgew0KCQkJCQkJCQkJLy8gQ3JlYXRlIG5ldyBwYXJhZ3JhcGgNCgkJCQkJCQkJCXAgPSB0LmRvYy5jcmVhdGVFbGVtZW50KCdwJyk7DQoNCgkJCQkJCQkJCS8vIENvcHkgYWxsIGF0dHJpYnV0ZXMNCgkJCQkJCQkJCW4uY2xvbmVOb2RlKGZhbHNlKS5vdXRlckhUTUwucmVwbGFjZSgvKFthLXowLTlcLV9dKyk9L2dpLCBmdW5jdGlvbihhLCBiKSB7DQoJCQkJCQkJCQkJdmFyIHY7DQoNCgkJCQkJCQkJCQlpZiAoYiAhPT0gJ19tY2VfdG1wJykgew0KCQkJCQkJCQkJCQl2ID0gbi5nZXRBdHRyaWJ1dGUoYik7DQoNCgkJCQkJCQkJCQkJaWYgKCF2ICYmIGIgPT09ICdjbGFzcycpDQoJCQkJCQkJCQkJCQl2ID0gbi5jbGFzc05hbWU7DQoNCgkJCQkJCQkJCQkJcC5zZXRBdHRyaWJ1dGUoYiwgdik7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfSk7DQoNCgkJCQkJCQkJCS8vIEFwcGVuZCBhbGwgY2hpbGRyZW4gdG8gbmV3IHBhcmFncmFwaA0KCQkJCQkJCQkJZm9yICh4ID0gMDsgeDxuLmNoaWxkTm9kZXMubGVuZ3RoOyB4KyspDQoJCQkJCQkJCQkJcC5hcHBlbmRDaGlsZChuLmNoaWxkTm9kZXNbeF0uY2xvbmVOb2RlKHRydWUpKTsNCg0KCQkJCQkJCQkJLy8gUmVwbGFjZSBkaXYgd2l0aCBuZXcgcGFyYWdyYXBoDQoJCQkJCQkJCQluLnN3YXBOb2RlKHApOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSBlbHNlDQoJCQkJCWUuaW5uZXJIVE1MID0gaDsNCg0KCQkJCXJldHVybiBoOw0KCQkJfSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFByb2Nlc3NlcyB0aGUgSFRNTCBieSByZXBsYWNpbmcgc3Ryb25nLCBlbSwgZGVsIGluIGdlY2tvIHNpbmNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGVtDQoJCSAqIHByb3Blcmx5IGluIGEgUlRFIGVudmlyb25tZW50LiBJdCBhbHNvIGNvbnZlcnRzIGFueSBVUkxzIGluIGxpbmtzIGFuZCBpbWFnZXMgYW5kIHBsYWNlcw0KCQkgKiBhIGNvbnZlcnRlZCB2YWx1ZSBpbnRvIGEgc2VwYXJhdGUgYXR0cmlidXRlIHdpdGggdGhlIG1jZSBwcmVmaXggbGlrZSBfbWNlX3NyYyBvciBfbWNlX2hyZWYuDQoJCSAqDQoJCSAqIEBtZXRob2QgcHJvY2Vzc0hUTUwNCgkJICogQHBhcmFtIHtTdHJpbmd9IGggSFRNTCB0byBwcm9jZXNzLg0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IFByb2Nlc3NlZCBIVE1MIGNvZGUuDQoJCSAqLw0KCQlwcm9jZXNzSFRNTCA6IGZ1bmN0aW9uKGgpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGNvZGVCbG9ja3MgPSBbXTsNCg0KCQkJaWYgKCFzLnByb2Nlc3NfaHRtbCkNCgkJCQlyZXR1cm4gaDsNCg0KCQkJaWYgKGlzSUUpIHsNCgkJCQloID0gaC5yZXBsYWNlKC8mYXBvczsvZywgJyYjMzk7Jyk7IC8vIElFIGNhbid0IGhhbmRsZSBhcG9zDQoJCQkJaCA9IGgucmVwbGFjZSgvXHMrKGRpc2FibGVkfGNoZWNrZWR8cmVhZG9ubHl8c2VsZWN0ZWQpXHMqPVxzKltcIlwnXT8oZmFsc2V8MClbXCJcJ10/L2dpLCAnJyk7IC8vIElFIGRvZXNuJ3QgaGFuZGxlIGRlZmF1bHQgdmFsdWVzIGNvcnJlY3QNCgkJCX0NCg0KCQkJLy8gRm9yY2UgdGFncyBvcGVuLCBhbmQgb24gSUU5IHJlcGxhY2UgJDEkMiB0aGF0IGdvdCBsZWZ0IGJlaGluZCBkdWUgdG8gYnVncyBpbiB0aGVpciBSZWdFeHAgZW5naW5lDQoJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPGEoICkoW14+XSspXC8+fDxhXC8+L2dpLCAnPGEkMSQyPjwvYT4nLCBoKTsgLy8gRm9yY2Ugb3Blbg0KDQoJCQkvLyBTdG9yZSBhd2F5IHNyYyBhbmQgaHJlZiBpbiBfbWNlX3NyYyBhbmQgbWNlX2hyZWYgc2luY2UgYnJvd3NlcnMgbWVzcyB0aGVtIHVwDQoJCQlpZiAocy5rZWVwX3ZhbHVlcykgew0KCQkJCS8vIFdyYXAgc2NyaXB0cyBhbmQgc3R5bGVzIGluIGNvbW1lbnRzIGZvciBzZXJpYWxpemF0aW9uIHB1cnBvc2VzDQoJCQkJaWYgKC88c2NyaXB0fG5vc2NyaXB0fHN0eWxlL2kudGVzdChoKSkgew0KCQkJCQlmdW5jdGlvbiB0cmltKHMpIHsNCgkJCQkJCS8vIFJlbW92ZSBwcmVmaXggYW5kIHN1ZmZpeCBjb2RlIGZvciBlbGVtZW50DQoJCQkJCQlzID0gcy5yZXBsYWNlKC8oPCEtLVxbQ0RBVEFcW3xcXVxdLS0+KS9nLCAnXG4nKTsNCgkJCQkJCXMgPSBzLnJlcGxhY2UoL15bXHJcbl0qfFtcclxuXSokL2csICcnKTsNCgkJCQkJCXMgPSBzLnJlcGxhY2UoL15ccyooXC9cL1xzKjwhLS18XC9cL1xzKjwhXFtDREFUQVxbfDwhLS18PCFcW0NEQVRBXFspW1xyXG5dKi9nLCAnJyk7DQoJCQkJCQlzID0gcy5yZXBsYWNlKC9ccyooXC9cL1xzKlxdXF0+fFwvXC9ccyotLT58XF1cXT58LS0+fFxdXF0tLT4pXHMqJC9nLCAnJyk7DQoNCgkJCQkJCXJldHVybiBzOw0KCQkJCQl9Ow0KDQoJCQkJCS8vIFdyYXAgdGhlIHNjcmlwdCBjb250ZW50cyBpbiBDREFUQSBhbmQga2VlcCB0aGVtIGZyb20gZXhlY3V0aW5nDQoJCQkJCWggPSBoLnJlcGxhY2UoLzxzY3JpcHQoW14+XSt8KT4oW1xzXFNdKj8pPFwvc2NyaXB0Pi9naSwgZnVuY3Rpb24odiwgYXR0cmlicywgdGV4dCkgew0KCQkJCQkJLy8gRm9yY2UgdHlwZSBhdHRyaWJ1dGUNCgkJCQkJCWlmICghYXR0cmlicykNCgkJCQkJCQlhdHRyaWJzID0gJyB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiJzsNCg0KCQkJCQkJLy8gQ29udmVydCB0aGUgc3JjIGF0dHJpYnV0ZSBvZiB0aGUgc2NyaXB0cw0KCQkJCQkJYXR0cmlicyA9IGF0dHJpYnMucmVwbGFjZSgvc3JjPVwiKFteXCJdKylcIj8vaSwgZnVuY3Rpb24oYSwgdXJsKSB7DQoJCQkJCQkJaWYgKHMudXJsX2NvbnZlcnRlcikNCgkJCQkJCQkJdXJsID0gdC5lbmNvZGUocy51cmxfY29udmVydGVyLmNhbGwocy51cmxfY29udmVydGVyX3Njb3BlIHx8IHQsIHQuZGVjb2RlKHVybCksICdzcmMnLCAnc2NyaXB0JykpOw0KDQoJCQkJCQkJcmV0dXJuICdfbWNlX3NyYz0iJyArIHVybCArICciJzsNCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBXcmFwIHRleHQgY29udGVudHMNCgkJCQkJCWlmICh0aW55bWNlLnRyaW0odGV4dCkpIHsNCgkJCQkJCQljb2RlQmxvY2tzLnB1c2godHJpbSh0ZXh0KSk7DQoJCQkJCQkJdGV4dCA9ICc8IS0tXG5NQ0VfU0NSSVBUOicgKyAoY29kZUJsb2Nrcy5sZW5ndGggLSAxKSArICdcbi8vIC0tPic7DQoJCQkJCQl9DQoNCgkJCQkJCXJldHVybiAnPG1jZTpzY3JpcHQnICsgYXR0cmlicyArICc+JyArIHRleHQgKyAnPC9tY2U6c2NyaXB0Pic7DQoJCQkJCX0pOw0KDQoJCQkJCS8vIFdyYXAgc3R5bGUgZWxlbWVudHMNCgkJCQkJaCA9IGgucmVwbGFjZSgvPHN0eWxlKFtePl0rfCk+KFtcc1xTXSo/KTxcL3N0eWxlPi9naSwgZnVuY3Rpb24odiwgYXR0cmlicywgdGV4dCkgew0KCQkJCQkJLy8gV3JhcCB0ZXh0IGNvbnRlbnRzDQoJCQkJCQlpZiAodGV4dCkgew0KCQkJCQkJCWNvZGVCbG9ja3MucHVzaCh0cmltKHRleHQpKTsNCgkJCQkJCQl0ZXh0ID0gJzwhLS1cbk1DRV9TQ1JJUFQ6JyArIChjb2RlQmxvY2tzLmxlbmd0aCAtIDEpICsgJ1xuLS0+JzsNCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuICc8bWNlOnN0eWxlJyArIGF0dHJpYnMgKyAnPicgKyB0ZXh0ICsgJzwvbWNlOnN0eWxlPjxzdHlsZSAnICsgYXR0cmlicyArICcgX21jZV9ib2d1cz0iMSI+JyArIHRleHQgKyAnPC9zdHlsZT4nOw0KCQkJCQl9KTsNCg0KCQkJCQkvLyBXcmFwIG5vc2NyaXB0IGVsZW1lbnRzDQoJCQkJCWggPSBoLnJlcGxhY2UoLzxub3NjcmlwdChbXj5dK3wpPihbXHNcU10qPyk8XC9ub3NjcmlwdD4vZywgZnVuY3Rpb24odiwgYXR0cmlicywgdGV4dCkgew0KCQkJCQkJcmV0dXJuICc8bWNlOm5vc2NyaXB0JyArIGF0dHJpYnMgKyAnPjwhLS0nICsgdC5lbmNvZGUodGV4dCkucmVwbGFjZSgvLS0vZywgJyYjNDU7JiM0NTsnKSArICctLT48L21jZTpub3NjcmlwdD4nOw0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKylcXVxdPi9nLCAnPCEtLVtDREFUQVskMV1dLS0+JywgaCk7DQoNCgkJCQkvLyBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgYXR0cmlidXRlcyBpbiB0aGUgSFRNTCBzdHJpbmcgdG8gZm9yY2UgYm9vbGVhbg0KCQkJCS8vIGF0dHJpYnV0ZXMgdG8gdGhlIGF0dHI9ImF0dHIiIGZvcm1hdCBhbmQgY29udmVydCBzdHlsZSwgc3JjIGFuZCBocmVmIHRvIF9tY2VfIHZlcnNpb25zDQoJCQkJZnVuY3Rpb24gcHJvY2Vzc1RhZ3MoaHRtbCkgew0KCQkJCQlyZXR1cm4gaHRtbC5yZXBsYWNlKHRhZ1JlZ0V4cCwgZnVuY3Rpb24obWF0Y2gsIGVsbV9uYW1lLCBhdHRycywgZW5kKSB7DQoJCQkJCQlyZXR1cm4gJzwnICsgZWxtX25hbWUgKyBhdHRycy5yZXBsYWNlKGF0dHJSZWdFeHAsIGZ1bmN0aW9uKG1hdGNoLCBuYW1lLCB2YWx1ZSwgdmFsMiwgdmFsMykgew0KCQkJCQkJCXZhciBtY2VWYWx1ZTsNCg0KCQkJCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7DQoJCQkJCQkJdmFsdWUgPSB2YWx1ZSB8fCB2YWwyIHx8IHZhbDMgfHwgIiI7DQoNCgkJCQkJCQkvLyBUcmVhdCBib29sZWFuIGF0dHJpYnV0ZXMNCgkJCQkJCQlpZiAoYm9vbEF0dHJzW25hbWVdKSB7DQoJCQkJCQkJCS8vIGZhbHNlIG9yIDAgaXMgdHJlYXRlZCBhcyBhIG1pc3NpbmcgYXR0cmlidXRlDQoJCQkJCQkJCWlmICh2YWx1ZSA9PT0gJ2ZhbHNlJyB8fCB2YWx1ZSA9PT0gJzAnKQ0KCQkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJCXJldHVybiBuYW1lICsgJz0iJyArIG5hbWUgKyAnIic7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gSXMgYXR0cmlidXRlIG9uZSB0aGF0IG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50DQoJCQkJCQkJaWYgKG1jZUF0dHJpYnNbbmFtZV0gJiYgYXR0cnMuaW5kZXhPZignX21jZV8nICsgbmFtZSkgPT0gLTEpIHsNCgkJCQkJCQkJbWNlVmFsdWUgPSB0LmRlY29kZSh2YWx1ZSk7DQoNCgkJCQkJCQkJLy8gQ29udmVydCBVUkxzIHRvIHJlbGF0aXZlL2Fic29sdXRlIG9uZXMNCgkJCQkJCQkJaWYgKHMudXJsX2NvbnZlcnRlciAmJiAobmFtZSA9PSAic3JjIiB8fCBuYW1lID09ICJocmVmIikpDQoJCQkJCQkJCQltY2VWYWx1ZSA9IHMudXJsX2NvbnZlcnRlci5jYWxsKHMudXJsX2NvbnZlcnRlcl9zY29wZSB8fCB0LCBtY2VWYWx1ZSwgbmFtZSwgZWxtX25hbWUpOw0KDQoJCQkJCQkJCS8vIFByb2Nlc3Mgc3R5bGVzIGxvd2VyY2FzZXMgdGhlbSBhbmQgY29tcHJlc3NlcyB0aGVtDQoJCQkJCQkJCWlmIChuYW1lID09ICdzdHlsZScpDQoJCQkJCQkJCQltY2VWYWx1ZSA9IHQuc2VyaWFsaXplU3R5bGUodC5wYXJzZVN0eWxlKG1jZVZhbHVlKSwgbmFtZSk7DQoNCgkJCQkJCQkJcmV0dXJuIG5hbWUgKyAnPSInICsgdmFsdWUgKyAnIicgKyAnIF9tY2VfJyArIG5hbWUgKyAnPSInICsgdC5lbmNvZGUobWNlVmFsdWUpICsgJyInOw0KCQkJCQkJCX0NCg0KCQkJCQkJCXJldHVybiBtYXRjaDsNCgkJCQkJCX0pICsgZW5kICsgJz4nOw0KCQkJCQl9KTsNCgkJCQl9Ow0KDQoJCQkJaCA9IHByb2Nlc3NUYWdzKGgpOw0KDQoJCQkJLy8gUmVzdG9yZSBzY3JpcHQgYmxvY2tzDQoJCQkJaCA9IGgucmVwbGFjZSgvTUNFX1NDUklQVDooWzAtOV0rKS9nLCBmdW5jdGlvbih2YWwsIGlkeCkgew0KCQkJCQlyZXR1cm4gY29kZUJsb2Nrc1tpZHhdOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlyZXR1cm4gaDsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0aGUgb3V0ZXIgSFRNTCBvZiBhbiBlbGVtZW50Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldE91dGVySFRNTA0KCQkgKiBAcGFyYW0ge1N0cmluZy9FbGVtZW50fSBlIEVsZW1lbnQgSUQgb3IgZWxlbWVudCBvYmplY3QgdG8gZ2V0IG91dGVyIEhUTUwgZnJvbS4NCgkJICogQHJldHVybiB7U3RyaW5nfSBPdXRlciBIVE1MIHN0cmluZy4NCgkJICovDQoJCWdldE91dGVySFRNTCA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciBkOw0KDQoJCQllID0gdGhpcy5nZXQoZSk7DQoNCgkJCWlmICghZSkNCgkJCQlyZXR1cm4gbnVsbDsNCg0KCQkJaWYgKGUub3V0ZXJIVE1MICE9PSB1bmRlZmluZWQpDQoJCQkJcmV0dXJuIGUub3V0ZXJIVE1MOw0KDQoJCQlkID0gKGUub3duZXJEb2N1bWVudCB8fCB0aGlzLmRvYykuY3JlYXRlRWxlbWVudCgiYm9keSIpOw0KCQkJZC5hcHBlbmRDaGlsZChlLmNsb25lTm9kZSh0cnVlKSk7DQoNCgkJCXJldHVybiBkLmlubmVySFRNTDsNCgkJfSwNCg0KCQkvKioNCgkJICogU2V0cyB0aGUgc3BlY2lmaWVkIG91dGVyIEhUTUwgb24gYSBlbGVtZW50IG9yIGVsZW1lbnRzLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldE91dGVySFRNTA0KCQkgKiBAcGFyYW0ge0VsZW1lbnQvU3RyaW5nL0FycmF5fSBlIERPTSBlbGVtZW50LCBlbGVtZW50IGlkIHN0cmluZyBvciBhcnJheSBvZiBlbGVtZW50cy9pZHMgdG8gc2V0IG91dGVyIEhUTUwgb24uDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBoIEhUTUwgY29kZSB0byBzZXQgYXMgb3V0ZXIgdmFsdWUgZm9yIHRoZSBlbGVtZW50Lg0KCQkgKiBAcGFyYW0ge0RvY3VtZW50fSBkIE9wdGlvbmFsIGRvY3VtZW50IHNjb3BlIHRvIHVzZSBpbiB0aGlzIHByb2Nlc3MgZGVmYXVsdHMgdG8gdGhlIGRvY3VtZW50IG9mIHRoZSBET00gY2xhc3MuDQoJCSAqLw0KCQlzZXRPdXRlckhUTUwgOiBmdW5jdGlvbihlLCBoLCBkKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWZ1bmN0aW9uIHNldEhUTUwoZSwgaCwgZCkgew0KCQkJCXZhciBuLCB0cDsNCg0KCQkJCXRwID0gZC5jcmVhdGVFbGVtZW50KCJib2R5Iik7DQoJCQkJdHAuaW5uZXJIVE1MID0gaDsNCg0KCQkJCW4gPSB0cC5sYXN0Q2hpbGQ7DQoJCQkJd2hpbGUgKG4pIHsNCgkJCQkJdC5pbnNlcnRBZnRlcihuLmNsb25lTm9kZSh0cnVlKSwgZSk7DQoJCQkJCW4gPSBuLnByZXZpb3VzU2libGluZzsNCgkJCQl9DQoNCgkJCQl0LnJlbW92ZShlKTsNCgkJCX07DQoNCgkJCXJldHVybiB0aGlzLnJ1bihlLCBmdW5jdGlvbihlKSB7DQoJCQkJZSA9IHQuZ2V0KGUpOw0KDQoJCQkJLy8gT25seSBzZXQgSFRNTCBvbiBlbGVtZW50cw0KCQkJCWlmIChlLm5vZGVUeXBlID09IDEpIHsNCgkJCQkJZCA9IGQgfHwgZS5vd25lckRvY3VtZW50IHx8IHQuZG9jOw0KDQoJCQkJCWlmIChpc0lFKSB7DQoJCQkJCQl0cnkgew0KCQkJCQkJCS8vIFRyeSBvdXRlckhUTUwgZm9yIElFIGl0IHNvbWV0aW1lcyBwcm9kdWNlcyBhbiB1bmtub3duIHJ1bnRpbWUgZXJyb3INCgkJCQkJCQlpZiAoaXNJRSAmJiBlLm5vZGVUeXBlID09IDEpDQoJCQkJCQkJCWUub3V0ZXJIVE1MID0gaDsNCgkJCQkJCQllbHNlDQoJCQkJCQkJCXNldEhUTUwoZSwgaCwgZCk7DQoJCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJCS8vIEZpeCBmb3IgdW5rbm93biBydW50aW1lIGVycm9yDQoJCQkJCQkJc2V0SFRNTChlLCBoLCBkKTsNCgkJCQkJCX0NCgkJCQkJfSBlbHNlDQoJCQkJCQlzZXRIVE1MKGUsIGgsIGQpOw0KCQkJCX0NCgkJCX0pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBFbnRpdHkgZGVjb2RlIGEgc3RyaW5nLCByZXNvbHZlcyBhbnkgSFRNTCBlbnRpdGllcyBsaWtlICZhcmluZzsuDQoJCSAqDQoJCSAqIEBtZXRob2QgZGVjb2RlDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBzIFN0cmluZyB0byBkZWNvZGUgZW50aXRpZXMgb24uDQoJCSAqIEByZXR1cm4ge1N0cmluZ30gRW50aXR5IGRlY29kZWQgc3RyaW5nLg0KCQkgKi8NCgkJZGVjb2RlIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIGUsIG4sIHY7DQoNCgkJCS8vIExvb2sgZm9yIGVudGl0aWVzIHRvIGRlY29kZQ0KCQkJaWYgKC8mW1x3I10rOy8udGVzdChzKSkgew0KCQkJCS8vIERlY29kZSB0aGUgZW50aXRpZXMgdXNpbmcgYSBkaXYgZWxlbWVudCBub3Qgc3VwZXIgZWZmaWNpZW50IGJ1dCBsZXNzIGNvZGUNCgkJCQllID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJCQkJZS5pbm5lckhUTUwgPSBzOw0KCQkJCW4gPSBlLmZpcnN0Q2hpbGQ7DQoJCQkJdiA9ICcnOw0KDQoJCQkJaWYgKG4pIHsNCgkJCQkJZG8gew0KCQkJCQkJdiArPSBuLm5vZGVWYWx1ZTsNCgkJCQkJfSB3aGlsZSAobiA9IG4ubmV4dFNpYmxpbmcpOw0KCQkJCX0NCg0KCQkJCXJldHVybiB2IHx8IHM7DQoJCQl9DQoNCgkJCXJldHVybiBzOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBFbnRpdHkgZW5jb2RlcyBhIHN0cmluZywgZW5jb2RlcyB0aGUgbW9zdCBjb21tb24gZW50aXRpZXMgPD4iJiBpbnRvIGVudGl0aWVzLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGVuY29kZQ0KCQkgKiBAcGFyYW0ge1N0cmluZ30gcyBTdHJpbmcgdG8gZW5jb2RlIHdpdGggZW50aXRpZXMuDQoJCSAqIEByZXR1cm4ge1N0cmluZ30gRW50aXR5IGVuY29kZWQgc3RyaW5nLg0KCQkgKi8NCgkJZW5jb2RlIDogZnVuY3Rpb24oc3RyKSB7DQoJCQlyZXR1cm4gKCcnICsgc3RyKS5yZXBsYWNlKGVuY29kZUNoYXJzUmUsIGZ1bmN0aW9uKGNocikgew0KCQkJCXJldHVybiBlbmNvZGVkQ2hhcnNbY2hyXTsNCgkJCX0pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBJbnNlcnRzIGEgZWxlbWVudCBhZnRlciB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuDQoJCSAqDQoJCSAqIEBtZXRob2QgaW5zZXJ0QWZ0ZXINCgkJICogQHBhcmFtIHtFbGVtZW50fSBub2RlIEVsZW1lbnQgdG8gaW5zZXJ0IGFmdGVyIHRoZSByZWZlcmVuY2UuDQoJCSAqIEBwYXJhbSB7RWxlbWVudC9TdHJpbmcvQXJyYXl9IHJlZmVyZW5jZV9ub2RlIFJlZmVyZW5jZSBlbGVtZW50LCBlbGVtZW50IGlkIG9yIGFycmF5IG9mIGVsZW1lbnRzIHRvIGluc2VydCBhZnRlci4NCgkJICogQHJldHVybiB7RWxlbWVudC9BcnJheX0gRWxlbWVudCB0aGF0IGdvdCBhZGRlZCBvciBhbiBhcnJheSB3aXRoIGVsZW1lbnRzLiANCgkJICovDQoJCWluc2VydEFmdGVyIDogZnVuY3Rpb24obm9kZSwgcmVmZXJlbmNlX25vZGUpIHsNCgkJCXJlZmVyZW5jZV9ub2RlID0gdGhpcy5nZXQocmVmZXJlbmNlX25vZGUpOw0KDQoJCQlyZXR1cm4gdGhpcy5ydW4obm9kZSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCXZhciBwYXJlbnQsIG5leHRTaWJsaW5nOw0KDQoJCQkJcGFyZW50ID0gcmVmZXJlbmNlX25vZGUucGFyZW50Tm9kZTsNCgkJCQluZXh0U2libGluZyA9IHJlZmVyZW5jZV9ub2RlLm5leHRTaWJsaW5nOw0KDQoJCQkJaWYgKG5leHRTaWJsaW5nKQ0KCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHRTaWJsaW5nKTsNCgkJCQllbHNlDQoJCQkJCXBhcmVudC5hcHBlbmRDaGlsZChub2RlKTsNCg0KCQkJCXJldHVybiBub2RlOw0KCQkJfSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdHJ1ZS9mYWxzZSBpZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgYSBibG9jayBlbGVtZW50IG9yIG5vdC4NCgkJICoNCgkJICogQG1ldGhvZCBpc0Jsb2NrDQoJCSAqIEBwYXJhbSB7Tm9kZX0gbiBFbGVtZW50L05vZGUgdG8gY2hlY2suDQoJCSAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUvRmFsc2Ugc3RhdGUgaWYgdGhlIG5vZGUgaXMgYSBibG9jayBlbGVtZW50IG9yIG5vdC4NCgkJICovDQoJCWlzQmxvY2sgOiBmdW5jdGlvbihuKSB7DQoJCQlpZiAobi5ub2RlVHlwZSAmJiBuLm5vZGVUeXBlICE9PSAxKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJbiA9IG4ubm9kZU5hbWUgfHwgbjsNCg0KCQkJcmV0dXJuIGJsb2NrUmUudGVzdChuKTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVwbGFjZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50IG9yIGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50LCB0aGUgbmV3IGVsZW1lbnQgd2lsbA0KCQkgKiBiZSBjbG9uZWQgaWYgbXVsdGlwbGUgaW5wdXRzIGVsZW1lbnRzIGFyZSBwYXNzZWQuDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVwbGFjZQ0KCQkgKiBAcGFyYW0ge0VsZW1lbnR9IG4gTmV3IGVsZW1lbnQgdG8gcmVwbGFjZSBvbGQgb25lcyB3aXRoLg0KCQkgKiBAcGFyYW0ge0VsZW1lbnQvU3RyaW5nL0FycmF5fSBvIEVsZW1lbnQgRE9NIG5vZGUsIGVsZW1lbnQgaWQgb3IgYXJyYXkgb2YgZWxlbWVudHMgb3IgaWRzIHRvIHJlcGxhY2UuDQoJCSAqIEBwYXJhbSB7Qm9vbGVhbn0gayBPcHRpb25hbCBrZWVwIGNoaWxkcmVuIHN0YXRlLCBpZiBzZXQgdG8gdHJ1ZSBjaGlsZCBub2RlcyBmcm9tIHRoZSBvbGQgb2JqZWN0IHdpbGwgYmUgYWRkZWQgdG8gbmV3IG9uZXMuDQoJCSAqLw0KCQlyZXBsYWNlIDogZnVuY3Rpb24obiwgbywgaykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoaXMobywgJ2FycmF5JykpDQoJCQkJbiA9IG4uY2xvbmVOb2RlKHRydWUpOw0KDQoJCQlyZXR1cm4gdC5ydW4obywgZnVuY3Rpb24obykgew0KCQkJCWlmIChrKSB7DQoJCQkJCWVhY2godGlueW1jZS5ncmVwKG8uY2hpbGROb2RlcyksIGZ1bmN0aW9uKGMpIHsNCgkJCQkJCW4uYXBwZW5kQ2hpbGQoYyk7DQoJCQkJCX0pOw0KCQkJCX0NCg0KCQkJCXJldHVybiBvLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sIG8pOw0KCQkJfSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJlbmFtZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIGEgbmV3IG5hbWUgYW5kIGtlZXAgaXQncyBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlbi4NCgkJICoNCgkJICogQG1ldGhvZCByZW5hbWUNCgkJICogQHBhcmFtIHtFbGVtZW50fSBlbG0gRWxlbWVudCB0byByZW5hbWUuDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIG5ldyBlbGVtZW50Lg0KCQkgKiBAcmV0dXJuIE5ldyBlbGVtZW50IG9yIHRoZSBvbGQgZWxlbWVudCBpZiBpdCBuZWVkZWQgcmVuYW1pbmcuDQoJCSAqLw0KCQlyZW5hbWUgOiBmdW5jdGlvbihlbG0sIG5hbWUpIHsNCgkJCXZhciB0ID0gdGhpcywgbmV3RWxtOw0KDQoJCQlpZiAoZWxtLm5vZGVOYW1lICE9IG5hbWUudG9VcHBlckNhc2UoKSkgew0KCQkJCS8vIFJlbmFtZSBibG9jayBlbGVtZW50DQoJCQkJbmV3RWxtID0gdC5jcmVhdGUobmFtZSk7DQoNCgkJCQkvLyBDb3B5IGF0dHJpYnMgdG8gbmV3IGJsb2NrDQoJCQkJZWFjaCh0LmdldEF0dHJpYnMoZWxtKSwgZnVuY3Rpb24oYXR0cl9ub2RlKSB7DQoJCQkJCXQuc2V0QXR0cmliKG5ld0VsbSwgYXR0cl9ub2RlLm5vZGVOYW1lLCB0LmdldEF0dHJpYihlbG0sIGF0dHJfbm9kZS5ub2RlTmFtZSkpOw0KCQkJCX0pOw0KDQoJCQkJLy8gUmVwbGFjZSBibG9jaw0KCQkJCXQucmVwbGFjZShuZXdFbG0sIGVsbSwgMSk7DQoJCQl9DQoNCgkJCXJldHVybiBuZXdFbG0gfHwgZWxtOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBGaW5kIHRoZSBjb21tb24gYW5jZXN0b3Igb2YgdHdvIGVsZW1lbnRzLiBUaGlzIGlzIGEgc2hvcnRlciBtZXRob2QgdGhhbiB1c2luZyB0aGUgRE9NIFJhbmdlIGxvZ2ljLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGZpbmRDb21tb25BbmNlc3Rvcg0KCQkgKiBAcGFyYW0ge0VsZW1lbnR9IGEgRWxlbWVudCB0byBmaW5kIGNvbW1vbiBhbmNlc3RvciBvZi4NCgkJICogQHBhcmFtIHtFbGVtZW50fSBiIEVsZW1lbnQgdG8gZmluZCBjb21tb24gYW5jZXN0b3Igb2YuDQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IENvbW1vbiBhbmNlc3RvciBlbGVtZW50IG9mIHRoZSB0d28gaW5wdXQgZWxlbWVudHMuDQoJCSAqLw0KCQlmaW5kQ29tbW9uQW5jZXN0b3IgOiBmdW5jdGlvbihhLCBiKSB7DQoJCQl2YXIgcHMgPSBhLCBwZTsNCg0KCQkJd2hpbGUgKHBzKSB7DQoJCQkJcGUgPSBiOw0KDQoJCQkJd2hpbGUgKHBlICYmIHBzICE9IHBlKQ0KCQkJCQlwZSA9IHBlLnBhcmVudE5vZGU7DQoNCgkJCQlpZiAocHMgPT0gcGUpDQoJCQkJCWJyZWFrOw0KDQoJCQkJcHMgPSBwcy5wYXJlbnROb2RlOw0KCQkJfQ0KDQoJCQlpZiAoIXBzICYmIGEub3duZXJEb2N1bWVudCkNCgkJCQlyZXR1cm4gYS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCg0KCQkJcmV0dXJuIHBzOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBSR0IgY29sb3IgdmFsdWUgYW5kIHJldHVybnMgYSBoZXggdmVyc2lvbiBvZiB0aGF0IGNvbG9yLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHRvSGV4DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBzIFJHQiBzdHJpbmcgdmFsdWUgbGlrZSByZ2IoMSwyLDMpDQoJCSAqIEByZXR1cm4ge1N0cmluZ30gSGV4IHZlcnNpb24gb2YgdGhhdCBSR0IgdmFsdWUgbGlrZSAjRkYwMEZGLg0KCQkgKi8NCgkJdG9IZXggOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgYyA9IC9eXHMqcmdiXHMqP1woXHMqPyhbMC05XSspXHMqPyxccyo/KFswLTldKylccyo/LFxzKj8oWzAtOV0rKVxzKj9cKVxzKiQvaS5leGVjKHMpOw0KDQoJCQlmdW5jdGlvbiBoZXgocykgew0KCQkJCXMgPSBwYXJzZUludChzKS50b1N0cmluZygxNik7DQoNCgkJCQlyZXR1cm4gcy5sZW5ndGggPiAxID8gcyA6ICcwJyArIHM7IC8vIDAgLT4gMDANCgkJCX07DQoNCgkJCWlmIChjKSB7DQoJCQkJcyA9ICcjJyArIGhleChjWzFdKSArIGhleChjWzJdKSArIGhleChjWzNdKTsNCg0KCQkJCXJldHVybiBzOw0KCQkJfQ0KDQoJCQlyZXR1cm4gczsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyBhIGFycmF5IG9mIGFsbCBzaW5nbGUgQ1NTIGNsYXNzZXMgaW4gdGhlIGRvY3VtZW50LiBBIHNpbmdsZSBDU1MgY2xhc3MgaXMgYSBzaW1wbGUNCgkJICogcnVsZSBsaWtlICIuY2xhc3MiIGNvbXBsZXggb25lcyBsaWtlICJkaXYgdGQuY2xhc3MiIHdpbGwgbm90IGJlIGFkZGVkIHRvIG91dHB1dC4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRDbGFzc2VzDQoJCSAqIEByZXR1cm4ge0FycmF5fSBBcnJheSB3aXRoIGNsYXNzIG9iamVjdHMgZWFjaCBvYmplY3QgaGFzIGEgY2xhc3MgZmllbGQgbWlnaHQgYmUgb3RoZXIgZmllbGRzIGluIHRoZSBmdXR1cmUuDQoJCSAqLw0KCQlnZXRDbGFzc2VzIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNsID0gW10sIGksIGxvID0ge30sIGYgPSB0LnNldHRpbmdzLmNsYXNzX2ZpbHRlciwgb3Y7DQoNCgkJCWlmICh0LmNsYXNzZXMpDQoJCQkJcmV0dXJuIHQuY2xhc3NlczsNCg0KCQkJZnVuY3Rpb24gYWRkQ2xhc3NlcyhzKSB7DQoJCQkJLy8gSUUgc3R5bGUgaW1wb3J0cw0KCQkJCWVhY2gocy5pbXBvcnRzLCBmdW5jdGlvbihyKSB7DQoJCQkJCWFkZENsYXNzZXMocik7DQoJCQkJfSk7DQoNCgkJCQllYWNoKHMuY3NzUnVsZXMgfHwgcy5ydWxlcywgZnVuY3Rpb24ocikgew0KCQkJCQkvLyBSZWFsIHR5cGUgb3IgZmFrZSBpdCBvbiBJRQ0KCQkJCQlzd2l0Y2ggKHIudHlwZSB8fCAxKSB7DQoJCQkJCQkvLyBSdWxlDQoJCQkJCQljYXNlIDE6DQoJCQkJCQkJaWYgKHIuc2VsZWN0b3JUZXh0KSB7DQoJCQkJCQkJCWVhY2goci5zZWxlY3RvclRleHQuc3BsaXQoJywnKSwgZnVuY3Rpb24odikgew0KCQkJCQkJCQkJdiA9IHYucmVwbGFjZSgvXlxzKnxccyokfF5cc1wuL2csICIiKTsNCg0KCQkJCQkJCQkJLy8gSXMgaW50ZXJuYWwgb3IgaXQgZG9lc24ndCBjb250YWluIGEgY2xhc3MNCgkJCQkJCQkJCWlmICgvXC5tY2UvLnRlc3QodikgfHwgIS9cLltcd1wtXSskLy50ZXN0KHYpKQ0KCQkJCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJCQkJLy8gUmVtb3ZlIGV2ZXJ5dGhpbmcgYnV0IGNsYXNzIG5hbWUNCgkJCQkJCQkJCW92ID0gdjsNCgkJCQkJCQkJCXYgPSB0aW55bWNlLl9yZXBsYWNlKC8uKlwuKFthLXowLTlfXC1dKykuKi9pLCAnJDEnLCB2KTsNCg0KCQkJCQkJCQkJLy8gRmlsdGVyIGNsYXNzZXMNCgkJCQkJCQkJCWlmIChmICYmICEodiA9IGYodiwgb3YpKSkNCgkJCQkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCQkJCWlmICghbG9bdl0pIHsNCgkJCQkJCQkJCQljbC5wdXNoKHsnY2xhc3MnIDogdn0pOw0KCQkJCQkJCQkJCWxvW3ZdID0gMTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfSk7DQoJCQkJCQkJfQ0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQkvLyBJbXBvcnQNCgkJCQkJCWNhc2UgMzoNCgkJCQkJCQlhZGRDbGFzc2VzKHIuc3R5bGVTaGVldCk7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX07DQoNCgkJCXRyeSB7DQoJCQkJZWFjaCh0LmRvYy5zdHlsZVNoZWV0cywgYWRkQ2xhc3Nlcyk7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJCS8vIElnbm9yZQ0KCQkJfQ0KDQoJCQlpZiAoY2wubGVuZ3RoID4gMCkNCgkJCQl0LmNsYXNzZXMgPSBjbDsNCg0KCQkJcmV0dXJuIGNsOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIG9uIHRoZSBlbGVtZW50IGJ5IGlkIG9yIGRvbSBlbGVtZW50IG5vZGUgb3IgYXJyYXkgb2YgZWxlbWVudHMvaWQuDQoJCSAqDQoJCSAqIEBtZXRob2QgcnVuDQoJCSAqIEBwYXJhbSB7U3RyaW5nL0VsZW1lbnQvQXJyYXl9IEVsZW1lbnQgSUQgb3IgRE9NIGVsZW1lbnQgb2JqZWN0IG9yIGFycmF5IHdpdGggaWRzIG9yIGVsZW1lbnRzLg0KCQkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmIEZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggaXRlbS4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgc2NvcGUgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW4uDQoJCSAqIEByZXR1cm4ge09iamVjdC9BcnJheX0gU2luZ2xlIG9iamVjdCBvciBhcnJheSB3aXRoIG9iamVjdHMgZGVwZW5kaW5nIG9uIG11bHRpcGxlIGlucHV0IG9yIG5vdC4NCgkJICovDQoJCXJ1biA6IGZ1bmN0aW9uKGUsIGYsIHMpIHsNCgkJCXZhciB0ID0gdGhpcywgbzsNCg0KCQkJaWYgKHQuZG9jICYmIHR5cGVvZihlKSA9PT0gJ3N0cmluZycpDQoJCQkJZSA9IHQuZ2V0KGUpOw0KDQoJCQlpZiAoIWUpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQlzID0gcyB8fCB0aGlzOw0KCQkJaWYgKCFlLm5vZGVUeXBlICYmIChlLmxlbmd0aCB8fCBlLmxlbmd0aCA9PT0gMCkpIHsNCgkJCQlvID0gW107DQoNCgkJCQllYWNoKGUsIGZ1bmN0aW9uKGUsIGkpIHsNCgkJCQkJaWYgKGUpIHsNCgkJCQkJCWlmICh0eXBlb2YoZSkgPT0gJ3N0cmluZycpDQoJCQkJCQkJZSA9IHQuZG9jLmdldEVsZW1lbnRCeUlkKGUpOw0KDQoJCQkJCQlvLnB1c2goZi5jYWxsKHMsIGUsIGkpKTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIG87DQoJCQl9DQoNCgkJCXJldHVybiBmLmNhbGwocywgZSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgYW4gTm9kZUxpc3Qgd2l0aCBhdHRyaWJ1dGVzIGZvciB0aGUgZWxlbWVudC4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRBdHRyaWJzDQoJCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnQvc3RyaW5nfSBuIEVsZW1lbnQgbm9kZSBvciBzdHJpbmcgaWQgdG8gZ2V0IGF0dHJpYnV0ZXMgZnJvbS4NCgkJICogQHJldHVybiB7Tm9kZUxpc3R9IE5vZGVMaXN0IHdpdGggYXR0cmlidXRlcy4NCgkJICovDQoJCWdldEF0dHJpYnMgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgbzsNCg0KCQkJbiA9IHRoaXMuZ2V0KG4pOw0KDQoJCQlpZiAoIW4pDQoJCQkJcmV0dXJuIFtdOw0KDQoJCQlpZiAoaXNJRSkgew0KCQkJCW8gPSBbXTsNCg0KCQkJCS8vIE9iamVjdCB3aWxsIHRocm93IGV4Y2VwdGlvbiBpbiBJRQ0KCQkJCWlmIChuLm5vZGVOYW1lID09ICdPQkpFQ1QnKQ0KCQkJCQlyZXR1cm4gbi5hdHRyaWJ1dGVzOw0KDQoJCQkJLy8gSUUgZG9lc24ndCBrZWVwIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgaWYgeW91IGNsb25lIG9wdGlvbiBlbGVtZW50cw0KCQkJCWlmIChuLm5vZGVOYW1lID09PSAnT1BUSU9OJyAmJiB0aGlzLmdldEF0dHJpYihuLCAnc2VsZWN0ZWQnKSkNCgkJCQkJby5wdXNoKHtzcGVjaWZpZWQgOiAxLCBub2RlTmFtZSA6ICdzZWxlY3RlZCd9KTsNCg0KCQkJCS8vIEl0J3MgY3JhenkgdGhhdCB0aGlzIGlzIGZhc3RlciBpbiBJRSBidXQgaXQncyBiZWNhdXNlIGl0IHJldHVybnMgYWxsIGF0dHJpYnV0ZXMgYWxsIHRoZSB0aW1lDQoJCQkJbi5jbG9uZU5vZGUoZmFsc2UpLm91dGVySFRNTC5yZXBsYWNlKC88XC8/W1x3OlwtXSsgP3w9W1wiXVteXCJdK1wifD1cJ1teXCddK1wnfD1bXHdcLV0rfD4vZ2ksICcnKS5yZXBsYWNlKC9bXHc6XC1dKy9naSwgZnVuY3Rpb24oYSkgew0KCQkJCQlvLnB1c2goe3NwZWNpZmllZCA6IDEsIG5vZGVOYW1lIDogYX0pOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIG87DQoJCQl9DQoNCgkJCXJldHVybiBuLmF0dHJpYnV0ZXM7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIERlc3Ryb3lzIGFsbCBpbnRlcm5hbCByZWZlcmVuY2VzIHRvIHRoZSBET00gdG8gc29sdmUgSUUgbGVhayBpc3N1ZXMuDQoJCSAqDQoJCSAqIEBtZXRob2QgZGVzdHJveQ0KCQkgKi8NCgkJZGVzdHJveSA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKHQuZXZlbnRzKQ0KCQkJCXQuZXZlbnRzLmRlc3Ryb3koKTsNCg0KCQkJdC53aW4gPSB0LmRvYyA9IHQucm9vdCA9IHQuZXZlbnRzID0gbnVsbDsNCg0KCQkJLy8gTWFudWFsIGRlc3Ryb3kgdGhlbiByZW1vdmUgdW5sb2FkIGhhbmRsZXINCgkJCWlmICghcykNCgkJCQl0aW55bWNlLnJlbW92ZVVubG9hZCh0LmRlc3Ryb3kpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDcmVhdGVkIGEgbmV3IERPTSBSYW5nZSBvYmplY3QuIFRoaXMgd2lsbCB1c2UgdGhlIG5hdGl2ZSBET00gUmFuZ2UgQVBJIGlmIGl0J3MNCgkJICogYXZhaWxhYmxlIGlmIGl0J3Mgbm90IGl0IHdpbGwgZmFsbGJhY2sgdG8gdGhlIGN1c3RvbSBUaW55TUNFIGltcGxlbWVudGF0aW9uLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGNyZWF0ZVJuZw0KCQkgKiBAcmV0dXJuIHtET01SYW5nZX0gRE9NIFJhbmdlIG9iamVjdC4NCgkJICovDQoJCWNyZWF0ZVJuZyA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGQgPSB0aGlzLmRvYzsNCg0KCQkJcmV0dXJuIGQuY3JlYXRlUmFuZ2UgPyBkLmNyZWF0ZVJhbmdlKCkgOiBuZXcgdGlueW1jZS5kb20uUmFuZ2UodGhpcyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgbm9kZSB3aXRoaW4gaXQncyBwYXJlbnQuDQoJCSAqDQoJCSAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIGxvb2sgZm9yLg0KCQkgKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZWQgT3B0aW9uYWwgdHJ1ZS9mYWxzZSBzdGF0ZSBpZiB0aGUgaW5kZXggaXMgd2hhdCBpdCB3b3VsZCBiZSBhZnRlciBhIG5vcm1hbGl6YXRpb24uDQoJCSAqIEByZXR1cm4ge051bWJlcn0gSW5kZXggb2YgdGhlIHNwZWNpZmllZCBub2RlLg0KCQkgKi8NCgkJbm9kZUluZGV4IDogZnVuY3Rpb24obm9kZSwgbm9ybWFsaXplZCkgew0KCQkJdmFyIGlkeCA9IDAsIGxhc3ROb2RlVHlwZSwgbGFzdE5vZGUsIG5vZGVUeXBlOw0KDQoJCQlpZiAobm9kZSkgew0KCQkJCWZvciAobGFzdE5vZGVUeXBlID0gbm9kZS5ub2RlVHlwZSwgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nLCBsYXN0Tm9kZSA9IG5vZGU7IG5vZGU7IG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykgew0KCQkJCQlub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7DQoNCgkJCQkJLy8gTm9ybWFsaXplIHRleHQgbm9kZXMNCgkJCQkJaWYgKG5vcm1hbGl6ZWQgJiYgbm9kZVR5cGUgPT0gMykgew0KCQkJCQkJaWYgKG5vZGVUeXBlID09IGxhc3ROb2RlVHlwZSB8fCAhbm9kZS5ub2RlVmFsdWUubGVuZ3RoKQ0KCQkJCQkJCWNvbnRpbnVlOw0KCQkJCQl9DQoNCgkJCQkJaWR4Kys7DQoJCQkJCWxhc3ROb2RlVHlwZSA9IG5vZGVUeXBlOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIGlkeDsNCgkJfSwNCg0KCQkvKioNCgkJICogU3BsaXRzIGFuIGVsZW1lbnQgaW50byB0d28gbmV3IGVsZW1lbnRzIGFuZCBwbGFjZXMgdGhlIHNwZWNpZmllZCBzcGxpdA0KCQkgKiBlbGVtZW50IG9yIGVsZW1lbnQgYmV0d2VlbiB0aGUgbmV3IG9uZXMuIEZvciBleGFtcGxlIHNwbGl0dGluZyB0aGUgcGFyYWdyYXBoIGF0IHRoZSBib2xkIGVsZW1lbnQgaW4NCgkJICogdGhpcyBleGFtcGxlIDxwPmFiYzxiPmFiYzwvYj4xMjM8L3A+IHdvdWxkIHByb2R1Y2UgPHA+YWJjPC9wPjxiPmFiYzwvYj48cD4xMjM8L3A+LiANCgkJICoNCgkJICogQG1ldGhvZCBzcGxpdA0KCQkgKiBAcGFyYW0ge0VsZW1lbnR9IHBlIFBhcmVudCBlbGVtZW50IHRvIHNwbGl0Lg0KCQkgKiBAcGFyYW0ge0VsZW1lbnR9IGUgRWxlbWVudCB0byBzcGxpdCBhdC4NCgkJICogQHBhcmFtIHtFbGVtZW50fSByZSBPcHRpb25hbCByZXBsYWNlbWVudCBlbGVtZW50IHRvIHJlcGxhY2UgdGhlIHNwbGl0IGVsZW1lbnQgYnkuDQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IFJldHVybnMgdGhlIHNwbGl0IGVsZW1lbnQgb3IgdGhlIHJlcGxhY2VtZW50IGVsZW1lbnQgaWYgdGhhdCBpcyBzcGVjaWZpZWQuDQoJCSAqLw0KCQlzcGxpdCA6IGZ1bmN0aW9uKHBlLCBlLCByZSkgew0KCQkJdmFyIHQgPSB0aGlzLCByID0gdC5jcmVhdGVSbmcoKSwgYmVmLCBhZnQsIHBhOw0KDQoJCQkvLyBXM0MgdmFsaWQgYnJvd3NlcnMgdGVuZCB0byBsZWF2ZSBlbXB0eSBub2RlcyB0byB0aGUgbGVmdC9yaWdodCBzaWRlIG9mIHRoZSBjb250ZW50cywgdGhpcyBtYWtlcyBzZW5zZQ0KCQkJLy8gYnV0IHdlIGRvbid0IHdhbnQgdGhhdCBpbiBvdXIgY29kZSBzaW5jZSBpdCBzZXJ2ZXMgbm8gcHVycG9zZSBmb3IgdGhlIGVuZCB1c2VyDQoJCQkvLyBGb3IgZXhhbXBsZSBpZiB0aGlzIGlzIGNob3BwZWQ6DQoJCQkvLyAgIDxwPnRleHQgMTxzcGFuPjxiPkNIT1A8L2I+PC9zcGFuPnRleHQgMjwvcD4NCgkJCS8vIHdvdWxkIHByb2R1Y2U6DQoJCQkvLyAgIDxwPnRleHQgMTxzcGFuPjwvc3Bhbj48L3A+PGI+Q0hPUDwvYj48cD48c3Bhbj48L3NwYW4+dGV4dCAyPC9wPg0KCQkJLy8gdGhpcyBmdW5jdGlvbiB3aWxsIHRoZW4gdHJpbSBvZiBlbXB0eSBlZGdlcyBhbmQgcHJvZHVjZToNCgkJCS8vICAgPHA+dGV4dCAxPC9wPjxiPkNIT1A8L2I+PHA+dGV4dCAyPC9wPg0KCQkJZnVuY3Rpb24gdHJpbShub2RlKSB7DQoJCQkJdmFyIGksIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzOw0KDQoJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnX21jZV90eXBlJykgPT0gJ2Jvb2ttYXJrJykNCgkJCQkJcmV0dXJuOw0KDQoJCQkJZm9yIChpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pDQoJCQkJCXRyaW0oY2hpbGRyZW5baV0pOw0KDQoJCQkJaWYgKG5vZGUubm9kZVR5cGUgIT0gOSkgew0KCQkJCQkvLyBLZWVwIG5vbiB3aGl0ZXNwYWNlIHRleHQgbm9kZXMNCgkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB7DQoJCQkJCQkvLyBJZiBwYXJlbnQgZWxlbWVudCBpc24ndCBhIGJsb2NrIG9yIHRoZXJlIGlzbid0IGFueSB1c2VmdWwgY29udGVudHMgZm9yIGV4YW1wbGUgIjxwPiAgIDwvcD4iDQoJCQkJCQlpZiAoIXQuaXNCbG9jayhub2RlLnBhcmVudE5vZGUpIHx8IHRpbnltY2UudHJpbShub2RlLm5vZGVWYWx1ZSkubGVuZ3RoID4gMCkNCgkJCQkJCQlyZXR1cm47DQoJCQkJCX0NCg0KCQkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJCQkvLyBJZiB0aGUgb25seSBjaGlsZCBpcyBhIGJvb2ttYXJrIHRoZW4gbW92ZSBpdCB1cA0KCQkJCQkJY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7DQoJCQkJCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDEgJiYgY2hpbGRyZW5bMF0gJiYgY2hpbGRyZW5bMF0ubm9kZVR5cGUgPT0gMSAmJiBjaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoJ19tY2VfdHlwZScpID09ICdib29rbWFyaycpDQoJCQkJCQkJbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZHJlblswXSwgbm9kZSk7DQoNCgkJCQkJCS8vIEtlZXAgbm9uIGVtcHR5IGVsZW1lbnRzIG9yIGltZywgaHIgZXRjDQoJCQkJCQlpZiAoY2hpbGRyZW4ubGVuZ3RoIHx8IC9eKGJyfGhyfGlucHV0fGltZykkL2kudGVzdChub2RlLm5vZGVOYW1lKSkNCgkJCQkJCQlyZXR1cm47DQoJCQkJCX0NCg0KCQkJCQl0LnJlbW92ZShub2RlKTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gbm9kZTsNCgkJCX07DQoNCgkJCWlmIChwZSAmJiBlKSB7DQoJCQkJLy8gR2V0IGJlZm9yZSBjaHVuaw0KCQkJCXIuc2V0U3RhcnQocGUucGFyZW50Tm9kZSwgdC5ub2RlSW5kZXgocGUpKTsNCgkJCQlyLnNldEVuZChlLnBhcmVudE5vZGUsIHQubm9kZUluZGV4KGUpKTsNCgkJCQliZWYgPSByLmV4dHJhY3RDb250ZW50cygpOw0KDQoJCQkJLy8gR2V0IGFmdGVyIGNodW5rDQoJCQkJciA9IHQuY3JlYXRlUm5nKCk7DQoJCQkJci5zZXRTdGFydChlLnBhcmVudE5vZGUsIHQubm9kZUluZGV4KGUpICsgMSk7DQoJCQkJci5zZXRFbmQocGUucGFyZW50Tm9kZSwgdC5ub2RlSW5kZXgocGUpICsgMSk7DQoJCQkJYWZ0ID0gci5leHRyYWN0Q29udGVudHMoKTsNCg0KCQkJCS8vIEluc2VydCBiZWZvcmUgY2h1bmsNCgkJCQlwYSA9IHBlLnBhcmVudE5vZGU7DQoJCQkJcGEuaW5zZXJ0QmVmb3JlKHRyaW0oYmVmKSwgcGUpOw0KDQoJCQkJLy8gSW5zZXJ0IG1pZGRsZSBjaHVuaw0KCQkJCWlmIChyZSkNCgkJCQkJcGEucmVwbGFjZUNoaWxkKHJlLCBlKTsNCgkJCQllbHNlDQoJCQkJCXBhLmluc2VydEJlZm9yZShlLCBwZSk7DQoNCgkJCQkvLyBJbnNlcnQgYWZ0ZXIgY2h1bmsNCgkJCQlwYS5pbnNlcnRCZWZvcmUodHJpbShhZnQpLCBwZSk7DQoJCQkJdC5yZW1vdmUocGUpOw0KDQoJCQkJcmV0dXJuIHJlIHx8IGU7DQoJCQl9DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEFkZHMgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC4NCgkJICoNCgkJICogQG1ldGhvZCBiaW5kDQoJCSAqIEBwYXJhbSB7RWxlbWVudC9Eb2N1bWVudC9XaW5kb3cvQXJyYXkvU3RyaW5nfSBvIE9iamVjdCBvciBlbGVtZW50IGlkIHN0cmluZyB0byBhZGQgZXZlbnQgaGFuZGxlciB0byBvciBhbiBhcnJheSBvZiBlbGVtZW50cy9pZHMvZG9jdW1lbnRzLg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBOYW1lIG9mIGV2ZW50IGhhbmRsZXIgdG8gYWRkIGZvciBleGFtcGxlOiBjbGljay4NCgkJICogQHBhcmFtIHtmdW5jdGlvbn0gZiBGdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgc2NvcGUgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW4uDQoJCSAqIEByZXR1cm4ge2Z1bmN0aW9ufSBGdW5jdGlvbiBjYWxsYmFjayBoYW5kbGVyIHRoZSBzYW1lIGFzIHRoZSBvbmUgcGFzc2VkIGluLg0KCQkgKi8NCgkJYmluZCA6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgZnVuYywgc2NvcGUpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKCF0LmV2ZW50cykNCgkJCQl0LmV2ZW50cyA9IG5ldyB0aW55bWNlLmRvbS5FdmVudFV0aWxzKCk7DQoNCgkJCXJldHVybiB0LmV2ZW50cy5hZGQodGFyZ2V0LCBuYW1lLCBmdW5jLCBzY29wZSB8fCB0aGlzKTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGV2ZW50IGhhbmRsZXIgYnkgbmFtZSBhbmQgZnVuY3Rpb24gZnJvbSBhIGVsZW1lbnQgb3IgY29sbGVjdGlvbiBvZiBlbGVtZW50cy4NCgkJICoNCgkJICogQG1ldGhvZCB1bmJpbmQNCgkJICogQHBhcmFtIHtTdHJpbmcvRWxlbWVudC9BcnJheX0gbyBFbGVtZW50IElEIHN0cmluZyBvciBIVE1MIGVsZW1lbnQgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb3IgaWRzIHRvIHJlbW92ZSBoYW5kbGVyIGZyb20uDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIEV2ZW50IGhhbmRsZXIgbmFtZSBsaWtlIGZvciBleGFtcGxlOiAiY2xpY2siDQoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGYgRnVuY3Rpb24gdG8gcmVtb3ZlLg0KCQkgKiBAcmV0dXJuIHtib29sL0FycmF5fSBCb29sIHN0YXRlIGlmIHRydWUgaWYgdGhlIGhhbmRsZXIgd2FzIHJlbW92ZWQgb3IgYW4gYXJyYXkgd2l0aCBzdGF0ZXMgaWYgbXVsdGlwbGUgZWxlbWVudHMgd2hlcmUgcGFzc2VkIGluLg0KCQkgKi8NCgkJdW5iaW5kIDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCBmdW5jKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWlmICghdC5ldmVudHMpDQoJCQkJdC5ldmVudHMgPSBuZXcgdGlueW1jZS5kb20uRXZlbnRVdGlscygpOw0KDQoJCQlyZXR1cm4gdC5ldmVudHMucmVtb3ZlKHRhcmdldCwgbmFtZSwgZnVuYyk7DQoJCX0sDQoNCgkJLy8gI2lmZGVmIGRlYnVnDQoNCgkJZHVtcFJuZyA6IGZ1bmN0aW9uKHIpIHsNCgkJCXJldHVybiAnc3RhcnRDb250YWluZXI6ICcgKyByLnN0YXJ0Q29udGFpbmVyLm5vZGVOYW1lICsgJywgc3RhcnRPZmZzZXQ6ICcgKyByLnN0YXJ0T2Zmc2V0ICsgJywgZW5kQ29udGFpbmVyOiAnICsgci5lbmRDb250YWluZXIubm9kZU5hbWUgKyAnLCBlbmRPZmZzZXQ6ICcgKyByLmVuZE9mZnNldDsNCgkJfSwNCg0KCQkvLyAjZW5kaWYNCg0KCQlfZmluZFNpYiA6IGZ1bmN0aW9uKG5vZGUsIHNlbGVjdG9yLCBuYW1lKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGYgPSBzZWxlY3RvcjsNCg0KCQkJaWYgKG5vZGUpIHsNCgkJCQkvLyBJZiBleHByZXNzaW9uIG1ha2UgYSBmdW5jdGlvbiBvZiBpdCB1c2luZyBpcw0KCQkJCWlmIChpcyhmLCAnc3RyaW5nJykpIHsNCgkJCQkJZiA9IGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCXJldHVybiB0LmlzKG5vZGUsIHNlbGVjdG9yKTsNCgkJCQkJfTsNCgkJCQl9DQoNCgkJCQkvLyBMb29wIGFsbCBzaWJsaW5ncw0KCQkJCWZvciAobm9kZSA9IG5vZGVbbmFtZV07IG5vZGU7IG5vZGUgPSBub2RlW25hbWVdKSB7DQoJCQkJCWlmIChmKG5vZGUpKQ0KCQkJCQkJcmV0dXJuIG5vZGU7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gbnVsbDsNCgkJfSwNCg0KCQlfaXNSZXMgOiBmdW5jdGlvbihjKSB7DQoJCQkvLyBJcyBsaXZlIHJlc2l6YmxlIGVsZW1lbnQNCgkJCXJldHVybiAvXih0b3B8bGVmdHxib3R0b218cmlnaHR8d2lkdGh8aGVpZ2h0KS9pLnRlc3QoYykgfHwgLztccyoodG9wfGxlZnR8Ym90dG9tfHJpZ2h0fHdpZHRofGhlaWdodCkvaS50ZXN0KGMpOw0KCQl9DQoNCgkJLyoNCgkJd2FsayA6IGZ1bmN0aW9uKG4sIGYsIHMpIHsNCgkJCXZhciBkID0gdGhpcy5kb2MsIHc7DQoNCgkJCWlmIChkLmNyZWF0ZVRyZWVXYWxrZXIpIHsNCgkJCQl3ID0gZC5jcmVhdGVUcmVlV2Fsa2VyKG4sIE5vZGVGaWx0ZXIuU0hPV19URVhULCBudWxsLCBmYWxzZSk7DQoNCgkJCQl3aGlsZSAoKG4gPSB3Lm5leHROb2RlKCkpICE9IG51bGwpDQoJCQkJCWYuY2FsbChzIHx8IHRoaXMsIG4pOw0KCQkJfSBlbHNlDQoJCQkJdGlueW1jZS53YWxrKG4sIGYsICdjaGlsZE5vZGVzJywgcyk7DQoJCX0NCgkJKi8NCg0KCQkvKg0KCQl0b1JHQiA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciBjID0gL15ccyo/IyhbMC05QS1GXXsyfSkoWzAtOUEtRl17MSwyfSkoWzAtOUEtRl17Mn0pP1xzKj8kLy5leGVjKHMpOw0KDQoJCQlpZiAoYykgew0KCQkJCS8vICNGRkYgLT4gI0ZGRkZGRg0KCQkJCWlmICghaXMoY1szXSkpDQoJCQkJCWNbM10gPSBjWzJdID0gY1sxXTsNCg0KCQkJCXJldHVybiAicmdiKCIgKyBwYXJzZUludChjWzFdLCAxNikgKyAiLCIgKyBwYXJzZUludChjWzJdLCAxNikgKyAiLCIgKyBwYXJzZUludChjWzNdLCAxNikgKyAiKSI7DQoJCQl9DQoNCgkJCXJldHVybiBzOw0KCQl9DQoJCSovDQoJfSk7DQoNCgkvKioNCgkgKiBJbnN0YW5jZSBvZiBET01VdGlscyBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQuDQoJICoNCgkgKiBAcHJvcGVydHkgRE9NDQoJICogQG1lbWJlciB0aW55bWNlDQoJICogQHR5cGUgdGlueW1jZS5kb20uRE9NVXRpbHMNCgkgKi8NCgl0aW55bWNlLkRPTSA9IG5ldyB0aW55bWNlLmRvbS5ET01VdGlscyhkb2N1bWVudCwge3Byb2Nlc3NfaHRtbCA6IDB9KTsNCn0pKHRpbnltY2UpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/Element.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBFbGVtZW50LmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgkvKioNCgkgKiBFbGVtZW50IGNsYXNzLCB0aGlzIGVuYWJsZXMgZWxlbWVudCBibG9ja2luZyBpbiBJRS4gRWxlbWVudCBibG9ja2luZyBpcyBhIG1ldGhvZCB0byBibG9jayBvdXQgc2VsZWN0IGJsb2NrZXMgdGhhdA0KCSAqIGdldHMgdmlzaWJsZSB0aG91Z2ggRElWcyBvbiBJRSA2IGl0IHVzZXMgYSBpZnJhbWUgZm9yIHRoaXMgYmxvY2tpbmcuIFRoaXMgY2xhc3MgYWxzbyBzaG9ydGVucyB0aGUgbGVuZ3RoIG9mIHNvbWUgRE9NIEFQSSBjYWxscw0KCSAqIHNpbmNlIGl0J3MgYm91bmQgdG8gYW4gZWxlbWVudC4NCgkgKg0KCSAqIEBjbGFzcyB0aW55bWNlLmRvbS5FbGVtZW50DQoJICovDQoNCgkvKioNCgkgKiBDb25zdHJ1Y3RzIGEgbmV3IEVsZW1lbnQgaW5zdGFuY2UuIENvbnN1bHQgdGhlIFdpa2kgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIGNsYXNzLg0KCSAqDQoJICogQGNvbnN0cnVjdG9yDQoJICogQG1ldGhvZCBFbGVtZW50DQoJICogQHBhcmFtIHtTdHJpbmd9IGlkIEVsZW1lbnQgSUQgdG8gYmluZC9leGVjdXRlIG1ldGhvZHMgb24uDQoJICogQHBhcmFtIHtPYmplY3R9IHNldHRpbmdzIE9wdGlvbmFsIHNldHRpbmdzIG5hbWUvdmFsdWUgY29sbGVjdGlvbi4NCgkgKi8NCgl0aW55bWNlLmRvbS5FbGVtZW50ID0gZnVuY3Rpb24oaWQsIHNldHRpbmdzKSB7DQoJCXZhciB0ID0gdGhpcywgZG9tLCBlbDsNCg0KCQl0LnNldHRpbmdzID0gc2V0dGluZ3MgPSBzZXR0aW5ncyB8fCB7fTsNCgkJdC5pZCA9IGlkOw0KCQl0LmRvbSA9IGRvbSA9IHNldHRpbmdzLmRvbSB8fCB0aW55bWNlLkRPTTsNCg0KCQkvLyBPbmx5IElFIGxlYWtzIERPTSByZWZlcmVuY2VzLCB0aGlzIGlzIGEgbG90IGZhc3Rlcg0KCQlpZiAoIXRpbnltY2UuaXNJRSkNCgkJCWVsID0gZG9tLmdldCh0LmlkKTsNCg0KCQl0aW55bWNlLmVhY2goDQoJCQkJKCdnZXRQb3MsZ2V0UmVjdCxnZXRQYXJlbnQsYWRkLHNldFN0eWxlLGdldFN0eWxlLHNldFN0eWxlcywnICsgDQoJCQkJJ3NldEF0dHJpYixzZXRBdHRyaWJzLGdldEF0dHJpYixhZGRDbGFzcyxyZW1vdmVDbGFzcywnICsgDQoJCQkJJ2hhc0NsYXNzLGdldE91dGVySFRNTCxzZXRPdXRlckhUTUwscmVtb3ZlLHNob3csaGlkZSwnICsgDQoJCQkJJ2lzSGlkZGVuLHNldEhUTUwsZ2V0Jykuc3BsaXQoLywvKQ0KCQkJLCBmdW5jdGlvbihrKSB7DQoJCQkJdFtrXSA9IGZ1bmN0aW9uKCkgew0KCQkJCQl2YXIgYSA9IFtpZF0sIGk7DQoNCgkJCQkJZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykNCgkJCQkJCWEucHVzaChhcmd1bWVudHNbaV0pOw0KDQoJCQkJCWEgPSBkb21ba10uYXBwbHkoZG9tLCBhKTsNCgkJCQkJdC51cGRhdGUoayk7DQoNCgkJCQkJcmV0dXJuIGE7DQoJCQkJfTsNCgkJfSk7DQoNCgkJdGlueW1jZS5leHRlbmQodCwgew0KCQkJLyoqDQoJCQkgKiBBZGRzIGEgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudC4NCgkJCSAqDQoJCQkgKiBAbWV0aG9kIG9uDQoJCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBFdmVudCBuYW1lIGxpa2UgZm9yIGV4YW1wbGUgImNsaWNrIi4NCgkJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGYgRnVuY3Rpb24gdG8gZXhlY3V0ZSBvbiB0aGUgc3BlY2lmaWVkIGV2ZW50Lg0KCQkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgc2NvcGUgdG8gZXhlY3V0ZSBmdW5jdGlvbiBvbi4NCgkJCSAqIEByZXR1cm4ge2Z1bmN0aW9ufSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uIHRoZSBzYW1lIGFzIHRoZSBpbnB1dCBmdW5jdGlvbi4NCgkJCSAqLw0KCQkJb24gOiBmdW5jdGlvbihuLCBmLCBzKSB7DQoJCQkJcmV0dXJuIHRpbnltY2UuZG9tLkV2ZW50LmFkZCh0LmlkLCBuLCBmLCBzKTsNCgkJCX0sDQoNCgkJCS8qKg0KCQkJICogUmV0dXJucyB0aGUgYWJzb2x1dGUgWCwgWSBjb3JkaW5hdGUgb2YgdGhlIGVsZW1lbnQuDQoJCQkgKg0KCQkJICogQG1ldGhvZCBnZXRYWQ0KCQkJICogQHJldHVybiB7T2JqZWN0fSBPYmpleHQgd2l0aCB4LCB5IGNvcmRpbmF0ZSBmaWVsZHMuDQoJCQkgKi8NCgkJCWdldFhZIDogZnVuY3Rpb24oKSB7DQoJCQkJcmV0dXJuIHsNCgkJCQkJeCA6IHBhcnNlSW50KHQuZ2V0U3R5bGUoJ2xlZnQnKSksDQoJCQkJCXkgOiBwYXJzZUludCh0LmdldFN0eWxlKCd0b3AnKSkNCgkJCQl9Ow0KCQkJfSwNCg0KCQkJLyoqDQoJCQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBlbGVtZW50IGJ5IGEgb2JqZWN0IHdpdGggdyBhbmQgaCBmaWVsZHMuDQoJCQkgKg0KCQkJICogQG1ldGhvZCBnZXRTaXplDQoJCQkgKiBAcmV0dXJuIHtPYmplY3R9IE9iamVjdCB3aXRoIGVsZW1lbnQgc2l6ZSB3aXRoIGEgdyBhbmQgaCBmaWVsZC4NCgkJCSAqLw0KCQkJZ2V0U2l6ZSA6IGZ1bmN0aW9uKCkgew0KCQkJCXZhciBuID0gZG9tLmdldCh0LmlkKTsNCg0KCQkJCXJldHVybiB7DQoJCQkJCXcgOiBwYXJzZUludCh0LmdldFN0eWxlKCd3aWR0aCcpIHx8IG4uY2xpZW50V2lkdGgpLA0KCQkJCQloIDogcGFyc2VJbnQodC5nZXRTdHlsZSgnaGVpZ2h0JykgfHwgbi5jbGllbnRIZWlnaHQpDQoJCQkJfTsNCgkJCX0sDQoNCgkJCS8qKg0KCQkJICogTW92ZXMgdGhlIGVsZW1lbnQgdG8gYSBzcGVjaWZpYyBhYnNvbHV0ZSBwb3NpdGlvbi4NCgkJCSAqDQoJCQkgKiBAbWV0aG9kIG1vdmVUbw0KCQkJICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb3JkaW5hdGUgb2YgZWxlbWVudCBwb3NpdGlvbi4NCgkJCSAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29yZGluYXRlIG9mIGVsZW1lbnQgcG9zaXRpb24uDQoJCQkgKi8NCgkJCW1vdmVUbyA6IGZ1bmN0aW9uKHgsIHkpIHsNCgkJCQl0LnNldFN0eWxlcyh7bGVmdCA6IHgsIHRvcCA6IHl9KTsNCgkJCX0sDQoNCgkJCS8qKg0KCQkJICogTW92ZXMgdGhlIGVsZW1lbnQgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uDQoJCQkgKg0KCQkJICogQG1ldGhvZCBtb3ZlQnkNCgkJCSAqIEBwYXJhbSB7TnVtYmVyfSB4IFJlbGF0aXZlIFggY29yZGluYXRlIG9mIGVsZW1lbnQgcG9zaXRpb24uDQoJCQkgKiBAcGFyYW0ge051bWJlcn0geSBSZWxhdGl2ZSBZIGNvcmRpbmF0ZSBvZiBlbGVtZW50IHBvc2l0aW9uLg0KCQkJICovDQoJCQltb3ZlQnkgOiBmdW5jdGlvbih4LCB5KSB7DQoJCQkJdmFyIHAgPSB0LmdldFhZKCk7DQoNCgkJCQl0Lm1vdmVUbyhwLnggKyB4LCBwLnkgKyB5KTsNCgkJCX0sDQoNCgkJCS8qKg0KCQkJICogUmVzaXplcyB0aGUgZWxlbWVudCB0byBhIHNwZWNpZmljIHNpemUuDQoJCQkgKg0KCQkJICogQG1ldGhvZCByZXNpemVUbw0KCQkJICogQHBhcmFtIHtOdW1iZXJ9IHcgTmV3IHdpZHRoIG9mIGVsZW1lbnQuDQoJCQkgKiBAcGFyYW0ge051bW5lcn0gaCBOZXcgaGVpZ2h0IG9mIGVsZW1lbnQuDQoJCQkgKi8NCgkJCXJlc2l6ZVRvIDogZnVuY3Rpb24odywgaCkgew0KCQkJCXQuc2V0U3R5bGVzKHt3aWR0aCA6IHcsIGhlaWdodCA6IGh9KTsNCgkJCX0sDQoNCgkJCS8qKg0KCQkJICogUmVzaXplcyB0aGUgZWxlbWVudCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBzaXpldG8gYSBzcGVjaWZpYyBzaXplLg0KCQkJICoNCgkJCSAqIEBtZXRob2QgcmVzaXplQnkNCgkJCSAqIEBwYXJhbSB7TnVtYmVyfSB3IFJlbGF0aXZlIHdpZHRoIG9mIGVsZW1lbnQuDQoJCQkgKiBAcGFyYW0ge051bW5lcn0gaCBSZWxhdGl2ZSBoZWlnaHQgb2YgZWxlbWVudC4NCgkJCSAqLw0KCQkJcmVzaXplQnkgOiBmdW5jdGlvbih3LCBoKSB7DQoJCQkJdmFyIHMgPSB0LmdldFNpemUoKTsNCg0KCQkJCXQucmVzaXplVG8ocy53ICsgdywgcy5oICsgaCk7DQoJCQl9LA0KDQoJCQkvKioNCgkJCSAqIFVwZGF0ZXMgdGhlIGVsZW1lbnQgYmxvY2tlciBpbiBJRTYgYmFzZWQgb24gdGhlIHN0eWxlIGluZm9ybWF0aW9uIG9mIHRoZSBlbGVtZW50Lg0KCQkJICoNCgkJCSAqIEBtZXRob2QgdXBkYXRlDQoJCQkgKiBAcGFyYW0ge1N0cmluZ30gayBPcHRpb25hbCBmdW5jdGlvbiBrZXkuIFVzZWQgaW50ZXJuYWxseS4NCgkJCSAqLw0KCQkJdXBkYXRlIDogZnVuY3Rpb24oaykgew0KCQkJCXZhciBiOw0KDQoJCQkJaWYgKHRpbnltY2UuaXNJRTYgJiYgc2V0dGluZ3MuYmxvY2tlcikgew0KCQkJCQlrID0gayB8fCAnJzsNCg0KCQkJCQkvLyBJZ25vcmUgZ2V0dGVycw0KCQkJCQlpZiAoay5pbmRleE9mKCdnZXQnKSA9PT0gMCB8fCBrLmluZGV4T2YoJ2hhcycpID09PSAwIHx8IGsuaW5kZXhPZignaXMnKSA9PT0gMCkNCgkJCQkJCXJldHVybjsNCg0KCQkJCQkvLyBSZW1vdmUgYmxvY2tlciBvbiByZW1vdmUNCgkJCQkJaWYgKGsgPT0gJ3JlbW92ZScpIHsNCgkJCQkJCWRvbS5yZW1vdmUodC5ibG9ja2VyKTsNCgkJCQkJCXJldHVybjsNCgkJCQkJfQ0KDQoJCQkJCWlmICghdC5ibG9ja2VyKSB7DQoJCQkJCQl0LmJsb2NrZXIgPSBkb20udW5pcXVlSWQoKTsNCgkJCQkJCWIgPSBkb20uYWRkKHNldHRpbmdzLmNvbnRhaW5lciB8fCBkb20uZ2V0Um9vdCgpLCAnaWZyYW1lJywge2lkIDogdC5ibG9ja2VyLCBzdHlsZSA6ICdwb3NpdGlvbjphYnNvbHV0ZTsnLCBmcmFtZUJvcmRlciA6IDAsIHNyYyA6ICdqYXZhc2NyaXB0OiIiJ30pOw0KCQkJCQkJZG9tLnNldFN0eWxlKGIsICdvcGFjaXR5JywgMCk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJYiA9IGRvbS5nZXQodC5ibG9ja2VyKTsNCg0KCQkJCQlkb20uc2V0U3R5bGVzKGIsIHsNCgkJCQkJCWxlZnQgOiB0LmdldFN0eWxlKCdsZWZ0JywgMSksDQoJCQkJCQl0b3AgOiB0LmdldFN0eWxlKCd0b3AnLCAxKSwNCgkJCQkJCXdpZHRoIDogdC5nZXRTdHlsZSgnd2lkdGgnLCAxKSwNCgkJCQkJCWhlaWdodCA6IHQuZ2V0U3R5bGUoJ2hlaWdodCcsIDEpLA0KCQkJCQkJZGlzcGxheSA6IHQuZ2V0U3R5bGUoJ2Rpc3BsYXknLCAxKSwNCgkJCQkJCXpJbmRleCA6IHBhcnNlSW50KHQuZ2V0U3R5bGUoJ3pJbmRleCcsIDEpIHx8IDApIC0gMQ0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9DQoJCX0pOw0KCX07DQp9KSh0aW55bWNlKTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/EventUtils.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBFdmVudFV0aWxzLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgkvLyBTaG9ydGVuIG5hbWVzDQoJdmFyIGVhY2ggPSB0aW55bWNlLmVhY2gsIERPTSA9IHRpbnltY2UuRE9NLCBpc0lFID0gdGlueW1jZS5pc0lFLCBpc1dlYktpdCA9IHRpbnltY2UuaXNXZWJLaXQsIEV2ZW50Ow0KDQoJLyoqDQoJICogVGhpcyBjbGFzcyBoYW5kbGVzIERPTSBldmVudHMgaW4gYSBjcm9zcyBwbGF0Zm9ybSBmYXNpb24gaXQgYWxzbyBrZWVwcyB0cmFjayBvZiBlbGVtZW50DQoJICogYW5kIGhhbmRsZXIgcmVmZXJlbmNlcyB0byBiZSBhYmxlIHRvIGNsZWFuIGVsZW1lbnRzIHRvIHJlZHVjZSBJRSBtZW1vcnkgbGVha3MuDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS5kb20uRXZlbnRVdGlscw0KCSAqLw0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLmRvbS5FdmVudFV0aWxzJywgew0KCQkvKioNCgkJICogQ29uc3RydWN0cyBhIG5ldyBFdmVudFV0aWxzIGluc3RhbmNlLg0KCQkgKg0KCQkgKiBAY29uc3RydWN0b3INCgkJICogQG1ldGhvZCBFdmVudFV0aWxzDQoJCSAqLw0KCQlFdmVudFV0aWxzIDogZnVuY3Rpb24oKSB7DQoJCQl0aGlzLmluaXRzID0gW107DQoJCQl0aGlzLmV2ZW50cyA9IFtdOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBBZGRzIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuDQoJCSAqDQoJCSAqIEBtZXRob2QgYWRkDQoJCSAqIEBwYXJhbSB7RWxlbWVudC9Eb2N1bWVudC9XaW5kb3cvQXJyYXkvU3RyaW5nfSBvIE9iamVjdCBvciBlbGVtZW50IGlkIHN0cmluZyB0byBhZGQgZXZlbnQgaGFuZGxlciB0byBvciBhbiBhcnJheSBvZiBlbGVtZW50cy9pZHMvZG9jdW1lbnRzLg0KCQkgKiBAcGFyYW0ge1N0cmluZy9BcnJheX0gbiBOYW1lIG9mIGV2ZW50IGhhbmRsZXIgdG8gYWRkIGZvciBleGFtcGxlOiBjbGljay4NCgkJICogQHBhcmFtIHtmdW5jdGlvbn0gZiBGdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgc2NvcGUgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW4uDQoJCSAqIEByZXR1cm4ge2Z1bmN0aW9ufSBGdW5jdGlvbiBjYWxsYmFjayBoYW5kbGVyIHRoZSBzYW1lIGFzIHRoZSBvbmUgcGFzc2VkIGluLg0KCQkgKi8NCgkJYWRkIDogZnVuY3Rpb24obywgbiwgZiwgcykgew0KCQkJdmFyIGNiLCB0ID0gdGhpcywgZWwgPSB0LmV2ZW50cywgcjsNCg0KCQkJaWYgKG4gaW5zdGFuY2VvZiBBcnJheSkgew0KCQkJCXIgPSBbXTsNCg0KCQkJCWVhY2gobiwgZnVuY3Rpb24obikgew0KCQkJCQlyLnB1c2godC5hZGQobywgbiwgZiwgcykpOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIHI7DQoJCQl9DQoNCgkJCS8vIEhhbmRsZSBhcnJheQ0KCQkJaWYgKG8gJiYgby5oYXNPd25Qcm9wZXJ0eSAmJiBvIGluc3RhbmNlb2YgQXJyYXkpIHsNCgkJCQlyID0gW107DQoNCgkJCQllYWNoKG8sIGZ1bmN0aW9uKG8pIHsNCgkJCQkJbyA9IERPTS5nZXQobyk7DQoJCQkJCXIucHVzaCh0LmFkZChvLCBuLCBmLCBzKSk7DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm4gcjsNCgkJCX0NCg0KCQkJbyA9IERPTS5nZXQobyk7DQoNCgkJCWlmICghbykNCgkJCQlyZXR1cm47DQoNCgkJCS8vIFNldHVwIGV2ZW50IGNhbGxiYWNrDQoJCQljYiA9IGZ1bmN0aW9uKGUpIHsNCgkJCQkvLyBJcyBhbGwgZXZlbnRzIGRpc2FibGVkDQoJCQkJaWYgKHQuZGlzYWJsZWQpDQoJCQkJCXJldHVybjsNCg0KCQkJCWUgPSBlIHx8IHdpbmRvdy5ldmVudDsNCg0KCQkJCS8vIFBhdGNoIGluIHRhcmdldCwgcHJldmVudERlZmF1bHQgYW5kIHN0b3BQcm9wYWdhdGlvbiBpbiBJRSBpdCdzIFczQyB2YWxpZA0KCQkJCWlmIChlICYmIGlzSUUpIHsNCgkJCQkJaWYgKCFlLnRhcmdldCkNCgkJCQkJCWUudGFyZ2V0ID0gZS5zcmNFbGVtZW50Ow0KDQoJCQkJCS8vIFBhdGNoIGluIHByZXZlbnREZWZhdWx0LCBzdG9wUHJvcGFnYXRpb24gbWV0aG9kcyBmb3IgVzNDIGNvbXBhdGliaWxpdHkNCgkJCQkJdGlueW1jZS5leHRlbmQoZSwgdC5fc3RvcHBlcnMpOw0KCQkJCX0NCg0KCQkJCWlmICghcykNCgkJCQkJcmV0dXJuIGYoZSk7DQoNCgkJCQlyZXR1cm4gZi5jYWxsKHMsIGUpOw0KCQkJfTsNCg0KCQkJaWYgKG4gPT0gJ3VubG9hZCcpIHsNCgkJCQl0aW55bWNlLnVubG9hZHMudW5zaGlmdCh7ZnVuYyA6IGNifSk7DQoJCQkJcmV0dXJuIGNiOw0KCQkJfQ0KDQoJCQlpZiAobiA9PSAnaW5pdCcpIHsNCgkJCQlpZiAodC5kb21Mb2FkZWQpDQoJCQkJCWNiKCk7DQoJCQkJZWxzZQ0KCQkJCQl0LmluaXRzLnB1c2goY2IpOw0KDQoJCQkJcmV0dXJuIGNiOw0KCQkJfQ0KDQoJCQkvLyBTdG9yZSBhd2F5IGxpc3RlbmVyIHJlZmVyZW5jZQ0KCQkJZWwucHVzaCh7DQoJCQkJb2JqIDogbywNCgkJCQluYW1lIDogbiwNCgkJCQlmdW5jIDogZiwNCgkJCQljZnVuYyA6IGNiLA0KCQkJCXNjb3BlIDogcw0KCQkJfSk7DQoNCgkJCXQuX2FkZChvLCBuLCBjYik7DQoNCgkJCXJldHVybiBmOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZXZlbnQgaGFuZGxlciBieSBuYW1lIGFuZCBmdW5jdGlvbiBmcm9tIGEgZWxlbWVudCBvciBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHJlbW92ZQ0KCQkgKiBAcGFyYW0ge1N0cmluZy9FbGVtZW50L0FycmF5fSBvIEVsZW1lbnQgSUQgc3RyaW5nIG9yIEhUTUwgZWxlbWVudCBvciBhbiBhcnJheSBvZiBlbGVtZW50cyBvciBpZHMgdG8gcmVtb3ZlIGhhbmRsZXIgZnJvbS4NCgkJICogQHBhcmFtIHtTdHJpbmd9IG4gRXZlbnQgaGFuZGxlciBuYW1lIGxpa2UgZm9yIGV4YW1wbGU6ICJjbGljayINCgkJICogQHBhcmFtIHtmdW5jdGlvbn0gZiBGdW5jdGlvbiB0byByZW1vdmUuDQoJCSAqIEByZXR1cm4ge2Jvb2wvQXJyYXl9IEJvb2wgc3RhdGUgaWYgdHJ1ZSBpZiB0aGUgaGFuZGxlciB3YXMgcmVtb3ZlZCBvciBhbiBhcnJheSB3aXRoIHN0YXRlcyBpZiBtdWx0aXBsZSBlbGVtZW50cyB3aGVyZSBwYXNzZWQgaW4uDQoJCSAqLw0KCQlyZW1vdmUgOiBmdW5jdGlvbihvLCBuLCBmKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGEgPSB0LmV2ZW50cywgcyA9IGZhbHNlLCByOw0KDQoJCQkvLyBIYW5kbGUgYXJyYXkNCgkJCWlmIChvICYmIG8uaGFzT3duUHJvcGVydHkgJiYgbyBpbnN0YW5jZW9mIEFycmF5KSB7DQoJCQkJciA9IFtdOw0KDQoJCQkJZWFjaChvLCBmdW5jdGlvbihvKSB7DQoJCQkJCW8gPSBET00uZ2V0KG8pOw0KCQkJCQlyLnB1c2godC5yZW1vdmUobywgbiwgZikpOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIHI7DQoJCQl9DQoNCgkJCW8gPSBET00uZ2V0KG8pOw0KDQoJCQllYWNoKGEsIGZ1bmN0aW9uKGUsIGkpIHsNCgkJCQlpZiAoZS5vYmogPT0gbyAmJiBlLm5hbWUgPT0gbiAmJiAoIWYgfHwgKGUuZnVuYyA9PSBmIHx8IGUuY2Z1bmMgPT0gZikpKSB7DQoJCQkJCWEuc3BsaWNlKGksIDEpOw0KCQkJCQl0Ll9yZW1vdmUobywgbiwgZS5jZnVuYyk7DQoJCQkJCXMgPSB0cnVlOw0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXJldHVybiBzOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDbGVhcnMgYWxsIGV2ZW50cyBvZiBhIHNwZWNpZmljIG9iamVjdC4NCgkJICoNCgkJICogQG1ldGhvZCBjbGVhcg0KCQkgKiBAcGFyYW0ge09iamVjdH0gbyBET00gZWxlbWVudCBvciBvYmplY3QgdG8gcmVtb3ZlIGFsbCBldmVudHMgZnJvbS4NCgkJICovDQoJCWNsZWFyIDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzLCBhID0gdC5ldmVudHMsIGksIGU7DQoNCgkJCWlmIChvKSB7DQoJCQkJbyA9IERPTS5nZXQobyk7DQoNCgkJCQlmb3IgKGkgPSBhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCWUgPSBhW2ldOw0KDQoJCQkJCWlmIChlLm9iaiA9PT0gbykgew0KCQkJCQkJdC5fcmVtb3ZlKGUub2JqLCBlLm5hbWUsIGUuY2Z1bmMpOw0KCQkJCQkJZS5vYmogPSBlLmNmdW5jID0gbnVsbDsNCgkJCQkJCWEuc3BsaWNlKGksIDEpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDYW5jZWxzIGFuIGV2ZW50IGZvciBib3RoIGJ1YmJlbGluZyBhbmQgdGhlIGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvci4NCgkJICoNCgkJICogQG1ldGhvZCBjYW5jZWwNCgkJICogQHBhcmFtIHtFdmVudH0gZSBFdmVudCBvYmplY3QgdG8gY2FuY2VsLg0KCQkgKiBAcmV0dXJuIHtCb29sZWFufSBBbHdheXMgZmFsc2UuDQoJCSAqLw0KCQljYW5jZWwgOiBmdW5jdGlvbihlKSB7DQoJCQlpZiAoIWUpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQl0aGlzLnN0b3AoZSk7DQoNCgkJCXJldHVybiB0aGlzLnByZXZlbnQoZSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFN0b3BzIHByb3BvZ2F0aW9uL2J1YmJlbGluZyBvZiBhbiBldmVudC4NCgkJICoNCgkJICogQG1ldGhvZCBzdG9wDQoJCSAqIEBwYXJhbSB7RXZlbnR9IGUgRXZlbnQgdG8gY2FuY2VsIGJ1YmJlbGluZyBvbi4NCgkJICogQHJldHVybiB7Qm9vbGVhbn0gQWx3YXlzIGZhbHNlLg0KCQkgKi8NCgkJc3RvcCA6IGZ1bmN0aW9uKGUpIHsNCgkJCWlmIChlLnN0b3BQcm9wYWdhdGlvbikNCgkJCQllLnN0b3BQcm9wYWdhdGlvbigpOw0KCQkJZWxzZQ0KCQkJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBQcmV2ZW50IGRlZmF1bHQgYnJvd3NlciBiZWh2YWlvciBvZiBhbiBldmVudC4NCgkJICoNCgkJICogQG1ldGhvZCBwcmV2ZW50DQoJCSAqIEBwYXJhbSB7RXZlbnR9IGUgRXZlbnQgdG8gcHJldmVudCBkZWZhdWx0IGJyb3dzZXIgYmVodmFpb3Igb2YgYW4gZXZlbnQuDQoJCSAqIEByZXR1cm4ge0Jvb2xlYW59IEFsd2F5cyBmYWxzZS4NCgkJICovDQoJCXByZXZlbnQgOiBmdW5jdGlvbihlKSB7DQoJCQlpZiAoZS5wcmV2ZW50RGVmYXVsdCkNCgkJCQllLnByZXZlbnREZWZhdWx0KCk7DQoJCQllbHNlDQoJCQkJZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIERlc3Ryb3lzIHRoZSBpbnN0YW5jZS4NCgkJICoNCgkJICogQG1ldGhvZCBkZXN0cm95DQoJCSAqLw0KCQlkZXN0cm95IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWVhY2godC5ldmVudHMsIGZ1bmN0aW9uKGUsIGkpIHsNCgkJCQl0Ll9yZW1vdmUoZS5vYmosIGUubmFtZSwgZS5jZnVuYyk7DQoJCQkJZS5vYmogPSBlLmNmdW5jID0gbnVsbDsNCgkJCX0pOw0KDQoJCQl0LmV2ZW50cyA9IFtdOw0KCQkJdCA9IG51bGw7DQoJCX0sDQoNCgkJX2FkZCA6IGZ1bmN0aW9uKG8sIG4sIGYpIHsNCgkJCWlmIChvLmF0dGFjaEV2ZW50KQ0KCQkJCW8uYXR0YWNoRXZlbnQoJ29uJyArIG4sIGYpOw0KCQkJZWxzZSBpZiAoby5hZGRFdmVudExpc3RlbmVyKQ0KCQkJCW8uYWRkRXZlbnRMaXN0ZW5lcihuLCBmLCBmYWxzZSk7DQoJCQllbHNlDQoJCQkJb1snb24nICsgbl0gPSBmOw0KCQl9LA0KDQoJCV9yZW1vdmUgOiBmdW5jdGlvbihvLCBuLCBmKSB7DQoJCQlpZiAobykgew0KCQkJCXRyeSB7DQoJCQkJCWlmIChvLmRldGFjaEV2ZW50KQ0KCQkJCQkJby5kZXRhY2hFdmVudCgnb24nICsgbiwgZik7DQoJCQkJCWVsc2UgaWYgKG8ucmVtb3ZlRXZlbnRMaXN0ZW5lcikNCgkJCQkJCW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLCBmLCBmYWxzZSk7DQoJCQkJCWVsc2UNCgkJCQkJCW9bJ29uJyArIG5dID0gbnVsbDsNCgkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkvLyBNaWdodCBmYWlsIHdpdGggcGVybWlzc2lvbiBkZW5pbmVkIG9uIElFIHNvIHdlIGp1c3QgaWdub3JlIHRoYXQNCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkJX3BhZ2VJbml0IDogZnVuY3Rpb24od2luKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCS8vIEtlZXAgaXQgZnJvbSBydW5uaW5nIG1vcmUgdGhhbiBvbmNlDQoJCQlpZiAodC5kb21Mb2FkZWQpDQoJCQkJcmV0dXJuOw0KDQoJCQl0LmRvbUxvYWRlZCA9IHRydWU7DQoNCgkJCWVhY2godC5pbml0cywgZnVuY3Rpb24oYykgew0KCQkJCWMoKTsNCgkJCX0pOw0KDQoJCQl0LmluaXRzID0gW107DQoJCX0sDQoNCgkJX3dhaXQgOiBmdW5jdGlvbih3aW4pIHsNCgkJCXZhciB0ID0gdGhpcywgZG9jID0gd2luLmRvY3VtZW50Ow0KDQoJCQkvLyBObyBuZWVkIHNpbmNlIHRoZSBkb2N1bWVudCBpcyBhbHJlYWR5IGxvYWRlZA0KCQkJaWYgKHdpbi50aW55TUNFX0daICYmIHRpbnlNQ0VfR1oubG9hZGVkKSB7DQoJCQkJdC5kb21Mb2FkZWQgPSAxOw0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJLy8gVXNlIElFIG1ldGhvZA0KCQkJaWYgKGRvYy5hdHRhY2hFdmVudCkgew0KCQkJCWRvYy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7DQoJCQkJCWlmIChkb2MucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KCQkJCQkJZG9jLmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsNCgkJCQkJCXQuX3BhZ2VJbml0KHdpbik7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCWlmIChkb2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICYmIHdpbiA9PSB3aW4udG9wKSB7DQoJCQkJCShmdW5jdGlvbigpIHsNCgkJCQkJCWlmICh0LmRvbUxvYWRlZCkNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCXRyeSB7DQoJCQkJCQkJLy8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkNCgkJCQkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLw0KCQkJCQkJCWRvYy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKTsNCgkJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkJc2V0VGltZW91dChhcmd1bWVudHMuY2FsbGVlLCAwKTsNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCXQuX3BhZ2VJbml0KHdpbik7DQoJCQkJCX0pKCk7DQoJCQkJfQ0KCQkJfSBlbHNlIGlmIChkb2MuYWRkRXZlbnRMaXN0ZW5lcikgew0KCQkJCXQuX2FkZCh3aW4sICdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7DQoJCQkJCXQuX3BhZ2VJbml0KHdpbik7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXQuX2FkZCh3aW4sICdsb2FkJywgZnVuY3Rpb24oKSB7DQoJCQkJdC5fcGFnZUluaXQod2luKTsNCgkJCX0pOw0KCQl9LA0KDQoJCV9zdG9wcGVycyA6IHsNCgkJCXByZXZlbnREZWZhdWx0IDogIGZ1bmN0aW9uKCkgew0KCQkJCXRoaXMucmV0dXJuVmFsdWUgPSBmYWxzZTsNCgkJCX0sDQoNCgkJCXN0b3BQcm9wYWdhdGlvbiA6IGZ1bmN0aW9uKCkgew0KCQkJCXRoaXMuY2FuY2VsQnViYmxlID0gdHJ1ZTsNCgkJCX0NCgkJfQ0KCX0pOw0KDQoJLyoqDQoJICogSW5zdGFuY2Ugb2YgRXZlbnRVdGlscyBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQuDQoJICoNCgkgKiBAcHJvcGVydHkgRXZlbnQNCgkgKiBAbWVtYmVyIHRpbnltY2UuZG9tDQoJICogQHR5cGUgdGlueW1jZS5kb20uRXZlbnRVdGlscw0KCSAqLw0KCUV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQgPSBuZXcgdGlueW1jZS5kb20uRXZlbnRVdGlscygpOw0KDQoJLy8gRGlzcGF0Y2ggRE9NIGNvbnRlbnQgbG9hZGVkIGV2ZW50IGZvciBJRSBhbmQgU2FmYXJpDQoJRXZlbnQuX3dhaXQod2luZG93KTsNCg0KCXRpbnltY2UuYWRkVW5sb2FkKGZ1bmN0aW9uKCkgew0KCQlFdmVudC5kZXN0cm95KCk7DQoJfSk7DQp9KSh0aW55bWNlKTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/Range.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBSYW5nZS5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbihucykgew0KCS8vIFJhbmdlIGNvbnN0cnVjdG9yDQoJZnVuY3Rpb24gUmFuZ2UoZG9tKSB7DQoJCXZhciB0ID0gdGhpcywNCgkJCWRvYyA9IGRvbS5kb2MsDQoJCQlFWFRSQUNUID0gMCwNCgkJCUNMT05FID0gMSwNCgkJCURFTEVURSA9IDIsDQoJCQlUUlVFID0gdHJ1ZSwNCgkJCUZBTFNFID0gZmFsc2UsDQoJCQlTVEFSVF9PRkZTRVQgPSAnc3RhcnRPZmZzZXQnLA0KCQkJU1RBUlRfQ09OVEFJTkVSID0gJ3N0YXJ0Q29udGFpbmVyJywNCgkJCUVORF9DT05UQUlORVIgPSAnZW5kQ29udGFpbmVyJywNCgkJCUVORF9PRkZTRVQgPSAnZW5kT2Zmc2V0JywNCgkJCWV4dGVuZCA9IHRpbnltY2UuZXh0ZW5kLA0KCQkJbm9kZUluZGV4ID0gZG9tLm5vZGVJbmRleDsNCg0KCQlleHRlbmQodCwgew0KCQkJLy8gSW5pdGFsIHN0YXRlcw0KCQkJc3RhcnRDb250YWluZXIgOiBkb2MsDQoJCQlzdGFydE9mZnNldCA6IDAsDQoJCQllbmRDb250YWluZXIgOiBkb2MsDQoJCQllbmRPZmZzZXQgOiAwLA0KCQkJY29sbGFwc2VkIDogVFJVRSwNCgkJCWNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIDogZG9jLA0KDQoJCQkvLyBSYW5nZSBjb25zdGFudHMNCgkJCVNUQVJUX1RPX1NUQVJUIDogMCwNCgkJCVNUQVJUX1RPX0VORCA6IDEsDQoJCQlFTkRfVE9fRU5EIDogMiwNCgkJCUVORF9UT19TVEFSVCA6IDMsDQoNCgkJCS8vIFB1YmxpYyBtZXRob2RzDQoJCQlzZXRTdGFydCA6IHNldFN0YXJ0LA0KCQkJc2V0RW5kIDogc2V0RW5kLA0KCQkJc2V0U3RhcnRCZWZvcmUgOiBzZXRTdGFydEJlZm9yZSwNCgkJCXNldFN0YXJ0QWZ0ZXIgOiBzZXRTdGFydEFmdGVyLA0KCQkJc2V0RW5kQmVmb3JlIDogc2V0RW5kQmVmb3JlLA0KCQkJc2V0RW5kQWZ0ZXIgOiBzZXRFbmRBZnRlciwNCgkJCWNvbGxhcHNlIDogY29sbGFwc2UsDQoJCQlzZWxlY3ROb2RlIDogc2VsZWN0Tm9kZSwNCgkJCXNlbGVjdE5vZGVDb250ZW50cyA6IHNlbGVjdE5vZGVDb250ZW50cywNCgkJCWNvbXBhcmVCb3VuZGFyeVBvaW50cyA6IGNvbXBhcmVCb3VuZGFyeVBvaW50cywNCgkJCWRlbGV0ZUNvbnRlbnRzIDogZGVsZXRlQ29udGVudHMsDQoJCQlleHRyYWN0Q29udGVudHMgOiBleHRyYWN0Q29udGVudHMsDQoJCQljbG9uZUNvbnRlbnRzIDogY2xvbmVDb250ZW50cywNCgkJCWluc2VydE5vZGUgOiBpbnNlcnROb2RlLA0KCQkJc3Vycm91bmRDb250ZW50cyA6IHN1cnJvdW5kQ29udGVudHMsDQoJCQljbG9uZVJhbmdlIDogY2xvbmVSYW5nZQ0KCQl9KTsNCg0KCQlmdW5jdGlvbiBzZXRTdGFydChuLCBvKSB7DQoJCQlfc2V0RW5kUG9pbnQoVFJVRSwgbiwgbyk7DQoJCX07DQoNCgkJZnVuY3Rpb24gc2V0RW5kKG4sIG8pIHsNCgkJCV9zZXRFbmRQb2ludChGQUxTRSwgbiwgbyk7DQoJCX07DQoNCgkJZnVuY3Rpb24gc2V0U3RhcnRCZWZvcmUobikgew0KCQkJc2V0U3RhcnQobi5wYXJlbnROb2RlLCBub2RlSW5kZXgobikpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHNldFN0YXJ0QWZ0ZXIobikgew0KCQkJc2V0U3RhcnQobi5wYXJlbnROb2RlLCBub2RlSW5kZXgobikgKyAxKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZXRFbmRCZWZvcmUobikgew0KCQkJc2V0RW5kKG4ucGFyZW50Tm9kZSwgbm9kZUluZGV4KG4pKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZXRFbmRBZnRlcihuKSB7DQoJCQlzZXRFbmQobi5wYXJlbnROb2RlLCBub2RlSW5kZXgobikgKyAxKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBjb2xsYXBzZSh0cykgew0KCQkJaWYgKHRzKSB7DQoJCQkJdFtFTkRfQ09OVEFJTkVSXSA9IHRbU1RBUlRfQ09OVEFJTkVSXTsNCgkJCQl0W0VORF9PRkZTRVRdID0gdFtTVEFSVF9PRkZTRVRdOw0KCQkJfSBlbHNlIHsNCgkJCQl0W1NUQVJUX0NPTlRBSU5FUl0gPSB0W0VORF9DT05UQUlORVJdOw0KCQkJCXRbU1RBUlRfT0ZGU0VUXSA9IHRbRU5EX09GRlNFVF07DQoJCQl9DQoNCgkJCXQuY29sbGFwc2VkID0gVFJVRTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZWxlY3ROb2RlKG4pIHsNCgkJCXNldFN0YXJ0QmVmb3JlKG4pOw0KCQkJc2V0RW5kQWZ0ZXIobik7DQoJCX07DQoNCgkJZnVuY3Rpb24gc2VsZWN0Tm9kZUNvbnRlbnRzKG4pIHsNCgkJCXNldFN0YXJ0KG4sIDApOw0KCQkJc2V0RW5kKG4sIG4ubm9kZVR5cGUgPT09IDEgPyBuLmNoaWxkTm9kZXMubGVuZ3RoIDogbi5ub2RlVmFsdWUubGVuZ3RoKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBjb21wYXJlQm91bmRhcnlQb2ludHMoaCwgcikgew0KCQkJdmFyIHNjID0gdFtTVEFSVF9DT05UQUlORVJdLCBzbyA9IHRbU1RBUlRfT0ZGU0VUXSwgZWMgPSB0W0VORF9DT05UQUlORVJdLCBlbyA9IHRbRU5EX09GRlNFVF07DQoNCgkJCS8vIENoZWNrIFNUQVJUX1RPX1NUQVJUDQoJCQlpZiAoaCA9PT0gMCkNCgkJCQlyZXR1cm4gX2NvbXBhcmVCb3VuZGFyeVBvaW50cyhzYywgc28sIHNjLCBzbyk7DQoNCgkJCS8vIENoZWNrIFNUQVJUX1RPX0VORA0KCQkJaWYgKGggPT09IDEpDQoJCQkJcmV0dXJuIF9jb21wYXJlQm91bmRhcnlQb2ludHMoc2MsIHNvLCBlYywgZW8pOw0KDQoJCQkvLyBDaGVjayBFTkRfVE9fRU5EDQoJCQlpZiAoaCA9PT0gMikNCgkJCQlyZXR1cm4gX2NvbXBhcmVCb3VuZGFyeVBvaW50cyhlYywgZW8sIGVjLCBlbyk7DQoNCgkJCS8vIENoZWNrIEVORF9UT19TVEFSVA0KCQkJaWYgKGggPT09IDMpDQoJCQkJcmV0dXJuIF9jb21wYXJlQm91bmRhcnlQb2ludHMoZWMsIGVvLCBzYywgc28pOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGRlbGV0ZUNvbnRlbnRzKCkgew0KCQkJX3RyYXZlcnNlKERFTEVURSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZXh0cmFjdENvbnRlbnRzKCkgew0KCQkJcmV0dXJuIF90cmF2ZXJzZShFWFRSQUNUKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBjbG9uZUNvbnRlbnRzKCkgew0KCQkJcmV0dXJuIF90cmF2ZXJzZShDTE9ORSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gaW5zZXJ0Tm9kZShuKSB7DQoJCQl2YXIgc3RhcnRDb250YWluZXIgPSB0aGlzW1NUQVJUX0NPTlRBSU5FUl0sDQoJCQkJc3RhcnRPZmZzZXQgPSB0aGlzW1NUQVJUX09GRlNFVF0sIG5uLCBvOw0KDQoJCQkvLyBOb2RlIGlzIFRFWFRfTk9ERSBvciBDREFUQQ0KCQkJaWYgKChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PT0gMyB8fCBzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PT0gNCkgJiYgc3RhcnRDb250YWluZXIubm9kZVZhbHVlKSB7DQoJCQkJaWYgKCFzdGFydE9mZnNldCkgew0KCQkJCQkvLyBBdCB0aGUgc3RhcnQgb2YgdGV4dA0KCQkJCQlzdGFydENvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCBzdGFydENvbnRhaW5lcik7DQoJCQkJfSBlbHNlIGlmIChzdGFydE9mZnNldCA+PSBzdGFydENvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoKSB7DQoJCQkJCS8vIEF0IHRoZSBlbmQgb2YgdGV4dA0KCQkJCQlkb20uaW5zZXJ0QWZ0ZXIobiwgc3RhcnRDb250YWluZXIpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIE1pZGRsZSwgbmVlZCB0byBzcGxpdA0KCQkJCQlubiA9IHN0YXJ0Q29udGFpbmVyLnNwbGl0VGV4dChzdGFydE9mZnNldCk7DQoJCQkJCXN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG4sIG5uKTsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCS8vIEluc2VydCBlbGVtZW50IG5vZGUNCgkJCQlpZiAoc3RhcnRDb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggPiAwKQ0KCQkJCQlvID0gc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tzdGFydE9mZnNldF07DQoNCgkJCQlpZiAobykNCgkJCQkJc3RhcnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKG4sIG8pOw0KCQkJCWVsc2UNCgkJCQkJc3RhcnRDb250YWluZXIuYXBwZW5kQ2hpbGQobik7DQoJCQl9DQoJCX07DQoNCgkJZnVuY3Rpb24gc3Vycm91bmRDb250ZW50cyhuKSB7DQoJCQl2YXIgZiA9IHQuZXh0cmFjdENvbnRlbnRzKCk7DQoNCgkJCXQuaW5zZXJ0Tm9kZShuKTsNCgkJCW4uYXBwZW5kQ2hpbGQoZik7DQoJCQl0LnNlbGVjdE5vZGUobik7DQoJCX07DQoNCgkJZnVuY3Rpb24gY2xvbmVSYW5nZSgpIHsNCgkJCXJldHVybiBleHRlbmQobmV3IFJhbmdlKGRvbSksIHsNCgkJCQlzdGFydENvbnRhaW5lciA6IHRbU1RBUlRfQ09OVEFJTkVSXSwNCgkJCQlzdGFydE9mZnNldCA6IHRbU1RBUlRfT0ZGU0VUXSwNCgkJCQllbmRDb250YWluZXIgOiB0W0VORF9DT05UQUlORVJdLA0KCQkJCWVuZE9mZnNldCA6IHRbRU5EX09GRlNFVF0sDQoJCQkJY29sbGFwc2VkIDogdC5jb2xsYXBzZWQsDQoJCQkJY29tbW9uQW5jZXN0b3JDb250YWluZXIgOiB0LmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyDQoJCQl9KTsNCgkJfTsNCg0KCQkvLyBQcml2YXRlIG1ldGhvZHMNCg0KCQlmdW5jdGlvbiBfZ2V0U2VsZWN0ZWROb2RlKGNvbnRhaW5lciwgb2Zmc2V0KSB7DQoJCQl2YXIgY2hpbGQ7DQoNCgkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMyAvKiBURVhUX05PREUgKi8pDQoJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCg0KCQkJaWYgKG9mZnNldCA8IDApDQoJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCg0KCQkJY2hpbGQgPSBjb250YWluZXIuZmlyc3RDaGlsZDsNCgkJCXdoaWxlIChjaGlsZCAmJiBvZmZzZXQgPiAwKSB7DQoJCQkJLS1vZmZzZXQ7DQoJCQkJY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZzsNCgkJCX0NCg0KCQkJaWYgKGNoaWxkKQ0KCQkJCXJldHVybiBjaGlsZDsNCg0KCQkJcmV0dXJuIGNvbnRhaW5lcjsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfaXNDb2xsYXBzZWQoKSB7DQoJCQlyZXR1cm4gKHRbU1RBUlRfQ09OVEFJTkVSXSA9PSB0W0VORF9DT05UQUlORVJdICYmIHRbU1RBUlRfT0ZGU0VUXSA9PSB0W0VORF9PRkZTRVRdKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfY29tcGFyZUJvdW5kYXJ5UG9pbnRzKGNvbnRhaW5lckEsIG9mZnNldEEsIGNvbnRhaW5lckIsIG9mZnNldEIpIHsNCgkJCXZhciBjLCBvZmZzZXRDLCBuLCBjbW5Sb290LCBjaGlsZEEsIGNoaWxkQjsNCg0KCQkJLy8gSW4gdGhlIGZpcnN0IGNhc2UgdGhlIGJvdW5kYXJ5LXBvaW50cyBoYXZlIHRoZSBzYW1lIGNvbnRhaW5lci4gQSBpcyBiZWZvcmUgQg0KCQkJLy8gaWYgaXRzIG9mZnNldCBpcyBsZXNzIHRoYW4gdGhlIG9mZnNldCBvZiBCLCBBIGlzIGVxdWFsIHRvIEIgaWYgaXRzIG9mZnNldCBpcw0KCQkJLy8gZXF1YWwgdG8gdGhlIG9mZnNldCBvZiBCLCBhbmQgQSBpcyBhZnRlciBCIGlmIGl0cyBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIHRoZQ0KCQkJLy8gb2Zmc2V0IG9mIEIuDQoJCQlpZiAoY29udGFpbmVyQSA9PSBjb250YWluZXJCKSB7DQoJCQkJaWYgKG9mZnNldEEgPT0gb2Zmc2V0QikNCgkJCQkJcmV0dXJuIDA7IC8vIGVxdWFsDQoNCgkJCQlpZiAob2Zmc2V0QSA8IG9mZnNldEIpDQoJCQkJCXJldHVybiAtMTsgLy8gYmVmb3JlDQoNCgkJCQlyZXR1cm4gMTsgLy8gYWZ0ZXINCgkJCX0NCg0KCQkJLy8gSW4gdGhlIHNlY29uZCBjYXNlIGEgY2hpbGQgbm9kZSBDIG9mIHRoZSBjb250YWluZXIgb2YgQSBpcyBhbiBhbmNlc3Rvcg0KCQkJLy8gY29udGFpbmVyIG9mIEIuIEluIHRoaXMgY2FzZSwgQSBpcyBiZWZvcmUgQiBpZiB0aGUgb2Zmc2V0IG9mIEEgaXMgbGVzcyB0aGFuIG9yDQoJCQkvLyBlcXVhbCB0byB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIG5vZGUgQyBhbmQgQSBpcyBhZnRlciBCIG90aGVyd2lzZS4NCgkJCWMgPSBjb250YWluZXJCOw0KCQkJd2hpbGUgKGMgJiYgYy5wYXJlbnROb2RlICE9IGNvbnRhaW5lckEpDQoJCQkJYyA9IGMucGFyZW50Tm9kZTsNCg0KCQkJaWYgKGMpIHsNCgkJCQlvZmZzZXRDID0gMDsNCgkJCQluID0gY29udGFpbmVyQS5maXJzdENoaWxkOw0KDQoJCQkJd2hpbGUgKG4gIT0gYyAmJiBvZmZzZXRDIDwgb2Zmc2V0QSkgew0KCQkJCQlvZmZzZXRDKys7DQoJCQkJCW4gPSBuLm5leHRTaWJsaW5nOw0KCQkJCX0NCg0KCQkJCWlmIChvZmZzZXRBIDw9IG9mZnNldEMpDQoJCQkJCXJldHVybiAtMTsgLy8gYmVmb3JlDQoNCgkJCQlyZXR1cm4gMTsgLy8gYWZ0ZXINCgkJCX0NCg0KCQkJLy8gSW4gdGhlIHRoaXJkIGNhc2UgYSBjaGlsZCBub2RlIEMgb2YgdGhlIGNvbnRhaW5lciBvZiBCIGlzIGFuIGFuY2VzdG9yIGNvbnRhaW5lcg0KCQkJLy8gb2YgQS4gSW4gdGhpcyBjYXNlLCBBIGlzIGJlZm9yZSBCIGlmIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgbm9kZSBDIGlzIGxlc3MgdGhhbg0KCQkJLy8gdGhlIG9mZnNldCBvZiBCIGFuZCBBIGlzIGFmdGVyIEIgb3RoZXJ3aXNlLg0KCQkJYyA9IGNvbnRhaW5lckE7DQoJCQl3aGlsZSAoYyAmJiBjLnBhcmVudE5vZGUgIT0gY29udGFpbmVyQikgew0KCQkJCWMgPSBjLnBhcmVudE5vZGU7DQoJCQl9DQoNCgkJCWlmIChjKSB7DQoJCQkJb2Zmc2V0QyA9IDA7DQoJCQkJbiA9IGNvbnRhaW5lckIuZmlyc3RDaGlsZDsNCg0KCQkJCXdoaWxlIChuICE9IGMgJiYgb2Zmc2V0QyA8IG9mZnNldEIpIHsNCgkJCQkJb2Zmc2V0QysrOw0KCQkJCQluID0gbi5uZXh0U2libGluZzsNCgkJCQl9DQoNCgkJCQlpZiAob2Zmc2V0QyA8IG9mZnNldEIpDQoJCQkJCXJldHVybiAtMTsgLy8gYmVmb3JlDQoNCgkJCQlyZXR1cm4gMTsgLy8gYWZ0ZXINCgkJCX0NCg0KCQkJLy8gSW4gdGhlIGZvdXJ0aCBjYXNlLCBub25lIG9mIHRocmVlIG90aGVyIGNhc2VzIGhvbGQ6IHRoZSBjb250YWluZXJzIG9mIEEgYW5kIEINCgkJCS8vIGFyZSBzaWJsaW5ncyBvciBkZXNjZW5kYW50cyBvZiBzaWJsaW5nIG5vZGVzLiBJbiB0aGlzIGNhc2UsIEEgaXMgYmVmb3JlIEIgaWYNCgkJCS8vIHRoZSBjb250YWluZXIgb2YgQSBpcyBiZWZvcmUgdGhlIGNvbnRhaW5lciBvZiBCIGluIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUNCgkJCS8vIFJhbmdlcycgY29udGV4dCB0cmVlIGFuZCBBIGlzIGFmdGVyIEIgb3RoZXJ3aXNlLg0KCQkJY21uUm9vdCA9IGRvbS5maW5kQ29tbW9uQW5jZXN0b3IoY29udGFpbmVyQSwgY29udGFpbmVyQik7DQoJCQljaGlsZEEgPSBjb250YWluZXJBOw0KDQoJCQl3aGlsZSAoY2hpbGRBICYmIGNoaWxkQS5wYXJlbnROb2RlICE9IGNtblJvb3QpDQoJCQkJY2hpbGRBID0gY2hpbGRBLnBhcmVudE5vZGU7DQoNCgkJCWlmICghY2hpbGRBKQ0KCQkJCWNoaWxkQSA9IGNtblJvb3Q7DQoNCgkJCWNoaWxkQiA9IGNvbnRhaW5lckI7DQoJCQl3aGlsZSAoY2hpbGRCICYmIGNoaWxkQi5wYXJlbnROb2RlICE9IGNtblJvb3QpDQoJCQkJY2hpbGRCID0gY2hpbGRCLnBhcmVudE5vZGU7DQoNCgkJCWlmICghY2hpbGRCKQ0KCQkJCWNoaWxkQiA9IGNtblJvb3Q7DQoNCgkJCWlmIChjaGlsZEEgPT0gY2hpbGRCKQ0KCQkJCXJldHVybiAwOyAvLyBlcXVhbA0KDQoJCQluID0gY21uUm9vdC5maXJzdENoaWxkOw0KCQkJd2hpbGUgKG4pIHsNCgkJCQlpZiAobiA9PSBjaGlsZEEpDQoJCQkJCXJldHVybiAtMTsgLy8gYmVmb3JlDQoNCgkJCQlpZiAobiA9PSBjaGlsZEIpDQoJCQkJCXJldHVybiAxOyAvLyBhZnRlcg0KDQoJCQkJbiA9IG4ubmV4dFNpYmxpbmc7DQoJCQl9DQoJCX07DQoNCgkJZnVuY3Rpb24gX3NldEVuZFBvaW50KHN0LCBuLCBvKSB7DQoJCQl2YXIgZWMsIHNjOw0KDQoJCQlpZiAoc3QpIHsNCgkJCQl0W1NUQVJUX0NPTlRBSU5FUl0gPSBuOw0KCQkJCXRbU1RBUlRfT0ZGU0VUXSA9IG87DQoJCQl9IGVsc2Ugew0KCQkJCXRbRU5EX0NPTlRBSU5FUl0gPSBuOw0KCQkJCXRbRU5EX09GRlNFVF0gPSBvOw0KCQkJfQ0KDQoJCQkvLyBJZiBvbmUgYm91bmRhcnktcG9pbnQgb2YgYSBSYW5nZSBpcyBzZXQgdG8gaGF2ZSBhIHJvb3QgY29udGFpbmVyDQoJCQkvLyBvdGhlciB0aGFuIHRoZSBjdXJyZW50IG9uZSBmb3IgdGhlIFJhbmdlLCB0aGUgUmFuZ2UgaXMgY29sbGFwc2VkIHRvDQoJCQkvLyB0aGUgbmV3IHBvc2l0aW9uLiBUaGlzIGVuZm9yY2VzIHRoZSByZXN0cmljdGlvbiB0aGF0IGJvdGggYm91bmRhcnktDQoJCQkvLyBwb2ludHMgb2YgYSBSYW5nZSBtdXN0IGhhdmUgdGhlIHNhbWUgcm9vdCBjb250YWluZXIuDQoJCQllYyA9IHRbRU5EX0NPTlRBSU5FUl07DQoJCQl3aGlsZSAoZWMucGFyZW50Tm9kZSkNCgkJCQllYyA9IGVjLnBhcmVudE5vZGU7DQoNCgkJCXNjID0gdFtTVEFSVF9DT05UQUlORVJdOw0KCQkJd2hpbGUgKHNjLnBhcmVudE5vZGUpDQoJCQkJc2MgPSBzYy5wYXJlbnROb2RlOw0KDQoJCQlpZiAoc2MgPT0gZWMpIHsNCgkJCQkvLyBUaGUgc3RhcnQgcG9zaXRpb24gb2YgYSBSYW5nZSBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGJlIGFmdGVyIHRoZQ0KCQkJCS8vIGVuZCBwb3NpdGlvbi4gVG8gZW5mb3JjZSB0aGlzIHJlc3RyaWN0aW9uLCBpZiB0aGUgc3RhcnQgaXMgc2V0IHRvDQoJCQkJLy8gYmUgYXQgYSBwb3NpdGlvbiBhZnRlciB0aGUgZW5kLCB0aGUgUmFuZ2UgaXMgY29sbGFwc2VkIHRvIHRoYXQNCgkJCQkvLyBwb3NpdGlvbi4NCgkJCQlpZiAoX2NvbXBhcmVCb3VuZGFyeVBvaW50cyh0W1NUQVJUX0NPTlRBSU5FUl0sIHRbU1RBUlRfT0ZGU0VUXSwgdFtFTkRfQ09OVEFJTkVSXSwgdFtFTkRfT0ZGU0VUXSkgPiAwKQ0KCQkJCQl0LmNvbGxhcHNlKHN0KTsNCgkJCX0gZWxzZQ0KCQkJCXQuY29sbGFwc2Uoc3QpOw0KDQoJCQl0LmNvbGxhcHNlZCA9IF9pc0NvbGxhcHNlZCgpOw0KCQkJdC5jb21tb25BbmNlc3RvckNvbnRhaW5lciA9IGRvbS5maW5kQ29tbW9uQW5jZXN0b3IodFtTVEFSVF9DT05UQUlORVJdLCB0W0VORF9DT05UQUlORVJdKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2UoaG93KSB7DQoJCQl2YXIgYywgZW5kQ29udGFpbmVyRGVwdGggPSAwLCBzdGFydENvbnRhaW5lckRlcHRoID0gMCwgcCwgZGVwdGhEaWZmLCBzdGFydE5vZGUsIGVuZE5vZGUsIHNwLCBlcDsNCg0KCQkJaWYgKHRbU1RBUlRfQ09OVEFJTkVSXSA9PSB0W0VORF9DT05UQUlORVJdKQ0KCQkJCXJldHVybiBfdHJhdmVyc2VTYW1lQ29udGFpbmVyKGhvdyk7DQoNCgkJCWZvciAoYyA9IHRbRU5EX0NPTlRBSU5FUl0sIHAgPSBjLnBhcmVudE5vZGU7IHA7IGMgPSBwLCBwID0gcC5wYXJlbnROb2RlKSB7DQoJCQkJaWYgKHAgPT0gdFtTVEFSVF9DT05UQUlORVJdKQ0KCQkJCQlyZXR1cm4gX3RyYXZlcnNlQ29tbW9uU3RhcnRDb250YWluZXIoYywgaG93KTsNCg0KCQkJCSsrZW5kQ29udGFpbmVyRGVwdGg7DQoJCQl9DQoNCgkJCWZvciAoYyA9IHRbU1RBUlRfQ09OVEFJTkVSXSwgcCA9IGMucGFyZW50Tm9kZTsgcDsgYyA9IHAsIHAgPSBwLnBhcmVudE5vZGUpIHsNCgkJCQlpZiAocCA9PSB0W0VORF9DT05UQUlORVJdKQ0KCQkJCQlyZXR1cm4gX3RyYXZlcnNlQ29tbW9uRW5kQ29udGFpbmVyKGMsIGhvdyk7DQoNCgkJCQkrK3N0YXJ0Q29udGFpbmVyRGVwdGg7DQoJCQl9DQoNCgkJCWRlcHRoRGlmZiA9IHN0YXJ0Q29udGFpbmVyRGVwdGggLSBlbmRDb250YWluZXJEZXB0aDsNCg0KCQkJc3RhcnROb2RlID0gdFtTVEFSVF9DT05UQUlORVJdOw0KCQkJd2hpbGUgKGRlcHRoRGlmZiA+IDApIHsNCgkJCQlzdGFydE5vZGUgPSBzdGFydE5vZGUucGFyZW50Tm9kZTsNCgkJCQlkZXB0aERpZmYtLTsNCgkJCX0NCg0KCQkJZW5kTm9kZSA9IHRbRU5EX0NPTlRBSU5FUl07DQoJCQl3aGlsZSAoZGVwdGhEaWZmIDwgMCkgew0KCQkJCWVuZE5vZGUgPSBlbmROb2RlLnBhcmVudE5vZGU7DQoJCQkJZGVwdGhEaWZmKys7DQoJCQl9DQoNCgkJCS8vIGFzY2VuZCB0aGUgYW5jZXN0b3IgaGllcmFyY2h5IHVudGlsIHdlIGhhdmUgYSBjb21tb24gcGFyZW50Lg0KCQkJZm9yIChzcCA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlLCBlcCA9IGVuZE5vZGUucGFyZW50Tm9kZTsgc3AgIT0gZXA7IHNwID0gc3AucGFyZW50Tm9kZSwgZXAgPSBlcC5wYXJlbnROb2RlKSB7DQoJCQkJc3RhcnROb2RlID0gc3A7DQoJCQkJZW5kTm9kZSA9IGVwOw0KCQkJfQ0KDQoJCQlyZXR1cm4gX3RyYXZlcnNlQ29tbW9uQW5jZXN0b3JzKHN0YXJ0Tm9kZSwgZW5kTm9kZSwgaG93KTsNCgkJfTsNCg0KCQkgZnVuY3Rpb24gX3RyYXZlcnNlU2FtZUNvbnRhaW5lcihob3cpIHsNCgkJCXZhciBmcmFnLCBzLCBzdWIsIG4sIGNudCwgc2libGluZywgeGZlck5vZGU7DQoNCgkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCWZyYWcgPSBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KDQoJCQkvLyBJZiBzZWxlY3Rpb24gaXMgZW1wdHksIGp1c3QgcmV0dXJuIHRoZSBmcmFnbWVudA0KCQkJaWYgKHRbU1RBUlRfT0ZGU0VUXSA9PSB0W0VORF9PRkZTRVRdKQ0KCQkJCXJldHVybiBmcmFnOw0KDQoJCQkvLyBUZXh0IG5vZGUgbmVlZHMgc3BlY2lhbCBjYXNlIGhhbmRsaW5nDQoJCQlpZiAodFtTVEFSVF9DT05UQUlORVJdLm5vZGVUeXBlID09IDMgLyogVEVYVF9OT0RFICovKSB7DQoJCQkJLy8gZ2V0IHRoZSBzdWJzdHJpbmcNCgkJCQlzID0gdFtTVEFSVF9DT05UQUlORVJdLm5vZGVWYWx1ZTsNCgkJCQlzdWIgPSBzLnN1YnN0cmluZyh0W1NUQVJUX09GRlNFVF0sIHRbRU5EX09GRlNFVF0pOw0KDQoJCQkJLy8gc2V0IHRoZSBvcmlnaW5hbCB0ZXh0IG5vZGUgdG8gaXRzIG5ldyB2YWx1ZQ0KCQkJCWlmIChob3cgIT0gQ0xPTkUpIHsNCgkJCQkJdFtTVEFSVF9DT05UQUlORVJdLmRlbGV0ZURhdGEodFtTVEFSVF9PRkZTRVRdLCB0W0VORF9PRkZTRVRdIC0gdFtTVEFSVF9PRkZTRVRdKTsNCg0KCQkJCQkvLyBOb3RoaW5nIGlzIHBhcnRpYWxseSBzZWxlY3RlZCwgc28gY29sbGFwc2UgdG8gc3RhcnQgcG9pbnQNCgkJCQkJdC5jb2xsYXBzZShUUlVFKTsNCgkJCQl9DQoNCgkJCQlpZiAoaG93ID09IERFTEVURSkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJZnJhZy5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoc3ViKSk7DQoJCQkJcmV0dXJuIGZyYWc7DQoJCQl9DQoNCgkJCS8vIENvcHkgbm9kZXMgYmV0d2VlbiB0aGUgc3RhcnQvZW5kIG9mZnNldHMuDQoJCQluID0gX2dldFNlbGVjdGVkTm9kZSh0W1NUQVJUX0NPTlRBSU5FUl0sIHRbU1RBUlRfT0ZGU0VUXSk7DQoJCQljbnQgPSB0W0VORF9PRkZTRVRdIC0gdFtTVEFSVF9PRkZTRVRdOw0KDQoJCQl3aGlsZSAoY250ID4gMCkgew0KCQkJCXNpYmxpbmcgPSBuLm5leHRTaWJsaW5nOw0KCQkJCXhmZXJOb2RlID0gX3RyYXZlcnNlRnVsbHlTZWxlY3RlZChuLCBob3cpOw0KDQoJCQkJaWYgKGZyYWcpDQoJCQkJCWZyYWcuYXBwZW5kQ2hpbGQoIHhmZXJOb2RlICk7DQoNCgkJCQktLWNudDsNCgkJCQluID0gc2libGluZzsNCgkJCX0NCg0KCQkJLy8gTm90aGluZyBpcyBwYXJ0aWFsbHkgc2VsZWN0ZWQsIHNvIGNvbGxhcHNlIHRvIHN0YXJ0IHBvaW50DQoJCQlpZiAoaG93ICE9IENMT05FKQ0KCQkJCXQuY29sbGFwc2UoVFJVRSk7DQoNCgkJCXJldHVybiBmcmFnOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZUNvbW1vblN0YXJ0Q29udGFpbmVyKGVuZEFuY2VzdG9yLCBob3cpIHsNCgkJCXZhciBmcmFnLCBuLCBlbmRJZHgsIGNudCwgc2libGluZywgeGZlck5vZGU7DQoNCgkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCWZyYWcgPSBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KDQoJCQluID0gX3RyYXZlcnNlUmlnaHRCb3VuZGFyeShlbmRBbmNlc3RvciwgaG93KTsNCg0KCQkJaWYgKGZyYWcpDQoJCQkJZnJhZy5hcHBlbmRDaGlsZChuKTsNCg0KCQkJZW5kSWR4ID0gbm9kZUluZGV4KGVuZEFuY2VzdG9yKTsNCgkJCWNudCA9IGVuZElkeCAtIHRbU1RBUlRfT0ZGU0VUXTsNCg0KCQkJaWYgKGNudCA8PSAwKSB7DQoJCQkJLy8gQ29sbGFwc2UgdG8ganVzdCBiZWZvcmUgdGhlIGVuZEFuY2VzdG9yLCB3aGljaA0KCQkJCS8vIGlzIHBhcnRpYWxseSBzZWxlY3RlZC4NCgkJCQlpZiAoaG93ICE9IENMT05FKSB7DQoJCQkJCXQuc2V0RW5kQmVmb3JlKGVuZEFuY2VzdG9yKTsNCgkJCQkJdC5jb2xsYXBzZShGQUxTRSk7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGZyYWc7DQoJCQl9DQoNCgkJCW4gPSBlbmRBbmNlc3Rvci5wcmV2aW91c1NpYmxpbmc7DQoJCQl3aGlsZSAoY250ID4gMCkgew0KCQkJCXNpYmxpbmcgPSBuLnByZXZpb3VzU2libGluZzsNCgkJCQl4ZmVyTm9kZSA9IF90cmF2ZXJzZUZ1bGx5U2VsZWN0ZWQobiwgaG93KTsNCg0KCQkJCWlmIChmcmFnKQ0KCQkJCQlmcmFnLmluc2VydEJlZm9yZSh4ZmVyTm9kZSwgZnJhZy5maXJzdENoaWxkKTsNCg0KCQkJCS0tY250Ow0KCQkJCW4gPSBzaWJsaW5nOw0KCQkJfQ0KDQoJCQkvLyBDb2xsYXBzZSB0byBqdXN0IGJlZm9yZSB0aGUgZW5kQW5jZXN0b3IsIHdoaWNoDQoJCQkvLyBpcyBwYXJ0aWFsbHkgc2VsZWN0ZWQuDQoJCQlpZiAoaG93ICE9IENMT05FKSB7DQoJCQkJdC5zZXRFbmRCZWZvcmUoZW5kQW5jZXN0b3IpOw0KCQkJCXQuY29sbGFwc2UoRkFMU0UpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZnJhZzsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VDb21tb25FbmRDb250YWluZXIoc3RhcnRBbmNlc3RvciwgaG93KSB7DQoJCQl2YXIgZnJhZywgc3RhcnRJZHgsIG4sIGNudCwgc2libGluZywgeGZlck5vZGU7DQoNCgkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCWZyYWcgPSBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KDQoJCQluID0gX3RyYXZlcnNlTGVmdEJvdW5kYXJ5KHN0YXJ0QW5jZXN0b3IsIGhvdyk7DQoJCQlpZiAoZnJhZykNCgkJCQlmcmFnLmFwcGVuZENoaWxkKG4pOw0KDQoJCQlzdGFydElkeCA9IG5vZGVJbmRleChzdGFydEFuY2VzdG9yKTsNCgkJCSsrc3RhcnRJZHg7ICAvLyBCZWNhdXNlIHdlIGFscmVhZHkgdHJhdmVyc2VkIGl0Li4uLg0KDQoJCQljbnQgPSB0W0VORF9PRkZTRVRdIC0gc3RhcnRJZHg7DQoJCQluID0gc3RhcnRBbmNlc3Rvci5uZXh0U2libGluZzsNCgkJCXdoaWxlIChjbnQgPiAwKSB7DQoJCQkJc2libGluZyA9IG4ubmV4dFNpYmxpbmc7DQoJCQkJeGZlck5vZGUgPSBfdHJhdmVyc2VGdWxseVNlbGVjdGVkKG4sIGhvdyk7DQoNCgkJCQlpZiAoZnJhZykNCgkJCQkJZnJhZy5hcHBlbmRDaGlsZCh4ZmVyTm9kZSk7DQoNCgkJCQktLWNudDsNCgkJCQluID0gc2libGluZzsNCgkJCX0NCg0KCQkJaWYgKGhvdyAhPSBDTE9ORSkgew0KCQkJCXQuc2V0U3RhcnRBZnRlcihzdGFydEFuY2VzdG9yKTsNCgkJCQl0LmNvbGxhcHNlKFRSVUUpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZnJhZzsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VDb21tb25BbmNlc3RvcnMoc3RhcnRBbmNlc3RvciwgZW5kQW5jZXN0b3IsIGhvdykgew0KCQkJdmFyIG4sIGZyYWcsIGNvbW1vblBhcmVudCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCwgY250LCBzaWJsaW5nLCBuZXh0U2libGluZzsNCg0KCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJZnJhZyA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQoNCgkJCW4gPSBfdHJhdmVyc2VMZWZ0Qm91bmRhcnkoc3RhcnRBbmNlc3RvciwgaG93KTsNCgkJCWlmIChmcmFnKQ0KCQkJCWZyYWcuYXBwZW5kQ2hpbGQobik7DQoNCgkJCWNvbW1vblBhcmVudCA9IHN0YXJ0QW5jZXN0b3IucGFyZW50Tm9kZTsNCgkJCXN0YXJ0T2Zmc2V0ID0gbm9kZUluZGV4KHN0YXJ0QW5jZXN0b3IpOw0KCQkJZW5kT2Zmc2V0ID0gbm9kZUluZGV4KGVuZEFuY2VzdG9yKTsNCgkJCSsrc3RhcnRPZmZzZXQ7DQoNCgkJCWNudCA9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0Ow0KCQkJc2libGluZyA9IHN0YXJ0QW5jZXN0b3IubmV4dFNpYmxpbmc7DQoNCgkJCXdoaWxlIChjbnQgPiAwKSB7DQoJCQkJbmV4dFNpYmxpbmcgPSBzaWJsaW5nLm5leHRTaWJsaW5nOw0KCQkJCW4gPSBfdHJhdmVyc2VGdWxseVNlbGVjdGVkKHNpYmxpbmcsIGhvdyk7DQoNCgkJCQlpZiAoZnJhZykNCgkJCQkJZnJhZy5hcHBlbmRDaGlsZChuKTsNCg0KCQkJCXNpYmxpbmcgPSBuZXh0U2libGluZzsNCgkJCQktLWNudDsNCgkJCX0NCg0KCQkJbiA9IF90cmF2ZXJzZVJpZ2h0Qm91bmRhcnkoZW5kQW5jZXN0b3IsIGhvdyk7DQoNCgkJCWlmIChmcmFnKQ0KCQkJCWZyYWcuYXBwZW5kQ2hpbGQobik7DQoNCgkJCWlmIChob3cgIT0gQ0xPTkUpIHsNCgkJCQl0LnNldFN0YXJ0QWZ0ZXIoc3RhcnRBbmNlc3Rvcik7DQoJCQkJdC5jb2xsYXBzZShUUlVFKTsNCgkJCX0NCg0KCQkJcmV0dXJuIGZyYWc7DQoJCX07DQoNCgkJZnVuY3Rpb24gX3RyYXZlcnNlUmlnaHRCb3VuZGFyeShyb290LCBob3cpIHsNCgkJCXZhciBuZXh0ID0gX2dldFNlbGVjdGVkTm9kZSh0W0VORF9DT05UQUlORVJdLCB0W0VORF9PRkZTRVRdIC0gMSksIHBhcmVudCwgY2xvbmVkUGFyZW50LCBwcmV2U2libGluZywgY2xvbmVkQ2hpbGQsIGNsb25lZEdyYW5kUGFyZW50LCBpc0Z1bGx5U2VsZWN0ZWQgPSBuZXh0ICE9IHRbRU5EX0NPTlRBSU5FUl07DQoNCgkJCWlmIChuZXh0ID09IHJvb3QpDQoJCQkJcmV0dXJuIF90cmF2ZXJzZU5vZGUobmV4dCwgaXNGdWxseVNlbGVjdGVkLCBGQUxTRSwgaG93KTsNCg0KCQkJcGFyZW50ID0gbmV4dC5wYXJlbnROb2RlOw0KCQkJY2xvbmVkUGFyZW50ID0gX3RyYXZlcnNlTm9kZShwYXJlbnQsIEZBTFNFLCBGQUxTRSwgaG93KTsNCg0KCQkJd2hpbGUgKHBhcmVudCkgew0KCQkJCXdoaWxlIChuZXh0KSB7DQoJCQkJCXByZXZTaWJsaW5nID0gbmV4dC5wcmV2aW91c1NpYmxpbmc7DQoJCQkJCWNsb25lZENoaWxkID0gX3RyYXZlcnNlTm9kZShuZXh0LCBpc0Z1bGx5U2VsZWN0ZWQsIEZBTFNFLCBob3cpOw0KDQoJCQkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCQkJY2xvbmVkUGFyZW50Lmluc2VydEJlZm9yZShjbG9uZWRDaGlsZCwgY2xvbmVkUGFyZW50LmZpcnN0Q2hpbGQpOw0KDQoJCQkJCWlzRnVsbHlTZWxlY3RlZCA9IFRSVUU7DQoJCQkJCW5leHQgPSBwcmV2U2libGluZzsNCgkJCQl9DQoNCgkJCQlpZiAocGFyZW50ID09IHJvb3QpDQoJCQkJCXJldHVybiBjbG9uZWRQYXJlbnQ7DQoNCgkJCQluZXh0ID0gcGFyZW50LnByZXZpb3VzU2libGluZzsNCgkJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTsNCg0KCQkJCWNsb25lZEdyYW5kUGFyZW50ID0gX3RyYXZlcnNlTm9kZShwYXJlbnQsIEZBTFNFLCBGQUxTRSwgaG93KTsNCg0KCQkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCQljbG9uZWRHcmFuZFBhcmVudC5hcHBlbmRDaGlsZChjbG9uZWRQYXJlbnQpOw0KDQoJCQkJY2xvbmVkUGFyZW50ID0gY2xvbmVkR3JhbmRQYXJlbnQ7DQoJCQl9DQoJCX07DQoNCgkJZnVuY3Rpb24gX3RyYXZlcnNlTGVmdEJvdW5kYXJ5KHJvb3QsIGhvdykgew0KCQkJdmFyIG5leHQgPSBfZ2V0U2VsZWN0ZWROb2RlKHRbU1RBUlRfQ09OVEFJTkVSXSwgdFtTVEFSVF9PRkZTRVRdKSwgaXNGdWxseVNlbGVjdGVkID0gbmV4dCAhPSB0W1NUQVJUX0NPTlRBSU5FUl0sIHBhcmVudCwgY2xvbmVkUGFyZW50LCBuZXh0U2libGluZywgY2xvbmVkQ2hpbGQsIGNsb25lZEdyYW5kUGFyZW50Ow0KDQoJCQlpZiAobmV4dCA9PSByb290KQ0KCQkJCXJldHVybiBfdHJhdmVyc2VOb2RlKG5leHQsIGlzRnVsbHlTZWxlY3RlZCwgVFJVRSwgaG93KTsNCg0KCQkJcGFyZW50ID0gbmV4dC5wYXJlbnROb2RlOw0KCQkJY2xvbmVkUGFyZW50ID0gX3RyYXZlcnNlTm9kZShwYXJlbnQsIEZBTFNFLCBUUlVFLCBob3cpOw0KDQoJCQl3aGlsZSAocGFyZW50KSB7DQoJCQkJd2hpbGUgKG5leHQpIHsNCgkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0Lm5leHRTaWJsaW5nOw0KCQkJCQljbG9uZWRDaGlsZCA9IF90cmF2ZXJzZU5vZGUobmV4dCwgaXNGdWxseVNlbGVjdGVkLCBUUlVFLCBob3cpOw0KDQoJCQkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCQkJY2xvbmVkUGFyZW50LmFwcGVuZENoaWxkKGNsb25lZENoaWxkKTsNCg0KCQkJCQlpc0Z1bGx5U2VsZWN0ZWQgPSBUUlVFOw0KCQkJCQluZXh0ID0gbmV4dFNpYmxpbmc7DQoJCQkJfQ0KDQoJCQkJaWYgKHBhcmVudCA9PSByb290KQ0KCQkJCQlyZXR1cm4gY2xvbmVkUGFyZW50Ow0KDQoJCQkJbmV4dCA9IHBhcmVudC5uZXh0U2libGluZzsNCgkJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTsNCg0KCQkJCWNsb25lZEdyYW5kUGFyZW50ID0gX3RyYXZlcnNlTm9kZShwYXJlbnQsIEZBTFNFLCBUUlVFLCBob3cpOw0KDQoJCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJCWNsb25lZEdyYW5kUGFyZW50LmFwcGVuZENoaWxkKGNsb25lZFBhcmVudCk7DQoNCgkJCQljbG9uZWRQYXJlbnQgPSBjbG9uZWRHcmFuZFBhcmVudDsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VOb2RlKG4sIGlzRnVsbHlTZWxlY3RlZCwgaXNMZWZ0LCBob3cpIHsNCgkJCXZhciB0eHRWYWx1ZSwgbmV3Tm9kZVZhbHVlLCBvbGROb2RlVmFsdWUsIG9mZnNldCwgbmV3Tm9kZTsNCg0KCQkJaWYgKGlzRnVsbHlTZWxlY3RlZCkNCgkJCQlyZXR1cm4gX3RyYXZlcnNlRnVsbHlTZWxlY3RlZChuLCBob3cpOw0KDQoJCQlpZiAobi5ub2RlVHlwZSA9PSAzIC8qIFRFWFRfTk9ERSAqLykgew0KCQkJCXR4dFZhbHVlID0gbi5ub2RlVmFsdWU7DQoNCgkJCQlpZiAoaXNMZWZ0KSB7DQoJCQkJCW9mZnNldCA9IHRbU1RBUlRfT0ZGU0VUXTsNCgkJCQkJbmV3Tm9kZVZhbHVlID0gdHh0VmFsdWUuc3Vic3RyaW5nKG9mZnNldCk7DQoJCQkJCW9sZE5vZGVWYWx1ZSA9IHR4dFZhbHVlLnN1YnN0cmluZygwLCBvZmZzZXQpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCW9mZnNldCA9IHRbRU5EX09GRlNFVF07DQoJCQkJCW5ld05vZGVWYWx1ZSA9IHR4dFZhbHVlLnN1YnN0cmluZygwLCBvZmZzZXQpOw0KCQkJCQlvbGROb2RlVmFsdWUgPSB0eHRWYWx1ZS5zdWJzdHJpbmcob2Zmc2V0KTsNCgkJCQl9DQoNCgkJCQlpZiAoaG93ICE9IENMT05FKQ0KCQkJCQluLm5vZGVWYWx1ZSA9IG9sZE5vZGVWYWx1ZTsNCg0KCQkJCWlmIChob3cgPT0gREVMRVRFKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQluZXdOb2RlID0gbi5jbG9uZU5vZGUoRkFMU0UpOw0KCQkJCW5ld05vZGUubm9kZVZhbHVlID0gbmV3Tm9kZVZhbHVlOw0KDQoJCQkJcmV0dXJuIG5ld05vZGU7DQoJCQl9DQoNCgkJCWlmIChob3cgPT0gREVMRVRFKQ0KCQkJCXJldHVybjsNCg0KCQkJcmV0dXJuIG4uY2xvbmVOb2RlKEZBTFNFKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VGdWxseVNlbGVjdGVkKG4sIGhvdykgew0KCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJcmV0dXJuIGhvdyA9PSBDTE9ORSA/IG4uY2xvbmVOb2RlKFRSVUUpIDogbjsNCg0KCQkJbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pOw0KCQl9Ow0KCX07DQoNCglucy5SYW5nZSA9IFJhbmdlOw0KfSkodGlueW1jZS5kb20pOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/RangeUtils.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBSYW5nZS5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdGlueW1jZS5kb20uUmFuZ2VVdGlscyA9IGZ1bmN0aW9uKGRvbSkgew0KCQl2YXIgSU5WSVNJQkxFX0NIQVIgPSAnXHVGRUZGJzsNCg0KCQkvKioNCgkJICogV2Fsa3MgdGhlIHNwZWNpZmllZCByYW5nZSBsaWtlIG9iamVjdCBhbmQgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrIGZvciBlYWNoIHNpYmxpbmcgY29sbGVjdGlvbiBpdCBmaW5kcy4NCgkJICoNCgkJICogQHBhcmFtIHtPYmplY3R9IHJuZyBSYW5nZSBsaWtlIG9iamVjdC4NCgkJICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmb3IgZWFjaCBzaWJsaW5nIGNvbGxlY3Rpb24uDQoJCSAqLw0KCQl0aGlzLndhbGsgPSBmdW5jdGlvbihybmcsIGNhbGxiYWNrKSB7DQoJCQl2YXIgc3RhcnRDb250YWluZXIgPSBybmcuc3RhcnRDb250YWluZXIsDQoJCQkJc3RhcnRPZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQsDQoJCQkJZW5kQ29udGFpbmVyID0gcm5nLmVuZENvbnRhaW5lciwNCgkJCQllbmRPZmZzZXQgPSBybmcuZW5kT2Zmc2V0LA0KCQkJCWFuY2VzdG9yLCBzdGFydFBvaW50LA0KCQkJCWVuZFBvaW50LCBub2RlLCBwYXJlbnQsIHNpYmxpbmdzLCBub2RlczsNCg0KCQkJLy8gSGFuZGxlIHRhYmxlIGNlbGwgc2VsZWN0aW9uIHRoZSB0YWJsZSBwbHVnaW4gZW5hYmxlcw0KCQkJLy8geW91IHRvIGZha2Ugc2VsZWN0IHRhYmxlIGNlbGxzIGFuZCBwZXJmb3JtIGZvcm1hdHRpbmcgYWN0aW9ucyBvbiB0aGVtDQoJCQlub2RlcyA9IGRvbS5zZWxlY3QoJ3RkLm1jZVNlbGVjdGVkLHRoLm1jZVNlbGVjdGVkJyk7DQoJCQlpZiAobm9kZXMubGVuZ3RoID4gMCkgew0KCQkJCXRpbnltY2UuZWFjaChub2RlcywgZnVuY3Rpb24obm9kZSkgew0KCQkJCQljYWxsYmFjayhbbm9kZV0pOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQkvKioNCgkJCSAqIENvbGxlY3RzIHNpYmxpbmdzDQoJCQkgKg0KCQkJICogQHByaXZhdGUNCgkJCSAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIGNvbGxlY3Qgc2libGluZ3MgZnJvbS4NCgkJCSAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHNpYmxpbmcgdG8gY2hlY2sgZm9yLg0KCQkJICogQHJldHVybiB7QXJyYXl9IEFycmF5IG9mIGNvbGxlY3RlZCBzaWJsaW5ncy4NCgkJCSAqLw0KCQkJZnVuY3Rpb24gY29sbGVjdFNpYmxpbmdzKG5vZGUsIG5hbWUsIGVuZF9ub2RlKSB7DQoJCQkJdmFyIHNpYmxpbmdzID0gW107DQoNCgkJCQlmb3IgKDsgbm9kZSAmJiBub2RlICE9IGVuZF9ub2RlOyBub2RlID0gbm9kZVtuYW1lXSkNCgkJCQkJc2libGluZ3MucHVzaChub2RlKTsNCg0KCQkJCXJldHVybiBzaWJsaW5nczsNCgkJCX07DQoNCgkJCS8qKg0KCQkJICogRmluZCBhbiBlbmQgcG9pbnQgdGhpcyBpcyB0aGUgbm9kZSBqdXN0IGJlZm9yZSB0aGUgY29tbW9uIGFuY2VzdG9yIHJvb3QuDQoJCQkgKg0KCQkJICogQHByaXZhdGUNCgkJCSAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHN0YXJ0IGF0Lg0KCQkJICogQHBhcmFtIHtOb2RlfSByb290IFJvb3QvYW5jZXN0b3IgZWxlbWVudCB0byBzdG9wIGp1c3QgYmVmb3JlLg0KCQkJICogQHJldHVybiB7Tm9kZX0gTm9kZSBqdXN0IGJlZm9yZSB0aGUgcm9vdCBlbGVtZW50Lg0KCQkJICovDQoJCQlmdW5jdGlvbiBmaW5kRW5kUG9pbnQobm9kZSwgcm9vdCkgew0KCQkJCWRvIHsNCgkJCQkJaWYgKG5vZGUucGFyZW50Tm9kZSA9PSByb290KQ0KCQkJCQkJcmV0dXJuIG5vZGU7DQoNCgkJCQkJbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsNCgkJCQl9IHdoaWxlKG5vZGUpOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gd2Fsa0JvdW5kYXJ5KHN0YXJ0X25vZGUsIGVuZF9ub2RlLCBuZXh0KSB7DQoJCQkJdmFyIHNpYmxpbmdOYW1lID0gbmV4dCA/ICduZXh0U2libGluZycgOiAncHJldmlvdXNTaWJsaW5nJzsNCg0KCQkJCWZvciAobm9kZSA9IHN0YXJ0X25vZGUsIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsgbm9kZSAmJiBub2RlICE9IGVuZF9ub2RlOyBub2RlID0gcGFyZW50KSB7DQoJCQkJCXBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsNCgkJCQkJc2libGluZ3MgPSBjb2xsZWN0U2libGluZ3Mobm9kZSA9PSBzdGFydF9ub2RlID8gbm9kZSA6IG5vZGVbc2libGluZ05hbWVdLCBzaWJsaW5nTmFtZSk7DQoNCgkJCQkJaWYgKHNpYmxpbmdzLmxlbmd0aCkgew0KCQkJCQkJaWYgKCFuZXh0KQ0KCQkJCQkJCXNpYmxpbmdzLnJldmVyc2UoKTsNCg0KCQkJCQkJY2FsbGJhY2soc2libGluZ3MpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfTsNCg0KCQkJLy8gSWYgaW5kZXggYmFzZWQgc3RhcnQgcG9zaXRpb24gdGhlbiByZXNvbHZlIGl0DQoJCQlpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMSAmJiBzdGFydENvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCkpDQoJCQkJc3RhcnRDb250YWluZXIgPSBzdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3N0YXJ0T2Zmc2V0XTsNCg0KCQkJLy8gSWYgaW5kZXggYmFzZWQgZW5kIHBvc2l0aW9uIHRoZW4gcmVzb2x2ZSBpdA0KCQkJaWYgKGVuZENvbnRhaW5lci5ub2RlVHlwZSA9PSAxICYmIGVuZENvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCkpDQoJCQkJZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyLmNoaWxkTm9kZXNbTWF0aC5taW4oc3RhcnRPZmZzZXQgPT0gZW5kT2Zmc2V0ID8gZW5kT2Zmc2V0IDogZW5kT2Zmc2V0IC0gMSwgZW5kQ29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoIC0gMSldOw0KDQoJCQkvLyBGaW5kIGNvbW1vbiBhbmNlc3RvciBhbmQgZW5kIHBvaW50cw0KCQkJYW5jZXN0b3IgPSBkb20uZmluZENvbW1vbkFuY2VzdG9yKHN0YXJ0Q29udGFpbmVyLCBlbmRDb250YWluZXIpOw0KDQoJCQkvLyBTYW1lIGNvbnRhaW5lcg0KCQkJaWYgKHN0YXJ0Q29udGFpbmVyID09IGVuZENvbnRhaW5lcikNCgkJCQlyZXR1cm4gY2FsbGJhY2soW3N0YXJ0Q29udGFpbmVyXSk7DQoNCgkJCS8vIFByb2Nlc3MgbGVmdCBzaWRlDQoJCQlmb3IgKG5vZGUgPSBzdGFydENvbnRhaW5lcjsgbm9kZTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSkgew0KCQkJCWlmIChub2RlID09IGVuZENvbnRhaW5lcikNCgkJCQkJcmV0dXJuIHdhbGtCb3VuZGFyeShzdGFydENvbnRhaW5lciwgYW5jZXN0b3IsIHRydWUpOw0KDQoJCQkJaWYgKG5vZGUgPT0gYW5jZXN0b3IpDQoJCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQkvLyBQcm9jZXNzIHJpZ2h0IHNpZGUNCgkJCWZvciAobm9kZSA9IGVuZENvbnRhaW5lcjsgbm9kZTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSkgew0KCQkJCWlmIChub2RlID09IHN0YXJ0Q29udGFpbmVyKQ0KCQkJCQlyZXR1cm4gd2Fsa0JvdW5kYXJ5KGVuZENvbnRhaW5lciwgYW5jZXN0b3IpOw0KDQoJCQkJaWYgKG5vZGUgPT0gYW5jZXN0b3IpDQoJCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQkvLyBGaW5kIHN0YXJ0L2VuZCBwb2ludA0KCQkJc3RhcnRQb2ludCA9IGZpbmRFbmRQb2ludChzdGFydENvbnRhaW5lciwgYW5jZXN0b3IpIHx8IHN0YXJ0Q29udGFpbmVyOw0KCQkJZW5kUG9pbnQgPSBmaW5kRW5kUG9pbnQoZW5kQ29udGFpbmVyLCBhbmNlc3RvcikgfHwgZW5kQ29udGFpbmVyOw0KDQoJCQkvLyBXYWxrIGxlZnQgbGVhZg0KCQkJd2Fsa0JvdW5kYXJ5KHN0YXJ0Q29udGFpbmVyLCBzdGFydFBvaW50LCB0cnVlKTsNCg0KCQkJLy8gV2FsayB0aGUgbWlkZGxlIGZyb20gc3RhcnQgdG8gZW5kIHBvaW50DQoJCQlzaWJsaW5ncyA9IGNvbGxlY3RTaWJsaW5ncygNCgkJCQlzdGFydFBvaW50ID09IHN0YXJ0Q29udGFpbmVyID8gc3RhcnRQb2ludCA6IHN0YXJ0UG9pbnQubmV4dFNpYmxpbmcsDQoJCQkJJ25leHRTaWJsaW5nJywNCgkJCQllbmRQb2ludCA9PSBlbmRDb250YWluZXIgPyBlbmRQb2ludC5uZXh0U2libGluZyA6IGVuZFBvaW50DQoJCQkpOw0KDQoJCQlpZiAoc2libGluZ3MubGVuZ3RoKQ0KCQkJCWNhbGxiYWNrKHNpYmxpbmdzKTsNCg0KCQkJLy8gV2FsayByaWdodCBsZWFmDQoJCQl3YWxrQm91bmRhcnkoZW5kQ29udGFpbmVyLCBlbmRQb2ludCk7DQoJCX07DQoNCgkJLyoqDQoJCSAqIFNwbGl0cyB0aGUgc3BlY2lmaWVkIHJhbmdlIGF0IGl0J3Mgc3RhcnQvZW5kIHBvaW50cy4NCgkJICoNCgkJICogQHBhcmFtIHtSYW5nZS9SYW5nZU9iamVjdH0gcm5nIFJhbmdlIHRvIHNwbGl0Lg0KCQkgKiBAcmV0dXJuIHtPYmplY3R9IFJhbmdlIHBvc2l0aW9uIG9iamVjdC4NCgkJICovDQovKgkJdGhpcy5zcGxpdCA9IGZ1bmN0aW9uKHJuZykgew0KCQkJdmFyIHN0YXJ0Q29udGFpbmVyID0gcm5nLnN0YXJ0Q29udGFpbmVyLA0KCQkJCXN0YXJ0T2Zmc2V0ID0gcm5nLnN0YXJ0T2Zmc2V0LA0KCQkJCWVuZENvbnRhaW5lciA9IHJuZy5lbmRDb250YWluZXIsDQoJCQkJZW5kT2Zmc2V0ID0gcm5nLmVuZE9mZnNldDsNCg0KCQkJZnVuY3Rpb24gc3BsaXRUZXh0KG5vZGUsIG9mZnNldCkgew0KCQkJCWlmIChvZmZzZXQgPT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoKQ0KCQkJCQlub2RlLmFwcGVuZERhdGEoSU5WSVNJQkxFX0NIQVIpOw0KDQoJCQkJbm9kZSA9IG5vZGUuc3BsaXRUZXh0KG9mZnNldCk7DQoNCgkJCQlpZiAobm9kZS5ub2RlVmFsdWUgPT09IElOVklTSUJMRV9DSEFSKQ0KCQkJCQlub2RlLm5vZGVWYWx1ZSA9ICcnOw0KDQoJCQkJcmV0dXJuIG5vZGU7DQoJCQl9Ow0KDQoJCQkvLyBIYW5kbGUgc2luZ2xlIHRleHQgbm9kZQ0KCQkJaWYgKHN0YXJ0Q29udGFpbmVyID09IGVuZENvbnRhaW5lcikgew0KCQkJCWlmIChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PSAzKSB7DQoJCQkJCWlmIChzdGFydE9mZnNldCAhPSAwKQ0KCQkJCQkJc3RhcnRDb250YWluZXIgPSBlbmRDb250YWluZXIgPSBzcGxpdFRleHQoc3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0KTsNCg0KCQkJCQlpZiAoZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQgIT0gc3RhcnRDb250YWluZXIubm9kZVZhbHVlLmxlbmd0aCkNCgkJCQkJCXNwbGl0VGV4dChzdGFydENvbnRhaW5lciwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJLy8gU3BsaXQgc3RhcnRDb250YWluZXIgdGV4dCBub2RlIGlmIG5lZWRlZA0KCQkJCWlmIChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PSAzICYmIHN0YXJ0T2Zmc2V0ICE9IDApIHsNCgkJCQkJc3RhcnRDb250YWluZXIgPSBzcGxpdFRleHQoc3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0KTsNCgkJCQkJc3RhcnRPZmZzZXQgPSAwOw0KCQkJCX0NCg0KCQkJCS8vIFNwbGl0IGVuZENvbnRhaW5lciB0ZXh0IG5vZGUgaWYgbmVlZGVkDQoJCQkJaWYgKGVuZENvbnRhaW5lci5ub2RlVHlwZSA9PSAzICYmIGVuZE9mZnNldCAhPSBlbmRDb250YWluZXIubm9kZVZhbHVlLmxlbmd0aCkgew0KCQkJCQllbmRDb250YWluZXIgPSBzcGxpdFRleHQoZW5kQ29udGFpbmVyLCBlbmRPZmZzZXQpLnByZXZpb3VzU2libGluZzsNCgkJCQkJZW5kT2Zmc2V0ID0gZW5kQ29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGg7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gew0KCQkJCXN0YXJ0Q29udGFpbmVyIDogc3RhcnRDb250YWluZXIsDQoJCQkJc3RhcnRPZmZzZXQgOiBzdGFydE9mZnNldCwNCgkJCQllbmRDb250YWluZXIgOiBlbmRDb250YWluZXIsDQoJCQkJZW5kT2Zmc2V0IDogZW5kT2Zmc2V0DQoJCQl9Ow0KCQl9Ow0KKi8NCgl9Ow0KDQoJLyoqDQoJICogQ29tcGFyZXMgdHdvIHJhbmdlcyBhbmQgY2hlY2tzIGlmIHRoZXkgYXJlIGVxdWFsLg0KCSAqDQoJICogQHN0YXRpYw0KCSAqIEBwYXJhbSB7RE9NUmFuZ2V9IHJuZzEgRmlyc3QgcmFuZ2UgdG8gY29tcGFyZS4NCgkgKiBAcGFyYW0ge0RPTVJhbmdlfSBybmcyIEZpcnN0IHJhbmdlIHRvIGNvbXBhcmUuDQoJICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZS9mYWxzZSBpZiB0aGUgcmFuZ2VzIGFyZSBlcXVhbC4NCgkgKi8NCgl0aW55bWNlLmRvbS5SYW5nZVV0aWxzLmNvbXBhcmVSYW5nZXMgPSBmdW5jdGlvbihybmcxLCBybmcyKSB7DQoJCWlmIChybmcxICYmIHJuZzIpIHsNCgkJCS8vIENvbXBhcmUgbmF0aXZlIElFIHJhbmdlcw0KCQkJaWYgKHJuZzEuaXRlbSB8fCBybmcxLmR1cGxpY2F0ZSkgew0KCQkJCS8vIEJvdGggYXJlIGNvbnRyb2wgcmFuZ2VzIGFuZCB0aGUgc2VsZWN0ZWQgZWxlbWVudCBtYXRjaGVzDQoJCQkJaWYgKHJuZzEuaXRlbSAmJiBybmcyLml0ZW0gJiYgcm5nMS5pdGVtKDApID09PSBybmcyLml0ZW0oMCkpDQoJCQkJCXJldHVybiB0cnVlOw0KDQoJCQkJLy8gQm90aCBhcmUgdGV4dCByYW5nZXMgYW5kIHRoZSByYW5nZSBtYXRjaGVzDQoJCQkJaWYgKHJuZzEuaXNFcXVhbCAmJiBybmcyLmlzRXF1YWwgJiYgcm5nMi5pc0VxdWFsKHJuZzEpKQ0KCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0gZWxzZSB7DQoJCQkJLy8gQ29tcGFyZSB3M2MgcmFuZ2VzDQoJCQkJcmV0dXJuIHJuZzEuc3RhcnRDb250YWluZXIgPT0gcm5nMi5zdGFydENvbnRhaW5lciAmJiBybmcxLnN0YXJ0T2Zmc2V0ID09IHJuZzIuc3RhcnRPZmZzZXQ7DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gZmFsc2U7DQoJfTsNCn0pKHRpbnltY2UpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/Schema.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBTY2hlbWEuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24oKSB7DQoJdmFyIHRyYW5zaXRpb25hbCA9IHt9Ow0KDQoJLyoqDQoJICogVW5wYWNrcyB0aGUgc3BlY2lmaWVkIGxvb2t1cCBhbmQgc3RyaW5nIGRhdGEgaXQgd2lsbCBhbHNvIHBhcnNlIGl0IGludG8gYW4gb2JqZWN0DQoJICogbWFwIHdpdGggc3ViIG9iamVjdCBmb3IgaXQncyBjaGlsZHJlbi4gVGhpcyB3aWxsIGxhdGVyIGFsc28gaW5jbHVkZSB0aGUgYXR0cmlidXRlcy4NCgkgKi8NCglmdW5jdGlvbiB1bnBhY2sobG9va3VwLCBkYXRhKSB7DQoJCXZhciBrZXk7DQoNCgkJZnVuY3Rpb24gcmVwbGFjZSh2YWx1ZSkgew0KCQkJcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tBLVpdKy9nLCBmdW5jdGlvbihrZXkpIHsNCgkJCQlyZXR1cm4gcmVwbGFjZShsb29rdXBba2V5XSk7DQoJCQl9KTsNCgkJfTsNCg0KCQkvLyBVbnBhY2sgbG9va3VwDQoJCWZvciAoa2V5IGluIGxvb2t1cCkgew0KCQkJaWYgKGxvb2t1cC5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KCQkJCWxvb2t1cFtrZXldID0gcmVwbGFjZShsb29rdXBba2V5XSk7DQoJCX0NCg0KCQkvLyBVbnBhY2sgYW5kIHBhcnNlIGRhdGEgaW50byBvYmplY3QgbWFwDQoJCXJlcGxhY2UoZGF0YSkucmVwbGFjZSgvIy9nLCAnI3RleHQnKS5yZXBsYWNlKC8oXHcrKVxbKFteXF1dKylcXS9nLCBmdW5jdGlvbihzdHIsIG5hbWUsIGNoaWxkcmVuKSB7DQoJCQl2YXIgaSwgbWFwID0ge307DQoNCgkJCWNoaWxkcmVuID0gY2hpbGRyZW4uc3BsaXQoL1x8Lyk7DQoNCgkJCWZvciAoaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQ0KCQkJCW1hcFtjaGlsZHJlbltpXV0gPSAxOw0KDQoJCQl0cmFuc2l0aW9uYWxbbmFtZV0gPSBtYXA7DQoJCX0pOw0KCX07DQoNCgkvLyBUaGlzIGlzIHRoZSBYSFRNTCAxLjAgdHJhbnNpdGlvbmFsIGVsZW1lbnRzIHdpdGggaXQncyBjaGlsZHJlbiBwYWNrZWQgdG8gcmVkdWNlIGl0J3Mgc2l6ZQ0KCS8vIHdlIHdpbGwgbGF0ZXIgaW5jbHVkZSB0aGUgYXR0cmlidXRlcyBoZXJlIGFuZCB1c2UgaXQgYXMgYSBkZWZhdWx0IGZvciB2YWxpZCBlbGVtZW50cyBidXQgaXQNCgkvLyByZXF1aXJlcyB1cyB0byByZXdyaXRlIHRoZSBzZXJpYWxpemVyIGVuZ2luZQ0KCXVucGFjayh7DQoJCVogOiAnI3xIfEt8TnxPfFAnLA0KCQlZIDogJyN8WHxmb3JtfFJ8UScsDQoJCVggOiAncHxUfGRpdnxVfFd8aXNpbmRleHxmaWVsZHNldHx0YWJsZScsDQoJCVcgOiAncHJlfGhyfGJsb2NrcXVvdGV8YWRkcmVzc3xjZW50ZXJ8bm9mcmFtZXMnLA0KCQlVIDogJ3VsfG9sfGRsfG1lbnV8ZGlyJywNCgkJWkMgOiAnI3xwfFl8ZGl2fFV8V3x0YWJsZXxicnxzcGFufGJkb3xvYmplY3R8YXBwbGV0fGltZ3xtYXB8S3xOfFEnLA0KCQlUIDogJ2gxfGgyfGgzfGg0fGg1fGg2JywNCgkJWkIgOiAnI3xYfFN8UScsDQoJCVMgOiAnUnxQJywNCgkJWkEgOiAnI3xhfEd8SnxNfE98UCcsDQoJCVIgOiAnI3xhfEh8S3xOfE8nLA0KCQlRIDogJ25vc2NyaXB0fFAnLA0KCQlQIDogJ2luc3xkZWx8c2NyaXB0JywNCgkJTyA6ICdpbnB1dHxzZWxlY3R8dGV4dGFyZWF8bGFiZWx8YnV0dG9uJywNCgkJTiA6ICdNfEwnLA0KCQlNIDogJ2VtfHN0cm9uZ3xkZm58Y29kZXxxfHNhbXB8a2JkfHZhcnxjaXRlfGFiYnJ8YWNyb255bScsDQoJCUwgOiAnc3VifHN1cCcsDQoJCUsgOiAnSnxJJywNCgkJSiA6ICd0dHxpfGJ8dXxzfHN0cmlrZScsDQoJCUkgOiAnYmlnfHNtYWxsfGZvbnR8YmFzZWZvbnQnLA0KCQlIIDogJ0d8RicsDQoJCUcgOiAnYnJ8c3BhbnxiZG8nLA0KCQlGIDogJ29iamVjdHxhcHBsZXR8aW1nfG1hcHxpZnJhbWUnDQoJfSwgJ3NjcmlwdFtdJyArIA0KCQknc3R5bGVbXScgKyANCgkJJ29iamVjdFsjfHBhcmFtfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdwYXJhbVtdJyArIA0KCQkncFtTXScgKyANCgkJJ2FbWl0nICsgDQoJCSdicltdJyArIA0KCQknc3BhbltTXScgKyANCgkJJ2Jkb1tTXScgKyANCgkJJ2FwcGxldFsjfHBhcmFtfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdoMVtTXScgKyANCgkJJ2ltZ1tdJyArIA0KCQknbWFwW1h8Zm9ybXxRfGFyZWFdJyArIA0KCQknaDJbU10nICsgDQoJCSdpZnJhbWVbI3xYfGZvcm18YXxIfEt8TnxPfFFdJyArIA0KCQknaDNbU10nICsgDQoJCSd0dFtTXScgKyANCgkJJ2lbU10nICsgDQoJCSdiW1NdJyArIA0KCQkndVtTXScgKyANCgkJJ3NbU10nICsgDQoJCSdzdHJpa2VbU10nICsgDQoJCSdiaWdbU10nICsgDQoJCSdzbWFsbFtTXScgKyANCgkJJ2ZvbnRbU10nICsgDQoJCSdiYXNlZm9udFtdJyArIA0KCQknZW1bU10nICsgDQoJCSdzdHJvbmdbU10nICsgDQoJCSdkZm5bU10nICsgDQoJCSdjb2RlW1NdJyArIA0KCQkncVtTXScgKyANCgkJJ3NhbXBbU10nICsgDQoJCSdrYmRbU10nICsgDQoJCSd2YXJbU10nICsgDQoJCSdjaXRlW1NdJyArIA0KCQknYWJicltTXScgKyANCgkJJ2Fjcm9ueW1bU10nICsgDQoJCSdzdWJbU10nICsgDQoJCSdzdXBbU10nICsgDQoJCSdpbnB1dFtdJyArIA0KCQknc2VsZWN0W29wdGdyb3VwfG9wdGlvbl0nICsgDQoJCSdvcHRncm91cFtvcHRpb25dJyArIA0KCQknb3B0aW9uW10nICsgDQoJCSd0ZXh0YXJlYVtdJyArIA0KCQknbGFiZWxbU10nICsgDQoJCSdidXR0b25bI3xwfFR8ZGl2fFV8V3x0YWJsZXxHfG9iamVjdHxhcHBsZXR8aW1nfG1hcHxLfE58UV0nICsgDQoJCSdoNFtTXScgKyANCgkJJ2luc1sjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdoNVtTXScgKyANCgkJJ2RlbFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdoNltTXScgKyANCgkJJ2RpdlsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSd1bFtsaV0nICsgDQoJCSdsaVsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdvbFtsaV0nICsgDQoJCSdkbFtkdHxkZF0nICsgDQoJCSdkdFtTXScgKyANCgkJJ2RkWyN8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ21lbnVbbGldJyArIA0KCQknZGlyW2xpXScgKyANCgkJJ3ByZVtaQV0nICsgDQoJCSdocltdJyArIA0KCQknYmxvY2txdW90ZVsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdhZGRyZXNzW1N8cF0nICsgDQoJCSdjZW50ZXJbI3xYfGZvcm18YXxIfEt8TnxPfFFdJyArIA0KCQknbm9mcmFtZXNbI3xYfGZvcm18YXxIfEt8TnxPfFFdJyArIA0KCQknaXNpbmRleFtdJyArIA0KCQknZmllbGRzZXRbI3xsZWdlbmR8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ2xlZ2VuZFtTXScgKyANCgkJJ3RhYmxlW2NhcHRpb258Y29sfGNvbGdyb3VwfHRoZWFkfHRmb290fHRib2R5fHRyXScgKyANCgkJJ2NhcHRpb25bU10nICsgDQoJCSdjb2xbXScgKyANCgkJJ2NvbGdyb3VwW2NvbF0nICsgDQoJCSd0aGVhZFt0cl0nICsgDQoJCSd0clt0aHx0ZF0nICsgDQoJCSd0aFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdmb3JtWyN8WHxhfEh8S3xOfE98UV0nICsgDQoJCSdub3NjcmlwdFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSd0ZFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSd0Zm9vdFt0cl0nICsgDQoJCSd0Ym9keVt0cl0nICsgDQoJCSdhcmVhW10nICsgDQoJCSdiYXNlW10nICsgDQoJCSdib2R5WyN8WHxmb3JtfGF8SHxLfE58T3xRXScNCgkpOw0KDQoJLyoqDQoJICogU2NoZW1hIHZhbGlkYXRvciBjbGFzcy4NCgkgKg0KCSAqIEBjbGFzcyB0aW55bWNlLmRvbS5TY2hlbWENCgkgKiBAZXhhbXBsZQ0KCSAqICBpZiAodGlueW1jZS5hY3RpdmVFZGl0b3Iuc2NoZW1hLmlzVmFsaWQoJ3AnLCAnc3BhbicpKQ0KCSAqICAgIGFsZXJ0KCdzcGFuIGlzIHZhbGlkIGNoaWxkIG9mIHAuJyk7DQoJICovDQoJdGlueW1jZS5kb20uU2NoZW1hID0gZnVuY3Rpb24oKSB7DQoJCXZhciB0ID0gdGhpcywgZWxlbWVudHMgPSB0cmFuc2l0aW9uYWw7DQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdHJ1ZS9mYWxzZSBpZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIG9wdGlvbmFsbHkgaXQncyBjaGlsZCBpcyB2YWxpZCBvciBub3QNCgkJICogYWNjb3JkaW5nIHRvIHRoZSBYSFRNTCB0cmFuc2l0aW9uYWwgRFRELg0KCQkgKg0KCQkgKiBAbWV0aG9kIGlzVmFsaWQNCgkJICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgRWxlbWVudCBuYW1lIHRvIGNoZWNrIGZvci4NCgkJICogQHBhcmFtIHtTdHJpbmd9IGNoaWxkX25hbWUgRWxlbWVudCBjaGlsZCBuYW1lIHRvIGNoZWNrIGZvci4NCgkJICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZS9mYWxzZSBpZiB0aGUgZWxlbWVudCBpcyB2YWxpZCBvciBub3QuDQoJCSAqLw0KCQl0LmlzVmFsaWQgPSBmdW5jdGlvbihuYW1lLCBjaGlsZF9uYW1lKSB7DQoJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW25hbWVdOw0KDQoJCQlyZXR1cm4gISEoZWxlbWVudCAmJiAoIWNoaWxkX25hbWUgfHwgZWxlbWVudFtjaGlsZF9uYW1lXSkpOw0KCQl9Ow0KCX07DQp9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/ScriptLoader.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBTY3JpcHRMb2FkZXIuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXRpbnltY2UuZG9tLlNjcmlwdExvYWRlciA9IGZ1bmN0aW9uKHNldHRpbmdzKSB7DQoJCXZhciBRVUVVRUQgPSAwLA0KCQkJTE9BRElORyA9IDEsDQoJCQlMT0FERUQgPSAyLA0KCQkJc3RhdGVzID0ge30sDQoJCQlxdWV1ZSA9IFtdLA0KCQkJc2NyaXB0TG9hZGVkQ2FsbGJhY2tzID0ge30sDQoJCQlxdWV1ZUxvYWRlZENhbGxiYWNrcyA9IFtdLA0KCQkJbG9hZGluZyA9IDAsDQoJCQl1bmRlZmluZWQ7DQoNCgkJLyoqDQoJCSAqIExvYWRzIGEgc3BlY2lmaWMgc2NyaXB0IGRpcmVjdGx5IHdpdGhvdXQgYWRkaW5nIGl0IHRvIHRoZSBsb2FkIHF1ZXVlLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGxvYWQNCgkJICogQHBhcmFtIHtTdHJpbmd9IHVybCBBYnNvbHV0ZSBVUkwgdG8gc2NyaXB0IHRvIGFkZC4NCgkJICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgT3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSBvbmVzIHRoaXMgc2NyaXB0IGdldHMgbG9hZGVkLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gc2NvcGUgT3B0aW9uYWwgc2NvcGUgdG8gZXhlY3V0ZSBjYWxsYmFjayBpbi4NCgkJICovDQoJCWZ1bmN0aW9uIGxvYWRTY3JpcHQodXJsLCBjYWxsYmFjaykgew0KCQkJdmFyIHQgPSB0aGlzLCBkb20gPSB0aW55bWNlLkRPTSwgZWxtLCB1cmksIGxvYywgaWQ7DQoNCgkJCS8vIEV4ZWN1dGUgY2FsbGJhY2sgd2hlbiBzY3JpcHQgaXMgbG9hZGVkDQoJCQlmdW5jdGlvbiBkb25lKCkgew0KCQkJCWRvbS5yZW1vdmUoaWQpOw0KDQoJCQkJaWYgKGVsbSkNCgkJCQkJZWxtLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGVsbS5vbmxvYWQgPSBlbG0gPSBudWxsOw0KDQoJCQkJY2FsbGJhY2soKTsNCgkJCX07DQoNCgkJCWlkID0gZG9tLnVuaXF1ZUlkKCk7DQoNCgkJCWlmICh0aW55bWNlLmlzSUU2KSB7DQoJCQkJdXJpID0gbmV3IHRpbnltY2UudXRpbC5VUkkodXJsKTsNCgkJCQlsb2MgPSBsb2NhdGlvbjsNCg0KCQkJCS8vIElmIHNjcmlwdCBpcyBmcm9tIHNhbWUgZG9tYWluIGFuZCB3ZQ0KCQkJCS8vIHVzZSBJRSA2IHRoZW4gdXNlIFhIUiBzaW5jZSBpdCdzIG1vcmUgcmVsaWFibGUNCgkJCQlpZiAodXJpLmhvc3QgPT0gbG9jLmhvc3RuYW1lICYmIHVyaS5wb3J0ID09IGxvYy5wb3J0ICYmICh1cmkucHJvdG9jb2wgKyAnOicpID09IGxvYy5wcm90b2NvbCkgew0KCQkJCQl0aW55bWNlLnV0aWwuWEhSLnNlbmQoew0KCQkJCQkJdXJsIDogdGlueW1jZS5fYWRkVmVyKHVyaS5nZXRVUkkoKSksDQoJCQkJCQlzdWNjZXNzIDogZnVuY3Rpb24oY29udGVudCkgew0KCQkJCQkJCS8vIENyZWF0ZSBuZXcgdGVtcCBzY3JpcHQgZWxlbWVudA0KCQkJCQkJCXZhciBzY3JpcHQgPSBkb20uY3JlYXRlKCdzY3JpcHQnLCB7DQoJCQkJCQkJCXR5cGUgOiAndGV4dC9qYXZhc2NyaXB0Jw0KCQkJCQkJCX0pOw0KDQoJCQkJCQkJLy8gRXZhbHVhdGUgc2NyaXB0IGluIGdsb2JhbCBzY29wZQ0KCQkJCQkJCXNjcmlwdC50ZXh0ID0gY29udGVudDsNCgkJCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHNjcmlwdCk7DQoJCQkJCQkJZG9tLnJlbW92ZShzY3JpcHQpOw0KDQoJCQkJCQkJZG9uZSgpOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCg0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBDcmVhdGUgbmV3IHNjcmlwdCBlbGVtZW50DQoJCQllbG0gPSBkb20uY3JlYXRlKCdzY3JpcHQnLCB7DQoJCQkJaWQgOiBpZCwNCgkJCQl0eXBlIDogJ3RleHQvamF2YXNjcmlwdCcsDQoJCQkJc3JjIDogdGlueW1jZS5fYWRkVmVyKHVybCkNCgkJCX0pOw0KDQoJCQkvLyBBZGQgb25sb2FkIGxpc3RlbmVyIGZvciBub24gSUUgYnJvd3NlcnMgc2luY2UgSUU5DQoJCQkvLyBmaXJlcyBvbmxvYWQgZXZlbnQgYmVmb3JlIHRoZSBzY3JpcHQgaXMgcGFyc2VkIGFuZCBleGVjdXRlZA0KCQkJaWYgKCF0aW55bWNlLmlzSUUpDQoJCQkJZWxtLm9ubG9hZCA9IGRvbmU7DQoNCgkJCWVsbS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsNCgkJCQl2YXIgc3RhdGUgPSBlbG0ucmVhZHlTdGF0ZTsNCg0KCQkJCS8vIExvYWRlZCBzdGF0ZSBpcyBwYXNzZWQgb24gSUUgNiBob3dldmVyIHRoZXJlDQoJCQkJLy8gYXJlIGtub3duIGlzc3VlcyB3aXRoIHRoaXMgbWV0aG9kIGJ1dCB3ZSBjYW4ndCB1c2UNCgkJCQkvLyBYSFIgaW4gYSBjcm9zcyBkb21haW4gbG9hZGluZw0KCQkJCWlmIChzdGF0ZSA9PSAnY29tcGxldGUnIHx8IHN0YXRlID09ICdsb2FkZWQnKQ0KCQkJCQlkb25lKCk7DQoJCQl9Ow0KDQoJCQkvLyBNb3N0IGJyb3dzZXJzIHN1cHBvcnQgdGhpcyBmZWF0dXJlIHNvIHdlIHJlcG9ydCBlcnJvcnMNCgkJCS8vIGZvciB0aG9zZSBhdCBsZWFzdCB0byBoZWxwIHVzZXJzIHRyYWNrIHRoZWlyIG1pc3NpbmcgcGx1Z2lucyBldGMNCgkJCS8vIHRvZG86IFJlbW92ZWQgc2luY2UgaXQgcHJvZHVjZWQgZXJyb3IgaWYgdGhlIGRvY3VtZW50IGlzIHVubG9hZGVkIGJ5IG5hdmlnYXRpbmcgYXdheSwgcmUtYWRkIGl0IGFzIGFuIG9wdGlvbg0KCQkJLyplbG0ub25lcnJvciA9IGZ1bmN0aW9uKCkgew0KCQkJCWFsZXJ0KCdGYWlsZWQgdG8gbG9hZDogJyArIHVybCk7DQoJCQl9OyovDQoNCgkJCS8vIEFkZCBzY3JpcHQgdG8gZG9jdW1lbnQNCgkJCShkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdIHx8IGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKGVsbSk7DQoJCX07DQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdHJ1ZS9mYWxzZSBpZiBhIHNjcmlwdCBoYXMgYmVlbiBsb2FkZWQgb3Igbm90Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGlzRG9uZQ0KCQkgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFVSTCB0byBjaGVjayBmb3IuDQoJCSAqIEByZXR1cm4gW0Jvb2xlYW59IHRydWUvZmFsc2UgaWYgdGhlIFVSTCBpcyBsb2FkZWQuDQoJCSAqLw0KCQl0aGlzLmlzRG9uZSA9IGZ1bmN0aW9uKHVybCkgew0KCQkJcmV0dXJuIHN0YXRlc1t1cmxdID09IExPQURFRDsNCgkJfTsNCg0KCQkvKioNCgkJICogTWFya3MgYSBzcGVjaWZpYyBzY3JpcHQgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgYSBzY3JpcHQgZ290IGxvYWRlZCBvdXRzaWRlDQoJCSAqIHRoZSBzY3JpcHQgbG9hZGVyIG9yIHRvIHNraXAgaXQgZnJvbSBsb2FkaW5nIHNvbWUgc2NyaXB0Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIG1hcmtEb25lDQoJCSAqIEBwYXJhbSB7c3RyaW5nfSB1IEFic29sdXRlIFVSTCB0byB0aGUgc2NyaXB0IHRvIG1hcmsgYXMgbG9hZGVkLg0KCQkgKi8NCgkJdGhpcy5tYXJrRG9uZSA9IGZ1bmN0aW9uKHVybCkgew0KCQkJc3RhdGVzW3VybF0gPSBMT0FERUQ7DQoJCX07DQoNCgkJLyoqDQoJCSAqIEFkZHMgYSBzcGVjaWZpYyBzY3JpcHQgdG8gdGhlIGxvYWQgcXVldWUgb2YgdGhlIHNjcmlwdCBsb2FkZXIuDQoJCSAqDQoJCSAqIEBtZXRob2QgYWRkDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgQWJzb2x1dGUgVVJMIHRvIHNjcmlwdCB0byBhZGQuDQoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIE9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb25lcyB0aGlzIHNjcmlwdCBnZXRzIGxvYWRlZC4NCgkJICogQHBhcmFtIHtPYmplY3R9IHNjb3BlIE9wdGlvbmFsIHNjb3BlIHRvIGV4ZWN1dGUgY2FsbGJhY2sgaW4uDQoJCSAqLw0KCQl0aGlzLmFkZCA9IHRoaXMubG9hZCA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2ssIHNjb3BlKSB7DQoJCQl2YXIgaXRlbSwgc3RhdGUgPSBzdGF0ZXNbdXJsXTsNCg0KCQkJLy8gQWRkIHVybCB0byBsb2FkIHF1ZXVlDQoJCQlpZiAoc3RhdGUgPT0gdW5kZWZpbmVkKSB7DQoJCQkJcXVldWUucHVzaCh1cmwpOw0KCQkJCXN0YXRlc1t1cmxdID0gUVVFVUVEOw0KCQkJfQ0KDQoJCQlpZiAoY2FsbGJhY2spIHsNCgkJCQkvLyBTdG9yZSBhd2F5IGNhbGxiYWNrIGZvciBsYXRlciBleGVjdXRpb24NCgkJCQlpZiAoIXNjcmlwdExvYWRlZENhbGxiYWNrc1t1cmxdKQ0KCQkJCQlzY3JpcHRMb2FkZWRDYWxsYmFja3NbdXJsXSA9IFtdOw0KDQoJCQkJc2NyaXB0TG9hZGVkQ2FsbGJhY2tzW3VybF0ucHVzaCh7DQoJCQkJCWZ1bmMgOiBjYWxsYmFjaywNCgkJCQkJc2NvcGUgOiBzY29wZSB8fCB0aGlzDQoJCQkJfSk7DQoJCQl9DQoJCX07DQoNCgkJLyoqDQoJCSAqIFN0YXJ0cyB0aGUgbG9hZGluZyBvZiB0aGUgcXVldWUuDQoJCSAqDQoJCSAqIEBtZXRob2QgbG9hZFF1ZXVlDQoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIE9wdGlvbmFsIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiBhbGwgcXVldWVkIGl0ZW1zIGFyZSBsb2FkZWQuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzY29wZSBPcHRpb25hbCBzY29wZSB0byBleGVjdXRlIHRoZSBjYWxsYmFjayBpbi4NCgkJICovDQoJCXRoaXMubG9hZFF1ZXVlID0gZnVuY3Rpb24oY2FsbGJhY2ssIHNjb3BlKSB7DQoJCQl0aGlzLmxvYWRTY3JpcHRzKHF1ZXVlLCBjYWxsYmFjaywgc2NvcGUpOw0KCQl9Ow0KDQoJCS8qKg0KCQkgKiBMb2FkcyB0aGUgc3BlY2lmaWVkIHF1ZXVlIG9mIGZpbGVzIGFuZCBleGVjdXRlcyB0aGUgY2FsbGJhY2sgb25lcyB0aGV5IGFyZSBsb2FkZWQuDQoJCSAqIFRoaXMgbWV0aG9kIGlzIGdlbmVyYWxseSBub3QgdXNlZCBvdXRzaWRlIHRoaXMgY2xhc3MgYnV0IGl0IG1pZ2h0IGJlIHVzZWZ1bCBpbiBzb21lIHNjZW5hcmlvcy4gDQoJCSAqDQoJCSAqIEBtZXRob2QgbG9hZFNjcmlwdHMNCgkJICogQHBhcmFtIHtBcnJheX0gc2NyaXB0cyBBcnJheSBvZiBxdWV1ZSBpdGVtcyB0byBsb2FkLg0KCQkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBPcHRpb25hbCBjYWxsYmFjayB0byBleGVjdXRlIG9uZXMgYWxsIGl0ZW1zIGFyZSBsb2FkZWQuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzY29wZSBPcHRpb25hbCBzY29wZSB0byBleGVjdXRlIGNhbGxiYWNrIGluLg0KCQkgKi8NCgkJdGhpcy5sb2FkU2NyaXB0cyA9IGZ1bmN0aW9uKHNjcmlwdHMsIGNhbGxiYWNrLCBzY29wZSkgew0KCQkJdmFyIGxvYWRTY3JpcHRzOw0KDQoJCQlmdW5jdGlvbiBleGVjU2NyaXB0TG9hZGVkQ2FsbGJhY2tzKHVybCkgew0KCQkJCS8vIEV4ZWN1dGUgVVJMIGNhbGxiYWNrIGZ1bmN0aW9ucw0KCQkJCXRpbnltY2UuZWFjaChzY3JpcHRMb2FkZWRDYWxsYmFja3NbdXJsXSwgZnVuY3Rpb24oY2FsbGJhY2spIHsNCgkJCQkJY2FsbGJhY2suZnVuYy5jYWxsKGNhbGxiYWNrLnNjb3BlKTsNCgkJCQl9KTsNCg0KCQkJCXNjcmlwdExvYWRlZENhbGxiYWNrc1t1cmxdID0gdW5kZWZpbmVkOw0KCQkJfTsNCg0KCQkJcXVldWVMb2FkZWRDYWxsYmFja3MucHVzaCh7DQoJCQkJZnVuYyA6IGNhbGxiYWNrLA0KCQkJCXNjb3BlIDogc2NvcGUgfHwgdGhpcw0KCQkJfSk7DQoNCgkJCWxvYWRTY3JpcHRzID0gZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGxvYWRpbmdTY3JpcHRzID0gdGlueW1jZS5ncmVwKHNjcmlwdHMpOw0KDQoJCQkJLy8gQ3VycmVudCBzY3JpcHRzIGhhcyBiZWVuIGhhbmRsZWQNCgkJCQlzY3JpcHRzLmxlbmd0aCA9IDA7DQoNCgkJCQkvLyBMb2FkIHNjcmlwdHMgdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQNCgkJCQl0aW55bWNlLmVhY2gobG9hZGluZ1NjcmlwdHMsIGZ1bmN0aW9uKHVybCkgew0KCQkJCQkvLyBTY3JpcHQgaXMgYWxyZWFkeSBsb2FkZWQgdGhlbiBleGVjdXRlIHNjcmlwdCBjYWxsYmFja3MgZGlyZWN0bHkNCgkJCQkJaWYgKHN0YXRlc1t1cmxdID09IExPQURFRCkgew0KCQkJCQkJZXhlY1NjcmlwdExvYWRlZENhbGxiYWNrcyh1cmwpOw0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoNCgkJCQkJLy8gSXMgc2NyaXB0IG5vdCBsb2FkaW5nIHRoZW4gc3RhcnQgbG9hZGluZyBpdA0KCQkJCQlpZiAoc3RhdGVzW3VybF0gIT0gTE9BRElORykgew0KCQkJCQkJc3RhdGVzW3VybF0gPSBMT0FESU5HOw0KCQkJCQkJbG9hZGluZysrOw0KDQoJCQkJCQlsb2FkU2NyaXB0KHVybCwgZnVuY3Rpb24oKSB7DQoJCQkJCQkJc3RhdGVzW3VybF0gPSBMT0FERUQ7DQoJCQkJCQkJbG9hZGluZy0tOw0KDQoJCQkJCQkJZXhlY1NjcmlwdExvYWRlZENhbGxiYWNrcyh1cmwpOw0KDQoJCQkJCQkJLy8gTG9hZCBtb3JlIHNjcmlwdHMgaWYgdGhleSB3aGVyZSBhZGRlZCBieSB0aGUgcmVjZW50bHkgbG9hZGVkIHNjcmlwdA0KCQkJCQkJCWxvYWRTY3JpcHRzKCk7DQoJCQkJCQl9KTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJLy8gTm8gc2NyaXB0cyBhcmUgY3VycmVudGx5IGxvYWRpbmcgdGhlbiBleGVjdXRlIGFsbCBwZW5kaW5nIHF1ZXVlIGxvYWRlZCBjYWxsYmFja3MNCgkJCQlpZiAoIWxvYWRpbmcpIHsNCgkJCQkJdGlueW1jZS5lYWNoKHF1ZXVlTG9hZGVkQ2FsbGJhY2tzLCBmdW5jdGlvbihjYWxsYmFjaykgew0KCQkJCQkJY2FsbGJhY2suZnVuYy5jYWxsKGNhbGxiYWNrLnNjb3BlKTsNCgkJCQkJfSk7DQoNCgkJCQkJcXVldWVMb2FkZWRDYWxsYmFja3MubGVuZ3RoID0gMDsNCgkJCQl9DQoJCQl9Ow0KDQoJCQlsb2FkU2NyaXB0cygpOw0KCQl9Ow0KCX07DQoNCgkvLyBHbG9iYWwgc2NyaXB0IGxvYWRlcg0KCXRpbnltY2UuU2NyaXB0TG9hZGVyID0gbmV3IHRpbnltY2UuZG9tLlNjcmlwdExvYWRlcigpOw0KfSkodGlueW1jZSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/Selection.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBTZWxlY3Rpb24uanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCWZ1bmN0aW9uIHRyaW1ObChzKSB7DQoJCXJldHVybiBzLnJlcGxhY2UoL1tcblxyXSsvZywgJycpOw0KCX07DQoNCgkvLyBTaG9ydGVuIG5hbWVzDQoJdmFyIGlzID0gdGlueW1jZS5pcywgaXNJRSA9IHRpbnltY2UuaXNJRSwgZWFjaCA9IHRpbnltY2UuZWFjaDsNCg0KCS8qKg0KCSAqIFRoaXMgY2xhc3MgaGFuZGxlcyB0ZXh0IGFuZCBjb250cm9sIHNlbGVjdGlvbiBpdCdzIGFuIGNyb3NzYnJvd3NlciB1dGlsaXR5IGNsYXNzLg0KCSAqIENvbnN1bHQgdGhlIFRpbnlNQ0UgV2lraSBBUEkgZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMgb24gaG93IHRvIHVzZSB0aGlzIGNsYXNzLg0KCSAqIEBjbGFzcyB0aW55bWNlLmRvbS5TZWxlY3Rpb24NCgkgKi8NCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5kb20uU2VsZWN0aW9uJywgew0KCQkvKioNCgkJICogQ29uc3RydWN0cyBhIG5ldyBzZWxlY3Rpb24gaW5zdGFuY2UuDQoJCSAqDQoJCSAqIEBjb25zdHJ1Y3Rvcg0KCQkgKiBAbWV0aG9kIFNlbGVjdGlvbg0KCQkgKiBAcGFyYW0ge3RpbnltY2UuZG9tLkRPTVV0aWxzfSBkb20gRE9NVXRpbHMgb2JqZWN0IHJlZmVyZW5jZS4NCgkJICogQHBhcmFtIHtXaW5kb3d9IHdpbiBXaW5kb3cgdG8gYmluZCB0aGUgc2VsZWN0aW9uIG9iamVjdCB0by4NCgkJICogQHBhcmFtIHt0aW55bWNlLmRvbS5TZXJpYWxpemVyfSBzZXJpYWxpemVyIERPTSBzZXJpYWxpemF0aW9uIGNsYXNzIHRvIHVzZSBmb3IgZ2V0Q29udGVudC4NCgkJICovDQoJCVNlbGVjdGlvbiA6IGZ1bmN0aW9uKGRvbSwgd2luLCBzZXJpYWxpemVyKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQuZG9tID0gZG9tOw0KCQkJdC53aW4gPSB3aW47DQoJCQl0LnNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyOw0KDQoJCQkvLyBBZGQgZXZlbnRzDQoJCQllYWNoKFsNCgkJCQknb25CZWZvcmVTZXRDb250ZW50JywNCgkJCQknb25CZWZvcmVHZXRDb250ZW50JywNCgkJCQknb25TZXRDb250ZW50JywNCgkJCQknb25HZXRDb250ZW50Jw0KCQkJXSwgZnVuY3Rpb24oZSkgew0KCQkJCXRbZV0gPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodCk7DQoJCQl9KTsNCg0KCQkJLy8gTm8gVzNDIFJhbmdlIHN1cHBvcnQNCgkJCWlmICghdC53aW4uZ2V0U2VsZWN0aW9uKQ0KCQkJCXQudHJpZGVudFNlbCA9IG5ldyB0aW55bWNlLmRvbS5UcmlkZW50U2VsZWN0aW9uKHQpOw0KDQoJCQlpZiAodGlueW1jZS5pc0lFICYmIGRvbS5ib3hNb2RlbCkNCgkJCQl0aGlzLl9maXhJRVNlbGVjdGlvbigpOw0KDQoJCQkvLyBQcmV2ZW50IGxlYWtzDQoJCQl0aW55bWNlLmFkZFVubG9hZCh0LmRlc3Ryb3ksIHQpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBjb250ZW50cyB1c2luZyB0aGUgRE9NIHNlcmlhbGl6ZXIgcGFzc2VkIGluIHRvIHRoaXMgY2xhc3MuDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0Q29udGVudA0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBzZXR0aW5ncyBjbGFzcyB3aXRoIGZvciBleGFtcGxlIG91dHB1dCBmb3JtYXQgdGV4dCBvciBodG1sLg0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IFNlbGVjdGVkIGNvbnRlbnRzIGluIGZvciBleGFtcGxlIEhUTUwgZm9ybWF0Lg0KCQkgKi8NCgkJZ2V0Q29udGVudCA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgciA9IHQuZ2V0Um5nKCksIGUgPSB0LmRvbS5jcmVhdGUoImJvZHkiKSwgc2UgPSB0LmdldFNlbCgpLCB3Yiwgd2EsIG47DQoNCgkJCXMgPSBzIHx8IHt9Ow0KCQkJd2IgPSB3YSA9ICcnOw0KCQkJcy5nZXQgPSB0cnVlOw0KCQkJcy5mb3JtYXQgPSBzLmZvcm1hdCB8fCAnaHRtbCc7DQoJCQl0Lm9uQmVmb3JlR2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCg0KCQkJaWYgKHMuZm9ybWF0ID09ICd0ZXh0JykNCgkJCQlyZXR1cm4gdC5pc0NvbGxhcHNlZCgpID8gJycgOiAoci50ZXh0IHx8IChzZS50b1N0cmluZyA/IHNlLnRvU3RyaW5nKCkgOiAnJykpOw0KDQoJCQlpZiAoci5jbG9uZUNvbnRlbnRzKSB7DQoJCQkJbiA9IHIuY2xvbmVDb250ZW50cygpOw0KDQoJCQkJaWYgKG4pDQoJCQkJCWUuYXBwZW5kQ2hpbGQobik7DQoJCQl9IGVsc2UgaWYgKGlzKHIuaXRlbSkgfHwgaXMoci5odG1sVGV4dCkpDQoJCQkJZS5pbm5lckhUTUwgPSByLml0ZW0gPyByLml0ZW0oMCkub3V0ZXJIVE1MIDogci5odG1sVGV4dDsNCgkJCWVsc2UNCgkJCQllLmlubmVySFRNTCA9IHIudG9TdHJpbmcoKTsNCg0KCQkJLy8gS2VlcCB3aGl0ZXNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXINCgkJCWlmICgvXlxzLy50ZXN0KGUuaW5uZXJIVE1MKSkNCgkJCQl3YiA9ICcgJzsNCg0KCQkJaWYgKC9ccyskLy50ZXN0KGUuaW5uZXJIVE1MKSkNCgkJCQl3YSA9ICcgJzsNCg0KCQkJcy5nZXRJbm5lciA9IHRydWU7DQoNCgkJCXMuY29udGVudCA9IHQuaXNDb2xsYXBzZWQoKSA/ICcnIDogd2IgKyB0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKGUsIHMpICsgd2E7DQoJCQl0Lm9uR2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCg0KCQkJcmV0dXJuIHMuY29udGVudDsNCgkJfSwNCg0KCQkvKioNCgkJICogU2V0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBjb250ZW50LiBJZiBhbnkgY29udGVudHMgaXMgc2VsZWN0ZWQgaXQgd2lsbCBiZSByZXBsYWNlZA0KCQkgKiB3aXRoIHRoZSBjb250ZW50cyBwYXNzZWQgaW4gdG8gdGhpcyBmdW5jdGlvbi4gSWYgdGhlcmUgaXMgbm8gc2VsZWN0aW9uIHRoZSBjb250ZW50cyB3aWxsIGJlIGluc2VydGVkDQoJCSAqIHdoZXJlIHRoZSBjYXJldCBpcyBwbGFjZWQgaW4gdGhlIGVkaXRvci9wYWdlLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldENvbnRlbnQNCgkJICogQHBhcmFtIHtTdHJpbmd9IGggSFRNTCBjb250ZW50cyB0byBzZXQgY291bGQgYWxzbyBiZSBvdGhlciBmb3JtYXRzIGRlcGVuZGluZyBvbiBzZXR0aW5ncy4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgc2V0dGluZ3Mgb2JqZWN0IHdpdGggZm9yIGV4YW1wbGUgZGF0YSBmb3JtYXQuDQoJCSAqLw0KCQlzZXRDb250ZW50IDogZnVuY3Rpb24oaCwgcykgew0KCQkJdmFyIHQgPSB0aGlzLCByID0gdC5nZXRSbmcoKSwgYywgZCA9IHQud2luLmRvY3VtZW50Ow0KDQoJCQlzID0gcyB8fCB7Zm9ybWF0IDogJ2h0bWwnfTsNCgkJCXMuc2V0ID0gdHJ1ZTsNCgkJCWggPSBzLmNvbnRlbnQgPSB0LmRvbS5wcm9jZXNzSFRNTChoKTsNCg0KCQkJLy8gRGlzcGF0Y2ggYmVmb3JlIHNldCBjb250ZW50IGV2ZW50DQoJCQl0Lm9uQmVmb3JlU2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCgkJCWggPSBzLmNvbnRlbnQ7DQoNCgkJCWlmIChyLmluc2VydE5vZGUpIHsNCgkJCQkvLyBNYWtlIGNhcmV0IG1hcmtlciBzaW5jZSBpbnNlcnROb2RlIHBsYWNlcyB0aGUgY2FyZXQgaW4gdGhlIGJlZ2lubmluZyBvZiB0ZXh0IGFmdGVyIGluc2VydA0KCQkJCWggKz0gJzxzcGFuIGlkPSJfX2NhcmV0Ij5fPC9zcGFuPic7DQoNCgkJCQkvLyBEZWxldGUgYW5kIGluc2VydCBuZXcgbm9kZQ0KCQkJCQ0KCQkJCWlmIChyLnN0YXJ0Q29udGFpbmVyID09IGQgJiYgci5lbmRDb250YWluZXIgPT0gIGQpIHsNCgkJCQkJLy8gV2ViS2l0IHdpbGwgZmFpbCBpZiB0aGUgYm9keSBpcyBlbXB0eSBzaW5jZSB0aGUgcmFuZ2UgaXMgdGhlbiBpbnZhbGlkIGFuZCBpdCBjYW4ndCBpbnNlcnQgY29udGVudHMNCgkJCQkJZC5ib2R5LmlubmVySFRNTCA9IGg7DQoJCQkJfSBlbHNlIHsNCgkJCQkJci5kZWxldGVDb250ZW50cygpOw0KCQkJCQlpZiAoZC5ib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09IDApIHsNCgkJCQkJCWQuYm9keS5pbm5lckhUTUwgPSBoOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJLy8gY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IGRvZXNuJ3QgZXhpc3RzIGluIElFIDkgRE9NUmFuZ2VzDQoJCQkJCQlpZiAoci5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQpIHsNCgkJCQkJCQlyLmluc2VydE5vZGUoci5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaCkpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkvLyBGYWtlIGNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCBjYWxsIGluIElFIDkNCgkJCQkJCQl2YXIgZnJhZyA9IGQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLCB0ZW1wID0gZC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KCQkJCQkJCWZyYWcuYXBwZW5kQ2hpbGQodGVtcCk7DQoJCQkJCQkJdGVtcC5vdXRlckhUTUwgPSBoOw0KDQoJCQkJCQkJci5pbnNlcnROb2RlKGZyYWcpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gTW92ZSB0byBjYXJldCBtYXJrZXINCgkJCQljID0gdC5kb20uZ2V0KCdfX2NhcmV0Jyk7DQoJCQkJLy8gTWFrZSBzdXJlIHdlIHdyYXAgaXQgY29tcGxlYXRseSwgT3BlcmEgZmFpbHMgd2l0aCBhIHNpbXBsZSBzZWxlY3QgY2FsbA0KCQkJCXIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoJCQkJci5zZXRTdGFydEJlZm9yZShjKTsNCgkJCQlyLnNldEVuZEJlZm9yZShjKTsNCgkJCQl0LnNldFJuZyhyKTsNCg0KCQkJCS8vIFJlbW92ZSB0aGUgY2FyZXQgcG9zaXRpb24NCgkJCQl0LmRvbS5yZW1vdmUoJ19fY2FyZXQnKTsNCgkJCX0gZWxzZSB7DQoJCQkJaWYgKHIuaXRlbSkgew0KCQkJCQkvLyBEZWxldGUgY29udGVudCBhbmQgZ2V0IGNhcmV0IHRleHQgc2VsZWN0aW9uDQoJCQkJCWQuZXhlY0NvbW1hbmQoJ0RlbGV0ZScsIGZhbHNlLCBudWxsKTsNCgkJCQkJciA9IHQuZ2V0Um5nKCk7DQoJCQkJfQ0KDQoJCQkJci5wYXN0ZUhUTUwoaCk7DQoJCQl9DQoNCgkJCS8vIERpc3BhdGNoIHNldCBjb250ZW50IGV2ZW50DQoJCQl0Lm9uU2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0aGUgc3RhcnQgZWxlbWVudCBvZiBhIHNlbGVjdGlvbiByYW5nZS4gSWYgdGhlIHN0YXJ0IGlzIGluIGEgdGV4dA0KCQkgKiBub2RlIHRoZSBwYXJlbnQgZWxlbWVudCB3aWxsIGJlIHJldHVybmVkLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldFN0YXJ0DQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IFN0YXJ0IGVsZW1lbnQgb2Ygc2VsZWN0aW9uIHJhbmdlLg0KCQkgKi8NCgkJZ2V0U3RhcnQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBybmcgPSB0aGlzLmdldFJuZygpLCBzdGFydEVsZW1lbnQsIHBhcmVudEVsZW1lbnQsIGNoZWNrUm5nLCBub2RlOw0KDQoJCQlpZiAocm5nLmR1cGxpY2F0ZSB8fCBybmcuaXRlbSkgew0KCQkJCS8vIENvbnRyb2wgc2VsZWN0aW9uLCByZXR1cm4gZmlyc3QgaXRlbQ0KCQkJCWlmIChybmcuaXRlbSkNCgkJCQkJcmV0dXJuIHJuZy5pdGVtKDApOw0KDQoJCQkJLy8gR2V0IHN0YXJ0IGVsZW1lbnQNCgkJCQljaGVja1JuZyA9IHJuZy5kdXBsaWNhdGUoKTsNCgkJCQljaGVja1JuZy5jb2xsYXBzZSgxKTsNCgkJCQlzdGFydEVsZW1lbnQgPSBjaGVja1JuZy5wYXJlbnRFbGVtZW50KCk7DQoNCgkJCQkvLyBDaGVjayBpZiByYW5nZSBwYXJlbnQgaXMgaW5zaWRlIHRoZSBzdGFydCBlbGVtZW50LCB0aGVuIHJldHVybiB0aGUgaW5uZXIgcGFyZW50IGVsZW1lbnQNCgkJCQkvLyBUaGlzIHdpbGwgZml4IGlzc3VlcyB3aGVuIGEgc2luZ2xlIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIElFIHdvdWxkIG90aGVyd2lzZSByZXR1cm4gdGhlIHdyb25nIHN0YXJ0IGVsZW1lbnQNCgkJCQlwYXJlbnRFbGVtZW50ID0gbm9kZSA9IHJuZy5wYXJlbnRFbGVtZW50KCk7DQoJCQkJd2hpbGUgKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpIHsNCgkJCQkJaWYgKG5vZGUgPT0gc3RhcnRFbGVtZW50KSB7DQoJCQkJCQlzdGFydEVsZW1lbnQgPSBwYXJlbnRFbGVtZW50Ow0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBJZiBzdGFydCBlbGVtZW50IGlzIGJvZHkgZWxlbWVudCB0cnkgdG8gbW92ZSB0byB0aGUgZmlyc3QgY2hpbGQgaWYgaXQgZXhpc3RzDQoJCQkJaWYgKHN0YXJ0RWxlbWVudCAmJiBzdGFydEVsZW1lbnQubm9kZU5hbWUgPT0gJ0JPRFknKQ0KCQkJCQlyZXR1cm4gc3RhcnRFbGVtZW50LmZpcnN0Q2hpbGQgfHwgc3RhcnRFbGVtZW50Ow0KDQoJCQkJcmV0dXJuIHN0YXJ0RWxlbWVudDsNCgkJCX0gZWxzZSB7DQoJCQkJc3RhcnRFbGVtZW50ID0gcm5nLnN0YXJ0Q29udGFpbmVyOw0KDQoJCQkJaWYgKHN0YXJ0RWxlbWVudC5ub2RlVHlwZSA9PSAxICYmIHN0YXJ0RWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpDQoJCQkJCXN0YXJ0RWxlbWVudCA9IHN0YXJ0RWxlbWVudC5jaGlsZE5vZGVzW01hdGgubWluKHN0YXJ0RWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCAtIDEsIHJuZy5zdGFydE9mZnNldCldOw0KDQoJCQkJaWYgKHN0YXJ0RWxlbWVudCAmJiBzdGFydEVsZW1lbnQubm9kZVR5cGUgPT0gMykNCgkJCQkJcmV0dXJuIHN0YXJ0RWxlbWVudC5wYXJlbnROb2RlOw0KDQoJCQkJcmV0dXJuIHN0YXJ0RWxlbWVudDsNCgkJCX0NCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0aGUgZW5kIGVsZW1lbnQgb2YgYSBzZWxlY3Rpb24gcmFuZ2UuIElmIHRoZSBlbmQgaXMgaW4gYSB0ZXh0DQoJCSAqIG5vZGUgdGhlIHBhcmVudCBlbGVtZW50IHdpbGwgYmUgcmV0dXJuZWQuDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0RW5kDQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IEVuZCBlbGVtZW50IG9mIHNlbGVjdGlvbiByYW5nZS4NCgkJICovDQoJCWdldEVuZCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCByID0gdC5nZXRSbmcoKSwgZSwgZW87DQoNCgkJCWlmIChyLmR1cGxpY2F0ZSB8fCByLml0ZW0pIHsNCgkJCQlpZiAoci5pdGVtKQ0KCQkJCQlyZXR1cm4gci5pdGVtKDApOw0KDQoJCQkJciA9IHIuZHVwbGljYXRlKCk7DQoJCQkJci5jb2xsYXBzZSgwKTsNCgkJCQllID0gci5wYXJlbnRFbGVtZW50KCk7DQoNCgkJCQlpZiAoZSAmJiBlLm5vZGVOYW1lID09ICdCT0RZJykNCgkJCQkJcmV0dXJuIGUubGFzdENoaWxkIHx8IGU7DQoNCgkJCQlyZXR1cm4gZTsNCgkJCX0gZWxzZSB7DQoJCQkJZSA9IHIuZW5kQ29udGFpbmVyOw0KCQkJCWVvID0gci5lbmRPZmZzZXQ7DQoNCgkJCQlpZiAoZS5ub2RlVHlwZSA9PSAxICYmIGUuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCQllID0gZS5jaGlsZE5vZGVzW2VvID4gMCA/IGVvIC0gMSA6IGVvXTsNCg0KCQkJCWlmIChlICYmIGUubm9kZVR5cGUgPT0gMykNCgkJCQkJcmV0dXJuIGUucGFyZW50Tm9kZTsNCg0KCQkJCXJldHVybiBlOw0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIGEgYm9va21hcmsgbG9jYXRpb24gZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gVGhpcyBib29rbWFyayBvYmplY3QNCgkJICogY2FuIHRoZW4gYmUgdXNlZCB0byByZXN0b3JlIHRoZSBzZWxlY3Rpb24gYWZ0ZXIgc29tZSBjb250ZW50IG1vZGlmaWNhdGlvbiB0byB0aGUgZG9jdW1lbnQuDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0Qm9va21hcmsNCgkJICogQHBhcmFtIHtOdW1iZXJ9IHR5cGUgT3B0aW9uYWwgc3RhdGUgaWYgdGhlIGJvb2ttYXJrIHNob3VsZCBiZSBzaW1wbGUgb3Igbm90LiBEZWZhdWx0IGlzIGNvbXBsZXguDQoJCSAqIEBwYXJhbSB7Qm9vbGVhbn0gbm9ybWFsaXplZCBPcHRpb25hbCBzdGF0ZSB0aGF0IGVuYWJsZXMgeW91IHRvIGdldCBhIHBvc2l0aW9uIHRoYXQgaXQgd291bGQgYmUgYWZ0ZXIgbm9ybWFsaXphdGlvbi4NCgkJICogQHJldHVybiB7T2JqZWN0fSBCb29rbWFyayBvYmplY3QsIHVzZSBtb3ZlVG9Cb29rbWFyayB3aXRoIHRoaXMgb2JqZWN0IHRvIHJlc3RvcmUgdGhlIHNlbGVjdGlvbi4NCgkJICovDQoJCWdldEJvb2ttYXJrIDogZnVuY3Rpb24odHlwZSwgbm9ybWFsaXplZCkgew0KCQkJdmFyIHQgPSB0aGlzLCBkb20gPSB0LmRvbSwgcm5nLCBybmcyLCBpZCwgY29sbGFwc2VkLCBuYW1lLCBlbGVtZW50LCBpbmRleCwgY2hyID0gJ1x1RkVGRicsIHN0eWxlczsNCg0KCQkJZnVuY3Rpb24gZmluZEluZGV4KG5hbWUsIGVsZW1lbnQpIHsNCgkJCQl2YXIgaW5kZXggPSAwOw0KDQoJCQkJZWFjaChkb20uc2VsZWN0KG5hbWUpLCBmdW5jdGlvbihub2RlLCBpKSB7DQoJCQkJCWlmIChub2RlID09IGVsZW1lbnQpDQoJCQkJCQlpbmRleCA9IGk7DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm4gaW5kZXg7DQoJCQl9Ow0KDQoJCQlpZiAodHlwZSA9PSAyKSB7DQoJCQkJZnVuY3Rpb24gZ2V0TG9jYXRpb24oKSB7DQoJCQkJCXZhciBybmcgPSB0LmdldFJuZyh0cnVlKSwgcm9vdCA9IGRvbS5nZXRSb290KCksIGJvb2ttYXJrID0ge307DQoNCgkJCQkJZnVuY3Rpb24gZ2V0UG9pbnQocm5nLCBzdGFydCkgew0KCQkJCQkJdmFyIGNvbnRhaW5lciA9IHJuZ1tzdGFydCA/ICdzdGFydENvbnRhaW5lcicgOiAnZW5kQ29udGFpbmVyJ10sDQoJCQkJCQkJb2Zmc2V0ID0gcm5nW3N0YXJ0ID8gJ3N0YXJ0T2Zmc2V0JyA6ICdlbmRPZmZzZXQnXSwgcG9pbnQgPSBbXSwgbm9kZSwgY2hpbGROb2RlcywgYWZ0ZXIgPSAwOw0KDQoJCQkJCQlpZiAoY29udGFpbmVyLm5vZGVUeXBlID09IDMpIHsNCgkJCQkJCQlpZiAobm9ybWFsaXplZCkgew0KCQkJCQkJCQlmb3IgKG5vZGUgPSBjb250YWluZXIucHJldmlvdXNTaWJsaW5nOyBub2RlICYmIG5vZGUubm9kZVR5cGUgPT0gMzsgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKQ0KCQkJCQkJCQkJb2Zmc2V0ICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDsNCgkJCQkJCQl9DQoNCgkJCQkJCQlwb2ludC5wdXNoKG9mZnNldCk7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCWNoaWxkTm9kZXMgPSBjb250YWluZXIuY2hpbGROb2RlczsNCg0KCQkJCQkJCWlmIChvZmZzZXQgPj0gY2hpbGROb2Rlcy5sZW5ndGggJiYgY2hpbGROb2Rlcy5sZW5ndGgpIHsNCgkJCQkJCQkJYWZ0ZXIgPSAxOw0KCQkJCQkJCQlvZmZzZXQgPSBNYXRoLm1heCgwLCBjaGlsZE5vZGVzLmxlbmd0aCAtIDEpOw0KCQkJCQkJCX0NCg0KCQkJCQkJCXBvaW50LnB1c2godC5kb20ubm9kZUluZGV4KGNoaWxkTm9kZXNbb2Zmc2V0XSwgbm9ybWFsaXplZCkgKyBhZnRlcik7DQoJCQkJCQl9DQoNCgkJCQkJCWZvciAoOyBjb250YWluZXIgJiYgY29udGFpbmVyICE9IHJvb3Q7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlKQ0KCQkJCQkJCXBvaW50LnB1c2godC5kb20ubm9kZUluZGV4KGNvbnRhaW5lciwgbm9ybWFsaXplZCkpOw0KDQoJCQkJCQlyZXR1cm4gcG9pbnQ7DQoJCQkJCX07DQoNCgkJCQkJYm9va21hcmsuc3RhcnQgPSBnZXRQb2ludChybmcsIHRydWUpOw0KDQoJCQkJCWlmICghdC5pc0NvbGxhcHNlZCgpKQ0KCQkJCQkJYm9va21hcmsuZW5kID0gZ2V0UG9pbnQocm5nKTsNCg0KCQkJCQlyZXR1cm4gYm9va21hcms7DQoJCQkJfTsNCg0KCQkJCXJldHVybiBnZXRMb2NhdGlvbigpOw0KCQkJfQ0KDQoJCQkvLyBIYW5kbGUgc2ltcGxlIHJhbmdlDQoJCQlpZiAodHlwZSkNCgkJCQlyZXR1cm4ge3JuZyA6IHQuZ2V0Um5nKCl9Ow0KDQoJCQlybmcgPSB0LmdldFJuZygpOw0KCQkJaWQgPSBkb20udW5pcXVlSWQoKTsNCgkJCWNvbGxhcHNlZCA9IHRpbnlNQ0UuYWN0aXZlRWRpdG9yLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpOw0KCQkJc3R5bGVzID0gJ292ZXJmbG93OmhpZGRlbjtsaW5lLWhlaWdodDowcHgnOw0KDQoJCQkvLyBFeHBsb3JlciBtZXRob2QNCgkJCWlmIChybmcuZHVwbGljYXRlIHx8IHJuZy5pdGVtKSB7DQoJCQkJLy8gVGV4dCBzZWxlY3Rpb24NCgkJCQlpZiAoIXJuZy5pdGVtKSB7DQoJCQkJCXJuZzIgPSBybmcuZHVwbGljYXRlKCk7DQoNCgkJCQkJLy8gSW5zZXJ0IHN0YXJ0IG1hcmtlcg0KCQkJCQlybmcuY29sbGFwc2UoKTsNCgkJCQkJcm5nLnBhc3RlSFRNTCgnPHNwYW4gX21jZV90eXBlPSJib29rbWFyayIgaWQ9IicgKyBpZCArICdfc3RhcnQiIHN0eWxlPSInICsgc3R5bGVzICsgJyI+JyArIGNociArICc8L3NwYW4+Jyk7DQoNCgkJCQkJLy8gSW5zZXJ0IGVuZCBtYXJrZXINCgkJCQkJaWYgKCFjb2xsYXBzZWQpIHsNCgkJCQkJCXJuZzIuY29sbGFwc2UoZmFsc2UpOw0KCQkJCQkJcm5nMi5wYXN0ZUhUTUwoJzxzcGFuIF9tY2VfdHlwZT0iYm9va21hcmsiIGlkPSInICsgaWQgKyAnX2VuZCIgc3R5bGU9IicgKyBzdHlsZXMgKyAnIj4nICsgY2hyICsgJzwvc3Bhbj4nKTsNCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIENvbnRyb2wgc2VsZWN0aW9uDQoJCQkJCWVsZW1lbnQgPSBybmcuaXRlbSgwKTsNCgkJCQkJbmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7DQoNCgkJCQkJcmV0dXJuIHtuYW1lIDogbmFtZSwgaW5kZXggOiBmaW5kSW5kZXgobmFtZSwgZWxlbWVudCl9Ow0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZWxlbWVudCA9IHQuZ2V0Tm9kZSgpOw0KCQkJCW5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lOw0KCQkJCWlmIChuYW1lID09ICdJTUcnKQ0KCQkJCQlyZXR1cm4ge25hbWUgOiBuYW1lLCBpbmRleCA6IGZpbmRJbmRleChuYW1lLCBlbGVtZW50KX07DQoNCgkJCQkvLyBXM0MgbWV0aG9kDQoJCQkJcm5nMiA9IHJuZy5jbG9uZVJhbmdlKCk7DQoNCgkJCQkvLyBJbnNlcnQgZW5kIG1hcmtlcg0KCQkJCWlmICghY29sbGFwc2VkKSB7DQoJCQkJCXJuZzIuY29sbGFwc2UoZmFsc2UpOw0KCQkJCQlybmcyLmluc2VydE5vZGUoZG9tLmNyZWF0ZSgnc3BhbicsIHtfbWNlX3R5cGUgOiAiYm9va21hcmsiLCBpZCA6IGlkICsgJ19lbmQnLCBzdHlsZSA6IHN0eWxlc30sIGNocikpOw0KCQkJCX0NCg0KCQkJCXJuZy5jb2xsYXBzZSh0cnVlKTsNCgkJCQlybmcuaW5zZXJ0Tm9kZShkb20uY3JlYXRlKCdzcGFuJywge19tY2VfdHlwZSA6ICJib29rbWFyayIsIGlkIDogaWQgKyAnX3N0YXJ0Jywgc3R5bGUgOiBzdHlsZXN9LCBjaHIpKTsNCgkJCX0NCg0KCQkJdC5tb3ZlVG9Cb29rbWFyayh7aWQgOiBpZCwga2VlcCA6IDF9KTsNCg0KCQkJcmV0dXJuIHtpZCA6IGlkfTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVzdG9yZXMgdGhlIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGJvb2ttYXJrLg0KCQkgKg0KCQkgKiBAbWV0aG9kIG1vdmVUb0Jvb2ttYXJrDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBib29rbWFyayBCb29rbWFyayB0byByZXN0b3JlIHNlbGVjdGlvbiBmcm9tLg0KCQkgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlL2ZhbHNlIGlmIGl0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdC4NCgkJICovDQoJCW1vdmVUb0Jvb2ttYXJrIDogZnVuY3Rpb24oYm9va21hcmspIHsNCgkJCXZhciB0ID0gdGhpcywgZG9tID0gdC5kb20sIG1hcmtlcjEsIG1hcmtlcjIsIHJuZywgcm9vdCwgc3RhcnRDb250YWluZXIsIGVuZENvbnRhaW5lciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsNCg0KCQkJLy8gQ2xlYXIgc2VsZWN0aW9uIGNhY2hlDQoJCQlpZiAodC50cmlkZW50U2VsKQ0KCQkJCXQudHJpZGVudFNlbC5kZXN0cm95KCk7DQoNCgkJCWlmIChib29rbWFyaykgew0KCQkJCWlmIChib29rbWFyay5zdGFydCkgew0KCQkJCQlybmcgPSBkb20uY3JlYXRlUm5nKCk7DQoJCQkJCXJvb3QgPSBkb20uZ2V0Um9vdCgpOw0KDQoJCQkJCWZ1bmN0aW9uIHNldEVuZFBvaW50KHN0YXJ0KSB7DQoJCQkJCQl2YXIgcG9pbnQgPSBib29rbWFya1tzdGFydCA/ICdzdGFydCcgOiAnZW5kJ10sIGksIG5vZGUsIG9mZnNldCwgY2hpbGRyZW47DQoNCgkJCQkJCWlmIChwb2ludCkgew0KCQkJCQkJCS8vIEZpbmQgY29udGFpbmVyIG5vZGUNCgkJCQkJCQlmb3IgKG5vZGUgPSByb290LCBpID0gcG9pbnQubGVuZ3RoIC0gMTsgaSA+PSAxOyBpLS0pIHsNCgkJCQkJCQkJY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7DQoNCgkJCQkJCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCkNCgkJCQkJCQkJCW5vZGUgPSBjaGlsZHJlbltwb2ludFtpXV07DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gU2V0IG9mZnNldCB3aXRoaW4gY29udGFpbmVyIG5vZGUNCgkJCQkJCQlpZiAoc3RhcnQpDQoJCQkJCQkJCXJuZy5zZXRTdGFydChub2RlLCBwb2ludFswXSk7DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCQlybmcuc2V0RW5kKG5vZGUsIHBvaW50WzBdKTsNCgkJCQkJCX0NCgkJCQkJfTsNCg0KCQkJCQlzZXRFbmRQb2ludCh0cnVlKTsNCgkJCQkJc2V0RW5kUG9pbnQoKTsNCg0KCQkJCQl0LnNldFJuZyhybmcpOw0KCQkJCX0gZWxzZSBpZiAoYm9va21hcmsuaWQpIHsNCgkJCQkJZnVuY3Rpb24gcmVzdG9yZUVuZFBvaW50KHN1ZmZpeCkgew0KCQkJCQkJdmFyIG1hcmtlciA9IGRvbS5nZXQoYm9va21hcmsuaWQgKyAnXycgKyBzdWZmaXgpLCBub2RlLCBpZHgsIG5leHQsIHByZXYsIGtlZXAgPSBib29rbWFyay5rZWVwOw0KDQoJCQkJCQlpZiAobWFya2VyKSB7DQoJCQkJCQkJbm9kZSA9IG1hcmtlci5wYXJlbnROb2RlOw0KDQoJCQkJCQkJaWYgKHN1ZmZpeCA9PSAnc3RhcnQnKSB7DQoJCQkJCQkJCWlmICgha2VlcCkgew0KCQkJCQkJCQkJaWR4ID0gZG9tLm5vZGVJbmRleChtYXJrZXIpOw0KCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJbm9kZSA9IG1hcmtlci5maXJzdENoaWxkOw0KCQkJCQkJCQkJaWR4ID0gMTsNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCXN0YXJ0Q29udGFpbmVyID0gZW5kQ29udGFpbmVyID0gbm9kZTsNCgkJCQkJCQkJc3RhcnRPZmZzZXQgPSBlbmRPZmZzZXQgPSBpZHg7DQoJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJaWYgKCFrZWVwKSB7DQoJCQkJCQkJCQlpZHggPSBkb20ubm9kZUluZGV4KG1hcmtlcik7DQoJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQlub2RlID0gbWFya2VyLmZpcnN0Q2hpbGQ7DQoJCQkJCQkJCQlpZHggPSAxOw0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJZW5kQ29udGFpbmVyID0gbm9kZTsNCgkJCQkJCQkJZW5kT2Zmc2V0ID0gaWR4Ow0KCQkJCQkJCX0NCg0KCQkJCQkJCWlmICgha2VlcCkgew0KCQkJCQkJCQlwcmV2ID0gbWFya2VyLnByZXZpb3VzU2libGluZzsNCgkJCQkJCQkJbmV4dCA9IG1hcmtlci5uZXh0U2libGluZzsNCg0KCQkJCQkJCQkvLyBSZW1vdmUgYWxsIG1hcmtlciB0ZXh0IG5vZGVzDQoJCQkJCQkJCWVhY2godGlueW1jZS5ncmVwKG1hcmtlci5jaGlsZE5vZGVzKSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMykNCgkJCQkJCQkJCQlub2RlLm5vZGVWYWx1ZSA9IG5vZGUubm9kZVZhbHVlLnJlcGxhY2UoL1x1RkVGRi9nLCAnJyk7DQoJCQkJCQkJCX0pOw0KDQoJCQkJCQkJCS8vIFJlbW92ZSBtYXJrZXIgYnV0IGtlZXAgY2hpbGRyZW4gaWYgZm9yIGV4YW1wbGUgY29udGVudHMgd2hlcmUgaW5zZXJ0ZWQgaW50byB0aGUgbWFya2VyDQoJCQkJCQkJCS8vIEFsc28gcmVtb3ZlIGR1cGxpY2F0ZWQgaW5zdGFuY2VzIG9mIHRoZSBtYXJrZXIgZm9yIGV4YW1wbGUgYnkgYSBzcGxpdCBvcGVyYXRpb24gb3IgYnkgV2ViS2l0IGF1dG8gc3BsaXQgb24gcGFzdGUgZmVhdHVyZQ0KCQkJCQkJCQl3aGlsZSAobWFya2VyID0gZG9tLmdldChib29rbWFyay5pZCArICdfJyArIHN1ZmZpeCkpDQoJCQkJCQkJCQlkb20ucmVtb3ZlKG1hcmtlciwgMSk7DQoNCgkJCQkJCQkJLy8gSWYgc2libGluZ3MgYXJlIHRleHQgbm9kZXMgdGhlbiBtZXJnZSB0aGVtIHVubGVzcyBpdCdzIE9wZXJhIHNpbmNlIGl0IHNvbWUgaG93IHJlbW92ZXMgdGhlIG5vZGUNCgkJCQkJCQkJLy8gYW5kIHdlIGFyZSBzbmlmZmluZyBzaW5jZSBhZGRpbmcgYSBsb3Qgb2YgZGV0ZWN0aW9uIGNvZGUgZm9yIGEgYnJvd3NlciB3aXRoIDMlIG9mIHRoZSBtYXJrZXQgaXNuJ3Qgd29ydGggdGhlIGVmZm9ydC4gU29ycnksIE9wZXJhIGJ1dCBpdCdzIGp1c3QgYSBmYWN0DQoJCQkJCQkJCWlmIChwcmV2ICYmIG5leHQgJiYgcHJldi5ub2RlVHlwZSA9PSBuZXh0Lm5vZGVUeXBlICYmIHByZXYubm9kZVR5cGUgPT0gMyAmJiAhdGlueW1jZS5pc09wZXJhKSB7DQoJCQkJCQkJCQlpZHggPSBwcmV2Lm5vZGVWYWx1ZS5sZW5ndGg7DQoJCQkJCQkJCQlwcmV2LmFwcGVuZERhdGEobmV4dC5ub2RlVmFsdWUpOw0KCQkJCQkJCQkJZG9tLnJlbW92ZShuZXh0KTsNCg0KCQkJCQkJCQkJaWYgKHN1ZmZpeCA9PSAnc3RhcnQnKSB7DQoJCQkJCQkJCQkJc3RhcnRDb250YWluZXIgPSBlbmRDb250YWluZXIgPSBwcmV2Ow0KCQkJCQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0ID0gaWR4Ow0KCQkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCQllbmRDb250YWluZXIgPSBwcmV2Ow0KCQkJCQkJCQkJCWVuZE9mZnNldCA9IGlkeDsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfTsNCg0KCQkJCQlmdW5jdGlvbiBhZGRCb2d1cyhub2RlKSB7DQoJCQkJCQkvLyBBZGRzIGEgYm9ndXMgQlIgZWxlbWVudCBmb3IgZW1wdHkgYmxvY2sgZWxlbWVudHMNCgkJCQkJCS8vIG9uIG5vbiBJRSBicm93c2VycyBqdXN0IHRvIGhhdmUgYSBwbGFjZSB0byBwdXQgdGhlIGNhcmV0DQoJCQkJCQlpZiAoIWlzSUUgJiYgZG9tLmlzQmxvY2sobm9kZSkgJiYgIW5vZGUuaW5uZXJIVE1MKQ0KCQkJCQkJCW5vZGUuaW5uZXJIVE1MID0gJzxiciBfbWNlX2JvZ3VzPSIxIiAvPic7DQoNCgkJCQkJCXJldHVybiBub2RlOw0KCQkJCQl9Ow0KDQoJCQkJCS8vIFJlc3RvcmUgc3RhcnQvZW5kIHBvaW50cw0KCQkJCQlyZXN0b3JlRW5kUG9pbnQoJ3N0YXJ0Jyk7DQoJCQkJCXJlc3RvcmVFbmRQb2ludCgnZW5kJyk7DQoNCgkJCQkJaWYgKHN0YXJ0Q29udGFpbmVyKSB7DQoJCQkJCQlybmcgPSBkb20uY3JlYXRlUm5nKCk7DQoJCQkJCQlybmcuc2V0U3RhcnQoYWRkQm9ndXMoc3RhcnRDb250YWluZXIpLCBzdGFydE9mZnNldCk7DQoJCQkJCQlybmcuc2V0RW5kKGFkZEJvZ3VzKGVuZENvbnRhaW5lciksIGVuZE9mZnNldCk7DQoJCQkJCQl0LnNldFJuZyhybmcpOw0KCQkJCQl9DQoJCQkJfSBlbHNlIGlmIChib29rbWFyay5uYW1lKSB7DQoJCQkJCXQuc2VsZWN0KGRvbS5zZWxlY3QoYm9va21hcmsubmFtZSlbYm9va21hcmsuaW5kZXhdKTsNCgkJCQl9IGVsc2UgaWYgKGJvb2ttYXJrLnJuZykNCgkJCQkJdC5zZXRSbmcoYm9va21hcmsucm5nKTsNCgkJCX0NCgkJfSwNCg0KCQkvKioNCgkJICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuIFRoaXMgd2lsbCBwbGFjZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc2VsZWN0aW9uIHJhbmdlIGFyb3VuZCB0aGUgZWxlbWVudC4NCgkJICoNCgkJICogQG1ldGhvZCBzZWxlY3QNCgkJICogQHBhcmFtIHtFbGVtZW50fSBub2RlIEhNVEwgRE9NIGVsZW1lbnQgdG8gc2VsZWN0Lg0KCQkgKiBAcGFyYW0ge0Jvb2xlYW59IGNvbnRlbnQgT3B0aW9uYWwgYm9vbCBzdGF0ZSBpZiB0aGUgY29udGVudHMgc2hvdWxkIGJlIHNlbGVjdGVkIG9yIG5vdCBvbiBub24gSUUgYnJvd3Nlci4NCgkJICogQHJldHVybiB7RWxlbWVudH0gU2VsZWN0ZWQgZWxlbWVudCB0aGUgc2FtZSBlbGVtZW50IGFzIHRoZSBvbmUgdGhhdCBnb3QgcGFzc2VkIGluLg0KCQkgKi8NCgkJc2VsZWN0IDogZnVuY3Rpb24obm9kZSwgY29udGVudCkgew0KCQkJdmFyIHQgPSB0aGlzLCBkb20gPSB0LmRvbSwgcm5nID0gZG9tLmNyZWF0ZVJuZygpLCBpZHg7DQoNCgkJCWlkeCA9IGRvbS5ub2RlSW5kZXgobm9kZSk7DQoJCQlybmcuc2V0U3RhcnQobm9kZS5wYXJlbnROb2RlLCBpZHgpOw0KCQkJcm5nLnNldEVuZChub2RlLnBhcmVudE5vZGUsIGlkeCArIDEpOw0KDQoJCQkvLyBGaW5kIGZpcnN0L2xhc3QgdGV4dCBub2RlIG9yIEJSIGVsZW1lbnQNCgkJCWlmIChjb250ZW50KSB7DQoJCQkJZnVuY3Rpb24gc2V0UG9pbnQobm9kZSwgc3RhcnQpIHsNCgkJCQkJdmFyIHdhbGtlciA9IG5ldyB0aW55bWNlLmRvbS5UcmVlV2Fsa2VyKG5vZGUsIG5vZGUpOw0KDQoJCQkJCWRvIHsNCgkJCQkJCS8vIFRleHQgbm9kZQ0KCQkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiB0aW55bWNlLnRyaW0obm9kZS5ub2RlVmFsdWUpLmxlbmd0aCAhPSAwKSB7DQoJCQkJCQkJaWYgKHN0YXJ0KQ0KCQkJCQkJCQlybmcuc2V0U3RhcnQobm9kZSwgMCk7DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCQlybmcuc2V0RW5kKG5vZGUsIG5vZGUubm9kZVZhbHVlLmxlbmd0aCk7DQoNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEJSIGVsZW1lbnQNCgkJCQkJCWlmIChub2RlLm5vZGVOYW1lID09ICdCUicpIHsNCgkJCQkJCQlpZiAoc3RhcnQpDQoJCQkJCQkJCXJuZy5zZXRTdGFydEJlZm9yZShub2RlKTsNCgkJCQkJCQllbHNlDQoJCQkJCQkJCXJuZy5zZXRFbmRCZWZvcmUobm9kZSk7DQoNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoJCQkJCX0gd2hpbGUgKG5vZGUgPSAoc3RhcnQgPyB3YWxrZXIubmV4dCgpIDogd2Fsa2VyLnByZXYoKSkpOw0KCQkJCX07DQoNCgkJCQlzZXRQb2ludChub2RlLCAxKTsNCgkJCQlzZXRQb2ludChub2RlKTsNCgkJCX0NCg0KCQkJdC5zZXRSbmcocm5nKTsNCg0KCQkJcmV0dXJuIG5vZGU7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdHJ1ZS9mYWxzZSBpZiB0aGUgc2VsZWN0aW9uIHJhbmdlIGlzIGNvbGxhcHNlZCBvciBub3QuIENvbGxhcHNlZCBtZWFucyBpZiBpdCdzIGEgY2FyZXQgb3IgYSBsYXJnZXIgc2VsZWN0aW9uLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGlzQ29sbGFwc2VkDQoJCSAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUvZmFsc2Ugc3RhdGUgaWYgdGhlIHNlbGVjdGlvbiByYW5nZSBpcyBjb2xsYXBzZWQgb3Igbm90LiBDb2xsYXBzZWQgbWVhbnMgaWYgaXQncyBhIGNhcmV0IG9yIGEgbGFyZ2VyIHNlbGVjdGlvbi4NCgkJICovDQoJCWlzQ29sbGFwc2VkIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHIgPSB0LmdldFJuZygpLCBzID0gdC5nZXRTZWwoKTsNCg0KCQkJaWYgKCFyIHx8IHIuaXRlbSkNCgkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCWlmIChyLmNvbXBhcmVFbmRQb2ludHMpDQoJCQkJcmV0dXJuIHIuY29tcGFyZUVuZFBvaW50cygnU3RhcnRUb0VuZCcsIHIpID09PSAwOw0KDQoJCQlyZXR1cm4gIXMgfHwgci5jb2xsYXBzZWQ7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENvbGxhcHNlIHRoZSBzZWxlY3Rpb24gdG8gc3RhcnQgb3IgZW5kIG9mIHJhbmdlLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGNvbGxhcHNlDQoJCSAqIEBwYXJhbSB7Qm9vbGVhbn0gYiBPcHRpb25hbCBib29sZWFuIHN0YXRlIGlmIHRvIGNvbGxhcHNlIHRvIGVuZCBvciBub3QuIERlZmF1bHRzIHRvIHN0YXJ0Lg0KCQkgKi8NCgkJY29sbGFwc2UgOiBmdW5jdGlvbihiKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHIgPSB0LmdldFJuZygpLCBuOw0KDQoJCQkvLyBDb250cm9sIHJhbmdlIG9uIElFDQoJCQlpZiAoci5pdGVtKSB7DQoJCQkJbiA9IHIuaXRlbSgwKTsNCgkJCQlyID0gdGhpcy53aW4uZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsNCgkJCQlyLm1vdmVUb0VsZW1lbnRUZXh0KG4pOw0KCQkJfQ0KDQoJCQlyLmNvbGxhcHNlKCEhYik7DQoJCQl0LnNldFJuZyhyKTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0aGUgYnJvd3NlcnMgaW50ZXJuYWwgc2VsZWN0aW9uIG9iamVjdC4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRTZWwNCgkJICogQHJldHVybiB7U2VsZWN0aW9ufSBJbnRlcm5hbCBicm93c2VyIHNlbGVjdGlvbiBvYmplY3QuDQoJCSAqLw0KCQlnZXRTZWwgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgdyA9IHRoaXMud2luOw0KDQoJCQlyZXR1cm4gdy5nZXRTZWxlY3Rpb24gPyB3LmdldFNlbGVjdGlvbigpIDogdy5kb2N1bWVudC5zZWxlY3Rpb247DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdGhlIGJyb3dzZXJzIGludGVybmFsIHJhbmdlIG9iamVjdC4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRSbmcNCgkJICogQHBhcmFtIHtCb29sZWFufSB3M2MgRm9yY2VzIGEgY29tcGF0aWJsZSBXM0MgcmFuZ2Ugb24gSUUuDQoJCSAqIEByZXR1cm4ge1JhbmdlfSBJbnRlcm5hbCBicm93c2VyIHJhbmdlIG9iamVjdC4NCgkJICovDQoJCWdldFJuZyA6IGZ1bmN0aW9uKHczYykgew0KCQkJdmFyIHQgPSB0aGlzLCBzLCByLCBlbG0sIGRvYyA9IHQud2luLmRvY3VtZW50Ow0KDQoJCQkvLyBGb3VuZCB0cmlkZW50U2VsIG9iamVjdCB0aGVuIHdlIG5lZWQgdG8gdXNlIHRoYXQgb25lDQoJCQlpZiAodzNjICYmIHQudHJpZGVudFNlbCkNCgkJCQlyZXR1cm4gdC50cmlkZW50U2VsLmdldFJhbmdlQXQoMCk7DQoNCgkJCXRyeSB7DQoJCQkJaWYgKHMgPSB0LmdldFNlbCgpKQ0KCQkJCQlyID0gcy5yYW5nZUNvdW50ID4gMCA/IHMuZ2V0UmFuZ2VBdCgwKSA6IChzLmNyZWF0ZVJhbmdlID8gcy5jcmVhdGVSYW5nZSgpIDogZG9jLmNyZWF0ZVJhbmdlKCkpOw0KCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkvLyBJRSB0aHJvd3MgdW5zcGVjaWZpZWQgZXJyb3IgaGVyZSBpZiBUaW55TUNFIGlzIHBsYWNlZCBpbiBhIGZyYW1lL2lmcmFtZQ0KCQkJfQ0KDQoJCQkvLyBXZSBoYXZlIFczQyByYW5nZXMgYW5kIGl0J3MgSUUgdGhlbiBmYWtlIGNvbnRyb2wgc2VsZWN0aW9uIHNpbmNlIElFOSBkb2Vzbid0IGhhbmRsZSB0aGF0IGNvcnJlY3RseSB5ZXQNCgkJCWlmICh0aW55bWNlLmlzSUUgJiYgci5zZXRTdGFydCAmJiBkb2Muc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaXRlbSkgew0KCQkJCWVsbSA9IGRvYy5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5pdGVtKDApOw0KCQkJCXIgPSBkb2MuY3JlYXRlUmFuZ2UoKTsNCgkJCQlyLnNldFN0YXJ0QmVmb3JlKGVsbSk7DQoJCQkJci5zZXRFbmRBZnRlcihlbG0pOw0KCQkJfQ0KDQoJCQkvLyBObyByYW5nZSBmb3VuZCB0aGVuIGNyZWF0ZSBhbiBlbXB0eSBvbmUNCgkJCS8vIFRoaXMgY2FuIG9jY3VyIHdoZW4gdGhlIGVkaXRvciBpcyBwbGFjZWQgaW4gYSBoaWRkZW4gY29udGFpbmVyIGVsZW1lbnQgb24gR2Vja28NCgkJCS8vIE9yIG9uIElFIHdoZW4gdGhlcmUgd2FzIGFuIGV4Y2VwdGlvbg0KCQkJaWYgKCFyKQ0KCQkJCXIgPSBkb2MuY3JlYXRlUmFuZ2UgPyBkb2MuY3JlYXRlUmFuZ2UoKSA6IGRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOw0KDQoJCQlpZiAodC5zZWxlY3RlZFJhbmdlICYmIHQuZXhwbGljaXRSYW5nZSkgew0KCQkJCWlmIChyLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhyLlNUQVJUX1RPX1NUQVJULCB0LnNlbGVjdGVkUmFuZ2UpID09PSAwICYmIHIuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHIuRU5EX1RPX0VORCwgdC5zZWxlY3RlZFJhbmdlKSA9PT0gMCkgew0KCQkJCQkvLyBTYWZhcmksIE9wZXJhIGFuZCBDaHJvbWUgb25seSBldmVyIHNlbGVjdCB0ZXh0IHdoaWNoIGNhdXNlcyB0aGUgcmFuZ2UgdG8gY2hhbmdlLg0KCQkJCQkvLyBUaGlzIGxldHMgdXMgdXNlIHRoZSBvcmlnaW5hbGx5IHNldCByYW5nZSBpZiB0aGUgc2VsZWN0aW9uIGhhc24ndCBiZWVuIGNoYW5nZWQgYnkgdGhlIHVzZXIuDQoJCQkJCXIgPSB0LmV4cGxpY2l0UmFuZ2U7DQoJCQkJfSBlbHNlIHsNCgkJCQkJdC5zZWxlY3RlZFJhbmdlID0gbnVsbDsNCgkJCQkJdC5leHBsaWNpdFJhbmdlID0gbnVsbDsNCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gcjsNCgkJfSwNCg0KCQkvKioNCgkJICogQ2hhbmdlcyB0aGUgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgRE9NIHJhbmdlLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldFJuZw0KCQkgKiBAcGFyYW0ge1JhbmdlfSByIFJhbmdlIHRvIHNlbGVjdC4NCgkJICovDQoJCXNldFJuZyA6IGZ1bmN0aW9uKHIpIHsNCgkJCXZhciBzLCB0ID0gdGhpczsNCgkJCQ0KCQkJaWYgKCF0LnRyaWRlbnRTZWwpIHsNCgkJCQlzID0gdC5nZXRTZWwoKTsNCg0KCQkJCWlmIChzKSB7DQoJCQkJCXQuZXhwbGljaXRSYW5nZSA9IHI7DQoJCQkJCXMucmVtb3ZlQWxsUmFuZ2VzKCk7DQoJCQkJCXMuYWRkUmFuZ2Uocik7DQoJCQkJCXQuc2VsZWN0ZWRSYW5nZSA9IHMuZ2V0UmFuZ2VBdCgwKTsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCS8vIElzIFczQyBSYW5nZQ0KCQkJCWlmIChyLmNsb25lUmFuZ2UpIHsNCgkJCQkJdC50cmlkZW50U2VsLmFkZFJhbmdlKHIpOw0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KDQoJCQkJLy8gSXMgSUUgc3BlY2lmaWMgcmFuZ2UNCgkJCQl0cnkgew0KCQkJCQlyLnNlbGVjdCgpOw0KCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCS8vIE5lZWRlZCBmb3Igc29tZSBvZGQgSUUgYnVnICMxODQzMzA2DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIERPTSBlbGVtZW50Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldE5vZGUNCgkJICogQHBhcmFtIHtFbGVtZW50fSBuIEVsZW1lbnQgdG8gc2V0IGFzIHRoZSBjb250ZW50cyBvZiB0aGUgc2VsZWN0aW9uLg0KCQkgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBlbGVtZW50IHRoYXQgZ290IHBhc3NlZCBpbi4NCgkJICovDQoJCXNldE5vZGUgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQuc2V0Q29udGVudCh0LmRvbS5nZXRPdXRlckhUTUwobikpOw0KDQoJCQlyZXR1cm4gbjsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnQgb3IgdGhlIGNvbW1vbiBhbmNlc3RvciBlbGVtZW50IGZvciBib3RoIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNlbGVjdGlvbi4NCgkJICoNCgkJICogQG1ldGhvZCBnZXROb2RlDQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IEN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50IG9yIGNvbW1vbiBhbmNlc3RvciBlbGVtZW50Lg0KCQkgKi8NCgkJZ2V0Tm9kZSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBybmcgPSB0LmdldFJuZygpLCBzZWwgPSB0LmdldFNlbCgpLCBlbG07DQoNCgkJCWlmIChybmcuc2V0U3RhcnQpIHsNCgkJCQkvLyBSYW5nZSBtYXliZSBsb3N0IGFmdGVyIHRoZSBlZGl0b3IgaXMgbWFkZSB2aXNpYmxlIGFnYWluDQoJCQkJaWYgKCFybmcpDQoJCQkJCXJldHVybiB0LmRvbS5nZXRSb290KCk7DQoNCgkJCQllbG0gPSBybmcuY29tbW9uQW5jZXN0b3JDb250YWluZXI7DQoNCgkJCQkvLyBIYW5kbGUgc2VsZWN0aW9uIGEgaW1hZ2Ugb3Igb3RoZXIgY29udHJvbCBsaWtlIGVsZW1lbnQgc3VjaCBhcyBhbmNob3JzDQoJCQkJaWYgKCFybmcuY29sbGFwc2VkKSB7DQoJCQkJCWlmIChybmcuc3RhcnRDb250YWluZXIgPT0gcm5nLmVuZENvbnRhaW5lcikgew0KCQkJCQkJaWYgKHJuZy5zdGFydE9mZnNldCAtIHJuZy5lbmRPZmZzZXQgPCAyKSB7DQoJCQkJCQkJaWYgKHJuZy5zdGFydENvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCkpDQoJCQkJCQkJCWVsbSA9IHJuZy5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3JuZy5zdGFydE9mZnNldF07DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkvLyBJZiB0aGUgYW5jaG9yIG5vZGUgaXMgYSBlbGVtZW50IGluc3RlYWQgb2YgYSB0ZXh0IG5vZGUgdGhlbiByZXR1cm4gdGhpcyBlbGVtZW50DQoJCQkJCWlmICh0aW55bWNlLmlzV2ViS2l0ICYmIHNlbC5hbmNob3JOb2RlICYmIHNlbC5hbmNob3JOb2RlLm5vZGVUeXBlID09IDEpIA0KCQkJCQkJcmV0dXJuIHNlbC5hbmNob3JOb2RlLmNoaWxkTm9kZXNbc2VsLmFuY2hvck9mZnNldF07IA0KCQkJCX0NCg0KCQkJCWlmIChlbG0gJiYgZWxtLm5vZGVUeXBlID09IDMpDQoJCQkJCXJldHVybiBlbG0ucGFyZW50Tm9kZTsNCg0KCQkJCXJldHVybiBlbG07DQoJCQl9DQoNCgkJCXJldHVybiBybmcuaXRlbSA/IHJuZy5pdGVtKDApIDogcm5nLnBhcmVudEVsZW1lbnQoKTsNCgkJfSwNCg0KCQlnZXRTZWxlY3RlZEJsb2NrcyA6IGZ1bmN0aW9uKHN0LCBlbikgew0KCQkJdmFyIHQgPSB0aGlzLCBkb20gPSB0LmRvbSwgc2IsIGViLCBuLCBibCA9IFtdOw0KDQoJCQlzYiA9IGRvbS5nZXRQYXJlbnQoc3QgfHwgdC5nZXRTdGFydCgpLCBkb20uaXNCbG9jayk7DQoJCQllYiA9IGRvbS5nZXRQYXJlbnQoZW4gfHwgdC5nZXRFbmQoKSwgZG9tLmlzQmxvY2spOw0KDQoJCQlpZiAoc2IpDQoJCQkJYmwucHVzaChzYik7DQoNCgkJCWlmIChzYiAmJiBlYiAmJiBzYiAhPSBlYikgew0KCQkJCW4gPSBzYjsNCg0KCQkJCXdoaWxlICgobiA9IG4ubmV4dFNpYmxpbmcpICYmIG4gIT0gZWIpIHsNCgkJCQkJaWYgKGRvbS5pc0Jsb2NrKG4pKQ0KCQkJCQkJYmwucHVzaChuKTsNCgkJCQl9DQoJCQl9DQoNCgkJCWlmIChlYiAmJiBzYiAhPSBlYikNCgkJCQlibC5wdXNoKGViKTsNCg0KCQkJcmV0dXJuIGJsOw0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQud2luID0gbnVsbDsNCg0KCQkJaWYgKHQudHJpZGVudFNlbCkNCgkJCQl0LnRyaWRlbnRTZWwuZGVzdHJveSgpOw0KDQoJCQkvLyBNYW51YWwgZGVzdHJveSB0aGVuIHJlbW92ZSB1bmxvYWQgaGFuZGxlcg0KCQkJaWYgKCFzKQ0KCQkJCXRpbnltY2UucmVtb3ZlVW5sb2FkKHQuZGVzdHJveSk7DQoJCX0sDQoNCgkJLy8gSUUgaGFzIGFuIGlzc3VlIHdoZXJlIHlvdSBjYW4ndCBzZWxlY3QvbW92ZSB0aGUgY2FyZXQgYnkgY2xpY2tpbmcgb3V0c2lkZSB0aGUgYm9keSBpZiB0aGUgZG9jdW1lbnQgaXMgaW4gc3RhbmRhcmRzIG1vZGUNCgkJX2ZpeElFU2VsZWN0aW9uIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgZG9tID0gdGhpcy5kb20sIGRvYyA9IGRvbS5kb2MsIGJvZHkgPSBkb2MuYm9keSwgc3RhcnRlZCwgc3RhcnRSbmc7DQoNCgkJCS8vIE1ha2UgSFRNTCBlbGVtZW50IHVuc2VsZWN0YWJsZSBzaW5jZSB3ZSBhcmUgZ29pbmcgdG8gaGFuZGxlIHNlbGVjdGlvbiBieSBoYW5kDQoJCQlkb2MuZG9jdW1lbnRFbGVtZW50LnVuc2VsZWN0YWJsZSA9IHRydWU7DQoNCgkJCS8vIFJldHVybiByYW5nZSBmcm9tIHBvaW50IG9yIG51bGwgaWYgaXQgZmFpbGVkDQoJCQlmdW5jdGlvbiBybmdGcm9tUG9pbnQoeCwgeSkgew0KCQkJCXZhciBybmcgPSBib2R5LmNyZWF0ZVRleHRSYW5nZSgpOw0KDQoJCQkJdHJ5IHsNCgkJCQkJcm5nLm1vdmVUb1BvaW50KHgsIHkpOw0KCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCS8vIElFIHNvbWV0aW1lcyB0aHJvd3MgYW5kIGV4Y2VwdGlvbiwgc28gbGV0cyBqdXN0IGlnbm9yZSBpdA0KCQkJCQlybmcgPSBudWxsOw0KCQkJCX0NCg0KCQkJCXJldHVybiBybmc7DQoJCQl9Ow0KDQoJCQkvLyBGaXJlcyB3aGlsZSB0aGUgc2VsZWN0aW9uIGlzIGNoYW5naW5nDQoJCQlmdW5jdGlvbiBzZWxlY3Rpb25DaGFuZ2UoZSkgew0KCQkJCXZhciBwb2ludFJuZzsNCg0KCQkJCS8vIENoZWNrIGlmIHRoZSBidXR0b24gaXMgZG93biBvciBub3QNCgkJCQlpZiAoZS5idXR0b24pIHsNCgkJCQkJLy8gQ3JlYXRlIHJhbmdlIGZyb20gbW91c2UgcG9zaXRpb24NCgkJCQkJcG9pbnRSbmcgPSBybmdGcm9tUG9pbnQoZS54LCBlLnkpOw0KDQoJCQkJCWlmIChwb2ludFJuZykgew0KCQkJCQkJLy8gQ2hlY2sgaWYgcG9pbnRSYW5nZSBpcyBiZWZvcmUvYWZ0ZXIgc2VsZWN0aW9uIHRoZW4gY2hhbmdlIHRoZSBlbmRQb2ludA0KCQkJCQkJaWYgKHBvaW50Um5nLmNvbXBhcmVFbmRQb2ludHMoJ1N0YXJ0VG9TdGFydCcsIHN0YXJ0Um5nKSA+IDApDQoJCQkJCQkJcG9pbnRSbmcuc2V0RW5kUG9pbnQoJ1N0YXJ0VG9TdGFydCcsIHN0YXJ0Um5nKTsNCgkJCQkJCWVsc2UNCgkJCQkJCQlwb2ludFJuZy5zZXRFbmRQb2ludCgnRW5kVG9FbmQnLCBzdGFydFJuZyk7DQoNCgkJCQkJCXBvaW50Um5nLnNlbGVjdCgpOw0KCQkJCQl9DQoJCQkJfSBlbHNlDQoJCQkJCWVuZFNlbGVjdGlvbigpOw0KCQkJfQ0KDQoJCQkvLyBSZW1vdmVzIGxpc3RlbmVycw0KCQkJZnVuY3Rpb24gZW5kU2VsZWN0aW9uKCkgew0KCQkJCWRvbS51bmJpbmQoZG9jLCAnbW91c2V1cCcsIGVuZFNlbGVjdGlvbik7DQoJCQkJZG9tLnVuYmluZChkb2MsICdtb3VzZW1vdmUnLCBzZWxlY3Rpb25DaGFuZ2UpOw0KCQkJCXN0YXJ0ZWQgPSAwOw0KCQkJfTsNCg0KCQkJLy8gRGV0ZWN0IHdoZW4gdXNlciBzZWxlY3RzIG91dHNpZGUgQk9EWQ0KCQkJZG9tLmJpbmQoZG9jLCAnbW91c2Vkb3duJywgZnVuY3Rpb24oZSkgew0KCQkJCWlmIChlLnRhcmdldC5ub2RlTmFtZSA9PT0gJ0hUTUwnKSB7DQoJCQkJCWlmIChzdGFydGVkKQ0KCQkJCQkJZW5kU2VsZWN0aW9uKCk7DQoNCgkJCQkJc3RhcnRlZCA9IDE7DQoNCgkJCQkJLy8gU2V0dXAgc3RhcnQgcG9zaXRpb24NCgkJCQkJc3RhcnRSbmcgPSBybmdGcm9tUG9pbnQoZS54LCBlLnkpOw0KCQkJCQlpZiAoc3RhcnRSbmcpIHsNCgkJCQkJCS8vIExpc3RlbiBmb3Igc2VsZWN0aW9uIGNoYW5nZSBldmVudHMNCgkJCQkJCWRvbS5iaW5kKGRvYywgJ21vdXNldXAnLCBlbmRTZWxlY3Rpb24pOw0KCQkJCQkJZG9tLmJpbmQoZG9jLCAnbW91c2Vtb3ZlJywgc2VsZWN0aW9uQ2hhbmdlKTsNCg0KCQkJCQkJZG9tLndpbi5mb2N1cygpOw0KCQkJCQkJc3RhcnRSbmcuc2VsZWN0KCk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9KTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/Serializer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBTZXJpYWxpemVyLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgkvLyBTaG9ydGVuIG5hbWVzDQoJdmFyIGV4dGVuZCA9IHRpbnltY2UuZXh0ZW5kLCBlYWNoID0gdGlueW1jZS5lYWNoLCBEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXIsIGlzSUUgPSB0aW55bWNlLmlzSUUsIGlzR2Vja28gPSB0aW55bWNlLmlzR2Vja287DQoNCglmdW5jdGlvbiB3aWxkY2FyZFRvUkUocykgew0KCQlyZXR1cm4gcy5yZXBsYWNlKC8oWz8rKl0pL2csICcuJDEnKTsNCgl9Ow0KDQoJLyoqDQoJICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHNlcmlhbGl6ZSBET00gdHJlZXMgaW50byBhIHN0cmluZy4NCgkgKiBDb25zdWx0IHRoZSBUaW55TUNFIFdpa2kgQVBJIGZvciBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIG9uIGhvdyB0byB1c2UgdGhpcyBjbGFzcy4NCgkgKiBAY2xhc3MgdGlueW1jZS5kb20uU2VyaWFsaXplcg0KCSAqLw0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLmRvbS5TZXJpYWxpemVyJywgew0KCQkvKioNCgkJICogQ29uc3R1Y3RzIGEgbmV3IERPTSBzZXJpYWxpemVyIGNsYXNzLg0KCQkgKg0KCQkgKiBAY29uc3RydWN0b3INCgkJICogQG1ldGhvZCBTZXJpYWxpemVyDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIG5hbWUvVmFsdWUgY29sbGVjdGlvbiBvZiBzZXR0aW5ncyBmb3IgdGhlIHNlcmlhbGl6ZXIuDQoJCSAqLw0KCQlTZXJpYWxpemVyIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmtleSA9IDA7DQoJCQl0Lm9uUHJlUHJvY2VzcyA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KCQkJdC5vblBvc3RQcm9jZXNzID0gbmV3IERpc3BhdGNoZXIodCk7DQoNCgkJCXRyeSB7DQoJCQkJdC53cml0ZXIgPSBuZXcgdGlueW1jZS5kb20uWE1MV3JpdGVyKCk7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJCS8vIElFIG1pZ2h0IHRocm93IGV4Y2VwdGlvbiBpZiBBY3RpdmVYIGlzIGRpc2FibGVkIHNvIHdlIHRoZW4gc3dpdGNoIHRvIHRoZSBzbGlnaHRseSBzbG93ZXIgU3RyaW5nV3JpdGVyDQoJCQkJdC53cml0ZXIgPSBuZXcgdGlueW1jZS5kb20uU3RyaW5nV3JpdGVyKCk7DQoJCQl9DQoNCgkJCS8vIElFOSBicm9rZSB0aGUgWE1MIGF0dHJpYnV0ZXMgb3JkZXIgc28gaXQgY2FuJ3QgYmUgdXNlZCBhbnltb3JlDQoJCQlpZiAodGlueW1jZS5pc0lFICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDgpIHsNCgkJCQl0LndyaXRlciA9IG5ldyB0aW55bWNlLmRvbS5TdHJpbmdXcml0ZXIoKTsNCgkJCX0NCg0KCQkJLy8gRGVmYXVsdCBzZXR0aW5ncw0KCQkJdC5zZXR0aW5ncyA9IHMgPSBleHRlbmQoew0KCQkJCWRvbSA6IHRpbnltY2UuRE9NLA0KCQkJCXZhbGlkX25vZGVzIDogMCwNCgkJCQlub2RlX2ZpbHRlciA6IDAsDQoJCQkJYXR0cl9maWx0ZXIgOiAwLA0KCQkJCWludmFsaWRfYXR0cnMgOiAvXihfbWNlX3xfbW96X3xzaXpzZXR8c2l6Y2FjaGUpLywNCgkJCQljbG9zZWQgOiAvXihicnxocnxpbnB1dHxtZXRhfGltZ3xsaW5rfHBhcmFtfGFyZWEpJC8sDQoJCQkJZW50aXR5X2VuY29kaW5nIDogJ25hbWVkJywNCgkJCQllbnRpdGllcyA6ICcxNjAsbmJzcCwxNjEsaWV4Y2wsMTYyLGNlbnQsMTYzLHBvdW5kLDE2NCxjdXJyZW4sMTY1LHllbiwxNjYsYnJ2YmFyLDE2NyxzZWN0LDE2OCx1bWwsMTY5LGNvcHksMTcwLG9yZGYsMTcxLGxhcXVvLDE3Mixub3QsMTczLHNoeSwxNzQscmVnLDE3NSxtYWNyLDE3NixkZWcsMTc3LHBsdXNtbiwxNzgsc3VwMiwxNzksc3VwMywxODAsYWN1dGUsMTgxLG1pY3JvLDE4MixwYXJhLDE4MyxtaWRkb3QsMTg0LGNlZGlsLDE4NSxzdXAxLDE4NixvcmRtLDE4NyxyYXF1bywxODgsZnJhYzE0LDE4OSxmcmFjMTIsMTkwLGZyYWMzNCwxOTEsaXF1ZXN0LDE5MixBZ3JhdmUsMTkzLEFhY3V0ZSwxOTQsQWNpcmMsMTk1LEF0aWxkZSwxOTYsQXVtbCwxOTcsQXJpbmcsMTk4LEFFbGlnLDE5OSxDY2VkaWwsMjAwLEVncmF2ZSwyMDEsRWFjdXRlLDIwMixFY2lyYywyMDMsRXVtbCwyMDQsSWdyYXZlLDIwNSxJYWN1dGUsMjA2LEljaXJjLDIwNyxJdW1sLDIwOCxFVEgsMjA5LE50aWxkZSwyMTAsT2dyYXZlLDIxMSxPYWN1dGUsMjEyLE9jaXJjLDIxMyxPdGlsZGUsMjE0LE91bWwsMjE1LHRpbWVzLDIxNixPc2xhc2gsMjE3LFVncmF2ZSwyMTgsVWFjdXRlLDIxOSxVY2lyYywyMjAsVXVtbCwyMjEsWWFjdXRlLDIyMixUSE9STiwyMjMsc3psaWcsMjI0LGFncmF2ZSwyMjUsYWFjdXRlLDIyNixhY2lyYywyMjcsYXRpbGRlLDIyOCxhdW1sLDIyOSxhcmluZywyMzAsYWVsaWcsMjMxLGNjZWRpbCwyMzIsZWdyYXZlLDIzMyxlYWN1dGUsMjM0LGVjaXJjLDIzNSxldW1sLDIzNixpZ3JhdmUsMjM3LGlhY3V0ZSwyMzgsaWNpcmMsMjM5LGl1bWwsMjQwLGV0aCwyNDEsbnRpbGRlLDI0MixvZ3JhdmUsMjQzLG9hY3V0ZSwyNDQsb2NpcmMsMjQ1LG90aWxkZSwyNDYsb3VtbCwyNDcsZGl2aWRlLDI0OCxvc2xhc2gsMjQ5LHVncmF2ZSwyNTAsdWFjdXRlLDI1MSx1Y2lyYywyNTIsdXVtbCwyNTMseWFjdXRlLDI1NCx0aG9ybiwyNTUseXVtbCw0MDIsZm5vZiw5MTMsQWxwaGEsOTE0LEJldGEsOTE1LEdhbW1hLDkxNixEZWx0YSw5MTcsRXBzaWxvbiw5MTgsWmV0YSw5MTksRXRhLDkyMCxUaGV0YSw5MjEsSW90YSw5MjIsS2FwcGEsOTIzLExhbWJkYSw5MjQsTXUsOTI1LE51LDkyNixYaSw5MjcsT21pY3Jvbiw5MjgsUGksOTI5LFJobyw5MzEsU2lnbWEsOTMyLFRhdSw5MzMsVXBzaWxvbiw5MzQsUGhpLDkzNSxDaGksOTM2LFBzaSw5MzcsT21lZ2EsOTQ1LGFscGhhLDk0NixiZXRhLDk0NyxnYW1tYSw5NDgsZGVsdGEsOTQ5LGVwc2lsb24sOTUwLHpldGEsOTUxLGV0YSw5NTIsdGhldGEsOTUzLGlvdGEsOTU0LGthcHBhLDk1NSxsYW1iZGEsOTU2LG11LDk1NyxudSw5NTgseGksOTU5LG9taWNyb24sOTYwLHBpLDk2MSxyaG8sOTYyLHNpZ21hZiw5NjMsc2lnbWEsOTY0LHRhdSw5NjUsdXBzaWxvbiw5NjYscGhpLDk2NyxjaGksOTY4LHBzaSw5Njksb21lZ2EsOTc3LHRoZXRhc3ltLDk3OCx1cHNpaCw5ODIscGl2LDgyMjYsYnVsbCw4MjMwLGhlbGxpcCw4MjQyLHByaW1lLDgyNDMsUHJpbWUsODI1NCxvbGluZSw4MjYwLGZyYXNsLDg0NzIsd2VpZXJwLDg0NjUsaW1hZ2UsODQ3NixyZWFsLDg0ODIsdHJhZGUsODUwMSxhbGVmc3ltLDg1OTIsbGFyciw4NTkzLHVhcnIsODU5NCxyYXJyLDg1OTUsZGFyciw4NTk2LGhhcnIsODYyOSxjcmFyciw4NjU2LGxBcnIsODY1Nyx1QXJyLDg2NTgsckFyciw4NjU5LGRBcnIsODY2MCxoQXJyLDg3MDQsZm9yYWxsLDg3MDYscGFydCw4NzA3LGV4aXN0LDg3MDksZW1wdHksODcxMSxuYWJsYSw4NzEyLGlzaW4sODcxMyxub3Rpbiw4NzE1LG5pLDg3MTkscHJvZCw4NzIxLHN1bSw4NzIyLG1pbnVzLDg3MjcsbG93YXN0LDg3MzAscmFkaWMsODczMyxwcm9wLDg3MzQsaW5maW4sODczNixhbmcsODc0MyxhbmQsODc0NCxvciw4NzQ1LGNhcCw4NzQ2LGN1cCw4NzQ3LGludCw4NzU2LHRoZXJlNCw4NzY0LHNpbSw4NzczLGNvbmcsODc3Nixhc3ltcCw4ODAwLG5lLDg4MDEsZXF1aXYsODgwNCxsZSw4ODA1LGdlLDg4MzQsc3ViLDg4MzUsc3VwLDg4MzYsbnN1Yiw4ODM4LHN1YmUsODgzOSxzdXBlLDg4NTMsb3BsdXMsODg1NSxvdGltZXMsODg2OSxwZXJwLDg5MDEsc2RvdCw4OTY4LGxjZWlsLDg5NjkscmNlaWwsODk3MCxsZmxvb3IsODk3MSxyZmxvb3IsOTAwMSxsYW5nLDkwMDIscmFuZyw5Njc0LGxveiw5ODI0LHNwYWRlcyw5ODI3LGNsdWJzLDk4MjksaGVhcnRzLDk4MzAsZGlhbXMsMzM4LE9FbGlnLDMzOSxvZWxpZywzNTIsU2Nhcm9uLDM1MyxzY2Fyb24sMzc2LFl1bWwsNzEwLGNpcmMsNzMyLHRpbGRlLDgxOTQsZW5zcCw4MTk1LGVtc3AsODIwMSx0aGluc3AsODIwNCx6d25qLDgyMDUsendqLDgyMDYsbHJtLDgyMDcscmxtLDgyMTEsbmRhc2gsODIxMixtZGFzaCw4MjE2LGxzcXVvLDgyMTcscnNxdW8sODIxOCxzYnF1byw4MjIwLGxkcXVvLDgyMjEscmRxdW8sODIyMixiZHF1byw4MjI0LGRhZ2dlciw4MjI1LERhZ2dlciw4MjQwLHBlcm1pbCw4MjQ5LGxzYXF1byw4MjUwLHJzYXF1byw4MzY0LGV1cm8nLA0KCQkJCXZhbGlkX2VsZW1lbnRzIDogJypbKl0nLA0KCQkJCWV4dGVuZGVkX3ZhbGlkX2VsZW1lbnRzIDogMCwNCgkJCQlpbnZhbGlkX2VsZW1lbnRzIDogMCwNCgkJCQlmaXhfdGFibGVfZWxlbWVudHMgOiAxLA0KCQkJCWZpeF9saXN0X2VsZW1lbnRzIDogdHJ1ZSwNCgkJCQlmaXhfY29udGVudF9kdXBsaWNhdGlvbiA6IHRydWUsDQoJCQkJY29udmVydF9mb250c190b19zcGFucyA6IGZhbHNlLA0KCQkJCWZvbnRfc2l6ZV9jbGFzc2VzIDogMCwNCgkJCQlhcHBseV9zb3VyY2VfZm9ybWF0dGluZyA6IDAsDQoJCQkJaW5kZW50X21vZGUgOiAnc2ltcGxlJywNCgkJCQlpbmRlbnRfY2hhciA6ICdcdCcsDQoJCQkJaW5kZW50X2xldmVscyA6IDEsDQoJCQkJcmVtb3ZlX2xpbmVicmVha3MgOiAxLA0KCQkJCXJlbW92ZV9yZWR1bmRhbnRfYnJzIDogMSwNCgkJCQllbGVtZW50X2Zvcm1hdCA6ICd4aHRtbCcNCgkJCX0sIHMpOw0KDQoJCQl0LmRvbSA9IHMuZG9tOw0KCQkJdC5zY2hlbWEgPSBzLnNjaGVtYTsNCg0KCQkJLy8gVXNlIHJhdyBlbnRpdGllcyBpZiBubyBlbnRpdGllcyBhcmUgZGVmaW5lZA0KCQkJaWYgKHMuZW50aXR5X2VuY29kaW5nID09ICduYW1lZCcgJiYgIXMuZW50aXRpZXMpDQoJCQkJcy5lbnRpdHlfZW5jb2RpbmcgPSAncmF3JzsNCg0KCQkJaWYgKHMucmVtb3ZlX3JlZHVuZGFudF9icnMpIHsNCgkJCQl0Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJCS8vIFJlbW92ZSBzaW5nbGUgQlIgYXQgZW5kIG9mIGJsb2NrIGVsZW1lbnRzIHNpbmNlIHRoZXkgZ2V0IHJlbmRlcmVkDQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKC8oPGJyIFwvPlxzKikrPFwvKHB8aFsxLTZdfGRpdnxsaSk+L2dpLCBmdW5jdGlvbihhLCBiLCBjKSB7DQoJCQkJCQkvLyBDaGVjayBpZiBpdCdzIGEgc2luZ2xlIGVsZW1lbnQNCgkJCQkJCWlmICgvXjxiciBcLz5ccyo8XC8vLnRlc3QoYSkpDQoJCQkJCQkJcmV0dXJuICc8LycgKyBjICsgJz4nOw0KDQoJCQkJCQlyZXR1cm4gYTsNCgkJCQkJfSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCS8vIFJlbW92ZSBYSFRNTCBlbGVtZW50IGVuZGluZ3MgaS5lLiBwcm9kdWNlIGNyYXAgOikgWEhUTUwgaXMgYmV0dGVyDQoJCQlpZiAocy5lbGVtZW50X2Zvcm1hdCA9PSAnaHRtbCcpIHsNCgkJCQl0Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKC88KFtePl0rKSBcLz4vZywgJzwkMT4nKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuZml4X2xpc3RfZWxlbWVudHMpIHsNCgkJCQl0Lm9uUHJlUHJvY2Vzcy5hZGQoZnVuY3Rpb24oc2UsIG8pIHsNCgkJCQkJdmFyIG5sLCB4LCBhID0gWydvbCcsICd1bCddLCBpLCBuLCBwLCByID0gL14oT0x8VUwpJC8sIG5wOw0KDQoJCQkJCWZ1bmN0aW9uIHByZXZOb2RlKGUsIG4pIHsNCgkJCQkJCXZhciBhID0gbi5zcGxpdCgnLCcpLCBpOw0KDQoJCQkJCQl3aGlsZSAoKGUgPSBlLnByZXZpb3VzU2libGluZykgIT0gbnVsbCkgew0KCQkJCQkJCWZvciAoaT0wOyBpPGEubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQkJaWYgKGUubm9kZU5hbWUgPT0gYVtpXSkNCgkJCQkJCQkJCXJldHVybiBlOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuIG51bGw7DQoJCQkJCX07DQoNCgkJCQkJZm9yICh4PTA7IHg8YS5sZW5ndGg7IHgrKykgew0KCQkJCQkJbmwgPSB0LmRvbS5zZWxlY3QoYVt4XSwgby5ub2RlKTsNCg0KCQkJCQkJZm9yIChpPTA7IGk8bmwubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQluID0gbmxbaV07DQoJCQkJCQkJcCA9IG4ucGFyZW50Tm9kZTsNCg0KCQkJCQkJCWlmIChyLnRlc3QocC5ub2RlTmFtZSkpIHsNCgkJCQkJCQkJbnAgPSBwcmV2Tm9kZShuLCAnTEknKTsNCg0KCQkJCQkJCQlpZiAoIW5wKSB7DQoJCQkJCQkJCQlucCA9IHQuZG9tLmNyZWF0ZSgnbGknKTsNCgkJCQkJCQkJCW5wLmlubmVySFRNTCA9ICcmbmJzcDsnOw0KCQkJCQkJCQkJbnAuYXBwZW5kQ2hpbGQobik7DQoJCQkJCQkJCQlwLmluc2VydEJlZm9yZShucCwgcC5maXJzdENoaWxkKTsNCgkJCQkJCQkJfSBlbHNlDQoJCQkJCQkJCQlucC5hcHBlbmRDaGlsZChuKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuZml4X3RhYmxlX2VsZW1lbnRzKSB7DQoJCQkJdC5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJCWVhY2godC5kb20uc2VsZWN0KCdwIHRhYmxlJywgby5ub2RlKS5yZXZlcnNlKCksIGZ1bmN0aW9uKG4pIHsNCgkJCQkJCXZhciBwYXJlbnQgPSB0LmRvbS5nZXRQYXJlbnQobi5wYXJlbnROb2RlLCAndGFibGUscCcpOw0KDQoJCQkJCQlpZiAocGFyZW50Lm5vZGVOYW1lICE9ICdUQUJMRScpIHsNCgkJCQkJCQl0cnkgew0KCQkJCQkJCQl0LmRvbS5zcGxpdChwYXJlbnQsIG4pOw0KCQkJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkJCS8vIElFIGNhbiBzb21ldGltZXMgZmlyZSBhbiB1bmtub3duIHJ1bnRpbWUgZXJyb3Igc28gd2UganVzdCBpZ25vcmUgaXQNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIGEgbGlzdCBvZiBlbnRpdGllcyB0byB1c2UgZm9yIHRoZSBuYW1lZCBlbnRpdHkgZW5jb2RlZC4NCgkJICoNCgkJICogQG1ldGhvZCBzZXRFbnRpdGllcw0KCQkgKiBAcGFyYW0ge1N0cmluZ30gcyBMaXN0IG9mIGVudGl0aWVzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBudW1iZXIsbmFtZSwuLi4uDQoJCSAqLw0KCQlzZXRFbnRpdGllcyA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgYSwgaSwgbCA9IHt9LCB2Ow0KDQoJCQkvLyBObyBuZWVkIHRvIHNldHVwIG1vcmUgdGhhbiBvbmNlDQoJCQlpZiAodC5lbnRpdHlMb29rdXApDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBCdWlsZCByZWdleCBhbmQgbG9va3VwIGFycmF5DQoJCQlhID0gcy5zcGxpdCgnLCcpOw0KCQkJZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDIpIHsNCgkJCQl2ID0gYVtpXTsNCg0KCQkJCS8vIERvbid0IGFkZCBkZWZhdWx0ICZhbXA7ICZxdW90OyBldGMuDQoJCQkJaWYgKHYgPT0gMzQgfHwgdiA9PSAzOCB8fCB2ID09IDYwIHx8IHYgPT0gNjIpDQoJCQkJCWNvbnRpbnVlOw0KDQoJCQkJbFtTdHJpbmcuZnJvbUNoYXJDb2RlKGFbaV0pXSA9IGFbaSArIDFdOw0KDQoJCQkJdiA9IHBhcnNlSW50KGFbaV0pLnRvU3RyaW5nKDE2KTsNCgkJCX0NCg0KCQkJdC5lbnRpdHlMb29rdXAgPSBsOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIHRoZSB2YWxpZCBlbGVtZW50cyBydWxlcyBvZiB0aGUgc2VyaWFsaXplciB0aGlzIGVuYWJsZXMgeW91IHRvIHNwZWNpZnkgdGhpbmdzIGxpa2Ugd2hhdCBlbGVtZW50cyBzaG91bGQgYmUNCgkJICogb3V0cHV0dGVkIGFuZCB3aGF0IGF0dHJpYnV0ZXMgc3BlY2lmaWMgZWxlbWVudHMgbWlnaHQgaGF2ZS4NCgkJICogQ29uc3VsdCB0aGUgV2lraSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgZm9ybWF0Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldFJ1bGVzDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBzIFZhbGlkIGVsZW1lbnRzIHJ1bGVzIHN0cmluZy4NCgkJICovDQoJCXNldFJ1bGVzIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0Ll9zZXR1cCgpOw0KCQkJdC5ydWxlcyA9IHt9Ow0KCQkJdC53aWxkUnVsZXMgPSBbXTsNCgkJCXQudmFsaWRFbGVtZW50cyA9IHt9Ow0KDQoJCQlyZXR1cm4gdC5hZGRSdWxlcyhzKTsNCgkJfSwNCg0KCQkvKioNCgkJICogQWRkcyB2YWxpZCBlbGVtZW50cyBydWxlcyB0byB0aGUgc2VyaWFsaXplciB0aGlzIGVuYWJsZXMgeW91IHRvIHNwZWNpZnkgdGhpbmdzIGxpa2Ugd2hhdCBlbGVtZW50cyBzaG91bGQgYmUNCgkJICogb3V0cHV0dGVkIGFuZCB3aGF0IGF0dHJpYnV0ZXMgc3BlY2lmaWMgZWxlbWVudHMgbWlnaHQgaGF2ZS4NCgkJICogQ29uc3VsdCB0aGUgV2lraSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgZm9ybWF0Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGFkZFJ1bGVzDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBzIFZhbGlkIGVsZW1lbnRzIHJ1bGVzIHN0cmluZyB0byBhZGQuDQoJCSAqLw0KCQlhZGRSdWxlcyA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgZHI7DQoNCgkJCWlmICghcykNCgkJCQlyZXR1cm47DQoNCgkJCXQuX3NldHVwKCk7DQoNCgkJCWVhY2gocy5zcGxpdCgnLCcpLCBmdW5jdGlvbihzKSB7DQoJCQkJdmFyIHAgPSBzLnNwbGl0KC9cW3xcXS8pLCB0biA9IHBbMF0uc3BsaXQoJy8nKSwgcmEsIGF0LCB3YXQsIHZhID0gW107DQoNCgkJCQkvLyBFeHRlbmQgd2l0aCBkZWZhdWx0IHJ1bGVzDQoJCQkJaWYgKGRyKQ0KCQkJCQlhdCA9IHRpbnltY2UuZXh0ZW5kKFtdLCBkci5hdHRyaWJzKTsNCg0KCQkJCS8vIFBhcnNlIGF0dHJpYnV0ZXMNCgkJCQlpZiAocC5sZW5ndGggPiAxKSB7DQoJCQkJCWVhY2gocFsxXS5zcGxpdCgnfCcpLCBmdW5jdGlvbihzKSB7DQoJCQkJCQl2YXIgYXIgPSB7fSwgaTsNCg0KCQkJCQkJYXQgPSBhdCB8fCBbXTsNCg0KCQkJCQkJLy8gUGFyc2UgYXR0cmlidXRlIHJ1bGUNCgkJCQkJCXMgPSBzLnJlcGxhY2UoLzo6L2csICd+Jyk7DQoJCQkJCQlzID0gL14oWyFcLV0pPyhbXHcqLj9+X1wtXSt8KShbPTo8XSk/KC4rKT8kLy5leGVjKHMpOw0KCQkJCQkJc1syXSA9IHNbMl0ucmVwbGFjZSgvfi9nLCAnOicpOw0KDQoJCQkJCQkvLyBBZGQgcmVxdWlyZWQgYXR0cmlidXRlcw0KCQkJCQkJaWYgKHNbMV0gPT0gJyEnKSB7DQoJCQkJCQkJcmEgPSByYSB8fCBbXTsNCgkJCQkJCQlyYS5wdXNoKHNbMl0pOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBSZW1vdmUgaW5oZXJpdGVkIGF0dHJpYnV0ZXMNCgkJCQkJCWlmIChzWzFdID09ICctJykgew0KCQkJCQkJCWZvciAoaSA9IDA7IGkgPGF0Lmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJCWlmIChhdFtpXS5uYW1lID09IHNbMl0pIHsNCgkJCQkJCQkJCWF0LnNwbGljZShpLCAxKTsNCgkJCQkJCQkJCXJldHVybjsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJc3dpdGNoIChzWzNdKSB7DQoJCQkJCQkJLy8gQWRkIGRlZmF1bHQgYXR0cmliIHZhbHVlcw0KCQkJCQkJCWNhc2UgJz0nOg0KCQkJCQkJCQlhci5kZWZhdWx0VmFsID0gc1s0XSB8fCAnJzsNCgkJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCQkvLyBBZGQgZm9yY2VkIGF0dHJpYiB2YWx1ZXMNCgkJCQkJCQljYXNlICc6JzoNCgkJCQkJCQkJYXIuZm9yY2VkVmFsID0gc1s0XTsNCgkJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCQkvLyBBZGQgdmFsaWRhdGlvbiB2YWx1ZXMNCgkJCQkJCQljYXNlICc8JzoNCgkJCQkJCQkJYXIudmFsaWRWYWxzID0gc1s0XS5zcGxpdCgnPycpOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCX0NCg0KCQkJCQkJaWYgKC9bKi4/XS8udGVzdChzWzJdKSkgew0KCQkJCQkJCXdhdCA9IHdhdCB8fCBbXTsNCgkJCQkJCQlhci5uYW1lUkUgPSBuZXcgUmVnRXhwKCdeJyArIHdpbGRjYXJkVG9SRShzWzJdKSArICckJyk7DQoJCQkJCQkJd2F0LnB1c2goYXIpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQlhci5uYW1lID0gc1syXTsNCgkJCQkJCQlhdC5wdXNoKGFyKTsNCgkJCQkJCX0NCg0KCQkJCQkJdmEucHVzaChzWzJdKTsNCgkJCQkJfSk7DQoJCQkJfQ0KDQoJCQkJLy8gSGFuZGxlIGVsZW1lbnQgbmFtZXMNCgkJCQllYWNoKHRuLCBmdW5jdGlvbihzLCBpKSB7DQoJCQkJCXZhciBwciA9IHMuY2hhckF0KDApLCB4ID0gMSwgcnUgPSB7fTsNCg0KCQkJCQkvLyBFeHRlbmQgd2l0aCBkZWZhdWx0IHJ1bGUgZGF0YQ0KCQkJCQlpZiAoZHIpIHsNCgkJCQkJCWlmIChkci5ub0VtcHR5KQ0KCQkJCQkJCXJ1Lm5vRW1wdHkgPSBkci5ub0VtcHR5Ow0KDQoJCQkJCQlpZiAoZHIuZnVsbEVuZCkNCgkJCQkJCQlydS5mdWxsRW5kID0gZHIuZnVsbEVuZDsNCg0KCQkJCQkJaWYgKGRyLnBhZGQpDQoJCQkJCQkJcnUucGFkZCA9IGRyLnBhZGQ7DQoJCQkJCX0NCg0KCQkJCQkvLyBIYW5kbGUgcHJlZml4ZXMNCgkJCQkJc3dpdGNoIChwcikgew0KCQkJCQkJY2FzZSAnLSc6DQoJCQkJCQkJcnUubm9FbXB0eSA9IHRydWU7DQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWNhc2UgJysnOg0KCQkJCQkJCXJ1LmZ1bGxFbmQgPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQljYXNlICcjJzoNCgkJCQkJCQlydS5wYWRkID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJZGVmYXVsdDoNCgkJCQkJCQl4ID0gMDsNCgkJCQkJfQ0KDQoJCQkJCXRuW2ldID0gcyA9IHMuc3Vic3RyaW5nKHgpOw0KCQkJCQl0LnZhbGlkRWxlbWVudHNbc10gPSAxOw0KDQoJCQkJCS8vIEFkZCBlbGVtZW50IG5hbWUgb3IgZWxlbWVudCByZWdleA0KCQkJCQlpZiAoL1sqLj9dLy50ZXN0KHRuWzBdKSkgew0KCQkJCQkJcnUubmFtZVJFID0gbmV3IFJlZ0V4cCgnXicgKyB3aWxkY2FyZFRvUkUodG5bMF0pICsgJyQnKTsNCgkJCQkJCXQud2lsZFJ1bGVzID0gdC53aWxkUnVsZXMgfHwge307DQoJCQkJCQl0LndpbGRSdWxlcy5wdXNoKHJ1KTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCXJ1Lm5hbWUgPSB0blswXTsNCg0KCQkJCQkJLy8gU3RvcmUgYXdheSBkZWZhdWx0IHJ1bGUNCgkJCQkJCWlmICh0blswXSA9PSAnQCcpDQoJCQkJCQkJZHIgPSBydTsNCg0KCQkJCQkJdC5ydWxlc1tzXSA9IHJ1Ow0KCQkJCQl9DQoNCgkJCQkJcnUuYXR0cmlicyA9IGF0Ow0KDQoJCQkJCWlmIChyYSkNCgkJCQkJCXJ1LnJlcXVpcmVkQXR0cmlicyA9IHJhOw0KDQoJCQkJCWlmICh3YXQpIHsNCgkJCQkJCS8vIEJ1aWxkIHZhbGlkIGF0dHJpYnV0ZXMgcmVnZXhwDQoJCQkJCQlzID0gJyc7DQoJCQkJCQllYWNoKHZhLCBmdW5jdGlvbih2KSB7DQoJCQkJCQkJaWYgKHMpDQoJCQkJCQkJCXMgKz0gJ3wnOw0KDQoJCQkJCQkJcyArPSAnKCcgKyB3aWxkY2FyZFRvUkUodikgKyAnKSc7DQoJCQkJCQl9KTsNCgkJCQkJCXJ1LnZhbGlkQXR0cmlic1JFID0gbmV3IFJlZ0V4cCgnXicgKyBzLnRvTG93ZXJDYXNlKCkgKyAnJCcpOw0KCQkJCQkJcnUud2lsZEF0dHJpYnMgPSB3YXQ7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQkvLyBCdWlsZCB2YWxpZCBlbGVtZW50cyByZWdleHANCgkJCXMgPSAnJzsNCgkJCWVhY2godC52YWxpZEVsZW1lbnRzLCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJaWYgKHMpDQoJCQkJCXMgKz0gJ3wnOw0KDQoJCQkJaWYgKGsgIT0gJ0AnKQ0KCQkJCQlzICs9IGs7DQoJCQl9KTsNCgkJCXQudmFsaWRFbGVtZW50c1JFID0gbmV3IFJlZ0V4cCgnXignICsgd2lsZGNhcmRUb1JFKHMudG9Mb3dlckNhc2UoKSkgKyAnKSQnKTsNCg0KCQkJLy9jb25zb2xlLmRlYnVnKHQudmFsaWRFbGVtZW50c1JFLnRvU3RyaW5nKCkpOw0KCQkJLy9jb25zb2xlLmRpcih0LnJ1bGVzKTsNCgkJCS8vY29uc29sZS5kaXIodC53aWxkUnVsZXMpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBGaW5kcyBhIHJ1bGUgb2JqZWN0IGJ5IG5hbWUuDQoJCSAqDQoJCSAqIEBtZXRob2QgZmluZFJ1bGUNCgkJICogQHBhcmFtIHtTdHJpbmd9IG4gTmFtZSB0byBsb29rIGZvciBpbiBydWxlcyBjb2xsZWN0aW9uLg0KCQkgKiBAcmV0dXJuIHtPYmplY3R9IFJ1bGUgb2JqZWN0IGZvdW5kIG9yIG51bGwgaWYgaXQgd2Fzbid0IGZvdW5kLg0KCQkgKi8NCgkJZmluZFJ1bGUgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHJsID0gdC5ydWxlcywgaSwgcjsNCg0KCQkJdC5fc2V0dXAoKTsNCg0KCQkJLy8gRXhhY3QgbWF0Y2gNCgkJCXIgPSBybFtuXTsNCgkJCWlmIChyKQ0KCQkJCXJldHVybiByOw0KDQoJCQkvLyBUcnkgd2lsZGNhcmRzDQoJCQlybCA9IHQud2lsZFJ1bGVzOw0KCQkJZm9yIChpID0gMDsgaSA8IHJsLmxlbmd0aDsgaSsrKSB7DQoJCQkJaWYgKHJsW2ldLm5hbWVSRS50ZXN0KG4pKQ0KCQkJCQlyZXR1cm4gcmxbaV07DQoJCQl9DQoNCgkJCXJldHVybiBudWxsOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBGaW5kcyBhbiBhdHRyaWJ1dGUgcnVsZSBvYmplY3QgYnkgbmFtZS4NCgkJICoNCgkJICogQG1ldGhvZCBmaW5kQXR0cmliUnVsZQ0KCQkgKiBAcGFyYW0ge09iamVjdH0gcnUgUnVsZSBvYmplY3QgdG8gc2VhcmNoIHRob3VnaC4NCgkJICogQHBhcmFtIHtTdHJpbmd9IG4gTmFtZSBvZiB0aGUgcnVsZSB0byByZXRyaXZlLg0KCQkgKiBAcmV0dXJuIHtPYmplY3R9IFJ1bGUgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLg0KCQkgKi8NCgkJZmluZEF0dHJpYlJ1bGUgOiBmdW5jdGlvbihydSwgbikgew0KCQkJdmFyIGksIHdhID0gcnUud2lsZEF0dHJpYnM7DQoNCgkJCWZvciAoaSA9IDA7IGkgPCB3YS5sZW5ndGg7IGkrKykgew0KCQkJCWlmICh3YVtpXS5uYW1lUkUudGVzdChuKSkNCgkJCQkJcmV0dXJuIHdhW2ldOw0KCQkJfQ0KDQoJCQlyZXR1cm4gbnVsbDsNCgkJfSwNCg0KCQkvKioNCgkJICogU2VyaWFsaXplcyB0aGUgc3BlY2lmaWVkIG5vZGUgaW50byBhIEhUTUwgc3RyaW5nLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNlcmlhbGl6ZQ0KCQkgKiBAcGFyYW0ge0VsZW1lbnR9IG4gRWxlbWVudC9Ob2RlIHRvIHNlcmlhbGl6ZS4NCgkJICogQHBhcmFtIHtPYmplY3R9IG8gT2JqZWN0IHRvIGFkZCBzZXJpYWxpemVkIGNvbnRlbnRzIHRvLCB0aGlzIG9iamVjdCB3aWxsIGFsc28gYmUgcGFzc2VkIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuDQoJCSAqIEByZXR1cm4ge1N0cmluZ30gU2VyaWFsaXplZCBIVE1MIGNvbnRlbnRzLg0KCQkgKi8NCgkJc2VyaWFsaXplIDogZnVuY3Rpb24obiwgbykgew0KCQkJdmFyIGgsIHQgPSB0aGlzLCBkb2MsIG9sZERvYywgaW1wbCwgc2VsZWN0ZWQ7DQoNCgkJCXQuX3NldHVwKCk7DQoJCQlvID0gbyB8fCB7fTsNCgkJCW8uZm9ybWF0ID0gby5mb3JtYXQgfHwgJ2h0bWwnOw0KCQkJdC5wcm9jZXNzT2JqID0gbzsNCg0KCQkJLy8gSUUgbG9vc2VzIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgb24gb3B0aW9uIGVsZW1lbnRzIHNvIHdlIG5lZWQgdG8gc3RvcmUgaXQNCgkJCS8vIFNlZTogaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi84Mjk5MDcNCgkJCWlmIChpc0lFKSB7DQoJCQkJc2VsZWN0ZWQgPSBbXTsNCgkJCQllYWNoKG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ29wdGlvbicpLCBmdW5jdGlvbihuKSB7DQoJCQkJCXZhciB2ID0gdC5kb20uZ2V0QXR0cmliKG4sICdzZWxlY3RlZCcpOw0KDQoJCQkJCXNlbGVjdGVkLnB1c2godiA/IHYgOiBudWxsKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJbiA9IG4uY2xvbmVOb2RlKHRydWUpOw0KDQoJCQkvLyBJRSBsb29zZXMgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZSBvbiBvcHRpb24gZWxlbWVudHMgc28gd2UgbmVlZCB0byByZXN0b3JlIGl0DQoJCQlpZiAoaXNJRSkgew0KCQkJCWVhY2gobi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnb3B0aW9uJyksIGZ1bmN0aW9uKG4sIGkpIHsNCgkJCQkJdC5kb20uc2V0QXR0cmliKG4sICdzZWxlY3RlZCcsIHNlbGVjdGVkW2ldKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gTm9kZXMgbmVlZHMgdG8gYmUgYXR0YWNoZWQgdG8gc29tZXRoaW5nIGluIFdlYktpdC9PcGVyYQ0KCQkJLy8gT2xkZXIgYnVpbGRzIG9mIE9wZXJhIGNyYXNoZXMgaWYgeW91IGF0dGFjaCB0aGUgbm9kZSB0byBhbiBkb2N1bWVudCBjcmVhdGVkIGR5bmFtaWNhbGx5DQoJCQkvLyBhbmQgc2luY2Ugd2UgY2FuJ3QgZmVhdHVyZSBkZXRlY3QgYSBjcmFzaCB3ZSBuZWVkIHRvIHNuaWZmIHRoZSBhY3V0YWwgYnVpbGQgbnVtYmVyDQoJCQkvLyBUaGlzIGZpeCB3aWxsIG1ha2UgRE9NIHJhbmdlcyBhbmQgbWFrZSBTaXp6bGUgaGFwcHkhDQoJCQlpbXBsID0gbi5vd25lckRvY3VtZW50LmltcGxlbWVudGF0aW9uOw0KCQkJaWYgKGltcGwuY3JlYXRlSFRNTERvY3VtZW50KSB7DQoJCQkJLy8gQ3JlYXRlIGFuIGVtcHR5IEhUTUwgZG9jdW1lbnQNCgkJCQlkb2MgPSBpbXBsLmNyZWF0ZUhUTUxEb2N1bWVudCgiIik7DQoNCgkJCQkvLyBBZGQgdGhlIGVsZW1lbnQgb3IgaXQncyBjaGlsZHJlbiBpZiBpdCdzIGEgYm9keSBlbGVtZW50IHRvIHRoZSBuZXcgZG9jdW1lbnQNCgkJCQllYWNoKG4ubm9kZU5hbWUgPT0gJ0JPRFknID8gbi5jaGlsZE5vZGVzIDogW25dLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCWRvYy5ib2R5LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKG5vZGUsIHRydWUpKTsNCgkJCQl9KTsNCg0KCQkJCS8vIEdyYWIgZmlyc3QgY2hpbGQgb3IgYm9keSBlbGVtZW50IGZvciBzZXJpYWxpemF0aW9uDQoJCQkJaWYgKG4ubm9kZU5hbWUgIT0gJ0JPRFknKQ0KCQkJCQluID0gZG9jLmJvZHkuZmlyc3RDaGlsZDsNCgkJCQllbHNlDQoJCQkJCW4gPSBkb2MuYm9keTsNCg0KCQkJCS8vIHNldCB0aGUgbmV3IGRvY3VtZW50IGluIERPTVV0aWxzIHNvIGNyZWF0ZUVsZW1lbnQgZXRjIHdvcmtzDQoJCQkJb2xkRG9jID0gdC5kb20uZG9jOw0KCQkJCXQuZG9tLmRvYyA9IGRvYzsNCgkJCX0NCg0KCQkJdC5rZXkgPSAnJyArIChwYXJzZUludCh0LmtleSkgKyAxKTsNCg0KCQkJLy8gUHJlIHByb2Nlc3MNCgkJCWlmICghby5ub19ldmVudHMpIHsNCgkJCQlvLm5vZGUgPSBuOw0KCQkJCXQub25QcmVQcm9jZXNzLmRpc3BhdGNoKHQsIG8pOw0KCQkJfQ0KDQoJCQkvLyBTZXJpYWxpemUgSFRNTCBET00gaW50byBhIHN0cmluZw0KCQkJdC53cml0ZXIucmVzZXQoKTsNCgkJCXQuX2luZm8gPSBvOw0KCQkJdC5fc2VyaWFsaXplTm9kZShuLCBvLmdldElubmVyKTsNCg0KCQkJLy8gUG9zdCBwcm9jZXNzDQoJCQlvLmNvbnRlbnQgPSB0LndyaXRlci5nZXRDb250ZW50KCk7DQoNCgkJCS8vIFJlc3RvcmUgdGhlIG9sZCBkb2N1bWVudCBpZiBpdCB3YXMgY2hhbmdlZA0KCQkJaWYgKG9sZERvYykNCgkJCQl0LmRvbS5kb2MgPSBvbGREb2M7DQoNCgkJCWlmICghby5ub19ldmVudHMpDQoJCQkJdC5vblBvc3RQcm9jZXNzLmRpc3BhdGNoKHQsIG8pOw0KDQoJCQl0Ll9wb3N0UHJvY2VzcyhvKTsNCgkJCW8ubm9kZSA9IG51bGw7DQoNCgkJCXJldHVybiB0aW55bWNlLnRyaW0oby5jb250ZW50KTsNCgkJfSwNCg0KCQkvLyBJbnRlcm5hbCBmdW5jdGlvbnMNCg0KCQkvKioNCgkJICogSW5kZW50cyB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgb2JqZWN0Lg0KCQkgKg0KCQkgKiBAcGFyYW0ge09iamVjdH0gbyBDb250ZW50IG9iamVjdCB0byBpbmRlbnQuDQoJCSAqLw0KCQlfcG9zdFByb2Nlc3MgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBoID0gby5jb250ZW50LCBzYyA9IFtdLCBwOw0KDQoJCQlpZiAoby5mb3JtYXQgPT0gJ2h0bWwnKSB7DQoJCQkJLy8gUHJvdGVjdCBzb21lIGVsZW1lbnRzDQoJCQkJcCA9IHQuX3Byb3RlY3Qoew0KCQkJCQljb250ZW50IDogaCwNCgkJCQkJcGF0dGVybnMgOiBbDQoJCQkJCQl7cGF0dGVybiA6IC8oPHNjcmlwdFtePl0qPikoLio/KSg8XC9zY3JpcHQ+KS9nfSwNCgkJCQkJCXtwYXR0ZXJuIDogLyg8bm9zY3JpcHRbXj5dKj4pKC4qPykoPFwvbm9zY3JpcHQ+KS9nfSwNCgkJCQkJCXtwYXR0ZXJuIDogLyg8c3R5bGVbXj5dKj4pKC4qPykoPFwvc3R5bGU+KS9nfSwNCgkJCQkJCXtwYXR0ZXJuIDogLyg8cHJlW14+XSo+KSguKj8pKDxcL3ByZT4pL2csIGVuY29kZSA6IDF9LA0KCQkJCQkJe3BhdHRlcm4gOiAvKDwhLS1cW0NEQVRBXFspKC4qPykoXF1cXS0tPikvZ30NCgkJCQkJXQ0KCQkJCX0pOw0KDQoJCQkJaCA9IHAuY29udGVudDsNCg0KCQkJCS8vIEVudGl0eSBlbmNvZGUNCgkJCQlpZiAocy5lbnRpdHlfZW5jb2RpbmcgIT09ICdyYXcnKQ0KCQkJCQloID0gdC5fZW5jb2RlKGgpOw0KDQoJCQkJLy8gVXNlIEJSIGluc3RlYWQgb2YgJm5ic3A7IHBhZGRlZCBQIGVsZW1lbnRzIGluc2lkZSBlZGl0b3IgYW5kIHVzZSA8cD4mbmJzcDs8L3A+IG91dHNpZGUgZWRpdG9yDQovKgkJCQlpZiAoby5zZXQpDQoJCQkJCWggPSBoLnJlcGxhY2UoLzxwPlxzKygmbmJzcDt8JiMxNjA7fFx1MDBhMHw8YnIgXC8+KVxzKzxcL3A+L2csICc8cD48YnIgLz48L3A+Jyk7DQoJCQkJZWxzZQ0KCQkJCQloID0gaC5yZXBsYWNlKC88cD5ccysoJm5ic3A7fCYjMTYwO3xcdTAwYTB8PGJyIFwvPilccys8XC9wPi9nLCAnPHA+JDE8L3A+Jyk7Ki8NCg0KCQkJCS8vIFNpbmNlIEdlY2tvIGFuZCBTYWZhcmkga2VlcHMgd2hpdGVzcGFjZSBpbiB0aGUgRE9NIHdlIG5lZWQgdG8NCgkJCQkvLyByZW1vdmUgaXQgaW5vcmRlciB0byBtYXRjaCBvdGhlciBicm93c2Vycy4gQnV0IEkgdGhpbmsgR2Vja28gYW5kIFNhZmFyaSBpcyByaWdodC4NCgkJCQkvLyBUaGlzIHByb2Nlc3MgaXMgb25seSBkb25lIHdoZW4gZ2V0dGluZyBjb250ZW50cyBvdXQgZnJvbSB0aGUgZWRpdG9yLg0KCQkJCWlmICghby5zZXQpIHsNCgkJCQkJLy8gV2UgbmVlZCB0byByZXBsYWNlIHBhcmFncmFwaCB3aGl0ZXNwYWNlIHdpdGggYW4gbmJzcCBiZWZvcmUgaW5kZW50YXRpb24gdG8ga2VlcCB0aGUgXHUwMGEwIGNoYXINCgkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoLzxwPlxzKzxcL3A+fDxwKFtePl0rKT5ccys8XC9wPi9nLCBzLmVudGl0eV9lbmNvZGluZyA9PSAnbnVtZXJpYycgPyAnPHAkMT4mIzE2MDs8L3A+JyA6ICc8cCQxPiZuYnNwOzwvcD4nLCBoKTsNCg0KCQkJCQlpZiAocy5yZW1vdmVfbGluZWJyZWFrcykgew0KCQkJCQkJaCA9IGgucmVwbGFjZSgvXHI/XG58XHIvZywgJyAnKTsNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC8oPFtePl0rPilccysvZywgJyQxICcsIGgpOw0KCQkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoL1xzKyg8XC9bXj5dKz4pL2csICcgJDEnLCBoKTsNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88KHB8aFsxLTZdfGJsb2NrcXVvdGV8aHJ8ZGl2fHRhYmxlfHRib2R5fHRyfHRkfGJvZHl8aGVhZHxodG1sfHRpdGxlfG1ldGF8c3R5bGV8cHJlfHNjcmlwdHxsaW5rfG9iamVjdCkgKFtePl0rKT5ccysvZywgJzwkMSAkMj4nLCBoKTsgLy8gVHJpbSBibG9jayBzdGFydA0KCQkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoLzwocHxoWzEtNl18YmxvY2txdW90ZXxocnxkaXZ8dGFibGV8dGJvZHl8dHJ8dGR8Ym9keXxoZWFkfGh0bWx8dGl0bGV8bWV0YXxzdHlsZXxwcmV8c2NyaXB0fGxpbmt8b2JqZWN0KT5ccysvZywgJzwkMT4nLCBoKTsgLy8gVHJpbSBibG9jayBzdGFydA0KCQkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoL1xzKzxcLyhwfGhbMS02XXxibG9ja3F1b3RlfGhyfGRpdnx0YWJsZXx0Ym9keXx0cnx0ZHxib2R5fGhlYWR8aHRtbHx0aXRsZXxtZXRhfHN0eWxlfHByZXxzY3JpcHR8bGlua3xvYmplY3QpPi9nLCAnPC8kMT4nLCBoKTsgLy8gVHJpbSBibG9jayBlbmQNCgkJCQkJfQ0KDQoJCQkJCS8vIFNpbXBsZSBpbmRlbnRhdGlvbg0KCQkJCQlpZiAocy5hcHBseV9zb3VyY2VfZm9ybWF0dGluZyAmJiBzLmluZGVudF9tb2RlID09ICdzaW1wbGUnKSB7DQoJCQkJCQkvLyBBZGQgbGluZSBicmVha3MgYmVmb3JlIGFuZCBhZnRlciBibG9jayBlbGVtZW50cw0KCQkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoLzwoXC8/KSh1bHxocnx0YWJsZXxtZXRhfGxpbmt8dGJvZHl8dHJ8b2JqZWN0fGJvZHl8aGVhZHxodG1sfG1hcCkofFtePl0rKT5ccyovZywgJ1xuPCQxJDIkMz5cbicsIGgpOw0KCQkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoL1xzKjwocHxoWzEtNl18YmxvY2txdW90ZXxkaXZ8dGl0bGV8c3R5bGV8cHJlfHNjcmlwdHx0ZHxsaXxhcmVhKSh8W14+XSspPi9nLCAnXG48JDEkMj4nLCBoKTsNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88XC8ocHxoWzEtNl18YmxvY2txdW90ZXxkaXZ8dGl0bGV8c3R5bGV8cHJlfHNjcmlwdHx0ZHxsaSk+XHMqL2csICc8LyQxPlxuJywgaCk7DQoJCQkJCQloID0gaC5yZXBsYWNlKC9cblxuL2csICdcbicpOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJaCA9IHQuX3VucHJvdGVjdChoLCBwKTsNCg0KCQkJCS8vIFJlc3RvcmUgQ0RBVEEgc2VjdGlvbnMNCgkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPCEtLVxbQ0RBVEFcWyhbXHNcU10rKVxdXF0tLT4vZywgJzwhW0NEQVRBWyQxXV0+JywgaCk7DQoNCgkJCQkvLyBSZXN0b3JlIHRoZSBcdTAwYTAgY2hhcmFjdGVyIGlmIHJhdyBtb2RlIGlzIGVuYWJsZWQNCgkJCQlpZiAocy5lbnRpdHlfZW5jb2RpbmcgPT0gJ3JhdycpDQoJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88cD4mbmJzcDs8XC9wPnw8cChbXj5dKyk+Jm5ic3A7PFwvcD4vZywgJzxwJDE+XHUwMGEwPC9wPicsIGgpOw0KDQoJCQkJLy8gUmVzdG9yZSBub3NjcmlwdCBlbGVtZW50cw0KCQkJCWggPSBoLnJlcGxhY2UoLzxub3NjcmlwdChbXj5dK3wpPihbXHNcU10qPyk8XC9ub3NjcmlwdD4vZywgZnVuY3Rpb24odiwgYXR0cmlicywgdGV4dCkgew0KCQkJCQlyZXR1cm4gJzxub3NjcmlwdCcgKyBhdHRyaWJzICsgJz4nICsgdC5kb20uZGVjb2RlKHRleHQucmVwbGFjZSgvPCEtLXwtLT4vZywgJycpKSArICc8L25vc2NyaXB0Pic7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCW8uY29udGVudCA9IGg7DQoJCX0sDQoNCgkJX3NlcmlhbGl6ZU5vZGUgOiBmdW5jdGlvbihuLCBpbm5lcikgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgdyA9IHQud3JpdGVyLCBoYywgZWwsIGNuLCBpLCBsLCBhLCBhdCwgbm8sIHYsIG5uLCBydSwgYXIsIGl2LCBjbG9zZWQsIGtlZXAsIHR5cGUsIHNjb3BlTmFtZTsNCg0KCQkJaWYgKCFzLm5vZGVfZmlsdGVyIHx8IHMubm9kZV9maWx0ZXIobikpIHsNCgkJCQlzd2l0Y2ggKG4ubm9kZVR5cGUpIHsNCgkJCQkJY2FzZSAxOiAvLyBFbGVtZW50DQoJCQkJCQlpZiAobi5oYXNBdHRyaWJ1dGUgPyBuLmhhc0F0dHJpYnV0ZSgnX21jZV9ib2d1cycpIDogbi5nZXRBdHRyaWJ1dGUoJ19tY2VfYm9ndXMnKSkNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCWl2ID0ga2VlcCA9IGZhbHNlOw0KCQkJCQkJaGMgPSBuLmhhc0NoaWxkTm9kZXMoKTsNCgkJCQkJCW5uID0gbi5nZXRBdHRyaWJ1dGUoJ19tY2VfbmFtZScpIHx8IG4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsNCg0KCQkJCQkJLy8gR2V0IGludGVybmFsIHR5cGUNCgkJCQkJCXR5cGUgPSBuLmdldEF0dHJpYnV0ZSgnX21jZV90eXBlJyk7DQoJCQkJCQlpZiAodHlwZSkgew0KCQkJCQkJCWlmICghdC5faW5mby5jbGVhbnVwKSB7DQoJCQkJCQkJCWl2ID0gdHJ1ZTsNCgkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCX0gZWxzZQ0KCQkJCQkJCQlrZWVwID0gMTsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gQWRkIGNvcnJlY3QgcHJlZml4IG9uIElFDQoJCQkJCQlpZiAoaXNJRSkgew0KCQkJCQkJCXNjb3BlTmFtZSA9IG4uc2NvcGVOYW1lOw0KCQkJCQkJCWlmIChzY29wZU5hbWUgJiYgc2NvcGVOYW1lICE9PSAnSFRNTCcgJiYgc2NvcGVOYW1lICE9PSAnaHRtbCcpDQoJCQkJCQkJCW5uID0gc2NvcGVOYW1lICsgJzonICsgbm47DQoJCQkJCQl9DQoNCgkJCQkJCS8vIFJlbW92ZSBtY2UgcHJlZml4IG9uIElFIG5lZWRlZCBmb3IgdGhlIGFiYnIgZWxlbWVudA0KCQkJCQkJaWYgKG5uLmluZGV4T2YoJ21jZTonKSA9PT0gMCkNCgkJCQkJCQlubiA9IG5uLnN1YnN0cmluZyg0KTsNCg0KCQkJCQkJLy8gQ2hlY2sgaWYgdmFsaWQNCgkJCQkJCWlmICgha2VlcCkgew0KCQkJCQkJCWlmICghdC52YWxpZEVsZW1lbnRzUkUgfHwgIXQudmFsaWRFbGVtZW50c1JFLnRlc3Qobm4pIHx8ICh0LmludmFsaWRFbGVtZW50c1JFICYmIHQuaW52YWxpZEVsZW1lbnRzUkUudGVzdChubikpIHx8IGlubmVyKSB7DQoJCQkJCQkJCWl2ID0gdHJ1ZTsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoaXNJRSkgew0KCQkJCQkJCS8vIEZpeCBJRSBjb250ZW50IGR1cGxpY2F0aW9uIChET00gY2FuIGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIG5vZGUpDQoJCQkJCQkJaWYgKHMuZml4X2NvbnRlbnRfZHVwbGljYXRpb24pIHsNCgkJCQkJCQkJaWYgKG4uX21jZV9zZXJpYWxpemVkID09IHQua2V5KQ0KCQkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJCW4uX21jZV9zZXJpYWxpemVkID0gdC5rZXk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gSUUgc29tZXRpbWVzIGFkZHMgYSAvIGluZnJvbnQgb2YgdGhlIG5vZGUgbmFtZQ0KCQkJCQkJCWlmIChubi5jaGFyQXQoMCkgPT0gJy8nKQ0KCQkJCQkJCQlubiA9IG5uLnN1YnN0cmluZygxKTsNCgkJCQkJCX0gZWxzZSBpZiAoaXNHZWNrbykgew0KCQkJCQkJCS8vIElnbm9yZSBiciBlbGVtZW50cw0KCQkJCQkJCWlmIChuLm5vZGVOYW1lID09PSAnQlInICYmIG4uZ2V0QXR0cmlidXRlKCd0eXBlJykgPT0gJ19tb3onKQ0KCQkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCS8vIENoZWNrIGlmIHZhbGlkIGNoaWxkDQoJCQkJCQlpZiAocy52YWxpZGF0ZV9jaGlsZHJlbikgew0KCQkJCQkJCWlmICh0LmVsZW1lbnROYW1lICYmICF0LnNjaGVtYS5pc1ZhbGlkKHQuZWxlbWVudE5hbWUsIG5uKSkgew0KCQkJCQkJCQlpdiA9IHRydWU7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCg0KCQkJCQkJCXQuZWxlbWVudE5hbWUgPSBubjsNCgkJCQkJCX0NCg0KCQkJCQkJcnUgPSB0LmZpbmRSdWxlKG5uKTsNCgkJCQkJCQ0KCQkJCQkJLy8gTm8gdmFsaWQgcnVsZSBmb3IgdGhpcyBlbGVtZW50IGNvdWxkIGJlIGZvdW5kIHRoZW4gc2tpcCBpdA0KCQkJCQkJaWYgKCFydSkgew0KCQkJCQkJCWl2ID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCX0NCg0KCQkJCQkJbm4gPSBydS5uYW1lIHx8IG5uOw0KCQkJCQkJY2xvc2VkID0gcy5jbG9zZWQudGVzdChubik7DQoNCgkJCQkJCS8vIFNraXAgZW1wdHkgbm9kZXMgb3IgZW1wdHkgbm9kZSBuYW1lIGluIElFDQoJCQkJCQlpZiAoKCFoYyAmJiBydS5ub0VtcHR5KSB8fCAoaXNJRSAmJiAhbm4pKSB7DQoJCQkJCQkJaXYgPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBDaGVjayByZXF1aXJlZA0KCQkJCQkJaWYgKHJ1LnJlcXVpcmVkQXR0cmlicykgew0KCQkJCQkJCWEgPSBydS5yZXF1aXJlZEF0dHJpYnM7DQoNCgkJCQkJCQlmb3IgKGkgPSBhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQkJCWlmICh0aGlzLmRvbS5nZXRBdHRyaWIobiwgYVtpXSkgIT09ICcnKQ0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gTm9uZSBvZiB0aGUgcmVxdWlyZWQgd2FzIHRoZXJlDQoJCQkJCQkJaWYgKGkgPT0gLTEpIHsNCgkJCQkJCQkJaXYgPSB0cnVlOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCXcud3JpdGVTdGFydEVsZW1lbnQobm4pOw0KDQoJCQkJCQkvLyBBZGQgb3JkZXJlZCBhdHRyaWJ1dGVzDQoJCQkJCQlpZiAocnUuYXR0cmlicykgew0KCQkJCQkJCWZvciAoaT0wLCBhdCA9IHJ1LmF0dHJpYnMsIGwgPSBhdC5sZW5ndGg7IGk8bDsgaSsrKSB7DQoJCQkJCQkJCWEgPSBhdFtpXTsNCgkJCQkJCQkJdiA9IHQuX2dldEF0dHJpYihuLCBhKTsNCg0KCQkJCQkJCQlpZiAodiAhPT0gbnVsbCkNCgkJCQkJCQkJCXcud3JpdGVBdHRyaWJ1dGUoYS5uYW1lLCB2KTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEFkZCB3aWxkIGF0dHJpYnV0ZXMNCgkJCQkJCWlmIChydS52YWxpZEF0dHJpYnNSRSkgew0KCQkJCQkJCWF0ID0gdC5kb20uZ2V0QXR0cmlicyhuKTsNCgkJCQkJCQlmb3IgKGk9YXQubGVuZ3RoLTE7IGk+LTE7IGktLSkgew0KCQkJCQkJCQlubyA9IGF0W2ldOw0KDQoJCQkJCQkJCWlmIChuby5zcGVjaWZpZWQpIHsNCgkJCQkJCQkJCWEgPSBuby5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KDQoJCQkJCQkJCQlpZiAocy5pbnZhbGlkX2F0dHJzLnRlc3QoYSkgfHwgIXJ1LnZhbGlkQXR0cmlic1JFLnRlc3QoYSkpDQoJCQkJCQkJCQkJY29udGludWU7DQoNCgkJCQkJCQkJCWFyID0gdC5maW5kQXR0cmliUnVsZShydSwgYSk7DQoJCQkJCQkJCQl2ID0gdC5fZ2V0QXR0cmliKG4sIGFyLCBhKTsNCg0KCQkJCQkJCQkJaWYgKHYgIT09IG51bGwpDQoJCQkJCQkJCQkJdy53cml0ZUF0dHJpYnV0ZShhLCB2KTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJLy8gS2VlcCB0eXBlIGF0dHJpYnV0ZQ0KCQkJCQkJaWYgKHR5cGUgJiYga2VlcCkNCgkJCQkJCQl3LndyaXRlQXR0cmlidXRlKCdfbWNlX3R5cGUnLCB0eXBlKTsNCg0KCQkJCQkJLy8gV3JpdGUgdGV4dCBmcm9tIHNjcmlwdA0KCQkJCQkJaWYgKG5uID09PSAnc2NyaXB0JyAmJiB0aW55bWNlLnRyaW0obi5pbm5lckhUTUwpKSB7DQoJCQkJCQkJdy53cml0ZVRleHQoJy8vICcpOyAvLyBQYWRkIGl0IHdpdGggYSBjb21tZW50IHNvIGl0IHdpbGwgcGFyc2Ugb24gb2xkZXIgYnJvd3NlcnMNCgkJCQkJCQl3LndyaXRlQ0RBVEEobi5pbm5lckhUTUwucmVwbGFjZSgvPCEtLXwtLT58PFxbQ0RBVEFcW3xcXVxdPi9nLCAnJykpOyAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGNkYXRhIHN0dWN0dXJlcw0KCQkJCQkJCWhjID0gZmFsc2U7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIFBhZGQgZW1wdHkgbm9kZXMgd2l0aCBhICZuYnNwOw0KCQkJCQkJaWYgKHJ1LnBhZGQpIHsNCgkJCQkJCQkvLyBJZiBpdCBoYXMgb25seSBvbmUgYm9ndXMgY2hpbGQsIHBhZGQgaXQgYW55d2F5IHdvcmthcm91bmQgZm9yIDx0ZD48YnIgLz48L3RkPiBidWcNCgkJCQkJCQlpZiAoaGMgJiYgKGNuID0gbi5maXJzdENoaWxkKSAmJiBjbi5ub2RlVHlwZSA9PT0gMSAmJiBuLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7DQoJCQkJCQkJCWlmIChjbi5oYXNBdHRyaWJ1dGUgPyBjbi5oYXNBdHRyaWJ1dGUoJ19tY2VfYm9ndXMnKSA6IGNuLmdldEF0dHJpYnV0ZSgnX21jZV9ib2d1cycpKQ0KCQkJCQkJCQkJdy53cml0ZVRleHQoJ1x1MDBhMCcpOw0KCQkJCQkJCX0gZWxzZSBpZiAoIWhjKQ0KCQkJCQkJCQl3LndyaXRlVGV4dCgnXHUwMGEwJyk7IC8vIE5vIGNoaWxkcmVuIHRoZW4gcGFkZCBpdA0KCQkJCQkJfQ0KDQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlIDM6IC8vIFRleHQNCgkJCQkJCS8vIENoZWNrIGlmIHZhbGlkIGNoaWxkDQoJCQkJCQlpZiAocy52YWxpZGF0ZV9jaGlsZHJlbiAmJiB0LmVsZW1lbnROYW1lICYmICF0LnNjaGVtYS5pc1ZhbGlkKHQuZWxlbWVudE5hbWUsICcjdGV4dCcpKQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJcmV0dXJuIHcud3JpdGVUZXh0KG4ubm9kZVZhbHVlKTsNCg0KCQkJCQljYXNlIDQ6IC8vIENEQVRBDQoJCQkJCQlyZXR1cm4gdy53cml0ZUNEQVRBKG4ubm9kZVZhbHVlKTsNCg0KCQkJCQljYXNlIDg6IC8vIENvbW1lbnQNCgkJCQkJCXJldHVybiB3LndyaXRlQ29tbWVudChuLm5vZGVWYWx1ZSk7DQoJCQkJfQ0KCQkJfSBlbHNlIGlmIChuLm5vZGVUeXBlID09IDEpDQoJCQkJaGMgPSBuLmhhc0NoaWxkTm9kZXMoKTsNCg0KCQkJaWYgKGhjICYmICFjbG9zZWQpIHsNCgkJCQljbiA9IG4uZmlyc3RDaGlsZDsNCg0KCQkJCXdoaWxlIChjbikgew0KCQkJCQl0Ll9zZXJpYWxpemVOb2RlKGNuKTsNCgkJCQkJdC5lbGVtZW50TmFtZSA9IG5uOw0KCQkJCQljbiA9IGNuLm5leHRTaWJsaW5nOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gV3JpdGUgZWxlbWVudCBlbmQNCgkJCWlmICghaXYpIHsNCgkJCQlpZiAoIWNsb3NlZCkNCgkJCQkJdy53cml0ZUZ1bGxFbmRFbGVtZW50KCk7DQoJCQkJZWxzZQ0KCQkJCQl3LndyaXRlRW5kRWxlbWVudCgpOw0KCQkJfQ0KCQl9LA0KDQoJCV9wcm90ZWN0IDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlvLml0ZW1zID0gby5pdGVtcyB8fCBbXTsNCg0KCQkJZnVuY3Rpb24gZW5jKHMpIHsNCgkJCQlyZXR1cm4gcy5yZXBsYWNlKC9bXHJcblxcXS9nLCBmdW5jdGlvbihjKSB7DQoJCQkJCWlmIChjID09PSAnXG4nKQ0KCQkJCQkJcmV0dXJuICdcXG4nOw0KCQkJCQllbHNlIGlmIChjID09PSAnXFwnKQ0KCQkJCQkJcmV0dXJuICdcXFxcJzsNCg0KCQkJCQlyZXR1cm4gJ1xccic7DQoJCQkJfSk7DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBkZWMocykgew0KCQkJCXJldHVybiBzLnJlcGxhY2UoL1xcW1xccm5dL2csIGZ1bmN0aW9uKGMpIHsNCgkJCQkJaWYgKGMgPT09ICdcXG4nKQ0KCQkJCQkJcmV0dXJuICdcbic7DQoJCQkJCWVsc2UgaWYgKGMgPT09ICdcXFxcJykNCgkJCQkJCXJldHVybiAnXFwnOw0KDQoJCQkJCXJldHVybiAnXHInOw0KCQkJCX0pOw0KCQkJfTsNCg0KCQkJZWFjaChvLnBhdHRlcm5zLCBmdW5jdGlvbihwKSB7DQoJCQkJby5jb250ZW50ID0gZGVjKGVuYyhvLmNvbnRlbnQpLnJlcGxhY2UocC5wYXR0ZXJuLCBmdW5jdGlvbih4LCBhLCBiLCBjKSB7DQoJCQkJCWIgPSBkZWMoYik7DQoNCgkJCQkJaWYgKHAuZW5jb2RlKQ0KCQkJCQkJYiA9IHQuX2VuY29kZShiKTsNCg0KCQkJCQlvLml0ZW1zLnB1c2goYik7DQoJCQkJCXJldHVybiBhICsgJzwhLS1tY2U6JyArIChvLml0ZW1zLmxlbmd0aCAtIDEpICsgJy0tPicgKyBjOw0KCQkJCX0pKTsNCgkJCX0pOw0KDQoJCQlyZXR1cm4gbzsNCgkJfSwNCg0KCQlfdW5wcm90ZWN0IDogZnVuY3Rpb24oaCwgbykgew0KCQkJaCA9IGgucmVwbGFjZSgvXDwhLS1tY2U6KFswLTldKyktLVw+L2csIGZ1bmN0aW9uKGEsIGIpIHsNCgkJCQlyZXR1cm4gby5pdGVtc1twYXJzZUludChiKV07DQoJCQl9KTsNCg0KCQkJby5pdGVtcyA9IFtdOw0KDQoJCQlyZXR1cm4gaDsNCgkJfSwNCg0KCQlfZW5jb2RlIDogZnVuY3Rpb24oaCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgbDsNCg0KCQkJLy8gRW50aXR5IGVuY29kZQ0KCQkJaWYgKHMuZW50aXR5X2VuY29kaW5nICE9PSAncmF3Jykgew0KCQkJCWlmIChzLmVudGl0eV9lbmNvZGluZy5pbmRleE9mKCduYW1lZCcpICE9IC0xKSB7DQoJCQkJCXQuc2V0RW50aXRpZXMocy5lbnRpdGllcyk7DQoJCQkJCWwgPSB0LmVudGl0eUxvb2t1cDsNCg0KCQkJCQloID0gaC5yZXBsYWNlKC9bXHUwMDdFLVx1RkZGRl0vZywgZnVuY3Rpb24oYSkgew0KCQkJCQkJdmFyIHY7DQoNCgkJCQkJCWlmICh2ID0gbFthXSkNCgkJCQkJCQlhID0gJyYnICsgdiArICc7JzsNCg0KCQkJCQkJcmV0dXJuIGE7DQoJCQkJCX0pOw0KCQkJCX0NCg0KCQkJCWlmIChzLmVudGl0eV9lbmNvZGluZy5pbmRleE9mKCdudW1lcmljJykgIT0gLTEpIHsNCgkJCQkJaCA9IGgucmVwbGFjZSgvW1x1MDA3RS1cdUZGRkZdL2csIGZ1bmN0aW9uKGEpIHsNCgkJCQkJCXJldHVybiAnJiMnICsgYS5jaGFyQ29kZUF0KDApICsgJzsnOw0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiBoOw0KCQl9LA0KDQoJCV9zZXR1cCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdGhpcy5zZXR0aW5nczsNCg0KCQkJaWYgKHQuZG9uZSkNCgkJCQlyZXR1cm47DQoNCgkJCXQuZG9uZSA9IDE7DQoNCgkJCXQuc2V0UnVsZXMocy52YWxpZF9lbGVtZW50cyk7DQoJCQl0LmFkZFJ1bGVzKHMuZXh0ZW5kZWRfdmFsaWRfZWxlbWVudHMpOw0KDQoJCQlpZiAocy5pbnZhbGlkX2VsZW1lbnRzKQ0KCQkJCXQuaW52YWxpZEVsZW1lbnRzUkUgPSBuZXcgUmVnRXhwKCdeKCcgKyB3aWxkY2FyZFRvUkUocy5pbnZhbGlkX2VsZW1lbnRzLnJlcGxhY2UoLywvZywgJ3wnKS50b0xvd2VyQ2FzZSgpKSArICcpJCcpOw0KDQoJCQlpZiAocy5hdHRyaWJfdmFsdWVfZmlsdGVyKQ0KCQkJCXQuYXR0cmliVmFsdWVGaWx0ZXIgPSBzLmF0dHJpYlZhbHVlRmlsdGVyOw0KCQl9LA0KDQoJCV9nZXRBdHRyaWIgOiBmdW5jdGlvbihuLCBhLCBuYSkgew0KCQkJdmFyIGksIHY7DQoNCgkJCW5hID0gbmEgfHwgYS5uYW1lOw0KDQoJCQlpZiAoYS5mb3JjZWRWYWwgJiYgKHYgPSBhLmZvcmNlZFZhbCkpIHsNCgkJCQlpZiAodiA9PT0gJ3skdWlkfScpDQoJCQkJCXJldHVybiB0aGlzLmRvbS51bmlxdWVJZCgpOw0KDQoJCQkJcmV0dXJuIHY7DQoJCQl9DQoNCgkJCXYgPSB0aGlzLmRvbS5nZXRBdHRyaWIobiwgbmEpOw0KDQoJCQlzd2l0Y2ggKG5hKSB7DQoJCQkJY2FzZSAncm93c3Bhbic6DQoJCQkJY2FzZSAnY29sc3Bhbic6DQoJCQkJCS8vIFdoYXRzIHRoZSBwb2ludD8gUmVtb3ZlIHVzbGVzcyBhdHRyaWJ1dGUgdmFsdWUNCgkJCQkJaWYgKHYgPT0gJzEnKQ0KCQkJCQkJdiA9ICcnOw0KDQoJCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQlpZiAodGhpcy5hdHRyaWJWYWx1ZUZpbHRlcikNCgkJCQl2ID0gdGhpcy5hdHRyaWJWYWx1ZUZpbHRlcihuYSwgdiwgbik7DQoNCgkJCWlmIChhLnZhbGlkVmFscykgew0KCQkJCWZvciAoaSA9IGEudmFsaWRWYWxzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCWlmICh2ID09IGEudmFsaWRWYWxzW2ldKQ0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJaWYgKGkgPT0gLTEpDQoJCQkJCXJldHVybiBudWxsOw0KCQkJfQ0KDQoJCQlpZiAodiA9PT0gJycgJiYgdHlwZW9mKGEuZGVmYXVsdFZhbCkgIT0gJ3VuZGVmaW5lZCcpIHsNCgkJCQl2ID0gYS5kZWZhdWx0VmFsOw0KDQoJCQkJaWYgKHYgPT09ICd7JHVpZH0nKQ0KCQkJCQlyZXR1cm4gdGhpcy5kb20udW5pcXVlSWQoKTsNCg0KCQkJCXJldHVybiB2Ow0KCQkJfSBlbHNlIHsNCgkJCQkvLyBSZW1vdmUgaW50ZXJuYWwgbWNlSXRlbVhYIGNsYXNzZXMgd2hlbiBjb250ZW50IGlzIGV4dHJhY3RlZCBmcm9tIGVkaXRvcg0KCQkJCWlmIChuYSA9PSAnY2xhc3MnICYmIHRoaXMucHJvY2Vzc09iai5nZXQpDQoJCQkJCXYgPSB2LnJlcGxhY2UoL1xzP21jZUl0ZW1cdytccz8vZywgJycpOw0KCQkJfQ0KDQoJCQlpZiAodiA9PT0gJycpDQoJCQkJcmV0dXJuIG51bGw7DQoNCg0KCQkJcmV0dXJuIHY7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/Sizzle.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gI2lmbmRlZiBqcXVlcnkKCi8qCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIC0gdjEuMAogKiAgQ29weXJpZ2h0IDIwMDksIFRoZSBEb2pvIEZvdW5kYXRpb24KICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9zaXp6bGVqcy5jb20vCiAqLwooZnVuY3Rpb24oKXsKCnZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywKCWRvbmUgPSAwLAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzRHVwbGljYXRlID0gZmFsc2UsCgliYXNlSGFzRHVwbGljYXRlID0gdHJ1ZTsKCi8vIEhlcmUgd2UgY2hlY2sgaWYgdGhlIEphdmFTY3JpcHQgZW5naW5lIGlzIHVzaW5nIHNvbWUgc29ydCBvZgovLyBvcHRpbWl6YXRpb24gd2hlcmUgaXQgZG9lcyBub3QgYWx3YXlzIGNhbGwgb3VyIGNvbXBhcmlzaW9uCi8vIGZ1bmN0aW9uLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBkaXNjYXJkIHRoZSBoYXNEdXBsaWNhdGUgdmFsdWUuCi8vICAgVGh1cyBmYXIgdGhhdCBpbmNsdWRlcyBHb29nbGUgQ2hyb21lLgpbMCwgMF0uc29ydChmdW5jdGlvbigpewoJYmFzZUhhc0R1cGxpY2F0ZSA9IGZhbHNlOwoJcmV0dXJuIDA7Cn0pOwoKdmFyIFNpenpsZSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkKSB7CglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCXZhciBvcmlnQ29udGV4dCA9IGNvbnRleHQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7CgkJcmV0dXJuIFtdOwoJfQoJCglpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCXJldHVybiByZXN1bHRzOwoJfQoKCXZhciBwYXJ0cyA9IFtdLCBtLCBzZXQsIGNoZWNrU2V0LCBleHRyYSwgcHJ1bmUgPSB0cnVlLCBjb250ZXh0WE1MID0gU2l6emxlLmlzWE1MKGNvbnRleHQpLAoJCXNvRmFyID0gc2VsZWN0b3IsIHJldCwgY3VyLCBwb3AsIGk7CgkKCS8vIFJlc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2h1bmtlciByZWdleHAgKHN0YXJ0IGZyb20gaGVhZCkKCWRvIHsKCQljaHVua2VyLmV4ZWMoIiIpOwoJCW0gPSBjaHVua2VyLmV4ZWMoc29GYXIpOwoKCQlpZiAoIG0gKSB7CgkJCXNvRmFyID0gbVszXTsKCQkKCQkJcGFydHMucHVzaCggbVsxXSApOwoJCQoJCQlpZiAoIG1bMl0gKSB7CgkJCQlleHRyYSA9IG1bM107CgkJCQlicmVhazsKCQkJfQoJCX0KCX0gd2hpbGUgKCBtICk7CgoJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsKCQlpZiAoIHBhcnRzLmxlbmd0aCA9PT0gMiAmJiBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdICkgewoJCQlzZXQgPSBwb3NQcm9jZXNzKCBwYXJ0c1swXSArIHBhcnRzWzFdLCBjb250ZXh0ICk7CgkJfSBlbHNlIHsKCQkJc2V0ID0gRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSA/CgkJCQlbIGNvbnRleHQgXSA6CgkJCQlTaXp6bGUoIHBhcnRzLnNoaWZ0KCksIGNvbnRleHQgKTsKCgkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgewoJCQkJc2VsZWN0b3IgPSBwYXJ0cy5zaGlmdCgpOwoKCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgc2VsZWN0b3IgXSApIHsKCQkJCQlzZWxlY3RvciArPSBwYXJ0cy5zaGlmdCgpOwoJCQkJfQoJCQkJCgkJCQlzZXQgPSBwb3NQcm9jZXNzKCBzZWxlY3Rvciwgc2V0ICk7CgkJCX0KCQl9Cgl9IGVsc2UgewoJCS8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElECgkJLy8gKGJ1dCBub3QgaWYgaXQnbGwgYmUgZmFzdGVyIGlmIHRoZSBpbm5lciBzZWxlY3RvciBpcyBhbiBJRCkKCQlpZiAoICFzZWVkICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAhY29udGV4dFhNTCAmJgoJCQkJRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzWzBdKSAmJiAhRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSApIHsKCQkJcmV0ID0gU2l6emxlLmZpbmQoIHBhcnRzLnNoaWZ0KCksIGNvbnRleHQsIGNvbnRleHRYTUwgKTsKCQkJY29udGV4dCA9IHJldC5leHByID8gU2l6emxlLmZpbHRlciggcmV0LmV4cHIsIHJldC5zZXQgKVswXSA6IHJldC5zZXRbMF07CgkJfQoKCQlpZiAoIGNvbnRleHQgKSB7CgkJCXJldCA9IHNlZWQgPwoJCQkJeyBleHByOiBwYXJ0cy5wb3AoKSwgc2V0OiBtYWtlQXJyYXkoc2VlZCkgfSA6CgkJCQlTaXp6bGUuZmluZCggcGFydHMucG9wKCksIHBhcnRzLmxlbmd0aCA9PT0gMSAmJiAocGFydHNbMF0gPT09ICJ+IiB8fCBwYXJ0c1swXSA9PT0gIisiKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgPyBjb250ZXh0LnBhcmVudE5vZGUgOiBjb250ZXh0LCBjb250ZXh0WE1MICk7CgkJCXNldCA9IHJldC5leHByID8gU2l6emxlLmZpbHRlciggcmV0LmV4cHIsIHJldC5zZXQgKSA6IHJldC5zZXQ7CgoJCQlpZiAoIHBhcnRzLmxlbmd0aCA+IDAgKSB7CgkJCQljaGVja1NldCA9IG1ha2VBcnJheShzZXQpOwoJCQl9IGVsc2UgewoJCQkJcHJ1bmUgPSBmYWxzZTsKCQkJfQoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQljdXIgPSBwYXJ0cy5wb3AoKTsKCQkJCXBvcCA9IGN1cjsKCgkJCQlpZiAoICFFeHByLnJlbGF0aXZlWyBjdXIgXSApIHsKCQkJCQljdXIgPSAiIjsKCQkJCX0gZWxzZSB7CgkJCQkJcG9wID0gcGFydHMucG9wKCk7CgkJCQl9CgoJCQkJaWYgKCBwb3AgPT0gbnVsbCApIHsKCQkJCQlwb3AgPSBjb250ZXh0OwoJCQkJfQoKCQkJCUV4cHIucmVsYXRpdmVbIGN1ciBdKCBjaGVja1NldCwgcG9wLCBjb250ZXh0WE1MICk7CgkJCX0KCQl9IGVsc2UgewoJCQljaGVja1NldCA9IHBhcnRzID0gW107CgkJfQoJfQoKCWlmICggIWNoZWNrU2V0ICkgewoJCWNoZWNrU2V0ID0gc2V0OwoJfQoKCWlmICggIWNoZWNrU2V0ICkgewoJCVNpenpsZS5lcnJvciggY3VyIHx8IHNlbGVjdG9yICk7Cgl9CgoJaWYgKCB0b1N0cmluZy5jYWxsKGNoZWNrU2V0KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKCQlpZiAoICFwcnVuZSApIHsKCQkJcmVzdWx0cy5wdXNoLmFwcGx5KCByZXN1bHRzLCBjaGVja1NldCApOwoJCX0gZWxzZSBpZiAoIGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gMSApIHsKCQkJZm9yICggaSA9IDA7IGNoZWNrU2V0W2ldICE9IG51bGw7IGkrKyApIHsKCQkJCWlmICggY2hlY2tTZXRbaV0gJiYgKGNoZWNrU2V0W2ldID09PSB0cnVlIHx8IGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICYmIFNpenpsZS5jb250YWlucyhjb250ZXh0LCBjaGVja1NldFtpXSkpICkgewoJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiBjaGVja1NldFtpXS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfQoJfSBlbHNlIHsKCQltYWtlQXJyYXkoIGNoZWNrU2V0LCByZXN1bHRzICk7Cgl9CgoJaWYgKCBleHRyYSApIHsKCQlTaXp6bGUoIGV4dHJhLCBvcmlnQ29udGV4dCwgcmVzdWx0cywgc2VlZCApOwoJCVNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7Cgl9CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgpTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKHJlc3VsdHMpewoJaWYgKCBzb3J0T3JkZXIgKSB7CgkJaGFzRHVwbGljYXRlID0gYmFzZUhhc0R1cGxpY2F0ZTsKCQlyZXN1bHRzLnNvcnQoc29ydE9yZGVyKTsKCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbaS0xXSApIHsKCQkJCQlyZXN1bHRzLnNwbGljZShpLS0sIDEpOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbihleHByLCBzZXQpewoJcmV0dXJuIFNpenpsZShleHByLCBudWxsLCBudWxsLCBzZXQpOwp9OwoKU2l6emxlLmZpbmQgPSBmdW5jdGlvbihleHByLCBjb250ZXh0LCBpc1hNTCl7Cgl2YXIgc2V0OwoKCWlmICggIWV4cHIgKSB7CgkJcmV0dXJuIFtdOwoJfQoKCWZvciAoIHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciB0eXBlID0gRXhwci5vcmRlcltpXSwgbWF0Y2g7CgkJCgkJaWYgKCAobWF0Y2ggPSBFeHByLmxlZnRNYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgKSB7CgkJCXZhciBsZWZ0ID0gbWF0Y2hbMV07CgkJCW1hdGNoLnNwbGljZSgxLDEpOwoKCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7CgkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSgvXFwvZywgIiIpOwoJCQkJc2V0ID0gRXhwci5maW5kWyB0eXBlIF0oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApOwoJCQkJaWYgKCBzZXQgIT0gbnVsbCApIHsKCQkJCQlleHByID0gZXhwci5yZXBsYWNlKCBFeHByLm1hdGNoWyB0eXBlIF0sICIiICk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJaWYgKCAhc2V0ICkgewoJCXNldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKCX0KCglyZXR1cm4ge3NldDogc2V0LCBleHByOiBleHByfTsKfTsKClNpenpsZS5maWx0ZXIgPSBmdW5jdGlvbihleHByLCBzZXQsIGlucGxhY2UsIG5vdCl7Cgl2YXIgb2xkID0gZXhwciwgcmVzdWx0ID0gW10sIGN1ckxvb3AgPSBzZXQsIG1hdGNoLCBhbnlGb3VuZCwKCQlpc1hNTEZpbHRlciA9IHNldCAmJiBzZXRbMF0gJiYgU2l6emxlLmlzWE1MKHNldFswXSk7CgoJd2hpbGUgKCBleHByICYmIHNldC5sZW5ndGggKSB7CgkJZm9yICggdmFyIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7CgkJCWlmICggKG1hdGNoID0gRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICE9IG51bGwgJiYgbWF0Y2hbMl0gKSB7CgkJCQl2YXIgZmlsdGVyID0gRXhwci5maWx0ZXJbIHR5cGUgXSwgZm91bmQsIGl0ZW0sIGxlZnQgPSBtYXRjaFsxXTsKCQkJCWFueUZvdW5kID0gZmFsc2U7CgoJCQkJbWF0Y2guc3BsaWNlKDEsMSk7CgoJCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgPT09ICJcXCIgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJaWYgKCBjdXJMb29wID09PSByZXN1bHQgKSB7CgkJCQkJcmVzdWx0ID0gW107CgkJCQl9CgoJCQkJaWYgKCBFeHByLnByZUZpbHRlclsgdHlwZSBdICkgewoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOwoKCQkJCQlpZiAoICFtYXRjaCApIHsKCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CgkJCQkJfSBlbHNlIGlmICggbWF0Y2ggPT09IHRydWUgKSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoIG1hdGNoICkgewoJCQkJCWZvciAoIHZhciBpID0gMDsgKGl0ZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCQkJCWlmICggaXRlbSApIHsKCQkJCQkJCWZvdW5kID0gZmlsdGVyKCBpdGVtLCBtYXRjaCwgaSwgY3VyTG9vcCApOwoJCQkJCQkJdmFyIHBhc3MgPSBub3QgXiAhIWZvdW5kOwoKCQkJCQkJCWlmICggaW5wbGFjZSAmJiBmb3VuZCAhPSBudWxsICkgewoJCQkJCQkJCWlmICggcGFzcyApIHsKCQkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgewoJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CgkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZm91bmQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQljdXJMb29wID0gcmVzdWx0OwoJCQkJCX0KCgkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOwoKCQkJCQlpZiAoICFhbnlGb3VuZCApIHsKCQkJCQkJcmV0dXJuIFtdOwoJCQkJCX0KCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KCQlpZiAoIGV4cHIgPT09IG9sZCApIHsKCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgewoJCQkJU2l6emxlLmVycm9yKCBleHByICk7CgkJCX0gZWxzZSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJb2xkID0gZXhwcjsKCX0KCglyZXR1cm4gY3VyTG9vcDsKfTsKClNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7Cgl0aHJvdyAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIG1zZzsKfTsKCnZhciBFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCW9yZGVyOiBbICJJRCIsICJOQU1FIiwgIlRBRyIgXSwKCW1hdGNoOiB7CgkJSUQ6IC8jKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLywKCQlDTEFTUzogL1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLywKCQlOQU1FOiAvXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sCgkJQVRUUjogL1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKFsnIl0qKSguKj8pXDN8KVxzKlxdLywKCQlUQUc6IC9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLAoJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoKGV2ZW58b2RkfFtcZG4rXC1dKilcKSk/LywKCQlQT1M6IC86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLAoJCVBTRVVETzogLzooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy8KCX0sCglsZWZ0TWF0Y2g6IHt9LAoJYXR0ck1hcDogewoJCSJjbGFzcyI6ICJjbGFzc05hbWUiLAoJCSJmb3IiOiAiaHRtbEZvciIKCX0sCglhdHRySGFuZGxlOiB7CgkJaHJlZjogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwoJCX0KCX0sCglyZWxhdGl2ZTogewoJCSIrIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQpewoJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciLAoJCQkJaXNUYWcgPSBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSwKCQkJCWlzUGFydFN0ck5vdFRhZyA9IGlzUGFydFN0ciAmJiAhaXNUYWc7CgoJCQlpZiAoIGlzVGFnICkgewoJCQkJcGFydCA9IHBhcnQudG9Mb3dlckNhc2UoKTsKCQkJfQoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoLCBlbGVtOyBpIDwgbDsgaSsrICkgewoJCQkJaWYgKCAoZWxlbSA9IGNoZWNrU2V0W2ldKSApIHsKCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbS5wcmV2aW91c1NpYmxpbmcpICYmIGVsZW0ubm9kZVR5cGUgIT09IDEgKSB7fQoKCQkJCQljaGVja1NldFtpXSA9IGlzUGFydFN0ck5vdFRhZyB8fCBlbGVtICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFydCA/CgkJCQkJCWVsZW0gfHwgZmFsc2UgOgoJCQkJCQllbGVtID09PSBwYXJ0OwoJCQkJfQoJCQl9CgoJCQlpZiAoIGlzUGFydFN0ck5vdFRhZyApIHsKCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCX0KCQl9LAoJCSI+IjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQpewoJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciLAoJCQkJZWxlbSwgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7CgoJCQlpZiAoIGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KHBhcnQpICkgewoJCQkJcGFydCA9IHBhcnQudG9Mb3dlckNhc2UoKTsKCgkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJZWxlbSA9IGNoZWNrU2V0W2ldOwoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFydCA/IHBhcmVudCA6IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCQllbGVtID0gY2hlY2tTZXRbaV07CgkJCQkJaWYgKCBlbGVtICkgewoJCQkJCQljaGVja1NldFtpXSA9IGlzUGFydFN0ciA/CgkJCQkJCQllbGVtLnBhcmVudE5vZGUgOgoJCQkJCQkJZWxlbS5wYXJlbnROb2RlID09PSBwYXJ0OwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoIGlzUGFydFN0ciApIHsKCQkJCQlTaXp6bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwgdHJ1ZSApOwoJCQkJfQoJCQl9CgkJfSwKCQkiIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIGRvbmVOYW1lID0gZG9uZSsrLCBjaGVja0ZuID0gZGlyQ2hlY2ssIG5vZGVDaGVjazsKCgkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICEvXFcvLnRlc3QocGFydCkgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoJCQkJbm9kZUNoZWNrID0gcGFydDsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oInBhcmVudE5vZGUiLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwpOwoJCX0sCgkJIn4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgZG9uZU5hbWUgPSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVjaywgbm9kZUNoZWNrOwoKCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIS9cVy8udGVzdChwYXJ0KSApIHsKCQkJCXBhcnQgPSBwYXJ0LnRvTG93ZXJDYXNlKCk7CgkJCQlub2RlQ2hlY2sgPSBwYXJ0OwoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKCQkJfQoKCQkJY2hlY2tGbigicHJldmlvdXNTaWJsaW5nIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MKTsKCQl9Cgl9LAoJZmluZDogewoJCUlEOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOwoJCQkJcmV0dXJuIG0gPyBbbV0gOiBbXTsKCQkJfQoJCX0sCgkJTkFNRTogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQpewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lICE9PSAidW5kZWZpbmVkIiApIHsKCQkJCXZhciByZXQgPSBbXSwgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUobWF0Y2hbMV0pOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHJlc3VsdHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggcmVzdWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PT0gbWF0Y2hbMV0gKSB7CgkJCQkJCXJldC5wdXNoKCByZXN1bHRzW2ldICk7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiByZXQubGVuZ3RoID09PSAwID8gbnVsbCA6IHJldDsKCQkJfQoJCX0sCgkJVEFHOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFdKTsKCQl9Cgl9LAoJcHJlRmlsdGVyOiB7CgkJQ0xBU1M6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUwpewoJCQltYXRjaCA9ICIgIiArIG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKSArICIgIjsKCgkJCWlmICggaXNYTUwgKSB7CgkJCQlyZXR1cm4gbWF0Y2g7CgkJCX0KCgkJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJaWYgKCBub3QgXiAoZWxlbS5jbGFzc05hbWUgJiYgKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5yZXBsYWNlKC9bXHRcbl0vZywgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKCQkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgaWYgKCBpbnBsYWNlICkgewoJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlyZXR1cm4gZmFsc2U7CgkJfSwKCQlJRDogZnVuY3Rpb24obWF0Y2gpewoJCQlyZXR1cm4gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOwoJCX0sCgkJVEFHOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCl7CgkJCXJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoJCX0sCgkJQ0hJTEQ6IGZ1bmN0aW9uKG1hdGNoKXsKCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm50aCIgKSB7CgkJCQkvLyBwYXJzZSBlcXVhdGlvbnMgbGlrZSAnZXZlbicsICdvZGQnLCAnNScsICcybicsICczbisyJywgJzRuLTEnLCAnLW4rNicKCQkJCXZhciB0ZXN0ID0gLygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYygKCQkJCQltYXRjaFsyXSA9PT0gImV2ZW4iICYmICIybiIgfHwgbWF0Y2hbMl0gPT09ICJvZGQiICYmICIybisxIiB8fAoJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CgoJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOwoJCQkJbWF0Y2hbM10gPSB0ZXN0WzNdIC0gMDsKCQkJfQoKCQkJLy8gVE9ETzogTW92ZSB0byBub3JtYWwgY2FjaGluZyBzeXN0ZW0KCQkJbWF0Y2hbMF0gPSBkb25lKys7CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCQlBVFRSOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7CgkJCQoJCQlpZiAoICFpc1hNTCAmJiBFeHByLmF0dHJNYXBbbmFtZV0gKSB7CgkJCQltYXRjaFsxXSA9IEV4cHIuYXR0ck1hcFtuYW1lXTsKCQkJfQoKCQkJaWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKCQkJCW1hdGNoWzRdID0gIiAiICsgbWF0Y2hbNF0gKyAiICI7CgkJCX0KCgkJCXJldHVybiBtYXRjaDsKCQl9LAoJCVBTRVVETzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90KXsKCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CgkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQoJCQkJaWYgKCAoIGNodW5rZXIuZXhlYyhtYXRjaFszXSkgfHwgIiIgKS5sZW5ndGggPiAxIHx8IC9eXHcvLnRlc3QobWF0Y2hbM10pICkgewoJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKCQkJCX0gZWxzZSB7CgkJCQkJdmFyIHJldCA9IFNpenpsZS5maWx0ZXIobWF0Y2hbM10sIGN1ckxvb3AsIGlucGxhY2UsIHRydWUgXiBub3QpOwoJCQkJCWlmICggIWlucGxhY2UgKSB7CgkJCQkJCXJlc3VsdC5wdXNoLmFwcGx5KCByZXN1bHQsIHJldCApOwoJCQkJCX0KCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0gZWxzZSBpZiAoIEV4cHIubWF0Y2guUE9TLnRlc3QoIG1hdGNoWzBdICkgfHwgRXhwci5tYXRjaC5DSElMRC50ZXN0KCBtYXRjaFswXSApICkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJCgkJCXJldHVybiBtYXRjaDsKCQl9LAoJCVBPUzogZnVuY3Rpb24obWF0Y2gpewoJCQltYXRjaC51bnNoaWZ0KCB0cnVlICk7CgkJCXJldHVybiBtYXRjaDsKCQl9Cgl9LAoJZmlsdGVyczogewoJCWVuYWJsZWQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgJiYgZWxlbS50eXBlICE9PSAiaGlkZGVuIjsKCQl9LAoJCWRpc2FibGVkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CgkJfSwKCQljaGVja2VkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uY2hlY2tlZCA9PT0gdHJ1ZTsKCQl9LAoJCXNlbGVjdGVkOiBmdW5jdGlvbihlbGVtKXsKCQkJLy8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdAoJCQkvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5CgkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKCQl9LAoJCXBhcmVudDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAhIWVsZW0uZmlyc3RDaGlsZDsKCQl9LAoJCWVtcHR5OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCQloYXM6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuICEhU2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKCQl9LAoJCWhlYWRlcjogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAoL2hcZC9pKS50ZXN0KCBlbGVtLm5vZGVOYW1lICk7CgkJfSwKCQl0ZXh0OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJ0ZXh0IiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJcmFkaW86IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gInJhZGlvIiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJY2hlY2tib3g6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gImNoZWNrYm94IiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJZmlsZTogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAiZmlsZSIgPT09IGVsZW0udHlwZTsKCQl9LAoJCXBhc3N3b3JkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJwYXNzd29yZCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCXN1Ym1pdDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAic3VibWl0IiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJaW1hZ2U6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gImltYWdlIiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJcmVzZXQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gInJlc2V0IiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJYnV0dG9uOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJidXR0b24iID09PSBlbGVtLnR5cGUgfHwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiYnV0dG9uIjsKCQl9LAoJCWlucHV0OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICgvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pKS50ZXN0KGVsZW0ubm9kZU5hbWUpOwoJCX0KCX0sCglzZXRGaWx0ZXJzOiB7CgkJZmlyc3Q6IGZ1bmN0aW9uKGVsZW0sIGkpewoJCQlyZXR1cm4gaSA9PT0gMDsKCQl9LAoJCWxhc3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoLCBhcnJheSl7CgkJCXJldHVybiBpID09PSBhcnJheS5sZW5ndGggLSAxOwoJCX0sCgkJZXZlbjogZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBpICUgMiA9PT0gMDsKCQl9LAoJCW9kZDogZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBpICUgMiA9PT0gMTsKCQl9LAoJCWx0OiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CgkJCXJldHVybiBpIDwgbWF0Y2hbM10gLSAwOwoJCX0sCgkJZ3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CgkJfSwKCQludGg6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PT0gaTsKCQl9LAoJCWVxOiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CgkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7CgkJfQoJfSwKCWZpbHRlcjogewoJCVBTRVVETzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwgZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAiY29udGFpbnMiICkgewoJCQkJcmV0dXJuIChlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IFNpenpsZS5nZXRUZXh0KFsgZWxlbSBdKSB8fCAiIikuaW5kZXhPZihtYXRjaFszXSkgPj0gMDsKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gIm5vdCIgKSB7CgkJCQl2YXIgbm90ID0gbWF0Y2hbM107CgoJCQkJZm9yICggdmFyIGogPSAwLCBsID0gbm90Lmxlbmd0aDsgaiA8IGw7IGorKyApIHsKCQkJCQlpZiAoIG5vdFtqXSA9PT0gZWxlbSApIHsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCVNpenpsZS5lcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBuYW1lICk7CgkJCX0KCQl9LAoJCUNISUxEOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXZhciB0eXBlID0gbWF0Y2hbMV0sIG5vZGUgPSBlbGVtOwoJCQlzd2l0Y2ggKHR5cGUpIHsKCQkJCWNhc2UgJ29ubHknOgoJCQkJY2FzZSAnZmlyc3QnOgoJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykgKQkgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7IAoJCQkJCQkJcmV0dXJuIGZhbHNlOyAKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIHR5cGUgPT09ICJmaXJzdCIgKSB7IAoJCQkJCQlyZXR1cm4gdHJ1ZTsgCgkJCQkJfQoJCQkJCW5vZGUgPSBlbGVtOwoJCQkJY2FzZSAnbGFzdCc6CgkJCQkJd2hpbGUgKCAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpICkJIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgeyAKCQkJCQkJCXJldHVybiBmYWxzZTsgCgkJCQkJCX0KCQkJCQl9CgkJCQkJcmV0dXJuIHRydWU7CgkJCQljYXNlICdudGgnOgoJCQkJCXZhciBmaXJzdCA9IG1hdGNoWzJdLCBsYXN0ID0gbWF0Y2hbM107CgoJCQkJCWlmICggZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCApIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJCQoJCQkJCXZhciBkb25lTmFtZSA9IG1hdGNoWzBdLAoJCQkJCQlwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkKCQkJCQlpZiAoIHBhcmVudCAmJiAocGFyZW50LnNpemNhY2hlICE9PSBkb25lTmFtZSB8fCAhZWxlbS5ub2RlSW5kZXgpICkgewoJCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgewoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKCQkJCQkJCX0KCQkJCQkJfSAKCQkJCQkJcGFyZW50LnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJfQoJCQkJCQoJCQkJCXZhciBkaWZmID0gZWxlbS5ub2RlSW5kZXggLSBsYXN0OwoJCQkJCWlmICggZmlyc3QgPT09IDAgKSB7CgkJCQkJCXJldHVybiBkaWZmID09PSAwOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJfQoJCX0sCgkJSUQ6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IG1hdGNoOwoJCX0sCgkJVEFHOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXJldHVybiAobWF0Y2ggPT09ICIqIiAmJiBlbGVtLm5vZGVUeXBlID09PSAxKSB8fCBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG1hdGNoOwoJCX0sCgkJQ0xBU1M6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJcmV0dXJuICgiICIgKyAoZWxlbS5jbGFzc05hbWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpICsgIiAiKQoJCQkJLmluZGV4T2YoIG1hdGNoICkgPiAtMTsKCQl9LAoJCUFUVFI6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwKCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKCQkJCQllbGVtWyBuYW1lIF0gIT0gbnVsbCA/CgkJCQkJCWVsZW1bIG5hbWUgXSA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCgkJCQl2YWx1ZSA9IHJlc3VsdCArICIiLAoJCQkJdHlwZSA9IG1hdGNoWzJdLAoJCQkJY2hlY2sgPSBtYXRjaFs0XTsKCgkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/CgkJCQl0eXBlID09PSAiIT0iIDoKCQkJCXR5cGUgPT09ICI9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIio9IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCXR5cGUgPT09ICJ+PSIgPwoJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCSFjaGVjayA/CgkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKCQkJCXR5cGUgPT09ICIhPSIgPwoJCQkJdmFsdWUgIT09IGNoZWNrIDoKCQkJCXR5cGUgPT09ICJePSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPT09IDAgOgoJCQkJdHlwZSA9PT0gIiQ9IiA/CgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gInw9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CgkJCQlmYWxzZTsKCQl9LAoJCVBPUzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsyXSwgZmlsdGVyID0gRXhwci5zZXRGaWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoJCQl9CgkJfQoJfQp9OwoKdmFyIG9yaWdQT1MgPSBFeHByLm1hdGNoLlBPUywKCWZlc2NhcGUgPSBmdW5jdGlvbihhbGwsIG51bSl7CgkJcmV0dXJuICJcXCIgKyAobnVtIC0gMCArIDEpOwoJfTsKCmZvciAoIHZhciB0eXBlIGluIEV4cHIubWF0Y2ggKSB7CglFeHByLm1hdGNoWyB0eXBlIF0gPSBuZXcgUmVnRXhwKCBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlICsgKC8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSkgKTsKCUV4cHIubGVmdE1hdGNoWyB0eXBlIF0gPSBuZXcgUmVnRXhwKCAvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlICsgRXhwci5tYXRjaFsgdHlwZSBdLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2csIGZlc2NhcGUpICk7Cn0KCnZhciBtYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgewoJYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJyYXksIDAgKTsKCglpZiAoIHJlc3VsdHMgKSB7CgkJcmVzdWx0cy5wdXNoLmFwcGx5KCByZXN1bHRzLCBhcnJheSApOwoJCXJldHVybiByZXN1bHRzOwoJfQoJCglyZXR1cm4gYXJyYXk7Cn07CgovLyBQZXJmb3JtIGEgc2ltcGxlIGNoZWNrIHRvIGRldGVybWluZSBpZiB0aGUgYnJvd3NlciBpcyBjYXBhYmxlIG9mCi8vIGNvbnZlcnRpbmcgYSBOb2RlTGlzdCB0byBhbiBhcnJheSB1c2luZyBidWlsdGluIG1ldGhvZHMuCi8vIEFsc28gdmVyaWZpZXMgdGhhdCB0aGUgcmV0dXJuZWQgYXJyYXkgaG9sZHMgRE9NIG5vZGVzCi8vICh3aGljaCBpcyBub3QgdGhlIGNhc2UgaW4gdGhlIEJsYWNrYmVycnkgYnJvd3NlcikKdHJ5IHsKCUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcywgMCApWzBdLm5vZGVUeXBlOwoKLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCn0gY2F0Y2goZSl7CgltYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdLCBpID0gMDsKCgkJaWYgKCB0b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKCQkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIHJldCwgYXJyYXkgKTsKCQl9IGVsc2UgewoJCQlpZiAoIHR5cGVvZiBhcnJheS5sZW5ndGggPT09ICJudW1iZXIiICkgewoJCQkJZm9yICggdmFyIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCA7IGFycmF5W2ldOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9Owp9Cgp2YXIgc29ydE9yZGVyOwoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHx8ICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICkgewoJCQlpZiAoIGEgPT0gYiApIHsKCQkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJCX0KCQkJcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPyAtMSA6IDE7CgkJfQoKCQl2YXIgcmV0ID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IGEgPT09IGIgPyAwIDogMTsKCQlpZiAoIHJldCA9PT0gMCApIHsKCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gZWxzZSBpZiAoICJzb3VyY2VJbmRleCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJaWYgKCAhYS5zb3VyY2VJbmRleCB8fCAhYi5zb3VyY2VJbmRleCApIHsKCQkJaWYgKCBhID09IGIgKSB7CgkJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQl9CgkJCXJldHVybiBhLnNvdXJjZUluZGV4ID8gLTEgOiAxOwoJCX0KCgkJdmFyIHJldCA9IGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4OwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfSBlbHNlIGlmICggZG9jdW1lbnQuY3JlYXRlUmFuZ2UgKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoICFhLm93bmVyRG9jdW1lbnQgfHwgIWIub3duZXJEb2N1bWVudCApIHsKCQkJaWYgKCBhID09IGIgKSB7CgkJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQl9CgkJCXJldHVybiBhLm93bmVyRG9jdW1lbnQgPyAtMSA6IDE7CgkJfQoKCQl2YXIgYVJhbmdlID0gYS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9IGIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoJCWFSYW5nZS5zZXRTdGFydChhLCAwKTsKCQlhUmFuZ2Uuc2V0RW5kKGEsIDApOwoJCWJSYW5nZS5zZXRTdGFydChiLCAwKTsKCQliUmFuZ2Uuc2V0RW5kKGIsIDApOwoJCXZhciByZXQgPSBhUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLlNUQVJUX1RPX0VORCwgYlJhbmdlKTsKCQlpZiAoIHJldCA9PT0gMCApIHsKCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0KCi8vIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJlaXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzClNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW1zICkgewoJdmFyIHJldCA9ICIiLCBlbGVtOwoKCWZvciAoIHZhciBpID0gMDsgZWxlbXNbaV07IGkrKyApIHsKCQllbGVtID0gZWxlbXNbaV07CgoJCS8vIEdldCB0aGUgdGV4dCBmcm9tIHRleHQgbm9kZXMgYW5kIENEQVRBIG5vZGVzCgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDQgKSB7CgkJCXJldCArPSBlbGVtLm5vZGVWYWx1ZTsKCgkJLy8gVHJhdmVyc2UgZXZlcnl0aGluZyBlbHNlLCBleGNlcHQgY29tbWVudCBub2RlcwoJCX0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgIT09IDggKSB7CgkJCXJldCArPSBTaXp6bGUuZ2V0VGV4dCggZWxlbS5jaGlsZE5vZGVzICk7CgkJfQoJfQoKCXJldHVybiByZXQ7Cn07CgovLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lIHdoZW4KLy8gcXVlcnlpbmcgYnkgZ2V0RWxlbWVudEJ5SWQgKGFuZCBwcm92aWRlIGEgd29ya2Fyb3VuZCkKKGZ1bmN0aW9uKCl7CgkvLyBXZSdyZSBnb2luZyB0byBpbmplY3QgYSBmYWtlIGlucHV0IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmllZCBuYW1lCgl2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAoJCWlkID0gInNjcmlwdCIgKyAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwoJZm9ybS5pbm5lckhUTUwgPSAiPGEgbmFtZT0nIiArIGlkICsgIicvPiI7CgoJLy8gSW5qZWN0IGl0IGludG8gdGhlIHJvb3QgZWxlbWVudCwgY2hlY2sgaXRzIHN0YXR1cywgYW5kIHJlbW92ZSBpdCBxdWlja2x5Cgl2YXIgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290LmZpcnN0Q2hpbGQgKTsKCgkvLyBUaGUgd29ya2Fyb3VuZCBoYXMgdG8gZG8gYWRkaXRpb25hbCBjaGVja3MgYWZ0ZXIgYSBnZXRFbGVtZW50QnlJZAoJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0aGUgYnJhbmNoaW5nKQoJaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKCQlFeHByLmZpbmQuSUQgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOwoJCQkJcmV0dXJuIG0gPyBtLmlkID09PSBtYXRjaFsxXSB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlID09PSBtYXRjaFsxXSA/IFttXSA6IHVuZGVmaW5lZCA6IFtdOwoJCQl9CgkJfTsKCgkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlICYmIG5vZGUubm9kZVZhbHVlID09PSBtYXRjaDsKCQl9OwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKCXJvb3QgPSBmb3JtID0gbnVsbDsgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKfSkoKTsKCihmdW5jdGlvbigpewoJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgb25seSBlbGVtZW50cwoJLy8gd2hlbiBkb2luZyBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpCgoJLy8gQ3JlYXRlIGEgZmFrZSBlbGVtZW50Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CglkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpICk7CgoJLy8gTWFrZSBzdXJlIG5vIGNvbW1lbnRzIGFyZSBmb3VuZAoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGggPiAwICkgewoJCUV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7CgkJCXZhciByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShtYXRjaFsxXSk7CgoJCQkvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCgkJCWlmICggbWF0Y2hbMV0gPT09ICIqIiApIHsKCQkJCXZhciB0bXAgPSBbXTsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IHJlc3VsdHNbaV07IGkrKyApIHsKCQkJCQlpZiAoIHJlc3VsdHNbaV0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCXRtcC5wdXNoKCByZXN1bHRzW2ldICk7CgkJCQkJfQoJCQkJfQoKCQkJCXJlc3VsdHMgPSB0bXA7CgkJCX0KCgkJCXJldHVybiByZXN1bHRzOwoJCX07Cgl9CgoJLy8gQ2hlY2sgdG8gc2VlIGlmIGFuIGF0dHJpYnV0ZSByZXR1cm5zIG5vcm1hbGl6ZWQgaHJlZiBhdHRyaWJ1dGVzCglkaXYuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJaWYgKCBkaXYuZmlyc3RDaGlsZCAmJiB0eXBlb2YgZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlICE9PSAidW5kZWZpbmVkIiAmJgoJCQlkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSAhPT0gIiMiICkgewoJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIsIDIpOwoJCX07Cgl9CgoJZGl2ID0gbnVsbDsgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKfSkoKTsKCmlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApIHsKCShmdW5jdGlvbigpewoJCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCWRpdi5pbm5lckhUTUwgPSAiPHAgY2xhc3M9J1RFU1QnPjwvcD4iOwoKCQkvLyBTYWZhcmkgY2FuJ3QgaGFuZGxlIHVwcGVyY2FzZSBvciB1bmljb2RlIGNoYXJhY3RlcnMgd2hlbgoJCS8vIGluIHF1aXJrcyBtb2RlLgoJCWlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwgJiYgZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIi5URVNUIikubGVuZ3RoID09PSAwICkgewoJCQlyZXR1cm47CgkJfQoJCgkJU2l6emxlID0gZnVuY3Rpb24ocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKXsKCQkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCQkvLyBPbmx5IHVzZSBxdWVyeVNlbGVjdG9yQWxsIG9uIG5vbi1YTUwgZG9jdW1lbnRzCgkJCS8vIChJRCBzZWxlY3RvcnMgZG9uJ3Qgd29yayBpbiBub24tSFRNTCBkb2N1bWVudHMpCgkJCWlmICggIXNlZWQgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAhU2l6emxlLmlzWE1MKGNvbnRleHQpICkgewoJCQkJdHJ5IHsKCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpLCBleHRyYSApOwoJCQkJfSBjYXRjaChlKXt9CgkJCX0KCQkKCQkJcmV0dXJuIG9sZFNpenpsZShxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpOwoJCX07CgoJCWZvciAoIHZhciBwcm9wIGluIG9sZFNpenpsZSApIHsKCQkJU2l6emxlWyBwcm9wIF0gPSBvbGRTaXp6bGVbIHByb3AgXTsKCQl9CgoJCWRpdiA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFCgl9KSgpOwp9CgooZnVuY3Rpb24oKXsKCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCglkaXYuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjsKCgkvLyBPcGVyYSBjYW4ndCBmaW5kIGEgc2Vjb25kIGNsYXNzbmFtZSAoaW4gOS42KQoJLy8gQWxzbywgbWFrZSBzdXJlIHRoYXQgZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSBhY3R1YWxseSBleGlzdHMKCWlmICggIWRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIHx8IGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAwICkgewoJCXJldHVybjsKCX0KCgkvLyBTYWZhcmkgY2FjaGVzIGNsYXNzIGF0dHJpYnV0ZXMsIGRvZXNuJ3QgY2F0Y2ggY2hhbmdlcyAoaW4gMy4yKQoJZGl2Lmxhc3RDaGlsZC5jbGFzc05hbWUgPSAiZSI7CgoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMSApIHsKCQlyZXR1cm47Cgl9CgkKCUV4cHIub3JkZXIuc3BsaWNlKDEsIDAsICJDTEFTUyIpOwoJRXhwci5maW5kLkNMQVNTID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKSB7CgkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobWF0Y2hbMV0pOwoJCX0KCX07CgoJZGl2ID0gbnVsbDsgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKfSkoKTsKCmZ1bmN0aW9uIGRpck5vZGVDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCWlmICggZWxlbSApIHsKCQkJZWxlbSA9IGVsZW1bZGlyXTsKCQkJdmFyIG1hdGNoID0gZmFsc2U7CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBjdXIgKSB7CgkJCQkJbWF0Y2ggPSBlbGVtOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9CgpmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCWlmICggZWxlbSApIHsKCQkJZWxlbSA9IGVsZW1bZGlyXTsKCQkJdmFyIG1hdGNoID0gZmFsc2U7CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQlpZiAoICFpc1hNTCApIHsKCQkJCQkJZWxlbS5zaXpjYWNoZSA9IGRvbmVOYW1lOwoJCQkJCQllbGVtLnNpenNldCA9IGk7CgkJCQkJfQoJCQkJCWlmICggdHlwZW9mIGN1ciAhPT0gInN0cmluZyIgKSB7CgkJCQkJCWlmICggZWxlbSA9PT0gY3VyICkgewoJCQkJCQkJbWF0Y2ggPSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggU2l6emxlLmZpbHRlciggY3VyLCBbZWxlbV0gKS5sZW5ndGggPiAwICkgewoJCQkJCQltYXRjaCA9IGVsZW07CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKU2l6emxlLmNvbnRhaW5zID0gZG9jdW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPyBmdW5jdGlvbihhLCBiKXsKCXJldHVybiAhIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTYpOwp9IDogZnVuY3Rpb24oYSwgYil7CglyZXR1cm4gYSAhPT0gYiAmJiAoYS5jb250YWlucyA/IGEuY29udGFpbnMoYikgOiB0cnVlKTsKfTsKClNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKGVsZW0pewoJLy8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdAoJLy8gKHN1Y2ggYXMgbG9hZGluZyBpZnJhbWVzIGluIElFIC0gIzQ4MzMpIAoJdmFyIGRvY3VtZW50RWxlbWVudCA9IChlbGVtID8gZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gOiAwKS5kb2N1bWVudEVsZW1lbnQ7CglyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgOiBmYWxzZTsKfTsKCnZhciBwb3NQcm9jZXNzID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQpewoJdmFyIHRtcFNldCA9IFtdLCBsYXRlciA9ICIiLCBtYXRjaCwKCQlyb290ID0gY29udGV4dC5ub2RlVHlwZSA/IFtjb250ZXh0XSA6IGNvbnRleHQ7CgoJLy8gUG9zaXRpb24gc2VsZWN0b3JzIG11c3QgYmUgZG9uZSBhZnRlciB0aGUgZmlsdGVyCgkvLyBBbmQgc28gbXVzdCA6bm90KHBvc2l0aW9uYWwpIHNvIHdlIG1vdmUgYWxsIFBTRVVET3MgdG8gdGhlIGVuZAoJd2hpbGUgKCAobWF0Y2ggPSBFeHByLm1hdGNoLlBTRVVETy5leGVjKCBzZWxlY3RvciApKSApIHsKCQlsYXRlciArPSBtYXRjaFswXTsKCQlzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoIEV4cHIubWF0Y2guUFNFVURPLCAiIiApOwoJfQoKCXNlbGVjdG9yID0gRXhwci5yZWxhdGl2ZVtzZWxlY3Rvcl0gPyBzZWxlY3RvciArICIqIiA6IHNlbGVjdG9yOwoKCWZvciAoIHZhciBpID0gMCwgbCA9IHJvb3QubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCVNpenpsZSggc2VsZWN0b3IsIHJvb3RbaV0sIHRtcFNldCApOwoJfQoKCXJldHVybiBTaXp6bGUuZmlsdGVyKCBsYXRlciwgdG1wU2V0ICk7Cn07CgovLyBFWFBPU0UKCndpbmRvdy50aW55bWNlLmRvbS5TaXp6bGUgPSBTaXp6bGU7Cgp9KSgpOwoKLy8gI2VuZGlmCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/StringWriter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBTdHJpbmdXcml0ZXIuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBhdHRyc0NoYXJzUmVnRXhwID0gL1smXCI8Pl0vZywgdGV4dENoYXJzUmVnRXhwID0gL1s8PiZdL2csIGVuY29kZWRDaGFycyA9IHsnJicgOiAnJmFtcDsnLCAnIicgOiAnJnF1b3Q7JywgJzwnIDogJyZsdDsnLCAnPicgOiAnJmd0Oyd9Ow0KDQoJLyoqDQoJICogVGhpcyBjbGFzcyB3cml0ZXMgbm9kZXMgaW50byBhIHN0cmluZy4NCgkgKiBAY2xhc3MgdGlueW1jZS5kb20uU3RyaW5nV3JpdGVyDQoJICovDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UuZG9tLlN0cmluZ1dyaXRlcicsIHsNCgkJc3RyIDogbnVsbCwNCgkJdGFncyA6IG51bGwsDQoJCWNvdW50IDogMCwNCgkJc2V0dGluZ3MgOiBudWxsLA0KCQlpbmRlbnQgOiBudWxsLA0KDQoJCS8qKg0KCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0cmluZ1dyaXRlci4NCgkJICoNCgkJICogQGNvbnN0cnVjdG9yDQoJCSAqIEBtZXRob2QgU3RyaW5nV3JpdGVyDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIHNldHRpbmdzIG9iamVjdC4NCgkJICovDQoJCVN0cmluZ1dyaXRlciA6IGZ1bmN0aW9uKHMpIHsNCgkJCXRoaXMuc2V0dGluZ3MgPSB0aW55bWNlLmV4dGVuZCh7DQoJCQkJaW5kZW50X2NoYXIgOiAnICcsDQoJCQkJaW5kZW50YXRpb24gOiAwDQoJCQl9LCBzKTsNCg0KCQkJdGhpcy5yZXNldCgpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXNldHMgdGhlIHdyaXRlciBzbyBpdCBjYW4gYmUgcmV1c2VkIHRoZSBjb250ZW50cyBvZiB0aGUgd3JpdGVyIGlzIGNsZWFyZWQuDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVzZXQNCgkJICovDQoJCXJlc2V0IDogZnVuY3Rpb24oKSB7DQoJCQl0aGlzLmluZGVudCA9ICcnOw0KCQkJdGhpcy5zdHIgPSAiIjsNCgkJCXRoaXMudGFncyA9IFtdOw0KCQkJdGhpcy5jb3VudCA9IDA7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFdyaXRlcyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudCBsaWtlIGZvciBleGFtcGxlOiA8dGFnLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHdyaXRlU3RhcnRFbGVtZW50DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIE5hbWUgb2YgZWxlbWVudCB0byB3cml0ZS4NCgkJICovDQoJCXdyaXRlU3RhcnRFbGVtZW50IDogZnVuY3Rpb24obikgew0KCQkJdGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7DQoJCQl0aGlzLndyaXRlUmF3KCc8JyArIG4pOw0KCQkJdGhpcy50YWdzLnB1c2gobik7DQoJCQl0aGlzLmluQXR0ciA9IHRydWU7DQoJCQl0aGlzLmNvdW50Kys7DQoJCQl0aGlzLmVsZW1lbnRDb3VudCA9IHRoaXMuY291bnQ7DQoJCQl0aGlzLmF0dHJzID0ge307DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFdyaXRlcyBhbiBhdHRydWJ1dGUgbGlrZSBmb3IgZXhhbXBsZTogbXlhdHRyPSJ2YWxpZSINCgkJICoNCgkJICogQG1ldGhvZCB3cml0ZUF0dHJpYnV0ZQ0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBBdHRyaWJ1dGUgbmFtZSB0byB3cml0ZS4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHYgQXR0cmlidXRlIHZhbHVlIHRvIHdyaXRlLg0KCQkgKi8NCgkJd3JpdGVBdHRyaWJ1dGUgOiBmdW5jdGlvbihuLCB2KSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWlmICghdC5hdHRyc1tuXSkgew0KCQkJCXQud3JpdGVSYXcoIiAiICsgdC5lbmNvZGUobiwgdHJ1ZSkgKyAnPSInICsgdC5lbmNvZGUodiwgdHJ1ZSkgKyAnIicpOw0KCQkJCXQuYXR0cnNbbl0gPSB2Ow0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBXcml0ZSB0aGUgZW5kIG9mIGEgZWxlbWVudC4gVGhpcyB3aWxsIGFkZCBhIHNob3J0IGVuZCBmb3IgZWxlbWVudHMgd2l0aCBvdXQgY2hpbGRyZW4gbGlrZSBmb3IgZXhhbXBsZSBhIGltZyBlbGVtZW50Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIHdyaXRlRW5kRWxlbWVudA0KCQkgKi8NCgkJd3JpdGVFbmRFbGVtZW50IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgbjsNCg0KCQkJaWYgKHRoaXMudGFncy5sZW5ndGggPiAwKSB7DQoJCQkJbiA9IHRoaXMudGFncy5wb3AoKTsNCg0KCQkJCWlmICh0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoMSkpDQoJCQkJCXRoaXMud3JpdGVSYXcoJzwvJyArIG4gKyAnPicpOw0KDQoJCQkJaWYgKHRoaXMuc2V0dGluZ3MuaW5kZW50YXRpb24gPiAwKQ0KCQkJCQl0aGlzLndyaXRlUmF3KCdcbicpOw0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBXcml0ZXMgdGhlIGVuZCBvZiBhIGVsZW1lbnQuIFRoaXMgd2lsbCBhZGQgYSBmdWxsIGVuZCB0byB0aGUgZWxlbWVudCBldmVuIGlmIGl0IGRpZG4ndCBoYXZlIGFueSBjaGlsZHJlbi4NCgkJICoNCgkJICogQG1ldGhvZCB3cml0ZUZ1bGxFbmRFbGVtZW50DQoJCSAqLw0KCQl3cml0ZUZ1bGxFbmRFbGVtZW50IDogZnVuY3Rpb24oKSB7DQoJCQlpZiAodGhpcy50YWdzLmxlbmd0aCA+IDApIHsNCgkJCQl0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTsNCgkJCQl0aGlzLndyaXRlUmF3KCc8LycgKyB0aGlzLnRhZ3MucG9wKCkgKyAnPicpOw0KDQoJCQkJaWYgKHRoaXMuc2V0dGluZ3MuaW5kZW50YXRpb24gPiAwKQ0KCQkJCQl0aGlzLndyaXRlUmF3KCdcbicpOw0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBXcml0ZXMgYSB0ZXh0IG5vZGUgdmFsdWUuDQoJCSAqDQoJCSAqIEBtZXRob2Qgd3JpdGVUZXh0DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSB2IFZhbHVlIHRvIGFwcGVuZCBhcyBhIHRleHQgbm9kZS4NCgkJICovDQoJCXdyaXRlVGV4dCA6IGZ1bmN0aW9uKHYpIHsNCgkJCXRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgpOw0KCQkJdGhpcy53cml0ZVJhdyh0aGlzLmVuY29kZSh2KSk7DQoJCQl0aGlzLmNvdW50Kys7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFdyaXRlcyBhIENEQVRBIHNlY3Rpb24uDQoJCSAqDQoJCSAqIEBtZXRob2Qgd3JpdGVDREFUQQ0KCQkgKiBAcGFyYW0ge1N0cmluZ30gdiBWYWx1ZSB0byB3cml0ZSBpbiBDREFUQS4NCgkJICovDQoJCXdyaXRlQ0RBVEEgOiBmdW5jdGlvbih2KSB7DQoJCQl0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTsNCgkJCXRoaXMud3JpdGVSYXcoJzwhW0NEQVRBWycgKyB2ICsgJ11dPicpOw0KCQkJdGhpcy5jb3VudCsrOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBXcml0ZXMgYSBjb21tZW50Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIHdyaXRlQ29tbWVudA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gdiBWYWx1ZSBvZiB0aGUgY29tbWVudC4NCgkJICovDQoJCXdyaXRlQ29tbWVudCA6IGZ1bmN0aW9uKHYpIHsNCgkJCXRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgpOw0KCQkJdGhpcy53cml0ZVJhdygnPCEtLScgKyB2ICsgJy0tPicpOw0KCQkJdGhpcy5jb3VudCsrOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTdHJpbmcgd3JpdGVyIHNwZWNpZmljIGZ1bmN0aW9uLiBFbmFibGVzIHlvdSB0byB3cml0ZSByYXcgY29udGVudHMgdG8gdGhlIHN0cmluZy4NCgkJICoNCgkJICogQG1ldGhvZCB3cml0ZVJhdw0KCQkgKiBAcGFyYW0ge1N0cmluZ30gdiBTdHJpbmcgd2l0aCByYXcgY29udGVudHMgdG8gd3JpdGUuDQoJCSAqLw0KCQl3cml0ZVJhdyA6IGZ1bmN0aW9uKHYpIHsNCgkJCXRoaXMuc3RyICs9IHY7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFN0cmluZyB3cml0ZXIgc3BlY2lmaWMgbWV0aG9kLiBUaGlzIGVuY29kZXMgdGhlIHJhdyBlbnRpdGllcyBvZiBhIHN0cmluZy4NCgkJICoNCgkJICogQG1ldGhvZCBlbmNvZGUNCgkJICogQHBhcmFtIHtTdHJpbmd9IHMgU3RyaW5nIHRvIGVuY29kZS4NCgkJICogQHJldHVybiB7U3RyaW5nfSBTdHJpbmcgd2l0aCBlbnRpdHkgZW5jb2Rpbmcgb2YgdGhlIHJhdyBlbGVtZW50cyBsaWtlIDw+JiIuDQoJCSAqLw0KCQllbmNvZGUgOiBmdW5jdGlvbihzLCBhdHRyKSB7DQoJCQlyZXR1cm4gcy5yZXBsYWNlKGF0dHIgPyBhdHRyc0NoYXJzUmVnRXhwIDogdGV4dENoYXJzUmVnRXhwLCBmdW5jdGlvbih2KSB7DQoJCQkJcmV0dXJuIGVuY29kZWRDaGFyc1t2XTsNCgkJCX0pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50cy9ub2RlcyB3cml0dGVuLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldENvbnRlbnQNCgkJICogQHJldHVybiB7U3RyaW5nfSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdyaXR0ZW4gZWxlbWVudHMvbm9kZXMuDQoJCSAqLw0KCQlnZXRDb250ZW50IDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5zdHI7DQoJCX0sDQoNCgkJX3dyaXRlQXR0cmlidXRlc0VuZCA6IGZ1bmN0aW9uKHMpIHsNCgkJCWlmICghdGhpcy5pbkF0dHIpDQoJCQkJcmV0dXJuOw0KDQoJCQl0aGlzLmluQXR0ciA9IGZhbHNlOw0KDQoJCQlpZiAocyAmJiB0aGlzLmVsZW1lbnRDb3VudCA9PSB0aGlzLmNvdW50KSB7DQoJCQkJdGhpcy53cml0ZVJhdygnIC8+Jyk7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfQ0KDQoJCQl0aGlzLndyaXRlUmF3KCc+Jyk7DQoNCgkJCXJldHVybiB0cnVlOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/TreeWalker.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBUcmVlV2Fsa2VyLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KdGlueW1jZS5kb20uVHJlZVdhbGtlciA9IGZ1bmN0aW9uKHN0YXJ0X25vZGUsIHJvb3Rfbm9kZSkgew0KCXZhciBub2RlID0gc3RhcnRfbm9kZTsNCg0KCWZ1bmN0aW9uIGZpbmRTaWJsaW5nKG5vZGUsIHN0YXJ0X25hbWUsIHNpYmxpbmdfbmFtZSwgc2hhbGxvdykgew0KCQl2YXIgc2libGluZywgcGFyZW50Ow0KDQoJCWlmIChub2RlKSB7DQoJCQkvLyBXYWxrIGludG8gbm9kZXMgaWYgaXQgaGFzIGEgc3RhcnQNCgkJCWlmICghc2hhbGxvdyAmJiBub2RlW3N0YXJ0X25hbWVdKQ0KCQkJCXJldHVybiBub2RlW3N0YXJ0X25hbWVdOw0KDQoJCQkvLyBSZXR1cm4gdGhlIHNpYmxpbmcgaWYgaXQgaGFzIG9uZQ0KCQkJaWYgKG5vZGUgIT0gcm9vdF9ub2RlKSB7DQoJCQkJc2libGluZyA9IG5vZGVbc2libGluZ19uYW1lXTsNCgkJCQlpZiAoc2libGluZykNCgkJCQkJcmV0dXJuIHNpYmxpbmc7DQoNCgkJCQkvLyBXYWxrIHVwIHRoZSBwYXJlbnRzIHRvIGxvb2sgZm9yIHNpYmxpbmdzDQoJCQkJZm9yIChwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7IHBhcmVudCAmJiBwYXJlbnQgIT0gcm9vdF9ub2RlOyBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSkgew0KCQkJCQlzaWJsaW5nID0gcGFyZW50W3NpYmxpbmdfbmFtZV07DQoJCQkJCWlmIChzaWJsaW5nKQ0KCQkJCQkJcmV0dXJuIHNpYmxpbmc7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfTsNCg0KCS8qKg0KCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgbm9kZS4NCgkgKg0KCSAqIEByZXR1cm4ge05vZGV9IEN1cnJlbnQgbm9kZSB3aGVyZSB0aGUgd2Fsa2VyIGlzLg0KCSAqLw0KCXRoaXMuY3VycmVudCA9IGZ1bmN0aW9uKCkgew0KCQlyZXR1cm4gbm9kZTsNCgl9Ow0KDQoJLyoqDQoJICogV2Fsa3MgdG8gdGhlIG5leHQgbm9kZSBpbiB0cmVlLg0KCSAqDQoJICogQHJldHVybiB7Tm9kZX0gQ3VycmVudCBub2RlIHdoZXJlIHRoZSB3YWxrZXIgaXMgYWZ0ZXIgbW92aW5nIHRvIHRoZSBuZXh0IG5vZGUuDQoJICovDQoJdGhpcy5uZXh0ID0gZnVuY3Rpb24oc2hhbGxvdykgew0KCQlyZXR1cm4gKG5vZGUgPSBmaW5kU2libGluZyhub2RlLCAnZmlyc3RDaGlsZCcsICduZXh0U2libGluZycsIHNoYWxsb3cpKTsNCgl9Ow0KDQoJLyoqDQoJICogV2Fsa3MgdG8gdGhlIHByZXZpb3VzIG5vZGUgaW4gdHJlZS4NCgkgKg0KCSAqIEByZXR1cm4ge05vZGV9IEN1cnJlbnQgbm9kZSB3aGVyZSB0aGUgd2Fsa2VyIGlzIGFmdGVyIG1vdmluZyB0byB0aGUgcHJldmlvdXMgbm9kZS4NCgkgKi8NCgl0aGlzLnByZXYgPSBmdW5jdGlvbihzaGFsbG93KSB7DQoJCXJldHVybiAobm9kZSA9IGZpbmRTaWJsaW5nKG5vZGUsICdsYXN0Q2hpbGQnLCAnbGFzdFNpYmxpbmcnLCBzaGFsbG93KSk7DQoJfTsNCn07DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/TridentSelection.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBUcmlkZW50U2VsZWN0aW9uLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKCkgew0KCWZ1bmN0aW9uIFNlbGVjdGlvbihzZWxlY3Rpb24pIHsNCgkJdmFyIHQgPSB0aGlzLCBpbnZpc2libGVDaGFyID0gJ1x1RkVGRicsIHJhbmdlLCBsYXN0SUVSbmcsIGRvbSA9IHNlbGVjdGlvbi5kb20sIFRSVUUgPSB0cnVlLCBGQUxTRSA9IGZhbHNlOw0KDQoJCS8vIFJldHVybnMgYSBXM0MgRE9NIGNvbXBhdGlibGUgcmFuZ2Ugb2JqZWN0IGJ5IHVzaW5nIHRoZSBJRSBSYW5nZSBBUEkNCgkJZnVuY3Rpb24gZ2V0UmFuZ2UoKSB7DQoJCQl2YXIgaWVSYW5nZSA9IHNlbGVjdGlvbi5nZXRSbmcoKSwgZG9tUmFuZ2UgPSBkb20uY3JlYXRlUm5nKCksIGVsZW1lbnQsIGNvbGxhcHNlZDsNCg0KCQkJLy8gSWYgc2VsZWN0aW9uIGlzIG91dHNpZGUgdGhlIGN1cnJlbnQgZG9jdW1lbnQganVzdCByZXR1cm4gYW4gZW1wdHkgcmFuZ2UNCgkJCWVsZW1lbnQgPSBpZVJhbmdlLml0ZW0gPyBpZVJhbmdlLml0ZW0oMCkgOiBpZVJhbmdlLnBhcmVudEVsZW1lbnQoKTsNCgkJCWlmIChlbGVtZW50Lm93bmVyRG9jdW1lbnQgIT0gZG9tLmRvYykNCgkJCQlyZXR1cm4gZG9tUmFuZ2U7DQoNCgkJCS8vIEhhbmRsZSBjb250cm9sIHNlbGVjdGlvbiBvciB0ZXh0IHNlbGVjdGlvbiBvZiBhIGltYWdlDQoJCQlpZiAoaWVSYW5nZS5pdGVtIHx8ICFlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgew0KCQkJCWRvbVJhbmdlLnNldFN0YXJ0KGVsZW1lbnQucGFyZW50Tm9kZSwgZG9tLm5vZGVJbmRleChlbGVtZW50KSk7DQoJCQkJZG9tUmFuZ2Uuc2V0RW5kKGRvbVJhbmdlLnN0YXJ0Q29udGFpbmVyLCBkb21SYW5nZS5zdGFydE9mZnNldCArIDEpOw0KDQoJCQkJcmV0dXJuIGRvbVJhbmdlOw0KCQkJfQ0KDQoJCQljb2xsYXBzZWQgPSBzZWxlY3Rpb24uaXNDb2xsYXBzZWQoKTsNCg0KCQkJZnVuY3Rpb24gZmluZEVuZFBvaW50KHN0YXJ0KSB7DQoJCQkJdmFyIG1hcmtlciwgY29udGFpbmVyLCBvZmZzZXQsIG5vZGVzLCBzdGFydEluZGV4ID0gMCwgZW5kSW5kZXgsIGluZGV4LCBwYXJlbnQsIGNoZWNrUm5nLCBwb3NpdGlvbjsNCg0KCQkJCS8vIFNldHVwIHRlbXAgcmFuZ2UgYW5kIGNvbGxhcHNlIGl0DQoJCQkJY2hlY2tSbmcgPSBpZVJhbmdlLmR1cGxpY2F0ZSgpOw0KCQkJCWNoZWNrUm5nLmNvbGxhcHNlKHN0YXJ0KTsNCg0KCQkJCS8vIENyZWF0ZSBtYXJrZXIgYW5kIGluc2VydCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBlbmRwb2ludHMgcGFyZW50DQoJCQkJbWFya2VyID0gZG9tLmNyZWF0ZSgnYScpOw0KCQkJCXBhcmVudCA9IGNoZWNrUm5nLnBhcmVudEVsZW1lbnQoKTsNCg0KCQkJCS8vIElmIHBhcmVudCBkb2Vzbid0IGhhdmUgYW55IGNoaWxkcmVuIHRoZW4gc2V0IHRoZSBjb250YWluZXIgdG8gdGhhdCBwYXJlbnQgYW5kIHRoZSBpbmRleCB0byAwDQoJCQkJaWYgKCFwYXJlbnQuaGFzQ2hpbGROb2RlcygpKSB7DQoJCQkJCWRvbVJhbmdlW3N0YXJ0ID8gJ3NldFN0YXJ0JyA6ICdzZXRFbmQnXShwYXJlbnQsIDApOw0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KDQoJCQkJcGFyZW50LmFwcGVuZENoaWxkKG1hcmtlcik7DQoJCQkJY2hlY2tSbmcubW92ZVRvRWxlbWVudFRleHQobWFya2VyKTsNCgkJCQlwb3NpdGlvbiA9IGllUmFuZ2UuY29tcGFyZUVuZFBvaW50cyhzdGFydCA/ICdTdGFydFRvU3RhcnQnIDogJ0VuZFRvRW5kJywgY2hlY2tSbmcpOw0KCQkJCWlmIChwb3NpdGlvbiA+IDApIHsNCgkJCQkJLy8gVGhlIHBvc2l0aW9uIGlzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHBhcmVudCBlbGVtZW50Lg0KCQkJCQkvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIElFIHB1dHMgdGhlIGNhcmV0IHRvIHRoZSBsZWZ0IGVkZ2Ugb2YgYSB0YWJsZS4NCgkJCQkJZG9tUmFuZ2Vbc3RhcnQgPyAnc2V0U3RhcnRBZnRlcicgOiAnc2V0RW5kQWZ0ZXInXShwYXJlbnQpOw0KCQkJCQlkb20ucmVtb3ZlKG1hcmtlcik7DQoJCQkJCXJldHVybjsNCgkJCQl9DQoNCgkJCQkvLyBTZXR1cCBub2RlIGxpc3QgYW5kIGVuZEluZGV4DQoJCQkJbm9kZXMgPSB0aW55bWNlLmdyZXAocGFyZW50LmNoaWxkTm9kZXMpOw0KCQkJCWVuZEluZGV4ID0gbm9kZXMubGVuZ3RoIC0gMTsNCgkJCQkvLyBQZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIHBvc2l0aW9uDQoJCQkJd2hpbGUgKHN0YXJ0SW5kZXggPD0gZW5kSW5kZXgpIHsNCgkJCQkJaW5kZXggPSBNYXRoLmZsb29yKChzdGFydEluZGV4ICsgZW5kSW5kZXgpIC8gMik7DQoNCgkJCQkJLy8gSW5zZXJ0IG1hcmtlciBhbmQgY2hlY2sgaXQncyBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc2VsZWN0aW9uDQoJCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUobWFya2VyLCBub2Rlc1tpbmRleF0pOw0KCQkJCQljaGVja1JuZy5tb3ZlVG9FbGVtZW50VGV4dChtYXJrZXIpOw0KCQkJCQlwb3NpdGlvbiA9IGllUmFuZ2UuY29tcGFyZUVuZFBvaW50cyhzdGFydCA/ICdTdGFydFRvU3RhcnQnIDogJ0VuZFRvRW5kJywgY2hlY2tSbmcpOw0KCQkJCQlpZiAocG9zaXRpb24gPiAwKSB7DQoJCQkJCQkvLyBNYXJrZXIgaXMgdG8gdGhlIHJpZ2h0DQoJCQkJCQlzdGFydEluZGV4ID0gaW5kZXggKyAxOw0KCQkJCQl9IGVsc2UgaWYgKHBvc2l0aW9uIDwgMCkgew0KCQkJCQkJLy8gTWFya2VyIGlzIHRvIHRoZSBsZWZ0DQoJCQkJCQllbmRJbmRleCA9IGluZGV4IC0gMTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCS8vIE1ha2VyIGlzIHdoZXJlIHdlIGFyZQ0KCQkJCQkJZm91bmQgPSB0cnVlOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBTZXR1cCBjb250YWluZXINCgkJCQljb250YWluZXIgPSBwb3NpdGlvbiA+IDAgfHwgaW5kZXggPT0gMCA/IG1hcmtlci5uZXh0U2libGluZyA6IG1hcmtlci5wcmV2aW91c1NpYmxpbmc7DQoNCgkJCQkvLyBIYW5kbGUgZWxlbWVudCBzZWxlY3Rpb24NCgkJCQlpZiAoY29udGFpbmVyLm5vZGVUeXBlID09IDEpIHsNCgkJCQkJZG9tLnJlbW92ZShtYXJrZXIpOw0KDQoJCQkJCS8vIEZpbmQgb2Zmc2V0IGFuZCBjb250YWluZXINCgkJCQkJb2Zmc2V0ID0gZG9tLm5vZGVJbmRleChjb250YWluZXIpOw0KCQkJCQljb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTsNCg0KCQkJCQkvLyBNb3ZlIHRoZSBvZmZzZXQgaWYgd2UgYXJlIHNldHRpbmcgdGhlIGVuZCBvciB0aGUgcG9zaXRpb24gaXMgYWZ0ZXIgYW4gZWxlbWVudA0KCQkJCQlpZiAoIXN0YXJ0IHx8IGluZGV4ID4gMCkNCgkJCQkJCW9mZnNldCsrOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIENhbGN1bGF0ZSBvZmZzZXQgd2l0aGluIHRleHQgbm9kZQ0KCQkJCQlpZiAocG9zaXRpb24gPiAwIHx8IGluZGV4ID09IDApIHsNCgkJCQkJCWNoZWNrUm5nLnNldEVuZFBvaW50KHN0YXJ0ID8gJ1N0YXJ0VG9TdGFydCcgOiAnRW5kVG9FbmQnLCBpZVJhbmdlKTsNCgkJCQkJCW9mZnNldCA9IGNoZWNrUm5nLnRleHQubGVuZ3RoOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJY2hlY2tSbmcuc2V0RW5kUG9pbnQoc3RhcnQgPyAnU3RhcnRUb1N0YXJ0JyA6ICdFbmRUb0VuZCcsIGllUmFuZ2UpOw0KCQkJCQkJb2Zmc2V0ID0gY29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGggLSBjaGVja1JuZy50ZXh0Lmxlbmd0aDsNCgkJCQkJfQ0KDQoJCQkJCWRvbS5yZW1vdmUobWFya2VyKTsNCgkJCQl9DQoNCgkJCQlkb21SYW5nZVtzdGFydCA/ICdzZXRTdGFydCcgOiAnc2V0RW5kJ10oY29udGFpbmVyLCBvZmZzZXQpOw0KCQkJfTsNCg0KCQkJLy8gRmluZCBzdGFydCBwb2ludA0KCQkJZmluZEVuZFBvaW50KHRydWUpOw0KDQoJCQkvLyBGaW5kIGVuZCBwb2ludCBpZiBuZWVkZWQNCgkJCWlmICghY29sbGFwc2VkKQ0KCQkJCWZpbmRFbmRQb2ludCgpOw0KDQoJCQlyZXR1cm4gZG9tUmFuZ2U7DQoJCX07DQoNCgkJdGhpcy5hZGRSYW5nZSA9IGZ1bmN0aW9uKHJuZykgew0KCQkJdmFyIGllUm5nLCBjdHJsUm5nLCBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQsIGVuZENvbnRhaW5lciwgZW5kT2Zmc2V0LCBkb2MgPSBzZWxlY3Rpb24uZG9tLmRvYywgYm9keSA9IGRvYy5ib2R5Ow0KDQoJCQlmdW5jdGlvbiBzZXRFbmRQb2ludChzdGFydCkgew0KCQkJCXZhciBjb250YWluZXIsIG9mZnNldCwgbWFya2VyLCB0bXBSbmcsIG5vZGVzOw0KDQoJCQkJbWFya2VyID0gZG9tLmNyZWF0ZSgnYScpOw0KCQkJCWNvbnRhaW5lciA9IHN0YXJ0ID8gc3RhcnRDb250YWluZXIgOiBlbmRDb250YWluZXI7DQoJCQkJb2Zmc2V0ID0gc3RhcnQgPyBzdGFydE9mZnNldCA6IGVuZE9mZnNldDsNCgkJCQl0bXBSbmcgPSBpZVJuZy5kdXBsaWNhdGUoKTsNCg0KCQkJCWlmIChjb250YWluZXIgPT0gZG9jKSB7DQoJCQkJCWNvbnRhaW5lciA9IGJvZHk7DQoJCQkJCW9mZnNldCA9IDA7DQoJCQkJfQ0KDQoJCQkJaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PSAzKSB7DQoJCQkJCWNvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShtYXJrZXIsIGNvbnRhaW5lcik7DQoJCQkJCXRtcFJuZy5tb3ZlVG9FbGVtZW50VGV4dChtYXJrZXIpOw0KCQkJCQl0bXBSbmcubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBvZmZzZXQpOw0KCQkJCQlkb20ucmVtb3ZlKG1hcmtlcik7DQoJCQkJCWllUm5nLnNldEVuZFBvaW50KHN0YXJ0ID8gJ1N0YXJ0VG9TdGFydCcgOiAnRW5kVG9FbmQnLCB0bXBSbmcpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCW5vZGVzID0gY29udGFpbmVyLmNoaWxkTm9kZXM7DQoNCgkJCQkJaWYgKG5vZGVzLmxlbmd0aCkgew0KCQkJCQkJaWYgKG9mZnNldCA+PSBub2Rlcy5sZW5ndGgpIHsNCgkJCQkJCQlkb20uaW5zZXJ0QWZ0ZXIobWFya2VyLCBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXSk7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCWNvbnRhaW5lci5pbnNlcnRCZWZvcmUobWFya2VyLCBub2Rlc1tvZmZzZXRdKTsNCgkJCQkJCX0NCg0KCQkJCQkJdG1wUm5nLm1vdmVUb0VsZW1lbnRUZXh0KG1hcmtlcik7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkvLyBFbXB0eSBub2RlIHNlbGVjdGlvbiBmb3IgZXhhbXBsZSA8ZGl2Pnw8L2Rpdj4NCgkJCQkJCW1hcmtlciA9IGRvYy5jcmVhdGVUZXh0Tm9kZShpbnZpc2libGVDaGFyKTsNCgkJCQkJCWNvbnRhaW5lci5hcHBlbmRDaGlsZChtYXJrZXIpOw0KCQkJCQkJdG1wUm5nLm1vdmVUb0VsZW1lbnRUZXh0KG1hcmtlci5wYXJlbnROb2RlKTsNCgkJCQkJCXRtcFJuZy5jb2xsYXBzZShUUlVFKTsNCgkJCQkJfQ0KDQoJCQkJCWllUm5nLnNldEVuZFBvaW50KHN0YXJ0ID8gJ1N0YXJ0VG9TdGFydCcgOiAnRW5kVG9FbmQnLCB0bXBSbmcpOw0KCQkJCQlkb20ucmVtb3ZlKG1hcmtlcik7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBEZXN0cm95IGNhY2hlZCByYW5nZQ0KCQkJdGhpcy5kZXN0cm95KCk7DQoNCgkJCS8vIFNldHVwIHNvbWUgc2hvcnRlciB2ZXJzaW9ucw0KCQkJc3RhcnRDb250YWluZXIgPSBybmcuc3RhcnRDb250YWluZXI7DQoJCQlzdGFydE9mZnNldCA9IHJuZy5zdGFydE9mZnNldDsNCgkJCWVuZENvbnRhaW5lciA9IHJuZy5lbmRDb250YWluZXI7DQoJCQllbmRPZmZzZXQgPSBybmcuZW5kT2Zmc2V0Ow0KCQkJaWVSbmcgPSBib2R5LmNyZWF0ZVRleHRSYW5nZSgpOw0KDQoJCQkvLyBJZiBzaW5nbGUgZWxlbWVudCBzZWxlY3Rpb24gdGhlbiB0cnkgbWFraW5nIGEgY29udHJvbCBzZWxlY3Rpb24gb3V0IG9mIGl0DQoJCQlpZiAoc3RhcnRDb250YWluZXIgPT0gZW5kQ29udGFpbmVyICYmIHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDEgJiYgc3RhcnRPZmZzZXQgPT0gZW5kT2Zmc2V0IC0gMSkgew0KCQkJCWlmIChzdGFydE9mZnNldCA9PSBlbmRPZmZzZXQgLSAxKSB7DQoJCQkJCXRyeSB7DQoJCQkJCQljdHJsUm5nID0gYm9keS5jcmVhdGVDb250cm9sUmFuZ2UoKTsNCgkJCQkJCWN0cmxSbmcuYWRkRWxlbWVudChzdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3N0YXJ0T2Zmc2V0XSk7DQoJCQkJCQljdHJsUm5nLnNlbGVjdCgpOw0KCQkJCQkJY3RybFJuZy5zY3JvbGxJbnRvVmlldygpOw0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJLy8gSWdub3JlDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFNldCBzdGFydC9lbmQgcG9pbnQgb2Ygc2VsZWN0aW9uDQoJCQlzZXRFbmRQb2ludCh0cnVlKTsNCgkJCXNldEVuZFBvaW50KCk7DQoNCgkJCS8vIFNlbGVjdCB0aGUgbmV3IHJhbmdlIGFuZCBzY3JvbGwgaXQgaW50byB2aWV3DQoJCQlpZVJuZy5zZWxlY3QoKTsNCgkJCWllUm5nLnNjcm9sbEludG9WaWV3KCk7DQoJCX07DQoNCgkJdGhpcy5nZXRSYW5nZUF0ID0gZnVuY3Rpb24oKSB7DQoJCQkvLyBTZXR1cCBuZXcgcmFuZ2UgaWYgdGhlIGNhY2hlIGlzIGVtcHR5DQoJCQlpZiAoIXJhbmdlIHx8ICF0aW55bWNlLmRvbS5SYW5nZVV0aWxzLmNvbXBhcmVSYW5nZXMobGFzdElFUm5nLCBzZWxlY3Rpb24uZ2V0Um5nKCkpKSB7DQoJCQkJcmFuZ2UgPSBnZXRSYW5nZSgpOw0KDQoJCQkJLy8gU3RvcmUgYXdheSB0ZXh0IHJhbmdlIGZvciBuZXh0IGNhbGwNCgkJCQlsYXN0SUVSbmcgPSBzZWxlY3Rpb24uZ2V0Um5nKCk7DQoJCQl9DQoNCgkJCS8vIElFIHdpbGwgc2F5IHRoYXQgdGhlIHJhbmdlIGlzIGVxdWFsIHRoZW4gcHJvZHVjZSBhbiBpbnZhbGlkIGFyZ3VtZW50IGV4Y2VwdGlvbg0KCQkJLy8gaWYgeW91IHBlcmZvcm0gc3BlY2lmaWMgb3BlcmF0aW9ucyBpbiBhIGtleXVwIGV2ZW50LiBGb3IgZXhhbXBsZSBDdHJsK0RlbC4NCgkJCS8vIFRoaXMgaGFjayB3aWxsIGludmFsaWRhdGUgdGhlIHJhbmdlIGNhY2hlIGlmIHRoZSBleGNlcHRpb24gb2NjdXJzDQoJCQl0cnkgew0KCQkJCXJhbmdlLnN0YXJ0Q29udGFpbmVyLm5leHRTaWJsaW5nOw0KCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQlyYW5nZSA9IGdldFJhbmdlKCk7DQoJCQkJbGFzdElFUm5nID0gbnVsbDsNCgkJCX0NCg0KCQkJLy8gUmV0dXJuIGNhY2hlZCByYW5nZQ0KCQkJcmV0dXJuIHJhbmdlOw0KCQl9Ow0KDQoJCXRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgew0KCQkJLy8gRGVzdHJveSBjYWNoZWQgcmFuZ2UgYW5kIGxhc3QgSUUgcmFuZ2UgdG8gYXZvaWQgbWVtb3J5IGxlYWtzDQoJCQlsYXN0SUVSbmcgPSByYW5nZSA9IG51bGw7DQoJCX07DQoJfTsNCg0KCS8vIEV4cG9zZSB0aGUgc2VsZWN0aW9uIG9iamVjdA0KCXRpbnltY2UuZG9tLlRyaWRlbnRTZWxlY3Rpb24gPSBTZWxlY3Rpb247DQp9KSgpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/dom/XMLWriter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBYTUxXcml0ZXIuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8qKg0KCSAqIFRoaXMgY2xhc3Mgd3JpdGVzIG5vZGVzIGludG8gYSBYTUwgZG9jdW1lbnQgc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSBjYW4gdGhlbiBiZQ0KCSAqIHNlcmlhbGl6ZWQgZG93biB0byBhIEhUTUwgc3RyaW5nIGxhdGVyIG9uLg0KCSAqIEBjbGFzcyB0aW55bWNlLmRvbS5YTUxXcml0ZXINCgkgKi8NCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5kb20uWE1MV3JpdGVyJywgew0KCQlub2RlIDogbnVsbCwNCg0KCQkvKioNCgkJICogQ29uc3RydWN0cyBhIG5ldyBYTUxXcml0ZXIuDQoJCSAqDQoJCSAqIEBjb25zdHJ1Y3Rvcg0KCQkgKiBAbWV0aG9kIFhNTFdyaXRlcg0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBzZXR0aW5ncyBvYmplY3QuDQoJCSAqLw0KCQlYTUxXcml0ZXIgOiBmdW5jdGlvbihzKSB7DQoJCQkvLyBHZXQgWE1MIGRvY3VtZW50DQoJCQlmdW5jdGlvbiBnZXRYTUwoKSB7DQoJCQkJdmFyIGkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbjsNCg0KCQkJCWlmICghaSB8fCAhaS5jcmVhdGVEb2N1bWVudCkgew0KCQkJCQkvLyBUcnkgSUUgb2JqZWN0cw0KCQkJCQl0cnkge3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTVNYTUwyLkRPTURvY3VtZW50Jyk7fSBjYXRjaCAoZXgpIHt9DQoJCQkJCXRyeSB7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWG1sRG9tJyk7fSBjYXRjaCAoZXgpIHt9DQoJCQkJfSBlbHNlDQoJCQkJCXJldHVybiBpLmNyZWF0ZURvY3VtZW50KCcnLCAnJywgbnVsbCk7DQoJCQl9Ow0KDQoJCQl0aGlzLmRvYyA9IGdldFhNTCgpOw0KCQkJDQoJCQkvLyBTaW5jZSBPcGVyYSBhbmQgV2ViS2l0IGRvZXNuJ3QgZXNjYXBlID4gaW50byAmZ3Q7IHdlIG5lZWQgdG8gZG8gaXQgb3VyIHNlbGYgdG8gbm9ybWFsaXplIHRoZSBvdXRwdXQgZm9yIGFsbCBicm93c2Vycw0KCQkJdGhpcy52YWxpZCA9IHRpbnltY2UuaXNPcGVyYSB8fCB0aW55bWNlLmlzV2ViS2l0Ow0KDQoJCQl0aGlzLnJlc2V0KCk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJlc2V0cyB0aGUgd3JpdGVyIHNvIGl0IGNhbiBiZSByZXVzZWQgdGhlIGNvbnRlbnRzIG9mIHRoZSB3cml0ZXIgaXMgY2xlYXJlZC4NCgkJICoNCgkJICogQG1ldGhvZCByZXNldA0KCQkgKi8NCgkJcmVzZXQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZCA9IHQuZG9jOw0KDQoJCQlpZiAoZC5maXJzdENoaWxkKQ0KCQkJCWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTsNCg0KCQkJdC5ub2RlID0gZC5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoImh0bWwiKSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFdyaXRlcyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudCBsaWtlIGZvciBleGFtcGxlOiA8dGFnLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHdyaXRlU3RhcnRFbGVtZW50DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIE5hbWUgb2YgZWxlbWVudCB0byB3cml0ZS4NCgkJICovDQoJCXdyaXRlU3RhcnRFbGVtZW50IDogZnVuY3Rpb24obikgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0Lm5vZGUgPSB0Lm5vZGUuYXBwZW5kQ2hpbGQodC5kb2MuY3JlYXRlRWxlbWVudChuKSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFdyaXRlcyBhbiBhdHRydWJ1dGUgbGlrZSBmb3IgZXhhbXBsZTogbXlhdHRyPSJ2YWxpZSINCgkJICoNCgkJICogQG1ldGhvZCB3cml0ZUF0dHJpYnV0ZQ0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBBdHRyaWJ1dGUgbmFtZSB0byB3cml0ZS4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHYgQXR0cmlidXRlIHZhbHVlIHRvIHdyaXRlLg0KCQkgKi8NCgkJd3JpdGVBdHRyaWJ1dGUgOiBmdW5jdGlvbihuLCB2KSB7DQoJCQlpZiAodGhpcy52YWxpZCkNCgkJCQl2ID0gdi5yZXBsYWNlKC8+L2csICclTUNHVCUnKTsNCg0KCQkJdGhpcy5ub2RlLnNldEF0dHJpYnV0ZShuLCB2KTsNCgkJfSwNCg0KCQkvKioNCgkJICogV3JpdGUgdGhlIGVuZCBvZiBhIGVsZW1lbnQuIFRoaXMgd2lsbCBhZGQgYSBzaG9ydCBlbmQgZm9yIGVsZW1lbnRzIHdpdGggb3V0IGNoaWxkcmVuIGxpa2UgZm9yIGV4YW1wbGUgYSBpbWcgZWxlbWVudC4NCgkJICoNCgkJICogQG1ldGhvZCB3cml0ZUVuZEVsZW1lbnQNCgkJICovDQoJCXdyaXRlRW5kRWxlbWVudCA6IGZ1bmN0aW9uKCkgew0KCQkJdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFdyaXRlcyB0aGUgZW5kIG9mIGEgZWxlbWVudC4gVGhpcyB3aWxsIGFkZCBhIGZ1bGwgZW5kIHRvIHRoZSBlbGVtZW50IGV2ZW4gaWYgaXQgZGlkbid0IGhhdmUgYW55IGNoaWxkcmVuLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHdyaXRlRnVsbEVuZEVsZW1lbnQNCgkJICovDQoJCXdyaXRlRnVsbEVuZEVsZW1lbnQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgbiA9IHQubm9kZTsNCg0KCQkJbi5hcHBlbmRDaGlsZCh0LmRvYy5jcmVhdGVUZXh0Tm9kZSgiIikpOw0KCQkJdC5ub2RlID0gbi5wYXJlbnROb2RlOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBXcml0ZXMgYSB0ZXh0IG5vZGUgdmFsdWUuDQoJCSAqDQoJCSAqIEBtZXRob2Qgd3JpdGVUZXh0DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSB2IFZhbHVlIHRvIGFwcGVuZCBhcyBhIHRleHQgbm9kZS4NCgkJICovDQoJCXdyaXRlVGV4dCA6IGZ1bmN0aW9uKHYpIHsNCgkJCWlmICh0aGlzLnZhbGlkKQ0KCQkJCXYgPSB2LnJlcGxhY2UoLz4vZywgJyVNQ0dUJScpOw0KDQoJCQl0aGlzLm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kb2MuY3JlYXRlVGV4dE5vZGUodikpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBXcml0ZXMgYSBDREFUQSBzZWN0aW9uLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHdyaXRlQ0RBVEENCgkJICogQHBhcmFtIHtTdHJpbmd9IHYgVmFsdWUgdG8gd3JpdGUgaW4gQ0RBVEEuDQoJCSAqLw0KCQl3cml0ZUNEQVRBIDogZnVuY3Rpb24odikgew0KCQkJdGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbih2KSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFdyaXRlcyBhIGNvbW1lbnQuDQoJCSAqDQoJCSAqIEBtZXRob2Qgd3JpdGVDb21tZW50DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSB2IFZhbHVlIG9mIHRoZSBjb21tZW50Lg0KCQkgKi8NCgkJd3JpdGVDb21tZW50IDogZnVuY3Rpb24odikgew0KCQkJLy8gRml4IGZvciBidWcgIzIwMzU2OTQNCgkJCWlmICh0aW55bWNlLmlzSUUpDQoJCQkJdiA9IHYucmVwbGFjZSgvXlwtfFwtJC9nLCAnICcpOw0KDQoJCQl0aGlzLm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kb2MuY3JlYXRlQ29tbWVudCh2LnJlcGxhY2UoL1wtXC0vZywgJyAnKSkpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50cy9ub2RlcyB3cml0dGVuLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldENvbnRlbnQNCgkJICogQHJldHVybiB7U3RyaW5nfSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdyaXR0ZW4gZWxlbWVudHMvbm9kZXMuDQoJCSAqLw0KCQlnZXRDb250ZW50IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgaDsNCg0KCQkJaCA9IHRoaXMuZG9jLnhtbCB8fCBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMuZG9jKTsNCgkJCWggPSBoLnJlcGxhY2UoLzxcP1teP10rXD8+fDxodG1sW14+XSo+fDxcL2h0bWw+fDxodG1sXC8+fDwhRE9DVFlQRVtePl0rPi9nLCAnJyk7DQoJCQloID0gaC5yZXBsYWNlKC8gP1wvPi9nLCAnIC8+Jyk7DQoNCgkJCWlmICh0aGlzLnZhbGlkKQ0KCQkJCWggPSBoLnJlcGxhY2UoL1wlTUNHVCUvZywgJyZndDsnKTsNCg0KCQkJcmV0dXJuIGg7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/Editor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBFZGl0b3IuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIFNob3J0ZW4gdGhlc2UgbmFtZXMNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIGV4dGVuZCA9IHRpbnltY2UuZXh0ZW5kLA0KCQlEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXIsIGVhY2ggPSB0aW55bWNlLmVhY2gsIGlzR2Vja28gPSB0aW55bWNlLmlzR2Vja28sDQoJCWlzSUUgPSB0aW55bWNlLmlzSUUsIGlzV2ViS2l0ID0gdGlueW1jZS5pc1dlYktpdCwgaXMgPSB0aW55bWNlLmlzLA0KCQlUaGVtZU1hbmFnZXIgPSB0aW55bWNlLlRoZW1lTWFuYWdlciwgUGx1Z2luTWFuYWdlciA9IHRpbnltY2UuUGx1Z2luTWFuYWdlciwNCgkJaW5BcnJheSA9IHRpbnltY2UuaW5BcnJheSwgZ3JlcCA9IHRpbnltY2UuZ3JlcCwgZXhwbG9kZSA9IHRpbnltY2UuZXhwbG9kZTsNCg0KCS8qKg0KCSAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIGNvcmUgbG9naWMgZm9yIGEgVGlueU1DRSBlZGl0b3IuDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS5FZGl0b3INCgkgKiBAYXV0aG9yIE1veGllY29kZQ0KCSAqIEBleGFtcGxlDQoJICogLy8gQWRkIGEgY2xhc3MgdG8gYWxsIHBhcmFncmFwaHMgaW4gdGhlIGVkaXRvci4NCgkgKiB0aW55TUNFLmFjdGl2ZUVkaXRvci5kb20uYWRkQ2xhc3ModGlueU1DRS5hY3RpdmVFZGl0b3IuZG9tLnNlbGVjdCgncCcpLCAnc29tZWNsYXNzJyk7DQoJICogDQoJICogLy8gR2V0cyB0aGUgY3VycmVudCBlZGl0b3JzIHNlbGVjdGlvbiBhcyB0ZXh0DQoJICogdGlueU1DRS5hY3RpdmVFZGl0b3Iuc2VsZWN0aW9uLmdldENvbnRlbnQoe2Zvcm1hdCA6ICd0ZXh0J30pOw0KCSAqIA0KCSAqIC8vIENyZWF0ZXMgYSBuZXcgZWRpdG9yIGluc3RhbmNlDQoJICogdmFyIGVkID0gbmV3IHRpbnltY2UuRWRpdG9yKCd0ZXh0YXJlYWlkJywgew0KCSAqICAgICBzb21lX3NldHRpbmcgOiAxDQoJICogfSk7DQoJICogDQoJICogLy8gU2VsZWN0IGVhY2ggaXRlbSB0aGUgdXNlciBjbGlja3Mgb24NCgkgKiBlZC5vbkNsaWNrLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCSAqICAgICBlZC5zZWxlY3Rpb24uc2VsZWN0KGUudGFyZ2V0KTsNCgkgKiB9KTsNCgkgKiANCgkgKiBlZC5yZW5kZXIoKTsNCgkgKi8NCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5FZGl0b3InLCB7DQoJCS8qKg0KCQkgKiBDb25zdHJ1Y3RzIGEgZWRpdG9yIGluc3RhbmNlIGJ5IGlkLg0KCQkgKg0KCQkgKiBAY29uc3RydWN0b3INCgkJICogQG1ldGhvZCBFZGl0b3INCgkJICogQHBhcmFtIHtTdHJpbmd9IGlkIFVuaXF1ZSBpZCBmb3IgdGhlIGVkaXRvci4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgc2V0dGluZ3Mgc3RyaW5nIGZvciB0aGUgZWRpdG9yLg0KCQkgKiBAYXV0aG9yIE1veGllY29kZQ0KCQkgKi8NCgkJRWRpdG9yIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJLyoqDQoJCQkgKiBFZGl0b3IgaW5zdGFuY2UgaWQsIG5vcm1hbGx5IHRoZSBzYW1lIGFzIHRoZSBkaXYvdGV4dGFyZWEgdGhhdCB3YXMgcmVwbGFjZWQuIA0KCQkJICoNCgkJCSAqIEBwcm9wZXJ0eSBpZA0KCQkJICogQHR5cGUgU3RyaW5nDQoJCQkgKi8NCgkJCXQuaWQgPSB0LmVkaXRvcklkID0gaWQ7DQoNCgkJCXQuZXhlY0NvbW1hbmRzID0ge307DQoJCQl0LnF1ZXJ5U3RhdGVDb21tYW5kcyA9IHt9Ow0KCQkJdC5xdWVyeVZhbHVlQ29tbWFuZHMgPSB7fTsNCg0KCQkJLyoqDQoJCQkgKiBTdGF0ZSB0byBmb3JjZSB0aGUgZWRpdG9yIHRvIHJldHVybiBmYWxzZSBvbiBhIGlzRGlydHkgY2FsbC4gDQoJCQkgKg0KCQkJICogQHByb3BlcnR5IGlzTm90RGlydHkNCgkJCSAqIEB0eXBlIEJvb2xlYW4NCgkJCSAqLw0KCQkJdC5pc05vdERpcnR5ID0gZmFsc2U7DQoNCgkJCS8qKg0KCQkJICogTmFtZS9WYWx1ZSBvYmplY3QgY29udGFpbnRpbmcgcGx1Z2luIGluc3RhbmNlcy4NCgkJCSAqDQoJCQkgKiBAcHJvcGVydHkgcGx1Z2lucw0KCQkJICogQHR5cGUgT2JqZWN0DQoJCQkgKi8NCgkJCXQucGx1Z2lucyA9IHt9Ow0KDQoJCQkvLyBBZGQgZXZlbnRzIHRvIHRoZSBlZGl0b3INCgkJCWVhY2goWw0KCQkJCS8qKg0KCQkJCSAqIEZpcmVzIGJlZm9yZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGVkaXRvci4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvblByZUluaXQNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqIEBzZWUgI29uSW5pdA0KCQkJCSAqLw0KCQkJCSdvblByZUluaXQnLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgYmVmb3JlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZWRpdG9yLg0KCQkJCSAqDQoJCQkJICogQGV2ZW50IG9uQmVmb3JlUmVuZGVyVUkNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvbkJlZm9yZVJlbmRlclVJJywNCg0KCQkJCS8qKg0KCQkJCSAqIEZpcmVzIGFmdGVyIHRoZSByZW5kZXJpbmcgaGFzIGNvbXBsZXRlZC4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvblBvc3RSZW5kZXINCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvblBvc3RSZW5kZXInLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBlZGl0b3IgaXMgZG9uZS4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvbkluaXQNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqIEBzZWUgI29uUHJlSW5pdA0KCQkJCSAqLw0KCQkJCSdvbkluaXQnLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiB0aGUgZWRpdG9yIGluc3RhbmNlIGlzIHJlbW92ZWQgZnJvbSBwYWdlLg0KCQkJCSAqDQoJCQkJICogQGV2ZW50IG9uUmVtb3ZlDQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKi8NCgkJCQknb25SZW1vdmUnLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiB0aGUgZWRpdG9yIGlzIGFjdGl2YXRlZC4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvbkFjdGl2YXRlDQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKi8NCgkJCQknb25BY3RpdmF0ZScsDQoNCgkJCQkvKioNCgkJCQkgKiBGaXJlcyB3aGVuIHRoZSBlZGl0b3IgaXMgZGVhY3RpdmF0ZWQuDQoJCQkJICoNCgkJCQkgKiBAZXZlbnQgb25EZWFjdGl2YXRlDQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKi8NCgkJCQknb25EZWFjdGl2YXRlJywNCg0KCQkJCS8qKg0KCQkJCSAqIEZpcmVzIHdoZW4gc29tZXRoaW5nIGluIHRoZSBib2R5IG9mIHRoZSBlZGl0b3IgaXMgY2xpY2tlZC4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvbkNsaWNrDQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKiBAcGFyYW0ge0V2ZW50fSBldnQgVzNDIERPTSBFdmVudCBpbnN0YW5jZS4NCgkJCQkgKi8NCgkJCQknb25DbGljaycsDQoNCgkJCQkvKioNCgkJCQkgKiBGaXJlcyB3aGVuIGEgcmVnaXN0ZXJlZCBldmVudCBpcyBpbnRlcmNlcHRlZC4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvbkV2ZW50DQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKiBAcGFyYW0ge0V2ZW50fSBldnQgVzNDIERPTSBFdmVudCBpbnN0YW5jZS4NCgkJCQkgKi8NCgkJCQknb25FdmVudCcsDQoNCgkJCQkvKioNCgkJCQkgKiBGaXJlcyB3aGVuIGEgbW91c2V1cCBldmVudCBpcyBpbnRlcmNlcHRlZCBpbnNpZGUgdGhlIGVkaXRvci4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvbk1vdXNlVXANCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqIEBwYXJhbSB7RXZlbnR9IGV2dCBXM0MgRE9NIEV2ZW50IGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvbk1vdXNlVXAnLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiBhIG1vdXNlZG93biBldmVudCBpcyBpbnRlcmNlcHRlZCBpbnNpZGUgdGhlIGVkaXRvci4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvbk1vdXNlRG93bg0KCQkJCSAqIEBwYXJhbSB7dGlueW1jZS5FZGl0b3J9IHNlbmRlciBFZGl0b3IgaW5zdGFuY2UuDQoJCQkJICogQHBhcmFtIHtFdmVudH0gZXZ0IFczQyBET00gRXZlbnQgaW5zdGFuY2UuDQoJCQkJICovDQoJCQkJJ29uTW91c2VEb3duJywNCg0KCQkJCS8qKg0KCQkJCSAqIEZpcmVzIHdoZW4gYSBkYmxjbGljayBldmVudCBpcyBpbnRlcmNlcHRlZCBpbnNpZGUgdGhlIGVkaXRvci4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvbkRibENsaWNrDQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKiBAcGFyYW0ge0V2ZW50fSBldnQgVzNDIERPTSBFdmVudCBpbnN0YW5jZS4NCgkJCQkgKi8NCgkJCQknb25EYmxDbGljaycsDQoNCgkJCQkvKioNCgkJCQkgKiBGaXJlcyB3aGVuIGEga2V5ZG93biBldmVudCBpcyBpbnRlcmNlcHRlZCBpbnNpZGUgdGhlIGVkaXRvci4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvbktleURvd24NCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqIEBwYXJhbSB7RXZlbnR9IGV2dCBXM0MgRE9NIEV2ZW50IGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvbktleURvd24nLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiBhIGtleWRvd24gZXZlbnQgaXMgaW50ZXJjZXB0ZWQgaW5zaWRlIHRoZSBlZGl0b3IuDQoJCQkJICoNCgkJCQkgKiBAZXZlbnQgb25LZXlVcA0KCQkJCSAqIEBwYXJhbSB7dGlueW1jZS5FZGl0b3J9IHNlbmRlciBFZGl0b3IgaW5zdGFuY2UuDQoJCQkJICogQHBhcmFtIHtFdmVudH0gZXZ0IFczQyBET00gRXZlbnQgaW5zdGFuY2UuDQoJCQkJICovDQoJCQkJJ29uS2V5VXAnLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiBhIGtleXByZXNzIGV2ZW50IGlzIGludGVyY2VwdGVkIGluc2lkZSB0aGUgZWRpdG9yLg0KCQkJCSAqDQoJCQkJICogQGV2ZW50IG9uS2V5UHJlc3MNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqIEBwYXJhbSB7RXZlbnR9IGV2dCBXM0MgRE9NIEV2ZW50IGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvbktleVByZXNzJywNCg0KCQkJCS8qKg0KCQkJCSAqIEZpcmVzIHdoZW4gYSBjb250ZXh0bWVudSBldmVudCBpcyBpbnRlcmNlcHRlZCBpbnNpZGUgdGhlIGVkaXRvci4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvbkNvbnRleHRNZW51DQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKiBAcGFyYW0ge0V2ZW50fSBldnQgVzNDIERPTSBFdmVudCBpbnN0YW5jZS4NCgkJCQkgKi8NCgkJCQknb25Db250ZXh0TWVudScsDQoNCgkJCQkvKioNCgkJCQkgKiBGaXJlcyB3aGVuIGEgZm9ybSBzdWJtaXQgZXZlbnQgaXMgaW50ZXJjZXB0ZWQuDQoJCQkJICoNCgkJCQkgKiBAZXZlbnQgb25TdWJtaXQNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqIEBwYXJhbSB7RXZlbnR9IGV2dCBXM0MgRE9NIEV2ZW50IGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvblN1Ym1pdCcsDQoNCgkJCQkvKioNCgkJCQkgKiBGaXJlcyB3aGVuIGEgZm9ybSByZXNldCBldmVudCBpcyBpbnRlcmNlcHRlZC4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvblJlc2V0DQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKiBAcGFyYW0ge0V2ZW50fSBldnQgVzNDIERPTSBFdmVudCBpbnN0YW5jZS4NCgkJCQkgKi8NCgkJCQknb25SZXNldCcsDQoNCgkJCQkvKioNCgkJCQkgKiBGaXJlcyB3aGVuIGEgcGFzdGUgZXZlbnQgaXMgaW50ZXJjZXB0ZWQgaW5zaWRlIHRoZSBlZGl0b3IuDQoJCQkJICoNCgkJCQkgKiBAZXZlbnQgb25QYXN0ZQ0KCQkJCSAqIEBwYXJhbSB7dGlueW1jZS5FZGl0b3J9IHNlbmRlciBFZGl0b3IgaW5zdGFuY2UuDQoJCQkJICogQHBhcmFtIHtFdmVudH0gZXZ0IFczQyBET00gRXZlbnQgaW5zdGFuY2UuDQoJCQkJICovDQoJCQkJJ29uUGFzdGUnLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiB0aGUgU2VyaWFsaXplciBkb2VzIGEgcHJlUHJvY2VzcyBvbiB0aGUgY29udGVudHMuDQoJCQkJICoNCgkJCQkgKiBAZXZlbnQgb25QcmVQcm9jZXNzDQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKiBAcGFyYW0ge09iamVjdH0gb2JqIFByZVByb2Nlc3Mgb2JqZWN0Lg0KCQkJCSAqLw0KCQkJCSdvblByZVByb2Nlc3MnLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiB0aGUgU2VyaWFsaXplciBkb2VzIGEgcG9zdFByb2Nlc3Mgb24gdGhlIGNvbnRlbnRzLg0KCQkJCSAqDQoJCQkJICogQGV2ZW50IG9uUG9zdFByb2Nlc3MNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqIEBwYXJhbSB7T2JqZWN0fSBvYmogUHJlUHJvY2VzcyBvYmplY3QuDQoJCQkJICovDQoJCQkJJ29uUG9zdFByb2Nlc3MnLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgYmVmb3JlIG5ldyBjb250ZW50cyBpcyBhZGRlZCB0byB0aGUgZWRpdG9yLiBVc2luZyBmb3IgZXhhbXBsZSBzZXRDb250ZW50Lg0KCQkJCSAqDQoJCQkJICogQGV2ZW50IG9uQmVmb3JlU2V0Q29udGVudA0KCQkJCSAqIEBwYXJhbSB7dGlueW1jZS5FZGl0b3J9IHNlbmRlciBFZGl0b3IgaW5zdGFuY2UuDQoJCQkJICovDQoJCQkJJ29uQmVmb3JlU2V0Q29udGVudCcsDQoNCgkJCQkvKioNCgkJCQkgKiBGaXJlcyBiZWZvcmUgY29udGVudHMgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGVkaXRvciB1c2luZyBmb3IgZXhhbXBsZSBnZXRDb250ZW50Lg0KCQkJCSAqDQoJCQkJICogQGV2ZW50IG9uQmVmb3JlR2V0Q29udGVudA0KCQkJCSAqIEBwYXJhbSB7dGlueW1jZS5FZGl0b3J9IHNlbmRlciBFZGl0b3IgaW5zdGFuY2UuDQoJCQkJICogQHBhcmFtIHtFdmVudH0gZXZ0IFczQyBET00gRXZlbnQgaW5zdGFuY2UuDQoJCQkJICovDQoJCQkJJ29uQmVmb3JlR2V0Q29udGVudCcsDQoNCgkJCQkvKioNCgkJCQkgKiBGaXJlcyBhZnRlciB0aGUgY29udGVudHMgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGVkaXRvciB1c2luZyBmb3IgZXhhbXBsZSBvblNldENvbnRlbnQuDQoJCQkJICoNCgkJCQkgKiBAZXZlbnQgb25TZXRDb250ZW50DQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKi8NCgkJCQknb25TZXRDb250ZW50JywNCg0KCQkJCS8qKg0KCQkJCSAqIEZpcmVzIGFmdGVyIHRoZSBjb250ZW50cyBoYXMgYmVlbiBleHRyYWN0ZWQgZnJvbSB0aGUgZWRpdG9yIHVzaW5nIGZvciBleGFtcGxlIGdldENvbnRlbnQuDQoJCQkJICoNCgkJCQkgKiBAZXZlbnQgb25HZXRDb250ZW50DQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKi8NCgkJCQknb25HZXRDb250ZW50JywNCg0KCQkJCS8qKg0KCQkJCSAqIEZpcmVzIHdoZW4gdGhlIGVkaXRvciBnZXRzIGxvYWRlZCB3aXRoIGNvbnRlbnRzIGZvciBleGFtcGxlIHdoZW4gdGhlIGxvYWQgbWV0aG9kIGlzIGV4ZWN1dGVkLg0KCQkJCSAqDQoJCQkJICogQGV2ZW50IG9uTG9hZENvbnRlbnQNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvbkxvYWRDb250ZW50JywNCg0KCQkJCS8qKg0KCQkJCSAqIEZpcmVzIHdoZW4gdGhlIGVkaXRvciBjb250ZW50cyBnZXRzIHNhdmVkIGZvciBleGFtcGxlIHdoZW4gdGhlIHNhdmUgbWV0aG9kIGlzIGV4ZWN1dGVkLg0KCQkJCSAqDQoJCQkJICogQGV2ZW50IG9uU2F2ZUNvbnRlbnQNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvblNhdmVDb250ZW50JywNCg0KCQkJCS8qKg0KCQkJCSAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyBub2RlIGxvY2F0aW9uIHVzaW5nIHRoZSBtb3VzZSBvciBrZXlib2FyZC4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvbk5vZGVDaGFuZ2UNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvbk5vZGVDaGFuZ2UnLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiBhIG5ldyB1bmRvIGxldmVsIGlzIGFkZGVkIHRvIHRoZSBlZGl0b3IuDQoJCQkJICoNCgkJCQkgKiBAZXZlbnQgb25DaGFuZ2UNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvbkNoYW5nZScsDQoNCgkJCQkvKioNCgkJCQkgKiBGaXJlcyBiZWZvcmUgYSBjb21tYW5kIGdldHMgZXhlY3V0ZWQgZm9yIGV4YW1wbGUgIkJvbGQiLg0KCQkJCSAqDQoJCQkJICogQGV2ZW50IG9uQmVmb3JlRXhlY0NvbW1hbmQNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvbkJlZm9yZUV4ZWNDb21tYW5kJywNCg0KCQkJCS8qKg0KCQkJCSAqIEZpcmVzIGFmdGVyIGEgY29tbWFuZCBpcyBleGVjdXRlZCBmb3IgZXhhbXBsZSAiQm9sZCIuDQoJCQkJICoNCgkJCQkgKiBAZXZlbnQgb25FeGVjQ29tbWFuZA0KCQkJCSAqIEBwYXJhbSB7dGlueW1jZS5FZGl0b3J9IHNlbmRlciBFZGl0b3IgaW5zdGFuY2UuDQoJCQkJICovDQoJCQkJJ29uRXhlY0NvbW1hbmQnLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiB0aGUgY29udGVudHMgaXMgdW5kbzplZC4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvblVuZG8NCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqIEBwYXJhbSB7RXZlbnR9IGV2dCBXM0MgRE9NIEV2ZW50IGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvblVuZG8nLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiB0aGUgY29udGVudHMgaXMgcmVkbzplZC4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvblJlZG8NCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqIEBwYXJhbSB7RXZlbnR9IGV2dCBXM0MgRE9NIEV2ZW50IGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvblJlZG8nLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiB2aXN1YWwgYWlkcyBpcyBlbmFibGVkL2Rpc2FibGVkLg0KCQkJCSAqDQoJCQkJICogQGV2ZW50IG9uVmlzdWFsQWlkDQoJCQkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gc2VuZGVyIEVkaXRvciBpbnN0YW5jZS4NCgkJCQkgKi8NCgkJCQknb25WaXN1YWxBaWQnLA0KDQoJCQkJLyoqDQoJCQkJICogRmlyZXMgd2hlbiB0aGUgcHJvZ3Jlc3MgdGhyb2JiZXIgaXMgc2hvd24gYWJvdmUgdGhlIGVkaXRvci4NCgkJCQkgKg0KCQkJCSAqIEBldmVudCBvblNldFByb2dyZXNzU3RhdGUNCgkJCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBzZW5kZXIgRWRpdG9yIGluc3RhbmNlLg0KCQkJCSAqLw0KCQkJCSdvblNldFByb2dyZXNzU3RhdGUnDQoJCQldLCBmdW5jdGlvbihlKSB7DQoJCQkJdFtlXSA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KCQkJfSk7DQoNCgkJCS8qKg0KCQkJICogTmFtZS92YWx1ZSBjb2xsZWN0aW9uIHdpdGggZWRpdG9yIHNldHRpbmdzLg0KCQkJICoNCgkJCSAqIEBwcm9wZXJ0eSBzZXR0aW5ncw0KCQkJICogQHR5cGUgT2JqZWN0DQoJCQkgKi8NCgkJCXQuc2V0dGluZ3MgPSBzID0gZXh0ZW5kKHsNCgkJCQlpZCA6IGlkLA0KCQkJCWxhbmd1YWdlIDogJ2VuJywNCgkJCQlkb2NzX2xhbmd1YWdlIDogJ2VuJywNCgkJCQl0aGVtZSA6ICdzaW1wbGUnLA0KCQkJCXNraW4gOiAnZGVmYXVsdCcsDQoJCQkJZGVsdGFfd2lkdGggOiAwLA0KCQkJCWRlbHRhX2hlaWdodCA6IDAsDQoJCQkJcG9wdXBfY3NzIDogJycsDQoJCQkJcGx1Z2lucyA6ICcnLA0KCQkJCWRvY3VtZW50X2Jhc2VfdXJsIDogdGlueW1jZS5kb2N1bWVudEJhc2VVUkwsDQoJCQkJYWRkX2Zvcm1fc3VibWl0X3RyaWdnZXIgOiAxLA0KCQkJCXN1Ym1pdF9wYXRjaCA6IDEsDQoJCQkJYWRkX3VubG9hZF90cmlnZ2VyIDogMSwNCgkJCQljb252ZXJ0X3VybHMgOiAxLA0KCQkJCXJlbGF0aXZlX3VybHMgOiAxLA0KCQkJCXJlbW92ZV9zY3JpcHRfaG9zdCA6IDEsDQoJCQkJdGFibGVfaW5saW5lX2VkaXRpbmcgOiAwLA0KCQkJCW9iamVjdF9yZXNpemluZyA6IDEsDQoJCQkJY2xlYW51cCA6IDEsDQoJCQkJYWNjZXNzaWJpbGl0eV9mb2N1cyA6IDEsDQoJCQkJY3VzdG9tX3Nob3J0Y3V0cyA6IDEsDQoJCQkJY3VzdG9tX3VuZG9fcmVkb19rZXlib2FyZF9zaG9ydGN1dHMgOiAxLA0KCQkJCWN1c3RvbV91bmRvX3JlZG9fcmVzdG9yZV9zZWxlY3Rpb24gOiAxLA0KCQkJCWN1c3RvbV91bmRvX3JlZG8gOiAxLA0KCQkJCWRvY3R5cGUgOiB0aW55bWNlLmlzSUU2ID8gJzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPicgOiAnPCFET0NUWVBFPicsIC8vIFVzZSBvbGQgZG9jdHlwZSBvbiBJRSA2IHRvIGF2b2lkIGhvcml6b250YWwgc2Nyb2xsDQoJCQkJdmlzdWFsX3RhYmxlX2NsYXNzIDogJ21jZUl0ZW1UYWJsZScsDQoJCQkJdmlzdWFsIDogMSwNCgkJCQlmb250X3NpemVfc3R5bGVfdmFsdWVzIDogJ3h4LXNtYWxsLHgtc21hbGwsc21hbGwsbWVkaXVtLGxhcmdlLHgtbGFyZ2UseHgtbGFyZ2UnLA0KCQkJCWFwcGx5X3NvdXJjZV9mb3JtYXR0aW5nIDogMSwNCgkJCQlkaXJlY3Rpb25hbGl0eSA6ICdsdHInLA0KCQkJCWZvcmNlZF9yb290X2Jsb2NrIDogJ3AnLA0KCQkJCXZhbGlkX2VsZW1lbnRzIDogJ0BbaWR8Y2xhc3N8c3R5bGV8dGl0bGV8ZGlyPGx0cj9ydGx8bGFuZ3x4bWw6Omxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ubW91c2Vkb3dufG9ubW91c2V1cHxvbm1vdXNlb3Zlcnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ua2V5cHJlc3N8b25rZXlkb3dufG9ua2V5dXBdLGFbcmVsfHJldnxjaGFyc2V0fGhyZWZsYW5nfHRhYmluZGV4fGFjY2Vzc2tleXx0eXBlfG5hbWV8aHJlZnx0YXJnZXR8dGl0bGV8Y2xhc3N8b25mb2N1c3xvbmJsdXJdLHN0cm9uZy9iLGVtL2ksc3RyaWtlLHUsI3AsLW9sW3R5cGV8Y29tcGFjdF0sLXVsW3R5cGV8Y29tcGFjdF0sLWxpLGJyLGltZ1tsb25nZGVzY3x1c2VtYXB8c3JjfGJvcmRlcnxhbHQ9fHRpdGxlfGhzcGFjZXx2c3BhY2V8d2lkdGh8aGVpZ2h0fGFsaWduXSwtc3ViLC1zdXAsLWJsb2NrcXVvdGVbY2l0ZV0sLXRhYmxlW2JvcmRlcnxjZWxsc3BhY2luZ3xjZWxscGFkZGluZ3x3aWR0aHxmcmFtZXxydWxlc3xoZWlnaHR8YWxpZ258c3VtbWFyeXxiZ2NvbG9yfGJhY2tncm91bmR8Ym9yZGVyY29sb3JdLC10cltyb3dzcGFufHdpZHRofGhlaWdodHxhbGlnbnx2YWxpZ258Ymdjb2xvcnxiYWNrZ3JvdW5kfGJvcmRlcmNvbG9yXSx0Ym9keSx0aGVhZCx0Zm9vdCwjdGRbY29sc3Bhbnxyb3dzcGFufHdpZHRofGhlaWdodHxhbGlnbnx2YWxpZ258Ymdjb2xvcnxiYWNrZ3JvdW5kfGJvcmRlcmNvbG9yfHNjb3BlXSwjdGhbY29sc3Bhbnxyb3dzcGFufHdpZHRofGhlaWdodHxhbGlnbnx2YWxpZ258c2NvcGVdLGNhcHRpb24sLWRpdiwtc3BhbiwtY29kZSwtcHJlLGFkZHJlc3MsLWgxLC1oMiwtaDMsLWg0LC1oNSwtaDYsaHJbc2l6ZXxub3NoYWRlXSwtZm9udFtmYWNlfHNpemV8Y29sb3JdLGRkLGRsLGR0LGNpdGUsYWJicixhY3JvbnltLGRlbFtkYXRldGltZXxjaXRlXSxpbnNbZGF0ZXRpbWV8Y2l0ZV0sb2JqZWN0W2NsYXNzaWR8d2lkdGh8aGVpZ2h0fGNvZGViYXNlfCpdLHBhcmFtW25hbWV8dmFsdWVdLGVtYmVkW3R5cGV8d2lkdGh8aGVpZ2h0fHNyY3wqXSxzY3JpcHRbc3JjfHR5cGVdLG1hcFtuYW1lXSxhcmVhW3NoYXBlfGNvb3Jkc3xocmVmfGFsdHx0YXJnZXRdLGJkbyxidXR0b24sY29sW2FsaWdufGNoYXJ8Y2hhcm9mZnxzcGFufHZhbGlnbnx3aWR0aF0sY29sZ3JvdXBbYWxpZ258Y2hhcnxjaGFyb2ZmfHNwYW58dmFsaWdufHdpZHRoXSxkZm4sZmllbGRzZXQsZm9ybVthY3Rpb258YWNjZXB0fGFjY2VwdC1jaGFyc2V0fGVuY3R5cGV8bWV0aG9kXSxpbnB1dFthY2NlcHR8YWx0fGNoZWNrZWR8ZGlzYWJsZWR8bWF4bGVuZ3RofG5hbWV8cmVhZG9ubHl8c2l6ZXxzcmN8dHlwZXx2YWx1ZXx0YWJpbmRleHxhY2Nlc3NrZXldLGtiZCxsYWJlbFtmb3JdLGxlZ2VuZCxub3NjcmlwdCxvcHRncm91cFtsYWJlbHxkaXNhYmxlZF0sb3B0aW9uW2Rpc2FibGVkfGxhYmVsfHNlbGVjdGVkfHZhbHVlXSxxW2NpdGVdLHNhbXAsc2VsZWN0W2Rpc2FibGVkfG11bHRpcGxlfG5hbWV8c2l6ZV0sc21hbGwsdGV4dGFyZWFbY29sc3xyb3dzfGRpc2FibGVkfG5hbWV8cmVhZG9ubHldLHR0LHZhcixiaWcnLA0KCQkJCWhpZGRlbl9pbnB1dCA6IDEsDQoJCQkJcGFkZF9lbXB0eV9lZGl0b3IgOiAxLA0KCQkJCXJlbmRlcl91aSA6IDEsDQoJCQkJaW5pdF90aGVtZSA6IDEsDQoJCQkJZm9yY2VfcF9uZXdsaW5lcyA6IDEsDQoJCQkJaW5kZW50YXRpb24gOiAnMzBweCcsDQoJCQkJa2VlcF9zdHlsZXMgOiAxLA0KCQkJCWZpeF90YWJsZV9lbGVtZW50cyA6IDEsDQoJCQkJaW5saW5lX3N0eWxlcyA6IDEsDQoJCQkJY29udmVydF9mb250c190b19zcGFucyA6IHRydWUNCgkJCX0sIHMpOw0KDQoJCQkvKioNCgkJCSAqIFVSSSBvYmplY3QgdG8gZG9jdW1lbnQgY29uZmlndXJlZCBmb3IgdGhlIFRpbnlNQ0UgaW5zdGFuY2UuDQoJCQkgKg0KCQkJICogQHByb3BlcnR5IGRvY3VtZW50QmFzZVVSSQ0KCQkJICogQHR5cGUgdGlueW1jZS51dGlsLlVSSQ0KCQkJICovDQoJCQl0LmRvY3VtZW50QmFzZVVSSSA9IG5ldyB0aW55bWNlLnV0aWwuVVJJKHMuZG9jdW1lbnRfYmFzZV91cmwgfHwgdGlueW1jZS5kb2N1bWVudEJhc2VVUkwsIHsNCgkJCQliYXNlX3VyaSA6IHRpbnlNQ0UuYmFzZVVSSQ0KCQkJfSk7DQoNCgkJCS8qKg0KCQkJICogVVJJIG9iamVjdCB0byBjdXJyZW50IGRvY3VtZW50IHRoYXQgaG9sZHMgdGhlIFRpbnlNQ0UgZWRpdG9yIGluc3RhbmNlLg0KCQkJICoNCgkJCSAqIEBwcm9wZXJ0eSBiYXNlVVJJDQoJCQkgKiBAdHlwZSB0aW55bWNlLnV0aWwuVVJJDQoJCQkgKi8NCgkJCXQuYmFzZVVSSSA9IHRpbnltY2UuYmFzZVVSSTsNCg0KCQkJLy8gQ2FsbCBzZXR1cA0KCQkJdC5leGVjQ2FsbGJhY2soJ3NldHVwJywgdCk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJlbmRlcmVzIHRoZSBlZGl0b3IvYWRkcyBpdCB0byB0aGUgcGFnZS4NCgkJICoNCgkJICogQG1ldGhvZCByZW5kZXINCgkJICovDQoJCXJlbmRlciA6IGZ1bmN0aW9uKG5zdCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgaWQgPSB0LmlkLCBzbCA9IHRpbnltY2UuU2NyaXB0TG9hZGVyOw0KDQoJCQkvLyBQYWdlIGlzIG5vdCBsb2FkZWQgeWV0LCB3YWl0IGZvciBpdA0KCQkJaWYgKCFFdmVudC5kb21Mb2FkZWQpIHsNCgkJCQlFdmVudC5hZGQoZG9jdW1lbnQsICdpbml0JywgZnVuY3Rpb24oKSB7DQoJCQkJCXQucmVuZGVyKCk7DQoJCQkJfSk7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQl0aW55TUNFLnNldHRpbmdzID0gczsNCg0KCQkJLy8gRWxlbWVudCBub3QgZm91bmQsIHRoZW4gc2tpcCBpbml0aWFsaXphdGlvbg0KCQkJaWYgKCF0LmdldEVsZW1lbnQoKSkNCgkJCQlyZXR1cm47DQoNCgkJCS8vIElzIGEgaVBhZC9pUGhvbmUsIHRoZW4gc2tpcCBpbml0aWFsaXphdGlvbi4gV2UgbmVlZCB0byBzbmlmZiBoZXJlIHNpbmNlIHRoZQ0KCQkJLy8gYnJvd3NlciBzYXlzIGl0IGhhcyBjb250ZW50RWRpdGFibGUgc3VwcG9ydCBidXQgdGhlcmUgaXMgbm8gdmlzaWJsZSBjYXJldA0KCQkJLy8gV2Ugd2lsbCByZW1vdmUgdGhpcyBjaGVjayBvbmVzIEFwcGxlIGltcGxlbWVudHMgZnVsbCBjb250ZW50RWRpdGFibGUgc3VwcG9ydA0KCQkJaWYgKHRpbnltY2UuaXNJRGV2aWNlKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gQWRkIGhpZGRlbiBpbnB1dCBmb3Igbm9uIGlucHV0IGVsZW1lbnRzIGluc2lkZSBmb3JtIGVsZW1lbnRzDQoJCQlpZiAoIS9URVhUQVJFQXxJTlBVVC9pLnRlc3QodC5nZXRFbGVtZW50KCkubm9kZU5hbWUpICYmIHMuaGlkZGVuX2lucHV0ICYmIERPTS5nZXRQYXJlbnQoaWQsICdmb3JtJykpDQoJCQkJRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGUoJ2lucHV0Jywge3R5cGUgOiAnaGlkZGVuJywgbmFtZSA6IGlkfSksIGlkKTsNCg0KCQkJLyoqDQoJCQkgKiBXaW5kb3cgbWFuYWdlciByZWZlcmVuY2UsIHVzZSB0aGlzIHRvIG9wZW4gbmV3IHdpbmRvd3MgYW5kIGRpYWxvZ3MuDQoJCQkgKg0KCQkJICogQHByb3BlcnR5IHdpbmRvd01hbmFnZXINCgkJCSAqIEB0eXBlIHRpbnltY2UuV2luZG93TWFuYWdlcg0KCQkJICovDQoJCQlpZiAodGlueW1jZS5XaW5kb3dNYW5hZ2VyKQ0KCQkJCXQud2luZG93TWFuYWdlciA9IG5ldyB0aW55bWNlLldpbmRvd01hbmFnZXIodCk7DQoNCgkJCWlmIChzLmVuY29kaW5nID09ICd4bWwnKSB7DQoJCQkJdC5vbkdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCWlmIChvLnNhdmUpDQoJCQkJCQlvLmNvbnRlbnQgPSBET00uZW5jb2RlKG8uY29udGVudCk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmFkZF9mb3JtX3N1Ym1pdF90cmlnZ2VyKSB7DQoJCQkJdC5vblN1Ym1pdC5hZGRUb1RvcChmdW5jdGlvbigpIHsNCgkJCQkJaWYgKHQuaW5pdGlhbGl6ZWQpIHsNCgkJCQkJCXQuc2F2ZSgpOw0KCQkJCQkJdC5pc05vdERpcnR5ID0gMTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5hZGRfdW5sb2FkX3RyaWdnZXIpIHsNCgkJCQl0Ll9iZWZvcmVVbmxvYWQgPSB0aW55TUNFLm9uQmVmb3JlVW5sb2FkLmFkZChmdW5jdGlvbigpIHsNCgkJCQkJaWYgKHQuaW5pdGlhbGl6ZWQgJiYgIXQuZGVzdHJveWVkICYmICF0LmlzSGlkZGVuKCkpDQoJCQkJCQl0LnNhdmUoe2Zvcm1hdCA6ICdyYXcnLCBub19ldmVudHMgOiB0cnVlfSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXRpbnltY2UuYWRkVW5sb2FkKHQuZGVzdHJveSwgdCk7DQoNCgkJCWlmIChzLnN1Ym1pdF9wYXRjaCkgew0KCQkJCXQub25CZWZvcmVSZW5kZXJVSS5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCXZhciBuID0gdC5nZXRFbGVtZW50KCkuZm9ybTsNCg0KCQkJCQlpZiAoIW4pDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJLy8gQWxyZWFkeSBwYXRjaGVkDQoJCQkJCWlmIChuLl9tY2VPbGRTdWJtaXQpDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJLy8gQ2hlY2sgcGFnZSB1c2VzIGlkPSJzdWJtaXQiIG9yIG5hbWU9InN1Ym1pdCIgZm9yIGl0J3Mgc3VibWl0IGJ1dHRvbg0KCQkJCQlpZiAoIW4uc3VibWl0Lm5vZGVUeXBlICYmICFuLnN1Ym1pdC5sZW5ndGgpIHsNCgkJCQkJCXQuZm9ybUVsZW1lbnQgPSBuOw0KCQkJCQkJbi5fbWNlT2xkU3VibWl0ID0gbi5zdWJtaXQ7DQoJCQkJCQluLnN1Ym1pdCA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJCS8vIFNhdmUgYWxsIGluc3RhbmNlcw0KCQkJCQkJCXRpbnltY2UudHJpZ2dlclNhdmUoKTsNCgkJCQkJCQl0LmlzTm90RGlydHkgPSAxOw0KDQoJCQkJCQkJcmV0dXJuIHQuZm9ybUVsZW1lbnQuX21jZU9sZFN1Ym1pdCh0LmZvcm1FbGVtZW50KTsNCgkJCQkJCX07DQoJCQkJCX0NCg0KCQkJCQluID0gbnVsbDsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gTG9hZCBzY3JpcHRzDQoJCQlmdW5jdGlvbiBsb2FkU2NyaXB0cygpIHsNCgkJCQlpZiAocy5sYW5ndWFnZSkNCgkJCQkJc2wuYWRkKHRpbnltY2UuYmFzZVVSTCArICcvbGFuZ3MvJyArIHMubGFuZ3VhZ2UgKyAnLmpzJyk7DQoNCgkJCQlpZiAocy50aGVtZSAmJiBzLnRoZW1lLmNoYXJBdCgwKSAhPSAnLScgJiYgIVRoZW1lTWFuYWdlci51cmxzW3MudGhlbWVdKQ0KCQkJCQlUaGVtZU1hbmFnZXIubG9hZChzLnRoZW1lLCAndGhlbWVzLycgKyBzLnRoZW1lICsgJy9lZGl0b3JfdGVtcGxhdGUnICsgdGlueW1jZS5zdWZmaXggKyAnLmpzJyk7DQoNCgkJCQllYWNoKGV4cGxvZGUocy5wbHVnaW5zKSwgZnVuY3Rpb24ocCkgew0KCQkJCQlpZiAocCAmJiBwLmNoYXJBdCgwKSAhPSAnLScgJiYgIVBsdWdpbk1hbmFnZXIudXJsc1twXSkgew0KCQkJCQkJLy8gU2tpcCBzYWZhcmkgcGx1Z2luLCBzaW5jZSBpdCBpcyByZW1vdmVkIGFzIG9mIDMuM2IxDQoJCQkJCQlpZiAocCA9PSAnc2FmYXJpJykNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCVBsdWdpbk1hbmFnZXIubG9hZChwLCAncGx1Z2lucy8nICsgcCArICcvZWRpdG9yX3BsdWdpbicgKyB0aW55bWNlLnN1ZmZpeCArICcuanMnKTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJLy8gSW5pdCB3aGVuIHF1ZSBpcyBsb2FkZWQNCgkJCQlzbC5sb2FkUXVldWUoZnVuY3Rpb24oKSB7DQoJCQkJCWlmICghdC5yZW1vdmVkKQ0KCQkJCQkJdC5pbml0KCk7DQoJCQkJfSk7DQoJCQl9Ow0KDQoJCQlsb2FkU2NyaXB0cygpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yIHRoaXMgd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuDQoJCSAqIGFsbCBwbHVnaW5zL3RoZW1lcyBhbmQgbGFuZ3VhZ2UgcGFja3MgYXJlIGxvYWRlZCBieSB0aGUgcmVuZGVyZWQgbWV0aG9kLg0KCQkgKiBUaGlzIG1ldGhvZCB3aWxsIHNldHVwIHRoZSBpZnJhbWUgYW5kIGNyZWF0ZSB0aGUgdGhlbWUgYW5kIHBsdWdpbiBpbnN0YW5jZXMuDQoJCSAqDQoJCSAqIEBtZXRob2QgaW5pdA0KCQkgKi8NCgkJaW5pdCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIG4sIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgdywgaCwgZSA9IHQuZ2V0RWxlbWVudCgpLCBvLCB0aSwgdSwgYmksIGJjLCByZTsNCg0KCQkJdGlueW1jZS5hZGQodCk7DQoNCgkJCS8qKg0KCQkJICogUmVmZXJlbmNlIHRvIHRoZSB0aGVtZSBpbnN0YW5jZSB0aGF0IHdhcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBVSS4gDQoJCQkgKg0KCQkJICogQHByb3BlcnR5IHRoZW1lDQoJCQkgKiBAdHlwZSB0aW55bWNlLlRoZW1lDQoJCQkgKi8NCgkJCWlmIChzLnRoZW1lKSB7DQoJCQkJcy50aGVtZSA9IHMudGhlbWUucmVwbGFjZSgvLS8sICcnKTsNCgkJCQlvID0gVGhlbWVNYW5hZ2VyLmdldChzLnRoZW1lKTsNCgkJCQl0LnRoZW1lID0gbmV3IG8oKTsNCg0KCQkJCWlmICh0LnRoZW1lLmluaXQgJiYgcy5pbml0X3RoZW1lKQ0KCQkJCQl0LnRoZW1lLmluaXQodCwgVGhlbWVNYW5hZ2VyLnVybHNbcy50aGVtZV0gfHwgdGlueW1jZS5kb2N1bWVudEJhc2VVUkwucmVwbGFjZSgvXC8kLywgJycpKTsNCgkJCX0NCg0KCQkJLy8gQ3JlYXRlIGFsbCBwbHVnaW5zDQoJCQllYWNoKGV4cGxvZGUocy5wbHVnaW5zLnJlcGxhY2UoL1wtL2csICcnKSksIGZ1bmN0aW9uKHApIHsNCgkJCQl2YXIgYyA9IFBsdWdpbk1hbmFnZXIuZ2V0KHApLCB1ID0gUGx1Z2luTWFuYWdlci51cmxzW3BdIHx8IHRpbnltY2UuZG9jdW1lbnRCYXNlVVJMLnJlcGxhY2UoL1wvJC8sICcnKSwgcG87DQoNCgkJCQlpZiAoYykgew0KCQkJCQlwbyA9IG5ldyBjKHQsIHUpOw0KDQoJCQkJCXQucGx1Z2luc1twXSA9IHBvOw0KDQoJCQkJCWlmIChwby5pbml0KQ0KCQkJCQkJcG8uaW5pdCh0LCB1KTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJLy8gU2V0dXAgcG9wdXAgQ1NTIHBhdGgocykNCgkJCWlmIChzLnBvcHVwX2NzcyAhPT0gZmFsc2UpIHsNCgkJCQlpZiAocy5wb3B1cF9jc3MpDQoJCQkJCXMucG9wdXBfY3NzID0gdC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShzLnBvcHVwX2Nzcyk7DQoJCQkJZWxzZQ0KCQkJCQlzLnBvcHVwX2NzcyA9IHQuYmFzZVVSSS50b0Fic29sdXRlKCJ0aGVtZXMvIiArIHMudGhlbWUgKyAiL3NraW5zLyIgKyBzLnNraW4gKyAiL2RpYWxvZy5jc3MiKTsNCgkJCX0NCg0KCQkJaWYgKHMucG9wdXBfY3NzX2FkZCkNCgkJCQlzLnBvcHVwX2NzcyArPSAnLCcgKyB0LmRvY3VtZW50QmFzZVVSSS50b0Fic29sdXRlKHMucG9wdXBfY3NzX2FkZCk7DQoNCgkJCS8qKg0KCQkJICogQ29udHJvbCBtYW5hZ2VyIGluc3RhbmNlIGZvciB0aGUgZWRpdG9yLiBXaWxsIGVuYWJsZXMgeW91IHRvIGNyZWF0ZSBuZXcgVUkgZWxlbWVudHMgYW5kIGNoYW5nZSB0aGVpciBzdGF0ZXMgZXRjLg0KCQkJICoNCgkJCSAqIEBwcm9wZXJ0eSBjb250cm9sTWFuYWdlcg0KCQkJICogQHR5cGUgdGlueW1jZS5Db250cm9sTWFuYWdlcg0KCQkJICovDQoJCQl0LmNvbnRyb2xNYW5hZ2VyID0gbmV3IHRpbnltY2UuQ29udHJvbE1hbmFnZXIodCk7DQoNCgkJCWlmIChzLmN1c3RvbV91bmRvX3JlZG8pIHsNCgkJCQkvLyBBZGQgaW5pdGlhbCB1bmRvIGxldmVsDQoJCQkJdC5vbkJlZm9yZUV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihlZCwgY21kLCB1aSwgdmFsLCBhKSB7DQoJCQkJCWlmIChjbWQgIT0gJ1VuZG8nICYmIGNtZCAhPSAnUmVkbycgJiYgY21kICE9ICdtY2VSZXBhaW50JyAmJiAoIWEgfHwgIWEuc2tpcF91bmRvKSkgew0KCQkJCQkJaWYgKCF0LnVuZG9NYW5hZ2VyLmhhc1VuZG8oKSkNCgkJCQkJCQl0LnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQl0Lm9uRXhlY0NvbW1hbmQuYWRkKGZ1bmN0aW9uKGVkLCBjbWQsIHVpLCB2YWwsIGEpIHsNCgkJCQkJaWYgKGNtZCAhPSAnVW5kbycgJiYgY21kICE9ICdSZWRvJyAmJiBjbWQgIT0gJ21jZVJlcGFpbnQnICYmICghYSB8fCAhYS5za2lwX3VuZG8pKQ0KCQkJCQkJdC51bmRvTWFuYWdlci5hZGQoKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJdC5vbkV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihlZCwgYykgew0KCQkJCS8vIERvbid0IHJlZnJlc2ggdGhlIHNlbGVjdCBsaXN0cyB1bnRpbCBjYXJldCBtb3ZlDQoJCQkJaWYgKCEvXihGb250TmFtZXxGb250U2l6ZSkkLy50ZXN0KGMpKQ0KCQkJCQl0Lm5vZGVDaGFuZ2VkKCk7DQoJCQl9KTsNCg0KCQkJLy8gUmVtb3ZlIGdob3N0IHNlbGVjdGlvbnMgb24gaW1hZ2VzIGFuZCB0YWJsZXMgaW4gR2Vja28NCgkJCWlmIChpc0dlY2tvKSB7DQoJCQkJZnVuY3Rpb24gcmVwYWludChhLCBvKSB7DQoJCQkJCWlmICghbyB8fCAhby5pbml0aWFsKQ0KCQkJCQkJdC5leGVjQ29tbWFuZCgnbWNlUmVwYWludCcpOw0KCQkJCX07DQoNCgkJCQl0Lm9uVW5kby5hZGQocmVwYWludCk7DQoJCQkJdC5vblJlZG8uYWRkKHJlcGFpbnQpOw0KCQkJCXQub25TZXRDb250ZW50LmFkZChyZXBhaW50KTsNCgkJCX0NCg0KCQkJLy8gRW5hYmxlcyB1c2VycyB0byBvdmVycmlkZSB0aGUgY29udHJvbCBmYWN0b3J5DQoJCQl0Lm9uQmVmb3JlUmVuZGVyVUkuZGlzcGF0Y2godCwgdC5jb250cm9sTWFuYWdlcik7DQoNCgkJCS8vIE1lYXN1cmUgYm94DQoJCQlpZiAocy5yZW5kZXJfdWkpIHsNCgkJCQl3ID0gcy53aWR0aCB8fCBlLnN0eWxlLndpZHRoIHx8IGUub2Zmc2V0V2lkdGg7DQoJCQkJaCA9IHMuaGVpZ2h0IHx8IGUuc3R5bGUuaGVpZ2h0IHx8IGUub2Zmc2V0SGVpZ2h0Ow0KCQkJCXQub3JnRGlzcGxheSA9IGUuc3R5bGUuZGlzcGxheTsNCgkJCQlyZSA9IC9eWzAtOVwuXSsofHB4KSQvaTsNCg0KCQkJCWlmIChyZS50ZXN0KCcnICsgdykpDQoJCQkJCXcgPSBNYXRoLm1heChwYXJzZUludCh3KSArIChvLmRlbHRhV2lkdGggfHwgMCksIDEwMCk7DQoNCgkJCQlpZiAocmUudGVzdCgnJyArIGgpKQ0KCQkJCQloID0gTWF0aC5tYXgocGFyc2VJbnQoaCkgKyAoby5kZWx0YUhlaWdodCB8fCAwKSwgMTAwKTsNCg0KCQkJCS8vIFJlbmRlciBVSQ0KCQkJCW8gPSB0LnRoZW1lLnJlbmRlclVJKHsNCgkJCQkJdGFyZ2V0Tm9kZSA6IGUsDQoJCQkJCXdpZHRoIDogdywNCgkJCQkJaGVpZ2h0IDogaCwNCgkJCQkJZGVsdGFXaWR0aCA6IHMuZGVsdGFfd2lkdGgsDQoJCQkJCWRlbHRhSGVpZ2h0IDogcy5kZWx0YV9oZWlnaHQNCgkJCQl9KTsNCg0KCQkJCXQuZWRpdG9yQ29udGFpbmVyID0gby5lZGl0b3JDb250YWluZXI7DQoJCQl9DQoNCgkJCS8vICNpZmRlZiBjb250ZW50RWRpdGFibGUNCg0KCQkJLy8gQ29udGVudCBlZGl0YWJsZSBtb2RlIGVuZHMgaGVyZQ0KCQkJaWYgKHMuY29udGVudF9lZGl0YWJsZSkgew0KCQkJCWUgPSBuID0gbyA9IG51bGw7IC8vIEZpeCBJRSBsZWFrDQoJCQkJcmV0dXJuIHQuc2V0dXBDb250ZW50RWRpdGFibGUoKTsNCgkJCX0NCg0KCQkJLy8gI2VuZGlmDQoNCgkJCS8vIFVzZXIgc3BlY2lmaWVkIGEgZG9jdW1lbnQuZG9tYWluIHZhbHVlDQoJCQlpZiAoZG9jdW1lbnQuZG9tYWluICYmIGxvY2F0aW9uLmhvc3RuYW1lICE9IGRvY3VtZW50LmRvbWFpbikNCgkJCQl0aW55bWNlLnJlbGF4ZWREb21haW4gPSBkb2N1bWVudC5kb21haW47DQoNCgkJCS8vIFJlc2l6ZSBlZGl0b3INCgkJCURPTS5zZXRTdHlsZXMoby5zaXplQ29udGFpbmVyIHx8IG8uZWRpdG9yQ29udGFpbmVyLCB7DQoJCQkJd2lkdGggOiB3LA0KCQkJCWhlaWdodCA6IGgNCgkJCX0pOw0KDQoJCQloID0gKG8uaWZyYW1lSGVpZ2h0IHx8IGgpICsgKHR5cGVvZihoKSA9PSAnbnVtYmVyJyA/IChvLmRlbHRhSGVpZ2h0IHx8IDApIDogJycpOw0KCQkJaWYgKGggPCAxMDApDQoJCQkJaCA9IDEwMDsNCg0KCQkJdC5pZnJhbWVIVE1MID0gcy5kb2N0eXBlICsgJzxodG1sPjxoZWFkIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4nOw0KDQoJCQkvLyBXZSBvbmx5IG5lZWQgdG8gb3ZlcnJpZGUgcGF0aHMgaWYgd2UgaGF2ZSB0bw0KCQkJLy8gSUUgaGFzIGEgYnVnIHdoZXJlIGl0IHJlbW92ZSBzaXRlIGFic29sdXRlIHVybHMgdG8gcmVsYXRpdmUgb25lcyBpZiB0aGlzIGlzIHNwZWNpZmllZA0KCQkJaWYgKHMuZG9jdW1lbnRfYmFzZV91cmwgIT0gdGlueW1jZS5kb2N1bWVudEJhc2VVUkwpDQoJCQkJdC5pZnJhbWVIVE1MICs9ICc8YmFzZSBocmVmPSInICsgdC5kb2N1bWVudEJhc2VVUkkuZ2V0VVJJKCkgKyAnIiAvPic7DQoNCgkJCXQuaWZyYW1lSFRNTCArPSAnPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT03IiAvPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPic7DQoNCgkJCWlmICh0aW55bWNlLnJlbGF4ZWREb21haW4pDQoJCQkJdC5pZnJhbWVIVE1MICs9ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZG9jdW1lbnQuZG9tYWluID0gIicgKyB0aW55bWNlLnJlbGF4ZWREb21haW4gKyAnIjs8L3NjcmlwdD4nOw0KDQoJCQliaSA9IHMuYm9keV9pZCB8fCAndGlueW1jZSc7DQoJCQlpZiAoYmkuaW5kZXhPZignPScpICE9IC0xKSB7DQoJCQkJYmkgPSB0LmdldFBhcmFtKCdib2R5X2lkJywgJycsICdoYXNoJyk7DQoJCQkJYmkgPSBiaVt0LmlkXSB8fCBiaTsNCgkJCX0NCg0KCQkJYmMgPSBzLmJvZHlfY2xhc3MgfHwgJyc7DQoJCQlpZiAoYmMuaW5kZXhPZignPScpICE9IC0xKSB7DQoJCQkJYmMgPSB0LmdldFBhcmFtKCdib2R5X2NsYXNzJywgJycsICdoYXNoJyk7DQoJCQkJYmMgPSBiY1t0LmlkXSB8fCAnJzsNCgkJCX0NCg0KCQkJdC5pZnJhbWVIVE1MICs9ICc8L2hlYWQ+PGJvZHkgaWQ9IicgKyBiaSArICciIGNsYXNzPSJtY2VDb250ZW50Qm9keSAnICsgYmMgKyAnIj48L2JvZHk+PC9odG1sPic7DQoNCgkJCS8vIERvbWFpbiByZWxheGluZyBlbmFibGVkLCB0aGVuIHNldCBkb2N1bWVudCBkb21haW4NCgkJCWlmICh0aW55bWNlLnJlbGF4ZWREb21haW4pIHsNCgkJCQkvLyBXZSBuZWVkIHRvIHdyaXRlIHRoZSBjb250ZW50cyBoZXJlIGluIElFIHNpbmNlIG11bHRpcGxlIHdyaXRlcyBtZXNzZXMgdXAgcmVmcmVzaCBidXR0b24gYW5kIGJhY2sgYnV0dG9uDQoJCQkJaWYgKGlzSUUgfHwgKHRpbnltY2UuaXNPcGVyYSAmJiBwYXJzZUZsb2F0KG9wZXJhLnZlcnNpb24oKSkgPj0gOS41KSkNCgkJCQkJdSA9ICdqYXZhc2NyaXB0OihmdW5jdGlvbigpe2RvY3VtZW50Lm9wZW4oKTtkb2N1bWVudC5kb21haW49IicgKyBkb2N1bWVudC5kb21haW4gKyAnIjt2YXIgZWQgPSB3aW5kb3cucGFyZW50LnRpbnlNQ0UuZ2V0KCInICsgdC5pZCArICciKTtkb2N1bWVudC53cml0ZShlZC5pZnJhbWVIVE1MKTtkb2N1bWVudC5jbG9zZSgpO2VkLnNldHVwSWZyYW1lKCk7fSkoKSc7DQoJCQkJZWxzZSBpZiAodGlueW1jZS5pc09wZXJhKQ0KCQkJCQl1ID0gJ2phdmFzY3JpcHQ6KGZ1bmN0aW9uKCl7ZG9jdW1lbnQub3BlbigpO2RvY3VtZW50LmRvbWFpbj0iJyArIGRvY3VtZW50LmRvbWFpbiArICciO2RvY3VtZW50LmNsb3NlKCk7ZWQuc2V0dXBJZnJhbWUoKTt9KSgpJzsJCQkJCQ0KCQkJfQ0KDQoJCQkvLyBDcmVhdGUgaWZyYW1lDQoJCQluID0gRE9NLmFkZChvLmlmcmFtZUNvbnRhaW5lciwgJ2lmcmFtZScsIHsNCgkJCQlpZCA6IHQuaWQgKyAiX2lmciIsDQoJCQkJc3JjIDogdSB8fCAnamF2YXNjcmlwdDoiIicsIC8vIFdvcmthcm91bmQgZm9yIEhUVFBTIHdhcm5pbmcgaW4gSUU2LzcNCgkJCQlmcmFtZUJvcmRlciA6ICcwJywNCgkJCQlzdHlsZSA6IHsNCgkJCQkJd2lkdGggOiAnMTAwJScsDQoJCQkJCWhlaWdodCA6IGgNCgkJCQl9DQoJCQl9KTsNCg0KCQkJdC5jb250ZW50QXJlYUNvbnRhaW5lciA9IG8uaWZyYW1lQ29udGFpbmVyOw0KCQkJRE9NLmdldChvLmVkaXRvckNvbnRhaW5lcikuc3R5bGUuZGlzcGxheSA9IHQub3JnRGlzcGxheTsNCgkJCURPTS5nZXQodC5pZCkuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCg0KCQkJaWYgKCFpc0lFIHx8ICF0aW55bWNlLnJlbGF4ZWREb21haW4pDQoJCQkJdC5zZXR1cElmcmFtZSgpOw0KDQoJCQllID0gbiA9IG8gPSBudWxsOyAvLyBDbGVhbnVwDQoJCX0sDQoNCgkJLyoqDQoJCSAqIFRoaXMgbWV0aG9kIGdldCBjYWxsZWQgYnkgdGhlIGluaXQgbWV0aG9kIG9uZXMgdGhlIGlmcmFtZSBpcyBsb2FkZWQuDQoJCSAqIEl0IHdpbGwgZmlsbCB0aGUgaWZyYW1lIHdpdGggY29udGVudHMsIHNldHVwcyBET00gYW5kIHNlbGVjdGlvbiBvYmplY3RzIGZvciB0aGUgaWZyYW1lLg0KCQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4NCgkJICoNCgkJICogQG1ldGhvZCBzZXR1cElmcmFtZQ0KCQkgKi8NCgkJc2V0dXBJZnJhbWUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGUgPSBET00uZ2V0KHQuaWQpLCBkID0gdC5nZXREb2MoKSwgaCwgYjsNCg0KCQkJLy8gU2V0dXAgaWZyYW1lIGJvZHkNCgkJCWlmICghaXNJRSB8fCAhdGlueW1jZS5yZWxheGVkRG9tYWluKSB7DQoJCQkJZC5vcGVuKCk7DQoJCQkJZC53cml0ZSh0LmlmcmFtZUhUTUwpOw0KCQkJCWQuY2xvc2UoKTsNCgkJCX0NCg0KCQkJLy8gRGVzaWduIG1vZGUgbmVlZHMgdG8gYmUgYWRkZWQgaGVyZSBDdHJsK0Egd2lsbCBmYWlsIG90aGVyd2lzZQ0KCQkJaWYgKCFpc0lFKSB7DQoJCQkJdHJ5IHsNCgkJCQkJaWYgKCFzLnJlYWRvbmx5KQ0KCQkJCQkJZC5kZXNpZ25Nb2RlID0gJ09uJzsNCgkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkvLyBXaWxsIGZhaWwgb24gR2Vja28gaWYgdGhlIGVkaXRvciBpcyBwbGFjZWQgaW4gYW4gaGlkZGVuIGNvbnRhaW5lciBlbGVtZW50DQoJCQkJCS8vIFRoZSBkZXNpZ24gbW9kZSB3aWxsIGJlIHNldCBvbmVzIHRoZSBlZGl0b3IgaXMgZm9jdXNlZA0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gSUUgbmVlZHMgdG8gdXNlIGNvbnRlbnRFZGl0YWJsZSBvciBpdCB3aWxsIGRpc3BsYXkgbm9uIHNlY3VyZSBpdGVtcyBmb3IgSFRUUFMNCgkJCWlmIChpc0lFKSB7DQoJCQkJLy8gSXQgd2lsbCBub3Qgc3RlYWwgZm9jdXMgaWYgd2UgaGlkZSBpdCB3aGlsZSBzZXR0aW5nIGNvbnRlbnRFZGl0YWJsZQ0KCQkJCWIgPSB0LmdldEJvZHkoKTsNCgkJCQlET00uaGlkZShiKTsNCg0KCQkJCWlmICghcy5yZWFkb25seSkNCgkJCQkJYi5jb250ZW50RWRpdGFibGUgPSB0cnVlOw0KDQoJCQkJRE9NLnNob3coYik7DQoJCQl9DQoNCgkJCS8qKg0KCQkJICogRE9NIGluc3RhbmNlIGZvciB0aGUgZWRpdG9yLg0KCQkJICoNCgkJCSAqIEBwcm9wZXJ0eSBkb20NCgkJCSAqIEB0eXBlIHRpbnltY2UuZG9tLkRPTVV0aWxzDQoJCQkgKi8NCgkJCXQuZG9tID0gbmV3IHRpbnltY2UuZG9tLkRPTVV0aWxzKHQuZ2V0RG9jKCksIHsNCgkJCQlrZWVwX3ZhbHVlcyA6IHRydWUsDQoJCQkJdXJsX2NvbnZlcnRlciA6IHQuY29udmVydFVSTCwNCgkJCQl1cmxfY29udmVydGVyX3Njb3BlIDogdCwNCgkJCQloZXhfY29sb3JzIDogcy5mb3JjZV9oZXhfc3R5bGVfY29sb3JzLA0KCQkJCWNsYXNzX2ZpbHRlciA6IHMuY2xhc3NfZmlsdGVyLA0KCQkJCXVwZGF0ZV9zdHlsZXMgOiAxLA0KCQkJCWZpeF9pZV9wYXJhZ3JhcGhzIDogMSwNCgkJCQl2YWxpZF9zdHlsZXMgOiBzLnZhbGlkX3N0eWxlcw0KCQkJfSk7DQoNCgkJCS8qKg0KCQkJICogU2NoZW1hIGluc3RhbmNlLCBlbmFibGVzIHlvdSB0byB2YWxpZGF0ZSBlbGVtZW50cyBhbmQgaXQncyBjaGlsZHJlbi4NCgkJCSAqDQoJCQkgKiBAcHJvcGVydHkgc2NoZW1hDQoJCQkgKiBAdHlwZSB0aW55bWNlLmRvbS5TY2hlbWENCgkJCSAqLw0KCQkJdC5zY2hlbWEgPSBuZXcgdGlueW1jZS5kb20uU2NoZW1hKCk7DQoNCgkJCS8qKg0KCQkJICogRE9NIHNlcmlhbGl6ZXIgZm9yIHRoZSBlZGl0b3IuDQoJCQkgKg0KCQkJICogQHByb3BlcnR5IHNlcmlhbGl6ZXINCgkJCSAqIEB0eXBlIHRpbnltY2UuZG9tLlNlcmlhbGl6ZXINCgkJCSAqLw0KCQkJdC5zZXJpYWxpemVyID0gbmV3IHRpbnltY2UuZG9tLlNlcmlhbGl6ZXIoZXh0ZW5kKHMsIHsNCgkJCQl2YWxpZF9lbGVtZW50cyA6IHMudmVyaWZ5X2h0bWwgPT09IGZhbHNlID8gJypbKl0nIDogcy52YWxpZF9lbGVtZW50cywNCgkJCQlkb20gOiB0LmRvbSwNCgkJCQlzY2hlbWEgOiB0LnNjaGVtYQ0KCQkJfSkpOw0KDQoJCQkvKioNCgkJCSAqIFNlbGVjdGlvbiBpbnN0YW5jZSBmb3IgdGhlIGVkaXRvci4NCgkJCSAqDQoJCQkgKiBAcHJvcGVydHkgc2VsZWN0aW9uDQoJCQkgKiBAdHlwZSB0aW55bWNlLmRvbS5TZWxlY3Rpb24NCgkJCSAqLw0KCQkJdC5zZWxlY3Rpb24gPSBuZXcgdGlueW1jZS5kb20uU2VsZWN0aW9uKHQuZG9tLCB0LmdldFdpbigpLCB0LnNlcmlhbGl6ZXIpOw0KDQoJCQkvKioNCgkJCSAqIEZvcm1hdHRlciBpbnN0YW5jZS4NCgkJCSAqDQoJCQkgKiBAcHJvcGVydHkgZm9ybWF0dGVyDQoJCQkgKiBAdHlwZSB0aW55bWNlLkZvcm1hdHRlcg0KCQkJICovDQoJCQl0LmZvcm1hdHRlciA9IG5ldyB0aW55bWNlLkZvcm1hdHRlcih0aGlzKTsNCg0KCQkJLy8gUmVnaXN0ZXIgZGVmYXVsdCBmb3JtYXRzDQoJCQl0LmZvcm1hdHRlci5yZWdpc3Rlcih7DQoJCQkJYWxpZ25sZWZ0IDogWw0KCQkJCQl7c2VsZWN0b3IgOiAncCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGknLCBzdHlsZXMgOiB7dGV4dEFsaWduIDogJ2xlZnQnfX0sDQoJCQkJCXtzZWxlY3RvciA6ICdpbWcsdGFibGUnLCBzdHlsZXMgOiB7J2Zsb2F0JyA6ICdsZWZ0J319DQoJCQkJXSwNCg0KCQkJCWFsaWduY2VudGVyIDogWw0KCQkJCQl7c2VsZWN0b3IgOiAncCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGknLCBzdHlsZXMgOiB7dGV4dEFsaWduIDogJ2NlbnRlcid9fSwNCgkJCQkJe3NlbGVjdG9yIDogJ2ltZycsIHN0eWxlcyA6IHtkaXNwbGF5IDogJ2Jsb2NrJywgbWFyZ2luTGVmdCA6ICdhdXRvJywgbWFyZ2luUmlnaHQgOiAnYXV0byd9fSwNCgkJCQkJe3NlbGVjdG9yIDogJ3RhYmxlJywgc3R5bGVzIDoge21hcmdpbkxlZnQgOiAnYXV0bycsIG1hcmdpblJpZ2h0IDogJ2F1dG8nfX0NCgkJCQldLA0KDQoJCQkJYWxpZ25yaWdodCA6IFsNCgkJCQkJe3NlbGVjdG9yIDogJ3AsaDEsaDIsaDMsaDQsaDUsaDYsdGQsdGgsZGl2LHVsLG9sLGxpJywgc3R5bGVzIDoge3RleHRBbGlnbiA6ICdyaWdodCd9fSwNCgkJCQkJe3NlbGVjdG9yIDogJ2ltZyx0YWJsZScsIHN0eWxlcyA6IHsnZmxvYXQnIDogJ3JpZ2h0J319DQoJCQkJXSwNCg0KCQkJCWFsaWduZnVsbCA6IFsNCgkJCQkJe3NlbGVjdG9yIDogJ3AsaDEsaDIsaDMsaDQsaDUsaDYsdGQsdGgsZGl2LHVsLG9sLGxpJywgc3R5bGVzIDoge3RleHRBbGlnbiA6ICdqdXN0aWZ5J319DQoJCQkJXSwNCg0KCQkJCWJvbGQgOiBbDQoJCQkJCXtpbmxpbmUgOiAnc3Ryb25nJ30sDQoJCQkJCXtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHtmb250V2VpZ2h0IDogJ2JvbGQnfX0sDQoJCQkJCXtpbmxpbmUgOiAnYid9DQoJCQkJXSwNCg0KCQkJCWl0YWxpYyA6IFsNCgkJCQkJe2lubGluZSA6ICdlbSd9LA0KCQkJCQl7aW5saW5lIDogJ3NwYW4nLCBzdHlsZXMgOiB7Zm9udFN0eWxlIDogJ2l0YWxpYyd9fSwNCgkJCQkJe2lubGluZSA6ICdpJ30NCgkJCQldLA0KDQoJCQkJdW5kZXJsaW5lIDogWw0KCQkJCQl7aW5saW5lIDogJ3NwYW4nLCBzdHlsZXMgOiB7dGV4dERlY29yYXRpb24gOiAndW5kZXJsaW5lJ30sIGV4YWN0IDogdHJ1ZX0sDQoJCQkJCXtpbmxpbmUgOiAndSd9DQoJCQkJXSwNCg0KCQkJCXN0cmlrZXRocm91Z2ggOiBbDQoJCQkJCXtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHt0ZXh0RGVjb3JhdGlvbiA6ICdsaW5lLXRocm91Z2gnfSwgZXhhY3QgOiB0cnVlfSwNCgkJCQkJe2lubGluZSA6ICd1J30NCgkJCQldLA0KDQoJCQkJZm9yZWNvbG9yIDoge2lubGluZSA6ICdzcGFuJywgc3R5bGVzIDoge2NvbG9yIDogJyV2YWx1ZSd9LCB3cmFwX2xpbmtzIDogZmFsc2V9LA0KCQkJCWhpbGl0ZWNvbG9yIDoge2lubGluZSA6ICdzcGFuJywgc3R5bGVzIDoge2JhY2tncm91bmRDb2xvciA6ICcldmFsdWUnfSwgd3JhcF9saW5rcyA6IGZhbHNlfSwNCgkJCQlmb250bmFtZSA6IHtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHtmb250RmFtaWx5IDogJyV2YWx1ZSd9fSwNCgkJCQlmb250c2l6ZSA6IHtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHtmb250U2l6ZSA6ICcldmFsdWUnfX0sDQoJCQkJZm9udHNpemVfY2xhc3MgOiB7aW5saW5lIDogJ3NwYW4nLCBhdHRyaWJ1dGVzIDogeydjbGFzcycgOiAnJXZhbHVlJ319LA0KCQkJCWJsb2NrcXVvdGUgOiB7YmxvY2sgOiAnYmxvY2txdW90ZScsIHdyYXBwZXIgOiAxLCByZW1vdmUgOiAnYWxsJ30sDQoNCgkJCQlyZW1vdmVmb3JtYXQgOiBbDQoJCQkJCXtzZWxlY3RvciA6ICdiLHN0cm9uZyxlbSxpLGZvbnQsdSxzdHJpa2UnLCByZW1vdmUgOiAnYWxsJywgc3BsaXQgOiB0cnVlLCBleHBhbmQgOiBmYWxzZSwgYmxvY2tfZXhwYW5kIDogdHJ1ZSwgZGVlcCA6IHRydWV9LA0KCQkJCQl7c2VsZWN0b3IgOiAnc3BhbicsIGF0dHJpYnV0ZXMgOiBbJ3N0eWxlJywgJ2NsYXNzJ10sIHJlbW92ZSA6ICdlbXB0eScsIHNwbGl0IDogdHJ1ZSwgZXhwYW5kIDogZmFsc2UsIGRlZXAgOiB0cnVlfSwNCgkJCQkJe3NlbGVjdG9yIDogJyonLCBhdHRyaWJ1dGVzIDogWydzdHlsZScsICdjbGFzcyddLCBzcGxpdCA6IGZhbHNlLCBleHBhbmQgOiBmYWxzZSwgZGVlcCA6IHRydWV9DQoJCQkJXQ0KCQkJfSk7DQoNCgkJCS8vIFJlZ2lzdGVyIGRlZmF1bHQgYmxvY2sgZm9ybWF0cw0KCQkJZWFjaCgncCBoMSBoMiBoMyBoNCBoNSBoNiBkaXYgYWRkcmVzcyBwcmUgZGl2IGNvZGUgZHQgZGQgc2FtcCcuc3BsaXQoL1xzLyksIGZ1bmN0aW9uKG5hbWUpIHsNCgkJCQl0LmZvcm1hdHRlci5yZWdpc3RlcihuYW1lLCB7YmxvY2sgOiBuYW1lLCByZW1vdmUgOiAnYWxsJ30pOw0KCQkJfSk7DQoNCgkJCS8vIFJlZ2lzdGVyIHVzZXIgZGVmaW5lZCBmb3JtYXRzDQoJCQl0LmZvcm1hdHRlci5yZWdpc3Rlcih0LnNldHRpbmdzLmZvcm1hdHMpOw0KDQoJCQkvKioNCgkJCSAqIFVuZG8gbWFuYWdlciBpbnN0YW5jZSwgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHVuZG8gbGV2ZWxzLiANCgkJCSAqDQoJCQkgKiBAcHJvcGVydHkgdW5kb01hbmFnZXINCgkJCSAqIEB0eXBlIHRpbnltY2UuVW5kb01hbmFnZXINCgkJCSAqLw0KCQkJdC51bmRvTWFuYWdlciA9IG5ldyB0aW55bWNlLlVuZG9NYW5hZ2VyKHQpOw0KDQoJCQkvLyBQYXNzIHRocm91Z2gNCgkJCXQudW5kb01hbmFnZXIub25BZGQuYWRkKGZ1bmN0aW9uKHVtLCBsKSB7DQoJCQkJaWYgKCFsLmluaXRpYWwpDQoJCQkJCXJldHVybiB0Lm9uQ2hhbmdlLmRpc3BhdGNoKHQsIGwsIHVtKTsNCgkJCX0pOw0KDQoJCQl0LnVuZG9NYW5hZ2VyLm9uVW5kby5hZGQoZnVuY3Rpb24odW0sIGwpIHsNCgkJCQlyZXR1cm4gdC5vblVuZG8uZGlzcGF0Y2godCwgbCwgdW0pOw0KCQkJfSk7DQoNCgkJCXQudW5kb01hbmFnZXIub25SZWRvLmFkZChmdW5jdGlvbih1bSwgbCkgew0KCQkJCXJldHVybiB0Lm9uUmVkby5kaXNwYXRjaCh0LCBsLCB1bSk7DQoJCQl9KTsNCg0KCQkJdC5mb3JjZUJsb2NrcyA9IG5ldyB0aW55bWNlLkZvcmNlQmxvY2tzKHQsIHsNCgkJCQlmb3JjZWRfcm9vdF9ibG9jayA6IHMuZm9yY2VkX3Jvb3RfYmxvY2sNCgkJCX0pOw0KDQoJCQl0LmVkaXRvckNvbW1hbmRzID0gbmV3IHRpbnltY2UuRWRpdG9yQ29tbWFuZHModCk7DQoNCgkJCS8vIFBhc3MgdGhyb3VnaA0KCQkJdC5zZXJpYWxpemVyLm9uUHJlUHJvY2Vzcy5hZGQoZnVuY3Rpb24oc2UsIG8pIHsNCgkJCQlyZXR1cm4gdC5vblByZVByb2Nlc3MuZGlzcGF0Y2godCwgbywgc2UpOw0KCQkJfSk7DQoNCgkJCXQuc2VyaWFsaXplci5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihzZSwgbykgew0KCQkJCXJldHVybiB0Lm9uUG9zdFByb2Nlc3MuZGlzcGF0Y2godCwgbywgc2UpOw0KCQkJfSk7DQoNCgkJCXQub25QcmVJbml0LmRpc3BhdGNoKHQpOw0KDQoJCQlpZiAoIXMuZ2Vja29fc3BlbGxjaGVjaykNCgkJCQl0LmdldEJvZHkoKS5zcGVsbGNoZWNrID0gMDsNCg0KCQkJaWYgKCFzLnJlYWRvbmx5KQ0KCQkJCXQuX2FkZEV2ZW50cygpOw0KDQoJCQl0LmNvbnRyb2xNYW5hZ2VyLm9uUG9zdFJlbmRlci5kaXNwYXRjaCh0LCB0LmNvbnRyb2xNYW5hZ2VyKTsNCgkJCXQub25Qb3N0UmVuZGVyLmRpc3BhdGNoKHQpOw0KDQoJCQlpZiAocy5kaXJlY3Rpb25hbGl0eSkNCgkJCQl0LmdldEJvZHkoKS5kaXIgPSBzLmRpcmVjdGlvbmFsaXR5Ow0KDQoJCQlpZiAocy5ub3dyYXApDQoJCQkJdC5nZXRCb2R5KCkuc3R5bGUud2hpdGVTcGFjZSA9ICJub3dyYXAiOw0KDQoJCQlpZiAocy5jdXN0b21fZWxlbWVudHMpIHsNCgkJCQlmdW5jdGlvbiBoYW5kbGVDdXN0b20oZWQsIG8pIHsNCgkJCQkJZWFjaChleHBsb2RlKHMuY3VzdG9tX2VsZW1lbnRzKSwgZnVuY3Rpb24odikgew0KCQkJCQkJdmFyIG47DQoNCgkJCQkJCWlmICh2LmluZGV4T2YoJ34nKSA9PT0gMCkgew0KCQkJCQkJCXYgPSB2LnN1YnN0cmluZygxKTsNCgkJCQkJCQluID0gJ3NwYW4nOw0KCQkJCQkJfSBlbHNlDQoJCQkJCQkJbiA9ICdkaXYnOw0KDQoJCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZShuZXcgUmVnRXhwKCc8KCcgKyB2ICsgJykoW14+XSopPicsICdnJyksICc8JyArIG4gKyAnIF9tY2VfbmFtZT0iJDEiJDI+Jyk7DQoJCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZShuZXcgUmVnRXhwKCc8LygnICsgdiArICcpPicsICdnJyksICc8LycgKyBuICsgJz4nKTsNCgkJCQkJfSk7DQoJCQkJfTsNCg0KCQkJCXQub25CZWZvcmVTZXRDb250ZW50LmFkZChoYW5kbGVDdXN0b20pOw0KCQkJCXQub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJaWYgKG8uc2V0KQ0KCQkJCQkJaGFuZGxlQ3VzdG9tKGVkLCBvKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuaGFuZGxlX25vZGVfY2hhbmdlX2NhbGxiYWNrKSB7DQoJCQkJdC5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKGVkLCBjbSwgbikgew0KCQkJCQl0LmV4ZWNDYWxsYmFjaygnaGFuZGxlX25vZGVfY2hhbmdlX2NhbGxiYWNrJywgdC5pZCwgbiwgLTEsIC0xLCB0cnVlLCB0LnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuc2F2ZV9jYWxsYmFjaykgew0KCQkJCXQub25TYXZlQ29udGVudC5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJdmFyIGggPSB0LmV4ZWNDYWxsYmFjaygnc2F2ZV9jYWxsYmFjaycsIHQuaWQsIG8uY29udGVudCwgdC5nZXRCb2R5KCkpOw0KDQoJCQkJCWlmIChoKQ0KCQkJCQkJby5jb250ZW50ID0gaDsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMub25jaGFuZ2VfY2FsbGJhY2spIHsNCgkJCQl0Lm9uQ2hhbmdlLmFkZChmdW5jdGlvbihlZCwgbCkgew0KCQkJCQl0LmV4ZWNDYWxsYmFjaygnb25jaGFuZ2VfY2FsbGJhY2snLCB0LCBsKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuY29udmVydF9uZXdsaW5lc190b19icnMpIHsNCgkJCQl0Lm9uQmVmb3JlU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJaWYgKG8uaW5pdGlhbCkNCgkJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKC9ccj9cbi9nLCAnPGJyIC8+Jyk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmZpeF9uZXN0aW5nICYmIGlzSUUpIHsNCgkJCQl0Lm9uQmVmb3JlU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJby5jb250ZW50ID0gdC5fZml4TmVzdGluZyhvLmNvbnRlbnQpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5wcmVmb3JtYXR0ZWQpIHsNCgkJCQl0Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKC9eXHMqPHByZS4qPz4vLCAnJyk7DQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKC88XC9wcmU+XHMqJC8sICcnKTsNCg0KCQkJCQlpZiAoby5zZXQpDQoJCQkJCQlvLmNvbnRlbnQgPSAnPHByZSBjbGFzcz0ibWNlSXRlbUhpZGRlbiI+JyArIG8uY29udGVudCArICc8L3ByZT4nOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy52ZXJpZnlfY3NzX2NsYXNzZXMpIHsNCgkJCQl0LnNlcmlhbGl6ZXIuYXR0cmliVmFsdWVGaWx0ZXIgPSBmdW5jdGlvbihuLCB2KSB7DQoJCQkJCXZhciBzLCBjbDsNCg0KCQkJCQlpZiAobiA9PSAnY2xhc3MnKSB7DQoJCQkJCQkvLyBCdWlsZCByZWdleHAgZm9yIGNsYXNzZXMNCgkJCQkJCWlmICghdC5jbGFzc2VzUkUpIHsNCgkJCQkJCQljbCA9IHQuZG9tLmdldENsYXNzZXMoKTsNCg0KCQkJCQkJCWlmIChjbC5sZW5ndGggPiAwKSB7DQoJCQkJCQkJCXMgPSAnJzsNCg0KCQkJCQkJCQllYWNoIChjbCwgZnVuY3Rpb24obykgew0KCQkJCQkJCQkJcyArPSAocyA/ICd8JyA6ICcnKSArIG9bJ2NsYXNzJ107DQoJCQkJCQkJCX0pOw0KDQoJCQkJCQkJCXQuY2xhc3Nlc1JFID0gbmV3IFJlZ0V4cCgnKCcgKyBzICsgJyknLCAnZ2knKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCXJldHVybiAhdC5jbGFzc2VzUkUgfHwgLyhcYm1jZUl0ZW1cdytcYnxcYm1jZVRlbXBcdytcYikvZy50ZXN0KHYpIHx8IHQuY2xhc3Nlc1JFLnRlc3QodikgPyB2IDogJyc7DQoJCQkJCX0NCg0KCQkJCQlyZXR1cm4gdjsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQlpZiAocy5jbGVhbnVwX2NhbGxiYWNrKSB7DQoJCQkJdC5vbkJlZm9yZVNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCW8uY29udGVudCA9IHQuZXhlY0NhbGxiYWNrKCdjbGVhbnVwX2NhbGxiYWNrJywgJ2luc2VydF90b19lZGl0b3InLCBvLmNvbnRlbnQsIG8pOw0KCQkJCX0pOw0KDQoJCQkJdC5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCWlmIChvLnNldCkNCgkJCQkJCXQuZXhlY0NhbGxiYWNrKCdjbGVhbnVwX2NhbGxiYWNrJywgJ2luc2VydF90b19lZGl0b3JfZG9tJywgby5ub2RlLCBvKTsNCg0KCQkJCQlpZiAoby5nZXQpDQoJCQkJCQl0LmV4ZWNDYWxsYmFjaygnY2xlYW51cF9jYWxsYmFjaycsICdnZXRfZnJvbV9lZGl0b3JfZG9tJywgby5ub2RlLCBvKTsNCgkJCQl9KTsNCg0KCQkJCXQub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJaWYgKG8uc2V0KQ0KCQkJCQkJby5jb250ZW50ID0gdC5leGVjQ2FsbGJhY2soJ2NsZWFudXBfY2FsbGJhY2snLCAnaW5zZXJ0X3RvX2VkaXRvcicsIG8uY29udGVudCwgbyk7DQoNCgkJCQkJaWYgKG8uZ2V0KQkJCQkJCQ0KCQkJCQkJby5jb250ZW50ID0gdC5leGVjQ2FsbGJhY2soJ2NsZWFudXBfY2FsbGJhY2snLCAnZ2V0X2Zyb21fZWRpdG9yJywgby5jb250ZW50LCBvKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuc2F2ZV9jYWxsYmFjaykgew0KCQkJCXQub25HZXRDb250ZW50LmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlpZiAoby5zYXZlKQ0KCQkJCQkJby5jb250ZW50ID0gdC5leGVjQ2FsbGJhY2soJ3NhdmVfY2FsbGJhY2snLCB0LmlkLCBvLmNvbnRlbnQsIHQuZ2V0Qm9keSgpKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuaGFuZGxlX2V2ZW50X2NhbGxiYWNrKSB7DQoJCQkJdC5vbkV2ZW50LmFkZChmdW5jdGlvbihlZCwgZSwgbykgew0KCQkJCQlpZiAodC5leGVjQ2FsbGJhY2soJ2hhbmRsZV9ldmVudF9jYWxsYmFjaycsIGUsIGVkLCBvKSA9PT0gZmFsc2UpDQoJCQkJCQlFdmVudC5jYW5jZWwoZSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCS8vIEFkZCB2aXN1YWwgYWlkcyB3aGVuIG5ldyBjb250ZW50cyBpcyBhZGRlZA0KCQkJdC5vblNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCXQuYWRkVmlzdWFsKHQuZ2V0Qm9keSgpKTsNCgkJCX0pOw0KDQoJCQkvLyBSZW1vdmUgZW1wdHkgY29udGVudHMNCgkJCWlmIChzLnBhZGRfZW1wdHlfZWRpdG9yKSB7DQoJCQkJdC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSgvXig8cFtePl0qPigmbmJzcDt8JiMxNjA7fFxzfFx1MDBhMHwpPFwvcD5bXHJcbl0qfDxiciBcLz5bXHJcbl0qKSQvLCAnJyk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChpc0dlY2tvKSB7DQoJCQkJLy8gRml4IGdlY2tvIGxpbmsgYnVnLCB3aGVuIGEgbGluayBpcyBwbGFjZWQgYXQgdGhlIGVuZCBvZiBibG9jayBlbGVtZW50cyB0aGVyZSBpcw0KCQkJCS8vIG5vIHdheSB0byBtb3ZlIHRoZSBjYXJldCBiZWhpbmQgdGhlIGxpbmsuIFRoaXMgZml4IGFkZHMgYSBib2d1cyBiciBlbGVtZW50IGFmdGVyIHRoZSBsaW5rDQoJCQkJZnVuY3Rpb24gZml4TGlua3MoZWQsIG8pIHsNCgkJCQkJZWFjaChlZC5kb20uc2VsZWN0KCdhJyksIGZ1bmN0aW9uKG4pIHsNCgkJCQkJCXZhciBwbiA9IG4ucGFyZW50Tm9kZTsNCg0KCQkJCQkJaWYgKGVkLmRvbS5pc0Jsb2NrKHBuKSAmJiBwbi5sYXN0Q2hpbGQgPT09IG4pDQoJCQkJCQkJZWQuZG9tLmFkZChwbiwgJ2JyJywgeydfbWNlX2JvZ3VzJyA6IDF9KTsNCgkJCQkJfSk7DQoJCQkJfTsNCg0KCQkJCXQub25FeGVjQ29tbWFuZC5hZGQoZnVuY3Rpb24oZWQsIGNtZCkgew0KCQkJCQlpZiAoY21kID09PSAnQ3JlYXRlTGluaycpDQoJCQkJCQlmaXhMaW5rcyhlZCk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uU2V0Q29udGVudC5hZGQodC5zZWxlY3Rpb24ub25TZXRDb250ZW50LmFkZChmaXhMaW5rcykpOw0KDQoJCQkJaWYgKCFzLnJlYWRvbmx5KSB7DQoJCQkJCXRyeSB7DQoJCQkJCQkvLyBEZXNpZ24gbW9kZSBtdXN0IGJlIHNldCBoZXJlIG9uY2UgYWdhaW4gdG8gZml4IGEgYnVnIHdoZXJlDQoJCQkJCQkvLyBDdHJsK0EvRGVsZXRlL0JhY2tzcGFjZSBkaWRuJ3Qgd29yayBpZiB0aGUgZWRpdG9yIHdhcyBhZGRlZCB1c2luZyBtY2VBZGRDb250cm9sIHRoZW4gcmVtb3ZlZCB0aGVuIGFkZGVkIGFnYWluDQoJCQkJCQlkLmRlc2lnbk1vZGUgPSAnT2ZmJzsNCgkJCQkJCWQuZGVzaWduTW9kZSA9ICdPbic7DQoJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkvLyBXaWxsIGZhaWwgb24gR2Vja28gaWYgdGhlIGVkaXRvciBpcyBwbGFjZWQgaW4gYW4gaGlkZGVuIGNvbnRhaW5lciBlbGVtZW50DQoJCQkJCQkvLyBUaGUgZGVzaWduIG1vZGUgd2lsbCBiZSBzZXQgb25lcyB0aGUgZWRpdG9yIGlzIGZvY3VzZWQNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gQSBzbWFsbCB0aW1lb3V0IHdhcyBuZWVkZWQgc2luY2UgZmlyZWZveCB3aWxsIHJlbW92ZS4gQnVnOiAjMTgzODMwNA0KCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQoJCQkJaWYgKHQucmVtb3ZlZCkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJdC5sb2FkKHtpbml0aWFsIDogdHJ1ZSwgZm9ybWF0IDogKHMuY2xlYW51cF9vbl9zdGFydHVwID8gJ2h0bWwnIDogJ3JhdycpfSk7DQoJCQkJdC5zdGFydENvbnRlbnQgPSB0LmdldENvbnRlbnQoe2Zvcm1hdCA6ICdyYXcnfSk7DQoJCQkJdC5pbml0aWFsaXplZCA9IHRydWU7DQoNCgkJCQl0Lm9uSW5pdC5kaXNwYXRjaCh0KTsNCgkJCQl0LmV4ZWNDYWxsYmFjaygnc2V0dXBjb250ZW50X2NhbGxiYWNrJywgdC5pZCwgdC5nZXRCb2R5KCksIHQuZ2V0RG9jKCkpOw0KCQkJCXQuZXhlY0NhbGxiYWNrKCdpbml0X2luc3RhbmNlX2NhbGxiYWNrJywgdCk7DQoJCQkJdC5mb2N1cyh0cnVlKTsNCgkJCQl0Lm5vZGVDaGFuZ2VkKHtpbml0aWFsIDogMX0pOw0KDQoJCQkJLy8gTG9hZCBzcGVjaWZpZWQgY29udGVudCBDU1MgbGFzdA0KCQkJCWlmIChzLmNvbnRlbnRfY3NzKSB7DQoJCQkJCXRpbnltY2UuZWFjaChleHBsb2RlKHMuY29udGVudF9jc3MpLCBmdW5jdGlvbih1KSB7DQoJCQkJCQl0LmRvbS5sb2FkQ1NTKHQuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUodSkpOw0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQkvLyBIYW5kbGUgYXV0byBmb2N1cw0KCQkJCWlmIChzLmF1dG9fZm9jdXMpIHsNCgkJCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQoJCQkJCQl2YXIgZWQgPSB0aW55bWNlLmdldChzLmF1dG9fZm9jdXMpOw0KDQoJCQkJCQllZC5zZWxlY3Rpb24uc2VsZWN0KGVkLmdldEJvZHkoKSwgMSk7DQoJCQkJCQllZC5zZWxlY3Rpb24uY29sbGFwc2UoMSk7DQoJCQkJCQllZC5nZXRXaW4oKS5mb2N1cygpOw0KCQkJCQl9LCAxMDApOw0KCQkJCX0NCgkJCX0sIDEpOw0KCQ0KCQkJZSA9IG51bGw7DQoJCX0sDQoNCgkJLy8gI2lmZGVmIGNvbnRlbnRFZGl0YWJsZQ0KDQoJCS8qKg0KCQkgKiBTZXRzIHVwIHRoZSBjb250ZW50RWRpdGFibGUgbW9kZS4NCgkJICoNCgkJICogQG1ldGhvZCBzZXR1cENvbnRlbnRFZGl0YWJsZQ0KCQkgKi8NCgkJc2V0dXBDb250ZW50RWRpdGFibGUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGUgPSB0LmdldEVsZW1lbnQoKTsNCg0KCQkJdC5jb250ZW50RG9jdW1lbnQgPSBzLmNvbnRlbnRfZG9jdW1lbnQgfHwgZG9jdW1lbnQ7DQoJCQl0LmNvbnRlbnRXaW5kb3cgPSBzLmNvbnRlbnRfd2luZG93IHx8IHdpbmRvdzsNCgkJCXQuYm9keUVsZW1lbnQgPSBlOw0KDQoJCQkvLyBQcmV2ZW50IGxlYWsgaW4gSUUNCgkJCXMuY29udGVudF9kb2N1bWVudCA9IHMuY29udGVudF93aW5kb3cgPSBudWxsOw0KDQoJCQlET00uaGlkZShlKTsNCgkJCWUuY29udGVudEVkaXRhYmxlID0gdC5nZXRQYXJhbSgnY29udGVudF9lZGl0YWJsZV9zdGF0ZScsIHRydWUpOw0KCQkJRE9NLnNob3coZSk7DQoNCgkJCWlmICghcy5nZWNrb19zcGVsbGNoZWNrKQ0KCQkJCXQuZ2V0RG9jKCkuYm9keS5zcGVsbGNoZWNrID0gMDsNCg0KCQkJLy8gU2V0dXAgb2JqZWN0cw0KCQkJdC5kb20gPSBuZXcgdGlueW1jZS5kb20uRE9NVXRpbHModC5nZXREb2MoKSwgew0KCQkJCWtlZXBfdmFsdWVzIDogdHJ1ZSwNCgkJCQl1cmxfY29udmVydGVyIDogdC5jb252ZXJ0VVJMLA0KCQkJCXVybF9jb252ZXJ0ZXJfc2NvcGUgOiB0LA0KCQkJCWhleF9jb2xvcnMgOiBzLmZvcmNlX2hleF9zdHlsZV9jb2xvcnMsDQoJCQkJY2xhc3NfZmlsdGVyIDogcy5jbGFzc19maWx0ZXIsDQoJCQkJcm9vdF9lbGVtZW50IDogdC5pZCwNCgkJCQlmaXhfaWVfcGFyYWdyYXBocyA6IDEsDQoJCQkJdXBkYXRlX3N0eWxlcyA6IDEsDQoJCQkJdmFsaWRfc3R5bGVzIDogcy52YWxpZF9zdHlsZXMNCgkJCX0pOw0KDQoJCQl0LnNlcmlhbGl6ZXIgPSBuZXcgdGlueW1jZS5kb20uU2VyaWFsaXplcih7DQoJCQkJZW50aXR5X2VuY29kaW5nIDogcy5lbnRpdHlfZW5jb2RpbmcsDQoJCQkJZW50aXRpZXMgOiBzLmVudGl0aWVzLA0KCQkJCXZhbGlkX2VsZW1lbnRzIDogcy52ZXJpZnlfaHRtbCA9PT0gZmFsc2UgPyAnKlsqXScgOiBzLnZhbGlkX2VsZW1lbnRzLA0KCQkJCWV4dGVuZGVkX3ZhbGlkX2VsZW1lbnRzIDogcy5leHRlbmRlZF92YWxpZF9lbGVtZW50cywNCgkJCQl2YWxpZF9jaGlsZF9lbGVtZW50cyA6IHMudmFsaWRfY2hpbGRfZWxlbWVudHMsDQoJCQkJaW52YWxpZF9lbGVtZW50cyA6IHMuaW52YWxpZF9lbGVtZW50cywNCgkJCQlmaXhfdGFibGVfZWxlbWVudHMgOiBzLmZpeF90YWJsZV9lbGVtZW50cywNCgkJCQlmaXhfbGlzdF9lbGVtZW50cyA6IHMuZml4X2xpc3RfZWxlbWVudHMsDQoJCQkJZml4X2NvbnRlbnRfZHVwbGljYXRpb24gOiBzLmZpeF9jb250ZW50X2R1cGxpY2F0aW9uLA0KCQkJCWZvbnRfc2l6ZV9jbGFzc2VzICA6IHMuZm9udF9zaXplX2NsYXNzZXMsDQoJCQkJYXBwbHlfc291cmNlX2Zvcm1hdHRpbmcgOiBzLmFwcGx5X3NvdXJjZV9mb3JtYXR0aW5nLA0KCQkJCWRvbSA6IHQuZG9tLA0KCQkJCXNjaGVtYSA6IHNjaGVtYQ0KCQkJfSk7DQoNCgkJCXQuc2VsZWN0aW9uID0gbmV3IHRpbnltY2UuZG9tLlNlbGVjdGlvbih0LmRvbSwgdC5nZXRXaW4oKSwgdC5zZXJpYWxpemVyKTsNCgkJCXQuZm9yY2VCbG9ja3MgPSBuZXcgdGlueW1jZS5Gb3JjZUJsb2Nrcyh0LCB7DQoJCQkJZm9yY2VkX3Jvb3RfYmxvY2sgOiBzLmZvcmNlZF9yb290X2Jsb2NrDQoJCQl9KTsNCg0KCQkJdC5lZGl0b3JDb21tYW5kcyA9IG5ldyB0aW55bWNlLkVkaXRvckNvbW1hbmRzKHQpOw0KDQoJCQkvLyBQYXNzIHRocm91Z2gNCgkJCXQuc2VyaWFsaXplci5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJcmV0dXJuIHQub25QcmVQcm9jZXNzLmRpc3BhdGNoKHQsIG8sIHNlKTsNCgkJCX0pOw0KDQoJCQl0LnNlcmlhbGl6ZXIub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24oc2UsIG8pIHsNCgkJCQlyZXR1cm4gdC5vblBvc3RQcm9jZXNzLmRpc3BhdGNoKHQsIG8sIHNlKTsNCgkJCX0pOw0KDQoJCQl0Lm9uUHJlSW5pdC5kaXNwYXRjaCh0KTsNCgkJCXQuX2FkZEV2ZW50cygpOw0KDQoJCQl0LmNvbnRyb2xNYW5hZ2VyLm9uUG9zdFJlbmRlci5kaXNwYXRjaCh0LCB0LmNvbnRyb2xNYW5hZ2VyKTsNCgkJCXQub25Qb3N0UmVuZGVyLmRpc3BhdGNoKHQpOw0KDQoJCQl0Lm9uU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJdC5hZGRWaXN1YWwodC5nZXRCb2R5KCkpOw0KCQkJfSk7DQoNCgkJCS8vdC5sb2FkKHtpbml0aWFsIDogdHJ1ZSwgZm9ybWF0IDogKHMuY2xlYW51cF9vbl9zdGFydHVwID8gJ2h0bWwnIDogJ3JhdycpfSk7DQoJCQl0LnN0YXJ0Q29udGVudCA9IHQuZ2V0Q29udGVudCh7Zm9ybWF0IDogJ3Jhdyd9KTsNCgkJCXQudW5kb01hbmFnZXIuYWRkKHtpbml0aWFsIDogdHJ1ZX0pOw0KCQkJdC5pbml0aWFsaXplZCA9IHRydWU7DQoNCgkJCXQub25Jbml0LmRpc3BhdGNoKHQpOw0KCQkJdC5mb2N1cyh0cnVlKTsNCgkJCXQubm9kZUNoYW5nZWQoe2luaXRpYWwgOiAxfSk7DQoNCgkJCS8vIExvYWQgc3BlY2lmaWVkIGNvbnRlbnQgQ1NTIGxhc3QNCgkJCWlmIChzLmNvbnRlbnRfY3NzKSB7DQoJCQkJZWFjaChleHBsb2RlKHMuY29udGVudF9jc3MpLCBmdW5jdGlvbih1KSB7DQoJCQkJCXQuZG9tLmxvYWRDU1ModC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZSh1KSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChpc0lFKSB7DQoJCQkJLy8gU3RvcmUgYXdheSBzZWxlY3Rpb24NCgkJCQl0LmRvbS5iaW5kKHQuZ2V0RWxlbWVudCgpLCAnYmVmb3JlZGVhY3RpdmF0ZScsIGZ1bmN0aW9uKCkgew0KCQkJCQl0Lmxhc3RTZWxlY3Rpb25Cb29rbWFyayA9IHQuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpOw0KCQkJCX0pOw0KDQoJCQkJdC5vbkJlZm9yZUV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihlZCwgY21kLCB1aSwgdmFsLCBvKSB7DQoJCQkJCWlmICghRE9NLmdldFBhcmVudChlZC5zZWxlY3Rpb24uZ2V0U3RhcnQoKSwgZnVuY3Rpb24obikge3JldHVybiBuID09IGVkLmdldEJvZHkoKTt9KSkNCgkJCQkJCW8udGVybWluYXRlID0gMTsNCg0KCQkJCQlpZiAoIURPTS5nZXRQYXJlbnQoZWQuc2VsZWN0aW9uLmdldEVuZCgpLCBmdW5jdGlvbihuKSB7cmV0dXJuIG4gPT0gZWQuZ2V0Qm9keSgpO30pKQ0KCQkJCQkJby50ZXJtaW5hdGUgPSAxOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQllID0gbnVsbDsgLy8gQ2xlYW51cA0KCQl9LA0KDQoJCS8vICNlbmRpZg0KDQoJCS8qKg0KCQkgKiBGb2N1c2VzL2FjdGl2YXRlcyB0aGUgZWRpdG9yLiBUaGlzIHdpbGwgc2V0IHRoaXMgZWRpdG9yIGFzIHRoZSBhY3RpdmVFZGl0b3IgaW4gdGhlIHRpbnltY2UgY29sbGVjdGlvbg0KCQkgKiBpdCB3aWxsIGFsc28gcGxhY2UgRE9NIGZvY3VzIGluc2lkZSB0aGUgZWRpdG9yLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGZvY3VzDQoJCSAqIEBwYXJhbSB7Qm9vbGVhbn0gc2YgU2tpcCBET00gZm9jdXMuIEp1c3Qgc2V0IGlzIGFzIHRoZSBhY3RpdmUgZWRpdG9yLg0KCQkgKi8NCgkJZm9jdXMgOiBmdW5jdGlvbihzZikgew0KCQkJdmFyIG9lZCwgdCA9IHRoaXMsIGNlID0gdC5zZXR0aW5ncy5jb250ZW50X2VkaXRhYmxlLCBpZVJuZywgY29udHJvbEVsbSwgZG9jID0gdC5nZXREb2MoKTsNCg0KCQkJaWYgKCFzZikgew0KCQkJCS8vIEdldCBzZWxlY3RlZCBjb250cm9sIGVsZW1lbnQNCgkJCQlpZVJuZyA9IHQuc2VsZWN0aW9uLmdldFJuZygpOw0KCQkJCWlmIChpZVJuZy5pdGVtKSB7DQoJCQkJCWNvbnRyb2xFbG0gPSBpZVJuZy5pdGVtKDApOw0KCQkJCX0NCg0KCQkJCS8vIElzIG5vdCBjb250ZW50IGVkaXRhYmxlDQoJCQkJaWYgKCFjZSkNCgkJCQkJdC5nZXRXaW4oKS5mb2N1cygpOw0KDQoJCQkJLy8gUmVzdG9yZSBzZWxlY3RlZCBjb250cm9sIGVsZW1lbnQNCgkJCQkvLyBUaGlzIGlzIG5lZWRlZCB3aGVuIGZvciBleGFtcGxlIGFuIGltYWdlIGlzIHNlbGVjdGVkIHdpdGhpbiBhDQoJCQkJLy8gbGF5ZXIgYSBjYWxsIHRvIGZvY3VzIHdpbGwgdGhlbiByZW1vdmUgdGhlIGNvbnRyb2wgc2VsZWN0aW9uDQoJCQkJaWYgKGNvbnRyb2xFbG0gJiYgY29udHJvbEVsbS5vd25lckRvY3VtZW50ID09IGRvYykgew0KCQkJCQlpZVJuZyA9IGRvYy5ib2R5LmNyZWF0ZUNvbnRyb2xSYW5nZSgpOw0KCQkJCQlpZVJuZy5hZGRFbGVtZW50KGNvbnRyb2xFbG0pOw0KCQkJCQlpZVJuZy5zZWxlY3QoKTsNCgkJCQl9DQoNCgkJCQkvLyAjaWZkZWYgY29udGVudEVkaXRhYmxlDQoNCgkJCQkvLyBDb250ZW50IGVkaXRhYmxlIG1vZGUgZW5kcyBoZXJlDQoJCQkJaWYgKGNlKSB7DQoJCQkJCWlmICh0aW55bWNlLmlzV2ViS2l0KQ0KCQkJCQkJdC5nZXRXaW4oKS5mb2N1cygpOw0KCQkJCQllbHNlIHsNCgkJCQkJCWlmICh0aW55bWNlLmlzSUUpDQoJCQkJCQkJdC5nZXRFbGVtZW50KCkuc2V0QWN0aXZlKCk7DQoJCQkJCQllbHNlDQoJCQkJCQkJdC5nZXRFbGVtZW50KCkuZm9jdXMoKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vICNlbmRpZg0KCQkJfQ0KDQoJCQlpZiAodGlueW1jZS5hY3RpdmVFZGl0b3IgIT0gdCkgew0KCQkJCWlmICgob2VkID0gdGlueW1jZS5hY3RpdmVFZGl0b3IpICE9IG51bGwpDQoJCQkJCW9lZC5vbkRlYWN0aXZhdGUuZGlzcGF0Y2gob2VkLCB0KTsNCg0KCQkJCXQub25BY3RpdmF0ZS5kaXNwYXRjaCh0LCBvZWQpOw0KCQkJfQ0KDQoJCQl0aW55bWNlLl9zZXRBY3RpdmUodCk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEV4ZWN1dGVzIGEgbGVnYWN5IGNhbGxiYWNrLiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gY2FsbCBvbGQgMi54IG9wdGlvbiBjYWxsYmFja3MuDQoJCSAqIFRoZXJlIG5ldyBldmVudCBtb2RlbCBpcyBhIGJldHRlciB3YXkgdG8gYWRkIGNhbGxiYWNrIHNvIHRoaXMgbWV0aG9kIG1pZ2h0IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4NCgkJICoNCgkJICogQG1ldGhvZCBleGVjQ2FsbGJhY2sNCgkJICogQHBhcmFtIHtTdHJpbmd9IG4gTmFtZSBvZiB0aGUgY2FsbGJhY2sgdG8gZXhlY3V0ZS4NCgkJICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm4gdmFsdWUgcGFzc2VkIGZyb20gY2FsbGJhY2sgZnVuY3Rpb24uDQoJCSAqLw0KCQlleGVjQ2FsbGJhY2sgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGYgPSB0LnNldHRpbmdzW25dLCBzOw0KDQoJCQlpZiAoIWYpDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBMb29rIHRocm91Z2ggbG9va3VwDQoJCQlpZiAodC5jYWxsYmFja0xvb2t1cCAmJiAocyA9IHQuY2FsbGJhY2tMb29rdXBbbl0pKSB7DQoJCQkJZiA9IHMuZnVuYzsNCgkJCQlzID0gcy5zY29wZTsNCgkJCX0NCg0KCQkJaWYgKGlzKGYsICdzdHJpbmcnKSkgew0KCQkJCXMgPSBmLnJlcGxhY2UoL1wuXHcrJC8sICcnKTsNCgkJCQlzID0gcyA/IHRpbnltY2UucmVzb2x2ZShzKSA6IDA7DQoJCQkJZiA9IHRpbnltY2UucmVzb2x2ZShmKTsNCgkJCQl0LmNhbGxiYWNrTG9va3VwID0gdC5jYWxsYmFja0xvb2t1cCB8fCB7fTsNCgkJCQl0LmNhbGxiYWNrTG9va3VwW25dID0ge2Z1bmMgOiBmLCBzY29wZSA6IHN9Ow0KCQkJfQ0KDQoJCQlyZXR1cm4gZi5hcHBseShzIHx8IHQsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBUcmFuc2xhdGVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ5IHJlcGxhY2luZyB2YXJpYWJsZXMgd2l0aCBsYW5ndWFnZSBwYWNrIGl0ZW1zIGl0IHdpbGwgYWxzbyBjaGVjayBpZiB0aGVyZSBpcw0KCQkgKiBhIGtleSBtYXRoY2luIHRoZSBpbnB1dC4NCgkJICoNCgkJICogQG1ldGhvZCB0cmFuc2xhdGUNCgkJICogQHBhcmFtIHtTdHJpbmd9IHMgU3RyaW5nIHRvIHRyYW5zbGF0ZSBieSB0aGUgbGFuZ3VhZ2UgcGFjayBkYXRhLg0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IFRyYW5zbGF0ZWQgc3RyaW5nLg0KCQkgKi8NCgkJdHJhbnNsYXRlIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIGMgPSB0aGlzLnNldHRpbmdzLmxhbmd1YWdlIHx8ICdlbicsIGkxOG4gPSB0aW55bWNlLmkxOG47DQoNCgkJCWlmICghcykNCgkJCQlyZXR1cm4gJyc7DQoNCgkJCXJldHVybiBpMThuW2MgKyAnLicgKyBzXSB8fCBzLnJlcGxhY2UoL3tcIyhbXn1dKylcfS9nLCBmdW5jdGlvbihhLCBiKSB7DQoJCQkJcmV0dXJuIGkxOG5bYyArICcuJyArIGJdIHx8ICd7IycgKyBiICsgJ30nOw0KCQkJfSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgYSBsYW5ndWFnZSBwYWNrIGl0ZW0gYnkgbmFtZS9rZXkuDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0TGFuZw0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBOYW1lL2tleSB0byBnZXQgZnJvbSB0aGUgbGFuZ3VhZ2UgcGFjay4NCgkJICogQHBhcmFtIHtTdHJpbmd9IGR2IE9wdGlvbmFsIGRlZmF1bHQgdmFsdWUgdG8gcmV0cml2ZS4NCgkJICovDQoJCWdldExhbmcgOiBmdW5jdGlvbihuLCBkdikgew0KCQkJcmV0dXJuIHRpbnltY2UuaTE4blsodGhpcy5zZXR0aW5ncy5sYW5ndWFnZSB8fCAnZW4nKSArICcuJyArIG5dIHx8IChpcyhkdikgPyBkdiA6ICd7IycgKyBuICsgJ30nKTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGJ5IG5hbWUuDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0UGFyYW0NCgkJICogQHBhcmFtIHtTdHJpbmd9IG4gQ29uZmlncnVhdGlvbiBwYXJhbWV0ZXIgdG8gcmV0cml2ZS4NCgkJICogQHBhcmFtIHtTdHJpbmd9IGR2IE9wdGlvbmFsIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuLg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gdHkgT3B0aW9uYWwgdHlwZSBwYXJhbWV0ZXIuDQoJCSAqIEByZXR1cm4ge1N0cmluZ30gQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgdmFsdWUgb3IgZGVmYXVsdCB2YWx1ZS4NCgkJICovDQoJCWdldFBhcmFtIDogZnVuY3Rpb24obiwgZHYsIHR5KSB7DQoJCQl2YXIgdHIgPSB0aW55bWNlLnRyaW0sIHYgPSBpcyh0aGlzLnNldHRpbmdzW25dKSA/IHRoaXMuc2V0dGluZ3Nbbl0gOiBkdiwgbzsNCg0KCQkJaWYgKHR5ID09PSAnaGFzaCcpIHsNCgkJCQlvID0ge307DQoNCgkJCQlpZiAoaXModiwgJ3N0cmluZycpKSB7DQoJCQkJCWVhY2godi5pbmRleE9mKCc9JykgPiAwID8gdi5zcGxpdCgvWzssXSg/IVtePTssXSooPzpbOyxdfCQpKS8pIDogdi5zcGxpdCgnLCcpLCBmdW5jdGlvbih2KSB7DQoJCQkJCQl2ID0gdi5zcGxpdCgnPScpOw0KDQoJCQkJCQlpZiAodi5sZW5ndGggPiAxKQ0KCQkJCQkJCW9bdHIodlswXSldID0gdHIodlsxXSk7DQoJCQkJCQllbHNlDQoJCQkJCQkJb1t0cih2WzBdKV0gPSB0cih2KTsNCgkJCQkJfSk7DQoJCQkJfSBlbHNlDQoJCQkJCW8gPSB2Ow0KDQoJCQkJcmV0dXJuIG87DQoJCQl9DQoNCgkJCXJldHVybiB2Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBEaXN0cGFjaGVzIG91dCBhIG9uTm9kZUNoYW5nZSBldmVudCB0byBhbGwgb2JzZXJ2ZXJzLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4geW91DQoJCSAqIG5lZWQgdG8gdXBkYXRlIHRoZSBVSSBzdGF0ZXMgb3IgZWxlbWVudCBwYXRoIGV0Yy4NCgkJICoNCgkJICogQG1ldGhvZCBub2RlQ2hhbmdlZA0KCQkgKiBAcGFyYW0ge09iamVjdH0gbyBPcHRpb25hbCBvYmplY3QgdG8gcGFzcyBhbG9uZyBmb3IgdGhlIG5vZGUgY2hhbmdlZCBldmVudC4NCgkJICovDQoJCW5vZGVDaGFuZ2VkIDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZWxlY3Rpb24sIG4gPSAoaXNJRSA/IHMuZ2V0Tm9kZSgpIDogcy5nZXRTdGFydCgpKSB8fCB0LmdldEJvZHkoKTsNCg0KCQkJLy8gRml4IGZvciBidWcgIzE4OTY1NzcgaXQgc2VlbXMgdGhhdCB0aGlzIGNhbiBub3QgYmUgZmlyZWQgd2hpbGUgdGhlIGVkaXRvciBpcyBsb2FkaW5nDQoJCQlpZiAodC5pbml0aWFsaXplZCkgew0KCQkJCW8gPSBvIHx8IHt9Ow0KCQkJCW4gPSBpc0lFICYmIG4ub3duZXJEb2N1bWVudCAhPSB0LmdldERvYygpID8gdC5nZXRCb2R5KCkgOiBuOyAvLyBGaXggZm9yIElFIGluaXRpYWwgc3RhdGUNCg0KCQkJCS8vIEdldCBwYXJlbnRzIGFuZCBhZGQgdGhlbSB0byBvYmplY3QNCgkJCQlvLnBhcmVudHMgPSBbXTsNCgkJCQl0LmRvbS5nZXRQYXJlbnQobiwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQlpZiAobm9kZS5ub2RlTmFtZSA9PSAnQk9EWScpDQoJCQkJCQlyZXR1cm4gdHJ1ZTsNCg0KCQkJCQlvLnBhcmVudHMucHVzaChub2RlKTsNCgkJCQl9KTsNCg0KCQkJCXQub25Ob2RlQ2hhbmdlLmRpc3BhdGNoKA0KCQkJCQl0LA0KCQkJCQlvID8gby5jb250cm9sTWFuYWdlciB8fCB0LmNvbnRyb2xNYW5hZ2VyIDogdC5jb250cm9sTWFuYWdlciwNCgkJCQkJbiwNCgkJCQkJcy5pc0NvbGxhcHNlZCgpLA0KCQkJCQlvDQoJCQkJKTsNCgkJCX0NCgkJfSwNCg0KCQkvKioNCgkJICogQWRkcyBhIGJ1dHRvbiB0aGF0IGxhdGVyIGdldHMgY3JlYXRlZCBieSB0aGUgQ29udHJvbE1hbmFnZXIuIFRoaXMgaXMgYSBzaG9ydGVyIGFuZCBlYXNpZXIgbWV0aG9kDQoJCSAqIG9mIGFkZGluZyBidXR0b25zIHdpdGhvdXQgdGhlIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSBDb250cm9sTWFuYWdlciBkaXJlY3RseS4gQnV0IGl0J3MgYWxzbyBsZXNzDQoJCSAqIHBvd2VyZnVsbCBpZiB5b3UgbmVlZCBtb3JlIGNvbnRyb2wgdXNlIHRoZSBDb250cm9sTWFuYWdlcnMgZmFjdG9yeSBtZXRob2RzIGluc3RlYWQuDQoJCSAqDQoJCSAqIEBtZXRob2QgYWRkQnV0dG9uDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIEJ1dHRvbiBuYW1lIHRvIGFkZC4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgU2V0dGluZ3Mgb2JqZWN0IHdpdGggdGl0bGUsIGNtZCBldGMuDQoJCSAqLw0KCQlhZGRCdXR0b24gOiBmdW5jdGlvbihuLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQuYnV0dG9ucyA9IHQuYnV0dG9ucyB8fCB7fTsNCgkJCXQuYnV0dG9uc1tuXSA9IHM7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEFkZHMgYSBjdXN0b20gY29tbWFuZCB0byB0aGUgZWRpdG9yLCB5b3UgY2FuIGFsc28gb3ZlcnJpZGUgZXhpc3RpbmcgY29tbWFuZHMgd2l0aCB0aGlzIG1ldGhvZC4NCgkJICogVGhlIGNvbW1hbmQgdGhhdCB5b3UgYWRkIGNhbiBiZSBleGVjdXRlZCB3aXRoIGV4ZWNDb21tYW5kLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGFkZENvbW1hbmQNCgkJICogQHBhcmFtIHtTdHJpbmd9IG4gQ29tbWFuZCBuYW1lIHRvIGFkZC9vdmVycmlkZS4NCgkJICogQHBhcmFtIHtmdW5jdGlvbn0gZiBGdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGNvbW1hbmQgb2NjdXJzLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBzY29wZSB0byBleGVjdXRlIHRoZSBmdW5jdGlvbiBpbi4NCgkJICovDQoJCWFkZENvbW1hbmQgOiBmdW5jdGlvbihuLCBmLCBzKSB7DQoJCQl0aGlzLmV4ZWNDb21tYW5kc1tuXSA9IHtmdW5jIDogZiwgc2NvcGUgOiBzIHx8IHRoaXN9Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBBZGRzIGEgY3VzdG9tIHF1ZXJ5IHN0YXRlIGNvbW1hbmQgdG8gdGhlIGVkaXRvciwgeW91IGNhbiBhbHNvIG92ZXJyaWRlIGV4aXN0aW5nIGNvbW1hbmRzIHdpdGggdGhpcyBtZXRob2QuDQoJCSAqIFRoZSBjb21tYW5kIHRoYXQgeW91IGFkZCBjYW4gYmUgZXhlY3V0ZWQgd2l0aCBxdWVyeUNvbW1hbmRTdGF0ZSBmdW5jdGlvbi4NCgkJICoNCgkJICogQG1ldGhvZCBhZGRRdWVyeVN0YXRlSGFuZGxlcg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBDb21tYW5kIG5hbWUgdG8gYWRkL292ZXJyaWRlLg0KCQkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmIEZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgY29tbWFuZCBzdGF0ZSByZXRyaXZhbCBvY2N1cnMuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIHNjb3BlIHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGluLg0KCQkgKi8NCgkJYWRkUXVlcnlTdGF0ZUhhbmRsZXIgOiBmdW5jdGlvbihuLCBmLCBzKSB7DQoJCQl0aGlzLnF1ZXJ5U3RhdGVDb21tYW5kc1tuXSA9IHtmdW5jIDogZiwgc2NvcGUgOiBzIHx8IHRoaXN9Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBBZGRzIGEgY3VzdG9tIHF1ZXJ5IHZhbHVlIGNvbW1hbmQgdG8gdGhlIGVkaXRvciwgeW91IGNhbiBhbHNvIG92ZXJyaWRlIGV4aXN0aW5nIGNvbW1hbmRzIHdpdGggdGhpcyBtZXRob2QuDQoJCSAqIFRoZSBjb21tYW5kIHRoYXQgeW91IGFkZCBjYW4gYmUgZXhlY3V0ZWQgd2l0aCBxdWVyeUNvbW1hbmRWYWx1ZSBmdW5jdGlvbi4NCgkJICoNCgkJICogQG1ldGhvZCBhZGRRdWVyeVZhbHVlSGFuZGxlcg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBDb21tYW5kIG5hbWUgdG8gYWRkL292ZXJyaWRlLg0KCQkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmIEZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgY29tbWFuZCB2YWx1ZSByZXRyaXZhbCBvY2N1cnMuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIHNjb3BlIHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGluLg0KCQkgKi8NCgkJYWRkUXVlcnlWYWx1ZUhhbmRsZXIgOiBmdW5jdGlvbihuLCBmLCBzKSB7DQoJCQl0aGlzLnF1ZXJ5VmFsdWVDb21tYW5kc1tuXSA9IHtmdW5jIDogZiwgc2NvcGUgOiBzIHx8IHRoaXN9Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBBZGRzIGEga2V5Ym9hcmQgc2hvcnRjdXQgZm9yIHNvbWUgY29tbWFuZCBvciBmdW5jdGlvbi4NCgkJICoNCgkJICogQG1ldGhvZCBhZGRTaG9ydGN1dA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gcGEgU2hvcnRjdXQgcGF0dGVybi4gTGlrZSBmb3IgZXhhbXBsZTogY3RybCthbHQrby4NCgkJICogQHBhcmFtIHtTdHJpbmd9IGRlc2MgVGV4dCBkZXNjcmlwdGlvbiBmb3IgdGhlIGNvbW1hbmQuDQoJCSAqIEBwYXJhbSB7U3RyaW5nL0Z1bmN0aW9ufSBjbWRfZnVuYyBDb21tYW5kIG5hbWUgc3RyaW5nIG9yIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUga2V5IGlzIHByZXNzZWQuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzYyBPcHRpb25hbCBzY29wZSB0byBleGVjdXRlIHRoZSBmdW5jdGlvbiBpbi4NCgkJICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZS9mYWxzZSBzdGF0ZSBpZiB0aGUgc2hvcnRjdXQgd2FzIGFkZGVkIG9yIG5vdC4NCgkJICovDQoJCWFkZFNob3J0Y3V0IDogZnVuY3Rpb24ocGEsIGRlc2MsIGNtZF9mdW5jLCBzYykgew0KCQkJdmFyIHQgPSB0aGlzLCBjOw0KDQoJCQlpZiAoIXQuc2V0dGluZ3MuY3VzdG9tX3Nob3J0Y3V0cykNCgkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCXQuc2hvcnRjdXRzID0gdC5zaG9ydGN1dHMgfHwge307DQoNCgkJCWlmIChpcyhjbWRfZnVuYywgJ3N0cmluZycpKSB7DQoJCQkJYyA9IGNtZF9mdW5jOw0KDQoJCQkJY21kX2Z1bmMgPSBmdW5jdGlvbigpIHsNCgkJCQkJdC5leGVjQ29tbWFuZChjLCBmYWxzZSwgbnVsbCk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJaWYgKGlzKGNtZF9mdW5jLCAnb2JqZWN0JykpIHsNCgkJCQljID0gY21kX2Z1bmM7DQoNCgkJCQljbWRfZnVuYyA9IGZ1bmN0aW9uKCkgew0KCQkJCQl0LmV4ZWNDb21tYW5kKGNbMF0sIGNbMV0sIGNbMl0pOw0KCQkJCX07DQoJCQl9DQoNCgkJCWVhY2goZXhwbG9kZShwYSksIGZ1bmN0aW9uKHBhKSB7DQoJCQkJdmFyIG8gPSB7DQoJCQkJCWZ1bmMgOiBjbWRfZnVuYywNCgkJCQkJc2NvcGUgOiBzYyB8fCB0aGlzLA0KCQkJCQlkZXNjIDogZGVzYywNCgkJCQkJYWx0IDogZmFsc2UsDQoJCQkJCWN0cmwgOiBmYWxzZSwNCgkJCQkJc2hpZnQgOiBmYWxzZQ0KCQkJCX07DQoNCgkJCQllYWNoKGV4cGxvZGUocGEsICcrJyksIGZ1bmN0aW9uKHYpIHsNCgkJCQkJc3dpdGNoICh2KSB7DQoJCQkJCQljYXNlICdhbHQnOg0KCQkJCQkJY2FzZSAnY3RybCc6DQoJCQkJCQljYXNlICdzaGlmdCc6DQoJCQkJCQkJb1t2XSA9IHRydWU7DQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWRlZmF1bHQ6DQoJCQkJCQkJby5jaGFyQ29kZSA9IHYuY2hhckNvZGVBdCgwKTsNCgkJCQkJCQlvLmtleUNvZGUgPSB2LnRvVXBwZXJDYXNlKCkuY2hhckNvZGVBdCgwKTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJdC5zaG9ydGN1dHNbKG8uY3RybCA/ICdjdHJsJyA6ICcnKSArICcsJyArIChvLmFsdCA/ICdhbHQnIDogJycpICsgJywnICsgKG8uc2hpZnQgPyAnc2hpZnQnIDogJycpICsgJywnICsgby5rZXlDb2RlXSA9IG87DQoJCQl9KTsNCg0KCQkJcmV0dXJuIHRydWU7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEV4ZWN1dGVzIGEgY29tbWFuZCBvbiB0aGUgY3VycmVudCBpbnN0YW5jZS4gVGhlc2UgY29tbWFuZHMgY2FuIGJlIFRpbnlNQ0UgaW50ZXJuYWwgY29tbWFuZHMgcHJlZml4ZWQgd2l0aCAibWNlIiBvcg0KCQkgKiB0aGV5IGNhbiBiZSBidWlsZCBpbiBicm93c2VyIGNvbW1hbmRzIHN1Y2ggYXMgIkJvbGQiLiBBIGNvbXBsZWF0ZSBsaXN0IG9mIGJyb3dzZXIgY29tbWFuZHMgaXMgYXZhaWxhYmxlIG9uIE1TRE4gb3IgTW96aWxsYS5vcmcuDQoJCSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkaXNwYXRjaCB0aGUgZXhlY0NvbW1hbmQgZnVuY3Rpb24gb24gZWFjaCBwbHVnaW4sIHRoZW1lIG9yIHRoZSBleGVjY29tbWFuZF9jYWxsYmFjayBvcHRpb24gaWYgbm9uZSBvZiB0aGVzZQ0KCQkgKiByZXR1cm4gdHJ1ZSBpdCB3aWxsIGhhbmRsZSB0aGUgY29tbWFuZCBhcyBhIGludGVybmFsIGJyb3dzZXIgY29tbWFuZC4NCgkJICoNCgkJICogQG1ldGhvZCBleGVjQ29tbWFuZA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gY21kIENvbW1hbmQgbmFtZSB0byBleGVjdXRlLCBmb3IgZXhhbXBsZSBtY2VMaW5rIG9yIEJvbGQuDQoJCSAqIEBwYXJhbSB7Qm9vbGVhbn0gdWkgVHJ1ZS9mYWxzZSBzdGF0ZSBpZiBhIFVJIChkaWFsb2cpIHNob3VsZCBiZSBwcmVzZW50ZWQgb3Igbm90Lg0KCQkgKiBAcGFyYW0ge21peGVkfSB2YWwgT3B0aW9uYWwgY29tbWFuZCB2YWx1ZSwgdGhpcyBjYW4gYmUgYW55dGhpbmcuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBhIE9wdGlvbmFsIGFyZ3VtZW50cyBvYmplY3QuDQoJCSAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUvZmFsc2UgaWYgdGhlIGNvbW1hbmQgd2FzIGV4ZWN1dGVkIG9yIG5vdC4NCgkJICovDQoJCWV4ZWNDb21tYW5kIDogZnVuY3Rpb24oY21kLCB1aSwgdmFsLCBhKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSAwLCBvLCBzdDsNCg0KCQkJaWYgKCEvXihtY2VBZGRVbmRvTGV2ZWx8bWNlRW5kVW5kb0xldmVsfG1jZUJlZ2luVW5kb0xldmVsfG1jZVJlcGFpbnR8U2VsZWN0QWxsKSQvLnRlc3QoY21kKSAmJiAoIWEgfHwgIWEuc2tpcF9mb2N1cykpDQoJCQkJdC5mb2N1cygpOw0KDQoJCQlvID0ge307DQoJCQl0Lm9uQmVmb3JlRXhlY0NvbW1hbmQuZGlzcGF0Y2godCwgY21kLCB1aSwgdmFsLCBvKTsNCgkJCWlmIChvLnRlcm1pbmF0ZSkNCgkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCS8vIENvbW1hbmQgY2FsbGJhY2sNCgkJCWlmICh0LmV4ZWNDYWxsYmFjaygnZXhlY2NvbW1hbmRfY2FsbGJhY2snLCB0LmlkLCB0LnNlbGVjdGlvbi5nZXROb2RlKCksIGNtZCwgdWksIHZhbCkpIHsNCgkJCQl0Lm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2godCwgY21kLCB1aSwgdmFsLCBhKTsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlpZiAobyA9IHQuZXhlY0NvbW1hbmRzW2NtZF0pIHsNCgkJCQlzdCA9IG8uZnVuYy5jYWxsKG8uc2NvcGUsIHVpLCB2YWwpOw0KDQoJCQkJLy8gRmFsbCB0aHJvdWdoIG9uIHRydWUNCgkJCQlpZiAoc3QgIT09IHRydWUpIHsNCgkJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJCXJldHVybiBzdDsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFBsdWdpbiBjb21tYW5kcw0KCQkJZWFjaCh0LnBsdWdpbnMsIGZ1bmN0aW9uKHApIHsNCgkJCQlpZiAocC5leGVjQ29tbWFuZCAmJiBwLmV4ZWNDb21tYW5kKGNtZCwgdWksIHZhbCkpIHsNCgkJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJCXMgPSAxOw0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWlmIChzKQ0KCQkJCXJldHVybiB0cnVlOw0KDQoJCQkvLyBUaGVtZSBjb21tYW5kcw0KCQkJaWYgKHQudGhlbWUgJiYgdC50aGVtZS5leGVjQ29tbWFuZCAmJiB0LnRoZW1lLmV4ZWNDb21tYW5kKGNtZCwgdWksIHZhbCkpIHsNCgkJCQl0Lm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2godCwgY21kLCB1aSwgdmFsLCBhKTsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCg0KCQkJLy8gRXhlY3V0ZSBnbG9iYWwgY29tbWFuZHMNCgkJCWlmICh0aW55bWNlLkdsb2JhbENvbW1hbmRzLmV4ZWNDb21tYW5kKHQsIGNtZCwgdWksIHZhbCkpIHsNCgkJCQl0Lm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2godCwgY21kLCB1aSwgdmFsLCBhKTsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCg0KCQkJLy8gRWRpdG9yIGNvbW1hbmRzDQoJCQlpZiAodC5lZGl0b3JDb21tYW5kcy5leGVjQ29tbWFuZChjbWQsIHVpLCB2YWwpKSB7DQoJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoNCgkJCS8vIEJyb3dzZXIgY29tbWFuZHMNCgkJCXQuZ2V0RG9jKCkuZXhlY0NvbW1hbmQoY21kLCB1aSwgdmFsKTsNCgkJCXQub25FeGVjQ29tbWFuZC5kaXNwYXRjaCh0LCBjbWQsIHVpLCB2YWwsIGEpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIGEgY29tbWFuZCBzcGVjaWZpYyBzdGF0ZSwgZm9yIGV4YW1wbGUgaWYgYm9sZCBpcyBlbmFibGVkIG9yIG5vdC4NCgkJICoNCgkJICogQG1ldGhvZCBxdWVyeUNvbW1hbmRTdGF0ZQ0KCQkgKiBAcGFyYW0ge3N0cmluZ30gY21kIENvbW1hbmQgdG8gcXVlcnkgc3RhdGUgZnJvbS4NCgkJICogQHJldHVybiB7Qm9vbGVhbn0gQ29tbWFuZCBzcGVjaWZpYyBzdGF0ZSwgZm9yIGV4YW1wbGUgaWYgYm9sZCBpcyBlbmFibGVkIG9yIG5vdC4NCgkJICovDQoJCXF1ZXJ5Q29tbWFuZFN0YXRlIDogZnVuY3Rpb24oY21kKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG8sIHM7DQoNCgkJCS8vIElzIGhpZGRlbiB0aGVuIHJldHVybiB1bmRlZmluZWQNCgkJCWlmICh0Ll9pc0hpZGRlbigpKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlpZiAobyA9IHQucXVlcnlTdGF0ZUNvbW1hbmRzW2NtZF0pIHsNCgkJCQlzID0gby5mdW5jLmNhbGwoby5zY29wZSk7DQoNCgkJCQkvLyBGYWxsIHRob3VnaCBvbiB0cnVlDQoJCQkJaWYgKHMgIT09IHRydWUpDQoJCQkJCXJldHVybiBzOw0KCQkJfQ0KDQoJCQkvLyBSZWdpc3RyZWQgY29tbWFuZHMNCgkJCW8gPSB0LmVkaXRvckNvbW1hbmRzLnF1ZXJ5Q29tbWFuZFN0YXRlKGNtZCk7DQoJCQlpZiAobyAhPT0gLTEpDQoJCQkJcmV0dXJuIG87DQoNCgkJCS8vIEJyb3dzZXIgY29tbWFuZHMNCgkJCXRyeSB7DQoJCQkJcmV0dXJuIHRoaXMuZ2V0RG9jKCkucXVlcnlDb21tYW5kU3RhdGUoY21kKTsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJLy8gRmFpbHMgc29tZXRpbWVzIHNlZSBidWc6IDE4OTY1NzcNCgkJCX0NCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyBhIGNvbW1hbmQgc3BlY2lmaWMgdmFsdWUsIGZvciBleGFtcGxlIHRoZSBjdXJyZW50IGZvbnQgc2l6ZS4NCgkJICoNCgkJICogQG1ldGhvZCBxdWVyeUNvbW1hbmRWYWx1ZQ0KCQkgKiBAcGFyYW0ge3N0cmluZ30gYyBDb21tYW5kIHRvIHF1ZXJ5IHZhbHVlIGZyb20uDQoJCSAqIEByZXR1cm4ge09iamVjdH0gQ29tbWFuZCBzcGVjaWZpYyB2YWx1ZSwgZm9yIGV4YW1wbGUgdGhlIGN1cnJlbnQgZm9udCBzaXplLg0KCQkgKi8NCgkJcXVlcnlDb21tYW5kVmFsdWUgOiBmdW5jdGlvbihjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG8sIHM7DQoNCgkJCS8vIElzIGhpZGRlbiB0aGVuIHJldHVybiB1bmRlZmluZWQNCgkJCWlmICh0Ll9pc0hpZGRlbigpKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlpZiAobyA9IHQucXVlcnlWYWx1ZUNvbW1hbmRzW2NdKSB7DQoJCQkJcyA9IG8uZnVuYy5jYWxsKG8uc2NvcGUpOw0KDQoJCQkJLy8gRmFsbCB0aG91Z2ggb24gdHJ1ZQ0KCQkJCWlmIChzICE9PSB0cnVlKQ0KCQkJCQlyZXR1cm4gczsNCgkJCX0NCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlvID0gdC5lZGl0b3JDb21tYW5kcy5xdWVyeUNvbW1hbmRWYWx1ZShjKTsNCgkJCWlmIChpcyhvKSkNCgkJCQlyZXR1cm4gbzsNCg0KCQkJLy8gQnJvd3NlciBjb21tYW5kcw0KCQkJdHJ5IHsNCgkJCQlyZXR1cm4gdGhpcy5nZXREb2MoKS5xdWVyeUNvbW1hbmRWYWx1ZShjKTsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJLy8gRmFpbHMgc29tZXRpbWVzIHNlZSBidWc6IDE4OTY1NzcNCgkJCX0NCgkJfSwNCg0KCQkvKioNCgkJICogU2hvd3MgdGhlIGVkaXRvciBhbmQgaGlkZXMgYW55IHRleHRhcmVhL2RpdiB0aGF0IHRoZSBlZGl0b3IgaXMgc3VwcG9zZWQgdG8gcmVwbGFjZS4NCgkJICoNCgkJICogQG1ldGhvZCBzaG93DQoJCSAqLw0KCQlzaG93IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCURPTS5zaG93KHQuZ2V0Q29udGFpbmVyKCkpOw0KCQkJRE9NLmhpZGUodC5pZCk7DQoJCQl0LmxvYWQoKTsNCgkJfSwNCg0KCQkvKioNCgkJICogSGlkZXMgdGhlIGVkaXRvciBhbmQgc2hvd3MgYW55IHRleHRhcmVhL2RpdiB0aGF0IHRoZSBlZGl0b3IgaXMgc3VwcG9zZWQgdG8gcmVwbGFjZS4NCgkJICoNCgkJICogQG1ldGhvZCBoaWRlDQoJCSAqLw0KCQloaWRlIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGQgPSB0LmdldERvYygpOw0KDQoJCQkvLyBGaXhlZCBidWcgd2hlcmUgSUUgaGFzIGEgYmxpbmtpbmcgY3Vyc29yIGxlZnQgZnJvbSB0aGUgZWRpdG9yDQoJCQlpZiAoaXNJRSAmJiBkKQ0KCQkJCWQuZXhlY0NvbW1hbmQoJ1NlbGVjdEFsbCcpOw0KDQoJCQkvLyBXZSBtdXN0IHNhdmUgYmVmb3JlIHdlIGhpZGUgc28gU2FmYXJpIGRvZXNuJ3QgY3Jhc2gNCgkJCXQuc2F2ZSgpOw0KCQkJRE9NLmhpZGUodC5nZXRDb250YWluZXIoKSk7DQoJCQlET00uc2V0U3R5bGUodC5pZCwgJ2Rpc3BsYXknLCB0Lm9yZ0Rpc3BsYXkpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRydWUvZmFsc2UgaWYgdGhlIGVkaXRvciBpcyBoaWRkZW4gb3Igbm90Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGlzSGlkZGVuDQoJCSAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUvZmFsc2UgaWYgdGhlIGVkaXRvciBpcyBoaWRkZW4gb3Igbm90Lg0KCQkgKi8NCgkJaXNIaWRkZW4gOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiAhRE9NLmlzSGlkZGVuKHRoaXMuaWQpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIHRoZSBwcm9ncmVzcyBzdGF0ZSwgdGhpcyB3aWxsIGRpc3BsYXkgYSB0aHJvYmJlci9wcm9nZXNzIGZvciB0aGUgZWRpdG9yLg0KCQkgKiBUaGlzIGlzIGlkZWFsIGZvciBhc3ljcm9ub3VzIG9wZXJhdGlvbnMgbGlrZSBhbiBBSkFYIHNhdmUgY2FsbC4NCgkJICoNCgkJICogQG1ldGhvZCBzZXRQcm9ncmVzc1N0YXRlDQoJCSAqIEBwYXJhbSB7Qm9vbGVhbn0gYiBCb29sZWFuIHN0YXRlIGlmIHRoZSBwcm9ncmVzcyBzaG91bGQgYmUgc2hvd24gb3IgaGlkZGVuLg0KCQkgKiBAcGFyYW0ge051bWJlcn0gdGkgT3B0aW9uYWwgdGltZSB0byB3YWl0IGJlZm9yZSB0aGUgcHJvZ3Jlc3MgZ2V0cyBzaG93bi4NCgkJICogQHBhcmFtIHtPYmplY3R9IG8gT3B0aW9uYWwgb2JqZWN0IHRvIHBhc3MgdG8gdGhlIHByb2dyZXNzIG9ic2VydmVycy4NCgkJICogQHJldHVybiB7Qm9vbGVhbn0gU2FtZSBhcyB0aGUgaW5wdXQgc3RhdGUuDQoJCSAqLw0KCQlzZXRQcm9ncmVzc1N0YXRlIDogZnVuY3Rpb24oYiwgdGksIG8pIHsNCgkJCXRoaXMub25TZXRQcm9ncmVzc1N0YXRlLmRpc3BhdGNoKHRoaXMsIGIsIHRpLCBvKTsNCg0KCQkJcmV0dXJuIGI7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIExvYWRzIGNvbnRlbnRzIGZyb20gdGhlIHRleHRhcmVhIG9yIGRpdiBlbGVtZW50IHRoYXQgZ290IGNvbnZlcnRlZCBpbnRvIGFuIGVkaXRvciBpbnN0YW5jZS4NCgkJICogVGhpcyBtZXRob2Qgd2lsbCBtb3ZlIHRoZSBjb250ZW50cyBmcm9tIHRoYXQgdGV4dGFyZWEgb3IgZGl2IGludG8gdGhlIGVkaXRvciBieSB1c2luZyBzZXRDb250ZW50DQoJCSAqIHNvIGFsbCBldmVudHMgZXRjIHRoYXQgbWV0aG9kIGhhcyB3aWxsIGdldCBkaXNwYXRjaGVkIGFzIHdlbGwuDQoJCSAqDQoJCSAqIEBtZXRob2QgbG9hZA0KCQkgKiBAcGFyYW0ge09iamVjdH0gbyBPcHRpb25hbCBjb250ZW50IG9iamVjdCwgdGhpcyBnZXRzIHBhc3NlZCBhcm91bmQgdGhyb3VnaCB0aGUgd2hvbGUgbG9hZCBwcm9jZXNzLg0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nIHRoYXQgZ290IHNldCBpbnRvIHRoZSBlZGl0b3IuDQoJCSAqLw0KCQlsb2FkIDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzLCBlID0gdC5nZXRFbGVtZW50KCksIGg7DQoNCgkJCWlmIChlKSB7DQoJCQkJbyA9IG8gfHwge307DQoJCQkJby5sb2FkID0gdHJ1ZTsNCg0KCQkJCS8vIERvdWJsZSBlbmNvZGUgZXhpc3RpbmcgZW50aXRpZXMgaW4gdGhlIHZhbHVlDQoJCQkJaCA9IHQuc2V0Q29udGVudChpcyhlLnZhbHVlKSA/IGUudmFsdWUgOiBlLmlubmVySFRNTCwgbyk7DQoJCQkJby5lbGVtZW50ID0gZTsNCg0KCQkJCWlmICghby5ub19ldmVudHMpDQoJCQkJCXQub25Mb2FkQ29udGVudC5kaXNwYXRjaCh0LCBvKTsNCg0KCQkJCW8uZWxlbWVudCA9IGUgPSBudWxsOw0KDQoJCQkJcmV0dXJuIGg7DQoJCQl9DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFNhdmVzIHRoZSBjb250ZW50cyBmcm9tIGEgZWRpdG9yIG91dCB0byB0aGUgdGV4dGFyZWEgb3IgZGl2IGVsZW1lbnQgdGhhdCBnb3QgY29udmVydGVkIGludG8gYW4gZWRpdG9yIGluc3RhbmNlLg0KCQkgKiBUaGlzIG1ldGhvZCB3aWxsIG1vdmUgdGhlIEhUTUwgY29udGVudHMgZnJvbSB0aGUgZWRpdG9yIGludG8gdGhhdCB0ZXh0YXJlYSBvciBkaXYgYnkgZ2V0Q29udGVudA0KCQkgKiBzbyBhbGwgZXZlbnRzIGV0YyB0aGF0IG1ldGhvZCBoYXMgd2lsbCBnZXQgZGlzcGF0Y2hlZCBhcyB3ZWxsLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNhdmUNCgkJICogQHBhcmFtIHtPYmplY3R9IG8gT3B0aW9uYWwgY29udGVudCBvYmplY3QsIHRoaXMgZ2V0cyBwYXNzZWQgYXJvdW5kIHRocm91Z2ggdGhlIHdob2xlIHNhdmUgcHJvY2Vzcy4NCgkJICogQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZyB0aGF0IGdvdCBzZXQgaW50byB0aGUgdGV4dGFyZWEvZGl2Lg0KCQkgKi8NCgkJc2F2ZSA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciB0ID0gdGhpcywgZSA9IHQuZ2V0RWxlbWVudCgpLCBoLCBmOw0KDQoJCQlpZiAoIWUgfHwgIXQuaW5pdGlhbGl6ZWQpDQoJCQkJcmV0dXJuOw0KDQoJCQlvID0gbyB8fCB7fTsNCgkJCW8uc2F2ZSA9IHRydWU7DQoNCgkJCS8vIEFkZCB1bmRvIGxldmVsIHdpbGwgdHJpZ2dlciBvbmNoYW5nZSBldmVudA0KCQkJaWYgKCFvLm5vX2V2ZW50cykgew0KCQkJCXQudW5kb01hbmFnZXIudHlwaW5nID0gMDsNCgkJCQl0LnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJfQ0KDQoJCQlvLmVsZW1lbnQgPSBlOw0KCQkJaCA9IG8uY29udGVudCA9IHQuZ2V0Q29udGVudChvKTsNCg0KCQkJaWYgKCFvLm5vX2V2ZW50cykNCgkJCQl0Lm9uU2F2ZUNvbnRlbnQuZGlzcGF0Y2godCwgbyk7DQoNCgkJCWggPSBvLmNvbnRlbnQ7DQoNCgkJCWlmICghL1RFWFRBUkVBfElOUFVUL2kudGVzdChlLm5vZGVOYW1lKSkgew0KCQkJCWUuaW5uZXJIVE1MID0gaDsNCg0KCQkJCS8vIFVwZGF0ZSBoaWRkZW4gZm9ybSBlbGVtZW50DQoJCQkJaWYgKGYgPSBET00uZ2V0UGFyZW50KHQuaWQsICdmb3JtJykpIHsNCgkJCQkJZWFjaChmLmVsZW1lbnRzLCBmdW5jdGlvbihlKSB7DQoJCQkJCQlpZiAoZS5uYW1lID09IHQuaWQpIHsNCgkJCQkJCQllLnZhbHVlID0gaDsNCgkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0gZWxzZQ0KCQkJCWUudmFsdWUgPSBoOw0KDQoJCQlvLmVsZW1lbnQgPSBlID0gbnVsbDsNCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFNldHMgdGhlIHNwZWNpZmllZCBjb250ZW50IHRvIHRoZSBlZGl0b3IgaW5zdGFuY2UsIHRoaXMgd2lsbCBjbGVhbnVwIHRoZSBjb250ZW50IGJlZm9yZSBpdCBnZXRzIHNldCB1c2luZw0KCQkgKiB0aGUgZGlmZmVyZW50IGNsZWFudXAgcnVsZXMgb3B0aW9ucy4NCgkJICoNCgkJICogQG1ldGhvZCBzZXRDb250ZW50DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBoIENvbnRlbnQgdG8gc2V0IHRvIGVkaXRvciwgbm9ybWFsbHkgSFRNTCBjb250ZW50cyBidXQgY2FuIGJlIG90aGVyIGZvcm1hdHMgYXMgd2VsbC4NCgkJICogQHBhcmFtIHtPYmplY3R9IG8gT3B0aW9uYWwgY29udGVudCBvYmplY3QsIHRoaXMgZ2V0cyBwYXNzZWQgYXJvdW5kIHRocm91Z2ggdGhlIHdob2xlIHNldCBwcm9jZXNzLg0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nIHRoYXQgZ290IHNldCBpbnRvIHRoZSBlZGl0b3IuDQoJCSAqLw0KCQlzZXRDb250ZW50IDogZnVuY3Rpb24oaCwgbykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlvID0gbyB8fCB7fTsNCgkJCW8uZm9ybWF0ID0gby5mb3JtYXQgfHwgJ2h0bWwnOw0KCQkJby5zZXQgPSB0cnVlOw0KCQkJby5jb250ZW50ID0gaDsNCg0KCQkJaWYgKCFvLm5vX2V2ZW50cykNCgkJCQl0Lm9uQmVmb3JlU2V0Q29udGVudC5kaXNwYXRjaCh0LCBvKTsNCg0KCQkJLy8gUGFkZCBlbXB0eSBjb250ZW50IGluIEdlY2tvIGFuZCBTYWZhcmkuIENvbW1hbmRzIHdpbGwgb3RoZXJ3aXNlIGZhaWwgb24gdGhlIGNvbnRlbnQNCgkJCS8vIEl0IHdpbGwgYWxzbyBiZSBpbXBvc3NpYmxlIHRvIHBsYWNlIHRoZSBjYXJldCBpbiB0aGUgZWRpdG9yIHVubGVzcyB0aGVyZSBpcyBhIEJSIGVsZW1lbnQgcHJlc2VudA0KCQkJaWYgKCF0aW55bWNlLmlzSUUgJiYgKGgubGVuZ3RoID09PSAwIHx8IC9eXHMrJC8udGVzdChoKSkpIHsNCgkJCQlvLmNvbnRlbnQgPSB0LmRvbS5zZXRIVE1MKHQuZ2V0Qm9keSgpLCAnPGJyIF9tY2VfYm9ndXM9IjEiIC8+Jyk7DQoJCQkJby5mb3JtYXQgPSAncmF3JzsNCgkJCX0NCg0KCQkJby5jb250ZW50ID0gdC5kb20uc2V0SFRNTCh0LmdldEJvZHkoKSwgdGlueW1jZS50cmltKG8uY29udGVudCkpOw0KDQoJCQlpZiAoby5mb3JtYXQgIT0gJ3JhdycgJiYgdC5zZXR0aW5ncy5jbGVhbnVwKSB7DQoJCQkJby5nZXRJbm5lciA9IHRydWU7DQoJCQkJby5jb250ZW50ID0gdC5kb20uc2V0SFRNTCh0LmdldEJvZHkoKSwgdC5zZXJpYWxpemVyLnNlcmlhbGl6ZSh0LmdldEJvZHkoKSwgbykpOw0KCQkJfQ0KDQoJCQlpZiAoIW8ubm9fZXZlbnRzKQ0KCQkJCXQub25TZXRDb250ZW50LmRpc3BhdGNoKHQsIG8pOw0KDQoJCQlyZXR1cm4gby5jb250ZW50Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBHZXRzIHRoZSBjb250ZW50IGZyb20gdGhlIGVkaXRvciBpbnN0YW5jZSwgdGhpcyB3aWxsIGNsZWFudXAgdGhlIGNvbnRlbnQgYmVmb3JlIGl0IGdldHMgcmV0dXJuZWQgdXNpbmcNCgkJICogdGhlIGRpZmZlcmVudCBjbGVhbnVwIHJ1bGVzIG9wdGlvbnMuDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0Q29udGVudA0KCQkgKiBAcGFyYW0ge09iamVjdH0gbyBPcHRpb25hbCBjb250ZW50IG9iamVjdCwgdGhpcyBnZXRzIHBhc3NlZCBhcm91bmQgdGhyb3VnaCB0aGUgd2hvbGUgZ2V0IHByb2Nlc3MuDQoJCSAqIEByZXR1cm4ge1N0cmluZ30gQ2xlYW5lZCBjb250ZW50IHN0cmluZywgbm9ybWFsbHkgSFRNTCBjb250ZW50cy4NCgkJICovDQoJCWdldENvbnRlbnQgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGg7DQoNCgkJCW8gPSBvIHx8IHt9Ow0KCQkJby5mb3JtYXQgPSBvLmZvcm1hdCB8fCAnaHRtbCc7DQoJCQlvLmdldCA9IHRydWU7DQoNCgkJCWlmICghby5ub19ldmVudHMpDQoJCQkJdC5vbkJlZm9yZUdldENvbnRlbnQuZGlzcGF0Y2godCwgbyk7DQoNCgkJCWlmIChvLmZvcm1hdCAhPSAncmF3JyAmJiB0LnNldHRpbmdzLmNsZWFudXApIHsNCgkJCQlvLmdldElubmVyID0gdHJ1ZTsNCgkJCQloID0gdC5zZXJpYWxpemVyLnNlcmlhbGl6ZSh0LmdldEJvZHkoKSwgbyk7DQoJCQl9IGVsc2UNCgkJCQloID0gdC5nZXRCb2R5KCkuaW5uZXJIVE1MOw0KDQoJCQloID0gaC5yZXBsYWNlKC9eXHMqfFxzKiQvZywgJycpOw0KCQkJby5jb250ZW50ID0gaDsNCg0KCQkJaWYgKCFvLm5vX2V2ZW50cykNCgkJCQl0Lm9uR2V0Q29udGVudC5kaXNwYXRjaCh0LCBvKTsNCg0KCQkJcmV0dXJuIG8uY29udGVudDsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0cnVlL2ZhbHNlIGlmIHRoZSBlZGl0b3IgaXMgZGlydHkgb3Igbm90LiBJdCB3aWxsIGdldCBkaXJ0eSBpZiB0aGUgdXNlciBoYXMgbWFkZSBtb2RpZmljYXRpb25zIHRvIHRoZSBjb250ZW50cy4NCgkJICoNCgkJICogQG1ldGhvZCBpc0RpcnR5DQoJCSAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUvZmFsc2UgaWYgdGhlIGVkaXRvciBpcyBkaXJ0eSBvciBub3QuIEl0IHdpbGwgZ2V0IGRpcnR5IGlmIHRoZSB1c2VyIGhhcyBtYWRlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGNvbnRlbnRzLg0KCQkgKi8NCgkJaXNEaXJ0eSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlyZXR1cm4gdGlueW1jZS50cmltKHQuc3RhcnRDb250ZW50KSAhPSB0aW55bWNlLnRyaW0odC5nZXRDb250ZW50KHtmb3JtYXQgOiAncmF3Jywgbm9fZXZlbnRzIDogMX0pKSAmJiAhdC5pc05vdERpcnR5Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRoZSBlZGl0b3JzIGNvbnRhaW5lciBlbGVtZW50LiBUaGUgY29udGFpbmVyIGVsZW1lbnQgd3JhcHBlcyBpbg0KCQkgKiBhbGwgdGhlIGVsZW1lbnRzIGFkZGVkIHRvIHRoZSBwYWdlIGZvciB0aGUgZWRpdG9yLiBTdWNoIGFzIFVJLCBpZnJhbWUgZXRjLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldENvbnRhaW5lcg0KCQkgKiBAcmV0dXJuIHtFbGVtZW50fSBIVE1MIERPTSBlbGVtZW50IGZvciB0aGUgZWRpdG9yIGNvbnRhaW5lci4NCgkJICovDQoJCWdldENvbnRhaW5lciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoIXQuY29udGFpbmVyKQ0KCQkJCXQuY29udGFpbmVyID0gRE9NLmdldCh0LmVkaXRvckNvbnRhaW5lciB8fCB0LmlkICsgJ19wYXJlbnQnKTsNCg0KCQkJcmV0dXJuIHQuY29udGFpbmVyOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRoZSBlZGl0b3JzIGNvbnRlbnQgYXJlYSBjb250YWluZXIgZWxlbWVudC4gVGhlIHRoaXMgZWxlbWVudCBpcyB0aGUgb25lIHdobw0KCQkgKiBob2xkcyB0aGUgaWZyYW1lIG9yIHRoZSBlZGl0YWJsZSBlbGVtZW50Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldENvbnRlbnRBcmVhQ29udGFpbmVyDQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IEhUTUwgRE9NIGVsZW1lbnQgZm9yIHRoZSBlZGl0b3IgYXJlYSBjb250YWluZXIuDQoJCSAqLw0KCQlnZXRDb250ZW50QXJlYUNvbnRhaW5lciA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuY29udGVudEFyZWFDb250YWluZXI7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdGhlIHRhcmdldCBlbGVtZW50L3RleHRhcmVhIHRoYXQgZ290IHJlcGxhY2VkIHdpdGggYSBUaW55TUNFIGVkaXRvciBpbnN0YW5jZS4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRFbGVtZW50DQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IEhUTUwgRE9NIGVsZW1lbnQgZm9yIHRoZSByZXBsYWNlZCBlbGVtZW50Lg0KCQkgKi8NCgkJZ2V0RWxlbWVudCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIERPTS5nZXQodGhpcy5zZXR0aW5ncy5jb250ZW50X2VsZW1lbnQgfHwgdGhpcy5pZCk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdGhlIGlmcmFtZXMgd2luZG93IG9iamVjdC4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRXaW4NCgkJICogQHJldHVybiB7V2luZG93fSBJZnJhbWUgRE9NIHdpbmRvdyBvYmplY3QuDQoJCSAqLw0KCQlnZXRXaW4gOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZTsNCg0KCQkJaWYgKCF0LmNvbnRlbnRXaW5kb3cpIHsNCgkJCQllID0gRE9NLmdldCh0LmlkICsgIl9pZnIiKTsNCg0KCQkJCWlmIChlKQ0KCQkJCQl0LmNvbnRlbnRXaW5kb3cgPSBlLmNvbnRlbnRXaW5kb3c7DQoJCQl9DQoNCgkJCXJldHVybiB0LmNvbnRlbnRXaW5kb3c7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdGhlIGlmcmFtZXMgZG9jdW1lbnQgb2JqZWN0Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldERvYw0KCQkgKiBAcmV0dXJuIHtEb2N1bWVudH0gSWZyYW1lIERPTSBkb2N1bWVudCBvYmplY3QuDQoJCSAqLw0KCQlnZXREb2MgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgdzsNCg0KCQkJaWYgKCF0LmNvbnRlbnREb2N1bWVudCkgew0KCQkJCXcgPSB0LmdldFdpbigpOw0KDQoJCQkJaWYgKHcpDQoJCQkJCXQuY29udGVudERvY3VtZW50ID0gdy5kb2N1bWVudDsNCgkJCX0NCg0KCQkJcmV0dXJuIHQuY29udGVudERvY3VtZW50Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRoZSBpZnJhbWVzIGJvZHkgZWxlbWVudC4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRCb2R5DQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IElmcmFtZSBib2R5IGVsZW1lbnQuDQoJCSAqLw0KCQlnZXRCb2R5IDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5ib2R5RWxlbWVudCB8fCB0aGlzLmdldERvYygpLmJvZHk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFVSTCBjb252ZXJ0ZXIgZnVuY3Rpb24gdGhpcyBnZXRzIGV4ZWN1dGVkIGVhY2ggdGltZSBhIHVzZXIgYWRkcyBhbiBpbWcsIGEgb3INCgkJICogYW55IG90aGVyIGVsZW1lbnQgdGhhdCBoYXMgYSBVUkwgaW4gaXQuIFRoaXMgd2lsbCBiZSBjYWxsZWQgYm90aCBieSB0aGUgRE9NIGFuZCBIVE1MDQoJCSAqIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMuDQoJCSAqDQoJCSAqIEBtZXRob2QgY29udmVydFVSTA0KCQkgKiBAcGFyYW0ge3N0cmluZ30gdSBVUkwgdG8gY29udmVydC4NCgkJICogQHBhcmFtIHtzdHJpbmd9IG4gQXR0cmlidXRlIG5hbWUgc3JjLCBocmVmIGV0Yy4NCgkJICogQHBhcmFtIHtzdHJpbmcvSFRNTEVsZW1lbnR9IFRhZyBuYW1lIG9yIEhUTUwgRE9NIGVsZW1lbnQgZGVwZW5kaW5nIG9uIEhUTUwgb3IgRE9NIGluc2VydC4NCgkJICogQHJldHVybiB7c3RyaW5nfSBDb252ZXJ0ZWQgVVJMIHN0cmluZy4NCgkJICovDQoJCWNvbnZlcnRVUkwgOiBmdW5jdGlvbih1LCBuLCBlKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzOw0KDQoJCQkvLyBVc2UgY2FsbGJhY2sgaW5zdGVhZA0KCQkJaWYgKHMudXJsY29udmVydGVyX2NhbGxiYWNrKQ0KCQkJCXJldHVybiB0LmV4ZWNDYWxsYmFjaygndXJsY29udmVydGVyX2NhbGxiYWNrJywgdSwgZSwgdHJ1ZSwgbik7DQoNCgkJCS8vIERvbid0IGNvbnZlcnQgbGluayBocmVmIHNpbmNlIHRoYXRzIHRoZSBDU1MgZmlsZXMgdGhhdCBnZXRzIGxvYWRlZCBpbnRvIHRoZSBlZGl0b3IgYWxzbyBza2lwIGxvY2FsIGZpbGUgVVJMcw0KCQkJaWYgKCFzLmNvbnZlcnRfdXJscyB8fCAoZSAmJiBlLm5vZGVOYW1lID09ICdMSU5LJykgfHwgdS5pbmRleE9mKCdmaWxlOicpID09PSAwKQ0KCQkJCXJldHVybiB1Ow0KDQoJCQkvLyBDb252ZXJ0IHRvIHJlbGF0aXZlDQoJCQlpZiAocy5yZWxhdGl2ZV91cmxzKQ0KCQkJCXJldHVybiB0LmRvY3VtZW50QmFzZVVSSS50b1JlbGF0aXZlKHUpOw0KDQoJCQkvLyBDb252ZXJ0IHRvIGFic29sdXRlDQoJCQl1ID0gdC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZSh1LCBzLnJlbW92ZV9zY3JpcHRfaG9zdCk7DQoNCgkJCXJldHVybiB1Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBBZGRzIHZpc3VhbCBhaWQgZm9yIHRhYmxlcywgYW5jaG9ycyBldGMgc28gdGhleSBjYW4gYmUgbW9yZSBlYXNpbHkgZWRpdGVkIGluc2lkZSB0aGUgZWRpdG9yLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGFkZFZpc3VhbA0KCQkgKiBAcGFyYW0ge0VsZW1lbnR9IGUgT3B0aW9uYWwgcm9vdCBlbGVtZW50IHRvIGxvb3AgdGhvdWdoIHRvIGZpbmQgdGFibGVzIGV0YyB0aGF0IG5lZWRzIHRoZSB2aXN1YWwgYWlkLg0KCQkgKi8NCgkJYWRkVmlzdWFsIDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJZSA9IGUgfHwgdC5nZXRCb2R5KCk7DQoNCgkJCWlmICghaXModC5oYXNWaXN1YWwpKQ0KCQkJCXQuaGFzVmlzdWFsID0gcy52aXN1YWw7DQoNCgkJCWVhY2godC5kb20uc2VsZWN0KCd0YWJsZSxhJywgZSksIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgdjsNCg0KCQkJCXN3aXRjaCAoZS5ub2RlTmFtZSkgew0KCQkJCQljYXNlICdUQUJMRSc6DQoJCQkJCQl2ID0gdC5kb20uZ2V0QXR0cmliKGUsICdib3JkZXInKTsNCg0KCQkJCQkJaWYgKCF2IHx8IHYgPT0gJzAnKSB7DQoJCQkJCQkJaWYgKHQuaGFzVmlzdWFsKQ0KCQkJCQkJCQl0LmRvbS5hZGRDbGFzcyhlLCBzLnZpc3VhbF90YWJsZV9jbGFzcyk7DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCQl0LmRvbS5yZW1vdmVDbGFzcyhlLCBzLnZpc3VhbF90YWJsZV9jbGFzcyk7DQoJCQkJCQl9DQoNCgkJCQkJCXJldHVybjsNCg0KCQkJCQljYXNlICdBJzoNCgkJCQkJCXYgPSB0LmRvbS5nZXRBdHRyaWIoZSwgJ25hbWUnKTsNCg0KCQkJCQkJaWYgKHYpIHsNCgkJCQkJCQlpZiAodC5oYXNWaXN1YWwpDQoJCQkJCQkJCXQuZG9tLmFkZENsYXNzKGUsICdtY2VJdGVtQW5jaG9yJyk7DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCQl0LmRvbS5yZW1vdmVDbGFzcyhlLCAnbWNlSXRlbUFuY2hvcicpOw0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXQub25WaXN1YWxBaWQuZGlzcGF0Y2godCwgZSwgdC5oYXNWaXN1YWwpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZW1vdmVzIHRoZSBlZGl0b3IgZnJvbSB0aGUgZG9tIGFuZCB0aW55bWNlIGNvbGxlY3Rpb24uDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVtb3ZlDQoJCSAqLw0KCQlyZW1vdmUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZSA9IHQuZ2V0Q29udGFpbmVyKCk7DQoNCgkJCXQucmVtb3ZlZCA9IDE7IC8vIENhbmNlbHMgcG9zdCByZW1vdmUgZXZlbnQgZXhlY3V0aW9uDQoJCQl0LmhpZGUoKTsNCg0KCQkJdC5leGVjQ2FsbGJhY2soJ3JlbW92ZV9pbnN0YW5jZV9jYWxsYmFjaycsIHQpOw0KCQkJdC5vblJlbW92ZS5kaXNwYXRjaCh0KTsNCg0KCQkJLy8gQ2xlYXIgYWxsIGV4ZWNDb21tYW5kIGxpc3RlbmVycyB0aGlzIGlzIHJlcXVpcmVkIHRvIGF2b2lkIGVycm9ycyBpZiB0aGUgZWRpdG9yIHdhcyByZW1vdmVkIGluc2lkZSBhbm90aGVyIGNvbW1hbmQNCgkJCXQub25FeGVjQ29tbWFuZC5saXN0ZW5lcnMgPSBbXTsNCg0KCQkJdGlueW1jZS5yZW1vdmUodCk7DQoJCQlET00ucmVtb3ZlKGUpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBEZXN0cm95cyB0aGUgZWRpdG9yIGluc3RhbmNlIGJ5IHJlbW92aW5nIGFsbCBldmVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcyBvciBvdGhlciByZXNvdXJjZXMNCgkJICogdGhhdCBjb3VsZCBsZWFrIG1lbW9yeS4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwYWdlIGlzIHVubG9hZGVkDQoJCSAqIGJ1dCB5b3UgY2FuIGFsc28gY2FsbCBpdCBkaXJlY3RseSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuDQoJCSAqDQoJCSAqIEBtZXRob2QgZGVzdHJveQ0KCQkgKiBAcGFyYW0ge0Jvb2xlYW59IHMgT3B0aW9uYWwgc3RhdGUgaWYgdGhlIGRlc3Ryb3kgaXMgYW4gYXV0b21hdGljIGRlc3Ryb3kgb3IgdXNlciBjYWxsZWQgb25lLg0KCQkgKi8NCgkJZGVzdHJveSA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJLy8gT25lIHRpbWUgaXMgZW5vdWdoDQoJCQlpZiAodC5kZXN0cm95ZWQpDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiAoIXMpIHsNCgkJCQl0aW55bWNlLnJlbW92ZVVubG9hZCh0LmRlc3Ryb3kpOw0KCQkJCXRpbnlNQ0Uub25CZWZvcmVVbmxvYWQucmVtb3ZlKHQuX2JlZm9yZVVubG9hZCk7DQoNCgkJCQkvLyBNYW51YWwgZGVzdHJveQ0KCQkJCWlmICh0LnRoZW1lICYmIHQudGhlbWUuZGVzdHJveSkNCgkJCQkJdC50aGVtZS5kZXN0cm95KCk7DQoNCgkJCQkvLyBEZXN0cm95IGNvbnRyb2xzLCBzZWxlY3Rpb24gYW5kIGRvbQ0KCQkJCXQuY29udHJvbE1hbmFnZXIuZGVzdHJveSgpOw0KCQkJCXQuc2VsZWN0aW9uLmRlc3Ryb3koKTsNCgkJCQl0LmRvbS5kZXN0cm95KCk7DQoNCgkJCQkvLyBSZW1vdmUgYWxsIGV2ZW50cw0KDQoJCQkJLy8gRG9uJ3QgY2xlYXIgdGhlIHdpbmRvdyBvciBkb2N1bWVudCBpZiBjb250ZW50IGVkaXRhYmxlDQoJCQkJLy8gaXMgZW5hYmxlZCBzaW5jZSBvdGhlciBpbnN0YW5jZXMgbWlnaHQgc3RpbGwgYmUgcHJlc2VudA0KCQkJCWlmICghdC5zZXR0aW5ncy5jb250ZW50X2VkaXRhYmxlKSB7DQoJCQkJCUV2ZW50LmNsZWFyKHQuZ2V0V2luKCkpOw0KCQkJCQlFdmVudC5jbGVhcih0LmdldERvYygpKTsNCgkJCQl9DQoNCgkJCQlFdmVudC5jbGVhcih0LmdldEJvZHkoKSk7DQoJCQkJRXZlbnQuY2xlYXIodC5mb3JtRWxlbWVudCk7DQoJCQl9DQoNCgkJCWlmICh0LmZvcm1FbGVtZW50KSB7DQoJCQkJdC5mb3JtRWxlbWVudC5zdWJtaXQgPSB0LmZvcm1FbGVtZW50Ll9tY2VPbGRTdWJtaXQ7DQoJCQkJdC5mb3JtRWxlbWVudC5fbWNlT2xkU3VibWl0ID0gbnVsbDsNCgkJCX0NCg0KCQkJdC5jb250ZW50QXJlYUNvbnRhaW5lciA9IHQuZm9ybUVsZW1lbnQgPSB0LmNvbnRhaW5lciA9IHQuc2V0dGluZ3MuY29udGVudF9lbGVtZW50ID0gdC5ib2R5RWxlbWVudCA9IHQuY29udGVudERvY3VtZW50ID0gdC5jb250ZW50V2luZG93ID0gbnVsbDsNCg0KCQkJaWYgKHQuc2VsZWN0aW9uKQ0KCQkJCXQuc2VsZWN0aW9uID0gdC5zZWxlY3Rpb24ud2luID0gdC5zZWxlY3Rpb24uZG9tID0gdC5zZWxlY3Rpb24uZG9tLmRvYyA9IG51bGw7DQoNCgkJCXQuZGVzdHJveWVkID0gMTsNCgkJfSwNCg0KCQkvLyBJbnRlcm5hbCBmdW5jdGlvbnMNCg0KCQlfYWRkRXZlbnRzIDogZnVuY3Rpb24oKSB7DQoJCQkvLyAnZm9jdXMnLCAnYmx1cicsICdkYmxjbGljaycsICdiZWZvcmVkZWFjdGl2YXRlJywgc3VibWl0LCByZXNldA0KCQkJdmFyIHQgPSB0aGlzLCBpLCBzID0gdC5zZXR0aW5ncywgZG9tID0gdC5kb20sIGxvID0gew0KCQkJCW1vdXNldXAgOiAnb25Nb3VzZVVwJywNCgkJCQltb3VzZWRvd24gOiAnb25Nb3VzZURvd24nLA0KCQkJCWNsaWNrIDogJ29uQ2xpY2snLA0KCQkJCWtleXVwIDogJ29uS2V5VXAnLA0KCQkJCWtleWRvd24gOiAnb25LZXlEb3duJywNCgkJCQlrZXlwcmVzcyA6ICdvbktleVByZXNzJywNCgkJCQlzdWJtaXQgOiAnb25TdWJtaXQnLA0KCQkJCXJlc2V0IDogJ29uUmVzZXQnLA0KCQkJCWNvbnRleHRtZW51IDogJ29uQ29udGV4dE1lbnUnLA0KCQkJCWRibGNsaWNrIDogJ29uRGJsQ2xpY2snLA0KCQkJCXBhc3RlIDogJ29uUGFzdGUnIC8vIERvZXNuJ3Qgd29yayBpbiBhbGwgYnJvd3NlcnMgeWV0DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBldmVudEhhbmRsZXIoZSwgbykgew0KCQkJCXZhciB0eSA9IGUudHlwZTsNCg0KCQkJCS8vIERvbid0IGZpcmUgZXZlbnRzIHdoZW4gaXQncyByZW1vdmVkDQoJCQkJaWYgKHQucmVtb3ZlZCkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJLy8gR2VuZXJpYyBldmVudCBoYW5kbGVyDQoJCQkJaWYgKHQub25FdmVudC5kaXNwYXRjaCh0LCBlLCBvKSAhPT0gZmFsc2UpIHsNCgkJCQkJLy8gU3BlY2lmaWMgZXZlbnQgaGFuZGxlcg0KCQkJCQl0W2xvW2UuZmFrZVR5cGUgfHwgZS50eXBlXV0uZGlzcGF0Y2godCwgZSwgbyk7DQoJCQkJfQ0KCQkJfTsNCg0KCQkJLy8gQWRkIERPTSBldmVudHMNCgkJCWVhY2gobG8sIGZ1bmN0aW9uKHYsIGspIHsNCgkJCQlzd2l0Y2ggKGspIHsNCgkJCQkJY2FzZSAnY29udGV4dG1lbnUnOg0KCQkJCQkJaWYgKHRpbnltY2UuaXNPcGVyYSkgew0KCQkJCQkJCS8vIEZha2UgY29udGV4dG1lbnUgb24gT3BlcmENCgkJCQkJCQlkb20uYmluZCh0LmdldEJvZHkoKSwgJ21vdXNlZG93bicsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJCQkJaWYgKGUuY3RybEtleSkgew0KCQkJCQkJCQkJZS5mYWtlVHlwZSA9ICdjb250ZXh0bWVudSc7DQoJCQkJCQkJCQlldmVudEhhbmRsZXIoZSk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9KTsNCgkJCQkJCX0gZWxzZQ0KCQkJCQkJCWRvbS5iaW5kKHQuZ2V0Qm9keSgpLCBrLCBldmVudEhhbmRsZXIpOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAncGFzdGUnOg0KCQkJCQkJZG9tLmJpbmQodC5nZXRCb2R5KCksIGssIGZ1bmN0aW9uKGUpIHsNCgkJCQkJCQlldmVudEhhbmRsZXIoZSk7DQoJCQkJCQl9KTsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ3N1Ym1pdCc6DQoJCQkJCWNhc2UgJ3Jlc2V0JzoNCgkJCQkJCWRvbS5iaW5kKHQuZ2V0RWxlbWVudCgpLmZvcm0gfHwgRE9NLmdldFBhcmVudCh0LmlkLCAnZm9ybScpLCBrLCBldmVudEhhbmRsZXIpOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJZGVmYXVsdDoNCgkJCQkJCWRvbS5iaW5kKHMuY29udGVudF9lZGl0YWJsZSA/IHQuZ2V0Qm9keSgpIDogdC5nZXREb2MoKSwgaywgZXZlbnRIYW5kbGVyKTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJZG9tLmJpbmQocy5jb250ZW50X2VkaXRhYmxlID8gdC5nZXRCb2R5KCkgOiAoaXNHZWNrbyA/IHQuZ2V0RG9jKCkgOiB0LmdldFdpbigpKSwgJ2ZvY3VzJywgZnVuY3Rpb24oZSkgew0KCQkJCXQuZm9jdXModHJ1ZSk7DQoJCQl9KTsNCg0KCQkJLy8gI2lmZGVmIGNvbnRlbnRFZGl0YWJsZQ0KDQoJCQlpZiAocy5jb250ZW50X2VkaXRhYmxlICYmIHRpbnltY2UuaXNPcGVyYSkgew0KCQkJCS8vIE9wZXJhIGRvZXNuJ3Qgc3VwcG9ydCBmb2N1cyBldmVudCBmb3IgY29udGVudEVkaXRhYmxlIGVsZW1lbnRzIHNvIHdlIG5lZWQgdG8gZmFrZSBpdA0KCQkJCWZ1bmN0aW9uIGRvRm9jdXMoZSkgew0KCQkJCQl0LmZvY3VzKHRydWUpOw0KCQkJCX07DQoNCgkJCQlkb20uYmluZCh0LmdldEJvZHkoKSwgJ2NsaWNrJywgZG9Gb2N1cyk7DQoJCQkJZG9tLmJpbmQodC5nZXRCb2R5KCksICdrZXlkb3duJywgZG9Gb2N1cyk7DQoJCQl9DQoNCgkJCS8vICNlbmRpZg0KDQoJCQkvLyBGaXhlcyBidWcgd2hlcmUgYSBzcGVjaWZpZWQgZG9jdW1lbnRfYmFzZV91cmkgY291bGQgcmVzdWx0IGluIGJyb2tlbiBpbWFnZXMNCgkJCS8vIFRoaXMgd2lsbCBhbHNvIGZpeCBkcmFnIGRyb3Agb2YgaW1hZ2VzIGluIEdlY2tvDQoJCQlpZiAodGlueW1jZS5pc0dlY2tvKSB7DQoJCQkJZG9tLmJpbmQodC5nZXREb2MoKSwgJ0RPTU5vZGVJbnNlcnRlZCcsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJdmFyIHY7DQoNCgkJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJCWlmIChlLm5vZGVUeXBlID09PSAxICYmIGUubm9kZU5hbWUgPT09ICdJTUcnICYmICh2ID0gZS5nZXRBdHRyaWJ1dGUoJ19tY2Vfc3JjJykpKQ0KCQkJCQkJZS5zcmMgPSB0LmRvY3VtZW50QmFzZVVSSS50b0Fic29sdXRlKHYpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBTZXQgdmFyaW91cyBtaWRhcyBvcHRpb25zIGluIEdlY2tvDQoJCQlpZiAoaXNHZWNrbykgew0KCQkJCWZ1bmN0aW9uIHNldE9wdHMoKSB7DQoJCQkJCXZhciB0ID0gdGhpcywgZCA9IHQuZ2V0RG9jKCksIHMgPSB0LnNldHRpbmdzOw0KDQoJCQkJCWlmIChpc0dlY2tvICYmICFzLnJlYWRvbmx5KSB7DQoJCQkJCQlpZiAodC5faXNIaWRkZW4oKSkgew0KCQkJCQkJCXRyeSB7DQoJCQkJCQkJCWlmICghcy5jb250ZW50X2VkaXRhYmxlKQ0KCQkJCQkJCQkJZC5kZXNpZ25Nb2RlID0gJ09uJzsNCgkJCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJCQkvLyBGYWlscyBpZiBpdCdzIGhpZGRlbg0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJdHJ5IHsNCgkJCQkJCQkvLyBUcnkgbmV3IEdlY2tvIG1ldGhvZA0KCQkJCQkJCWQuZXhlY0NvbW1hbmQoInN0eWxlV2l0aENTUyIsIDAsIGZhbHNlKTsNCgkJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkJLy8gVXNlIG9sZCBtZXRob2QNCgkJCQkJCQlpZiAoIXQuX2lzSGlkZGVuKCkpDQoJCQkJCQkJCXRyeSB7ZC5leGVjQ29tbWFuZCgidXNlQ1NTIiwgMCwgdHJ1ZSk7fSBjYXRjaCAoZXgpIHt9DQoJCQkJCQl9DQoNCgkJCQkJCWlmICghcy50YWJsZV9pbmxpbmVfZWRpdGluZykNCgkJCQkJCQl0cnkge2QuZXhlY0NvbW1hbmQoJ2VuYWJsZUlubGluZVRhYmxlRWRpdGluZycsIGZhbHNlLCBmYWxzZSk7fSBjYXRjaCAoZXgpIHt9DQoNCgkJCQkJCWlmICghcy5vYmplY3RfcmVzaXppbmcpDQoJCQkJCQkJdHJ5IHtkLmV4ZWNDb21tYW5kKCdlbmFibGVPYmplY3RSZXNpemluZycsIGZhbHNlLCBmYWxzZSk7fSBjYXRjaCAoZXgpIHt9DQoJCQkJCX0NCgkJCQl9Ow0KDQoJCQkJdC5vbkJlZm9yZUV4ZWNDb21tYW5kLmFkZChzZXRPcHRzKTsNCgkJCQl0Lm9uTW91c2VEb3duLmFkZChzZXRPcHRzKTsNCgkJCX0NCg0KCQkJLy8gV29ya2Fyb3VuZCBmb3IgYnVnLCBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjI1MA0KCQkJLy8gV2ViS2l0IGNhbid0IGV2ZW4gZG8gc2ltcGxlIHRoaW5ncyBsaWtlIHNlbGVjdGluZyBhbiBpbWFnZQ0KCQkJLy8gVGhpcyBhbHNvIGZpeGVzIHNvIGl0J3MgcG9zc2libGUgdG8gc2VsZWN0IG1jZUl0ZW1BbmNob3JzDQoJCQlpZiAodGlueW1jZS5pc1dlYktpdCkgew0KCQkJCXQub25DbGljay5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJCS8vIE5lZWRzIHRvYmUgdGhlIHNldEJhc2VBbmRFeHRlbmQgb3IgaXQgd2lsbCBmYWlsIHRvIHNlbGVjdCBmbG9hdGVkIGltYWdlcw0KCQkJCQlpZiAoZS5ub2RlTmFtZSA9PSAnSU1HJyB8fCAoZS5ub2RlTmFtZSA9PSAnQScgJiYgZG9tLmhhc0NsYXNzKGUsICdtY2VJdGVtQW5jaG9yJykpKSB7DQoJCQkJCQl0LnNlbGVjdGlvbi5nZXRTZWwoKS5zZXRCYXNlQW5kRXh0ZW50KGUsIDAsIGUsIDEpOw0KCQkJCQkJdC5ub2RlQ2hhbmdlZCgpOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9DQoNCgkJCS8vIEFkZCBub2RlIGNoYW5nZSBoYW5kbGVycw0KCQkJdC5vbk1vdXNlVXAuYWRkKHQubm9kZUNoYW5nZWQpOw0KCQkJLy90Lm9uQ2xpY2suYWRkKHQubm9kZUNoYW5nZWQpOw0KCQkJdC5vbktleVVwLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCXZhciBjID0gZS5rZXlDb2RlOw0KDQoJCQkJaWYgKChjID49IDMzICYmIGMgPD0gMzYpIHx8IChjID49IDM3ICYmIGMgPD0gNDApIHx8IGMgPT0gMTMgfHwgYyA9PSA0NSB8fCBjID09IDQ2IHx8IGMgPT0gOCB8fCAodGlueW1jZS5pc01hYyAmJiAoYyA9PSA5MSB8fCBjID09IDkzKSkgfHwgZS5jdHJsS2V5KQ0KCQkJCQl0Lm5vZGVDaGFuZ2VkKCk7DQoJCQl9KTsNCg0KCQkJLy8gQWRkIHJlc2V0IGhhbmRsZXINCgkJCXQub25SZXNldC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJdC5zZXRDb250ZW50KHQuc3RhcnRDb250ZW50LCB7Zm9ybWF0IDogJ3Jhdyd9KTsNCgkJCX0pOw0KDQoJCQkvLyBBZGQgc2hvcnRjdXRzDQoJCQlpZiAocy5jdXN0b21fc2hvcnRjdXRzKSB7DQoJCQkJaWYgKHMuY3VzdG9tX3VuZG9fcmVkb19rZXlib2FyZF9zaG9ydGN1dHMpIHsNCgkJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCt6JywgdC5nZXRMYW5nKCd1bmRvX2Rlc2MnKSwgJ1VuZG8nKTsNCgkJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCt5JywgdC5nZXRMYW5nKCdyZWRvX2Rlc2MnKSwgJ1JlZG8nKTsNCgkJCQl9DQoNCgkJCQkvLyBBZGQgZGVmYXVsdCBzaG9ydGN1dHMgZm9yIGdlY2tvDQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCtiJywgdC5nZXRMYW5nKCdib2xkX2Rlc2MnKSwgJ0JvbGQnKTsNCgkJCQl0LmFkZFNob3J0Y3V0KCdjdHJsK2knLCB0LmdldExhbmcoJ2l0YWxpY19kZXNjJyksICdJdGFsaWMnKTsNCgkJCQl0LmFkZFNob3J0Y3V0KCdjdHJsK3UnLCB0LmdldExhbmcoJ3VuZGVybGluZV9kZXNjJyksICdVbmRlcmxpbmUnKTsNCg0KCQkJCS8vIEJsb2NrRm9ybWF0IHNob3J0Y3V0cyBrZXlzDQoJCQkJZm9yIChpPTE7IGk8PTY7IGkrKykNCgkJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCsnICsgaSwgJycsIFsnRm9ybWF0QmxvY2snLCBmYWxzZSwgJ2gnICsgaV0pOw0KDQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCs3JywgJycsIFsnRm9ybWF0QmxvY2snLCBmYWxzZSwgJzxwPiddKTsNCgkJCQl0LmFkZFNob3J0Y3V0KCdjdHJsKzgnLCAnJywgWydGb3JtYXRCbG9jaycsIGZhbHNlLCAnPGRpdj4nXSk7DQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCs5JywgJycsIFsnRm9ybWF0QmxvY2snLCBmYWxzZSwgJzxhZGRyZXNzPiddKTsNCg0KCQkJCWZ1bmN0aW9uIGZpbmQoZSkgew0KCQkJCQl2YXIgdiA9IG51bGw7DQoNCgkJCQkJaWYgKCFlLmFsdEtleSAmJiAhZS5jdHJsS2V5ICYmICFlLm1ldGFLZXkpDQoJCQkJCQlyZXR1cm4gdjsNCg0KCQkJCQllYWNoKHQuc2hvcnRjdXRzLCBmdW5jdGlvbihvKSB7DQoJCQkJCQlpZiAodGlueW1jZS5pc01hYyAmJiBvLmN0cmwgIT0gZS5tZXRhS2V5KQ0KCQkJCQkJCXJldHVybjsNCgkJCQkJCWVsc2UgaWYgKCF0aW55bWNlLmlzTWFjICYmIG8uY3RybCAhPSBlLmN0cmxLZXkpDQoJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQlpZiAoby5hbHQgIT0gZS5hbHRLZXkpDQoJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQlpZiAoby5zaGlmdCAhPSBlLnNoaWZ0S2V5KQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJaWYgKGUua2V5Q29kZSA9PSBvLmtleUNvZGUgfHwgKGUuY2hhckNvZGUgJiYgZS5jaGFyQ29kZSA9PSBvLmNoYXJDb2RlKSkgew0KCQkJCQkJCXYgPSBvOw0KCQkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJCX0NCgkJCQkJfSk7DQoNCgkJCQkJcmV0dXJuIHY7DQoJCQkJfTsNCg0KCQkJCXQub25LZXlVcC5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJdmFyIG8gPSBmaW5kKGUpOw0KDQoJCQkJCWlmIChvKQ0KCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQl9KTsNCg0KCQkJCXQub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJdmFyIG8gPSBmaW5kKGUpOw0KDQoJCQkJCWlmIChvKQ0KCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQl9KTsNCg0KCQkJCXQub25LZXlEb3duLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQl2YXIgbyA9IGZpbmQoZSk7DQoNCgkJCQkJaWYgKG8pIHsNCgkJCQkJCW8uZnVuYy5jYWxsKG8uc2NvcGUpOw0KCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAodGlueW1jZS5pc0lFKSB7DQoJCQkJLy8gRml4IHNvIHJlc2l6ZSB3aWxsIG9ubHkgdXBkYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGF0dHJpYnV0ZXMgbm90IHRoZSBzdHlsZXMgb2YgYW4gaW1hZ2UNCgkJCQkvLyBJdCB3aWxsIGFsc28gYmxvY2sgbWNlSXRlbU5vUmVzaXplIGl0ZW1zDQoJCQkJZG9tLmJpbmQodC5nZXREb2MoKSwgJ2NvbnRyb2xzZWxlY3QnLCBmdW5jdGlvbihlKSB7DQoJCQkJCXZhciByZSA9IHQucmVzaXplSW5mbywgY2I7DQoNCgkJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJCS8vIERvbid0IGRvIHRoaXMgYWN0aW9uIGZvciBub24gaW1hZ2UgZWxlbWVudHMNCgkJCQkJaWYgKGUubm9kZU5hbWUgIT09ICdJTUcnKQ0KCQkJCQkJcmV0dXJuOw0KDQoJCQkJCWlmIChyZSkNCgkJCQkJCWRvbS51bmJpbmQocmUubm9kZSwgcmUuZXYsIHJlLmNiKTsNCg0KCQkJCQlpZiAoIWRvbS5oYXNDbGFzcyhlLCAnbWNlSXRlbU5vUmVzaXplJykpIHsNCgkJCQkJCWV2ID0gJ3Jlc2l6ZWVuZCc7DQoJCQkJCQljYiA9IGRvbS5iaW5kKGUsIGV2LCBmdW5jdGlvbihlKSB7DQoJCQkJCQkJdmFyIHY7DQoNCgkJCQkJCQllID0gZS50YXJnZXQ7DQoNCgkJCQkJCQlpZiAodiA9IGRvbS5nZXRTdHlsZShlLCAnd2lkdGgnKSkgew0KCQkJCQkJCQlkb20uc2V0QXR0cmliKGUsICd3aWR0aCcsIHYucmVwbGFjZSgvW14wLTklXSsvZywgJycpKTsNCgkJCQkJCQkJZG9tLnNldFN0eWxlKGUsICd3aWR0aCcsICcnKTsNCgkJCQkJCQl9DQoNCgkJCQkJCQlpZiAodiA9IGRvbS5nZXRTdHlsZShlLCAnaGVpZ2h0JykpIHsNCgkJCQkJCQkJZG9tLnNldEF0dHJpYihlLCAnaGVpZ2h0Jywgdi5yZXBsYWNlKC9bXjAtOSVdKy9nLCAnJykpOw0KCQkJCQkJCQlkb20uc2V0U3R5bGUoZSwgJ2hlaWdodCcsICcnKTsNCgkJCQkJCQl9DQoJCQkJCQl9KTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWV2ID0gJ3Jlc2l6ZXN0YXJ0JzsNCgkJCQkJCWNiID0gZG9tLmJpbmQoZSwgJ3Jlc2l6ZXN0YXJ0JywgRXZlbnQuY2FuY2VsLCBFdmVudCk7DQoJCQkJCX0NCg0KCQkJCQlyZSA9IHQucmVzaXplSW5mbyA9IHsNCgkJCQkJCW5vZGUgOiBlLA0KCQkJCQkJZXYgOiBldiwNCgkJCQkJCWNiIDogY2INCgkJCQkJfTsNCgkJCQl9KTsNCg0KCQkJCXQub25LZXlEb3duLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQlzd2l0Y2ggKGUua2V5Q29kZSkgew0KCQkJCQkJY2FzZSA4Og0KCQkJCQkJCS8vIEZpeCBJRSBjb250cm9sICsgYmFja3NwYWNlIGJyb3dzZXIgYnVnDQoJCQkJCQkJaWYgKHQuc2VsZWN0aW9uLmdldFJuZygpLml0ZW0pIHsNCgkJCQkJCQkJZWQuZG9tLnJlbW92ZSh0LnNlbGVjdGlvbi5nZXRSbmcoKS5pdGVtKDApKTsNCgkJCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQkJCQl9DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCS8qaWYgKHQuZG9tLmJveE1vZGVsKSB7DQoJCQkJCXQuZ2V0Qm9keSgpLnN0eWxlLmhlaWdodCA9ICcxMDAlJzsNCg0KCQkJCQlFdmVudC5hZGQodC5nZXRXaW4oKSwgJ3Jlc2l6ZScsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJCXZhciBkb2NFbG0gPSB0LmdldERvYygpLmRvY3VtZW50RWxlbWVudDsNCg0KCQkJCQkJZG9jRWxtLnN0eWxlLmhlaWdodCA9IChkb2NFbG0ub2Zmc2V0SGVpZ2h0IC0gMTApICsgJ3B4JzsNCgkJCQkJfSk7DQoJCQkJfSovDQoJCQl9DQoNCgkJCWlmICh0aW55bWNlLmlzT3BlcmEpIHsNCgkJCQl0Lm9uQ2xpY2suYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCUV2ZW50LnByZXZlbnQoZSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCS8vIEFkZCBjdXN0b20gdW5kby9yZWRvIGhhbmRsZXJzDQoJCQlpZiAocy5jdXN0b21fdW5kb19yZWRvKSB7DQoJCQkJZnVuY3Rpb24gYWRkVW5kbygpIHsNCgkJCQkJdC51bmRvTWFuYWdlci50eXBpbmcgPSAwOw0KCQkJCQl0LnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJCX07DQoNCgkJCQlkb20uYmluZCh0LmdldERvYygpLCAnZm9jdXNvdXQnLCBmdW5jdGlvbihlKSB7DQoJCQkJCWlmICghdC5yZW1vdmVkICYmIHQudW5kb01hbmFnZXIudHlwaW5nKQ0KCQkJCQkJYWRkVW5kbygpOw0KCQkJCX0pOw0KDQoJCQkJdC5vbktleVVwLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQlpZiAoKGUua2V5Q29kZSA+PSAzMyAmJiBlLmtleUNvZGUgPD0gMzYpIHx8IChlLmtleUNvZGUgPj0gMzcgJiYgZS5rZXlDb2RlIDw9IDQwKSB8fCBlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDQ1IHx8IGUuY3RybEtleSkNCgkJCQkJCWFkZFVuZG8oKTsNCgkJCQl9KTsNCg0KCQkJCXQub25LZXlEb3duLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQl2YXIgcm5nLCBwYXJlbnQsIGJvb2ttYXJrOw0KDQoJCQkJCS8vIElFIGhhcyBhIHJlYWxseSBvZGQgYnVnIHdoZXJlIHRoZSBET00gbWlnaHQgaW5jbHVkZSBhbiBub2RlIHRoYXQgZG9lc24ndCBoYXZlDQoJCQkJCS8vIGEgcHJvcGVyIHN0cnVjdHVyZS4gSWYgeW91IHRyeSB0byBhY2Nlc3Mgbm9kZVZhbHVlIGl0IHdvdWxkIHRocm93IGFuIGlsbGVnYWwgdmFsdWUgZXhjZXB0aW9uLg0KCQkJCQkvLyBUaGlzIHNlZW1zIHRvIG9ubHkgaGFwcGVuIHdoZW4geW91IGRlbGV0ZSBjb250ZW50cyBhbmQgaXQgc2VlbXMgdG8gYmUgYXZvaWRhYmxlIGlmIHlvdSByZWZyZXNoIHRoZSBlbGVtZW50DQoJCQkJCS8vIGFmdGVyIHlvdSBkZWxldGUgY29udGVudHMgZnJvbSBpdC4gU2VlOiAjMzAwODkyMw0KCQkJCQlpZiAoaXNJRSAmJiBlLmtleUNvZGUgPT0gNDYpIHsNCgkJCQkJCXJuZyA9IHQuc2VsZWN0aW9uLmdldFJuZygpOw0KDQoJCQkJCQlpZiAocm5nLnBhcmVudEVsZW1lbnQpIHsNCgkJCQkJCQlwYXJlbnQgPSBybmcucGFyZW50RWxlbWVudCgpOw0KDQoJCQkJCQkJLy8gU2VsZWN0IG5leHQgd29yZCB3aGVuIGN0cmwga2V5IGlzIHVzZWQgaW4gY29tYm8gd2l0aCBkZWxldGUNCgkJCQkJCQlpZiAoZS5jdHJsS2V5KSB7DQoJCQkJCQkJCXJuZy5tb3ZlRW5kKCd3b3JkJywgMSk7DQoJCQkJCQkJCXJuZy5zZWxlY3QoKTsNCgkJCQkJCQl9DQoNCgkJCQkJCQkvLyBEZWxldGUgY29udGVudHMNCgkJCQkJCQl0LnNlbGVjdGlvbi5nZXRTZWwoKS5jbGVhcigpOw0KDQoJCQkJCQkJLy8gQ2hlY2sgaWYgd2UgYXJlIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQNCgkJCQkJCQlpZiAocm5nLnBhcmVudEVsZW1lbnQoKSA9PSBwYXJlbnQpIHsNCgkJCQkJCQkJYm9va21hcmsgPSB0LnNlbGVjdGlvbi5nZXRCb29rbWFyaygpOw0KDQoJCQkJCQkJCXRyeSB7DQoJCQkJCQkJCQkvLyBVcGRhdGUgdGhlIEhUTUwgYW5kIGhvcGVmdWxseSBpdCB3aWxsIHJlbW92ZSB0aGUgYXJ0aWZhY3RzDQoJCQkJCQkJCQlwYXJlbnQuaW5uZXJIVE1MID0gcGFyZW50LmlubmVySFRNTDsNCgkJCQkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCQkJCS8vIEFuZCBzaW5jZSBpdCdzIElFIGl0IGNhbiBzb21ldGltZXMgcHJvZHVjZSBhbiB1bmtub3duIHJ1bnRpbWUgZXJyb3INCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCS8vIFJlc3RvcmUgdGhlIGNhcmV0IHBvc2l0aW9uDQoJCQkJCQkJCXQuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsNCgkJCQkJCQl9DQoNCgkJCQkJCQkvLyBCbG9jayB0aGUgZGVmYXVsdCBkZWxldGUgYmVoYXZpb3Igc2luY2UgaXQgbWlnaHQgYmUgYnJva2VuDQoJCQkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOw0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIElzIGNhcmFjdGVyIHBvc2l0b24ga2V5cw0KCQkJCQlpZiAoKGUua2V5Q29kZSA+PSAzMyAmJiBlLmtleUNvZGUgPD0gMzYpIHx8IChlLmtleUNvZGUgPj0gMzcgJiYgZS5rZXlDb2RlIDw9IDQwKSB8fCBlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDQ1KSB7DQoJCQkJCQlpZiAodC51bmRvTWFuYWdlci50eXBpbmcpDQoJCQkJCQkJYWRkVW5kbygpOw0KDQoJCQkJCQlyZXR1cm47DQoJCQkJCX0NCg0KCQkJCQlpZiAoIXQudW5kb01hbmFnZXIudHlwaW5nKSB7DQoJCQkJCQl0LnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJCQkJdC51bmRvTWFuYWdlci50eXBpbmcgPSAxOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQl0Lm9uTW91c2VEb3duLmFkZChmdW5jdGlvbigpIHsNCgkJCQkJaWYgKHQudW5kb01hbmFnZXIudHlwaW5nKQ0KCQkJCQkJYWRkVW5kbygpOw0KCQkJCX0pOw0KCQkJfQ0KCQl9LA0KDQoJCV9pc0hpZGRlbiA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHM7DQoNCgkJCWlmICghaXNHZWNrbykNCgkJCQlyZXR1cm4gMDsNCg0KCQkJLy8gV2VpcmQsIHdoZXJlcyB0aGF0IGN1cnNvciBzZWxlY3Rpb24/DQoJCQlzID0gdGhpcy5zZWxlY3Rpb24uZ2V0U2VsKCk7DQoJCQlyZXR1cm4gKCFzIHx8ICFzLnJhbmdlQ291bnQgfHwgcy5yYW5nZUNvdW50ID09IDApOw0KCQl9LA0KDQoJCS8vIEZpeCBmb3IgYnVnICMxODY3MjkyDQoJCV9maXhOZXN0aW5nIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIGQgPSBbXSwgaTsNCg0KCQkJcyA9IHMucmVwbGFjZSgvPChcLyk/KFteXHM+XSspW14+XSo/Pi9nLCBmdW5jdGlvbihhLCBiLCBjKSB7DQoJCQkJdmFyIGU7DQoNCgkJCQkvLyBIYW5kbGUgZW5kIGVsZW1lbnQNCgkJCQlpZiAoYiA9PT0gJy8nKSB7DQoJCQkJCWlmICghZC5sZW5ndGgpDQoJCQkJCQlyZXR1cm4gJyc7DQoNCgkJCQkJaWYgKGMgIT09IGRbZC5sZW5ndGggLSAxXS50YWcpIHsNCgkJCQkJCWZvciAoaT1kLmxlbmd0aCAtIDE7IGk+PTA7IGktLSkgew0KCQkJCQkJCWlmIChkW2ldLnRhZyA9PT0gYykgew0KCQkJCQkJCQlkW2ldLmNsb3NlID0gMTsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm4gJyc7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlkLnBvcCgpOw0KDQoJCQkJCQlpZiAoZC5sZW5ndGggJiYgZFtkLmxlbmd0aCAtIDFdLmNsb3NlKSB7DQoJCQkJCQkJYSA9IGEgKyAnPC8nICsgZFtkLmxlbmd0aCAtIDFdLnRhZyArICc+JzsNCgkJCQkJCQlkLnBvcCgpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gSWdub3JlIHRoZXNlDQoJCQkJCWlmICgvXihicnxocnxpbnB1dHxtZXRhfGltZ3xsaW5rfHBhcmFtKSQvaS50ZXN0KGMpKQ0KCQkJCQkJcmV0dXJuIGE7DQoNCgkJCQkJLy8gSWdub3JlIGNsb3NlZCBvbmVzDQoJCQkJCWlmICgvXC8+JC8udGVzdChhKSkNCgkJCQkJCXJldHVybiBhOw0KDQoJCQkJCWQucHVzaCh7dGFnIDogY30pOyAvLyBQdXNoIHN0YXJ0IGVsZW1lbnQNCgkJCQl9DQoNCgkJCQlyZXR1cm4gYTsNCgkJCX0pOw0KDQoJCQkvLyBFbmQgYWxsIG9wZW4gdGFncw0KCQkJZm9yIChpPWQubGVuZ3RoIC0gMTsgaT49MDsgaS0tKQ0KCQkJCXMgKz0gJzwvJyArIGRbaV0udGFnICsgJz4nOw0KDQoJCQlyZXR1cm4gczsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/EditorCommands.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBFZGl0b3JDb21tYW5kcy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gQWRkZWQgZm9yIGNvbXByZXNzaW9uIHB1cnBvc2VzDQoJdmFyIGVhY2ggPSB0aW55bWNlLmVhY2gsIHVuZGVmaW5lZCwgVFJVRSA9IHRydWUsIEZBTFNFID0gZmFsc2U7DQoNCgkvKioNCgkgKiBUaGlzIGNsYXNzIGVuYWJsZXMgeW91IHRvIGFkZCBjdXN0b20gZWRpdG9yIGNvbW1hbmRzIGFuZCBpdCBjb250YWlucw0KCSAqIG92ZXJyaWRlcyBmb3IgbmF0aXZlIGJyb3dzZXIgY29tbWFuZHMgdG8gYWRkcmVzcyB2YXJpb3VzIGJ1Z3MgYW5kIGlzc3Vlcy4NCgkgKg0KCSAqIEBjbGFzcyB0aW55bWNlLkVkaXRvckNvbW1hbmRzDQoJICovDQoJdGlueW1jZS5FZGl0b3JDb21tYW5kcyA9IGZ1bmN0aW9uKGVkaXRvcikgew0KCQl2YXIgZG9tID0gZWRpdG9yLmRvbSwNCgkJCXNlbGVjdGlvbiA9IGVkaXRvci5zZWxlY3Rpb24sDQoJCQljb21tYW5kcyA9IHtzdGF0ZToge30sIGV4ZWMgOiB7fSwgdmFsdWUgOiB7fX0sDQoJCQlzZXR0aW5ncyA9IGVkaXRvci5zZXR0aW5ncywNCgkJCWJvb2ttYXJrOw0KDQoJCS8qKg0KCQkgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuDQoJCSAqDQoJCSAqIEBtZXRob2QgZXhlY0NvbW1hbmQNCgkJICogQHBhcmFtIHtTdHJpbmd9IGNvbW1hbmQgQ29tbWFuZCB0byBleGVjdXRlLg0KCQkgKiBAcGFyYW0ge0Jvb2xlYW59IHVpIE9wdGlvbmFsIHVzZXIgaW50ZXJmYWNlIHN0YXRlLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgT3B0aW9uYWwgdmFsdWUgZm9yIGNvbW1hbmQuDQoJCSAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUvZmFsc2UgaWYgdGhlIGNvbW1hbmQgd2FzIGZvdW5kIG9yIG5vdC4NCgkJICovDQoJCWZ1bmN0aW9uIGV4ZWNDb21tYW5kKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJdmFyIGZ1bmM7DQoNCgkJCWNvbW1hbmQgPSBjb21tYW5kLnRvTG93ZXJDYXNlKCk7DQoJCQlpZiAoZnVuYyA9IGNvbW1hbmRzLmV4ZWNbY29tbWFuZF0pIHsNCgkJCQlmdW5jKGNvbW1hbmQsIHVpLCB2YWx1ZSk7DQoJCQkJcmV0dXJuIFRSVUU7DQoJCQl9DQoNCgkJCXJldHVybiBGQUxTRTsNCgkJfTsNCg0KCQkvKioNCgkJICogUXVlcmllcyB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYSBjb21tYW5kIGZvciBleGFtcGxlIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyAiYm9sZCIuDQoJCSAqDQoJCSAqIEBtZXRob2QgcXVlcnlDb21tYW5kU3RhdGUNCgkJICogQHBhcmFtIHtTdHJpbmd9IGNvbW1hbmQgQ29tbWFuZCB0byBjaGVjayB0aGUgc3RhdGUgb2YuDQoJCSAqIEByZXR1cm4ge0Jvb2xlYW4vTnVtYmVyfSB0cnVlL2ZhbHNlIGlmIHRoZSBzZWxlY3RlZCBjb250ZW50cyBpcyBib2xkIG9yIG5vdCwgLTEgaWYgaXQncyBub3QgZm91bmQuDQoJCSAqLw0KCQlmdW5jdGlvbiBxdWVyeUNvbW1hbmRTdGF0ZShjb21tYW5kKSB7DQoJCQl2YXIgZnVuYzsNCg0KCQkJY29tbWFuZCA9IGNvbW1hbmQudG9Mb3dlckNhc2UoKTsNCgkJCWlmIChmdW5jID0gY29tbWFuZHMuc3RhdGVbY29tbWFuZF0pDQoJCQkJcmV0dXJuIGZ1bmMoY29tbWFuZCk7DQoNCgkJCXJldHVybiAtMTsNCgkJfTsNCg0KCQkvKioNCgkJICogUXVlcmllcyB0aGUgY29tbWFuZCB2YWx1ZSBmb3IgZXhhbXBsZSB0aGUgY3VycmVudCBmb250c2l6ZS4NCgkJICoNCgkJICogQG1ldGhvZCBxdWVyeUNvbW1hbmRWYWx1ZQ0KCQkgKiBAcGFyYW0ge1N0cmluZ30gY29tbWFuZCBDb21tYW5kIHRvIGNoZWNrIHRoZSB2YWx1ZSBvZi4NCgkJICogQHJldHVybiB7T2JqZWN0fSBDb21tYW5kIHZhbHVlIG9mIGZhbHNlIGlmIGl0J3Mgbm90IGZvdW5kLg0KCQkgKi8NCgkJZnVuY3Rpb24gcXVlcnlDb21tYW5kVmFsdWUoY29tbWFuZCkgew0KCQkJdmFyIGZ1bmM7DQoNCgkJCWNvbW1hbmQgPSBjb21tYW5kLnRvTG93ZXJDYXNlKCk7DQoJCQlpZiAoZnVuYyA9IGNvbW1hbmRzLnZhbHVlW2NvbW1hbmRdKQ0KCQkJCXJldHVybiBmdW5jKGNvbW1hbmQpOw0KDQoJCQlyZXR1cm4gRkFMU0U7DQoJCX07DQoNCgkJLyoqDQoJCSAqIEFkZHMgY29tbWFuZHMgdG8gdGhlIGNvbW1hbmQgY29sbGVjdGlvbi4NCgkJICoNCgkJICogQG1ldGhvZCBhZGRDb21tYW5kcw0KCQkgKiBAcGFyYW0ge09iamVjdH0gY29tbWFuZF9saXN0IE5hbWUvdmFsdWUgY29sbGVjdGlvbiB3aXRoIGNvbW1hbmRzIHRvIGFkZCwgdGhlIG5hbWVzIGNhbiBhbHNvIGJlIGNvbW1hIHNlcGFyYXRlZC4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgT3B0aW9uYWwgdHlwZSB0byBhZGQsIGRlZmF1bHRzIHRvIGV4ZWMuIENhbiBiZSB2YWx1ZSBvciBzdGF0ZSBhcyB3ZWxsLg0KCQkgKi8NCgkJZnVuY3Rpb24gYWRkQ29tbWFuZHMoY29tbWFuZF9saXN0LCB0eXBlKSB7DQoJCQl0eXBlID0gdHlwZSB8fCAnZXhlYyc7DQoNCgkJCWVhY2goY29tbWFuZF9saXN0LCBmdW5jdGlvbihjYWxsYmFjaywgY29tbWFuZCkgew0KCQkJCWVhY2goY29tbWFuZC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQkJY29tbWFuZHNbdHlwZV1bY29tbWFuZF0gPSBjYWxsYmFjazsNCgkJCQl9KTsNCgkJCX0pOw0KCQl9Ow0KDQoJCS8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcw0KCQl0aW55bWNlLmV4dGVuZCh0aGlzLCB7DQoJCQlleGVjQ29tbWFuZCA6IGV4ZWNDb21tYW5kLA0KCQkJcXVlcnlDb21tYW5kU3RhdGUgOiBxdWVyeUNvbW1hbmRTdGF0ZSwNCgkJCXF1ZXJ5Q29tbWFuZFZhbHVlIDogcXVlcnlDb21tYW5kVmFsdWUsDQoJCQlhZGRDb21tYW5kcyA6IGFkZENvbW1hbmRzDQoJCX0pOw0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KDQoJCWZ1bmN0aW9uIGV4ZWNOYXRpdmVDb21tYW5kKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJaWYgKHVpID09PSB1bmRlZmluZWQpDQoJCQkJdWkgPSBGQUxTRTsNCg0KCQkJaWYgKHZhbHVlID09PSB1bmRlZmluZWQpDQoJCQkJdmFsdWUgPSBudWxsOw0KDQoJCQlyZXR1cm4gZWRpdG9yLmdldERvYygpLmV4ZWNDb21tYW5kKGNvbW1hbmQsIHVpLCB2YWx1ZSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gaXNGb3JtYXRNYXRjaChuYW1lKSB7DQoJCQlyZXR1cm4gZWRpdG9yLmZvcm1hdHRlci5tYXRjaChuYW1lKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiB0b2dnbGVGb3JtYXQobmFtZSwgdmFsdWUpIHsNCgkJCWVkaXRvci5mb3JtYXR0ZXIudG9nZ2xlKG5hbWUsIHZhbHVlID8ge3ZhbHVlIDogdmFsdWV9IDogdW5kZWZpbmVkKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzdG9yZVNlbGVjdGlvbih0eXBlKSB7DQoJCQlib29rbWFyayA9IHNlbGVjdGlvbi5nZXRCb29rbWFyayh0eXBlKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKCkgew0KCQkJc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsNCgkJfTsNCg0KCQkvLyBBZGQgZXhlY0NvbW1hbmQgb3ZlcnJpZGVzDQoJCWFkZENvbW1hbmRzKHsNCgkJCS8vIElnbm9yZSB0aGVzZSwgYWRkZWQgZm9yIGNvbXBhdGliaWxpdHkNCgkJCSdtY2VSZXNldERlc2lnbk1vZGUsbWNlQmVnaW5VbmRvTGV2ZWwnIDogZnVuY3Rpb24oKSB7fSwNCg0KCQkJLy8gQWRkIHVuZG8gbWFuYWdlciBsb2dpYw0KCQkJJ21jZUVuZFVuZG9MZXZlbCxtY2VBZGRVbmRvTGV2ZWwnIDogZnVuY3Rpb24oKSB7DQoJCQkJZWRpdG9yLnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJfSwNCg0KCQkJJ0N1dCxDb3B5LFBhc3RlJyA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQl2YXIgZG9jID0gZWRpdG9yLmdldERvYygpLCBmYWlsZWQ7DQoNCgkJCQkvLyBUcnkgZXhlY3V0aW5nIHRoZSBuYXRpdmUgY29tbWFuZA0KCQkJCXRyeSB7DQoJCQkJCWV4ZWNOYXRpdmVDb21tYW5kKGNvbW1hbmQpOw0KCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCS8vIENvbW1hbmQgZmFpbGVkDQoJCQkJCWZhaWxlZCA9IFRSVUU7DQoJCQkJfQ0KDQoJCQkJLy8gUHJlc2VudCBhbGVydCBtZXNzYWdlIGFib3V0IGNsaXBib2FyZCBhY2Nlc3Mgbm90IGJlaW5nIGF2YWlsYWJsZQ0KCQkJCWlmIChmYWlsZWQgfHwgIWRvYy5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQoY29tbWFuZCkpIHsNCgkJCQkJaWYgKHRpbnltY2UuaXNHZWNrbykgew0KCQkJCQkJZWRpdG9yLndpbmRvd01hbmFnZXIuY29uZmlybShlZGl0b3IuZ2V0TGFuZygnY2xpcGJvYXJkX21zZycpLCBmdW5jdGlvbihzdGF0ZSkgew0KCQkJCQkJCWlmIChzdGF0ZSkNCgkJCQkJCQkJb3BlbignaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9lZGl0b3IvbWlkYXNkZW1vL3NlY3VyaXR5cHJlZnMuaHRtbCcsICdfYmxhbmsnKTsNCgkJCQkJCX0pOw0KCQkJCQl9IGVsc2UNCgkJCQkJCWVkaXRvci53aW5kb3dNYW5hZ2VyLmFsZXJ0KGVkaXRvci5nZXRMYW5nKCdjbGlwYm9hcmRfbm9fc3VwcG9ydCcpKTsNCgkJCQl9DQoJCQl9LA0KDQoJCQkvLyBPdmVycmlkZSB1bmxpbmsgY29tbWFuZA0KCQkJdW5saW5rIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCWlmIChzZWxlY3Rpb24uaXNDb2xsYXBzZWQoKSkNCgkJCQkJc2VsZWN0aW9uLnNlbGVjdChzZWxlY3Rpb24uZ2V0Tm9kZSgpKTsNCg0KCQkJCWV4ZWNOYXRpdmVDb21tYW5kKGNvbW1hbmQpOw0KCQkJCXNlbGVjdGlvbi5jb2xsYXBzZShGQUxTRSk7DQoJCQl9LA0KDQoJCQkvLyBPdmVycmlkZSBqdXN0aWZ5IGNvbW1hbmRzIHRvIHVzZSB0aGUgdGV4dCBmb3JtYXR0ZXIgZW5naW5lDQoJCQknSnVzdGlmeUxlZnQsSnVzdGlmeUNlbnRlcixKdXN0aWZ5UmlnaHQsSnVzdGlmeUZ1bGwnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXZhciBhbGlnbiA9IGNvbW1hbmQuc3Vic3RyaW5nKDcpOw0KDQoJCQkJLy8gUmVtb3ZlIGFsbCBvdGhlciBhbGlnbm1lbnRzIGZpcnN0DQoJCQkJZWFjaCgnbGVmdCxjZW50ZXIscmlnaHQsZnVsbCcuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkgew0KCQkJCQlpZiAoYWxpZ24gIT0gbmFtZSkNCgkJCQkJCWVkaXRvci5mb3JtYXR0ZXIucmVtb3ZlKCdhbGlnbicgKyBuYW1lKTsNCgkJCQl9KTsNCg0KCQkJCXRvZ2dsZUZvcm1hdCgnYWxpZ24nICsgYWxpZ24pOw0KCQkJfSwNCg0KCQkJLy8gT3ZlcnJpZGUgbGlzdCBjb21tYW5kcyB0byBmaXggV2ViS2l0IGJ1Zw0KCQkJJ0luc2VydFVub3JkZXJlZExpc3QsSW5zZXJ0T3JkZXJlZExpc3QnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXZhciBsaXN0RWxtLCBsaXN0UGFyZW50Ow0KDQoJCQkJZXhlY05hdGl2ZUNvbW1hbmQoY29tbWFuZCk7DQoNCgkJCQkvLyBXZWJLaXQgcHJvZHVjZXMgbGlzdHMgd2l0aGluIGJsb2NrIGVsZW1lbnRzIHNvIHdlIG5lZWQgdG8gc3BsaXQgdGhlbQ0KCQkJCS8vIHdlIHdpbGwgcmVwbGFjZSB0aGUgbmF0aXZlIGxpc3QgY3JlYXRpb24gbG9naWMgdG8gY3VzdG9tIGxvZ2ljIGxhdGVyIG9uDQoJCQkJLy8gVE9ETzogUmVtb3ZlIHRoaXMgd2hlbiB0aGUgbGlzdCBjcmVhdGlvbiBsb2dpYyBpcyByZW1vdmVkDQoJCQkJbGlzdEVsbSA9IGRvbS5nZXRQYXJlbnQoc2VsZWN0aW9uLmdldE5vZGUoKSwgJ29sLHVsJyk7DQoJCQkJaWYgKGxpc3RFbG0pIHsNCgkJCQkJbGlzdFBhcmVudCA9IGxpc3RFbG0ucGFyZW50Tm9kZTsNCg0KCQkJCQkvLyBJZiBsaXN0IGlzIHdpdGhpbiBhIHRleHQgYmxvY2sgdGhlbiBzcGxpdCB0aGF0IGJsb2NrDQoJCQkJCWlmICgvXihIWzEtNl18UHxBRERSRVNTfFBSRSkkLy50ZXN0KGxpc3RQYXJlbnQubm9kZU5hbWUpKSB7DQoJCQkJCQlzdG9yZVNlbGVjdGlvbigpOw0KCQkJCQkJZG9tLnNwbGl0KGxpc3RQYXJlbnQsIGxpc3RFbG0pOw0KCQkJCQkJcmVzdG9yZVNlbGVjdGlvbigpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSwNCg0KCQkJLy8gT3ZlcnJpZGUgY29tbWFuZHMgdG8gdXNlIHRoZSB0ZXh0IGZvcm1hdHRlciBlbmdpbmUNCgkJCSdCb2xkLEl0YWxpYyxVbmRlcmxpbmUsU3RyaWtldGhyb3VnaCcgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJdG9nZ2xlRm9ybWF0KGNvbW1hbmQpOw0KCQkJfSwNCg0KCQkJLy8gT3ZlcnJpZGUgY29tbWFuZHMgdG8gdXNlIHRoZSB0ZXh0IGZvcm1hdHRlciBlbmdpbmUNCgkJCSdGb3JlQ29sb3IsSGlsaXRlQ29sb3IsRm9udE5hbWUnIDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJdG9nZ2xlRm9ybWF0KGNvbW1hbmQsIHZhbHVlKTsNCgkJCX0sDQoNCgkJCUZvbnRTaXplIDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJdmFyIGZvbnRDbGFzc2VzLCBmb250U2l6ZXM7DQoNCgkJCQkvLyBDb252ZXJ0IGZvbnQgc2l6ZSAxLTcgdG8gc3R5bGVzDQoJCQkJaWYgKHZhbHVlID49IDEgJiYgdmFsdWUgPD0gNykgew0KCQkJCQlmb250U2l6ZXMgPSB0aW55bWNlLmV4cGxvZGUoc2V0dGluZ3MuZm9udF9zaXplX3N0eWxlX3ZhbHVlcyk7DQoJCQkJCWZvbnRDbGFzc2VzID0gdGlueW1jZS5leHBsb2RlKHNldHRpbmdzLmZvbnRfc2l6ZV9jbGFzc2VzKTsNCg0KCQkJCQlpZiAoZm9udENsYXNzZXMpDQoJCQkJCQl2YWx1ZSA9IGZvbnRDbGFzc2VzW3ZhbHVlIC0gMV0gfHwgdmFsdWU7DQoJCQkJCWVsc2UNCgkJCQkJCXZhbHVlID0gZm9udFNpemVzW3ZhbHVlIC0gMV0gfHwgdmFsdWU7DQoJCQkJfQ0KDQoJCQkJdG9nZ2xlRm9ybWF0KGNvbW1hbmQsIHZhbHVlKTsNCgkJCX0sDQoNCgkJCVJlbW92ZUZvcm1hdCA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQllZGl0b3IuZm9ybWF0dGVyLnJlbW92ZShjb21tYW5kKTsNCgkJCX0sDQoNCgkJCW1jZUJsb2NrUXVvdGUgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJdG9nZ2xlRm9ybWF0KCdibG9ja3F1b3RlJyk7DQoJCQl9LA0KDQoJCQlGb3JtYXRCbG9jayA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXJldHVybiB0b2dnbGVGb3JtYXQodmFsdWUgfHwgJ3AnKTsNCgkJCX0sDQoNCgkJCW1jZUNsZWFudXAgOiBmdW5jdGlvbigpIHsNCgkJCQl2YXIgYm9va21hcmsgPSBzZWxlY3Rpb24uZ2V0Qm9va21hcmsoKTsNCg0KCQkJCWVkaXRvci5zZXRDb250ZW50KGVkaXRvci5nZXRDb250ZW50KHtjbGVhbnVwIDogVFJVRX0pLCB7Y2xlYW51cCA6IFRSVUV9KTsNCg0KCQkJCXNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhib29rbWFyayk7DQoJCQl9LA0KDQoJCQltY2VSZW1vdmVOb2RlIDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJdmFyIG5vZGUgPSB2YWx1ZSB8fCBzZWxlY3Rpb24uZ2V0Tm9kZSgpOw0KDQoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGJvZHkgbm9kZSBpc24ndCByZW1vdmVkDQoJCQkJaWYgKG5vZGUgIT0gZWRpdG9yLmdldEJvZHkoKSkgew0KCQkJCQlzdG9yZVNlbGVjdGlvbigpOw0KCQkJCQllZGl0b3IuZG9tLnJlbW92ZShub2RlLCBUUlVFKTsNCgkJCQkJcmVzdG9yZVNlbGVjdGlvbigpOw0KCQkJCX0NCgkJCX0sDQoNCgkJCW1jZVNlbGVjdE5vZGVEZXB0aCA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXZhciBjb3VudGVyID0gMDsNCg0KCQkJCWRvbS5nZXRQYXJlbnQoc2VsZWN0aW9uLmdldE5vZGUoKSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIGNvdW50ZXIrKyA9PSB2YWx1ZSkgew0KCQkJCQkJc2VsZWN0aW9uLnNlbGVjdChub2RlKTsNCgkJCQkJCXJldHVybiBGQUxTRTsNCgkJCQkJfQ0KCQkJCX0sIGVkaXRvci5nZXRCb2R5KCkpOw0KCQkJfSwNCg0KCQkJbWNlU2VsZWN0Tm9kZSA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXNlbGVjdGlvbi5zZWxlY3QodmFsdWUpOw0KCQkJfSwNCg0KCQkJbWNlSW5zZXJ0Q29udGVudCA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXNlbGVjdGlvbi5zZXRDb250ZW50KHZhbHVlKTsNCgkJCX0sDQoNCgkJCW1jZUluc2VydFJhd0hUTUwgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQlzZWxlY3Rpb24uc2V0Q29udGVudCgndGlueV9tY2VfbWFya2VyJyk7DQoJCQkJZWRpdG9yLnNldENvbnRlbnQoZWRpdG9yLmdldENvbnRlbnQoKS5yZXBsYWNlKC90aW55X21jZV9tYXJrZXIvZywgZnVuY3Rpb24oKSB7IHJldHVybiB2YWx1ZSB9KSk7DQoJCQl9LA0KDQoJCQltY2VTZXRDb250ZW50IDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJZWRpdG9yLnNldENvbnRlbnQodmFsdWUpOw0KCQkJfSwNCg0KCQkJJ0luZGVudCxPdXRkZW50JyA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQl2YXIgaW50ZW50VmFsdWUsIGluZGVudFVuaXQsIHZhbHVlOw0KDQoJCQkJLy8gU2V0dXAgaW5kZW50IGxldmVsDQoJCQkJaW50ZW50VmFsdWUgPSBzZXR0aW5ncy5pbmRlbnRhdGlvbjsNCgkJCQlpbmRlbnRVbml0ID0gL1thLXolXSskL2kuZXhlYyhpbnRlbnRWYWx1ZSk7DQoJCQkJaW50ZW50VmFsdWUgPSBwYXJzZUludChpbnRlbnRWYWx1ZSk7DQoNCgkJCQlpZiAoIXF1ZXJ5Q29tbWFuZFN0YXRlKCdJbnNlcnRVbm9yZGVyZWRMaXN0JykgJiYgIXF1ZXJ5Q29tbWFuZFN0YXRlKCdJbnNlcnRPcmRlcmVkTGlzdCcpKSB7DQoJCQkJCWVhY2goc2VsZWN0aW9uLmdldFNlbGVjdGVkQmxvY2tzKCksIGZ1bmN0aW9uKGVsZW1lbnQpIHsNCgkJCQkJCWlmIChjb21tYW5kID09ICdvdXRkZW50Jykgew0KCQkJCQkJCXZhbHVlID0gTWF0aC5tYXgoMCwgcGFyc2VJbnQoZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCB8fCAwKSAtIGludGVudFZhbHVlKTsNCgkJCQkJCQlkb20uc2V0U3R5bGUoZWxlbWVudCwgJ3BhZGRpbmdMZWZ0JywgdmFsdWUgPyB2YWx1ZSArIGluZGVudFVuaXQgOiAnJyk7DQoJCQkJCQl9IGVsc2UNCgkJCQkJCQlkb20uc2V0U3R5bGUoZWxlbWVudCwgJ3BhZGRpbmdMZWZ0JywgKHBhcnNlSW50KGVsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgfHwgMCkgKyBpbnRlbnRWYWx1ZSkgKyBpbmRlbnRVbml0KTsNCgkJCQkJfSk7DQoJCQkJfSBlbHNlDQoJCQkJCWV4ZWNOYXRpdmVDb21tYW5kKGNvbW1hbmQpOw0KCQkJfSwNCg0KCQkJbWNlUmVwYWludCA6IGZ1bmN0aW9uKCkgew0KCQkJCXZhciBib29rbWFyazsNCg0KCQkJCWlmICh0aW55bWNlLmlzR2Vja28pIHsNCgkJCQkJdHJ5IHsNCgkJCQkJCXN0b3JlU2VsZWN0aW9uKFRSVUUpOw0KDQoJCQkJCQlpZiAoc2VsZWN0aW9uLmdldFNlbCgpKQ0KCQkJCQkJCXNlbGVjdGlvbi5nZXRTZWwoKS5zZWxlY3RBbGxDaGlsZHJlbihlZGl0b3IuZ2V0Qm9keSgpKTsNCg0KCQkJCQkJc2VsZWN0aW9uLmNvbGxhcHNlKFRSVUUpOw0KCQkJCQkJcmVzdG9yZVNlbGVjdGlvbigpOw0KCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJLy8gSWdub3JlDQoJCQkJCX0NCgkJCQl9DQoJCQl9LA0KDQoJCQltY2VUb2dnbGVGb3JtYXQgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQllZGl0b3IuZm9ybWF0dGVyLnRvZ2dsZSh2YWx1ZSk7DQoJCQl9LA0KDQoJCQlJbnNlcnRIb3Jpem9udGFsUnVsZSA6IGZ1bmN0aW9uKCkgew0KCQkJCXNlbGVjdGlvbi5zZXRDb250ZW50KCc8aHIgLz4nKTsNCgkJCX0sDQoNCgkJCW1jZVRvZ2dsZVZpc3VhbEFpZCA6IGZ1bmN0aW9uKCkgew0KCQkJCWVkaXRvci5oYXNWaXN1YWwgPSAhZWRpdG9yLmhhc1Zpc3VhbDsNCgkJCQllZGl0b3IuYWRkVmlzdWFsKCk7DQoJCQl9LA0KDQoJCQltY2VSZXBsYWNlQ29udGVudCA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXNlbGVjdGlvbi5zZXRDb250ZW50KHZhbHVlLnJlcGxhY2UoL1x7XCRzZWxlY3Rpb25cfS9nLCBzZWxlY3Rpb24uZ2V0Q29udGVudCh7Zm9ybWF0IDogJ3RleHQnfSkpKTsNCgkJCX0sDQoNCgkJCW1jZUluc2VydExpbmsgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQl2YXIgbGluayA9IGRvbS5nZXRQYXJlbnQoc2VsZWN0aW9uLmdldE5vZGUoKSwgJ2EnKTsNCg0KCQkJCWlmICh0aW55bWNlLmlzKHZhbHVlLCAnc3RyaW5nJykpDQoJCQkJCXZhbHVlID0ge2hyZWYgOiB2YWx1ZX07DQoNCgkJCQlpZiAoIWxpbmspIHsNCgkJCQkJZXhlY05hdGl2ZUNvbW1hbmQoJ0NyZWF0ZUxpbmsnLCBGQUxTRSwgJ2phdmFzY3JpcHQ6bWN0bXAoMCk7Jyk7DQoJCQkJCWVhY2goZG9tLnNlbGVjdCgnYVtocmVmPWphdmFzY3JpcHQ6bWN0bXAoMCk7XScpLCBmdW5jdGlvbihsaW5rKSB7DQoJCQkJCQlkb20uc2V0QXR0cmlicyhsaW5rLCB2YWx1ZSk7DQoJCQkJCX0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWlmICh2YWx1ZS5ocmVmKQ0KCQkJCQkJZG9tLnNldEF0dHJpYnMobGluaywgdmFsdWUpOw0KCQkJCQllbHNlDQoJCQkJCQllZGl0b3IuZG9tLnJlbW92ZShsaW5rLCBUUlVFKTsNCgkJCQl9DQoJCQl9LA0KCQkJDQoJCQlzZWxlY3RBbGwgOiBmdW5jdGlvbigpIHsNCgkJCQl2YXIgcm9vdCA9IGRvbS5nZXRSb290KCksIHJuZyA9IGRvbS5jcmVhdGVSbmcoKTsNCg0KCQkJCXJuZy5zZXRTdGFydChyb290LCAwKTsNCgkJCQlybmcuc2V0RW5kKHJvb3QsIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGgpOw0KDQoJCQkJZWRpdG9yLnNlbGVjdGlvbi5zZXRSbmcocm5nKTsNCgkJCX0NCgkJfSk7DQoNCgkJLy8gQWRkIHF1ZXJ5Q29tbWFuZFN0YXRlIG92ZXJyaWRlcw0KCQlhZGRDb21tYW5kcyh7DQoJCQkvLyBPdmVycmlkZSBqdXN0aWZ5IGNvbW1hbmRzDQoJCQknSnVzdGlmeUxlZnQsSnVzdGlmeUNlbnRlcixKdXN0aWZ5UmlnaHQsSnVzdGlmeUZ1bGwnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXJldHVybiBpc0Zvcm1hdE1hdGNoKCdhbGlnbicgKyBjb21tYW5kLnN1YnN0cmluZyg3KSk7DQoJCQl9LA0KDQoJCQknQm9sZCxJdGFsaWMsVW5kZXJsaW5lLFN0cmlrZXRocm91Z2gnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXJldHVybiBpc0Zvcm1hdE1hdGNoKGNvbW1hbmQpOw0KCQkJfSwNCg0KCQkJbWNlQmxvY2tRdW90ZSA6IGZ1bmN0aW9uKCkgew0KCQkJCXJldHVybiBpc0Zvcm1hdE1hdGNoKCdibG9ja3F1b3RlJyk7DQoJCQl9LA0KDQoJCQlPdXRkZW50IDogZnVuY3Rpb24oKSB7DQoJCQkJdmFyIG5vZGU7DQoNCgkJCQlpZiAoc2V0dGluZ3MuaW5saW5lX3N0eWxlcykgew0KCQkJCQlpZiAoKG5vZGUgPSBkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXRTdGFydCgpLCBkb20uaXNCbG9jaykpICYmIHBhcnNlSW50KG5vZGUuc3R5bGUucGFkZGluZ0xlZnQpID4gMCkNCgkJCQkJCXJldHVybiBUUlVFOw0KDQoJCQkJCWlmICgobm9kZSA9IGRvbS5nZXRQYXJlbnQoc2VsZWN0aW9uLmdldEVuZCgpLCBkb20uaXNCbG9jaykpICYmIHBhcnNlSW50KG5vZGUuc3R5bGUucGFkZGluZ0xlZnQpID4gMCkNCgkJCQkJCXJldHVybiBUUlVFOw0KCQkJCX0NCg0KCQkJCXJldHVybiBxdWVyeUNvbW1hbmRTdGF0ZSgnSW5zZXJ0VW5vcmRlcmVkTGlzdCcpIHx8IHF1ZXJ5Q29tbWFuZFN0YXRlKCdJbnNlcnRPcmRlcmVkTGlzdCcpIHx8ICghc2V0dGluZ3MuaW5saW5lX3N0eWxlcyAmJiAhIWRvbS5nZXRQYXJlbnQoc2VsZWN0aW9uLmdldE5vZGUoKSwgJ0JMT0NLUVVPVEUnKSk7DQoJCQl9LA0KDQoJCQknSW5zZXJ0VW5vcmRlcmVkTGlzdCxJbnNlcnRPcmRlcmVkTGlzdCcgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJcmV0dXJuIGRvbS5nZXRQYXJlbnQoc2VsZWN0aW9uLmdldE5vZGUoKSwgY29tbWFuZCA9PSAnaW5zZXJ0dW5vcmRlcmVkbGlzdCcgPyAnVUwnIDogJ09MJyk7DQoJCQl9DQoJCX0sICdzdGF0ZScpOw0KDQoJCS8vIEFkZCBxdWVyeUNvbW1hbmRWYWx1ZSBvdmVycmlkZXMNCgkJYWRkQ29tbWFuZHMoew0KCQkJJ0ZvbnRTaXplLEZvbnROYW1lJyA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQl2YXIgdmFsdWUgPSAwLCBwYXJlbnQ7DQoNCgkJCQlpZiAocGFyZW50ID0gZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCAnc3BhbicpKSB7DQoJCQkJCWlmIChjb21tYW5kID09ICdmb250c2l6ZScpDQoJCQkJCQl2YWx1ZSA9IHBhcmVudC5zdHlsZS5mb250U2l6ZTsNCgkJCQkJZWxzZQ0KCQkJCQkJdmFsdWUgPSBwYXJlbnQuc3R5bGUuZm9udEZhbWlseS5yZXBsYWNlKC8sIC9nLCAnLCcpLnJlcGxhY2UoL1tcJ1wiXS9nLCAnJykudG9Mb3dlckNhc2UoKTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gdmFsdWU7DQoJCQl9DQoJCX0sICd2YWx1ZScpOw0KDQoJCS8vIEFkZCB1bmRvIG1hbmFnZXIgbG9naWMNCgkJaWYgKHNldHRpbmdzLmN1c3RvbV91bmRvX3JlZG8pIHsNCgkJCWFkZENvbW1hbmRzKHsNCgkJCQlVbmRvIDogZnVuY3Rpb24oKSB7DQoJCQkJCWVkaXRvci51bmRvTWFuYWdlci51bmRvKCk7DQoJCQkJfSwNCg0KCQkJCVJlZG8gOiBmdW5jdGlvbigpIHsNCgkJCQkJZWRpdG9yLnVuZG9NYW5hZ2VyLnJlZG8oKTsNCgkJCQl9DQoJCQl9KTsNCgkJfQ0KCX07DQp9KSh0aW55bWNlKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/EditorManager.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBFZGl0b3JNYW5hZ2VyLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgkvKioNCgkgKiBAY2xhc3MgdGlueW1jZQ0KCSAqLw0KDQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBlYWNoID0gdGlueW1jZS5lYWNoLCBleHRlbmQgPSB0aW55bWNlLmV4dGVuZCwNCgkJRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsDQoJCVRoZW1lTWFuYWdlciA9IHRpbnltY2UuVGhlbWVNYW5hZ2VyLCBQbHVnaW5NYW5hZ2VyID0gdGlueW1jZS5QbHVnaW5NYW5hZ2VyLA0KCQlleHBsb2RlID0gdGlueW1jZS5leHBsb2RlLA0KCQlEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXIsIHVuZGVmaW5lZCwgaW5zdGFuY2VDb3VudGVyID0gMDsNCg0KCS8vIFNldHVwIHNvbWUgVVJMcyB3aGVyZSB0aGUgZWRpdG9yIEFQSSBpcyBsb2NhdGVkIGFuZCB3aGVyZSB0aGUgZG9jdW1lbnQgaXMNCgl0aW55bWNlLmRvY3VtZW50QmFzZVVSTCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1tcPyNdLiokLywgJycpLnJlcGxhY2UoL1tcL1xcXVteXC9dKyQvLCAnJyk7DQoJaWYgKCEvW1wvXFxdJC8udGVzdCh0aW55bWNlLmRvY3VtZW50QmFzZVVSTCkpDQoJCXRpbnltY2UuZG9jdW1lbnRCYXNlVVJMICs9ICcvJzsNCg0KCXRpbnltY2UuYmFzZVVSTCA9IG5ldyB0aW55bWNlLnV0aWwuVVJJKHRpbnltY2UuZG9jdW1lbnRCYXNlVVJMKS50b0Fic29sdXRlKHRpbnltY2UuYmFzZVVSTCk7DQoNCgkvKioNCgkgKiBBYnNvbHV0ZSBiYXNlVVJJIGZvciB0aGUgaW5zdGFsbGF0aW9uIHBhdGggb2YgVGlueU1DRS4NCgkgKg0KCSAqIEBwcm9wZXJ0eSBiYXNlVVJJDQoJICogQHR5cGUgdGlueW1jZS51dGlsLlVSSQ0KCSAqLw0KCXRpbnltY2UuYmFzZVVSSSA9IG5ldyB0aW55bWNlLnV0aWwuVVJJKHRpbnltY2UuYmFzZVVSTCk7DQoNCgkvLyBBZGQgYmVmb3JlIHVubG9hZCBsaXN0ZW5lcg0KCS8vIFRoaXMgd2FzIHJlcXVpcmVkIHNpbmNlIElFIHdhcyBsZWFraW5nIG1lbW9yeSBpZiB5b3UgYWRkZWQgYW5kIHJlbW92ZWQgYmVmb3JldW5sb2FkIGxpc3RlbmVycw0KCS8vIHdpdGggYXR0YWNoRXZlbnQvZGV0YXRjaEV2ZW50IHNvIHRoaXMgb25seSBhZGRzIG9uZSBsaXN0ZW5lciBhbmQgaW5zdGFuY2VzIGNhbiB0aGUgYXR0YWNoIHRvIHRoZSBvbkJlZm9yZVVubG9hZCBldmVudA0KCXRpbnltY2Uub25CZWZvcmVVbmxvYWQgPSBuZXcgRGlzcGF0Y2hlcih0aW55bWNlKTsNCg0KCS8vIE11c3QgYmUgb24gd2luZG93IG9yIElFIHdpbGwgbGVhayBpZiB0aGUgZWRpdG9yIGlzIHBsYWNlZCBpbiBmcmFtZSBvciBpZnJhbWUNCglFdmVudC5hZGQod2luZG93LCAnYmVmb3JldW5sb2FkJywgZnVuY3Rpb24oZSkgew0KCQl0aW55bWNlLm9uQmVmb3JlVW5sb2FkLmRpc3BhdGNoKHRpbnltY2UsIGUpOw0KCX0pOw0KDQoJLyoqDQoJICogRmlyZXMgd2hlbiBhIG5ldyBlZGl0b3IgaW5zdGFuY2UgaXMgYWRkZWQgdG8gdGhlIHRpbnltY2UgY29sbGVjdGlvbi4NCgkgKg0KCSAqIEBldmVudCBvbkFkZEVkaXRvcg0KCSAqIEBwYXJhbSB7dGlueW1jZX0gc2VuZGVyIFRpbnlNQ0Ugcm9vdCBjbGFzcy9uYW1lc3BhY2UuDQoJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gZWRpdG9yIEVkaXRvciBpbnN0YW5jZS4NCgkgKi8NCgl0aW55bWNlLm9uQWRkRWRpdG9yID0gbmV3IERpc3BhdGNoZXIodGlueW1jZSk7DQoNCgkvKioNCgkgKiBGaXJlcyB3aGVuIGFuIGVkaXRvciBpbnN0YW5jZSBpcyByZW1vdmVkIGZyb20gdGhlIHRpbnltY2UgY29sbGVjdGlvbi4NCgkgKg0KCSAqIEBldmVudCBvblJlbW92ZUVkaXRvcg0KCSAqIEBwYXJhbSB7dGlueW1jZX0gc2VuZGVyIFRpbnlNQ0Ugcm9vdCBjbGFzcy9uYW1lc3BhY2UuDQoJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gZWRpdG9yIEVkaXRvciBpbnN0YW5jZS4NCgkgKi8NCgl0aW55bWNlLm9uUmVtb3ZlRWRpdG9yID0gbmV3IERpc3BhdGNoZXIodGlueW1jZSk7DQoNCgl0aW55bWNlLkVkaXRvck1hbmFnZXIgPSBleHRlbmQodGlueW1jZSwgew0KCQkvKioNCgkJICogQ29sbGVjdGlvbiBvZiBlZGl0b3IgaW5zdGFuY2VzLg0KCQkgKg0KCQkgKiBAcHJvcGVydHkgZWRpdG9ycw0KCQkgKiBAdHlwZSBPYmplY3QNCgkJICovDQoJCWVkaXRvcnMgOiBbXSwNCg0KCQkvKioNCgkJICogQ29sbGVjdGlvbiBvZiBsYW5ndWFnZSBwYWNrIGRhdGEuDQoJCSAqDQoJCSAqIEBwcm9wZXJ0eSBpMThuDQoJCSAqIEB0eXBlIE9iamVjdA0KCQkgKi8NCgkJaTE4biA6IHt9LA0KDQoJCS8qKg0KCQkgKiBDdXJyZW50bHkgYWN0aXZlIGVkaXRvciBpbnN0YW5jZS4NCgkJICoNCgkJICogQHByb3BlcnR5IGFjdGl2ZUVkaXRvcg0KCQkgKiBAdHlwZSB0aW55bWNlLkVkaXRvcg0KCQkgKi8NCgkJYWN0aXZlRWRpdG9yIDogbnVsbCwNCg0KCQkvKioNCgkJICogSW5pdGlhbGl6ZXMgYSBzZXQgb2YgZWRpdG9ycy4gVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYSBidW5jaCBvZiBlZGl0b3JzIGJhc2VkIGluIHRoZSBpbnB1dC4NCgkJICoNCgkJICogQG1ldGhvZCBpbml0DQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIFNldHRpbmdzIG9iamVjdCB0byBiZSBwYXNzZWQgdG8gZWFjaCBlZGl0b3IgaW5zdGFuY2UuDQoJCSAqLw0KCQlpbml0IDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzLCBwbCwgc2wgPSB0aW55bWNlLlNjcmlwdExvYWRlciwgZSwgZWwgPSBbXSwgZWQ7DQoNCgkJCWZ1bmN0aW9uIGV4ZWNDYWxsYmFjayhzZSwgbiwgcykgew0KCQkJCXZhciBmID0gc2Vbbl07DQoNCgkJCQlpZiAoIWYpDQoJCQkJCXJldHVybjsNCg0KCQkJCWlmICh0aW55bWNlLmlzKGYsICdzdHJpbmcnKSkgew0KCQkJCQlzID0gZi5yZXBsYWNlKC9cLlx3KyQvLCAnJyk7DQoJCQkJCXMgPSBzID8gdGlueW1jZS5yZXNvbHZlKHMpIDogMDsNCgkJCQkJZiA9IHRpbnltY2UucmVzb2x2ZShmKTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gZi5hcHBseShzIHx8IHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMikpOw0KCQkJfTsNCg0KCQkJcyA9IGV4dGVuZCh7DQoJCQkJdGhlbWUgOiAic2ltcGxlIiwNCgkJCQlsYW5ndWFnZSA6ICJlbiINCgkJCX0sIHMpOw0KDQoJCQl0LnNldHRpbmdzID0gczsNCg0KCQkJLy8gTGVnYWN5IGNhbGwNCgkJCUV2ZW50LmFkZChkb2N1bWVudCwgJ2luaXQnLCBmdW5jdGlvbigpIHsNCgkJCQl2YXIgbCwgY287DQoNCgkJCQlleGVjQ2FsbGJhY2socywgJ29ucGFnZWxvYWQnKTsNCg0KCQkJCXN3aXRjaCAocy5tb2RlKSB7DQoJCQkJCWNhc2UgImV4YWN0IjoNCgkJCQkJCWwgPSBzLmVsZW1lbnRzIHx8ICcnOw0KDQoJCQkJCQlpZihsLmxlbmd0aCA+IDApIHsNCgkJCQkJCQllYWNoKGV4cGxvZGUobCksIGZ1bmN0aW9uKHYpIHsNCgkJCQkJCQkJaWYgKERPTS5nZXQodikpIHsNCgkJCQkJCQkJCWVkID0gbmV3IHRpbnltY2UuRWRpdG9yKHYsIHMpOw0KCQkJCQkJCQkJZWwucHVzaChlZCk7DQoJCQkJCQkJCQllZC5yZW5kZXIoMSk7DQoJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQllYWNoKGRvY3VtZW50LmZvcm1zLCBmdW5jdGlvbihmKSB7DQoJCQkJCQkJCQkJZWFjaChmLmVsZW1lbnRzLCBmdW5jdGlvbihlKSB7DQoJCQkJCQkJCQkJCWlmIChlLm5hbWUgPT09IHYpIHsNCgkJCQkJCQkJCQkJCXYgPSAnbWNlX2VkaXRvcl8nICsgaW5zdGFuY2VDb3VudGVyKys7DQoJCQkJCQkJCQkJCQlET00uc2V0QXR0cmliKGUsICdpZCcsIHYpOw0KDQoJCQkJCQkJCQkJCQllZCA9IG5ldyB0aW55bWNlLkVkaXRvcih2LCBzKTsNCgkJCQkJCQkJCQkJCWVsLnB1c2goZWQpOw0KCQkJCQkJCQkJCQkJZWQucmVuZGVyKDEpOw0KCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJfSk7DQoJCQkJCQkJCQl9KTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0pOw0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAidGV4dGFyZWFzIjoNCgkJCQkJY2FzZSAic3BlY2lmaWNfdGV4dGFyZWFzIjoNCgkJCQkJCWZ1bmN0aW9uIGhhc0NsYXNzKG4sIGMpIHsNCgkJCQkJCQlyZXR1cm4gYy5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwID8gYy50ZXN0KG4uY2xhc3NOYW1lKSA6IERPTS5oYXNDbGFzcyhuLCBjKTsNCgkJCQkJCX07DQoNCgkJCQkJCWVhY2goRE9NLnNlbGVjdCgndGV4dGFyZWEnKSwgZnVuY3Rpb24odikgew0KCQkJCQkJCWlmIChzLmVkaXRvcl9kZXNlbGVjdG9yICYmIGhhc0NsYXNzKHYsIHMuZWRpdG9yX2Rlc2VsZWN0b3IpKQ0KCQkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCQlpZiAoIXMuZWRpdG9yX3NlbGVjdG9yIHx8IGhhc0NsYXNzKHYsIHMuZWRpdG9yX3NlbGVjdG9yKSkgew0KCQkJCQkJCQkvLyBDYW4gd2UgdXNlIHRoZSBuYW1lDQoJCQkJCQkJCWUgPSBET00uZ2V0KHYubmFtZSk7DQoJCQkJCQkJCWlmICghdi5pZCAmJiAhZSkNCgkJCQkJCQkJCXYuaWQgPSB2Lm5hbWU7DQoNCgkJCQkJCQkJLy8gR2VuZXJhdGUgdW5pcXVlIG5hbWUgaWYgbWlzc2luZyBvciBhbHJlYWR5IGV4aXN0cw0KCQkJCQkJCQlpZiAoIXYuaWQgfHwgdC5nZXQodi5pZCkpDQoJCQkJCQkJCQl2LmlkID0gRE9NLnVuaXF1ZUlkKCk7DQoNCgkJCQkJCQkJZWQgPSBuZXcgdGlueW1jZS5FZGl0b3Iodi5pZCwgcyk7DQoJCQkJCQkJCWVsLnB1c2goZWQpOw0KCQkJCQkJCQllZC5yZW5kZXIoMSk7DQoJCQkJCQkJfQ0KCQkJCQkJfSk7DQoJCQkJCQlicmVhazsNCgkJCQl9DQoNCgkJCQkvLyBDYWxsIG9uSW5pdCB3aGVuIGFsbCBlZGl0b3JzIGFyZSBpbml0aWFsaXplZA0KCQkJCWlmIChzLm9uaW5pdCkgew0KCQkJCQlsID0gY28gPSAwOw0KDQoJCQkJCWVhY2goZWwsIGZ1bmN0aW9uKGVkKSB7DQoJCQkJCQljbysrOw0KDQoJCQkJCQlpZiAoIWVkLmluaXRpYWxpemVkKSB7DQoJCQkJCQkJLy8gV2FpdCBmb3IgaXQNCgkJCQkJCQllZC5vbkluaXQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQkJCQlsKys7DQoNCgkJCQkJCQkJLy8gQWxsIGRvbmUNCgkJCQkJCQkJaWYgKGwgPT0gY28pDQoJCQkJCQkJCQlleGVjQ2FsbGJhY2socywgJ29uaW5pdCcpOw0KCQkJCQkJCX0pOw0KCQkJCQkJfSBlbHNlDQoJCQkJCQkJbCsrOw0KDQoJCQkJCQkvLyBBbGwgZG9uZQ0KCQkJCQkJaWYgKGwgPT0gY28pDQoJCQkJCQkJZXhlY0NhbGxiYWNrKHMsICdvbmluaXQnKTsJCQkJCQ0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9KTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyBhIGVkaXRvciBpbnN0YW5jZSBieSBpZC4NCgkJICoNCgkJICogQG1ldGhvZCBnZXQNCgkJICogQHBhcmFtIHtTdHJpbmcvTnVtYmVyfSBpZCBFZGl0b3IgaW5zdGFuY2UgaWQgb3IgaW5kZXggdG8gcmV0dXJuLg0KCQkgKiBAcmV0dXJuIHt0aW55bWNlLkVkaXRvcn0gRWRpdG9yIGluc3RhbmNlIHRvIHJldHVybi4NCgkJICovDQoJCWdldCA6IGZ1bmN0aW9uKGlkKSB7DQoJCQlpZiAoaWQgPT09IHVuZGVmaW5lZCkNCgkJCQlyZXR1cm4gdGhpcy5lZGl0b3JzOw0KDQoJCQlyZXR1cm4gdGhpcy5lZGl0b3JzW2lkXTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyBhIGVkaXRvciBpbnN0YW5jZSBieSBpZC4gVGhpcyBtZXRob2Qgd2FzIGFkZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIDIueCBicmFuY2guDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0SW5zdGFuY2VCeUlkDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBpZCBFZGl0b3IgaW5zdGFuY2UgaWQgdG8gcmV0dXJuLg0KCQkgKiBAcmV0dXJuIHt0aW55bWNlLkVkaXRvcn0gRWRpdG9yIGluc3RhbmNlIHRvIHJldHVybi4NCgkJICogQGRlcHJlY2F0ZWQgVXNlIGdldCBtZXRob2QgaW5zdGVhZC4NCgkJICogQHNlZSAjZ2V0DQoJCSAqLw0KCQlnZXRJbnN0YW5jZUJ5SWQgOiBmdW5jdGlvbihpZCkgew0KCQkJcmV0dXJuIHRoaXMuZ2V0KGlkKTsNCgkJfSwNCg0KCQkvKioNCgkJICogQWRkcyBhbiBlZGl0b3IgaW5zdGFuY2UgdG8gdGhlIGVkaXRvciBjb2xsZWN0aW9uLiBUaGlzIHdpbGwgYWxzbyBzZXQgaXQgYXMgdGhlIGFjdGl2ZSBlZGl0b3IuDQoJCSAqDQoJCSAqIEBtZXRob2QgYWRkDQoJCSAqIEBwYXJhbSB7dGlueW1jZS5FZGl0b3J9IGVkaXRvciBFZGl0b3IgaW5zdGFuY2UgdG8gYWRkIHRvIHRoZSBjb2xsZWN0aW9uLg0KCQkgKiBAcmV0dXJuIHt0aW55bWNlLkVkaXRvcn0gVGhlIHNhbWUgaW5zdGFuY2UgdGhhdCBnb3QgcGFzc2VkIGluLg0KCQkgKi8NCgkJYWRkIDogZnVuY3Rpb24oZWRpdG9yKSB7DQoJCQl2YXIgc2VsZiA9IHRoaXMsIGVkaXRvcnMgPSBzZWxmLmVkaXRvcnM7DQoNCgkJCS8vIEFkZCBuYW1lZCBhbmQgaW5kZXggZWRpdG9yIGluc3RhbmNlDQoJCQllZGl0b3JzW2VkaXRvci5pZF0gPSBlZGl0b3I7DQoJCQllZGl0b3JzLnB1c2goZWRpdG9yKTsNCg0KCQkJc2VsZi5fc2V0QWN0aXZlKGVkaXRvcik7DQoJCQlzZWxmLm9uQWRkRWRpdG9yLmRpc3BhdGNoKHNlbGYsIGVkaXRvcik7DQoNCgkJCS8vICNpZmRlZiBqcXVlcnkNCg0KCQkJLy8gUGF0Y2ggdGhlIHRpbnltY2UuRWRpdG9yIGluc3RhbmNlIHdpdGggalF1ZXJ5IGFkYXB0ZXIgbG9naWMNCgkJCWlmICh0aW55bWNlLmFkYXB0ZXIpDQoJCQkJdGlueW1jZS5hZGFwdGVyLnBhdGNoRWRpdG9yKGVkaXRvcik7DQoNCgkJCS8vICNlbmRpZg0KDQoJCQlyZXR1cm4gZWRpdG9yOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZW1vdmVzIGEgZWRpdG9yIGluc3RhbmNlIGZyb20gdGhlIGNvbGxlY3Rpb24uDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVtb3ZlDQoJCSAqIEBwYXJhbSB7dGlueW1jZS5FZGl0b3J9IGUgRWRpdG9yIGluc3RhbmNlIHRvIHJlbW92ZS4NCgkJICogQHJldHVybiB7dGlueW1jZS5FZGl0b3J9IFRoZSBlZGl0b3IgdGhhdCBnb3QgcGFzc2VkIGluIHdpbGwgYmUgcmV0dXJuIGlmIGl0IHdhcyBmb3VuZCBvdGhlcndpc2UgbnVsbC4NCgkJICovDQoJCXJlbW92ZSA6IGZ1bmN0aW9uKGVkaXRvcikgew0KCQkJdmFyIHQgPSB0aGlzLCBpLCBlZGl0b3JzID0gdC5lZGl0b3JzOw0KDQoJCQkvLyBOb3QgaW4gdGhlIGNvbGxlY3Rpb24NCgkJCWlmICghZWRpdG9yc1tlZGl0b3IuaWRdKQ0KCQkJCXJldHVybiBudWxsOw0KDQoJCQlkZWxldGUgZWRpdG9yc1tlZGl0b3IuaWRdOw0KDQoJCQlmb3IgKGkgPSAwOyBpIDwgZWRpdG9ycy5sZW5ndGg7IGkrKykgew0KCQkJCWlmIChlZGl0b3JzW2ldID09IGVkaXRvcikgew0KCQkJCQllZGl0b3JzLnNwbGljZShpLCAxKTsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBTZWxlY3QgYW5vdGhlciBlZGl0b3Igc2luY2UgdGhlIGFjdGl2ZSBvbmUgd2FzIHJlbW92ZWQNCgkJCWlmICh0LmFjdGl2ZUVkaXRvciA9PSBlZGl0b3IpDQoJCQkJdC5fc2V0QWN0aXZlKGVkaXRvcnNbMF0pOw0KDQoJCQllZGl0b3IuZGVzdHJveSgpOw0KCQkJdC5vblJlbW92ZUVkaXRvci5kaXNwYXRjaCh0LCBlZGl0b3IpOw0KDQoJCQlyZXR1cm4gZWRpdG9yOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBFeGVjdXRlcyBhIHNwZWNpZmljIGNvbW1hbmQgb24gdGhlIGN1cnJlbnRseSBhY3RpdmUgZWRpdG9yLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGV4ZWNDb21tYW5kDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBjIENvbW1hbmQgdG8gcGVyZm9ybSBmb3IgZXhhbXBsZSBCb2xkLg0KCQkgKiBAcGFyYW0ge0Jvb2xlYW59IHUgT3B0aW9uYWwgYm9vbGVhbiBzdGF0ZSBpZiBhIFVJIHNob3VsZCBiZSBwcmVzZW50ZWQgZm9yIHRoZSBjb21tYW5kIG9yIG5vdC4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHYgT3B0aW9uYWwgdmFsdWUgcGFyYW1ldGVyIGxpa2UgZm9yIGV4YW1wbGUgYW4gVVJMIHRvIGEgbGluay4NCgkJICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZS9mYWxzZSBpZiB0aGUgY29tbWFuZCB3YXMgZXhlY3V0ZWQgb3Igbm90Lg0KCQkgKi8NCgkJZXhlY0NvbW1hbmQgOiBmdW5jdGlvbihjLCB1LCB2KSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5nZXQodiksIHc7DQoNCgkJCS8vIE1hbmFnZXIgY29tbWFuZHMNCgkJCXN3aXRjaCAoYykgew0KCQkJCWNhc2UgIm1jZUZvY3VzIjoNCgkJCQkJZWQuZm9jdXMoKTsNCgkJCQkJcmV0dXJuIHRydWU7DQoNCgkJCQljYXNlICJtY2VBZGRFZGl0b3IiOg0KCQkJCWNhc2UgIm1jZUFkZENvbnRyb2wiOg0KCQkJCQlpZiAoIXQuZ2V0KHYpKQ0KCQkJCQkJbmV3IHRpbnltY2UuRWRpdG9yKHYsIHQuc2V0dGluZ3MpLnJlbmRlcigpOw0KDQoJCQkJCXJldHVybiB0cnVlOw0KDQoJCQkJY2FzZSAibWNlQWRkRnJhbWVDb250cm9sIjoNCgkJCQkJdyA9IHYud2luZG93Ow0KDQoJCQkJCS8vIEFkZCB0aW55TUNFIGdsb2JhbCBpbnN0YW5jZSBhbmQgdGlueW1jZSBuYW1lc3BhY2UgdG8gc3BlY2lmaWVkIHdpbmRvdw0KCQkJCQl3LnRpbnlNQ0UgPSB0aW55TUNFOw0KCQkJCQl3LnRpbnltY2UgPSB0aW55bWNlOw0KDQoJCQkJCXRpbnltY2UuRE9NLmRvYyA9IHcuZG9jdW1lbnQ7DQoJCQkJCXRpbnltY2UuRE9NLndpbiA9IHc7DQoNCgkJCQkJZWQgPSBuZXcgdGlueW1jZS5FZGl0b3Iodi5lbGVtZW50X2lkLCB2KTsNCgkJCQkJZWQucmVuZGVyKCk7DQoNCgkJCQkJLy8gRml4IElFIG1lbW9yeSBsZWFrcw0KCQkJCQlpZiAodGlueW1jZS5pc0lFKSB7DQoJCQkJCQlmdW5jdGlvbiBjbHIoKSB7DQoJCQkJCQkJZWQuZGVzdHJveSgpOw0KCQkJCQkJCXcuZGV0YWNoRXZlbnQoJ29udW5sb2FkJywgY2xyKTsNCgkJCQkJCQl3ID0gdy50aW55TUNFID0gdy50aW55bWNlID0gbnVsbDsgLy8gSUUgbGVhaw0KCQkJCQkJfTsNCg0KCQkJCQkJdy5hdHRhY2hFdmVudCgnb251bmxvYWQnLCBjbHIpOw0KCQkJCQl9DQoNCgkJCQkJdi5wYWdlX3dpbmRvdyA9IG51bGw7DQoNCgkJCQkJcmV0dXJuIHRydWU7DQoNCgkJCQljYXNlICJtY2VSZW1vdmVFZGl0b3IiOg0KCQkJCWNhc2UgIm1jZVJlbW92ZUNvbnRyb2wiOg0KCQkJCQlpZiAoZWQpDQoJCQkJCQllZC5yZW1vdmUoKTsNCg0KCQkJCQlyZXR1cm4gdHJ1ZTsNCg0KCQkJCWNhc2UgJ21jZVRvZ2dsZUVkaXRvcic6DQoJCQkJCWlmICghZWQpIHsNCgkJCQkJCXQuZXhlY0NvbW1hbmQoJ21jZUFkZENvbnRyb2wnLCAwLCB2KTsNCgkJCQkJCXJldHVybiB0cnVlOw0KCQkJCQl9DQoNCgkJCQkJaWYgKGVkLmlzSGlkZGVuKCkpDQoJCQkJCQllZC5zaG93KCk7DQoJCQkJCWVsc2UNCgkJCQkJCWVkLmhpZGUoKTsNCg0KCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCg0KCQkJLy8gUnVuIGNvbW1hbmQgb24gYWN0aXZlIGVkaXRvcg0KCQkJaWYgKHQuYWN0aXZlRWRpdG9yKQ0KCQkJCXJldHVybiB0LmFjdGl2ZUVkaXRvci5leGVjQ29tbWFuZChjLCB1LCB2KTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBFeGVjdXRlcyBhIGNvbW1hbmQgb24gYSBzcGVjaWZpYyBlZGl0b3IgYnkgaWQuIFRoaXMgbWV0aG9kIHdhcyBhZGRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSAyLnggYnJhbmNoLg0KCQkgKg0KCQkgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGV4ZWNDb21tYW5kIG1ldGhvZCBvZiBhIGVkaXRvciBpbnN0YW5jZSBpbnN0ZWFkLg0KCQkgKiBAbWV0aG9kIGV4ZWNJbnN0YW5jZUNvbW1hbmQNCgkJICogQHBhcmFtIHtTdHJpbmd9IGlkIEVkaXRvciBpZCB0byBwZXJmb3JtIHRoZSBjb21tYW5kIG9uLg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gYyBDb21tYW5kIHRvIHBlcmZvcm0gZm9yIGV4YW1wbGUgQm9sZC4NCgkJICogQHBhcmFtIHtCb29sZWFufSB1IE9wdGlvbmFsIGJvb2xlYW4gc3RhdGUgaWYgYSBVSSBzaG91bGQgYmUgcHJlc2VudGVkIGZvciB0aGUgY29tbWFuZCBvciBub3QuDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSB2IE9wdGlvbmFsIHZhbHVlIHBhcmFtZXRlciBsaWtlIGZvciBleGFtcGxlIGFuIFVSTCB0byBhIGxpbmsuDQoJCSAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUvZmFsc2UgaWYgdGhlIGNvbW1hbmQgd2FzIGV4ZWN1dGVkIG9yIG5vdC4NCgkJICovDQoJCWV4ZWNJbnN0YW5jZUNvbW1hbmQgOiBmdW5jdGlvbihpZCwgYywgdSwgdikgew0KCQkJdmFyIGVkID0gdGhpcy5nZXQoaWQpOw0KDQoJCQlpZiAoZWQpDQoJCQkJcmV0dXJuIGVkLmV4ZWNDb21tYW5kKGMsIHUsIHYpOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENhbGxzIHRoZSBzYXZlIG1ldGhvZCBvbiBhbGwgZWRpdG9yIGluc3RhbmNlcyBpbiB0aGUgY29sbGVjdGlvbi4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gYSBmb3JtIGlzIHRvIGJlIHN1Ym1pdHRlZC4NCgkJICoNCgkJICogQG1ldGhvZCB0cmlnZ2VyU2F2ZQ0KCQkgKi8NCgkJdHJpZ2dlclNhdmUgOiBmdW5jdGlvbigpIHsNCgkJCWVhY2godGhpcy5lZGl0b3JzLCBmdW5jdGlvbihlKSB7DQoJCQkJZS5zYXZlKCk7DQoJCQl9KTsNCgkJfSwNCg0KCQkvKioNCgkJICogQWRkcyBhIGxhbmd1YWdlIHBhY2ssIHRoaXMgZ2V0cyBjYWxsZWQgYnkgdGhlIGxvYWRlZCBsYW5ndWFnZSBmaWxlcyBsaWtlIGVuLmpzLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGFkZEkxOG4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHAgUHJlZml4IGZvciB0aGUgbGFuZ3VhZ2UgaXRlbXMuIEZvciBleGFtcGxlIGVuLm15cGx1Z2luDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBvIE5hbWUvVmFsdWUgY29sbGVjdGlvbiB3aXRoIGl0ZW1zIHRvIGFkZCB0byB0aGUgbGFuZ3VhZ2UgZ3JvdXAuDQoJCSAqLw0KCQlhZGRJMThuIDogZnVuY3Rpb24ocCwgbykgew0KCQkJdmFyIGxvLCBpMThuID0gdGhpcy5pMThuOw0KDQoJCQlpZiAoIXRpbnltY2UuaXMocCwgJ3N0cmluZycpKSB7DQoJCQkJZWFjaChwLCBmdW5jdGlvbihvLCBsYykgew0KCQkJCQllYWNoKG8sIGZ1bmN0aW9uKG8sIGcpIHsNCgkJCQkJCWVhY2gobywgZnVuY3Rpb24obywgaykgew0KCQkJCQkJCWlmIChnID09PSAnY29tbW9uJykNCgkJCQkJCQkJaTE4bltsYyArICcuJyArIGtdID0gbzsNCgkJCQkJCQllbHNlDQoJCQkJCQkJCWkxOG5bbGMgKyAnLicgKyBnICsgJy4nICsga10gPSBvOw0KCQkJCQkJfSk7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfSBlbHNlIHsNCgkJCQllYWNoKG8sIGZ1bmN0aW9uKG8sIGspIHsNCgkJCQkJaTE4bltwICsgJy4nICsga10gPSBvOw0KCQkJCX0pOw0KCQkJfQ0KCQl9LA0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KDQoJCV9zZXRBY3RpdmUgOiBmdW5jdGlvbihlZGl0b3IpIHsNCgkJCXRoaXMuc2VsZWN0ZWRJbnN0YW5jZSA9IHRoaXMuYWN0aXZlRWRpdG9yID0gZWRpdG9yOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KLyoqDQogKiBBbHRlcm5hdGl2ZSBuYW1lIGZvciB0aW55bWNlIGFkZGVkIGZvciAyLnggY29tcGF0aWJpbGl0eS4NCiAqDQogKiBAbWVtYmVyDQogKiBAcHJvcGVydHkgdGlueU1DRQ0KICogQHR5cGUgdGlueW1jZQ0KICovDQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/firebug/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/firebug/firebug-lite.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIGZpcmVidWcgPSB7CiAgdmVyc2lvbjpbMS4yMywyMDA5MDMwOV0sCiAgZWw6e30sIAogIGVudjp7IAogICAgImNhY2hlIjp7fSwKICAgICJleHRDb25zb2xlIjpudWxsLAogICAgImNzcyI6Imh0dHA6Ly9nZXRmaXJlYnVnLmNvbS9yZWxlYXNlcy9saXRlLzEuMi9maXJlYnVnLWxpdGUuY3NzIiwgCiAgICAiZGVidWciOnRydWUsCiAgICAiZGV0ZWN0RmlyZWJ1ZyI6dHJ1ZSwKICAgICJkSW5kZXgiOiJjb25zb2xlIiwgCiAgICAiaGVpZ2h0IjoyOTUsCiAgICAiaGlkZURPTUZ1bmN0aW9ucyI6ZmFsc2UsCiAgICAiaW5pdCI6ZmFsc2UsIAogICAgImlzUG9wdXAiOmZhbHNlLAogICAgImxpdGVGaWxlbmFtZSI6ImZpcmVidWctbGl0ZS5qcyIsCiAgICAibWluaW1pemVkIjpmYWxzZSwKICAgICJvcGVuSW5Qb3B1cCI6IGZhbHNlLAogICAgIm92ZXJyaWRlIjp0cnVlLAogICAgIm1sIjpmYWxzZSwKICAgICJwb3B1cFdpbiI6bnVsbCwKICAgICJzaG93SWNvbldoZW5IaWRkZW4iOnRydWUsCiAgICAidGFyZ2V0V2luZG93Ijp1bmRlZmluZWQsCiAgICAicG9wdXBUb3AiOjEsCiAgICAicG9wdXBMZWZ0IjoxLAogICAgInBvcHVwV2lkdGgiOnVuZGVmaW5lZCwKICAgICJwb3B1cEhlaWdodCI6dW5kZWZpbmVkCiAgfSwKICBpbml0Q29uc29sZTpmdW5jdGlvbigpewogICAgLyogCiAgICAgKiBpbml0aWFsaXplIHRoZSBjb25zb2xlIC0gdXNlciBkZWZpbmVkIHZhbHVlcyBhcmUgbm90IGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtZXRob2QgYmVjYXVzZSBGQkxpdGUgaXMgbm90IHlldCBpbml0aWFsaXplZAogICAgICovCiAgICB2YXIgY29tbWFuZDsKICAgIHRyeXsKICAgICAgaWYoKCF3aW5kb3cuY29uc29sZSB8fCAod2luZG93LmNvbnNvbGUgJiYgIXdpbmRvdy5jb25zb2xlLmZpcmVidWcpKSB8fCAoZmlyZWJ1Zy5lbnYub3ZlcnJpZGUgJiYgISgvRmlyZWZveFwvMy9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpKSl7CiAgICAgICAgd2luZG93LmNvbnNvbGUgPSB7ICJwcm92aWRlciI6IkZpcmVidWcgTGl0ZSIgfTsKCiAgICAgICAgZm9yKGNvbW1hbmQgaW4gZmlyZWJ1Zy5kLmNvbnNvbGUuY21kKXsKICAgICAgICAgIHdpbmRvdy5jb25zb2xlW2NvbW1hbmRdID0gZmlyZWJ1Zy5saWIudXRpbC5DdXJyeShmaXJlYnVnLmQuY29uc29sZS5ydW4sd2luZG93LGNvbW1hbmQpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgLyp3aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uKF9tZXNzYWdlLF9maWxlLF9saW5lKXsKICAgICAgICBmaXJlYnVnLmQuY29uc29sZS5ydW4oJ2Vycm9yJyxmaXJlYnVnLmxpYi51dGlsLlN0cmluZy5mb3JtYXQoJ3swfSAoezF9LHsyfSknLF9tZXNzYWdlLGZpcmVidWcuZ2V0RmlsZU5hbWUoX2ZpbGUpLF9saW5lKSk7CiAgICAgIH07Ki8KICAgICAgfSBjYXRjaChlKXt9CiAgfSwKICBvdmVycmlkZUNvbnNvbGU6ZnVuY3Rpb24oKXsKICAgIHdpdGggKGZpcmVidWcpewogICAgICBlbnYub3ZlcnJpZGU9dHJ1ZTsKICAgICAgdHJ5ewogICAgICAgIGVudi5leHRDb25zb2xlPXdpbmRvdy5jb25zb2xlOwogICAgICB9IGNhdGNoKGUpe30KICAgICAgaW5pdENvbnNvbGUoKTsKICAgIH0KICB9LAogIHJlc3RvcmVDb25zb2xlOmZ1bmN0aW9uKCl7CiAgICB3aXRoKGZpcmVidWcpewogICAgICBpZihlbnYuZXh0Q29uc29sZSl7CiAgICAgICAgZW52Lm92ZXJyaWRlPWZhbHNlOwogICAgICAgIHRyeXsKICAgICAgICAgIHdpbmRvdy5jb25zb2xlPWVudi5leHRDb25zb2xlOwogICAgICAgIH0gY2F0Y2goZSl7fQogICAgICAgIGVudi5leHRDb25zb2xlPW51bGw7CiAgICAgIH0KICAgIH0KICB9LAogIGluaXQ6ZnVuY3Rpb24oX2Nzcyl7CiAgICB2YXIgaWNvblRpdGxlID0gIkNsaWNrIGhlcmUgb3IgcHJlc3MgRjEyLCAoQ1RSTHxDTUQpK1NISUZUK0wgb3IgU0hJRlQrRU5URVIgdG8gc2hvdyBGaXJlYnVnIExpdGUuIENUUkx8Q01EIGNsaWNrIHRoaXMgaWNvbiB0byBoaWRlIGl0LiI7CiAgCiAgICB3aXRoKGZpcmVidWcpewogICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkZWJ1ZycpKXsKICAgICAgICBlbnYuZGVidWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkZWJ1ZycpLm5vZGVWYWx1ZSAhPT0gImZhbHNlIjsKICAgICAgfQogICAgICAgICAgICAKICAgICAgaWYoZW52LmlzUG9wdXApIHsKICAgICAgICBlbnYub3BlbkluUG9wdXAgPSBmYWxzZTsKICAgICAgICBlbnYudGFyZ2V0V2luZG93ID0gd2luZG93Lm9wZW5lcjsKICAgICAgICBlbnYucG9wdXBXaWR0aCA9IHdpbmRvdy5vcGVuZXIuZmlyZWJ1Zy5lbnYucG9wdXBXaWR0aCB8fCB3aW5kb3cub3BlbmVyLmZpcmVidWcubGliLnV0aWwuR2V0Vmlld3BvcnQoKS53aWR0aDsKICAgICAgICBlbnYucG9wdXBIZWlnaHQgPSB3aW5kb3cub3BlbmVyLmZpcmVidWcuZW52LnBvcHVwSGVpZ2h0IHx8IHdpbmRvdy5vcGVuZXIuZmlyZWJ1Zy5saWIudXRpbC5HZXRWaWV3cG9ydCgpLmhlaWdodDsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbnYudGFyZ2V0V2luZG93ID0gd2luZG93OwogICAgICAgIGVudi5wb3B1cFdpZHRoID0gZW52LnBvcHVwV2lkdGggfHwgbGliLnV0aWwuR2V0Vmlld3BvcnQoKS53aWR0aDsKICAgICAgICBlbnYucG9wdXBIZWlnaHQgPSBlbnYucG9wdXBIZWlnaHQgfHwgbGliLnV0aWwuR2V0Vmlld3BvcnQoKS5oZWlnaHQ7CiAgICAgIH0KCiAgICAgIHNldHRpbmdzLnJlYWRDb29raWUoKTsKICAgICAgCiAgICAgIGlmKGVudi5pbml0IHx8IChlbnYuZGV0ZWN0RmlyZWJ1ZyAmJiB3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5maXJlYnVnKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZCgKICAgICAgICBuZXcgbGliLmVsZW1lbnQoImxpbmsiKS5hdHRyaWJ1dGUuc2V0KCJyZWwiLCJzdHlsZXNoZWV0IikuYXR0cmlidXRlLnNldCgidHlwZSIsInRleHQvY3NzIikuYXR0cmlidXRlLnNldCgiaHJlZiIsZW52LmNzcykuZWxlbWVudAogICAgICApOwoKICAgICAgaWYoZW52Lm92ZXJyaWRlKXsKICAgICAgICBvdmVycmlkZUNvbnNvbGUoKTsKICAgICAgfQogICAgICAKICAgICAgLyogCiAgICAgICAqIEZpcmVidWcgSWNvbgogICAgICAgKi8KICAgICAgZWwuZmlyZWJ1Z0ljb24gPSBuZXcgbGliLmVsZW1lbnQoImRpdiIpLmF0dHJpYnV0ZS5zZXQoImlkIiwiZmlyZWJ1Z0ljb25EaXYiKS5hdHRyaWJ1dGUuc2V0KCJ0aXRsZSIsaWNvblRpdGxlKS5hdHRyaWJ1dGUuc2V0KCJhbHQiLGljb25UaXRsZSkuZXZlbnQuYWRkTGlzdGVuZXIoIm1vdXNlZG93biIsd2luLmljb25DbGlja2VkKS5pbnNlcnQoZG9jdW1lbnQuYm9keSk7CiAgICAgIAogICAgICAvKiAKICAgICAgICogbWFpbiBpbnRlcmZhY2UKICAgICAgICovCiAgICAgIGVsLmNvbnRlbnQgPSB7fTsKICAgICAgZWwubWFpbmlmcmFtZSA9IG5ldyBsaWIuZWxlbWVudCgiSUZSQU1FIikuYXR0cmlidXRlLnNldCgiaWQiLCJGaXJlYnVnSUZyYW1lIikuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6Im5vbmUiLCAid2lkdGgiOmxpYi51dGlsLkdldFZpZXdwb3J0KCkud2lkdGgrInB4IiB9KS5pbnNlcnQoZG9jdW1lbnQuYm9keSk7CiAgICAgIGVsLm1haW4gPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5zZXQoImlkIiwiRmlyZWJ1ZyIpLmVudmlyb25tZW50LmFkZFN0eWxlKHsgImRpc3BsYXkiOiJub25lIiwgIndpZHRoIjpsaWIudXRpbC5HZXRWaWV3cG9ydCgpLndpZHRoKyJweCIgfSkuaW5zZXJ0KGRvY3VtZW50LmJvZHkpOwogICAgICBpZighZW52LmlzUG9wdXApewogICAgICAgIGVsLnJlc2l6ZXIgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiUmVzaXplciIpLmV2ZW50LmFkZExpc3RlbmVyKCJtb3VzZWRvd24iLHdpbi5yZXNpemVyLnN0YXJ0KS5pbnNlcnQoZWwubWFpbik7CiAgICAgIH0KICAgICAgZWwuaGVhZGVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkhlYWRlciIpLmluc2VydChlbC5tYWluKTsKICAgICAgZWwubGVmdCA9IHt9OwogICAgICBlbC5sZWZ0LmNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJMZWZ0IikuaW5zZXJ0KGVsLm1haW4pOwogICAgICBlbC5yaWdodCA9IHt9OwogICAgICBlbC5yaWdodC5jb250YWluZXIgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiUmlnaHQiKS5pbnNlcnQoZWwubWFpbik7CiAgICAgIGVsLm1haW4uY2hpbGQuYWRkKG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCdDbGVhcicpKTsKCiAgICAgIC8qCiAgICAgICAqIGJ1dHRvbnMKICAgICAgICovCiAgICAgIGVsLmJ1dHRvbiA9IHt9OwogICAgICBlbC5idXR0b24uY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJ1dHRvbkNvbnRhaW5lciIpLmluc2VydChlbC5oZWFkZXIpOwogICAgICBlbC5idXR0b24ubG9nbyA9IG5ldyBsaWIuZWxlbWVudCgiQSIpLmF0dHJpYnV0ZS5zZXQoInRpdGxlIiwiRmlyZWJ1ZyBMaXRlIikuYXR0cmlidXRlLnNldCgidGFyZ2V0IiwiX2JsYW5rIikuYXR0cmlidXRlLnNldCgiaHJlZiIsImh0dHA6Ly9nZXRmaXJlYnVnLmNvbS9saXRlLmh0bWwiKS51cGRhdGUoIiZuYnNwOyIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQnV0dG9uIExvZ28iKS5pbnNlcnQoZWwuYnV0dG9uLmNvbnRhaW5lcik7CiAgICAgIGVsLmJ1dHRvbi5pbnNwZWN0ID0gbmV3IGxpYi5lbGVtZW50KCJBIikuYXR0cmlidXRlLmFkZENsYXNzKCJCdXR0b24iKS5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLGVudi50YXJnZXRXaW5kb3cuZmlyZWJ1Zy5kLmluc3BlY3Rvci50b2dnbGUpLnVwZGF0ZSgiSW5zcGVjdCIpLmluc2VydChlbC5idXR0b24uY29udGFpbmVyKTsKICAgICAgZWwuYnV0dG9uLmRvY2sgPSBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJ1dHRvbiBEb2NrIikuZXZlbnQuYWRkTGlzdGVuZXIoImNsaWNrIiwgd2luLmRvY2spLmluc2VydChlbC5idXR0b24uY29udGFpbmVyKTsKICAgICAgZWwuYnV0dG9uLm5ld1dpbmRvdyA9IG5ldyBsaWIuZWxlbWVudCgiQSIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQnV0dG9uIE5ld1dpbmRvdyIpLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsIHdpbi5uZXdXaW5kb3cpLmluc2VydChlbC5idXR0b24uY29udGFpbmVyKTsKCiAgICAgIGlmKCFlbnYuaXNQb3B1cCl7CiAgICAgICAgZWwuYnV0dG9uLm1heGltaXplID0gbmV3IGxpYi5lbGVtZW50KCJBIikuYXR0cmlidXRlLmFkZENsYXNzKCJCdXR0b24gTWF4aW1pemUiKS5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLHdpbi5tYXhpbWl6ZSkuaW5zZXJ0KGVsLmJ1dHRvbi5jb250YWluZXIpOwogICAgICAgIGVsLmJ1dHRvbi5taW5pbWl6ZSA9IG5ldyBsaWIuZWxlbWVudCgiQSIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQnV0dG9uIE1pbmltaXplIikuZXZlbnQuYWRkTGlzdGVuZXIoImNsaWNrIix3aW4ubWluaW1pemUpLmluc2VydChlbC5idXR0b24uY29udGFpbmVyKTsKICAgICAgICBlbC5idXR0b24uY2xvc2UgPSBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJ1dHRvbiBDbG9zZSIpLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsd2luLmhpZGUpLmluc2VydChlbC5idXR0b24uY29udGFpbmVyKTsKICAgICAgfQoKICAgICAgaWYobGliLmVudi5pZXx8bGliLmVudi53ZWJraXQpewogICAgICAgIGVsLmJ1dHRvbi5jb250YWluZXIuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAicGFkZGluZ1RvcCI6IjEycHgiIH0pOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBuYXZpZ2F0aW9uCiAgICAgICAqLwogICAgICBlbC5uYXYgPSB7fTsKICAgICAgZWwubmF2LmNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJOYXYiKS5pbnNlcnQoZWwubGVmdC5jb250YWluZXIpOwogICAgICBlbC5uYXYuY29uc29sZSA9IG5ldyBsaWIuZWxlbWVudCgiQSIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiVGFiIFNlbGVjdGVkIikuZXZlbnQuYWRkTGlzdGVuZXIoImNsaWNrIixsaWIudXRpbC5DdXJyeShkLm5hdmlnYXRlLHdpbmRvdywiY29uc29sZSIpKS51cGRhdGUoIkNvbnNvbGUiKS5pbnNlcnQoZWwubmF2LmNvbnRhaW5lcik7CiAgICAgIGVsLm5hdi5odG1sID0gbmV3IGxpYi5lbGVtZW50KCJBIikuYXR0cmlidXRlLmFkZENsYXNzKCJUYWIiKS51cGRhdGUoIkhUTUwiKS5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLGxpYi51dGlsLkN1cnJ5KGQubmF2aWdhdGUsd2luZG93LCJodG1sIikpLmluc2VydChlbC5uYXYuY29udGFpbmVyKTsKICAgICAgZWwubmF2LmNzcyA9IG5ldyBsaWIuZWxlbWVudCgiQSIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiVGFiIikudXBkYXRlKCJDU1MiKS5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLGxpYi51dGlsLkN1cnJ5KGQubmF2aWdhdGUsd2luZG93LCJjc3MiKSkuaW5zZXJ0KGVsLm5hdi5jb250YWluZXIpOwogICAgICBpZighZW52LmlzUG9wdXApewogICAgICAgIGVsLm5hdi5zY3JpcHRzID0gbmV3IGxpYi5lbGVtZW50KCJBIikuYXR0cmlidXRlLmFkZENsYXNzKCJUYWIiKS51cGRhdGUoIlNjcmlwdCIpLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsbGliLnV0aWwuQ3VycnkoZC5uYXZpZ2F0ZSx3aW5kb3csInNjcmlwdHMiKSkuaW5zZXJ0KGVsLm5hdi5jb250YWluZXIpOwogICAgICB9CiAgICAgIGVsLm5hdi5kb20gPSBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlRhYiIpLnVwZGF0ZSgiRE9NIikuZXZlbnQuYWRkTGlzdGVuZXIoImNsaWNrIixsaWIudXRpbC5DdXJyeShkLm5hdmlnYXRlLGVudi50YXJnZXRXaW5kb3csImRvbSIpKS5pbnNlcnQoZWwubmF2LmNvbnRhaW5lcik7CiAgICAgIGVsLm5hdi54aHIgPSBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlRhYiIpLnVwZGF0ZSgiWEhSIikuZXZlbnQuYWRkTGlzdGVuZXIoImNsaWNrIixsaWIudXRpbC5DdXJyeShkLm5hdmlnYXRlLHdpbmRvdywieGhyIikpLmluc2VydChlbC5uYXYuY29udGFpbmVyKTsKICAgICAgZWwubmF2Lm9wdGlvbnNkaXYgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiU2V0dGluZ3MiKS5pbnNlcnQoZWwubmF2LmNvbnRhaW5lcik7CiAgICAgIGVsLm5hdi5vcHRpb25zID0gbmV3IGxpYi5lbGVtZW50KCJBIikuYXR0cmlidXRlLmFkZENsYXNzKCJUYWIiKS51cGRhdGUoIk9wdGlvbnMmbmJzcDsmb3I7IikuZXZlbnQuYWRkTGlzdGVuZXIoImNsaWNrIiwgc2V0dGluZ3MudG9nZ2xlKS5pbnNlcnQoZWwubmF2Lm9wdGlvbnNkaXYpOwogICAgICAKICAgICAgLyoKICAgICAgICogaW5zcGVjdG9yCiAgICAgICAqLwogICAgICBlbC5ib3JkZXJJbnNwZWN0b3IgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5zZXQoImlkIiwiRmlyZWJ1Z0JvcmRlckluc3BlY3RvciIpLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsbGlzdGVuLmluc3BlY3RvcikuaW5zZXJ0KGRvY3VtZW50LmJvZHkpOwogICAgICBlbC5iZ0luc3BlY3RvciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLnNldCgiaWQiLCJGaXJlYnVnQkdJbnNwZWN0b3IiKS5pbnNlcnQoZG9jdW1lbnQuYm9keSk7CgogICAgICAvKgogICAgICAgKiBjb25zb2xlCiAgICAgICAqLwogICAgICBlbC5sZWZ0LmNvbnNvbGUgPSB7fTsKICAgICAgZWwubGVmdC5jb25zb2xlLmNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJDb25zb2xlIikuaW5zZXJ0KGVsLmxlZnQuY29udGFpbmVyKTsKICAgICAgZWwubGVmdC5jb25zb2xlLm1sQnV0dG9uID0gbmV3IGxpYi5lbGVtZW50KCJBIikuYXR0cmlidXRlLmFkZENsYXNzKCJNTEJ1dHRvbiIpLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsZC5jb25zb2xlLnRvZ2dsZU1MKS5pbnNlcnQoZWwubGVmdC5jb25zb2xlLmNvbnRhaW5lcik7CiAgICAgIGVsLmxlZnQuY29uc29sZS5tb25pdG9yID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5pbnNlcnQoCiAgICAgICAgICBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiTW9uaXRvciIpLmluc2VydChlbC5sZWZ0LmNvbnNvbGUuY29udGFpbmVyKQogICAgICApOwogICAgICBlbC5sZWZ0LmNvbnNvbGUuY29udGFpbmVyLmNoaWxkLmFkZCgKICAgICAgICAgIG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJJbnB1dEFycm93IikudXBkYXRlKCI+Pj4iKQogICAgICApOwogICAgICBlbC5sZWZ0LmNvbnNvbGUuaW5wdXQgPSBuZXcgbGliLmVsZW1lbnQoIklOUFVUIikuYXR0cmlidXRlLnNldCgidHlwZSIsInRleHQiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIklucHV0IikuZXZlbnQuYWRkTGlzdGVuZXIoImtleWRvd24iLGxpc3Rlbi5jb25zb2xlVGV4dGJveCkuaW5zZXJ0KAogICAgICAgICAgbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIklucHV0Q29udGFpbmVyIikuaW5zZXJ0KGVsLmxlZnQuY29uc29sZS5jb250YWluZXIpCiAgICAgICk7CgogICAgICBlbC5yaWdodC5jb25zb2xlID0ge307CiAgICAgIGVsLnJpZ2h0LmNvbnNvbGUuY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkNvbnNvbGUgQ29udGFpbmVyIikuaW5zZXJ0KGVsLnJpZ2h0LmNvbnRhaW5lcik7CiAgICAgIGVsLnJpZ2h0LmNvbnNvbGUubWxCdXR0b24gPSBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIk1MQnV0dG9uIENsb3NlTUwiKS5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLGQuY29uc29sZS50b2dnbGVNTCkuaW5zZXJ0KGVsLnJpZ2h0LmNvbnNvbGUuY29udGFpbmVyKTsKICAgICAgZWwucmlnaHQuY29uc29sZS5pbnB1dCA9IG5ldyBsaWIuZWxlbWVudCgiVEVYVEFSRUEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIklucHV0IikuaW5zZXJ0KGVsLnJpZ2h0LmNvbnNvbGUuY29udGFpbmVyKTsKICAgICAgZWwucmlnaHQuY29uc29sZS5pbnB1dC5ldmVudC5hZGRMaXN0ZW5lcigia2V5ZG93biIsbGliLnV0aWwuQ3VycnkodGFiLHdpbmRvdyxlbC5yaWdodC5jb25zb2xlLmlucHV0LmVsZW1lbnQpKTsKICAgICAgZWwucmlnaHQuY29uc29sZS5ydW4gPSBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJ1dHRvbiIpLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsbGlzdGVuLnJ1bk11bHRpbGluZSkudXBkYXRlKCJSdW4iKS5pbnNlcnQoZWwucmlnaHQuY29uc29sZS5jb250YWluZXIpOwogICAgICBlbC5yaWdodC5jb25zb2xlLmNsZWFyID0gbmV3IGxpYi5lbGVtZW50KCJBIikuYXR0cmlidXRlLmFkZENsYXNzKCJCdXR0b24iKS5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLGxpYi51dGlsLkN1cnJ5KGQuY2xlYW4sd2luZG93LGVsLnJpZ2h0LmNvbnNvbGUuaW5wdXQpKS51cGRhdGUoIkNsZWFyIikuaW5zZXJ0KGVsLnJpZ2h0LmNvbnNvbGUuY29udGFpbmVyKTsKCiAgICAgIGVsLmJ1dHRvbi5jb25zb2xlID0ge307CiAgICAgIGVsLmJ1dHRvbi5jb25zb2xlLmNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJCdXR0b25TZXQiKS5pbnNlcnQoZWwuYnV0dG9uLmNvbnRhaW5lcik7CiAgICAgIGVsLmJ1dHRvbi5jb25zb2xlLmNsZWFyID0gbmV3IGxpYi5lbGVtZW50KCJBIikuYXR0cmlidXRlLmFkZENsYXNzKCJCdXR0b24iKS5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLGQuY29uc29sZS5jbGVhcikudXBkYXRlKCJDbGVhciIpLmluc2VydChlbC5idXR0b24uY29uc29sZS5jb250YWluZXIpOwoKICAgICAgLyoKICAgICAgICogaHRtbAogICAgICAgKi8KCiAgICAgIGVsLmxlZnQuaHRtbCA9IHt9OwogICAgICBlbC5sZWZ0Lmh0bWwuY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkhUTUwiKS5pbnNlcnQoZWwubGVmdC5jb250YWluZXIpOwoKICAgICAgZWwucmlnaHQuaHRtbCA9IHt9OwogICAgICBlbC5yaWdodC5odG1sLmNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJIVE1MIENvbnRhaW5lciIpLmluc2VydChlbC5yaWdodC5jb250YWluZXIpOwoKICAgICAgZWwucmlnaHQuaHRtbC5uYXYgPSB7fTsKICAgICAgZWwucmlnaHQuaHRtbC5uYXYuY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIk5hdiIpLmluc2VydChlbC5yaWdodC5odG1sLmNvbnRhaW5lcik7CiAgICAgIGVsLnJpZ2h0Lmh0bWwubmF2LmNvbXB1dGVkU3R5bGUgPSBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlRhYiBTZWxlY3RlZCIpLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsbGliLnV0aWwuQ3VycnkoZC5odG1sLm5hdmlnYXRlLGZpcmVidWcsImNvbXB1dGVkU3R5bGUiKSkudXBkYXRlKCJDb21wdXRlZCBTdHlsZSIpLmluc2VydChlbC5yaWdodC5odG1sLm5hdi5jb250YWluZXIpOwogICAgICBlbC5yaWdodC5odG1sLm5hdi5kb20gPSBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlRhYiIpLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsbGliLnV0aWwuQ3VycnkoZC5odG1sLm5hdmlnYXRlLGZpcmVidWcsImRvbSIpKS51cGRhdGUoIkRPTSIpLmluc2VydChlbC5yaWdodC5odG1sLm5hdi5jb250YWluZXIpOwoKICAgICAgZWwucmlnaHQuaHRtbC5jb250ZW50ID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkNvbnRlbnQiKS5pbnNlcnQoZWwucmlnaHQuaHRtbC5jb250YWluZXIpOwoKICAgICAgZWwuYnV0dG9uLmh0bWwgPSB7fTsKICAgICAgZWwuYnV0dG9uLmh0bWwuY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJ1dHRvblNldCBIVE1MIikuaW5zZXJ0KGVsLmJ1dHRvbi5jb250YWluZXIpOwoKICAgICAgLyoKICAgICAgICogY3NzCiAgICAgICAqLwoKICAgICAgZWwubGVmdC5jc3MgPSB7fTsKICAgICAgZWwubGVmdC5jc3MuY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkNTUyIpLmluc2VydChlbC5sZWZ0LmNvbnRhaW5lcik7CgogICAgICBlbC5yaWdodC5jc3MgPSB7fTsKICAgICAgZWwucmlnaHQuY3NzLmNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJDU1MgQ29udGFpbmVyIikuaW5zZXJ0KGVsLnJpZ2h0LmNvbnRhaW5lcik7CgogICAgICBlbC5yaWdodC5jc3MubmF2ID0ge307CiAgICAgIGVsLnJpZ2h0LmNzcy5uYXYuY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIk5hdiIpLmluc2VydChlbC5yaWdodC5jc3MuY29udGFpbmVyKTsKICAgICAgZWwucmlnaHQuY3NzLm5hdi5ydW5DU1MgPSBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlRhYiBTZWxlY3RlZCIpLnVwZGF0ZSgiUnVuIENTUyIpLmluc2VydChlbC5yaWdodC5jc3MubmF2LmNvbnRhaW5lcik7CgogICAgICBlbC5yaWdodC5jc3MubWxCdXR0b24gPSBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIk1MQnV0dG9uIENsb3NlTUwiKS5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLGQuY29uc29sZS50b2dnbGVNTCkuaW5zZXJ0KGVsLnJpZ2h0LmNzcy5jb250YWluZXIpOwogICAgICBlbC5yaWdodC5jc3MuaW5wdXQgPSBuZXcgbGliLmVsZW1lbnQoIlRFWFRBUkVBIikuYXR0cmlidXRlLmFkZENsYXNzKCJJbnB1dCIpLmluc2VydChlbC5yaWdodC5jc3MuY29udGFpbmVyKTsKICAgICAgZWwucmlnaHQuY3NzLmlucHV0LmV2ZW50LmFkZExpc3RlbmVyKCJrZXlkb3duIixsaWIudXRpbC5DdXJyeShmaXJlYnVnLnRhYix3aW5kb3csZWwucmlnaHQuY3NzLmlucHV0LmVsZW1lbnQpKTsKICAgICAgZWwucmlnaHQuY3NzLnJ1biA9IG5ldyBsaWIuZWxlbWVudCgiQSIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQnV0dG9uIikuZXZlbnQuYWRkTGlzdGVuZXIoImNsaWNrIixsaXN0ZW4ucnVuQ1NTKS51cGRhdGUoIlJ1biIpLmluc2VydChlbC5yaWdodC5jc3MuY29udGFpbmVyKTsKICAgICAgZWwucmlnaHQuY3NzLmNsZWFyID0gbmV3IGxpYi5lbGVtZW50KCJBIikuYXR0cmlidXRlLmFkZENsYXNzKCJCdXR0b24iKS5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLGxpYi51dGlsLkN1cnJ5KGQuY2xlYW4sd2luZG93LGVsLnJpZ2h0LmNzcy5pbnB1dCkpLnVwZGF0ZSgiQ2xlYXIiKS5pbnNlcnQoZWwucmlnaHQuY3NzLmNvbnRhaW5lcik7CgogICAgICBlbC5idXR0b24uY3NzID0ge307CiAgICAgIGVsLmJ1dHRvbi5jc3MuY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJ1dHRvblNldCBDU1MiKS5pbnNlcnQoZWwuYnV0dG9uLmNvbnRhaW5lcik7CiAgICAgIGVsLmJ1dHRvbi5jc3Muc2VsZWN0Ym94ID0gbmV3IGxpYi5lbGVtZW50KCJTRUxFQ1QiKS5ldmVudC5hZGRMaXN0ZW5lcigiY2hhbmdlIixsaXN0ZW4uY3NzU2VsZWN0Ym94KS5pbnNlcnQoZWwuYnV0dG9uLmNzcy5jb250YWluZXIpOwoKICAgICAgLyoKICAgICAgICogc2NyaXB0cwogICAgICAgKi8KCiAgICAgIGVsLmxlZnQuc2NyaXB0cyA9IHt9OwogICAgICBlbC5sZWZ0LnNjcmlwdHMuY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlNjcmlwdHMiKS5pbnNlcnQoZWwubGVmdC5jb250YWluZXIpOwoKICAgICAgZWwucmlnaHQuc2NyaXB0cyA9IHt9OwogICAgICBlbC5yaWdodC5zY3JpcHRzLmNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJTY3JpcHRzIENvbnRhaW5lciIpLmluc2VydChlbC5yaWdodC5jb250YWluZXIpOwoKICAgICAgZWwuYnV0dG9uLnNjcmlwdHMgPSB7fTsKICAgICAgZWwuYnV0dG9uLnNjcmlwdHMuY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJ1dHRvblNldCBTY3JpcHRzIikuaW5zZXJ0KGVsLmJ1dHRvbi5jb250YWluZXIpOwogICAgICBlbC5idXR0b24uc2NyaXB0cy5zZWxlY3Rib3ggPSBuZXcgbGliLmVsZW1lbnQoIlNFTEVDVCIpLmV2ZW50LmFkZExpc3RlbmVyKCJjaGFuZ2UiLGxpc3Rlbi5zY3JpcHRzU2VsZWN0Ym94KS5pbnNlcnQoZWwuYnV0dG9uLnNjcmlwdHMuY29udGFpbmVyKTsKICAgICAgZWwuYnV0dG9uLnNjcmlwdHMubGluZU51bWJlcnMgPSBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJ1dHRvbiIpLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsZC5zY3JpcHRzLnRvZ2dsZUxpbmVOdW1iZXJzKS51cGRhdGUoIlNob3cgTGluZSBOdW1iZXJzIikuaW5zZXJ0KGVsLmJ1dHRvbi5zY3JpcHRzLmNvbnRhaW5lcik7CgogICAgICAvKgogICAgICAgKiBkb20KICAgICAgICovCgogICAgICBlbC5sZWZ0LmRvbSA9IHt9OwogICAgICBlbC5sZWZ0LmRvbS5jb250YWluZXIgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiRE9NIikuaW5zZXJ0KGVsLmxlZnQuY29udGFpbmVyKTsKCiAgICAgIGVsLnJpZ2h0LmRvbSA9IHt9OwogICAgICBlbC5yaWdodC5kb20uY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkRPTSBDb250YWluZXIiKS5pbnNlcnQoZWwucmlnaHQuY29udGFpbmVyKTsKCiAgICAgIGVsLmJ1dHRvbi5kb20gPSB7fTsKICAgICAgZWwuYnV0dG9uLmRvbS5jb250YWluZXIgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQnV0dG9uU2V0IERPTSIpLmluc2VydChlbC5idXR0b24uY29udGFpbmVyKTsKICAgICAgZWwuYnV0dG9uLmRvbS5sYWJlbCA9IG5ldyBsaWIuZWxlbWVudCgiTEFCRUwiKS51cGRhdGUoIk9iamVjdCBQYXRoOiIpLmluc2VydChlbC5idXR0b24uZG9tLmNvbnRhaW5lcik7CiAgICAgIGVsLmJ1dHRvbi5kb20udGV4dGJveCA9IG5ldyBsaWIuZWxlbWVudCgiSU5QVVQiKS5ldmVudC5hZGRMaXN0ZW5lcigia2V5ZG93biIsbGlzdGVuLmRvbVRleHRib3gpLnVwZGF0ZShlbnYuaXNQb3B1cD8id2luZG93Lm9wZW5lciI6IndpbmRvdyIpLmluc2VydChlbC5idXR0b24uZG9tLmNvbnRhaW5lcik7CgogICAgICAvKgogICAgICAgKiBzdHIKICAgICAgICovCiAgICAgIGVsLmxlZnQuc3RyID0ge307CiAgICAgIGVsLmxlZnQuc3RyLmNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJTVFIiKS5pbnNlcnQoZWwubGVmdC5jb250YWluZXIpOwoKICAgICAgZWwucmlnaHQuc3RyID0ge307CiAgICAgIGVsLnJpZ2h0LnN0ci5jb250YWluZXIgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiU1RSIikuaW5zZXJ0KGVsLmxlZnQuY29udGFpbmVyKTsKCiAgICAgIGVsLmJ1dHRvbi5zdHIgPSB7fTsKICAgICAgZWwuYnV0dG9uLnN0ci5jb250YWluZXIgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQnV0dG9uU2V0IFhIUiIpLmluc2VydChlbC5idXR0b24uY29udGFpbmVyKTsKICAgICAgZWwuYnV0dG9uLnN0ci53YXRjaCA9IG5ldyBsaWIuZWxlbWVudCgiQSIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQnV0dG9uIikuZXZlbnQuYWRkTGlzdGVuZXIoImNsaWNrIixsaWIudXRpbC5DdXJyeShkLm5hdmlnYXRlLHdpbmRvdywieGhyIikpLnVwZGF0ZSgiQmFjayIpLmluc2VydChlbC5idXR0b24uc3RyLmNvbnRhaW5lcik7CgogICAgICAvKgogICAgICAgKiB4aHIKICAgICAgICovCiAgICAgIGVsLmxlZnQueGhyID0ge307CiAgICAgIGVsLmxlZnQueGhyLmNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJYSFIiKS5pbnNlcnQoZWwubGVmdC5jb250YWluZXIpOwoKICAgICAgZWwucmlnaHQueGhyID0ge307CiAgICAgIGVsLnJpZ2h0Lnhoci5jb250YWluZXIgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiWEhSIikuaW5zZXJ0KGVsLmxlZnQuY29udGFpbmVyKTsKCgogICAgICBlbC5idXR0b24ueGhyID0ge307CiAgICAgIGVsLmJ1dHRvbi54aHIuY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJ1dHRvblNldCBYSFIiKS5pbnNlcnQoZWwuYnV0dG9uLmNvbnRhaW5lcik7CiAgICAgIGVsLmJ1dHRvbi54aHIubGFiZWwgPSBuZXcgbGliLmVsZW1lbnQoIkxBQkVMIikudXBkYXRlKCJYSFIgUGF0aDoiKS5pbnNlcnQoZWwuYnV0dG9uLnhoci5jb250YWluZXIpOwogICAgICBlbC5idXR0b24ueGhyLnRleHRib3ggPSBuZXcgbGliLmVsZW1lbnQoIklOUFVUIikuZXZlbnQuYWRkTGlzdGVuZXIoImtleWRvd24iLGxpc3Rlbi54aHJUZXh0Ym94KS5pbnNlcnQoZWwuYnV0dG9uLnhoci5jb250YWluZXIpOwogICAgICBlbC5idXR0b24ueGhyLndhdGNoID0gbmV3IGxpYi5lbGVtZW50KCJBIikuYXR0cmlidXRlLmFkZENsYXNzKCJCdXR0b24iKS5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLGxpc3Rlbi5hZGRYaHJPYmplY3QpLnVwZGF0ZSgiV2F0Y2giKS5pbnNlcnQoZWwuYnV0dG9uLnhoci5jb250YWluZXIpOwoKICAgICAgLyoKICAgICAgICogc2V0dGluZ3MKICAgICAgICovCiAgICAgIGVsLnNldHRpbmdzID0ge307CiAgICAgIGVsLnNldHRpbmdzLmNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuY2hpbGQuYWRkKAogICAgICAgIG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJIZWFkZXIiKS5jaGlsZC5hZGQoCiAgICAgICAgICBuZXcgbGliLmVsZW1lbnQoKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlRpdGxlIikudXBkYXRlKCdGaXJlYnVnIExpdGUgU2V0dGluZ3MnKQogICAgICAgICkKICAgICAgKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlNldHRpbmdzRGl2IikuaW5zZXJ0KGVsLm1haW4pOwogICAgICBlbC5zZXR0aW5ncy5jb250ZW50ID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkNvbnRlbnQiKS5pbnNlcnQoZWwuc2V0dGluZ3MuY29udGFpbmVyKTsKICAgICAgZWwuc2V0dGluZ3MucHJvZ3Jlc3NEaXYgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiUHJvZ3Jlc3NEaXYiKS5pbnNlcnQoZWwuc2V0dGluZ3MuY29udGVudCk7CiAgICAgIGVsLnNldHRpbmdzLnByb2dyZXNzID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlByb2dyZXNzIikuaW5zZXJ0KGVsLnNldHRpbmdzLnByb2dyZXNzRGl2KTsKICAgICAgZWwuc2V0dGluZ3MuY2J4RGVidWcgPSBuZXcgbGliLmVsZW1lbnQoIklOUFVUIikuYXR0cmlidXRlLnNldCgidHlwZSIsImNoZWNrYm94IikuYXR0cmlidXRlLmFkZENsYXNzKCJTZXR0aW5nc0NCWCIpLmluc2VydChlbC5zZXR0aW5ncy5jb250ZW50KTsKICAgICAgZWwuc2V0dGluZ3MuY29udGVudC5jaGlsZC5hZGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIlN0YXJ0IHZpc2libGUiKSk7CiAgICAgIG5ldyBsaWIuZWxlbWVudCgiQlIiKS5pbnNlcnQoZWwuc2V0dGluZ3MuY29udGVudCk7CiAgICAgIGVsLnNldHRpbmdzLmNieERldGVjdEZpcmVidWcgPSBuZXcgbGliLmVsZW1lbnQoIklOUFVUIikuYXR0cmlidXRlLnNldCgidHlwZSIsImNoZWNrYm94IikuYXR0cmlidXRlLmFkZENsYXNzKCJTZXR0aW5nc0NCWCIpLmluc2VydChlbC5zZXR0aW5ncy5jb250ZW50KTsKICAgICAgZWwuc2V0dGluZ3MuY29udGVudC5jaGlsZC5hZGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIkhpZGUgd2hlbiBGaXJlYnVnIGFjdGl2ZSIpKTsKICAgICAgbmV3IGxpYi5lbGVtZW50KCJCUiIpLmluc2VydChlbC5zZXR0aW5ncy5jb250ZW50KTsKICAgICAgZWwuc2V0dGluZ3MuY2J4SGlkZURPTUZ1bmN0aW9ucyA9IG5ldyBsaWIuZWxlbWVudCgiSU5QVVQiKS5hdHRyaWJ1dGUuc2V0KCJ0eXBlIiwiY2hlY2tib3giKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlNldHRpbmdzQ0JYIikuaW5zZXJ0KGVsLnNldHRpbmdzLmNvbnRlbnQpOwogICAgICBlbC5zZXR0aW5ncy5jb250ZW50LmNoaWxkLmFkZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiSGlkZSBET00gZnVuY3Rpb25zIikpOwogICAgICBuZXcgbGliLmVsZW1lbnQoIkJSIikuaW5zZXJ0KGVsLnNldHRpbmdzLmNvbnRlbnQpOwogICAgICBlbC5zZXR0aW5ncy5jYnhPdmVycmlkZSA9IG5ldyBsaWIuZWxlbWVudCgiSU5QVVQiKS5hdHRyaWJ1dGUuc2V0KCJ0eXBlIiwiY2hlY2tib3giKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlNldHRpbmdzQ0JYIikuaW5zZXJ0KGVsLnNldHRpbmdzLmNvbnRlbnQpOwogICAgICBlbC5zZXR0aW5ncy5jb250ZW50LmNoaWxkLmFkZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiT3ZlcnJpZGUgd2luZG93LmNvbnNvbGUiKSk7CiAgICAgIG5ldyBsaWIuZWxlbWVudCgiQlIiKS5pbnNlcnQoZWwuc2V0dGluZ3MuY29udGVudCk7CiAgICAgIGVsLnNldHRpbmdzLmNieFNob3dJY29uID0gbmV3IGxpYi5lbGVtZW50KCJJTlBVVCIpLmF0dHJpYnV0ZS5zZXQoInR5cGUiLCJjaGVja2JveCIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiU2V0dGluZ3NDQlgiKS5pbnNlcnQoZWwuc2V0dGluZ3MuY29udGVudCk7CiAgICAgIGVsLnNldHRpbmdzLmNvbnRlbnQuY2hpbGQuYWRkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJTaG93IGljb24gd2hlbiBoaWRkZW4iKSk7CiAgICAgIG5ldyBsaWIuZWxlbWVudCgiQlIiKS5pbnNlcnQoZWwuc2V0dGluZ3MuY29udGVudCk7CiAgICAgIGVsLnNldHRpbmdzLmNieE9wZW5JblBvcHVwID0gbmV3IGxpYi5lbGVtZW50KCJJTlBVVCIpLmF0dHJpYnV0ZS5zZXQoInR5cGUiLCJjaGVja2JveCIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiU2V0dGluZ3NDQlgiKS5pbnNlcnQoZWwuc2V0dGluZ3MuY29udGVudCk7CiAgICAgIGVsLnNldHRpbmdzLmNvbnRlbnQuY2hpbGQuYWRkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJPcGVuIGluIHBvcHVwIikpOwogICAgICBlbC5zZXR0aW5ncy5idXR0b25EaXYgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmluc2VydChlbC5zZXR0aW5ncy5jb250ZW50KTsKICAgICAgZWwuc2V0dGluZ3MuYnV0dG9uTGVmdERpdiA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJCdXR0b25zTGVmdCIpLmluc2VydChlbC5zZXR0aW5ncy5idXR0b25EaXYpOwogICAgICBlbC5zZXR0aW5ncy5yZXNldEJ1dHRvbiA9IG5ldyBsaWIuZWxlbWVudCgiSU5QVVQiKS5hdHRyaWJ1dGUuc2V0KCJ0eXBlIiwiYnV0dG9uIikudXBkYXRlKCJSZXNldCIpLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsc2V0dGluZ3MucmVzZXQpLmluc2VydChlbC5zZXR0aW5ncy5idXR0b25MZWZ0RGl2KTsKICAgICAgZWwuc2V0dGluZ3MuYnV0dG9uUmlnaHREaXYgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQnV0dG9uc1JpZ2h0IikuaW5zZXJ0KGVsLnNldHRpbmdzLmJ1dHRvbkRpdik7CiAgICAgIGVsLnNldHRpbmdzLmNhbmNlbEJ1dHRvbiA9IG5ldyBsaWIuZWxlbWVudCgiSU5QVVQiKS5hdHRyaWJ1dGUuc2V0KCJ0eXBlIiwiYnV0dG9uIikudXBkYXRlKCJDYW5jZWwiKS5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLHNldHRpbmdzLmhpZGUpLmluc2VydChlbC5zZXR0aW5ncy5idXR0b25SaWdodERpdik7CiAgICAgIGVsLnNldHRpbmdzLmJ1dHRvblJpZ2h0RGl2LmNoaWxkLmFkZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTsKICAgICAgZWwuc2V0dGluZ3Muc2F2ZUJ1dHRvbiA9IG5ldyBsaWIuZWxlbWVudCgiSU5QVVQiKS5hdHRyaWJ1dGUuc2V0KCJ0eXBlIiwiYnV0dG9uIikudXBkYXRlKCJTYXZlIikuZXZlbnQuYWRkTGlzdGVuZXIoImNsaWNrIixzZXR0aW5ncy5zYXZlQ2xpY2tlZCkuaW5zZXJ0KGVsLnNldHRpbmdzLmJ1dHRvblJpZ2h0RGl2KTsKCiAgICAgIGxpYi51dGlsLkFkZEV2ZW50KGRvY3VtZW50LCJtb3VzZW1vdmUiLGxpc3Rlbi5tb3VzZSkoIm1vdXNlbW92ZSIsd2luLnJlc2l6ZXIucmVzaXplKSgibW91c2V1cCIsd2luLnJlc2l6ZXIuc3RvcCkoImtleWRvd24iLGxpc3Rlbi5rZXlib2FyZCk7CgogICAgICBlbnYuaW5pdCA9IHRydWU7CgogICAgICBmb3IodmFyIGk9MCwgbGVuPWQuY29uc29sZS5jYWNoZS5sZW5ndGg7IGk8bGVuOyBpKyspewogICAgICAgIHZhciBpdGVtID0gZC5jb25zb2xlLmNhY2hlW2ldOwogICAgICAgIGQuY29uc29sZS5jbWRbaXRlbS5jb21tYW5kXS5hcHBseSh3aW5kb3csaXRlbS5hcmcpOwogICAgICB9OwoKICAgICAgaWYobGliLmVudi5pZTYpewogICAgICAgIHdpbmRvdy5vbnNjcm9sbCA9IGxpYi51dGlsLkN1cnJ5KHdpbi5zZXRWZXJ0aWNhbFBvc2l0aW9uLHdpbmRvdyxudWxsKTsKICAgICAgICB2YXIgYnV0dG9ucyA9IFsKICAgICAgICAgIGVsLmJ1dHRvbi5pbnNwZWN0LAogICAgICAgICAgZWwuYnV0dG9uLmNsb3NlLAogICAgICAgICAgZWwuYnV0dG9uLmluc3BlY3QsCiAgICAgICAgICBlbC5idXR0b24uY29uc29sZS5jbGVhciwKICAgICAgICAgIGVsLnJpZ2h0LmNvbnNvbGUucnVuLAogICAgICAgICAgZWwucmlnaHQuY29uc29sZS5jbGVhciwKICAgICAgICAgIGVsLnJpZ2h0LmNzcy5ydW4sCiAgICAgICAgICBlbC5yaWdodC5jc3MuY2xlYXIKICAgICAgICAgIF07CiAgICAgICAgZm9yKHZhciBpPTAsIGxlbj1idXR0b25zLmxlbmd0aDsgaTxsZW47IGkrKykKICAgICAgICAgIGJ1dHRvbnNbaV0uYXR0cmlidXRlLnNldCgiaHJlZiIsIiMiKTsKICAgICAgICB3aW4ucmVmcmVzaFNpemUoKTsKICAgICAgfQogICAgIAogICAgICBpZihlbnYuc2hvd0ljb25XaGVuSGlkZGVuKSB7CiAgICAgICAgaWYoIWVudi5wb3B1cFdpbikgewogICAgICAgICAgZWwuZmlyZWJ1Z0ljb24uZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6IGVudi5kZWJ1ZyYmJ25vbmUnfHwnYmxvY2snIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgbGliLnV0aWwuQWRkRXZlbnQod2luZG93LCAidW5sb2FkIiwgd2luLnVubG9hZCk7CgogICAgICBpZiAoZW52LmlzUG9wdXApIHsKICAgICAgICBlbnYuaGVpZ2h0PWxpYi51dGlsLkdldFZpZXdwb3J0KCkuaGVpZ2h0OwogICAgICAgIGxpYi51dGlsLkFkZEV2ZW50KHdpbmRvdywgInJlc2l6ZSIsIHdpbi5maXRUb1BvcHVwKTsKICAgICAgICB3aW4uZml0VG9Qb3B1cCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGxpYi51dGlsLkFkZEV2ZW50KHdpbmRvdywgInJlc2l6ZSIsIHdpbi5yZWZyZXNoU2l6ZSk7CiAgICAgIH0KCiAgICAgIHdpbi5zZXRIZWlnaHQoZW52LmhlaWdodCk7CgogICAgICBpZihlbnYub3BlbkluUG9wdXAmJiFlbnYuaXNQb3B1cCkgewogICAgICAgIHdpbi5uZXdXaW5kb3coKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbC5tYWluLmVudmlyb25tZW50LmFkZFN0eWxlKHsgImRpc3BsYXkiOmVudi5kZWJ1ZyYmJ2Jsb2NrJ3x8J25vbmUnIH0pOwogICAgICAgIGVsLm1haW5pZnJhbWUuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6ZW52LmRlYnVnJiYnYmxvY2snfHwnbm9uZScgfSk7CiAgICAgIH0KICAgIH0gIAogIH0sCiAgaW5zcGVjdDpmdW5jdGlvbigpewogICAgcmV0dXJuIGZpcmVidWcuZC5odG1sLmluc3BlY3QuYXBwbHkod2luZG93LGFyZ3VtZW50cyk7CiAgfSwKICB3YXRjaFhIUjpmdW5jdGlvbigpewogICAgd2l0aChmaXJlYnVnKXsKICAgICAgZC54aHIuYWRkT2JqZWN0LmFwcGx5KHdpbmRvdyxhcmd1bWVudHMpOwogICAgICBpZihlbnYuZEluZGV4IT0ieGhyIil7CiAgICAgICAgZC5uYXZpZ2F0ZSgieGhyIik7CiAgICAgIH0KICAgIH0KICB9LAogIHNldHRpbmdzOnsKICAgIGlzVmlzaWJsZTpmYWxzZSwKICAgIHNob3c6IGZ1bmN0aW9uKCkgewogICAgICB3aXRoKGZpcmVidWcpewogICAgICAgIHZhciBwb3NYWT1saWIudXRpbC5FbGVtZW50LmdldFBvc2l0aW9uKGZpcmVidWcuZWwubmF2Lm9wdGlvbnMuZWxlbWVudCk7CiAgICAgICAgc2V0dGluZ3MucmVmcmVzaEZvcm0oKTsKCiAgICAgICAgZWwuc2V0dGluZ3MuY29udGFpbmVyLmVudmlyb25tZW50LmFkZFN0eWxlKHsKICAgICAgICAgICJkaXNwbGF5IjogImJsb2NrIiwKICAgICAgICAgICJsZWZ0IjogKHBvc1hZLm9mZnNldExlZnQtMTI1KSsicHgiCiAgICAgICAgfSk7CiAgICAgICAgZWwuc2V0dGluZ3MucHJvZ3Jlc3NEaXYuZW52aXJvbm1lbnQuYWRkU3R5bGUoewogICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICB9KTsKICAgICAgICBmaXJlYnVnLnNldHRpbmdzLmlzVmlzaWJsZSA9IHRydWU7CiAgICAgIH0KICAgIH0sCiAgICBoaWRlOiBmdW5jdGlvbigpIHsKICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICBmaXJlYnVnLmVsLnNldHRpbmdzLmNvbnRhaW5lci5lbnZpcm9ubWVudC5hZGRTdHlsZSh7CiAgICAgICAgICAiZGlzcGxheSI6ICJub25lIgogICAgICAgIH0pOwogICAgICAgIGZpcmVidWcuc2V0dGluZ3MuaXNWaXNpYmxlID0gZmFsc2U7CiAgICAgIH0KICAgIH0sCiAgICB0b2dnbGU6IGZ1bmN0aW9uKCl7CiAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgc2V0dGluZ3NbIXNldHRpbmdzLmlzVmlzaWJsZSAmJiAnc2hvdycgfHwgJ2hpZGUnXSgpOwogICAgICB9CiAgICB9LAogICAgc2F2ZUNsaWNrZWQ6IGZ1bmN0aW9uKCkgewogICAgICBmaXJlYnVnLmVsLnNldHRpbmdzLnByb2dyZXNzRGl2LmVudmlyb25tZW50LmFkZFN0eWxlKHsKICAgICAgICAiZGlzcGxheSI6ICJibG9jayIKICAgICAgfSk7CiAgICAgIHNldFRpbWVvdXQoZmlyZWJ1Zy5zZXR0aW5ncy5mb3JtVG9TZXR0aW5ncywwKTsKICAgIH0sCiAgICBmb3JtVG9TZXR0aW5nczogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBmZT1maXJlYnVnLmVudiwKICAgICAgICBvZmUsCiAgICAgICAgZWxTZXQ9ZmlyZWJ1Zy5lbC5zZXR0aW5ncywKICAgICAgICBleGRhdGU7CgogICAgICBmZS5kZWJ1Zz1lbFNldC5jYnhEZWJ1Zy5lbGVtZW50LmNoZWNrZWQ7CiAgICAgIGZlLmRldGVjdEZpcmVidWc9ZWxTZXQuY2J4RGV0ZWN0RmlyZWJ1Zy5lbGVtZW50LmNoZWNrZWQ7CiAgICAgIGZlLmhpZGVET01GdW5jdGlvbnM9ZWxTZXQuY2J4SGlkZURPTUZ1bmN0aW9ucy5lbGVtZW50LmNoZWNrZWQ7CiAgICAgIGZlLm92ZXJyaWRlPWVsU2V0LmNieE92ZXJyaWRlLmVsZW1lbnQuY2hlY2tlZDsKICAgICAgZmUuc2hvd0ljb25XaGVuSGlkZGVuPWVsU2V0LmNieFNob3dJY29uLmVsZW1lbnQuY2hlY2tlZDsKICAgICAgZmUub3BlbkluUG9wdXA9ZWxTZXQuY2J4T3BlbkluUG9wdXAuZWxlbWVudC5jaGVja2VkOwoKICAgICAgaWYoZmUuaXNQb3B1cCkgewogICAgICAgIG9mZT13aW5kb3cub3BlbmVyLmZpcmVidWcuZW52OwogICAgICAgIG9mZS5kZWJ1Zz1mZS5kZWJ1ZzsKICAgICAgICBvZmUuZGV0ZWN0RmlyZWJ1Zz1mZS5kZXRlY3RGaXJlYnVnOwogICAgICAgIG9mZS5oaWRlRE9NRnVuY3Rpb25zPWZlLmhpZGVET01GdW5jdGlvbnM7CiAgICAgICAgb2ZlLm92ZXJyaWRlPWZlLm92ZXJyaWRlOwogICAgICAgIG9mZS5zaG93SWNvbldoZW5IaWRkZW49ZmUuc2hvd0ljb25XaGVuSGlkZGVuOwogICAgICAgIG9mZS5vcGVuSW5Qb3B1cD1mZS5vcGVuSW5Qb3B1cDsKICAgICAgICBvZmUucG9wdXBUb3A9ZmUucG9wdXBUb3A7CiAgICAgICAgb2ZlLnBvcHVwTGVmdD1mZS5wb3B1cExlZnQ7CiAgICAgICAgb2ZlLnBvcHVwV2lkdGg9ZmUucG9wdXBXaWR0aDsKICAgICAgICBvZmUucG9wdXBIZWlnaHQ9ZmUucG9wdXBIZWlnaHQ7CiAgICAgIH0KCiAgICAgIHdpdGgoZmlyZWJ1ZykgewogICAgICAgIHNldHRpbmdzLndyaXRlQ29va2llKCk7CiAgICAgICAgc2V0dGluZ3MuaGlkZSgpOwogICAgICAgIHdpbi5yZWZyZXNoRE9NKCk7CiAgICAgIH0KICAgIH0sCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBleGRhdGU9bmV3IERhdGUoKTsKCiAgICAgIGV4ZGF0ZS5zZXRUaW1lKGV4ZGF0ZS5nZXRUaW1lKCktMSk7CiAgICAgIGRvY3VtZW50LmNvb2tpZT0nRkJMaXRlU2V0dGluZ3M9O2V4cGlyZXM9JytleGRhdGUudG9HTVRTdHJpbmcoKTsKICAgICAgbG9jYXRpb24ucmVsb2FkKHRydWUpOwogICAgfSwKICAgIHJlYWRDb29raWU6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaSxjb29raWVBcnIsdmFsdWVBcnIsaXRlbSx2YWx1ZTsKCiAgICAgIHdpdGgoZmlyZWJ1Zy5lbnYpewogICAgICAgIGlmKHRhcmdldFdpbmRvdy5kb2N1bWVudC5jb29raWUubGVuZ3RoPjApIHsKICAgICAgICAgIGNvb2tpZUFycj10YXJnZXRXaW5kb3cuZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpOwogICAgICAgICAgCiAgICAgICAgICBmb3IoaT0wO2k8Y29va2llQXJyLmxlbmd0aDtpKyspIHsKICAgICAgICAgICAgaWYoY29va2llQXJyW2ldLnNwbGl0KCc9JylbMF09PSdGQkxpdGVTZXR0aW5ncycpIHsKICAgICAgICAgICAgICB2YWx1ZUFycj1jb29raWVBcnJbaV0uc3BsaXQoJz0nKVsxXS5zcGxpdCgnLCcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgaWYodmFsdWVBcnIpIHsKICAgICAgICAgICAgZm9yKGk9MDtpPHZhbHVlQXJyLmxlbmd0aDtpKyspIHsKICAgICAgICAgICAgICBpdGVtPXZhbHVlQXJyW2ldLnNwbGl0KCc6JylbMF07CiAgICAgICAgICAgICAgdmFsdWU9dmFsdWVBcnJbaV0uc3BsaXQoJzonKVsxXTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICBzd2l0Y2goaXRlbSkgewogICAgICAgICAgICAgICAgY2FzZSAnZGVidWcnOgogICAgICAgICAgICAgICAgICBkZWJ1Zz12YWx1ZT09InRydWUiOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2RldGVjdEZpcmVidWcnOgogICAgICAgICAgICAgICAgICBkZXRlY3RGaXJlYnVnPXZhbHVlPT0idHJ1ZSI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnaGlkZURPTUZ1bmN0aW9ucyc6CiAgICAgICAgICAgICAgICAgIGhpZGVET01GdW5jdGlvbnM9dmFsdWU9PSJ0cnVlIjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdvdmVycmlkZSc6CiAgICAgICAgICAgICAgICAgIG92ZXJyaWRlPXZhbHVlPT0idHJ1ZSI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc2hvd0ljb25XaGVuSGlkZGVuJzoKICAgICAgICAgICAgICAgICAgc2hvd0ljb25XaGVuSGlkZGVuPXZhbHVlPT0idHJ1ZSI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnb3BlbkluUG9wdXAnOgogICAgICAgICAgICAgICAgICBvcGVuSW5Qb3B1cD12YWx1ZT09InRydWUiOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3BvcHVwVG9wJzoKICAgICAgICAgICAgICAgICAgcG9wdXBUb3A9cGFyc2VJbnQodmFsdWUsMTApOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3BvcHVwTGVmdCc6CiAgICAgICAgICAgICAgICAgIHBvcHVwTGVmdD1wYXJzZUludCh2YWx1ZSwxMCk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAncG9wdXBXaWR0aCc6CiAgICAgICAgICAgICAgICAgIHBvcHVwV2lkdGg9cGFyc2VJbnQodmFsdWUsMTApOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3BvcHVwSGVpZ2h0JzoKICAgICAgICAgICAgICAgICAgcG9wdXBIZWlnaHQ9cGFyc2VJbnQodmFsdWUsMTApOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2hlaWdodCc6CiAgICAgICAgICAgICAgICAgIGhlaWdodD1wYXJzZUludCh2YWx1ZSwxMCk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHdyaXRlQ29va2llOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHZhbHVlczsKICAgICAgCiAgICAgIHdpdGgoZmlyZWJ1Zy5lbnYpewogICAgICAgIHZhbHVlcz0nZGVidWc6JytkZWJ1ZysnLCc7CiAgICAgICAgdmFsdWVzKz0nZGV0ZWN0RmlyZWJ1ZzonK2RldGVjdEZpcmVidWcrJywnOwogICAgICAgIHZhbHVlcys9J2hpZGVET01GdW5jdGlvbnM6JytoaWRlRE9NRnVuY3Rpb25zKycsJzsKICAgICAgICB2YWx1ZXMrPSdvdmVycmlkZTonK292ZXJyaWRlKycsJzsKICAgICAgICB2YWx1ZXMrPSdzaG93SWNvbldoZW5IaWRkZW46JytzaG93SWNvbldoZW5IaWRkZW4rJywnOwogICAgICAgIHZhbHVlcys9J29wZW5JblBvcHVwOicrb3BlbkluUG9wdXArJywnOwoKICAgICAgICBpZihpc1BvcHVwKSB7CiAgICAgICAgICBpZih3aW5kb3cub3V0ZXJXaWR0aD09PXVuZGVmaW5lZCkgewogICAgICAgICAgICB2YWx1ZXMrPSdwb3B1cFRvcDonKyh3aW5kb3cuc2NyZWVuVG9wLTU2KSsnLCc7CiAgICAgICAgICAgIHZhbHVlcys9J3BvcHVwTGVmdDonKyh3aW5kb3cuc2NyZWVuTGVmdC04KSsnLCc7CiAgICAgICAgICAgIHZhbHVlcys9J3BvcHVwV2lkdGg6Jytkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoKycsJzsKICAgICAgICAgICAgdmFsdWVzKz0ncG9wdXBIZWlnaHQ6Jytkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCsnLCc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZXMrPSdwb3B1cFRvcDonK3dpbmRvdy5zY3JlZW5ZKycsJzsKICAgICAgICAgICAgdmFsdWVzKz0ncG9wdXBMZWZ0Oicrd2luZG93LnNjcmVlblgrJywnOwogICAgICAgICAgICB2YWx1ZXMrPSdwb3B1cFdpZHRoOicrd2luZG93Lm91dGVyV2lkdGgrJywnOwogICAgICAgICAgICB2YWx1ZXMrPSdwb3B1cEhlaWdodDonK3dpbmRvdy5vdXRlckhlaWdodCsnLCc7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhbHVlcys9J3BvcHVwVG9wOicrcG9wdXBUb3ArJywnOwogICAgICAgICAgdmFsdWVzKz0ncG9wdXBMZWZ0OicrcG9wdXBMZWZ0KycsJzsKICAgICAgICAgIHZhbHVlcys9J3BvcHVwV2lkdGg6Jytwb3B1cFdpZHRoKycsJzsKICAgICAgICAgIHZhbHVlcys9J3BvcHVwSGVpZ2h0OicrcG9wdXBIZWlnaHQrJywnOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB2YWx1ZXMrPSdoZWlnaHQ6JysocGFyc2VJbnQodGFyZ2V0V2luZG93LmZpcmVidWcuZWwubWFpbi5lbGVtZW50LnN0eWxlLmhlaWdodC5yZXBsYWNlKC9weC8sJycpLDEwKS0zOCk7CgogICAgICAgIGV4ZGF0ZT1uZXcgRGF0ZSgpOwogICAgICAgIGV4ZGF0ZS5zZXREYXRlKGV4ZGF0ZS5nZXREYXRlKCkrMzY1KTsKICAgICAgICB0YXJnZXRXaW5kb3cuZG9jdW1lbnQuY29va2llPSdGQkxpdGVTZXR0aW5ncz0nK3ZhbHVlcysnO2V4cGlyZXM9JytleGRhdGUudG9HTVRTdHJpbmcoKTsKICAgICAgfQogICAgfSwKICAgIHJlZnJlc2hGb3JtOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGZlPWZpcmVidWcuZW52LAogICAgICAgICAgZWxTZXQ9ZmlyZWJ1Zy5lbC5zZXR0aW5nczsKCiAgICAgIGVsU2V0LmNieERlYnVnLmVsZW1lbnQuY2hlY2tlZD1mZS5kZWJ1ZzsKICAgICAgZWxTZXQuY2J4RGV0ZWN0RmlyZWJ1Zy5lbGVtZW50LmNoZWNrZWQ9ZmUuZGV0ZWN0RmlyZWJ1ZzsKICAgICAgZWxTZXQuY2J4SGlkZURPTUZ1bmN0aW9ucy5lbGVtZW50LmNoZWNrZWQ9ZmUuaGlkZURPTUZ1bmN0aW9uczsKICAgICAgZWxTZXQuY2J4T3ZlcnJpZGUuZWxlbWVudC5jaGVja2VkPWZlLm92ZXJyaWRlOwogICAgICBlbFNldC5jYnhTaG93SWNvbi5lbGVtZW50LmNoZWNrZWQ9ZmUuc2hvd0ljb25XaGVuSGlkZGVuOwogICAgICBlbFNldC5jYnhPcGVuSW5Qb3B1cC5lbGVtZW50LmNoZWNrZWQ9ZmUub3BlbkluUG9wdXA7CiAgICB9CiAgfSwKICB3aW46ewogICAgaGlkZTpmdW5jdGlvbigpewogICAgICB3aXRoKGZpcmVidWcpewogICAgICAgIGVsLm1haW4uZW52aXJvbm1lbnQuYWRkU3R5bGUoewogICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICB9KTsKICAgICAgICBlbC5tYWluaWZyYW1lLmVudmlyb25tZW50LmFkZFN0eWxlKHsKICAgICAgICAgICJkaXNwbGF5IjogIm5vbmUiCiAgICAgICAgfSk7CiAgICAgICAgaWYoZW52LnNob3dJY29uV2hlbkhpZGRlbikgewogICAgICAgICAgZWwuZmlyZWJ1Z0ljb24uZW52aXJvbm1lbnQuYWRkU3R5bGUoewogICAgICAgICAgICAiZGlzcGxheSI6ICJibG9jayIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHNob3c6ZnVuY3Rpb24oKXsKICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICBlbC5tYWluLmVudmlyb25tZW50LmFkZFN0eWxlKHsKICAgICAgICAgICJkaXNwbGF5IjogImJsb2NrIgogICAgICAgIH0pOwogICAgICAgIGVsLm1haW5pZnJhbWUuZW52aXJvbm1lbnQuYWRkU3R5bGUoewogICAgICAgICAgImRpc3BsYXkiOiAiYmxvY2siCiAgICAgICAgfSk7CiAgICAgICAgaWYoZW52LnNob3dJY29uV2hlbkhpZGRlbikgewogICAgICAgICAgZWwuZmlyZWJ1Z0ljb24uZW52aXJvbm1lbnQuYWRkU3R5bGUoewogICAgICAgICAgICAiZGlzcGxheSI6ICJub25lIgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgaWNvbkNsaWNrZWQ6ZnVuY3Rpb24oX2V2ZW50KSB7CiAgICAgICAgd2l0aChmaXJlYnVnKSB7CiAgICAgICAgICAgIGlmKF9ldmVudC5jdHJsS2V5PT10cnVlfHxfZXZlbnQubWV0YUtleT09dHJ1ZSkgewogICAgICAgICAgICAgICAgZWwuZmlyZWJ1Z0ljb24uZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6ICJub25lIiB9KTsKICAgICAgICAgICAgICAgIGVudi5zaG93SWNvbldoZW5IaWRkZW49ZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB3aW4uc2hvdygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKICAgIG1pbmltaXplOmZ1bmN0aW9uKCl7CiAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgZW52Lm1pbmltaXplZD10cnVlOwogICAgICAgIGVsLm1haW4uZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiaGVpZ2h0IjoiMzVweCIgfSk7CiAgICAgICAgZWwubWFpbmlmcmFtZS5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ICJoZWlnaHQiOiIzNXB4IiB9KTsKICAgICAgICBlbC5idXR0b24ubWF4aW1pemUuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6ImJsb2NrIiB9KTsKICAgICAgICBlbC5idXR0b24ubWluaW1pemUuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6Im5vbmUiIH0pOwogICAgICAgIHdpbi5yZWZyZXNoU2l6ZSgpOwogICAgICB9CiAgICB9LAogICAgbWF4aW1pemU6ZnVuY3Rpb24oKXsKICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICBlbnYubWluaW1pemVkPWZhbHNlOwogICAgICAgIGVsLmJ1dHRvbi5taW5pbWl6ZS5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ICJkaXNwbGF5IjoiYmxvY2siIH0pOwogICAgICAgIGVsLmJ1dHRvbi5tYXhpbWl6ZS5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ICJkaXNwbGF5Ijoibm9uZSIgfSk7CiAgICAgICAgd2luLnNldEhlaWdodChlbnYuaGVpZ2h0KTsKICAgICAgfQogICAgfSwKICAgIG5ld1dpbmRvdzogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBpbnRlcnZhbCxzY3JpcHRzLHNjcmlwdCxzY3JpcHRQYXRoLAogICAgICAgICAgZmU9ZmlyZWJ1Zy5lbnY7CgogICAgICBpZiAoIWZlLnBvcHVwV2luKSB7CiAgICAgICAgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTsKICAgICAgICAKICAgICAgICBmZS5wb3B1cFdpbiA9IHdpbmRvdy5vcGVuKCIiLCAiX2ZpcmVidWciLCAKICAgICAgICAgICJzdGF0dXM9MCxtZW51YmFyPTAscmVzaXphYmxlPTEsdG9wPSIrZmUucG9wdXBUb3ArIixsZWZ0PSIrZmUucG9wdXBMZWZ0KyIsd2lkdGg9IiArIGZlLnBvcHVwV2lkdGggKyAKICAgICAgICAgICIsaGVpZ2h0PSIgKyBmZS5wb3B1cEhlaWdodCArICIsc2Nyb2xsYmFycz0wLGFkZHJlc3NiYXI9MCxvdXRlcldpZHRoPSIrZmUucG9wdXBXaWR0aCsiLG91dGVySGVpZ2h0PSIrZmUucG9wdXBIZWlnaHQrCiAgICAgICAgICAidG9vbGJhcj0wLGxvY2F0aW9uPTAsZGlyZWN0b3JpZXM9MCxkaWFsb2c9MCIpOwogICAgICAgIAogICAgICAgIGlmKCFmZS5wb3B1cFdpbikgewogICAgICAgICAgYWxlcnQoIkZpcmVidWcgTGl0ZSBjb3VsZCBub3Qgb3BlbiBhIHBvcC11cCB3aW5kb3csIG1vc3QgbGlrZWx5IGJlY2F1c2Ugb2YgYSBwb3B1cCBibG9ja2VyLlxuUGxlYXNlIGVuYWJsZSBwb3B1cHMgZm9yIHRoaXMgZG9tYWluIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZpcmVidWcuc2V0dGluZ3MuaGlkZSgpOwogICAgICAgIAogICAgICAgICAgZm9yIChpPTAsbGVuPXNjcmlwdHMubGVuZ3RoOyBpPGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChzY3JpcHRzW2ldLnNyYy5pbmRleE9mKGZlLmxpdGVGaWxlbmFtZSkgPiAtMSkgewogICAgICAgICAgICAgIHNjcmlwdFBhdGggPSBzY3JpcHRzW2ldLnNyYzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChzY3JpcHRQYXRoKSB7CiAgICAgICAgICAgIHNjcmlwdCA9IGZlLnBvcHVwV2luLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpLCBkb25lID0gZmFsc2U7CiAgICAgICAgICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CiAgICAgICAgICAgIHNjcmlwdC5zcmMgPSBzY3JpcHRQYXRoOwoKICAgICAgICAgICAgc2NyaXB0W2ZpcmVidWcubGliLmVudi5pZT8ib25yZWFkeXN0YXRlY2hhbmdlIjoib25sb2FkIl0gPSBmdW5jdGlvbigpewogICAgICAgICAgICAgIGlmKCFkb25lICYmICghZmlyZWJ1Zy5saWIuZW52LmllIHx8IHRoaXMucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiIHx8IHRoaXMucmVhZHlTdGF0ZT09ImxvYWRlZCIpKXsKICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYoZmUucG9wdXBXaW4uZmlyZWJ1ZykgewogICAgICAgICAgICAgICAgICB3aXRoKGZlLnBvcHVwV2luLmZpcmVidWcpIHsKICAgICAgICAgICAgICAgICAgICBlbnYuaXNQb3B1cCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgZW52LmNzcyA9IGZlLmNzczsKICAgICAgICAgICAgICAgICAgICBpbml0KCk7CiAgICAgICAgICAgICAgICAgICAgZWwuYnV0dG9uLmRvY2suZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6ICJibG9jayJ9KTsKICAgICAgICAgICAgICAgICAgICBlbC5idXR0b24ubmV3V2luZG93LmVudmlyb25tZW50LmFkZFN0eWxlKHsgImRpc3BsYXkiOiAibm9uZSJ9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICghZG9uZSAmJiBmaXJlYnVnLmxpYi5lbnYud2Via2l0KSB7CiAgICAgICAgICAgICAgZmUucG9wdXBXaW4uZG9jdW1lbnQud3JpdGUoJzxodG1sPjxoZWFkPjwvaGVhZD48Ym9keT48L2JvZHk+PC9odG1sPicpOwogICAgICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoZmUucG9wdXBXaW4uZmlyZWJ1ZykgewogICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTsKICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgIHdpdGgoZmUucG9wdXBXaW4uZmlyZWJ1ZykgewogICAgICAgICAgICAgICAgICAgIGVudi5pc1BvcHVwID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBlbnYuY3NzID0gZmUuY3NzOwogICAgICAgICAgICAgICAgICAgIGluaXQoKTsKICAgICAgICAgICAgICAgICAgICBlbC5idXR0b24uZG9jay5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ICJkaXNwbGF5IjogImJsb2NrIn0pOwogICAgICAgICAgICAgICAgICAgIGVsLmJ1dHRvbi5uZXdXaW5kb3cuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6ICJub25lIn0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgMTApOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKCFkb25lKSB7CiAgICAgICAgICAgICAgZmUucG9wdXBXaW4uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgICAgICAgIGZpcmVidWcuZWwubWFpbi5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ImRpc3BsYXkiOiAibm9uZSJ9KTsKICAgICAgICAgICAgICBmaXJlYnVnLmVsLm1haW5pZnJhbWUuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyJkaXNwbGF5IjogIm5vbmUifSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFsZXJ0KCJVbmFibGUgdG8gZGV0ZWN0IHRoZSBmb2xsb3dpbmcgc2NyaXB0IFwiIiArIGZlLmxpdGVGaWxlbmFtZSArCiAgICAgICAgICAgICAgICAgICJcIiAuLi4gaWYgdGhlIHNjcmlwdCBoYXMgYmVlbiByZW5hbWVkIHRoZW4gcGxlYXNlIHNldCB0aGUgdmFsdWUgb2YgZmlyZWJ1Zy5lbnYubGl0ZUZpbGVuYW1lIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UiKTsKICAgICAgICAgICAgZmUucG9wdXBXaW4uY2xvc2UoKTsKICAgICAgICAgICAgZmUucG9wdXBXaW49bnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBkb2NrOiBmdW5jdGlvbigpIHsKICAgICAgd2l0aChvcGVuZXIuZmlyZWJ1ZykgewogICAgICAgIGVudi5wb3B1cFdpbiA9IG51bGw7CiAgICAgICAgZWwubWFpbi5lbnZpcm9ubWVudC5hZGRTdHlsZSh7CiAgICAgICAgICAiZGlzcGxheSI6ICJibG9jayIKICAgICAgICB9KTsKICAgICAgICBlbC5tYWluaWZyYW1lLmVudmlyb25tZW50LmFkZFN0eWxlKHsKICAgICAgICAgICJkaXNwbGF5IjogImJsb2NrIgogICAgICAgIH0pOwogICAgICAgIHNldHRpbmdzLnJlYWRDb29raWUoKTsKICAgICAgICB3aW5kb3cuY2xvc2UoKTsKICAgICAgfTsKICAgIH0sCiAgICB1bmxvYWQ6IGZ1bmN0aW9uKCkgewogICAgICB3aXRoKGZpcmVidWcpewogICAgICAgIGlmKGVudi5pc1BvcHVwKSB7CiAgICAgICAgICB3aW4uZG9jaygpOwogICAgICAgIH0gZWxzZSBpZihlbnYucG9wdXBXaW4pIHsKICAgICAgICAgIGVudi5wb3B1cFdpbi5jbG9zZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGZpdFRvUG9wdXA6IGZ1bmN0aW9uKCkgewogICAgICB3aXRoKGZpcmVidWcpIHsKICAgICAgICB2YXIgdmlld3BvcnQgPSBsaWIudXRpbC5HZXRWaWV3cG9ydCh3aW5kb3cpOwogICAgICAgIHdpbi5zZXRIZWlnaHQoKHdpbmRvdy5pbm5lckhlaWdodHx8dmlld3BvcnQuaGVpZ2h0KSAtIDM4KTsKICAgICAgICBlbC5tYWluLmVudmlyb25tZW50LmFkZFN0eWxlKHsKICAgICAgICAgICJ3aWR0aCI6ICh2aWV3cG9ydC53aWR0aCkgKyAicHgiCiAgICAgICAgfSk7CiAgICAgICAgZWwubWFpbmlmcmFtZS5lbnZpcm9ubWVudC5hZGRTdHlsZSh7CiAgICAgICAgICAid2lkdGgiOiAodmlld3BvcnQud2lkdGgpICsgInB4IgogICAgICAgIH0pOwogICAgICB9CiAgICB9LAogICAgcmVzaXplcjp7CiAgICAgIHk6W10sIGVuYWJsZWQ6ZmFsc2UsCiAgICAgIHN0YXJ0OmZ1bmN0aW9uKF9ldmVudCl7CiAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgIGlmKGVudi5taW5pbWl6ZWQpcmV0dXJuOwogICAgICAgICAgd2luLnJlc2l6ZXIueT1bZWwubWFpbi5lbGVtZW50Lm9mZnNldEhlaWdodCxfZXZlbnQuY2xpZW50WV07CiAgICAgICAgICBpZihsaWIuZW52LmllNil7CiAgICAgICAgICAgIHdpbi5yZXNpemVyLnlbM109cGFyc2VJbnQoZWwubWFpbi5lbnZpcm9ubWVudC5nZXRQb3NpdGlvbigpLnRvcCk7CiAgICAgICAgICB9CiAgICAgICAgICB3aW4ucmVzaXplci5lbmFibGVkPXRydWU7CiAgICAgICAgfQogICAgICB9LAogICAgICByZXNpemU6ZnVuY3Rpb24oX2V2ZW50KXsKICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgaWYoIXdpbi5yZXNpemVyLmVuYWJsZWQpcmV0dXJuOwogICAgICAgICAgd2luLnJlc2l6ZXIueVsyXT0od2luLnJlc2l6ZXIueVswXSsod2luLnJlc2l6ZXIueVsxXS1fZXZlbnQuY2xpZW50WSkpOwogICAgICAgICAgZWwubWFpbi5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ICJoZWlnaHQiOndpbi5yZXNpemVyLnlbMl0rInB4IiB9KTsKICAgICAgICAgIGVsLm1haW5pZnJhbWUuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiaGVpZ2h0Ijp3aW4ucmVzaXplci55WzJdKyJweCIgfSk7CiAgICAgICAgICBpZihsaWIuZW52LmllNil7CiAgICAgICAgICAgIGVsLm1haW4uZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAidG9wIjp3aW4ucmVzaXplci55WzNdLSh3aW4ucmVzaXplci55WzFdLV9ldmVudC5jbGllbnRZKSsicHgiIH0pOwogICAgICAgICAgICBlbC5tYWluaWZyYW1lLmVudmlyb25tZW50LmFkZFN0eWxlKHsgInRvcCI6d2luLnJlc2l6ZXIueVszXS0od2luLnJlc2l6ZXIueVsxXS1fZXZlbnQuY2xpZW50WSkrInB4IiB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHN0b3A6ZnVuY3Rpb24oX2V2ZW50KXsKICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgaWYod2luLnJlc2l6ZXIuZW5hYmxlZCl7CiAgICAgICAgICAgIHdpbi5yZXNpemVyLmVuYWJsZWQ9ZmFsc2U7CiAgICAgICAgICAgIHdpbi5zZXRIZWlnaHQod2luLnJlc2l6ZXIueVsyXS0zNSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgc2V0SGVpZ2h0OmZ1bmN0aW9uKF9oZWlnaHQpewogICAgICB3aXRoKGZpcmVidWcpewogICAgICAgIGVudi5oZWlnaHQ9X2hlaWdodDsKCiAgICAgICAgZWwubGVmdC5jb250YWluZXIuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiaGVpZ2h0IjpfaGVpZ2h0KyJweCIgfSk7CiAgICAgICAgZWwucmlnaHQuY29udGFpbmVyLmVudmlyb25tZW50LmFkZFN0eWxlKHsgImhlaWdodCI6X2hlaWdodCsicHgiIH0pOwogICAgICAgIGVsLm1haW4uZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiaGVpZ2h0IjpfaGVpZ2h0KzM4KyJweCIgfSk7CiAgICAgICAgZWwubWFpbmlmcmFtZS5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ICJoZWlnaHQiOl9oZWlnaHQrMzgrInB4IiB9KTsKCiAgICAgICAgd2luLnJlZnJlc2hTaXplKCk7CgogICAgICAgIC8vIGNvbnNvbGUKICAgICAgICBlbC5sZWZ0LmNvbnNvbGUubW9uaXRvci5lbGVtZW50LnBhcmVudE5vZGUuc3R5bGUuaGVpZ2h0PV9oZWlnaHQtNDcrInB4IjsKICAgICAgICBlbC5sZWZ0LmNvbnNvbGUubWxCdXR0b24uZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAidG9wIjpfaGVpZ2h0KzE5KyJweCIgfSk7CiAgICAgICAgZWwucmlnaHQuY29uc29sZS5tbEJ1dHRvbi5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ICJ0b3AiOl9oZWlnaHQrMTkrInB4IiB9KTsKICAgICAgICBlbC5yaWdodC5jb25zb2xlLmlucHV0LmVudmlyb25tZW50LmFkZFN0eWxlKHsgImhlaWdodCI6X2hlaWdodC0yOSsicHgiIH0pOwoKICAgICAgICAvLyBodG1sCiAgICAgICAgZWwubGVmdC5odG1sLmNvbnRhaW5lci5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ImhlaWdodCI6X2hlaWdodC0yMysicHgifSk7CiAgICAgICAgZWwucmlnaHQuaHRtbC5jb250ZW50LmVudmlyb25tZW50LmFkZFN0eWxlKHsiaGVpZ2h0IjpfaGVpZ2h0LTIzKyJweCJ9KTsKCiAgICAgICAgLy8gY3NzCiAgICAgICAgZWwubGVmdC5jc3MuY29udGFpbmVyLmVudmlyb25tZW50LmFkZFN0eWxlKHsiaGVpZ2h0IjpfaGVpZ2h0LTMzKyJweCJ9KTsKICAgICAgICBlbC5yaWdodC5jc3MuaW5wdXQuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiaGVpZ2h0IjpfaGVpZ2h0LTU1KyJweCIgfSk7CgogICAgICAgIC8vIHNjcmlwdAogICAgICAgIGVsLmxlZnQuc2NyaXB0cy5jb250YWluZXIuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyJoZWlnaHQiOl9oZWlnaHQtMjMrInB4In0pOwoKICAgICAgICAvLyBkb20KICAgICAgICBlbC5sZWZ0LmRvbS5jb250YWluZXIuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyJoZWlnaHQiOl9oZWlnaHQtMzErInB4In0pOwoKICAgICAgICAvLyB4aHIKICAgICAgICBlbC5sZWZ0Lnhoci5jb250YWluZXIuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyJoZWlnaHQiOl9oZWlnaHQtMzIrInB4In0pOwoKICAgICAgICAvLyBzdHJpbmcKICAgICAgICBlbC5sZWZ0LnN0ci5jb250YWluZXIuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyJoZWlnaHQiOl9oZWlnaHQtMzIrInB4In0pOwogICAgICB9CiAgICB9LAogICAgcmVmcmVzaERPTTpmdW5jdGlvbigpewogICAgICB3aXRoKGZpcmVidWcpewogICAgICAgIGQuZG9tLm9wZW4oZXZhbChlbC5idXR0b24uZG9tLnRleHRib3guZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLnZhbHVlKSxlbC5sZWZ0LmRvbS5jb250YWluZXIpOwogICAgICAgIGlmKGQuaHRtbC5uSW5kZXg9PSJkb20iKXsKICAgICAgICAgIGZpcmVidWcuZC5odG1sLm5hdmlnYXRlKCJkb20iKQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHJlZnJlc2hTaXplOmZ1bmN0aW9uKCl7CiAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgaWYoIWVudi5pbml0KQogICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgZGltID0gbGliLnV0aWwuR2V0Vmlld3BvcnQoKTsKICAgICAgICBlbC5tYWluLmVudmlyb25tZW50LmFkZFN0eWxlKHsgIndpZHRoIjpkaW0ud2lkdGgrInB4In0pOwogICAgICAgIGVsLm1haW5pZnJhbWUuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAid2lkdGgiOmRpbS53aWR0aCsicHgifSk7CiAgICAgICAgaWYobGliLmVudi5pZTYpCiAgICAgICAgICB3aW4uc2V0VmVydGljYWxQb3NpdGlvbihkaW0pOwogICAgICB9CiAgICB9LAogICAgc2V0VmVydGljYWxQb3NpdGlvbjpmdW5jdGlvbihfZGltLF9ldmVudCl7CiAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgdmFyIGRpbSA9IF9kaW18fGxpYi51dGlsLkdldFZpZXdwb3J0KCk7CiAgICAgICAgZWwubWFpbi5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ICJ0b3AiOmRpbS5oZWlnaHQtZWwubWFpbi5lbnZpcm9ubWVudC5nZXRTaXplKCkub2Zmc2V0SGVpZ2h0K01hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApKyJweCIgfSk7CiAgICAgICAgZWwubWFpbmlmcmFtZS5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ICJ0b3AiOmRpbS5oZWlnaHQtZWwubWFpbi5lbnZpcm9ubWVudC5nZXRTaXplKCkub2Zmc2V0SGVpZ2h0K01hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApKyJweCIgfSk7CiAgICAgIH0KICAgIH0KICB9LAogIGQ6IHsKICAgIGNsZWFuOmZ1bmN0aW9uKF9lbGVtZW50KXsKICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICBfZWxlbWVudC51cGRhdGUoIiIpOwogICAgICB9CiAgICB9LAogICAgY29uc29sZTp7CiAgICAgIGFkZExpbmU6ZnVuY3Rpb24oKXsKICAgICAgICB3aXRoIChmaXJlYnVnKSB7CiAgICAgICAgICByZXR1cm4gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlJvdyIpLmluc2VydChlbC5sZWZ0LmNvbnNvbGUubW9uaXRvcik7CiAgICAgICAgfQogICAgICB9LAogICAgICBjYWNoZTpbXSwKICAgICAgY2xlYXI6ZnVuY3Rpb24oKXsKICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgZC5jbGVhbihlbC5sZWZ0LmNvbnNvbGUubW9uaXRvcik7CiAgICAgICAgICBkLmNvbnNvbGUuY2FjaGUgPSBbXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGZvcm1hdEFyZ3M6ZnVuY3Rpb24oKXsKICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgdmFyIGNvbnRlbnQgPSBbXTsKICAgICAgICAgIGZvcih2YXIgaT0wLCBsZW49YXJndW1lbnRzLmxlbmd0aDsgaTxsZW47IGkrKyl7CiAgICAgICAgICAgIGNvbnRlbnQucHVzaCggZC5oaWdobGlnaHQoYXJndW1lbnRzW2ldLGZhbHNlLGZhbHNlLHRydWUpICk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY29udGVudC5qb2luKCIgIik7CiAgICAgICAgfQogICAgICB9LAogICAgICBoaXN0b3J5OltdLCBoaXN0b3J5SW5kZXg6MCwKICAgICAgb3Blbk9iamVjdDpmdW5jdGlvbihfaW5kZXgpewogICAgICAgIHdpdGggKGZpcmVidWcpIHsKICAgICAgICAgIGQuZG9tLm9wZW4oZC5jb25zb2xlLmNhY2hlW19pbmRleF0sIGVsLmxlZnQuZG9tLmNvbnRhaW5lciwgbGliLmVudi5pZSk7CiAgICAgICAgICBkLm5hdmlnYXRlKCJkb20iKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHByaW50OiBmdW5jdGlvbihfY21kLF90ZXh0KXsKICAgICAgICB3aXRoIChmaXJlYnVnKXsKICAgICAgICAgIGQuY29uc29sZS5hZGRMaW5lKCkuYXR0cmlidXRlLmFkZENsYXNzKCJBcnJvdyIpLnVwZGF0ZSgiPj4+ICIrX2NtZCk7CiAgICAgICAgICBkLmNvbnNvbGUuYWRkTGluZSgpLnVwZGF0ZShkLmhpZ2hsaWdodChfdGV4dCxmYWxzZSxmYWxzZSx0cnVlKSk7CiAgICAgICAgICBkLmNvbnNvbGUuc2Nyb2xsKCk7CiAgICAgICAgfQogICAgICB9LAogICAgICBwcmludEV4Y2VwdGlvbjogZnVuY3Rpb24oX2V4Y2VwdGlvbil7CiAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgIHZhciBtZXNzYWdlID0gX2V4Y2VwdGlvbi5kZXNjcmlwdGlvbnx8X2V4Y2VwdGlvbi5tZXNzYWdlfHxfZXhjZXB0aW9uOwogICAgICAgICAgaWYoX2V4Y2VwdGlvbi5maWxlTmFtZSl7CiAgICAgICAgICAgIG1lc3NhZ2UrPScgKCcrKF9leGNlcHRpb24ubmFtZSYmKF9leGNlcHRpb24ubmFtZSsnLCAnKXx8JycpK2dldEZpbGVOYW1lKF9leGNlcHRpb24uZmlsZU5hbWUpKycsICcrX2V4Y2VwdGlvbi5saW5lTnVtYmVyKycpJzsKICAgICAgICAgIH0KICAgICAgICAgIGQuY29uc29sZS5hZGRMaW5lKCkuYXR0cmlidXRlLmFkZENsYXNzKCJFcnJvciIpLnVwZGF0ZSgiPHN0cm9uZz5FcnJvcjogPC9zdHJvbmc+IittZXNzYWdlLHRydWUpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZXZhbDpmdW5jdGlvbihfY21kKXsKICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgICBpZihfY21kLmxlbmd0aD09MCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgIGVsLmxlZnQuY29uc29sZS5pbnB1dC5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCkudmFsdWUgPSAiIjsKICAgICAgICAgIGQuY29uc29sZS5oaXN0b3J5SW5kZXggPSBkLmNvbnNvbGUuaGlzdG9yeS5wdXNoKF9jbWQpOwoKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmKF9jbWQ9PT0nY29uc29sZS5maXJlYnVnJykgewogICAgICAgICAgICAgIGQuY29uc29sZS5hZGRMaW5lKCkuYXR0cmlidXRlLmFkZENsYXNzKCJBcnJvdyIpLnVwZGF0ZShmaXJlYnVnLnZlcnNpb24pOwogICAgICAgICAgICB9IGVsc2UgeyAgCiAgICAgICAgICAgICAgcmVzdWx0ID0gZXZhbC5jYWxsKHdpbmRvdyxfY21kKTsKICAgICAgICAgICAgICBkLmNvbnNvbGUucHJpbnQoX2NtZCxyZXN1bHQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoKGUpewogICAgICAgICAgICBkLmNvbnNvbGUuYWRkTGluZSgpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQXJyb3ciKS51cGRhdGUoIj4+PiAiK19jbWQpOwogICAgICAgICAgICBkLmNvbnNvbGUucHJpbnRFeGNlcHRpb24oZSk7CiAgICAgICAgICB9CiAgICAgICAgICBkLmNvbnNvbGUuc2Nyb2xsKCk7CiAgICAgICAgfQogICAgICB9LAogICAgICBzY3JvbGw6ZnVuY3Rpb24oKXsKICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgZWwubGVmdC5jb25zb2xlLm1vbml0b3IuZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLnBhcmVudE5vZGUuc2Nyb2xsVG9wID0gTWF0aC5hYnMoZWwubGVmdC5jb25zb2xlLm1vbml0b3IuZW52aXJvbm1lbnQuZ2V0U2l6ZSgpLm9mZnNldEhlaWdodC0oZWwubGVmdC5jb25zb2xlLm1vbml0b3IuZWxlbWVudC5wYXJlbnROb2RlLm9mZnNldEhlaWdodC0xMSkpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcnVuOmZ1bmN0aW9uKF9jb21tYW5kKXsKICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgaWYoIWVudi5pbml0KXsKICAgICAgICAgICAgZC5jb25zb2xlLmNhY2hlLnB1c2goeyAiY29tbWFuZCI6X2NvbW1hbmQsICJhcmciOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSB9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGQuY29uc29sZS5jbWRbX2NvbW1hbmRdLmFwcGx5KHdpbmRvdyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgdG9nZ2xlTUw6ZnVuY3Rpb24oKXsKICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgdmFyIG9wZW4gPSAhZW52Lm1sOwogICAgICAgICAgZW52Lm1sID0gIWVudi5tbDsKICAgICAgICAgIGQubmF2aWdhdGVSaWdodENvbHVtbigiY29uc29sZSIsb3Blbik7CiAgICAgICAgICBlbFtvcGVuPyJsZWZ0IjoicmlnaHQiXS5jb25zb2xlLm1sQnV0dG9uLmVudmlyb25tZW50LmFkZFN0eWxlKHsgZGlzcGxheToibm9uZSIgfSk7CiAgICAgICAgICBlbFshb3Blbj8ibGVmdCI6InJpZ2h0Il0uY29uc29sZS5tbEJ1dHRvbi5lbnZpcm9ubWVudC5hZGRTdHlsZSh7IGRpc3BsYXk6ImJsb2NrIiB9KTsKICAgICAgICAgIGVsLmxlZnQuY29uc29sZS5tbEJ1dHRvbi5hdHRyaWJ1dGVbKG9wZW4/ImFkZCI6InJlbW92ZSIpKyJDbGFzcyJdKCJDbG9zZU1MIik7CiAgICAgICAgfQogICAgICB9LAogICAgICBjb3VudE1hcDp7fSwgdGltZU1hcDoge30sCiAgICAgIGNtZDp7CiAgICAgICAgbG9nOiBmdW5jdGlvbihfdmFsdWUpewogICAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBkLmNvbnNvbGUuZm9ybWF0QXJncy5hcHBseSh3aW5kb3csYXJndW1lbnRzKTsKICAgICAgICAgICAgZC5jb25zb2xlLmFkZExpbmUoKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkxvZyIpLnVwZGF0ZShhcmdzKTsKICAgICAgICAgICAgZC5jb25zb2xlLnNjcm9sbCgpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgd2FybjogZnVuY3Rpb24oX3ZhbHVlKXsKICAgICAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgICAgIHZhciBhcmdzID0gZC5jb25zb2xlLmZvcm1hdEFyZ3MuYXBwbHkod2luZG93LGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGQuY29uc29sZS5hZGRMaW5lKCkuYXR0cmlidXRlLmFkZENsYXNzKCJXYXJuIikudXBkYXRlKGFyZ3MpOwogICAgICAgICAgICBkLmNvbnNvbGUuc2Nyb2xsKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBpbmZvOiBmdW5jdGlvbihfdmFsdWUpewogICAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBkLmNvbnNvbGUuZm9ybWF0QXJncy5hcHBseSh3aW5kb3csYXJndW1lbnRzKTsKICAgICAgICAgICAgZC5jb25zb2xlLmFkZExpbmUoKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkluZm8iKS51cGRhdGUoYXJncyk7CiAgICAgICAgICAgIGQuY29uc29sZS5zY3JvbGwoKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGRlYnVnOiBmdW5jdGlvbihfdmFsdWUpewogICAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBkLmNvbnNvbGUuZm9ybWF0QXJncy5hcHBseSh3aW5kb3csYXJndW1lbnRzKTsKICAgICAgICAgICAgZC5jb25zb2xlLmFkZExpbmUoKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkRlYnVnIikudXBkYXRlKGFyZ3MpOwogICAgICAgICAgICBkLmNvbnNvbGUuc2Nyb2xsKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBlcnJvcjogZnVuY3Rpb24oX3ZhbHVlKXsKICAgICAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgICAgIHZhciBhcmdzID0gZC5jb25zb2xlLmZvcm1hdEFyZ3MuYXBwbHkod2luZG93LGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGQuY29uc29sZS5hZGRMaW5lKCkuYXR0cmlidXRlLmFkZENsYXNzKCJFcnJvciIpLnVwZGF0ZShhcmdzKTsKICAgICAgICAgICAgZC5jb25zb2xlLnNjcm9sbCgpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgdHJhY2U6IGZ1bmN0aW9uKF92YWx1ZSl7CiAgICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgICB2YXIgc3RhY2tBbXQgPSAzLCBmID0gYXJndW1lbnRzLmNhbGxlciwgaXNBcnJheSA9IGxpYi51dGlsLklzQXJyYXkoZik7IC8vZnVuY3Rpb24gdGhhdCBjYWxsZWQgdHJhY2UKCiAgICAgICAgICAgIGlmKCghaXNBcnJheSYmZil8fChpc0FycmF5JiZmLmxlbmd0aD4wKSl7CiAgICAgICAgICAgICAgZC5jb25zb2xlLmFkZExpbmUoKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkFycm93IikudXBkYXRlKCI+Pj4gY29uc29sZS50cmFjZShzdGFjaykiKTsKICAgICAgICAgICAgICBmb3IodmFyIGk9MDtpPHN0YWNrQW10O2krKyl7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGYudG9TdHJpbmcoKSwgYXJncyA9IGYuYXJndW1lbnRzOwogICAgICAgICAgICAgICAgZC5kb20ub3Blbih7ImZ1bmN0aW9uIjpmdW5jLCAiYXJndW1lbnRzIjphcmdzfSxkLmNvbnNvbGUuYWRkTGluZSgpKTsKICAgICAgICAgICAgICAgIGYgPSBmLmNhbGxlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGRpcjpmdW5jdGlvbihfdmFsdWUpewogICAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgICAgZC5jb25zb2xlLmFkZExpbmUoKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkFycm93IikudXBkYXRlKCI+Pj4gY29uc29sZS5kaXIoIitfdmFsdWUrIikiKTsKICAgICAgICAgICAgZC5kb20ub3BlbihfdmFsdWUsZC5jb25zb2xlLmFkZExpbmUoKSk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBkaXJ4bWw6IGZ1bmN0aW9uKCl7CiAgICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgICBkLmNvbnNvbGUuY21kLmxvZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgdGltZTogZnVuY3Rpb24oX25hbWUpewogICAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgICAgZC5jb25zb2xlLnRpbWVNYXBbX25hbWVdID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB0aW1lRW5kOiBmdW5jdGlvbihfbmFtZSl7CiAgICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgICBpZihfbmFtZSBpbiBkLmNvbnNvbGUudGltZU1hcCl7CiAgICAgICAgICAgICAgdmFyIGRlbHRhID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBkLmNvbnNvbGUudGltZU1hcFtfbmFtZV0sCiAgICAgICAgICAgICAgYXJncyA9IGQuY29uc29sZS5mb3JtYXRBcmdzLmFwcGx5KHdpbmRvdyxbX25hbWUrIjoiLCBkZWx0YSsibXMiXSk7CiAgICAgICAgICAgICAgZC5jb25zb2xlLmFkZExpbmUoKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoImxvZyIpLnVwZGF0ZShhcmdzKTsKICAgICAgICAgICAgICBkZWxldGUgZC5jb25zb2xlLnRpbWVNYXBbX25hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjb3VudDogZnVuY3Rpb24oX25hbWUpewogICAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgICAgaWYoIWQuY29uc29sZS5jb3VudE1hcFtfbmFtZV0pCiAgICAgICAgICAgICAgZC5jb25zb2xlLmNvdW50TWFwW19uYW1lXSA9IDA7CiAgICAgICAgICAgIGQuY29uc29sZS5jb3VudE1hcFtfbmFtZV0rKzsKICAgICAgICAgICAgZC5jb25zb2xlLmNtZC5sb2cuYXBwbHkod2luZG93LCBbX25hbWUsIGQuY29uc29sZS5jb3VudE1hcFtfbmFtZV1dKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGdyb3VwOmZ1bmN0aW9uKCl7CiAgICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgICBkLmNvbnNvbGUuY21kLmxvZy5hcHBseSh0aGlzLCBbImNvbnNvbGUuZ3JvdXAgaXMgbm90IHN1cHBvcnRlZCJdKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGdyb3VwRW5kOmZ1bmN0aW9uKCl7CiAgICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgICBkLmNvbnNvbGUuY21kLmxvZy5hcHBseSh0aGlzLCBbImNvbnNvbGUuZ3JvdXBFbmQgaXMgbm90IHN1cHBvcnRlZCJdKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHByb2ZpbGU6ZnVuY3Rpb24oKXsKICAgICAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgICAgIGQuY29uc29sZS5jbWQubG9nLmFwcGx5KHRoaXMsIFsiY29uc29sZS5wcm9maWxlIGlzIG5vdCBzdXBwb3J0ZWQiXSk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBwcm9maWxlRW5kOmZ1bmN0aW9uKCl7CiAgICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgICBkLmNvbnNvbGUuY21kLmxvZy5hcHBseSh0aGlzLCBbImNvbnNvbGUucHJvZmlsZUVuZCBpcyBub3Qgc3VwcG9ydGVkIl0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNzczp7CiAgICAgIGluZGV4Oi0xLAogICAgICBvcGVuOmZ1bmN0aW9uKF9pbmRleCl7CiAgICAgICAgd2l0aCAoZmlyZWJ1ZykgewogICAgICAgICAgdmFyIGl0ZW0gPSBlbnYudGFyZ2V0V2luZG93LmRvY3VtZW50LnN0eWxlU2hlZXRzW19pbmRleF0sCiAgICAgICAgICB1cmkgPSBpdGVtLmhyZWY7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgcnVsZXMgPSBpdGVtW2xpYi5lbnYuaWUgPyAicnVsZXMiIDogImNzc1J1bGVzIl0sIHN0ciA9ICIiOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8cnVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB2YXIgaXRlbSA9IHJ1bGVzW2ldOwogICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IGl0ZW0uc2VsZWN0b3JUZXh0OwogICAgICAgICAgICAgIHZhciBjc3NUZXh0ID0gbGliLmVudi5pZT9pdGVtLnN0eWxlLmNzc1RleHQ6aXRlbS5jc3NUZXh0Lm1hdGNoKC9ceyguKilcfS8pWzFdOwogICAgICAgICAgICAgIHN0cis9ZC5jc3MucHJpbnRSdWxlKHNlbGVjdG9yLCBjc3NUZXh0LnNwbGl0KCI7IiksIGVsLmxlZnQuY3NzLmNvbnRhaW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgICBzdHI9IjxlbT5BY2Nlc3MgdG8gcmVzdHJpY3RlZCBVUkkgZGVuaWVkPC9lbT4iOwogICAgICAgICAgfQogICAgICAgICAgZWwubGVmdC5jc3MuY29udGFpbmVyLnVwZGF0ZShzdHIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcHJpbnRSdWxlOmZ1bmN0aW9uKF9zZWxlY3RvcixfY3NzLF9sYXllcil7CiAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgIHZhciBzdHIgPSAiPGRpdiBjbGFzcz0nU2VsZWN0b3InPiIrX3NlbGVjdG9yKyIgezwvZGl2PiI7CiAgICAgICAgICBmb3IodmFyIGk9MCxsZW49X2Nzcy5sZW5ndGg7IGk8bGVuOyBpKyspewogICAgICAgICAgICB2YXIgaXRlbSA9IF9jc3NbaV07CiAgICAgICAgICAgIHN0ciArPSAiPGRpdiBjbGFzcz0nQ1NTVGV4dCc+IitpdGVtLnJlcGxhY2UoLyguK1w6KSguKykvLCI8c3BhbiBjbGFzcz0nQ1NTUHJvcGVydHknPiQxPC9zcGFuPjxzcGFuIGNsYXNzPSdDU1NWYWx1ZSc+JDI7PC9zcGFuPiIpKyI8L2Rpdj4iOwogICAgICAgICAgfQogICAgICAgICAgc3RyKz0iPGRpdiBjbGFzcz0nU2VsZWN0b3InPn08L2Rpdj4iOwogICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlZnJlc2g6ZnVuY3Rpb24oKXsKICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgZWwuYnV0dG9uLmNzcy5zZWxlY3Rib3gudXBkYXRlKCIiKTsKICAgICAgICAgIHZhciBjb2xsZWN0aW9uID0gZW52LnRhcmdldFdpbmRvdy5kb2N1bWVudC5zdHlsZVNoZWV0czsKICAgICAgICAgIGZvcih2YXIgaT0wLGxlbj1jb2xsZWN0aW9uLmxlbmd0aDsgaTxsZW47IGkrKyl7CiAgICAgICAgICAgIHZhciB1cmkgPSBnZXRGaWxlTmFtZShjb2xsZWN0aW9uW2ldLmhyZWYpOwogICAgICAgICAgICBkLmNzcy5pbmRleD1kLmNzcy5pbmRleDwwP2k6ZC5jc3MuaW5kZXg7CiAgICAgICAgICAgIGVsLmJ1dHRvbi5jc3Muc2VsZWN0Ym94LmNoaWxkLmFkZCgKICAgICAgICAgICAgICAgIG5ldyBsaWIuZWxlbWVudCgiT1BUSU9OIikuYXR0cmlidXRlLnNldCgidmFsdWUiLGkpLnVwZGF0ZSh1cmkpCiAgICAgICAgICAgICkKICAgICAgICAgIH07CiAgICAgICAgICBkLmNzcy5vcGVuKGQuY3NzLmluZGV4KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBkb206IHsKICAgICAgb3BlbjogZnVuY3Rpb24oX29iamVjdCxfbGF5ZXIpewogICAgICAgIHdpdGggKGZpcmVidWcpIHsKICAgICAgICAgIF9sYXllci5jbGVhbigpOwogICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJET01Db250ZW50IikuaW5zZXJ0KF9sYXllcik7CiAgICAgICAgICBkLmRvbS5wcmludChfb2JqZWN0LCBjb250YWluZXIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcHJpbnQ6ZnVuY3Rpb24oX29iamVjdCxfcGFyZW50LCBfaW5UcmVlKXsKICAgICAgICB3aXRoIChmaXJlYnVnKSB7CiAgICAgICAgICB2YXIgb2JqID0gX29iamVjdCB8fCB3aW5kb3csIHBhcmVudEVsZW1lbnQgPSBfcGFyZW50OwogICAgICAgICAgcGFyZW50RWxlbWVudC51cGRhdGUoIiIpOwoKICAgICAgICAgIGlmKHBhcmVudEVsZW1lbnQub3BlbmVkJiZwYXJlbnRFbGVtZW50IT1lbC5sZWZ0LmRvbS5jb250YWluZXIpewogICAgICAgICAgICBwYXJlbnRFbGVtZW50LmVudmlyb25tZW50LmdldFBhcmVudCgpLmxpYi5jaGlsZC5nZXQoKVswXS5saWIuY2hpbGQuZ2V0KClbMF0ubGliLmF0dHJpYnV0ZS5yZW1vdmVDbGFzcygiT3BlbmVkIik7CiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQub3BlbmVkID0gZmFsc2U7CiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6Im5vbmUiIH0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZihfaW5UcmVlKQogICAgICAgICAgICBwYXJlbnRFbGVtZW50LmVudmlyb25tZW50LmdldFBhcmVudCgpLmxpYi5jaGlsZC5nZXQoKVswXS5saWIuY2hpbGQuZ2V0KClbMF0ubGliLmF0dHJpYnV0ZS5hZGRDbGFzcygiT3BlbmVkIik7CiAgICAgICAgICBwYXJlbnRFbGVtZW50Lm9wZW5lZCA9IHRydWU7CgogICAgICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGlmIChlbnYuaGlkZURPTUZ1bmN0aW9ucyAmJiB0eXBlb2Yob2JqW2tleV0pID09ICJmdW5jdGlvbiIpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9ialtrZXldLCBwcm9wZXJ0eSA9IGtleSwgY29udGFpbmVyID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkRPTVJvdyIpLmluc2VydChwYXJlbnRFbGVtZW50KSwKICAgICAgICAgICAgICBsZWZ0ID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkRPTVJvd0xlZnQiKS5pbnNlcnQoY29udGFpbmVyKSwgcmlnaHQgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiRE9NUm93UmlnaHQiKS5pbnNlcnQoY29udGFpbmVyKTsKCiAgICAgICAgICAgICAgY29udGFpbmVyLmNoaWxkLmFkZCgKICAgICAgICAgICAgICAgICAgbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoJ0NsZWFyJykKICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICB2YXIgbGluayA9IG5ldyBsaWIuZWxlbWVudCgiQSIpLmF0dHJpYnV0ZS5hZGRDbGFzcygKICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlPT0ib2JqZWN0IiYmQm9vbGVhbih2YWx1ZSk/IlByb3BlcnR5IE9iamVjdCI6IlByb3BlcnR5IgogICAgICAgICAgICAgICkudXBkYXRlKHByb3BlcnR5KS5pbnNlcnQobGVmdCk7CgogICAgICAgICAgICAgIHJpZ2h0LnVwZGF0ZShkLmhpZ2hsaWdodCh2YWx1ZSxmYWxzZSx0cnVlKSk7CgogICAgICAgICAgICAgIHZhciBzdWJDb250YWluZXIgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiRE9NUm93U3ViQ29udGFpbmVyIikuaW5zZXJ0KGNvbnRhaW5lcik7CgogICAgICAgICAgICAgIGlmKHR5cGVvZiB2YWx1ZSE9Im9iamVjdCJ8fEJvb2xlYW4odmFsdWUpPT1mYWxzZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICBsaW5rLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsbGliLnV0aWwuQ3VycnkoZC5kb20ucHJpbnQsd2luZG93LHZhbHVlLCBzdWJDb250YWluZXIsIHRydWUpKTsKICAgICAgICAgICAgfWNhdGNoKGUpewogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBwYXJlbnRFbGVtZW50LmVudmlyb25tZW50LmFkZFN0eWxlKHsgImRpc3BsYXkiOiJibG9jayIgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgaGlnaGxpZ2h0OmZ1bmN0aW9uKF92YWx1ZSxfaW5PYmplY3QsX2luQXJyYXksX2xpbmspewogICAgICB3aXRoKGZpcmVidWcpewogICAgICAgIHZhciBpc0FycmF5ID0gZmFsc2UsIGlzSGFzaCwgaXNFbGVtZW50ID0gZmFsc2UsIHZ0eXBlPXR5cGVvZiBfdmFsdWUsIHJlc3VsdD1bXTsKICAgICAgICAKICAgICAgICBpZih2dHlwZT09Im9iamVjdCIpewogICAgICAgICAgaWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKF92YWx1ZSkgPT09ICJbb2JqZWN0IERhdGVdIil7CiAgICAgICAgICAgIHZ0eXBlID0gImRhdGUiOwogICAgICAgICAgfSBlbHNlIGlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChfdmFsdWUpID09PSAiW29iamVjdCBTdHJpbmddIil7CiAgICAgICAgICAgIHZ0eXBlID0gInN0cmluZyI7CiAgICAgICAgICB9IGVsc2UgaWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKF92YWx1ZSkgPT09ICJbb2JqZWN0IEJvb2xlYW5dIil7CiAgICAgICAgICAgIHZ0eXBlID0gImJvb2xlYW4iOwogICAgICAgICAgfSBlbHNlIGlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChfdmFsdWUpID09PSAiW29iamVjdCBSZWdFeHBdIil7CiAgICAgICAgICAgIHZ0eXBlID0gInJlZ2V4cCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRyeSB7CiAgICAgICAgICBpc0FycmF5ID0gbGliLnV0aWwuSXNBcnJheShfdmFsdWUpOwogICAgICAgICAgaXNIYXNoID0gbGliLnV0aWwuSXNIYXNoKF92YWx1ZSk7CiAgICAgICAgICBpc0VsZW1lbnQgPSBfdmFsdWUhPXVuZGVmaW5lZCYmQm9vbGVhbihfdmFsdWUubm9kZU5hbWUpJiZCb29sZWFuKF92YWx1ZS5ub2RlVHlwZSk7CgogICAgICAgICAgLy8gbnVtYmVyLCBzdHJpbmcsIGJvb2xlYW4sIG51bGwsIGZ1bmN0aW9uCiAgICAgICAgICBpZihfdmFsdWU9PW51bGx8fHZ0eXBlPT0ibnVtYmVyInx8dnR5cGU9PSJzdHJpbmcifHx2dHlwZT09ImJvb2xlYW4ifHx2dHlwZT09ImZ1bmN0aW9uInx8dnR5cGU9PSJyZWdleHAifHx2dHlwZT09ImRhdGUiKXsKICAgICAgICAgICAgaWYoX3ZhbHVlPT1udWxsKXsKICAgICAgICAgICAgICByZXN1bHQucHVzaCgiPHNwYW4gY2xhc3M9J051bGwnPm51bGw8L3NwYW4+Iik7CiAgICAgICAgICAgIH1lbHNlIGlmICh2dHlwZT09InJlZ2V4cCIpIHsKICAgICAgICAgICAgICByZXN1bHQucHVzaCgiPHNwYW4gY2xhc3M9J01hcm9vbic+IiArIF92YWx1ZSArICI8L3NwYW4+Iik7CiAgICAgICAgICAgIH1lbHNlIGlmICh2dHlwZT09ImRhdGUiKSB7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goIjxzcGFuIGNsYXNzPSdEYXJrQmx1ZSc+JyIgKyBfdmFsdWUgKyAiJzwvc3Bhbj4iKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2dHlwZT09ImJvb2xlYW4ifHx2dHlwZT09Im51bWJlciIpIHsKICAgICAgICAgICAgICByZXN1bHQucHVzaCgiPHNwYW4gY2xhc3M9J0RhcmtCbHVlJz4iICsgX3ZhbHVlICsgIjwvc3Bhbj4iKTsKICAgICAgICAgICAgfSBlbHNlIGlmKHZ0eXBlPT0iZnVuY3Rpb24iKXsKICAgICAgICAgICAgICByZXN1bHQucHVzaCgiPHNwYW4gY2xhc3M9JyIrKF9pbk9iamVjdD8iSXRhbGljIEdyYXkiOiJHcmVlbiIpKyInPmZ1bmN0aW9uKCk8L3NwYW4+Iik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goIjxzcGFuIGNsYXNzPSdSZWQnPlwiIisoICFfaW5PYmplY3QmJiFfaW5BcnJheT9fdmFsdWUgOiBfdmFsdWUuc3Vic3RyaW5nKDAsMzUpKyhfdmFsdWUubGVuZ3RoPjM1PyIgLi4uIjoiIikgKS5yZXBsYWNlKC9cbi9nLCJcXG4iKS5yZXBsYWNlKC9ccy9nLCImbmJzcDsiKS5yZXBsYWNlKC8+L2csIiYjNjI7IikucmVwbGFjZSgvPC9nLCImIzYwOyIpKyJcIjwvc3Bhbj4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLy8gZWxlbWVudAogICAgICAgICAgZWxzZSBpZihpc0VsZW1lbnQpewoKICAgICAgICAgICAgaWYoX3ZhbHVlLm5vZGVUeXBlPT0zKQogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGQuaGlnaGxpZ2h0KF92YWx1ZS5ub2RlVmFsdWUpKTsKICAgICAgICAgICAgZWxzZSBpZihfaW5PYmplY3QpewogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCI8c3BhbiBjbGFzcz0nR3JheSBJdGFsaWMnPiIrX3ZhbHVlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkrIjwvc3Bhbj4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXN1bHQucHVzaCgiPHNwYW4gY2xhc3M9J0JsdWUiKyAoICFfbGluaz8iJyI6IiBPYmplY3RMaW5rJyBvbm1vdXNlb3Zlcj0ndGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWUucmVwbGFjZShcIk9iamVjdExpbmtcIixcIk9iamVjdExpbmtIb3ZlclwiKScgb25tb3VzZW91dD0ndGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWUucmVwbGFjZShcIk9iamVjdExpbmtIb3ZlclwiLFwiT2JqZWN0TGlua1wiKScgb25jbGljaz0nZmlyZWJ1Zy5kLmh0bWwuaW5zcGVjdChmaXJlYnVnLmQuY29uc29sZS5jYWNoZVsiICsoIGQuY29uc29sZS5jYWNoZS5wdXNoKCBfdmFsdWUgKSAtMSApKyJdKSciICkgKyAiJz4iKTsKCiAgICAgICAgICAgICAgaWYoX2luQXJyYXkpewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goX3ZhbHVlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpOwogICAgICAgICAgICAgICAgaWYoX3ZhbHVlLmdldEF0dHJpYnV0ZSl7CiAgICAgICAgICAgICAgICAgIGlmKF92YWx1ZS5nZXRBdHRyaWJ1dGUmJl92YWx1ZS5nZXRBdHRyaWJ1dGUoImlkIikpCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goIjxzcGFuIGNsYXNzPSdEYXJrQmx1ZSc+IyIrX3ZhbHVlLmdldEF0dHJpYnV0ZSgiaWQiKSsiPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICB2YXIgZWxDbGFzcyA9IF92YWx1ZS5nZXRBdHRyaWJ1dGUobGliLmVudi5pZSYmIWxpYi5lbnYuaWU4PyJjbGFzc05hbWUiOiJjbGFzcyIpfHwiIjsKICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goIWVsQ2xhc3M/IiI6IjxzcGFuIGNsYXNzPSdSZWQnPi4iK2VsQ2xhc3Muc3BsaXQoIiAiKVswXSsiPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goIjwvc3Bhbj4iKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goIjxzcGFuIGNsYXNzPSdEYXJrQmx1ZSc+JiM2MDs8c3BhbiBjbGFzcz0nQmx1ZSBUYWdOYW1lJz4iKyBfdmFsdWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7CgogICAgICAgICAgICAgICAgaWYoX3ZhbHVlLmF0dHJpYnV0ZXMpewogICAgICAgICAgICAgICAgICBmb3IodmFyIGk9MCxsZW49X3ZhbHVlLmF0dHJpYnV0ZXMubGVuZ3RoOyBpPGxlbjsgaSsrKXsKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IF92YWx1ZS5hdHRyaWJ1dGVzW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZighbGliLmVudi5pZXx8aXRlbS5ub2RlVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgiIDxzcGFuIGNsYXNzPSdEYXJrQmx1ZSc+IitpdGVtLm5vZGVOYW1lKyI9XCI8c3BhbiBjbGFzcz0nUmVkJz4iK2l0ZW0ubm9kZVZhbHVlKyI8L3NwYW4+XCI8L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgiPC9zcGFuPiYjNjI7PC9zcGFuPiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSAKICAgICAgICAgIC8vIGFycmF5LCBoYXNoCiAgICAgICAgICBlbHNlIGlmKGlzQXJyYXl8fGlzSGFzaCl7CiAgICAgICAgICAgIGlmKGlzQXJyYXkpewogICAgICAgICAgICAgIGlmKF9pbk9iamVjdCl7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgiPHNwYW4gY2xhc3M9J0dyYXkgSXRhbGljJz5bIitfdmFsdWUubGVuZ3RoKyJdPC9zcGFuPiIpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgiPHNwYW4gY2xhc3M9J1N0cm9uZyc+WyAiKTsKCiAgICAgICAgICAgICAgICBmb3IodmFyIGk9MCxsZW49X3ZhbHVlLmxlbmd0aDsgaTxsZW47IGkrKyl7CiAgICAgICAgICAgICAgICAgIGlmKChfaW5PYmplY3R8fF9pbkFycmF5KSYmaT4zKXsKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgiLCA8c3BhbiBjbGFzcz0nU3Ryb25nIEdyYXknPiIrKGxlbi00KSsiIE1vcmUuLi48L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goIChpID4gMCA/ICIsICIgOiAiIikgKyBkLmhpZ2hsaWdodChfdmFsdWVbaV0sIGZhbHNlLCB0cnVlLCB0cnVlKSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCIgXTwvc3Bhbj4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZihfaW5PYmplY3QpewogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCI8c3BhbiBjbGFzcz0nR3JheSBJdGFsaWMnPk9iamVjdDwvc3Bhbj4iKTsKICAgICAgICAgICAgfSBlbHNlIHsgIAogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCI8c3BhbiBjbGFzcz0nU3Ryb25nIEdyZWVuIisgKCAhX2xpbms/IiciOiIgT2JqZWN0TGluaycgb25tb3VzZW92ZXI9J3RoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoXCJPYmplY3RMaW5rXCIsXCJPYmplY3RMaW5rSG92ZXJcIiknIG9ubW91c2VvdXQ9J3RoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoXCJPYmplY3RMaW5rSG92ZXJcIixcIk9iamVjdExpbmtcIiknIG9uY2xpY2s9J2ZpcmVidWcuZC5jb25zb2xlLm9wZW5PYmplY3QoIiArKCBkLmNvbnNvbGUuY2FjaGUucHVzaCggX3ZhbHVlICkgLTEgKSsiKSciICkgKyAiPk9iamVjdCIpOwogICAgICAgICAgICAgIHZhciBpPTA7CiAgICAgICAgICAgICAgZm9yKHZhciBrZXkgaW4gX3ZhbHVlKXsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF92YWx1ZVtrZXldOwogICAgICAgICAgICAgICAgaWYoKF9pbk9iamVjdHx8X2luQXJyYXkpJiZpPjMpewogICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgiIDxzcGFuIGNsYXNzPSdTdHJvbmcgR3JheSc+TW9yZS4uLjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgiICIra2V5KyI9IitkLmhpZ2hsaWdodCh2YWx1ZSx0cnVlKSk7CiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCI8L3NwYW4+Iik7CiAgICAgICAgICAgIH0gCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHQucHVzaChbIjxzcGFuIGNsYXNzJ0dyYXkgSXRhbGljJz4iK192YWx1ZSsiPC9zcGFuPiJdKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoKGUpewogICAgICAgICAgcmVzdWx0LnB1c2goIi4uIik7IAogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oIiIpOwogICAgICB9CiAgICB9LAogICAgaHRtbDp7CiAgICAgIG5JbmRleDoiY29tcHV0ZWRTdHlsZSIsCiAgICAgIGN1cnJlbnQ6bnVsbCwKICAgICAgaGlnaGxpZ2h0OmZ1bmN0aW9uKF9lbGVtZW50LF9jbGVhcixfZXZlbnQpewogICAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgICBpZihfZWxlbWVudC5maXJlYnVnRWxlbWVudCl7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmKF9jbGVhcil7CiAgICAgICAgICAgIGVudi50YXJnZXRXaW5kb3cuZmlyZWJ1Zy5lbC5iZ0luc3BlY3Rvci5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ICJkaXNwbGF5Ijoibm9uZSIgfSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGQuaW5zcGVjdG9yLmluc3BlY3QoX2VsZW1lbnQsdHJ1ZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBpbnNwZWN0OmZ1bmN0aW9uKF9lbGVtZW50KXsKICAgICAgICB2YXIgbWFwID0gW10sCiAgICAgICAgcGFyZW50TGF5ZXIsCiAgICAgICAgdCwKICAgICAgICB0YWdOYW1lLAogICAgICAgIHBhcmVudCA9IF9lbGVtZW50OwogICAgICAgIHdoaWxlIChwYXJlbnQpIHsKICAgICAgICAgIG1hcC5wdXNoKHBhcmVudCk7CiAgICAgICAgICBpZiAocGFyZW50ID09IGZpcmVidWcuZW52LnRhcmdldFdpbmRvdy5kb2N1bWVudC5ib2R5KSBicmVhazsKICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOwogICAgICAgIH0KICAgICAgICBtYXAgPSBtYXAucmV2ZXJzZSgpOwogICAgICAgIHdpdGgoZmlyZWJ1ZykgewogICAgICAgICAgaWYgKGVudi5kSW5kZXggIT0gImh0bWwiKSB7CiAgICAgICAgICAgIGVudi50YXJnZXRXaW5kb3cuZmlyZWJ1Zy5kLm5hdmlnYXRlKCJodG1sIik7CiAgICAgICAgICB9CgogICAgICAgICAgZW52LnRhcmdldFdpbmRvdy5maXJlYnVnLmQuaW5zcGVjdG9yLnRvZ2dsZShmYWxzZSk7CgogICAgICAgICAgZm9yICh0ID0gMDsgdCA8IGVsLmxlZnQuaHRtbC5jb250YWluZXIuY2hpbGQuZ2V0KCkubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgaWYgKGVsLmxlZnQuaHRtbC5jb250YWluZXIuY2hpbGQuZ2V0KClbdF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXSkgewogICAgICAgICAgICAgIGlmIChlbC5sZWZ0Lmh0bWwuY29udGFpbmVyLmNoaWxkLmdldCgpW3RdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uaW5uZXJUZXh0KSB7CiAgICAgICAgICAgICAgICB0YWdOYW1lID0gZWwubGVmdC5odG1sLmNvbnRhaW5lci5jaGlsZC5nZXQoKVt0XS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmlubmVyVGV4dDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGFnTmFtZSA9IGVsLmxlZnQuaHRtbC5jb250YWluZXIuY2hpbGQuZ2V0KClbdF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS50ZXh0Q29udGVudDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmICgvPGJvZHkvaS50ZXN0KHRhZ05hbWUpKSB7CiAgICAgICAgICAgICAgICBwYXJlbnRMYXllciA9IGVsLmxlZnQuaHRtbC5jb250YWluZXIuY2hpbGQuZ2V0KClbdF0uY2hpbGROb2Rlc1sxXS5saWI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIXBhcmVudExheWVyKSB7CiAgICAgICAgICAgIHBhcmVudExheWVyID0gZWwubGVmdC5odG1sLmNvbnRhaW5lci5jaGlsZC5nZXQoKVszXS5jaGlsZE5vZGVzWzFdLmxpYjsKICAgICAgICAgIH0KCiAgICAgICAgICBmb3IgKHQgPSAwLCBsZW4gPSBtYXAubGVuZ3RoOyBtYXBbdF07IHQrKykgewogICAgICAgICAgICBpZiAodCA9PSBsZW4gLSAxKSB7CiAgICAgICAgICAgICAgdmFyIGxpbmsgPSBwYXJlbnRMYXllci5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCkucHJldmlvdXNTaWJsaW5nLmxpYjsKICAgICAgICAgICAgICBsaW5rLmF0dHJpYnV0ZS5hZGRDbGFzcygiU2VsZWN0ZWQiKTsKCiAgICAgICAgICAgICAgaWYgKGQuaHRtbC5jdXJyZW50KSB7CiAgICAgICAgICAgICAgICBkLmh0bWwuY3VycmVudFsxXS5hdHRyaWJ1dGUucmVtb3ZlQ2xhc3MoIlNlbGVjdGVkIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGQuaHRtbC5jdXJyZW50ID0gW19lbGVtZW50LCBsaW5rXTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFyZW50TGF5ZXIgPSBkLmh0bWwub3Blbkh0bWxUcmVlKG1hcFt0XSwgcGFyZW50TGF5ZXIsIG1hcFt0ICsgMV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgbmF2aWdhdGU6ZnVuY3Rpb24oX2luZGV4LF9lbGVtZW50KXsKICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgZWwucmlnaHQuaHRtbC5uYXZbZC5odG1sLm5JbmRleF0uYXR0cmlidXRlLnJlbW92ZUNsYXNzKCJTZWxlY3RlZCIpOwogICAgICAgICAgZWwucmlnaHQuaHRtbC5uYXZbX2luZGV4XS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlNlbGVjdGVkIik7CiAgICAgICAgICBkLmh0bWwubkluZGV4ID0gX2luZGV4OwogICAgICAgICAgZC5odG1sLm9wZW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICB9LAogICAgICBvcGVuSHRtbFRyZWU6ZnVuY3Rpb24oX2VsZW1lbnQsX3BhcmVudCxfcmV0dXJuUGFyZW50RWxlbWVudEJ5RWxlbWVudCxfZXZlbnQpewogICAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgICB2YXIgZWxlbWVudCA9IF9lbGVtZW50IHx8IGVudi50YXJnZXRXaW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAKICAgICAgICAgICAgICBwYXJlbnQgPSBfcGFyZW50IHx8IGVsLmxlZnQuaHRtbC5jb250YWluZXIsIAogICAgICAgICAgICAgIHJldHVyblBhcmVudEVsID0gX3JldHVyblBhcmVudEVsZW1lbnRCeUVsZW1lbnQgfHwgbnVsbCwgCiAgICAgICAgICAgICAgcmV0dXJuUGFyZW50VmFsID0gbnVsbCwKICAgICAgICAgICAgICBsZW4gPSBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoLAogICAgICAgICAgICAgIG5vZGVMaW5rOwoKICAgICAgICAgIGlmKHBhcmVudCE9ZWwubGVmdC5odG1sLmNvbnRhaW5lcil7CiAgICAgICAgICAgIG5vZGVMaW5rID0gcGFyZW50LmVudmlyb25tZW50LmdldFBhcmVudCgpLmxpYi5jaGlsZC5nZXQoKVswXS5saWI7CiAgICAgICAgICAgIGlmIChkLmh0bWwuY3VycmVudCkgewogICAgICAgICAgICAgIGQuaHRtbC5jdXJyZW50WzFdLmF0dHJpYnV0ZS5yZW1vdmVDbGFzcygiU2VsZWN0ZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBub2RlTGluay5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlNlbGVjdGVkIik7CgogICAgICAgICAgICBkLmh0bWwuY3VycmVudCA9IFtfZWxlbWVudCxub2RlTGlua107CiAgICAgICAgICAgIGQuaHRtbC5vcGVuUHJvcGVydGllcygpOwogICAgICAgICAgfTsKCiAgICAgICAgICBpZihlbGVtZW50LmNoaWxkTm9kZXMmJihsZW49PTB8fChsZW49PTEmJmVsZW1lbnQuY2hpbGROb2Rlc1swXS5ub2RlVHlwZT09MykpKXJldHVybjsKICAgICAgICAgIHBhcmVudC5jbGVhbigpOwoKICAgICAgICAgIGlmKHBhcmVudC5vcGVuZWQmJkJvb2xlYW4oX3JldHVyblBhcmVudEVsZW1lbnRCeUVsZW1lbnQpPT1mYWxzZSl7CiAgICAgICAgICAgIHBhcmVudC5vcGVuZWQgPSBmYWxzZTsKICAgICAgICAgICAgcGFyZW50LmVsZW1lbnQucHJldmlvdXNTaWJsaW5nLmxpYi5hdHRyaWJ1dGUucmVtb3ZlQ2xhc3MoIk9wZW4iKTsKICAgICAgICAgICAgcGFyZW50LmVsZW1lbnQubGliLmF0dHJpYnV0ZS5yZW1vdmVDbGFzcygiT3BlblN1YkNvbnRhaW5lciIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9OwoKICAgICAgICAgIGlmIChwYXJlbnQgIT0gZWwubGVmdC5odG1sLmNvbnRhaW5lcikgewogICAgICAgICAgICBwYXJlbnQuZWxlbWVudC5wcmV2aW91c1NpYmxpbmcubGliLmF0dHJpYnV0ZS5hZGRDbGFzcygiT3BlbiIpOwogICAgICAgICAgICBwYXJlbnQuZWxlbWVudC5saWIuYXR0cmlidXRlLmFkZENsYXNzKCJPcGVuU3ViQ29udGFpbmVyIik7CiAgICAgICAgICAgIHBhcmVudC5vcGVuZWQgPSB0cnVlOwogICAgICAgICAgfTsKCiAgICAgICAgICBpZihlbGVtZW50PT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpewogICAgICAgICAgICBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJsb2NrIikudXBkYXRlKCI8c3BhbiBjbGFzcz0nRGFya0JsdWUnPiYjNjA7PHNwYW4gY2xhc3M9J0JsdWUnPmh0bWw8L3NwYW4+JiM2MjsiKS5pbnNlcnQocGFyZW50KTsKICAgICAgICAgIH07CgogICAgICAgICAgZm9yKHZhciBpPTA7IGk8PWxlbjsgaSsrKXsKICAgICAgICAgICAgaWYoaT09bGVuKXsKICAgICAgICAgICAgICBuZXcgbGliLmVsZW1lbnQoIkEiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJsb2NrIikudXBkYXRlKCI8c3BhbiBjbGFzcz0nRGFya0JsdWUnPiYjNjA7LzxzcGFuIGNsYXNzPSdCbHVlJz4iK2VsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSsiPC9zcGFuPiYjNjI7IikuaW5zZXJ0KGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIHZhciBpdGVtID0gZWxlbWVudC5jaGlsZE5vZGVzW2ldOwoKICAgICAgICAgICAgaWYgKGl0ZW0ubm9kZVR5cGUgIT0gMyl7CiAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBsaWIuZWxlbWVudCgpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQmxvY2siKS5pbnNlcnQocGFyZW50KSwgCiAgICAgICAgICAgICAgbGluayA9IG5ldyBsaWIuZWxlbWVudCgiQSIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiTGluayIpLmluc2VydChjb250YWluZXIpLCAKICAgICAgICAgICAgICBzcGFjZXIgPSBuZXcgbGliLmVsZW1lbnQoIlNQQU4iKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlNwYWNlciIpLnVwZGF0ZSgiJm5ic3A7IikuaW5zZXJ0KGxpbmspLAogICAgICAgICAgICAgIGh0bWwgPSBuZXcgbGliLmVsZW1lbnQoIlNQQU4iKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkNvbnRlbnQiKS51cGRhdGUoZC5oaWdobGlnaHQoaXRlbSkpLmluc2VydChsaW5rKSwKICAgICAgICAgICAgICBzdWJDb250YWluZXIgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiU3ViQ29udGFpbmVyIikuaW5zZXJ0KGNvbnRhaW5lciksCiAgICAgICAgICAgICAgdmlldyA9IGxpYi51dGlsLkVsZW1lbnQuZ2V0VmlldyhpdGVtKTsKCiAgICAgICAgICAgICAgbGluay5ldmVudC5hZGRMaXN0ZW5lcigiY2xpY2siLCBsaWIudXRpbC5DdXJyeShkLmh0bWwub3Blbkh0bWxUcmVlLCB3aW5kb3csIGl0ZW0sIHN1YkNvbnRhaW5lciwgZmFsc2UpKTsKICAgICAgICAgICAgICBsaW5rLmV2ZW50LmFkZExpc3RlbmVyKCJtb3VzZW92ZXIiLCBsaWIudXRpbC5DdXJyeShkLmh0bWwuaGlnaGxpZ2h0LCB3aW5kb3csIGl0ZW0sIGZhbHNlKSk7CiAgICAgICAgICAgICAgbGluay5ldmVudC5hZGRMaXN0ZW5lcigibW91c2VvdXQiLCBsaWIudXRpbC5DdXJyeShkLmh0bWwuaGlnaGxpZ2h0LCB3aW5kb3csIGl0ZW0sIHRydWUpKTsKCiAgICAgICAgICAgICAgcmV0dXJuUGFyZW50VmFsID0gcmV0dXJuUGFyZW50RWwgPT0gaXRlbSA/IHN1YkNvbnRhaW5lciA6IHJldHVyblBhcmVudFZhbDsKCiAgICAgICAgICAgICAgaWYoZC5odG1sLmN1cnJlbnQ9PW51bGwmJml0ZW09PWRvY3VtZW50LmJvZHkpewogICAgICAgICAgICAgICAgbGluay5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlNlbGVjdGVkIik7CiAgICAgICAgICAgICAgICBkLmh0bWwuY3VycmVudCA9IFtpdGVtLGxpbmtdOwogICAgICAgICAgICAgICAgZC5odG1sLm9wZW5IdG1sVHJlZShpdGVtLHN1YkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZihlbGVtZW50Lm5vZGVOYW1lIT0iSEVBRCImJmVsZW1lbnQhPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmKHZpZXcudmlzaWJpbGl0eT09ImhpZGRlbiJ8fHZpZXcuZGlzcGxheT09Im5vbmUiKSl7CiAgICAgICAgICAgICAgICBjb250YWluZXIuYXR0cmlidXRlLmFkZENsYXNzKCJVbnZpc2libGUiKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBpZiAoaXRlbS5jaGlsZE5vZGVzKXsKICAgICAgICAgICAgICAgIHZhciBjaGlsZExlbiA9IGl0ZW0uY2hpbGROb2Rlcy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoY2hpbGRMZW4gPT0gMSAmJiBpdGVtLmNoaWxkTm9kZXNbMF0ubm9kZVR5cGUgPT0gMykgewogICAgICAgICAgICAgICAgICBodG1sLmNoaWxkLmFkZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShpdGVtLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlLnN1YnN0cmluZygwLCA1MCkpKTsKICAgICAgICAgICAgICAgICAgaHRtbC5jaGlsZC5hZGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwvIikpOwogICAgICAgICAgICAgICAgICBodG1sLmNoaWxkLmFkZChuZXcgbGliLmVsZW1lbnQoInNwYW4iKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJsdWUiKS51cGRhdGUoaXRlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCkpOwogICAgICAgICAgICAgICAgICBodG1sLmNoaWxkLmFkZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPiIpKTsKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRMZW4gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbGluay5hdHRyaWJ1dGUuYWRkQ2xhc3MoIlBhcmVudCIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIHJldHVyblBhcmVudFZhbDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG9wZW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uKCl7CiAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgIHZhciBpbmRleCA9IGQuaHRtbC5uSW5kZXg7CiAgICAgICAgICB2YXIgbm9kZSA9IGQuaHRtbC5jdXJyZW50WzBdOwogICAgICAgICAgZC5jbGVhbihlbC5yaWdodC5odG1sLmNvbnRlbnQpOwogICAgICAgICAgdmFyIHN0ciA9ICIiOwogICAgICAgICAgc3dpdGNoKGluZGV4KXsKICAgICAgICAgICAgY2FzZSAiY29tcHV0ZWRTdHlsZSI6CiAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gWyJvcGFjaXR5IiwiZmlsdGVyIiwiYXppbXV0aCIsImJhY2tncm91bmQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRDb2xvciIsImJhY2tncm91bmRJbWFnZSIsImJhY2tncm91bmRQb3NpdGlvbiIsImJhY2tncm91bmRSZXBlYXQiLCJib3JkZXIiLCJib3JkZXJDb2xsYXBzZSIsImJvcmRlckNvbG9yIiwiYm9yZGVyU3BhY2luZyIsImJvcmRlclN0eWxlIiwiYm9yZGVyVG9wIiwiYm9yZGVyUmlnaHQiLCJib3JkZXJCb3R0b20iLCJib3JkZXJMZWZ0IiwiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiLCJib3JkZXJUb3BTdHlsZSIsImJvcmRlclJpZ2h0U3R5bGUiLCJib3JkZXJCb3R0b21TdHlsZSIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyV2lkdGgiLCJib3R0b20iLCJjYXB0aW9uU2lkZSIsImNsZWFyIiwiY2xpcCIsImNvbG9yIiwiY29udGVudCIsImNvdW50ZXJJbmNyZW1lbnQiLCJjb3VudGVyUmVzZXQiLCJjdWUiLCJjdWVBZnRlciIsImN1ZUJlZm9yZSIsImN1cnNvciIsImRpcmVjdGlvbiIsImRpc3BsYXkiLCJlbGV2YXRpb24iLCJlbXB0eUNlbGxzIiwiY3NzRmxvYXQiLCJmb250IiwiZm9udEZhbWlseSIsImZvbnRTaXplIiwiZm9udFNpemVBZGp1c3QiLCJmb250U3RyZXRjaCIsImZvbnRTdHlsZSIsImZvbnRWYXJpYW50IiwiZm9udFdlaWdodCIsImhlaWdodCIsImxlZnQiLCJsZXR0ZXJTcGFjaW5nIiwibGluZUhlaWdodCIsImxpc3RTdHlsZSIsImxpc3RTdHlsZUltYWdlIiwibGlzdFN0eWxlUG9zaXRpb24iLCJsaXN0U3R5bGVUeXBlIiwibWFyZ2luIiwibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0IiwibWFya2VyT2Zmc2V0IiwibWFya3MiLCJtYXhIZWlnaHQiLCJtYXhXaWR0aCIsIm1pbkhlaWdodCIsIm1pbldpZHRoIiwib3JwaGFucyIsIm91dGxpbmUiLCJvdXRsaW5lQ29sb3IiLCJvdXRsaW5lU3R5bGUiLCJvdXRsaW5lV2lkdGgiLCJvdmVyZmxvdyIsInBhZGRpbmciLCJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0IiwicGFnZSIsInBhZ2VCcmVha0FmdGVyIiwicGFnZUJyZWFrQmVmb3JlIiwicGFnZUJyZWFrSW5zaWRlIiwicGF1c2UiLCJwYXVzZUFmdGVyIiwicGF1c2VCZWZvcmUiLCJwaXRjaCIsInBpdGNoUmFuZ2UiLCJwbGF5RHVyaW5nIiwicG9zaXRpb24iLCJxdW90ZXMiLCJyaWNobmVzcyIsInJpZ2h0Iiwic2l6ZSIsInNwZWFrIiwic3BlYWtIZWFkZXIiLCJzcGVha051bWVyYWwiLCJzcGVha1B1bmN0dWF0aW9uIiwic3BlZWNoUmF0ZSIsInN0cmVzcyIsInRhYmxlTGF5b3V0IiwidGV4dEFsaWduIiwidGV4dERlY29yYXRpb24iLCJ0ZXh0SW5kZW50IiwidGV4dFNoYWRvdyIsInRleHRUcmFuc2Zvcm0iLCJ0b3AiLCJ1bmljb2RlQmlkaSIsInZlcnRpY2FsQWxpZ24iLCJ2aXNpYmlsaXR5Iiwidm9pY2VGYW1pbHkiLCJ2b2x1bWUiLCJ3aGl0ZVNwYWNlIiwid2lkb3dzIiwid2lkdGgiLCJ3b3JkU3BhY2luZyIsInpJbmRleCJdLnNvcnQoKTsKICAgICAgICAgICAgICB2YXIgdmlldyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3P2RvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSxudWxsKTpub2RlLmN1cnJlbnRTdHlsZTsKICAgICAgICAgICAgICBmb3IodmFyIGk9MCxsZW49cHJvcGVydHkubGVuZ3RoOyBpPGxlbjsgaSsrKXsKICAgICAgICAgICAgICAgIHZhciBpdGVtID0gcHJvcGVydHlbaV07CiAgICAgICAgICAgICAgICBpZighdmlld1tpdGVtXSljb250aW51ZTsKICAgICAgICAgICAgICAgIHN0cis9IjxkaXYgY2xhc3M9J0NTU0l0ZW0nPjxkaXYgY2xhc3M9J0NTU1Byb3BlcnR5Jz4iK2l0ZW0rIjwvZGl2PjxkaXYgY2xhc3M9J0NTU1ZhbHVlJz4iK2QuaGlnaGxpZ2h0KHZpZXdbaXRlbV0pKyI8L2Rpdj48L2Rpdj4iOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbC5yaWdodC5odG1sLmNvbnRlbnQudXBkYXRlKHN0cik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRvbSI6CiAgICAgICAgICAgICAgZC5kb20ub3Blbihub2RlLGVsLnJpZ2h0Lmh0bWwuY29udGVudCxsaWIuZW52LmllKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBpbnNwZWN0b3I6ewogICAgICBlbmFibGVkOmZhbHNlLAogICAgICBlbDpudWxsLAogICAgICBpbnNwZWN0OmZ1bmN0aW9uKF9lbGVtZW50LF9iZ0luc3BlY3Rvcil7CiAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgIHZhciBwb3MgPSBlbnYudGFyZ2V0V2luZG93LmZpcmVidWcubGliLnV0aWwuRWxlbWVudC5nZXRQb3NpdGlvbihfZWxlbWVudCk7CgogICAgICAgICAgZW52LnRhcmdldFdpbmRvdy5maXJlYnVnLmVsW19iZ0luc3BlY3RvciYmImJnSW5zcGVjdG9yInx8ImJvcmRlckluc3BlY3RvciJdLmVudmlyb25tZW50LmFkZFN0eWxlKHsgCiAgICAgICAgICAgICJ3aWR0aCI6X2VsZW1lbnQub2Zmc2V0V2lkdGgrInB4IiwgImhlaWdodCI6X2VsZW1lbnQub2Zmc2V0SGVpZ2h0KyJweCIsCiAgICAgICAgICAgICJ0b3AiOnBvcy5vZmZzZXRUb3AtKF9iZ0luc3BlY3Rvcj8wOjIpKyJweCIsICJsZWZ0Ijpwb3Mub2Zmc2V0TGVmdC0oX2JnSW5zcGVjdG9yPzA6MikrInB4IiwKICAgICAgICAgICAgImRpc3BsYXkiOiJibG9jayIKICAgICAgICAgIH0pOwo5CiAgICAgICAgICBpZighX2JnSW5zcGVjdG9yKXsKICAgICAgICAgICAgZC5pbnNwZWN0b3IuZWwgPSBfZWxlbWVudDsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAogICAgICB0b2dnbGU6ZnVuY3Rpb24oX2Fic29sdXRlVmFsdWUsX2V2ZW50KXsKICAgICAgICB3aXRoIChmaXJlYnVnKSB7CiAgICAgICAgICBpZihfYWJzb2x1dGVWYWx1ZT09ZC5pbnNwZWN0b3IuZW5hYmxlZCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgZC5pbnNwZWN0b3IuZW5hYmxlZCA9IF9hYnNvbHV0ZVZhbHVlIT11bmRlZmluZWQmJiFfYWJzb2x1dGVWYWx1ZS5jbGllbnRYP19hYnNvbHV0ZVZhbHVlOiFkLmluc3BlY3Rvci5lbmFibGVkOwogICAgICAgICAgZWwuYnV0dG9uLmluc3BlY3QuYXR0cmlidXRlWyhkLmluc3BlY3Rvci5lbmFibGVkID8gImFkZCIgOiAicmVtb3ZlIikgKyAiQ2xhc3MiXSgiRW5hYmxlZCIpOwogICAgICAgICAgaWYoZC5pbnNwZWN0b3IuZW5hYmxlZD09ZmFsc2UpewogICAgICAgICAgICBlbC5ib3JkZXJJbnNwZWN0b3IuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6Im5vbmUiIH0pOwogICAgICAgICAgICBkLmluc3BlY3Rvci5lbCA9IG51bGw7CiAgICAgICAgICB9IGVsc2UgaWYobGliLmVudi5kSW5kZXghPSJodG1sIikgewogICAgICAgICAgICBpZiAoZW52LnBvcHVwV2luKSB7CiAgICAgICAgICAgICAgZW52LnBvcHVwV2luLmZpcmVidWcuZC5uYXZpZ2F0ZSgiaHRtbCIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGQubmF2aWdhdGUoImh0bWwiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHNjcmlwdHM6ewogICAgICBpbmRleDotMSwKICAgICAgbGluZU51bWJlcnM6ZmFsc2UsCiAgICAgIG9wZW46ZnVuY3Rpb24oX2luZGV4KXsKICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgZC5zY3JpcHRzLmluZGV4ID0gX2luZGV4OwogICAgICAgICAgZWwubGVmdC5zY3JpcHRzLmNvbnRhaW5lci51cGRhdGUoIiIpOwogICAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVtfaW5kZXhdLHVyaSA9IHNjcmlwdC5zcmN8fGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsc291cmNlOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYodXJpIT1kb2N1bWVudC5sb2NhdGlvbi5ocmVmKXsKICAgICAgICAgICAgICBzb3VyY2UgPSBlbnYuY2FjaGVbdXJpXXx8bGliLnhoci5nZXQodXJpKS5yZXNwb25zZVRleHQ7CiAgICAgICAgICAgICAgZW52LmNhY2hlW3VyaV0gPSBzb3VyY2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc291cmNlID0gc2NyaXB0LmlubmVySFRNTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2UucmVwbGFjZSgvPHw+L2csZnVuY3Rpb24oX2NoKXsKICAgICAgICAgICAgICByZXR1cm4gKHsiPCI6IiYjNjA7IiwiPiI6IiYjNjI7In0pW19jaF07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgCiAgICAgICAgICAgIGlmKCFkLnNjcmlwdHMubGluZU51bWJlcnMpIAogICAgICAgICAgICAgIGVsLmxlZnQuc2NyaXB0cy5jb250YWluZXIuY2hpbGQuYWRkKAogICAgICAgICAgICAgICAgICBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQ29kZUNvbnRhaW5lciIpLnVwZGF0ZShzb3VyY2UpCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgc291cmNlID0gc291cmNlLnNwbGl0KCI8YnIgLz4iKTsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgZWwubGVmdC5zY3JpcHRzLmNvbnRhaW5lci5jaGlsZC5hZGQobmV3IGxpYi5lbGVtZW50KCJESVYiKS5jaGlsZC5hZGQobmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkxpbmVOdW1iZXIiKS51cGRhdGUoaSArIDEpLCBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQ29kZSIpLnVwZGF0ZSgiJm5ic3A7IiArIHNvdXJjZVtpXSksIG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCdDbGVhcicpKSk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gY2F0Y2goZSl7CiAgICAgICAgICAgIGVsLmxlZnQuc2NyaXB0cy5jb250YWluZXIuY2hpbGQuYWRkKAogICAgICAgICAgICAgIG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJDb2RlQ29udGFpbmVyIikudXBkYXRlKCI8ZW0+QWNjZXNzIHRvIHJlc3RyaWN0ZWQgVVJJIGRlbmllZDwvZW0+IikKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHRvZ2dsZUxpbmVOdW1iZXJzOmZ1bmN0aW9uKCl7CiAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgIGQuc2NyaXB0cy5saW5lTnVtYmVycyA9ICFkLnNjcmlwdHMubGluZU51bWJlcnM7CiAgICAgICAgICBlbC5idXR0b24uc2NyaXB0cy5saW5lTnVtYmVycy5hdHRyaWJ1dGVbKGQuc2NyaXB0cy5saW5lTnVtYmVycyA/ICJhZGQiIDogInJlbW92ZSIpICsgIkNsYXNzIl0oIkVuYWJsZWQiKTsKICAgICAgICAgIGQuc2NyaXB0cy5vcGVuKCBkLnNjcmlwdHMuaW5kZXggKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlZnJlc2g6ZnVuY3Rpb24oKXsKICAgICAgICB3aXRoKGZpcmVidWcpewogICAgICAgICAgZWwuYnV0dG9uLnNjcmlwdHMuc2VsZWN0Ym94LmNsZWFuKCk7CiAgICAgICAgICB2YXIgY29sbGVjdGlvbiA9IGVudi50YXJnZXRXaW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOwogICAgICAgICAgZm9yKHZhciBpPTAsbGVuPWNvbGxlY3Rpb24ubGVuZ3RoOyBpPGxlbjsgaSsrKXsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBjb2xsZWN0aW9uW2ldLAogICAgICAgICAgICBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKGl0ZW0uc3JjfHxpdGVtLmJhc2VVUkl8fCIuLiIpOwogICAgICAgICAgICBkLnNjcmlwdHMuaW5kZXg9ZC5zY3JpcHRzLmluZGV4PDA/aTpkLnNjcmlwdHMuaW5kZXg7CiAgICAgICAgICAgIGVsLmJ1dHRvbi5zY3JpcHRzLnNlbGVjdGJveC5jaGlsZC5hZGQoCiAgICAgICAgICAgICAgICBuZXcgbGliLmVsZW1lbnQoIk9QVElPTiIpLmF0dHJpYnV0ZS5zZXQoInZhbHVlIixpKS51cGRhdGUoZmlsZU5hbWUpCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBkLnNjcmlwdHMub3BlbiggZC5zY3JpcHRzLmluZGV4ICk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgc3RyOiB7CiAgICAgIG9wZW46ZnVuY3Rpb24oX3N0cil7CiAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgIGQubmF2aWdhdGUoInN0ciIpOwogICAgICAgICAgZWwubGVmdC5zdHIuY29udGFpbmVyLnVwZGF0ZShfc3RyLnJlcGxhY2UoL1xuL2csIjxiciAvPiIpKQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHhocjp7CiAgICAgIG9iamVjdHM6W10sCiAgICAgIGFkZE9iamVjdDpmdW5jdGlvbigpewogICAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgICBmb3IodmFyIGk9MCxsZW49YXJndW1lbnRzLmxlbmd0aDsgaTxsZW47IGkrKyl7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBhcmd1bWVudHNbaV0sCiAgICAgICAgICAgICAgICAgIHZhbCA9IGVudi50YXJnZXRXaW5kb3cuZXZhbChpdGVtKTsKICAgICAgICAgICAgICBkLnhoci5vYmplY3RzLnB1c2goW2l0ZW0sIHZhbF0pOwogICAgICAgICAgICB9IGNhdGNoKGUpewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBvcGVuOmZ1bmN0aW9uKCl7CiAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgIGVsLmxlZnQueGhyLmNvbnRhaW5lci51cGRhdGUoIiIpOwogICAgICAgICAgZWwubGVmdC54aHIubmFtZSA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuYXR0cmlidXRlLmFkZENsYXNzKCJCbG9ja0NvbnRlbnQiKS5pbnNlcnQobmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJsb2NrIikuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAid2lkdGgiOiIyMCUiIH0pLmluc2VydChlbC5sZWZ0Lnhoci5jb250YWluZXIpKTsKICAgICAgICAgIGVsLmxlZnQueGhyLm5hbWVUaXRsZSA9IG5ldyBsaWIuZWxlbWVudCgiU1RST05HIikudXBkYXRlKCJPYmplY3QgTmFtZToiKS5pbnNlcnQoZWwubGVmdC54aHIubmFtZSk7CiAgICAgICAgICBlbC5sZWZ0Lnhoci5uYW1lQ29udGVudCA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuaW5zZXJ0KGVsLmxlZnQueGhyLm5hbWUpOwogICAgICAgICAgZWwubGVmdC54aHIuc3RhdHVzID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJsb2NrQ29udGVudCIpLmluc2VydChuZXcgbGliLmVsZW1lbnQoIkRJViIpLmF0dHJpYnV0ZS5hZGRDbGFzcygiQmxvY2siKS5lbnZpcm9ubWVudC5hZGRTdHlsZSh7ICJ3aWR0aCI6IjEwJSIgfSkuaW5zZXJ0KGVsLmxlZnQueGhyLmNvbnRhaW5lcikpOwogICAgICAgICAgZWwubGVmdC54aHIuc3RhdHVzVGl0bGUgPSBuZXcgbGliLmVsZW1lbnQoIlNUUk9ORyIpLnVwZGF0ZSgiU3RhdHVzOiIpLmluc2VydChlbC5sZWZ0Lnhoci5zdGF0dXMpOwogICAgICAgICAgZWwubGVmdC54aHIuc3RhdHVzQ29udGVudCA9IG5ldyBsaWIuZWxlbWVudCgiRElWIikuaW5zZXJ0KGVsLmxlZnQueGhyLnN0YXR1cyk7CiAgICAgICAgICBlbC5sZWZ0Lnhoci5yZWFkeXN0YXRlID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJsb2NrQ29udGVudCIpLmluc2VydChuZXcgbGliLmVsZW1lbnQoIkRJViIpLmVudmlyb25tZW50LmFkZFN0eWxlKHsgIndpZHRoIjoiMTUlIiB9KS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJsb2NrIikuaW5zZXJ0KGVsLmxlZnQueGhyLmNvbnRhaW5lcikpOwogICAgICAgICAgZWwubGVmdC54aHIucmVhZHlzdGF0ZVRpdGxlID1lbC5sZWZ0Lnhoci5uYW1lVGl0bGUgPSBuZXcgbGliLmVsZW1lbnQoIlNUUk9ORyIpLnVwZGF0ZSgiUmVhZHkgU3RhdGU6IikuaW5zZXJ0KGVsLmxlZnQueGhyLnJlYWR5c3RhdGUpOwogICAgICAgICAgZWwubGVmdC54aHIucmVhZHlzdGF0ZUNvbnRlbnQgPSBuZXcgbGliLmVsZW1lbnQoIkRJViIpLmluc2VydChlbC5sZWZ0Lnhoci5yZWFkeXN0YXRlKTsKICAgICAgICAgIGVsLmxlZnQueGhyLnJlc3BvbnNlID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJsb2NrQ29udGVudCIpLmluc2VydChuZXcgbGliLmVsZW1lbnQoIkRJViIpLmVudmlyb25tZW50LmFkZFN0eWxlKHsgIndpZHRoIjoobGliLmVudi5pZT8iNTAiOiI1NSIpKyIlIiB9KS5hdHRyaWJ1dGUuYWRkQ2xhc3MoIkJsb2NrIikuaW5zZXJ0KGVsLmxlZnQueGhyLmNvbnRhaW5lcikpOwogICAgICAgICAgZWwubGVmdC54aHIucmVzcG9uc2VUaXRsZSA9IG5ldyBsaWIuZWxlbWVudCgiU1RST05HIikudXBkYXRlKCJSZXNwb25zZToiKS5pbnNlcnQoZWwubGVmdC54aHIucmVzcG9uc2UpOwogICAgICAgICAgZWwubGVmdC54aHIucmVzcG9uc2VDb250ZW50ID0gbmV3IGxpYi5lbGVtZW50KCJESVYiKS5pbnNlcnQoZWwubGVmdC54aHIucmVzcG9uc2UpOwogICAgICAgICAgc2V0VGltZW91dChkLnhoci5yZWZyZXNoLDUwMCk7CiAgICAgICAgfQogICAgICB9LAogICAgICByZWZyZXNoOmZ1bmN0aW9uKCl7CiAgICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICAgIGVsLmxlZnQueGhyLm5hbWVDb250ZW50LnVwZGF0ZSgiIik7CiAgICAgICAgICBlbC5sZWZ0Lnhoci5zdGF0dXNDb250ZW50LnVwZGF0ZSgiIik7CiAgICAgICAgICBlbC5sZWZ0Lnhoci5yZWFkeXN0YXRlQ29udGVudC51cGRhdGUoIiIpOwogICAgICAgICAgZWwubGVmdC54aHIucmVzcG9uc2VDb250ZW50LnVwZGF0ZSgiIik7CiAgICAgICAgICBmb3IodmFyIGk9MCxsZW49ZC54aHIub2JqZWN0cy5sZW5ndGg7IGk8bGVuOyBpKyspewogICAgICAgICAgICB2YXIgaXRlbSA9IGQueGhyLm9iamVjdHNbaV0sCiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGl0ZW1bMV0ucmVzcG9uc2VUZXh0OwogICAgICAgICAgICBpZihCb29sZWFuKGl0ZW1bMV0pPT1mYWxzZSljb250aW51ZTsKICAgICAgICAgICAgZWwubGVmdC54aHIubmFtZUNvbnRlbnQuY2hpbGQuYWRkKG5ldyBsaWIuZWxlbWVudCgic3BhbiIpLnVwZGF0ZShpdGVtWzBdKSk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgZWwubGVmdC54aHIuc3RhdHVzQ29udGVudC5jaGlsZC5hZGQobmV3IGxpYi5lbGVtZW50KCJzcGFuIikudXBkYXRlKGl0ZW1bMV0uc3RhdHVzKSk7CiAgICAgICAgICAgIH0gY2F0Y2goZSl7IGVsLmxlZnQueGhyLnN0YXR1c0NvbnRlbnQuY2hpbGQuYWRkKG5ldyBsaWIuZWxlbWVudCgic3BhbiIpLnVwZGF0ZSgiJm5ic3A7IikpOyB9CiAgICAgICAgICAgIGVsLmxlZnQueGhyLnJlYWR5c3RhdGVDb250ZW50LmNoaWxkLmFkZChuZXcgbGliLmVsZW1lbnQoInNwYW4iKS51cGRhdGUoaXRlbVsxXS5yZWFkeVN0YXRlKSk7CgogICAgICAgICAgICBlbC5sZWZ0Lnhoci5yZXNwb25zZUNvbnRlbnQuY2hpbGQuYWRkKG5ldyBsaWIuZWxlbWVudCgic3BhbiIpLmNoaWxkLmFkZCgKICAgICAgICAgICAgICAgIG5ldyBsaWIuZWxlbWVudCgiQSIpLmV2ZW50LmFkZExpc3RlbmVyKCJjbGljayIsbGliLnV0aWwuQ3VycnkoZC5zdHIub3Blbix3aW5kb3cscmVzcG9uc2UpKS51cGRhdGUoIiZuYnNwOyIrcmVzcG9uc2Uuc3Vic3RyaW5nKDAsNTApKQogICAgICAgICAgICApKTsKICAgICAgICAgIH07CiAgICAgICAgICBpZihlbnYuZEluZGV4PT0ieGhyIikKICAgICAgICAgICAgc2V0VGltZW91dChkLnhoci5yZWZyZXNoLDUwMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgbmF2aWdhdGVSaWdodENvbHVtbjpmdW5jdGlvbihfaW5kZXgsX29wZW4pewogICAgICB3aXRoKGZpcmVidWcpewogICAgICAgIGVsLmxlZnQuY29udGFpbmVyLmVudmlyb25tZW50LmFkZFN0eWxlKHsgIndpZHRoIjpfb3Blbj8iNzAlIjoiMTAwJSIgfSk7CiAgICAgICAgZWwucmlnaHQuY29udGFpbmVyLmVudmlyb25tZW50LmFkZFN0eWxlKHsgImRpc3BsYXkiOl9vcGVuPyJibG9jayI6Im5vbmUiIH0pOwogICAgICB9CiAgICB9LAogICAgbmF2aWdhdGU6ZnVuY3Rpb24oX2luZGV4KXsKICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICB2YXIgb3BlbiA9IF9pbmRleCwgY2xvc2UgPSBlbnYuZEluZGV4OwogICAgICAgIGVudi5kSW5kZXggPSBvcGVuOwoKICAgICAgICBzZXR0aW5ncy5oaWRlKCk7CgogICAgICAgIGVsLmJ1dHRvbltjbG9zZV0uY29udGFpbmVyLmVudmlyb25tZW50LmFkZFN0eWxlKHsgImRpc3BsYXkiOiJub25lIiB9KTsKICAgICAgICBlbC5sZWZ0W2Nsb3NlXS5jb250YWluZXIuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6Im5vbmUiIH0pOwogICAgICAgIGVsLnJpZ2h0W2Nsb3NlXS5jb250YWluZXIuZW52aXJvbm1lbnQuYWRkU3R5bGUoeyAiZGlzcGxheSI6Im5vbmUiIH0pOwoKICAgICAgICBlbC5idXR0b25bb3Blbl0uY29udGFpbmVyLmVudmlyb25tZW50LmFkZFN0eWxlKHsgImRpc3BsYXkiOiJpbmxpbmUiIH0pOwogICAgICAgIGVsLmxlZnRbb3Blbl0uY29udGFpbmVyLmVudmlyb25tZW50LmFkZFN0eWxlKHsgImRpc3BsYXkiOiJibG9jayIgfSk7CiAgICAgICAgZWwucmlnaHRbb3Blbl0uY29udGFpbmVyLmVudmlyb25tZW50LmFkZFN0eWxlKHsgImRpc3BsYXkiOiJibG9jayIgfSk7CgogICAgICAgIGlmKGVsLm5hdltjbG9zZV0pCiAgICAgICAgICBlbC5uYXZbY2xvc2VdLmF0dHJpYnV0ZS5yZW1vdmVDbGFzcygiU2VsZWN0ZWQiKTsKICAgICAgICBpZihlbC5uYXZbb3Blbl0pCiAgICAgICAgICBlbC5uYXZbb3Blbl0uYXR0cmlidXRlLmFkZENsYXNzKCJTZWxlY3RlZCIpOwoKICAgICAgICBzd2l0Y2gob3Blbil7CiAgICAgICAgICBjYXNlICJjb25zb2xlIjoKICAgICAgICAgICAgZC5uYXZpZ2F0ZVJpZ2h0Q29sdW1uKF9pbmRleCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiaHRtbCI6CiAgICAgICAgICAgIGQubmF2aWdhdGVSaWdodENvbHVtbihfaW5kZXgsdHJ1ZSk7CiAgICAgICAgICAgIGlmKCFkLmh0bWwuY3VycmVudCl7CiAgICAgICAgICAgICAgdmFyIHQ9TnVtYmVyKG5ldyBEYXRlKTsKICAgICAgICAgICAgICBkLmh0bWwub3Blbkh0bWxUcmVlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJjc3MiOgogICAgICAgICAgICBkLm5hdmlnYXRlUmlnaHRDb2x1bW4oX2luZGV4LHRydWUpOwogICAgICAgICAgICBkLmNzcy5yZWZyZXNoKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAic2NyaXB0cyI6CiAgICAgICAgICAgIGQubmF2aWdhdGVSaWdodENvbHVtbihfaW5kZXgpOwogICAgICAgICAgICBkLnNjcmlwdHMucmVmcmVzaCgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImRvbSI6CiAgICAgICAgICAgIGQubmF2aWdhdGVSaWdodENvbHVtbihfaW5kZXgpOwogICAgICAgICAgICBpZihlbC5sZWZ0LmRvbS5jb250YWluZXIuZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLmlubmVySFRNTD09IiIpewogICAgICAgICAgICAgIHZhciB0PU51bWJlcihuZXcgRGF0ZSk7CiAgICAgICAgICAgICAgZC5kb20ub3BlbihldmFsKGVsLmJ1dHRvbi5kb20udGV4dGJveC5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCkudmFsdWUpLGVsLmxlZnQuZG9tLmNvbnRhaW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJ4aHIiOgogICAgICAgICAgICBkLm5hdmlnYXRlUmlnaHRDb2x1bW4oX2luZGV4KTsKICAgICAgICAgICAgZC54aHIub3BlbigpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9LAogIGdldEZpbGVOYW1lOmZ1bmN0aW9uKF9wYXRoKXsKICAgIHZhciBtYXRjaCA9IF9wYXRoJiZfcGF0aC5tYXRjaCgvW1x3XC1cLlw/XD1cJl0rJC8pOwogICAgcmV0dXJuIG1hdGNoJiZtYXRjaFswXXx8X3BhdGg7CiAgfSwKICBjYW5jZWxFdmVudDpmdW5jdGlvbihfZXZlbnQpewogICAgaWYoX2V2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgX2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgaWYoX2V2ZW50LnByZXZlbnREZWZhdWx0KQogICAgICBfZXZlbnQucHJldmVudERlZmF1bHQoKTsKICB9LAogIGdldFNlbGVjdGlvbjpmdW5jdGlvbihfZWwpewogICAgd2l0aChmaXJlYnVnKXsKICAgICAgaWYobGliLmVudi5pZSl7CiAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCksc3RvcmVkID0gcmFuZ2UuZHVwbGljYXRlKCk7CiAgICAgICAgc3RvcmVkLm1vdmVUb0VsZW1lbnRUZXh0KF9lbCk7CiAgICAgICAgc3RvcmVkLnNldEVuZFBvaW50KCdFbmRUb0VuZCcsIHJhbmdlKTsKICAgICAgICBfZWwuc2VsZWN0aW9uU3RhcnQgPSBzdG9yZWQudGV4dC5sZW5ndGggLSByYW5nZS50ZXh0Lmxlbmd0aDsKICAgICAgICBfZWwuc2VsZWN0aW9uRW5kID0gX2VsLnNlbGVjdGlvblN0YXJ0ICsgcmFuZ2UudGV4dC5sZW5ndGg7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBzdGFydDpfZWwuc2VsZWN0aW9uU3RhcnQsCiAgICAgICAgbGVuZ3RoOl9lbC5zZWxlY3Rpb25FbmQtX2VsLnNlbGVjdGlvblN0YXJ0CiAgICAgIH0KICAgIH0KICB9LAogIHRhYjpmdW5jdGlvbihfZWwsX2V2ZW50KXsKICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgIGlmKF9ldmVudC5rZXlDb2RlPT05KXsKICAgICAgICBpZihfZWwuc2V0U2VsZWN0aW9uUmFuZ2UpewogICAgICAgICAgdmFyIHBvc2l0aW9uID0gZmlyZWJ1Zy5nZXRTZWxlY3Rpb24oX2VsKTsKICAgICAgICAgIF9lbC52YWx1ZSA9IF9lbC52YWx1ZS5zdWJzdHJpbmcoMCxwb3NpdGlvbi5zdGFydCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKDkpICsgX2VsLnZhbHVlLnN1YnN0cmluZyhwb3NpdGlvbi5zdGFydCtwb3NpdGlvbi5sZW5ndGgsX2VsLnZhbHVlLmxlbmd0aCk7CiAgICAgICAgICBfZWwuc2V0U2VsZWN0aW9uUmFuZ2UocG9zaXRpb24uc3RhcnQrMSxwb3NpdGlvbi5zdGFydCsxKTsKICAgICAgICB9IGVsc2UgaWYoZG9jdW1lbnQuc2VsZWN0aW9uKSB7ICAKICAgICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLCBpc0NvbGxhcHNlZCA9IHJhbmdlLnRleHQgPT0gJyc7CiAgICAgICAgICByYW5nZS50ZXh0ID0gU3RyaW5nLmZyb21DaGFyQ29kZSg5KTsKICAgICAgICAgIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgLTEpOwogICAgICAgIH0KICAgICAgICBmaXJlYnVnLmNhbmNlbEV2ZW50KF9ldmVudCk7CiAgICAgICAgaWYobGliLmVudi5pZSkKICAgICAgICAgIHNldFRpbWVvdXQoX2VsLmZvY3VzLDEwMCk7CiAgICAgIH07CiAgICB9CiAgfSwKICBsaXN0ZW46IHsKICAgIGFkZFhock9iamVjdDpmdW5jdGlvbigpewogICAgICB3aXRoKGZpcmVidWcpewogICAgICAgIGQueGhyLmFkZE9iamVjdC5hcHBseShlbnYudGFyZ2V0V2luZG93LCBlbC5idXR0b24ueGhyLnRleHRib3guZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLnZhbHVlLnNwbGl0KCIsIikpOwogICAgICB9CiAgICB9LAogICAgY29uc29sZVRleHRib3g6ZnVuY3Rpb24oX2V2ZW50KXsKICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICBpZihfZXZlbnQua2V5Q29kZT09MTMmJihlbnYubXVsdGlsaW5lbW9kZT09ZmFsc2V8fF9ldmVudC5zaGlmdEtleT09ZmFsc2UpKXsKICAgICAgICAgIGQuY29uc29sZS5oaXN0b3J5SW5kZXggPSBkLmNvbnNvbGUuaGlzdG9yeS5sZW5ndGg7CiAgICAgICAgICBkLmNvbnNvbGUuZXZhbChlbC5sZWZ0LmNvbnNvbGUuaW5wdXQuZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLnZhbHVlKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaChfZXZlbnQua2V5Q29kZSl7CiAgICAgICAgICBjYXNlIDQwOgogICAgICAgICAgICBpZihkLmNvbnNvbGUuaGlzdG9yeVtkLmNvbnNvbGUuaGlzdG9yeUluZGV4KzFdKXsKICAgICAgICAgICAgICBkLmNvbnNvbGUuaGlzdG9yeUluZGV4Kz0xOwogICAgICAgICAgICAgIGVsLmxlZnQuY29uc29sZS5pbnB1dC51cGRhdGUoIGQuY29uc29sZS5oaXN0b3J5W2QuY29uc29sZS5oaXN0b3J5SW5kZXhdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICBpZihkLmNvbnNvbGUuaGlzdG9yeVtkLmNvbnNvbGUuaGlzdG9yeUluZGV4LTFdKXsKICAgICAgICAgICAgICBkLmNvbnNvbGUuaGlzdG9yeUluZGV4LT0xOwogICAgICAgICAgICAgIGVsLmxlZnQuY29uc29sZS5pbnB1dC51cGRhdGUoIGQuY29uc29sZS5oaXN0b3J5W2QuY29uc29sZS5oaXN0b3J5SW5kZXhdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY3NzU2VsZWN0Ym94OmZ1bmN0aW9uKCl7CiAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgZC5jc3Mub3BlbihlbC5idXR0b24uY3NzLnNlbGVjdGJveC5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCkuc2VsZWN0ZWRJbmRleCk7CiAgICAgIH0KICAgIH0sCiAgICBkb21UZXh0Ym94OmZ1bmN0aW9uKF9ldmVudCl7CiAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgaWYoX2V2ZW50LmtleUNvZGU9PTEzKXsKICAgICAgICAgIGQuZG9tLm9wZW4oZXZhbChlbC5idXR0b24uZG9tLnRleHRib3guZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLnZhbHVlKSxlbC5sZWZ0LmRvbS5jb250YWluZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGluc3BlY3RvcjpmdW5jdGlvbigpewogICAgICB3aXRoKGZpcmVidWcpewogICAgICAgIGlmIChlbnYucG9wdXBXaW4pIHsKICAgICAgICAgIGVudi5wb3B1cFdpbi5maXJlYnVnLmQuaHRtbC5pbnNwZWN0KGZpcmVidWcuZC5pbnNwZWN0b3IuZWwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmaXJlYnVnLmQuaHRtbC5pbnNwZWN0KGZpcmVidWcuZC5pbnNwZWN0b3IuZWwpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGtleWJvYXJkOmZ1bmN0aW9uKF9ldmVudCl7CiAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgaWYoX2V2ZW50LmtleUNvZGU9PTI3ICYmIGQuaW5zcGVjdG9yLmVuYWJsZWQpewogICAgICAgICAgZC5pbnNwZWN0b3IudG9nZ2xlKCk7CiAgICAgICAgfSBlbHNlIGlmKF9ldmVudC5rZXlDb2RlID09PSAxMjMgJiYgX2V2ZW50LmN0cmxLZXkgfHwgX2V2ZW50Lm1ldGFLZXkpIHsKICAgICAgICAgIGlmKGVudi5pc1BvcHVwKXsKICAgICAgICAgICAgd2luLmRvY2soKTsKICAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgd2luLm5ld1dpbmRvdygpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZigKICAgICAgICAgICAgKF9ldmVudC5rZXlDb2RlID09PSAxMjMgJiYgIV9ldmVudC5jdHJsS2V5ICYmICFfZXZlbnQubWV0YUtleSkgfHwgCiAgICAgICAgICAgIChfZXZlbnQua2V5Q29kZSA9PT0gNzYgJiYgKF9ldmVudC5jdHJsS2V5IHx8IF9ldmVudC5tZXRhS2V5KSAmJiBfZXZlbnQuc2hpZnRLZXkpIHx8CiAgICAgICAgICAgIChfZXZlbnQua2V5Q29kZSA9PT0gMTMgJiYgX2V2ZW50LnNoaWZ0S2V5KSkgewoKICAgICAgICAgIGlmKGVudi5pc1BvcHVwKXsKICAgICAgICAgICAgd2luLmRvY2soKTsKICAgICAgICAgIH0gZWxzZSBpZiAoZWwubWFpbi5lbnZpcm9ubWVudC5nZXRTdHlsZSgiZGlzcGxheSIpID09PSAnbm9uZScpIHsKICAgICAgICAgICAgd2luLnNob3coKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdpbi5oaWRlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgbW91c2U6ZnVuY3Rpb24oX2V2ZW50KXsKICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICB2YXIgdGFyZ2V0OwogICAgICAgIAogICAgICAgIGlmKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQpIHsKICAgICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoX2V2ZW50LmNsaWVudFgsIF9ldmVudC5jbGllbnRZKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYobGliLmVudi5pZSkgewogICAgICAgICAgICB0YXJnZXQgPSBfZXZlbnQuc3JjRWxlbWVudDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRhcmdldCA9IF9ldmVudC5leHBsaWNpdE9yaWdpbmFsVGFyZ2V0IHx8IF9ldmVudC50YXJnZXQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKCBkLmluc3BlY3Rvci5lbmFibGVkJiYKICAgICAgICAgIHRhcmdldCE9ZG9jdW1lbnQuYm9keSYmCiAgICAgICAgICB0YXJnZXQhPWRvY3VtZW50LmZpcnN0Q2hpbGQmJgogICAgICAgICAgdGFyZ2V0IT1kb2N1bWVudC5jaGlsZE5vZGVzWzFdJiYKICAgICAgICAgIHRhcmdldCE9ZWwuYm9yZGVySW5zcGVjdG9yLmVudmlyb25tZW50LmdldEVsZW1lbnQoKSYmCiAgICAgICAgICB0YXJnZXQhPWVsLm1haW4uZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpJiYKICAgICAgICAgIHRhcmdldC5vZmZzZXRQYXJlbnQhPWVsLm1haW4uZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpICkgewogICAgICAgICAgICBkLmluc3BlY3Rvci5pbnNwZWN0KHRhcmdldCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgcnVuTXVsdGlsaW5lOmZ1bmN0aW9uKCl7CiAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgZC5jb25zb2xlLmV2YWwuY2FsbCh3aW5kb3csZWwucmlnaHQuY29uc29sZS5pbnB1dC5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCkudmFsdWUpOwogICAgICB9CiAgICB9LAogICAgcnVuQ1NTOmZ1bmN0aW9uKCl7CiAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgdmFyIHNvdXJjZSA9IGVsLnJpZ2h0LmNzcy5pbnB1dC5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCkudmFsdWUucmVwbGFjZSgvXG58XHQvZywiIikuc3BsaXQoIn0iKTsKICAgICAgICBmb3IodmFyIGk9MCwgbGVuPXNvdXJjZS5sZW5ndGg7IGk8bGVuOyBpKyspewogICAgICAgICAgdmFyIGl0ZW0gPSBzb3VyY2VbaV0rIn0iLCBydWxlID0gIWxpYi5lbnYuaWU/aXRlbTppdGVtLnNwbGl0KC97fH0vKSwKICAgICAgICAgICAgICBzdHlsZVNoZWV0ID0gZG9jdW1lbnQuc3R5bGVTaGVldHNbMF07CiAgICAgICAgICBjb25zb2xlLmxvZyhydWxlKTsKICAgICAgICAgIGlmKGl0ZW0ubWF0Y2goLy4rXHsuK1x9LykpewogICAgICAgICAgICBpZihsaWIuZW52LmllKQogICAgICAgICAgICAgIHN0eWxlU2hlZXQuYWRkUnVsZShydWxlWzBdLHJ1bGVbMV0pOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgc3R5bGVTaGVldC5pbnNlcnRSdWxlKCBydWxlLCBzdHlsZVNoZWV0LmNzc1J1bGVzLmxlbmd0aCApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHNjcmlwdHNTZWxlY3Rib3g6ZnVuY3Rpb24oKXsKICAgICAgd2l0aChmaXJlYnVnKXsKICAgICAgICBkLnNjcmlwdHMub3BlbihwYXJzZUludChlbC5idXR0b24uc2NyaXB0cy5zZWxlY3Rib3guZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLnZhbHVlKSk7CiAgICAgIH0KICAgIH0sCiAgICB4aHJUZXh0Ym94OmZ1bmN0aW9uKF9ldmVudCl7CiAgICAgIHdpdGgoZmlyZWJ1Zyl7CiAgICAgICAgaWYoX2V2ZW50LmtleUNvZGU9PTEzKXsKICAgICAgICAgIGQueGhyLmFkZE9iamVjdC5hcHBseShlbnYudGFyZ2V0V2luZG93LCBlbC5idXR0b24ueGhyLnRleHRib3guZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLnZhbHVlLnNwbGl0KCIsIikpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCihmdW5jdGlvbihfc2NvcGUpewogIF9zY29wZS5saWIgPSB7fTsKICB2YXIgcGkgID0gX3Njb3BlLmxpYjsgcGkudmVyc2lvbiA9IFsxLjEsMjAwODA5MTAwMF07CgogIHBpLmVudiA9IHsKICAgIGllOiAvTVNJRS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksCiAgICBpZTY6IC9NU0lFIDYvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLAogICAgaWU3OiAvTVNJRSA3L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSwKICAgIGllODogL01TSUUgOC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksCiAgICBmaXJlZm94OiAvRmlyZWZveC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksCiAgICBvcGVyYTogL09wZXJhL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSwKICAgIHdlYmtpdDogL1dlYmtpdC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksCiAgICBjYW1pbm86IC9DYW1pbm8vaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpCiAgfTsKCiAgcGkuZ2V0ID0gZnVuY3Rpb24oKXsKICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhcmd1bWVudHNbMF0pOwogIH07CiAgcGkuZ2V0LmJ5VGFnID0gZnVuY3Rpb24oKXsKICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShhcmd1bWVudHNbMF0pOwogIH07CiAgcGkuZ2V0LmJ5Q2xhc3MgPSBmdW5jdGlvbigpeyByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZS5hcHBseShkb2N1bWVudCxhcmd1bWVudHMpOyB9OwoKICBwaS51dGlsID0gewogICAgQXJyYXk6ewogICAgICBjbG9uZTpmdW5jdGlvbihfYXJyYXksX3VuZGVlcCl7CiAgICAgICAgdmFyIHRtcCA9IFtdOwogICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRtcCxfYXJyYXkpOwogICAgICAgIHBpLnV0aWwuQXJyYXkuZm9yRWFjaCh0bXAsZnVuY3Rpb24oX2l0ZW0sX2luZGV4LF9zb3VyY2UpewogICAgICAgICAgaWYoX2l0ZW0gaW5zdGFuY2VvZiBBcnJheSYmIV91bmRlZXApCiAgICAgICAgICAgIF9zb3VyY2VbX2luZGV4XSA9IHBpLnV0aWwuQXJyYXkuY2xvbmUoX3NvdXJjZVtfaW5kZXhdKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdG1wOwogICAgICB9LAogICAgICBjb3VudDpmdW5jdGlvbihfYXJyYXksX3ZhbHVlKXsKICAgICAgICB2YXIgY291bnQgPSAwOwogICAgICAgIHBpLnV0aWwuQXJyYXkuZm9yRWFjaChfYXJyYXksZnVuY3Rpb24oKXsKICAgICAgICAgIGNvdW50Kz1OdW1iZXIoYXJndW1lbnRzWzBdPT1fdmFsdWUpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBjb3VudDsKICAgICAgfSwKICAgICAgZm9yRWFjaDpmdW5jdGlvbihfYXJyYXksX2Z1bmN0aW9uKXsKICAgICAgICBpZihfYXJyYXkuZm9yRWFjaCkKICAgICAgICAgIHJldHVybiBfYXJyYXkuZm9yRWFjaChfZnVuY3Rpb24pOwogICAgICAgIGZvcih2YXIgaT0wLGxlbj1fYXJyYXkubGVuZ3RoOyBpPGxlbjsgaSsrKQogICAgICAgICAgX2Z1bmN0aW9uLmFwcGx5KF9hcnJheSxbX2FycmF5W2ldLGksX2FycmF5XSk7ICAgCiAgICAgIH0sCiAgICAgIGdldExhdGVzdDpmdW5jdGlvbihfYXJyYXkpewogICAgICAgIHJldHVybiBfYXJyYXlbX2FycmF5Lmxlbmd0aC0xXTsKICAgICAgfSwKICAgICAgaW5kZXhPZjpmdW5jdGlvbihfYXJyYXksX3ZhbHVlKXsKICAgICAgICBpZighcGkuZW52LmllKXsKICAgICAgICAgIHJldHVybiBfYXJyYXkuaW5kZXhPZihfdmFsdWUpOwogICAgICAgIH07CgogICAgICAgIHZhciBpbmRleCA9IC0xOwogICAgICAgIGZvcih2YXIgaT0wLCBsZW49X2FycmF5Lmxlbmd0aDsgaTxsZW47IGkrKyl7CiAgICAgICAgICBpZihfYXJyYXlbaV09PV92YWx1ZSl7CiAgICAgICAgICAgIGluZGV4ID0gaTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbmRleDsKICAgICAgfSwKICAgICAgcmVtb3ZlOmZ1bmN0aW9uKF9hcnJheSxfaW5kZXgpewogICAgICAgIHZhciByZXN1bHQgPSBfYXJyYXkuc2xpY2UoMCxfaW5kZXgpOwogICAgICAgIF9hcnJheSA9IEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHJlc3VsdCxfYXJyYXkuc2xpY2UoX2luZGV4KzEpKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9LAogICAgQ3Vycnk6ZnVuY3Rpb24oX2ZuLF9zY29wZSl7CiAgICAgIHZhciBmbiA9IF9mbiwgc2NvcGUgPSBfc2NvcGV8fHdpbmRvdywgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7IAogICAgICAgIHJldHVybiBmbi5hcHBseShzY29wZSxhcmdzLmNvbmNhdCggQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApICkpOyAKICAgICAgfTsKICAgIH0sCiAgICBFeHRlbmQ6ZnVuY3Rpb24oX3N1cGVyQ2xhc3MsX3Byb3RvdHlwZSxfc2tpcENsb25uaW5nKXsKICAgICAgdmFyIG9iamVjdCA9IG5ldyBwaS5iYXNlOwogICAgICBpZihfcHJvdG90eXBlWyIkSW5pdCJdKXsKICAgICAgICBvYmplY3QuaW5pdCA9IF9wcm90b3R5cGVbIiRJbml0Il07CiAgICAgICAgZGVsZXRlIF9wcm90b3R5cGVbIiRJbml0Il07CiAgICAgIH07CgogICAgICBvYmplY3QuYm9keSA9IF9zdXBlckNsYXNzPT1waS5iYXNlP19wcm90b3R5cGU6cGkudXRpbC5IYXNoLm1lcmdlKF9wcm90b3R5cGUsX3N1cGVyQ2xhc3MucHJvdG90eXBlKTsKICAgICAgb2JqZWN0LmluaXQ9b2JqZWN0LmluaXR8fGZ1bmN0aW9uKCl7CiAgICAgICAgaWYoX3N1cGVyQ2xhc3MhPXBpLmJhc2UpCiAgICAgICAgICBfc3VwZXJDbGFzcy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CiAgICAgIH07CgogICAgICByZXR1cm4gb2JqZWN0LmJ1aWxkKF9za2lwQ2xvbm5pbmcpOwogICAgfSwKICAgIElzQXJyYXk6ZnVuY3Rpb24oX29iamVjdCl7CiAgICAgIGlmKF9vYmplY3Q9PT1udWxsKXsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYod2luZG93Lk5vZGVMaXN0JiZ3aW5kb3cuTmFtZWROb2RlTWFwJiYhcGkuZW52LmllOCl7CiAgICAgICAgaWYoX29iamVjdCBpbnN0YW5jZW9mIEFycmF5fHxfb2JqZWN0IGluc3RhbmNlb2YgTm9kZUxpc3R8fF9vYmplY3QgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXB8fCh3aW5kb3cuSFRNTENvbGxlY3Rpb24mJl9vYmplY3QgaW5zdGFuY2VvZiBIVE1MQ29sbGVjdGlvbikpCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfTsKICAgICAgaWYoIV9vYmplY3R8fF9vYmplY3Q9PXdpbmRvd3x8dHlwZW9mIF9vYmplY3Q9PSJmdW5jdGlvbiJ8fHR5cGVvZiBfb2JqZWN0PT0ic3RyaW5nInx8dHlwZW9mIF9vYmplY3QubGVuZ3RoIT0ibnVtYmVyIil7CiAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgIH07CiAgICAgIHZhciBsZW4gPSBfb2JqZWN0Lmxlbmd0aDsKICAgICAgaWYobGVuPjAmJl9vYmplY3RbMF0hPXVuZGVmaW5lZCYmX29iamVjdFtsZW4tMV0hPXVuZGVmaW5lZCl7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yKHZhciBrZXkgaW4gX29iamVjdCl7CiAgICAgICAgICBpZihrZXkhPSJpdGVtIiYma2V5IT0ibGVuZ3RoIiYma2V5IT0ic2V0TmFtZWRJdGVtTlMiJiZrZXkhPSJzZXROYW1lZEl0ZW0iJiZrZXkhPSJnZXROYW1lZEl0ZW0iJiZrZXkhPSJyZW1vdmVOYW1lZEl0ZW0iJiZrZXkhPSJnZXROYW1lZEl0ZW1OUyImJmtleSE9InJlbW92ZU5hbWVkSXRlbU5TIiYma2V5IT0idGFncyIpewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH07CiAgICB9LAogICAgSXNIYXNoOmZ1bmN0aW9uKF9vYmplY3QpewogICAgICByZXR1cm4gX29iamVjdCAmJiB0eXBlb2YgX29iamVjdD09Im9iamVjdCImJihfb2JqZWN0PT13aW5kb3d8fF9vYmplY3QgaW5zdGFuY2VvZiBPYmplY3QpJiYhX29iamVjdC5ub2RlTmFtZSYmIXBpLnV0aWwuSXNBcnJheShfb2JqZWN0KQogICAgfSwKICAgIEluaXQ6W10sCiAgICBBZGRFdmVudDogZnVuY3Rpb24oX2VsZW1lbnQsX2V2ZW50TmFtZSxfZm4sX3VzZUNhcHR1cmUpewogICAgICBfZWxlbWVudFtwaS5lbnYuaWU/ImF0dGFjaEV2ZW50IjoiYWRkRXZlbnRMaXN0ZW5lciJdKChwaS5lbnYuaWU/Im9uIjoiIikrX2V2ZW50TmFtZSxfZm4sX3VzZUNhcHR1cmV8fGZhbHNlKTsKICAgICAgcmV0dXJuIHBpLnV0aWwuQ3VycnkocGkudXRpbC5BZGRFdmVudCx0aGlzLF9lbGVtZW50KTsKICAgIH0sCiAgICBSZW1vdmVFdmVudDogZnVuY3Rpb24oX2VsZW1lbnQsX2V2ZW50TmFtZSxfZm4sX3VzZUNhcHR1cmUpewogICAgICBfZWxlbWVudFtwaS5lbnYuaWU/ImRldGFjaEV2ZW50IjoicmVtb3ZlRXZlbnRMaXN0ZW5lciJdKChwaS5lbnYuaWU/Im9uIjoiIikrX2V2ZW50TmFtZSxfZm4sX3VzZUNhcHR1cmV8fGZhbHNlKTsKICAgICAgcmV0dXJuIHBpLnV0aWwuQ3VycnkocGkudXRpbC5SZW1vdmVFdmVudCx0aGlzLF9lbGVtZW50KTsKICAgIH0sCiAgICBFbGVtZW50OnsKICAgICAgYWRkQ2xhc3M6ZnVuY3Rpb24oX2VsZW1lbnQsX2NsYXNzKXsKICAgICAgICBpZiggIXBpLnV0aWwuRWxlbWVudC5oYXNDbGFzcyhfZWxlbWVudCxfY2xhc3MpICkKICAgICAgICAgIHBpLnV0aWwuRWxlbWVudC5zZXRDbGFzcyhfZWxlbWVudCwgcGkudXRpbC5FbGVtZW50LmdldENsYXNzKF9lbGVtZW50KSArICIgIiArIF9jbGFzcyApOwogICAgICB9LAogICAgICBnZXRDbGFzczpmdW5jdGlvbihfZWxlbWVudCl7CiAgICAgICAgcmV0dXJuIF9lbGVtZW50LmdldEF0dHJpYnV0ZShwaS5lbnYuaWUmJiFwaS5lbnYuaWU4PyJjbGFzc05hbWUiOiJjbGFzcyIpfHwiIjsKICAgICAgfSwKICAgICAgaGFzQ2xhc3M6ZnVuY3Rpb24oX2VsZW1lbnQsX2NsYXNzKXsKICAgICAgICByZXR1cm4gcGkudXRpbC5BcnJheS5pbmRleE9mKHBpLnV0aWwuRWxlbWVudC5nZXRDbGFzcyhfZWxlbWVudCkuc3BsaXQoIiAiKSxfY2xhc3MpPi0xOwogICAgICB9LAogICAgICByZW1vdmVDbGFzczpmdW5jdGlvbihfZWxlbWVudCxfY2xhc3MpewogICAgICAgIGlmKCBwaS51dGlsLkVsZW1lbnQuaGFzQ2xhc3MoX2VsZW1lbnQsX2NsYXNzKSApewogICAgICAgICAgdmFyIG5hbWVzID0gcGkudXRpbC5FbGVtZW50LmdldENsYXNzKF9lbGVtZW50LF9jbGFzcykuc3BsaXQoIiAiKTsKICAgICAgICAgIHBpLnV0aWwuRWxlbWVudC5zZXRDbGFzcygKICAgICAgICAgICAgICBfZWxlbWVudCwgCiAgICAgICAgICAgICAgcGkudXRpbC5BcnJheS5yZW1vdmUobmFtZXMscGkudXRpbC5BcnJheS5pbmRleE9mKG5hbWVzLF9jbGFzcykpLmpvaW4oIiAiKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNldENsYXNzOmZ1bmN0aW9uKF9lbGVtZW50LF92YWx1ZSl7CiAgICAgICAgaWYocGkuZW52LmllOCl7CiAgICAgICAgICBfZWxlbWVudC5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsIF92YWx1ZSApOwogICAgICAgICAgX2VsZW1lbnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsIF92YWx1ZSApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfZWxlbWVudC5zZXRBdHRyaWJ1dGUocGkuZW52LmllPyJjbGFzc05hbWUiOiJjbGFzcyIsIF92YWx1ZSApOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oKXsKICAgICAgICBpZihwaS51dGlsLkVsZW1lbnQuaGFzQ2xhc3MuYXBwbHkodGhpcyxhcmd1bWVudHMpKQogICAgICAgICAgcGkudXRpbC5FbGVtZW50LnJlbW92ZUNsYXNzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKICAgICAgICBlbHNlCiAgICAgICAgICBwaS51dGlsLkVsZW1lbnQuYWRkQ2xhc3MuYXBwbHkodGhpcyxhcmd1bWVudHMpOwogICAgICB9LAogICAgICBnZXRPcGFjaXR5OmZ1bmN0aW9uKF9zdHlsZU9iamVjdCl7CiAgICAgICAgdmFyIHN0eWxlT2JqZWN0ID0gX3N0eWxlT2JqZWN0OwogICAgICAgIGlmKCFwaS5lbnYuaWUpCiAgICAgICAgICByZXR1cm4gc3R5bGVPYmplY3RbIm9wYWNpdHkiXTsKCiAgICAgICAgdmFyIGFscGhhID0gc3R5bGVPYmplY3RbImZpbHRlciJdLm1hdGNoKC9vcGFjaXR5XD0oXGQrKS9pKTsKICAgICAgICByZXR1cm4gYWxwaGE/YWxwaGFbMV0vMTAwOjE7CiAgICAgIH0sCiAgICAgIHNldE9wYWNpdHk6ZnVuY3Rpb24oX2VsZW1lbnQsX3ZhbHVlKXsKICAgICAgICBpZighcGkuZW52LmllKQogICAgICAgICAgcmV0dXJuIHBpLnV0aWwuRWxlbWVudC5hZGRTdHlsZShfZWxlbWVudCx7ICJvcGFjaXR5IjpfdmFsdWUgfSk7CiAgICAgICAgX3ZhbHVlKj0xMDA7CiAgICAgICAgcGkudXRpbC5FbGVtZW50LmFkZFN0eWxlKF9lbGVtZW50LHsgImZpbHRlciI6ImFscGhhKG9wYWNpdHk9IitfdmFsdWUrIikiIH0pOwogICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRfOwogICAgICB9LAogICAgICBnZXRQb3NpdGlvbjpmdW5jdGlvbihfZWxlbWVudCl7CiAgICAgICAgdmFyIHBhcmVudCA9IF9lbGVtZW50LG9mZnNldExlZnQgPSBkb2N1bWVudC5ib2R5Lm9mZnNldExlZnQsIG9mZnNldFRvcCA9IGRvY3VtZW50LmJvZHkub2Zmc2V0VG9wLCB2aWV3ID0gcGkudXRpbC5FbGVtZW50LmdldFZpZXcoX2VsZW1lbnQpOwogICAgICAgIHdoaWxlKHBhcmVudCYmcGFyZW50IT1kb2N1bWVudC5ib2R5JiZwYXJlbnQhPWRvY3VtZW50LmZpcnN0Q2hpbGQpewogICAgICAgICAgb2Zmc2V0TGVmdCArPXBhcnNlSW50KHBhcmVudC5vZmZzZXRMZWZ0KTsKICAgICAgICAgIG9mZnNldFRvcCArPSBwYXJzZUludChwYXJlbnQub2Zmc2V0VG9wKTsKICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5vZmZzZXRQYXJlbnQ7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgImJvdHRvbSI6dmlld1siYm90dG9tIl0sCiAgICAgICAgICAiY2xpZW50TGVmdCI6X2VsZW1lbnQuY2xpZW50TGVmdCwKICAgICAgICAgICJjbGllbnRUb3AiOl9lbGVtZW50LmNsaWVudFRvcCwKICAgICAgICAgICJsZWZ0Ijp2aWV3WyJsZWZ0Il0sCiAgICAgICAgICAibWFyZ2luVG9wIjp2aWV3WyJtYXJnaW5Ub3AiXSwKICAgICAgICAgICJtYXJnaW5MZWZ0Ijp2aWV3WyJtYXJnaW5MZWZ0Il0sCiAgICAgICAgICAib2Zmc2V0TGVmdCI6b2Zmc2V0TGVmdCwKICAgICAgICAgICJvZmZzZXRUb3AiOm9mZnNldFRvcCwKICAgICAgICAgICJwb3NpdGlvbiI6dmlld1sicG9zaXRpb24iXSwKICAgICAgICAgICJyaWdodCI6dmlld1sicmlnaHQiXSwKICAgICAgICAgICJ0b3AiOnZpZXdbInRvcCJdLAogICAgICAgICAgInpJbmRleCI6dmlld1siekluZGV4Il0KICAgICAgICB9OwogICAgICB9LAogICAgICBnZXRTaXplOmZ1bmN0aW9uKF9lbGVtZW50KXsKICAgICAgICB2YXIgdmlldyA9IHBpLnV0aWwuRWxlbWVudC5nZXRWaWV3KF9lbGVtZW50KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgImhlaWdodCI6dmlld1siaGVpZ2h0Il0sCiAgICAgICAgICAiY2xpZW50SGVpZ2h0IjpfZWxlbWVudC5jbGllbnRIZWlnaHQsCiAgICAgICAgICAiY2xpZW50V2lkdGgiOl9lbGVtZW50LmNsaWVudFdpZHRoLAogICAgICAgICAgIm9mZnNldEhlaWdodCI6X2VsZW1lbnQub2Zmc2V0SGVpZ2h0LAogICAgICAgICAgIm9mZnNldFdpZHRoIjpfZWxlbWVudC5vZmZzZXRXaWR0aCwKICAgICAgICAgICJ3aWR0aCI6dmlld1sid2lkdGgiXQogICAgICAgIH0KICAgICAgfSwKICAgICAgYWRkU3R5bGU6ZnVuY3Rpb24oX2VsZW1lbnQsX3N0eWxlKXsKICAgICAgICBmb3IodmFyIGtleSBpbiBfc3R5bGUpewogICAgICAgICAga2V5ID0ga2V5PT0iZmxvYXQiP3BpLmVudi5pZT8ic3R5bGVGbG9hdCI6ImNzc0Zsb2F0IjprZXk7CiAgICAgICAgICBpZiAoa2V5ID09ICJvcGFjaXR5IiAmJiBwaS5lbnYuaWUpIHsKICAgICAgICAgICAgcGkudXRpbC5FbGVtZW50LnNldE9wYWNpdHkoX2VsZW1lbnQsX3N0eWxlW2tleV0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIF9lbGVtZW50LnN0eWxlW2tleV0gPSBfc3R5bGVba2V5XTsKICAgICAgICAgIH1jYXRjaChlKXt9ICAgICAKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGdldFN0eWxlOmZ1bmN0aW9uKF9lbGVtZW50LF9wcm9wZXJ0eSl7CiAgICAgICAgX3Byb3BlcnR5ID0gX3Byb3BlcnR5PT0iZmxvYXQiP3BpLmVudi5pZT8ic3R5bGVGbG9hdCI6ImNzc0Zsb2F0IjpfcHJvcGVydHk7CiAgICAgICAgaWYoX3Byb3BlcnR5PT0ib3BhY2l0eSImJnBpLmVudi5pZSkKICAgICAgICAgIHJldHVybiBwaS51dGlsLkVsZW1lbnQuZ2V0T3BhY2l0eShfZWxlbWVudC5zdHlsZSk7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBfcHJvcGVydHk9PSJzdHJpbmciP19lbGVtZW50LnN0eWxlW19wcm9wZXJ0eV06X2VsZW1lbnQuc3R5bGU7CiAgICAgIH0sCiAgICAgIGdldFZhbHVlOmZ1bmN0aW9uKF9lbGVtZW50KXsKICAgICAgICBzd2l0Y2goX2VsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7CiAgICAgICAgICBjYXNlICJpbnB1dCI6CiAgICAgICAgICBjYXNlICJ0ZXh0YXJlYSI6CiAgICAgICAgICAgIHJldHVybiBfZWxlbWVudC52YWx1ZTsKICAgICAgICAgIGNhc2UgInNlbGVjdCI6CiAgICAgICAgICAgIHJldHVybiBfZWxlbWVudC5vcHRpb25zW19lbGVtZW50LnNlbGVjdGVkSW5kZXhdLnZhbHVlOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIF9lbGVtZW50LmlubmVySFRNTDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZ2V0VmlldzpmdW5jdGlvbihfZWxlbWVudCxfcHJvcGVydHkpewogICAgICAgIHZhciB2aWV3ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc/ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShfZWxlbWVudCxudWxsKTpfZWxlbWVudC5jdXJyZW50U3R5bGU7CiAgICAgICAgX3Byb3BlcnR5ID0gX3Byb3BlcnR5PT0iZmxvYXQiP3BpLmVudi5pZT8ic3R5bGVGbG9hdCI6ImNzc0Zsb2F0IjpfcHJvcGVydHk7CiAgICAgICAgaWYoX3Byb3BlcnR5PT0ib3BhY2l0eSImJnBpLmVudi5pZSkKICAgICAgICAgIHJldHVybiBwaS51dGlsLkVsZW1lbnQuZ2V0T3BhY2l0eShfZWxlbWVudCx2aWV3KTsKICAgICAgICByZXR1cm4gdHlwZW9mIF9wcm9wZXJ0eT09InN0cmluZyI/dmlld1tfcHJvcGVydHldOnZpZXc7CiAgICAgIH0KICAgIH0sCiAgICBIYXNoOiB7CiAgICAgIGNsb25lOmZ1bmN0aW9uKF9oYXNoLF91bmRlZXApewogICAgICAgIHZhciB0bXAgPSB7fTsKICAgICAgICBmb3IodmFyIGtleSBpbiBfaGFzaCl7CiAgICAgICAgICBpZiggIV91bmRlZXAmJnBpLnV0aWwuSXNBcnJheSggX2hhc2hba2V5XSApICl7CiAgICAgICAgICAgIHRtcFtrZXldID0gcGkudXRpbC5BcnJheS5jbG9uZSggX2hhc2hba2V5XSApOwogICAgICAgICAgfSBlbHNlIGlmKCAhX3VuZGVlcCYmcGkudXRpbC5Jc0hhc2goIF9oYXNoW2tleV0gKSApewogICAgICAgICAgICB0bXBbIGtleSBdID0gcGkudXRpbC5IYXNoLmNsb25lKF9oYXNoW2tleV0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG1wW2tleV0gPSBfaGFzaFtrZXldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdG1wOwogICAgICB9LAogICAgICBtZXJnZTpmdW5jdGlvbihfaGFzaCxfc291cmNlLF91bmRlZXApewogICAgICAgIGZvcih2YXIga2V5IGluIF9zb3VyY2UpewogICAgICAgICAgdmFyIHZhbHVlID0gX3NvdXJjZVtrZXldOwogICAgICAgICAgaWYgKCFfdW5kZWVwJiZwaS51dGlsLklzQXJyYXkoX3NvdXJjZVtrZXldKSkgewogICAgICAgICAgICBpZihwaS51dGlsLklzQXJyYXkoIF9oYXNoW2tleV0gKSl7CiAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIF9zb3VyY2Vba2V5XSwgX2hhc2hba2V5XSApCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHZhbHVlID0gcGkudXRpbC5BcnJheS5jbG9uZShfc291cmNlW2tleV0pOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoIV91bmRlZXAmJnBpLnV0aWwuSXNIYXNoKF9zb3VyY2Vba2V5XSkpIHsKICAgICAgICAgICAgaWYgKHBpLnV0aWwuSXNIYXNoKF9oYXNoW2tleV0pKSB7CiAgICAgICAgICAgICAgdmFsdWUgPSBwaS51dGlsLkhhc2gubWVyZ2UoX2hhc2hba2V5XSwgX3NvdXJjZVtrZXldKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YWx1ZSA9IHBpLnV0aWwuSGFzaC5jbG9uZSggX3NvdXJjZVtrZXldICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiggX2hhc2hba2V5XSApCiAgICAgICAgICAgIHZhbHVlID0gX2hhc2hbIGtleSBdOwogICAgICAgICAgX2hhc2hba2V5XSA9IHZhbHVlOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIF9oYXNoOwogICAgICB9CiAgICB9LAogICAgU3RyaW5nOnsKICAgICAgZm9ybWF0OmZ1bmN0aW9uKF9zdHIpewogICAgICAgIHZhciB2YWx1ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7CiAgICAgICAgcmV0dXJuIF9zdHIucmVwbGFjZSgvXHsoXGQpXH0vZyxmdW5jdGlvbigpewogICAgICAgICAgcmV0dXJuIHZhbHVlc1thcmd1bWVudHNbMV1dOwogICAgICAgIH0pCiAgICAgIH0KICAgIH0sCiAgICBHZXRWaWV3cG9ydDpmdW5jdGlvbigpewogICAgICByZXR1cm4gewogICAgICAgIGhlaWdodDpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fHxkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCwKICAgICAgICB3aWR0aDpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgKICAgICAgfQogICAgfQogIH07CgogIHBpLmJhc2UgPSBmdW5jdGlvbigpewogICAgdGhpcy5ib2R5ID0ge307CiAgICB0aGlzLmluaXQgPSBudWxsOwoKICAgIHRoaXMuYnVpbGQgPSBmdW5jdGlvbihfc2tpcENsb25uaW5nKXsKICAgICAgdmFyIGJhc2UgPSB0aGlzLCBza2lwQ2xvbm5pbmcgPSBfc2tpcENsb25uaW5nfHxmYWxzZSwgX3ByaXZhdGUgPSB7fSwKICAgICAgZm4gPSBmdW5jdGlvbigpewogICAgICAgIHZhciBfcCA9IHBpLnV0aWwuSGFzaC5jbG9uZShfcHJpdmF0ZSk7CiAgICAgICAgaWYoIXNraXBDbG9ubmluZyl7CiAgICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzKXsKICAgICAgICAgICAgaWYocGkudXRpbC5Jc0FycmF5KCB0aGlzWyBrZXkgXSApICl7CiAgICAgICAgICAgICAgdGhpc1trZXldID0gcGkudXRpbC5BcnJheS5jbG9uZSggdGhpc1trZXldICk7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgIGlmKCBwaS51dGlsLklzSGFzaCh0aGlzW2tleV0pICl7CiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBwaS51dGlsLkhhc2guY2xvbmUoIAogICAgICAgICAgICAgICAgICAgIHRoaXNbIGtleSBdLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKF9rZXksX29iamVjdCl7CiAgICAgICAgICAgICAgICAgICAgICB0aGlzWyBfa2V5IF0uX3BhcmVudF8gPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvL3RoaXNba2V5XS5fcGFyZW50XyA9IHRoaXM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmFzZS5jcmVhdGVBY2Nlc3NvcnMoIF9wLCB0aGlzICk7CiAgICAgICAgaWYoYmFzZS5pbml0KQogICAgICAgICAgcmV0dXJuIGJhc2UuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH07CiAgICAgIHRoaXMubW92ZVByaXZhdGVNZW1iZXJzKHRoaXMuYm9keSxfcHJpdmF0ZSk7CiAgICAgIGlmKHRoaXMuaW5pdCl7CiAgICAgICAgZm5bIiRJbml0Il0gPSB0aGlzLmluaXQ7CiAgICAgIH07CiAgICAgIGZuLnByb3RvdHlwZSA9IHRoaXMuYm9keTsKICAgICAgcmV0dXJuIGZuOwogICAgfTsKCiAgICB0aGlzLmNyZWF0ZUFjY2Vzc29ycyA9IGZ1bmN0aW9uKF9wLCBfYnJhbmNoKXsKICAgICAgdmFyIGdldHRlciA9IGZ1bmN0aW9uKF9wcm9wZXJ0eSl7IHJldHVybiB0aGlzW19wcm9wZXJ0eV07IH0sCiAgICAgIHNldHRlciA9IGZ1bmN0aW9uKF9wcm9wZXJ0eSxfdmFsdWUpeyB0aGlzW19wcm9wZXJ0eV0gPSBfdmFsdWU7IHJldHVybiBfYnJhbmNoLl9wYXJlbnRffHxfYnJhbmNoOyB9OwoKICAgICAgZm9yICh2YXIgbmFtZSBpbiBfcCkgewogICAgICAgIHZhciBpc1ByaXZhdGUgPSBuYW1lLnN1YnN0cmluZygwLCAxKSA9PSAiXyIsIHRpdGxlID0gbmFtZS5zdWJzdHJpbmcoMSwgMikudG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDIpOwoKICAgICAgICBpZiAoaXNQcml2YXRlKSB7CiAgICAgICAgICBfYnJhbmNoWyhfYnJhbmNoWyJnZXQiICsgdGl0bGVdPyJfIjoiIikrImdldCIgKyB0aXRsZV0gPSBwaS51dGlsLkN1cnJ5KGdldHRlcixfcCxuYW1lKTsKICAgICAgICAgIF9icmFuY2hbKF9icmFuY2hbInNldCIgKyB0aXRsZV0/Il8iOiIiKSsic2V0IiArIHRpdGxlXSA9IHBpLnV0aWwuQ3Vycnkoc2V0dGVyLF9wLG5hbWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgICAgaWYgKHBpLnV0aWwuSXNIYXNoKF9wW25hbWVdKSl7CiAgICAgICAgICAgIF9icmFuY2hbbmFtZV0uX3BhcmVudF8gPSBfYnJhbmNoOwogICAgICAgICAgICBpZighX2JyYW5jaFtuYW1lXSkKICAgICAgICAgICAgICBfYnJhbmNoW25hbWVdID0ge307CiAgICAgICAgICAgIHRoaXMuY3JlYXRlQWNjZXNzb3JzKF9wW25hbWVdLCBfYnJhbmNoW25hbWVdKTsKICAgICAgICAgIH0gICAKICAgICAgfTsKICAgIH07CgogICAgdGhpcy5tb3ZlUHJpdmF0ZU1lbWJlcnMgPSBmdW5jdGlvbihfb2JqZWN0LCBfYnJhbmNoKXsKICAgICAgZm9yICh2YXIgbmFtZSBpbiBfb2JqZWN0KSB7CiAgICAgICAgdmFyIGlzUHJpdmF0ZSA9IG5hbWUuc3Vic3RyaW5nKDAsIDEpID09ICJfIjsKCiAgICAgICAgaWYgKGlzUHJpdmF0ZSkgewogICAgICAgICAgX2JyYW5jaFtuYW1lXSA9IF9vYmplY3RbbmFtZV07CiAgICAgICAgICBkZWxldGUgX29iamVjdFtuYW1lXTsKICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICAgIGlmIChwaS51dGlsLklzSGFzaChfb2JqZWN0W25hbWVdKSl7CiAgICAgICAgICAgIF9icmFuY2hbbmFtZV0gPSB7fTsKICAgICAgICAgICAgdGhpcy5tb3ZlUHJpdmF0ZU1lbWJlcnMoX29iamVjdFtuYW1lXSwgX2JyYW5jaFtuYW1lXSk7CiAgICAgICAgICB9CiAgICAgIH07CiAgICB9OwogIH07CgogIHBpLmVsZW1lbnQgPSBuZXcgcGkuYmFzZTsKICBwaS5lbGVtZW50LmluaXQgPSBmdW5jdGlvbihfdmFsKXsKICAgIHRoaXMuZW52aXJvbm1lbnQuc2V0RWxlbWVudCgKICAgICAgICB0eXBlb2YgX3ZhbD09InN0cmluZyJ8fCFfdmFsPwogICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KF92YWx8fCJESVYiKToKICAgICAgICAgICAgICBfdmFsCiAgICApOwogICAgcmV0dXJuIHRoaXM7CiAgfTsKCiAgcGkuZWxlbWVudC5ib2R5ID0gewogICAgImFkZFN0eWxlIjpmdW5jdGlvbigpewogICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudC5hZGRTdHlsZS5hcHBseSh0aGlzLmVudmlyb25tZW50LGFyZ3VtZW50cyk7CiAgICB9LAogICAgImNsZWFuIjpmdW5jdGlvbigpewogICAgICB2YXIgY2hpbGRzID0gdGhpcy5jaGlsZC5nZXQoKTsKICAgICAgd2hpbGUoY2hpbGRzLmxlbmd0aCl7CiAgICAgICAgY2hpbGRzWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGRzWzBdKTsKICAgICAgfQogICAgfSwKICAgICJjbG9uZSI6ZnVuY3Rpb24oX2RlZXApewogICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCkuY2xvbmVOb2RlKF9kZWVwKTsKICAgIH0sCiAgICAiaW5zZXJ0IjpmdW5jdGlvbihfZWxlbWVudCl7CiAgICAgIF9lbGVtZW50ID0gX2VsZW1lbnQuZW52aXJvbm1lbnQ/X2VsZW1lbnQuZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpOl9lbGVtZW50OwogICAgICBfZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmVudmlyb25tZW50LmdldEVsZW1lbnQoKSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgICJpbnNlcnRBZnRlciI6ZnVuY3Rpb24oX3JlZmVyZW5jZUVsZW1lbnQpewogICAgICBfcmVmZXJlbmNlRWxlbWVudCA9IF9yZWZlcmVuY2VFbGVtZW50LmVudmlyb25tZW50P19yZWZlcmVuY2VFbGVtZW50LmVudmlyb25tZW50LmdldEVsZW1lbnQoKTpfcmVmZXJlbmNlRWxlbWVudDsKICAgICAgX3JlZmVyZW5jZUVsZW1lbnQubmV4dFNpYmxpbmc/dGhpcy5pbnNlcnRCZWZvcmUoX3JlZmVyZW5jZUVsZW1lbnQubmV4dFNpYmxpbmcpOnRoaXMuaW5zZXJ0KF9yZWZlcmVuY2VFbGVtZW50LnBhcmVudE5vZGUpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICAiaW5zZXJ0QmVmb3JlIjpmdW5jdGlvbihfcmVmZXJlbmNlRWxlbWVudCl7CiAgICAgIF9yZWZlcmVuY2VFbGVtZW50ID0gX3JlZmVyZW5jZUVsZW1lbnQuZW52aXJvbm1lbnQ/X3JlZmVyZW5jZUVsZW1lbnQuZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpOl9yZWZlcmVuY2VFbGVtZW50OwogICAgICBfcmVmZXJlbmNlRWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmVudmlyb25tZW50LmdldEVsZW1lbnQoKSxfcmVmZXJlbmNlRWxlbWVudCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgICJxdWVyeSI6ZnVuY3Rpb24oX2V4cHJlc3Npb24sX3Jlc3VsdFR5cGUsbmFtZXNwYWNlUmVzb2x2ZXIsX3Jlc3VsdCl7CiAgICAgIHJldHVybiBwaS54cGF0aChfZXhwcmVzc2lvbixfcmVzdWx0VHlwZXx8Ik9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFIix0aGlzLmVudmlyb25tZW50LmdldEVsZW1lbnQoKSxfbmFtZXNwYWNlUmVzb2x2ZXIsX3Jlc3VsdCk7CiAgICB9LAogICAgInJlbW92ZSI6ZnVuY3Rpb24oKXsKICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuZ2V0UGFyZW50KCkpIHsKICAgICAgICB0aGlzLmVudmlyb25tZW50LmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKHRoaXMuZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpKTsKICAgICAgfQogICAgfSwKICAgICJ1cGRhdGUiOmZ1bmN0aW9uKF92YWx1ZSl7CiAgICAgIHRoaXMuZWxlbWVudFt0aGlzLmVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09InRleHRhcmVhInx8dGhpcy5lbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PSJpbnB1dCI/InZhbHVlIjoiaW5uZXJIVE1MIl09X3ZhbHVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICAiYXR0cmlidXRlIjp7CiAgICAgICJnZXRBbGwiOmZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudF8uZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLmF0dHJpYnV0ZXM7CiAgICAgIH0sCiAgICAgICJjbGVhciI6ZnVuY3Rpb24oX25hbWUpewogICAgICAgIHRoaXMuc2V0KF9uYW1lLCIiKTsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50XzsKICAgICAgfSwKICAgICAgImdldCI6ZnVuY3Rpb24oX25hbWUpewogICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRfLmVudmlyb25tZW50LmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoX25hbWUpOwogICAgICB9LAogICAgICAiaGFzIjpmdW5jdGlvbihfbmFtZSl7CiAgICAgICAgcmV0dXJuIHBpLmVudi5pZT8odGhpcy5nZXQoX25hbWUpIT1udWxsKTp0aGlzLl9wYXJlbnRfLmVudmlyb25tZW50LmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoX25hbWUpOwogICAgICB9LAogICAgICAicmVtb3ZlIjpmdW5jdGlvbihfbmFtZSl7CiAgICAgICAgdGhpcy5fcGFyZW50Xy5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlKF9uYW1lKTsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50XzsKICAgICAgfSwKICAgICAgInNldCI6ZnVuY3Rpb24oX25hbWUsX3ZhbHVlKXsKICAgICAgICB0aGlzLl9wYXJlbnRfLmVudmlyb25tZW50LmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoX25hbWUsX3ZhbHVlKTsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50XzsKICAgICAgfSwKICAgICAgImFkZENsYXNzIjpmdW5jdGlvbihfY2xhc3Nlcyl7CiAgICAgICAgZm9yKHZhciBpPTAsbGVuPWFyZ3VtZW50cy5sZW5ndGg7IGk8bGVuOyBpKyspewogICAgICAgICAgcGkudXRpbC5FbGVtZW50LmFkZENsYXNzKHRoaXMuX3BhcmVudF8uZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLGFyZ3VtZW50c1tpXSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50XzsKICAgICAgfSwKICAgICAgImNsZWFyQ2xhc3MiOmZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5zZXRDbGFzcygiIik7CiAgICAgICAgdGhpcy5fcGFyZW50XzsKICAgICAgfSwKICAgICAgImdldENsYXNzIjpmdW5jdGlvbigpewogICAgICAgIHJldHVybiBwaS51dGlsLkVsZW1lbnQuZ2V0Q2xhc3MoIHRoaXMuX3BhcmVudF8uZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpICk7CiAgICAgIH0sCiAgICAgICJoYXNDbGFzcyI6ZnVuY3Rpb24oX2NsYXNzKXsKICAgICAgICByZXR1cm4gcGkudXRpbC5FbGVtZW50Lmhhc0NsYXNzKCB0aGlzLl9wYXJlbnRfLmVudmlyb25tZW50LmdldEVsZW1lbnQoKSwgX2NsYXNzICk7CiAgICAgIH0sCiAgICAgICJzZXRDbGFzcyI6ZnVuY3Rpb24oX3ZhbHVlKXsKICAgICAgICByZXR1cm4gcGkudXRpbC5FbGVtZW50LnNldENsYXNzKCB0aGlzLl9wYXJlbnRfLmVudmlyb25tZW50LmdldEVsZW1lbnQoKSwgX3ZhbHVlICk7CiAgICAgIH0sCiAgICAgICJyZW1vdmVDbGFzcyI6ZnVuY3Rpb24oX2NsYXNzKXsKICAgICAgICBwaS51dGlsLkVsZW1lbnQucmVtb3ZlQ2xhc3MoIHRoaXMuX3BhcmVudF8uZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLCBfY2xhc3MgKTsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50XzsKICAgICAgfSwKICAgICAgInRvZ2dsZUNsYXNzIjpmdW5jdGlvbihfY2xhc3MpewogICAgICAgIHBpLnV0aWwuRWxlbWVudC50b2dnbGVDbGFzcyggdGhpcy5fcGFyZW50Xy5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCksIF9jbGFzcyApOwogICAgICB9CiAgICB9LAogICAgImNoaWxkIjp7CiAgICAgICJnZXQiOmZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudF8uZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLmNoaWxkTm9kZXM7CiAgICAgIH0sCiAgICAgICJhZGQiOmZ1bmN0aW9uKF9lbGVtZW50cyl7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBlbCA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgIHRoaXMuX3BhcmVudF8uZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKAogICAgICAgICAgICAgIGVsLmVudmlyb25tZW50ID8gZWwuZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpIDogZWwKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRfOwogICAgICB9LAogICAgICAiYWRkQWZ0ZXIiOmZ1bmN0aW9uKF9lbGVtZW50LF9yZWZlcmVuY2VFbGVtZW50KXsKICAgICAgICB0aGlzLmFkZEJlZm9yZSgKICAgICAgICAgICAgX2VsZW1lbnQuZW52aXJvbm1lbnQ/X2VsZW1lbnQuZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpOl9lbGVtZW50LAogICAgICAgICAgICAgICAgKF9yZWZlcmVuY2VFbGVtZW50LmVudmlyb25tZW50P19yZWZlcmVuY2VFbGVtZW50LmVudmlyb25tZW50LmdldEVsZW1lbnQoKTpfcmVmZXJlbmNlRWxlbWVudCkubmV4dFNpYmxpbmcKICAgICAgICApOwogICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRfOwogICAgICB9LAogICAgICAiYWRkQmVmb3JlIjpmdW5jdGlvbihfZWxlbWVudCxfcmVmZXJlbmNlRWxlbWVudCl7CiAgICAgICAgdGhpcy5fcGFyZW50Xy5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCkuaW5zZXJ0QmVmb3JlKAogICAgICAgICAgICBfZWxlbWVudC5lbnZpcm9ubWVudD9fZWxlbWVudC5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCk6X2VsZW1lbnQsCiAgICAgICAgICAgICAgICBfcmVmZXJlbmNlRWxlbWVudC5lbnZpcm9ubWVudD9fcmVmZXJlbmNlRWxlbWVudC5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCk6X3JlZmVyZW5jZUVsZW1lbnQKICAgICAgICApOwogICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRfOwogICAgICB9LAogICAgICAicmVtb3ZlIjpmdW5jdGlvbihfZWxlbWVudCl7CiAgICAgICAgdGhpcy5fcGFyZW50Xy5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCkucmVtb3ZlQ2hpbGQoX2VsZW1lbnQuZW52aXJvbm1lbnQ/X2VsZW1lbnQuZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpOl9lbGVtZW50KTsKICAgICAgfQogICAgfSwKICAgICJlbnZpcm9ubWVudCI6ewogICAgICAiX2VsZW1lbnQiOm51bGwsCiAgICAgICJzZXRFbGVtZW50IjpmdW5jdGlvbihfdmFsdWUpewogICAgICAgIHRoaXMuX3BhcmVudF8uZWxlbWVudCA9IF92YWx1ZTsKICAgICAgICB0aGlzLl9wYXJlbnRfLmVsZW1lbnQubGliID0gdGhpcy5fcGFyZW50XzsKICAgICAgICB0aGlzLl9wYXJlbnRfLmVsZW1lbnQuZmlyZWJ1Z0VsZW1lbnQgPSB0cnVlOwogICAgICAgIHRoaXMuX3NldEVsZW1lbnQoX3ZhbHVlKTsKICAgICAgfSwKICAgICAgImdldFBhcmVudCI6ZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50KCkucGFyZW50Tm9kZTsKICAgICAgfSwKICAgICAgImdldFBvc2l0aW9uIjpmdW5jdGlvbigpewogICAgICAgIHJldHVybiBwaS51dGlsLkVsZW1lbnQuZ2V0UG9zaXRpb24odGhpcy5nZXRFbGVtZW50KCkpOwogICAgICB9LAogICAgICAiZ2V0U2l6ZSI6ZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gcGkudXRpbC5FbGVtZW50LmdldFNpemUoIHRoaXMuZ2V0RWxlbWVudCgpICk7CiAgICAgIH0sCiAgICAgICJhZGRTdHlsZSI6ZnVuY3Rpb24oX3N0eWxlT2JqZWN0KXsKICAgICAgICBwaS51dGlsLkVsZW1lbnQuYWRkU3R5bGUodGhpcy5nZXRFbGVtZW50KCksX3N0eWxlT2JqZWN0KTsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50XzsKICAgICAgfSwKICAgICAgImdldFN0eWxlIjpmdW5jdGlvbihfcHJvcGVydHkpewogICAgICAgIHJldHVybiBwaS51dGlsLkVsZW1lbnQuZ2V0U3R5bGUodGhpcy5nZXRFbGVtZW50KCksX3Byb3BlcnR5KTsKICAgICAgfSwKICAgICAgImdldE5hbWUiOmZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWxlbWVudCgpLm5vZGVOYW1lOwogICAgICB9LAogICAgICAiZ2V0VHlwZSI6ZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50KCkubm9kZVR5cGU7CiAgICAgIH0sCiAgICAgICJnZXRWYWx1ZSI6ZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gcGkudXRpbC5FbGVtZW50LmdldFZhbHVlKHRoaXMuZ2V0RWxlbWVudCgpKTsKICAgICAgfSwKICAgICAgImdldFZpZXciOmZ1bmN0aW9uKF9wcm9wZXJ0eSl7CiAgICAgICAgcmV0dXJuIHBpLnV0aWwuRWxlbWVudC5nZXRWaWV3KHRoaXMuZ2V0RWxlbWVudCgpLF9wcm9wZXJ0eSk7CiAgICAgIH0KICAgIH0sCiAgICAiZXZlbnQiOnsKICAgICAgImFkZExpc3RlbmVyIjpmdW5jdGlvbihfZXZlbnQsX2ZuLF91c2VDYXB0dXJlKXsKICAgICAgICBwaS51dGlsLkFkZEV2ZW50KHRoaXMuX3BhcmVudF8uZW52aXJvbm1lbnQuZ2V0RWxlbWVudCgpLF9ldmVudCxfZm4sX3VzZUNhcHR1cmUpOwogICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRfOwogICAgICB9LAogICAgICAicmVtb3ZlTGlzdGVuZXIiOmZ1bmN0aW9uKF9ldmVudCxfZm4sX3VzZUNhcHR1cmUpewogICAgICAgIHBpLnV0aWwuUmVtb3ZlRXZlbnQodGhpcy5fcGFyZW50Xy5lbnZpcm9ubWVudC5nZXRFbGVtZW50KCksX2V2ZW50LF9mbixfdXNlQ2FwdHVyZSk7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudF87CiAgICAgIH0KICAgIH0KICB9OwogIHBpLmVsZW1lbnQgPSBwaS5lbGVtZW50LmJ1aWxkKCk7CgogIHBpLnhociA9IG5ldyBwaS5iYXNlOwogIHBpLnhoci5pbml0ID0gZnVuY3Rpb24oX3VybCl7CiAgICBpZighd2luZG93LlhNTEh0dHBSZXF1ZXN0KXsKICAgICAgdmFyIG5hbWVzID0gWyJNc3htbDIuWE1MSFRUUC42LjAiLCJNc3htbDIuWE1MSFRUUC4zLjAiLCJNc3htbDIuWE1MSFRUUCIsIk1pY3Jvc29mdC5YTUxIVFRQIl07CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgdGhpcy5lbnZpcm9ubWVudC5zZXRBcGkobmV3IEFjdGl2ZVhPYmplY3QobmFtZXNbaV0pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gY2F0Y2ggKGUpIHsgY29udGludWU7IH0KICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIHRoaXMuZW52aXJvbm1lbnQuc2V0QXBpKG5ldyBYTUxIdHRwUmVxdWVzdCgpKTsKICAgIH0KICAgIHRoaXMuZW52aXJvbm1lbnQuZ2V0QXBpKCkub25yZWFkeXN0YXRlY2hhbmdlPXBpLnV0aWwuQ3VycnkodGhpcy5ldmVudC5yZWFkeXN0YXRlY2hhbmdlLHRoaXMpOwogICAgdGhpcy5lbnZpcm9ubWVudC5zZXRVcmwoX3VybCk7CiAgICB0aGlzLmVudmlyb25tZW50LnNldENhbGxiYWNrKFtdKTsKCiAgICByZXR1cm4gdGhpczsKICB9OwogIHBpLnhoci5ib2R5ID0gewogICAgImFkZENhbGxiYWNrIjogZnVuY3Rpb24oKXsKICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnQuYWRkQ2FsbGJhY2suYXBwbHkodGhpcy5lbnZpcm9ubWVudCxhcmd1bWVudHMpOwogICAgfSwKICAgICJhZGREYXRhIjogZnVuY3Rpb24oKXsKICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnQuYWRkRGF0YS5hcHBseSh0aGlzLmVudmlyb25tZW50LGFyZ3VtZW50cyk7CiAgICB9LAogICAgImFib3J0IjpmdW5jdGlvbigpewogICAgICB0aGlzLmVudmlyb25tZW50LmdldEFwaSgpLmFib3J0KCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgICJzZW5kIjpmdW5jdGlvbigpewogICAgICB2YXIgdXJsID0gdGhpcy5lbnZpcm9ubWVudC5nZXRVcmwoKSwgZGF0YSA9IHRoaXMuZW52aXJvbm1lbnQuZ2V0RGF0YSgpLGRhdGFVcmwgPSAiIjsgCgogICAgICBpZighdGhpcy5lbnZpcm9ubWVudC5nZXRDYWNoZSgpKQogICAgICAgIGRhdGFbImZvcmNlQ2FjaGUiXSA9IE51bWJlcihuZXcgRGF0ZSk7CgogICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkKICAgICAgICBkYXRhVXJsICs9IHBpLnV0aWwuU3RyaW5nLmZvcm1hdCgiezB9PXsxfSYiLGtleSwgZGF0YVtrZXldKTsKCiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LmdldFR5cGUoKT09IkdFVCIpCiAgICAgICAgdXJsICs9ICh1cmwuc2VhcmNoKCJcXD8iKT09LTE/Ij8iOiImIikrcGkudXRpbC5TdHJpbmcuZm9ybWF0KCJ7MH0iLGRhdGFVcmwpOwoKICAgICAgdGhpcy5hcGkub3Blbih0aGlzLmVudmlyb25tZW50LmdldFR5cGUoKSx1cmwsdGhpcy5lbnZpcm9ubWVudC5nZXRBc3luYygpKTsKICAgICAgaWYodGhpcy5lbnZpcm9ubWVudC5nZXRUeXBlKCk9PSJQT1NUIil7CiAgICAgICAgdGhpcy5hcGkuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7CiAgICAgIH07CiAgICAgIHRoaXMuYXBpLnNlbmQodGhpcy5lbnZpcm9ubWVudC5nZXRUeXBlKCk9PSJHRVQiPyIiOmRhdGFVcmwpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIHBpLnhoci5ib2R5LmVudmlyb25tZW50ID0gewogICAgIl9hc3luYyI6dHJ1ZSwgIl9hcGkiOm51bGwsICJfY2FjaGUiOnRydWUsICJfY2FsbGJhY2siOm51bGwsICJfZGF0YSI6e30sICJfdHlwZSI6IkdFVCIsICJfdXJsIjoiIiwKICAgICJzZXRBcGkiOmZ1bmN0aW9uKF92YWx1ZSl7CiAgICAgIHRoaXMuX3BhcmVudF8uYXBpID0gX3ZhbHVlOwogICAgICB0aGlzLl9zZXRBcGkoX3ZhbHVlKTsKICAgIH0sCiAgICAiYWRkQ2FsbGJhY2siOiBmdW5jdGlvbihfcmVhZHlTdGF0ZSxfZm4pewogICAgICB0aGlzLmdldENhbGxiYWNrKCkucHVzaCh7ICJmbiI6X2ZuLCAicmVhZHlTdGF0ZSI6X3JlYWR5U3RhdGUgIH0pOwogICAgICByZXR1cm4gdGhpcy5fcGFyZW50XzsKICAgIH0sCiAgICAiYWRkRGF0YSI6IGZ1bmN0aW9uKF9rZXksX3ZhbHVlKXsKICAgICAgdGhpcy5nZXREYXRhKClbX2tleV0gPSBfdmFsdWU7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRfOwogICAgfSwKICAgICJzZXRUeXBlIjogZnVuY3Rpb24oX3ZhbHVlKXsKICAgICAgdGhpcy5fc2V0VHlwZShfdmFsdWUpOwogICAgICByZXR1cm4gdGhpcy5fcGFyZW50XzsKICAgIH0KICB9OwogIHBpLnhoci5ib2R5LmV2ZW50ID0gewogICAgInJlYWR5c3RhdGVjaGFuZ2UiOmZ1bmN0aW9uKCl7CiAgICAgIHZhciByZWFkeVN0YXRlID0gdGhpcy5lbnZpcm9ubWVudC5nZXRBcGkoKS5yZWFkeVN0YXRlLCBjYWxsYmFjaz10aGlzLmVudmlyb25tZW50LmdldENhbGxiYWNrKCk7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW49Y2FsbGJhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBpZihwaS51dGlsLkFycmF5LmluZGV4T2YoY2FsbGJhY2tbaV0ucmVhZHlTdGF0ZSxyZWFkeVN0YXRlKT4tMSl7CiAgICAgICAgICBjYWxsYmFja1tpXS5mbi5hcHBseSh0aGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9OwogIHBpLnhociA9IHBpLnhoci5idWlsZCgpOwoKICAvKgogICAqIHhtbC54aHIuZ2V0CiAgICovCgogIHBpLnhoci5nZXQgPSBmdW5jdGlvbihfdXJsLF9yZXR1cm5QaU9iamVjdCl7CiAgICB2YXIgcmVxdWVzdCA9IG5ldyBwaS54aHIoKTsKICAgIHJlcXVlc3QuZW52aXJvbm1lbnQuc2V0QXN5bmMoZmFsc2UpOwogICAgcmVxdWVzdC5lbnZpcm9ubWVudC5zZXRVcmwoX3VybCk7CiAgICByZXF1ZXN0LnNlbmQoKTsKICAgIHJldHVybiBfcmV0dXJuUGlPYmplY3Q/cmVxdWVzdDpyZXF1ZXN0LmVudmlyb25tZW50LmdldEFwaSgpOwogIH07CgogIC8qCiAgICogcmVnaXN0ZXJpbmcgb25sb2FkIGV2ZW50IGZvciBpbml0IGZ1bmN0aW9ucwogICAqLwogIHBpLnV0aWwuQWRkRXZlbnQoCiAgICBwaS5lbnYuaWU/d2luZG93OmRvY3VtZW50LAogICAgcGkuZW52LmllPyJsb2FkIjoiRE9NQ29udGVudExvYWRlZCIsCiAgICBmdW5jdGlvbigpewogICAgICBmb3IodmFyIGk9MCxsZW49cGkudXRpbC5Jbml0Lmxlbmd0aDsgaTxsZW47IGkrKyl7CiAgICAgICAgcGkudXRpbC5Jbml0WyBpIF0oKTsKICAgICAgfQogICAgfQogICk7Cn0pKGZpcmVidWcpOwoKd2l0aChmaXJlYnVnKXsKICBpbml0Q29uc29sZSgpOwogIGxpYi51dGlsLkluaXQucHVzaChmaXJlYnVnLmluaXQpOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ForceBlocks.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBGb3JjZUJsb2Nrcy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LA0KCQlpc0lFID0gdGlueW1jZS5pc0lFLA0KCQlpc0dlY2tvID0gdGlueW1jZS5pc0dlY2tvLA0KCQlpc09wZXJhID0gdGlueW1jZS5pc09wZXJhLA0KCQllYWNoID0gdGlueW1jZS5lYWNoLA0KCQlleHRlbmQgPSB0aW55bWNlLmV4dGVuZCwNCgkJVFJVRSA9IHRydWUsDQoJCUZBTFNFID0gZmFsc2U7DQoNCglmdW5jdGlvbiBjbG9uZUZvcm1hdHMobm9kZSkgew0KCQl2YXIgY2xvbmUsIHRlbXAsIGlubmVyOw0KDQoJCWRvIHsNCgkJCWlmICgvXihTUEFOfFNUUk9OR3xCfEVNfEl8Rk9OVHxTVFJJS0V8VSkkLy50ZXN0KG5vZGUubm9kZU5hbWUpKSB7DQoJCQkJaWYgKGNsb25lKSB7DQoJCQkJCXRlbXAgPSBub2RlLmNsb25lTm9kZShmYWxzZSk7DQoJCQkJCXRlbXAuYXBwZW5kQ2hpbGQoY2xvbmUpOw0KCQkJCQljbG9uZSA9IHRlbXA7DQoJCQkJfSBlbHNlIHsNCgkJCQkJY2xvbmUgPSBpbm5lciA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTsNCgkJCQl9DQoNCgkJCQljbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7DQoJCQl9DQoJCX0gd2hpbGUgKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpOw0KDQoJCWlmIChjbG9uZSkNCgkJCXJldHVybiB7d3JhcHBlciA6IGNsb25lLCBpbm5lciA6IGlubmVyfTsNCgl9Ow0KDQoJLy8gQ2hlY2tzIGlmIHRoZSBzZWxlY3Rpb24vY2FyZXQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrIGVsZW1lbnQNCglmdW5jdGlvbiBpc0F0RW5kKHJuZywgcGFyKSB7DQoJCXZhciBybmcyID0gcGFyLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsNCg0KCQlybmcyLnNldFN0YXJ0KHJuZy5lbmRDb250YWluZXIsIHJuZy5lbmRPZmZzZXQpOw0KCQlybmcyLnNldEVuZEFmdGVyKHBhcik7DQoNCgkJLy8gR2V0IG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIGlmIGl0J3MgemVybyB0aGVuIHdlIGFyZSBhdCB0aGUgZW5kIGFuZCBuZWVkIHRvIG1lcmdlIHRoZSBuZXh0IGJsb2NrIGVsZW1lbnQNCgkJcmV0dXJuIHJuZzIuY2xvbmVDb250ZW50cygpLnRleHRDb250ZW50Lmxlbmd0aCA9PSAwOw0KCX07DQoNCglmdW5jdGlvbiBpc0VtcHR5KG4pIHsNCgkJbiA9IG4uaW5uZXJIVE1MOw0KDQoJCW4gPSBuLnJlcGxhY2UoLzwoaW1nfGhyfHRhYmxlfGlucHV0fHNlbGVjdHx0ZXh0YXJlYSlbIFw+XS9naSwgJy0nKTsgLy8gS2VlcCB0aGVzZSBjb252ZXJ0IHRoZW0gdG8gLSBjaGFycw0KCQluID0gbi5yZXBsYWNlKC88W14+XSs+L2csICcnKTsgLy8gUmVtb3ZlIGFsbCB0YWdzDQoNCgkJcmV0dXJuIG4ucmVwbGFjZSgvWyBcdTAwYTBcdFxyXG5dKy9nLCAnJykgPT0gJyc7DQoJfTsNCg0KCWZ1bmN0aW9uIHNwbGl0TGlzdChzZWxlY3Rpb24sIGRvbSwgbGkpIHsNCgkJdmFyIGxpc3RCbG9jaywgYmxvY2s7DQoNCgkJaWYgKGlzRW1wdHkobGkpKSB7DQoJCQlsaXN0QmxvY2sgPSBkb20uZ2V0UGFyZW50KGxpLCAndWwsb2wnKTsNCg0KCQkJaWYgKCFkb20uZ2V0UGFyZW50KGxpc3RCbG9jay5wYXJlbnROb2RlLCAndWwsb2wnKSkgew0KCQkJCWRvbS5zcGxpdChsaXN0QmxvY2ssIGxpKTsNCgkJCQlibG9jayA9IGRvbS5jcmVhdGUoJ3AnLCAwLCAnPGJyIF9tY2VfYm9ndXM9IjEiIC8+Jyk7DQoJCQkJZG9tLnJlcGxhY2UoYmxvY2ssIGxpKTsNCgkJCQlzZWxlY3Rpb24uc2VsZWN0KGJsb2NrLCAxKTsNCgkJCX0NCg0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoNCgkJcmV0dXJuIFRSVUU7DQoJfTsNCg0KCS8qKg0KCSAqIFRoaXMgaXMgYSBpbnRlcm5hbCBjbGFzcyBhbmQgbm8gbWV0aG9kIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGNhbGxlZCBkaXJlY3RseSBmb3JtIHRoZSBvdXQgc2lkZS4NCgkgKi8NCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5Gb3JjZUJsb2NrcycsIHsNCgkJRm9yY2VCbG9ja3MgOiBmdW5jdGlvbihlZCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gZWQuc2V0dGluZ3MsIGVsbTsNCg0KCQkJdC5lZGl0b3IgPSBlZDsNCgkJCXQuZG9tID0gZWQuZG9tOw0KCQkJZWxtID0gKHMuZm9yY2VkX3Jvb3RfYmxvY2sgfHwgJ3AnKS50b0xvd2VyQ2FzZSgpOw0KCQkJcy5lbGVtZW50ID0gZWxtLnRvVXBwZXJDYXNlKCk7DQoNCgkJCWVkLm9uUHJlSW5pdC5hZGQodC5zZXR1cCwgdCk7DQoNCgkJCXQucmVPcGVyYSA9IG5ldyBSZWdFeHAoJyhcXHUwMGEwfCYjMTYwO3wmbmJzcDspPFwvJyArIGVsbSArICc+JywgJ2dpJyk7DQoJCQl0LnJlUGFkZCA9IG5ldyBSZWdFeHAoJzxwKCApKFtePl0rKT48XFxcL3A+fDxwKCApKFtePl0rKVxcXC8+fDxwKCApKFtePl0rKT5cXHMrPFxcXC9wPnw8cD48XFxcL3A+fDxwXFxcLz58PHA+XFxzKzxcXFwvcD4nLnJlcGxhY2UoL3AvZywgZWxtKSwgJ2dpJyk7DQoJCQl0LnJlTmJzcDJCUjEgPSBuZXcgUmVnRXhwKCc8cCggKShbXj5dKyk+W1xcc1xcdTAwYTBdKzxcXFwvcD58PHA+W1xcc1xcdTAwYTBdKzxcXFwvcD4nLnJlcGxhY2UoL3AvZywgZWxtKSwgJ2dpJyk7DQoJCQl0LnJlTmJzcDJCUjIgPSBuZXcgUmVnRXhwKCc8JXAoKShbXj5dKyk+KCZuYnNwO3wmIzE2MDspPFxcXC8lcD58PCVwPigmbmJzcDt8JiMxNjA7KTxcXFwvJXA+Jy5yZXBsYWNlKC8lcC9nLCBlbG0pLCAnZ2knKTsNCgkJCXQucmVCUjJOYnNwID0gbmV3IFJlZ0V4cCgnPHAoICkoW14+XSspPlxccyo8YnIgXFxcLz5cXHMqPFxcXC9wPnw8cD5cXHMqPGJyIFxcXC8+XFxzKjxcXFwvcD4nLnJlcGxhY2UoL3AvZywgZWxtKSwgJ2dpJyk7DQoNCgkJCWZ1bmN0aW9uIHBhZGQoZWQsIG8pIHsNCgkJCQlpZiAoaXNPcGVyYSkNCgkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UodC5yZU9wZXJhLCAnPC8nICsgZWxtICsgJz4nKTsNCg0KCQkJCW8uY29udGVudCA9IHRpbnltY2UuX3JlcGxhY2UodC5yZVBhZGQsICc8JyArIGVsbSArICckMSQyJDMkNCQ1JDY+XHUwMGEwPC8nICsgZWxtICsgJz4nLCBvLmNvbnRlbnQpOw0KDQoJCQkJaWYgKCFpc0lFICYmICFpc09wZXJhICYmIG8uc2V0KSB7DQoJCQkJCS8vIFVzZSAmbmJzcDsgaW5zdGVhZCBvZiBCUiBpbiBwYWRkZWQgcGFyYWdyYXBocw0KCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSh0LnJlTmJzcDJCUjEsICc8JyArIGVsbSArICckMSQyPjxiciAvPjwvJyArIGVsbSArICc+Jyk7DQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKHQucmVOYnNwMkJSMiwgJzwnICsgZWxtICsgJyQxJDI+PGJyIC8+PC8nICsgZWxtICsgJz4nKTsNCgkJCQl9IGVsc2UNCgkJCQkJby5jb250ZW50ID0gdGlueW1jZS5fcmVwbGFjZSh0LnJlQlIyTmJzcCwgJzwnICsgZWxtICsgJyQxJDI+XHUwMGEwPC8nICsgZWxtICsgJz4nLCBvLmNvbnRlbnQpOw0KCQkJfTsNCg0KCQkJZWQub25CZWZvcmVTZXRDb250ZW50LmFkZChwYWRkKTsNCgkJCWVkLm9uUG9zdFByb2Nlc3MuYWRkKHBhZGQpOw0KDQoJCQlpZiAocy5mb3JjZWRfcm9vdF9ibG9jaykgew0KCQkJCWVkLm9uSW5pdC5hZGQodC5mb3JjZVJvb3RzLCB0KTsNCgkJCQllZC5vblNldENvbnRlbnQuYWRkKHQuZm9yY2VSb290cywgdCk7DQoJCQkJZWQub25CZWZvcmVHZXRDb250ZW50LmFkZCh0LmZvcmNlUm9vdHMsIHQpOw0KCQkJfQ0KCQl9LA0KDQoJCXNldHVwIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIHMgPSBlZC5zZXR0aW5ncywgZG9tID0gZWQuZG9tLCBzZWxlY3Rpb24gPSBlZC5zZWxlY3Rpb247DQoNCgkJCS8vIEZvcmNlIHJvb3QgYmxvY2tzIHdoZW4gdHlwaW5nIGFuZCB3aGVuIGdldHRpbmcgb3V0cHV0DQoJCQlpZiAocy5mb3JjZWRfcm9vdF9ibG9jaykgew0KCQkJCWVkLm9uQmVmb3JlRXhlY0NvbW1hbmQuYWRkKHQuZm9yY2VSb290cywgdCk7DQoJCQkJZWQub25LZXlVcC5hZGQodC5mb3JjZVJvb3RzLCB0KTsNCgkJCQllZC5vblByZVByb2Nlc3MuYWRkKHQuZm9yY2VSb290cywgdCk7DQoJCQl9DQoNCgkJCWlmIChzLmZvcmNlX2JyX25ld2xpbmVzKSB7DQoJCQkJLy8gRm9yY2UgSUUgdG8gcHJvZHVjZSBCUnMgb24gZW50ZXINCgkJCQlpZiAoaXNJRSkgew0KCQkJCQllZC5vbktleVByZXNzLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJdmFyIG47DQoNCgkJCQkJCWlmIChlLmtleUNvZGUgPT0gMTMgJiYgc2VsZWN0aW9uLmdldE5vZGUoKS5ub2RlTmFtZSAhPSAnTEknKSB7DQoJCQkJCQkJc2VsZWN0aW9uLnNldENvbnRlbnQoJzxiciBpZD0iX18iIC8+ICcsIHtmb3JtYXQgOiAncmF3J30pOw0KCQkJCQkJCW4gPSBkb20uZ2V0KCdfXycpOw0KCQkJCQkJCW4ucmVtb3ZlQXR0cmlidXRlKCdpZCcpOw0KCQkJCQkJCXNlbGVjdGlvbi5zZWxlY3Qobik7DQoJCQkJCQkJc2VsZWN0aW9uLmNvbGxhcHNlKCk7DQoJCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAocy5mb3JjZV9wX25ld2xpbmVzKSB7DQoJCQkJaWYgKCFpc0lFKSB7DQoJCQkJCWVkLm9uS2V5UHJlc3MuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCQlpZiAoZS5rZXlDb2RlID09IDEzICYmICFlLnNoaWZ0S2V5ICYmICF0Lmluc2VydFBhcmEoZSkpDQoJCQkJCQkJRXZlbnQuY2FuY2VsKGUpOw0KCQkJCQl9KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBVbmdseSBoYWNrIHRvIGZvciBJRSB0byBwcmVzZXJ2ZSB0aGUgZm9ybWF0dGluZyB3aGVuIHlvdSBwcmVzcw0KCQkJCQkvLyBlbnRlciBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZWxlbWVudCB3aXRoIGZvcm1hdHRlZCBjb250ZW50cw0KCQkJCQkvLyBUaGlzIGxvZ2ljIG92ZXJyaWRlcyB0aGUgYnJvd3NlcnMgZGVmYXVsdCBsb2dpYyB3aXRoDQoJCQkJCS8vIGN1c3RvbSBsb2dpYyB0aGF0IGVuYWJsZXMgdXMgdG8gY29udHJvbCB0aGUgb3V0cHV0DQoJCQkJCXRpbnltY2UuYWRkVW5sb2FkKGZ1bmN0aW9uKCkgew0KCQkJCQkJdC5fcHJldmlvdXNGb3JtYXRzID0gMDsgLy8gRml4IElFIGxlYWsNCgkJCQkJfSk7DQoNCgkJCQkJZWQub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJCXQuX3ByZXZpb3VzRm9ybWF0cyA9IDA7DQoNCgkJCQkJCS8vIENsb25lIHRoZSBjdXJyZW50IGZvcm1hdHMsIHRoaXMgd2lsbCBsYXRlciBiZSBhcHBsaWVkIHRvIHRoZSBuZXcgYmxvY2sgY29udGVudHMNCgkJCQkJCWlmIChlLmtleUNvZGUgPT0gMTMgJiYgIWUuc2hpZnRLZXkgJiYgZWQuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkgJiYgcy5rZWVwX3N0eWxlcykNCgkJCQkJCQl0Ll9wcmV2aW91c0Zvcm1hdHMgPSBjbG9uZUZvcm1hdHMoZWQuc2VsZWN0aW9uLmdldFN0YXJ0KCkpOw0KCQkJCQl9KTsNCg0KCQkJCQllZC5vbktleVVwLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJLy8gTGV0IElFIGJyZWFrIHRoZSBlbGVtZW50IGFuZCB0aGUgd3JhcCB0aGUgbmV3IGNhcmV0IGxvY2F0aW9uIGluIHRoZSBwcmV2aW91cyBmb3JtYXRzDQoJCQkJCQlpZiAoZS5rZXlDb2RlID09IDEzICYmICFlLnNoaWZ0S2V5KSB7DQoJCQkJCQkJdmFyIHBhcmVudCA9IGVkLnNlbGVjdGlvbi5nZXRTdGFydCgpLCBmbXQgPSB0Ll9wcmV2aW91c0Zvcm1hdHM7DQoNCgkJCQkJCQkvLyBQYXJlbnQgaXMgYW4gZW1wdHkgYmxvY2sNCgkJCQkJCQlpZiAoIXBhcmVudC5oYXNDaGlsZE5vZGVzKCkgJiYgZm10KSB7DQoJCQkJCQkJCXBhcmVudCA9IGRvbS5nZXRQYXJlbnQocGFyZW50LCBkb20uaXNCbG9jayk7DQoNCgkJCQkJCQkJaWYgKHBhcmVudCAmJiBwYXJlbnQubm9kZU5hbWUgIT0gJ0xJJykgew0KCQkJCQkJCQkJcGFyZW50LmlubmVySFRNTCA9ICcnOw0KDQoJCQkJCQkJCQlpZiAodC5fcHJldmlvdXNGb3JtYXRzKSB7DQoJCQkJCQkJCQkJcGFyZW50LmFwcGVuZENoaWxkKGZtdC53cmFwcGVyKTsNCgkJCQkJCQkJCQlmbXQuaW5uZXIuaW5uZXJIVE1MID0gJ1x1RkVGRic7DQoJCQkJCQkJCQl9IGVsc2UNCgkJCQkJCQkJCQlwYXJlbnQuaW5uZXJIVE1MID0gJ1x1RkVGRic7DQoNCgkJCQkJCQkJCXNlbGVjdGlvbi5zZWxlY3QocGFyZW50LCAxKTsNCgkJCQkJCQkJCWVkLmdldERvYygpLmV4ZWNDb21tYW5kKCdEZWxldGUnLCBmYWxzZSwgbnVsbCk7DQoJCQkJCQkJCQl0Ll9wcmV2aW91c0Zvcm1hdHMgPSAwOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQlpZiAoaXNHZWNrbykgew0KCQkJCQllZC5vbktleURvd24uYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCQlpZiAoKGUua2V5Q29kZSA9PSA4IHx8IGUua2V5Q29kZSA9PSA0NikgJiYgIWUuc2hpZnRLZXkpDQoJCQkJCQkJdC5iYWNrc3BhY2VEZWxldGUoZSwgZS5rZXlDb2RlID09IDgpOw0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFdvcmthcm91bmQgZm9yIG1pc3Npbmcgc2hpZnQrZW50ZXIgc3VwcG9ydCwgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY5NzMNCgkJCWlmICh0aW55bWNlLmlzV2ViS2l0KSB7DQoJCQkJZnVuY3Rpb24gaW5zZXJ0QnIoZWQpIHsNCgkJCQkJdmFyIHJuZyA9IHNlbGVjdGlvbi5nZXRSbmcoKSwgYnIsIGRpdiA9IGRvbS5jcmVhdGUoJ2RpdicsIG51bGwsICcgJyksIGRpdllQb3MsIHZwSGVpZ2h0ID0gZG9tLmdldFZpZXdQb3J0KGVkLmdldFdpbigpKS5oOw0KDQoJCQkJCS8vIEluc2VydCBCUiBlbGVtZW50DQoJCQkJCXJuZy5pbnNlcnROb2RlKGJyID0gZG9tLmNyZWF0ZSgnYnInKSk7DQoNCgkJCQkJLy8gUGxhY2UgY2FyZXQgYWZ0ZXIgQlINCgkJCQkJcm5nLnNldFN0YXJ0QWZ0ZXIoYnIpOw0KCQkJCQlybmcuc2V0RW5kQWZ0ZXIoYnIpOw0KCQkJCQlzZWxlY3Rpb24uc2V0Um5nKHJuZyk7DQoNCgkJCQkJLy8gQ291bGQgbm90IHBsYWNlIGNhcmV0IGFmdGVyIEJSIHRoZW4gaW5zZXJ0IGFuIG5ic3AgZW50aXR5IGFuZCBtb3ZlIHRoZSBjYXJldA0KCQkJCQlpZiAoc2VsZWN0aW9uLmdldFNlbCgpLmZvY3VzTm9kZSA9PSBici5wcmV2aW91c1NpYmxpbmcpIHsNCgkJCQkJCXNlbGVjdGlvbi5zZWxlY3QoZG9tLmluc2VydEFmdGVyKGRvbS5kb2MuY3JlYXRlVGV4dE5vZGUoJ1x1MDBhMCcpLCBicikpOw0KCQkJCQkJc2VsZWN0aW9uLmNvbGxhcHNlKFRSVUUpOw0KCQkJCQl9DQoNCgkJCQkJLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IERJViBhZnRlciB0aGUgQlIgYW5kIGdldCB0aGUgcG9zaXRpb24gYXMgaXQNCgkJCQkJLy8gc2VlbXMgbGlrZSBnZXRQb3MoKSByZXR1cm5zIDAgZm9yIHRleHQgbm9kZXMgYW5kIEJSIGVsZW1lbnRzLg0KCQkJCQlkb20uaW5zZXJ0QWZ0ZXIoZGl2LCBicik7DQoJCQkJCWRpdllQb3MgPSBkb20uZ2V0UG9zKGRpdikueTsNCgkJCQkJZG9tLnJlbW92ZShkaXYpOw0KDQoJCQkJCS8vIFNjcm9sbCB0byBuZXcgcG9zaXRpb24sIHNjcm9sbEludG9WaWV3IGNhbid0IGJlIHVzZWQgZHVlIHRvIGJ1ZzogaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMTcNCgkJCQkJaWYgKGRpdllQb3MgPiB2cEhlaWdodCkgLy8gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBzY3JvbGwgaWYgdGhlIERJViBpcyBpbnNpZGUgdGhlIHZpZXcgcG9ydC4NCgkJCQkJCWVkLmdldFdpbigpLnNjcm9sbFRvKDAsIGRpdllQb3MpOw0KCQkJCX07DQoNCgkJCQllZC5vbktleVByZXNzLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQlpZiAoZS5rZXlDb2RlID09IDEzICYmIChlLnNoaWZ0S2V5IHx8IChzLmZvcmNlX2JyX25ld2xpbmVzICYmICFkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXROb2RlKCksICdoMSxoMixoMyxoNCxoNSxoNixvbCx1bCcpKSkpIHsNCgkJCQkJCWluc2VydEJyKGVkKTsNCgkJCQkJCUV2ZW50LmNhbmNlbChlKTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBQYWRkIGVtcHR5IGlubGluZSBlbGVtZW50cyB3aXRoaW4gYmxvY2sgZWxlbWVudHMNCgkJCS8vIEZvciBleGFtcGxlOiA8cD48c3Ryb25nPjxlbT48L2VtPjwvc3Ryb25nPjwvcD4gYmVjb21lcyA8cD48c3Ryb25nPjxlbT4mbmJzcDs8L2VtPjwvc3Ryb25nPjwvcD4NCgkJCWVkLm9uUHJlUHJvY2Vzcy5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQllYWNoKGRvbS5zZWxlY3QoJ3AsaDEsaDIsaDMsaDQsaDUsaDYsZGl2Jywgby5ub2RlKSwgZnVuY3Rpb24ocCkgew0KCQkJCQlpZiAoaXNFbXB0eShwKSkgew0KCQkJCQkJZWFjaChkb20uc2VsZWN0KCdzcGFuLGVtLHN0cm9uZyxiLGknLCBvLm5vZGUpLCBmdW5jdGlvbihuKSB7DQoJCQkJCQkJaWYgKCFuLmhhc0NoaWxkTm9kZXMoKSkgew0KCQkJCQkJCQluLmFwcGVuZENoaWxkKGVkLmdldERvYygpLmNyZWF0ZVRleHROb2RlKCdcdTAwYTAnKSk7DQoJCQkJCQkJCXJldHVybiBGQUxTRTsgLy8gQnJlYWsgdGhlIGxvb3Agb25lIHBhZGRpbmcgaXMgZW5vdWdoDQoJCQkJCQkJfQ0KCQkJCQkJfSk7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQkvLyBJRSBzcGVjaWZpYyBmaXhlcw0KCQkJaWYgKGlzSUUpIHsNCgkJCQkvLyBSZXBsYWNlcyBJRTpzIGF1dG8gZ2VuZXJhdGVkIHBhcmFncmFwaHMgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgbmFtZQ0KCQkJCWlmIChzLmVsZW1lbnQgIT0gJ1AnKSB7DQoJCQkJCWVkLm9uS2V5UHJlc3MuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCQl0Lmxhc3RFbG0gPSBzZWxlY3Rpb24uZ2V0Tm9kZSgpLm5vZGVOYW1lOw0KCQkJCQl9KTsNCg0KCQkJCQllZC5vbktleVVwLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJdmFyIGJsLCBuID0gc2VsZWN0aW9uLmdldE5vZGUoKSwgYiA9IGVkLmdldEJvZHkoKTsNCg0KCQkJCQkJaWYgKGIuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgJiYgbi5ub2RlTmFtZSA9PSAnUCcpIHsNCgkJCQkJCQluID0gZG9tLnJlbmFtZShuLCBzLmVsZW1lbnQpOw0KCQkJCQkJCXNlbGVjdGlvbi5zZWxlY3Qobik7DQoJCQkJCQkJc2VsZWN0aW9uLmNvbGxhcHNlKCk7DQoJCQkJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCQkJCX0gZWxzZSBpZiAoZS5rZXlDb2RlID09IDEzICYmICFlLnNoaWZ0S2V5ICYmIHQubGFzdEVsbSAhPSAnUCcpIHsNCgkJCQkJCQlibCA9IGRvbS5nZXRQYXJlbnQobiwgJ3AnKTsNCg0KCQkJCQkJCWlmIChibCkgew0KCQkJCQkJCQlkb20ucmVuYW1lKGJsLCBzLmVsZW1lbnQpOw0KCQkJCQkJCQllZC5ub2RlQ2hhbmdlZCgpOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KDQoJCWZpbmQgOiBmdW5jdGlvbihuLCB0LCBzKSB7DQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvciwgdyA9IGVkLmdldERvYygpLmNyZWF0ZVRyZWVXYWxrZXIobiwgNCwgbnVsbCwgRkFMU0UpLCBjID0gLTE7DQoNCgkJCXdoaWxlIChuID0gdy5uZXh0Tm9kZSgpKSB7DQoJCQkJYysrOw0KDQoJCQkJLy8gSW5kZXggYnkgbm9kZQ0KCQkJCWlmICh0ID09IDAgJiYgbiA9PSBzKQ0KCQkJCQlyZXR1cm4gYzsNCg0KCQkJCS8vIE5vZGUgYnkgaW5kZXgNCgkJCQlpZiAodCA9PSAxICYmIGMgPT0gcykNCgkJCQkJcmV0dXJuIG47DQoJCQl9DQoNCgkJCXJldHVybiAtMTsNCgkJfSwNCg0KCQlmb3JjZVJvb3RzIDogZnVuY3Rpb24oZWQsIGUpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgYiA9IGVkLmdldEJvZHkoKSwgZCA9IGVkLmdldERvYygpLCBzZSA9IGVkLnNlbGVjdGlvbiwgcyA9IHNlLmdldFNlbCgpLCByID0gc2UuZ2V0Um5nKCksIHNpID0gLTIsIGVpLCBzbywgZW8sIHRyLCBjID0gLTB4RkZGRkZGOw0KCQkJdmFyIG54LCBibCwgYnAsIHNwLCBsZSwgbmwgPSBiLmNoaWxkTm9kZXMsIGksIG4sIGVpZDsNCg0KCQkJLy8gRml4IGZvciBidWcgIzE4NjM4NDcNCgkJCS8vaWYgKGUgJiYgZS5rZXlDb2RlID09IDEzKQ0KCQkJLy8JcmV0dXJuIFRSVUU7DQoNCgkJCS8vIFdyYXAgbm9uIGJsb2NrcyBpbnRvIGJsb2Nrcw0KCQkJZm9yIChpID0gbmwubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQlueCA9IG5sW2ldOw0KDQoJCQkJLy8gSWdub3JlIGludGVybmFsIGVsZW1lbnRzDQoJCQkJaWYgKG54Lm5vZGVUeXBlID09PSAxICYmIG54LmdldEF0dHJpYnV0ZSgnX21jZV90eXBlJykpIHsNCgkJCQkJYmwgPSBudWxsOw0KCQkJCQljb250aW51ZTsNCgkJCQl9DQoNCgkJCQkvLyBJcyB0ZXh0IG9yIG5vbiBibG9jayBlbGVtZW50DQoJCQkJaWYgKG54Lm5vZGVUeXBlID09PSAzIHx8ICghdC5kb20uaXNCbG9jayhueCkgJiYgbngubm9kZVR5cGUgIT09IDggJiYgIS9eKHNjcmlwdHxtY2U6c2NyaXB0fHN0eWxlfG1jZTpzdHlsZSkkL2kudGVzdChueC5ub2RlTmFtZSkpKSB7DQoJCQkJCWlmICghYmwpIHsNCgkJCQkJCS8vIENyZWF0ZSBuZXcgYmxvY2sgYnV0IGlnbm9yZSB3aGl0ZXNwYWNlDQoJCQkJCQlpZiAobngubm9kZVR5cGUgIT0gMyB8fCAvW15cc10vZy50ZXN0KG54Lm5vZGVWYWx1ZSkpIHsNCgkJCQkJCQkvLyBTdG9yZSBzZWxlY3Rpb24NCgkJCQkJCQlpZiAoc2kgPT0gLTIgJiYgcikgew0KCQkJCQkJCQlpZiAoIWlzSUUgfHwgci5zZXRTdGFydCkgew0KCQkJCQkJCQkJLy8gSWYgc2VsZWN0aW9uIGlzIGVsZW1lbnQgdGhlbiBtYXJrIGl0DQoJCQkJCQkJCQlpZiAoci5zdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PSAxICYmIChuID0gci5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3Iuc3RhcnRPZmZzZXRdKSAmJiBuLm5vZGVUeXBlID09IDEpIHsNCgkJCQkJCQkJCQkvLyBTYXZlIHRoZSBpZCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudA0KCQkJCQkJCQkJCWVpZCA9IG4uZ2V0QXR0cmlidXRlKCJpZCIpOw0KCQkJCQkJCQkJCW4uc2V0QXR0cmlidXRlKCJpZCIsICJfX21jZSIpOw0KCQkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCQkvLyBJZiBlbGVtZW50IGlzIGluc2lkZSBib2R5LCBtaWdodCBub3QgYmUgdGhlIGNhc2UgaW4gY29udGVudEVkaWFibGUgbW9kZQ0KCQkJCQkJCQkJCWlmIChlZC5kb20uZ2V0UGFyZW50KHIuc3RhcnRDb250YWluZXIsIGZ1bmN0aW9uKGUpIHtyZXR1cm4gZSA9PT0gYjt9KSkgew0KCQkJCQkJCQkJCQlzbyA9IHIuc3RhcnRPZmZzZXQ7DQoJCQkJCQkJCQkJCWVvID0gci5lbmRPZmZzZXQ7DQoJCQkJCQkJCQkJCXNpID0gdC5maW5kKGIsIDAsIHIuc3RhcnRDb250YWluZXIpOw0KCQkJCQkJCQkJCQllaSA9IHQuZmluZChiLCAwLCByLmVuZENvbnRhaW5lcik7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJLy8gRm9yY2UgY29udHJvbCByYW5nZSBpbnRvIHRleHQgcmFuZ2UNCgkJCQkJCQkJCWlmIChyLml0ZW0pIHsNCgkJCQkJCQkJCQl0ciA9IGQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsNCgkJCQkJCQkJCQl0ci5tb3ZlVG9FbGVtZW50VGV4dChyLml0ZW0oMCkpOw0KCQkJCQkJCQkJCXIgPSB0cjsNCgkJCQkJCQkJCX0NCg0KCQkJCQkJCQkJdHIgPSBkLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7DQoJCQkJCQkJCQl0ci5tb3ZlVG9FbGVtZW50VGV4dChiKTsNCgkJCQkJCQkJCXRyLmNvbGxhcHNlKDEpOw0KCQkJCQkJCQkJYnAgPSB0ci5tb3ZlKCdjaGFyYWN0ZXInLCBjKSAqIC0xOw0KDQoJCQkJCQkJCQl0ciA9IHIuZHVwbGljYXRlKCk7DQoJCQkJCQkJCQl0ci5jb2xsYXBzZSgxKTsNCgkJCQkJCQkJCXNwID0gdHIubW92ZSgnY2hhcmFjdGVyJywgYykgKiAtMTsNCg0KCQkJCQkJCQkJdHIgPSByLmR1cGxpY2F0ZSgpOw0KCQkJCQkJCQkJdHIuY29sbGFwc2UoMCk7DQoJCQkJCQkJCQlsZSA9ICh0ci5tb3ZlKCdjaGFyYWN0ZXInLCBjKSAqIC0xKSAtIHNwOw0KDQoJCQkJCQkJCQlzaSA9IHNwIC0gYnA7DQoJCQkJCQkJCQllaSA9IGxlOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gVXNlcyByZXBsYWNlQ2hpbGQgaW5zdGVhZCBvZiBjbG9uZU5vZGUgc2luY2UgaXQgcmVtb3ZlcyBzZWxlY3RlZCBhdHRyaWJ1dGUgZnJvbSBvcHRpb24gZWxlbWVudHMgb24gSUUNCgkJCQkJCQkvLyBTZWU6IGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvODI5OTA3DQoJCQkJCQkJYmwgPSBlZC5kb20uY3JlYXRlKGVkLnNldHRpbmdzLmZvcmNlZF9yb290X2Jsb2NrKTsNCgkJCQkJCQlueC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChibCwgbngpOw0KCQkJCQkJCWJsLmFwcGVuZENoaWxkKG54KTsNCgkJCQkJCX0NCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWlmIChibC5oYXNDaGlsZE5vZGVzKCkpDQoJCQkJCQkJYmwuaW5zZXJ0QmVmb3JlKG54LCBibC5maXJzdENoaWxkKTsNCgkJCQkJCWVsc2UNCgkJCQkJCQlibC5hcHBlbmRDaGlsZChueCk7DQoJCQkJCX0NCgkJCQl9IGVsc2UNCgkJCQkJYmwgPSBudWxsOyAvLyBUaW1lIHRvIGNyZWF0ZSBuZXcgYmxvY2sNCgkJCX0NCg0KCQkJLy8gUmVzdG9yZSBzZWxlY3Rpb24NCgkJCWlmIChzaSAhPSAtMikgew0KCQkJCWlmICghaXNJRSB8fCByLnNldFN0YXJ0KSB7DQoJCQkJCWJsID0gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShlZC5zZXR0aW5ncy5lbGVtZW50KVswXTsNCgkJCQkJciA9IGQuY3JlYXRlUmFuZ2UoKTsNCg0KCQkJCQkvLyBTZWxlY3QgbGFzdCBsb2NhdGlvbiBvciBnZW5lcmF0ZWQgYmxvY2sNCgkJCQkJaWYgKHNpICE9IC0xKQ0KCQkJCQkJci5zZXRTdGFydCh0LmZpbmQoYiwgMSwgc2kpLCBzbyk7DQoJCQkJCWVsc2UNCgkJCQkJCXIuc2V0U3RhcnQoYmwsIDApOw0KDQoJCQkJCS8vIFNlbGVjdCBsYXN0IGxvY2F0aW9uIG9yIGdlbmVyYXRlZCBibG9jaw0KCQkJCQlpZiAoZWkgIT0gLTEpDQoJCQkJCQlyLnNldEVuZCh0LmZpbmQoYiwgMSwgZWkpLCBlbyk7DQoJCQkJCWVsc2UNCgkJCQkJCXIuc2V0RW5kKGJsLCAwKTsNCg0KCQkJCQlpZiAocykgew0KCQkJCQkJcy5yZW1vdmVBbGxSYW5nZXMoKTsNCgkJCQkJCXMuYWRkUmFuZ2Uocik7DQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQl0cnkgew0KCQkJCQkJciA9IHMuY3JlYXRlUmFuZ2UoKTsNCgkJCQkJCXIubW92ZVRvRWxlbWVudFRleHQoYik7DQoJCQkJCQlyLmNvbGxhcHNlKDEpOw0KCQkJCQkJci5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHNpKTsNCgkJCQkJCXIubW92ZUVuZCgnY2hhcmFjdGVyJywgZWkpOw0KCQkJCQkJci5zZWxlY3QoKTsNCgkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCS8vIElnbm9yZQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIGlmICgoIWlzSUUgfHwgci5zZXRTdGFydCkgJiYgKG4gPSBlZC5kb20uZ2V0KCdfX21jZScpKSkgew0KCQkJCS8vIFJlc3RvcmUgdGhlIGlkIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50DQoJCQkJaWYgKGVpZCkNCgkJCQkJbi5zZXRBdHRyaWJ1dGUoJ2lkJywgZWlkKTsNCgkJCQllbHNlDQoJCQkJCW4ucmVtb3ZlQXR0cmlidXRlKCdpZCcpOw0KDQoJCQkJLy8gTW92ZSBjYXJldCBiZWZvcmUgc2VsZWN0ZWQgZWxlbWVudA0KCQkJCXIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoJCQkJci5zZXRTdGFydEJlZm9yZShuKTsNCgkJCQlyLnNldEVuZEJlZm9yZShuKTsNCgkJCQlzZS5zZXRSbmcocik7DQoJCQl9DQoJCX0sDQoNCgkJZ2V0UGFyZW50QmxvY2sgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgZCA9IHRoaXMuZG9tOw0KDQoJCQlyZXR1cm4gZC5nZXRQYXJlbnQobiwgZC5pc0Jsb2NrKTsNCgkJfSwNCg0KCQlpbnNlcnRQYXJhIDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBkb20gPSBlZC5kb20sIGQgPSBlZC5nZXREb2MoKSwgc2UgPSBlZC5zZXR0aW5ncywgcyA9IGVkLnNlbGVjdGlvbi5nZXRTZWwoKSwgciA9IHMuZ2V0UmFuZ2VBdCgwKSwgYiA9IGQuYm9keTsNCgkJCXZhciByYiwgcmEsIGRpciwgc24sIHNvLCBlbiwgZW8sIHNiLCBlYiwgYm4sIGJlZiwgYWZ0LCBzYywgZWMsIG4sIHZwID0gZG9tLmdldFZpZXdQb3J0KGVkLmdldFdpbigpKSwgeSwgY2gsIGNhcjsNCg0KCQkJLy8gSWYgcm9vdCBibG9ja3MgYXJlIGZvcmNlZCB0aGVuIHVzZSBPcGVyYXMgZGVmYXVsdCBiZWhhdmlvciBzaW5jZSBpdCdzIHJlYWxseSBnb29kDQovLyBSZW1vdmVkIGR1ZSB0byBidWc6ICMxODUzODE2DQovLwkJCWlmIChzZS5mb3JjZWRfcm9vdF9ibG9jayAmJiBpc09wZXJhKQ0KLy8JCQkJcmV0dXJuIFRSVUU7DQoNCgkJCS8vIFNldHVwIGJlZm9yZSByYW5nZQ0KCQkJcmIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoNCgkJCS8vIElmIGlzIGJlZm9yZSB0aGUgZmlyc3QgYmxvY2sgZWxlbWVudCBhbmQgaW4gYm9keSwgdGhlbiBtb3ZlIGl0IGludG8gZmlyc3QgYmxvY2sgZWxlbWVudA0KCQkJcmIuc2V0U3RhcnQocy5hbmNob3JOb2RlLCBzLmFuY2hvck9mZnNldCk7DQoJCQlyYi5jb2xsYXBzZShUUlVFKTsNCg0KCQkJLy8gU2V0dXAgYWZ0ZXIgcmFuZ2UNCgkJCXJhID0gZC5jcmVhdGVSYW5nZSgpOw0KDQoJCQkvLyBJZiBpcyBiZWZvcmUgdGhlIGZpcnN0IGJsb2NrIGVsZW1lbnQgYW5kIGluIGJvZHksIHRoZW4gbW92ZSBpdCBpbnRvIGZpcnN0IGJsb2NrIGVsZW1lbnQNCgkJCXJhLnNldFN0YXJ0KHMuZm9jdXNOb2RlLCBzLmZvY3VzT2Zmc2V0KTsNCgkJCXJhLmNvbGxhcHNlKFRSVUUpOw0KDQoJCQkvLyBTZXR1cCBzdGFydC9lbmQgcG9pbnRzDQoJCQlkaXIgPSByYi5jb21wYXJlQm91bmRhcnlQb2ludHMocmIuU1RBUlRfVE9fRU5ELCByYSkgPCAwOw0KCQkJc24gPSBkaXIgPyBzLmFuY2hvck5vZGUgOiBzLmZvY3VzTm9kZTsNCgkJCXNvID0gZGlyID8gcy5hbmNob3JPZmZzZXQgOiBzLmZvY3VzT2Zmc2V0Ow0KCQkJZW4gPSBkaXIgPyBzLmZvY3VzTm9kZSA6IHMuYW5jaG9yTm9kZTsNCgkJCWVvID0gZGlyID8gcy5mb2N1c09mZnNldCA6IHMuYW5jaG9yT2Zmc2V0Ow0KDQoJCQkvLyBJZiBzZWxlY3Rpb24gaXMgaW4gZW1wdHkgdGFibGUgY2VsbA0KCQkJaWYgKHNuID09PSBlbiAmJiAvXihURHxUSCkkLy50ZXN0KHNuLm5vZGVOYW1lKSkgew0KCQkJCWlmIChzbi5maXJzdENoaWxkLm5vZGVOYW1lID09ICdCUicpDQoJCQkJCWRvbS5yZW1vdmUoc24uZmlyc3RDaGlsZCk7IC8vIFJlbW92ZSBCUg0KDQoJCQkJLy8gQ3JlYXRlIHR3byBuZXcgYmxvY2sgZWxlbWVudHMNCgkJCQlpZiAoc24uY2hpbGROb2Rlcy5sZW5ndGggPT0gMCkgew0KCQkJCQllZC5kb20uYWRkKHNuLCBzZS5lbGVtZW50LCBudWxsLCAnPGJyIC8+Jyk7DQoJCQkJCWFmdCA9IGVkLmRvbS5hZGQoc24sIHNlLmVsZW1lbnQsIG51bGwsICc8YnIgLz4nKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQluID0gc24uaW5uZXJIVE1MOw0KCQkJCQlzbi5pbm5lckhUTUwgPSAnJzsNCgkJCQkJZWQuZG9tLmFkZChzbiwgc2UuZWxlbWVudCwgbnVsbCwgbik7DQoJCQkJCWFmdCA9IGVkLmRvbS5hZGQoc24sIHNlLmVsZW1lbnQsIG51bGwsICc8YnIgLz4nKTsNCgkJCQl9DQoNCgkJCQkvLyBNb3ZlIGNhcmV0IGludG8gdGhlIGxhc3Qgb25lDQoJCQkJciA9IGQuY3JlYXRlUmFuZ2UoKTsNCgkJCQlyLnNlbGVjdE5vZGVDb250ZW50cyhhZnQpOw0KCQkJCXIuY29sbGFwc2UoMSk7DQoJCQkJZWQuc2VsZWN0aW9uLnNldFJuZyhyKTsNCg0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCg0KCQkJLy8gSWYgdGhlIGNhcmV0IGlzIGluIGFuIGludmFsaWQgbG9jYXRpb24gaW4gRkYgd2UgbmVlZCB0byBtb3ZlIGl0IGludG8gdGhlIGZpcnN0IGJsb2NrDQoJCQlpZiAoc24gPT0gYiAmJiBlbiA9PSBiICYmIGIuZmlyc3RDaGlsZCAmJiBlZC5kb20uaXNCbG9jayhiLmZpcnN0Q2hpbGQpKSB7DQoJCQkJc24gPSBlbiA9IHNuLmZpcnN0Q2hpbGQ7DQoJCQkJc28gPSBlbyA9IDA7DQoJCQkJcmIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoJCQkJcmIuc2V0U3RhcnQoc24sIDApOw0KCQkJCXJhID0gZC5jcmVhdGVSYW5nZSgpOw0KCQkJCXJhLnNldFN0YXJ0KGVuLCAwKTsNCgkJCX0NCg0KCQkJLy8gTmV2ZXIgdXNlIGJvZHkgYXMgc3RhcnQgb3IgZW5kIG5vZGUNCgkJCXNuID0gc24ubm9kZU5hbWUgPT0gIkhUTUwiID8gZC5ib2R5IDogc247IC8vIEZpeCBmb3IgT3BlcmEgYnVnOiBodHRwczovL2J1Z3Mub3BlcmEuY29tL3Nob3dfYnVnLmNnaT9pZD0yNzMyMjQmY29tbWVudHM9eWVzDQoJCQlzbiA9IHNuLm5vZGVOYW1lID09ICJCT0RZIiA/IHNuLmZpcnN0Q2hpbGQgOiBzbjsNCgkJCWVuID0gZW4ubm9kZU5hbWUgPT0gIkhUTUwiID8gZC5ib2R5IDogZW47IC8vIEZpeCBmb3IgT3BlcmEgYnVnOiBodHRwczovL2J1Z3Mub3BlcmEuY29tL3Nob3dfYnVnLmNnaT9pZD0yNzMyMjQmY29tbWVudHM9eWVzDQoJCQllbiA9IGVuLm5vZGVOYW1lID09ICJCT0RZIiA/IGVuLmZpcnN0Q2hpbGQgOiBlbjsNCg0KCQkJLy8gR2V0IHN0YXJ0IGFuZCBlbmQgYmxvY2tzDQoJCQlzYiA9IHQuZ2V0UGFyZW50QmxvY2soc24pOw0KCQkJZWIgPSB0LmdldFBhcmVudEJsb2NrKGVuKTsNCgkJCWJuID0gc2IgPyBzYi5ub2RlTmFtZSA6IHNlLmVsZW1lbnQ7IC8vIEdldCBibG9jayBuYW1lIHRvIGNyZWF0ZQ0KDQoJCQkvLyBSZXR1cm4gaW5zaWRlIGxpc3QgdXNlIGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvcg0KCQkJaWYgKG4gPSB0LmRvbS5nZXRQYXJlbnQoc2IsICdsaSxwcmUnKSkgew0KCQkJCWlmIChuLm5vZGVOYW1lID09ICdMSScpDQoJCQkJCXJldHVybiBzcGxpdExpc3QoZWQuc2VsZWN0aW9uLCB0LmRvbSwgbik7DQoNCgkJCQlyZXR1cm4gVFJVRTsNCgkJCX0NCg0KCQkJLy8gSWYgY2FwdGlvbiBvciBhYnNvbHV0ZSBsYXllcnMgdGhlbiBhbHdheXMgZ2VuZXJhdGUgbmV3IGJsb2NrcyB3aXRoaW4NCgkJCWlmIChzYiAmJiAoc2Iubm9kZU5hbWUgPT0gJ0NBUFRJT04nIHx8IC9hYnNvbHV0ZXxyZWxhdGl2ZXxmaXhlZC9naS50ZXN0KGRvbS5nZXRTdHlsZShzYiwgJ3Bvc2l0aW9uJywgMSkpKSkgew0KCQkJCWJuID0gc2UuZWxlbWVudDsNCgkJCQlzYiA9IG51bGw7DQoJCQl9DQoNCgkJCS8vIElmIGNhcHRpb24gb3IgYWJzb2x1dGUgbGF5ZXJzIHRoZW4gYWx3YXlzIGdlbmVyYXRlIG5ldyBibG9ja3Mgd2l0aGluDQoJCQlpZiAoZWIgJiYgKGViLm5vZGVOYW1lID09ICdDQVBUSU9OJyB8fCAvYWJzb2x1dGV8cmVsYXRpdmV8Zml4ZWQvZ2kudGVzdChkb20uZ2V0U3R5bGUoc2IsICdwb3NpdGlvbicsIDEpKSkpIHsNCgkJCQlibiA9IHNlLmVsZW1lbnQ7DQoJCQkJZWIgPSBudWxsOw0KCQkJfQ0KDQoJCQkvLyBVc2UgUCBpbnN0ZWFkDQoJCQlpZiAoLyhURHxUQUJMRXxUSHxDQVBUSU9OKS8udGVzdChibikgfHwgKHNiICYmIGJuID09ICJESVYiICYmIC9sZWZ0fHJpZ2h0L2dpLnRlc3QoZG9tLmdldFN0eWxlKHNiLCAnZmxvYXQnLCAxKSkpKSB7DQoJCQkJYm4gPSBzZS5lbGVtZW50Ow0KCQkJCXNiID0gZWIgPSBudWxsOw0KCQkJfQ0KDQoJCQkvLyBTZXR1cCBuZXcgYmVmb3JlIGFuZCBhZnRlciBibG9ja3MNCgkJCWJlZiA9IChzYiAmJiBzYi5ub2RlTmFtZSA9PSBibikgPyBzYi5jbG9uZU5vZGUoMCkgOiBlZC5kb20uY3JlYXRlKGJuKTsNCgkJCWFmdCA9IChlYiAmJiBlYi5ub2RlTmFtZSA9PSBibikgPyBlYi5jbG9uZU5vZGUoMCkgOiBlZC5kb20uY3JlYXRlKGJuKTsNCg0KCQkJLy8gUmVtb3ZlIGlkIGZyb20gYWZ0ZXIgY2xvbmUNCgkJCWFmdC5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7DQoNCgkJCS8vIElzIGhlYWRlciBhbmQgY3Vyc29yIGlzIGF0IHRoZSBlbmQsIHRoZW4gZm9yY2UgcGFyYWdyYXBoIHVuZGVyDQoJCQlpZiAoL14oSFsxLTZdKSQvLnRlc3QoYm4pICYmIGlzQXRFbmQociwgc2IpKQ0KCQkJCWFmdCA9IGVkLmRvbS5jcmVhdGUoc2UuZWxlbWVudCk7DQoNCgkJCS8vIEZpbmQgc3RhcnQgY2hvcCBub2RlDQoJCQluID0gc2MgPSBzbjsNCgkJCWRvIHsNCgkJCQlpZiAobiA9PSBiIHx8IG4ubm9kZVR5cGUgPT0gOSB8fCB0LmRvbS5pc0Jsb2NrKG4pIHx8IC8oVER8VEFCTEV8VEh8Q0FQVElPTikvLnRlc3Qobi5ub2RlTmFtZSkpDQoJCQkJCWJyZWFrOw0KDQoJCQkJc2MgPSBuOw0KCQkJfSB3aGlsZSAoKG4gPSBuLnByZXZpb3VzU2libGluZyA/IG4ucHJldmlvdXNTaWJsaW5nIDogbi5wYXJlbnROb2RlKSk7DQoNCgkJCS8vIEZpbmQgZW5kIGNob3Agbm9kZQ0KCQkJbiA9IGVjID0gZW47DQoJCQlkbyB7DQoJCQkJaWYgKG4gPT0gYiB8fCBuLm5vZGVUeXBlID09IDkgfHwgdC5kb20uaXNCbG9jayhuKSB8fCAvKFREfFRBQkxFfFRIfENBUFRJT04pLy50ZXN0KG4ubm9kZU5hbWUpKQ0KCQkJCQlicmVhazsNCg0KCQkJCWVjID0gbjsNCgkJCX0gd2hpbGUgKChuID0gbi5uZXh0U2libGluZyA/IG4ubmV4dFNpYmxpbmcgOiBuLnBhcmVudE5vZGUpKTsNCg0KCQkJLy8gUGxhY2UgZmlyc3QgY2hvcCBwYXJ0IGludG8gYmVmb3JlIGJsb2NrIGVsZW1lbnQNCgkJCWlmIChzYy5ub2RlTmFtZSA9PSBibikNCgkJCQlyYi5zZXRTdGFydChzYywgMCk7DQoJCQllbHNlDQoJCQkJcmIuc2V0U3RhcnRCZWZvcmUoc2MpOw0KDQoJCQlyYi5zZXRFbmQoc24sIHNvKTsNCgkJCWJlZi5hcHBlbmRDaGlsZChyYi5jbG9uZUNvbnRlbnRzKCkgfHwgZC5jcmVhdGVUZXh0Tm9kZSgnJykpOyAvLyBFbXB0eSB0ZXh0IG5vZGUgbmVlZGVkIGZvciBTYWZhcmkNCg0KCQkJLy8gUGxhY2Ugc2VjbmQgY2hvcCBwYXJ0IHdpdGhpbiBuZXcgYmxvY2sgZWxlbWVudA0KCQkJdHJ5IHsNCgkJCQlyYS5zZXRFbmRBZnRlcihlYyk7DQoJCQl9IGNhdGNoKGV4KSB7DQoJCQkJLy9jb25zb2xlLmRlYnVnKHMuZm9jdXNOb2RlLCBzLmZvY3VzT2Zmc2V0KTsNCgkJCX0NCg0KCQkJcmEuc2V0U3RhcnQoZW4sIGVvKTsNCgkJCWFmdC5hcHBlbmRDaGlsZChyYS5jbG9uZUNvbnRlbnRzKCkgfHwgZC5jcmVhdGVUZXh0Tm9kZSgnJykpOyAvLyBFbXB0eSB0ZXh0IG5vZGUgbmVlZGVkIGZvciBTYWZhcmkNCg0KCQkJLy8gQ3JlYXRlIHJhbmdlIGFyb3VuZCBldmVyeXRoaW5nDQoJCQlyID0gZC5jcmVhdGVSYW5nZSgpOw0KCQkJaWYgKCFzYy5wcmV2aW91c1NpYmxpbmcgJiYgc2MucGFyZW50Tm9kZS5ub2RlTmFtZSA9PSBibikgew0KCQkJCXIuc2V0U3RhcnRCZWZvcmUoc2MucGFyZW50Tm9kZSk7DQoJCQl9IGVsc2Ugew0KCQkJCWlmIChyYi5zdGFydENvbnRhaW5lci5ub2RlTmFtZSA9PSBibiAmJiByYi5zdGFydE9mZnNldCA9PSAwKQ0KCQkJCQlyLnNldFN0YXJ0QmVmb3JlKHJiLnN0YXJ0Q29udGFpbmVyKTsNCgkJCQllbHNlDQoJCQkJCXIuc2V0U3RhcnQocmIuc3RhcnRDb250YWluZXIsIHJiLnN0YXJ0T2Zmc2V0KTsNCgkJCX0NCg0KCQkJaWYgKCFlYy5uZXh0U2libGluZyAmJiBlYy5wYXJlbnROb2RlLm5vZGVOYW1lID09IGJuKQ0KCQkJCXIuc2V0RW5kQWZ0ZXIoZWMucGFyZW50Tm9kZSk7DQoJCQllbHNlDQoJCQkJci5zZXRFbmQocmEuZW5kQ29udGFpbmVyLCByYS5lbmRPZmZzZXQpOw0KDQoJCQkvLyBEZWxldGUgYW5kIHJlcGxhY2UgaXQgd2l0aCBuZXcgYmxvY2sgZWxlbWVudHMNCgkJCXIuZGVsZXRlQ29udGVudHMoKTsNCg0KCQkJaWYgKGlzT3BlcmEpDQoJCQkJZWQuZ2V0V2luKCkuc2Nyb2xsVG8oMCwgdnAueSk7DQoNCgkJCS8vIE5ldmVyIHdyYXAgYmxvY2tzIGluIGJsb2Nrcw0KCQkJaWYgKGJlZi5maXJzdENoaWxkICYmIGJlZi5maXJzdENoaWxkLm5vZGVOYW1lID09IGJuKQ0KCQkJCWJlZi5pbm5lckhUTUwgPSBiZWYuZmlyc3RDaGlsZC5pbm5lckhUTUw7DQoNCgkJCWlmIChhZnQuZmlyc3RDaGlsZCAmJiBhZnQuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PSBibikNCgkJCQlhZnQuaW5uZXJIVE1MID0gYWZ0LmZpcnN0Q2hpbGQuaW5uZXJIVE1MOw0KDQoJCQkvLyBQYWRkIGVtcHR5IGJsb2Nrcw0KCQkJaWYgKGlzRW1wdHkoYmVmKSkNCgkJCQliZWYuaW5uZXJIVE1MID0gJzxiciAvPic7DQoNCgkJCWZ1bmN0aW9uIGFwcGVuZFN0eWxlcyhlLCBlbikgew0KCQkJCXZhciBubCA9IFtdLCBubiwgbiwgaTsNCg0KCQkJCWUuaW5uZXJIVE1MID0gJyc7DQoNCgkJCQkvLyBNYWtlIGNsb25lcyBvZiBzdHlsZSBlbGVtZW50cw0KCQkJCWlmIChzZS5rZWVwX3N0eWxlcykgew0KCQkJCQluID0gZW47DQoJCQkJCWRvIHsNCgkJCQkJCS8vIFdlIG9ubHkgd2FudCBzdHlsZSBzcGVjaWZpYyBlbGVtZW50cw0KCQkJCQkJaWYgKC9eKFNQQU58U1RST05HfEJ8RU18SXxGT05UfFNUUklLRXxVKSQvLnRlc3Qobi5ub2RlTmFtZSkpIHsNCgkJCQkJCQlubiA9IG4uY2xvbmVOb2RlKEZBTFNFKTsNCgkJCQkJCQlkb20uc2V0QXR0cmliKG5uLCAnaWQnLCAnJyk7IC8vIFJlbW92ZSBJRCBzaW5jZSBpdCBuZWVkcyB0byBiZSB1bmlxdWUNCgkJCQkJCQlubC5wdXNoKG5uKTsNCgkJCQkJCX0NCgkJCQkJfSB3aGlsZSAobiA9IG4ucGFyZW50Tm9kZSk7DQoJCQkJfQ0KDQoJCQkJLy8gQXBwZW5kIHN0eWxlIGVsZW1lbnRzIHRvIGFmdA0KCQkJCWlmIChubC5sZW5ndGggPiAwKSB7DQoJCQkJCWZvciAoaSA9IG5sLmxlbmd0aCAtIDEsIG5uID0gZTsgaSA+PSAwOyBpLS0pDQoJCQkJCQlubiA9IG5uLmFwcGVuZENoaWxkKG5sW2ldKTsNCg0KCQkJCQkvLyBQYWRkIG1vc3QgaW5uZXIgc3R5bGUgZWxlbWVudA0KCQkJCQlubFswXS5pbm5lckhUTUwgPSBpc09wZXJhID8gJyZuYnNwOycgOiAnPGJyIC8+JzsgLy8gRXh0cmEgc3BhY2UgZm9yIE9wZXJhIHNvIHRoYXQgdGhlIGNhcmV0IGNhbiBtb3ZlIHRoZXJlDQoJCQkJCXJldHVybiBubFswXTsgLy8gTW92ZSBjYXJldCB0byBtb3N0IGlubmVyIGVsZW1lbnQNCgkJCQl9IGVsc2UNCgkJCQkJZS5pbm5lckhUTUwgPSBpc09wZXJhID8gJyZuYnNwOycgOiAnPGJyIC8+JzsgLy8gRXh0cmEgc3BhY2UgZm9yIE9wZXJhIHNvIHRoYXQgdGhlIGNhcmV0IGNhbiBtb3ZlIHRoZXJlDQoJCQl9Ow0KDQoJCQkvLyBGaWxsIGVtcHR5IGFmdGVyYmxvb2sgd2l0aCBjdXJyZW50IHN0eWxlDQoJCQlpZiAoaXNFbXB0eShhZnQpKQ0KCQkJCWNhciA9IGFwcGVuZFN0eWxlcyhhZnQsIGVuKTsNCg0KCQkJLy8gT3BlcmEgbmVlZHMgdGhpcyBvbmUgYmFja3dhcmRzIGZvciBvbGRlciB2ZXJzaW9ucw0KCQkJaWYgKGlzT3BlcmEgJiYgcGFyc2VGbG9hdChvcGVyYS52ZXJzaW9uKCkpIDwgOS41KSB7DQoJCQkJci5pbnNlcnROb2RlKGJlZik7DQoJCQkJci5pbnNlcnROb2RlKGFmdCk7DQoJCQl9IGVsc2Ugew0KCQkJCXIuaW5zZXJ0Tm9kZShhZnQpOw0KCQkJCXIuaW5zZXJ0Tm9kZShiZWYpOw0KCQkJfQ0KDQoJCQkvLyBOb3JtYWxpemUNCgkJCWFmdC5ub3JtYWxpemUoKTsNCgkJCWJlZi5ub3JtYWxpemUoKTsNCg0KCQkJZnVuY3Rpb24gZmlyc3Qobikgew0KCQkJCXJldHVybiBkLmNyZWF0ZVRyZWVXYWxrZXIobiwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwsIEZBTFNFKS5uZXh0Tm9kZSgpIHx8IG47DQoJCQl9Ow0KDQoJCQkvLyBNb3ZlIGN1cnNvciBhbmQgc2Nyb2xsIGludG8gdmlldw0KCQkJciA9IGQuY3JlYXRlUmFuZ2UoKTsNCgkJCXIuc2VsZWN0Tm9kZUNvbnRlbnRzKGlzR2Vja28gPyBmaXJzdChjYXIgfHwgYWZ0KSA6IGNhciB8fCBhZnQpOw0KCQkJci5jb2xsYXBzZSgxKTsNCgkJCXMucmVtb3ZlQWxsUmFuZ2VzKCk7DQoJCQlzLmFkZFJhbmdlKHIpOw0KDQoJCQkvLyBzY3JvbGxJbnRvVmlldyBzZWVtcyB0byBzY3JvbGwgdGhlIHBhcmVudCB3aW5kb3cgaW4gbW9zdCBicm93c2VycyBub3cgaW5jbHVkaW5nIEZGIDMuMGI0IHNvIGl0J3MgdGltZSB0byBzdG9wIHVzaW5nIGl0IGFuZCBkbyBpdCBvdXIgc2VsZnMNCgkJCXkgPSBlZC5kb20uZ2V0UG9zKGFmdCkueTsNCgkJCWNoID0gYWZ0LmNsaWVudEhlaWdodDsNCg0KCQkJLy8gSXMgZWxlbWVudCB3aXRoaW4gdmlld3BvcnQNCgkJCWlmICh5IDwgdnAueSB8fCB5ICsgY2ggPiB2cC55ICsgdnAuaCkgew0KCQkJCWVkLmdldFdpbigpLnNjcm9sbFRvKDAsIHkgPCB2cC55ID8geSA6IHkgLSB2cC5oICsgMjUpOyAvLyBOZWVkcyB0byBiZSBoYXJkY29kZWQgdG8gcm91Z2hseSBvbmUgbGluZSBvZiB0ZXh0IGlmIGEgaHVnZSB0ZXh0IGJsb2NrIGlzIGJyb2tlbiBpbnRvIHR3byBibG9ja3MNCgkJCQkvL2NvbnNvbGUuZGVidWcoJ1NDUk9MTCEnLCAndnAueTogJyArIHZwLnksICd5JyArIHksICd2cC5oJyArIHZwLmgsICdjbGllbnRIZWlnaHQnICsgYWZ0LmNsaWVudEhlaWdodCwgJ3l5eTogJyArICh5IDwgdnAueSA/IHkgOiB5IC0gdnAuaCArIGFmdC5jbGllbnRIZWlnaHQpKTsNCgkJCX0NCg0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9LA0KDQoJCWJhY2tzcGFjZURlbGV0ZSA6IGZ1bmN0aW9uKGUsIGJzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIGIgPSBlZC5nZXRCb2R5KCksIGRvbSA9IGVkLmRvbSwgbiwgc2UgPSBlZC5zZWxlY3Rpb24sIHIgPSBzZS5nZXRSbmcoKSwgc2MgPSByLnN0YXJ0Q29udGFpbmVyLCBuLCB3LCB0biwgd2Fsa2VyOw0KDQoJCQkvLyBEZWxldGUgd2hlbiBjYXJldCBpcyBiZWhpbmQgYSBlbGVtZW50IGRvZXNuJ3Qgd29yayBjb3JyZWN0bHkgb24gR2Vja28gc2VlICMzMDExNjUxDQoJCQlpZiAoIWJzICYmIHIuY29sbGFwc2VkICYmIHNjLm5vZGVUeXBlID09IDEgJiYgci5zdGFydE9mZnNldCA9PSBzYy5jaGlsZE5vZGVzLmxlbmd0aCkgew0KCQkJCXdhbGtlciA9IG5ldyB0aW55bWNlLmRvbS5UcmVlV2Fsa2VyKHNjLmxhc3RDaGlsZCwgc2MpOw0KDQoJCQkJLy8gV2FsayB0aGUgZG9tIGJhY2t3YXJkcyB1bnRpbCB3ZSBmaW5kIGEgdGV4dCBub2RlDQoJCQkJZm9yIChuID0gc2MubGFzdENoaWxkOyBuOyBuID0gd2Fsa2VyLnByZXYoKSkgew0KCQkJCQlpZiAobi5ub2RlVHlwZSA9PSAzKSB7DQoJCQkJCQlyLnNldFN0YXJ0KG4sIG4ubm9kZVZhbHVlLmxlbmd0aCk7DQoJCQkJCQlyLmNvbGxhcHNlKHRydWUpOw0KCQkJCQkJc2Uuc2V0Um5nKHIpOw0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBUaGUgY2FyZXQgc29tZXRpbWVzIGdldHMgc3R1Y2sgaW4gR2Vja28gaWYgeW91IGRlbGV0ZSBlbXB0eSBwYXJhZ3JhcGhzDQoJCQkvLyBUaGlzIHdvcmthcm91bmQgcmVtb3ZlcyB0aGUgZWxlbWVudCBieSBoYW5kIGFuZCBtb3ZlcyB0aGUgY2FyZXQgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQNCgkJCWlmIChzYyAmJiBlZC5kb20uaXNCbG9jayhzYykgJiYgIS9eKFREfFRIKSQvLnRlc3Qoc2Mubm9kZU5hbWUpICYmIGJzKSB7DQoJCQkJaWYgKHNjLmNoaWxkTm9kZXMubGVuZ3RoID09IDAgfHwgKHNjLmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJiYgc2MuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PSAnQlInKSkgew0KCQkJCQkvLyBGaW5kIHByZXZpb3VzIGJsb2NrIGVsZW1lbnQNCgkJCQkJbiA9IHNjOw0KCQkJCQl3aGlsZSAoKG4gPSBuLnByZXZpb3VzU2libGluZykgJiYgIWVkLmRvbS5pc0Jsb2NrKG4pKSA7DQoNCgkJCQkJaWYgKG4pIHsNCgkJCQkJCWlmIChzYyAhPSBiLmZpcnN0Q2hpbGQpIHsNCgkJCQkJCQkvLyBGaW5kIGxhc3QgdGV4dCBub2RlDQoJCQkJCQkJdyA9IGVkLmRvbS5kb2MuY3JlYXRlVHJlZVdhbGtlcihuLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCwgbnVsbCwgRkFMU0UpOw0KCQkJCQkJCXdoaWxlICh0biA9IHcubmV4dE5vZGUoKSkNCgkJCQkJCQkJbiA9IHRuOw0KDQoJCQkJCQkJLy8gUGxhY2UgY2FyZXQgYXQgdGhlIGVuZCBvZiBsYXN0IHRleHQgbm9kZQ0KCQkJCQkJCXIgPSBlZC5nZXREb2MoKS5jcmVhdGVSYW5nZSgpOw0KCQkJCQkJCXIuc2V0U3RhcnQobiwgbi5ub2RlVmFsdWUgPyBuLm5vZGVWYWx1ZS5sZW5ndGggOiAwKTsNCgkJCQkJCQlyLnNldEVuZChuLCBuLm5vZGVWYWx1ZSA/IG4ubm9kZVZhbHVlLmxlbmd0aCA6IDApOw0KCQkJCQkJCXNlLnNldFJuZyhyKTsNCg0KCQkJCQkJCS8vIFJlbW92ZSB0aGUgdGFyZ2V0IGNvbnRhaW5lcg0KCQkJCQkJCWVkLmRvbS5yZW1vdmUoc2MpOw0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm4gRXZlbnQuY2FuY2VsKGUpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/Formatter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBGb3JtYXR0ZXIuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8qKg0KCSAqIFRleHQgZm9ybWF0dGVyIGVuZ2luZSBjbGFzcy4gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGFwcGx5IGZvcm1hdHMgbGlrZSBib2xkLCBpdGFsaWMsIGZvbnQgc2l6ZQ0KCSAqIGV0YyB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gb3Igc3BlY2lmaWMgbm9kZXMuIFRoaXMgZW5naW5lIHdhcyBidWlsZCB0byByZXBsYWNlIHRoZSBicm93c2Vycw0KCSAqIGRlZmF1bHQgZm9ybWF0dGluZyBsb2dpYyBmb3IgZXhlY0NvbW1hbmQgZHVlIHRvIGl0J3MgaW5jb25zaXN0YW50IGFuZCBidWdneSBiZWhhdmlvci4NCgkgKg0KCSAqIEBjbGFzcyB0aW55bWNlLkZvcm1hdHRlcg0KCSAqIEBleGFtcGxlDQoJICogIHRpbnltY2UuYWN0aXZlRWRpdG9yLmZvcm1hdHRlci5yZWdpc3RlcignbXljdXN0b21mb3JtYXQnLCB7DQoJICogICAgaW5saW5lIDogJ3NwYW4nLA0KCSAqICAgIHN0eWxlcyA6IHtjb2xvciA6ICcjZmYwMDAwJ30NCiAgICAgKiAgfSk7DQoJICoNCgkgKiAgdGlueW1jZS5hY3RpdmVFZGl0b3IuZm9ybWF0dGVyLmFwcGx5KCdteWN1c3RvbWZvcm1hdCcpOw0KCSAqLw0KDQoJLyoqDQoJICogQ29uc3RydWN0cyBhIG5ldyBmb3JtYXR0ZXIgaW5zdGFuY2UuDQoJICoNCgkgKiBAY29uc3RydWN0b3IgRm9ybWF0dGVyDQoJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gZWQgRWRpdG9yIGluc3RhbmNlIHRvIGNvbnN0cnVjdCB0aGUgZm9ybWF0dGVyIGVuZ2luZSB0by4NCgkgKi8NCgl0aW55bWNlLkZvcm1hdHRlciA9IGZ1bmN0aW9uKGVkKSB7DQoJCXZhciBmb3JtYXRzID0ge30sDQoJCQllYWNoID0gdGlueW1jZS5lYWNoLA0KCQkJZG9tID0gZWQuZG9tLA0KCQkJc2VsZWN0aW9uID0gZWQuc2VsZWN0aW9uLA0KCQkJVHJlZVdhbGtlciA9IHRpbnltY2UuZG9tLlRyZWVXYWxrZXIsDQoJCQlyYW5nZVV0aWxzID0gbmV3IHRpbnltY2UuZG9tLlJhbmdlVXRpbHMoZG9tKSwNCgkJCWlzVmFsaWQgPSBlZC5zY2hlbWEuaXNWYWxpZCwNCgkJCWlzQmxvY2sgPSBkb20uaXNCbG9jaywNCgkJCWZvcmNlZFJvb3RCbG9jayA9IGVkLnNldHRpbmdzLmZvcmNlZF9yb290X2Jsb2NrLA0KCQkJbm9kZUluZGV4ID0gZG9tLm5vZGVJbmRleCwNCgkJCUlOVklTSUJMRV9DSEFSID0gJ1x1RkVGRicsDQoJCQlNQ0VfQVRUUl9SRSA9IC9eKHNyY3xocmVmfHN0eWxlKSQvLA0KCQkJRkFMU0UgPSBmYWxzZSwNCgkJCVRSVUUgPSB0cnVlLA0KCQkJdW5kZWZpbmVkLA0KCQkJcGVuZGluZ0Zvcm1hdHMgPSB7YXBwbHkgOiBbXSwgcmVtb3ZlIDogW119Ow0KDQoJCWZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7DQoJCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQXJyYXk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZ2V0UGFyZW50cyhub2RlLCBzZWxlY3Rvcikgew0KCQkJcmV0dXJuIGRvbS5nZXRQYXJlbnRzKG5vZGUsIHNlbGVjdG9yLCBkb20uZ2V0Um9vdCgpKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBpc0NhcmV0Tm9kZShub2RlKSB7DQoJCQlyZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAobm9kZS5mYWNlID09PSAnbWNlaW5saW5lJyB8fCBub2RlLnN0eWxlLmZvbnRGYW1pbHkgPT09ICdtY2VpbmxpbmUnKTsNCgkJfTsNCg0KCQkvLyBQdWJsaWMgZnVuY3Rpb25zDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdGhlIGZvcm1hdCBieSBuYW1lIG9yIGFsbCBmb3JtYXRzIGlmIG5vIG5hbWUgaXMgc3BlY2lmaWVkLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBuYW1lIHRvIHJldHJpdmUgYnkuDQoJCSAqIEByZXR1cm4ge0FycmF5L09iamVjdH0gQXJyYXkvT2JqZWN0IHdpdGggYWxsIHJlZ2lzdHJlZCBmb3JtYXRzIG9yIGEgc3BlY2lmaWMgZm9ybWF0Lg0KCQkgKi8NCgkJZnVuY3Rpb24gZ2V0KG5hbWUpIHsNCgkJCXJldHVybiBuYW1lID8gZm9ybWF0c1tuYW1lXSA6IGZvcm1hdHM7DQoJCX07DQoNCgkJLyoqDQoJCSAqIFJlZ2lzdGVycyBhIHNwZWNpZmljIGZvcm1hdCBieSBuYW1lLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHJlZ2lzdGVyDQoJCSAqIEBwYXJhbSB7T2JqZWN0L1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmb3JtYXQgZm9yIGV4YW1wbGUgImJvbGQiLg0KCQkgKiBAcGFyYW0ge09iamVjdC9BcnJheX0gZm9ybWF0IE9wdGlvbmFsIGZvcm1hdCBvYmplY3Qgb3IgYXJyYXkgb2YgZm9ybWF0IHZhcmlhbnRzIGNhbiBvbmx5IGJlIG9taXR0ZWQgaWYgdGhlIGZpcnN0IGFyZyBpcyBhbiBvYmplY3QuDQoJCSAqLw0KCQlmdW5jdGlvbiByZWdpc3RlcihuYW1lLCBmb3JtYXQpIHsNCgkJCWlmIChuYW1lKSB7DQoJCQkJaWYgKHR5cGVvZihuYW1lKSAhPT0gJ3N0cmluZycpIHsNCgkJCQkJZWFjaChuYW1lLCBmdW5jdGlvbihmb3JtYXQsIG5hbWUpIHsNCgkJCQkJCXJlZ2lzdGVyKG5hbWUsIGZvcm1hdCk7DQoJCQkJCX0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIEZvcmNlIGZvcm1hdCBpbnRvIGFycmF5IGFuZCBhZGQgaXQgdG8gaW50ZXJuYWwgY29sbGVjdGlvbg0KCQkJCQlmb3JtYXQgPSBmb3JtYXQubGVuZ3RoID8gZm9ybWF0IDogW2Zvcm1hdF07DQoNCgkJCQkJZWFjaChmb3JtYXQsIGZ1bmN0aW9uKGZvcm1hdCkgew0KCQkJCQkJLy8gU2V0IGRlZXAgdG8gZmFsc2UgYnkgZGVmYXVsdCBvbiBzZWxlY3RvciBmb3JtYXRzIHRoaXMgdG8gYXZvaWQgcmVtb3ZpbmcNCgkJCQkJCS8vIGFsaWdubWVudCBvbiBpbWFnZXMgaW5zaWRlIHBhcmFncmFwaHMgd2hlbiBhbGlnbm1lbnQgaXMgY2hhbmdlZCBvbiBwYXJhZ3JhcGhzDQoJCQkJCQlpZiAoZm9ybWF0LmRlZXAgPT09IHVuZGVmaW5lZCkNCgkJCQkJCQlmb3JtYXQuZGVlcCA9ICFmb3JtYXQuc2VsZWN0b3I7DQoNCgkJCQkJCS8vIERlZmF1bHQgdG8gdHJ1ZQ0KCQkJCQkJaWYgKGZvcm1hdC5zcGxpdCA9PT0gdW5kZWZpbmVkKQ0KCQkJCQkJCWZvcm1hdC5zcGxpdCA9ICFmb3JtYXQuc2VsZWN0b3IgfHwgZm9ybWF0LmlubGluZTsNCg0KCQkJCQkJLy8gRGVmYXVsdCB0byB0cnVlDQoJCQkJCQlpZiAoZm9ybWF0LnJlbW92ZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdC5zZWxlY3RvciAmJiAhZm9ybWF0LmlubGluZSkNCgkJCQkJCQlmb3JtYXQucmVtb3ZlID0gJ25vbmUnOw0KDQoJCQkJCQkvLyBNYXJrIGZvcm1hdCBhcyBhIG1peGVkIGZvcm1hdCBpbmxpbmUgKyBibG9jayBsZXZlbA0KCQkJCQkJaWYgKGZvcm1hdC5zZWxlY3RvciAmJiBmb3JtYXQuaW5saW5lKSB7DQoJCQkJCQkJZm9ybWF0Lm1peGVkID0gdHJ1ZTsNCgkJCQkJCQlmb3JtYXQuYmxvY2tfZXhwYW5kID0gdHJ1ZTsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gU3BsaXQgY2xhc3NlcyBpZiBuZWVkZWQNCgkJCQkJCWlmICh0eXBlb2YoZm9ybWF0LmNsYXNzZXMpID09PSAnc3RyaW5nJykNCgkJCQkJCQlmb3JtYXQuY2xhc3NlcyA9IGZvcm1hdC5jbGFzc2VzLnNwbGl0KC9ccysvKTsNCgkJCQkJfSk7DQoNCgkJCQkJZm9ybWF0c1tuYW1lXSA9IGZvcm1hdDsNCgkJCQl9DQoJCQl9DQoJCX07DQoNCgkJLyoqDQoJCSAqIEFwcGxpZXMgdGhlIHNwZWNpZmllZCBmb3JtYXQgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9yIHNwZWNpZmllZCBub2RlLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGFwcGx5DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgZm9ybWF0IHRvIGFwcGx5Lg0KCQkgKiBAcGFyYW0ge09iamVjdH0gdmFycyBPcHRpb25hbCBsaXN0IG9mIHZhcmlhYmxlcyB0byByZXBsYWNlIHdpdGhpbiBmb3JtYXQgYmVmb3JlIGFwcGx5aW5nIGl0Lg0KCQkgKiBAcGFyYW0ge05vZGV9IG5vZGUgT3B0aW9uYWwgbm9kZSB0byBhcHBseSB0aGUgZm9ybWF0IHRvIGRlZmF1bHRzIHRvIGN1cnJlbnQgc2VsZWN0aW9uLg0KCQkgKi8NCgkJZnVuY3Rpb24gYXBwbHkobmFtZSwgdmFycywgbm9kZSkgew0KCQkJdmFyIGZvcm1hdExpc3QgPSBnZXQobmFtZSksIGZvcm1hdCA9IGZvcm1hdExpc3RbMF0sIGJvb2ttYXJrLCBybmcsIGk7DQoNCgkJCS8qKg0KCQkJICogTW92ZXMgdGhlIHN0YXJ0IHRvIHRoZSBmaXJzdCBzdWl0YWJsZSB0ZXh0IG5vZGUuDQoJCQkgKi8NCgkJCWZ1bmN0aW9uIG1vdmVTdGFydChybmcpIHsNCgkJCQl2YXIgY29udGFpbmVyID0gcm5nLnN0YXJ0Q29udGFpbmVyLA0KCQkJCQlvZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQsDQoJCQkJCXdhbGtlciwgbm9kZTsNCg0KCQkJCS8vIE1vdmUgc3RhcnRDb250YWluZXIvc3RhcnRPZmZzZXQgaW4gdG8gYSBzdWl0YWJsZSBub2RlDQoJCQkJaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PSAxIHx8IGNvbnRhaW5lci5ub2RlVmFsdWUgPT09ICIiKSB7DQoJCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PSAxID8gY29udGFpbmVyLmNoaWxkTm9kZXNbb2Zmc2V0XSA6IGNvbnRhaW5lcjsNCg0KCQkJCQkvLyBNaWdodCBmYWlsIGlmIHRoZSBvZmZzZXQgaXMgYmVoaW5kIHRoZSBsYXN0IGVsZW1lbnQgaW4gaXQncyBjb250YWluZXINCgkJCQkJaWYgKGNvbnRhaW5lcikgew0KCQkJCQkJd2Fsa2VyID0gbmV3IFRyZWVXYWxrZXIoY29udGFpbmVyLCBjb250YWluZXIucGFyZW50Tm9kZSk7DQoJCQkJCQlmb3IgKG5vZGUgPSB3YWxrZXIuY3VycmVudCgpOyBub2RlOyBub2RlID0gd2Fsa2VyLm5leHQoKSkgew0KCQkJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgIWlzV2hpdGVTcGFjZU5vZGUobm9kZSkpIHsNCgkJCQkJCQkJcm5nLnNldFN0YXJ0KG5vZGUsIDApOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlyZXR1cm4gcm5nOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gc2V0RWxlbWVudEZvcm1hdChlbG0sIGZtdCkgew0KCQkJCWZtdCA9IGZtdCB8fCBmb3JtYXQ7DQoNCgkJCQlpZiAoZWxtKSB7DQoJCQkJCWVhY2goZm10LnN0eWxlcywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsNCgkJCQkJCWRvbS5zZXRTdHlsZShlbG0sIG5hbWUsIHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKSk7DQoJCQkJCX0pOw0KDQoJCQkJCWVhY2goZm10LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7DQoJCQkJCQlkb20uc2V0QXR0cmliKGVsbSwgbmFtZSwgcmVwbGFjZVZhcnModmFsdWUsIHZhcnMpKTsNCgkJCQkJfSk7DQoNCgkJCQkJZWFjaChmbXQuY2xhc3NlcywgZnVuY3Rpb24odmFsdWUpIHsNCgkJCQkJCXZhbHVlID0gcmVwbGFjZVZhcnModmFsdWUsIHZhcnMpOw0KDQoJCQkJCQlpZiAoIWRvbS5oYXNDbGFzcyhlbG0sIHZhbHVlKSkNCgkJCQkJCQlkb20uYWRkQ2xhc3MoZWxtLCB2YWx1ZSk7DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX07DQoNCgkJCWZ1bmN0aW9uIGFwcGx5Um5nU3R5bGUocm5nKSB7DQoJCQkJdmFyIG5ld1dyYXBwZXJzID0gW10sIHdyYXBOYW1lLCB3cmFwRWxtOw0KDQoJCQkJLy8gU2V0dXAgd3JhcHBlciBlbGVtZW50DQoJCQkJd3JhcE5hbWUgPSBmb3JtYXQuaW5saW5lIHx8IGZvcm1hdC5ibG9jazsNCgkJCQl3cmFwRWxtID0gZG9tLmNyZWF0ZSh3cmFwTmFtZSk7DQoJCQkJc2V0RWxlbWVudEZvcm1hdCh3cmFwRWxtKTsNCg0KCQkJCXJhbmdlVXRpbHMud2FsayhybmcsIGZ1bmN0aW9uKG5vZGVzKSB7DQoJCQkJCXZhciBjdXJyZW50V3JhcEVsbTsNCg0KCQkJCQkvKioNCgkJCQkJICogUHJvY2VzcyBhIGxpc3Qgb2Ygbm9kZXMgd3JhcCB0aGVtLg0KCQkJCQkgKi8NCgkJCQkJZnVuY3Rpb24gcHJvY2Vzcyhub2RlKSB7DQoJCQkJCQl2YXIgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudE5hbWUgPSBub2RlLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgZm91bmQ7DQoNCgkJCQkJCS8vIFN0b3Agd3JhcHBpbmcgb24gYnIgZWxlbWVudHMNCgkJCQkJCWlmIChpc0VxKG5vZGVOYW1lLCAnYnInKSkgew0KCQkJCQkJCWN1cnJlbnRXcmFwRWxtID0gMDsNCg0KCQkJCQkJCS8vIFJlbW92ZSBhbnkgYnIgZWxlbWVudHMgd2hlbiB3ZSB3cmFwIHRoaW5ncw0KCQkJCQkJCWlmIChmb3JtYXQuYmxvY2spDQoJCQkJCQkJCWRvbS5yZW1vdmUobm9kZSk7DQoNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCS8vIElmIG5vZGUgaXMgd3JhcHBlciB0eXBlDQoJCQkJCQlpZiAoZm9ybWF0LndyYXBwZXIgJiYgbWF0Y2hOb2RlKG5vZGUsIG5hbWUsIHZhcnMpKSB7DQoJCQkJCQkJY3VycmVudFdyYXBFbG0gPSAwOw0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gQ2FuIHdlIHJlbmFtZSB0aGUgYmxvY2sNCgkJCQkJCWlmIChmb3JtYXQuYmxvY2sgJiYgIWZvcm1hdC53cmFwcGVyICYmIGlzVGV4dEJsb2NrKG5vZGVOYW1lKSkgew0KCQkJCQkJCW5vZGUgPSBkb20ucmVuYW1lKG5vZGUsIHdyYXBOYW1lKTsNCgkJCQkJCQlzZXRFbGVtZW50Rm9ybWF0KG5vZGUpOw0KCQkJCQkJCW5ld1dyYXBwZXJzLnB1c2gobm9kZSk7DQoJCQkJCQkJY3VycmVudFdyYXBFbG0gPSAwOw0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gSGFuZGxlIHNlbGVjdG9yIHBhdHRlcm5zDQoJCQkJCQlpZiAoZm9ybWF0LnNlbGVjdG9yKSB7DQoJCQkJCQkJLy8gTG9vayBmb3IgbWF0Y2hpbmcgZm9ybWF0cw0KCQkJCQkJCWVhY2goZm9ybWF0TGlzdCwgZnVuY3Rpb24oZm9ybWF0KSB7DQoJCQkJCQkJCWlmIChkb20uaXMobm9kZSwgZm9ybWF0LnNlbGVjdG9yKSAmJiAhaXNDYXJldE5vZGUobm9kZSkpIHsNCgkJCQkJCQkJCXNldEVsZW1lbnRGb3JtYXQobm9kZSwgZm9ybWF0KTsNCgkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0pOw0KDQoJCQkJCQkJLy8gQ29udGludWUgcHJvY2Vzc2luZyBpZiBhIHNlbGVjdG9yIG1hdGNoIHdhc24ndCBmb3VuZCBhbmQgYSBpbmxpbmUgZWxlbWVudCBpcyBkZWZpbmVkDQoJCQkJCQkJaWYgKCFmb3JtYXQuaW5saW5lIHx8IGZvdW5kKSB7DQoJCQkJCQkJCWN1cnJlbnRXcmFwRWxtID0gMDsNCgkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJLy8gSXMgaXQgdmFsaWQgdG8gd3JhcCB0aGlzIGl0ZW0NCgkJCQkJCWlmICgoZm9ybWF0LndyYXBfbGlua3MgIT09IGZhbHNlIHx8IG5vZGVOYW1lICE9ICdhJykgJiYgaXNWYWxpZCh3cmFwTmFtZSwgbm9kZU5hbWUpICYmIGlzVmFsaWQocGFyZW50TmFtZSwgd3JhcE5hbWUpKSB7DQoJCQkJCQkJLy8gU3RhcnQgd3JhcHBpbmcNCgkJCQkJCQlpZiAoIWN1cnJlbnRXcmFwRWxtKSB7DQoJCQkJCQkJCS8vIFdyYXAgdGhlIG5vZGUNCgkJCQkJCQkJY3VycmVudFdyYXBFbG0gPSB3cmFwRWxtLmNsb25lTm9kZShGQUxTRSk7DQoJCQkJCQkJCW5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY3VycmVudFdyYXBFbG0sIG5vZGUpOw0KCQkJCQkJCQluZXdXcmFwcGVycy5wdXNoKGN1cnJlbnRXcmFwRWxtKTsNCgkJCQkJCQl9DQoNCgkJCQkJCQljdXJyZW50V3JhcEVsbS5hcHBlbmRDaGlsZChub2RlKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJLy8gU3RhcnQgYSBuZXcgd3JhcHBlciBmb3IgcG9zc2libGUgY2hpbGRyZW4NCgkJCQkJCQljdXJyZW50V3JhcEVsbSA9IDA7DQoNCgkJCQkJCQllYWNoKHRpbnltY2UuZ3JlcChub2RlLmNoaWxkTm9kZXMpLCBwcm9jZXNzKTsNCg0KCQkJCQkJCS8vIEVuZCB0aGUgbGFzdCB3cmFwcGVyDQoJCQkJCQkJY3VycmVudFdyYXBFbG0gPSAwOw0KCQkJCQkJfQ0KCQkJCQl9Ow0KDQoJCQkJCS8vIFByb2Nlc3Mgc2libGluZ3MgZnJvbSByYW5nZQ0KCQkJCQllYWNoKG5vZGVzLCBwcm9jZXNzKTsNCgkJCQl9KTsNCg0KCQkJCS8vIENsZWFudXANCgkJCQllYWNoKG5ld1dyYXBwZXJzLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCXZhciBjaGlsZENvdW50Ow0KDQoJCQkJCWZ1bmN0aW9uIGdldENoaWxkQ291bnQobm9kZSkgew0KCQkJCQkJdmFyIGNvdW50ID0gMDsNCg0KCQkJCQkJZWFjaChub2RlLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCQlpZiAoIWlzV2hpdGVTcGFjZU5vZGUobm9kZSkgJiYgIWlzQm9va21hcmtOb2RlKG5vZGUpKQ0KCQkJCQkJCQljb3VudCsrOw0KCQkJCQkJfSk7DQoNCgkJCQkJCXJldHVybiBjb3VudDsNCgkJCQkJfTsNCg0KCQkJCQlmdW5jdGlvbiBtZXJnZVN0eWxlcyhub2RlKSB7DQoJCQkJCQl2YXIgY2hpbGQsIGNsb25lOw0KDQoJCQkJCQllYWNoKG5vZGUuY2hpbGROb2RlcywgZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgIWlzQm9va21hcmtOb2RlKG5vZGUpICYmICFpc0NhcmV0Tm9kZShub2RlKSkgew0KCQkJCQkJCQljaGlsZCA9IG5vZGU7DQoJCQkJCQkJCXJldHVybiBGQUxTRTsgLy8gYnJlYWsgbG9vcA0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBJZiBjaGlsZCB3YXMgZm91bmQgYW5kIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGN1cnJlbnQgbm9kZQ0KCQkJCQkJaWYgKGNoaWxkICYmIG1hdGNoTmFtZShjaGlsZCwgZm9ybWF0KSkgew0KCQkJCQkJCWNsb25lID0gY2hpbGQuY2xvbmVOb2RlKEZBTFNFKTsNCgkJCQkJCQlzZXRFbGVtZW50Rm9ybWF0KGNsb25lKTsNCg0KCQkJCQkJCWRvbS5yZXBsYWNlKGNsb25lLCBub2RlLCBUUlVFKTsNCgkJCQkJCQlkb20ucmVtb3ZlKGNoaWxkLCAxKTsNCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuIGNsb25lIHx8IG5vZGU7DQoJCQkJCX07DQoNCgkJCQkJY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQobm9kZSk7DQoNCgkJCQkJLy8gUmVtb3ZlIGVtcHR5IG5vZGVzDQoJCQkJCWlmIChjaGlsZENvdW50ID09PSAwKSB7DQoJCQkJCQlkb20ucmVtb3ZlKG5vZGUsIDEpOw0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoNCgkJCQkJaWYgKGZvcm1hdC5pbmxpbmUgfHwgZm9ybWF0LndyYXBwZXIpIHsNCgkJCQkJCS8vIE1lcmdlcyB0aGUgY3VycmVudCBub2RlIHdpdGggaXQncyBjaGlsZHJlbiBvZiBzaW1pbGFyIHR5cGUgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCgkJCQkJCWlmICghZm9ybWF0LmV4YWN0ICYmIGNoaWxkQ291bnQgPT09IDEpDQoJCQkJCQkJbm9kZSA9IG1lcmdlU3R5bGVzKG5vZGUpOw0KDQoJCQkJCQkvLyBSZW1vdmUvbWVyZ2UgY2hpbGRyZW4NCgkJCQkJCWVhY2goZm9ybWF0TGlzdCwgZnVuY3Rpb24oZm9ybWF0KSB7DQoJCQkJCQkJLy8gTWVyZ2UgYWxsIGNoaWxkcmVuIG9mIHNpbWlsYXIgdHlwZSB3aWxsIG1vdmUgc3R5bGVzIGZyb20gY2hpbGQgdG8gcGFyZW50DQoJCQkJCQkJLy8gdGhpczogPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+PGI+PHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsgZm9udC1zaXplOjEwcHgiPnRleHQ8L3NwYW4+PC9iPjwvc3Bhbj4NCgkJCQkJCQkvLyB3aWxsIGJlY29tZTogPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMHB4Ij50ZXh0PC9zcGFuPjwvYj48L3NwYW4+DQoJCQkJCQkJZWFjaChkb20uc2VsZWN0KGZvcm1hdC5pbmxpbmUsIG5vZGUpLCBmdW5jdGlvbihjaGlsZCkgew0KCQkJCQkJCQlyZW1vdmVGb3JtYXQoZm9ybWF0LCB2YXJzLCBjaGlsZCwgZm9ybWF0LmV4YWN0ID8gY2hpbGQgOiBudWxsKTsNCgkJCQkJCQl9KTsNCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBSZW1vdmUgY2hpbGQgaWYgZGlyZWN0IHBhcmVudCBpcyBvZiBzYW1lIHR5cGUNCgkJCQkJCWlmIChtYXRjaE5vZGUobm9kZS5wYXJlbnROb2RlLCBuYW1lLCB2YXJzKSkgew0KCQkJCQkJCWRvbS5yZW1vdmUobm9kZSwgMSk7DQoJCQkJCQkJbm9kZSA9IDA7DQoJCQkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIExvb2sgZm9yIHBhcmVudCB3aXRoIHNpbWlsYXIgc3R5bGUgZm9ybWF0DQoJCQkJCQlpZiAoZm9ybWF0Lm1lcmdlX3dpdGhfcGFyZW50cykgew0KCQkJCQkJCWRvbS5nZXRQYXJlbnQobm9kZS5wYXJlbnROb2RlLCBmdW5jdGlvbihwYXJlbnQpIHsNCgkJCQkJCQkJaWYgKG1hdGNoTm9kZShwYXJlbnQsIG5hbWUsIHZhcnMpKSB7DQoJCQkJCQkJCQlkb20ucmVtb3ZlKG5vZGUsIDEpOw0KCQkJCQkJCQkJbm9kZSA9IDA7DQoJCQkJCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0pOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBNZXJnZSBuZXh0IGFuZCBwcmV2aW91cyBzaWJsaW5ncyBpZiB0aGV5IGFyZSBzaW1pbGFyIDxiPnRleHQ8L2I+PGI+dGV4dDwvYj4gYmVjb21lcyA8Yj50ZXh0dGV4dDwvYj4NCgkJCQkJCWlmIChub2RlKSB7DQoJCQkJCQkJbm9kZSA9IG1lcmdlU2libGluZ3MoZ2V0Tm9uV2hpdGVTcGFjZVNpYmxpbmcobm9kZSksIG5vZGUpOw0KCQkJCQkJCW5vZGUgPSBtZXJnZVNpYmxpbmdzKG5vZGUsIGdldE5vbldoaXRlU3BhY2VTaWJsaW5nKG5vZGUsIFRSVUUpKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfTsNCg0KCQkJaWYgKGZvcm1hdCkgew0KCQkJCWlmIChub2RlKSB7DQoJCQkJCXJuZyA9IGRvbS5jcmVhdGVSbmcoKTsNCg0KCQkJCQlybmcuc2V0U3RhcnRCZWZvcmUobm9kZSk7DQoJCQkJCXJuZy5zZXRFbmRBZnRlcihub2RlKTsNCg0KCQkJCQlhcHBseVJuZ1N0eWxlKGV4cGFuZFJuZyhybmcsIGZvcm1hdExpc3QpKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlpZiAoIXNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpIHx8ICFmb3JtYXQuaW5saW5lKSB7DQoJCQkJCQkvLyBBcHBseSBmb3JtYXR0aW5nIHRvIHNlbGVjdGlvbg0KCQkJCQkJYm9va21hcmsgPSBzZWxlY3Rpb24uZ2V0Qm9va21hcmsoKTsNCgkJCQkJCWFwcGx5Um5nU3R5bGUoZXhwYW5kUm5nKHNlbGVjdGlvbi5nZXRSbmcoVFJVRSksIGZvcm1hdExpc3QpKTsNCg0KCQkJCQkJc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsNCgkJCQkJCXNlbGVjdGlvbi5zZXRSbmcobW92ZVN0YXJ0KHNlbGVjdGlvbi5nZXRSbmcoVFJVRSkpKTsNCgkJCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJcGVyZm9ybUNhcmV0QWN0aW9uKCdhcHBseScsIG5hbWUsIHZhcnMpOw0KCQkJCX0NCgkJCX0NCgkJfTsNCg0KCQkvKioNCgkJICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGZvcm1hdCBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBvciBzcGVjaWZpZWQgbm9kZS4NCgkJICoNCgkJICogQG1ldGhvZCByZW1vdmUNCgkJICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgTmFtZSBvZiBmb3JtYXQgdG8gcmVtb3ZlLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gdmFycyBPcHRpb25hbCBsaXN0IG9mIHZhcmlhYmxlcyB0byByZXBsYWNlIHdpdGhpbiBmb3JtYXQgYmVmb3JlIHJlbW92aW5nIGl0Lg0KCQkgKiBAcGFyYW0ge05vZGV9IG5vZGUgT3B0aW9uYWwgbm9kZSB0byByZW1vdmUgdGhlIGZvcm1hdCBmcm9tIGRlZmF1bHRzIHRvIGN1cnJlbnQgc2VsZWN0aW9uLg0KCQkgKi8NCgkJZnVuY3Rpb24gcmVtb3ZlKG5hbWUsIHZhcnMsIG5vZGUpIHsNCgkJCXZhciBmb3JtYXRMaXN0ID0gZ2V0KG5hbWUpLCBmb3JtYXQgPSBmb3JtYXRMaXN0WzBdLCBib29rbWFyaywgaSwgcm5nOw0KDQoJCQkvKioNCgkJCSAqIE1vdmVzIHRoZSBzdGFydCB0byB0aGUgZmlyc3Qgc3VpdGFibGUgdGV4dCBub2RlLg0KCQkJICovDQoJCQlmdW5jdGlvbiBtb3ZlU3RhcnQocm5nKSB7DQoJCQkJdmFyIGNvbnRhaW5lciA9IHJuZy5zdGFydENvbnRhaW5lciwNCgkJCQkJb2Zmc2V0ID0gcm5nLnN0YXJ0T2Zmc2V0LA0KCQkJCQl3YWxrZXIsIG5vZGUsIG5vZGVzLCB0bXBOb2RlOw0KDQoJCQkJLy8gQ29udmVydCB0ZXh0IG5vZGUgaW50byBpbmRleCBpZiBwb3NzaWJsZQ0KCQkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMyAmJiBvZmZzZXQgPj0gY29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGggLSAxKSB7DQoJCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlOw0KCQkJCQlvZmZzZXQgPSBub2RlSW5kZXgoY29udGFpbmVyKSArIDE7DQoJCQkJfQ0KDQoJCQkJLy8gTW92ZSBzdGFydENvbnRhaW5lci9zdGFydE9mZnNldCBpbiB0byBhIHN1aXRhYmxlIG5vZGUNCgkJCQlpZiAoY29udGFpbmVyLm5vZGVUeXBlID09IDEpIHsNCgkJCQkJbm9kZXMgPSBjb250YWluZXIuY2hpbGROb2RlczsNCgkJCQkJY29udGFpbmVyID0gbm9kZXNbTWF0aC5taW4ob2Zmc2V0LCBub2Rlcy5sZW5ndGggLSAxKV07DQoJCQkJCXdhbGtlciA9IG5ldyBUcmVlV2Fsa2VyKGNvbnRhaW5lcik7DQoNCgkJCQkJLy8gSWYgb2Zmc2V0IGlzIGF0IGVuZCBvZiB0aGUgcGFyZW50IG5vZGUgd2FsayB0byB0aGUgbmV4dCBvbmUNCgkJCQkJaWYgKG9mZnNldCA+IG5vZGVzLmxlbmd0aCAtIDEpDQoJCQkJCQl3YWxrZXIubmV4dCgpOw0KDQoJCQkJCWZvciAobm9kZSA9IHdhbGtlci5jdXJyZW50KCk7IG5vZGU7IG5vZGUgPSB3YWxrZXIubmV4dCgpKSB7DQoJCQkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmICFpc1doaXRlU3BhY2VOb2RlKG5vZGUpKSB7DQoJCQkJCQkJLy8gSUUgaGFzIGEgIm5lYXQiIGZlYXR1cmUgd2hlcmUgaXQgbW92ZXMgdGhlIHN0YXJ0IG5vZGUgaW50byB0aGUgY2xvc2VzdCBlbGVtZW50DQoJCQkJCQkJLy8gd2UgY2FuIGF2b2lkIHRoaXMgYnkgaW5zZXJ0aW5nIGFuIGVsZW1lbnQgYmVmb3JlIGl0IGFuZCB0aGVuIHJlbW92ZSBpdCBhZnRlciB3ZSBzZXQgdGhlIHNlbGVjdGlvbg0KCQkJCQkJCXRtcE5vZGUgPSBkb20uY3JlYXRlKCdhJywgbnVsbCwgSU5WSVNJQkxFX0NIQVIpOw0KCQkJCQkJCW5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodG1wTm9kZSwgbm9kZSk7DQoNCgkJCQkJCQkvLyBTZXQgc2VsZWN0aW9uIGFuZCByZW1vdmUgdG1wTm9kZQ0KCQkJCQkJCXJuZy5zZXRTdGFydChub2RlLCAwKTsNCgkJCQkJCQlzZWxlY3Rpb24uc2V0Um5nKHJuZyk7DQoJCQkJCQkJZG9tLnJlbW92ZSh0bXBOb2RlKTsNCg0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX07DQoNCgkJCS8vIE1lcmdlcyB0aGUgc3R5bGVzIGZvciBlYWNoIG5vZGUNCgkJCWZ1bmN0aW9uIHByb2Nlc3Mobm9kZSkgew0KCQkJCXZhciBjaGlsZHJlbiwgaSwgbDsNCg0KCQkJCS8vIEdyYWIgdGhlIGNoaWxkcmVuIGZpcnN0IHNpbmNlIHRoZSBub2RlbGlzdCBtaWdodCBiZSBjaGFuZ2VkDQoJCQkJY2hpbGRyZW4gPSB0aW55bWNlLmdyZXAobm9kZS5jaGlsZE5vZGVzKTsNCg0KCQkJCS8vIFByb2Nlc3MgY3VycmVudCBub2RlDQoJCQkJZm9yIChpID0gMCwgbCA9IGZvcm1hdExpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQoJCQkJCWlmIChyZW1vdmVGb3JtYXQoZm9ybWF0TGlzdFtpXSwgdmFycywgbm9kZSwgbm9kZSkpDQoJCQkJCQlicmVhazsNCgkJCQl9DQoNCgkJCQkvLyBQcm9jZXNzIHRoZSBjaGlsZHJlbg0KCQkJCWlmIChmb3JtYXQuZGVlcCkgew0KCQkJCQlmb3IgKGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKQ0KCQkJCQkJcHJvY2VzcyhjaGlsZHJlbltpXSk7DQoJCQkJfQ0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gZmluZEZvcm1hdFJvb3QoY29udGFpbmVyKSB7DQoJCQkJdmFyIGZvcm1hdFJvb3Q7DQoNCgkJCQkvLyBGaW5kIGZvcm1hdCByb290DQoJCQkJZWFjaChnZXRQYXJlbnRzKGNvbnRhaW5lci5wYXJlbnROb2RlKS5yZXZlcnNlKCksIGZ1bmN0aW9uKHBhcmVudCkgew0KCQkJCQl2YXIgZm9ybWF0Ow0KDQoJCQkJCS8vIEZpbmQgZm9ybWF0IHJvb3QgZWxlbWVudA0KCQkJCQlpZiAoIWZvcm1hdFJvb3QgJiYgcGFyZW50LmlkICE9ICdfc3RhcnQnICYmIHBhcmVudC5pZCAhPSAnX2VuZCcpIHsNCgkJCQkJCS8vIElzIHRoZSBub2RlIG1hdGNoaW5nIHRoZSBmb3JtYXQgd2UgYXJlIGxvb2tpbmcgZm9yDQoJCQkJCQlmb3JtYXQgPSBtYXRjaE5vZGUocGFyZW50LCBuYW1lLCB2YXJzKTsNCgkJCQkJCWlmIChmb3JtYXQgJiYgZm9ybWF0LnNwbGl0ICE9PSBmYWxzZSkNCgkJCQkJCQlmb3JtYXRSb290ID0gcGFyZW50Ow0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm4gZm9ybWF0Um9vdDsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHdyYXBBbmRTcGxpdChmb3JtYXRfcm9vdCwgY29udGFpbmVyLCB0YXJnZXQsIHNwbGl0KSB7DQoJCQkJdmFyIHBhcmVudCwgY2xvbmUsIGxhc3RDbG9uZSwgZmlyc3RDbG9uZSwgaSwgZm9ybWF0Um9vdFBhcmVudDsNCg0KCQkJCS8vIEZvcm1hdCByb290IGZvdW5kIHRoZW4gY2xvbmUgZm9ybWF0cyBhbmQgc3BsaXQgaXQNCgkJCQlpZiAoZm9ybWF0X3Jvb3QpIHsNCgkJCQkJZm9ybWF0Um9vdFBhcmVudCA9IGZvcm1hdF9yb290LnBhcmVudE5vZGU7DQoNCgkJCQkJZm9yIChwYXJlbnQgPSBjb250YWluZXIucGFyZW50Tm9kZTsgcGFyZW50ICYmIHBhcmVudCAhPSBmb3JtYXRSb290UGFyZW50OyBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSkgew0KCQkJCQkJY2xvbmUgPSBwYXJlbnQuY2xvbmVOb2RlKEZBTFNFKTsNCg0KCQkJCQkJZm9yIChpID0gMDsgaSA8IGZvcm1hdExpc3QubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQlpZiAocmVtb3ZlRm9ybWF0KGZvcm1hdExpc3RbaV0sIHZhcnMsIGNsb25lLCBjbG9uZSkpIHsNCgkJCQkJCQkJY2xvbmUgPSAwOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEJ1aWxkIHdyYXBwZXIgbm9kZQ0KCQkJCQkJaWYgKGNsb25lKSB7DQoJCQkJCQkJaWYgKGxhc3RDbG9uZSkNCgkJCQkJCQkJY2xvbmUuYXBwZW5kQ2hpbGQobGFzdENsb25lKTsNCg0KCQkJCQkJCWlmICghZmlyc3RDbG9uZSkNCgkJCQkJCQkJZmlyc3RDbG9uZSA9IGNsb25lOw0KDQoJCQkJCQkJbGFzdENsb25lID0gY2xvbmU7DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkvLyBOZXZlciBzcGxpdCBibG9jayBlbGVtZW50cyBpZiB0aGUgZm9ybWF0IGlzIG1peGVkDQoJCQkJCWlmIChzcGxpdCAmJiAoIWZvcm1hdC5taXhlZCB8fCAhaXNCbG9jayhmb3JtYXRfcm9vdCkpKQ0KCQkJCQkJY29udGFpbmVyID0gZG9tLnNwbGl0KGZvcm1hdF9yb290LCBjb250YWluZXIpOw0KDQoJCQkJCS8vIFdyYXAgY29udGFpbmVyIGluIGNsb25lZCBmb3JtYXRzDQoJCQkJCWlmIChsYXN0Q2xvbmUpIHsNCgkJCQkJCXRhcmdldC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShsYXN0Q2xvbmUsIHRhcmdldCk7DQoJCQkJCQlmaXJzdENsb25lLmFwcGVuZENoaWxkKHRhcmdldCk7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlyZXR1cm4gY29udGFpbmVyOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gc3BsaXRUb0Zvcm1hdFJvb3QoY29udGFpbmVyKSB7DQoJCQkJcmV0dXJuIHdyYXBBbmRTcGxpdChmaW5kRm9ybWF0Um9vdChjb250YWluZXIpLCBjb250YWluZXIsIGNvbnRhaW5lciwgdHJ1ZSk7DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiB1bndyYXAoc3RhcnQpIHsNCgkJCQl2YXIgbm9kZSA9IGRvbS5nZXQoc3RhcnQgPyAnX3N0YXJ0JyA6ICdfZW5kJyksDQoJCQkJCW91dCA9IG5vZGVbc3RhcnQgPyAnZmlyc3RDaGlsZCcgOiAnbGFzdENoaWxkJ107DQoNCgkJCQkvLyBJZiB0aGUgZW5kIGlzIHBsYWNlZCB3aXRoaW4gdGhlIHN0YXJ0IHRoZSByZXN1bHQgd2lsbCBiZSByZW1vdmVkDQoJCQkJLy8gU28gdGhpcyBjaGVja3MgaWYgdGhlIG91dCBub2RlIGlzIGEgYm9va21hcmsgbm9kZSBpZiBpdCBpcyBpdA0KCQkJCS8vIGNoZWNrcyBmb3IgYW5vdGhlciBtb3JlIHN1aXRhYmxlIG5vZGUNCgkJCQlpZiAoaXNCb29rbWFya05vZGUob3V0KSkNCgkJCQkJb3V0ID0gb3V0W3N0YXJ0ID8gJ2ZpcnN0Q2hpbGQnIDogJ2xhc3RDaGlsZCddOw0KDQoJCQkJZG9tLnJlbW92ZShub2RlLCB0cnVlKTsNCg0KCQkJCXJldHVybiBvdXQ7DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiByZW1vdmVSbmdTdHlsZShybmcpIHsNCgkJCQl2YXIgc3RhcnRDb250YWluZXIsIGVuZENvbnRhaW5lcjsNCg0KCQkJCXJuZyA9IGV4cGFuZFJuZyhybmcsIGZvcm1hdExpc3QsIFRSVUUpOw0KDQoJCQkJaWYgKGZvcm1hdC5zcGxpdCkgew0KCQkJCQlzdGFydENvbnRhaW5lciA9IGdldENvbnRhaW5lcihybmcsIFRSVUUpOw0KCQkJCQllbmRDb250YWluZXIgPSBnZXRDb250YWluZXIocm5nKTsNCg0KCQkJCQlpZiAoc3RhcnRDb250YWluZXIgIT0gZW5kQ29udGFpbmVyKSB7DQoJCQkJCQkvLyBXcmFwIHN0YXJ0L2VuZCBub2RlcyBpbiBzcGFuIGVsZW1lbnQgc2luY2UgdGhlc2UgbWlnaHQgYmUgY2xvbmVkL21vdmVkDQoJCQkJCQlzdGFydENvbnRhaW5lciA9IHdyYXAoc3RhcnRDb250YWluZXIsICdzcGFuJywge2lkIDogJ19zdGFydCcsIF9tY2VfdHlwZSA6ICdib29rbWFyayd9KTsNCgkJCQkJCWVuZENvbnRhaW5lciA9IHdyYXAoZW5kQ29udGFpbmVyLCAnc3BhbicsIHtpZCA6ICdfZW5kJywgX21jZV90eXBlIDogJ2Jvb2ttYXJrJ30pOw0KDQoJCQkJCQkvLyBTcGxpdCBzdGFydC9lbmQNCgkJCQkJCXNwbGl0VG9Gb3JtYXRSb290KHN0YXJ0Q29udGFpbmVyKTsNCgkJCQkJCXNwbGl0VG9Gb3JtYXRSb290KGVuZENvbnRhaW5lcik7DQoNCgkJCQkJCS8vIFVud3JhcCBzdGFydC9lbmQgdG8gZ2V0IHJlYWwgZWxlbWVudHMgYWdhaW4NCgkJCQkJCXN0YXJ0Q29udGFpbmVyID0gdW53cmFwKFRSVUUpOw0KCQkJCQkJZW5kQ29udGFpbmVyID0gdW53cmFwKCk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJc3RhcnRDb250YWluZXIgPSBlbmRDb250YWluZXIgPSBzcGxpdFRvRm9ybWF0Um9vdChzdGFydENvbnRhaW5lcik7DQoNCgkJCQkJLy8gVXBkYXRlIHJhbmdlIHBvc2l0aW9ucyBzaW5jZSB0aGV5IG1pZ2h0IGhhdmUgY2hhbmdlZCBhZnRlciB0aGUgc3BsaXQgb3BlcmF0aW9ucw0KCQkJCQlybmcuc3RhcnRDb250YWluZXIgPSBzdGFydENvbnRhaW5lci5wYXJlbnROb2RlOw0KCQkJCQlybmcuc3RhcnRPZmZzZXQgPSBub2RlSW5kZXgoc3RhcnRDb250YWluZXIpOw0KCQkJCQlybmcuZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyLnBhcmVudE5vZGU7DQoJCQkJCXJuZy5lbmRPZmZzZXQgPSBub2RlSW5kZXgoZW5kQ29udGFpbmVyKSArIDE7DQoJCQkJfQ0KDQoJCQkJLy8gUmVtb3ZlIGl0ZW1zIGJldHdlZW4gc3RhcnQvZW5kDQoJCQkJcmFuZ2VVdGlscy53YWxrKHJuZywgZnVuY3Rpb24obm9kZXMpIHsNCgkJCQkJZWFjaChub2RlcywgZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJcHJvY2Vzcyhub2RlKTsNCgkJCQkJfSk7DQoJCQkJfSk7DQoJCQl9Ow0KDQoJCQkvLyBIYW5kbGUgbm9kZQ0KCQkJaWYgKG5vZGUpIHsNCgkJCQlybmcgPSBkb20uY3JlYXRlUm5nKCk7DQoJCQkJcm5nLnNldFN0YXJ0QmVmb3JlKG5vZGUpOw0KCQkJCXJuZy5zZXRFbmRBZnRlcihub2RlKTsNCgkJCQlyZW1vdmVSbmdTdHlsZShybmcpOw0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJaWYgKCFzZWxlY3Rpb24uaXNDb2xsYXBzZWQoKSB8fCAhZm9ybWF0LmlubGluZSkgew0KCQkJCWJvb2ttYXJrID0gc2VsZWN0aW9uLmdldEJvb2ttYXJrKCk7DQoJCQkJcmVtb3ZlUm5nU3R5bGUoc2VsZWN0aW9uLmdldFJuZyhUUlVFKSk7DQoJCQkJc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsNCg0KCQkJCS8vIENoZWNrIGlmIHN0YXJ0IGVsZW1lbnQgc3RpbGwgaGFzIGZvcm1hdHRpbmcgdGhlbiB3ZSBhcmUgYXQ6ICI8Yj50ZXh0fDwvYj50ZXh0IiBhbmQgbmVlZCB0byBtb3ZlIHRoZSBzdGFydCBpbnRvIHRoZSBuZXh0IHRleHQgbm9kZQ0KCQkJCWlmIChtYXRjaChuYW1lLCB2YXJzLCBzZWxlY3Rpb24uZ2V0U3RhcnQoKSkpIHsNCgkJCQkJbW92ZVN0YXJ0KHNlbGVjdGlvbi5nZXRSbmcodHJ1ZSkpOw0KCQkJCX0NCg0KCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCQl9IGVsc2UNCgkJCQlwZXJmb3JtQ2FyZXRBY3Rpb24oJ3JlbW92ZScsIG5hbWUsIHZhcnMpOw0KCQl9Ow0KDQoJCS8qKg0KCQkgKiBUb2dnbGVzIHRoZSBzcGVjaWZpZWQgZm9ybWF0IG9uL29mZi4NCgkJICoNCgkJICogQG1ldGhvZCB0b2dnbGUNCgkJICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgTmFtZSBvZiBmb3JtYXQgdG8gYXBwbHkvcmVtb3ZlLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gdmFycyBPcHRpb25hbCBsaXN0IG9mIHZhcmlhYmxlcyB0byByZXBsYWNlIHdpdGhpbiBmb3JtYXQgYmVmb3JlIGFwcGx5aW5nL3JlbW92aW5nIGl0Lg0KCQkgKiBAcGFyYW0ge05vZGV9IG5vZGUgT3B0aW9uYWwgbm9kZSB0byBhcHBseSB0aGUgZm9ybWF0IHRvIG9yIHJlbW92ZSBmcm9tLiBEZWZhdWx0cyB0byBjdXJyZW50IHNlbGVjdGlvbi4NCgkJICovDQoJCWZ1bmN0aW9uIHRvZ2dsZShuYW1lLCB2YXJzLCBub2RlKSB7DQoJCQlpZiAobWF0Y2gobmFtZSwgdmFycywgbm9kZSkpDQoJCQkJcmVtb3ZlKG5hbWUsIHZhcnMsIG5vZGUpOw0KCQkJZWxzZQ0KCQkJCWFwcGx5KG5hbWUsIHZhcnMsIG5vZGUpOw0KCQl9Ow0KDQoJCS8qKg0KCQkgKiBSZXR1cm4gdHJ1ZS9mYWxzZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIHRoZSBzcGVjaWZpZWQgZm9ybWF0Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIG1hdGNoTm9kZQ0KCQkgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBjaGVjayB0aGUgZm9ybWF0IG9uLg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBGb3JtYXQgbmFtZSB0byBjaGVjay4NCgkJICogQHBhcmFtIHtPYmplY3R9IHZhcnMgT3B0aW9uYWwgbGlzdCBvZiB2YXJpYWJsZXMgdG8gcmVwbGFjZSBiZWZvcmUgY2hlY2tpbmcgaXQuDQoJCSAqIEBwYXJhbSB7Qm9vbGVhbn0gc2ltaWxhciBNYXRjaCBmb3JtYXQgdGhhdCBoYXMgc2ltaWxhciBwcm9wZXJ0aWVzLg0KCQkgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGZvcm1hdCBvYmplY3QgaXQgbWF0Y2hlcyBvciB1bmRlZmluZWQgaWYgaXQgZG9lc24ndCBtYXRjaC4NCgkJICovDQoJCWZ1bmN0aW9uIG1hdGNoTm9kZShub2RlLCBuYW1lLCB2YXJzLCBzaW1pbGFyKSB7DQoJCQl2YXIgZm9ybWF0TGlzdCA9IGdldChuYW1lKSwgZm9ybWF0LCBpLCBjbGFzc2VzOw0KDQoJCQlmdW5jdGlvbiBtYXRjaEl0ZW1zKG5vZGUsIGZvcm1hdCwgaXRlbV9uYW1lKSB7DQoJCQkJdmFyIGtleSwgdmFsdWUsIGl0ZW1zID0gZm9ybWF0W2l0ZW1fbmFtZV0sIGk7DQoNCgkJCQkvLyBDaGVjayBhbGwgaXRlbXMNCgkJCQlpZiAoaXRlbXMpIHsNCgkJCQkJLy8gTm9uIGluZGV4ZWQgb2JqZWN0DQoJCQkJCWlmIChpdGVtcy5sZW5ndGggPT09IHVuZGVmaW5lZCkgew0KCQkJCQkJZm9yIChrZXkgaW4gaXRlbXMpIHsNCgkJCQkJCQlpZiAoaXRlbXMuaGFzT3duUHJvcGVydHkoa2V5KSkgew0KCQkJCQkJCQlpZiAoaXRlbV9uYW1lID09PSAnYXR0cmlidXRlcycpDQoJCQkJCQkJCQl2YWx1ZSA9IGRvbS5nZXRBdHRyaWIobm9kZSwga2V5KTsNCgkJCQkJCQkJZWxzZQ0KCQkJCQkJCQkJdmFsdWUgPSBnZXRTdHlsZShub2RlLCBrZXkpOw0KDQoJCQkJCQkJCWlmIChzaW1pbGFyICYmICF2YWx1ZSAmJiAhZm9ybWF0LmV4YWN0KQ0KCQkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJCWlmICgoIXNpbWlsYXIgfHwgZm9ybWF0LmV4YWN0KSAmJiAhaXNFcSh2YWx1ZSwgcmVwbGFjZVZhcnMoaXRlbXNba2V5XSwgdmFycykpKQ0KCQkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfSBlbHNlIHsNCgkJCQkJCS8vIE9ubHkgb25lIG1hdGNoIG5lZWRlZCBmb3IgaW5kZXhlZCBhcnJheXMNCgkJCQkJCWZvciAoaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgew0KCQkJCQkJCWlmIChpdGVtX25hbWUgPT09ICdhdHRyaWJ1dGVzJyA/IGRvbS5nZXRBdHRyaWIobm9kZSwgaXRlbXNbaV0pIDogZ2V0U3R5bGUobm9kZSwgaXRlbXNbaV0pKQ0KCQkJCQkJCQlyZXR1cm4gZm9ybWF0Ow0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGZvcm1hdDsNCgkJCX07DQoNCgkJCWlmIChmb3JtYXRMaXN0ICYmIG5vZGUpIHsNCgkJCQkvLyBDaGVjayBlYWNoIGZvcm1hdCBpbiBsaXN0DQoJCQkJZm9yIChpID0gMDsgaSA8IGZvcm1hdExpc3QubGVuZ3RoOyBpKyspIHsNCgkJCQkJZm9ybWF0ID0gZm9ybWF0TGlzdFtpXTsNCg0KCQkJCQkvLyBOYW1lIG5hbWUsIGF0dHJpYnV0ZXMsIHN0eWxlcyBhbmQgY2xhc3Nlcw0KCQkJCQlpZiAobWF0Y2hOYW1lKG5vZGUsIGZvcm1hdCkgJiYgbWF0Y2hJdGVtcyhub2RlLCBmb3JtYXQsICdhdHRyaWJ1dGVzJykgJiYgbWF0Y2hJdGVtcyhub2RlLCBmb3JtYXQsICdzdHlsZXMnKSkgew0KCQkJCQkJLy8gTWF0Y2ggY2xhc3Nlcw0KCQkJCQkJaWYgKGNsYXNzZXMgPSBmb3JtYXQuY2xhc3Nlcykgew0KCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJCWlmICghZG9tLmhhc0NsYXNzKG5vZGUsIGNsYXNzZXNbaV0pKQ0KCQkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuIGZvcm1hdDsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfTsNCg0KCQkvKioNCgkJICogTWF0Y2hlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gb3Igc3BlY2lmaWVkIG5vZGUgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIGZvcm1hdCBuYW1lLg0KCQkgKg0KCQkgKiBAbWV0aG9kIG1hdGNoDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgZm9ybWF0IHRvIG1hdGNoLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gdmFycyBPcHRpb25hbCBsaXN0IG9mIHZhcmlhYmxlcyB0byByZXBsYWNlIGJlZm9yZSBjaGVja2luZyBpdC4NCgkJICogQHBhcmFtIHtOb2RlfSBub2RlIE9wdGlvbmFsIG5vZGUgdG8gY2hlY2suDQoJCSAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUvZmFsc2UgaWYgdGhlIHNwZWNpZmllZCBzZWxlY3Rpb24vbm9kZSBtYXRjaGVzIHRoZSBmb3JtYXQuDQoJCSAqLw0KCQlmdW5jdGlvbiBtYXRjaChuYW1lLCB2YXJzLCBub2RlKSB7DQoJCQl2YXIgc3RhcnROb2RlLCBpOw0KDQoJCQlmdW5jdGlvbiBtYXRjaFBhcmVudHMobm9kZSkgew0KCQkJCS8vIEZpbmQgZmlyc3Qgbm9kZSB3aXRoIHNpbWlsYXIgZm9ybWF0IHNldHRpbmdzDQoJCQkJbm9kZSA9IGRvbS5nZXRQYXJlbnQobm9kZSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQlyZXR1cm4gISFtYXRjaE5vZGUobm9kZSwgbmFtZSwgdmFycywgdHJ1ZSk7DQoJCQkJfSk7DQoNCgkJCQkvLyBEbyBhbiBleGFjdCBjaGVjayBvbiB0aGUgc2ltaWxhciBmb3JtYXQgZWxlbWVudA0KCQkJCXJldHVybiBtYXRjaE5vZGUobm9kZSwgbmFtZSwgdmFycyk7DQoJCQl9Ow0KDQoJCQkvLyBDaGVjayBzcGVjaWZpZWQgbm9kZQ0KCQkJaWYgKG5vZGUpDQoJCQkJcmV0dXJuIG1hdGNoUGFyZW50cyhub2RlKTsNCg0KCQkJLy8gQ2hlY2sgcGVuZGluZyBmb3JtYXRzDQoJCQlpZiAoc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkpIHsNCgkJCQlmb3IgKGkgPSBwZW5kaW5nRm9ybWF0cy5hcHBseS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCQlpZiAocGVuZGluZ0Zvcm1hdHMuYXBwbHlbaV0ubmFtZSA9PSBuYW1lKQ0KCQkJCQkJcmV0dXJuIHRydWU7DQoJCQkJfQ0KDQoJCQkJZm9yIChpID0gcGVuZGluZ0Zvcm1hdHMucmVtb3ZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCWlmIChwZW5kaW5nRm9ybWF0cy5yZW1vdmVbaV0ubmFtZSA9PSBuYW1lKQ0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCg0KCQkJCXJldHVybiBtYXRjaFBhcmVudHMoc2VsZWN0aW9uLmdldE5vZGUoKSk7DQoJCQl9DQoNCgkJCS8vIENoZWNrIHNlbGVjdGVkIG5vZGUNCgkJCW5vZGUgPSBzZWxlY3Rpb24uZ2V0Tm9kZSgpOw0KCQkJaWYgKG1hdGNoUGFyZW50cyhub2RlKSkNCgkJCQlyZXR1cm4gVFJVRTsNCg0KCQkJLy8gQ2hlY2sgc3RhcnQgbm9kZSBpZiBpdCdzIGRpZmZlcmVudA0KCQkJc3RhcnROb2RlID0gc2VsZWN0aW9uLmdldFN0YXJ0KCk7DQoJCQlpZiAoc3RhcnROb2RlICE9IG5vZGUpIHsNCgkJCQlpZiAobWF0Y2hQYXJlbnRzKHN0YXJ0Tm9kZSkpDQoJCQkJCXJldHVybiBUUlVFOw0KCQkJfQ0KDQoJCQlyZXR1cm4gRkFMU0U7DQoJCX07DQoNCgkJLyoqDQoJCSAqIE1hdGNoZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFnYWluc3QgdGhlIGFycmF5IG9mIGZvcm1hdHMgYW5kIHJldHVybnMgYSBuZXcgYXJyYXkgd2l0aCBtYXRjaGluZyBmb3JtYXRzLg0KCQkgKg0KCQkgKiBAbWV0aG9kIG1hdGNoQWxsDQoJCSAqIEBwYXJhbSB7QXJyYXl9IG5hbWVzIE5hbWUgb2YgZm9ybWF0IHRvIG1hdGNoLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gdmFycyBPcHRpb25hbCBsaXN0IG9mIHZhcmlhYmxlcyB0byByZXBsYWNlIGJlZm9yZSBjaGVja2luZyBpdC4NCgkJICogQHJldHVybiB7QXJyYXl9IEFycmF5IHdpdGggbWF0Y2hlZCBmb3JtYXRzLg0KCQkgKi8NCgkJZnVuY3Rpb24gbWF0Y2hBbGwobmFtZXMsIHZhcnMpIHsNCgkJCXZhciBzdGFydEVsZW1lbnQsIG1hdGNoZWRGb3JtYXROYW1lcyA9IFtdLCBjaGVja2VkTWFwID0ge30sIGksIG5pLCBuYW1lOw0KDQoJCQkvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGNvbGxhcHNlZCB0aGVuIGNoZWNrIHBlbmRpbmcgZm9ybWF0cw0KCQkJaWYgKHNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpKSB7DQoJCQkJZm9yIChuaSA9IDA7IG5pIDwgbmFtZXMubGVuZ3RoOyBuaSsrKSB7DQoJCQkJCS8vIElmIHRoZSBuYW1lIGlzIHRvIGJlIHJlbW92ZWQsIHRoZW4gc3RvcCBpdCBmcm9tIGJlaW5nIGFkZGVkDQoJCQkJCWZvciAoaSA9IHBlbmRpbmdGb3JtYXRzLnJlbW92ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCQkJbmFtZSA9IG5hbWVzW25pXTsNCg0KCQkJCQkJaWYgKHBlbmRpbmdGb3JtYXRzLnJlbW92ZVtpXS5uYW1lID09IG5hbWUpIHsNCgkJCQkJCQljaGVja2VkTWFwW25hbWVdID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIElmIHRoZSBmb3JtYXQgaXMgdG8gYmUgYXBwbGllZA0KCQkJCWZvciAoaSA9IHBlbmRpbmdGb3JtYXRzLmFwcGx5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCWZvciAobmkgPSAwOyBuaSA8IG5hbWVzLmxlbmd0aDsgbmkrKykgew0KCQkJCQkJbmFtZSA9IG5hbWVzW25pXTsNCg0KCQkJCQkJaWYgKCFjaGVja2VkTWFwW25hbWVdICYmIHBlbmRpbmdGb3JtYXRzLmFwcGx5W2ldLm5hbWUgPT0gbmFtZSkgew0KCQkJCQkJCWNoZWNrZWRNYXBbbmFtZV0gPSB0cnVlOw0KCQkJCQkJCW1hdGNoZWRGb3JtYXROYW1lcy5wdXNoKG5hbWUpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBDaGVjayBzdGFydCBvZiBzZWxlY3Rpb24gZm9yIGZvcm1hdHMNCgkJCXN0YXJ0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRTdGFydCgpOw0KCQkJZG9tLmdldFBhcmVudChzdGFydEVsZW1lbnQsIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQl2YXIgaSwgbmFtZTsNCg0KCQkJCWZvciAoaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgew0KCQkJCQluYW1lID0gbmFtZXNbaV07DQoNCgkJCQkJaWYgKCFjaGVja2VkTWFwW25hbWVdICYmIG1hdGNoTm9kZShub2RlLCBuYW1lLCB2YXJzKSkgew0KCQkJCQkJY2hlY2tlZE1hcFtuYW1lXSA9IHRydWU7DQoJCQkJCQltYXRjaGVkRm9ybWF0TmFtZXMucHVzaChuYW1lKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0pOw0KDQoJCQlyZXR1cm4gbWF0Y2hlZEZvcm1hdE5hbWVzOw0KCQl9Ow0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRydWUvZmFsc2UgaWYgdGhlIHNwZWNpZmllZCBmb3JtYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9yIG5vdC4gSXQgd2lsbCBjdXJyZW50bHkgb25seSBjaGVjayB0aGUgc3RhdGUgZm9yIHNlbGVjdG9yIGZvcm1hdHMsIGl0IHJldHVybnMgdHJ1ZSBvbiBhbGwgb3RoZXIgZm9ybWF0IHR5cGVzLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGNhbkFwcGx5DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgZm9ybWF0IHRvIGNoZWNrLg0KCQkgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlL2ZhbHNlIGlmIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbi9ub2RlLg0KCQkgKi8NCgkJZnVuY3Rpb24gY2FuQXBwbHkobmFtZSkgew0KCQkJdmFyIGZvcm1hdExpc3QgPSBnZXQobmFtZSksIHN0YXJ0Tm9kZSwgcGFyZW50cywgaSwgeCwgc2VsZWN0b3I7DQoNCgkJCWlmIChmb3JtYXRMaXN0KSB7DQoJCQkJc3RhcnROb2RlID0gc2VsZWN0aW9uLmdldFN0YXJ0KCk7DQoJCQkJcGFyZW50cyA9IGdldFBhcmVudHMoc3RhcnROb2RlKTsNCg0KCQkJCWZvciAoeCA9IGZvcm1hdExpc3QubGVuZ3RoIC0gMTsgeCA+PSAwOyB4LS0pIHsNCgkJCQkJc2VsZWN0b3IgPSBmb3JtYXRMaXN0W3hdLnNlbGVjdG9yOw0KDQoJCQkJCS8vIEZvcm1hdCBpcyBub3Qgc2VsZWN0b3IgYmFzZWQsIHRoZW4gYWx3YXlzIHJldHVybiBUUlVFDQoJCQkJCWlmICghc2VsZWN0b3IpDQoJCQkJCQlyZXR1cm4gVFJVRTsNCg0KCQkJCQlmb3IgKGkgPSBwYXJlbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQlpZiAoZG9tLmlzKHBhcmVudHNbaV0sIHNlbGVjdG9yKSkNCgkJCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9Ow0KDQoJCS8vIEV4cG9zZSB0byBwdWJsaWMNCgkJdGlueW1jZS5leHRlbmQodGhpcywgew0KCQkJZ2V0IDogZ2V0LA0KCQkJcmVnaXN0ZXIgOiByZWdpc3RlciwNCgkJCWFwcGx5IDogYXBwbHksDQoJCQlyZW1vdmUgOiByZW1vdmUsDQoJCQl0b2dnbGUgOiB0b2dnbGUsDQoJCQltYXRjaCA6IG1hdGNoLA0KCQkJbWF0Y2hBbGwgOiBtYXRjaEFsbCwNCgkJCW1hdGNoTm9kZSA6IG1hdGNoTm9kZSwNCgkJCWNhbkFwcGx5IDogY2FuQXBwbHkNCgkJfSk7DQoNCgkJLy8gUHJpdmF0ZSBmdW5jdGlvbnMNCg0KCQkvKioNCgkJICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgbm9kZXMgbmFtZSBtYXRjaGVzIHRoZSBmb3JtYXQgaW5saW5lL2Jsb2NrIG9yIHNlbGVjdG9yLg0KCQkgKg0KCQkgKiBAcHJpdmF0ZQ0KCQkgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBtYXRjaCBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgZm9ybWF0Lg0KCQkgKiBAcGFyYW0ge09iamVjdH0gZm9ybWF0IEZvcm1hdCBvYmplY3QgbyBtYXRjaCB3aXRoLg0KCQkgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlL2ZhbHNlIGlmIHRoZSBmb3JtYXQgbWF0Y2hlcy4NCgkJICovDQoJCWZ1bmN0aW9uIG1hdGNoTmFtZShub2RlLCBmb3JtYXQpIHsNCgkJCS8vIENoZWNrIGZvciBpbmxpbmUgbWF0Y2gNCgkJCWlmIChpc0VxKG5vZGUsIGZvcm1hdC5pbmxpbmUpKQ0KCQkJCXJldHVybiBUUlVFOw0KDQoJCQkvLyBDaGVjayBmb3IgYmxvY2sgbWF0Y2gNCgkJCWlmIChpc0VxKG5vZGUsIGZvcm1hdC5ibG9jaykpDQoJCQkJcmV0dXJuIFRSVUU7DQoNCgkJCS8vIENoZWNrIGZvciBzZWxlY3RvciBtYXRjaA0KCQkJaWYgKGZvcm1hdC5zZWxlY3RvcikNCgkJCQlyZXR1cm4gZG9tLmlzKG5vZGUsIGZvcm1hdC5zZWxlY3Rvcik7DQoJCX07DQoNCgkJLyoqDQoJCSAqIENvbXBhcmVzIHR3byBzdHJpbmcvbm9kZXMgcmVnYXJkbGVzcyBvZiB0aGVpciBjYXNlLg0KCQkgKg0KCQkgKiBAcHJpdmF0ZQ0KCQkgKiBAcGFyYW0ge1N0cmluZy9Ob2RlfSBOb2RlIG9yIHN0cmluZyB0byBjb21wYXJlLg0KCQkgKiBAcGFyYW0ge1N0cmluZy9Ob2RlfSBOb2RlIG9yIHN0cmluZyB0byBjb21wYXJlLg0KCQkgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlL2ZhbHNlIGlmIHRoZXkgbWF0Y2guDQoJCSAqLw0KCQlmdW5jdGlvbiBpc0VxKHN0cjEsIHN0cjIpIHsNCgkJCXN0cjEgPSBzdHIxIHx8ICcnOw0KCQkJc3RyMiA9IHN0cjIgfHwgJyc7DQoNCgkJCXN0cjEgPSAnJyArIChzdHIxLm5vZGVOYW1lIHx8IHN0cjEpOw0KCQkJc3RyMiA9ICcnICsgKHN0cjIubm9kZU5hbWUgfHwgc3RyMik7DQoNCgkJCXJldHVybiBzdHIxLnRvTG93ZXJDYXNlKCkgPT0gc3RyMi50b0xvd2VyQ2FzZSgpOw0KCQl9Ow0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRoZSBzdHlsZSBieSBuYW1lIG9uIHRoZSBzcGVjaWZpZWQgbm9kZS4gVGhpcyBtZXRob2QgbW9kaWZpZXMgdGhlIHN0eWxlDQoJCSAqIGNvbnRlbnRzIHRvIG1ha2UgaXQgbW9yZSBlYXN5IHRvIG1hdGNoLiBUaGlzIHdpbGwgcmVzb2x2ZSBhIGZldyBicm93c2VyIGlzc3Vlcy4NCgkJICoNCgkJICogQHByaXZhdGUNCgkJICogQHBhcmFtIHtOb2RlfSBub2RlIHRvIGdldCBzdHlsZSBmcm9tLg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBTdHlsZSBuYW1lIHRvIGdldC4NCgkJICogQHJldHVybiB7U3RyaW5nfSBTdHlsZSBpdGVtIHZhbHVlLg0KCQkgKi8NCgkJZnVuY3Rpb24gZ2V0U3R5bGUobm9kZSwgbmFtZSkgew0KCQkJdmFyIHN0eWxlVmFsID0gZG9tLmdldFN0eWxlKG5vZGUsIG5hbWUpOw0KDQoJCQkvLyBGb3JjZSB0aGUgZm9ybWF0IHRvIGhleA0KCQkJaWYgKG5hbWUgPT0gJ2NvbG9yJyB8fCBuYW1lID09ICdiYWNrZ3JvdW5kQ29sb3InKQ0KCQkJCXN0eWxlVmFsID0gZG9tLnRvSGV4KHN0eWxlVmFsKTsNCg0KCQkJLy8gT3BlcmEgd2lsbCByZXR1cm4gYm9sZCBhcyA3MDANCgkJCWlmIChuYW1lID09ICdmb250V2VpZ2h0JyAmJiBzdHlsZVZhbCA9PSA3MDApDQoJCQkJc3R5bGVWYWwgPSAnYm9sZCc7DQoNCgkJCXJldHVybiAnJyArIHN0eWxlVmFsOw0KCQl9Ow0KDQoJCS8qKg0KCQkgKiBSZXBsYWNlcyB2YXJpYWJsZXMgaW4gdGhlIHZhbHVlLiBUaGUgdmFyaWFibGUgZm9ybWF0IGlzICV2YXIuDQoJCSAqDQoJCSAqIEBwcml2YXRlDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byByZXBsYWNlIHZhcmlhYmxlcyBpbi4NCgkJICogQHBhcmFtIHtPYmplY3R9IHZhcnMgTmFtZS92YWx1ZSBhcnJheSB3aXRoIHZhcmlhYmxlcyB0byByZXBsYWNlLg0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IE5ldyB2YWx1ZSB3aXRoIHJlcGxhY2VkIHZhcmlhYmxlcy4NCgkJICovDQoJCWZ1bmN0aW9uIHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKSB7DQoJCQlpZiAodHlwZW9mKHZhbHVlKSAhPSAic3RyaW5nIikNCgkJCQl2YWx1ZSA9IHZhbHVlKHZhcnMpOw0KCQkJZWxzZSBpZiAodmFycykgew0KCQkJCXZhbHVlID0gdmFsdWUucmVwbGFjZSgvJShcdyspL2csIGZ1bmN0aW9uKHN0ciwgbmFtZSkgew0KCQkJCQlyZXR1cm4gdmFyc1tuYW1lXSB8fCBzdHI7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiB2YWx1ZTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBpc1doaXRlU3BhY2VOb2RlKG5vZGUpIHsNCgkJCXJldHVybiBub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IDMgJiYgL14oW1xzXHJcbl0rfCkkLy50ZXN0KG5vZGUubm9kZVZhbHVlKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiB3cmFwKG5vZGUsIG5hbWUsIGF0dHJzKSB7DQoJCQl2YXIgd3JhcHBlciA9IGRvbS5jcmVhdGUobmFtZSwgYXR0cnMpOw0KDQoJCQlub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIG5vZGUpOw0KCQkJd3JhcHBlci5hcHBlbmRDaGlsZChub2RlKTsNCg0KCQkJcmV0dXJuIHdyYXBwZXI7DQoJCX07DQoNCgkJLyoqDQoJCSAqIEV4cGFuZHMgdGhlIHNwZWNpZmllZCByYW5nZSBsaWtlIG9iamVjdCB0byBkZXBlbmRpbmcgb24gZm9ybWF0Lg0KCQkgKg0KCQkgKiBGb3IgZXhhbXBsZSBvbiBibG9jayBmb3JtYXRzIGl0IHdpbGwgbW92ZSB0aGUgc3RhcnQvZW5kIHBvc2l0aW9uDQoJCSAqIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgYmxvY2suDQoJCSAqDQoJCSAqIEBwcml2YXRlDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBybmcgUmFuZ2UgbGlrZSBvYmplY3QuDQoJCSAqIEBwYXJhbSB7QXJyYXl9IGZvcm1hdHMgQXJyYXkgd2l0aCBmb3JtYXRzIHRvIGV4cGFuZCBieS4NCgkJICogQHJldHVybiB7T2JqZWN0fSBFeHBhbmRlZCByYW5nZSBsaWtlIG9iamVjdC4NCgkJICovDQoJCWZ1bmN0aW9uIGV4cGFuZFJuZyhybmcsIGZvcm1hdCwgcmVtb3ZlKSB7DQoJCQl2YXIgc3RhcnRDb250YWluZXIgPSBybmcuc3RhcnRDb250YWluZXIsDQoJCQkJc3RhcnRPZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQsDQoJCQkJZW5kQ29udGFpbmVyID0gcm5nLmVuZENvbnRhaW5lciwNCgkJCQllbmRPZmZzZXQgPSBybmcuZW5kT2Zmc2V0LCBzaWJsaW5nLCBsYXN0SWR4Ow0KDQoJCQkvLyBUaGlzIGZ1bmN0aW9uIHdhbGtzIHVwIHRoZSB0cmVlIGlmIHRoZXJlIGlzIG5vIHNpYmxpbmdzIGJlZm9yZS9hZnRlciB0aGUgbm9kZQ0KCQkJZnVuY3Rpb24gZmluZFBhcmVudENvbnRhaW5lcihjb250YWluZXIsIGNoaWxkX25hbWUsIHNpYmxpbmdfbmFtZSwgcm9vdCkgew0KCQkJCXZhciBwYXJlbnQsIGNoaWxkOw0KDQoJCQkJcm9vdCA9IHJvb3QgfHwgZG9tLmdldFJvb3QoKTsNCg0KCQkJCWZvciAoOzspIHsNCgkJCQkJLy8gQ2hlY2sgaWYgd2UgY2FuIG1vdmUgdXAgYXJlIHdlIGF0IHJvb3QgbGV2ZWwgb3IgYm9keSBsZXZlbA0KCQkJCQlwYXJlbnQgPSBjb250YWluZXIucGFyZW50Tm9kZTsNCg0KCQkJCQkvLyBTdG9wIGV4cGFuZGluZyBvbiBibG9jayBlbGVtZW50cyBvciByb290IGRlcGVuZGluZyBvbiBmb3JtYXQNCgkJCQkJaWYgKHBhcmVudCA9PSByb290IHx8ICghZm9ybWF0WzBdLmJsb2NrX2V4cGFuZCAmJiBpc0Jsb2NrKHBhcmVudCkpKQ0KCQkJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCg0KCQkJCQlmb3IgKHNpYmxpbmcgPSBwYXJlbnRbY2hpbGRfbmFtZV07IHNpYmxpbmcgJiYgc2libGluZyAhPSBjb250YWluZXI7IHNpYmxpbmcgPSBzaWJsaW5nW3NpYmxpbmdfbmFtZV0pIHsNCgkJCQkJCWlmIChzaWJsaW5nLm5vZGVUeXBlID09IDEgJiYgIWlzQm9va21hcmtOb2RlKHNpYmxpbmcpKQ0KCQkJCQkJCXJldHVybiBjb250YWluZXI7DQoNCgkJCQkJCWlmIChzaWJsaW5nLm5vZGVUeXBlID09IDMgJiYgIWlzV2hpdGVTcGFjZU5vZGUoc2libGluZykpDQoJCQkJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCgkJCQkJfQ0KDQoJCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlOw0KCQkJCX0NCg0KCQkJCXJldHVybiBjb250YWluZXI7DQoJCQl9Ow0KDQoJCQkvLyBJZiBpbmRleCBiYXNlZCBzdGFydCBwb3NpdGlvbiB0aGVuIHJlc29sdmUgaXQNCgkJCWlmIChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PSAxICYmIHN0YXJ0Q29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSkgew0KCQkJCWxhc3RJZHggPSBzdGFydENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCAtIDE7DQoJCQkJc3RhcnRDb250YWluZXIgPSBzdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3N0YXJ0T2Zmc2V0ID4gbGFzdElkeCA/IGxhc3RJZHggOiBzdGFydE9mZnNldF07DQoNCgkJCQlpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMykNCgkJCQkJc3RhcnRPZmZzZXQgPSAwOw0KCQkJfQ0KDQoJCQkvLyBJZiBpbmRleCBiYXNlZCBlbmQgcG9zaXRpb24gdGhlbiByZXNvbHZlIGl0DQoJCQlpZiAoZW5kQ29udGFpbmVyLm5vZGVUeXBlID09IDEgJiYgZW5kQ29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSkgew0KCQkJCWxhc3RJZHggPSBlbmRDb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggLSAxOw0KCQkJCWVuZENvbnRhaW5lciA9IGVuZENvbnRhaW5lci5jaGlsZE5vZGVzW2VuZE9mZnNldCA+IGxhc3RJZHggPyBsYXN0SWR4IDogZW5kT2Zmc2V0IC0gMV07DQoNCgkJCQlpZiAoZW5kQ29udGFpbmVyLm5vZGVUeXBlID09IDMpDQoJCQkJCWVuZE9mZnNldCA9IGVuZENvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoOw0KCQkJfQ0KDQoJCQkvLyBFeGNsdWRlIGJvb2ttYXJrIG5vZGVzIGlmIHBvc3NpYmxlDQoJCQlpZiAoaXNCb29rbWFya05vZGUoc3RhcnRDb250YWluZXIucGFyZW50Tm9kZSkpDQoJCQkJc3RhcnRDb250YWluZXIgPSBzdGFydENvbnRhaW5lci5wYXJlbnROb2RlOw0KDQoJCQlpZiAoaXNCb29rbWFya05vZGUoc3RhcnRDb250YWluZXIpKQ0KCQkJCXN0YXJ0Q29udGFpbmVyID0gc3RhcnRDb250YWluZXIubmV4dFNpYmxpbmcgfHwgc3RhcnRDb250YWluZXI7DQoNCgkJCWlmIChpc0Jvb2ttYXJrTm9kZShlbmRDb250YWluZXIucGFyZW50Tm9kZSkpDQoJCQkJZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyLnBhcmVudE5vZGU7DQoNCgkJCWlmIChpc0Jvb2ttYXJrTm9kZShlbmRDb250YWluZXIpKQ0KCQkJCWVuZENvbnRhaW5lciA9IGVuZENvbnRhaW5lci5wcmV2aW91c1NpYmxpbmcgfHwgZW5kQ29udGFpbmVyOw0KDQoJCQkvLyBNb3ZlIHN0YXJ0L2VuZCBwb2ludCB1cCB0aGUgdHJlZSBpZiB0aGUgbGVhdmVzIGFyZSBzaGFycCBhbmQgaWYgd2UgYXJlIGluIGRpZmZlcmVudCBjb250YWluZXJzDQoJCQkvLyBFeGFtcGxlICogYmVjb21lcyAhOiAhPHA+PGI+PGk+KnRleHQ8L2k+PGk+dGV4dCo8L2k+PC9iPjwvcD4hDQoJCQkvLyBUaGlzIHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2Ygd3JhcHBlciBlbGVtZW50cyB0aGF0IG5lZWRzIHRvIGJlIGNyZWF0ZWQNCgkJCS8vIE1vdmUgc3RhcnQgcG9pbnQgdXAgdGhlIHRyZWUNCgkJCWlmIChmb3JtYXRbMF0uaW5saW5lIHx8IGZvcm1hdFswXS5ibG9ja19leHBhbmQpIHsNCgkJCQlzdGFydENvbnRhaW5lciA9IGZpbmRQYXJlbnRDb250YWluZXIoc3RhcnRDb250YWluZXIsICdmaXJzdENoaWxkJywgJ25leHRTaWJsaW5nJyk7DQoJCQkJZW5kQ29udGFpbmVyID0gZmluZFBhcmVudENvbnRhaW5lcihlbmRDb250YWluZXIsICdsYXN0Q2hpbGQnLCAncHJldmlvdXNTaWJsaW5nJyk7DQoJCQl9DQoNCgkJCS8vIEV4cGFuZCBzdGFydC9lbmQgY29udGFpbmVyIHRvIG1hdGNoaW5nIHNlbGVjdG9yDQoJCQlpZiAoZm9ybWF0WzBdLnNlbGVjdG9yICYmIGZvcm1hdFswXS5leHBhbmQgIT09IEZBTFNFICYmICFmb3JtYXRbMF0uaW5saW5lKSB7DQoJCQkJZnVuY3Rpb24gZmluZFNlbGVjdG9yRW5kUG9pbnQoY29udGFpbmVyLCBzaWJsaW5nX25hbWUpIHsNCgkJCQkJdmFyIHBhcmVudHMsIGksIHk7DQoNCgkJCQkJaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PSAzICYmIGNvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoID09IDAgJiYgY29udGFpbmVyW3NpYmxpbmdfbmFtZV0pDQoJCQkJCQljb250YWluZXIgPSBjb250YWluZXJbc2libGluZ19uYW1lXTsNCg0KCQkJCQlwYXJlbnRzID0gZ2V0UGFyZW50cyhjb250YWluZXIpOw0KCQkJCQlmb3IgKGkgPSAwOyBpIDwgcGFyZW50cy5sZW5ndGg7IGkrKykgew0KCQkJCQkJZm9yICh5ID0gMDsgeSA8IGZvcm1hdC5sZW5ndGg7IHkrKykgew0KCQkJCQkJCWlmIChkb20uaXMocGFyZW50c1tpXSwgZm9ybWF0W3ldLnNlbGVjdG9yKSkNCgkJCQkJCQkJcmV0dXJuIHBhcmVudHNbaV07DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQlyZXR1cm4gY29udGFpbmVyOw0KCQkJCX07DQoNCgkJCQkvLyBGaW5kIG5ldyBzdGFydENvbnRhaW5lci9lbmRDb250YWluZXIgaWYgdGhlcmUgaXMgYmV0dGVyIG9uZQ0KCQkJCXN0YXJ0Q29udGFpbmVyID0gZmluZFNlbGVjdG9yRW5kUG9pbnQoc3RhcnRDb250YWluZXIsICdwcmV2aW91c1NpYmxpbmcnKTsNCgkJCQllbmRDb250YWluZXIgPSBmaW5kU2VsZWN0b3JFbmRQb2ludChlbmRDb250YWluZXIsICduZXh0U2libGluZycpOw0KCQkJfQ0KDQoJCQkvLyBFeHBhbmQgc3RhcnQvZW5kIGNvbnRhaW5lciB0byBtYXRjaGluZyBibG9jayBlbGVtZW50IG9yIHRleHQgbm9kZQ0KCQkJaWYgKGZvcm1hdFswXS5ibG9jayB8fCBmb3JtYXRbMF0uc2VsZWN0b3IpIHsNCgkJCQlmdW5jdGlvbiBmaW5kQmxvY2tFbmRQb2ludChjb250YWluZXIsIHNpYmxpbmdfbmFtZSwgc2libGluZ19uYW1lMikgew0KCQkJCQl2YXIgbm9kZTsNCg0KCQkJCQkvLyBFeHBhbmQgdG8gYmxvY2sgb2Ygc2ltaWxhciB0eXBlDQoJCQkJCWlmICghZm9ybWF0WzBdLndyYXBwZXIpDQoJCQkJCQlub2RlID0gZG9tLmdldFBhcmVudChjb250YWluZXIsIGZvcm1hdFswXS5ibG9jayk7DQoNCgkJCQkJLy8gRXhwYW5kIHRvIGZpcnN0IHdyYXBwYWJsZSBibG9jayBlbGVtZW50IG9yIGFueSBibG9jayBlbGVtZW50DQoJCQkJCWlmICghbm9kZSkNCgkJCQkJCW5vZGUgPSBkb20uZ2V0UGFyZW50KGNvbnRhaW5lci5ub2RlVHlwZSA9PSAzID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXIsIGlzQmxvY2spOw0KDQoJCQkJCS8vIEV4Y2x1ZGUgaW5uZXIgbGlzdHMgZnJvbSB3cmFwcGluZw0KCQkJCQlpZiAobm9kZSAmJiBmb3JtYXRbMF0ud3JhcHBlcikNCgkJCQkJCW5vZGUgPSBnZXRQYXJlbnRzKG5vZGUsICd1bCxvbCcpLnJldmVyc2UoKVswXSB8fCBub2RlOw0KDQoJCQkJCS8vIERpZG4ndCBmaW5kIGEgYmxvY2sgZWxlbWVudCBsb29rIGZvciBmaXJzdC9sYXN0IHdyYXBwYWJsZSBlbGVtZW50DQoJCQkJCWlmICghbm9kZSkgew0KCQkJCQkJbm9kZSA9IGNvbnRhaW5lcjsNCg0KCQkJCQkJd2hpbGUgKG5vZGVbc2libGluZ19uYW1lXSAmJiAhaXNCbG9jayhub2RlW3NpYmxpbmdfbmFtZV0pKSB7DQoJCQkJCQkJbm9kZSA9IG5vZGVbc2libGluZ19uYW1lXTsNCg0KCQkJCQkJCS8vIEJyZWFrIG9uIEJSIGJ1dCBpbmNsdWRlIGl0IHdpbGwgYmUgcmVtb3ZlZCBsYXRlciBvbg0KCQkJCQkJCS8vIHdlIGNhbid0IHJlbW92ZSBpdCBub3cgc2luY2Ugd2UgbmVlZCB0byBjaGVjayBpZiBpdCBjYW4gYmUgd3JhcHBlZA0KCQkJCQkJCWlmIChpc0VxKG5vZGUsICdicicpKQ0KCQkJCQkJCQlicmVhazsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCXJldHVybiBub2RlIHx8IGNvbnRhaW5lcjsNCgkJCQl9Ow0KDQoJCQkJLy8gRmluZCBuZXcgc3RhcnRDb250YWluZXIvZW5kQ29udGFpbmVyIGlmIHRoZXJlIGlzIGJldHRlciBvbmUNCgkJCQlzdGFydENvbnRhaW5lciA9IGZpbmRCbG9ja0VuZFBvaW50KHN0YXJ0Q29udGFpbmVyLCAncHJldmlvdXNTaWJsaW5nJyk7DQoJCQkJZW5kQ29udGFpbmVyID0gZmluZEJsb2NrRW5kUG9pbnQoZW5kQ29udGFpbmVyLCAnbmV4dFNpYmxpbmcnKTsNCg0KCQkJCS8vIE5vbiBibG9jayBlbGVtZW50IHRoZW4gdHJ5IHRvIGV4cGFuZCB1cCB0aGUgbGVhZg0KCQkJCWlmIChmb3JtYXRbMF0uYmxvY2spIHsNCgkJCQkJaWYgKCFpc0Jsb2NrKHN0YXJ0Q29udGFpbmVyKSkNCgkJCQkJCXN0YXJ0Q29udGFpbmVyID0gZmluZFBhcmVudENvbnRhaW5lcihzdGFydENvbnRhaW5lciwgJ2ZpcnN0Q2hpbGQnLCAnbmV4dFNpYmxpbmcnKTsNCg0KCQkJCQlpZiAoIWlzQmxvY2soZW5kQ29udGFpbmVyKSkNCgkJCQkJCWVuZENvbnRhaW5lciA9IGZpbmRQYXJlbnRDb250YWluZXIoZW5kQ29udGFpbmVyLCAnbGFzdENoaWxkJywgJ3ByZXZpb3VzU2libGluZycpOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gU2V0dXAgaW5kZXggZm9yIHN0YXJ0Q29udGFpbmVyDQoJCQlpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMSkgew0KCQkJCXN0YXJ0T2Zmc2V0ID0gbm9kZUluZGV4KHN0YXJ0Q29udGFpbmVyKTsNCgkJCQlzdGFydENvbnRhaW5lciA9IHN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGU7DQoJCQl9DQoNCgkJCS8vIFNldHVwIGluZGV4IGZvciBlbmRDb250YWluZXINCgkJCWlmIChlbmRDb250YWluZXIubm9kZVR5cGUgPT0gMSkgew0KCQkJCWVuZE9mZnNldCA9IG5vZGVJbmRleChlbmRDb250YWluZXIpICsgMTsNCgkJCQllbmRDb250YWluZXIgPSBlbmRDb250YWluZXIucGFyZW50Tm9kZTsNCgkJCX0NCg0KCQkJLy8gUmV0dXJuIG5ldyByYW5nZSBsaWtlIG9iamVjdA0KCQkJcmV0dXJuIHsNCgkJCQlzdGFydENvbnRhaW5lciA6IHN0YXJ0Q29udGFpbmVyLA0KCQkJCXN0YXJ0T2Zmc2V0IDogc3RhcnRPZmZzZXQsDQoJCQkJZW5kQ29udGFpbmVyIDogZW5kQ29udGFpbmVyLA0KCQkJCWVuZE9mZnNldCA6IGVuZE9mZnNldA0KCQkJfTsNCgkJfQ0KDQoJCS8qKg0KCQkgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGZvciB0aGUgc3BlY2lmaWVkIG5vZGUuIEl0IHdpbGwgYWxzbyByZW1vdmUgdGhlIG5vZGUgaWYgaXQgZG9lc24ndCBoYXZlDQoJCSAqIGFueSBhdHRyaWJ1dGVzIGlmIHRoZSBmb3JtYXQgc3BlY2lmaWVzIGl0IHRvIGRvIHNvLg0KCQkgKg0KCQkgKiBAcHJpdmF0ZQ0KCQkgKiBAcGFyYW0ge09iamVjdH0gZm9ybWF0IEZvcm1hdCBvYmplY3Qgd2l0aCBpdGVtcyB0byByZW1vdmUgZnJvbSBub2RlLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gdmFycyBOYW1lL3ZhbHVlIG9iamVjdCB3aXRoIHZhcmlhYmxlcyB0byBhcHBseSB0byBmb3JtYXQuDQoJCSAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHJlbW92ZSB0aGUgZm9ybWF0IHN0eWxlcyBvbi4NCgkJICogQHBhcmFtIHtOb2RlfSBjb21wYXJlX25vZGUgT3B0aW9uYWwgY29tcGFyZSBub2RlLCBpZiBzcGVjaWZpZWQgdGhlIHN0eWxlcyB3aWxsIGJlIGNvbXBhcmVkIHRvIHRoYXQgbm9kZS4NCgkJICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZS9mYWxzZSBpZiB0aGUgbm9kZSB3YXMgcmVtb3ZlZCBvciBub3QuDQoJCSAqLw0KCQlmdW5jdGlvbiByZW1vdmVGb3JtYXQoZm9ybWF0LCB2YXJzLCBub2RlLCBjb21wYXJlX25vZGUpIHsNCgkJCXZhciBpLCBhdHRycywgc3R5bGVzTW9kaWZpZWQ7DQoNCgkJCS8vIENoZWNrIGlmIG5vZGUgbWF0Y2hlcyBmb3JtYXQNCgkJCWlmICghbWF0Y2hOYW1lKG5vZGUsIGZvcm1hdCkpDQoJCQkJcmV0dXJuIEZBTFNFOw0KDQoJCQkvLyBTaG91bGQgd2UgY29tcGFyZSB3aXRoIGZvcm1hdCBhdHRyaWJzIGFuZCBzdHlsZXMNCgkJCWlmIChmb3JtYXQucmVtb3ZlICE9ICdhbGwnKSB7DQoJCQkJLy8gUmVtb3ZlIHN0eWxlcw0KCQkJCWVhY2goZm9ybWF0LnN0eWxlcywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsNCgkJCQkJdmFsdWUgPSByZXBsYWNlVmFycyh2YWx1ZSwgdmFycyk7DQoNCgkJCQkJLy8gSW5kZXhlZCBhcnJheQ0KCQkJCQlpZiAodHlwZW9mKG5hbWUpID09PSAnbnVtYmVyJykgew0KCQkJCQkJbmFtZSA9IHZhbHVlOw0KCQkJCQkJY29tcGFyZV9ub2RlID0gMDsNCgkJCQkJfQ0KDQoJCQkJCWlmICghY29tcGFyZV9ub2RlIHx8IGlzRXEoZ2V0U3R5bGUoY29tcGFyZV9ub2RlLCBuYW1lKSwgdmFsdWUpKQ0KCQkJCQkJZG9tLnNldFN0eWxlKG5vZGUsIG5hbWUsICcnKTsNCg0KCQkJCQlzdHlsZXNNb2RpZmllZCA9IDE7DQoJCQkJfSk7DQoNCgkJCQkvLyBSZW1vdmUgc3R5bGUgYXR0cmlidXRlIGlmIGl0J3MgZW1wdHkNCgkJCQlpZiAoc3R5bGVzTW9kaWZpZWQgJiYgZG9tLmdldEF0dHJpYihub2RlLCAnc3R5bGUnKSA9PSAnJykgew0KCQkJCQlub2RlLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTsNCgkJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ19tY2Vfc3R5bGUnKTsNCgkJCQl9DQoNCgkJCQkvLyBSZW1vdmUgYXR0cmlidXRlcw0KCQkJCWVhY2goZm9ybWF0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7DQoJCQkJCXZhciB2YWx1ZU91dDsNCg0KCQkJCQl2YWx1ZSA9IHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKTsNCg0KCQkJCQkvLyBJbmRleGVkIGFycmF5DQoJCQkJCWlmICh0eXBlb2YobmFtZSkgPT09ICdudW1iZXInKSB7DQoJCQkJCQluYW1lID0gdmFsdWU7DQoJCQkJCQljb21wYXJlX25vZGUgPSAwOw0KCQkJCQl9DQoNCgkJCQkJaWYgKCFjb21wYXJlX25vZGUgfHwgaXNFcShkb20uZ2V0QXR0cmliKGNvbXBhcmVfbm9kZSwgbmFtZSksIHZhbHVlKSkgew0KCQkJCQkJLy8gS2VlcCBpbnRlcm5hbCBjbGFzc2VzDQoJCQkJCQlpZiAobmFtZSA9PSAnY2xhc3MnKSB7DQoJCQkJCQkJdmFsdWUgPSBkb20uZ2V0QXR0cmliKG5vZGUsIG5hbWUpOw0KCQkJCQkJCWlmICh2YWx1ZSkgew0KCQkJCQkJCQkvLyBCdWlsZCBuZXcgY2xhc3MgdmFsdWUgd2hlcmUgZXZlcnl0aGluZyBpcyByZW1vdmVkIGV4Y2VwdCB0aGUgaW50ZXJuYWwgcHJlZml4ZWQgY2xhc3Nlcw0KCQkJCQkJCQl2YWx1ZU91dCA9ICcnOw0KCQkJCQkJCQllYWNoKHZhbHVlLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oY2xzKSB7DQoJCQkJCQkJCQlpZiAoL21jZVx3Ky8udGVzdChjbHMpKQ0KCQkJCQkJCQkJCXZhbHVlT3V0ICs9ICh2YWx1ZU91dCA/ICcgJyA6ICcnKSArIGNsczsNCgkJCQkJCQkJfSk7DQoNCgkJCQkJCQkJLy8gV2UgZ290IHNvbWUgaW50ZXJuYWwgY2xhc3NlcyBsZWZ0DQoJCQkJCQkJCWlmICh2YWx1ZU91dCkgew0KCQkJCQkJCQkJZG9tLnNldEF0dHJpYihub2RlLCBuYW1lLCB2YWx1ZU91dCk7DQoJCQkJCQkJCQlyZXR1cm47DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCS8vIElFNiBoYXMgYSBidWcgd2hlcmUgdGhlIGF0dHJpYnV0ZSBkb2Vzbid0IGdldCByZW1vdmVkIGNvcnJlY3RseQ0KCQkJCQkJaWYgKG5hbWUgPT0gImNsYXNzIikNCgkJCQkJCQlub2RlLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3NOYW1lJyk7DQoNCgkJCQkJCS8vIFJlbW92ZSBtY2UgcHJlZml4ZWQgYXR0cmlidXRlcw0KCQkJCQkJaWYgKE1DRV9BVFRSX1JFLnRlc3QobmFtZSkpDQoJCQkJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ19tY2VfJyArIG5hbWUpOw0KDQoJCQkJCQlub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJLy8gUmVtb3ZlIGNsYXNzZXMNCgkJCQllYWNoKGZvcm1hdC5jbGFzc2VzLCBmdW5jdGlvbih2YWx1ZSkgew0KCQkJCQl2YWx1ZSA9IHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKTsNCg0KCQkJCQlpZiAoIWNvbXBhcmVfbm9kZSB8fCBkb20uaGFzQ2xhc3MoY29tcGFyZV9ub2RlLCB2YWx1ZSkpDQoJCQkJCQlkb20ucmVtb3ZlQ2xhc3Mobm9kZSwgdmFsdWUpOw0KCQkJCX0pOw0KDQoJCQkJLy8gQ2hlY2sgZm9yIG5vbiBpbnRlcm5hbCBhdHRyaWJ1dGVzDQoJCQkJYXR0cnMgPSBkb20uZ2V0QXR0cmlicyhub2RlKTsNCgkJCQlmb3IgKGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsNCgkJCQkJaWYgKGF0dHJzW2ldLm5vZGVOYW1lLmluZGV4T2YoJ18nKSAhPT0gMCkNCgkJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFJlbW92ZSB0aGUgaW5saW5lIGNoaWxkIGlmIGl0J3MgZW1wdHkgZm9yIGV4YW1wbGUgPGI+IG9yIDxzcGFuPg0KCQkJaWYgKGZvcm1hdC5yZW1vdmUgIT0gJ25vbmUnKSB7DQoJCQkJcmVtb3ZlTm9kZShub2RlLCBmb3JtYXQpOw0KCQkJCXJldHVybiBUUlVFOw0KCQkJfQ0KCQl9Ow0KDQoJCS8qKg0KCQkgKiBSZW1vdmVzIHRoZSBub2RlIGFuZCB3cmFwIGl0J3MgY2hpbGRyZW4gaW4gcGFyYWdyYXBocyBiZWZvcmUgZG9pbmcgc28gb3INCgkJICogYXBwZW5kcyBCUiBlbGVtZW50cyB0byB0aGUgYmVnaW5uaW5nL2VuZCBvZiB0aGUgYmxvY2sgZWxlbWVudCBpZiBmb3JjZWRSb290QmxvY2tzIGlzIGRpc2FibGVkLg0KCQkgKg0KCQkgKiBJZiB0aGUgZGl2IGluIHRoZSBub2RlIGJlbG93IGdldHMgcmVtb3ZlZDoNCgkJICogIHRleHQ8ZGl2PnRleHQ8L2Rpdj50ZXh0DQoJCSAqDQoJCSAqIE91dHB1dCBiZWNvbWVzOg0KCQkgKiAgdGV4dDxkaXY+PGJyIC8+dGV4dDxiciAvPjwvZGl2PnRleHQNCgkJICoNCgkJICogU28gd2hlbiB0aGUgZGl2IGlzIHJlbW92ZWQgdGhlIHJlc3VsdCBpczoNCgkJICogIHRleHQ8YnIgLz50ZXh0PGJyIC8+dGV4dA0KCQkgKg0KCQkgKiBAcHJpdmF0ZQ0KCQkgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgKyBhcHBseSBCUi9QIGVsZW1lbnRzIHRvLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gZm9ybWF0IEZvcm1hdCBydWxlLg0KCQkgKiBAcmV0dXJuIHtOb2RlfSBJbnB1dCBub2RlLg0KCQkgKi8NCgkJZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlLCBmb3JtYXQpIHsNCgkJCXZhciBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlLCByb290QmxvY2tFbG07DQoNCgkJCWlmIChmb3JtYXQuYmxvY2spIHsNCgkJCQlpZiAoIWZvcmNlZFJvb3RCbG9jaykgew0KCQkJCQlmdW5jdGlvbiBmaW5kKG5vZGUsIG5leHQsIGluYykgew0KCQkJCQkJbm9kZSA9IGdldE5vbldoaXRlU3BhY2VTaWJsaW5nKG5vZGUsIG5leHQsIGluYyk7DQoNCgkJCQkJCXJldHVybiAhbm9kZSB8fCAobm9kZS5ub2RlTmFtZSA9PSAnQlInIHx8IGlzQmxvY2sobm9kZSkpOw0KCQkJCQl9Ow0KDQoJCQkJCS8vIEFwcGVuZCBCUiBlbGVtZW50cyBpZiBuZWVkZWQgYmVmb3JlIHdlIHJlbW92ZSB0aGUgYmxvY2sNCgkJCQkJaWYgKGlzQmxvY2sobm9kZSkgJiYgIWlzQmxvY2socGFyZW50Tm9kZSkpIHsNCgkJCQkJCWlmICghZmluZChub2RlLCBGQUxTRSkgJiYgIWZpbmQobm9kZS5maXJzdENoaWxkLCBUUlVFLCAxKSkNCgkJCQkJCQlub2RlLmluc2VydEJlZm9yZShkb20uY3JlYXRlKCdicicpLCBub2RlLmZpcnN0Q2hpbGQpOw0KDQoJCQkJCQlpZiAoIWZpbmQobm9kZSwgVFJVRSkgJiYgIWZpbmQobm9kZS5sYXN0Q2hpbGQsIEZBTFNFLCAxKSkNCgkJCQkJCQlub2RlLmFwcGVuZENoaWxkKGRvbS5jcmVhdGUoJ2JyJykpOw0KCQkJCQl9DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gV3JhcCB0aGUgYmxvY2sgaW4gYSBmb3JjZWRSb290QmxvY2sgaWYgd2UgYXJlIGF0IHRoZSByb290IG9mIGRvY3VtZW50DQoJCQkJCWlmIChwYXJlbnROb2RlID09IGRvbS5nZXRSb290KCkpIHsNCgkJCQkJCWlmICghZm9ybWF0Lmxpc3RfYmxvY2sgfHwgIWlzRXEobm9kZSwgZm9ybWF0Lmxpc3RfYmxvY2spKSB7DQoJCQkJCQkJZWFjaCh0aW55bWNlLmdyZXAobm9kZS5jaGlsZE5vZGVzKSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJCQlpZiAoaXNWYWxpZChmb3JjZWRSb290QmxvY2ssIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHsNCgkJCQkJCQkJCWlmICghcm9vdEJsb2NrRWxtKQ0KCQkJCQkJCQkJCXJvb3RCbG9ja0VsbSA9IHdyYXAobm9kZSwgZm9yY2VkUm9vdEJsb2NrKTsNCgkJCQkJCQkJCWVsc2UNCgkJCQkJCQkJCQlyb290QmxvY2tFbG0uYXBwZW5kQ2hpbGQobm9kZSk7DQoJCQkJCQkJCX0gZWxzZQ0KCQkJCQkJCQkJcm9vdEJsb2NrRWxtID0gMDsNCgkJCQkJCQl9KTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gTmV2ZXIgcmVtb3ZlIG5vZGVzIHRoYXQgaXNuJ3QgdGhlIHNwZWNpZmllZCBpbmxpbmUgZWxlbWVudCBpZiBhIHNlbGVjdG9yIGlzIHNwZWNpZmllZCB0b28NCgkJCWlmIChmb3JtYXQuc2VsZWN0b3IgJiYgZm9ybWF0LmlubGluZSAmJiAhaXNFcShmb3JtYXQuaW5saW5lLCBub2RlKSkNCgkJCQlyZXR1cm47DQoNCgkJCWRvbS5yZW1vdmUobm9kZSwgMSk7DQoJCX07DQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdGhlIG5leHQvcHJldmlvdXMgbm9uIHdoaXRlc3BhY2Ugbm9kZS4NCgkJICoNCgkJICogQHByaXZhdGUNCgkJICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdG8gc3RhcnQgYXQuDQoJCSAqIEBwYXJhbSB7Ym9vbGVhbn0gbmV4dCAoT3B0aW9uYWwpIEluY2x1ZGUgbmV4dCBvciBwcmV2aW91cyBub2RlIGRlZmF1bHRzIHRvIHByZXZpb3VzLg0KCQkgKiBAcGFyYW0ge2Jvb2xlYW59IGluYyAoT3B0aW9uYWwpIEluY2x1ZGUgdGhlIGN1cnJlbnQgbm9kZSBpbiBjaGVja2luZy4gRGVmYXVsdHMgdG8gZmFsc2UuDQoJCSAqIEByZXR1cm4ge05vZGV9IE5leHQgb3IgcHJldmlvdXMgbm9kZSBvciB1bmRlZmluZWQgaWYgaXQgd2Fzbid0IGZvdW5kLg0KCQkgKi8NCgkJZnVuY3Rpb24gZ2V0Tm9uV2hpdGVTcGFjZVNpYmxpbmcobm9kZSwgbmV4dCwgaW5jKSB7DQoJCQlpZiAobm9kZSkgew0KCQkJCW5leHQgPSBuZXh0ID8gJ25leHRTaWJsaW5nJyA6ICdwcmV2aW91c1NpYmxpbmcnOw0KDQoJCQkJZm9yIChub2RlID0gaW5jID8gbm9kZSA6IG5vZGVbbmV4dF07IG5vZGU7IG5vZGUgPSBub2RlW25leHRdKSB7DQoJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDEgfHwgIWlzV2hpdGVTcGFjZU5vZGUobm9kZSkpDQoJCQkJCQlyZXR1cm4gbm9kZTsNCgkJCQl9DQoJCQl9DQoJCX07DQoNCgkJLyoqDQoJCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYSBib29rbWFyayBub2RlIG9yIG5vdC4NCgkJICoNCgkJICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdG8gY2hlY2sgaWYgaXQncyBhIGJvb2ttYXJrIG5vZGUgb3Igbm90Lg0KCQkgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlL2ZhbHNlIGlmIHRoZSBub2RlIGlzIGEgYm9va21hcmsgbm9kZS4NCgkJICovDQoJCWZ1bmN0aW9uIGlzQm9va21hcmtOb2RlKG5vZGUpIHsNCgkJCXJldHVybiBub2RlICYmIG5vZGUubm9kZVR5cGUgPT0gMSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnX21jZV90eXBlJykgPT0gJ2Jvb2ttYXJrJzsNCgkJfTsNCg0KCQkvKioNCgkJICogTWVyZ2VzIHRoZSBuZXh0L3ByZXZpb3VzIHNpYmxpbmcgZWxlbWVudCBpZiB0aGV5IG1hdGNoLg0KCQkgKg0KCQkgKiBAcHJpdmF0ZQ0KCQkgKiBAcGFyYW0ge05vZGV9IHByZXYgUHJldmlvdXMgbm9kZSB0byBjb21wYXJlL21lcmdlLg0KCQkgKiBAcGFyYW0ge05vZGV9IG5leHQgTmV4dCBub2RlIHRvIGNvbXBhcmUvbWVyZ2UuDQoJCSAqIEByZXR1cm4ge05vZGV9IE5leHQgbm9kZSBpZiB3ZSBkaWRuJ3QgbWVyZ2UgYW5kIHByZXYgbm9kZSBpZiB3ZSBkaWQuDQoJCSAqLw0KCQlmdW5jdGlvbiBtZXJnZVNpYmxpbmdzKHByZXYsIG5leHQpIHsNCgkJCXZhciBtYXJrZXIsIHNpYmxpbmcsIHRtcFNpYmxpbmc7DQoNCgkJCS8qKg0KCQkJICogQ29tcGFyZXMgdHdvIG5vZGVzIGFuZCBjaGVja3MgaWYgaXQncyBhdHRyaWJ1dGVzIGFuZCBzdHlsZXMgbWF0Y2hlcy4NCgkJCSAqIFRoaXMgZG9lc24ndCBjb21wYXJlIGNsYXNzZXMgYXMgaXRlbXMgc2luY2UgdGhlaXIgb3JkZXIgaXMgc2lnbmlmaWNhbnQuDQoJCQkgKg0KCQkJICogQHByaXZhdGUNCgkJCSAqIEBwYXJhbSB7Tm9kZX0gbm9kZTEgRmlyc3Qgbm9kZSB0byBjb21wYXJlIHdpdGguDQoJCQkgKiBAcGFyYW0ge05vZGV9IG5vZGUyIFNlY29uZCBub2RlIHRvIGNvbXBhcmUgd2l0aC4NCgkJCSAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUvZmFsc2UgaWYgdGhlIG5vZGVzIGFyZSB0aGUgc2FtZSBvciBub3QuDQoJCQkgKi8NCgkJCWZ1bmN0aW9uIGNvbXBhcmVFbGVtZW50cyhub2RlMSwgbm9kZTIpIHsNCgkJCQkvLyBOb3QgdGhlIHNhbWUgbmFtZQ0KCQkJCWlmIChub2RlMS5ub2RlTmFtZSAhPSBub2RlMi5ub2RlTmFtZSkNCgkJCQkJcmV0dXJuIEZBTFNFOw0KDQoJCQkJLyoqDQoJCQkJICogUmV0dXJucyBhbGwgdGhlIG5vZGVzIGF0dHJpYnV0ZXMgZXhjbHVkaW5nIGludGVybmFsIG9uZXMsIHN0eWxlcyBhbmQgY2xhc3Nlcy4NCgkJCQkgKg0KCQkJCSAqIEBwcml2YXRlDQoJCQkJICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdG8gZ2V0IGF0dHJpYnV0ZXMgZnJvbS4NCgkJCQkgKiBAcmV0dXJuIHtPYmplY3R9IE5hbWUvdmFsdWUgb2JqZWN0IHdpdGggYXR0cmlidXRlcyBhbmQgYXR0cmlidXRlIHZhbHVlcy4NCgkJCQkgKi8NCgkJCQlmdW5jdGlvbiBnZXRBdHRyaWJzKG5vZGUpIHsNCgkJCQkJdmFyIGF0dHJpYnMgPSB7fTsNCg0KCQkJCQllYWNoKGRvbS5nZXRBdHRyaWJzKG5vZGUpLCBmdW5jdGlvbihhdHRyKSB7DQoJCQkJCQl2YXIgbmFtZSA9IGF0dHIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsNCg0KCQkJCQkJLy8gRG9uJ3QgY29tcGFyZSBpbnRlcm5hbCBhdHRyaWJ1dGVzIG9yIHN0eWxlDQoJCQkJCQlpZiAobmFtZS5pbmRleE9mKCdfJykgIT09IDAgJiYgbmFtZSAhPT0gJ3N0eWxlJykNCgkJCQkJCQlhdHRyaWJzW25hbWVdID0gZG9tLmdldEF0dHJpYihub2RlLCBuYW1lKTsNCgkJCQkJfSk7DQoNCgkJCQkJcmV0dXJuIGF0dHJpYnM7DQoJCQkJfTsNCg0KCQkJCS8qKg0KCQkJCSAqIENvbXBhcmVzIHR3byBvYmplY3RzIGNoZWNrcyBpZiBpdCdzIGtleSArIHZhbHVlIGV4aXN0cyBpbiB0aGUgb3RoZXIgb25lLg0KCQkJCSAqDQoJCQkJICogQHByaXZhdGUNCgkJCQkgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QgdG8gY29tcGFyZS4NCgkJCQkgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuDQoJCQkJICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZS9mYWxzZSBpZiB0aGUgb2JqZWN0cyBtYXRjaGVzIG9yIG5vdC4NCgkJCQkgKi8NCgkJCQlmdW5jdGlvbiBjb21wYXJlT2JqZWN0cyhvYmoxLCBvYmoyKSB7DQoJCQkJCXZhciB2YWx1ZSwgbmFtZTsNCg0KCQkJCQlmb3IgKG5hbWUgaW4gb2JqMSkgew0KCQkJCQkJLy8gT2JqMSBoYXMgaXRlbSBvYmoyIGRvZXNuJ3QgaGF2ZQ0KCQkJCQkJaWYgKG9iajEuaGFzT3duUHJvcGVydHkobmFtZSkpIHsNCgkJCQkJCQl2YWx1ZSA9IG9iajJbbmFtZV07DQoNCgkJCQkJCQkvLyBPYmoyIGRvZXNuJ3QgaGF2ZSBvYmoxIGl0ZW0NCgkJCQkJCQlpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkNCgkJCQkJCQkJcmV0dXJuIEZBTFNFOw0KDQoJCQkJCQkJLy8gT2JqMiBpdGVtIGhhcyBhIGRpZmZlcmVudCB2YWx1ZQ0KCQkJCQkJCWlmIChvYmoxW25hbWVdICE9IHZhbHVlKQ0KCQkJCQkJCQlyZXR1cm4gRkFMU0U7DQoNCgkJCQkJCQkvLyBEZWxldGUgc2ltaWxhciB2YWx1ZQ0KCQkJCQkJCWRlbGV0ZSBvYmoyW25hbWVdOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJLy8gQ2hlY2sgaWYgb2JqIDIgaGFzIHNvbWV0aGluZyBvYmogMSBkb2Vzbid0IGhhdmUNCgkJCQkJZm9yIChuYW1lIGluIG9iajIpIHsNCgkJCQkJCS8vIE9iajIgaGFzIGl0ZW0gb2JqMSBkb2Vzbid0IGhhdmUNCgkJCQkJCWlmIChvYmoyLmhhc093blByb3BlcnR5KG5hbWUpKQ0KCQkJCQkJCXJldHVybiBGQUxTRTsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiBUUlVFOw0KCQkJCX07DQoNCgkJCQkvLyBBdHRyaWJzIGFyZSBub3QgdGhlIHNhbWUNCgkJCQlpZiAoIWNvbXBhcmVPYmplY3RzKGdldEF0dHJpYnMobm9kZTEpLCBnZXRBdHRyaWJzKG5vZGUyKSkpDQoJCQkJCXJldHVybiBGQUxTRTsNCg0KCQkJCS8vIFN0eWxlcyBhcmUgbm90IHRoZSBzYW1lDQoJCQkJaWYgKCFjb21wYXJlT2JqZWN0cyhkb20ucGFyc2VTdHlsZShkb20uZ2V0QXR0cmliKG5vZGUxLCAnc3R5bGUnKSksIGRvbS5wYXJzZVN0eWxlKGRvbS5nZXRBdHRyaWIobm9kZTIsICdzdHlsZScpKSkpDQoJCQkJCXJldHVybiBGQUxTRTsNCg0KCQkJCXJldHVybiBUUlVFOw0KCQkJfTsNCg0KCQkJLy8gQ2hlY2sgaWYgbmV4dC9wcmV2IGV4aXN0cyBhbmQgdGhhdCB0aGV5IGFyZSBlbGVtZW50cw0KCQkJaWYgKHByZXYgJiYgbmV4dCkgew0KCQkJCWZ1bmN0aW9uIGZpbmRFbGVtZW50U2libGluZyhub2RlLCBzaWJsaW5nX25hbWUpIHsNCgkJCQkJZm9yIChzaWJsaW5nID0gbm9kZTsgc2libGluZzsgc2libGluZyA9IHNpYmxpbmdbc2libGluZ19uYW1lXSkgew0KCQkJCQkJaWYgKHNpYmxpbmcubm9kZVR5cGUgPT0gMyAmJiAhaXNXaGl0ZVNwYWNlTm9kZShzaWJsaW5nKSkNCgkJCQkJCQlyZXR1cm4gbm9kZTsNCg0KCQkJCQkJaWYgKHNpYmxpbmcubm9kZVR5cGUgPT0gMSAmJiAhaXNCb29rbWFya05vZGUoc2libGluZykpDQoJCQkJCQkJcmV0dXJuIHNpYmxpbmc7DQoJCQkJCX0NCg0KCQkJCQlyZXR1cm4gbm9kZTsNCgkJCQl9Ow0KDQoJCQkJLy8gSWYgcHJldmlvdXMgc2libGluZyBpcyBlbXB0eSB0aGVuIGp1bXAgb3ZlciBpdA0KCQkJCXByZXYgPSBmaW5kRWxlbWVudFNpYmxpbmcocHJldiwgJ3ByZXZpb3VzU2libGluZycpOw0KCQkJCW5leHQgPSBmaW5kRWxlbWVudFNpYmxpbmcobmV4dCwgJ25leHRTaWJsaW5nJyk7DQoNCgkJCQkvLyBDb21wYXJlIG5leHQgYW5kIHByZXZpb3VzIG5vZGVzDQoJCQkJaWYgKGNvbXBhcmVFbGVtZW50cyhwcmV2LCBuZXh0KSkgew0KCQkJCQkvLyBBcHBlbmQgbm9kZXMgYmV0d2Vlbg0KCQkJCQlmb3IgKHNpYmxpbmcgPSBwcmV2Lm5leHRTaWJsaW5nOyBzaWJsaW5nICYmIHNpYmxpbmcgIT0gbmV4dDspIHsNCgkJCQkJCXRtcFNpYmxpbmcgPSBzaWJsaW5nOw0KCQkJCQkJc2libGluZyA9IHNpYmxpbmcubmV4dFNpYmxpbmc7DQoJCQkJCQlwcmV2LmFwcGVuZENoaWxkKHRtcFNpYmxpbmcpOw0KCQkJCQl9DQoNCgkJCQkJLy8gUmVtb3ZlIG5leHQgbm9kZQ0KCQkJCQlkb20ucmVtb3ZlKG5leHQpOw0KDQoJCQkJCS8vIE1vdmUgY2hpbGRyZW4gaW50byBwcmV2IG5vZGUNCgkJCQkJZWFjaCh0aW55bWNlLmdyZXAobmV4dC5jaGlsZE5vZGVzKSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJcHJldi5hcHBlbmRDaGlsZChub2RlKTsNCgkJCQkJfSk7DQoNCgkJCQkJcmV0dXJuIHByZXY7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gbmV4dDsNCgkJfTsNCg0KCQkvKioNCgkJICogUmV0dXJucyB0cnVlL2ZhbHNlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIHRleHQgYmxvY2sgb3Igbm90Lg0KCQkgKg0KCQkgKiBAcHJpdmF0ZQ0KCQkgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBjaGVjay4NCgkJICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZS9mYWxzZSBpZiB0aGUgbm9kZSBpcyBhIHRleHQgYmxvY2suDQoJCSAqLw0KCQlmdW5jdGlvbiBpc1RleHRCbG9jayhuYW1lKSB7DQoJCQlyZXR1cm4gL14oaFsxLTZdfHB8ZGl2fHByZXxhZGRyZXNzfGRsfGR0fGRkKSQvLnRlc3QobmFtZSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZ2V0Q29udGFpbmVyKHJuZywgc3RhcnQpIHsNCgkJCXZhciBjb250YWluZXIsIG9mZnNldCwgbGFzdElkeDsNCg0KCQkJY29udGFpbmVyID0gcm5nW3N0YXJ0ID8gJ3N0YXJ0Q29udGFpbmVyJyA6ICdlbmRDb250YWluZXInXTsNCgkJCW9mZnNldCA9IHJuZ1tzdGFydCA/ICdzdGFydE9mZnNldCcgOiAnZW5kT2Zmc2V0J107DQoNCgkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMSkgew0KCQkJCWxhc3RJZHggPSBjb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggLSAxOw0KDQoJCQkJaWYgKCFzdGFydCAmJiBvZmZzZXQpDQoJCQkJCW9mZnNldC0tOw0KDQoJCQkJY29udGFpbmVyID0gY29udGFpbmVyLmNoaWxkTm9kZXNbb2Zmc2V0ID4gbGFzdElkeCA/IGxhc3RJZHggOiBvZmZzZXRdOw0KCQkJfQ0KDQoJCQlyZXR1cm4gY29udGFpbmVyOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHBlcmZvcm1DYXJldEFjdGlvbih0eXBlLCBuYW1lLCB2YXJzKSB7DQoJCQl2YXIgaSwgY3VycmVudFBlbmRpbmdGb3JtYXRzID0gcGVuZGluZ0Zvcm1hdHNbdHlwZV0sDQoJCQkJb3RoZXJQZW5kaW5nRm9ybWF0cyA9IHBlbmRpbmdGb3JtYXRzW3R5cGUgPT0gJ2FwcGx5JyA/ICdyZW1vdmUnIDogJ2FwcGx5J107DQoNCgkJCWZ1bmN0aW9uIGhhc1BlbmRpbmcoKSB7DQoJCQkJcmV0dXJuIHBlbmRpbmdGb3JtYXRzLmFwcGx5Lmxlbmd0aCB8fCBwZW5kaW5nRm9ybWF0cy5yZW1vdmUubGVuZ3RoOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gcmVzZXRQZW5kaW5nKCkgew0KCQkJCXBlbmRpbmdGb3JtYXRzLmFwcGx5ID0gW107DQoJCQkJcGVuZGluZ0Zvcm1hdHMucmVtb3ZlID0gW107DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBwZXJmb3JtKGNhcmV0X25vZGUpIHsNCgkJCQkvLyBBcHBseSBwZW5kaW5nIGZvcm1hdHMNCgkJCQllYWNoKHBlbmRpbmdGb3JtYXRzLmFwcGx5LnJldmVyc2UoKSwgZnVuY3Rpb24oaXRlbSkgew0KCQkJCQlhcHBseShpdGVtLm5hbWUsIGl0ZW0udmFycywgY2FyZXRfbm9kZSk7DQoJCQkJfSk7DQoNCgkJCQkvLyBSZW1vdmUgcGVuZGluZyBmb3JtYXRzDQoJCQkJZWFjaChwZW5kaW5nRm9ybWF0cy5yZW1vdmUucmV2ZXJzZSgpLCBmdW5jdGlvbihpdGVtKSB7DQoJCQkJCXJlbW92ZShpdGVtLm5hbWUsIGl0ZW0udmFycywgY2FyZXRfbm9kZSk7DQoJCQkJfSk7DQoNCgkJCQlkb20ucmVtb3ZlKGNhcmV0X25vZGUsIDEpOw0KCQkJCXJlc2V0UGVuZGluZygpOw0KCQkJfTsNCg0KCQkJLy8gQ2hlY2sgaWYgaXQgYWxyZWFkeSBleGlzdHMgdGhlbiBpZ25vcmUgaXQNCgkJCWZvciAoaSA9IGN1cnJlbnRQZW5kaW5nRm9ybWF0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCWlmIChjdXJyZW50UGVuZGluZ0Zvcm1hdHNbaV0ubmFtZSA9PSBuYW1lKQ0KCQkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCWN1cnJlbnRQZW5kaW5nRm9ybWF0cy5wdXNoKHtuYW1lIDogbmFtZSwgdmFycyA6IHZhcnN9KTsNCg0KCQkJLy8gQ2hlY2sgaWYgaXQncyBpbiB0aGUgb3RoZXIgdHlwZSwgdGhlbiByZW1vdmUgaXQNCgkJCWZvciAoaSA9IG90aGVyUGVuZGluZ0Zvcm1hdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQlpZiAob3RoZXJQZW5kaW5nRm9ybWF0c1tpXS5uYW1lID09IG5hbWUpDQoJCQkJCW90aGVyUGVuZGluZ0Zvcm1hdHMuc3BsaWNlKGksIDEpOw0KCQkJfQ0KDQoJCQkvLyBQZW5kaW5nIGFwcGx5IG9yIHJlbW92ZSBmb3JtYXRzDQoJCQlpZiAoaGFzUGVuZGluZygpKSB7DQoJCQkJZWQuZ2V0RG9jKCkuZXhlY0NvbW1hbmQoJ0ZvbnROYW1lJywgZmFsc2UsICdtY2VpbmxpbmUnKTsNCgkJCQlwZW5kaW5nRm9ybWF0cy5sYXN0Um5nID0gc2VsZWN0aW9uLmdldFJuZygpOw0KDQoJCQkJLy8gSUUgd2lsbCBjb252ZXJ0IHRoZSBjdXJyZW50IHdvcmQNCgkJCQllYWNoKGRvbS5zZWxlY3QoJ2ZvbnQsc3BhbicpLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCXZhciBib29rbWFyazsNCg0KCQkJCQlpZiAoaXNDYXJldE5vZGUobm9kZSkpIHsNCgkJCQkJCWJvb2ttYXJrID0gc2VsZWN0aW9uLmdldEJvb2ttYXJrKCk7DQoJCQkJCQlwZXJmb3JtKG5vZGUpOw0KCQkJCQkJc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsNCgkJCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCS8vIE9ubHkgcmVnaXN0ZXIgbGlzdGVuZXJzIG9uY2UgaWYgd2UgbmVlZCB0bw0KCQkJCWlmICghcGVuZGluZ0Zvcm1hdHMuaXNMaXN0ZW5pbmcgJiYgaGFzUGVuZGluZygpKSB7DQoJCQkJCXBlbmRpbmdGb3JtYXRzLmlzTGlzdGVuaW5nID0gdHJ1ZTsNCg0KCQkJCQllYWNoKCdvbktleURvd24sb25LZXlVcCxvbktleVByZXNzLG9uTW91c2VVcCcuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXZlbnQpIHsNCgkJCQkJCWVkW2V2ZW50XS5hZGRUb1RvcChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJCS8vIERvIHdlIGhhdmUgcGVuZGluZyBmb3JtYXRzIGFuZCBpcyB0aGUgc2VsZWN0aW9uIG1vdmVkIGhhcyBtb3ZlZA0KCQkJCQkJCWlmIChoYXNQZW5kaW5nKCkgJiYgIXRpbnltY2UuZG9tLlJhbmdlVXRpbHMuY29tcGFyZVJhbmdlcyhwZW5kaW5nRm9ybWF0cy5sYXN0Um5nLCBzZWxlY3Rpb24uZ2V0Um5nKCkpKSB7DQoJCQkJCQkJCWVhY2goZG9tLnNlbGVjdCgnZm9udCxzcGFuJyksIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCQkJCXZhciB0ZXh0Tm9kZSwgcm5nOw0KDQoJCQkJCQkJCQkvLyBMb29rIGZvciBtYXJrZXINCgkJCQkJCQkJCWlmIChpc0NhcmV0Tm9kZShub2RlKSkgew0KCQkJCQkJCQkJCXRleHROb2RlID0gbm9kZS5maXJzdENoaWxkOw0KDQoJCQkJCQkJCQkJaWYgKHRleHROb2RlKSB7DQoJCQkJCQkJCQkJCXBlcmZvcm0obm9kZSk7DQoNCgkJCQkJCQkJCQkJcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KCQkJCQkJCQkJCQlybmcuc2V0U3RhcnQodGV4dE5vZGUsIHRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGgpOw0KCQkJCQkJCQkJCQlybmcuc2V0RW5kKHRleHROb2RlLCB0ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoKTsNCgkJCQkJCQkJCQkJc2VsZWN0aW9uLnNldFJuZyhybmcpOw0KCQkJCQkJCQkJCQllZC5ub2RlQ2hhbmdlZCgpOw0KCQkJCQkJCQkJCX0gZWxzZQ0KCQkJCQkJCQkJCQlkb20ucmVtb3ZlKG5vZGUpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9KTsNCg0KCQkJCQkJCQkvLyBBbHdheXMgdW5iaW5kIGFuZCBjbGVhciBwZW5kaW5nIHN0eWxlcyBvbiBrZXl1cA0KCQkJCQkJCQlpZiAoZS50eXBlID09ICdrZXl1cCcgfHwgZS50eXBlID09ICdtb3VzZXVwJykNCgkJCQkJCQkJCXJlc2V0UGVuZGluZygpOw0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9DQoJCX07DQoJfTsNCn0pKHRpbnltY2UpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/LegacyInput.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBMZWdhY3lJbnB1dC5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCnRpbnltY2Uub25BZGRFZGl0b3IuYWRkKGZ1bmN0aW9uKHRpbnltY2UsIGVkKSB7DQoJdmFyIGZpbHRlcnMsIGZvbnRTaXplcywgZG9tLCBzZXR0aW5ncyA9IGVkLnNldHRpbmdzOw0KDQoJaWYgKHNldHRpbmdzLmlubGluZV9zdHlsZXMpIHsNCgkJZm9udFNpemVzID0gdGlueW1jZS5leHBsb2RlKHNldHRpbmdzLmZvbnRfc2l6ZV9zdHlsZV92YWx1ZXMpOw0KDQoJCWZ1bmN0aW9uIHJlcGxhY2VXaXRoU3Bhbihub2RlLCBzdHlsZXMpIHsNCgkJCXRpbnltY2UuZWFjaChzdHlsZXMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7DQoJCQkJaWYgKHZhbHVlKQ0KCQkJCQlkb20uc2V0U3R5bGUobm9kZSwgbmFtZSwgdmFsdWUpOw0KCQkJfSk7DQoNCgkJCWRvbS5yZW5hbWUobm9kZSwgJ3NwYW4nKTsNCgkJfTsNCg0KCQlmaWx0ZXJzID0gew0KCQkJZm9udCA6IGZ1bmN0aW9uKGRvbSwgbm9kZSkgew0KCQkJCXJlcGxhY2VXaXRoU3Bhbihub2RlLCB7DQoJCQkJCWJhY2tncm91bmRDb2xvciA6IG5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yLA0KCQkJCQljb2xvciA6IG5vZGUuY29sb3IsDQoJCQkJCWZvbnRGYW1pbHkgOiBub2RlLmZhY2UsDQoJCQkJCWZvbnRTaXplIDogZm9udFNpemVzW3BhcnNlSW50KG5vZGUuc2l6ZSkgLSAxXQ0KCQkJCX0pOw0KCQkJfSwNCg0KCQkJdSA6IGZ1bmN0aW9uKGRvbSwgbm9kZSkgew0KCQkJCXJlcGxhY2VXaXRoU3Bhbihub2RlLCB7DQoJCQkJCXRleHREZWNvcmF0aW9uIDogJ3VuZGVybGluZScNCgkJCQl9KTsNCgkJCX0sDQoNCgkJCXN0cmlrZSA6IGZ1bmN0aW9uKGRvbSwgbm9kZSkgew0KCQkJCXJlcGxhY2VXaXRoU3Bhbihub2RlLCB7DQoJCQkJCXRleHREZWNvcmF0aW9uIDogJ2xpbmUtdGhyb3VnaCcNCgkJCQl9KTsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBjb252ZXJ0KGVkaXRvciwgcGFyYW1zKSB7DQoJCQlkb20gPSBlZGl0b3IuZG9tOw0KDQoJCQlpZiAoc2V0dGluZ3MuY29udmVydF9mb250c190b19zcGFucykgew0KCQkJCXRpbnltY2UuZWFjaChkb20uc2VsZWN0KCdmb250LHUsc3RyaWtlJywgcGFyYW1zLm5vZGUpLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCWZpbHRlcnNbbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXShlZC5kb20sIG5vZGUpOw0KCQkJCX0pOw0KCQkJfQ0KCQl9Ow0KDQoJCWVkLm9uUHJlUHJvY2Vzcy5hZGQoY29udmVydCk7DQoNCgkJZWQub25Jbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCWVkLnNlbGVjdGlvbi5vblNldENvbnRlbnQuYWRkKGNvbnZlcnQpOw0KCQl9KTsNCgl9DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/Popup.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBQb3B1cC5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCi8vIFNvbWUgZ2xvYmFsIGluc3RhbmNlcw0KdmFyIHRpbnltY2UgPSBudWxsLCB0aW55TUNFUG9wdXAsIHRpbnlNQ0U7DQoNCi8qKg0KICogVGlueU1DRSBwb3B1cC9kaWFsb2cgaGVscGVyIGNsYXNzLiBUaGlzIGdpdmVzIHlvdSBlYXN5IGFjY2VzcyB0byB0aGUNCiAqIHBhcmVudCBlZGl0b3IgaW5zdGFuY2UgYW5kIGEgYnVuY2ggb2Ygb3RoZXIgdGhpbmdzLiBJdCdzIGhpZ2x5IHJlY29tbWVuZGVkDQogKiB0aGF0IHlvdSBsb2FkIHRoaXMgc2NyaXB0IGludG8geW91ciBkaWFsb2dzLg0KICoNCiAqIEBzdGF0aWMNCiAqIEBjbGFzcyB0aW55TUNFUG9wdXANCiAqLw0KdGlueU1DRVBvcHVwID0gew0KCS8qKg0KCSAqIEluaXRpYWxpemVzIHRoZSBwb3B1cCB0aGlzIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkuDQoJICoNCgkgKiBAbWV0aG9kIGluaXQNCgkgKi8NCglpbml0IDogZnVuY3Rpb24oKSB7DQoJCXZhciB0ID0gdGhpcywgdywgdGk7DQoNCgkJLy8gRmluZCB3aW5kb3cgJiBBUEkNCgkJdyA9IHQuZ2V0V2luKCk7DQoJCXRpbnltY2UgPSB3LnRpbnltY2U7DQoJCXRpbnlNQ0UgPSB3LnRpbnlNQ0U7DQoJCXQuZWRpdG9yID0gdGlueW1jZS5FZGl0b3JNYW5hZ2VyLmFjdGl2ZUVkaXRvcjsNCgkJdC5wYXJhbXMgPSB0LmVkaXRvci53aW5kb3dNYW5hZ2VyLnBhcmFtczsNCgkJdC5mZWF0dXJlcyA9IHQuZWRpdG9yLndpbmRvd01hbmFnZXIuZmVhdHVyZXM7DQoNCgkJLy8gU2V0dXAgbG9jYWwgRE9NDQoJCXQuZG9tID0gdC5lZGl0b3Iud2luZG93TWFuYWdlci5jcmVhdGVJbnN0YW5jZSgndGlueW1jZS5kb20uRE9NVXRpbHMnLCBkb2N1bWVudCk7DQoNCgkJLy8gRW5hYmxlcyB5b3UgdG8gc2tpcCBsb2FkaW5nIHRoZSBkZWZhdWx0IGNzcw0KCQlpZiAodC5mZWF0dXJlcy5wb3B1cF9jc3MgIT09IGZhbHNlKQ0KCQkJdC5kb20ubG9hZENTUyh0LmZlYXR1cmVzLnBvcHVwX2NzcyB8fCB0LmVkaXRvci5zZXR0aW5ncy5wb3B1cF9jc3MpOw0KDQoJCS8vIFNldHVwIG9uIGluaXQgbGlzdGVuZXJzDQoJCXQubGlzdGVuZXJzID0gW107DQoJCXQub25Jbml0ID0gew0KCQkJYWRkIDogZnVuY3Rpb24oZiwgcykgew0KCQkJCXQubGlzdGVuZXJzLnB1c2goe2Z1bmMgOiBmLCBzY29wZSA6IHN9KTsNCgkJCX0NCgkJfTsNCg0KCQl0LmlzV2luZG93ID0gIXQuZ2V0V2luZG93QXJnKCdtY2VfaW5saW5lJyk7DQoJCXQuaWQgPSB0LmdldFdpbmRvd0FyZygnbWNlX3dpbmRvd19pZCcpOw0KCQl0LmVkaXRvci53aW5kb3dNYW5hZ2VyLm9uT3Blbi5kaXNwYXRjaCh0LmVkaXRvci53aW5kb3dNYW5hZ2VyLCB3aW5kb3cpOw0KCX0sDQoNCgkvKioNCgkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCB3aW5kb3cgdGhhdCBvcGVuZWQgdGhlIGRpYWxvZy4NCgkgKg0KCSAqIEBtZXRob2QgZ2V0V2luDQoJICogQHJldHVybiB7V2luZG93fSBSZWZlcmVuY2UgdG8gdGhlIHBhcmVudCB3aW5kb3cgdGhhdCBvcGVuZWQgdGhlIGRpYWxvZy4NCgkgKi8NCglnZXRXaW4gOiBmdW5jdGlvbigpIHsNCgkJLy8gQWRkZWQgZnJhbWVFbGVtZW50IGNoZWNrIHRvIGZpeCBidWc6ICMyODE3NTgzDQoJCXJldHVybiAoIXdpbmRvdy5mcmFtZUVsZW1lbnQgJiYgd2luZG93LmRpYWxvZ0FyZ3VtZW50cykgfHwgb3BlbmVyIHx8IHBhcmVudCB8fCB0b3A7DQoJfSwNCg0KCS8qKg0KCSAqIFJldHVybnMgYSB3aW5kb3cgYXJndW1lbnQvcGFyYW1ldGVyIGJ5IG5hbWUuDQoJICoNCgkgKiBAbWV0aG9kIGdldFdpbmRvd0FyZw0KCSAqIEBwYXJhbSB7U3RyaW5nfSBuIE5hbWUgb2YgdGhlIHdpbmRvdyBhcmd1bWVudCB0byByZXRyaXZlLg0KCSAqIEBwYXJhbSB7U3RyaW5nfSBkdiBPcHRpb25hbCBkZWZhdWx0IHZhbHVlIHRvIHJldHVybi4NCgkgKiBAcmV0dXJuIHtTdHJpbmd9IEFyZ3VtZW50IHZhbHVlIG9yIGRlZmF1bHQgdmFsdWUgaWYgaXQgd2Fzbid0IGZvdW5kLg0KCSAqLw0KCWdldFdpbmRvd0FyZyA6IGZ1bmN0aW9uKG4sIGR2KSB7DQoJCXZhciB2ID0gdGhpcy5wYXJhbXNbbl07DQoNCgkJcmV0dXJuIHRpbnltY2UuaXModikgPyB2IDogZHY7DQoJfSwNCg0KCS8qKg0KCSAqIFJldHVybnMgYSBlZGl0b3IgcGFyYW1ldGVyL2NvbmZpZyBvcHRpb24gdmFsdWUuDQoJICoNCgkgKiBAbWV0aG9kIGdldFBhcmFtDQoJICogQHBhcmFtIHtTdHJpbmd9IG4gTmFtZSBvZiB0aGUgZWRpdG9yIGNvbmZpZyBvcHRpb24gdG8gcmV0cml2ZS4NCgkgKiBAcGFyYW0ge1N0cmluZ30gZHYgT3B0aW9uYWwgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4uDQoJICogQHJldHVybiB7U3RyaW5nfSBQYXJhbWV0ZXIgdmFsdWUgb3IgZGVmYXVsdCB2YWx1ZSBpZiBpdCB3YXNuJ3QgZm91bmQuDQoJICovDQoJZ2V0UGFyYW0gOiBmdW5jdGlvbihuLCBkdikgew0KCQlyZXR1cm4gdGhpcy5lZGl0b3IuZ2V0UGFyYW0obiwgZHYpOw0KCX0sDQoNCgkvKioNCgkgKiBSZXR1cm5zIGEgbGFuZ3VhZ2UgaXRlbSBieSBrZXkuDQoJICoNCgkgKiBAbWV0aG9kIGdldExhbmcNCgkgKiBAcGFyYW0ge1N0cmluZ30gbiBMYW5ndWFnZSBpdGVtIGxpa2UgbXlkaWFsb2cuc29tZXRoaW5nLg0KCSAqIEBwYXJhbSB7U3RyaW5nfSBkdiBPcHRpb25hbCBkZWZhdWx0IHZhbHVlIHRvIHJldHVybi4NCgkgKiBAcmV0dXJuIHtTdHJpbmd9IExhbmd1YWdlIHZhbHVlIGZvciB0aGUgaXRlbSBsaWtlICJteSBzdHJpbmciIG9yIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGl0IHdhc24ndCBmb3VuZC4NCgkgKi8NCglnZXRMYW5nIDogZnVuY3Rpb24obiwgZHYpIHsNCgkJcmV0dXJuIHRoaXMuZWRpdG9yLmdldExhbmcobiwgZHYpOw0KCX0sDQoNCgkvKioNCgkgKiBFeGVjdXRlZCBhIGNvbW1hbmQgb24gZWRpdG9yIHRoYXQgb3BlbmVkIHRoZSBkaWFsb2cvcG9wdXAuDQoJICoNCgkgKiBAbWV0aG9kIGV4ZWNDb21tYW5kDQoJICogQHBhcmFtIHtTdHJpbmd9IGNtZCBDb21tYW5kIHRvIGV4ZWN1dGUuDQoJICogQHBhcmFtIHtCb29sZWFufSB1aSBPcHRpb25hbCBib29sZWFuIHZhbHVlIGlmIHRoZSBVSSBmb3IgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHByZXNlbnRlZCBvciBub3QuDQoJICogQHBhcmFtIHtPYmplY3R9IHZhbCBPcHRpb25hbCB2YWx1ZSB0byBwYXNzIHdpdGggdGhlIGNvbW1hbiBsaWtlIGFuIFVSTC4NCgkgKiBAcGFyYW0ge09iamVjdH0gYSBPcHRpb25hbCBhcmd1bWVudHMgb2JqZWN0Lg0KCSAqLw0KCWV4ZWNDb21tYW5kIDogZnVuY3Rpb24oY21kLCB1aSwgdmFsLCBhKSB7DQoJCWEgPSBhIHx8IHt9Ow0KCQlhLnNraXBfZm9jdXMgPSAxOw0KDQoJCXRoaXMucmVzdG9yZVNlbGVjdGlvbigpOw0KCQlyZXR1cm4gdGhpcy5lZGl0b3IuZXhlY0NvbW1hbmQoY21kLCB1aSwgdmFsLCBhKTsNCgl9LA0KDQoJLyoqDQoJICogUmVzaXplcyB0aGUgZGlhbG9nIHRvIHRoZSBpbm5lciBzaXplIG9mIHRoZSB3aW5kb3cuIFRoaXMgaXMgbmVlZGVkIHNpbmNlIHZhcmlvdXMgYnJvd3NlcnMNCgkgKiBoYXZlIGRpZmZlcmVudCBib3JkZXIgc2l6ZXMgb24gd2luZG93cy4NCgkgKg0KCSAqIEBtZXRob2QgcmVzaXplVG9Jbm5lclNpemUNCgkgKi8NCglyZXNpemVUb0lubmVyU2l6ZSA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgdCA9IHRoaXM7DQoNCgkJLy8gRGV0YWNoIGl0IHRvIHdvcmthcm91bmQgYSBDaHJvbWUgc3BlY2lmaWMgYnVnDQoJCS8vIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvP2Z1bmM9ZGV0YWlsJmF0aWQ9NjM1NjgyJmFpZD0yOTI2MzM5Jmdyb3VwX2lkPTEwMzI4MQ0KCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KCQkJdmFyIHZwID0gdC5kb20uZ2V0Vmlld1BvcnQod2luZG93KTsNCg0KCQkJdC5lZGl0b3Iud2luZG93TWFuYWdlci5yZXNpemVCeSgNCgkJCQl0LmdldFdpbmRvd0FyZygnbWNlX3dpZHRoJykgLSB2cC53LA0KCQkJCXQuZ2V0V2luZG93QXJnKCdtY2VfaGVpZ2h0JykgLSB2cC5oLA0KCQkJCXQuaWQgfHwgd2luZG93DQoJCQkpOw0KCQl9LCAwKTsNCgl9LA0KDQoJLyoqDQoJICogV2lsbCBleGVjdXRlZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aGVuIHRoZSBwYWdlIGhhcyBiZWVuIGxvYWRlZC4gVGhpcyBmdW5jdGlvbg0KCSAqIHdhcyBhZGRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSAyLnggYnJhbmNoLg0KCSAqDQoJICogQG1ldGhvZCBleGVjdXRlT25Mb2FkDQoJICogQHBhcmFtIHtTdHJpbmd9IHMgU3RyaW5nIHRvIGV2YWx1dGF0ZSBvbiBpbml0Lg0KCSAqLw0KCWV4ZWN1dGVPbkxvYWQgOiBmdW5jdGlvbihzKSB7DQoJCXRoaXMub25Jbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCWV2YWwocyk7DQoJCX0pOw0KCX0sDQoNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGN1cnJlbnQgZWRpdG9yIHNlbGVjdGlvbiBmb3IgbGF0ZXIgcmVzdG9yYXRpb24uIFRoaXMgY2FuIGJlIHVzZWZ1bCBzaW5jZSBzb21lIGJyb3dzZXJzDQoJICogbG9vc2VzIGl0J3Mgc2VsZWN0aW9uIGlmIGEgY29udHJvbCBlbGVtZW50IGlzIHNlbGVjdGVkL2ZvY3VzZWQgaW5zaWRlIHRoZSBkaWFsb2dzLg0KCSAqDQoJICogQG1ldGhvZCBzdG9yZVNlbGVjdGlvbg0KCSAqLw0KCXN0b3JlU2VsZWN0aW9uIDogZnVuY3Rpb24oKSB7DQoJCXRoaXMuZWRpdG9yLndpbmRvd01hbmFnZXIuYm9va21hcmsgPSB0aW55TUNFUG9wdXAuZWRpdG9yLnNlbGVjdGlvbi5nZXRCb29rbWFyaygxKTsNCgl9LA0KDQoJLyoqDQoJICogUmVzdG9yZXMgYW55IHN0b3JlZCBzZWxlY3Rpb24uIFRoaXMgY2FuIGJlIHVzZWZ1bCBzaW5jZSBzb21lIGJyb3dzZXJzDQoJICogbG9vc2VzIGl0J3Mgc2VsZWN0aW9uIGlmIGEgY29udHJvbCBlbGVtZW50IGlzIHNlbGVjdGVkL2ZvY3VzZWQgaW5zaWRlIHRoZSBkaWFsb2dzLg0KCSAqDQoJICogQG1ldGhvZCByZXN0b3JlU2VsZWN0aW9uDQoJICovDQoJcmVzdG9yZVNlbGVjdGlvbiA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgdCA9IHRpbnlNQ0VQb3B1cDsNCg0KCQlpZiAoIXQuaXNXaW5kb3cgJiYgdGlueW1jZS5pc0lFKQ0KCQkJdC5lZGl0b3Iuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKHQuZWRpdG9yLndpbmRvd01hbmFnZXIuYm9va21hcmspOw0KCX0sDQoNCgkvKioNCgkgKiBMb2FkcyBhIHNwZWNpZmljIGRpYWxvZyBsYW5ndWFnZSBwYWNrLiBJZiB5b3UgcGFzcyBpbiBwbHVnaW5fdXJsIGFzIGEgYXJ1Z21lbnQNCgkgKiB3aGVuIHlvdSBvcGVuIHRoZSB3aW5kb3cgaXQgd2lsbCBsb2FkIHRoZSA8cGx1Z2luIHVybD4vbGFuZ3MvPGNvZGU+X2RsZy5qcyBsYW5nIHBhY2sgZmlsZS4NCgkgKg0KCSAqIEBtZXRob2QgcmVxdWlyZUxhbmdQYWNrDQoJICovDQoJcmVxdWlyZUxhbmdQYWNrIDogZnVuY3Rpb24oKSB7DQoJCXZhciB0ID0gdGhpcywgdSA9IHQuZ2V0V2luZG93QXJnKCdwbHVnaW5fdXJsJykgfHwgdC5nZXRXaW5kb3dBcmcoJ3RoZW1lX3VybCcpOw0KDQoJCWlmICh1ICYmIHQuZWRpdG9yLnNldHRpbmdzLmxhbmd1YWdlICYmIHQuZmVhdHVyZXMudHJhbnNsYXRlX2kxOG4gIT09IGZhbHNlKSB7DQoJCQl1ICs9ICcvbGFuZ3MvJyArIHQuZWRpdG9yLnNldHRpbmdzLmxhbmd1YWdlICsgJ19kbGcuanMnOw0KDQoJCQlpZiAoIXRpbnltY2UuU2NyaXB0TG9hZGVyLmlzRG9uZSh1KSkgew0KCQkJCWRvY3VtZW50LndyaXRlKCc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInICsgdGlueW1jZS5fYWRkVmVyKHUpICsgJyI+PC9zY3JpcHQ+Jyk7DQoJCQkJdGlueW1jZS5TY3JpcHRMb2FkZXIubWFya0RvbmUodSk7DQoJCQl9DQoJCX0NCgl9LA0KDQoJLyoqDQoJICogRXhlY3V0ZXMgYSBjb2xvciBwaWNrZXIgb24gdGhlIHNwZWNpZmllZCBlbGVtZW50IGlkLiBXaGVuIHRoZSB1c2VyDQoJICogdGhlbiBzZWxlY3RzIGEgY29sb3IgaXQgd2lsbCBiZSBzZXQgYXMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4NCgkgKg0KCSAqIEBtZXRob2QgcGlja0NvbG9yDQoJICogQHBhcmFtIHtET01FdmVudH0gZSBET00gZXZlbnQgb2JqZWN0Lg0KCSAqIEBwYXJhbSB7c3RyaW5nfSBlbGVtZW50X2lkIEVsZW1lbnQgaWQgdG8gYmUgZmlsbGVkIHdpdGggdGhlIGNvbG9yIHZhbHVlIGZyb20gdGhlIHBpY2tlci4NCgkgKi8NCglwaWNrQ29sb3IgOiBmdW5jdGlvbihlLCBlbGVtZW50X2lkKSB7DQoJCXRoaXMuZXhlY0NvbW1hbmQoJ21jZUNvbG9yUGlja2VyJywgdHJ1ZSwgew0KCQkJY29sb3IgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50X2lkKS52YWx1ZSwNCgkJCWZ1bmMgOiBmdW5jdGlvbihjKSB7DQoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudF9pZCkudmFsdWUgPSBjOw0KDQoJCQkJdHJ5IHsNCgkJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudF9pZCkub25jaGFuZ2UoKTsNCgkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkvLyBUcnkgZmlyZSBldmVudCwgaWdub3JlIGVycm9ycw0KCQkJCX0NCgkJCX0NCgkJfSk7DQoJfSwNCg0KCS8qKg0KCSAqIE9wZW5zIGEgZmlsZWJyb3dzZXIvaW1hZ2Vicm93c2VyIHRoaXMgd2lsbCBzZXQgdGhlIG91dHB1dCB2YWx1ZSBmcm9tDQoJICogdGhlIGJyb3dzZXIgYXMgYSB2YWx1ZSBvbiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuDQoJICoNCgkgKiBAbWV0aG9kIG9wZW5Ccm93c2VyDQoJICogQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnRfaWQgSWQgb2YgdGhlIGVsZW1lbnQgdG8gc2V0IHZhbHVlIGluLg0KCSAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFR5cGUgb2YgYnJvd3NlciB0byBvcGVuIGltYWdlL2ZpbGUvZmxhc2guDQoJICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbiBPcHRpb24gbmFtZSB0byBnZXQgdGhlIGZpbGVfYnJvc3dlcl9jYWxsYmFjayBmdW5jdGlvbiBuYW1lIGZyb20uDQoJICovDQoJb3BlbkJyb3dzZXIgOiBmdW5jdGlvbihlbGVtZW50X2lkLCB0eXBlLCBvcHRpb24pIHsNCgkJdGlueU1DRVBvcHVwLnJlc3RvcmVTZWxlY3Rpb24oKTsNCgkJdGhpcy5lZGl0b3IuZXhlY0NhbGxiYWNrKCdmaWxlX2Jyb3dzZXJfY2FsbGJhY2snLCBlbGVtZW50X2lkLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50X2lkKS52YWx1ZSwgdHlwZSwgd2luZG93KTsNCgl9LA0KDQoJLyoqDQoJICogQ3JlYXRlcyBhIGNvbmZpcm0gZGlhbG9nLiBQbGVhc2UgZG9uJ3QgdXNlIHRoZSBibG9ja2luZyBiZWhhdmlvciBvZiB0aGlzDQoJICogbmF0aXZlIHZlcnNpb24gdXNlIHRoZSBjYWxsYmFjayBtZXRob2QgaW5zdGVhZCB0aGVuIGl0IGNhbiBiZSBleHRlbmRlZC4NCgkgKg0KCSAqIEBtZXRob2QgY29uZmlybQ0KCSAqIEBwYXJhbSB7U3RyaW5nfSB0IFRpdGxlIGZvciB0aGUgbmV3IGNvbmZpcm0gZGlhbG9nLg0KCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGNiIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBvayBvciBjYW5jZWwuDQoJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgc2NvcGUgdG8gZXhlY3V0ZSB0aGUgY2FsbGJhY2sgaW4uDQoJICovDQoJY29uZmlybSA6IGZ1bmN0aW9uKHQsIGNiLCBzKSB7DQoJCXRoaXMuZWRpdG9yLndpbmRvd01hbmFnZXIuY29uZmlybSh0LCBjYiwgcywgd2luZG93KTsNCgl9LA0KDQoJLyoqDQoJICogQ3JlYXRlcyBhIGFsZXJ0IGRpYWxvZy4gUGxlYXNlIGRvbid0IHVzZSB0aGUgYmxvY2tpbmcgYmVoYXZpb3Igb2YgdGhpcw0KCSAqIG5hdGl2ZSB2ZXJzaW9uIHVzZSB0aGUgY2FsbGJhY2sgbWV0aG9kIGluc3RlYWQgdGhlbiBpdCBjYW4gYmUgZXh0ZW5kZWQuDQoJICoNCgkgKiBAbWV0aG9kIGFsZXJ0DQoJICogQHBhcmFtIHtTdHJpbmd9IHQgVGl0bGUgZm9yIHRoZSBuZXcgYWxlcnQgZGlhbG9nLg0KCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGNiIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBvay4NCgkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBzY29wZSB0byBleGVjdXRlIHRoZSBjYWxsYmFjayBpbi4NCgkgKi8NCglhbGVydCA6IGZ1bmN0aW9uKHR4LCBjYiwgcykgew0KCQl0aGlzLmVkaXRvci53aW5kb3dNYW5hZ2VyLmFsZXJ0KHR4LCBjYiwgcywgd2luZG93KTsNCgl9LA0KDQoJLyoqDQoJICogQ2xvc2VzIHRoZSBjdXJyZW50IHdpbmRvdy4NCgkgKg0KCSAqIEBtZXRob2QgY2xvc2UNCgkgKi8NCgljbG9zZSA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgdCA9IHRoaXM7DQoNCgkJLy8gVG8gYXZvaWQgZG9tYWluIHJlbGF4aW5nIGlzc3VlIGluIE9wZXJhDQoJCWZ1bmN0aW9uIGNsb3NlKCkgew0KCQkJdC5lZGl0b3Iud2luZG93TWFuYWdlci5jbG9zZSh3aW5kb3cpOw0KCQkJdGlueW1jZSA9IHRpbnlNQ0UgPSB0LmVkaXRvciA9IHQucGFyYW1zID0gdC5kb20gPSB0LmRvbS5kb2MgPSBudWxsOyAvLyBDbGVhbnVwDQoJCX07DQoNCgkJaWYgKHRpbnltY2UuaXNPcGVyYSkNCgkJCXQuZ2V0V2luKCkuc2V0VGltZW91dChjbG9zZSwgMCk7DQoJCWVsc2UNCgkJCWNsb3NlKCk7DQoJfSwNCg0KCS8vIEludGVybmFsIGZ1bmN0aW9ucwkNCg0KCV9yZXN0b3JlU2VsZWN0aW9uIDogZnVuY3Rpb24oKSB7DQoJCXZhciBlID0gd2luZG93LmV2ZW50LnNyY0VsZW1lbnQ7DQoNCgkJaWYgKGUubm9kZU5hbWUgPT0gJ0lOUFVUJyAmJiAoZS50eXBlID09ICdzdWJtaXQnIHx8IGUudHlwZSA9PSAnYnV0dG9uJykpDQoJCQl0aW55TUNFUG9wdXAucmVzdG9yZVNlbGVjdGlvbigpOw0KCX0sDQoNCi8qCV9yZXN0b3JlU2VsZWN0aW9uIDogZnVuY3Rpb24oKSB7DQoJCXZhciBlID0gd2luZG93LmV2ZW50LnNyY0VsZW1lbnQ7DQoNCgkJLy8gSWYgdXNlciBmb2N1cyBhIG5vbiB0ZXh0IGlucHV0IG9yIHRleHRhcmVhDQoJCWlmICgoZS5ub2RlTmFtZSAhPSAnSU5QVVQnICYmIGUubm9kZU5hbWUgIT0gJ1RFWFRBUkVBJykgfHwgZS50eXBlICE9ICd0ZXh0JykNCgkJCXRpbnlNQ0VQb3B1cC5yZXN0b3JlU2VsZWN0aW9uKCk7DQoJfSwqLw0KDQoJX29uRE9NTG9hZGVkIDogZnVuY3Rpb24oKSB7DQoJCXZhciB0ID0gdGlueU1DRVBvcHVwLCB0aSA9IGRvY3VtZW50LnRpdGxlLCBibSwgaCwgbnY7DQoNCgkJaWYgKHQuZG9tTG9hZGVkKQ0KCQkJcmV0dXJuOw0KDQoJCXQuZG9tTG9hZGVkID0gMTsNCg0KCQkvLyBUcmFuc2xhdGUgcGFnZQ0KCQlpZiAodC5mZWF0dXJlcy50cmFuc2xhdGVfaTE4biAhPT0gZmFsc2UpIHsNCgkJCWggPSBkb2N1bWVudC5ib2R5LmlubmVySFRNTDsNCg0KCQkJLy8gUmVwbGFjZSBhPXggd2l0aCBhPSJ4IiBpbiBJRQ0KCQkJaWYgKHRpbnltY2UuaXNJRSkNCgkJCQloID0gaC5yZXBsYWNlKC8gKHZhbHVlfHRpdGxlfGFsdCk9KFteIl1bXlxzPl0rKS9naSwgJyAkMT0iJDIiJykNCg0KCQkJZG9jdW1lbnQuZGlyID0gdC5lZGl0b3IuZ2V0UGFyYW0oJ2RpcmVjdGlvbmFsaXR5JywnJyk7DQoNCgkJCWlmICgobnYgPSB0LmVkaXRvci50cmFuc2xhdGUoaCkpICYmIG52ICE9IGgpDQoJCQkJZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSBudjsNCg0KCQkJaWYgKChudiA9IHQuZWRpdG9yLnRyYW5zbGF0ZSh0aSkpICYmIG52ICE9IHRpKQ0KCQkJCWRvY3VtZW50LnRpdGxlID0gdGkgPSBudjsNCgkJfQ0KDQoJCWRvY3VtZW50LmJvZHkuc3R5bGUuZGlzcGxheSA9ICcnOw0KDQoJCS8vIFJlc3RvcmUgc2VsZWN0aW9uIGluIElFIHdoZW4gZm9jdXMgaXMgcGxhY2VkIG9uIGEgbm9uIHRleHRhcmVhIG9yIGlucHV0IGVsZW1lbnQgb2YgdGhlIHR5cGUgdGV4dA0KCQlpZiAodGlueW1jZS5pc0lFKSB7DQoJCQlkb2N1bWVudC5hdHRhY2hFdmVudCgnb25tb3VzZXVwJywgdGlueU1DRVBvcHVwLl9yZXN0b3JlU2VsZWN0aW9uKTsNCg0KCQkJLy8gQWRkIGJhc2UgdGFyZ2V0IGVsZW1lbnQgZm9yIGl0IHNpbmNlIGl0IHdvdWxkIGZhaWwgd2l0aCBtb2RhbCBkaWFsb2dzDQoJCQl0LmRvbS5hZGQodC5kb20uc2VsZWN0KCdoZWFkJylbMF0sICdiYXNlJywge3RhcmdldCA6ICdfc2VsZid9KTsNCgkJfQ0KDQoJCXQucmVzdG9yZVNlbGVjdGlvbigpOw0KCQl0LnJlc2l6ZVRvSW5uZXJTaXplKCk7DQoNCgkJLy8gU2V0IGlubGluZSB0aXRsZQ0KCQlpZiAoIXQuaXNXaW5kb3cpDQoJCQl0LmVkaXRvci53aW5kb3dNYW5hZ2VyLnNldFRpdGxlKHdpbmRvdywgdGkpOw0KCQllbHNlDQoJCQl3aW5kb3cuZm9jdXMoKTsNCg0KCQlpZiAoIXRpbnltY2UuaXNJRSAmJiAhdC5pc1dpbmRvdykgew0KCQkJdGlueW1jZS5kb20uRXZlbnQuX2FkZChkb2N1bWVudCwgJ2ZvY3VzJywgZnVuY3Rpb24oKSB7DQoJCQkJdC5lZGl0b3Iud2luZG93TWFuYWdlci5mb2N1cyh0LmlkKTsNCgkJCX0pOw0KCQl9DQoNCgkJLy8gUGF0Y2ggZm9yIGFjY2Vzc2liaWxpdHkNCgkJdGlueW1jZS5lYWNoKHQuZG9tLnNlbGVjdCgnc2VsZWN0JyksIGZ1bmN0aW9uKGUpIHsNCgkJCWUub25rZXlkb3duID0gdGlueU1DRVBvcHVwLl9hY2Nlc3NIYW5kbGVyOw0KCQl9KTsNCg0KCQkvLyBDYWxsIG9uSW5pdA0KCQkvLyBJbml0IG11c3QgYmUgY2FsbGVkIGJlZm9yZSBmb2N1cyBzbyB0aGUgc2VsZWN0aW9uIHdvbid0IGdldCBsb3N0IGJ5IHRoZSBmb2N1cyBjYWxsDQoJCXRpbnltY2UuZWFjaCh0Lmxpc3RlbmVycywgZnVuY3Rpb24obykgew0KCQkJby5mdW5jLmNhbGwoby5zY29wZSwgdC5lZGl0b3IpOw0KCQl9KTsNCg0KCQkvLyBNb3ZlIGZvY3VzIHRvIHdpbmRvdw0KCQlpZiAodC5nZXRXaW5kb3dBcmcoJ21jZV9hdXRvX2ZvY3VzJywgdHJ1ZSkpIHsNCgkJCXdpbmRvdy5mb2N1cygpOw0KDQoJCQkvLyBGb2N1cyBlbGVtZW50IHdpdGggbWNlRm9jdXMgY2xhc3MNCgkJCXRpbnltY2UuZWFjaChkb2N1bWVudC5mb3JtcywgZnVuY3Rpb24oZikgew0KCQkJCXRpbnltY2UuZWFjaChmLmVsZW1lbnRzLCBmdW5jdGlvbihlKSB7DQoJCQkJCWlmICh0LmRvbS5oYXNDbGFzcyhlLCAnbWNlRm9jdXMnKSAmJiAhZS5kaXNhYmxlZCkgew0KCQkJCQkJZS5mb2N1cygpOw0KCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBCcmVhayBsb29wDQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0pOw0KCQl9DQoNCgkJZG9jdW1lbnQub25rZXl1cCA9IHRpbnlNQ0VQb3B1cC5fY2xvc2VXaW5LZXlIYW5kbGVyOw0KCX0sDQoNCglfYWNjZXNzSGFuZGxlciA6IGZ1bmN0aW9uKGUpIHsNCgkJZSA9IGUgfHwgd2luZG93LmV2ZW50Ow0KDQoJCWlmIChlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDMyKSB7DQoJCQllID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50Ow0KDQoJCQlpZiAoZS5vbmNoYW5nZSkNCgkJCQllLm9uY2hhbmdlKCk7DQoNCgkJCXJldHVybiB0aW55bWNlLmRvbS5FdmVudC5jYW5jZWwoZSk7DQoJCX0NCgl9LA0KDQoJX2Nsb3NlV2luS2V5SGFuZGxlciA6IGZ1bmN0aW9uKGUpIHsNCgkJZSA9IGUgfHwgd2luZG93LmV2ZW50Ow0KDQoJCWlmIChlLmtleUNvZGUgPT0gMjcpDQoJCQl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCgl9LA0KDQoJX3dhaXQgOiBmdW5jdGlvbigpIHsNCgkJLy8gVXNlIElFIG1ldGhvZA0KCQlpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsNCgkJCWRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsNCgkJCQlpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KCQkJCQlkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7DQoJCQkJCXRpbnlNQ0VQb3B1cC5fb25ET01Mb2FkZWQoKTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCAmJiB3aW5kb3cgPT0gd2luZG93LnRvcCkgew0KCQkJCShmdW5jdGlvbigpIHsNCgkJCQkJaWYgKHRpbnlNQ0VQb3B1cC5kb21Mb2FkZWQpDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJdHJ5IHsNCgkJCQkJCS8vIElmIElFIGlzIHVzZWQsIHVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pDQoJCQkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLw0KCQkJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iik7DQoJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQlzZXRUaW1lb3V0KGFyZ3VtZW50cy5jYWxsZWUsIDApOw0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoNCgkJCQkJdGlueU1DRVBvcHVwLl9vbkRPTUxvYWRlZCgpOw0KCQkJCX0pKCk7DQoJCQl9DQoNCgkJCWRvY3VtZW50LmF0dGFjaEV2ZW50KCdvbmxvYWQnLCB0aW55TUNFUG9wdXAuX29uRE9NTG9hZGVkKTsNCgkJfSBlbHNlIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7DQoJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHRpbnlNQ0VQb3B1cC5fb25ET01Mb2FkZWQsIGZhbHNlKTsNCgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgdGlueU1DRVBvcHVwLl9vbkRPTUxvYWRlZCwgZmFsc2UpOw0KCQl9DQoJfQ0KfTsNCg0KdGlueU1DRVBvcHVwLmluaXQoKTsNCnRpbnlNQ0VQb3B1cC5fd2FpdCgpOyAvLyBXYWl0IGZvciBET00gQ29udGVudCBMb2FkZWQNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/tinymce.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiB0aW55bWNlLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHdpbikgew0KCXZhciB3aGl0ZVNwYWNlUmUgPSAvXlxzKnxccyokL2csDQoJCXVuZGVmaW5lZCwgaXNSZWdFeHBCcm9rZW4gPSAnQicucmVwbGFjZSgvQSguKXxCLywgJyQxJykgPT09ICckMSc7DQoNCgkvKioNCgkgKiBDb3JlIG5hbWVzcGFjZSB3aXRoIGNvcmUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIFRpbnlNQ0UgQVBJIGFsbCBzdWIgY2xhc3NlcyB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgbmFtZXNwYWNlL29iamVjdC4NCgkgKg0KCSAqIEBzdGF0aWMNCgkgKiBAY2xhc3MgdGlueW1jZQ0KCSAqIEBleGFtcGxlDQoJICogLy8gVXNpbmcgZWFjaCBtZXRob2QNCgkgKiB0aW55bWNlLmVhY2goWzEsIDIsIDNdLCBmdW5jdGlvbih2LCBpKSB7DQoJICogICBjb25zb2xlLmxvZyhpICsgJz0nICsgdik7DQoJICogfSk7DQoJICoNCgkgKiAvLyBDaGVja2luZyBmb3IgYSBzcGVjaWZpYyBicm93c2VyDQoJICogaWYgKHRpbnltY2UuaXNJRSkNCgkgKiAgIGNvbnNvbGUubG9nKCJJRSIpOw0KCSAqLw0KCXZhciB0aW55bWNlID0gew0KCQkvKioNCgkJICogTWFqb3IgdmVyc2lvbiBvZiBUaW55TUNFIGJ1aWxkLg0KCQkgKg0KCQkgKiBAcHJvcGVydHkgbWFqb3JWZXJzaW9uDQoJCSAqIEB0eXBlIFN0cmluZw0KCQkgKi8NCgkJbWFqb3JWZXJzaW9uIDogJ0BAdGlueW1jZV9tYWpvcl92ZXJzaW9uQEAnLA0KDQoJCS8qKg0KCQkgKiBNYWpvciB2ZXJzaW9uIG9mIFRpbnlNQ0UgYnVpbGQuDQoJCSAqDQoJCSAqIEBwcm9wZXJ0eSBtaW5vclZlcnNpb24NCgkJICogQHR5cGUgU3RyaW5nDQoJCSAqLw0KCQltaW5vclZlcnNpb24gOiAnQEB0aW55bWNlX21pbm9yX3ZlcnNpb25AQCcsDQoNCgkJLyoqDQoJCSAqIFJlbGVhc2UgZGF0ZSBvZiBUaW55TUNFIGJ1aWxkLg0KCQkgKg0KCQkgKiBAcHJvcGVydHkgcmVsZWFzZURhdGUNCgkJICogQHR5cGUgU3RyaW5nDQoJCSAqLw0KCQlyZWxlYXNlRGF0ZSA6ICdAQHRpbnltY2VfcmVsZWFzZV9kYXRlQEAnLA0KDQoJCS8qKg0KCQkgKiBJbml0aWFsaXplcyB0aGUgVGlueU1DRSBnbG9iYWwgbmFtZXNwYWNlIHRoaXMgd2lsbCBzZXR1cCBicm93c2VyIGRldGVjdGlvbiBhbmQgZmlndXJlIG91dCB3aGVyZSBUaW55TUNFIGlzIHJ1bm5pbmcgZnJvbS4NCgkJICovDQoJCV9pbml0IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGQgPSBkb2N1bWVudCwgbmEgPSBuYXZpZ2F0b3IsIHVhID0gbmEudXNlckFnZW50LCBpLCBubCwgbiwgYmFzZSwgcCwgdjsNCg0KCQkJLyoqDQoJCQkgKiBDb25zdGFudCB0aGF0IGlzIHRydWUgaWYgdGhlIGJyb3dzZXIgaXMgT3BlcmEuDQoJCQkgKg0KCQkJICogQHByb3BlcnR5IGlzT3BlcmENCgkJCSAqIEB0eXBlIEJvb2xlYW4NCgkJCSAqIEBmaW5hbA0KCQkJICovDQoJCQl0LmlzT3BlcmEgPSB3aW4ub3BlcmEgJiYgb3BlcmEuYnVpbGROdW1iZXI7DQoNCgkJCS8qKg0KCQkJICogQ29uc3RhbnQgdGhhdCBpcyB0cnVlIGlmIHRoZSBicm93c2VyIGlzIFdlYktpdCAoU2FmYXJpL0Nocm9tZSkuDQoJCQkgKg0KCQkJICogQHByb3BlcnR5IGlzV2ViS2l0DQoJCQkgKiBAdHlwZSBCb29sZWFuDQoJCQkgKiBAZmluYWwNCgkJCSAqLw0KCQkJdC5pc1dlYktpdCA9IC9XZWJLaXQvLnRlc3QodWEpOw0KDQoJCQkvKioNCgkJCSAqIENvbnN0YW50IHRoYXQgaXMgdHJ1ZSBpZiB0aGUgYnJvd3NlciBpcyBJRS4NCgkJCSAqDQoJCQkgKiBAcHJvcGVydHkgaXNJRQ0KCQkJICogQHR5cGUgQm9vbGVhbg0KCQkJICogQGZpbmFsDQoJCQkgKi8NCgkJCXQuaXNJRSA9ICF0LmlzV2ViS2l0ICYmICF0LmlzT3BlcmEgJiYgKC9NU0lFL2dpKS50ZXN0KHVhKSAmJiAoL0V4cGxvcmVyL2dpKS50ZXN0KG5hLmFwcE5hbWUpOw0KDQoJCQkvKioNCgkJCSAqIENvbnN0YW50IHRoYXQgaXMgdHJ1ZSBpZiB0aGUgYnJvd3NlciBpcyBJRSA2IG9yIG9sZGVyLg0KCQkJICoNCgkJCSAqIEBwcm9wZXJ0eSBpc0lFNg0KCQkJICogQHR5cGUgQm9vbGVhbg0KCQkJICogQGZpbmFsDQoJCQkgKi8NCgkJCXQuaXNJRTYgPSB0LmlzSUUgJiYgL01TSUUgWzU2XS8udGVzdCh1YSk7DQoNCgkJCS8qKg0KCQkJICogQ29uc3RhbnQgdGhhdCBpcyB0cnVlIGlmIHRoZSBicm93c2VyIGlzIEdlY2tvLg0KCQkJICoNCgkJCSAqIEBwcm9wZXJ0eSBpc0dlY2tvDQoJCQkgKiBAdHlwZSBCb29sZWFuDQoJCQkgKiBAZmluYWwNCgkJCSAqLw0KCQkJdC5pc0dlY2tvID0gIXQuaXNXZWJLaXQgJiYgL0dlY2tvLy50ZXN0KHVhKTsNCg0KCQkJLyoqDQoJCQkgKiBDb25zdGFudCB0aGF0IGlzIHRydWUgaWYgdGhlIG9zIGlzIE1hYyBPUy4NCgkJCSAqDQoJCQkgKiBAcHJvcGVydHkgaXNNYWMNCgkJCSAqIEB0eXBlIEJvb2xlYW4NCgkJCSAqIEBmaW5hbA0KCQkJICovDQoJCQl0LmlzTWFjID0gdWEuaW5kZXhPZignTWFjJykgIT0gLTE7DQoNCgkJCS8qKg0KCQkJICogQ29uc3RhbnQgdGhhdCBpcyB0cnVlIGlmIHRoZSBydW50aW1lIGlzIEFkb2JlIEFpci4NCgkJCSAqDQoJCQkgKiBAcHJvcGVydHkgaXNBaXINCgkJCSAqIEB0eXBlIEJvb2xlYW4NCgkJCSAqIEBmaW5hbA0KCQkJICovDQoJCQl0LmlzQWlyID0gL2Fkb2JlYWlyL2kudGVzdCh1YSk7DQoNCgkJCS8qKg0KCQkJICogQ29uc3RhbnQgdGhhdCB0ZWxscyBpZiB0aGUgY3VycmVudCBicm93c2VyIGlzIGFuIGlQaG9uZSBvciBpUGFkLg0KCQkJICoNCgkJCSAqIEBwcm9wZXJ0eSBpc0lEZXZpY2UNCgkJCSAqIEB0eXBlIEJvb2xlYW4NCgkJCSAqIEBmaW5hbA0KCQkJICovDQoJCQl0LmlzSURldmljZSA9IC8oaVBhZHxpUGhvbmUpLy50ZXN0KHVhKTsNCg0KCQkJLy8gVGlueU1DRSAuTkVUIHdlYmNvbnRyb2wgbWlnaHQgYmUgc2V0dGluZyB0aGUgdmFsdWVzIGZvciBUaW55TUNFDQoJCQlpZiAod2luLnRpbnlNQ0VQcmVJbml0KSB7DQoJCQkJdC5zdWZmaXggPSB0aW55TUNFUHJlSW5pdC5zdWZmaXg7DQoJCQkJdC5iYXNlVVJMID0gdGlueU1DRVByZUluaXQuYmFzZTsNCgkJCQl0LnF1ZXJ5ID0gdGlueU1DRVByZUluaXQucXVlcnk7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQkvLyBHZXQgc3VmZml4IGFuZCBiYXNlDQoJCQl0LnN1ZmZpeCA9ICcnOw0KDQoJCQkvLyBJZiBiYXNlIGVsZW1lbnQgZm91bmQsIGFkZCB0aGF0IGluZnJvbnQgb2YgYmFzZVVSTA0KCQkJbmwgPSBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJyk7DQoJCQlmb3IgKGk9MDsgaTxubC5sZW5ndGg7IGkrKykgew0KCQkJCWlmICh2ID0gbmxbaV0uaHJlZikgew0KCQkJCQkvLyBIb3N0IG9ubHkgdmFsdWUgbGlrZSBodHRwOi8vc2l0ZS5jb20gb3IgaHR0cDovL3NpdGUuY29tOjgwMDgNCgkJCQkJaWYgKC9eaHR0cHM/OlwvXC9bXlwvXSskLy50ZXN0KHYpKQ0KCQkJCQkJdiArPSAnLyc7DQoNCgkJCQkJYmFzZSA9IHYgPyB2Lm1hdGNoKC8uKlwvLylbMF0gOiAnJzsgLy8gR2V0IG9ubHkgZGlyZWN0b3J5DQoJCQkJfQ0KCQkJfQ0KDQoJCQlmdW5jdGlvbiBnZXRCYXNlKG4pIHsNCgkJCQlpZiAobi5zcmMgJiYgL3RpbnlfbWNlKHxfZ3ppcHxfanF1ZXJ5fF9wcm90b3R5cGV8X2Z1bGwpKF9kZXZ8X3NyYyk/LmpzLy50ZXN0KG4uc3JjKSkgew0KCQkJCQlpZiAoL18oc3JjfGRldilcLmpzL2cudGVzdChuLnNyYykpDQoJCQkJCQl0LnN1ZmZpeCA9ICdfc3JjJzsNCg0KCQkJCQlpZiAoKHAgPSBuLnNyYy5pbmRleE9mKCc/JykpICE9IC0xKQ0KCQkJCQkJdC5xdWVyeSA9IG4uc3JjLnN1YnN0cmluZyhwICsgMSk7DQoNCgkJCQkJdC5iYXNlVVJMID0gbi5zcmMuc3Vic3RyaW5nKDAsIG4uc3JjLmxhc3RJbmRleE9mKCcvJykpOw0KDQoJCQkJCS8vIElmIHBhdGggdG8gc2NyaXB0IGlzIHJlbGF0aXZlIGFuZCBhIGJhc2UgaHJlZiB3YXMgZm91bmQgYWRkIHRoYXQgb25lIGluZnJvbnQNCgkJCQkJLy8gdGhlIHNyYyBwcm9wZXJ0eSB3aWxsIGFsd2F5cyBiZSBhbiBhYnNvbHV0ZSBvbmUgb24gbm9uIElFIGJyb3dzZXJzIGFuZCBJRSA4DQoJCQkJCS8vIHNvIHRoaXMgbG9naWMgd2lsbCBiYXNpY2FsbHkgb25seSBiZSBleGVjdXRlZCBvbiBvbGRlciBJRSB2ZXJzaW9ucw0KCQkJCQlpZiAoYmFzZSAmJiB0LmJhc2VVUkwuaW5kZXhPZignOi8vJykgPT0gLTEgJiYgdC5iYXNlVVJMLmluZGV4T2YoJy8nKSAhPT0gMCkNCgkJCQkJCXQuYmFzZVVSTCA9IGJhc2UgKyB0LmJhc2VVUkw7DQoNCgkJCQkJcmV0dXJuIHQuYmFzZVVSTDsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gbnVsbDsNCgkJCX07DQoNCgkJCS8vIENoZWNrIGRvY3VtZW50DQoJCQlubCA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOw0KCQkJZm9yIChpPTA7IGk8bmwubGVuZ3RoOyBpKyspIHsNCgkJCQlpZiAoZ2V0QmFzZShubFtpXSkpDQoJCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJLy8gQ2hlY2sgaGVhZA0KCQkJbiA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsNCgkJCWlmIChuKSB7DQoJCQkJbmwgPSBuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTsNCgkJCQlmb3IgKGk9MDsgaTxubC5sZW5ndGg7IGkrKykgew0KCQkJCQlpZiAoZ2V0QmFzZShubFtpXSkpDQoJCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm47DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENoZWNrcyBpZiBhIG9iamVjdCBpcyBvZiBhIHNwZWNpZmljIHR5cGUgZm9yIGV4YW1wbGUgYW4gYXJyYXkuDQoJCSAqDQoJCSAqIEBtZXRob2QgaXMNCgkJICogQHBhcmFtIHtPYmplY3R9IG8gT2JqZWN0IHRvIGNoZWNrIHR5cGUgb2YuDQoJCSAqIEBwYXJhbSB7c3RyaW5nfSB0IE9wdGlvbmFsIHR5cGUgdG8gY2hlY2sgZm9yLg0KCQkgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlL2ZhbHNlIGlmIHRoZSBvYmplY3QgaXMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLg0KCQkgKi8NCgkJaXMgOiBmdW5jdGlvbihvLCB0KSB7DQoJCQlpZiAoIXQpDQoJCQkJcmV0dXJuIG8gIT09IHVuZGVmaW5lZDsNCg0KCQkJaWYgKHQgPT0gJ2FycmF5JyAmJiAoby5oYXNPd25Qcm9wZXJ0eSAmJiBvIGluc3RhbmNlb2YgQXJyYXkpKQ0KCQkJCXJldHVybiB0cnVlOw0KDQoJCQlyZXR1cm4gdHlwZW9mKG8pID09IHQ7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFBlcmZvcm1zIGFuIGl0ZXJhdGlvbiBvZiBhbGwgaXRlbXMgaW4gYSBjb2xsZWN0aW9uIHN1Y2ggYXMgYW4gb2JqZWN0IG9yIGFycmF5LiBUaGlzIG1ldGhvZCB3aWxsIGV4ZWN1cmUgdGhlDQoJCSAqIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24sIGlmIHRoZSBjYWxsYmFjayByZXR1cm5zIGZhbHNlIHRoZSBpdGVyYXRpb24gd2lsbCB0ZXJtaW5hdGUuDQoJCSAqIFRoZSBjYWxsYmFjayBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6IGNiKHZhbHVlLCBrZXlfb3JfaW5kZXgpLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGVhY2gNCgkJICogQHBhcmFtIHtPYmplY3R9IG8gQ29sbGVjdGlvbiB0byBpdGVyYXRlLg0KCQkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYiBDYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIGl0ZW0uDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIHNjb3BlIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGluLg0KCQkgKiBAZXhhbXBsZQ0KCQkgKiB0aW55bWNlLmVhY2goWzEsIDIsIDNdLCBmdW5jdGlvbih2LCBpKSB7DQoJCSAqICAgY29uc29sZS5sb2coaSArICc9JyArIHYpOw0KCQkgKiB9KTsNCgkJICovDQoJCWVhY2ggOiBmdW5jdGlvbihvLCBjYiwgcykgew0KCQkJdmFyIG4sIGw7DQoNCgkJCWlmICghbykNCgkJCQlyZXR1cm4gMDsNCg0KCQkJcyA9IHMgfHwgbzsNCg0KCQkJaWYgKG8ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHsNCgkJCQkvLyBJbmRleGVkIGFycmF5cywgbmVlZGVkIGZvciBTYWZhcmkNCgkJCQlmb3IgKG49MCwgbCA9IG8ubGVuZ3RoOyBuIDwgbDsgbisrKSB7DQoJCQkJCWlmIChjYi5jYWxsKHMsIG9bbl0sIG4sIG8pID09PSBmYWxzZSkNCgkJCQkJCXJldHVybiAwOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJLy8gSGFzaHRhYmxlcw0KCQkJCWZvciAobiBpbiBvKSB7DQoJCQkJCWlmIChvLmhhc093blByb3BlcnR5KG4pKSB7DQoJCQkJCQlpZiAoY2IuY2FsbChzLCBvW25dLCBuLCBvKSA9PT0gZmFsc2UpDQoJCQkJCQkJcmV0dXJuIDA7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiAxOw0KCQl9LA0KDQoJCS8vICNpZm5kZWYganF1ZXJ5DQoNCgkJLyoqDQoJCSAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgYnkgdGhlIHJldHVybiB2YWx1ZSBvZiBlYWNoIGl0ZXJhdGlvbiBmdW5jdGlvbiBjYWxsLiBUaGlzIGVuYWJsZXMgeW91IHRvIGNvbnZlcnQNCgkJICogb25lIGFycmF5IGxpc3QgaW50byBhbm90aGVyLg0KCQkgKg0KCQkgKiBAbWV0aG9kIG1hcA0KCQkgKiBAcGFyYW0ge0FycmF5fSBhIEFycmF5IG9mIGl0ZW1zIHRvIGl0ZXJhdGUuDQoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGYgRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpdGVtLiBJdCdzIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBuZXcgdmFsdWUuDQoJCSAqIEByZXR1cm4ge0FycmF5fSBBcnJheSB3aXRoIG5ldyB2YWx1ZXMgYmFzZWQgb24gZnVuY3Rpb24gcmV0dXJuIHZhbHVlcy4NCgkJICovDQoJCW1hcCA6IGZ1bmN0aW9uKGEsIGYpIHsNCgkJCXZhciBvID0gW107DQoNCgkJCXRpbnltY2UuZWFjaChhLCBmdW5jdGlvbih2KSB7DQoJCQkJby5wdXNoKGYodikpOw0KCQkJfSk7DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBGaWx0ZXJzIG91dCBpdGVtcyBmcm9tIHRoZSBpbnB1dCBhcnJheSBieSBjYWxsaW5nIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS4NCgkJICogSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgdGhlIGl0ZW0gd2lsbCBiZSBleGNsdWRlZCBpZiBpdCByZXR1cm5zIHRydWUgaXQgd2lsbCBiZSBpbmNsdWRlZC4NCgkJICoNCgkJICogQG1ldGhvZCBncmVwDQoJCSAqIEBwYXJhbSB7QXJyYXl9IGEgQXJyYXkgb2YgaXRlbXMgdG8gbG9vcCB0aG91Z2guDQoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGYgRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpdGVtLiBJbmNsdWRlL2V4Y2x1ZGUgZGVwZW5kcyBvbiBpdCdzIHJldHVybiB2YWx1ZS4NCgkJICogQHJldHVybiB7QXJyYXl9IE5ldyBhcnJheSB3aXRoIHZhbHVlcyBpbXBvcnRlZCBhbmQgZmlsdGVyZWQgYmFzZWQgaW4gaW5wdXQuDQoJCSAqLw0KCQlncmVwIDogZnVuY3Rpb24oYSwgZikgew0KCQkJdmFyIG8gPSBbXTsNCg0KCQkJdGlueW1jZS5lYWNoKGEsIGZ1bmN0aW9uKHYpIHsNCgkJCQlpZiAoIWYgfHwgZih2KSkNCgkJCQkJby5wdXNoKHYpOw0KCQkJfSk7DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBhIHZhbHVlIGluIGFuIGFycmF5LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAtMSBpZiB0aGUgaXRlbSB3YXNuJ3QgZm91bmQuDQoJCSAqDQoJCSAqIEBtZXRob2QgaW5BcnJheQ0KCQkgKiBAcGFyYW0ge0FycmF5fSBhIEFycmF5L09iamVjdCB0byBzZWFyY2ggZm9yIHZhbHVlIGluLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gdiBWYWx1ZSB0byBjaGVjayBmb3IgaW5zaWRlIHRoZSBhcnJheS4NCgkJICogQHJldHVybiB7TnVtYmVyL1N0cmluZ30gSW5kZXggb2YgaXRlbSBpbnNpZGUgdGhlIGFycmF5IGluc2lkZSBhbiBvYmplY3QuIE9yIC0xIGlmIGl0IHdhc24ndCBmb3VuZC4NCgkJICovDQoJCWluQXJyYXkgOiBmdW5jdGlvbihhLCB2KSB7DQoJCQl2YXIgaSwgbDsNCg0KCQkJaWYgKGEpIHsNCgkJCQlmb3IgKGkgPSAwLCBsID0gYS5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCgkJCQkJaWYgKGFbaV0gPT09IHYpDQoJCQkJCQlyZXR1cm4gaTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiAtMTsNCgkJfSwNCg0KCQkvKioNCgkJICogRXh0ZW5kcyBhbiBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG90aGVyIG9iamVjdChzKS4NCgkJICoNCgkJICogQG1ldGhvZCBleHRlbmQNCgkJICogQHBhcmFtIHtPYmplY3R9IG8gT2JqZWN0IHRvIGV4dGVuZCB3aXRoIG5ldyBpdGVtcy4NCgkJICogQHBhcmFtIHtPYmplY3R9IGUuLm4gT2JqZWN0KHMpIHRvIGV4dGVuZCB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoLg0KCQkgKiBAcmV0dXJuIHtPYmplY3R9IG8gTmV3IGV4dGVuZGVkIG9iamVjdCwgc2FtZSByZWZlcmVuY2UgYXMgdGhlIGlucHV0IG9iamVjdC4NCgkJICovDQoJCWV4dGVuZCA6IGZ1bmN0aW9uKG8sIGUpIHsNCgkJCXZhciBpLCBsLCBhID0gYXJndW1lbnRzOw0KDQoJCQlmb3IgKGkgPSAxLCBsID0gYS5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCgkJCQllID0gYVtpXTsNCg0KCQkJCXRpbnltY2UuZWFjaChlLCBmdW5jdGlvbih2LCBuKSB7DQoJCQkJCWlmICh2ICE9PSB1bmRlZmluZWQpDQoJCQkJCQlvW25dID0gdjsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJcmV0dXJuIG87DQoJCX0sDQoNCgkJLy8gI2VuZGlmDQoNCgkJLyoqDQoJCSAqIFJlbW92ZXMgd2hpdGVzcGFjZSBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZy4NCgkJICoNCgkJICogQG1ldGhvZCB0cmltDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBzIFN0cmluZyB0byByZW1vdmUgd2hpdGVzcGFjZSBmcm9tLg0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IE5ldyBzdHJpbmcgd2l0aCByZW1vdmVkIHdoaXRlc3BhY2UuDQoJCSAqLw0KCQl0cmltIDogZnVuY3Rpb24ocykgew0KCQkJcmV0dXJuIChzID8gJycgKyBzIDogJycpLnJlcGxhY2Uod2hpdGVTcGFjZVJlLCAnJyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENyZWF0ZXMgYSBjbGFzcywgc3ViY2xhc3Mgb3Igc3RhdGljIHNpbmdsZXRvbi4NCgkJICogTW9yZSBkZXRhaWxzIG9uIHRoaXMgbWV0aG9kIGNhbiBiZSBmb3VuZCBpbiB0aGUgV2lraS4NCgkJICoNCgkJICogQG1ldGhvZCBjcmVhdGUNCgkJICogQHBhcmFtIHtTdHJpbmd9IHMgQ2xhc3MgbmFtZSwgaW5oZXJpdGFnZSBhbmQgcHJlZml4Lg0KCQkgKiBAcGFyYW0ge09iamVjdH0gbyBDb2xsZWN0aW9uIG9mIG1ldGhvZHMgdG8gYWRkIHRvIHRoZSBjbGFzcy4NCgkJICovDQoJCWNyZWF0ZSA6IGZ1bmN0aW9uKHMsIHApIHsNCgkJCXZhciB0ID0gdGhpcywgc3AsIG5zLCBjbiwgc2NuLCBjLCBkZSA9IDA7DQoNCgkJCS8vIFBhcnNlIDogPHByZWZpeD4gPGNsYXNzPjo8c3VwZXIgY2xhc3M+DQoJCQlzID0gL14oKHN0YXRpYykgKT8oW1x3Ll0rKSg6KFtcdy5dKykpPy8uZXhlYyhzKTsNCgkJCWNuID0gc1szXS5tYXRjaCgvKF58XC4pKFx3KykkL2kpWzJdOyAvLyBDbGFzcyBuYW1lDQoNCgkJCS8vIENyZWF0ZSBuYW1lc3BhY2UgZm9yIG5ldyBjbGFzcw0KCQkJbnMgPSB0LmNyZWF0ZU5TKHNbM10ucmVwbGFjZSgvXC5cdyskLywgJycpKTsNCg0KCQkJLy8gQ2xhc3MgYWxyZWFkeSBleGlzdHMNCgkJCWlmIChuc1tjbl0pDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBNYWtlIHB1cmUgc3RhdGljIGNsYXNzDQoJCQlpZiAoc1syXSA9PSAnc3RhdGljJykgew0KCQkJCW5zW2NuXSA9IHA7DQoNCgkJCQlpZiAodGhpcy5vbkNyZWF0ZSkNCgkJCQkJdGhpcy5vbkNyZWF0ZShzWzJdLCBzWzNdLCBuc1tjbl0pOw0KDQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQkvLyBDcmVhdGUgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KCQkJaWYgKCFwW2NuXSkgew0KCQkJCXBbY25dID0gZnVuY3Rpb24oKSB7fTsNCgkJCQlkZSA9IDE7DQoJCQl9DQoNCgkJCS8vIEFkZCBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kcw0KCQkJbnNbY25dID0gcFtjbl07DQoJCQl0LmV4dGVuZChuc1tjbl0ucHJvdG90eXBlLCBwKTsNCg0KCQkJLy8gRXh0ZW5kDQoJCQlpZiAoc1s1XSkgew0KCQkJCXNwID0gdC5yZXNvbHZlKHNbNV0pLnByb3RvdHlwZTsNCgkJCQlzY24gPSBzWzVdLm1hdGNoKC9cLihcdyspJC9pKVsxXTsgLy8gQ2xhc3MgbmFtZQ0KDQoJCQkJLy8gRXh0ZW5kIGNvbnN0cnVjdG9yDQoJCQkJYyA9IG5zW2NuXTsNCgkJCQlpZiAoZGUpIHsNCgkJCQkJLy8gQWRkIHBhc3N0aHJvdWdoIGNvbnN0cnVjdG9yDQoJCQkJCW5zW2NuXSA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJcmV0dXJuIHNwW3Njbl0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCgkJCQkJfTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBBZGQgaW5oZXJpdCBjb25zdHJ1Y3Rvcg0KCQkJCQluc1tjbl0gPSBmdW5jdGlvbigpIHsNCgkJCQkJCXRoaXMucGFyZW50ID0gc3Bbc2NuXTsNCgkJCQkJCXJldHVybiBjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQoJCQkJCX07DQoJCQkJfQ0KCQkJCW5zW2NuXS5wcm90b3R5cGVbY25dID0gbnNbY25dOw0KDQoJCQkJLy8gQWRkIHN1cGVyIG1ldGhvZHMNCgkJCQl0LmVhY2goc3AsIGZ1bmN0aW9uKGYsIG4pIHsNCgkJCQkJbnNbY25dLnByb3RvdHlwZVtuXSA9IHNwW25dOw0KCQkJCX0pOw0KDQoJCQkJLy8gQWRkIG92ZXJyaWRkZW4gbWV0aG9kcw0KCQkJCXQuZWFjaChwLCBmdW5jdGlvbihmLCBuKSB7DQoJCQkJCS8vIEV4dGVuZCBtZXRob2RzIGlmIG5lZWRlZA0KCQkJCQlpZiAoc3Bbbl0pIHsNCgkJCQkJCW5zW2NuXS5wcm90b3R5cGVbbl0gPSBmdW5jdGlvbigpIHsNCgkJCQkJCQl0aGlzLnBhcmVudCA9IHNwW25dOw0KCQkJCQkJCXJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQoJCQkJCQl9Ow0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJaWYgKG4gIT0gY24pDQoJCQkJCQkJbnNbY25dLnByb3RvdHlwZVtuXSA9IGY7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gQWRkIHN0YXRpYyBtZXRob2RzDQoJCQl0LmVhY2gocFsnc3RhdGljJ10sIGZ1bmN0aW9uKGYsIG4pIHsNCgkJCQluc1tjbl1bbl0gPSBmOw0KCQkJfSk7DQoNCgkJCWlmICh0aGlzLm9uQ3JlYXRlKQ0KCQkJCXRoaXMub25DcmVhdGUoc1syXSwgc1szXSwgbnNbY25dLnByb3RvdHlwZSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEV4ZWN1dGVkIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbSBpbiBhIG9iamVjdCB0cmVlLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHdhbGsNCgkJICogQHBhcmFtIHtPYmplY3R9IG8gT2JqZWN0IHRyZWUgdG8gd2FsayB0aG91Z2guDQoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGYgRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpdGVtLg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBPcHRpb25hbCBuYW1lIG9mIGNvbGxlY3Rpb24gaW5zaWRlIHRoZSBvYmplY3RzIHRvIHdhbGsgZm9yIGV4YW1wbGUgY2hpbGROb2Rlcy4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHMgT3B0aW9uYWwgc2NvcGUgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW4uDQoJCSAqLw0KCQl3YWxrIDogZnVuY3Rpb24obywgZiwgbiwgcykgew0KCQkJcyA9IHMgfHwgdGhpczsNCg0KCQkJaWYgKG8pIHsNCgkJCQlpZiAobikNCgkJCQkJbyA9IG9bbl07DQoNCgkJCQl0aW55bWNlLmVhY2gobywgZnVuY3Rpb24obywgaSkgew0KCQkJCQlpZiAoZi5jYWxsKHMsIG8sIGksIG4pID09PSBmYWxzZSkNCgkJCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJCQl0aW55bWNlLndhbGsobywgZiwgbiwgcyk7DQoJCQkJfSk7DQoJCQl9DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENyZWF0ZXMgYSBuYW1lc3BhY2Ugb24gYSBzcGVjaWZpYyBvYmplY3QuDQoJCSAqDQoJCSAqIEBtZXRob2QgY3JlYXRlTlMNCgkJICogQHBhcmFtIHtTdHJpbmd9IG4gTmFtZXNwYWNlIHRvIGNyZWF0ZSBmb3IgZXhhbXBsZSBhLmIuYy5kLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gbyBPcHRpb25hbCBvYmplY3QgdG8gYWRkIG5hbWVzcGFjZSB0bywgZGVmYXVsdHMgdG8gd2luZG93Lg0KCQkgKiBAcmV0dXJuIHtPYmplY3R9IE5ldyBuYW1lc3BhY2Ugb2JqZWN0IHRoZSBsYXN0IGl0ZW0gaW4gcGF0aC4NCgkJICovDQoJCWNyZWF0ZU5TIDogZnVuY3Rpb24obiwgbykgew0KCQkJdmFyIGksIHY7DQoNCgkJCW8gPSBvIHx8IHdpbjsNCg0KCQkJbiA9IG4uc3BsaXQoJy4nKTsNCgkJCWZvciAoaT0wOyBpPG4ubGVuZ3RoOyBpKyspIHsNCgkJCQl2ID0gbltpXTsNCg0KCQkJCWlmICghb1t2XSkNCgkJCQkJb1t2XSA9IHt9Ow0KDQoJCQkJbyA9IG9bdl07DQoJCQl9DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXNvbHZlcyBhIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgb2JqZWN0IGZyb20gYSBzcGVjaWZpYyBzdHJ1Y3R1cmUuDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVzb2x2ZQ0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBQYXRoIHRvIHJlc29sdmUgZm9yIGV4YW1wbGUgYS5iLmMuZC4NCgkJICogQHBhcmFtIHtPYmplY3R9IG8gT3B0aW9uYWwgb2JqZWN0IHRvIHNlYXJjaCB0aG91Z2gsIGRlZmF1bHRzIHRvIHdpbmRvdy4NCgkJICogQHJldHVybiB7T2JqZWN0fSBMYXN0IG9iamVjdCBpbiBwYXRoIG9yIG51bGwgaWYgaXQgY291bGRuJ3QgYmUgcmVzb2x2ZWQuDQoJCSAqLw0KCQlyZXNvbHZlIDogZnVuY3Rpb24obiwgbykgew0KCQkJdmFyIGksIGw7DQoNCgkJCW8gPSBvIHx8IHdpbjsNCg0KCQkJbiA9IG4uc3BsaXQoJy4nKTsNCgkJCWZvciAoaSA9IDAsIGwgPSBuLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KCQkJCW8gPSBvW25baV1dOw0KDQoJCQkJaWYgKCFvKQ0KCQkJCQlicmVhazsNCgkJCX0NCg0KCQkJcmV0dXJuIG87DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEFkZHMgYW4gdW5sb2FkIGhhbmRsZXIgdG8gdGhlIGRvY3VtZW50LiBUaGlzIGhhbmRsZXIgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBkb2N1bWVudCBnZXRzIHVubG9hZGVkLg0KCQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGRlYWxpbmcgd2l0aCBicm93c2VyIG1lbW9yeSBsZWFrcyB3aGVyZSBpdCBtaWdodCBiZSB2aXRhbCB0byByZW1vdmUgRE9NIHJlZmVyZW5jZXMgZXRjLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGFkZFVubG9hZA0KCQkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmIEZ1bmN0aW9uIHRvIGV4ZWN1dGUgYmVmb3JlIHRoZSBkb2N1bWVudCBnZXRzIHVubG9hZGVkLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBzY29wZSB0byBleGVjdXRlIHRoZSBmdW5jdGlvbiBpbi4NCgkJICogQHJldHVybiB7ZnVuY3Rpb259IFJldHVybnMgdGhlIHNwZWNpZmllZCB1bmxvYWQgaGFuZGxlciBmdW5jdGlvbi4NCgkJICovDQoJCWFkZFVubG9hZCA6IGZ1bmN0aW9uKGYsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJZiA9IHtmdW5jIDogZiwgc2NvcGUgOiBzIHx8IHRoaXN9Ow0KDQoJCQlpZiAoIXQudW5sb2Fkcykgew0KCQkJCWZ1bmN0aW9uIHVubG9hZCgpIHsNCgkJCQkJdmFyIGxpID0gdC51bmxvYWRzLCBvLCBuOw0KDQoJCQkJCWlmIChsaSkgew0KCQkJCQkJLy8gQ2FsbCB1bmxvYWQgaGFuZGxlcnMNCgkJCQkJCWZvciAobiBpbiBsaSkgew0KCQkJCQkJCW8gPSBsaVtuXTsNCg0KCQkJCQkJCWlmIChvICYmIG8uZnVuYykNCgkJCQkJCQkJby5mdW5jLmNhbGwoby5zY29wZSwgMSk7IC8vIFNlbmQgaW4gb25lIGFyZyB0byBkaXN0aW5jdCB1bmxvYWQgYW5kIHVzZXIgZGVzdHJveQ0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBEZXRhY2ggdW5sb2FkIGZ1bmN0aW9uDQoJCQkJCQlpZiAod2luLmRldGFjaEV2ZW50KSB7DQoJCQkJCQkJd2luLmRldGFjaEV2ZW50KCdvbmJlZm9yZXVubG9hZCcsIGZha2VVbmxvYWQpOw0KCQkJCQkJCXdpbi5kZXRhY2hFdmVudCgnb251bmxvYWQnLCB1bmxvYWQpOw0KCQkJCQkJfSBlbHNlIGlmICh3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcikNCgkJCQkJCQl3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndW5sb2FkJywgdW5sb2FkLCBmYWxzZSk7DQoNCgkJCQkJCS8vIERlc3Ryb3kgcmVmZXJlbmNlcw0KCQkJCQkJdC51bmxvYWRzID0gbyA9IGxpID0gdyA9IHVubG9hZCA9IDA7DQoNCgkJCQkJCS8vIFJ1biBnYXJiYXJnZSBjb2xsZWN0b3Igb24gSUUNCgkJCQkJCWlmICh3aW4uQ29sbGVjdEdhcmJhZ2UpDQoJCQkJCQkJQ29sbGVjdEdhcmJhZ2UoKTsNCgkJCQkJfQ0KCQkJCX07DQoNCgkJCQlmdW5jdGlvbiBmYWtlVW5sb2FkKCkgew0KCQkJCQl2YXIgZCA9IGRvY3VtZW50Ow0KDQoJCQkJCS8vIElzIHRoZXJlIHRoaW5ncyBzdGlsbCBsb2FkaW5nLCB0aGVuIGRvIHNvbWUgbWFnaWMNCgkJCQkJaWYgKGQucmVhZHlTdGF0ZSA9PSAnaW50ZXJhY3RpdmUnKSB7DQoJCQkJCQlmdW5jdGlvbiBzdG9wKCkgew0KCQkJCQkJCS8vIFByZXZlbnQgbWVtb3J5IGxlYWsNCgkJCQkJCQlkLmRldGFjaEV2ZW50KCdvbnN0b3AnLCBzdG9wKTsNCg0KCQkJCQkJCS8vIENhbGwgdW5sb2FkIGhhbmRsZXINCgkJCQkJCQlpZiAodW5sb2FkKQ0KCQkJCQkJCQl1bmxvYWQoKTsNCg0KCQkJCQkJCWQgPSAwOw0KCQkJCQkJfTsNCg0KCQkJCQkJLy8gRmlyZSB1bmxvYWQgd2hlbiB0aGUgY3VycmVudGx5IGxvYWRpbmcgcGFnZSBpcyBzdG9wcGVkDQoJCQkJCQlpZiAoZCkNCgkJCQkJCQlkLmF0dGFjaEV2ZW50KCdvbnN0b3AnLCBzdG9wKTsNCg0KCQkJCQkJLy8gUmVtb3ZlIG9uc3RvcCBsaXN0ZW5lciBhZnRlciBhIHdoaWxlIHRvIHByZXZlbnQgdGhlIHVubG9hZCBmdW5jdGlvbg0KCQkJCQkJLy8gdG8gZXhlY3V0ZSBpZiB0aGUgdXNlciBwcmVzc2VzIGNhbmNlbCBpbiBhbiBvbmJlZm9yZXVubG9hZA0KCQkJCQkJLy8gY29uZmlybSBkaWFsb2cgYW5kIHRoZW4gcHJlc3NlcyB0aGUgYnJvd3NlciBzdG9wIGJ1dHRvbg0KCQkJCQkJd2luLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoJCQkJCQkJaWYgKGQpDQoJCQkJCQkJCWQuZGV0YWNoRXZlbnQoJ29uc3RvcCcsIHN0b3ApOw0KCQkJCQkJfSwgMCk7DQoJCQkJCX0NCgkJCQl9Ow0KDQoJCQkJLy8gQXR0YWNoIHVubG9hZCBoYW5kbGVyDQoJCQkJaWYgKHdpbi5hdHRhY2hFdmVudCkgew0KCQkJCQl3aW4uYXR0YWNoRXZlbnQoJ29udW5sb2FkJywgdW5sb2FkKTsNCgkJCQkJd2luLmF0dGFjaEV2ZW50KCdvbmJlZm9yZXVubG9hZCcsIGZha2VVbmxvYWQpOw0KCQkJCX0gZWxzZSBpZiAod2luLmFkZEV2ZW50TGlzdGVuZXIpDQoJCQkJCXdpbi5hZGRFdmVudExpc3RlbmVyKCd1bmxvYWQnLCB1bmxvYWQsIGZhbHNlKTsNCg0KCQkJCS8vIFNldHVwIGluaXRpYWwgdW5sb2FkIGhhbmRsZXIgYXJyYXkNCgkJCQl0LnVubG9hZHMgPSBbZl07DQoJCQl9IGVsc2UNCgkJCQl0LnVubG9hZHMucHVzaChmKTsNCg0KCQkJcmV0dXJuIGY7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBmb3JtIHRoZSB1bmxvYWQgaGFuZGxlciBsaXN0Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIHJlbW92ZVVubG9hZA0KCQkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmIEZ1bmN0aW9uIHRvIHJlbW92ZSBmcm9tIHVubG9hZCBoYW5kbGVyIGxpc3QuDQoJCSAqIEByZXR1cm4ge2Z1bmN0aW9ufSBSZW1vdmVkIGZ1bmN0aW9uIG5hbWUgb3IgbnVsbCBpZiBpdCB3YXNuJ3QgZm91bmQuDQoJCSAqLw0KCQlyZW1vdmVVbmxvYWQgOiBmdW5jdGlvbihmKSB7DQoJCQl2YXIgdSA9IHRoaXMudW5sb2FkcywgciA9IG51bGw7DQoNCgkJCXRpbnltY2UuZWFjaCh1LCBmdW5jdGlvbihvLCBpKSB7DQoJCQkJaWYgKG8gJiYgby5mdW5jID09IGYpIHsNCgkJCQkJdS5zcGxpY2UoaSwgMSk7DQoJCQkJCXIgPSBmOw0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXJldHVybiByOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTcGxpdHMgYSBzdHJpbmcgYnV0IHJlbW92ZXMgdGhlIHdoaXRlc3BhY2UgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHZhbHVlLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGV4cGxvZGUNCgkJICogQHBhcmFtIHtzdHJpbmd9IHMgU3RyaW5nIHRvIHNwbGl0Lg0KCQkgKiBAcGFyYW0ge3N0cmluZ30gZCBEZWxpbWl0ZXIgdG8gc3BsaXQgYnkuDQoJCSAqLw0KCQlleHBsb2RlIDogZnVuY3Rpb24ocywgZCkgew0KCQkJcmV0dXJuIHMgPyB0aW55bWNlLm1hcChzLnNwbGl0KGQgfHwgJywnKSwgdGlueW1jZS50cmltKSA6IHM7DQoJCX0sDQoNCgkJX2FkZFZlciA6IGZ1bmN0aW9uKHUpIHsNCgkJCXZhciB2Ow0KDQoJCQlpZiAoIXRoaXMucXVlcnkpDQoJCQkJcmV0dXJuIHU7DQoNCgkJCXYgPSAodS5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJicpICsgdGhpcy5xdWVyeTsNCg0KCQkJaWYgKHUuaW5kZXhPZignIycpID09IC0xKQ0KCQkJCXJldHVybiB1ICsgdjsNCg0KCQkJcmV0dXJuIHUucmVwbGFjZSgnIycsIHYgKyAnIycpOw0KCQl9LA0KDQoJCS8vIEZpeCBmdW5jdGlvbiBmb3IgSUUgOSB3aGVyZSByZWdleHBzIGlzbid0IHdvcmtpbmcgY29ycmVjdGx5DQoJCS8vIFRvZG86IHJlbW92ZSBtZSBvbmNlIE1TIGZpeGVzIHRoZSBidWcNCgkJX3JlcGxhY2UgOiBmdW5jdGlvbihmaW5kLCByZXBsYWNlLCBzdHIpIHsNCgkJCS8vIE9uIElFOSB3ZSBoYXZlIHRvIGZha2UgJHggcmVwbGFjZW1lbnQNCgkJCWlmIChpc1JlZ0V4cEJyb2tlbikgew0KCQkJCXJldHVybiBzdHIucmVwbGFjZShmaW5kLCBmdW5jdGlvbigpIHsNCgkJCQkJdmFyIHZhbCA9IHJlcGxhY2UsIGFyZ3MgPSBhcmd1bWVudHMsIGk7DQoNCgkJCQkJZm9yIChpID0gMDsgaSA8IGFyZ3MubGVuZ3RoIC0gMjsgaSsrKSB7DQoJCQkJCQlpZiAoYXJnc1tpXSA9PT0gdW5kZWZpbmVkKSB7DQoJCQkJCQkJdmFsID0gdmFsLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFwkJyArIGksICdnJyksICcnKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJdmFsID0gdmFsLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFwkJyArIGksICdnJyksIGFyZ3NbaV0pOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJcmV0dXJuIHZhbDsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJcmV0dXJuIHN0ci5yZXBsYWNlKGZpbmQsIHJlcGxhY2UpOw0KCQl9DQoNCgkJLyoqI0AtKi8NCgl9Ow0KDQoJLy8gSW5pdGlhbGl6ZSB0aGUgQVBJDQoJdGlueW1jZS5faW5pdCgpOw0KDQoJLy8gRXhwb3NlIHRpbnltY2UgbmFtZXNwYWNlIHRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlICh3aW5kb3cpDQoJd2luLnRpbnltY2UgPSB3aW4udGlueU1DRSA9IHRpbnltY2U7DQp9KSh3aW5kb3cpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/Button.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBCdXR0b24uanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBET00gPSB0aW55bWNlLkRPTTsNCg0KCS8qKg0KCSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgYSBVSSBidXR0b24uIEEgYnV0dG9uIGlzIGJhc2ljYWxseSBhIGxpbmsNCgkgKiB0aGF0IGlzIHN0eWxlZCB0byBsb29rIGxpa2UgYSBidXR0b24gb3IgaWNvbi4NCgkgKg0KCSAqIEBjbGFzcyB0aW55bWNlLnVpLkJ1dHRvbg0KCSAqIEBleHRlbmRzIHRpbnltY2UudWkuQ29udHJvbA0KCSAqLw0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLkJ1dHRvbjp0aW55bWNlLnVpLkNvbnRyb2wnLCB7DQoJCS8qKg0KCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1dHRvbiBjb250cm9sIGluc3RhbmNlLg0KCQkgKg0KCQkgKiBAY29uc3RydWN0b3INCgkJICogQG1ldGhvZCBCdXR0b24NCgkJICogQHBhcmFtIHtTdHJpbmd9IGlkIENvbnRyb2wgaWQgZm9yIHRoZSBidXR0b24uDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIG5hbWUvdmFsdWUgc2V0dGluZ3Mgb2JqZWN0Lg0KCQkgKi8NCgkJQnV0dG9uIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXRoaXMucGFyZW50KGlkLCBzKTsNCgkJCXRoaXMuY2xhc3NQcmVmaXggPSAnbWNlQnV0dG9uJzsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVuZGVycyB0aGUgYnV0dG9uIGFzIGEgSFRNTCBzdHJpbmcuIFRoaXMgbWV0aG9kIGlzIG11Y2ggZmFzdGVyIHRoYW4gdXNpbmcgdGhlIERPTSBhbmQgd2hlbg0KCQkgKiBjcmVhdGluZyBhIHdob2xlIHRvb2xiYXIgd2l0aCBidXR0b25zIGl0IGRvZXMgbWFrZSBhIGxvdCBvZiBkaWZmZXJlbmNlLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHJlbmRlckhUTUwNCgkJICogQHJldHVybiB7U3RyaW5nfSBIVE1MIGZvciB0aGUgYnV0dG9uIGNvbnRyb2wgZWxlbWVudC4NCgkJICovDQoJCXJlbmRlckhUTUwgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBjcCA9IHRoaXMuY2xhc3NQcmVmaXgsIHMgPSB0aGlzLnNldHRpbmdzLCBoLCBsOw0KDQoJCQlsID0gRE9NLmVuY29kZShzLmxhYmVsIHx8ICcnKTsNCgkJCWggPSAnPGEgaWQ9IicgKyB0aGlzLmlkICsgJyIgaHJlZj0iamF2YXNjcmlwdDo7IiBjbGFzcz0iJyArIGNwICsgJyAnICsgY3AgKyAnRW5hYmxlZCAnICsgc1snY2xhc3MnXSArIChsID8gJyAnICsgY3AgKyAnTGFiZWxlZCcgOiAnJykgKyciIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7IiBvbmNsaWNrPSJyZXR1cm4gZmFsc2U7IiB0aXRsZT0iJyArIERPTS5lbmNvZGUocy50aXRsZSkgKyAnIj4nOw0KDQoJCQlpZiAocy5pbWFnZSkNCgkJCQloICs9ICc8aW1nIGNsYXNzPSJtY2VJY29uIiBzcmM9IicgKyBzLmltYWdlICsgJyIgLz4nICsgbCArICc8L2E+JzsNCgkJCWVsc2UNCgkJCQloICs9ICc8c3BhbiBjbGFzcz0ibWNlSWNvbiAnICsgc1snY2xhc3MnXSArICciPjwvc3Bhbj4nICsgKGwgPyAnPHNwYW4gY2xhc3M9IicgKyBjcCArICdMYWJlbCI+JyArIGwgKyAnPC9zcGFuPicgOiAnJykgKyAnPC9hPic7DQoNCgkJCXJldHVybiBoOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBQb3N0IHJlbmRlciBoYW5kbGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBVSSBoYXMgYmVlbg0KCQkgKiByZW5kZXJlZCBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQuDQoJCSAqDQoJCSAqIEBtZXRob2QgcG9zdFJlbmRlcg0KCQkgKi8NCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJdGlueW1jZS5kb20uRXZlbnQuYWRkKHQuaWQsICdjbGljaycsIGZ1bmN0aW9uKGUpIHsNCgkJCQlpZiAoIXQuaXNEaXNhYmxlZCgpKQ0KCQkJCQlyZXR1cm4gcy5vbmNsaWNrLmNhbGwocy5zY29wZSwgZSk7DQoJCQl9KTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/ColorSplitButton.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBDb2xvclNwbGl0QnV0dG9uLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIGlzID0gdGlueW1jZS5pcywgZWFjaCA9IHRpbnltY2UuZWFjaDsNCg0KCS8qKg0KCSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgVUkgY29sb3Igc3BsaXQgYnV0dG9uLiBBIGNvbG9yIHNwbGl0IGJ1dHRvbiB3aWxsIHByZXNlbnQgc2hvdyBhIHNtYWxsIGNvbG9yIHBpY2tlcg0KCSAqIHdoZW4geW91IHByZXNzIHRoZSBvcGVuIG1lbnUuDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS51aS5Db2xvclNwbGl0QnV0dG9uDQoJICogQGV4dGVuZHMgdGlueW1jZS51aS5TcGxpdEJ1dHRvbg0KCSAqLw0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLkNvbG9yU3BsaXRCdXR0b246dGlueW1jZS51aS5TcGxpdEJ1dHRvbicsIHsNCgkJLyoqDQoJCSAqIENvbnN0cnVjdHMgYSBuZXcgY29sb3Igc3BsaXQgYnV0dG9uIGNvbnRyb2wgaW5zdGFuY2UuDQoJCSAqDQoJCSAqIEBjb25zdHJ1Y3Rvcg0KCQkgKiBAbWV0aG9kIENvbG9yU3BsaXRCdXR0b24NCgkJICogQHBhcmFtIHtTdHJpbmd9IGlkIENvbnRyb2wgaWQgZm9yIHRoZSBjb2xvciBzcGxpdCBidXR0b24uDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIG5hbWUvdmFsdWUgc2V0dGluZ3Mgb2JqZWN0Lg0KCQkgKi8NCgkJQ29sb3JTcGxpdEJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQucGFyZW50KGlkLCBzKTsNCg0KCQkJLyoqDQoJCQkgKiBTZXR0aW5ncyBvYmplY3QuDQoJCQkgKg0KCQkJICogQHByb3BlcnR5IHNldHRpbmdzDQoJCQkgKiBAdHlwZSBPYmplY3QNCgkJCSAqLw0KCQkJdC5zZXR0aW5ncyA9IHMgPSB0aW55bWNlLmV4dGVuZCh7DQoJCQkJY29sb3JzIDogJzAwMDAwMCw5OTMzMDAsMzMzMzAwLDAwMzMwMCwwMDMzNjYsMDAwMDgwLDMzMzM5OSwzMzMzMzMsODAwMDAwLEZGNjYwMCw4MDgwMDAsMDA4MDAwLDAwODA4MCwwMDAwRkYsNjY2Njk5LDgwODA4MCxGRjAwMDAsRkY5OTAwLDk5Q0MwMCwzMzk5NjYsMzNDQ0NDLDMzNjZGRiw4MDAwODAsOTk5OTk5LEZGMDBGRixGRkNDMDAsRkZGRjAwLDAwRkYwMCwwMEZGRkYsMDBDQ0ZGLDk5MzM2NixDMEMwQzAsRkY5OUNDLEZGQ0M5OSxGRkZGOTksQ0NGRkNDLENDRkZGRiw5OUNDRkYsQ0M5OUZGLEZGRkZGRicsDQoJCQkJZ3JpZF93aWR0aCA6IDgsDQoJCQkJZGVmYXVsdF9jb2xvciA6ICcjODg4ODg4Jw0KCQkJfSwgdC5zZXR0aW5ncyk7DQoNCgkJCS8qKg0KCQkJICogRmlyZXMgd2hlbiB0aGUgbWVudSBpcyBzaG93bi4NCgkJCSAqDQoJCQkgKiBAZXZlbnQgb25TaG93TWVudQ0KCQkJICovDQoJCQl0Lm9uU2hvd01lbnUgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodCk7DQoNCgkJCS8qKg0KCQkJICogRmlyZXMgd2hlbiB0aGUgbWVudSBpcyBoaWRkZW4uDQoJCQkgKg0KCQkJICogQGV2ZW50IG9uSGlkZU1lbnUNCgkJCSAqLw0KCQkJdC5vbkhpZGVNZW51ID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHQpOw0KDQoJCQkvKioNCgkJCSAqIEN1cnJlbnQgY29sb3IgdmFsdWUuDQoJCQkgKg0KCQkJICogQHByb3BlcnR5IHZhbHVlDQoJCQkgKiBAdHlwZSBTdHJpbmcNCgkJCSAqLw0KCQkJdC52YWx1ZSA9IHMuZGVmYXVsdF9jb2xvcjsNCgkJfSwNCg0KCQkvKioNCgkJICogU2hvd3MgdGhlIGNvbG9yIG1lbnUuIFRoZSBjb2xvciBtZW51IGlzIGEgbGF5ZXIgcGxhY2VzIHVuZGVyIHRoZSBidXR0b24NCgkJICogYW5kIGRpc3BsYXlzIGEgdGFibGUgb2YgY29sb3JzIGZvciB0aGUgdXNlciB0byBwaWNrIGZyb20uDQoJCSAqDQoJCSAqIEBtZXRob2Qgc2hvd01lbnUNCgkJICovDQoJCXNob3dNZW51IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHIsIHAsIGUsIHAyOw0KDQoJCQlpZiAodC5pc0Rpc2FibGVkKCkpDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiAoIXQuaXNNZW51UmVuZGVyZWQpIHsNCgkJCQl0LnJlbmRlck1lbnUoKTsNCgkJCQl0LmlzTWVudVJlbmRlcmVkID0gdHJ1ZTsNCgkJCX0NCg0KCQkJaWYgKHQuaXNNZW51VmlzaWJsZSkNCgkJCQlyZXR1cm4gdC5oaWRlTWVudSgpOw0KDQoJCQllID0gRE9NLmdldCh0LmlkKTsNCgkJCURPTS5zaG93KHQuaWQgKyAnX21lbnUnKTsNCgkJCURPTS5hZGRDbGFzcyhlLCAnbWNlU3BsaXRCdXR0b25TZWxlY3RlZCcpOw0KCQkJcDIgPSBET00uZ2V0UG9zKGUpOw0KCQkJRE9NLnNldFN0eWxlcyh0LmlkICsgJ19tZW51Jywgew0KCQkJCWxlZnQgOiBwMi54LA0KCQkJCXRvcCA6IHAyLnkgKyBlLmNsaWVudEhlaWdodCwNCgkJCQl6SW5kZXggOiAyMDAwMDANCgkJCX0pOw0KCQkJZSA9IDA7DQoNCgkJCUV2ZW50LmFkZChET00uZG9jLCAnbW91c2Vkb3duJywgdC5oaWRlTWVudSwgdCk7DQoJCQl0Lm9uU2hvd01lbnUuZGlzcGF0Y2godCk7DQoNCgkJCWlmICh0Ll9mb2N1c2VkKSB7DQoJCQkJdC5fa2V5SGFuZGxlciA9IEV2ZW50LmFkZCh0LmlkICsgJ19tZW51JywgJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7DQoJCQkJCWlmIChlLmtleUNvZGUgPT0gMjcpDQoJCQkJCQl0LmhpZGVNZW51KCk7DQoJCQkJfSk7DQoNCgkJCQlET00uc2VsZWN0KCdhJywgdC5pZCArICdfbWVudScpWzBdLmZvY3VzKCk7IC8vIFNlbGVjdCBmaXJzdCBsaW5rDQoJCQl9DQoNCgkJCXQuaXNNZW51VmlzaWJsZSA9IDE7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEhpZGVzIHRoZSBjb2xvciBtZW51LiBUaGUgb3B0aW9uYWwgZXZlbnQgcGFyYW1ldGVyIGlzIHVzZWQgdG8gY2hlY2sgd2hlcmUgdGhlIGV2ZW50IG9jY3VyZWQgc28gaXQNCgkJICogZG9lc24ndCBjbG9zZSB0aGVtIG1lbnUgaWYgaXQgd2FzIGEgZXZlbnQgaW5zaWRlIHRoZSBtZW51Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGhpZGVNZW51DQoJCSAqIEBwYXJhbSB7RXZlbnR9IGUgT3B0aW9uYWwgZXZlbnQgb2JqZWN0Lg0KCQkgKi8NCgkJaGlkZU1lbnUgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCS8vIFByZXZlbnQgZG91YmxlIHRvb2dsZXMgYnkgY2FuY2VsaW5nIHRoZSBtb3VzZSBjbGljayBldmVudCB0byB0aGUgYnV0dG9uDQoJCQlpZiAoZSAmJiBlLnR5cGUgPT0gIm1vdXNlZG93biIgJiYgRE9NLmdldFBhcmVudChlLnRhcmdldCwgZnVuY3Rpb24oZSkge3JldHVybiBlLmlkID09PSB0LmlkICsgJ19vcGVuJzt9KSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICghZSB8fCAhRE9NLmdldFBhcmVudChlLnRhcmdldCwgJy5tY2VTcGxpdEJ1dHRvbk1lbnUnKSkgew0KCQkJCURPTS5yZW1vdmVDbGFzcyh0LmlkLCAnbWNlU3BsaXRCdXR0b25TZWxlY3RlZCcpOw0KCQkJCUV2ZW50LnJlbW92ZShET00uZG9jLCAnbW91c2Vkb3duJywgdC5oaWRlTWVudSwgdCk7DQoJCQkJRXZlbnQucmVtb3ZlKHQuaWQgKyAnX21lbnUnLCAna2V5ZG93bicsIHQuX2tleUhhbmRsZXIpOw0KCQkJCURPTS5oaWRlKHQuaWQgKyAnX21lbnUnKTsNCgkJCX0NCg0KCQkJdC5vbkhpZGVNZW51LmRpc3BhdGNoKHQpOw0KDQoJCQl0LmlzTWVudVZpc2libGUgPSAwOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZW5kZXJzIHRoZSBtZW51IHRvIHRoZSBET00uDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVuZGVyTWVudQ0KCQkgKi8NCgkJcmVuZGVyTWVudSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBtLCBpID0gMCwgcyA9IHQuc2V0dGluZ3MsIG4sIHRiLCB0ciwgdzsNCg0KCQkJdyA9IERPTS5hZGQocy5tZW51X2NvbnRhaW5lciwgJ2RpdicsIHtpZCA6IHQuaWQgKyAnX21lbnUnLCAnY2xhc3MnIDogc1snbWVudV9jbGFzcyddICsgJyAnICsgc1snY2xhc3MnXSwgc3R5bGUgOiAncG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDotMTAwMHB4Oyd9KTsNCgkJCW0gPSBET00uYWRkKHcsICdkaXYnLCB7J2NsYXNzJyA6IHNbJ2NsYXNzJ10gKyAnIG1jZVNwbGl0QnV0dG9uTWVudSd9KTsNCgkJCURPTS5hZGQobSwgJ3NwYW4nLCB7J2NsYXNzJyA6ICdtY2VNZW51TGluZSd9KTsNCg0KCQkJbiA9IERPTS5hZGQobSwgJ3RhYmxlJywgeydjbGFzcycgOiAnbWNlQ29sb3JTcGxpdE1lbnUnfSk7DQoJCQl0YiA9IERPTS5hZGQobiwgJ3Rib2R5Jyk7DQoNCgkJCS8vIEdlbmVyYXRlIGNvbG9yIGdyaWQNCgkJCWkgPSAwOw0KCQkJZWFjaChpcyhzLmNvbG9ycywgJ2FycmF5JykgPyBzLmNvbG9ycyA6IHMuY29sb3JzLnNwbGl0KCcsJyksIGZ1bmN0aW9uKGMpIHsNCgkJCQljID0gYy5yZXBsYWNlKC9eIy8sICcnKTsNCg0KCQkJCWlmICghaS0tKSB7DQoJCQkJCXRyID0gRE9NLmFkZCh0YiwgJ3RyJyk7DQoJCQkJCWkgPSBzLmdyaWRfd2lkdGggLSAxOw0KCQkJCX0NCg0KCQkJCW4gPSBET00uYWRkKHRyLCAndGQnKTsNCg0KCQkJCW4gPSBET00uYWRkKG4sICdhJywgew0KCQkJCQlocmVmIDogJ2phdmFzY3JpcHQ6OycsDQoJCQkJCXN0eWxlIDogew0KCQkJCQkJYmFja2dyb3VuZENvbG9yIDogJyMnICsgYw0KCQkJCQl9LA0KCQkJCQlfbWNlX2NvbG9yIDogJyMnICsgYw0KCQkJCX0pOw0KCQkJfSk7DQoNCgkJCWlmIChzLm1vcmVfY29sb3JzX2Z1bmMpIHsNCgkJCQluID0gRE9NLmFkZCh0YiwgJ3RyJyk7DQoJCQkJbiA9IERPTS5hZGQobiwgJ3RkJywge2NvbHNwYW4gOiBzLmdyaWRfd2lkdGgsICdjbGFzcycgOiAnbWNlTW9yZUNvbG9ycyd9KTsNCgkJCQluID0gRE9NLmFkZChuLCAnYScsIHtpZCA6IHQuaWQgKyAnX21vcmUnLCBocmVmIDogJ2phdmFzY3JpcHQ6OycsIG9uY2xpY2sgOiAncmV0dXJuIGZhbHNlOycsICdjbGFzcycgOiAnbWNlTW9yZUNvbG9ycyd9LCBzLm1vcmVfY29sb3JzX3RpdGxlKTsNCg0KCQkJCUV2ZW50LmFkZChuLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7DQoJCQkJCXMubW9yZV9jb2xvcnNfZnVuYy5jYWxsKHMubW9yZV9jb2xvcnNfc2NvcGUgfHwgdGhpcyk7DQoJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7IC8vIENhbmNlbCB0byBmaXggb25iZWZvcmV1bmxvYWQgcHJvYmxlbQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlET00uYWRkQ2xhc3MobSwgJ21jZUNvbG9yU3BsaXRNZW51Jyk7DQoNCgkJCUV2ZW50LmFkZCh0LmlkICsgJ19tZW51JywgJ2NsaWNrJywgZnVuY3Rpb24oZSkgew0KCQkJCXZhciBjOw0KDQoJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJaWYgKGUubm9kZU5hbWUgPT0gJ0EnICYmIChjID0gZS5nZXRBdHRyaWJ1dGUoJ19tY2VfY29sb3InKSkpDQoJCQkJCXQuc2V0Q29sb3IoYyk7DQoNCgkJCQlyZXR1cm4gRXZlbnQuY2FuY2VsKGUpOyAvLyBQcmV2ZW50IElFIGF1dG8gc2F2ZSB3YXJuaW5nDQoJCQl9KTsNCg0KCQkJcmV0dXJuIHc7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFNldHMgdGhlIGN1cnJlbnQgY29sb3IgZm9yIHRoZSBjb250cm9sIGFuZCBoaWRlcyB0aGUgbWVudSBpZiBpdCBzaG91bGQgYmUgdmlzaWJsZS4NCgkJICoNCgkJICogQG1ldGhvZCBzZXRDb2xvcg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gYyBDb2xvciBjb2RlIHZhbHVlIGluIGhleCBmb3IgZXhhbXBsZTogI0ZGMDBGRg0KCQkgKi8NCgkJc2V0Q29sb3IgOiBmdW5jdGlvbihjKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCURPTS5zZXRTdHlsZSh0LmlkICsgJ19wcmV2aWV3JywgJ2JhY2tncm91bmRDb2xvcicsIGMpOw0KDQoJCQl0LnZhbHVlID0gYzsNCgkJCXQuaGlkZU1lbnUoKTsNCgkJCXQuc2V0dGluZ3Mub25zZWxlY3QoYyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFBvc3QgcmVuZGVyIGV2ZW50LiBUaGlzIHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGNvbnRyb2wgaGFzIGJlZW4gcmVuZGVyZWQgYW5kIGNhbiBiZSB1c2VkIHRvDQoJCSAqIHNldCBzdGF0ZXMsIGFkZCBldmVudHMgdG8gdGhlIGNvbnRyb2wgZXRjLiBJdCdzIHJlY29tbWVuZGVkIGZvciBzdWJjbGFzc2VzIG9mIHRoZSBjb250cm9sIHRvIGNhbGwgdGhpcyBtZXRob2QgYnkgdXNpbmcgdGhpcy5wYXJlbnQoKS4NCgkJICoNCgkJICogQG1ldGhvZCBwb3N0UmVuZGVyDQoJCSAqLw0KCQlwb3N0UmVuZGVyIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGlkID0gdC5pZDsNCg0KCQkJdC5wYXJlbnQoKTsNCgkJCURPTS5hZGQoaWQgKyAnX2FjdGlvbicsICdkaXYnLCB7aWQgOiBpZCArICdfcHJldmlldycsICdjbGFzcycgOiAnbWNlQ29sb3JQcmV2aWV3J30pOw0KCQkJRE9NLnNldFN0eWxlKHQuaWQgKyAnX3ByZXZpZXcnLCAnYmFja2dyb3VuZENvbG9yJywgdC52YWx1ZSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIERlc3Ryb3lzIHRoZSBjb250cm9sLiBUaGlzIG1lYW5zIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBET00gYW5kIGFueQ0KCQkgKiBldmVudHMgdGllZCB0byBpdCB3aWxsIGFsc28gYmUgcmVtb3ZlZC4NCgkJICoNCgkJICogQG1ldGhvZCBkZXN0cm95DQoJCSAqLw0KCQlkZXN0cm95IDogZnVuY3Rpb24oKSB7DQoJCQl0aGlzLnBhcmVudCgpOw0KDQoJCQlFdmVudC5jbGVhcih0aGlzLmlkICsgJ19tZW51Jyk7DQoJCQlFdmVudC5jbGVhcih0aGlzLmlkICsgJ19tb3JlJyk7DQoJCQlET00ucmVtb3ZlKHRoaXMuaWQgKyAnX21lbnUnKTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/Container.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBDb250YWluZXIuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQovKioNCiAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBjb250YWluZXIgY29udHJvbHMgbGlrZSB0b29sYmFycy4gVGhpcyBjbGFzcyBzaG91bGQgbm90DQogKiBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkgb3RoZXIgY29udGFpbmVyIGNvbnRyb2xzIHNob3VsZCBpbmhlcml0IGZyb20gdGhpcyBvbmUuDQogKg0KICogQGNsYXNzIHRpbnltY2UudWkuQ29udGFpbmVyDQogKiBAZXh0ZW5kcyB0aW55bWNlLnVpLkNvbnRyb2wNCiAqLw0KdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuQ29udGFpbmVyOnRpbnltY2UudWkuQ29udHJvbCcsIHsNCgkvKioNCgkgKiBCYXNlIGNvbnRydXN0b3IgYSBuZXcgY29udGFpbmVyIGNvbnRyb2wgaW5zdGFuY2UuDQoJICoNCgkgKiBAY29uc3RydWN0b3INCgkgKiBAbWV0aG9kIENvbnRhaW5lcg0KCSAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb250cm9sIGlkIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lci4NCgkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBuYW1lL3ZhbHVlIHNldHRpbmdzIG9iamVjdC4NCgkgKi8NCglDb250YWluZXIgOiBmdW5jdGlvbihpZCwgcykgew0KCQl0aGlzLnBhcmVudChpZCwgcyk7DQoNCgkJLyoqDQoJCSAqIEFycmF5IG9mIGNvbnRyb2xzIGFkZGVkIHRvIHRoZSBjb250YWluZXIuDQoJCSAqDQoJCSAqIEBwcm9wZXJ0eSBjb250cm9scw0KCQkgKiBAdHlwZSBBcnJheQ0KCQkgKi8NCgkJdGhpcy5jb250cm9scyA9IFtdOw0KDQoJCXRoaXMubG9va3VwID0ge307DQoJfSwNCg0KCS8qKg0KCSAqIEFkZHMgYSBjb250cm9sIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGNvbnRyb2xzIGZvciB0aGUgY29udGFpbmVyLg0KCSAqDQoJICogQG1ldGhvZCBhZGQNCgkgKiBAcGFyYW0ge3RpbnltY2UudWkuQ29udHJvbH0gYyBDb250cm9sIGluc3RhbmNlIHRvIGFkZCB0byB0aGUgY29udGFpbmVyLg0KCSAqIEByZXR1cm4ge3RpbnltY2UudWkuQ29udHJvbH0gU2FtZSBjb250cm9sIGluc3RhbmNlIHRoYXQgZ290IHBhc3NlZCBpbi4NCgkgKi8NCglhZGQgOiBmdW5jdGlvbihjKSB7DQoJCXRoaXMubG9va3VwW2MuaWRdID0gYzsNCgkJdGhpcy5jb250cm9scy5wdXNoKGMpOw0KDQoJCXJldHVybiBjOw0KCX0sDQoNCgkvKioNCgkgKiBSZXR1cm5zIGEgY29udHJvbCBieSBpZCBmcm9tIHRoZSBjb250YWluZXJzIGNvbGxlY3Rpb24uDQoJICoNCgkgKiBAbWV0aG9kIGdldA0KCSAqIEBwYXJhbSB7U3RyaW5nfSBuIElkIGZvciB0aGUgY29udHJvbCB0byByZXRyaXZlLg0KCSAqIEByZXR1cm4ge3RpbnltY2UudWkuQ29udHJvbH0gQ29udHJvbCBpbnN0YW5jZSBieSB0aGUgc3BlY2lmaWVkIG5hbWUgb3IgdW5kZWZpbmVkIGlmIGl0IHdhc24ndCBmb3VuZC4NCgkgKi8NCglnZXQgOiBmdW5jdGlvbihuKSB7DQoJCXJldHVybiB0aGlzLmxvb2t1cFtuXTsNCgl9DQp9KTsNCg0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/Control.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBDb250cm9sLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgkvLyBTaG9ydGVuIGNsYXNzIG5hbWVzDQoJdmFyIERPTSA9IHRpbnltY2UuRE9NLCBpcyA9IHRpbnltY2UuaXM7DQoNCgkvKioNCgkgKiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgY29udHJvbHMgbGlrZSBidXR0b25zLCB0b29sYmFycywgY29udGFpbmVycy4gVGhpcyBjbGFzcyBzaG91bGQgbm90DQoJICogYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5IG90aGVyIGNvbnRyb2xzIHNob3VsZCBpbmhlcml0IGZyb20gdGhpcyBvbmUuDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS51aS5Db250cm9sDQoJICovDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuQ29udHJvbCcsIHsNCgkJLyoqDQoJCSAqIENvbnN0cnVjdHMgYSBuZXcgY29udHJvbCBpbnN0YW5jZS4NCgkJICoNCgkJICogQGNvbnN0cnVjdG9yDQoJCSAqIEBtZXRob2QgQ29udHJvbA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29udHJvbCBpZC4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgbmFtZS92YWx1ZSBzZXR0aW5ncyBvYmplY3QuDQoJCSAqLw0KCQlDb250cm9sIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXRoaXMuaWQgPSBpZDsNCgkJCXRoaXMuc2V0dGluZ3MgPSBzID0gcyB8fCB7fTsNCgkJCXRoaXMucmVuZGVyZWQgPSBmYWxzZTsNCgkJCXRoaXMub25SZW5kZXIgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodGhpcyk7DQoJCQl0aGlzLmNsYXNzUHJlZml4ID0gJyc7DQoJCQl0aGlzLnNjb3BlID0gcy5zY29wZSB8fCB0aGlzOw0KCQkJdGhpcy5kaXNhYmxlZCA9IDA7DQoJCQl0aGlzLmFjdGl2ZSA9IDA7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFNldHMgdGhlIGRpc2FibGVkIHN0YXRlIGZvciB0aGUgY29udHJvbC4gVGhpcyB3aWxsIGFkZCBDU1MgY2xhc3NlcyB0byB0aGUNCgkJICogZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBjb250cm9sLiBTbyB0aGF0IGl0IGNhbiBiZSBkaXNhYmxlZCB2aXN1YWxseS4NCgkJICoNCgkJICogQG1ldGhvZCBzZXREaXNhYmxlZA0KCQkgKiBAcGFyYW0ge0Jvb2xlYW59IHMgQm9vbGVhbiBzdGF0ZSBpZiB0aGUgY29udHJvbCBzaG91bGQgYmUgZGlzYWJsZWQgb3Igbm90Lg0KCQkgKi8NCgkJc2V0RGlzYWJsZWQgOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgZTsNCg0KCQkJaWYgKHMgIT0gdGhpcy5kaXNhYmxlZCkgew0KCQkJCWUgPSBET00uZ2V0KHRoaXMuaWQpOw0KDQoJCQkJLy8gQWRkIGFjY2Vzc2liaWxpdHkgdGl0bGUgZm9yIHVuYXZhaWxhYmxlIGFjdGlvbnMNCgkJCQlpZiAoZSAmJiB0aGlzLnNldHRpbmdzLnVuYXZhaWxhYmxlX3ByZWZpeCkgew0KCQkJCQlpZiAocykgew0KCQkJCQkJdGhpcy5wcmV2VGl0bGUgPSBlLnRpdGxlOw0KCQkJCQkJZS50aXRsZSA9IHRoaXMuc2V0dGluZ3MudW5hdmFpbGFibGVfcHJlZml4ICsgIjogIiArIGUudGl0bGU7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJZS50aXRsZSA9IHRoaXMucHJldlRpdGxlOw0KCQkJCX0NCg0KCQkJCXRoaXMuc2V0U3RhdGUoJ0Rpc2FibGVkJywgcyk7DQoJCQkJdGhpcy5zZXRTdGF0ZSgnRW5hYmxlZCcsICFzKTsNCgkJCQl0aGlzLmRpc2FibGVkID0gczsNCgkJCX0NCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0cnVlL2ZhbHNlIGlmIHRoZSBjb250cm9sIGlzIGRpc2FibGVkIG9yIG5vdC4gVGhpcyBpcyBhIG1ldGhvZCBzaW5jZSB5b3UgY2FuIHRoZW4NCgkJICogY2hvb3NlIHRvIGNoZWNrIHNvbWUgY2xhc3Mgb3Igc29tZSBpbnRlcm5hbCBib29sIHN0YXRlIGluIHN1YmNsYXNzZXMuDQoJCSAqDQoJCSAqIEBtZXRob2QgaXNEaXNhYmxlZA0KCQkgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlL2ZhbHNlIGlmIHRoZSBjb250cm9sIGlzIGRpc2FibGVkIG9yIG5vdC4NCgkJICovDQoJCWlzRGlzYWJsZWQgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLmRpc2FibGVkOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIHRoZSBhY3RpdmF0ZWQgc3RhdGUgZm9yIHRoZSBjb250cm9sLiBUaGlzIHdpbGwgYWRkIENTUyBjbGFzc2VzIHRvIHRoZQ0KCQkgKiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGNvbnRyb2wuIFNvIHRoYXQgaXQgY2FuIGJlIGFjdGl2YXRlZCB2aXN1YWxseS4NCgkJICoNCgkJICogQG1ldGhvZCBzZXRBY3RpdmUNCgkJICogQHBhcmFtIHtCb29sZWFufSBzIEJvb2xlYW4gc3RhdGUgaWYgdGhlIGNvbnRyb2wgc2hvdWxkIGJlIGFjdGl2YXRlZCBvciBub3QuDQoJCSAqLw0KCQlzZXRBY3RpdmUgOiBmdW5jdGlvbihzKSB7DQoJCQlpZiAocyAhPSB0aGlzLmFjdGl2ZSkgew0KCQkJCXRoaXMuc2V0U3RhdGUoJ0FjdGl2ZScsIHMpOw0KCQkJCXRoaXMuYWN0aXZlID0gczsNCgkJCX0NCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0cnVlL2ZhbHNlIGlmIHRoZSBjb250cm9sIGlzIGRpc2FibGVkIG9yIG5vdC4gVGhpcyBpcyBhIG1ldGhvZCBzaW5jZSB5b3UgY2FuIHRoZW4NCgkJICogY2hvb3NlIHRvIGNoZWNrIHNvbWUgY2xhc3Mgb3Igc29tZSBpbnRlcm5hbCBib29sIHN0YXRlIGluIHN1YmNsYXNzZXMuDQoJCSAqDQoJCSAqIEBtZXRob2QgaXNBY3RpdmUNCgkJICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZS9mYWxzZSBpZiB0aGUgY29udHJvbCBpcyBkaXNhYmxlZCBvciBub3QuDQoJCSAqLw0KCQlpc0FjdGl2ZSA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuYWN0aXZlOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgY2xhc3Mgc3RhdGUgZm9yIHRoZSBjb250cm9sLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldFN0YXRlDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBjIENsYXNzIG5hbWUgdG8gYWRkL3JlbW92ZSBkZXBlbmRpbmcgb24gc3RhdGUuDQoJCSAqIEBwYXJhbSB7Qm9vbGVhbn0gcyBUcnVlL2ZhbHNlIHN0YXRlIGlmIHRoZSBjbGFzcyBzaG91bGQgYmUgcmVtb3ZlZCBvciBhZGRlZC4NCgkJICovDQoJCXNldFN0YXRlIDogZnVuY3Rpb24oYywgcykgew0KCQkJdmFyIG4gPSBET00uZ2V0KHRoaXMuaWQpOw0KDQoJCQljID0gdGhpcy5jbGFzc1ByZWZpeCArIGM7DQoNCgkJCWlmIChzKQ0KCQkJCURPTS5hZGRDbGFzcyhuLCBjKTsNCgkJCWVsc2UNCgkJCQlET00ucmVtb3ZlQ2xhc3MobiwgYyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdHJ1ZS9mYWxzZSBpZiB0aGUgY29udHJvbCBoYXMgYmVlbiByZW5kZXJlZCBvciBub3QuDQoJCSAqDQoJCSAqIEBtZXRob2QgaXNSZW5kZXJlZA0KCQkgKiBAcmV0dXJuIHtCb29sZWFufSBTdGF0ZSBpZiB0aGUgY29udHJvbCBoYXMgYmVlbiByZW5kZXJlZCBvciBub3QuDQoJCSAqLw0KCQlpc1JlbmRlcmVkIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5yZW5kZXJlZDsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVuZGVycyB0aGUgY29udHJvbCBhcyBhIEhUTUwgc3RyaW5nLiBUaGlzIG1ldGhvZCBpcyBtdWNoIGZhc3RlciB0aGFuIHVzaW5nIHRoZSBET00gYW5kIHdoZW4NCgkJICogY3JlYXRpbmcgYSB3aG9sZSB0b29sYmFyIHdpdGggYnV0dG9ucyBpdCBkb2VzIG1ha2UgYSBsb3Qgb2YgZGlmZmVyZW5jZS4NCgkJICoNCgkJICogQG1ldGhvZCByZW5kZXJIVE1MDQoJCSAqIEByZXR1cm4ge1N0cmluZ30gSFRNTCBmb3IgdGhlIGJ1dHRvbiBjb250cm9sIGVsZW1lbnQuDQoJCSAqLw0KCQlyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJlbmRlcnMgdGhlIGNvbnRyb2wgdG8gdGhlIHNwZWNpZmllZCBjb250YWluZXIgZWxlbWVudC4NCgkJICoNCgkJICogQG1ldGhvZCByZW5kZXJUbw0KCQkgKiBAcGFyYW0ge0VsZW1lbnR9IG4gSFRNTCBET00gZWxlbWVudCB0byBhZGQgY29udHJvbCB0by4NCgkJICovDQoJCXJlbmRlclRvIDogZnVuY3Rpb24obikgew0KCQkJRE9NLnNldEhUTUwobiwgdGhpcy5yZW5kZXJIVE1MKCkpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBQb3N0IHJlbmRlciBldmVudC4gVGhpcyB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBjb250cm9sIGhhcyBiZWVuIHJlbmRlcmVkIGFuZCBjYW4gYmUgdXNlZCB0bw0KCQkgKiBzZXQgc3RhdGVzLCBhZGQgZXZlbnRzIHRvIHRoZSBjb250cm9sIGV0Yy4gSXQncyByZWNvbW1lbmRlZCBmb3Igc3ViY2xhc3NlcyBvZiB0aGUgY29udHJvbCB0byBjYWxsIHRoaXMgbWV0aG9kIGJ5IHVzaW5nIHRoaXMucGFyZW50KCkuDQoJCSAqDQoJCSAqIEBtZXRob2QgcG9zdFJlbmRlcg0KCQkgKi8NCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBiOw0KDQoJCQkvLyBTZXQgcGVuZGluZyBzdGF0ZXMNCgkJCWlmIChpcyh0LmRpc2FibGVkKSkgew0KCQkJCWIgPSB0LmRpc2FibGVkOw0KCQkJCXQuZGlzYWJsZWQgPSAtMTsNCgkJCQl0LnNldERpc2FibGVkKGIpOw0KCQkJfQ0KDQoJCQlpZiAoaXModC5hY3RpdmUpKSB7DQoJCQkJYiA9IHQuYWN0aXZlOw0KCQkJCXQuYWN0aXZlID0gLTE7DQoJCQkJdC5zZXRBY3RpdmUoYik7DQoJCQl9DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJlbW92ZXMgdGhlIGNvbnRyb2wuIFRoaXMgbWVhbnMgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIERPTSBhbmQgYW55DQoJCSAqIGV2ZW50cyB0aWVkIHRvIGl0IHdpbGwgYWxzbyBiZSByZW1vdmVkLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHJlbW92ZQ0KCQkgKi8NCgkJcmVtb3ZlIDogZnVuY3Rpb24oKSB7DQoJCQlET00ucmVtb3ZlKHRoaXMuaWQpOw0KCQkJdGhpcy5kZXN0cm95KCk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIERlc3Ryb3lzIHRoZSBjb250cm9sIHdpbGwgZnJlZSBhbnkgbWVtb3J5IGJ5IHJlbW92aW5nIGV2ZW50IGxpc3RlbmVycyBldGMuDQoJCSAqDQoJCSAqIEBtZXRob2QgZGVzdHJveQ0KCQkgKi8NCgkJZGVzdHJveSA6IGZ1bmN0aW9uKCkgew0KCQkJdGlueW1jZS5kb20uRXZlbnQuY2xlYXIodGhpcy5pZCk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/DropMenu.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBEcm9wTWVudS5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIGlzID0gdGlueW1jZS5pcywgRE9NID0gdGlueW1jZS5ET00sIGVhY2ggPSB0aW55bWNlLmVhY2gsIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIEVsZW1lbnQgPSB0aW55bWNlLmRvbS5FbGVtZW50Ow0KDQoJLyoqDQoJICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNyZWF0ZSBkcm9wIG1lbnVzLCBhIGRyb3AgbWVudSBjYW4gYmUgYQ0KCSAqIGNvbnRleHQgbWVudSwgb3IgYSBtZW51IGZvciBhIGxpc3QgYm94IG9yIGEgbWVudSBiYXIuDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS51aS5Ecm9wTWVudQ0KCSAqIEBleHRlbmRzIHRpbnltY2UudWkuTWVudQ0KCSAqLw0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLkRyb3BNZW51OnRpbnltY2UudWkuTWVudScsIHsNCgkJLyoqDQoJCSAqIENvbnN0cnVjdHMgYSBuZXcgZHJvcCBtZW51IGNvbnRyb2wgaW5zdGFuY2UuDQoJCSAqDQoJCSAqIEBjb25zdHJ1Y3Rvcg0KCQkgKiBAbWV0aG9kIERyb3BNZW51DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBpZCBCdXR0b24gY29udHJvbCBpZCBmb3IgdGhlIGJ1dHRvbi4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgbmFtZS92YWx1ZSBzZXR0aW5ncyBvYmplY3QuDQoJCSAqLw0KCQlEcm9wTWVudSA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQlzID0gcyB8fCB7fTsNCgkJCXMuY29udGFpbmVyID0gcy5jb250YWluZXIgfHwgRE9NLmRvYy5ib2R5Ow0KCQkJcy5vZmZzZXRfeCA9IHMub2Zmc2V0X3ggfHwgMDsNCgkJCXMub2Zmc2V0X3kgPSBzLm9mZnNldF95IHx8IDA7DQoJCQlzLnZwX29mZnNldF94ID0gcy52cF9vZmZzZXRfeCB8fCAwOw0KCQkJcy52cF9vZmZzZXRfeSA9IHMudnBfb2Zmc2V0X3kgfHwgMDsNCg0KCQkJaWYgKGlzKHMuaWNvbnMpICYmICFzLmljb25zKQ0KCQkJCXNbJ2NsYXNzJ10gKz0gJyBtY2VOb0ljb25zJzsNCg0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQkJdGhpcy5vblNob3dNZW51ID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpOw0KCQkJdGhpcy5vbkhpZGVNZW51ID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpOw0KCQkJdGhpcy5jbGFzc1ByZWZpeCA9ICdtY2VNZW51JzsNCgkJfSwNCg0KCQkvKioNCgkJICogQ3JlYXRlZCBhIG5ldyBzdWIgbWVudSBmb3IgdGhlIGRyb3AgbWVudSBjb250cm9sLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGNyZWF0ZU1lbnUNCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgbmFtZS92YWx1ZSBzZXR0aW5ncyBvYmplY3QuDQoJCSAqIEByZXR1cm4ge3RpbnltY2UudWkuRHJvcE1lbnV9IE5ldyBkcm9wIG1lbnUgaW5zdGFuY2UuDQoJCSAqLw0KCQljcmVhdGVNZW51IDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzLCBjcyA9IHQuc2V0dGluZ3MsIG07DQoNCgkJCXMuY29udGFpbmVyID0gcy5jb250YWluZXIgfHwgY3MuY29udGFpbmVyOw0KCQkJcy5wYXJlbnQgPSB0Ow0KCQkJcy5jb25zdHJhaW4gPSBzLmNvbnN0cmFpbiB8fCBjcy5jb25zdHJhaW47DQoJCQlzWydjbGFzcyddID0gc1snY2xhc3MnXSB8fCBjc1snY2xhc3MnXTsNCgkJCXMudnBfb2Zmc2V0X3ggPSBzLnZwX29mZnNldF94IHx8IGNzLnZwX29mZnNldF94Ow0KCQkJcy52cF9vZmZzZXRfeSA9IHMudnBfb2Zmc2V0X3kgfHwgY3MudnBfb2Zmc2V0X3k7DQoJCQltID0gbmV3IHRpbnltY2UudWkuRHJvcE1lbnUocy5pZCB8fCBET00udW5pcXVlSWQoKSwgcyk7DQoNCgkJCW0ub25BZGRJdGVtLmFkZCh0Lm9uQWRkSXRlbS5kaXNwYXRjaCwgdC5vbkFkZEl0ZW0pOw0KDQoJCQlyZXR1cm4gbTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVwYWludHMgdGhlIG1lbnUgYWZ0ZXIgbmV3IGl0ZW1zIGhhdmUgYmVlbiBhZGRlZCBkeW5hbWljYWxseS4NCgkJICoNCgkJICogQG1ldGhvZCB1cGRhdGUNCgkJICovDQoJCXVwZGF0ZSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgdGIgPSBET00uZ2V0KCdtZW51XycgKyB0LmlkICsgJ190YmwnKSwgY28gPSBET00uZ2V0KCdtZW51XycgKyB0LmlkICsgJ19jbycpLCB0dywgdGg7DQoNCgkJCXR3ID0gcy5tYXhfd2lkdGggPyBNYXRoLm1pbih0Yi5jbGllbnRXaWR0aCwgcy5tYXhfd2lkdGgpIDogdGIuY2xpZW50V2lkdGg7DQoJCQl0aCA9IHMubWF4X2hlaWdodCA/IE1hdGgubWluKHRiLmNsaWVudEhlaWdodCwgcy5tYXhfaGVpZ2h0KSA6IHRiLmNsaWVudEhlaWdodDsNCg0KCQkJaWYgKCFET00uYm94TW9kZWwpDQoJCQkJdC5lbGVtZW50LnNldFN0eWxlcyh7d2lkdGggOiB0dyArIDIsIGhlaWdodCA6IHRoICsgMn0pOw0KCQkJZWxzZQ0KCQkJCXQuZWxlbWVudC5zZXRTdHlsZXMoe3dpZHRoIDogdHcsIGhlaWdodCA6IHRofSk7DQoNCgkJCWlmIChzLm1heF93aWR0aCkNCgkJCQlET00uc2V0U3R5bGUoY28sICd3aWR0aCcsIHR3KTsNCg0KCQkJaWYgKHMubWF4X2hlaWdodCkgew0KCQkJCURPTS5zZXRTdHlsZShjbywgJ2hlaWdodCcsIHRoKTsNCg0KCQkJCWlmICh0Yi5jbGllbnRIZWlnaHQgPCBzLm1heF9oZWlnaHQpDQoJCQkJCURPTS5zZXRTdHlsZShjbywgJ292ZXJmbG93JywgJ2hpZGRlbicpOw0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBEaXNwbGF5cyB0aGUgbWVudSBhdCB0aGUgc3BlY2lmaWVkIGNvcmRpbmF0ZS4NCgkJICoNCgkJICogQG1ldGhvZCBzaG93TWVudQ0KCQkgKiBAcGFyYW0ge051bWJlcn0geCBIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBtZW51Lg0KCQkgKiBAcGFyYW0ge051bWJlcn0geSBWZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgbWVudS4NCgkJICogQHBhcmFtIHtOdW1uZXJ9IHB4IE9wdGlvbmFsIHBhcmVudCBYIHBvc2l0aW9uIHVzZWQgd2hlbiBtZW51cyBhcmUgY2FzY2FkaW5nLg0KCQkgKi8NCgkJc2hvd01lbnUgOiBmdW5jdGlvbih4LCB5LCBweCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgY28sIHZwID0gRE9NLmdldFZpZXdQb3J0KCksIHcsIGgsIG14LCBteSwgb3QgPSAyLCBkbSwgdGIsIGNwID0gdC5jbGFzc1ByZWZpeDsNCg0KCQkJdC5jb2xsYXBzZSgxKTsNCg0KCQkJaWYgKHQuaXNNZW51VmlzaWJsZSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICghdC5yZW5kZXJlZCkgew0KCQkJCWNvID0gRE9NLmFkZCh0LnNldHRpbmdzLmNvbnRhaW5lciwgdC5yZW5kZXJOb2RlKCkpOw0KDQoJCQkJZWFjaCh0Lml0ZW1zLCBmdW5jdGlvbihvKSB7DQoJCQkJCW8ucG9zdFJlbmRlcigpOw0KCQkJCX0pOw0KDQoJCQkJdC5lbGVtZW50ID0gbmV3IEVsZW1lbnQoJ21lbnVfJyArIHQuaWQsIHtibG9ja2VyIDogMSwgY29udGFpbmVyIDogcy5jb250YWluZXJ9KTsNCgkJCX0gZWxzZQ0KCQkJCWNvID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCk7DQoNCgkJCS8vIE1vdmUgbGF5ZXIgb3V0IG9mIHNpZ2h0IHVubGVzcyBpdCdzIE9wZXJhIHNpbmNlIGl0IHNjcm9sbHMgdG8gdG9wIG9mIHBhZ2UgZHVlIHRvIGFuIGJ1Zw0KCQkJaWYgKCF0aW55bWNlLmlzT3BlcmEpDQoJCQkJRE9NLnNldFN0eWxlcyhjbywge2xlZnQgOiAtMHhGRkZGICwgdG9wIDogLTB4RkZGRn0pOw0KDQoJCQlET00uc2hvdyhjbyk7DQoJCQl0LnVwZGF0ZSgpOw0KDQoJCQl4ICs9IHMub2Zmc2V0X3ggfHwgMDsNCgkJCXkgKz0gcy5vZmZzZXRfeSB8fCAwOw0KCQkJdnAudyAtPSA0Ow0KCQkJdnAuaCAtPSA0Ow0KDQoJCQkvLyBNb3ZlIGluc2lkZSB2aWV3cG9ydCBpZiBub3Qgc3VibWVudQ0KCQkJaWYgKHMuY29uc3RyYWluKSB7DQoJCQkJdyA9IGNvLmNsaWVudFdpZHRoIC0gb3Q7DQoJCQkJaCA9IGNvLmNsaWVudEhlaWdodCAtIG90Ow0KCQkJCW14ID0gdnAueCArIHZwLnc7DQoJCQkJbXkgPSB2cC55ICsgdnAuaDsNCg0KCQkJCWlmICgoeCArIHMudnBfb2Zmc2V0X3ggKyB3KSA+IG14KQ0KCQkJCQl4ID0gcHggPyBweCAtIHcgOiBNYXRoLm1heCgwLCAobXggLSBzLnZwX29mZnNldF94KSAtIHcpOw0KDQoJCQkJaWYgKCh5ICsgcy52cF9vZmZzZXRfeSArIGgpID4gbXkpDQoJCQkJCXkgPSBNYXRoLm1heCgwLCAobXkgLSBzLnZwX29mZnNldF95KSAtIGgpOw0KCQkJfQ0KDQoJCQlET00uc2V0U3R5bGVzKGNvLCB7bGVmdCA6IHggLCB0b3AgOiB5fSk7DQoJCQl0LmVsZW1lbnQudXBkYXRlKCk7DQoNCgkJCXQuaXNNZW51VmlzaWJsZSA9IDE7DQoJCQl0Lm1vdXNlQ2xpY2tGdW5jID0gRXZlbnQuYWRkKGNvLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIG07DQoNCgkJCQllID0gZS50YXJnZXQ7DQoNCgkJCQlpZiAoZSAmJiAoZSA9IERPTS5nZXRQYXJlbnQoZSwgJ3RyJykpICYmICFET00uaGFzQ2xhc3MoZSwgY3AgKyAnSXRlbVN1YicpKSB7DQoJCQkJCW0gPSB0Lml0ZW1zW2UuaWRdOw0KDQoJCQkJCWlmIChtLmlzRGlzYWJsZWQoKSkNCgkJCQkJCXJldHVybjsNCg0KCQkJCQlkbSA9IHQ7DQoNCgkJCQkJd2hpbGUgKGRtKSB7DQoJCQkJCQlpZiAoZG0uaGlkZU1lbnUpDQoJCQkJCQkJZG0uaGlkZU1lbnUoKTsNCg0KCQkJCQkJZG0gPSBkbS5zZXR0aW5ncy5wYXJlbnQ7DQoJCQkJCX0NCg0KCQkJCQlpZiAobS5zZXR0aW5ncy5vbmNsaWNrKQ0KCQkJCQkJbS5zZXR0aW5ncy5vbmNsaWNrKGUpOw0KDQoJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7IC8vIENhbmNlbCB0byBmaXggb25iZWZvcmV1bmxvYWQgcHJvYmxlbQ0KCQkJCX0NCgkJCX0pOw0KDQoJCQlpZiAodC5oYXNNZW51cygpKSB7DQoJCQkJdC5tb3VzZU92ZXJGdW5jID0gRXZlbnQuYWRkKGNvLCAnbW91c2VvdmVyJywgZnVuY3Rpb24oZSkgew0KCQkJCQl2YXIgbSwgciwgbWk7DQoNCgkJCQkJZSA9IGUudGFyZ2V0Ow0KCQkJCQlpZiAoZSAmJiAoZSA9IERPTS5nZXRQYXJlbnQoZSwgJ3RyJykpKSB7DQoJCQkJCQltID0gdC5pdGVtc1tlLmlkXTsNCg0KCQkJCQkJaWYgKHQubGFzdE1lbnUpDQoJCQkJCQkJdC5sYXN0TWVudS5jb2xsYXBzZSgxKTsNCg0KCQkJCQkJaWYgKG0uaXNEaXNhYmxlZCgpKQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJaWYgKGUgJiYgRE9NLmhhc0NsYXNzKGUsIGNwICsgJ0l0ZW1TdWInKSkgew0KCQkJCQkJCS8vcCA9IERPTS5nZXRQb3Mocy5jb250YWluZXIpOw0KCQkJCQkJCXIgPSBET00uZ2V0UmVjdChlKTsNCgkJCQkJCQltLnNob3dNZW51KChyLnggKyByLncgLSBvdCksIHIueSAtIG90LCByLngpOw0KCQkJCQkJCXQubGFzdE1lbnUgPSBtOw0KCQkJCQkJCURPTS5hZGRDbGFzcyhET00uZ2V0KG0uaWQpLmZpcnN0Q2hpbGQsIGNwICsgJ0l0ZW1BY3RpdmUnKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQl0Lm9uU2hvd01lbnUuZGlzcGF0Y2godCk7DQoNCgkJCWlmIChzLmtleWJvYXJkX2ZvY3VzKSB7DQoJCQkJRXZlbnQuYWRkKGNvLCAna2V5ZG93bicsIHQuX2tleUhhbmRsZXIsIHQpOw0KCQkJCURPTS5zZWxlY3QoJ2EnLCAnbWVudV8nICsgdC5pZClbMF0uZm9jdXMoKTsgLy8gU2VsZWN0IGZpcnN0IGxpbmsNCgkJCQl0Ll9mb2N1c0lkeCA9IDA7DQoJCQl9DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEhpZGVzIHRoZSBkaXNwbGF5ZWQgbWVudS4NCgkJICoNCgkJICogQG1ldGhvZCBoaWRlTWVudQ0KCQkgKi8NCgkJaGlkZU1lbnUgOiBmdW5jdGlvbihjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNvID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCksIGU7DQoNCgkJCWlmICghdC5pc01lbnVWaXNpYmxlKQ0KCQkJCXJldHVybjsNCg0KCQkJRXZlbnQucmVtb3ZlKGNvLCAnbW91c2VvdmVyJywgdC5tb3VzZU92ZXJGdW5jKTsNCgkJCUV2ZW50LnJlbW92ZShjbywgJ2NsaWNrJywgdC5tb3VzZUNsaWNrRnVuYyk7DQoJCQlFdmVudC5yZW1vdmUoY28sICdrZXlkb3duJywgdC5fa2V5SGFuZGxlcik7DQoJCQlET00uaGlkZShjbyk7DQoJCQl0LmlzTWVudVZpc2libGUgPSAwOw0KDQoJCQlpZiAoIWMpDQoJCQkJdC5jb2xsYXBzZSgxKTsNCg0KCQkJaWYgKHQuZWxlbWVudCkNCgkJCQl0LmVsZW1lbnQuaGlkZSgpOw0KDQoJCQlpZiAoZSA9IERPTS5nZXQodC5pZCkpDQoJCQkJRE9NLnJlbW92ZUNsYXNzKGUuZmlyc3RDaGlsZCwgdC5jbGFzc1ByZWZpeCArICdJdGVtQWN0aXZlJyk7DQoNCgkJCXQub25IaWRlTWVudS5kaXNwYXRjaCh0KTsNCgkJfSwNCg0KCQkvKioNCgkJICogQWRkcyBhIG5ldyBtZW51LCBtZW51IGl0ZW0gb3Igc3ViIGNsYXNzZXMgb2YgdGhlbSB0byB0aGUgZHJvcCBtZW51Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGFkZA0KCQkgKiBAcGFyYW0ge3RpbnltY2UudWkuQ29udHJvbH0gbyBNZW51IG9yIG1lbnUgaXRlbSB0byBhZGQgdG8gdGhlIGRyb3AgbWVudS4NCgkJICogQHJldHVybiB7dGlueW1jZS51aS5Db250cm9sfSBTYW1lIGFzIHRoZSBpbnB1dCBjb250cm9sLCB0aGUgbWVudSBvciBtZW51IGl0ZW0uDQoJCSAqLw0KCQlhZGQgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNvOw0KDQoJCQlvID0gdC5wYXJlbnQobyk7DQoNCgkJCWlmICh0LmlzUmVuZGVyZWQgJiYgKGNvID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCkpKQ0KCQkJCXQuX2FkZChET00uc2VsZWN0KCd0Ym9keScsIGNvKVswXSwgbyk7DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDb2xsYXBzZXMgdGhlIG1lbnUsIHRoaXMgd2lsbCBoaWRlIHRoZSBtZW51IGFuZCBhbGwgbWVudSBpdGVtcy4NCgkJICoNCgkJICogQG1ldGhvZCBjb2xsYXBzZQ0KCQkgKiBAcGFyYW0ge0Jvb2xlYW59IGQgT3B0aW9uYWwgZGVlcCBzdGF0ZS4gSWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZSBhbGwgY2hpbGRyZW4gd2lsbCBiZSBjb2xsYXBzZWQgYXMgd2VsbC4NCgkJICovDQoJCWNvbGxhcHNlIDogZnVuY3Rpb24oZCkgew0KCQkJdGhpcy5wYXJlbnQoZCk7DQoJCQl0aGlzLmhpZGVNZW51KDEpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZW1vdmVzIGEgc3BlY2lmaWMgc3ViIG1lbnUgb3IgbWVudSBpdGVtIGZyb20gdGhlIGRyb3AgbWVudS4NCgkJICoNCgkJICogQG1ldGhvZCByZW1vdmUNCgkJICogQHBhcmFtIHt0aW55bWNlLnVpLkNvbnRyb2x9IG8gTWVudSBpdGVtIG9yIG1lbnUgdG8gcmVtb3ZlIGZyb20gZHJvcCBtZW51Lg0KCQkgKiBAcmV0dXJuIHt0aW55bWNlLnVpLkNvbnRyb2x9IENvbnRyb2wgaW5zdGFuY2Ugb3IgbnVsbCBpZiBpdCB3YXNuJ3QgZm91bmQuDQoJCSAqLw0KCQlyZW1vdmUgOiBmdW5jdGlvbihvKSB7DQoJCQlET00ucmVtb3ZlKG8uaWQpOw0KCQkJdGhpcy5kZXN0cm95KCk7DQoNCgkJCXJldHVybiB0aGlzLnBhcmVudChvKTsNCgkJfSwNCg0KCQkvKioNCgkJICogRGVzdHJveXMgdGhlIG1lbnUuIFRoaXMgd2lsbCByZW1vdmUgdGhlIG1lbnUgZnJvbSB0aGUgRE9NIGFuZCBhbnkgZXZlbnRzIGFkZGVkIHRvIGl0IGV0Yy4NCgkJICoNCgkJICogQG1ldGhvZCBkZXN0cm95DQoJCSAqLw0KCQlkZXN0cm95IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNvID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCk7DQoNCgkJCUV2ZW50LnJlbW92ZShjbywgJ21vdXNlb3ZlcicsIHQubW91c2VPdmVyRnVuYyk7DQoJCQlFdmVudC5yZW1vdmUoY28sICdjbGljaycsIHQubW91c2VDbGlja0Z1bmMpOw0KDQoJCQlpZiAodC5lbGVtZW50KQ0KCQkJCXQuZWxlbWVudC5yZW1vdmUoKTsNCg0KCQkJRE9NLnJlbW92ZShjbyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJlbmRlcnMgdGhlIHNwZWNpZmllZCBtZW51IG5vZGUgdG8gdGhlIGRvbS4NCgkJICoNCgkJICogQG1ldGhvZCByZW5kZXJOb2RlDQoJCSAqIEByZXR1cm4ge0VsZW1lbnR9IENvbnRhaW5lciBlbGVtZW50IGZvciB0aGUgZHJvcCBtZW51Lg0KCQkgKi8NCgkJcmVuZGVyTm9kZSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgbiwgdGIsIGNvLCB3Ow0KDQoJCQl3ID0gRE9NLmNyZWF0ZSgnZGl2Jywge2lkIDogJ21lbnVfJyArIHQuaWQsICdjbGFzcycgOiBzWydjbGFzcyddLCAnc3R5bGUnIDogJ3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt6LWluZGV4OjIwMDAwMCd9KTsNCgkJCWNvID0gRE9NLmFkZCh3LCAnZGl2Jywge2lkIDogJ21lbnVfJyArIHQuaWQgKyAnX2NvJywgJ2NsYXNzJyA6IHQuY2xhc3NQcmVmaXggKyAoc1snY2xhc3MnXSA/ICcgJyArIHNbJ2NsYXNzJ10gOiAnJyl9KTsNCgkJCXQuZWxlbWVudCA9IG5ldyBFbGVtZW50KCdtZW51XycgKyB0LmlkLCB7YmxvY2tlciA6IDEsIGNvbnRhaW5lciA6IHMuY29udGFpbmVyfSk7DQoNCgkJCWlmIChzLm1lbnVfbGluZSkNCgkJCQlET00uYWRkKGNvLCAnc3BhbicsIHsnY2xhc3MnIDogdC5jbGFzc1ByZWZpeCArICdMaW5lJ30pOw0KDQovLwkJCW4gPSBET00uYWRkKGNvLCAnZGl2Jywge2lkIDogJ21lbnVfJyArIHQuaWQgKyAnX2NvJywgJ2NsYXNzJyA6ICdtY2VNZW51Q29udGFpbmVyJ30pOw0KCQkJbiA9IERPTS5hZGQoY28sICd0YWJsZScsIHtpZCA6ICdtZW51XycgKyB0LmlkICsgJ190YmwnLCBib3JkZXIgOiAwLCBjZWxsUGFkZGluZyA6IDAsIGNlbGxTcGFjaW5nIDogMH0pOw0KCQkJdGIgPSBET00uYWRkKG4sICd0Ym9keScpOw0KDQoJCQllYWNoKHQuaXRlbXMsIGZ1bmN0aW9uKG8pIHsNCgkJCQl0Ll9hZGQodGIsIG8pOw0KCQkJfSk7DQoNCgkJCXQucmVuZGVyZWQgPSB0cnVlOw0KDQoJCQlyZXR1cm4gdzsNCgkJfSwNCg0KCQkvLyBJbnRlcm5hbCBmdW5jdGlvbnMNCg0KCQlfa2V5SGFuZGxlciA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpcywga2MgPSBlLmtleUNvZGU7DQoNCgkJCWZ1bmN0aW9uIGZvY3VzKGQpIHsNCgkJCQl2YXIgaSA9IHQuX2ZvY3VzSWR4ICsgZCwgZSA9IERPTS5zZWxlY3QoJ2EnLCAnbWVudV8nICsgdC5pZClbaV07DQoNCgkJCQlpZiAoZSkgew0KCQkJCQl0Ll9mb2N1c0lkeCA9IGk7DQoJCQkJCWUuZm9jdXMoKTsNCgkJCQl9DQoJCQl9Ow0KDQoJCQlzd2l0Y2ggKGtjKSB7DQoJCQkJY2FzZSAzODoNCgkJCQkJZm9jdXMoLTEpOyAvLyBTZWxlY3QgZmlyc3QgbGluaw0KCQkJCQlyZXR1cm47DQoNCgkJCQljYXNlIDQwOg0KCQkJCQlmb2N1cygxKTsNCgkJCQkJcmV0dXJuOw0KDQoJCQkJY2FzZSAxMzoNCgkJCQkJcmV0dXJuOw0KDQoJCQkJY2FzZSAyNzoNCgkJCQkJcmV0dXJuIHRoaXMuaGlkZU1lbnUoKTsNCgkJCX0NCgkJfSwNCg0KCQlfYWRkIDogZnVuY3Rpb24odGIsIG8pIHsNCgkJCXZhciBuLCBzID0gby5zZXR0aW5ncywgYSwgcm8sIGl0LCBjcCA9IHRoaXMuY2xhc3NQcmVmaXgsIGljOw0KDQoJCQlpZiAocy5zZXBhcmF0b3IpIHsNCgkJCQlybyA9IERPTS5hZGQodGIsICd0cicsIHtpZCA6IG8uaWQsICdjbGFzcycgOiBjcCArICdJdGVtU2VwYXJhdG9yJ30pOw0KCQkJCURPTS5hZGQocm8sICd0ZCcsIHsnY2xhc3MnIDogY3AgKyAnSXRlbVNlcGFyYXRvcid9KTsNCg0KCQkJCWlmIChuID0gcm8ucHJldmlvdXNTaWJsaW5nKQ0KCQkJCQlET00uYWRkQ2xhc3MobiwgJ21jZUxhc3QnKTsNCg0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJbiA9IHJvID0gRE9NLmFkZCh0YiwgJ3RyJywge2lkIDogby5pZCwgJ2NsYXNzJyA6IGNwICsgJ0l0ZW0gJyArIGNwICsgJ0l0ZW1FbmFibGVkJ30pOw0KCQkJbiA9IGl0ID0gRE9NLmFkZChuLCAndGQnKTsNCgkJCW4gPSBhID0gRE9NLmFkZChuLCAnYScsIHtocmVmIDogJ2phdmFzY3JpcHQ6OycsIG9uY2xpY2sgOiAicmV0dXJuIGZhbHNlOyIsIG9ubW91c2Vkb3duIDogJ3JldHVybiBmYWxzZTsnfSk7DQoNCgkJCURPTS5hZGRDbGFzcyhpdCwgc1snY2xhc3MnXSk7DQovLwkJCW4gPSBET00uYWRkKG4sICdzcGFuJywgeydjbGFzcycgOiAnaXRlbSd9KTsNCg0KCQkJaWMgPSBET00uYWRkKG4sICdzcGFuJywgeydjbGFzcycgOiAnbWNlSWNvbicgKyAocy5pY29uID8gJyBtY2VfJyArIHMuaWNvbiA6ICcnKX0pOw0KDQoJCQlpZiAocy5pY29uX3NyYykNCgkJCQlET00uYWRkKGljLCAnaW1nJywge3NyYyA6IHMuaWNvbl9zcmN9KTsNCg0KCQkJbiA9IERPTS5hZGQobiwgcy5lbGVtZW50IHx8ICdzcGFuJywgeydjbGFzcycgOiAnbWNlVGV4dCcsIHRpdGxlIDogby5zZXR0aW5ncy50aXRsZX0sIG8uc2V0dGluZ3MudGl0bGUpOw0KDQoJCQlpZiAoby5zZXR0aW5ncy5zdHlsZSkNCgkJCQlET00uc2V0QXR0cmliKG4sICdzdHlsZScsIG8uc2V0dGluZ3Muc3R5bGUpOw0KDQoJCQlpZiAodGIuY2hpbGROb2Rlcy5sZW5ndGggPT0gMSkNCgkJCQlET00uYWRkQ2xhc3Mocm8sICdtY2VGaXJzdCcpOw0KDQoJCQlpZiAoKG4gPSByby5wcmV2aW91c1NpYmxpbmcpICYmIERPTS5oYXNDbGFzcyhuLCBjcCArICdJdGVtU2VwYXJhdG9yJykpDQoJCQkJRE9NLmFkZENsYXNzKHJvLCAnbWNlRmlyc3QnKTsNCg0KCQkJaWYgKG8uY29sbGFwc2UpDQoJCQkJRE9NLmFkZENsYXNzKHJvLCBjcCArICdJdGVtU3ViJyk7DQoNCgkJCWlmIChuID0gcm8ucHJldmlvdXNTaWJsaW5nKQ0KCQkJCURPTS5yZW1vdmVDbGFzcyhuLCAnbWNlTGFzdCcpOw0KDQoJCQlET00uYWRkQ2xhc3Mocm8sICdtY2VMYXN0Jyk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/ListBox.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBMaXN0Qm94LmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIGVhY2ggPSB0aW55bWNlLmVhY2gsIERpc3BhdGNoZXIgPSB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcjsNCg0KCS8qKg0KCSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgbGlzdCBib3hlcy9zZWxlY3QgbGlzdC4gVGhpcyBvbmUgd2lsbCBnZW5lcmF0ZQ0KCSAqIGEgbm9uIG5hdGl2ZSBjb250cm9sLiBUaGlzIG9uZSBoYXMgdGhlIGJlbmVmaXRzIG9mIGhhdmluZyB2aXN1YWwgaXRlbXMgYWRkZWQuDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS51aS5MaXN0Qm94DQoJICogQGV4dGVuZHMgdGlueW1jZS51aS5Db250cm9sDQoJICovDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuTGlzdEJveDp0aW55bWNlLnVpLkNvbnRyb2wnLCB7DQoJCS8qKg0KCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpc3Rib3ggY29udHJvbCBpbnN0YW5jZS4NCgkJICoNCgkJICogQGNvbnN0cnVjdG9yDQoJCSAqIEBtZXRob2QgTGlzdEJveA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29udHJvbCBpZCBmb3IgdGhlIGxpc3QgYm94Lg0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBuYW1lL3ZhbHVlIHNldHRpbmdzIG9iamVjdC4NCgkJICovDQoJCUxpc3RCb3ggOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LnBhcmVudChpZCwgcyk7DQoNCgkJCS8qKg0KCQkJICogQXJyYXkgb2YgTGlzdEJveCBpdGVtcy4NCgkJCSAqDQoJCQkgKiBAcHJvcGVydHkgaXRlbXMNCgkJCSAqIEB0eXBlIEFycmF5DQoJCQkgKi8NCgkJCXQuaXRlbXMgPSBbXTsNCg0KCQkJLyoqDQoJCQkgKiBGaXJlcyB3aGVuIHRoZSBzZWxlY3Rpb24gaGFzIGJlZW4gY2hhbmdlZC4NCgkJCSAqDQoJCQkgKiBAZXZlbnQgb25DaGFuZ2UNCgkJCSAqLw0KCQkJdC5vbkNoYW5nZSA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KDQoJCQkvKioNCgkJCSAqIEZpcmVzIGFmdGVyIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbmRlcmVkIHRvIERPTS4NCgkJCSAqDQoJCQkgKiBAZXZlbnQgb25Qb3N0UmVuZGVyDQoJCQkgKi8NCgkJCXQub25Qb3N0UmVuZGVyID0gbmV3IERpc3BhdGNoZXIodCk7DQoNCgkJCS8qKg0KCQkJICogRmlyZXMgd2hlbiBhIG5ldyBpdGVtIGlzIGFkZGVkLg0KCQkJICoNCgkJCSAqIEBldmVudCBvbkFkZA0KCQkJICovDQoJCQl0Lm9uQWRkID0gbmV3IERpc3BhdGNoZXIodCk7DQoNCgkJCS8qKg0KCQkJICogRmlyZXMgd2hlbiB0aGUgbWVudSBnZXRzIHJlbmRlcmVkLg0KCQkJICoNCgkJCSAqIEBldmVudCBvblJlbmRlck1lbnUNCgkJCSAqLw0KCQkJdC5vblJlbmRlck1lbnUgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodGhpcyk7DQoNCgkJCXQuY2xhc3NQcmVmaXggPSAnbWNlTGlzdEJveCc7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFNlbGVjdHMgYSBpdGVtL29wdGlvbiBieSB2YWx1ZS4gVGhpcyB3aWxsIGJvdGggYWRkIGEgdmlzdWFsIHNlbGVjdGlvbiB0byB0aGUNCgkJICogaXRlbSBhbmQgY2hhbmdlIHRoZSB0aXRsZSBvZiB0aGUgY29udHJvbCB0byB0aGUgdGl0bGUgb2YgdGhlIG9wdGlvbi4NCgkJICoNCgkJICogQG1ldGhvZCBzZWxlY3QNCgkJICogQHBhcmFtIHtTdHJpbmcvZnVuY3Rpb259IHZhIFZhbHVlIHRvIGxvb2sgZm9yIGluc2lkZSB0aGUgbGlzdCBib3ggb3IgYSBmdW5jdGlvbiBzZWxlY3Rvci4NCgkJICovDQoJCXNlbGVjdCA6IGZ1bmN0aW9uKHZhKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGZ2LCBmOw0KDQoJCQlpZiAodmEgPT0gdW5kZWZpbmVkKQ0KCQkJCXJldHVybiB0LnNlbGVjdEJ5SW5kZXgoLTEpOw0KDQoJCQkvLyBJcyBzdHJpbmcgb3IgbnVtYmVyIG1ha2UgZnVuY3Rpb24gc2VsZWN0b3INCgkJCWlmICh2YSAmJiB2YS5jYWxsKQ0KCQkJCWYgPSB2YTsNCgkJCWVsc2Ugew0KCQkJCWYgPSBmdW5jdGlvbih2KSB7DQoJCQkJCXJldHVybiB2ID09IHZhOw0KCQkJCX07DQoJCQl9DQoNCgkJCS8vIERvIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nPw0KCQkJaWYgKHZhICE9IHQuc2VsZWN0ZWRWYWx1ZSkgew0KCQkJCS8vIEZpbmQgaXRlbQ0KCQkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24obywgaSkgew0KCQkJCQlpZiAoZihvLnZhbHVlKSkgew0KCQkJCQkJZnYgPSAxOw0KCQkJCQkJdC5zZWxlY3RCeUluZGV4KGkpOw0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQlpZiAoIWZ2KQ0KCQkJCQl0LnNlbGVjdEJ5SW5kZXgoLTEpOw0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZWxlY3RzIGEgaXRlbS9vcHRpb24gYnkgaW5kZXguIFRoaXMgd2lsbCBib3RoIGFkZCBhIHZpc3VhbCBzZWxlY3Rpb24gdG8gdGhlDQoJCSAqIGl0ZW0gYW5kIGNoYW5nZSB0aGUgdGl0bGUgb2YgdGhlIGNvbnRyb2wgdG8gdGhlIHRpdGxlIG9mIHRoZSBvcHRpb24uDQoJCSAqDQoJCSAqIEBtZXRob2Qgc2VsZWN0QnlJbmRleA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWR4IEluZGV4IHRvIHNlbGVjdCwgcGFzcyAtMSB0byBzZWxlY3QgbWVudS90aXRsZSBvZiBzZWxlY3QgYm94Lg0KCQkgKi8NCgkJc2VsZWN0QnlJbmRleCA6IGZ1bmN0aW9uKGlkeCkgew0KCQkJdmFyIHQgPSB0aGlzLCBlLCBvOw0KDQoJCQlpZiAoaWR4ICE9IHQuc2VsZWN0ZWRJbmRleCkgew0KCQkJCWUgPSBET00uZ2V0KHQuaWQgKyAnX3RleHQnKTsNCgkJCQlvID0gdC5pdGVtc1tpZHhdOw0KDQoJCQkJaWYgKG8pIHsNCgkJCQkJdC5zZWxlY3RlZFZhbHVlID0gby52YWx1ZTsNCgkJCQkJdC5zZWxlY3RlZEluZGV4ID0gaWR4Ow0KCQkJCQlET00uc2V0SFRNTChlLCBET00uZW5jb2RlKG8udGl0bGUpKTsNCgkJCQkJRE9NLnJlbW92ZUNsYXNzKGUsICdtY2VUaXRsZScpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCURPTS5zZXRIVE1MKGUsIERPTS5lbmNvZGUodC5zZXR0aW5ncy50aXRsZSkpOw0KCQkJCQlET00uYWRkQ2xhc3MoZSwgJ21jZVRpdGxlJyk7DQoJCQkJCXQuc2VsZWN0ZWRWYWx1ZSA9IHQuc2VsZWN0ZWRJbmRleCA9IG51bGw7DQoJCQkJfQ0KDQoJCQkJZSA9IDA7DQoJCQl9DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEFkZHMgYSBvcHRpb24gaXRlbSB0byB0aGUgbGlzdCBib3guDQoJCSAqDQoJCSAqIEBtZXRob2QgYWRkDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIFRpdGxlIGZvciB0aGUgbmV3IG9wdGlvbi4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHYgVmFsdWUgZm9yIHRoZSBuZXcgb3B0aW9uLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gbyBPcHRpb25hbCBvYmplY3Qgd2l0aCBzZXR0aW5ncyBsaWtlIGZvciBleGFtcGxlIGNsYXNzLg0KCQkgKi8NCgkJYWRkIDogZnVuY3Rpb24obiwgdiwgbykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlvID0gbyB8fCB7fTsNCgkJCW8gPSB0aW55bWNlLmV4dGVuZChvLCB7DQoJCQkJdGl0bGUgOiBuLA0KCQkJCXZhbHVlIDogdg0KCQkJfSk7DQoNCgkJCXQuaXRlbXMucHVzaChvKTsNCgkJCXQub25BZGQuZGlzcGF0Y2godCwgbyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbnNpZGUgdGhlIGxpc3QgYm94Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldExlbmd0aA0KCQkgKiBAcGFyYW0ge051bWJlcn0gTnVtYmVyIG9mIGl0ZW1zIGluc2lkZSB0aGUgbGlzdCBib3guDQoJCSAqLw0KCQlnZXRMZW5ndGggOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLml0ZW1zLmxlbmd0aDsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVuZGVycyB0aGUgbGlzdCBib3ggYXMgYSBIVE1MIHN0cmluZy4gVGhpcyBtZXRob2QgaXMgbXVjaCBmYXN0ZXIgdGhhbiB1c2luZyB0aGUgRE9NIGFuZCB3aGVuDQoJCSAqIGNyZWF0aW5nIGEgd2hvbGUgdG9vbGJhciB3aXRoIGJ1dHRvbnMgaXQgZG9lcyBtYWtlIGEgbG90IG9mIGRpZmZlcmVuY2UuDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVuZGVySFRNTA0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgZm9yIHRoZSBsaXN0IGJveCBjb250cm9sIGVsZW1lbnQuDQoJCSAqLw0KCQlyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgaCA9ICcnLCB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGNwID0gdC5jbGFzc1ByZWZpeDsNCg0KCQkJaCA9ICc8dGFibGUgaWQ9IicgKyB0LmlkICsgJyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0iJyArIGNwICsgJyAnICsgY3AgKyAnRW5hYmxlZCcgKyAoc1snY2xhc3MnXSA/ICgnICcgKyBzWydjbGFzcyddKSA6ICcnKSArICciPjx0Ym9keT48dHI+JzsNCgkJCWggKz0gJzx0ZD4nICsgRE9NLmNyZWF0ZUhUTUwoJ2EnLCB7aWQgOiB0LmlkICsgJ190ZXh0JywgaHJlZiA6ICdqYXZhc2NyaXB0OjsnLCAnY2xhc3MnIDogJ21jZVRleHQnLCBvbmNsaWNrIDogInJldHVybiBmYWxzZTsiLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7J30sIERPTS5lbmNvZGUodC5zZXR0aW5ncy50aXRsZSkpICsgJzwvdGQ+JzsNCgkJCWggKz0gJzx0ZD4nICsgRE9NLmNyZWF0ZUhUTUwoJ2EnLCB7aWQgOiB0LmlkICsgJ19vcGVuJywgdGFiaW5kZXggOiAtMSwgaHJlZiA6ICdqYXZhc2NyaXB0OjsnLCAnY2xhc3MnIDogJ21jZU9wZW4nLCBvbmNsaWNrIDogInJldHVybiBmYWxzZTsiLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7J30sICc8c3Bhbj48L3NwYW4+JykgKyAnPC90ZD4nOw0KCQkJaCArPSAnPC90cj48L3Rib2R5PjwvdGFibGU+JzsNCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIERpc3BsYXlzIHRoZSBkcm9wIG1lbnUgd2l0aCBhbGwgaXRlbXMuDQoJCSAqDQoJCSAqIEBtZXRob2Qgc2hvd01lbnUNCgkJICovDQoJCXNob3dNZW51IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHAxLCBwMiwgZSA9IERPTS5nZXQodGhpcy5pZCksIG07DQoNCgkJCWlmICh0LmlzRGlzYWJsZWQoKSB8fCB0Lml0ZW1zLmxlbmd0aCA9PSAwKQ0KCQkJCXJldHVybjsNCg0KCQkJaWYgKHQubWVudSAmJiB0Lm1lbnUuaXNNZW51VmlzaWJsZSkNCgkJCQlyZXR1cm4gdC5oaWRlTWVudSgpOw0KDQoJCQlpZiAoIXQuaXNNZW51UmVuZGVyZWQpIHsNCgkJCQl0LnJlbmRlck1lbnUoKTsNCgkJCQl0LmlzTWVudVJlbmRlcmVkID0gdHJ1ZTsNCgkJCX0NCg0KCQkJcDEgPSBET00uZ2V0UG9zKHRoaXMuc2V0dGluZ3MubWVudV9jb250YWluZXIpOw0KCQkJcDIgPSBET00uZ2V0UG9zKGUpOw0KDQoJCQltID0gdC5tZW51Ow0KCQkJbS5zZXR0aW5ncy5vZmZzZXRfeCA9IHAyLng7DQoJCQltLnNldHRpbmdzLm9mZnNldF95ID0gcDIueTsNCgkJCW0uc2V0dGluZ3Mua2V5Ym9hcmRfZm9jdXMgPSAhdGlueW1jZS5pc09wZXJhOyAvLyBPcGVyYSBpcyBidWdneSB3aGVuIGl0IGNvbWVzIHRvIGF1dG8gZm9jdXMNCg0KCQkJLy8gU2VsZWN0IGluIG1lbnUNCgkJCWlmICh0Lm9sZElEKQ0KCQkJCW0uaXRlbXNbdC5vbGRJRF0uc2V0U2VsZWN0ZWQoMCk7DQoNCgkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24obykgew0KCQkJCWlmIChvLnZhbHVlID09PSB0LnNlbGVjdGVkVmFsdWUpIHsNCgkJCQkJbS5pdGVtc1tvLmlkXS5zZXRTZWxlY3RlZCgxKTsNCgkJCQkJdC5vbGRJRCA9IG8uaWQ7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCW0uc2hvd01lbnUoMCwgZS5jbGllbnRIZWlnaHQpOw0KDQoJCQlFdmVudC5hZGQoRE9NLmRvYywgJ21vdXNlZG93bicsIHQuaGlkZU1lbnUsIHQpOw0KCQkJRE9NLmFkZENsYXNzKHQuaWQsIHQuY2xhc3NQcmVmaXggKyAnU2VsZWN0ZWQnKTsNCg0KCQkJLy9ET00uZ2V0KHQuaWQgKyAnX3RleHQnKS5mb2N1cygpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBIaWRlcyB0aGUgZHJvcCBtZW51Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGhpZGVNZW51DQoJCSAqLw0KCQloaWRlTWVudSA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKHQubWVudSAmJiB0Lm1lbnUuaXNNZW51VmlzaWJsZSkgew0KCQkJCS8vIFByZXZlbnQgZG91YmxlIHRvb2dsZXMgYnkgY2FuY2VsaW5nIHRoZSBtb3VzZSBjbGljayBldmVudCB0byB0aGUgYnV0dG9uDQoJCQkJaWYgKGUgJiYgZS50eXBlID09ICJtb3VzZWRvd24iICYmIChlLnRhcmdldC5pZCA9PSB0LmlkICsgJ190ZXh0JyB8fCBlLnRhcmdldC5pZCA9PSB0LmlkICsgJ19vcGVuJykpDQoJCQkJCXJldHVybjsNCg0KCQkJCWlmICghZSB8fCAhRE9NLmdldFBhcmVudChlLnRhcmdldCwgJy5tY2VNZW51JykpIHsNCgkJCQkJRE9NLnJlbW92ZUNsYXNzKHQuaWQsIHQuY2xhc3NQcmVmaXggKyAnU2VsZWN0ZWQnKTsNCgkJCQkJRXZlbnQucmVtb3ZlKERPTS5kb2MsICdtb3VzZWRvd24nLCB0LmhpZGVNZW51LCB0KTsNCgkJCQkJdC5tZW51LmhpZGVNZW51KCk7DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZW5kZXJzIHRoZSBtZW51IHRvIHRoZSBET00uDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVuZGVyTWVudQ0KCQkgKi8NCgkJcmVuZGVyTWVudSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBtOw0KDQoJCQltID0gdC5zZXR0aW5ncy5jb250cm9sX21hbmFnZXIuY3JlYXRlRHJvcE1lbnUodC5pZCArICdfbWVudScsIHsNCgkJCQltZW51X2xpbmUgOiAxLA0KCQkJCSdjbGFzcycgOiB0LmNsYXNzUHJlZml4ICsgJ01lbnUgbWNlTm9JY29ucycsDQoJCQkJbWF4X3dpZHRoIDogMTUwLA0KCQkJCW1heF9oZWlnaHQgOiAxNTANCgkJCX0pOw0KDQoJCQltLm9uSGlkZU1lbnUuYWRkKHQuaGlkZU1lbnUsIHQpOw0KDQoJCQltLmFkZCh7DQoJCQkJdGl0bGUgOiB0LnNldHRpbmdzLnRpdGxlLA0KCQkJCSdjbGFzcycgOiAnbWNlTWVudUl0ZW1UaXRsZScsDQoJCQkJb25jbGljayA6IGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAodC5zZXR0aW5ncy5vbnNlbGVjdCgnJykgIT09IGZhbHNlKQ0KCQkJCQkJdC5zZWxlY3QoJycpOyAvLyBNdXN0IGJlIHJ1bm5lZCBhZnRlcg0KCQkJCX0NCgkJCX0pOw0KDQoJCQllYWNoKHQuaXRlbXMsIGZ1bmN0aW9uKG8pIHsNCgkJCQkvLyBObyB2YWx1ZSB0aGVuIHRyZWF0IGl0IGFzIGEgdGl0bGUNCgkJCQlpZiAoby52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7DQoJCQkJCW0uYWRkKHsNCgkJCQkJCXRpdGxlIDogby50aXRsZSwNCgkJCQkJCSdjbGFzcycgOiAnbWNlTWVudUl0ZW1UaXRsZScsDQoJCQkJCQlvbmNsaWNrIDogZnVuY3Rpb24oKSB7DQoJCQkJCQkJaWYgKHQuc2V0dGluZ3Mub25zZWxlY3QoJycpICE9PSBmYWxzZSkNCgkJCQkJCQkJdC5zZWxlY3QoJycpOyAvLyBNdXN0IGJlIHJ1bm5lZCBhZnRlcg0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlvLmlkID0gRE9NLnVuaXF1ZUlkKCk7DQoJCQkJCW8ub25jbGljayA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJaWYgKHQuc2V0dGluZ3Mub25zZWxlY3Qoby52YWx1ZSkgIT09IGZhbHNlKQ0KCQkJCQkJCXQuc2VsZWN0KG8udmFsdWUpOyAvLyBNdXN0IGJlIHJ1bm5lZCBhZnRlcg0KCQkJCQl9Ow0KDQoJCQkJCW0uYWRkKG8pOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQl0Lm9uUmVuZGVyTWVudS5kaXNwYXRjaCh0LCBtKTsNCgkJCXQubWVudSA9IG07DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFBvc3QgcmVuZGVyIGV2ZW50LiBUaGlzIHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGNvbnRyb2wgaGFzIGJlZW4gcmVuZGVyZWQgYW5kIGNhbiBiZSB1c2VkIHRvDQoJCSAqIHNldCBzdGF0ZXMsIGFkZCBldmVudHMgdG8gdGhlIGNvbnRyb2wgZXRjLiBJdCdzIHJlY29tbWVuZGVkIGZvciBzdWJjbGFzc2VzIG9mIHRoZSBjb250cm9sIHRvIGNhbGwgdGhpcyBtZXRob2QgYnkgdXNpbmcgdGhpcy5wYXJlbnQoKS4NCgkJICoNCgkJICogQG1ldGhvZCBwb3N0UmVuZGVyDQoJCSAqLw0KCQlwb3N0UmVuZGVyIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNwID0gdC5jbGFzc1ByZWZpeDsNCg0KCQkJRXZlbnQuYWRkKHQuaWQsICdjbGljaycsIHQuc2hvd01lbnUsIHQpOw0KCQkJRXZlbnQuYWRkKHQuaWQgKyAnX3RleHQnLCAnZm9jdXMnLCBmdW5jdGlvbigpIHsNCgkJCQlpZiAoIXQuX2ZvY3VzZWQpIHsNCgkJCQkJdC5rZXlEb3duSGFuZGxlciA9IEV2ZW50LmFkZCh0LmlkICsgJ190ZXh0JywgJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7DQoJCQkJCQl2YXIgaWR4ID0gLTEsIHYsIGtjID0gZS5rZXlDb2RlOw0KDQoJCQkJCQkvLyBGaW5kIGN1cnJlbnQgaW5kZXgNCgkJCQkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24odiwgaSkgew0KCQkJCQkJCWlmICh0LnNlbGVjdGVkVmFsdWUgPT0gdi52YWx1ZSkNCgkJCQkJCQkJaWR4ID0gaTsNCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBNb3ZlIHVwL2Rvd24NCgkJCQkJCWlmIChrYyA9PSAzOCkNCgkJCQkJCQl2ID0gdC5pdGVtc1tpZHggLSAxXTsNCgkJCQkJCWVsc2UgaWYgKGtjID09IDQwKQ0KCQkJCQkJCXYgPSB0Lml0ZW1zW2lkeCArIDFdOw0KCQkJCQkJZWxzZSBpZiAoa2MgPT0gMTMpIHsNCgkJCQkJCQkvLyBGYWtlIHNlbGVjdCBvbiBlbnRlcg0KCQkJCQkJCXYgPSB0LnNlbGVjdGVkVmFsdWU7DQoJCQkJCQkJdC5zZWxlY3RlZFZhbHVlID0gbnVsbDsgLy8gTmVlZHMgdG8gYmUgbnVsbCB0byBmYWtlIGNoYW5nZQ0KCQkJCQkJCXQuc2V0dGluZ3Mub25zZWxlY3Qodik7DQoJCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQkJCX0NCg0KCQkJCQkJaWYgKHYpIHsNCgkJCQkJCQl0LmhpZGVNZW51KCk7DQoJCQkJCQkJdC5zZWxlY3Qodi52YWx1ZSk7DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0NCg0KCQkJCXQuX2ZvY3VzZWQgPSAxOw0KCQkJfSk7DQoJCQlFdmVudC5hZGQodC5pZCArICdfdGV4dCcsICdibHVyJywgZnVuY3Rpb24oKSB7RXZlbnQucmVtb3ZlKHQuaWQgKyAnX3RleHQnLCAna2V5ZG93bicsIHQua2V5RG93bkhhbmRsZXIpOyB0Ll9mb2N1c2VkID0gMDt9KTsNCg0KCQkJLy8gT2xkIElFIGRvZXNuJ3QgaGF2ZSBob3ZlciBvbiBhbGwgZWxlbWVudHMNCgkJCWlmICh0aW55bWNlLmlzSUU2IHx8ICFET00uYm94TW9kZWwpIHsNCgkJCQlFdmVudC5hZGQodC5pZCwgJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoIURPTS5oYXNDbGFzcyh0LmlkLCBjcCArICdEaXNhYmxlZCcpKQ0KCQkJCQkJRE9NLmFkZENsYXNzKHQuaWQsIGNwICsgJ0hvdmVyJyk7DQoJCQkJfSk7DQoNCgkJCQlFdmVudC5hZGQodC5pZCwgJ21vdXNlb3V0JywgZnVuY3Rpb24oKSB7DQoJCQkJCWlmICghRE9NLmhhc0NsYXNzKHQuaWQsIGNwICsgJ0Rpc2FibGVkJykpDQoJCQkJCQlET00ucmVtb3ZlQ2xhc3ModC5pZCwgY3AgKyAnSG92ZXInKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJdC5vblBvc3RSZW5kZXIuZGlzcGF0Y2godCwgRE9NLmdldCh0LmlkKSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIERlc3Ryb3lzIHRoZSBMaXN0Qm94IGkuZS4gY2xlYXIgbWVtb3J5IGFuZCBldmVudHMuDQoJCSAqDQoJCSAqIEBtZXRob2QgZGVzdHJveQ0KCQkgKi8NCgkJZGVzdHJveSA6IGZ1bmN0aW9uKCkgew0KCQkJdGhpcy5wYXJlbnQoKTsNCg0KCQkJRXZlbnQuY2xlYXIodGhpcy5pZCArICdfdGV4dCcpOw0KCQkJRXZlbnQuY2xlYXIodGhpcy5pZCArICdfb3BlbicpOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/Menu.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBNZW51LmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgaXMgPSB0aW55bWNlLmlzLCBET00gPSB0aW55bWNlLkRPTSwgZWFjaCA9IHRpbnltY2UuZWFjaCwgd2FsayA9IHRpbnltY2Uud2FsazsNCg0KCS8qKg0KCSAqIFRoaXMgY2xhc3MgaXMgYmFzZSBjbGFzcyBmb3IgYWxsIG1lbnUgdHlwZXMgbGlrZSBEcm9wTWVudXMgZXRjLiBUaGlzIGNsYXNzIHNob3VsZCBub3QNCgkgKiBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkgb3RoZXIgbWVudSBjb250cm9scyBzaG91bGQgaW5oZXJpdCBmcm9tIHRoaXMgb25lLg0KCSAqDQoJICogQGNsYXNzIHRpbnltY2UudWkuTWVudQ0KCSAqIEBleHRlbmRzIHRpbnltY2UudWkuTWVudUl0ZW0NCgkgKi8NCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5NZW51OnRpbnltY2UudWkuTWVudUl0ZW0nLCB7DQoJCS8qKg0KCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1dHRvbiBjb250cm9sIGluc3RhbmNlLg0KCQkgKg0KCQkgKiBAY29uc3RydWN0b3INCgkJICogQG1ldGhvZCBNZW51DQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBpZCBCdXR0b24gY29udHJvbCBpZCBmb3IgdGhlIGJ1dHRvbi4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgbmFtZS92YWx1ZSBzZXR0aW5ncyBvYmplY3QuDQoJCSAqLw0KCQlNZW51IDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5wYXJlbnQoaWQsIHMpOw0KCQkJdC5pdGVtcyA9IHt9Ow0KCQkJdC5jb2xsYXBzZWQgPSBmYWxzZTsNCgkJCXQubWVudUNvdW50ID0gMDsNCgkJCXQub25BZGRJdGVtID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBFeHBhbmRzIHRoZSBtZW51LCB0aGlzIHdpbGwgc2hvdyB0aGVtIG1lbnUgYW5kIGFsbCBtZW51IGl0ZW1zLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGV4cGFuZA0KCQkgKiBAcGFyYW0ge0Jvb2xlYW59IGQgT3B0aW9uYWwgZGVlcCBzdGF0ZS4gSWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZSBhbGwgY2hpbGRyZW4gd2lsbCBiZSBleHBhbmRlZCBhcyB3ZWxsLg0KCQkgKi8NCgkJZXhwYW5kIDogZnVuY3Rpb24oZCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoZCkgew0KCQkJCXdhbGsodCwgZnVuY3Rpb24obykgew0KCQkJCQlpZiAoby5leHBhbmQpDQoJCQkJCQlvLmV4cGFuZCgpOw0KCQkJCX0sICdpdGVtcycsIHQpOw0KCQkJfQ0KDQoJCQl0LmNvbGxhcHNlZCA9IGZhbHNlOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDb2xsYXBzZXMgdGhlIG1lbnUsIHRoaXMgd2lsbCBoaWRlIHRoZSBtZW51IGFuZCBhbGwgbWVudSBpdGVtcy4NCgkJICoNCgkJICogQG1ldGhvZCBjb2xsYXBzZQ0KCQkgKiBAcGFyYW0ge0Jvb2xlYW59IGQgT3B0aW9uYWwgZGVlcCBzdGF0ZS4gSWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZSBhbGwgY2hpbGRyZW4gd2lsbCBiZSBjb2xsYXBzZWQgYXMgd2VsbC4NCgkJICovDQoJCWNvbGxhcHNlIDogZnVuY3Rpb24oZCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoZCkgew0KCQkJCXdhbGsodCwgZnVuY3Rpb24obykgew0KCQkJCQlpZiAoby5jb2xsYXBzZSkNCgkJCQkJCW8uY29sbGFwc2UoKTsNCgkJCQl9LCAnaXRlbXMnLCB0KTsNCgkJCX0NCg0KCQkJdC5jb2xsYXBzZWQgPSB0cnVlOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRydWUvZmFsc2UgaWYgdGhlIG1lbnUgaGFzIGJlZW4gY29sbGFwc2VkIG9yIG5vdC4NCgkJICoNCgkJICogQG1ldGhvZCBpc0NvbGxhcHNlZA0KCQkgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlL2ZhbHNlIHN0YXRlIGlmIHRoZSBtZW51IGhhcyBiZWVuIGNvbGxhcHNlZCBvciBub3QuDQoJCSAqLw0KCQlpc0NvbGxhcHNlZCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuY29sbGFwc2VkOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBBZGRzIGEgbmV3IG1lbnUsIG1lbnUgaXRlbSBvciBzdWIgY2xhc3NlcyBvZiB0aGVtIHRvIHRoZSBkcm9wIG1lbnUuDQoJCSAqDQoJCSAqIEBtZXRob2QgYWRkDQoJCSAqIEBwYXJhbSB7dGlueW1jZS51aS5Db250cm9sfSBvIE1lbnUgb3IgbWVudSBpdGVtIHRvIGFkZCB0byB0aGUgZHJvcCBtZW51Lg0KCQkgKiBAcmV0dXJuIHt0aW55bWNlLnVpLkNvbnRyb2x9IFNhbWUgYXMgdGhlIGlucHV0IGNvbnRyb2wsIHRoZSBtZW51IG9yIG1lbnUgaXRlbS4NCgkJICovDQoJCWFkZCA6IGZ1bmN0aW9uKG8pIHsNCgkJCWlmICghby5zZXR0aW5ncykNCgkJCQlvID0gbmV3IHRpbnltY2UudWkuTWVudUl0ZW0oby5pZCB8fCBET00udW5pcXVlSWQoKSwgbyk7DQoNCgkJCXRoaXMub25BZGRJdGVtLmRpc3BhdGNoKHRoaXMsIG8pOw0KDQoJCQlyZXR1cm4gdGhpcy5pdGVtc1tvLmlkXSA9IG87DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEFkZHMgYSBtZW51IHNlcGFyYXRvciBiZXR3ZWVuIHRoZSBtZW51IGl0ZW1zLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGFkZFNlcGFyYXRvcg0KCQkgKiBAcmV0dXJuIHt0aW55bWNlLnVpLk1lbnVJdGVtfSBNZW51IGl0ZW0gaW5zdGFuY2UgZm9yIHRoZSBzZXBhcmF0b3IuDQoJCSAqLw0KCQlhZGRTZXBhcmF0b3IgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLmFkZCh7c2VwYXJhdG9yIDogdHJ1ZX0pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBBZGRzIGEgc3ViIG1lbnUgdG8gdGhlIG1lbnUuDQoJCSAqDQoJCSAqIEBtZXRob2QgYWRkTWVudQ0KCQkgKiBAcGFyYW0ge09iamVjdH0gbyBNZW51IGNvbnRyb2wgb3IgYSBvYmplY3Qgd2l0aCBzZXR0aW5ncyB0byBiZSBjcmVhdGVkIGludG8gYW4gY29udHJvbC4NCgkJICogQHJldHVybiB7dGlueW1jZS51aS5NZW51fSBNZW51IGNvbnRyb2wgaW5zdGFuY2UgcGFzc2VkIGluIG9yIGNyZWF0ZWQuDQoJCSAqLw0KCQlhZGRNZW51IDogZnVuY3Rpb24obykgew0KCQkJaWYgKCFvLmNvbGxhcHNlKQ0KCQkJCW8gPSB0aGlzLmNyZWF0ZU1lbnUobyk7DQoNCgkJCXRoaXMubWVudUNvdW50Kys7DQoNCgkJCXJldHVybiB0aGlzLmFkZChvKTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0cnVlL2ZhbHNlIGlmIHRoZSBtZW51IGhhcyBzdWIgbWVudXMgb3Igbm90Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIGhhc01lbnVzDQoJCSAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUvZmFsc2Ugc3RhdGUgaWYgdGhlIG1lbnUgaGFzIHN1YiBtZW51ZXMgb3Igbm90Lg0KCQkgKi8NCgkJaGFzTWVudXMgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLm1lbnVDb3VudCAhPT0gMDsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVtb3ZlcyBhIHNwZWNpZmljIHN1YiBtZW51IG9yIG1lbnUgaXRlbSBmcm9tIHRoZSBtZW51Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIHJlbW92ZQ0KCQkgKiBAcGFyYW0ge3RpbnltY2UudWkuQ29udHJvbH0gbyBNZW51IGl0ZW0gb3IgbWVudSB0byByZW1vdmUgZnJvbSBtZW51Lg0KCQkgKiBAcmV0dXJuIHt0aW55bWNlLnVpLkNvbnRyb2x9IENvbnRyb2wgaW5zdGFuY2Ugb3IgbnVsbCBpZiBpdCB3YXNuJ3QgZm91bmQuDQoJCSAqLw0KCQlyZW1vdmUgOiBmdW5jdGlvbihvKSB7DQoJCQlkZWxldGUgdGhpcy5pdGVtc1tvLmlkXTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVtb3ZlcyBhbGwgbWVudSBpdGVtcyBhbmQgc3ViIG1lbnUgaXRlbXMgZnJvbSB0aGUgbWVudS4NCgkJICoNCgkJICogQG1ldGhvZCByZW1vdmVBbGwNCgkJICovDQoJCXJlbW92ZUFsbCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl3YWxrKHQsIGZ1bmN0aW9uKG8pIHsNCgkJCQlpZiAoby5yZW1vdmVBbGwpDQoJCQkJCW8ucmVtb3ZlQWxsKCk7DQoJCQkJZWxzZQ0KCQkJCQlvLnJlbW92ZSgpOw0KDQoJCQkJby5kZXN0cm95KCk7DQoJCQl9LCAnaXRlbXMnLCB0KTsNCg0KCQkJdC5pdGVtcyA9IHt9Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDcmVhdGVkIGEgbmV3IHN1YiBtZW51IGZvciB0aGUgbWVudSBjb250cm9sLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGNyZWF0ZU1lbnUNCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgbmFtZS92YWx1ZSBzZXR0aW5ncyBvYmplY3QuDQoJCSAqIEByZXR1cm4ge3RpbnltY2UudWkuTWVudX0gTmV3IGRyb3AgbWVudSBpbnN0YW5jZS4NCgkJICovDQoJCWNyZWF0ZU1lbnUgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgbSA9IG5ldyB0aW55bWNlLnVpLk1lbnUoby5pZCB8fCBET00udW5pcXVlSWQoKSwgbyk7DQoNCgkJCW0ub25BZGRJdGVtLmFkZCh0aGlzLm9uQWRkSXRlbS5kaXNwYXRjaCwgdGhpcy5vbkFkZEl0ZW0pOw0KDQoJCQlyZXR1cm4gbTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/MenuButton.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBNZW51QnV0dG9uLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgkvKioNCgkgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIGEgVUkgYnV0dG9uLiBBIGJ1dHRvbiBpcyBiYXNpY2FsbHkgYSBsaW5rDQoJICogdGhhdCBpcyBzdHlsZWQgdG8gbG9vayBsaWtlIGEgYnV0dG9uIG9yIGljb24uDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS51aS5NZW51QnV0dG9uDQoJICogQGV4dGVuZHMgdGlueW1jZS51aS5Db250cm9sDQoJICovDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuTWVudUJ1dHRvbjp0aW55bWNlLnVpLkJ1dHRvbicsIHsNCgkJLyoqDQoJCSAqIENvbnN0cnVjdHMgYSBuZXcgc3BsaXQgYnV0dG9uIGNvbnRyb2wgaW5zdGFuY2UuDQoJCSAqDQoJCSAqIEBjb25zdHJ1Y3Rvcg0KCQkgKiBAbWV0aG9kIE1lbnVCdXR0b24NCgkJICogQHBhcmFtIHtTdHJpbmd9IGlkIENvbnRyb2wgaWQgZm9yIHRoZSBzcGxpdCBidXR0b24uDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIG5hbWUvdmFsdWUgc2V0dGluZ3Mgb2JqZWN0Lg0KCQkgKi8NCgkJTWVudUJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl0aGlzLnBhcmVudChpZCwgcyk7DQoNCgkJCS8qKg0KCQkJICogRmlyZXMgd2hlbiB0aGUgbWVudSBpcyByZW5kZXJlZC4NCgkJCSAqDQoJCQkgKiBAZXZlbnQgb25SZW5kZXJNZW51DQoJCQkgKi8NCgkJCXRoaXMub25SZW5kZXJNZW51ID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpOw0KDQoJCQlzLm1lbnVfY29udGFpbmVyID0gcy5tZW51X2NvbnRhaW5lciB8fCBET00uZG9jLmJvZHk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFNob3dzIHRoZSBtZW51Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNob3dNZW51DQoJCSAqLw0KCQlzaG93TWVudSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBwMSwgcDIsIGUgPSBET00uZ2V0KHQuaWQpLCBtOw0KDQoJCQlpZiAodC5pc0Rpc2FibGVkKCkpDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiAoIXQuaXNNZW51UmVuZGVyZWQpIHsNCgkJCQl0LnJlbmRlck1lbnUoKTsNCgkJCQl0LmlzTWVudVJlbmRlcmVkID0gdHJ1ZTsNCgkJCX0NCg0KCQkJaWYgKHQuaXNNZW51VmlzaWJsZSkNCgkJCQlyZXR1cm4gdC5oaWRlTWVudSgpOw0KDQoJCQlwMSA9IERPTS5nZXRQb3ModC5zZXR0aW5ncy5tZW51X2NvbnRhaW5lcik7DQoJCQlwMiA9IERPTS5nZXRQb3MoZSk7DQoNCgkJCW0gPSB0Lm1lbnU7DQoJCQltLnNldHRpbmdzLm9mZnNldF94ID0gcDIueDsNCgkJCW0uc2V0dGluZ3Mub2Zmc2V0X3kgPSBwMi55Ow0KCQkJbS5zZXR0aW5ncy52cF9vZmZzZXRfeCA9IHAyLng7DQoJCQltLnNldHRpbmdzLnZwX29mZnNldF95ID0gcDIueTsNCgkJCW0uc2V0dGluZ3Mua2V5Ym9hcmRfZm9jdXMgPSB0Ll9mb2N1c2VkOw0KCQkJbS5zaG93TWVudSgwLCBlLmNsaWVudEhlaWdodCk7DQoNCgkJCUV2ZW50LmFkZChET00uZG9jLCAnbW91c2Vkb3duJywgdC5oaWRlTWVudSwgdCk7DQoJCQl0LnNldFN0YXRlKCdTZWxlY3RlZCcsIDEpOw0KDQoJCQl0LmlzTWVudVZpc2libGUgPSAxOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZW5kZXJzIHRoZSBtZW51IHRvIHRoZSBET00uDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVuZGVyTWVudQ0KCQkgKi8NCgkJcmVuZGVyTWVudSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBtOw0KDQoJCQltID0gdC5zZXR0aW5ncy5jb250cm9sX21hbmFnZXIuY3JlYXRlRHJvcE1lbnUodC5pZCArICdfbWVudScsIHsNCgkJCQltZW51X2xpbmUgOiAxLA0KCQkJCSdjbGFzcycgOiB0aGlzLmNsYXNzUHJlZml4ICsgJ01lbnUnLA0KCQkJCWljb25zIDogdC5zZXR0aW5ncy5pY29ucw0KCQkJfSk7DQoNCgkJCW0ub25IaWRlTWVudS5hZGQodC5oaWRlTWVudSwgdCk7DQoNCgkJCXQub25SZW5kZXJNZW51LmRpc3BhdGNoKHQsIG0pOw0KCQkJdC5tZW51ID0gbTsNCgkJfSwNCg0KCQkvKioNCgkJICogSGlkZXMgdGhlIG1lbnUuIFRoZSBvcHRpb25hbCBldmVudCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBjaGVjayB3aGVyZSB0aGUgZXZlbnQgb2NjdXJlZCBzbyBpdA0KCQkgKiBkb2Vzbid0IGNsb3NlIHRoZW0gbWVudSBpZiBpdCB3YXMgYSBldmVudCBpbnNpZGUgdGhlIG1lbnUuDQoJCSAqDQoJCSAqIEBtZXRob2QgaGlkZU1lbnUNCgkJICogQHBhcmFtIHtFdmVudH0gZSBPcHRpb25hbCBldmVudCBvYmplY3QuDQoJCSAqLw0KCQloaWRlTWVudSA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJLy8gUHJldmVudCBkb3VibGUgdG9vZ2xlcyBieSBjYW5jZWxpbmcgdGhlIG1vdXNlIGNsaWNrIGV2ZW50IHRvIHRoZSBidXR0b24NCgkJCWlmIChlICYmIGUudHlwZSA9PSAibW91c2Vkb3duIiAmJiBET00uZ2V0UGFyZW50KGUudGFyZ2V0LCBmdW5jdGlvbihlKSB7cmV0dXJuIGUuaWQgPT09IHQuaWQgfHwgZS5pZCA9PT0gdC5pZCArICdfb3Blbic7fSkpDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiAoIWUgfHwgIURPTS5nZXRQYXJlbnQoZS50YXJnZXQsICcubWNlTWVudScpKSB7DQoJCQkJdC5zZXRTdGF0ZSgnU2VsZWN0ZWQnLCAwKTsNCgkJCQlFdmVudC5yZW1vdmUoRE9NLmRvYywgJ21vdXNlZG93bicsIHQuaGlkZU1lbnUsIHQpOw0KCQkJCWlmICh0Lm1lbnUpDQoJCQkJCXQubWVudS5oaWRlTWVudSgpOw0KCQkJfQ0KDQoJCQl0LmlzTWVudVZpc2libGUgPSAwOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBQb3N0IHJlbmRlciBoYW5kbGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBVSSBoYXMgYmVlbg0KCQkgKiByZW5kZXJlZCBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQuDQoJCSAqDQoJCSAqIEBtZXRob2QgcG9zdFJlbmRlcg0KCQkgKi8NCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJRXZlbnQuYWRkKHQuaWQsICdjbGljaycsIGZ1bmN0aW9uKCkgew0KCQkJCWlmICghdC5pc0Rpc2FibGVkKCkpIHsNCgkJCQkJaWYgKHMub25jbGljaykNCgkJCQkJCXMub25jbGljayh0LnZhbHVlKTsNCg0KCQkJCQl0LnNob3dNZW51KCk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/MenuItem.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBNZW51SXRlbS5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIGlzID0gdGlueW1jZS5pcywgRE9NID0gdGlueW1jZS5ET00sIGVhY2ggPSB0aW55bWNlLmVhY2gsIHdhbGsgPSB0aW55bWNlLndhbGs7DQoNCgkvKioNCgkgKiBUaGlzIGNsYXNzIGlzIGJhc2UgY2xhc3MgZm9yIGFsbCBtZW51IGl0ZW0gdHlwZXMgbGlrZSBEcm9wTWVudXMgaXRlbXMgZXRjLiBUaGlzIGNsYXNzIHNob3VsZCBub3QNCgkgKiBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkgb3RoZXIgbWVudSBpdGVtcyBzaG91bGQgaW5oZXJpdCBmcm9tIHRoaXMgb25lLg0KCSAqDQoJICogQGNsYXNzIHRpbnltY2UudWkuTWVudUl0ZW0NCgkgKiBAZXh0ZW5kcyB0aW55bWNlLnVpLkNvbnRyb2wNCgkgKi8NCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5NZW51SXRlbTp0aW55bWNlLnVpLkNvbnRyb2wnLCB7DQoJCS8qKg0KCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1dHRvbiBjb250cm9sIGluc3RhbmNlLg0KCQkgKg0KCQkgKiBAY29uc3RydWN0b3INCgkJICogQG1ldGhvZCBNZW51SXRlbQ0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWQgQnV0dG9uIGNvbnRyb2wgaWQgZm9yIHRoZSBidXR0b24uDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIG5hbWUvdmFsdWUgc2V0dGluZ3Mgb2JqZWN0Lg0KCQkgKi8NCgkJTWVudUl0ZW0gOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQkJdGhpcy5jbGFzc1ByZWZpeCA9ICdtY2VNZW51SXRlbSc7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFNldHMgdGhlIHNlbGVjdGVkIHN0YXRlIGZvciB0aGUgY29udHJvbC4gVGhpcyB3aWxsIGFkZCBDU1MgY2xhc3NlcyB0byB0aGUNCgkJICogZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBjb250cm9sLiBTbyB0aGF0IGl0IGNhbiBiZSBzZWxlY3RlZCB2aXN1YWxseS4NCgkJICoNCgkJICogQG1ldGhvZCBzZXRTZWxlY3RlZA0KCQkgKiBAcGFyYW0ge0Jvb2xlYW59IHMgQm9vbGVhbiBzdGF0ZSBpZiB0aGUgY29udHJvbCBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90Lg0KCQkgKi8NCgkJc2V0U2VsZWN0ZWQgOiBmdW5jdGlvbihzKSB7DQoJCQl0aGlzLnNldFN0YXRlKCdTZWxlY3RlZCcsIHMpOw0KCQkJdGhpcy5zZWxlY3RlZCA9IHM7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgdHJ1ZS9mYWxzZSBpZiB0aGUgY29udHJvbCBpcyBzZWxlY3RlZCBvciBub3QuDQoJCSAqDQoJCSAqIEBtZXRob2QgaXNTZWxlY3RlZA0KCQkgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlL2ZhbHNlIGlmIHRoZSBjb250cm9sIGlzIHNlbGVjdGVkIG9yIG5vdC4NCgkJICovDQoJCWlzU2VsZWN0ZWQgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLnNlbGVjdGVkOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBQb3N0IHJlbmRlciBoYW5kbGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBVSSBoYXMgYmVlbg0KCQkgKiByZW5kZXJlZCBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQuDQoJCSAqDQoJCSAqIEBtZXRob2QgcG9zdFJlbmRlcg0KCQkgKi8NCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KCQkJDQoJCQl0LnBhcmVudCgpOw0KDQoJCQkvLyBTZXQgcGVuZGluZyBzdGF0ZQ0KCQkJaWYgKGlzKHQuc2VsZWN0ZWQpKQ0KCQkJCXQuc2V0U2VsZWN0ZWQodC5zZWxlY3RlZCk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/NativeListBox.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBOYXRpdmVMaXN0Qm94LmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIGVhY2ggPSB0aW55bWNlLmVhY2gsIERpc3BhdGNoZXIgPSB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcjsNCg0KCS8qKg0KCSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgbGlzdCBib3hlcy9zZWxlY3QgbGlzdC4gVGhpcyBvbmUgd2lsbCBnZW5lcmF0ZQ0KCSAqIGEgbmF0aXZlIGNvbnRyb2wgdGhlIHdheSB0aGF0IHRoZSBicm93c2VyIHByb2R1Y2VzIHRoZW0gYnkgZGVmYXVsdC4NCgkgKg0KCSAqIEBjbGFzcyB0aW55bWNlLnVpLk5hdGl2ZUxpc3RCb3gNCgkgKiBAZXh0ZW5kcyB0aW55bWNlLnVpLkxpc3RCb3gNCgkgKi8NCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5OYXRpdmVMaXN0Qm94OnRpbnltY2UudWkuTGlzdEJveCcsIHsNCgkJLyoqDQoJCSAqIENvbnN0cnVjdHMgYSBuZXcgYnV0dG9uIGNvbnRyb2wgaW5zdGFuY2UuDQoJCSAqDQoJCSAqIEBjb25zdHJ1Y3Rvcg0KCQkgKiBAbWV0aG9kIE5hdGl2ZUxpc3RCb3gNCgkJICogQHBhcmFtIHtTdHJpbmd9IGlkIEJ1dHRvbiBjb250cm9sIGlkIGZvciB0aGUgYnV0dG9uLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBuYW1lL3ZhbHVlIHNldHRpbmdzIG9iamVjdC4NCgkJICovDQoJCU5hdGl2ZUxpc3RCb3ggOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQkJdGhpcy5jbGFzc1ByZWZpeCA9ICdtY2VOYXRpdmVMaXN0Qm94JzsNCgkJfSwNCg0KCQkvKioNCgkJICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgZm9yIHRoZSBjb250cm9sLiBUaGlzIHdpbGwgYWRkIENTUyBjbGFzc2VzIHRvIHRoZQ0KCQkgKiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGNvbnRyb2wuIFNvIHRoYXQgaXQgY2FuIGJlIGRpc2FibGVkIHZpc3VhbGx5Lg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldERpc2FibGVkDQoJCSAqIEBwYXJhbSB7Qm9vbGVhbn0gcyBCb29sZWFuIHN0YXRlIGlmIHRoZSBjb250cm9sIHNob3VsZCBiZSBkaXNhYmxlZCBvciBub3QuDQoJCSAqLw0KCQlzZXREaXNhYmxlZCA6IGZ1bmN0aW9uKHMpIHsNCgkJCURPTS5nZXQodGhpcy5pZCkuZGlzYWJsZWQgPSBzOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIHRydWUvZmFsc2UgaWYgdGhlIGNvbnRyb2wgaXMgZGlzYWJsZWQgb3Igbm90LiBUaGlzIGlzIGEgbWV0aG9kIHNpbmNlIHlvdSBjYW4gdGhlbg0KCQkgKiBjaG9vc2UgdG8gY2hlY2sgc29tZSBjbGFzcyBvciBzb21lIGludGVybmFsIGJvb2wgc3RhdGUgaW4gc3ViY2xhc3Nlcy4NCgkJICoNCgkJICogQG1ldGhvZCBpc0Rpc2FibGVkDQoJCSAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUvZmFsc2UgaWYgdGhlIGNvbnRyb2wgaXMgZGlzYWJsZWQgb3Igbm90Lg0KCQkgKi8NCgkJaXNEaXNhYmxlZCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIERPTS5nZXQodGhpcy5pZCkuZGlzYWJsZWQ7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFNlbGVjdHMgYSBpdGVtL29wdGlvbiBieSB2YWx1ZS4gVGhpcyB3aWxsIGJvdGggYWRkIGEgdmlzdWFsIHNlbGVjdGlvbiB0byB0aGUNCgkJICogaXRlbSBhbmQgY2hhbmdlIHRoZSB0aXRsZSBvZiB0aGUgY29udHJvbCB0byB0aGUgdGl0bGUgb2YgdGhlIG9wdGlvbi4NCgkJICoNCgkJICogQG1ldGhvZCBzZWxlY3QNCgkJICogQHBhcmFtIHtTdHJpbmcvZnVuY3Rpb259IHZhIFZhbHVlIHRvIGxvb2sgZm9yIGluc2lkZSB0aGUgbGlzdCBib3ggb3IgYSBmdW5jdGlvbiBzZWxlY3Rvci4NCgkJICovDQoJCXNlbGVjdCA6IGZ1bmN0aW9uKHZhKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGZ2LCBmOw0KDQoJCQlpZiAodmEgPT0gdW5kZWZpbmVkKQ0KCQkJCXJldHVybiB0LnNlbGVjdEJ5SW5kZXgoLTEpOw0KDQoJCQkvLyBJcyBzdHJpbmcgb3IgbnVtYmVyIG1ha2UgZnVuY3Rpb24gc2VsZWN0b3INCgkJCWlmICh2YSAmJiB2YS5jYWxsKQ0KCQkJCWYgPSB2YTsNCgkJCWVsc2Ugew0KCQkJCWYgPSBmdW5jdGlvbih2KSB7DQoJCQkJCXJldHVybiB2ID09IHZhOw0KCQkJCX07DQoJCQl9DQoNCgkJCS8vIERvIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nPw0KCQkJaWYgKHZhICE9IHQuc2VsZWN0ZWRWYWx1ZSkgew0KCQkJCS8vIEZpbmQgaXRlbQ0KCQkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24obywgaSkgew0KCQkJCQlpZiAoZihvLnZhbHVlKSkgew0KCQkJCQkJZnYgPSAxOw0KCQkJCQkJdC5zZWxlY3RCeUluZGV4KGkpOw0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQlpZiAoIWZ2KQ0KCQkJCQl0LnNlbGVjdEJ5SW5kZXgoLTEpOw0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZWxlY3RzIGEgaXRlbS9vcHRpb24gYnkgaW5kZXguIFRoaXMgd2lsbCBib3RoIGFkZCBhIHZpc3VhbCBzZWxlY3Rpb24gdG8gdGhlDQoJCSAqIGl0ZW0gYW5kIGNoYW5nZSB0aGUgdGl0bGUgb2YgdGhlIGNvbnRyb2wgdG8gdGhlIHRpdGxlIG9mIHRoZSBvcHRpb24uDQoJCSAqDQoJCSAqIEBtZXRob2Qgc2VsZWN0QnlJbmRleA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gaWR4IEluZGV4IHRvIHNlbGVjdCwgcGFzcyAtMSB0byBzZWxlY3QgbWVudS90aXRsZSBvZiBzZWxlY3QgYm94Lg0KCQkgKi8NCgkJc2VsZWN0QnlJbmRleCA6IGZ1bmN0aW9uKGlkeCkgew0KCQkJRE9NLmdldCh0aGlzLmlkKS5zZWxlY3RlZEluZGV4ID0gaWR4ICsgMTsNCgkJCXRoaXMuc2VsZWN0ZWRWYWx1ZSA9IHRoaXMuaXRlbXNbaWR4XSA/IHRoaXMuaXRlbXNbaWR4XS52YWx1ZSA6IG51bGw7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIEFkZHMgYSBvcHRpb24gaXRlbSB0byB0aGUgbGlzdCBib3guDQoJCSAqDQoJCSAqIEBtZXRob2QgYWRkDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIFRpdGxlIGZvciB0aGUgbmV3IG9wdGlvbi4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHYgVmFsdWUgZm9yIHRoZSBuZXcgb3B0aW9uLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gbyBPcHRpb25hbCBvYmplY3Qgd2l0aCBzZXR0aW5ncyBsaWtlIGZvciBleGFtcGxlIGNsYXNzLg0KCQkgKi8NCgkJYWRkIDogZnVuY3Rpb24obiwgdiwgYSkgew0KCQkJdmFyIG8sIHQgPSB0aGlzOw0KDQoJCQlhID0gYSB8fCB7fTsNCgkJCWEudmFsdWUgPSB2Ow0KDQoJCQlpZiAodC5pc1JlbmRlcmVkKCkpDQoJCQkJRE9NLmFkZChET00uZ2V0KHRoaXMuaWQpLCAnb3B0aW9uJywgYSwgbik7DQoNCgkJCW8gPSB7DQoJCQkJdGl0bGUgOiBuLA0KCQkJCXZhbHVlIDogdiwNCgkJCQlhdHRyaWJzIDogYQ0KCQkJfTsNCg0KCQkJdC5pdGVtcy5wdXNoKG8pOw0KCQkJdC5vbkFkZC5kaXNwYXRjaCh0LCBvKTsNCgkJfSwNCg0KCQkvKioNCgkJICogRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIG1lbnUgaXRlbS4gSW4gdGhpcyBjYXNlIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBtZW51IGl0ZW0uDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0TGVuZ3RoDQoJCSAqLw0KCQlnZXRMZW5ndGggOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLml0ZW1zLmxlbmd0aDsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVuZGVycyB0aGUgbGlzdCBib3ggYXMgYSBIVE1MIHN0cmluZy4gVGhpcyBtZXRob2QgaXMgbXVjaCBmYXN0ZXIgdGhhbiB1c2luZyB0aGUgRE9NIGFuZCB3aGVuDQoJCSAqIGNyZWF0aW5nIGEgd2hvbGUgdG9vbGJhciB3aXRoIGJ1dHRvbnMgaXQgZG9lcyBtYWtlIGEgbG90IG9mIGRpZmZlcmVuY2UuDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVuZGVySFRNTA0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgZm9yIHRoZSBsaXN0IGJveCBjb250cm9sIGVsZW1lbnQuDQoJCSAqLw0KCQlyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgaCwgdCA9IHRoaXM7DQoNCgkJCWggPSBET00uY3JlYXRlSFRNTCgnb3B0aW9uJywge3ZhbHVlIDogJyd9LCAnLS0gJyArIHQuc2V0dGluZ3MudGl0bGUgKyAnIC0tJyk7DQoNCgkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24oaXQpIHsNCgkJCQloICs9IERPTS5jcmVhdGVIVE1MKCdvcHRpb24nLCB7dmFsdWUgOiBpdC52YWx1ZX0sIGl0LnRpdGxlKTsNCgkJCX0pOw0KDQoJCQloID0gRE9NLmNyZWF0ZUhUTUwoJ3NlbGVjdCcsIHtpZCA6IHQuaWQsICdjbGFzcycgOiAnbWNlTmF0aXZlTGlzdEJveCd9LCBoKTsNCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFBvc3QgcmVuZGVyIGhhbmRsZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIFVJIGhhcyBiZWVuDQoJCSAqIHJlbmRlcmVkIHNvIHRoYXQgZXZlbnRzIGNhbiBiZSBhZGRlZC4NCgkJICoNCgkJICogQG1ldGhvZCBwb3N0UmVuZGVyDQoJCSAqLw0KCQlwb3N0UmVuZGVyIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNoOw0KDQoJCQl0LnJlbmRlcmVkID0gdHJ1ZTsNCg0KCQkJZnVuY3Rpb24gb25DaGFuZ2UoZSkgew0KCQkJCXZhciB2ID0gdC5pdGVtc1tlLnRhcmdldC5zZWxlY3RlZEluZGV4IC0gMV07DQoNCgkJCQlpZiAodiAmJiAodiA9IHYudmFsdWUpKSB7DQoJCQkJCXQub25DaGFuZ2UuZGlzcGF0Y2godCwgdik7DQoNCgkJCQkJaWYgKHQuc2V0dGluZ3Mub25zZWxlY3QpDQoJCQkJCQl0LnNldHRpbmdzLm9uc2VsZWN0KHYpOw0KCQkJCX0NCgkJCX07DQoNCgkJCUV2ZW50LmFkZCh0LmlkLCAnY2hhbmdlJywgb25DaGFuZ2UpOw0KDQoJCQkvLyBBY2Nlc3NpYmlsaXR5IGtleWhhbmRsZXINCgkJCUV2ZW50LmFkZCh0LmlkLCAna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgYmY7DQoNCgkJCQlFdmVudC5yZW1vdmUodC5pZCwgJ2NoYW5nZScsIGNoKTsNCg0KCQkJCWJmID0gRXZlbnQuYWRkKHQuaWQsICdibHVyJywgZnVuY3Rpb24oKSB7DQoJCQkJCUV2ZW50LmFkZCh0LmlkLCAnY2hhbmdlJywgb25DaGFuZ2UpOw0KCQkJCQlFdmVudC5yZW1vdmUodC5pZCwgJ2JsdXInLCBiZik7DQoJCQkJfSk7DQoNCgkJCQlpZiAoZS5rZXlDb2RlID09IDEzIHx8IGUua2V5Q29kZSA9PSAzMikgew0KCQkJCQlvbkNoYW5nZShlKTsNCgkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJdC5vblBvc3RSZW5kZXIuZGlzcGF0Y2godCwgRE9NLmdldCh0LmlkKSk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/Separator.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBTZXBhcmF0b3IuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQovKioNCiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgdmVydGljYWwgc2VwYXJhdG9yIGJldHdlZW4gb3RoZXIgY29udHJvbHMuDQogKg0KICogQGNsYXNzIHRpbnltY2UudWkuU2VwYXJhdG9yDQogKiBAZXh0ZW5kcyB0aW55bWNlLnVpLkNvbnRyb2wNCiAqLw0KdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuU2VwYXJhdG9yOnRpbnltY2UudWkuQ29udHJvbCcsIHsNCgkvKioNCgkgKiBTZXBhcmF0b3IgY29uc3RydWN0b3IuDQoJICoNCgkgKiBAY29uc3RydWN0b3INCgkgKiBAbWV0aG9kIFNlcGFyYXRvcg0KCSAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb250cm9sIGlkIHRvIHVzZSBmb3IgdGhlIFNlcGFyYXRvci4NCgkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBuYW1lL3ZhbHVlIHNldHRpbmdzIG9iamVjdC4NCgkgKi8NCglTZXBhcmF0b3IgOiBmdW5jdGlvbihpZCwgcykgew0KCQl0aGlzLnBhcmVudChpZCwgcyk7DQoJCXRoaXMuY2xhc3NQcmVmaXggPSAnbWNlU2VwYXJhdG9yJzsNCgl9LA0KDQoJLyoqDQoJICogUmVuZGVycyB0aGUgc2VwYXJhdG9yIGFzIGEgSFRNTCBzdHJpbmcuIFRoaXMgbWV0aG9kIGlzIG11Y2ggZmFzdGVyIHRoYW4gdXNpbmcgdGhlIERPTSBhbmQgd2hlbg0KCSAqIGNyZWF0aW5nIGEgd2hvbGUgdG9vbGJhciB3aXRoIGJ1dHRvbnMgaXQgZG9lcyBtYWtlIGEgbG90IG9mIGRpZmZlcmVuY2UuDQoJICoNCgkgKiBAbWV0aG9kIHJlbmRlckhUTUwNCgkgKiBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgZm9yIHRoZSBzZXBhcmF0b3IgY29udHJvbCBlbGVtZW50Lg0KCSAqLw0KCXJlbmRlckhUTUwgOiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIHRpbnltY2UuRE9NLmNyZWF0ZUhUTUwoJ3NwYW4nLCB7J2NsYXNzJyA6IHRoaXMuY2xhc3NQcmVmaXh9KTsNCgl9DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/SplitButton.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBTcGxpdEJ1dHRvbi5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIERPTSA9IHRpbnltY2UuRE9NLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBlYWNoID0gdGlueW1jZS5lYWNoOw0KDQoJLyoqDQoJICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNyZWF0ZSBhIHNwbGl0IGJ1dHRvbi4gQSBidXR0b24gd2l0aCBhIG1lbnUgYXR0YWNoZWQgdG8gaXQuDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS51aS5TcGxpdEJ1dHRvbg0KCSAqIEBleHRlbmRzIHRpbnltY2UudWkuQnV0dG9uDQoJICovDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuU3BsaXRCdXR0b246dGlueW1jZS51aS5NZW51QnV0dG9uJywgew0KCQkvKioNCgkJICogQ29uc3RydWN0cyBhIG5ldyBzcGxpdCBidXR0b24gY29udHJvbCBpbnN0YW5jZS4NCgkJICoNCgkJICogQGNvbnN0cnVjdG9yDQoJCSAqIEBtZXRob2QgU3BsaXRCdXR0b24NCgkJICogQHBhcmFtIHtTdHJpbmd9IGlkIENvbnRyb2wgaWQgZm9yIHRoZSBzcGxpdCBidXR0b24uDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIG5hbWUvdmFsdWUgc2V0dGluZ3Mgb2JqZWN0Lg0KCQkgKi8NCgkJU3BsaXRCdXR0b24gOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQkJdGhpcy5jbGFzc1ByZWZpeCA9ICdtY2VTcGxpdEJ1dHRvbic7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJlbmRlcnMgdGhlIHNwbGl0IGJ1dHRvbiBhcyBhIEhUTUwgc3RyaW5nLiBUaGlzIG1ldGhvZCBpcyBtdWNoIGZhc3RlciB0aGFuIHVzaW5nIHRoZSBET00gYW5kIHdoZW4NCgkJICogY3JlYXRpbmcgYSB3aG9sZSB0b29sYmFyIHdpdGggYnV0dG9ucyBpdCBkb2VzIG1ha2UgYSBsb3Qgb2YgZGlmZmVyZW5jZS4NCgkJICoNCgkJICogQG1ldGhvZCByZW5kZXJIVE1MDQoJCSAqIEByZXR1cm4ge1N0cmluZ30gSFRNTCBmb3IgdGhlIHNwbGl0IGJ1dHRvbiBjb250cm9sIGVsZW1lbnQuDQoJCSAqLw0KCQlyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgaCwgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBoMTsNCg0KCQkJaCA9ICc8dGJvZHk+PHRyPic7DQoNCgkJCWlmIChzLmltYWdlKQ0KCQkJCWgxID0gRE9NLmNyZWF0ZUhUTUwoJ2ltZyAnLCB7c3JjIDogcy5pbWFnZSwgJ2NsYXNzJyA6ICdtY2VBY3Rpb24gJyArIHNbJ2NsYXNzJ119KTsNCgkJCWVsc2UNCgkJCQloMSA9IERPTS5jcmVhdGVIVE1MKCdzcGFuJywgeydjbGFzcycgOiAnbWNlQWN0aW9uICcgKyBzWydjbGFzcyddfSwgJycpOw0KDQoJCQloICs9ICc8dGQ+JyArIERPTS5jcmVhdGVIVE1MKCdhJywge2lkIDogdC5pZCArICdfYWN0aW9uJywgaHJlZiA6ICdqYXZhc2NyaXB0OjsnLCAnY2xhc3MnIDogJ21jZUFjdGlvbiAnICsgc1snY2xhc3MnXSwgb25jbGljayA6ICJyZXR1cm4gZmFsc2U7Iiwgb25tb3VzZWRvd24gOiAncmV0dXJuIGZhbHNlOycsIHRpdGxlIDogcy50aXRsZX0sIGgxKSArICc8L3RkPic7DQoJDQoJCQloMSA9IERPTS5jcmVhdGVIVE1MKCdzcGFuJywgeydjbGFzcycgOiAnbWNlT3BlbiAnICsgc1snY2xhc3MnXX0pOw0KCQkJaCArPSAnPHRkPicgKyBET00uY3JlYXRlSFRNTCgnYScsIHtpZCA6IHQuaWQgKyAnX29wZW4nLCBocmVmIDogJ2phdmFzY3JpcHQ6OycsICdjbGFzcycgOiAnbWNlT3BlbiAnICsgc1snY2xhc3MnXSwgb25jbGljayA6ICJyZXR1cm4gZmFsc2U7Iiwgb25tb3VzZWRvd24gOiAncmV0dXJuIGZhbHNlOycsIHRpdGxlIDogcy50aXRsZX0sIGgxKSArICc8L3RkPic7DQoNCgkJCWggKz0gJzwvdHI+PC90Ym9keT4nOw0KDQoJCQlyZXR1cm4gRE9NLmNyZWF0ZUhUTUwoJ3RhYmxlJywge2lkIDogdC5pZCwgJ2NsYXNzJyA6ICdtY2VTcGxpdEJ1dHRvbiBtY2VTcGxpdEJ1dHRvbkVuYWJsZWQgJyArIHNbJ2NsYXNzJ10sIGNlbGxwYWRkaW5nIDogJzAnLCBjZWxsc3BhY2luZyA6ICcwJywgb25tb3VzZWRvd24gOiAncmV0dXJuIGZhbHNlOycsIHRpdGxlIDogcy50aXRsZX0sIGgpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBQb3N0IHJlbmRlciBoYW5kbGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBVSSBoYXMgYmVlbg0KCQkgKiByZW5kZXJlZCBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQuDQoJCSAqDQoJCSAqIEBtZXRob2QgcG9zdFJlbmRlcg0KCQkgKi8NCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJaWYgKHMub25jbGljaykgew0KCQkJCUV2ZW50LmFkZCh0LmlkICsgJ19hY3Rpb24nLCAnY2xpY2snLCBmdW5jdGlvbigpIHsNCgkJCQkJaWYgKCF0LmlzRGlzYWJsZWQoKSkNCgkJCQkJCXMub25jbGljayh0LnZhbHVlKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJRXZlbnQuYWRkKHQuaWQgKyAnX29wZW4nLCAnY2xpY2snLCB0LnNob3dNZW51LCB0KTsNCgkJCUV2ZW50LmFkZCh0LmlkICsgJ19vcGVuJywgJ2ZvY3VzJywgZnVuY3Rpb24oKSB7dC5fZm9jdXNlZCA9IDE7fSk7DQoJCQlFdmVudC5hZGQodC5pZCArICdfb3BlbicsICdibHVyJywgZnVuY3Rpb24oKSB7dC5fZm9jdXNlZCA9IDA7fSk7DQoNCgkJCS8vIE9sZCBJRSBkb2Vzbid0IGhhdmUgaG92ZXIgb24gYWxsIGVsZW1lbnRzDQoJCQlpZiAodGlueW1jZS5pc0lFNiB8fCAhRE9NLmJveE1vZGVsKSB7DQoJCQkJRXZlbnQuYWRkKHQuaWQsICdtb3VzZW92ZXInLCBmdW5jdGlvbigpIHsNCgkJCQkJaWYgKCFET00uaGFzQ2xhc3ModC5pZCwgJ21jZVNwbGl0QnV0dG9uRGlzYWJsZWQnKSkNCgkJCQkJCURPTS5hZGRDbGFzcyh0LmlkLCAnbWNlU3BsaXRCdXR0b25Ib3ZlcicpOw0KCQkJCX0pOw0KDQoJCQkJRXZlbnQuYWRkKHQuaWQsICdtb3VzZW91dCcsIGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoIURPTS5oYXNDbGFzcyh0LmlkLCAnbWNlU3BsaXRCdXR0b25EaXNhYmxlZCcpKQ0KCQkJCQkJRE9NLnJlbW92ZUNsYXNzKHQuaWQsICdtY2VTcGxpdEJ1dHRvbkhvdmVyJyk7DQoJCQkJfSk7DQoJCQl9DQoJCX0sDQoNCgkJZGVzdHJveSA6IGZ1bmN0aW9uKCkgew0KCQkJdGhpcy5wYXJlbnQoKTsNCg0KCQkJRXZlbnQuY2xlYXIodGhpcy5pZCArICdfYWN0aW9uJyk7DQoJCQlFdmVudC5jbGVhcih0aGlzLmlkICsgJ19vcGVuJyk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/ui/Toolbar.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBUb29sYmFyLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KLyoqDQogKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIHRvb2xiYXJzIGEgdG9vbGJhciBpcyBhIGNvbnRhaW5lciBmb3Igb3RoZXIgY29udHJvbHMgbGlrZSBidXR0b25zIGV0Yy4NCiAqDQogKiBAY2xhc3MgdGlueW1jZS51aS5Ub29sYmFyDQogKiBAZXh0ZW5kcyB0aW55bWNlLnVpLkNvbnRhaW5lcg0KICovDQp0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5Ub29sYmFyOnRpbnltY2UudWkuQ29udGFpbmVyJywgew0KCS8qKg0KCSAqIFJlbmRlcnMgdGhlIHRvb2xiYXIgYXMgYSBIVE1MIHN0cmluZy4gVGhpcyBtZXRob2QgaXMgbXVjaCBmYXN0ZXIgdGhhbiB1c2luZyB0aGUgRE9NIGFuZCB3aGVuDQoJICogY3JlYXRpbmcgYSB3aG9sZSB0b29sYmFyIHdpdGggYnV0dG9ucyBpdCBkb2VzIG1ha2UgYSBsb3Qgb2YgZGlmZmVyZW5jZS4NCgkgKg0KCSAqIEBtZXRob2QgcmVuZGVySFRNTA0KCSAqIEByZXR1cm4ge1N0cmluZ30gSFRNTCBmb3IgdGhlIHRvb2xiYXIgY29udHJvbC4NCgkgKi8NCglyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCXZhciB0ID0gdGhpcywgaCA9ICcnLCBjLCBjbywgZG9tID0gdGlueW1jZS5ET00sIHMgPSB0LnNldHRpbmdzLCBpLCBwciwgbngsIGNsOw0KDQoJCWNsID0gdC5jb250cm9sczsNCgkJZm9yIChpPTA7IGk8Y2wubGVuZ3RoOyBpKyspIHsNCgkJCS8vIEdldCBjdXJyZW50IGNvbnRyb2wsIHByZXYgY29udHJvbCwgbmV4dCBjb250cm9sIGFuZCBpZiB0aGUgY29udHJvbCBpcyBhIGxpc3QgYm94IG9yIG5vdA0KCQkJY28gPSBjbFtpXTsNCgkJCXByID0gY2xbaSAtIDFdOw0KCQkJbnggPSBjbFtpICsgMV07DQoNCgkJCS8vIEFkZCB0b29sYmFyIHN0YXJ0DQoJCQlpZiAoaSA9PT0gMCkgew0KCQkJCWMgPSAnbWNlVG9vbGJhclN0YXJ0JzsNCg0KCQkJCWlmIChjby5CdXR0b24pDQoJCQkJCWMgKz0gJyBtY2VUb29sYmFyU3RhcnRCdXR0b24nOw0KCQkJCWVsc2UgaWYgKGNvLlNwbGl0QnV0dG9uKQ0KCQkJCQljICs9ICcgbWNlVG9vbGJhclN0YXJ0U3BsaXRCdXR0b24nOw0KCQkJCWVsc2UgaWYgKGNvLkxpc3RCb3gpDQoJCQkJCWMgKz0gJyBtY2VUb29sYmFyU3RhcnRMaXN0Qm94JzsNCg0KCQkJCWggKz0gZG9tLmNyZWF0ZUhUTUwoJ3RkJywgeydjbGFzcycgOiBjfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoJCQl9DQoNCgkJCS8vIEFkZCB0b29sYmFyIGVuZCBiZWZvcmUgbGlzdCBib3ggYW5kIGFmdGVyIHRoZSBwcmV2aW91cyBidXR0b24NCgkJCS8vIFRoaXMgaXMgdG8gZml4IHRoZSBvMms3IGVkaXRvciBza2lucw0KCQkJaWYgKHByICYmIGNvLkxpc3RCb3gpIHsNCgkJCQlpZiAocHIuQnV0dG9uIHx8IHByLlNwbGl0QnV0dG9uKQ0KCQkJCQloICs9IGRvbS5jcmVhdGVIVE1MKCd0ZCcsIHsnY2xhc3MnIDogJ21jZVRvb2xiYXJFbmQnfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoJCQl9DQoNCgkJCS8vIFJlbmRlciBjb250cm9sIEhUTUwNCg0KCQkJLy8gSUUgOCBxdWljayBmaXgsIG5lZWRlZCB0byBwcm9wZXJ0bHkgZ2VuZXJhdGUgYSBoaXQgYXJlYSBmb3IgYW5jaG9ycw0KCQkJaWYgKGRvbS5zdGRNb2RlKQ0KCQkJCWggKz0gJzx0ZCBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlIj4nICsgY28ucmVuZGVySFRNTCgpICsgJzwvdGQ+JzsNCgkJCWVsc2UNCgkJCQloICs9ICc8dGQ+JyArIGNvLnJlbmRlckhUTUwoKSArICc8L3RkPic7DQoNCgkJCS8vIEFkZCB0b29sYmFyIHN0YXJ0IGFmdGVyIGxpc3QgYm94IGFuZCBiZWZvcmUgdGhlIG5leHQgYnV0dG9uDQoJCQkvLyBUaGlzIGlzIHRvIGZpeCB0aGUgbzJrNyBlZGl0b3Igc2tpbnMNCgkJCWlmIChueCAmJiBjby5MaXN0Qm94KSB7DQoJCQkJaWYgKG54LkJ1dHRvbiB8fCBueC5TcGxpdEJ1dHRvbikNCgkJCQkJaCArPSBkb20uY3JlYXRlSFRNTCgndGQnLCB7J2NsYXNzJyA6ICdtY2VUb29sYmFyU3RhcnQnfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoJCQl9DQoJCX0NCg0KCQljID0gJ21jZVRvb2xiYXJFbmQnOw0KDQoJCWlmIChjby5CdXR0b24pDQoJCQljICs9ICcgbWNlVG9vbGJhckVuZEJ1dHRvbic7DQoJCWVsc2UgaWYgKGNvLlNwbGl0QnV0dG9uKQ0KCQkJYyArPSAnIG1jZVRvb2xiYXJFbmRTcGxpdEJ1dHRvbic7DQoJCWVsc2UgaWYgKGNvLkxpc3RCb3gpDQoJCQljICs9ICcgbWNlVG9vbGJhckVuZExpc3RCb3gnOw0KDQoJCWggKz0gZG9tLmNyZWF0ZUhUTUwoJ3RkJywgeydjbGFzcycgOiBjfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoNCgkJcmV0dXJuIGRvbS5jcmVhdGVIVE1MKCd0YWJsZScsIHtpZCA6IHQuaWQsICdjbGFzcycgOiAnbWNlVG9vbGJhcicgKyAoc1snY2xhc3MnXSA/ICcgJyArIHNbJ2NsYXNzJ10gOiAnJyksIGNlbGxwYWRkaW5nIDogJzAnLCBjZWxsc3BhY2luZyA6ICcwJywgYWxpZ24gOiB0LnNldHRpbmdzLmFsaWduIHx8ICcnfSwgJzx0Ym9keT48dHI+JyArIGggKyAnPC90cj48L3Rib2R5PicpOw0KCX0NCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/UndoManager.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBVbmRvTWFuYWdlci5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIERpc3BhdGNoZXIgPSB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcjsNCg0KCS8qKg0KCSAqIFRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgdW5kby9yZWRvIGhpc3RvcnkgbGV2ZWxzIGZvciB0aGUgZWRpdG9yLiBTaW5jZSB0aGUgYnVpbGQgaW4gdW5kby9yZWRvIGhhcyBtYWpvciBkcmF3YmFja3MgYSBjdXN0b20gb25lIHdhcyBuZWVkZWQuDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS5VbmRvTWFuYWdlcg0KCSAqLw0KCXRpbnltY2UuVW5kb01hbmFnZXIgPSBmdW5jdGlvbihlZGl0b3IpIHsNCgkJdmFyIHNlbGYsIGluZGV4ID0gMCwgZGF0YSA9IFtdOw0KDQoJCWZ1bmN0aW9uIGdldENvbnRlbnQoKSB7DQoJCQlyZXR1cm4gdGlueW1jZS50cmltKGVkaXRvci5nZXRDb250ZW50KHtmb3JtYXQgOiAncmF3Jywgbm9fZXZlbnRzIDogMX0pKTsNCgkJfTsNCg0KCQlyZXR1cm4gc2VsZiA9IHsNCgkJCXR5cGluZyA6IDAsDQoNCgkJCW9uQWRkIDogbmV3IERpc3BhdGNoZXIoc2VsZiksDQoJCQlvblVuZG8gOiBuZXcgRGlzcGF0Y2hlcihzZWxmKSwNCgkJCW9uUmVkbyA6IG5ldyBEaXNwYXRjaGVyKHNlbGYpLA0KDQoJCQkvKioNCgkJCSAqIEFkZHMgYSBuZXcgdW5kbyBsZXZlbC9zbmFwc2hvdCB0byB0aGUgdW5kbyBsaXN0Lg0KCQkJICoNCgkJCSAqIEBtZXRob2QgYWRkDQoJCQkgKiBAcGFyYW0ge09iamVjdH0gbCBPcHRpb25hbCB1bmRvIGxldmVsIG9iamVjdCB0byBhZGQuDQoJCQkgKiBAcmV0dXJuIHtPYmplY3R9IFVuZG8gbGV2ZWwgdGhhdCBnb3QgYWRkZWQgb3IgbnVsbCBpdCBhIGxldmVsIHdhc24ndCBuZWVkZWQuDQoJCQkgKi8NCgkJCWFkZCA6IGZ1bmN0aW9uKGxldmVsKSB7DQoJCQkJdmFyIGksIHNldHRpbmdzID0gZWRpdG9yLnNldHRpbmdzLCBsYXN0TGV2ZWw7DQoNCgkJCQlsZXZlbCA9IGxldmVsIHx8IHt9Ow0KCQkJCWxldmVsLmNvbnRlbnQgPSBnZXRDb250ZW50KCk7DQoNCgkJCQkvLyBBZGQgdW5kbyBsZXZlbCBpZiBuZWVkZWQNCgkJCQlsYXN0TGV2ZWwgPSBkYXRhW2luZGV4XTsNCgkJCQlpZiAobGFzdExldmVsICYmIGxhc3RMZXZlbC5jb250ZW50ID09IGxldmVsLmNvbnRlbnQpIHsNCgkJCQkJaWYgKGluZGV4ID4gMCB8fCBkYXRhLmxlbmd0aCA9PSAxKQ0KCQkJCQkJcmV0dXJuIG51bGw7DQoJCQkJfQ0KDQoJCQkJLy8gVGltZSB0byBjb21wcmVzcw0KCQkJCWlmIChzZXR0aW5ncy5jdXN0b21fdW5kb19yZWRvX2xldmVscykgew0KCQkJCQlpZiAoZGF0YS5sZW5ndGggPiBzZXR0aW5ncy5jdXN0b21fdW5kb19yZWRvX2xldmVscykgew0KCQkJCQkJZm9yIChpID0gMDsgaSA8IGRhdGEubGVuZ3RoIC0gMTsgaSsrKQ0KCQkJCQkJCWRhdGFbaV0gPSBkYXRhW2kgKyAxXTsNCg0KCQkJCQkJZGF0YS5sZW5ndGgtLTsNCgkJCQkJCWluZGV4ID0gZGF0YS5sZW5ndGg7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBHZXQgYSBub24gaW50cnVzaXZlIG5vcm1hbGl6ZWQgYm9va21hcmsNCgkJCQlsZXZlbC5ib29rbWFyayA9IGVkaXRvci5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMiwgdHJ1ZSk7DQoNCgkJCQkvLyBDcm9wIGFycmF5IGlmIG5lZWRlZA0KCQkJCWlmIChpbmRleCA8IGRhdGEubGVuZ3RoIC0gMSkgew0KCQkJCQkvLyBUcmVhdCBmaXJzdCBsZXZlbCBhcyBpbml0aWFsDQoJCQkJCWlmIChpbmRleCA9PSAwKQ0KCQkJCQkJZGF0YSA9IFtdOw0KCQkJCQllbHNlDQoJCQkJCQlkYXRhLmxlbmd0aCA9IGluZGV4ICsgMTsNCgkJCQl9DQoNCgkJCQlkYXRhLnB1c2gobGV2ZWwpOw0KCQkJCWluZGV4ID0gZGF0YS5sZW5ndGggLSAxOw0KDQoJCQkJc2VsZi5vbkFkZC5kaXNwYXRjaChzZWxmLCBsZXZlbCk7DQoJCQkJZWRpdG9yLmlzTm90RGlydHkgPSAwOw0KDQoJCQkJcmV0dXJuIGxldmVsOw0KCQkJfSwNCg0KCQkJLyoqDQoJCQkgKiBVbmRvZXMgdGhlIGxhc3QgYWN0aW9uLg0KCQkJICoNCgkJCSAqIEBtZXRob2QgdW5kbw0KCQkJICogQHJldHVybiB7T2JqZWN0fSBVbmRvIGxldmVsIG9yIG51bGwgaWYgbm8gdW5kbyB3YXMgcGVyZm9ybWVkLg0KCQkJICovDQoJCQl1bmRvIDogZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGxldmVsLCBpOw0KDQoJCQkJaWYgKHNlbGYudHlwaW5nKSB7DQoJCQkJCXNlbGYuYWRkKCk7DQoJCQkJCXNlbGYudHlwaW5nID0gMDsNCgkJCQl9DQoNCgkJCQlpZiAoaW5kZXggPiAwKSB7DQoJCQkJCWxldmVsID0gZGF0YVstLWluZGV4XTsNCg0KCQkJCQllZGl0b3Iuc2V0Q29udGVudChsZXZlbC5jb250ZW50LCB7Zm9ybWF0IDogJ3Jhdyd9KTsNCgkJCQkJZWRpdG9yLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhsZXZlbC5ib29rbWFyayk7DQoNCgkJCQkJc2VsZi5vblVuZG8uZGlzcGF0Y2goc2VsZiwgbGV2ZWwpOw0KCQkJCX0NCg0KCQkJCXJldHVybiBsZXZlbDsNCgkJCX0sDQoNCgkJCS8qKg0KCQkJICogUmVkb2VzIHRoZSBsYXN0IGFjdGlvbi4NCgkJCSAqDQoJCQkgKiBAbWV0aG9kIHJlZG8NCgkJCSAqIEByZXR1cm4ge09iamVjdH0gUmVkbyBsZXZlbCBvciBudWxsIGlmIG5vIHJlZG8gd2FzIHBlcmZvcm1lZC4NCgkJCSAqLw0KCQkJcmVkbyA6IGZ1bmN0aW9uKCkgew0KCQkJCXZhciBsZXZlbDsNCg0KCQkJCWlmIChpbmRleCA8IGRhdGEubGVuZ3RoIC0gMSkgew0KCQkJCQlsZXZlbCA9IGRhdGFbKytpbmRleF07DQoNCgkJCQkJZWRpdG9yLnNldENvbnRlbnQobGV2ZWwuY29udGVudCwge2Zvcm1hdCA6ICdyYXcnfSk7DQoJCQkJCWVkaXRvci5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsobGV2ZWwuYm9va21hcmspOw0KDQoJCQkJCXNlbGYub25SZWRvLmRpc3BhdGNoKHNlbGYsIGxldmVsKTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gbGV2ZWw7DQoJCQl9LA0KDQoJCQkvKioNCgkJCSAqIFJlbW92ZXMgYWxsIHVuZG8gbGV2ZWxzLg0KCQkJICoNCgkJCSAqIEBtZXRob2QgY2xlYXINCgkJCSAqLw0KCQkJY2xlYXIgOiBmdW5jdGlvbigpIHsNCgkJCQlkYXRhID0gW107DQoJCQkJaW5kZXggPSBzZWxmLnR5cGluZyA9IDA7DQoJCQl9LA0KDQoJCQkvKioNCgkJCSAqIFJldHVybnMgdHJ1ZS9mYWxzZSBpZiB0aGUgdW5kbyBtYW5hZ2VyIGhhcyBhbnkgdW5kbyBsZXZlbHMuDQoJCQkgKg0KCQkJICogQG1ldGhvZCBoYXNVbmRvDQoJCQkgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlL2ZhbHNlIGlmIHRoZSB1bmRvIG1hbmFnZXIgaGFzIGFueSB1bmRvIGxldmVscy4NCgkJCSAqLw0KCQkJaGFzVW5kbyA6IGZ1bmN0aW9uKCkgew0KCQkJCXJldHVybiBpbmRleCA+IDAgfHwgc2VsZi50eXBpbmc7DQoJCQl9LA0KDQoJCQkvKioNCgkJCSAqIFJldHVybnMgdHJ1ZS9mYWxzZSBpZiB0aGUgdW5kbyBtYW5hZ2VyIGhhcyBhbnkgcmVkbyBsZXZlbHMuDQoJCQkgKg0KCQkJICogQG1ldGhvZCBoYXNSZWRvDQoJCQkgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlL2ZhbHNlIGlmIHRoZSB1bmRvIG1hbmFnZXIgaGFzIGFueSByZWRvIGxldmVscy4NCgkJCSAqLw0KCQkJaGFzUmVkbyA6IGZ1bmN0aW9uKCkgew0KCQkJCXJldHVybiBpbmRleCA8IGRhdGEubGVuZ3RoIC0gMTsNCgkJCX0NCgkJfTsNCgl9Ow0KfSkodGlueW1jZSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/util/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/util/Cookie.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBDb29raWUuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24oKSB7DQoJdmFyIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgkvKioNCgkgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHNpbXBsZSBjb29raWUgbWFuYW5nZW1lbnQgZnVuY3Rpb25zLg0KCSAqDQoJICogQGNsYXNzIHRpbnltY2UudXRpbC5Db29raWUNCgkgKiBAc3RhdGljDQoJICovDQoJdGlueW1jZS5jcmVhdGUoJ3N0YXRpYyB0aW55bWNlLnV0aWwuQ29va2llJywgew0KCQkvKioNCgkJICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgcXVlcnkgc3RyaW5nIGludG8gYW4gbmFtZS92YWx1ZSBvYmplY3QuDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0SGFzaA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBTdHJpbmcgdG8gcGFyc2UgaW50byBhIG4gSGFzaHRhYmxlIG9iamVjdC4NCgkJICogQHJldHVybiB7T2JqZWN0fSBOYW1lL1ZhbHVlIG9iamVjdCB3aXRoIGl0ZW1zIHBhcnNlZCBmcm9tIHF1ZXJ5c3RyaW5nLg0KCQkgKi8NCgkJZ2V0SGFzaCA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciB2ID0gdGhpcy5nZXQobiksIGg7DQoNCgkJCWlmICh2KSB7DQoJCQkJZWFjaCh2LnNwbGl0KCcmJyksIGZ1bmN0aW9uKHYpIHsNCgkJCQkJdiA9IHYuc3BsaXQoJz0nKTsNCgkJCQkJaCA9IGggfHwge307DQoJCQkJCWhbdW5lc2NhcGUodlswXSldID0gdW5lc2NhcGUodlsxXSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiBoOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIGEgaGFzaHRhYmxlIG5hbWUvdmFsdWUgb2JqZWN0IHRvIGEgY29va2llLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldEhhc2gNCgkJICogQHBhcmFtIHtTdHJpbmd9IG4gTmFtZSBvZiB0aGUgY29va2llLg0KCQkgKiBAcGFyYW0ge09iamVjdH0gdiBIYXNodGFibGUgb2JqZWN0IHRvIHNldCBhcyBjb29raWUuDQoJCSAqIEBwYXJhbSB7RGF0ZX0gZSBPcHRpb25hbCBkYXRlIG9iamVjdCBmb3IgdGhlIGV4cGlyYXRpb24gb2YgdGhlIGNvb2tpZS4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHAgT3B0aW9uYWwgcGF0aCB0byByZXN0cmljdCB0aGUgY29va2llIHRvLg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gZCBPcHRpb25hbCBkb21haW4gdG8gcmVzdHJpY3QgdGhlIGNvb2tpZSB0by4NCgkJICogQHBhcmFtIHtTdHJpbmd9IHMgSXMgdGhlIGNvb2tpZSBzZWN1cmUgb3Igbm90Lg0KCQkgKi8NCgkJc2V0SGFzaCA6IGZ1bmN0aW9uKG4sIHYsIGUsIHAsIGQsIHMpIHsNCgkJCXZhciBvID0gJyc7DQoNCgkJCWVhY2godiwgZnVuY3Rpb24odiwgaykgew0KCQkJCW8gKz0gKCFvID8gJycgOiAnJicpICsgZXNjYXBlKGspICsgJz0nICsgZXNjYXBlKHYpOw0KCQkJfSk7DQoNCgkJCXRoaXMuc2V0KG4sIG8sIGUsIHAsIGQsIHMpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBHZXRzIHRoZSByYXcgZGF0YSBvZiBhIGNvb2tpZSBieSBuYW1lLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBOYW1lIG9mIGNvb2tpZSB0byByZXRyaXZlLg0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IENvb2tpZSBkYXRhIHN0cmluZy4NCgkJICovDQoJCWdldCA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciBjID0gZG9jdW1lbnQuY29va2llLCBlLCBwID0gbiArICI9IiwgYjsNCg0KCQkJLy8gU3RyaWN0IG1vZGUNCgkJCWlmICghYykNCgkJCQlyZXR1cm47DQoNCgkJCWIgPSBjLmluZGV4T2YoIjsgIiArIHApOw0KDQoJCQlpZiAoYiA9PSAtMSkgew0KCQkJCWIgPSBjLmluZGV4T2YocCk7DQoNCgkJCQlpZiAoYiAhPSAwKQ0KCQkJCQlyZXR1cm4gbnVsbDsNCgkJCX0gZWxzZQ0KCQkJCWIgKz0gMjsNCg0KCQkJZSA9IGMuaW5kZXhPZigiOyIsIGIpOw0KDQoJCQlpZiAoZSA9PSAtMSkNCgkJCQllID0gYy5sZW5ndGg7DQoNCgkJCXJldHVybiB1bmVzY2FwZShjLnN1YnN0cmluZyhiICsgcC5sZW5ndGgsIGUpKTsNCgkJfSwNCg0KCQkvKioNCgkJICogU2V0cyBhIHJhdyBjb29raWUgc3RyaW5nLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHNldA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gbiBOYW1lIG9mIHRoZSBjb29raWUuDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSB2IFJhdyBjb29raWUgZGF0YS4NCgkJICogQHBhcmFtIHtEYXRlfSBlIE9wdGlvbmFsIGRhdGUgb2JqZWN0IGZvciB0aGUgZXhwaXJhdGlvbiBvZiB0aGUgY29va2llLg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gcCBPcHRpb25hbCBwYXRoIHRvIHJlc3RyaWN0IHRoZSBjb29raWUgdG8uDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBkIE9wdGlvbmFsIGRvbWFpbiB0byByZXN0cmljdCB0aGUgY29va2llIHRvLg0KCQkgKiBAcGFyYW0ge1N0cmluZ30gcyBJcyB0aGUgY29va2llIHNlY3VyZSBvciBub3QuDQoJCSAqLw0KCQlzZXQgOiBmdW5jdGlvbihuLCB2LCBlLCBwLCBkLCBzKSB7DQoJCQlkb2N1bWVudC5jb29raWUgPSBuICsgIj0iICsgZXNjYXBlKHYpICsNCgkJCQkoKGUpID8gIjsgZXhwaXJlcz0iICsgZS50b0dNVFN0cmluZygpIDogIiIpICsNCgkJCQkoKHApID8gIjsgcGF0aD0iICsgZXNjYXBlKHApIDogIiIpICsNCgkJCQkoKGQpID8gIjsgZG9tYWluPSIgKyBkIDogIiIpICsNCgkJCQkoKHMpID8gIjsgc2VjdXJlIiA6ICIiKTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVtb3Zlcy9kZWxldGVzIGEgY29va2llIGJ5IG5hbWUuDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVtb3ZlDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBuIENvb2tpZSBuYW1lIHRvIHJlbW92ZS9kZWxldGUuDQoJCSAqIEBwYXJhbSB7U3Ryb25nfSBwIE9wdGlvbmFsIHBhdGggdG8gcmVtb3ZlIHRoZSBjb29raWUgZnJvbS4NCgkJICovDQoJCXJlbW92ZSA6IGZ1bmN0aW9uKG4sIHApIHsNCgkJCXZhciBkID0gbmV3IERhdGUoKTsNCg0KCQkJZC5zZXRUaW1lKGQuZ2V0VGltZSgpIC0gMTAwMCk7DQoNCgkJCXRoaXMuc2V0KG4sICcnLCBkLCBwLCBkKTsNCgkJfQ0KCX0pOw0KfSkoKTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/util/Dispatcher.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBEaXNwYXRjaGVyLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KLyoqDQogKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGlzcGF0Y2ggZXZlbnQgdG8gb2JzZXJ2ZXJzL2xpc3RlbmVycy4NCiAqIEFsbCBpbnRlcm5hbCBldmVudHMgaW5zaWRlIFRpbnlNQ0UgdXNlcyB0aGlzIGNsYXNzLg0KICoNCiAqIEBjbGFzcyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcg0KICovDQp0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51dGlsLkRpc3BhdGNoZXInLCB7DQoJc2NvcGUgOiBudWxsLA0KCWxpc3RlbmVycyA6IG51bGwsDQoNCgkvKioNCgkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV2ZW50IGRpc3BhdGNoZXIgb2JqZWN0Lg0KCSAqDQoJICogQGNvbnN0cnVjdG9yDQoJICogQG1ldGhvZCBEaXNwYXRjaGVyDQoJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgZGVmYXVsdCBleGVjdXRpb24gc2NvcGUgZm9yIGFsbCBvYnNlcnZlciBmdW5jdGlvbnMuDQoJICovDQoJRGlzcGF0Y2hlciA6IGZ1bmN0aW9uKHMpIHsNCgkJdGhpcy5zY29wZSA9IHMgfHwgdGhpczsNCgkJdGhpcy5saXN0ZW5lcnMgPSBbXTsNCgl9LA0KDQoJLyoqDQoJICogQWRkIGFuIG9ic2VydmVyIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gYSBkaXNwYXRjaCBjYWxsIGlzIGRvbmUuDQoJICoNCgkgKiBAbWV0aG9kIGFkZA0KCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGNiIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiBhIGRpc3BhdGNoIGV2ZW50IG9jY3Vycy4NCgkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBleGVjdXRpb24gc2NvcGUsIGRlZmF1bHRzIHRvIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4NCgkgKiBAcmV0dXJuIHtmdW5jdGlvbn0gUmV0dXJucyB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgb25lIHBhc3NlZCBvbi4NCgkgKi8NCglhZGQgOiBmdW5jdGlvbihjYiwgcykgew0KCQl0aGlzLmxpc3RlbmVycy5wdXNoKHtjYiA6IGNiLCBzY29wZSA6IHMgfHwgdGhpcy5zY29wZX0pOw0KDQoJCXJldHVybiBjYjsNCgl9LA0KDQoJLyoqDQoJICogQWRkIGFuIG9ic2VydmVyIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHRvIHRoZSB0b3Agb2YgdGhlIGxpc3Qgb2Ygb2JzZXJ2ZXJzLg0KCSAqDQoJICogQG1ldGhvZCBhZGRUb1RvcA0KCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGNiIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiBhIGRpc3BhdGNoIGV2ZW50IG9jY3Vycy4NCgkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBleGVjdXRpb24gc2NvcGUsIGRlZmF1bHRzIHRvIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4NCgkgKiBAcmV0dXJuIHtmdW5jdGlvbn0gUmV0dXJucyB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgb25lIHBhc3NlZCBvbi4NCgkgKi8NCglhZGRUb1RvcCA6IGZ1bmN0aW9uKGNiLCBzKSB7DQoJCXRoaXMubGlzdGVuZXJzLnVuc2hpZnQoe2NiIDogY2IsIHNjb3BlIDogcyB8fCB0aGlzLnNjb3BlfSk7DQoNCgkJcmV0dXJuIGNiOw0KCX0sDQoNCgkvKioNCgkgKiBSZW1vdmVzIGFuIG9ic2VydmVyIGZ1bmN0aW9uLg0KCSAqDQoJICogQG1ldGhvZCByZW1vdmUNCgkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYiBPYnNlcnZlciBmdW5jdGlvbiB0byByZW1vdmUuDQoJICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBzYW1lIGZ1bmN0aW9uIHRoYXQgZ290IHBhc3NlZCBpbiBvciBudWxsIGlmIGl0IHdhc24ndCBmb3VuZC4NCgkgKi8NCglyZW1vdmUgOiBmdW5jdGlvbihjYikgew0KCQl2YXIgbCA9IHRoaXMubGlzdGVuZXJzLCBvID0gbnVsbDsNCg0KCQl0aW55bWNlLmVhY2gobCwgZnVuY3Rpb24oYywgaSkgew0KCQkJaWYgKGNiID09IGMuY2IpIHsNCgkJCQlvID0gY2I7DQoJCQkJbC5zcGxpY2UoaSwgMSk7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfQ0KCQl9KTsNCg0KCQlyZXR1cm4gbzsNCgl9LA0KDQoJLyoqDQoJICogRGlzcGF0Y2hlcyBhbiBldmVudCB0byBhbGwgb2JzZXJ2ZXJzL2xpc3RlbmVycy4NCgkgKg0KCSAqIEBtZXRob2QgZGlzcGF0Y2gNCgkgKiBAcGFyYW0ge09iamVjdH0gLi4gQW55IG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGlzcGF0Y2guDQoJICogQHJldHVybiB7T2JqZWN0fSBMYXN0IG9ic2VydmVyIGZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuDQoJICovDQoJZGlzcGF0Y2ggOiBmdW5jdGlvbigpIHsNCgkJdmFyIHMsIGEgPSBhcmd1bWVudHMsIGksIGxpID0gdGhpcy5saXN0ZW5lcnMsIGM7DQoNCgkJLy8gTmVlZHMgdG8gYmUgYSByZWFsIGxvb3Agc2luY2UgdGhlIGxpc3RlbmVyIGNvdW50IG1pZ2h0IGNoYW5nZSB3aGlsZSBsb29waW5nDQoJCS8vIEFuZCB0aGlzIGlzIGFsc28gbW9yZSBlZmZpY2llbnQNCgkJZm9yIChpID0gMDsgaTxsaS5sZW5ndGg7IGkrKykgew0KCQkJYyA9IGxpW2ldOw0KCQkJcyA9IGMuY2IuYXBwbHkoYy5zY29wZSwgYSk7DQoNCgkJCWlmIChzID09PSBmYWxzZSkNCgkJCQlicmVhazsNCgkJfQ0KDQoJCXJldHVybiBzOw0KCX0NCg0KCS8qKiNALSovDQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/util/JSON.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBKU09OLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KLyoqDQogKiBKU09OIHBhcnNlciBhbmQgc2VyaWFsaXplciBjbGFzcy4NCiAqDQogKiBAY2xhc3MgdGlueW1jZS51dGlsLkpTT04NCiAqIEBzdGF0aWMNCiAqLw0KdGlueW1jZS5jcmVhdGUoJ3N0YXRpYyB0aW55bWNlLnV0aWwuSlNPTicsIHsNCgkvKioNCgkgKiBTZXJpYWxpemVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFzIGEgSlNPTiBzdHJpbmcuDQoJICoNCgkgKiBAbWV0aG9kIHNlcmlhbGl6ZQ0KCSAqIEBwYXJhbSB7T2JqZWN0fSBvIE9iamVjdCB0byBzZXJpYWxpemUgYXMgYSBKU09OIHN0cmluZy4NCgkgKiBAcmV0dXJuIHtzdHJpbmd9IEpTT04gc3RyaW5nIHNlcmlhbGl6ZWQgZnJvbSBpbnB1dC4NCgkgKi8NCglzZXJpYWxpemUgOiBmdW5jdGlvbihvKSB7DQoJCXZhciBpLCB2LCBzID0gdGlueW1jZS51dGlsLkpTT04uc2VyaWFsaXplLCB0Ow0KDQoJCWlmIChvID09IG51bGwpDQoJCQlyZXR1cm4gJ251bGwnOw0KDQoJCXQgPSB0eXBlb2YgbzsNCg0KCQlpZiAodCA9PSAnc3RyaW5nJykgew0KCQkJdiA9ICdcYmJcdHRcbm5cZmZccnJcIiJcJ1wnXFxcXCc7DQoNCgkJCXJldHVybiAnIicgKyBvLnJlcGxhY2UoLyhbXHUwMDgwLVx1RkZGRlx4MDAtXHgxZlwiXSkvZywgZnVuY3Rpb24oYSwgYikgew0KCQkJCWkgPSB2LmluZGV4T2YoYik7DQoNCgkJCQlpZiAoaSArIDEpDQoJCQkJCXJldHVybiAnXFwnICsgdi5jaGFyQXQoaSArIDEpOw0KDQoJCQkJYSA9IGIuY2hhckNvZGVBdCgpLnRvU3RyaW5nKDE2KTsNCg0KCQkJCXJldHVybiAnXFx1JyArICcwMDAwJy5zdWJzdHJpbmcoYS5sZW5ndGgpICsgYTsNCgkJCX0pICsgJyInOw0KCQl9DQoNCgkJaWYgKHQgPT0gJ29iamVjdCcpIHsNCgkJCWlmIChvLmhhc093blByb3BlcnR5ICYmIG8gaW5zdGFuY2VvZiBBcnJheSkgew0KCQkJCQlmb3IgKGk9MCwgdiA9ICdbJzsgaTxvLmxlbmd0aDsgaSsrKQ0KCQkJCQkJdiArPSAoaSA+IDAgPyAnLCcgOiAnJykgKyBzKG9baV0pOw0KDQoJCQkJCXJldHVybiB2ICsgJ10nOw0KCQkJCX0NCg0KCQkJCXYgPSAneyc7DQoNCgkJCQlmb3IgKGkgaW4gbykNCgkJCQkJdiArPSB0eXBlb2Ygb1tpXSAhPSAnZnVuY3Rpb24nID8gKHYubGVuZ3RoID4gMSA/ICcsIicgOiAnIicpICsgaSArICciOicgKyBzKG9baV0pIDogJyc7DQoNCgkJCQlyZXR1cm4gdiArICd9JzsNCgkJfQ0KDQoJCXJldHVybiAnJyArIG87DQoJfSwNCg0KCS8qKg0KCSAqIFVuc2VyaWFsaXplcy9wYXJzZXMgdGhlIHNwZWNpZmllZCBKU09OIHN0cmluZyBpbnRvIGEgb2JqZWN0Lg0KCSAqDQoJICogQG1ldGhvZCBwYXJzZQ0KCSAqIEBwYXJhbSB7c3RyaW5nfSBzIEpTT04gU3RyaW5nIHRvIHBhcnNlIGludG8gYSBKYXZhU2NyaXB0IG9iamVjdC4NCgkgKiBAcmV0dXJuIHtPYmplY3R9IE9iamVjdCBmcm9tIGlucHV0IEpTT04gc3RyaW5nIG9yIHVuZGVmaW5lZCBpZiBpdCBmYWlsZWQuDQoJICovDQoJcGFyc2UgOiBmdW5jdGlvbihzKSB7DQoJCXRyeSB7DQoJCQlyZXR1cm4gZXZhbCgnKCcgKyBzICsgJyknKTsNCgkJfSBjYXRjaCAoZXgpIHsNCgkJCS8vIElnbm9yZQ0KCQl9DQoJfQ0KDQoJLyoqI0AtKi8NCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/util/JSONP.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBKU09OUC5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCnRpbnltY2UuY3JlYXRlKCdzdGF0aWMgdGlueW1jZS51dGlsLkpTT05QJywgew0KCWNhbGxiYWNrcyA6IHt9LA0KCWNvdW50IDogMCwNCg0KCXNlbmQgOiBmdW5jdGlvbihvKSB7DQoJCXZhciB0ID0gdGhpcywgZG9tID0gdGlueW1jZS5ET00sIGNvdW50ID0gby5jb3VudCAhPT0gdW5kZWZpbmVkID8gby5jb3VudCA6IHQuY291bnQsIGlkID0gJ3RpbnltY2VfanNvbnBfJyArIGNvdW50Ow0KDQoJCXQuY2FsbGJhY2tzW2NvdW50XSA9IGZ1bmN0aW9uKGpzb24pIHsNCgkJCWRvbS5yZW1vdmUoaWQpOw0KCQkJZGVsZXRlIHQuY2FsbGJhY2tzW2NvdW50XTsNCg0KCQkJby5jYWxsYmFjayhqc29uKTsNCgkJfTsNCg0KCQlkb20uYWRkKGRvbS5kb2MuYm9keSwgJ3NjcmlwdCcsIHtpZCA6IGlkICwgc3JjIDogby51cmwsIHR5cGUgOiAndGV4dC9qYXZhc2NyaXB0J30pOw0KCQl0LmNvdW50Kys7DQoJfQ0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/util/JSONRequest.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBKU09OUmVxdWVzdC5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgZXh0ZW5kID0gdGlueW1jZS5leHRlbmQsIEpTT04gPSB0aW55bWNlLnV0aWwuSlNPTiwgWEhSID0gdGlueW1jZS51dGlsLlhIUjsNCg0KCS8qKg0KCSAqIFRoaXMgY2xhc3MgZW5hYmxlcyB5b3UgdG8gdXNlIEpTT04tUlBDIHRvIGNhbGwgYmFja2VuZCBtZXRob2RzLg0KCSAqDQoJICogQGNsYXNzIHRpbnltY2UudXRpbC5KU09OUmVxdWVzdA0KCSAqLw0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnV0aWwuSlNPTlJlcXVlc3QnLCB7DQoJCS8qKg0KCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEpTT05SZXF1ZXN0IGluc3RhbmNlLg0KCQkgKg0KCQkgKiBAY29uc3RydWN0b3INCgkJICogQG1ldGhvZCBKU09OUmVxdWVzdA0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBzZXR0aW5ncyBvYmplY3QuDQoJCSAqLw0KCQlKU09OUmVxdWVzdCA6IGZ1bmN0aW9uKHMpIHsNCgkJCXRoaXMuc2V0dGluZ3MgPSBleHRlbmQoew0KCQkJfSwgcyk7DQoJCQl0aGlzLmNvdW50ID0gMDsNCgkJfSwNCg0KCQkvKioNCgkJICogU2VuZHMgYSBKU09OLVJQQyBjYWxsLiBDb25zdWx0IHRoZSBXaWtpIEFQSSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gd2hhdCB5b3UgY2FuIHBhc3MgdG8gdGhpcyBmdW5jdGlvbi4NCgkJICoNCgkJICogQG1ldGhvZCBzZW5kDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBvIENhbGwgb2JqZWN0IHdoZXJlIHRoZXJlIGFyZSB0aHJlZSBmaWVsZCBpZCwgbWV0aG9kIGFuZCBwYXJhbXMgdGhpcyBvYmplY3Qgc2hvdWxkIGFsc28gY29udGFpbiBjYWxsYmFja3MgZXRjLg0KCQkgKi8NCgkJc2VuZCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciBlY2IgPSBvLmVycm9yLCBzY2IgPSBvLnN1Y2Nlc3M7DQoNCgkJCW8gPSBleHRlbmQodGhpcy5zZXR0aW5ncywgbyk7DQoNCgkJCW8uc3VjY2VzcyA9IGZ1bmN0aW9uKGMsIHgpIHsNCgkJCQljID0gSlNPTi5wYXJzZShjKTsNCg0KCQkJCWlmICh0eXBlb2YoYykgPT0gJ3VuZGVmaW5lZCcpIHsNCgkJCQkJYyA9IHsNCgkJCQkJCWVycm9yIDogJ0pTT04gUGFyc2UgZXJyb3IuJw0KCQkJCQl9Ow0KCQkJCX0NCg0KCQkJCWlmIChjLmVycm9yKQ0KCQkJCQllY2IuY2FsbChvLmVycm9yX3Njb3BlIHx8IG8uc2NvcGUsIGMuZXJyb3IsIHgpOw0KCQkJCWVsc2UNCgkJCQkJc2NiLmNhbGwoby5zdWNjZXNzX3Njb3BlIHx8IG8uc2NvcGUsIGMucmVzdWx0KTsNCgkJCX07DQoNCgkJCW8uZXJyb3IgPSBmdW5jdGlvbih0eSwgeCkgew0KCQkJCWVjYi5jYWxsKG8uZXJyb3Jfc2NvcGUgfHwgby5zY29wZSwgdHksIHgpOw0KCQkJfTsNCg0KCQkJby5kYXRhID0gSlNPTi5zZXJpYWxpemUoew0KCQkJCWlkIDogby5pZCB8fCAnYycgKyAodGhpcy5jb3VudCsrKSwNCgkJCQltZXRob2QgOiBvLm1ldGhvZCwNCgkJCQlwYXJhbXMgOiBvLnBhcmFtcw0KCQkJfSk7DQoNCgkJCS8vIEpTT04gY29udGVudCB0eXBlIGZvciBSdWJ5IG9uIHJhaWxzLiBCdWc6ICMxODgzMjg3DQoJCQlvLmNvbnRlbnRfdHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJzsNCg0KCQkJWEhSLnNlbmQobyk7DQoJCX0sDQoNCgkJJ3N0YXRpYycgOiB7DQoJCQkvKioNCgkJCSAqIFNpbXBsZSBoZWxwZXIgZnVuY3Rpb24gdG8gc2VuZCBhIEpTT04tUlBDIHJlcXVlc3Qgd2l0aG91dCB0aGUgbmVlZCB0byBpbml0aWFsaXplIGFuIG9iamVjdC4NCgkJCSAqIENvbnN1bHQgdGhlIFdpa2kgQVBJIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiB3aGF0IHlvdSBjYW4gcGFzcyB0byB0aGlzIGZ1bmN0aW9uLg0KCQkJICoNCgkJCSAqIEBtZXRob2Qgc2VuZFJQQw0KCQkJICogQHN0YXRpYw0KCQkJICogQHBhcmFtIHtPYmplY3R9IG8gQ2FsbCBvYmplY3Qgd2hlcmUgdGhlcmUgYXJlIHRocmVlIGZpZWxkIGlkLCBtZXRob2QgYW5kIHBhcmFtcyB0aGlzIG9iamVjdCBzaG91bGQgYWxzbyBjb250YWluIGNhbGxiYWNrcyBldGMuDQoJCQkgKi8NCgkJCXNlbmRSUEMgOiBmdW5jdGlvbihvKSB7DQoJCQkJcmV0dXJuIG5ldyB0aW55bWNlLnV0aWwuSlNPTlJlcXVlc3QoKS5zZW5kKG8pOw0KCQkJfQ0KCQl9DQoJfSk7DQp9KCkpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/util/URI.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBVUkkuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24oKSB7DQoJdmFyIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgkvKioNCgkgKiBUaGlzIGNsYXNzIGhhbmRsZXMgcGFyc2luZywgbW9kaWZpY2F0aW9uIGFuZCBzZXJpYWxpemF0aW9uIG9mIFVSSS9VUkwgc3RyaW5ncy4NCgkgKiBAY2xhc3MgdGlueW1jZS51dGlsLlVSSQ0KCSAqLw0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnV0aWwuVVJJJywgew0KCQkvKioNCgkJICogQ29uc3R1Y3RzIGEgbmV3IFVSSSBpbnN0YW5jZS4NCgkJICoNCgkJICogQGNvbnN0cnVjdG9yDQoJCSAqIEBtZXRob2QgVVJJDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSB1IFVSSSBzdHJpbmcgdG8gcGFyc2UuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIHNldHRpbmdzIG9iamVjdC4NCgkJICovDQoJCVVSSSA6IGZ1bmN0aW9uKHUsIHMpIHsNCgkJCXZhciB0ID0gdGhpcywgbywgYSwgYjsNCg0KCQkJLy8gVHJpbSB3aGl0ZXNwYWNlDQoJCQl1ID0gdGlueW1jZS50cmltKHUpOw0KDQoJCQkvLyBEZWZhdWx0IHNldHRpbmdzDQoJCQlzID0gdC5zZXR0aW5ncyA9IHMgfHwge307DQoNCgkJCS8vIFN0cmFuZ2UgYXBwIHByb3RvY29sIG9yIGxvY2FsIGFuY2hvcg0KCQkJaWYgKC9eKG1haWx0b3x0ZWx8bmV3c3xqYXZhc2NyaXB0fGFib3V0fGRhdGEpOi9pLnRlc3QodSkgfHwgL15ccyojLy50ZXN0KHUpKSB7DQoJCQkJdC5zb3VyY2UgPSB1Ow0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJLy8gQWJzb2x1dGUgcGF0aCB3aXRoIG5vIGhvc3QsIGZha2UgaG9zdCBhbmQgcHJvdG9jb2wNCgkJCWlmICh1LmluZGV4T2YoJy8nKSA9PT0gMCAmJiB1LmluZGV4T2YoJy8vJykgIT09IDApDQoJCQkJdSA9IChzLmJhc2VfdXJpID8gcy5iYXNlX3VyaS5wcm90b2NvbCB8fCAnaHR0cCcgOiAnaHR0cCcpICsgJzovL21jZV9ob3N0JyArIHU7DQoNCgkJCS8vIFJlbGF0aXZlIHBhdGggaHR0cDovLyBvciBwcm90b2NvbCByZWxhdGl2ZSAvL3BhdGgNCgkJCWlmICghL15cdyo6P1wvXC8vLnRlc3QodSkpDQoJCQkJdSA9IChzLmJhc2VfdXJpLnByb3RvY29sIHx8ICdodHRwJykgKyAnOi8vbWNlX2hvc3QnICsgdC50b0Fic1BhdGgocy5iYXNlX3VyaS5wYXRoLCB1KTsNCg0KCQkJLy8gUGFyc2UgVVJMIChDcmVkaXRzIGdvZXMgdG8gU3RlYXZlLCBodHRwOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvcGFyc2V1cmkpDQoJCQl1ID0gdS5yZXBsYWNlKC9AQC9nLCAnKG1jZV9hdCknKTsgLy8gWm9wZSAzIHdvcmthcm91bmQsIHRoZXkgdXNlIEBAc29tZXRoaW5nDQoJCQl1ID0gL14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKik6PyhbXjpAXSopKT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKHUpOw0KCQkJZWFjaChbInNvdXJjZSIsInByb3RvY29sIiwiYXV0aG9yaXR5IiwidXNlckluZm8iLCJ1c2VyIiwicGFzc3dvcmQiLCJob3N0IiwicG9ydCIsInJlbGF0aXZlIiwicGF0aCIsImRpcmVjdG9yeSIsImZpbGUiLCJxdWVyeSIsImFuY2hvciJdLCBmdW5jdGlvbih2LCBpKSB7DQoJCQkJdmFyIHMgPSB1W2ldOw0KDQoJCQkJLy8gWm9wZSAzIHdvcmthcm91bmQsIHRoZXkgdXNlIEBAc29tZXRoaW5nDQoJCQkJaWYgKHMpDQoJCQkJCXMgPSBzLnJlcGxhY2UoL1wobWNlX2F0XCkvZywgJ0BAJyk7DQoNCgkJCQl0W3ZdID0gczsNCgkJCX0pOw0KDQoJCQlpZiAoYiA9IHMuYmFzZV91cmkpIHsNCgkJCQlpZiAoIXQucHJvdG9jb2wpDQoJCQkJCXQucHJvdG9jb2wgPSBiLnByb3RvY29sOw0KDQoJCQkJaWYgKCF0LnVzZXJJbmZvKQ0KCQkJCQl0LnVzZXJJbmZvID0gYi51c2VySW5mbzsNCg0KCQkJCWlmICghdC5wb3J0ICYmIHQuaG9zdCA9PSAnbWNlX2hvc3QnKQ0KCQkJCQl0LnBvcnQgPSBiLnBvcnQ7DQoNCgkJCQlpZiAoIXQuaG9zdCB8fCB0Lmhvc3QgPT0gJ21jZV9ob3N0JykNCgkJCQkJdC5ob3N0ID0gYi5ob3N0Ow0KDQoJCQkJdC5zb3VyY2UgPSAnJzsNCgkJCX0NCg0KCQkJLy90LnBhdGggPSB0LnBhdGggfHwgJy8nOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBTZXRzIHRoZSBpbnRlcm5hbCBwYXRoIHBhcnQgb2YgdGhlIFVSSS4NCgkJICoNCgkJICogQG1ldGhvZCBzZXRQYXRoDQoJCSAqIEBwYXJhbSB7c3RyaW5nfSBwIFBhdGggc3RyaW5nIHRvIHNldC4NCgkJICovDQoJCXNldFBhdGggOiBmdW5jdGlvbihwKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXAgPSAvXiguKj8pXC8/KFx3Kyk/JC8uZXhlYyhwKTsNCg0KCQkJLy8gVXBkYXRlIHBhdGggcGFydHMNCgkJCXQucGF0aCA9IHBbMF07DQoJCQl0LmRpcmVjdG9yeSA9IHBbMV07DQoJCQl0LmZpbGUgPSBwWzJdOw0KDQoJCQkvLyBSZWJ1aWxkIHNvdXJjZQ0KCQkJdC5zb3VyY2UgPSAnJzsNCgkJCXQuZ2V0VVJJKCk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgVVJJIGludG8gYSByZWxhdGl2ZSBVUkkgYmFzZWQgb24gdGhlIGN1cnJlbnQgVVJJIGluc3RhbmNlIGxvY2F0aW9uLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHRvUmVsYXRpdmUNCgkJICogQHBhcmFtIHtTdHJpbmd9IHUgVVJJIHRvIGNvbnZlcnQgaW50byBhIHJlbGF0aXZlIHBhdGgvVVJJLg0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IFJlbGF0aXZlIFVSSSBmcm9tIHRoZSBwb2ludCBzcGVjaWZpZWQgaW4gdGhlIGN1cnJlbnQgVVJJIGluc3RhbmNlLg0KCQkgKi8NCgkJdG9SZWxhdGl2ZSA6IGZ1bmN0aW9uKHUpIHsNCgkJCXZhciB0ID0gdGhpcywgbzsNCg0KCQkJaWYgKHUgPT09ICIuLyIpDQoJCQkJcmV0dXJuIHU7DQoNCgkJCXUgPSBuZXcgdGlueW1jZS51dGlsLlVSSSh1LCB7YmFzZV91cmkgOiB0fSk7DQoNCgkJCS8vIE5vdCBvbiBzYW1lIGRvbWFpbi9wb3J0IG9yIHByb3RvY29sDQoJCQlpZiAoKHUuaG9zdCAhPSAnbWNlX2hvc3QnICYmIHQuaG9zdCAhPSB1Lmhvc3QgJiYgdS5ob3N0KSB8fCB0LnBvcnQgIT0gdS5wb3J0IHx8IHQucHJvdG9jb2wgIT0gdS5wcm90b2NvbCkNCgkJCQlyZXR1cm4gdS5nZXRVUkkoKTsNCg0KCQkJbyA9IHQudG9SZWxQYXRoKHQucGF0aCwgdS5wYXRoKTsNCg0KCQkJLy8gQWRkIHF1ZXJ5DQoJCQlpZiAodS5xdWVyeSkNCgkJCQlvICs9ICc/JyArIHUucXVlcnk7DQoNCgkJCS8vIEFkZCBhbmNob3INCgkJCWlmICh1LmFuY2hvcikNCgkJCQlvICs9ICcjJyArIHUuYW5jaG9yOw0KDQoJCQlyZXR1cm4gbzsNCgkJfSwNCgkNCgkJLyoqDQoJCSAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgVVJJIGludG8gYSBhYnNvbHV0ZSBVUkkgYmFzZWQgb24gdGhlIGN1cnJlbnQgVVJJIGluc3RhbmNlIGxvY2F0aW9uLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHRvQWJzb2x1dGUNCgkJICogQHBhcmFtIHtTdHJpbmd9IHUgVVJJIHRvIGNvbnZlcnQgaW50byBhIHJlbGF0aXZlIHBhdGgvVVJJLg0KCQkgKiBAcGFyYW0ge0Jvb2xlYW59IG5oIE5vIGhvc3QgYW5kIHByb3RvY29sIHByZWZpeC4NCgkJICogQHJldHVybiB7U3RyaW5nfSBBYnNvbHV0ZSBVUkkgZnJvbSB0aGUgcG9pbnQgc3BlY2lmaWVkIGluIHRoZSBjdXJyZW50IFVSSSBpbnN0YW5jZS4NCgkJICovDQoJCXRvQWJzb2x1dGUgOiBmdW5jdGlvbih1LCBuaCkgew0KCQkJdmFyIHUgPSBuZXcgdGlueW1jZS51dGlsLlVSSSh1LCB7YmFzZV91cmkgOiB0aGlzfSk7DQoNCgkJCXJldHVybiB1LmdldFVSSSh0aGlzLmhvc3QgPT0gdS5ob3N0ICYmIHRoaXMucHJvdG9jb2wgPT0gdS5wcm90b2NvbCA/IG5oIDogMCk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENvbnZlcnRzIGEgYWJzb2x1dGUgcGF0aCBpbnRvIGEgcmVsYXRpdmUgcGF0aC4NCgkJICoNCgkJICogQG1ldGhvZCB0b1JlbFBhdGgNCgkJICogQHBhcmFtIHtTdHJpbmd9IGJhc2UgQmFzZSBwb2ludCB0byBjb252ZXJ0IHRoZSBwYXRoIGZyb20uDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggdG8gY29udmVydCBpbnRvIGEgcmVsYXRpdmUgcGF0aC4NCgkJICovDQoJCXRvUmVsUGF0aCA6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsNCgkJCXZhciBpdGVtcywgYnAgPSAwLCBvdXQgPSAnJywgaSwgbDsNCg0KCQkJLy8gU3BsaXQgdGhlIHBhdGhzDQoJCQliYXNlID0gYmFzZS5zdWJzdHJpbmcoMCwgYmFzZS5sYXN0SW5kZXhPZignLycpKTsNCgkJCWJhc2UgPSBiYXNlLnNwbGl0KCcvJyk7DQoJCQlpdGVtcyA9IHBhdGguc3BsaXQoJy8nKTsNCg0KCQkJaWYgKGJhc2UubGVuZ3RoID49IGl0ZW1zLmxlbmd0aCkgew0KCQkJCWZvciAoaSA9IDAsIGwgPSBiYXNlLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KCQkJCQlpZiAoaSA+PSBpdGVtcy5sZW5ndGggfHwgYmFzZVtpXSAhPSBpdGVtc1tpXSkgew0KCQkJCQkJYnAgPSBpICsgMTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoYmFzZS5sZW5ndGggPCBpdGVtcy5sZW5ndGgpIHsNCgkJCQlmb3IgKGkgPSAwLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQoJCQkJCWlmIChpID49IGJhc2UubGVuZ3RoIHx8IGJhc2VbaV0gIT0gaXRlbXNbaV0pIHsNCgkJCQkJCWJwID0gaSArIDE7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKGJwID09IDEpDQoJCQkJcmV0dXJuIHBhdGg7DQoNCgkJCWZvciAoaSA9IDAsIGwgPSBiYXNlLmxlbmd0aCAtIChicCAtIDEpOyBpIDwgbDsgaSsrKQ0KCQkJCW91dCArPSAiLi4vIjsNCg0KCQkJZm9yIChpID0gYnAgLSAxLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQoJCQkJaWYgKGkgIT0gYnAgLSAxKQ0KCQkJCQlvdXQgKz0gIi8iICsgaXRlbXNbaV07DQoJCQkJZWxzZQ0KCQkJCQlvdXQgKz0gaXRlbXNbaV07DQoJCQl9DQoNCgkJCXJldHVybiBvdXQ7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENvbnZlcnRzIGEgcmVsYXRpdmUgcGF0aCBpbnRvIGEgYWJzb2x1dGUgcGF0aC4NCgkJICoNCgkJICogQG1ldGhvZCB0b0Fic1BhdGgNCgkJICogQHBhcmFtIHtTdHJpbmd9IGJhc2UgQmFzZSBwb2ludCB0byBjb252ZXJ0IHRoZSBwYXRoIGZyb20uDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIFJlbGF0aXZlIHBhdGggdG8gY29udmVydCBpbnRvIGFuIGFic29sdXRlIHBhdGguDQoJCSAqLw0KCQl0b0Fic1BhdGggOiBmdW5jdGlvbihiYXNlLCBwYXRoKSB7DQoJCQl2YXIgaSwgbmIgPSAwLCBvID0gW10sIHRyLCBvdXRQYXRoOw0KDQoJCQkvLyBTcGxpdCBwYXRocw0KCQkJdHIgPSAvXC8kLy50ZXN0KHBhdGgpID8gJy8nIDogJyc7DQoJCQliYXNlID0gYmFzZS5zcGxpdCgnLycpOw0KCQkJcGF0aCA9IHBhdGguc3BsaXQoJy8nKTsNCg0KCQkJLy8gUmVtb3ZlIGVtcHR5IGNodW5rcw0KCQkJZWFjaChiYXNlLCBmdW5jdGlvbihrKSB7DQoJCQkJaWYgKGspDQoJCQkJCW8ucHVzaChrKTsNCgkJCX0pOw0KDQoJCQliYXNlID0gbzsNCg0KCQkJLy8gTWVyZ2UgcmVsVVJMUGFydHMgY2h1bmtzDQoJCQlmb3IgKGkgPSBwYXRoLmxlbmd0aCAtIDEsIG8gPSBbXTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkvLyBJZ25vcmUgZW1wdHkgb3IgLg0KCQkJCWlmIChwYXRoW2ldLmxlbmd0aCA9PSAwIHx8IHBhdGhbaV0gPT0gIi4iKQ0KCQkJCQljb250aW51ZTsNCg0KCQkJCS8vIElzIHBhcmVudA0KCQkJCWlmIChwYXRoW2ldID09ICcuLicpIHsNCgkJCQkJbmIrKzsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KDQoJCQkJLy8gTW92ZSB1cA0KCQkJCWlmIChuYiA+IDApIHsNCgkJCQkJbmItLTsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KDQoJCQkJby5wdXNoKHBhdGhbaV0pOw0KCQkJfQ0KDQoJCQlpID0gYmFzZS5sZW5ndGggLSBuYjsNCg0KCQkJLy8gSWYgL2EvYi9jIG9yIC8NCgkJCWlmIChpIDw9IDApDQoJCQkJb3V0UGF0aCA9IG8ucmV2ZXJzZSgpLmpvaW4oJy8nKTsNCgkJCWVsc2UNCgkJCQlvdXRQYXRoID0gYmFzZS5zbGljZSgwLCBpKS5qb2luKCcvJykgKyAnLycgKyBvLnJldmVyc2UoKS5qb2luKCcvJyk7DQoNCgkJCS8vIEFkZCBmcm9udCAvIGlmIGl0J3MgbmVlZGVkDQoJCQlpZiAob3V0UGF0aC5pbmRleE9mKCcvJykgIT09IDApDQoJCQkJb3V0UGF0aCA9ICcvJyArIG91dFBhdGg7DQoNCgkJCS8vIEFkZCB0cmFsaW5nIC8gaWYgaXQncyBuZWVkZWQNCgkJCWlmICh0ciAmJiBvdXRQYXRoLmxhc3RJbmRleE9mKCcvJykgIT09IG91dFBhdGgubGVuZ3RoIC0gMSkNCgkJCQlvdXRQYXRoICs9IHRyOw0KDQoJCQlyZXR1cm4gb3V0UGF0aDsNCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyB0aGUgZnVsbCBVUkkgb2YgdGhlIGludGVybmFsIHN0cnVjdHVyZS4NCgkJICoNCgkJICogQG1ldGhvZCBnZXRVUkkNCgkJICogQHBhcmFtIHtCb29sZWFufSBuaCBPcHRpb25hbCBubyBob3N0IGFuZCBwcm90b2NvbCBwYXJ0LiBEZWZhdWx0cyB0byBmYWxzZS4NCgkJICovDQoJCWdldFVSSSA6IGZ1bmN0aW9uKG5oKSB7DQoJCQl2YXIgcywgdCA9IHRoaXM7DQoNCgkJCS8vIFJlYnVpbGQgc291cmNlDQoJCQlpZiAoIXQuc291cmNlIHx8IG5oKSB7DQoJCQkJcyA9ICcnOw0KDQoJCQkJaWYgKCFuaCkgew0KCQkJCQlpZiAodC5wcm90b2NvbCkNCgkJCQkJCXMgKz0gdC5wcm90b2NvbCArICc6Ly8nOw0KDQoJCQkJCWlmICh0LnVzZXJJbmZvKQ0KCQkJCQkJcyArPSB0LnVzZXJJbmZvICsgJ0AnOw0KDQoJCQkJCWlmICh0Lmhvc3QpDQoJCQkJCQlzICs9IHQuaG9zdDsNCg0KCQkJCQlpZiAodC5wb3J0KQ0KCQkJCQkJcyArPSAnOicgKyB0LnBvcnQ7DQoJCQkJfQ0KDQoJCQkJaWYgKHQucGF0aCkNCgkJCQkJcyArPSB0LnBhdGg7DQoNCgkJCQlpZiAodC5xdWVyeSkNCgkJCQkJcyArPSAnPycgKyB0LnF1ZXJ5Ow0KDQoJCQkJaWYgKHQuYW5jaG9yKQ0KCQkJCQlzICs9ICcjJyArIHQuYW5jaG9yOw0KDQoJCQkJdC5zb3VyY2UgPSBzOw0KCQkJfQ0KDQoJCQlyZXR1cm4gdC5zb3VyY2U7DQoJCX0NCgl9KTsNCn0pKCk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/util/XHR.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBYSFIuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQovKioNCiAqIFRoaXMgY2xhc3MgZW5hYmxlcyB5b3UgdG8gc2VuZCBYTUxIVFRQUmVxdWVzdHMgY3Jvc3MgYnJvd3Nlci4NCiAqIEBjbGFzcyB0aW55bWNlLnV0aWwuWEhSDQogKiBAc3RhdGljDQogKi8NCnRpbnltY2UuY3JlYXRlKCdzdGF0aWMgdGlueW1jZS51dGlsLlhIUicsIHsNCgkvKioNCgkgKiBTZW5kcyBhIFhNTEhUVFBSZXF1ZXN0Lg0KCSAqIENvbnN1bHQgdGhlIFdpa2kgZm9yIGRldGFpbHMgb24gd2hhdCBzZXR0aW5ncyB0aGlzIG1ldGhvZCB0YWtlcy4NCgkgKg0KCSAqIEBtZXRob2Qgc2VuZA0KCSAqIEBwYXJhbSB7T2JqZWN0fSBvIE9iamVjdCB3aWxsIHRhcmdldCBVUkwsIGNhbGxiYWNrcyBhbmQgb3RoZXIgaW5mbyBuZWVkZWQgdG8gbWFrZSB0aGUgcmVxdWVzdC4NCgkgKi8NCglzZW5kIDogZnVuY3Rpb24obykgew0KCQl2YXIgeCwgdCwgdyA9IHdpbmRvdywgYyA9IDA7DQoNCgkJLy8gRGVmYXVsdCBzZXR0aW5ncw0KCQlvLnNjb3BlID0gby5zY29wZSB8fCB0aGlzOw0KCQlvLnN1Y2Nlc3Nfc2NvcGUgPSBvLnN1Y2Nlc3Nfc2NvcGUgfHwgby5zY29wZTsNCgkJby5lcnJvcl9zY29wZSA9IG8uZXJyb3Jfc2NvcGUgfHwgby5zY29wZTsNCgkJby5hc3luYyA9IG8uYXN5bmMgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlOw0KCQlvLmRhdGEgPSBvLmRhdGEgfHwgJyc7DQoNCgkJZnVuY3Rpb24gZ2V0KHMpIHsNCgkJCXggPSAwOw0KDQoJCQl0cnkgew0KCQkJCXggPSBuZXcgQWN0aXZlWE9iamVjdChzKTsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQl9DQoNCgkJCXJldHVybiB4Ow0KCQl9Ow0KDQoJCXggPSB3LlhNTEh0dHBSZXF1ZXN0ID8gbmV3IFhNTEh0dHBSZXF1ZXN0KCkgOiBnZXQoJ01pY3Jvc29mdC5YTUxIVFRQJykgfHwgZ2V0KCdNc3htbDIuWE1MSFRUUCcpOw0KDQoJCWlmICh4KSB7DQoJCQlpZiAoeC5vdmVycmlkZU1pbWVUeXBlKQ0KCQkJCXgub3ZlcnJpZGVNaW1lVHlwZShvLmNvbnRlbnRfdHlwZSk7DQoNCgkJCXgub3BlbihvLnR5cGUgfHwgKG8uZGF0YSA/ICdQT1NUJyA6ICdHRVQnKSwgby51cmwsIG8uYXN5bmMpOw0KDQoJCQlpZiAoby5jb250ZW50X3R5cGUpDQoJCQkJeC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCBvLmNvbnRlbnRfdHlwZSk7DQoNCgkJCXguc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpOw0KDQoJCQl4LnNlbmQoby5kYXRhKTsNCg0KCQkJZnVuY3Rpb24gcmVhZHkoKSB7DQoJCQkJaWYgKCFvLmFzeW5jIHx8IHgucmVhZHlTdGF0ZSA9PSA0IHx8IGMrKyA+IDEwMDAwKSB7DQoJCQkJCWlmIChvLnN1Y2Nlc3MgJiYgYyA8IDEwMDAwICYmIHguc3RhdHVzID09IDIwMCkNCgkJCQkJCW8uc3VjY2Vzcy5jYWxsKG8uc3VjY2Vzc19zY29wZSwgJycgKyB4LnJlc3BvbnNlVGV4dCwgeCwgbyk7DQoJCQkJCWVsc2UgaWYgKG8uZXJyb3IpDQoJCQkJCQlvLmVycm9yLmNhbGwoby5lcnJvcl9zY29wZSwgYyA+IDEwMDAwID8gJ1RJTUVEX09VVCcgOiAnR0VORVJBTCcsIHgsIG8pOw0KDQoJCQkJCXggPSBudWxsOw0KCQkJCX0gZWxzZQ0KCQkJCQl3LnNldFRpbWVvdXQocmVhZHksIDEwKTsNCgkJCX07DQoNCgkJCS8vIFN5bmNyb25vdXMgcmVxdWVzdA0KCQkJaWYgKCFvLmFzeW5jKQ0KCQkJCXJldHVybiByZWFkeSgpOw0KDQoJCQkvLyBXYWl0IGZvciByZXNwb25zZSwgb25SZWFkeVN0YXRlQ2hhbmdlIGNhbiBub3QgYmUgdXNlZCBzaW5jZSBpdCBsZWFrcyBtZW1vcnkgaW4gSUUNCgkJCXQgPSB3LnNldFRpbWVvdXQocmVhZHksIDEwKTsNCgkJfQ0KCX0NCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/WindowManager.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBXaW5kb3dNYW5hZ2VyLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRGlzcGF0Y2hlciA9IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyLCBlYWNoID0gdGlueW1jZS5lYWNoLCBpc0lFID0gdGlueW1jZS5pc0lFLCBpc09wZXJhID0gdGlueW1jZS5pc09wZXJhOw0KDQoJLyoqDQoJICogVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBuYXRpdmUgd2luZG93cyBhbmQgZGlhbG9ncy4gVGhpcyBjbGFzcyBjYW4gYmUgZXh0ZW5kZWQgdG8gcHJvdmlkZSBmb3IgZXhhbXBsZSBpbmxpbmUgZGlhbG9ncy4NCgkgKiBAY2xhc3MgdGlueW1jZS5XaW5kb3dNYW5hZ2VyDQoJICovDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UuV2luZG93TWFuYWdlcicsIHsNCgkJLyoqDQoJCSAqIENvbnN0cnVjdHMgYSBuZXcgd2luZG93IG1hbmFnZXIgaW5zdGFuY2UuDQoJCSAqDQoJCSAqIEBjb25zdHJ1Y3Rvcg0KCQkgKiBAbWV0aG9kIFdpbmRvd01hbmFnZXINCgkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gZWQgRWRpdG9yIGluc3RhbmNlIHRoYXQgdGhlIHdpbmRvd3MgYXJlIGJvdW5kIHRvLg0KCQkgKi8NCgkJV2luZG93TWFuYWdlciA6IGZ1bmN0aW9uKGVkKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQuZWRpdG9yID0gZWQ7DQoJCQl0Lm9uT3BlbiA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KCQkJdC5vbkNsb3NlID0gbmV3IERpc3BhdGNoZXIodCk7DQoJCQl0LnBhcmFtcyA9IHt9Ow0KCQkJdC5mZWF0dXJlcyA9IHt9Ow0KCQl9LA0KDQoJCS8qKg0KCQkgKiBPcGVucyBhIG5ldyB3aW5kb3cuDQoJCSAqDQoJCSAqIEBtZXRob2Qgb3Blbg0KCQkgKiBAcGFyYW0ge09iamVjdH0gcyBPcHRpb25hbCBuYW1lL3ZhbHVlIHNldHRpbmdzIGNvbGxlY3Rpb24gY29udGFpbnMgdGhpbmdzIGxpa2Ugd2lkdGgvaGVpZ2h0L3VybCBldGMuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBwIE9wdGlvbmFsIHBhcmFtZXRlcnMvYXJndW1lbnRzIGNvbGxlY3Rpb24gY2FuIGJlIHVzZWQgYnkgdGhlIGRpYWxvZ3MgdG8gcmV0cml2ZSBjdXN0b20gcGFyYW1ldGVycy4NCgkJICovDQoJCW9wZW4gOiBmdW5jdGlvbihzLCBwKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGYgPSAnJywgeCwgeSwgbW8gPSB0LmVkaXRvci5zZXR0aW5ncy5kaWFsb2dfdHlwZSA9PSAnbW9kYWwnLCB3LCBzdywgc2gsIHZwID0gdGlueW1jZS5ET00uZ2V0Vmlld1BvcnQoKSwgdTsNCg0KCQkJLy8gRGVmYXVsdCBzb21lIG9wdGlvbnMNCgkJCXMgPSBzIHx8IHt9Ow0KCQkJcCA9IHAgfHwge307DQoJCQlzdyA9IGlzT3BlcmEgPyB2cC53IDogc2NyZWVuLndpZHRoOyAvLyBPcGVyYSB1c2VzIHdpbmRvd3MgaW5zaWRlIHRoZSBPcGVyYSB3aW5kb3cNCgkJCXNoID0gaXNPcGVyYSA/IHZwLmggOiBzY3JlZW4uaGVpZ2h0Ow0KCQkJcy5uYW1lID0gcy5uYW1lIHx8ICdtY18nICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7DQoJCQlzLndpZHRoID0gcGFyc2VJbnQocy53aWR0aCB8fCAzMjApOw0KCQkJcy5oZWlnaHQgPSBwYXJzZUludChzLmhlaWdodCB8fCAyNDApOw0KCQkJcy5yZXNpemFibGUgPSB0cnVlOw0KCQkJcy5sZWZ0ID0gcy5sZWZ0IHx8IHBhcnNlSW50KHN3IC8gMi4wKSAtIChzLndpZHRoIC8gMi4wKTsNCgkJCXMudG9wID0gcy50b3AgfHwgcGFyc2VJbnQoc2ggLyAyLjApIC0gKHMuaGVpZ2h0IC8gMi4wKTsNCgkJCXAuaW5saW5lID0gZmFsc2U7DQoJCQlwLm1jZV93aWR0aCA9IHMud2lkdGg7DQoJCQlwLm1jZV9oZWlnaHQgPSBzLmhlaWdodDsNCgkJCXAubWNlX2F1dG9fZm9jdXMgPSBzLmF1dG9fZm9jdXM7DQoNCgkJCWlmIChtbykgew0KCQkJCWlmIChpc0lFKSB7DQoJCQkJCXMuY2VudGVyID0gdHJ1ZTsNCgkJCQkJcy5oZWxwID0gZmFsc2U7DQoJCQkJCXMuZGlhbG9nV2lkdGggPSBzLndpZHRoICsgJ3B4JzsNCgkJCQkJcy5kaWFsb2dIZWlnaHQgPSBzLmhlaWdodCArICdweCc7DQoJCQkJCXMuc2Nyb2xsID0gcy5zY3JvbGxiYXJzIHx8IGZhbHNlOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gQnVpbGQgZmVhdHVyZXMgc3RyaW5nDQoJCQllYWNoKHMsIGZ1bmN0aW9uKHYsIGspIHsNCgkJCQlpZiAodGlueW1jZS5pcyh2LCAnYm9vbGVhbicpKQ0KCQkJCQl2ID0gdiA/ICd5ZXMnIDogJ25vJzsNCg0KCQkJCWlmICghL14obmFtZXx1cmwpJC8udGVzdChrKSkgew0KCQkJCQlpZiAoaXNJRSAmJiBtbykNCgkJCQkJCWYgKz0gKGYgPyAnOycgOiAnJykgKyBrICsgJzonICsgdjsNCgkJCQkJZWxzZQ0KCQkJCQkJZiArPSAoZiA/ICcsJyA6ICcnKSArIGsgKyAnPScgKyB2Ow0KCQkJCX0NCgkJCX0pOw0KDQoJCQl0LmZlYXR1cmVzID0gczsNCgkJCXQucGFyYW1zID0gcDsNCgkJCXQub25PcGVuLmRpc3BhdGNoKHQsIHMsIHApOw0KDQoJCQl1ID0gcy51cmwgfHwgcy5maWxlOw0KCQkJdSA9IHRpbnltY2UuX2FkZFZlcih1KTsNCg0KCQkJdHJ5IHsNCgkJCQlpZiAoaXNJRSAmJiBtbykgew0KCQkJCQl3ID0gMTsNCgkJCQkJd2luZG93LnNob3dNb2RhbERpYWxvZyh1LCB3aW5kb3csIGYpOw0KCQkJCX0gZWxzZQ0KCQkJCQl3ID0gd2luZG93Lm9wZW4odSwgcy5uYW1lLCBmKTsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJLy8gSWdub3JlDQoJCQl9DQoNCgkJCWlmICghdykNCgkJCQlhbGVydCh0LmVkaXRvci5nZXRMYW5nKCdwb3B1cF9ibG9ja2VkJykpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCB3aW5kb3cuIFRoaXMgd2lsbCBhbHNvIGRpc3BhdGNoIG91dCBhIG9uQ2xvc2UgZXZlbnQuDQoJCSAqDQoJCSAqIEBtZXRob2QgY2xvc2UNCgkJICogQHBhcmFtIHtXaW5kb3d9IHcgTmF0aXZlIHdpbmRvdyBvYmplY3QgdG8gY2xvc2UuDQoJCSAqLw0KCQljbG9zZSA6IGZ1bmN0aW9uKHcpIHsNCgkJCXcuY2xvc2UoKTsNCgkJCXRoaXMub25DbG9zZS5kaXNwYXRjaCh0aGlzKTsNCgkJfSwNCg0KCQkvKioNCgkJICogQ3JlYXRlcyBhIGluc3RhbmNlIG9mIGEgY2xhc3MuIFRoaXMgbWV0aG9kIHdhcyBuZWVkZWQgc2luY2UgSUUgY2FuJ3QgY3JlYXRlIGluc3RhbmNlcw0KCQkgKiBvZiBjbGFzc2VzIGZyb20gYSBwYXJlbnQgd2luZG93IGR1ZSB0byBzb21lIHJlZmVyZW5jZSBwcm9ibGVtLiBBbnkgYXJndW1lbnRzIHBhc3NlZCBhZnRlciB0aGUgY2xhc3MgbmFtZQ0KCQkgKiB3aWxsIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGNyZWF0ZUluc3RhbmNlDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBjbCBDbGFzcyBuYW1lIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZi4NCgkJICogQHJldHVybiB7T2JqZWN0fSBJbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLg0KCQkgKi8NCgkJY3JlYXRlSW5zdGFuY2UgOiBmdW5jdGlvbihjbCwgYSwgYiwgYywgZCwgZSkgew0KCQkJdmFyIGYgPSB0aW55bWNlLnJlc29sdmUoY2wpOw0KDQoJCQlyZXR1cm4gbmV3IGYoYSwgYiwgYywgZCwgZSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENyZWF0ZXMgYSBjb25maXJtIGRpYWxvZy4gUGxlYXNlIGRvbid0IHVzZSB0aGUgYmxvY2tpbmcgYmVoYXZpb3Igb2YgdGhpcw0KCQkgKiBuYXRpdmUgdmVyc2lvbiB1c2UgdGhlIGNhbGxiYWNrIG1ldGhvZCBpbnN0ZWFkIHRoZW4gaXQgY2FuIGJlIGV4dGVuZGVkLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGNvbmZpcm0NCgkJICogQHBhcmFtIHtTdHJpbmd9IHQgVGl0bGUgZm9yIHRoZSBuZXcgY29uZmlybSBkaWFsb2cuDQoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGNiIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBvayBvciBjYW5jZWwuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIHNjb3BlIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGluLg0KCQkgKi8NCgkJY29uZmlybSA6IGZ1bmN0aW9uKHQsIGNiLCBzLCB3KSB7DQoJCQl3ID0gdyB8fCB3aW5kb3c7DQoNCgkJCWNiLmNhbGwocyB8fCB0aGlzLCB3LmNvbmZpcm0odGhpcy5fZGVjb2RlKHRoaXMuZWRpdG9yLmdldExhbmcodCwgdCkpKSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENyZWF0ZXMgYSBhbGVydCBkaWFsb2cuIFBsZWFzZSBkb24ndCB1c2UgdGhlIGJsb2NraW5nIGJlaGF2aW9yIG9mIHRoaXMNCgkJICogbmF0aXZlIHZlcnNpb24gdXNlIHRoZSBjYWxsYmFjayBtZXRob2QgaW5zdGVhZCB0aGVuIGl0IGNhbiBiZSBleHRlbmRlZC4NCgkJICoNCgkJICogQG1ldGhvZCBhbGVydA0KCQkgKiBAcGFyYW0ge1N0cmluZ30gdCBUaXRsZSBmb3IgdGhlIG5ldyBhbGVydCBkaWFsb2cuDQoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGNiIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBvay4NCgkJICogQHBhcmFtIHtPYmplY3R9IHMgT3B0aW9uYWwgc2NvcGUgdG8gZXhlY3V0ZSB0aGUgY2FsbGJhY2sgaW4uDQoJCSAqLw0KCQlhbGVydCA6IGZ1bmN0aW9uKHR4LCBjYiwgcywgdykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl3ID0gdyB8fCB3aW5kb3c7DQoJCQl3LmFsZXJ0KHQuX2RlY29kZSh0LmVkaXRvci5nZXRMYW5nKHR4LCB0eCkpKTsNCg0KCQkJaWYgKGNiKQ0KCQkJCWNiLmNhbGwocyB8fCB0KTsNCgkJfSwNCg0KCQkvKioNCgkJICogUmVzaXplcyB0aGUgc3BlY2lmaWVkIHdpbmRvdyBvciBpZC4NCgkJICoNCgkJICogQHBhcmFtIHtOdW1iZXJ9IGR3IERlbHRhIHdpZHRoLg0KCQkgKiBAcGFyYW0ge051bWJlcn0gZGggRGVsdGEgaGVpZ2h0Lg0KCQkgKiBAcGFyYW0ge3dpbmRvdy9pZH0gd2luIFdpbmRvdyBpZiB0aGUgZGlhbG9nIGlzbid0IGlubGluZS4gSWQgaWYgdGhlIGRpYWxvZyBpcyBpbmxpbmUuDQoJCSAqLw0KCQlyZXNpemVCeSA6IGZ1bmN0aW9uKGR3LCBkaCwgd2luKSB7DQoJCQl3aW4ucmVzaXplQnkoZHcsIGRoKTsNCgkJfSwNCg0KCQkvLyBJbnRlcm5hbCBmdW5jdGlvbnMNCg0KCQlfZGVjb2RlIDogZnVuY3Rpb24ocykgew0KCQkJcmV0dXJuIHRpbnltY2UuRE9NLmRlY29kZShzKS5yZXBsYWNlKC9cXG4vZywgJ1xuJyk7DQoJCX0NCgl9KTsNCn0odGlueW1jZSkpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/xml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/classes/xml/Parser.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBQYXJzZXIuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQooZnVuY3Rpb24oKSB7DQoJLyoqDQoJICogWE1MIFBhcnNlciBjbGFzcy4gVGhpcyBjbGFzcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgdGhlIGRldiB2ZXJzaW9uIG9mIFRpbnlNQ0UuDQoJICovDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UueG1sLlBhcnNlcicsIHsNCgkJLyoqDQoJCSAqIENvbnN0dWN0cyBhIG5ldyBYTUwgcGFyc2VyIGluc3RhbmNlLg0KCQkgKg0KCQkgKiBAcGFyYW0ge09iamVjdH0gT3B0aW9uYWwgc2V0dGluZ3Mgb2JqZWN0Lg0KCQkgKi8NCgkJUGFyc2VyIDogZnVuY3Rpb24ocykgew0KCQkJdGhpcy5zZXR0aW5ncyA9IHRpbnltY2UuZXh0ZW5kKHsNCgkJCQlhc3luYyA6IHRydWUNCgkJCX0sIHMpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBkb2N1bWVudCBhbmQgZXhlY3V0ZWQgdGhlIGNhbGxiYWNrIG9uZXMgaXQncyBwYXJzZWQuDQoJCSAqDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSB1IFVSTCB0byBYTUwgZmlsZSB0byBwYXJzZS4NCgkJICogQHBhcmFtIHtmdW5jdGlvbn0gY2IgT3B0aW9uYWwgY2FsbGJhY2sgdG8gZXhlY3V0ZSBvbmVzIHRoZSBYTUwgZmlsZSBpcyBsb2FkZWQuDQoJCSAqIEBwYXJhbSB7T2JqZWN0fSBzIE9wdGlvbmFsIHNjb3BlIGZvciB0aGUgY2FsbGJhY2sgZXhlY3V0aW9uLg0KCQkgKi8NCgkJbG9hZCA6IGZ1bmN0aW9uKHUsIGNiLCBzKSB7DQoJCQl2YXIgZG9jLCB0LCB3ID0gd2luZG93LCBjID0gMDsNCg0KCQkJcyA9IHMgfHwgdGhpczsNCg0KCQkJLy8gRXhwbG9yZXIsIHVzZSBYTUxET00gc2luY2UgaXQgY2FuIGJlIHVzZWQgb24gbG9jYWwgZnMNCgkJCWlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkgew0KCQkJCWRvYyA9IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIik7DQoJCQkJZG9jLmFzeW5jID0gdGhpcy5zZXR0aW5ncy5hc3luYzsNCg0KCQkJCS8vIFdhaXQgZm9yIHJlc3BvbnNlDQoJCQkJaWYgKGRvYy5hc3luYykgew0KCQkJCQlmdW5jdGlvbiBjaGVjaygpIHsNCgkJCQkJCWlmIChkb2MucmVhZHlTdGF0ZSA9PSA0IHx8IGMrKyA+IDEwMDAwKQ0KCQkJCQkJCXJldHVybiBjYi5jYWxsKHMsIGRvYyk7DQoNCgkJCQkJCXcuc2V0VGltZW91dChjaGVjaywgMTApOw0KCQkJCQl9Ow0KDQoJCQkJCXQgPSB3LnNldFRpbWVvdXQoY2hlY2ssIDEwKTsNCgkJCQl9DQoNCgkJCQlkb2MubG9hZCh1KTsNCg0KCQkJCWlmICghZG9jLmFzeW5jKQ0KCQkJCQljYi5jYWxsKHMsIGRvYyk7DQoNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCS8vIFczQyB1c2luZyBYTUxIdHRwUmVxdWVzdA0KCQkJaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkgew0KCQkJCXRyeSB7DQoJCQkJCWRvYyA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsNCgkJCQkJZG9jLm9wZW4oJ0dFVCcsIHUsIHRoaXMuc2V0dGluZ3MuYXN5bmMpOw0KCQkJCQlkb2MuYXN5bmMgPSB0aGlzLnNldHRpbmdzLmFzeW5jOw0KDQoJCQkJCWRvYy5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQkJCWNiLmNhbGwocywgZG9jLnJlc3BvbnNlWE1MKTsNCgkJCQkJfTsNCg0KCQkJCQlkb2Muc2VuZCgnJyk7DQoJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJY2IuY2FsbChzLCBudWxsLCBleCk7DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBYTUwgc3RyaW5nLg0KCQkgKg0KCQkgKiBAcGFyYW0ge1N0cmluZ30geG1sIFhNTCBTdHJpbmcgdG8gcGFyc2UuDQoJCSAqIEByZXR1cm4ge0RvY3VtZW50fSBYTUwgRG9jdW1lbnQgaW5zdGFuY2UuDQoJCSAqLw0KCQlsb2FkWE1MIDogZnVuY3Rpb24oeG1sKSB7DQoJCQl2YXIgZG9jOw0KDQoJCQkvLyBXM0MNCgkJCWlmICh3aW5kb3cuRE9NUGFyc2VyKQ0KCQkJCXJldHVybiBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHhtbCwgInRleHQveG1sIik7DQoNCgkJCS8vIEV4cGxvcmVyDQoJCQlpZiAod2luZG93LkFjdGl2ZVhPYmplY3QpIHsNCgkJCQlkb2MgPSBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpOw0KCQkJCWRvYy5hc3luYyA9ICJmYWxzZSI7DQoJCQkJZG9jLmxvYWRYTUwoeG1sKTsNCg0KCQkJCXJldHVybiBkb2M7DQoJCQl9DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgYWxsIHN0cmluZyBjb250ZW50cyBvZiBhIGVsZW1lbnQgY29uY2F0ZWQgdG9nZXRoZXIuDQoJCSAqDQoJCSAqIEBwYXJhbSB7WE1MTm9kZX0gZWwgWE1MIGVsZW1lbnQgdG8gcmV0cml2ZSB0ZXh0IGZyb20uDQoJCSAqIEByZXR1cm4ge3N0cmluZ30gWE1MIGVsZW1lbnQgdGV4dCBjb250ZW50cy4NCgkJICovDQoJCWdldFRleHQgOiBmdW5jdGlvbihlbCkgew0KCQkJdmFyIG8gPSAnJzsNCg0KCQkJaWYgKCFlbCkNCgkJCQlyZXR1cm4gJyc7DQoNCgkJCWlmIChlbC5oYXNDaGlsZE5vZGVzKCkpIHsNCgkJCQllbCA9IGVsLmZpcnN0Q2hpbGQ7DQoNCgkJCQlkbyB7DQoJCQkJCWlmIChlbC5ub2RlVHlwZSA9PSAzIHx8IGVsLm5vZGVUeXBlID09IDQpDQoJCQkJCQlvICs9IGVsLm5vZGVWYWx1ZTsNCgkJCQl9IHdoaWxlKGVsID0gZWwubmV4dFNpYmxpbmcpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gbzsNCgkJfQ0KCX0pOw0KfSkoKTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/jquery.tinymce.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGIpe3ZhciBlLGQsYT1bXSxjPXdpbmRvdztiLmZuLnRpbnltY2U9ZnVuY3Rpb24oail7dmFyIHA9dGhpcyxnLGssaCxtLGksbD0iIixuPSIiO2lmKCFwLmxlbmd0aCl7cmV0dXJuIHB9aWYoIWope3JldHVybiB0aW55TUNFLmdldChwWzBdLmlkKX1mdW5jdGlvbiBvKCl7dmFyIHI9W10scT0wO2lmKGYpe2YoKTtmPW51bGx9cC5lYWNoKGZ1bmN0aW9uKHQsdSl7dmFyIHMsdz11LmlkLHY9ai5vbmluaXQ7aWYoIXcpe3UuaWQ9dz10aW55bWNlLkRPTS51bmlxdWVJZCgpfXM9bmV3IHRpbnltY2UuRWRpdG9yKHcsaik7ci5wdXNoKHMpO2lmKHYpe3Mub25Jbml0LmFkZChmdW5jdGlvbigpe3ZhciB4LHk9djtpZigrK3E9PXIubGVuZ3RoKXtpZih0aW55bWNlLmlzKHksInN0cmluZyIpKXt4PSh5LmluZGV4T2YoIi4iKT09PS0xKT9udWxsOnRpbnltY2UucmVzb2x2ZSh5LnJlcGxhY2UoL1wuXHcrJC8sIiIpKTt5PXRpbnltY2UucmVzb2x2ZSh5KX15LmFwcGx5KHh8fHRpbnltY2Uscil9fSl9fSk7Yi5lYWNoKHIsZnVuY3Rpb24odCxzKXtzLnJlbmRlcigpfSl9aWYoIWMudGlueW1jZSYmIWQmJihnPWouc2NyaXB0X3VybCkpe2Q9MTtoPWcuc3Vic3RyaW5nKDAsZy5sYXN0SW5kZXhPZigiLyIpKTtpZigvXyhzcmN8ZGV2KVwuanMvZy50ZXN0KGcpKXtuPSJfc3JjIn1tPWcubGFzdEluZGV4T2YoIj8iKTtpZihtIT0tMSl7bD1nLnN1YnN0cmluZyhtKzEpfWMudGlueU1DRVByZUluaXQ9Yy50aW55TUNFUHJlSW5pdHx8e2Jhc2U6aCxzdWZmaXg6bixxdWVyeTpsfTtpZihnLmluZGV4T2YoImd6aXAiKSE9LTEpe2k9ai5sYW5ndWFnZXx8ImVuIjtnPWcrKC9cPy8udGVzdChnKT8iJiI6Ij8iKSsianM9dHJ1ZSZjb3JlPXRydWUmc3VmZml4PSIrZXNjYXBlKG4pKyImdGhlbWVzPSIrZXNjYXBlKGoudGhlbWUpKyImcGx1Z2lucz0iK2VzY2FwZShqLnBsdWdpbnMpKyImbGFuZ3VhZ2VzPSIraTtpZighYy50aW55TUNFX0daKXt0aW55TUNFX0daPXtzdGFydDpmdW5jdGlvbigpe3RpbnltY2Uuc3VmZml4PW47ZnVuY3Rpb24gcShyKXt0aW55bWNlLlNjcmlwdExvYWRlci5tYXJrRG9uZSh0aW55TUNFLmJhc2VVUkkudG9BYnNvbHV0ZShyKSl9cSgibGFuZ3MvIitpKyIuanMiKTtxKCJ0aGVtZXMvIitqLnRoZW1lKyIvZWRpdG9yX3RlbXBsYXRlIituKyIuanMiKTtxKCJ0aGVtZXMvIitqLnRoZW1lKyIvbGFuZ3MvIitpKyIuanMiKTtiLmVhY2goai5wbHVnaW5zLnNwbGl0KCIsIiksZnVuY3Rpb24ocyxyKXtpZihyKXtxKCJwbHVnaW5zLyIrcisiL2VkaXRvcl9wbHVnaW4iK24rIi5qcyIpO3EoInBsdWdpbnMvIityKyIvbGFuZ3MvIitpKyIuanMiKX19KX0sZW5kOmZ1bmN0aW9uKCl7fX19fWIuYWpheCh7dHlwZToiR0VUIix1cmw6ZyxkYXRhVHlwZToic2NyaXB0IixjYWNoZTp0cnVlLHN1Y2Nlc3M6ZnVuY3Rpb24oKXt0aW55bWNlLmRvbS5FdmVudC5kb21Mb2FkZWQ9MTtkPTI7aWYoai5zY3JpcHRfbG9hZGVkKXtqLnNjcmlwdF9sb2FkZWQoKX1vKCk7Yi5lYWNoKGEsZnVuY3Rpb24ocSxyKXtyKCl9KX19KX1lbHNle2lmKGQ9PT0xKXthLnB1c2gobyl9ZWxzZXtvKCl9fXJldHVybiBwfTtiLmV4dGVuZChiLmV4cHJbIjoiXSx7dGlueW1jZTpmdW5jdGlvbihnKXtyZXR1cm4gZy5pZCYmISF0aW55TUNFLmdldChnLmlkKX19KTtmdW5jdGlvbiBmKCl7ZnVuY3Rpb24gaShsKXtpZihsPT09InJlbW92ZSIpe3RoaXMuZWFjaChmdW5jdGlvbihuLG8pe3ZhciBtPWgobyk7aWYobSl7bS5yZW1vdmUoKX19KX10aGlzLmZpbmQoInNwYW4ubWNlRWRpdG9yLGRpdi5tY2VFZGl0b3IiKS5lYWNoKGZ1bmN0aW9uKG4sbyl7dmFyIG09dGlueU1DRS5nZXQoby5pZC5yZXBsYWNlKC9fcGFyZW50JC8sIiIpKTtpZihtKXttLnJlbW92ZSgpfX0pfWZ1bmN0aW9uIGsobil7dmFyIG09dGhpcyxsO2lmKG4hPT1lKXtpLmNhbGwobSk7bS5lYWNoKGZ1bmN0aW9uKHAscSl7dmFyIG87aWYobz10aW55TUNFLmdldChxLmlkKSl7by5zZXRDb250ZW50KG4pfX0pfWVsc2V7aWYobS5sZW5ndGg+MCl7aWYobD10aW55TUNFLmdldChtWzBdLmlkKSl7cmV0dXJuIGwuZ2V0Q29udGVudCgpfX19fWZ1bmN0aW9uIGgobSl7dmFyIGw9bnVsbDsobSkmJihtLmlkKSYmKGMudGlueW1jZSkmJihsPXRpbnlNQ0UuZ2V0KG0uaWQpKTtyZXR1cm4gbH1mdW5jdGlvbiBnKGwpe3JldHVybiAhISgobCkmJihsLmxlbmd0aCkmJihjLnRpbnltY2UpJiYobC5pcygiOnRpbnltY2UiKSkpfXZhciBqPXt9O2IuZWFjaChbInRleHQiLCJodG1sIiwidmFsIl0sZnVuY3Rpb24obixsKXt2YXIgbz1qW2xdPWIuZm5bbF0sbT0obD09PSJ0ZXh0Iik7Yi5mbltsXT1mdW5jdGlvbihzKXt2YXIgcD10aGlzO2lmKCFnKHApKXtyZXR1cm4gby5hcHBseShwLGFyZ3VtZW50cyl9aWYocyE9PWUpe2suY2FsbChwLmZpbHRlcigiOnRpbnltY2UiKSxzKTtvLmFwcGx5KHAubm90KCI6dGlueW1jZSIpLGFyZ3VtZW50cyk7cmV0dXJuIHB9ZWxzZXt2YXIgcj0iIjt2YXIgcT1hcmd1bWVudHM7KG0/cDpwLmVxKDApKS5lYWNoKGZ1bmN0aW9uKHUsdil7dmFyIHQ9aCh2KTtyKz10PyhtP3QuZ2V0Q29udGVudCgpLnJlcGxhY2UoLzwoPzoiW14iXSoifCdbXiddKid8W14nIj5dKSo+L2csIiIpOnQuZ2V0Q29udGVudCgpKTpvLmFwcGx5KGIodikscSl9KTtyZXR1cm4gcn19fSk7Yi5lYWNoKFsiYXBwZW5kIiwicHJlcGVuZCJdLGZ1bmN0aW9uKG4sbSl7dmFyIG89alttXT1iLmZuW21dLGw9KG09PT0icHJlcGVuZCIpO2IuZm5bbV09ZnVuY3Rpb24ocSl7dmFyIHA9dGhpcztpZighZyhwKSl7cmV0dXJuIG8uYXBwbHkocCxhcmd1bWVudHMpfWlmKHEhPT1lKXtwLmZpbHRlcigiOnRpbnltY2UiKS5lYWNoKGZ1bmN0aW9uKHMsdCl7dmFyIHI9aCh0KTtyJiZyLnNldENvbnRlbnQobD9xK3IuZ2V0Q29udGVudCgpOnIuZ2V0Q29udGVudCgpK3EpfSk7by5hcHBseShwLm5vdCgiOnRpbnltY2UiKSxhcmd1bWVudHMpO3JldHVybiBwfX19KTtiLmVhY2goWyJyZW1vdmUiLCJyZXBsYWNlV2l0aCIsInJlcGxhY2VBbGwiLCJlbXB0eSJdLGZ1bmN0aW9uKG0sbCl7dmFyIG49altsXT1iLmZuW2xdO2IuZm5bbF09ZnVuY3Rpb24oKXtpLmNhbGwodGhpcyxsKTtyZXR1cm4gbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSk7ai5hdHRyPWIuZm4uYXR0cjtiLmZuLmF0dHI9ZnVuY3Rpb24obixxLG8pe3ZhciBtPXRoaXM7aWYoKCFuKXx8KG4hPT0idmFsdWUiKXx8KCFnKG0pKSl7cmV0dXJuIGouYXR0ci5jYWxsKG0sbixxLG8pfWlmKHEhPT1lKXtrLmNhbGwobS5maWx0ZXIoIjp0aW55bWNlIikscSk7ai5hdHRyLmNhbGwobS5ub3QoIjp0aW55bWNlIiksbixxLG8pO3JldHVybiBtfWVsc2V7dmFyIHA9bVswXSxsPWgocCk7cmV0dXJuIGw/bC5nZXRDb250ZW50KCk6ai5hdHRyLmNhbGwoYihwKSxuLHEsbyl9fX19KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/langs/en.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKHtlbjp7DQpjb21tb246ew0KZWRpdF9jb25maXJtOiJEbyB5b3Ugd2FudCB0byB1c2UgdGhlIFdZU0lXWUcgbW9kZSBmb3IgdGhpcyB0ZXh0YXJlYT8iLA0KYXBwbHk6IkFwcGx5IiwNCmluc2VydDoiSW5zZXJ0IiwNCnVwZGF0ZToiVXBkYXRlIiwNCmNhbmNlbDoiQ2FuY2VsIiwNCmNsb3NlOiJDbG9zZSIsDQpicm93c2U6IkJyb3dzZSIsDQpjbGFzc19uYW1lOiJDbGFzcyIsDQpub3Rfc2V0OiItLSBOb3Qgc2V0IC0tIiwNCmNsaXBib2FyZF9tc2c6IkNvcHkvQ3V0L1Bhc3RlIGlzIG5vdCBhdmFpbGFibGUgaW4gTW96aWxsYSBhbmQgRmlyZWZveC5cbkRvIHlvdSB3YW50IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpc3N1ZT8iLA0KY2xpcGJvYXJkX25vX3N1cHBvcnQ6IkN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGJ5IHlvdXIgYnJvd3NlciwgdXNlIGtleWJvYXJkIHNob3J0Y3V0cyBpbnN0ZWFkLiIsDQpwb3B1cF9ibG9ja2VkOiJTb3JyeSwgYnV0IHdlIGhhdmUgbm90aWNlZCB0aGF0IHlvdXIgcG9wdXAtYmxvY2tlciBoYXMgZGlzYWJsZWQgYSB3aW5kb3cgdGhhdCBwcm92aWRlcyBhcHBsaWNhdGlvbiBmdW5jdGlvbmFsaXR5LiBZb3Ugd2lsbCBuZWVkIHRvIGRpc2FibGUgcG9wdXAgYmxvY2tpbmcgb24gdGhpcyBzaXRlIGluIG9yZGVyIHRvIGZ1bGx5IHV0aWxpemUgdGhpcyB0b29sLiIsDQppbnZhbGlkX2RhdGE6IkVycm9yOiBJbnZhbGlkIHZhbHVlcyBlbnRlcmVkLCB0aGVzZSBhcmUgbWFya2VkIGluIHJlZC4iLA0KbW9yZV9jb2xvcnM6Ik1vcmUgY29sb3JzIg0KfSwNCmNvbnRleHRtZW51OnsNCmFsaWduOiJBbGlnbm1lbnQiLA0KbGVmdDoiTGVmdCIsDQpjZW50ZXI6IkNlbnRlciIsDQpyaWdodDoiUmlnaHQiLA0KZnVsbDoiRnVsbCINCn0sDQppbnNlcnRkYXRldGltZTp7DQpkYXRlX2ZtdDoiJVktJW0tJWQiLA0KdGltZV9mbXQ6IiVIOiVNOiVTIiwNCmluc2VydGRhdGVfZGVzYzoiSW5zZXJ0IGRhdGUiLA0KaW5zZXJ0dGltZV9kZXNjOiJJbnNlcnQgdGltZSIsDQptb250aHNfbG9uZzoiSmFudWFyeSxGZWJydWFyeSxNYXJjaCxBcHJpbCxNYXksSnVuZSxKdWx5LEF1Z3VzdCxTZXB0ZW1iZXIsT2N0b2JlcixOb3ZlbWJlcixEZWNlbWJlciIsDQptb250aHNfc2hvcnQ6IkphbixGZWIsTWFyLEFwcixNYXksSnVuLEp1bCxBdWcsU2VwLE9jdCxOb3YsRGVjIiwNCmRheV9sb25nOiJTdW5kYXksTW9uZGF5LFR1ZXNkYXksV2VkbmVzZGF5LFRodXJzZGF5LEZyaWRheSxTYXR1cmRheSxTdW5kYXkiLA0KZGF5X3Nob3J0OiJTdW4sTW9uLFR1ZSxXZWQsVGh1LEZyaSxTYXQsU3VuIg0KfSwNCnByaW50OnsNCnByaW50X2Rlc2M6IlByaW50Ig0KfSwNCnByZXZpZXc6ew0KcHJldmlld19kZXNjOiJQcmV2aWV3Ig0KfSwNCmRpcmVjdGlvbmFsaXR5OnsNCmx0cl9kZXNjOiJEaXJlY3Rpb24gbGVmdCB0byByaWdodCIsDQpydGxfZGVzYzoiRGlyZWN0aW9uIHJpZ2h0IHRvIGxlZnQiDQp9LA0KbGF5ZXI6ew0KaW5zZXJ0bGF5ZXJfZGVzYzoiSW5zZXJ0IG5ldyBsYXllciIsDQpmb3J3YXJkX2Rlc2M6Ik1vdmUgZm9yd2FyZCIsDQpiYWNrd2FyZF9kZXNjOiJNb3ZlIGJhY2t3YXJkIiwNCmFic29sdXRlX2Rlc2M6IlRvZ2dsZSBhYnNvbHV0ZSBwb3NpdGlvbmluZyIsDQpjb250ZW50OiJOZXcgbGF5ZXIuLi4iDQp9LA0Kc2F2ZTp7DQpzYXZlX2Rlc2M6IlNhdmUiLA0KY2FuY2VsX2Rlc2M6IkNhbmNlbCBhbGwgY2hhbmdlcyINCn0sDQpub25icmVha2luZzp7DQpub25icmVha2luZ19kZXNjOiJJbnNlcnQgbm9uLWJyZWFraW5nIHNwYWNlIGNoYXJhY3RlciINCn0sDQppZXNwZWxsOnsNCmllc3BlbGxfZGVzYzoiUnVuIHNwZWxsIGNoZWNraW5nIiwNCmRvd25sb2FkOiJpZVNwZWxsIG5vdCBkZXRlY3RlZC4gRG8geW91IHdhbnQgdG8gaW5zdGFsbCBpdCBub3c/Ig0KfSwNCmFkdmhyOnsNCmFkdmhyX2Rlc2M6Ikhvcml6b250YWwgcnVsZSINCn0sDQplbW90aW9uczp7DQplbW90aW9uc19kZXNjOiJFbW90aW9ucyINCn0sDQpzZWFyY2hyZXBsYWNlOnsNCnNlYXJjaF9kZXNjOiJGaW5kIiwNCnJlcGxhY2VfZGVzYzoiRmluZC9SZXBsYWNlIg0KfSwNCmFkdmltYWdlOnsNCmltYWdlX2Rlc2M6Ikluc2VydC9lZGl0IGltYWdlIg0KfSwNCmFkdmxpbms6ew0KbGlua19kZXNjOiJJbnNlcnQvZWRpdCBsaW5rIg0KfSwNCnhodG1seHRyYXM6ew0KY2l0ZV9kZXNjOiJDaXRhdGlvbiIsDQphYmJyX2Rlc2M6IkFiYnJldmlhdGlvbiIsDQphY3JvbnltX2Rlc2M6IkFjcm9ueW0iLA0KZGVsX2Rlc2M6IkRlbGV0aW9uIiwNCmluc19kZXNjOiJJbnNlcnRpb24iLA0KYXR0cmlic19kZXNjOiJJbnNlcnQvRWRpdCBBdHRyaWJ1dGVzIg0KfSwNCnN0eWxlOnsNCmRlc2M6IkVkaXQgQ1NTIFN0eWxlIg0KfSwNCnBhc3RlOnsNCnBhc3RlX3RleHRfZGVzYzoiUGFzdGUgYXMgUGxhaW4gVGV4dCIsDQpwYXN0ZV93b3JkX2Rlc2M6IlBhc3RlIGZyb20gV29yZCIsDQpzZWxlY3RhbGxfZGVzYzoiU2VsZWN0IEFsbCIsDQpwbGFpbnRleHRfbW9kZV9zdGlja3k6IlBhc3RlIGlzIG5vdyBpbiBwbGFpbiB0ZXh0IG1vZGUuIENsaWNrIGFnYWluIHRvIHRvZ2dsZSBiYWNrIHRvIHJlZ3VsYXIgcGFzdGUgbW9kZS4gQWZ0ZXIgeW91IHBhc3RlIHNvbWV0aGluZyB5b3Ugd2lsbCBiZSByZXR1cm5lZCB0byByZWd1bGFyIHBhc3RlIG1vZGUuIiwNCnBsYWludGV4dF9tb2RlOiJQYXN0ZSBpcyBub3cgaW4gcGxhaW4gdGV4dCBtb2RlLiBDbGljayBhZ2FpbiB0byB0b2dnbGUgYmFjayB0byByZWd1bGFyIHBhc3RlIG1vZGUuIg0KfSwNCnBhc3RlX2RsZzp7DQp0ZXh0X3RpdGxlOiJVc2UgQ1RSTCtWIG9uIHlvdXIga2V5Ym9hcmQgdG8gcGFzdGUgdGhlIHRleHQgaW50byB0aGUgd2luZG93LiIsDQp0ZXh0X2xpbmVicmVha3M6IktlZXAgbGluZWJyZWFrcyIsDQp3b3JkX3RpdGxlOiJVc2UgQ1RSTCtWIG9uIHlvdXIga2V5Ym9hcmQgdG8gcGFzdGUgdGhlIHRleHQgaW50byB0aGUgd2luZG93LiINCn0sDQp0YWJsZTp7DQpkZXNjOiJJbnNlcnRzIGEgbmV3IHRhYmxlIiwNCnJvd19iZWZvcmVfZGVzYzoiSW5zZXJ0IHJvdyBiZWZvcmUiLA0Kcm93X2FmdGVyX2Rlc2M6Ikluc2VydCByb3cgYWZ0ZXIiLA0KZGVsZXRlX3Jvd19kZXNjOiJEZWxldGUgcm93IiwNCmNvbF9iZWZvcmVfZGVzYzoiSW5zZXJ0IGNvbHVtbiBiZWZvcmUiLA0KY29sX2FmdGVyX2Rlc2M6Ikluc2VydCBjb2x1bW4gYWZ0ZXIiLA0KZGVsZXRlX2NvbF9kZXNjOiJSZW1vdmUgY29sdW1uIiwNCnNwbGl0X2NlbGxzX2Rlc2M6IlNwbGl0IG1lcmdlZCB0YWJsZSBjZWxscyIsDQptZXJnZV9jZWxsc19kZXNjOiJNZXJnZSB0YWJsZSBjZWxscyIsDQpyb3dfZGVzYzoiVGFibGUgcm93IHByb3BlcnRpZXMiLA0KY2VsbF9kZXNjOiJUYWJsZSBjZWxsIHByb3BlcnRpZXMiLA0KcHJvcHNfZGVzYzoiVGFibGUgcHJvcGVydGllcyIsDQpwYXN0ZV9yb3dfYmVmb3JlX2Rlc2M6IlBhc3RlIHRhYmxlIHJvdyBiZWZvcmUiLA0KcGFzdGVfcm93X2FmdGVyX2Rlc2M6IlBhc3RlIHRhYmxlIHJvdyBhZnRlciIsDQpjdXRfcm93X2Rlc2M6IkN1dCB0YWJsZSByb3ciLA0KY29weV9yb3dfZGVzYzoiQ29weSB0YWJsZSByb3ciLA0KZGVsOiJEZWxldGUgdGFibGUiLA0Kcm93OiJSb3ciLA0KY29sOiJDb2x1bW4iLA0KY2VsbDoiQ2VsbCINCn0sDQphdXRvc2F2ZTp7DQp1bmxvYWRfbXNnOiJUaGUgY2hhbmdlcyB5b3UgbWFkZSB3aWxsIGJlIGxvc3QgaWYgeW91IG5hdmlnYXRlIGF3YXkgZnJvbSB0aGlzIHBhZ2UuIiwNCnJlc3RvcmVfY29udGVudDoiUmVzdG9yZSBhdXRvLXNhdmVkIGNvbnRlbnQuIiwNCndhcm5pbmdfbWVzc2FnZToiSWYgeW91IHJlc3RvcmUgdGhlIHNhdmVkIGNvbnRlbnQsIHlvdSB3aWxsIGxvc2UgYWxsIHRoZSBjb250ZW50IHRoYXQgaXMgY3VycmVudGx5IGluIHRoZSBlZGl0b3IuXG5cbkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZXN0b3JlIHRoZSBzYXZlZCBjb250ZW50Py4iDQp9LA0KZnVsbHNjcmVlbjp7DQpkZXNjOiJUb2dnbGUgZnVsbHNjcmVlbiBtb2RlIg0KfSwNCm1lZGlhOnsNCmRlc2M6Ikluc2VydCAvIGVkaXQgZW1iZWRkZWQgbWVkaWEiLA0KZWRpdDoiRWRpdCBlbWJlZGRlZCBtZWRpYSINCn0sDQpmdWxscGFnZTp7DQpkZXNjOiJEb2N1bWVudCBwcm9wZXJ0aWVzIg0KfSwNCnRlbXBsYXRlOnsNCmRlc2M6Ikluc2VydCBwcmVkZWZpbmVkIHRlbXBsYXRlIGNvbnRlbnQiDQp9LA0KdmlzdWFsY2hhcnM6ew0KZGVzYzoiVmlzdWFsIGNvbnRyb2wgY2hhcmFjdGVycyBvbi9vZmYuIg0KfSwNCnNwZWxsY2hlY2tlcjp7DQpkZXNjOiJUb2dnbGUgc3BlbGxjaGVja2VyIiwNCm1lbnU6IlNwZWxsY2hlY2tlciBzZXR0aW5ncyIsDQppZ25vcmVfd29yZDoiSWdub3JlIHdvcmQiLA0KaWdub3JlX3dvcmRzOiJJZ25vcmUgYWxsIiwNCmxhbmdzOiJMYW5ndWFnZXMiLA0Kd2FpdDoiUGxlYXNlIHdhaXQuLi4iLA0Kc3VnOiJTdWdnZXN0aW9ucyIsDQpub19zdWc6Ik5vIHN1Z2dlc3Rpb25zIiwNCm5vX21wZWxsOiJObyBtaXNzcGVsbGluZ3MgZm91bmQuIg0KfSwNCnBhZ2VicmVhazp7DQpkZXNjOiJJbnNlcnQgcGFnZSBicmVhay4iDQp9LA0KYWR2bGlzdDp7DQp0eXBlczoiVHlwZXMiLA0KZGVmOiJEZWZhdWx0IiwNCmxvd2VyX2FscGhhOiJMb3dlciBhbHBoYSIsDQpsb3dlcl9ncmVlazoiTG93ZXIgZ3JlZWsiLA0KbG93ZXJfcm9tYW46Ikxvd2VyIHJvbWFuIiwNCnVwcGVyX2FscGhhOiJVcHBlciBhbHBoYSIsDQp1cHBlcl9yb21hbjoiVXBwZXIgcm9tYW4iLA0KY2lyY2xlOiJDaXJjbGUiLA0KZGlzYzoiRGlzYyIsDQpzcXVhcmU6IlNxdWFyZSINCn19fSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/license.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQoJCSAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQoKIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCiBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KCltUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKIGFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlCiB0aGUgdmVyc2lvbiBudW1iZXIgMi4xLl0KCgkJCSAgICBQcmVhbWJsZQoKICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCmZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCkxpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgoKICBUaGlzIGxpY2Vuc2UsIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCnNwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91CmNhbiB1c2UgaXQgdG9vLCBidXQgd2Ugc3VnZ2VzdCB5b3UgZmlyc3QgdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXIKdGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKc3RyYXRlZ3kgdG8gdXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMgYmVsb3cuCgogIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAp5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlCmZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKaXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCml0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbwp0aGVzZSB0aGluZ3MuCgogIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQpyaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKeW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0LgoKICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwpvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCnlvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQpjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0Kd2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCgogIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCgogIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAp0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzCm1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwp0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlCmludHJvZHVjZWQgYnkgb3RoZXJzLgoKICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgphbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CmVmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQpyZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAphbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCmNvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgoKICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQpvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKdGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQpsaWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KCiAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCmNvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQpHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQplbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbApQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAp0aGUgbGlicmFyeS4KCiAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdApkb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbApQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcwphcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgpzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCgogIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCmVuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCmEgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUKYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQpsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCnNvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCgogIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQpwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgpub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKc3lzdGVtLgoKICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQp1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcwpsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KdGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KCiAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCiJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCmZvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCgoJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCiAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgoKICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKb3RoZXIgYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgp0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCkVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgoKICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCnByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcwood2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgoKICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yawp3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCkxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCmNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCnBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwppbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQoKICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgptYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCmFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCmludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgphbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgoKICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdApjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCnJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20Kc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZApvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCndyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCiAgCiAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCmNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0CnlvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCmFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CmFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55CndhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCkxpYnJhcnkuCgogIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCmFuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKZmVlLgoKICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCm9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCmFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CgogICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgoKICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwogICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KCiAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgoKICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQogICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcwogICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQogICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCiAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCiAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCgogICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CiAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAogICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCgpUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCmlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCmFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgp0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCnNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQpkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCnRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCmVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQppdC4KClRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAp5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCmNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCgpJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5CndpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgphIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgp0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgoKICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCnRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KdGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAppbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCm9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKdGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgp0aGVzZSBub3RpY2VzLgoKICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCnRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCnN1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCgogIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgp0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCgogIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCmRlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCnVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQppdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCm11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQptZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCgogIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5CmZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCnNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwpkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90CmNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCgogIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCkxpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKd29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAp0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgoKICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CmNyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdApjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQpsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCgogIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCnRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQpkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KCiAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCmZ1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQp3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQpMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQoKICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQpkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCndoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KCiAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKd29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAptb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCgogIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQpMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawpkdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQpjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCmRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKb2YgdGhlc2UgdGhpbmdzOgoKICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCiAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCiAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAogICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0CiAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQogICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCiAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCiAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKCiAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhCiAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQogICAgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZgogICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCiAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KCiAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAogICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCiAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCiAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCgogICAgZCkgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQogICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgoKICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQogICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCgogIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQpMaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgpyZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKdGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCmNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24Kd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwp0aGUgZXhlY3V0YWJsZS4KCiAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQphY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90CnVzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKZGlzdHJpYnV0ZS4KCiAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQpMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQpmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCmxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgp0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKCiAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yawogICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQogICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCiAgICBTZWN0aW9ucyBhYm92ZS4KCiAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAogICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KCiAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKdGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCmRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgpyaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCm9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgoKICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCnByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCkxpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCmFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKdGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCgogIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCkxpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCm9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgpyZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCllvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKdGhpcyBMaWNlbnNlLgoKICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAppbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLApjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCm90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwpMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Cm1heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQphbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwpyZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgoKSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQpwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCmFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCgpJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CnBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CnN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCmdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwp0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKaW1wb3NlIHRoYXQgY2hvaWNlLgoKVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCmJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgoKICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCm9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAphbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCmV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCndyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgoKICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKdmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgpTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCmJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KCkVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCiJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCmxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCgogIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAp3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwpjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQpTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCmRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KCgkJCSAgICBOTyBXQVJSQU5UWQoKICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCklNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgpQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgoKICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgpXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQpBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQpGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCkNPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCkxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgpTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICkRBTUFHRVMuCgoJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKCiAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdApwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCnJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQpvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KCiAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwpzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQpjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KCiAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgogICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KCiAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQoKQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCgpZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgpzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgpuZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CgogIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCiAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KCiAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCiAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKClRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCgoK]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advhr/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advhr/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advhr/css/advhr.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW5wdXQucmFkaW8ge2JvcmRlcjoxcHggbm9uZSAjMDAwOyBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50OyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fQoucGFuZWxfd3JhcHBlciBkaXYuY3VycmVudCB7aGVpZ2h0OjgwcHg7fQojd2lkdGgge3dpZHRoOjUwcHg7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTt9CiN3aWR0aDIge3dpZHRoOjUwcHg7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTt9CiNzaXplIHt3aWR0aDoxMDBweDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advhr/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5BZHZhbmNlZEhSUGx1Z2luIix7aW5pdDpmdW5jdGlvbihhLGIpe2EuYWRkQ29tbWFuZCgibWNlQWR2YW5jZWRIciIsZnVuY3Rpb24oKXthLndpbmRvd01hbmFnZXIub3Blbih7ZmlsZTpiKyIvcnVsZS5odG0iLHdpZHRoOjI1MCtwYXJzZUludChhLmdldExhbmcoImFkdmhyLmRlbHRhX3dpZHRoIiwwKSksaGVpZ2h0OjE2MCtwYXJzZUludChhLmdldExhbmcoImFkdmhyLmRlbHRhX2hlaWdodCIsMCkpLGlubGluZToxfSx7cGx1Z2luX3VybDpifSl9KTthLmFkZEJ1dHRvbigiYWR2aHIiLHt0aXRsZToiYWR2aHIuYWR2aHJfZGVzYyIsY21kOiJtY2VBZHZhbmNlZEhyIn0pO2Eub25Ob2RlQ2hhbmdlLmFkZChmdW5jdGlvbihkLGMsZSl7Yy5zZXRBY3RpdmUoImFkdmhyIixlLm5vZGVOYW1lPT0iSFIiKX0pO2Eub25DbGljay5hZGQoZnVuY3Rpb24oYyxkKXtkPWQudGFyZ2V0O2lmKGQubm9kZU5hbWU9PT0iSFIiKXtjLnNlbGVjdGlvbi5zZWxlY3QoZCl9fSl9LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6IkFkdmFuY2VkIEhSIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9hZHZociIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fX0pO3RpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoImFkdmhyIix0aW55bWNlLnBsdWdpbnMuQWR2YW5jZWRIUlBsdWdpbil9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advhr/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLkFkdmFuY2VkSFJQbHVnaW4nLCB7DQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQkvLyBSZWdpc3RlciBjb21tYW5kcw0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlQWR2YW5jZWRIcicsIGZ1bmN0aW9uKCkgew0KCQkJCWVkLndpbmRvd01hbmFnZXIub3Blbih7DQoJCQkJCWZpbGUgOiB1cmwgKyAnL3J1bGUuaHRtJywNCgkJCQkJd2lkdGggOiAyNTAgKyBwYXJzZUludChlZC5nZXRMYW5nKCdhZHZoci5kZWx0YV93aWR0aCcsIDApKSwNCgkJCQkJaGVpZ2h0IDogMTYwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygnYWR2aHIuZGVsdGFfaGVpZ2h0JywgMCkpLA0KCQkJCQlpbmxpbmUgOiAxDQoJCQkJfSwgew0KCQkJCQlwbHVnaW5fdXJsIDogdXJsDQoJCQkJfSk7DQoJCQl9KTsNCg0KCQkJLy8gUmVnaXN0ZXIgYnV0dG9ucw0KCQkJZWQuYWRkQnV0dG9uKCdhZHZocicsIHsNCgkJCQl0aXRsZSA6ICdhZHZoci5hZHZocl9kZXNjJywNCgkJCQljbWQgOiAnbWNlQWR2YW5jZWRIcicNCgkJCX0pOw0KDQoJCQllZC5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKGVkLCBjbSwgbikgew0KCQkJCWNtLnNldEFjdGl2ZSgnYWR2aHInLCBuLm5vZGVOYW1lID09ICdIUicpOw0KCQkJfSk7DQoNCgkJCWVkLm9uQ2xpY2suYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJaWYgKGUubm9kZU5hbWUgPT09ICdIUicpDQoJCQkJCWVkLnNlbGVjdGlvbi5zZWxlY3QoZSk7DQoJCQl9KTsNCgkJfSwNCg0KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gew0KCQkJCWxvbmduYW1lIDogJ0FkdmFuY2VkIEhSJywNCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9hZHZocicsDQoJCQkJdmVyc2lvbiA6IHRpbnltY2UubWFqb3JWZXJzaW9uICsgIi4iICsgdGlueW1jZS5taW5vclZlcnNpb24NCgkJCX07DQoJCX0NCgl9KTsNCg0KCS8vIFJlZ2lzdGVyIHBsdWdpbg0KCXRpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoJ2FkdmhyJywgdGlueW1jZS5wbHVnaW5zLkFkdmFuY2VkSFJQbHVnaW4pOw0KfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advhr/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advhr/js/rule.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIEFkdkhSRGlhbG9nID0gew0KCWluaXQgOiBmdW5jdGlvbihlZCkgew0KCQl2YXIgZG9tID0gZWQuZG9tLCBmID0gZG9jdW1lbnQuZm9ybXNbMF0sIG4gPSBlZC5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCB3Ow0KDQoJCXcgPSBkb20uZ2V0QXR0cmliKG4sICd3aWR0aCcpOw0KCQlmLndpZHRoLnZhbHVlID0gdyA/IHBhcnNlSW50KHcpIDogKGRvbS5nZXRTdHlsZSgnd2lkdGgnKSB8fCAnJyk7DQoJCWYuc2l6ZS52YWx1ZSA9IGRvbS5nZXRBdHRyaWIobiwgJ3NpemUnKSB8fCBwYXJzZUludChkb20uZ2V0U3R5bGUoJ2hlaWdodCcpKSB8fCAnJzsNCgkJZi5ub3NoYWRlLmNoZWNrZWQgPSAhIWRvbS5nZXRBdHRyaWIobiwgJ25vc2hhZGUnKSB8fCAhIWRvbS5nZXRTdHlsZSgnYm9yZGVyLXdpZHRoJyk7DQoJCXNlbGVjdEJ5VmFsdWUoZiwgJ3dpZHRoMicsIHcuaW5kZXhPZignJScpICE9IC0xID8gJyUnIDogJ3B4Jyk7DQoJfSwNCg0KCXVwZGF0ZSA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgZWQgPSB0aW55TUNFUG9wdXAuZWRpdG9yLCBoLCBmID0gZG9jdW1lbnQuZm9ybXNbMF0sIHN0ID0gJyc7DQoNCgkJaCA9ICc8aHInOw0KDQoJCWlmIChmLnNpemUudmFsdWUpIHsNCgkJCWggKz0gJyBzaXplPSInICsgZi5zaXplLnZhbHVlICsgJyInOw0KCQkJc3QgKz0gJyBoZWlnaHQ6JyArIGYuc2l6ZS52YWx1ZSArICdweDsnOw0KCQl9DQoNCgkJaWYgKGYud2lkdGgudmFsdWUpIHsNCgkJCWggKz0gJyB3aWR0aD0iJyArIGYud2lkdGgudmFsdWUgKyAoZi53aWR0aDIudmFsdWUgPT0gJyUnID8gJyUnIDogJycpICsgJyInOw0KCQkJc3QgKz0gJyB3aWR0aDonICsgZi53aWR0aC52YWx1ZSArIChmLndpZHRoMi52YWx1ZSA9PSAnJScgPyAnJScgOiAncHgnKSArICc7JzsNCgkJfQ0KDQoJCWlmIChmLm5vc2hhZGUuY2hlY2tlZCkgew0KCQkJaCArPSAnIG5vc2hhZGU9Im5vc2hhZGUiJzsNCgkJCXN0ICs9ICcgYm9yZGVyLXdpZHRoOiAxcHg7IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci1jb2xvcjogI0NDQ0NDQzsgY29sb3I6ICNmZmZmZmY7JzsNCgkJfQ0KDQoJCWlmIChlZC5zZXR0aW5ncy5pbmxpbmVfc3R5bGVzKQ0KCQkJaCArPSAnIHN0eWxlPSInICsgdGlueW1jZS50cmltKHN0KSArICciJzsNCg0KCQloICs9ICcgLz4nOw0KDQoJCWVkLmV4ZWNDb21tYW5kKCJtY2VJbnNlcnRDb250ZW50IiwgZmFsc2UsIGgpOw0KCQl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCgl9DQp9Ow0KDQp0aW55TUNFUG9wdXAucmVxdWlyZUxhbmdQYWNrKCk7DQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChBZHZIUkRpYWxvZy5pbml0LCBBZHZIUkRpYWxvZyk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advhr/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advhr/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5hZHZocl9kbGcnLHsNCndpZHRoOiJXaWR0aCIsDQpzaXplOiJIZWlnaHQiLA0Kbm9zaGFkZToiTm8gc2hhZG93Ig0KfSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advhr/rule.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjYWR2aHIuYWR2aHJfZGVzY308L3RpdGxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdGlueV9tY2VfcG9wdXAuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvcnVsZS5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9tY3RhYnMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZm9ybV91dGlscy5qcyI+PC9zY3JpcHQ+Cgk8bGluayBocmVmPSJjc3MvYWR2aHIuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiAvPgo8L2hlYWQ+Cjxib2R5Pgo8Zm9ybSBvbnN1Ym1pdD0iQWR2SFJEaWFsb2cudXBkYXRlKCk7cmV0dXJuIGZhbHNlOyIgYWN0aW9uPSIjIj4KCTxkaXYgY2xhc3M9InRhYnMiPgoJCTx1bD4KCQkJPGxpIGlkPSJnZW5lcmFsX3RhYiIgY2xhc3M9ImN1cnJlbnQiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2dlbmVyYWxfdGFiJywnZ2VuZXJhbF9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjYWR2aHIuYWR2aHJfZGVzY308L2E+PC9zcGFuPjwvbGk+CgkJPC91bD4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9InBhbmVsX3dyYXBwZXIiPgoJCTxkaXYgaWQ9ImdlbmVyYWxfcGFuZWwiIGNsYXNzPSJwYW5lbCBjdXJyZW50Ij4KCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bGFiZWwgZm9yPSJ3aWR0aCI+eyNhZHZocl9kbGcud2lkdGh9PC9sYWJlbD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im5vd3JhcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IndpZHRoIiBuYW1lPSJ3aWR0aCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9Im1jZUZvY3VzIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJ3aWR0aDIiIGlkPSJ3aWR0aDIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+cHg8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIlIj4lPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbCBmb3I9InNpemUiPnsjYWR2aHJfZGxnLnNpemV9PC9sYWJlbD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHNlbGVjdCBpZD0ic2l6ZSIgbmFtZT0ic2l6ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPk5vcm1hbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMSI+MTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMiI+Mjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMyI+Mzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNCI+NDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNSI+NTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD48L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGxhYmVsIGZvcj0ibm9zaGFkZSI+eyNhZHZocl9kbGcubm9zaGFkZX08L2xhYmVsPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im5vc2hhZGUiIGlkPSJub3NoYWRlIiBjbGFzcz0icmFkaW8iIC8+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgoJCTwvZGl2PgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0ibWNlQWN0aW9uUGFuZWwiPgoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJpbnNlcnQiIG5hbWU9Imluc2VydCIgdmFsdWU9InsjaW5zZXJ0fSIgLz4KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iY2FuY2VsIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJ7I2NhbmNlbH0iIG9uY2xpY2s9InRpbnlNQ0VQb3B1cC5jbG9zZSgpOyIgLz4KCTwvZGl2Pgo8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/css/advimage.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[I3NyY19saXN0LCAjb3Zlcl9saXN0LCAjb3V0X2xpc3Qge3dpZHRoOjI4MHB4O30KLm1jZUFjdGlvblBhbmVsIHttYXJnaW4tdG9wOjdweDt9Ci5hbGlnblByZXZpZXcge2JvcmRlcjoxcHggc29saWQgIzAwMDsgd2lkdGg6MTQwcHg7IGhlaWdodDoxNDBweDsgb3ZlcmZsb3c6aGlkZGVuOyBwYWRkaW5nOjVweDt9Ci5jaGVja2JveCB7Ym9yZGVyOjA7fQoucGFuZWxfd3JhcHBlciBkaXYuY3VycmVudCB7aGVpZ2h0OjMwNXB4O30KI3ByZXYge21hcmdpbjowOyBib3JkZXI6MXB4IHNvbGlkICMwMDA7IHdpZHRoOjQyOHB4OyBoZWlnaHQ6MTUwcHg7IG92ZXJmbG93OmF1dG87fQojYWxpZ24sICNjbGFzc2xpc3Qge3dpZHRoOjE1MHB4O30KI3dpZHRoLCAjaGVpZ2h0IHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IHdpZHRoOjUwcHg7IHRleHQtYWxpZ246Y2VudGVyO30KI3ZzcGFjZSwgI2hzcGFjZSwgI2JvcmRlciB7dmVydGljYWwtYWxpZ246bWlkZGxlOyB3aWR0aDozMHB4OyB0ZXh0LWFsaWduOmNlbnRlcjt9CiNjbGFzc19saXN0IHt3aWR0aDoxODBweDt9CmlucHV0IHt3aWR0aDogMjgwcHg7fQojY29uc3RyYWluLCAjb25tb3VzZW1vdmVjaGVjayB7d2lkdGg6YXV0bzt9CiNpZCwgI2RpciwgI2xhbmcsICN1c2VtYXAsICNsb25nZGVzYyB7d2lkdGg6MjAwcHg7fQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5BZHZhbmNlZEltYWdlUGx1Z2luIix7aW5pdDpmdW5jdGlvbihhLGIpe2EuYWRkQ29tbWFuZCgibWNlQWR2SW1hZ2UiLGZ1bmN0aW9uKCl7aWYoYS5kb20uZ2V0QXR0cmliKGEuc2VsZWN0aW9uLmdldE5vZGUoKSwiY2xhc3MiKS5pbmRleE9mKCJtY2VJdGVtIikhPS0xKXtyZXR1cm59YS53aW5kb3dNYW5hZ2VyLm9wZW4oe2ZpbGU6YisiL2ltYWdlLmh0bSIsd2lkdGg6NDgwK3BhcnNlSW50KGEuZ2V0TGFuZygiYWR2aW1hZ2UuZGVsdGFfd2lkdGgiLDApKSxoZWlnaHQ6Mzg1K3BhcnNlSW50KGEuZ2V0TGFuZygiYWR2aW1hZ2UuZGVsdGFfaGVpZ2h0IiwwKSksaW5saW5lOjF9LHtwbHVnaW5fdXJsOmJ9KX0pO2EuYWRkQnV0dG9uKCJpbWFnZSIse3RpdGxlOiJhZHZpbWFnZS5pbWFnZV9kZXNjIixjbWQ6Im1jZUFkdkltYWdlIn0pfSxnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJBZHZhbmNlZCBpbWFnZSIsYXV0aG9yOiJNb3hpZWNvZGUgU3lzdGVtcyBBQiIsYXV0aG9ydXJsOiJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tIixpbmZvdXJsOiJodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvYWR2aW1hZ2UiLHZlcnNpb246dGlueW1jZS5tYWpvclZlcnNpb24rIi4iK3RpbnltY2UubWlub3JWZXJzaW9ufX19KTt0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCJhZHZpbWFnZSIsdGlueW1jZS5wbHVnaW5zLkFkdmFuY2VkSW1hZ2VQbHVnaW4pfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLkFkdmFuY2VkSW1hZ2VQbHVnaW4nLCB7DQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQkvLyBSZWdpc3RlciBjb21tYW5kcw0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlQWR2SW1hZ2UnLCBmdW5jdGlvbigpIHsNCgkJCQkvLyBJbnRlcm5hbCBpbWFnZSBvYmplY3QgbGlrZSBhIGZsYXNoIHBsYWNlaG9sZGVyDQoJCQkJaWYgKGVkLmRvbS5nZXRBdHRyaWIoZWQuc2VsZWN0aW9uLmdldE5vZGUoKSwgJ2NsYXNzJykuaW5kZXhPZignbWNlSXRlbScpICE9IC0xKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQllZC53aW5kb3dNYW5hZ2VyLm9wZW4oew0KCQkJCQlmaWxlIDogdXJsICsgJy9pbWFnZS5odG0nLA0KCQkJCQl3aWR0aCA6IDQ4MCArIHBhcnNlSW50KGVkLmdldExhbmcoJ2FkdmltYWdlLmRlbHRhX3dpZHRoJywgMCkpLA0KCQkJCQloZWlnaHQgOiAzODUgKyBwYXJzZUludChlZC5nZXRMYW5nKCdhZHZpbWFnZS5kZWx0YV9oZWlnaHQnLCAwKSksDQoJCQkJCWlubGluZSA6IDENCgkJCQl9LCB7DQoJCQkJCXBsdWdpbl91cmwgOiB1cmwNCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQkvLyBSZWdpc3RlciBidXR0b25zDQoJCQllZC5hZGRCdXR0b24oJ2ltYWdlJywgew0KCQkJCXRpdGxlIDogJ2FkdmltYWdlLmltYWdlX2Rlc2MnLA0KCQkJCWNtZCA6ICdtY2VBZHZJbWFnZScNCgkJCX0pOw0KCQl9LA0KDQoJCWdldEluZm8gOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB7DQoJCQkJbG9uZ25hbWUgOiAnQWR2YW5jZWQgaW1hZ2UnLA0KCQkJCWF1dGhvciA6ICdNb3hpZWNvZGUgU3lzdGVtcyBBQicsDQoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLA0KCQkJCWluZm91cmwgOiAnaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL2FkdmltYWdlJywNCgkJCQl2ZXJzaW9uIDogdGlueW1jZS5tYWpvclZlcnNpb24gKyAiLiIgKyB0aW55bWNlLm1pbm9yVmVyc2lvbg0KCQkJfTsNCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnYWR2aW1hZ2UnLCB0aW55bWNlLnBsdWdpbnMuQWR2YW5jZWRJbWFnZVBsdWdpbik7DQp9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/image.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjYWR2aW1hZ2VfZGxnLmRpYWxvZ190aXRsZX08L3RpdGxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdGlueV9tY2VfcG9wdXAuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvbWN0YWJzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL2Zvcm1fdXRpbHMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvdmFsaWRhdGUuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZWRpdGFibGVfc2VsZWN0cy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9pbWFnZS5qcyI+PC9zY3JpcHQ+Cgk8bGluayBocmVmPSJjc3MvYWR2aW1hZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiAvPgo8L2hlYWQ+Cjxib2R5IGlkPSJhZHZpbWFnZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgogICAgPGZvcm0gb25zdWJtaXQ9IkltYWdlRGlhbG9nLmluc2VydCgpO3JldHVybiBmYWxzZTsiIGFjdGlvbj0iIyI+IAoJCTxkaXYgY2xhc3M9InRhYnMiPgoJCQk8dWw+CgkJCQk8bGkgaWQ9ImdlbmVyYWxfdGFiIiBjbGFzcz0iY3VycmVudCI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignZ2VuZXJhbF90YWInLCdnZW5lcmFsX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNhZHZpbWFnZV9kbGcudGFiX2dlbmVyYWx9PC9hPjwvc3Bhbj48L2xpPgoJCQkJPGxpIGlkPSJhcHBlYXJhbmNlX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignYXBwZWFyYW5jZV90YWInLCdhcHBlYXJhbmNlX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNhZHZpbWFnZV9kbGcudGFiX2FwcGVhcmFuY2V9PC9hPjwvc3Bhbj48L2xpPgoJCQkJPGxpIGlkPSJhZHZhbmNlZF90YWIiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2FkdmFuY2VkX3RhYicsJ2FkdmFuY2VkX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNhZHZpbWFnZV9kbGcudGFiX2FkdmFuY2VkfTwvYT48L3NwYW4+PC9saT4KCQkJPC91bD4KCQk8L2Rpdj4KCgkJPGRpdiBjbGFzcz0icGFuZWxfd3JhcHBlciI+CgkJCTxkaXYgaWQ9ImdlbmVyYWxfcGFuZWwiIGNsYXNzPSJwYW5lbCBjdXJyZW50Ij4KCQkJCTxmaWVsZHNldD4KCQkJCQkJPGxlZ2VuZD57I2FkdmltYWdlX2RsZy5nZW5lcmFsfTwvbGVnZW5kPgoKCQkJCQkJPHRhYmxlIGNsYXNzPSJwcm9wZXJ0aWVzIj4KCQkJCQkJCTx0cj4KCQkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBpZD0ic3JjbGFiZWwiIGZvcj0ic3JjIj57I2FkdmltYWdlX2RsZy5zcmN9PC9sYWJlbD48L3RkPgoJCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj48dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQkJCQkJCQk8dHI+IAoJCQkJCQkJCQkgIDx0ZD48aW5wdXQgbmFtZT0ic3JjIiB0eXBlPSJ0ZXh0IiBpZD0ic3JjIiB2YWx1ZT0iIiBjbGFzcz0ibWNlRm9jdXMiIG9uY2hhbmdlPSJJbWFnZURpYWxvZy5zaG93UHJldmlld0ltYWdlKHRoaXMudmFsdWUpOyIgLz48L3RkPiAKCQkJCQkJCQkJICA8dGQgaWQ9InNyY2Jyb3dzZXJjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJICA8L3RhYmxlPjwvdGQ+CgkJCQkJCQk8L3RyPgoJCQkJCQkJPHRyPgoJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJzcmNfbGlzdCI+eyNhZHZpbWFnZV9kbGcuaW1hZ2VfbGlzdH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJPHRkPjxzZWxlY3QgaWQ9InNyY19saXN0IiBuYW1lPSJzcmNfbGlzdCIgb25jaGFuZ2U9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcmMnKS52YWx1ZT10aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWx0JykudmFsdWU9dGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udGV4dDtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGl0bGUnKS52YWx1ZT10aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS50ZXh0O0ltYWdlRGlhbG9nLnNob3dQcmV2aWV3SW1hZ2UodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpOyI+PG9wdGlvbiB2YWx1ZT0iIj48L29wdGlvbj48L3NlbGVjdD48L3RkPgoJCQkJCQkJPC90cj4KCQkJCQkJCTx0cj4gCgkJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgaWQ9ImFsdGxhYmVsIiBmb3I9ImFsdCI+eyNhZHZpbWFnZV9kbGcuYWx0fTwvbGFiZWw+PC90ZD4gCgkJCQkJCQkJPHRkIGNvbHNwYW49IjIiPjxpbnB1dCBpZD0iYWx0IiBuYW1lPSJhbHQiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4gCgkJCQkJCQk8L3RyPiAKCQkJCQkJCTx0cj4gCgkJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgaWQ9InRpdGxlbGFiZWwiIGZvcj0idGl0bGUiPnsjYWR2aW1hZ2VfZGxnLnRpdGxlfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQkJPHRkIGNvbHNwYW49IjIiPjxpbnB1dCBpZD0idGl0bGUiIG5hbWU9InRpdGxlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCQkJPC90cj4KCQkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgoJCQkJPGZpZWxkc2V0PgoJCQkJCTxsZWdlbmQ+eyNhZHZpbWFnZV9kbGcucHJldmlld308L2xlZ2VuZD4KCQkJCQk8ZGl2IGlkPSJwcmV2Ij48L2Rpdj4KCQkJCTwvZmllbGRzZXQ+CgkJCTwvZGl2PgoKCQkJPGRpdiBpZD0iYXBwZWFyYW5jZV9wYW5lbCIgY2xhc3M9InBhbmVsIj4KCQkJCTxmaWVsZHNldD4KCQkJCQk8bGVnZW5kPnsjYWR2aW1hZ2VfZGxnLnRhYl9hcHBlYXJhbmNlfTwvbGVnZW5kPgoKCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQk8dHI+IAoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgaWQ9ImFsaWdubGFiZWwiIGZvcj0iYWxpZ24iPnsjYWR2aW1hZ2VfZGxnLmFsaWdufTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0iYWxpZ24iIG5hbWU9ImFsaWduIiBvbmNoYW5nZT0iSW1hZ2VEaWFsb2cudXBkYXRlU3R5bGUoJ2FsaWduJyk7SW1hZ2VEaWFsb2cuY2hhbmdlQXBwZWFyYW5jZSgpOyI+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImJhc2VsaW5lIj57I2FkdmltYWdlX2RsZy5hbGlnbl9iYXNlbGluZX08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idG9wIj57I2FkdmltYWdlX2RsZy5hbGlnbl90b3B9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Im1pZGRsZSI+eyNhZHZpbWFnZV9kbGcuYWxpZ25fbWlkZGxlfTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJib3R0b20iPnsjYWR2aW1hZ2VfZGxnLmFsaWduX2JvdHRvbX08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idGV4dC10b3AiPnsjYWR2aW1hZ2VfZGxnLmFsaWduX3RleHR0b3B9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InRleHQtYm90dG9tIj57I2FkdmltYWdlX2RsZy5hbGlnbl90ZXh0Ym90dG9tfTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJsZWZ0Ij57I2FkdmltYWdlX2RsZy5hbGlnbl9sZWZ0fTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJyaWdodCI+eyNhZHZpbWFnZV9kbGcuYWxpZ25fcmlnaHR9PC9vcHRpb24+CgkJCQkJCQkJPC9zZWxlY3Q+IAoJCQkJCQkJPC90ZD4KCQkJCQkJCTx0ZCByb3dzcGFuPSI2IiB2YWxpZ249InRvcCI+CgkJCQkJCQkJPGRpdiBjbGFzcz0iYWxpZ25QcmV2aWV3Ij4KCQkJCQkJCQkJPGltZyBpZD0iYWxpZ25TYW1wbGVJbWciIHNyYz0iaW1nL3NhbXBsZS5naWYiIGFsdD0ieyNhZHZpbWFnZV9kbGcuZXhhbXBsZV9pbWd9IiAvPgoJCQkJCQkJCQlMb3JlbSBpcHN1bSwgRG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVlciBhZGlwaXNjaW5nIGxvcmV1bSBpcHN1bSBlZGlwaXNjaW5nIGVsaXQsIHNlZCBkaWFtCgkJCQkJCQkJCW5vbnVtbXkgbmliaCBldWlzbW9kIHRpbmNpZHVudCB1dCBsYW9yZWV0IGRvbG9yZSBtYWduYSBhbGlxdWFtIGVyYXQgdm9sdXRwYXQuTG9yZXVtIGlwc3VtCgkJCQkJCQkJCWVkaXBpc2NpbmcgZWxpdCwgc2VkIGRpYW0gbm9udW1teSBuaWJoIGV1aXNtb2QgdGluY2lkdW50IHV0IGxhb3JlZXQgZG9sb3JlIG1hZ25hIGFsaXF1YW0KCQkJCQkJCQkJZXJhdCB2b2x1dHBhdC4KCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBpZD0id2lkdGhsYWJlbCIgZm9yPSJ3aWR0aCI+eyNhZHZpbWFnZV9kbGcuZGltZW5zaW9uc308L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCI+CgkJCQkJCQkJPGlucHV0IG5hbWU9IndpZHRoIiB0eXBlPSJ0ZXh0IiBpZD0id2lkdGgiIHZhbHVlPSIiIHNpemU9IjUiIG1heGxlbmd0aD0iNSIgY2xhc3M9InNpemUiIG9uY2hhbmdlPSJJbWFnZURpYWxvZy5jaGFuZ2VIZWlnaHQoKTsiIC8+IHggCgkJCQkJCQkJPGlucHV0IG5hbWU9ImhlaWdodCIgdHlwZT0idGV4dCIgaWQ9ImhlaWdodCIgdmFsdWU9IiIgc2l6ZT0iNSIgbWF4bGVuZ3RoPSI1IiBjbGFzcz0ic2l6ZSIgb25jaGFuZ2U9IkltYWdlRGlhbG9nLmNoYW5nZVdpZHRoKCk7IiAvPiBweAoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD4mbmJzcDs8L3RkPgoJCQkJCQkJPHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImNvbnN0cmFpbiIgdHlwZT0iY2hlY2tib3giIG5hbWU9ImNvbnN0cmFpbiIgY2xhc3M9ImNoZWNrYm94IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGlkPSJjb25zdHJhaW5sYWJlbCIgZm9yPSJjb25zdHJhaW4iPnsjYWR2aW1hZ2VfZGxnLmNvbnN0cmFpbl9wcm9wb3J0aW9uc308L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT48L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgaWQ9InZzcGFjZWxhYmVsIiBmb3I9InZzcGFjZSI+eyNhZHZpbWFnZV9kbGcudnNwYWNlfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IG5hbWU9InZzcGFjZSIgdHlwZT0idGV4dCIgaWQ9InZzcGFjZSIgdmFsdWU9IiIgc2l6ZT0iMyIgbWF4bGVuZ3RoPSIzIiBjbGFzcz0ibnVtYmVyIiBvbmNoYW5nZT0iSW1hZ2VEaWFsb2cudXBkYXRlU3R5bGUoJ3ZzcGFjZScpO0ltYWdlRGlhbG9nLmNoYW5nZUFwcGVhcmFuY2UoKTsiIG9uYmx1cj0iSW1hZ2VEaWFsb2cudXBkYXRlU3R5bGUoJ3ZzcGFjZScpO0ltYWdlRGlhbG9nLmNoYW5nZUFwcGVhcmFuY2UoKTsiIC8+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPiAKCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGlkPSJoc3BhY2VsYWJlbCIgZm9yPSJoc3BhY2UiPnsjYWR2aW1hZ2VfZGxnLmhzcGFjZX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPjxpbnB1dCBuYW1lPSJoc3BhY2UiIHR5cGU9InRleHQiIGlkPSJoc3BhY2UiIHZhbHVlPSIiIHNpemU9IjMiIG1heGxlbmd0aD0iMyIgY2xhc3M9Im51bWJlciIgb25jaGFuZ2U9IkltYWdlRGlhbG9nLnVwZGF0ZVN0eWxlKCdoc3BhY2UnKTtJbWFnZURpYWxvZy5jaGFuZ2VBcHBlYXJhbmNlKCk7IiBvbmJsdXI9IkltYWdlRGlhbG9nLnVwZGF0ZVN0eWxlKCdoc3BhY2UnKTtJbWFnZURpYWxvZy5jaGFuZ2VBcHBlYXJhbmNlKCk7IiAvPjwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgaWQ9ImJvcmRlcmxhYmVsIiBmb3I9ImJvcmRlciI+eyNhZHZpbWFnZV9kbGcuYm9yZGVyfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJib3JkZXIiIG5hbWU9ImJvcmRlciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iMyIgbWF4bGVuZ3RoPSIzIiBjbGFzcz0ibnVtYmVyIiBvbmNoYW5nZT0iSW1hZ2VEaWFsb2cudXBkYXRlU3R5bGUoJ2JvcmRlcicpO0ltYWdlRGlhbG9nLmNoYW5nZUFwcGVhcmFuY2UoKTsiIG9uYmx1cj0iSW1hZ2VEaWFsb2cudXBkYXRlU3R5bGUoJ2JvcmRlcicpO0ltYWdlRGlhbG9nLmNoYW5nZUFwcGVhcmFuY2UoKTsiIC8+PC90ZD4gCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iY2xhc3NfbGlzdCI+eyNjbGFzc19uYW1lfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj48c2VsZWN0IGlkPSJjbGFzc19saXN0IiBuYW1lPSJjbGFzc19saXN0IiBjbGFzcz0ibWNlRWRpdGFibGVTZWxlY3QiPjxvcHRpb24gdmFsdWU9IiI+PC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGlkPSJzdHlsZWxhYmVsIiBmb3I9InN0eWxlIj57I2FkdmltYWdlX2RsZy5zdHlsZX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPjxpbnB1dCBpZD0ic3R5bGUiIG5hbWU9InN0eWxlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBvbmNoYW5nZT0iSW1hZ2VEaWFsb2cuY2hhbmdlQXBwZWFyYW5jZSgpOyIgLz48L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTwhLS0gPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgaWQ9ImNsYXNzZXNsYWJlbCIgZm9yPSJjbGFzc2VzIj57I2FkdmltYWdlX2RsZy5jbGFzc2VzfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+PGlucHV0IGlkPSJjbGFzc2VzIiBuYW1lPSJjbGFzc2VzIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBvbmNoYW5nZT0ic2VsZWN0QnlWYWx1ZSh0aGlzLmZvcm0sJ2NsYXNzbGlzdCcsdGhpcy52YWx1ZSx0cnVlKTsiIC8+PC90ZD4gCgkJCQkJCTwvdHI+IC0tPgoJCQkJCTwvdGFibGU+CgkJCQk8L2ZpZWxkc2V0PgoJCQk8L2Rpdj4KCgkJCTxkaXYgaWQ9ImFkdmFuY2VkX3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJCQkJPGZpZWxkc2V0PgoJCQkJCTxsZWdlbmQ+eyNhZHZpbWFnZV9kbGcuc3dhcF9pbWFnZX08L2xlZ2VuZD4KCgkJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0ib25tb3VzZW1vdmVjaGVjayIgbmFtZT0ib25tb3VzZW1vdmVjaGVjayIgY2xhc3M9ImNoZWNrYm94IiBvbmNsaWNrPSJJbWFnZURpYWxvZy5zZXRTd2FwSW1hZ2UodGhpcy5jaGVja2VkKTsiIC8+CgkJCQkJPGxhYmVsIGlkPSJvbm1vdXNlbW92ZWNoZWNrbGFiZWwiIGZvcj0ib25tb3VzZW1vdmVjaGVjayI+eyNhZHZpbWFnZV9kbGcuYWx0X2ltYWdlfTwvbGFiZWw+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgoJCQkJCQkJPHRyPgoJCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGlkPSJvbm1vdXNlb3ZlcnNyY2xhYmVsIiBmb3I9Im9ubW91c2VvdmVyc3JjIj57I2FkdmltYWdlX2RsZy5tb3VzZW92ZXJ9PC9sYWJlbD48L3RkPiAKCQkJCQkJCQk8dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4gCgkJCQkJCQkJCTx0cj4gCgkJCQkJCQkJCSAgPHRkPjxpbnB1dCBpZD0ib25tb3VzZW92ZXJzcmMiIG5hbWU9Im9ubW91c2VvdmVyc3JjIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCQkJCQkgIDx0ZCBpZD0ib25tb3VzZW92ZXJzcmNjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJICA8L3RhYmxlPjwvdGQ+CgkJCQkJCQk8L3RyPgoJCQkJCQkJPHRyPgoJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJvdmVyX2xpc3QiPnsjYWR2aW1hZ2VfZGxnLmltYWdlX2xpc3R9PC9sYWJlbD48L3RkPgoJCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJvdmVyX2xpc3QiIG5hbWU9Im92ZXJfbGlzdCIgb25jaGFuZ2U9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbm1vdXNlb3ZlcnNyYycpLnZhbHVlPXRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlOyI+PG9wdGlvbiB2YWx1ZT0iIj48L29wdGlvbj48L3NlbGVjdD48L3RkPgoJCQkJCQkJPC90cj4KCQkJCQkJCTx0cj4gCgkJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgaWQ9Im9ubW91c2VvdXRzcmNsYWJlbCIgZm9yPSJvbm1vdXNlb3V0c3JjIj57I2FkdmltYWdlX2RsZy5tb3VzZW91dH08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMiI+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4gCgkJCQkJCQkJCTx0cj4gCgkJCQkJCQkJCSAgPHRkPjxpbnB1dCBpZD0ib25tb3VzZW91dHNyYyIgbmFtZT0ib25tb3VzZW91dHNyYyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPiAKCQkJCQkJCQkJICA8dGQgaWQ9Im9ubW91c2VvdXRzcmNjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCTwvdHI+IAoJCQkJCQkJCSAgPC90YWJsZT48L3RkPiAKCQkJCQkJCTwvdHI+CgkJCQkJCQk8dHI+CgkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9Im91dF9saXN0Ij57I2FkdmltYWdlX2RsZy5pbWFnZV9saXN0fTwvbGFiZWw+PC90ZD4KCQkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0ib3V0X2xpc3QiIG5hbWU9Im91dF9saXN0IiBvbmNoYW5nZT0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29ubW91c2VvdXRzcmMnKS52YWx1ZT10aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZTsiPjxvcHRpb24gdmFsdWU9IiI+PC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgoJCQkJPGZpZWxkc2V0PgoJCQkJCTxsZWdlbmQ+eyNhZHZpbWFnZV9kbGcubWlzY308L2xlZ2VuZD4KCgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgaWQ9ImlkbGFiZWwiIGZvcj0iaWQiPnsjYWR2aW1hZ2VfZGxnLmlkfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJpZCIgbmFtZT0iaWQiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4gCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBpZD0iZGlybGFiZWwiIGZvcj0iZGlyIj57I2FkdmltYWdlX2RsZy5sYW5nZGlyfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHNlbGVjdCBpZD0iZGlyIiBuYW1lPSJkaXIiIG9uY2hhbmdlPSJJbWFnZURpYWxvZy5jaGFuZ2VBcHBlYXJhbmNlKCk7Ij4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJsdHIiPnsjYWR2aW1hZ2VfZGxnLmx0cn08L29wdGlvbj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJydGwiPnsjYWR2aW1hZ2VfZGxnLnJ0bH08L29wdGlvbj4gCgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGlkPSJsYW5nbGFiZWwiIGZvcj0ibGFuZyI+eyNhZHZpbWFnZV9kbGcubGFuZ2NvZGV9PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD4KCQkJCQkJCQk8aW5wdXQgaWQ9ImxhbmciIG5hbWU9ImxhbmciIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+CgkJCQkJCQk8L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGlkPSJ1c2VtYXBsYWJlbCIgZm9yPSJ1c2VtYXAiPnsjYWR2aW1hZ2VfZGxnLm1hcH08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTxpbnB1dCBpZD0idXNlbWFwIiBuYW1lPSJ1c2VtYXAiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+CgkJCQkJCQk8L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGlkPSJsb25nZGVzY2xhYmVsIiBmb3I9ImxvbmdkZXNjIj57I2FkdmltYWdlX2RsZy5sb25nX2Rlc2N9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJICA8dGQ+PGlucHV0IGlkPSJsb25nZGVzYyIgbmFtZT0ibG9uZ2Rlc2MiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4KCQkJCQkJCQkJICA8dGQgaWQ9ImxvbmdkZXNjY29udGFpbmVyIj4mbmJzcDs8L3RkPgoJCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTwvdGFibGU+PC90ZD4gCgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgkJCTwvZGl2PgoJCTwvZGl2PgoKCQk8ZGl2IGNsYXNzPSJtY2VBY3Rpb25QYW5lbCI+CgkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJpbnNlcnQiIG5hbWU9Imluc2VydCIgdmFsdWU9InsjaW5zZXJ0fSIgLz4KCQkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNhbmNlbCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0ieyNjYW5jZWx9IiBvbmNsaWNrPSJ0aW55TUNFUG9wdXAuY2xvc2UoKTsiIC8+CgkJPC9kaXY+CiAgICA8L2Zvcm0+CjwvYm9keT4gCjwvaHRtbD4gCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/img/sample.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhLQAtAOYAAP////39/fz8/Pn5+fj4+PPz8/Dw8Ovr6+np6ebm5uLi4uDg4N7e3t3d3dzc3Nvb29ra2tnZ2djY2NfX19bW1tTU1NPT1dDQ0s7Oz83NzcvLy8rKysnJycjIyMbGxsTExMPDw8LCwsHBwcDAwL+/v729vby8vLu7u7q6urm5ube3t7a2trW1tbS0tLOzs7KysrGxsbCwsK+vr66urq2traysrKurq6qqqqmpqamprqenp6ampqWlpaSkpKOjo6OjqKKioqGhoaGhpaCgoKCgo5+fn56eoZ6enp2dnZycnJubm5uboJqampqanZmZmZiYmJeXl5aWlpWVl5WVlZaWlZSUlJOTk5KSlJKSkpGRkZKSkZCQkJCQko+Pj5CQj46OkY6Oj46Ojo2NjYyMjIuLi4qKiomJiYiIiIeHh4aGhoWFhYSEhIODg4KCgoCAgH5+fn19fXx8fHp6enh4eHd3eHZ2dnR0dHJycnBwcG1tbWlpaWVlZWJiYllZWQAAAAAAACH5BAQUAP8ALAAAAAAtAC0AAAf/gBOCg4SFgxCIiIKJjIaOj5ATDpOTgpSUEZGajhCbnp+OJUpQSlMygkdQSU5DNhMVD6CGnYMVIz5bYltjSIJVW1ZdTzuyniJIVkzKy0xOzlFIOCPFhIowMCwsOFFMON44OztHzuRDN9SDDhISWVlT71M72fPaTFDkz1FRYcULCxNhwlgZaIUHvWw4oFRZCKWhQ37olCGZiESHi4sYbxzZuLEZOSxBPDn4x+HGDhsoU8p4wZIlCxg1YsK4UeTJx5CgZlgZsmLFwZYsbchY4WLlDSdYnijVghMSgwk1oCBxxqNFC4xYXaiokaQHixpFiigZMwaKsixDNDmY4CKIjpo8/y4CZUnD244iPm4g6cJ3jRlVSaT4KMYkiNy5PZwBkWEjSZc0kNOUNWKkiY5NDRYkQDABGstr11rAGIKlSxEXNJ6UYcOaDZknRH4YyTFBQQQKjtZJmKREyZDDQH3oCwKTiRg1yNWULSJkCe1HtAb1bqEihXXrGG3w4GHDhQ3jyM+EaUdeSlpHaye0W0gjQ4YR8EecyJoRvJoyT6agac1GzpMJ/xiiRHhq4FBBBR6AoGAJLsTgoFUtpDBDEmEgR4Y9aLTRhhpt2AFFJEEE0UMPLngggnUkkIACfUXxAMUYyJnxzhlrROYGEyBUoElvNyhlg3VWqWCCCi+wYMMTYohxxv8ZFpKBxpNPdiHVRE8AAckocrgRBFEXmRBCCjGwwMMZcKxRY2RopmGGE1G0IQccdqxxpRJwtNHDCSqo0EIJIWwVgw9luKFGmmmu6UQabrgxhxnVLNKbEl1UUYQOlOoAAwojfMCBC2G4gSYbccRhpploAJNkklv0IMAAB4wQ1nZFOHHSE0tuwYQPL2CQwAEdYAEHmm/okYcbaIy6xhhVKDMEFHIE4CwLbqyxpBhQ0ECDGHfc4QYWMWQAgQII9BpHGmR0YcUZd9ABBhiRybEGE1bEQccbYTgbAAljuPPOEzfQgEWoalghQgIUgLBBC128kYatTEwhGWULZSEtE2jw0Uf/Hh7Y+0AJH3TQAQxPpICgCSbQkAUQJcgwRA9MlNGGZAN5cQYYRqiwwc0jxLCQDk/IgEAAA9gr9NABQNDFHGYmh2ZyapjRxAUARA0A0VRXXfQawyYarRlmtPGGHGC/+QUGU1tt9tAPQOHpp2xwfaoYWQhhQdRn1x1AARXooMbab+ABhxIuxNeBBQsYEHUBdtftQRvjmjEHH22QsMDQUpdNddBCSz00AVFzAIccaj4exQH2DlD54YmbbUCv4cnBxxapD+2xBhrMTrvtHnhwswcsPMEGGnLs4aEKtBfv8fEnnBDC8syX4Pzz0EfvvMdAEBuHHnrIEYQIIkjPJ/Pghy/+tfgdgFBEG2hcr4caN+QOwvjwyyD//PTXP78OWLwcPB92WGGttTCo3wpuEIXwMeOACFQGFqCEBjjogQ97mEMZJqiKAybhghi8oEM2yEGHVEEMbHBDGRZCBjnYwQ54yIMe4mQFh2TwhUlQigxnSMMnYCENL8tCb6owwTLUYQ98yAMcpKQMGGYwIEhMohLDQIbkkGELueCaGdxQhzpkyQynMiIGjcXFLp6JUJGRohnCs6QymnFJgQAAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/js/image.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIEltYWdlRGlhbG9nID0gew0KCXByZUluaXQgOiBmdW5jdGlvbigpIHsNCgkJdmFyIHVybDsNCg0KCQl0aW55TUNFUG9wdXAucmVxdWlyZUxhbmdQYWNrKCk7DQoNCgkJaWYgKHVybCA9IHRpbnlNQ0VQb3B1cC5nZXRQYXJhbSgiZXh0ZXJuYWxfaW1hZ2VfbGlzdF91cmwiKSkNCgkJCWRvY3VtZW50LndyaXRlKCc8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyArIHRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUodXJsKSArICciPjwvc2NyaXB0PicpOw0KCX0sDQoNCglpbml0IDogZnVuY3Rpb24oZWQpIHsNCgkJdmFyIGYgPSBkb2N1bWVudC5mb3Jtc1swXSwgbmwgPSBmLmVsZW1lbnRzLCBlZCA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IsIGRvbSA9IGVkLmRvbSwgbiA9IGVkLnNlbGVjdGlvbi5nZXROb2RlKCk7DQoNCgkJdGlueU1DRVBvcHVwLnJlc2l6ZVRvSW5uZXJTaXplKCk7DQoJCXRoaXMuZmlsbENsYXNzTGlzdCgnY2xhc3NfbGlzdCcpOw0KCQl0aGlzLmZpbGxGaWxlTGlzdCgnc3JjX2xpc3QnLCAndGlueU1DRUltYWdlTGlzdCcpOw0KCQl0aGlzLmZpbGxGaWxlTGlzdCgnb3Zlcl9saXN0JywgJ3RpbnlNQ0VJbWFnZUxpc3QnKTsNCgkJdGhpcy5maWxsRmlsZUxpc3QoJ291dF9saXN0JywgJ3RpbnlNQ0VJbWFnZUxpc3QnKTsNCgkJVGlueU1DRV9FZGl0YWJsZVNlbGVjdHMuaW5pdCgpOw0KDQoJCWlmIChuLm5vZGVOYW1lID09ICdJTUcnKSB7DQoJCQlubC5zcmMudmFsdWUgPSBkb20uZ2V0QXR0cmliKG4sICdzcmMnKTsNCgkJCW5sLndpZHRoLnZhbHVlID0gZG9tLmdldEF0dHJpYihuLCAnd2lkdGgnKTsNCgkJCW5sLmhlaWdodC52YWx1ZSA9IGRvbS5nZXRBdHRyaWIobiwgJ2hlaWdodCcpOw0KCQkJbmwuYWx0LnZhbHVlID0gZG9tLmdldEF0dHJpYihuLCAnYWx0Jyk7DQoJCQlubC50aXRsZS52YWx1ZSA9IGRvbS5nZXRBdHRyaWIobiwgJ3RpdGxlJyk7DQoJCQlubC52c3BhY2UudmFsdWUgPSB0aGlzLmdldEF0dHJpYihuLCAndnNwYWNlJyk7DQoJCQlubC5oc3BhY2UudmFsdWUgPSB0aGlzLmdldEF0dHJpYihuLCAnaHNwYWNlJyk7DQoJCQlubC5ib3JkZXIudmFsdWUgPSB0aGlzLmdldEF0dHJpYihuLCAnYm9yZGVyJyk7DQoJCQlzZWxlY3RCeVZhbHVlKGYsICdhbGlnbicsIHRoaXMuZ2V0QXR0cmliKG4sICdhbGlnbicpKTsNCgkJCXNlbGVjdEJ5VmFsdWUoZiwgJ2NsYXNzX2xpc3QnLCBkb20uZ2V0QXR0cmliKG4sICdjbGFzcycpLCB0cnVlLCB0cnVlKTsNCgkJCW5sLnN0eWxlLnZhbHVlID0gZG9tLmdldEF0dHJpYihuLCAnc3R5bGUnKTsNCgkJCW5sLmlkLnZhbHVlID0gZG9tLmdldEF0dHJpYihuLCAnaWQnKTsNCgkJCW5sLmRpci52YWx1ZSA9IGRvbS5nZXRBdHRyaWIobiwgJ2RpcicpOw0KCQkJbmwubGFuZy52YWx1ZSA9IGRvbS5nZXRBdHRyaWIobiwgJ2xhbmcnKTsNCgkJCW5sLnVzZW1hcC52YWx1ZSA9IGRvbS5nZXRBdHRyaWIobiwgJ3VzZW1hcCcpOw0KCQkJbmwubG9uZ2Rlc2MudmFsdWUgPSBkb20uZ2V0QXR0cmliKG4sICdsb25nZGVzYycpOw0KCQkJbmwuaW5zZXJ0LnZhbHVlID0gZWQuZ2V0TGFuZygndXBkYXRlJyk7DQoNCgkJCWlmICgvXlxzKnRoaXMuc3JjXHMqPVxzKlwnKFteXCddKylcJzs/XHMqJC8udGVzdChkb20uZ2V0QXR0cmliKG4sICdvbm1vdXNlb3ZlcicpKSkNCgkJCQlubC5vbm1vdXNlb3ZlcnNyYy52YWx1ZSA9IGRvbS5nZXRBdHRyaWIobiwgJ29ubW91c2VvdmVyJykucmVwbGFjZSgvXlxzKnRoaXMuc3JjXHMqPVxzKlwnKFteXCddKylcJzs/XHMqJC8sICckMScpOw0KDQoJCQlpZiAoL15ccyp0aGlzLnNyY1xzKj1ccypcJyhbXlwnXSspXCc7P1xzKiQvLnRlc3QoZG9tLmdldEF0dHJpYihuLCAnb25tb3VzZW91dCcpKSkNCgkJCQlubC5vbm1vdXNlb3V0c3JjLnZhbHVlID0gZG9tLmdldEF0dHJpYihuLCAnb25tb3VzZW91dCcpLnJlcGxhY2UoL15ccyp0aGlzLnNyY1xzKj1ccypcJyhbXlwnXSspXCc7P1xzKiQvLCAnJDEnKTsNCg0KCQkJaWYgKGVkLnNldHRpbmdzLmlubGluZV9zdHlsZXMpIHsNCgkJCQkvLyBNb3ZlIGF0dHJpYnMgdG8gc3R5bGVzDQoJCQkJaWYgKGRvbS5nZXRBdHRyaWIobiwgJ2FsaWduJykpDQoJCQkJCXRoaXMudXBkYXRlU3R5bGUoJ2FsaWduJyk7DQoNCgkJCQlpZiAoZG9tLmdldEF0dHJpYihuLCAnaHNwYWNlJykpDQoJCQkJCXRoaXMudXBkYXRlU3R5bGUoJ2hzcGFjZScpOw0KDQoJCQkJaWYgKGRvbS5nZXRBdHRyaWIobiwgJ2JvcmRlcicpKQ0KCQkJCQl0aGlzLnVwZGF0ZVN0eWxlKCdib3JkZXInKTsNCg0KCQkJCWlmIChkb20uZ2V0QXR0cmliKG4sICd2c3BhY2UnKSkNCgkJCQkJdGhpcy51cGRhdGVTdHlsZSgndnNwYWNlJyk7DQoJCQl9DQoJCX0NCg0KCQkvLyBTZXR1cCBicm93c2UgYnV0dG9uDQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcmNicm93c2VyY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0QnJvd3NlckhUTUwoJ3NyY2Jyb3dzZXInLCdzcmMnLCdpbWFnZScsJ3RoZW1lX2FkdmFuY2VkX2ltYWdlJyk7DQoJCWlmIChpc1Zpc2libGUoJ3NyY2Jyb3dzZXInKSkNCgkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcmMnKS5zdHlsZS53aWR0aCA9ICcyNjBweCc7DQoNCgkJLy8gU2V0dXAgYnJvd3NlIGJ1dHRvbg0KCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25tb3VzZW92ZXJzcmNjb250YWluZXInKS5pbm5lckhUTUwgPSBnZXRCcm93c2VySFRNTCgnb3ZlcmJyb3dzZXInLCdvbm1vdXNlb3ZlcnNyYycsJ2ltYWdlJywndGhlbWVfYWR2YW5jZWRfaW1hZ2UnKTsNCgkJaWYgKGlzVmlzaWJsZSgnb3ZlcmJyb3dzZXInKSkNCgkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbm1vdXNlb3ZlcnNyYycpLnN0eWxlLndpZHRoID0gJzI2MHB4JzsNCg0KCQkvLyBTZXR1cCBicm93c2UgYnV0dG9uDQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbm1vdXNlb3V0c3JjY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0QnJvd3NlckhUTUwoJ291dGJyb3dzZXInLCdvbm1vdXNlb3V0c3JjJywnaW1hZ2UnLCd0aGVtZV9hZHZhbmNlZF9pbWFnZScpOw0KCQlpZiAoaXNWaXNpYmxlKCdvdXRicm93c2VyJykpDQoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25tb3VzZW91dHNyYycpLnN0eWxlLndpZHRoID0gJzI2MHB4JzsNCg0KCQkvLyBJZiBvcHRpb24gZW5hYmxlZCBkZWZhdWx0IGNvbnRyYWluIHByb3BvcnRpb25zIHRvIGNoZWNrZWQNCgkJaWYgKGVkLmdldFBhcmFtKCJhZHZpbWFnZV9jb25zdHJhaW5fcHJvcG9ydGlvbnMiLCB0cnVlKSkNCgkJCWYuY29uc3RyYWluLmNoZWNrZWQgPSB0cnVlOw0KDQoJCS8vIENoZWNrIHN3YXAgaW1hZ2UgaWYgdmFsaWQgZGF0YQ0KCQlpZiAobmwub25tb3VzZW92ZXJzcmMudmFsdWUgfHwgbmwub25tb3VzZW91dHNyYy52YWx1ZSkNCgkJCXRoaXMuc2V0U3dhcEltYWdlKHRydWUpOw0KCQllbHNlDQoJCQl0aGlzLnNldFN3YXBJbWFnZShmYWxzZSk7DQoNCgkJdGhpcy5jaGFuZ2VBcHBlYXJhbmNlKCk7DQoJCXRoaXMuc2hvd1ByZXZpZXdJbWFnZShubC5zcmMudmFsdWUsIDEpOw0KCX0sDQoNCglpbnNlcnQgOiBmdW5jdGlvbihmaWxlLCB0aXRsZSkgew0KCQl2YXIgZWQgPSB0aW55TUNFUG9wdXAuZWRpdG9yLCB0ID0gdGhpcywgZiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KDQoJCWlmIChmLnNyYy52YWx1ZSA9PT0gJycpIHsNCgkJCWlmIChlZC5zZWxlY3Rpb24uZ2V0Tm9kZSgpLm5vZGVOYW1lID09ICdJTUcnKSB7DQoJCQkJZWQuZG9tLnJlbW92ZShlZC5zZWxlY3Rpb24uZ2V0Tm9kZSgpKTsNCgkJCQllZC5leGVjQ29tbWFuZCgnbWNlUmVwYWludCcpOw0KCQkJfQ0KDQoJCQl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCWlmICh0aW55TUNFUG9wdXAuZ2V0UGFyYW0oImFjY2Vzc2liaWxpdHlfd2FybmluZ3MiLCAxKSkgew0KCQkJaWYgKCFmLmFsdC52YWx1ZSkgew0KCQkJCXRpbnlNQ0VQb3B1cC5jb25maXJtKHRpbnlNQ0VQb3B1cC5nZXRMYW5nKCdhZHZpbWFnZV9kbGcubWlzc2luZ19hbHQnKSwgZnVuY3Rpb24ocykgew0KCQkJCQlpZiAocykNCgkJCQkJCXQuaW5zZXJ0QW5kQ2xvc2UoKTsNCgkJCQl9KTsNCg0KCQkJCXJldHVybjsNCgkJCX0NCgkJfQ0KDQoJCXQuaW5zZXJ0QW5kQ2xvc2UoKTsNCgl9LA0KDQoJaW5zZXJ0QW5kQ2xvc2UgOiBmdW5jdGlvbigpIHsNCgkJdmFyIGVkID0gdGlueU1DRVBvcHVwLmVkaXRvciwgZiA9IGRvY3VtZW50LmZvcm1zWzBdLCBubCA9IGYuZWxlbWVudHMsIHYsIGFyZ3MgPSB7fSwgZWw7DQoNCgkJdGlueU1DRVBvcHVwLnJlc3RvcmVTZWxlY3Rpb24oKTsNCg0KCQkvLyBGaXhlcyBjcmFzaCBpbiBTYWZhcmkNCgkJaWYgKHRpbnltY2UuaXNXZWJLaXQpDQoJCQllZC5nZXRXaW4oKS5mb2N1cygpOw0KDQoJCWlmICghZWQuc2V0dGluZ3MuaW5saW5lX3N0eWxlcykgew0KCQkJYXJncyA9IHsNCgkJCQl2c3BhY2UgOiBubC52c3BhY2UudmFsdWUsDQoJCQkJaHNwYWNlIDogbmwuaHNwYWNlLnZhbHVlLA0KCQkJCWJvcmRlciA6IG5sLmJvcmRlci52YWx1ZSwNCgkJCQlhbGlnbiA6IGdldFNlbGVjdFZhbHVlKGYsICdhbGlnbicpDQoJCQl9Ow0KCQl9IGVsc2Ugew0KCQkJLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgdmFsdWVzDQoJCQlhcmdzID0gew0KCQkJCXZzcGFjZSA6ICcnLA0KCQkJCWhzcGFjZSA6ICcnLA0KCQkJCWJvcmRlciA6ICcnLA0KCQkJCWFsaWduIDogJycNCgkJCX07DQoJCX0NCg0KCQl0aW55bWNlLmV4dGVuZChhcmdzLCB7DQoJCQlzcmMgOiBubC5zcmMudmFsdWUsDQoJCQl3aWR0aCA6IG5sLndpZHRoLnZhbHVlLA0KCQkJaGVpZ2h0IDogbmwuaGVpZ2h0LnZhbHVlLA0KCQkJYWx0IDogbmwuYWx0LnZhbHVlLA0KCQkJdGl0bGUgOiBubC50aXRsZS52YWx1ZSwNCgkJCSdjbGFzcycgOiBnZXRTZWxlY3RWYWx1ZShmLCAnY2xhc3NfbGlzdCcpLA0KCQkJc3R5bGUgOiBubC5zdHlsZS52YWx1ZSwNCgkJCWlkIDogbmwuaWQudmFsdWUsDQoJCQlkaXIgOiBubC5kaXIudmFsdWUsDQoJCQlsYW5nIDogbmwubGFuZy52YWx1ZSwNCgkJCXVzZW1hcCA6IG5sLnVzZW1hcC52YWx1ZSwNCgkJCWxvbmdkZXNjIDogbmwubG9uZ2Rlc2MudmFsdWUNCgkJfSk7DQoNCgkJYXJncy5vbm1vdXNlb3ZlciA9IGFyZ3Mub25tb3VzZW91dCA9ICcnOw0KDQoJCWlmIChmLm9ubW91c2Vtb3ZlY2hlY2suY2hlY2tlZCkgew0KCQkJaWYgKG5sLm9ubW91c2VvdmVyc3JjLnZhbHVlKQ0KCQkJCWFyZ3Mub25tb3VzZW92ZXIgPSAidGhpcy5zcmM9JyIgKyBubC5vbm1vdXNlb3ZlcnNyYy52YWx1ZSArICInOyI7DQoNCgkJCWlmIChubC5vbm1vdXNlb3V0c3JjLnZhbHVlKQ0KCQkJCWFyZ3Mub25tb3VzZW91dCA9ICJ0aGlzLnNyYz0nIiArIG5sLm9ubW91c2VvdXRzcmMudmFsdWUgKyAiJzsiOw0KCQl9DQoNCgkJZWwgPSBlZC5zZWxlY3Rpb24uZ2V0Tm9kZSgpOw0KDQoJCWlmIChlbCAmJiBlbC5ub2RlTmFtZSA9PSAnSU1HJykgew0KCQkJZWQuZG9tLnNldEF0dHJpYnMoZWwsIGFyZ3MpOw0KCQl9IGVsc2Ugew0KCQkJZWQuZXhlY0NvbW1hbmQoJ21jZUluc2VydENvbnRlbnQnLCBmYWxzZSwgJzxpbWcgaWQ9Il9fbWNlX3RtcCIgLz4nLCB7c2tpcF91bmRvIDogMX0pOw0KCQkJZWQuZG9tLnNldEF0dHJpYnMoJ19fbWNlX3RtcCcsIGFyZ3MpOw0KCQkJZWQuZG9tLnNldEF0dHJpYignX19tY2VfdG1wJywgJ2lkJywgJycpOw0KCQkJZWQudW5kb01hbmFnZXIuYWRkKCk7DQoJCX0NCg0KCQl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCgl9LA0KDQoJZ2V0QXR0cmliIDogZnVuY3Rpb24oZSwgYXQpIHsNCgkJdmFyIGVkID0gdGlueU1DRVBvcHVwLmVkaXRvciwgZG9tID0gZWQuZG9tLCB2LCB2MjsNCg0KCQlpZiAoZWQuc2V0dGluZ3MuaW5saW5lX3N0eWxlcykgew0KCQkJc3dpdGNoIChhdCkgew0KCQkJCWNhc2UgJ2FsaWduJzoNCgkJCQkJaWYgKHYgPSBkb20uZ2V0U3R5bGUoZSwgJ2Zsb2F0JykpDQoJCQkJCQlyZXR1cm4gdjsNCg0KCQkJCQlpZiAodiA9IGRvbS5nZXRTdHlsZShlLCAndmVydGljYWwtYWxpZ24nKSkNCgkJCQkJCXJldHVybiB2Ow0KDQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAnaHNwYWNlJzoNCgkJCQkJdiA9IGRvbS5nZXRTdHlsZShlLCAnbWFyZ2luLWxlZnQnKQ0KCQkJCQl2MiA9IGRvbS5nZXRTdHlsZShlLCAnbWFyZ2luLXJpZ2h0Jyk7DQoNCgkJCQkJaWYgKHYgJiYgdiA9PSB2MikNCgkJCQkJCXJldHVybiBwYXJzZUludCh2LnJlcGxhY2UoL1teMC05XS9nLCAnJykpOw0KDQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAndnNwYWNlJzoNCgkJCQkJdiA9IGRvbS5nZXRTdHlsZShlLCAnbWFyZ2luLXRvcCcpDQoJCQkJCXYyID0gZG9tLmdldFN0eWxlKGUsICdtYXJnaW4tYm90dG9tJyk7DQoJCQkJCWlmICh2ICYmIHYgPT0gdjIpDQoJCQkJCQlyZXR1cm4gcGFyc2VJbnQodi5yZXBsYWNlKC9bXjAtOV0vZywgJycpKTsNCg0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgJ2JvcmRlcic6DQoJCQkJCXYgPSAwOw0KDQoJCQkJCXRpbnltY2UuZWFjaChbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLCBmdW5jdGlvbihzdikgew0KCQkJCQkJc3YgPSBkb20uZ2V0U3R5bGUoZSwgJ2JvcmRlci0nICsgc3YgKyAnLXdpZHRoJyk7DQoNCgkJCQkJCS8vIEZhbHNlIG9yIG5vdCB0aGUgc2FtZSBhcyBwcmV2DQoJCQkJCQlpZiAoIXN2IHx8IChzdiAhPSB2ICYmIHYgIT09IDApKSB7DQoJCQkJCQkJdiA9IDA7DQoJCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoc3YpDQoJCQkJCQkJdiA9IHN2Ow0KCQkJCQl9KTsNCg0KCQkJCQlpZiAodikNCgkJCQkJCXJldHVybiBwYXJzZUludCh2LnJlcGxhY2UoL1teMC05XS9nLCAnJykpOw0KDQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoNCgkJaWYgKHYgPSBkb20uZ2V0QXR0cmliKGUsIGF0KSkNCgkJCXJldHVybiB2Ow0KDQoJCXJldHVybiAnJzsNCgl9LA0KDQoJc2V0U3dhcEltYWdlIDogZnVuY3Rpb24oc3QpIHsNCgkJdmFyIGYgPSBkb2N1bWVudC5mb3Jtc1swXTsNCg0KCQlmLm9ubW91c2Vtb3ZlY2hlY2suY2hlY2tlZCA9IHN0Ow0KCQlzZXRCcm93c2VyRGlzYWJsZWQoJ292ZXJicm93c2VyJywgIXN0KTsNCgkJc2V0QnJvd3NlckRpc2FibGVkKCdvdXRicm93c2VyJywgIXN0KTsNCg0KCQlpZiAoZi5vdmVyX2xpc3QpDQoJCQlmLm92ZXJfbGlzdC5kaXNhYmxlZCA9ICFzdDsNCg0KCQlpZiAoZi5vdXRfbGlzdCkNCgkJCWYub3V0X2xpc3QuZGlzYWJsZWQgPSAhc3Q7DQoNCgkJZi5vbm1vdXNlb3ZlcnNyYy5kaXNhYmxlZCA9ICFzdDsNCgkJZi5vbm1vdXNlb3V0c3JjLmRpc2FibGVkICA9ICFzdDsNCgl9LA0KDQoJZmlsbENsYXNzTGlzdCA6IGZ1bmN0aW9uKGlkKSB7DQoJCXZhciBkb20gPSB0aW55TUNFUG9wdXAuZG9tLCBsc3QgPSBkb20uZ2V0KGlkKSwgdiwgY2w7DQoNCgkJaWYgKHYgPSB0aW55TUNFUG9wdXAuZ2V0UGFyYW0oJ3RoZW1lX2FkdmFuY2VkX3N0eWxlcycpKSB7DQoJCQljbCA9IFtdOw0KDQoJCQl0aW55bWNlLmVhY2godi5zcGxpdCgnOycpLCBmdW5jdGlvbih2KSB7DQoJCQkJdmFyIHAgPSB2LnNwbGl0KCc9Jyk7DQoNCgkJCQljbC5wdXNoKHsndGl0bGUnIDogcFswXSwgJ2NsYXNzJyA6IHBbMV19KTsNCgkJCX0pOw0KCQl9IGVsc2UNCgkJCWNsID0gdGlueU1DRVBvcHVwLmVkaXRvci5kb20uZ2V0Q2xhc3NlcygpOw0KDQoJCWlmIChjbC5sZW5ndGggPiAwKSB7DQoJCQlsc3Qub3B0aW9ucy5sZW5ndGggPSAwOw0KCQkJbHN0Lm9wdGlvbnNbbHN0Lm9wdGlvbnMubGVuZ3RoXSA9IG5ldyBPcHRpb24odGlueU1DRVBvcHVwLmdldExhbmcoJ25vdF9zZXQnKSwgJycpOw0KDQoJCQl0aW55bWNlLmVhY2goY2wsIGZ1bmN0aW9uKG8pIHsNCgkJCQlsc3Qub3B0aW9uc1tsc3Qub3B0aW9ucy5sZW5ndGhdID0gbmV3IE9wdGlvbihvLnRpdGxlIHx8IG9bJ2NsYXNzJ10sIG9bJ2NsYXNzJ10pOw0KCQkJfSk7DQoJCX0gZWxzZQ0KCQkJZG9tLnJlbW92ZShkb20uZ2V0UGFyZW50KGlkLCAndHInKSk7DQoJfSwNCg0KCWZpbGxGaWxlTGlzdCA6IGZ1bmN0aW9uKGlkLCBsKSB7DQoJCXZhciBkb20gPSB0aW55TUNFUG9wdXAuZG9tLCBsc3QgPSBkb20uZ2V0KGlkKSwgdiwgY2w7DQoNCgkJbCA9IHdpbmRvd1tsXTsNCgkJbHN0Lm9wdGlvbnMubGVuZ3RoID0gMDsNCg0KCQlpZiAobCAmJiBsLmxlbmd0aCA+IDApIHsNCgkJCWxzdC5vcHRpb25zW2xzdC5vcHRpb25zLmxlbmd0aF0gPSBuZXcgT3B0aW9uKCcnLCAnJyk7DQoNCgkJCXRpbnltY2UuZWFjaChsLCBmdW5jdGlvbihvKSB7DQoJCQkJbHN0Lm9wdGlvbnNbbHN0Lm9wdGlvbnMubGVuZ3RoXSA9IG5ldyBPcHRpb24ob1swXSwgb1sxXSk7DQoJCQl9KTsNCgkJfSBlbHNlDQoJCQlkb20ucmVtb3ZlKGRvbS5nZXRQYXJlbnQoaWQsICd0cicpKTsNCgl9LA0KDQoJcmVzZXRJbWFnZURhdGEgOiBmdW5jdGlvbigpIHsNCgkJdmFyIGYgPSBkb2N1bWVudC5mb3Jtc1swXTsNCg0KCQlmLmVsZW1lbnRzLndpZHRoLnZhbHVlID0gZi5lbGVtZW50cy5oZWlnaHQudmFsdWUgPSAnJzsNCgl9LA0KDQoJdXBkYXRlSW1hZ2VEYXRhIDogZnVuY3Rpb24oaW1nLCBzdCkgew0KCQl2YXIgZiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KDQoJCWlmICghc3QpIHsNCgkJCWYuZWxlbWVudHMud2lkdGgudmFsdWUgPSBpbWcud2lkdGg7DQoJCQlmLmVsZW1lbnRzLmhlaWdodC52YWx1ZSA9IGltZy5oZWlnaHQ7DQoJCX0NCg0KCQl0aGlzLnByZWxvYWRJbWcgPSBpbWc7DQoJfSwNCg0KCWNoYW5nZUFwcGVhcmFuY2UgOiBmdW5jdGlvbigpIHsNCgkJdmFyIGVkID0gdGlueU1DRVBvcHVwLmVkaXRvciwgZiA9IGRvY3VtZW50LmZvcm1zWzBdLCBpbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxpZ25TYW1wbGVJbWcnKTsNCg0KCQlpZiAoaW1nKSB7DQoJCQlpZiAoZWQuZ2V0UGFyYW0oJ2lubGluZV9zdHlsZXMnKSkgew0KCQkJCWVkLmRvbS5zZXRBdHRyaWIoaW1nLCAnc3R5bGUnLCBmLnN0eWxlLnZhbHVlKTsNCgkJCX0gZWxzZSB7DQoJCQkJaW1nLmFsaWduID0gZi5hbGlnbi52YWx1ZTsNCgkJCQlpbWcuYm9yZGVyID0gZi5ib3JkZXIudmFsdWU7DQoJCQkJaW1nLmhzcGFjZSA9IGYuaHNwYWNlLnZhbHVlOw0KCQkJCWltZy52c3BhY2UgPSBmLnZzcGFjZS52YWx1ZTsNCgkJCX0NCgkJfQ0KCX0sDQoNCgljaGFuZ2VIZWlnaHQgOiBmdW5jdGlvbigpIHsNCgkJdmFyIGYgPSBkb2N1bWVudC5mb3Jtc1swXSwgdHAsIHQgPSB0aGlzOw0KDQoJCWlmICghZi5jb25zdHJhaW4uY2hlY2tlZCB8fCAhdC5wcmVsb2FkSW1nKSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQlpZiAoZi53aWR0aC52YWx1ZSA9PSAiIiB8fCBmLmhlaWdodC52YWx1ZSA9PSAiIikNCgkJCXJldHVybjsNCg0KCQl0cCA9IChwYXJzZUludChmLndpZHRoLnZhbHVlKSAvIHBhcnNlSW50KHQucHJlbG9hZEltZy53aWR0aCkpICogdC5wcmVsb2FkSW1nLmhlaWdodDsNCgkJZi5oZWlnaHQudmFsdWUgPSB0cC50b0ZpeGVkKDApOw0KCX0sDQoNCgljaGFuZ2VXaWR0aCA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgZiA9IGRvY3VtZW50LmZvcm1zWzBdLCB0cCwgdCA9IHRoaXM7DQoNCgkJaWYgKCFmLmNvbnN0cmFpbi5jaGVja2VkIHx8ICF0LnByZWxvYWRJbWcpIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCWlmIChmLndpZHRoLnZhbHVlID09ICIiIHx8IGYuaGVpZ2h0LnZhbHVlID09ICIiKQ0KCQkJcmV0dXJuOw0KDQoJCXRwID0gKHBhcnNlSW50KGYuaGVpZ2h0LnZhbHVlKSAvIHBhcnNlSW50KHQucHJlbG9hZEltZy5oZWlnaHQpKSAqIHQucHJlbG9hZEltZy53aWR0aDsNCgkJZi53aWR0aC52YWx1ZSA9IHRwLnRvRml4ZWQoMCk7DQoJfSwNCg0KCXVwZGF0ZVN0eWxlIDogZnVuY3Rpb24odHkpIHsNCgkJdmFyIGRvbSA9IHRpbnlNQ0VQb3B1cC5kb20sIHN0LCB2LCBmID0gZG9jdW1lbnQuZm9ybXNbMF0sIGltZyA9IGRvbS5jcmVhdGUoJ2ltZycsIHtzdHlsZSA6IGRvbS5nZXQoJ3N0eWxlJykudmFsdWV9KTsNCg0KCQlpZiAodGlueU1DRVBvcHVwLmVkaXRvci5zZXR0aW5ncy5pbmxpbmVfc3R5bGVzKSB7DQoJCQkvLyBIYW5kbGUgYWxpZ24NCgkJCWlmICh0eSA9PSAnYWxpZ24nKSB7DQoJCQkJZG9tLnNldFN0eWxlKGltZywgJ2Zsb2F0JywgJycpOw0KCQkJCWRvbS5zZXRTdHlsZShpbWcsICd2ZXJ0aWNhbC1hbGlnbicsICcnKTsNCg0KCQkJCXYgPSBnZXRTZWxlY3RWYWx1ZShmLCAnYWxpZ24nKTsNCgkJCQlpZiAodikgew0KCQkJCQlpZiAodiA9PSAnbGVmdCcgfHwgdiA9PSAncmlnaHQnKQ0KCQkJCQkJZG9tLnNldFN0eWxlKGltZywgJ2Zsb2F0Jywgdik7DQoJCQkJCWVsc2UNCgkJCQkJCWltZy5zdHlsZS52ZXJ0aWNhbEFsaWduID0gdjsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIEhhbmRsZSBib3JkZXINCgkJCWlmICh0eSA9PSAnYm9yZGVyJykgew0KCQkJCWRvbS5zZXRTdHlsZShpbWcsICdib3JkZXInLCAnJyk7DQoNCgkJCQl2ID0gZi5ib3JkZXIudmFsdWU7DQoJCQkJaWYgKHYgfHwgdiA9PSAnMCcpIHsNCgkJCQkJaWYgKHYgPT0gJzAnKQ0KCQkJCQkJaW1nLnN0eWxlLmJvcmRlciA9ICcwJzsNCgkJCQkJZWxzZQ0KCQkJCQkJaW1nLnN0eWxlLmJvcmRlciA9IHYgKyAncHggc29saWQgYmxhY2snOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gSGFuZGxlIGhzcGFjZQ0KCQkJaWYgKHR5ID09ICdoc3BhY2UnKSB7DQoJCQkJZG9tLnNldFN0eWxlKGltZywgJ21hcmdpbkxlZnQnLCAnJyk7DQoJCQkJZG9tLnNldFN0eWxlKGltZywgJ21hcmdpblJpZ2h0JywgJycpOw0KDQoJCQkJdiA9IGYuaHNwYWNlLnZhbHVlOw0KCQkJCWlmICh2KSB7DQoJCQkJCWltZy5zdHlsZS5tYXJnaW5MZWZ0ID0gdiArICdweCc7DQoJCQkJCWltZy5zdHlsZS5tYXJnaW5SaWdodCA9IHYgKyAncHgnOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gSGFuZGxlIHZzcGFjZQ0KCQkJaWYgKHR5ID09ICd2c3BhY2UnKSB7DQoJCQkJZG9tLnNldFN0eWxlKGltZywgJ21hcmdpblRvcCcsICcnKTsNCgkJCQlkb20uc2V0U3R5bGUoaW1nLCAnbWFyZ2luQm90dG9tJywgJycpOw0KDQoJCQkJdiA9IGYudnNwYWNlLnZhbHVlOw0KCQkJCWlmICh2KSB7DQoJCQkJCWltZy5zdHlsZS5tYXJnaW5Ub3AgPSB2ICsgJ3B4JzsNCgkJCQkJaW1nLnN0eWxlLm1hcmdpbkJvdHRvbSA9IHYgKyAncHgnOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gTWVyZ2UNCgkJCWRvbS5nZXQoJ3N0eWxlJykudmFsdWUgPSBkb20uc2VyaWFsaXplU3R5bGUoZG9tLnBhcnNlU3R5bGUoaW1nLnN0eWxlLmNzc1RleHQpLCAnaW1nJyk7DQoJCX0NCgl9LA0KDQoJY2hhbmdlTW91c2VNb3ZlIDogZnVuY3Rpb24oKSB7DQoJfSwNCg0KCXNob3dQcmV2aWV3SW1hZ2UgOiBmdW5jdGlvbih1LCBzdCkgew0KCQlpZiAoIXUpIHsNCgkJCXRpbnlNQ0VQb3B1cC5kb20uc2V0SFRNTCgncHJldicsICcnKTsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCWlmICghc3QgJiYgdGlueU1DRVBvcHVwLmdldFBhcmFtKCJhZHZpbWFnZV91cGRhdGVfZGltZW5zaW9uc19vbmNoYW5nZSIsIHRydWUpKQ0KCQkJdGhpcy5yZXNldEltYWdlRGF0YSgpOw0KDQoJCXUgPSB0aW55TUNFUG9wdXAuZWRpdG9yLmRvY3VtZW50QmFzZVVSSS50b0Fic29sdXRlKHUpOw0KDQoJCWlmICghc3QpDQoJCQl0aW55TUNFUG9wdXAuZG9tLnNldEhUTUwoJ3ByZXYnLCAnPGltZyBpZD0icHJldmlld0ltZyIgc3JjPSInICsgdSArICciIGJvcmRlcj0iMCIgb25sb2FkPSJJbWFnZURpYWxvZy51cGRhdGVJbWFnZURhdGEodGhpcyk7IiBvbmVycm9yPSJJbWFnZURpYWxvZy5yZXNldEltYWdlRGF0YSgpOyIgLz4nKTsNCgkJZWxzZQ0KCQkJdGlueU1DRVBvcHVwLmRvbS5zZXRIVE1MKCdwcmV2JywgJzxpbWcgaWQ9InByZXZpZXdJbWciIHNyYz0iJyArIHUgKyAnIiBib3JkZXI9IjAiIG9ubG9hZD0iSW1hZ2VEaWFsb2cudXBkYXRlSW1hZ2VEYXRhKHRoaXMsIDEpOyIgLz4nKTsNCgl9DQp9Ow0KDQpJbWFnZURpYWxvZy5wcmVJbml0KCk7DQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChJbWFnZURpYWxvZy5pbml0LCBJbWFnZURpYWxvZyk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advimage/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5hZHZpbWFnZV9kbGcnLHsNCnRhYl9nZW5lcmFsOiJHZW5lcmFsIiwNCnRhYl9hcHBlYXJhbmNlOiJBcHBlYXJhbmNlIiwNCnRhYl9hZHZhbmNlZDoiQWR2YW5jZWQiLA0KZ2VuZXJhbDoiR2VuZXJhbCIsDQp0aXRsZToiVGl0bGUiLA0KcHJldmlldzoiUHJldmlldyIsDQpjb25zdHJhaW5fcHJvcG9ydGlvbnM6IkNvbnN0cmFpbiBwcm9wb3J0aW9ucyIsDQpsYW5nZGlyOiJMYW5ndWFnZSBkaXJlY3Rpb24iLA0KbGFuZ2NvZGU6Ikxhbmd1YWdlIGNvZGUiLA0KbG9uZ19kZXNjOiJMb25nIGRlc2NyaXB0aW9uIGxpbmsiLA0Kc3R5bGU6IlN0eWxlIiwNCmNsYXNzZXM6IkNsYXNzZXMiLA0KbHRyOiJMZWZ0IHRvIHJpZ2h0IiwNCnJ0bDoiUmlnaHQgdG8gbGVmdCIsDQppZDoiSWQiLA0KbWFwOiJJbWFnZSBtYXAiLA0Kc3dhcF9pbWFnZToiU3dhcCBpbWFnZSIsDQphbHRfaW1hZ2U6IkFsdGVybmF0aXZlIGltYWdlIiwNCm1vdXNlb3ZlcjoiZm9yIG1vdXNlIG92ZXIiLA0KbW91c2VvdXQ6ImZvciBtb3VzZSBvdXQiLA0KbWlzYzoiTWlzY2VsbGFuZW91cyIsDQpleGFtcGxlX2ltZzoiQXBwZWFyYW5jZSBwcmV2aWV3IGltYWdlIiwNCm1pc3NpbmdfYWx0OiJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWUgd2l0aG91dCBpbmNsdWRpbmcgYW4gSW1hZ2UgRGVzY3JpcHRpb24/IFdpdGhvdXQgaXQgdGhlIGltYWdlIG1heSBub3QgYmUgYWNjZXNzaWJsZSB0byBzb21lIHVzZXJzIHdpdGggZGlzYWJpbGl0aWVzLCBvciB0byB0aG9zZSB1c2luZyBhIHRleHQgYnJvd3Nlciwgb3IgYnJvd3NpbmcgdGhlIFdlYiB3aXRoIGltYWdlcyB0dXJuZWQgb2ZmLiIsDQpkaWFsb2dfdGl0bGU6Ikluc2VydC9lZGl0IGltYWdlIiwNCnNyYzoiSW1hZ2UgVVJMIiwNCmFsdDoiSW1hZ2UgZGVzY3JpcHRpb24iLA0KbGlzdDoiSW1hZ2UgbGlzdCIsDQpib3JkZXI6IkJvcmRlciIsDQpkaW1lbnNpb25zOiJEaW1lbnNpb25zIiwNCnZzcGFjZToiVmVydGljYWwgc3BhY2UiLA0KaHNwYWNlOiJIb3Jpem9udGFsIHNwYWNlIiwNCmFsaWduOiJBbGlnbm1lbnQiLA0KYWxpZ25fYmFzZWxpbmU6IkJhc2VsaW5lIiwNCmFsaWduX3RvcDoiVG9wIiwNCmFsaWduX21pZGRsZToiTWlkZGxlIiwNCmFsaWduX2JvdHRvbToiQm90dG9tIiwNCmFsaWduX3RleHR0b3A6IlRleHQgdG9wIiwNCmFsaWduX3RleHRib3R0b206IlRleHQgYm90dG9tIiwNCmFsaWduX2xlZnQ6IkxlZnQiLA0KYWxpZ25fcmlnaHQ6IlJpZ2h0IiwNCmltYWdlX2xpc3Q6IkltYWdlIGxpc3QiDQp9KTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlink/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlink/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlink/css/advlink.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Lm1jZUxpbmtMaXN0LCAubWNlQW5jaG9yTGlzdCwgI3RhcmdldGxpc3Qge3dpZHRoOjI4MHB4O30KLm1jZUFjdGlvblBhbmVsIHttYXJnaW4tdG9wOjdweDt9Ci5wYW5lbF93cmFwcGVyIGRpdi5jdXJyZW50IHtoZWlnaHQ6MzIwcHg7fQojY2xhc3NsaXN0LCAjdGl0bGUsICNocmVmIHt3aWR0aDoyODBweDt9CiNwb3B1cHVybCwgI3BvcHVwbmFtZSB7d2lkdGg6MjAwcHg7fQojcG9wdXB3aWR0aCwgI3BvcHVwaGVpZ2h0LCAjcG9wdXBsZWZ0LCAjcG9wdXB0b3Age3dpZHRoOjMwcHg7dmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyO30KI2lkLCAjc3R5bGUsICNjbGFzc2VzLCAjdGFyZ2V0LCAjZGlyLCAjaHJlZmxhbmcsICNsYW5nLCAjY2hhcnNldCwgI3R5cGUsICNyZWwsICNyZXYsICN0YWJpbmRleCwgI2FjY2Vzc2tleSB7d2lkdGg6MjAwcHg7fQojZXZlbnRzX3BhbmVsIGlucHV0IHt3aWR0aDoyMDBweDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlink/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5BZHZhbmNlZExpbmtQbHVnaW4iLHtpbml0OmZ1bmN0aW9uKGEsYil7dGhpcy5lZGl0b3I9YTthLmFkZENvbW1hbmQoIm1jZUFkdkxpbmsiLGZ1bmN0aW9uKCl7dmFyIGM9YS5zZWxlY3Rpb247aWYoYy5pc0NvbGxhcHNlZCgpJiYhYS5kb20uZ2V0UGFyZW50KGMuZ2V0Tm9kZSgpLCJBIikpe3JldHVybn1hLndpbmRvd01hbmFnZXIub3Blbih7ZmlsZTpiKyIvbGluay5odG0iLHdpZHRoOjQ4MCtwYXJzZUludChhLmdldExhbmcoImFkdmxpbmsuZGVsdGFfd2lkdGgiLDApKSxoZWlnaHQ6NDAwK3BhcnNlSW50KGEuZ2V0TGFuZygiYWR2bGluay5kZWx0YV9oZWlnaHQiLDApKSxpbmxpbmU6MX0se3BsdWdpbl91cmw6Yn0pfSk7YS5hZGRCdXR0b24oImxpbmsiLHt0aXRsZToiYWR2bGluay5saW5rX2Rlc2MiLGNtZDoibWNlQWR2TGluayJ9KTthLmFkZFNob3J0Y3V0KCJjdHJsK2siLCJhZHZsaW5rLmFkdmxpbmtfZGVzYyIsIm1jZUFkdkxpbmsiKTthLm9uTm9kZUNoYW5nZS5hZGQoZnVuY3Rpb24oZCxjLGYsZSl7Yy5zZXREaXNhYmxlZCgibGluayIsZSYmZi5ub2RlTmFtZSE9IkEiKTtjLnNldEFjdGl2ZSgibGluayIsZi5ub2RlTmFtZT09IkEiJiYhZi5uYW1lKX0pfSxnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJBZHZhbmNlZCBsaW5rIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9hZHZsaW5rIix2ZXJzaW9uOnRpbnltY2UubWFqb3JWZXJzaW9uKyIuIit0aW55bWNlLm1pbm9yVmVyc2lvbn19fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgiYWR2bGluayIsdGlueW1jZS5wbHVnaW5zLkFkdmFuY2VkTGlua1BsdWdpbil9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlink/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLkFkdmFuY2VkTGlua1BsdWdpbicsIHsNCgkJaW5pdCA6IGZ1bmN0aW9uKGVkLCB1cmwpIHsNCgkJCXRoaXMuZWRpdG9yID0gZWQ7DQoNCgkJCS8vIFJlZ2lzdGVyIGNvbW1hbmRzDQoJCQllZC5hZGRDb21tYW5kKCdtY2VBZHZMaW5rJywgZnVuY3Rpb24oKSB7DQoJCQkJdmFyIHNlID0gZWQuc2VsZWN0aW9uOw0KDQoJCQkJLy8gTm8gc2VsZWN0aW9uIGFuZCBub3QgaW4gbGluaw0KCQkJCWlmIChzZS5pc0NvbGxhcHNlZCgpICYmICFlZC5kb20uZ2V0UGFyZW50KHNlLmdldE5vZGUoKSwgJ0EnKSkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJZWQud2luZG93TWFuYWdlci5vcGVuKHsNCgkJCQkJZmlsZSA6IHVybCArICcvbGluay5odG0nLA0KCQkJCQl3aWR0aCA6IDQ4MCArIHBhcnNlSW50KGVkLmdldExhbmcoJ2FkdmxpbmsuZGVsdGFfd2lkdGgnLCAwKSksDQoJCQkJCWhlaWdodCA6IDQwMCArIHBhcnNlSW50KGVkLmdldExhbmcoJ2FkdmxpbmsuZGVsdGFfaGVpZ2h0JywgMCkpLA0KCQkJCQlpbmxpbmUgOiAxDQoJCQkJfSwgew0KCQkJCQlwbHVnaW5fdXJsIDogdXJsDQoJCQkJfSk7DQoJCQl9KTsNCg0KCQkJLy8gUmVnaXN0ZXIgYnV0dG9ucw0KCQkJZWQuYWRkQnV0dG9uKCdsaW5rJywgew0KCQkJCXRpdGxlIDogJ2FkdmxpbmsubGlua19kZXNjJywNCgkJCQljbWQgOiAnbWNlQWR2TGluaycNCgkJCX0pOw0KDQoJCQllZC5hZGRTaG9ydGN1dCgnY3RybCtrJywgJ2FkdmxpbmsuYWR2bGlua19kZXNjJywgJ21jZUFkdkxpbmsnKTsNCg0KCQkJZWQub25Ob2RlQ2hhbmdlLmFkZChmdW5jdGlvbihlZCwgY20sIG4sIGNvKSB7DQoJCQkJY20uc2V0RGlzYWJsZWQoJ2xpbmsnLCBjbyAmJiBuLm5vZGVOYW1lICE9ICdBJyk7DQoJCQkJY20uc2V0QWN0aXZlKCdsaW5rJywgbi5ub2RlTmFtZSA9PSAnQScgJiYgIW4ubmFtZSk7DQoJCQl9KTsNCgkJfSwNCg0KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gew0KCQkJCWxvbmduYW1lIDogJ0FkdmFuY2VkIGxpbmsnLA0KCQkJCWF1dGhvciA6ICdNb3hpZWNvZGUgU3lzdGVtcyBBQicsDQoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLA0KCQkJCWluZm91cmwgOiAnaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL2FkdmxpbmsnLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9DQoJfSk7DQoNCgkvLyBSZWdpc3RlciBwbHVnaW4NCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCdhZHZsaW5rJywgdGlueW1jZS5wbHVnaW5zLkFkdmFuY2VkTGlua1BsdWdpbik7DQp9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlink/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlink/js/advlink.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogRnVuY3Rpb25zIGZvciB0aGUgYWR2bGluayBwbHVnaW4gcG9wdXAgKi8NCg0KdGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgdGVtcGxhdGVzID0gew0KCSJ3aW5kb3cub3BlbiIgOiAid2luZG93Lm9wZW4oJyR7dXJsfScsJyR7dGFyZ2V0fScsJyR7b3B0aW9uc30nKSINCn07DQoNCmZ1bmN0aW9uIHByZWluaXQoKSB7DQoJdmFyIHVybDsNCg0KCWlmICh1cmwgPSB0aW55TUNFUG9wdXAuZ2V0UGFyYW0oImV4dGVybmFsX2xpbmtfbGlzdF91cmwiKSkNCgkJZG9jdW1lbnQud3JpdGUoJzxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInICsgdGlueU1DRVBvcHVwLmVkaXRvci5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZSh1cmwpICsgJyI+PC9zY3JpcHQ+Jyk7DQp9DQoNCmZ1bmN0aW9uIGNoYW5nZUNsYXNzKCkgew0KCXZhciBmID0gZG9jdW1lbnQuZm9ybXNbMF07DQoNCglmLmNsYXNzZXMudmFsdWUgPSBnZXRTZWxlY3RWYWx1ZShmLCAnY2xhc3NsaXN0Jyk7DQp9DQoNCmZ1bmN0aW9uIGluaXQoKSB7DQoJdGlueU1DRVBvcHVwLnJlc2l6ZVRvSW5uZXJTaXplKCk7DQoNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KCXZhciBpbnN0ID0gdGlueU1DRVBvcHVwLmVkaXRvcjsNCgl2YXIgZWxtID0gaW5zdC5zZWxlY3Rpb24uZ2V0Tm9kZSgpOw0KCXZhciBhY3Rpb24gPSAiaW5zZXJ0IjsNCgl2YXIgaHRtbDsNCg0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdocmVmYnJvd3NlcmNvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldEJyb3dzZXJIVE1MKCdocmVmYnJvd3NlcicsJ2hyZWYnLCdmaWxlJywnYWR2bGluaycpOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3B1cHVybGJyb3dzZXJjb250YWluZXInKS5pbm5lckhUTUwgPSBnZXRCcm93c2VySFRNTCgncG9wdXB1cmxicm93c2VyJywncG9wdXB1cmwnLCdmaWxlJywnYWR2bGluaycpOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaW5rbGlzdGhyZWZjb250YWluZXInKS5pbm5lckhUTUwgPSBnZXRMaW5rTGlzdEhUTUwoJ2xpbmtsaXN0aHJlZicsJ2hyZWYnKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYW5jaG9ybGlzdGNvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldEFuY2hvckxpc3RIVE1MKCdhbmNob3JsaXN0JywnaHJlZicpOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YXJnZXRsaXN0Y29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0VGFyZ2V0TGlzdEhUTUwoJ3RhcmdldGxpc3QnLCd0YXJnZXQnKTsNCg0KCS8vIExpbmsgbGlzdA0KCWh0bWwgPSBnZXRMaW5rTGlzdEhUTUwoJ2xpbmtsaXN0aHJlZicsJ2hyZWYnKTsNCglpZiAoaHRtbCA9PSAiIikNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxpbmtsaXN0aHJlZnJvdyIpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJZWxzZQ0KCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGlua2xpc3RocmVmY29udGFpbmVyIikuaW5uZXJIVE1MID0gaHRtbDsNCg0KCS8vIFJlc2l6ZSBzb21lIGVsZW1lbnRzDQoJaWYgKGlzVmlzaWJsZSgnaHJlZmJyb3dzZXInKSkNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hyZWYnKS5zdHlsZS53aWR0aCA9ICcyNjBweCc7DQoNCglpZiAoaXNWaXNpYmxlKCdwb3B1cHVybGJyb3dzZXInKSkNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvcHVwdXJsJykuc3R5bGUud2lkdGggPSAnMTgwcHgnOw0KDQoJZWxtID0gaW5zdC5kb20uZ2V0UGFyZW50KGVsbSwgIkEiKTsNCglpZiAoZWxtICE9IG51bGwgJiYgZWxtLm5vZGVOYW1lID09ICJBIikNCgkJYWN0aW9uID0gInVwZGF0ZSI7DQoNCglmb3JtT2JqLmluc2VydC52YWx1ZSA9IHRpbnlNQ0VQb3B1cC5nZXRMYW5nKGFjdGlvbiwgJ0luc2VydCcsIHRydWUpOyANCg0KCXNldFBvcHVwQ29udHJvbHNEaXNhYmxlZCh0cnVlKTsNCg0KCWlmIChhY3Rpb24gPT0gInVwZGF0ZSIpIHsNCgkJdmFyIGhyZWYgPSBpbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAnaHJlZicpOw0KCQl2YXIgb25jbGljayA9IGluc3QuZG9tLmdldEF0dHJpYihlbG0sICdvbmNsaWNrJyk7DQoNCgkJLy8gU2V0dXAgZm9ybSBkYXRhDQoJCXNldEZvcm1WYWx1ZSgnaHJlZicsIGhyZWYpOw0KCQlzZXRGb3JtVmFsdWUoJ3RpdGxlJywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ3RpdGxlJykpOw0KCQlzZXRGb3JtVmFsdWUoJ2lkJywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ2lkJykpOw0KCQlzZXRGb3JtVmFsdWUoJ3N0eWxlJywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgInN0eWxlIikpOw0KCQlzZXRGb3JtVmFsdWUoJ3JlbCcsIGluc3QuZG9tLmdldEF0dHJpYihlbG0sICdyZWwnKSk7DQoJCXNldEZvcm1WYWx1ZSgncmV2JywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ3JldicpKTsNCgkJc2V0Rm9ybVZhbHVlKCdjaGFyc2V0JywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ2NoYXJzZXQnKSk7DQoJCXNldEZvcm1WYWx1ZSgnaHJlZmxhbmcnLCBpbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAnaHJlZmxhbmcnKSk7DQoJCXNldEZvcm1WYWx1ZSgnZGlyJywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ2RpcicpKTsNCgkJc2V0Rm9ybVZhbHVlKCdsYW5nJywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ2xhbmcnKSk7DQoJCXNldEZvcm1WYWx1ZSgndGFiaW5kZXgnLCBpbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAndGFiaW5kZXgnLCB0eXBlb2YoZWxtLnRhYmluZGV4KSAhPSAidW5kZWZpbmVkIiA/IGVsbS50YWJpbmRleCA6ICIiKSk7DQoJCXNldEZvcm1WYWx1ZSgnYWNjZXNza2V5JywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ2FjY2Vzc2tleScsIHR5cGVvZihlbG0uYWNjZXNza2V5KSAhPSAidW5kZWZpbmVkIiA/IGVsbS5hY2Nlc3NrZXkgOiAiIikpOw0KCQlzZXRGb3JtVmFsdWUoJ3R5cGUnLCBpbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAndHlwZScpKTsNCgkJc2V0Rm9ybVZhbHVlKCdvbmZvY3VzJywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ29uZm9jdXMnKSk7DQoJCXNldEZvcm1WYWx1ZSgnb25ibHVyJywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ29uYmx1cicpKTsNCgkJc2V0Rm9ybVZhbHVlKCdvbmNsaWNrJywgb25jbGljayk7DQoJCXNldEZvcm1WYWx1ZSgnb25kYmxjbGljaycsIGluc3QuZG9tLmdldEF0dHJpYihlbG0sICdvbmRibGNsaWNrJykpOw0KCQlzZXRGb3JtVmFsdWUoJ29ubW91c2Vkb3duJywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ29ubW91c2Vkb3duJykpOw0KCQlzZXRGb3JtVmFsdWUoJ29ubW91c2V1cCcsIGluc3QuZG9tLmdldEF0dHJpYihlbG0sICdvbm1vdXNldXAnKSk7DQoJCXNldEZvcm1WYWx1ZSgnb25tb3VzZW92ZXInLCBpbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAnb25tb3VzZW92ZXInKSk7DQoJCXNldEZvcm1WYWx1ZSgnb25tb3VzZW1vdmUnLCBpbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAnb25tb3VzZW1vdmUnKSk7DQoJCXNldEZvcm1WYWx1ZSgnb25tb3VzZW91dCcsIGluc3QuZG9tLmdldEF0dHJpYihlbG0sICdvbm1vdXNlb3V0JykpOw0KCQlzZXRGb3JtVmFsdWUoJ29ua2V5cHJlc3MnLCBpbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAnb25rZXlwcmVzcycpKTsNCgkJc2V0Rm9ybVZhbHVlKCdvbmtleWRvd24nLCBpbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAnb25rZXlkb3duJykpOw0KCQlzZXRGb3JtVmFsdWUoJ29ua2V5dXAnLCBpbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAnb25rZXl1cCcpKTsNCgkJc2V0Rm9ybVZhbHVlKCd0YXJnZXQnLCBpbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAndGFyZ2V0JykpOw0KCQlzZXRGb3JtVmFsdWUoJ2NsYXNzZXMnLCBpbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAnY2xhc3MnKSk7DQoNCgkJLy8gUGFyc2Ugb25jbGljayBkYXRhDQoJCWlmIChvbmNsaWNrICE9IG51bGwgJiYgb25jbGljay5pbmRleE9mKCd3aW5kb3cub3BlbicpICE9IC0xKQ0KCQkJcGFyc2VXaW5kb3dPcGVuKG9uY2xpY2spOw0KCQllbHNlDQoJCQlwYXJzZUZ1bmN0aW9uKG9uY2xpY2spOw0KDQoJCS8vIFNlbGVjdCBieSB0aGUgdmFsdWVzDQoJCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ2RpcicsIGluc3QuZG9tLmdldEF0dHJpYihlbG0sICdkaXInKSk7DQoJCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ3JlbCcsIGluc3QuZG9tLmdldEF0dHJpYihlbG0sICdyZWwnKSk7DQoJCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ3JldicsIGluc3QuZG9tLmdldEF0dHJpYihlbG0sICdyZXYnKSk7DQoJCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ2xpbmtsaXN0aHJlZicsIGhyZWYpOw0KDQoJCWlmIChocmVmLmNoYXJBdCgwKSA9PSAnIycpDQoJCQlzZWxlY3RCeVZhbHVlKGZvcm1PYmosICdhbmNob3JsaXN0JywgaHJlZik7DQoNCgkJYWRkQ2xhc3Nlc1RvTGlzdCgnY2xhc3NsaXN0JywgJ2Fkdmxpbmtfc3R5bGVzJyk7DQoNCgkJc2VsZWN0QnlWYWx1ZShmb3JtT2JqLCAnY2xhc3NsaXN0JywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ2NsYXNzJyksIHRydWUpOw0KCQlzZWxlY3RCeVZhbHVlKGZvcm1PYmosICd0YXJnZXRsaXN0JywgaW5zdC5kb20uZ2V0QXR0cmliKGVsbSwgJ3RhcmdldCcpLCB0cnVlKTsNCgl9IGVsc2UNCgkJYWRkQ2xhc3Nlc1RvTGlzdCgnY2xhc3NsaXN0JywgJ2Fkdmxpbmtfc3R5bGVzJyk7DQp9DQoNCmZ1bmN0aW9uIGNoZWNrUHJlZml4KG4pIHsNCglpZiAobi52YWx1ZSAmJiBWYWxpZGF0b3IuaXNFbWFpbChuKSAmJiAhL15ccyptYWlsdG86L2kudGVzdChuLnZhbHVlKSAmJiBjb25maXJtKHRpbnlNQ0VQb3B1cC5nZXRMYW5nKCdhZHZsaW5rX2RsZy5pc19lbWFpbCcpKSkNCgkJbi52YWx1ZSA9ICdtYWlsdG86JyArIG4udmFsdWU7DQoNCglpZiAoL15ccyp3d3dcLi9pLnRlc3Qobi52YWx1ZSkgJiYgY29uZmlybSh0aW55TUNFUG9wdXAuZ2V0TGFuZygnYWR2bGlua19kbGcuaXNfZXh0ZXJuYWwnKSkpDQoJCW4udmFsdWUgPSAnaHR0cDovLycgKyBuLnZhbHVlOw0KfQ0KDQpmdW5jdGlvbiBzZXRGb3JtVmFsdWUobmFtZSwgdmFsdWUpIHsNCglkb2N1bWVudC5mb3Jtc1swXS5lbGVtZW50c1tuYW1lXS52YWx1ZSA9IHZhbHVlOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZVdpbmRvd09wZW4ob25jbGljaykgew0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoNCgkvLyBQcmVwcm9jZXNzIGNlbnRlciBjb2RlDQoJaWYgKG9uY2xpY2suaW5kZXhPZigncmV0dXJuIGZhbHNlOycpICE9IC0xKSB7DQoJCWZvcm1PYmoucG9wdXByZXR1cm4uY2hlY2tlZCA9IHRydWU7DQoJCW9uY2xpY2sgPSBvbmNsaWNrLnJlcGxhY2UoJ3JldHVybiBmYWxzZTsnLCAnJyk7DQoJfSBlbHNlDQoJCWZvcm1PYmoucG9wdXByZXR1cm4uY2hlY2tlZCA9IGZhbHNlOw0KDQoJdmFyIG9uQ2xpY2tEYXRhID0gcGFyc2VMaW5rKG9uY2xpY2spOw0KDQoJaWYgKG9uQ2xpY2tEYXRhICE9IG51bGwpIHsNCgkJZm9ybU9iai5pc3BvcHVwLmNoZWNrZWQgPSB0cnVlOw0KCQlzZXRQb3B1cENvbnRyb2xzRGlzYWJsZWQoZmFsc2UpOw0KDQoJCXZhciBvbkNsaWNrV2luZG93T3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvbkNsaWNrRGF0YVsnb3B0aW9ucyddKTsNCgkJdmFyIHVybCA9IG9uQ2xpY2tEYXRhWyd1cmwnXTsNCg0KCQlmb3JtT2JqLnBvcHVwbmFtZS52YWx1ZSA9IG9uQ2xpY2tEYXRhWyd0YXJnZXQnXTsNCgkJZm9ybU9iai5wb3B1cHVybC52YWx1ZSA9IHVybDsNCgkJZm9ybU9iai5wb3B1cHdpZHRoLnZhbHVlID0gZ2V0T3B0aW9uKG9uQ2xpY2tXaW5kb3dPcHRpb25zLCAnd2lkdGgnKTsNCgkJZm9ybU9iai5wb3B1cGhlaWdodC52YWx1ZSA9IGdldE9wdGlvbihvbkNsaWNrV2luZG93T3B0aW9ucywgJ2hlaWdodCcpOw0KDQoJCWZvcm1PYmoucG9wdXBsZWZ0LnZhbHVlID0gZ2V0T3B0aW9uKG9uQ2xpY2tXaW5kb3dPcHRpb25zLCAnbGVmdCcpOw0KCQlmb3JtT2JqLnBvcHVwdG9wLnZhbHVlID0gZ2V0T3B0aW9uKG9uQ2xpY2tXaW5kb3dPcHRpb25zLCAndG9wJyk7DQoNCgkJaWYgKGZvcm1PYmoucG9wdXBsZWZ0LnZhbHVlLmluZGV4T2YoJ3NjcmVlbicpICE9IC0xKQ0KCQkJZm9ybU9iai5wb3B1cGxlZnQudmFsdWUgPSAiYyI7DQoNCgkJaWYgKGZvcm1PYmoucG9wdXB0b3AudmFsdWUuaW5kZXhPZignc2NyZWVuJykgIT0gLTEpDQoJCQlmb3JtT2JqLnBvcHVwdG9wLnZhbHVlID0gImMiOw0KDQoJCWZvcm1PYmoucG9wdXBsb2NhdGlvbi5jaGVja2VkID0gZ2V0T3B0aW9uKG9uQ2xpY2tXaW5kb3dPcHRpb25zLCAnbG9jYXRpb24nKSA9PSAieWVzIjsNCgkJZm9ybU9iai5wb3B1cHNjcm9sbGJhcnMuY2hlY2tlZCA9IGdldE9wdGlvbihvbkNsaWNrV2luZG93T3B0aW9ucywgJ3Njcm9sbGJhcnMnKSA9PSAieWVzIjsNCgkJZm9ybU9iai5wb3B1cG1lbnViYXIuY2hlY2tlZCA9IGdldE9wdGlvbihvbkNsaWNrV2luZG93T3B0aW9ucywgJ21lbnViYXInKSA9PSAieWVzIjsNCgkJZm9ybU9iai5wb3B1cHJlc2l6YWJsZS5jaGVja2VkID0gZ2V0T3B0aW9uKG9uQ2xpY2tXaW5kb3dPcHRpb25zLCAncmVzaXphYmxlJykgPT0gInllcyI7DQoJCWZvcm1PYmoucG9wdXB0b29sYmFyLmNoZWNrZWQgPSBnZXRPcHRpb24ob25DbGlja1dpbmRvd09wdGlvbnMsICd0b29sYmFyJykgPT0gInllcyI7DQoJCWZvcm1PYmoucG9wdXBzdGF0dXMuY2hlY2tlZCA9IGdldE9wdGlvbihvbkNsaWNrV2luZG93T3B0aW9ucywgJ3N0YXR1cycpID09ICJ5ZXMiOw0KCQlmb3JtT2JqLnBvcHVwZGVwZW5kZW50LmNoZWNrZWQgPSBnZXRPcHRpb24ob25DbGlja1dpbmRvd09wdGlvbnMsICdkZXBlbmRlbnQnKSA9PSAieWVzIjsNCg0KCQlidWlsZE9uQ2xpY2soKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIHBhcnNlRnVuY3Rpb24ob25jbGljaykgew0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoJdmFyIG9uQ2xpY2tEYXRhID0gcGFyc2VMaW5rKG9uY2xpY2spOw0KDQoJLy8gVE9ETzogQWRkIHN0dWZmIGhlcmUNCn0NCg0KZnVuY3Rpb24gZ2V0T3B0aW9uKG9wdHMsIG5hbWUpIHsNCglyZXR1cm4gdHlwZW9mKG9wdHNbbmFtZV0pID09ICJ1bmRlZmluZWQiID8gIiIgOiBvcHRzW25hbWVdOw0KfQ0KDQpmdW5jdGlvbiBzZXRQb3B1cENvbnRyb2xzRGlzYWJsZWQoc3RhdGUpIHsNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KDQoJZm9ybU9iai5wb3B1cG5hbWUuZGlzYWJsZWQgPSBzdGF0ZTsNCglmb3JtT2JqLnBvcHVwdXJsLmRpc2FibGVkID0gc3RhdGU7DQoJZm9ybU9iai5wb3B1cHdpZHRoLmRpc2FibGVkID0gc3RhdGU7DQoJZm9ybU9iai5wb3B1cGhlaWdodC5kaXNhYmxlZCA9IHN0YXRlOw0KCWZvcm1PYmoucG9wdXBsZWZ0LmRpc2FibGVkID0gc3RhdGU7DQoJZm9ybU9iai5wb3B1cHRvcC5kaXNhYmxlZCA9IHN0YXRlOw0KCWZvcm1PYmoucG9wdXBsb2NhdGlvbi5kaXNhYmxlZCA9IHN0YXRlOw0KCWZvcm1PYmoucG9wdXBzY3JvbGxiYXJzLmRpc2FibGVkID0gc3RhdGU7DQoJZm9ybU9iai5wb3B1cG1lbnViYXIuZGlzYWJsZWQgPSBzdGF0ZTsNCglmb3JtT2JqLnBvcHVwcmVzaXphYmxlLmRpc2FibGVkID0gc3RhdGU7DQoJZm9ybU9iai5wb3B1cHRvb2xiYXIuZGlzYWJsZWQgPSBzdGF0ZTsNCglmb3JtT2JqLnBvcHVwc3RhdHVzLmRpc2FibGVkID0gc3RhdGU7DQoJZm9ybU9iai5wb3B1cHJldHVybi5kaXNhYmxlZCA9IHN0YXRlOw0KCWZvcm1PYmoucG9wdXBkZXBlbmRlbnQuZGlzYWJsZWQgPSBzdGF0ZTsNCg0KCXNldEJyb3dzZXJEaXNhYmxlZCgncG9wdXB1cmxicm93c2VyJywgc3RhdGUpOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZUxpbmsobGluaykgew0KCWxpbmsgPSBsaW5rLnJlcGxhY2UobmV3IFJlZ0V4cCgnJiMzOTsnLCAnZycpLCAiJyIpOw0KDQoJdmFyIGZuTmFtZSA9IGxpbmsucmVwbGFjZShuZXcgUmVnRXhwKCJcXHMqKFtBLVphLXowLTlcLl0qKVxccypcXCguKiIsICJnaSIpLCAiJDEiKTsNCg0KCS8vIElzIGZ1bmN0aW9uIG5hbWUgYSB0ZW1wbGF0ZSBmdW5jdGlvbg0KCXZhciB0ZW1wbGF0ZSA9IHRlbXBsYXRlc1tmbk5hbWVdOw0KCWlmICh0ZW1wbGF0ZSkgew0KCQkvLyBCdWlsZCByZWdleHANCgkJdmFyIHZhcmlhYmxlTmFtZXMgPSB0ZW1wbGF0ZS5tYXRjaChuZXcgUmVnRXhwKCInP1xcJFxce1tBLVphLXowLTlcLl0qXFx9Jz8iLCAiZ2kiKSk7DQoJCXZhciByZWdFeHAgPSAiXFxzKltBLVphLXowLTlcLl0qXFxzKlxcKCI7DQoJCXZhciByZXBsYWNlU3RyID0gIiI7DQoJCWZvciAodmFyIGk9MDsgaTx2YXJpYWJsZU5hbWVzLmxlbmd0aDsgaSsrKSB7DQoJCQkvLyBJcyBzdHJpbmcgdmFsdWUNCgkJCWlmICh2YXJpYWJsZU5hbWVzW2ldLmluZGV4T2YoIickeyIpICE9IC0xKQ0KCQkJCXJlZ0V4cCArPSAiJyguKiknIjsNCgkJCWVsc2UgLy8gTnVtYmVyIHZhbHVlDQoJCQkJcmVnRXhwICs9ICIoWzAtOV0qKSI7DQoNCgkJCXJlcGxhY2VTdHIgKz0gIiQiICsgKGkrMSk7DQoNCgkJCS8vIENsZWFudXAgdmFyaWFibGUgbmFtZQ0KCQkJdmFyaWFibGVOYW1lc1tpXSA9IHZhcmlhYmxlTmFtZXNbaV0ucmVwbGFjZShuZXcgUmVnRXhwKCJbXkEtWmEtejAtOV0iLCAiZ2kiKSwgIiIpOw0KDQoJCQlpZiAoaSAhPSB2YXJpYWJsZU5hbWVzLmxlbmd0aC0xKSB7DQoJCQkJcmVnRXhwICs9ICJcXHMqLFxccyoiOw0KCQkJCXJlcGxhY2VTdHIgKz0gIjxkZWxpbT4iOw0KCQkJfSBlbHNlDQoJCQkJcmVnRXhwICs9ICIuKiI7DQoJCX0NCg0KCQlyZWdFeHAgKz0gIlxcKTs/IjsNCg0KCQkvLyBCdWlsZCB2YXJpYWJsZSBhcnJheQ0KCQl2YXIgdmFyaWFibGVzID0gW107DQoJCXZhcmlhYmxlc1siX2Z1bmN0aW9uIl0gPSBmbk5hbWU7DQoJCXZhciB2YXJpYWJsZVZhbHVlcyA9IGxpbmsucmVwbGFjZShuZXcgUmVnRXhwKHJlZ0V4cCwgImdpIiksIHJlcGxhY2VTdHIpLnNwbGl0KCc8ZGVsaW0+Jyk7DQoJCWZvciAodmFyIGk9MDsgaTx2YXJpYWJsZU5hbWVzLmxlbmd0aDsgaSsrKQ0KCQkJdmFyaWFibGVzW3ZhcmlhYmxlTmFtZXNbaV1dID0gdmFyaWFibGVWYWx1ZXNbaV07DQoNCgkJcmV0dXJuIHZhcmlhYmxlczsNCgl9DQoNCglyZXR1cm4gbnVsbDsNCn0NCg0KZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHsNCglpZiAob3B0cyA9PSBudWxsIHx8IG9wdHMgPT0gIiIpDQoJCXJldHVybiBbXTsNCg0KCS8vIENsZWFudXAgdGhlIG9wdGlvbnMNCglvcHRzID0gb3B0cy50b0xvd2VyQ2FzZSgpOw0KCW9wdHMgPSBvcHRzLnJlcGxhY2UoLzsvZywgIiwiKTsNCglvcHRzID0gb3B0cy5yZXBsYWNlKC9bXjAtOWEtej0sXS9nLCAiIik7DQoNCgl2YXIgb3B0aW9uQ2h1bmtzID0gb3B0cy5zcGxpdCgnLCcpOw0KCXZhciBvcHRpb25zID0gW107DQoNCglmb3IgKHZhciBpPTA7IGk8b3B0aW9uQ2h1bmtzLmxlbmd0aDsgaSsrKSB7DQoJCXZhciBwYXJ0cyA9IG9wdGlvbkNodW5rc1tpXS5zcGxpdCgnPScpOw0KDQoJCWlmIChwYXJ0cy5sZW5ndGggPT0gMikNCgkJCW9wdGlvbnNbcGFydHNbMF1dID0gcGFydHNbMV07DQoJfQ0KDQoJcmV0dXJuIG9wdGlvbnM7DQp9DQoNCmZ1bmN0aW9uIGJ1aWxkT25DbGljaygpIHsNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KDQoJaWYgKCFmb3JtT2JqLmlzcG9wdXAuY2hlY2tlZCkgew0KCQlmb3JtT2JqLm9uY2xpY2sudmFsdWUgPSAiIjsNCgkJcmV0dXJuOw0KCX0NCg0KCXZhciBvbmNsaWNrID0gIndpbmRvdy5vcGVuKCciOw0KCXZhciB1cmwgPSBmb3JtT2JqLnBvcHVwdXJsLnZhbHVlOw0KDQoJb25jbGljayArPSB1cmwgKyAiJywnIjsNCglvbmNsaWNrICs9IGZvcm1PYmoucG9wdXBuYW1lLnZhbHVlICsgIicsJyI7DQoNCglpZiAoZm9ybU9iai5wb3B1cGxvY2F0aW9uLmNoZWNrZWQpDQoJCW9uY2xpY2sgKz0gImxvY2F0aW9uPXllcywiOw0KDQoJaWYgKGZvcm1PYmoucG9wdXBzY3JvbGxiYXJzLmNoZWNrZWQpDQoJCW9uY2xpY2sgKz0gInNjcm9sbGJhcnM9eWVzLCI7DQoNCglpZiAoZm9ybU9iai5wb3B1cG1lbnViYXIuY2hlY2tlZCkNCgkJb25jbGljayArPSAibWVudWJhcj15ZXMsIjsNCg0KCWlmIChmb3JtT2JqLnBvcHVwcmVzaXphYmxlLmNoZWNrZWQpDQoJCW9uY2xpY2sgKz0gInJlc2l6YWJsZT15ZXMsIjsNCg0KCWlmIChmb3JtT2JqLnBvcHVwdG9vbGJhci5jaGVja2VkKQ0KCQlvbmNsaWNrICs9ICJ0b29sYmFyPXllcywiOw0KDQoJaWYgKGZvcm1PYmoucG9wdXBzdGF0dXMuY2hlY2tlZCkNCgkJb25jbGljayArPSAic3RhdHVzPXllcywiOw0KDQoJaWYgKGZvcm1PYmoucG9wdXBkZXBlbmRlbnQuY2hlY2tlZCkNCgkJb25jbGljayArPSAiZGVwZW5kZW50PXllcywiOw0KDQoJaWYgKGZvcm1PYmoucG9wdXB3aWR0aC52YWx1ZSAhPSAiIikNCgkJb25jbGljayArPSAid2lkdGg9IiArIGZvcm1PYmoucG9wdXB3aWR0aC52YWx1ZSArICIsIjsNCg0KCWlmIChmb3JtT2JqLnBvcHVwaGVpZ2h0LnZhbHVlICE9ICIiKQ0KCQlvbmNsaWNrICs9ICJoZWlnaHQ9IiArIGZvcm1PYmoucG9wdXBoZWlnaHQudmFsdWUgKyAiLCI7DQoNCglpZiAoZm9ybU9iai5wb3B1cGxlZnQudmFsdWUgIT0gIiIpIHsNCgkJaWYgKGZvcm1PYmoucG9wdXBsZWZ0LnZhbHVlICE9ICJjIikNCgkJCW9uY2xpY2sgKz0gImxlZnQ9IiArIGZvcm1PYmoucG9wdXBsZWZ0LnZhbHVlICsgIiwiOw0KCQllbHNlDQoJCQlvbmNsaWNrICs9ICJsZWZ0PScrKHNjcmVlbi5hdmFpbFdpZHRoLzItIiArIChmb3JtT2JqLnBvcHVwd2lkdGgudmFsdWUvMikgKyAiKSsnLCI7DQoJfQ0KDQoJaWYgKGZvcm1PYmoucG9wdXB0b3AudmFsdWUgIT0gIiIpIHsNCgkJaWYgKGZvcm1PYmoucG9wdXB0b3AudmFsdWUgIT0gImMiKQ0KCQkJb25jbGljayArPSAidG9wPSIgKyBmb3JtT2JqLnBvcHVwdG9wLnZhbHVlICsgIiwiOw0KCQllbHNlDQoJCQlvbmNsaWNrICs9ICJ0b3A9Jysoc2NyZWVuLmF2YWlsSGVpZ2h0LzItIiArIChmb3JtT2JqLnBvcHVwaGVpZ2h0LnZhbHVlLzIpICsgIikrJywiOw0KCX0NCg0KCWlmIChvbmNsaWNrLmNoYXJBdChvbmNsaWNrLmxlbmd0aC0xKSA9PSAnLCcpDQoJCW9uY2xpY2sgPSBvbmNsaWNrLnN1YnN0cmluZygwLCBvbmNsaWNrLmxlbmd0aC0xKTsNCg0KCW9uY2xpY2sgKz0gIicpOyI7DQoNCglpZiAoZm9ybU9iai5wb3B1cHJldHVybi5jaGVja2VkKQ0KCQlvbmNsaWNrICs9ICJyZXR1cm4gZmFsc2U7IjsNCg0KCS8vIHRpbnlNQ0UuZGVidWcob25jbGljayk7DQoNCglmb3JtT2JqLm9uY2xpY2sudmFsdWUgPSBvbmNsaWNrOw0KDQoJaWYgKGZvcm1PYmouaHJlZi52YWx1ZSA9PSAiIikNCgkJZm9ybU9iai5ocmVmLnZhbHVlID0gdXJsOw0KfQ0KDQpmdW5jdGlvbiBzZXRBdHRyaWIoZWxtLCBhdHRyaWIsIHZhbHVlKSB7DQoJdmFyIGZvcm1PYmogPSBkb2N1bWVudC5mb3Jtc1swXTsNCgl2YXIgdmFsdWVFbG0gPSBmb3JtT2JqLmVsZW1lbnRzW2F0dHJpYi50b0xvd2VyQ2FzZSgpXTsNCgl2YXIgZG9tID0gdGlueU1DRVBvcHVwLmVkaXRvci5kb207DQoNCglpZiAodHlwZW9mKHZhbHVlKSA9PSAidW5kZWZpbmVkIiB8fCB2YWx1ZSA9PSBudWxsKSB7DQoJCXZhbHVlID0gIiI7DQoNCgkJaWYgKHZhbHVlRWxtKQ0KCQkJdmFsdWUgPSB2YWx1ZUVsbS52YWx1ZTsNCgl9DQoNCgkvLyBDbGVhbiB1cCB0aGUgc3R5bGUNCglpZiAoYXR0cmliID09ICdzdHlsZScpDQoJCXZhbHVlID0gZG9tLnNlcmlhbGl6ZVN0eWxlKGRvbS5wYXJzZVN0eWxlKHZhbHVlKSwgJ2EnKTsNCg0KCWRvbS5zZXRBdHRyaWIoZWxtLCBhdHRyaWIsIHZhbHVlKTsNCn0NCg0KZnVuY3Rpb24gZ2V0QW5jaG9yTGlzdEhUTUwoaWQsIHRhcmdldCkgew0KCXZhciBpbnN0ID0gdGlueU1DRVBvcHVwLmVkaXRvcjsNCgl2YXIgbm9kZXMgPSBpbnN0LmRvbS5zZWxlY3QoJ2EubWNlSXRlbUFuY2hvcixpbWcubWNlSXRlbUFuY2hvcicpLCBuYW1lLCBpOw0KCXZhciBodG1sID0gIiI7DQoNCglodG1sICs9ICc8c2VsZWN0IGlkPSInICsgaWQgKyAnIiBuYW1lPSInICsgaWQgKyAnIiBjbGFzcz0ibWNlQW5jaG9yTGlzdCIgbzJuZm9jdXM9InRpbnlNQ0UuYWRkU2VsZWN0QWNjZXNzaWJpbGl0eShldmVudCwgdGhpcywgd2luZG93KTsiIG9uY2hhbmdlPSJ0aGlzLmZvcm0uJyArIHRhcmdldCArICcudmFsdWU9JzsNCglodG1sICs9ICd0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZTsiPic7DQoJaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT0iIj4tLS08L29wdGlvbj4nOw0KDQoJZm9yIChpPTA7IGk8bm9kZXMubGVuZ3RoOyBpKyspIHsNCgkJaWYgKChuYW1lID0gaW5zdC5kb20uZ2V0QXR0cmliKG5vZGVzW2ldLCAibmFtZSIpKSAhPSAiIikNCgkJCWh0bWwgKz0gJzxvcHRpb24gdmFsdWU9IiMnICsgbmFtZSArICciPicgKyBuYW1lICsgJzwvb3B0aW9uPic7DQoJfQ0KDQoJaHRtbCArPSAnPC9zZWxlY3Q+JzsNCg0KCXJldHVybiBodG1sOw0KfQ0KDQpmdW5jdGlvbiBpbnNlcnRBY3Rpb24oKSB7DQoJdmFyIGluc3QgPSB0aW55TUNFUG9wdXAuZWRpdG9yOw0KCXZhciBlbG0sIGVsZW1lbnRBcnJheSwgaTsNCg0KCWVsbSA9IGluc3Quc2VsZWN0aW9uLmdldE5vZGUoKTsNCgljaGVja1ByZWZpeChkb2N1bWVudC5mb3Jtc1swXS5ocmVmKTsNCg0KCWVsbSA9IGluc3QuZG9tLmdldFBhcmVudChlbG0sICJBIik7DQoNCgkvLyBSZW1vdmUgZWxlbWVudCBpZiB0aGVyZSBpcyBubyBocmVmDQoJaWYgKCFkb2N1bWVudC5mb3Jtc1swXS5ocmVmLnZhbHVlKSB7DQoJCXRpbnlNQ0VQb3B1cC5leGVjQ29tbWFuZCgibWNlQmVnaW5VbmRvTGV2ZWwiKTsNCgkJaSA9IGluc3Quc2VsZWN0aW9uLmdldEJvb2ttYXJrKCk7DQoJCWluc3QuZG9tLnJlbW92ZShlbG0sIDEpOw0KCQlpbnN0LnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhpKTsNCgkJdGlueU1DRVBvcHVwLmV4ZWNDb21tYW5kKCJtY2VFbmRVbmRvTGV2ZWwiKTsNCgkJdGlueU1DRVBvcHVwLmNsb3NlKCk7DQoJCXJldHVybjsNCgl9DQoNCgl0aW55TUNFUG9wdXAuZXhlY0NvbW1hbmQoIm1jZUJlZ2luVW5kb0xldmVsIik7DQoNCgkvLyBDcmVhdGUgbmV3IGFuY2hvciBlbGVtZW50cw0KCWlmIChlbG0gPT0gbnVsbCkgew0KCQlpbnN0LmdldERvYygpLmV4ZWNDb21tYW5kKCJ1bmxpbmsiLCBmYWxzZSwgbnVsbCk7DQoJCXRpbnlNQ0VQb3B1cC5leGVjQ29tbWFuZCgiQ3JlYXRlTGluayIsIGZhbHNlLCAiI21jZV90ZW1wX3VybCMiLCB7c2tpcF91bmRvIDogMX0pOw0KDQoJCWVsZW1lbnRBcnJheSA9IHRpbnltY2UuZ3JlcChpbnN0LmRvbS5zZWxlY3QoImEiKSwgZnVuY3Rpb24obikge3JldHVybiBpbnN0LmRvbS5nZXRBdHRyaWIobiwgJ2hyZWYnKSA9PSAnI21jZV90ZW1wX3VybCMnO30pOw0KCQlmb3IgKGk9MDsgaTxlbGVtZW50QXJyYXkubGVuZ3RoOyBpKyspDQoJCQlzZXRBbGxBdHRyaWJzKGVsbSA9IGVsZW1lbnRBcnJheVtpXSk7DQoJfSBlbHNlDQoJCXNldEFsbEF0dHJpYnMoZWxtKTsNCg0KCS8vIERvbid0IG1vdmUgY2FyZXQgaWYgc2VsZWN0aW9uIHdhcyBpbWFnZQ0KCWlmIChlbG0uY2hpbGROb2Rlcy5sZW5ndGggIT0gMSB8fCBlbG0uZmlyc3RDaGlsZC5ub2RlTmFtZSAhPSAnSU1HJykgew0KCQlpbnN0LmZvY3VzKCk7DQoJCWluc3Quc2VsZWN0aW9uLnNlbGVjdChlbG0pOw0KCQlpbnN0LnNlbGVjdGlvbi5jb2xsYXBzZSgwKTsNCgkJdGlueU1DRVBvcHVwLnN0b3JlU2VsZWN0aW9uKCk7DQoJfQ0KDQoJdGlueU1DRVBvcHVwLmV4ZWNDb21tYW5kKCJtY2VFbmRVbmRvTGV2ZWwiKTsNCgl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCn0NCg0KZnVuY3Rpb24gc2V0QWxsQXR0cmlicyhlbG0pIHsNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KCXZhciBocmVmID0gZm9ybU9iai5ocmVmLnZhbHVlOw0KCXZhciB0YXJnZXQgPSBnZXRTZWxlY3RWYWx1ZShmb3JtT2JqLCAndGFyZ2V0bGlzdCcpOw0KDQoJc2V0QXR0cmliKGVsbSwgJ2hyZWYnLCBocmVmKTsNCglzZXRBdHRyaWIoZWxtLCAndGl0bGUnKTsNCglzZXRBdHRyaWIoZWxtLCAndGFyZ2V0JywgdGFyZ2V0ID09ICdfc2VsZicgPyAnJyA6IHRhcmdldCk7DQoJc2V0QXR0cmliKGVsbSwgJ2lkJyk7DQoJc2V0QXR0cmliKGVsbSwgJ3N0eWxlJyk7DQoJc2V0QXR0cmliKGVsbSwgJ2NsYXNzJywgZ2V0U2VsZWN0VmFsdWUoZm9ybU9iaiwgJ2NsYXNzbGlzdCcpKTsNCglzZXRBdHRyaWIoZWxtLCAncmVsJyk7DQoJc2V0QXR0cmliKGVsbSwgJ3JldicpOw0KCXNldEF0dHJpYihlbG0sICdjaGFyc2V0Jyk7DQoJc2V0QXR0cmliKGVsbSwgJ2hyZWZsYW5nJyk7DQoJc2V0QXR0cmliKGVsbSwgJ2RpcicpOw0KCXNldEF0dHJpYihlbG0sICdsYW5nJyk7DQoJc2V0QXR0cmliKGVsbSwgJ3RhYmluZGV4Jyk7DQoJc2V0QXR0cmliKGVsbSwgJ2FjY2Vzc2tleScpOw0KCXNldEF0dHJpYihlbG0sICd0eXBlJyk7DQoJc2V0QXR0cmliKGVsbSwgJ29uZm9jdXMnKTsNCglzZXRBdHRyaWIoZWxtLCAnb25ibHVyJyk7DQoJc2V0QXR0cmliKGVsbSwgJ29uY2xpY2snKTsNCglzZXRBdHRyaWIoZWxtLCAnb25kYmxjbGljaycpOw0KCXNldEF0dHJpYihlbG0sICdvbm1vdXNlZG93bicpOw0KCXNldEF0dHJpYihlbG0sICdvbm1vdXNldXAnKTsNCglzZXRBdHRyaWIoZWxtLCAnb25tb3VzZW92ZXInKTsNCglzZXRBdHRyaWIoZWxtLCAnb25tb3VzZW1vdmUnKTsNCglzZXRBdHRyaWIoZWxtLCAnb25tb3VzZW91dCcpOw0KCXNldEF0dHJpYihlbG0sICdvbmtleXByZXNzJyk7DQoJc2V0QXR0cmliKGVsbSwgJ29ua2V5ZG93bicpOw0KCXNldEF0dHJpYihlbG0sICdvbmtleXVwJyk7DQoNCgkvLyBSZWZyZXNoIGluIG9sZCBNU0lFDQoJaWYgKHRpbnlNQ0UuaXNNU0lFNSkNCgkJZWxtLm91dGVySFRNTCA9IGVsbS5vdXRlckhUTUw7DQp9DQoNCmZ1bmN0aW9uIGdldFNlbGVjdFZhbHVlKGZvcm1fb2JqLCBmaWVsZF9uYW1lKSB7DQoJdmFyIGVsbSA9IGZvcm1fb2JqLmVsZW1lbnRzW2ZpZWxkX25hbWVdOw0KDQoJaWYgKCFlbG0gfHwgZWxtLm9wdGlvbnMgPT0gbnVsbCB8fCBlbG0uc2VsZWN0ZWRJbmRleCA9PSAtMSkNCgkJcmV0dXJuICIiOw0KDQoJcmV0dXJuIGVsbS5vcHRpb25zW2VsbS5zZWxlY3RlZEluZGV4XS52YWx1ZTsNCn0NCg0KZnVuY3Rpb24gZ2V0TGlua0xpc3RIVE1MKGVsbV9pZCwgdGFyZ2V0X2Zvcm1fZWxlbWVudCwgb25jaGFuZ2VfZnVuYykgew0KCWlmICh0eXBlb2YodGlueU1DRUxpbmtMaXN0KSA9PSAidW5kZWZpbmVkIiB8fCB0aW55TUNFTGlua0xpc3QubGVuZ3RoID09IDApDQoJCXJldHVybiAiIjsNCg0KCXZhciBodG1sID0gIiI7DQoNCglodG1sICs9ICc8c2VsZWN0IGlkPSInICsgZWxtX2lkICsgJyIgbmFtZT0iJyArIGVsbV9pZCArICciJzsNCglodG1sICs9ICcgY2xhc3M9Im1jZUxpbmtMaXN0IiBvbmZvYzJ1cz0idGlueU1DRS5hZGRTZWxlY3RBY2Nlc3NpYmlsaXR5KGV2ZW50LCB0aGlzLCB3aW5kb3cpOyIgb25jaGFuZ2U9InRoaXMuZm9ybS4nICsgdGFyZ2V0X2Zvcm1fZWxlbWVudCArICcudmFsdWU9JzsNCglodG1sICs9ICd0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZTsnOw0KDQoJaWYgKHR5cGVvZihvbmNoYW5nZV9mdW5jKSAhPSAidW5kZWZpbmVkIikNCgkJaHRtbCArPSBvbmNoYW5nZV9mdW5jICsgJyhcJycgKyB0YXJnZXRfZm9ybV9lbGVtZW50ICsgJ1wnLHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnRleHQsdGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpOyc7DQoNCglodG1sICs9ICciPjxvcHRpb24gdmFsdWU9IiI+LS0tPC9vcHRpb24+JzsNCg0KCWZvciAodmFyIGk9MDsgaTx0aW55TUNFTGlua0xpc3QubGVuZ3RoOyBpKyspDQoJCWh0bWwgKz0gJzxvcHRpb24gdmFsdWU9IicgKyB0aW55TUNFTGlua0xpc3RbaV1bMV0gKyAnIj4nICsgdGlueU1DRUxpbmtMaXN0W2ldWzBdICsgJzwvb3B0aW9uPic7DQoNCglodG1sICs9ICc8L3NlbGVjdD4nOw0KDQoJcmV0dXJuIGh0bWw7DQoNCgkvLyB0aW55TUNFLmRlYnVnKCctLSBpbWFnZSBsaXN0IHN0YXJ0IC0tJywgaHRtbCwgJy0tIGltYWdlIGxpc3QgZW5kIC0tJyk7DQp9DQoNCmZ1bmN0aW9uIGdldFRhcmdldExpc3RIVE1MKGVsbV9pZCwgdGFyZ2V0X2Zvcm1fZWxlbWVudCkgew0KCXZhciB0YXJnZXRzID0gdGlueU1DRVBvcHVwLmdldFBhcmFtKCd0aGVtZV9hZHZhbmNlZF9saW5rX3RhcmdldHMnLCAnJykuc3BsaXQoJzsnKTsNCgl2YXIgaHRtbCA9ICcnOw0KDQoJaHRtbCArPSAnPHNlbGVjdCBpZD0iJyArIGVsbV9pZCArICciIG5hbWU9IicgKyBlbG1faWQgKyAnIiBvbmYyb2N1cz0idGlueU1DRS5hZGRTZWxlY3RBY2Nlc3NpYmlsaXR5KGV2ZW50LCB0aGlzLCB3aW5kb3cpOyIgb25jaGFuZ2U9InRoaXMuZm9ybS4nICsgdGFyZ2V0X2Zvcm1fZWxlbWVudCArICcudmFsdWU9JzsNCglodG1sICs9ICd0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZTsiPic7DQoJaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT0iX3NlbGYiPicgKyB0aW55TUNFUG9wdXAuZ2V0TGFuZygnYWR2bGlua19kbGcudGFyZ2V0X3NhbWUnKSArICc8L29wdGlvbj4nOw0KCWh0bWwgKz0gJzxvcHRpb24gdmFsdWU9Il9ibGFuayI+JyArIHRpbnlNQ0VQb3B1cC5nZXRMYW5nKCdhZHZsaW5rX2RsZy50YXJnZXRfYmxhbmsnKSArICcgKF9ibGFuayk8L29wdGlvbj4nOw0KCWh0bWwgKz0gJzxvcHRpb24gdmFsdWU9Il9wYXJlbnQiPicgKyB0aW55TUNFUG9wdXAuZ2V0TGFuZygnYWR2bGlua19kbGcudGFyZ2V0X3BhcmVudCcpICsgJyAoX3BhcmVudCk8L29wdGlvbj4nOw0KCWh0bWwgKz0gJzxvcHRpb24gdmFsdWU9Il90b3AiPicgKyB0aW55TUNFUG9wdXAuZ2V0TGFuZygnYWR2bGlua19kbGcudGFyZ2V0X3RvcCcpICsgJyAoX3RvcCk8L29wdGlvbj4nOw0KDQoJZm9yICh2YXIgaT0wOyBpPHRhcmdldHMubGVuZ3RoOyBpKyspIHsNCgkJdmFyIGtleSwgdmFsdWU7DQoNCgkJaWYgKHRhcmdldHNbaV0gPT0gIiIpDQoJCQljb250aW51ZTsNCg0KCQlrZXkgPSB0YXJnZXRzW2ldLnNwbGl0KCc9JylbMF07DQoJCXZhbHVlID0gdGFyZ2V0c1tpXS5zcGxpdCgnPScpWzFdOw0KDQoJCWh0bWwgKz0gJzxvcHRpb24gdmFsdWU9IicgKyBrZXkgKyAnIj4nICsgdmFsdWUgKyAnICgnICsga2V5ICsgJyk8L29wdGlvbj4nOw0KCX0NCg0KCWh0bWwgKz0gJzwvc2VsZWN0Pic7DQoNCglyZXR1cm4gaHRtbDsNCn0NCg0KLy8gV2hpbGUgbG9hZGluZw0KcHJlaW5pdCgpOw0KdGlueU1DRVBvcHVwLm9uSW5pdC5hZGQoaW5pdCk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlink/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlink/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5hZHZsaW5rX2RsZycsew0KdGl0bGU6Ikluc2VydC9lZGl0IGxpbmsiLA0KdXJsOiJMaW5rIFVSTCIsDQp0YXJnZXQ6IlRhcmdldCIsDQp0aXRsZWZpZWxkOiJUaXRsZSIsDQppc19lbWFpbDoiVGhlIFVSTCB5b3UgZW50ZXJlZCBzZWVtcyB0byBiZSBhbiBlbWFpbCBhZGRyZXNzLCBkbyB5b3Ugd2FudCB0byBhZGQgdGhlIHJlcXVpcmVkIG1haWx0bzogcHJlZml4PyIsDQppc19leHRlcm5hbDoiVGhlIFVSTCB5b3UgZW50ZXJlZCBzZWVtcyB0byBleHRlcm5hbCBsaW5rLCBkbyB5b3Ugd2FudCB0byBhZGQgdGhlIHJlcXVpcmVkIGh0dHA6Ly8gcHJlZml4PyIsDQpsaXN0OiJMaW5rIGxpc3QiLA0KZ2VuZXJhbF90YWI6IkdlbmVyYWwiLA0KcG9wdXBfdGFiOiJQb3B1cCIsDQpldmVudHNfdGFiOiJFdmVudHMiLA0KYWR2YW5jZWRfdGFiOiJBZHZhbmNlZCIsDQpnZW5lcmFsX3Byb3BzOiJHZW5lcmFsIHByb3BlcnRpZXMiLA0KcG9wdXBfcHJvcHM6IlBvcHVwIHByb3BlcnRpZXMiLA0KZXZlbnRfcHJvcHM6IkV2ZW50cyIsDQphZHZhbmNlZF9wcm9wczoiQWR2YW5jZWQgcHJvcGVydGllcyIsDQpwb3B1cF9vcHRzOiJPcHRpb25zIiwNCmFuY2hvcl9uYW1lczoiQW5jaG9ycyIsDQp0YXJnZXRfc2FtZToiT3BlbiBpbiB0aGlzIHdpbmRvdyAvIGZyYW1lIiwNCnRhcmdldF9wYXJlbnQ6Ik9wZW4gaW4gcGFyZW50IHdpbmRvdyAvIGZyYW1lIiwNCnRhcmdldF90b3A6Ik9wZW4gaW4gdG9wIGZyYW1lIChyZXBsYWNlcyBhbGwgZnJhbWVzKSIsDQp0YXJnZXRfYmxhbms6Ik9wZW4gaW4gbmV3IHdpbmRvdyIsDQpwb3B1cDoiSmF2YXNjcmlwdCBwb3B1cCIsDQpwb3B1cF91cmw6IlBvcHVwIFVSTCIsDQpwb3B1cF9uYW1lOiJXaW5kb3cgbmFtZSIsDQpwb3B1cF9yZXR1cm46Ikluc2VydCAncmV0dXJuIGZhbHNlJyIsDQpwb3B1cF9zY3JvbGxiYXJzOiJTaG93IHNjcm9sbGJhcnMiLA0KcG9wdXBfc3RhdHVzYmFyOiJTaG93IHN0YXR1cyBiYXIiLA0KcG9wdXBfdG9vbGJhcjoiU2hvdyB0b29sYmFycyIsDQpwb3B1cF9tZW51YmFyOiJTaG93IG1lbnUgYmFyIiwNCnBvcHVwX2xvY2F0aW9uOiJTaG93IGxvY2F0aW9uIGJhciIsDQpwb3B1cF9yZXNpemFibGU6Ik1ha2Ugd2luZG93IHJlc2l6YWJsZSIsDQpwb3B1cF9kZXBlbmRlbnQ6IkRlcGVuZGVudCAoTW96aWxsYS9GaXJlZm94IG9ubHkpIiwNCnBvcHVwX3NpemU6IlNpemUiLA0KcG9wdXBfcG9zaXRpb246IlBvc2l0aW9uIChYL1kpIiwNCmlkOiJJZCIsDQpzdHlsZToiU3R5bGUiLA0KY2xhc3NlczoiQ2xhc3NlcyIsDQp0YXJnZXRfbmFtZToiVGFyZ2V0IG5hbWUiLA0KbGFuZ2RpcjoiTGFuZ3VhZ2UgZGlyZWN0aW9uIiwNCnRhcmdldF9sYW5nY29kZToiVGFyZ2V0IGxhbmd1YWdlIiwNCmxhbmdjb2RlOiJMYW5ndWFnZSBjb2RlIiwNCmVuY29kaW5nOiJUYXJnZXQgY2hhcmFjdGVyIGVuY29kaW5nIiwNCm1pbWU6IlRhcmdldCBNSU1FIHR5cGUiLA0KcmVsOiJSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQiLA0KcmV2OiJSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UiLA0KdGFiaW5kZXg6IlRhYmluZGV4IiwNCmFjY2Vzc2tleToiQWNjZXNza2V5IiwNCmx0cjoiTGVmdCB0byByaWdodCIsDQpydGw6IlJpZ2h0IHRvIGxlZnQiLA0KbGlua19saXN0OiJMaW5rIGxpc3QiDQp9KTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlink/link.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjYWR2bGlua19kbGcudGl0bGV9PC90aXRsZT4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3RpbnlfbWNlX3BvcHVwLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL21jdGFicy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9mb3JtX3V0aWxzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL3ZhbGlkYXRlLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2FkdmxpbmsuanMiPjwvc2NyaXB0PgoJPGxpbmsgaHJlZj0iY3NzL2FkdmxpbmsuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiAvPgo8L2hlYWQ+Cjxib2R5IGlkPSJhZHZsaW5rIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CiAgICA8Zm9ybSBvbnN1Ym1pdD0iaW5zZXJ0QWN0aW9uKCk7cmV0dXJuIGZhbHNlOyIgYWN0aW9uPSIjIj4KCQk8ZGl2IGNsYXNzPSJ0YWJzIj4KCQkJPHVsPgoJCQkJPGxpIGlkPSJnZW5lcmFsX3RhYiIgY2xhc3M9ImN1cnJlbnQiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2dlbmVyYWxfdGFiJywnZ2VuZXJhbF9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjYWR2bGlua19kbGcuZ2VuZXJhbF90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCQkJPGxpIGlkPSJwb3B1cF90YWIiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ3BvcHVwX3RhYicsJ3BvcHVwX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNhZHZsaW5rX2RsZy5wb3B1cF90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCQkJPGxpIGlkPSJldmVudHNfdGFiIj48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdldmVudHNfdGFiJywnZXZlbnRzX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNhZHZsaW5rX2RsZy5ldmVudHNfdGFifTwvYT48L3NwYW4+PC9saT4KCQkJCTxsaSBpZD0iYWR2YW5jZWRfdGFiIj48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdhZHZhbmNlZF90YWInLCdhZHZhbmNlZF9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjYWR2bGlua19kbGcuYWR2YW5jZWRfdGFifTwvYT48L3NwYW4+PC9saT4KCQkJPC91bD4KCQk8L2Rpdj4KCgkJPGRpdiBjbGFzcz0icGFuZWxfd3JhcHBlciI+CgkJCTxkaXYgaWQ9ImdlbmVyYWxfcGFuZWwiIGNsYXNzPSJwYW5lbCBjdXJyZW50Ij4KCQkJCTxmaWVsZHNldD4KCQkJCQk8bGVnZW5kPnsjYWR2bGlua19kbGcuZ2VuZXJhbF9wcm9wc308L2xlZ2VuZD4KCgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkgIDx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgaWQ9ImhyZWZsYWJlbCIgZm9yPSJocmVmIj57I2FkdmxpbmtfZGxnLnVybH08L2xhYmVsPjwvdGQ+CgkJCQkJCSAgPHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQkJCQkJPHRyPgoJCQkJCQkJCSAgPHRkPjxpbnB1dCBpZD0iaHJlZiIgbmFtZT0iaHJlZiIgdHlwZT0idGV4dCIgY2xhc3M9Im1jZUZvY3VzIiB2YWx1ZT0iIiBvbmNoYW5nZT0ic2VsZWN0QnlWYWx1ZSh0aGlzLmZvcm0sJ2xpbmtsaXN0aHJlZicsdGhpcy52YWx1ZSk7IiAvPjwvdGQ+CgkJCQkJCQkJICA8dGQgaWQ9ImhyZWZicm93c2VyY29udGFpbmVyIj4mbmJzcDs8L3RkPgoJCQkJCQkJCTwvdHI+CgkJCQkJCQkgIDwvdGFibGU+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyIGlkPSJsaW5rbGlzdGhyZWZyb3ciPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJsaW5rbGlzdGhyZWYiPnsjYWR2bGlua19kbGcubGlzdH08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiIgaWQ9ImxpbmtsaXN0aHJlZmNvbnRhaW5lciI+PHNlbGVjdCBpZD0ibGlua2xpc3RocmVmIj48b3B0aW9uIHZhbHVlPSIiPjwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iYW5jaG9ybGlzdCI+eyNhZHZsaW5rX2RsZy5hbmNob3JfbmFtZXN9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiIGlkPSJhbmNob3JsaXN0Y29udGFpbmVyIj48c2VsZWN0IGlkPSJhbmNob3JsaXN0Ij48b3B0aW9uIHZhbHVlPSIiPjwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgaWQ9InRhcmdldGxpc3RsYWJlbCIgZm9yPSJ0YXJnZXRsaXN0Ij57I2FkdmxpbmtfZGxnLnRhcmdldH08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQgaWQ9InRhcmdldGxpc3Rjb250YWluZXIiPjxzZWxlY3QgaWQ9InRhcmdldGxpc3QiPjxvcHRpb24gdmFsdWU9IiI+PC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJub3dyYXAiPjxsYWJlbCBpZD0idGl0bGVsYWJlbCIgZm9yPSJ0aXRsZSI+eyNhZHZsaW5rX2RsZy50aXRsZWZpZWxkfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgaWQ9InRpdGxlIiBuYW1lPSJ0aXRsZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGlkPSJjbGFzc2xhYmVsIiBmb3I9ImNsYXNzbGlzdCI+eyNjbGFzc19uYW1lfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD4KCQkJCQkJCQkgPHNlbGVjdCBpZD0iY2xhc3NsaXN0IiBuYW1lPSJjbGFzc2xpc3QiIG9uY2hhbmdlPSJjaGFuZ2VDbGFzcygpOyI+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiIgc2VsZWN0ZWQ9InNlbGVjdGVkIj57I25vdF9zZXR9PC9vcHRpb24+CgkJCQkJCQkJIDwvc2VsZWN0PgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC9maWVsZHNldD4KCQkJPC9kaXY+CgoJCQk8ZGl2IGlkPSJwb3B1cF9wYW5lbCIgY2xhc3M9InBhbmVsIj4KCQkJCTxmaWVsZHNldD4KCQkJCQk8bGVnZW5kPnsjYWR2bGlua19kbGcucG9wdXBfcHJvcHN9PC9sZWdlbmQ+CgoJCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImlzcG9wdXAiIG5hbWU9ImlzcG9wdXAiIGNsYXNzPSJyYWRpbyIgb25jbGljaz0ic2V0UG9wdXBDb250cm9sc0Rpc2FibGVkKCF0aGlzLmNoZWNrZWQpO2J1aWxkT25DbGljaygpOyIgLz4KCQkJCQk8bGFiZWwgaWQ9ImlzcG9wdXBsYWJlbCIgZm9yPSJpc3BvcHVwIj57I2FkdmxpbmtfZGxnLnBvcHVwfTwvbGFiZWw+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iNCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgZm9yPSJwb3B1cHVybCI+eyNhZHZsaW5rX2RsZy5wb3B1cF91cmx9PC9sYWJlbD4mbmJzcDs8L3RkPgoJCQkJCQkJPHRkPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icG9wdXB1cmwiIGlkPSJwb3B1cHVybCIgdmFsdWU9IiIgb25jaGFuZ2U9ImJ1aWxkT25DbGljaygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkIGlkPSJwb3B1cHVybGJyb3dzZXJjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgZm9yPSJwb3B1cG5hbWUiPnsjYWR2bGlua19kbGcucG9wdXBfbmFtZX08L2xhYmVsPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InBvcHVwbmFtZSIgaWQ9InBvcHVwbmFtZSIgdmFsdWU9IiIgb25jaGFuZ2U9ImJ1aWxkT25DbGljaygpOyIgLz48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCI+PGxhYmVsPnsjYWR2bGlua19kbGcucG9wdXBfc2l6ZX08L2xhYmVsPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCI+CgkJCQkJCQkJPGlucHV0IHR5cGU9InRleHQiIGlkPSJwb3B1cHdpZHRoIiBuYW1lPSJwb3B1cHdpZHRoIiB2YWx1ZT0iIiBvbmNoYW5nZT0iYnVpbGRPbkNsaWNrKCk7IiAvPiB4CgkJCQkJCQkJPGlucHV0IHR5cGU9InRleHQiIGlkPSJwb3B1cGhlaWdodCIgbmFtZT0icG9wdXBoZWlnaHQiIHZhbHVlPSIiIG9uY2hhbmdlPSJidWlsZE9uQ2xpY2soKTsiIC8+IHB4CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCIgaWQ9ImxhYmVsbGVmdCI+PGxhYmVsPnsjYWR2bGlua19kbGcucG9wdXBfcG9zaXRpb259PC9sYWJlbD4mbmJzcDs8L3RkPgoJCQkJCQkJPHRkIGNsYXNzPSJub3dyYXAiPgoJCQkJCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icG9wdXBsZWZ0IiBuYW1lPSJwb3B1cGxlZnQiIHZhbHVlPSIiIG9uY2hhbmdlPSJidWlsZE9uQ2xpY2soKTsiIC8+IC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCQkJCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icG9wdXB0b3AiIG5hbWU9InBvcHVwdG9wIiB2YWx1ZT0iIiBvbmNoYW5nZT0iYnVpbGRPbkNsaWNrKCk7IiAvPiAoYyAvYyA9IGNlbnRlcikKCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCgkJCQkJPGZpZWxkc2V0PgoJCQkJCQk8bGVnZW5kPnsjYWR2bGlua19kbGcucG9wdXBfb3B0c308L2xlZ2VuZD4KCgkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iNCI+CgkJCQkJCQk8dHI+CgkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InBvcHVwbG9jYXRpb24iIG5hbWU9InBvcHVwbG9jYXRpb24iIGNsYXNzPSJjaGVja2JveCIgb25jaGFuZ2U9ImJ1aWxkT25DbGljaygpOyIgLz48L3RkPgoJCQkJCQkJCTx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgaWQ9InBvcHVwbG9jYXRpb25sYWJlbCIgZm9yPSJwb3B1cGxvY2F0aW9uIj57I2FkdmxpbmtfZGxnLnBvcHVwX2xvY2F0aW9ufTwvbGFiZWw+PC90ZD4KCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icG9wdXBzY3JvbGxiYXJzIiBuYW1lPSJwb3B1cHNjcm9sbGJhcnMiIGNsYXNzPSJjaGVja2JveCIgb25jaGFuZ2U9ImJ1aWxkT25DbGljaygpOyIgLz48L3RkPgoJCQkJCQkJCTx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgaWQ9InBvcHVwc2Nyb2xsYmFyc2xhYmVsIiBmb3I9InBvcHVwc2Nyb2xsYmFycyI+eyNhZHZsaW5rX2RsZy5wb3B1cF9zY3JvbGxiYXJzfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTwvdHI+CgkJCQkJCQk8dHI+CgkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InBvcHVwbWVudWJhciIgbmFtZT0icG9wdXBtZW51YmFyIiBjbGFzcz0iY2hlY2tib3giIG9uY2hhbmdlPSJidWlsZE9uQ2xpY2soKTsiIC8+PC90ZD4KCQkJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCI+PGxhYmVsIGlkPSJwb3B1cG1lbnViYXJsYWJlbCIgZm9yPSJwb3B1cG1lbnViYXIiPnsjYWR2bGlua19kbGcucG9wdXBfbWVudWJhcn08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InBvcHVwcmVzaXphYmxlIiBuYW1lPSJwb3B1cHJlc2l6YWJsZSIgY2xhc3M9ImNoZWNrYm94IiBvbmNoYW5nZT0iYnVpbGRPbkNsaWNrKCk7IiAvPjwvdGQ+CgkJCQkJCQkJPHRkIGNsYXNzPSJub3dyYXAiPjxsYWJlbCBpZD0icG9wdXByZXNpemFibGVsYWJlbCIgZm9yPSJwb3B1cHJlc2l6YWJsZSI+eyNhZHZsaW5rX2RsZy5wb3B1cF9yZXNpemFibGV9PC9sYWJlbD48L3RkPgoJCQkJCQkJPC90cj4KCQkJCQkJCTx0cj4KCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icG9wdXB0b29sYmFyIiBuYW1lPSJwb3B1cHRvb2xiYXIiIGNsYXNzPSJjaGVja2JveCIgb25jaGFuZ2U9ImJ1aWxkT25DbGljaygpOyIgLz48L3RkPgoJCQkJCQkJCTx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgaWQ9InBvcHVwdG9vbGJhcmxhYmVsIiBmb3I9InBvcHVwdG9vbGJhciI+eyNhZHZsaW5rX2RsZy5wb3B1cF90b29sYmFyfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icG9wdXBkZXBlbmRlbnQiIG5hbWU9InBvcHVwZGVwZW5kZW50IiBjbGFzcz0iY2hlY2tib3giIG9uY2hhbmdlPSJidWlsZE9uQ2xpY2soKTsiIC8+PC90ZD4KCQkJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCI+PGxhYmVsIGlkPSJwb3B1cGRlcGVuZGVudGxhYmVsIiBmb3I9InBvcHVwZGVwZW5kZW50Ij57I2FkdmxpbmtfZGxnLnBvcHVwX2RlcGVuZGVudH08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8L3RyPgoJCQkJCQkJPHRyPgoJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJwb3B1cHN0YXR1cyIgbmFtZT0icG9wdXBzdGF0dXMiIGNsYXNzPSJjaGVja2JveCIgb25jaGFuZ2U9ImJ1aWxkT25DbGljaygpOyIgLz48L3RkPgoJCQkJCQkJCTx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgaWQ9InBvcHVwc3RhdHVzbGFiZWwiIGZvcj0icG9wdXBzdGF0dXMiPnsjYWR2bGlua19kbGcucG9wdXBfc3RhdHVzYmFyfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icG9wdXByZXR1cm4iIG5hbWU9InBvcHVwcmV0dXJuIiBjbGFzcz0iY2hlY2tib3giIG9uY2hhbmdlPSJidWlsZE9uQ2xpY2soKTsiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+PC90ZD4KCQkJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCI+PGxhYmVsIGlkPSJwb3B1cHJldHVybmxhYmVsIiBmb3I9InBvcHVwcmV0dXJuIj57I2FkdmxpbmtfZGxnLnBvcHVwX3JldHVybn08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8L3RyPgoJCQkJCQk8L3RhYmxlPgoJCQkJCTwvZmllbGRzZXQ+CgkJCQk8L2ZpZWxkc2V0PgoJCQk8L2Rpdj4KCgkJCTxkaXYgaWQ9ImFkdmFuY2VkX3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJCQk8ZmllbGRzZXQ+CgkJCQkJPGxlZ2VuZD57I2FkdmxpbmtfZGxnLmFkdmFuY2VkX3Byb3BzfTwvbGVnZW5kPgoKCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjQiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBpZD0iaWRsYWJlbCIgZm9yPSJpZCI+eyNhZHZsaW5rX2RsZy5pZH08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPjxpbnB1dCBpZD0iaWQiIG5hbWU9ImlkIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBpZD0ic3R5bGVsYWJlbCIgZm9yPSJzdHlsZSI+eyNhZHZsaW5rX2RsZy5zdHlsZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJzdHlsZSIgbmFtZT0ic3R5bGUiIHZhbHVlPSIiIC8+PC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgaWQ9ImNsYXNzZXNsYWJlbCIgZm9yPSJjbGFzc2VzIj57I2FkdmxpbmtfZGxnLmNsYXNzZXN9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iY2xhc3NlcyIgbmFtZT0iY2xhc3NlcyIgdmFsdWU9IiIgb25jaGFuZ2U9InNlbGVjdEJ5VmFsdWUodGhpcy5mb3JtLCdjbGFzc2xpc3QnLHRoaXMudmFsdWUsdHJ1ZSk7IiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGlkPSJ0YXJnZXRsYWJlbCIgZm9yPSJ0YXJnZXQiPnsjYWR2bGlua19kbGcudGFyZ2V0X25hbWV9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0idGFyZ2V0IiBuYW1lPSJ0YXJnZXQiIHZhbHVlPSIiIG9uY2hhbmdlPSJzZWxlY3RCeVZhbHVlKHRoaXMuZm9ybSwndGFyZ2V0bGlzdCcsdGhpcy52YWx1ZSx0cnVlKTsiIC8+PC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGlkPSJkaXJsYWJlbCIgZm9yPSJkaXIiPnsjYWR2bGlua19kbGcubGFuZ2Rpcn08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTxzZWxlY3QgaWQ9ImRpciIgbmFtZT0iZGlyIj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJsdHIiPnsjYWR2bGlua19kbGcubHRyfTwvb3B0aW9uPiAKCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InJ0bCI+eyNhZHZsaW5rX2RsZy5ydGx9PC9vcHRpb24+IAoJCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQkJPC90ZD4gCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGlkPSJocmVmbGFuZ2xhYmVsIiBmb3I9ImhyZWZsYW5nIj57I2FkdmxpbmtfZGxnLnRhcmdldF9sYW5nY29kZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJocmVmbGFuZyIgbmFtZT0iaHJlZmxhbmciIHZhbHVlPSIiIC8+PC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGlkPSJsYW5nbGFiZWwiIGZvcj0ibGFuZyI+eyNhZHZsaW5rX2RsZy5sYW5nY29kZX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTxpbnB1dCBpZD0ibGFuZyIgbmFtZT0ibGFuZyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz4KCQkJCQkJCTwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBpZD0iY2hhcnNldGxhYmVsIiBmb3I9ImNoYXJzZXQiPnsjYWR2bGlua19kbGcuZW5jb2Rpbmd9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iY2hhcnNldCIgbmFtZT0iY2hhcnNldCIgdmFsdWU9IiIgLz48L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBpZD0idHlwZWxhYmVsIiBmb3I9InR5cGUiPnsjYWR2bGlua19kbGcubWltZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJ0eXBlIiBuYW1lPSJ0eXBlIiB2YWx1ZT0iIiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGlkPSJyZWxsYWJlbCIgZm9yPSJyZWwiPnsjYWR2bGlua19kbGcucmVsfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJyZWwiIG5hbWU9InJlbCI+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImxpZ2h0Ym94Ij5MaWdodGJveDwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYWx0ZXJuYXRlIj5BbHRlcm5hdGU8L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImRlc2lnbmF0ZXMiPkRlc2lnbmF0ZXM8L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InN0eWxlc2hlZXQiPlN0eWxlc2hlZXQ8L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InN0YXJ0Ij5TdGFydDwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibmV4dCI+TmV4dDwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icHJldiI+UHJldjwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY29udGVudHMiPkNvbnRlbnRzPC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJpbmRleCI+SW5kZXg8L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Imdsb3NzYXJ5Ij5HbG9zc2FyeTwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY29weXJpZ2h0Ij5Db3B5cmlnaHQ8L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImNoYXB0ZXIiPkNoYXB0ZXI8L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InN1YnNlY3Rpb24iPlN1YnNlY3Rpb248L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImFwcGVuZGl4Ij5BcHBlbmRpeDwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iaGVscCI+SGVscDwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYm9va21hcmsiPkJvb2ttYXJrPC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Im5vZm9sbG93Ij5ObyBGb2xsb3c8L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idGFnIj5UYWc8L29wdGlvbj4KCQkJCQkJCQk8L3NlbGVjdD4gCgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBpZD0icmV2bGFiZWwiIGZvcj0icmV2Ij57I2FkdmxpbmtfZGxnLnJldn08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0icmV2IiBuYW1lPSJyZXYiPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJhbHRlcm5hdGUiPkFsdGVybmF0ZTwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iZGVzaWduYXRlcyI+RGVzaWduYXRlczwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ic3R5bGVzaGVldCI+U3R5bGVzaGVldDwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ic3RhcnQiPlN0YXJ0PC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJuZXh0Ij5OZXh0PC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJwcmV2Ij5QcmV2PC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJjb250ZW50cyI+Q29udGVudHM8L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImluZGV4Ij5JbmRleDwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iZ2xvc3NhcnkiPkdsb3NzYXJ5PC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJjb3B5cmlnaHQiPkNvcHlyaWdodDwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY2hhcHRlciI+Q2hhcHRlcjwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ic3Vic2VjdGlvbiI+U3Vic2VjdGlvbjwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYXBwZW5kaXgiPkFwcGVuZGl4PC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJoZWxwIj5IZWxwPC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJib29rbWFyayI+Qm9va21hcms8L29wdGlvbj4gCgkJCQkJCQkJPC9zZWxlY3Q+IAoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgaWQ9InRhYmluZGV4bGFiZWwiIGZvcj0idGFiaW5kZXgiPnsjYWR2bGlua19kbGcudGFiaW5kZXh9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0idGFiaW5kZXgiIG5hbWU9InRhYmluZGV4IiB2YWx1ZT0iIiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGlkPSJhY2Nlc3NrZXlsYWJlbCIgZm9yPSJhY2Nlc3NrZXkiPnsjYWR2bGlua19kbGcuYWNjZXNza2V5fTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImFjY2Vzc2tleSIgbmFtZT0iYWNjZXNza2V5IiB2YWx1ZT0iIiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgkJCTwvZGl2PgoKCQkJPGRpdiBpZD0iZXZlbnRzX3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJCQk8ZmllbGRzZXQ+CgkJCQkJPGxlZ2VuZD57I2FkdmxpbmtfZGxnLmV2ZW50X3Byb3BzfTwvbGVnZW5kPgoKCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjQiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9Im9uZm9jdXMiPm9uZm9jdXM8L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25mb2N1cyIgbmFtZT0ib25mb2N1cyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0ib25ibHVyIj5vbmJsdXI8L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25ibHVyIiBuYW1lPSJvbmJsdXIiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4gCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9Im9uY2xpY2siPm9uY2xpY2s8L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25jbGljayIgbmFtZT0ib25jbGljayIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0ib25kYmxjbGljayI+b25kYmxjbGljazwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmRibGNsaWNrIiBuYW1lPSJvbmRibGNsaWNrIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJvbm1vdXNlZG93biI+b25tb3VzZWRvd248L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25tb3VzZWRvd24iIG5hbWU9Im9ubW91c2Vkb3duIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJvbm1vdXNldXAiPm9ubW91c2V1cDwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNldXAiIG5hbWU9Im9ubW91c2V1cCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0ib25tb3VzZW92ZXIiPm9ubW91c2VvdmVyPC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2VvdmVyIiBuYW1lPSJvbm1vdXNlb3ZlciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0ib25tb3VzZW1vdmUiPm9ubW91c2Vtb3ZlPC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2Vtb3ZlIiBuYW1lPSJvbm1vdXNlbW92ZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0ib25tb3VzZW91dCI+b25tb3VzZW91dDwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNlb3V0IiBuYW1lPSJvbm1vdXNlb3V0IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJvbmtleXByZXNzIj5vbmtleXByZXNzPC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5cHJlc3MiIG5hbWU9Im9ua2V5cHJlc3MiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4gCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9Im9ua2V5ZG93biI+b25rZXlkb3duPC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5ZG93biIgbmFtZT0ib25rZXlkb3duIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJvbmtleXVwIj5vbmtleXVwPC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5dXAiIG5hbWU9Im9ua2V5dXAiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4gCgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgkJCTwvZGl2PgoJCTwvZGl2PgoKCQk8ZGl2IGNsYXNzPSJtY2VBY3Rpb25QYW5lbCI+CgkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJpbnNlcnQiIG5hbWU9Imluc2VydCIgdmFsdWU9InsjaW5zZXJ0fSIgLz4KCQkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNhbmNlbCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0ieyNjYW5jZWx9IiBvbmNsaWNrPSJ0aW55TUNFUG9wdXAuY2xvc2UoKTsiIC8+CgkJPC9kaXY+CiAgICA8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlist/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlist/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dmFyIGE9dGlueW1jZS5lYWNoO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnBsdWdpbnMuQWR2TGlzdFBsdWdpbiIse2luaXQ6ZnVuY3Rpb24oYixjKXt2YXIgZD10aGlzO2QuZWRpdG9yPWI7ZnVuY3Rpb24gZShnKXt2YXIgZj1bXTthKGcuc3BsaXQoLywvKSxmdW5jdGlvbihoKXtmLnB1c2goe3RpdGxlOiJhZHZsaXN0LiIrKGg9PSJkZWZhdWx0Ij8iZGVmIjpoLnJlcGxhY2UoLy0vZywiXyIpKSxzdHlsZXM6e2xpc3RTdHlsZVR5cGU6aD09ImRlZmF1bHQiPyIiOmh9fSl9KTtyZXR1cm4gZn1kLm51bWxpc3Q9Yi5nZXRQYXJhbSgiYWR2bGlzdF9udW1iZXJfc3R5bGVzIil8fGUoImRlZmF1bHQsbG93ZXItYWxwaGEsbG93ZXItZ3JlZWssbG93ZXItcm9tYW4sdXBwZXItYWxwaGEsdXBwZXItcm9tYW4iKTtkLmJ1bGxpc3Q9Yi5nZXRQYXJhbSgiYWR2bGlzdF9idWxsZXRfc3R5bGVzIil8fGUoImRlZmF1bHQsY2lyY2xlLGRpc2Msc3F1YXJlIil9LGNyZWF0ZUNvbnRyb2w6ZnVuY3Rpb24oZCxiKXt2YXIgZj10aGlzLGUsaDtpZihkPT0ibnVtbGlzdCJ8fGQ9PSJidWxsaXN0Iil7aWYoZltkXVswXS50aXRsZT09ImFkdmxpc3QuZGVmIil7aD1mW2RdWzBdfWZ1bmN0aW9uIGMoaSxrKXt2YXIgaj10cnVlO2Eoay5zdHlsZXMsZnVuY3Rpb24obSxsKXtpZihmLmVkaXRvci5kb20uZ2V0U3R5bGUoaSxsKSE9bSl7aj1mYWxzZTtyZXR1cm4gZmFsc2V9fSk7cmV0dXJuIGp9ZnVuY3Rpb24gZygpe3ZhciBrLGk9Zi5lZGl0b3IsbD1pLmRvbSxqPWkuc2VsZWN0aW9uO2s9bC5nZXRQYXJlbnQoai5nZXROb2RlKCksIm9sLHVsIik7aWYoIWt8fGsubm9kZU5hbWU9PShkPT0iYnVsbGlzdCI/Ik9MIjoiVUwiKXx8YyhrLGgpKXtpLmV4ZWNDb21tYW5kKGQ9PSJidWxsaXN0Ij8iSW5zZXJ0VW5vcmRlcmVkTGlzdCI6Ikluc2VydE9yZGVyZWRMaXN0Iil9aWYoaCl7az1sLmdldFBhcmVudChqLmdldE5vZGUoKSwib2wsdWwiKTtpZihrKXtsLnNldFN0eWxlcyhrLGguc3R5bGVzKTtrLnJlbW92ZUF0dHJpYnV0ZSgiX21jZV9zdHlsZSIpfX19ZT1iLmNyZWF0ZVNwbGl0QnV0dG9uKGQse3RpdGxlOiJhZHZhbmNlZC4iK2QrIl9kZXNjIiwiY2xhc3MiOiJtY2VfIitkLG9uY2xpY2s6ZnVuY3Rpb24oKXtnKCl9fSk7ZS5vblJlbmRlck1lbnUuYWRkKGZ1bmN0aW9uKGksail7ai5vblNob3dNZW51LmFkZChmdW5jdGlvbigpe3ZhciBtPWYuZWRpdG9yLmRvbSxsPW0uZ2V0UGFyZW50KGYuZWRpdG9yLnNlbGVjdGlvbi5nZXROb2RlKCksIm9sLHVsIiksaztpZihsfHxoKXtrPWZbZF07YShqLml0ZW1zLGZ1bmN0aW9uKG4pe3ZhciBvPXRydWU7bi5zZXRTZWxlY3RlZCgwKTtpZihsJiYhbi5pc0Rpc2FibGVkKCkpe2EoayxmdW5jdGlvbihwKXtpZihwLmlkPT1uLmlkKXtpZighYyhsLHApKXtvPWZhbHNlO3JldHVybiBmYWxzZX19fSk7aWYobyl7bi5zZXRTZWxlY3RlZCgxKX19fSk7aWYoIWwpe2ouaXRlbXNbaC5pZF0uc2V0U2VsZWN0ZWQoMSl9fX0pO2ouYWRkKHtpZDpmLmVkaXRvci5kb20udW5pcXVlSWQoKSx0aXRsZToiYWR2bGlzdC50eXBlcyIsImNsYXNzIjoibWNlTWVudUl0ZW1UaXRsZSJ9KS5zZXREaXNhYmxlZCgxKTthKGZbZF0sZnVuY3Rpb24oayl7ay5pZD1mLmVkaXRvci5kb20udW5pcXVlSWQoKTtqLmFkZCh7aWQ6ay5pZCx0aXRsZTprLnRpdGxlLG9uY2xpY2s6ZnVuY3Rpb24oKXtoPWs7ZygpfX0pfSl9KTtyZXR1cm4gZX19LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6IkFkdmFuY2VkIGxpc3RzIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9hZHZsaXN0Iix2ZXJzaW9uOnRpbnltY2UubWFqb3JWZXJzaW9uKyIuIit0aW55bWNlLm1pbm9yVmVyc2lvbn19fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgiYWR2bGlzdCIsdGlueW1jZS5wbHVnaW5zLkFkdkxpc3RQbHVnaW4pfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/advlist/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgZWFjaCA9IHRpbnltY2UuZWFjaDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnBsdWdpbnMuQWR2TGlzdFBsdWdpbicsIHsNCgkJaW5pdCA6IGZ1bmN0aW9uKGVkLCB1cmwpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5lZGl0b3IgPSBlZDsNCg0KCQkJZnVuY3Rpb24gYnVpbGRGb3JtYXRzKHN0cikgew0KCQkJCXZhciBmb3JtYXRzID0gW107DQoNCgkJCQllYWNoKHN0ci5zcGxpdCgvLC8pLCBmdW5jdGlvbih0eXBlKSB7DQoJCQkJCWZvcm1hdHMucHVzaCh7DQoJCQkJCQl0aXRsZSA6ICdhZHZsaXN0LicgKyAodHlwZSA9PSAnZGVmYXVsdCcgPyAnZGVmJyA6IHR5cGUucmVwbGFjZSgvLS9nLCAnXycpKSwNCgkJCQkJCXN0eWxlcyA6IHsNCgkJCQkJCQlsaXN0U3R5bGVUeXBlIDogdHlwZSA9PSAnZGVmYXVsdCcgPyAnJyA6IHR5cGUNCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm4gZm9ybWF0czsNCgkJCX07DQoNCgkJCS8vIFNldHVwIG51bWJlciBmb3JtYXRzIGZyb20gY29uZmlnIG9yIGRlZmF1bHQNCgkJCXQubnVtbGlzdCA9IGVkLmdldFBhcmFtKCJhZHZsaXN0X251bWJlcl9zdHlsZXMiKSB8fCBidWlsZEZvcm1hdHMoImRlZmF1bHQsbG93ZXItYWxwaGEsbG93ZXItZ3JlZWssbG93ZXItcm9tYW4sdXBwZXItYWxwaGEsdXBwZXItcm9tYW4iKTsNCgkJCXQuYnVsbGlzdCA9IGVkLmdldFBhcmFtKCJhZHZsaXN0X2J1bGxldF9zdHlsZXMiKSB8fCBidWlsZEZvcm1hdHMoImRlZmF1bHQsY2lyY2xlLGRpc2Msc3F1YXJlIik7DQoJCX0sDQoNCgkJY3JlYXRlQ29udHJvbDogZnVuY3Rpb24obmFtZSwgY20pIHsNCgkJCXZhciB0ID0gdGhpcywgYnRuLCBmb3JtYXQ7DQoNCgkJCWlmIChuYW1lID09ICdudW1saXN0JyB8fCBuYW1lID09ICdidWxsaXN0Jykgew0KCQkJCS8vIERlZmF1bHQgdG8gZmlyc3QgaXRlbSBpZiBpdCdzIGEgZGVmYXVsdCBpdGVtDQoJCQkJaWYgKHRbbmFtZV1bMF0udGl0bGUgPT0gJ2Fkdmxpc3QuZGVmJykNCgkJCQkJZm9ybWF0ID0gdFtuYW1lXVswXTsNCg0KCQkJCWZ1bmN0aW9uIGhhc0Zvcm1hdChub2RlLCBmb3JtYXQpIHsNCgkJCQkJdmFyIHN0YXRlID0gdHJ1ZTsNCg0KCQkJCQllYWNoKGZvcm1hdC5zdHlsZXMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7DQoJCQkJCQkvLyBGb3JtYXQgZG9lc24ndCBtYXRjaA0KCQkJCQkJaWYgKHQuZWRpdG9yLmRvbS5nZXRTdHlsZShub2RlLCBuYW1lKSAhPSB2YWx1ZSkgew0KCQkJCQkJCXN0YXRlID0gZmFsc2U7DQoJCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCg0KCQkJCQlyZXR1cm4gc3RhdGU7DQoJCQkJfTsNCg0KCQkJCWZ1bmN0aW9uIGFwcGx5TGlzdEZvcm1hdCgpIHsNCgkJCQkJdmFyIGxpc3QsIGVkID0gdC5lZGl0b3IsIGRvbSA9IGVkLmRvbSwgc2VsID0gZWQuc2VsZWN0aW9uOw0KDQoJCQkJCS8vIENoZWNrIGZvciBleGlzdGluZyBsaXN0IGVsZW1lbnQNCgkJCQkJbGlzdCA9IGRvbS5nZXRQYXJlbnQoc2VsLmdldE5vZGUoKSwgJ29sLHVsJyk7DQoNCgkJCQkJLy8gU3dpdGNoL2FkZCBsaXN0IHR5cGUgaWYgbmVlZGVkDQoJCQkJCWlmICghbGlzdCB8fCBsaXN0Lm5vZGVOYW1lID09IChuYW1lID09ICdidWxsaXN0JyA/ICdPTCcgOiAnVUwnKSB8fCBoYXNGb3JtYXQobGlzdCwgZm9ybWF0KSkNCgkJCQkJCWVkLmV4ZWNDb21tYW5kKG5hbWUgPT0gJ2J1bGxpc3QnID8gJ0luc2VydFVub3JkZXJlZExpc3QnIDogJ0luc2VydE9yZGVyZWRMaXN0Jyk7DQoNCgkJCQkJLy8gQXBwZW5kIHN0eWxlcyB0byBuZXcgbGlzdCBlbGVtZW50DQoJCQkJCWlmIChmb3JtYXQpIHsNCgkJCQkJCWxpc3QgPSBkb20uZ2V0UGFyZW50KHNlbC5nZXROb2RlKCksICdvbCx1bCcpOw0KDQoJCQkJCQlpZiAobGlzdCkgew0KCQkJCQkJCWRvbS5zZXRTdHlsZXMobGlzdCwgZm9ybWF0LnN0eWxlcyk7DQoJCQkJCQkJbGlzdC5yZW1vdmVBdHRyaWJ1dGUoJ19tY2Vfc3R5bGUnKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX07DQoNCgkJCQlidG4gPSBjbS5jcmVhdGVTcGxpdEJ1dHRvbihuYW1lLCB7DQoJCQkJCXRpdGxlIDogJ2FkdmFuY2VkLicgKyBuYW1lICsgJ19kZXNjJywNCgkJCQkJJ2NsYXNzJyA6ICdtY2VfJyArIG5hbWUsDQoJCQkJCW9uY2xpY2sgOiBmdW5jdGlvbigpIHsNCgkJCQkJCWFwcGx5TGlzdEZvcm1hdCgpOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQlidG4ub25SZW5kZXJNZW51LmFkZChmdW5jdGlvbihidG4sIG1lbnUpIHsNCgkJCQkJbWVudS5vblNob3dNZW51LmFkZChmdW5jdGlvbigpIHsNCgkJCQkJCXZhciBkb20gPSB0LmVkaXRvci5kb20sIGxpc3QgPSBkb20uZ2V0UGFyZW50KHQuZWRpdG9yLnNlbGVjdGlvbi5nZXROb2RlKCksICdvbCx1bCcpLCBmbXRMaXN0Ow0KDQoJCQkJCQlpZiAobGlzdCB8fCBmb3JtYXQpIHsNCgkJCQkJCQlmbXRMaXN0ID0gdFtuYW1lXTsNCg0KCQkJCQkJCS8vIFVuc2VsZWN0IGV4aXN0aW5nIGl0ZW1zDQoJCQkJCQkJZWFjaChtZW51Lml0ZW1zLCBmdW5jdGlvbihpdGVtKSB7DQoJCQkJCQkJCXZhciBzdGF0ZSA9IHRydWU7DQoNCgkJCQkJCQkJaXRlbS5zZXRTZWxlY3RlZCgwKTsNCg0KCQkJCQkJCQlpZiAobGlzdCAmJiAhaXRlbS5pc0Rpc2FibGVkKCkpIHsNCgkJCQkJCQkJCWVhY2goZm10TGlzdCwgZnVuY3Rpb24oZm10KSB7DQoJCQkJCQkJCQkJaWYgKGZtdC5pZCA9PSBpdGVtLmlkKSB7DQoJCQkJCQkJCQkJCWlmICghaGFzRm9ybWF0KGxpc3QsIGZtdCkpIHsNCgkJCQkJCQkJCQkJCXN0YXRlID0gZmFsc2U7DQoJCQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQl9KTsNCg0KCQkJCQkJCQkJaWYgKHN0YXRlKQ0KCQkJCQkJCQkJCWl0ZW0uc2V0U2VsZWN0ZWQoMSk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9KTsNCg0KCQkJCQkJCS8vIFNlbGVjdCB0aGUgY3VycmVudCBmb3JtYXQNCgkJCQkJCQlpZiAoIWxpc3QpDQoJCQkJCQkJCW1lbnUuaXRlbXNbZm9ybWF0LmlkXS5zZXRTZWxlY3RlZCgxKTsNCgkJCQkJCX0NCgkJCQkJfSk7DQoNCgkJCQkJbWVudS5hZGQoe2lkIDogdC5lZGl0b3IuZG9tLnVuaXF1ZUlkKCksIHRpdGxlIDogJ2Fkdmxpc3QudHlwZXMnLCAnY2xhc3MnIDogJ21jZU1lbnVJdGVtVGl0bGUnfSkuc2V0RGlzYWJsZWQoMSk7DQoNCgkJCQkJZWFjaCh0W25hbWVdLCBmdW5jdGlvbihpdGVtKSB7DQoJCQkJCQlpdGVtLmlkID0gdC5lZGl0b3IuZG9tLnVuaXF1ZUlkKCk7DQoNCgkJCQkJCW1lbnUuYWRkKHtpZCA6IGl0ZW0uaWQsIHRpdGxlIDogaXRlbS50aXRsZSwgb25jbGljayA6IGZ1bmN0aW9uKCkgew0KCQkJCQkJCWZvcm1hdCA9IGl0ZW07DQoJCQkJCQkJYXBwbHlMaXN0Rm9ybWF0KCk7DQoJCQkJCQl9fSk7DQoJCQkJCX0pOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIGJ0bjsNCgkJCX0NCgkJfSwNCg0KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gew0KCQkJCWxvbmduYW1lIDogJ0FkdmFuY2VkIGxpc3RzJywNCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9hZHZsaXN0JywNCgkJCQl2ZXJzaW9uIDogdGlueW1jZS5tYWpvclZlcnNpb24gKyAiLiIgKyB0aW55bWNlLm1pbm9yVmVyc2lvbg0KCQkJfTsNCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnYWR2bGlzdCcsIHRpbnltY2UucGx1Z2lucy5BZHZMaXN0UGx1Z2luKTsNCn0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/autoresize/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/autoresize/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5BdXRvUmVzaXplUGx1Z2luIix7aW5pdDpmdW5jdGlvbihhLGMpe3ZhciBkPXRoaXM7aWYoYS5nZXRQYXJhbSgiZnVsbHNjcmVlbl9pc19lbmFibGVkIikpe3JldHVybn1mdW5jdGlvbiBiKCl7dmFyIGg9YS5nZXREb2MoKSxlPWguYm9keSxqPWguZG9jdW1lbnRFbGVtZW50LGc9dGlueW1jZS5ET00saT1kLmF1dG9yZXNpemVfbWluX2hlaWdodCxmO2Y9dGlueW1jZS5pc0lFP2Uuc2Nyb2xsSGVpZ2h0Omoub2Zmc2V0SGVpZ2h0O2lmKGY+ZC5hdXRvcmVzaXplX21pbl9oZWlnaHQpe2k9Zn1nLnNldFN0eWxlKGcuZ2V0KGEuaWQrIl9pZnIiKSwiaGVpZ2h0IixpKyJweCIpO2lmKGQudGhyb2JiaW5nKXthLnNldFByb2dyZXNzU3RhdGUoZmFsc2UpO2Euc2V0UHJvZ3Jlc3NTdGF0ZSh0cnVlKX19ZC5lZGl0b3I9YTtkLmF1dG9yZXNpemVfbWluX2hlaWdodD1hLmdldEVsZW1lbnQoKS5vZmZzZXRIZWlnaHQ7YS5vbkNoYW5nZS5hZGQoYik7YS5vblNldENvbnRlbnQuYWRkKGIpO2Eub25QYXN0ZS5hZGQoYik7YS5vbktleVVwLmFkZChiKTthLm9uUG9zdFJlbmRlci5hZGQoYik7aWYoYS5nZXRQYXJhbSgiYXV0b3Jlc2l6ZV9vbl9pbml0Iix0cnVlKSl7YS5vbkluaXQuYWRkKGZ1bmN0aW9uKGYsZSl7Zi5zZXRQcm9ncmVzc1N0YXRlKHRydWUpO2QudGhyb2JiaW5nPXRydWU7Zi5nZXRCb2R5KCkuc3R5bGUub3ZlcmZsb3dZPSJoaWRkZW4ifSk7YS5vbkxvYWRDb250ZW50LmFkZChmdW5jdGlvbihmLGUpe2IoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YigpO2Yuc2V0UHJvZ3Jlc3NTdGF0ZShmYWxzZSk7ZC50aHJvYmJpbmc9ZmFsc2V9LDEyNTApfSl9YS5hZGRDb21tYW5kKCJtY2VBdXRvUmVzaXplIixiKX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiQXV0byBSZXNpemUiLGF1dGhvcjoiTW94aWVjb2RlIFN5c3RlbXMgQUIiLGF1dGhvcnVybDoiaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbSIsaW5mb3VybDoiaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL2F1dG9yZXNpemUiLHZlcnNpb246dGlueW1jZS5tYWpvclZlcnNpb24rIi4iK3RpbnltY2UubWlub3JWZXJzaW9ufX19KTt0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCJhdXRvcmVzaXplIix0aW55bWNlLnBsdWdpbnMuQXV0b1Jlc2l6ZVBsdWdpbil9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/autoresize/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGVkaXRvcl9wbHVnaW5fc3JjLmpzCiAqCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQgogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuCiAqCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nCiAqLwoKKGZ1bmN0aW9uKCkgewoJLyoqCgkgKiBBdXRvIFJlc2l6ZQoJICogCgkgKiBUaGlzIHBsdWdpbiBhdXRvbWF0aWNhbGx5IHJlc2l6ZXMgdGhlIGNvbnRlbnQgYXJlYSB0byBmaXQgaXRzIGNvbnRlbnQgaGVpZ2h0LgoJICogSXQgd2lsbCByZXRhaW4gYSBtaW5pbXVtIGhlaWdodCwgd2hpY2ggaXMgdGhlIGhlaWdodCBvZiB0aGUgY29udGVudCBhcmVhIHdoZW4KCSAqIGl0J3MgaW5pdGlhbGl6ZWQuCgkgKi8KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnBsdWdpbnMuQXV0b1Jlc2l6ZVBsdWdpbicsIHsKCQkvKioKCQkgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2luLCB0aGlzIHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHBsdWdpbiBoYXMgYmVlbiBjcmVhdGVkLgoJCSAqIFRoaXMgY2FsbCBpcyBkb25lIGJlZm9yZSB0aGUgZWRpdG9yIGluc3RhbmNlIGhhcyBmaW5pc2hlZCBpdCdzIGluaXRpYWxpemF0aW9uIHNvIHVzZSB0aGUgb25Jbml0IGV2ZW50CgkJICogb2YgdGhlIGVkaXRvciBpbnN0YW5jZSB0byBpbnRlcmNlcHQgdGhhdCBldmVudC4KCQkgKgoJCSAqIEBwYXJhbSB7dGlueW1jZS5FZGl0b3J9IGVkIEVkaXRvciBpbnN0YW5jZSB0aGF0IHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQgaW4uCgkJICogQHBhcmFtIHtzdHJpbmd9IHVybCBBYnNvbHV0ZSBVUkwgdG8gd2hlcmUgdGhlIHBsdWdpbiBpcyBsb2NhdGVkLgoJCSAqLwoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7CgkJCXZhciB0ID0gdGhpczsKCgkJCWlmIChlZC5nZXRQYXJhbSgnZnVsbHNjcmVlbl9pc19lbmFibGVkJykpCgkJCQlyZXR1cm47CgoJCQkvKioKCQkJICogVGhpcyBtZXRob2QgZ2V0cyBleGVjdXRlZCBlYWNoIHRpbWUgdGhlIGVkaXRvciBuZWVkcyB0byByZXNpemUuCgkJCSAqLwoJCQlmdW5jdGlvbiByZXNpemUoKSB7CgkJCQl2YXIgZCA9IGVkLmdldERvYygpLCBiID0gZC5ib2R5LCBkZSA9IGQuZG9jdW1lbnRFbGVtZW50LCBET00gPSB0aW55bWNlLkRPTSwgcmVzaXplSGVpZ2h0ID0gdC5hdXRvcmVzaXplX21pbl9oZWlnaHQsIG15SGVpZ2h0OwoKCQkJCS8vIEdldCBoZWlnaHQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSBicm93c2VyIHVzZWQKCQkJCW15SGVpZ2h0ID0gdGlueW1jZS5pc0lFID8gYi5zY3JvbGxIZWlnaHQgOiBkZS5vZmZzZXRIZWlnaHQ7CgoJCQkJLy8gRG9uJ3QgbWFrZSBpdCBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gaGVpZ2h0CgkJCQlpZiAobXlIZWlnaHQgPiB0LmF1dG9yZXNpemVfbWluX2hlaWdodCkKCQkJCQlyZXNpemVIZWlnaHQgPSBteUhlaWdodDsKCgkJCQkvLyBSZXNpemUgY29udGVudCBlbGVtZW50CgkJCQlET00uc2V0U3R5bGUoRE9NLmdldChlZC5pZCArICdfaWZyJyksICdoZWlnaHQnLCByZXNpemVIZWlnaHQgKyAncHgnKTsKCgkJCQkvLyBpZiB3ZSdyZSB0aHJvYmJpbmcsIHdlJ2xsIHJlLXRocm9iIHRvIG1hdGNoIHRoZSBuZXcgc2l6ZQoJCQkJaWYgKHQudGhyb2JiaW5nKSB7CgkJCQkJZWQuc2V0UHJvZ3Jlc3NTdGF0ZShmYWxzZSk7CgkJCQkJZWQuc2V0UHJvZ3Jlc3NTdGF0ZSh0cnVlKTsKCQkJCX0KCQkJfTsKCgkJCXQuZWRpdG9yID0gZWQ7CgoJCQkvLyBEZWZpbmUgbWluaW11bSBoZWlnaHQKCQkJdC5hdXRvcmVzaXplX21pbl9oZWlnaHQgPSBlZC5nZXRFbGVtZW50KCkub2Zmc2V0SGVpZ2h0OwoKCQkJLy8gQWRkIGFwcHJvcHJpYXRlIGxpc3RlbmVycyBmb3IgcmVzaXppbmcgY29udGVudCBhcmVhCgkJCWVkLm9uQ2hhbmdlLmFkZChyZXNpemUpOwoJCQllZC5vblNldENvbnRlbnQuYWRkKHJlc2l6ZSk7CgkJCWVkLm9uUGFzdGUuYWRkKHJlc2l6ZSk7CgkJCWVkLm9uS2V5VXAuYWRkKHJlc2l6ZSk7CgkJCWVkLm9uUG9zdFJlbmRlci5hZGQocmVzaXplKTsKCgkJCWlmIChlZC5nZXRQYXJhbSgnYXV0b3Jlc2l6ZV9vbl9pbml0JywgdHJ1ZSkpIHsKCQkJCS8vIFRoaW5ncyB0byBkbyB3aGVuIHRoZSBlZGl0b3IgaXMgcmVhZHkKCQkJCWVkLm9uSW5pdC5hZGQoZnVuY3Rpb24oZWQsIGwpIHsKCQkJCQkvLyBTaG93IHRocm9iYmVyIHVudGlsIGNvbnRlbnQgYXJlYSBpcyByZXNpemVkIHByb3Blcmx5CgkJCQkJZWQuc2V0UHJvZ3Jlc3NTdGF0ZSh0cnVlKTsKCQkJCQl0LnRocm9iYmluZyA9IHRydWU7CgoJCQkJCS8vIEhpZGUgc2Nyb2xsYmFycwoJCQkJCWVkLmdldEJvZHkoKS5zdHlsZS5vdmVyZmxvd1kgPSAiaGlkZGVuIjsKCQkJCX0pOwoKCQkJCWVkLm9uTG9hZENvbnRlbnQuYWRkKGZ1bmN0aW9uKGVkLCBsKSB7CgkJCQkJcmVzaXplKCk7CgoJCQkJCS8vIEJlY2F1c2UgdGhlIGNvbnRlbnQgYXJlYSByZXNpemVzIHdoZW4gaXRzIGNvbnRlbnQgQ1NTIGxvYWRzLAoJCQkJCS8vIGFuZCB3ZSBjYW4ndCBlYXNpbHkgYWRkIGEgbGlzdGVuZXIgdG8gaXRzIG9ubG9hZCBldmVudCwKCQkJCQkvLyB3ZSdsbCBqdXN0IHRyaWdnZXIgYSByZXNpemUgYWZ0ZXIgYSBzaG9ydCBsb2FkaW5nIHBlcmlvZAoJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCQkJCXJlc2l6ZSgpOwoKCQkJCQkJLy8gRGlzYWJsZSB0aHJvYmJlcgoJCQkJCQllZC5zZXRQcm9ncmVzc1N0YXRlKGZhbHNlKTsKCQkJCQkJdC50aHJvYmJpbmcgPSBmYWxzZTsKCQkJCQl9LCAxMjUwKTsKCQkJCX0pOwoJCQl9CgoJCQkvLyBSZWdpc3RlciB0aGUgY29tbWFuZCBzbyB0aGF0IGl0IGNhbiBiZSBpbnZva2VkIGJ5IHVzaW5nIHRpbnlNQ0UuYWN0aXZlRWRpdG9yLmV4ZWNDb21tYW5kKCdtY2VFeGFtcGxlJyk7CgkJCWVkLmFkZENvbW1hbmQoJ21jZUF1dG9SZXNpemUnLCByZXNpemUpOwoJCX0sCgoJCS8qKgoJCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBsdWdpbiBhcyBhIG5hbWUvdmFsdWUgYXJyYXkuCgkJICogVGhlIGN1cnJlbnQga2V5cyBhcmUgbG9uZ25hbWUsIGF1dGhvciwgYXV0aG9ydXJsLCBpbmZvdXJsIGFuZCB2ZXJzaW9uLgoJCSAqCgkJICogQHJldHVybiB7T2JqZWN0fSBOYW1lL3ZhbHVlIGFycmF5IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBsdWdpbi4KCQkgKi8KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7CgkJCXJldHVybiB7CgkJCQlsb25nbmFtZSA6ICdBdXRvIFJlc2l6ZScsCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLAoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLAoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvYXV0b3Jlc2l6ZScsCgkJCQl2ZXJzaW9uIDogdGlueW1jZS5tYWpvclZlcnNpb24gKyAiLiIgKyB0aW55bWNlLm1pbm9yVmVyc2lvbgoJCQl9OwoJCX0KCX0pOwoKCS8vIFJlZ2lzdGVyIHBsdWdpbgoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnYXV0b3Jlc2l6ZScsIHRpbnltY2UucGx1Z2lucy5BdXRvUmVzaXplUGx1Z2luKTsKfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/autosave/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/autosave/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGUpe3ZhciBjPSJhdXRvc2F2ZSIsZz0icmVzdG9yZWRyYWZ0IixiPXRydWUsZixkLGE9ZS51dGlsLkRpc3BhdGNoZXI7ZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5BdXRvU2F2ZSIse2luaXQ6ZnVuY3Rpb24oaSxqKXt2YXIgaD10aGlzLGw9aS5zZXR0aW5ncztoLmVkaXRvcj1pO2Z1bmN0aW9uIGsobil7dmFyIG09e3M6MTAwMCxtOjYwMDAwfTtuPS9eKFxkKykoW21zXT8pJC8uZXhlYygiIituKTtyZXR1cm4oblsyXT9tW25bMl1dOjEpKnBhcnNlSW50KG4pfWUuZWFjaCh7YXNrX2JlZm9yZV91bmxvYWQ6YixpbnRlcnZhbDoiMzBzIixyZXRlbnRpb246IjIwbSIsbWlubGVuZ3RoOjUwfSxmdW5jdGlvbihuLG0pe209YysiXyIrbTtpZihsW21dPT09Zil7bFttXT1ufX0pO2wuYXV0b3NhdmVfaW50ZXJ2YWw9ayhsLmF1dG9zYXZlX2ludGVydmFsKTtsLmF1dG9zYXZlX3JldGVudGlvbj1rKGwuYXV0b3NhdmVfcmV0ZW50aW9uKTtpLmFkZEJ1dHRvbihnLHt0aXRsZTpjKyIucmVzdG9yZV9jb250ZW50IixvbmNsaWNrOmZ1bmN0aW9uKCl7aWYoaS5nZXRDb250ZW50KHtkcmFmdDp0cnVlfSkucmVwbGFjZSgvXHN8Jm5ic3A7fDxcLz9wW14+XSo+fDxicltePl0qPi9naSwiIikubGVuZ3RoPjApe2kud2luZG93TWFuYWdlci5jb25maXJtKGMrIi53YXJuaW5nX21lc3NhZ2UiLGZ1bmN0aW9uKG0pe2lmKG0pe2gucmVzdG9yZURyYWZ0KCl9fSl9ZWxzZXtoLnJlc3RvcmVEcmFmdCgpfX19KTtpLm9uTm9kZUNoYW5nZS5hZGQoZnVuY3Rpb24oKXt2YXIgbT1pLmNvbnRyb2xNYW5hZ2VyO2lmKG0uZ2V0KGcpKXttLnNldERpc2FibGVkKGcsIWguaGFzRHJhZnQoKSl9fSk7aS5vbkluaXQuYWRkKGZ1bmN0aW9uKCl7aWYoaS5jb250cm9sTWFuYWdlci5nZXQoZykpe2guc2V0dXBTdG9yYWdlKGkpO3NldEludGVydmFsKGZ1bmN0aW9uKCl7aC5zdG9yZURyYWZ0KCk7aS5ub2RlQ2hhbmdlZCgpfSxsLmF1dG9zYXZlX2ludGVydmFsKX19KTtoLm9uU3RvcmVEcmFmdD1uZXcgYShoKTtoLm9uUmVzdG9yZURyYWZ0PW5ldyBhKGgpO2gub25SZW1vdmVEcmFmdD1uZXcgYShoKTtpZighZCl7d2luZG93Lm9uYmVmb3JldW5sb2FkPWUucGx1Z2lucy5BdXRvU2F2ZS5fYmVmb3JlVW5sb2FkSGFuZGxlcjtkPWJ9fSxnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJBdXRvIHNhdmUiLGF1dGhvcjoiTW94aWVjb2RlIFN5c3RlbXMgQUIiLGF1dGhvcnVybDoiaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbSIsaW5mb3VybDoiaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL2F1dG9zYXZlIix2ZXJzaW9uOmUubWFqb3JWZXJzaW9uKyIuIitlLm1pbm9yVmVyc2lvbn19LGdldEV4cERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkrdGhpcy5lZGl0b3Iuc2V0dGluZ3MuYXV0b3NhdmVfcmV0ZW50aW9uKS50b1VUQ1N0cmluZygpfSxzZXR1cFN0b3JhZ2U6ZnVuY3Rpb24oaSl7dmFyIGg9dGhpcyxrPWMrIl90ZXN0IixqPSJPSyI7aC5rZXk9YytpLmlkO2UuZWFjaChbZnVuY3Rpb24oKXtpZihsb2NhbFN0b3JhZ2Upe2xvY2FsU3RvcmFnZS5zZXRJdGVtKGssaik7aWYobG9jYWxTdG9yYWdlLmdldEl0ZW0oayk9PT1qKXtsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrKTtyZXR1cm4gbG9jYWxTdG9yYWdlfX19LGZ1bmN0aW9uKCl7aWYoc2Vzc2lvblN0b3JhZ2Upe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oayxqKTtpZihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGspPT09ail7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShrKTtyZXR1cm4gc2Vzc2lvblN0b3JhZ2V9fX0sZnVuY3Rpb24oKXtpZihlLmlzSUUpe2kuZ2V0RWxlbWVudCgpLnN0eWxlLmJlaGF2aW9yPSJ1cmwoJyNkZWZhdWx0I3VzZXJEYXRhJykiO3JldHVybnthdXRvRXhwaXJlczpiLHNldEl0ZW06ZnVuY3Rpb24obCxuKXt2YXIgbT1pLmdldEVsZW1lbnQoKTttLnNldEF0dHJpYnV0ZShsLG4pO20uZXhwaXJlcz1oLmdldEV4cERhdGUoKTttLnNhdmUoIlRpbnlNQ0UiKX0sZ2V0SXRlbTpmdW5jdGlvbihsKXt2YXIgbT1pLmdldEVsZW1lbnQoKTttLmxvYWQoIlRpbnlNQ0UiKTtyZXR1cm4gbS5nZXRBdHRyaWJ1dGUobCl9LHJlbW92ZUl0ZW06ZnVuY3Rpb24obCl7aS5nZXRFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlKGwpfX19fSxdLGZ1bmN0aW9uKGwpe3RyeXtoLnN0b3JhZ2U9bCgpO2lmKGguc3RvcmFnZSl7cmV0dXJuIGZhbHNlfX1jYXRjaChtKXt9fSl9LHN0b3JlRHJhZnQ6ZnVuY3Rpb24oKXt2YXIgaT10aGlzLGw9aS5zdG9yYWdlLGo9aS5lZGl0b3IsaCxrO2lmKGwpe2lmKCFsLmdldEl0ZW0oaS5rZXkpJiYhai5pc0RpcnR5KCkpe3JldHVybn1rPWouZ2V0Q29udGVudCh7ZHJhZnQ6dHJ1ZX0pO2lmKGsubGVuZ3RoPmouc2V0dGluZ3MuYXV0b3NhdmVfbWlubGVuZ3RoKXtoPWkuZ2V0RXhwRGF0ZSgpO2lmKCFpLnN0b3JhZ2UuYXV0b0V4cGlyZXMpe2kuc3RvcmFnZS5zZXRJdGVtKGkua2V5KyJfZXhwaXJlcyIsaCl9aS5zdG9yYWdlLnNldEl0ZW0oaS5rZXksayk7aS5vblN0b3JlRHJhZnQuZGlzcGF0Y2goaSx7ZXhwaXJlczpoLGNvbnRlbnQ6a30pfX19LHJlc3RvcmVEcmFmdDpmdW5jdGlvbigpe3ZhciBoPXRoaXMsaT1oLnN0b3JhZ2U7aWYoaSl7Y29udGVudD1pLmdldEl0ZW0oaC5rZXkpO2lmKGNvbnRlbnQpe2guZWRpdG9yLnNldENvbnRlbnQoY29udGVudCk7aC5vblJlc3RvcmVEcmFmdC5kaXNwYXRjaChoLHtjb250ZW50OmNvbnRlbnR9KX19fSxoYXNEcmFmdDpmdW5jdGlvbigpe3ZhciBoPXRoaXMsaz1oLnN0b3JhZ2UsaSxqO2lmKGspe2o9ISFrLmdldEl0ZW0oaC5rZXkpO2lmKGope2lmKCFoLnN0b3JhZ2UuYXV0b0V4cGlyZXMpe2k9bmV3IERhdGUoay5nZXRJdGVtKGgua2V5KyJfZXhwaXJlcyIpKTtpZihuZXcgRGF0ZSgpLmdldFRpbWUoKTxpLmdldFRpbWUoKSl7cmV0dXJuIGJ9aC5yZW1vdmVEcmFmdCgpfWVsc2V7cmV0dXJuIGJ9fX1yZXR1cm4gZmFsc2V9LHJlbW92ZURyYWZ0OmZ1bmN0aW9uKCl7dmFyIGg9dGhpcyxrPWguc3RvcmFnZSxpPWgua2V5LGo7aWYoayl7aj1rLmdldEl0ZW0oaSk7ay5yZW1vdmVJdGVtKGkpO2sucmVtb3ZlSXRlbShpKyJfZXhwaXJlcyIpO2lmKGope2gub25SZW1vdmVEcmFmdC5kaXNwYXRjaChoLHtjb250ZW50Omp9KX19fSwic3RhdGljIjp7X2JlZm9yZVVubG9hZEhhbmRsZXI6ZnVuY3Rpb24oaCl7dmFyIGk7ZS5lYWNoKHRpbnlNQ0UuZWRpdG9ycyxmdW5jdGlvbihqKXtpZihqLnBsdWdpbnMuYXV0b3NhdmUpe2oucGx1Z2lucy5hdXRvc2F2ZS5zdG9yZURyYWZ0KCl9aWYoai5nZXRQYXJhbSgiZnVsbHNjcmVlbl9pc19lbmFibGVkIikpe3JldHVybn1pZighaSYmai5pc0RpcnR5KCkmJmouZ2V0UGFyYW0oImF1dG9zYXZlX2Fza19iZWZvcmVfdW5sb2FkIikpe2k9ai5nZXRMYW5nKCJhdXRvc2F2ZS51bmxvYWRfbXNnIil9fSk7cmV0dXJuIGl9fX0pO2UuUGx1Z2luTWFuYWdlci5hZGQoImF1dG9zYXZlIixlLnBsdWdpbnMuQXV0b1NhdmUpfSkodGlueW1jZSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/autosave/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICoNCiAqIEFkZHMgYXV0by1zYXZlIGNhcGFiaWxpdHkgdG8gdGhlIFRpbnlNQ0UgdGV4dCBlZGl0b3IgdG8gcmVzY3VlIGNvbnRlbnQNCiAqIGluYWR2ZXJ0ZW50bHkgbG9zdC4gVGhpcyBwbHVnaW4gd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IFNwZWVkbmV0DQogKiBhbmQgdGhhdCBwcm9qZWN0IGNhbiBiZSBmb3VuZCBoZXJlOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdGlueWF1dG9zYXZlLw0KICoNCiAqIFRFQ0hOT0xPR1kgRElTQ1VTU0lPTjoNCiAqIA0KICogVGhlIHBsdWdpbiBhdHRlbXB0cyB0byB1c2UgdGhlIG1vc3QgYWR2YW5jZWQgZmVhdHVyZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGJyb3dzZXIgdG8gc2F2ZQ0KICogYXMgbXVjaCBjb250ZW50IGFzIHBvc3NpYmxlLiAgVGhlcmUgYXJlIGEgdG90YWwgb2YgZm91ciBkaWZmZXJlbnQgbWV0aG9kcyB1c2VkIHRvIGF1dG9zYXZlIHRoZQ0KICogY29udGVudC4gIEluIG9yZGVyIG9mIHByZWZlcmVuY2UsIHRoZXkgYXJlOg0KICogDQogKiAxLiBsb2NhbFN0b3JhZ2UgLSBBIG5ldyBmZWF0dXJlIG9mIEhUTUwgNSwgbG9jYWxTdG9yYWdlIGNhbiBzdG9yZSBtZWdhYnl0ZXMgb2YgZGF0YSBwZXIgZG9tYWluDQogKiBvbiB0aGUgY2xpZW50IGNvbXB1dGVyLiBEYXRhIHN0b3JlZCBpbiB0aGUgbG9jYWxTdG9yYWdlIGFyZWEgaGFzIG5vIGV4cGlyYXRpb24gZGF0ZSwgc28gd2UgbXVzdA0KICogbWFuYWdlIGV4cGlyaW5nIHRoZSBkYXRhIG91cnNlbHZlcy4gIGxvY2FsU3RvcmFnZSBpcyBmdWxseSBzdXBwb3J0ZWQgYnkgSUU4LCBhbmQgaXQgaXMgc3VwcG9zZWQNCiAqIHRvIGJlIHdvcmtpbmcgaW4gRmlyZWZveCAzIGFuZCBTYWZhcmkgMy4yLCBidXQgaW4gcmVhbGl0eSBpcyBpcyBmbGFreSBpbiB0aG9zZSBicm93c2Vycy4gIEFzDQogKiBIVE1MIDUgZ2V0cyB3aWRlciBzdXBwb3J0LCB0aGUgQXV0b1NhdmUgcGx1Z2luIHdpbGwgdXNlIGl0IGF1dG9tYXRpY2FsbHkuIEluIFdpbmRvd3MgVmlzdGEvNywNCiAqIGxvY2FsU3RvcmFnZSBpcyBzdG9yZWQgaW4gdGhlIGZvbGxvd2luZyBmb2xkZXI6DQogKiBDOlxVc2Vyc1xbdXNlcm5hbWVdXEFwcERhdGFcTG9jYWxcTWljcm9zb2Z0XEludGVybmV0IEV4cGxvcmVyXERPTVN0b3JlXFt0ZW1wRm9sZGVyXQ0KICogDQogKiAyLiBzZXNzaW9uU3RvcmFnZSAtIEEgbmV3IGZlYXR1cmUgb2YgSFRNTCA1LCBzZXNzaW9uU3RvcmFnZSB3b3JrcyBzaW1pbGFybHkgdG8gbG9jYWxTdG9yYWdlLA0KICogZXhjZXB0IGl0IGlzIGRlc2lnbmVkIHRvIGV4cGlyZSBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUuICBCZWNhdXNlIHRoZSBzcGVjaWZpY2F0aW9uDQogKiBhcm91bmQgZXhwaXJhdGlvbiBkYXRlL3RpbWUgaXMgdmVyeSBsb29zZWx5LWRlc2NyaWJlZCwgaXQgaXMgcHJlZmVycmFibGUgdG8gdXNlIGxvY2FTdG9yYWdlIGFuZA0KICogbWFuYWdlIHRoZSBleHBpcmF0aW9uIG91cnNlbHZlcy4gIHNlc3Npb25TdG9yYWdlIGhhcyBzaW1pbGFyIHN0b3JhZ2UgY2hhcmFjdGVyaXN0aWNzIHRvDQogKiBsb2NhbFN0b3JhZ2UsIGFsdGhvdWdoIGl0IHNlZW1zIHRvIGhhdmUgYmV0dGVyIHN1cHBvcnQgYnkgRmlyZWZveCAzIGF0IHRoZSBtb21lbnQuICAoVGhhdCB3aWxsDQogKiBjZXJ0YWlubHkgY2hhbmdlIGFzIEZpcmVmb3ggY29udGludWVzIGdldHRpbmcgYmV0dGVyIGF0IEhUTUwgNSBhZG9wdGlvbi4pDQogKiANCiAqIDMuIFVzZXJEYXRhIC0gQSB2ZXJ5IHVuZGVyLWV4cGxvaXRlZCBmZWF0dXJlIG9mIE1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciwgVXNlckRhdGEgaXMgYQ0KICogd2F5IHRvIHN0b3JlIHVwIHRvIDEyOEsgb2YgZGF0YSBwZXIgImRvY3VtZW50Iiwgb3IgdXAgdG8gMU1CIG9mIGRhdGEgcGVyIGRvbWFpbiwgb24gdGhlIGNsaWVudA0KICogY29tcHV0ZXIuICBUaGUgZmVhdHVyZSBpcyBhdmFpbGFibGUgZm9yIElFIDUrLCB3aGljaCBtYWtlcyBpdCBhdmFpbGFibGUgZm9yIGV2ZXJ5IHZlcnNpb24gb2YgSUUNCiAqIHN1cHBvcnRlZCBieSBUaW55TUNFLiAgVGhlIGNvbnRlbnQgaXMgcGVyc2lzdGVudCBhY3Jvc3MgYnJvd3NlciByZXN0YXJ0cyBhbmQgZXhwaXJlcyBvbiB0aGUNCiAqIGRhdGUvdGltZSBzcGVjaWZpZWQsIGp1c3QgbGlrZSBhIGNvb2tpZS4gIEhvd2V2ZXIsIHRoZSBkYXRhIGlzIG5vdCBjbGVhcmVkIHdoZW4gdGhlIHVzZXIgY2xlYXJzDQogKiBjb29raWVzIG9uIHRoZSBicm93c2VyLCB3aGljaCBtYWtlcyBpdCB3ZWxsLXN1aXRlZCBmb3IgcmVzY3VpbmcgYXV0b3NhdmVkIGNvbnRlbnQuICBVc2VyRGF0YSwNCiAqIGxpa2Ugb3RoZXIgTWljcm9zb2Z0IElFIGJyb3dzZXIgdGVjaG5vbG9naWVzLCBpcyBpbXBsZW1lbnRlZCBhcyBhIGJlaGF2aW9yIGF0dGFjaGVkIHRvIGENCiAqIHNwZWNpZmljIERPTSBvYmplY3QsIHNvIGluIHRoaXMgY2FzZSB3ZSBhdHRhY2ggdGhlIGJlaGF2aW9yIHRvIHRoZSBzYW1lIERPTSBlbGVtZW50IHRoYXQgdGhlDQogKiBUaW55TUNFIGVkaXRvciBpbnN0YW5jZSBpcyBhdHRhY2hlZCB0by4NCiAqLw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIFNldHVwIGNvbnN0YW50cyB0byBoZWxwIHRoZSBjb21wcmVzc29yIHRvIHJlZHVjZSBzY3JpcHQgc2l6ZQ0KCXZhciBQTFVHSU5fTkFNRSA9ICdhdXRvc2F2ZScsDQoJCVJFU1RPUkVfRFJBRlQgPSAncmVzdG9yZWRyYWZ0JywNCgkJVFJVRSA9IHRydWUsDQoJCXVuZGVmaW5lZCwNCgkJdW5sb2FkSGFuZGxlckFkZGVkLA0KCQlEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXI7DQoNCgkvKioNCgkgKiBUaGlzIHBsdWdpbiBhZGRzIGF1dG8tc2F2ZSBjYXBhYmlsaXR5IHRvIHRoZSBUaW55TUNFIHRleHQgZWRpdG9yIHRvIHJlc2N1ZSBjb250ZW50DQoJICogaW5hZHZlcnRlbnRseSBsb3N0LiBCeSB1c2luZyBsb2NhbFN0b3JhZ2UuDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS5wbHVnaW5zLkF1dG9TYXZlDQoJICovDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UucGx1Z2lucy5BdXRvU2F2ZScsIHsNCgkJLyoqDQoJCSAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW4sIHRoaXMgd2lsbCBiZSBleGVjdXRlZCBhZnRlciB0aGUgcGx1Z2luIGhhcyBiZWVuIGNyZWF0ZWQuDQoJCSAqIFRoaXMgY2FsbCBpcyBkb25lIGJlZm9yZSB0aGUgZWRpdG9yIGluc3RhbmNlIGhhcyBmaW5pc2hlZCBpdCdzIGluaXRpYWxpemF0aW9uIHNvIHVzZSB0aGUgb25Jbml0IGV2ZW50DQoJCSAqIG9mIHRoZSBlZGl0b3IgaW5zdGFuY2UgdG8gaW50ZXJjZXB0IHRoYXQgZXZlbnQuDQoJCSAqDQoJCSAqIEBtZXRob2QgaW5pdA0KCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBlZCBFZGl0b3IgaW5zdGFuY2UgdGhhdCB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkIGluLg0KCQkgKiBAcGFyYW0ge3N0cmluZ30gdXJsIEFic29sdXRlIFVSTCB0byB3aGVyZSB0aGUgcGx1Z2luIGlzIGxvY2F0ZWQuDQoJCSAqLw0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJdmFyIHNlbGYgPSB0aGlzLCBzZXR0aW5ncyA9IGVkLnNldHRpbmdzOw0KDQoJCQlzZWxmLmVkaXRvciA9IGVkOw0KDQoJCQkvLyBQYXJzZXMgdGhlIHNwZWNpZmllZCB0aW1lIHN0cmluZyBpbnRvIGEgbWlsaXNlY29uZCBudW1iZXIgMTBtLCAxMHMgZXRjLg0KCQkJZnVuY3Rpb24gcGFyc2VUaW1lKHRpbWUpIHsNCgkJCQl2YXIgbXVsdGlwZWxzID0gew0KCQkJCQlzIDogMTAwMCwNCgkJCQkJbSA6IDYwMDAwDQoJCQkJfTsNCg0KCQkJCXRpbWUgPSAvXihcZCspKFttc10/KSQvLmV4ZWMoJycgKyB0aW1lKTsNCg0KCQkJCXJldHVybiAodGltZVsyXSA/IG11bHRpcGVsc1t0aW1lWzJdXSA6IDEpICogcGFyc2VJbnQodGltZSk7DQoJCQl9Ow0KDQoJCQkvLyBEZWZhdWx0IGNvbmZpZw0KCQkJdGlueW1jZS5lYWNoKHsNCgkJCQlhc2tfYmVmb3JlX3VubG9hZCA6IFRSVUUsDQoJCQkJaW50ZXJ2YWwgOiAnMzBzJywNCgkJCQlyZXRlbnRpb24gOiAnMjBtJywNCgkJCQltaW5sZW5ndGggOiA1MA0KCQkJfSwgZnVuY3Rpb24odmFsdWUsIGtleSkgew0KCQkJCWtleSA9IFBMVUdJTl9OQU1FICsgJ18nICsga2V5Ow0KDQoJCQkJaWYgKHNldHRpbmdzW2tleV0gPT09IHVuZGVmaW5lZCkNCgkJCQkJc2V0dGluZ3Nba2V5XSA9IHZhbHVlOw0KCQkJfSk7DQoNCgkJCS8vIFBhcnNlIHRpbWVzDQoJCQlzZXR0aW5ncy5hdXRvc2F2ZV9pbnRlcnZhbCA9IHBhcnNlVGltZShzZXR0aW5ncy5hdXRvc2F2ZV9pbnRlcnZhbCk7DQoJCQlzZXR0aW5ncy5hdXRvc2F2ZV9yZXRlbnRpb24gPSBwYXJzZVRpbWUoc2V0dGluZ3MuYXV0b3NhdmVfcmV0ZW50aW9uKTsNCg0KCQkJLy8gUmVnaXN0ZXIgcmVzdG9yZSBidXR0b24NCgkJCWVkLmFkZEJ1dHRvbihSRVNUT1JFX0RSQUZULCB7DQoJCQkJdGl0bGUgOiBQTFVHSU5fTkFNRSArICIucmVzdG9yZV9jb250ZW50IiwNCgkJCQlvbmNsaWNrIDogZnVuY3Rpb24oKSB7DQoJCQkJCWlmIChlZC5nZXRDb250ZW50KHtkcmFmdDogdHJ1ZX0pLnJlcGxhY2UoL1xzfCZuYnNwO3w8XC8/cFtePl0qPnw8YnJbXj5dKj4vZ2ksICIiKS5sZW5ndGggPiAwKSB7DQoJCQkJCQkvLyBTaG93IGNvbmZpcm0gZGlhbG9nIGlmIHRoZSBlZGl0b3IgaXNuJ3QgZW1wdHkNCgkJCQkJCWVkLndpbmRvd01hbmFnZXIuY29uZmlybSgNCgkJCQkJCQlQTFVHSU5fTkFNRSArICIud2FybmluZ19tZXNzYWdlIiwNCgkJCQkJCQlmdW5jdGlvbihvaykgew0KCQkJCQkJCQlpZiAob2spDQoJCQkJCQkJCQlzZWxmLnJlc3RvcmVEcmFmdCgpOw0KCQkJCQkJCX0NCgkJCQkJCSk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJc2VsZi5yZXN0b3JlRHJhZnQoKTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJLy8gRW5hYmxlL2Rpc2FibGUgcmVzdG9yZWRyYWZ0IGJ1dHRvbiBkZXBlbmRpbmcgb24gaWYgdGhlcmUgaXMgYSBkcmFmdCBzdG9yZWQgb3Igbm90DQoJCQllZC5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCXZhciBjb250cm9sTWFuYWdlciA9IGVkLmNvbnRyb2xNYW5hZ2VyOw0KDQoJCQkJaWYgKGNvbnRyb2xNYW5hZ2VyLmdldChSRVNUT1JFX0RSQUZUKSkNCgkJCQkJY29udHJvbE1hbmFnZXIuc2V0RGlzYWJsZWQoUkVTVE9SRV9EUkFGVCwgIXNlbGYuaGFzRHJhZnQoKSk7DQoJCQl9KTsNCg0KCQkJZWQub25Jbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCQkvLyBDaGVjayBpZiB0aGUgdXNlciBhZGRlZCB0aGUgcmVzdG9yZSBidXR0b24sIHRoZW4gc2V0dXAgYXV0byBzdG9yYWdlIGxvZ2ljDQoJCQkJaWYgKGVkLmNvbnRyb2xNYW5hZ2VyLmdldChSRVNUT1JFX0RSQUZUKSkgew0KCQkJCQkvLyBTZXR1cCBzdG9yYWdlIGVuZ2luZQ0KCQkJCQlzZWxmLnNldHVwU3RvcmFnZShlZCk7DQoNCgkJCQkJLy8gQXV0byBzYXZlIGNvbnRlbnRzIGVhY2ggaW50ZXJ2YWwgdGltZQ0KCQkJCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCgkJCQkJCXNlbGYuc3RvcmVEcmFmdCgpOw0KCQkJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCQkJfSwgc2V0dGluZ3MuYXV0b3NhdmVfaW50ZXJ2YWwpOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQkvKioNCgkJCSAqIFRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGEgZHJhZnQgaXMgc3RvcmVkIHRvIGxvY2FsIHN0b3JhZ2UuDQoJCQkgKg0KCQkJICogQGV2ZW50IG9uU3RvcmVEcmFmdA0KCQkJICogQHBhcmFtIHt0aW55bWNlLnBsdWdpbnMuQXV0b1NhdmV9IHNlbmRlciBQbHVnaW4gaW5zdGFuY2Ugc2VuZGluZyB0aGUgZXZlbnQuDQoJCQkgKiBAcGFyYW0ge09iamVjdH0gZHJhZnQgRHJhZnQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIEhUTUwgY29udGVudHMgb2YgdGhlIGVkaXRvci4NCgkJCSAqLw0KCQkJc2VsZi5vblN0b3JlRHJhZnQgPSBuZXcgRGlzcGF0Y2hlcihzZWxmKTsNCg0KCQkJLyoqDQoJCQkgKiBUaGlzIGV2ZW50IGdldHMgZmlyZWQgd2hlbiBhIGRyYWZ0IGlzIHJlc3RvcmVkIGZyb20gbG9jYWwgc3RvcmFnZS4NCgkJCSAqDQoJCQkgKiBAZXZlbnQgb25TdG9yZURyYWZ0DQoJCQkgKiBAcGFyYW0ge3RpbnltY2UucGx1Z2lucy5BdXRvU2F2ZX0gc2VuZGVyIFBsdWdpbiBpbnN0YW5jZSBzZW5kaW5nIHRoZSBldmVudC4NCgkJCSAqIEBwYXJhbSB7T2JqZWN0fSBkcmFmdCBEcmFmdCBvYmplY3QgY29udGFpbmluZyB0aGUgSFRNTCBjb250ZW50cyBvZiB0aGUgZWRpdG9yLg0KCQkJICovDQoJCQlzZWxmLm9uUmVzdG9yZURyYWZ0ID0gbmV3IERpc3BhdGNoZXIoc2VsZik7DQoNCgkJCS8qKg0KCQkJICogVGhpcyBldmVudCBnZXRzIGZpcmVkIHdoZW4gYSBkcmFmdCByZW1vdmVkL2V4cGlyZWQuDQoJCQkgKg0KCQkJICogQGV2ZW50IG9uUmVtb3ZlRHJhZnQNCgkJCSAqIEBwYXJhbSB7dGlueW1jZS5wbHVnaW5zLkF1dG9TYXZlfSBzZW5kZXIgUGx1Z2luIGluc3RhbmNlIHNlbmRpbmcgdGhlIGV2ZW50Lg0KCQkJICogQHBhcmFtIHtPYmplY3R9IGRyYWZ0IERyYWZ0IG9iamVjdCBjb250YWluaW5nIHRoZSBIVE1MIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuDQoJCQkgKi8NCgkJCXNlbGYub25SZW1vdmVEcmFmdCA9IG5ldyBEaXNwYXRjaGVyKHNlbGYpOw0KDQoJCQkvLyBBZGQgYXNrIGJlZm9yZSB1bmxvYWQgZGlhbG9nIG9ubHkgYWRkIG9uZSB1bmxvYWQgaGFuZGxlcg0KCQkJaWYgKCF1bmxvYWRIYW5kbGVyQWRkZWQpIHsNCgkJCQl3aW5kb3cub25iZWZvcmV1bmxvYWQgPSB0aW55bWNlLnBsdWdpbnMuQXV0b1NhdmUuX2JlZm9yZVVubG9hZEhhbmRsZXI7DQoJCQkJdW5sb2FkSGFuZGxlckFkZGVkID0gVFJVRTsNCgkJCX0NCgkJfSwNCg0KCQkvKioNCgkJICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGx1Z2luIGFzIGEgbmFtZS92YWx1ZSBhcnJheS4NCgkJICogVGhlIGN1cnJlbnQga2V5cyBhcmUgbG9uZ25hbWUsIGF1dGhvciwgYXV0aG9ydXJsLCBpbmZvdXJsIGFuZCB2ZXJzaW9uLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGdldEluZm8NCgkJICogQHJldHVybiB7T2JqZWN0fSBOYW1lL3ZhbHVlIGFycmF5IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBsdWdpbi4NCgkJICovDQoJCWdldEluZm8gOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB7DQoJCQkJbG9uZ25hbWUgOiAnQXV0byBzYXZlJywNCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9hdXRvc2F2ZScsDQoJCQkJdmVyc2lvbiA6IHRpbnltY2UubWFqb3JWZXJzaW9uICsgIi4iICsgdGlueW1jZS5taW5vclZlcnNpb24NCgkJCX07DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJldHVybnMgYW4gZXhwaXJhdGlvbiBkYXRlIFVUQyBzdHJpbmcuDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0RXhwRGF0ZQ0KCQkgKiBAcmV0dXJuIHtTdHJpbmd9IEV4cGlyYXRpb24gZGF0ZSBVVEMgc3RyaW5nLg0KCQkgKi8NCgkJZ2V0RXhwRGF0ZSA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIG5ldyBEYXRlKA0KCQkJCW5ldyBEYXRlKCkuZ2V0VGltZSgpICsgdGhpcy5lZGl0b3Iuc2V0dGluZ3MuYXV0b3NhdmVfcmV0ZW50aW9uDQoJCQkpLnRvVVRDU3RyaW5nKCk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFRoaXMgbWV0aG9kIHdpbGwgc2V0dXAgdGhlIHN0b3JhZ2UgZW5naW5lLiBJZiB0aGUgYnJvd3NlciBoYXMgc3VwcG9ydCBmb3IgaXQuDQoJCSAqDQoJCSAqIEBtZXRob2Qgc2V0dXBTdG9yYWdlDQoJCSAqLw0KCQlzZXR1cFN0b3JhZ2UgOiBmdW5jdGlvbihlZCkgew0KCQkJdmFyIHNlbGYgPSB0aGlzLCB0ZXN0S2V5ID0gUExVR0lOX05BTUUgKyAnX3Rlc3QnLCB0ZXN0VmFsID0gIk9LIjsNCg0KCQkJc2VsZi5rZXkgPSBQTFVHSU5fTkFNRSArIGVkLmlkOw0KDQoJCQkvLyBMb29wIHRob3VnaCBlYWNoIHN0b3JhZ2UgZW5naW5lIHR5cGUgdW50aWwgd2UgZmluZCBvbmUgdGhhdCB3b3Jrcw0KCQkJdGlueW1jZS5lYWNoKFsNCgkJCQlmdW5jdGlvbigpIHsNCgkJCQkJLy8gVHJ5IEhUTUw1IExvY2FsIFN0b3JhZ2UNCgkJCQkJaWYgKGxvY2FsU3RvcmFnZSkgew0KCQkJCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdEtleSwgdGVzdFZhbCk7DQoNCgkJCQkJCWlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0ZXN0S2V5KSA9PT0gdGVzdFZhbCkgew0KCQkJCQkJCWxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3RLZXkpOw0KDQoJCQkJCQkJcmV0dXJuIGxvY2FsU3RvcmFnZTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0sDQoNCgkJCQlmdW5jdGlvbigpIHsNCgkJCQkJLy8gVHJ5IEhUTUw1IFNlc3Npb24gU3RvcmFnZQ0KCQkJCQlpZiAoc2Vzc2lvblN0b3JhZ2UpIHsNCgkJCQkJCXNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGVzdEtleSwgdGVzdFZhbCk7DQoNCgkJCQkJCWlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRlc3RLZXkpID09PSB0ZXN0VmFsKSB7DQoJCQkJCQkJc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0S2V5KTsNCg0KCQkJCQkJCXJldHVybiBzZXNzaW9uU3RvcmFnZTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0sDQoNCgkJCQlmdW5jdGlvbigpIHsNCgkJCQkJLy8gVHJ5IElFIHVzZXJEYXRhDQoJCQkJCWlmICh0aW55bWNlLmlzSUUpIHsNCgkJCQkJCWVkLmdldEVsZW1lbnQoKS5zdHlsZS5iZWhhdmlvciA9ICJ1cmwoJyNkZWZhdWx0I3VzZXJEYXRhJykiOw0KDQoJCQkJCQkvLyBGYWtlIGxvY2FsU3RvcmFnZSBvbiBvbGQgSUUNCgkJCQkJCXJldHVybiB7DQoJCQkJCQkJYXV0b0V4cGlyZXMgOiBUUlVFLA0KDQoJCQkJCQkJc2V0SXRlbSA6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsNCgkJCQkJCQkJdmFyIHVzZXJEYXRhRWxlbWVudCA9IGVkLmdldEVsZW1lbnQoKTsNCg0KCQkJCQkJCQl1c2VyRGF0YUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpOw0KCQkJCQkJCQl1c2VyRGF0YUVsZW1lbnQuZXhwaXJlcyA9IHNlbGYuZ2V0RXhwRGF0ZSgpOw0KCQkJCQkJCQl1c2VyRGF0YUVsZW1lbnQuc2F2ZSgiVGlueU1DRSIpOw0KCQkJCQkJCX0sDQoNCgkJCQkJCQlnZXRJdGVtIDogZnVuY3Rpb24oa2V5KSB7DQoJCQkJCQkJCXZhciB1c2VyRGF0YUVsZW1lbnQgPSBlZC5nZXRFbGVtZW50KCk7DQoNCgkJCQkJCQkJdXNlckRhdGFFbGVtZW50LmxvYWQoIlRpbnlNQ0UiKTsNCg0KCQkJCQkJCQlyZXR1cm4gdXNlckRhdGFFbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpOw0KCQkJCQkJCX0sDQoNCgkJCQkJCQlyZW1vdmVJdGVtIDogZnVuY3Rpb24oa2V5KSB7DQoJCQkJCQkJCWVkLmdldEVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTsNCgkJCQkJCQl9DQoJCQkJCQl9Ow0KCQkJCQl9DQoJCQkJfSwNCgkJCV0sIGZ1bmN0aW9uKHNldHVwKSB7DQoJCQkJLy8gVHJ5IGV4ZWN1dGluZyBlYWNoIGZ1bmN0aW9uIHRvIGZpbmQgYSBzdWl0YWJsZSBzdG9yYWdlIGVuZ2luZQ0KCQkJCXRyeSB7DQoJCQkJCXNlbGYuc3RvcmFnZSA9IHNldHVwKCk7DQoNCgkJCQkJaWYgKHNlbGYuc3RvcmFnZSkNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9IGNhdGNoIChlKSB7DQoJCQkJCS8vIElnbm9yZQ0KCQkJCX0NCgkJCX0pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBUaGlzIG1ldGhvZCB3aWxsIHN0b3JlIHRoZSBjdXJyZW50IGNvbnRlbnRzIGluIHRoZSB0aGUgc3RvcmFnZSBlbmdpbmUuDQoJCSAqDQoJCSAqIEBtZXRob2Qgc3RvcmVEcmFmdA0KCQkgKi8NCgkJc3RvcmVEcmFmdCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHNlbGYgPSB0aGlzLCBzdG9yYWdlID0gc2VsZi5zdG9yYWdlLCBlZGl0b3IgPSBzZWxmLmVkaXRvciwgZXhwaXJlcywgY29udGVudDsNCg0KCQkJLy8gSXMgdGhlIGNvbnRlbnRzIGRpcnR5DQoJCQlpZiAoc3RvcmFnZSkgew0KCQkJCS8vIElmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIGtleSBhbmQgdGhlIGNvbnRlbnRzIGhhc24ndCBiZWVuIGNoYW5nZWQgc2luY2UNCgkJCQkvLyBpdCdzIG9yaWdpbmFsIHZhbHVlIHRoZW4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gc2F2aW5nIGEgZHJhZnQNCgkJCQlpZiAoIXN0b3JhZ2UuZ2V0SXRlbShzZWxmLmtleSkgJiYgIWVkaXRvci5pc0RpcnR5KCkpDQoJCQkJCXJldHVybjsNCg0KCQkJCS8vIFN0b3JlIGNvbnRlbnRzIGlmIHRoZSBjb250ZW50cyBpZiBsb25nZXIgdGhhbiB0aGUgbWlubGVuZ3RoIG9mIGNoYXJhY3RlcnMNCgkJCQljb250ZW50ID0gZWRpdG9yLmdldENvbnRlbnQoe2RyYWZ0OiB0cnVlfSk7DQoJCQkJaWYgKGNvbnRlbnQubGVuZ3RoID4gZWRpdG9yLnNldHRpbmdzLmF1dG9zYXZlX21pbmxlbmd0aCkgew0KCQkJCQlleHBpcmVzID0gc2VsZi5nZXRFeHBEYXRlKCk7DQoNCgkJCQkJLy8gU3RvcmUgZXhwaXJhdGlvbiBkYXRlIGlmIG5lZWRlZCBJRSB1c2VyRGF0YSBoYXMgYXV0byBleHBpcmUgYnVpbHQgaW4NCgkJCQkJaWYgKCFzZWxmLnN0b3JhZ2UuYXV0b0V4cGlyZXMpDQoJCQkJCQlzZWxmLnN0b3JhZ2Uuc2V0SXRlbShzZWxmLmtleSArICJfZXhwaXJlcyIsIGV4cGlyZXMpOw0KDQoJCQkJCXNlbGYuc3RvcmFnZS5zZXRJdGVtKHNlbGYua2V5LCBjb250ZW50KTsNCgkJCQkJc2VsZi5vblN0b3JlRHJhZnQuZGlzcGF0Y2goc2VsZiwgew0KCQkJCQkJZXhwaXJlcyA6IGV4cGlyZXMsDQoJCQkJCQljb250ZW50IDogY29udGVudA0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmVzdG9yZSB0aGUgY29udGVudHMgZnJvbSB0aGUgc3RvcmFnZSBlbmdpbmUgYmFjayB0byB0aGUgZWRpdG9yLg0KCQkgKg0KCQkgKiBAbWV0aG9kIHJlc3RvcmVEcmFmdA0KCQkgKi8NCgkJcmVzdG9yZURyYWZ0IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgc2VsZiA9IHRoaXMsIHN0b3JhZ2UgPSBzZWxmLnN0b3JhZ2U7DQoNCgkJCWlmIChzdG9yYWdlKSB7DQoJCQkJY29udGVudCA9IHN0b3JhZ2UuZ2V0SXRlbShzZWxmLmtleSk7DQoNCgkJCQlpZiAoY29udGVudCkgew0KCQkJCQlzZWxmLmVkaXRvci5zZXRDb250ZW50KGNvbnRlbnQpOw0KCQkJCQlzZWxmLm9uUmVzdG9yZURyYWZ0LmRpc3BhdGNoKHNlbGYsIHsNCgkJCQkJCWNvbnRlbnQgOiBjb250ZW50DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0NCgkJfSwNCg0KCQkvKioNCgkJICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZS9mYWxzZSBpZiB0aGVyZSBpcyBhIGxvY2FsIHN0b3JhZ2UgZHJhZnQgYXZhaWxhYmxlLg0KCQkgKg0KCQkgKiBAbWV0aG9kIGhhc0RyYWZ0DQoJCSAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUvZmFsc2Ugc3RhdGUgaWYgdGhlcmUgaXMgYSBsb2NhbCBkcmFmdC4NCgkJICovDQoJCWhhc0RyYWZ0IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgc2VsZiA9IHRoaXMsIHN0b3JhZ2UgPSBzZWxmLnN0b3JhZ2UsIGV4cERhdGUsIGV4aXN0czsNCg0KCQkJaWYgKHN0b3JhZ2UpIHsNCgkJCQkvLyBEb2VzIHRoZSBpdGVtIGV4aXN0IGF0IGFsbA0KCQkJCWV4aXN0cyA9ICEhc3RvcmFnZS5nZXRJdGVtKHNlbGYua2V5KTsNCgkJCQlpZiAoZXhpc3RzKSB7DQoJCQkJCS8vIFN0b3JhZ2UgbmVlZHMgYXV0b2V4cGlyZQ0KCQkJCQlpZiAoIXNlbGYuc3RvcmFnZS5hdXRvRXhwaXJlcykgew0KCQkJCQkJZXhwRGF0ZSA9IG5ldyBEYXRlKHN0b3JhZ2UuZ2V0SXRlbShzZWxmLmtleSArICJfZXhwaXJlcyIpKTsNCg0KCQkJCQkJLy8gQ29udGVudHMgaGFzbid0IGV4cGlyZWQNCgkJCQkJCWlmIChuZXcgRGF0ZSgpLmdldFRpbWUoKSA8IGV4cERhdGUuZ2V0VGltZSgpKQ0KCQkJCQkJCXJldHVybiBUUlVFOw0KDQoJCQkJCQkvLyBSZW1vdmUgaXQgaWYgaXQgaGFzDQoJCQkJCQlzZWxmLnJlbW92ZURyYWZ0KCk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFJlbW92ZXMgdGhlIGN1cnJlbnRseSBzdG9yZWQgZHJhZnQuDQoJCSAqDQoJCSAqIEBtZXRob2QgcmVtb3ZlRHJhZnQNCgkJICovDQoJCXJlbW92ZURyYWZ0IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgc2VsZiA9IHRoaXMsIHN0b3JhZ2UgPSBzZWxmLnN0b3JhZ2UsIGtleSA9IHNlbGYua2V5LCBjb250ZW50Ow0KDQoJCQlpZiAoc3RvcmFnZSkgew0KCQkJCS8vIEdldCBjdXJyZW50IGNvbnRlbnRzIGFuZCByZW1vdmUgdGhlIGV4aXN0aW5nIGRyYWZ0DQoJCQkJY29udGVudCA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpOw0KCQkJCXN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOw0KCQkJCXN0b3JhZ2UucmVtb3ZlSXRlbShrZXkgKyAiX2V4cGlyZXMiKTsNCg0KCQkJCS8vIERpc3BhdGNoIHJlbW92ZSBldmVudCBpZiB3ZSBoYWQgYW55IGNvbnRlbnRzDQoJCQkJaWYgKGNvbnRlbnQpIHsNCgkJCQkJc2VsZi5vblJlbW92ZURyYWZ0LmRpc3BhdGNoKHNlbGYsIHsNCgkJCQkJCWNvbnRlbnQgOiBjb250ZW50DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0NCgkJfSwNCg0KCQkic3RhdGljIiA6IHsNCgkJCS8vIEludGVybmFsIHVubG9hZCBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgcGFnZSBpcyB1bmxvYWRlZA0KCQkJX2JlZm9yZVVubG9hZEhhbmRsZXIgOiBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIG1zZzsNCg0KCQkJCXRpbnltY2UuZWFjaCh0aW55TUNFLmVkaXRvcnMsIGZ1bmN0aW9uKGVkKSB7DQoJCQkJCS8vIFN0b3JlIGEgZHJhZnQgZm9yIGVhY2ggZWRpdG9yIGluc3RhbmNlDQoJCQkJCWlmIChlZC5wbHVnaW5zLmF1dG9zYXZlKQ0KCQkJCQkJZWQucGx1Z2lucy5hdXRvc2F2ZS5zdG9yZURyYWZ0KCk7DQoNCgkJCQkJLy8gTmV2ZXIgYXNrIGluIGZ1bGxzY3JlZW4gbW9kZQ0KCQkJCQlpZiAoZWQuZ2V0UGFyYW0oImZ1bGxzY3JlZW5faXNfZW5hYmxlZCIpKQ0KCQkJCQkJcmV0dXJuOw0KDQoJCQkJCS8vIFNldHVwIGEgcmV0dXJuIG1lc3NhZ2UgaWYgdGhlIGVkaXRvciBpcyBkaXJ0eQ0KCQkJCQlpZiAoIW1zZyAmJiBlZC5pc0RpcnR5KCkgJiYgZWQuZ2V0UGFyYW0oImF1dG9zYXZlX2Fza19iZWZvcmVfdW5sb2FkIikpDQoJCQkJCQltc2cgPSBlZC5nZXRMYW5nKCJhdXRvc2F2ZS51bmxvYWRfbXNnIik7DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm4gbXNnOw0KCQkJfQ0KCQl9DQoJfSk7DQoNCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCdhdXRvc2F2ZScsIHRpbnltY2UucGx1Z2lucy5BdXRvU2F2ZSk7DQp9KSh0aW55bWNlKTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/autosave/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/autosave/langs/en.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5hdXRvc2F2ZScsew0KcmVzdG9yZV9jb250ZW50OiAiUmVzdG9yZSBhdXRvLXNhdmVkIGNvbnRlbnQiLA0Kd2FybmluZ19tZXNzYWdlOiAiSWYgeW91IHJlc3RvcmUgdGhlIHNhdmVkIGNvbnRlbnQsIHlvdSB3aWxsIGxvc2UgYWxsIHRoZSBjb250ZW50IHRoYXQgaXMgY3VycmVudGx5IGluIHRoZSBlZGl0b3IuXG5cbkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZXN0b3JlIHRoZSBzYXZlZCBjb250ZW50PyINCn0pOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/bbcode/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/bbcode/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5CQkNvZGVQbHVnaW4iLHtpbml0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9dGhpcyxjPWEuZ2V0UGFyYW0oImJiY29kZV9kaWFsZWN0IiwicHVuYmIiKS50b0xvd2VyQ2FzZSgpO2Eub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihlLGYpe2YuY29udGVudD1kWyJfIitjKyJfYmJjb2RlMmh0bWwiXShmLmNvbnRlbnQpfSk7YS5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihlLGYpe2lmKGYuc2V0KXtmLmNvbnRlbnQ9ZFsiXyIrYysiX2JiY29kZTJodG1sIl0oZi5jb250ZW50KX1pZihmLmdldCl7Zi5jb250ZW50PWRbIl8iK2MrIl9odG1sMmJiY29kZSJdKGYuY29udGVudCl9fSl9LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6IkJCQ29kZSBQbHVnaW4iLGF1dGhvcjoiTW94aWVjb2RlIFN5c3RlbXMgQUIiLGF1dGhvcnVybDoiaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbSIsaW5mb3VybDoiaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL2JiY29kZSIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fSxfcHVuYmJfaHRtbDJiYmNvZGU6ZnVuY3Rpb24oYSl7YT10aW55bWNlLnRyaW0oYSk7ZnVuY3Rpb24gYihjLGQpe2E9YS5yZXBsYWNlKGMsZCl9YigvPGEuKj9ocmVmPVwiKC4qPylcIi4qPz4oLio/KTxcL2E+L2dpLCJbdXJsPSQxXSQyWy91cmxdIik7YigvPGZvbnQuKj9jb2xvcj1cIiguKj8pXCIuKj9jbGFzcz1cImNvZGVTdHlsZVwiLio/PiguKj8pPFwvZm9udD4vZ2ksIltjb2RlXVtjb2xvcj0kMV0kMlsvY29sb3JdWy9jb2RlXSIpO2IoLzxmb250Lio/Y29sb3I9XCIoLio/KVwiLio/Y2xhc3M9XCJxdW90ZVN0eWxlXCIuKj8+KC4qPyk8XC9mb250Pi9naSwiW3F1b3RlXVtjb2xvcj0kMV0kMlsvY29sb3JdWy9xdW90ZV0iKTtiKC88Zm9udC4qP2NsYXNzPVwiY29kZVN0eWxlXCIuKj9jb2xvcj1cIiguKj8pXCIuKj8+KC4qPyk8XC9mb250Pi9naSwiW2NvZGVdW2NvbG9yPSQxXSQyWy9jb2xvcl1bL2NvZGVdIik7YigvPGZvbnQuKj9jbGFzcz1cInF1b3RlU3R5bGVcIi4qP2NvbG9yPVwiKC4qPylcIi4qPz4oLio/KTxcL2ZvbnQ+L2dpLCJbcXVvdGVdW2NvbG9yPSQxXSQyWy9jb2xvcl1bL3F1b3RlXSIpO2IoLzxzcGFuIHN0eWxlPVwiY29sb3I6ID8oLio/KTtcIj4oLio/KTxcL3NwYW4+L2dpLCJbY29sb3I9JDFdJDJbL2NvbG9yXSIpO2IoLzxmb250Lio/Y29sb3I9XCIoLio/KVwiLio/PiguKj8pPFwvZm9udD4vZ2ksIltjb2xvcj0kMV0kMlsvY29sb3JdIik7YigvPHNwYW4gc3R5bGU9XCJmb250LXNpemU6KC4qPyk7XCI+KC4qPyk8XC9zcGFuPi9naSwiW3NpemU9JDFdJDJbL3NpemVdIik7YigvPGZvbnQ+KC4qPyk8XC9mb250Pi9naSwiJDEiKTtiKC88aW1nLio/c3JjPVwiKC4qPylcIi4qP1wvPi9naSwiW2ltZ10kMVsvaW1nXSIpO2IoLzxzcGFuIGNsYXNzPVwiY29kZVN0eWxlXCI+KC4qPyk8XC9zcGFuPi9naSwiW2NvZGVdJDFbL2NvZGVdIik7YigvPHNwYW4gY2xhc3M9XCJxdW90ZVN0eWxlXCI+KC4qPyk8XC9zcGFuPi9naSwiW3F1b3RlXSQxWy9xdW90ZV0iKTtiKC88c3Ryb25nIGNsYXNzPVwiY29kZVN0eWxlXCI+KC4qPyk8XC9zdHJvbmc+L2dpLCJbY29kZV1bYl0kMVsvYl1bL2NvZGVdIik7YigvPHN0cm9uZyBjbGFzcz1cInF1b3RlU3R5bGVcIj4oLio/KTxcL3N0cm9uZz4vZ2ksIltxdW90ZV1bYl0kMVsvYl1bL3F1b3RlXSIpO2IoLzxlbSBjbGFzcz1cImNvZGVTdHlsZVwiPiguKj8pPFwvZW0+L2dpLCJbY29kZV1baV0kMVsvaV1bL2NvZGVdIik7YigvPGVtIGNsYXNzPVwicXVvdGVTdHlsZVwiPiguKj8pPFwvZW0+L2dpLCJbcXVvdGVdW2ldJDFbL2ldWy9xdW90ZV0iKTtiKC88dSBjbGFzcz1cImNvZGVTdHlsZVwiPiguKj8pPFwvdT4vZ2ksIltjb2RlXVt1XSQxWy91XVsvY29kZV0iKTtiKC88dSBjbGFzcz1cInF1b3RlU3R5bGVcIj4oLio/KTxcL3U+L2dpLCJbcXVvdGVdW3VdJDFbL3VdWy9xdW90ZV0iKTtiKC88XC8oc3Ryb25nfGIpPi9naSwiWy9iXSIpO2IoLzwoc3Ryb25nfGIpPi9naSwiW2JdIik7YigvPFwvKGVtfGkpPi9naSwiWy9pXSIpO2IoLzwoZW18aSk+L2dpLCJbaV0iKTtiKC88XC91Pi9naSwiWy91XSIpO2IoLzxzcGFuIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiA/dW5kZXJsaW5lO1wiPiguKj8pPFwvc3Bhbj4vZ2ksIlt1XSQxWy91XSIpO2IoLzx1Pi9naSwiW3VdIik7YigvPGJsb2NrcXVvdGVbXj5dKj4vZ2ksIltxdW90ZV0iKTtiKC88XC9ibG9ja3F1b3RlPi9naSwiWy9xdW90ZV0iKTtiKC88YnIgXC8+L2dpLCJcbiIpO2IoLzxiclwvPi9naSwiXG4iKTtiKC88YnI+L2dpLCJcbiIpO2IoLzxwPi9naSwiIik7YigvPFwvcD4vZ2ksIlxuIik7YigvJm5ic3A7L2dpLCIgIik7YigvJnF1b3Q7L2dpLCciJyk7YigvJmx0Oy9naSwiPCIpO2IoLyZndDsvZ2ksIj4iKTtiKC8mYW1wOy9naSwiJiIpO3JldHVybiBhfSxfcHVuYmJfYmJjb2RlMmh0bWw6ZnVuY3Rpb24oYSl7YT10aW55bWNlLnRyaW0oYSk7ZnVuY3Rpb24gYihjLGQpe2E9YS5yZXBsYWNlKGMsZCl9YigvXG4vZ2ksIjxiciAvPiIpO2IoL1xbYlxdL2dpLCI8c3Ryb25nPiIpO2IoL1xbXC9iXF0vZ2ksIjwvc3Ryb25nPiIpO2IoL1xbaVxdL2dpLCI8ZW0+Iik7YigvXFtcL2lcXS9naSwiPC9lbT4iKTtiKC9cW3VcXS9naSwiPHU+Iik7YigvXFtcL3VcXS9naSwiPC91PiIpO2IoL1xbdXJsPShbXlxdXSspXF0oLio/KVxbXC91cmxcXS9naSwnPGEgaHJlZj0iJDEiPiQyPC9hPicpO2IoL1xbdXJsXF0oLio/KVxbXC91cmxcXS9naSwnPGEgaHJlZj0iJDEiPiQxPC9hPicpO2IoL1xbaW1nXF0oLio/KVxbXC9pbWdcXS9naSwnPGltZyBzcmM9IiQxIiAvPicpO2IoL1xbY29sb3I9KC4qPylcXSguKj8pXFtcL2NvbG9yXF0vZ2ksJzxmb250IGNvbG9yPSIkMSI+JDI8L2ZvbnQ+Jyk7YigvXFtjb2RlXF0oLio/KVxbXC9jb2RlXF0vZ2ksJzxzcGFuIGNsYXNzPSJjb2RlU3R5bGUiPiQxPC9zcGFuPiZuYnNwOycpO2IoL1xbcXVvdGUuKj9cXSguKj8pXFtcL3F1b3RlXF0vZ2ksJzxzcGFuIGNsYXNzPSJxdW90ZVN0eWxlIj4kMTwvc3Bhbj4mbmJzcDsnKTtyZXR1cm4gYX19KTt0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCJiYmNvZGUiLHRpbnltY2UucGx1Z2lucy5CQkNvZGVQbHVnaW4pfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/bbcode/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLkJCQ29kZVBsdWdpbicsIHsNCgkJaW5pdCA6IGZ1bmN0aW9uKGVkLCB1cmwpIHsNCgkJCXZhciB0ID0gdGhpcywgZGlhbGVjdCA9IGVkLmdldFBhcmFtKCdiYmNvZGVfZGlhbGVjdCcsICdwdW5iYicpLnRvTG93ZXJDYXNlKCk7DQoNCgkJCWVkLm9uQmVmb3JlU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQlvLmNvbnRlbnQgPSB0WydfJyArIGRpYWxlY3QgKyAnX2JiY29kZTJodG1sJ10oby5jb250ZW50KTsNCgkJCX0pOw0KDQoJCQllZC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCWlmIChvLnNldCkNCgkJCQkJby5jb250ZW50ID0gdFsnXycgKyBkaWFsZWN0ICsgJ19iYmNvZGUyaHRtbCddKG8uY29udGVudCk7DQoNCgkJCQlpZiAoby5nZXQpDQoJCQkJCW8uY29udGVudCA9IHRbJ18nICsgZGlhbGVjdCArICdfaHRtbDJiYmNvZGUnXShvLmNvbnRlbnQpOw0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdCQkNvZGUgUGx1Z2luJywNCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9iYmNvZGUnLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9LA0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KDQoJCS8vIEhUTUwgLT4gQkJDb2RlIGluIFB1bkJCIGRpYWxlY3QNCgkJX3B1bmJiX2h0bWwyYmJjb2RlIDogZnVuY3Rpb24ocykgew0KCQkJcyA9IHRpbnltY2UudHJpbShzKTsNCg0KCQkJZnVuY3Rpb24gcmVwKHJlLCBzdHIpIHsNCgkJCQlzID0gcy5yZXBsYWNlKHJlLCBzdHIpOw0KCQkJfTsNCg0KCQkJLy8gZXhhbXBsZTogPHN0cm9uZz4gdG8gW2JdDQoJCQlyZXAoLzxhLio/aHJlZj1cIiguKj8pXCIuKj8+KC4qPyk8XC9hPi9naSwiW3VybD0kMV0kMlsvdXJsXSIpOw0KCQkJcmVwKC88Zm9udC4qP2NvbG9yPVwiKC4qPylcIi4qP2NsYXNzPVwiY29kZVN0eWxlXCIuKj8+KC4qPyk8XC9mb250Pi9naSwiW2NvZGVdW2NvbG9yPSQxXSQyWy9jb2xvcl1bL2NvZGVdIik7DQoJCQlyZXAoLzxmb250Lio/Y29sb3I9XCIoLio/KVwiLio/Y2xhc3M9XCJxdW90ZVN0eWxlXCIuKj8+KC4qPyk8XC9mb250Pi9naSwiW3F1b3RlXVtjb2xvcj0kMV0kMlsvY29sb3JdWy9xdW90ZV0iKTsNCgkJCXJlcCgvPGZvbnQuKj9jbGFzcz1cImNvZGVTdHlsZVwiLio/Y29sb3I9XCIoLio/KVwiLio/PiguKj8pPFwvZm9udD4vZ2ksIltjb2RlXVtjb2xvcj0kMV0kMlsvY29sb3JdWy9jb2RlXSIpOw0KCQkJcmVwKC88Zm9udC4qP2NsYXNzPVwicXVvdGVTdHlsZVwiLio/Y29sb3I9XCIoLio/KVwiLio/PiguKj8pPFwvZm9udD4vZ2ksIltxdW90ZV1bY29sb3I9JDFdJDJbL2NvbG9yXVsvcXVvdGVdIik7DQoJCQlyZXAoLzxzcGFuIHN0eWxlPVwiY29sb3I6ID8oLio/KTtcIj4oLio/KTxcL3NwYW4+L2dpLCJbY29sb3I9JDFdJDJbL2NvbG9yXSIpOw0KCQkJcmVwKC88Zm9udC4qP2NvbG9yPVwiKC4qPylcIi4qPz4oLio/KTxcL2ZvbnQ+L2dpLCJbY29sb3I9JDFdJDJbL2NvbG9yXSIpOw0KCQkJcmVwKC88c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTooLio/KTtcIj4oLio/KTxcL3NwYW4+L2dpLCJbc2l6ZT0kMV0kMlsvc2l6ZV0iKTsNCgkJCXJlcCgvPGZvbnQ+KC4qPyk8XC9mb250Pi9naSwiJDEiKTsNCgkJCXJlcCgvPGltZy4qP3NyYz1cIiguKj8pXCIuKj9cLz4vZ2ksIltpbWddJDFbL2ltZ10iKTsNCgkJCXJlcCgvPHNwYW4gY2xhc3M9XCJjb2RlU3R5bGVcIj4oLio/KTxcL3NwYW4+L2dpLCJbY29kZV0kMVsvY29kZV0iKTsNCgkJCXJlcCgvPHNwYW4gY2xhc3M9XCJxdW90ZVN0eWxlXCI+KC4qPyk8XC9zcGFuPi9naSwiW3F1b3RlXSQxWy9xdW90ZV0iKTsNCgkJCXJlcCgvPHN0cm9uZyBjbGFzcz1cImNvZGVTdHlsZVwiPiguKj8pPFwvc3Ryb25nPi9naSwiW2NvZGVdW2JdJDFbL2JdWy9jb2RlXSIpOw0KCQkJcmVwKC88c3Ryb25nIGNsYXNzPVwicXVvdGVTdHlsZVwiPiguKj8pPFwvc3Ryb25nPi9naSwiW3F1b3RlXVtiXSQxWy9iXVsvcXVvdGVdIik7DQoJCQlyZXAoLzxlbSBjbGFzcz1cImNvZGVTdHlsZVwiPiguKj8pPFwvZW0+L2dpLCJbY29kZV1baV0kMVsvaV1bL2NvZGVdIik7DQoJCQlyZXAoLzxlbSBjbGFzcz1cInF1b3RlU3R5bGVcIj4oLio/KTxcL2VtPi9naSwiW3F1b3RlXVtpXSQxWy9pXVsvcXVvdGVdIik7DQoJCQlyZXAoLzx1IGNsYXNzPVwiY29kZVN0eWxlXCI+KC4qPyk8XC91Pi9naSwiW2NvZGVdW3VdJDFbL3VdWy9jb2RlXSIpOw0KCQkJcmVwKC88dSBjbGFzcz1cInF1b3RlU3R5bGVcIj4oLio/KTxcL3U+L2dpLCJbcXVvdGVdW3VdJDFbL3VdWy9xdW90ZV0iKTsNCgkJCXJlcCgvPFwvKHN0cm9uZ3xiKT4vZ2ksIlsvYl0iKTsNCgkJCXJlcCgvPChzdHJvbmd8Yik+L2dpLCJbYl0iKTsNCgkJCXJlcCgvPFwvKGVtfGkpPi9naSwiWy9pXSIpOw0KCQkJcmVwKC88KGVtfGkpPi9naSwiW2ldIik7DQoJCQlyZXAoLzxcL3U+L2dpLCJbL3VdIik7DQoJCQlyZXAoLzxzcGFuIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiA/dW5kZXJsaW5lO1wiPiguKj8pPFwvc3Bhbj4vZ2ksIlt1XSQxWy91XSIpOw0KCQkJcmVwKC88dT4vZ2ksIlt1XSIpOw0KCQkJcmVwKC88YmxvY2txdW90ZVtePl0qPi9naSwiW3F1b3RlXSIpOw0KCQkJcmVwKC88XC9ibG9ja3F1b3RlPi9naSwiWy9xdW90ZV0iKTsNCgkJCXJlcCgvPGJyIFwvPi9naSwiXG4iKTsNCgkJCXJlcCgvPGJyXC8+L2dpLCJcbiIpOw0KCQkJcmVwKC88YnI+L2dpLCJcbiIpOw0KCQkJcmVwKC88cD4vZ2ksIiIpOw0KCQkJcmVwKC88XC9wPi9naSwiXG4iKTsNCgkJCXJlcCgvJm5ic3A7L2dpLCIgIik7DQoJCQlyZXAoLyZxdW90Oy9naSwiXCIiKTsNCgkJCXJlcCgvJmx0Oy9naSwiPCIpOw0KCQkJcmVwKC8mZ3Q7L2dpLCI+Iik7DQoJCQlyZXAoLyZhbXA7L2dpLCImIik7DQoNCgkJCXJldHVybiBzOyANCgkJfSwNCg0KCQkvLyBCQkNvZGUgLT4gSFRNTCBmcm9tIFB1bkJCIGRpYWxlY3QNCgkJX3B1bmJiX2JiY29kZTJodG1sIDogZnVuY3Rpb24ocykgew0KCQkJcyA9IHRpbnltY2UudHJpbShzKTsNCg0KCQkJZnVuY3Rpb24gcmVwKHJlLCBzdHIpIHsNCgkJCQlzID0gcy5yZXBsYWNlKHJlLCBzdHIpOw0KCQkJfTsNCg0KCQkJLy8gZXhhbXBsZTogW2JdIHRvIDxzdHJvbmc+DQoJCQlyZXAoL1xuL2dpLCI8YnIgLz4iKTsNCgkJCXJlcCgvXFtiXF0vZ2ksIjxzdHJvbmc+Iik7DQoJCQlyZXAoL1xbXC9iXF0vZ2ksIjwvc3Ryb25nPiIpOw0KCQkJcmVwKC9cW2lcXS9naSwiPGVtPiIpOw0KCQkJcmVwKC9cW1wvaVxdL2dpLCI8L2VtPiIpOw0KCQkJcmVwKC9cW3VcXS9naSwiPHU+Iik7DQoJCQlyZXAoL1xbXC91XF0vZ2ksIjwvdT4iKTsNCgkJCXJlcCgvXFt1cmw9KFteXF1dKylcXSguKj8pXFtcL3VybFxdL2dpLCI8YSBocmVmPVwiJDFcIj4kMjwvYT4iKTsNCgkJCXJlcCgvXFt1cmxcXSguKj8pXFtcL3VybFxdL2dpLCI8YSBocmVmPVwiJDFcIj4kMTwvYT4iKTsNCgkJCXJlcCgvXFtpbWdcXSguKj8pXFtcL2ltZ1xdL2dpLCI8aW1nIHNyYz1cIiQxXCIgLz4iKTsNCgkJCXJlcCgvXFtjb2xvcj0oLio/KVxdKC4qPylcW1wvY29sb3JcXS9naSwiPGZvbnQgY29sb3I9XCIkMVwiPiQyPC9mb250PiIpOw0KCQkJcmVwKC9cW2NvZGVcXSguKj8pXFtcL2NvZGVcXS9naSwiPHNwYW4gY2xhc3M9XCJjb2RlU3R5bGVcIj4kMTwvc3Bhbj4mbmJzcDsiKTsNCgkJCXJlcCgvXFtxdW90ZS4qP1xdKC4qPylcW1wvcXVvdGVcXS9naSwiPHNwYW4gY2xhc3M9XCJxdW90ZVN0eWxlXCI+JDE8L3NwYW4+Jm5ic3A7Iik7DQoNCgkJCXJldHVybiBzOyANCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnYmJjb2RlJywgdGlueW1jZS5wbHVnaW5zLkJCQ29kZVBsdWdpbik7DQp9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/contextmenu/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/contextmenu/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dmFyIGE9dGlueW1jZS5kb20uRXZlbnQsYz10aW55bWNlLmVhY2gsYj10aW55bWNlLkRPTTt0aW55bWNlLmNyZWF0ZSgidGlueW1jZS5wbHVnaW5zLkNvbnRleHRNZW51Iix7aW5pdDpmdW5jdGlvbihkKXt2YXIgZj10aGlzLGc7Zi5lZGl0b3I9ZDtmLm9uQ29udGV4dE1lbnU9bmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpO2Qub25Db250ZXh0TWVudS5hZGQoZnVuY3Rpb24oaCxpKXtpZighaS5jdHJsS2V5KXtpZihnKXtoLnNlbGVjdGlvbi5zZXRSbmcoZyl9Zi5fZ2V0TWVudShoKS5zaG93TWVudShpLmNsaWVudFgsaS5jbGllbnRZKTthLmFkZChoLmdldERvYygpLCJjbGljayIsZnVuY3Rpb24oail7ZShoLGopfSk7YS5jYW5jZWwoaSl9fSk7ZC5vblJlbW92ZS5hZGQoZnVuY3Rpb24oKXtpZihmLl9tZW51KXtmLl9tZW51LnJlbW92ZUFsbCgpfX0pO2Z1bmN0aW9uIGUoaCxpKXtnPW51bGw7aWYoaSYmaS5idXR0b249PTIpe2c9aC5zZWxlY3Rpb24uZ2V0Um5nKCk7cmV0dXJufWlmKGYuX21lbnUpe2YuX21lbnUucmVtb3ZlQWxsKCk7Zi5fbWVudS5kZXN0cm95KCk7YS5yZW1vdmUoaC5nZXREb2MoKSwiY2xpY2siLGUpfX1kLm9uTW91c2VEb3duLmFkZChlKTtkLm9uS2V5RG93bi5hZGQoZSl9LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6IkNvbnRleHRtZW51IixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9jb250ZXh0bWVudSIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fSxfZ2V0TWVudTpmdW5jdGlvbihoKXt2YXIgbD10aGlzLGY9bC5fbWVudSxpPWguc2VsZWN0aW9uLGU9aS5pc0NvbGxhcHNlZCgpLGQ9aS5nZXROb2RlKCl8fGguZ2V0Qm9keSgpLGcsayxqO2lmKGYpe2YucmVtb3ZlQWxsKCk7Zi5kZXN0cm95KCl9az1iLmdldFBvcyhoLmdldENvbnRlbnRBcmVhQ29udGFpbmVyKCkpO2o9Yi5nZXRQb3MoaC5nZXRDb250YWluZXIoKSk7Zj1oLmNvbnRyb2xNYW5hZ2VyLmNyZWF0ZURyb3BNZW51KCJjb250ZXh0bWVudSIse29mZnNldF94OmsueCtoLmdldFBhcmFtKCJjb250ZXh0bWVudV9vZmZzZXRfeCIsMCksb2Zmc2V0X3k6ay55K2guZ2V0UGFyYW0oImNvbnRleHRtZW51X29mZnNldF95IiwwKSxjb25zdHJhaW46MX0pO2wuX21lbnU9ZjtmLmFkZCh7dGl0bGU6ImFkdmFuY2VkLmN1dF9kZXNjIixpY29uOiJjdXQiLGNtZDoiQ3V0In0pLnNldERpc2FibGVkKGUpO2YuYWRkKHt0aXRsZToiYWR2YW5jZWQuY29weV9kZXNjIixpY29uOiJjb3B5IixjbWQ6IkNvcHkifSkuc2V0RGlzYWJsZWQoZSk7Zi5hZGQoe3RpdGxlOiJhZHZhbmNlZC5wYXN0ZV9kZXNjIixpY29uOiJwYXN0ZSIsY21kOiJQYXN0ZSJ9KTtpZigoZC5ub2RlTmFtZT09IkEiJiYhaC5kb20uZ2V0QXR0cmliKGQsIm5hbWUiKSl8fCFlKXtmLmFkZFNlcGFyYXRvcigpO2YuYWRkKHt0aXRsZToiYWR2YW5jZWQubGlua19kZXNjIixpY29uOiJsaW5rIixjbWQ6aC5wbHVnaW5zLmFkdmxpbms/Im1jZUFkdkxpbmsiOiJtY2VMaW5rIix1aTp0cnVlfSk7Zi5hZGQoe3RpdGxlOiJhZHZhbmNlZC51bmxpbmtfZGVzYyIsaWNvbjoidW5saW5rIixjbWQ6IlVuTGluayJ9KX1mLmFkZFNlcGFyYXRvcigpO2YuYWRkKHt0aXRsZToiYWR2YW5jZWQuaW1hZ2VfZGVzYyIsaWNvbjoiaW1hZ2UiLGNtZDpoLnBsdWdpbnMuYWR2aW1hZ2U/Im1jZUFkdkltYWdlIjoibWNlSW1hZ2UiLHVpOnRydWV9KTtmLmFkZFNlcGFyYXRvcigpO2c9Zi5hZGRNZW51KHt0aXRsZToiY29udGV4dG1lbnUuYWxpZ24ifSk7Zy5hZGQoe3RpdGxlOiJjb250ZXh0bWVudS5sZWZ0IixpY29uOiJqdXN0aWZ5bGVmdCIsY21kOiJKdXN0aWZ5TGVmdCJ9KTtnLmFkZCh7dGl0bGU6ImNvbnRleHRtZW51LmNlbnRlciIsaWNvbjoianVzdGlmeWNlbnRlciIsY21kOiJKdXN0aWZ5Q2VudGVyIn0pO2cuYWRkKHt0aXRsZToiY29udGV4dG1lbnUucmlnaHQiLGljb246Imp1c3RpZnlyaWdodCIsY21kOiJKdXN0aWZ5UmlnaHQifSk7Zy5hZGQoe3RpdGxlOiJjb250ZXh0bWVudS5mdWxsIixpY29uOiJqdXN0aWZ5ZnVsbCIsY21kOiJKdXN0aWZ5RnVsbCJ9KTtsLm9uQ29udGV4dE1lbnUuZGlzcGF0Y2gobCxmLGQsZSk7cmV0dXJuIGZ9fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgiY29udGV4dG1lbnUiLHRpbnltY2UucGx1Z2lucy5Db250ZXh0TWVudSl9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwgZWFjaCA9IHRpbnltY2UuZWFjaCwgRE9NID0gdGlueW1jZS5ET007DQoNCgkvKioNCgkgKiBUaGlzIHBsdWdpbiBhIGNvbnRleHQgbWVudSB0byBUaW55TUNFIGVkaXRvciBpbnN0YW5jZXMuDQoJICoNCgkgKiBAY2xhc3MgdGlueW1jZS5wbHVnaW5zLkNvbnRleHRNZW51DQoJICovDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UucGx1Z2lucy5Db250ZXh0TWVudScsIHsNCgkJLyoqDQoJCSAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW4sIHRoaXMgd2lsbCBiZSBleGVjdXRlZCBhZnRlciB0aGUgcGx1Z2luIGhhcyBiZWVuIGNyZWF0ZWQuDQoJCSAqIFRoaXMgY2FsbCBpcyBkb25lIGJlZm9yZSB0aGUgZWRpdG9yIGluc3RhbmNlIGhhcyBmaW5pc2hlZCBpdCdzIGluaXRpYWxpemF0aW9uIHNvIHVzZSB0aGUgb25Jbml0IGV2ZW50DQoJCSAqIG9mIHRoZSBlZGl0b3IgaW5zdGFuY2UgdG8gaW50ZXJjZXB0IHRoYXQgZXZlbnQuDQoJCSAqDQoJCSAqIEBtZXRob2QgaW5pdA0KCQkgKiBAcGFyYW0ge3RpbnltY2UuRWRpdG9yfSBlZCBFZGl0b3IgaW5zdGFuY2UgdGhhdCB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkIGluLg0KCQkgKiBAcGFyYW0ge3N0cmluZ30gdXJsIEFic29sdXRlIFVSTCB0byB3aGVyZSB0aGUgcGx1Z2luIGlzIGxvY2F0ZWQuDQoJCSAqLw0KCQlpbml0IDogZnVuY3Rpb24oZWQpIHsNCgkJCXZhciB0ID0gdGhpcywgbGFzdFJuZzsNCg0KCQkJdC5lZGl0b3IgPSBlZDsNCg0KCQkJLyoqDQoJCQkgKiBUaGlzIGV2ZW50IGdldHMgZmlyZWQgd2hlbiB0aGUgY29udGV4dCBtZW51IGlzIHNob3duLg0KCQkJICoNCgkJCSAqIEBldmVudCBvbkNvbnRleHRNZW51DQoJCQkgKiBAcGFyYW0ge3RpbnltY2UucGx1Z2lucy5Db250ZXh0TWVudX0gc2VuZGVyIFBsdWdpbiBpbnN0YW5jZSBzZW5kaW5nIHRoZSBldmVudC4NCgkJCSAqIEBwYXJhbSB7dGlueW1jZS51aS5Ecm9wTWVudX0gbWVudSBEcm9wIGRvd24gbWVudSB0byBmaWxsIHdpdGggbW9yZSBpdGVtcyBpZiBuZWVkZWQuDQoJCQkgKi8NCgkJCXQub25Db250ZXh0TWVudSA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTsNCg0KCQkJZWQub25Db250ZXh0TWVudS5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQlpZiAoIWUuY3RybEtleSkgew0KCQkJCQkvLyBSZXN0b3JlIHRoZSBsYXN0IHNlbGVjdGlvbiBzaW5jZSBpdCB3YXMgcmVtb3ZlZA0KCQkJCQlpZiAobGFzdFJuZykNCgkJCQkJCWVkLnNlbGVjdGlvbi5zZXRSbmcobGFzdFJuZyk7DQoNCgkJCQkJdC5fZ2V0TWVudShlZCkuc2hvd01lbnUoZS5jbGllbnRYLCBlLmNsaWVudFkpOw0KCQkJCQlFdmVudC5hZGQoZWQuZ2V0RG9jKCksICdjbGljaycsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJCWhpZGUoZWQsIGUpOw0KCQkJCQl9KTsNCgkJCQkJRXZlbnQuY2FuY2VsKGUpOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQllZC5vblJlbW92ZS5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJaWYgKHQuX21lbnUpDQoJCQkJCXQuX21lbnUucmVtb3ZlQWxsKCk7DQoJCQl9KTsNCg0KCQkJZnVuY3Rpb24gaGlkZShlZCwgZSkgew0KCQkJCWxhc3RSbmcgPSBudWxsOw0KDQoJCQkJLy8gU2luY2UgdGhlIGNvbnRleHRtZW51IGV2ZW50IG1vdmVzDQoJCQkJLy8gdGhlIHNlbGVjdGlvbiB3ZSBuZWVkIHRvIHN0b3JlIGl0IGF3YXkNCgkJCQlpZiAoZSAmJiBlLmJ1dHRvbiA9PSAyKSB7DQoJCQkJCWxhc3RSbmcgPSBlZC5zZWxlY3Rpb24uZ2V0Um5nKCk7DQoJCQkJCXJldHVybjsNCgkJCQl9DQoNCgkJCQlpZiAodC5fbWVudSkgew0KCQkJCQl0Ll9tZW51LnJlbW92ZUFsbCgpOw0KCQkJCQl0Ll9tZW51LmRlc3Ryb3koKTsNCgkJCQkJRXZlbnQucmVtb3ZlKGVkLmdldERvYygpLCAnY2xpY2snLCBoaWRlKTsNCgkJCQl9DQoJCQl9Ow0KDQoJCQllZC5vbk1vdXNlRG93bi5hZGQoaGlkZSk7DQoJCQllZC5vbktleURvd24uYWRkKGhpZGUpOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbHVnaW4gYXMgYSBuYW1lL3ZhbHVlIGFycmF5Lg0KCQkgKiBUaGUgY3VycmVudCBrZXlzIGFyZSBsb25nbmFtZSwgYXV0aG9yLCBhdXRob3J1cmwsIGluZm91cmwgYW5kIHZlcnNpb24uDQoJCSAqDQoJCSAqIEBtZXRob2QgZ2V0SW5mbw0KCQkgKiBAcmV0dXJuIHtPYmplY3R9IE5hbWUvdmFsdWUgYXJyYXkgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGx1Z2luLg0KCQkgKi8NCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdDb250ZXh0bWVudScsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbScsDQoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvY29udGV4dG1lbnUnLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9LA0KDQoJCV9nZXRNZW51IDogZnVuY3Rpb24oZWQpIHsNCgkJCXZhciB0ID0gdGhpcywgbSA9IHQuX21lbnUsIHNlID0gZWQuc2VsZWN0aW9uLCBjb2wgPSBzZS5pc0NvbGxhcHNlZCgpLCBlbCA9IHNlLmdldE5vZGUoKSB8fCBlZC5nZXRCb2R5KCksIGFtLCBwMSwgcDI7DQoNCgkJCWlmIChtKSB7DQoJCQkJbS5yZW1vdmVBbGwoKTsNCgkJCQltLmRlc3Ryb3koKTsNCgkJCX0NCg0KCQkJcDEgPSBET00uZ2V0UG9zKGVkLmdldENvbnRlbnRBcmVhQ29udGFpbmVyKCkpOw0KCQkJcDIgPSBET00uZ2V0UG9zKGVkLmdldENvbnRhaW5lcigpKTsNCg0KCQkJbSA9IGVkLmNvbnRyb2xNYW5hZ2VyLmNyZWF0ZURyb3BNZW51KCdjb250ZXh0bWVudScsIHsNCgkJCQlvZmZzZXRfeCA6IHAxLnggKyBlZC5nZXRQYXJhbSgnY29udGV4dG1lbnVfb2Zmc2V0X3gnLCAwKSwNCgkJCQlvZmZzZXRfeSA6IHAxLnkgKyBlZC5nZXRQYXJhbSgnY29udGV4dG1lbnVfb2Zmc2V0X3knLCAwKSwNCgkJCQljb25zdHJhaW4gOiAxDQoJCQl9KTsNCg0KCQkJdC5fbWVudSA9IG07DQoNCgkJCW0uYWRkKHt0aXRsZSA6ICdhZHZhbmNlZC5jdXRfZGVzYycsIGljb24gOiAnY3V0JywgY21kIDogJ0N1dCd9KS5zZXREaXNhYmxlZChjb2wpOw0KCQkJbS5hZGQoe3RpdGxlIDogJ2FkdmFuY2VkLmNvcHlfZGVzYycsIGljb24gOiAnY29weScsIGNtZCA6ICdDb3B5J30pLnNldERpc2FibGVkKGNvbCk7DQoJCQltLmFkZCh7dGl0bGUgOiAnYWR2YW5jZWQucGFzdGVfZGVzYycsIGljb24gOiAncGFzdGUnLCBjbWQgOiAnUGFzdGUnfSk7DQoNCgkJCWlmICgoZWwubm9kZU5hbWUgPT0gJ0EnICYmICFlZC5kb20uZ2V0QXR0cmliKGVsLCAnbmFtZScpKSB8fCAhY29sKSB7DQoJCQkJbS5hZGRTZXBhcmF0b3IoKTsNCgkJCQltLmFkZCh7dGl0bGUgOiAnYWR2YW5jZWQubGlua19kZXNjJywgaWNvbiA6ICdsaW5rJywgY21kIDogZWQucGx1Z2lucy5hZHZsaW5rID8gJ21jZUFkdkxpbmsnIDogJ21jZUxpbmsnLCB1aSA6IHRydWV9KTsNCgkJCQltLmFkZCh7dGl0bGUgOiAnYWR2YW5jZWQudW5saW5rX2Rlc2MnLCBpY29uIDogJ3VubGluaycsIGNtZCA6ICdVbkxpbmsnfSk7DQoJCQl9DQoNCgkJCW0uYWRkU2VwYXJhdG9yKCk7DQoJCQltLmFkZCh7dGl0bGUgOiAnYWR2YW5jZWQuaW1hZ2VfZGVzYycsIGljb24gOiAnaW1hZ2UnLCBjbWQgOiBlZC5wbHVnaW5zLmFkdmltYWdlID8gJ21jZUFkdkltYWdlJyA6ICdtY2VJbWFnZScsIHVpIDogdHJ1ZX0pOw0KDQoJCQltLmFkZFNlcGFyYXRvcigpOw0KCQkJYW0gPSBtLmFkZE1lbnUoe3RpdGxlIDogJ2NvbnRleHRtZW51LmFsaWduJ30pOw0KCQkJYW0uYWRkKHt0aXRsZSA6ICdjb250ZXh0bWVudS5sZWZ0JywgaWNvbiA6ICdqdXN0aWZ5bGVmdCcsIGNtZCA6ICdKdXN0aWZ5TGVmdCd9KTsNCgkJCWFtLmFkZCh7dGl0bGUgOiAnY29udGV4dG1lbnUuY2VudGVyJywgaWNvbiA6ICdqdXN0aWZ5Y2VudGVyJywgY21kIDogJ0p1c3RpZnlDZW50ZXInfSk7DQoJCQlhbS5hZGQoe3RpdGxlIDogJ2NvbnRleHRtZW51LnJpZ2h0JywgaWNvbiA6ICdqdXN0aWZ5cmlnaHQnLCBjbWQgOiAnSnVzdGlmeVJpZ2h0J30pOw0KCQkJYW0uYWRkKHt0aXRsZSA6ICdjb250ZXh0bWVudS5mdWxsJywgaWNvbiA6ICdqdXN0aWZ5ZnVsbCcsIGNtZCA6ICdKdXN0aWZ5RnVsbCd9KTsNCg0KCQkJdC5vbkNvbnRleHRNZW51LmRpc3BhdGNoKHQsIG0sIGVsLCBjb2wpOw0KDQoJCQlyZXR1cm4gbTsNCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnY29udGV4dG1lbnUnLCB0aW55bWNlLnBsdWdpbnMuQ29udGV4dE1lbnUpOw0KfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/directionality/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/directionality/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5EaXJlY3Rpb25hbGl0eSIse2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO2MuZWRpdG9yPWE7YS5hZGRDb21tYW5kKCJtY2VEaXJlY3Rpb25MVFIiLGZ1bmN0aW9uKCl7dmFyIGQ9YS5kb20uZ2V0UGFyZW50KGEuc2VsZWN0aW9uLmdldE5vZGUoKSxhLmRvbS5pc0Jsb2NrKTtpZihkKXtpZihhLmRvbS5nZXRBdHRyaWIoZCwiZGlyIikhPSJsdHIiKXthLmRvbS5zZXRBdHRyaWIoZCwiZGlyIiwibHRyIil9ZWxzZXthLmRvbS5zZXRBdHRyaWIoZCwiZGlyIiwiIil9fWEubm9kZUNoYW5nZWQoKX0pO2EuYWRkQ29tbWFuZCgibWNlRGlyZWN0aW9uUlRMIixmdW5jdGlvbigpe3ZhciBkPWEuZG9tLmdldFBhcmVudChhLnNlbGVjdGlvbi5nZXROb2RlKCksYS5kb20uaXNCbG9jayk7aWYoZCl7aWYoYS5kb20uZ2V0QXR0cmliKGQsImRpciIpIT0icnRsIil7YS5kb20uc2V0QXR0cmliKGQsImRpciIsInJ0bCIpfWVsc2V7YS5kb20uc2V0QXR0cmliKGQsImRpciIsIiIpfX1hLm5vZGVDaGFuZ2VkKCl9KTthLmFkZEJ1dHRvbigibHRyIix7dGl0bGU6ImRpcmVjdGlvbmFsaXR5Lmx0cl9kZXNjIixjbWQ6Im1jZURpcmVjdGlvbkxUUiJ9KTthLmFkZEJ1dHRvbigicnRsIix7dGl0bGU6ImRpcmVjdGlvbmFsaXR5LnJ0bF9kZXNjIixjbWQ6Im1jZURpcmVjdGlvblJUTCJ9KTthLm9uTm9kZUNoYW5nZS5hZGQoYy5fbm9kZUNoYW5nZSxjKX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiRGlyZWN0aW9uYWxpdHkiLGF1dGhvcjoiTW94aWVjb2RlIFN5c3RlbXMgQUIiLGF1dGhvcnVybDoiaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbSIsaW5mb3VybDoiaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL2RpcmVjdGlvbmFsaXR5Iix2ZXJzaW9uOnRpbnltY2UubWFqb3JWZXJzaW9uKyIuIit0aW55bWNlLm1pbm9yVmVyc2lvbn19LF9ub2RlQ2hhbmdlOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZD1iLmRvbSxjO2U9ZC5nZXRQYXJlbnQoZSxkLmlzQmxvY2spO2lmKCFlKXthLnNldERpc2FibGVkKCJsdHIiLDEpO2Euc2V0RGlzYWJsZWQoInJ0bCIsMSk7cmV0dXJufWM9ZC5nZXRBdHRyaWIoZSwiZGlyIik7YS5zZXRBY3RpdmUoImx0ciIsYz09Imx0ciIpO2Euc2V0RGlzYWJsZWQoImx0ciIsMCk7YS5zZXRBY3RpdmUoInJ0bCIsYz09InJ0bCIpO2Euc2V0RGlzYWJsZWQoInJ0bCIsMCl9fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgiZGlyZWN0aW9uYWxpdHkiLHRpbnltY2UucGx1Z2lucy5EaXJlY3Rpb25hbGl0eSl9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/directionality/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLkRpcmVjdGlvbmFsaXR5Jywgew0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmVkaXRvciA9IGVkOw0KDQoJCQllZC5hZGRDb21tYW5kKCdtY2VEaXJlY3Rpb25MVFInLCBmdW5jdGlvbigpIHsNCgkJCQl2YXIgZSA9IGVkLmRvbS5nZXRQYXJlbnQoZWQuc2VsZWN0aW9uLmdldE5vZGUoKSwgZWQuZG9tLmlzQmxvY2spOw0KDQoJCQkJaWYgKGUpIHsNCgkJCQkJaWYgKGVkLmRvbS5nZXRBdHRyaWIoZSwgImRpciIpICE9ICJsdHIiKQ0KCQkJCQkJZWQuZG9tLnNldEF0dHJpYihlLCAiZGlyIiwgImx0ciIpOw0KCQkJCQllbHNlDQoJCQkJCQllZC5kb20uc2V0QXR0cmliKGUsICJkaXIiLCAiIik7DQoJCQkJfQ0KDQoJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCX0pOw0KDQoJCQllZC5hZGRDb21tYW5kKCdtY2VEaXJlY3Rpb25SVEwnLCBmdW5jdGlvbigpIHsNCgkJCQl2YXIgZSA9IGVkLmRvbS5nZXRQYXJlbnQoZWQuc2VsZWN0aW9uLmdldE5vZGUoKSwgZWQuZG9tLmlzQmxvY2spOw0KDQoJCQkJaWYgKGUpIHsNCgkJCQkJaWYgKGVkLmRvbS5nZXRBdHRyaWIoZSwgImRpciIpICE9ICJydGwiKQ0KCQkJCQkJZWQuZG9tLnNldEF0dHJpYihlLCAiZGlyIiwgInJ0bCIpOw0KCQkJCQllbHNlDQoJCQkJCQllZC5kb20uc2V0QXR0cmliKGUsICJkaXIiLCAiIik7DQoJCQkJfQ0KDQoJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCX0pOw0KDQoJCQllZC5hZGRCdXR0b24oJ2x0cicsIHt0aXRsZSA6ICdkaXJlY3Rpb25hbGl0eS5sdHJfZGVzYycsIGNtZCA6ICdtY2VEaXJlY3Rpb25MVFInfSk7DQoJCQllZC5hZGRCdXR0b24oJ3J0bCcsIHt0aXRsZSA6ICdkaXJlY3Rpb25hbGl0eS5ydGxfZGVzYycsIGNtZCA6ICdtY2VEaXJlY3Rpb25SVEwnfSk7DQoNCgkJCWVkLm9uTm9kZUNoYW5nZS5hZGQodC5fbm9kZUNoYW5nZSwgdCk7DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdEaXJlY3Rpb25hbGl0eScsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbScsDQoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvZGlyZWN0aW9uYWxpdHknLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9LA0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KDQoJCV9ub2RlQ2hhbmdlIDogZnVuY3Rpb24oZWQsIGNtLCBuKSB7DQoJCQl2YXIgZG9tID0gZWQuZG9tLCBkaXI7DQoNCgkJCW4gPSBkb20uZ2V0UGFyZW50KG4sIGRvbS5pc0Jsb2NrKTsNCgkJCWlmICghbikgew0KCQkJCWNtLnNldERpc2FibGVkKCdsdHInLCAxKTsNCgkJCQljbS5zZXREaXNhYmxlZCgncnRsJywgMSk7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQlkaXIgPSBkb20uZ2V0QXR0cmliKG4sICdkaXInKTsNCgkJCWNtLnNldEFjdGl2ZSgnbHRyJywgZGlyID09ICJsdHIiKTsNCgkJCWNtLnNldERpc2FibGVkKCdsdHInLCAwKTsNCgkJCWNtLnNldEFjdGl2ZSgncnRsJywgZGlyID09ICJydGwiKTsNCgkJCWNtLnNldERpc2FibGVkKCdydGwnLCAwKTsNCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnZGlyZWN0aW9uYWxpdHknLCB0aW55bWNlLnBsdWdpbnMuRGlyZWN0aW9uYWxpdHkpOw0KfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGEpe2EuY3JlYXRlKCJ0aW55bWNlLnBsdWdpbnMuRW1vdGlvbnNQbHVnaW4iLHtpbml0OmZ1bmN0aW9uKGIsYyl7Yi5hZGRDb21tYW5kKCJtY2VFbW90aW9uIixmdW5jdGlvbigpe2Iud2luZG93TWFuYWdlci5vcGVuKHtmaWxlOmMrIi9lbW90aW9ucy5odG0iLHdpZHRoOjI1MCtwYXJzZUludChiLmdldExhbmcoImVtb3Rpb25zLmRlbHRhX3dpZHRoIiwwKSksaGVpZ2h0OjE2MCtwYXJzZUludChiLmdldExhbmcoImVtb3Rpb25zLmRlbHRhX2hlaWdodCIsMCkpLGlubGluZToxfSx7cGx1Z2luX3VybDpjfSl9KTtiLmFkZEJ1dHRvbigiZW1vdGlvbnMiLHt0aXRsZToiZW1vdGlvbnMuZW1vdGlvbnNfZGVzYyIsY21kOiJtY2VFbW90aW9uIn0pfSxnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJFbW90aW9ucyIsYXV0aG9yOiJNb3hpZWNvZGUgU3lzdGVtcyBBQiIsYXV0aG9ydXJsOiJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tIixpbmZvdXJsOiJodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvZW1vdGlvbnMiLHZlcnNpb246YS5tYWpvclZlcnNpb24rIi4iK2EubWlub3JWZXJzaW9ufX19KTthLlBsdWdpbk1hbmFnZXIuYWRkKCJlbW90aW9ucyIsYS5wbHVnaW5zLkVtb3Rpb25zUGx1Z2luKX0pKHRpbnltY2UpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UucGx1Z2lucy5FbW90aW9uc1BsdWdpbicsIHsNCgkJaW5pdCA6IGZ1bmN0aW9uKGVkLCB1cmwpIHsNCgkJCS8vIFJlZ2lzdGVyIGNvbW1hbmRzDQoJCQllZC5hZGRDb21tYW5kKCdtY2VFbW90aW9uJywgZnVuY3Rpb24oKSB7DQoJCQkJZWQud2luZG93TWFuYWdlci5vcGVuKHsNCgkJCQkJZmlsZSA6IHVybCArICcvZW1vdGlvbnMuaHRtJywNCgkJCQkJd2lkdGggOiAyNTAgKyBwYXJzZUludChlZC5nZXRMYW5nKCdlbW90aW9ucy5kZWx0YV93aWR0aCcsIDApKSwNCgkJCQkJaGVpZ2h0IDogMTYwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygnZW1vdGlvbnMuZGVsdGFfaGVpZ2h0JywgMCkpLA0KCQkJCQlpbmxpbmUgOiAxDQoJCQkJfSwgew0KCQkJCQlwbHVnaW5fdXJsIDogdXJsDQoJCQkJfSk7DQoJCQl9KTsNCg0KCQkJLy8gUmVnaXN0ZXIgYnV0dG9ucw0KCQkJZWQuYWRkQnV0dG9uKCdlbW90aW9ucycsIHt0aXRsZSA6ICdlbW90aW9ucy5lbW90aW9uc19kZXNjJywgY21kIDogJ21jZUVtb3Rpb24nfSk7DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdFbW90aW9ucycsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbScsDQoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvZW1vdGlvbnMnLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9DQoJfSk7DQoNCgkvLyBSZWdpc3RlciBwbHVnaW4NCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCdlbW90aW9ucycsIHRpbnltY2UucGx1Z2lucy5FbW90aW9uc1BsdWdpbik7DQp9KSh0aW55bWNlKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/emotions.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjZW1vdGlvbnNfZGxnLnRpdGxlfTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9lbW90aW9ucy5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHkgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgoJPGRpdiBhbGlnbj0iY2VudGVyIj4KCQk8ZGl2IGNsYXNzPSJ0aXRsZSI+eyNlbW90aW9uc19kbGcudGl0bGV9OjxiciAvPjxiciAvPjwvZGl2PgoKCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgoJCSAgPHRyPgoJCQk8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpFbW90aW9uc0RpYWxvZy5pbnNlcnQoJ3NtaWxleS1jb29sLmdpZicsJ2Vtb3Rpb25zX2RsZy5jb29sJyk7Ij48aW1nIHNyYz0iaW1nL3NtaWxleS1jb29sLmdpZiIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiIGFsdD0ieyNlbW90aW9uc19kbGcuY29vbH0iIHRpdGxlPSJ7I2Vtb3Rpb25zX2RsZy5jb29sfSIgLz48L2E+PC90ZD4KCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6RW1vdGlvbnNEaWFsb2cuaW5zZXJ0KCdzbWlsZXktY3J5LmdpZicsJ2Vtb3Rpb25zX2RsZy5jcnknKTsiPjxpbWcgc3JjPSJpbWcvc21pbGV5LWNyeS5naWYiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIiBhbHQ9InsjZW1vdGlvbnNfZGxnLmNyeX0iIHRpdGxlPSJ7I2Vtb3Rpb25zX2RsZy5jcnl9IiAvPjwvYT48L3RkPgoJCQk8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpFbW90aW9uc0RpYWxvZy5pbnNlcnQoJ3NtaWxleS1lbWJhcmFzc2VkLmdpZicsJ2Vtb3Rpb25zX2RsZy5lbWJhcmFzc2VkJyk7Ij48aW1nIHNyYz0iaW1nL3NtaWxleS1lbWJhcmFzc2VkLmdpZiIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiIGFsdD0ieyNlbW90aW9uc19kbGcuZW1iYXJhc3NlZH0iIHRpdGxlPSJ7I2Vtb3Rpb25zX2RsZy5lbWJhcmFzc2VkfSIgLz48L2E+PC90ZD4KCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6RW1vdGlvbnNEaWFsb2cuaW5zZXJ0KCdzbWlsZXktZm9vdC1pbi1tb3V0aC5naWYnLCdlbW90aW9uc19kbGcuZm9vdF9pbl9tb3V0aCcpOyI+PGltZyBzcmM9ImltZy9zbWlsZXktZm9vdC1pbi1tb3V0aC5naWYiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIiBhbHQ9InsjZW1vdGlvbnNfZGxnLmZvb3RfaW5fbW91dGh9IiB0aXRsZT0ieyNlbW90aW9uc19kbGcuZm9vdF9pbl9tb3V0aH0iIC8+PC9hPjwvdGQ+CgkJICA8L3RyPgoJCSAgPHRyPgoJCQk8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpFbW90aW9uc0RpYWxvZy5pbnNlcnQoJ3NtaWxleS1mcm93bi5naWYnLCdlbW90aW9uc19kbGcuZnJvd24nKTsiPjxpbWcgc3JjPSJpbWcvc21pbGV5LWZyb3duLmdpZiIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiIGFsdD0ieyNlbW90aW9uc19kbGcuZnJvd259IiB0aXRsZT0ieyNlbW90aW9uc19kbGcuZnJvd259IiAvPjwvYT48L3RkPgoJCQk8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpFbW90aW9uc0RpYWxvZy5pbnNlcnQoJ3NtaWxleS1pbm5vY2VudC5naWYnLCdlbW90aW9uc19kbGcuaW5ub2NlbnQnKTsiPjxpbWcgc3JjPSJpbWcvc21pbGV5LWlubm9jZW50LmdpZiIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiIGFsdD0ieyNlbW90aW9uc19kbGcuaW5ub2NlbnR9IiB0aXRsZT0ieyNlbW90aW9uc19kbGcuaW5ub2NlbnR9IiAvPjwvYT48L3RkPgoJCQk8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpFbW90aW9uc0RpYWxvZy5pbnNlcnQoJ3NtaWxleS1raXNzLmdpZicsJ2Vtb3Rpb25zX2RsZy5raXNzJyk7Ij48aW1nIHNyYz0iaW1nL3NtaWxleS1raXNzLmdpZiIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiIGFsdD0ieyNlbW90aW9uc19kbGcua2lzc30iIHRpdGxlPSJ7I2Vtb3Rpb25zX2RsZy5raXNzfSIgLz48L2E+PC90ZD4KCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6RW1vdGlvbnNEaWFsb2cuaW5zZXJ0KCdzbWlsZXktbGF1Z2hpbmcuZ2lmJywnZW1vdGlvbnNfZGxnLmxhdWdoaW5nJyk7Ij48aW1nIHNyYz0iaW1nL3NtaWxleS1sYXVnaGluZy5naWYiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIiBhbHQ9InsjZW1vdGlvbnNfZGxnLmxhdWdoaW5nfSIgdGl0bGU9InsjZW1vdGlvbnNfZGxnLmxhdWdoaW5nfSIgLz48L2E+PC90ZD4KCQkgIDwvdHI+CgkJICA8dHI+CgkJCTx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OkVtb3Rpb25zRGlhbG9nLmluc2VydCgnc21pbGV5LW1vbmV5LW1vdXRoLmdpZicsJ2Vtb3Rpb25zX2RsZy5tb25leV9tb3V0aCcpOyI+PGltZyBzcmM9ImltZy9zbWlsZXktbW9uZXktbW91dGguZ2lmIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCIgYWx0PSJ7I2Vtb3Rpb25zX2RsZy5tb25leV9tb3V0aH0iIHRpdGxlPSJ7I2Vtb3Rpb25zX2RsZy5tb25leV9tb3V0aH0iIC8+PC9hPjwvdGQ+CgkJCTx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OkVtb3Rpb25zRGlhbG9nLmluc2VydCgnc21pbGV5LXNlYWxlZC5naWYnLCdlbW90aW9uc19kbGcuc2VhbGVkJyk7Ij48aW1nIHNyYz0iaW1nL3NtaWxleS1zZWFsZWQuZ2lmIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCIgYWx0PSJ7I2Vtb3Rpb25zX2RsZy5zZWFsZWR9IiB0aXRsZT0ieyNlbW90aW9uc19kbGcuc2VhbGVkfSIgLz48L2E+PC90ZD4KCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6RW1vdGlvbnNEaWFsb2cuaW5zZXJ0KCdzbWlsZXktc21pbGUuZ2lmJywnZW1vdGlvbnNfZGxnLnNtaWxlJyk7Ij48aW1nIHNyYz0iaW1nL3NtaWxleS1zbWlsZS5naWYiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIiBhbHQ9InsjZW1vdGlvbnNfZGxnLnNtaWxlfSIgdGl0bGU9InsjZW1vdGlvbnNfZGxnLnNtaWxlfSIgLz48L2E+PC90ZD4KCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6RW1vdGlvbnNEaWFsb2cuaW5zZXJ0KCdzbWlsZXktc3VycHJpc2VkLmdpZicsJ2Vtb3Rpb25zX2RsZy5zdXJwcmlzZWQnKTsiPjxpbWcgc3JjPSJpbWcvc21pbGV5LXN1cnByaXNlZC5naWYiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIiBhbHQ9InsjZW1vdGlvbnNfZGxnLnN1cnByaXNlZH0iIHRpdGxlPSJ7I2Vtb3Rpb25zX2RsZy5zdXJwcmlzZWR9IiAvPjwvYT48L3RkPgoJCSAgPC90cj4KCQkgIDx0cj4KCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6RW1vdGlvbnNEaWFsb2cuaW5zZXJ0KCdzbWlsZXktdG9uZ3VlLW91dC5naWYnLCdlbW90aW9uc19kbGcudG9uZ3VlX291dCcpOyI+PGltZyBzcmM9ImltZy9zbWlsZXktdG9uZ3VlLW91dC5naWYiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIiBhbHQ9InsjZW1vdGlvbnNfZGxnLnRvbmd1ZS1vdXR9IiB0aXRsZT0ieyNlbW90aW9uc19kbGcudG9uZ3VlX291dH0iIC8+PC9hPjwvdGQ+CgkJCTx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OkVtb3Rpb25zRGlhbG9nLmluc2VydCgnc21pbGV5LXVuZGVjaWRlZC5naWYnLCdlbW90aW9uc19kbGcudW5kZWNpZGVkJyk7Ij48aW1nIHNyYz0iaW1nL3NtaWxleS11bmRlY2lkZWQuZ2lmIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCIgYWx0PSJ7I2Vtb3Rpb25zX2RsZy51bmRlY2lkZWR9IiB0aXRsZT0ieyNlbW90aW9uc19kbGcudW5kZWNpZGVkfSIgLz48L2E+PC90ZD4KCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6RW1vdGlvbnNEaWFsb2cuaW5zZXJ0KCdzbWlsZXktd2luay5naWYnLCdlbW90aW9uc19kbGcud2luaycpOyI+PGltZyBzcmM9ImltZy9zbWlsZXktd2luay5naWYiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIiBhbHQ9InsjZW1vdGlvbnNfZGxnLndpbmt9IiB0aXRsZT0ieyNlbW90aW9uc19kbGcud2lua30iIC8+PC9hPjwvdGQ+CgkJCTx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OkVtb3Rpb25zRGlhbG9nLmluc2VydCgnc21pbGV5LXllbGwuZ2lmJywnZW1vdGlvbnNfZGxnLnllbGwnKTsiPjxpbWcgc3JjPSJpbWcvc21pbGV5LXllbGwuZ2lmIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCIgYWx0PSJ7I2Vtb3Rpb25zX2RsZy55ZWxsfSIgdGl0bGU9InsjZW1vdGlvbnNfZGxnLnllbGx9IiAvPjwvYT48L3RkPgoJCSAgPC90cj4KCQk8L3RhYmxlPgoJPC9kaXY+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-cool.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQVAAsJBZF6DszMy+HJE4aGhFxWFNzSPLOYFe7u7b6pTjo4FvXYFL64ntG/I1tbV+vpWSMhGt7TMb+mLC8vLN3b1fr6+vzoICYKAsm/YvjuQfz5X3pgCqSMC8GoFhcVDQAAACH5BAEAAB8ALAAAAAASABIAAAXf4CeKVWmWY0pSycFxR0JVKokd0aNpT3RgtBRC0tlljpldR4IYVVoYQ6RxnBpuCRoBAlAUFABAoeDpfj0eAgFAcEzeEwWYQXg7AA4BZALxQPoSEX59ex4UFBsecn0BCwMcaHIeBQgUHD0NAwMLjpoDHQMPBwgIBw8Wj5yqCxybGR2kCREZCwEbm44bjRkRCQgVDEUWCxsXxhcbCxYaHQwlCAkNGhYWHQEBHdQaDb40FQISDQ8Z1NQZDw0SAkEfCAIJHbNGER0JAk0pFRQMCURLCQxm1PhQoZKAgwIo/EoRAgA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-cry.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQYAC4TAi6K8rOWC76rUNzQMsGrIbKzk/bxT6W60f7pI9rmct7i57CXIc+7H/rxOPjcFXJYCsrCnp3D86Gxe9jWtbjGsFI+Cox2Efb29sq2auLugsba8sbGxlqi8v36agAAACH5BAEAAB8ALAAAAAASABIAAAXG4CeKWGmWY0pSAyMIzEBhKpkJxOF5ByFktBSGUdgRHA7CrsAIfjCDBq9wQRIdnsaAhqEIPI4r0sHECmZQZXK9PnoI2+HhgLxYkJaqY97EfJENAAAFBYICDw8HAiUCGhsUEwgZiBUVExQbCosYBQESiKChDxIBBSUDEw6iog4TcREdEgmIEIIQiAkSHRElCwENBwkXAg0NFxcJBw0BC1wIBcAOCdMJew0FCEGkEgMFOTs9BQPbI80LBt2E4gbmNb0c8BzNTh8hADs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-embarassed.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQSACoOAsS8naqRFfrTG8CpTPzRVNS/KP7mILmbEfykQfnuVMKrIdra2frvOv35bOLCOnZbF493G/b29lg4D8bGxuHTN5ZkJKx8KPu/Kv7ZPeDYurybJP6OV8KwYv62UQAAACH5BAEAAB8ALAAAAAASABIAAAXI4CeKUmmWY0pqxCYIG6FJKtkhj+I4yoN0tJRks+BVGo2KbrEJfiSEYmMRQQoWDceCQJNoEI4GDIlcCLKIGVSZjECQ7qOiwpUgFIpMBjJBTiZ6eE12DgUeHhcWBwMRFgkJGAoIJQiGHByQAwMYCZcJBZNDlpgYmpyeBYMEDwWPpZqbjwUPdQELeRgCEwAAExcYGQoLASUMBAYKB8rLygoGBAxdDAvIDcwNzgvRIxIMHQtKO3MLHdtCDAFRC+sEAeYqxRTyFNFOHyEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQQACYKAsbGxpZ+D/bZEsq2avrsILicDe/v7sCsTVI6Cfj2WtG9HtzQMW1UC7qiK/nzSPr6+uDYuvz6b8S8neHbT5uKJ8KqF9fX1v76NtPEMDoiAqeKCuvdNrmbHPvuNwAAACH5BAEAAB8ALAAAAAASABIAAAXV4CeKUGmWY0pGSLdtHRJBKkkYGSVJVGYQtNTBYVEgKhxOBaGwOA4jCGIhqTg4nqyjIlkgaJCIQfLgZDLZM+chMcykDAUG00jM63MF43voKB5zCXYYgnMPCh0HB2NzdA0FAw0NA5QKBoqMGJCUnJwPl30KHp0DBg0GGgkDD4kHCAyjGwIbDQAApg0eewcQE0ULtsEaAgkLTRMlrsaCGxoAAhYCD168HxAXDsaaCwsCDRQLDhdBHwcXCBYMh38ZFggXUCnXEwhETggT4zXW5gH+AfDIfQgBADs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-frown.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQRAEEnBcbGxqCCCPPVD93PMsq2ar+qTu/v7vPxWM69IvzvN2hUErebDb+jLf79cfzlGVpBCvr6+uDYuvryR8SrFcS8ndfX1v75N/76Wu7aIrmbHPjdFPnpJXhgENLCMAAAACH5BAEAAB8ALAAAAAASABIAAAXR4CeKUWmWY0pKhiYImiFFKlkwHuI4iMcUtNShQUFgJgrFBIOgNA6jiCHhmHg8yevEkTDQIhJGVbGAJMtKB2MmJWAuFwgALodjCN6DBjGBdxZ+gBcTCBoHB2JwFwoZHBsDkBsbGAyHiReOkJqRE5V6CAqSFHIAEBSSDxOGBwYEoQylHR1yDBsKeAcRFRQYGQIbD8EPGwIZGBQVJawJCBzCwhwIXbkfERYNzJjBHBfSDRZBHwcWBhQES0cEFAYWUCnWFQZETgYV4DXV4wH7Ae3hHyEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-innocent.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQSADgqCNzLrejNEqlxBsuxjc7OWsGTVe/t7LOPDvnbE7+lFsrCoP32OHdpFdmrGvPvVNHR0cy1IPr6+v39cb+oTt7GKmFLCop6GvznHbqQML+jLf76Vtq+Qt/WMrJ1IgAAACH5BAEAAB8ALAAAAAASABIAAAXN4CeKUmmW43gQhudlSIxkBhEcYkssFFI9k8mjgqC0DAeDIaBRPDYPBuP5UGgOAc8nMOgqHJWwmIMYZAKSAKIQaTvecAdngJZQOhvGBdDodBp8HQ8dFBIHTlIWFg2Ji1JVBwcIE1J9GBgJFgICCQkbCpEKlAxtnAlfpp+hUZ2trgkYkAd3DK0IigitDIQHEgsKG5gJAoqmGJ8LJbMVwZfOlxsVFL0fEhAaEVHPUxEaEBIqEBQKghtQHQoUEDgp1jxNVhQL3ykjhhD4+dQjIQA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-kiss.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQUAFI9C8bGxu40NIZzHPPwWcq2auinE7WUCt7SMu/v7pQhEL+qTtLAKvfaE/7uKa2ZIrsfGMJtFv79ccCmF/r6+uDYuvnuPtI5KdqaHsS8nf76OdfX1r2lKfvmHP76WQAAACH5BAEAAB8ALAAAAAASABIAAAXP4CeKVGmWY0pWy3Mcz1JRKlkcCCFJBHIUtFSCMyF4EBYLwkOYcBIjyoIhGVis16uEsaBRKgeJ5sF5JMkPjeQwky45AwBAo5EPOMduokivzzVxfU0JCWF9Gg4dDYuMHgeEhogNBouUjY97BA6VCi8Klh0WE4QLSA0RChCqEAoRDUoLCRQZEx4dHREQAgIXEbceExklCVMemxgXFxgNDh5csh8UGxwMBIi3DhoEDBwbQR8JGwsTSB4eShMLG1Ap0hkLRE4LGd410eEB+QHr3x8hADs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-laughing.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQTAFI9Da6qpuPQHKOGBqGVjPXnLO/v7r+qTnJeSPPwWdK+H8OrGsjHxWpTEsS8nfbYEPryR+DYurebE/r6+v79cf32N4h1WtjV07qfLsq2at7SMnljE9XDMcKmMv77WgAAACH5BAEAAB8ALAAAAAASABIAAAXV4CeKU2mWY0pGhzQM0hFNKplJXEJRCSdltJQBs0h4IEiIJ7HAGEaTg4IC4XAqFSuEojjQJhEJtdIAYMuVrWQW1XiwAHMljvVovAZJAoLdNPp/aQkSBnkUWBUFig8CAg+PHoSGBRyOj5cPCwIQknoLCBahoqEIGJyFBxpkBAwBFxcBDAR/dwYTDgseAg0XDCUMFw0KHgsOJQZSuhsEr7MCHl22HxMXHQoJFQsbAwsVCQodF0EfBhcHCxpKRxoLBxdPKdQOBx0LCx0HDuI10+UM/8CkjQgBADs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQUACkYBr62mpiMHMKoIsKsUffaE25YNvn0UoS1auPYMdra2T5eKrSXCvz6bvz0ObKbJEozB4lzE8rCoK6iVvb29k13OVpGPjJCGrHlmZqGNtG+JtnTv3J4JJJ+FcLCwgAAACH5BAEAAB8ALAAAAAASABIAAAW+4CeKVGmWY0puxMMwD7FRKkkw2tE0h8YQtBTlMeAdHI6DbvAIfigEDe+BRD50GuBzw2g4IgAIEixuMGbQxCEBiCQcbHcyARwqkQLA25FXH5oUXUgQbQUFhBGGBwwlgniGhh2QiyUDBwQZGpCbRAcDJQRvBhakpaQGcHUSlg8AFQgVrxUAAp4SJQpRHAsLsK8LFRdZCjQUCgMXvBgICBgLFwIDxCPGE7sY2M4DBNNCCgG84QsB3Sq4HugexE4fIQA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-sealed.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQTAFI9C764n/bdFKePCYiIiOLavredE+DaUr2qSfrqHvDw7823GbKyspaKSsq2aufbNZiGILenKPb0XPn5+WxVDczMzM7OTuTk5MO7P/33Ovz6b62VIt7WtsCqF9XGLwAAACH5BAEAAB8ALAAAAAASABIAAAXC4CeKU2mWY0oWyDYMG1JMKukY3qFph2c4tJQi0pFgII8HBCPpRBSjCWKh2UQemWwEolkgaBOOQZN5eDzZM1Zj4JQQD0mWApjXM5LHV2GQZwF3gFl4Bgp8ZHMUCQIUFAKPEoWHDxEGL5eXC5GGfREnnxMGGZJwngSGqAoEE1cIChMBThOpqawdASUXCBAXBBW/wAQXEAgXYBW8F8rLyxAVQR8KDA0QERgWFhhbDQxQKRMXAQhETggBxjUfsxfAFRevKSEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-smile.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQQACYKAsbGxpZ6DOrPEcq2at7SMr+qTu/v7vPwWdC9HlI9DbSYDPzwNmhUEsSrGfvmHvr6+uDYuv79cfryR8S8nbqeLtfX1tXDMf75N7mbHMKmMv77WvjaEnlgDqqKAgAAACH5BAEAAB8ALAAAAAASABIAAAXW4CeKUGmWY0pGRuZ5mRFBKkksFyJJyLUQtNSh4kBsJgzGZINwVA4jiCEhmVwuyetEkjDQIJFFldFQJMtKyWImLWwwGIUCLodvCt5DBjGBdxp+gBgTCBkHB2JwGAwPDxwDAxySGwuHiYySmZKRE5V6CAwDHpqSHgMPE4YHBgUMHAIdCZIJHQIcDHgHEBQOG40dAMEAHY0bDhQlqwm+Dw4CAg7FXbofEBYaCQiLjQwYCAkaFkEfBxYGDgVLRwUOBhZQKdYUBhoODhoGFOI11eUB/wHejfsQAgA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-surprised.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQQACgMAsbGxp2MKOrND/zrI8q2ar+qTu/v7lI7CfPxWtDAJt3PMqqKAr6lLGtTDMKnF/r6+uDYuv73N/z6b/nbE+7gN8S8ndfX1vnzRj4iAraaEeDaUv77WPvkGsS4RAAAACH5BAEAAB8ALAAAAAASABIAAAXT4CeKUGmWY0pGhsYwmhFBKlloyzZN26IVtNSh8Uh4BJWKwJN4NA4jiEExETQqEkmlIZgoDDRIRDPBVBaKLLqCmWhm0gUn60DQ7RLOAnzQJDBZCHiCWRgJGgd9E1kSDg4EHY4UkxyIilkEA5qbkxQYlkUSnQ8AABqdHRgPiQYLopMIpQidEnsHEBYPHJAdGaUAHR0EHA8WJQdTu5Gywhxftx8QFw0KCRIKGRlpCQoNF0EfBxcGDwsYHBwYCw8GF1Ap0hYGRE4GFt810eIB/AHu4B9CAAA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQUACYKAsbGxpd9C/faEqcYGcq2avzrI7+qTu/v7tK+Hfn1WFI9DfIaGrOWCt7SMr+jLtY6Om5YEfvyRv79cfr6+uDYur6iGVoHArYvJ8S8nf31N9fX1tXDMfXgIvpSVAAAACH5BAEAAB8ALAAAAAASABIAAAXF4CeKVGmWY0pWh9U01lFRKlk0nDJNCtcUtBTiYVEoJEiJ0fJAjCiHxETC4Wg0VckkcaBRKo2pJrK4kjXaxgzqUFwXZQ38qnB0EUWJObK/Ki0ICGFXVx0GA4iJCg2BgxqHiZEDEox4bpKSHRKACAcOGgICCZEJoRp2CBQZRR0RAK8XsREdChYZJZ0JCgalGBAQGAYKXKkfFBsPuo8EDAwEww8bQR8IGy0OEgQeHgQxG04pxxkHDxgEBBgZ0jXG1QHvAd/THyEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-undecided.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQRACoWAsbGxop5G/fYEMq2av3sJb+qTu/v7qeJB/PwWda6DmRODN7SMrebDb+jLfryR/79cfr6+uDYukIvB8OqFvvvOcS8nfvjGdfX1v76WVZDDP75N3ZiEbmbHM6/JAAAACH5BAEAAB8ALAAAAAASABIAAAXO4CeKUWmWY0pKRocgnSFFKkk0TAJBCdMQtNTBQUlkHpXKI5OgOA6jiMEDQSavD4jHQItIGlXBRJAUC7KNmZSR2WgWnI1bE88wuIdO4rHhVOR9fxsPCR0HB2ByHh4FBRcUCgMXFxkNh4kbBQObnJwPlnkJmp0IEwsNkg+GBwYMFZOPEwB0CBcVdwcRFhQZjg0cFLAXBRkUFiWsHr3Ck8RbuR8RGA4eCZnNGwkeDhhBHwcYBhQMS0cMFAYYUCnSFgZETgYW3TXR4AH4AereHyEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-wink.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQSACgNAsbGxp1/CerPEd7RMsq2ar+qTvPwWe/v7sezHlA6DPzwLLSYDL6kLHVcDvryR/zmHf79cfr6+uDYusGoGMS8nf78Nta+EtfX1u7mMv76WfjaEraaHNHCKf3xOgAAACH5BAEAAB8ALAAAAAASABIAAAXc4CeKUmmWY0pOBicInDFJKlkwxBFFB8EUtBSiQTloHh7PQ3OgNBAjiSERQSY9nc4jkjDQJBNGpEHwZDoeh0IZYcykBE1HAQAkLAqFxaIheBEcBw8WGQkZew4Oew8HHAgIYnt7CxAbAwMbmRoMj5GUmaCZmA+cgAcLAwyhmQwDEA+OCAZlGwIOF5kXDgIbHn4IEhUUGhAQDnV1DsUaFBUlsh0alAkvCRALcgbAHxIYDR0HHpTXHgcdDRhBHwgYBhQES0cEFAYYUCndFQZETgYV6TW4sQtAMIA9dR9CAAA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/img/smiley-yell.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASANQSADIWAsnGxX9lFvTVGZaGe62ICb+qTvn2We7u7dG/KFI0Cv3wNO2rE8q2ar6eK97SM82OD/TAEPr6+m5UPODYuvrbOYdzSv79cfnwSMS8nbWZEdfX1tWqKmxMDMKnFwAAACH5BAEAAB8ALAAAAAASABIAAAXN4CeKUmmWY0pShlYUmkFJKtloz3Fdx6M1tBTC4TkcMJUKxuhxIEYSQ+KCTFoxl4SBJqFosgmrNTHVzKK5haDDSXI6gkVvi9AcFxUFwOEAKCoLSxoIdRcLCXAcDAwQHR0eAweDhQsLAxGMEIsREQMYk0WWAxoTFgQTBZ2eHoQGD5YJBAGEAQSQCw8GCBIZoRoAwMEFch4ZJQhSBwPBwTlaux8SGw4JPaYEFs4OG0EfCBsGHg9LRw8eBhtPKdIZBkRNBhncNdHfAfcB6d0fIQA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/js/emotions.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgRW1vdGlvbnNEaWFsb2cgPSB7DQoJaW5pdCA6IGZ1bmN0aW9uKGVkKSB7DQoJCXRpbnlNQ0VQb3B1cC5yZXNpemVUb0lubmVyU2l6ZSgpOw0KCX0sDQoNCglpbnNlcnQgOiBmdW5jdGlvbihmaWxlLCB0aXRsZSkgew0KCQl2YXIgZWQgPSB0aW55TUNFUG9wdXAuZWRpdG9yLCBkb20gPSBlZC5kb207DQoNCgkJdGlueU1DRVBvcHVwLmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDb250ZW50JywgZmFsc2UsIGRvbS5jcmVhdGVIVE1MKCdpbWcnLCB7DQoJCQlzcmMgOiB0aW55TUNFUG9wdXAuZ2V0V2luZG93QXJnKCdwbHVnaW5fdXJsJykgKyAnL2ltZy8nICsgZmlsZSwNCgkJCWFsdCA6IGVkLmdldExhbmcodGl0bGUpLA0KCQkJdGl0bGUgOiBlZC5nZXRMYW5nKHRpdGxlKSwNCgkJCWJvcmRlciA6IDANCgkJfSkpOw0KDQoJCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KCX0NCn07DQoNCnRpbnlNQ0VQb3B1cC5vbkluaXQuYWRkKEVtb3Rpb25zRGlhbG9nLmluaXQsIEVtb3Rpb25zRGlhbG9nKTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/emotions/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5lbW90aW9uc19kbGcnLHsNCnRpdGxlOiJJbnNlcnQgZW1vdGlvbiIsDQpkZXNjOiJFbW90aW9ucyIsDQpjb29sOiJDb29sIiwNCmNyeToiQ3J5IiwNCmVtYmFyYXNzZWQ6IkVtYmFyYXNzZWQiLA0KZm9vdF9pbl9tb3V0aDoiRm9vdCBpbiBtb3V0aCIsDQpmcm93bjoiRnJvd24iLA0KaW5ub2NlbnQ6Iklubm9jZW50IiwNCmtpc3M6Iktpc3MiLA0KbGF1Z2hpbmc6IkxhdWdoaW5nIiwNCm1vbmV5X21vdXRoOiJNb25leSBtb3V0aCIsDQpzZWFsZWQ6IlNlYWxlZCIsDQpzbWlsZToiU21pbGUiLA0Kc3VycHJpc2VkOiJTdXJwcmlzZWQiLA0KdG9uZ3VlX291dDoiVG9uZ3VlIG91dCIsDQp1bmRlY2lkZWQ6IlVuZGVjaWRlZCIsDQp3aW5rOiJXaW5rIiwNCnllbGw6IlllbGwiDQp9KTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/example/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/example/dialog.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjZXhhbXBsZV9kbGcudGl0bGV9PC90aXRsZT4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3RpbnlfbWNlX3BvcHVwLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2RpYWxvZy5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+Cgo8Zm9ybSBvbnN1Ym1pdD0iRXhhbXBsZURpYWxvZy5pbnNlcnQoKTtyZXR1cm4gZmFsc2U7IiBhY3Rpb249IiMiPgoJPHA+SGVyZSBpcyBhIGV4YW1wbGUgZGlhbG9nLjwvcD4KCTxwPlNlbGVjdGVkIHRleHQ6IDxpbnB1dCBpZD0ic29tZXZhbCIgbmFtZT0ic29tZXZhbCIgdHlwZT0idGV4dCIgY2xhc3M9InRleHQiIC8+PC9wPgoJPHA+Q3VzdG9tIGFyZzogPGlucHV0IGlkPSJzb21lYXJnIiBuYW1lPSJzb21lYXJnIiB0eXBlPSJ0ZXh0IiBjbGFzcz0idGV4dCIgLz48L3A+CgoJPGRpdiBjbGFzcz0ibWNlQWN0aW9uUGFuZWwiPgoJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJpbnNlcnQiIG5hbWU9Imluc2VydCIgdmFsdWU9InsjaW5zZXJ0fSIgb25jbGljaz0iRXhhbXBsZURpYWxvZy5pbnNlcnQoKTsiIC8+CgkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNhbmNlbCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0ieyNjYW5jZWx9IiBvbmNsaWNrPSJ0aW55TUNFUG9wdXAuY2xvc2UoKTsiIC8+Cgk8L2Rpdj4KPC9mb3JtPgoKPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/example/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLnJlcXVpcmVMYW5nUGFjaygiZXhhbXBsZSIpO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnBsdWdpbnMuRXhhbXBsZVBsdWdpbiIse2luaXQ6ZnVuY3Rpb24oYSxiKXthLmFkZENvbW1hbmQoIm1jZUV4YW1wbGUiLGZ1bmN0aW9uKCl7YS53aW5kb3dNYW5hZ2VyLm9wZW4oe2ZpbGU6YisiL2RpYWxvZy5odG0iLHdpZHRoOjMyMCtwYXJzZUludChhLmdldExhbmcoImV4YW1wbGUuZGVsdGFfd2lkdGgiLDApKSxoZWlnaHQ6MTIwK3BhcnNlSW50KGEuZ2V0TGFuZygiZXhhbXBsZS5kZWx0YV9oZWlnaHQiLDApKSxpbmxpbmU6MX0se3BsdWdpbl91cmw6Yixzb21lX2N1c3RvbV9hcmc6ImN1c3RvbSBhcmcifSl9KTthLmFkZEJ1dHRvbigiZXhhbXBsZSIse3RpdGxlOiJleGFtcGxlLmRlc2MiLGNtZDoibWNlRXhhbXBsZSIsaW1hZ2U6YisiL2ltZy9leGFtcGxlLmdpZiJ9KTthLm9uTm9kZUNoYW5nZS5hZGQoZnVuY3Rpb24oZCxjLGUpe2Muc2V0QWN0aXZlKCJleGFtcGxlIixlLm5vZGVOYW1lPT0iSU1HIil9KX0sY3JlYXRlQ29udHJvbDpmdW5jdGlvbihiLGEpe3JldHVybiBudWxsfSxnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJFeGFtcGxlIHBsdWdpbiIsYXV0aG9yOiJTb21lIGF1dGhvciIsYXV0aG9ydXJsOiJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tIixpbmZvdXJsOiJodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvZXhhbXBsZSIsdmVyc2lvbjoiMS4wIn19fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgiZXhhbXBsZSIsdGlueW1jZS5wbHVnaW5zLkV4YW1wbGVQbHVnaW4pfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/example/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgkvLyBMb2FkIHBsdWdpbiBzcGVjaWZpYyBsYW5ndWFnZSBwYWNrDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLnJlcXVpcmVMYW5nUGFjaygnZXhhbXBsZScpOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UucGx1Z2lucy5FeGFtcGxlUGx1Z2luJywgew0KCQkvKioNCgkJICogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbiwgdGhpcyB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBwbHVnaW4gaGFzIGJlZW4gY3JlYXRlZC4NCgkJICogVGhpcyBjYWxsIGlzIGRvbmUgYmVmb3JlIHRoZSBlZGl0b3IgaW5zdGFuY2UgaGFzIGZpbmlzaGVkIGl0J3MgaW5pdGlhbGl6YXRpb24gc28gdXNlIHRoZSBvbkluaXQgZXZlbnQNCgkJICogb2YgdGhlIGVkaXRvciBpbnN0YW5jZSB0byBpbnRlcmNlcHQgdGhhdCBldmVudC4NCgkJICoNCgkJICogQHBhcmFtIHt0aW55bWNlLkVkaXRvcn0gZWQgRWRpdG9yIGluc3RhbmNlIHRoYXQgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZCBpbi4NCgkJICogQHBhcmFtIHtzdHJpbmd9IHVybCBBYnNvbHV0ZSBVUkwgdG8gd2hlcmUgdGhlIHBsdWdpbiBpcyBsb2NhdGVkLg0KCQkgKi8NCgkJaW5pdCA6IGZ1bmN0aW9uKGVkLCB1cmwpIHsNCgkJCS8vIFJlZ2lzdGVyIHRoZSBjb21tYW5kIHNvIHRoYXQgaXQgY2FuIGJlIGludm9rZWQgYnkgdXNpbmcgdGlueU1DRS5hY3RpdmVFZGl0b3IuZXhlY0NvbW1hbmQoJ21jZUV4YW1wbGUnKTsNCgkJCWVkLmFkZENvbW1hbmQoJ21jZUV4YW1wbGUnLCBmdW5jdGlvbigpIHsNCgkJCQllZC53aW5kb3dNYW5hZ2VyLm9wZW4oew0KCQkJCQlmaWxlIDogdXJsICsgJy9kaWFsb2cuaHRtJywNCgkJCQkJd2lkdGggOiAzMjAgKyBwYXJzZUludChlZC5nZXRMYW5nKCdleGFtcGxlLmRlbHRhX3dpZHRoJywgMCkpLA0KCQkJCQloZWlnaHQgOiAxMjAgKyBwYXJzZUludChlZC5nZXRMYW5nKCdleGFtcGxlLmRlbHRhX2hlaWdodCcsIDApKSwNCgkJCQkJaW5saW5lIDogMQ0KCQkJCX0sIHsNCgkJCQkJcGx1Z2luX3VybCA6IHVybCwgLy8gUGx1Z2luIGFic29sdXRlIFVSTA0KCQkJCQlzb21lX2N1c3RvbV9hcmcgOiAnY3VzdG9tIGFyZycgLy8gQ3VzdG9tIGFyZ3VtZW50DQoJCQkJfSk7DQoJCQl9KTsNCg0KCQkJLy8gUmVnaXN0ZXIgZXhhbXBsZSBidXR0b24NCgkJCWVkLmFkZEJ1dHRvbignZXhhbXBsZScsIHsNCgkJCQl0aXRsZSA6ICdleGFtcGxlLmRlc2MnLA0KCQkJCWNtZCA6ICdtY2VFeGFtcGxlJywNCgkJCQlpbWFnZSA6IHVybCArICcvaW1nL2V4YW1wbGUuZ2lmJw0KCQkJfSk7DQoNCgkJCS8vIEFkZCBhIG5vZGUgY2hhbmdlIGhhbmRsZXIsIHNlbGVjdHMgdGhlIGJ1dHRvbiBpbiB0aGUgVUkgd2hlbiBhIGltYWdlIGlzIHNlbGVjdGVkDQoJCQllZC5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKGVkLCBjbSwgbikgew0KCQkJCWNtLnNldEFjdGl2ZSgnZXhhbXBsZScsIG4ubm9kZU5hbWUgPT0gJ0lNRycpOw0KCQkJfSk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIENyZWF0ZXMgY29udHJvbCBpbnN0YW5jZXMgYmFzZWQgaW4gdGhlIGluY29tbWluZyBuYW1lLiBUaGlzIG1ldGhvZCBpcyBub3JtYWxseSBub3QNCgkJICogbmVlZGVkIHNpbmNlIHRoZSBhZGRCdXR0b24gbWV0aG9kIG9mIHRoZSB0aW55bWNlLkVkaXRvciBjbGFzcyBpcyBhIG1vcmUgZWFzeSB3YXkgb2YgYWRkaW5nIGJ1dHRvbnMNCgkJICogYnV0IHlvdSBzb21ldGltZXMgbmVlZCB0byBjcmVhdGUgbW9yZSBjb21wbGV4IGNvbnRyb2xzIGxpa2UgbGlzdGJveGVzLCBzcGxpdCBidXR0b25zIGV0YyB0aGVuIHRoaXMNCgkJICogbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSB0aG9zZS4NCgkJICoNCgkJICogQHBhcmFtIHtTdHJpbmd9IG4gTmFtZSBvZiB0aGUgY29udHJvbCB0byBjcmVhdGUuDQoJCSAqIEBwYXJhbSB7dGlueW1jZS5Db250cm9sTWFuYWdlcn0gY20gQ29udHJvbCBtYW5hZ2VyIHRvIHVzZSBpbm9yZGVyIHRvIGNyZWF0ZSBuZXcgY29udHJvbC4NCgkJICogQHJldHVybiB7dGlueW1jZS51aS5Db250cm9sfSBOZXcgY29udHJvbCBpbnN0YW5jZSBvciBudWxsIGlmIG5vIGNvbnRyb2wgd2FzIGNyZWF0ZWQuDQoJCSAqLw0KCQljcmVhdGVDb250cm9sIDogZnVuY3Rpb24obiwgY20pIHsNCgkJCXJldHVybiBudWxsOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbHVnaW4gYXMgYSBuYW1lL3ZhbHVlIGFycmF5Lg0KCQkgKiBUaGUgY3VycmVudCBrZXlzIGFyZSBsb25nbmFtZSwgYXV0aG9yLCBhdXRob3J1cmwsIGluZm91cmwgYW5kIHZlcnNpb24uDQoJCSAqDQoJCSAqIEByZXR1cm4ge09iamVjdH0gTmFtZS92YWx1ZSBhcnJheSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbHVnaW4uDQoJCSAqLw0KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gew0KCQkJCWxvbmduYW1lIDogJ0V4YW1wbGUgcGx1Z2luJywNCgkJCQlhdXRob3IgOiAnU29tZSBhdXRob3InLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9leGFtcGxlJywNCgkJCQl2ZXJzaW9uIDogIjEuMCINCgkJCX07DQoJCX0NCgl9KTsNCg0KCS8vIFJlZ2lzdGVyIHBsdWdpbg0KCXRpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoJ2V4YW1wbGUnLCB0aW55bWNlLnBsdWdpbnMuRXhhbXBsZVBsdWdpbik7DQp9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/example/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/example/img/example.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFAAUAJABAAAAAAEBASH5BAEAAAEALAAAAAAUABQAAAIuhI+pwe3fDJxP0mvvzLqCvn0eAnGOGYml6lEo8wbxzJ41KN9grPGY3vG5FERiAQA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/example/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/example/js/dialog.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgRXhhbXBsZURpYWxvZyA9IHsNCglpbml0IDogZnVuY3Rpb24oKSB7DQoJCXZhciBmID0gZG9jdW1lbnQuZm9ybXNbMF07DQoNCgkJLy8gR2V0IHRoZSBzZWxlY3RlZCBjb250ZW50cyBhcyB0ZXh0IGFuZCBwbGFjZSBpdCBpbiB0aGUgaW5wdXQNCgkJZi5zb21ldmFsLnZhbHVlID0gdGlueU1DRVBvcHVwLmVkaXRvci5zZWxlY3Rpb24uZ2V0Q29udGVudCh7Zm9ybWF0IDogJ3RleHQnfSk7DQoJCWYuc29tZWFyZy52YWx1ZSA9IHRpbnlNQ0VQb3B1cC5nZXRXaW5kb3dBcmcoJ3NvbWVfY3VzdG9tX2FyZycpOw0KCX0sDQoNCglpbnNlcnQgOiBmdW5jdGlvbigpIHsNCgkJLy8gSW5zZXJ0IHRoZSBjb250ZW50cyBmcm9tIHRoZSBpbnB1dCBpbnRvIHRoZSBkb2N1bWVudA0KCQl0aW55TUNFUG9wdXAuZWRpdG9yLmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDb250ZW50JywgZmFsc2UsIGRvY3VtZW50LmZvcm1zWzBdLnNvbWV2YWwudmFsdWUpOw0KCQl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCgl9DQp9Ow0KDQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChFeGFtcGxlRGlhbG9nLmluaXQsIEV4YW1wbGVEaWFsb2cpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/example/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/example/langs/en.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5leGFtcGxlJyx7DQoJZGVzYyA6ICdUaGlzIGlzIGp1c3QgYSB0ZW1wbGF0ZSBidXR0b24nDQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/example/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5leGFtcGxlX2RsZycsew0KCXRpdGxlIDogJ1RoaXMgaXMganVzdCBhIGV4YW1wbGUgdGl0bGUnDQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullpage/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullpage/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullpage/css/fullpage.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogSGlkZSB0aGUgYWR2YW5jZWQgdGFiICovCiNhZHZhbmNlZF90YWIgewoJZGlzcGxheTogbm9uZTsKfQoKI21ldGF0aXRsZSwgI21ldGFrZXl3b3JkcywgI21ldGFkZXNjcmlwdGlvbiwgI21ldGFhdXRob3IsICNtZXRhY29weXJpZ2h0IHsKCXdpZHRoOiAyODBweDsKfQoKI2RvY3R5cGUsICNkb2NlbmNvZGluZyB7Cgl3aWR0aDogMjAwcHg7Cn0KCiNsYW5nY29kZSB7Cgl3aWR0aDogMzBweDsKfQoKI2JnaW1hZ2UgewoJd2lkdGg6IDIyMHB4OwkKfQoKI2ZvbnRmYWNlIHsKCXdpZHRoOiAyNDBweDsKfQoKI2xlZnRtYXJnaW4sICNyaWdodG1hcmdpbiwgI3RvcG1hcmdpbiwgI2JvdHRvbW1hcmdpbiB7Cgl3aWR0aDogNTBweDsKfQoKLnBhbmVsX3dyYXBwZXIgZGl2LmN1cnJlbnQgewoJaGVpZ2h0OiA0MDBweDsKfQoKI3N0eWxlc2hlZXQsICNzdHlsZSB7Cgl3aWR0aDogMjQwcHg7Cn0KCi8qIEhlYWQgbGlzdCBjbGFzc2VzICovCgouaGVhZGxpc3R3cmFwcGVyIHsKCXdpZHRoOiAxMDAlOwp9CgouYWRkYnV0dG9uLCAucmVtb3ZlYnV0dG9uLCAubW92ZXVwYnV0dG9uLCAubW92ZWRvd25idXR0b24gewoJYm9yZGVyLXRvcDogMXB4IHNvbGlkOwoJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDsKCWJvcmRlci1ib3R0b206IDFweCBzb2xpZDsKCWJvcmRlci1yaWdodDogMXB4IHNvbGlkOwoJYm9yZGVyLWNvbG9yOiAjRjBGMEVFOwoJY3Vyc29yOiBkZWZhdWx0OwoJZGlzcGxheTogYmxvY2s7Cgl3aWR0aDogMjBweDsKCWhlaWdodDogMjBweDsKfQoKI2RvY3R5cGVzIHsKCXdpZHRoOiAyMDBweDsKfQoKLmFkZGJ1dHRvbjpob3ZlciwgLnJlbW92ZWJ1dHRvbjpob3ZlciwgLm1vdmV1cGJ1dHRvbjpob3ZlciwgLm1vdmVkb3duYnV0dG9uOmhvdmVyIHsKCWJvcmRlcjogMXB4IHNvbGlkICMwQTI0NkE7CgliYWNrZ3JvdW5kLWNvbG9yOiAjQjZCREQyOwp9CgouYWRkYnV0dG9uIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vaW1hZ2VzL2FkZC5naWYnKTsKCWZsb2F0OiBsZWZ0OwoJbWFyZ2luLXJpZ2h0OiAzcHg7Cn0KCi5yZW1vdmVidXR0b24gewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi9pbWFnZXMvcmVtb3ZlLmdpZicpOwoJZmxvYXQ6IGxlZnQ7Cn0KCi5tb3ZldXBidXR0b24gewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi9pbWFnZXMvbW92ZV91cC5naWYnKTsKCWZsb2F0OiBsZWZ0OwoJbWFyZ2luLXJpZ2h0OiAzcHg7Cn0KCi5tb3ZlZG93bmJ1dHRvbiB7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL2ltYWdlcy9tb3ZlX2Rvd24uZ2lmJyk7CglmbG9hdDogbGVmdDsKfQoKLnNlbGVjdGVkIHsKCWJvcmRlcjogMXB4IHNvbGlkICMwQTI0NkE7CgliYWNrZ3JvdW5kLWNvbG9yOiAjQjZCREQyOwp9CgoudG9vbGJhciB7Cgl3aWR0aDogMTAwJTsKfQoKI2hlYWRsaXN0IHsKCXdpZHRoOiAxMDAlOwoJbWFyZ2luLXRvcDogM3B4OwoJZm9udC1zaXplOiAxMXB4Owp9CgojaW5mbywgI3RpdGxlX2VsZW1lbnQsICNtZXRhX2VsZW1lbnQsICNzY3JpcHRfZWxlbWVudCwgI3N0eWxlX2VsZW1lbnQsICNiYXNlX2VsZW1lbnQsICNsaW5rX2VsZW1lbnQsICNjb21tZW50X2VsZW1lbnQsICN1bmtub3duX2VsZW1lbnQgewoJZGlzcGxheTogbm9uZTsKfQoKI2FkZG1lbnUgewoJcG9zaXRpb246IGFic29sdXRlOwoJYm9yZGVyOiAxcHggc29saWQgZ3JheTsKCWRpc3BsYXk6IG5vbmU7Cgl6LWluZGV4OiAxMDA7CgliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKfQoKI2FkZG1lbnUgYSB7CglkaXNwbGF5OiBibG9jazsKCXdpZHRoOiAxMDAlOwoJbGluZS1oZWlnaHQ6IDIwcHg7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKfQoKI2FkZG1lbnUgYTpob3ZlciB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjQjZCREQyOwoJY29sb3I6IGJsYWNrOwp9CgojYWRkbWVudSBzcGFuIHsKCXBhZGRpbmctbGVmdDogMTBweDsKCXBhZGRpbmctcmlnaHQ6IDEwcHg7Cn0KCiN1cGRhdGVFbGVtZW50UGFuZWwgewoJZGlzcGxheTogbm9uZTsKfQoKI3NjcmlwdF9lbGVtZW50IC5wYW5lbF93cmFwcGVyIGRpdi5jdXJyZW50IHsKCWhlaWdodDogMTA4cHg7Cn0KCiNzdHlsZV9lbGVtZW50IC5wYW5lbF93cmFwcGVyIGRpdi5jdXJyZW50IHsKCWhlaWdodDogMTA4cHg7Cn0KCiNsaW5rX2VsZW1lbnQgIC5wYW5lbF93cmFwcGVyIGRpdi5jdXJyZW50IHsKCWhlaWdodDogMTQwcHg7Cn0KCiNlbGVtZW50X3NjcmlwdF92YWx1ZSB7Cgl3aWR0aDogMTAwJTsKCWhlaWdodDogMTAwcHg7Cn0KCiNlbGVtZW50X2NvbW1lbnRfdmFsdWUgewoJd2lkdGg6IDEwMCU7CgloZWlnaHQ6IDEyMHB4Owp9CgojZWxlbWVudF9zdHlsZV92YWx1ZSB7Cgl3aWR0aDogMTAwJTsKCWhlaWdodDogMTAwcHg7Cn0KCiNlbGVtZW50X3RpdGxlLCAjZWxlbWVudF9zY3JpcHRfc3JjLCAjZWxlbWVudF9tZXRhX25hbWUsICNlbGVtZW50X21ldGFfY29udGVudCwgI2VsZW1lbnRfYmFzZV9ocmVmLCAjZWxlbWVudF9saW5rX2hyZWYsICNlbGVtZW50X2xpbmtfdGl0bGUgewoJd2lkdGg6IDI1MHB4Owp9CgoudXBkYXRlRWxlbWVudEJ1dHRvbiB7CgltYXJnaW4tdG9wOiAzcHg7Cn0KCi8qIE1TSUUgc3BlY2lmaWMgc3R5bGVzICovCgoqIGh0bWwgLmFkZGJ1dHRvbiwgKiBodG1sIC5yZW1vdmVidXR0b24sICogaHRtbCAubW92ZXVwYnV0dG9uLCAqIGh0bWwgLm1vdmVkb3duYnV0dG9uIHsKCXdpZHRoOiAyMnB4OwoJaGVpZ2h0OiAyMnB4Owp9Cgp0ZXh0YXJlYSB7CgloZWlnaHQ6IDU1cHg7Cn0KCi5wYW5lbF93cmFwcGVyIGRpdi5jdXJyZW50IHtoZWlnaHQ6NDIwcHg7fQ==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullpage/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5GdWxsUGFnZVBsdWdpbiIse2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO2MuZWRpdG9yPWE7YS5hZGRDb21tYW5kKCJtY2VGdWxsUGFnZVByb3BlcnRpZXMiLGZ1bmN0aW9uKCl7YS53aW5kb3dNYW5hZ2VyLm9wZW4oe2ZpbGU6YisiL2Z1bGxwYWdlLmh0bSIsd2lkdGg6NDMwK3BhcnNlSW50KGEuZ2V0TGFuZygiZnVsbHBhZ2UuZGVsdGFfd2lkdGgiLDApKSxoZWlnaHQ6NDk1K3BhcnNlSW50KGEuZ2V0TGFuZygiZnVsbHBhZ2UuZGVsdGFfaGVpZ2h0IiwwKSksaW5saW5lOjF9LHtwbHVnaW5fdXJsOmIsaGVhZF9odG1sOmMuaGVhZH0pfSk7YS5hZGRCdXR0b24oImZ1bGxwYWdlIix7dGl0bGU6ImZ1bGxwYWdlLmRlc2MiLGNtZDoibWNlRnVsbFBhZ2VQcm9wZXJ0aWVzIn0pO2Eub25CZWZvcmVTZXRDb250ZW50LmFkZChjLl9zZXRDb250ZW50LGMpO2Eub25TZXRDb250ZW50LmFkZChjLl9zZXRCb2R5QXR0cmlicyxjKTthLm9uR2V0Q29udGVudC5hZGQoYy5fZ2V0Q29udGVudCxjKX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiRnVsbHBhZ2UiLGF1dGhvcjoiTW94aWVjb2RlIFN5c3RlbXMgQUIiLGF1dGhvcnVybDoiaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbSIsaW5mb3VybDoiaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL2Z1bGxwYWdlIix2ZXJzaW9uOnRpbnltY2UubWFqb3JWZXJzaW9uKyIuIit0aW55bWNlLm1pbm9yVmVyc2lvbn19LF9zZXRCb2R5QXR0cmliczpmdW5jdGlvbihkLGEpe3ZhciBsLGMsZSxnLGIsaCxqLGY9dGhpcy5oZWFkLm1hdGNoKC9ib2R5KC4qPyk+L2kpO2lmKGYmJmZbMV0pe2w9ZlsxXS5tYXRjaCgvXHMqKFx3K1xzKj1ccyoiLio/Inxcdytccyo9XHMqJy4qPyd8XHcrXHMqPVxzKlx3K3xcdyspXHMqL2cpO2lmKGwpe2ZvcihjPTAsZT1sLmxlbmd0aDtjPGU7YysrKXtnPWxbY10uc3BsaXQoIj0iKTtiPWdbMF0ucmVwbGFjZSgvXHMvLCIiKTtoPWdbMV07aWYoaCl7aD1oLnJlcGxhY2UoL15ccysvLCIiKS5yZXBsYWNlKC9ccyskLywiIik7aj1oLm1hdGNoKC9eWyInXSguKilbIiddJC8pO2lmKGope2g9alsxXX19ZWxzZXtoPWJ9ZC5kb20uc2V0QXR0cmliKGQuZ2V0Qm9keSgpLCJzdHlsZSIsaCl9fX19LF9jcmVhdGVTZXJpYWxpemVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aW55bWNlLmRvbS5TZXJpYWxpemVyKHtkb206dGhpcy5lZGl0b3IuZG9tLGFwcGx5X3NvdXJjZV9mb3JtYXR0aW5nOnRydWV9KX0sX3NldENvbnRlbnQ6ZnVuY3Rpb24oZCxiKXt2YXIgaD10aGlzLGEsaixmPWIuY29udGVudCxnLGk9IiI7aWYoYi5mb3JtYXQ9PSJyYXciJiZoLmhlYWQpe3JldHVybn1pZihiLnNvdXJjZV92aWV3JiZkLmdldFBhcmFtKCJmdWxscGFnZV9oaWRlX2luX3NvdXJjZV92aWV3Iikpe3JldHVybn1mPWYucmVwbGFjZSgvPChcLz8pQk9EWS9naSwiPCQxYm9keSIpO2E9Zi5pbmRleE9mKCI8Ym9keSIpO2lmKGEhPS0xKXthPWYuaW5kZXhPZigiPiIsYSk7aC5oZWFkPWYuc3Vic3RyaW5nKDAsYSsxKTtqPWYuaW5kZXhPZigiPC9ib2R5IixhKTtpZihqPT0tMSl7aj1mLmluZGV4T2YoIjwvYm9keSIsail9Yi5jb250ZW50PWYuc3Vic3RyaW5nKGErMSxqKTtoLmZvb3Q9Zi5zdWJzdHJpbmcoaik7ZnVuY3Rpb24gZShjKXtyZXR1cm4gYy5yZXBsYWNlKC88XC8/W0EtWl0rL2csZnVuY3Rpb24oayl7cmV0dXJuIGsudG9Mb3dlckNhc2UoKX0pfWguaGVhZD1lKGguaGVhZCk7aC5mb290PWUoaC5mb290KX1lbHNle2guaGVhZD0iIjtpZihkLmdldFBhcmFtKCJmdWxscGFnZV9kZWZhdWx0X3htbF9waSIpKXtoLmhlYWQrPSc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSInK2QuZ2V0UGFyYW0oImZ1bGxwYWdlX2RlZmF1bHRfZW5jb2RpbmciLCJJU08tODg1OS0xIikrJyIgPz5cbid9aC5oZWFkKz1kLmdldFBhcmFtKCJmdWxscGFnZV9kZWZhdWx0X2RvY3R5cGUiLCc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Jyk7aC5oZWFkKz0iXG48aHRtbD5cbjxoZWFkPlxuPHRpdGxlPiIrZC5nZXRQYXJhbSgiZnVsbHBhZ2VfZGVmYXVsdF90aXRsZSIsIlVudGl0bGVkIGRvY3VtZW50IikrIjwvdGl0bGU+XG4iO2lmKGc9ZC5nZXRQYXJhbSgiZnVsbHBhZ2VfZGVmYXVsdF9lbmNvZGluZyIpKXtoLmhlYWQrPSc8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9IicrZysnIiAvPlxuJ31pZihnPWQuZ2V0UGFyYW0oImZ1bGxwYWdlX2RlZmF1bHRfZm9udF9mYW1pbHkiKSl7aSs9ImZvbnQtZmFtaWx5OiAiK2crIjsifWlmKGc9ZC5nZXRQYXJhbSgiZnVsbHBhZ2VfZGVmYXVsdF9mb250X3NpemUiKSl7aSs9ImZvbnQtc2l6ZTogIitnKyI7In1pZihnPWQuZ2V0UGFyYW0oImZ1bGxwYWdlX2RlZmF1bHRfdGV4dF9jb2xvciIpKXtpKz0iY29sb3I6ICIrZysiOyJ9aC5oZWFkKz0iPC9oZWFkPlxuPGJvZHkiKyhpPycgc3R5bGU9IicraSsnIic6IiIpKyI+XG4iO2guZm9vdD0iXG48L2JvZHk+XG48L2h0bWw+In19LF9nZXRDb250ZW50OmZ1bmN0aW9uKGEsYyl7dmFyIGI9dGhpcztpZighYy5zb3VyY2Vfdmlld3x8IWEuZ2V0UGFyYW0oImZ1bGxwYWdlX2hpZGVfaW5fc291cmNlX3ZpZXciKSl7Yy5jb250ZW50PXRpbnltY2UudHJpbShiLmhlYWQpKyJcbiIrdGlueW1jZS50cmltKGMuY29udGVudCkrIlxuIit0aW55bWNlLnRyaW0oYi5mb290KX19fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgiZnVsbHBhZ2UiLHRpbnltY2UucGx1Z2lucy5GdWxsUGFnZVBsdWdpbil9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullpage/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLkZ1bGxQYWdlUGx1Z2luJywgew0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmVkaXRvciA9IGVkOw0KDQoJCQkvLyBSZWdpc3RlciBjb21tYW5kcw0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlRnVsbFBhZ2VQcm9wZXJ0aWVzJywgZnVuY3Rpb24oKSB7DQoJCQkJZWQud2luZG93TWFuYWdlci5vcGVuKHsNCgkJCQkJZmlsZSA6IHVybCArICcvZnVsbHBhZ2UuaHRtJywNCgkJCQkJd2lkdGggOiA0MzAgKyBwYXJzZUludChlZC5nZXRMYW5nKCdmdWxscGFnZS5kZWx0YV93aWR0aCcsIDApKSwNCgkJCQkJaGVpZ2h0IDogNDk1ICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygnZnVsbHBhZ2UuZGVsdGFfaGVpZ2h0JywgMCkpLA0KCQkJCQlpbmxpbmUgOiAxDQoJCQkJfSwgew0KCQkJCQlwbHVnaW5fdXJsIDogdXJsLA0KCQkJCQloZWFkX2h0bWwgOiB0LmhlYWQNCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQkvLyBSZWdpc3RlciBidXR0b25zDQoJCQllZC5hZGRCdXR0b24oJ2Z1bGxwYWdlJywge3RpdGxlIDogJ2Z1bGxwYWdlLmRlc2MnLCBjbWQgOiAnbWNlRnVsbFBhZ2VQcm9wZXJ0aWVzJ30pOw0KDQoJCQllZC5vbkJlZm9yZVNldENvbnRlbnQuYWRkKHQuX3NldENvbnRlbnQsIHQpOw0KCQkJZWQub25TZXRDb250ZW50LmFkZCh0Ll9zZXRCb2R5QXR0cmlicywgdCk7DQoJCQllZC5vbkdldENvbnRlbnQuYWRkKHQuX2dldENvbnRlbnQsIHQpOw0KCQl9LA0KDQoJCWdldEluZm8gOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB7DQoJCQkJbG9uZ25hbWUgOiAnRnVsbHBhZ2UnLA0KCQkJCWF1dGhvciA6ICdNb3hpZWNvZGUgU3lzdGVtcyBBQicsDQoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLA0KCQkJCWluZm91cmwgOiAnaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL2Z1bGxwYWdlJywNCgkJCQl2ZXJzaW9uIDogdGlueW1jZS5tYWpvclZlcnNpb24gKyAiLiIgKyB0aW55bWNlLm1pbm9yVmVyc2lvbg0KCQkJfTsNCgkJfSwNCg0KCQkvLyBQcml2YXRlIHBsdWdpbiBpbnRlcm5hbCBtZXRob2RzDQoNCgkJX3NldEJvZHlBdHRyaWJzIDogZnVuY3Rpb24oZWQsIG8pIHsNCgkJCXZhciBiZGF0dHIsIGksIGxlbiwga3YsIGssIHYsIHQsIGF0dHIgPSB0aGlzLmhlYWQubWF0Y2goL2JvZHkoLio/KT4vaSk7DQoNCgkJCWlmIChhdHRyICYmIGF0dHJbMV0pIHsNCgkJCQliZGF0dHIgPSBhdHRyWzFdLm1hdGNoKC9ccyooXHcrXHMqPVxzKiIuKj8ifFx3K1xzKj1ccyonLio/J3xcdytccyo9XHMqXHcrfFx3KylccyovZyk7DQoNCgkJCQlpZiAoYmRhdHRyKSB7DQoJCQkJCWZvcihpID0gMCwgbGVuID0gYmRhdHRyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQoJCQkJCQlrdiA9IGJkYXR0cltpXS5zcGxpdCgnPScpOw0KCQkJCQkJayA9IGt2WzBdLnJlcGxhY2UoL1xzLywnJyk7DQoJCQkJCQl2ID0ga3ZbMV07DQoNCgkJCQkJCWlmICh2KSB7DQoJCQkJCQkJdiA9IHYucmVwbGFjZSgvXlxzKy8sJycpLnJlcGxhY2UoL1xzKyQvLCcnKTsNCgkJCQkJCQl0ID0gdi5tYXRjaCgvXlsiJ10oLiopWyInXSQvKTsNCg0KCQkJCQkJCWlmICh0KQ0KCQkJCQkJCQl2ID0gdFsxXTsNCgkJCQkJCX0gZWxzZQ0KCQkJCQkJCXYgPSBrOw0KDQoJCQkJCQllZC5kb20uc2V0QXR0cmliKGVkLmdldEJvZHkoKSwgJ3N0eWxlJywgdik7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkJX2NyZWF0ZVNlcmlhbGl6ZXIgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiBuZXcgdGlueW1jZS5kb20uU2VyaWFsaXplcih7DQoJCQkJZG9tIDogdGhpcy5lZGl0b3IuZG9tLA0KCQkJCWFwcGx5X3NvdXJjZV9mb3JtYXR0aW5nIDogdHJ1ZQ0KCQkJfSk7DQoJCX0sDQoNCgkJX3NldENvbnRlbnQgOiBmdW5jdGlvbihlZCwgbykgew0KCQkJdmFyIHQgPSB0aGlzLCBzcCwgZXAsIGMgPSBvLmNvbnRlbnQsIHYsIHN0ID0gJyc7DQoNCgkJCS8vIElnbm9yZSByYXcgdXBkYXRlZCBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBoZWFkLCB0aGlzIHdpbGwgZml4IGlzc3VlcyB3aXRoIHVuZG8vcmVkbyBrZWVwaW5nIHRoZSBoZWFkL2Zvb3Qgc2VwYXJhdGUNCgkJCWlmIChvLmZvcm1hdCA9PSAncmF3JyAmJiB0LmhlYWQpDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiAoby5zb3VyY2VfdmlldyAmJiBlZC5nZXRQYXJhbSgnZnVsbHBhZ2VfaGlkZV9pbl9zb3VyY2VfdmlldycpKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gUGFyc2Ugb3V0IGhlYWQsIGJvZHkgYW5kIGZvb3Rlcg0KCQkJYyA9IGMucmVwbGFjZSgvPChcLz8pQk9EWS9naSwgJzwkMWJvZHknKTsNCgkJCXNwID0gYy5pbmRleE9mKCc8Ym9keScpOw0KDQoJCQlpZiAoc3AgIT0gLTEpIHsNCgkJCQlzcCA9IGMuaW5kZXhPZignPicsIHNwKTsNCgkJCQl0LmhlYWQgPSBjLnN1YnN0cmluZygwLCBzcCArIDEpOw0KDQoJCQkJZXAgPSBjLmluZGV4T2YoJzwvYm9keScsIHNwKTsNCgkJCQlpZiAoZXAgPT0gLTEpDQoJCQkJCWVwID0gYy5pbmRleE9mKCc8L2JvZHknLCBlcCk7DQoNCgkJCQlvLmNvbnRlbnQgPSBjLnN1YnN0cmluZyhzcCArIDEsIGVwKTsNCgkJCQl0LmZvb3QgPSBjLnN1YnN0cmluZyhlcCk7DQoNCgkJCQlmdW5jdGlvbiBsb3cocykgew0KCQkJCQlyZXR1cm4gcy5yZXBsYWNlKC88XC8/W0EtWl0rL2csIGZ1bmN0aW9uKGEpIHsNCgkJCQkJCXJldHVybiBhLnRvTG93ZXJDYXNlKCk7DQoJCQkJCX0pDQoJCQkJfTsNCg0KCQkJCXQuaGVhZCA9IGxvdyh0LmhlYWQpOw0KCQkJCXQuZm9vdCA9IGxvdyh0LmZvb3QpOw0KCQkJfSBlbHNlIHsNCgkJCQl0LmhlYWQgPSAnJzsNCgkJCQlpZiAoZWQuZ2V0UGFyYW0oJ2Z1bGxwYWdlX2RlZmF1bHRfeG1sX3BpJykpDQoJCQkJCXQuaGVhZCArPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJyArIGVkLmdldFBhcmFtKCdmdWxscGFnZV9kZWZhdWx0X2VuY29kaW5nJywgJ0lTTy04ODU5LTEnKSArICciID8+XG4nOw0KDQoJCQkJdC5oZWFkICs9IGVkLmdldFBhcmFtKCdmdWxscGFnZV9kZWZhdWx0X2RvY3R5cGUnLCAnPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPicpOw0KCQkJCXQuaGVhZCArPSAnXG48aHRtbD5cbjxoZWFkPlxuPHRpdGxlPicgKyBlZC5nZXRQYXJhbSgnZnVsbHBhZ2VfZGVmYXVsdF90aXRsZScsICdVbnRpdGxlZCBkb2N1bWVudCcpICsgJzwvdGl0bGU+XG4nOw0KDQoJCQkJaWYgKHYgPSBlZC5nZXRQYXJhbSgnZnVsbHBhZ2VfZGVmYXVsdF9lbmNvZGluZycpKQ0KCQkJCQl0LmhlYWQgKz0gJzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iJyArIHYgKyAnIiAvPlxuJzsNCg0KCQkJCWlmICh2ID0gZWQuZ2V0UGFyYW0oJ2Z1bGxwYWdlX2RlZmF1bHRfZm9udF9mYW1pbHknKSkNCgkJCQkJc3QgKz0gJ2ZvbnQtZmFtaWx5OiAnICsgdiArICc7JzsNCg0KCQkJCWlmICh2ID0gZWQuZ2V0UGFyYW0oJ2Z1bGxwYWdlX2RlZmF1bHRfZm9udF9zaXplJykpDQoJCQkJCXN0ICs9ICdmb250LXNpemU6ICcgKyB2ICsgJzsnOw0KDQoJCQkJaWYgKHYgPSBlZC5nZXRQYXJhbSgnZnVsbHBhZ2VfZGVmYXVsdF90ZXh0X2NvbG9yJykpDQoJCQkJCXN0ICs9ICdjb2xvcjogJyArIHYgKyAnOyc7DQoNCgkJCQl0LmhlYWQgKz0gJzwvaGVhZD5cbjxib2R5JyArIChzdCA/ICcgc3R5bGU9IicgKyBzdCArICciJyA6ICcnKSArICc+XG4nOw0KCQkJCXQuZm9vdCA9ICdcbjwvYm9keT5cbjwvaHRtbD4nOw0KCQkJfQ0KCQl9LA0KDQoJCV9nZXRDb250ZW50IDogZnVuY3Rpb24oZWQsIG8pIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKCFvLnNvdXJjZV92aWV3IHx8ICFlZC5nZXRQYXJhbSgnZnVsbHBhZ2VfaGlkZV9pbl9zb3VyY2VfdmlldycpKQ0KCQkJCW8uY29udGVudCA9IHRpbnltY2UudHJpbSh0LmhlYWQpICsgJ1xuJyArIHRpbnltY2UudHJpbShvLmNvbnRlbnQpICsgJ1xuJyArIHRpbnltY2UudHJpbSh0LmZvb3QpOw0KCQl9DQoJfSk7DQoNCgkvLyBSZWdpc3RlciBwbHVnaW4NCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCdmdWxscGFnZScsIHRpbnltY2UucGx1Z2lucy5GdWxsUGFnZVBsdWdpbik7DQp9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullpage/fullpage.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjZnVsbHBhZ2VfZGxnLnRpdGxlfTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9tY3RhYnMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZm9ybV91dGlscy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9mdWxscGFnZS5qcyI+PC9zY3JpcHQ+Cgk8bGluayBocmVmPSJjc3MvZnVsbHBhZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiAvPgo8L2hlYWQ+Cjxib2R5IGlkPSJhZHZsaW5rIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CiAgICA8Zm9ybSBvbnN1Ym1pdD0idXBkYXRlQWN0aW9uKCk7cmV0dXJuIGZhbHNlOyIgbmFtZT0iZnVsbHBhZ2UiIGFjdGlvbj0iIyI+CgkJPGRpdiBjbGFzcz0idGFicyI+CgkJCTx1bD4KCQkJCTxsaSBpZD0ibWV0YV90YWIiIGNsYXNzPSJjdXJyZW50Ij48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdtZXRhX3RhYicsJ21ldGFfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I2Z1bGxwYWdlX2RsZy5tZXRhX3RhYn08L2E+PC9zcGFuPjwvbGk+CgkJCQk8bGkgaWQ9ImFwcGVhcmFuY2VfdGFiIj48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdhcHBlYXJhbmNlX3RhYicsJ2FwcGVhcmFuY2VfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I2Z1bGxwYWdlX2RsZy5hcHBlYXJhbmNlX3RhYn08L2E+PC9zcGFuPjwvbGk+CgkJCQk8bGkgaWQ9ImFkdmFuY2VkX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignYWR2YW5jZWRfdGFiJywnYWR2YW5jZWRfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I2Z1bGxwYWdlX2RsZy5hZHZhbmNlZF90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCQk8L3VsPgoJCTwvZGl2PgoKCQk8ZGl2IGNsYXNzPSJwYW5lbF93cmFwcGVyIj4KCQkJPGRpdiBpZD0ibWV0YV9wYW5lbCIgY2xhc3M9InBhbmVsIGN1cnJlbnQiPgoJCQkJPGZpZWxkc2V0PgoJCQkJCTxsZWdlbmQ+eyNmdWxscGFnZV9kbGcubWV0YV9wcm9wc308L2xlZ2VuZD4KCgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJub3dyYXAiPjxsYWJlbCBmb3I9Im1ldGF0aXRsZSI+eyNmdWxscGFnZV9kbGcubWV0YV90aXRsZX08L2xhYmVsPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJtZXRhdGl0bGUiIG5hbWU9Im1ldGF0aXRsZSIgdmFsdWU9IiIgY2xhc3M9Im1jZUZvY3VzIiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgZm9yPSJtZXRha2V5d29yZHMiPnsjZnVsbHBhZ2VfZGxnLm1ldGFfa2V5d29yZHN9PC9sYWJlbD4mbmJzcDs8L3RkPgoJCQkJCQkJPHRkPjx0ZXh0YXJlYSBpZD0ibWV0YWtleXdvcmRzIiBuYW1lPSJtZXRha2V5d29yZHMiIHJvd3M9IjQiPjwvdGV4dGFyZWE+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJub3dyYXAiPjxsYWJlbCBmb3I9Im1ldGFkZXNjcmlwdGlvbiI+eyNmdWxscGFnZV9kbGcubWV0YV9kZXNjcmlwdGlvbn08L2xhYmVsPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PHRleHRhcmVhIGlkPSJtZXRhZGVzY3JpcHRpb24iIG5hbWU9Im1ldGFkZXNjcmlwdGlvbiIgcm93cz0iNCI+PC90ZXh0YXJlYT48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCI+PGxhYmVsIGZvcj0ibWV0YWF1dGhvciI+eyNmdWxscGFnZV9kbGcuYXV0aG9yfTwvbGFiZWw+Jm5ic3A7PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9Im1ldGFhdXRob3IiIG5hbWU9Im1ldGFhdXRob3IiIHZhbHVlPSIiIC8+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJub3dyYXAiPjxsYWJlbCBmb3I9Im1ldGFjb3B5cmlnaHQiPnsjZnVsbHBhZ2VfZGxnLmNvcHlyaWdodH08L2xhYmVsPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJtZXRhY29weXJpZ2h0IiBuYW1lPSJtZXRhY29weXJpZ2h0IiB2YWx1ZT0iIiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgZm9yPSJtZXRhcm9ib3RzIj57I2Z1bGxwYWdlX2RsZy5tZXRhX3JvYm90c308L2xhYmVsPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHNlbGVjdCBpZD0ibWV0YXJvYm90cyIgbmFtZT0ibWV0YXJvYm90cyI+CgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+IAoJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImluZGV4LGZvbGxvdyI+eyNmdWxscGFnZV9kbGcubWV0YV9pbmRleF9mb2xsb3d9PC9vcHRpb24+CgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iaW5kZXgsbm9mb2xsb3ciPnsjZnVsbHBhZ2VfZGxnLm1ldGFfaW5kZXhfbm9mb2xsb3d9PC9vcHRpb24+CgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibm9pbmRleCxmb2xsb3ciPnsjZnVsbHBhZ2VfZGxnLm1ldGFfbm9pbmRleF9mb2xsb3d9PC9vcHRpb24+CgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibm9pbmRleCxub2ZvbGxvdyI+eyNmdWxscGFnZV9kbGcubWV0YV9ub2luZGV4X25vZm9sbG93fTwvb3B0aW9uPgoJCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC9maWVsZHNldD4KCgkJCQk8ZmllbGRzZXQ+CgkJCQkJPGxlZ2VuZD57I2Z1bGxwYWdlX2RsZy5sYW5ncHJvcHN9PC9sZWdlbmQ+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iZG9jZW5jb2RpbmciPnsjZnVsbHBhZ2VfZGxnLmVuY29kaW5nfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHNlbGVjdCBpZD0iZG9jZW5jb2RpbmciIG5hbWU9ImRvY2VuY29kaW5nIj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4KCQkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJCTwvdGQ+IAoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCI+PGxhYmVsIGZvcj0iZG9jdHlwZXMiPnsjZnVsbHBhZ2VfZGxnLmRvY3R5cGVzfTwvbGFiZWw+Jm5ic3A7PC90ZD4KCQkJCQkJCTx0ZD4KCQkJCQkJCQk8c2VsZWN0IGlkPSJkb2N0eXBlcyIgbmFtZT0iZG9jdHlwZXMiPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+CgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCI+PGxhYmVsIGZvcj0ibGFuZ2NvZGUiPnsjZnVsbHBhZ2VfZGxnLmxhbmdjb2RlfTwvbGFiZWw+Jm5ic3A7PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9Imxhbmdjb2RlIiBuYW1lPSJsYW5nY29kZSIgdmFsdWU9IiIgLz48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImxhbmdkaXIiPnsjZnVsbHBhZ2VfZGxnLmxhbmdkaXJ9PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD4KCQkJCQkJCQk8c2VsZWN0IGlkPSJsYW5nZGlyIiBuYW1lPSJsYW5nZGlyIj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJsdHIiPnsjZnVsbHBhZ2VfZGxnLmx0cn08L29wdGlvbj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJydGwiPnsjZnVsbHBhZ2VfZGxnLnJ0bH08L29wdGlvbj4gCgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPiAKCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJub3dyYXAiPjxsYWJlbCBmb3I9InhtbF9waSI+eyNmdWxscGFnZV9kbGcueG1sX3BpfTwvbGFiZWw+Jm5ic3A7PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ4bWxfcGkiIG5hbWU9InhtbF9waSIgY2xhc3M9ImNoZWNrYm94IiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgkJCTwvZGl2PgoKCQkJPGRpdiBpZD0iYXBwZWFyYW5jZV9wYW5lbCIgY2xhc3M9InBhbmVsIj4KCQkJCTxmaWVsZHNldD4KCQkJCQk8bGVnZW5kPnsjZnVsbHBhZ2VfZGxnLmFwcGVhcmFuY2VfdGV4dHByb3BzfTwvbGVnZW5kPgoKCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImZvbnRmYWNlIj57I2Z1bGxwYWdlX2RsZy5mb250ZmFjZX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTxzZWxlY3QgaWQ9ImZvbnRmYWNlIiBuYW1lPSJmb250ZmFjZSIgb25jaGFuZ2U9ImNoYW5nZWRTdHlsZUZpZWxkKHRoaXMpOyI+CgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4KCQkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJCTwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJmb250c2l6ZSI+eyNmdWxscGFnZV9kbGcuZm9udHNpemV9PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD4KCQkJCQkJCQk8c2VsZWN0IGlkPSJmb250c2l6ZSIgbmFtZT0iZm9udHNpemUiIG9uY2hhbmdlPSJjaGFuZ2VkU3R5bGVGaWVsZCh0aGlzKTsiPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+CgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJ0ZXh0Y29sb3IiPnsjZnVsbHBhZ2VfZGxnLnRleHRjb2xvcn08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9InRleHRjb2xvciIgbmFtZT0idGV4dGNvbG9yIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzaXplPSI5IiBvbmNoYW5nZT0idXBkYXRlQ29sb3IoJ3RleHRjb2xvcl9waWNrJywndGV4dGNvbG9yJyk7Y2hhbmdlZFN0eWxlRmllbGQodGhpcyk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQgaWQ9InRleHRjb2xvcl9waWNrY29udGFpbmVyIj4mbmJzcDs8L3RkPgoJCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTwvdGFibGU+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgkJCQk8L2ZpZWxkc2V0PgoKCQkJCTxmaWVsZHNldD4KCQkJCQk8bGVnZW5kPnsjZnVsbHBhZ2VfZGxnLmFwcGVhcmFuY2VfYmdwcm9wc308L2xlZ2VuZD4KCgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJiZ2ltYWdlIj57I2Z1bGxwYWdlX2RsZy5iZ2ltYWdlfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCBpZD0iYmdpbWFnZSIgbmFtZT0iYmdpbWFnZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgb25jaGFuZ2U9ImNoYW5nZWRTdHlsZUZpZWxkKHRoaXMpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkIGlkPSJiZ2ltYWdlX3BpY2tjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iYmdjb2xvciI+eyNmdWxscGFnZV9kbGcuYmdjb2xvcn08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImJnY29sb3IiIG5hbWU9ImJnY29sb3IiIHR5cGU9InRleHQiIHZhbHVlPSIiIHNpemU9IjkiIG9uY2hhbmdlPSJ1cGRhdGVDb2xvcignYmdjb2xvcl9waWNrJywnYmdjb2xvcicpO2NoYW5nZWRTdHlsZUZpZWxkKHRoaXMpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkIGlkPSJiZ2NvbG9yX3BpY2tjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+IAoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgkJCQk8L2ZpZWxkc2V0PgoKCQkJCTxmaWVsZHNldD4KCQkJCQk8bGVnZW5kPnsjZnVsbHBhZ2VfZGxnLmFwcGVhcmFuY2VfbWFyZ2lucHJvcHN9PC9sZWdlbmQ+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0ibGVmdG1hcmdpbiI+eyNmdWxscGFnZV9kbGcubGVmdF9tYXJnaW59PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImxlZnRtYXJnaW4iIG5hbWU9ImxlZnRtYXJnaW4iIHR5cGU9InRleHQiIHZhbHVlPSIiIG9uY2hhbmdlPSJjaGFuZ2VkU3R5bGVGaWVsZCh0aGlzKTsiIC8+PC90ZD4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0icmlnaHRtYXJnaW4iPnsjZnVsbHBhZ2VfZGxnLnJpZ2h0X21hcmdpbn08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPjxpbnB1dCBpZD0icmlnaHRtYXJnaW4iIG5hbWU9InJpZ2h0bWFyZ2luIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBvbmNoYW5nZT0iY2hhbmdlZFN0eWxlRmllbGQodGhpcyk7IiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0idG9wbWFyZ2luIj57I2Z1bGxwYWdlX2RsZy50b3BfbWFyZ2lufTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJ0b3BtYXJnaW4iIG5hbWU9InRvcG1hcmdpbiIgdHlwZT0idGV4dCIgdmFsdWU9IiIgb25jaGFuZ2U9ImNoYW5nZWRTdHlsZUZpZWxkKHRoaXMpOyIgLz48L3RkPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJib3R0b21tYXJnaW4iPnsjZnVsbHBhZ2VfZGxnLmJvdHRvbV9tYXJnaW59PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImJvdHRvbW1hcmdpbiIgbmFtZT0iYm90dG9tbWFyZ2luIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBvbmNoYW5nZT0iY2hhbmdlZFN0eWxlRmllbGQodGhpcyk7IiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgoJCQkJPGZpZWxkc2V0PgoJCQkJCTxsZWdlbmQ+eyNmdWxscGFnZV9kbGcuYXBwZWFyYW5jZV9saW5rcHJvcHN9PC9sZWdlbmQ+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0ibGlua19jb2xvciI+eyNmdWxscGFnZV9kbGcubGlua19jb2xvcn08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImxpbmtfY29sb3IiIG5hbWU9ImxpbmtfY29sb3IiIHR5cGU9InRleHQiIHZhbHVlPSIiIHNpemU9IjkiIG9uY2hhbmdlPSJ1cGRhdGVDb2xvcignbGlua19jb2xvcl9waWNrJywnbGlua19jb2xvcicpO2NoYW5nZWRTdHlsZUZpZWxkKHRoaXMpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkIGlkPSJsaW5rX2NvbG9yX3BpY2tjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJ2aXNpdGVkX2NvbG9yIj57I2Z1bGxwYWdlX2RsZy52aXNpdGVkX2NvbG9yfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCBpZD0idmlzaXRlZF9jb2xvciIgbmFtZT0idmlzaXRlZF9jb2xvciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iOSIgb25jaGFuZ2U9InVwZGF0ZUNvbG9yKCd2aXNpdGVkX2NvbG9yX3BpY2snLCd2aXNpdGVkX2NvbG9yJyk7Y2hhbmdlZFN0eWxlRmllbGQodGhpcyk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQgaWQ9InZpc2l0ZWRfY29sb3JfcGlja2NvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iYWN0aXZlX2NvbG9yIj57I2Z1bGxwYWdlX2RsZy5hY3RpdmVfY29sb3J9PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJhY3RpdmVfY29sb3IiIG5hbWU9ImFjdGl2ZV9jb2xvciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iOSIgb25jaGFuZ2U9InVwZGF0ZUNvbG9yKCdhY3RpdmVfY29sb3JfcGljaycsJ2FjdGl2ZV9jb2xvcicpO2NoYW5nZWRTdHlsZUZpZWxkKHRoaXMpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkIGlkPSJhY3RpdmVfY29sb3JfcGlja2NvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCQkJCTx0ZD4mbmJzcDs8L3RkPgoKPCEtLQkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImhvdmVyX2NvbG9yIj57I2Z1bGxwYWdlX2RsZy5ob3Zlcl9jb2xvcn08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImhvdmVyX2NvbG9yIiBuYW1lPSJob3Zlcl9jb2xvciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iOSIgb25jaGFuZ2U9ImNoYW5nZWRTdHlsZUZpZWxkKHRoaXMpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkIGlkPSJob3Zlcl9jb2xvcl9waWNrY29udGFpbmVyIj4mbmJzcDs8L3RkPgoJCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTwvdGFibGU+CgkJCQkJCQk8L3RkPiAtLT4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC9maWVsZHNldD4KCgkJCQk8ZmllbGRzZXQ+CgkJCQkJPGxlZ2VuZD57I2Z1bGxwYWdlX2RsZy5hcHBlYXJhbmNlX3N0eWxlfTwvbGVnZW5kPgoKCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9InN0eWxlc2hlZXQiPnsjZnVsbHBhZ2VfZGxnLnN0eWxlc2hlZXR9PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJzdHlsZXNoZWV0IiBuYW1lPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQgaWQ9InN0eWxlc2hlZXRfYnJvd3NlcmNvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0ic3R5bGUiPnsjZnVsbHBhZ2VfZGxnLnN0eWxlfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJzdHlsZSIgbmFtZT0ic3R5bGUiIHR5cGU9InRleHQiIHZhbHVlPSIiIG9uY2hhbmdlPSJjaGFuZ2VkU3R5bGVGaWVsZCh0aGlzKTsiIC8+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC9maWVsZHNldD4KCQkJPC9kaXY+CgoJCQk8ZGl2IGlkPSJhZHZhbmNlZF9wYW5lbCIgY2xhc3M9InBhbmVsIj4KCQkJCTxkaXYgaWQ9ImFkZG1lbnUiPgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCTx0cj48dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDphZGRIZWFkRWxtKCd0aXRsZScpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPjxzcGFuPnsjZnVsbHBhZ2VfZGxnLmFkZF90aXRsZX08L3NwYW4+PC9hPjwvdGQ+PC90cj4KCQkJCQkJPHRyPjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmFkZEhlYWRFbG0oJ21ldGEnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij48c3Bhbj57I2Z1bGxwYWdlX2RsZy5hZGRfbWV0YX08L3NwYW4+PC9hPjwvdGQ+PC90cj4KCQkJCQkJPHRyPjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmFkZEhlYWRFbG0oJ3NjcmlwdCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPjxzcGFuPnsjZnVsbHBhZ2VfZGxnLmFkZF9zY3JpcHR9PC9zcGFuPjwvYT48L3RkPjwvdHI+CgkJCQkJCTx0cj48dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDphZGRIZWFkRWxtKCdzdHlsZScpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPjxzcGFuPnsjZnVsbHBhZ2VfZGxnLmFkZF9zdHlsZX08L3NwYW4+PC9hPjwvdGQ+PC90cj4KCQkJCQkJPHRyPjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmFkZEhlYWRFbG0oJ2xpbmsnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij48c3Bhbj57I2Z1bGxwYWdlX2RsZy5hZGRfbGlua308L3NwYW4+PC9hPjwvdGQ+PC90cj4KCQkJCQkJPHRyPjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmFkZEhlYWRFbG0oJ2Jhc2UnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij48c3Bhbj57I2Z1bGxwYWdlX2RsZy5hZGRfYmFzZX08L3NwYW4+PC9hPjwvdGQ+PC90cj4KCQkJCQkJPHRyPjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmFkZEhlYWRFbG0oJ2NvbW1lbnQnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij48c3Bhbj57I2Z1bGxwYWdlX2RsZy5hZGRfY29tbWVudH08L3NwYW4+PC9hPjwvdGQ+PC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC9kaXY+CgoJCQkJPGZpZWxkc2V0PgoJCQkJCTxsZWdlbmQ+eyNmdWxscGFnZV9kbGcuaGVhZF9lbGVtZW50c308L2xlZ2VuZD4KCgkJCQkJPGRpdiBjbGFzcz0iaGVhZGxpc3R3cmFwcGVyIj4KCQkJCQkJPGRpdiBjbGFzcz0idG9vbGJhciI+CgkJCQkJCQk8ZGl2IHN0eWxlPSJmbG9hdDogbGVmdCI+CgkJCQkJCQkJPGEgaWQ9ImFkZGJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDpzaG93QWRkTWVudSgpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiIGNsYXNzPSJhZGRidXR0b24iIHRpdGxlPSJ7I2Z1bGxwYWdlX2RsZy5hZGR9Ij48L2E+CgkJCQkJCQkJPGEgaHJlZj0iIyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiIGNsYXNzPSJyZW1vdmVidXR0b24iIHRpdGxlPSJ7I2Z1bGxwYWdlX2RsZy5yZW1vdmV9Ij48L2E+CgkJCQkJCQk8L2Rpdj4KCQkJCQkJCTxkaXYgc3R5bGU9ImZsb2F0OiByaWdodCI+CgkJCQkJCQkJPGEgaHJlZj0iIyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiIGNsYXNzPSJtb3ZldXBidXR0b24iIHRpdGxlPSJ7I2Z1bGxwYWdlX2RsZy5tb3ZldXB9Ij48L2E+CgkJCQkJCQkJPGEgaHJlZj0iIyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiIGNsYXNzPSJtb3ZlZG93bmJ1dHRvbiIgdGl0bGU9InsjZnVsbHBhZ2VfZGxnLm1vdmVkb3dufSI+PC9hPgoJCQkJCQkJPC9kaXY+CgkJCQkJCQk8YnIgc3R5bGU9ImNsZWFyOiBib3RoIiAvPgoJCQkJCQk8L2Rpdj4KCQkJCQkJPHNlbGVjdCBpZD0iaGVhZGxpc3QiIHNpemU9IjI2IiBvbmNoYW5nZT0idXBkYXRlSGVhZEVsbSh0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZSk7Ij4KCQkJCQkJCTxvcHRpb24gdmFsdWU9InRpdGxlXzAiPiZsdDt0aXRsZSZndDtTb21lIHRpdGxlIGJsYSBibGEgYmxhJmx0Oy90aXRsZSZndDs8L29wdGlvbj4KCQkJCQkJCTxvcHRpb24gdmFsdWU9Im1ldGFfMSI+Jmx0O21ldGEgbmFtZT0ia2V5d29yZHMiJmd0O1NvbWUgYmxhIGJsYSBibGEmbHQ7L21ldGEmZ3Q7PC9vcHRpb24+CgkJCQkJCQk8b3B0aW9uIHZhbHVlPSJtZXRhXzIiPiZsdDttZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiZndDtTb21lIGJsYSBibGEgYmxhIGJsYSBibGEgYmxhIGJsYSBibGEgYmxhJmx0Oy9tZXRhJmd0Ozwvb3B0aW9uPgoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ic2NyaXB0XzMiPiZsdDtzY3JpcHQgbGFuZ3VhZ2U9JnF1b3Q7amF2YXNjcmlwdCZxdW90OyZndDsuLi4mbHQ7L3NjcmlwdCZndDs8L29wdGlvbj4KCQkJCQkJCTxvcHRpb24gdmFsdWU9InN0eWxlXzQiPiZsdDtzdHlsZSZndDsuLi4mbHQ7L3N0eWxlJmd0Ozwvb3B0aW9uPgoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYmFzZV81Ij4mbHQ7YmFzZSBocmVmPSIuIiAvJmd0Ozwvb3B0aW9uPgoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY29tbWVudF82Ij4mbHQ7IS0tIC4uLiAtLSZndDs8L29wdGlvbj4KCQkJCQkJCTxvcHRpb24gdmFsdWU9ImxpbmtfNyI+Jmx0O2xpbmsgaHJlZj0iLiIgLyZndDs8L29wdGlvbj4KCQkJCQkJPC9zZWxlY3Q+CgkJCQkJPC9kaXY+CgkJCQk8L2ZpZWxkc2V0PgoKCQkJCTxmaWVsZHNldCBpZD0ibWV0YV9lbGVtZW50Ij4KCQkJCQk8bGVnZW5kPnsjZnVsbHBhZ2VfZGxnLm1ldGFfZWxlbWVudH08L2xlZ2VuZD4KCgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJlbGVtZW50X21ldGFfdHlwZSI+eyNmdWxscGFnZV9kbGcudHlwZX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPjxzZWxlY3QgaWQ9ImVsZW1lbnRfbWV0YV90eXBlIj4KCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Im5hbWUiPm5hbWU8L29wdGlvbj4KCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Imh0dHAtZXF1aXYiPmh0dHAtZXF1aXY8L29wdGlvbj4KCQkJCQkJCQk8L3NlbGVjdD48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImVsZW1lbnRfbWV0YV9uYW1lIj57I2Z1bGxwYWdlX2RsZy5uYW1lfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJlbGVtZW50X21ldGFfbmFtZSIgbmFtZT0iZWxlbWVudF9tZXRhX25hbWUiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJlbGVtZW50X21ldGFfY29udGVudCI+eyNmdWxscGFnZV9kbGcuY29udGVudH08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPjxpbnB1dCBpZD0iZWxlbWVudF9tZXRhX2NvbnRlbnQiIG5hbWU9ImVsZW1lbnRfbWV0YV9jb250ZW50IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCgkJCQkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9Im1ldGFfdXBkYXRlZWxlbWVudCIgY2xhc3M9InVwZGF0ZUVsZW1lbnRCdXR0b24iIG5hbWU9InVwZGF0ZSIgdmFsdWU9InsjdXBkYXRlfSIgb25jbGljaz0idXBkYXRlRWxlbWVudCgpOyIgLz4KCQkJCTwvZmllbGRzZXQ+CgoJCQkJPGZpZWxkc2V0IGlkPSJ0aXRsZV9lbGVtZW50Ij4KCQkJCQk8bGVnZW5kPnsjZnVsbHBhZ2VfZGxnLnRpdGxlX2VsZW1lbnR9PC9sZWdlbmQ+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iZWxlbWVudF90aXRsZSI+eyNmdWxscGFnZV9kbGcubWV0YV90aXRsZX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPjxpbnB1dCBpZD0iZWxlbWVudF90aXRsZSIgbmFtZT0iZWxlbWVudF90aXRsZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgoJCQkJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJ0aXRsZV91cGRhdGVlbGVtZW50IiBjbGFzcz0idXBkYXRlRWxlbWVudEJ1dHRvbiIgbmFtZT0idXBkYXRlIiB2YWx1ZT0ieyN1cGRhdGV9IiBvbmNsaWNrPSJ1cGRhdGVFbGVtZW50KCk7IiAvPgoJCQkJPC9maWVsZHNldD4KCgkJCQk8ZmllbGRzZXQgaWQ9InNjcmlwdF9lbGVtZW50Ij4KCQkJCQk8bGVnZW5kPnsjZnVsbHBhZ2VfZGxnLnNjcmlwdF9lbGVtZW50fTwvbGVnZW5kPgoKCQkJCQk8ZGl2IGNsYXNzPSJ0YWJzIj4KCQkJCQkJPHVsPgoJCQkJCQkJPGxpIGlkPSJzY3JpcHRfcHJvcHNfdGFiIiBjbGFzcz0iY3VycmVudCI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignc2NyaXB0X3Byb3BzX3RhYicsJ3NjcmlwdF9wcm9wc19wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjZnVsbHBhZ2VfZGxnLnByb3BlcnRpZXN9PC9hPjwvc3Bhbj48L2xpPgoJCQkJCQkJPGxpIGlkPSJzY3JpcHRfdmFsdWVfdGFiIj48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdzY3JpcHRfdmFsdWVfdGFiJywnc2NyaXB0X3ZhbHVlX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNmdWxscGFnZV9kbGcudmFsdWV9PC9hPjwvc3Bhbj48L2xpPgoJCQkJCQk8L3VsPgoJCQkJCTwvZGl2PgoKCQkJCQk8YnIgc3R5bGU9ImNsZWFyOiBib3RoIiAvPgoKCQkJCQk8ZGl2IGNsYXNzPSJwYW5lbF93cmFwcGVyIj4KCQkJCQkJPGRpdiBpZD0ic2NyaXB0X3Byb3BzX3BhbmVsIiBjbGFzcz0icGFuZWwgY3VycmVudCI+CgkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCTx0cj4KCQkJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJlbGVtZW50X3NjcmlwdF90eXBlIj57I2Z1bGxwYWdlX2RsZy50eXBlfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJlbGVtZW50X3NjcmlwdF90eXBlIj4KCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InRleHQvamF2YXNjcmlwdCI+dGV4dC9qYXZhc2NyaXB0PC9vcHRpb24+CgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJ0ZXh0L2pzY3JpcHQiPnRleHQvanNjcmlwdDwvb3B0aW9uPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idGV4dC92YnNjcmlwdCI+dGV4dC92YnNjcmlwdDwvb3B0aW9uPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idGV4dC92YnMiPnRleHQvdmJzPC9vcHRpb24+CgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJ0ZXh0L2VjbWFzY3JpcHQiPnRleHQvZWNtYXNjcmlwdDwvb3B0aW9uPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idGV4dC94bWwiPnRleHQveG1sPC9vcHRpb24+CgkJCQkJCQkJCTwvc2VsZWN0PjwvdGQ+CgkJCQkJCQkJPC90cj4KCQkJCQkJCQk8dHI+CgkJCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iZWxlbWVudF9zY3JpcHRfc3JjIj57I2Z1bGxwYWdlX2RsZy5zcmN9PC9sYWJlbD48L3RkPiAKCQkJCQkJCQkJPHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImVsZW1lbnRfc2NyaXB0X3NyYyIgbmFtZT0iZWxlbWVudF9zY3JpcHRfc3JjIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQgaWQ9InNjcmlwdF9zcmNfcGlja2NvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPjwvdGQ+CgkJCQkJCQkJPC90cj4KCQkJCQkJCQk8dHI+CgkJCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iZWxlbWVudF9zY3JpcHRfY2hhcnNldCI+eyNmdWxscGFnZV9kbGcuY2hhcnNldH08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0iZWxlbWVudF9zY3JpcHRfY2hhcnNldCI+PG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTx0cj4KCQkJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJlbGVtZW50X3NjcmlwdF9kZWZlciI+eyNmdWxscGFnZV9kbGcuZGVmZXJ9PC9sYWJlbD48L3RkPiAKCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImVsZW1lbnRfc2NyaXB0X2RlZmVyIiBuYW1lPSJlbGVtZW50X3NjcmlwdF9kZWZlciIgY2xhc3M9ImNoZWNrYm94IiAvPjwvdGQ+CgkJCQkJCQkJPC90cj4KCQkJCQkJCTwvdGFibGU+CgkJCQkJCTwvZGl2PgoKCQkJCQkJPGRpdiBpZD0ic2NyaXB0X3ZhbHVlX3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJCQkJCQkJPHRleHRhcmVhIGlkPSJlbGVtZW50X3NjcmlwdF92YWx1ZSI+PC90ZXh0YXJlYT4KCQkJCQkJPC9kaXY+CgkJCQkJPC9kaXY+CgoJCQkJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJzY3JpcHRfdXBkYXRlZWxlbWVudCIgY2xhc3M9InVwZGF0ZUVsZW1lbnRCdXR0b24iIG5hbWU9InVwZGF0ZSIgdmFsdWU9InsjdXBkYXRlfSIgb25jbGljaz0idXBkYXRlRWxlbWVudCgpOyIgLz4KCQkJCTwvZmllbGRzZXQ+CgoJCQkJPGZpZWxkc2V0IGlkPSJzdHlsZV9lbGVtZW50Ij4KCQkJCQk8bGVnZW5kPnsjZnVsbHBhZ2VfZGxnLnN0eWxlX2VsZW1lbnR9PC9sZWdlbmQ+CgoJCQkJCTxkaXYgY2xhc3M9InRhYnMiPgoJCQkJCQk8dWw+CgkJCQkJCQk8bGkgaWQ9InN0eWxlX3Byb3BzX3RhYiIgY2xhc3M9ImN1cnJlbnQiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ3N0eWxlX3Byb3BzX3RhYicsJ3N0eWxlX3Byb3BzX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNmdWxscGFnZV9kbGcucHJvcGVydGllc308L2E+PC9zcGFuPjwvbGk+CgkJCQkJCQk8bGkgaWQ9InN0eWxlX3ZhbHVlX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignc3R5bGVfdmFsdWVfdGFiJywnc3R5bGVfdmFsdWVfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I2Z1bGxwYWdlX2RsZy52YWx1ZX08L2E+PC9zcGFuPjwvbGk+CgkJCQkJCTwvdWw+CgkJCQkJPC9kaXY+CgoJCQkJCTxiciBzdHlsZT0iY2xlYXI6IGJvdGgiIC8+CgoJCQkJCTxkaXYgY2xhc3M9InBhbmVsX3dyYXBwZXIiPgoJCQkJCQk8ZGl2IGlkPSJzdHlsZV9wcm9wc19wYW5lbCIgY2xhc3M9InBhbmVsIGN1cnJlbnQiPgoJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQk8dHI+CgkJCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iZWxlbWVudF9zdHlsZV90eXBlIj57I2Z1bGxwYWdlX2RsZy50eXBlfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJlbGVtZW50X3N0eWxlX3R5cGUiPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idGV4dC9jc3MiPnRleHQvY3NzPC9vcHRpb24+CgkJCQkJCQkJCTwvc2VsZWN0PjwvdGQ+CgkJCQkJCQkJPC90cj4KCQkJCQkJCQk8dHI+CgkJCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iZWxlbWVudF9zdHlsZV9tZWRpYSI+eyNmdWxscGFnZV9kbGcubWVkaWF9PC9sYWJlbD48L3RkPiAKCQkJCQkJCQkJPHRkPjxzZWxlY3QgaWQ9ImVsZW1lbnRfc3R5bGVfbWVkaWEiPjwvc2VsZWN0PjwvdGQ+CgkJCQkJCQkJPC90cj4KCQkJCQkJCTwvdGFibGU+CgkJCQkJCTwvZGl2PgoKCQkJCQkJPGRpdiBpZD0ic3R5bGVfdmFsdWVfcGFuZWwiIGNsYXNzPSJwYW5lbCI+CgkJCQkJCQk8dGV4dGFyZWEgaWQ9ImVsZW1lbnRfc3R5bGVfdmFsdWUiPjwvdGV4dGFyZWE+CgkJCQkJCTwvZGl2PgoJCQkJCTwvZGl2PgoKCQkJCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0ic3R5bGVfdXBkYXRlZWxlbWVudCIgY2xhc3M9InVwZGF0ZUVsZW1lbnRCdXR0b24iIG5hbWU9InVwZGF0ZSIgdmFsdWU9InsjdXBkYXRlfSIgb25jbGljaz0idXBkYXRlRWxlbWVudCgpOyIgLz4KCQkJCTwvZmllbGRzZXQ+CgoJCQkJPGZpZWxkc2V0IGlkPSJiYXNlX2VsZW1lbnQiPgoJCQkJCTxsZWdlbmQ+eyNmdWxscGFnZV9kbGcuYmFzZV9lbGVtZW50fTwvbGVnZW5kPgoKCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImVsZW1lbnRfYmFzZV9ocmVmIj57I2Z1bGxwYWdlX2RsZy5ocmVmfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJlbGVtZW50X2Jhc2VfaHJlZiIgbmFtZT0iZWxlbWVudF9iYXNlX2hyZWYiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJlbGVtZW50X2Jhc2VfdGFyZ2V0Ij57I2Z1bGxwYWdlX2RsZy50YXJnZXR9PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImVsZW1lbnRfYmFzZV90YXJnZXQiIG5hbWU9ImVsZW1lbnRfYmFzZV90YXJnZXQiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoKCQkJCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iYmFzZV91cGRhdGVlbGVtZW50IiBjbGFzcz0idXBkYXRlRWxlbWVudEJ1dHRvbiIgbmFtZT0idXBkYXRlIiB2YWx1ZT0ieyN1cGRhdGV9IiBvbmNsaWNrPSJ1cGRhdGVFbGVtZW50KCk7IiAvPgoJCQkJPC9maWVsZHNldD4KCgkJCQk8ZmllbGRzZXQgaWQ9ImxpbmtfZWxlbWVudCI+CgkJCQkJPGxlZ2VuZD57I2Z1bGxwYWdlX2RsZy5saW5rX2VsZW1lbnR9PC9sZWdlbmQ+CgoJCQkJCTxkaXYgY2xhc3M9InRhYnMiPgoJCQkJCQk8dWw+CgkJCQkJCQk8bGkgaWQ9ImxpbmtfZ2VuZXJhbF90YWIiIGNsYXNzPSJjdXJyZW50Ij48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdsaW5rX2dlbmVyYWxfdGFiJywnbGlua19nZW5lcmFsX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNmdWxscGFnZV9kbGcuZ2VuZXJhbF9wcm9wc308L2E+PC9zcGFuPjwvbGk+CgkJCQkJCQk8bGkgaWQ9ImxpbmtfYWR2YW5jZWRfdGFiIj48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdsaW5rX2FkdmFuY2VkX3RhYicsJ2xpbmtfYWR2YW5jZWRfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I2Z1bGxwYWdlX2RsZy5hZHZhbmNlZF9wcm9wc308L2E+PC9zcGFuPjwvbGk+CgkJCQkJCTwvdWw+CgkJCQkJPC9kaXY+CgoJCQkJCTxiciBzdHlsZT0iY2xlYXI6IGJvdGgiIC8+CgoJCQkJCTxkaXYgY2xhc3M9InBhbmVsX3dyYXBwZXIiPgoJCQkJCQk8ZGl2IGlkPSJsaW5rX2dlbmVyYWxfcGFuZWwiIGNsYXNzPSJwYW5lbCBjdXJyZW50Ij4KCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJPHRyPgoJCQkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImVsZW1lbnRfbGlua19ocmVmIj57I2Z1bGxwYWdlX2RsZy5ocmVmfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQkJCTx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJlbGVtZW50X2xpbmtfaHJlZiIgbmFtZT0iZWxlbWVudF9saW5rX2hyZWYiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZCBpZD0ibGlua19ocmVmX3BpY2tjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT48L3RkPgoJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPHRyPgoJCQkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImVsZW1lbnRfbGlua190aXRsZSI+eyNmdWxscGFnZV9kbGcubWV0YV90aXRsZX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJlbGVtZW50X2xpbmtfdGl0bGUiIG5hbWU9ImVsZW1lbnRfbGlua190aXRsZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPgoJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPHRyPgoJCQkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImVsZW1lbnRfbGlua190eXBlIj57I2Z1bGxwYWdlX2RsZy50eXBlfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJlbGVtZW50X2xpbmtfdHlwZSIgbmFtZT0iZWxlbWVudF9saW5rX3R5cGUiPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idGV4dC9jc3MiPnRleHQvY3NzPC9vcHRpb24+CgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJ0ZXh0L2phdmFzY3JpcHQiPnRleHQvamF2YXNjcmlwdDwvb3B0aW9uPgoJCQkJCQkJCQk8L3NlbGVjdD48L3RkPgoJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPHRyPgoJCQkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImVsZW1lbnRfbGlua19tZWRpYSI+eyNmdWxscGFnZV9kbGcubWVkaWF9PC9sYWJlbD48L3RkPiAKCQkJCQkJCQkJPHRkPjxzZWxlY3QgaWQ9ImVsZW1lbnRfbGlua19tZWRpYSIgbmFtZT0iZWxlbWVudF9saW5rX21lZGlhIj48L3NlbGVjdD48L3RkPgoJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPHRyPgoJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iZWxlbWVudF9zdHlsZV9yZWwiPnsjZnVsbHBhZ2VfZGxnLnJlbH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJlbGVtZW50X3N0eWxlX3JlbCIgbmFtZT0iZWxlbWVudF9zdHlsZV9yZWwiPiAKCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ic3R5bGVzaGVldCI+U3R5bGVzaGVldDwvb3B0aW9uPgoJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImFsdGVybmF0ZSI+QWx0ZXJuYXRlPC9vcHRpb24+CgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iZGVzaWduYXRlcyI+RGVzaWduYXRlczwvb3B0aW9uPgoJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InN0YXJ0Ij5TdGFydDwvb3B0aW9uPgoJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Im5leHQiPk5leHQ8L29wdGlvbj4KCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJwcmV2Ij5QcmV2PC9vcHRpb24+CgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY29udGVudHMiPkNvbnRlbnRzPC9vcHRpb24+CgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iaW5kZXgiPkluZGV4PC9vcHRpb24+CgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iZ2xvc3NhcnkiPkdsb3NzYXJ5PC9vcHRpb24+CgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY29weXJpZ2h0Ij5Db3B5cmlnaHQ8L29wdGlvbj4KCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJjaGFwdGVyIj5DaGFwdGVyPC9vcHRpb24+CgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ic3Vic2VjdGlvbiI+U3Vic2VjdGlvbjwvb3B0aW9uPgoJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImFwcGVuZGl4Ij5BcHBlbmRpeDwvb3B0aW9uPgoJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImhlbHAiPkhlbHA8L29wdGlvbj4KCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJib29rbWFyayI+Qm9va21hcms8L29wdGlvbj4KCQkJCQkJCQkJCTwvc2VsZWN0PiAKCQkJCQkJCQkJPC90ZD4KCQkJCQkJCQk8L3RyPgoJCQkJCQkJPC90YWJsZT4KCQkJCQkJPC9kaXY+CgoJCQkJCQk8ZGl2IGlkPSJsaW5rX2FkdmFuY2VkX3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQk8dHI+CgkJCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iZWxlbWVudF9saW5rX2NoYXJzZXQiPnsjZnVsbHBhZ2VfZGxnLmNoYXJzZXR9PC9sYWJlbD48L3RkPiAKCQkJCQkJCQkJPHRkPjxzZWxlY3QgaWQ9ImVsZW1lbnRfbGlua19jaGFyc2V0Ij48b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj48L3NlbGVjdD48L3RkPgoJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPHRyPgoJCQkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImVsZW1lbnRfbGlua19ocmVmbGFuZyI+eyNmdWxscGFnZV9kbGcuaHJlZmxhbmd9PC9sYWJlbD48L3RkPiAKCQkJCQkJCQkJPHRkPjxpbnB1dCBpZD0iZWxlbWVudF9saW5rX2hyZWZsYW5nIiBuYW1lPSJlbGVtZW50X2xpbmtfaHJlZmxhbmciIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4KCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTx0cj4KCQkJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJlbGVtZW50X2xpbmtfdGFyZ2V0Ij57I2Z1bGxwYWdlX2RsZy50YXJnZXR9PC9sYWJlbD48L3RkPiAKCQkJCQkJCQkJPHRkPjxpbnB1dCBpZD0iZWxlbWVudF9saW5rX3RhcmdldCIgbmFtZT0iZWxlbWVudF9saW5rX3RhcmdldCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPgoJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPHRyPgoJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iZWxlbWVudF9zdHlsZV9yZXYiPnsjZnVsbHBhZ2VfZGxnLnJldn08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJlbGVtZW50X3N0eWxlX3JldiIgbmFtZT0iZWxlbWVudF9zdHlsZV9yZXYiPiAKCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYWx0ZXJuYXRlIj5BbHRlcm5hdGU8L29wdGlvbj4gCgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iZGVzaWduYXRlcyI+RGVzaWduYXRlczwvb3B0aW9uPiAKCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJzdHlsZXNoZWV0Ij5TdHlsZXNoZWV0PC9vcHRpb24+IAoJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InN0YXJ0Ij5TdGFydDwvb3B0aW9uPiAKCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJuZXh0Ij5OZXh0PC9vcHRpb24+IAoJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InByZXYiPlByZXY8L29wdGlvbj4gCgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY29udGVudHMiPkNvbnRlbnRzPC9vcHRpb24+IAoJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImluZGV4Ij5JbmRleDwvb3B0aW9uPiAKCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJnbG9zc2FyeSI+R2xvc3Nhcnk8L29wdGlvbj4gCgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY29weXJpZ2h0Ij5Db3B5cmlnaHQ8L29wdGlvbj4gCgkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY2hhcHRlciI+Q2hhcHRlcjwvb3B0aW9uPiAKCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJzdWJzZWN0aW9uIj5TdWJzZWN0aW9uPC9vcHRpb24+IAoJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImFwcGVuZGl4Ij5BcHBlbmRpeDwvb3B0aW9uPiAKCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJoZWxwIj5IZWxwPC9vcHRpb24+IAoJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImJvb2ttYXJrIj5Cb29rbWFyazwvb3B0aW9uPiAKCQkJCQkJCQkJCTwvc2VsZWN0PiAKCQkJCQkJCQkJPC90ZD4KCQkJCQkJCQk8L3RyPgoJCQkJCQkJPC90YWJsZT4KCQkJCQkJPC9kaXY+CgkJCQkJPC9kaXY+CgoJCQkJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJsaW5rX3VwZGF0ZWVsZW1lbnQiIGNsYXNzPSJ1cGRhdGVFbGVtZW50QnV0dG9uIiBuYW1lPSJ1cGRhdGUiIHZhbHVlPSJ7I3VwZGF0ZX0iIG9uY2xpY2s9InVwZGF0ZUVsZW1lbnQoKTsiIC8+CgkJCQk8L2ZpZWxkc2V0PgoKCQkJCTxmaWVsZHNldCBpZD0iY29tbWVudF9lbGVtZW50Ij4KCQkJCQk8bGVnZW5kPnsjZnVsbHBhZ2VfZGxnLmNvbW1lbnRfZWxlbWVudH08L2xlZ2VuZD4KCgkJCQkJPHRleHRhcmVhIGlkPSJlbGVtZW50X2NvbW1lbnRfdmFsdWUiPjwvdGV4dGFyZWE+CgoJCQkJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJjb21tZW50X3VwZGF0ZWVsZW1lbnQiIGNsYXNzPSJ1cGRhdGVFbGVtZW50QnV0dG9uIiBuYW1lPSJ1cGRhdGUiIHZhbHVlPSJ7I3VwZGF0ZX0iIG9uY2xpY2s9InVwZGF0ZUVsZW1lbnQoKTsiIC8+CgkJCQk8L2ZpZWxkc2V0PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCgkJPGRpdiBjbGFzcz0ibWNlQWN0aW9uUGFuZWwiPgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBpZD0iaW5zZXJ0IiBuYW1lPSJ1cGRhdGUiIHZhbHVlPSJ7I3VwZGF0ZX0iIC8+CgkJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJjYW5jZWwiIG5hbWU9ImNhbmNlbCIgdmFsdWU9InsjY2FuY2VsfSIgb25jbGljaz0idGlueU1DRVBvcHVwLmNsb3NlKCk7IiAvPgoJCTwvZGl2PgogICAgPC9mb3JtPgo8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullpage/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullpage/js/fullpage.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBmdWxscGFnZS5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCnRpbnlNQ0VQb3B1cC5yZXF1aXJlTGFuZ1BhY2soKTsNCg0KdmFyIGRvYzsNCg0KdmFyIGRlZmF1bHREb2NUeXBlcyA9IA0KCSdYSFRNTCAxLjAgVHJhbnNpdGlvbmFsPTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4sJyArDQoJJ1hIVE1MIDEuMCBGcmFtZXNldD08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGQiPiwnICsNCgknWEhUTUwgMS4wIFN0cmljdD08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+LCcgKw0KCSdYSFRNTCAxLjE9PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPiwnICsNCgknSFRNTCA0LjAxIFRyYW5zaXRpb25hbD08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4sJyArDQoJJ0hUTUwgNC4wMSBTdHJpY3Q9PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+LCcgKw0KCSdIVE1MIDQuMDEgRnJhbWVzZXQ9PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvZnJhbWVzZXQuZHRkIj4nOw0KDQp2YXIgZGVmYXVsdEVuY29kaW5ncyA9IA0KCSdXZXN0ZXJuIGV1cm9wZWFuIChpc28tODg1OS0xKT1pc28tODg1OS0xLCcgKw0KCSdDZW50cmFsIEV1cm9wZWFuIChpc28tODg1OS0yKT1pc28tODg1OS0yLCcgKw0KCSdVbmljb2RlIChVVEYtOCk9dXRmLTgsJyArDQoJJ0NoaW5lc2UgdHJhZGl0aW9uYWwgKEJpZzUpPWJpZzUsJyArDQoJJ0N5cmlsbGljIChpc28tODg1OS01KT1pc28tODg1OS01LCcgKw0KCSdKYXBhbmVzZSAoaXNvLTIwMjItanApPWlzby0yMDIyLWpwLCcgKw0KCSdHcmVlayAoaXNvLTg4NTktNyk9aXNvLTg4NTktNywnICsNCgknS29yZWFuIChpc28tMjAyMi1rcik9aXNvLTIwMjIta3IsJyArDQoJJ0FTQ0lJICh1cy1hc2NpaSk9dXMtYXNjaWknOw0KDQp2YXIgZGVmYXVsdE1lZGlhVHlwZXMgPSANCgknYWxsPWFsbCwnICsNCgknc2NyZWVuPXNjcmVlbiwnICsNCgkncHJpbnQ9cHJpbnQsJyArDQoJJ3R0eT10dHksJyArDQoJJ3R2PXR2LCcgKw0KCSdwcm9qZWN0aW9uPXByb2plY3Rpb24sJyArDQoJJ2hhbmRoZWxkPWhhbmRoZWxkLCcgKw0KCSdicmFpbGxlPWJyYWlsbGUsJyArDQoJJ2F1cmFsPWF1cmFsJzsNCg0KdmFyIGRlZmF1bHRGb250TmFtZXMgPSAnQXJpYWw9YXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Q291cmllciBOZXc9Y291cmllciBuZXcsY291cmllcixtb25vc3BhY2U7R2VvcmdpYT1nZW9yZ2lhLHRpbWVzIG5ldyByb21hbix0aW1lcyxzZXJpZjtUYWhvbWE9dGFob21hLGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmO1RpbWVzIE5ldyBSb21hbj10aW1lcyBuZXcgcm9tYW4sdGltZXMsc2VyaWY7VmVyZGFuYT12ZXJkYW5hLGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmO0ltcGFjdD1pbXBhY3Q7V2luZ0RpbmdzPXdpbmdkaW5ncyc7DQp2YXIgZGVmYXVsdEZvbnRTaXplcyA9ICcxMHB4LDExcHgsMTJweCwxM3B4LDE0cHgsMTVweCwxNnB4JzsNCg0KZnVuY3Rpb24gaW5pdCgpIHsNCgl2YXIgZiA9IGRvY3VtZW50LmZvcm1zWydmdWxscGFnZSddLCBlbCA9IGYuZWxlbWVudHMsIGUsIGksIHAsIGRvY3R5cGVzLCBlbmNvZGluZ3MsIG1lZGlhVHlwZXMsIGZvbnRzLCBlZCA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IsIGRvbSA9IHRpbnlNQ0VQb3B1cC5kb20sIHN0eWxlOw0KDQoJLy8gU2V0dXAgZG9jdHlwZSBzZWxlY3QgYm94DQoJZG9jdHlwZXMgPSBlZC5nZXRQYXJhbSgiZnVsbHBhZ2VfZG9jdHlwZXMiLCBkZWZhdWx0RG9jVHlwZXMpLnNwbGl0KCcsJyk7DQoJZm9yIChpPTA7IGk8ZG9jdHlwZXMubGVuZ3RoOyBpKyspIHsNCgkJcCA9IGRvY3R5cGVzW2ldLnNwbGl0KCc9Jyk7DQoNCgkJaWYgKHAubGVuZ3RoID4gMSkNCgkJCWFkZFNlbGVjdFZhbHVlKGYsICdkb2N0eXBlcycsIHBbMF0sIHBbMV0pOw0KCX0NCg0KCS8vIFNldHVwIGZvbnRzIHNlbGVjdCBib3gNCglmb250cyA9IGVkLmdldFBhcmFtKCJmdWxscGFnZV9mb250cyIsIGRlZmF1bHRGb250TmFtZXMpLnNwbGl0KCc7Jyk7DQoJZm9yIChpPTA7IGk8Zm9udHMubGVuZ3RoOyBpKyspIHsNCgkJcCA9IGZvbnRzW2ldLnNwbGl0KCc9Jyk7DQoNCgkJaWYgKHAubGVuZ3RoID4gMSkNCgkJCWFkZFNlbGVjdFZhbHVlKGYsICdmb250ZmFjZScsIHBbMF0sIHBbMV0pOw0KCX0NCg0KCS8vIFNldHVwIGZvbnRzaXplIHNlbGVjdCBib3gNCglmb250cyA9IGVkLmdldFBhcmFtKCJmdWxscGFnZV9mb250c2l6ZXMiLCBkZWZhdWx0Rm9udFNpemVzKS5zcGxpdCgnLCcpOw0KCWZvciAoaT0wOyBpPGZvbnRzLmxlbmd0aDsgaSsrKQ0KCQlhZGRTZWxlY3RWYWx1ZShmLCAnZm9udHNpemUnLCBmb250c1tpXSwgZm9udHNbaV0pOw0KDQoJLy8gU2V0dXAgbWVkaWF0eXBlIHNlbGVjdCBib3hzDQoJbWVkaWFUeXBlcyA9IGVkLmdldFBhcmFtKCJmdWxscGFnZV9tZWRpYV90eXBlcyIsIGRlZmF1bHRNZWRpYVR5cGVzKS5zcGxpdCgnLCcpOw0KCWZvciAoaT0wOyBpPG1lZGlhVHlwZXMubGVuZ3RoOyBpKyspIHsNCgkJcCA9IG1lZGlhVHlwZXNbaV0uc3BsaXQoJz0nKTsNCg0KCQlpZiAocC5sZW5ndGggPiAxKSB7DQoJCQlhZGRTZWxlY3RWYWx1ZShmLCAnZWxlbWVudF9zdHlsZV9tZWRpYScsIHBbMF0sIHBbMV0pOw0KCQkJYWRkU2VsZWN0VmFsdWUoZiwgJ2VsZW1lbnRfbGlua19tZWRpYScsIHBbMF0sIHBbMV0pOw0KCQl9DQoJfQ0KDQoJLy8gU2V0dXAgZW5jb2RpbmdzIHNlbGVjdCBib3gNCgllbmNvZGluZ3MgPSBlZC5nZXRQYXJhbSgiZnVsbHBhZ2VfZW5jb2RpbmdzIiwgZGVmYXVsdEVuY29kaW5ncykuc3BsaXQoJywnKTsNCglmb3IgKGk9MDsgaTxlbmNvZGluZ3MubGVuZ3RoOyBpKyspIHsNCgkJcCA9IGVuY29kaW5nc1tpXS5zcGxpdCgnPScpOw0KDQoJCWlmIChwLmxlbmd0aCA+IDEpIHsNCgkJCWFkZFNlbGVjdFZhbHVlKGYsICdkb2NlbmNvZGluZycsIHBbMF0sIHBbMV0pOw0KCQkJYWRkU2VsZWN0VmFsdWUoZiwgJ2VsZW1lbnRfc2NyaXB0X2NoYXJzZXQnLCBwWzBdLCBwWzFdKTsNCgkJCWFkZFNlbGVjdFZhbHVlKGYsICdlbGVtZW50X2xpbmtfY2hhcnNldCcsIHBbMF0sIHBbMV0pOw0KCQl9DQoJfQ0KDQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JnY29sb3JfcGlja2NvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldENvbG9yUGlja2VySFRNTCgnYmdjb2xvcl9waWNrJywnYmdjb2xvcicpOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaW5rX2NvbG9yX3BpY2tjb250YWluZXInKS5pbm5lckhUTUwgPSBnZXRDb2xvclBpY2tlckhUTUwoJ2xpbmtfY29sb3JfcGljaycsJ2xpbmtfY29sb3InKTsNCgkvL2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdob3Zlcl9jb2xvcl9waWNrY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0Q29sb3JQaWNrZXJIVE1MKCdob3Zlcl9jb2xvcl9waWNrJywnaG92ZXJfY29sb3InKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlzaXRlZF9jb2xvcl9waWNrY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0Q29sb3JQaWNrZXJIVE1MKCd2aXNpdGVkX2NvbG9yX3BpY2snLCd2aXNpdGVkX2NvbG9yJyk7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjdGl2ZV9jb2xvcl9waWNrY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0Q29sb3JQaWNrZXJIVE1MKCdhY3RpdmVfY29sb3JfcGljaycsJ2FjdGl2ZV9jb2xvcicpOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXh0Y29sb3JfcGlja2NvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldENvbG9yUGlja2VySFRNTCgndGV4dGNvbG9yX3BpY2snLCd0ZXh0Y29sb3InKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3R5bGVzaGVldF9icm93c2VyY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0QnJvd3NlckhUTUwoJ3N0eWxlc2hlZXRicm93c2VyJywnc3R5bGVzaGVldCcsJ2ZpbGUnLCdmdWxscGFnZScpOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaW5rX2hyZWZfcGlja2NvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldEJyb3dzZXJIVE1MKCdsaW5rX2hyZWZfYnJvd3NlcicsJ2VsZW1lbnRfbGlua19ocmVmJywnZmlsZScsJ2Z1bGxwYWdlJyk7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjcmlwdF9zcmNfcGlja2NvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldEJyb3dzZXJIVE1MKCdzY3JpcHRfc3JjX2Jyb3dzZXInLCdlbGVtZW50X3NjcmlwdF9zcmMnLCdmaWxlJywnZnVsbHBhZ2UnKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmdpbWFnZV9waWNrY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0QnJvd3NlckhUTUwoJ2JnaW1hZ2VfYnJvd3NlcicsJ2JnaW1hZ2UnLCdpbWFnZScsJ2Z1bGxwYWdlJyk7DQoNCgkvLyBSZXNpemUgc29tZSBlbGVtZW50cw0KCWlmIChpc1Zpc2libGUoJ3N0eWxlc2hlZXRicm93c2VyJykpDQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdHlsZXNoZWV0Jykuc3R5bGUud2lkdGggPSAnMjIwcHgnOw0KDQoJaWYgKGlzVmlzaWJsZSgnbGlua19ocmVmX2Jyb3dzZXInKSkNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VsZW1lbnRfbGlua19ocmVmJykuc3R5bGUud2lkdGggPSAnMjMwcHgnOw0KDQoJaWYgKGlzVmlzaWJsZSgnYmdpbWFnZV9icm93c2VyJykpDQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZ2ltYWdlJykuc3R5bGUud2lkdGggPSAnMjEwcHgnOw0KDQoJLy8gQWRkIGlmcmFtZQ0KCWRvbS5hZGQoZG9jdW1lbnQuYm9keSwgJ2lmcmFtZScsIHtpZCA6ICdkb2N1bWVudElmcmFtZScsIHNyYyA6ICdqYXZhc2NyaXB0OiIiJywgc3R5bGUgOiB7ZGlzcGxheSA6ICdub25lJ319KTsNCglkb2MgPSBkb20uZ2V0KCdkb2N1bWVudElmcmFtZScpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7DQoJaCA9IHRpbnlNQ0VQb3B1cC5nZXRXaW5kb3dBcmcoJ2hlYWRfaHRtbCcpOw0KDQoJLy8gUHJlcHJvY2VzcyB0aGUgSFRNTCBkaXNhYmxlIHNjcmlwdHMgYW5kIHVybHMNCgloID0gaC5yZXBsYWNlKC88c2NyaXB0Pi9naSwgJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4nKTsNCgloID0gaC5yZXBsYWNlKC90eXBlPShbXCJcJ10pPy9naSwgJ3R5cGU9JDEtbWNlLScpOw0KCWggPSBoLnJlcGxhY2UoLyhzcmM9fGhyZWY9KS9nLCAnX21jZV8kMScpOw0KDQoJLy8gV3JpdGUgaW4gdGhlIGNvbnRlbnQgaW4gdGhlIGlmcmFtZQ0KCWRvYy53cml0ZShoICsgJzwvYm9keT48L2h0bWw+Jyk7DQoJZG9jLmNsb3NlKCk7DQoNCgkvLyBQYXJzZSB4bWwgYW5kIGRvY3R5cGUNCgl4bWxWZXIgPSBnZXRSZUl0ZW0oLzxcP1xzKj94bWwuKj92ZXJzaW9uXHMqPz1ccyo/IiguKj8pIi4qP1w/Pi9naSwgaCwgMSk7DQoJeG1sRW5jID0gZ2V0UmVJdGVtKC88XD9ccyo/eG1sLio/ZW5jb2Rpbmdccyo/PVxzKj8iKC4qPykiLio/XD8+L2dpLCBoLCAxKTsNCglkb2NUeXBlID0gZ2V0UmVJdGVtKC88XCFET0NUWVBFLio/Pi9naSwgaC5yZXBsYWNlKC9cbi9nLCAnJyksIDApLnJlcGxhY2UoLyArL2csICcgJyk7DQoJZi5sYW5nY29kZS52YWx1ZSA9IGdldFJlSXRlbSgvbGFuZz0iKC4qPykiL2dpLCBoLCAxKTsNCg0KCS8vIFBhcnNlIHRpdGxlDQoJaWYgKGUgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RpdGxlJylbMF0pDQoJCWVsLm1ldGF0aXRsZS52YWx1ZSA9IGUudGV4dENvbnRlbnQgfHwgZS50ZXh0Ow0KDQoJLy8gUGFyc2UgbWV0YQ0KCXRpbnltY2UuZWFjaChkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21ldGEnKSwgZnVuY3Rpb24obikgew0KCQl2YXIgbmEgPSAobi5nZXRBdHRyaWJ1dGUoJ25hbWUnLCAyKSB8fCAnJykudG9Mb3dlckNhc2UoKSwgdmEgPSBuLmdldEF0dHJpYnV0ZSgnY29udGVudCcsIDIpLCBlcSA9IG4uZ2V0QXR0cmlidXRlKCdodHRwRXF1aXYnLCAyKSB8fCAnJzsNCg0KCQllID0gZWxbJ21ldGEnICsgbmFdOw0KDQoJCWlmIChuYSA9PSAncm9ib3RzJykgew0KCQkJc2VsZWN0QnlWYWx1ZShmLCAnbWV0YXJvYm90cycsIHRpbnltY2UudHJpbSh2YSksIHRydWUsIHRydWUpOw0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJc3dpdGNoIChlcS50b0xvd2VyQ2FzZSgpKSB7DQoJCQljYXNlICJjb250ZW50LXR5cGUiOg0KCQkJCXRtcCA9IGdldFJlSXRlbSgvY2hhcnNldFxzKj1ccyooLiopXHMqL2dpLCB2YSwgMSk7DQoNCgkJCQkvLyBPdmVycmlkZSBYTUwgZW5jb2RpbmcNCgkJCQlpZiAodG1wICE9ICIiKQ0KCQkJCQl4bWxFbmMgPSB0bXA7DQoNCgkJCQlyZXR1cm47DQoJCX0NCg0KCQlpZiAoZSkNCgkJCWUudmFsdWUgPSB2YTsNCgl9KTsNCg0KCXNlbGVjdEJ5VmFsdWUoZiwgJ2RvY3R5cGVzJywgZG9jVHlwZSwgdHJ1ZSwgdHJ1ZSk7DQoJc2VsZWN0QnlWYWx1ZShmLCAnZG9jZW5jb2RpbmcnLCB4bWxFbmMsIHRydWUsIHRydWUpOw0KCXNlbGVjdEJ5VmFsdWUoZiwgJ2xhbmdkaXInLCBkb2MuYm9keS5nZXRBdHRyaWJ1dGUoJ2RpcicsIDIpIHx8ICcnLCB0cnVlLCB0cnVlKTsNCg0KCWlmICh4bWxWZXIgIT0gJycpDQoJCWVsLnhtbF9waS5jaGVja2VkID0gdHJ1ZTsNCg0KCS8vIFBhcnNlIGFwcGVhcmFuY2UNCg0KCS8vIFBhcnNlIHByaW1hcnkgc3R5bGVzaGVldA0KCXRpbnltY2UuZWFjaChkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKSwgZnVuY3Rpb24obCkgew0KCQl2YXIgbSA9IGwuZ2V0QXR0cmlidXRlKCdtZWRpYScsIDIpIHx8ICcnLCB0ID0gbC5nZXRBdHRyaWJ1dGUoJ3R5cGUnLCAyKSB8fCAnJzsNCg0KCQlpZiAodCA9PSAiLW1jZS10ZXh0L2NzcyIgJiYgKG0gPT0gIiIgfHwgbSA9PSAic2NyZWVuIiB8fCBtID09ICJhbGwiKSAmJiAobC5nZXRBdHRyaWJ1dGUoJ3JlbCcsIDIpIHx8ICcnKSA9PSAic3R5bGVzaGVldCIpIHsNCgkJCWYuc3R5bGVzaGVldC52YWx1ZSA9IGwuZ2V0QXR0cmlidXRlKCdfbWNlX2hyZWYnLCAyKSB8fCAnJzsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0pOw0KDQoJLy8gR2V0IGZyb20gc3R5bGUgZWxlbWVudHMNCgl0aW55bWNlLmVhY2goZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHlsZSIpLCBmdW5jdGlvbihzdCkgew0KCQl2YXIgdG1wID0gcGFyc2VTdHlsZUVsZW1lbnQoc3QpOw0KDQoJCWZvciAoeD0wOyB4PHRtcC5sZW5ndGg7IHgrKykgew0KCQkJaWYgKHRtcFt4XS5ydWxlLmluZGV4T2YoJ2E6dmlzaXRlZCcpICE9IC0xICYmIHRtcFt4XS5kYXRhWydjb2xvciddKQ0KCQkJCWYudmlzaXRlZF9jb2xvci52YWx1ZSA9IHRtcFt4XS5kYXRhWydjb2xvciddOw0KDQoJCQlpZiAodG1wW3hdLnJ1bGUuaW5kZXhPZignYTpsaW5rJykgIT0gLTEgJiYgdG1wW3hdLmRhdGFbJ2NvbG9yJ10pDQoJCQkJZi5saW5rX2NvbG9yLnZhbHVlID0gdG1wW3hdLmRhdGFbJ2NvbG9yJ107DQoNCgkJCWlmICh0bXBbeF0ucnVsZS5pbmRleE9mKCdhOmFjdGl2ZScpICE9IC0xICYmIHRtcFt4XS5kYXRhWydjb2xvciddKQ0KCQkJCWYuYWN0aXZlX2NvbG9yLnZhbHVlID0gdG1wW3hdLmRhdGFbJ2NvbG9yJ107DQoJCX0NCgl9KTsNCg0KCWYudGV4dGNvbG9yLnZhbHVlID0gdGlueU1DRVBvcHVwLmRvbS5nZXRBdHRyaWIoZG9jLmJvZHksICJ0ZXh0Iik7DQoJZi5hY3RpdmVfY29sb3IudmFsdWUgPSB0aW55TUNFUG9wdXAuZG9tLmdldEF0dHJpYihkb2MuYm9keSwgImFsaW5rIik7DQoJZi5saW5rX2NvbG9yLnZhbHVlID0gdGlueU1DRVBvcHVwLmRvbS5nZXRBdHRyaWIoZG9jLmJvZHksICJsaW5rIik7DQoJZi52aXNpdGVkX2NvbG9yLnZhbHVlID0gdGlueU1DRVBvcHVwLmRvbS5nZXRBdHRyaWIoZG9jLmJvZHksICJ2bGluayIpOw0KCWYuYmdjb2xvci52YWx1ZSA9IHRpbnlNQ0VQb3B1cC5kb20uZ2V0QXR0cmliKGRvYy5ib2R5LCAiYmdjb2xvciIpOw0KCWYuYmdpbWFnZS52YWx1ZSA9IHRpbnlNQ0VQb3B1cC5kb20uZ2V0QXR0cmliKGRvYy5ib2R5LCAiYmFja2dyb3VuZCIpOw0KDQoJLy8gR2V0IGZyb20gc3R5bGUgaW5mbw0KCXN0eWxlID0gdGlueU1DRVBvcHVwLmRvbS5wYXJzZVN0eWxlKHRpbnlNQ0VQb3B1cC5kb20uZ2V0QXR0cmliKGRvYy5ib2R5LCAnc3R5bGUnKSk7DQoNCglpZiAoc3R5bGVbJ2ZvbnQtZmFtaWx5J10pDQoJCXNlbGVjdEJ5VmFsdWUoZiwgJ2ZvbnRmYWNlJywgc3R5bGVbJ2ZvbnQtZmFtaWx5J10sIHRydWUsIHRydWUpOw0KCWVsc2UNCgkJc2VsZWN0QnlWYWx1ZShmLCAnZm9udGZhY2UnLCBlZC5nZXRQYXJhbSgiZnVsbHBhZ2VfZGVmYXVsdF9mb250ZmFjZSIsICIiKSwgdHJ1ZSwgdHJ1ZSk7DQoNCglpZiAoc3R5bGVbJ2ZvbnQtc2l6ZSddKQ0KCQlzZWxlY3RCeVZhbHVlKGYsICdmb250c2l6ZScsIHN0eWxlWydmb250LXNpemUnXSwgdHJ1ZSwgdHJ1ZSk7DQoJZWxzZQ0KCQlzZWxlY3RCeVZhbHVlKGYsICdmb250c2l6ZScsIGVkLmdldFBhcmFtKCJmdWxscGFnZV9kZWZhdWx0X2ZvbnRzaXplIiwgIiIpLCB0cnVlLCB0cnVlKTsNCg0KCWlmIChzdHlsZVsnY29sb3InXSkNCgkJZi50ZXh0Y29sb3IudmFsdWUgPSBjb252ZXJ0UkdCVG9IZXgoc3R5bGVbJ2NvbG9yJ10pOw0KDQoJaWYgKHN0eWxlWydiYWNrZ3JvdW5kLWltYWdlJ10pDQoJCWYuYmdpbWFnZS52YWx1ZSA9IHN0eWxlWydiYWNrZ3JvdW5kLWltYWdlJ10ucmVwbGFjZShuZXcgUmVnRXhwKCJ1cmxcXCgnPyhbXiddKiknP1xcKSIsICdnaScpLCAiJDEiKTsNCg0KCWlmIChzdHlsZVsnYmFja2dyb3VuZC1jb2xvciddKQ0KCQlmLmJnY29sb3IudmFsdWUgPSBzdHlsZVsnYmFja2dyb3VuZC1jb2xvciddOw0KDQoJaWYgKHN0eWxlWydtYXJnaW4nXSkgew0KCQl0bXAgPSBzdHlsZVsnbWFyZ2luJ10ucmVwbGFjZSgvW14wLTkgXS9nLCAnJyk7DQoJCXRtcCA9IHRtcC5zcGxpdCgvICsvKTsNCgkJZi50b3BtYXJnaW4udmFsdWUgPSB0bXAubGVuZ3RoID4gMCA/IHRtcFswXSA6ICcnOw0KCQlmLnJpZ2h0bWFyZ2luLnZhbHVlID0gdG1wLmxlbmd0aCA+IDEgPyB0bXBbMV0gOiB0bXBbMF07DQoJCWYuYm90dG9tbWFyZ2luLnZhbHVlID0gdG1wLmxlbmd0aCA+IDIgPyB0bXBbMl0gOiB0bXBbMF07DQoJCWYubGVmdG1hcmdpbi52YWx1ZSA9IHRtcC5sZW5ndGggPiAzID8gdG1wWzNdIDogdG1wWzBdOw0KCX0NCg0KCWlmIChzdHlsZVsnbWFyZ2luLWxlZnQnXSkNCgkJZi5sZWZ0bWFyZ2luLnZhbHVlID0gc3R5bGVbJ21hcmdpbi1sZWZ0J10ucmVwbGFjZSgvW14wLTldL2csICcnKTsNCg0KCWlmIChzdHlsZVsnbWFyZ2luLXJpZ2h0J10pDQoJCWYucmlnaHRtYXJnaW4udmFsdWUgPSBzdHlsZVsnbWFyZ2luLXJpZ2h0J10ucmVwbGFjZSgvW14wLTldL2csICcnKTsNCg0KCWlmIChzdHlsZVsnbWFyZ2luLXRvcCddKQ0KCQlmLnRvcG1hcmdpbi52YWx1ZSA9IHN0eWxlWydtYXJnaW4tdG9wJ10ucmVwbGFjZSgvW14wLTldL2csICcnKTsNCg0KCWlmIChzdHlsZVsnbWFyZ2luLWJvdHRvbSddKQ0KCQlmLmJvdHRvbW1hcmdpbi52YWx1ZSA9IHN0eWxlWydtYXJnaW4tYm90dG9tJ10ucmVwbGFjZSgvW14wLTldL2csICcnKTsNCg0KCWYuc3R5bGUudmFsdWUgPSB0aW55TUNFUG9wdXAuZG9tLnNlcmlhbGl6ZVN0eWxlKHN0eWxlKTsNCg0KCS8vIFVwZGF0ZSBjb2xvcnMNCgl1cGRhdGVDb2xvcigndGV4dGNvbG9yX3BpY2snLCAndGV4dGNvbG9yJyk7DQoJdXBkYXRlQ29sb3IoJ2JnY29sb3JfcGljaycsICdiZ2NvbG9yJyk7DQoJdXBkYXRlQ29sb3IoJ3Zpc2l0ZWRfY29sb3JfcGljaycsICd2aXNpdGVkX2NvbG9yJyk7DQoJdXBkYXRlQ29sb3IoJ2FjdGl2ZV9jb2xvcl9waWNrJywgJ2FjdGl2ZV9jb2xvcicpOw0KCXVwZGF0ZUNvbG9yKCdsaW5rX2NvbG9yX3BpY2snLCAnbGlua19jb2xvcicpOw0KfQ0KDQpmdW5jdGlvbiBnZXRSZUl0ZW0ociwgcywgaSkgew0KCXZhciBjID0gci5leGVjKHMpOw0KDQoJaWYgKGMgJiYgYy5sZW5ndGggPiBpKQ0KCQlyZXR1cm4gY1tpXTsNCg0KCXJldHVybiAnJzsNCn0NCg0KZnVuY3Rpb24gdXBkYXRlQWN0aW9uKCkgew0KCXZhciBmID0gZG9jdW1lbnQuZm9ybXNbMF0sIG5sLCBpLCBoLCB2LCBzLCBoZWFkLCBodG1sLCBsLCB0bXAsIGFkZGxpbmsgPSB0cnVlLCBzZXI7DQoNCgloZWFkID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07DQoNCgkvLyBGaXggc2NyaXB0cyB3aXRob3V0IGEgdHlwZQ0KCW5sID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTsNCglmb3IgKGk9MDsgaTxubC5sZW5ndGg7IGkrKykgew0KCQlpZiAodGlueU1DRVBvcHVwLmRvbS5nZXRBdHRyaWIobmxbaV0sICdfbWNlX3R5cGUnKSA9PSAnJykNCgkJCW5sW2ldLnNldEF0dHJpYnV0ZSgnX21jZV90eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpOw0KCX0NCg0KCS8vIEdldCBwcmltYXJ5IHN0eWxlc2hlZXQNCglubCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpOw0KCWZvciAoaT0wOyBpPG5sLmxlbmd0aDsgaSsrKSB7DQoJCWwgPSBubFtpXTsNCg0KCQl0bXAgPSB0aW55TUNFUG9wdXAuZG9tLmdldEF0dHJpYihsLCAnbWVkaWEnKTsNCg0KCQlpZiAodGlueU1DRVBvcHVwLmRvbS5nZXRBdHRyaWIobCwgJ19tY2VfdHlwZScpID09ICJ0ZXh0L2NzcyIgJiYgKHRtcCA9PSAiIiB8fCB0bXAgPT0gInNjcmVlbiIgfHwgdG1wID09ICJhbGwiKSAmJiB0aW55TUNFUG9wdXAuZG9tLmdldEF0dHJpYihsLCAncmVsJykgPT0gInN0eWxlc2hlZXQiKSB7DQoJCQlhZGRsaW5rID0gZmFsc2U7DQoNCgkJCWlmIChmLnN0eWxlc2hlZXQudmFsdWUgPT0gJycpDQoJCQkJbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpOw0KCQkJZWxzZQ0KCQkJCWwuc2V0QXR0cmlidXRlKCdfbWNlX2hyZWYnLCBmLnN0eWxlc2hlZXQudmFsdWUpOw0KDQoJCQlicmVhazsNCgkJfQ0KCX0NCg0KCS8vIEFkZCBuZXcgbGluaw0KCWlmIChmLnN0eWxlc2hlZXQudmFsdWUgIT0gJycpIHsNCgkJbCA9IGRvYy5jcmVhdGVFbGVtZW50KCdsaW5rJyk7DQoNCgkJbC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9jc3MnKTsNCgkJbC5zZXRBdHRyaWJ1dGUoJ19tY2VfaHJlZicsIGYuc3R5bGVzaGVldC52YWx1ZSk7DQoJCWwuc2V0QXR0cmlidXRlKCdyZWwnLCAnc3R5bGVzaGVldCcpOw0KDQoJCWhlYWQuYXBwZW5kQ2hpbGQobCk7DQoJfQ0KDQoJc2V0TWV0YShoZWFkLCAna2V5d29yZHMnLCBmLm1ldGFrZXl3b3Jkcy52YWx1ZSk7DQoJc2V0TWV0YShoZWFkLCAnZGVzY3JpcHRpb24nLCBmLm1ldGFkZXNjcmlwdGlvbi52YWx1ZSk7DQoJc2V0TWV0YShoZWFkLCAnYXV0aG9yJywgZi5tZXRhYXV0aG9yLnZhbHVlKTsNCglzZXRNZXRhKGhlYWQsICdjb3B5cmlnaHQnLCBmLm1ldGFjb3B5cmlnaHQudmFsdWUpOw0KCXNldE1ldGEoaGVhZCwgJ3JvYm90cycsIGdldFNlbGVjdFZhbHVlKGYsICdtZXRhcm9ib3RzJykpOw0KCXNldE1ldGEoaGVhZCwgJ0NvbnRlbnQtVHlwZScsIGdldFNlbGVjdFZhbHVlKGYsICdkb2NlbmNvZGluZycpKTsNCg0KCWRvYy5ib2R5LmRpciA9IGdldFNlbGVjdFZhbHVlKGYsICdsYW5nZGlyJyk7DQoJZG9jLmJvZHkuc3R5bGUuY3NzVGV4dCA9IGYuc3R5bGUudmFsdWU7DQoNCglkb2MuYm9keS5zZXRBdHRyaWJ1dGUoJ3ZMaW5rJywgZi52aXNpdGVkX2NvbG9yLnZhbHVlKTsNCglkb2MuYm9keS5zZXRBdHRyaWJ1dGUoJ2xpbmsnLCBmLmxpbmtfY29sb3IudmFsdWUpOw0KCWRvYy5ib2R5LnNldEF0dHJpYnV0ZSgndGV4dCcsIGYudGV4dGNvbG9yLnZhbHVlKTsNCglkb2MuYm9keS5zZXRBdHRyaWJ1dGUoJ2FMaW5rJywgZi5hY3RpdmVfY29sb3IudmFsdWUpOw0KDQoJZG9jLmJvZHkuc3R5bGUuZm9udEZhbWlseSA9IGdldFNlbGVjdFZhbHVlKGYsICdmb250ZmFjZScpOw0KCWRvYy5ib2R5LnN0eWxlLmZvbnRTaXplID0gZ2V0U2VsZWN0VmFsdWUoZiwgJ2ZvbnRzaXplJyk7DQoJZG9jLmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gZi5iZ2NvbG9yLnZhbHVlOw0KDQoJaWYgKGYubGVmdG1hcmdpbi52YWx1ZSAhPSAnJykNCgkJZG9jLmJvZHkuc3R5bGUubWFyZ2luTGVmdCA9IGYubGVmdG1hcmdpbi52YWx1ZSArICdweCc7DQoNCglpZiAoZi5yaWdodG1hcmdpbi52YWx1ZSAhPSAnJykNCgkJZG9jLmJvZHkuc3R5bGUubWFyZ2luUmlnaHQgPSBmLnJpZ2h0bWFyZ2luLnZhbHVlICsgJ3B4JzsNCg0KCWlmIChmLmJvdHRvbW1hcmdpbi52YWx1ZSAhPSAnJykNCgkJZG9jLmJvZHkuc3R5bGUubWFyZ2luQm90dG9tID0gZi5ib3R0b21tYXJnaW4udmFsdWUgKyAncHgnOw0KDQoJaWYgKGYudG9wbWFyZ2luLnZhbHVlICE9ICcnKQ0KCQlkb2MuYm9keS5zdHlsZS5tYXJnaW5Ub3AgPSBmLnRvcG1hcmdpbi52YWx1ZSArICdweCc7DQoNCglodG1sID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF07DQoJaHRtbC5zZXRBdHRyaWJ1dGUoJ2xhbmcnLCBmLmxhbmdjb2RlLnZhbHVlKTsNCglodG1sLnNldEF0dHJpYnV0ZSgneG1sOmxhbmcnLCBmLmxhbmdjb2RlLnZhbHVlKTsNCg0KCWlmIChmLmJnaW1hZ2UudmFsdWUgIT0gJycpDQoJCWRvYy5ib2R5LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoJyIgKyBmLmJnaW1hZ2UudmFsdWUgKyAiJykiOw0KCWVsc2UNCgkJZG9jLmJvZHkuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJyc7DQoNCglzZXIgPSB0aW55TUNFUG9wdXAuZWRpdG9yLnBsdWdpbnMuZnVsbHBhZ2UuX2NyZWF0ZVNlcmlhbGl6ZXIoKTsNCglzZXIuc2V0UnVsZXMoJy10aXRsZSxtZXRhW2h0dHAtZXF1aXZ8bmFtZXxjb250ZW50XSxiYXNlW2hyZWZ8dGFyZ2V0XSxsaW5rW2hyZWZ8cmVsfHR5cGV8dGl0bGV8bWVkaWFdLHN0eWxlW3R5cGVdLHNjcmlwdFt0eXBlfGxhbmd1YWdlfHNyY10saHRtbFtsYW5nfHhtbDo6bGFuZ3x4bWxuc10sYm9keVtzdHlsZXxkaXJ8dmxpbmt8bGlua3x0ZXh0fGFsaW5rXSxoZWFkJyk7DQoNCgloID0gc2VyLnNlcmlhbGl6ZShkb2MuZG9jdW1lbnRFbGVtZW50KTsNCgloID0gaC5zdWJzdHJpbmcoMCwgaC5sYXN0SW5kZXhPZignPC9ib2R5PicpKTsNCg0KCWlmIChoLmluZGV4T2YoJzx0aXRsZT4nKSA9PSAtMSkNCgkJaCA9IGgucmVwbGFjZSgvPGhlYWQuKj8+LywgJyQmXG4nICsgJzx0aXRsZT4nICsgdGlueU1DRVBvcHVwLmRvbS5lbmNvZGUoZi5tZXRhdGl0bGUudmFsdWUpICsgJzwvdGl0bGU+Jyk7DQoJZWxzZQ0KCQloID0gaC5yZXBsYWNlKC88dGl0bGU+KC4qPyk8XC90aXRsZT4vLCAnPHRpdGxlPicgKyB0aW55TUNFUG9wdXAuZG9tLmVuY29kZShmLm1ldGF0aXRsZS52YWx1ZSkgKyAnPC90aXRsZT4nKTsNCg0KCWlmICgodiA9IGdldFNlbGVjdFZhbHVlKGYsICdkb2N0eXBlcycpKSAhPSAnJykNCgkJaCA9IHYgKyAnXG4nICsgaDsNCg0KCWlmIChmLnhtbF9waS5jaGVja2VkKSB7DQoJCXMgPSAnPD94bWwgdmVyc2lvbj0iMS4wIic7DQoNCgkJaWYgKCh2ID0gZ2V0U2VsZWN0VmFsdWUoZiwgJ2RvY2VuY29kaW5nJykpICE9ICcnKQ0KCQkJcyArPSAnIGVuY29kaW5nPSInICsgdiArICciJzsNCg0KCQlzICs9ICc/PlxuJzsNCgkJaCA9IHMgKyBoOw0KCX0NCg0KCWggPSBoLnJlcGxhY2UoL3R5cGU9XCJcLW1jZVwtL2dpLCAndHlwZT0iJyk7DQoNCgl0aW55TUNFUG9wdXAuZWRpdG9yLnBsdWdpbnMuZnVsbHBhZ2UuaGVhZCA9IGg7DQoJdGlueU1DRVBvcHVwLmVkaXRvci5wbHVnaW5zLmZ1bGxwYWdlLl9zZXRCb2R5QXR0cmlicyh0aW55TUNFUG9wdXAuZWRpdG9yLCB7fSk7DQoJdGlueU1DRVBvcHVwLmNsb3NlKCk7DQp9DQoNCmZ1bmN0aW9uIGNoYW5nZWRTdHlsZUZpZWxkKGZpZWxkKSB7DQp9DQoNCmZ1bmN0aW9uIHNldE1ldGEoaGUsIGssIHYpIHsNCgl2YXIgbmwsIGksIG07DQoNCglubCA9IGhlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdtZXRhJyk7DQoJZm9yIChpPTA7IGk8bmwubGVuZ3RoOyBpKyspIHsNCgkJaWYgKGsgPT0gJ0NvbnRlbnQtVHlwZScgJiYgdGlueU1DRVBvcHVwLmRvbS5nZXRBdHRyaWIobmxbaV0sICdodHRwLWVxdWl2JykgPT0gaykgew0KCQkJaWYgKHYgPT0gJycpDQoJCQkJbmxbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChubFtpXSk7DQoJCQllbHNlDQoJCQkJbmxbaV0uc2V0QXR0cmlidXRlKCdjb250ZW50JywgInRleHQvaHRtbDsgY2hhcnNldD0iICsgdik7DQoNCgkJCXJldHVybjsNCgkJfQ0KDQoJCWlmICh0aW55TUNFUG9wdXAuZG9tLmdldEF0dHJpYihubFtpXSwgJ25hbWUnKSA9PSBrKSB7DQoJCQlpZiAodiA9PSAnJykNCgkJCQlubFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5sW2ldKTsNCgkJCWVsc2UNCgkJCQlubFtpXS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnLCB2KTsNCgkJCXJldHVybjsNCgkJfQ0KCX0NCg0KCWlmICh2ID09ICcnKQ0KCQlyZXR1cm47DQoNCgltID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ21ldGEnKTsNCg0KCWlmIChrID09ICdDb250ZW50LVR5cGUnKQ0KCQltLmh0dHBFcXVpdiA9IGs7DQoJZWxzZQ0KCQltLnNldEF0dHJpYnV0ZSgnbmFtZScsIGspOw0KDQoJbS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnLCB2KTsNCgloZS5hcHBlbmRDaGlsZChtKTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VTdHlsZUVsZW1lbnQoZSkgew0KCXZhciB2ID0gZS5pbm5lckhUTUw7DQoJdmFyIHAsIGksIHI7DQoNCgl2ID0gdi5yZXBsYWNlKC88IS0tL2dpLCAnJyk7DQoJdiA9IHYucmVwbGFjZSgvLS0+L2dpLCAnJyk7DQoJdiA9IHYucmVwbGFjZSgvW1xuXHJdL2dpLCAnJyk7DQoJdiA9IHYucmVwbGFjZSgvXHMrL2dpLCAnICcpOw0KDQoJciA9IFtdOw0KCXAgPSB2LnNwbGl0KC97fH0vKTsNCg0KCWZvciAoaT0wOyBpPHAubGVuZ3RoOyBpKz0yKSB7DQoJCWlmIChwW2ldICE9ICIiKQ0KCQkJcltyLmxlbmd0aF0gPSB7cnVsZSA6IHRpbnltY2UudHJpbShwW2ldKSwgZGF0YSA6IHRpbnlNQ0VQb3B1cC5kb20ucGFyc2VTdHlsZShwW2krMV0pfTsNCgl9DQoNCglyZXR1cm4gcjsNCn0NCg0KZnVuY3Rpb24gc2VyaWFsaXplU3R5bGVFbGVtZW50KGQpIHsNCgl2YXIgaSwgcywgc3Q7DQoNCglzID0gJzwhLS1cbic7DQoNCglmb3IgKGk9MDsgaTxkLmxlbmd0aDsgaSsrKSB7DQoJCXMgKz0gZFtpXS5ydWxlICsgJyB7XG4nOw0KDQoJCXN0ID0gdGlueU1DRS5zZXJpYWxpemVTdHlsZShkW2ldLmRhdGEpOw0KDQoJCWlmIChzdCAhPSAnJykNCgkJCXN0ICs9ICc7JzsNCg0KCQlzICs9IHN0LnJlcGxhY2UoLzsvZywgJztcbicpOw0KCQlzICs9ICd9XG4nOw0KDQoJCWlmIChpICE9IGQubGVuZ3RoIC0gMSkNCgkJCXMgKz0gJ1xuJzsNCgl9DQoNCglzICs9ICdcbi0tPic7DQoNCglyZXR1cm4gczsNCn0NCg0KdGlueU1DRVBvcHVwLm9uSW5pdC5hZGQoaW5pdCk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullpage/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullpage/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5mdWxscGFnZV9kbGcnLHsNCnRpdGxlOiJEb2N1bWVudCBwcm9wZXJ0aWVzIiwNCm1ldGFfdGFiOiJHZW5lcmFsIiwNCmFwcGVhcmFuY2VfdGFiOiJBcHBlYXJhbmNlIiwNCmFkdmFuY2VkX3RhYjoiQWR2YW5jZWQiLA0KbWV0YV9wcm9wczoiTWV0YSBpbmZvcm1hdGlvbiIsDQpsYW5ncHJvcHM6Ikxhbmd1YWdlIGFuZCBlbmNvZGluZyIsDQptZXRhX3RpdGxlOiJUaXRsZSIsDQptZXRhX2tleXdvcmRzOiJLZXl3b3JkcyIsDQptZXRhX2Rlc2NyaXB0aW9uOiJEZXNjcmlwdGlvbiIsDQptZXRhX3JvYm90czoiUm9ib3RzIiwNCmRvY3R5cGVzOiJEb2N0eXBlIiwNCmxhbmdjb2RlOiJMYW5ndWFnZSBjb2RlIiwNCmxhbmdkaXI6Ikxhbmd1YWdlIGRpcmVjdGlvbiIsDQpsdHI6IkxlZnQgdG8gcmlnaHQiLA0KcnRsOiJSaWdodCB0byBsZWZ0IiwNCnhtbF9waToiWE1MIGRlY2xhcmF0aW9uIiwNCmVuY29kaW5nOiJDaGFyYWN0ZXIgZW5jb2RpbmciLA0KYXBwZWFyYW5jZV9iZ3Byb3BzOiJCYWNrZ3JvdW5kIHByb3BlcnRpZXMiLA0KYXBwZWFyYW5jZV9tYXJnaW5wcm9wczoiQm9keSBtYXJnaW5zIiwNCmFwcGVhcmFuY2VfbGlua3Byb3BzOiJMaW5rIGNvbG9ycyIsDQphcHBlYXJhbmNlX3RleHRwcm9wczoiVGV4dCBwcm9wZXJ0aWVzIiwNCmJnY29sb3I6IkJhY2tncm91bmQgY29sb3IiLA0KYmdpbWFnZToiQmFja2dyb3VuZCBpbWFnZSIsDQpsZWZ0X21hcmdpbjoiTGVmdCBtYXJnaW4iLA0KcmlnaHRfbWFyZ2luOiJSaWdodCBtYXJnaW4iLA0KdG9wX21hcmdpbjoiVG9wIG1hcmdpbiIsDQpib3R0b21fbWFyZ2luOiJCb3R0b20gbWFyZ2luIiwNCnRleHRfY29sb3I6IlRleHQgY29sb3IiLA0KZm9udF9zaXplOiJGb250IHNpemUiLA0KZm9udF9mYWNlOiJGb250IGZhY2UiLA0KbGlua19jb2xvcjoiTGluayBjb2xvciIsDQpob3Zlcl9jb2xvcjoiSG92ZXIgY29sb3IiLA0KdmlzaXRlZF9jb2xvcjoiVmlzaXRlZCBjb2xvciIsDQphY3RpdmVfY29sb3I6IkFjdGl2ZSBjb2xvciIsDQp0ZXh0Y29sb3I6IkNvbG9yIiwNCmZvbnRzaXplOiJGb250IHNpemUiLA0KZm9udGZhY2U6IkZvbnQgZmFtaWx5IiwNCm1ldGFfaW5kZXhfZm9sbG93OiJJbmRleCBhbmQgZm9sbG93IHRoZSBsaW5rcyIsDQptZXRhX2luZGV4X25vZm9sbG93OiJJbmRleCBhbmQgZG9uJ3QgZm9sbG93IHRoZSBsaW5rcyIsDQptZXRhX25vaW5kZXhfZm9sbG93OiJEbyBub3QgaW5kZXggYnV0IGZvbGxvdyB0aGUgbGlua3MiLA0KbWV0YV9ub2luZGV4X25vZm9sbG93OiJEbyBub3QgaW5kZXggYW5kIGRvblwndCBmb2xsb3cgdGhlIGxpbmtzIiwNCmFwcGVhcmFuY2Vfc3R5bGU6IlN0eWxlc2hlZXQgYW5kIHN0eWxlIHByb3BlcnRpZXMiLA0Kc3R5bGVzaGVldDoiU3R5bGVzaGVldCIsDQpzdHlsZToiU3R5bGUiLA0KYXV0aG9yOiJBdXRob3IiLA0KY29weXJpZ2h0OiJDb3B5cmlnaHQiLA0KYWRkOiJBZGQgbmV3IGVsZW1lbnQiLA0KcmVtb3ZlOiJSZW1vdmUgc2VsZWN0ZWQgZWxlbWVudCIsDQptb3ZldXA6Ik1vdmUgc2VsZWN0ZWQgZWxlbWVudCB1cCIsDQptb3ZlZG93bjoiTW92ZSBzZWxlY3RlZCBlbGVtZW50IGRvd24iLA0KaGVhZF9lbGVtZW50czoiSGVhZCBlbGVtZW50cyIsDQppbmZvOiJJbmZvcm1hdGlvbiIsDQphZGRfdGl0bGU6IlRpdGxlIGVsZW1lbnQiLA0KYWRkX21ldGE6Ik1ldGEgZWxlbWVudCIsDQphZGRfc2NyaXB0OiJTY3JpcHQgZWxlbWVudCIsDQphZGRfc3R5bGU6IlN0eWxlIGVsZW1lbnQiLA0KYWRkX2xpbms6IkxpbmsgZWxlbWVudCIsDQphZGRfYmFzZToiQmFzZSBlbGVtZW50IiwNCmFkZF9jb21tZW50OiJDb21tZW50IG5vZGUiLA0KdGl0bGVfZWxlbWVudDoiVGl0bGUgZWxlbWVudCIsDQpzY3JpcHRfZWxlbWVudDoiU2NyaXB0IGVsZW1lbnQiLA0Kc3R5bGVfZWxlbWVudDoiU3R5bGUgZWxlbWVudCIsDQpiYXNlX2VsZW1lbnQ6IkJhc2UgZWxlbWVudCIsDQpsaW5rX2VsZW1lbnQ6IkxpbmsgZWxlbWVudCIsDQptZXRhX2VsZW1lbnQ6Ik1ldGEgZWxlbWVudCIsDQpjb21tZW50X2VsZW1lbnQ6IkNvbW1lbnQiLA0Kc3JjOiJTcmMiLA0KbGFuZ3VhZ2U6Ikxhbmd1YWdlIiwNCmhyZWY6IkhyZWYiLA0KdGFyZ2V0OiJUYXJnZXQiLA0KdHlwZToiVHlwZSIsDQpjaGFyc2V0OiJDaGFyc2V0IiwNCmRlZmVyOiJEZWZlciIsDQptZWRpYToiTWVkaWEiLA0KcHJvcGVydGllczoiUHJvcGVydGllcyIsDQpuYW1lOiJOYW1lIiwNCnZhbHVlOiJWYWx1ZSIsDQpjb250ZW50OiJDb250ZW50IiwNCnJlbDoiUmVsIiwNCnJldjoiUmV2IiwNCmhyZWZsYW5nOiJIcmVmIGxhbmciLA0KZ2VuZXJhbF9wcm9wczoiR2VuZXJhbCIsDQphZHZhbmNlZF9wcm9wczoiQWR2YW5jZWQiDQp9KTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullscreen/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullscreen/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dmFyIGE9dGlueW1jZS5ET007dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5GdWxsU2NyZWVuUGx1Z2luIix7aW5pdDpmdW5jdGlvbihjLGQpe3ZhciBlPXRoaXMsZj17fSxiO2UuZWRpdG9yPWM7Yy5hZGRDb21tYW5kKCJtY2VGdWxsU2NyZWVuIixmdW5jdGlvbigpe3ZhciBoLGk9YS5kb2MuZG9jdW1lbnRFbGVtZW50O2lmKGMuZ2V0UGFyYW0oImZ1bGxzY3JlZW5faXNfZW5hYmxlZCIpKXtpZihjLmdldFBhcmFtKCJmdWxsc2NyZWVuX25ld193aW5kb3ciKSl7Y2xvc2VGdWxsc2NyZWVuKCl9ZWxzZXthLndpbi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGlueW1jZS5kb20uRXZlbnQucmVtb3ZlKGEud2luLCJyZXNpemUiLGUucmVzaXplRnVuYyk7dGlueU1DRS5nZXQoYy5nZXRQYXJhbSgiZnVsbHNjcmVlbl9lZGl0b3JfaWQiKSkuc2V0Q29udGVudChjLmdldENvbnRlbnQoe2Zvcm1hdDoicmF3In0pLHtmb3JtYXQ6InJhdyJ9KTt0aW55TUNFLnJlbW92ZShjKTthLnJlbW92ZSgibWNlX2Z1bGxzY3JlZW5fY29udGFpbmVyIik7aS5zdHlsZS5vdmVyZmxvdz1jLmdldFBhcmFtKCJmdWxsc2NyZWVuX2h0bWxfb3ZlcmZsb3ciKTthLnNldFN0eWxlKGEuZG9jLmJvZHksIm92ZXJmbG93IixjLmdldFBhcmFtKCJmdWxsc2NyZWVuX292ZXJmbG93IikpO2Eud2luLnNjcm9sbFRvKGMuZ2V0UGFyYW0oImZ1bGxzY3JlZW5fc2Nyb2xseCIpLGMuZ2V0UGFyYW0oImZ1bGxzY3JlZW5fc2Nyb2xseSIpKTt0aW55TUNFLnNldHRpbmdzPXRpbnlNQ0Uub2xkU2V0dGluZ3N9LDEwKX1yZXR1cm59aWYoYy5nZXRQYXJhbSgiZnVsbHNjcmVlbl9uZXdfd2luZG93Iikpe2g9YS53aW4ub3BlbihkKyIvZnVsbHNjcmVlbi5odG0iLCJtY2VGdWxsU2NyZWVuUG9wdXAiLCJmdWxsc2NyZWVuPXllcyxtZW51YmFyPW5vLHRvb2xiYXI9bm8sc2Nyb2xsYmFycz1ubyxyZXNpemFibGU9eWVzLGxlZnQ9MCx0b3A9MCx3aWR0aD0iK3NjcmVlbi5hdmFpbFdpZHRoKyIsaGVpZ2h0PSIrc2NyZWVuLmF2YWlsSGVpZ2h0KTt0cnl7aC5yZXNpemVUbyhzY3JlZW4uYXZhaWxXaWR0aCxzY3JlZW4uYXZhaWxIZWlnaHQpfWNhdGNoKGcpe319ZWxzZXt0aW55TUNFLm9sZFNldHRpbmdzPXRpbnlNQ0Uuc2V0dGluZ3M7Zi5mdWxsc2NyZWVuX292ZXJmbG93PWEuZ2V0U3R5bGUoYS5kb2MuYm9keSwib3ZlcmZsb3ciLDEpfHwiYXV0byI7Zi5mdWxsc2NyZWVuX2h0bWxfb3ZlcmZsb3c9YS5nZXRTdHlsZShpLCJvdmVyZmxvdyIsMSk7Yj1hLmdldFZpZXdQb3J0KCk7Zi5mdWxsc2NyZWVuX3Njcm9sbHg9Yi54O2YuZnVsbHNjcmVlbl9zY3JvbGx5PWIueTtpZih0aW55bWNlLmlzT3BlcmEmJmYuZnVsbHNjcmVlbl9vdmVyZmxvdz09InZpc2libGUiKXtmLmZ1bGxzY3JlZW5fb3ZlcmZsb3c9ImF1dG8ifWlmKHRpbnltY2UuaXNJRSYmZi5mdWxsc2NyZWVuX292ZXJmbG93PT0ic2Nyb2xsIil7Zi5mdWxsc2NyZWVuX292ZXJmbG93PSJhdXRvIn1pZih0aW55bWNlLmlzSUUmJihmLmZ1bGxzY3JlZW5faHRtbF9vdmVyZmxvdz09InZpc2libGUifHxmLmZ1bGxzY3JlZW5faHRtbF9vdmVyZmxvdz09InNjcm9sbCIpKXtmLmZ1bGxzY3JlZW5faHRtbF9vdmVyZmxvdz0iYXV0byJ9aWYoZi5mdWxsc2NyZWVuX292ZXJmbG93PT0iMHB4Iil7Zi5mdWxsc2NyZWVuX292ZXJmbG93PSIifWEuc2V0U3R5bGUoYS5kb2MuYm9keSwib3ZlcmZsb3ciLCJoaWRkZW4iKTtpLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iO2I9YS5nZXRWaWV3UG9ydCgpO2Eud2luLnNjcm9sbFRvKDAsMCk7aWYodGlueW1jZS5pc0lFKXtiLmgtPTF9bj1hLmFkZChhLmRvYy5ib2R5LCJkaXYiLHtpZDoibWNlX2Z1bGxzY3JlZW5fY29udGFpbmVyIixzdHlsZToicG9zaXRpb246IisodGlueW1jZS5pc0lFNnx8KHRpbnltY2UuaXNJRSYmIWEuYm94TW9kZWwpPyJhYnNvbHV0ZSI6ImZpeGVkIikrIjt0b3A6MDtsZWZ0OjA7d2lkdGg6IitiLncrInB4O2hlaWdodDoiK2IuaCsicHg7ei1pbmRleDoyMDAwMDA7In0pO2EuYWRkKG4sImRpdiIse2lkOiJtY2VfZnVsbHNjcmVlbiJ9KTt0aW55bWNlLmVhY2goYy5zZXR0aW5ncyxmdW5jdGlvbihqLGspe2Zba109an0pO2YuaWQ9Im1jZV9mdWxsc2NyZWVuIjtmLndpZHRoPW4uY2xpZW50V2lkdGg7Zi5oZWlnaHQ9bi5jbGllbnRIZWlnaHQtMTU7Zi5mdWxsc2NyZWVuX2lzX2VuYWJsZWQ9dHJ1ZTtmLmZ1bGxzY3JlZW5fZWRpdG9yX2lkPWMuaWQ7Zi50aGVtZV9hZHZhbmNlZF9yZXNpemluZz1mYWxzZTtmLnNhdmVfb25zYXZlY2FsbGJhY2s9ZnVuY3Rpb24oKXtjLnNldENvbnRlbnQodGlueU1DRS5nZXQoZi5pZCkuZ2V0Q29udGVudCh7Zm9ybWF0OiJyYXcifSkse2Zvcm1hdDoicmF3In0pO2MuZXhlY0NvbW1hbmQoIm1jZVNhdmUiKX07dGlueW1jZS5lYWNoKGMuZ2V0UGFyYW0oImZ1bGxzY3JlZW5fc2V0dGluZ3MiKSxmdW5jdGlvbihsLGope2Zbal09bH0pO2lmKGYudGhlbWVfYWR2YW5jZWRfdG9vbGJhcl9sb2NhdGlvbj09PSJleHRlcm5hbCIpe2YudGhlbWVfYWR2YW5jZWRfdG9vbGJhcl9sb2NhdGlvbj0idG9wIn1lLmZ1bGxzY3JlZW5FZGl0b3I9bmV3IHRpbnltY2UuRWRpdG9yKCJtY2VfZnVsbHNjcmVlbiIsZik7ZS5mdWxsc2NyZWVuRWRpdG9yLm9uSW5pdC5hZGQoZnVuY3Rpb24oKXtlLmZ1bGxzY3JlZW5FZGl0b3Iuc2V0Q29udGVudChjLmdldENvbnRlbnQoKSk7ZS5mdWxsc2NyZWVuRWRpdG9yLmZvY3VzKCl9KTtlLmZ1bGxzY3JlZW5FZGl0b3IucmVuZGVyKCk7ZS5mdWxsc2NyZWVuRWxlbWVudD1uZXcgdGlueW1jZS5kb20uRWxlbWVudCgibWNlX2Z1bGxzY3JlZW5fY29udGFpbmVyIik7ZS5mdWxsc2NyZWVuRWxlbWVudC51cGRhdGUoKTtlLnJlc2l6ZUZ1bmM9dGlueW1jZS5kb20uRXZlbnQuYWRkKGEud2luLCJyZXNpemUiLGZ1bmN0aW9uKCl7dmFyIG09dGlueW1jZS5ET00uZ2V0Vmlld1BvcnQoKSxrPWUuZnVsbHNjcmVlbkVkaXRvcixqLGw7aj1rLmRvbS5nZXRTaXplKGsuZ2V0Q29udGFpbmVyKCkuZmlyc3RDaGlsZCk7bD1rLmRvbS5nZXRTaXplKGsuZ2V0Q29udGFpbmVyKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpWzBdKTtrLnRoZW1lLnJlc2l6ZVRvKG0udy1qLncrbC53LG0uaC1qLmgrbC5oKX0pfX0pO2MuYWRkQnV0dG9uKCJmdWxsc2NyZWVuIix7dGl0bGU6ImZ1bGxzY3JlZW4uZGVzYyIsY21kOiJtY2VGdWxsU2NyZWVuIn0pO2Mub25Ob2RlQ2hhbmdlLmFkZChmdW5jdGlvbihoLGcpe2cuc2V0QWN0aXZlKCJmdWxsc2NyZWVuIixoLmdldFBhcmFtKCJmdWxsc2NyZWVuX2lzX2VuYWJsZWQiKSl9KX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiRnVsbHNjcmVlbiIsYXV0aG9yOiJNb3hpZWNvZGUgU3lzdGVtcyBBQiIsYXV0aG9ydXJsOiJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tIixpbmZvdXJsOiJodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvZnVsbHNjcmVlbiIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fX0pO3RpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoImZ1bGxzY3JlZW4iLHRpbnltY2UucGx1Z2lucy5GdWxsU2NyZWVuUGx1Z2luKX0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullscreen/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgRE9NID0gdGlueW1jZS5ET007DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLkZ1bGxTY3JlZW5QbHVnaW4nLCB7DQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB7fSwgdnA7DQoNCgkJCXQuZWRpdG9yID0gZWQ7DQoNCgkJCS8vIFJlZ2lzdGVyIGNvbW1hbmRzDQoJCQllZC5hZGRDb21tYW5kKCdtY2VGdWxsU2NyZWVuJywgZnVuY3Rpb24oKSB7DQoJCQkJdmFyIHdpbiwgZGUgPSBET00uZG9jLmRvY3VtZW50RWxlbWVudDsNCg0KCQkJCWlmIChlZC5nZXRQYXJhbSgnZnVsbHNjcmVlbl9pc19lbmFibGVkJykpIHsNCgkJCQkJaWYgKGVkLmdldFBhcmFtKCdmdWxsc2NyZWVuX25ld193aW5kb3cnKSkNCgkJCQkJCWNsb3NlRnVsbHNjcmVlbigpOyAvLyBDYWxsIHRvIGNsb3NlIGluIG5ldyB3aW5kb3cNCgkJCQkJZWxzZSB7DQoJCQkJCQlET00ud2luLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoJCQkJCQkJdGlueW1jZS5kb20uRXZlbnQucmVtb3ZlKERPTS53aW4sICdyZXNpemUnLCB0LnJlc2l6ZUZ1bmMpOw0KCQkJCQkJCXRpbnlNQ0UuZ2V0KGVkLmdldFBhcmFtKCdmdWxsc2NyZWVuX2VkaXRvcl9pZCcpKS5zZXRDb250ZW50KGVkLmdldENvbnRlbnQoe2Zvcm1hdCA6ICdyYXcnfSksIHtmb3JtYXQgOiAncmF3J30pOw0KCQkJCQkJCXRpbnlNQ0UucmVtb3ZlKGVkKTsNCgkJCQkJCQlET00ucmVtb3ZlKCdtY2VfZnVsbHNjcmVlbl9jb250YWluZXInKTsNCgkJCQkJCQlkZS5zdHlsZS5vdmVyZmxvdyA9IGVkLmdldFBhcmFtKCdmdWxsc2NyZWVuX2h0bWxfb3ZlcmZsb3cnKTsNCgkJCQkJCQlET00uc2V0U3R5bGUoRE9NLmRvYy5ib2R5LCAnb3ZlcmZsb3cnLCBlZC5nZXRQYXJhbSgnZnVsbHNjcmVlbl9vdmVyZmxvdycpKTsNCgkJCQkJCQlET00ud2luLnNjcm9sbFRvKGVkLmdldFBhcmFtKCdmdWxsc2NyZWVuX3Njcm9sbHgnKSwgZWQuZ2V0UGFyYW0oJ2Z1bGxzY3JlZW5fc2Nyb2xseScpKTsNCgkJCQkJCQl0aW55TUNFLnNldHRpbmdzID0gdGlueU1DRS5vbGRTZXR0aW5nczsgLy8gUmVzdG9yZSBvbGQgc2V0dGluZ3MNCgkJCQkJCX0sIDEwKTsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybjsNCgkJCQl9DQoNCgkJCQlpZiAoZWQuZ2V0UGFyYW0oJ2Z1bGxzY3JlZW5fbmV3X3dpbmRvdycpKSB7DQoJCQkJCXdpbiA9IERPTS53aW4ub3Blbih1cmwgKyAiL2Z1bGxzY3JlZW4uaHRtIiwgIm1jZUZ1bGxTY3JlZW5Qb3B1cCIsICJmdWxsc2NyZWVuPXllcyxtZW51YmFyPW5vLHRvb2xiYXI9bm8sc2Nyb2xsYmFycz1ubyxyZXNpemFibGU9eWVzLGxlZnQ9MCx0b3A9MCx3aWR0aD0iICsgc2NyZWVuLmF2YWlsV2lkdGggKyAiLGhlaWdodD0iICsgc2NyZWVuLmF2YWlsSGVpZ2h0KTsNCgkJCQkJdHJ5IHsNCgkJCQkJCXdpbi5yZXNpemVUbyhzY3JlZW4uYXZhaWxXaWR0aCwgc2NyZWVuLmF2YWlsSGVpZ2h0KTsNCgkJCQkJfSBjYXRjaCAoZSkgew0KCQkJCQkJLy8gSWdub3JlDQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQl0aW55TUNFLm9sZFNldHRpbmdzID0gdGlueU1DRS5zZXR0aW5nczsgLy8gU3RvcmUgb2xkIHNldHRpbmdzDQoJCQkJCXMuZnVsbHNjcmVlbl9vdmVyZmxvdyA9IERPTS5nZXRTdHlsZShET00uZG9jLmJvZHksICdvdmVyZmxvdycsIDEpIHx8ICdhdXRvJzsNCgkJCQkJcy5mdWxsc2NyZWVuX2h0bWxfb3ZlcmZsb3cgPSBET00uZ2V0U3R5bGUoZGUsICdvdmVyZmxvdycsIDEpOw0KCQkJCQl2cCA9IERPTS5nZXRWaWV3UG9ydCgpOw0KCQkJCQlzLmZ1bGxzY3JlZW5fc2Nyb2xseCA9IHZwLng7DQoJCQkJCXMuZnVsbHNjcmVlbl9zY3JvbGx5ID0gdnAueTsNCg0KCQkJCQkvLyBGaXhlcyBhbiBPcGVyYSBidWcgd2hlcmUgdGhlIHNjcm9sbGJhcnMgZG9lc24ndCByZWFwcGVhcg0KCQkJCQlpZiAodGlueW1jZS5pc09wZXJhICYmIHMuZnVsbHNjcmVlbl9vdmVyZmxvdyA9PSAndmlzaWJsZScpDQoJCQkJCQlzLmZ1bGxzY3JlZW5fb3ZlcmZsb3cgPSAnYXV0byc7DQoNCgkJCQkJLy8gRml4ZXMgYW4gSUUgYnVnIHdoZXJlIGhvcml6b250YWwgc2Nyb2xsYmFycyB3b3VsZCBhcHBlYXINCgkJCQkJaWYgKHRpbnltY2UuaXNJRSAmJiBzLmZ1bGxzY3JlZW5fb3ZlcmZsb3cgPT0gJ3Njcm9sbCcpDQoJCQkJCQlzLmZ1bGxzY3JlZW5fb3ZlcmZsb3cgPSAnYXV0byc7DQoNCgkJCQkJLy8gRml4ZXMgYW4gSUUgYnVnIHdoZXJlIHRoZSBzY3JvbGxiYXJzIGRvZXNuJ3QgcmVhcHBlYXINCgkJCQkJaWYgKHRpbnltY2UuaXNJRSAmJiAocy5mdWxsc2NyZWVuX2h0bWxfb3ZlcmZsb3cgPT0gJ3Zpc2libGUnIHx8IHMuZnVsbHNjcmVlbl9odG1sX292ZXJmbG93ID09ICdzY3JvbGwnKSkNCgkJCQkJCXMuZnVsbHNjcmVlbl9odG1sX292ZXJmbG93ID0gJ2F1dG8nOyANCg0KCQkJCQlpZiAocy5mdWxsc2NyZWVuX292ZXJmbG93ID09ICcwcHgnKQ0KCQkJCQkJcy5mdWxsc2NyZWVuX292ZXJmbG93ID0gJyc7DQoNCgkJCQkJRE9NLnNldFN0eWxlKERPTS5kb2MuYm9keSwgJ292ZXJmbG93JywgJ2hpZGRlbicpOw0KCQkJCQlkZS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOyAvL0ZpeCBmb3IgSUU2LzcNCgkJCQkJdnAgPSBET00uZ2V0Vmlld1BvcnQoKTsNCgkJCQkJRE9NLndpbi5zY3JvbGxUbygwLCAwKTsNCg0KCQkJCQlpZiAodGlueW1jZS5pc0lFKQ0KCQkJCQkJdnAuaCAtPSAxOw0KDQoJCQkJCW4gPSBET00uYWRkKERPTS5kb2MuYm9keSwgJ2RpdicsIHtpZCA6ICdtY2VfZnVsbHNjcmVlbl9jb250YWluZXInLCBzdHlsZSA6ICdwb3NpdGlvbjonICsgKHRpbnltY2UuaXNJRTYgfHwgKHRpbnltY2UuaXNJRSAmJiAhRE9NLmJveE1vZGVsKSA/ICdhYnNvbHV0ZScgOiAnZml4ZWQnKSArICc7dG9wOjA7bGVmdDowO3dpZHRoOicgKyB2cC53ICsgJ3B4O2hlaWdodDonICsgdnAuaCArICdweDt6LWluZGV4OjIwMDAwMDsnfSk7DQoJCQkJCURPTS5hZGQobiwgJ2RpdicsIHtpZCA6ICdtY2VfZnVsbHNjcmVlbid9KTsNCg0KCQkJCQl0aW55bWNlLmVhY2goZWQuc2V0dGluZ3MsIGZ1bmN0aW9uKHYsIG4pIHsNCgkJCQkJCXNbbl0gPSB2Ow0KCQkJCQl9KTsNCg0KCQkJCQlzLmlkID0gJ21jZV9mdWxsc2NyZWVuJzsNCgkJCQkJcy53aWR0aCA9IG4uY2xpZW50V2lkdGg7DQoJCQkJCXMuaGVpZ2h0ID0gbi5jbGllbnRIZWlnaHQgLSAxNTsNCgkJCQkJcy5mdWxsc2NyZWVuX2lzX2VuYWJsZWQgPSB0cnVlOw0KCQkJCQlzLmZ1bGxzY3JlZW5fZWRpdG9yX2lkID0gZWQuaWQ7DQoJCQkJCXMudGhlbWVfYWR2YW5jZWRfcmVzaXppbmcgPSBmYWxzZTsNCgkJCQkJcy5zYXZlX29uc2F2ZWNhbGxiYWNrID0gZnVuY3Rpb24oKSB7DQoJCQkJCQllZC5zZXRDb250ZW50KHRpbnlNQ0UuZ2V0KHMuaWQpLmdldENvbnRlbnQoe2Zvcm1hdCA6ICdyYXcnfSksIHtmb3JtYXQgOiAncmF3J30pOw0KCQkJCQkJZWQuZXhlY0NvbW1hbmQoJ21jZVNhdmUnKTsNCgkJCQkJfTsNCg0KCQkJCQl0aW55bWNlLmVhY2goZWQuZ2V0UGFyYW0oJ2Z1bGxzY3JlZW5fc2V0dGluZ3MnKSwgZnVuY3Rpb24odiwgaykgew0KCQkJCQkJc1trXSA9IHY7DQoJCQkJCX0pOw0KDQoJCQkJCWlmIChzLnRoZW1lX2FkdmFuY2VkX3Rvb2xiYXJfbG9jYXRpb24gPT09ICdleHRlcm5hbCcpDQoJCQkJCQlzLnRoZW1lX2FkdmFuY2VkX3Rvb2xiYXJfbG9jYXRpb24gPSAndG9wJzsNCg0KCQkJCQl0LmZ1bGxzY3JlZW5FZGl0b3IgPSBuZXcgdGlueW1jZS5FZGl0b3IoJ21jZV9mdWxsc2NyZWVuJywgcyk7DQoJCQkJCXQuZnVsbHNjcmVlbkVkaXRvci5vbkluaXQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQkJdC5mdWxsc2NyZWVuRWRpdG9yLnNldENvbnRlbnQoZWQuZ2V0Q29udGVudCgpKTsNCgkJCQkJCXQuZnVsbHNjcmVlbkVkaXRvci5mb2N1cygpOw0KCQkJCQl9KTsNCg0KCQkJCQl0LmZ1bGxzY3JlZW5FZGl0b3IucmVuZGVyKCk7DQoNCgkJCQkJdC5mdWxsc2NyZWVuRWxlbWVudCA9IG5ldyB0aW55bWNlLmRvbS5FbGVtZW50KCdtY2VfZnVsbHNjcmVlbl9jb250YWluZXInKTsNCgkJCQkJdC5mdWxsc2NyZWVuRWxlbWVudC51cGRhdGUoKTsNCgkJCQkJLy9kb2N1bWVudC5ib2R5Lm92ZXJmbG93ID0gJ2hpZGRlbic7DQoNCgkJCQkJdC5yZXNpemVGdW5jID0gdGlueW1jZS5kb20uRXZlbnQuYWRkKERPTS53aW4sICdyZXNpemUnLCBmdW5jdGlvbigpIHsNCgkJCQkJCXZhciB2cCA9IHRpbnltY2UuRE9NLmdldFZpZXdQb3J0KCksIGZlZCA9IHQuZnVsbHNjcmVlbkVkaXRvciwgb3V0ZXJTaXplLCBpbm5lclNpemU7DQoNCgkJCQkJCS8vIEdldCBvdXRlci9pbm5lciBzaXplIHRvIGdldCBhIGRlbHRhIHNpemUgdGhhdCBjYW4gYmUgdXNlZCB0byBjYWxjIHRoZSBuZXcgaWZyYW1lIHNpemUNCgkJCQkJCW91dGVyU2l6ZSA9IGZlZC5kb20uZ2V0U2l6ZShmZWQuZ2V0Q29udGFpbmVyKCkuZmlyc3RDaGlsZCk7DQoJCQkJCQlpbm5lclNpemUgPSBmZWQuZG9tLmdldFNpemUoZmVkLmdldENvbnRhaW5lcigpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpZnJhbWUnKVswXSk7DQoNCgkJCQkJCWZlZC50aGVtZS5yZXNpemVUbyh2cC53IC0gb3V0ZXJTaXplLncgKyBpbm5lclNpemUudywgdnAuaCAtIG91dGVyU2l6ZS5oICsgaW5uZXJTaXplLmgpOw0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJLy8gUmVnaXN0ZXIgYnV0dG9ucw0KCQkJZWQuYWRkQnV0dG9uKCdmdWxsc2NyZWVuJywge3RpdGxlIDogJ2Z1bGxzY3JlZW4uZGVzYycsIGNtZCA6ICdtY2VGdWxsU2NyZWVuJ30pOw0KDQoJCQllZC5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKGVkLCBjbSkgew0KCQkJCWNtLnNldEFjdGl2ZSgnZnVsbHNjcmVlbicsIGVkLmdldFBhcmFtKCdmdWxsc2NyZWVuX2lzX2VuYWJsZWQnKSk7DQoJCQl9KTsNCgkJfSwNCg0KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gew0KCQkJCWxvbmduYW1lIDogJ0Z1bGxzY3JlZW4nLA0KCQkJCWF1dGhvciA6ICdNb3hpZWNvZGUgU3lzdGVtcyBBQicsDQoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLA0KCQkJCWluZm91cmwgOiAnaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL2Z1bGxzY3JlZW4nLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9DQoJfSk7DQoNCgkvLyBSZWdpc3RlciBwbHVnaW4NCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCdmdWxsc2NyZWVuJywgdGlueW1jZS5wbHVnaW5zLkZ1bGxTY3JlZW5QbHVnaW4pOw0KfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/fullscreen/fullscreen.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPjwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZS5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZnVuY3Rpb24gcGF0Y2hDYWxsYmFjayhzZXR0aW5ncywga2V5KSB7CgkJCWlmIChzZXR0aW5nc1trZXldKQoJCQkJc2V0dGluZ3Nba2V5XSA9ICJ3aW5kb3cub3BlbmVyLiIgKyBzZXR0aW5nc1trZXldOwoJCX0KCgkJdmFyIHNldHRpbmdzID0ge30sIHBhU2UgPSB3aW5kb3cub3BlbmVyLnRpbnlNQ0UuYWN0aXZlRWRpdG9yLnNldHRpbmdzLCBvZUlEID0gd2luZG93Lm9wZW5lci50aW55TUNFLmFjdGl2ZUVkaXRvci5pZDsKCgkJLy8gQ2xvbmUgYXJyYXkKCQlmb3IgKHZhciBuIGluIHBhU2UpCgkJCXNldHRpbmdzW25dID0gcGFTZVtuXTsKCgkJLy8gT3ZlcnJpZGUgb3B0aW9ucyBmb3IgZnVsbHNjcmVlbgoJCWZvciAodmFyIG4gaW4gcGFTZS5mdWxsc2NyZWVuX3NldHRpbmdzKQoJCQlzZXR0aW5nc1tuXSA9IHBhU2UuZnVsbHNjcmVlbl9zZXR0aW5nc1tuXTsKCgkJLy8gUGF0Y2ggY2FsbGJhY2tzLCBtYWtlIHRoZW0gcG9pbnQgdG8gd2luZG93Lm9wZW5lcgoJCXBhdGNoQ2FsbGJhY2soc2V0dGluZ3MsICd1cmxjb252ZXJ0ZXJfY2FsbGJhY2snKTsKCQlwYXRjaENhbGxiYWNrKHNldHRpbmdzLCAnaW5zZXJ0bGlua19jYWxsYmFjaycpOwoJCXBhdGNoQ2FsbGJhY2soc2V0dGluZ3MsICdpbnNlcnRpbWFnZV9jYWxsYmFjaycpOwoJCXBhdGNoQ2FsbGJhY2soc2V0dGluZ3MsICdzZXR1cGNvbnRlbnRfY2FsbGJhY2snKTsKCQlwYXRjaENhbGxiYWNrKHNldHRpbmdzLCAnc2F2ZV9jYWxsYmFjaycpOwoJCXBhdGNoQ2FsbGJhY2soc2V0dGluZ3MsICdvbmNoYW5nZV9jYWxsYmFjaycpOwoJCXBhdGNoQ2FsbGJhY2soc2V0dGluZ3MsICdpbml0X2luc3RhbmNlX2NhbGxiYWNrJyk7CgkJcGF0Y2hDYWxsYmFjayhzZXR0aW5ncywgJ2ZpbGVfYnJvd3Nlcl9jYWxsYmFjaycpOwoJCXBhdGNoQ2FsbGJhY2soc2V0dGluZ3MsICdjbGVhbnVwX2NhbGxiYWNrJyk7CgkJcGF0Y2hDYWxsYmFjayhzZXR0aW5ncywgJ2V4ZWNjb21tYW5kX2NhbGxiYWNrJyk7CgkJcGF0Y2hDYWxsYmFjayhzZXR0aW5ncywgJ29uaW5pdCcpOwoKCQkvLyBTZXQgb3B0aW9ucwoJCWRlbGV0ZSBzZXR0aW5ncy5pZDsKCQlzZXR0aW5nc1snbW9kZSddID0gJ2V4YWN0JzsKCQlzZXR0aW5nc1snZWxlbWVudHMnXSA9ICdmdWxsc2NyZWVuYXJlYSc7CgkJc2V0dGluZ3NbJ2FkZF91bmxvYWRfdHJpZ2dlciddID0gZmFsc2U7CgkJc2V0dGluZ3NbJ2FzayddID0gZmFsc2U7CgkJc2V0dGluZ3NbJ2RvY3VtZW50X2Jhc2VfdXJsJ10gPSB3aW5kb3cub3BlbmVyLnRpbnlNQ0UuYWN0aXZlRWRpdG9yLmRvY3VtZW50QmFzZVVSSS5nZXRVUkkoKTsKCQlzZXR0aW5nc1snZnVsbHNjcmVlbl9pc19lbmFibGVkJ10gPSB0cnVlOwoJCXNldHRpbmdzWydmdWxsc2NyZWVuX2VkaXRvcl9pZCddID0gb2VJRDsKCQlzZXR0aW5nc1sndGhlbWVfYWR2YW5jZWRfcmVzaXppbmcnXSA9IGZhbHNlOwoJCXNldHRpbmdzWydzdHJpY3RfbG9hZGluZ19tb2RlJ10gPSB0cnVlOwoKCQlzZXR0aW5ncy5zYXZlX29uc2F2ZWNhbGxiYWNrID0gZnVuY3Rpb24oKSB7CgkJCXdpbmRvdy5vcGVuZXIudGlueU1DRS5nZXQob2VJRCkuc2V0Q29udGVudCh0aW55TUNFLmdldCgnZnVsbHNjcmVlbmFyZWEnKS5nZXRDb250ZW50KHtmb3JtYXQgOiAncmF3J30pLCB7Zm9ybWF0IDogJ3Jhdyd9KTsKCQkJd2luZG93Lm9wZW5lci50aW55TUNFLmdldChvZUlEKS5leGVjQ29tbWFuZCgnbWNlU2F2ZScpOwoJCQl3aW5kb3cuY2xvc2UoKTsKCQl9OwoKCQlmdW5jdGlvbiB1bmxvYWRIYW5kbGVyKGUpIHsKCQkJbW92ZUNvbnRlbnQoKTsKCQl9CgoJCWZ1bmN0aW9uIG1vdmVDb250ZW50KCkgewoJCQl3aW5kb3cub3BlbmVyLnRpbnlNQ0UuZ2V0KG9lSUQpLnNldENvbnRlbnQodGlueU1DRS5hY3RpdmVFZGl0b3IuZ2V0Q29udGVudCgpKTsKCQl9CgoJCWZ1bmN0aW9uIGNsb3NlRnVsbHNjcmVlbigpIHsKCQkJbW92ZUNvbnRlbnQoKTsKCQkJd2luZG93LmNsb3NlKCk7CgkJfQoKCQlmdW5jdGlvbiBkb1BhcmVudFN1Ym1pdCgpIHsKCQkJbW92ZUNvbnRlbnQoKTsKCgkJCWlmICh3aW5kb3cub3BlbmVyLnRpbnlNQ0Uuc2VsZWN0ZWRJbnN0YW5jZS5mb3JtRWxlbWVudC5mb3JtKQoJCQkJd2luZG93Lm9wZW5lci50aW55TUNFLnNlbGVjdGVkSW5zdGFuY2UuZm9ybUVsZW1lbnQuZm9ybS5zdWJtaXQoKTsKCgkJCXdpbmRvdy5jbG9zZSgpOwoKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcmVuZGVyKCkgewoJCQl2YXIgZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdWxsc2NyZWVuYXJlYScpLCB2cCwgZWQsIG93LCBvaCwgZG9tID0gdGlueW1jZS5ET007CgoJCQllLnZhbHVlID0gd2luZG93Lm9wZW5lci50aW55TUNFLmdldChvZUlEKS5nZXRDb250ZW50KCk7CgoJCQl2cCA9IGRvbS5nZXRWaWV3UG9ydCgpOwoJCQlzZXR0aW5ncy53aWR0aCA9IHZwLnc7CgkJCXNldHRpbmdzLmhlaWdodCA9IHZwLmggLSAxNTsKCgkJCXRpbnltY2UuZG9tLkV2ZW50LmFkZCh3aW5kb3csICdyZXNpemUnLCBmdW5jdGlvbigpIHsKCQkJCXZhciB2cCA9IGRvbS5nZXRWaWV3UG9ydCgpOwoKCQkJCXRpbnlNQ0UuYWN0aXZlRWRpdG9yLnRoZW1lLnJlc2l6ZVRvKHZwLncsIHZwLmgpOwoJCQl9KTsKCgkJCXRpbnlNQ0UuaW5pdChzZXR0aW5ncyk7CgkJfQoKCQkvLyBBZGQgb251bmxvYWQKCQl0aW55bWNlLmRvbS5FdmVudC5hZGQod2luZG93LCAiYmVmb3JldW5sb2FkIiwgdW5sb2FkSGFuZGxlcik7Cgk8L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBzdHlsZT0ibWFyZ2luOjA7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCUiIHNjcm9sbGluZz0ibm8iIHNjcm9sbD0ibm8iPgo8Zm9ybSBvbnN1Ym1pdD0iZG9QYXJlbnRTdWJtaXQoKTsiPgo8dGV4dGFyZWEgaWQ9ImZ1bGxzY3JlZW5hcmVhIiBzdHlsZT0id2lkdGg6MTAwJTsgaGVpZ2h0OjEwMCUiPjwvdGV4dGFyZWE+CjwvZm9ybT4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCXJlbmRlcigpOwo8L3NjcmlwdD4KCjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/iespell/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/iespell/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5JRVNwZWxsIix7aW5pdDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZDtpZighdGlueW1jZS5pc0lFKXtyZXR1cm59Yy5lZGl0b3I9YTthLmFkZENvbW1hbmQoIm1jZUlFU3BlbGwiLGZ1bmN0aW9uKCl7dHJ5e2Q9bmV3IEFjdGl2ZVhPYmplY3QoImllU3BlbGwuaWVTcGVsbEV4dGVuc2lvbiIpO2QuQ2hlY2tEb2N1bWVudE5vZGUoYS5nZXREb2MoKS5kb2N1bWVudEVsZW1lbnQpfWNhdGNoKGYpe2lmKGYubnVtYmVyPT0tMjE0NjgyNzg1OSl7YS53aW5kb3dNYW5hZ2VyLmNvbmZpcm0oYS5nZXRMYW5nKCJpZXNwZWxsLmRvd25sb2FkIiksZnVuY3Rpb24oZSl7aWYoZSl7d2luZG93Lm9wZW4oImh0dHA6Ly93d3cuaWVzcGVsbC5jb20vZG93bmxvYWQucGhwIiwiaWVTcGVsbERvd25sb2FkIiwiIil9fSl9ZWxzZXthLndpbmRvd01hbmFnZXIuYWxlcnQoIkVycm9yIExvYWRpbmcgaWVTcGVsbDogRXhjZXB0aW9uICIrZi5udW1iZXIpfX19KTthLmFkZEJ1dHRvbigiaWVzcGVsbCIse3RpdGxlOiJpZXNwZWxsLmllc3BlbGxfZGVzYyIsY21kOiJtY2VJRVNwZWxsIn0pfSxnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJJRVNwZWxsIChJRSBPbmx5KSIsYXV0aG9yOiJNb3hpZWNvZGUgU3lzdGVtcyBBQiIsYXV0aG9ydXJsOiJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tIixpbmZvdXJsOiJodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvaWVzcGVsbCIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fX0pO3RpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoImllc3BlbGwiLHRpbnltY2UucGx1Z2lucy5JRVNwZWxsKX0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/iespell/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLklFU3BlbGwnLCB7DQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHNwOw0KDQoJCQlpZiAoIXRpbnltY2UuaXNJRSkNCgkJCQlyZXR1cm47DQoNCgkJCXQuZWRpdG9yID0gZWQ7DQoNCgkJCS8vIFJlZ2lzdGVyIGNvbW1hbmRzDQoJCQllZC5hZGRDb21tYW5kKCdtY2VJRVNwZWxsJywgZnVuY3Rpb24oKSB7DQoJCQkJdHJ5IHsNCgkJCQkJc3AgPSBuZXcgQWN0aXZlWE9iamVjdCgiaWVTcGVsbC5pZVNwZWxsRXh0ZW5zaW9uIik7DQoJCQkJCXNwLkNoZWNrRG9jdW1lbnROb2RlKGVkLmdldERvYygpLmRvY3VtZW50RWxlbWVudCk7DQoJCQkJfSBjYXRjaCAoZSkgew0KCQkJCQlpZiAoZS5udW1iZXIgPT0gLTIxNDY4Mjc4NTkpIHsNCgkJCQkJCWVkLndpbmRvd01hbmFnZXIuY29uZmlybShlZC5nZXRMYW5nKCJpZXNwZWxsLmRvd25sb2FkIiksIGZ1bmN0aW9uKHMpIHsNCgkJCQkJCQlpZiAocykNCgkJCQkJCQkJd2luZG93Lm9wZW4oJ2h0dHA6Ly93d3cuaWVzcGVsbC5jb20vZG93bmxvYWQucGhwJywgJ2llU3BlbGxEb3dubG9hZCcsICcnKTsNCgkJCQkJCX0pOw0KCQkJCQl9IGVsc2UNCgkJCQkJCWVkLndpbmRvd01hbmFnZXIuYWxlcnQoIkVycm9yIExvYWRpbmcgaWVTcGVsbDogRXhjZXB0aW9uICIgKyBlLm51bWJlcik7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCS8vIFJlZ2lzdGVyIGJ1dHRvbnMNCgkJCWVkLmFkZEJ1dHRvbignaWVzcGVsbCcsIHt0aXRsZSA6ICdpZXNwZWxsLmllc3BlbGxfZGVzYycsIGNtZCA6ICdtY2VJRVNwZWxsJ30pOw0KCQl9LA0KDQoJCWdldEluZm8gOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB7DQoJCQkJbG9uZ25hbWUgOiAnSUVTcGVsbCAoSUUgT25seSknLA0KCQkJCWF1dGhvciA6ICdNb3hpZWNvZGUgU3lzdGVtcyBBQicsDQoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLA0KCQkJCWluZm91cmwgOiAnaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL2llc3BlbGwnLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9DQoJfSk7DQoNCgkvLyBSZWdpc3RlciBwbHVnaW4NCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCdpZXNwZWxsJywgdGlueW1jZS5wbHVnaW5zLklFU3BlbGwpOw0KfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dmFyIGQ9dGlueW1jZS5ET00sYj10aW55bWNlLmRvbS5FbGVtZW50LGE9dGlueW1jZS5kb20uRXZlbnQsZT10aW55bWNlLmVhY2gsYz10aW55bWNlLmlzO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnBsdWdpbnMuSW5saW5lUG9wdXBzIix7aW5pdDpmdW5jdGlvbihmLGcpe2Yub25CZWZvcmVSZW5kZXJVSS5hZGQoZnVuY3Rpb24oKXtmLndpbmRvd01hbmFnZXI9bmV3IHRpbnltY2UuSW5saW5lV2luZG93TWFuYWdlcihmKTtkLmxvYWRDU1MoZysiL3NraW5zLyIrKGYuc2V0dGluZ3MuaW5saW5lcG9wdXBzX3NraW58fCJjbGVhcmxvb2tzMiIpKyIvd2luZG93LmNzcyIpfSl9LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6IklubGluZVBvcHVwcyIsYXV0aG9yOiJNb3hpZWNvZGUgU3lzdGVtcyBBQiIsYXV0aG9ydXJsOiJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tIixpbmZvdXJsOiJodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvaW5saW5lcG9wdXBzIix2ZXJzaW9uOnRpbnltY2UubWFqb3JWZXJzaW9uKyIuIit0aW55bWNlLm1pbm9yVmVyc2lvbn19fSk7dGlueW1jZS5jcmVhdGUoInRpbnltY2UuSW5saW5lV2luZG93TWFuYWdlcjp0aW55bWNlLldpbmRvd01hbmFnZXIiLHtJbmxpbmVXaW5kb3dNYW5hZ2VyOmZ1bmN0aW9uKGYpe3ZhciBnPXRoaXM7Zy5wYXJlbnQoZik7Zy56SW5kZXg9MzAwMDAwO2cuY291bnQ9MDtnLndpbmRvd3M9e319LG9wZW46ZnVuY3Rpb24ocixqKXt2YXIgeT10aGlzLGksaz0iIixxPXkuZWRpdG9yLGc9MCxzPTAsaCxtLG4sbyxsLHYseDtyPXJ8fHt9O2o9anx8e307aWYoIXIuaW5saW5lKXtyZXR1cm4geS5wYXJlbnQocixqKX1pZighci50eXBlKXt5LmJvb2ttYXJrPXEuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpfWk9ZC51bmlxdWVJZCgpO2g9ZC5nZXRWaWV3UG9ydCgpO3Iud2lkdGg9cGFyc2VJbnQoci53aWR0aHx8MzIwKTtyLmhlaWdodD1wYXJzZUludChyLmhlaWdodHx8MjQwKSsodGlueW1jZS5pc0lFPzg6MCk7ci5taW5fd2lkdGg9cGFyc2VJbnQoci5taW5fd2lkdGh8fDE1MCk7ci5taW5faGVpZ2h0PXBhcnNlSW50KHIubWluX2hlaWdodHx8MTAwKTtyLm1heF93aWR0aD1wYXJzZUludChyLm1heF93aWR0aHx8MjAwMCk7ci5tYXhfaGVpZ2h0PXBhcnNlSW50KHIubWF4X2hlaWdodHx8MjAwMCk7ci5sZWZ0PXIubGVmdHx8TWF0aC5yb3VuZChNYXRoLm1heChoLngsaC54KyhoLncvMiktKHIud2lkdGgvMikpKTtyLnRvcD1yLnRvcHx8TWF0aC5yb3VuZChNYXRoLm1heChoLnksaC55KyhoLmgvMiktKHIuaGVpZ2h0LzIpKSk7ci5tb3ZhYmxlPXIucmVzaXphYmxlPXRydWU7ai5tY2Vfd2lkdGg9ci53aWR0aDtqLm1jZV9oZWlnaHQ9ci5oZWlnaHQ7ai5tY2VfaW5saW5lPXRydWU7ai5tY2Vfd2luZG93X2lkPWk7ai5tY2VfYXV0b19mb2N1cz1yLmF1dG9fZm9jdXM7eS5mZWF0dXJlcz1yO3kucGFyYW1zPWo7eS5vbk9wZW4uZGlzcGF0Y2goeSxyLGopO2lmKHIudHlwZSl7ays9IiBtY2VNb2RhbCI7aWYoci50eXBlKXtrKz0iIG1jZSIrci50eXBlLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkrci50eXBlLnN1YnN0cmluZygxKX1yLnJlc2l6YWJsZT1mYWxzZX1pZihyLnN0YXR1c2Jhcil7ays9IiBtY2VTdGF0dXNiYXIifWlmKHIucmVzaXphYmxlKXtrKz0iIG1jZVJlc2l6YWJsZSJ9aWYoci5taW5pbWl6YWJsZSl7ays9IiBtY2VNaW5pbWl6YWJsZSJ9aWYoci5tYXhpbWl6YWJsZSl7ays9IiBtY2VNYXhpbWl6YWJsZSJ9aWYoci5tb3ZhYmxlKXtrKz0iIG1jZU1vdmFibGUifXkuX2FkZEFsbChkLmRvYy5ib2R5LFsiZGl2Iix7aWQ6aSwiY2xhc3MiOihxLnNldHRpbmdzLmlubGluZXBvcHVwc19za2lufHwiY2xlYXJsb29rczIiKSsodGlueW1jZS5pc0lFJiZ3aW5kb3cuZ2V0U2VsZWN0aW9uPyIgaWU5IjoiIiksc3R5bGU6IndpZHRoOjEwMHB4O2hlaWdodDoxMDBweCJ9LFsiZGl2Iix7aWQ6aSsiX3dyYXBwZXIiLCJjbGFzcyI6Im1jZVdyYXBwZXIiK2t9LFsiZGl2Iix7aWQ6aSsiX3RvcCIsImNsYXNzIjoibWNlVG9wIn0sWyJkaXYiLHsiY2xhc3MiOiJtY2VMZWZ0In1dLFsiZGl2Iix7ImNsYXNzIjoibWNlQ2VudGVyIn1dLFsiZGl2Iix7ImNsYXNzIjoibWNlUmlnaHQifV0sWyJzcGFuIix7aWQ6aSsiX3RpdGxlIn0sci50aXRsZXx8IiJdXSxbImRpdiIse2lkOmkrIl9taWRkbGUiLCJjbGFzcyI6Im1jZU1pZGRsZSJ9LFsiZGl2Iix7aWQ6aSsiX2xlZnQiLCJjbGFzcyI6Im1jZUxlZnQifV0sWyJzcGFuIix7aWQ6aSsiX2NvbnRlbnQifV0sWyJkaXYiLHtpZDppKyJfcmlnaHQiLCJjbGFzcyI6Im1jZVJpZ2h0In1dXSxbImRpdiIse2lkOmkrIl9ib3R0b20iLCJjbGFzcyI6Im1jZUJvdHRvbSJ9LFsiZGl2Iix7ImNsYXNzIjoibWNlTGVmdCJ9XSxbImRpdiIseyJjbGFzcyI6Im1jZUNlbnRlciJ9XSxbImRpdiIseyJjbGFzcyI6Im1jZVJpZ2h0In1dLFsic3BhbiIse2lkOmkrIl9zdGF0dXMifSwiQ29udGVudCJdXSxbImEiLHsiY2xhc3MiOiJtY2VNb3ZlIix0YWJpbmRleDoiLTEiLGhyZWY6ImphdmFzY3JpcHQ6OyJ9XSxbImEiLHsiY2xhc3MiOiJtY2VNaW4iLHRhYmluZGV4OiItMSIsaHJlZjoiamF2YXNjcmlwdDo7Iixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyJ9XSxbImEiLHsiY2xhc3MiOiJtY2VNYXgiLHRhYmluZGV4OiItMSIsaHJlZjoiamF2YXNjcmlwdDo7Iixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyJ9XSxbImEiLHsiY2xhc3MiOiJtY2VNZWQiLHRhYmluZGV4OiItMSIsaHJlZjoiamF2YXNjcmlwdDo7Iixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyJ9XSxbImEiLHsiY2xhc3MiOiJtY2VDbG9zZSIsdGFiaW5kZXg6Ii0xIixocmVmOiJqYXZhc2NyaXB0OjsiLG9ubW91c2Vkb3duOiJyZXR1cm4gZmFsc2U7In1dLFsiYSIse2lkOmkrIl9yZXNpemVfbiIsImNsYXNzIjoibWNlUmVzaXplIG1jZVJlc2l6ZU4iLHRhYmluZGV4OiItMSIsaHJlZjoiamF2YXNjcmlwdDo7In1dLFsiYSIse2lkOmkrIl9yZXNpemVfcyIsImNsYXNzIjoibWNlUmVzaXplIG1jZVJlc2l6ZVMiLHRhYmluZGV4OiItMSIsaHJlZjoiamF2YXNjcmlwdDo7In1dLFsiYSIse2lkOmkrIl9yZXNpemVfdyIsImNsYXNzIjoibWNlUmVzaXplIG1jZVJlc2l6ZVciLHRhYmluZGV4OiItMSIsaHJlZjoiamF2YXNjcmlwdDo7In1dLFsiYSIse2lkOmkrIl9yZXNpemVfZSIsImNsYXNzIjoibWNlUmVzaXplIG1jZVJlc2l6ZUUiLHRhYmluZGV4OiItMSIsaHJlZjoiamF2YXNjcmlwdDo7In1dLFsiYSIse2lkOmkrIl9yZXNpemVfbnciLCJjbGFzcyI6Im1jZVJlc2l6ZSBtY2VSZXNpemVOVyIsdGFiaW5kZXg6Ii0xIixocmVmOiJqYXZhc2NyaXB0OjsifV0sWyJhIix7aWQ6aSsiX3Jlc2l6ZV9uZSIsImNsYXNzIjoibWNlUmVzaXplIG1jZVJlc2l6ZU5FIix0YWJpbmRleDoiLTEiLGhyZWY6ImphdmFzY3JpcHQ6OyJ9XSxbImEiLHtpZDppKyJfcmVzaXplX3N3IiwiY2xhc3MiOiJtY2VSZXNpemUgbWNlUmVzaXplU1ciLHRhYmluZGV4OiItMSIsaHJlZjoiamF2YXNjcmlwdDo7In1dLFsiYSIse2lkOmkrIl9yZXNpemVfc2UiLCJjbGFzcyI6Im1jZVJlc2l6ZSBtY2VSZXNpemVTRSIsdGFiaW5kZXg6Ii0xIixocmVmOiJqYXZhc2NyaXB0OjsifV1dXSk7ZC5zZXRTdHlsZXMoaSx7dG9wOi0xMDAwMCxsZWZ0Oi0xMDAwMH0pO2lmKHRpbnltY2UuaXNHZWNrbyl7ZC5zZXRTdHlsZShpLCJvdmVyZmxvdyIsImF1dG8iKX1pZighci50eXBlKXtnKz1kLmdldChpKyJfbGVmdCIpLmNsaWVudFdpZHRoO2crPWQuZ2V0KGkrIl9yaWdodCIpLmNsaWVudFdpZHRoO3MrPWQuZ2V0KGkrIl90b3AiKS5jbGllbnRIZWlnaHQ7cys9ZC5nZXQoaSsiX2JvdHRvbSIpLmNsaWVudEhlaWdodH1kLnNldFN0eWxlcyhpLHt0b3A6ci50b3AsbGVmdDpyLmxlZnQsd2lkdGg6ci53aWR0aCtnLGhlaWdodDpyLmhlaWdodCtzfSk7eD1yLnVybHx8ci5maWxlO2lmKHgpe2lmKHRpbnltY2UucmVsYXhlZERvbWFpbil7eCs9KHguaW5kZXhPZigiPyIpPT0tMT8iPyI6IiYiKSsibWNlX3Jkb21haW49Iit0aW55bWNlLnJlbGF4ZWREb21haW59eD10aW55bWNlLl9hZGRWZXIoeCl9aWYoIXIudHlwZSl7ZC5hZGQoaSsiX2NvbnRlbnQiLCJpZnJhbWUiLHtpZDppKyJfaWZyIixzcmM6J2phdmFzY3JpcHQ6IiInLGZyYW1lQm9yZGVyOjAsc3R5bGU6ImJvcmRlcjowO3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHgifSk7ZC5zZXRTdHlsZXMoaSsiX2lmciIse3dpZHRoOnIud2lkdGgsaGVpZ2h0OnIuaGVpZ2h0fSk7ZC5zZXRBdHRyaWIoaSsiX2lmciIsInNyYyIseCl9ZWxzZXtkLmFkZChpKyJfd3JhcHBlciIsImEiLHtpZDppKyJfb2siLCJjbGFzcyI6Im1jZUJ1dHRvbiBtY2VPayIsaHJlZjoiamF2YXNjcmlwdDo7Iixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyJ9LCJPayIpO2lmKHIudHlwZT09ImNvbmZpcm0iKXtkLmFkZChpKyJfd3JhcHBlciIsImEiLHsiY2xhc3MiOiJtY2VCdXR0b24gbWNlQ2FuY2VsIixocmVmOiJqYXZhc2NyaXB0OjsiLG9ubW91c2Vkb3duOiJyZXR1cm4gZmFsc2U7In0sIkNhbmNlbCIpfWQuYWRkKGkrIl9taWRkbGUiLCJkaXYiLHsiY2xhc3MiOiJtY2VJY29uIn0pO2Quc2V0SFRNTChpKyJfY29udGVudCIsci5jb250ZW50LnJlcGxhY2UoIlxuIiwiPGJyIC8+IikpfW49YS5hZGQoaSwibW91c2Vkb3duIixmdW5jdGlvbih0KXt2YXIgdT10LnRhcmdldCxmLHA7Zj15LndpbmRvd3NbaV07eS5mb2N1cyhpKTtpZih1Lm5vZGVOYW1lPT0iQSJ8fHUubm9kZU5hbWU9PSJhIil7aWYodS5jbGFzc05hbWU9PSJtY2VNYXgiKXtmLm9sZFBvcz1mLmVsZW1lbnQuZ2V0WFkoKTtmLm9sZFNpemU9Zi5lbGVtZW50LmdldFNpemUoKTtwPWQuZ2V0Vmlld1BvcnQoKTtwLnctPTI7cC5oLT0yO2YuZWxlbWVudC5tb3ZlVG8ocC54LHAueSk7Zi5lbGVtZW50LnJlc2l6ZVRvKHAudyxwLmgpO2Quc2V0U3R5bGVzKGkrIl9pZnIiLHt3aWR0aDpwLnctZi5kZWx0YVdpZHRoLGhlaWdodDpwLmgtZi5kZWx0YUhlaWdodH0pO2QuYWRkQ2xhc3MoaSsiX3dyYXBwZXIiLCJtY2VNYXhpbWl6ZWQiKX1lbHNle2lmKHUuY2xhc3NOYW1lPT0ibWNlTWVkIil7Zi5lbGVtZW50Lm1vdmVUbyhmLm9sZFBvcy54LGYub2xkUG9zLnkpO2YuZWxlbWVudC5yZXNpemVUbyhmLm9sZFNpemUudyxmLm9sZFNpemUuaCk7Zi5pZnJhbWVFbGVtZW50LnJlc2l6ZVRvKGYub2xkU2l6ZS53LWYuZGVsdGFXaWR0aCxmLm9sZFNpemUuaC1mLmRlbHRhSGVpZ2h0KTtkLnJlbW92ZUNsYXNzKGkrIl93cmFwcGVyIiwibWNlTWF4aW1pemVkIil9ZWxzZXtpZih1LmNsYXNzTmFtZT09Im1jZU1vdmUiKXtyZXR1cm4geS5fc3RhcnREcmFnKGksdCx1LmNsYXNzTmFtZSl9ZWxzZXtpZihkLmhhc0NsYXNzKHUsIm1jZVJlc2l6ZSIpKXtyZXR1cm4geS5fc3RhcnREcmFnKGksdCx1LmNsYXNzTmFtZS5zdWJzdHJpbmcoMTMpKX19fX19fSk7bz1hLmFkZChpLCJjbGljayIsZnVuY3Rpb24oZil7dmFyIHA9Zi50YXJnZXQ7eS5mb2N1cyhpKTtpZihwLm5vZGVOYW1lPT0iQSJ8fHAubm9kZU5hbWU9PSJhIil7c3dpdGNoKHAuY2xhc3NOYW1lKXtjYXNlIm1jZUNsb3NlIjp5LmNsb3NlKG51bGwsaSk7cmV0dXJuIGEuY2FuY2VsKGYpO2Nhc2UibWNlQnV0dG9uIG1jZU9rIjpjYXNlIm1jZUJ1dHRvbiBtY2VDYW5jZWwiOnIuYnV0dG9uX2Z1bmMocC5jbGFzc05hbWU9PSJtY2VCdXR0b24gbWNlT2siKTtyZXR1cm4gYS5jYW5jZWwoZil9fX0pO3Y9eS53aW5kb3dzW2ldPXtpZDppLG1vdXNlZG93bl9mdW5jOm4sY2xpY2tfZnVuYzpvLGVsZW1lbnQ6bmV3IGIoaSx7YmxvY2tlcjoxLGNvbnRhaW5lcjpxLmdldENvbnRhaW5lcigpfSksaWZyYW1lRWxlbWVudDpuZXcgYihpKyJfaWZyIiksZmVhdHVyZXM6cixkZWx0YVdpZHRoOmcsZGVsdGFIZWlnaHQ6c307di5pZnJhbWVFbGVtZW50Lm9uKCJmb2N1cyIsZnVuY3Rpb24oKXt5LmZvY3VzKGkpfSk7aWYoeS5jb3VudD09MCYmeS5lZGl0b3IuZ2V0UGFyYW0oImRpYWxvZ190eXBlIiwibW9kYWwiKT09Im1vZGFsIil7ZC5hZGQoZC5kb2MuYm9keSwiZGl2Iix7aWQ6Im1jZU1vZGFsQmxvY2tlciIsImNsYXNzIjooeS5lZGl0b3Iuc2V0dGluZ3MuaW5saW5lcG9wdXBzX3NraW58fCJjbGVhcmxvb2tzMiIpKyJfbW9kYWxCbG9ja2VyIixzdHlsZTp7ekluZGV4OnkuekluZGV4LTF9fSk7ZC5zaG93KCJtY2VNb2RhbEJsb2NrZXIiKX1lbHNle2Quc2V0U3R5bGUoIm1jZU1vZGFsQmxvY2tlciIsInotaW5kZXgiLHkuekluZGV4LTEpfWlmKHRpbnltY2UuaXNJRTZ8fC9GaXJlZm94XC8yXC4vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fCh0aW55bWNlLmlzSUUmJiFkLmJveE1vZGVsKSl7ZC5zZXRTdHlsZXMoIm1jZU1vZGFsQmxvY2tlciIse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDpoLngsdG9wOmgueSx3aWR0aDpoLnctMixoZWlnaHQ6aC5oLTJ9KX15LmZvY3VzKGkpO3kuX2ZpeElFTGF5b3V0KGksMSk7aWYoZC5nZXQoaSsiX29rIikpe2QuZ2V0KGkrIl9vayIpLmZvY3VzKCl9eS5jb3VudCsrO3JldHVybiB2fSxmb2N1czpmdW5jdGlvbihoKXt2YXIgZz10aGlzLGY7aWYoZj1nLndpbmRvd3NbaF0pe2YuekluZGV4PXRoaXMuekluZGV4Kys7Zi5lbGVtZW50LnNldFN0eWxlKCJ6SW5kZXgiLGYuekluZGV4KTtmLmVsZW1lbnQudXBkYXRlKCk7aD1oKyJfd3JhcHBlciI7ZC5yZW1vdmVDbGFzcyhnLmxhc3RJZCwibWNlRm9jdXMiKTtkLmFkZENsYXNzKGgsIm1jZUZvY3VzIik7Zy5sYXN0SWQ9aH19LF9hZGRBbGw6ZnVuY3Rpb24oayxoKXt2YXIgZyxsLGY9dGhpcyxqPXRpbnltY2UuRE9NO2lmKGMoaCwic3RyaW5nIikpe2suYXBwZW5kQ2hpbGQoai5kb2MuY3JlYXRlVGV4dE5vZGUoaCkpfWVsc2V7aWYoaC5sZW5ndGgpe2s9ay5hcHBlbmRDaGlsZChqLmNyZWF0ZShoWzBdLGhbMV0pKTtmb3IoZz0yO2c8aC5sZW5ndGg7ZysrKXtmLl9hZGRBbGwoayxoW2ddKX19fX0sX3N0YXJ0RHJhZzpmdW5jdGlvbih2LEcsRSl7dmFyIG89dGhpcyx1LHosQz1kLmRvYyxmLGw9by53aW5kb3dzW3ZdLGg9bC5lbGVtZW50LHk9aC5nZXRYWSgpLHgscSxGLGcsQSxzLHIsaixpLG0sayxuLEI7Zz17eDowLHk6MH07QT1kLmdldFZpZXdQb3J0KCk7QS53LT0yO0EuaC09MjtqPUcuc2NyZWVuWDtpPUcuc2NyZWVuWTttPWs9bj1CPTA7dT1hLmFkZChDLCJtb3VzZXVwIixmdW5jdGlvbihwKXthLnJlbW92ZShDLCJtb3VzZXVwIix1KTthLnJlbW92ZShDLCJtb3VzZW1vdmUiLHopO2lmKGYpe2YucmVtb3ZlKCl9aC5tb3ZlQnkobSxrKTtoLnJlc2l6ZUJ5KG4sQik7cT1oLmdldFNpemUoKTtkLnNldFN0eWxlcyh2KyJfaWZyIix7d2lkdGg6cS53LWwuZGVsdGFXaWR0aCxoZWlnaHQ6cS5oLWwuZGVsdGFIZWlnaHR9KTtvLl9maXhJRUxheW91dCh2LDEpO3JldHVybiBhLmNhbmNlbChwKX0pO2lmKEUhPSJNb3ZlIil7RCgpfWZ1bmN0aW9uIEQoKXtpZihmKXtyZXR1cm59by5fZml4SUVMYXlvdXQodiwwKTtkLmFkZChDLmJvZHksImRpdiIse2lkOiJtY2VFdmVudEJsb2NrZXIiLCJjbGFzcyI6Im1jZUV2ZW50QmxvY2tlciAiKyhvLmVkaXRvci5zZXR0aW5ncy5pbmxpbmVwb3B1cHNfc2tpbnx8ImNsZWFybG9va3MyIiksc3R5bGU6e3pJbmRleDpvLnpJbmRleCsxfX0pO2lmKHRpbnltY2UuaXNJRTZ8fCh0aW55bWNlLmlzSUUmJiFkLmJveE1vZGVsKSl7ZC5zZXRTdHlsZXMoIm1jZUV2ZW50QmxvY2tlciIse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDpBLngsdG9wOkEueSx3aWR0aDpBLnctMixoZWlnaHQ6QS5oLTJ9KX1mPW5ldyBiKCJtY2VFdmVudEJsb2NrZXIiKTtmLnVwZGF0ZSgpO3g9aC5nZXRYWSgpO3E9aC5nZXRTaXplKCk7cz1nLngreC54LUEueDtyPWcueSt4LnktQS55O2QuYWRkKGYuZ2V0KCksImRpdiIse2lkOiJtY2VQbGFjZUhvbGRlciIsImNsYXNzIjoibWNlUGxhY2VIb2xkZXIiLHN0eWxlOntsZWZ0OnMsdG9wOnIsd2lkdGg6cS53LGhlaWdodDpxLmh9fSk7Rj1uZXcgYigibWNlUGxhY2VIb2xkZXIiKX16PWEuYWRkKEMsIm1vdXNlbW92ZSIsZnVuY3Rpb24odyl7dmFyIHAsSCx0O0QoKTtwPXcuc2NyZWVuWC1qO0g9dy5zY3JlZW5ZLWk7c3dpdGNoKEUpe2Nhc2UiUmVzaXplVyI6bT1wO249MC1wO2JyZWFrO2Nhc2UiUmVzaXplRSI6bj1wO2JyZWFrO2Nhc2UiUmVzaXplTiI6Y2FzZSJSZXNpemVOVyI6Y2FzZSJSZXNpemVORSI6aWYoRT09IlJlc2l6ZU5XIil7bT1wO249MC1wfWVsc2V7aWYoRT09IlJlc2l6ZU5FIil7bj1wfX1rPUg7Qj0wLUg7YnJlYWs7Y2FzZSJSZXNpemVTIjpjYXNlIlJlc2l6ZVNXIjpjYXNlIlJlc2l6ZVNFIjppZihFPT0iUmVzaXplU1ciKXttPXA7bj0wLXB9ZWxzZXtpZihFPT0iUmVzaXplU0UiKXtuPXB9fUI9SDticmVhaztjYXNlIm1jZU1vdmUiOm09cDtrPUg7YnJlYWt9aWYobjwodD1sLmZlYXR1cmVzLm1pbl93aWR0aC1xLncpKXtpZihtIT09MCl7bSs9bi10fW49dH1pZihCPCh0PWwuZmVhdHVyZXMubWluX2hlaWdodC1xLmgpKXtpZihrIT09MCl7ays9Qi10fUI9dH1uPU1hdGgubWluKG4sbC5mZWF0dXJlcy5tYXhfd2lkdGgtcS53KTtCPU1hdGgubWluKEIsbC5mZWF0dXJlcy5tYXhfaGVpZ2h0LXEuaCk7bT1NYXRoLm1heChtLEEueC0ocytBLngpKTtrPU1hdGgubWF4KGssQS55LShyK0EueSkpO209TWF0aC5taW4obSwoQS53K0EueCktKHMrcS53K0EueCkpO2s9TWF0aC5taW4oaywoQS5oK0EueSktKHIrcS5oK0EueSkpO2lmKG0rayE9PTApe2lmKHMrbTwwKXttPTB9aWYocitrPDApe2s9MH1GLm1vdmVUbyhzK20scitrKX1pZihuK0IhPT0wKXtGLnJlc2l6ZVRvKHEudytuLHEuaCtCKX1yZXR1cm4gYS5jYW5jZWwodyl9KTtyZXR1cm4gYS5jYW5jZWwoRyl9LHJlc2l6ZUJ5OmZ1bmN0aW9uKGcsaCxpKXt2YXIgZj10aGlzLndpbmRvd3NbaV07aWYoZil7Zi5lbGVtZW50LnJlc2l6ZUJ5KGcsaCk7Zi5pZnJhbWVFbGVtZW50LnJlc2l6ZUJ5KGcsaCl9fSxjbG9zZTpmdW5jdGlvbihqLGwpe3ZhciBoPXRoaXMsZyxrPWQuZG9jLGY9MCxpLGw7bD1oLl9maW5kSWQobHx8aik7aWYoIWgud2luZG93c1tsXSl7aC5wYXJlbnQoaik7cmV0dXJufWguY291bnQtLTtpZihoLmNvdW50PT0wKXtkLnJlbW92ZSgibWNlTW9kYWxCbG9ja2VyIil9aWYoZz1oLndpbmRvd3NbbF0pe2gub25DbG9zZS5kaXNwYXRjaChoKTthLnJlbW92ZShrLCJtb3VzZWRvd24iLGcubW91c2Vkb3duRnVuYyk7YS5yZW1vdmUoaywiY2xpY2siLGcuY2xpY2tGdW5jKTthLmNsZWFyKGwpO2EuY2xlYXIobCsiX2lmciIpO2Quc2V0QXR0cmliKGwrIl9pZnIiLCJzcmMiLCdqYXZhc2NyaXB0OiIiJyk7Zy5lbGVtZW50LnJlbW92ZSgpO2RlbGV0ZSBoLndpbmRvd3NbbF07ZShoLndpbmRvd3MsZnVuY3Rpb24obSl7aWYobS56SW5kZXg+Zil7aT1tO2Y9bS56SW5kZXh9fSk7aWYoaSl7aC5mb2N1cyhpLmlkKX19fSxzZXRUaXRsZTpmdW5jdGlvbihmLGcpe3ZhciBoO2Y9dGhpcy5fZmluZElkKGYpO2lmKGg9ZC5nZXQoZisiX3RpdGxlIikpe2guaW5uZXJIVE1MPWQuZW5jb2RlKGcpfX0sYWxlcnQ6ZnVuY3Rpb24oZyxmLGope3ZhciBpPXRoaXMsaDtoPWkub3Blbih7dGl0bGU6aSx0eXBlOiJhbGVydCIsYnV0dG9uX2Z1bmM6ZnVuY3Rpb24oayl7aWYoZil7Zi5jYWxsKGt8fGksayl9aS5jbG9zZShudWxsLGguaWQpfSxjb250ZW50OmQuZW5jb2RlKGkuZWRpdG9yLmdldExhbmcoZyxnKSksaW5saW5lOjEsd2lkdGg6NDAwLGhlaWdodDoxMzB9KX0sY29uZmlybTpmdW5jdGlvbihnLGYsail7dmFyIGk9dGhpcyxoO2g9aS5vcGVuKHt0aXRsZTppLHR5cGU6ImNvbmZpcm0iLGJ1dHRvbl9mdW5jOmZ1bmN0aW9uKGspe2lmKGYpe2YuY2FsbChrfHxpLGspfWkuY2xvc2UobnVsbCxoLmlkKX0sY29udGVudDpkLmVuY29kZShpLmVkaXRvci5nZXRMYW5nKGcsZykpLGlubGluZToxLHdpZHRoOjQwMCxoZWlnaHQ6MTMwfSl9LF9maW5kSWQ6ZnVuY3Rpb24oZil7dmFyIGc9dGhpcztpZih0eXBlb2YoZik9PSJzdHJpbmciKXtyZXR1cm4gZn1lKGcud2luZG93cyxmdW5jdGlvbihoKXt2YXIgaT1kLmdldChoLmlkKyJfaWZyIik7aWYoaSYmZj09aS5jb250ZW50V2luZG93KXtmPWguaWQ7cmV0dXJuIGZhbHNlfX0pO3JldHVybiBmfSxfZml4SUVMYXlvdXQ6ZnVuY3Rpb24oaSxoKXt2YXIgZixnO2lmKCF0aW55bWNlLmlzSUU2KXtyZXR1cm59ZShbIm4iLCJzIiwidyIsImUiLCJudyIsIm5lIiwic3ciLCJzZSJdLGZ1bmN0aW9uKGope3ZhciBrPWQuZ2V0KGkrIl9yZXNpemVfIitqKTtkLnNldFN0eWxlcyhrLHt3aWR0aDpoP2suY2xpZW50V2lkdGg6IiIsaGVpZ2h0Omg/ay5jbGllbnRIZWlnaHQ6IiIsY3Vyc29yOmQuZ2V0U3R5bGUoaywiY3Vyc29yIiwxKX0pO2Quc2V0U3R5bGUoaSsiX2JvdHRvbSIsImJvdHRvbSIsIi0xcHgiKTtrPTB9KTtpZihmPXRoaXMud2luZG93c1tpXSl7Zi5lbGVtZW50LmhpZGUoKTtmLmVsZW1lbnQuc2hvdygpO2UoZC5zZWxlY3QoImRpdixhIixpKSxmdW5jdGlvbihrLGope2lmKGsuY3VycmVudFN0eWxlLmJhY2tncm91bmRJbWFnZSE9Im5vbmUiKXtnPW5ldyBJbWFnZSgpO2cuc3JjPWsuY3VycmVudFN0eWxlLmJhY2tncm91bmRJbWFnZS5yZXBsYWNlKC91cmxcKFwiKC4rKVwiXCkvLCIkMSIpfX0pO2QuZ2V0KGkpLnN0eWxlLmZpbHRlcj0iIn19fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgiaW5saW5lcG9wdXBzIix0aW55bWNlLnBsdWdpbnMuSW5saW5lUG9wdXBzKX0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEVsZW1lbnQgPSB0aW55bWNlLmRvbS5FbGVtZW50LCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBlYWNoID0gdGlueW1jZS5lYWNoLCBpcyA9IHRpbnltY2UuaXM7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLklubGluZVBvcHVwcycsIHsNCgkJaW5pdCA6IGZ1bmN0aW9uKGVkLCB1cmwpIHsNCgkJCS8vIFJlcGxhY2Ugd2luZG93IG1hbmFnZXINCgkJCWVkLm9uQmVmb3JlUmVuZGVyVUkuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCWVkLndpbmRvd01hbmFnZXIgPSBuZXcgdGlueW1jZS5JbmxpbmVXaW5kb3dNYW5hZ2VyKGVkKTsNCgkJCQlET00ubG9hZENTUyh1cmwgKyAnL3NraW5zLycgKyAoZWQuc2V0dGluZ3MuaW5saW5lcG9wdXBzX3NraW4gfHwgJ2NsZWFybG9va3MyJykgKyAiL3dpbmRvdy5jc3MiKTsNCgkJCX0pOw0KCQl9LA0KDQoJCWdldEluZm8gOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB7DQoJCQkJbG9uZ25hbWUgOiAnSW5saW5lUG9wdXBzJywNCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9pbmxpbmVwb3B1cHMnLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9DQoJfSk7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5JbmxpbmVXaW5kb3dNYW5hZ2VyOnRpbnltY2UuV2luZG93TWFuYWdlcicsIHsNCgkJSW5saW5lV2luZG93TWFuYWdlciA6IGZ1bmN0aW9uKGVkKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQucGFyZW50KGVkKTsNCgkJCXQuekluZGV4ID0gMzAwMDAwOw0KCQkJdC5jb3VudCA9IDA7DQoJCQl0LndpbmRvd3MgPSB7fTsNCgkJfSwNCg0KCQlvcGVuIDogZnVuY3Rpb24oZiwgcCkgew0KCQkJdmFyIHQgPSB0aGlzLCBpZCwgb3B0ID0gJycsIGVkID0gdC5lZGl0b3IsIGR3ID0gMCwgZGggPSAwLCB2cCwgcG8sIG1kZiwgY2xmLCB3ZSwgdywgdTsNCg0KCQkJZiA9IGYgfHwge307DQoJCQlwID0gcCB8fCB7fTsNCg0KCQkJLy8gUnVuIG5hdGl2ZSB3aW5kb3dzDQoJCQlpZiAoIWYuaW5saW5lKQ0KCQkJCXJldHVybiB0LnBhcmVudChmLCBwKTsNCg0KCQkJLy8gT25seSBzdG9yZSBzZWxlY3Rpb24gaWYgdGhlIHR5cGUgaXMgYSBub3JtYWwgd2luZG93DQoJCQlpZiAoIWYudHlwZSkNCgkJCQl0LmJvb2ttYXJrID0gZWQuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpOw0KDQoJCQlpZCA9IERPTS51bmlxdWVJZCgpOw0KCQkJdnAgPSBET00uZ2V0Vmlld1BvcnQoKTsNCgkJCWYud2lkdGggPSBwYXJzZUludChmLndpZHRoIHx8IDMyMCk7DQoJCQlmLmhlaWdodCA9IHBhcnNlSW50KGYuaGVpZ2h0IHx8IDI0MCkgKyAodGlueW1jZS5pc0lFID8gOCA6IDApOw0KCQkJZi5taW5fd2lkdGggPSBwYXJzZUludChmLm1pbl93aWR0aCB8fCAxNTApOw0KCQkJZi5taW5faGVpZ2h0ID0gcGFyc2VJbnQoZi5taW5faGVpZ2h0IHx8IDEwMCk7DQoJCQlmLm1heF93aWR0aCA9IHBhcnNlSW50KGYubWF4X3dpZHRoIHx8IDIwMDApOw0KCQkJZi5tYXhfaGVpZ2h0ID0gcGFyc2VJbnQoZi5tYXhfaGVpZ2h0IHx8IDIwMDApOw0KCQkJZi5sZWZ0ID0gZi5sZWZ0IHx8IE1hdGgucm91bmQoTWF0aC5tYXgodnAueCwgdnAueCArICh2cC53IC8gMi4wKSAtIChmLndpZHRoIC8gMi4wKSkpOw0KCQkJZi50b3AgPSBmLnRvcCB8fCBNYXRoLnJvdW5kKE1hdGgubWF4KHZwLnksIHZwLnkgKyAodnAuaCAvIDIuMCkgLSAoZi5oZWlnaHQgLyAyLjApKSk7DQoJCQlmLm1vdmFibGUgPSBmLnJlc2l6YWJsZSA9IHRydWU7DQoJCQlwLm1jZV93aWR0aCA9IGYud2lkdGg7DQoJCQlwLm1jZV9oZWlnaHQgPSBmLmhlaWdodDsNCgkJCXAubWNlX2lubGluZSA9IHRydWU7DQoJCQlwLm1jZV93aW5kb3dfaWQgPSBpZDsNCgkJCXAubWNlX2F1dG9fZm9jdXMgPSBmLmF1dG9fZm9jdXM7DQoNCgkJCS8vIFRyYW5zcG9zZQ0KLy8JCQlwbyA9IERPTS5nZXRQb3MoZWQuZ2V0Q29udGFpbmVyKCkpOw0KLy8JCQlmLmxlZnQgLT0gcG8ueDsNCi8vCQkJZi50b3AgLT0gcG8ueTsNCg0KCQkJdC5mZWF0dXJlcyA9IGY7DQoJCQl0LnBhcmFtcyA9IHA7DQoJCQl0Lm9uT3Blbi5kaXNwYXRjaCh0LCBmLCBwKTsNCg0KCQkJaWYgKGYudHlwZSkgew0KCQkJCW9wdCArPSAnIG1jZU1vZGFsJzsNCg0KCQkJCWlmIChmLnR5cGUpDQoJCQkJCW9wdCArPSAnIG1jZScgKyBmLnR5cGUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBmLnR5cGUuc3Vic3RyaW5nKDEpOw0KDQoJCQkJZi5yZXNpemFibGUgPSBmYWxzZTsNCgkJCX0NCg0KCQkJaWYgKGYuc3RhdHVzYmFyKQ0KCQkJCW9wdCArPSAnIG1jZVN0YXR1c2Jhcic7DQoNCgkJCWlmIChmLnJlc2l6YWJsZSkNCgkJCQlvcHQgKz0gJyBtY2VSZXNpemFibGUnOw0KDQoJCQlpZiAoZi5taW5pbWl6YWJsZSkNCgkJCQlvcHQgKz0gJyBtY2VNaW5pbWl6YWJsZSc7DQoNCgkJCWlmIChmLm1heGltaXphYmxlKQ0KCQkJCW9wdCArPSAnIG1jZU1heGltaXphYmxlJzsNCg0KCQkJaWYgKGYubW92YWJsZSkNCgkJCQlvcHQgKz0gJyBtY2VNb3ZhYmxlJzsNCg0KCQkJLy8gQ3JlYXRlIERPTSBvYmplY3RzDQoJCQl0Ll9hZGRBbGwoRE9NLmRvYy5ib2R5LCANCgkJCQlbJ2RpdicsIHtpZCA6IGlkLCAnY2xhc3MnIDogKGVkLnNldHRpbmdzLmlubGluZXBvcHVwc19za2luIHx8ICdjbGVhcmxvb2tzMicpICsgKHRpbnltY2UuaXNJRSAmJiB3aW5kb3cuZ2V0U2VsZWN0aW9uID8gJyBpZTknIDogJycpLCBzdHlsZSA6ICd3aWR0aDoxMDBweDtoZWlnaHQ6MTAwcHgnfSwgDQoJCQkJCVsnZGl2Jywge2lkIDogaWQgKyAnX3dyYXBwZXInLCAnY2xhc3MnIDogJ21jZVdyYXBwZXInICsgb3B0fSwNCgkJCQkJCVsnZGl2Jywge2lkIDogaWQgKyAnX3RvcCcsICdjbGFzcycgOiAnbWNlVG9wJ30sIA0KCQkJCQkJCVsnZGl2JywgeydjbGFzcycgOiAnbWNlTGVmdCd9XSwNCgkJCQkJCQlbJ2RpdicsIHsnY2xhc3MnIDogJ21jZUNlbnRlcid9XSwNCgkJCQkJCQlbJ2RpdicsIHsnY2xhc3MnIDogJ21jZVJpZ2h0J31dLA0KCQkJCQkJCVsnc3BhbicsIHtpZCA6IGlkICsgJ190aXRsZSd9LCBmLnRpdGxlIHx8ICcnXQ0KCQkJCQkJXSwNCg0KCQkJCQkJWydkaXYnLCB7aWQgOiBpZCArICdfbWlkZGxlJywgJ2NsYXNzJyA6ICdtY2VNaWRkbGUnfSwgDQoJCQkJCQkJWydkaXYnLCB7aWQgOiBpZCArICdfbGVmdCcsICdjbGFzcycgOiAnbWNlTGVmdCd9XSwNCgkJCQkJCQlbJ3NwYW4nLCB7aWQgOiBpZCArICdfY29udGVudCd9XSwNCgkJCQkJCQlbJ2RpdicsIHtpZCA6IGlkICsgJ19yaWdodCcsICdjbGFzcycgOiAnbWNlUmlnaHQnfV0NCgkJCQkJCV0sDQoNCgkJCQkJCVsnZGl2Jywge2lkIDogaWQgKyAnX2JvdHRvbScsICdjbGFzcycgOiAnbWNlQm90dG9tJ30sDQoJCQkJCQkJWydkaXYnLCB7J2NsYXNzJyA6ICdtY2VMZWZ0J31dLA0KCQkJCQkJCVsnZGl2JywgeydjbGFzcycgOiAnbWNlQ2VudGVyJ31dLA0KCQkJCQkJCVsnZGl2JywgeydjbGFzcycgOiAnbWNlUmlnaHQnfV0sDQoJCQkJCQkJWydzcGFuJywge2lkIDogaWQgKyAnX3N0YXR1cyd9LCAnQ29udGVudCddDQoJCQkJCQldLA0KDQoJCQkJCQlbJ2EnLCB7J2NsYXNzJyA6ICdtY2VNb3ZlJywgdGFiaW5kZXggOiAnLTEnLCBocmVmIDogJ2phdmFzY3JpcHQ6Oyd9XSwNCgkJCQkJCVsnYScsIHsnY2xhc3MnIDogJ21jZU1pbicsIHRhYmluZGV4IDogJy0xJywgaHJlZiA6ICdqYXZhc2NyaXB0OjsnLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7J31dLA0KCQkJCQkJWydhJywgeydjbGFzcycgOiAnbWNlTWF4JywgdGFiaW5kZXggOiAnLTEnLCBocmVmIDogJ2phdmFzY3JpcHQ6OycsIG9ubW91c2Vkb3duIDogJ3JldHVybiBmYWxzZTsnfV0sDQoJCQkJCQlbJ2EnLCB7J2NsYXNzJyA6ICdtY2VNZWQnLCB0YWJpbmRleCA6ICctMScsIGhyZWYgOiAnamF2YXNjcmlwdDo7Jywgb25tb3VzZWRvd24gOiAncmV0dXJuIGZhbHNlOyd9XSwNCgkJCQkJCVsnYScsIHsnY2xhc3MnIDogJ21jZUNsb3NlJywgdGFiaW5kZXggOiAnLTEnLCBocmVmIDogJ2phdmFzY3JpcHQ6OycsIG9ubW91c2Vkb3duIDogJ3JldHVybiBmYWxzZTsnfV0sDQoJCQkJCQlbJ2EnLCB7aWQgOiBpZCArICdfcmVzaXplX24nLCAnY2xhc3MnIDogJ21jZVJlc2l6ZSBtY2VSZXNpemVOJywgdGFiaW5kZXggOiAnLTEnLCBocmVmIDogJ2phdmFzY3JpcHQ6Oyd9XSwNCgkJCQkJCVsnYScsIHtpZCA6IGlkICsgJ19yZXNpemVfcycsICdjbGFzcycgOiAnbWNlUmVzaXplIG1jZVJlc2l6ZVMnLCB0YWJpbmRleCA6ICctMScsIGhyZWYgOiAnamF2YXNjcmlwdDo7J31dLA0KCQkJCQkJWydhJywge2lkIDogaWQgKyAnX3Jlc2l6ZV93JywgJ2NsYXNzJyA6ICdtY2VSZXNpemUgbWNlUmVzaXplVycsIHRhYmluZGV4IDogJy0xJywgaHJlZiA6ICdqYXZhc2NyaXB0OjsnfV0sDQoJCQkJCQlbJ2EnLCB7aWQgOiBpZCArICdfcmVzaXplX2UnLCAnY2xhc3MnIDogJ21jZVJlc2l6ZSBtY2VSZXNpemVFJywgdGFiaW5kZXggOiAnLTEnLCBocmVmIDogJ2phdmFzY3JpcHQ6Oyd9XSwNCgkJCQkJCVsnYScsIHtpZCA6IGlkICsgJ19yZXNpemVfbncnLCAnY2xhc3MnIDogJ21jZVJlc2l6ZSBtY2VSZXNpemVOVycsIHRhYmluZGV4IDogJy0xJywgaHJlZiA6ICdqYXZhc2NyaXB0OjsnfV0sDQoJCQkJCQlbJ2EnLCB7aWQgOiBpZCArICdfcmVzaXplX25lJywgJ2NsYXNzJyA6ICdtY2VSZXNpemUgbWNlUmVzaXplTkUnLCB0YWJpbmRleCA6ICctMScsIGhyZWYgOiAnamF2YXNjcmlwdDo7J31dLA0KCQkJCQkJWydhJywge2lkIDogaWQgKyAnX3Jlc2l6ZV9zdycsICdjbGFzcycgOiAnbWNlUmVzaXplIG1jZVJlc2l6ZVNXJywgdGFiaW5kZXggOiAnLTEnLCBocmVmIDogJ2phdmFzY3JpcHQ6Oyd9XSwNCgkJCQkJCVsnYScsIHtpZCA6IGlkICsgJ19yZXNpemVfc2UnLCAnY2xhc3MnIDogJ21jZVJlc2l6ZSBtY2VSZXNpemVTRScsIHRhYmluZGV4IDogJy0xJywgaHJlZiA6ICdqYXZhc2NyaXB0OjsnfV0NCgkJCQkJXQ0KCQkJCV0NCgkJCSk7DQoNCgkJCURPTS5zZXRTdHlsZXMoaWQsIHt0b3AgOiAtMTAwMDAsIGxlZnQgOiAtMTAwMDB9KTsNCg0KCQkJLy8gRml4IGdlY2tvIHJlbmRlcmluZyBidWcsIHdoZXJlIHRoZSBlZGl0b3JzIGlmcmFtZSBtZXNzZWQgd2l0aCB3aW5kb3cgY29udGVudHMNCgkJCWlmICh0aW55bWNlLmlzR2Vja28pDQoJCQkJRE9NLnNldFN0eWxlKGlkLCAnb3ZlcmZsb3cnLCAnYXV0bycpOw0KDQoJCQkvLyBNZWFzdXJlIGJvcmRlcnMNCgkJCWlmICghZi50eXBlKSB7DQoJCQkJZHcgKz0gRE9NLmdldChpZCArICdfbGVmdCcpLmNsaWVudFdpZHRoOw0KCQkJCWR3ICs9IERPTS5nZXQoaWQgKyAnX3JpZ2h0JykuY2xpZW50V2lkdGg7DQoJCQkJZGggKz0gRE9NLmdldChpZCArICdfdG9wJykuY2xpZW50SGVpZ2h0Ow0KCQkJCWRoICs9IERPTS5nZXQoaWQgKyAnX2JvdHRvbScpLmNsaWVudEhlaWdodDsNCgkJCX0NCg0KCQkJLy8gUmVzaXplIHdpbmRvdw0KCQkJRE9NLnNldFN0eWxlcyhpZCwge3RvcCA6IGYudG9wLCBsZWZ0IDogZi5sZWZ0LCB3aWR0aCA6IGYud2lkdGggKyBkdywgaGVpZ2h0IDogZi5oZWlnaHQgKyBkaH0pOw0KDQoJCQl1ID0gZi51cmwgfHwgZi5maWxlOw0KCQkJaWYgKHUpIHsNCgkJCQlpZiAodGlueW1jZS5yZWxheGVkRG9tYWluKQ0KCQkJCQl1ICs9ICh1LmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJykgKyAnbWNlX3Jkb21haW49JyArIHRpbnltY2UucmVsYXhlZERvbWFpbjsNCg0KCQkJCXUgPSB0aW55bWNlLl9hZGRWZXIodSk7DQoJCQl9DQoNCgkJCWlmICghZi50eXBlKSB7DQoJCQkJRE9NLmFkZChpZCArICdfY29udGVudCcsICdpZnJhbWUnLCB7aWQgOiBpZCArICdfaWZyJywgc3JjIDogJ2phdmFzY3JpcHQ6IiInLCBmcmFtZUJvcmRlciA6IDAsIHN0eWxlIDogJ2JvcmRlcjowO3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHgnfSk7DQoJCQkJRE9NLnNldFN0eWxlcyhpZCArICdfaWZyJywge3dpZHRoIDogZi53aWR0aCwgaGVpZ2h0IDogZi5oZWlnaHR9KTsNCgkJCQlET00uc2V0QXR0cmliKGlkICsgJ19pZnInLCAnc3JjJywgdSk7DQoJCQl9IGVsc2Ugew0KCQkJCURPTS5hZGQoaWQgKyAnX3dyYXBwZXInLCAnYScsIHtpZCA6IGlkICsgJ19vaycsICdjbGFzcycgOiAnbWNlQnV0dG9uIG1jZU9rJywgaHJlZiA6ICdqYXZhc2NyaXB0OjsnLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7J30sICdPaycpOw0KDQoJCQkJaWYgKGYudHlwZSA9PSAnY29uZmlybScpDQoJCQkJCURPTS5hZGQoaWQgKyAnX3dyYXBwZXInLCAnYScsIHsnY2xhc3MnIDogJ21jZUJ1dHRvbiBtY2VDYW5jZWwnLCBocmVmIDogJ2phdmFzY3JpcHQ6OycsIG9ubW91c2Vkb3duIDogJ3JldHVybiBmYWxzZTsnfSwgJ0NhbmNlbCcpOw0KDQoJCQkJRE9NLmFkZChpZCArICdfbWlkZGxlJywgJ2RpdicsIHsnY2xhc3MnIDogJ21jZUljb24nfSk7DQoJCQkJRE9NLnNldEhUTUwoaWQgKyAnX2NvbnRlbnQnLCBmLmNvbnRlbnQucmVwbGFjZSgnXG4nLCAnPGJyIC8+JykpOw0KCQkJfQ0KDQoJCQkvLyBSZWdpc3RlciBldmVudHMNCgkJCW1kZiA9IEV2ZW50LmFkZChpZCwgJ21vdXNlZG93bicsIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgbiA9IGUudGFyZ2V0LCB3LCB2cDsNCg0KCQkJCXcgPSB0LndpbmRvd3NbaWRdOw0KCQkJCXQuZm9jdXMoaWQpOw0KDQoJCQkJaWYgKG4ubm9kZU5hbWUgPT0gJ0EnIHx8IG4ubm9kZU5hbWUgPT0gJ2EnKSB7DQoJCQkJCWlmIChuLmNsYXNzTmFtZSA9PSAnbWNlTWF4Jykgew0KCQkJCQkJdy5vbGRQb3MgPSB3LmVsZW1lbnQuZ2V0WFkoKTsNCgkJCQkJCXcub2xkU2l6ZSA9IHcuZWxlbWVudC5nZXRTaXplKCk7DQoNCgkJCQkJCXZwID0gRE9NLmdldFZpZXdQb3J0KCk7DQoNCgkJCQkJCS8vIFJlZHVjZSB2aWV3cG9ydCBzaXplIHRvIGF2b2lkIHNjcm9sbGJhcnMNCgkJCQkJCXZwLncgLT0gMjsNCgkJCQkJCXZwLmggLT0gMjsNCg0KCQkJCQkJdy5lbGVtZW50Lm1vdmVUbyh2cC54LCB2cC55KTsNCgkJCQkJCXcuZWxlbWVudC5yZXNpemVUbyh2cC53LCB2cC5oKTsNCgkJCQkJCURPTS5zZXRTdHlsZXMoaWQgKyAnX2lmcicsIHt3aWR0aCA6IHZwLncgLSB3LmRlbHRhV2lkdGgsIGhlaWdodCA6IHZwLmggLSB3LmRlbHRhSGVpZ2h0fSk7DQoJCQkJCQlET00uYWRkQ2xhc3MoaWQgKyAnX3dyYXBwZXInLCAnbWNlTWF4aW1pemVkJyk7DQoJCQkJCX0gZWxzZSBpZiAobi5jbGFzc05hbWUgPT0gJ21jZU1lZCcpIHsNCgkJCQkJCS8vIFJlc2V0IHRvIG9sZCBzaXplDQoJCQkJCQl3LmVsZW1lbnQubW92ZVRvKHcub2xkUG9zLngsIHcub2xkUG9zLnkpOw0KCQkJCQkJdy5lbGVtZW50LnJlc2l6ZVRvKHcub2xkU2l6ZS53LCB3Lm9sZFNpemUuaCk7DQoJCQkJCQl3LmlmcmFtZUVsZW1lbnQucmVzaXplVG8ody5vbGRTaXplLncgLSB3LmRlbHRhV2lkdGgsIHcub2xkU2l6ZS5oIC0gdy5kZWx0YUhlaWdodCk7DQoNCgkJCQkJCURPTS5yZW1vdmVDbGFzcyhpZCArICdfd3JhcHBlcicsICdtY2VNYXhpbWl6ZWQnKTsNCgkJCQkJfSBlbHNlIGlmIChuLmNsYXNzTmFtZSA9PSAnbWNlTW92ZScpDQoJCQkJCQlyZXR1cm4gdC5fc3RhcnREcmFnKGlkLCBlLCBuLmNsYXNzTmFtZSk7DQoJCQkJCWVsc2UgaWYgKERPTS5oYXNDbGFzcyhuLCAnbWNlUmVzaXplJykpDQoJCQkJCQlyZXR1cm4gdC5fc3RhcnREcmFnKGlkLCBlLCBuLmNsYXNzTmFtZS5zdWJzdHJpbmcoMTMpKTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJY2xmID0gRXZlbnQuYWRkKGlkLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIG4gPSBlLnRhcmdldDsNCg0KCQkJCXQuZm9jdXMoaWQpOw0KDQoJCQkJaWYgKG4ubm9kZU5hbWUgPT0gJ0EnIHx8IG4ubm9kZU5hbWUgPT0gJ2EnKSB7DQoJCQkJCXN3aXRjaCAobi5jbGFzc05hbWUpIHsNCgkJCQkJCWNhc2UgJ21jZUNsb3NlJzoNCgkJCQkJCQl0LmNsb3NlKG51bGwsIGlkKTsNCgkJCQkJCQlyZXR1cm4gRXZlbnQuY2FuY2VsKGUpOw0KDQoJCQkJCQljYXNlICdtY2VCdXR0b24gbWNlT2snOg0KCQkJCQkJY2FzZSAnbWNlQnV0dG9uIG1jZUNhbmNlbCc6DQoJCQkJCQkJZi5idXR0b25fZnVuYyhuLmNsYXNzTmFtZSA9PSAnbWNlQnV0dG9uIG1jZU9rJyk7DQoJCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0pOw0KDQoJCQkvLyBBZGQgd2luZG93DQoJCQl3ID0gdC53aW5kb3dzW2lkXSA9IHsNCgkJCQlpZCA6IGlkLA0KCQkJCW1vdXNlZG93bl9mdW5jIDogbWRmLA0KCQkJCWNsaWNrX2Z1bmMgOiBjbGYsDQoJCQkJZWxlbWVudCA6IG5ldyBFbGVtZW50KGlkLCB7YmxvY2tlciA6IDEsIGNvbnRhaW5lciA6IGVkLmdldENvbnRhaW5lcigpfSksDQoJCQkJaWZyYW1lRWxlbWVudCA6IG5ldyBFbGVtZW50KGlkICsgJ19pZnInKSwNCgkJCQlmZWF0dXJlcyA6IGYsDQoJCQkJZGVsdGFXaWR0aCA6IGR3LA0KCQkJCWRlbHRhSGVpZ2h0IDogZGgNCgkJCX07DQoNCgkJCXcuaWZyYW1lRWxlbWVudC5vbignZm9jdXMnLCBmdW5jdGlvbigpIHsNCgkJCQl0LmZvY3VzKGlkKTsNCgkJCX0pOw0KDQoJCQkvLyBTZXR1cCBibG9ja2VyDQoJCQlpZiAodC5jb3VudCA9PSAwICYmIHQuZWRpdG9yLmdldFBhcmFtKCdkaWFsb2dfdHlwZScsICdtb2RhbCcpID09ICdtb2RhbCcpIHsNCgkJCQlET00uYWRkKERPTS5kb2MuYm9keSwgJ2RpdicsIHsNCgkJCQkJaWQgOiAnbWNlTW9kYWxCbG9ja2VyJywNCgkJCQkJJ2NsYXNzJyA6ICh0LmVkaXRvci5zZXR0aW5ncy5pbmxpbmVwb3B1cHNfc2tpbiB8fCAnY2xlYXJsb29rczInKSArICdfbW9kYWxCbG9ja2VyJywNCgkJCQkJc3R5bGUgOiB7ekluZGV4IDogdC56SW5kZXggLSAxfQ0KCQkJCX0pOw0KDQoJCQkJRE9NLnNob3coJ21jZU1vZGFsQmxvY2tlcicpOyAvLyBSZWR1Y2VzIGZsaWNrZXIgaW4gSUUNCgkJCX0gZWxzZQ0KCQkJCURPTS5zZXRTdHlsZSgnbWNlTW9kYWxCbG9ja2VyJywgJ3otaW5kZXgnLCB0LnpJbmRleCAtIDEpOw0KDQoJCQlpZiAodGlueW1jZS5pc0lFNiB8fCAvRmlyZWZveFwvMlwuLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8ICh0aW55bWNlLmlzSUUgJiYgIURPTS5ib3hNb2RlbCkpDQoJCQkJRE9NLnNldFN0eWxlcygnbWNlTW9kYWxCbG9ja2VyJywge3Bvc2l0aW9uIDogJ2Fic29sdXRlJywgbGVmdCA6IHZwLngsIHRvcCA6IHZwLnksIHdpZHRoIDogdnAudyAtIDIsIGhlaWdodCA6IHZwLmggLSAyfSk7DQoNCgkJCXQuZm9jdXMoaWQpOw0KCQkJdC5fZml4SUVMYXlvdXQoaWQsIDEpOw0KDQoJCQkvLyBGb2N1cyBvayBidXR0b24NCgkJCWlmIChET00uZ2V0KGlkICsgJ19vaycpKQ0KCQkJCURPTS5nZXQoaWQgKyAnX29rJykuZm9jdXMoKTsNCg0KCQkJdC5jb3VudCsrOw0KDQoJCQlyZXR1cm4gdzsNCgkJfSwNCg0KCQlmb2N1cyA6IGZ1bmN0aW9uKGlkKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHc7DQoNCgkJCWlmICh3ID0gdC53aW5kb3dzW2lkXSkgew0KCQkJCXcuekluZGV4ID0gdGhpcy56SW5kZXgrKzsNCgkJCQl3LmVsZW1lbnQuc2V0U3R5bGUoJ3pJbmRleCcsIHcuekluZGV4KTsNCgkJCQl3LmVsZW1lbnQudXBkYXRlKCk7DQoNCgkJCQlpZCA9IGlkICsgJ193cmFwcGVyJzsNCgkJCQlET00ucmVtb3ZlQ2xhc3ModC5sYXN0SWQsICdtY2VGb2N1cycpOw0KCQkJCURPTS5hZGRDbGFzcyhpZCwgJ21jZUZvY3VzJyk7DQoJCQkJdC5sYXN0SWQgPSBpZDsNCgkJCX0NCgkJfSwNCg0KCQlfYWRkQWxsIDogZnVuY3Rpb24odGUsIG5lKSB7DQoJCQl2YXIgaSwgbiwgdCA9IHRoaXMsIGRvbSA9IHRpbnltY2UuRE9NOw0KDQoJCQlpZiAoaXMobmUsICdzdHJpbmcnKSkNCgkJCQl0ZS5hcHBlbmRDaGlsZChkb20uZG9jLmNyZWF0ZVRleHROb2RlKG5lKSk7DQoJCQllbHNlIGlmIChuZS5sZW5ndGgpIHsNCgkJCQl0ZSA9IHRlLmFwcGVuZENoaWxkKGRvbS5jcmVhdGUobmVbMF0sIG5lWzFdKSk7DQoNCgkJCQlmb3IgKGk9MjsgaTxuZS5sZW5ndGg7IGkrKykNCgkJCQkJdC5fYWRkQWxsKHRlLCBuZVtpXSk7DQoJCQl9DQoJCX0sDQoNCgkJX3N0YXJ0RHJhZyA6IGZ1bmN0aW9uKGlkLCBzZSwgYWMpIHsNCgkJCXZhciB0ID0gdGhpcywgbXUsIG1tLCBkID0gRE9NLmRvYywgZWIsIHcgPSB0LndpbmRvd3NbaWRdLCB3ZSA9IHcuZWxlbWVudCwgc3AgPSB3ZS5nZXRYWSgpLCBwLCBzeiwgcGgsIGNwLCB2cCwgc3gsIHN5LCBzZXgsIHNleSwgZHgsIGR5LCBkdywgZGg7DQoNCgkJCS8vIEdldCBwb3NpdG9ucyBhbmQgc2l6ZXMNCi8vCQkJY3AgPSBET00uZ2V0UG9zKHQuZWRpdG9yLmdldENvbnRhaW5lcigpKTsNCgkJCWNwID0ge3ggOiAwLCB5IDogMH07DQoJCQl2cCA9IERPTS5nZXRWaWV3UG9ydCgpOw0KDQoJCQkvLyBSZWR1Y2Ugdmlld3BvcnQgc2l6ZSB0byBhdm9pZCBzY3JvbGxiYXJzIHdoaWxlIGRyYWdnaW5nDQoJCQl2cC53IC09IDI7DQoJCQl2cC5oIC09IDI7DQoNCgkJCXNleCA9IHNlLnNjcmVlblg7DQoJCQlzZXkgPSBzZS5zY3JlZW5ZOw0KCQkJZHggPSBkeSA9IGR3ID0gZGggPSAwOw0KDQoJCQkvLyBIYW5kbGUgbW91c2UgdXANCgkJCW11ID0gRXZlbnQuYWRkKGQsICdtb3VzZXVwJywgZnVuY3Rpb24oZSkgew0KCQkJCUV2ZW50LnJlbW92ZShkLCAnbW91c2V1cCcsIG11KTsNCgkJCQlFdmVudC5yZW1vdmUoZCwgJ21vdXNlbW92ZScsIG1tKTsNCg0KCQkJCWlmIChlYikNCgkJCQkJZWIucmVtb3ZlKCk7DQoNCgkJCQl3ZS5tb3ZlQnkoZHgsIGR5KTsNCgkJCQl3ZS5yZXNpemVCeShkdywgZGgpOw0KCQkJCXN6ID0gd2UuZ2V0U2l6ZSgpOw0KCQkJCURPTS5zZXRTdHlsZXMoaWQgKyAnX2lmcicsIHt3aWR0aCA6IHN6LncgLSB3LmRlbHRhV2lkdGgsIGhlaWdodCA6IHN6LmggLSB3LmRlbHRhSGVpZ2h0fSk7DQoJCQkJdC5fZml4SUVMYXlvdXQoaWQsIDEpOw0KDQoJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCX0pOw0KDQoJCQlpZiAoYWMgIT0gJ01vdmUnKQ0KCQkJCXN0YXJ0TW92ZSgpOw0KDQoJCQlmdW5jdGlvbiBzdGFydE1vdmUoKSB7DQoJCQkJaWYgKGViKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQl0Ll9maXhJRUxheW91dChpZCwgMCk7DQoNCgkJCQkvLyBTZXR1cCBldmVudCBibG9ja2VyDQoJCQkJRE9NLmFkZChkLmJvZHksICdkaXYnLCB7DQoJCQkJCWlkIDogJ21jZUV2ZW50QmxvY2tlcicsDQoJCQkJCSdjbGFzcycgOiAnbWNlRXZlbnRCbG9ja2VyICcgKyAodC5lZGl0b3Iuc2V0dGluZ3MuaW5saW5lcG9wdXBzX3NraW4gfHwgJ2NsZWFybG9va3MyJyksDQoJCQkJCXN0eWxlIDoge3pJbmRleCA6IHQuekluZGV4ICsgMX0NCgkJCQl9KTsNCg0KCQkJCWlmICh0aW55bWNlLmlzSUU2IHx8ICh0aW55bWNlLmlzSUUgJiYgIURPTS5ib3hNb2RlbCkpDQoJCQkJCURPTS5zZXRTdHlsZXMoJ21jZUV2ZW50QmxvY2tlcicsIHtwb3NpdGlvbiA6ICdhYnNvbHV0ZScsIGxlZnQgOiB2cC54LCB0b3AgOiB2cC55LCB3aWR0aCA6IHZwLncgLSAyLCBoZWlnaHQgOiB2cC5oIC0gMn0pOw0KDQoJCQkJZWIgPSBuZXcgRWxlbWVudCgnbWNlRXZlbnRCbG9ja2VyJyk7DQoJCQkJZWIudXBkYXRlKCk7DQoNCgkJCQkvLyBTZXR1cCBwbGFjZWhvbGRlcg0KCQkJCXAgPSB3ZS5nZXRYWSgpOw0KCQkJCXN6ID0gd2UuZ2V0U2l6ZSgpOw0KCQkJCXN4ID0gY3AueCArIHAueCAtIHZwLng7DQoJCQkJc3kgPSBjcC55ICsgcC55IC0gdnAueTsNCgkJCQlET00uYWRkKGViLmdldCgpLCAnZGl2Jywge2lkIDogJ21jZVBsYWNlSG9sZGVyJywgJ2NsYXNzJyA6ICdtY2VQbGFjZUhvbGRlcicsIHN0eWxlIDoge2xlZnQgOiBzeCwgdG9wIDogc3ksIHdpZHRoIDogc3oudywgaGVpZ2h0IDogc3ouaH19KTsNCgkJCQlwaCA9IG5ldyBFbGVtZW50KCdtY2VQbGFjZUhvbGRlcicpOw0KCQkJfTsNCg0KCQkJLy8gSGFuZGxlIG1vdXNlIG1vdmUvZHJhZw0KCQkJbW0gPSBFdmVudC5hZGQoZCwgJ21vdXNlbW92ZScsIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgeCwgeSwgdjsNCg0KCQkJCXN0YXJ0TW92ZSgpOw0KDQoJCQkJeCA9IGUuc2NyZWVuWCAtIHNleDsNCgkJCQl5ID0gZS5zY3JlZW5ZIC0gc2V5Ow0KDQoJCQkJc3dpdGNoIChhYykgew0KCQkJCQljYXNlICdSZXNpemVXJzoNCgkJCQkJCWR4ID0geDsNCgkJCQkJCWR3ID0gMCAtIHg7DQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICdSZXNpemVFJzoNCgkJCQkJCWR3ID0geDsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ1Jlc2l6ZU4nOg0KCQkJCQljYXNlICdSZXNpemVOVyc6DQoJCQkJCWNhc2UgJ1Jlc2l6ZU5FJzoNCgkJCQkJCWlmIChhYyA9PSAiUmVzaXplTlciKSB7DQoJCQkJCQkJZHggPSB4Ow0KCQkJCQkJCWR3ID0gMCAtIHg7DQoJCQkJCQl9IGVsc2UgaWYgKGFjID09ICJSZXNpemVORSIpDQoJCQkJCQkJZHcgPSB4Ow0KDQoJCQkJCQlkeSA9IHk7DQoJCQkJCQlkaCA9IDAgLSB5Ow0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnUmVzaXplUyc6DQoJCQkJCWNhc2UgJ1Jlc2l6ZVNXJzoNCgkJCQkJY2FzZSAnUmVzaXplU0UnOg0KCQkJCQkJaWYgKGFjID09ICJSZXNpemVTVyIpIHsNCgkJCQkJCQlkeCA9IHg7DQoJCQkJCQkJZHcgPSAwIC0geDsNCgkJCQkJCX0gZWxzZSBpZiAoYWMgPT0gIlJlc2l6ZVNFIikNCgkJCQkJCQlkdyA9IHg7DQoNCgkJCQkJCWRoID0geTsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ21jZU1vdmUnOg0KCQkJCQkJZHggPSB4Ow0KCQkJCQkJZHkgPSB5Ow0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJLy8gQm91bmRhcnkgY2hlY2sNCgkJCQlpZiAoZHcgPCAodiA9IHcuZmVhdHVyZXMubWluX3dpZHRoIC0gc3oudykpIHsNCgkJCQkJaWYgKGR4ICE9PSAwKQ0KCQkJCQkJZHggKz0gZHcgLSB2Ow0KDQoJCQkJCWR3ID0gdjsNCgkJCQl9DQoJDQoJCQkJaWYgKGRoIDwgKHYgPSB3LmZlYXR1cmVzLm1pbl9oZWlnaHQgLSBzei5oKSkgew0KCQkJCQlpZiAoZHkgIT09IDApDQoJCQkJCQlkeSArPSBkaCAtIHY7DQoNCgkJCQkJZGggPSB2Ow0KCQkJCX0NCg0KCQkJCWR3ID0gTWF0aC5taW4oZHcsIHcuZmVhdHVyZXMubWF4X3dpZHRoIC0gc3oudyk7DQoJCQkJZGggPSBNYXRoLm1pbihkaCwgdy5mZWF0dXJlcy5tYXhfaGVpZ2h0IC0gc3ouaCk7DQoJCQkJZHggPSBNYXRoLm1heChkeCwgdnAueCAtIChzeCArIHZwLngpKTsNCgkJCQlkeSA9IE1hdGgubWF4KGR5LCB2cC55IC0gKHN5ICsgdnAueSkpOw0KCQkJCWR4ID0gTWF0aC5taW4oZHgsICh2cC53ICsgdnAueCkgLSAoc3ggKyBzei53ICsgdnAueCkpOw0KCQkJCWR5ID0gTWF0aC5taW4oZHksICh2cC5oICsgdnAueSkgLSAoc3kgKyBzei5oICsgdnAueSkpOw0KDQoJCQkJLy8gTW92ZSBpZiBuZWVkZWQNCgkJCQlpZiAoZHggKyBkeSAhPT0gMCkgew0KCQkJCQlpZiAoc3ggKyBkeCA8IDApDQoJCQkJCQlkeCA9IDA7DQoJDQoJCQkJCWlmIChzeSArIGR5IDwgMCkNCgkJCQkJCWR5ID0gMDsNCg0KCQkJCQlwaC5tb3ZlVG8oc3ggKyBkeCwgc3kgKyBkeSk7DQoJCQkJfQ0KDQoJCQkJLy8gUmVzaXplIGlmIG5lZWRlZA0KCQkJCWlmIChkdyArIGRoICE9PSAwKQ0KCQkJCQlwaC5yZXNpemVUbyhzei53ICsgZHcsIHN6LmggKyBkaCk7DQoNCgkJCQlyZXR1cm4gRXZlbnQuY2FuY2VsKGUpOw0KCQkJfSk7DQoNCgkJCXJldHVybiBFdmVudC5jYW5jZWwoc2UpOw0KCQl9LA0KDQoJCXJlc2l6ZUJ5IDogZnVuY3Rpb24oZHcsIGRoLCBpZCkgew0KCQkJdmFyIHcgPSB0aGlzLndpbmRvd3NbaWRdOw0KDQoJCQlpZiAodykgew0KCQkJCXcuZWxlbWVudC5yZXNpemVCeShkdywgZGgpOw0KCQkJCXcuaWZyYW1lRWxlbWVudC5yZXNpemVCeShkdywgZGgpOw0KCQkJfQ0KCQl9LA0KDQoJCWNsb3NlIDogZnVuY3Rpb24od2luLCBpZCkgew0KCQkJdmFyIHQgPSB0aGlzLCB3LCBkID0gRE9NLmRvYywgaXggPSAwLCBmdywgaWQ7DQoNCgkJCWlkID0gdC5fZmluZElkKGlkIHx8IHdpbik7DQoNCgkJCS8vIFByb2JhYmx5IG5vdCBpbmxpbmUNCgkJCWlmICghdC53aW5kb3dzW2lkXSkgew0KCQkJCXQucGFyZW50KHdpbik7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQl0LmNvdW50LS07DQoNCgkJCWlmICh0LmNvdW50ID09IDApDQoJCQkJRE9NLnJlbW92ZSgnbWNlTW9kYWxCbG9ja2VyJyk7DQoNCgkJCWlmICh3ID0gdC53aW5kb3dzW2lkXSkgew0KCQkJCXQub25DbG9zZS5kaXNwYXRjaCh0KTsNCgkJCQlFdmVudC5yZW1vdmUoZCwgJ21vdXNlZG93bicsIHcubW91c2Vkb3duRnVuYyk7DQoJCQkJRXZlbnQucmVtb3ZlKGQsICdjbGljaycsIHcuY2xpY2tGdW5jKTsNCgkJCQlFdmVudC5jbGVhcihpZCk7DQoJCQkJRXZlbnQuY2xlYXIoaWQgKyAnX2lmcicpOw0KDQoJCQkJRE9NLnNldEF0dHJpYihpZCArICdfaWZyJywgJ3NyYycsICdqYXZhc2NyaXB0OiIiJyk7IC8vIFByZXZlbnQgbGVhaw0KCQkJCXcuZWxlbWVudC5yZW1vdmUoKTsNCgkJCQlkZWxldGUgdC53aW5kb3dzW2lkXTsNCg0KCQkJCS8vIEZpbmQgZnJvbnQgbW9zdCB3aW5kb3cgYW5kIGZvY3VzIHRoYXQNCgkJCQllYWNoICh0LndpbmRvd3MsIGZ1bmN0aW9uKHcpIHsNCgkJCQkJaWYgKHcuekluZGV4ID4gaXgpIHsNCgkJCQkJCWZ3ID0gdzsNCgkJCQkJCWl4ID0gdy56SW5kZXg7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCWlmIChmdykNCgkJCQkJdC5mb2N1cyhmdy5pZCk7DQoJCQl9DQoJCX0sDQoNCgkJc2V0VGl0bGUgOiBmdW5jdGlvbih3LCB0aSkgew0KCQkJdmFyIGU7DQoNCgkJCXcgPSB0aGlzLl9maW5kSWQodyk7DQoNCgkJCWlmIChlID0gRE9NLmdldCh3ICsgJ190aXRsZScpKQ0KCQkJCWUuaW5uZXJIVE1MID0gRE9NLmVuY29kZSh0aSk7DQoJCX0sDQoNCgkJYWxlcnQgOiBmdW5jdGlvbih0eHQsIGNiLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHc7DQoNCgkJCXcgPSB0Lm9wZW4oew0KCQkJCXRpdGxlIDogdCwNCgkJCQl0eXBlIDogJ2FsZXJ0JywNCgkJCQlidXR0b25fZnVuYyA6IGZ1bmN0aW9uKHMpIHsNCgkJCQkJaWYgKGNiKQ0KCQkJCQkJY2IuY2FsbChzIHx8IHQsIHMpOw0KDQoJCQkJCXQuY2xvc2UobnVsbCwgdy5pZCk7DQoJCQkJfSwNCgkJCQljb250ZW50IDogRE9NLmVuY29kZSh0LmVkaXRvci5nZXRMYW5nKHR4dCwgdHh0KSksDQoJCQkJaW5saW5lIDogMSwNCgkJCQl3aWR0aCA6IDQwMCwNCgkJCQloZWlnaHQgOiAxMzANCgkJCX0pOw0KCQl9LA0KDQoJCWNvbmZpcm0gOiBmdW5jdGlvbih0eHQsIGNiLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHc7DQoNCgkJCXcgPSB0Lm9wZW4oew0KCQkJCXRpdGxlIDogdCwNCgkJCQl0eXBlIDogJ2NvbmZpcm0nLA0KCQkJCWJ1dHRvbl9mdW5jIDogZnVuY3Rpb24ocykgew0KCQkJCQlpZiAoY2IpDQoJCQkJCQljYi5jYWxsKHMgfHwgdCwgcyk7DQoNCgkJCQkJdC5jbG9zZShudWxsLCB3LmlkKTsNCgkJCQl9LA0KCQkJCWNvbnRlbnQgOiBET00uZW5jb2RlKHQuZWRpdG9yLmdldExhbmcodHh0LCB0eHQpKSwNCgkJCQlpbmxpbmUgOiAxLA0KCQkJCXdpZHRoIDogNDAwLA0KCQkJCWhlaWdodCA6IDEzMA0KCQkJfSk7DQoJCX0sDQoNCgkJLy8gSW50ZXJuYWwgZnVuY3Rpb25zDQoNCgkJX2ZpbmRJZCA6IGZ1bmN0aW9uKHcpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKHR5cGVvZih3KSA9PSAnc3RyaW5nJykNCgkJCQlyZXR1cm4gdzsNCg0KCQkJZWFjaCh0LndpbmRvd3MsIGZ1bmN0aW9uKHdvKSB7DQoJCQkJdmFyIGlmciA9IERPTS5nZXQod28uaWQgKyAnX2lmcicpOw0KDQoJCQkJaWYgKGlmciAmJiB3ID09IGlmci5jb250ZW50V2luZG93KSB7DQoJCQkJCXcgPSB3by5pZDsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQlyZXR1cm4gdzsNCgkJfSwNCg0KCQlfZml4SUVMYXlvdXQgOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdmFyIHcsIGltZzsNCg0KCQkJaWYgKCF0aW55bWNlLmlzSUU2KQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gRml4ZXMgdGhlIGJ1ZyB3aGVyZSBob3ZlciBmbGlja2VycyBhbmQgZG9lcyBvZGQgdGhpbmdzIGluIElFNg0KCQkJZWFjaChbJ24nLCdzJywndycsJ2UnLCdudycsJ25lJywnc3cnLCdzZSddLCBmdW5jdGlvbih2KSB7DQoJCQkJdmFyIGUgPSBET00uZ2V0KGlkICsgJ19yZXNpemVfJyArIHYpOw0KDQoJCQkJRE9NLnNldFN0eWxlcyhlLCB7DQoJCQkJCXdpZHRoIDogcyA/IGUuY2xpZW50V2lkdGggOiAnJywNCgkJCQkJaGVpZ2h0IDogcyA/IGUuY2xpZW50SGVpZ2h0IDogJycsDQoJCQkJCWN1cnNvciA6IERPTS5nZXRTdHlsZShlLCAnY3Vyc29yJywgMSkNCgkJCQl9KTsNCg0KCQkJCURPTS5zZXRTdHlsZShpZCArICJfYm90dG9tIiwgJ2JvdHRvbScsICctMXB4Jyk7DQoNCgkJCQllID0gMDsNCgkJCX0pOw0KDQoJCQkvLyBGaXhlcyBncmFwaGljcyBnbGl0Y2gNCgkJCWlmICh3ID0gdGhpcy53aW5kb3dzW2lkXSkgew0KCQkJCS8vIEZpeGVzIHJlbmRlcmluZyBidWcgYWZ0ZXIgcmVzaXplDQoJCQkJdy5lbGVtZW50LmhpZGUoKTsNCgkJCQl3LmVsZW1lbnQuc2hvdygpOw0KDQoJCQkJLy8gRm9yY2VkIGEgcmVwYWludCBvZiB0aGUgd2luZG93DQoJCQkJLy9ET00uZ2V0KGlkKS5zdHlsZS5maWx0ZXIgPSAnJzsNCg0KCQkJCS8vIElFIGhhcyBhIGJ1ZyB3aGVyZSBpbWFnZXMgdXNlZCBpbiBDU1Mgd29uJ3QgZ2V0IGxvYWRlZA0KCQkJCS8vIHNvbWV0aW1lcyB3aGVuIHRoZSBjYWNoZSBpbiB0aGUgYnJvd3NlciBpcyBkaXNhYmxlZA0KCQkJCS8vIFRoaXMgZml4IHRyaWVzIHRvIHNvbHZlIGl0IGJ5IGxvYWRpbmcgdGhlIGltYWdlcyB1c2luZyB0aGUgaW1hZ2Ugb2JqZWN0DQoJCQkJZWFjaChET00uc2VsZWN0KCdkaXYsYScsIGlkKSwgZnVuY3Rpb24oZSwgaSkgew0KCQkJCQlpZiAoZS5jdXJyZW50U3R5bGUuYmFja2dyb3VuZEltYWdlICE9ICdub25lJykgew0KCQkJCQkJaW1nID0gbmV3IEltYWdlKCk7DQoJCQkJCQlpbWcuc3JjID0gZS5jdXJyZW50U3R5bGUuYmFja2dyb3VuZEltYWdlLnJlcGxhY2UoL3VybFwoXCIoLispXCJcKS8sICckMScpOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQlET00uZ2V0KGlkKS5zdHlsZS5maWx0ZXIgPSAnJzsNCgkJCX0NCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnaW5saW5lcG9wdXBzJywgdGlueW1jZS5wbHVnaW5zLklubGluZVBvcHVwcyk7DQp9KSgpOw0KDQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/skins/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhIAAgAOYAAL13dtRubqMLC91cXKkbGtyjo8Q8PNLRz88REdI2NsRDQ9lKSjg4ONVDQ9VkZLstLbWUk9NRUbQzM9zCwtt5ecZXV9ppadt2drtratXU0s7PzdEaGgMDA8wCArs8PM0EBOBsbN9iYqwkJOF1ddlFRdeOjs8ODtq0tLNNTOFwcKwrK9MkJN9lZc1LS84ICNlSUsOMi6cWFqgUFM2zsbu8us8WFtc9PdhBQbpkZNbW1NrOzdPLydI6OtIpKaUSEq86Oq+npc8aGtJKSt9qattXV9tQULEoKKISEtg7O8XGxKedm8mjoRsbG9C/vSUlJcfIxqqgn9UwMMxjY71JSaqfntXS0M+6ucyxr9DAvtaYmMB/fsifnrheXdeiop8CAtxVVc8sLNqMjNdzc9V5edPJx9LT0eB8fNPU0tmtrbRRUMBOTsnKyMvMyszNy8SRkMaYlrtCQufBwdJfX9E/P7wcHNptbacgIOO6ut+AgNtiYtHFw8GFhJ8AAMwAAP///9bX1SH5BAAAAAAALAAAAAAgACAAAAf/gH+Cg4SFhoeIiYqLjI2OhQACAhiPjG8ydRYyMJWKdgE3JHIxVZ2HexIpHR8pRgCmhQcxFCs1NT0WAjuwgwBwIX0lWR0hEji8f2Q+eBtgfn4JG7lNvFxqX31dz2gdRR4osE0yeCZzz89CCLlXpigVCx0n534THzcKP51XBGYuEfPP5LjI42NLpR9SkLiY8IwDh3MmoigQkcPREhEjPjg45/DchQ9ECHBqpCJAFATzOp4LsqIFKUZuJAzpMCblw3Nhuol4tehTLYAqz/XY0EKXIi0eBgQDyIQJwAJ9bBg5hmjHrFsA/ThxkpWHCSECsCDCMKVItqxo/dzpEOVBmkN6j2aVQ8uAAdoXLhoImGGIy7t4dO1m1eFixYN8hKzM8pe2sR8LH3gIWELIHZKzjtHG6bPhgQpCAijU6EO6tOnTqPu4SODlgKA2dgykGEE7BYghLHIP2E3khe8FwBvcsJGAzhENryEc4cO8ufPn0JsfgVBm0BoaQKAo2c69u/fvQGggj/Ukifnz6NOnZ+MamaNAADs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhUAAeALMAAMrLyGNjY9bX1eLj4d/f3uXm5QAAANbY1v///wAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAABQAB4AAATFUARDq7046807D5KBjGRpnmiqruxqTG0sz3RK1Xiul/fu/6wecEhECItI3THJnC2bUJeoQK1ar9isdsvtdm/esHhMzoLL6LSael6739s2fD6/He74vH7P7/v/gH8AdoGFhoeIeoMiiY2Oj3eLCJCUlYKElpmZkpqdlZyeoY2SBKWmp6ipqqusra6tpK+ys7S1qLG2ubq7uLu+v7A3wMPEp70DyMnKy8zNzs/Q0czH0tXW19gDgxPZ3d7fyC8hHuTl5ucXIBEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhdAAwAMQaAJ6hnO/v7m57hVFbYzc4N////6u6xmt8jLXDz2BygIuVnn6RoM/Y31dkcKKxv5ipt1ppdY+gr15ufFxreQAAAPj39/b29MTGw3l7eM/Nyf///wAAAAAAAAAAAAAAAAAAACH5BAEAABoALAAAAAB0ADAAAAX/oEaMZGmepyaibDuqbpyuci1iQa7vfL9jIxyvQiwajTwgQehrNpVMp1SntEyvOcvIOjx6iTwtgYuVisnl5jlt3va+37CbrZ7Te+s73q6De+VjTRSDhINOeT2GOoo+iHo6jjlEhYN/O5GLlIx7gT6EOZ91nY+QfJIVmpalozyam4BorZRtrKSYk0YUqlmmi4mHvTuFU2IXAMfIx64Uyc0XI8bNyhkZlNLIzwTR0szN3dfZ29eF18nh5cvlAOfj1BTV1ers3PTl89zW8tDorvra/IXi2ds3rh44gvi6EfInTp3DY/fauWMIMN/Bf+O+ARhE8aHHdQgranQW8uNAjCY7/6Y82XCluZIuscGMCXIJTWlQbjbLqRMZz54AgNCoEQMGURlGj7pIqpSFigFQo0qdSpXq06pYs0K9qrWrVK5evWqAyqCs2bNo056VqratWwZs38o1G3eu3KgI8urdy7dvX6h+AwvWC3iwYb6FDyuGaqCx48eQI0dmLLmy5caUL2t+nHnzZqgOQoseTbp0adCmU6sOjdp0gdewX69uXVq2aNupoT7Yzbu379+/dQN/EPv18N7CgReHffxB8t/MiRs/DjWC9evYs2vXXn17hOXesXffvvx1+AjjyRc/j37Agvfw48ufPx8q/fcF4ue/D9/+/f368beAf/zFJuB7UDWg4P+CDDbooIMJPthAAQoWJ6GCET5IYYMbSpihhLFduCBUEJRooonlFXDiihCQyGKJKkKg4owvmujiizGemOOLN+JYXI02DjDBkEQSmWKRSE4AVZJGFjdBAUwSuWSUUCJZZZRTMgnbkFtGqeQAEoQpppgpjmmmBFCdeWYBZKopZppulukmmmDGySaZd7oJVQJ89unnn4ACumegfhZHKJ+DHqqooAMs6qifUB0g6aSUVmqppZFeqummkmbK6aeUegoqqFEpYOqpqKaqKqpSrerqqwq0Cuusp8pK66xbhaUrWLpmxWuvVf0K7FQqCGDsscgmq6yyxS7r7LPGNgvttMhKSy3/tRoYa9dcyG4rV7feugVuuGodq9i5xp6rWLrqGsZuu4IZ69m88s67Wb32XoZvvpUZu9q/pfkL8MAOCOxaeasZXFsBo+FmmrHNRfwbxMMtJzHFypXXHMbQTRfdcMayJzJ2IXsHHnslq3eydymrDBvKAhwoc3zGFhjggTX/Nx+A9OVcIGwyGyvi0A4KDWKFIV5otIYOdvjg0iDCRrSxQKYIJARU1xgjjTuymDWOLHa94tc+xnY11gJ4eaSXxqrt5JVMtk1lknAnKbeWr3GZN9sCzCmnm8bO2WaYeaoZuJ3LCX64mq+N2ficxj4qeeSLGnoo5ZIvinnmlwsw6ufGfj5qKOiif0p66ZseeyutyK4+a+uuvwp77KtGe+3t1t7+bO66L8t778lqEAIAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhIAAgAOYAAM/JwPePKppUDM94FaNnKL2miqFaE/q0W/qlM/7z6PvKnP/+/51bF9HMxat1PZycm9XV0btuG/qkS6SlpPaACL2+vJpjK9iILMfAufqoTbhlDtGFK+yeOfidQ/qtUtqDHZNMA6CalPalNfe0XJuZleyjRPZ+BvV6AfrBjMnKyLy9uveTM/V+CcXGxPmZJfq4evqybtLT0fqcKbW2tPmrRfmWIvaHG/iaPPaDE62urM7PzfiQG7xqEaqrqsHCwPmwVLGysPaJH7m5uP/79+uXLPqgLfeIEfmhRc6CLaV3SdyVQLGDVPeWOMPEwru8urSMYcvMyqFfHdLOyK59Sc/QztXW1P738b/AvtDRz/iXOrO0srCxr7e4tuuqVMTFw8zCtausqtCGMvmrYcnDu5V7X5Z9Yd2KI/eZP/zXs/u4XvmpXamfkq+wr92PMdPU0sfIxphQB/vFkfimVfV7BPibN6ipp/urOZVQCPq7f//9/Li5t6ytq/Z8BPV5APeVN9bX1SH5BAAAAAAALAAAAAAgACAAAAf/gH+Cg4R/DQUOUQIgAlEOBQ2FkpN/Xw4CEUpdI2kjXUoRAg5flJRLAmFpGR1+ra4ZB2ECSxClgw0EESMSTK6+rkcjEQSRpQ0MSAdZv8yvSAzFkwTJvc3WGRsEtZJPutXW1xFPkgAGys0KVuoK1j8GAIVTF7zoC/bszR0XU4RSAmnffqGwtwAFOA8CpAwqEMEDuBcE8YCTwKPAIAdtjoCDQRAGuBttHAyKUuIGODUExXwsEWXQv4C/JBDsEMRGkADMaAhwCfAjQRx9gga1seIVHJc/YLoKwmKIPaFQ5wRppXMkB5O+AgANmmBBgqhRbXBoKcjBBzqttPKJ2kFOB7BR8M2IFFRAgwu4ULfi7bOj4i0BCE7sVbAAzd4+RRISmjJgx16nC1jgNfKBH6FygfHisRJnb5F33HhkPgxXBo9x0gYUmUM6qosB2igdU02hddAiA6DZGkNAg4gaa/fuEKGBAAYsVSZhSeGlQhI4ql0YMSF4aA0EAwQkcdIkhY5t/VpcEaJljQU4Gj4QEWFHBJEPGuBYWAOES4XuVCRBEU8+x4QQZZx3ByMCWEBGCBP0sMUM93mnH3MV6AGEf/89QMKFFiYIxoLcvfGdcvv5EOEME+7Rw4kbsqGFfVd44aAtEFDBXBMiRujEjff50AIUyEkSCAA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhJwAXAOZJAO/r5wAAAD06ONjPx////wkJCX2Roe3p4url3YKVpX6Son+To+7q4/Tx7fPw6/f18vXz756vvezn4Ovm3ouerZeot+vn3/Hu6YeaqZOks4+hsMvV3HWJmerm3vn49uzo4ezo4ICUpIGUpM3DuaKywPv6+P39/Ka2w/z7+rWmnLO/yP7+/bO+yPTy7rG9xvLv67OnlfTx7PXy7rK+x/38+7K9x8XP1/n49fj287zG0Pr597rEzrfCzLS/yfv7+vPx7B8lK77I0q24wsjR2bTAycHL1PLw68rT2/j39P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEkALAAAAAAnABcAAAf/gEmCggWDhIWGAYZJKQAAAwIBBI4pjQAjAoMFBSaaBRsmm4MbAYqCk4+RqKiXmUkFKyudrxu1JrGItaSCjqmSvb2YryYoxa9HJ8nFKKFJySdHir2Qv8CtrzQl2q9DJN7aJTSF3iRD0o7UrCPrAAIFPh7xHgU2EfYR8h4+BfcRNgHTVPUSQJBgAR0PEj4oUKSCwwoKH+go8LBCEYDoBDqqlqLADQggIQQIkqFkhpAQbhQwmSEIRl+sqgEAgqSBzQYBcmjYqeFmAyRAeGrI8TJdL5kBcDhY6iDADgpQKTB1gCNAVAo7imoEgPTBha8XAvDAQBYD2AsPApTFwEMrUgID7OIGeIGgLoIALgzoNWAXwYsAew24cBuzlGG6dvEG7vs38OCAMhcFMNKhcocANRRoVmC5gxHAm2sQ7iXZwYTTEwLM2KwA9YSmBjbPGO1I8g8LuC0EYLGg94LcFn4A9s2CNgDJMSQol7Db94LlEmIM710cMivkILKDCKAihPcQ2kFIN/BdhXHJDT6o/8BdhHsR6z/gNPDevHXSiVoc2H8gQI8EACbA3wEtBBBgAj2cl9+AARBx4IAFHkiEgoMEIAMDGDIQgBAcdMhBhgzIEICHHAgRQFxxqYKiZBcyAAMMhhn2IoYixlhKQQTZuEggADs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhLQBQANUAAAAAAP///yQlJ4KVpYGUpI+hsJOks5eot56vvaKywKa2w6q5xnWJmX2RoYCUpH+To36SooeaqYuercvV3P39/Ozo4Ovn3+rm3vXz7/v6+Pn49u7q4+3p4uzo4evm3url3fPw6/Hu6bOnlff18uzn4PTx7c3DudHIv+/r5/z7+tjPx7WmnD06OAEBAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAC4ALAAAAAAtAFAAAAb/wJZwSCwaj8gkZclsOp/QqHRKrVZT2Kx2y+16v5mweEwum89ojXrNbrvf8PhoTq/b7/i8HsPv+/+AgYKDJYWGh4iJiouMII6PkJGSk5SVIZeYmZqbnJ2eH6ChoqOkpaanqKmqqhetrq+wsbKztB62t7i5uru8vRa/wMHCw8TFxiTIycrLzM3OzxXR0tPU1dbX2B3a29zd3t/g4Rzj5OXm5+jp6uvs7e0b8PHy8/T19vci+fr7/P3+/wAFCBxIsKDBgwgTTljIsKHDhxAjSlxAsaLFixgzatyooKPHjyBDihxJMoHJkyhTqlzJsiWClzBjypxJs6bNAzhz6tzJs6fP/58GggodSrSo0aNICyhdyrSp06dQo0qYSrWq1atYs2qNwLWr169gw4od26Cs2bNo06pdy7at27dvIcidS7eu3bt48+rdy5fvg7+AAwseTLiw4cOIEyd2wLix48eQI0ueTKCy5cuYM2vezHmA58+gQ4seTbq06dOoUTNYzbq169ewY8sGQLu27du4c+vevaK379/AgwsfThyF8ePIkytfzry58+fQo0ufPt2E9evYs2vfzr07i+/gw4sfT768+RPo06tfz769+/df4sufn4W6/fv48+vfz7+///8ABijggAQWaOCBCCao4IIMNujggxAKqMKEFFZo4YUYZqiheRx26B4heC6EKOKIJJZo4okopqjiiiy26OKLMMYo44wuBgEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCgAOAKIAAO/r5wAAALWmnNzUzP///wAAAAAAAAAAACH5BAAAAAAALAAAAAAKAA4AAAMhKAATQUso5iCQq704tcXUdnUVl5XjKYKeGX7kGsMq/UYJADs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQ2xlYXJsb29rcyAyICovCgovKiBSZXNldCAqLwouY2xlYXJsb29rczIsIC5jbGVhcmxvb2tzMiBkaXYsIC5jbGVhcmxvb2tzMiBzcGFuLCAuY2xlYXJsb29rczIgYSB7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7IHRleHQtYWxpZ246bGVmdDsgcG9zaXRpb246YWJzb2x1dGU7IGJvcmRlcjowOyBwYWRkaW5nOjA7IG1hcmdpbjowOyBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50OyBmb250LWZhbWlseTpBcmlhbCxWZXJkYW5hOyBmb250LXNpemU6MTFweDsgY29sb3I6IzAwMDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgd2lkdGg6YXV0bzsgaGVpZ2h0OmF1dG87IG92ZXJmbG93OmhpZGRlbjsgZGlzcGxheTpibG9ja30KCi8qIEdlbmVyYWwgKi8KLmNsZWFybG9va3MyIHtwb3NpdGlvbjphYnNvbHV0ZTsgZGlyZWN0aW9uOmx0cn0KLmNsZWFybG9va3MyIC5tY2VXcmFwcGVyIHtwb3NpdGlvbjpzdGF0aWN9Ci5tY2VFdmVudEJsb2NrZXIge3Bvc2l0aW9uOmZpeGVkOyBsZWZ0OjA7IHRvcDowOyBiYWNrZ3JvdW5kOnVybChpbWcvaG9yaXpvbnRhbC5naWYpIG5vLXJlcGVhdCAwIC03NXB4OyB3aWR0aDoxMDAlOyBoZWlnaHQ6MTAwJX0KLmNsZWFybG9va3MyIC5tY2VQbGFjZUhvbGRlciB7Ym9yZGVyOjFweCBzb2xpZCAjMDAwOyBiYWNrZ3JvdW5kOiM4ODg7IHRvcDowOyBsZWZ0OjA7IG9wYWNpdHk6MC41OyAtbXMtZmlsdGVyOidhbHBoYShvcGFjaXR5PTUwKSc7IGZpbHRlcjphbHBoYShvcGFjaXR5PTUwKX0KLmNsZWFybG9va3MyX21vZGFsQmxvY2tlciB7cG9zaXRpb246Zml4ZWQ7IGxlZnQ6MDsgdG9wOjA7IHdpZHRoOjEwMCU7IGhlaWdodDoxMDAlOyBiYWNrZ3JvdW5kOiNGRkY7IG9wYWNpdHk6MC42OyAtbXMtZmlsdGVyOidhbHBoYShvcGFjaXR5PTYwKSc7IGZpbHRlcjphbHBoYShvcGFjaXR5PTYwKTsgZGlzcGxheTpub25lfQoKLyogVG9wICovCi5jbGVhcmxvb2tzMiAubWNlVG9wLCAuY2xlYXJsb29rczIgLm1jZVRvcCBkaXYge3RvcDowOyB3aWR0aDoxMDAlOyBoZWlnaHQ6MjNweH0KLmNsZWFybG9va3MyIC5tY2VUb3AgLm1jZUxlZnQge3dpZHRoOjZweDsgYmFja2dyb3VuZDp1cmwoaW1nL2Nvcm5lcnMuZ2lmKX0KLmNsZWFybG9va3MyIC5tY2VUb3AgLm1jZUNlbnRlciB7cmlnaHQ6NnB4OyB3aWR0aDoxMDAlOyBoZWlnaHQ6MjNweDsgYmFja2dyb3VuZDp1cmwoaW1nL2hvcml6b250YWwuZ2lmKSAxMnB4IDA7IGNsaXA6cmVjdChhdXRvIGF1dG8gYXV0byAxMnB4KX0KLmNsZWFybG9va3MyIC5tY2VUb3AgLm1jZVJpZ2h0IHtyaWdodDowOyB3aWR0aDo2cHg7IGhlaWdodDoyM3B4OyBiYWNrZ3JvdW5kOnVybChpbWcvY29ybmVycy5naWYpIC0xMnB4IDB9Ci5jbGVhcmxvb2tzMiAubWNlVG9wIHNwYW4ge3dpZHRoOjEwMCU7IHRleHQtYWxpZ246Y2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IGxpbmUtaGVpZ2h0OjIzcHg7IGZvbnQtd2VpZ2h0OmJvbGR9Ci5jbGVhcmxvb2tzMiAubWNlRm9jdXMgLm1jZVRvcCAubWNlTGVmdCB7YmFja2dyb3VuZDp1cmwoaW1nL2Nvcm5lcnMuZ2lmKSAtNnB4IDB9Ci5jbGVhcmxvb2tzMiAubWNlRm9jdXMgLm1jZVRvcCAubWNlQ2VudGVyIHtiYWNrZ3JvdW5kOnVybChpbWcvaG9yaXpvbnRhbC5naWYpIDAgLTIzcHh9Ci5jbGVhcmxvb2tzMiAubWNlRm9jdXMgLm1jZVRvcCAubWNlUmlnaHQge2JhY2tncm91bmQ6dXJsKGltZy9jb3JuZXJzLmdpZikgLTE4cHggMH0KLmNsZWFybG9va3MyIC5tY2VGb2N1cyAubWNlVG9wIHNwYW4ge2NvbG9yOiNGRkZ9CgovKiBNaWRkbGUgKi8KLmNsZWFybG9va3MyIC5tY2VNaWRkbGUsIC5jbGVhcmxvb2tzMiAubWNlTWlkZGxlIGRpdiB7dG9wOjB9Ci5jbGVhcmxvb2tzMiAubWNlTWlkZGxlIHt3aWR0aDoxMDAlOyBoZWlnaHQ6MTAwJTsgY2xpcDpyZWN0KDIzcHggYXV0byBhdXRvIGF1dG8pfQouY2xlYXJsb29rczIgLm1jZU1pZGRsZSAubWNlTGVmdCB7bGVmdDowOyB3aWR0aDo1cHg7IGhlaWdodDoxMDAlOyBiYWNrZ3JvdW5kOnVybChpbWcvdmVydGljYWwuZ2lmKSAtNXB4IDB9Ci5jbGVhcmxvb2tzMiAubWNlTWlkZGxlIHNwYW4ge3RvcDoyM3B4OyBsZWZ0OjVweDsgd2lkdGg6MTAwJTsgaGVpZ2h0OjEwMCU7IGJhY2tncm91bmQ6I0ZGRn0KLmNsZWFybG9va3MyIC5tY2VNaWRkbGUgLm1jZVJpZ2h0IHtyaWdodDowOyB3aWR0aDo1cHg7IGhlaWdodDoxMDAlOyBiYWNrZ3JvdW5kOnVybChpbWcvdmVydGljYWwuZ2lmKX0KCi8qIEJvdHRvbSAqLwouY2xlYXJsb29rczIgLm1jZUJvdHRvbSwgLmNsZWFybG9va3MyIC5tY2VCb3R0b20gZGl2IHtoZWlnaHQ6NnB4fQouY2xlYXJsb29rczIgLm1jZUJvdHRvbSB7bGVmdDowOyBib3R0b206MDsgd2lkdGg6MTAwJX0KLmNsZWFybG9va3MyIC5tY2VCb3R0b20gZGl2IHt0b3A6MH0KLmNsZWFybG9va3MyIC5tY2VCb3R0b20gLm1jZUxlZnQge2xlZnQ6MDsgd2lkdGg6NXB4OyBiYWNrZ3JvdW5kOnVybChpbWcvY29ybmVycy5naWYpIC0zNHB4IC02cHh9Ci5jbGVhcmxvb2tzMiAubWNlQm90dG9tIC5tY2VDZW50ZXIge2xlZnQ6NXB4OyB3aWR0aDoxMDAlOyBiYWNrZ3JvdW5kOnVybChpbWcvaG9yaXpvbnRhbC5naWYpIDAgLTQ2cHh9Ci5jbGVhcmxvb2tzMiAubWNlQm90dG9tIC5tY2VSaWdodCB7cmlnaHQ6MDsgd2lkdGg6NXB4OyBiYWNrZ3JvdW5kOiB1cmwoaW1nL2Nvcm5lcnMuZ2lmKSAtMzRweCAwfQouY2xlYXJsb29rczIgLm1jZUJvdHRvbSBzcGFuIHtkaXNwbGF5Om5vbmV9Ci5jbGVhcmxvb2tzMiAubWNlU3RhdHVzYmFyIC5tY2VCb3R0b20sIC5jbGVhcmxvb2tzMiAubWNlU3RhdHVzYmFyIC5tY2VCb3R0b20gZGl2IHtoZWlnaHQ6MjNweH0KLmNsZWFybG9va3MyIC5tY2VTdGF0dXNiYXIgLm1jZUJvdHRvbSAubWNlTGVmdCB7YmFja2dyb3VuZDp1cmwoaW1nL2Nvcm5lcnMuZ2lmKSAtMjlweCAwfQouY2xlYXJsb29rczIgLm1jZVN0YXR1c2JhciAubWNlQm90dG9tIC5tY2VDZW50ZXIge2JhY2tncm91bmQ6dXJsKGltZy9ob3Jpem9udGFsLmdpZikgMCAtNTJweH0KLmNsZWFybG9va3MyIC5tY2VTdGF0dXNiYXIgLm1jZUJvdHRvbSAubWNlUmlnaHQge2JhY2tncm91bmQ6dXJsKGltZy9jb3JuZXJzLmdpZikgLTI0cHggMH0KLmNsZWFybG9va3MyIC5tY2VTdGF0dXNiYXIgLm1jZUJvdHRvbSBzcGFuIHtkaXNwbGF5OmJsb2NrOyBsZWZ0OjdweDsgZm9udC1mYW1pbHk6QXJpYWwsIFZlcmRhbmE7IGZvbnQtc2l6ZToxMXB4OyBsaW5lLWhlaWdodDoyM3B4fQoKLyogQWN0aW9ucyAqLwouY2xlYXJsb29rczIgYSB7d2lkdGg6MjlweDsgaGVpZ2h0OjE2cHg7IHRvcDozcHg7fQouY2xlYXJsb29rczIgLm1jZUNsb3NlIHtyaWdodDo2cHg7IGJhY2tncm91bmQ6dXJsKGltZy9idXR0b25zLmdpZikgLTg3cHggMH0KLmNsZWFybG9va3MyIC5tY2VNaW4ge2Rpc3BsYXk6bm9uZTsgcmlnaHQ6NjhweDsgYmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbnMuZ2lmKSAwIDB9Ci5jbGVhcmxvb2tzMiAubWNlTWVkIHtkaXNwbGF5Om5vbmU7IHJpZ2h0OjM3cHg7IGJhY2tncm91bmQ6dXJsKGltZy9idXR0b25zLmdpZikgLTI5cHggMH0KLmNsZWFybG9va3MyIC5tY2VNYXgge2Rpc3BsYXk6bm9uZTsgcmlnaHQ6MzdweDsgYmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbnMuZ2lmKSAtNThweCAwfQouY2xlYXJsb29rczIgLm1jZU1vdmUge2Rpc3BsYXk6bm9uZTt3aWR0aDoxMDAlO2N1cnNvcjptb3ZlO2JhY2tncm91bmQ6dXJsKGltZy9jb3JuZXJzLmdpZikgbm8tcmVwZWF0IC0xMDBweCAtMTAwcHh9Ci5jbGVhcmxvb2tzMiAubWNlTW92YWJsZSAubWNlTW92ZSB7ZGlzcGxheTpibG9ja30KLmNsZWFybG9va3MyIC5tY2VGb2N1cyAubWNlQ2xvc2Uge3JpZ2h0OjZweDsgYmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbnMuZ2lmKSAtODdweCAtMTZweH0KLmNsZWFybG9va3MyIC5tY2VGb2N1cyAubWNlTWluIHtyaWdodDo2OHB4OyBiYWNrZ3JvdW5kOnVybChpbWcvYnV0dG9ucy5naWYpIDAgLTE2cHh9Ci5jbGVhcmxvb2tzMiAubWNlRm9jdXMgLm1jZU1lZCB7cmlnaHQ6MzdweDsgYmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbnMuZ2lmKSAtMjlweCAtMTZweH0KLmNsZWFybG9va3MyIC5tY2VGb2N1cyAubWNlTWF4IHtyaWdodDozN3B4OyBiYWNrZ3JvdW5kOnVybChpbWcvYnV0dG9ucy5naWYpIC01OHB4IC0xNnB4fQouY2xlYXJsb29rczIgLm1jZUZvY3VzIC5tY2VDbG9zZTpob3ZlciB7cmlnaHQ6NnB4OyBiYWNrZ3JvdW5kOnVybChpbWcvYnV0dG9ucy5naWYpIC04N3B4IC0zMnB4fQouY2xlYXJsb29rczIgLm1jZUZvY3VzIC5tY2VDbG9zZTpob3ZlciB7cmlnaHQ6NnB4OyBiYWNrZ3JvdW5kOnVybChpbWcvYnV0dG9ucy5naWYpIC04N3B4IC0zMnB4fQouY2xlYXJsb29rczIgLm1jZUZvY3VzIC5tY2VNaW46aG92ZXIge3JpZ2h0OjY4cHg7IGJhY2tncm91bmQ6dXJsKGltZy9idXR0b25zLmdpZikgMCAtMzJweH0KLmNsZWFybG9va3MyIC5tY2VGb2N1cyAubWNlTWVkOmhvdmVyIHtyaWdodDozN3B4OyBiYWNrZ3JvdW5kOnVybChpbWcvYnV0dG9ucy5naWYpIC0yOXB4IC0zMnB4fQouY2xlYXJsb29rczIgLm1jZUZvY3VzIC5tY2VNYXg6aG92ZXIge3JpZ2h0OjM3cHg7IGJhY2tncm91bmQ6dXJsKGltZy9idXR0b25zLmdpZikgLTU4cHggLTMycHh9CgovKiBSZXNpemUgKi8KLmNsZWFybG9va3MyIC5tY2VSZXNpemUge3RvcDphdXRvOyBsZWZ0OmF1dG87IGRpc3BsYXk6bm9uZTsgd2lkdGg6NXB4OyBoZWlnaHQ6NXB4OyBiYWNrZ3JvdW5kOnVybChpbWcvaG9yaXpvbnRhbC5naWYpIG5vLXJlcGVhdCAwIC03NXB4fQouY2xlYXJsb29rczIgLm1jZVJlc2l6YWJsZSAubWNlUmVzaXplIHtkaXNwbGF5OmJsb2NrfQouY2xlYXJsb29rczIgLm1jZVJlc2l6YWJsZSAubWNlTWluLCAuY2xlYXJsb29rczIgLm1jZU1heCB7ZGlzcGxheTpub25lfQouY2xlYXJsb29rczIgLm1jZU1pbmltaXphYmxlIC5tY2VNaW4ge2Rpc3BsYXk6YmxvY2t9Ci5jbGVhcmxvb2tzMiAubWNlTWF4aW1pemFibGUgLm1jZU1heCB7ZGlzcGxheTpibG9ja30KLmNsZWFybG9va3MyIC5tY2VNYXhpbWl6ZWQgLm1jZU1lZCB7ZGlzcGxheTpibG9ja30KLmNsZWFybG9va3MyIC5tY2VNYXhpbWl6ZWQgLm1jZU1heCB7ZGlzcGxheTpub25lfQouY2xlYXJsb29rczIgYS5tY2VSZXNpemVOIHt0b3A6MDsgbGVmdDowOyB3aWR0aDoxMDAlOyBjdXJzb3I6bi1yZXNpemV9Ci5jbGVhcmxvb2tzMiBhLm1jZVJlc2l6ZU5XIHt0b3A6MDsgbGVmdDowOyBjdXJzb3I6bnctcmVzaXplfQouY2xlYXJsb29rczIgYS5tY2VSZXNpemVORSB7dG9wOjA7IHJpZ2h0OjA7IGN1cnNvcjpuZS1yZXNpemV9Ci5jbGVhcmxvb2tzMiBhLm1jZVJlc2l6ZVcge3RvcDowOyBsZWZ0OjA7IGhlaWdodDoxMDAlOyBjdXJzb3I6dy1yZXNpemU7fQouY2xlYXJsb29rczIgYS5tY2VSZXNpemVFIHt0b3A6MDsgcmlnaHQ6MDsgaGVpZ2h0OjEwMCU7IGN1cnNvcjplLXJlc2l6ZX0KLmNsZWFybG9va3MyIGEubWNlUmVzaXplUyB7Ym90dG9tOjA7IGxlZnQ6MDsgd2lkdGg6MTAwJTsgY3Vyc29yOnMtcmVzaXplfQouY2xlYXJsb29rczIgYS5tY2VSZXNpemVTVyB7Ym90dG9tOjA7IGxlZnQ6MDsgY3Vyc29yOnN3LXJlc2l6ZX0KLmNsZWFybG9va3MyIGEubWNlUmVzaXplU0Uge2JvdHRvbTowOyByaWdodDowOyBjdXJzb3I6c2UtcmVzaXplfQoKLyogQWxlcnQvQ29uZmlybSAqLwouY2xlYXJsb29rczIgLm1jZUJ1dHRvbiB7Zm9udC13ZWlnaHQ6Ym9sZDsgYm90dG9tOjEwcHg7IHdpZHRoOjgwcHg7IGhlaWdodDozMHB4OyBiYWNrZ3JvdW5kOnVybChpbWcvYnV0dG9uLmdpZik7IGxpbmUtaGVpZ2h0OjMwcHg7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTsgdGV4dC1hbGlnbjpjZW50ZXI7IG91dGxpbmU6MH0KLmNsZWFybG9va3MyIC5tY2VNaWRkbGUgLm1jZUljb24ge2xlZnQ6MTVweDsgdG9wOjM1cHg7IHdpZHRoOjMycHg7IGhlaWdodDozMnB4fQouY2xlYXJsb29rczIgLm1jZUFsZXJ0IC5tY2VNaWRkbGUgc3BhbiwgLmNsZWFybG9va3MyIC5tY2VDb25maXJtIC5tY2VNaWRkbGUgc3BhbiB7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtsZWZ0OjYwcHg7IHRvcDozNXB4OyB3aWR0aDozMjBweDsgaGVpZ2h0OjUwcHg7IGZvbnQtd2VpZ2h0OmJvbGQ7IG92ZXJmbG93OmF1dG87IHdoaXRlLXNwYWNlOm5vcm1hbH0KLmNsZWFybG9va3MyIGE6aG92ZXIge2ZvbnQtd2VpZ2h0OmJvbGQ7fQouY2xlYXJsb29rczIgLm1jZUFsZXJ0IC5tY2VNaWRkbGUsIC5jbGVhcmxvb2tzMiAubWNlQ29uZmlybSAubWNlTWlkZGxlIHtiYWNrZ3JvdW5kOiNENkQ3RDV9Ci5jbGVhcmxvb2tzMiAubWNlQWxlcnQgLm1jZU9rIHtsZWZ0OjUwJTsgdG9wOmF1dG87IG1hcmdpbi1sZWZ0OiAtNDBweH0KLmNsZWFybG9va3MyIC5tY2VBbGVydCAubWNlSWNvbiB7YmFja2dyb3VuZDp1cmwoaW1nL2FsZXJ0LmdpZil9Ci5jbGVhcmxvb2tzMiAubWNlQ29uZmlybSAubWNlT2sge2xlZnQ6NTAlOyB0b3A6YXV0bzsgbWFyZ2luLWxlZnQ6IC05MHB4fQouY2xlYXJsb29rczIgLm1jZUNvbmZpcm0gLm1jZUNhbmNlbCB7bGVmdDo1MCU7IHRvcDphdXRvfQouY2xlYXJsb29rczIgLm1jZUNvbmZpcm0gLm1jZUljb24ge2JhY2tncm91bmQ6dXJsKGltZy9jb25maXJtLmdpZil9CgovKiBJRTkgZml4ZXMgKi8KLmNsZWFybG9va3MyLmllOSAubWNlVG9wIC5tY2VDZW50ZXIge2NsaXA6YXV0bzt9Ci5jbGVhcmxvb2tzMi5pZTkgLm1jZU1pZGRsZSB7Y2xpcDphdXRvO30KLmNsZWFybG9va3MyLmllOSAubWNlTWlkZGxlIC5tY2VMZWZ0LCAuY2xlYXJsb29rczIuaWU5IC5tY2VNaWRkbGUgLm1jZVJpZ2h0IHt0b3A6IDIzcHg7fQouY2xlYXJsb29rczIuaWU5IC5tY2VBbGVydCAubWNlTWlkZGxlIHNwYW4sIC5jbGVhcmxvb2tzMi5pZTkgLm1jZUNvbmZpcm0gLm1jZU1pZGRsZSBzcGFuIHt0b3A6MTNweDt9Ci5jbGVhcmxvb2tzMi5pZTkgLm1jZU1vZGFsIC5tY2VNaWRkbGUge3RvcDoyM3B4fQouY2xlYXJsb29rczIuaWU5IC5tY2VNb2RhbCAubWNlTWlkZGxlIC5tY2VMZWZ0LCAuY2xlYXJsb29rczIuaWU5IC5tY2VNb2RhbCAubWNlTWlkZGxlIC5tY2VSaWdodCB7dG9wOiAwfQouY2xlYXJsb29rczIuaWU5IC5tY2VNaWRkbGUgLm1jZUljb24ge3RvcDoxM3B4fQouY2xlYXJsb29rczIuaWU5IC5tY2VUb3AgLm1jZUNlbnRlciB7dG9wOjA7IHJpZ2h0OmF1dG87IGxlZnQ6NnB4OyB3aWR0aDpjYWxjKDEwMCUtMTJweCl9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/inlinepopups/template.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+IC0tPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgo8dGl0bGU+VGVtcGxhdGUgZm9yIGRpYWxvZ3M8L3RpdGxlPgo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJza2lucy9jbGVhcmxvb2tzMi93aW5kb3cuY3NzIiAvPgo8L2hlYWQ+Cjxib2R5PgoKPGRpdiBjbGFzcz0ibWNlRWRpdG9yIj4KCTxkaXYgY2xhc3M9ImNsZWFybG9va3MyIiBzdHlsZT0id2lkdGg6NDAwcHg7IGhlaWdodDoxMDBweDsgbGVmdDoxMHB4OyI+CgkJPGRpdiBjbGFzcz0ibWNlV3JhcHBlciI+CgkJCTxkaXYgY2xhc3M9Im1jZVRvcCI+CgkJCQk8ZGl2IGNsYXNzPSJtY2VMZWZ0Ij48L2Rpdj4KCQkJCTxkaXYgY2xhc3M9Im1jZUNlbnRlciI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VSaWdodCI+PC9kaXY+CgkJCQk8c3Bhbj5CbHVyZWQ8L3NwYW4+CgkJCTwvZGl2PgoKCQkJPGRpdiBjbGFzcz0ibWNlTWlkZGxlIj4KCQkJCTxkaXYgY2xhc3M9Im1jZUxlZnQiPjwvZGl2PgoJCQkJPHNwYW4+Q29udGVudDwvc3Bhbj4KCQkJCTxkaXYgY2xhc3M9Im1jZVJpZ2h0Ij48L2Rpdj4KCQkJPC9kaXY+CgoJCQk8ZGl2IGNsYXNzPSJtY2VCb3R0b20iPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQkJPHNwYW4+U3RhdHVzYmFyIHRleHQuPC9zcGFuPgoJCQk8L2Rpdj4KCgkJCTxhIGNsYXNzPSJtY2VNb3ZlIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VNaW4iIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZU1heCIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlTWVkIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VDbG9zZSIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZU4iIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVTIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplVyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZUUiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVOVyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZU5FIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplU1ciIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVTRSIgaHJlZj0iIyI+PC9hPgoJCTwvZGl2PgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0iY2xlYXJsb29rczIiIHN0eWxlPSJ3aWR0aDo0MDBweDsgaGVpZ2h0OjEwMHB4OyBsZWZ0OjQyMHB4OyI+CgkJPGRpdiBjbGFzcz0ibWNlV3JhcHBlciBtY2VNb3ZhYmxlIG1jZUZvY3VzIj4KCQkJPGRpdiBjbGFzcz0ibWNlVG9wIj4KCQkJCTxkaXYgY2xhc3M9Im1jZUxlZnQiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlQ2VudGVyIj48L2Rpdj4KCQkJCTxkaXYgY2xhc3M9Im1jZVJpZ2h0Ij48L2Rpdj4KCQkJCTxzcGFuPkZvY3VzZWQ8L3NwYW4+CgkJCTwvZGl2PgoKCQkJPGRpdiBjbGFzcz0ibWNlTWlkZGxlIj4KCQkJCTxkaXYgY2xhc3M9Im1jZUxlZnQiPjwvZGl2PgoJCQkJPHNwYW4+Q29udGVudDwvc3Bhbj4KCQkJCTxkaXYgY2xhc3M9Im1jZVJpZ2h0Ij48L2Rpdj4KCQkJPC9kaXY+CgoJCQk8ZGl2IGNsYXNzPSJtY2VCb3R0b20iPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQkJPHNwYW4+U3RhdHVzYmFyIHRleHQuPC9zcGFuPgoJCQk8L2Rpdj4KCgkJCTxhIGNsYXNzPSJtY2VNb3ZlIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VNaW4iIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZU1heCIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlTWVkIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VDbG9zZSIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZU4iIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVTIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplVyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZUUiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVOVyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZU5FIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplU1ciIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVTRSIgaHJlZj0iIyI+PC9hPgoJCTwvZGl2PgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0iY2xlYXJsb29rczIiIHN0eWxlPSJ3aWR0aDo0MDBweDsgaGVpZ2h0OjEwMHB4OyBsZWZ0OjEwcHg7IHRvcDoxMjBweDsiPgoJCTxkaXYgY2xhc3M9Im1jZVdyYXBwZXIgbWNlTW92YWJsZSBtY2VGb2N1cyBtY2VTdGF0dXNiYXIiPgoJCQk8ZGl2IGNsYXNzPSJtY2VUb3AiPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQkJPHNwYW4+U3RhdHVzYmFyPC9zcGFuPgoJCQk8L2Rpdj4KCgkJCTxkaXYgY2xhc3M9Im1jZU1pZGRsZSI+CgkJCQk8ZGl2IGNsYXNzPSJtY2VMZWZ0Ij48L2Rpdj4KCQkJCTxzcGFuPkNvbnRlbnQ8L3NwYW4+CgkJCQk8ZGl2IGNsYXNzPSJtY2VSaWdodCI+PC9kaXY+CgkJCTwvZGl2PgoKCQkJPGRpdiBjbGFzcz0ibWNlQm90dG9tIj4KCQkJCTxkaXYgY2xhc3M9Im1jZUxlZnQiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlQ2VudGVyIj48L2Rpdj4KCQkJCTxkaXYgY2xhc3M9Im1jZVJpZ2h0Ij48L2Rpdj4KCQkJCTxzcGFuPlN0YXR1c2JhciB0ZXh0Ljwvc3Bhbj4KCQkJPC9kaXY+CgoJCQk8YSBjbGFzcz0ibWNlTW92ZSIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlTWluIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VNYXgiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZU1lZCIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlQ2xvc2UiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVOIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplUyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZVciIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVFIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplTlciIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVORSIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZVNXIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplU0UiIGhyZWY9IiMiPjwvYT4KCQk8L2Rpdj4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9ImNsZWFybG9va3MyIiBzdHlsZT0id2lkdGg6NDAwcHg7IGhlaWdodDoxMDBweDsgbGVmdDo0MjBweDsgdG9wOjEyMHB4OyI+CgkJPGRpdiBjbGFzcz0ibWNlV3JhcHBlciBtY2VNb3ZhYmxlIG1jZUZvY3VzIG1jZVN0YXR1c2JhciBtY2VSZXNpemFibGUiPgoJCQk8ZGl2IGNsYXNzPSJtY2VUb3AiPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQkJPHNwYW4+U3RhdHVzYmFyLCBSZXNpemFibGU8L3NwYW4+CgkJCTwvZGl2PgoKCQkJPGRpdiBjbGFzcz0ibWNlTWlkZGxlIj4KCQkJCTxkaXYgY2xhc3M9Im1jZUxlZnQiPjwvZGl2PgoJCQkJPHNwYW4+Q29udGVudDwvc3Bhbj4KCQkJCTxkaXYgY2xhc3M9Im1jZVJpZ2h0Ij48L2Rpdj4KCQkJPC9kaXY+CgoJCQk8ZGl2IGNsYXNzPSJtY2VCb3R0b20iPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQkJPHNwYW4+U3RhdHVzYmFyIHRleHQuPC9zcGFuPgoJCQk8L2Rpdj4KCgkJCTxhIGNsYXNzPSJtY2VNb3ZlIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VNaW4iIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZU1heCIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlTWVkIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VDbG9zZSIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZU4iIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVTIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplVyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZUUiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVOVyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZU5FIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplU1ciIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVTRSIgaHJlZj0iIyI+PC9hPgoJCTwvZGl2PgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0iY2xlYXJsb29rczIiIHN0eWxlPSJ3aWR0aDo0MDBweDsgaGVpZ2h0OjEwMHB4OyBsZWZ0OjEwcHg7IHRvcDoyMzBweDsiPgoJCTxkaXYgY2xhc3M9Im1jZVdyYXBwZXIgbWNlTW92YWJsZSBtY2VGb2N1cyBtY2VSZXNpemFibGUgbWNlTWF4aW1pemFibGUiPgoJCQk8ZGl2IGNsYXNzPSJtY2VUb3AiPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQkJPHNwYW4+UmVzaXphYmxlLCBNYXhpbWl6YWJsZTwvc3Bhbj4KCQkJPC9kaXY+CgoJCQk8ZGl2IGNsYXNzPSJtY2VNaWRkbGUiPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8c3Bhbj5Db250ZW50PC9zcGFuPgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQk8L2Rpdj4KCgkJCTxkaXYgY2xhc3M9Im1jZUJvdHRvbSI+CgkJCQk8ZGl2IGNsYXNzPSJtY2VMZWZ0Ij48L2Rpdj4KCQkJCTxkaXYgY2xhc3M9Im1jZUNlbnRlciI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VSaWdodCI+PC9kaXY+CgkJCQk8c3Bhbj5TdGF0dXNiYXIgdGV4dC48L3NwYW4+CgkJCTwvZGl2PgoKCQkJPGEgY2xhc3M9Im1jZU1vdmUiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZU1pbiIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlTWF4IiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VNZWQiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZUNsb3NlIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplTiIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZVMiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVXIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplRSIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZU5XIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplTkUiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVTVyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZVNFIiBocmVmPSIjIj48L2E+CgkJPC9kaXY+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJjbGVhcmxvb2tzMiIgc3R5bGU9IndpZHRoOjQwMHB4OyBoZWlnaHQ6MTAwcHg7IGxlZnQ6NDIwcHg7IHRvcDoyMzBweDsiPgoJCTxkaXYgY2xhc3M9Im1jZVdyYXBwZXIgbWNlTW92YWJsZSBtY2VTdGF0dXNiYXIgbWNlUmVzaXphYmxlIG1jZU1heGltaXphYmxlIj4KCQkJPGRpdiBjbGFzcz0ibWNlVG9wIj4KCQkJCTxkaXYgY2xhc3M9Im1jZUxlZnQiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlQ2VudGVyIj48L2Rpdj4KCQkJCTxkaXYgY2xhc3M9Im1jZVJpZ2h0Ij48L2Rpdj4KCQkJCTxzcGFuPkJsdXJyZWQsIE1heGltaXphYmxlLCBTdGF0dXNiYXIsIFJlc2l6YWJsZTwvc3Bhbj4KCQkJPC9kaXY+CgoJCQk8ZGl2IGNsYXNzPSJtY2VNaWRkbGUiPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8c3Bhbj5Db250ZW50PC9zcGFuPgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQk8L2Rpdj4KCgkJCTxkaXYgY2xhc3M9Im1jZUJvdHRvbSI+CgkJCQk8ZGl2IGNsYXNzPSJtY2VMZWZ0Ij48L2Rpdj4KCQkJCTxkaXYgY2xhc3M9Im1jZUNlbnRlciI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VSaWdodCI+PC9kaXY+CgkJCQk8c3Bhbj5TdGF0dXNiYXIgdGV4dC48L3NwYW4+CgkJCTwvZGl2PgoKCQkJPGEgY2xhc3M9Im1jZU1vdmUiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZU1pbiIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlTWF4IiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VNZWQiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZUNsb3NlIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplTiIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZVMiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVXIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplRSIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZU5XIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplTkUiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVTVyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZVNFIiBocmVmPSIjIj48L2E+CgkJPC9kaXY+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJjbGVhcmxvb2tzMiIgc3R5bGU9IndpZHRoOjQwMHB4OyBoZWlnaHQ6MTAwcHg7IGxlZnQ6MTBweDsgdG9wOjM0MHB4OyI+CgkJPGRpdiBjbGFzcz0ibWNlV3JhcHBlciBtY2VNb3ZhYmxlIG1jZUZvY3VzIG1jZVJlc2l6YWJsZSBtY2VNYXhpbWl6ZWQgbWNlTWluaW1pemFibGUgbWNlTWF4aW1pemFibGUiPgoJCQk8ZGl2IGNsYXNzPSJtY2VUb3AiPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQkJPHNwYW4+TWF4aW1pemVkLCBNYXhpbWl6YWJsZSwgTWluaW1pemFibGU8L3NwYW4+CgkJCTwvZGl2PgoKCQkJPGRpdiBjbGFzcz0ibWNlTWlkZGxlIj4KCQkJCTxkaXYgY2xhc3M9Im1jZUxlZnQiPjwvZGl2PgoJCQkJPHNwYW4+Q29udGVudDwvc3Bhbj4KCQkJCTxkaXYgY2xhc3M9Im1jZVJpZ2h0Ij48L2Rpdj4KCQkJPC9kaXY+CgoJCQk8ZGl2IGNsYXNzPSJtY2VCb3R0b20iPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQkJPHNwYW4+U3RhdHVzYmFyIHRleHQuPC9zcGFuPgoJCQk8L2Rpdj4KCgkJCTxhIGNsYXNzPSJtY2VNb3ZlIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VNaW4iIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZU1heCIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlTWVkIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VDbG9zZSIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZU4iIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVTIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplVyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZUUiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVOVyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZU5FIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplU1ciIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVTRSIgaHJlZj0iIyI+PC9hPgoJCTwvZGl2PgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0iY2xlYXJsb29rczIiIHN0eWxlPSJ3aWR0aDo0MDBweDsgaGVpZ2h0OjEwMHB4OyBsZWZ0OjQyMHB4OyB0b3A6MzQwcHg7Ij4KCQk8ZGl2IGNsYXNzPSJtY2VXcmFwcGVyIG1jZU1vdmFibGUgbWNlU3RhdHVzYmFyIG1jZVJlc2l6YWJsZSBtY2VNYXhpbWl6ZWQgbWNlTWluaW1pemFibGUgbWNlTWF4aW1pemFibGUiPgoJCQk8ZGl2IGNsYXNzPSJtY2VUb3AiPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQkJPHNwYW4+Qmx1cmVkPC9zcGFuPgoJCQk8L2Rpdj4KCgkJCTxkaXYgY2xhc3M9Im1jZU1pZGRsZSI+CgkJCQk8ZGl2IGNsYXNzPSJtY2VMZWZ0Ij48L2Rpdj4KCQkJCTxzcGFuPkNvbnRlbnQ8L3NwYW4+CgkJCQk8ZGl2IGNsYXNzPSJtY2VSaWdodCI+PC9kaXY+CgkJCTwvZGl2PgoKCQkJPGRpdiBjbGFzcz0ibWNlQm90dG9tIj4KCQkJCTxkaXYgY2xhc3M9Im1jZUxlZnQiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlQ2VudGVyIj48L2Rpdj4KCQkJCTxkaXYgY2xhc3M9Im1jZVJpZ2h0Ij48L2Rpdj4KCQkJCTxzcGFuPlN0YXR1c2JhciB0ZXh0Ljwvc3Bhbj4KCQkJPC9kaXY+CgoJCQk8YSBjbGFzcz0ibWNlTW92ZSIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlTWluIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VNYXgiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZU1lZCIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlQ2xvc2UiIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVOIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplUyIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZVciIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVFIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplTlciIGhyZWY9IiMiPjwvYT4KCQkJPGEgY2xhc3M9Im1jZVJlc2l6ZSBtY2VSZXNpemVORSIgaHJlZj0iIyI+PC9hPgoJCQk8YSBjbGFzcz0ibWNlUmVzaXplIG1jZVJlc2l6ZVNXIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VSZXNpemUgbWNlUmVzaXplU0UiIGhyZWY9IiMiPjwvYT4KCQk8L2Rpdj4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9ImNsZWFybG9va3MyIiBzdHlsZT0id2lkdGg6NDAwcHg7IGhlaWdodDoxMzBweDsgbGVmdDoxMHB4OyB0b3A6NDUwcHg7Ij4KCQk8ZGl2IGNsYXNzPSJtY2VXcmFwcGVyIG1jZU1vdmFibGUgbWNlRm9jdXMgbWNlTW9kYWwgbWNlQWxlcnQiPgoJCQk8ZGl2IGNsYXNzPSJtY2VUb3AiPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQkJPHNwYW4+QWxlcnQ8L3NwYW4+CgkJCTwvZGl2PgoKCQkJPGRpdiBjbGFzcz0ibWNlTWlkZGxlIj4KCQkJCTxkaXYgY2xhc3M9Im1jZUxlZnQiPjwvZGl2PgoJCQkJPHNwYW4+CgkJCQkJVGhpcyBpcyBhIHZlcnkgbG9uZyBlcnJvciBtZXNzYWdlLiBUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuCgkJCQkJVGhpcyBpcyBhIHZlcnkgbG9uZyBlcnJvciBtZXNzYWdlLiBUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuCgkJCQkJVGhpcyBpcyBhIHZlcnkgbG9uZyBlcnJvciBtZXNzYWdlLiBUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuCgkJCQkJVGhpcyBpcyBhIHZlcnkgbG9uZyBlcnJvciBtZXNzYWdlLiBUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuCgkJCQkJVGhpcyBpcyBhIHZlcnkgbG9uZyBlcnJvciBtZXNzYWdlLiBUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuCgkJCQkJVGhpcyBpcyBhIHZlcnkgbG9uZyBlcnJvciBtZXNzYWdlLiBUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuCgkJCQk8L3NwYW4+CgkJCQk8ZGl2IGNsYXNzPSJtY2VSaWdodCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VJY29uIj48L2Rpdj4KCQkJPC9kaXY+CgoJCQk8ZGl2IGNsYXNzPSJtY2VCb3R0b20iPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQk8L2Rpdj4KCgkJCTxhIGNsYXNzPSJtY2VNb3ZlIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VCdXR0b24gbWNlT2siIGhyZWY9IiMiPk9rPC9hPgoJCQk8YSBjbGFzcz0ibWNlQ2xvc2UiIGhyZWY9IiMiPjwvYT4KCQk8L2Rpdj4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9ImNsZWFybG9va3MyIiBzdHlsZT0id2lkdGg6NDAwcHg7IGhlaWdodDoxMzBweDsgbGVmdDo0MjBweDsgdG9wOjQ1MHB4OyI+CgkJPGRpdiBjbGFzcz0ibWNlV3JhcHBlciBtY2VNb3ZhYmxlIG1jZUZvY3VzIG1jZU1vZGFsIG1jZUNvbmZpcm0iPgoJCQk8ZGl2IGNsYXNzPSJtY2VUb3AiPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQkJPHNwYW4+Q29uZmlybTwvc3Bhbj4KCQkJPC9kaXY+CgoJCQk8ZGl2IGNsYXNzPSJtY2VNaWRkbGUiPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8c3Bhbj4KCQkJCQlUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuIFRoaXMgaXMgYSB2ZXJ5IGxvbmcgZXJyb3IgbWVzc2FnZS4KCQkJCQlUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuIFRoaXMgaXMgYSB2ZXJ5IGxvbmcgZXJyb3IgbWVzc2FnZS4KCQkJCQlUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuIFRoaXMgaXMgYSB2ZXJ5IGxvbmcgZXJyb3IgbWVzc2FnZS4KCQkJCQlUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuIFRoaXMgaXMgYSB2ZXJ5IGxvbmcgZXJyb3IgbWVzc2FnZS4KCQkJCQlUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuIFRoaXMgaXMgYSB2ZXJ5IGxvbmcgZXJyb3IgbWVzc2FnZS4KCQkJCQlUaGlzIGlzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UuIFRoaXMgaXMgYSB2ZXJ5IGxvbmcgZXJyb3IgbWVzc2FnZS4KCQkJCQk8L3NwYW4+CgkJCQk8ZGl2IGNsYXNzPSJtY2VSaWdodCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VJY29uIj48L2Rpdj4KCQkJPC9kaXY+CgoJCQk8ZGl2IGNsYXNzPSJtY2VCb3R0b20iPgoJCQkJPGRpdiBjbGFzcz0ibWNlTGVmdCI+PC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtY2VDZW50ZXIiPjwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibWNlUmlnaHQiPjwvZGl2PgoJCQk8L2Rpdj4KCgkJCTxhIGNsYXNzPSJtY2VNb3ZlIiBocmVmPSIjIj48L2E+CgkJCTxhIGNsYXNzPSJtY2VCdXR0b24gbWNlT2siIGhyZWY9IiMiPk9rPC9hPgoJCQk8YSBjbGFzcz0ibWNlQnV0dG9uIG1jZUNhbmNlbCIgaHJlZj0iIyI+Q2FuY2VsPC9hPgoJCQk8YSBjbGFzcz0ibWNlQ2xvc2UiIGhyZWY9IiMiPjwvYT4KCQk8L2Rpdj4KCTwvZGl2Pgo8L2Rpdj4KCjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/insertdatetime/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/insertdatetime/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5JbnNlcnREYXRlVGltZSIse2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO2MuZWRpdG9yPWE7YS5hZGRDb21tYW5kKCJtY2VJbnNlcnREYXRlIixmdW5jdGlvbigpe3ZhciBkPWMuX2dldERhdGVUaW1lKG5ldyBEYXRlKCksYS5nZXRQYXJhbSgicGx1Z2luX2luc2VydGRhdGVfZGF0ZUZvcm1hdCIsYS5nZXRMYW5nKCJpbnNlcnRkYXRldGltZS5kYXRlX2ZtdCIpKSk7YS5leGVjQ29tbWFuZCgibWNlSW5zZXJ0Q29udGVudCIsZmFsc2UsZCl9KTthLmFkZENvbW1hbmQoIm1jZUluc2VydFRpbWUiLGZ1bmN0aW9uKCl7dmFyIGQ9Yy5fZ2V0RGF0ZVRpbWUobmV3IERhdGUoKSxhLmdldFBhcmFtKCJwbHVnaW5faW5zZXJ0ZGF0ZV90aW1lRm9ybWF0IixhLmdldExhbmcoImluc2VydGRhdGV0aW1lLnRpbWVfZm10IikpKTthLmV4ZWNDb21tYW5kKCJtY2VJbnNlcnRDb250ZW50IixmYWxzZSxkKX0pO2EuYWRkQnV0dG9uKCJpbnNlcnRkYXRlIix7dGl0bGU6Imluc2VydGRhdGV0aW1lLmluc2VydGRhdGVfZGVzYyIsY21kOiJtY2VJbnNlcnREYXRlIn0pO2EuYWRkQnV0dG9uKCJpbnNlcnR0aW1lIix7dGl0bGU6Imluc2VydGRhdGV0aW1lLmluc2VydHRpbWVfZGVzYyIsY21kOiJtY2VJbnNlcnRUaW1lIn0pfSxnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJJbnNlcnQgZGF0ZS90aW1lIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9pbnNlcnRkYXRldGltZSIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fSxfZ2V0RGF0ZVRpbWU6ZnVuY3Rpb24oZSxhKXt2YXIgYz10aGlzLmVkaXRvcjtmdW5jdGlvbiBiKGcsZCl7Zz0iIitnO2lmKGcubGVuZ3RoPGQpe2Zvcih2YXIgZj0wO2Y8KGQtZy5sZW5ndGgpO2YrKyl7Zz0iMCIrZ319cmV0dXJuIGd9YT1hLnJlcGxhY2UoIiVEIiwiJW0vJWQvJXkiKTthPWEucmVwbGFjZSgiJXIiLCIlSTolTTolUyAlcCIpO2E9YS5yZXBsYWNlKCIlWSIsIiIrZS5nZXRGdWxsWWVhcigpKTthPWEucmVwbGFjZSgiJXkiLCIiK2UuZ2V0WWVhcigpKTthPWEucmVwbGFjZSgiJW0iLGIoZS5nZXRNb250aCgpKzEsMikpO2E9YS5yZXBsYWNlKCIlZCIsYihlLmdldERhdGUoKSwyKSk7YT1hLnJlcGxhY2UoIiVIIiwiIitiKGUuZ2V0SG91cnMoKSwyKSk7YT1hLnJlcGxhY2UoIiVNIiwiIitiKGUuZ2V0TWludXRlcygpLDIpKTthPWEucmVwbGFjZSgiJVMiLCIiK2IoZS5nZXRTZWNvbmRzKCksMikpO2E9YS5yZXBsYWNlKCIlSSIsIiIrKChlLmdldEhvdXJzKCkrMTEpJTEyKzEpKTthPWEucmVwbGFjZSgiJXAiLCIiKyhlLmdldEhvdXJzKCk8MTI/IkFNIjoiUE0iKSk7YT1hLnJlcGxhY2UoIiVCIiwiIitjLmdldExhbmcoImluc2VydGRhdGV0aW1lLm1vbnRoc19sb25nIikuc3BsaXQoIiwiKVtlLmdldE1vbnRoKCldKTthPWEucmVwbGFjZSgiJWIiLCIiK2MuZ2V0TGFuZygiaW5zZXJ0ZGF0ZXRpbWUubW9udGhzX3Nob3J0Iikuc3BsaXQoIiwiKVtlLmdldE1vbnRoKCldKTthPWEucmVwbGFjZSgiJUEiLCIiK2MuZ2V0TGFuZygiaW5zZXJ0ZGF0ZXRpbWUuZGF5X2xvbmciKS5zcGxpdCgiLCIpW2UuZ2V0RGF5KCldKTthPWEucmVwbGFjZSgiJWEiLCIiK2MuZ2V0TGFuZygiaW5zZXJ0ZGF0ZXRpbWUuZGF5X3Nob3J0Iikuc3BsaXQoIiwiKVtlLmdldERheSgpXSk7YT1hLnJlcGxhY2UoIiUlIiwiJSIpO3JldHVybiBhfX0pO3RpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoImluc2VydGRhdGV0aW1lIix0aW55bWNlLnBsdWdpbnMuSW5zZXJ0RGF0ZVRpbWUpfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/insertdatetime/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLkluc2VydERhdGVUaW1lJywgew0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmVkaXRvciA9IGVkOw0KDQoJCQllZC5hZGRDb21tYW5kKCdtY2VJbnNlcnREYXRlJywgZnVuY3Rpb24oKSB7DQoJCQkJdmFyIHN0ciA9IHQuX2dldERhdGVUaW1lKG5ldyBEYXRlKCksIGVkLmdldFBhcmFtKCJwbHVnaW5faW5zZXJ0ZGF0ZV9kYXRlRm9ybWF0IiwgZWQuZ2V0TGFuZygnaW5zZXJ0ZGF0ZXRpbWUuZGF0ZV9mbXQnKSkpOw0KDQoJCQkJZWQuZXhlY0NvbW1hbmQoJ21jZUluc2VydENvbnRlbnQnLCBmYWxzZSwgc3RyKTsNCgkJCX0pOw0KDQoJCQllZC5hZGRDb21tYW5kKCdtY2VJbnNlcnRUaW1lJywgZnVuY3Rpb24oKSB7DQoJCQkJdmFyIHN0ciA9IHQuX2dldERhdGVUaW1lKG5ldyBEYXRlKCksIGVkLmdldFBhcmFtKCJwbHVnaW5faW5zZXJ0ZGF0ZV90aW1lRm9ybWF0IiwgZWQuZ2V0TGFuZygnaW5zZXJ0ZGF0ZXRpbWUudGltZV9mbXQnKSkpOw0KDQoJCQkJZWQuZXhlY0NvbW1hbmQoJ21jZUluc2VydENvbnRlbnQnLCBmYWxzZSwgc3RyKTsNCgkJCX0pOw0KDQoJCQllZC5hZGRCdXR0b24oJ2luc2VydGRhdGUnLCB7dGl0bGUgOiAnaW5zZXJ0ZGF0ZXRpbWUuaW5zZXJ0ZGF0ZV9kZXNjJywgY21kIDogJ21jZUluc2VydERhdGUnfSk7DQoJCQllZC5hZGRCdXR0b24oJ2luc2VydHRpbWUnLCB7dGl0bGUgOiAnaW5zZXJ0ZGF0ZXRpbWUuaW5zZXJ0dGltZV9kZXNjJywgY21kIDogJ21jZUluc2VydFRpbWUnfSk7DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdJbnNlcnQgZGF0ZS90aW1lJywNCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9pbnNlcnRkYXRldGltZScsDQoJCQkJdmVyc2lvbiA6IHRpbnltY2UubWFqb3JWZXJzaW9uICsgIi4iICsgdGlueW1jZS5taW5vclZlcnNpb24NCgkJCX07DQoJCX0sDQoNCgkJLy8gUHJpdmF0ZSBtZXRob2RzDQoNCgkJX2dldERhdGVUaW1lIDogZnVuY3Rpb24oZCwgZm10KSB7DQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvcjsNCg0KCQkJZnVuY3Rpb24gYWRkWmVyb3ModmFsdWUsIGxlbikgew0KCQkJCXZhbHVlID0gIiIgKyB2YWx1ZTsNCg0KCQkJCWlmICh2YWx1ZS5sZW5ndGggPCBsZW4pIHsNCgkJCQkJZm9yICh2YXIgaT0wOyBpPChsZW4tdmFsdWUubGVuZ3RoKTsgaSsrKQ0KCQkJCQkJdmFsdWUgPSAiMCIgKyB2YWx1ZTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gdmFsdWU7DQoJCQl9Ow0KDQoJCQlmbXQgPSBmbXQucmVwbGFjZSgiJUQiLCAiJW0vJWQvJXkiKTsNCgkJCWZtdCA9IGZtdC5yZXBsYWNlKCIlciIsICIlSTolTTolUyAlcCIpOw0KCQkJZm10ID0gZm10LnJlcGxhY2UoIiVZIiwgIiIgKyBkLmdldEZ1bGxZZWFyKCkpOw0KCQkJZm10ID0gZm10LnJlcGxhY2UoIiV5IiwgIiIgKyBkLmdldFllYXIoKSk7DQoJCQlmbXQgPSBmbXQucmVwbGFjZSgiJW0iLCBhZGRaZXJvcyhkLmdldE1vbnRoKCkrMSwgMikpOw0KCQkJZm10ID0gZm10LnJlcGxhY2UoIiVkIiwgYWRkWmVyb3MoZC5nZXREYXRlKCksIDIpKTsNCgkJCWZtdCA9IGZtdC5yZXBsYWNlKCIlSCIsICIiICsgYWRkWmVyb3MoZC5nZXRIb3VycygpLCAyKSk7DQoJCQlmbXQgPSBmbXQucmVwbGFjZSgiJU0iLCAiIiArIGFkZFplcm9zKGQuZ2V0TWludXRlcygpLCAyKSk7DQoJCQlmbXQgPSBmbXQucmVwbGFjZSgiJVMiLCAiIiArIGFkZFplcm9zKGQuZ2V0U2Vjb25kcygpLCAyKSk7DQoJCQlmbXQgPSBmbXQucmVwbGFjZSgiJUkiLCAiIiArICgoZC5nZXRIb3VycygpICsgMTEpICUgMTIgKyAxKSk7DQoJCQlmbXQgPSBmbXQucmVwbGFjZSgiJXAiLCAiIiArIChkLmdldEhvdXJzKCkgPCAxMiA/ICJBTSIgOiAiUE0iKSk7DQoJCQlmbXQgPSBmbXQucmVwbGFjZSgiJUIiLCAiIiArIGVkLmdldExhbmcoImluc2VydGRhdGV0aW1lLm1vbnRoc19sb25nIikuc3BsaXQoJywnKVtkLmdldE1vbnRoKCldKTsNCgkJCWZtdCA9IGZtdC5yZXBsYWNlKCIlYiIsICIiICsgZWQuZ2V0TGFuZygiaW5zZXJ0ZGF0ZXRpbWUubW9udGhzX3Nob3J0Iikuc3BsaXQoJywnKVtkLmdldE1vbnRoKCldKTsNCgkJCWZtdCA9IGZtdC5yZXBsYWNlKCIlQSIsICIiICsgZWQuZ2V0TGFuZygiaW5zZXJ0ZGF0ZXRpbWUuZGF5X2xvbmciKS5zcGxpdCgnLCcpW2QuZ2V0RGF5KCldKTsNCgkJCWZtdCA9IGZtdC5yZXBsYWNlKCIlYSIsICIiICsgZWQuZ2V0TGFuZygiaW5zZXJ0ZGF0ZXRpbWUuZGF5X3Nob3J0Iikuc3BsaXQoJywnKVtkLmdldERheSgpXSk7DQoJCQlmbXQgPSBmbXQucmVwbGFjZSgiJSUiLCAiJSIpOw0KDQoJCQlyZXR1cm4gZm10Ow0KCQl9DQoJfSk7DQoNCgkvLyBSZWdpc3RlciBwbHVnaW4NCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCdpbnNlcnRkYXRldGltZScsIHRpbnltY2UucGx1Z2lucy5JbnNlcnREYXRlVGltZSk7DQp9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/layer/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/layer/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5MYXllciIse2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO2MuZWRpdG9yPWE7YS5hZGRDb21tYW5kKCJtY2VJbnNlcnRMYXllciIsYy5faW5zZXJ0TGF5ZXIsYyk7YS5hZGRDb21tYW5kKCJtY2VNb3ZlRm9yd2FyZCIsZnVuY3Rpb24oKXtjLl9tb3ZlKDEpfSk7YS5hZGRDb21tYW5kKCJtY2VNb3ZlQmFja3dhcmQiLGZ1bmN0aW9uKCl7Yy5fbW92ZSgtMSl9KTthLmFkZENvbW1hbmQoIm1jZU1ha2VBYnNvbHV0ZSIsZnVuY3Rpb24oKXtjLl90b2dnbGVBYnNvbHV0ZSgpfSk7YS5hZGRCdXR0b24oIm1vdmVmb3J3YXJkIix7dGl0bGU6ImxheWVyLmZvcndhcmRfZGVzYyIsY21kOiJtY2VNb3ZlRm9yd2FyZCJ9KTthLmFkZEJ1dHRvbigibW92ZWJhY2t3YXJkIix7dGl0bGU6ImxheWVyLmJhY2t3YXJkX2Rlc2MiLGNtZDoibWNlTW92ZUJhY2t3YXJkIn0pO2EuYWRkQnV0dG9uKCJhYnNvbHV0ZSIse3RpdGxlOiJsYXllci5hYnNvbHV0ZV9kZXNjIixjbWQ6Im1jZU1ha2VBYnNvbHV0ZSJ9KTthLmFkZEJ1dHRvbigiaW5zZXJ0bGF5ZXIiLHt0aXRsZToibGF5ZXIuaW5zZXJ0bGF5ZXJfZGVzYyIsY21kOiJtY2VJbnNlcnRMYXllciJ9KTthLm9uSW5pdC5hZGQoZnVuY3Rpb24oKXtpZih0aW55bWNlLmlzSUUpe2EuZ2V0RG9jKCkuZXhlY0NvbW1hbmQoIjJELVBvc2l0aW9uIixmYWxzZSx0cnVlKX19KTthLm9uTm9kZUNoYW5nZS5hZGQoYy5fbm9kZUNoYW5nZSxjKTthLm9uVmlzdWFsQWlkLmFkZChjLl92aXN1YWxBaWQsYyl9LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6IkxheWVyIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9sYXllciIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fSxfbm9kZUNoYW5nZTpmdW5jdGlvbihiLGEsZSl7dmFyIGMsZDtjPXRoaXMuX2dldFBhcmVudExheWVyKGUpO2Q9Yi5kb20uZ2V0UGFyZW50KGUsIkRJVixQLElNRyIpO2lmKCFkKXthLnNldERpc2FibGVkKCJhYnNvbHV0ZSIsMSk7YS5zZXREaXNhYmxlZCgibW92ZWZvcndhcmQiLDEpO2Euc2V0RGlzYWJsZWQoIm1vdmViYWNrd2FyZCIsMSl9ZWxzZXthLnNldERpc2FibGVkKCJhYnNvbHV0ZSIsMCk7YS5zZXREaXNhYmxlZCgibW92ZWZvcndhcmQiLCFjKTthLnNldERpc2FibGVkKCJtb3ZlYmFja3dhcmQiLCFjKTthLnNldEFjdGl2ZSgiYWJzb2x1dGUiLGMmJmMuc3R5bGUucG9zaXRpb24udG9Mb3dlckNhc2UoKT09ImFic29sdXRlIil9fSxfdmlzdWFsQWlkOmZ1bmN0aW9uKGEsYyxiKXt2YXIgZD1hLmRvbTt0aW55bWNlLmVhY2goZC5zZWxlY3QoImRpdixwIixjKSxmdW5jdGlvbihmKXtpZigvXihhYnNvbHV0ZXxyZWxhdGl2ZXxzdGF0aWMpJC9pLnRlc3QoZi5zdHlsZS5wb3NpdGlvbikpe2lmKGIpe2QuYWRkQ2xhc3MoZiwibWNlSXRlbVZpc3VhbEFpZCIpfWVsc2V7ZC5yZW1vdmVDbGFzcyhmLCJtY2VJdGVtVmlzdWFsQWlkIil9fX0pfSxfbW92ZTpmdW5jdGlvbihoKXt2YXIgYj10aGlzLmVkaXRvcixmLGc9W10sZT10aGlzLl9nZXRQYXJlbnRMYXllcihiLnNlbGVjdGlvbi5nZXROb2RlKCkpLGM9LTEsaj0tMSxhO2E9W107dGlueW1jZS53YWxrKGIuZ2V0Qm9keSgpLGZ1bmN0aW9uKGQpe2lmKGQubm9kZVR5cGU9PTEmJi9eKGFic29sdXRlfHJlbGF0aXZlfHN0YXRpYykkL2kudGVzdChkLnN0eWxlLnBvc2l0aW9uKSl7YS5wdXNoKGQpfX0sImNoaWxkTm9kZXMiKTtmb3IoZj0wO2Y8YS5sZW5ndGg7ZisrKXtnW2ZdPWFbZl0uc3R5bGUuekluZGV4P3BhcnNlSW50KGFbZl0uc3R5bGUuekluZGV4KTowO2lmKGM8MCYmYVtmXT09ZSl7Yz1mfX1pZihoPDApe2ZvcihmPTA7ZjxnLmxlbmd0aDtmKyspe2lmKGdbZl08Z1tjXSl7aj1mO2JyZWFrfX1pZihqPi0xKXthW2NdLnN0eWxlLnpJbmRleD1nW2pdO2Fbal0uc3R5bGUuekluZGV4PWdbY119ZWxzZXtpZihnW2NdPjApe2FbY10uc3R5bGUuekluZGV4PWdbY10tMX19fWVsc2V7Zm9yKGY9MDtmPGcubGVuZ3RoO2YrKyl7aWYoZ1tmXT5nW2NdKXtqPWY7YnJlYWt9fWlmKGo+LTEpe2FbY10uc3R5bGUuekluZGV4PWdbal07YVtqXS5zdHlsZS56SW5kZXg9Z1tjXX1lbHNle2FbY10uc3R5bGUuekluZGV4PWdbY10rMX19Yi5leGVjQ29tbWFuZCgibWNlUmVwYWludCIpfSxfZ2V0UGFyZW50TGF5ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWRpdG9yLmRvbS5nZXRQYXJlbnQoYSxmdW5jdGlvbihiKXtyZXR1cm4gYi5ub2RlVHlwZT09MSYmL14oYWJzb2x1dGV8cmVsYXRpdmV8c3RhdGljKSQvaS50ZXN0KGIuc3R5bGUucG9zaXRpb24pfSl9LF9pbnNlcnRMYXllcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWRpdG9yLGI9YS5kb20uZ2V0UG9zKGEuZG9tLmdldFBhcmVudChhLnNlbGVjdGlvbi5nZXROb2RlKCksIioiKSk7YS5kb20uYWRkKGEuZ2V0Qm9keSgpLCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OmIueCx0b3A6KGIueT4yMD9iLnk6MjApLHdpZHRoOjEwMCxoZWlnaHQ6MTAwfSwiY2xhc3MiOiJtY2VJdGVtVmlzdWFsQWlkIn0sYS5zZWxlY3Rpb24uZ2V0Q29udGVudCgpfHxhLmdldExhbmcoImxheWVyLmNvbnRlbnQiKSl9LF90b2dnbGVBYnNvbHV0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWRpdG9yLGI9dGhpcy5fZ2V0UGFyZW50TGF5ZXIoYS5zZWxlY3Rpb24uZ2V0Tm9kZSgpKTtpZighYil7Yj1hLmRvbS5nZXRQYXJlbnQoYS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCJESVYsUCxJTUciKX1pZihiKXtpZihiLnN0eWxlLnBvc2l0aW9uLnRvTG93ZXJDYXNlKCk9PSJhYnNvbHV0ZSIpe2EuZG9tLnNldFN0eWxlcyhiLHtwb3NpdGlvbjoiIixsZWZ0OiIiLHRvcDoiIix3aWR0aDoiIixoZWlnaHQ6IiJ9KTthLmRvbS5yZW1vdmVDbGFzcyhiLCJtY2VJdGVtVmlzdWFsQWlkIil9ZWxzZXtpZihiLnN0eWxlLmxlZnQ9PSIiKXtiLnN0eWxlLmxlZnQ9MjArInB4In1pZihiLnN0eWxlLnRvcD09IiIpe2Iuc3R5bGUudG9wPTIwKyJweCJ9aWYoYi5zdHlsZS53aWR0aD09IiIpe2Iuc3R5bGUud2lkdGg9Yi53aWR0aD8oYi53aWR0aCsicHgiKToiMTAwcHgifWlmKGIuc3R5bGUuaGVpZ2h0PT0iIil7Yi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ/KGIuaGVpZ2h0KyJweCIpOiIxMDBweCJ9Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2EuYWRkVmlzdWFsKGEuZ2V0Qm9keSgpKX1hLmV4ZWNDb21tYW5kKCJtY2VSZXBhaW50Iik7YS5ub2RlQ2hhbmdlZCgpfX19KTt0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCJsYXllciIsdGlueW1jZS5wbHVnaW5zLkxheWVyKX0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/layer/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLkxheWVyJywgew0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmVkaXRvciA9IGVkOw0KDQoJCQkvLyBSZWdpc3RlciBjb21tYW5kcw0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlSW5zZXJ0TGF5ZXInLCB0Ll9pbnNlcnRMYXllciwgdCk7DQoNCgkJCWVkLmFkZENvbW1hbmQoJ21jZU1vdmVGb3J3YXJkJywgZnVuY3Rpb24oKSB7DQoJCQkJdC5fbW92ZSgxKTsNCgkJCX0pOw0KDQoJCQllZC5hZGRDb21tYW5kKCdtY2VNb3ZlQmFja3dhcmQnLCBmdW5jdGlvbigpIHsNCgkJCQl0Ll9tb3ZlKC0xKTsNCgkJCX0pOw0KDQoJCQllZC5hZGRDb21tYW5kKCdtY2VNYWtlQWJzb2x1dGUnLCBmdW5jdGlvbigpIHsNCgkJCQl0Ll90b2dnbGVBYnNvbHV0ZSgpOw0KCQkJfSk7DQoNCgkJCS8vIFJlZ2lzdGVyIGJ1dHRvbnMNCgkJCWVkLmFkZEJ1dHRvbignbW92ZWZvcndhcmQnLCB7dGl0bGUgOiAnbGF5ZXIuZm9yd2FyZF9kZXNjJywgY21kIDogJ21jZU1vdmVGb3J3YXJkJ30pOw0KCQkJZWQuYWRkQnV0dG9uKCdtb3ZlYmFja3dhcmQnLCB7dGl0bGUgOiAnbGF5ZXIuYmFja3dhcmRfZGVzYycsIGNtZCA6ICdtY2VNb3ZlQmFja3dhcmQnfSk7DQoJCQllZC5hZGRCdXR0b24oJ2Fic29sdXRlJywge3RpdGxlIDogJ2xheWVyLmFic29sdXRlX2Rlc2MnLCBjbWQgOiAnbWNlTWFrZUFic29sdXRlJ30pOw0KCQkJZWQuYWRkQnV0dG9uKCdpbnNlcnRsYXllcicsIHt0aXRsZSA6ICdsYXllci5pbnNlcnRsYXllcl9kZXNjJywgY21kIDogJ21jZUluc2VydExheWVyJ30pOw0KDQoJCQllZC5vbkluaXQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCWlmICh0aW55bWNlLmlzSUUpDQoJCQkJCWVkLmdldERvYygpLmV4ZWNDb21tYW5kKCcyRC1Qb3NpdGlvbicsIGZhbHNlLCB0cnVlKTsNCgkJCX0pOw0KDQoJCQllZC5vbk5vZGVDaGFuZ2UuYWRkKHQuX25vZGVDaGFuZ2UsIHQpOw0KCQkJZWQub25WaXN1YWxBaWQuYWRkKHQuX3Zpc3VhbEFpZCwgdCk7DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdMYXllcicsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbScsDQoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvbGF5ZXInLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9LA0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KDQoJCV9ub2RlQ2hhbmdlIDogZnVuY3Rpb24oZWQsIGNtLCBuKSB7DQoJCQl2YXIgbGUsIHA7DQoNCgkJCWxlID0gdGhpcy5fZ2V0UGFyZW50TGF5ZXIobik7DQoJCQlwID0gZWQuZG9tLmdldFBhcmVudChuLCAnRElWLFAsSU1HJyk7DQoNCgkJCWlmICghcCkgew0KCQkJCWNtLnNldERpc2FibGVkKCdhYnNvbHV0ZScsIDEpOw0KCQkJCWNtLnNldERpc2FibGVkKCdtb3ZlZm9yd2FyZCcsIDEpOw0KCQkJCWNtLnNldERpc2FibGVkKCdtb3ZlYmFja3dhcmQnLCAxKTsNCgkJCX0gZWxzZSB7DQoJCQkJY20uc2V0RGlzYWJsZWQoJ2Fic29sdXRlJywgMCk7DQoJCQkJY20uc2V0RGlzYWJsZWQoJ21vdmVmb3J3YXJkJywgIWxlKTsNCgkJCQljbS5zZXREaXNhYmxlZCgnbW92ZWJhY2t3YXJkJywgIWxlKTsNCgkJCQljbS5zZXRBY3RpdmUoJ2Fic29sdXRlJywgbGUgJiYgbGUuc3R5bGUucG9zaXRpb24udG9Mb3dlckNhc2UoKSA9PSAiYWJzb2x1dGUiKTsNCgkJCX0NCgkJfSwNCg0KCQkvLyBQcml2YXRlIG1ldGhvZHMNCg0KCQlfdmlzdWFsQWlkIDogZnVuY3Rpb24oZWQsIGUsIHMpIHsNCgkJCXZhciBkb20gPSBlZC5kb207DQoNCgkJCXRpbnltY2UuZWFjaChkb20uc2VsZWN0KCdkaXYscCcsIGUpLCBmdW5jdGlvbihlKSB7DQoJCQkJaWYgKC9eKGFic29sdXRlfHJlbGF0aXZlfHN0YXRpYykkL2kudGVzdChlLnN0eWxlLnBvc2l0aW9uKSkgew0KCQkJCQlpZiAocykNCgkJCQkJCWRvbS5hZGRDbGFzcyhlLCAnbWNlSXRlbVZpc3VhbEFpZCcpOw0KCQkJCQllbHNlDQoJCQkJCQlkb20ucmVtb3ZlQ2xhc3MoZSwgJ21jZUl0ZW1WaXN1YWxBaWQnKTsJDQoJCQkJfQ0KCQkJfSk7DQoJCX0sDQoNCgkJX21vdmUgOiBmdW5jdGlvbihkKSB7DQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvciwgaSwgeiA9IFtdLCBsZSA9IHRoaXMuX2dldFBhcmVudExheWVyKGVkLnNlbGVjdGlvbi5nZXROb2RlKCkpLCBjaSA9IC0xLCBmaSA9IC0xLCBubDsNCg0KCQkJbmwgPSBbXTsNCgkJCXRpbnltY2Uud2FsayhlZC5nZXRCb2R5KCksIGZ1bmN0aW9uKG4pIHsNCgkJCQlpZiAobi5ub2RlVHlwZSA9PSAxICYmIC9eKGFic29sdXRlfHJlbGF0aXZlfHN0YXRpYykkL2kudGVzdChuLnN0eWxlLnBvc2l0aW9uKSkNCgkJCQkJbmwucHVzaChuKTsgDQoJCQl9LCAnY2hpbGROb2RlcycpOw0KDQoJCQkvLyBGaW5kIHotaW5kZXhlcw0KCQkJZm9yIChpPTA7IGk8bmwubGVuZ3RoOyBpKyspIHsNCgkJCQl6W2ldID0gbmxbaV0uc3R5bGUuekluZGV4ID8gcGFyc2VJbnQobmxbaV0uc3R5bGUuekluZGV4KSA6IDA7DQoNCgkJCQlpZiAoY2kgPCAwICYmIG5sW2ldID09IGxlKQ0KCQkJCQljaSA9IGk7DQoJCQl9DQoNCgkJCWlmIChkIDwgMCkgew0KCQkJCS8vIE1vdmUgYmFjaw0KDQoJCQkJLy8gVHJ5IGZpbmQgYSBsb3dlciBvbmUNCgkJCQlmb3IgKGk9MDsgaTx6Lmxlbmd0aDsgaSsrKSB7DQoJCQkJCWlmICh6W2ldIDwgeltjaV0pIHsNCgkJCQkJCWZpID0gaTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJaWYgKGZpID4gLTEpIHsNCgkJCQkJbmxbY2ldLnN0eWxlLnpJbmRleCA9IHpbZmldOw0KCQkJCQlubFtmaV0uc3R5bGUuekluZGV4ID0geltjaV07DQoJCQkJfSBlbHNlIHsNCgkJCQkJaWYgKHpbY2ldID4gMCkNCgkJCQkJCW5sW2NpXS5zdHlsZS56SW5kZXggPSB6W2NpXSAtIDE7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkvLyBNb3ZlIGZvcndhcmQNCg0KCQkJCS8vIFRyeSBmaW5kIGEgaGlnaGVyIG9uZQ0KCQkJCWZvciAoaT0wOyBpPHoubGVuZ3RoOyBpKyspIHsNCgkJCQkJaWYgKHpbaV0gPiB6W2NpXSkgew0KCQkJCQkJZmkgPSBpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlpZiAoZmkgPiAtMSkgew0KCQkJCQlubFtjaV0uc3R5bGUuekluZGV4ID0geltmaV07DQoJCQkJCW5sW2ZpXS5zdHlsZS56SW5kZXggPSB6W2NpXTsNCgkJCQl9IGVsc2UNCgkJCQkJbmxbY2ldLnN0eWxlLnpJbmRleCA9IHpbY2ldICsgMTsNCgkJCX0NCg0KCQkJZWQuZXhlY0NvbW1hbmQoJ21jZVJlcGFpbnQnKTsNCgkJfSwNCg0KCQlfZ2V0UGFyZW50TGF5ZXIgOiBmdW5jdGlvbihuKSB7DQoJCQlyZXR1cm4gdGhpcy5lZGl0b3IuZG9tLmdldFBhcmVudChuLCBmdW5jdGlvbihuKSB7DQoJCQkJcmV0dXJuIG4ubm9kZVR5cGUgPT0gMSAmJiAvXihhYnNvbHV0ZXxyZWxhdGl2ZXxzdGF0aWMpJC9pLnRlc3Qobi5zdHlsZS5wb3NpdGlvbik7DQoJCQl9KTsNCgkJfSwNCg0KCQlfaW5zZXJ0TGF5ZXIgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBlZCA9IHRoaXMuZWRpdG9yLCBwID0gZWQuZG9tLmdldFBvcyhlZC5kb20uZ2V0UGFyZW50KGVkLnNlbGVjdGlvbi5nZXROb2RlKCksICcqJykpOw0KDQoJCQllZC5kb20uYWRkKGVkLmdldEJvZHkoKSwgJ2RpdicsIHsNCgkJCQlzdHlsZSA6IHsNCgkJCQkJcG9zaXRpb24gOiAnYWJzb2x1dGUnLA0KCQkJCQlsZWZ0IDogcC54LA0KCQkJCQl0b3AgOiAocC55ID4gMjAgPyBwLnkgOiAyMCksDQoJCQkJCXdpZHRoIDogMTAwLA0KCQkJCQloZWlnaHQgOiAxMDANCgkJCQl9LA0KCQkJCSdjbGFzcycgOiAnbWNlSXRlbVZpc3VhbEFpZCcNCgkJCX0sIGVkLnNlbGVjdGlvbi5nZXRDb250ZW50KCkgfHwgZWQuZ2V0TGFuZygnbGF5ZXIuY29udGVudCcpKTsNCgkJfSwNCg0KCQlfdG9nZ2xlQWJzb2x1dGUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBlZCA9IHRoaXMuZWRpdG9yLCBsZSA9IHRoaXMuX2dldFBhcmVudExheWVyKGVkLnNlbGVjdGlvbi5nZXROb2RlKCkpOw0KDQoJCQlpZiAoIWxlKQ0KCQkJCWxlID0gZWQuZG9tLmdldFBhcmVudChlZC5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAnRElWLFAsSU1HJyk7DQoNCgkJCWlmIChsZSkgew0KCQkJCWlmIChsZS5zdHlsZS5wb3NpdGlvbi50b0xvd2VyQ2FzZSgpID09ICJhYnNvbHV0ZSIpIHsNCgkJCQkJZWQuZG9tLnNldFN0eWxlcyhsZSwgew0KCQkJCQkJcG9zaXRpb24gOiAnJywNCgkJCQkJCWxlZnQgOiAnJywNCgkJCQkJCXRvcCA6ICcnLA0KCQkJCQkJd2lkdGggOiAnJywNCgkJCQkJCWhlaWdodCA6ICcnDQoJCQkJCX0pOw0KDQoJCQkJCWVkLmRvbS5yZW1vdmVDbGFzcyhsZSwgJ21jZUl0ZW1WaXN1YWxBaWQnKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlpZiAobGUuc3R5bGUubGVmdCA9PSAiIikNCgkJCQkJCWxlLnN0eWxlLmxlZnQgPSAyMCArICdweCc7DQoNCgkJCQkJaWYgKGxlLnN0eWxlLnRvcCA9PSAiIikNCgkJCQkJCWxlLnN0eWxlLnRvcCA9IDIwICsgJ3B4JzsNCg0KCQkJCQlpZiAobGUuc3R5bGUud2lkdGggPT0gIiIpDQoJCQkJCQlsZS5zdHlsZS53aWR0aCA9IGxlLndpZHRoID8gKGxlLndpZHRoICsgJ3B4JykgOiAnMTAwcHgnOw0KDQoJCQkJCWlmIChsZS5zdHlsZS5oZWlnaHQgPT0gIiIpDQoJCQkJCQlsZS5zdHlsZS5oZWlnaHQgPSBsZS5oZWlnaHQgPyAobGUuaGVpZ2h0ICsgJ3B4JykgOiAnMTAwcHgnOw0KDQoJCQkJCWxlLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsNCgkJCQkJZWQuYWRkVmlzdWFsKGVkLmdldEJvZHkoKSk7DQoJCQkJfQ0KDQoJCQkJZWQuZXhlY0NvbW1hbmQoJ21jZVJlcGFpbnQnKTsNCgkJCQllZC5ub2RlQ2hhbmdlZCgpOw0KCQkJfQ0KCQl9DQoJfSk7DQoNCgkvLyBSZWdpc3RlciBwbHVnaW4NCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCdsYXllcicsIHRpbnltY2UucGx1Z2lucy5MYXllcik7DQp9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/legacyoutput/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/legacyoutput/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGEpe2Eub25BZGRFZGl0b3IuYWRkVG9Ub3AoZnVuY3Rpb24oYyxiKXtiLnNldHRpbmdzLmlubGluZV9zdHlsZXM9ZmFsc2V9KTthLmNyZWF0ZSgidGlueW1jZS5wbHVnaW5zLkxlZ2FjeU91dHB1dCIse2luaXQ6ZnVuY3Rpb24oYil7Yi5vbkluaXQuYWRkKGZ1bmN0aW9uKCl7dmFyIGM9InAsaDEsaDIsaDMsaDQsaDUsaDYsdGQsdGgsZGl2LHVsLG9sLGxpLHRhYmxlLGltZyIsZT1hLmV4cGxvZGUoYi5zZXR0aW5ncy5mb250X3NpemVfc3R5bGVfdmFsdWVzKSxkPWIuc2VyaWFsaXplcjtiLmZvcm1hdHRlci5yZWdpc3Rlcih7YWxpZ25sZWZ0OntzZWxlY3RvcjpjLGF0dHJpYnV0ZXM6e2FsaWduOiJsZWZ0In19LGFsaWduY2VudGVyOntzZWxlY3RvcjpjLGF0dHJpYnV0ZXM6e2FsaWduOiJjZW50ZXIifX0sYWxpZ25yaWdodDp7c2VsZWN0b3I6YyxhdHRyaWJ1dGVzOnthbGlnbjoicmlnaHQifX0sYWxpZ25mdWxsOntzZWxlY3RvcjpjLGF0dHJpYnV0ZXM6e2FsaWduOiJmdWxsIn19LGJvbGQ6e2lubGluZToiYiJ9LGl0YWxpYzp7aW5saW5lOiJpIn0sdW5kZXJsaW5lOntpbmxpbmU6InUifSxzdHJpa2V0aHJvdWdoOntpbmxpbmU6InN0cmlrZSJ9LGZvbnRuYW1lOntpbmxpbmU6ImZvbnQiLGF0dHJpYnV0ZXM6e2ZhY2U6IiV2YWx1ZSJ9fSxmb250c2l6ZTp7aW5saW5lOiJmb250IixhdHRyaWJ1dGVzOntzaXplOmZ1bmN0aW9uKGYpe3JldHVybiBhLmluQXJyYXkoZSxmLnZhbHVlKSsxfX19LGZvcmVjb2xvcjp7aW5saW5lOiJmb250IixzdHlsZXM6e2NvbG9yOiIldmFsdWUifX0saGlsaXRlY29sb3I6e2lubGluZToiZm9udCIsc3R5bGVzOntiYWNrZ3JvdW5kQ29sb3I6IiV2YWx1ZSJ9fX0pO2QuX3NldHVwKCk7YS5lYWNoKCJiLGksdSxzdHJpa2UiLnNwbGl0KCIsIiksZnVuY3Rpb24oZil7dmFyIGc9ZC5ydWxlc1tmXTtpZighZyl7ZC5hZGRSdWxlcyhmKX19KTtpZighZC5ydWxlcy5mb250KXtkLmFkZFJ1bGVzKCJmb250W2ZhY2V8c2l6ZXxjb2xvcnxzdHlsZV0iKX1hLmVhY2goYy5zcGxpdCgiLCIpLGZ1bmN0aW9uKGYpe3ZhciBoPWQucnVsZXNbZl0sZztpZihoKXthLmVhY2goaC5hdHRyaWJzLGZ1bmN0aW9uKGosaSl7aWYoaS5uYW1lPT0iYWxpZ24iKXtnPXRydWU7cmV0dXJuIGZhbHNlfX0pO2lmKCFnKXtoLmF0dHJpYnMucHVzaCh7bmFtZToiYWxpZ24ifSl9fX0pO2Iub25Ob2RlQ2hhbmdlLmFkZChmdW5jdGlvbihnLGspe3ZhciBqLGYsaCxpO2Y9Zy5kb20uZ2V0UGFyZW50KGcuc2VsZWN0aW9uLmdldE5vZGUoKSwiZm9udCIpO2lmKGYpe2g9Zi5mYWNlO2k9Zi5zaXplfWlmKGo9ay5nZXQoImZvbnRzZWxlY3QiKSl7ai5zZWxlY3QoZnVuY3Rpb24obCl7cmV0dXJuIGw9PWh9KX1pZihqPWsuZ2V0KCJmb250c2l6ZXNlbGVjdCIpKXtqLnNlbGVjdChmdW5jdGlvbihtKXt2YXIgbD1hLmluQXJyYXkoZSxtLmZvbnRTaXplKTtyZXR1cm4gbCsxPT1pfSl9fSl9KX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiTGVnYWN5T3V0cHV0IixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9sZWdhY3lvdXRwdXQiLHZlcnNpb246YS5tYWpvclZlcnNpb24rIi4iK2EubWlub3JWZXJzaW9ufX19KTthLlBsdWdpbk1hbmFnZXIuYWRkKCJsZWdhY3lvdXRwdXQiLGEucGx1Z2lucy5MZWdhY3lPdXRwdXQpfSkodGlueW1jZSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/legacyoutput/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICoNCiAqIFRoaXMgcGx1Z2luIHdpbGwgZm9yY2UgVGlueU1DRSB0byBwcm9kdWNlIGRlcHJlY2F0ZWQgbGVnYWN5IG91dHB1dCBzdWNoIGFzIGZvbnQgZWxlbWVudHMsIHUgZWxlbWVudHMsIGFsaWduDQogKiBhdHRyaWJ1dGVzIGFuZCBzbyBmb3J0aC4gVGhlcmUgYXJlIGEgZmV3IGNhc2VzIHdoZXJlIHRoZXNlIG9sZCBpdGVtcyBtaWdodCBiZSBuZWVkZWQgZm9yIGV4YW1wbGUgaW4gZW1haWwgYXBwbGljYXRpb25zIG9yIHdpdGggRmxhc2gNCiAqDQogKiBIb3dldmVyIHlvdSBzaG91bGQgTk9UIHVzZSB0aGlzIHBsdWdpbiBpZiB5b3UgYXJlIGJ1aWxkaW5nIHNvbWUgc3lzdGVtIHRoYXQgcHJvZHVjZXMgd2ViIGNvbnRlbnRzIHN1Y2ggYXMgYSBDTVMuIEFsbCB0aGVzZSBlbGVtZW50cyBhcmUNCiAqIG5vdCBhcGFydCBvZiB0aGUgbmV3ZXIgc3BlY2lmaWNhdGlvbnMgZm9yIEhUTUwgYW5kIFhIVE1MLg0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gT3ZlcnJpZGUgaW5saW5lX3N0eWxlcyBzZXR0aW5nIHRvIGZvcmNlIFRpbnlNQ0UgdG8gcHJvZHVjZSBkZXByZWNhdGVkIGNvbnRlbnRzDQoJdGlueW1jZS5vbkFkZEVkaXRvci5hZGRUb1RvcChmdW5jdGlvbih0aW55bWNlLCBlZGl0b3IpIHsNCgkJZWRpdG9yLnNldHRpbmdzLmlubGluZV9zdHlsZXMgPSBmYWxzZTsNCgl9KTsNCg0KCS8vIENyZWF0ZSB0aGUgbGVnYWN5IG91cHV0IHBsdWdpbg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnBsdWdpbnMuTGVnYWN5T3V0cHV0Jywgew0KCQlpbml0IDogZnVuY3Rpb24oZWRpdG9yKSB7DQoJCQllZGl0b3Iub25Jbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCQl2YXIgYWxpZ25FbGVtZW50cyA9ICdwLGgxLGgyLGgzLGg0LGg1LGg2LHRkLHRoLGRpdix1bCxvbCxsaSx0YWJsZSxpbWcnLA0KCQkJCQlmb250U2l6ZXMgPSB0aW55bWNlLmV4cGxvZGUoZWRpdG9yLnNldHRpbmdzLmZvbnRfc2l6ZV9zdHlsZV92YWx1ZXMpLA0KCQkJCQlzZXJpYWxpemVyID0gZWRpdG9yLnNlcmlhbGl6ZXI7DQoNCgkJCQkvLyBPdmVycmlkZSBzb21lIGludGVybmFsIGZvcm1hdHMgdG8gcHJvZHVjZSBsZWdhY3kgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMNCgkJCQllZGl0b3IuZm9ybWF0dGVyLnJlZ2lzdGVyKHsNCgkJCQkJLy8gQ2hhbmdlIGFsaWdubWVudCBmb3JtYXRzIHRvIHVzZSB0aGUgZGVwcmVjYXRlZCBhbGlnbiBhdHRyaWJ1dGUNCgkJCQkJYWxpZ25sZWZ0IDoge3NlbGVjdG9yIDogYWxpZ25FbGVtZW50cywgYXR0cmlidXRlcyA6IHthbGlnbiA6ICdsZWZ0J319LA0KCQkJCQlhbGlnbmNlbnRlciA6IHtzZWxlY3RvciA6IGFsaWduRWxlbWVudHMsIGF0dHJpYnV0ZXMgOiB7YWxpZ24gOiAnY2VudGVyJ319LA0KCQkJCQlhbGlnbnJpZ2h0IDoge3NlbGVjdG9yIDogYWxpZ25FbGVtZW50cywgYXR0cmlidXRlcyA6IHthbGlnbiA6ICdyaWdodCd9fSwNCgkJCQkJYWxpZ25mdWxsIDoge3NlbGVjdG9yIDogYWxpZ25FbGVtZW50cywgYXR0cmlidXRlcyA6IHthbGlnbiA6ICdmdWxsJ319LA0KDQoJCQkJCS8vIENoYW5nZSB0aGUgYmFzaWMgZm9ybWF0dGluZyBlbGVtZW50cyB0byB1c2UgZGVwcmVjYXRlZCBlbGVtZW50IHR5cGVzDQoJCQkJCWJvbGQgOiB7aW5saW5lIDogJ2InfSwNCgkJCQkJaXRhbGljIDoge2lubGluZSA6ICdpJ30sDQoJCQkJCXVuZGVybGluZSA6IHtpbmxpbmUgOiAndSd9LA0KCQkJCQlzdHJpa2V0aHJvdWdoIDoge2lubGluZSA6ICdzdHJpa2UnfSwNCg0KCQkJCQkvLyBDaGFuZ2UgZm9udCBzaXplIGFuZCBmb250IGZhbWlseSB0byB1c2UgdGhlIGRlcHJlY2F0ZWQgZm9udCBlbGVtZW50DQoJCQkJCWZvbnRuYW1lIDoge2lubGluZSA6ICdmb250JywgYXR0cmlidXRlcyA6IHtmYWNlIDogJyV2YWx1ZSd9fSwNCgkJCQkJZm9udHNpemUgOiB7DQoJCQkJCQlpbmxpbmUgOiAnZm9udCcsDQoJCQkJCQlhdHRyaWJ1dGVzIDogew0KCQkJCQkJCXNpemUgOiBmdW5jdGlvbih2YXJzKSB7DQoJCQkJCQkJCXJldHVybiB0aW55bWNlLmluQXJyYXkoZm9udFNpemVzLCB2YXJzLnZhbHVlKSArIDE7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9LA0KDQoJCQkJCS8vIFNldHVwIGZvbnQgZWxlbWVudHMgZm9yIGNvbG9ycyBhcyB3ZWxsDQoJCQkJCWZvcmVjb2xvciA6IHtpbmxpbmUgOiAnZm9udCcsIHN0eWxlcyA6IHtjb2xvciA6ICcldmFsdWUnfX0sDQoJCQkJCWhpbGl0ZWNvbG9yIDoge2lubGluZSA6ICdmb250Jywgc3R5bGVzIDoge2JhY2tncm91bmRDb2xvciA6ICcldmFsdWUnfX0NCgkJCQl9KTsNCg0KCQkJCS8vIEZvcmNlIHBhcnNpbmcgb2YgdGhlIHNlcmlhbGl6ZXIgcnVsZXMNCgkJCQlzZXJpYWxpemVyLl9zZXR1cCgpOw0KDQoJCQkJLy8gQ2hlY2sgdGhhdCBkZXByZWNhdGVkIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGlmIG5vdCBhZGQgdGhlbQ0KCQkJCXRpbnltY2UuZWFjaCgnYixpLHUsc3RyaWtlJy5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7DQoJCQkJCXZhciBydWxlID0gc2VyaWFsaXplci5ydWxlc1tuYW1lXTsNCg0KCQkJCQlpZiAoIXJ1bGUpDQoJCQkJCQlzZXJpYWxpemVyLmFkZFJ1bGVzKG5hbWUpOw0KCQkJCX0pOw0KDQoJCQkJLy8gQWRkIGZvbnQgZWxlbWVudCBpZiBpdCdzIG1pc3NpbmcNCgkJCQlpZiAoIXNlcmlhbGl6ZXIucnVsZXNbImZvbnQiXSkNCgkJCQkJc2VyaWFsaXplci5hZGRSdWxlcygiZm9udFtmYWNlfHNpemV8Y29sb3J8c3R5bGVdIik7DQoNCgkJCQkvLyBBZGQgdGhlIG1pc3NpbmcgYW5kIGRlcHJlYWN0ZWQgYWxpZ24gYXR0cmlidXRlIGZvciB0aGUgc2VyaWFsaXphdGlvbiBlbmdpbmUNCgkJCQl0aW55bWNlLmVhY2goYWxpZ25FbGVtZW50cy5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7DQoJCQkJCXZhciBydWxlID0gc2VyaWFsaXplci5ydWxlc1tuYW1lXSwgZm91bmQ7DQoNCgkJCQkJaWYgKHJ1bGUpIHsNCgkJCQkJCXRpbnltY2UuZWFjaChydWxlLmF0dHJpYnMsIGZ1bmN0aW9uKG5hbWUsIGF0dHIpIHsNCgkJCQkJCQlpZiAoYXR0ci5uYW1lID09ICdhbGlnbicpIHsNCgkJCQkJCQkJZm91bmQgPSB0cnVlOw0KCQkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQkJfQ0KCQkJCQkJfSk7DQoNCgkJCQkJCWlmICghZm91bmQpDQoJCQkJCQkJcnVsZS5hdHRyaWJzLnB1c2goe25hbWUgOiAnYWxpZ24nfSk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCS8vIExpc3RlbiBmb3IgdGhlIG9uTm9kZUNoYW5nZSBldmVudCBzbyB0aGF0IHdlIGNhbiBkbyBzcGVjaWFsIGxvZ2ljIGZvciB0aGUgZm9udCBzaXplIGFuZCBmb250IG5hbWUgZHJvcCBib3hlcw0KCQkJCWVkaXRvci5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKGVkaXRvciwgY29udHJvbF9tYW5hZ2VyKSB7DQoJCQkJCXZhciBjb250cm9sLCBmb250RWxtLCBmb250TmFtZSwgZm9udFNpemU7DQoNCgkJCQkJLy8gRmluZCBmb250IGVsZW1lbnQgZ2V0IGl0J3MgbmFtZSBhbmQgc2l6ZQ0KCQkJCQlmb250RWxtID0gZWRpdG9yLmRvbS5nZXRQYXJlbnQoZWRpdG9yLnNlbGVjdGlvbi5nZXROb2RlKCksICdmb250Jyk7DQoJCQkJCWlmIChmb250RWxtKSB7DQoJCQkJCQlmb250TmFtZSA9IGZvbnRFbG0uZmFjZTsNCgkJCQkJCWZvbnRTaXplID0gZm9udEVsbS5zaXplOw0KCQkJCQl9DQoNCgkJCQkJLy8gU2VsZWN0L3Vuc2VsZWN0IHRoZSBmb250IG5hbWUgaW4gZHJvcGxpc3QNCgkJCQkJaWYgKGNvbnRyb2wgPSBjb250cm9sX21hbmFnZXIuZ2V0KCdmb250c2VsZWN0JykpIHsNCgkJCQkJCWNvbnRyb2wuc2VsZWN0KGZ1bmN0aW9uKHZhbHVlKSB7DQoJCQkJCQkJcmV0dXJuIHZhbHVlID09IGZvbnROYW1lOw0KCQkJCQkJfSk7DQoJCQkJCX0NCg0KCQkJCQkvLyBTZWxlY3QvdW5zZWxlY3QgdGhlIGZvbnQgc2l6ZSBpbiBkcm9wbGlzdA0KCQkJCQlpZiAoY29udHJvbCA9IGNvbnRyb2xfbWFuYWdlci5nZXQoJ2ZvbnRzaXplc2VsZWN0JykpIHsNCgkJCQkJCWNvbnRyb2wuc2VsZWN0KGZ1bmN0aW9uKHZhbHVlKSB7DQoJCQkJCQkJdmFyIGluZGV4ID0gdGlueW1jZS5pbkFycmF5KGZvbnRTaXplcywgdmFsdWUuZm9udFNpemUpOw0KDQoJCQkJCQkJcmV0dXJuIGluZGV4ICsgMSA9PSBmb250U2l6ZTsNCgkJCQkJCX0pOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9KTsNCgkJfSwNCg0KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gew0KCQkJCWxvbmduYW1lIDogJ0xlZ2FjeU91dHB1dCcsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbScsDQoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvbGVnYWN5b3V0cHV0JywNCgkJCQl2ZXJzaW9uIDogdGlueW1jZS5tYWpvclZlcnNpb24gKyAiLiIgKyB0aW55bWNlLm1pbm9yVmVyc2lvbg0KCQkJfTsNCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnbGVnYWN5b3V0cHV0JywgdGlueW1jZS5wbHVnaW5zLkxlZ2FjeU91dHB1dCk7DQp9KSh0aW55bWNlKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/css/content.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Lm1jZUl0ZW1GbGFzaCwgLm1jZUl0ZW1TaG9ja1dhdmUsIC5tY2VJdGVtUXVpY2tUaW1lLCAubWNlSXRlbVdpbmRvd3NNZWRpYSwgLm1jZUl0ZW1SZWFsTWVkaWEge2JvcmRlcjoxcHggZG90dGVkICNjYzAwMDA7IGJhY2tncm91bmQtcG9zaXRpb246Y2VudGVyOyBiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7IGJhY2tncm91bmQtY29sb3I6I2ZmZmZjYzt9Ci5tY2VJdGVtU2hvY2tXYXZlIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1nL3Nob2Nrd2F2ZS5naWYpO30KLm1jZUl0ZW1GbGFzaCB7YmFja2dyb3VuZC1pbWFnZTp1cmwoLi4vaW1nL2ZsYXNoLmdpZik7fQoubWNlSXRlbVF1aWNrVGltZSB7YmFja2dyb3VuZC1pbWFnZTp1cmwoLi4vaW1nL3F1aWNrdGltZS5naWYpO30KLm1jZUl0ZW1XaW5kb3dzTWVkaWEge2JhY2tncm91bmQtaW1hZ2U6dXJsKC4uL2ltZy93aW5kb3dzbWVkaWEuZ2lmKTt9Ci5tY2VJdGVtUmVhbE1lZGlhIHtiYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWcvcmVhbG1lZGlhLmdpZik7fQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/css/media.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[I2lkLCAjbmFtZSwgI2hzcGFjZSwgI3ZzcGFjZSwgI2NsYXNzX25hbWUsICNhbGlnbiB7CXdpZHRoOiAxMDBweCB9CiNoc3BhY2UsICN2c3BhY2UgeyB3aWR0aDogNTBweCB9CiNmbGFzaF9xdWFsaXR5LCAjZmxhc2hfYWxpZ24sICNmbGFzaF9zY2FsZSwgI2ZsYXNoX3NhbGlnbiwgI2ZsYXNoX3dtb2RlIHsgd2lkdGg6IDEwMHB4IH0KI2ZsYXNoX2Jhc2UsICNmbGFzaF9mbGFzaHZhcnMgeyB3aWR0aDogMjQwcHggfQojd2lkdGgsICNoZWlnaHQgeyB3aWR0aDogNDBweCB9CiNzcmMsICNtZWRpYV90eXBlIHsgd2lkdGg6IDI1MHB4IH0KI2NsYXNzIHsgd2lkdGg6IDEyMHB4IH0KI3ByZXYgeyBtYXJnaW46IDA7IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyB3aWR0aDogMzgwcHg7IGhlaWdodDogMjMwcHg7IG92ZXJmbG93OiBhdXRvIH0KLnBhbmVsX3dyYXBwZXIgZGl2LmN1cnJlbnQgeyBoZWlnaHQ6IDM5MHB4OyBvdmVyZmxvdzogYXV0byB9CiNmbGFzaF9vcHRpb25zLCAjc2hvY2t3YXZlX29wdGlvbnMsICNxdF9vcHRpb25zLCAjd21wX29wdGlvbnMsICNybXBfb3B0aW9ucyB7IGRpc3BsYXk6IG5vbmUgfQoubWNlQWRkU2VsZWN0VmFsdWUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjREREREREIH0KI3F0X3N0YXJ0dGltZSwgI3F0X2VuZHRpbWUsICNxdF9mb3YsICNxdF9ocmVmLCAjcXRfbW92ZWlkLCAjcXRfbW92aWVuYW1lLCAjcXRfbm9kZSwgI3F0X3BhbiwgI3F0X3F0c3JjLCAjcXRfcXRzcmNjaG9rZXNwZWVkLCAjcXRfdGFyZ2V0LCAjcXRfdGlsdCwgI3F0X3VybHN1YnN0aXR1dGVuLCAjcXRfdm9sdW1lIHsgd2lkdGg6IDcwcHggfQojd21wX2JhbGFuY2UsICN3bXBfYmFzZXVybCwgI3dtcF9jYXB0aW9uaW5naWQsICN3bXBfY3VycmVudG1hcmtlciwgI3dtcF9jdXJyZW50cG9zaXRpb24sICN3bXBfZGVmYXVsdGZyYW1lLCAjd21wX3BsYXljb3VudCwgI3dtcF9yYXRlLCAjd21wX3VpbW9kZSwgI3dtcF92b2x1bWUgeyB3aWR0aDogNzBweCB9CiNybXBfY29uc29sZSwgI3JtcF9udW1sb29wLCAjcm1wX2NvbnRyb2xzLCAjcm1wX3NjcmlwdGNhbGxiYWNrcyB7IHdpZHRoOiA3MHB4IH0KI3Nob2Nrd2F2ZV9zd3ZvbHVtZSwgI3Nob2Nrd2F2ZV9zd2ZyYW1lLCAjc2hvY2t3YXZlX3N3dXJsLCAjc2hvY2t3YXZlX3N3c3RyZXRjaHZhbGlnbiwgI3Nob2Nrd2F2ZV9zd3N0cmV0Y2hoYWxpZ24sICNzaG9ja3dhdmVfc3dzdHJldGNoc3R5bGUgeyB3aWR0aDogOTBweCB9CiNxdF9xdHNyYyB7IHdpZHRoOiAyMDBweCB9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dmFyIGE9dGlueW1jZS5lYWNoO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnBsdWdpbnMuTWVkaWFQbHVnaW4iLHtpbml0OmZ1bmN0aW9uKGIsYyl7dmFyIGU9dGhpcztlLmVkaXRvcj1iO2UudXJsPWM7ZnVuY3Rpb24gZihnKXtyZXR1cm4vXihtY2VJdGVtRmxhc2h8bWNlSXRlbVNob2NrV2F2ZXxtY2VJdGVtV2luZG93c01lZGlhfG1jZUl0ZW1RdWlja1RpbWV8bWNlSXRlbVJlYWxNZWRpYSkkLy50ZXN0KGcuY2xhc3NOYW1lKX1iLm9uUHJlSW5pdC5hZGQoZnVuY3Rpb24oKXtiLnNlcmlhbGl6ZXIuYWRkUnVsZXMoInBhcmFtW25hbWV8dmFsdWV8X21jZV92YWx1ZV0iKX0pO2IuYWRkQ29tbWFuZCgibWNlTWVkaWEiLGZ1bmN0aW9uKCl7Yi53aW5kb3dNYW5hZ2VyLm9wZW4oe2ZpbGU6YysiL21lZGlhLmh0bSIsd2lkdGg6NDMwK3BhcnNlSW50KGIuZ2V0TGFuZygibWVkaWEuZGVsdGFfd2lkdGgiLDApKSxoZWlnaHQ6NDcwK3BhcnNlSW50KGIuZ2V0TGFuZygibWVkaWEuZGVsdGFfaGVpZ2h0IiwwKSksaW5saW5lOjF9LHtwbHVnaW5fdXJsOmN9KX0pO2IuYWRkQnV0dG9uKCJtZWRpYSIse3RpdGxlOiJtZWRpYS5kZXNjIixjbWQ6Im1jZU1lZGlhIn0pO2Iub25Ob2RlQ2hhbmdlLmFkZChmdW5jdGlvbihoLGcsaSl7Zy5zZXRBY3RpdmUoIm1lZGlhIixpLm5vZGVOYW1lPT0iSU1HIiYmZihpKSl9KTtiLm9uSW5pdC5hZGQoZnVuY3Rpb24oKXt2YXIgZz17bWNlSXRlbUZsYXNoOiJmbGFzaCIsbWNlSXRlbVNob2NrV2F2ZToic2hvY2t3YXZlIixtY2VJdGVtV2luZG93c01lZGlhOiJ3aW5kb3dzbWVkaWEiLG1jZUl0ZW1RdWlja1RpbWU6InF1aWNrdGltZSIsbWNlSXRlbVJlYWxNZWRpYToicmVhbG1lZGlhIn07Yi5zZWxlY3Rpb24ub25TZXRDb250ZW50LmFkZChmdW5jdGlvbigpe2UuX3NwYW5zVG9JbWdzKGIuZ2V0Qm9keSgpKX0pO2Iuc2VsZWN0aW9uLm9uQmVmb3JlU2V0Q29udGVudC5hZGQoZS5fb2JqZWN0c1RvU3BhbnMsZSk7aWYoYi5zZXR0aW5ncy5jb250ZW50X2NzcyE9PWZhbHNlKXtiLmRvbS5sb2FkQ1NTKGMrIi9jc3MvY29udGVudC5jc3MiKX1pZihiLnRoZW1lJiZiLnRoZW1lLm9uUmVzb2x2ZU5hbWUpe2IudGhlbWUub25SZXNvbHZlTmFtZS5hZGQoZnVuY3Rpb24oaCxpKXtpZihpLm5hbWU9PSJpbWciKXthKGcsZnVuY3Rpb24obCxqKXtpZihiLmRvbS5oYXNDbGFzcyhpLm5vZGUsaikpe2kubmFtZT1sO2kudGl0bGU9Yi5kb20uZ2V0QXR0cmliKGkubm9kZSwidGl0bGUiKTtyZXR1cm4gZmFsc2V9fSl9fSl9aWYoYiYmYi5wbHVnaW5zLmNvbnRleHRtZW51KXtiLnBsdWdpbnMuY29udGV4dG1lbnUub25Db250ZXh0TWVudS5hZGQoZnVuY3Rpb24oaSxoLGope2lmKGoubm9kZU5hbWU9PSJJTUciJiYvbWNlSXRlbShGbGFzaHxTaG9ja1dhdmV8V2luZG93c01lZGlhfFF1aWNrVGltZXxSZWFsTWVkaWEpLy50ZXN0KGouY2xhc3NOYW1lKSl7aC5hZGQoe3RpdGxlOiJtZWRpYS5lZGl0IixpY29uOiJtZWRpYSIsY21kOiJtY2VNZWRpYSJ9KX19KX19KTtiLm9uQmVmb3JlU2V0Q29udGVudC5hZGQoZS5fb2JqZWN0c1RvU3BhbnMsZSk7Yi5vblNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKCl7ZS5fc3BhbnNUb0ltZ3MoYi5nZXRCb2R5KCkpfSk7Yi5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKGcsaSl7dmFyIGg9Zy5kb207aWYoaS5zZXQpe2UuX3NwYW5zVG9JbWdzKGkubm9kZSk7YShoLnNlbGVjdCgiSU1HIixpLm5vZGUpLGZ1bmN0aW9uKGspe3ZhciBqO2lmKGYoaykpe2o9ZS5fcGFyc2Uoay50aXRsZSk7aC5zZXRBdHRyaWIoaywid2lkdGgiLGguZ2V0QXR0cmliKGssIndpZHRoIixqLndpZHRofHwxMDApKTtoLnNldEF0dHJpYihrLCJoZWlnaHQiLGguZ2V0QXR0cmliKGssImhlaWdodCIsai5oZWlnaHR8fDEwMCkpfX0pfWlmKGkuZ2V0KXthKGguc2VsZWN0KCJJTUciLGkubm9kZSksZnVuY3Rpb24obSl7dmFyIGwsaixrO2lmKGcuZ2V0UGFyYW0oIm1lZGlhX3VzZV9zY3JpcHQiKSl7aWYoZihtKSl7bS5jbGFzc05hbWU9bS5jbGFzc05hbWUucmVwbGFjZSgvbWNlSXRlbS9nLCJtY2VUZW1wIil9cmV0dXJufXN3aXRjaChtLmNsYXNzTmFtZSl7Y2FzZSJtY2VJdGVtRmxhc2giOmw9ImQyN2NkYjZlLWFlNmQtMTFjZi05NmI4LTQ0NDU1MzU0MDAwMCI7aj0iaHR0cDovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9zaG9ja3dhdmUvY2Ficy9mbGFzaC9zd2ZsYXNoLmNhYiN2ZXJzaW9uPTYsMCw0MCwwIjtrPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCI7YnJlYWs7Y2FzZSJtY2VJdGVtU2hvY2tXYXZlIjpsPSIxNjZiMWJjYS0zZjljLTExY2YtODA3NS00NDQ1NTM1NDAwMDAiO2o9Imh0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZGlyZWN0b3Ivc3cuY2FiI3ZlcnNpb249OCw1LDEsMCI7az0iYXBwbGljYXRpb24veC1kaXJlY3RvciI7YnJlYWs7Y2FzZSJtY2VJdGVtV2luZG93c01lZGlhIjpsPWcuZ2V0UGFyYW0oIm1lZGlhX3dtcDZfY29tcGF0aWJsZSIpPyIwNTU4OWZhMS1jMzU2LTExY2UtYmYwMS0wMGFhMDA1NTU5NWEiOiI2YmY1MmE1Mi0zOTRhLTExZDMtYjE1My0wMGMwNGY3OWZhYTYiO2o9Imh0dHA6Ly9hY3RpdmV4Lm1pY3Jvc29mdC5jb20vYWN0aXZleC9jb250cm9scy9tcGxheWVyL2VuL25zbXAyaW5mLmNhYiNWZXJzaW9uPTUsMSw1Miw3MDEiO2s9ImFwcGxpY2F0aW9uL3gtbXBsYXllcjIiO2JyZWFrO2Nhc2UibWNlSXRlbVF1aWNrVGltZSI6bD0iMDJiZjI1ZDUtOGMxNy00YjIzLWJjODAtZDM0ODhhYmRkYzZiIjtqPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdGFjdGl2ZXgvcXRwbHVnaW4uY2FiI3ZlcnNpb249NiwwLDIsMCI7az0idmlkZW8vcXVpY2t0aW1lIjticmVhaztjYXNlIm1jZUl0ZW1SZWFsTWVkaWEiOmw9ImNmY2RhYTAzLThiZTQtMTFjZi1iODRiLTAwMjBhZmJiY2NmYSI7aj0iaHR0cDovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9zaG9ja3dhdmUvY2Ficy9mbGFzaC9zd2ZsYXNoLmNhYiN2ZXJzaW9uPTYsMCw0MCwwIjtrPSJhdWRpby94LXBuLXJlYWxhdWRpby1wbHVnaW4iO2JyZWFrfWlmKGwpe2gucmVwbGFjZShlLl9idWlsZE9iaih7Y2xhc3NpZDpsLGNvZGViYXNlOmosdHlwZTprfSxtKSxtKX19KX19KTtiLm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKGcsaCl7aC5jb250ZW50PWguY29udGVudC5yZXBsYWNlKC9fbWNlX3ZhbHVlPS9nLCJ2YWx1ZT0iKX0pO2Z1bmN0aW9uIGQoZyxoKXtoPW5ldyBSZWdFeHAoaCsnPSIoW14iXSspIicsImciKS5leGVjKGcpO3JldHVybiBoP2IuZG9tLmRlY29kZShoWzFdKToiIn1iLm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKGcsaCl7aWYoZy5nZXRQYXJhbSgibWVkaWFfdXNlX3NjcmlwdCIpKXtoLmNvbnRlbnQ9aC5jb250ZW50LnJlcGxhY2UoLzxpbWdbXj5dKz4vZyxmdW5jdGlvbihqKXt2YXIgaT1kKGosImNsYXNzIik7aWYoL14obWNlVGVtcEZsYXNofG1jZVRlbXBTaG9ja1dhdmV8bWNlVGVtcFdpbmRvd3NNZWRpYXxtY2VUZW1wUXVpY2tUaW1lfG1jZVRlbXBSZWFsTWVkaWEpJC8udGVzdChpKSl7YXQ9ZS5fcGFyc2UoZChqLCJ0aXRsZSIpKTthdC53aWR0aD1kKGosIndpZHRoIik7YXQuaGVpZ2h0PWQoaiwiaGVpZ2h0Iik7aj0nPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPndyaXRlJytpLnN1YnN0cmluZyg3KSsiKHsiK2UuX3NlcmlhbGl6ZShhdCkrIn0pOzxcL3NjcmlwdD4ifXJldHVybiBqfSl9fSl9LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6Ik1lZGlhIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9tZWRpYSIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fSxfb2JqZWN0c1RvU3BhbnM6ZnVuY3Rpb24oYixlKXt2YXIgYz10aGlzLGQ9ZS5jb250ZW50O2Q9ZC5yZXBsYWNlKC88c2NyaXB0W14+XSo+XHMqd3JpdGUoRmxhc2h8U2hvY2tXYXZlfFdpbmRvd3NNZWRpYXxRdWlja1RpbWV8UmVhbE1lZGlhKVwoXHsoW15cKV0qKVx9XCk7XHMqPFwvc2NyaXB0Pi9naSxmdW5jdGlvbihnLGYsaSl7dmFyIGg9Yy5fcGFyc2UoaSk7cmV0dXJuJzxpbWcgY2xhc3M9Im1jZUl0ZW0nK2YrJyIgdGl0bGU9IicrYi5kb20uZW5jb2RlKGkpKyciIHNyYz0iJytjLnVybCsnL2ltZy90cmFucy5naWYiIHdpZHRoPSInK2gud2lkdGgrJyIgaGVpZ2h0PSInK2guaGVpZ2h0KyciIC8+J30pO2Q9ZC5yZXBsYWNlKC88b2JqZWN0KFtePl0qKT4vZ2ksJzxzcGFuIGNsYXNzPSJtY2VJdGVtT2JqZWN0IiAkMT4nKTtkPWQucmVwbGFjZSgvPGVtYmVkKFtePl0qKVwvPz4vZ2ksJzxzcGFuIGNsYXNzPSJtY2VJdGVtRW1iZWQiICQxPjwvc3Bhbj4nKTtkPWQucmVwbGFjZSgvPGVtYmVkKFtePl0qKT4vZ2ksJzxzcGFuIGNsYXNzPSJtY2VJdGVtRW1iZWQiICQxPicpO2Q9ZC5yZXBsYWNlKC88XC8ob2JqZWN0KShbXj5dKik+L2dpLCI8L3NwYW4+Iik7ZD1kLnJlcGxhY2UoLzxcL2VtYmVkPi9naSwiIik7ZD1kLnJlcGxhY2UoLzxwYXJhbShbXj5dKik+L2dpLGZ1bmN0aW9uKGcsZil7cmV0dXJuIjxzcGFuICIrZi5yZXBsYWNlKC92YWx1ZT0vZ2ksIl9tY2VfdmFsdWU9IikrJyBjbGFzcz0ibWNlSXRlbVBhcmFtIj48L3NwYW4+J30pO2Q9ZC5yZXBsYWNlKC9cLyBjbGFzcz1cIm1jZUl0ZW1QYXJhbVwiPjxcL3NwYW4+L2dpLCdjbGFzcz0ibWNlSXRlbVBhcmFtIj48L3NwYW4+Jyk7ZS5jb250ZW50PWR9LF9idWlsZE9iajpmdW5jdGlvbihnLGgpe3ZhciBkLGM9dGhpcy5lZGl0b3IsZj1jLmRvbSxlPXRoaXMuX3BhcnNlKGgudGl0bGUpLGI7Yj1jLmdldFBhcmFtKCJtZWRpYV9zdHJpY3QiLHRydWUpJiZnLnR5cGU9PSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCI7ZS53aWR0aD1nLndpZHRoPWYuZ2V0QXR0cmliKGgsIndpZHRoIil8fDEwMDtlLmhlaWdodD1nLmhlaWdodD1mLmdldEF0dHJpYihoLCJoZWlnaHQiKXx8MTAwO2lmKGUuc3JjKXtlLnNyYz1jLmNvbnZlcnRVUkwoZS5zcmMsInNyYyIsaCl9aWYoYil7ZD1mLmNyZWF0ZSgic3BhbiIse2lkOmUuaWQsX21jZV9uYW1lOiJvYmplY3QiLHR5cGU6ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIixkYXRhOmUuc3JjLHN0eWxlOmYuZ2V0QXR0cmliKGgsInN0eWxlIiksd2lkdGg6Zy53aWR0aCxoZWlnaHQ6Zy5oZWlnaHR9KX1lbHNle2Q9Zi5jcmVhdGUoInNwYW4iLHtpZDplLmlkLF9tY2VfbmFtZToib2JqZWN0IixjbGFzc2lkOiJjbHNpZDoiK2cuY2xhc3NpZCxzdHlsZTpmLmdldEF0dHJpYihoLCJzdHlsZSIpLGNvZGViYXNlOmcuY29kZWJhc2Usd2lkdGg6Zy53aWR0aCxoZWlnaHQ6Zy5oZWlnaHR9KX1hKGUsZnVuY3Rpb24oaixpKXtpZighL14od2lkdGh8aGVpZ2h0fGNvZGViYXNlfGNsYXNzaWR8aWR8X2N4fF9jeSkkLy50ZXN0KGkpKXtpZihnLnR5cGU9PSJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyIiYmaT09InNyYyImJiFlLnVybCl7aT0idXJsIn1pZihqKXtmLmFkZChkLCJzcGFuIix7X21jZV9uYW1lOiJwYXJhbSIsbmFtZTppLF9tY2VfdmFsdWU6an0pfX19KTtpZighYil7Zi5hZGQoZCwic3BhbiIsdGlueW1jZS5leHRlbmQoe19tY2VfbmFtZToiZW1iZWQiLHR5cGU6Zy50eXBlLHN0eWxlOmYuZ2V0QXR0cmliKGgsInN0eWxlIil9LGUpKX1yZXR1cm4gZH0sX3NwYW5zVG9JbWdzOmZ1bmN0aW9uKGUpe3ZhciBkPXRoaXMsZj1kLmVkaXRvci5kb20sYixjO2EoZi5zZWxlY3QoInNwYW4iLGUpLGZ1bmN0aW9uKGcpe2lmKGYuZ2V0QXR0cmliKGcsImNsYXNzIik9PSJtY2VJdGVtT2JqZWN0Iil7Yz1mLmdldEF0dHJpYihnLCJjbGFzc2lkIikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccysvZywiIik7c3dpdGNoKGMpe2Nhc2UiY2xzaWQ6ZDI3Y2RiNmUtYWU2ZC0xMWNmLTk2YjgtNDQ0NTUzNTQwMDAwIjpmLnJlcGxhY2UoZC5fY3JlYXRlSW1nKCJtY2VJdGVtRmxhc2giLGcpLGcpO2JyZWFrO2Nhc2UiY2xzaWQ6MTY2YjFiY2EtM2Y5Yy0xMWNmLTgwNzUtNDQ0NTUzNTQwMDAwIjpmLnJlcGxhY2UoZC5fY3JlYXRlSW1nKCJtY2VJdGVtU2hvY2tXYXZlIixnKSxnKTticmVhaztjYXNlImNsc2lkOjZiZjUyYTUyLTM5NGEtMTFkMy1iMTUzLTAwYzA0Zjc5ZmFhNiI6Y2FzZSJjbHNpZDoyMmQ2ZjMxMi1iMGY2LTExZDAtOTRhYi0wMDgwYzc0YzdlOTUiOmNhc2UiY2xzaWQ6MDU1ODlmYTEtYzM1Ni0xMWNlLWJmMDEtMDBhYTAwNTU1OTVhIjpmLnJlcGxhY2UoZC5fY3JlYXRlSW1nKCJtY2VJdGVtV2luZG93c01lZGlhIixnKSxnKTticmVhaztjYXNlImNsc2lkOjAyYmYyNWQ1LThjMTctNGIyMy1iYzgwLWQzNDg4YWJkZGM2YiI6Zi5yZXBsYWNlKGQuX2NyZWF0ZUltZygibWNlSXRlbVF1aWNrVGltZSIsZyksZyk7YnJlYWs7Y2FzZSJjbHNpZDpjZmNkYWEwMy04YmU0LTExY2YtYjg0Yi0wMDIwYWZiYmNjZmEiOmYucmVwbGFjZShkLl9jcmVhdGVJbWcoIm1jZUl0ZW1SZWFsTWVkaWEiLGcpLGcpO2JyZWFrO2RlZmF1bHQ6Zi5yZXBsYWNlKGQuX2NyZWF0ZUltZygibWNlSXRlbUZsYXNoIixnKSxnKX1yZXR1cm59aWYoZi5nZXRBdHRyaWIoZywiY2xhc3MiKT09Im1jZUl0ZW1FbWJlZCIpe3N3aXRjaChmLmdldEF0dHJpYihnLCJ0eXBlIikpe2Nhc2UiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giOmYucmVwbGFjZShkLl9jcmVhdGVJbWcoIm1jZUl0ZW1GbGFzaCIsZyksZyk7YnJlYWs7Y2FzZSJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIjpmLnJlcGxhY2UoZC5fY3JlYXRlSW1nKCJtY2VJdGVtU2hvY2tXYXZlIixnKSxnKTticmVhaztjYXNlImFwcGxpY2F0aW9uL3gtbXBsYXllcjIiOmYucmVwbGFjZShkLl9jcmVhdGVJbWcoIm1jZUl0ZW1XaW5kb3dzTWVkaWEiLGcpLGcpO2JyZWFrO2Nhc2UidmlkZW8vcXVpY2t0aW1lIjpmLnJlcGxhY2UoZC5fY3JlYXRlSW1nKCJtY2VJdGVtUXVpY2tUaW1lIixnKSxnKTticmVhaztjYXNlImF1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbiI6Zi5yZXBsYWNlKGQuX2NyZWF0ZUltZygibWNlSXRlbVJlYWxNZWRpYSIsZyksZyk7YnJlYWs7ZGVmYXVsdDpmLnJlcGxhY2UoZC5fY3JlYXRlSW1nKCJtY2VJdGVtRmxhc2giLGcpLGcpfX19KX0sX2NyZWF0ZUltZzpmdW5jdGlvbihjLGgpe3ZhciBiLGc9dGhpcy5lZGl0b3IuZG9tLGY9e30sZT0iIixkO2Q9WyJpZCIsIm5hbWUiLCJ3aWR0aCIsImhlaWdodCIsImJnY29sb3IiLCJhbGlnbiIsImZsYXNodmFycyIsInNyYyIsIndtb2RlIiwiYWxsb3dmdWxsc2NyZWVuIiwicXVhbGl0eSIsImRhdGEiXTtiPWcuY3JlYXRlKCJpbWciLHtzcmM6dGhpcy51cmwrIi9pbWcvdHJhbnMuZ2lmIix3aWR0aDpnLmdldEF0dHJpYihoLCJ3aWR0aCIpfHwxMDAsaGVpZ2h0OmcuZ2V0QXR0cmliKGgsImhlaWdodCIpfHwxMDAsc3R5bGU6Zy5nZXRBdHRyaWIoaCwic3R5bGUiKSwiY2xhc3MiOmN9KTthKGQsZnVuY3Rpb24oaSl7dmFyIGo9Zy5nZXRBdHRyaWIoaCxpKTtpZihqKXtmW2ldPWp9fSk7YShnLnNlbGVjdCgic3BhbiIsaCksZnVuY3Rpb24oaSl7aWYoZy5oYXNDbGFzcyhpLCJtY2VJdGVtUGFyYW0iKSl7ZltnLmdldEF0dHJpYihpLCJuYW1lIildPWcuZ2V0QXR0cmliKGksIl9tY2VfdmFsdWUiKX19KTtpZihmLm1vdmllKXtmLnNyYz1mLm1vdmllO2RlbGV0ZSBmLm1vdmllfWlmKCFmLnNyYyl7Zi5zcmM9Zi5kYXRhO2RlbGV0ZSBmLmRhdGF9aD1nLnNlbGVjdCgiLm1jZUl0ZW1FbWJlZCIsaClbMF07aWYoaCl7YShkLGZ1bmN0aW9uKGkpe3ZhciBqPWcuZ2V0QXR0cmliKGgsaSk7aWYoaiYmIWZbaV0pe2ZbaV09an19KX1kZWxldGUgZi53aWR0aDtkZWxldGUgZi5oZWlnaHQ7Yi50aXRsZT10aGlzLl9zZXJpYWxpemUoZik7cmV0dXJuIGJ9LF9wYXJzZTpmdW5jdGlvbihiKXtyZXR1cm4gdGlueW1jZS51dGlsLkpTT04ucGFyc2UoInsiK2IrIn0iKX0sX3NlcmlhbGl6ZTpmdW5jdGlvbihiKXtyZXR1cm4gdGlueW1jZS51dGlsLkpTT04uc2VyaWFsaXplKGIpLnJlcGxhY2UoL1t7fV0vZywiIil9fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgibWVkaWEiLHRpbnltY2UucGx1Z2lucy5NZWRpYVBsdWdpbil9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgZWFjaCA9IHRpbnltY2UuZWFjaDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnBsdWdpbnMuTWVkaWFQbHVnaW4nLCB7DQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoJCQkNCgkJCXQuZWRpdG9yID0gZWQ7DQoJCQl0LnVybCA9IHVybDsNCg0KCQkJZnVuY3Rpb24gaXNNZWRpYUVsbShuKSB7DQoJCQkJcmV0dXJuIC9eKG1jZUl0ZW1GbGFzaHxtY2VJdGVtU2hvY2tXYXZlfG1jZUl0ZW1XaW5kb3dzTWVkaWF8bWNlSXRlbVF1aWNrVGltZXxtY2VJdGVtUmVhbE1lZGlhKSQvLnRlc3Qobi5jbGFzc05hbWUpOw0KCQkJfTsNCg0KCQkJZWQub25QcmVJbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCQkvLyBGb3JjZSBpbiBfdmFsdWUgcGFyYW1ldGVyIHRoaXMgZXh0cmEgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGZvciBvbGRlciBPcGVyYSB2ZXJzaW9ucw0KCQkJCWVkLnNlcmlhbGl6ZXIuYWRkUnVsZXMoJ3BhcmFtW25hbWV8dmFsdWV8X21jZV92YWx1ZV0nKTsNCgkJCX0pOw0KDQoJCQkvLyBSZWdpc3RlciBjb21tYW5kcw0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlTWVkaWEnLCBmdW5jdGlvbigpIHsNCgkJCQllZC53aW5kb3dNYW5hZ2VyLm9wZW4oew0KCQkJCQlmaWxlIDogdXJsICsgJy9tZWRpYS5odG0nLA0KCQkJCQl3aWR0aCA6IDQzMCArIHBhcnNlSW50KGVkLmdldExhbmcoJ21lZGlhLmRlbHRhX3dpZHRoJywgMCkpLA0KCQkJCQloZWlnaHQgOiA0NzAgKyBwYXJzZUludChlZC5nZXRMYW5nKCdtZWRpYS5kZWx0YV9oZWlnaHQnLCAwKSksDQoJCQkJCWlubGluZSA6IDENCgkJCQl9LCB7DQoJCQkJCXBsdWdpbl91cmwgOiB1cmwNCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQkvLyBSZWdpc3RlciBidXR0b25zDQoJCQllZC5hZGRCdXR0b24oJ21lZGlhJywge3RpdGxlIDogJ21lZGlhLmRlc2MnLCBjbWQgOiAnbWNlTWVkaWEnfSk7DQoNCgkJCWVkLm9uTm9kZUNoYW5nZS5hZGQoZnVuY3Rpb24oZWQsIGNtLCBuKSB7DQoJCQkJY20uc2V0QWN0aXZlKCdtZWRpYScsIG4ubm9kZU5hbWUgPT0gJ0lNRycgJiYgaXNNZWRpYUVsbShuKSk7DQoJCQl9KTsNCg0KCQkJZWQub25Jbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCQl2YXIgbG8gPSB7DQoJCQkJCW1jZUl0ZW1GbGFzaCA6ICdmbGFzaCcsDQoJCQkJCW1jZUl0ZW1TaG9ja1dhdmUgOiAnc2hvY2t3YXZlJywNCgkJCQkJbWNlSXRlbVdpbmRvd3NNZWRpYSA6ICd3aW5kb3dzbWVkaWEnLA0KCQkJCQltY2VJdGVtUXVpY2tUaW1lIDogJ3F1aWNrdGltZScsDQoJCQkJCW1jZUl0ZW1SZWFsTWVkaWEgOiAncmVhbG1lZGlhJw0KCQkJCX07DQoNCgkJCQllZC5zZWxlY3Rpb24ub25TZXRDb250ZW50LmFkZChmdW5jdGlvbigpIHsNCgkJCQkJdC5fc3BhbnNUb0ltZ3MoZWQuZ2V0Qm9keSgpKTsNCgkJCQl9KTsNCg0KCQkJCWVkLnNlbGVjdGlvbi5vbkJlZm9yZVNldENvbnRlbnQuYWRkKHQuX29iamVjdHNUb1NwYW5zLCB0KTsNCg0KCQkJCWlmIChlZC5zZXR0aW5ncy5jb250ZW50X2NzcyAhPT0gZmFsc2UpDQoJCQkJCWVkLmRvbS5sb2FkQ1NTKHVybCArICIvY3NzL2NvbnRlbnQuY3NzIik7DQoNCgkJCQlpZiAoZWQudGhlbWUgJiYgZWQudGhlbWUub25SZXNvbHZlTmFtZSkgew0KCQkJCQllZC50aGVtZS5vblJlc29sdmVOYW1lLmFkZChmdW5jdGlvbih0aCwgbykgew0KCQkJCQkJaWYgKG8ubmFtZSA9PSAnaW1nJykgew0KCQkJCQkJCWVhY2gobG8sIGZ1bmN0aW9uKHYsIGspIHsNCgkJCQkJCQkJaWYgKGVkLmRvbS5oYXNDbGFzcyhvLm5vZGUsIGspKSB7DQoJCQkJCQkJCQlvLm5hbWUgPSB2Ow0KCQkJCQkJCQkJby50aXRsZSA9IGVkLmRvbS5nZXRBdHRyaWIoby5ub2RlLCAndGl0bGUnKTsNCgkJCQkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0pOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQlpZiAoZWQgJiYgZWQucGx1Z2lucy5jb250ZXh0bWVudSkgew0KCQkJCQllZC5wbHVnaW5zLmNvbnRleHRtZW51Lm9uQ29udGV4dE1lbnUuYWRkKGZ1bmN0aW9uKHRoLCBtLCBlKSB7DQoJCQkJCQlpZiAoZS5ub2RlTmFtZSA9PSAnSU1HJyAmJiAvbWNlSXRlbShGbGFzaHxTaG9ja1dhdmV8V2luZG93c01lZGlhfFF1aWNrVGltZXxSZWFsTWVkaWEpLy50ZXN0KGUuY2xhc3NOYW1lKSkgew0KCQkJCQkJCW0uYWRkKHt0aXRsZSA6ICdtZWRpYS5lZGl0JywgaWNvbiA6ICdtZWRpYScsIGNtZCA6ICdtY2VNZWRpYSd9KTsNCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWVkLm9uQmVmb3JlU2V0Q29udGVudC5hZGQodC5fb2JqZWN0c1RvU3BhbnMsIHQpOw0KDQoJCQllZC5vblNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCXQuX3NwYW5zVG9JbWdzKGVkLmdldEJvZHkoKSk7DQoJCQl9KTsNCg0KCQkJZWQub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCXZhciBkb20gPSBlZC5kb207DQoNCgkJCQlpZiAoby5zZXQpIHsNCgkJCQkJdC5fc3BhbnNUb0ltZ3Moby5ub2RlKTsNCg0KCQkJCQllYWNoKGRvbS5zZWxlY3QoJ0lNRycsIG8ubm9kZSksIGZ1bmN0aW9uKG4pIHsNCgkJCQkJCXZhciBwOw0KDQoJCQkJCQlpZiAoaXNNZWRpYUVsbShuKSkgew0KCQkJCQkJCXAgPSB0Ll9wYXJzZShuLnRpdGxlKTsNCgkJCQkJCQlkb20uc2V0QXR0cmliKG4sICd3aWR0aCcsIGRvbS5nZXRBdHRyaWIobiwgJ3dpZHRoJywgcC53aWR0aCB8fCAxMDApKTsNCgkJCQkJCQlkb20uc2V0QXR0cmliKG4sICdoZWlnaHQnLCBkb20uZ2V0QXR0cmliKG4sICdoZWlnaHQnLCBwLmhlaWdodCB8fCAxMDApKTsNCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfQ0KDQoJCQkJaWYgKG8uZ2V0KSB7DQoJCQkJCWVhY2goZG9tLnNlbGVjdCgnSU1HJywgby5ub2RlKSwgZnVuY3Rpb24obikgew0KCQkJCQkJdmFyIGNpLCBjYiwgbXQ7DQoNCgkJCQkJCWlmIChlZC5nZXRQYXJhbSgnbWVkaWFfdXNlX3NjcmlwdCcpKSB7DQoJCQkJCQkJaWYgKGlzTWVkaWFFbG0obikpDQoJCQkJCQkJCW4uY2xhc3NOYW1lID0gbi5jbGFzc05hbWUucmVwbGFjZSgvbWNlSXRlbS9nLCAnbWNlVGVtcCcpOw0KDQoJCQkJCQkJcmV0dXJuOw0KCQkJCQkJfQ0KDQoJCQkJCQlzd2l0Y2ggKG4uY2xhc3NOYW1lKSB7DQoJCQkJCQkJY2FzZSAnbWNlSXRlbUZsYXNoJzoNCgkJCQkJCQkJY2kgPSAnZDI3Y2RiNmUtYWU2ZC0xMWNmLTk2YjgtNDQ0NTUzNTQwMDAwJzsNCgkJCQkJCQkJY2IgPSAnaHR0cDovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9zaG9ja3dhdmUvY2Ficy9mbGFzaC9zd2ZsYXNoLmNhYiN2ZXJzaW9uPTYsMCw0MCwwJzsNCgkJCQkJCQkJbXQgPSAnYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnOw0KCQkJCQkJCQlicmVhazsNCg0KCQkJCQkJCWNhc2UgJ21jZUl0ZW1TaG9ja1dhdmUnOg0KCQkJCQkJCQljaSA9ICcxNjZiMWJjYS0zZjljLTExY2YtODA3NS00NDQ1NTM1NDAwMDAnOw0KCQkJCQkJCQljYiA9ICdodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL3Nob2Nrd2F2ZS9jYWJzL2RpcmVjdG9yL3N3LmNhYiN2ZXJzaW9uPTgsNSwxLDAnOw0KCQkJCQkJCQltdCA9ICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJzsNCgkJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCQljYXNlICdtY2VJdGVtV2luZG93c01lZGlhJzoNCgkJCQkJCQkJY2kgPSBlZC5nZXRQYXJhbSgnbWVkaWFfd21wNl9jb21wYXRpYmxlJykgPyAnMDU1ODlmYTEtYzM1Ni0xMWNlLWJmMDEtMDBhYTAwNTU1OTVhJyA6ICc2YmY1MmE1Mi0zOTRhLTExZDMtYjE1My0wMGMwNGY3OWZhYTYnOw0KCQkJCQkJCQljYiA9ICdodHRwOi8vYWN0aXZleC5taWNyb3NvZnQuY29tL2FjdGl2ZXgvY29udHJvbHMvbXBsYXllci9lbi9uc21wMmluZi5jYWIjVmVyc2lvbj01LDEsNTIsNzAxJzsNCgkJCQkJCQkJbXQgPSAnYXBwbGljYXRpb24veC1tcGxheWVyMic7DQoJCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQkJY2FzZSAnbWNlSXRlbVF1aWNrVGltZSc6DQoJCQkJCQkJCWNpID0gJzAyYmYyNWQ1LThjMTctNGIyMy1iYzgwLWQzNDg4YWJkZGM2Yic7DQoJCQkJCQkJCWNiID0gJ2h0dHA6Ly93d3cuYXBwbGUuY29tL3F0YWN0aXZleC9xdHBsdWdpbi5jYWIjdmVyc2lvbj02LDAsMiwwJzsNCgkJCQkJCQkJbXQgPSAndmlkZW8vcXVpY2t0aW1lJzsNCgkJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCQljYXNlICdtY2VJdGVtUmVhbE1lZGlhJzoNCgkJCQkJCQkJY2kgPSAnY2ZjZGFhMDMtOGJlNC0xMWNmLWI4NGItMDAyMGFmYmJjY2ZhJzsNCgkJCQkJCQkJY2IgPSAnaHR0cDovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9zaG9ja3dhdmUvY2Ficy9mbGFzaC9zd2ZsYXNoLmNhYiN2ZXJzaW9uPTYsMCw0MCwwJzsNCgkJCQkJCQkJbXQgPSAnYXVkaW8veC1wbi1yZWFsYXVkaW8tcGx1Z2luJzsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQl9DQoNCgkJCQkJCWlmIChjaSkgew0KCQkJCQkJCWRvbS5yZXBsYWNlKHQuX2J1aWxkT2JqKHsNCgkJCQkJCQkJY2xhc3NpZCA6IGNpLA0KCQkJCQkJCQljb2RlYmFzZSA6IGNiLA0KCQkJCQkJCQl0eXBlIDogbXQNCgkJCQkJCQl9LCBuKSwgbik7DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQllZC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKC9fbWNlX3ZhbHVlPS9nLCAndmFsdWU9Jyk7DQoJCQl9KTsNCg0KCQkJZnVuY3Rpb24gZ2V0QXR0cihzLCBuKSB7DQoJCQkJbiA9IG5ldyBSZWdFeHAobiArICc9XCIoW15cIl0rKVwiJywgJ2cnKS5leGVjKHMpOw0KDQoJCQkJcmV0dXJuIG4gPyBlZC5kb20uZGVjb2RlKG5bMV0pIDogJyc7DQoJCQl9Ow0KDQoJCQllZC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCWlmIChlZC5nZXRQYXJhbSgnbWVkaWFfdXNlX3NjcmlwdCcpKSB7DQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKC88aW1nW14+XSs+L2csIGZ1bmN0aW9uKGltKSB7DQoJCQkJCQl2YXIgY2wgPSBnZXRBdHRyKGltLCAnY2xhc3MnKTsNCg0KCQkJCQkJaWYgKC9eKG1jZVRlbXBGbGFzaHxtY2VUZW1wU2hvY2tXYXZlfG1jZVRlbXBXaW5kb3dzTWVkaWF8bWNlVGVtcFF1aWNrVGltZXxtY2VUZW1wUmVhbE1lZGlhKSQvLnRlc3QoY2wpKSB7DQoJCQkJCQkJYXQgPSB0Ll9wYXJzZShnZXRBdHRyKGltLCAndGl0bGUnKSk7DQoJCQkJCQkJYXQud2lkdGggPSBnZXRBdHRyKGltLCAnd2lkdGgnKTsNCgkJCQkJCQlhdC5oZWlnaHQgPSBnZXRBdHRyKGltLCAnaGVpZ2h0Jyk7DQoJCQkJCQkJaW0gPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPndyaXRlJyArIGNsLnN1YnN0cmluZyg3KSArICcoeycgKyB0Ll9zZXJpYWxpemUoYXQpICsgJ30pOzwvc2NyaXB0Pic7DQoJCQkJCQl9DQoNCgkJCQkJCXJldHVybiBpbTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdNZWRpYScsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbScsDQoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvbWVkaWEnLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9LA0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KCQlfb2JqZWN0c1RvU3BhbnMgOiBmdW5jdGlvbihlZCwgbykgew0KCQkJdmFyIHQgPSB0aGlzLCBoID0gby5jb250ZW50Ow0KDQoJCQloID0gaC5yZXBsYWNlKC88c2NyaXB0W14+XSo+XHMqd3JpdGUoRmxhc2h8U2hvY2tXYXZlfFdpbmRvd3NNZWRpYXxRdWlja1RpbWV8UmVhbE1lZGlhKVwoXHsoW15cKV0qKVx9XCk7XHMqPFwvc2NyaXB0Pi9naSwgZnVuY3Rpb24oYSwgYiwgYykgew0KCQkJCXZhciBvID0gdC5fcGFyc2UoYyk7DQoNCgkJCQlyZXR1cm4gJzxpbWcgY2xhc3M9Im1jZUl0ZW0nICsgYiArICciIHRpdGxlPSInICsgZWQuZG9tLmVuY29kZShjKSArICciIHNyYz0iJyArIHQudXJsICsgJy9pbWcvdHJhbnMuZ2lmIiB3aWR0aD0iJyArIG8ud2lkdGggKyAnIiBoZWlnaHQ9IicgKyBvLmhlaWdodCArICciIC8+Jw0KCQkJfSk7DQoNCgkJCWggPSBoLnJlcGxhY2UoLzxvYmplY3QoW14+XSopPi9naSwgJzxzcGFuIGNsYXNzPSJtY2VJdGVtT2JqZWN0IiAkMT4nKTsNCgkJCWggPSBoLnJlcGxhY2UoLzxlbWJlZChbXj5dKilcLz8+L2dpLCAnPHNwYW4gY2xhc3M9Im1jZUl0ZW1FbWJlZCIgJDE+PC9zcGFuPicpOw0KCQkJaCA9IGgucmVwbGFjZSgvPGVtYmVkKFtePl0qKT4vZ2ksICc8c3BhbiBjbGFzcz0ibWNlSXRlbUVtYmVkIiAkMT4nKTsNCgkJCWggPSBoLnJlcGxhY2UoLzxcLyhvYmplY3QpKFtePl0qKT4vZ2ksICc8L3NwYW4+Jyk7DQoJCQloID0gaC5yZXBsYWNlKC88XC9lbWJlZD4vZ2ksICcnKTsNCgkJCWggPSBoLnJlcGxhY2UoLzxwYXJhbShbXj5dKik+L2dpLCBmdW5jdGlvbihhLCBiKSB7cmV0dXJuICc8c3BhbiAnICsgYi5yZXBsYWNlKC92YWx1ZT0vZ2ksICdfbWNlX3ZhbHVlPScpICsgJyBjbGFzcz0ibWNlSXRlbVBhcmFtIj48L3NwYW4+J30pOw0KCQkJaCA9IGgucmVwbGFjZSgvXC8gY2xhc3M9XCJtY2VJdGVtUGFyYW1cIj48XC9zcGFuPi9naSwgJ2NsYXNzPSJtY2VJdGVtUGFyYW0iPjwvc3Bhbj4nKTsNCg0KCQkJby5jb250ZW50ID0gaDsNCgkJfSwNCg0KCQlfYnVpbGRPYmogOiBmdW5jdGlvbihvLCBuKSB7DQoJCQl2YXIgb2IsIGVkID0gdGhpcy5lZGl0b3IsIGRvbSA9IGVkLmRvbSwgcCA9IHRoaXMuX3BhcnNlKG4udGl0bGUpLCBzdGM7DQoJCQkNCgkJCXN0YyA9IGVkLmdldFBhcmFtKCdtZWRpYV9zdHJpY3QnLCB0cnVlKSAmJiBvLnR5cGUgPT0gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJzsNCg0KCQkJcC53aWR0aCA9IG8ud2lkdGggPSBkb20uZ2V0QXR0cmliKG4sICd3aWR0aCcpIHx8IDEwMDsNCgkJCXAuaGVpZ2h0ID0gby5oZWlnaHQgPSBkb20uZ2V0QXR0cmliKG4sICdoZWlnaHQnKSB8fCAxMDA7DQoNCgkJCWlmIChwLnNyYykNCgkJCQlwLnNyYyA9IGVkLmNvbnZlcnRVUkwocC5zcmMsICdzcmMnLCBuKTsNCg0KCQkJaWYgKHN0Yykgew0KCQkJCW9iID0gZG9tLmNyZWF0ZSgnc3BhbicsIHsNCgkJCQkJaWQgOiBwLmlkLA0KCQkJCQlfbWNlX25hbWUgOiAnb2JqZWN0JywNCgkJCQkJdHlwZSA6ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsDQoJCQkJCWRhdGEgOiBwLnNyYywNCgkJCQkJc3R5bGUgOiBkb20uZ2V0QXR0cmliKG4sICdzdHlsZScpLA0KCQkJCQl3aWR0aCA6IG8ud2lkdGgsDQoJCQkJCWhlaWdodCA6IG8uaGVpZ2h0DQoJCQkJfSk7DQoJCQl9IGVsc2Ugew0KCQkJCW9iID0gZG9tLmNyZWF0ZSgnc3BhbicsIHsNCgkJCQkJaWQgOiBwLmlkLA0KCQkJCQlfbWNlX25hbWUgOiAnb2JqZWN0JywNCgkJCQkJY2xhc3NpZCA6ICJjbHNpZDoiICsgby5jbGFzc2lkLA0KCQkJCQlzdHlsZSA6IGRvbS5nZXRBdHRyaWIobiwgJ3N0eWxlJyksDQoJCQkJCWNvZGViYXNlIDogby5jb2RlYmFzZSwNCgkJCQkJd2lkdGggOiBvLndpZHRoLA0KCQkJCQloZWlnaHQgOiBvLmhlaWdodA0KCQkJCX0pOw0KCQkJfQ0KDQoJCQllYWNoIChwLCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJaWYgKCEvXih3aWR0aHxoZWlnaHR8Y29kZWJhc2V8Y2xhc3NpZHxpZHxfY3h8X2N5KSQvLnRlc3QoaykpIHsNCgkJCQkJLy8gVXNlIHVybCBpbnN0ZWFkIG9mIHNyYyBpbiBJRSBmb3IgV2luZG93cyBtZWRpYQ0KCQkJCQlpZiAoby50eXBlID09ICdhcHBsaWNhdGlvbi94LW1wbGF5ZXIyJyAmJiBrID09ICdzcmMnICYmICFwLnVybCkNCgkJCQkJCWsgPSAndXJsJzsNCg0KCQkJCQlpZiAodikNCgkJCQkJCWRvbS5hZGQob2IsICdzcGFuJywge19tY2VfbmFtZSA6ICdwYXJhbScsIG5hbWUgOiBrLCAnX21jZV92YWx1ZScgOiB2fSk7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWlmICghc3RjKQ0KCQkJCWRvbS5hZGQob2IsICdzcGFuJywgdGlueW1jZS5leHRlbmQoe19tY2VfbmFtZSA6ICdlbWJlZCcsIHR5cGUgOiBvLnR5cGUsIHN0eWxlIDogZG9tLmdldEF0dHJpYihuLCAnc3R5bGUnKX0sIHApKTsNCg0KCQkJcmV0dXJuIG9iOw0KCQl9LA0KDQoJCV9zcGFuc1RvSW1ncyA6IGZ1bmN0aW9uKHApIHsNCgkJCXZhciB0ID0gdGhpcywgZG9tID0gdC5lZGl0b3IuZG9tLCBpbSwgY2k7DQoNCgkJCWVhY2goZG9tLnNlbGVjdCgnc3BhbicsIHApLCBmdW5jdGlvbihuKSB7DQoJCQkJLy8gQ29udmVydCBvYmplY3QgaW50byBpbWFnZQ0KCQkJCWlmIChkb20uZ2V0QXR0cmliKG4sICdjbGFzcycpID09ICdtY2VJdGVtT2JqZWN0Jykgew0KCQkJCQljaSA9IGRvbS5nZXRBdHRyaWIobiwgImNsYXNzaWQiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xzKy9nLCAnJyk7DQoNCgkJCQkJc3dpdGNoIChjaSkgew0KCQkJCQkJY2FzZSAnY2xzaWQ6ZDI3Y2RiNmUtYWU2ZC0xMWNmLTk2YjgtNDQ0NTUzNTQwMDAwJzoNCgkJCQkJCQlkb20ucmVwbGFjZSh0Ll9jcmVhdGVJbWcoJ21jZUl0ZW1GbGFzaCcsIG4pLCBuKTsNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJY2FzZSAnY2xzaWQ6MTY2YjFiY2EtM2Y5Yy0xMWNmLTgwNzUtNDQ0NTUzNTQwMDAwJzoNCgkJCQkJCQlkb20ucmVwbGFjZSh0Ll9jcmVhdGVJbWcoJ21jZUl0ZW1TaG9ja1dhdmUnLCBuKSwgbik7DQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWNhc2UgJ2Nsc2lkOjZiZjUyYTUyLTM5NGEtMTFkMy1iMTUzLTAwYzA0Zjc5ZmFhNic6DQoJCQkJCQljYXNlICdjbHNpZDoyMmQ2ZjMxMi1iMGY2LTExZDAtOTRhYi0wMDgwYzc0YzdlOTUnOg0KCQkJCQkJY2FzZSAnY2xzaWQ6MDU1ODlmYTEtYzM1Ni0xMWNlLWJmMDEtMDBhYTAwNTU1OTVhJzoNCgkJCQkJCQlkb20ucmVwbGFjZSh0Ll9jcmVhdGVJbWcoJ21jZUl0ZW1XaW5kb3dzTWVkaWEnLCBuKSwgbik7DQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWNhc2UgJ2Nsc2lkOjAyYmYyNWQ1LThjMTctNGIyMy1iYzgwLWQzNDg4YWJkZGM2Yic6DQoJCQkJCQkJZG9tLnJlcGxhY2UodC5fY3JlYXRlSW1nKCdtY2VJdGVtUXVpY2tUaW1lJywgbiksIG4pOw0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQljYXNlICdjbHNpZDpjZmNkYWEwMy04YmU0LTExY2YtYjg0Yi0wMDIwYWZiYmNjZmEnOg0KCQkJCQkJCWRvbS5yZXBsYWNlKHQuX2NyZWF0ZUltZygnbWNlSXRlbVJlYWxNZWRpYScsIG4pLCBuKTsNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJZGVmYXVsdDoNCgkJCQkJCQlkb20ucmVwbGFjZSh0Ll9jcmVhdGVJbWcoJ21jZUl0ZW1GbGFzaCcsIG4pLCBuKTsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCg0KCQkJCS8vIENvbnZlcnQgZW1iZWQgaW50byBpbWFnZQ0KCQkJCWlmIChkb20uZ2V0QXR0cmliKG4sICdjbGFzcycpID09ICdtY2VJdGVtRW1iZWQnKSB7DQoJCQkJCXN3aXRjaCAoZG9tLmdldEF0dHJpYihuLCAndHlwZScpKSB7DQoJCQkJCQljYXNlICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCc6DQoJCQkJCQkJZG9tLnJlcGxhY2UodC5fY3JlYXRlSW1nKCdtY2VJdGVtRmxhc2gnLCBuKSwgbik7DQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWNhc2UgJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InOg0KCQkJCQkJCWRvbS5yZXBsYWNlKHQuX2NyZWF0ZUltZygnbWNlSXRlbVNob2NrV2F2ZScsIG4pLCBuKTsNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJY2FzZSAnYXBwbGljYXRpb24veC1tcGxheWVyMic6DQoJCQkJCQkJZG9tLnJlcGxhY2UodC5fY3JlYXRlSW1nKCdtY2VJdGVtV2luZG93c01lZGlhJywgbiksIG4pOw0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQljYXNlICd2aWRlby9xdWlja3RpbWUnOg0KCQkJCQkJCWRvbS5yZXBsYWNlKHQuX2NyZWF0ZUltZygnbWNlSXRlbVF1aWNrVGltZScsIG4pLCBuKTsNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJY2FzZSAnYXVkaW8veC1wbi1yZWFsYXVkaW8tcGx1Z2luJzoNCgkJCQkJCQlkb20ucmVwbGFjZSh0Ll9jcmVhdGVJbWcoJ21jZUl0ZW1SZWFsTWVkaWEnLCBuKSwgbik7DQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWRlZmF1bHQ6DQoJCQkJCQkJZG9tLnJlcGxhY2UodC5fY3JlYXRlSW1nKCdtY2VJdGVtRmxhc2gnLCBuKSwgbik7DQoJCQkJCX0NCgkJCQl9CQkJDQoJCQl9KTsNCgkJfSwNCg0KCQlfY3JlYXRlSW1nIDogZnVuY3Rpb24oY2wsIG4pIHsNCgkJCXZhciBpbSwgZG9tID0gdGhpcy5lZGl0b3IuZG9tLCBwYSA9IHt9LCB0aSA9ICcnLCBhcmdzOw0KDQoJCQlhcmdzID0gWydpZCcsICduYW1lJywgJ3dpZHRoJywgJ2hlaWdodCcsICdiZ2NvbG9yJywgJ2FsaWduJywgJ2ZsYXNodmFycycsICdzcmMnLCAnd21vZGUnLCAnYWxsb3dmdWxsc2NyZWVuJywgJ3F1YWxpdHknLCAnZGF0YSddOwkNCg0KCQkJLy8gQ3JlYXRlIGltYWdlDQoJCQlpbSA9IGRvbS5jcmVhdGUoJ2ltZycsIHsNCgkJCQlzcmMgOiB0aGlzLnVybCArICcvaW1nL3RyYW5zLmdpZicsDQoJCQkJd2lkdGggOiBkb20uZ2V0QXR0cmliKG4sICd3aWR0aCcpIHx8IDEwMCwNCgkJCQloZWlnaHQgOiBkb20uZ2V0QXR0cmliKG4sICdoZWlnaHQnKSB8fCAxMDAsDQoJCQkJc3R5bGUgOiBkb20uZ2V0QXR0cmliKG4sICdzdHlsZScpLA0KCQkJCSdjbGFzcycgOiBjbA0KCQkJfSk7DQoNCgkJCS8vIFNldHVwIGJhc2UgcGFyYW1ldGVycw0KCQkJZWFjaChhcmdzLCBmdW5jdGlvbihuYSkgew0KCQkJCXZhciB2ID0gZG9tLmdldEF0dHJpYihuLCBuYSk7DQoNCgkJCQlpZiAodikNCgkJCQkJcGFbbmFdID0gdjsNCgkJCX0pOw0KDQoJCQkvLyBBZGQgb3B0aW9uYWwgcGFyYW1ldGVycw0KCQkJZWFjaChkb20uc2VsZWN0KCdzcGFuJywgbiksIGZ1bmN0aW9uKG4pIHsNCgkJCQlpZiAoZG9tLmhhc0NsYXNzKG4sICdtY2VJdGVtUGFyYW0nKSkNCgkJCQkJcGFbZG9tLmdldEF0dHJpYihuLCAnbmFtZScpXSA9IGRvbS5nZXRBdHRyaWIobiwgJ19tY2VfdmFsdWUnKTsNCgkJCX0pOw0KDQoJCQkvLyBVc2Ugc3JjIG5vdCBtb3ZpZQ0KCQkJaWYgKHBhLm1vdmllKSB7DQoJCQkJcGEuc3JjID0gcGEubW92aWU7DQoJCQkJZGVsZXRlIHBhLm1vdmllOw0KCQkJfQ0KDQoJCQkvLyBObyBzcmMgdHJ5IGRhdGENCgkJCWlmICghcGEuc3JjKSB7DQoJCQkJcGEuc3JjID0gcGEuZGF0YTsNCgkJCQlkZWxldGUgcGEuZGF0YTsNCgkJCX0NCg0KCQkJLy8gTWVyZ2Ugd2l0aCBlbWJlZCBhcmdzDQoJCQluID0gZG9tLnNlbGVjdCgnLm1jZUl0ZW1FbWJlZCcsIG4pWzBdOw0KCQkJaWYgKG4pIHsNCgkJCQllYWNoKGFyZ3MsIGZ1bmN0aW9uKG5hKSB7DQoJCQkJCXZhciB2ID0gZG9tLmdldEF0dHJpYihuLCBuYSk7DQoNCgkJCQkJaWYgKHYgJiYgIXBhW25hXSkNCgkJCQkJCXBhW25hXSA9IHY7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWRlbGV0ZSBwYS53aWR0aDsNCgkJCWRlbGV0ZSBwYS5oZWlnaHQ7DQoNCgkJCWltLnRpdGxlID0gdGhpcy5fc2VyaWFsaXplKHBhKTsNCg0KCQkJcmV0dXJuIGltOw0KCQl9LA0KDQoJCV9wYXJzZSA6IGZ1bmN0aW9uKHMpIHsNCgkJCXJldHVybiB0aW55bWNlLnV0aWwuSlNPTi5wYXJzZSgneycgKyBzICsgJ30nKTsNCgkJfSwNCg0KCQlfc2VyaWFsaXplIDogZnVuY3Rpb24obykgew0KCQkJcmV0dXJuIHRpbnltY2UudXRpbC5KU09OLnNlcmlhbGl6ZShvKS5yZXBsYWNlKC9be31dL2csICcnKTsNCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnbWVkaWEnLCB0aW55bWNlLnBsdWdpbnMuTWVkaWFQbHVnaW4pOw0KfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/img/flash.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFAAUAMMJAAIoSm6KosnP2VZqeu3u8a63wxVcf93f5IKPnf39/Qc4Wp2osLfD0mp9joqbrwAAACH5BAEAAA8ALAAAAAAUABQAAASe8MlJq704P7LaGM1CaITgNE5RnI4wWgTTFMJhC0XHvJTQ1ISgAAAwyAQVQutASCQICoXBcDDxHoUG05lwSAO2w4yCAHKLBpqNgaD8DlwGIKog3Bru2plev5MFNVVzDU5hAm0TNIBDUQV2YSoUBy0NcwqEgVUOBxUMHQoADSVhBA0MFgc5Lg+kpQWcqAybTU+TDLAYOA4ICClIGsDBwREAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/img/flv_player.swf</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q1dTCMBhAAB4nL18CVxTxxPwviSEcB9yiQEBLw5FDk/OgIqIGhDxqPUgkADRkNAQEK1FvOpV76pFqqLWerdaalutFqy1ar213hdqrbZqq7Wtf2uVb3b3veTlwL/t9/0//fF4b3dmdnZmdmb2YEuQcxVCyxBqKUC9PRD86yVoampKFraF12X2CA02KApVSLrMC6HSfIVGNVCnVCGk1Q3GHygTNXm6ASSDRIx4TKlCWwofAjTZU0gKZZMdupKC8c8ci5u2+9c+iGHQFdxKkwCRf/ebUEJJkEKjLtQmhuSrtAaVPiQpoXNJEqoXQ5OoPQPYh6PekyFnoX1vlV6v06N6BFSQEA1HKYgRITt09OhRVFBQgMaPH48WLVqEPvzwQxTlPfDk+8o+QcOX/KnL6L+o1qGD4N4PuxsLl/zlubv3R0oHP6btjOyRsZsi06ravu/08eJ7U1Zl3s34yXPXwra5osWLvKbkZV7cG5zzY0txGuoX5pHu0/Z5zenFPxQJ+jXsfhr5RcsfXkz/aFFENfLu3r/LrA+cPCuP/dRP34Vp2zhq0vKRzr9NTh2WvvTolDao7cLwLOnh5ILfP9jljxaXRH7V/yPxhOQ1ER9k/ChbVOWZ0Tvbbkr2pwk9/wtEQXG/ZnkQAIfBOQnhy17OKWpycAeJikAvb4vFDAgQybAmHDbB0w65o9m4VIS8K8dUyaBqkdiOQQfGOu60OzDWKeNZFpOOcPE8XDz9MEINyGsqD/LbpU8ynhHI7EZEIN/BxUcwoGOKu8wc8Nulf+60y0Jf8EgewVjelUEWjRPIIUGUJEL1HsQsRAJg2f+QKBJpdAqlWluIGBlKFn6fgtCsoZLrrNmOVysNRahIpS4sMqDCMjUaU4EGKqBIryvTKlGRWqlUafvi8gkoX6XWoFKDQm+YgMawKKVFuvFZGsUEjbrUkFpmMOi0pGgwNxBKUanKUKqeqEJjytWl6jwN22SOulilUWtVKK8QjaFMGLgi/IJKofUSljAy6EpQns6A9LRNIFes0pahshKlwqAykjKNPq0OPotVBsUwQhm/pVN+CzTlSF2Mez6mgsBDx+hv0rF+pKpQZUidYFCV5ugMCg1S6sow2wSL0iOvLEHMo6JQoYZ+TyjO07ECwqVY5IQ0Jx+o0qsUxSolAieQhxsYAJqBzzxTYxgRSpRleoVBDcLE30UqhRIY18HAjkJxyKCqMKDOIBMD7jlSlBl0g3GbKCoqLiqqM3kidalcIUflaqVKl6UoKwWS4xVqQ5pOj5tEY0t7KTSaPEX+OFSg1qhyJpSoUEWxBiwFBF2qUo0zij6LdqSfSRkper1iAtKotIUgiXyNOn+csX8YhLQ2FLdLPkvwJ9Jps1UalQLe9CoiHwoA9paSb1CXq5BGUWoYqAPQgTr4AqtTEZurKMZlqBzEml+k0Baqhuo0ZdBntVZtAKJ9sDNM0yuKWd1jHKWqQFGmMbCAYHxlJYPBXgZie4GvwcU6naEIqwaPCqpubnwU6gy6FK1yMLY2bT6Sqwy9dFqtKp8oIp++4tLBRI1IYTAo8otoT/LKCgpUetxAKnkjmgFby9Fh4RBJAL8DwQ57KwwKNFZRrijN16tLDHEARLQX2gF16Ag/YYhaEKEA9AzAWVCfNIxtlE9+kSp/HO4s5hxK1GwR6c4ArjesEbM2RhUxRg/dR4PJ2AbinJS0SmJjaugkSEGhmUBUo1UXE1UY5Yc/TMYMwxzzQCNOkaFYk4MNE0SGDZTAG3SFhRpVWplGA51VqbQohxQEmUqCQtNA9UVBPTtGdYzu0bFbVJBOH1QEA0ulD+OT6mdQFRP9ZGYORmmacsyFSh9UHhQdGdUxKG8CtG8oievcWacrjSzWVahV+eAGIvN1xZ1RflmpQVeMCZSikrJS7A3YrqSWqTWGflpapVSXYi2BLgzYf+iLYTAWAJ+DKecwTMDWQKXALftRivpqdOPTaEWp0a7oGzWLNLUhyKALGqbWKnXjUW/iSIKwOFEmuDK1VqGhX9QqgyiSGvcVP8YYQJ6gbz0ao9CUFClAYxqkVtJBZ1QKjC2dRpOJwdjXMoNpwMFHKVAl9KLIM5o8Y5CitATbM/6I5ayrt268FkRjyIFRisaUKPSQblB/zrWmV+UPHzgA4R9ISHR61TAAxwOc+BXAKFXhOmyYICZ9qaFXkVqjRMWKcSrqOMiI5BsJKTBaVT4ZargzKq0CpAW9xQTkJJTAiNOr88rAqJEWD/oyvQYZisqK87QKLjKR2KEsKwERgSLJ2OilUZdQeRKkTp3iOnWiaIiEDc6xsQ69rARaAH+iB1Ea2QL1aXFxia6UrcKqVkKOZwZWXDoO92egAn5jlzaUhrxeMN4MSAEDZTwak1+mx2ItoG6LFz5RQmrSYJ1ePyE4oXNqUkJqdhLYliouCIoRLgnS6gxBBXjoRqLxeuhQHzLyDPoycDUKDYxuGg/ZvDNvLFYvNgQSfhVK5QBoRKUldpIFfrgUFYOgs7gAo9QrCrHp4ELiIEgpoGErB73jcvJaWpYHgQwG9wDdeJW+F/bqWN1Y7fPdTY4YIadw1NFlmQBJIDmGJyOfCamqr6lAgAuEvpBDi4T2DzHCMjtkj9NeF6gQkQqBvYyxqLAjJITSZS5IIhIj9p/Izgng7QEYSewIeXF2Jv5lL/VcKUA9kQlJIhKKRHxIh2ynTLZahCSO+Dd8SeSZ1QLUkUMUE0S2zknutMwB2abiTBoEPOD5NFQDy46EZRepJ65xITX1XA200YGU7G0WdrONmlYcX/B0lS9zQhI3oywyMbPuIoHI0SnABOUhx73zFAkyTWUtaJnEXcor9CKFIhMIPEXk6S7ti/nBDfXlIXj/N4REIwIVzmRz5nnI3jxkfomnnBCSWrTs80+QJQQZ5D383zZv2XEfK8Ebq3yNkuVsl4/o99Lalv9NnowRwV/KB3U1geLxAJDpZFjZHBj+nE2LRAQ0vxlQJ2Tsn6RVoq9pTPkgGAPGOjBQBhuzB0+4TnJSil+lpCCg3wCMGYx8gW2RQBIoLSQF7rRAKGKcMFhraSEuHcXgjyAplVUgtVH66QQw3KcD9MK+ArPX2ihOF9wTEWN6tyEAiiqyr8U1geaoNsCDpVAuCbFXcoqmBW1MBW2ly8Ch9fMkXWoNXeKLLpjQapeNm4EZOyI9LEcsIVMfglnJ/ZOeBPN7Qgl4yl/WH9DTSpFJLe2pWmJNauGQnal+Wlrqx1SPq8MsFGWstdCYVTlfdf9cY81A/XM1KJtXw7+Vvm2hhwo5AeNIJrEQKi5z8GUFLEAslL0vfTfBiAmeROSQjplvi1jRwGh2Aqdvz5c6dve4XR6MJ9eiSGyEJKi42FoxQf/CHs30FPQK9vjv1HaJ4XsWXNKBU+RLRiqIYwji27414iFLxEMsopQDExFZZ5q+PE1ftLcgX0G65wCg7Yt8TTVOck7n6SSO1yJqER1sWEQozyJCCXYHnkV0kJpgbFlEsKVFBFtbRLBtiwi2tIj//x4K/wrj5y1GO7KqcjLaKK8qnI2hRkDzFs0ALZixoiIxo+LUPJXmZMJRNMkw7F/IMIwvw7D/2aiKJ5YRYSb7YL7sI8xkz1kDNqoIa1R2WBjLzO0qwkxXEc3rKuJluoow01VE87qKaEZXHBWTfiL+hX4i+PqJeBX98HXRMdF3vo/lkiZCduHoggjT7US8lySSIHcmXaDvUXIX5wAMEc2H8CIQMVJcJ+DysU6sOjuRL5p8YhwXZ9s9oljRLFb0P8KKNUtio60S62hjYs1HeSWbNvYQ4BKIbs3BumQb004jKNEeBna2JkrnpQTCEcrT2ZkXsN9VxPSltMhc1KpW0JfigvNlJN36Eqffl05eBbzpFBh9d5FI0oP0taeUpu5xUhIdnGl06MmOUyjxQmbI0FB3STxBiZZa8O6QzSkjnY7wFpQaDzAhkdZIaE2i1Owzic4mq0kkTZaSKldaJSMtpPQjAH5omrfFsmUfrTI0DBFeU5tHDELL3E1WTlmiSumVjacLrRkzFMA4T0j2JiV9yDNNzk16nIj0Q4n0k+yYABaSmxIZO903EdOexTKHcUJMOFb8UOgRiHWyEPHdSIX5AE1P5Cm1H9FLhqQ/nYUkS18uJCDf7f+CPHX2bnLcyFSedXAjkz9RZJ30/3wQ2lOd21OdDyACiERd6JIOTmIkA4lirtiBYgrpJM+sw3JweF7ma1AIicLRF8haDulGOTQ3387k9aoT208nHjPuUhduqDgbx6wAHKSz0Z3Rge6EN2q5BthR5YTYIR4DE1N2iDpgd2FuzvO9LVbPEBKGo894/aGrCZlW6wtZPI4teSgkbiKAY4GPxoVKmkraIexCkpoHM0mgGRfogJ0cKR8EynGm+ywQg9SoNZktZrenUhscR5QeZEsdNnUU0bziOpE1FE9bVdHNVDUzgnLoCBpi8n3QCzOIoRbfwyhGHHWC6TYMj4bxDLl5S8Mt6OCxC+CJ2LsQFQDOa1ZdJhAoYJkz5Y6yaGwOniOybbgAbPouSPK6qbWRsoBlEsQq6nUCPCqbMBCJP7nOj5YFsBGQK6Fp8hjaSq6pnBqwgpbnWZbnZ/MiqXK+Cz62YDcWiXR5Y9FNBse2QIhtjDwAv7aGVwF9jYHXGDnhIUb60lBNF4VjpDTINh+khf8tDJOVZKtaYV+KCzz1BOOlYVrYN8CW8QSZWZfRs7cjpFQwCyeesoA8W9OPQvIsWsHQWKjmJ9ze1DuqpfyVMhoYCwhJNdRlBLAwRAjEVTqwlTHSAGt80jk37EwlamMhB2dvGWNp2KP1wTZsEnzFYLkx96Crd2Pbg7BwhaSVNJO3it6SsDUAU6NOhtjoOIlGmjnfg7ejipAgDBkIqbamvIbODqzHBfUPPLFzQ6itqTt0llGc7Wu7Gyy3WuCjpY29UPDDYegKzkSI+7OcAOmybc6KXJyNViXg51ivNIvSElF1MM6csMQkocbZUsArisKGiQabAVAFxvnWeJjvrSM0BVlmVv42cjGa+0S8LEuzlaa8JBLzHFdNC8szAQgtJWwlUpcbjrA3FKDmvCHrVKvJCHyp3+ScK6VNbdUB2ZmF6BKScZLYbYcsKojd8I4YgI8LQ0J88sCHoUJ+Q260Rr2M5vhO2N/gEnB1pZSJISIhb8JlHn+NmQZxQM0FYQtkg40NiixTIge+zwaGwMYs2YIANzkn1i2w4ZrF2cYCPmoZJ/L5bsYzAGS8x3PhEyiXsyiOvEzHSe6UyXcbgyXjpZnUnzABQIw79UGIDbBJrDl8FMBTaYVFcJ6QiFnlDjQQVzAfUULlcvpbIjfbYQQlSEgxqaJCzjQrss6IWTrWMmQb6sfumBiplMt5g9fFdKYDsct3A7sQOxpAB4pF7jwR+uTL3wUGpsMRU1xaCJMwjPYmkdwkEZM53896zx1c4Fj0gTnJt2Rcz+0Y/F9SSZYzJtvb4doqGd15JbXwI5lCaqfyakVGXMTWTuPVQvx1wyubIpGdPT76CIF4OjGOGdm+1H2/ja3RxcQRQMzM9q1xNp77wJKZFvySox5j8jQK7ThU42198gShMiIXuvM8i7Q8m+gkGdlysojIb5ZkDi/6Wc9fwJsEIj74bCuPDXMCbg+dQRLQUT4+jrCQ7OuWGQyIioZE98ZkjETXd6FWRD/s+B8iX85O6aIvfAjpB2jOF0txrkggEmMpi+zBN2FWJO+QPs8jfZ4/mDXkeRjWOK9OxWbC2+On5kRY9USgFIxg7FZqJgQbs7NUCKcjAm7PYYFkIcRhb4vDV6BQiMECnMsukiyWLJG8SzqVyhMA/ccLuhiAZDvpZJWAbnYuhdFI+rKMXVgRigTyTBv1y8n04T3zGGUBU21rB5cPAy8r2DVMC9SM+XhDGTsrL9adrDAN/5pEX1s47xtxWrA4yzGO5D26NWGr9ZWWNFYZafiaaJh3FERIeiKiT0EWkSlY64YXmMJCYs4BiG0Nnqs5YZgnv/ytFT547cvA21uBr3kZ+For8HW2wf1tpRwU4wOjSCbSqC8psveGghBMosjei7w60LEC8lqfTRO5nsj3FaA/pDGMPOkGO+DT5S7zqENyT7OzWXQYqZXoBDKf05M+RyOTMuhcZSFEsmrsTugHE2A1W7XnVh360QUnDCiVBFjPZYyr1WaA7ZsBFFoCrrUGNGVT0FfsAfjnwhBqz2nQXGv8UxYZkgpwDP7mhwqpjPJ0kGn1wSREjA1fO5S/OMYR2yC1bRfzvYwHkihxfE6sF3Zjko0mkpvo9HgjGVyb7ZhM09cWyVYgbVrg2Uia3ZaN47TxiBuUMywKPD8yDf2PKa8b48kvyxXMQrr4iptxpgqW9OZN4qA4j8XpLZVz/p3OHtTmFSJawRdTtkXqs93ie4fFd0fKqg8h+wkR61IgT/1MneUAtAEGb5/agcR9eSf8GOQQjiRafA77HJmk9jFFjgBrRw+xXyCSSHbKqZyIu19FHBtbKBKwp0iIr/uMwH0uNy7tcUVpcuM+KFf0hZwGU17RLjmNoryi3fKZ3KEykK8HZgcHTxGEUSFJYFItnGj/Jm6gG4/uGQe6B/NSgVo7sOaEyjRXazOwQXVvEcM3HxFj23rY8lcwngn/r4zD2+KMJ0zhwtBpoRkWPJdaicfcVriVXG5EEUuRCrABCSE6CsnqP/Z4llTh+SU7t3LEWSU+8iTAQiSTErrjTWUDTp7XpsmgBJI9dB9GJDaHZgc1a1RCmAfSpQ5H4gz3Gm1NwG3kiERksUIg+cKMCFETW7PbrEbEq1khEmZSajZNiY8mYLmyI1zZCemakw8JQ3Z0yiqQfEVEUJxNJ7LmwcmXPZdQb9USKbZlglD80pyoL86JCNh/TYMkGGol/PzzZEeYRWwFxumJ50BH0mCu7QCT2e2jaVwNHuN44ctsfeFrNoHjg5qx7Uq1RmXJ4AmxOTxJ3fjYqyywBebY5t1gMfdbs9gE/2yxuP8fsrjfjMX9/45F0MQ3vMDbyvLcNPWLSrUeLUCmpg/I+dsVtJjM8/kDl0y8bQxlTpPElzn3zTThf8NCf0Pr+FWDJd9KeZ8H7Mi82Or8Nlkc2GuxOMCxY7lEwFWSQ5QMn2uyXGCG2+yygFUFGXxxiM8ryrRsi792YHWIwNvir45AheFohcgkzYOmVvniPZTt+3KJGzfVuePbppQMn5PDMrde3jfu3Bp3xV+GzQFbkyHaNkUBEZNu9LMihpYD4GHiAkWkLpAnRJ5pmB2fNZaaLa/TlXubJm4mRXIITJhJtx08MVGjZQglDXQlP6x5Og1kV4SHx5e+Ez6K4kCHHselM59p9vwNOzelZd/RIzBmZfttlJl3mJhcN9743GeM3eY+ke/NRpC11GwbWIyV3zxilDo31zNb9LUgS0NEg5Qenguk+54iI+dOxlBHcgBL3ve/lPf9zfC+3wbv+1+ddyNZM/sGPKu/ahDzQGgm1szfN7DH/IfxjLj5U94rbYwZdpveaBj2+GjSXETPMca/EtmZLyVLDlvxBrNITEaxwBrDfKSzSQ1ZDJYcFokCYL5m9ncwJADt4ji0NZ30YWeAE6S8PpoWASb9bxcBfPiLABYTVUia8eqY2V/KIbzNYcX7USkviPLyK3s6NaRbGTbXPKxQcKHNHfbmdmmsC/NM23StyOT0GBSRnYXjplM1JxK5o/wcrMS0XCAgW8pchTv+03hJLpk/4SUNRwKYCyB0t9OeyOJkP9Pahz3d55GwH7T/qVZgqXywVBbMhYCd4oG58FdSXNiTQslW1JL51JJZagutwBbywRayYHFWjcbxG41jGx3CCoUdzXiLCMoyuDp2S6iQHjPBQhtCCrh62/u+Q0xLBtWWeC5IctpkkGfoMsdpwuz3NJF0t1ryzmRhOE3TYX2Wfx6BHqo5ZxxkrcyJnE9kl/HHSc6ze8b8M4cZZl+rzGheMNJ0YFOvcXG8XNMi67TeWGuWp4smni6a8WTE5nHGL1tlo5V/w2U/fvpuIfV0Vup8SFP27so/YHTJEpQk7nzEVbYRLyda5uw2V9D4/v+VWHA1Y8H137Bg4QaNha/Kgo8ZCz7/jAV6ns62XvqzzUTwYfxMQ9piySRzmSeSyExb5zheYG8q4Bb9cIGTcWmC1lwhIfFqdgL+xd+h90WsM+YG4jWyyRSEXrpSsz3RFzU54L6L8ZUi8Lte7ArPbiIMxLAXHiS74ZMx9vBTiyoIDL7sor0Yio4haAKRyxHqyZsEFaFWVQhlAXZ9fT1yd9nWgOw/SW+12fXbRu0F9qIMB+6iDAm9KKPebh48HdFwjCeDSpiqAmrRrM6Fp4o+rnL4VeYSPHHc90kHZk9ajWa2++31QT8OVB6tyujaQjKyRtkY2+5SNzTgAnqvOiYvV6hscCmffea19d9VDWzPjBs38/ezPl86/b71x+QNkcuzah1OVgn+XOJ0fNTJqs5Lqjqv6NTiBteet6x/9yuv69Z36q6uYhl1ooziMMTe6BEPT2fcOXKHSiQDfbkQ4NsXupyLJZZXCDUtcI0QkJEaydyF3AUPVL44be9mDzQA2nQHRJNXHpS7oDE3B1+fnWkSBJOAZAyeuTPtxqLawqY1Xfpc/F11r1H85vWmPmtX91mHrndounbkUtiRS11CBYYgtHvU+3tGozVjJKRTWIp9p+279nC7btbwHjncRSWuXLdc+N1ye7VuudrsFk6BujkBDYA2u8miHnUkY6WEXIfjLhMQYZ8/fx4FeTWEFV1sPCSeMzWh84bpjdKo3GHTgjgePTgbcWdtBOG/4fREI5ZkTwv6FCoxCXfvsVnK8Tl+gQ+mAe+oNUC0AI4jZUjykEH37t0DiLkLUaDXm2vn99BGzjgExH0AyAvw38HEW6BjUdpZj0tIE8mSnvD0xiY85T9V72DxMzCY3F2QR6BPrx1fSGNnKhe2ltC2m5qxbR9Ott6cbHGpr6XFQyPYO2ShBLzSRGSC79bBncJsRwU4p864/5p2j+h1h6+de4dcnSWJjspMOzbXxbtL5NWKorYh36SsWZhVFLb74cnthjmtpue++ZmzqN+6grXzzqWtn9dK0OozJic6aG6fgXNdWrE8tOR48GM581wOPsYfTWfcQGNapUKvDIrqPqZrd1BxIIpCKagUbUGHkBdTwKxjGplOghGCzwUiYTuhu0ujYCuaFIgeZNlPlwV8hmVU67jdfocsYDO6v92+uAoKDtgNZx5lCT9pCOyGykOF3za4HkAVF5gLtW6tULwXc7PWXlWVkIPB51QFLMMkbk5dG/PW8PcrQpl78W2+bkC5Cd4G5lIt4E38BMONrUroiB5sB7zEQkzys4ZAGJfurkzKMFngATRpHSofLjxXAvXxGmjH9TIm2gBs3M8ClqDNy7mUhxu5QCu+I/0uvyDcJ3M9iwkekLkeQeUbgWfaD2iQ9HF9FfAMtG5Dr9/0Ym7l2s+o4npKyLrZofgc3DVvBGQJyxUbmYu5QLZiOG7mCG6GiOdhFhYF/iZdrgGKOUzj+3fmgRCU0Jaqipkg29QAQuW4/u0doAQMJISgR9sxEVyFke9MBSVA4SzhKRnmNQTzOpVwlmU/twGECt/A6WdGTi/VAqcJeRj5+JnezMO6NgdkbqLjCRpk97NgAxYfyNQH895Yi0XEqgn6BiIrxiK714NyAN3YKQuYAy1gYt/Z1vUNd0BK9EIVe3APsGwI2+q1aFLHQwC/L3ZBK8SUfnoKVby2CFqaWgj4gj+YUVVEim5OCBRJ+k6Vd4QaECgWbMRMykR5nEAntegBgvr66AJvxJQwQ3HlThmYCtU86QaoMA9bCdfNnw9RpT/cDhLAgtvO2TR84l5ivVSgTcaPeA1CnVAk6gwDJRrFoFjUBXVF3VB31ANmhnEIKcHJhMJ/L6iMgfEUY/HfS4Ka/4/QZM8FCA9OmWDXKhyrm5KFgrE4dqCpvYRsGX5bNR+hv5PwGxNnXWsOZ/lmC87W24YV+G1KqnCyQxi8tEKF94Ps70sa5kX7Q0owc+bMJjahCEVmdwnVAygCtz142Y9ukgbOY8tHRF/dnhu/2dkZJTt0AYAAZOcBLqfiUn6u34vGZNcdTW3vNmVOuTK548+SR7OjhaOuy6pTto7Z6PHh9/Mvr3FEbgejT9BsIxD852bwn0yvAHRRhmhW1qJhc8k6qXehy0nW77Xm/F4g53sDEM5bsoB5R6iLBfbdvTMQcyOrR0fXVsIpMgCJAJBgAKkwgbhEep+I/mtHbJuaAIc/lZ93kIaLb94p6D8o7Z1GaKkGEEJA26Anki3NF7sy0LSzoApHS+a9eeI0ITR6qArzIEazxGIRrcaXbwkg28OnVmZhoGBcP0fsw9YLyPVc5v/N4IPM4Z1swOMw9Ds823CikOKYjQNqJN7cORTXWYYcS+2r7iJ8i9m9uOPbacjHgoq0g14dioviQ9R3PvKQ3K70ntjVHnKFvXd3I0HNFBmt/TBsTi6ucTDWTN9Oa853PVaCqsWuTlBziDFkIecspDSvcuGqHNViPr16Mb5Dr70bhDGfqUwjd/VQvdgP8+gBsndlWPiZwYdK6J1EJKo7OArwCTA7d0glKi5tW5J4IizF6+BbHp7zDrXYNtWtNiXE/5GDu+O+jC7KuYW+w9Zmp/c+OSej0yePTqe/ezlsT31nn+BZpXeO7v3y8N5dTzat6ifvVhdbH9vU1DPW/9gT17rDyrxeEIq3DV1fWd/5j4mJa0ZG1k2RNfz96NEj73tPKhLy6i5Of1DudP6e9+iPfecduS3YcjZj6/l7lZ9ffp48NNBZXFJ/nbGvVL329pmfRJ9fnveiTc/bQ7fcHr9r5ORxH94Jv3+jBPVbnFt//cyFB+U5Z36VhjzK7+bn7HhCPC2lLOBiRYLrxftuS+cd8EvfEJvjNP9U0TcT946e4Ru+1PGPuXGLFH4/1HW5U1AXPOmd3w7eWnRualGL7E3vft3/qnb5OYfziw4+jql23np+nP+pIueKpIE7b/z9qCL9QN6g2/ErXW+/EXAi5/ebo7PHz+q9tuGNhFEHe54K8na0GzJ5U87anWluh/4+XfP2bb3D3ANTH3p8lz/wjesVCT5+bw+6d+fx09xuNfuePf/w6aCIE4+jVp9Ql0jtV6+W/vHnpKQpV8LO3SjZ+DzWf17etqHrXiwNDI1eKT+bFBJfPeAbZYz63E+GyVdaf3k1sru/y6XO37+RtHqTz+9Vb/VadnfZ46d7ro/d+eKx6yVNt+jlR/aV9Pjgqx2Bd5f/3urSg8/eS2/7t8/c20eerDt/77UNZ8Km71fM/j0r5Jqdvn744stbz46tf7prbKXgzl63OdR1tOOGf6+2fNdRW7JR6mPvUgVW84zBZ1OMVhM/9+cs94PPQxy7heSNW9O6Ic1uh0fylDk+i8dpPx10WjI1VxU8a+O24a/N/WZYmxEf1j18Pt/fu8+BusK3B+Yuf/PzS1OCg0srY5uqY08VVZ7vWFBX7TZzf+qukcsm7l31/YPyGXk7DtlPS5l7WPnXbJeKvaN3jP54yYPy/h+dj5iwd/Td5UdmbB0asWPENnFC4Imm4buu/7rk2XN5Q2PYkZieK+U/lH95o/uKwdou/gyY1KjYc0Mu7L8ha9svZNvQufefvPnJ5QdZZwpdF/2ZH43NZmZqcNePtjfsuD8mRCL49ty9rnEXirrcfCtp9ddO67MdntmtbAjrum6Qz96LmpD+hVV1tU9nKGM2PczecGZfz4AFfZVrrhXUrdF4JfrMXbIvV+Yz1+7HCQmB2Umrhz0t/3JeQtGw4T3sOx48INn/974Lk5KGdUnfNVJ+dkyoV8m5k9NOd3j/Vo9fnOJrjj28AqYyfNmQO3eePIv+s7J+0euRyzcuVfgpg7utlB9WxgSfuLPk5MqbK+UbJk5OWzdoa074hWS/7wX2Q28UDTyaef1A7xDFqZ8MY/48eKPk0M4RLndc7xy/U7fZrlzy82mpvluNywXNZ5N/qb2q9Y2tdm7pOnNj6x+Z56efvR3vdetRRQOY0H+a7v4x8RrY7qL03hkbzmSHL/W8W/moy+d9tpx98duvm58iF1//GGomHYxm0t6mmTQ5BJO4JzD6feJe2+FIM0MsZIAA9UEXwJrCjNY0eOCWlEFef/QNbdHvw/ENblEph3tXTokQ/5wobLFbmBHWRthOEd4m/6cf89c6/3q0ofuNxpDU4/FvPjm+rcOJQ5vO7rpad/7SuF/rFsifXGw3fNvQMKnrkdv6asOXo07/ZPghb0eo3bSUfXk79tyak7Q6c9P5e4adI06d+an3r0/ib1YknD6QtyZny5BT9/54cXDIm3sD946M9PK5v3nz6eeVmSfuxL7IXzF23Sn3xMATdYVHj+y6/GCZZ+rdiXvPoVWVXb2GLsiNqe4xxnFG6qWeJd1rXG7eu1fTfknYw/nDI5f7xfo5t62/fuKpflPO1xP3dbjz1U1hre/RmvfT2/ZY/enl4vtntJ+fqTiBVl7UvB0Ihn34zmP/+rNjg1vv6RXg7tSYMP8nw3eJC0dGbnja2cvxwriNzO89e0zu4h/cfonDty4ze/X0nzf2uZNIUPFnRcKnSUzF6OP2V7TdvyvI0O8aeel59bGC9dmbcp9vb+iAbh68Ff1Lxw4/1+naBS5wEk+7ceLvHivlO4duuTGq15UbJbLOj59KCyW/xbh0rTk2p/zL57ed46Su7ZYcPllZv2Dv25Wyvfe/UtddzMnb8V5R3cVrX7Vedyp011VtT8/ZCw1xA8F7Hv2xf96lqaM/bnpYevY5mrjBcxo1lXCjqYQ1Yyo4GYngInA4Yi3jFlhGR5NlnNjCDPL6c0FWt8Wawn2tc6ctnve3XVrHdwsVveqi1r+7dMbi7UuX7uzydMegZXV1D2tKomctfPZLz73VCXsLb5/76Ur1s7fuTLpzpbRs94nI42N3Ot4oGR6+/MgHlx8slm9o4z23T7Cfsx78ZMDyJ08n6feO3rDl7JxV8g4T66+fmn+wzaiOPvqdI27vHf3r5JHrz987deR2qmLKMK8Zvzx5c2LS6ket527q4u9y7dajPWO/3RM+/sur2amSUR+fXzHlw9V+MVtmxlYPCB8jIaax7lTnv8X1FzWh9+x+WX6kXZ542pTGJ8+GfJUTvnT76JObbg4O8+iZu31mxVb7C04fDsxovyScs5BeX61otWe3fc2xgo03Ju5dPCnp40evb/P5LeVZ7Itqt8q4lZv90yOXn/nd19Huftfv0SPm2ebWY1cMaD+rlevM7I4+Z/7ylYge3n9UkTupEb3o2f0/p4p66z5vpYpt98XIyAcvjhbUjdyUs71yeG0L54e3HvklHpn96OJoeVvP9/fl/qdrsnzD4E1nx1acr4qXum5UJa2+5Zwy2qfX4YK6PVe1TaXiANeZ7x9WFtVfPzi6V3Lt6PLrn17UfPeo4v3PL2p01xecKvK6ov3ca3bv9LiV7deGZmi+EvnUnLn3R+vKj3brDjS6dqBG0sloJB1fYiSRnJF04tYQtoCRdCbrM3hrtz2DIBmCDA2AhMgT53K+uFiEM7X3vpQhp+xpQcZrUdk0TgyJ1YHuaUGok8wR8RIrfGslCyIhIL0xiG8DLy3DV6jWizH/kY5ceuYytLET4sHQK1brxYEYypmDcho49SSvLY2qAMOEYBhXnHhyzPIIGS87ZVv0QL4At5sPR9JP9sZTuqLWvgXkhX4Xp/gZ7z2tF+Pbk9t7wxzE//OGNHo5LF3ebO8DibD/84ZQcllsvYc3kR2erHm+k8C7fZThbsQNh2Er3VXrZryTluGQOoKupNsa3ExXzjJkikGWSLu5gc6kSIAXf/AVufUIT3eiUC7q0Ygigrhlx3nXtlY6+Nodna98HFbdqb+/x91hp8at7JqyZKVrz9NbV7z7sIRd/IpG6cw1lGBcr3T9NWBHdKv5z3e4cctMMZzhRPMXn2K50ha0dLJDe3h2gWlcF7f7DtvnRTHokMU0zniNZJMDTHRhZsug5XhC44D2+MJM6V3Ey7ShQogrIhcjpirLvMKOq2gINa+w50h9l8CroDz3x7Ijxu5JjT0WHY691bfmIKolNzyy5ULogtdURxOv9WIXOgq6Ik9lFrn1khLEq8vdOSFEIZibiQUgq0MvfpEh55EzlKytiKBVL8dO7G2XbKEDFPrYtZbR+y7ZQldS6C2jN2LCVKcFdGdfg6gKrUkpov35JX5+I2dv3gDuvL6K3qVJ7MOjA+4jkwBsSb+fkoMXTbnLiRlBfX19E76Fm/wwbSY7pMFrD1BXgv1998YHluq634Ry1AaNKkhXEGQoUgUVaMrx5bz4AlFslUEDdHpVcZC6JDIyElTfBjB6Aq24g7Zm8BeaUFRMXEw0xKUYyGfiTPnvkXH+g7y+nebucWvaf9Cj4oczQubM2u3hPSzPJ+QvN8Pqyal303a0WjKjUdhyknLRjN2nZzjO/yKjRh09O2Puwrd+Wvvg5O4eicPcV1Tvvtdw++srz1b+Gl8fW6r/bfIqVUz136sOK79qrLx/fMn1X5sCnMWrr2q7P7k/LHL5lps9c11mHchzX3BwQoTUtR4c6gLXmdO2zNR0e9Z1acaDyM6dL9bUtPose9P28+fPa3aNLICMpv+Z34/feXz1sqZbya6RI5/33doEs4rINoskta4jtvlAoKkNdRRPY7YO3dLhy6uVZZWVx/3mpX1UWZPe9m5W6De5aTJd6NIMmM+tGf1xr21Dp6Wte3Q4b8fJ9yaPi/L74q+BXfzXLzzSK8i9qqDO4b2WWp3uycTFG7JC3cdkrM8uhvi4IPmvH48VPH7zvkdBXcujd0obVikSAvcrY6ZAflO089KeAe1f33x27Ecv7P545/y9GYa453OejqnLHXQidOl3vjNS9z3ue32PfMOXfd9+dmX8+PHP9l5+8HXejqo/Jj5ndk7YMXzPu0du73mRGOgGQgs8NCm9fvpbG85cfPzrk2fTk6fd31RXVzcvJ/z2o4PVp319fZ1jKg+s3p788OA19fe6N974w/mvxReTQm4lTr7Z75PW//Gde6Bwdm992cSJ383qHXLtycy3Om9vWt17cq78XEmP6RA4/2x997Kn44yHbs9d6+r3/ZW7c8SCR/Y/LPeRiK5HCYfVf33xvmTyntL7Ta+30I1cvePbG1dbLxog60bDXLwxzMW9JMwlcEMynvNWP8Az0XzkHxMatu5LqcoiI7+aupqjge8kN/0W2JIff+j+RHs7GCh+UwVRpntb2TEoBqv3m15VQeJANXVARwN8E1DMoJnsqkZT8omHaAFet0hAXl8Fkm0OdJTFx/tm7g8P0ftfWf5csGd66imaMLMiiw21JPy5Ae2T3eYuqXIvcUTQp7YOi9Xgduj9tLSnLeGZRHrqRHuaSJ0uu0KFdzKS0XCkpD792rVryN1FUxVTcVx6p2WD8gcl59tlnAyTORmOgmcKeA5uQrKI+u1DjUw63blB6F0sRhnym8+5a7LiIwO/6CBEvBBrVkICOG1iIzxTCfP+iN0t+l4KsQ4hniDJApILddRJyDN0BLmj17imRCS0EKFFqWyCUJDcgMhFuHQzqb0956Fd+oUMZy/BrRc7U5+cgtj7dtnMxwVKyMX5Lkgw3HjrLt/VZgPH0vO1buy2G43Vlq4WI/wfhosEAg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/img/quicktime.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAMQfADeo7E2z8tTi9DaZ6m7H8czY8Y+05vb4/Bqb65bK8lia6ASL5A2W7B62+GKm6HKs6bzW7HSz7KfF7wx84Bem9Bql7Ojs9Ojy/LzK7CmG38De9HS78rDN8tzm9AyS5P///yH5BAEAAB8ALAAAAAAQABAAAAWs4CeKRwFhxTGuX2c8W7RthqGuXIYgDEXxA4VgBJksGA2CMgCAADKdzyGzQAA0o8JDAFkoPpKFBxEVaRFMz0SgOG6yDnQH4FkYBnWOyBIPRCN1D3gLeh8XAQQXIg8eDBEODB4OIwc3U40JEggeGRAsHwYejR0HA1YKEhYiLgo7DioaPwAPDzUPATseARgiGg0UFQDCFRXAPF+rBA3LywAJCcsDLAdcGqQiHAkcIQA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/img/realmedia.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhJQASAMQfAFJQTaDA2gBAjGudxbGvrkA9Oy4rKRNjosC/vo621TV4rszMzMHW5h8cGYuKiEiGtgRWmpmZmXVzcX2pzCRwqaOiodXV1NTj7liRvuTj4xMQDerx9wBKk2ZmZgAAAP///yH5BAEAAB8ALAAAAAAlABIAAAX/4CeO3xUMj6I8Q8KQcCyL20RBgsDte04NrxlsQxwFDjuIohVoJlA4wWMjFGUKDYlokBxchBtnUIjweCKfxO4w/lg6nUqnkMk4AAUJwioxNAwdBB8SHhoLG0gHXyQOZhoeAAiPcGaCAB4FDgUeDRmXBhsMOw8xABoaDnUGHgYREQ2QbhWzmwYLqx0fohwYQ6sAIgunBQAAcK4NGsTJkY9oiBwHVCOSHg5WsB0ZBA4OFo90BM6NGhkiahwK04OFeyIEyY8eEhuXGgYGpwSXBQQLW2smUMmw4B+JDQgqEDD3joCFDAgOLUBgIaIRCjkOYAjAgMi6ACkEVgGTQAGHHBwgNHCY8CEARg4D1o0UwmDCAwoHDiR4sENBm5lAN1BIwhKoUSM9Fx01ugEChARLow5QoDQqiRAAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/img/shockwave.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFQAQANUAAAAAAP/////WMv/21fj16v3xyfPp1v+ZAP+hG/ikLfq2U//MgvrVn+vg0P3AbP26hf9mAP93HPqjaPqvfP/FnPLTvfmEO/jEovHMtf9ZAP+ZZswAAP8kJP8zM9UuLtw3N95sbN1+fuqfn+2kpPK0tP/Dw+bFxf3n5+/e3ubm5t7e3v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACsALAAAAAAVABAAAAagwBWBsCoaj0gjgSFIOpMCRuNJXQoGFedptYUyFIjVoEjAGDqlzqlrZDoOFERF88hgOiaOacNeRcEMBw8RDxAXHSQdIxsoRykFbwsJgyMQiZcbJiAlRimBFIIRExAjeBwkGyobI0dvDAgjohAmiIqZHiJIKg4IExajKiMpI3uquY6eKhIqJiorKUUhKh4hTyopKUNIKatU3h/H3k4qzuLeQQA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/img/trans.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhAQABAJAAAAAAAAAAACH5BAEUAAAALAAAAAABAAEAAAICRAEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/img/windowsmedia.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDwAPANU/APl1UxYto9GpBYmgYfhZMPz9/UBHhPnPw+Xm5oSFi3C1AZbTH62trezHK/Ksm2aZB/ry0o6vDszMzOnKRyxMuRpXyfny6UtxAhcXF3h3d9jX2VaP3iaI516GE5qam+3WcUtOQ2lpaR5t1ftLHnioK3RuVp/CXkt+0O/u8zNmy8TFwMbe9YJwIQYGBui+EUJXCHWDV3KKKKKHFo+NhfVhO97LxtPcwxh24VSc6Uik6X+Vwx4eHoF/b+PDOYWNqP///yH5BAEAAD8ALAAAAAAPAA8AAAa8wJ/Q4gAQIqSBCiVsHmijaETx6Aw0zhEBwF0sqBcY9kfbOmoajc2k6FxmCMcI4LCEVAgUyvS4gBgAczUWICEZKgUIJB0vCYEAGoQgOy0hCCYxLzwnHDkIhJQ7EggfPQKbNxwrFjsYDBIFFhOmGToVNzgoM4gFBR8TLjIJGhQVIhsrvRC/piUePz4BFSkpJxPXPS4sHgw/CBkBARQUDQ0uAiwJHghCCAkG4QICMiUzHmNCKAwJGf3qDOx+BAEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/js/embed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBUaGlzIHNjcmlwdCBjb250YWlucyBlbWJlZCBmdW5jdGlvbnMgZm9yIGNvbW1vbiBwbHVnaW5zLiBUaGlzIHNjcmlwdHMgYXJlIGNvbXBsZXR5IGZyZWUgdG8gdXNlIGZvciBhbnkgcHVycG9zZS4NCiAqLw0KDQpmdW5jdGlvbiB3cml0ZUZsYXNoKHApIHsNCgl3cml0ZUVtYmVkKA0KCQknRDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwJywNCgkJJ2h0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5jYWIjdmVyc2lvbj02LDAsNDAsMCcsDQoJCSdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsDQoJCXANCgkpOw0KfQ0KDQpmdW5jdGlvbiB3cml0ZVNob2NrV2F2ZShwKSB7DQoJd3JpdGVFbWJlZCgNCgknMTY2QjFCQ0EtM0Y5Qy0xMUNGLTgwNzUtNDQ0NTUzNTQwMDAwJywNCgknaHR0cDovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9zaG9ja3dhdmUvY2Ficy9kaXJlY3Rvci9zdy5jYWIjdmVyc2lvbj04LDUsMSwwJywNCgknYXBwbGljYXRpb24veC1kaXJlY3RvcicsDQoJCXANCgkpOw0KfQ0KDQpmdW5jdGlvbiB3cml0ZVF1aWNrVGltZShwKSB7DQoJd3JpdGVFbWJlZCgNCgkJJzAyQkYyNUQ1LThDMTctNEIyMy1CQzgwLUQzNDg4QUJEREM2QicsDQoJCSdodHRwOi8vd3d3LmFwcGxlLmNvbS9xdGFjdGl2ZXgvcXRwbHVnaW4uY2FiI3ZlcnNpb249NiwwLDIsMCcsDQoJCSd2aWRlby9xdWlja3RpbWUnLA0KCQlwDQoJKTsNCn0NCg0KZnVuY3Rpb24gd3JpdGVSZWFsTWVkaWEocCkgew0KCXdyaXRlRW1iZWQoDQoJCSdDRkNEQUEwMy04QkU0LTExY2YtQjg0Qi0wMDIwQUZCQkNDRkEnLA0KCQknaHR0cDovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9zaG9ja3dhdmUvY2Ficy9mbGFzaC9zd2ZsYXNoLmNhYiN2ZXJzaW9uPTYsMCw0MCwwJywNCgkJJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsDQoJCXANCgkpOw0KfQ0KDQpmdW5jdGlvbiB3cml0ZVdpbmRvd3NNZWRpYShwKSB7DQoJcC51cmwgPSBwLnNyYzsNCgl3cml0ZUVtYmVkKA0KCQknNkJGNTJBNTItMzk0QS0xMUQzLUIxNTMtMDBDMDRGNzlGQUE2JywNCgkJJ2h0dHA6Ly9hY3RpdmV4Lm1pY3Jvc29mdC5jb20vYWN0aXZleC9jb250cm9scy9tcGxheWVyL2VuL25zbXAyaW5mLmNhYiNWZXJzaW9uPTUsMSw1Miw3MDEnLA0KCQknYXBwbGljYXRpb24veC1tcGxheWVyMicsDQoJCXANCgkpOw0KfQ0KDQpmdW5jdGlvbiB3cml0ZUVtYmVkKGNscywgY2IsIG10LCBwKSB7DQoJdmFyIGggPSAnJywgbjsNCg0KCWggKz0gJzxvYmplY3QgY2xhc3NpZD0iY2xzaWQ6JyArIGNscyArICciIGNvZGViYXNlPSInICsgY2IgKyAnIic7DQoJaCArPSB0eXBlb2YocC5pZCkgIT0gInVuZGVmaW5lZCIgPyAnaWQ9IicgKyBwLmlkICsgJyInIDogJyc7DQoJaCArPSB0eXBlb2YocC5uYW1lKSAhPSAidW5kZWZpbmVkIiA/ICduYW1lPSInICsgcC5uYW1lICsgJyInIDogJyc7DQoJaCArPSB0eXBlb2YocC53aWR0aCkgIT0gInVuZGVmaW5lZCIgPyAnd2lkdGg9IicgKyBwLndpZHRoICsgJyInIDogJyc7DQoJaCArPSB0eXBlb2YocC5oZWlnaHQpICE9ICJ1bmRlZmluZWQiID8gJ2hlaWdodD0iJyArIHAuaGVpZ2h0ICsgJyInIDogJyc7DQoJaCArPSB0eXBlb2YocC5hbGlnbikgIT0gInVuZGVmaW5lZCIgPyAnYWxpZ249IicgKyBwLmFsaWduICsgJyInIDogJyc7DQoJaCArPSAnPic7DQoNCglmb3IgKG4gaW4gcCkNCgkJaCArPSAnPHBhcmFtIG5hbWU9IicgKyBuICsgJyIgdmFsdWU9IicgKyBwW25dICsgJyI+JzsNCg0KCWggKz0gJzxlbWJlZCB0eXBlPSInICsgbXQgKyAnIic7DQoNCglmb3IgKG4gaW4gcCkNCgkJaCArPSBuICsgJz0iJyArIHBbbl0gKyAnIiAnOw0KDQoJaCArPSAnPjwvZW1iZWQ+PC9vYmplY3Q+JzsNCg0KCWRvY3VtZW50LndyaXRlKGgpOw0KfQ0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/js/media.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgb2xkV2lkdGgsIG9sZEhlaWdodCwgZWQsIHVybDsNCg0KaWYgKHVybCA9IHRpbnlNQ0VQb3B1cC5nZXRQYXJhbSgibWVkaWFfZXh0ZXJuYWxfbGlzdF91cmwiKSkNCglkb2N1bWVudC53cml0ZSgnPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicgKyB0aW55TUNFUG9wdXAuZWRpdG9yLmRvY3VtZW50QmFzZVVSSS50b0Fic29sdXRlKHVybCkgKyAnIj48L3NjcmlwdD4nKTsNCg0KZnVuY3Rpb24gaW5pdCgpIHsNCgl2YXIgcGwgPSAiIiwgZiwgdmFsOw0KCXZhciB0eXBlID0gImZsYXNoIiwgZmUsIGk7DQoNCgllZCA9IHRpbnlNQ0VQb3B1cC5lZGl0b3I7DQoNCgl0aW55TUNFUG9wdXAucmVzaXplVG9Jbm5lclNpemUoKTsNCglmID0gZG9jdW1lbnQuZm9ybXNbMF0NCg0KCWZlID0gZWQuc2VsZWN0aW9uLmdldE5vZGUoKTsNCglpZiAoL21jZUl0ZW0oRmxhc2h8U2hvY2tXYXZlfFdpbmRvd3NNZWRpYXxRdWlja1RpbWV8UmVhbE1lZGlhKS8udGVzdChlZC5kb20uZ2V0QXR0cmliKGZlLCAnY2xhc3MnKSkpIHsNCgkJcGwgPSBmZS50aXRsZTsNCg0KCQlzd2l0Y2ggKGVkLmRvbS5nZXRBdHRyaWIoZmUsICdjbGFzcycpKSB7DQoJCQljYXNlICdtY2VJdGVtRmxhc2gnOg0KCQkJCXR5cGUgPSAnZmxhc2gnOw0KCQkJCWJyZWFrOw0KDQoJCQljYXNlICdtY2VJdGVtRmxhc2hWaWRlbyc6DQoJCQkJdHlwZSA9ICdmbHYnOw0KCQkJCWJyZWFrOw0KDQoJCQljYXNlICdtY2VJdGVtU2hvY2tXYXZlJzoNCgkJCQl0eXBlID0gJ3Nob2Nrd2F2ZSc7DQoJCQkJYnJlYWs7DQoNCgkJCWNhc2UgJ21jZUl0ZW1XaW5kb3dzTWVkaWEnOg0KCQkJCXR5cGUgPSAnd21wJzsNCgkJCQlicmVhazsNCg0KCQkJY2FzZSAnbWNlSXRlbVF1aWNrVGltZSc6DQoJCQkJdHlwZSA9ICdxdCc7DQoJCQkJYnJlYWs7DQoNCgkJCWNhc2UgJ21jZUl0ZW1SZWFsTWVkaWEnOg0KCQkJCXR5cGUgPSAncm1wJzsNCgkJCQlicmVhazsNCgkJfQ0KDQoJCWRvY3VtZW50LmZvcm1zWzBdLmluc2VydC52YWx1ZSA9IGVkLmdldExhbmcoJ3VwZGF0ZScsICdJbnNlcnQnLCB0cnVlKTsgDQoJfQ0KDQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVicm93c2VyY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0QnJvd3NlckhUTUwoJ2ZpbGVicm93c2VyJywnc3JjJywnbWVkaWEnLCdtZWRpYScpOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdHNyY2ZpbGVicm93c2VyY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0QnJvd3NlckhUTUwoJ3F0c3JjZmlsZWJyb3dzZXInLCdxdF9xdHNyYycsJ21lZGlhJywnbWVkaWEnKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmdjb2xvcl9waWNrY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0Q29sb3JQaWNrZXJIVE1MKCdiZ2NvbG9yX3BpY2snLCdiZ2NvbG9yJyk7DQoNCgl2YXIgaHRtbCA9IGdldE1lZGlhTGlzdEhUTUwoJ21lZGlhbGlzdCcsJ3NyYycsJ21lZGlhJywnbWVkaWEnKTsNCglpZiAoaHRtbCA9PSAiIikNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxpbmtsaXN0cm93Iikuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCgllbHNlDQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsaW5rbGlzdGNvbnRhaW5lciIpLmlubmVySFRNTCA9IGh0bWw7DQoNCgkvLyBSZXNpemUgc29tZSBlbGVtZW50cw0KCWlmIChpc1Zpc2libGUoJ2ZpbGVicm93c2VyJykpDQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcmMnKS5zdHlsZS53aWR0aCA9ICcyMzBweCc7DQoNCgkvLyBTZXR1cCBmb3JtDQoJaWYgKHBsICE9ICIiKSB7DQoJCXBsID0gdGlueU1DRVBvcHVwLmVkaXRvci5wbHVnaW5zLm1lZGlhLl9wYXJzZShwbCk7DQoNCgkJc3dpdGNoICh0eXBlKSB7DQoJCQljYXNlICJmbGFzaCI6DQoJCQkJc2V0Qm9vbChwbCwgJ2ZsYXNoJywgJ3BsYXknKTsNCgkJCQlzZXRCb29sKHBsLCAnZmxhc2gnLCAnbG9vcCcpOw0KCQkJCXNldEJvb2wocGwsICdmbGFzaCcsICdtZW51Jyk7DQoJCQkJc2V0Qm9vbChwbCwgJ2ZsYXNoJywgJ3N3bGl2ZWNvbm5lY3QnKTsNCgkJCQlzZXRTdHIocGwsICdmbGFzaCcsICdxdWFsaXR5Jyk7DQoJCQkJc2V0U3RyKHBsLCAnZmxhc2gnLCAnc2NhbGUnKTsNCgkJCQlzZXRTdHIocGwsICdmbGFzaCcsICdzYWxpZ24nKTsNCgkJCQlzZXRTdHIocGwsICdmbGFzaCcsICd3bW9kZScpOw0KCQkJCXNldFN0cihwbCwgJ2ZsYXNoJywgJ2Jhc2UnKTsNCgkJCQlzZXRTdHIocGwsICdmbGFzaCcsICdmbGFzaHZhcnMnKTsNCgkJCWJyZWFrOw0KDQoJCQljYXNlICJxdCI6DQoJCQkJc2V0Qm9vbChwbCwgJ3F0JywgJ2xvb3AnKTsNCgkJCQlzZXRCb29sKHBsLCAncXQnLCAnYXV0b3BsYXknKTsNCgkJCQlzZXRCb29sKHBsLCAncXQnLCAnY2FjaGUnKTsNCgkJCQlzZXRCb29sKHBsLCAncXQnLCAnY29udHJvbGxlcicpOw0KCQkJCXNldEJvb2wocGwsICdxdCcsICdjb3JyZWN0aW9uJyk7DQoJCQkJc2V0Qm9vbChwbCwgJ3F0JywgJ2VuYWJsZWphdmFzY3JpcHQnKTsNCgkJCQlzZXRCb29sKHBsLCAncXQnLCAna2lvc2ttb2RlJyk7DQoJCQkJc2V0Qm9vbChwbCwgJ3F0JywgJ2F1dG9ocmVmJyk7DQoJCQkJc2V0Qm9vbChwbCwgJ3F0JywgJ3BsYXlldmVyeWZyYW1lJyk7DQoJCQkJc2V0Qm9vbChwbCwgJ3F0JywgJ3RhcnNldGNhY2hlJyk7DQoJCQkJc2V0U3RyKHBsLCAncXQnLCAnc2NhbGUnKTsNCgkJCQlzZXRTdHIocGwsICdxdCcsICdzdGFydHRpbWUnKTsNCgkJCQlzZXRTdHIocGwsICdxdCcsICdlbmR0aW1lJyk7DQoJCQkJc2V0U3RyKHBsLCAncXQnLCAndGFyc2V0Jyk7DQoJCQkJc2V0U3RyKHBsLCAncXQnLCAncXRzcmNjaG9rZXNwZWVkJyk7DQoJCQkJc2V0U3RyKHBsLCAncXQnLCAndm9sdW1lJyk7DQoJCQkJc2V0U3RyKHBsLCAncXQnLCAncXRzcmMnKTsNCgkJCWJyZWFrOw0KDQoJCQljYXNlICJzaG9ja3dhdmUiOg0KCQkJCXNldEJvb2wocGwsICdzaG9ja3dhdmUnLCAnc291bmQnKTsNCgkJCQlzZXRCb29sKHBsLCAnc2hvY2t3YXZlJywgJ3Byb2dyZXNzJyk7DQoJCQkJc2V0Qm9vbChwbCwgJ3Nob2Nrd2F2ZScsICdhdXRvc3RhcnQnKTsNCgkJCQlzZXRCb29sKHBsLCAnc2hvY2t3YXZlJywgJ3N3bGl2ZWNvbm5lY3QnKTsNCgkJCQlzZXRTdHIocGwsICdzaG9ja3dhdmUnLCAnc3d2b2x1bWUnKTsNCgkJCQlzZXRTdHIocGwsICdzaG9ja3dhdmUnLCAnc3dzdHJldGNoc3R5bGUnKTsNCgkJCQlzZXRTdHIocGwsICdzaG9ja3dhdmUnLCAnc3dzdHJldGNoaGFsaWduJyk7DQoJCQkJc2V0U3RyKHBsLCAnc2hvY2t3YXZlJywgJ3N3c3RyZXRjaHZhbGlnbicpOw0KCQkJYnJlYWs7DQoNCgkJCWNhc2UgIndtcCI6DQoJCQkJc2V0Qm9vbChwbCwgJ3dtcCcsICdhdXRvc3RhcnQnKTsNCgkJCQlzZXRCb29sKHBsLCAnd21wJywgJ2VuYWJsZWQnKTsNCgkJCQlzZXRCb29sKHBsLCAnd21wJywgJ2VuYWJsZWNvbnRleHRtZW51Jyk7DQoJCQkJc2V0Qm9vbChwbCwgJ3dtcCcsICdmdWxsc2NyZWVuJyk7DQoJCQkJc2V0Qm9vbChwbCwgJ3dtcCcsICdpbnZva2V1cmxzJyk7DQoJCQkJc2V0Qm9vbChwbCwgJ3dtcCcsICdtdXRlJyk7DQoJCQkJc2V0Qm9vbChwbCwgJ3dtcCcsICdzdHJldGNodG9maXQnKTsNCgkJCQlzZXRCb29sKHBsLCAnd21wJywgJ3dpbmRvd2xlc3N2aWRlbycpOw0KCQkJCXNldFN0cihwbCwgJ3dtcCcsICdiYWxhbmNlJyk7DQoJCQkJc2V0U3RyKHBsLCAnd21wJywgJ2Jhc2V1cmwnKTsNCgkJCQlzZXRTdHIocGwsICd3bXAnLCAnY2FwdGlvbmluZ2lkJyk7DQoJCQkJc2V0U3RyKHBsLCAnd21wJywgJ2N1cnJlbnRtYXJrZXInKTsNCgkJCQlzZXRTdHIocGwsICd3bXAnLCAnY3VycmVudHBvc2l0aW9uJyk7DQoJCQkJc2V0U3RyKHBsLCAnd21wJywgJ2RlZmF1bHRmcmFtZScpOw0KCQkJCXNldFN0cihwbCwgJ3dtcCcsICdwbGF5Y291bnQnKTsNCgkJCQlzZXRTdHIocGwsICd3bXAnLCAncmF0ZScpOw0KCQkJCXNldFN0cihwbCwgJ3dtcCcsICd1aW1vZGUnKTsNCgkJCQlzZXRTdHIocGwsICd3bXAnLCAndm9sdW1lJyk7DQoJCQlicmVhazsNCg0KCQkJY2FzZSAicm1wIjoNCgkJCQlzZXRCb29sKHBsLCAncm1wJywgJ2F1dG9zdGFydCcpOw0KCQkJCXNldEJvb2wocGwsICdybXAnLCAnbG9vcCcpOw0KCQkJCXNldEJvb2wocGwsICdybXAnLCAnYXV0b2dvdG91cmwnKTsNCgkJCQlzZXRCb29sKHBsLCAncm1wJywgJ2NlbnRlcicpOw0KCQkJCXNldEJvb2wocGwsICdybXAnLCAnaW1hZ2VzdGF0dXMnKTsNCgkJCQlzZXRCb29sKHBsLCAncm1wJywgJ21haW50YWluYXNwZWN0Jyk7DQoJCQkJc2V0Qm9vbChwbCwgJ3JtcCcsICdub2phdmEnKTsNCgkJCQlzZXRCb29sKHBsLCAncm1wJywgJ3ByZWZldGNoJyk7DQoJCQkJc2V0Qm9vbChwbCwgJ3JtcCcsICdzaHVmZmxlJyk7DQoJCQkJc2V0U3RyKHBsLCAncm1wJywgJ2NvbnNvbGUnKTsNCgkJCQlzZXRTdHIocGwsICdybXAnLCAnY29udHJvbHMnKTsNCgkJCQlzZXRTdHIocGwsICdybXAnLCAnbnVtbG9vcCcpOw0KCQkJCXNldFN0cihwbCwgJ3JtcCcsICdzY3JpcHRjYWxsYmFja3MnKTsNCgkJCWJyZWFrOw0KCQl9DQoNCgkJc2V0U3RyKHBsLCBudWxsLCAnc3JjJyk7DQoJCXNldFN0cihwbCwgbnVsbCwgJ2lkJyk7DQoJCXNldFN0cihwbCwgbnVsbCwgJ25hbWUnKTsNCgkJc2V0U3RyKHBsLCBudWxsLCAndnNwYWNlJyk7DQoJCXNldFN0cihwbCwgbnVsbCwgJ2hzcGFjZScpOw0KCQlzZXRTdHIocGwsIG51bGwsICdiZ2NvbG9yJyk7DQoJCXNldFN0cihwbCwgbnVsbCwgJ2FsaWduJyk7DQoJCXNldFN0cihwbCwgbnVsbCwgJ3dpZHRoJyk7DQoJCXNldFN0cihwbCwgbnVsbCwgJ2hlaWdodCcpOw0KDQoJCWlmICgodmFsID0gZWQuZG9tLmdldEF0dHJpYihmZSwgIndpZHRoIikpICE9ICIiKQ0KCQkJcGwud2lkdGggPSBmLndpZHRoLnZhbHVlID0gdmFsOw0KDQoJCWlmICgodmFsID0gZWQuZG9tLmdldEF0dHJpYihmZSwgImhlaWdodCIpKSAhPSAiIikNCgkJCXBsLmhlaWdodCA9IGYuaGVpZ2h0LnZhbHVlID0gdmFsOw0KDQoJCW9sZFdpZHRoID0gcGwud2lkdGggPyBwYXJzZUludChwbC53aWR0aCkgOiAwOw0KCQlvbGRIZWlnaHQgPSBwbC5oZWlnaHQgPyBwYXJzZUludChwbC5oZWlnaHQpIDogMDsNCgl9IGVsc2UNCgkJb2xkV2lkdGggPSBvbGRIZWlnaHQgPSAwOw0KDQoJc2VsZWN0QnlWYWx1ZShmLCAnbWVkaWFfdHlwZScsIHR5cGUpOw0KCWNoYW5nZWRUeXBlKHR5cGUpOw0KCXVwZGF0ZUNvbG9yKCdiZ2NvbG9yX3BpY2snLCAnYmdjb2xvcicpOw0KDQoJVGlueU1DRV9FZGl0YWJsZVNlbGVjdHMuaW5pdCgpOw0KCWdlbmVyYXRlUHJldmlldygpOw0KfQ0KDQpmdW5jdGlvbiBpbnNlcnRNZWRpYSgpIHsNCgl2YXIgZmUsIGYgPSBkb2N1bWVudC5mb3Jtc1swXSwgaDsNCg0KCXRpbnlNQ0VQb3B1cC5yZXN0b3JlU2VsZWN0aW9uKCk7DQoNCglpZiAoIUF1dG9WYWxpZGF0b3IudmFsaWRhdGUoZikpIHsNCgkJdGlueU1DRVBvcHVwLmFsZXJ0KGVkLmdldExhbmcoJ2ludmFsaWRfZGF0YScpKTsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCWYud2lkdGgudmFsdWUgPSBmLndpZHRoLnZhbHVlID09ICIiID8gMTAwIDogZi53aWR0aC52YWx1ZTsNCglmLmhlaWdodC52YWx1ZSA9IGYuaGVpZ2h0LnZhbHVlID09ICIiID8gMTAwIDogZi5oZWlnaHQudmFsdWU7DQoNCglmZSA9IGVkLnNlbGVjdGlvbi5nZXROb2RlKCk7DQoJaWYgKGZlICE9IG51bGwgJiYgL21jZUl0ZW0oRmxhc2h8U2hvY2tXYXZlfFdpbmRvd3NNZWRpYXxRdWlja1RpbWV8UmVhbE1lZGlhKS8udGVzdChlZC5kb20uZ2V0QXR0cmliKGZlLCAnY2xhc3MnKSkpIHsNCgkJc3dpdGNoIChmLm1lZGlhX3R5cGUub3B0aW9uc1tmLm1lZGlhX3R5cGUuc2VsZWN0ZWRJbmRleF0udmFsdWUpIHsNCgkJCWNhc2UgImZsYXNoIjoNCgkJCQlmZS5jbGFzc05hbWUgPSAibWNlSXRlbUZsYXNoIjsNCgkJCQlicmVhazsNCg0KCQkJY2FzZSAiZmx2IjoNCgkJCQlmZS5jbGFzc05hbWUgPSAibWNlSXRlbUZsYXNoVmlkZW8iOw0KCQkJCWJyZWFrOw0KDQoJCQljYXNlICJzaG9ja3dhdmUiOg0KCQkJCWZlLmNsYXNzTmFtZSA9ICJtY2VJdGVtU2hvY2tXYXZlIjsNCgkJCQlicmVhazsNCg0KCQkJY2FzZSAicXQiOg0KCQkJCWZlLmNsYXNzTmFtZSA9ICJtY2VJdGVtUXVpY2tUaW1lIjsNCgkJCQlicmVhazsNCg0KCQkJY2FzZSAid21wIjoNCgkJCQlmZS5jbGFzc05hbWUgPSAibWNlSXRlbVdpbmRvd3NNZWRpYSI7DQoJCQkJYnJlYWs7DQoNCgkJCWNhc2UgInJtcCI6DQoJCQkJZmUuY2xhc3NOYW1lID0gIm1jZUl0ZW1SZWFsTWVkaWEiOw0KCQkJCWJyZWFrOw0KCQl9DQoNCgkJaWYgKGZlLndpZHRoICE9IGYud2lkdGgudmFsdWUgfHwgZmUuaGVpZ2h0ICE9IGYuaGVpZ2h0LnZhbHVlKQ0KCQkJZWQuZXhlY0NvbW1hbmQoJ21jZVJlcGFpbnQnKTsNCg0KCQlmZS50aXRsZSA9IHNlcmlhbGl6ZVBhcmFtZXRlcnMoKTsNCgkJZmUud2lkdGggPSBmLndpZHRoLnZhbHVlOw0KCQlmZS5oZWlnaHQgPSBmLmhlaWdodC52YWx1ZTsNCgkJZmUuc3R5bGUud2lkdGggPSBmLndpZHRoLnZhbHVlICsgKGYud2lkdGgudmFsdWUuaW5kZXhPZignJScpID09IC0xID8gJ3B4JyA6ICcnKTsNCgkJZmUuc3R5bGUuaGVpZ2h0ID0gZi5oZWlnaHQudmFsdWUgKyAoZi5oZWlnaHQudmFsdWUuaW5kZXhPZignJScpID09IC0xID8gJ3B4JyA6ICcnKTsNCgkJZmUuYWxpZ24gPSBmLmFsaWduLm9wdGlvbnNbZi5hbGlnbi5zZWxlY3RlZEluZGV4XS52YWx1ZTsNCgl9IGVsc2Ugew0KCQloID0gJzxpbWcgc3JjPSInICsgdGlueU1DRVBvcHVwLmdldFdpbmRvd0FyZygicGx1Z2luX3VybCIpICsgJy9pbWcvdHJhbnMuZ2lmIicgOw0KDQoJCXN3aXRjaCAoZi5tZWRpYV90eXBlLm9wdGlvbnNbZi5tZWRpYV90eXBlLnNlbGVjdGVkSW5kZXhdLnZhbHVlKSB7DQoJCQljYXNlICJmbGFzaCI6DQoJCQkJaCArPSAnIGNsYXNzPSJtY2VJdGVtRmxhc2giJzsNCgkJCQlicmVhazsNCg0KCQkJY2FzZSAiZmx2IjoNCgkJCQloICs9ICcgY2xhc3M9Im1jZUl0ZW1GbGFzaFZpZGVvIic7DQoJCQkJYnJlYWs7DQoNCgkJCWNhc2UgInNob2Nrd2F2ZSI6DQoJCQkJaCArPSAnIGNsYXNzPSJtY2VJdGVtU2hvY2tXYXZlIic7DQoJCQkJYnJlYWs7DQoNCgkJCWNhc2UgInF0IjoNCgkJCQloICs9ICcgY2xhc3M9Im1jZUl0ZW1RdWlja1RpbWUiJzsNCgkJCQlicmVhazsNCg0KCQkJY2FzZSAid21wIjoNCgkJCQloICs9ICcgY2xhc3M9Im1jZUl0ZW1XaW5kb3dzTWVkaWEiJzsNCgkJCQlicmVhazsNCg0KCQkJY2FzZSAicm1wIjoNCgkJCQloICs9ICcgY2xhc3M9Im1jZUl0ZW1SZWFsTWVkaWEiJzsNCgkJCQlicmVhazsNCgkJfQ0KDQoJCWggKz0gJyB0aXRsZT0iJyArIHNlcmlhbGl6ZVBhcmFtZXRlcnMoKSArICciJzsNCgkJaCArPSAnIHdpZHRoPSInICsgZi53aWR0aC52YWx1ZSArICciJzsNCgkJaCArPSAnIGhlaWdodD0iJyArIGYuaGVpZ2h0LnZhbHVlICsgJyInOw0KCQloICs9ICcgYWxpZ249IicgKyBmLmFsaWduLm9wdGlvbnNbZi5hbGlnbi5zZWxlY3RlZEluZGV4XS52YWx1ZSArICciJzsNCg0KCQloICs9ICcgLz4nOw0KDQoJCWVkLmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDb250ZW50JywgZmFsc2UsIGgpOw0KCX0NCg0KCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KfQ0KDQpmdW5jdGlvbiB1cGRhdGVQcmV2aWV3KCkgew0KCXZhciBmID0gZG9jdW1lbnQuZm9ybXNbMF0sIHR5cGU7DQoNCglmLndpZHRoLnZhbHVlID0gZi53aWR0aC52YWx1ZSB8fCAnMzIwJzsNCglmLmhlaWdodC52YWx1ZSA9IGYuaGVpZ2h0LnZhbHVlIHx8ICcyNDAnOw0KDQoJdHlwZSA9IGdldFR5cGUoZi5zcmMudmFsdWUpOw0KCXNlbGVjdEJ5VmFsdWUoZiwgJ21lZGlhX3R5cGUnLCB0eXBlKTsNCgljaGFuZ2VkVHlwZSh0eXBlKTsNCglnZW5lcmF0ZVByZXZpZXcoKTsNCn0NCg0KZnVuY3Rpb24gZ2V0TWVkaWFMaXN0SFRNTCgpIHsNCglpZiAodHlwZW9mKHRpbnlNQ0VNZWRpYUxpc3QpICE9ICJ1bmRlZmluZWQiICYmIHRpbnlNQ0VNZWRpYUxpc3QubGVuZ3RoID4gMCkgew0KCQl2YXIgaHRtbCA9ICIiOw0KDQoJCWh0bWwgKz0gJzxzZWxlY3QgaWQ9ImxpbmtsaXN0IiBuYW1lPSJsaW5rbGlzdCIgc3R5bGU9IndpZHRoOiAyNTBweCIgb25jaGFuZ2U9InRoaXMuZm9ybS5zcmMudmFsdWU9dGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWU7dXBkYXRlUHJldmlldygpOyI+JzsNCgkJaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT0iIj4tLS08L29wdGlvbj4nOw0KDQoJCWZvciAodmFyIGk9MDsgaTx0aW55TUNFTWVkaWFMaXN0Lmxlbmd0aDsgaSsrKQ0KCQkJaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT0iJyArIHRpbnlNQ0VNZWRpYUxpc3RbaV1bMV0gKyAnIj4nICsgdGlueU1DRU1lZGlhTGlzdFtpXVswXSArICc8L29wdGlvbj4nOw0KDQoJCWh0bWwgKz0gJzwvc2VsZWN0Pic7DQoNCgkJcmV0dXJuIGh0bWw7DQoJfQ0KDQoJcmV0dXJuICIiOw0KfQ0KDQpmdW5jdGlvbiBnZXRUeXBlKHYpIHsNCgl2YXIgZm8sIGksIGMsIGVsLCB4LCBmID0gZG9jdW1lbnQuZm9ybXNbMF07DQoNCglmbyA9IGVkLmdldFBhcmFtKCJtZWRpYV90eXBlcyIsICJmbGFzaD1zd2Y7Zmx2PWZsdjtzaG9ja3dhdmU9ZGNyO3F0PW1vdixxdCxtcGcsbXAzLG1wNCxtcGVnO3Nob2Nrd2F2ZT1kY3I7d21wPWF2aSx3bXYsd20sYXNmLGFzeCx3bXgsd3Z4O3JtcD1ybSxyYSxyYW0iKS5zcGxpdCgnOycpOw0KDQoJLy8gWW91VHViZQ0KCWlmICh2Lm1hdGNoKC93YXRjaFw/dj0oLispKC4qKS8pKSB7DQoJCWYud2lkdGgudmFsdWUgPSAnNDI1JzsNCgkJZi5oZWlnaHQudmFsdWUgPSAnMzUwJzsNCgkJZi5zcmMudmFsdWUgPSAnaHR0cDovL3d3dy55b3V0dWJlLmNvbS92LycgKyB2Lm1hdGNoKC92PSguKikoLiopLylbMF0uc3BsaXQoJz0nKVsxXTsNCgkJcmV0dXJuICdmbGFzaCc7DQoJfQ0KDQoJLy8gR29vZ2xlIHZpZGVvDQoJaWYgKHYuaW5kZXhPZignaHR0cDovL3ZpZGVvLmdvb2dsZS5jb20vdmlkZW9wbGF5P2RvY2lkPScpID09IDApIHsNCgkJZi53aWR0aC52YWx1ZSA9ICc0MjUnOw0KCQlmLmhlaWdodC52YWx1ZSA9ICczMjYnOw0KCQlmLnNyYy52YWx1ZSA9ICdodHRwOi8vdmlkZW8uZ29vZ2xlLmNvbS9nb29nbGVwbGF5ZXIuc3dmP2RvY0lkPScgKyB2LnN1YnN0cmluZygnaHR0cDovL3ZpZGVvLmdvb2dsZS5jb20vdmlkZW9wbGF5P2RvY2lkPScubGVuZ3RoKSArICcmaGw9ZW4nOw0KCQlyZXR1cm4gJ2ZsYXNoJzsNCgl9DQoNCglmb3IgKGk9MDsgaTxmby5sZW5ndGg7IGkrKykgew0KCQljID0gZm9baV0uc3BsaXQoJz0nKTsNCg0KCQllbCA9IGNbMV0uc3BsaXQoJywnKTsNCgkJZm9yICh4PTA7IHg8ZWwubGVuZ3RoOyB4KyspDQoJCWlmICh2LmluZGV4T2YoJy4nICsgZWxbeF0pICE9IC0xKQ0KCQkJcmV0dXJuIGNbMF07DQoJfQ0KDQoJcmV0dXJuIG51bGw7DQp9DQoNCmZ1bmN0aW9uIHN3aXRjaFR5cGUodikgew0KCXZhciB0ID0gZ2V0VHlwZSh2KSwgZCA9IGRvY3VtZW50LCBmID0gZC5mb3Jtc1swXTsNCg0KCWlmICghdCkNCgkJcmV0dXJuOw0KDQoJc2VsZWN0QnlWYWx1ZShkLmZvcm1zWzBdLCAnbWVkaWFfdHlwZScsIHQpOw0KCWNoYW5nZWRUeXBlKHQpOw0KDQoJLy8gVXBkYXRlIHF0c3JjIGFsc28NCglpZiAodCA9PSAncXQnICYmIGYuc3JjLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigncnRzcDovLycpICE9IC0xKSB7DQoJCWFsZXJ0KGVkLmdldExhbmcoIm1lZGlhX3F0X3N0cmVhbV93YXJuIikpOw0KDQoJCWlmIChmLnF0X3F0c3JjLnZhbHVlID09ICcnKQ0KCQkJZi5xdF9xdHNyYy52YWx1ZSA9IGYuc3JjLnZhbHVlOw0KCX0NCn0NCg0KZnVuY3Rpb24gY2hhbmdlZFR5cGUodCkgew0KCXZhciBkID0gZG9jdW1lbnQ7DQoNCglkLmdldEVsZW1lbnRCeUlkKCdmbGFzaF9vcHRpb25zJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCglkLmdldEVsZW1lbnRCeUlkKCdmbHZfb3B0aW9ucycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJZC5nZXRFbGVtZW50QnlJZCgncXRfb3B0aW9ucycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJZC5nZXRFbGVtZW50QnlJZCgnc2hvY2t3YXZlX29wdGlvbnMnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KCWQuZ2V0RWxlbWVudEJ5SWQoJ3dtcF9vcHRpb25zJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCglkLmdldEVsZW1lbnRCeUlkKCdybXBfb3B0aW9ucycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoNCglpZiAodCkNCgkJZC5nZXRFbGVtZW50QnlJZCh0ICsgJ19vcHRpb25zJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQp9DQoNCmZ1bmN0aW9uIHNlcmlhbGl6ZVBhcmFtZXRlcnMoKSB7DQoJdmFyIGQgPSBkb2N1bWVudCwgZiA9IGQuZm9ybXNbMF0sIHMgPSAnJzsNCg0KCXN3aXRjaCAoZi5tZWRpYV90eXBlLm9wdGlvbnNbZi5tZWRpYV90eXBlLnNlbGVjdGVkSW5kZXhdLnZhbHVlKSB7DQoJCWNhc2UgImZsYXNoIjoNCgkJCXMgKz0gZ2V0Qm9vbCgnZmxhc2gnLCAncGxheScsIHRydWUpOw0KCQkJcyArPSBnZXRCb29sKCdmbGFzaCcsICdsb29wJywgdHJ1ZSk7DQoJCQlzICs9IGdldEJvb2woJ2ZsYXNoJywgJ21lbnUnLCB0cnVlKTsNCgkJCXMgKz0gZ2V0Qm9vbCgnZmxhc2gnLCAnc3dsaXZlY29ubmVjdCcsIGZhbHNlKTsNCgkJCXMgKz0gZ2V0U3RyKCdmbGFzaCcsICdxdWFsaXR5Jyk7DQoJCQlzICs9IGdldFN0cignZmxhc2gnLCAnc2NhbGUnKTsNCgkJCXMgKz0gZ2V0U3RyKCdmbGFzaCcsICdzYWxpZ24nKTsNCgkJCXMgKz0gZ2V0U3RyKCdmbGFzaCcsICd3bW9kZScpOw0KCQkJcyArPSBnZXRTdHIoJ2ZsYXNoJywgJ2Jhc2UnKTsNCgkJCXMgKz0gZ2V0U3RyKCdmbGFzaCcsICdmbGFzaHZhcnMnKTsNCgkJYnJlYWs7DQoNCgkJY2FzZSAicXQiOg0KCQkJcyArPSBnZXRCb29sKCdxdCcsICdsb29wJywgZmFsc2UpOw0KCQkJcyArPSBnZXRCb29sKCdxdCcsICdhdXRvcGxheScsIHRydWUpOw0KCQkJcyArPSBnZXRCb29sKCdxdCcsICdjYWNoZScsIGZhbHNlKTsNCgkJCXMgKz0gZ2V0Qm9vbCgncXQnLCAnY29udHJvbGxlcicsIHRydWUpOw0KCQkJcyArPSBnZXRCb29sKCdxdCcsICdjb3JyZWN0aW9uJywgZmFsc2UsICdub25lJywgJ2Z1bGwnKTsNCgkJCXMgKz0gZ2V0Qm9vbCgncXQnLCAnZW5hYmxlamF2YXNjcmlwdCcsIGZhbHNlKTsNCgkJCXMgKz0gZ2V0Qm9vbCgncXQnLCAna2lvc2ttb2RlJywgZmFsc2UpOw0KCQkJcyArPSBnZXRCb29sKCdxdCcsICdhdXRvaHJlZicsIGZhbHNlKTsNCgkJCXMgKz0gZ2V0Qm9vbCgncXQnLCAncGxheWV2ZXJ5ZnJhbWUnLCBmYWxzZSk7DQoJCQlzICs9IGdldEJvb2woJ3F0JywgJ3RhcmdldGNhY2hlJywgZmFsc2UpOw0KCQkJcyArPSBnZXRTdHIoJ3F0JywgJ3NjYWxlJyk7DQoJCQlzICs9IGdldFN0cigncXQnLCAnc3RhcnR0aW1lJyk7DQoJCQlzICs9IGdldFN0cigncXQnLCAnZW5kdGltZScpOw0KCQkJcyArPSBnZXRTdHIoJ3F0JywgJ3RhcmdldCcpOw0KCQkJcyArPSBnZXRTdHIoJ3F0JywgJ3F0c3JjY2hva2VzcGVlZCcpOw0KCQkJcyArPSBnZXRTdHIoJ3F0JywgJ3ZvbHVtZScpOw0KCQkJcyArPSBnZXRTdHIoJ3F0JywgJ3F0c3JjJyk7DQoJCWJyZWFrOw0KDQoJCWNhc2UgInNob2Nrd2F2ZSI6DQoJCQlzICs9IGdldEJvb2woJ3Nob2Nrd2F2ZScsICdzb3VuZCcpOw0KCQkJcyArPSBnZXRCb29sKCdzaG9ja3dhdmUnLCAncHJvZ3Jlc3MnKTsNCgkJCXMgKz0gZ2V0Qm9vbCgnc2hvY2t3YXZlJywgJ2F1dG9zdGFydCcpOw0KCQkJcyArPSBnZXRCb29sKCdzaG9ja3dhdmUnLCAnc3dsaXZlY29ubmVjdCcpOw0KCQkJcyArPSBnZXRTdHIoJ3Nob2Nrd2F2ZScsICdzd3ZvbHVtZScpOw0KCQkJcyArPSBnZXRTdHIoJ3Nob2Nrd2F2ZScsICdzd3N0cmV0Y2hzdHlsZScpOw0KCQkJcyArPSBnZXRTdHIoJ3Nob2Nrd2F2ZScsICdzd3N0cmV0Y2hoYWxpZ24nKTsNCgkJCXMgKz0gZ2V0U3RyKCdzaG9ja3dhdmUnLCAnc3dzdHJldGNodmFsaWduJyk7DQoJCWJyZWFrOw0KDQoJCWNhc2UgIndtcCI6DQoJCQlzICs9IGdldEJvb2woJ3dtcCcsICdhdXRvc3RhcnQnLCB0cnVlKTsNCgkJCXMgKz0gZ2V0Qm9vbCgnd21wJywgJ2VuYWJsZWQnLCBmYWxzZSk7DQoJCQlzICs9IGdldEJvb2woJ3dtcCcsICdlbmFibGVjb250ZXh0bWVudScsIHRydWUpOw0KCQkJcyArPSBnZXRCb29sKCd3bXAnLCAnZnVsbHNjcmVlbicsIGZhbHNlKTsNCgkJCXMgKz0gZ2V0Qm9vbCgnd21wJywgJ2ludm9rZXVybHMnLCB0cnVlKTsNCgkJCXMgKz0gZ2V0Qm9vbCgnd21wJywgJ211dGUnLCBmYWxzZSk7DQoJCQlzICs9IGdldEJvb2woJ3dtcCcsICdzdHJldGNodG9maXQnLCBmYWxzZSk7DQoJCQlzICs9IGdldEJvb2woJ3dtcCcsICd3aW5kb3dsZXNzdmlkZW8nLCBmYWxzZSk7DQoJCQlzICs9IGdldFN0cignd21wJywgJ2JhbGFuY2UnKTsNCgkJCXMgKz0gZ2V0U3RyKCd3bXAnLCAnYmFzZXVybCcpOw0KCQkJcyArPSBnZXRTdHIoJ3dtcCcsICdjYXB0aW9uaW5naWQnKTsNCgkJCXMgKz0gZ2V0U3RyKCd3bXAnLCAnY3VycmVudG1hcmtlcicpOw0KCQkJcyArPSBnZXRTdHIoJ3dtcCcsICdjdXJyZW50cG9zaXRpb24nKTsNCgkJCXMgKz0gZ2V0U3RyKCd3bXAnLCAnZGVmYXVsdGZyYW1lJyk7DQoJCQlzICs9IGdldFN0cignd21wJywgJ3BsYXljb3VudCcpOw0KCQkJcyArPSBnZXRTdHIoJ3dtcCcsICdyYXRlJyk7DQoJCQlzICs9IGdldFN0cignd21wJywgJ3VpbW9kZScpOw0KCQkJcyArPSBnZXRTdHIoJ3dtcCcsICd2b2x1bWUnKTsNCgkJYnJlYWs7DQoNCgkJY2FzZSAicm1wIjoNCgkJCXMgKz0gZ2V0Qm9vbCgncm1wJywgJ2F1dG9zdGFydCcsIGZhbHNlKTsNCgkJCXMgKz0gZ2V0Qm9vbCgncm1wJywgJ2xvb3AnLCBmYWxzZSk7DQoJCQlzICs9IGdldEJvb2woJ3JtcCcsICdhdXRvZ290b3VybCcsIHRydWUpOw0KCQkJcyArPSBnZXRCb29sKCdybXAnLCAnY2VudGVyJywgZmFsc2UpOw0KCQkJcyArPSBnZXRCb29sKCdybXAnLCAnaW1hZ2VzdGF0dXMnLCB0cnVlKTsNCgkJCXMgKz0gZ2V0Qm9vbCgncm1wJywgJ21haW50YWluYXNwZWN0JywgZmFsc2UpOw0KCQkJcyArPSBnZXRCb29sKCdybXAnLCAnbm9qYXZhJywgZmFsc2UpOw0KCQkJcyArPSBnZXRCb29sKCdybXAnLCAncHJlZmV0Y2gnLCBmYWxzZSk7DQoJCQlzICs9IGdldEJvb2woJ3JtcCcsICdzaHVmZmxlJywgZmFsc2UpOw0KCQkJcyArPSBnZXRTdHIoJ3JtcCcsICdjb25zb2xlJyk7DQoJCQlzICs9IGdldFN0cigncm1wJywgJ2NvbnRyb2xzJyk7DQoJCQlzICs9IGdldFN0cigncm1wJywgJ251bWxvb3AnKTsNCgkJCXMgKz0gZ2V0U3RyKCdybXAnLCAnc2NyaXB0Y2FsbGJhY2tzJyk7DQoJCWJyZWFrOw0KCX0NCg0KCXMgKz0gZ2V0U3RyKG51bGwsICdpZCcpOw0KCXMgKz0gZ2V0U3RyKG51bGwsICduYW1lJyk7DQoJcyArPSBnZXRTdHIobnVsbCwgJ3NyYycpOw0KCXMgKz0gZ2V0U3RyKG51bGwsICdhbGlnbicpOw0KCXMgKz0gZ2V0U3RyKG51bGwsICdiZ2NvbG9yJyk7DQoJcyArPSBnZXRJbnQobnVsbCwgJ3ZzcGFjZScpOw0KCXMgKz0gZ2V0SW50KG51bGwsICdoc3BhY2UnKTsNCglzICs9IGdldFN0cihudWxsLCAnd2lkdGgnKTsNCglzICs9IGdldFN0cihudWxsLCAnaGVpZ2h0Jyk7DQoNCglzID0gcy5sZW5ndGggPiAwID8gcy5zdWJzdHJpbmcoMCwgcy5sZW5ndGggLSAxKSA6IHM7DQoNCglyZXR1cm4gczsNCn0NCg0KZnVuY3Rpb24gc2V0Qm9vbChwbCwgcCwgbikgew0KCWlmICh0eXBlb2YocGxbbl0pID09ICJ1bmRlZmluZWQiKQ0KCQlyZXR1cm47DQoNCglkb2N1bWVudC5mb3Jtc1swXS5lbGVtZW50c1twICsgIl8iICsgbl0uY2hlY2tlZCA9IHBsW25dICE9ICdmYWxzZSc7DQp9DQoNCmZ1bmN0aW9uIHNldFN0cihwbCwgcCwgbikgew0KCXZhciBmID0gZG9jdW1lbnQuZm9ybXNbMF0sIGUgPSBmLmVsZW1lbnRzWyhwICE9IG51bGwgPyBwICsgIl8iIDogJycpICsgbl07DQoNCglpZiAodHlwZW9mKHBsW25dKSA9PSAidW5kZWZpbmVkIikNCgkJcmV0dXJuOw0KDQoJaWYgKGUudHlwZSA9PSAidGV4dCIpDQoJCWUudmFsdWUgPSBwbFtuXTsNCgllbHNlDQoJCXNlbGVjdEJ5VmFsdWUoZiwgKHAgIT0gbnVsbCA/IHAgKyAiXyIgOiAnJykgKyBuLCBwbFtuXSk7DQp9DQoNCmZ1bmN0aW9uIGdldEJvb2wocCwgbiwgZCwgdHYsIGZ2KSB7DQoJdmFyIHYgPSBkb2N1bWVudC5mb3Jtc1swXS5lbGVtZW50c1twICsgIl8iICsgbl0uY2hlY2tlZDsNCg0KCXR2ID0gdHlwZW9mKHR2KSA9PSAndW5kZWZpbmVkJyA/ICd0cnVlJyA6ICInIiArIGpzRW5jb2RlKHR2KSArICInIjsNCglmdiA9IHR5cGVvZihmdikgPT0gJ3VuZGVmaW5lZCcgPyAnZmFsc2UnIDogIiciICsganNFbmNvZGUoZnYpICsgIiciOw0KDQoJcmV0dXJuICh2ID09IGQpID8gJycgOiBuICsgKHYgPyAnOicgKyB0diArICcsJyA6ICI6XCciICsgZnYgKyAiXCcsIik7DQp9DQoNCmZ1bmN0aW9uIGdldFN0cihwLCBuLCBkKSB7DQoJdmFyIGUgPSBkb2N1bWVudC5mb3Jtc1swXS5lbGVtZW50c1socCAhPSBudWxsID8gcCArICJfIiA6ICIiKSArIG5dOw0KCXZhciB2ID0gZS50eXBlID09ICJ0ZXh0IiA/IGUudmFsdWUgOiBlLm9wdGlvbnNbZS5zZWxlY3RlZEluZGV4XS52YWx1ZTsNCg0KCWlmIChuID09ICdzcmMnKQ0KCQl2ID0gdGlueU1DRVBvcHVwLmVkaXRvci5jb252ZXJ0VVJMKHYsICdzcmMnLCBudWxsKTsNCg0KCXJldHVybiAoKG4gPT0gZCB8fCB2ID09ICcnKSA/ICcnIDogbiArICI6JyIgKyBqc0VuY29kZSh2KSArICInLCIpOw0KfQ0KDQpmdW5jdGlvbiBnZXRJbnQocCwgbiwgZCkgew0KCXZhciBlID0gZG9jdW1lbnQuZm9ybXNbMF0uZWxlbWVudHNbKHAgIT0gbnVsbCA/IHAgKyAiXyIgOiAiIikgKyBuXTsNCgl2YXIgdiA9IGUudHlwZSA9PSAidGV4dCIgPyBlLnZhbHVlIDogZS5vcHRpb25zW2Uuc2VsZWN0ZWRJbmRleF0udmFsdWU7DQoNCglyZXR1cm4gKChuID09IGQgfHwgdiA9PSAnJykgPyAnJyA6IG4gKyAiOiIgKyB2LnJlcGxhY2UoL1teMC05XSsvZywgJycpICsgIiwiKTsNCn0NCg0KZnVuY3Rpb24ganNFbmNvZGUocykgew0KCXMgPSBzLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXCcsICdnJyksICdcXFxcJyk7DQoJcyA9IHMucmVwbGFjZShuZXcgUmVnRXhwKCciJywgJ2cnKSwgJ1xcIicpOw0KCXMgPSBzLnJlcGxhY2UobmV3IFJlZ0V4cCgiJyIsICdnJyksICJcXCciKTsNCg0KCXJldHVybiBzOw0KfQ0KDQpmdW5jdGlvbiBnZW5lcmF0ZVByZXZpZXcoYykgew0KCXZhciBmID0gZG9jdW1lbnQuZm9ybXNbMF0sIHAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldicpLCBoID0gJycsIGNscywgcGwsIG4sIHR5cGUsIGNvZGViYXNlLCB3cCwgaHAsIG53LCBuaDsNCg0KCXAuaW5uZXJIVE1MID0gJzwhLS0geCAtLS0+JzsNCg0KCW53ID0gcGFyc2VJbnQoZi53aWR0aC52YWx1ZSk7DQoJbmggPSBwYXJzZUludChmLmhlaWdodC52YWx1ZSk7DQoNCglpZiAoZi53aWR0aC52YWx1ZSAhPSAiIiAmJiBmLmhlaWdodC52YWx1ZSAhPSAiIikgew0KCQlpZiAoZi5jb25zdHJhaW4uY2hlY2tlZCkgew0KCQkJaWYgKGMgPT0gJ3dpZHRoJyAmJiBvbGRXaWR0aCAhPSAwKSB7DQoJCQkJd3AgPSBudyAvIG9sZFdpZHRoOw0KCQkJCW5oID0gTWF0aC5yb3VuZCh3cCAqIG5oKTsNCgkJCQlmLmhlaWdodC52YWx1ZSA9IG5oOw0KCQkJfSBlbHNlIGlmIChjID09ICdoZWlnaHQnICYmIG9sZEhlaWdodCAhPSAwKSB7DQoJCQkJaHAgPSBuaCAvIG9sZEhlaWdodDsNCgkJCQludyA9IE1hdGgucm91bmQoaHAgKiBudyk7DQoJCQkJZi53aWR0aC52YWx1ZSA9IG53Ow0KCQkJfQ0KCQl9DQoJfQ0KDQoJaWYgKGYud2lkdGgudmFsdWUgIT0gIiIpDQoJCW9sZFdpZHRoID0gbnc7DQoNCglpZiAoZi5oZWlnaHQudmFsdWUgIT0gIiIpDQoJCW9sZEhlaWdodCA9IG5oOw0KDQoJLy8gQWZ0ZXIgY29uc3RyYWluDQoJcGwgPSBzZXJpYWxpemVQYXJhbWV0ZXJzKCk7DQoNCglzd2l0Y2ggKGYubWVkaWFfdHlwZS5vcHRpb25zW2YubWVkaWFfdHlwZS5zZWxlY3RlZEluZGV4XS52YWx1ZSkgew0KCQljYXNlICJmbGFzaCI6DQoJCQljbHMgPSAnY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwJzsNCgkJCWNvZGViYXNlID0gJ2h0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5jYWIjdmVyc2lvbj02LDAsNDAsMCc7DQoJCQl0eXBlID0gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJzsNCgkJCWJyZWFrOw0KDQoJCWNhc2UgInNob2Nrd2F2ZSI6DQoJCQljbHMgPSAnY2xzaWQ6MTY2QjFCQ0EtM0Y5Qy0xMUNGLTgwNzUtNDQ0NTUzNTQwMDAwJzsNCgkJCWNvZGViYXNlID0gJ2h0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZGlyZWN0b3Ivc3cuY2FiI3ZlcnNpb249OCw1LDEsMCc7DQoJCQl0eXBlID0gJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InOw0KCQkJYnJlYWs7DQoNCgkJY2FzZSAicXQiOg0KCQkJY2xzID0gJ2Nsc2lkOjAyQkYyNUQ1LThDMTctNEIyMy1CQzgwLUQzNDg4QUJEREM2Qic7DQoJCQljb2RlYmFzZSA9ICdodHRwOi8vd3d3LmFwcGxlLmNvbS9xdGFjdGl2ZXgvcXRwbHVnaW4uY2FiI3ZlcnNpb249NiwwLDIsMCc7DQoJCQl0eXBlID0gJ3ZpZGVvL3F1aWNrdGltZSc7DQoJCQlicmVhazsNCg0KCQljYXNlICJ3bXAiOg0KCQkJY2xzID0gZWQuZ2V0UGFyYW0oJ21lZGlhX3dtcDZfY29tcGF0aWJsZScpID8gJ2Nsc2lkOjA1NTg5RkExLUMzNTYtMTFDRS1CRjAxLTAwQUEwMDU1NTk1QScgOiAnY2xzaWQ6NkJGNTJBNTItMzk0QS0xMUQzLUIxNTMtMDBDMDRGNzlGQUE2JzsNCgkJCWNvZGViYXNlID0gJ2h0dHA6Ly9hY3RpdmV4Lm1pY3Jvc29mdC5jb20vYWN0aXZleC9jb250cm9scy9tcGxheWVyL2VuL25zbXAyaW5mLmNhYiNWZXJzaW9uPTUsMSw1Miw3MDEnOw0KCQkJdHlwZSA9ICdhcHBsaWNhdGlvbi94LW1wbGF5ZXIyJzsNCgkJCWJyZWFrOw0KDQoJCWNhc2UgInJtcCI6DQoJCQljbHMgPSAnY2xzaWQ6Q0ZDREFBMDMtOEJFNC0xMWNmLUI4NEItMDAyMEFGQkJDQ0ZBJzsNCgkJCWNvZGViYXNlID0gJ2h0dHA6Ly9hY3RpdmV4Lm1pY3Jvc29mdC5jb20vYWN0aXZleC9jb250cm9scy9tcGxheWVyL2VuL25zbXAyaW5mLmNhYiNWZXJzaW9uPTUsMSw1Miw3MDEnOw0KCQkJdHlwZSA9ICdhdWRpby94LXBuLXJlYWxhdWRpby1wbHVnaW4nOw0KCQkJYnJlYWs7DQoJfQ0KDQoJaWYgKHBsID09ICcnKSB7DQoJCXAuaW5uZXJIVE1MID0gJyc7DQoJCXJldHVybjsNCgl9DQoNCglwbCA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IucGx1Z2lucy5tZWRpYS5fcGFyc2UocGwpOw0KDQoJaWYgKCFwbC5zcmMpIHsNCgkJcC5pbm5lckhUTUwgPSAnJzsNCgkJcmV0dXJuOw0KCX0NCg0KCXBsLnNyYyA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUocGwuc3JjKTsNCglwbC53aWR0aCA9ICFwbC53aWR0aCA/IDEwMCA6IHBsLndpZHRoOw0KCXBsLmhlaWdodCA9ICFwbC5oZWlnaHQgPyAxMDAgOiBwbC5oZWlnaHQ7DQoJcGwuaWQgPSAhcGwuaWQgPyAnb2JqJyA6IHBsLmlkOw0KCXBsLm5hbWUgPSAhcGwubmFtZSA/ICdlb2JqJyA6IHBsLm5hbWU7DQoJcGwuYWxpZ24gPSAhcGwuYWxpZ24gPyAnJyA6IHBsLmFsaWduOw0KDQoJLy8gQXZvaWQgYW5ub3lpbmcgd2FybmluZyBhYm91dCBpbnNlY3VyZSBpdGVtcw0KCWlmICghdGlueW1jZS5pc0lFIHx8IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICE9ICdodHRwczonKSB7DQoJCWggKz0gJzxvYmplY3QgY2xhc3NpZD0iJyArIGNscyArICciIGNvZGViYXNlPSInICsgY29kZWJhc2UgKyAnIiB3aWR0aD0iJyArIHBsLndpZHRoICsgJyIgaGVpZ2h0PSInICsgcGwuaGVpZ2h0ICsgJyIgaWQ9IicgKyBwbC5pZCArICciIG5hbWU9IicgKyBwbC5uYW1lICsgJyIgYWxpZ249IicgKyBwbC5hbGlnbiArICciPic7DQoNCgkJZm9yIChuIGluIHBsKSB7DQoJCQloICs9ICc8cGFyYW0gbmFtZT0iJyArIG4gKyAnIiB2YWx1ZT0iJyArIHBsW25dICsgJyI+JzsNCg0KCQkJLy8gQWRkIGV4dHJhIHVybCBwYXJhbWV0ZXIgaWYgaXQncyBhbiBhYnNvbHV0ZSBVUkwNCgkJCWlmIChuID09ICdzcmMnICYmIHBsW25dLmluZGV4T2YoJzovLycpICE9IC0xKQ0KCQkJCWggKz0gJzxwYXJhbSBuYW1lPSJ1cmwiIHZhbHVlPSInICsgcGxbbl0gKyAnIiAvPic7DQoJCX0NCgl9DQoNCgloICs9ICc8ZW1iZWQgdHlwZT0iJyArIHR5cGUgKyAnIiAnOw0KDQoJZm9yIChuIGluIHBsKQ0KCQloICs9IG4gKyAnPSInICsgcGxbbl0gKyAnIiAnOw0KDQoJaCArPSAnPjwvZW1iZWQ+JzsNCg0KCS8vIEF2b2lkIGFubm95aW5nIHdhcm5pbmcgYWJvdXQgaW5zZWN1cmUgaXRlbXMNCglpZiAoIXRpbnltY2UuaXNJRSB8fCBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCAhPSAnaHR0cHM6JykNCgkJaCArPSAnPC9vYmplY3Q+JzsNCg0KCXAuaW5uZXJIVE1MID0gIjwhLS0geCAtLS0+IiArIGg7DQp9DQoNCnRpbnlNQ0VQb3B1cC5vbkluaXQuYWRkKGluaXQpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5tZWRpYV9kbGcnLHsNCnRpdGxlOiJJbnNlcnQgLyBlZGl0IGVtYmVkZGVkIG1lZGlhIiwNCmdlbmVyYWw6IkdlbmVyYWwiLA0KYWR2YW5jZWQ6IkFkdmFuY2VkIiwNCmZpbGU6IkZpbGUvVVJMIiwNCmxpc3Q6Ikxpc3QiLA0Kc2l6ZToiRGltZW5zaW9ucyIsDQpwcmV2aWV3OiJQcmV2aWV3IiwNCmNvbnN0cmFpbl9wcm9wb3J0aW9uczoiQ29uc3RyYWluIHByb3BvcnRpb25zIiwNCnR5cGU6IlR5cGUiLA0KaWQ6IklkIiwNCm5hbWU6Ik5hbWUiLA0KY2xhc3NfbmFtZToiQ2xhc3MiLA0KdnNwYWNlOiJWLVNwYWNlIiwNCmhzcGFjZToiSC1TcGFjZSIsDQpwbGF5OiJBdXRvIHBsYXkiLA0KbG9vcDoiTG9vcCIsDQptZW51OiJTaG93IG1lbnUiLA0KcXVhbGl0eToiUXVhbGl0eSIsDQpzY2FsZToiU2NhbGUiLA0KYWxpZ246IkFsaWduIiwNCnNhbGlnbjoiU0FsaWduIiwNCndtb2RlOiJXTW9kZSIsDQpiZ2NvbG9yOiJCYWNrZ3JvdW5kIiwNCmJhc2U6IkJhc2UiLA0KZmxhc2h2YXJzOiJGbGFzaHZhcnMiLA0KbGl2ZWNvbm5lY3Q6IlNXTGl2ZUNvbm5lY3QiLA0KYXV0b2hyZWY6IkF1dG9IUkVGIiwNCmNhY2hlOiJDYWNoZSIsDQpoaWRkZW46IkhpZGRlbiIsDQpjb250cm9sbGVyOiJDb250cm9sbGVyIiwNCmtpb3NrbW9kZToiS2lvc2sgbW9kZSIsDQpwbGF5ZXZlcnlmcmFtZToiUGxheSBldmVyeSBmcmFtZSIsDQp0YXJnZXRjYWNoZToiVGFyZ2V0IGNhY2hlIiwNCmNvcnJlY3Rpb246Ik5vIGNvcnJlY3Rpb24iLA0KZW5hYmxlamF2YXNjcmlwdDoiRW5hYmxlIEphdmFTY3JpcHQiLA0Kc3RhcnR0aW1lOiJTdGFydCB0aW1lIiwNCmVuZHRpbWU6IkVuZCB0aW1lIiwNCmhyZWY6IkhyZWYiLA0KcXRzcmNjaG9rZXNwZWVkOiJDaG9rZSBzcGVlZCIsDQp0YXJnZXQ6IlRhcmdldCIsDQp2b2x1bWU6IlZvbHVtZSIsDQphdXRvc3RhcnQ6IkF1dG8gc3RhcnQiLA0KZW5hYmxlZDoiRW5hYmxlZCIsDQpmdWxsc2NyZWVuOiJGdWxsc2NyZWVuIiwNCmludm9rZXVybHM6Ikludm9rZSBVUkxzIiwNCm11dGU6Ik11dGUiLA0Kc3RyZXRjaHRvZml0OiJTdHJldGNoIHRvIGZpdCIsDQp3aW5kb3dsZXNzdmlkZW86IldpbmRvd2xlc3MgdmlkZW8iLA0KYmFsYW5jZToiQmFsYW5jZSIsDQpiYXNldXJsOiJCYXNlIFVSTCIsDQpjYXB0aW9uaW5naWQ6IkNhcHRpb25pbmcgaWQiLA0KY3VycmVudG1hcmtlcjoiQ3VycmVudCBtYXJrZXIiLA0KY3VycmVudHBvc2l0aW9uOiJDdXJyZW50IHBvc2l0aW9uIiwNCmRlZmF1bHRmcmFtZToiRGVmYXVsdCBmcmFtZSIsDQpwbGF5Y291bnQ6IlBsYXkgY291bnQiLA0KcmF0ZToiUmF0ZSIsDQp1aW1vZGU6IlVJIE1vZGUiLA0KZmxhc2hfb3B0aW9uczoiRmxhc2ggb3B0aW9ucyIsDQpxdF9vcHRpb25zOiJRdWlja3RpbWUgb3B0aW9ucyIsDQp3bXBfb3B0aW9uczoiV2luZG93cyBtZWRpYSBwbGF5ZXIgb3B0aW9ucyIsDQpybXBfb3B0aW9uczoiUmVhbCBtZWRpYSBwbGF5ZXIgb3B0aW9ucyIsDQpzaG9ja3dhdmVfb3B0aW9uczoiU2hvY2t3YXZlIG9wdGlvbnMiLA0KYXV0b2dvdG91cmw6IkF1dG8gZ290byBVUkwiLA0KY2VudGVyOiJDZW50ZXIiLA0KaW1hZ2VzdGF0dXM6IkltYWdlIHN0YXR1cyIsDQptYWludGFpbmFzcGVjdDoiTWFpbnRhaW4gYXNwZWN0IiwNCm5vamF2YToiTm8gamF2YSIsDQpwcmVmZXRjaDoiUHJlZmV0Y2giLA0Kc2h1ZmZsZToiU2h1ZmZsZSIsDQpjb25zb2xlOiJDb25zb2xlIiwNCm51bWxvb3A6Ik51bSBsb29wcyIsDQpjb250cm9sczoiQ29udHJvbHMiLA0Kc2NyaXB0Y2FsbGJhY2tzOiJTY3JpcHQgY2FsbGJhY2tzIiwNCnN3c3RyZXRjaHN0eWxlOiJTdHJldGNoIHN0eWxlIiwNCnN3c3RyZXRjaGhhbGlnbjoiU3RyZXRjaCBILUFsaWduIiwNCnN3c3RyZXRjaHZhbGlnbjoiU3RyZXRjaCBWLUFsaWduIiwNCnNvdW5kOiJTb3VuZCIsDQpwcm9ncmVzczoiUHJvZ3Jlc3MiLA0KcXRzcmM6IlFUIFNyYyIsDQpxdF9zdHJlYW1fd2FybjoiU3RyZWFtZWQgcnRzcCByZXNvdXJjZXMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBRVCBTcmMgZmllbGQgdW5kZXIgdGhlIGFkdmFuY2VkIHRhYi5cbllvdSBzaG91bGQgYWxzbyBhZGQgYSBub24gc3RyZWFtZWQgdmVyc2lvbiB0byB0aGUgU3JjIGZpZWxkLi4iLA0KYWxpZ25fdG9wOiJUb3AiLA0KYWxpZ25fcmlnaHQ6IlJpZ2h0IiwNCmFsaWduX2JvdHRvbToiQm90dG9tIiwNCmFsaWduX2xlZnQ6IkxlZnQiLA0KYWxpZ25fY2VudGVyOiJDZW50ZXIiLA0KYWxpZ25fdG9wX2xlZnQ6IlRvcCBsZWZ0IiwNCmFsaWduX3RvcF9yaWdodDoiVG9wIHJpZ2h0IiwNCmFsaWduX2JvdHRvbV9sZWZ0OiJCb3R0b20gbGVmdCIsDQphbGlnbl9ib3R0b21fcmlnaHQ6IkJvdHRvbSByaWdodCIsDQpmbHZfb3B0aW9uczoiRmxhc2ggdmlkZW8gb3B0aW9ucyIsDQpmbHZfc2NhbGVtb2RlOiJTY2FsZSBtb2RlIiwNCmZsdl9idWZmZXI6IkJ1ZmZlciIsDQpmbHZfc3RhcnRpbWFnZToiU3RhcnQgaW1hZ2UiLA0KZmx2X3N0YXJ0dGltZToiU3RhcnQgdGltZSIsDQpmbHZfZGVmYXVsdHZvbHVtZToiRGVmYXVsdCB2b2x1bW5lIiwNCmZsdl9oaWRkZW5ndWk6IkhpZGRlbiBHVUkiLA0KZmx2X2F1dG9zdGFydDoiQXV0byBzdGFydCIsDQpmbHZfbG9vcDoiTG9vcCIsDQpmbHZfc2hvd3NjYWxlbW9kZXM6IlNob3cgc2NhbGUgbW9kZXMiLA0KZmx2X3Ntb290aHZpZGVvOiJTbW9vdGggdmlkZW8iLA0KZmx2X2pzY2FsbGJhY2s6IkpTIENhbGxiYWNrIg0KfSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/media/media.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjbWVkaWFfZGxnLnRpdGxlfTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9tZWRpYS5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9tY3RhYnMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvdmFsaWRhdGUuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZm9ybV91dGlscy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9lZGl0YWJsZV9zZWxlY3RzLmpzIj48L3NjcmlwdD4KCTxsaW5rIGhyZWY9ImNzcy9tZWRpYS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+CjwvaGVhZD4KPGJvZHkgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgogICAgPGZvcm0gb25zdWJtaXQ9Imluc2VydE1lZGlhKCk7cmV0dXJuIGZhbHNlOyIgYWN0aW9uPSIjIj4KCQk8ZGl2IGNsYXNzPSJ0YWJzIj4KCQkJPHVsPgoJCQkJPGxpIGlkPSJnZW5lcmFsX3RhYiIgY2xhc3M9ImN1cnJlbnQiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2dlbmVyYWxfdGFiJywnZ2VuZXJhbF9wYW5lbCcpO2dlbmVyYXRlUHJldmlldygpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjbWVkaWFfZGxnLmdlbmVyYWx9PC9hPjwvc3Bhbj48L2xpPgoJCQkJPGxpIGlkPSJhZHZhbmNlZF90YWIiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2FkdmFuY2VkX3RhYicsJ2FkdmFuY2VkX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNtZWRpYV9kbGcuYWR2YW5jZWR9PC9hPjwvc3Bhbj48L2xpPgoJCQk8L3VsPgoJCTwvZGl2PgoKCQk8ZGl2IGNsYXNzPSJwYW5lbF93cmFwcGVyIj4KCQkJPGRpdiBpZD0iZ2VuZXJhbF9wYW5lbCIgY2xhc3M9InBhbmVsIGN1cnJlbnQiPgoJCQkJPGZpZWxkc2V0PgoJCQkJCTxsZWdlbmQ+eyNtZWRpYV9kbGcuZ2VuZXJhbH08L2xlZ2VuZD4KCgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCTx0cj4KCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0ibWVkaWFfdHlwZSI+eyNtZWRpYV9kbGcudHlwZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJPHRkPgoJCQkJCQkJCQk8c2VsZWN0IGlkPSJtZWRpYV90eXBlIiBuYW1lPSJtZWRpYV90eXBlIiBvbmNoYW5nZT0iY2hhbmdlZFR5cGUodGhpcy52YWx1ZSk7Z2VuZXJhdGVQcmV2aWV3KCk7Ij4KCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImZsYXNoIj5GbGFzaDwvb3B0aW9uPgoJCQkJCQkJCQkJPCEtLSA8b3B0aW9uIHZhbHVlPSJmbHYiPkZsYXNoIHZpZGVvIChGTFYpPC9vcHRpb24+IC0tPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icXQiPlF1aWNrdGltZTwvb3B0aW9uPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ic2hvY2t3YXZlIj5TaG9ja3dhdmU8L29wdGlvbj4KCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IndtcCI+V2luZG93cyBNZWRpYTwvb3B0aW9uPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icm1wIj5SZWFsIE1lZGlhPC9vcHRpb24+CgkJCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQkJCTwvdGQ+CgkJCQkJCQk8L3RyPgoJCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InNyYyI+eyNtZWRpYV9kbGcuZmlsZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQkgIDx0ZD4KCQkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQkJCQkJICA8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJzcmMiIG5hbWU9InNyYyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9Im1jZUZvY3VzIiBvbmNoYW5nZT0ic3dpdGNoVHlwZSh0aGlzLnZhbHVlKTtnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZCBpZD0iZmlsZWJyb3dzZXJjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCSAgPC90cj4KCQkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCQk8L3RkPgoJCQkJCQkJPC90cj4KCQkJCQkJCTx0ciBpZD0ibGlua2xpc3Ryb3ciPgoJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJsaW5rbGlzdCI+eyNtZWRpYV9kbGcubGlzdH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJPHRkIGlkPSJsaW5rbGlzdGNvbnRhaW5lciI+PHNlbGVjdCBpZD0ibGlua2xpc3QiPjxvcHRpb24gdmFsdWU9IiI+PC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJCTwvdHI+CgkJCQkJCQk8dHI+CgkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndpZHRoIj57I21lZGlhX2RsZy5zaXplfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQk8dGQ+CgkJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0id2lkdGgiIG5hbWU9IndpZHRoIiB2YWx1ZT0iIiBjbGFzcz0ic2l6ZSIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygnd2lkdGgnKTsiIC8+IHggPGlucHV0IHR5cGU9InRleHQiIGlkPSJoZWlnaHQiIG5hbWU9ImhlaWdodCIgdmFsdWU9IiIgY2xhc3M9InNpemUiICBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCdoZWlnaHQnKTsiIC8+PC90ZD4KCQkJCQkJCQkJCQk8dGQ+Jm5ic3A7Jm5ic3A7PGlucHV0IGlkPSJjb25zdHJhaW4iIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJjb25zdHJhaW4iIGNsYXNzPSJjaGVja2JveCIgLz48L3RkPgoJCQkJCQkJCQkJCTx0ZD48bGFiZWwgaWQ9ImNvbnN0cmFpbmxhYmVsIiBmb3I9ImNvbnN0cmFpbiI+eyNtZWRpYV9kbGcuY29uc3RyYWluX3Byb3BvcnRpb25zfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJCTwvdGFibGU+CgkJCQkJCQkJPC90ZD4KCQkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgoJCQkJPGZpZWxkc2V0PgoJCQkJCTxsZWdlbmQ+eyNtZWRpYV9kbGcucHJldmlld308L2xlZ2VuZD4KCQkJCQk8ZGl2IGlkPSJwcmV2Ij48L2Rpdj4KCQkJCTwvZmllbGRzZXQ+CgkJCTwvZGl2PgoKCQkJPGRpdiBpZD0iYWR2YW5jZWRfcGFuZWwiIGNsYXNzPSJwYW5lbCI+CgkJCQk8ZmllbGRzZXQ+CgkJCQkJPGxlZ2VuZD57I21lZGlhX2RsZy5hZHZhbmNlZH08L2xlZ2VuZD4KCgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJpZCI+eyNtZWRpYV9kbGcuaWR9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaWQiIG5hbWU9ImlkIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0ibmFtZSI+eyNtZWRpYV9kbGcubmFtZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJuYW1lIiBuYW1lPSJuYW1lIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iYWxpZ24iPnsjbWVkaWFfZGxnLmFsaWdufTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD4KCQkJCQkJCQk8c2VsZWN0IGlkPSJhbGlnbiIgbmFtZT0iYWxpZ24iIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InRvcCI+eyNtZWRpYV9kbGcuYWxpZ25fdG9wfTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJyaWdodCI+eyNtZWRpYV9kbGcuYWxpZ25fcmlnaHR9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImJvdHRvbSI+eyNtZWRpYV9kbGcuYWxpZ25fYm90dG9tfTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJsZWZ0Ij57I21lZGlhX2RsZy5hbGlnbl9sZWZ0fTwvb3B0aW9uPgoJCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iYmdjb2xvciI+eyNtZWRpYV9kbGcuYmdjb2xvcn08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCBpZD0iYmdjb2xvciIgbmFtZT0iYmdjb2xvciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iOSIgb25jaGFuZ2U9InVwZGF0ZUNvbG9yKCdiZ2NvbG9yX3BpY2snLCdiZ2NvbG9yJyk7Z2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQgaWQ9ImJnY29sb3JfcGlja2NvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJ2c3BhY2UiPnsjbWVkaWFfZGxnLnZzcGFjZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJ2c3BhY2UiIG5hbWU9InZzcGFjZSIgY2xhc3M9Im51bWJlciIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9ImhzcGFjZSI+eyNtZWRpYV9kbGcuaHNwYWNlfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImhzcGFjZSIgbmFtZT0iaHNwYWNlIiBjbGFzcz0ibnVtYmVyIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgoJCQkJPGZpZWxkc2V0IGlkPSJmbGFzaF9vcHRpb25zIj4KCQkJCQk8bGVnZW5kPnsjbWVkaWFfZGxnLmZsYXNoX29wdGlvbnN9PC9sZWdlbmQ+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJmbGFzaF9xdWFsaXR5Ij57I21lZGlhX2RsZy5xdWFsaXR5fTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD4KCQkJCQkJCQk8c2VsZWN0IGlkPSJmbGFzaF9xdWFsaXR5IiBuYW1lPSJmbGFzaF9xdWFsaXR5IiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7Ij4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJoaWdoIj5oaWdoPC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImxvdyI+bG93PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImF1dG9sb3ciPmF1dG9sb3c8L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYXV0b2hpZ2giPmF1dG9oaWdoPC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImJlc3QiPmJlc3Q8L29wdGlvbj4KCQkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9ImZsYXNoX3NjYWxlIj57I21lZGlhX2RsZy5zY2FsZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHNlbGVjdCBpZD0iZmxhc2hfc2NhbGUiIG5hbWU9ImZsYXNoX3NjYWxlIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7Ij4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJzaG93YWxsIj5zaG93YWxsPC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Im5vYm9yZGVyIj5ub2JvcmRlcjwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJleGFjdGZpdCI+ZXhhY3RmaXQ8L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibm9zY2FsZSI+bm9zY2FsZTwvb3B0aW9uPgoJCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJmbGFzaF93bW9kZSI+eyNtZWRpYV9kbGcud21vZGV9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPgoJCQkJCQkJCTxzZWxlY3QgaWQ9ImZsYXNoX3dtb2RlIiBuYW1lPSJmbGFzaF93bW9kZSIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyI+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPiAKCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0id2luZG93Ij53aW5kb3c8L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ib3BhcXVlIj5vcGFxdWU8L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idHJhbnNwYXJlbnQiPnRyYW5zcGFyZW50PC9vcHRpb24+CgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPgoKCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJmbGFzaF9zYWxpZ24iPnsjbWVkaWFfZGxnLnNhbGlnbn08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHNlbGVjdCBpZD0iZmxhc2hfc2FsaWduIiBuYW1lPSJmbGFzaF9zYWxpZ24iIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImwiPnsjbWVkaWFfZGxnLmFsaWduX2xlZnR9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InQiPnsjbWVkaWFfZGxnLmFsaWduX3RvcH08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iciI+eyNtZWRpYV9kbGcuYWxpZ25fcmlnaHR9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImIiPnsjbWVkaWFfZGxnLmFsaWduX2JvdHRvbX08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idGwiPnsjbWVkaWFfZGxnLmFsaWduX3RvcF9sZWZ0fTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJ0ciI+eyNtZWRpYV9kbGcuYWxpZ25fdG9wX3JpZ2h0fTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJibCI+eyNtZWRpYV9kbGcuYWxpZ25fYm90dG9tX2xlZnR9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImJyIj57I21lZGlhX2RsZy5hbGlnbl9ib3R0b21fcmlnaHR9PC9vcHRpb24+CgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9ImZsYXNoX3BsYXkiIG5hbWU9ImZsYXNoX3BsYXkiIGNoZWNrZWQ9ImNoZWNrZWQiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJmbGFzaF9wbGF5Ij57I21lZGlhX2RsZy5wbGF5fTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0iZmxhc2hfbG9vcCIgbmFtZT0iZmxhc2hfbG9vcCIgY2hlY2tlZD0iY2hlY2tlZCIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9ImZsYXNoX2xvb3AiPnsjbWVkaWFfZGxnLmxvb3B9PC9sYWJlbD48L3RkPgoJCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTwvdGFibGU+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9ImZsYXNoX21lbnUiIG5hbWU9ImZsYXNoX21lbnUiIGNoZWNrZWQ9ImNoZWNrZWQiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJmbGFzaF9tZW51Ij57I21lZGlhX2RsZy5tZW51fTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0iZmxhc2hfc3dsaXZlY29ubmVjdCIgbmFtZT0iZmxhc2hfc3dsaXZlY29ubmVjdCIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9ImZsYXNoX3N3bGl2ZWNvbm5lY3QiPnsjbWVkaWFfZGxnLmxpdmVjb25uZWN0fTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoKCQkJCQk8dGFibGU+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJmbGFzaF9iYXNlIj57I21lZGlhX2RsZy5iYXNlfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImZsYXNoX2Jhc2UiIG5hbWU9ImZsYXNoX2Jhc2UiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJmbGFzaF9mbGFzaHZhcnMiPnsjbWVkaWFfZGxnLmZsYXNodmFyc308L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJmbGFzaF9mbGFzaHZhcnMiIG5hbWU9ImZsYXNoX2ZsYXNodmFycyIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgkJCQk8L2ZpZWxkc2V0PgoKCQkJCTxmaWVsZHNldCBpZD0iZmx2X29wdGlvbnMiPgoJCQkJCTxsZWdlbmQ+eyNtZWRpYV9kbGcuZmx2X29wdGlvbnN9PC9sZWdlbmQ+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJmbHZfc2NhbGVtb2RlIj57I21lZGlhX2RsZy5mbHZfc2NhbGVtb2RlfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD4KCQkJCQkJCQk8c2VsZWN0IGlkPSJmbHZfc2NhbGVtb2RlIiBuYW1lPSJmbHZfc2NhbGVtb2RlIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7Ij4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJub25lIj5ub25lPC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImRvdWJsZSI+ZG91YmxlPC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImZ1bGwiPmZ1bGw8L29wdGlvbj4KCQkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9ImZsdl9idWZmZXIiPnsjbWVkaWFfZGxnLmZsdl9idWZmZXJ9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZmx2X2J1ZmZlciIgbmFtZT0iZmx2X2J1ZmZlciIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9ImZsdl9zdGFydGltYWdlIj57I21lZGlhX2RsZy5mbHZfc3RhcnRpbWFnZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJmbHZfc3RhcnRpbWFnZSIgbmFtZT0iZmx2X3N0YXJ0aW1hZ2UiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iZmx2X3N0YXJ0dGltZSI+eyNtZWRpYV9kbGcuZmx2X3N0YXJ0dGltZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJmbHZfc3RhcnR0aW1lIiBuYW1lPSJmbHZfc3RhcnR0aW1lIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iZmx2X2RlZmF1bHR2b2x1bWUiPnsjbWVkaWFfZGxnLmZsdl9kZWZhdWx0dm9sdW1lfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImZsdl9kZWZhdWx0dm9sdW1lIiBuYW1lPSJmbHZfZGVmYXVsdHZvbHVtZSIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoKCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0iZmx2X2hpZGRlbmd1aSIgbmFtZT0iZmx2X2hpZGRlbmd1aSIgY2hlY2tlZD0iY2hlY2tlZCIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9ImZsdl9oaWRkZW5ndWkiPnsjbWVkaWFfZGxnLmZsdl9oaWRkZW5ndWl9PC9sYWJlbD48L3RkPgoJCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTwvdGFibGU+CgkJCQkJCQk8L3RkPgoKCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3giIGlkPSJmbHZfYXV0b3N0YXJ0IiBuYW1lPSJmbHZfYXV0b3N0YXJ0IiBjaGVja2VkPSJjaGVja2VkIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iZmx2X2F1dG9zdGFydCI+eyNtZWRpYV9kbGcuZmx2X2F1dG9zdGFydH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0iZmx2X2xvb3AiIG5hbWU9ImZsdl9sb29wIiBjaGVja2VkPSJjaGVja2VkIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iZmx2X2xvb3AiPnsjbWVkaWFfZGxnLmZsdl9sb29wfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0iZmx2X3Nob3dzY2FsZW1vZGVzIiBuYW1lPSJmbHZfc2hvd3NjYWxlbW9kZXMiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJmbHZfc2hvd3NjYWxlbW9kZXMiPnsjbWVkaWFfZGxnLmZsdl9zaG93c2NhbGVtb2Rlc308L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0iZmx2X3Ntb290aHZpZGVvIiBuYW1lPSJmbGFzaF9mbHZfZmx2X3Ntb290aHZpZGVvc21vb3RodmlkZW8iIGNoZWNrZWQ9ImNoZWNrZWQiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJmbHZfc21vb3RodmlkZW8iPnsjbWVkaWFfZGxnLmZsdl9zbW9vdGh2aWRlb308L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9ImZsdl9qc2NhbGxiYWNrIiBuYW1lPSJmbHZfanNjYWxsYmFjayIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9ImZsdl9qc2NhbGxiYWNrIj57I21lZGlhX2RsZy5mbHZfanNjYWxsYmFja308L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgoJCQkJPGZpZWxkc2V0IGlkPSJxdF9vcHRpb25zIj4KCQkJCQk8bGVnZW5kPnsjbWVkaWFfZGxnLnF0X29wdGlvbnN9PC9sZWdlbmQ+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3giIGlkPSJxdF9sb29wIiBuYW1lPSJxdF9sb29wIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icXRfbG9vcCI+eyNtZWRpYV9kbGcubG9vcH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9InF0X2F1dG9wbGF5IiBuYW1lPSJxdF9hdXRvcGxheSIgY2hlY2tlZD0iY2hlY2tlZCIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InF0X2F1dG9wbGF5Ij57I21lZGlhX2RsZy5wbGF5fTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3giIGlkPSJxdF9jYWNoZSIgbmFtZT0icXRfY2FjaGUiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJxdF9jYWNoZSI+eyNtZWRpYV9kbGcuY2FjaGV9PC9sYWJlbD48L3RkPgoJCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTwvdGFibGU+CgkJCQkJCQk8L3RkPgoKCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3giIGlkPSJxdF9jb250cm9sbGVyIiBuYW1lPSJxdF9jb250cm9sbGVyIiBjaGVja2VkPSJjaGVja2VkIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icXRfY29udHJvbGxlciI+eyNtZWRpYV9kbGcuY29udHJvbGxlcn08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0icXRfY29ycmVjdGlvbiIgbmFtZT0icXRfY29ycmVjdGlvbiIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InF0X2NvcnJlY3Rpb24iPnsjbWVkaWFfZGxnLmNvcnJlY3Rpb259PC9sYWJlbD48L3RkPgoJCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTwvdGFibGU+CgkJCQkJCQk8L3RkPgoKCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3giIGlkPSJxdF9lbmFibGVqYXZhc2NyaXB0IiBuYW1lPSJxdF9lbmFibGVqYXZhc2NyaXB0IiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icXRfZW5hYmxlamF2YXNjcmlwdCI+eyNtZWRpYV9kbGcuZW5hYmxlamF2YXNjcmlwdH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0icXRfa2lvc2ttb2RlIiBuYW1lPSJxdF9raW9za21vZGUiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJxdF9raW9za21vZGUiPnsjbWVkaWFfZGxnLmtpb3NrbW9kZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9InF0X2F1dG9ocmVmIiBuYW1lPSJxdF9hdXRvaHJlZiIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InF0X2F1dG9ocmVmIj57I21lZGlhX2RsZy5hdXRvaHJlZn08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0icXRfcGxheWV2ZXJ5ZnJhbWUiIG5hbWU9InF0X3BsYXlldmVyeWZyYW1lIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icXRfcGxheWV2ZXJ5ZnJhbWUiPnsjbWVkaWFfZGxnLnBsYXlldmVyeWZyYW1lfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0icXRfdGFyZ2V0Y2FjaGUiIG5hbWU9InF0X3RhcmdldGNhY2hlIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icXRfdGFyZ2V0Y2FjaGUiPnsjbWVkaWFfZGxnLnRhcmdldGNhY2hlfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJxdF9zY2FsZSI+eyNtZWRpYV9kbGcuc2NhbGV9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxzZWxlY3QgaWQ9InF0X3NjYWxlIiBuYW1lPSJxdF9zY2FsZSIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0IiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7Ij4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+IAoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJ0b2ZpdCI+dG9maXQ8L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYXNwZWN0Ij5hc3BlY3Q8L29wdGlvbj4KCQkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icXRfc3RhcnR0aW1lIj57I21lZGlhX2RsZy5zdGFydHRpbWV9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXRfc3RhcnR0aW1lIiBuYW1lPSJxdF9zdGFydHRpbWUiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icXRfZW5kdGltZSI+eyNtZWRpYV9kbGcuZW5kdGltZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJxdF9lbmR0aW1lIiBuYW1lPSJxdF9lbmR0aW1lIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icXRfdGFyZ2V0Ij57I21lZGlhX2RsZy50YXJnZXR9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXRfdGFyZ2V0IiBuYW1lPSJxdF90YXJnZXQiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icXRfaHJlZiI+eyNtZWRpYV9kbGcuaHJlZn08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJxdF9ocmVmIiBuYW1lPSJxdF9ocmVmIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icXRfcXRzcmNjaG9rZXNwZWVkIj57I21lZGlhX2RsZy5xdHNyY2Nob2tlc3BlZWR9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXRfcXRzcmNjaG9rZXNwZWVkIiBuYW1lPSJxdF9xdHNyY2Nob2tlc3BlZWQiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icXRfdm9sdW1lIj57I21lZGlhX2RsZy52b2x1bWV9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXRfdm9sdW1lIiBuYW1lPSJxdF92b2x1bWUiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJxdF9xdHNyYyI+eyNtZWRpYV9kbGcucXRzcmN9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkIGNvbHNwYW49IjQiPgoJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQkJCQkgIDx0cj4KCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXRfcXRzcmMiIG5hbWU9InF0X3F0c3JjIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQkJCTx0ZCBpZD0icXRzcmNmaWxlYnJvd3NlcmNvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJCQkJCQkgIDwvdHI+CgkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC9maWVsZHNldD4KCgkJCQk8ZmllbGRzZXQgaWQ9IndtcF9vcHRpb25zIj4KCQkJCQk8bGVnZW5kPnsjbWVkaWFfZGxnLndtcF9vcHRpb25zfTwvbGVnZW5kPgoKCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0id21wX2F1dG9zdGFydCIgbmFtZT0id21wX2F1dG9zdGFydCIgY2hlY2tlZD0iY2hlY2tlZCIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndtcF9hdXRvc3RhcnQiPnsjbWVkaWFfZGxnLmF1dG9zdGFydH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9IndtcF9lbmFibGVkIiBuYW1lPSJ3bXBfZW5hYmxlZCIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndtcF9lbmFibGVkIj57I21lZGlhX2RsZy5lbmFibGVkfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3giIGlkPSJ3bXBfZW5hYmxlY29udGV4dG1lbnUiIG5hbWU9IndtcF9lbmFibGVjb250ZXh0bWVudSIgY2hlY2tlZD0iY2hlY2tlZCIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndtcF9lbmFibGVjb250ZXh0bWVudSI+eyNtZWRpYV9kbGcubWVudX08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9IndtcF9mdWxsc2NyZWVuIiBuYW1lPSJ3bXBfZnVsbHNjcmVlbiIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndtcF9mdWxsc2NyZWVuIj57I21lZGlhX2RsZy5mdWxsc2NyZWVufTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3giIGlkPSJ3bXBfaW52b2tldXJscyIgbmFtZT0id21wX2ludm9rZXVybHMiIGNoZWNrZWQ9ImNoZWNrZWQiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJ3bXBfaW52b2tldXJscyI+eyNtZWRpYV9kbGcuaW52b2tldXJsc308L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9IndtcF9tdXRlIiBuYW1lPSJ3bXBfbXV0ZSIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndtcF9tdXRlIj57I21lZGlhX2RsZy5tdXRlfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3giIGlkPSJ3bXBfc3RyZXRjaHRvZml0IiBuYW1lPSJ3bXBfc3RyZXRjaHRvZml0IiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0id21wX3N0cmV0Y2h0b2ZpdCI+eyNtZWRpYV9kbGcuc3RyZXRjaHRvZml0fTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0id21wX3dpbmRvd2xlc3N2aWRlbyIgbmFtZT0id21wX3dpbmRvd2xlc3N2aWRlbyIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndtcF93aW5kb3dsZXNzdmlkZW8iPnsjbWVkaWFfZGxnLndpbmRvd2xlc3N2aWRlb308L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0id21wX2JhbGFuY2UiPnsjbWVkaWFfZGxnLmJhbGFuY2V9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0id21wX2JhbGFuY2UiIG5hbWU9IndtcF9iYWxhbmNlIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndtcF9iYXNldXJsIj57I21lZGlhX2RsZy5iYXNldXJsfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9IndtcF9iYXNldXJsIiBuYW1lPSJ3bXBfYmFzZXVybCIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndtcF9jYXB0aW9uaW5naWQiPnsjbWVkaWFfZGxnLmNhcHRpb25pbmdpZH08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJ3bXBfY2FwdGlvbmluZ2lkIiBuYW1lPSJ3bXBfY2FwdGlvbmluZ2lkIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndtcF9jdXJyZW50bWFya2VyIj57I21lZGlhX2RsZy5jdXJyZW50bWFya2VyfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9IndtcF9jdXJyZW50bWFya2VyIiBuYW1lPSJ3bXBfY3VycmVudG1hcmtlciIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndtcF9jdXJyZW50cG9zaXRpb24iPnsjbWVkaWFfZGxnLmN1cnJlbnRwb3NpdGlvbn08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJ3bXBfY3VycmVudHBvc2l0aW9uIiBuYW1lPSJ3bXBfY3VycmVudHBvc2l0aW9uIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9IndtcF9kZWZhdWx0ZnJhbWUiPnsjbWVkaWFfZGxnLmRlZmF1bHRmcmFtZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJ3bXBfZGVmYXVsdGZyYW1lIiBuYW1lPSJ3bXBfZGVmYXVsdGZyYW1lIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0id21wX3BsYXljb3VudCI+eyNtZWRpYV9kbGcucGxheWNvdW50fTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9IndtcF9wbGF5Y291bnQiIG5hbWU9IndtcF9wbGF5Y291bnQiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0id21wX3JhdGUiPnsjbWVkaWFfZGxnLnJhdGV9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0id21wX3JhdGUiIG5hbWU9IndtcF9yYXRlIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0id21wX3VpbW9kZSI+eyNtZWRpYV9kbGcudWltb2RlfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9IndtcF91aW1vZGUiIG5hbWU9IndtcF91aW1vZGUiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0id21wX3ZvbHVtZSI+eyNtZWRpYV9kbGcudm9sdW1lfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9IndtcF92b2x1bWUiIG5hbWU9IndtcF92b2x1bWUiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgoJCQkJPGZpZWxkc2V0IGlkPSJybXBfb3B0aW9ucyI+CgkJCQkJPGxlZ2VuZD57I21lZGlhX2RsZy5ybXBfb3B0aW9uc308L2xlZ2VuZD4KCgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9InJtcF9hdXRvc3RhcnQiIG5hbWU9InJtcF9hdXRvc3RhcnQiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJybXBfYXV0b3N0YXJ0Ij57I21lZGlhX2RsZy5hdXRvc3RhcnR9PC9sYWJlbD48L3RkPgoJCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTwvdGFibGU+CgkJCQkJCQk8L3RkPgoKCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3giIGlkPSJybXBfbG9vcCIgbmFtZT0icm1wX2xvb3AiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJybXBfbG9vcCI+eyNtZWRpYV9kbGcubG9vcH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0icm1wX2F1dG9nb3RvdXJsIiBuYW1lPSJybXBfYXV0b2dvdG91cmwiIGNoZWNrZWQ9ImNoZWNrZWQiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJybXBfYXV0b2dvdG91cmwiPnsjbWVkaWFfZGxnLmF1dG9nb3RvdXJsfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0icm1wX2NlbnRlciIgbmFtZT0icm1wX2NlbnRlciIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InJtcF9jZW50ZXIiPnsjbWVkaWFfZGxnLmNlbnRlcn08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0icm1wX2ltYWdlc3RhdHVzIiBuYW1lPSJybXBfaW1hZ2VzdGF0dXMiIGNoZWNrZWQ9ImNoZWNrZWQiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJybXBfaW1hZ2VzdGF0dXMiPnsjbWVkaWFfZGxnLmltYWdlc3RhdHVzfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0icm1wX21haW50YWluYXNwZWN0IiBuYW1lPSJybXBfbWFpbnRhaW5hc3BlY3QiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJybXBfbWFpbnRhaW5hc3BlY3QiPnsjbWVkaWFfZGxnLm1haW50YWluYXNwZWN0fTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3giIGlkPSJybXBfbm9qYXZhIiBuYW1lPSJybXBfbm9qYXZhIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icm1wX25vamF2YSI+eyNtZWRpYV9kbGcubm9qYXZhfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0icm1wX3ByZWZldGNoIiBuYW1lPSJybXBfcHJlZmV0Y2giIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJybXBfcHJlZmV0Y2giPnsjbWVkaWFfZGxnLnByZWZldGNofTwvbGFiZWw+PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3giIGlkPSJybXBfc2h1ZmZsZSIgbmFtZT0icm1wX3NodWZmbGUiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJybXBfc2h1ZmZsZSI+eyNtZWRpYV9kbGcuc2h1ZmZsZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCSZuYnNwOwoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJybXBfY29uc29sZSI+eyNtZWRpYV9kbGcuY29uc29sZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJybXBfY29uc29sZSIgbmFtZT0icm1wX2NvbnNvbGUiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icm1wX2NvbnRyb2xzIj57I21lZGlhX2RsZy5jb250cm9sc308L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJybXBfY29udHJvbHMiIG5hbWU9InJtcF9jb250cm9scyIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InJtcF9udW1sb29wIj57I21lZGlhX2RsZy5udW1sb29wfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InJtcF9udW1sb29wIiBuYW1lPSJybXBfbnVtbG9vcCIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoKCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJybXBfc2NyaXB0Y2FsbGJhY2tzIj57I21lZGlhX2RsZy5zY3JpcHRjYWxsYmFja3N9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icm1wX3NjcmlwdGNhbGxiYWNrcyIgbmFtZT0icm1wX3NjcmlwdGNhbGxiYWNrcyIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgkJCQk8L2ZpZWxkc2V0PgoKCQkJCTxmaWVsZHNldCBpZD0ic2hvY2t3YXZlX29wdGlvbnMiPgoJCQkJCTxsZWdlbmQ+eyNtZWRpYV9kbGcuc2hvY2t3YXZlX29wdGlvbnN9PC9sZWdlbmQ+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJzaG9ja3dhdmVfc3dzdHJldGNoc3R5bGUiPnsjbWVkaWFfZGxnLnN3c3RyZXRjaHN0eWxlfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD4KCQkJCQkJCQk8c2VsZWN0IGlkPSJzaG9ja3dhdmVfc3dzdHJldGNoc3R5bGUiIG5hbWU9InNob2Nrd2F2ZV9zd3N0cmV0Y2hzdHlsZSIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyI+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Im5vbmUiPnsjbm90X3NldH08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibWVldCI+TWVldDwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJmaWxsIj5GaWxsPC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InN0YWdlIj5TdGFnZTwvb3B0aW9uPgoJCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0ic2hvY2t3YXZlX3N3dm9sdW1lIj57I21lZGlhX2RsZy52b2x1bWV9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ic2hvY2t3YXZlX3N3dm9sdW1lIiBuYW1lPSJzaG9ja3dhdmVfc3d2b2x1bWUiIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiIC8+PC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJzaG9ja3dhdmVfc3dzdHJldGNoaGFsaWduIj57I21lZGlhX2RsZy5zd3N0cmV0Y2hoYWxpZ259PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPgoJCQkJCQkJCTxzZWxlY3QgaWQ9InNob2Nrd2F2ZV9zd3N0cmV0Y2hoYWxpZ24iIG5hbWU9InNob2Nrd2F2ZV9zd3N0cmV0Y2hoYWxpZ24iIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJub25lIj57I25vdF9zZXR9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImxlZnQiPnsjbWVkaWFfZGxnLmFsaWduX2xlZnR9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImNlbnRlciI+eyNtZWRpYV9kbGcuYWxpZ25fY2VudGVyfTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJyaWdodCI+eyNtZWRpYV9kbGcuYWxpZ25fcmlnaHR9PC9vcHRpb24+CgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPgoKCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJzaG9ja3dhdmVfc3dzdHJldGNodmFsaWduIj57I21lZGlhX2RsZy5zd3N0cmV0Y2h2YWxpZ259PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPgoJCQkJCQkJCTxzZWxlY3QgaWQ9InNob2Nrd2F2ZV9zd3N0cmV0Y2h2YWxpZ24iIG5hbWU9InNob2Nrd2F2ZV9zd3N0cmV0Y2h2YWxpZ24iIG9uY2hhbmdlPSJnZW5lcmF0ZVByZXZpZXcoKTsiPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJub25lIj57I25vdF9zZXR9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Im1lZXQiPk1lZXQ8L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iZmlsbCI+RmlsbDwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJzdGFnZSI+U3RhZ2U8L29wdGlvbj4KCQkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiBpZD0ic2hvY2t3YXZlX2F1dG9zdGFydCIgbmFtZT0ic2hvY2t3YXZlX2F1dG9zdGFydCIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgY2hlY2tlZD0iY2hlY2tlZCIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InNob2Nrd2F2ZV9hdXRvc3RhcnQiPnsjbWVkaWFfZGxnLmF1dG9zdGFydH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9InNob2Nrd2F2ZV9zb3VuZCIgbmFtZT0ic2hvY2t3YXZlX3NvdW5kIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiBjaGVja2VkPSJjaGVja2VkIiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0ic2hvY2t3YXZlX3NvdW5kIj57I21lZGlhX2RsZy5zb3VuZH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9InNob2Nrd2F2ZV9zd2xpdmVjb25uZWN0IiBuYW1lPSJzaG9ja3dhdmVfc3dsaXZlY29ubmVjdCIgb25jaGFuZ2U9ImdlbmVyYXRlUHJldmlldygpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InNob2Nrd2F2ZV9zd2xpdmVjb25uZWN0Ij57I21lZGlhX2RsZy5saXZlY29ubmVjdH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGVja2JveCIgaWQ9InNob2Nrd2F2ZV9wcm9ncmVzcyIgbmFtZT0ic2hvY2t3YXZlX3Byb2dyZXNzIiBvbmNoYW5nZT0iZ2VuZXJhdGVQcmV2aWV3KCk7IiBjaGVja2VkPSJjaGVja2VkIiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0ic2hvY2t3YXZlX3Byb2dyZXNzIj57I21lZGlhX2RsZy5wcm9ncmVzc308L2xhYmVsPjwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgkJCTwvZGl2PgoJCTwvZGl2PgoKCQk8ZGl2IGNsYXNzPSJtY2VBY3Rpb25QYW5lbCI+CgkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJpbnNlcnQiIG5hbWU9Imluc2VydCIgdmFsdWU9InsjaW5zZXJ0fSIgLz4KCQkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNhbmNlbCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0ieyNjYW5jZWx9IiBvbmNsaWNrPSJ0aW55TUNFUG9wdXAuY2xvc2UoKTsiIC8+CgkJPC9kaXY+Cgk8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/nonbreaking/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/nonbreaking/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5Ob25icmVha2luZyIse2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO2MuZWRpdG9yPWE7YS5hZGRDb21tYW5kKCJtY2VOb25CcmVha2luZyIsZnVuY3Rpb24oKXthLmV4ZWNDb21tYW5kKCJtY2VJbnNlcnRDb250ZW50IixmYWxzZSwoYS5wbHVnaW5zLnZpc3VhbGNoYXJzJiZhLnBsdWdpbnMudmlzdWFsY2hhcnMuc3RhdGUpPyc8c3BhbiBfbWNlX2JvZ3VzPSIxIiBjbGFzcz0ibWNlSXRlbUhpZGRlbiBtY2VJdGVtTmJzcCI+Jm5ic3A7PC9zcGFuPic6IiZuYnNwOyIpfSk7YS5hZGRCdXR0b24oIm5vbmJyZWFraW5nIix7dGl0bGU6Im5vbmJyZWFraW5nLm5vbmJyZWFraW5nX2Rlc2MiLGNtZDoibWNlTm9uQnJlYWtpbmcifSk7aWYoYS5nZXRQYXJhbSgibm9uYnJlYWtpbmdfZm9yY2VfdGFiIikpe2Eub25LZXlEb3duLmFkZChmdW5jdGlvbihkLGYpe2lmKHRpbnltY2UuaXNJRSYmZi5rZXlDb2RlPT05KXtkLmV4ZWNDb21tYW5kKCJtY2VOb25CcmVha2luZyIpO2QuZXhlY0NvbW1hbmQoIm1jZU5vbkJyZWFraW5nIik7ZC5leGVjQ29tbWFuZCgibWNlTm9uQnJlYWtpbmciKTt0aW55bWNlLmRvbS5FdmVudC5jYW5jZWwoZil9fSl9fSxnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJOb25icmVha2luZyBzcGFjZSIsYXV0aG9yOiJNb3hpZWNvZGUgU3lzdGVtcyBBQiIsYXV0aG9ydXJsOiJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tIixpbmZvdXJsOiJodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvbm9uYnJlYWtpbmciLHZlcnNpb246dGlueW1jZS5tYWpvclZlcnNpb24rIi4iK3RpbnltY2UubWlub3JWZXJzaW9ufX19KTt0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCJub25icmVha2luZyIsdGlueW1jZS5wbHVnaW5zLk5vbmJyZWFraW5nKX0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/nonbreaking/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLk5vbmJyZWFraW5nJywgew0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmVkaXRvciA9IGVkOw0KDQoJCQkvLyBSZWdpc3RlciBjb21tYW5kcw0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlTm9uQnJlYWtpbmcnLCBmdW5jdGlvbigpIHsNCgkJCQllZC5leGVjQ29tbWFuZCgnbWNlSW5zZXJ0Q29udGVudCcsIGZhbHNlLCAoZWQucGx1Z2lucy52aXN1YWxjaGFycyAmJiBlZC5wbHVnaW5zLnZpc3VhbGNoYXJzLnN0YXRlKSA/ICc8c3BhbiBfbWNlX2JvZ3VzPSIxIiBjbGFzcz0ibWNlSXRlbUhpZGRlbiBtY2VJdGVtTmJzcCI+Jm5ic3A7PC9zcGFuPicgOiAnJm5ic3A7Jyk7DQoJCQl9KTsNCg0KCQkJLy8gUmVnaXN0ZXIgYnV0dG9ucw0KCQkJZWQuYWRkQnV0dG9uKCdub25icmVha2luZycsIHt0aXRsZSA6ICdub25icmVha2luZy5ub25icmVha2luZ19kZXNjJywgY21kIDogJ21jZU5vbkJyZWFraW5nJ30pOw0KDQoJCQlpZiAoZWQuZ2V0UGFyYW0oJ25vbmJyZWFraW5nX2ZvcmNlX3RhYicpKSB7DQoJCQkJZWQub25LZXlEb3duLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQlpZiAodGlueW1jZS5pc0lFICYmIGUua2V5Q29kZSA9PSA5KSB7DQoJCQkJCQllZC5leGVjQ29tbWFuZCgnbWNlTm9uQnJlYWtpbmcnKTsNCgkJCQkJCWVkLmV4ZWNDb21tYW5kKCdtY2VOb25CcmVha2luZycpOw0KCQkJCQkJZWQuZXhlY0NvbW1hbmQoJ21jZU5vbkJyZWFraW5nJyk7DQoJCQkJCQl0aW55bWNlLmRvbS5FdmVudC5jYW5jZWwoZSk7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCgkJfSwNCg0KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gew0KCQkJCWxvbmduYW1lIDogJ05vbmJyZWFraW5nIHNwYWNlJywNCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9ub25icmVha2luZycsDQoJCQkJdmVyc2lvbiA6IHRpbnltY2UubWFqb3JWZXJzaW9uICsgIi4iICsgdGlueW1jZS5taW5vclZlcnNpb24NCgkJCX07DQoJCX0NCg0KCQkvLyBQcml2YXRlIG1ldGhvZHMNCgl9KTsNCg0KCS8vIFJlZ2lzdGVyIHBsdWdpbg0KCXRpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoJ25vbmJyZWFraW5nJywgdGlueW1jZS5wbHVnaW5zLk5vbmJyZWFraW5nKTsNCn0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/noneditable/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/noneditable/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dmFyIGE9dGlueW1jZS5kb20uRXZlbnQ7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5Ob25FZGl0YWJsZVBsdWdpbiIse2luaXQ6ZnVuY3Rpb24oZCxlKXt2YXIgZj10aGlzLGMsYjtmLmVkaXRvcj1kO2M9ZC5nZXRQYXJhbSgibm9uZWRpdGFibGVfZWRpdGFibGVfY2xhc3MiLCJtY2VFZGl0YWJsZSIpO2I9ZC5nZXRQYXJhbSgibm9uZWRpdGFibGVfbm9uZWRpdGFibGVfY2xhc3MiLCJtY2VOb25FZGl0YWJsZSIpO2Qub25Ob2RlQ2hhbmdlLmFkZFRvVG9wKGZ1bmN0aW9uKGgsZyxrKXt2YXIgaixpO2o9aC5kb20uZ2V0UGFyZW50KGguc2VsZWN0aW9uLmdldFN0YXJ0KCksZnVuY3Rpb24obCl7cmV0dXJuIGguZG9tLmhhc0NsYXNzKGwsYil9KTtpPWguZG9tLmdldFBhcmVudChoLnNlbGVjdGlvbi5nZXRFbmQoKSxmdW5jdGlvbihsKXtyZXR1cm4gaC5kb20uaGFzQ2xhc3MobCxiKX0pO2lmKGp8fGkpe2YuX3NldERpc2FibGVkKDEpO3JldHVybiBmYWxzZX1lbHNle2YuX3NldERpc2FibGVkKDApfX0pfSxnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJOb24gZWRpdGFibGUgZWxlbWVudHMiLGF1dGhvcjoiTW94aWVjb2RlIFN5c3RlbXMgQUIiLGF1dGhvcnVybDoiaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbSIsaW5mb3VybDoiaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL25vbmVkaXRhYmxlIix2ZXJzaW9uOnRpbnltY2UubWFqb3JWZXJzaW9uKyIuIit0aW55bWNlLm1pbm9yVmVyc2lvbn19LF9ibG9jazpmdW5jdGlvbihjLGQpe3ZhciBiPWQua2V5Q29kZTtpZigoYj4zMiYmYjw0MSl8fChiPjExMSYmYjwxMjQpKXtyZXR1cm59cmV0dXJuIGEuY2FuY2VsKGQpfSxfc2V0RGlzYWJsZWQ6ZnVuY3Rpb24oZCl7dmFyIGM9dGhpcyxiPWMuZWRpdG9yO3RpbnltY2UuZWFjaChiLmNvbnRyb2xNYW5hZ2VyLmNvbnRyb2xzLGZ1bmN0aW9uKGUpe2Uuc2V0RGlzYWJsZWQoZCl9KTtpZihkIT09Yy5kaXNhYmxlZCl7aWYoZCl7Yi5vbktleURvd24uYWRkVG9Ub3AoYy5fYmxvY2spO2Iub25LZXlQcmVzcy5hZGRUb1RvcChjLl9ibG9jayk7Yi5vbktleVVwLmFkZFRvVG9wKGMuX2Jsb2NrKTtiLm9uUGFzdGUuYWRkVG9Ub3AoYy5fYmxvY2spfWVsc2V7Yi5vbktleURvd24ucmVtb3ZlKGMuX2Jsb2NrKTtiLm9uS2V5UHJlc3MucmVtb3ZlKGMuX2Jsb2NrKTtiLm9uS2V5VXAucmVtb3ZlKGMuX2Jsb2NrKTtiLm9uUGFzdGUucmVtb3ZlKGMuX2Jsb2NrKX1jLmRpc2FibGVkPWR9fX0pO3RpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoIm5vbmVkaXRhYmxlIix0aW55bWNlLnBsdWdpbnMuTm9uRWRpdGFibGVQbHVnaW4pfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/noneditable/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnBsdWdpbnMuTm9uRWRpdGFibGVQbHVnaW4nLCB7DQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkaXRDbGFzcywgbm9uRWRpdENsYXNzOw0KDQoJCQl0LmVkaXRvciA9IGVkOw0KCQkJZWRpdENsYXNzID0gZWQuZ2V0UGFyYW0oIm5vbmVkaXRhYmxlX2VkaXRhYmxlX2NsYXNzIiwgIm1jZUVkaXRhYmxlIik7DQoJCQlub25FZGl0Q2xhc3MgPSBlZC5nZXRQYXJhbSgibm9uZWRpdGFibGVfbm9uZWRpdGFibGVfY2xhc3MiLCAibWNlTm9uRWRpdGFibGUiKTsNCg0KCQkJZWQub25Ob2RlQ2hhbmdlLmFkZFRvVG9wKGZ1bmN0aW9uKGVkLCBjbSwgbikgew0KCQkJCXZhciBzYywgZWM7DQoNCgkJCQkvLyBCbG9jayBpZiBzdGFydCBvciBlbmQgaXMgaW5zaWRlIGEgbm9uIGVkaXRhYmxlIGVsZW1lbnQNCgkJCQlzYyA9IGVkLmRvbS5nZXRQYXJlbnQoZWQuc2VsZWN0aW9uLmdldFN0YXJ0KCksIGZ1bmN0aW9uKG4pIHsNCgkJCQkJcmV0dXJuIGVkLmRvbS5oYXNDbGFzcyhuLCBub25FZGl0Q2xhc3MpOw0KCQkJCX0pOw0KDQoJCQkJZWMgPSBlZC5kb20uZ2V0UGFyZW50KGVkLnNlbGVjdGlvbi5nZXRFbmQoKSwgZnVuY3Rpb24obikgew0KCQkJCQlyZXR1cm4gZWQuZG9tLmhhc0NsYXNzKG4sIG5vbkVkaXRDbGFzcyk7DQoJCQkJfSk7DQoNCgkJCQkvLyBCbG9jayBvciB1bmJsb2NrDQoJCQkJaWYgKHNjIHx8IGVjKSB7DQoJCQkJCXQuX3NldERpc2FibGVkKDEpOw0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfSBlbHNlDQoJCQkJCXQuX3NldERpc2FibGVkKDApOw0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdOb24gZWRpdGFibGUgZWxlbWVudHMnLA0KCQkJCWF1dGhvciA6ICdNb3hpZWNvZGUgU3lzdGVtcyBBQicsDQoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLA0KCQkJCWluZm91cmwgOiAnaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL25vbmVkaXRhYmxlJywNCgkJCQl2ZXJzaW9uIDogdGlueW1jZS5tYWpvclZlcnNpb24gKyAiLiIgKyB0aW55bWNlLm1pbm9yVmVyc2lvbg0KCQkJfTsNCgkJfSwNCg0KCQlfYmxvY2sgOiBmdW5jdGlvbihlZCwgZSkgew0KCQkJdmFyIGsgPSBlLmtleUNvZGU7DQoNCgkJCS8vIERvbid0IGJsb2NrIGFycm93IGtleXMsIHBnIHVwL2Rvd24sIGFuZCBGMS1GMTINCgkJCWlmICgoayA+IDMyICYmIGsgPCA0MSkgfHwgKGsgPiAxMTEgJiYgayA8IDEyNCkpDQoJCQkJcmV0dXJuOw0KDQoJCQlyZXR1cm4gRXZlbnQuY2FuY2VsKGUpOw0KCQl9LA0KDQoJCV9zZXREaXNhYmxlZCA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvcjsNCg0KCQkJdGlueW1jZS5lYWNoKGVkLmNvbnRyb2xNYW5hZ2VyLmNvbnRyb2xzLCBmdW5jdGlvbihjKSB7DQoJCQkJYy5zZXREaXNhYmxlZChzKTsNCgkJCX0pOw0KDQoJCQlpZiAocyAhPT0gdC5kaXNhYmxlZCkgew0KCQkJCWlmIChzKSB7DQoJCQkJCWVkLm9uS2V5RG93bi5hZGRUb1RvcCh0Ll9ibG9jayk7DQoJCQkJCWVkLm9uS2V5UHJlc3MuYWRkVG9Ub3AodC5fYmxvY2spOw0KCQkJCQllZC5vbktleVVwLmFkZFRvVG9wKHQuX2Jsb2NrKTsNCgkJCQkJZWQub25QYXN0ZS5hZGRUb1RvcCh0Ll9ibG9jayk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJZWQub25LZXlEb3duLnJlbW92ZSh0Ll9ibG9jayk7DQoJCQkJCWVkLm9uS2V5UHJlc3MucmVtb3ZlKHQuX2Jsb2NrKTsNCgkJCQkJZWQub25LZXlVcC5yZW1vdmUodC5fYmxvY2spOw0KCQkJCQllZC5vblBhc3RlLnJlbW92ZSh0Ll9ibG9jayk7DQoJCQkJfQ0KDQoJCQkJdC5kaXNhYmxlZCA9IHM7DQoJCQl9DQoJCX0NCgl9KTsNCg0KCS8vIFJlZ2lzdGVyIHBsdWdpbg0KCXRpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoJ25vbmVkaXRhYmxlJywgdGlueW1jZS5wbHVnaW5zLk5vbkVkaXRhYmxlUGx1Z2luKTsNCn0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/pagebreak/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/pagebreak/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/pagebreak/css/content.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Lm1jZVBhZ2VCcmVhayB7ZGlzcGxheTpibG9jaztib3JkZXI6MDt3aWR0aDoxMDAlO2hlaWdodDoxMnB4O2JvcmRlci10b3A6MXB4IGRvdHRlZCAjY2NjO21hcmdpbi10b3A6MTVweDtiYWNrZ3JvdW5kOiNmZmYgdXJsKC4uL2ltZy9wYWdlYnJlYWsuZ2lmKSBuby1yZXBlYXQgY2VudGVyIHRvcDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/pagebreak/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5QYWdlQnJlYWtQbHVnaW4iLHtpbml0OmZ1bmN0aW9uKGIsZCl7dmFyIGY9JzxpbWcgc3JjPSInK2QrJy9pbWcvdHJhbnMuZ2lmIiBjbGFzcz0ibWNlUGFnZUJyZWFrIG1jZUl0ZW1Ob1Jlc2l6ZSIgLz4nLGE9Im1jZVBhZ2VCcmVhayIsYz1iLmdldFBhcmFtKCJwYWdlYnJlYWtfc2VwYXJhdG9yIiwiPCEtLSBwYWdlYnJlYWsgLS0+IiksZTtlPW5ldyBSZWdFeHAoYy5yZXBsYWNlKC9bXD9cLlwqXFtcXVwoXClce1x9XCtcXlwkXDpdL2csZnVuY3Rpb24oZyl7cmV0dXJuIlxcIitnfSksImciKTtiLmFkZENvbW1hbmQoIm1jZVBhZ2VCcmVhayIsZnVuY3Rpb24oKXtiLmV4ZWNDb21tYW5kKCJtY2VJbnNlcnRDb250ZW50IiwwLGYpfSk7Yi5hZGRCdXR0b24oInBhZ2VicmVhayIse3RpdGxlOiJwYWdlYnJlYWsuZGVzYyIsY21kOmF9KTtiLm9uSW5pdC5hZGQoZnVuY3Rpb24oKXtpZihiLnNldHRpbmdzLmNvbnRlbnRfY3NzIT09ZmFsc2Upe2IuZG9tLmxvYWRDU1MoZCsiL2Nzcy9jb250ZW50LmNzcyIpfWlmKGIudGhlbWUub25SZXNvbHZlTmFtZSl7Yi50aGVtZS5vblJlc29sdmVOYW1lLmFkZChmdW5jdGlvbihnLGgpe2lmKGgubm9kZS5ub2RlTmFtZT09IklNRyImJmIuZG9tLmhhc0NsYXNzKGgubm9kZSxhKSl7aC5uYW1lPSJwYWdlYnJlYWsifX0pfX0pO2Iub25DbGljay5hZGQoZnVuY3Rpb24oZyxoKXtoPWgudGFyZ2V0O2lmKGgubm9kZU5hbWU9PT0iSU1HIiYmZy5kb20uaGFzQ2xhc3MoaCxhKSl7Zy5zZWxlY3Rpb24uc2VsZWN0KGgpfX0pO2Iub25Ob2RlQ2hhbmdlLmFkZChmdW5jdGlvbihoLGcsaSl7Zy5zZXRBY3RpdmUoInBhZ2VicmVhayIsaS5ub2RlTmFtZT09PSJJTUciJiZoLmRvbS5oYXNDbGFzcyhpLGEpKX0pO2Iub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihnLGgpe2guY29udGVudD1oLmNvbnRlbnQucmVwbGFjZShlLGYpfSk7Yi5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihnLGgpe2lmKGguZ2V0KXtoLmNvbnRlbnQ9aC5jb250ZW50LnJlcGxhY2UoLzxpbWdbXj5dKz4vZyxmdW5jdGlvbihpKXtpZihpLmluZGV4T2YoJ2NsYXNzPSJtY2VQYWdlQnJlYWsnKSE9PS0xKXtpPWN9cmV0dXJuIGl9KX19KX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiUGFnZUJyZWFrIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9wYWdlYnJlYWsiLHZlcnNpb246dGlueW1jZS5tYWpvclZlcnNpb24rIi4iK3RpbnltY2UubWlub3JWZXJzaW9ufX19KTt0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCJwYWdlYnJlYWsiLHRpbnltY2UucGx1Z2lucy5QYWdlQnJlYWtQbHVnaW4pfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/pagebreak/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLlBhZ2VCcmVha1BsdWdpbicsIHsNCgkJaW5pdCA6IGZ1bmN0aW9uKGVkLCB1cmwpIHsNCgkJCXZhciBwYiA9ICc8aW1nIHNyYz0iJyArIHVybCArICcvaW1nL3RyYW5zLmdpZiIgY2xhc3M9Im1jZVBhZ2VCcmVhayBtY2VJdGVtTm9SZXNpemUiIC8+JywgY2xzID0gJ21jZVBhZ2VCcmVhaycsIHNlcCA9IGVkLmdldFBhcmFtKCdwYWdlYnJlYWtfc2VwYXJhdG9yJywgJzwhLS0gcGFnZWJyZWFrIC0tPicpLCBwYlJFOw0KDQoJCQlwYlJFID0gbmV3IFJlZ0V4cChzZXAucmVwbGFjZSgvW1w/XC5cKlxbXF1cKFwpXHtcfVwrXF5cJFw6XS9nLCBmdW5jdGlvbihhKSB7cmV0dXJuICdcXCcgKyBhO30pLCAnZycpOw0KDQoJCQkvLyBSZWdpc3RlciBjb21tYW5kcw0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlUGFnZUJyZWFrJywgZnVuY3Rpb24oKSB7DQoJCQkJZWQuZXhlY0NvbW1hbmQoJ21jZUluc2VydENvbnRlbnQnLCAwLCBwYik7DQoJCQl9KTsNCg0KCQkJLy8gUmVnaXN0ZXIgYnV0dG9ucw0KCQkJZWQuYWRkQnV0dG9uKCdwYWdlYnJlYWsnLCB7dGl0bGUgOiAncGFnZWJyZWFrLmRlc2MnLCBjbWQgOiBjbHN9KTsNCg0KCQkJZWQub25Jbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCQlpZiAoZWQuc2V0dGluZ3MuY29udGVudF9jc3MgIT09IGZhbHNlKQ0KCQkJCQllZC5kb20ubG9hZENTUyh1cmwgKyAiL2Nzcy9jb250ZW50LmNzcyIpOw0KDQoJCQkJaWYgKGVkLnRoZW1lLm9uUmVzb2x2ZU5hbWUpIHsNCgkJCQkJZWQudGhlbWUub25SZXNvbHZlTmFtZS5hZGQoZnVuY3Rpb24odGgsIG8pIHsNCgkJCQkJCWlmIChvLm5vZGUubm9kZU5hbWUgPT0gJ0lNRycgJiYgZWQuZG9tLmhhc0NsYXNzKG8ubm9kZSwgY2xzKSkNCgkJCQkJCQlvLm5hbWUgPSAncGFnZWJyZWFrJzsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWVkLm9uQ2xpY2suYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJaWYgKGUubm9kZU5hbWUgPT09ICdJTUcnICYmIGVkLmRvbS5oYXNDbGFzcyhlLCBjbHMpKQ0KCQkJCQllZC5zZWxlY3Rpb24uc2VsZWN0KGUpOw0KCQkJfSk7DQoNCgkJCWVkLm9uTm9kZUNoYW5nZS5hZGQoZnVuY3Rpb24oZWQsIGNtLCBuKSB7DQoJCQkJY20uc2V0QWN0aXZlKCdwYWdlYnJlYWsnLCBuLm5vZGVOYW1lID09PSAnSU1HJyAmJiBlZC5kb20uaGFzQ2xhc3MobiwgY2xzKSk7DQoJCQl9KTsNCg0KCQkJZWQub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKHBiUkUsIHBiKTsNCgkJCX0pOw0KDQoJCQllZC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCWlmIChvLmdldCkNCgkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UoLzxpbWdbXj5dKz4vZywgZnVuY3Rpb24oaW0pIHsNCgkJCQkJCWlmIChpbS5pbmRleE9mKCdjbGFzcz0ibWNlUGFnZUJyZWFrJykgIT09IC0xKQ0KCQkJCQkJCWltID0gc2VwOw0KDQoJCQkJCQlyZXR1cm4gaW07DQoJCQkJCX0pOw0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdQYWdlQnJlYWsnLA0KCQkJCWF1dGhvciA6ICdNb3hpZWNvZGUgU3lzdGVtcyBBQicsDQoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLA0KCQkJCWluZm91cmwgOiAnaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL3BhZ2VicmVhaycsDQoJCQkJdmVyc2lvbiA6IHRpbnltY2UubWFqb3JWZXJzaW9uICsgIi4iICsgdGlueW1jZS5taW5vclZlcnNpb24NCgkJCX07DQoJCX0NCgl9KTsNCg0KCS8vIFJlZ2lzdGVyIHBsdWdpbg0KCXRpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoJ3BhZ2VicmVhaycsIHRpbnltY2UucGx1Z2lucy5QYWdlQnJlYWtQbHVnaW4pOw0KfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/pagebreak/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/pagebreak/img/pagebreak.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhZAAMALMPAPuup/7o5vh/dPddT/7z8vqXjv3Rzfu5s/h0aPmLgf3c2fqimvzFwPdoW/ZRQv///yH5BAEAAA8ALAAAAABkAAwAAATy8MlJq7046827/2AojmQZCg1ZOIbJAQgjOS4XpKTQ2s0CAo0CYULjCAYIh+DBcDgaw1VjoGs8FYGBFUGwrhyEhLPAdEIfVcfhNfBxxEMKbhNgoQETAYDBVTiyawwNdS16Dw0JEjBDCGsShgIFAwofUx1AQhYHTk4HVmY3EgcFAJwApxKDnE6hDwdLgxJfTqemaEqpnA2bnGsLPT+NqR2EaAuTDwl7fX/IEsXKhwGKiRPI0ToFZBpZeCZz3EgOXAsOA2IGUgMBBgNOCQJP4wSr0/FPBuXn8gqlCDUAH7TSQGBAnIAIE95zpGlMwocQI0rEEAEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/pagebreak/img/trans.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhAQABAJAAAAAAAAAAACH5BAEUAAAALAAAAAABAAEAAAICRAEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/paste/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/paste/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dmFyIGM9dGlueW1jZS5lYWNoLGQ9bnVsbCxhPXtwYXN0ZV9hdXRvX2NsZWFudXBfb25fcGFzdGU6dHJ1ZSxwYXN0ZV9ibG9ja19kcm9wOmZhbHNlLHBhc3RlX3JldGFpbl9zdHlsZV9wcm9wZXJ0aWVzOiJub25lIixwYXN0ZV9zdHJpcF9jbGFzc19hdHRyaWJ1dGVzOiJtc28iLHBhc3RlX3JlbW92ZV9zcGFuczpmYWxzZSxwYXN0ZV9yZW1vdmVfc3R5bGVzOmZhbHNlLHBhc3RlX3JlbW92ZV9zdHlsZXNfaWZfd2Via2l0OnRydWUscGFzdGVfY29udmVydF9taWRkb3RfbGlzdHM6dHJ1ZSxwYXN0ZV9jb252ZXJ0X2hlYWRlcnNfdG9fc3Ryb25nOmZhbHNlLHBhc3RlX2RpYWxvZ193aWR0aDoiNDUwIixwYXN0ZV9kaWFsb2dfaGVpZ2h0OiI0MDAiLHBhc3RlX3RleHRfdXNlX2RpYWxvZzpmYWxzZSxwYXN0ZV90ZXh0X3N0aWNreTpmYWxzZSxwYXN0ZV90ZXh0X25vdGlmeWFsd2F5czpmYWxzZSxwYXN0ZV90ZXh0X2xpbmVicmVha3R5cGU6InAiLHBhc3RlX3RleHRfcmVwbGFjZW1lbnRzOltbL1x1MjAyNi9nLCIuLi4iXSxbL1tceDkzXHg5NFx1MjAxY1x1MjAxZF0vZywnIiddLFsvW1x4NjBceDkxXHg5Mlx1MjAxOFx1MjAxOV0vZywiJyJdXX07ZnVuY3Rpb24gYihlLGYpe3JldHVybiBlLmdldFBhcmFtKGYsYVtmXSl9dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5QYXN0ZVBsdWdpbiIse2luaXQ6ZnVuY3Rpb24oZSxmKXt2YXIgZz10aGlzO2cuZWRpdG9yPWU7Zy51cmw9ZjtnLm9uUHJlUHJvY2Vzcz1uZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIoZyk7Zy5vblBvc3RQcm9jZXNzPW5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcihnKTtnLm9uUHJlUHJvY2Vzcy5hZGQoZy5fcHJlUHJvY2Vzcyk7Zy5vblBvc3RQcm9jZXNzLmFkZChnLl9wb3N0UHJvY2Vzcyk7Zy5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKGosayl7ZS5leGVjQ2FsbGJhY2soInBhc3RlX3ByZXByb2Nlc3MiLGosayl9KTtnLm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKGosayl7ZS5leGVjQ2FsbGJhY2soInBhc3RlX3Bvc3Rwcm9jZXNzIixqLGspfSk7ZS5wYXN0ZUFzUGxhaW5UZXh0PWZhbHNlO2Z1bmN0aW9uIGkobCxqKXt2YXIgaz1lLmRvbTtnLm9uUHJlUHJvY2Vzcy5kaXNwYXRjaChnLGwpO2wubm9kZT1rLmNyZWF0ZSgiZGl2IiwwLGwuY29udGVudCk7Zy5vblBvc3RQcm9jZXNzLmRpc3BhdGNoKGcsbCk7bC5jb250ZW50PWUuc2VyaWFsaXplci5zZXJpYWxpemUobC5ub2RlLHtnZXRJbm5lcjoxfSk7aWYoKCFqKSYmKGUucGFzdGVBc1BsYWluVGV4dCkpe2cuX2luc2VydFBsYWluVGV4dChlLGssbC5jb250ZW50KTtpZighYihlLCJwYXN0ZV90ZXh0X3N0aWNreSIpKXtlLnBhc3RlQXNQbGFpblRleHQ9ZmFsc2U7ZS5jb250cm9sTWFuYWdlci5zZXRBY3RpdmUoInBhc3RldGV4dCIsZmFsc2UpfX1lbHNle2lmKC88KHB8aFsxLTZdfHVsfG9sKS8udGVzdChsLmNvbnRlbnQpKXtnLl9pbnNlcnRCbG9ja0NvbnRlbnQoZSxrLGwuY29udGVudCl9ZWxzZXtnLl9pbnNlcnQobC5jb250ZW50KX19fWUuYWRkQ29tbWFuZCgibWNlSW5zZXJ0Q2xpcGJvYXJkQ29udGVudCIsZnVuY3Rpb24oaixrKXtpKGssdHJ1ZSl9KTtpZighYihlLCJwYXN0ZV90ZXh0X3VzZV9kaWFsb2ciKSl7ZS5hZGRDb21tYW5kKCJtY2VQYXN0ZVRleHQiLGZ1bmN0aW9uKGssail7dmFyIGw9dGlueW1jZS51dGlsLkNvb2tpZTtlLnBhc3RlQXNQbGFpblRleHQ9IWUucGFzdGVBc1BsYWluVGV4dDtlLmNvbnRyb2xNYW5hZ2VyLnNldEFjdGl2ZSgicGFzdGV0ZXh0IixlLnBhc3RlQXNQbGFpblRleHQpO2lmKChlLnBhc3RlQXNQbGFpblRleHQpJiYoIWwuZ2V0KCJ0aW55bWNlUGFzdGVUZXh0IikpKXtpZihiKGUsInBhc3RlX3RleHRfc3RpY2t5Iikpe2Uud2luZG93TWFuYWdlci5hbGVydChlLnRyYW5zbGF0ZSgicGFzdGUucGxhaW50ZXh0X21vZGVfc3RpY2t5IikpfWVsc2V7ZS53aW5kb3dNYW5hZ2VyLmFsZXJ0KGUudHJhbnNsYXRlKCJwYXN0ZS5wbGFpbnRleHRfbW9kZV9zdGlja3kiKSl9aWYoIWIoZSwicGFzdGVfdGV4dF9ub3RpZnlhbHdheXMiKSl7bC5zZXQoInRpbnltY2VQYXN0ZVRleHQiLCIxIixuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkrMSwxMiwzMSkpfX19KX1lLmFkZEJ1dHRvbigicGFzdGV0ZXh0Iix7dGl0bGU6InBhc3RlLnBhc3RlX3RleHRfZGVzYyIsY21kOiJtY2VQYXN0ZVRleHQifSk7ZS5hZGRCdXR0b24oInNlbGVjdGFsbCIse3RpdGxlOiJwYXN0ZS5zZWxlY3RhbGxfZGVzYyIsY21kOiJzZWxlY3RhbGwifSk7ZnVuY3Rpb24gaChzKXt2YXIgbSxxLGssbD1lLnNlbGVjdGlvbixwPWUuZG9tLHI9ZS5nZXRCb2R5KCksajtpZihlLnBhc3RlQXNQbGFpblRleHQmJihzLmNsaXBib2FyZERhdGF8fHAuZG9jLmRhdGFUcmFuc2Zlcikpe3MucHJldmVudERlZmF1bHQoKTtpKHtjb250ZW50OihzLmNsaXBib2FyZERhdGF8fHAuZG9jLmRhdGFUcmFuc2ZlcikuZ2V0RGF0YSgiVGV4dCIpLnJlcGxhY2UoL1xyP1xuL2csIjxiciAvPiIpfSk7cmV0dXJufWlmKHAuZ2V0KCJfbWNlUGFzdGUiKSl7cmV0dXJufW09cC5hZGQociwiZGl2Iix7aWQ6Il9tY2VQYXN0ZSIsImNsYXNzIjoibWNlUGFzdGUifSwnXHVGRUZGPGJyIF9tY2VfYm9ndXM9IjEiPicpO2lmKHIhPWUuZ2V0RG9jKCkuYm9keSl7aj1wLmdldFBvcyhlLnNlbGVjdGlvbi5nZXRTdGFydCgpLHIpLnl9ZWxzZXtqPXIuc2Nyb2xsVG9wfXAuc2V0U3R5bGVzKG0se3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDotMTAwMDAsdG9wOmosd2lkdGg6MSxoZWlnaHQ6MSxvdmVyZmxvdzoiaGlkZGVuIn0pO2lmKHRpbnltY2UuaXNJRSl7az1wLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO2subW92ZVRvRWxlbWVudFRleHQobSk7ay5leGVjQ29tbWFuZCgiUGFzdGUiKTtwLnJlbW92ZShtKTtpZihtLmlubmVySFRNTD09PSJcdUZFRkYiKXtlLmV4ZWNDb21tYW5kKCJtY2VQYXN0ZVdvcmQiKTtzLnByZXZlbnREZWZhdWx0KCk7cmV0dXJufWkoe2NvbnRlbnQ6bS5pbm5lckhUTUx9KTtyZXR1cm4gdGlueW1jZS5kb20uRXZlbnQuY2FuY2VsKHMpfWVsc2V7ZnVuY3Rpb24gbyhuKXtuLnByZXZlbnREZWZhdWx0KCl9cC5iaW5kKGUuZ2V0RG9jKCksIm1vdXNlZG93biIsbyk7cC5iaW5kKGUuZ2V0RG9jKCksImtleWRvd24iLG8pO3E9ZS5zZWxlY3Rpb24uZ2V0Um5nKCk7bT1tLmZpcnN0Q2hpbGQ7az1lLmdldERvYygpLmNyZWF0ZVJhbmdlKCk7ay5zZXRTdGFydChtLDApO2suc2V0RW5kKG0sMSk7bC5zZXRSbmcoayk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgdD0iIixuPXAuc2VsZWN0KCJkaXYubWNlUGFzdGUiKTtjKG4sZnVuY3Rpb24odil7dmFyIHU9di5maXJzdENoaWxkO2lmKHUmJnUubm9kZU5hbWU9PSJESVYiJiZ1LnN0eWxlLm1hcmdpblRvcCYmdS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3Ipe3AucmVtb3ZlKHUsMSl9YyhwLnNlbGVjdCgiZGl2Lm1jZVBhc3RlIix2KSxmdW5jdGlvbih3KXtwLnJlbW92ZSh3LDEpfSk7YyhwLnNlbGVjdCgic3Bhbi5BcHBsZS1zdHlsZS1zcGFuIix2KSxmdW5jdGlvbih3KXtwLnJlbW92ZSh3LDEpfSk7YyhwLnNlbGVjdCgiYnJbX21jZV9ib2d1c10iLHYpLGZ1bmN0aW9uKHcpe3AucmVtb3ZlKHcpfSk7dCs9di5pbm5lckhUTUx9KTtjKG4sZnVuY3Rpb24odSl7cC5yZW1vdmUodSl9KTtpZihxKXtsLnNldFJuZyhxKX1pKHtjb250ZW50OnR9KTtwLnVuYmluZChlLmdldERvYygpLCJtb3VzZWRvd24iLG8pO3AudW5iaW5kKGUuZ2V0RG9jKCksImtleWRvd24iLG8pfSwwKX19aWYoYihlLCJwYXN0ZV9hdXRvX2NsZWFudXBfb25fcGFzdGUiKSl7aWYodGlueW1jZS5pc09wZXJhfHwvRmlyZWZveFwvMi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7ZS5vbktleURvd24uYWRkKGZ1bmN0aW9uKGosayl7aWYoKCh0aW55bWNlLmlzTWFjP2subWV0YUtleTprLmN0cmxLZXkpJiZrLmtleUNvZGU9PTg2KXx8KGsuc2hpZnRLZXkmJmsua2V5Q29kZT09NDUpKXtoKGspfX0pfWVsc2V7ZS5vblBhc3RlLmFkZFRvVG9wKGZ1bmN0aW9uKGosayl7cmV0dXJuIGgoayl9KX19aWYoYihlLCJwYXN0ZV9ibG9ja19kcm9wIikpe2Uub25Jbml0LmFkZChmdW5jdGlvbigpe2UuZG9tLmJpbmQoZS5nZXRCb2R5KCksWyJkcmFnZW5kIiwiZHJhZ292ZXIiLCJkcmFnZ2VzdHVyZSIsImRyYWdkcm9wIiwiZHJvcCIsImRyYWciXSxmdW5jdGlvbihqKXtqLnByZXZlbnREZWZhdWx0KCk7ai5zdG9wUHJvcGFnYXRpb24oKTtyZXR1cm4gZmFsc2V9KX0pfWcuX2xlZ2FjeVN1cHBvcnQoKX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiUGFzdGUgdGV4dC93b3JkIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9wYXN0ZSIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fSxfcHJlUHJvY2VzczpmdW5jdGlvbihpLGYpe3ZhciBsPXRoaXMuZWRpdG9yLGs9Zi5jb250ZW50LHE9dGlueW1jZS5ncmVwLHA9dGlueW1jZS5leHBsb2RlLGc9dGlueW1jZS50cmltLG0sajtmdW5jdGlvbiBlKGgpe2MoaCxmdW5jdGlvbihvKXtpZihvLmNvbnN0cnVjdG9yPT1SZWdFeHApe2s9ay5yZXBsYWNlKG8sIiIpfWVsc2V7az1rLnJlcGxhY2Uob1swXSxvWzFdKX19KX1pZigvY2xhc3M9Ij9Nc298c3R5bGU9IlteIl0qXGJtc28tfHc6V29yZERvY3VtZW50L2kudGVzdChrKXx8Zi53b3JkQ29udGVudCl7Zi53b3JkQ29udGVudD10cnVlO2UoWy9eXHMqKCZuYnNwOykrL2dpLC8oJm5ic3A7fDxicltePl0qPikrXHMqJC9naV0pO2lmKGIobCwicGFzdGVfY29udmVydF9oZWFkZXJzX3RvX3N0cm9uZyIpKXtrPWsucmVwbGFjZSgvPHAgW14+XSpjbGFzcz0iP01zb0hlYWRpbmciP1tePl0qPiguKj8pPFwvcD4vZ2ksIjxwPjxzdHJvbmc+JDE8L3N0cm9uZz48L3A+Iil9aWYoYihsLCJwYXN0ZV9jb252ZXJ0X21pZGRvdF9saXN0cyIpKXtlKFtbLzwhLS1cW2lmICFzdXBwb3J0TGlzdHNcXS0tPi9naSwiJCZfX01DRV9JVEVNX18iXSxbLyg8c3BhbltePl0rKD86bXNvLWxpc3Q6fDpccypzeW1ib2wpW14+XSs+KS9naSwiJDFfX01DRV9JVEVNX18iXV0pfWUoWy88IS0tW1xzXFNdKz8tLT4vZ2ksLzwoIXxzY3JpcHRbXj5dKj4uKj88XC9zY3JpcHQoPz1bPlxzXSl8XC8/KFw/eG1sKDpcdyspP3xpbWd8bWV0YXxsaW5rfHN0eWxlfFx3Olx3KykoPz1bXHNcLz5dKSlbXj5dKj4vZ2ksWy88KFwvPylzPi9naSwiPCQxc3RyaWtlPiJdLFsvJm5ic3A7L2dpLCJcdTAwYTAiXV0pO2Rve209ay5sZW5ndGg7az1rLnJlcGxhY2UoLyg8W2Etel1bXj5dKlxzKSg/OmlkfG5hbWV8bGFuZ3VhZ2V8dHlwZXxvblx3K3xcdys6XHcrKT0oPzoiW14iXSoifFx3Kylccz8vZ2ksIiQxIil9d2hpbGUobSE9ay5sZW5ndGgpO2lmKGIobCwicGFzdGVfcmV0YWluX3N0eWxlX3Byb3BlcnRpZXMiKS5yZXBsYWNlKC9ebm9uZSQvaSwiIikubGVuZ3RoPT0wKXtrPWsucmVwbGFjZSgvPFwvP3NwYW5bXj5dKj4vZ2ksIiIpfWVsc2V7ZShbWy88c3BhblxzK3N0eWxlXHMqPVxzKiJccyptc28tc3BhY2VydW5ccyo6XHMqeWVzXHMqOz9ccyoiXHMqPihbXHNcdTAwYTBdKik8XC9zcGFuPi9naSxmdW5jdGlvbihvLGgpe3JldHVybihoLmxlbmd0aD4wKT9oLnJlcGxhY2UoLy4vLCIgIikuc2xpY2UoTWF0aC5mbG9vcihoLmxlbmd0aC8yKSkuc3BsaXQoIiIpLmpvaW4oIlx1MDBhMCIpOiIifV0sWy8oPFthLXpdW14+XSopXHNzdHlsZT0iKFteIl0qKSIvZ2ksZnVuY3Rpb24odSxoLHQpe3ZhciB2PVtdLG89MCxyPXAoZyh0KS5yZXBsYWNlKC8mcXVvdDsvZ2ksIiciKSwiOyIpO2MocixmdW5jdGlvbihzKXt2YXIgdyx5LHo9cChzLCI6Iik7ZnVuY3Rpb24geChBKXtyZXR1cm4gQSsoKEEhPT0iMCIpJiYoL1xkJC8udGVzdChBKSkpPyJweCI6IiJ9aWYoei5sZW5ndGg9PTIpe3c9elswXS50b0xvd2VyQ2FzZSgpO3k9elsxXS50b0xvd2VyQ2FzZSgpO3N3aXRjaCh3KXtjYXNlIm1zby1wYWRkaW5nLWFsdCI6Y2FzZSJtc28tcGFkZGluZy10b3AtYWx0IjpjYXNlIm1zby1wYWRkaW5nLXJpZ2h0LWFsdCI6Y2FzZSJtc28tcGFkZGluZy1ib3R0b20tYWx0IjpjYXNlIm1zby1wYWRkaW5nLWxlZnQtYWx0IjpjYXNlIm1zby1tYXJnaW4tYWx0IjpjYXNlIm1zby1tYXJnaW4tdG9wLWFsdCI6Y2FzZSJtc28tbWFyZ2luLXJpZ2h0LWFsdCI6Y2FzZSJtc28tbWFyZ2luLWJvdHRvbS1hbHQiOmNhc2UibXNvLW1hcmdpbi1sZWZ0LWFsdCI6Y2FzZSJtc28tdGFibGUtbGF5b3V0LWFsdCI6Y2FzZSJtc28taGVpZ2h0IjpjYXNlIm1zby13aWR0aCI6Y2FzZSJtc28tdmVydGljYWwtYWxpZ24tYWx0Ijp2W28rK109dy5yZXBsYWNlKC9ebXNvLXwtYWx0JC9nLCIiKSsiOiIreCh5KTtyZXR1cm47Y2FzZSJob3Jpei1hbGlnbiI6dltvKytdPSJ0ZXh0LWFsaWduOiIreTtyZXR1cm47Y2FzZSJ2ZXJ0LWFsaWduIjp2W28rK109InZlcnRpY2FsLWFsaWduOiIreTtyZXR1cm47Y2FzZSJmb250LWNvbG9yIjpjYXNlIm1zby1mb3JlZ3JvdW5kIjp2W28rK109ImNvbG9yOiIreTtyZXR1cm47Y2FzZSJtc28tYmFja2dyb3VuZCI6Y2FzZSJtc28taGlnaGxpZ2h0Ijp2W28rK109ImJhY2tncm91bmQ6Iit5O3JldHVybjtjYXNlIm1zby1kZWZhdWx0LWhlaWdodCI6dltvKytdPSJtaW4taGVpZ2h0OiIreCh5KTtyZXR1cm47Y2FzZSJtc28tZGVmYXVsdC13aWR0aCI6dltvKytdPSJtaW4td2lkdGg6Iit4KHkpO3JldHVybjtjYXNlIm1zby1wYWRkaW5nLWJldHdlZW4tYWx0Ijp2W28rK109ImJvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZTtib3JkZXItc3BhY2luZzoiK3goeSk7cmV0dXJuO2Nhc2UidGV4dC1saW5lLXRocm91Z2giOmlmKCh5PT0ic2luZ2xlIil8fCh5PT0iZG91YmxlIikpe3ZbbysrXT0idGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaCJ9cmV0dXJuO2Nhc2UibXNvLXplcm8taGVpZ2h0IjppZih5PT0ieWVzIil7dltvKytdPSJkaXNwbGF5Om5vbmUifXJldHVybn1pZigvXihtc298Y29sdW1ufGZvbnQtZW1waHxsYW5nfGxheW91dHxsaW5lLWJyZWFrfGxpc3QtaW1hZ2V8bmF2fHBhbm9zZXxwdW5jdHxyb3d8cnVieXxzZXB8c2l6ZXxzcmN8dGFiLXx0YWJsZS1ib3JkZXJ8dGV4dC0oPyFhbGlnbnxkZWNvcnxpbmRlbnR8dHJhbnMpfHRvcC1iYXJ8dmVyc2lvbnx2bmR8d29yZC1icmVhaykvLnRlc3Qodykpe3JldHVybn12W28rK109dysiOiIrelsxXX19KTtpZihvPjApe3JldHVybiBoKycgc3R5bGU9Iicrdi5qb2luKCI7IikrJyInfWVsc2V7cmV0dXJuIGh9fV1dKX19aWYoYihsLCJwYXN0ZV9jb252ZXJ0X2hlYWRlcnNfdG9fc3Ryb25nIikpe2UoW1svPGhbMS02XVtePl0qPi9naSwiPHA+PHN0cm9uZz4iXSxbLzxcL2hbMS02XVtePl0qPi9naSwiPC9zdHJvbmc+PC9wPiJdXSl9aj1iKGwsInBhc3RlX3N0cmlwX2NsYXNzX2F0dHJpYnV0ZXMiKTtpZihqIT09Im5vbmUiKXtmdW5jdGlvbiBuKHIsbyl7aWYoaj09PSJhbGwiKXtyZXR1cm4iIn12YXIgaD1xKHAoby5yZXBsYWNlKC9eKFsiJ10pKC4qKVwxJC8sIiQyIiksIiAiKSxmdW5jdGlvbihzKXtyZXR1cm4oL14oPyFtc28pL2kudGVzdChzKSl9KTtyZXR1cm4gaC5sZW5ndGg/JyBjbGFzcz0iJytoLmpvaW4oIiAiKSsnIic6IiJ9az1rLnJlcGxhY2UoLyBjbGFzcz0iKFteIl0rKSIvZ2ksbik7az1rLnJlcGxhY2UoLyBjbGFzcz0oXHcrKS9naSxuKX1pZihiKGwsInBhc3RlX3JlbW92ZV9zcGFucyIpKXtrPWsucmVwbGFjZSgvPFwvP3NwYW5bXj5dKj4vZ2ksIiIpfWYuY29udGVudD1rfSxfcG9zdFByb2Nlc3M6ZnVuY3Rpb24oaCxqKXt2YXIgZz10aGlzLGY9Zy5lZGl0b3IsaT1mLmRvbSxlO2lmKGoud29yZENvbnRlbnQpe2MoaS5zZWxlY3QoImEiLGoubm9kZSksZnVuY3Rpb24oayl7aWYoIWsuaHJlZnx8ay5ocmVmLmluZGV4T2YoIiNfVG9jIikhPS0xKXtpLnJlbW92ZShrLDEpfX0pO2lmKGIoZiwicGFzdGVfY29udmVydF9taWRkb3RfbGlzdHMiKSl7Zy5fY29udmVydExpc3RzKGgsail9ZT1iKGYsInBhc3RlX3JldGFpbl9zdHlsZV9wcm9wZXJ0aWVzIik7aWYoKHRpbnltY2UuaXMoZSwic3RyaW5nIikpJiYoZSE9PSJhbGwiKSYmKGUhPT0iKiIpKXtlPXRpbnltY2UuZXhwbG9kZShlLnJlcGxhY2UoL15ub25lJC9pLCIiKSk7YyhpLnNlbGVjdCgiKiIsai5ub2RlKSxmdW5jdGlvbihuKXt2YXIgbz17fSxsPTAsbSxwLGs7aWYoZSl7Zm9yKG09MDttPGUubGVuZ3RoO20rKyl7cD1lW21dO2s9aS5nZXRTdHlsZShuLHApO2lmKGspe29bcF09aztsKyt9fX1pLnNldEF0dHJpYihuLCJzdHlsZSIsIiIpO2lmKGUmJmw+MCl7aS5zZXRTdHlsZXMobixvKX1lbHNle2lmKG4ubm9kZU5hbWU9PSJTUEFOIiYmIW4uY2xhc3NOYW1lKXtpLnJlbW92ZShuLHRydWUpfX19KX19aWYoYihmLCJwYXN0ZV9yZW1vdmVfc3R5bGVzIil8fChiKGYsInBhc3RlX3JlbW92ZV9zdHlsZXNfaWZfd2Via2l0IikmJnRpbnltY2UuaXNXZWJLaXQpKXtjKGkuc2VsZWN0KCIqW3N0eWxlXSIsai5ub2RlKSxmdW5jdGlvbihrKXtrLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKTtrLnJlbW92ZUF0dHJpYnV0ZSgiX21jZV9zdHlsZSIpfSl9ZWxzZXtpZih0aW55bWNlLmlzV2ViS2l0KXtjKGkuc2VsZWN0KCIqIixqLm5vZGUpLGZ1bmN0aW9uKGspe2sucmVtb3ZlQXR0cmlidXRlKCJfbWNlX3N0eWxlIil9KX19fSxfY29udmVydExpc3RzOmZ1bmN0aW9uKGgsZil7dmFyIGo9aC5lZGl0b3IuZG9tLGksbSxlPS0xLGcsbj1bXSxsLGs7YyhqLnNlbGVjdCgicCIsZi5ub2RlKSxmdW5jdGlvbih1KXt2YXIgcix2PSIiLHQscyxvLHE7Zm9yKHI9dS5maXJzdENoaWxkO3ImJnIubm9kZVR5cGU9PTM7cj1yLm5leHRTaWJsaW5nKXt2Kz1yLm5vZGVWYWx1ZX12PXUuaW5uZXJIVE1MLnJlcGxhY2UoLzxcLz9cdytbXj5dKj4vZ2ksIiIpLnJlcGxhY2UoLyZuYnNwOy9nLCJcdTAwYTAiKTtpZigvXihfX01DRV9JVEVNX18pK1tcdTIwMjJcdTAwYjdcdTAwYTdcdTAwZDhvXVxzKlx1MDBhMCovLnRlc3Qodikpe3Q9InVsIn1pZigvXl9fTUNFX0lURU1fX1xzKlx3K1wuXHMqXHUwMGEwezIsfS8udGVzdCh2KSl7dD0ib2wifWlmKHQpe2c9cGFyc2VGbG9hdCh1LnN0eWxlLm1hcmdpbkxlZnR8fDApO2lmKGc+ZSl7bi5wdXNoKGcpfWlmKCFpfHx0IT1sKXtpPWouY3JlYXRlKHQpO2ouaW5zZXJ0QWZ0ZXIoaSx1KX1lbHNle2lmKGc+ZSl7aT1tLmFwcGVuZENoaWxkKGouY3JlYXRlKHQpKX1lbHNle2lmKGc8ZSl7bz10aW55bWNlLmluQXJyYXkobixnKTtxPWouZ2V0UGFyZW50cyhpLnBhcmVudE5vZGUsdCk7aT1xW3EubGVuZ3RoLTEtb118fGl9fX1jKGouc2VsZWN0KCJzcGFuIix1KSxmdW5jdGlvbih3KXt2YXIgcD13LmlubmVySFRNTC5yZXBsYWNlKC88XC8/XHcrW14+XSo+L2dpLCIiKTtpZih0PT0idWwiJiYvXltcdTIwMjJcdTAwYjdcdTAwYTdcdTAwZDhvXS8udGVzdChwKSl7ai5yZW1vdmUodyl9ZWxzZXtpZigvXltcc1xTXSpcdytcLigmbmJzcDt8XHUwMGEwKSpccyovLnRlc3QocCkpe2oucmVtb3ZlKHcpfX19KTtzPXUuaW5uZXJIVE1MO2lmKHQ9PSJ1bCIpe3M9dS5pbm5lckhUTUwucmVwbGFjZSgvX19NQ0VfSVRFTV9fL2csIiIpLnJlcGxhY2UoL15bXHUyMDIyXHUwMGI3XHUwMGE3XHUwMGQ4b11ccyooJm5ic3A7fFx1MDBhMCkrXHMqLywiIil9ZWxzZXtzPXUuaW5uZXJIVE1MLnJlcGxhY2UoL19fTUNFX0lURU1fXy9nLCIiKS5yZXBsYWNlKC9eXHMqXHcrXC4oJm5ic3A7fFx1MDBhMCkrXHMqLywiIil9bT1pLmFwcGVuZENoaWxkKGouY3JlYXRlKCJsaSIsMCxzKSk7ai5yZW1vdmUodSk7ZT1nO2w9dH1lbHNle2k9ZT0wfX0pO2s9Zi5ub2RlLmlubmVySFRNTDtpZihrLmluZGV4T2YoIl9fTUNFX0lURU1fXyIpIT0tMSl7Zi5ub2RlLmlubmVySFRNTD1rLnJlcGxhY2UoL19fTUNFX0lURU1fXy9nLCIiKX19LF9pbnNlcnRCbG9ja0NvbnRlbnQ6ZnVuY3Rpb24obCxoLG0pe3ZhciBmLGosZz1sLnNlbGVjdGlvbixxLG4sZSxvLGksaz0ibWNlX21hcmtlciI7ZnVuY3Rpb24gcCh0KXt2YXIgcztpZih0aW55bWNlLmlzSUUpe3M9bC5nZXREb2MoKS5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO3MubW92ZVRvRWxlbWVudFRleHQodCk7cy5jb2xsYXBzZShmYWxzZSk7cy5zZWxlY3QoKX1lbHNle2cuc2VsZWN0KHQsMSk7Zy5jb2xsYXBzZShmYWxzZSl9fXRoaXMuX2luc2VydCgnPHNwYW4gaWQ9IicraysnIj48L3NwYW4+JywxKTtqPWguZ2V0KGspO2Y9aC5nZXRQYXJlbnQoaiwicCxoMSxoMixoMyxoNCxoNSxoNix1bCxvbCx0aCx0ZCIpO2lmKGYmJiEvVER8VEgvLnRlc3QoZi5ub2RlTmFtZSkpe2o9aC5zcGxpdChmLGopO2MoaC5jcmVhdGUoImRpdiIsMCxtKS5jaGlsZE5vZGVzLGZ1bmN0aW9uKHIpe3E9ai5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLmNsb25lTm9kZSh0cnVlKSxqKX0pO3AocSl9ZWxzZXtoLnNldE91dGVySFRNTChqLG0pO2cuc2VsZWN0KGwuZ2V0Qm9keSgpLDEpO2cuY29sbGFwc2UoMCl9d2hpbGUobj1oLmdldChrKSl7aC5yZW1vdmUobil9bj1nLmdldFN0YXJ0KCk7ZT1oLmdldFZpZXdQb3J0KGwuZ2V0V2luKCkpO289bC5kb20uZ2V0UG9zKG4pLnk7aT1uLmNsaWVudEhlaWdodDtpZihvPGUueXx8bytpPmUueStlLmgpe2wuZ2V0RG9jKCkuYm9keS5zY3JvbGxUb3A9bzxlLnk/bzpvLWUuaCsyNX19LF9pbnNlcnQ6ZnVuY3Rpb24oZyxlKXt2YXIgZj10aGlzLmVkaXRvcixpPWYuc2VsZWN0aW9uLmdldFJuZygpO2lmKCFmLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpJiZpLnN0YXJ0Q29udGFpbmVyIT1pLmVuZENvbnRhaW5lcil7Zi5nZXREb2MoKS5leGVjQ29tbWFuZCgiRGVsZXRlIixmYWxzZSxudWxsKX1mLmV4ZWNDb21tYW5kKHRpbnltY2UuaXNHZWNrbz8iaW5zZXJ0SFRNTCI6Im1jZUluc2VydENvbnRlbnQiLGZhbHNlLGcse3NraXBfdW5kbzplfSl9LF9pbnNlcnRQbGFpblRleHQ6ZnVuY3Rpb24oaix4LHYpe3ZhciB0LHUsbCxrLHIsZSxwLGYsbj1qLmdldFdpbigpLHo9ai5nZXREb2MoKSxzPWouc2VsZWN0aW9uLG09dGlueW1jZS5pcyx5PXRpbnltY2UuaW5BcnJheSxnPWIoaiwicGFzdGVfdGV4dF9saW5lYnJlYWt0eXBlIiksbz1iKGosInBhc3RlX3RleHRfcmVwbGFjZW1lbnRzIik7ZnVuY3Rpb24gcShoKXtjKGgsZnVuY3Rpb24oaSl7aWYoaS5jb25zdHJ1Y3Rvcj09UmVnRXhwKXt2PXYucmVwbGFjZShpLCIiKX1lbHNle3Y9di5yZXBsYWNlKGlbMF0saVsxXSl9fSl9aWYoKHR5cGVvZih2KT09PSJzdHJpbmciKSYmKHYubGVuZ3RoPjApKXtpZighZCl7ZD0oIjM0LHF1b3QsMzgsYW1wLDM5LGFwb3MsNjAsbHQsNjIsZ3QsIitqLnNlcmlhbGl6ZXIuc2V0dGluZ3MuZW50aXRpZXMpLnNwbGl0KCIsIil9aWYoLzwoPzpwfGJyfGhbMS02XXx1bHxvbHxkbHx0YWJsZXx0W3JkaF18ZGl2fGJsb2NrcXVvdGV8ZmllbGRzZXR8cHJlfGFkZHJlc3N8Y2VudGVyKVtePl0qPi9pLnRlc3Qodikpe3EoWy9bXG5ccl0rL2ddKX1lbHNle3EoWy9ccisvZ10pfXEoW1svPFwvKD86cHxoWzEtNl18dWx8b2x8ZGx8dGFibGV8ZGl2fGJsb2NrcXVvdGV8ZmllbGRzZXR8cHJlfGFkZHJlc3N8Y2VudGVyKT4vZ2ksIlxuXG4iXSxbLzxicltePl0qPnw8XC90cj4vZ2ksIlxuIl0sWy88XC90W2RoXT5ccyo8dFtkaF1bXj5dKj4vZ2ksIlx0Il0sLzxbYS16IVwvP11bXj5dKj4vZ2ksWy8mbmJzcDsvZ2ksIiAiXSxbLyYoI1xkK3xbYS16MC05XXsxLDEwfSk7L2dpLGZ1bmN0aW9uKGksaCl7aWYoaC5jaGFyQXQoMCk9PT0iIyIpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGguc2xpY2UoMSkpfWVsc2V7cmV0dXJuKChpPXkoZCxoKSk+MCk/U3RyaW5nLmZyb21DaGFyQ29kZShkW2ktMV0pOiIgIn19XSxbLyg/Oig/IVxuKVxzKSooXG4rKSg/Oig/IVxuKVxzKSovZ2ksIiQxIl0sWy9cbnszLH0vZywiXG5cbiJdLC9eXHMrfFxzKyQvZ10pO3Y9eC5lbmNvZGUodik7aWYoIXMuaXNDb2xsYXBzZWQoKSl7ei5leGVjQ29tbWFuZCgiRGVsZXRlIixmYWxzZSxudWxsKX1pZihtKG8sImFycmF5Iil8fChtKG8sImFycmF5IikpKXtxKG8pfWVsc2V7aWYobShvLCJzdHJpbmciKSl7cShuZXcgUmVnRXhwKG8sImdpIikpfX1pZihnPT0ibm9uZSIpe3EoW1svXG4rL2csIiAiXV0pfWVsc2V7aWYoZz09ImJyIil7cShbWy9cbi9nLCI8YnIgLz4iXV0pfWVsc2V7cShbL15ccyt8XHMrJC9nLFsvXG5cbi9nLCI8L3A+PHA+Il0sWy9cbi9nLCI8YnIgLz4iXV0pfX1pZigobD12LmluZGV4T2YoIjwvcD48cD4iKSkhPS0xKXtrPXYubGFzdEluZGV4T2YoIjwvcD48cD4iKTtyPXMuZ2V0Tm9kZSgpO2U9W107ZG97aWYoci5ub2RlVHlwZT09MSl7aWYoci5ub2RlTmFtZT09IlREInx8ci5ub2RlTmFtZT09IkJPRFkiKXticmVha31lW2UubGVuZ3RoXT1yfX13aGlsZShyPXIucGFyZW50Tm9kZSk7aWYoZS5sZW5ndGg+MCl7cD12LnN1YnN0cmluZygwLGwpO2Y9IiI7Zm9yKHQ9MCx1PWUubGVuZ3RoO3Q8dTt0Kyspe3ArPSI8LyIrZVt0XS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKyI+IjtmKz0iPCIrZVtlLmxlbmd0aC10LTFdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkrIj4ifWlmKGw9PWspe3Y9cCtmK3Yuc3Vic3RyaW5nKGwrNyl9ZWxzZXt2PXArdi5zdWJzdHJpbmcobCs0LGsrNCkrZit2LnN1YnN0cmluZyhrKzcpfX19ai5leGVjQ29tbWFuZCgibWNlSW5zZXJ0UmF3SFRNTCIsZmFsc2UsdisnPHNwYW4gaWQ9Il9wbGFpbl90ZXh0X21hcmtlciI+Jm5ic3A7PC9zcGFuPicpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGg9eC5nZXQoIl9wbGFpbl90ZXh0X21hcmtlciIpLEIsaSxBLHc7cy5zZWxlY3QoaCxmYWxzZSk7ei5leGVjQ29tbWFuZCgiRGVsZXRlIixmYWxzZSxudWxsKTtoPW51bGw7Qj1zLmdldFN0YXJ0KCk7aT14LmdldFZpZXdQb3J0KG4pO0E9eC5nZXRQb3MoQikueTt3PUIuY2xpZW50SGVpZ2h0O2lmKChBPGkueSl8fChBK3c+aS55K2kuaCkpe3ouYm9keS5zY3JvbGxUb3A9QTxpLnk/QTpBLWkuaCsyNX19LDApfX0sX2xlZ2FjeVN1cHBvcnQ6ZnVuY3Rpb24oKXt2YXIgZj10aGlzLGU9Zi5lZGl0b3I7ZS5hZGRDb21tYW5kKCJtY2VQYXN0ZVdvcmQiLGZ1bmN0aW9uKCl7ZS53aW5kb3dNYW5hZ2VyLm9wZW4oe2ZpbGU6Zi51cmwrIi9wYXN0ZXdvcmQuaHRtIix3aWR0aDpwYXJzZUludChiKGUsInBhc3RlX2RpYWxvZ193aWR0aCIpKSxoZWlnaHQ6cGFyc2VJbnQoYihlLCJwYXN0ZV9kaWFsb2dfaGVpZ2h0IikpLGlubGluZToxfSl9KTtpZihiKGUsInBhc3RlX3RleHRfdXNlX2RpYWxvZyIpKXtlLmFkZENvbW1hbmQoIm1jZVBhc3RlVGV4dCIsZnVuY3Rpb24oKXtlLndpbmRvd01hbmFnZXIub3Blbih7ZmlsZTpmLnVybCsiL3Bhc3RldGV4dC5odG0iLHdpZHRoOnBhcnNlSW50KGIoZSwicGFzdGVfZGlhbG9nX3dpZHRoIikpLGhlaWdodDpwYXJzZUludChiKGUsInBhc3RlX2RpYWxvZ19oZWlnaHQiKSksaW5saW5lOjF9KX0pfWUuYWRkQnV0dG9uKCJwYXN0ZXdvcmQiLHt0aXRsZToicGFzdGUucGFzdGVfd29yZF9kZXNjIixjbWQ6Im1jZVBhc3RlV29yZCJ9KX19KTt0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCJwYXN0ZSIsdGlueW1jZS5wbHVnaW5zLlBhc3RlUGx1Z2luKX0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/paste/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgZWFjaCA9IHRpbnltY2UuZWFjaCwNCgkJZW50aXRpZXMgPSBudWxsLA0KCQlkZWZzID0gew0KCQkJcGFzdGVfYXV0b19jbGVhbnVwX29uX3Bhc3RlIDogdHJ1ZSwNCgkJCXBhc3RlX2Jsb2NrX2Ryb3AgOiBmYWxzZSwNCgkJCXBhc3RlX3JldGFpbl9zdHlsZV9wcm9wZXJ0aWVzIDogIm5vbmUiLA0KCQkJcGFzdGVfc3RyaXBfY2xhc3NfYXR0cmlidXRlcyA6ICJtc28iLA0KCQkJcGFzdGVfcmVtb3ZlX3NwYW5zIDogZmFsc2UsDQoJCQlwYXN0ZV9yZW1vdmVfc3R5bGVzIDogZmFsc2UsDQoJCQlwYXN0ZV9yZW1vdmVfc3R5bGVzX2lmX3dlYmtpdCA6IHRydWUsDQoJCQlwYXN0ZV9jb252ZXJ0X21pZGRvdF9saXN0cyA6IHRydWUsDQoJCQlwYXN0ZV9jb252ZXJ0X2hlYWRlcnNfdG9fc3Ryb25nIDogZmFsc2UsDQoJCQlwYXN0ZV9kaWFsb2dfd2lkdGggOiAiNDUwIiwNCgkJCXBhc3RlX2RpYWxvZ19oZWlnaHQgOiAiNDAwIiwNCgkJCXBhc3RlX3RleHRfdXNlX2RpYWxvZyA6IGZhbHNlLA0KCQkJcGFzdGVfdGV4dF9zdGlja3kgOiBmYWxzZSwNCgkJCXBhc3RlX3RleHRfbm90aWZ5YWx3YXlzIDogZmFsc2UsDQoJCQlwYXN0ZV90ZXh0X2xpbmVicmVha3R5cGUgOiAicCIsDQoJCQlwYXN0ZV90ZXh0X3JlcGxhY2VtZW50cyA6IFsNCgkJCQlbL1x1MjAyNi9nLCAiLi4uIl0sDQoJCQkJWy9bXHg5M1x4OTRcdTIwMWNcdTIwMWRdL2csICciJ10sDQoJCQkJWy9bXHg2MFx4OTFceDkyXHUyMDE4XHUyMDE5XS9nLCAiJyJdDQoJCQldDQoJCX07DQoNCglmdW5jdGlvbiBnZXRQYXJhbShlZCwgbmFtZSkgew0KCQlyZXR1cm4gZWQuZ2V0UGFyYW0obmFtZSwgZGVmc1tuYW1lXSk7DQoJfQ0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UucGx1Z2lucy5QYXN0ZVBsdWdpbicsIHsNCgkJaW5pdCA6IGZ1bmN0aW9uKGVkLCB1cmwpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5lZGl0b3IgPSBlZDsNCgkJCXQudXJsID0gdXJsOw0KDQoJCQkvLyBTZXR1cCBwbHVnaW4gZXZlbnRzDQoJCQl0Lm9uUHJlUHJvY2VzcyA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0KTsNCgkJCXQub25Qb3N0UHJvY2VzcyA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0KTsNCg0KCQkJLy8gUmVnaXN0ZXIgZGVmYXVsdCBoYW5kbGVycw0KCQkJdC5vblByZVByb2Nlc3MuYWRkKHQuX3ByZVByb2Nlc3MpOw0KCQkJdC5vblBvc3RQcm9jZXNzLmFkZCh0Ll9wb3N0UHJvY2Vzcyk7DQoNCgkJCS8vIFJlZ2lzdGVyIG9wdGlvbmFsIHByZXByb2Nlc3MgaGFuZGxlcg0KCQkJdC5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHBsLCBvKSB7DQoJCQkJZWQuZXhlY0NhbGxiYWNrKCdwYXN0ZV9wcmVwcm9jZXNzJywgcGwsIG8pOw0KCQkJfSk7DQoNCgkJCS8vIFJlZ2lzdGVyIG9wdGlvbmFsIHBvc3Rwcm9jZXNzDQoJCQl0Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKHBsLCBvKSB7DQoJCQkJZWQuZXhlY0NhbGxiYWNrKCdwYXN0ZV9wb3N0cHJvY2VzcycsIHBsLCBvKTsNCgkJCX0pOw0KDQoJCQkvLyBJbml0aWFsaXplIHBsYWluIHRleHQgZmxhZw0KCQkJZWQucGFzdGVBc1BsYWluVGV4dCA9IGZhbHNlOw0KDQoJCQkvLyBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwcm9jZXNzIGhhbmRsZXJzIGFuZCBpbnNlcnRzIHRoZSBjb250ZW50cw0KCQkJLy8gZm9yY2VfcmljaCBvdmVycmlkZXMgcGxhaW4gdGV4dCBtb2RlIHNldCBieSB1c2VyLCBpbXBvcnRhbnQgZm9yIHBhc3Rpbmcgd2l0aCBleGVjQ29tbWFuZA0KCQkJZnVuY3Rpb24gcHJvY2VzcyhvLCBmb3JjZV9yaWNoKSB7DQoJCQkJdmFyIGRvbSA9IGVkLmRvbTsNCg0KCQkJCS8vIEV4ZWN1dGUgcHJlIHByb2Nlc3MgaGFuZGxlcnMNCgkJCQl0Lm9uUHJlUHJvY2Vzcy5kaXNwYXRjaCh0LCBvKTsNCg0KCQkJCS8vIENyZWF0ZSBET00gc3RydWN0dXJlDQoJCQkJby5ub2RlID0gZG9tLmNyZWF0ZSgnZGl2JywgMCwgby5jb250ZW50KTsNCg0KCQkJCS8vIEV4ZWN1dGUgcG9zdCBwcm9jZXNzIGhhbmRsZXJzDQoJCQkJdC5vblBvc3RQcm9jZXNzLmRpc3BhdGNoKHQsIG8pOw0KDQoJCQkJLy8gU2VyaWFsaXplIGNvbnRlbnQNCgkJCQlvLmNvbnRlbnQgPSBlZC5zZXJpYWxpemVyLnNlcmlhbGl6ZShvLm5vZGUsIHtnZXRJbm5lciA6IDF9KTsNCg0KCQkJCS8vIFBsYWluIHRleHQgb3B0aW9uIGFjdGl2ZT8NCgkJCQlpZiAoKCFmb3JjZV9yaWNoKSAmJiAoZWQucGFzdGVBc1BsYWluVGV4dCkpIHsNCgkJCQkJdC5faW5zZXJ0UGxhaW5UZXh0KGVkLCBkb20sIG8uY29udGVudCk7DQoNCgkJCQkJaWYgKCFnZXRQYXJhbShlZCwgInBhc3RlX3RleHRfc3RpY2t5IikpIHsNCgkJCQkJCWVkLnBhc3RlQXNQbGFpblRleHQgPSBmYWxzZTsNCgkJCQkJCWVkLmNvbnRyb2xNYW5hZ2VyLnNldEFjdGl2ZSgicGFzdGV0ZXh0IiwgZmFsc2UpOw0KCQkJCQl9DQoJCQkJfSBlbHNlIGlmICgvPChwfGhbMS02XXx1bHxvbCkvLnRlc3Qoby5jb250ZW50KSkgew0KCQkJCQkvLyBIYW5kbGUgaW5zZXJ0aW9uIG9mIGNvbnRlbnRzIGNvbnRhaW5pbmcgYmxvY2sgZWxlbWVudHMgc2VwYXJhdGVseQ0KCQkJCQl0Ll9pbnNlcnRCbG9ja0NvbnRlbnQoZWQsIGRvbSwgby5jb250ZW50KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQl0Ll9pbnNlcnQoby5jb250ZW50KTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIEFkZCBjb21tYW5kIGZvciBleHRlcm5hbCB1c2FnZQ0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlSW5zZXJ0Q2xpcGJvYXJkQ29udGVudCcsIGZ1bmN0aW9uKHUsIG8pIHsNCgkJCQlwcm9jZXNzKG8sIHRydWUpOw0KCQkJfSk7DQoNCgkJCWlmICghZ2V0UGFyYW0oZWQsICJwYXN0ZV90ZXh0X3VzZV9kaWFsb2ciKSkgew0KCQkJCWVkLmFkZENvbW1hbmQoJ21jZVBhc3RlVGV4dCcsIGZ1bmN0aW9uKHUsIHYpIHsNCgkJCQkJdmFyIGNvb2tpZSA9IHRpbnltY2UudXRpbC5Db29raWU7DQoNCgkJCQkJZWQucGFzdGVBc1BsYWluVGV4dCA9ICFlZC5wYXN0ZUFzUGxhaW5UZXh0Ow0KCQkJCQllZC5jb250cm9sTWFuYWdlci5zZXRBY3RpdmUoJ3Bhc3RldGV4dCcsIGVkLnBhc3RlQXNQbGFpblRleHQpOw0KDQoJCQkJCWlmICgoZWQucGFzdGVBc1BsYWluVGV4dCkgJiYgKCFjb29raWUuZ2V0KCJ0aW55bWNlUGFzdGVUZXh0IikpKSB7DQoJCQkJCQlpZiAoZ2V0UGFyYW0oZWQsICJwYXN0ZV90ZXh0X3N0aWNreSIpKSB7DQoJCQkJCQkJZWQud2luZG93TWFuYWdlci5hbGVydChlZC50cmFuc2xhdGUoJ3Bhc3RlLnBsYWludGV4dF9tb2RlX3N0aWNreScpKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJZWQud2luZG93TWFuYWdlci5hbGVydChlZC50cmFuc2xhdGUoJ3Bhc3RlLnBsYWludGV4dF9tb2RlX3N0aWNreScpKTsNCgkJCQkJCX0NCg0KCQkJCQkJaWYgKCFnZXRQYXJhbShlZCwgInBhc3RlX3RleHRfbm90aWZ5YWx3YXlzIikpIHsNCgkJCQkJCQljb29raWUuc2V0KCJ0aW55bWNlUGFzdGVUZXh0IiwgIjEiLCBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgKyAxLCAxMiwgMzEpKQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWVkLmFkZEJ1dHRvbigncGFzdGV0ZXh0Jywge3RpdGxlOiAncGFzdGUucGFzdGVfdGV4dF9kZXNjJywgY21kOiAnbWNlUGFzdGVUZXh0J30pOw0KCQkJZWQuYWRkQnV0dG9uKCdzZWxlY3RhbGwnLCB7dGl0bGU6ICdwYXN0ZS5zZWxlY3RhbGxfZGVzYycsIGNtZDogJ3NlbGVjdGFsbCd9KTsNCg0KCQkJLy8gVGhpcyBmdW5jdGlvbiBncmFicyB0aGUgY29udGVudHMgZnJvbSB0aGUgY2xpcGJvYXJkIGJ5IGFkZGluZyBhDQoJCQkvLyBoaWRkZW4gZGl2IGFuZCBwbGFjaW5nIHRoZSBjYXJldCBpbnNpZGUgaXQgYW5kIGFmdGVyIHRoZSBicm93c2VyIHBhc3RlDQoJCQkvLyBpcyBkb25lIGl0IGdyYWJzIHRoYXQgY29udGVudHMgYW5kIHByb2Nlc3NlcyB0aGF0DQoJCQlmdW5jdGlvbiBncmFiQ29udGVudChlKSB7DQoJCQkJdmFyIG4sIG9yLCBybmcsIHNlbCA9IGVkLnNlbGVjdGlvbiwgZG9tID0gZWQuZG9tLCBib2R5ID0gZWQuZ2V0Qm9keSgpLCBwb3NZOw0KDQoJCQkJLy8gQ2hlY2sgaWYgYnJvd3NlciBzdXBwb3J0cyBkaXJlY3QgcGxhaW50ZXh0IGFjY2Vzcw0KCQkJCWlmIChlZC5wYXN0ZUFzUGxhaW5UZXh0ICYmIChlLmNsaXBib2FyZERhdGEgfHwgZG9tLmRvYy5kYXRhVHJhbnNmZXIpKSB7DQoJCQkJCWUucHJldmVudERlZmF1bHQoKTsNCgkJCQkJcHJvY2Vzcyh7Y29udGVudCA6IChlLmNsaXBib2FyZERhdGEgfHwgZG9tLmRvYy5kYXRhVHJhbnNmZXIpLmdldERhdGEoJ1RleHQnKS5yZXBsYWNlKC9ccj9cbi9nLCAnPGJyIC8+Jyl9KTsNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCg0KCQkJCWlmIChkb20uZ2V0KCdfbWNlUGFzdGUnKSkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJLy8gQ3JlYXRlIGNvbnRhaW5lciB0byBwYXN0ZSBpbnRvDQoJCQkJbiA9IGRvbS5hZGQoYm9keSwgJ2RpdicsIHtpZCA6ICdfbWNlUGFzdGUnLCAnY2xhc3MnIDogJ21jZVBhc3RlJ30sICdcdUZFRkY8YnIgX21jZV9ib2d1cz0iMSI+Jyk7DQoNCgkJCQkvLyBJZiBjb250ZW50RWRpdGFibGUgbW9kZSB3ZSBuZWVkIHRvIGZpbmQgb3V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2xvc2VzdCBlbGVtZW50DQoJCQkJaWYgKGJvZHkgIT0gZWQuZ2V0RG9jKCkuYm9keSkNCgkJCQkJcG9zWSA9IGRvbS5nZXRQb3MoZWQuc2VsZWN0aW9uLmdldFN0YXJ0KCksIGJvZHkpLnk7DQoJCQkJZWxzZQ0KCQkJCQlwb3NZID0gYm9keS5zY3JvbGxUb3A7DQoNCgkJCQkvLyBTdHlsZXMgbmVlZHMgdG8gYmUgYXBwbGllZCBhZnRlciB0aGUgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgZG9jdW1lbnQgc2luY2UgV2ViS2l0IHdpbGwgb3RoZXJ3aXNlIHJlbW92ZSBhbGwgc3R5bGVzDQoJCQkJZG9tLnNldFN0eWxlcyhuLCB7DQoJCQkJCXBvc2l0aW9uIDogJ2Fic29sdXRlJywNCgkJCQkJbGVmdCA6IC0xMDAwMCwNCgkJCQkJdG9wIDogcG9zWSwNCgkJCQkJd2lkdGggOiAxLA0KCQkJCQloZWlnaHQgOiAxLA0KCQkJCQlvdmVyZmxvdyA6ICdoaWRkZW4nDQoJCQkJfSk7DQoNCgkJCQlpZiAodGlueW1jZS5pc0lFKSB7DQoJCQkJCS8vIFNlbGVjdCB0aGUgY29udGFpbmVyDQoJCQkJCXJuZyA9IGRvbS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsNCgkJCQkJcm5nLm1vdmVUb0VsZW1lbnRUZXh0KG4pOw0KCQkJCQlybmcuZXhlY0NvbW1hbmQoJ1Bhc3RlJyk7DQoNCgkJCQkJLy8gUmVtb3ZlIGNvbnRhaW5lcg0KCQkJCQlkb20ucmVtb3ZlKG4pOw0KDQoJCQkJCS8vIENoZWNrIGlmIHRoZSBjb250ZW50cyB3YXMgY2hhbmdlZCwgaWYgaXQgd2Fzbid0IHRoZW4gY2xpcGJvYXJkIGV4dHJhY3Rpb24gZmFpbGVkIHByb2JhYmx5IGR1ZQ0KCQkJCQkvLyB0byBJRSBzZWN1cml0eSBzZXR0aW5ncyBzbyB3ZSBwYXNzIHRoZSBqdW5rIHRob3VnaCBiZXR0ZXIgdGhhbiBub3RoaW5nIHJpZ2h0DQoJCQkJCWlmIChuLmlubmVySFRNTCA9PT0gJ1x1RkVGRicpIHsNCgkJCQkJCWVkLmV4ZWNDb21tYW5kKCdtY2VQYXN0ZVdvcmQnKTsNCgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsNCgkJCQkJCXJldHVybjsNCgkJCQkJfQ0KDQoJCQkJCS8vIFByb2Nlc3MgY29udGVudHMNCgkJCQkJcHJvY2Vzcyh7Y29udGVudCA6IG4uaW5uZXJIVE1MfSk7DQoNCgkJCQkJLy8gQmxvY2sgdGhlIHJlYWwgcGFzdGUgZXZlbnQNCgkJCQkJcmV0dXJuIHRpbnltY2UuZG9tLkV2ZW50LmNhbmNlbChlKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlmdW5jdGlvbiBibG9jayhlKSB7DQoJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7DQoJCQkJCX07DQoNCgkJCQkJLy8gQmxvY2sgbW91c2Vkb3duIGFuZCBjbGljayB0byBwcmV2ZW50IHNlbGVjdGlvbiBjaGFuZ2UNCgkJCQkJZG9tLmJpbmQoZWQuZ2V0RG9jKCksICdtb3VzZWRvd24nLCBibG9jayk7DQoJCQkJCWRvbS5iaW5kKGVkLmdldERvYygpLCAna2V5ZG93bicsIGJsb2NrKTsNCg0KCQkJCQlvciA9IGVkLnNlbGVjdGlvbi5nZXRSbmcoKTsNCg0KCQkJCQkvLyBNb3ZlIGNhcmV0IGludG8gaGlkZGVuIGRpdg0KCQkJCQluID0gbi5maXJzdENoaWxkOw0KCQkJCQlybmcgPSBlZC5nZXREb2MoKS5jcmVhdGVSYW5nZSgpOw0KCQkJCQlybmcuc2V0U3RhcnQobiwgMCk7DQoJCQkJCXJuZy5zZXRFbmQobiwgMSk7DQoJCQkJCXNlbC5zZXRSbmcocm5nKTsNCg0KCQkJCQkvLyBXYWl0IGEgd2hpbGUgYW5kIGdyYWIgdGhlIHBhc3RlZCBjb250ZW50cw0KCQkJCQl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsNCgkJCQkJCXZhciBoID0gJycsIG5sID0gZG9tLnNlbGVjdCgnZGl2Lm1jZVBhc3RlJyk7DQoNCgkJCQkJCS8vIFdlYktpdCB3aWxsIHNwbGl0IHRoZSBkaXYgaW50byBtdWx0aXBsZSBvbmVzIHNvIHRoaXMgd2lsbCBsb29wIHRocm91Z2ggdGhlbiBhbGwgYW5kIGpvaW4gdGhlbSB0byBnZXQgdGhlIHdob2xlIEhUTUwgc3RyaW5nDQoJCQkJCQllYWNoKG5sLCBmdW5jdGlvbihuKSB7DQoJCQkJCQkJdmFyIGNoaWxkID0gbi5maXJzdENoaWxkOw0KDQoJCQkJCQkJLy8gV2ViS2l0IGluc2VydHMgYSBESVYgY29udGFpbmVyIHdpdGggbG90cyBvZiBvZGQgc3R5bGVzDQoJCQkJCQkJaWYgKGNoaWxkICYmIGNoaWxkLm5vZGVOYW1lID09ICdESVYnICYmIGNoaWxkLnN0eWxlLm1hcmdpblRvcCAmJiBjaGlsZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHsNCgkJCQkJCQkJZG9tLnJlbW92ZShjaGlsZCwgMSk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gV2ViS2l0IGR1cGxpY2F0ZXMgdGhlIGRpdnMgc28gd2UgbmVlZCB0byByZW1vdmUgdGhlbQ0KCQkJCQkJCWVhY2goZG9tLnNlbGVjdCgnZGl2Lm1jZVBhc3RlJywgbiksIGZ1bmN0aW9uKG4pIHsNCgkJCQkJCQkJZG9tLnJlbW92ZShuLCAxKTsNCgkJCQkJCQl9KTsNCg0KCQkJCQkJCS8vIFJlbW92ZSBhcHBseSBzdHlsZSBzcGFucw0KCQkJCQkJCWVhY2goZG9tLnNlbGVjdCgnc3Bhbi5BcHBsZS1zdHlsZS1zcGFuJywgbiksIGZ1bmN0aW9uKG4pIHsNCgkJCQkJCQkJZG9tLnJlbW92ZShuLCAxKTsNCgkJCQkJCQl9KTsNCg0KCQkJCQkJCS8vIFJlbW92ZSBib2d1cyBiciBlbGVtZW50cw0KCQkJCQkJCWVhY2goZG9tLnNlbGVjdCgnYnJbX21jZV9ib2d1c10nLCBuKSwgZnVuY3Rpb24obikgew0KCQkJCQkJCQlkb20ucmVtb3ZlKG4pOw0KCQkJCQkJCX0pOw0KDQoJCQkJCQkJaCArPSBuLmlubmVySFRNTDsNCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBSZW1vdmUgdGhlIG5vZGVzDQoJCQkJCQllYWNoKG5sLCBmdW5jdGlvbihuKSB7DQoJCQkJCQkJZG9tLnJlbW92ZShuKTsNCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBSZXN0b3JlIHRoZSBvbGQgc2VsZWN0aW9uDQoJCQkJCQlpZiAob3IpDQoJCQkJCQkJc2VsLnNldFJuZyhvcik7DQoNCgkJCQkJCXByb2Nlc3Moe2NvbnRlbnQgOiBofSk7DQoNCgkJCQkJCS8vIFVuYmxvY2sgZXZlbnRzIG9uZXMgd2UgZ290IHRoZSBjb250ZW50cw0KCQkJCQkJZG9tLnVuYmluZChlZC5nZXREb2MoKSwgJ21vdXNlZG93bicsIGJsb2NrKTsNCgkJCQkJCWRvbS51bmJpbmQoZWQuZ2V0RG9jKCksICdrZXlkb3duJywgYmxvY2spOw0KCQkJCQl9LCAwKTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIENoZWNrIGlmIHdlIHNob3VsZCB1c2UgdGhlIG5ldyBhdXRvIHByb2Nlc3MgbWV0aG9kCQkJDQoJCQlpZiAoZ2V0UGFyYW0oZWQsICJwYXN0ZV9hdXRvX2NsZWFudXBfb25fcGFzdGUiKSkgew0KCQkJCS8vIElzIGl0J3MgT3BlcmEgb3Igb2xkZXIgRkYgdXNlIGtleSBoYW5kbGVyDQoJCQkJaWYgKHRpbnltY2UuaXNPcGVyYSB8fCAvRmlyZWZveFwvMi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgew0KCQkJCQllZC5vbktleURvd24uYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCQlpZiAoKCh0aW55bWNlLmlzTWFjID8gZS5tZXRhS2V5IDogZS5jdHJsS2V5KSAmJiBlLmtleUNvZGUgPT0gODYpIHx8IChlLnNoaWZ0S2V5ICYmIGUua2V5Q29kZSA9PSA0NSkpDQoJCQkJCQkJZ3JhYkNvbnRlbnQoZSk7DQoJCQkJCX0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIEdyYWIgY29udGVudHMgb24gcGFzdGUgZXZlbnQgb24gR2Vja28gYW5kIFdlYktpdA0KCQkJCQllZC5vblBhc3RlLmFkZFRvVG9wKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCQlyZXR1cm4gZ3JhYkNvbnRlbnQoZSk7DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gQmxvY2sgYWxsIGRyYWcvZHJvcCBldmVudHMNCgkJCWlmIChnZXRQYXJhbShlZCwgInBhc3RlX2Jsb2NrX2Ryb3AiKSkgew0KCQkJCWVkLm9uSW5pdC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCWVkLmRvbS5iaW5kKGVkLmdldEJvZHkoKSwgWydkcmFnZW5kJywgJ2RyYWdvdmVyJywgJ2RyYWdnZXN0dXJlJywgJ2RyYWdkcm9wJywgJ2Ryb3AnLCAnZHJhZyddLCBmdW5jdGlvbihlKSB7DQoJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7DQoJCQkJCQllLnN0b3BQcm9wYWdhdGlvbigpOw0KDQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBBZGQgbGVnYWN5IHN1cHBvcnQNCgkJCXQuX2xlZ2FjeVN1cHBvcnQoKTsNCgkJfSwNCg0KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gew0KCQkJCWxvbmduYW1lIDogJ1Bhc3RlIHRleHQvd29yZCcsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbScsDQoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvcGFzdGUnLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9LA0KDQoJCV9wcmVQcm9jZXNzIDogZnVuY3Rpb24ocGwsIG8pIHsNCgkJCS8vY29uc29sZS5sb2coJ0JlZm9yZSBwcmVwcm9jZXNzOicgKyBvLmNvbnRlbnQpOw0KDQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvciwNCgkJCQloID0gby5jb250ZW50LA0KCQkJCWdyZXAgPSB0aW55bWNlLmdyZXAsDQoJCQkJZXhwbG9kZSA9IHRpbnltY2UuZXhwbG9kZSwNCgkJCQl0cmltID0gdGlueW1jZS50cmltLA0KCQkJCWxlbiwgc3RyaXBDbGFzczsNCg0KCQkJZnVuY3Rpb24gcHJvY2VzcyhpdGVtcykgew0KCQkJCWVhY2goaXRlbXMsIGZ1bmN0aW9uKHYpIHsNCgkJCQkJLy8gUmVtb3ZlIG9yIHJlcGxhY2UNCgkJCQkJaWYgKHYuY29uc3RydWN0b3IgPT0gUmVnRXhwKQ0KCQkJCQkJaCA9IGgucmVwbGFjZSh2LCAnJyk7DQoJCQkJCWVsc2UNCgkJCQkJCWggPSBoLnJlcGxhY2UodlswXSwgdlsxXSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCS8vIERldGVjdCBXb3JkIGNvbnRlbnQgYW5kIHByb2Nlc3MgaXQgbW9yZSBhZ2dyZXNzaXZlDQoJCQlpZiAoL2NsYXNzPSI/TXNvfHN0eWxlPSJbXiJdKlxibXNvLXx3OldvcmREb2N1bWVudC9pLnRlc3QoaCkgfHwgby53b3JkQ29udGVudCkgew0KCQkJCW8ud29yZENvbnRlbnQgPSB0cnVlOwkJCS8vIE1hcmsgdGhlIHBhc3RlZCBjb250ZW50cyBhcyB3b3JkIHNwZWNpZmljIGNvbnRlbnQNCgkJCQkvL2NvbnNvbGUubG9nKCdXb3JkIGNvbnRlbnRzIGRldGVjdGVkLicpOw0KDQoJCQkJLy8gUHJvY2VzcyBhd2F5IHNvbWUgYmFzaWMgY29udGVudA0KCQkJCXByb2Nlc3MoWw0KCQkJCQkvXlxzKigmbmJzcDspKy9naSwJCQkJLy8gJm5ic3A7IGVudGl0aWVzIGF0IHRoZSBzdGFydCBvZiBjb250ZW50cw0KCQkJCQkvKCZuYnNwO3w8YnJbXj5dKj4pK1xzKiQvZ2kJCS8vICZuYnNwOyBlbnRpdGllcyBhdCB0aGUgZW5kIG9mIGNvbnRlbnRzDQoJCQkJXSk7DQoNCgkJCQlpZiAoZ2V0UGFyYW0oZWQsICJwYXN0ZV9jb252ZXJ0X2hlYWRlcnNfdG9fc3Ryb25nIikpIHsNCgkJCQkJaCA9IGgucmVwbGFjZSgvPHAgW14+XSpjbGFzcz0iP01zb0hlYWRpbmciP1tePl0qPiguKj8pPFwvcD4vZ2ksICI8cD48c3Ryb25nPiQxPC9zdHJvbmc+PC9wPiIpOw0KCQkJCX0NCg0KCQkJCWlmIChnZXRQYXJhbShlZCwgInBhc3RlX2NvbnZlcnRfbWlkZG90X2xpc3RzIikpIHsNCgkJCQkJcHJvY2VzcyhbDQoJCQkJCQlbLzwhLS1cW2lmICFzdXBwb3J0TGlzdHNcXS0tPi9naSwgJyQmX19NQ0VfSVRFTV9fJ10sCQkJCQkvLyBDb252ZXJ0IHN1cHBvcnRMaXN0cyB0byBhIGxpc3QgaXRlbSBtYXJrZXINCgkJCQkJCVsvKDxzcGFuW14+XSsoPzptc28tbGlzdDp8OlxzKnN5bWJvbClbXj5dKz4pL2dpLCAnJDFfX01DRV9JVEVNX18nXQkJLy8gQ29udmVydCBtc28tbGlzdCBhbmQgc3ltYm9sIHNwYW5zIHRvIGl0ZW0gbWFya2Vycw0KCQkJCQldKTsNCgkJCQl9DQoNCgkJCQlwcm9jZXNzKFsNCgkJCQkJLy8gV29yZCBjb21tZW50cyBsaWtlIGNvbmRpdGlvbmFsIGNvbW1lbnRzIGV0Yw0KCQkJCQkvPCEtLVtcc1xTXSs/LS0+L2dpLA0KDQoJCQkJCS8vIFJlbW92ZSBjb21tZW50cywgc2NyaXB0cyAoZS5nLiwgbXNvU2hvd0NvbW1lbnQpLCBYTUwgdGFnLCBWTUwgY29udGVudCwgTVMgT2ZmaWNlIG5hbWVzcGFjZWQgdGFncywgYW5kIGEgZmV3IG90aGVyIHRhZ3MNCgkJCQkJLzwoIXxzY3JpcHRbXj5dKj4uKj88XC9zY3JpcHQoPz1bPlxzXSl8XC8/KFw/eG1sKDpcdyspP3xpbWd8bWV0YXxsaW5rfHN0eWxlfFx3Olx3KykoPz1bXHNcLz5dKSlbXj5dKj4vZ2ksDQoNCgkJCQkJLy8gQ29udmVydCA8cz4gaW50byA8c3RyaWtlPiBmb3IgbGluZS10aG91Z2gNCgkJCQkJWy88KFwvPylzPi9naSwgIjwkMXN0cmlrZT4iXSwNCg0KCQkJCQkvLyBSZXBsYWNlIG5zYnAgZW50aXRlcyB0byBjaGFyIHNpbmNlIGl0J3MgZWFzaWVyIHRvIGhhbmRsZQ0KCQkJCQlbLyZuYnNwOy9naSwgIlx1MDBhMCJdDQoJCQkJXSk7DQoNCgkJCQkvLyBSZW1vdmUgYmFkIGF0dHJpYnV0ZXMsIHdpdGggb3Igd2l0aG91dCBxdW90ZXMsIGVuc3VyaW5nIHRoYXQgYXR0cmlidXRlIHRleHQgaXMgcmVhbGx5IGluc2lkZSBhIHRhZy4NCgkJCQkvLyBJZiBKYXZhU2NyaXB0IGhhZCBhIFJlZ0V4cCBsb29rLWJlaGluZCwgd2UgY291bGQgaGF2ZSBpbnRlZ3JhdGVkIHRoaXMgd2l0aCB0aGUgbGFzdCBwcm9jZXNzKCkgYXJyYXkgYW5kIGdvdCByaWQgb2YgdGhlIGxvb3AuIEJ1dCBhbGFzLCBpdCBkb2VzIG5vdCwgc28gd2UgY2Fubm90Lg0KCQkJCWRvIHsNCgkJCQkJbGVuID0gaC5sZW5ndGg7DQoJCQkJCWggPSBoLnJlcGxhY2UoLyg8W2Etel1bXj5dKlxzKSg/OmlkfG5hbWV8bGFuZ3VhZ2V8dHlwZXxvblx3K3xcdys6XHcrKT0oPzoiW14iXSoifFx3Kylccz8vZ2ksICIkMSIpOw0KCQkJCX0gd2hpbGUgKGxlbiAhPSBoLmxlbmd0aCk7DQoNCgkJCQkvLyBSZW1vdmUgYWxsIHNwYW5zIGlmIG5vIHN0eWxlcyBpcyB0byBiZSByZXRhaW5lZA0KCQkJCWlmIChnZXRQYXJhbShlZCwgInBhc3RlX3JldGFpbl9zdHlsZV9wcm9wZXJ0aWVzIikucmVwbGFjZSgvXm5vbmUkL2ksICIiKS5sZW5ndGggPT0gMCkgew0KCQkJCQloID0gaC5yZXBsYWNlKC88XC8/c3BhbltePl0qPi9naSwgIiIpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIFdlJ3JlIGtlZXBpbmcgc3R5bGVzLCBzbyBhdCBsZWFzdCBjbGVhbiB0aGVtIHVwLg0KCQkJCQkvLyBDU1MgUmVmZXJlbmNlOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYWExNTU0NzcuYXNweA0KDQoJCQkJCXByb2Nlc3MoWw0KCQkJCQkJLy8gQ29udmVydCA8c3BhbiBzdHlsZT0ibXNvLXNwYWNlcnVuOnllcyI+X19fPC9zcGFuPiB0byBzdHJpbmcgb2YgYWx0ZXJuYXRpbmcgYnJlYWtpbmcvbm9uLWJyZWFraW5nIHNwYWNlcyBvZiBzYW1lIGxlbmd0aA0KCQkJCQkJWy88c3BhblxzK3N0eWxlXHMqPVxzKiJccyptc28tc3BhY2VydW5ccyo6XHMqeWVzXHMqOz9ccyoiXHMqPihbXHNcdTAwYTBdKik8XC9zcGFuPi9naSwNCgkJCQkJCQlmdW5jdGlvbihzdHIsIHNwYWNlcykgew0KCQkJCQkJCQlyZXR1cm4gKHNwYWNlcy5sZW5ndGggPiAwKT8gc3BhY2VzLnJlcGxhY2UoLy4vLCAiICIpLnNsaWNlKE1hdGguZmxvb3Ioc3BhY2VzLmxlbmd0aC8yKSkuc3BsaXQoIiIpLmpvaW4oIlx1MDBhMCIpIDogIiI7DQoJCQkJCQkJfQ0KCQkJCQkJXSwNCg0KCQkJCQkJLy8gRXhhbWluZSBhbGwgc3R5bGVzOiBkZWxldGUganVuaywgdHJhbnNmb3JtIHNvbWUsIGFuZCBrZWVwIHRoZSByZXN0DQoJCQkJCQlbLyg8W2Etel1bXj5dKilcc3N0eWxlPSIoW14iXSopIi9naSwNCgkJCQkJCQlmdW5jdGlvbihzdHIsIHRhZywgc3R5bGUpIHsNCgkJCQkJCQkJdmFyIG4gPSBbXSwNCgkJCQkJCQkJCWkgPSAwLA0KCQkJCQkJCQkJcyA9IGV4cGxvZGUodHJpbShzdHlsZSkucmVwbGFjZSgvJnF1b3Q7L2dpLCAiJyIpLCAiOyIpOw0KDQoJCQkJCQkJCS8vIEV4YW1pbmUgZWFjaCBzdHlsZSBkZWZpbml0aW9uIHdpdGhpbiB0aGUgdGFnJ3Mgc3R5bGUgYXR0cmlidXRlDQoJCQkJCQkJCWVhY2gocywgZnVuY3Rpb24odikgew0KCQkJCQkJCQkJdmFyIG5hbWUsIHZhbHVlLA0KCQkJCQkJCQkJCXBhcnRzID0gZXhwbG9kZSh2LCAiOiIpOw0KDQoJCQkJCQkJCQlmdW5jdGlvbiBlbnN1cmVVbml0cyh2KSB7DQoJCQkJCQkJCQkJcmV0dXJuIHYgKyAoKHYgIT09ICIwIikgJiYgKC9cZCQvLnRlc3QodikpKT8gInB4IiA6ICIiOw0KCQkJCQkJCQkJfQ0KDQoJCQkJCQkJCQlpZiAocGFydHMubGVuZ3RoID09IDIpIHsNCgkJCQkJCQkJCQluYW1lID0gcGFydHNbMF0udG9Mb3dlckNhc2UoKTsNCgkJCQkJCQkJCQl2YWx1ZSA9IHBhcnRzWzFdLnRvTG93ZXJDYXNlKCk7DQoNCgkJCQkJCQkJCQkvLyBUcmFuc2xhdGUgY2VydGFpbiBNUyBPZmZpY2Ugc3R5bGVzIGludG8gdGhlaXIgQ1NTIGVxdWl2YWxlbnRzDQoJCQkJCQkJCQkJc3dpdGNoIChuYW1lKSB7DQoJCQkJCQkJCQkJCWNhc2UgIm1zby1wYWRkaW5nLWFsdCI6DQoJCQkJCQkJCQkJCWNhc2UgIm1zby1wYWRkaW5nLXRvcC1hbHQiOg0KCQkJCQkJCQkJCQljYXNlICJtc28tcGFkZGluZy1yaWdodC1hbHQiOg0KCQkJCQkJCQkJCQljYXNlICJtc28tcGFkZGluZy1ib3R0b20tYWx0IjoNCgkJCQkJCQkJCQkJY2FzZSAibXNvLXBhZGRpbmctbGVmdC1hbHQiOg0KCQkJCQkJCQkJCQljYXNlICJtc28tbWFyZ2luLWFsdCI6DQoJCQkJCQkJCQkJCWNhc2UgIm1zby1tYXJnaW4tdG9wLWFsdCI6DQoJCQkJCQkJCQkJCWNhc2UgIm1zby1tYXJnaW4tcmlnaHQtYWx0IjoNCgkJCQkJCQkJCQkJY2FzZSAibXNvLW1hcmdpbi1ib3R0b20tYWx0IjoNCgkJCQkJCQkJCQkJY2FzZSAibXNvLW1hcmdpbi1sZWZ0LWFsdCI6DQoJCQkJCQkJCQkJCWNhc2UgIm1zby10YWJsZS1sYXlvdXQtYWx0IjoNCgkJCQkJCQkJCQkJY2FzZSAibXNvLWhlaWdodCI6DQoJCQkJCQkJCQkJCWNhc2UgIm1zby13aWR0aCI6DQoJCQkJCQkJCQkJCWNhc2UgIm1zby12ZXJ0aWNhbC1hbGlnbi1hbHQiOg0KCQkJCQkJCQkJCQkJbltpKytdID0gbmFtZS5yZXBsYWNlKC9ebXNvLXwtYWx0JC9nLCAiIikgKyAiOiIgKyBlbnN1cmVVbml0cyh2YWx1ZSk7DQoJCQkJCQkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCQkJCQkJY2FzZSAiaG9yaXotYWxpZ24iOg0KCQkJCQkJCQkJCQkJbltpKytdID0gInRleHQtYWxpZ246IiArIHZhbHVlOw0KCQkJCQkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJCQkJCWNhc2UgInZlcnQtYWxpZ24iOg0KCQkJCQkJCQkJCQkJbltpKytdID0gInZlcnRpY2FsLWFsaWduOiIgKyB2YWx1ZTsNCgkJCQkJCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJCQkJCQljYXNlICJmb250LWNvbG9yIjoNCgkJCQkJCQkJCQkJY2FzZSAibXNvLWZvcmVncm91bmQiOg0KCQkJCQkJCQkJCQkJbltpKytdID0gImNvbG9yOiIgKyB2YWx1ZTsNCgkJCQkJCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJCQkJCQljYXNlICJtc28tYmFja2dyb3VuZCI6DQoJCQkJCQkJCQkJCWNhc2UgIm1zby1oaWdobGlnaHQiOg0KCQkJCQkJCQkJCQkJbltpKytdID0gImJhY2tncm91bmQ6IiArIHZhbHVlOw0KCQkJCQkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJCQkJCWNhc2UgIm1zby1kZWZhdWx0LWhlaWdodCI6DQoJCQkJCQkJCQkJCQluW2krK10gPSAibWluLWhlaWdodDoiICsgZW5zdXJlVW5pdHModmFsdWUpOw0KCQkJCQkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJCQkJCWNhc2UgIm1zby1kZWZhdWx0LXdpZHRoIjoNCgkJCQkJCQkJCQkJCW5baSsrXSA9ICJtaW4td2lkdGg6IiArIGVuc3VyZVVuaXRzKHZhbHVlKTsNCgkJCQkJCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJCQkJCQljYXNlICJtc28tcGFkZGluZy1iZXR3ZWVuLWFsdCI6DQoJCQkJCQkJCQkJCQluW2krK10gPSAiYm9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlO2JvcmRlci1zcGFjaW5nOiIgKyBlbnN1cmVVbml0cyh2YWx1ZSk7DQoJCQkJCQkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCQkJCQkJY2FzZSAidGV4dC1saW5lLXRocm91Z2giOg0KCQkJCQkJCQkJCQkJaWYgKCh2YWx1ZSA9PSAic2luZ2xlIikgfHwgKHZhbHVlID09ICJkb3VibGUiKSkgew0KCQkJCQkJCQkJCQkJCW5baSsrXSA9ICJ0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdoIjsNCgkJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJCQkJCQljYXNlICJtc28temVyby1oZWlnaHQiOg0KCQkJCQkJCQkJCQkJaWYgKHZhbHVlID09ICJ5ZXMiKSB7DQoJCQkJCQkJCQkJCQkJbltpKytdID0gImRpc3BsYXk6bm9uZSI7DQoJCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJCQlyZXR1cm47DQoJCQkJCQkJCQkJfQ0KDQoJCQkJCQkJCQkJLy8gRWxpbWluYXRlIGFsbCBNUyBPZmZpY2Ugc3R5bGUgZGVmaW5pdGlvbnMgdGhhdCBoYXZlIG5vIENTUyBlcXVpdmFsZW50IGJ5IGV4YW1pbmluZyB0aGUgZmlyc3QgY2hhcmFjdGVycyBpbiB0aGUgbmFtZQ0KCQkJCQkJCQkJCWlmICgvXihtc298Y29sdW1ufGZvbnQtZW1waHxsYW5nfGxheW91dHxsaW5lLWJyZWFrfGxpc3QtaW1hZ2V8bmF2fHBhbm9zZXxwdW5jdHxyb3d8cnVieXxzZXB8c2l6ZXxzcmN8dGFiLXx0YWJsZS1ib3JkZXJ8dGV4dC0oPyFhbGlnbnxkZWNvcnxpbmRlbnR8dHJhbnMpfHRvcC1iYXJ8dmVyc2lvbnx2bmR8d29yZC1icmVhaykvLnRlc3QobmFtZSkpIHsNCgkJCQkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCQkJCX0NCg0KCQkJCQkJCQkJCS8vIElmIGl0IHJlYWNoZWQgdGhpcyBwb2ludCwgaXQgbXVzdCBiZSBhIHZhbGlkIENTUyBzdHlsZQ0KCQkJCQkJCQkJCW5baSsrXSA9IG5hbWUgKyAiOiIgKyBwYXJ0c1sxXTsJCS8vIExvd2VyLWNhc2UgbmFtZSwgYnV0IGtlZXAgdmFsdWUgY2FzZQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9KTsNCg0KCQkJCQkJCQkvLyBJZiBzdHlsZSBhdHRyaWJ1dGUgY29udGFpbmVkIGFueSB2YWxpZCBzdHlsZXMgdGhlIHJlLXdyaXRlIGl0OyBvdGhlcndpc2UgZGVsZXRlIHN0eWxlIGF0dHJpYnV0ZS4NCgkJCQkJCQkJaWYgKGkgPiAwKSB7DQoJCQkJCQkJCQlyZXR1cm4gdGFnICsgJyBzdHlsZT0iJyArIG4uam9pbignOycpICsgJyInOw0KCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJcmV0dXJuIHRhZzsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCV0NCgkJCQkJXSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBSZXBsYWNlIGhlYWRlcnMgd2l0aCA8c3Ryb25nPg0KCQkJaWYgKGdldFBhcmFtKGVkLCAicGFzdGVfY29udmVydF9oZWFkZXJzX3RvX3N0cm9uZyIpKSB7DQoJCQkJcHJvY2VzcyhbDQoJCQkJCVsvPGhbMS02XVtePl0qPi9naSwgIjxwPjxzdHJvbmc+Il0sDQoJCQkJCVsvPFwvaFsxLTZdW14+XSo+L2dpLCAiPC9zdHJvbmc+PC9wPiJdDQoJCQkJXSk7DQoJCQl9DQoNCgkJCS8vIENsYXNzIGF0dHJpYnV0ZSBvcHRpb25zIGFyZTogbGVhdmUgYWxsIGFzLWlzICgibm9uZSIpLCByZW1vdmUgYWxsICgiYWxsIiksIG9yIHJlbW92ZSBvbmx5IHRob3NlIHN0YXJ0aW5nIHdpdGggbXNvICgibXNvIikuDQoJCQkvLyBOb3RlOi0gIHBhc3RlX3N0cmlwX2NsYXNzX2F0dHJpYnV0ZXM6ICJub25lIiwgdmVyaWZ5X2Nzc19jbGFzc2VzOiB0cnVlIGlzIGFsc28gYSBnb29kIHZhcmlhdGlvbi4NCgkJCXN0cmlwQ2xhc3MgPSBnZXRQYXJhbShlZCwgInBhc3RlX3N0cmlwX2NsYXNzX2F0dHJpYnV0ZXMiKTsNCg0KCQkJaWYgKHN0cmlwQ2xhc3MgIT09ICJub25lIikgew0KCQkJCWZ1bmN0aW9uIHJlbW92ZUNsYXNzZXMobWF0Y2gsIGcxKSB7DQoJCQkJCQlpZiAoc3RyaXBDbGFzcyA9PT0gImFsbCIpDQoJCQkJCQkJcmV0dXJuICcnOw0KDQoJCQkJCQl2YXIgY2xzID0gZ3JlcChleHBsb2RlKGcxLnJlcGxhY2UoL14oWyInXSkoLiopXDEkLywgIiQyIiksICIgIiksDQoJCQkJCQkJZnVuY3Rpb24odikgew0KCQkJCQkJCQlyZXR1cm4gKC9eKD8hbXNvKS9pLnRlc3QodikpOw0KCQkJCQkJCX0NCgkJCQkJCSk7DQoNCgkJCQkJCXJldHVybiBjbHMubGVuZ3RoID8gJyBjbGFzcz0iJyArIGNscy5qb2luKCIgIikgKyAnIicgOiAnJzsNCgkJCQl9Ow0KDQoJCQkJaCA9IGgucmVwbGFjZSgvIGNsYXNzPSIoW14iXSspIi9naSwgcmVtb3ZlQ2xhc3Nlcyk7DQoJCQkJaCA9IGgucmVwbGFjZSgvIGNsYXNzPShcdyspL2dpLCByZW1vdmVDbGFzc2VzKTsNCgkJCX0NCg0KCQkJLy8gUmVtb3ZlIHNwYW5zIG9wdGlvbg0KCQkJaWYgKGdldFBhcmFtKGVkLCAicGFzdGVfcmVtb3ZlX3NwYW5zIikpIHsNCgkJCQloID0gaC5yZXBsYWNlKC88XC8/c3BhbltePl0qPi9naSwgIiIpOw0KCQkJfQ0KDQoJCQkvL2NvbnNvbGUubG9nKCdBZnRlciBwcmVwcm9jZXNzOicgKyBoKTsNCg0KCQkJby5jb250ZW50ID0gaDsNCgkJfSwNCg0KCQkvKioNCgkJICogVmFyaW91cyBwb3N0IHByb2Nlc3MgaXRlbXMuDQoJCSAqLw0KCQlfcG9zdFByb2Nlc3MgOiBmdW5jdGlvbihwbCwgbykgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBkb20gPSBlZC5kb20sIHN0eWxlUHJvcHM7DQoNCgkJCWlmIChvLndvcmRDb250ZW50KSB7DQoJCQkJLy8gUmVtb3ZlIG5hbWVkIGFuY2hvcnMgb3IgVE9DIGxpbmtzDQoJCQkJZWFjaChkb20uc2VsZWN0KCdhJywgby5ub2RlKSwgZnVuY3Rpb24oYSkgew0KCQkJCQlpZiAoIWEuaHJlZiB8fCBhLmhyZWYuaW5kZXhPZignI19Ub2MnKSAhPSAtMSkNCgkJCQkJCWRvbS5yZW1vdmUoYSwgMSk7DQoJCQkJfSk7DQoNCgkJCQlpZiAoZ2V0UGFyYW0oZWQsICJwYXN0ZV9jb252ZXJ0X21pZGRvdF9saXN0cyIpKSB7DQoJCQkJCXQuX2NvbnZlcnRMaXN0cyhwbCwgbyk7DQoJCQkJfQ0KDQoJCQkJLy8gUHJvY2VzcyBzdHlsZXMNCgkJCQlzdHlsZVByb3BzID0gZ2V0UGFyYW0oZWQsICJwYXN0ZV9yZXRhaW5fc3R5bGVfcHJvcGVydGllcyIpOyAvLyByZXRhaW5lZCBwcm9wZXJ0aWVzDQoNCgkJCQkvLyBQcm9jZXNzIG9ubHkgaWYgYSBzdHJpbmcgd2FzIHNwZWNpZmllZCBhbmQgbm90IGVxdWFsIHRvICJhbGwiIG9yICIqIg0KCQkJCWlmICgodGlueW1jZS5pcyhzdHlsZVByb3BzLCAic3RyaW5nIikpICYmIChzdHlsZVByb3BzICE9PSAiYWxsIikgJiYgKHN0eWxlUHJvcHMgIT09ICIqIikpIHsNCgkJCQkJc3R5bGVQcm9wcyA9IHRpbnltY2UuZXhwbG9kZShzdHlsZVByb3BzLnJlcGxhY2UoL15ub25lJC9pLCAiIikpOw0KDQoJCQkJCS8vIFJldGFpbnMgc29tZSBzdHlsZSBwcm9wZXJ0aWVzDQoJCQkJCWVhY2goZG9tLnNlbGVjdCgnKicsIG8ubm9kZSksIGZ1bmN0aW9uKGVsKSB7DQoJCQkJCQl2YXIgbmV3U3R5bGUgPSB7fSwgbnBjID0gMCwgaSwgc3AsIHN2Ow0KDQoJCQkJCQkvLyBTdG9yZSBhIHN1YnNldCBvZiB0aGUgZXhpc3Rpbmcgc3R5bGVzDQoJCQkJCQlpZiAoc3R5bGVQcm9wcykgew0KCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBzdHlsZVByb3BzLmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJCXNwID0gc3R5bGVQcm9wc1tpXTsNCgkJCQkJCQkJc3YgPSBkb20uZ2V0U3R5bGUoZWwsIHNwKTsNCg0KCQkJCQkJCQlpZiAoc3YpIHsNCgkJCQkJCQkJCW5ld1N0eWxlW3NwXSA9IHN2Ow0KCQkJCQkJCQkJbnBjKys7DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCS8vIFJlbW92ZSBhbGwgb2YgdGhlIGV4aXN0aW5nIHN0eWxlcw0KCQkJCQkJZG9tLnNldEF0dHJpYihlbCwgJ3N0eWxlJywgJycpOw0KDQoJCQkJCQlpZiAoc3R5bGVQcm9wcyAmJiBucGMgPiAwKQ0KCQkJCQkJCWRvbS5zZXRTdHlsZXMoZWwsIG5ld1N0eWxlKTsgLy8gQWRkIGJhY2sgdGhlIHN0b3JlZCBzdWJzZXQgb2Ygc3R5bGVzDQoJCQkJCQllbHNlIC8vIFJlbW92ZSBlbXB0eSBzcGFuIHRhZ3MgdGhhdCBkbyBub3QgaGF2ZSBjbGFzcyBhdHRyaWJ1dGVzDQoJCQkJCQkJaWYgKGVsLm5vZGVOYW1lID09ICdTUEFOJyAmJiAhZWwuY2xhc3NOYW1lKQ0KCQkJCQkJCQlkb20ucmVtb3ZlKGVsLCB0cnVlKTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBSZW1vdmUgYWxsIHN0eWxlIGluZm9ybWF0aW9uIG9yIG9ubHkgc3BlY2lmaWNhbGx5IG9uIFdlYktpdCB0byBhdm9pZCB0aGUgc3R5bGUgYnVnIG9uIHRoYXQgYnJvd3Nlcg0KCQkJaWYgKGdldFBhcmFtKGVkLCAicGFzdGVfcmVtb3ZlX3N0eWxlcyIpIHx8IChnZXRQYXJhbShlZCwgInBhc3RlX3JlbW92ZV9zdHlsZXNfaWZfd2Via2l0IikgJiYgdGlueW1jZS5pc1dlYktpdCkpIHsNCgkJCQllYWNoKGRvbS5zZWxlY3QoJypbc3R5bGVdJywgby5ub2RlKSwgZnVuY3Rpb24oZWwpIHsNCgkJCQkJZWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpOw0KCQkJCQllbC5yZW1vdmVBdHRyaWJ1dGUoJ19tY2Vfc3R5bGUnKTsNCgkJCQl9KTsNCgkJCX0gZWxzZSB7DQoJCQkJaWYgKHRpbnltY2UuaXNXZWJLaXQpIHsNCgkJCQkJLy8gV2UgbmVlZCB0byBjb21wcmVzcyB0aGUgc3R5bGVzIG9uIFdlYktpdCBzaW5jZSBpZiB5b3UgcGFzdGUgPGltZyBib3JkZXI9IjAiIC8+IGl0IHdpbGwgYmVjb21lIDxpbWcgYm9yZGVyPSIwIiBzdHlsZT0iLi4uIGxvdHMgb2YganVuayAuLi4iIC8+DQoJCQkJCS8vIFJlbW92aW5nIHRoZSBtY2Vfc3R5bGUgdGhhdCBjb250YWlucyB0aGUgcmVhbCB2YWx1ZSB3aWxsIGZvcmNlIHRoZSBTZXJpYWxpemVyIGVuZ2luZSB0byBjb21wcmVzcyB0aGUgc3R5bGVzDQoJCQkJCWVhY2goZG9tLnNlbGVjdCgnKicsIG8ubm9kZSksIGZ1bmN0aW9uKGVsKSB7DQoJCQkJCQllbC5yZW1vdmVBdHRyaWJ1dGUoJ19tY2Vfc3R5bGUnKTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBDb252ZXJ0cyB0aGUgbW9zdCBjb21tb24gYnVsbGV0IGFuZCBudW1iZXIgZm9ybWF0cyBpbiBPZmZpY2UgaW50byBhIHJlYWwgc2VtYW50aWMgVUwvTEkgbGlzdC4NCgkJICovDQoJCV9jb252ZXJ0TGlzdHMgOiBmdW5jdGlvbihwbCwgbykgew0KCQkJdmFyIGRvbSA9IHBsLmVkaXRvci5kb20sIGxpc3RFbG0sIGxpLCBsYXN0TWFyZ2luID0gLTEsIG1hcmdpbiwgbGV2ZWxzID0gW10sIGxhc3RUeXBlLCBodG1sOw0KDQoJCQkvLyBDb252ZXJ0IG1pZGRvdCBsaXN0cyBpbnRvIHJlYWwgc2VtYW50aWMgbGlzdHMNCgkJCWVhY2goZG9tLnNlbGVjdCgncCcsIG8ubm9kZSksIGZ1bmN0aW9uKHApIHsNCgkJCQl2YXIgc2liLCB2YWwgPSAnJywgdHlwZSwgaHRtbCwgaWR4LCBwYXJlbnRzOw0KDQoJCQkJLy8gR2V0IHRleHQgbm9kZSB2YWx1ZSBhdCBiZWdpbm5pbmcgb2YgcGFyYWdyYXBoDQoJCQkJZm9yIChzaWIgPSBwLmZpcnN0Q2hpbGQ7IHNpYiAmJiBzaWIubm9kZVR5cGUgPT0gMzsgc2liID0gc2liLm5leHRTaWJsaW5nKQ0KCQkJCQl2YWwgKz0gc2liLm5vZGVWYWx1ZTsNCg0KCQkJCXZhbCA9IHAuaW5uZXJIVE1MLnJlcGxhY2UoLzxcLz9cdytbXj5dKj4vZ2ksICcnKS5yZXBsYWNlKC8mbmJzcDsvZywgJ1x1MDBhMCcpOw0KDQoJCQkJLy8gRGV0ZWN0IHVub3JkZXJlZCBsaXN0cyBsb29rIGZvciBidWxsZXRzDQoJCQkJaWYgKC9eKF9fTUNFX0lURU1fXykrW1x1MjAyMlx1MDBiN1x1MDBhN1x1MDBkOG9dXHMqXHUwMGEwKi8udGVzdCh2YWwpKQ0KCQkJCQl0eXBlID0gJ3VsJzsNCg0KCQkJCS8vIERldGVjdCBvcmRlcmVkIGxpc3RzIDEuLCBhLiBvciBpeHYuDQoJCQkJaWYgKC9eX19NQ0VfSVRFTV9fXHMqXHcrXC5ccypcdTAwYTB7Mix9Ly50ZXN0KHZhbCkpDQoJCQkJCXR5cGUgPSAnb2wnOw0KDQoJCQkJLy8gQ2hlY2sgaWYgbm9kZSB2YWx1ZSBtYXRjaGVzIHRoZSBsaXN0IHBhdHRlcm46IG8mbmJzcDsmbmJzcDsNCgkJCQlpZiAodHlwZSkgew0KCQkJCQltYXJnaW4gPSBwYXJzZUZsb2F0KHAuc3R5bGUubWFyZ2luTGVmdCB8fCAwKTsNCg0KCQkJCQlpZiAobWFyZ2luID4gbGFzdE1hcmdpbikNCgkJCQkJCWxldmVscy5wdXNoKG1hcmdpbik7DQoNCgkJCQkJaWYgKCFsaXN0RWxtIHx8IHR5cGUgIT0gbGFzdFR5cGUpIHsNCgkJCQkJCWxpc3RFbG0gPSBkb20uY3JlYXRlKHR5cGUpOw0KCQkJCQkJZG9tLmluc2VydEFmdGVyKGxpc3RFbG0sIHApOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJLy8gTmVzdGVkIGxpc3QgZWxlbWVudA0KCQkJCQkJaWYgKG1hcmdpbiA+IGxhc3RNYXJnaW4pIHsNCgkJCQkJCQlsaXN0RWxtID0gbGkuYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZSh0eXBlKSk7DQoJCQkJCQl9IGVsc2UgaWYgKG1hcmdpbiA8IGxhc3RNYXJnaW4pIHsNCgkJCQkJCQkvLyBGaW5kIHBhcmVudCBsZXZlbCBiYXNlZCBvbiBtYXJnaW4gdmFsdWUNCgkJCQkJCQlpZHggPSB0aW55bWNlLmluQXJyYXkobGV2ZWxzLCBtYXJnaW4pOw0KCQkJCQkJCXBhcmVudHMgPSBkb20uZ2V0UGFyZW50cyhsaXN0RWxtLnBhcmVudE5vZGUsIHR5cGUpOw0KCQkJCQkJCWxpc3RFbG0gPSBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMSAtIGlkeF0gfHwgbGlzdEVsbTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIFJlbW92ZSBtaWRkb3Qgb3IgbnVtYmVyIHNwYW5zIGlmIHRoZXkgZXhpc3RzDQoJCQkJCWVhY2goZG9tLnNlbGVjdCgnc3BhbicsIHApLCBmdW5jdGlvbihzcGFuKSB7DQoJCQkJCQl2YXIgaHRtbCA9IHNwYW4uaW5uZXJIVE1MLnJlcGxhY2UoLzxcLz9cdytbXj5dKj4vZ2ksICcnKTsNCg0KCQkJCQkJLy8gUmVtb3ZlIHNwYW4gd2l0aCB0aGUgbWlkZG90IG9yIHRoZSBudW1iZXINCgkJCQkJCWlmICh0eXBlID09ICd1bCcgJiYgL15bXHUyMDIyXHUwMGI3XHUwMGE3XHUwMGQ4b10vLnRlc3QoaHRtbCkpDQoJCQkJCQkJZG9tLnJlbW92ZShzcGFuKTsNCgkJCQkJCWVsc2UgaWYgKC9eW1xzXFNdKlx3K1wuKCZuYnNwO3xcdTAwYTApKlxzKi8udGVzdChodG1sKSkNCgkJCQkJCQlkb20ucmVtb3ZlKHNwYW4pOw0KCQkJCQl9KTsNCg0KCQkJCQlodG1sID0gcC5pbm5lckhUTUw7DQoNCgkJCQkJLy8gUmVtb3ZlIG1pZGRvdC9saXN0IGl0ZW1zDQoJCQkJCWlmICh0eXBlID09ICd1bCcpDQoJCQkJCQlodG1sID0gcC5pbm5lckhUTUwucmVwbGFjZSgvX19NQ0VfSVRFTV9fL2csICcnKS5yZXBsYWNlKC9eW1x1MjAyMlx1MDBiN1x1MDBhN1x1MDBkOG9dXHMqKCZuYnNwO3xcdTAwYTApK1xzKi8sICcnKTsNCgkJCQkJZWxzZQ0KCQkJCQkJaHRtbCA9IHAuaW5uZXJIVE1MLnJlcGxhY2UoL19fTUNFX0lURU1fXy9nLCAnJykucmVwbGFjZSgvXlxzKlx3K1wuKCZuYnNwO3xcdTAwYTApK1xzKi8sICcnKTsNCg0KCQkJCQkvLyBDcmVhdGUgbGkgYW5kIGFkZCBwYXJhZ3JhcGggZGF0YSBpbnRvIHRoZSBuZXcgbGkNCgkJCQkJbGkgPSBsaXN0RWxtLmFwcGVuZENoaWxkKGRvbS5jcmVhdGUoJ2xpJywgMCwgaHRtbCkpOw0KCQkJCQlkb20ucmVtb3ZlKHApOw0KDQoJCQkJCWxhc3RNYXJnaW4gPSBtYXJnaW47DQoJCQkJCWxhc3RUeXBlID0gdHlwZTsNCgkJCQl9IGVsc2UNCgkJCQkJbGlzdEVsbSA9IGxhc3RNYXJnaW4gPSAwOyAvLyBFbmQgbGlzdCBlbGVtZW50DQoJCQl9KTsNCg0KCQkJLy8gUmVtb3ZlIGFueSBsZWZ0IG92ZXIgbWFrZXJzDQoJCQlodG1sID0gby5ub2RlLmlubmVySFRNTDsNCgkJCWlmIChodG1sLmluZGV4T2YoJ19fTUNFX0lURU1fXycpICE9IC0xKQ0KCQkJCW8ubm9kZS5pbm5lckhUTUwgPSBodG1sLnJlcGxhY2UoL19fTUNFX0lURU1fXy9nLCAnJyk7DQoJCX0sDQoNCgkJLyoqDQoJCSAqIFRoaXMgbWV0aG9kIHdpbGwgc3BsaXQgdGhlIGN1cnJlbnQgYmxvY2sgcGFyZW50IGFuZCBpbnNlcnQgdGhlIGNvbnRlbnRzIGluc2lkZSB0aGUgc3BsaXQgcG9zaXRpb24uDQoJCSAqIFRoaXMgbG9naWMgY2FuIGJlIGltcHJvdmVkIHNvIHRleHQgbm9kZXMgYXQgdGhlIHN0YXJ0L2VuZCByZW1haW4gaW4gdGhlIHN0YXJ0L2VuZCBibG9jayBlbGVtZW50cw0KCQkgKi8NCgkJX2luc2VydEJsb2NrQ29udGVudCA6IGZ1bmN0aW9uKGVkLCBkb20sIGNvbnRlbnQpIHsNCgkJCXZhciBwYXJlbnRCbG9jaywgbWFya2VyLCBzZWwgPSBlZC5zZWxlY3Rpb24sIGxhc3QsIGVsbSwgdnAsIHksIGVsbUhlaWdodCwgbWFya2VySWQgPSAnbWNlX21hcmtlcic7DQoNCgkJCWZ1bmN0aW9uIHNlbGVjdChuKSB7DQoJCQkJdmFyIHI7DQoNCgkJCQlpZiAodGlueW1jZS5pc0lFKSB7DQoJCQkJCXIgPSBlZC5nZXREb2MoKS5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOw0KCQkJCQlyLm1vdmVUb0VsZW1lbnRUZXh0KG4pOw0KCQkJCQlyLmNvbGxhcHNlKGZhbHNlKTsNCgkJCQkJci5zZWxlY3QoKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlzZWwuc2VsZWN0KG4sIDEpOw0KCQkJCQlzZWwuY29sbGFwc2UoZmFsc2UpOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gSW5zZXJ0IGEgbWFya2VyIGZvciB0aGUgY2FyZXQgcG9zaXRpb24NCgkJCXRoaXMuX2luc2VydCgnPHNwYW4gaWQ9IicgKyBtYXJrZXJJZCArICciPjwvc3Bhbj4nLCAxKTsNCgkJCW1hcmtlciA9IGRvbS5nZXQobWFya2VySWQpOw0KCQkJcGFyZW50QmxvY2sgPSBkb20uZ2V0UGFyZW50KG1hcmtlciwgJ3AsaDEsaDIsaDMsaDQsaDUsaDYsdWwsb2wsdGgsdGQnKTsNCg0KCQkJLy8gSWYgaXQncyBhIHBhcmVudCBibG9jayBidXQgbm90IGEgdGFibGUgY2VsbA0KCQkJaWYgKHBhcmVudEJsb2NrICYmICEvVER8VEgvLnRlc3QocGFyZW50QmxvY2subm9kZU5hbWUpKSB7DQoJCQkJLy8gU3BsaXQgcGFyZW50IGJsb2NrDQoJCQkJbWFya2VyID0gZG9tLnNwbGl0KHBhcmVudEJsb2NrLCBtYXJrZXIpOw0KDQoJCQkJLy8gSW5zZXJ0IG5vZGVzIGJlZm9yZSB0aGUgbWFya2VyDQoJCQkJZWFjaChkb20uY3JlYXRlKCdkaXYnLCAwLCBjb250ZW50KS5jaGlsZE5vZGVzLCBmdW5jdGlvbihuKSB7DQoJCQkJCWxhc3QgPSBtYXJrZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobi5jbG9uZU5vZGUodHJ1ZSksIG1hcmtlcik7DQoJCQkJfSk7DQoNCgkJCQkvLyBNb3ZlIGNhcmV0IGFmdGVyIG1hcmtlcg0KCQkJCXNlbGVjdChsYXN0KTsNCgkJCX0gZWxzZSB7DQoJCQkJZG9tLnNldE91dGVySFRNTChtYXJrZXIsIGNvbnRlbnQpOw0KCQkJCXNlbC5zZWxlY3QoZWQuZ2V0Qm9keSgpLCAxKTsNCgkJCQlzZWwuY29sbGFwc2UoMCk7DQoJCQl9DQoNCgkJCS8vIFJlbW92ZSBtYXJrZXIgaWYgaXQncyBsZWZ0DQoJCQl3aGlsZSAoZWxtID0gZG9tLmdldChtYXJrZXJJZCkpDQoJCQkJZG9tLnJlbW92ZShlbG0pOw0KDQoJCQkvLyBHZXQgZWxlbWVudCwgcG9zaXRpb24gYW5kIGhlaWdodA0KCQkJZWxtID0gc2VsLmdldFN0YXJ0KCk7DQoJCQl2cCA9IGRvbS5nZXRWaWV3UG9ydChlZC5nZXRXaW4oKSk7DQoJCQl5ID0gZWQuZG9tLmdldFBvcyhlbG0pLnk7DQoJCQllbG1IZWlnaHQgPSBlbG0uY2xpZW50SGVpZ2h0Ow0KDQoJCQkvLyBJcyBlbGVtZW50IHdpdGhpbiB2aWV3cG9ydCBpZiBub3QgdGhlbiBzY3JvbGwgaXQgaW50byB2aWV3DQoJCQlpZiAoeSA8IHZwLnkgfHwgeSArIGVsbUhlaWdodCA+IHZwLnkgKyB2cC5oKQ0KCQkJCWVkLmdldERvYygpLmJvZHkuc2Nyb2xsVG9wID0geSA8IHZwLnkgPyB5IDogeSAtIHZwLmggKyAyNTsNCgkJfSwNCg0KCQkvKioNCgkJICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGNvbnRlbnRzIGF0IHRoZSBjYXJldCBwb3NpdGlvbi4NCgkJICovDQoJCV9pbnNlcnQgOiBmdW5jdGlvbihoLCBza2lwX3VuZG8pIHsNCgkJCXZhciBlZCA9IHRoaXMuZWRpdG9yLCByID0gZWQuc2VsZWN0aW9uLmdldFJuZygpOw0KDQoJCQkvLyBGaXJzdCBkZWxldGUgdGhlIGNvbnRlbnRzIHNlZW1zIHRvIHdvcmsgYmV0dGVyIG9uIFdlYktpdCB3aGVuIHRoZSBzZWxlY3Rpb24gc3BhbnMgbXVsdGlwbGUgbGlzdCBpdGVtcyBvciBtdWx0aXBsZSB0YWJsZSBjZWxscy4NCgkJCWlmICghZWQuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkgJiYgci5zdGFydENvbnRhaW5lciAhPSByLmVuZENvbnRhaW5lcikNCgkJCQllZC5nZXREb2MoKS5leGVjQ29tbWFuZCgnRGVsZXRlJywgZmFsc2UsIG51bGwpOw0KDQoJCQkvLyBJdCdzIGJldHRlciB0byB1c2UgdGhlIGluc2VydEhUTUwgbWV0aG9kIG9uIEdlY2tvIHNpbmNlIGl0IHdpbGwgY29tYmluZSBwYXJhZ3JhcGhzIGNvcnJlY3RseSBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBjb250ZW50cw0KCQkJZWQuZXhlY0NvbW1hbmQodGlueW1jZS5pc0dlY2tvID8gJ2luc2VydEhUTUwnIDogJ21jZUluc2VydENvbnRlbnQnLCBmYWxzZSwgaCwge3NraXBfdW5kbyA6IHNraXBfdW5kb30pOw0KCQl9LA0KDQoJCS8qKg0KCQkgKiBJbnN0ZWFkIG9mIHRoZSBvbGQgcGxhaW4gdGV4dCBtZXRob2Qgd2hpY2ggdHJpZWQgdG8gcmUtY3JlYXRlIGEgcGFzdGUgb3BlcmF0aW9uLCB0aGUNCgkJICogbmV3IGFwcHJvYWNoIGFkZHMgYSBwbGFpbiB0ZXh0IG1vZGUgdG9nZ2xlIHN3aXRjaCB0aGF0IGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIHBhc3RlLg0KCQkgKiBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgc2FtZSBpbnB1dCB0aGF0IHRoZSByZWd1bGFyIHBhc3RlIHBsdWdpbiBwcm9kdWNlcy4NCgkJICogSXQgcGVyZm9ybXMgYWRkaXRpb25hbCBzY3J1YmJpbmcgYW5kIHByb2R1Y2VzIChhbmQgaW5zZXJ0cykgdGhlIHBsYWluIHRleHQuDQoJCSAqIFRoaXMgYXBwcm9hY2ggbGV2ZXJhZ2VzIGFsbCBvZiB0aGUgZ3JlYXQgZXhpc3RpbmcgZnVuY3Rpb25hbGl0eSBpbiB0aGUgcGFzdGUNCgkJICogcGx1Z2luLCBhbmQgcmVxdWlyZXMgbWluaW1hbCBjaGFuZ2VzIHRvIGFkZCB0aGUgbmV3IGZ1bmN0aW9uYWxpdHkuDQoJCSAqIFNwZWVkbmV0IC0gSnVuZSAyMDA5DQoJCSAqLw0KCQlfaW5zZXJ0UGxhaW5UZXh0IDogZnVuY3Rpb24oZWQsIGRvbSwgaCkgew0KCQkJdmFyIGksIGxlbiwgcG9zLCBycG9zLCBub2RlLCBicmVha0VsbXMsIGJlZm9yZSwgYWZ0ZXIsDQoJCQkJdyA9IGVkLmdldFdpbigpLA0KCQkJCWQgPSBlZC5nZXREb2MoKSwNCgkJCQlzZWwgPSBlZC5zZWxlY3Rpb24sDQoJCQkJaXMgPSB0aW55bWNlLmlzLA0KCQkJCWluQXJyYXkgPSB0aW55bWNlLmluQXJyYXksDQoJCQkJbGluZWJyID0gZ2V0UGFyYW0oZWQsICJwYXN0ZV90ZXh0X2xpbmVicmVha3R5cGUiKSwNCgkJCQlybCA9IGdldFBhcmFtKGVkLCAicGFzdGVfdGV4dF9yZXBsYWNlbWVudHMiKTsNCg0KCQkJZnVuY3Rpb24gcHJvY2VzcyhpdGVtcykgew0KCQkJCWVhY2goaXRlbXMsIGZ1bmN0aW9uKHYpIHsNCgkJCQkJaWYgKHYuY29uc3RydWN0b3IgPT0gUmVnRXhwKQ0KCQkJCQkJaCA9IGgucmVwbGFjZSh2LCAiIik7DQoJCQkJCWVsc2UNCgkJCQkJCWggPSBoLnJlcGxhY2UodlswXSwgdlsxXSk7DQoJCQkJfSk7DQoJCQl9Ow0KDQoJCQlpZiAoKHR5cGVvZihoKSA9PT0gInN0cmluZyIpICYmIChoLmxlbmd0aCA+IDApKSB7DQoJCQkJaWYgKCFlbnRpdGllcykNCgkJCQkJZW50aXRpZXMgPSAoIjM0LHF1b3QsMzgsYW1wLDM5LGFwb3MsNjAsbHQsNjIsZ3QsIiArIGVkLnNlcmlhbGl6ZXIuc2V0dGluZ3MuZW50aXRpZXMpLnNwbGl0KCIsIik7DQoNCgkJCQkvLyBJZiBIVE1MIGNvbnRlbnQgd2l0aCBsaW5lLWJyZWFraW5nIHRhZ3MsIHRoZW4gcmVtb3ZlIGFsbCBjci9sZiBjaGFycyBiZWNhdXNlIG9ubHkgdGFncyB3aWxsIGJyZWFrIGEgbGluZQ0KCQkJCWlmICgvPCg/OnB8YnJ8aFsxLTZdfHVsfG9sfGRsfHRhYmxlfHRbcmRoXXxkaXZ8YmxvY2txdW90ZXxmaWVsZHNldHxwcmV8YWRkcmVzc3xjZW50ZXIpW14+XSo+L2kudGVzdChoKSkgew0KCQkJCQlwcm9jZXNzKFsNCgkJCQkJCS9bXG5ccl0rL2cNCgkJCQkJXSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHJpZCBvZiBjYXJyaWFnZSByZXR1cm5zIChvbmx5IG5lZWQgbGluZWZlZWRzKQ0KCQkJCQlwcm9jZXNzKFsNCgkJCQkJCS9ccisvZw0KCQkJCQldKTsNCgkJCQl9DQoNCgkJCQlwcm9jZXNzKFsNCgkJCQkJWy88XC8oPzpwfGhbMS02XXx1bHxvbHxkbHx0YWJsZXxkaXZ8YmxvY2txdW90ZXxmaWVsZHNldHxwcmV8YWRkcmVzc3xjZW50ZXIpPi9naSwgIlxuXG4iXSwJCS8vIEJsb2NrIHRhZ3MgZ2V0IGEgYmxhbmsgbGluZSBhZnRlciB0aGVtDQoJCQkJCVsvPGJyW14+XSo+fDxcL3RyPi9naSwgIlxuIl0sCQkJCS8vIFNpbmdsZSBsaW5lYnJlYWsgZm9yIDxiciAvPiB0YWdzIGFuZCB0YWJsZSByb3dzDQoJCQkJCVsvPFwvdFtkaF0+XHMqPHRbZGhdW14+XSo+L2dpLCAiXHQiXSwJCS8vIFRhYmxlIGNlbGxzIGdldCB0YWJzIGJldHdlZW0gdGhlbQ0KCQkJCQkvPFthLXohXC8/XVtePl0qPi9naSwJCQkJCQkvLyBEZWxldGUgYWxsIHJlbWFpbmluZyB0YWdzDQoJCQkJCVsvJm5ic3A7L2dpLCAiICJdLAkJCQkJCQkvLyBDb252ZXJ0IG5vbi1icmVhayBzcGFjZXMgdG8gcmVndWxhciBzcGFjZXMgKHJlbWVtYmVyLCAqcGxhaW4gdGV4dCopDQoJCQkJCVsNCgkJCQkJCS8vIEhUTUwgZW50aXR5DQoJCQkJCQkvJigjXGQrfFthLXowLTldezEsMTB9KTsvZ2ksDQoNCgkJCQkJCS8vIFJlcGxhY2Ugd2l0aCBhY3R1YWwgY2hhcmFjdGVyDQoJCQkJCQlmdW5jdGlvbihlLCBzKSB7DQoJCQkJCQkJaWYgKHMuY2hhckF0KDApID09PSAiIyIpIHsNCgkJCQkJCQkJcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocy5zbGljZSgxKSk7DQoJCQkJCQkJfQ0KCQkJCQkJCWVsc2Ugew0KCQkJCQkJCQlyZXR1cm4gKChlID0gaW5BcnJheShlbnRpdGllcywgcykpID4gMCk/IFN0cmluZy5mcm9tQ2hhckNvZGUoZW50aXRpZXNbZS0xXSkgOiAiICI7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQldLA0KCQkJCQlbLyg/Oig/IVxuKVxzKSooXG4rKSg/Oig/IVxuKVxzKSovZ2ksICIkMSJdLAkvLyBDb29sIGxpdHRsZSBSZWdFeHAgZGVsZXRlcyB3aGl0ZXNwYWNlIGFyb3VuZCBsaW5lYnJlYWsgY2hhcnMuDQoJCQkJCVsvXG57Myx9L2csICJcblxuIl0sCQkJCQkJCS8vIE1heC4gMiBjb25zZWN1dGl2ZSBsaW5lYnJlYWtzDQoJCQkJCS9eXHMrfFxzKyQvZwkJCQkJCQkJCS8vIFRyaW0gdGhlIGZyb250ICYgYmFjaw0KCQkJCV0pOw0KDQoJCQkJaCA9IGRvbS5lbmNvZGUoaCk7DQoNCgkJCQkvLyBEZWxldGUgYW55IGhpZ2hsaWdodGVkIHRleHQgYmVmb3JlIHBhc3RpbmcNCgkJCQlpZiAoIXNlbC5pc0NvbGxhcHNlZCgpKSB7DQoJCQkJCWQuZXhlY0NvbW1hbmQoIkRlbGV0ZSIsIGZhbHNlLCBudWxsKTsNCgkJCQl9DQoNCgkJCQkvLyBQZXJmb3JtIGRlZmF1bHQgb3IgY3VzdG9tIHJlcGxhY2VtZW50cw0KCQkJCWlmIChpcyhybCwgImFycmF5IikgfHwgKGlzKHJsLCAiYXJyYXkiKSkpIHsNCgkJCQkJcHJvY2VzcyhybCk7DQoJCQkJfQ0KCQkJCWVsc2UgaWYgKGlzKHJsLCAic3RyaW5nIikpIHsNCgkJCQkJcHJvY2VzcyhuZXcgUmVnRXhwKHJsLCAiZ2kiKSk7DQoJCQkJfQ0KDQoJCQkJLy8gVHJlYXQgcGFyYWdyYXBocyBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZw0KCQkJCWlmIChsaW5lYnIgPT0gIm5vbmUiKSB7DQoJCQkJCXByb2Nlc3MoWw0KCQkJCQkJWy9cbisvZywgIiAiXQ0KCQkJCQldKTsNCgkJCQl9DQoJCQkJZWxzZSBpZiAobGluZWJyID09ICJiciIpIHsNCgkJCQkJcHJvY2VzcyhbDQoJCQkJCQlbL1xuL2csICI8YnIgLz4iXQ0KCQkJCQldKTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXByb2Nlc3MoWw0KCQkJCQkJL15ccyt8XHMrJC9nLA0KCQkJCQkJWy9cblxuL2csICI8L3A+PHA+Il0sDQoJCQkJCQlbL1xuL2csICI8YnIgLz4iXQ0KCQkJCQldKTsNCgkJCQl9DQoNCgkJCQkvLyBUaGlzIG5leHQgcGllY2Ugb2YgY29kZSBoYW5kbGVzIHRoZSBzaXR1YXRpb24gd2hlcmUgd2UncmUgcGFzdGluZyBtb3JlIHRoYW4gb25lIHBhcmFncmFwaCBvZiBwbGFpbg0KCQkJCS8vIHRleHQsIGFuZCB3ZSBhcmUgcGFzdGluZyB0aGUgY29udGVudCBpbnRvIHRoZSBtaWRkbGUgb2YgYSBibG9jayBub2RlIGluIHRoZSBlZGl0b3IuICBUaGUgYmxvY2sNCgkJCQkvLyBub2RlIGdldHMgc3BsaXQgYXQgdGhlIHNlbGVjdGlvbiBwb2ludCBpbnRvICJQYXJhIEEiIGFuZCAiUGFyYSBCIiAoZm9yIHRoZSBwdXJwb3NlcyBvZiBleHBsYWluaW5nKS4NCgkJCQkvLyBUaGUgZmlyc3QgcGFyYWdyYXBoIG9mIHRoZSBwYXN0ZWQgdGV4dCBpcyBhcHBlbmRlZCB0byAiUGFyYSBBIiwgYW5kIHRoZSBsYXN0IHBhcmFncmFwaCBvZiB0aGUNCgkJCQkvLyBwYXN0ZWQgdGV4dCBpcyBwcmVwZW5kZWQgdG8gIlBhcmEgQiIuICBBbnkgb3RoZXIgcGFyYWdyYXBocyBvZiBwYXN0ZWQgdGV4dCBhcmUgcGxhY2VkIGJldHdlZW4NCgkJCQkvLyAiUGFyYSBBIiBhbmQgIlBhcmEgQiIuICBUaGlzIGNvZGUgc29sdmVzIGEgaG9zdCBvZiBwcm9ibGVtcyB3aXRoIHRoZSBvcmlnaW5hbCBwbGFpbiB0ZXh0IHBsdWdpbiBhbmQNCgkJCQkvLyBub3cgaGFuZGxlcyBzdHlsZXMgY29ycmVjdGx5LiAgKFBhc3RpbmcgcGxhaW4gdGV4dCBpbnRvIGEgc3R5bGVkIHBhcmFncmFwaCBpcyBzdXBwb3NlZCB0byBtYWtlIHRoZQ0KCQkJCS8vIHBsYWluIHRleHQgdGFrZSB0aGUgc2FtZSBzdHlsZSBhcyB0aGUgZXhpc3RpbmcgcGFyYWdyYXBoLikNCgkJCQlpZiAoKHBvcyA9IGguaW5kZXhPZigiPC9wPjxwPiIpKSAhPSAtMSkgew0KCQkJCQlycG9zID0gaC5sYXN0SW5kZXhPZigiPC9wPjxwPiIpOw0KCQkJCQlub2RlID0gc2VsLmdldE5vZGUoKTsgDQoJCQkJCWJyZWFrRWxtcyA9IFtdOwkJLy8gR2V0IGxpc3Qgb2YgZWxlbWVudHMgdG8gYnJlYWsgDQoNCgkJCQkJZG8gew0KCQkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkgew0KCQkJCQkJCS8vIERvbid0IGJyZWFrIHRhYmxlcyBhbmQgYnJlYWsgYXQgYm9keQ0KCQkJCQkJCWlmIChub2RlLm5vZGVOYW1lID09ICJURCIgfHwgbm9kZS5ub2RlTmFtZSA9PSAiQk9EWSIpIHsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJYnJlYWtFbG1zW2JyZWFrRWxtcy5sZW5ndGhdID0gbm9kZTsNCgkJCQkJCX0NCgkJCQkJfSB3aGlsZSAobm9kZSA9IG5vZGUucGFyZW50Tm9kZSk7DQoNCgkJCQkJLy8gQXJlIHdlIGluIHRoZSBtaWRkbGUgb2YgYSBibG9jayBub2RlPw0KCQkJCQlpZiAoYnJlYWtFbG1zLmxlbmd0aCA+IDApIHsNCgkJCQkJCWJlZm9yZSA9IGguc3Vic3RyaW5nKDAsIHBvcyk7DQoJCQkJCQlhZnRlciA9ICIiOw0KDQoJCQkJCQlmb3IgKGk9MCwgbGVuPWJyZWFrRWxtcy5sZW5ndGg7IGk8bGVuOyBpKyspIHsNCgkJCQkJCQliZWZvcmUgKz0gIjwvIiArIGJyZWFrRWxtc1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICsgIj4iOw0KCQkJCQkJCWFmdGVyICs9ICI8IiArIGJyZWFrRWxtc1ticmVha0VsbXMubGVuZ3RoLWktMV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSArICI+IjsNCgkJCQkJCX0NCg0KCQkJCQkJaWYgKHBvcyA9PSBycG9zKSB7DQoJCQkJCQkJaCA9IGJlZm9yZSArIGFmdGVyICsgaC5zdWJzdHJpbmcocG9zKzcpOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZSB7DQoJCQkJCQkJaCA9IGJlZm9yZSArIGguc3Vic3RyaW5nKHBvcys0LCBycG9zKzQpICsgYWZ0ZXIgKyBoLnN1YnN0cmluZyhycG9zKzcpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gSW5zZXJ0IGNvbnRlbnQgYXQgdGhlIGNhcmV0LCBwbHVzIGFkZCBhIG1hcmtlciBmb3IgcmVwb3NpdGlvbmluZyB0aGUgY2FyZXQNCgkJCQllZC5leGVjQ29tbWFuZCgibWNlSW5zZXJ0UmF3SFRNTCIsIGZhbHNlLCBoICsgJzxzcGFuIGlkPSJfcGxhaW5fdGV4dF9tYXJrZXIiPiZuYnNwOzwvc3Bhbj4nKTsNCg0KCQkJCS8vIFJlcG9zaXRpb24gdGhlIGNhcmV0IHRvIHRoZSBtYXJrZXIsIHdoaWNoIHdhcyBwbGFjZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGluc2VydGVkIGNvbnRlbnQuDQoJCQkJLy8gTmVlZHMgdG8gYmUgZG9uZSBhc3luY2hyb25vdXNseSAoaW4gd2luZG93LnNldFRpbWVvdXQpIG9yIGVsc2UgaXQgZG9lc24ndCB3b3JrIGluIGFsbCBicm93c2Vycy4NCgkJCQkvLyBUaGUgc2Vjb25kIHBhcnQgb2YgdGhlIGNvZGUgc2Nyb2xscyB0aGUgY29udGVudCB1cCBpZiB0aGUgY2FyZXQgaXMgcG9zaXRpb25lZCBvZmYtc2NyZWVuLg0KCQkJCS8vIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIFdlYktpdCBicm93c2VycywgYnV0IGl0IGRvZXNuJ3QgaHVydCB0byB1c2UgZm9yIGFsbC4NCgkJCQl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsNCgkJCQkJdmFyIG1hcmtlciA9IGRvbS5nZXQoJ19wbGFpbl90ZXh0X21hcmtlcicpLA0KCQkJCQkJZWxtLCB2cCwgeSwgZWxtSGVpZ2h0Ow0KDQoJCQkJCXNlbC5zZWxlY3QobWFya2VyLCBmYWxzZSk7DQoJCQkJCWQuZXhlY0NvbW1hbmQoIkRlbGV0ZSIsIGZhbHNlLCBudWxsKTsNCgkJCQkJbWFya2VyID0gbnVsbDsNCg0KCQkJCQkvLyBHZXQgZWxlbWVudCwgcG9zaXRpb24gYW5kIGhlaWdodA0KCQkJCQllbG0gPSBzZWwuZ2V0U3RhcnQoKTsNCgkJCQkJdnAgPSBkb20uZ2V0Vmlld1BvcnQodyk7DQoJCQkJCXkgPSBkb20uZ2V0UG9zKGVsbSkueTsNCgkJCQkJZWxtSGVpZ2h0ID0gZWxtLmNsaWVudEhlaWdodDsNCg0KCQkJCQkvLyBJcyBlbGVtZW50IHdpdGhpbiB2aWV3cG9ydCBpZiBub3QgdGhlbiBzY3JvbGwgaXQgaW50byB2aWV3DQoJCQkJCWlmICgoeSA8IHZwLnkpIHx8ICh5ICsgZWxtSGVpZ2h0ID4gdnAueSArIHZwLmgpKSB7DQoJCQkJCQlkLmJvZHkuc2Nyb2xsVG9wID0geSA8IHZwLnkgPyB5IDogeSAtIHZwLmggKyAyNTsNCgkJCQkJfQ0KCQkJCX0sIDApOw0KCQkJfQ0KCQl9LA0KDQoJCS8qKg0KCQkgKiBUaGlzIG1ldGhvZCB3aWxsIG9wZW4gdGhlIG9sZCBzdHlsZSBwYXN0ZSBkaWFsb2dzLiBTb21lIHVzZXJzIG1pZ2h0IHdhbnQgdGhlIG9sZCBiZWhhdmlvciBidXQgc3RpbGwgdXNlIHRoZSBuZXcgY2xlYW51cCBlbmdpbmUuDQoJCSAqLw0KCQlfbGVnYWN5U3VwcG9ydCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yOw0KDQoJCQkvLyBSZWdpc3RlciBjb21tYW5kKHMpIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQ0KCQkJZWQuYWRkQ29tbWFuZCgibWNlUGFzdGVXb3JkIiwgZnVuY3Rpb24oKSB7DQoJCQkJZWQud2luZG93TWFuYWdlci5vcGVuKHsNCgkJCQkJZmlsZTogdC51cmwgKyAiL3Bhc3Rld29yZC5odG0iLA0KCQkJCQl3aWR0aDogcGFyc2VJbnQoZ2V0UGFyYW0oZWQsICJwYXN0ZV9kaWFsb2dfd2lkdGgiKSksDQoJCQkJCWhlaWdodDogcGFyc2VJbnQoZ2V0UGFyYW0oZWQsICJwYXN0ZV9kaWFsb2dfaGVpZ2h0IikpLA0KCQkJCQlpbmxpbmU6IDENCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQlpZiAoZ2V0UGFyYW0oZWQsICJwYXN0ZV90ZXh0X3VzZV9kaWFsb2ciKSkgew0KCQkJCWVkLmFkZENvbW1hbmQoIm1jZVBhc3RlVGV4dCIsIGZ1bmN0aW9uKCkgew0KCQkJCQllZC53aW5kb3dNYW5hZ2VyLm9wZW4oew0KCQkJCQkJZmlsZSA6IHQudXJsICsgIi9wYXN0ZXRleHQuaHRtIiwNCgkJCQkJCXdpZHRoOiBwYXJzZUludChnZXRQYXJhbShlZCwgInBhc3RlX2RpYWxvZ193aWR0aCIpKSwNCgkJCQkJCWhlaWdodDogcGFyc2VJbnQoZ2V0UGFyYW0oZWQsICJwYXN0ZV9kaWFsb2dfaGVpZ2h0IikpLA0KCQkJCQkJaW5saW5lIDogMQ0KCQkJCQl9KTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gUmVnaXN0ZXIgYnV0dG9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQ0KCQkJZWQuYWRkQnV0dG9uKCJwYXN0ZXdvcmQiLCB7dGl0bGUgOiAicGFzdGUucGFzdGVfd29yZF9kZXNjIiwgY21kIDogIm1jZVBhc3RlV29yZCJ9KTsNCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgicGFzdGUiLCB0aW55bWNlLnBsdWdpbnMuUGFzdGVQbHVnaW4pOw0KfSkoKTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/paste/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/paste/js/pastetext.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgUGFzdGVUZXh0RGlhbG9nID0gew0KCWluaXQgOiBmdW5jdGlvbigpIHsNCgkJdGhpcy5yZXNpemUoKTsNCgl9LA0KDQoJaW5zZXJ0IDogZnVuY3Rpb24oKSB7DQoJCXZhciBoID0gdGlueU1DRVBvcHVwLmRvbS5lbmNvZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnQnKS52YWx1ZSksIGxpbmVzOw0KDQoJCS8vIENvbnZlcnQgbGluZWJyZWFrcyBpbnRvIHBhcmFncmFwaHMNCgkJaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaW5lYnJlYWtzJykuY2hlY2tlZCkgew0KCQkJbGluZXMgPSBoLnNwbGl0KC9ccj9cbi8pOw0KCQkJaWYgKGxpbmVzLmxlbmd0aCA+IDEpIHsNCgkJCQloID0gJyc7DQoJCQkJdGlueW1jZS5lYWNoKGxpbmVzLCBmdW5jdGlvbihyb3cpIHsNCgkJCQkJaCArPSAnPHA+JyArIHJvdyArICc8L3A+JzsNCgkJCQl9KTsNCgkJCX0NCgkJfQ0KDQoJCXRpbnlNQ0VQb3B1cC5lZGl0b3IuZXhlY0NvbW1hbmQoJ21jZUluc2VydENsaXBib2FyZENvbnRlbnQnLCBmYWxzZSwge2NvbnRlbnQgOiBofSk7DQoJCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KCX0sDQoNCglyZXNpemUgOiBmdW5jdGlvbigpIHsNCgkJdmFyIHZwID0gdGlueU1DRVBvcHVwLmRvbS5nZXRWaWV3UG9ydCh3aW5kb3cpLCBlbDsNCg0KCQllbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50Jyk7DQoNCgkJZWwuc3R5bGUud2lkdGggID0gKHZwLncgLSAyMCkgKyAncHgnOw0KCQllbC5zdHlsZS5oZWlnaHQgPSAodnAuaCAtIDkwKSArICdweCc7DQoJfQ0KfTsNCg0KdGlueU1DRVBvcHVwLm9uSW5pdC5hZGQoUGFzdGVUZXh0RGlhbG9nLmluaXQsIFBhc3RlVGV4dERpYWxvZyk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/paste/js/pasteword.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgUGFzdGVXb3JkRGlhbG9nID0gew0KCWluaXQgOiBmdW5jdGlvbigpIHsNCgkJdmFyIGVkID0gdGlueU1DRVBvcHVwLmVkaXRvciwgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWZyYW1lY29udGFpbmVyJyksIGlmciwgZG9jLCBjc3MsIGNzc0hUTUwgPSAnJzsNCg0KCQkvLyBDcmVhdGUgaWZyYW1lDQoJCWVsLmlubmVySFRNTCA9ICc8aWZyYW1lIGlkPSJpZnJhbWUiIHNyYz0iamF2YXNjcmlwdDpcJ1wnOyIgZnJhbWVCb3JkZXI9IjAiIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBncmF5Ij48L2lmcmFtZT4nOw0KCQlpZnIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWZyYW1lJyk7DQoJCWRvYyA9IGlmci5jb250ZW50V2luZG93LmRvY3VtZW50Ow0KDQoJCS8vIEZvcmNlIGFic29sdXRlIENTUyB1cmxzDQoJCWNzcyA9IFtlZC5iYXNlVVJJLnRvQWJzb2x1dGUoInRoZW1lcy8iICsgZWQuc2V0dGluZ3MudGhlbWUgKyAiL3NraW5zLyIgKyBlZC5zZXR0aW5ncy5za2luICsgIi9jb250ZW50LmNzcyIpXTsNCgkJY3NzID0gY3NzLmNvbmNhdCh0aW55bWNlLmV4cGxvZGUoZWQuc2V0dGluZ3MuY29udGVudF9jc3MpIHx8IFtdKTsNCgkJdGlueW1jZS5lYWNoKGNzcywgZnVuY3Rpb24odSkgew0KCQkJY3NzSFRNTCArPSAnPGxpbmsgaHJlZj0iJyArIGVkLmRvY3VtZW50QmFzZVVSSS50b0Fic29sdXRlKCcnICsgdSkgKyAnIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiAvPic7DQoJCX0pOw0KDQoJCS8vIFdyaXRlIGNvbnRlbnQgaW50byBpZnJhbWUNCgkJZG9jLm9wZW4oKTsNCgkJZG9jLndyaXRlKCc8aHRtbD48aGVhZD4nICsgY3NzSFRNTCArICc8L2hlYWQ+PGJvZHkgY2xhc3M9Im1jZUNvbnRlbnRCb2R5IiBzcGVsbGNoZWNrPSJmYWxzZSI+PC9ib2R5PjwvaHRtbD4nKTsNCgkJZG9jLmNsb3NlKCk7DQoNCgkJZG9jLmRlc2lnbk1vZGUgPSAnb24nOw0KCQl0aGlzLnJlc2l6ZSgpOw0KDQoJCXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KCQkJaWZyLmNvbnRlbnRXaW5kb3cuZm9jdXMoKTsNCgkJfSwgMTApOw0KCX0sDQoNCglpbnNlcnQgOiBmdW5jdGlvbigpIHsNCgkJdmFyIGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWZyYW1lJykuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LmlubmVySFRNTDsNCg0KCQl0aW55TUNFUG9wdXAuZWRpdG9yLmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDbGlwYm9hcmRDb250ZW50JywgZmFsc2UsIHtjb250ZW50IDogaCwgd29yZENvbnRlbnQgOiB0cnVlfSk7DQoJCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KCX0sDQoNCglyZXNpemUgOiBmdW5jdGlvbigpIHsNCgkJdmFyIHZwID0gdGlueU1DRVBvcHVwLmRvbS5nZXRWaWV3UG9ydCh3aW5kb3cpLCBlbDsNCg0KCQllbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpZnJhbWUnKTsNCg0KCQlpZiAoZWwpIHsNCgkJCWVsLnN0eWxlLndpZHRoICA9ICh2cC53IC0gMjApICsgJ3B4JzsNCgkJCWVsLnN0eWxlLmhlaWdodCA9ICh2cC5oIC0gOTApICsgJ3B4JzsNCgkJfQ0KCX0NCn07DQoNCnRpbnlNQ0VQb3B1cC5vbkluaXQuYWRkKFBhc3RlV29yZERpYWxvZy5pbml0LCBQYXN0ZVdvcmREaWFsb2cpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/paste/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/paste/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5wYXN0ZV9kbGcnLHsNCnRleHRfdGl0bGU6IlVzZSBDVFJMK1Ygb24geW91ciBrZXlib2FyZCB0byBwYXN0ZSB0aGUgdGV4dCBpbnRvIHRoZSB3aW5kb3cuIiwNCnRleHRfbGluZWJyZWFrczoiS2VlcCBsaW5lYnJlYWtzIiwNCndvcmRfdGl0bGU6IlVzZSBDVFJMK1Ygb24geW91ciBrZXlib2FyZCB0byBwYXN0ZSB0aGUgdGV4dCBpbnRvIHRoZSB3aW5kb3cuIg0KfSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/paste/pastetext.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KCTx0aXRsZT57I3Bhc3RlLnBhc3RlX3RleHRfZGVzY308L3RpdGxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdGlueV9tY2VfcG9wdXAuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvcGFzdGV0ZXh0LmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBvbnJlc2l6ZT0iUGFzdGVUZXh0RGlhbG9nLnJlc2l6ZSgpOyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsgb3ZlcmZsb3c6aGlkZGVuOyI+Cgk8Zm9ybSBuYW1lPSJzb3VyY2UiIG9uc3VibWl0PSJyZXR1cm4gUGFzdGVUZXh0RGlhbG9nLmluc2VydCgpOyIgYWN0aW9uPSIjIj4KCQk8ZGl2IHN0eWxlPSJmbG9hdDogbGVmdCIgY2xhc3M9InRpdGxlIj57I3Bhc3RlLnBhc3RlX3RleHRfZGVzY308L2Rpdj4KCgkJPGRpdiBzdHlsZT0iZmxvYXQ6IHJpZ2h0Ij4KCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJsaW5lYnJlYWtzIiBpZD0ibGluZWJyZWFrcyIgY2xhc3M9IndvcmRXcmFwQ29kZSIgY2hlY2tlZD0iY2hlY2tlZCIgLz48bGFiZWwgZm9yPSJsaW5lYnJlYWtzIj57I3Bhc3RlX2RsZy50ZXh0X2xpbmVicmVha3N9PC9sYWJlbD4KCQk8L2Rpdj4KCgkJPGJyIHN0eWxlPSJjbGVhcjogYm90aCIgLz4KCgkJPGRpdj57I3Bhc3RlX2RsZy50ZXh0X3RpdGxlfTwvZGl2PgoKCQk8dGV4dGFyZWEgaWQ9ImNvbnRlbnQiIG5hbWU9ImNvbnRlbnQiIHJvd3M9IjE1IiBjb2xzPSIxMDAiIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JyxDb3VyaWVyLG1vbm87IGZvbnQtc2l6ZTogMTJweDsiIGRpcj0ibHRyIiB3cmFwPSJzb2Z0IiBjbGFzcz0ibWNlRm9jdXMiPjwvdGV4dGFyZWE+CgoJCTxkaXYgY2xhc3M9Im1jZUFjdGlvblBhbmVsIj4KCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0ieyNpbnNlcnR9IiBpZD0iaW5zZXJ0IiAvPgoJCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJ7I2NhbmNlbH0iIG9uY2xpY2s9InRpbnlNQ0VQb3B1cC5jbG9zZSgpOyIgaWQ9ImNhbmNlbCIgLz4KCQk8L2Rpdj4KCTwvZm9ybT4KPC9ib2R5PiAKPC9odG1sPg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/paste/pasteword.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KCTx0aXRsZT57I3Bhc3RlLnBhc3RlX3dvcmRfZGVzY308L3RpdGxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdGlueV9tY2VfcG9wdXAuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvcGFzdGV3b3JkLmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBvbnJlc2l6ZT0iUGFzdGVXb3JkRGlhbG9nLnJlc2l6ZSgpOyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsgb3ZlcmZsb3c6aGlkZGVuOyI+Cgk8Zm9ybSBuYW1lPSJzb3VyY2UiIG9uc3VibWl0PSJyZXR1cm4gUGFzdGVXb3JkRGlhbG9nLmluc2VydCgpOyIgYWN0aW9uPSIjIj4KCQk8ZGl2IGNsYXNzPSJ0aXRsZSI+eyNwYXN0ZS5wYXN0ZV93b3JkX2Rlc2N9PC9kaXY+CgoJCTxkaXY+eyNwYXN0ZV9kbGcud29yZF90aXRsZX08L2Rpdj4KCgkJPGRpdiBpZD0iaWZyYW1lY29udGFpbmVyIj48L2Rpdj4KCgkJPGRpdiBjbGFzcz0ibWNlQWN0aW9uUGFuZWwiPgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBpZD0iaW5zZXJ0IiBuYW1lPSJpbnNlcnQiIHZhbHVlPSJ7I2luc2VydH0iIC8+CgkJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJjYW5jZWwiIG5hbWU9ImNhbmNlbCIgdmFsdWU9InsjY2FuY2VsfSIgb25jbGljaz0idGlueU1DRVBvcHVwLmNsb3NlKCk7IiAvPgoJCTwvZGl2PgoJPC9mb3JtPgo8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/preview/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/preview/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5QcmV2aWV3Iix7aW5pdDpmdW5jdGlvbihhLGIpe3ZhciBkPXRoaXMsYz10aW55bWNlLmV4cGxvZGUoYS5zZXR0aW5ncy5jb250ZW50X2Nzcyk7ZC5lZGl0b3I9YTt0aW55bWNlLmVhY2goYyxmdW5jdGlvbihmLGUpe2NbZV09YS5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShmKX0pO2EuYWRkQ29tbWFuZCgibWNlUHJldmlldyIsZnVuY3Rpb24oKXthLndpbmRvd01hbmFnZXIub3Blbih7ZmlsZTphLmdldFBhcmFtKCJwbHVnaW5fcHJldmlld19wYWdldXJsIixiKyIvcHJldmlldy5odG1sIiksd2lkdGg6cGFyc2VJbnQoYS5nZXRQYXJhbSgicGx1Z2luX3ByZXZpZXdfd2lkdGgiLCI1NTAiKSksaGVpZ2h0OnBhcnNlSW50KGEuZ2V0UGFyYW0oInBsdWdpbl9wcmV2aWV3X2hlaWdodCIsIjYwMCIpKSxyZXNpemFibGU6InllcyIsc2Nyb2xsYmFyczoieWVzIixwb3B1cF9jc3M6Yz9jLmpvaW4oIiwiKTphLmJhc2VVUkkudG9BYnNvbHV0ZSgidGhlbWVzLyIrYS5zZXR0aW5ncy50aGVtZSsiL3NraW5zLyIrYS5zZXR0aW5ncy5za2luKyIvY29udGVudC5jc3MiKSxpbmxpbmU6YS5nZXRQYXJhbSgicGx1Z2luX3ByZXZpZXdfaW5saW5lIiwxKX0se2Jhc2U6YS5kb2N1bWVudEJhc2VVUkkuZ2V0VVJJKCl9KX0pO2EuYWRkQnV0dG9uKCJwcmV2aWV3Iix7dGl0bGU6InByZXZpZXcucHJldmlld19kZXNjIixjbWQ6Im1jZVByZXZpZXcifSl9LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6IlByZXZpZXciLGF1dGhvcjoiTW94aWVjb2RlIFN5c3RlbXMgQUIiLGF1dGhvcnVybDoiaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbSIsaW5mb3VybDoiaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL3ByZXZpZXciLHZlcnNpb246dGlueW1jZS5tYWpvclZlcnNpb24rIi4iK3RpbnltY2UubWlub3JWZXJzaW9ufX19KTt0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCJwcmV2aWV3Iix0aW55bWNlLnBsdWdpbnMuUHJldmlldyl9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/preview/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGVkaXRvcl9wbHVnaW5fc3JjLmpzCiAqCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQgogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuCiAqCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nCiAqLwoKKGZ1bmN0aW9uKCkgewoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UucGx1Z2lucy5QcmV2aWV3JywgewoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7CgkJCXZhciB0ID0gdGhpcywgY3NzID0gdGlueW1jZS5leHBsb2RlKGVkLnNldHRpbmdzLmNvbnRlbnRfY3NzKTsKCgkJCXQuZWRpdG9yID0gZWQ7CgoJCQkvLyBGb3JjZSBhYnNvbHV0ZSBDU1MgdXJscwkKCQkJdGlueW1jZS5lYWNoKGNzcywgZnVuY3Rpb24odSwgaykgewoJCQkJY3NzW2tdID0gZWQuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUodSk7CgkJCX0pOwoKCQkJZWQuYWRkQ29tbWFuZCgnbWNlUHJldmlldycsIGZ1bmN0aW9uKCkgewoJCQkJZWQud2luZG93TWFuYWdlci5vcGVuKHsKCQkJCQlmaWxlIDogZWQuZ2V0UGFyYW0oInBsdWdpbl9wcmV2aWV3X3BhZ2V1cmwiLCB1cmwgKyAiL3ByZXZpZXcuaHRtbCIpLAoJCQkJCXdpZHRoIDogcGFyc2VJbnQoZWQuZ2V0UGFyYW0oInBsdWdpbl9wcmV2aWV3X3dpZHRoIiwgIjU1MCIpKSwKCQkJCQloZWlnaHQgOiBwYXJzZUludChlZC5nZXRQYXJhbSgicGx1Z2luX3ByZXZpZXdfaGVpZ2h0IiwgIjYwMCIpKSwKCQkJCQlyZXNpemFibGUgOiAieWVzIiwKCQkJCQlzY3JvbGxiYXJzIDogInllcyIsCgkJCQkJcG9wdXBfY3NzIDogY3NzID8gY3NzLmpvaW4oJywnKSA6IGVkLmJhc2VVUkkudG9BYnNvbHV0ZSgidGhlbWVzLyIgKyBlZC5zZXR0aW5ncy50aGVtZSArICIvc2tpbnMvIiArIGVkLnNldHRpbmdzLnNraW4gKyAiL2NvbnRlbnQuY3NzIiksCgkJCQkJaW5saW5lIDogZWQuZ2V0UGFyYW0oInBsdWdpbl9wcmV2aWV3X2lubGluZSIsIDEpCgkJCQl9LCB7CgkJCQkJYmFzZSA6IGVkLmRvY3VtZW50QmFzZVVSSS5nZXRVUkkoKQoJCQkJfSk7CgkJCX0pOwoKCQkJZWQuYWRkQnV0dG9uKCdwcmV2aWV3Jywge3RpdGxlIDogJ3ByZXZpZXcucHJldmlld19kZXNjJywgY21kIDogJ21jZVByZXZpZXcnfSk7CgkJfSwKCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gewoJCQkJbG9uZ25hbWUgOiAnUHJldmlldycsCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLAoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLAoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvcHJldmlldycsCgkJCQl2ZXJzaW9uIDogdGlueW1jZS5tYWpvclZlcnNpb24gKyAiLiIgKyB0aW55bWNlLm1pbm9yVmVyc2lvbgoJCQl9OwoJCX0KCX0pOwoKCS8vIFJlZ2lzdGVyIHBsdWdpbgoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgncHJldmlldycsIHRpbnltY2UucGx1Z2lucy5QcmV2aWV3KTsKfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/preview/example.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzY3JpcHRzL2VtYmVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp0aW55TUNFUG9wdXAub25Jbml0LmFkZChmdW5jdGlvbihlZCkgewoJdmFyIGRvbSA9IHRpbnlNQ0VQb3B1cC5kb207CgoJLy8gTG9hZCBlZGl0b3IgY29udGVudF9jc3MKCXRpbnltY2UuZWFjaChlZC5zZXR0aW5ncy5jb250ZW50X2Nzcy5zcGxpdCgnLCcpLCBmdW5jdGlvbih1KSB7CgkJZG9tLmxvYWRDU1MoZWQuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUodSkpOwoJfSk7CgoJLy8gUGxhY2UgY29udGVudHMgaW5zaWRlIGRpdiBjb250YWluZXIKCWRvbS5zZXRIVE1MKCdjb250ZW50JywgZWQuZ2V0Q29udGVudCgpKTsKfSk7Cjwvc2NyaXB0Pgo8dGl0bGU+RXhhbXBsZSBvZiBhIGN1c3RvbSBwcmV2aWV3IHBhZ2U8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5PgoKRWRpdG9yIGNvbnRlbnRzOiA8YnIgLz4KPGRpdiBpZD0iY29udGVudCI+CjwhLS0gR2V0cyBmaWxsZWQgd2l0aCBlZGl0b3IgY29udGVudHMgLS0+CjwvZGl2PgoKPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/preview/jscripts/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/preview/jscripts/embed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBUaGlzIHNjcmlwdCBjb250YWlucyBlbWJlZCBmdW5jdGlvbnMgZm9yIGNvbW1vbiBwbHVnaW5zLiBUaGlzIHNjcmlwdHMgYXJlIGNvbXBsZXR5IGZyZWUgdG8gdXNlIGZvciBhbnkgcHVycG9zZS4NCiAqLw0KDQpmdW5jdGlvbiB3cml0ZUZsYXNoKHApIHsNCgl3cml0ZUVtYmVkKA0KCQknRDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwJywNCgkJJ2h0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5jYWIjdmVyc2lvbj02LDAsNDAsMCcsDQoJCSdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsDQoJCXANCgkpOw0KfQ0KDQpmdW5jdGlvbiB3cml0ZVNob2NrV2F2ZShwKSB7DQoJd3JpdGVFbWJlZCgNCgknMTY2QjFCQ0EtM0Y5Qy0xMUNGLTgwNzUtNDQ0NTUzNTQwMDAwJywNCgknaHR0cDovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9zaG9ja3dhdmUvY2Ficy9kaXJlY3Rvci9zdy5jYWIjdmVyc2lvbj04LDUsMSwwJywNCgknYXBwbGljYXRpb24veC1kaXJlY3RvcicsDQoJCXANCgkpOw0KfQ0KDQpmdW5jdGlvbiB3cml0ZVF1aWNrVGltZShwKSB7DQoJd3JpdGVFbWJlZCgNCgkJJzAyQkYyNUQ1LThDMTctNEIyMy1CQzgwLUQzNDg4QUJEREM2QicsDQoJCSdodHRwOi8vd3d3LmFwcGxlLmNvbS9xdGFjdGl2ZXgvcXRwbHVnaW4uY2FiI3ZlcnNpb249NiwwLDIsMCcsDQoJCSd2aWRlby9xdWlja3RpbWUnLA0KCQlwDQoJKTsNCn0NCg0KZnVuY3Rpb24gd3JpdGVSZWFsTWVkaWEocCkgew0KCXdyaXRlRW1iZWQoDQoJCSdDRkNEQUEwMy04QkU0LTExY2YtQjg0Qi0wMDIwQUZCQkNDRkEnLA0KCQknaHR0cDovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9zaG9ja3dhdmUvY2Ficy9mbGFzaC9zd2ZsYXNoLmNhYiN2ZXJzaW9uPTYsMCw0MCwwJywNCgkJJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsDQoJCXANCgkpOw0KfQ0KDQpmdW5jdGlvbiB3cml0ZVdpbmRvd3NNZWRpYShwKSB7DQoJcC51cmwgPSBwLnNyYzsNCgl3cml0ZUVtYmVkKA0KCQknNkJGNTJBNTItMzk0QS0xMUQzLUIxNTMtMDBDMDRGNzlGQUE2JywNCgkJJ2h0dHA6Ly9hY3RpdmV4Lm1pY3Jvc29mdC5jb20vYWN0aXZleC9jb250cm9scy9tcGxheWVyL2VuL25zbXAyaW5mLmNhYiNWZXJzaW9uPTUsMSw1Miw3MDEnLA0KCQknYXBwbGljYXRpb24veC1tcGxheWVyMicsDQoJCXANCgkpOw0KfQ0KDQpmdW5jdGlvbiB3cml0ZUVtYmVkKGNscywgY2IsIG10LCBwKSB7DQoJdmFyIGggPSAnJywgbjsNCg0KCWggKz0gJzxvYmplY3QgY2xhc3NpZD0iY2xzaWQ6JyArIGNscyArICciIGNvZGViYXNlPSInICsgY2IgKyAnIic7DQoJaCArPSB0eXBlb2YocC5pZCkgIT0gInVuZGVmaW5lZCIgPyAnaWQ9IicgKyBwLmlkICsgJyInIDogJyc7DQoJaCArPSB0eXBlb2YocC5uYW1lKSAhPSAidW5kZWZpbmVkIiA/ICduYW1lPSInICsgcC5uYW1lICsgJyInIDogJyc7DQoJaCArPSB0eXBlb2YocC53aWR0aCkgIT0gInVuZGVmaW5lZCIgPyAnd2lkdGg9IicgKyBwLndpZHRoICsgJyInIDogJyc7DQoJaCArPSB0eXBlb2YocC5oZWlnaHQpICE9ICJ1bmRlZmluZWQiID8gJ2hlaWdodD0iJyArIHAuaGVpZ2h0ICsgJyInIDogJyc7DQoJaCArPSB0eXBlb2YocC5hbGlnbikgIT0gInVuZGVmaW5lZCIgPyAnYWxpZ249IicgKyBwLmFsaWduICsgJyInIDogJyc7DQoJaCArPSAnPic7DQoNCglmb3IgKG4gaW4gcCkNCgkJaCArPSAnPHBhcmFtIG5hbWU9IicgKyBuICsgJyIgdmFsdWU9IicgKyBwW25dICsgJyI+JzsNCg0KCWggKz0gJzxlbWJlZCB0eXBlPSInICsgbXQgKyAnIic7DQoNCglmb3IgKG4gaW4gcCkNCgkJaCArPSBuICsgJz0iJyArIHBbbl0gKyAnIiAnOw0KDQoJaCArPSAnPjwvZW1iZWQ+PC9vYmplY3Q+JzsNCg0KCWRvY3VtZW50LndyaXRlKGgpOw0KfQ0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/preview/preview.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzY3JpcHRzL2VtYmVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0KZG9jdW1lbnQud3JpdGUoJzxiYXNlIGhyZWY9IicgKyB0aW55TUNFUG9wdXAuZ2V0V2luZG93QXJnKCJiYXNlIikgKyAnIj4nKTsKLy8gLS0+Cjwvc2NyaXB0Pgo8dGl0bGU+eyNwcmV2aWV3LnByZXZpZXdfZGVzY308L3RpdGxlPgo8L2hlYWQ+Cjxib2R5IGlkPSJjb250ZW50Ij4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJZG9jdW1lbnQud3JpdGUodGlueU1DRVBvcHVwLmVkaXRvci5nZXRDb250ZW50KCkpOwo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/print/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/print/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5QcmludCIse2luaXQ6ZnVuY3Rpb24oYSxiKXthLmFkZENvbW1hbmQoIm1jZVByaW50IixmdW5jdGlvbigpe2EuZ2V0V2luKCkucHJpbnQoKX0pO2EuYWRkQnV0dG9uKCJwcmludCIse3RpdGxlOiJwcmludC5wcmludF9kZXNjIixjbWQ6Im1jZVByaW50In0pfSxnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJQcmludCIsYXV0aG9yOiJNb3hpZWNvZGUgU3lzdGVtcyBBQiIsYXV0aG9ydXJsOiJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tIixpbmZvdXJsOiJodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvcHJpbnQiLHZlcnNpb246dGlueW1jZS5tYWpvclZlcnNpb24rIi4iK3RpbnltY2UubWlub3JWZXJzaW9ufX19KTt0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCJwcmludCIsdGlueW1jZS5wbHVnaW5zLlByaW50KX0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/print/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLlByaW50Jywgew0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlUHJpbnQnLCBmdW5jdGlvbigpIHsNCgkJCQllZC5nZXRXaW4oKS5wcmludCgpOw0KCQkJfSk7DQoNCgkJCWVkLmFkZEJ1dHRvbigncHJpbnQnLCB7dGl0bGUgOiAncHJpbnQucHJpbnRfZGVzYycsIGNtZCA6ICdtY2VQcmludCd9KTsNCgkJfSwNCg0KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gew0KCQkJCWxvbmduYW1lIDogJ1ByaW50JywNCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9wcmludCcsDQoJCQkJdmVyc2lvbiA6IHRpbnltY2UubWFqb3JWZXJzaW9uICsgIi4iICsgdGlueW1jZS5taW5vclZlcnNpb24NCgkJCX07DQoJCX0NCgl9KTsNCg0KCS8vIFJlZ2lzdGVyIHBsdWdpbg0KCXRpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoJ3ByaW50JywgdGlueW1jZS5wbHVnaW5zLlByaW50KTsNCn0pKCk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/save/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/save/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5TYXZlIix7aW5pdDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7Yy5lZGl0b3I9YTthLmFkZENvbW1hbmQoIm1jZVNhdmUiLGMuX3NhdmUsYyk7YS5hZGRDb21tYW5kKCJtY2VDYW5jZWwiLGMuX2NhbmNlbCxjKTthLmFkZEJ1dHRvbigic2F2ZSIse3RpdGxlOiJzYXZlLnNhdmVfZGVzYyIsY21kOiJtY2VTYXZlIn0pO2EuYWRkQnV0dG9uKCJjYW5jZWwiLHt0aXRsZToic2F2ZS5jYW5jZWxfZGVzYyIsY21kOiJtY2VDYW5jZWwifSk7YS5vbk5vZGVDaGFuZ2UuYWRkKGMuX25vZGVDaGFuZ2UsYyk7YS5hZGRTaG9ydGN1dCgiY3RybCtzIixhLmdldExhbmcoInNhdmUuc2F2ZV9kZXNjIiksIm1jZVNhdmUiKX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiU2F2ZSIsYXV0aG9yOiJNb3hpZWNvZGUgU3lzdGVtcyBBQiIsYXV0aG9ydXJsOiJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tIixpbmZvdXJsOiJodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvc2F2ZSIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fSxfbm9kZUNoYW5nZTpmdW5jdGlvbihiLGEsYyl7dmFyIGI9dGhpcy5lZGl0b3I7aWYoYi5nZXRQYXJhbSgic2F2ZV9lbmFibGV3aGVuZGlydHkiKSl7YS5zZXREaXNhYmxlZCgic2F2ZSIsIWIuaXNEaXJ0eSgpKTthLnNldERpc2FibGVkKCJjYW5jZWwiLCFiLmlzRGlydHkoKSl9fSxfc2F2ZTpmdW5jdGlvbigpe3ZhciBjPXRoaXMuZWRpdG9yLGEsZSxkLGI7YT10aW55bWNlLkRPTS5nZXQoYy5pZCkuZm9ybXx8dGlueW1jZS5ET00uZ2V0UGFyZW50KGMuaWQsImZvcm0iKTtpZihjLmdldFBhcmFtKCJzYXZlX2VuYWJsZXdoZW5kaXJ0eSIpJiYhYy5pc0RpcnR5KCkpe3JldHVybn10aW55TUNFLnRyaWdnZXJTYXZlKCk7aWYoZT1jLmdldFBhcmFtKCJzYXZlX29uc2F2ZWNhbGxiYWNrIikpe2lmKGMuZXhlY0NhbGxiYWNrKCJzYXZlX29uc2F2ZWNhbGxiYWNrIixjKSl7Yy5zdGFydENvbnRlbnQ9dGlueW1jZS50cmltKGMuZ2V0Q29udGVudCh7Zm9ybWF0OiJyYXcifSkpO2Mubm9kZUNoYW5nZWQoKX1yZXR1cm59aWYoYSl7Yy5pc05vdERpcnR5PXRydWU7aWYoYS5vbnN1Ym1pdD09bnVsbHx8YS5vbnN1Ym1pdCgpIT1mYWxzZSl7YS5zdWJtaXQoKX1jLm5vZGVDaGFuZ2VkKCl9ZWxzZXtjLndpbmRvd01hbmFnZXIuYWxlcnQoIkVycm9yOiBObyBmb3JtIGVsZW1lbnQgZm91bmQuIil9fSxfY2FuY2VsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lZGl0b3IsYyxiPXRpbnltY2UudHJpbShhLnN0YXJ0Q29udGVudCk7aWYoYz1hLmdldFBhcmFtKCJzYXZlX29uY2FuY2VsY2FsbGJhY2siKSl7YS5leGVjQ2FsbGJhY2soInNhdmVfb25jYW5jZWxjYWxsYmFjayIsYSk7cmV0dXJufWEuc2V0Q29udGVudChiKTthLnVuZG9NYW5hZ2VyLmNsZWFyKCk7YS5ub2RlQ2hhbmdlZCgpfX0pO3RpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoInNhdmUiLHRpbnltY2UucGx1Z2lucy5TYXZlKX0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/save/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLlNhdmUnLCB7DQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQuZWRpdG9yID0gZWQ7DQoNCgkJCS8vIFJlZ2lzdGVyIGNvbW1hbmRzDQoJCQllZC5hZGRDb21tYW5kKCdtY2VTYXZlJywgdC5fc2F2ZSwgdCk7DQoJCQllZC5hZGRDb21tYW5kKCdtY2VDYW5jZWwnLCB0Ll9jYW5jZWwsIHQpOw0KDQoJCQkvLyBSZWdpc3RlciBidXR0b25zDQoJCQllZC5hZGRCdXR0b24oJ3NhdmUnLCB7dGl0bGUgOiAnc2F2ZS5zYXZlX2Rlc2MnLCBjbWQgOiAnbWNlU2F2ZSd9KTsNCgkJCWVkLmFkZEJ1dHRvbignY2FuY2VsJywge3RpdGxlIDogJ3NhdmUuY2FuY2VsX2Rlc2MnLCBjbWQgOiAnbWNlQ2FuY2VsJ30pOw0KDQoJCQllZC5vbk5vZGVDaGFuZ2UuYWRkKHQuX25vZGVDaGFuZ2UsIHQpOw0KCQkJZWQuYWRkU2hvcnRjdXQoJ2N0cmwrcycsIGVkLmdldExhbmcoJ3NhdmUuc2F2ZV9kZXNjJyksICdtY2VTYXZlJyk7DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdTYXZlJywNCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9zYXZlJywNCgkJCQl2ZXJzaW9uIDogdGlueW1jZS5tYWpvclZlcnNpb24gKyAiLiIgKyB0aW55bWNlLm1pbm9yVmVyc2lvbg0KCQkJfTsNCgkJfSwNCg0KCQkvLyBQcml2YXRlIG1ldGhvZHMNCg0KCQlfbm9kZUNoYW5nZSA6IGZ1bmN0aW9uKGVkLCBjbSwgbikgew0KCQkJdmFyIGVkID0gdGhpcy5lZGl0b3I7DQoNCgkJCWlmIChlZC5nZXRQYXJhbSgnc2F2ZV9lbmFibGV3aGVuZGlydHknKSkgew0KCQkJCWNtLnNldERpc2FibGVkKCdzYXZlJywgIWVkLmlzRGlydHkoKSk7DQoJCQkJY20uc2V0RGlzYWJsZWQoJ2NhbmNlbCcsICFlZC5pc0RpcnR5KCkpOw0KCQkJfQ0KCQl9LA0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KDQoJCV9zYXZlIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvciwgZm9ybU9iaiwgb3MsIGksIGVsZW1lbnRJZDsNCg0KCQkJZm9ybU9iaiA9IHRpbnltY2UuRE9NLmdldChlZC5pZCkuZm9ybSB8fCB0aW55bWNlLkRPTS5nZXRQYXJlbnQoZWQuaWQsICdmb3JtJyk7DQoNCgkJCWlmIChlZC5nZXRQYXJhbSgic2F2ZV9lbmFibGV3aGVuZGlydHkiKSAmJiAhZWQuaXNEaXJ0eSgpKQ0KCQkJCXJldHVybjsNCg0KCQkJdGlueU1DRS50cmlnZ2VyU2F2ZSgpOw0KDQoJCQkvLyBVc2UgY2FsbGJhY2sgaW5zdGVhZA0KCQkJaWYgKG9zID0gZWQuZ2V0UGFyYW0oInNhdmVfb25zYXZlY2FsbGJhY2siKSkgew0KCQkJCWlmIChlZC5leGVjQ2FsbGJhY2soJ3NhdmVfb25zYXZlY2FsbGJhY2snLCBlZCkpIHsNCgkJCQkJZWQuc3RhcnRDb250ZW50ID0gdGlueW1jZS50cmltKGVkLmdldENvbnRlbnQoe2Zvcm1hdCA6ICdyYXcnfSkpOw0KCQkJCQllZC5ub2RlQ2hhbmdlZCgpOw0KCQkJCX0NCg0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJaWYgKGZvcm1PYmopIHsNCgkJCQllZC5pc05vdERpcnR5ID0gdHJ1ZTsNCg0KCQkJCWlmIChmb3JtT2JqLm9uc3VibWl0ID09IG51bGwgfHwgZm9ybU9iai5vbnN1Ym1pdCgpICE9IGZhbHNlKQ0KCQkJCQlmb3JtT2JqLnN1Ym1pdCgpOw0KDQoJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCX0gZWxzZQ0KCQkJCWVkLndpbmRvd01hbmFnZXIuYWxlcnQoIkVycm9yOiBObyBmb3JtIGVsZW1lbnQgZm91bmQuIik7DQoJCX0sDQoNCgkJX2NhbmNlbCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGVkID0gdGhpcy5lZGl0b3IsIG9zLCBoID0gdGlueW1jZS50cmltKGVkLnN0YXJ0Q29udGVudCk7DQoNCgkJCS8vIFVzZSBjYWxsYmFjayBpbnN0ZWFkDQoJCQlpZiAob3MgPSBlZC5nZXRQYXJhbSgic2F2ZV9vbmNhbmNlbGNhbGxiYWNrIikpIHsNCgkJCQllZC5leGVjQ2FsbGJhY2soJ3NhdmVfb25jYW5jZWxjYWxsYmFjaycsIGVkKTsNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCWVkLnNldENvbnRlbnQoaCk7DQoJCQllZC51bmRvTWFuYWdlci5jbGVhcigpOw0KCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnc2F2ZScsIHRpbnltY2UucGx1Z2lucy5TYXZlKTsNCn0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/searchreplace/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/searchreplace/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/searchreplace/css/searchreplace.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LnBhbmVsX3dyYXBwZXIge2hlaWdodDo4NXB4O30KLnBhbmVsX3dyYXBwZXIgZGl2LmN1cnJlbnQge2hlaWdodDo4NXB4O30KCi8qIElFICovCiogaHRtbCAucGFuZWxfd3JhcHBlciB7aGVpZ2h0OjEwMHB4O30KKiBodG1sIC5wYW5lbF93cmFwcGVyIGRpdi5jdXJyZW50IHtoZWlnaHQ6MTAwcHg7fQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/searchreplace/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5TZWFyY2hSZXBsYWNlUGx1Z2luIix7aW5pdDpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGIoZCl7YS53aW5kb3dNYW5hZ2VyLm9wZW4oe2ZpbGU6YysiL3NlYXJjaHJlcGxhY2UuaHRtIix3aWR0aDo0MjArcGFyc2VJbnQoYS5nZXRMYW5nKCJzZWFyY2hyZXBsYWNlLmRlbHRhX3dpZHRoIiwwKSksaGVpZ2h0OjE3MCtwYXJzZUludChhLmdldExhbmcoInNlYXJjaHJlcGxhY2UuZGVsdGFfaGVpZ2h0IiwwKSksaW5saW5lOjEsYXV0b19mb2N1czowfSx7bW9kZTpkLHNlYXJjaF9zdHJpbmc6YS5zZWxlY3Rpb24uZ2V0Q29udGVudCh7Zm9ybWF0OiJ0ZXh0In0pLHBsdWdpbl91cmw6Y30pfWEuYWRkQ29tbWFuZCgibWNlU2VhcmNoIixmdW5jdGlvbigpe2IoInNlYXJjaCIpfSk7YS5hZGRDb21tYW5kKCJtY2VSZXBsYWNlIixmdW5jdGlvbigpe2IoInJlcGxhY2UiKX0pO2EuYWRkQnV0dG9uKCJzZWFyY2giLHt0aXRsZToic2VhcmNocmVwbGFjZS5zZWFyY2hfZGVzYyIsY21kOiJtY2VTZWFyY2gifSk7YS5hZGRCdXR0b24oInJlcGxhY2UiLHt0aXRsZToic2VhcmNocmVwbGFjZS5yZXBsYWNlX2Rlc2MiLGNtZDoibWNlUmVwbGFjZSJ9KTthLmFkZFNob3J0Y3V0KCJjdHJsK2YiLCJzZWFyY2hyZXBsYWNlLnNlYXJjaF9kZXNjIiwibWNlU2VhcmNoIil9LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6IlNlYXJjaC9SZXBsYWNlIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9zZWFyY2hyZXBsYWNlIix2ZXJzaW9uOnRpbnltY2UubWFqb3JWZXJzaW9uKyIuIit0aW55bWNlLm1pbm9yVmVyc2lvbn19fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgic2VhcmNocmVwbGFjZSIsdGlueW1jZS5wbHVnaW5zLlNlYXJjaFJlcGxhY2VQbHVnaW4pfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLlNlYXJjaFJlcGxhY2VQbHVnaW4nLCB7DQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQlmdW5jdGlvbiBvcGVuKG0pIHsNCgkJCQllZC53aW5kb3dNYW5hZ2VyLm9wZW4oew0KCQkJCQlmaWxlIDogdXJsICsgJy9zZWFyY2hyZXBsYWNlLmh0bScsDQoJCQkJCXdpZHRoIDogNDIwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygnc2VhcmNocmVwbGFjZS5kZWx0YV93aWR0aCcsIDApKSwNCgkJCQkJaGVpZ2h0IDogMTcwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygnc2VhcmNocmVwbGFjZS5kZWx0YV9oZWlnaHQnLCAwKSksDQoJCQkJCWlubGluZSA6IDEsDQoJCQkJCWF1dG9fZm9jdXMgOiAwDQoJCQkJfSwgew0KCQkJCQltb2RlIDogbSwNCgkJCQkJc2VhcmNoX3N0cmluZyA6IGVkLnNlbGVjdGlvbi5nZXRDb250ZW50KHtmb3JtYXQgOiAndGV4dCd9KSwNCgkJCQkJcGx1Z2luX3VybCA6IHVybA0KCQkJCX0pOw0KCQkJfTsNCg0KCQkJLy8gUmVnaXN0ZXIgY29tbWFuZHMNCgkJCWVkLmFkZENvbW1hbmQoJ21jZVNlYXJjaCcsIGZ1bmN0aW9uKCkgew0KCQkJCW9wZW4oJ3NlYXJjaCcpOw0KCQkJfSk7DQoNCgkJCWVkLmFkZENvbW1hbmQoJ21jZVJlcGxhY2UnLCBmdW5jdGlvbigpIHsNCgkJCQlvcGVuKCdyZXBsYWNlJyk7DQoJCQl9KTsNCg0KCQkJLy8gUmVnaXN0ZXIgYnV0dG9ucw0KCQkJZWQuYWRkQnV0dG9uKCdzZWFyY2gnLCB7dGl0bGUgOiAnc2VhcmNocmVwbGFjZS5zZWFyY2hfZGVzYycsIGNtZCA6ICdtY2VTZWFyY2gnfSk7DQoJCQllZC5hZGRCdXR0b24oJ3JlcGxhY2UnLCB7dGl0bGUgOiAnc2VhcmNocmVwbGFjZS5yZXBsYWNlX2Rlc2MnLCBjbWQgOiAnbWNlUmVwbGFjZSd9KTsNCg0KCQkJZWQuYWRkU2hvcnRjdXQoJ2N0cmwrZicsICdzZWFyY2hyZXBsYWNlLnNlYXJjaF9kZXNjJywgJ21jZVNlYXJjaCcpOw0KCQl9LA0KDQoJCWdldEluZm8gOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB7DQoJCQkJbG9uZ25hbWUgOiAnU2VhcmNoL1JlcGxhY2UnLA0KCQkJCWF1dGhvciA6ICdNb3hpZWNvZGUgU3lzdGVtcyBBQicsDQoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLA0KCQkJCWluZm91cmwgOiAnaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL3NlYXJjaHJlcGxhY2UnLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9DQoJfSk7DQoNCgkvLyBSZWdpc3RlciBwbHVnaW4NCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCdzZWFyY2hyZXBsYWNlJywgdGlueW1jZS5wbHVnaW5zLlNlYXJjaFJlcGxhY2VQbHVnaW4pOw0KfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/searchreplace/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/searchreplace/js/searchreplace.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgU2VhcmNoUmVwbGFjZURpYWxvZyA9IHsNCglpbml0IDogZnVuY3Rpb24oZWQpIHsNCgkJdmFyIGYgPSBkb2N1bWVudC5mb3Jtc1swXSwgbSA9IHRpbnlNQ0VQb3B1cC5nZXRXaW5kb3dBcmcoIm1vZGUiKTsNCg0KCQl0aGlzLnN3aXRjaE1vZGUobSk7DQoNCgkJZlttICsgJ19wYW5lbF9zZWFyY2hzdHJpbmcnXS52YWx1ZSA9IHRpbnlNQ0VQb3B1cC5nZXRXaW5kb3dBcmcoInNlYXJjaF9zdHJpbmciKTsNCg0KCQkvLyBGb2N1cyBpbnB1dCBmaWVsZA0KCQlmW20gKyAnX3BhbmVsX3NlYXJjaHN0cmluZyddLmZvY3VzKCk7DQoJfSwNCg0KCXN3aXRjaE1vZGUgOiBmdW5jdGlvbihtKSB7DQoJCXZhciBmLCBsbSA9IHRoaXMubGFzdE1vZGU7DQoNCgkJaWYgKGxtICE9IG0pIHsNCgkJCWYgPSBkb2N1bWVudC5mb3Jtc1swXTsNCg0KCQkJaWYgKGxtKSB7DQoJCQkJZlttICsgJ19wYW5lbF9zZWFyY2hzdHJpbmcnXS52YWx1ZSA9IGZbbG0gKyAnX3BhbmVsX3NlYXJjaHN0cmluZyddLnZhbHVlOw0KCQkJCWZbbSArICdfcGFuZWxfYmFja3dhcmRzdSddLmNoZWNrZWQgPSBmW2xtICsgJ19wYW5lbF9iYWNrd2FyZHN1J10uY2hlY2tlZDsNCgkJCQlmW20gKyAnX3BhbmVsX2JhY2t3YXJkc2QnXS5jaGVja2VkID0gZltsbSArICdfcGFuZWxfYmFja3dhcmRzZCddLmNoZWNrZWQ7DQoJCQkJZlttICsgJ19wYW5lbF9jYXNlc2Vuc2l0aXZlYm94J10uY2hlY2tlZCA9IGZbbG0gKyAnX3BhbmVsX2Nhc2VzZW5zaXRpdmVib3gnXS5jaGVja2VkOw0KCQkJfQ0KDQoJCQltY1RhYnMuZGlzcGxheVRhYihtICsgJ190YWInLCAgbSArICdfcGFuZWwnKTsNCgkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXBsYWNlQnRuIikuc3R5bGUuZGlzcGxheSA9IChtID09ICJyZXBsYWNlIikgPyAiaW5saW5lIiA6ICJub25lIjsNCgkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXBsYWNlQWxsQnRuIikuc3R5bGUuZGlzcGxheSA9IChtID09ICJyZXBsYWNlIikgPyAiaW5saW5lIiA6ICJub25lIjsNCgkJCXRoaXMubGFzdE1vZGUgPSBtOw0KCQl9DQoJfSwNCg0KCXNlYXJjaE5leHQgOiBmdW5jdGlvbihhKSB7DQoJCXZhciBlZCA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IsIHNlID0gZWQuc2VsZWN0aW9uLCByID0gc2UuZ2V0Um5nKCksIGYsIG0gPSB0aGlzLmxhc3RNb2RlLCBzLCBiLCBmbCA9IDAsIHcgPSBlZC5nZXRXaW4oKSwgd20gPSBlZC53aW5kb3dNYW5hZ2VyLCBmbyA9IDA7DQoNCgkJLy8gR2V0IGlucHV0DQoJCWYgPSBkb2N1bWVudC5mb3Jtc1swXTsNCgkJcyA9IGZbbSArICdfcGFuZWxfc2VhcmNoc3RyaW5nJ10udmFsdWU7DQoJCWIgPSBmW20gKyAnX3BhbmVsX2JhY2t3YXJkc3UnXS5jaGVja2VkOw0KCQljYSA9IGZbbSArICdfcGFuZWxfY2FzZXNlbnNpdGl2ZWJveCddLmNoZWNrZWQ7DQoJCXJzID0gZlsncmVwbGFjZV9wYW5lbF9yZXBsYWNlc3RyaW5nJ10udmFsdWU7DQoNCgkJaWYgKHRpbnltY2UuaXNJRSkgew0KCQkJciA9IGVkLmdldERvYygpLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOw0KCQl9DQoNCgkJaWYgKHMgPT0gJycpDQoJCQlyZXR1cm47DQoNCgkJZnVuY3Rpb24gZml4KCkgew0KCQkJLy8gQ29ycmVjdCBGaXJlZm94IGdyYXBoaWNzIGdsaXRjaGVzDQoJCQlyID0gc2UuZ2V0Um5nKCkuY2xvbmVSYW5nZSgpOw0KCQkJZWQuZ2V0RG9jKCkuZXhlY0NvbW1hbmQoJ1NlbGVjdEFsbCcsIGZhbHNlLCBudWxsKTsNCgkJCXNlLnNldFJuZyhyKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiByZXBsYWNlKCkgew0KCQkJaWYgKHRpbnltY2UuaXNJRSkNCgkJCQllZC5zZWxlY3Rpb24uZ2V0Um5nKCkuZHVwbGljYXRlKCkucGFzdGVIVE1MKHJzKTsgLy8gTmVlZHMgdG8gYmUgZHVwbGljYXRlZCBkdWUgdG8gc2VsZWN0aW9uIGJ1ZyBpbiBJRQ0KCQkJZWxzZQ0KCQkJCWVkLmdldERvYygpLmV4ZWNDb21tYW5kKCdJbnNlcnRIVE1MJywgZmFsc2UsIHJzKTsNCgkJfTsNCg0KCQkvLyBJRSBmbGFncw0KCQlpZiAoY2EpDQoJCQlmbCA9IGZsIHwgNDsNCg0KCQlzd2l0Y2ggKGEpIHsNCgkJCWNhc2UgJ2FsbCc6DQoJCQkJLy8gTW92ZSBjYXJldCB0byBiZWdpbm5pbmcgb2YgdGV4dA0KCQkJCWVkLmV4ZWNDb21tYW5kKCdTZWxlY3RBbGwnKTsNCgkJCQllZC5zZWxlY3Rpb24uY29sbGFwc2UodHJ1ZSk7DQoNCgkJCQlpZiAodGlueW1jZS5pc0lFKSB7DQoJCQkJCXdoaWxlIChyLmZpbmRUZXh0KHMsIGIgPyAtMSA6IDEsIGZsKSkgew0KCQkJCQkJci5zY3JvbGxJbnRvVmlldygpOw0KCQkJCQkJci5zZWxlY3QoKTsNCgkJCQkJCXJlcGxhY2UoKTsNCgkJCQkJCWZvID0gMTsNCg0KCQkJCQkJaWYgKGIpIHsNCgkJCQkJCQlyLm1vdmVFbmQoImNoYXJhY3RlciIsIC0ocnMubGVuZ3RoKSk7IC8vIE90aGVyd2lzZSB3aWxsIGxvb3AgZm9yZXZlcg0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJdGlueU1DRVBvcHVwLnN0b3JlU2VsZWN0aW9uKCk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJd2hpbGUgKHcuZmluZChzLCBjYSwgYiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKSB7DQoJCQkJCQlyZXBsYWNlKCk7DQoJCQkJCQlmbyA9IDE7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlpZiAoZm8pDQoJCQkJCXRpbnlNQ0VQb3B1cC5hbGVydChlZC5nZXRMYW5nKCdzZWFyY2hyZXBsYWNlX2RsZy5hbGxyZXBsYWNlZCcpKTsNCgkJCQllbHNlDQoJCQkJCXRpbnlNQ0VQb3B1cC5hbGVydChlZC5nZXRMYW5nKCdzZWFyY2hyZXBsYWNlX2RsZy5ub3Rmb3VuZCcpKTsNCg0KCQkJCXJldHVybjsNCg0KCQkJY2FzZSAnY3VycmVudCc6DQoJCQkJaWYgKCFlZC5zZWxlY3Rpb24uaXNDb2xsYXBzZWQoKSkNCgkJCQkJcmVwbGFjZSgpOw0KDQoJCQkJYnJlYWs7DQoJCX0NCg0KCQlzZS5jb2xsYXBzZShiKTsNCgkJciA9IHNlLmdldFJuZygpOw0KDQoJCWlmICh0aW55bWNlLmlzSUUpIHsNCgkJCXIgPSBlZC5nZXREb2MoKS5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsNCgkJfQ0KDQoJCS8vIFdoYXRzIHRoZSBwb2ludA0KCQlpZiAoIXMpDQoJCQlyZXR1cm47DQoNCgkJaWYgKHRpbnltY2UuaXNJRSkgew0KCQkJaWYgKHIuZmluZFRleHQocywgYiA/IC0xIDogMSwgZmwpKSB7DQoJCQkJci5zY3JvbGxJbnRvVmlldygpOw0KCQkJCXIuc2VsZWN0KCk7DQoJCQl9IGVsc2UNCgkJCQl0aW55TUNFUG9wdXAuYWxlcnQoZWQuZ2V0TGFuZygnc2VhcmNocmVwbGFjZV9kbGcubm90Zm91bmQnKSk7DQoNCgkJCXRpbnlNQ0VQb3B1cC5zdG9yZVNlbGVjdGlvbigpOw0KCQl9IGVsc2Ugew0KCQkJaWYgKCF3LmZpbmQocywgY2EsIGIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSkNCgkJCQl0aW55TUNFUG9wdXAuYWxlcnQoZWQuZ2V0TGFuZygnc2VhcmNocmVwbGFjZV9kbGcubm90Zm91bmQnKSk7DQoJCQllbHNlDQoJCQkJZml4KCk7DQoJCX0NCgl9DQp9Ow0KDQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChTZWFyY2hSZXBsYWNlRGlhbG9nLmluaXQsIFNlYXJjaFJlcGxhY2VEaWFsb2cpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/searchreplace/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/searchreplace/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5zZWFyY2hyZXBsYWNlX2RsZycsew0Kc2VhcmNobmV4dF9kZXNjOiJGaW5kIGFnYWluIiwNCm5vdGZvdW5kOiJUaGUgc2VhcmNoIGhhcyBiZWVuIGNvbXBsZXRlZC4gVGhlIHNlYXJjaCBzdHJpbmcgY291bGQgbm90IGJlIGZvdW5kLiIsDQpzZWFyY2hfdGl0bGU6IkZpbmQiLA0KcmVwbGFjZV90aXRsZToiRmluZC9SZXBsYWNlIiwNCmFsbHJlcGxhY2VkOiJBbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNlYXJjaCBzdHJpbmcgd2VyZSByZXBsYWNlZC4iLA0KZmluZHdoYXQ6IkZpbmQgd2hhdCIsDQpyZXBsYWNld2l0aDoiUmVwbGFjZSB3aXRoIiwNCmRpcmVjdGlvbjoiRGlyZWN0aW9uIiwNCnVwOiJVcCIsDQpkb3duOiJEb3duIiwNCm1jYXNlOiJNYXRjaCBjYXNlIiwNCmZpbmRuZXh0OiJGaW5kIG5leHQiLA0KcmVwbGFjZToiUmVwbGFjZSIsDQpyZXBsYWNlYWxsOiJSZXBsYWNlIGFsbCINCn0pOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/searchreplace/searchreplace.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjc2VhcmNocmVwbGFjZV9kbGcucmVwbGFjZV90aXRsZX08L3RpdGxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdGlueV9tY2VfcG9wdXAuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvbWN0YWJzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL2Zvcm1fdXRpbHMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvc2VhcmNocmVwbGFjZS5qcyI+PC9zY3JpcHQ+Cgk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3Mvc2VhcmNocmVwbGFjZS5jc3MiIC8+CjwvaGVhZD4KPGJvZHkgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgo8Zm9ybSBvbnN1Ym1pdD0iU2VhcmNoUmVwbGFjZURpYWxvZy5zZWFyY2hOZXh0KCdub25lJyk7cmV0dXJuIGZhbHNlOyIgYWN0aW9uPSIjIj4KCTxkaXYgY2xhc3M9InRhYnMiPgoJCTx1bD4KCQkJPGxpIGlkPSJzZWFyY2hfdGFiIj48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0OlNlYXJjaFJlcGxhY2VEaWFsb2cuc3dpdGNoTW9kZSgnc2VhcmNoJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNzZWFyY2hyZXBsYWNlLnNlYXJjaF9kZXNjfTwvYT48L3NwYW4+PC9saT4KCQkJPGxpIGlkPSJyZXBsYWNlX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDpTZWFyY2hSZXBsYWNlRGlhbG9nLnN3aXRjaE1vZGUoJ3JlcGxhY2UnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I3NlYXJjaHJlcGxhY2VfZGxnLnJlcGxhY2V9PC9hPjwvc3Bhbj48L2xpPgoJCTwvdWw+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJwYW5lbF93cmFwcGVyIj4KCQk8ZGl2IGlkPSJzZWFyY2hfcGFuZWwiIGNsYXNzPSJwYW5lbCI+CgkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CgkJCQk8dHI+CgkJCQkJPHRkPjxsYWJlbCBmb3I9InNlYXJjaF9wYW5lbF9zZWFyY2hzdHJpbmciPnsjc2VhcmNocmVwbGFjZV9kbGcuZmluZHdoYXR9PC9sYWJlbD48L3RkPgoJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InNlYXJjaF9wYW5lbF9zZWFyY2hzdHJpbmciIG5hbWU9InNlYXJjaF9wYW5lbF9zZWFyY2hzdHJpbmciIHN0eWxlPSJ3aWR0aDogMjAwcHgiIC8+PC90ZD4KCQkJCTwvdHI+CgkJCQk8dHI+CgkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGNsYXNzPSJkaXJlY3Rpb24iPgoJCQkJCQkJPHRyPgoJCQkJCQkJCTx0ZD48bGFiZWw+eyNzZWFyY2hyZXBsYWNlX2RsZy5kaXJlY3Rpb259PC9sYWJlbD48L3RkPgoJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9InNlYXJjaF9wYW5lbF9iYWNrd2FyZHN1IiBuYW1lPSJzZWFyY2hfcGFuZWxfYmFja3dhcmRzIiBjbGFzcz0icmFkaW8iIHR5cGU9InJhZGlvIiAvPjwvdGQ+CgkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InNlYXJjaF9wYW5lbF9iYWNrd2FyZHN1Ij57I3NlYXJjaHJlcGxhY2VfZGxnLnVwfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJzZWFyY2hfcGFuZWxfYmFja3dhcmRzZCIgbmFtZT0ic2VhcmNoX3BhbmVsX2JhY2t3YXJkcyIgY2xhc3M9InJhZGlvIiB0eXBlPSJyYWRpbyIgY2hlY2tlZD0iY2hlY2tlZCIgLz48L3RkPgoJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJzZWFyY2hfcGFuZWxfYmFja3dhcmRzZCI+eyNzZWFyY2hyZXBsYWNlX2RsZy5kb3dufTwvbGFiZWw+PC90ZD4KCQkJCQkJCTwvdHI+CgkJCQkJCTwvdGFibGU+CgkJCQkJPC90ZD4KCQkJCTwvdHI+CgkJCQk8dHI+CgkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQkJCQkJPHRyPgoJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9InNlYXJjaF9wYW5lbF9jYXNlc2Vuc2l0aXZlYm94IiBuYW1lPSJzZWFyY2hfcGFuZWxfY2FzZXNlbnNpdGl2ZWJveCIgY2xhc3M9ImNoZWNrYm94IiB0eXBlPSJjaGVja2JveCIgLz48L3RkPgoJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJzZWFyY2hfcGFuZWxfY2FzZXNlbnNpdGl2ZWJveCI+eyNzZWFyY2hyZXBsYWNlX2RsZy5tY2FzZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8L3RyPgoJCQkJCQk8L3RhYmxlPgoJCQkJCTwvdGQ+CgkJCQk8L3RyPgoJCQk8L3RhYmxlPgoJCTwvZGl2PgoKCQk8ZGl2IGlkPSJyZXBsYWNlX3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgoJCQkJPHRyPgoJCQkJCTx0ZD48bGFiZWwgZm9yPSJyZXBsYWNlX3BhbmVsX3NlYXJjaHN0cmluZyI+eyNzZWFyY2hyZXBsYWNlX2RsZy5maW5kd2hhdH08L2xhYmVsPjwvdGQ+CgkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icmVwbGFjZV9wYW5lbF9zZWFyY2hzdHJpbmciIG5hbWU9InJlcGxhY2VfcGFuZWxfc2VhcmNoc3RyaW5nIiBzdHlsZT0id2lkdGg6IDIwMHB4IiAvPjwvdGQ+CgkJCQk8L3RyPgoJCQkJPHRyPgoJCQkJCTx0ZD48bGFiZWwgZm9yPSJyZXBsYWNlX3BhbmVsX3JlcGxhY2VzdHJpbmciPnsjc2VhcmNocmVwbGFjZV9kbGcucmVwbGFjZXdpdGh9PC9sYWJlbD48L3RkPgoJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InJlcGxhY2VfcGFuZWxfcmVwbGFjZXN0cmluZyIgbmFtZT0icmVwbGFjZV9wYW5lbF9yZXBsYWNlc3RyaW5nIiBzdHlsZT0id2lkdGg6IDIwMHB4IiAvPjwvdGQ+CgkJCQk8L3RyPgoJCQkJPHRyPgoJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBjbGFzcz0iZGlyZWN0aW9uIj4KCQkJCQkJCTx0cj4KCQkJCQkJCQk8dGQ+PGxhYmVsPnsjc2VhcmNocmVwbGFjZV9kbGcuZGlyZWN0aW9ufTwvbGFiZWw+PC90ZD4KCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJyZXBsYWNlX3BhbmVsX2JhY2t3YXJkc3UiIG5hbWU9InJlcGxhY2VfcGFuZWxfYmFja3dhcmRzIiBjbGFzcz0icmFkaW8iIHR5cGU9InJhZGlvIiAvPjwvdGQ+CgkJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InJlcGxhY2VfcGFuZWxfYmFja3dhcmRzdSI+eyNzZWFyY2hyZXBsYWNlX2RsZy51cH08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJPHRkPjxpbnB1dCBpZD0icmVwbGFjZV9wYW5lbF9iYWNrd2FyZHNkIiBuYW1lPSJyZXBsYWNlX3BhbmVsX2JhY2t3YXJkcyIgY2xhc3M9InJhZGlvIiB0eXBlPSJyYWRpbyIgY2hlY2tlZD0iY2hlY2tlZCIgLz48L3RkPgoJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJyZXBsYWNlX3BhbmVsX2JhY2t3YXJkc2QiPnsjc2VhcmNocmVwbGFjZV9kbGcuZG93bn08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8L3RyPgoJCQkJCQk8L3RhYmxlPgoJCQkJCTwvdGQ+CgkJCQk8L3RyPgoJCQkJPHRyPgoJCQkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQkJCTx0cj4KCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJyZXBsYWNlX3BhbmVsX2Nhc2VzZW5zaXRpdmVib3giIG5hbWU9InJlcGxhY2VfcGFuZWxfY2FzZXNlbnNpdGl2ZWJveCIgY2xhc3M9ImNoZWNrYm94IiB0eXBlPSJjaGVja2JveCIgLz48L3RkPgoJCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJyZXBsYWNlX3BhbmVsX2Nhc2VzZW5zaXRpdmVib3giPnsjc2VhcmNocmVwbGFjZV9kbGcubWNhc2V9PC9sYWJlbD48L3RkPgoJCQkJCQkJPC90cj4KCQkJCQkJPC90YWJsZT4KCQkJCQk8L3RkPgoJCQkJPC90cj4KCQkJPC90YWJsZT4KCQk8L2Rpdj4KCgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJtY2VBY3Rpb25QYW5lbCI+CgkJPGlucHV0IHR5cGU9InN1Ym1pdCIgaWQ9Imluc2VydCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0ieyNzZWFyY2hyZXBsYWNlX2RsZy5maW5kbmV4dH0iIC8+CgkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ1dHRvbiIgaWQ9InJlcGxhY2VCdG4iIG5hbWU9InJlcGxhY2VCdG4iIHZhbHVlPSJ7I3NlYXJjaHJlcGxhY2VfZGxnLnJlcGxhY2V9IiBvbmNsaWNrPSJTZWFyY2hSZXBsYWNlRGlhbG9nLnNlYXJjaE5leHQoJ2N1cnJlbnQnKTsiIC8+CgkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ1dHRvbiIgaWQ9InJlcGxhY2VBbGxCdG4iIG5hbWU9InJlcGxhY2VBbGxCdG4iIHZhbHVlPSJ7I3NlYXJjaHJlcGxhY2VfZGxnLnJlcGxhY2VhbGx9IiBvbmNsaWNrPSJTZWFyY2hSZXBsYWNlRGlhbG9nLnNlYXJjaE5leHQoJ2FsbCcpOyIgLz4KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iY2FuY2VsIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJ7I2NhbmNlbH0iIG9uY2xpY2s9InRpbnlNQ0VQb3B1cC5jbG9zZSgpOyIgLz4KCTwvZGl2Pgo8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/spellchecker/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/spellchecker/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/spellchecker/css/content.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Lm1jZUl0ZW1IaWRkZW5TcGVsbFdvcmQge2JhY2tncm91bmQ6dXJsKC4uL2ltZy93bGluZS5naWYpIHJlcGVhdC14IGJvdHRvbSBsZWZ0OyBjdXJzb3I6ZGVmYXVsdDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/spellchecker/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dmFyIGE9dGlueW1jZS51dGlsLkpTT05SZXF1ZXN0LGM9dGlueW1jZS5lYWNoLGI9dGlueW1jZS5ET007dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5TcGVsbGNoZWNrZXJQbHVnaW4iLHtnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJTcGVsbGNoZWNrZXIiLGF1dGhvcjoiTW94aWVjb2RlIFN5c3RlbXMgQUIiLGF1dGhvcnVybDoiaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbSIsaW5mb3VybDoiaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL3NwZWxsY2hlY2tlciIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fSxpbml0OmZ1bmN0aW9uKGUsZil7dmFyIGc9dGhpcyxkO2cudXJsPWY7Zy5lZGl0b3I9ZTtnLnJwY1VybD1lLmdldFBhcmFtKCJzcGVsbGNoZWNrZXJfcnBjX3VybCIsIntiYWNrZW5kfSIpO2lmKGcucnBjVXJsPT0ie2JhY2tlbmR9Iil7aWYodGlueW1jZS5pc0lFKXtyZXR1cm59Zy5oYXNTdXBwb3J0PXRydWU7ZS5vbkNvbnRleHRNZW51LmFkZFRvVG9wKGZ1bmN0aW9uKGgsaSl7aWYoZy5hY3RpdmUpe3JldHVybiBmYWxzZX19KX1lLmFkZENvbW1hbmQoIm1jZVNwZWxsQ2hlY2siLGZ1bmN0aW9uKCl7aWYoZy5ycGNVcmw9PSJ7YmFja2VuZH0iKXtnLmVkaXRvci5nZXRCb2R5KCkuc3BlbGxjaGVjaz1nLmFjdGl2ZT0hZy5hY3RpdmU7cmV0dXJufWlmKCFnLmFjdGl2ZSl7ZS5zZXRQcm9ncmVzc1N0YXRlKDEpO2cuX3NlbmRSUEMoImNoZWNrV29yZHMiLFtnLnNlbGVjdGVkTGFuZyxnLl9nZXRXb3JkcygpXSxmdW5jdGlvbihoKXtpZihoLmxlbmd0aD4wKXtnLmFjdGl2ZT0xO2cuX21hcmtXb3JkcyhoKTtlLnNldFByb2dyZXNzU3RhdGUoMCk7ZS5ub2RlQ2hhbmdlZCgpfWVsc2V7ZS5zZXRQcm9ncmVzc1N0YXRlKDApO2lmKGUuZ2V0UGFyYW0oInNwZWxsY2hlY2tlcl9yZXBvcnRfbm9fbWlzc3BlbGxpbmdzIix0cnVlKSl7ZS53aW5kb3dNYW5hZ2VyLmFsZXJ0KCJzcGVsbGNoZWNrZXIubm9fbXBlbGwiKX19fSl9ZWxzZXtnLl9kb25lKCl9fSk7ZS5vbkluaXQuYWRkKGZ1bmN0aW9uKCl7aWYoZS5zZXR0aW5ncy5jb250ZW50X2NzcyE9PWZhbHNlKXtlLmRvbS5sb2FkQ1NTKGYrIi9jc3MvY29udGVudC5jc3MiKX19KTtlLm9uQ2xpY2suYWRkKGcuX3Nob3dNZW51LGcpO2Uub25Db250ZXh0TWVudS5hZGQoZy5fc2hvd01lbnUsZyk7ZS5vbkJlZm9yZUdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKCl7aWYoZy5hY3RpdmUpe2cuX3JlbW92ZVdvcmRzKCl9fSk7ZS5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKGksaCl7aC5zZXRBY3RpdmUoInNwZWxsY2hlY2tlciIsZy5hY3RpdmUpfSk7ZS5vblNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKCl7Zy5fZG9uZSgpfSk7ZS5vbkJlZm9yZUdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKCl7Zy5fZG9uZSgpfSk7ZS5vbkJlZm9yZUV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihoLGkpe2lmKGk9PSJtY2VGdWxsU2NyZWVuIil7Zy5fZG9uZSgpfX0pO2cubGFuZ3VhZ2VzPXt9O2MoZS5nZXRQYXJhbSgic3BlbGxjaGVja2VyX2xhbmd1YWdlcyIsIitFbmdsaXNoPWVuLERhbmlzaD1kYSxEdXRjaD1ubCxGaW5uaXNoPWZpLEZyZW5jaD1mcixHZXJtYW49ZGUsSXRhbGlhbj1pdCxQb2xpc2g9cGwsUG9ydHVndWVzZT1wdCxTcGFuaXNoPWVzLFN3ZWRpc2g9c3YiLCJoYXNoIiksZnVuY3Rpb24oaSxoKXtpZihoLmluZGV4T2YoIisiKT09PTApe2g9aC5zdWJzdHJpbmcoMSk7Zy5zZWxlY3RlZExhbmc9aX1nLmxhbmd1YWdlc1toXT1pfSl9LGNyZWF0ZUNvbnRyb2w6ZnVuY3Rpb24oaCxkKXt2YXIgZj10aGlzLGcsZT1mLmVkaXRvcjtpZihoPT0ic3BlbGxjaGVja2VyIil7aWYoZi5ycGNVcmw9PSJ7YmFja2VuZH0iKXtpZihmLmhhc1N1cHBvcnQpe2c9ZC5jcmVhdGVCdXR0b24oaCx7dGl0bGU6InNwZWxsY2hlY2tlci5kZXNjIixjbWQ6Im1jZVNwZWxsQ2hlY2siLHNjb3BlOmZ9KX1yZXR1cm4gZ31nPWQuY3JlYXRlU3BsaXRCdXR0b24oaCx7dGl0bGU6InNwZWxsY2hlY2tlci5kZXNjIixjbWQ6Im1jZVNwZWxsQ2hlY2siLHNjb3BlOmZ9KTtnLm9uUmVuZGVyTWVudS5hZGQoZnVuY3Rpb24oaixpKXtpLmFkZCh7dGl0bGU6InNwZWxsY2hlY2tlci5sYW5ncyIsImNsYXNzIjoibWNlTWVudUl0ZW1UaXRsZSJ9KS5zZXREaXNhYmxlZCgxKTtjKGYubGFuZ3VhZ2VzLGZ1bmN0aW9uKG4sbSl7dmFyIHA9e2ljb246MX0sbDtwLm9uY2xpY2s9ZnVuY3Rpb24oKXtsLnNldFNlbGVjdGVkKDEpO2Yuc2VsZWN0ZWRJdGVtLnNldFNlbGVjdGVkKDApO2Yuc2VsZWN0ZWRJdGVtPWw7Zi5zZWxlY3RlZExhbmc9bn07cC50aXRsZT1tO2w9aS5hZGQocCk7bC5zZXRTZWxlY3RlZChuPT1mLnNlbGVjdGVkTGFuZyk7aWYobj09Zi5zZWxlY3RlZExhbmcpe2Yuc2VsZWN0ZWRJdGVtPWx9fSl9KTtyZXR1cm4gZ319LF93YWxrOmZ1bmN0aW9uKGksZyl7dmFyIGg9dGhpcy5lZGl0b3IuZ2V0RG9jKCksZTtpZihoLmNyZWF0ZVRyZWVXYWxrZXIpe2U9aC5jcmVhdGVUcmVlV2Fsa2VyKGksTm9kZUZpbHRlci5TSE9XX1RFWFQsbnVsbCxmYWxzZSk7d2hpbGUoKGk9ZS5uZXh0Tm9kZSgpKSE9bnVsbCl7Zy5jYWxsKHRoaXMsaSl9fWVsc2V7dGlueW1jZS53YWxrKGksZywiY2hpbGROb2RlcyIpfX0sX2dldFNlcGFyYXRvcnM6ZnVuY3Rpb24oKXt2YXIgZT0iIixkLGY9dGhpcy5lZGl0b3IuZ2V0UGFyYW0oInNwZWxsY2hlY2tlcl93b3JkX3NlcGFyYXRvcl9jaGFycyIsJ1xccyEiIyQlJigpKissLS4vOjs8PT4/QFtdXl97fH2nqauusba3uLu8vb6/1/ekXHUyMDFkXHUyMDFjJyk7Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrKyl7ZSs9IlxcIitmLmNoYXJBdChkKX1yZXR1cm4gZX0sX2dldFdvcmRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lZGl0b3IsZz1bXSxkPSIiLGY9e30saD1bXTt0aGlzLl93YWxrKGUuZ2V0Qm9keSgpLGZ1bmN0aW9uKGkpe2lmKGkubm9kZVR5cGU9PTMpe2QrPWkubm9kZVZhbHVlKyIgIn19KTtpZihlLmdldFBhcmFtKCJzcGVsbGNoZWNrZXJfd29yZF9wYXR0ZXJuIikpe2g9ZC5tYXRjaCgiKCIrZS5nZXRQYXJhbSgic3BlbGxjaGVja2VyX3dvcmRfcGF0dGVybiIpKyIpIiwiZ2kiKX1lbHNle2Q9ZC5yZXBsYWNlKG5ldyBSZWdFeHAoIihbMC05XXxbIit0aGlzLl9nZXRTZXBhcmF0b3JzKCkrIl0pIiwiZyIpLCIgIik7ZD10aW55bWNlLnRyaW0oZC5yZXBsYWNlKC8oXHMrKS9nLCIgIikpO2g9ZC5zcGxpdCgiICIpfWMoaCxmdW5jdGlvbihpKXtpZighZltpXSl7Zy5wdXNoKGkpO2ZbaV09MX19KTtyZXR1cm4gZ30sX3JlbW92ZVdvcmRzOmZ1bmN0aW9uKGUpe3ZhciBmPXRoaXMuZWRpdG9yLGg9Zi5kb20sZz1mLnNlbGVjdGlvbixkPWcuZ2V0Qm9va21hcmsoKTtjKGguc2VsZWN0KCJzcGFuIikucmV2ZXJzZSgpLGZ1bmN0aW9uKGkpe2lmKGkmJihoLmhhc0NsYXNzKGksIm1jZUl0ZW1IaWRkZW5TcGVsbFdvcmQiKXx8aC5oYXNDbGFzcyhpLCJtY2VJdGVtSGlkZGVuIikpKXtpZighZXx8aC5kZWNvZGUoaS5pbm5lckhUTUwpPT1lKXtoLnJlbW92ZShpLDEpfX19KTtnLm1vdmVUb0Jvb2ttYXJrKGQpfSxfbWFya1dvcmRzOmZ1bmN0aW9uKG8pe3ZhciBpLGgsZyxmLGUsbj0iIixrPXRoaXMuZWRpdG9yLHA9dGhpcy5fZ2V0U2VwYXJhdG9ycygpLGo9ay5kb20sZD1bXTt2YXIgbD1rLnNlbGVjdGlvbixtPWwuZ2V0Qm9va21hcmsoKTtjKG8sZnVuY3Rpb24ocSl7bis9KG4/InwiOiIiKStxfSk7aT1uZXcgUmVnRXhwKCIoWyIrcCsiXSkoIituKyIpKFsiK3ArIl0pIiwiZyIpO2g9bmV3IFJlZ0V4cCgiXigiK24rIikiLCJnIik7Zz1uZXcgUmVnRXhwKCIoIituKyIpKFsiK3ArIl0/KSQiLCJnIik7Zj1uZXcgUmVnRXhwKCJeKCIrbisiKShbIitwKyJdPykkIiwiZyIpO2U9bmV3IFJlZ0V4cCgiKCIrbisiKShbIitwKyJdKSIsImciKTt0aGlzLl93YWxrKHRoaXMuZWRpdG9yLmdldEJvZHkoKSxmdW5jdGlvbihxKXtpZihxLm5vZGVUeXBlPT0zKXtkLnB1c2gocSl9fSk7YyhkLGZ1bmN0aW9uKHIpe3ZhciBxO2lmKHIubm9kZVR5cGU9PTMpe3E9ci5ub2RlVmFsdWU7aWYoaS50ZXN0KHEpfHxoLnRlc3QocSl8fGcudGVzdChxKXx8Zi50ZXN0KHEpKXtxPWouZW5jb2RlKHEpO3E9cS5yZXBsYWNlKGUsJzxzcGFuIGNsYXNzPSJtY2VJdGVtSGlkZGVuU3BlbGxXb3JkIj4kMTwvc3Bhbj4kMicpO3E9cS5yZXBsYWNlKGcsJzxzcGFuIGNsYXNzPSJtY2VJdGVtSGlkZGVuU3BlbGxXb3JkIj4kMTwvc3Bhbj4kMicpO2oucmVwbGFjZShqLmNyZWF0ZSgic3BhbiIseyJjbGFzcyI6Im1jZUl0ZW1IaWRkZW4ifSxxKSxyKX19fSk7bC5tb3ZlVG9Cb29rbWFyayhtKX0sX3Nob3dNZW51OmZ1bmN0aW9uKGgsail7dmFyIGk9dGhpcyxoPWkuZWRpdG9yLGQ9aS5fbWVudSxsLGs9aC5kb20sZz1rLmdldFZpZXdQb3J0KGguZ2V0V2luKCkpLGY9ai50YXJnZXQ7aj0wO2lmKCFkKXtsPWIuZ2V0UG9zKGguZ2V0Q29udGVudEFyZWFDb250YWluZXIoKSk7ZD1oLmNvbnRyb2xNYW5hZ2VyLmNyZWF0ZURyb3BNZW51KCJzcGVsbGNoZWNrZXJtZW51Iix7b2Zmc2V0X3g6bC54LG9mZnNldF95OmwueSwiY2xhc3MiOiJtY2VOb0ljb25zIn0pO2kuX21lbnU9ZH1pZihrLmhhc0NsYXNzKGYsIm1jZUl0ZW1IaWRkZW5TcGVsbFdvcmQiKSl7ZC5yZW1vdmVBbGwoKTtkLmFkZCh7dGl0bGU6InNwZWxsY2hlY2tlci53YWl0IiwiY2xhc3MiOiJtY2VNZW51SXRlbVRpdGxlIn0pLnNldERpc2FibGVkKDEpO2kuX3NlbmRSUEMoImdldFN1Z2dlc3Rpb25zIixbaS5zZWxlY3RlZExhbmcsay5kZWNvZGUoZi5pbm5lckhUTUwpXSxmdW5jdGlvbihtKXt2YXIgZTtkLnJlbW92ZUFsbCgpO2lmKG0ubGVuZ3RoPjApe2QuYWRkKHt0aXRsZToic3BlbGxjaGVja2VyLnN1ZyIsImNsYXNzIjoibWNlTWVudUl0ZW1UaXRsZSJ9KS5zZXREaXNhYmxlZCgxKTtjKG0sZnVuY3Rpb24obil7ZC5hZGQoe3RpdGxlOm4sb25jbGljazpmdW5jdGlvbigpe2sucmVwbGFjZShoLmdldERvYygpLmNyZWF0ZVRleHROb2RlKG4pLGYpO2kuX2NoZWNrRG9uZSgpfX0pfSk7ZC5hZGRTZXBhcmF0b3IoKX1lbHNle2QuYWRkKHt0aXRsZToic3BlbGxjaGVja2VyLm5vX3N1ZyIsImNsYXNzIjoibWNlTWVudUl0ZW1UaXRsZSJ9KS5zZXREaXNhYmxlZCgxKX1lPWkuZWRpdG9yLmdldFBhcmFtKCJzcGVsbGNoZWNrZXJfZW5hYmxlX2lnbm9yZV9ycGMiLCIiKTtkLmFkZCh7dGl0bGU6InNwZWxsY2hlY2tlci5pZ25vcmVfd29yZCIsb25jbGljazpmdW5jdGlvbigpe3ZhciBuPWYuaW5uZXJIVE1MO2sucmVtb3ZlKGYsMSk7aS5fY2hlY2tEb25lKCk7aWYoZSl7aC5zZXRQcm9ncmVzc1N0YXRlKDEpO2kuX3NlbmRSUEMoImlnbm9yZVdvcmQiLFtpLnNlbGVjdGVkTGFuZyxuXSxmdW5jdGlvbihvKXtoLnNldFByb2dyZXNzU3RhdGUoMCl9KX19fSk7ZC5hZGQoe3RpdGxlOiJzcGVsbGNoZWNrZXIuaWdub3JlX3dvcmRzIixvbmNsaWNrOmZ1bmN0aW9uKCl7dmFyIG49Zi5pbm5lckhUTUw7aS5fcmVtb3ZlV29yZHMoay5kZWNvZGUobikpO2kuX2NoZWNrRG9uZSgpO2lmKGUpe2guc2V0UHJvZ3Jlc3NTdGF0ZSgxKTtpLl9zZW5kUlBDKCJpZ25vcmVXb3JkcyIsW2kuc2VsZWN0ZWRMYW5nLG5dLGZ1bmN0aW9uKG8pe2guc2V0UHJvZ3Jlc3NTdGF0ZSgwKX0pfX19KTtpZihpLmVkaXRvci5nZXRQYXJhbSgic3BlbGxjaGVja2VyX2VuYWJsZV9sZWFybl9ycGMiKSl7ZC5hZGQoe3RpdGxlOiJzcGVsbGNoZWNrZXIubGVhcm5fd29yZCIsb25jbGljazpmdW5jdGlvbigpe3ZhciBuPWYuaW5uZXJIVE1MO2sucmVtb3ZlKGYsMSk7aS5fY2hlY2tEb25lKCk7aC5zZXRQcm9ncmVzc1N0YXRlKDEpO2kuX3NlbmRSUEMoImxlYXJuV29yZCIsW2kuc2VsZWN0ZWRMYW5nLG5dLGZ1bmN0aW9uKG8pe2guc2V0UHJvZ3Jlc3NTdGF0ZSgwKX0pfX0pfWQudXBkYXRlKCl9KTtoLnNlbGVjdGlvbi5zZWxlY3QoZik7bD1rLmdldFBvcyhmKTtkLnNob3dNZW51KGwueCxsLnkrZi5vZmZzZXRIZWlnaHQtZy55KTtyZXR1cm4gdGlueW1jZS5kb20uRXZlbnQuY2FuY2VsKGopfWVsc2V7ZC5oaWRlTWVudSgpfX0sX2NoZWNrRG9uZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsZD1lLmVkaXRvcixnPWQuZG9tLGY7YyhnLnNlbGVjdCgic3BhbiIpLGZ1bmN0aW9uKGgpe2lmKGgmJmcuaGFzQ2xhc3MoaCwibWNlSXRlbUhpZGRlblNwZWxsV29yZCIpKXtmPXRydWU7cmV0dXJuIGZhbHNlfX0pO2lmKCFmKXtlLl9kb25lKCl9fSxfZG9uZTpmdW5jdGlvbigpe3ZhciBkPXRoaXMsZT1kLmFjdGl2ZTtpZihkLmFjdGl2ZSl7ZC5hY3RpdmU9MDtkLl9yZW1vdmVXb3JkcygpO2lmKGQuX21lbnUpe2QuX21lbnUuaGlkZU1lbnUoKX1pZihlKXtkLmVkaXRvci5ub2RlQ2hhbmdlZCgpfX19LF9zZW5kUlBDOmZ1bmN0aW9uKGUsZyxkKXt2YXIgZj10aGlzO2Euc2VuZFJQQyh7dXJsOmYucnBjVXJsLG1ldGhvZDplLHBhcmFtczpnLHN1Y2Nlc3M6ZCxlcnJvcjpmdW5jdGlvbihpLGgpe2YuZWRpdG9yLnNldFByb2dyZXNzU3RhdGUoMCk7Zi5lZGl0b3Iud2luZG93TWFuYWdlci5hbGVydChpLmVycnN0cnx8KCJFcnJvciByZXNwb25zZTogIitoLnJlc3BvbnNlVGV4dCkpfX0pfX0pO3RpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoInNwZWxsY2hlY2tlciIsdGlueW1jZS5wbHVnaW5zLlNwZWxsY2hlY2tlclBsdWdpbil9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/spellchecker/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgSlNPTlJlcXVlc3QgPSB0aW55bWNlLnV0aWwuSlNPTlJlcXVlc3QsIGVhY2ggPSB0aW55bWNlLmVhY2gsIERPTSA9IHRpbnltY2UuRE9NOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UucGx1Z2lucy5TcGVsbGNoZWNrZXJQbHVnaW4nLCB7DQoJCWdldEluZm8gOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB7DQoJCQkJbG9uZ25hbWUgOiAnU3BlbGxjaGVja2VyJywNCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9zcGVsbGNoZWNrZXInLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9LA0KDQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNtOw0KDQoJCQl0LnVybCA9IHVybDsNCgkJCXQuZWRpdG9yID0gZWQ7DQoJCQl0LnJwY1VybCA9IGVkLmdldFBhcmFtKCJzcGVsbGNoZWNrZXJfcnBjX3VybCIsICJ7YmFja2VuZH0iKTsNCg0KCQkJaWYgKHQucnBjVXJsID09ICd7YmFja2VuZH0nKSB7DQoJCQkJLy8gU25pZmYgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgbmF0aXZlIHNwZWxsY2hlY2tpbmcgKERvbid0IGtub3cgb2YgYSBiZXR0ZXIgd2F5KQ0KCQkJCWlmICh0aW55bWNlLmlzSUUpDQoJCQkJCXJldHVybjsNCg0KCQkJCXQuaGFzU3VwcG9ydCA9IHRydWU7DQoNCgkJCQkvLyBEaXNhYmxlIHRoZSBjb250ZXh0IG1lbnUgd2hlbiBzcGVsbGNoZWNraW5nIGlzIGFjdGl2ZQ0KCQkJCWVkLm9uQ29udGV4dE1lbnUuYWRkVG9Ub3AoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJaWYgKHQuYWN0aXZlKQ0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBSZWdpc3RlciBjb21tYW5kcw0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlU3BlbGxDaGVjaycsIGZ1bmN0aW9uKCkgew0KCQkJCWlmICh0LnJwY1VybCA9PSAne2JhY2tlbmR9Jykgew0KCQkJCQkvLyBFbmFibGUvZGlzYWJsZSBuYXRpdmUgc3BlbGxjaGVja2VyDQoJCQkJCXQuZWRpdG9yLmdldEJvZHkoKS5zcGVsbGNoZWNrID0gdC5hY3RpdmUgPSAhdC5hY3RpdmU7DQoJCQkJCXJldHVybjsNCgkJCQl9DQoNCgkJCQlpZiAoIXQuYWN0aXZlKSB7DQoJCQkJCWVkLnNldFByb2dyZXNzU3RhdGUoMSk7DQoJCQkJCXQuX3NlbmRSUEMoJ2NoZWNrV29yZHMnLCBbdC5zZWxlY3RlZExhbmcsIHQuX2dldFdvcmRzKCldLCBmdW5jdGlvbihyKSB7DQoJCQkJCQlpZiAoci5sZW5ndGggPiAwKSB7DQoJCQkJCQkJdC5hY3RpdmUgPSAxOw0KCQkJCQkJCXQuX21hcmtXb3JkcyhyKTsNCgkJCQkJCQllZC5zZXRQcm9ncmVzc1N0YXRlKDApOw0KCQkJCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCWVkLnNldFByb2dyZXNzU3RhdGUoMCk7DQoNCgkJCQkJCQlpZiAoZWQuZ2V0UGFyYW0oJ3NwZWxsY2hlY2tlcl9yZXBvcnRfbm9fbWlzc3BlbGxpbmdzJywgdHJ1ZSkpDQoJCQkJCQkJCWVkLndpbmRvd01hbmFnZXIuYWxlcnQoJ3NwZWxsY2hlY2tlci5ub19tcGVsbCcpOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9IGVsc2UNCgkJCQkJdC5fZG9uZSgpOw0KCQkJfSk7DQoNCgkJCWVkLm9uSW5pdC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJaWYgKGVkLnNldHRpbmdzLmNvbnRlbnRfY3NzICE9PSBmYWxzZSkNCgkJCQkJZWQuZG9tLmxvYWRDU1ModXJsICsgJy9jc3MvY29udGVudC5jc3MnKTsNCgkJCX0pOw0KDQoJCQllZC5vbkNsaWNrLmFkZCh0Ll9zaG93TWVudSwgdCk7DQoJCQllZC5vbkNvbnRleHRNZW51LmFkZCh0Ll9zaG93TWVudSwgdCk7DQoJCQllZC5vbkJlZm9yZUdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCWlmICh0LmFjdGl2ZSkNCgkJCQkJdC5fcmVtb3ZlV29yZHMoKTsNCgkJCX0pOw0KDQoJCQllZC5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKGVkLCBjbSkgew0KCQkJCWNtLnNldEFjdGl2ZSgnc3BlbGxjaGVja2VyJywgdC5hY3RpdmUpOw0KCQkJfSk7DQoNCgkJCWVkLm9uU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJdC5fZG9uZSgpOw0KCQkJfSk7DQoNCgkJCWVkLm9uQmVmb3JlR2V0Q29udGVudC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJdC5fZG9uZSgpOw0KCQkJfSk7DQoNCgkJCWVkLm9uQmVmb3JlRXhlY0NvbW1hbmQuYWRkKGZ1bmN0aW9uKGVkLCBjbWQpIHsNCgkJCQlpZiAoY21kID09ICdtY2VGdWxsU2NyZWVuJykNCgkJCQkJdC5fZG9uZSgpOw0KCQkJfSk7DQoNCgkJCS8vIEZpbmQgc2VsZWN0ZWQgbGFuZ3VhZ2UNCgkJCXQubGFuZ3VhZ2VzID0ge307DQoJCQllYWNoKGVkLmdldFBhcmFtKCdzcGVsbGNoZWNrZXJfbGFuZ3VhZ2VzJywgJytFbmdsaXNoPWVuLERhbmlzaD1kYSxEdXRjaD1ubCxGaW5uaXNoPWZpLEZyZW5jaD1mcixHZXJtYW49ZGUsSXRhbGlhbj1pdCxQb2xpc2g9cGwsUG9ydHVndWVzZT1wdCxTcGFuaXNoPWVzLFN3ZWRpc2g9c3YnLCAnaGFzaCcpLCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJaWYgKGsuaW5kZXhPZignKycpID09PSAwKSB7DQoJCQkJCWsgPSBrLnN1YnN0cmluZygxKTsNCgkJCQkJdC5zZWxlY3RlZExhbmcgPSB2Ow0KCQkJCX0NCg0KCQkJCXQubGFuZ3VhZ2VzW2tdID0gdjsNCgkJCX0pOw0KCQl9LA0KDQoJCWNyZWF0ZUNvbnRyb2wgOiBmdW5jdGlvbihuLCBjbSkgew0KCQkJdmFyIHQgPSB0aGlzLCBjLCBlZCA9IHQuZWRpdG9yOw0KDQoJCQlpZiAobiA9PSAnc3BlbGxjaGVja2VyJykgew0KCQkJCS8vIFVzZSBiYXNpYyBidXR0b24gaWYgd2UgdXNlIHRoZSBuYXRpdmUgc3BlbGxjaGVja2VyDQoJCQkJaWYgKHQucnBjVXJsID09ICd7YmFja2VuZH0nKSB7DQoJCQkJCS8vIENyZWF0ZSBzaW1wbGUgdG9nZ2xlIGJ1dHRvbiBpZiB3ZSBoYXZlIG5hdGl2ZSBzdXBwb3J0DQoJCQkJCWlmICh0Lmhhc1N1cHBvcnQpDQoJCQkJCQljID0gY20uY3JlYXRlQnV0dG9uKG4sIHt0aXRsZSA6ICdzcGVsbGNoZWNrZXIuZGVzYycsIGNtZCA6ICdtY2VTcGVsbENoZWNrJywgc2NvcGUgOiB0fSk7DQoNCgkJCQkJcmV0dXJuIGM7DQoJCQkJfQ0KDQoJCQkJYyA9IGNtLmNyZWF0ZVNwbGl0QnV0dG9uKG4sIHt0aXRsZSA6ICdzcGVsbGNoZWNrZXIuZGVzYycsIGNtZCA6ICdtY2VTcGVsbENoZWNrJywgc2NvcGUgOiB0fSk7DQoNCgkJCQljLm9uUmVuZGVyTWVudS5hZGQoZnVuY3Rpb24oYywgbSkgew0KCQkJCQltLmFkZCh7dGl0bGUgOiAnc3BlbGxjaGVja2VyLmxhbmdzJywgJ2NsYXNzJyA6ICdtY2VNZW51SXRlbVRpdGxlJ30pLnNldERpc2FibGVkKDEpOw0KCQkJCQllYWNoKHQubGFuZ3VhZ2VzLCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJCQl2YXIgbyA9IHtpY29uIDogMX0sIG1pOw0KDQoJCQkJCQlvLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsNCgkJCQkJCQltaS5zZXRTZWxlY3RlZCgxKTsNCgkJCQkJCQl0LnNlbGVjdGVkSXRlbS5zZXRTZWxlY3RlZCgwKTsNCgkJCQkJCQl0LnNlbGVjdGVkSXRlbSA9IG1pOw0KCQkJCQkJCXQuc2VsZWN0ZWRMYW5nID0gdjsNCgkJCQkJCX07DQoNCgkJCQkJCW8udGl0bGUgPSBrOw0KCQkJCQkJbWkgPSBtLmFkZChvKTsNCgkJCQkJCW1pLnNldFNlbGVjdGVkKHYgPT0gdC5zZWxlY3RlZExhbmcpOw0KDQoJCQkJCQlpZiAodiA9PSB0LnNlbGVjdGVkTGFuZykNCgkJCQkJCQl0LnNlbGVjdGVkSXRlbSA9IG1pOw0KCQkJCQl9KQ0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIGM7DQoJCQl9DQoJCX0sDQoNCgkJLy8gSW50ZXJuYWwgZnVuY3Rpb25zDQoNCgkJX3dhbGsgOiBmdW5jdGlvbihuLCBmKSB7DQoJCQl2YXIgZCA9IHRoaXMuZWRpdG9yLmdldERvYygpLCB3Ow0KDQoJCQlpZiAoZC5jcmVhdGVUcmVlV2Fsa2VyKSB7DQoJCQkJdyA9IGQuY3JlYXRlVHJlZVdhbGtlcihuLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCwgbnVsbCwgZmFsc2UpOw0KDQoJCQkJd2hpbGUgKChuID0gdy5uZXh0Tm9kZSgpKSAhPSBudWxsKQ0KCQkJCQlmLmNhbGwodGhpcywgbik7DQoJCQl9IGVsc2UNCgkJCQl0aW55bWNlLndhbGsobiwgZiwgJ2NoaWxkTm9kZXMnKTsNCgkJfSwNCg0KCQlfZ2V0U2VwYXJhdG9ycyA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHJlID0gJycsIGksIHN0ciA9IHRoaXMuZWRpdG9yLmdldFBhcmFtKCdzcGVsbGNoZWNrZXJfd29yZF9zZXBhcmF0b3JfY2hhcnMnLCAnXFxzISIjJCUmKCkqKywtLi86Ozw9Pj9AW1xdXl97fH2nqauusba3uLu8vb6/1/ekXHUyMDFkXHUyMDFjJyk7DQoNCgkJCS8vIEJ1aWxkIHdvcmQgc2VwYXJhdG9yIHJlZ2V4cA0KCQkJZm9yIChpPTA7IGk8c3RyLmxlbmd0aDsgaSsrKQ0KCQkJCXJlICs9ICdcXCcgKyBzdHIuY2hhckF0KGkpOw0KDQoJCQlyZXR1cm4gcmU7DQoJCX0sDQoNCgkJX2dldFdvcmRzIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvciwgd2wgPSBbXSwgdHggPSAnJywgbG8gPSB7fSwgcmF3V29yZHMgPSBbXTsNCg0KCQkJLy8gR2V0IGFyZWEgdGV4dA0KCQkJdGhpcy5fd2FsayhlZC5nZXRCb2R5KCksIGZ1bmN0aW9uKG4pIHsNCgkJCQlpZiAobi5ub2RlVHlwZSA9PSAzKQ0KCQkJCQl0eCArPSBuLm5vZGVWYWx1ZSArICcgJzsNCgkJCX0pOw0KDQoJCQkvLyBzcGxpdCB0aGUgdGV4dCB1cCBpbnRvIGluZGl2aWR1YWwgd29yZHMNCgkJCWlmIChlZC5nZXRQYXJhbSgnc3BlbGxjaGVja2VyX3dvcmRfcGF0dGVybicpKSB7DQoJCQkJLy8gbG9vayBmb3Igd29yZHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybg0KCQkJCXJhd1dvcmRzID0gdHgubWF0Y2goJygnICsgZWQuZ2V0UGFyYW0oJ3NwZWxsY2hlY2tlcl93b3JkX3BhdHRlcm4nKSArICcpJywgJ2dpJyk7DQoJCQl9IGVsc2Ugew0KCQkJCS8vIFNwbGl0IHdvcmRzIGJ5IHNlcGFyYXRvcg0KCQkJCXR4ID0gdHgucmVwbGFjZShuZXcgUmVnRXhwKCcoWzAtOV18WycgKyB0aGlzLl9nZXRTZXBhcmF0b3JzKCkgKyAnXSknLCAnZycpLCAnICcpOw0KCQkJCXR4ID0gdGlueW1jZS50cmltKHR4LnJlcGxhY2UoLyhccyspL2csICcgJykpOw0KCQkJCXJhd1dvcmRzID0gdHguc3BsaXQoJyAnKTsNCgkJCX0NCg0KCQkJLy8gQnVpbGQgd29yZCBhcnJheSBhbmQgcmVtb3ZlIGR1cGxpY2F0ZXMNCgkJCWVhY2gocmF3V29yZHMsIGZ1bmN0aW9uKHYpIHsNCgkJCQlpZiAoIWxvW3ZdKSB7DQoJCQkJCXdsLnB1c2godik7DQoJCQkJCWxvW3ZdID0gMTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJcmV0dXJuIHdsOw0KCQl9LA0KDQoJCV9yZW1vdmVXb3JkcyA6IGZ1bmN0aW9uKHcpIHsNCgkJCXZhciBlZCA9IHRoaXMuZWRpdG9yLCBkb20gPSBlZC5kb20sIHNlID0gZWQuc2VsZWN0aW9uLCBiID0gc2UuZ2V0Qm9va21hcmsoKTsNCg0KCQkJZWFjaChkb20uc2VsZWN0KCdzcGFuJykucmV2ZXJzZSgpLCBmdW5jdGlvbihuKSB7DQoJCQkJaWYgKG4gJiYgKGRvbS5oYXNDbGFzcyhuLCAnbWNlSXRlbUhpZGRlblNwZWxsV29yZCcpIHx8IGRvbS5oYXNDbGFzcyhuLCAnbWNlSXRlbUhpZGRlbicpKSkgew0KCQkJCQlpZiAoIXcgfHwgZG9tLmRlY29kZShuLmlubmVySFRNTCkgPT0gdykNCgkJCQkJCWRvbS5yZW1vdmUobiwgMSk7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXNlLm1vdmVUb0Jvb2ttYXJrKGIpOw0KCQl9LA0KDQoJCV9tYXJrV29yZHMgOiBmdW5jdGlvbih3bCkgew0KCQkJdmFyIHIxLCByMiwgcjMsIHI0LCByNSwgdyA9ICcnLCBlZCA9IHRoaXMuZWRpdG9yLCByZSA9IHRoaXMuX2dldFNlcGFyYXRvcnMoKSwgZG9tID0gZWQuZG9tLCBubCA9IFtdOw0KCQkJdmFyIHNlID0gZWQuc2VsZWN0aW9uLCBiID0gc2UuZ2V0Qm9va21hcmsoKTsNCg0KCQkJZWFjaCh3bCwgZnVuY3Rpb24odikgew0KCQkJCXcgKz0gKHcgPyAnfCcgOiAnJykgKyB2Ow0KCQkJfSk7DQoNCgkJCXIxID0gbmV3IFJlZ0V4cCgnKFsnICsgcmUgKyAnXSkoJyArIHcgKyAnKShbJyArIHJlICsgJ10pJywgJ2cnKTsNCgkJCXIyID0gbmV3IFJlZ0V4cCgnXignICsgdyArICcpJywgJ2cnKTsNCgkJCXIzID0gbmV3IFJlZ0V4cCgnKCcgKyB3ICsgJykoWycgKyByZSArICddPykkJywgJ2cnKTsNCgkJCXI0ID0gbmV3IFJlZ0V4cCgnXignICsgdyArICcpKFsnICsgcmUgKyAnXT8pJCcsICdnJyk7DQoJCQlyNSA9IG5ldyBSZWdFeHAoJygnICsgdyArICcpKFsnICsgcmUgKyAnXSknLCAnZycpOw0KDQoJCQkvLyBDb2xsZWN0IGFsbCB0ZXh0IG5vZGVzDQoJCQl0aGlzLl93YWxrKHRoaXMuZWRpdG9yLmdldEJvZHkoKSwgZnVuY3Rpb24obikgew0KCQkJCWlmIChuLm5vZGVUeXBlID09IDMpIHsNCgkJCQkJbmwucHVzaChuKTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJLy8gV3JhcCBpbmNvcnJlY3Qgd29yZHMgaW4gc3BhbnMNCgkJCWVhY2gobmwsIGZ1bmN0aW9uKG4pIHsNCgkJCQl2YXIgdjsNCg0KCQkJCWlmIChuLm5vZGVUeXBlID09IDMpIHsNCgkJCQkJdiA9IG4ubm9kZVZhbHVlOw0KDQoJCQkJCWlmIChyMS50ZXN0KHYpIHx8IHIyLnRlc3QodikgfHwgcjMudGVzdCh2KSB8fCByNC50ZXN0KHYpKSB7DQoJCQkJCQl2ID0gZG9tLmVuY29kZSh2KTsNCgkJCQkJCXYgPSB2LnJlcGxhY2UocjUsICc8c3BhbiBjbGFzcz0ibWNlSXRlbUhpZGRlblNwZWxsV29yZCI+JDE8L3NwYW4+JDInKTsNCgkJCQkJCXYgPSB2LnJlcGxhY2UocjMsICc8c3BhbiBjbGFzcz0ibWNlSXRlbUhpZGRlblNwZWxsV29yZCI+JDE8L3NwYW4+JDInKTsNCg0KCQkJCQkJZG9tLnJlcGxhY2UoZG9tLmNyZWF0ZSgnc3BhbicsIHsnY2xhc3MnIDogJ21jZUl0ZW1IaWRkZW4nfSwgdiksIG4pOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXNlLm1vdmVUb0Jvb2ttYXJrKGIpOw0KCQl9LA0KDQoJCV9zaG93TWVudSA6IGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIG0gPSB0Ll9tZW51LCBwMSwgZG9tID0gZWQuZG9tLCB2cCA9IGRvbS5nZXRWaWV3UG9ydChlZC5nZXRXaW4oKSksIHdvcmRTcGFuID0gZS50YXJnZXQ7DQoNCgkJCWUgPSAwOyAvLyBGaXhlcyBJRSBtZW1vcnkgbGVhaw0KDQoJCQlpZiAoIW0pIHsNCgkJCQlwMSA9IERPTS5nZXRQb3MoZWQuZ2V0Q29udGVudEFyZWFDb250YWluZXIoKSk7DQoJCQkJLy9wMiA9IERPTS5nZXRQb3MoZWQuZ2V0Q29udGFpbmVyKCkpOw0KDQoJCQkJbSA9IGVkLmNvbnRyb2xNYW5hZ2VyLmNyZWF0ZURyb3BNZW51KCdzcGVsbGNoZWNrZXJtZW51Jywgew0KCQkJCQlvZmZzZXRfeCA6IHAxLngsDQoJCQkJCW9mZnNldF95IDogcDEueSwNCgkJCQkJJ2NsYXNzJyA6ICdtY2VOb0ljb25zJw0KCQkJCX0pOw0KDQoJCQkJdC5fbWVudSA9IG07DQoJCQl9DQoNCgkJCWlmIChkb20uaGFzQ2xhc3Mod29yZFNwYW4sICdtY2VJdGVtSGlkZGVuU3BlbGxXb3JkJykpIHsNCgkJCQltLnJlbW92ZUFsbCgpOw0KCQkJCW0uYWRkKHt0aXRsZSA6ICdzcGVsbGNoZWNrZXIud2FpdCcsICdjbGFzcycgOiAnbWNlTWVudUl0ZW1UaXRsZSd9KS5zZXREaXNhYmxlZCgxKTsNCg0KCQkJCXQuX3NlbmRSUEMoJ2dldFN1Z2dlc3Rpb25zJywgW3Quc2VsZWN0ZWRMYW5nLCBkb20uZGVjb2RlKHdvcmRTcGFuLmlubmVySFRNTCldLCBmdW5jdGlvbihyKSB7DQoJCQkJCXZhciBpZ25vcmVScGM7DQoNCgkJCQkJbS5yZW1vdmVBbGwoKTsNCg0KCQkJCQlpZiAoci5sZW5ndGggPiAwKSB7DQoJCQkJCQltLmFkZCh7dGl0bGUgOiAnc3BlbGxjaGVja2VyLnN1ZycsICdjbGFzcycgOiAnbWNlTWVudUl0ZW1UaXRsZSd9KS5zZXREaXNhYmxlZCgxKTsNCgkJCQkJCWVhY2gociwgZnVuY3Rpb24odikgew0KCQkJCQkJCW0uYWRkKHt0aXRsZSA6IHYsIG9uY2xpY2sgOiBmdW5jdGlvbigpIHsNCgkJCQkJCQkJZG9tLnJlcGxhY2UoZWQuZ2V0RG9jKCkuY3JlYXRlVGV4dE5vZGUodiksIHdvcmRTcGFuKTsNCgkJCQkJCQkJdC5fY2hlY2tEb25lKCk7DQoJCQkJCQkJfX0pOw0KCQkJCQkJfSk7DQoNCgkJCQkJCW0uYWRkU2VwYXJhdG9yKCk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJbS5hZGQoe3RpdGxlIDogJ3NwZWxsY2hlY2tlci5ub19zdWcnLCAnY2xhc3MnIDogJ21jZU1lbnVJdGVtVGl0bGUnfSkuc2V0RGlzYWJsZWQoMSk7DQoNCgkJCQkJaWdub3JlUnBjID0gdC5lZGl0b3IuZ2V0UGFyYW0oInNwZWxsY2hlY2tlcl9lbmFibGVfaWdub3JlX3JwYyIsICcnKTsNCgkJCQkJbS5hZGQoew0KCQkJCQkJdGl0bGUgOiAnc3BlbGxjaGVja2VyLmlnbm9yZV93b3JkJywNCgkJCQkJCW9uY2xpY2sgOiBmdW5jdGlvbigpIHsNCgkJCQkJCQl2YXIgd29yZCA9IHdvcmRTcGFuLmlubmVySFRNTDsNCg0KCQkJCQkJCWRvbS5yZW1vdmUod29yZFNwYW4sIDEpOw0KCQkJCQkJCXQuX2NoZWNrRG9uZSgpOw0KDQoJCQkJCQkJLy8gdGVsbCB0aGUgc2VydmVyIGlmIHdlIG5lZWQgdG8NCgkJCQkJCQlpZiAoaWdub3JlUnBjKSB7DQoJCQkJCQkJCWVkLnNldFByb2dyZXNzU3RhdGUoMSk7DQoJCQkJCQkJCXQuX3NlbmRSUEMoJ2lnbm9yZVdvcmQnLCBbdC5zZWxlY3RlZExhbmcsIHdvcmRdLCBmdW5jdGlvbihyKSB7DQoJCQkJCQkJCQllZC5zZXRQcm9ncmVzc1N0YXRlKDApOw0KCQkJCQkJCQl9KTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0pOw0KDQoJCQkJCW0uYWRkKHsNCgkJCQkJCXRpdGxlIDogJ3NwZWxsY2hlY2tlci5pZ25vcmVfd29yZHMnLA0KCQkJCQkJb25jbGljayA6IGZ1bmN0aW9uKCkgew0KCQkJCQkJCXZhciB3b3JkID0gd29yZFNwYW4uaW5uZXJIVE1MOw0KDQoJCQkJCQkJdC5fcmVtb3ZlV29yZHMoZG9tLmRlY29kZSh3b3JkKSk7DQoJCQkJCQkJdC5fY2hlY2tEb25lKCk7DQoNCgkJCQkJCQkvLyB0ZWxsIHRoZSBzZXJ2ZXIgaWYgd2UgbmVlZCB0bw0KCQkJCQkJCWlmIChpZ25vcmVScGMpIHsNCgkJCQkJCQkJZWQuc2V0UHJvZ3Jlc3NTdGF0ZSgxKTsNCgkJCQkJCQkJdC5fc2VuZFJQQygnaWdub3JlV29yZHMnLCBbdC5zZWxlY3RlZExhbmcsIHdvcmRdLCBmdW5jdGlvbihyKSB7DQoJCQkJCQkJCQllZC5zZXRQcm9ncmVzc1N0YXRlKDApOw0KCQkJCQkJCQl9KTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0pOw0KDQoNCgkJCQkJaWYgKHQuZWRpdG9yLmdldFBhcmFtKCJzcGVsbGNoZWNrZXJfZW5hYmxlX2xlYXJuX3JwYyIpKSB7DQoJCQkJCQltLmFkZCh7DQoJCQkJCQkJdGl0bGUgOiAnc3BlbGxjaGVja2VyLmxlYXJuX3dvcmQnLA0KCQkJCQkJCW9uY2xpY2sgOiBmdW5jdGlvbigpIHsNCgkJCQkJCQkJdmFyIHdvcmQgPSB3b3JkU3Bhbi5pbm5lckhUTUw7DQoNCgkJCQkJCQkJZG9tLnJlbW92ZSh3b3JkU3BhbiwgMSk7DQoJCQkJCQkJCXQuX2NoZWNrRG9uZSgpOw0KDQoJCQkJCQkJCWVkLnNldFByb2dyZXNzU3RhdGUoMSk7DQoJCQkJCQkJCXQuX3NlbmRSUEMoJ2xlYXJuV29yZCcsIFt0LnNlbGVjdGVkTGFuZywgd29yZF0sIGZ1bmN0aW9uKHIpIHsNCgkJCQkJCQkJCWVkLnNldFByb2dyZXNzU3RhdGUoMCk7DQoJCQkJCQkJCX0pOw0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KCQkJCQl9DQoNCgkJCQkJbS51cGRhdGUoKTsNCgkJCQl9KTsNCg0KCQkJCWVkLnNlbGVjdGlvbi5zZWxlY3Qod29yZFNwYW4pOw0KCQkJCXAxID0gZG9tLmdldFBvcyh3b3JkU3Bhbik7DQoJCQkJbS5zaG93TWVudShwMS54LCBwMS55ICsgd29yZFNwYW4ub2Zmc2V0SGVpZ2h0IC0gdnAueSk7DQoNCgkJCQlyZXR1cm4gdGlueW1jZS5kb20uRXZlbnQuY2FuY2VsKGUpOw0KCQkJfSBlbHNlDQoJCQkJbS5oaWRlTWVudSgpOw0KCQl9LA0KDQoJCV9jaGVja0RvbmUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgZG9tID0gZWQuZG9tLCBvOw0KDQoJCQllYWNoKGRvbS5zZWxlY3QoJ3NwYW4nKSwgZnVuY3Rpb24obikgew0KCQkJCWlmIChuICYmIGRvbS5oYXNDbGFzcyhuLCAnbWNlSXRlbUhpZGRlblNwZWxsV29yZCcpKSB7DQoJCQkJCW8gPSB0cnVlOw0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWlmICghbykNCgkJCQl0Ll9kb25lKCk7DQoJCX0sDQoNCgkJX2RvbmUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgbGEgPSB0LmFjdGl2ZTsNCg0KCQkJaWYgKHQuYWN0aXZlKSB7DQoJCQkJdC5hY3RpdmUgPSAwOw0KCQkJCXQuX3JlbW92ZVdvcmRzKCk7DQoNCgkJCQlpZiAodC5fbWVudSkNCgkJCQkJdC5fbWVudS5oaWRlTWVudSgpOw0KDQoJCQkJaWYgKGxhKQ0KCQkJCQl0LmVkaXRvci5ub2RlQ2hhbmdlZCgpOw0KCQkJfQ0KCQl9LA0KDQoJCV9zZW5kUlBDIDogZnVuY3Rpb24obSwgcCwgY2IpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJSlNPTlJlcXVlc3Quc2VuZFJQQyh7DQoJCQkJdXJsIDogdC5ycGNVcmwsDQoJCQkJbWV0aG9kIDogbSwNCgkJCQlwYXJhbXMgOiBwLA0KCQkJCXN1Y2Nlc3MgOiBjYiwNCgkJCQllcnJvciA6IGZ1bmN0aW9uKGUsIHgpIHsNCgkJCQkJdC5lZGl0b3Iuc2V0UHJvZ3Jlc3NTdGF0ZSgwKTsNCgkJCQkJdC5lZGl0b3Iud2luZG93TWFuYWdlci5hbGVydChlLmVycnN0ciB8fCAoJ0Vycm9yIHJlc3BvbnNlOiAnICsgeC5yZXNwb25zZVRleHQpKTsNCgkJCQl9DQoJCQl9KTsNCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnc3BlbGxjaGVja2VyJywgdGlueW1jZS5wbHVnaW5zLlNwZWxsY2hlY2tlclBsdWdpbik7DQp9KSgpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/spellchecker/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/spellchecker/img/wline.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhBAADAIABAPwqKv///yH5BAEAAAEALAAAAAAEAAMAAAIFRB5mGQUAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/style/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/style/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/style/css/props.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[I3RleHRfZm9udCB7d2lkdGg6MjUwcHg7fQojdGV4dF9zaXplIHt3aWR0aDo3MHB4O30KLm1jZUFkZFNlbGVjdFZhbHVlIHtiYWNrZ3JvdW5kOiNEREQ7fQpzZWxlY3QsICNibG9ja190ZXh0X2luZGVudCwgI2JveF93aWR0aCwgI2JveF9oZWlnaHQsICNib3hfcGFkZGluZ190b3AsICNib3hfcGFkZGluZ19yaWdodCwgI2JveF9wYWRkaW5nX2JvdHRvbSwgI2JveF9wYWRkaW5nX2xlZnQge3dpZHRoOjcwcHg7fQojYm94X21hcmdpbl90b3AsICNib3hfbWFyZ2luX3JpZ2h0LCAjYm94X21hcmdpbl9ib3R0b20sICNib3hfbWFyZ2luX2xlZnQsICNwb3NpdGlvbmluZ193aWR0aCwgI3Bvc2l0aW9uaW5nX2hlaWdodCwgI3Bvc2l0aW9uaW5nX3ppbmRleCB7d2lkdGg6NzBweDt9CiNwb3NpdGlvbmluZ19wbGFjZW1lbnRfdG9wLCAjcG9zaXRpb25pbmdfcGxhY2VtZW50X3JpZ2h0LCAjcG9zaXRpb25pbmdfcGxhY2VtZW50X2JvdHRvbSwgI3Bvc2l0aW9uaW5nX3BsYWNlbWVudF9sZWZ0IHt3aWR0aDo3MHB4O30KI3Bvc2l0aW9uaW5nX2NsaXBfdG9wLCAjcG9zaXRpb25pbmdfY2xpcF9yaWdodCwgI3Bvc2l0aW9uaW5nX2NsaXBfYm90dG9tLCAjcG9zaXRpb25pbmdfY2xpcF9sZWZ0IHt3aWR0aDo3MHB4O30KLnBhbmVsX3dyYXBwZXIgZGl2LmN1cnJlbnQge3BhZGRpbmctdG9wOjEwcHg7aGVpZ2h0OjIzMHB4O30KLmRlbGltIHtib3JkZXItbGVmdDoxcHggc29saWQgZ3JheTt9Ci50ZGVsaW0ge2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7fQojYmxvY2tfZGlzcGxheSB7d2lkdGg6MTQ1cHg7fQojbGlzdF90eXBlIHt3aWR0aDoxMTVweDt9Ci5kaXNhYmxlZCB7YmFja2dyb3VuZDojRUVFO30K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/style/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5TdHlsZVBsdWdpbiIse2luaXQ6ZnVuY3Rpb24oYSxiKXthLmFkZENvbW1hbmQoIm1jZVN0eWxlUHJvcHMiLGZ1bmN0aW9uKCl7YS53aW5kb3dNYW5hZ2VyLm9wZW4oe2ZpbGU6YisiL3Byb3BzLmh0bSIsd2lkdGg6NDgwK3BhcnNlSW50KGEuZ2V0TGFuZygic3R5bGUuZGVsdGFfd2lkdGgiLDApKSxoZWlnaHQ6MzIwK3BhcnNlSW50KGEuZ2V0TGFuZygic3R5bGUuZGVsdGFfaGVpZ2h0IiwwKSksaW5saW5lOjF9LHtwbHVnaW5fdXJsOmIsc3R5bGVfdGV4dDphLnNlbGVjdGlvbi5nZXROb2RlKCkuc3R5bGUuY3NzVGV4dH0pfSk7YS5hZGRDb21tYW5kKCJtY2VTZXRFbGVtZW50U3R5bGUiLGZ1bmN0aW9uKGQsYyl7aWYoZT1hLnNlbGVjdGlvbi5nZXROb2RlKCkpe2EuZG9tLnNldEF0dHJpYihlLCJzdHlsZSIsYyk7YS5leGVjQ29tbWFuZCgibWNlUmVwYWludCIpfX0pO2Eub25Ob2RlQ2hhbmdlLmFkZChmdW5jdGlvbihkLGMsZil7Yy5zZXREaXNhYmxlZCgic3R5bGVwcm9wcyIsZi5ub2RlTmFtZT09PSJCT0RZIil9KTthLmFkZEJ1dHRvbigic3R5bGVwcm9wcyIse3RpdGxlOiJzdHlsZS5kZXNjIixjbWQ6Im1jZVN0eWxlUHJvcHMifSl9LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6IlN0eWxlIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy9zdHlsZSIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fX0pO3RpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoInN0eWxlIix0aW55bWNlLnBsdWdpbnMuU3R5bGVQbHVnaW4pfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/style/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLlN0eWxlUGx1Z2luJywgew0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJLy8gUmVnaXN0ZXIgY29tbWFuZHMNCgkJCWVkLmFkZENvbW1hbmQoJ21jZVN0eWxlUHJvcHMnLCBmdW5jdGlvbigpIHsNCgkJCQllZC53aW5kb3dNYW5hZ2VyLm9wZW4oew0KCQkJCQlmaWxlIDogdXJsICsgJy9wcm9wcy5odG0nLA0KCQkJCQl3aWR0aCA6IDQ4MCArIHBhcnNlSW50KGVkLmdldExhbmcoJ3N0eWxlLmRlbHRhX3dpZHRoJywgMCkpLA0KCQkJCQloZWlnaHQgOiAzMjAgKyBwYXJzZUludChlZC5nZXRMYW5nKCdzdHlsZS5kZWx0YV9oZWlnaHQnLCAwKSksDQoJCQkJCWlubGluZSA6IDENCgkJCQl9LCB7DQoJCQkJCXBsdWdpbl91cmwgOiB1cmwsDQoJCQkJCXN0eWxlX3RleHQgOiBlZC5zZWxlY3Rpb24uZ2V0Tm9kZSgpLnN0eWxlLmNzc1RleHQNCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQllZC5hZGRDb21tYW5kKCdtY2VTZXRFbGVtZW50U3R5bGUnLCBmdW5jdGlvbih1aSwgdikgew0KCQkJCWlmIChlID0gZWQuc2VsZWN0aW9uLmdldE5vZGUoKSkgew0KCQkJCQllZC5kb20uc2V0QXR0cmliKGUsICdzdHlsZScsIHYpOw0KCQkJCQllZC5leGVjQ29tbWFuZCgnbWNlUmVwYWludCcpOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQllZC5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKGVkLCBjbSwgbikgew0KCQkJCWNtLnNldERpc2FibGVkKCdzdHlsZXByb3BzJywgbi5ub2RlTmFtZSA9PT0gJ0JPRFknKTsNCgkJCX0pOw0KDQoJCQkvLyBSZWdpc3RlciBidXR0b25zDQoJCQllZC5hZGRCdXR0b24oJ3N0eWxlcHJvcHMnLCB7dGl0bGUgOiAnc3R5bGUuZGVzYycsIGNtZCA6ICdtY2VTdHlsZVByb3BzJ30pOw0KCQl9LA0KDQoJCWdldEluZm8gOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB7DQoJCQkJbG9uZ25hbWUgOiAnU3R5bGUnLA0KCQkJCWF1dGhvciA6ICdNb3hpZWNvZGUgU3lzdGVtcyBBQicsDQoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLA0KCQkJCWluZm91cmwgOiAnaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL3N0eWxlJywNCgkJCQl2ZXJzaW9uIDogdGlueW1jZS5tYWpvclZlcnNpb24gKyAiLiIgKyB0aW55bWNlLm1pbm9yVmVyc2lvbg0KCQkJfTsNCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgnc3R5bGUnLCB0aW55bWNlLnBsdWdpbnMuU3R5bGVQbHVnaW4pOw0KfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/style/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/style/js/props.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgZGVmYXVsdEZvbnRzID0gIiIgKyANCgkiQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZj1BcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyIgKyANCgkiVGltZXMgTmV3IFJvbWFuLCBUaW1lcywgc2VyaWY9VGltZXMgTmV3IFJvbWFuLCBUaW1lcywgc2VyaWY7IiArIA0KCSJDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubz1Db3VyaWVyIE5ldywgQ291cmllciwgbW9ubzsiICsgDQoJIlRpbWVzIE5ldyBSb21hbiwgVGltZXMsIHNlcmlmPVRpbWVzIE5ldyBSb21hbiwgVGltZXMsIHNlcmlmOyIgKyANCgkiR2VvcmdpYSwgVGltZXMgTmV3IFJvbWFuLCBUaW1lcywgc2VyaWY9R2VvcmdpYSwgVGltZXMgTmV3IFJvbWFuLCBUaW1lcywgc2VyaWY7IiArIA0KCSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmPVZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IiArIA0KCSJHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY9R2VuZXZhLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIjsNCg0KdmFyIGRlZmF1bHRTaXplcyA9ICI5OzEwOzEyOzE0OzE2OzE4OzI0O3h4LXNtYWxsO3gtc21hbGw7c21hbGw7bWVkaXVtO2xhcmdlO3gtbGFyZ2U7eHgtbGFyZ2U7c21hbGxlcjtsYXJnZXIiOw0KdmFyIGRlZmF1bHRNZWFzdXJlbWVudCA9ICIrcGl4ZWxzPXB4O3BvaW50cz1wdDtpbmNoZXM9aW47Y2VudGltZXRyZXM9Y207bWlsbGltZXRyZXM9bW07cGljYXM9cGM7ZW1zPWVtO2V4cz1leDslIjsNCnZhciBkZWZhdWx0U3BhY2luZ01lYXN1cmVtZW50ID0gInBpeGVscz1weDtwb2ludHM9cHQ7aW5jaGVzPWluO2NlbnRpbWV0cmVzPWNtO21pbGxpbWV0cmVzPW1tO3BpY2FzPXBjOytlbXM9ZW07ZXhzPWV4OyUiOw0KdmFyIGRlZmF1bHRJbmRlbnRNZWFzdXJlbWVudCA9ICJwaXhlbHM9cHg7K3BvaW50cz1wdDtpbmNoZXM9aW47Y2VudGltZXRyZXM9Y207bWlsbGltZXRyZXM9bW07cGljYXM9cGM7ZW1zPWVtO2V4cz1leDslIjsNCnZhciBkZWZhdWx0V2VpZ2h0ID0gIm5vcm1hbDtib2xkO2JvbGRlcjtsaWdodGVyOzEwMDsyMDA7MzAwOzQwMDs1MDA7NjAwOzcwMDs4MDA7OTAwIjsNCnZhciBkZWZhdWx0VGV4dFN0eWxlID0gIm5vcm1hbDtpdGFsaWM7b2JsaXF1ZSI7DQp2YXIgZGVmYXVsdFZhcmlhbnQgPSAibm9ybWFsO3NtYWxsLWNhcHMiOw0KdmFyIGRlZmF1bHRMaW5lSGVpZ2h0ID0gIm5vcm1hbCI7DQp2YXIgZGVmYXVsdEF0dGFjaG1lbnQgPSAiZml4ZWQ7c2Nyb2xsIjsNCnZhciBkZWZhdWx0UmVwZWF0ID0gIm5vLXJlcGVhdDtyZXBlYXQ7cmVwZWF0LXg7cmVwZWF0LXkiOw0KdmFyIGRlZmF1bHRQb3NIID0gImxlZnQ7Y2VudGVyO3JpZ2h0IjsNCnZhciBkZWZhdWx0UG9zViA9ICJ0b3A7Y2VudGVyO2JvdHRvbSI7DQp2YXIgZGVmYXVsdFZBbGlnbiA9ICJiYXNlbGluZTtzdWI7c3VwZXI7dG9wO3RleHQtdG9wO21pZGRsZTtib3R0b207dGV4dC1ib3R0b20iOw0KdmFyIGRlZmF1bHREaXNwbGF5ID0gImlubGluZTtibG9jaztsaXN0LWl0ZW07cnVuLWluO2NvbXBhY3Q7bWFya2VyO3RhYmxlO2lubGluZS10YWJsZTt0YWJsZS1yb3ctZ3JvdXA7dGFibGUtaGVhZGVyLWdyb3VwO3RhYmxlLWZvb3Rlci1ncm91cDt0YWJsZS1yb3c7dGFibGUtY29sdW1uLWdyb3VwO3RhYmxlLWNvbHVtbjt0YWJsZS1jZWxsO3RhYmxlLWNhcHRpb247bm9uZSI7DQp2YXIgZGVmYXVsdEJvcmRlclN0eWxlID0gIm5vbmU7c29saWQ7ZGFzaGVkO2RvdHRlZDtkb3VibGU7Z3Jvb3ZlO3JpZGdlO2luc2V0O291dHNldCI7DQp2YXIgZGVmYXVsdEJvcmRlcldpZHRoID0gInRoaW47bWVkaXVtO3RoaWNrIjsNCnZhciBkZWZhdWx0TGlzdFR5cGUgPSAiZGlzYztjaXJjbGU7c3F1YXJlO2RlY2ltYWw7bG93ZXItcm9tYW47dXBwZXItcm9tYW47bG93ZXItYWxwaGE7dXBwZXItYWxwaGE7bm9uZSI7DQoNCmZ1bmN0aW9uIGluaXQoKSB7DQoJdmFyIGNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpLCBoOw0KDQoJY2Uuc3R5bGUuY3NzVGV4dCA9IHRpbnlNQ0VQb3B1cC5nZXRXaW5kb3dBcmcoJ3N0eWxlX3RleHQnKTsNCg0KCWggPSBnZXRCcm93c2VySFRNTCgnYmFja2dyb3VuZF9pbWFnZV9icm93c2VyJywnYmFja2dyb3VuZF9pbWFnZScsJ2ltYWdlJywnYWR2aW1hZ2UnKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmFja2dyb3VuZF9pbWFnZV9icm93c2VyIikuaW5uZXJIVE1MID0gaDsNCg0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXh0X2NvbG9yX3BpY2tjb250YWluZXInKS5pbm5lckhUTUwgPSBnZXRDb2xvclBpY2tlckhUTUwoJ3RleHRfY29sb3JfcGljaycsJ3RleHRfY29sb3InKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja2dyb3VuZF9jb2xvcl9waWNrY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0Q29sb3JQaWNrZXJIVE1MKCdiYWNrZ3JvdW5kX2NvbG9yX3BpY2snLCdiYWNrZ3JvdW5kX2NvbG9yJyk7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvcmRlcl9jb2xvcl90b3BfcGlja2NvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldENvbG9yUGlja2VySFRNTCgnYm9yZGVyX2NvbG9yX3RvcF9waWNrJywnYm9yZGVyX2NvbG9yX3RvcCcpOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3JkZXJfY29sb3JfcmlnaHRfcGlja2NvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldENvbG9yUGlja2VySFRNTCgnYm9yZGVyX2NvbG9yX3JpZ2h0X3BpY2snLCdib3JkZXJfY29sb3JfcmlnaHQnKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm9yZGVyX2NvbG9yX2JvdHRvbV9waWNrY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0Q29sb3JQaWNrZXJIVE1MKCdib3JkZXJfY29sb3JfYm90dG9tX3BpY2snLCdib3JkZXJfY29sb3JfYm90dG9tJyk7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvcmRlcl9jb2xvcl9sZWZ0X3BpY2tjb250YWluZXInKS5pbm5lckhUTUwgPSBnZXRDb2xvclBpY2tlckhUTUwoJ2JvcmRlcl9jb2xvcl9sZWZ0X3BpY2snLCdib3JkZXJfY29sb3JfbGVmdCcpOw0KDQoJZmlsbFNlbGVjdCgwLCAndGV4dF9mb250JywgJ3N0eWxlX2ZvbnQnLCBkZWZhdWx0Rm9udHMsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAndGV4dF9zaXplJywgJ3N0eWxlX2ZvbnRfc2l6ZScsIGRlZmF1bHRTaXplcywgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICd0ZXh0X3NpemVfbWVhc3VyZW1lbnQnLCAnc3R5bGVfZm9udF9zaXplX21lYXN1cmVtZW50JywgZGVmYXVsdE1lYXN1cmVtZW50LCAnOycsIHRydWUpOw0KCWZpbGxTZWxlY3QoMCwgJ3RleHRfY2FzZScsICdzdHlsZV90ZXh0X2Nhc2UnLCAiY2FwaXRhbGl6ZTt1cHBlcmNhc2U7bG93ZXJjYXNlIiwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICd0ZXh0X3dlaWdodCcsICdzdHlsZV9mb250X3dlaWdodCcsIGRlZmF1bHRXZWlnaHQsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAndGV4dF9zdHlsZScsICdzdHlsZV9mb250X3N0eWxlJywgZGVmYXVsdFRleHRTdHlsZSwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICd0ZXh0X3ZhcmlhbnQnLCAnc3R5bGVfZm9udF92YXJpYW50JywgZGVmYXVsdFZhcmlhbnQsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAndGV4dF9saW5laGVpZ2h0JywgJ3N0eWxlX2ZvbnRfbGluZV9oZWlnaHQnLCBkZWZhdWx0TGluZUhlaWdodCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICd0ZXh0X2xpbmVoZWlnaHRfbWVhc3VyZW1lbnQnLCAnc3R5bGVfZm9udF9saW5lX2hlaWdodF9tZWFzdXJlbWVudCcsIGRlZmF1bHRNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCg0KCWZpbGxTZWxlY3QoMCwgJ2JhY2tncm91bmRfYXR0YWNobWVudCcsICdzdHlsZV9iYWNrZ3JvdW5kX2F0dGFjaG1lbnQnLCBkZWZhdWx0QXR0YWNobWVudCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdiYWNrZ3JvdW5kX3JlcGVhdCcsICdzdHlsZV9iYWNrZ3JvdW5kX3JlcGVhdCcsIGRlZmF1bHRSZXBlYXQsICc7JywgdHJ1ZSk7DQoNCglmaWxsU2VsZWN0KDAsICdiYWNrZ3JvdW5kX2hwb3NfbWVhc3VyZW1lbnQnLCAnc3R5bGVfYmFja2dyb3VuZF9ocG9zX21lYXN1cmVtZW50JywgZGVmYXVsdE1lYXN1cmVtZW50LCAnOycsIHRydWUpOw0KCWZpbGxTZWxlY3QoMCwgJ2JhY2tncm91bmRfdnBvc19tZWFzdXJlbWVudCcsICdzdHlsZV9iYWNrZ3JvdW5kX3Zwb3NfbWVhc3VyZW1lbnQnLCBkZWZhdWx0TWVhc3VyZW1lbnQsICc7JywgdHJ1ZSk7DQoNCglmaWxsU2VsZWN0KDAsICdiYWNrZ3JvdW5kX2hwb3MnLCAnc3R5bGVfYmFja2dyb3VuZF9ocG9zJywgZGVmYXVsdFBvc0gsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYmFja2dyb3VuZF92cG9zJywgJ3N0eWxlX2JhY2tncm91bmRfdnBvcycsIGRlZmF1bHRQb3NWLCAnOycsIHRydWUpOw0KDQoJZmlsbFNlbGVjdCgwLCAnYmxvY2tfd29yZHNwYWNpbmcnLCAnc3R5bGVfd29yZHNwYWNpbmcnLCAnbm9ybWFsJywgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdibG9ja193b3Jkc3BhY2luZ19tZWFzdXJlbWVudCcsICdzdHlsZV93b3Jkc3BhY2luZ19tZWFzdXJlbWVudCcsIGRlZmF1bHRTcGFjaW5nTWVhc3VyZW1lbnQsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYmxvY2tfbGV0dGVyc3BhY2luZycsICdzdHlsZV9sZXR0ZXJzcGFjaW5nJywgJ25vcm1hbCcsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYmxvY2tfbGV0dGVyc3BhY2luZ19tZWFzdXJlbWVudCcsICdzdHlsZV9sZXR0ZXJzcGFjaW5nX21lYXN1cmVtZW50JywgZGVmYXVsdFNwYWNpbmdNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdibG9ja192ZXJ0aWNhbF9hbGlnbm1lbnQnLCAnc3R5bGVfdmVydGljYWxfYWxpZ25tZW50JywgZGVmYXVsdFZBbGlnbiwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdibG9ja190ZXh0X2FsaWduJywgJ3N0eWxlX3RleHRfYWxpZ24nLCAibGVmdDtyaWdodDtjZW50ZXI7anVzdGlmeSIsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYmxvY2tfd2hpdGVzcGFjZScsICdzdHlsZV93aGl0ZXNwYWNlJywgIm5vcm1hbDtwcmU7bm93cmFwIiwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdibG9ja19kaXNwbGF5JywgJ3N0eWxlX2Rpc3BsYXknLCBkZWZhdWx0RGlzcGxheSwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdibG9ja190ZXh0X2luZGVudF9tZWFzdXJlbWVudCcsICdzdHlsZV90ZXh0X2luZGVudF9tZWFzdXJlbWVudCcsIGRlZmF1bHRJbmRlbnRNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCg0KCWZpbGxTZWxlY3QoMCwgJ2JveF93aWR0aF9tZWFzdXJlbWVudCcsICdzdHlsZV9ib3hfd2lkdGhfbWVhc3VyZW1lbnQnLCBkZWZhdWx0TWVhc3VyZW1lbnQsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYm94X2hlaWdodF9tZWFzdXJlbWVudCcsICdzdHlsZV9ib3hfaGVpZ2h0X21lYXN1cmVtZW50JywgZGVmYXVsdE1lYXN1cmVtZW50LCAnOycsIHRydWUpOw0KCWZpbGxTZWxlY3QoMCwgJ2JveF9mbG9hdCcsICdzdHlsZV9mbG9hdCcsICdsZWZ0O3JpZ2h0O25vbmUnLCAnOycsIHRydWUpOw0KCWZpbGxTZWxlY3QoMCwgJ2JveF9jbGVhcicsICdzdHlsZV9jbGVhcicsICdsZWZ0O3JpZ2h0O2JvdGg7bm9uZScsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYm94X3BhZGRpbmdfbGVmdF9tZWFzdXJlbWVudCcsICdzdHlsZV9wYWRkaW5nX2xlZnRfbWVhc3VyZW1lbnQnLCBkZWZhdWx0TWVhc3VyZW1lbnQsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYm94X3BhZGRpbmdfdG9wX21lYXN1cmVtZW50JywgJ3N0eWxlX3BhZGRpbmdfdG9wX21lYXN1cmVtZW50JywgZGVmYXVsdE1lYXN1cmVtZW50LCAnOycsIHRydWUpOw0KCWZpbGxTZWxlY3QoMCwgJ2JveF9wYWRkaW5nX2JvdHRvbV9tZWFzdXJlbWVudCcsICdzdHlsZV9wYWRkaW5nX2JvdHRvbV9tZWFzdXJlbWVudCcsIGRlZmF1bHRNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdib3hfcGFkZGluZ19yaWdodF9tZWFzdXJlbWVudCcsICdzdHlsZV9wYWRkaW5nX3JpZ2h0X21lYXN1cmVtZW50JywgZGVmYXVsdE1lYXN1cmVtZW50LCAnOycsIHRydWUpOw0KCWZpbGxTZWxlY3QoMCwgJ2JveF9tYXJnaW5fbGVmdF9tZWFzdXJlbWVudCcsICdzdHlsZV9tYXJnaW5fbGVmdF9tZWFzdXJlbWVudCcsIGRlZmF1bHRNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdib3hfbWFyZ2luX3RvcF9tZWFzdXJlbWVudCcsICdzdHlsZV9tYXJnaW5fdG9wX21lYXN1cmVtZW50JywgZGVmYXVsdE1lYXN1cmVtZW50LCAnOycsIHRydWUpOw0KCWZpbGxTZWxlY3QoMCwgJ2JveF9tYXJnaW5fYm90dG9tX21lYXN1cmVtZW50JywgJ3N0eWxlX21hcmdpbl9ib3R0b21fbWVhc3VyZW1lbnQnLCBkZWZhdWx0TWVhc3VyZW1lbnQsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYm94X21hcmdpbl9yaWdodF9tZWFzdXJlbWVudCcsICdzdHlsZV9tYXJnaW5fcmlnaHRfbWVhc3VyZW1lbnQnLCBkZWZhdWx0TWVhc3VyZW1lbnQsICc7JywgdHJ1ZSk7DQoNCglmaWxsU2VsZWN0KDAsICdib3JkZXJfc3R5bGVfdG9wJywgJ3N0eWxlX2JvcmRlcl9zdHlsZV90b3AnLCBkZWZhdWx0Qm9yZGVyU3R5bGUsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYm9yZGVyX3N0eWxlX3JpZ2h0JywgJ3N0eWxlX2JvcmRlcl9zdHlsZV9yaWdodCcsIGRlZmF1bHRCb3JkZXJTdHlsZSwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdib3JkZXJfc3R5bGVfYm90dG9tJywgJ3N0eWxlX2JvcmRlcl9zdHlsZV9ib3R0b20nLCBkZWZhdWx0Qm9yZGVyU3R5bGUsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYm9yZGVyX3N0eWxlX2xlZnQnLCAnc3R5bGVfYm9yZGVyX3N0eWxlX2xlZnQnLCBkZWZhdWx0Qm9yZGVyU3R5bGUsICc7JywgdHJ1ZSk7DQoNCglmaWxsU2VsZWN0KDAsICdib3JkZXJfd2lkdGhfdG9wJywgJ3N0eWxlX2JvcmRlcl93aWR0aF90b3AnLCBkZWZhdWx0Qm9yZGVyV2lkdGgsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYm9yZGVyX3dpZHRoX3JpZ2h0JywgJ3N0eWxlX2JvcmRlcl93aWR0aF9yaWdodCcsIGRlZmF1bHRCb3JkZXJXaWR0aCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdib3JkZXJfd2lkdGhfYm90dG9tJywgJ3N0eWxlX2JvcmRlcl93aWR0aF9ib3R0b20nLCBkZWZhdWx0Qm9yZGVyV2lkdGgsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYm9yZGVyX3dpZHRoX2xlZnQnLCAnc3R5bGVfYm9yZGVyX3dpZHRoX2xlZnQnLCBkZWZhdWx0Qm9yZGVyV2lkdGgsICc7JywgdHJ1ZSk7DQoNCglmaWxsU2VsZWN0KDAsICdib3JkZXJfd2lkdGhfdG9wX21lYXN1cmVtZW50JywgJ3N0eWxlX2JvcmRlcl93aWR0aF90b3BfbWVhc3VyZW1lbnQnLCBkZWZhdWx0TWVhc3VyZW1lbnQsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYm9yZGVyX3dpZHRoX3JpZ2h0X21lYXN1cmVtZW50JywgJ3N0eWxlX2JvcmRlcl93aWR0aF9yaWdodF9tZWFzdXJlbWVudCcsIGRlZmF1bHRNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdib3JkZXJfd2lkdGhfYm90dG9tX21lYXN1cmVtZW50JywgJ3N0eWxlX2JvcmRlcl93aWR0aF9ib3R0b21fbWVhc3VyZW1lbnQnLCBkZWZhdWx0TWVhc3VyZW1lbnQsICc7JywgdHJ1ZSk7DQoJZmlsbFNlbGVjdCgwLCAnYm9yZGVyX3dpZHRoX2xlZnRfbWVhc3VyZW1lbnQnLCAnc3R5bGVfYm9yZGVyX3dpZHRoX2xlZnRfbWVhc3VyZW1lbnQnLCBkZWZhdWx0TWVhc3VyZW1lbnQsICc7JywgdHJ1ZSk7DQoNCglmaWxsU2VsZWN0KDAsICdsaXN0X3R5cGUnLCAnc3R5bGVfbGlzdF90eXBlJywgZGVmYXVsdExpc3RUeXBlLCAnOycsIHRydWUpOw0KCWZpbGxTZWxlY3QoMCwgJ2xpc3RfcG9zaXRpb24nLCAnc3R5bGVfbGlzdF9wb3NpdGlvbicsICJpbnNpZGU7b3V0c2lkZSIsICc7JywgdHJ1ZSk7DQoNCglmaWxsU2VsZWN0KDAsICdwb3NpdGlvbmluZ190eXBlJywgJ3N0eWxlX3Bvc2l0aW9uaW5nX3R5cGUnLCAiYWJzb2x1dGU7cmVsYXRpdmU7c3RhdGljIiwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdwb3NpdGlvbmluZ192aXNpYmlsaXR5JywgJ3N0eWxlX3Bvc2l0aW9uaW5nX3Zpc2liaWxpdHknLCAiaW5oZXJpdDt2aXNpYmxlO2hpZGRlbiIsICc7JywgdHJ1ZSk7DQoNCglmaWxsU2VsZWN0KDAsICdwb3NpdGlvbmluZ193aWR0aF9tZWFzdXJlbWVudCcsICdzdHlsZV9wb3NpdGlvbmluZ193aWR0aF9tZWFzdXJlbWVudCcsIGRlZmF1bHRNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdwb3NpdGlvbmluZ19oZWlnaHRfbWVhc3VyZW1lbnQnLCAnc3R5bGVfcG9zaXRpb25pbmdfaGVpZ2h0X21lYXN1cmVtZW50JywgZGVmYXVsdE1lYXN1cmVtZW50LCAnOycsIHRydWUpOw0KCWZpbGxTZWxlY3QoMCwgJ3Bvc2l0aW9uaW5nX292ZXJmbG93JywgJ3N0eWxlX3Bvc2l0aW9uaW5nX292ZXJmbG93JywgInZpc2libGU7aGlkZGVuO3Njcm9sbDthdXRvIiwgJzsnLCB0cnVlKTsNCg0KCWZpbGxTZWxlY3QoMCwgJ3Bvc2l0aW9uaW5nX3BsYWNlbWVudF90b3BfbWVhc3VyZW1lbnQnLCAnc3R5bGVfcG9zaXRpb25pbmdfcGxhY2VtZW50X3RvcF9tZWFzdXJlbWVudCcsIGRlZmF1bHRNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdwb3NpdGlvbmluZ19wbGFjZW1lbnRfcmlnaHRfbWVhc3VyZW1lbnQnLCAnc3R5bGVfcG9zaXRpb25pbmdfcGxhY2VtZW50X3JpZ2h0X21lYXN1cmVtZW50JywgZGVmYXVsdE1lYXN1cmVtZW50LCAnOycsIHRydWUpOw0KCWZpbGxTZWxlY3QoMCwgJ3Bvc2l0aW9uaW5nX3BsYWNlbWVudF9ib3R0b21fbWVhc3VyZW1lbnQnLCAnc3R5bGVfcG9zaXRpb25pbmdfcGxhY2VtZW50X2JvdHRvbV9tZWFzdXJlbWVudCcsIGRlZmF1bHRNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdwb3NpdGlvbmluZ19wbGFjZW1lbnRfbGVmdF9tZWFzdXJlbWVudCcsICdzdHlsZV9wb3NpdGlvbmluZ19wbGFjZW1lbnRfbGVmdF9tZWFzdXJlbWVudCcsIGRlZmF1bHRNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCg0KCWZpbGxTZWxlY3QoMCwgJ3Bvc2l0aW9uaW5nX2NsaXBfdG9wX21lYXN1cmVtZW50JywgJ3N0eWxlX3Bvc2l0aW9uaW5nX2NsaXBfdG9wX21lYXN1cmVtZW50JywgZGVmYXVsdE1lYXN1cmVtZW50LCAnOycsIHRydWUpOw0KCWZpbGxTZWxlY3QoMCwgJ3Bvc2l0aW9uaW5nX2NsaXBfcmlnaHRfbWVhc3VyZW1lbnQnLCAnc3R5bGVfcG9zaXRpb25pbmdfY2xpcF9yaWdodF9tZWFzdXJlbWVudCcsIGRlZmF1bHRNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdwb3NpdGlvbmluZ19jbGlwX2JvdHRvbV9tZWFzdXJlbWVudCcsICdzdHlsZV9wb3NpdGlvbmluZ19jbGlwX2JvdHRvbV9tZWFzdXJlbWVudCcsIGRlZmF1bHRNZWFzdXJlbWVudCwgJzsnLCB0cnVlKTsNCglmaWxsU2VsZWN0KDAsICdwb3NpdGlvbmluZ19jbGlwX2xlZnRfbWVhc3VyZW1lbnQnLCAnc3R5bGVfcG9zaXRpb25pbmdfY2xpcF9sZWZ0X21lYXN1cmVtZW50JywgZGVmYXVsdE1lYXN1cmVtZW50LCAnOycsIHRydWUpOw0KDQoJVGlueU1DRV9FZGl0YWJsZVNlbGVjdHMuaW5pdCgpOw0KCXNldHVwRm9ybURhdGEoKTsNCglzaG93RGlzYWJsZWRDb250cm9scygpOw0KfQ0KDQpmdW5jdGlvbiBzZXR1cEZvcm1EYXRhKCkgew0KCXZhciBjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKSwgZiA9IGRvY3VtZW50LmZvcm1zWzBdLCBzLCBiLCBpOw0KDQoJLy8gU2V0dXAgdGV4dCBmaWVsZHMNCg0KCXNlbGVjdEJ5VmFsdWUoZiwgJ3RleHRfZm9udCcsIGNlLnN0eWxlLmZvbnRGYW1pbHksIHRydWUsIHRydWUpOw0KCXNlbGVjdEJ5VmFsdWUoZiwgJ3RleHRfc2l6ZScsIGdldE51bShjZS5zdHlsZS5mb250U2l6ZSksIHRydWUsIHRydWUpOw0KCXNlbGVjdEJ5VmFsdWUoZiwgJ3RleHRfc2l6ZV9tZWFzdXJlbWVudCcsIGdldE1lYXN1cmVtZW50KGNlLnN0eWxlLmZvbnRTaXplKSk7DQoJc2VsZWN0QnlWYWx1ZShmLCAndGV4dF93ZWlnaHQnLCBjZS5zdHlsZS5mb250V2VpZ2h0LCB0cnVlLCB0cnVlKTsNCglzZWxlY3RCeVZhbHVlKGYsICd0ZXh0X3N0eWxlJywgY2Uuc3R5bGUuZm9udFN0eWxlLCB0cnVlLCB0cnVlKTsNCglzZWxlY3RCeVZhbHVlKGYsICd0ZXh0X2xpbmVoZWlnaHQnLCBnZXROdW0oY2Uuc3R5bGUubGluZUhlaWdodCksIHRydWUsIHRydWUpOw0KCXNlbGVjdEJ5VmFsdWUoZiwgJ3RleHRfbGluZWhlaWdodF9tZWFzdXJlbWVudCcsIGdldE1lYXN1cmVtZW50KGNlLnN0eWxlLmxpbmVIZWlnaHQpKTsNCglzZWxlY3RCeVZhbHVlKGYsICd0ZXh0X2Nhc2UnLCBjZS5zdHlsZS50ZXh0VHJhbnNmb3JtLCB0cnVlLCB0cnVlKTsNCglzZWxlY3RCeVZhbHVlKGYsICd0ZXh0X3ZhcmlhbnQnLCBjZS5zdHlsZS5mb250VmFyaWFudCwgdHJ1ZSwgdHJ1ZSk7DQoJZi50ZXh0X2NvbG9yLnZhbHVlID0gdGlueU1DRVBvcHVwLmVkaXRvci5kb20udG9IZXgoY2Uuc3R5bGUuY29sb3IpOw0KCXVwZGF0ZUNvbG9yKCd0ZXh0X2NvbG9yX3BpY2snLCAndGV4dF9jb2xvcicpOw0KCWYudGV4dF91bmRlcmxpbmUuY2hlY2tlZCA9IGluU3RyKGNlLnN0eWxlLnRleHREZWNvcmF0aW9uLCAndW5kZXJsaW5lJyk7DQoJZi50ZXh0X292ZXJsaW5lLmNoZWNrZWQgPSBpblN0cihjZS5zdHlsZS50ZXh0RGVjb3JhdGlvbiwgJ292ZXJsaW5lJyk7DQoJZi50ZXh0X2xpbmV0aHJvdWdoLmNoZWNrZWQgPSBpblN0cihjZS5zdHlsZS50ZXh0RGVjb3JhdGlvbiwgJ2xpbmUtdGhyb3VnaCcpOw0KCWYudGV4dF9ibGluay5jaGVja2VkID0gaW5TdHIoY2Uuc3R5bGUudGV4dERlY29yYXRpb24sICdibGluaycpOw0KDQoJLy8gU2V0dXAgYmFja2dyb3VuZCBmaWVsZHMNCg0KCWYuYmFja2dyb3VuZF9jb2xvci52YWx1ZSA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9tLnRvSGV4KGNlLnN0eWxlLmJhY2tncm91bmRDb2xvcik7DQoJdXBkYXRlQ29sb3IoJ2JhY2tncm91bmRfY29sb3JfcGljaycsICdiYWNrZ3JvdW5kX2NvbG9yJyk7DQoJZi5iYWNrZ3JvdW5kX2ltYWdlLnZhbHVlID0gY2Uuc3R5bGUuYmFja2dyb3VuZEltYWdlLnJlcGxhY2UobmV3IFJlZ0V4cCgidXJsXFwoJz8oW14nXSopJz9cXCkiLCAnZ2knKSwgIiQxIik7DQoJc2VsZWN0QnlWYWx1ZShmLCAnYmFja2dyb3VuZF9yZXBlYXQnLCBjZS5zdHlsZS5iYWNrZ3JvdW5kUmVwZWF0LCB0cnVlLCB0cnVlKTsNCglzZWxlY3RCeVZhbHVlKGYsICdiYWNrZ3JvdW5kX2F0dGFjaG1lbnQnLCBjZS5zdHlsZS5iYWNrZ3JvdW5kQXR0YWNobWVudCwgdHJ1ZSwgdHJ1ZSk7DQoJc2VsZWN0QnlWYWx1ZShmLCAnYmFja2dyb3VuZF9ocG9zJywgZ2V0TnVtKGdldFZhbChjZS5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24sIDApKSwgdHJ1ZSwgdHJ1ZSk7DQoJc2VsZWN0QnlWYWx1ZShmLCAnYmFja2dyb3VuZF9ocG9zX21lYXN1cmVtZW50JywgZ2V0TWVhc3VyZW1lbnQoZ2V0VmFsKGNlLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiwgMCkpKTsNCglzZWxlY3RCeVZhbHVlKGYsICdiYWNrZ3JvdW5kX3Zwb3MnLCBnZXROdW0oZ2V0VmFsKGNlLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiwgMSkpLCB0cnVlLCB0cnVlKTsNCglzZWxlY3RCeVZhbHVlKGYsICdiYWNrZ3JvdW5kX3Zwb3NfbWVhc3VyZW1lbnQnLCBnZXRNZWFzdXJlbWVudChnZXRWYWwoY2Uuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uLCAxKSkpOw0KDQoJLy8gU2V0dXAgYmxvY2sgZmllbGRzDQoNCglzZWxlY3RCeVZhbHVlKGYsICdibG9ja193b3Jkc3BhY2luZycsIGdldE51bShjZS5zdHlsZS53b3JkU3BhY2luZyksIHRydWUsIHRydWUpOw0KCXNlbGVjdEJ5VmFsdWUoZiwgJ2Jsb2NrX3dvcmRzcGFjaW5nX21lYXN1cmVtZW50JywgZ2V0TWVhc3VyZW1lbnQoY2Uuc3R5bGUud29yZFNwYWNpbmcpKTsNCglzZWxlY3RCeVZhbHVlKGYsICdibG9ja19sZXR0ZXJzcGFjaW5nJywgZ2V0TnVtKGNlLnN0eWxlLmxldHRlclNwYWNpbmcpLCB0cnVlLCB0cnVlKTsNCglzZWxlY3RCeVZhbHVlKGYsICdibG9ja19sZXR0ZXJzcGFjaW5nX21lYXN1cmVtZW50JywgZ2V0TWVhc3VyZW1lbnQoY2Uuc3R5bGUubGV0dGVyU3BhY2luZykpOw0KCXNlbGVjdEJ5VmFsdWUoZiwgJ2Jsb2NrX3ZlcnRpY2FsX2FsaWdubWVudCcsIGNlLnN0eWxlLnZlcnRpY2FsQWxpZ24sIHRydWUsIHRydWUpOw0KCXNlbGVjdEJ5VmFsdWUoZiwgJ2Jsb2NrX3RleHRfYWxpZ24nLCBjZS5zdHlsZS50ZXh0QWxpZ24sIHRydWUsIHRydWUpOw0KCWYuYmxvY2tfdGV4dF9pbmRlbnQudmFsdWUgPSBnZXROdW0oY2Uuc3R5bGUudGV4dEluZGVudCk7DQoJc2VsZWN0QnlWYWx1ZShmLCAnYmxvY2tfdGV4dF9pbmRlbnRfbWVhc3VyZW1lbnQnLCBnZXRNZWFzdXJlbWVudChjZS5zdHlsZS50ZXh0SW5kZW50KSk7DQoJc2VsZWN0QnlWYWx1ZShmLCAnYmxvY2tfd2hpdGVzcGFjZScsIGNlLnN0eWxlLndoaXRlU3BhY2UsIHRydWUsIHRydWUpOw0KCXNlbGVjdEJ5VmFsdWUoZiwgJ2Jsb2NrX2Rpc3BsYXknLCBjZS5zdHlsZS5kaXNwbGF5LCB0cnVlLCB0cnVlKTsNCg0KCS8vIFNldHVwIGJveCBmaWVsZHMNCg0KCWYuYm94X3dpZHRoLnZhbHVlID0gZ2V0TnVtKGNlLnN0eWxlLndpZHRoKTsNCglzZWxlY3RCeVZhbHVlKGYsICdib3hfd2lkdGhfbWVhc3VyZW1lbnQnLCBnZXRNZWFzdXJlbWVudChjZS5zdHlsZS53aWR0aCkpOw0KDQoJZi5ib3hfaGVpZ2h0LnZhbHVlID0gZ2V0TnVtKGNlLnN0eWxlLmhlaWdodCk7DQoJc2VsZWN0QnlWYWx1ZShmLCAnYm94X2hlaWdodF9tZWFzdXJlbWVudCcsIGdldE1lYXN1cmVtZW50KGNlLnN0eWxlLmhlaWdodCkpOw0KDQoJaWYgKHRpbnltY2UuaXNHZWNrbykNCgkJc2VsZWN0QnlWYWx1ZShmLCAnYm94X2Zsb2F0JywgY2Uuc3R5bGUuY3NzRmxvYXQsIHRydWUsIHRydWUpOw0KCWVsc2UNCgkJc2VsZWN0QnlWYWx1ZShmLCAnYm94X2Zsb2F0JywgY2Uuc3R5bGUuc3R5bGVGbG9hdCwgdHJ1ZSwgdHJ1ZSk7DQoNCglzZWxlY3RCeVZhbHVlKGYsICdib3hfY2xlYXInLCBjZS5zdHlsZS5jbGVhciwgdHJ1ZSwgdHJ1ZSk7DQoNCglzZXR1cEJveChmLCBjZSwgJ2JveF9wYWRkaW5nJywgJ3BhZGRpbmcnLCAnJyk7DQoJc2V0dXBCb3goZiwgY2UsICdib3hfbWFyZ2luJywgJ21hcmdpbicsICcnKTsNCg0KCS8vIFNldHVwIGJvcmRlciBmaWVsZHMNCg0KCXNldHVwQm94KGYsIGNlLCAnYm9yZGVyX3N0eWxlJywgJ2JvcmRlcicsICdTdHlsZScpOw0KCXNldHVwQm94KGYsIGNlLCAnYm9yZGVyX3dpZHRoJywgJ2JvcmRlcicsICdXaWR0aCcpOw0KCXNldHVwQm94KGYsIGNlLCAnYm9yZGVyX2NvbG9yJywgJ2JvcmRlcicsICdDb2xvcicpOw0KDQoJdXBkYXRlQ29sb3IoJ2JvcmRlcl9jb2xvcl90b3BfcGljaycsICdib3JkZXJfY29sb3JfdG9wJyk7DQoJdXBkYXRlQ29sb3IoJ2JvcmRlcl9jb2xvcl9yaWdodF9waWNrJywgJ2JvcmRlcl9jb2xvcl9yaWdodCcpOw0KCXVwZGF0ZUNvbG9yKCdib3JkZXJfY29sb3JfYm90dG9tX3BpY2snLCAnYm9yZGVyX2NvbG9yX2JvdHRvbScpOw0KCXVwZGF0ZUNvbG9yKCdib3JkZXJfY29sb3JfbGVmdF9waWNrJywgJ2JvcmRlcl9jb2xvcl9sZWZ0Jyk7DQoNCglmLmVsZW1lbnRzLmJvcmRlcl9jb2xvcl90b3AudmFsdWUgPSB0aW55TUNFUG9wdXAuZWRpdG9yLmRvbS50b0hleChmLmVsZW1lbnRzLmJvcmRlcl9jb2xvcl90b3AudmFsdWUpOw0KCWYuZWxlbWVudHMuYm9yZGVyX2NvbG9yX3JpZ2h0LnZhbHVlID0gdGlueU1DRVBvcHVwLmVkaXRvci5kb20udG9IZXgoZi5lbGVtZW50cy5ib3JkZXJfY29sb3JfcmlnaHQudmFsdWUpOw0KCWYuZWxlbWVudHMuYm9yZGVyX2NvbG9yX2JvdHRvbS52YWx1ZSA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9tLnRvSGV4KGYuZWxlbWVudHMuYm9yZGVyX2NvbG9yX2JvdHRvbS52YWx1ZSk7DQoJZi5lbGVtZW50cy5ib3JkZXJfY29sb3JfbGVmdC52YWx1ZSA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9tLnRvSGV4KGYuZWxlbWVudHMuYm9yZGVyX2NvbG9yX2xlZnQudmFsdWUpOw0KDQoJLy8gU2V0dXAgbGlzdCBmaWVsZHMNCg0KCXNlbGVjdEJ5VmFsdWUoZiwgJ2xpc3RfdHlwZScsIGNlLnN0eWxlLmxpc3RTdHlsZVR5cGUsIHRydWUsIHRydWUpOw0KCXNlbGVjdEJ5VmFsdWUoZiwgJ2xpc3RfcG9zaXRpb24nLCBjZS5zdHlsZS5saXN0U3R5bGVQb3NpdGlvbiwgdHJ1ZSwgdHJ1ZSk7DQoJZi5saXN0X2J1bGxldF9pbWFnZS52YWx1ZSA9IGNlLnN0eWxlLmxpc3RTdHlsZUltYWdlLnJlcGxhY2UobmV3IFJlZ0V4cCgidXJsXFwoJz8oW14nXSopJz9cXCkiLCAnZ2knKSwgIiQxIik7DQoNCgkvLyBTZXR1cCBib3ggZmllbGRzDQoNCglzZWxlY3RCeVZhbHVlKGYsICdwb3NpdGlvbmluZ190eXBlJywgY2Uuc3R5bGUucG9zaXRpb24sIHRydWUsIHRydWUpOw0KCXNlbGVjdEJ5VmFsdWUoZiwgJ3Bvc2l0aW9uaW5nX3Zpc2liaWxpdHknLCBjZS5zdHlsZS52aXNpYmlsaXR5LCB0cnVlLCB0cnVlKTsNCglzZWxlY3RCeVZhbHVlKGYsICdwb3NpdGlvbmluZ19vdmVyZmxvdycsIGNlLnN0eWxlLm92ZXJmbG93LCB0cnVlLCB0cnVlKTsNCglmLnBvc2l0aW9uaW5nX3ppbmRleC52YWx1ZSA9IGNlLnN0eWxlLnpJbmRleCA/IGNlLnN0eWxlLnpJbmRleCA6ICIiOw0KDQoJZi5wb3NpdGlvbmluZ193aWR0aC52YWx1ZSA9IGdldE51bShjZS5zdHlsZS53aWR0aCk7DQoJc2VsZWN0QnlWYWx1ZShmLCAncG9zaXRpb25pbmdfd2lkdGhfbWVhc3VyZW1lbnQnLCBnZXRNZWFzdXJlbWVudChjZS5zdHlsZS53aWR0aCkpOw0KDQoJZi5wb3NpdGlvbmluZ19oZWlnaHQudmFsdWUgPSBnZXROdW0oY2Uuc3R5bGUuaGVpZ2h0KTsNCglzZWxlY3RCeVZhbHVlKGYsICdwb3NpdGlvbmluZ19oZWlnaHRfbWVhc3VyZW1lbnQnLCBnZXRNZWFzdXJlbWVudChjZS5zdHlsZS5oZWlnaHQpKTsNCg0KCXNldHVwQm94KGYsIGNlLCAncG9zaXRpb25pbmdfcGxhY2VtZW50JywgJycsICcnLCBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddKTsNCg0KCXMgPSBjZS5zdHlsZS5jbGlwLnJlcGxhY2UobmV3IFJlZ0V4cCgicmVjdFxcKCc/KFteJ10qKSc/XFwpIiwgJ2dpJyksICIkMSIpOw0KCXMgPSBzLnJlcGxhY2UoLywvZywgJyAnKTsNCg0KCWlmICghaGFzRXF1YWxWYWx1ZXMoW2dldFZhbChzLCAwKSwgZ2V0VmFsKHMsIDEpLCBnZXRWYWwocywgMiksIGdldFZhbChzLCAzKV0pKSB7DQoJCWYucG9zaXRpb25pbmdfY2xpcF90b3AudmFsdWUgPSBnZXROdW0oZ2V0VmFsKHMsIDApKTsNCgkJc2VsZWN0QnlWYWx1ZShmLCAncG9zaXRpb25pbmdfY2xpcF90b3BfbWVhc3VyZW1lbnQnLCBnZXRNZWFzdXJlbWVudChnZXRWYWwocywgMCkpKTsNCgkJZi5wb3NpdGlvbmluZ19jbGlwX3JpZ2h0LnZhbHVlID0gZ2V0TnVtKGdldFZhbChzLCAxKSk7DQoJCXNlbGVjdEJ5VmFsdWUoZiwgJ3Bvc2l0aW9uaW5nX2NsaXBfcmlnaHRfbWVhc3VyZW1lbnQnLCBnZXRNZWFzdXJlbWVudChnZXRWYWwocywgMSkpKTsNCgkJZi5wb3NpdGlvbmluZ19jbGlwX2JvdHRvbS52YWx1ZSA9IGdldE51bShnZXRWYWwocywgMikpOw0KCQlzZWxlY3RCeVZhbHVlKGYsICdwb3NpdGlvbmluZ19jbGlwX2JvdHRvbV9tZWFzdXJlbWVudCcsIGdldE1lYXN1cmVtZW50KGdldFZhbChzLCAyKSkpOw0KCQlmLnBvc2l0aW9uaW5nX2NsaXBfbGVmdC52YWx1ZSA9IGdldE51bShnZXRWYWwocywgMykpOw0KCQlzZWxlY3RCeVZhbHVlKGYsICdwb3NpdGlvbmluZ19jbGlwX2xlZnRfbWVhc3VyZW1lbnQnLCBnZXRNZWFzdXJlbWVudChnZXRWYWwocywgMykpKTsNCgl9IGVsc2Ugew0KCQlmLnBvc2l0aW9uaW5nX2NsaXBfdG9wLnZhbHVlID0gZ2V0TnVtKGdldFZhbChzLCAwKSk7DQoJCXNlbGVjdEJ5VmFsdWUoZiwgJ3Bvc2l0aW9uaW5nX2NsaXBfdG9wX21lYXN1cmVtZW50JywgZ2V0TWVhc3VyZW1lbnQoZ2V0VmFsKHMsIDApKSk7DQoJCWYucG9zaXRpb25pbmdfY2xpcF9yaWdodC52YWx1ZSA9IGYucG9zaXRpb25pbmdfY2xpcF9ib3R0b20udmFsdWUgPSBmLnBvc2l0aW9uaW5nX2NsaXBfbGVmdC52YWx1ZTsNCgl9DQoNCi8vCXNldHVwQm94KGYsIGNlLCAnJywgJ2JvcmRlcicsICdDb2xvcicpOw0KfQ0KDQpmdW5jdGlvbiBnZXRNZWFzdXJlbWVudChzKSB7DQoJcmV0dXJuIHMucmVwbGFjZSgvXihbMC05Ll0rKSguKikkLywgIiQyIik7DQp9DQoNCmZ1bmN0aW9uIGdldE51bShzKSB7DQoJaWYgKG5ldyBSZWdFeHAoJ14oPzpbMC05Ll0rKSg/OlthLXolXSspJCcsICdnaScpLnRlc3QocykpDQoJCXJldHVybiBzLnJlcGxhY2UoL1teMC05Ll0vZywgJycpOw0KDQoJcmV0dXJuIHM7DQp9DQoNCmZ1bmN0aW9uIGluU3RyKHMsIG4pIHsNCglyZXR1cm4gbmV3IFJlZ0V4cChuLCAnZ2knKS50ZXN0KHMpOw0KfQ0KDQpmdW5jdGlvbiBnZXRWYWwocywgaSkgew0KCXZhciBhID0gcy5zcGxpdCgnICcpOw0KDQoJaWYgKGEubGVuZ3RoID4gMSkNCgkJcmV0dXJuIGFbaV07DQoNCglyZXR1cm4gIiI7DQp9DQoNCmZ1bmN0aW9uIHNldFZhbHVlKGYsIG4sIHYpIHsNCglpZiAoZi5lbGVtZW50c1tuXS50eXBlID09ICJ0ZXh0IikNCgkJZi5lbGVtZW50c1tuXS52YWx1ZSA9IHY7DQoJZWxzZQ0KCQlzZWxlY3RCeVZhbHVlKGYsIG4sIHYsIHRydWUsIHRydWUpOw0KfQ0KDQpmdW5jdGlvbiBzZXR1cEJveChmLCBjZSwgZnAsIHByLCBzZiwgYikgew0KCWlmICh0eXBlb2YoYikgPT0gInVuZGVmaW5lZCIpDQoJCWIgPSBbJ1RvcCcsICdSaWdodCcsICdCb3R0b20nLCAnTGVmdCddOw0KDQoJaWYgKGlzU2FtZShjZSwgcHIsIHNmLCBiKSkgew0KCQlmLmVsZW1lbnRzW2ZwICsgIl9zYW1lIl0uY2hlY2tlZCA9IHRydWU7DQoNCgkJc2V0VmFsdWUoZiwgZnAgKyAiX3RvcCIsIGdldE51bShjZS5zdHlsZVtwciArIGJbMF0gKyBzZl0pKTsNCgkJZi5lbGVtZW50c1tmcCArICJfdG9wIl0uZGlzYWJsZWQgPSBmYWxzZTsNCg0KCQlmLmVsZW1lbnRzW2ZwICsgIl9yaWdodCJdLnZhbHVlID0gIiI7DQoJCWYuZWxlbWVudHNbZnAgKyAiX3JpZ2h0Il0uZGlzYWJsZWQgPSB0cnVlOw0KCQlmLmVsZW1lbnRzW2ZwICsgIl9ib3R0b20iXS52YWx1ZSA9ICIiOw0KCQlmLmVsZW1lbnRzW2ZwICsgIl9ib3R0b20iXS5kaXNhYmxlZCA9IHRydWU7DQoJCWYuZWxlbWVudHNbZnAgKyAiX2xlZnQiXS52YWx1ZSA9ICIiOw0KCQlmLmVsZW1lbnRzW2ZwICsgIl9sZWZ0Il0uZGlzYWJsZWQgPSB0cnVlOw0KDQoJCWlmIChmLmVsZW1lbnRzW2ZwICsgIl90b3BfbWVhc3VyZW1lbnQiXSkgew0KCQkJc2VsZWN0QnlWYWx1ZShmLCBmcCArICdfdG9wX21lYXN1cmVtZW50JywgZ2V0TWVhc3VyZW1lbnQoY2Uuc3R5bGVbcHIgKyBiWzBdICsgc2ZdKSk7DQoJCQlmLmVsZW1lbnRzW2ZwICsgIl9sZWZ0X21lYXN1cmVtZW50Il0uZGlzYWJsZWQgPSB0cnVlOw0KCQkJZi5lbGVtZW50c1tmcCArICJfYm90dG9tX21lYXN1cmVtZW50Il0uZGlzYWJsZWQgPSB0cnVlOw0KCQkJZi5lbGVtZW50c1tmcCArICJfcmlnaHRfbWVhc3VyZW1lbnQiXS5kaXNhYmxlZCA9IHRydWU7DQoJCX0NCgl9IGVsc2Ugew0KCQlmLmVsZW1lbnRzW2ZwICsgIl9zYW1lIl0uY2hlY2tlZCA9IGZhbHNlOw0KDQoJCXNldFZhbHVlKGYsIGZwICsgIl90b3AiLCBnZXROdW0oY2Uuc3R5bGVbcHIgKyBiWzBdICsgc2ZdKSk7DQoJCWYuZWxlbWVudHNbZnAgKyAiX3RvcCJdLmRpc2FibGVkID0gZmFsc2U7DQoNCgkJc2V0VmFsdWUoZiwgZnAgKyAiX3JpZ2h0IiwgZ2V0TnVtKGNlLnN0eWxlW3ByICsgYlsxXSArIHNmXSkpOw0KCQlmLmVsZW1lbnRzW2ZwICsgIl9yaWdodCJdLmRpc2FibGVkID0gZmFsc2U7DQoNCgkJc2V0VmFsdWUoZiwgZnAgKyAiX2JvdHRvbSIsIGdldE51bShjZS5zdHlsZVtwciArIGJbMl0gKyBzZl0pKTsNCgkJZi5lbGVtZW50c1tmcCArICJfYm90dG9tIl0uZGlzYWJsZWQgPSBmYWxzZTsNCg0KCQlzZXRWYWx1ZShmLCBmcCArICJfbGVmdCIsIGdldE51bShjZS5zdHlsZVtwciArIGJbM10gKyBzZl0pKTsNCgkJZi5lbGVtZW50c1tmcCArICJfbGVmdCJdLmRpc2FibGVkID0gZmFsc2U7DQoNCgkJaWYgKGYuZWxlbWVudHNbZnAgKyAiX3RvcF9tZWFzdXJlbWVudCJdKSB7DQoJCQlzZWxlY3RCeVZhbHVlKGYsIGZwICsgJ190b3BfbWVhc3VyZW1lbnQnLCBnZXRNZWFzdXJlbWVudChjZS5zdHlsZVtwciArIGJbMF0gKyBzZl0pKTsNCgkJCXNlbGVjdEJ5VmFsdWUoZiwgZnAgKyAnX3JpZ2h0X21lYXN1cmVtZW50JywgZ2V0TWVhc3VyZW1lbnQoY2Uuc3R5bGVbcHIgKyBiWzFdICsgc2ZdKSk7DQoJCQlzZWxlY3RCeVZhbHVlKGYsIGZwICsgJ19ib3R0b21fbWVhc3VyZW1lbnQnLCBnZXRNZWFzdXJlbWVudChjZS5zdHlsZVtwciArIGJbMl0gKyBzZl0pKTsNCgkJCXNlbGVjdEJ5VmFsdWUoZiwgZnAgKyAnX2xlZnRfbWVhc3VyZW1lbnQnLCBnZXRNZWFzdXJlbWVudChjZS5zdHlsZVtwciArIGJbM10gKyBzZl0pKTsNCgkJCWYuZWxlbWVudHNbZnAgKyAiX2xlZnRfbWVhc3VyZW1lbnQiXS5kaXNhYmxlZCA9IGZhbHNlOw0KCQkJZi5lbGVtZW50c1tmcCArICJfYm90dG9tX21lYXN1cmVtZW50Il0uZGlzYWJsZWQgPSBmYWxzZTsNCgkJCWYuZWxlbWVudHNbZnAgKyAiX3JpZ2h0X21lYXN1cmVtZW50Il0uZGlzYWJsZWQgPSBmYWxzZTsNCgkJfQ0KCX0NCn0NCg0KZnVuY3Rpb24gaXNTYW1lKGUsIHByLCBzZiwgYikgew0KCXZhciBhID0gW10sIGksIHg7DQoNCglpZiAodHlwZW9mKGIpID09ICJ1bmRlZmluZWQiKQ0KCQliID0gWydUb3AnLCAnUmlnaHQnLCAnQm90dG9tJywgJ0xlZnQnXTsNCg0KCWlmICh0eXBlb2Yoc2YpID09ICJ1bmRlZmluZWQiIHx8IHNmID09IG51bGwpDQoJCXNmID0gIiI7DQoNCglhWzBdID0gZS5zdHlsZVtwciArIGJbMF0gKyBzZl07DQoJYVsxXSA9IGUuc3R5bGVbcHIgKyBiWzFdICsgc2ZdOw0KCWFbMl0gPSBlLnN0eWxlW3ByICsgYlsyXSArIHNmXTsNCglhWzNdID0gZS5zdHlsZVtwciArIGJbM10gKyBzZl07DQoNCglmb3IgKGk9MDsgaTxhLmxlbmd0aDsgaSsrKSB7DQoJCWlmIChhW2ldID09IG51bGwpDQoJCQlyZXR1cm4gZmFsc2U7DQoNCgkJZm9yICh4PTA7IHg8YS5sZW5ndGg7IHgrKykgew0KCQkJaWYgKGFbeF0gIT0gYVtpXSkNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoNCglyZXR1cm4gdHJ1ZTsNCn07DQoNCmZ1bmN0aW9uIGhhc0VxdWFsVmFsdWVzKGEpIHsNCgl2YXIgaSwgeDsNCg0KCWZvciAoaT0wOyBpPGEubGVuZ3RoOyBpKyspIHsNCgkJaWYgKGFbaV0gPT0gbnVsbCkNCgkJCXJldHVybiBmYWxzZTsNCg0KCQlmb3IgKHg9MDsgeDxhLmxlbmd0aDsgeCsrKSB7DQoJCQlpZiAoYVt4XSAhPSBhW2ldKQ0KCQkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCg0KCXJldHVybiB0cnVlOw0KfQ0KDQpmdW5jdGlvbiBhcHBseUFjdGlvbigpIHsNCgl2YXIgY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJyksIGVkID0gdGlueU1DRVBvcHVwLmVkaXRvcjsNCg0KCWdlbmVyYXRlQ1NTKCk7DQoNCgl0aW55TUNFUG9wdXAucmVzdG9yZVNlbGVjdGlvbigpOw0KCWVkLmRvbS5zZXRBdHRyaWIoZWQuc2VsZWN0aW9uLmdldE5vZGUoKSwgJ3N0eWxlJywgdGlueU1DRVBvcHVwLmVkaXRvci5kb20uc2VyaWFsaXplU3R5bGUodGlueU1DRVBvcHVwLmVkaXRvci5kb20ucGFyc2VTdHlsZShjZS5zdHlsZS5jc3NUZXh0KSkpOw0KfQ0KDQpmdW5jdGlvbiB1cGRhdGVBY3Rpb24oKSB7DQoJYXBwbHlBY3Rpb24oKTsNCgl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCn0NCg0KZnVuY3Rpb24gZ2VuZXJhdGVDU1MoKSB7DQoJdmFyIGNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpLCBmID0gZG9jdW1lbnQuZm9ybXNbMF0sIG51bSA9IG5ldyBSZWdFeHAoJ1swLTldKycsICdnJyksIHMsIHQ7DQoNCgljZS5zdHlsZS5jc3NUZXh0ID0gIiI7DQoNCgkvLyBCdWlsZCB0ZXh0IHN0eWxlcw0KCWNlLnN0eWxlLmZvbnRGYW1pbHkgPSBmLnRleHRfZm9udC52YWx1ZTsNCgljZS5zdHlsZS5mb250U2l6ZSA9IGYudGV4dF9zaXplLnZhbHVlICsgKGlzTnVtKGYudGV4dF9zaXplLnZhbHVlKSA/IChmLnRleHRfc2l6ZV9tZWFzdXJlbWVudC52YWx1ZSB8fCAncHgnKSA6ICIiKTsNCgljZS5zdHlsZS5mb250U3R5bGUgPSBmLnRleHRfc3R5bGUudmFsdWU7DQoJY2Uuc3R5bGUubGluZUhlaWdodCA9IGYudGV4dF9saW5laGVpZ2h0LnZhbHVlICsgKGlzTnVtKGYudGV4dF9saW5laGVpZ2h0LnZhbHVlKSA/IGYudGV4dF9saW5laGVpZ2h0X21lYXN1cmVtZW50LnZhbHVlIDogIiIpOw0KCWNlLnN0eWxlLnRleHRUcmFuc2Zvcm0gPSBmLnRleHRfY2FzZS52YWx1ZTsNCgljZS5zdHlsZS5mb250V2VpZ2h0ID0gZi50ZXh0X3dlaWdodC52YWx1ZTsNCgljZS5zdHlsZS5mb250VmFyaWFudCA9IGYudGV4dF92YXJpYW50LnZhbHVlOw0KCWNlLnN0eWxlLmNvbG9yID0gZi50ZXh0X2NvbG9yLnZhbHVlOw0KDQoJcyA9ICIiOw0KCXMgKz0gZi50ZXh0X3VuZGVybGluZS5jaGVja2VkID8gIiB1bmRlcmxpbmUiIDogIiI7DQoJcyArPSBmLnRleHRfb3ZlcmxpbmUuY2hlY2tlZCA/ICIgb3ZlcmxpbmUiIDogIiI7DQoJcyArPSBmLnRleHRfbGluZXRocm91Z2guY2hlY2tlZCA/ICIgbGluZS10aHJvdWdoIiA6ICIiOw0KCXMgKz0gZi50ZXh0X2JsaW5rLmNoZWNrZWQgPyAiIGJsaW5rIiA6ICIiOw0KCXMgPSBzLmxlbmd0aCA+IDAgPyBzLnN1YnN0cmluZygxKSA6IHM7DQoNCglpZiAoZi50ZXh0X25vbmUuY2hlY2tlZCkNCgkJcyA9ICJub25lIjsNCg0KCWNlLnN0eWxlLnRleHREZWNvcmF0aW9uID0gczsNCg0KCS8vIEJ1aWxkIGJhY2tncm91bmQgc3R5bGVzDQoNCgljZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBmLmJhY2tncm91bmRfY29sb3IudmFsdWU7DQoJY2Uuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gZi5iYWNrZ3JvdW5kX2ltYWdlLnZhbHVlICE9ICIiID8gInVybCgiICsgZi5iYWNrZ3JvdW5kX2ltYWdlLnZhbHVlICsgIikiIDogIiI7DQoJY2Uuc3R5bGUuYmFja2dyb3VuZFJlcGVhdCA9IGYuYmFja2dyb3VuZF9yZXBlYXQudmFsdWU7DQoJY2Uuc3R5bGUuYmFja2dyb3VuZEF0dGFjaG1lbnQgPSBmLmJhY2tncm91bmRfYXR0YWNobWVudC52YWx1ZTsNCg0KCWlmIChmLmJhY2tncm91bmRfaHBvcy52YWx1ZSAhPSAiIikgew0KCQlzID0gIiI7DQoJCXMgKz0gZi5iYWNrZ3JvdW5kX2hwb3MudmFsdWUgKyAoaXNOdW0oZi5iYWNrZ3JvdW5kX2hwb3MudmFsdWUpID8gZi5iYWNrZ3JvdW5kX2hwb3NfbWVhc3VyZW1lbnQudmFsdWUgOiAiIikgKyAiICI7DQoJCXMgKz0gZi5iYWNrZ3JvdW5kX3Zwb3MudmFsdWUgKyAoaXNOdW0oZi5iYWNrZ3JvdW5kX3Zwb3MudmFsdWUpID8gZi5iYWNrZ3JvdW5kX3Zwb3NfbWVhc3VyZW1lbnQudmFsdWUgOiAiIik7DQoJCWNlLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9IHM7DQoJfQ0KDQoJLy8gQnVpbGQgYmxvY2sgc3R5bGVzDQoNCgljZS5zdHlsZS53b3JkU3BhY2luZyA9IGYuYmxvY2tfd29yZHNwYWNpbmcudmFsdWUgKyAoaXNOdW0oZi5ibG9ja193b3Jkc3BhY2luZy52YWx1ZSkgPyBmLmJsb2NrX3dvcmRzcGFjaW5nX21lYXN1cmVtZW50LnZhbHVlIDogIiIpOw0KCWNlLnN0eWxlLmxldHRlclNwYWNpbmcgPSBmLmJsb2NrX2xldHRlcnNwYWNpbmcudmFsdWUgKyAoaXNOdW0oZi5ibG9ja19sZXR0ZXJzcGFjaW5nLnZhbHVlKSA/IGYuYmxvY2tfbGV0dGVyc3BhY2luZ19tZWFzdXJlbWVudC52YWx1ZSA6ICIiKTsNCgljZS5zdHlsZS52ZXJ0aWNhbEFsaWduID0gZi5ibG9ja192ZXJ0aWNhbF9hbGlnbm1lbnQudmFsdWU7DQoJY2Uuc3R5bGUudGV4dEFsaWduID0gZi5ibG9ja190ZXh0X2FsaWduLnZhbHVlOw0KCWNlLnN0eWxlLnRleHRJbmRlbnQgPSBmLmJsb2NrX3RleHRfaW5kZW50LnZhbHVlICsgKGlzTnVtKGYuYmxvY2tfdGV4dF9pbmRlbnQudmFsdWUpID8gZi5ibG9ja190ZXh0X2luZGVudF9tZWFzdXJlbWVudC52YWx1ZSA6ICIiKTsNCgljZS5zdHlsZS53aGl0ZVNwYWNlID0gZi5ibG9ja193aGl0ZXNwYWNlLnZhbHVlOw0KCWNlLnN0eWxlLmRpc3BsYXkgPSBmLmJsb2NrX2Rpc3BsYXkudmFsdWU7DQoNCgkvLyBCdWlsZCBib3ggc3R5bGVzDQoNCgljZS5zdHlsZS53aWR0aCA9IGYuYm94X3dpZHRoLnZhbHVlICsgKGlzTnVtKGYuYm94X3dpZHRoLnZhbHVlKSA/IGYuYm94X3dpZHRoX21lYXN1cmVtZW50LnZhbHVlIDogIiIpOw0KCWNlLnN0eWxlLmhlaWdodCA9IGYuYm94X2hlaWdodC52YWx1ZSArIChpc051bShmLmJveF9oZWlnaHQudmFsdWUpID8gZi5ib3hfaGVpZ2h0X21lYXN1cmVtZW50LnZhbHVlIDogIiIpOw0KCWNlLnN0eWxlLnN0eWxlRmxvYXQgPSBmLmJveF9mbG9hdC52YWx1ZTsNCg0KCWlmICh0aW55bWNlLmlzR2Vja28pDQoJCWNlLnN0eWxlLmNzc0Zsb2F0ID0gZi5ib3hfZmxvYXQudmFsdWU7DQoNCgljZS5zdHlsZS5jbGVhciA9IGYuYm94X2NsZWFyLnZhbHVlOw0KDQoJaWYgKCFmLmJveF9wYWRkaW5nX3NhbWUuY2hlY2tlZCkgew0KCQljZS5zdHlsZS5wYWRkaW5nVG9wID0gZi5ib3hfcGFkZGluZ190b3AudmFsdWUgKyAoaXNOdW0oZi5ib3hfcGFkZGluZ190b3AudmFsdWUpID8gZi5ib3hfcGFkZGluZ190b3BfbWVhc3VyZW1lbnQudmFsdWUgOiAiIik7DQoJCWNlLnN0eWxlLnBhZGRpbmdSaWdodCA9IGYuYm94X3BhZGRpbmdfcmlnaHQudmFsdWUgKyAoaXNOdW0oZi5ib3hfcGFkZGluZ19yaWdodC52YWx1ZSkgPyBmLmJveF9wYWRkaW5nX3JpZ2h0X21lYXN1cmVtZW50LnZhbHVlIDogIiIpOw0KCQljZS5zdHlsZS5wYWRkaW5nQm90dG9tID0gZi5ib3hfcGFkZGluZ19ib3R0b20udmFsdWUgKyAoaXNOdW0oZi5ib3hfcGFkZGluZ19ib3R0b20udmFsdWUpID8gZi5ib3hfcGFkZGluZ19ib3R0b21fbWVhc3VyZW1lbnQudmFsdWUgOiAiIik7DQoJCWNlLnN0eWxlLnBhZGRpbmdMZWZ0ID0gZi5ib3hfcGFkZGluZ19sZWZ0LnZhbHVlICsgKGlzTnVtKGYuYm94X3BhZGRpbmdfbGVmdC52YWx1ZSkgPyBmLmJveF9wYWRkaW5nX2xlZnRfbWVhc3VyZW1lbnQudmFsdWUgOiAiIik7DQoJfSBlbHNlDQoJCWNlLnN0eWxlLnBhZGRpbmcgPSBmLmJveF9wYWRkaW5nX3RvcC52YWx1ZSArIChpc051bShmLmJveF9wYWRkaW5nX3RvcC52YWx1ZSkgPyBmLmJveF9wYWRkaW5nX3RvcF9tZWFzdXJlbWVudC52YWx1ZSA6ICIiKTsJCQ0KDQoJaWYgKCFmLmJveF9tYXJnaW5fc2FtZS5jaGVja2VkKSB7DQoJCWNlLnN0eWxlLm1hcmdpblRvcCA9IGYuYm94X21hcmdpbl90b3AudmFsdWUgKyAoaXNOdW0oZi5ib3hfbWFyZ2luX3RvcC52YWx1ZSkgPyBmLmJveF9tYXJnaW5fdG9wX21lYXN1cmVtZW50LnZhbHVlIDogIiIpOw0KCQljZS5zdHlsZS5tYXJnaW5SaWdodCA9IGYuYm94X21hcmdpbl9yaWdodC52YWx1ZSArIChpc051bShmLmJveF9tYXJnaW5fcmlnaHQudmFsdWUpID8gZi5ib3hfbWFyZ2luX3JpZ2h0X21lYXN1cmVtZW50LnZhbHVlIDogIiIpOw0KCQljZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSBmLmJveF9tYXJnaW5fYm90dG9tLnZhbHVlICsgKGlzTnVtKGYuYm94X21hcmdpbl9ib3R0b20udmFsdWUpID8gZi5ib3hfbWFyZ2luX2JvdHRvbV9tZWFzdXJlbWVudC52YWx1ZSA6ICIiKTsNCgkJY2Uuc3R5bGUubWFyZ2luTGVmdCA9IGYuYm94X21hcmdpbl9sZWZ0LnZhbHVlICsgKGlzTnVtKGYuYm94X21hcmdpbl9sZWZ0LnZhbHVlKSA/IGYuYm94X21hcmdpbl9sZWZ0X21lYXN1cmVtZW50LnZhbHVlIDogIiIpOw0KCX0gZWxzZQ0KCQljZS5zdHlsZS5tYXJnaW4gPSBmLmJveF9tYXJnaW5fdG9wLnZhbHVlICsgKGlzTnVtKGYuYm94X21hcmdpbl90b3AudmFsdWUpID8gZi5ib3hfbWFyZ2luX3RvcF9tZWFzdXJlbWVudC52YWx1ZSA6ICIiKTsJCQ0KDQoJLy8gQnVpbGQgYm9yZGVyIHN0eWxlcw0KDQoJaWYgKCFmLmJvcmRlcl9zdHlsZV9zYW1lLmNoZWNrZWQpIHsNCgkJY2Uuc3R5bGUuYm9yZGVyVG9wU3R5bGUgPSBmLmJvcmRlcl9zdHlsZV90b3AudmFsdWU7DQoJCWNlLnN0eWxlLmJvcmRlclJpZ2h0U3R5bGUgPSBmLmJvcmRlcl9zdHlsZV9yaWdodC52YWx1ZTsNCgkJY2Uuc3R5bGUuYm9yZGVyQm90dG9tU3R5bGUgPSBmLmJvcmRlcl9zdHlsZV9ib3R0b20udmFsdWU7DQoJCWNlLnN0eWxlLmJvcmRlckxlZnRTdHlsZSA9IGYuYm9yZGVyX3N0eWxlX2xlZnQudmFsdWU7DQoJfSBlbHNlDQoJCWNlLnN0eWxlLmJvcmRlclN0eWxlID0gZi5ib3JkZXJfc3R5bGVfdG9wLnZhbHVlOw0KDQoJaWYgKCFmLmJvcmRlcl93aWR0aF9zYW1lLmNoZWNrZWQpIHsNCgkJY2Uuc3R5bGUuYm9yZGVyVG9wV2lkdGggPSBmLmJvcmRlcl93aWR0aF90b3AudmFsdWUgKyAoaXNOdW0oZi5ib3JkZXJfd2lkdGhfdG9wLnZhbHVlKSA/IGYuYm9yZGVyX3dpZHRoX3RvcF9tZWFzdXJlbWVudC52YWx1ZSA6ICIiKTsNCgkJY2Uuc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCA9IGYuYm9yZGVyX3dpZHRoX3JpZ2h0LnZhbHVlICsgKGlzTnVtKGYuYm9yZGVyX3dpZHRoX3JpZ2h0LnZhbHVlKSA/IGYuYm9yZGVyX3dpZHRoX3JpZ2h0X21lYXN1cmVtZW50LnZhbHVlIDogIiIpOw0KCQljZS5zdHlsZS5ib3JkZXJCb3R0b21XaWR0aCA9IGYuYm9yZGVyX3dpZHRoX2JvdHRvbS52YWx1ZSArIChpc051bShmLmJvcmRlcl93aWR0aF9ib3R0b20udmFsdWUpID8gZi5ib3JkZXJfd2lkdGhfYm90dG9tX21lYXN1cmVtZW50LnZhbHVlIDogIiIpOw0KCQljZS5zdHlsZS5ib3JkZXJMZWZ0V2lkdGggPSBmLmJvcmRlcl93aWR0aF9sZWZ0LnZhbHVlICsgKGlzTnVtKGYuYm9yZGVyX3dpZHRoX2xlZnQudmFsdWUpID8gZi5ib3JkZXJfd2lkdGhfbGVmdF9tZWFzdXJlbWVudC52YWx1ZSA6ICIiKTsNCgl9IGVsc2UNCgkJY2Uuc3R5bGUuYm9yZGVyV2lkdGggPSBmLmJvcmRlcl93aWR0aF90b3AudmFsdWUgKyAoaXNOdW0oZi5ib3JkZXJfd2lkdGhfdG9wLnZhbHVlKSA/IGYuYm9yZGVyX3dpZHRoX3RvcF9tZWFzdXJlbWVudC52YWx1ZSA6ICIiKTsNCg0KCWlmICghZi5ib3JkZXJfY29sb3Jfc2FtZS5jaGVja2VkKSB7DQoJCWNlLnN0eWxlLmJvcmRlclRvcENvbG9yID0gZi5ib3JkZXJfY29sb3JfdG9wLnZhbHVlOw0KCQljZS5zdHlsZS5ib3JkZXJSaWdodENvbG9yID0gZi5ib3JkZXJfY29sb3JfcmlnaHQudmFsdWU7DQoJCWNlLnN0eWxlLmJvcmRlckJvdHRvbUNvbG9yID0gZi5ib3JkZXJfY29sb3JfYm90dG9tLnZhbHVlOw0KCQljZS5zdHlsZS5ib3JkZXJMZWZ0Q29sb3IgPSBmLmJvcmRlcl9jb2xvcl9sZWZ0LnZhbHVlOw0KCX0gZWxzZQ0KCQljZS5zdHlsZS5ib3JkZXJDb2xvciA9IGYuYm9yZGVyX2NvbG9yX3RvcC52YWx1ZTsNCg0KCS8vIEJ1aWxkIGxpc3Qgc3R5bGVzDQoNCgljZS5zdHlsZS5saXN0U3R5bGVUeXBlID0gZi5saXN0X3R5cGUudmFsdWU7DQoJY2Uuc3R5bGUubGlzdFN0eWxlUG9zaXRpb24gPSBmLmxpc3RfcG9zaXRpb24udmFsdWU7DQoJY2Uuc3R5bGUubGlzdFN0eWxlSW1hZ2UgPSBmLmxpc3RfYnVsbGV0X2ltYWdlLnZhbHVlICE9ICIiID8gInVybCgiICsgZi5saXN0X2J1bGxldF9pbWFnZS52YWx1ZSArICIpIiA6ICIiOw0KDQoJLy8gQnVpbGQgcG9zaXRpb25pbmcgc3R5bGVzDQoNCgljZS5zdHlsZS5wb3NpdGlvbiA9IGYucG9zaXRpb25pbmdfdHlwZS52YWx1ZTsNCgljZS5zdHlsZS52aXNpYmlsaXR5ID0gZi5wb3NpdGlvbmluZ192aXNpYmlsaXR5LnZhbHVlOw0KDQoJaWYgKGNlLnN0eWxlLndpZHRoID09ICIiKQ0KCQljZS5zdHlsZS53aWR0aCA9IGYucG9zaXRpb25pbmdfd2lkdGgudmFsdWUgKyAoaXNOdW0oZi5wb3NpdGlvbmluZ193aWR0aC52YWx1ZSkgPyBmLnBvc2l0aW9uaW5nX3dpZHRoX21lYXN1cmVtZW50LnZhbHVlIDogIiIpOw0KDQoJaWYgKGNlLnN0eWxlLmhlaWdodCA9PSAiIikNCgkJY2Uuc3R5bGUuaGVpZ2h0ID0gZi5wb3NpdGlvbmluZ19oZWlnaHQudmFsdWUgKyAoaXNOdW0oZi5wb3NpdGlvbmluZ19oZWlnaHQudmFsdWUpID8gZi5wb3NpdGlvbmluZ19oZWlnaHRfbWVhc3VyZW1lbnQudmFsdWUgOiAiIik7DQoNCgljZS5zdHlsZS56SW5kZXggPSBmLnBvc2l0aW9uaW5nX3ppbmRleC52YWx1ZTsNCgljZS5zdHlsZS5vdmVyZmxvdyA9IGYucG9zaXRpb25pbmdfb3ZlcmZsb3cudmFsdWU7DQoNCglpZiAoIWYucG9zaXRpb25pbmdfcGxhY2VtZW50X3NhbWUuY2hlY2tlZCkgew0KCQljZS5zdHlsZS50b3AgPSBmLnBvc2l0aW9uaW5nX3BsYWNlbWVudF90b3AudmFsdWUgKyAoaXNOdW0oZi5wb3NpdGlvbmluZ19wbGFjZW1lbnRfdG9wLnZhbHVlKSA/IGYucG9zaXRpb25pbmdfcGxhY2VtZW50X3RvcF9tZWFzdXJlbWVudC52YWx1ZSA6ICIiKTsNCgkJY2Uuc3R5bGUucmlnaHQgPSBmLnBvc2l0aW9uaW5nX3BsYWNlbWVudF9yaWdodC52YWx1ZSArIChpc051bShmLnBvc2l0aW9uaW5nX3BsYWNlbWVudF9yaWdodC52YWx1ZSkgPyBmLnBvc2l0aW9uaW5nX3BsYWNlbWVudF9yaWdodF9tZWFzdXJlbWVudC52YWx1ZSA6ICIiKTsNCgkJY2Uuc3R5bGUuYm90dG9tID0gZi5wb3NpdGlvbmluZ19wbGFjZW1lbnRfYm90dG9tLnZhbHVlICsgKGlzTnVtKGYucG9zaXRpb25pbmdfcGxhY2VtZW50X2JvdHRvbS52YWx1ZSkgPyBmLnBvc2l0aW9uaW5nX3BsYWNlbWVudF9ib3R0b21fbWVhc3VyZW1lbnQudmFsdWUgOiAiIik7DQoJCWNlLnN0eWxlLmxlZnQgPSBmLnBvc2l0aW9uaW5nX3BsYWNlbWVudF9sZWZ0LnZhbHVlICsgKGlzTnVtKGYucG9zaXRpb25pbmdfcGxhY2VtZW50X2xlZnQudmFsdWUpID8gZi5wb3NpdGlvbmluZ19wbGFjZW1lbnRfbGVmdF9tZWFzdXJlbWVudC52YWx1ZSA6ICIiKTsNCgl9IGVsc2Ugew0KCQlzID0gZi5wb3NpdGlvbmluZ19wbGFjZW1lbnRfdG9wLnZhbHVlICsgKGlzTnVtKGYucG9zaXRpb25pbmdfcGxhY2VtZW50X3RvcC52YWx1ZSkgPyBmLnBvc2l0aW9uaW5nX3BsYWNlbWVudF90b3BfbWVhc3VyZW1lbnQudmFsdWUgOiAiIik7DQoJCWNlLnN0eWxlLnRvcCA9IHM7DQoJCWNlLnN0eWxlLnJpZ2h0ID0gczsNCgkJY2Uuc3R5bGUuYm90dG9tID0gczsNCgkJY2Uuc3R5bGUubGVmdCA9IHM7DQoJfQ0KDQoJaWYgKCFmLnBvc2l0aW9uaW5nX2NsaXBfc2FtZS5jaGVja2VkKSB7DQoJCXMgPSAicmVjdCgiOw0KCQlzICs9IChpc051bShmLnBvc2l0aW9uaW5nX2NsaXBfdG9wLnZhbHVlKSA/IGYucG9zaXRpb25pbmdfY2xpcF90b3AudmFsdWUgKyBmLnBvc2l0aW9uaW5nX2NsaXBfdG9wX21lYXN1cmVtZW50LnZhbHVlIDogImF1dG8iKSArICIgIjsNCgkJcyArPSAoaXNOdW0oZi5wb3NpdGlvbmluZ19jbGlwX3JpZ2h0LnZhbHVlKSA/IGYucG9zaXRpb25pbmdfY2xpcF9yaWdodC52YWx1ZSArIGYucG9zaXRpb25pbmdfY2xpcF9yaWdodF9tZWFzdXJlbWVudC52YWx1ZSA6ICJhdXRvIikgKyAiICI7DQoJCXMgKz0gKGlzTnVtKGYucG9zaXRpb25pbmdfY2xpcF9ib3R0b20udmFsdWUpID8gZi5wb3NpdGlvbmluZ19jbGlwX2JvdHRvbS52YWx1ZSArIGYucG9zaXRpb25pbmdfY2xpcF9ib3R0b21fbWVhc3VyZW1lbnQudmFsdWUgOiAiYXV0byIpICsgIiAiOw0KCQlzICs9IChpc051bShmLnBvc2l0aW9uaW5nX2NsaXBfbGVmdC52YWx1ZSkgPyBmLnBvc2l0aW9uaW5nX2NsaXBfbGVmdC52YWx1ZSArIGYucG9zaXRpb25pbmdfY2xpcF9sZWZ0X21lYXN1cmVtZW50LnZhbHVlIDogImF1dG8iKTsNCgkJcyArPSAiKSI7DQoNCgkJaWYgKHMgIT0gInJlY3QoYXV0byBhdXRvIGF1dG8gYXV0bykiKQ0KCQkJY2Uuc3R5bGUuY2xpcCA9IHM7DQoJfSBlbHNlIHsNCgkJcyA9ICJyZWN0KCI7DQoJCXQgPSBpc051bShmLnBvc2l0aW9uaW5nX2NsaXBfdG9wLnZhbHVlKSA/IGYucG9zaXRpb25pbmdfY2xpcF90b3AudmFsdWUgKyBmLnBvc2l0aW9uaW5nX2NsaXBfdG9wX21lYXN1cmVtZW50LnZhbHVlIDogImF1dG8iOw0KCQlzICs9IHQgKyAiICI7DQoJCXMgKz0gdCArICIgIjsNCgkJcyArPSB0ICsgIiAiOw0KCQlzICs9IHQgKyAiKSI7DQoNCgkJaWYgKHMgIT0gInJlY3QoYXV0byBhdXRvIGF1dG8gYXV0bykiKQ0KCQkJY2Uuc3R5bGUuY2xpcCA9IHM7DQoJfQ0KDQoJY2Uuc3R5bGUuY3NzVGV4dCA9IGNlLnN0eWxlLmNzc1RleHQ7DQp9DQoNCmZ1bmN0aW9uIGlzTnVtKHMpIHsNCglyZXR1cm4gbmV3IFJlZ0V4cCgnWzAtOV0rJywgJ2cnKS50ZXN0KHMpOw0KfQ0KDQpmdW5jdGlvbiBzaG93RGlzYWJsZWRDb250cm9scygpIHsNCgl2YXIgZiA9IGRvY3VtZW50LmZvcm1zLCBpLCBhOw0KDQoJZm9yIChpPTA7IGk8Zi5sZW5ndGg7IGkrKykgew0KCQlmb3IgKGE9MDsgYTxmW2ldLmVsZW1lbnRzLmxlbmd0aDsgYSsrKSB7DQoJCQlpZiAoZltpXS5lbGVtZW50c1thXS5kaXNhYmxlZCkNCgkJCQl0aW55TUNFUG9wdXAuZWRpdG9yLmRvbS5hZGRDbGFzcyhmW2ldLmVsZW1lbnRzW2FdLCAiZGlzYWJsZWQiKTsNCgkJCWVsc2UNCgkJCQl0aW55TUNFUG9wdXAuZWRpdG9yLmRvbS5yZW1vdmVDbGFzcyhmW2ldLmVsZW1lbnRzW2FdLCAiZGlzYWJsZWQiKTsNCgkJfQ0KCX0NCn0NCg0KZnVuY3Rpb24gZmlsbFNlbGVjdChmLCBzLCBwYXJhbSwgZHZhbCwgc2VwLCBlbSkgew0KCXZhciBpLCBhciwgcCwgc2U7DQoNCglmID0gZG9jdW1lbnQuZm9ybXNbZl07DQoJc2VwID0gdHlwZW9mKHNlcCkgPT0gInVuZGVmaW5lZCIgPyAiOyIgOiBzZXA7DQoNCglpZiAoZW0pDQoJCWFkZFNlbGVjdFZhbHVlKGYsIHMsICIiLCAiIik7DQoNCglhciA9IHRpbnlNQ0VQb3B1cC5nZXRQYXJhbShwYXJhbSwgZHZhbCkuc3BsaXQoc2VwKTsNCglmb3IgKGk9MDsgaTxhci5sZW5ndGg7IGkrKykgew0KCQlzZSA9IGZhbHNlOw0KDQoJCWlmIChhcltpXS5jaGFyQXQoMCkgPT0gJysnKSB7DQoJCQlhcltpXSA9IGFyW2ldLnN1YnN0cmluZygxKTsNCgkJCXNlID0gdHJ1ZTsNCgkJfQ0KDQoJCXAgPSBhcltpXS5zcGxpdCgnPScpOw0KDQoJCWlmIChwLmxlbmd0aCA+IDEpIHsNCgkJCWFkZFNlbGVjdFZhbHVlKGYsIHMsIHBbMF0sIHBbMV0pOw0KDQoJCQlpZiAoc2UpDQoJCQkJc2VsZWN0QnlWYWx1ZShmLCBzLCBwWzFdKTsNCgkJfSBlbHNlIHsNCgkJCWFkZFNlbGVjdFZhbHVlKGYsIHMsIHBbMF0sIHBbMF0pOw0KDQoJCQlpZiAoc2UpDQoJCQkJc2VsZWN0QnlWYWx1ZShmLCBzLCBwWzBdKTsNCgkJfQ0KCX0NCn0NCg0KZnVuY3Rpb24gdG9nZ2xlU2FtZShjZSwgcHJlKSB7DQoJdmFyIGVsID0gZG9jdW1lbnQuZm9ybXNbMF0uZWxlbWVudHMsIGk7DQoNCglpZiAoY2UuY2hlY2tlZCkgew0KCQllbFtwcmUgKyAiX3RvcCJdLmRpc2FibGVkID0gZmFsc2U7DQoJCWVsW3ByZSArICJfcmlnaHQiXS5kaXNhYmxlZCA9IHRydWU7DQoJCWVsW3ByZSArICJfYm90dG9tIl0uZGlzYWJsZWQgPSB0cnVlOw0KCQllbFtwcmUgKyAiX2xlZnQiXS5kaXNhYmxlZCA9IHRydWU7DQoNCgkJaWYgKGVsW3ByZSArICJfdG9wX21lYXN1cmVtZW50Il0pIHsNCgkJCWVsW3ByZSArICJfdG9wX21lYXN1cmVtZW50Il0uZGlzYWJsZWQgPSBmYWxzZTsNCgkJCWVsW3ByZSArICJfcmlnaHRfbWVhc3VyZW1lbnQiXS5kaXNhYmxlZCA9IHRydWU7DQoJCQllbFtwcmUgKyAiX2JvdHRvbV9tZWFzdXJlbWVudCJdLmRpc2FibGVkID0gdHJ1ZTsNCgkJCWVsW3ByZSArICJfbGVmdF9tZWFzdXJlbWVudCJdLmRpc2FibGVkID0gdHJ1ZTsNCgkJfQ0KCX0gZWxzZSB7DQoJCWVsW3ByZSArICJfdG9wIl0uZGlzYWJsZWQgPSBmYWxzZTsNCgkJZWxbcHJlICsgIl9yaWdodCJdLmRpc2FibGVkID0gZmFsc2U7DQoJCWVsW3ByZSArICJfYm90dG9tIl0uZGlzYWJsZWQgPSBmYWxzZTsNCgkJZWxbcHJlICsgIl9sZWZ0Il0uZGlzYWJsZWQgPSBmYWxzZTsNCg0KCQlpZiAoZWxbcHJlICsgIl90b3BfbWVhc3VyZW1lbnQiXSkgew0KCQkJZWxbcHJlICsgIl90b3BfbWVhc3VyZW1lbnQiXS5kaXNhYmxlZCA9IGZhbHNlOw0KCQkJZWxbcHJlICsgIl9yaWdodF9tZWFzdXJlbWVudCJdLmRpc2FibGVkID0gZmFsc2U7DQoJCQllbFtwcmUgKyAiX2JvdHRvbV9tZWFzdXJlbWVudCJdLmRpc2FibGVkID0gZmFsc2U7DQoJCQllbFtwcmUgKyAiX2xlZnRfbWVhc3VyZW1lbnQiXS5kaXNhYmxlZCA9IGZhbHNlOw0KCQl9DQoJfQ0KDQoJc2hvd0Rpc2FibGVkQ29udHJvbHMoKTsNCn0NCg0KZnVuY3Rpb24gc3luY2goZnIsIHRvKSB7DQoJdmFyIGYgPSBkb2N1bWVudC5mb3Jtc1swXTsNCg0KCWYuZWxlbWVudHNbdG9dLnZhbHVlID0gZi5lbGVtZW50c1tmcl0udmFsdWU7DQoNCglpZiAoZi5lbGVtZW50c1tmciArICJfbWVhc3VyZW1lbnQiXSkNCgkJc2VsZWN0QnlWYWx1ZShmLCB0byArICJfbWVhc3VyZW1lbnQiLCBmLmVsZW1lbnRzW2ZyICsgIl9tZWFzdXJlbWVudCJdLnZhbHVlKTsNCn0NCg0KdGlueU1DRVBvcHVwLm9uSW5pdC5hZGQoaW5pdCk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/style/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/style/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5zdHlsZV9kbGcnLHsNCnRpdGxlOiJFZGl0IENTUyBTdHlsZSIsDQphcHBseToiQXBwbHkiLA0KdGV4dF90YWI6IlRleHQiLA0KYmFja2dyb3VuZF90YWI6IkJhY2tncm91bmQiLA0KYmxvY2tfdGFiOiJCbG9jayIsDQpib3hfdGFiOiJCb3giLA0KYm9yZGVyX3RhYjoiQm9yZGVyIiwNCmxpc3RfdGFiOiJMaXN0IiwNCnBvc2l0aW9uaW5nX3RhYjoiUG9zaXRpb25pbmciLA0KdGV4dF9wcm9wczoiVGV4dCIsDQp0ZXh0X2ZvbnQ6IkZvbnQiLA0KdGV4dF9zaXplOiJTaXplIiwNCnRleHRfd2VpZ2h0OiJXZWlnaHQiLA0KdGV4dF9zdHlsZToiU3R5bGUiLA0KdGV4dF92YXJpYW50OiJWYXJpYW50IiwNCnRleHRfbGluZWhlaWdodDoiTGluZSBoZWlnaHQiLA0KdGV4dF9jYXNlOiJDYXNlIiwNCnRleHRfY29sb3I6IkNvbG9yIiwNCnRleHRfZGVjb3JhdGlvbjoiRGVjb3JhdGlvbiIsDQp0ZXh0X292ZXJsaW5lOiJvdmVybGluZSIsDQp0ZXh0X3VuZGVybGluZToidW5kZXJsaW5lIiwNCnRleHRfc3RyaWtldHJvdWdoOiJzdHJpa2V0aHJvdWdoIiwNCnRleHRfYmxpbms6ImJsaW5rIiwNCnRleHRfbm9uZToibm9uZSIsDQpiYWNrZ3JvdW5kX2NvbG9yOiJCYWNrZ3JvdW5kIGNvbG9yIiwNCmJhY2tncm91bmRfaW1hZ2U6IkJhY2tncm91bmQgaW1hZ2UiLA0KYmFja2dyb3VuZF9yZXBlYXQ6IlJlcGVhdCIsDQpiYWNrZ3JvdW5kX2F0dGFjaG1lbnQ6IkF0dGFjaG1lbnQiLA0KYmFja2dyb3VuZF9ocG9zOiJIb3Jpem9udGFsIHBvc2l0aW9uIiwNCmJhY2tncm91bmRfdnBvczoiVmVydGljYWwgcG9zaXRpb24iLA0KYmxvY2tfd29yZHNwYWNpbmc6IldvcmQgc3BhY2luZyIsDQpibG9ja19sZXR0ZXJzcGFjaW5nOiJMZXR0ZXIgc3BhY2luZyIsDQpibG9ja192ZXJ0aWNhbF9hbGlnbm1lbnQ6IlZlcnRpY2FsIGFsaWdubWVudCIsDQpibG9ja190ZXh0X2FsaWduOiJUZXh0IGFsaWduIiwNCmJsb2NrX3RleHRfaW5kZW50OiJUZXh0IGluZGVudCIsDQpibG9ja193aGl0ZXNwYWNlOiJXaGl0ZXNwYWNlIiwNCmJsb2NrX2Rpc3BsYXk6IkRpc3BsYXkiLA0KYm94X3dpZHRoOiJXaWR0aCIsDQpib3hfaGVpZ2h0OiJIZWlnaHQiLA0KYm94X2Zsb2F0OiJGbG9hdCIsDQpib3hfY2xlYXI6IkNsZWFyIiwNCnBhZGRpbmc6IlBhZGRpbmciLA0Kc2FtZToiU2FtZSBmb3IgYWxsIiwNCnRvcDoiVG9wIiwNCnJpZ2h0OiJSaWdodCIsDQpib3R0b206IkJvdHRvbSIsDQpsZWZ0OiJMZWZ0IiwNCm1hcmdpbjoiTWFyZ2luIiwNCnN0eWxlOiJTdHlsZSIsDQp3aWR0aDoiV2lkdGgiLA0KaGVpZ2h0OiJIZWlnaHQiLA0KY29sb3I6IkNvbG9yIiwNCmxpc3RfdHlwZToiVHlwZSIsDQpidWxsZXRfaW1hZ2U6IkJ1bGxldCBpbWFnZSIsDQpwb3NpdGlvbjoiUG9zaXRpb24iLA0KcG9zaXRpb25pbmdfdHlwZToiVHlwZSIsDQp2aXNpYmlsaXR5OiJWaXNpYmlsaXR5IiwNCnppbmRleDoiWi1pbmRleCIsDQpvdmVyZmxvdzoiT3ZlcmZsb3ciLA0KcGxhY2VtZW50OiJQbGFjZW1lbnQiLA0KY2xpcDoiQ2xpcCINCn0pOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/style/props.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjc3R5bGVfZGxnLnRpdGxlfTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9tY3RhYnMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZWRpdGFibGVfc2VsZWN0cy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9mb3JtX3V0aWxzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL3Byb3BzLmpzIj48L3NjcmlwdD4KCTxsaW5rIGhyZWY9ImNzcy9wcm9wcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+CjwvaGVhZD4KCjxib2R5IGlkPSJzdHlsZXByb3BzIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+Cjxmb3JtIG9uc3VibWl0PSJ1cGRhdGVBY3Rpb24oKTtyZXR1cm4gZmFsc2U7IiBhY3Rpb249IiMiPgo8ZGl2IGNsYXNzPSJ0YWJzIj4KCTx1bD4KCQk8bGkgaWQ9InRleHRfdGFiIiBjbGFzcz0iY3VycmVudCI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYigndGV4dF90YWInLCd0ZXh0X3BhbmVsJyk7IiBvbk1vdXNlRG93bj0icmV0dXJuIGZhbHNlOyI+eyNzdHlsZV9kbGcudGV4dF90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCTxsaSBpZD0iYmFja2dyb3VuZF90YWIiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2JhY2tncm91bmRfdGFiJywnYmFja2dyb3VuZF9wYW5lbCcpOyIgb25Nb3VzZURvd249InJldHVybiBmYWxzZTsiPnsjc3R5bGVfZGxnLmJhY2tncm91bmRfdGFifTwvYT48L3NwYW4+PC9saT4KCQk8bGkgaWQ9ImJsb2NrX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignYmxvY2tfdGFiJywnYmxvY2tfcGFuZWwnKTsiIG9uTW91c2VEb3duPSJyZXR1cm4gZmFsc2U7Ij57I3N0eWxlX2RsZy5ibG9ja190YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCTxsaSBpZD0iYm94X3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignYm94X3RhYicsJ2JveF9wYW5lbCcpOyIgb25Nb3VzZURvd249InJldHVybiBmYWxzZTsiPnsjc3R5bGVfZGxnLmJveF90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCTxsaSBpZD0iYm9yZGVyX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignYm9yZGVyX3RhYicsJ2JvcmRlcl9wYW5lbCcpOyIgb25Nb3VzZURvd249InJldHVybiBmYWxzZTsiPnsjc3R5bGVfZGxnLmJvcmRlcl90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCTxsaSBpZD0ibGlzdF90YWIiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2xpc3RfdGFiJywnbGlzdF9wYW5lbCcpOyIgb25Nb3VzZURvd249InJldHVybiBmYWxzZTsiPnsjc3R5bGVfZGxnLmxpc3RfdGFifTwvYT48L3NwYW4+PC9saT4KCQk8bGkgaWQ9InBvc2l0aW9uaW5nX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYigncG9zaXRpb25pbmdfdGFiJywncG9zaXRpb25pbmdfcGFuZWwnKTsiIG9uTW91c2VEb3duPSJyZXR1cm4gZmFsc2U7Ij57I3N0eWxlX2RsZy5wb3NpdGlvbmluZ190YWJ9PC9hPjwvc3Bhbj48L2xpPgoJPC91bD4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJwYW5lbF93cmFwcGVyIj4KPGRpdiBpZD0idGV4dF9wYW5lbCIgY2xhc3M9InBhbmVsIGN1cnJlbnQiPgoJPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgoJCTx0cj4KCQkJPHRkPjxsYWJlbCBmb3I9InRleHRfZm9udCI+eyNzdHlsZV9kbGcudGV4dF9mb250fTwvbGFiZWw+PC90ZD4KCQkJPHRkIGNvbHNwYW49IjMiPgoJCQkJPHNlbGVjdCBpZD0idGV4dF9mb250IiBuYW1lPSJ0ZXh0X2ZvbnQiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCBtY2VGb2N1cyI+PC9zZWxlY3Q+CgkJCTwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD48bGFiZWwgZm9yPSJ0ZXh0X3NpemUiPnsjc3R5bGVfZGxnLnRleHRfc2l6ZX08L2xhYmVsPjwvdGQ+CgkJCTx0ZD4KCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQkJPHRyPgoJCQkJCQk8dGQ+PHNlbGVjdCBpZD0idGV4dF9zaXplIiBuYW1lPSJ0ZXh0X3NpemUiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQkJCTx0ZD48c2VsZWN0IGlkPSJ0ZXh0X3NpemVfbWVhc3VyZW1lbnQiIG5hbWU9InRleHRfc2l6ZV9tZWFzdXJlbWVudCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQk8L3RyPgoJCQkJPC90YWJsZT4KCQkJPC90ZD4KCQkJPHRkPjxsYWJlbCBmb3I9InRleHRfd2VpZ2h0Ij57I3N0eWxlX2RsZy50ZXh0X3dlaWdodH08L2xhYmVsPjwvdGQ+CgkJCTx0ZD4KCQkJCTxzZWxlY3QgaWQ9InRleHRfd2VpZ2h0IiBuYW1lPSJ0ZXh0X3dlaWdodCI+PC9zZWxlY3Q+CgkJCTwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD48bGFiZWwgZm9yPSJ0ZXh0X3N0eWxlIj57I3N0eWxlX2RsZy50ZXh0X3N0eWxlfTwvbGFiZWw+PC90ZD4KCQkJPHRkPgoJCQkJPHNlbGVjdCBpZD0idGV4dF9zdHlsZSIgbmFtZT0idGV4dF9zdHlsZSIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD4KCQkJPC90ZD4KCQkJPHRkPjxsYWJlbCBmb3I9InRleHRfdmFyaWFudCI+eyNzdHlsZV9kbGcudGV4dF92YXJpYW50fTwvbGFiZWw+PC90ZD4KCQkJPHRkPgoJCQkJPHNlbGVjdCBpZD0idGV4dF92YXJpYW50IiBuYW1lPSJ0ZXh0X3ZhcmlhbnQiPjwvc2VsZWN0PgoJCQk8L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+PGxhYmVsIGZvcj0idGV4dF9saW5laGVpZ2h0Ij57I3N0eWxlX2RsZy50ZXh0X2xpbmVoZWlnaHR9PC9sYWJlbD48L3RkPgoJCQk8dGQ+CgkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQkJCTx0cj4KCQkJCQkJPHRkPgoJCQkJCQkJPHNlbGVjdCBpZD0idGV4dF9saW5laGVpZ2h0IiBuYW1lPSJ0ZXh0X2xpbmVoZWlnaHQiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCI+PC9zZWxlY3Q+CgkJCQkJCTwvdGQ+CgkJCQkJCTx0ZD4mbmJzcDs8L3RkPgoJCQkJCQk8dGQ+PHNlbGVjdCBpZD0idGV4dF9saW5laGVpZ2h0X21lYXN1cmVtZW50IiBuYW1lPSJ0ZXh0X2xpbmVoZWlnaHRfbWVhc3VyZW1lbnQiPjwvc2VsZWN0PjwvdGQ+CgkJCQkJPC90cj4KCQkJCTwvdGFibGU+CgkJCTwvdGQ+CgkJCTx0ZD48bGFiZWwgZm9yPSJ0ZXh0X2Nhc2UiPnsjc3R5bGVfZGxnLnRleHRfY2FzZX08L2xhYmVsPjwvdGQ+CgkJCTx0ZD4KCQkJCTxzZWxlY3QgaWQ9InRleHRfY2FzZSIgbmFtZT0idGV4dF9jYXNlIj48L3NlbGVjdD4KCQkJPC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkPjxsYWJlbCBmb3I9InRleHRfY29sb3IiPnsjc3R5bGVfZGxnLnRleHRfY29sb3J9PC9sYWJlbD48L3RkPgoJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCTx0cj4KCQkJCQkJPHRkPjxpbnB1dCBpZD0idGV4dF9jb2xvciIgbmFtZT0idGV4dF9jb2xvciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iOSIgb25DaGFuZ2U9InVwZGF0ZUNvbG9yKCd0ZXh0X2NvbG9yX3BpY2snLCd0ZXh0X2NvbG9yJyk7IiAvPjwvdGQ+CgkJCQkJCTx0ZCBpZD0idGV4dF9jb2xvcl9waWNrY29udGFpbmVyIj4mbmJzcDs8L3RkPgoJCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQgdmFsaWduPSJ0b3AiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBwYWRkaW5nLXRvcDogM3B4OyI+eyNzdHlsZV9kbGcudGV4dF9kZWNvcmF0aW9ufTwvdGQ+CgkJCTx0ZCBjb2xzcGFuPSIyIj4KCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQkJPHRyPgoJCQkJCQk8dGQ+PGlucHV0IGlkPSJ0ZXh0X3VuZGVybGluZSIgbmFtZT0idGV4dF91bmRlcmxpbmUiIGNsYXNzPSJjaGVja2JveCIgdHlwZT0iY2hlY2tib3giIC8+PC90ZD4KCQkJCQkJPHRkPjxsYWJlbCBmb3I9InRleHRfdW5kZXJsaW5lIj57I3N0eWxlX2RsZy50ZXh0X3VuZGVybGluZX08L2xhYmVsPjwvdGQ+CgkJCQkJPC90cj4KCQkJCQk8dHI+CgkJCQkJCTx0ZD48aW5wdXQgaWQ9InRleHRfb3ZlcmxpbmUiIG5hbWU9InRleHRfb3ZlcmxpbmUiIGNsYXNzPSJjaGVja2JveCIgdHlwZT0iY2hlY2tib3giIC8+PC90ZD4KCQkJCQkJPHRkPjxsYWJlbCBmb3I9InRleHRfb3ZlcmxpbmUiPnsjc3R5bGVfZGxnLnRleHRfb3ZlcmxpbmV9PC9sYWJlbD48L3RkPgoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQ+PGlucHV0IGlkPSJ0ZXh0X2xpbmV0aHJvdWdoIiBuYW1lPSJ0ZXh0X2xpbmV0aHJvdWdoIiBjbGFzcz0iY2hlY2tib3giIHR5cGU9ImNoZWNrYm94IiAvPjwvdGQ+CgkJCQkJCTx0ZD48bGFiZWwgZm9yPSJ0ZXh0X2xpbmV0aHJvdWdoIj57I3N0eWxlX2RsZy50ZXh0X3N0cmlrZXRyb3VnaH08L2xhYmVsPjwvdGQ+CgkJCQkJPC90cj4KCQkJCQk8dHI+CgkJCQkJCTx0ZD48aW5wdXQgaWQ9InRleHRfYmxpbmsiIG5hbWU9InRleHRfYmxpbmsiIGNsYXNzPSJjaGVja2JveCIgdHlwZT0iY2hlY2tib3giIC8+PC90ZD4KCQkJCQkJPHRkPjxsYWJlbCBmb3I9InRleHRfYmxpbmsiPnsjc3R5bGVfZGxnLnRleHRfYmxpbmt9PC9sYWJlbD48L3RkPgoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQ+PGlucHV0IGlkPSJ0ZXh0X25vbmUiIG5hbWU9InRleHRfbm9uZSIgY2xhc3M9ImNoZWNrYm94IiB0eXBlPSJjaGVja2JveCIgLz48L3RkPgoJCQkJCQk8dGQ+PGxhYmVsIGZvcj0idGV4dF9ub25lIj57I3N0eWxlX2RsZy50ZXh0X25vbmV9PC9sYWJlbD48L3RkPgoJCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L3RkPgoJCTwvdHI+Cgk8L3RhYmxlPgo8L2Rpdj4KCjxkaXYgaWQ9ImJhY2tncm91bmRfcGFuZWwiIGNsYXNzPSJwYW5lbCI+Cgk8dGFibGUgYm9yZGVyPSIwIj4KCQk8dHI+CgkJCTx0ZD48bGFiZWwgZm9yPSJiYWNrZ3JvdW5kX2NvbG9yIj57I3N0eWxlX2RsZy5iYWNrZ3JvdW5kX2NvbG9yfTwvbGFiZWw+PC90ZD4KCQkJPHRkPgoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQk8dHI+CgkJCQkJCTx0ZD48aW5wdXQgaWQ9ImJhY2tncm91bmRfY29sb3IiIG5hbWU9ImJhY2tncm91bmRfY29sb3IiIHR5cGU9InRleHQiIHZhbHVlPSIiIHNpemU9IjkiIG9uQ2hhbmdlPSJ1cGRhdGVDb2xvcignYmFja2dyb3VuZF9jb2xvcl9waWNrJywnYmFja2dyb3VuZF9jb2xvcicpOyIgLz48L3RkPgoJCQkJCQk8dGQgaWQ9ImJhY2tncm91bmRfY29sb3JfcGlja2NvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJCQk8L3RyPgoJCQkJPC90YWJsZT4KCQkJPC90ZD4KCQk8L3RyPgoKCQk8dHI+CgkJCTx0ZD48bGFiZWwgZm9yPSJiYWNrZ3JvdW5kX2ltYWdlIj57I3N0eWxlX2RsZy5iYWNrZ3JvdW5kX2ltYWdlfTwvbGFiZWw+PC90ZD4KCQkJPHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQk8dHI+IAoJCQkJICA8dGQ+PGlucHV0IGlkPSJiYWNrZ3JvdW5kX2ltYWdlIiBuYW1lPSJiYWNrZ3JvdW5kX2ltYWdlIiB0eXBlPSJ0ZXh0IiAvPjwvdGQ+IAoJCQkJICA8dGQgaWQ9ImJhY2tncm91bmRfaW1hZ2VfYnJvd3NlciI+Jm5ic3A7PC90ZD4KCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L3RkPgoJCTwvdHI+CgoJCTx0cj4KCQkJPHRkPjxsYWJlbCBmb3I9ImJhY2tncm91bmRfcmVwZWF0Ij57I3N0eWxlX2RsZy5iYWNrZ3JvdW5kX3JlcGVhdH08L2xhYmVsPjwvdGQ+CgkJCTx0ZD48c2VsZWN0IGlkPSJiYWNrZ3JvdW5kX3JlcGVhdCIgbmFtZT0iYmFja2dyb3VuZF9yZXBlYXQiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCI+PC9zZWxlY3Q+PC90ZD4KCQk8L3RyPgoKCQk8dHI+CgkJCTx0ZD48bGFiZWwgZm9yPSJiYWNrZ3JvdW5kX2F0dGFjaG1lbnQiPnsjc3R5bGVfZGxnLmJhY2tncm91bmRfYXR0YWNobWVudH08L2xhYmVsPjwvdGQ+CgkJCTx0ZD48c2VsZWN0IGlkPSJiYWNrZ3JvdW5kX2F0dGFjaG1lbnQiIG5hbWU9ImJhY2tncm91bmRfYXR0YWNobWVudCIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD48L3RkPgoJCTwvdHI+CgoJCTx0cj4KCQkJPHRkPjxsYWJlbCBmb3I9ImJhY2tncm91bmRfaHBvcyI+eyNzdHlsZV9kbGcuYmFja2dyb3VuZF9ocG9zfTwvbGFiZWw+PC90ZD4KCQkJPHRkPgoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQk8dHI+CgkJCQkJCTx0ZD48c2VsZWN0IGlkPSJiYWNrZ3JvdW5kX2hwb3MiIG5hbWU9ImJhY2tncm91bmRfaHBvcyIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD48L3RkPgoJCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCQkJPHRkPjxzZWxlY3QgaWQ9ImJhY2tncm91bmRfaHBvc19tZWFzdXJlbWVudCIgbmFtZT0iYmFja2dyb3VuZF9ocG9zX21lYXN1cmVtZW50Ij48L3NlbGVjdD48L3RkPgoJCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L3RkPgoJCTwvdHI+CgoJCTx0cj4KCQkJPHRkPjxsYWJlbCBmb3I9ImJhY2tncm91bmRfdnBvcyI+eyNzdHlsZV9kbGcuYmFja2dyb3VuZF92cG9zfTwvbGFiZWw+PC90ZD4KCQkJPHRkPgoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQk8dHI+CgkJCQkJCTx0ZD48c2VsZWN0IGlkPSJiYWNrZ3JvdW5kX3Zwb3MiIG5hbWU9ImJhY2tncm91bmRfdnBvcyIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD48L3RkPgoJCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCQkJPHRkPjxzZWxlY3QgaWQ9ImJhY2tncm91bmRfdnBvc19tZWFzdXJlbWVudCIgbmFtZT0iYmFja2dyb3VuZF92cG9zX21lYXN1cmVtZW50Ij48L3NlbGVjdD48L3RkPgoJCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L3RkPgoJCTwvdHI+Cgk8L3RhYmxlPgo8L2Rpdj4KCjxkaXYgaWQ9ImJsb2NrX3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJPHRhYmxlIGJvcmRlcj0iMCI+CgkJPHRyPgoJCQk8dGQ+PGxhYmVsIGZvcj0iYmxvY2tfd29yZHNwYWNpbmciPnsjc3R5bGVfZGxnLmJsb2NrX3dvcmRzcGFjaW5nfTwvbGFiZWw+PC90ZD4KCQkJPHRkPgoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQk8dHI+CgkJCQkJCTx0ZD48c2VsZWN0IGlkPSJibG9ja193b3Jkc3BhY2luZyIgbmFtZT0iYmxvY2tfd29yZHNwYWNpbmciIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQkJCTx0ZD48c2VsZWN0IGlkPSJibG9ja193b3Jkc3BhY2luZ19tZWFzdXJlbWVudCIgbmFtZT0iYmxvY2tfd29yZHNwYWNpbmdfbWVhc3VyZW1lbnQiPjwvc2VsZWN0PjwvdGQ+CgkJCQkJPC90cj4KCQkJCTwvdGFibGU+CgkJCTwvdGQ+CgkJPC90cj4KCgkJPHRyPgoJCQk8dGQ+PGxhYmVsIGZvcj0iYmxvY2tfbGV0dGVyc3BhY2luZyI+eyNzdHlsZV9kbGcuYmxvY2tfbGV0dGVyc3BhY2luZ308L2xhYmVsPjwvdGQ+CgkJCTx0ZD4KCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQkJPHRyPgoJCQkJCQk8dGQ+PHNlbGVjdCBpZD0iYmxvY2tfbGV0dGVyc3BhY2luZyIgbmFtZT0iYmxvY2tfbGV0dGVyc3BhY2luZyIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD48L3RkPgoJCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCQkJPHRkPjxzZWxlY3QgaWQ9ImJsb2NrX2xldHRlcnNwYWNpbmdfbWVhc3VyZW1lbnQiIG5hbWU9ImJsb2NrX2xldHRlcnNwYWNpbmdfbWVhc3VyZW1lbnQiPjwvc2VsZWN0PjwvdGQ+CgkJCQkJPC90cj4KCQkJCTwvdGFibGU+CgkJCTwvdGQ+CgkJPC90cj4KCgkJPHRyPgoJCQk8dGQ+PGxhYmVsIGZvcj0iYmxvY2tfdmVydGljYWxfYWxpZ25tZW50Ij57I3N0eWxlX2RsZy5ibG9ja192ZXJ0aWNhbF9hbGlnbm1lbnR9PC9sYWJlbD48L3RkPgoJCQk8dGQ+PHNlbGVjdCBpZD0iYmxvY2tfdmVydGljYWxfYWxpZ25tZW50IiBuYW1lPSJibG9ja192ZXJ0aWNhbF9hbGlnbm1lbnQiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCI+PC9zZWxlY3Q+PC90ZD4KCQk8L3RyPgoKCQk8dHI+CgkJCTx0ZD48bGFiZWwgZm9yPSJibG9ja190ZXh0X2FsaWduIj57I3N0eWxlX2RsZy5ibG9ja190ZXh0X2FsaWdufTwvbGFiZWw+PC90ZD4KCQkJPHRkPjxzZWxlY3QgaWQ9ImJsb2NrX3RleHRfYWxpZ24iIG5hbWU9ImJsb2NrX3RleHRfYWxpZ24iIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCI+PC9zZWxlY3Q+PC90ZD4KCQk8L3RyPgoKCQk8dHI+CgkJCTx0ZD48bGFiZWwgZm9yPSJibG9ja190ZXh0X2luZGVudCI+eyNzdHlsZV9kbGcuYmxvY2tfdGV4dF9pbmRlbnR9PC9sYWJlbD48L3RkPgoJCQk8dGQ+CgkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQkJCTx0cj4KCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYmxvY2tfdGV4dF9pbmRlbnQiIG5hbWU9ImJsb2NrX3RleHRfaW5kZW50IiAvPjwvdGQ+CgkJCQkJCTx0ZD4mbmJzcDs8L3RkPgoJCQkJCQk8dGQ+PHNlbGVjdCBpZD0iYmxvY2tfdGV4dF9pbmRlbnRfbWVhc3VyZW1lbnQiIG5hbWU9ImJsb2NrX3RleHRfaW5kZW50X21lYXN1cmVtZW50Ij48L3NlbGVjdD48L3RkPgoJCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L3RkPgoJCTwvdHI+CgoJCTx0cj4KCQkJPHRkPjxsYWJlbCBmb3I9ImJsb2NrX3doaXRlc3BhY2UiPnsjc3R5bGVfZGxnLmJsb2NrX3doaXRlc3BhY2V9PC9sYWJlbD48L3RkPgoJCQk8dGQ+PHNlbGVjdCBpZD0iYmxvY2tfd2hpdGVzcGFjZSIgbmFtZT0iYmxvY2tfd2hpdGVzcGFjZSIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD48L3RkPgoJCTwvdHI+CgoJCTx0cj4KCQkJPHRkPjxsYWJlbCBmb3I9ImJsb2NrX2Rpc3BsYXkiPnsjc3R5bGVfZGxnLmJsb2NrX2Rpc3BsYXl9PC9sYWJlbD48L3RkPgoJCQk8dGQ+PHNlbGVjdCBpZD0iYmxvY2tfZGlzcGxheSIgbmFtZT0iYmxvY2tfZGlzcGxheSIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD48L3RkPgoJCTwvdHI+Cgk8L3RhYmxlPgo8L2Rpdj4KCjxkaXYgaWQ9ImJveF9wYW5lbCIgY2xhc3M9InBhbmVsIj4KPHRhYmxlIGJvcmRlcj0iMCI+Cgk8dHI+CgkJPHRkPjxsYWJlbCBmb3I9ImJveF93aWR0aCI+eyNzdHlsZV9kbGcuYm94X3dpZHRofTwvbGFiZWw+PC90ZD4KCQk8dGQ+CgkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQk8dHI+CgkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYm94X3dpZHRoIiBuYW1lPSJib3hfd2lkdGgiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCIgb25DaGFuZ2U9InN5bmNoKCdib3hfd2lkdGgnLCdwb3NpdGlvbmluZ193aWR0aCcpOyIgLz48L3RkPgoJCQkJCTx0ZD4mbmJzcDs8L3RkPgoJCQkJCTx0ZD48c2VsZWN0IGlkPSJib3hfd2lkdGhfbWVhc3VyZW1lbnQiIG5hbWU9ImJveF93aWR0aF9tZWFzdXJlbWVudCI+PC9zZWxlY3Q+PC90ZD4KCQkJCTwvdHI+CgkJCTwvdGFibGU+CgkJPC90ZD4KCQk8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGxhYmVsIGZvcj0iYm94X2Zsb2F0Ij57I3N0eWxlX2RsZy5ib3hfZmxvYXR9PC9sYWJlbD48L3RkPgoJCTx0ZD48c2VsZWN0IGlkPSJib3hfZmxvYXQiIG5hbWU9ImJveF9mbG9hdCIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD48L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPjxsYWJlbCBmb3I9ImJveF9oZWlnaHQiPnsjc3R5bGVfZGxnLmJveF9oZWlnaHR9PC9sYWJlbD48L3RkPgoJCTx0ZD4KCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCTx0cj4KCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJib3hfaGVpZ2h0IiBuYW1lPSJib3hfaGVpZ2h0IiBjbGFzcz0ibWNlRWRpdGFibGVTZWxlY3QiIG9uQ2hhbmdlPSJzeW5jaCgnYm94X2hlaWdodCcsJ3Bvc2l0aW9uaW5nX2hlaWdodCcpOyIgLz48L3RkPgoJCQkJCTx0ZD4mbmJzcDs8L3RkPgoJCQkJCTx0ZD48c2VsZWN0IGlkPSJib3hfaGVpZ2h0X21lYXN1cmVtZW50IiBuYW1lPSJib3hfaGVpZ2h0X21lYXN1cmVtZW50Ij48L3NlbGVjdD48L3RkPgoJCQkJPC90cj4KCQkJPC90YWJsZT4KCQk8L3RkPgoJCTx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs8bGFiZWwgZm9yPSJib3hfY2xlYXIiPnsjc3R5bGVfZGxnLmJveF9jbGVhcn08L2xhYmVsPjwvdGQ+CgkJPHRkPjxzZWxlY3QgaWQ9ImJveF9jbGVhciIgbmFtZT0iYm94X2NsZWFyIiBjbGFzcz0ibWNlRWRpdGFibGVTZWxlY3QiPjwvc2VsZWN0PjwvdGQ+Cgk8L3RyPgo8L3RhYmxlPgo8ZGl2IHN0eWxlPSJmbG9hdDogbGVmdDsgd2lkdGg6IDQ5JSI+Cgk8ZmllbGRzZXQ+CgkJPGxlZ2VuZD57I3N0eWxlX2RsZy5wYWRkaW5nfTwvbGVnZW5kPgoKCQk8dGFibGUgYm9yZGVyPSIwIj4KCQkJPHRyPgoJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iYm94X3BhZGRpbmdfc2FtZSIgbmFtZT0iYm94X3BhZGRpbmdfc2FtZSIgY2xhc3M9ImNoZWNrYm94IiBjaGVja2VkPSJjaGVja2VkIiBvbkNsaWNrPSJ0b2dnbGVTYW1lKHRoaXMsJ2JveF9wYWRkaW5nJyk7IiAvPiA8bGFiZWwgZm9yPSJib3hfcGFkZGluZ19zYW1lIj57I3N0eWxlX2RsZy5zYW1lfTwvbGFiZWw+PC90ZD4KCQkJPC90cj4KCQkJPHRyPgoJCQkJPHRkPjxsYWJlbCBmb3I9ImJveF9wYWRkaW5nX3RvcCI+eyNzdHlsZV9kbGcudG9wfTwvbGFiZWw+PC90ZD4KCQkJCTx0ZD4KCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJib3hfcGFkZGluZ190b3AiIG5hbWU9ImJveF9wYWRkaW5nX3RvcCIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0IiAvPjwvdGQ+CgkJCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJib3hfcGFkZGluZ190b3BfbWVhc3VyZW1lbnQiIG5hbWU9ImJveF9wYWRkaW5nX3RvcF9tZWFzdXJlbWVudCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJPHRyPgoJCQkJPHRkPjxsYWJlbCBmb3I9ImJveF9wYWRkaW5nX3JpZ2h0Ij57I3N0eWxlX2RsZy5yaWdodH08L2xhYmVsPjwvdGQ+CgkJCQk8dGQ+CgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYm94X3BhZGRpbmdfcmlnaHQiIG5hbWU9ImJveF9wYWRkaW5nX3JpZ2h0IiBjbGFzcz0ibWNlRWRpdGFibGVTZWxlY3QiIGRpc2FibGVkPSJkaXNhYmxlZCIgLz48L3RkPgoJCQkJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0iYm94X3BhZGRpbmdfcmlnaHRfbWVhc3VyZW1lbnQiIG5hbWU9ImJveF9wYWRkaW5nX3JpZ2h0X21lYXN1cmVtZW50IiBkaXNhYmxlZD0iZGlzYWJsZWQiPjwvc2VsZWN0PjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvdGQ+CgkJCTwvdHI+CgkJCTx0cj4KCQkJCTx0ZD48bGFiZWwgZm9yPSJib3hfcGFkZGluZ19ib3R0b20iPnsjc3R5bGVfZGxnLmJvdHRvbX08L2xhYmVsPjwvdGQ+CgkJCQk8dGQ+CgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYm94X3BhZGRpbmdfYm90dG9tIiBuYW1lPSJib3hfcGFkZGluZ19ib3R0b20iIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCIgZGlzYWJsZWQ9ImRpc2FibGVkIiAvPjwvdGQ+CgkJCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJib3hfcGFkZGluZ19ib3R0b21fbWVhc3VyZW1lbnQiIG5hbWU9ImJveF9wYWRkaW5nX2JvdHRvbV9tZWFzdXJlbWVudCIgZGlzYWJsZWQ9ImRpc2FibGVkIj48L3NlbGVjdD48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgkJCQk8L3RkPgoJCQk8L3RyPgoJCQk8dHI+CgkJCQk8dGQ+PGxhYmVsIGZvcj0iYm94X3BhZGRpbmdfbGVmdCI+eyNzdHlsZV9kbGcubGVmdH08L2xhYmVsPjwvdGQ+CgkJCQk8dGQ+CgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYm94X3BhZGRpbmdfbGVmdCIgbmFtZT0iYm94X3BhZGRpbmdfbGVmdCIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0IiBkaXNhYmxlZD0iZGlzYWJsZWQiIC8+PC90ZD4KCQkJCQkJCTx0ZD4mbmJzcDs8L3RkPgoJCQkJCQkJPHRkPjxzZWxlY3QgaWQ9ImJveF9wYWRkaW5nX2xlZnRfbWVhc3VyZW1lbnQiIG5hbWU9ImJveF9wYWRkaW5nX2xlZnRfbWVhc3VyZW1lbnQiIGRpc2FibGVkPSJkaXNhYmxlZCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC90ZD4KCQkJPC90cj4KCQk8L3RhYmxlPgoJPC9maWVsZHNldD4KPC9kaXY+Cgo8ZGl2IHN0eWxlPSJmbG9hdDogcmlnaHQ7IHdpZHRoOiA0OSUiPgoJPGZpZWxkc2V0PgoJCTxsZWdlbmQ+eyNzdHlsZV9kbGcubWFyZ2lufTwvbGVnZW5kPgoKCQk8dGFibGUgYm9yZGVyPSIwIj4KCQkJPHRyPgoJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iYm94X21hcmdpbl9zYW1lIiBuYW1lPSJib3hfbWFyZ2luX3NhbWUiIGNsYXNzPSJjaGVja2JveCIgY2hlY2tlZD0iY2hlY2tlZCIgb25DbGljaz0idG9nZ2xlU2FtZSh0aGlzLCdib3hfbWFyZ2luJyk7IiAvPiA8bGFiZWwgZm9yPSJib3hfbWFyZ2luX3NhbWUiPnsjc3R5bGVfZGxnLnNhbWV9PC9sYWJlbD48L3RkPgoJCQk8L3RyPgoJCQk8dHI+CgkJCQk8dGQ+PGxhYmVsIGZvcj0iYm94X21hcmdpbl90b3AiPnsjc3R5bGVfZGxnLnRvcH08L2xhYmVsPjwvdGQ+CgkJCQk8dGQ+CgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYm94X21hcmdpbl90b3AiIG5hbWU9ImJveF9tYXJnaW5fdG9wIiBjbGFzcz0ibWNlRWRpdGFibGVTZWxlY3QiIC8+PC90ZD4KCQkJCQkJCTx0ZD4mbmJzcDs8L3RkPgoJCQkJCQkJPHRkPjxzZWxlY3QgaWQ9ImJveF9tYXJnaW5fdG9wX21lYXN1cmVtZW50IiBuYW1lPSJib3hfbWFyZ2luX3RvcF9tZWFzdXJlbWVudCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJPHRyPgoJCQkJPHRkPjxsYWJlbCBmb3I9ImJveF9tYXJnaW5fcmlnaHQiPnsjc3R5bGVfZGxnLnJpZ2h0fTwvbGFiZWw+PC90ZD4KCQkJCTx0ZD4KCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJib3hfbWFyZ2luX3JpZ2h0IiBuYW1lPSJib3hfbWFyZ2luX3JpZ2h0IiBjbGFzcz0ibWNlRWRpdGFibGVTZWxlY3QiIGRpc2FibGVkPSJkaXNhYmxlZCIgLz48L3RkPgoJCQkJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0iYm94X21hcmdpbl9yaWdodF9tZWFzdXJlbWVudCIgbmFtZT0iYm94X21hcmdpbl9yaWdodF9tZWFzdXJlbWVudCIgZGlzYWJsZWQ9ImRpc2FibGVkIj48L3NlbGVjdD48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgkJCQk8L3RkPgoJCQk8L3RyPgoJCQk8dHI+CgkJCQk8dGQ+PGxhYmVsIGZvcj0iYm94X21hcmdpbl9ib3R0b20iPnsjc3R5bGVfZGxnLmJvdHRvbX08L2xhYmVsPjwvdGQ+CgkJCQk8dGQ+CgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYm94X21hcmdpbl9ib3R0b20iIG5hbWU9ImJveF9tYXJnaW5fYm90dG9tIiBjbGFzcz0ibWNlRWRpdGFibGVTZWxlY3QiIGRpc2FibGVkPSJkaXNhYmxlZCIgLz48L3RkPgoJCQkJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0iYm94X21hcmdpbl9ib3R0b21fbWVhc3VyZW1lbnQiIG5hbWU9ImJveF9tYXJnaW5fYm90dG9tX21lYXN1cmVtZW50IiBkaXNhYmxlZD0iZGlzYWJsZWQiPjwvc2VsZWN0PjwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvdGQ+CgkJCTwvdHI+CgkJCTx0cj4KCQkJCTx0ZD48bGFiZWwgZm9yPSJib3hfbWFyZ2luX2xlZnQiPnsjc3R5bGVfZGxnLmxlZnR9PC9sYWJlbD48L3RkPgoJCQkJPHRkPgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImJveF9tYXJnaW5fbGVmdCIgbmFtZT0iYm94X21hcmdpbl9sZWZ0IiBjbGFzcz0ibWNlRWRpdGFibGVTZWxlY3QiIGRpc2FibGVkPSJkaXNhYmxlZCIgLz48L3RkPgoJCQkJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0iYm94X21hcmdpbl9sZWZ0X21lYXN1cmVtZW50IiBuYW1lPSJib3hfbWFyZ2luX2xlZnRfbWVhc3VyZW1lbnQiIGRpc2FibGVkPSJkaXNhYmxlZCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC90ZD4KCQkJPC90cj4KCQk8L3RhYmxlPgoJPC9maWVsZHNldD4KPC9kaXY+CjxiciBzdHlsZT0iY2xlYXI6IGJvdGgiIC8+CjwvZGl2PgoKPGRpdiBpZD0iYm9yZGVyX3BhbmVsIiBjbGFzcz0icGFuZWwiPgo8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KPHRyPgoJPHRkIGNsYXNzPSJ0ZGVsaW0iPiZuYnNwOzwvdGQ+Cgk8dGQgY2xhc3M9InRkZWxpbSBkZWxpbSI+Jm5ic3A7PC90ZD4KCTx0ZCBjbGFzcz0idGRlbGltIj57I3N0eWxlX2RsZy5zdHlsZX08L3RkPgoJPHRkIGNsYXNzPSJ0ZGVsaW0gZGVsaW0iPiZuYnNwOzwvdGQ+Cgk8dGQgY2xhc3M9InRkZWxpbSI+eyNzdHlsZV9kbGcud2lkdGh9PC90ZD4KCTx0ZCBjbGFzcz0idGRlbGltIGRlbGltIj4mbmJzcDs8L3RkPgoJPHRkIGNsYXNzPSJ0ZGVsaW0iPnsjc3R5bGVfZGxnLmNvbG9yfTwvdGQ+CjwvdHI+Cgo8dHI+Cgk8dGQ+Jm5ic3A7PC90ZD4KCTx0ZCBjbGFzcz0iZGVsaW0iPiZuYnNwOzwvdGQ+Cgk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iYm9yZGVyX3N0eWxlX3NhbWUiIG5hbWU9ImJvcmRlcl9zdHlsZV9zYW1lIiBjbGFzcz0iY2hlY2tib3giIGNoZWNrZWQ9ImNoZWNrZWQiIG9uQ2xpY2s9InRvZ2dsZVNhbWUodGhpcywnYm9yZGVyX3N0eWxlJyk7IiAvPiA8bGFiZWwgZm9yPSJib3JkZXJfc3R5bGVfc2FtZSI+eyNzdHlsZV9kbGcuc2FtZX08L2xhYmVsPjwvdGQ+Cgk8dGQgY2xhc3M9ImRlbGltIj4mbmJzcDs8L3RkPgoJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImJvcmRlcl93aWR0aF9zYW1lIiBuYW1lPSJib3JkZXJfd2lkdGhfc2FtZSIgY2xhc3M9ImNoZWNrYm94IiBjaGVja2VkPSJjaGVja2VkIiBvbkNsaWNrPSJ0b2dnbGVTYW1lKHRoaXMsJ2JvcmRlcl93aWR0aCcpOyIgLz4gPGxhYmVsIGZvcj0iYm9yZGVyX3dpZHRoX3NhbWUiPnsjc3R5bGVfZGxnLnNhbWV9PC9sYWJlbD48L3RkPgoJPHRkIGNsYXNzPSJkZWxpbSI+Jm5ic3A7PC90ZD4KCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJib3JkZXJfY29sb3Jfc2FtZSIgbmFtZT0iYm9yZGVyX2NvbG9yX3NhbWUiIGNsYXNzPSJjaGVja2JveCIgY2hlY2tlZD0iY2hlY2tlZCIgb25DbGljaz0idG9nZ2xlU2FtZSh0aGlzLCdib3JkZXJfY29sb3InKTsiIC8+IDxsYWJlbCBmb3I9ImJvcmRlcl9jb2xvcl9zYW1lIj57I3N0eWxlX2RsZy5zYW1lfTwvbGFiZWw+PC90ZD4KPC90cj4KCjx0cj4KCTx0ZD57I3N0eWxlX2RsZy50b3B9PC90ZD4KCTx0ZCBjbGFzcz0iZGVsaW0iPiZuYnNwOzwvdGQ+Cgk8dGQ+PHNlbGVjdCBpZD0iYm9yZGVyX3N0eWxlX3RvcCIgbmFtZT0iYm9yZGVyX3N0eWxlX3RvcCIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD48L3RkPgoJPHRkIGNsYXNzPSJkZWxpbSI+Jm5ic3A7PC90ZD4KCTx0ZD4KCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQk8dHI+CgkJCQk8dGQ+PHNlbGVjdCBpZD0iYm9yZGVyX3dpZHRoX3RvcCIgbmFtZT0iYm9yZGVyX3dpZHRoX3RvcCIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD48L3RkPgoJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQk8dGQ+PHNlbGVjdCBpZD0iYm9yZGVyX3dpZHRoX3RvcF9tZWFzdXJlbWVudCIgbmFtZT0iYm9yZGVyX3dpZHRoX3RvcF9tZWFzdXJlbWVudCI+PC9zZWxlY3Q+PC90ZD4KCQkJPC90cj4KCQk8L3RhYmxlPgoJPC90ZD4KCTx0ZCBjbGFzcz0iZGVsaW0iPiZuYnNwOzwvdGQ+Cgk8dGQ+CgkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJPHRyPgoJCQkJPHRkPjxpbnB1dCBpZD0iYm9yZGVyX2NvbG9yX3RvcCIgbmFtZT0iYm9yZGVyX2NvbG9yX3RvcCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iOSIgb25DaGFuZ2U9InVwZGF0ZUNvbG9yKCdib3JkZXJfY29sb3JfdG9wX3BpY2snLCdib3JkZXJfY29sb3JfdG9wJyk7IiAvPjwvdGQ+CgkJCQk8dGQgaWQ9ImJvcmRlcl9jb2xvcl90b3BfcGlja2NvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJPC90cj4KCQk8L3RhYmxlPgoJPC90ZD4KPC90cj4KCjx0cj4KCTx0ZD57I3N0eWxlX2RsZy5yaWdodH08L3RkPgoJPHRkIGNsYXNzPSJkZWxpbSI+Jm5ic3A7PC90ZD4KCTx0ZD48c2VsZWN0IGlkPSJib3JkZXJfc3R5bGVfcmlnaHQiIG5hbWU9ImJvcmRlcl9zdHlsZV9yaWdodCIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0IiBkaXNhYmxlZD0iZGlzYWJsZWQiPjwvc2VsZWN0PjwvdGQ+Cgk8dGQgY2xhc3M9ImRlbGltIj4mbmJzcDs8L3RkPgoJPHRkPgoJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCTx0cj4KCQkJCTx0ZD48c2VsZWN0IGlkPSJib3JkZXJfd2lkdGhfcmlnaHQiIG5hbWU9ImJvcmRlcl93aWR0aF9yaWdodCIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0IiBkaXNhYmxlZD0iZGlzYWJsZWQiPjwvc2VsZWN0PjwvdGQ+CgkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCTx0ZD48c2VsZWN0IGlkPSJib3JkZXJfd2lkdGhfcmlnaHRfbWVhc3VyZW1lbnQiIG5hbWU9ImJvcmRlcl93aWR0aF9yaWdodF9tZWFzdXJlbWVudCIgZGlzYWJsZWQ9ImRpc2FibGVkIj48L3NlbGVjdD48L3RkPgoJCQk8L3RyPgoJCTwvdGFibGU+Cgk8L3RkPgoJPHRkIGNsYXNzPSJkZWxpbSI+Jm5ic3A7PC90ZD4KCTx0ZD4KCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQk8dHI+CgkJCQk8dGQ+PGlucHV0IGlkPSJib3JkZXJfY29sb3JfcmlnaHQiIG5hbWU9ImJvcmRlcl9jb2xvcl9yaWdodCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iOSIgb25DaGFuZ2U9InVwZGF0ZUNvbG9yKCdib3JkZXJfY29sb3JfcmlnaHRfcGljaycsJ2JvcmRlcl9jb2xvcl9yaWdodCcpOyIgZGlzYWJsZWQ9ImRpc2FibGVkIiAvPjwvdGQ+CgkJCQk8dGQgaWQ9ImJvcmRlcl9jb2xvcl9yaWdodF9waWNrY29udGFpbmVyIj4mbmJzcDs8L3RkPgoJCQk8L3RyPgoJCTwvdGFibGU+Cgk8L3RkPgo8L3RyPgoKPHRyPgoJPHRkPnsjc3R5bGVfZGxnLmJvdHRvbX08L3RkPgoJPHRkIGNsYXNzPSJkZWxpbSI+Jm5ic3A7PC90ZD4KCTx0ZD48c2VsZWN0IGlkPSJib3JkZXJfc3R5bGVfYm90dG9tIiBuYW1lPSJib3JkZXJfc3R5bGVfYm90dG9tIiBjbGFzcz0ibWNlRWRpdGFibGVTZWxlY3QiIGRpc2FibGVkPSJkaXNhYmxlZCI+PC9zZWxlY3Q+PC90ZD4KCTx0ZCBjbGFzcz0iZGVsaW0iPiZuYnNwOzwvdGQ+Cgk8dGQ+CgkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJPHRyPgoJCQkJPHRkPjxzZWxlY3QgaWQ9ImJvcmRlcl93aWR0aF9ib3R0b20iIG5hbWU9ImJvcmRlcl93aWR0aF9ib3R0b20iIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCIgZGlzYWJsZWQ9ImRpc2FibGVkIj48L3NlbGVjdD48L3RkPgoJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQk8dGQ+PHNlbGVjdCBpZD0iYm9yZGVyX3dpZHRoX2JvdHRvbV9tZWFzdXJlbWVudCIgbmFtZT0iYm9yZGVyX3dpZHRoX2JvdHRvbV9tZWFzdXJlbWVudCIgZGlzYWJsZWQ9ImRpc2FibGVkIj48L3NlbGVjdD48L3RkPgoJCQk8L3RyPgoJCTwvdGFibGU+Cgk8L3RkPgoJPHRkIGNsYXNzPSJkZWxpbSI+Jm5ic3A7PC90ZD4KCTx0ZD4KCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQk8dHI+CgkJCQk8dGQ+PGlucHV0IGlkPSJib3JkZXJfY29sb3JfYm90dG9tIiBuYW1lPSJib3JkZXJfY29sb3JfYm90dG9tIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzaXplPSI5IiBvbkNoYW5nZT0idXBkYXRlQ29sb3IoJ2JvcmRlcl9jb2xvcl9ib3R0b21fcGljaycsJ2JvcmRlcl9jb2xvcl9ib3R0b20nKTsiIGRpc2FibGVkPSJkaXNhYmxlZCIgLz48L3RkPgoJCQkJPHRkIGlkPSJib3JkZXJfY29sb3JfYm90dG9tX3BpY2tjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCTwvdHI+CgkJPC90YWJsZT4KCTwvdGQ+CjwvdHI+Cgo8dHI+Cgk8dGQ+eyNzdHlsZV9kbGcubGVmdH08L3RkPgoJPHRkIGNsYXNzPSJkZWxpbSI+Jm5ic3A7PC90ZD4KCTx0ZD48c2VsZWN0IGlkPSJib3JkZXJfc3R5bGVfbGVmdCIgbmFtZT0iYm9yZGVyX3N0eWxlX2xlZnQiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCIgZGlzYWJsZWQ9ImRpc2FibGVkIj48L3NlbGVjdD48L3RkPgoJPHRkIGNsYXNzPSJkZWxpbSI+Jm5ic3A7PC90ZD4KCTx0ZD4KCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQk8dHI+CgkJCQk8dGQ+PHNlbGVjdCBpZD0iYm9yZGVyX3dpZHRoX2xlZnQiIG5hbWU9ImJvcmRlcl93aWR0aF9sZWZ0IiBjbGFzcz0ibWNlRWRpdGFibGVTZWxlY3QiIGRpc2FibGVkPSJkaXNhYmxlZCI+PC9zZWxlY3Q+PC90ZD4KCQkJCTx0ZD4mbmJzcDs8L3RkPgoJCQkJPHRkPjxzZWxlY3QgaWQ9ImJvcmRlcl93aWR0aF9sZWZ0X21lYXN1cmVtZW50IiBuYW1lPSJib3JkZXJfd2lkdGhfbGVmdF9tZWFzdXJlbWVudCIgZGlzYWJsZWQ9ImRpc2FibGVkIj48L3NlbGVjdD48L3RkPgoJCQk8L3RyPgoJCTwvdGFibGU+Cgk8L3RkPgoJPHRkIGNsYXNzPSJkZWxpbSI+Jm5ic3A7PC90ZD4KCTx0ZD4KCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQk8dHI+CgkJCQk8dGQ+PGlucHV0IGlkPSJib3JkZXJfY29sb3JfbGVmdCIgbmFtZT0iYm9yZGVyX2NvbG9yX2xlZnQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHNpemU9IjkiIG9uQ2hhbmdlPSJ1cGRhdGVDb2xvcignYm9yZGVyX2NvbG9yX2xlZnRfcGljaycsJ2JvcmRlcl9jb2xvcl9sZWZ0Jyk7IiBkaXNhYmxlZD0iZGlzYWJsZWQiIC8+PC90ZD4KCQkJCTx0ZCBpZD0iYm9yZGVyX2NvbG9yX2xlZnRfcGlja2NvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJPC90cj4KCQk8L3RhYmxlPgoJPC90ZD4KPC90cj4KPC90YWJsZT4KPC9kaXY+Cgo8ZGl2IGlkPSJsaXN0X3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJPHRhYmxlIGJvcmRlcj0iMCI+CgkJPHRyPgoJCQk8dGQ+PGxhYmVsIGZvcj0ibGlzdF90eXBlIj57I3N0eWxlX2RsZy5saXN0X3R5cGV9PC9sYWJlbD48L3RkPgoJCQk8dGQ+PHNlbGVjdCBpZD0ibGlzdF90eXBlIiBuYW1lPSJsaXN0X3R5cGUiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCI+PC9zZWxlY3Q+PC90ZD4KCQk8L3RyPgoKCQk8dHI+CgkJCTx0ZD48bGFiZWwgZm9yPSJsaXN0X2J1bGxldF9pbWFnZSI+eyNzdHlsZV9kbGcuYnVsbGV0X2ltYWdlfTwvbGFiZWw+PC90ZD4KCQkJPHRkPjxpbnB1dCBpZD0ibGlzdF9idWxsZXRfaW1hZ2UiIG5hbWU9Imxpc3RfYnVsbGV0X2ltYWdlIiB0eXBlPSJ0ZXh0IiAvPjwvdGQ+CgkJPC90cj4KCgkJPHRyPgoJCQk8dGQ+PGxhYmVsIGZvcj0ibGlzdF9wb3NpdGlvbiI+eyNzdHlsZV9kbGcucG9zaXRpb259PC9sYWJlbD48L3RkPgoJCQk8dGQ+PHNlbGVjdCBpZD0ibGlzdF9wb3NpdGlvbiIgbmFtZT0ibGlzdF9wb3NpdGlvbiIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD48L3RkPgoJCTwvdHI+Cgk8L3RhYmxlPgo8L2Rpdj4KCjxkaXYgaWQ9InBvc2l0aW9uaW5nX3BhbmVsIiBjbGFzcz0icGFuZWwiPgo8dGFibGUgYm9yZGVyPSIwIj4KCTx0cj4KCQk8dGQ+PGxhYmVsIGZvcj0icG9zaXRpb25pbmdfdHlwZSI+eyNzdHlsZV9kbGcucG9zaXRpb25pbmdfdHlwZX08L2xhYmVsPjwvdGQ+CgkJPHRkPjxzZWxlY3QgaWQ9InBvc2l0aW9uaW5nX3R5cGUiIG5hbWU9InBvc2l0aW9uaW5nX3R5cGUiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCI+PC9zZWxlY3Q+PC90ZD4KCQk8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGxhYmVsIGZvcj0icG9zaXRpb25pbmdfdmlzaWJpbGl0eSI+eyNzdHlsZV9kbGcudmlzaWJpbGl0eX08L2xhYmVsPjwvdGQ+CgkJPHRkPjxzZWxlY3QgaWQ9InBvc2l0aW9uaW5nX3Zpc2liaWxpdHkiIG5hbWU9InBvc2l0aW9uaW5nX3Zpc2liaWxpdHkiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCI+PC9zZWxlY3Q+PC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD48bGFiZWwgZm9yPSJwb3NpdGlvbmluZ193aWR0aCI+eyNzdHlsZV9kbGcud2lkdGh9PC9sYWJlbD48L3RkPgoJCTx0ZD4KCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCTx0cj4KCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJwb3NpdGlvbmluZ193aWR0aCIgbmFtZT0icG9zaXRpb25pbmdfd2lkdGgiIG9uQ2hhbmdlPSJzeW5jaCgncG9zaXRpb25pbmdfd2lkdGgnLCdib3hfd2lkdGgnKTsiIC8+PC90ZD4KCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCQk8dGQ+PHNlbGVjdCBpZD0icG9zaXRpb25pbmdfd2lkdGhfbWVhc3VyZW1lbnQiIG5hbWU9InBvc2l0aW9uaW5nX3dpZHRoX21lYXN1cmVtZW50Ij48L3NlbGVjdD48L3RkPgoJCQkJPC90cj4KCQkJPC90YWJsZT4KCQk8L3RkPgoJCTx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs8bGFiZWwgZm9yPSJwb3NpdGlvbmluZ196aW5kZXgiPnsjc3R5bGVfZGxnLnppbmRleH08L2xhYmVsPjwvdGQ+CgkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icG9zaXRpb25pbmdfemluZGV4IiBuYW1lPSJwb3NpdGlvbmluZ196aW5kZXgiIC8+PC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD48bGFiZWwgZm9yPSJwb3NpdGlvbmluZ19oZWlnaHQiPnsjc3R5bGVfZGxnLmhlaWdodH08L2xhYmVsPjwvdGQ+CgkJPHRkPgoJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQkJPHRyPgoJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InBvc2l0aW9uaW5nX2hlaWdodCIgbmFtZT0icG9zaXRpb25pbmdfaGVpZ2h0IiBvbkNoYW5nZT0ic3luY2goJ3Bvc2l0aW9uaW5nX2hlaWdodCcsJ2JveF9oZWlnaHQnKTsiIC8+PC90ZD4KCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCQk8dGQ+PHNlbGVjdCBpZD0icG9zaXRpb25pbmdfaGVpZ2h0X21lYXN1cmVtZW50IiBuYW1lPSJwb3NpdGlvbmluZ19oZWlnaHRfbWVhc3VyZW1lbnQiPjwvc2VsZWN0PjwvdGQ+CgkJCQk8L3RyPgoJCQk8L3RhYmxlPgoJCTwvdGQ+CgkJPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzxsYWJlbCBmb3I9InBvc2l0aW9uaW5nX292ZXJmbG93Ij57I3N0eWxlX2RsZy5vdmVyZmxvd308L2xhYmVsPjwvdGQ+CgkJPHRkPjxzZWxlY3QgaWQ9InBvc2l0aW9uaW5nX292ZXJmbG93IiBuYW1lPSJwb3NpdGlvbmluZ19vdmVyZmxvdyIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij48L3NlbGVjdD48L3RkPgoJPC90cj4KPC90YWJsZT4KCjxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogNDklIj4KCTxmaWVsZHNldD4KCQk8bGVnZW5kPnsjc3R5bGVfZGxnLnBsYWNlbWVudH08L2xlZ2VuZD4KCgkJPHRhYmxlIGJvcmRlcj0iMCI+CgkJCTx0cj4KCQkJCTx0ZD4mbmJzcDs8L3RkPgoJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InBvc2l0aW9uaW5nX3BsYWNlbWVudF9zYW1lIiBuYW1lPSJwb3NpdGlvbmluZ19wbGFjZW1lbnRfc2FtZSIgY2xhc3M9ImNoZWNrYm94IiBjaGVja2VkPSJjaGVja2VkIiBvbkNsaWNrPSJ0b2dnbGVTYW1lKHRoaXMsJ3Bvc2l0aW9uaW5nX3BsYWNlbWVudCcpOyIgLz4gPGxhYmVsIGZvcj0icG9zaXRpb25pbmdfcGxhY2VtZW50X3NhbWUiPnsjc3R5bGVfZGxnLnNhbWV9PC9sYWJlbD48L3RkPgoJCQk8L3RyPgoJCQk8dHI+CgkJCQk8dGQ+eyNzdHlsZV9kbGcudG9wfTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icG9zaXRpb25pbmdfcGxhY2VtZW50X3RvcCIgbmFtZT0icG9zaXRpb25pbmdfcGxhY2VtZW50X3RvcCIgLz48L3RkPgoJCQkJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0icG9zaXRpb25pbmdfcGxhY2VtZW50X3RvcF9tZWFzdXJlbWVudCIgbmFtZT0icG9zaXRpb25pbmdfcGxhY2VtZW50X3RvcF9tZWFzdXJlbWVudCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJPHRyPgoJCQkJPHRkPnsjc3R5bGVfZGxnLnJpZ2h0fTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icG9zaXRpb25pbmdfcGxhY2VtZW50X3JpZ2h0IiBuYW1lPSJwb3NpdGlvbmluZ19wbGFjZW1lbnRfcmlnaHQiIGRpc2FibGVkPSJkaXNhYmxlZCIgLz48L3RkPgoJCQkJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0icG9zaXRpb25pbmdfcGxhY2VtZW50X3JpZ2h0X21lYXN1cmVtZW50IiBuYW1lPSJwb3NpdGlvbmluZ19wbGFjZW1lbnRfcmlnaHRfbWVhc3VyZW1lbnQiIGRpc2FibGVkPSJkaXNhYmxlZCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJPHRyPgoJCQkJPHRkPnsjc3R5bGVfZGxnLmJvdHRvbX08L3RkPgoJCQkJPHRkPgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InBvc2l0aW9uaW5nX3BsYWNlbWVudF9ib3R0b20iIG5hbWU9InBvc2l0aW9uaW5nX3BsYWNlbWVudF9ib3R0b20iIGRpc2FibGVkPSJkaXNhYmxlZCIgLz48L3RkPgoJCQkJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0icG9zaXRpb25pbmdfcGxhY2VtZW50X2JvdHRvbV9tZWFzdXJlbWVudCIgbmFtZT0icG9zaXRpb25pbmdfcGxhY2VtZW50X2JvdHRvbV9tZWFzdXJlbWVudCIgZGlzYWJsZWQ9ImRpc2FibGVkIj48L3NlbGVjdD48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgkJCQk8L3RkPgoJCQk8L3RyPgoJCQk8dHI+CgkJCQk8dGQ+eyNzdHlsZV9kbGcubGVmdH08L3RkPgoJCQkJPHRkPgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InBvc2l0aW9uaW5nX3BsYWNlbWVudF9sZWZ0IiBuYW1lPSJwb3NpdGlvbmluZ19wbGFjZW1lbnRfbGVmdCIgZGlzYWJsZWQ9ImRpc2FibGVkIiAvPjwvdGQ+CgkJCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJwb3NpdGlvbmluZ19wbGFjZW1lbnRfbGVmdF9tZWFzdXJlbWVudCIgbmFtZT0icG9zaXRpb25pbmdfcGxhY2VtZW50X2xlZnRfbWVhc3VyZW1lbnQiIGRpc2FibGVkPSJkaXNhYmxlZCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC90ZD4KCQkJPC90cj4KCQk8L3RhYmxlPgoJPC9maWVsZHNldD4KPC9kaXY+Cgo8ZGl2IHN0eWxlPSJmbG9hdDogcmlnaHQ7IHdpZHRoOiA0OSUiPgoJPGZpZWxkc2V0PgoJCTxsZWdlbmQ+eyNzdHlsZV9kbGcuY2xpcH08L2xlZ2VuZD4KCgkJPHRhYmxlIGJvcmRlcj0iMCI+CgkJCTx0cj4KCQkJCTx0ZD4mbmJzcDs8L3RkPgoJCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InBvc2l0aW9uaW5nX2NsaXBfc2FtZSIgbmFtZT0icG9zaXRpb25pbmdfY2xpcF9zYW1lIiBjbGFzcz0iY2hlY2tib3giIGNoZWNrZWQ9ImNoZWNrZWQiIG9uQ2xpY2s9InRvZ2dsZVNhbWUodGhpcywncG9zaXRpb25pbmdfY2xpcCcpOyIgLz4gPGxhYmVsIGZvcj0icG9zaXRpb25pbmdfY2xpcF9zYW1lIj57I3N0eWxlX2RsZy5zYW1lfTwvbGFiZWw+PC90ZD4KCQkJPC90cj4KCQkJPHRyPgoJCQkJPHRkPnsjc3R5bGVfZGxnLnRvcH08L3RkPgoJCQkJPHRkPgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InBvc2l0aW9uaW5nX2NsaXBfdG9wIiBuYW1lPSJwb3NpdGlvbmluZ19jbGlwX3RvcCIgLz48L3RkPgoJCQkJCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCQkJCQk8dGQ+PHNlbGVjdCBpZD0icG9zaXRpb25pbmdfY2xpcF90b3BfbWVhc3VyZW1lbnQiIG5hbWU9InBvc2l0aW9uaW5nX2NsaXBfdG9wX21lYXN1cmVtZW50Ij48L3NlbGVjdD48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgkJCQk8L3RkPgoJCQk8L3RyPgoJCQk8dHI+CgkJCQk8dGQ+eyNzdHlsZV9kbGcucmlnaHR9PC90ZD4KCQkJCTx0ZD4KCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJwb3NpdGlvbmluZ19jbGlwX3JpZ2h0IiBuYW1lPSJwb3NpdGlvbmluZ19jbGlwX3JpZ2h0IiBkaXNhYmxlZD0iZGlzYWJsZWQiIC8+PC90ZD4KCQkJCQkJCTx0ZD4mbmJzcDs8L3RkPgoJCQkJCQkJPHRkPjxzZWxlY3QgaWQ9InBvc2l0aW9uaW5nX2NsaXBfcmlnaHRfbWVhc3VyZW1lbnQiIG5hbWU9InBvc2l0aW9uaW5nX2NsaXBfcmlnaHRfbWVhc3VyZW1lbnQiIGRpc2FibGVkPSJkaXNhYmxlZCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJPHRyPgoJCQkJPHRkPnsjc3R5bGVfZGxnLmJvdHRvbX08L3RkPgoJCQkJPHRkPgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InBvc2l0aW9uaW5nX2NsaXBfYm90dG9tIiBuYW1lPSJwb3NpdGlvbmluZ19jbGlwX2JvdHRvbSIgZGlzYWJsZWQ9ImRpc2FibGVkIiAvPjwvdGQ+CgkJCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJwb3NpdGlvbmluZ19jbGlwX2JvdHRvbV9tZWFzdXJlbWVudCIgbmFtZT0icG9zaXRpb25pbmdfY2xpcF9ib3R0b21fbWVhc3VyZW1lbnQiIGRpc2FibGVkPSJkaXNhYmxlZCI+PC9zZWxlY3Q+PC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJPHRyPgoJCQkJPHRkPnsjc3R5bGVfZGxnLmxlZnR9PC90ZD4KCQkJCTx0ZD4KCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJwb3NpdGlvbmluZ19jbGlwX2xlZnQiIG5hbWU9InBvc2l0aW9uaW5nX2NsaXBfbGVmdCIgZGlzYWJsZWQ9ImRpc2FibGVkIiAvPjwvdGQ+CgkJCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJCQkJCTx0ZD48c2VsZWN0IGlkPSJwb3NpdGlvbmluZ19jbGlwX2xlZnRfbWVhc3VyZW1lbnQiIG5hbWU9InBvc2l0aW9uaW5nX2NsaXBfbGVmdF9tZWFzdXJlbWVudCIgZGlzYWJsZWQ9ImRpc2FibGVkIj48L3NlbGVjdD48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgkJCQk8L3RkPgoJCQk8L3RyPgoJCTwvdGFibGU+Cgk8L2ZpZWxkc2V0Pgo8L2Rpdj4KPGJyIHN0eWxlPSJjbGVhcjogYm90aCIgLz4KPC9kaXY+CjwvZGl2PgoKPGRpdiBjbGFzcz0ibWNlQWN0aW9uUGFuZWwiPgoJPGlucHV0IHR5cGU9InN1Ym1pdCIgaWQ9Imluc2VydCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0ieyN1cGRhdGV9IiAvPgoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ1dHRvbiIgaWQ9ImFwcGx5IiBuYW1lPSJhcHBseSIgdmFsdWU9Insjc3R5bGVfZGxnLmFwcGx5fSIgb25DbGljaz0iYXBwbHlBY3Rpb24oKTsiIC8+Cgk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iY2FuY2VsIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJ7I2NhbmNlbH0iIG9uQ2xpY2s9InRpbnlNQ0VQb3B1cC5jbG9zZSgpOyIgLz4KPC9kaXY+CjwvZm9ybT4KCjxkaXYgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgoJPGRpdiBpZD0iY29udGFpbmVyIj48L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/tabfocus/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/tabfocus/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dmFyIGM9dGlueW1jZS5ET00sYT10aW55bWNlLmRvbS5FdmVudCxkPXRpbnltY2UuZWFjaCxiPXRpbnltY2UuZXhwbG9kZTt0aW55bWNlLmNyZWF0ZSgidGlueW1jZS5wbHVnaW5zLlRhYkZvY3VzUGx1Z2luIix7aW5pdDpmdW5jdGlvbihmLGcpe2Z1bmN0aW9uIGUoaSxqKXtpZihqLmtleUNvZGU9PT05KXtyZXR1cm4gYS5jYW5jZWwoail9fWZ1bmN0aW9uIGgobCxwKXt2YXIgaixtLG8sbixrO2Z1bmN0aW9uIHEoaSl7bz1jLmdldFBhcmVudChsLmlkLCJmb3JtIik7bj1vLmVsZW1lbnRzO2lmKG8pe2QobixmdW5jdGlvbihzLHIpe2lmKHMuaWQ9PWwuaWQpe2o9cjtyZXR1cm4gZmFsc2V9fSk7aWYoaT4wKXtmb3IobT1qKzE7bTxuLmxlbmd0aDttKyspe2lmKG5bbV0udHlwZSE9ImhpZGRlbiIpe3JldHVybiBuW21dfX19ZWxzZXtmb3IobT1qLTE7bT49MDttLS0pe2lmKG5bbV0udHlwZSE9ImhpZGRlbiIpe3JldHVybiBuW21dfX19fXJldHVybiBudWxsfWlmKHAua2V5Q29kZT09PTkpe2s9YihsLmdldFBhcmFtKCJ0YWJfZm9jdXMiLGwuZ2V0UGFyYW0oInRhYmZvY3VzX2VsZW1lbnRzIiwiOnByZXYsOm5leHQiKSkpO2lmKGsubGVuZ3RoPT0xKXtrWzFdPWtbMF07a1swXT0iOnByZXYifWlmKHAuc2hpZnRLZXkpe2lmKGtbMF09PSI6cHJldiIpe249cSgtMSl9ZWxzZXtuPWMuZ2V0KGtbMF0pfX1lbHNle2lmKGtbMV09PSI6bmV4dCIpe249cSgxKX1lbHNle249Yy5nZXQoa1sxXSl9fWlmKG4pe2lmKGw9dGlueW1jZS5nZXQobi5pZHx8bi5uYW1lKSl7bC5mb2N1cygpfWVsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt3aW5kb3cuZm9jdXMoKTtuLmZvY3VzKCl9LDEwKX1yZXR1cm4gYS5jYW5jZWwocCl9fX1mLm9uS2V5VXAuYWRkKGUpO2lmKHRpbnltY2UuaXNHZWNrbyl7Zi5vbktleVByZXNzLmFkZChoKTtmLm9uS2V5RG93bi5hZGQoZSl9ZWxzZXtmLm9uS2V5RG93bi5hZGQoaCl9Zi5vbkluaXQuYWRkKGZ1bmN0aW9uKCl7ZChjLnNlbGVjdCgiYTpmaXJzdCxhOmxhc3QiLGYuZ2V0Q29udGFpbmVyKCkpLGZ1bmN0aW9uKGkpe2EuYWRkKGksImZvY3VzIixmdW5jdGlvbigpe2YuZm9jdXMoKX0pfSl9KX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiVGFiZm9jdXMiLGF1dGhvcjoiTW94aWVjb2RlIFN5c3RlbXMgQUIiLGF1dGhvcnVybDoiaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbSIsaW5mb3VybDoiaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL3RhYmZvY3VzIix2ZXJzaW9uOnRpbnltY2UubWFqb3JWZXJzaW9uKyIuIit0aW55bWNlLm1pbm9yVmVyc2lvbn19fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgidGFiZm9jdXMiLHRpbnltY2UucGx1Z2lucy5UYWJGb2N1c1BsdWdpbil9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/tabfocus/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIGVhY2ggPSB0aW55bWNlLmVhY2gsIGV4cGxvZGUgPSB0aW55bWNlLmV4cGxvZGU7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLlRhYkZvY3VzUGx1Z2luJywgew0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJZnVuY3Rpb24gdGFiQ2FuY2VsKGVkLCBlKSB7DQoJCQkJaWYgKGUua2V5Q29kZSA9PT0gOSkNCgkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHRhYkhhbmRsZXIoZWQsIGUpIHsNCgkJCQl2YXIgeCwgaSwgZiwgZWwsIHY7DQoNCgkJCQlmdW5jdGlvbiBmaW5kKGQpIHsNCgkJCQkJZiA9IERPTS5nZXRQYXJlbnQoZWQuaWQsICdmb3JtJyk7DQoJCQkJCWVsID0gZi5lbGVtZW50czsNCg0KCQkJCQlpZiAoZikgew0KCQkJCQkJZWFjaChlbCwgZnVuY3Rpb24oZSwgaSkgew0KCQkJCQkJCWlmIChlLmlkID09IGVkLmlkKSB7DQoJCQkJCQkJCXggPSBpOw0KCQkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQkJfQ0KCQkJCQkJfSk7DQoNCgkJCQkJCWlmIChkID4gMCkgew0KCQkJCQkJCWZvciAoaSA9IHggKyAxOyBpIDwgZWwubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQkJaWYgKGVsW2ldLnR5cGUgIT0gJ2hpZGRlbicpDQoJCQkJCQkJCQlyZXR1cm4gZWxbaV07DQoJCQkJCQkJfQ0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQlmb3IgKGkgPSB4IC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJCQkJaWYgKGVsW2ldLnR5cGUgIT0gJ2hpZGRlbicpDQoJCQkJCQkJCQlyZXR1cm4gZWxbaV07DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJcmV0dXJuIG51bGw7DQoJCQkJfTsNCg0KCQkJCWlmIChlLmtleUNvZGUgPT09IDkpIHsNCgkJCQkJdiA9IGV4cGxvZGUoZWQuZ2V0UGFyYW0oJ3RhYl9mb2N1cycsIGVkLmdldFBhcmFtKCd0YWJmb2N1c19lbGVtZW50cycsICc6cHJldiw6bmV4dCcpKSk7DQoNCgkJCQkJaWYgKHYubGVuZ3RoID09IDEpIHsNCgkJCQkJCXZbMV0gPSB2WzBdOw0KCQkJCQkJdlswXSA9ICc6cHJldic7DQoJCQkJCX0NCg0KCQkJCQkvLyBGaW5kIGVsZW1lbnQgdG8gZm9jdXMNCgkJCQkJaWYgKGUuc2hpZnRLZXkpIHsNCgkJCQkJCWlmICh2WzBdID09ICc6cHJldicpDQoJCQkJCQkJZWwgPSBmaW5kKC0xKTsNCgkJCQkJCWVsc2UNCgkJCQkJCQllbCA9IERPTS5nZXQodlswXSk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlpZiAodlsxXSA9PSAnOm5leHQnKQ0KCQkJCQkJCWVsID0gZmluZCgxKTsNCgkJCQkJCWVsc2UNCgkJCQkJCQllbCA9IERPTS5nZXQodlsxXSk7DQoJCQkJCX0NCg0KCQkJCQlpZiAoZWwpIHsNCgkJCQkJCWlmIChlZCA9IHRpbnltY2UuZ2V0KGVsLmlkIHx8IGVsLm5hbWUpKQ0KCQkJCQkJCWVkLmZvY3VzKCk7DQoJCQkJCQllbHNlDQoJCQkJCQkJd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7d2luZG93LmZvY3VzKCk7ZWwuZm9jdXMoKTt9LCAxMCk7DQoNCgkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9Ow0KDQoJCQllZC5vbktleVVwLmFkZCh0YWJDYW5jZWwpOw0KDQoJCQlpZiAodGlueW1jZS5pc0dlY2tvKSB7DQoJCQkJZWQub25LZXlQcmVzcy5hZGQodGFiSGFuZGxlcik7DQoJCQkJZWQub25LZXlEb3duLmFkZCh0YWJDYW5jZWwpOw0KCQkJfSBlbHNlDQoJCQkJZWQub25LZXlEb3duLmFkZCh0YWJIYW5kbGVyKTsNCg0KCQkJZWQub25Jbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCQllYWNoKERPTS5zZWxlY3QoJ2E6Zmlyc3QsYTpsYXN0JywgZWQuZ2V0Q29udGFpbmVyKCkpLCBmdW5jdGlvbihuKSB7DQoJCQkJCUV2ZW50LmFkZChuLCAnZm9jdXMnLCBmdW5jdGlvbigpIHtlZC5mb2N1cygpO30pOw0KCQkJCX0pOw0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdUYWJmb2N1cycsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbScsDQoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvdGFiZm9jdXMnLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9DQoJfSk7DQoNCgkvLyBSZWdpc3RlciBwbHVnaW4NCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCd0YWJmb2N1cycsIHRpbnltY2UucGx1Z2lucy5UYWJGb2N1c1BsdWdpbik7DQp9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/cell.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjdGFibGVfZGxnLmNlbGxfdGl0bGV9PC90aXRsZT4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3RpbnlfbWNlX3BvcHVwLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL21jdGFicy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9mb3JtX3V0aWxzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL2VkaXRhYmxlX3NlbGVjdHMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvY2VsbC5qcyI+PC9zY3JpcHQ+Cgk8bGluayBocmVmPSJjc3MvY2VsbC5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+CjwvaGVhZD4KPGJvZHkgaWQ9InRhYmxlY2VsbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgoJPGZvcm0gb25zdWJtaXQ9InVwZGF0ZUFjdGlvbigpO3JldHVybiBmYWxzZTsiIGFjdGlvbj0iIyI+CgkJPGRpdiBjbGFzcz0idGFicyI+CgkJCTx1bD4KCQkJCTxsaSBpZD0iZ2VuZXJhbF90YWIiIGNsYXNzPSJjdXJyZW50Ij48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdnZW5lcmFsX3RhYicsJ2dlbmVyYWxfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I3RhYmxlX2RsZy5nZW5lcmFsX3RhYn08L2E+PC9zcGFuPjwvbGk+CgkJCQk8bGkgaWQ9ImFkdmFuY2VkX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignYWR2YW5jZWRfdGFiJywnYWR2YW5jZWRfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I3RhYmxlX2RsZy5hZHZhbmNlZF90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCQk8L3VsPgoJCTwvZGl2PgoKCQk8ZGl2IGNsYXNzPSJwYW5lbF93cmFwcGVyIj4KCQkJPGRpdiBpZD0iZ2VuZXJhbF9wYW5lbCIgY2xhc3M9InBhbmVsIGN1cnJlbnQiPgoJCQkJPGZpZWxkc2V0PgoJCQkJCTxsZWdlbmQ+eyN0YWJsZV9kbGcuZ2VuZXJhbF9wcm9wc308L2xlZ2VuZD4KCgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9ImFsaWduIj57I3RhYmxlX2RsZy5hbGlnbn08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHNlbGVjdCBpZD0iYWxpZ24iIG5hbWU9ImFsaWduIiBjbGFzcz0ibWNlRm9jdXMiPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY2VudGVyIj57I3RhYmxlX2RsZy5hbGlnbl9taWRkbGV9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImxlZnQiPnsjdGFibGVfZGxnLmFsaWduX2xlZnR9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InJpZ2h0Ij57I3RhYmxlX2RsZy5hbGlnbl9yaWdodH08L29wdGlvbj4KCQkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJCTwvdGQ+CgkJCgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iY2VsbHR5cGUiPnsjdGFibGVfZGxnLmNlbGxfdHlwZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHNlbGVjdCBpZD0iY2VsbHR5cGUiIG5hbWU9ImNlbGx0eXBlIj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idGQiPnsjdGFibGVfZGxnLnRkfTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJ0aCI+eyN0YWJsZV9kbGcudGh9PC9vcHRpb24+CgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InZhbGlnbiI+eyN0YWJsZV9kbGcudmFsaWdufTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD4KCQkJCQkJCQk8c2VsZWN0IGlkPSJ2YWxpZ24iIG5hbWU9InZhbGlnbiI+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJ0b3AiPnsjdGFibGVfZGxnLmFsaWduX3RvcH08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibWlkZGxlIj57I3RhYmxlX2RsZy5hbGlnbl9taWRkbGV9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImJvdHRvbSI+eyN0YWJsZV9kbGcuYWxpZ25fYm90dG9tfTwvb3B0aW9uPgoJCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQkJPC90ZD4KCgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0ic2NvcGUiPnsjdGFibGVfZGxnLnNjb3BlfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD4KCQkJCQkJCQk8c2VsZWN0IGlkPSJzY29wZSIgbmFtZT0ic2NvcGUiPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY29sIj57I3RhYmxlLmNvbH08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icm93Ij57I3RhYmxlLnJvd308L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icm93Z3JvdXAiPnsjdGFibGVfZGxnLnJvd2dyb3VwfTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJjb2xncm91cCI+eyN0YWJsZV9kbGcuY29sZ3JvdXB9PC9vcHRpb24+CgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPgoKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJ3aWR0aCI+eyN0YWJsZV9kbGcud2lkdGh9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCBpZD0id2lkdGgiIG5hbWU9IndpZHRoIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzaXplPSI0IiBtYXhsZW5ndGg9IjQiIG9uY2hhbmdlPSJjaGFuZ2VkU2l6ZSgpOyIgLz48L3RkPgoKCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJoZWlnaHQiPnsjdGFibGVfZGxnLmhlaWdodH08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJoZWlnaHQiIG5hbWU9ImhlaWdodCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iNCIgbWF4bGVuZ3RoPSI0IiBvbmNoYW5nZT0iY2hhbmdlZFNpemUoKTsiIC8+PC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0ciBpZD0ic3R5bGVTZWxlY3RSb3ciPgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9ImNsYXNzIj57I2NsYXNzX25hbWV9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkIGNvbHNwYW49IjMiPgoJCQkJCQkJCTxzZWxlY3QgaWQ9ImNsYXNzIiBuYW1lPSJjbGFzcyIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIiBzZWxlY3RlZD0ic2VsZWN0ZWQiPnsjbm90X3NldH08L29wdGlvbj4KCQkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgkJCTwvZGl2PgoKCQkJPGRpdiBpZD0iYWR2YW5jZWRfcGFuZWwiIGNsYXNzPSJwYW5lbCI+CgkJCQk8ZmllbGRzZXQ+CgkJCQkJPGxlZ2VuZD57I3RhYmxlX2RsZy5hZHZhbmNlZF9wcm9wc308L2xlZ2VuZD4KCgkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSI0Ij4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJpZCI+eyN0YWJsZV9kbGcuaWR9PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImlkIiBuYW1lPSJpZCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc3R5bGU9IndpZHRoOiAyMDBweCIgLz48L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJzdHlsZSI+eyN0YWJsZV9kbGcuc3R5bGV9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ic3R5bGUiIG5hbWU9InN0eWxlIiB2YWx1ZT0iIiBzdHlsZT0id2lkdGg6IDIwMHB4OyIgb25jaGFuZ2U9ImNoYW5nZWRTdHlsZSgpOyIgLz48L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJkaXIiPnsjdGFibGVfZGxnLmxhbmdkaXJ9PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD4KCQkJCQkJCQk8c2VsZWN0IGlkPSJkaXIiIG5hbWU9ImRpciIgc3R5bGU9IndpZHRoOiAyMDBweCI+IAoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+IAoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibHRyIj57I3RhYmxlX2RsZy5sdHJ9PC9vcHRpb24+IAoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icnRsIj57I3RhYmxlX2RsZy5ydGx9PC9vcHRpb24+IAoJCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQkJPC90ZD4gCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImxhbmciPnsjdGFibGVfZGxnLmxhbmdjb2RlfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+CgkJCQkJCQkJPGlucHV0IGlkPSJsYW5nIiBuYW1lPSJsYW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzdHlsZT0id2lkdGg6IDIwMHB4IiAvPgoJCQkJCQkJPC90ZD4gCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImJhY2tncm91bmRpbWFnZSI+eyN0YWJsZV9kbGcuYmdpbWFnZX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImJhY2tncm91bmRpbWFnZSIgbmFtZT0iYmFja2dyb3VuZGltYWdlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzdHlsZT0id2lkdGg6IDIwMHB4IiBvbmNoYW5nZT0iY2hhbmdlZEJhY2tncm91bmRJbWFnZSgpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkIGlkPSJiYWNrZ3JvdW5kaW1hZ2Vicm93c2VyY29udGFpbmVyIj4mbmJzcDs8L3RkPgoJCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTwvdGFibGU+CgkJCQkJCQk8L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iYm9yZGVyY29sb3IiPnsjdGFibGVfZGxnLmJvcmRlcmNvbG9yfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCBpZD0iYm9yZGVyY29sb3IiIG5hbWU9ImJvcmRlcmNvbG9yIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzaXplPSI5IiBvbmNoYW5nZT0idXBkYXRlQ29sb3IoJ2JvcmRlcmNvbG9yX3BpY2snLCdib3JkZXJjb2xvcicpO2NoYW5nZWRDb2xvcigpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkIGlkPSJib3JkZXJjb2xvcl9waWNrY29udGFpbmVyIj4mbmJzcDs8L3RkPgoJCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTwvdGFibGU+CgkJCQkJCQk8L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iYmdjb2xvciI+eyN0YWJsZV9kbGcuYmdjb2xvcn08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImJnY29sb3IiIG5hbWU9ImJnY29sb3IiIHR5cGU9InRleHQiIHZhbHVlPSIiIHNpemU9IjkiIG9uY2hhbmdlPSJ1cGRhdGVDb2xvcignYmdjb2xvcl9waWNrJywnYmdjb2xvcicpO2NoYW5nZWRDb2xvcigpOyIgLz48L3RkPgoJCQkJCQkJCQkJPHRkIGlkPSJiZ2NvbG9yX3BpY2tjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+IAoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgkJCQk8L2ZpZWxkc2V0PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCgkJPGRpdiBjbGFzcz0ibWNlQWN0aW9uUGFuZWwiPgoJCQk8ZGl2PgoJCQkJPHNlbGVjdCBpZD0iYWN0aW9uIiBuYW1lPSJhY3Rpb24iPgoJCQkJCTxvcHRpb24gdmFsdWU9ImNlbGwiPnsjdGFibGVfZGxnLmNlbGxfY2VsbH08L29wdGlvbj4KCQkJCQk8b3B0aW9uIHZhbHVlPSJyb3ciPnsjdGFibGVfZGxnLmNlbGxfcm93fTwvb3B0aW9uPgoJCQkJCTxvcHRpb24gdmFsdWU9ImFsbCI+eyN0YWJsZV9kbGcuY2VsbF9hbGx9PC9vcHRpb24+CgkJCQk8L3NlbGVjdD4KCQkJPC9kaXY+CgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBpZD0iaW5zZXJ0IiBuYW1lPSJpbnNlcnQiIHZhbHVlPSJ7I3VwZGF0ZX0iIC8+CgkJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJjYW5jZWwiIG5hbWU9ImNhbmNlbCIgdmFsdWU9InsjY2FuY2VsfSIgb25jbGljaz0idGlueU1DRVBvcHVwLmNsb3NlKCk7IiAvPgoJCTwvZGl2PgoJPC9mb3JtPgo8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/css/cell.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQ1NTIGZpbGUgZm9yIGNlbGwgZGlhbG9nIGluIHRoZSB0YWJsZSBwbHVnaW4gKi8KCi5wYW5lbF93cmFwcGVyIGRpdi5jdXJyZW50IHsKCWhlaWdodDogMjAwcHg7Cn0KCi5hZHZmaWVsZCB7Cgl3aWR0aDogMjAwcHg7Cn0KCiNhY3Rpb24gewoJbWFyZ2luLWJvdHRvbTogM3B4Owp9CgojY2xhc3MgewoJd2lkdGg6IDE1MHB4Owp9]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/css/row.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQ1NTIGZpbGUgZm9yIHJvdyBkaWFsb2cgaW4gdGhlIHRhYmxlIHBsdWdpbiAqLwoKLnBhbmVsX3dyYXBwZXIgZGl2LmN1cnJlbnQgewoJaGVpZ2h0OiAyMDBweDsKfQoKLmFkdmZpZWxkIHsKCXdpZHRoOiAyMDBweDsKfQoKI2FjdGlvbiB7CgltYXJnaW4tYm90dG9tOiAzcHg7Cn0KCiNyb3d0eXBlLCNhbGlnbiwjdmFsaWduLCNjbGFzcywjaGVpZ2h0IHsKCXdpZHRoOiAxNTBweDsKfQoKI2hlaWdodCB7Cgl3aWR0aDogNTBweDsJCn0KCi5jb2wyIHsKCXBhZGRpbmctbGVmdDogMjBweDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/css/table.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQ1NTIGZpbGUgZm9yIHRhYmxlIGRpYWxvZyBpbiB0aGUgdGFibGUgcGx1Z2luICovCgoucGFuZWxfd3JhcHBlciBkaXYuY3VycmVudCB7CgloZWlnaHQ6IDI0NXB4Owp9CgouYWR2ZmllbGQgewoJd2lkdGg6IDIwMHB4Owp9CgojY2xhc3MgewoJd2lkdGg6IDE1MHB4Owp9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGMpe3ZhciBkPWMuZWFjaDtmdW5jdGlvbiBiKGYsZyl7dmFyIGg9Zy5vd25lckRvY3VtZW50LGU9aC5jcmVhdGVSYW5nZSgpLGo7ZS5zZXRTdGFydEJlZm9yZShnKTtlLnNldEVuZChmLmVuZENvbnRhaW5lcixmLmVuZE9mZnNldCk7aj1oLmNyZWF0ZUVsZW1lbnQoImJvZHkiKTtqLmFwcGVuZENoaWxkKGUuY2xvbmVDb250ZW50cygpKTtyZXR1cm4gai5pbm5lckhUTUwucmVwbGFjZSgvPChicnxpbWd8b2JqZWN0fGVtYmVkfGlucHV0fHRleHRhcmVhKVtePl0qPi9naSwiLSIpLnJlcGxhY2UoLzxbXj5dKz4vZywiIikubGVuZ3RoPT0wfWZ1bmN0aW9uIGEoRyxGLEope3ZhciBmLEssQyxvO3MoKTtvPUYuZ2V0UGFyZW50KEouZ2V0U3RhcnQoKSwidGgsdGQiKTtpZihvKXtLPUUobyk7Qz1IKCk7bz13KEsueCxLLnkpfWZ1bmN0aW9uIHooTSxMKXtNPU0uY2xvbmVOb2RlKEwpO00ucmVtb3ZlQXR0cmlidXRlKCJpZCIpO3JldHVybiBNfWZ1bmN0aW9uIHMoKXt2YXIgTD0wO2Y9W107ZChbInRoZWFkIiwidGJvZHkiLCJ0Zm9vdCJdLGZ1bmN0aW9uKE0pe3ZhciBOPUYuc2VsZWN0KCI+ICIrTSsiIHRyIixHKTtkKE4sZnVuY3Rpb24oTyxQKXtQKz1MO2QoRi5zZWxlY3QoIj4gdGQsID4gdGgiLE8pLGZ1bmN0aW9uKFYsUSl7dmFyIFIsUyxULFU7aWYoZltQXSl7d2hpbGUoZltQXVtRXSl7USsrfX1UPWgoViwicm93c3BhbiIpO1U9aChWLCJjb2xzcGFuIik7Zm9yKFM9UDtTPFArVDtTKyspe2lmKCFmW1NdKXtmW1NdPVtdfWZvcihSPVE7UjxRK1U7UisrKXtmW1NdW1JdPXtwYXJ0Ok0scmVhbDpTPT1QJiZSPT1RLGVsbTpWLHJvd3NwYW46VCxjb2xzcGFuOlV9fX19KX0pO0wrPU4ubGVuZ3RofSl9ZnVuY3Rpb24gdyhMLE4pe3ZhciBNO009ZltOXTtpZihNKXtyZXR1cm4gTVtMXX19ZnVuY3Rpb24gaChNLEwpe3JldHVybiBwYXJzZUludChNLmdldEF0dHJpYnV0ZShMKXx8MSl9ZnVuY3Rpb24gaihMKXtyZXR1cm4gRi5oYXNDbGFzcyhMLmVsbSwibWNlU2VsZWN0ZWQiKXx8TD09b31mdW5jdGlvbiBrKCl7dmFyIEw9W107ZChHLnJvd3MsZnVuY3Rpb24oTSl7ZChNLmNlbGxzLGZ1bmN0aW9uKE4pe2lmKEYuaGFzQ2xhc3MoTiwibWNlU2VsZWN0ZWQiKXx8Tj09by5lbG0pe0wucHVzaChNKTtyZXR1cm4gZmFsc2V9fSl9KTtyZXR1cm4gTH1mdW5jdGlvbiByKCl7dmFyIEw9Ri5jcmVhdGVSbmcoKTtMLnNldFN0YXJ0QWZ0ZXIoRyk7TC5zZXRFbmRBZnRlcihHKTtKLnNldFJuZyhMKTtGLnJlbW92ZShHKX1mdW5jdGlvbiBlKEwpe3ZhciBNO2Mud2FsayhMLGZ1bmN0aW9uKE8pe3ZhciBOO2lmKE8ubm9kZVR5cGU9PTMpe2QoRi5nZXRQYXJlbnRzKE8ucGFyZW50Tm9kZSxudWxsLEwpLnJldmVyc2UoKSxmdW5jdGlvbihQKXtQPXooUCxmYWxzZSk7aWYoIU0pe009Tj1QfWVsc2V7aWYoTil7Ti5hcHBlbmRDaGlsZChQKX19Tj1QfSk7aWYoTil7Ti5pbm5lckhUTUw9Yy5pc0lFPyImbmJzcDsiOic8YnIgX21jZV9ib2d1cz0iMSIgLz4nfXJldHVybiBmYWxzZX19LCJjaGlsZE5vZGVzIik7TD16KEwsZmFsc2UpO0wucm93U3Bhbj1MLmNvbFNwYW49MTtpZihNKXtMLmFwcGVuZENoaWxkKE0pfWVsc2V7aWYoIWMuaXNJRSl7TC5pbm5lckhUTUw9JzxiciBfbWNlX2JvZ3VzPSIxIiAvPid9fXJldHVybiBMfWZ1bmN0aW9uIHEoKXt2YXIgTD1GLmNyZWF0ZVJuZygpO2QoRi5zZWxlY3QoInRyIixHKSxmdW5jdGlvbihNKXtpZihNLmNlbGxzLmxlbmd0aD09MCl7Ri5yZW1vdmUoTSl9fSk7aWYoRi5zZWxlY3QoInRyIixHKS5sZW5ndGg9PTApe0wuc2V0U3RhcnRBZnRlcihHKTtMLnNldEVuZEFmdGVyKEcpO0ouc2V0Um5nKEwpO0YucmVtb3ZlKEcpO3JldHVybn1kKEYuc2VsZWN0KCJ0aGVhZCx0Ym9keSx0Zm9vdCIsRyksZnVuY3Rpb24oTSl7aWYoTS5yb3dzLmxlbmd0aD09MCl7Ri5yZW1vdmUoTSl9fSk7cygpO3Jvdz1mW01hdGgubWluKGYubGVuZ3RoLTEsSy55KV07aWYocm93KXtKLnNlbGVjdChyb3dbTWF0aC5taW4ocm93Lmxlbmd0aC0xLEsueCldLmVsbSx0cnVlKTtKLmNvbGxhcHNlKHRydWUpfX1mdW5jdGlvbiB0KFIsUCxULFEpe3ZhciBPLE0sTCxOLFM7Tz1mW1BdW1JdLmVsbS5wYXJlbnROb2RlO2ZvcihMPTE7TDw9VDtMKyspe089Ri5nZXROZXh0KE8sInRyIik7aWYoTyl7Zm9yKE09UjtNPj0wO00tLSl7Uz1mW1ArTF1bTV0uZWxtO2lmKFMucGFyZW50Tm9kZT09Tyl7Zm9yKE49MTtOPD1RO04rKyl7Ri5pbnNlcnRBZnRlcihlKFMpLFMpfWJyZWFrfX1pZihNPT0tMSl7Zm9yKE49MTtOPD1RO04rKyl7Ty5pbnNlcnRCZWZvcmUoZShPLmNlbGxzWzBdKSxPLmNlbGxzWzBdKX19fX19ZnVuY3Rpb24gQigpe2QoZixmdW5jdGlvbihMLE0pe2QoTCxmdW5jdGlvbihPLE4pe3ZhciBSLFEsUyxQO2lmKGooTykpe089Ty5lbG07Uj1oKE8sImNvbHNwYW4iKTtRPWgoTywicm93c3BhbiIpO2lmKFI+MXx8UT4xKXtPLmNvbFNwYW49Ty5yb3dTcGFuPTE7Zm9yKFA9MDtQPFItMTtQKyspe0YuaW5zZXJ0QWZ0ZXIoZShPKSxPKX10KE4sTSxRLTEsUil9fX0pfSl9ZnVuY3Rpb24gcChULFEsVyl7dmFyIE8sTixWLFUsUyxQLFIsTCxULE07aWYoVCl7cG9zPUUoVCk7Tz1wb3MueDtOPXBvcy55O1Y9TysoUS0xKTtVPU4rKFctMSl9ZWxzZXtPPUsueDtOPUsueTtWPUMueDtVPUMueX1SPXcoTyxOKTtMPXcoVixVKTtpZihSJiZMJiZSLnBhcnQ9PUwucGFydCl7QigpO3MoKTtSPXcoTyxOKS5lbG07Ui5jb2xTcGFuPShWLU8pKzE7Ui5yb3dTcGFuPShVLU4pKzE7Zm9yKFA9TjtQPD1VO1ArKyl7Zm9yKFM9TztTPD1WO1MrKyl7VD1mW1BdW1NdLmVsbTtpZihUIT1SKXtNPWMuZ3JlcChULmNoaWxkTm9kZXMpO2QoTSxmdW5jdGlvbihZLFgpe2lmKFkubm9kZU5hbWUhPSJCUiJ8fFghPU0ubGVuZ3RoLTEpe1IuYXBwZW5kQ2hpbGQoWSl9fSk7Ri5yZW1vdmUoVCl9fX1xKCl9fWZ1bmN0aW9uIGwoTyl7dmFyIEwsUSxOLFAsUixTLE0sVDtkKGYsZnVuY3Rpb24oVSxWKXtkKFUsZnVuY3Rpb24oWCxXKXtpZihqKFgpKXtYPVguZWxtO1I9WC5wYXJlbnROb2RlO1M9eihSLGZhbHNlKTtMPVY7aWYoTyl7cmV0dXJuIGZhbHNlfX19KTtpZihPKXtyZXR1cm4gIUx9fSk7Zm9yKFA9MDtQPGZbMF0ubGVuZ3RoO1ArKyl7UT1mW0xdW1BdLmVsbTtpZihRIT1OKXtpZighTyl7cm93U3Bhbj1oKFEsInJvd3NwYW4iKTtpZihyb3dTcGFuPjEpe1Eucm93U3Bhbj1yb3dTcGFuKzE7Y29udGludWV9fWVsc2V7aWYoTD4wJiZmW0wtMV1bUF0pe1Q9ZltMLTFdW1BdLmVsbTtyb3dTcGFuPWgoVCwicm93c3BhbiIpO2lmKHJvd1NwYW4+MSl7VC5yb3dTcGFuPXJvd1NwYW4rMTtjb250aW51ZX19fU09ZShRKTtNLmNvbFNwYW49US5jb2xTcGFuO1MuYXBwZW5kQ2hpbGQoTSk7Tj1RfX1pZihTLmhhc0NoaWxkTm9kZXMoKSl7aWYoIU8pe0YuaW5zZXJ0QWZ0ZXIoUyxSKX1lbHNle1IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoUyxSKX19fWZ1bmN0aW9uIGcoTSl7dmFyIE4sTDtkKGYsZnVuY3Rpb24oTyxQKXtkKE8sZnVuY3Rpb24oUixRKXtpZihqKFIpKXtOPVE7aWYoTSl7cmV0dXJuIGZhbHNlfX19KTtpZihNKXtyZXR1cm4gIU59fSk7ZChmLGZ1bmN0aW9uKFIsUyl7dmFyIE89UltOXS5lbG0sUCxRO2lmKE8hPUwpe1E9aChPLCJjb2xzcGFuIik7UD1oKE8sInJvd3NwYW4iKTtpZihRPT0xKXtpZighTSl7Ri5pbnNlcnRBZnRlcihlKE8pLE8pO3QoTixTLFAtMSxRKX1lbHNle08ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZShPKSxPKTt0KE4sUyxQLTEsUSl9fWVsc2V7Ty5jb2xTcGFuKyt9TD1PfX0pfWZ1bmN0aW9uIG4oKXt2YXIgTD1bXTtkKGYsZnVuY3Rpb24oTSxOKXtkKE0sZnVuY3Rpb24oUCxPKXtpZihqKFApJiZjLmluQXJyYXkoTCxPKT09PS0xKXtkKGYsZnVuY3Rpb24oUyl7dmFyIFE9U1tPXS5lbG0sUjtSPWgoUSwiY29sc3BhbiIpO2lmKFI+MSl7US5jb2xTcGFuPVItMX1lbHNle0YucmVtb3ZlKFEpfX0pO0wucHVzaChPKX19KX0pO3EoKX1mdW5jdGlvbiBtKCl7dmFyIE07ZnVuY3Rpb24gTChQKXt2YXIgTyxRLE47Tz1GLmdldE5leHQoUCwidHIiKTtkKFAuY2VsbHMsZnVuY3Rpb24oUil7dmFyIFM9aChSLCJyb3dzcGFuIik7aWYoUz4xKXtSLnJvd1NwYW49Uy0xO1E9RShSKTt0KFEueCxRLnksMSwxKX19KTtRPUUoUC5jZWxsc1swXSk7ZChmW1EueV0sZnVuY3Rpb24oUil7dmFyIFM7Uj1SLmVsbTtpZihSIT1OKXtTPWgoUiwicm93c3BhbiIpO2lmKFM8PTEpe0YucmVtb3ZlKFIpfWVsc2V7Ui5yb3dTcGFuPVMtMX1OPVJ9fSl9TT1rKCk7ZChNLnJldmVyc2UoKSxmdW5jdGlvbihOKXtMKE4pfSk7cSgpfWZ1bmN0aW9uIEQoKXt2YXIgTD1rKCk7Ri5yZW1vdmUoTCk7cSgpO3JldHVybiBMfWZ1bmN0aW9uIEkoKXt2YXIgTD1rKCk7ZChMLGZ1bmN0aW9uKE4sTSl7TFtNXT16KE4sdHJ1ZSl9KTtyZXR1cm4gTH1mdW5jdGlvbiBBKE4sTSl7dmFyIE89aygpLEw9T1tNPzA6Ty5sZW5ndGgtMV0sUD1MLmNlbGxzLmxlbmd0aDtkKGYsZnVuY3Rpb24oUil7dmFyIFE7UD0wO2QoUixmdW5jdGlvbihULFMpe2lmKFQucmVhbCl7UCs9VC5jb2xzcGFufWlmKFQuZWxtLnBhcmVudE5vZGU9PUwpe1E9MX19KTtpZihRKXtyZXR1cm4gZmFsc2V9fSk7aWYoIU0pe04ucmV2ZXJzZSgpfWQoTixmdW5jdGlvbihTKXt2YXIgUj1TLmNlbGxzLmxlbmd0aCxRO2ZvcihpPTA7aTxSO2krKyl7UT1TLmNlbGxzW2ldO1EuY29sU3Bhbj1RLnJvd1NwYW49MX1mb3IoaT1SO2k8UDtpKyspe1MuYXBwZW5kQ2hpbGQoZShTLmNlbGxzW1ItMV0pKX1mb3IoaT1QO2k8UjtpKyspe0YucmVtb3ZlKFMuY2VsbHNbaV0pfWlmKE0pe0wucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoUyxMKX1lbHNle0YuaW5zZXJ0QWZ0ZXIoUyxMKX19KX1mdW5jdGlvbiBFKEwpe3ZhciBNO2QoZixmdW5jdGlvbihOLE8pe2QoTixmdW5jdGlvbihRLFApe2lmKFEuZWxtPT1MKXtNPXt4OlAseTpPfTtyZXR1cm4gZmFsc2V9fSk7cmV0dXJuICFNfSk7cmV0dXJuIE19ZnVuY3Rpb24gdihMKXtLPUUoTCl9ZnVuY3Rpb24gSCgpe3ZhciBOLE0sTDtNPUw9MDtkKGYsZnVuY3Rpb24oTyxQKXtkKE8sZnVuY3Rpb24oUixRKXt2YXIgVCxTO2lmKGooUikpe1I9ZltQXVtRXTtpZihRPk0pe009UX1pZihQPkwpe0w9UH1pZihSLnJlYWwpe1Q9Ui5jb2xzcGFuLTE7Uz1SLnJvd3NwYW4tMTtpZihUKXtpZihRK1Q+TSl7TT1RK1R9fWlmKFMpe2lmKFArUz5MKXtMPVArU319fX19KX0pO3JldHVybnt4Ok0seTpMfX1mdW5jdGlvbiB1KFIpe3ZhciBPLE4sVCxTLE0sTCxQLFE7Qz1FKFIpO2lmKEsmJkMpe089TWF0aC5taW4oSy54LEMueCk7Tj1NYXRoLm1pbihLLnksQy55KTtUPU1hdGgubWF4KEsueCxDLngpO1M9TWF0aC5tYXgoSy55LEMueSk7TT1UO0w9Uztmb3IoeT1OO3k8PUw7eSsrKXtSPWZbeV1bT107aWYoIVIucmVhbCl7aWYoTy0oUi5jb2xzcGFuLTEpPE8pe08tPVIuY29sc3Bhbi0xfX19Zm9yKHg9Tzt4PD1NO3grKyl7Uj1mW05dW3hdO2lmKCFSLnJlYWwpe2lmKE4tKFIucm93c3Bhbi0xKTxOKXtOLT1SLnJvd3NwYW4tMX19fWZvcih5PU47eTw9Uzt5Kyspe2Zvcih4PU87eDw9VDt4Kyspe1I9Zlt5XVt4XTtpZihSLnJlYWwpe1A9Ui5jb2xzcGFuLTE7UT1SLnJvd3NwYW4tMTtpZihQKXtpZih4K1A+TSl7TT14K1B9fWlmKFEpe2lmKHkrUT5MKXtMPXkrUX19fX19Ri5yZW1vdmVDbGFzcyhGLnNlbGVjdCgidGQubWNlU2VsZWN0ZWQsdGgubWNlU2VsZWN0ZWQiKSwibWNlU2VsZWN0ZWQiKTtmb3IoeT1OO3k8PUw7eSsrKXtmb3IoeD1PO3g8PU07eCsrKXtGLmFkZENsYXNzKGZbeV1beF0uZWxtLCJtY2VTZWxlY3RlZCIpfX19fWMuZXh0ZW5kKHRoaXMse2RlbGV0ZVRhYmxlOnIsc3BsaXQ6QixtZXJnZTpwLGluc2VydFJvdzpsLGluc2VydENvbDpnLGRlbGV0ZUNvbHM6bixkZWxldGVSb3dzOm0sY3V0Um93czpELGNvcHlSb3dzOkkscGFzdGVSb3dzOkEsZ2V0UG9zOkUsc2V0U3RhcnRDZWxsOnYsc2V0RW5kQ2VsbDp1fSl9Yy5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5UYWJsZVBsdWdpbiIse2luaXQ6ZnVuY3Rpb24oZixnKXt2YXIgZSxrO2Z1bmN0aW9uIGoobil7dmFyIG09Zi5zZWxlY3Rpb24sbD1mLmRvbS5nZXRQYXJlbnQobnx8bS5nZXROb2RlKCksInRhYmxlIik7aWYobCl7cmV0dXJuIG5ldyBhKGwsZi5kb20sbSl9fWZ1bmN0aW9uIGgoKXtmLmdldEJvZHkoKS5zdHlsZS53ZWJraXRVc2VyU2VsZWN0PSIiO2YuZG9tLnJlbW92ZUNsYXNzKGYuZG9tLnNlbGVjdCgidGQubWNlU2VsZWN0ZWQsdGgubWNlU2VsZWN0ZWQiKSwibWNlU2VsZWN0ZWQiKX1kKFtbInRhYmxlIiwidGFibGUuZGVzYyIsIm1jZUluc2VydFRhYmxlIix0cnVlXSxbImRlbGV0ZV90YWJsZSIsInRhYmxlLmRlbCIsIm1jZVRhYmxlRGVsZXRlIl0sWyJkZWxldGVfY29sIiwidGFibGUuZGVsZXRlX2NvbF9kZXNjIiwibWNlVGFibGVEZWxldGVDb2wiXSxbImRlbGV0ZV9yb3ciLCJ0YWJsZS5kZWxldGVfcm93X2Rlc2MiLCJtY2VUYWJsZURlbGV0ZVJvdyJdLFsiY29sX2FmdGVyIiwidGFibGUuY29sX2FmdGVyX2Rlc2MiLCJtY2VUYWJsZUluc2VydENvbEFmdGVyIl0sWyJjb2xfYmVmb3JlIiwidGFibGUuY29sX2JlZm9yZV9kZXNjIiwibWNlVGFibGVJbnNlcnRDb2xCZWZvcmUiXSxbInJvd19hZnRlciIsInRhYmxlLnJvd19hZnRlcl9kZXNjIiwibWNlVGFibGVJbnNlcnRSb3dBZnRlciJdLFsicm93X2JlZm9yZSIsInRhYmxlLnJvd19iZWZvcmVfZGVzYyIsIm1jZVRhYmxlSW5zZXJ0Um93QmVmb3JlIl0sWyJyb3dfcHJvcHMiLCJ0YWJsZS5yb3dfZGVzYyIsIm1jZVRhYmxlUm93UHJvcHMiLHRydWVdLFsiY2VsbF9wcm9wcyIsInRhYmxlLmNlbGxfZGVzYyIsIm1jZVRhYmxlQ2VsbFByb3BzIix0cnVlXSxbInNwbGl0X2NlbGxzIiwidGFibGUuc3BsaXRfY2VsbHNfZGVzYyIsIm1jZVRhYmxlU3BsaXRDZWxscyIsdHJ1ZV0sWyJtZXJnZV9jZWxscyIsInRhYmxlLm1lcmdlX2NlbGxzX2Rlc2MiLCJtY2VUYWJsZU1lcmdlQ2VsbHMiLHRydWVdXSxmdW5jdGlvbihsKXtmLmFkZEJ1dHRvbihsWzBdLHt0aXRsZTpsWzFdLGNtZDpsWzJdLHVpOmxbM119KX0pO2lmKCFjLmlzSUUpe2Yub25DbGljay5hZGQoZnVuY3Rpb24obCxtKXttPW0udGFyZ2V0O2lmKG0ubm9kZU5hbWU9PT0iVEFCTEUiKXtsLnNlbGVjdGlvbi5zZWxlY3QobSl9fSl9Zi5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKG0sbCxxKXt2YXIgbztxPW0uc2VsZWN0aW9uLmdldFN0YXJ0KCk7bz1tLmRvbS5nZXRQYXJlbnQocSwidGQsdGgsY2FwdGlvbiIpO2wuc2V0QWN0aXZlKCJ0YWJsZSIscS5ub2RlTmFtZT09PSJUQUJMRSJ8fCEhbyk7aWYobyYmby5ub2RlTmFtZT09PSJDQVBUSU9OIil7bz0wfWwuc2V0RGlzYWJsZWQoImRlbGV0ZV90YWJsZSIsIW8pO2wuc2V0RGlzYWJsZWQoImRlbGV0ZV9jb2wiLCFvKTtsLnNldERpc2FibGVkKCJkZWxldGVfdGFibGUiLCFvKTtsLnNldERpc2FibGVkKCJkZWxldGVfcm93Iiwhbyk7bC5zZXREaXNhYmxlZCgiY29sX2FmdGVyIiwhbyk7bC5zZXREaXNhYmxlZCgiY29sX2JlZm9yZSIsIW8pO2wuc2V0RGlzYWJsZWQoInJvd19hZnRlciIsIW8pO2wuc2V0RGlzYWJsZWQoInJvd19iZWZvcmUiLCFvKTtsLnNldERpc2FibGVkKCJyb3dfcHJvcHMiLCFvKTtsLnNldERpc2FibGVkKCJjZWxsX3Byb3BzIiwhbyk7bC5zZXREaXNhYmxlZCgic3BsaXRfY2VsbHMiLCFvKTtsLnNldERpc2FibGVkKCJtZXJnZV9jZWxscyIsIW8pfSk7Zi5vbkluaXQuYWRkKGZ1bmN0aW9uKG0pe3ZhciBsLHAscT1tLmRvbSxuO2U9bS53aW5kb3dNYW5hZ2VyO20ub25Nb3VzZURvd24uYWRkKGZ1bmN0aW9uKHIscyl7aWYocy5idXR0b24hPTIpe2goKTtwPXEuZ2V0UGFyZW50KHMudGFyZ2V0LCJ0ZCx0aCIpO2w9cS5nZXRQYXJlbnQocCwidGFibGUiKX19KTtxLmJpbmQobS5nZXREb2MoKSwibW91c2VvdmVyIixmdW5jdGlvbih1KXt2YXIgcyxyLHQ9dS50YXJnZXQ7aWYocCYmKG58fHQhPXApJiYodC5ub2RlTmFtZT09IlREInx8dC5ub2RlTmFtZT09IlRIIikpe3I9cS5nZXRQYXJlbnQodCwidGFibGUiKTtpZihyPT1sKXtpZighbil7bj1qKHIpO24uc2V0U3RhcnRDZWxsKHApO20uZ2V0Qm9keSgpLnN0eWxlLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUifW4uc2V0RW5kQ2VsbCh0KX1zPW0uc2VsZWN0aW9uLmdldFNlbCgpO2lmKHMucmVtb3ZlQWxsUmFuZ2VzKXtzLnJlbW92ZUFsbFJhbmdlcygpfWVsc2V7cy5lbXB0eSgpfXUucHJldmVudERlZmF1bHQoKX19KTttLm9uTW91c2VVcC5hZGQoZnVuY3Rpb24oQSxCKXt2YXIgcyx1PUEuc2VsZWN0aW9uLEMsRD11LmdldFNlbCgpLHIsdix0LHo7aWYocCl7aWYobil7QS5nZXRCb2R5KCkuc3R5bGUud2Via2l0VXNlclNlbGVjdD0iIn1mdW5jdGlvbiB3KEUsRyl7dmFyIEY9bmV3IGMuZG9tLlRyZWVXYWxrZXIoRSxFKTtkb3tpZihFLm5vZGVUeXBlPT0zJiZjLnRyaW0oRS5ub2RlVmFsdWUpLmxlbmd0aCE9MCl7aWYoRyl7cy5zZXRTdGFydChFLDApfWVsc2V7cy5zZXRFbmQoRSxFLm5vZGVWYWx1ZS5sZW5ndGgpfXJldHVybn1pZihFLm5vZGVOYW1lPT0iQlIiKXtpZihHKXtzLnNldFN0YXJ0QmVmb3JlKEUpfWVsc2V7cy5zZXRFbmRCZWZvcmUoRSl9cmV0dXJufX13aGlsZShFPShHP0YubmV4dCgpOkYucHJldigpKSl9Qz1xLnNlbGVjdCgidGQubWNlU2VsZWN0ZWQsdGgubWNlU2VsZWN0ZWQiKTtpZihDLmxlbmd0aD4wKXtzPXEuY3JlYXRlUm5nKCk7dj1DWzBdO3o9Q1tDLmxlbmd0aC0xXTt3KHYsMSk7cj1uZXcgYy5kb20uVHJlZVdhbGtlcih2LHEuZ2V0UGFyZW50KENbMF0sInRhYmxlIikpO2Rve2lmKHYubm9kZU5hbWU9PSJURCJ8fHYubm9kZU5hbWU9PSJUSCIpe2lmKCFxLmhhc0NsYXNzKHYsIm1jZVNlbGVjdGVkIikpe2JyZWFrfXQ9dn19d2hpbGUodj1yLm5leHQoKSk7dyh0KTt1LnNldFJuZyhzKX1BLm5vZGVDaGFuZ2VkKCk7cD1uPWw9bnVsbH19KTttLm9uS2V5VXAuYWRkKGZ1bmN0aW9uKHIscyl7aCgpfSk7aWYobSYmbS5wbHVnaW5zLmNvbnRleHRtZW51KXttLnBsdWdpbnMuY29udGV4dG1lbnUub25Db250ZXh0TWVudS5hZGQoZnVuY3Rpb24odCxyLHYpe3ZhciB3LHU9bS5zZWxlY3Rpb24scz11LmdldE5vZGUoKXx8bS5nZXRCb2R5KCk7aWYobS5kb20uZ2V0UGFyZW50KHYsInRkIil8fG0uZG9tLmdldFBhcmVudCh2LCJ0aCIpfHxtLmRvbS5zZWxlY3QoInRkLm1jZVNlbGVjdGVkLHRoLm1jZVNlbGVjdGVkIikubGVuZ3RoKXtyLnJlbW92ZUFsbCgpO2lmKHMubm9kZU5hbWU9PSJBIiYmIW0uZG9tLmdldEF0dHJpYihzLCJuYW1lIikpe3IuYWRkKHt0aXRsZToiYWR2YW5jZWQubGlua19kZXNjIixpY29uOiJsaW5rIixjbWQ6bS5wbHVnaW5zLmFkdmxpbms/Im1jZUFkdkxpbmsiOiJtY2VMaW5rIix1aTp0cnVlfSk7ci5hZGQoe3RpdGxlOiJhZHZhbmNlZC51bmxpbmtfZGVzYyIsaWNvbjoidW5saW5rIixjbWQ6IlVuTGluayJ9KTtyLmFkZFNlcGFyYXRvcigpfWlmKHMubm9kZU5hbWU9PSJJTUciJiZzLmNsYXNzTmFtZS5pbmRleE9mKCJtY2VJdGVtIik9PS0xKXtyLmFkZCh7dGl0bGU6ImFkdmFuY2VkLmltYWdlX2Rlc2MiLGljb246ImltYWdlIixjbWQ6bS5wbHVnaW5zLmFkdmltYWdlPyJtY2VBZHZJbWFnZSI6Im1jZUltYWdlIix1aTp0cnVlfSk7ci5hZGRTZXBhcmF0b3IoKX1yLmFkZCh7dGl0bGU6InRhYmxlLmRlc2MiLGljb246InRhYmxlIixjbWQ6Im1jZUluc2VydFRhYmxlIix2YWx1ZTp7YWN0aW9uOiJpbnNlcnQifX0pO3IuYWRkKHt0aXRsZToidGFibGUucHJvcHNfZGVzYyIsaWNvbjoidGFibGVfcHJvcHMiLGNtZDoibWNlSW5zZXJ0VGFibGUifSk7ci5hZGQoe3RpdGxlOiJ0YWJsZS5kZWwiLGljb246ImRlbGV0ZV90YWJsZSIsY21kOiJtY2VUYWJsZURlbGV0ZSJ9KTtyLmFkZFNlcGFyYXRvcigpO3c9ci5hZGRNZW51KHt0aXRsZToidGFibGUuY2VsbCJ9KTt3LmFkZCh7dGl0bGU6InRhYmxlLmNlbGxfZGVzYyIsaWNvbjoiY2VsbF9wcm9wcyIsY21kOiJtY2VUYWJsZUNlbGxQcm9wcyJ9KTt3LmFkZCh7dGl0bGU6InRhYmxlLnNwbGl0X2NlbGxzX2Rlc2MiLGljb246InNwbGl0X2NlbGxzIixjbWQ6Im1jZVRhYmxlU3BsaXRDZWxscyJ9KTt3LmFkZCh7dGl0bGU6InRhYmxlLm1lcmdlX2NlbGxzX2Rlc2MiLGljb246Im1lcmdlX2NlbGxzIixjbWQ6Im1jZVRhYmxlTWVyZ2VDZWxscyJ9KTt3PXIuYWRkTWVudSh7dGl0bGU6InRhYmxlLnJvdyJ9KTt3LmFkZCh7dGl0bGU6InRhYmxlLnJvd19kZXNjIixpY29uOiJyb3dfcHJvcHMiLGNtZDoibWNlVGFibGVSb3dQcm9wcyJ9KTt3LmFkZCh7dGl0bGU6InRhYmxlLnJvd19iZWZvcmVfZGVzYyIsaWNvbjoicm93X2JlZm9yZSIsY21kOiJtY2VUYWJsZUluc2VydFJvd0JlZm9yZSJ9KTt3LmFkZCh7dGl0bGU6InRhYmxlLnJvd19hZnRlcl9kZXNjIixpY29uOiJyb3dfYWZ0ZXIiLGNtZDoibWNlVGFibGVJbnNlcnRSb3dBZnRlciJ9KTt3LmFkZCh7dGl0bGU6InRhYmxlLmRlbGV0ZV9yb3dfZGVzYyIsaWNvbjoiZGVsZXRlX3JvdyIsY21kOiJtY2VUYWJsZURlbGV0ZVJvdyJ9KTt3LmFkZFNlcGFyYXRvcigpO3cuYWRkKHt0aXRsZToidGFibGUuY3V0X3Jvd19kZXNjIixpY29uOiJjdXQiLGNtZDoibWNlVGFibGVDdXRSb3cifSk7dy5hZGQoe3RpdGxlOiJ0YWJsZS5jb3B5X3Jvd19kZXNjIixpY29uOiJjb3B5IixjbWQ6Im1jZVRhYmxlQ29weVJvdyJ9KTt3LmFkZCh7dGl0bGU6InRhYmxlLnBhc3RlX3Jvd19iZWZvcmVfZGVzYyIsaWNvbjoicGFzdGUiLGNtZDoibWNlVGFibGVQYXN0ZVJvd0JlZm9yZSJ9KS5zZXREaXNhYmxlZCghayk7dy5hZGQoe3RpdGxlOiJ0YWJsZS5wYXN0ZV9yb3dfYWZ0ZXJfZGVzYyIsaWNvbjoicGFzdGUiLGNtZDoibWNlVGFibGVQYXN0ZVJvd0FmdGVyIn0pLnNldERpc2FibGVkKCFrKTt3PXIuYWRkTWVudSh7dGl0bGU6InRhYmxlLmNvbCJ9KTt3LmFkZCh7dGl0bGU6InRhYmxlLmNvbF9iZWZvcmVfZGVzYyIsaWNvbjoiY29sX2JlZm9yZSIsY21kOiJtY2VUYWJsZUluc2VydENvbEJlZm9yZSJ9KTt3LmFkZCh7dGl0bGU6InRhYmxlLmNvbF9hZnRlcl9kZXNjIixpY29uOiJjb2xfYWZ0ZXIiLGNtZDoibWNlVGFibGVJbnNlcnRDb2xBZnRlciJ9KTt3LmFkZCh7dGl0bGU6InRhYmxlLmRlbGV0ZV9jb2xfZGVzYyIsaWNvbjoiZGVsZXRlX2NvbCIsY21kOiJtY2VUYWJsZURlbGV0ZUNvbCJ9KX1lbHNle3IuYWRkKHt0aXRsZToidGFibGUuZGVzYyIsaWNvbjoidGFibGUiLGNtZDoibWNlSW5zZXJ0VGFibGUifSl9fSl9aWYoIWMuaXNJRSl7ZnVuY3Rpb24gbygpe3ZhciByO2ZvcihyPW0uZ2V0Qm9keSgpLmxhc3RDaGlsZDtyJiZyLm5vZGVUeXBlPT0zJiYhci5ub2RlVmFsdWUubGVuZ3RoO3I9ci5wcmV2aW91c1NpYmxpbmcpe31pZihyJiZyLm5vZGVOYW1lPT0iVEFCTEUiKXttLmRvbS5hZGQobS5nZXRCb2R5KCksInAiLG51bGwsJzxiciBtY2VfYm9ndXM9IjEiIC8+Jyl9fWlmKGMuaXNHZWNrbyl7bS5vbktleURvd24uYWRkKGZ1bmN0aW9uKHMsdSl7dmFyIHIsdCx2PXMuZG9tO2lmKHUua2V5Q29kZT09Mzd8fHUua2V5Q29kZT09Mzgpe3I9cy5zZWxlY3Rpb24uZ2V0Um5nKCk7dD12LmdldFBhcmVudChyLnN0YXJ0Q29udGFpbmVyLCJ0YWJsZSIpO2lmKHQmJnMuZ2V0Qm9keSgpLmZpcnN0Q2hpbGQ9PXQpe2lmKGIocix0KSl7cj12LmNyZWF0ZVJuZygpO3Iuc2V0U3RhcnRCZWZvcmUodCk7ci5zZXRFbmRCZWZvcmUodCk7cy5zZWxlY3Rpb24uc2V0Um5nKHIpO3UucHJldmVudERlZmF1bHQoKX19fX0pfW0ub25LZXlVcC5hZGQobyk7bS5vblNldENvbnRlbnQuYWRkKG8pO20ub25WaXN1YWxBaWQuYWRkKG8pO20ub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihyLHQpe3ZhciBzPXQubm9kZS5sYXN0Q2hpbGQ7aWYocyYmcy5jaGlsZE5vZGVzLmxlbmd0aD09MSYmcy5maXJzdENoaWxkLm5vZGVOYW1lPT0iQlIiKXtyLmRvbS5yZW1vdmUocyl9fSk7bygpfX0pO2Qoe21jZVRhYmxlU3BsaXRDZWxsczpmdW5jdGlvbihsKXtsLnNwbGl0KCl9LG1jZVRhYmxlTWVyZ2VDZWxsczpmdW5jdGlvbihtKXt2YXIgbixvLGw7bD1mLmRvbS5nZXRQYXJlbnQoZi5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCJ0aCx0ZCIpO2lmKGwpe249bC5yb3dTcGFuO289bC5jb2xTcGFufWlmKCFmLmRvbS5zZWxlY3QoInRkLm1jZVNlbGVjdGVkLHRoLm1jZVNlbGVjdGVkIikubGVuZ3RoKXtlLm9wZW4oe3VybDpnKyIvbWVyZ2VfY2VsbHMuaHRtIix3aWR0aDoyNDArcGFyc2VJbnQoZi5nZXRMYW5nKCJ0YWJsZS5tZXJnZV9jZWxsc19kZWx0YV93aWR0aCIsMCkpLGhlaWdodDoxMTArcGFyc2VJbnQoZi5nZXRMYW5nKCJ0YWJsZS5tZXJnZV9jZWxsc19kZWx0YV9oZWlnaHQiLDApKSxpbmxpbmU6MX0se3Jvd3M6bixjb2xzOm8sb25hY3Rpb246ZnVuY3Rpb24ocCl7bS5tZXJnZShsLHAuY29scyxwLnJvd3MpfSxwbHVnaW5fdXJsOmd9KX1lbHNle20ubWVyZ2UoKX19LG1jZVRhYmxlSW5zZXJ0Um93QmVmb3JlOmZ1bmN0aW9uKGwpe2wuaW5zZXJ0Um93KHRydWUpfSxtY2VUYWJsZUluc2VydFJvd0FmdGVyOmZ1bmN0aW9uKGwpe2wuaW5zZXJ0Um93KCl9LG1jZVRhYmxlSW5zZXJ0Q29sQmVmb3JlOmZ1bmN0aW9uKGwpe2wuaW5zZXJ0Q29sKHRydWUpfSxtY2VUYWJsZUluc2VydENvbEFmdGVyOmZ1bmN0aW9uKGwpe2wuaW5zZXJ0Q29sKCl9LG1jZVRhYmxlRGVsZXRlQ29sOmZ1bmN0aW9uKGwpe2wuZGVsZXRlQ29scygpfSxtY2VUYWJsZURlbGV0ZVJvdzpmdW5jdGlvbihsKXtsLmRlbGV0ZVJvd3MoKX0sbWNlVGFibGVDdXRSb3c6ZnVuY3Rpb24obCl7az1sLmN1dFJvd3MoKX0sbWNlVGFibGVDb3B5Um93OmZ1bmN0aW9uKGwpe2s9bC5jb3B5Um93cygpfSxtY2VUYWJsZVBhc3RlUm93QmVmb3JlOmZ1bmN0aW9uKGwpe2wucGFzdGVSb3dzKGssdHJ1ZSl9LG1jZVRhYmxlUGFzdGVSb3dBZnRlcjpmdW5jdGlvbihsKXtsLnBhc3RlUm93cyhrKX0sbWNlVGFibGVEZWxldGU6ZnVuY3Rpb24obCl7bC5kZWxldGVUYWJsZSgpfX0sZnVuY3Rpb24obSxsKXtmLmFkZENvbW1hbmQobCxmdW5jdGlvbigpe3ZhciBuPWooKTtpZihuKXttKG4pO2YuZXhlY0NvbW1hbmQoIm1jZVJlcGFpbnQiKTtoKCl9fSl9KTtkKHttY2VJbnNlcnRUYWJsZTpmdW5jdGlvbihsKXtlLm9wZW4oe3VybDpnKyIvdGFibGUuaHRtIix3aWR0aDo0MDArcGFyc2VJbnQoZi5nZXRMYW5nKCJ0YWJsZS50YWJsZV9kZWx0YV93aWR0aCIsMCkpLGhlaWdodDozMjArcGFyc2VJbnQoZi5nZXRMYW5nKCJ0YWJsZS50YWJsZV9kZWx0YV9oZWlnaHQiLDApKSxpbmxpbmU6MX0se3BsdWdpbl91cmw6ZyxhY3Rpb246bD9sLmFjdGlvbjowfSl9LG1jZVRhYmxlUm93UHJvcHM6ZnVuY3Rpb24oKXtlLm9wZW4oe3VybDpnKyIvcm93Lmh0bSIsd2lkdGg6NDAwK3BhcnNlSW50KGYuZ2V0TGFuZygidGFibGUucm93cHJvcHNfZGVsdGFfd2lkdGgiLDApKSxoZWlnaHQ6Mjk1K3BhcnNlSW50KGYuZ2V0TGFuZygidGFibGUucm93cHJvcHNfZGVsdGFfaGVpZ2h0IiwwKSksaW5saW5lOjF9LHtwbHVnaW5fdXJsOmd9KX0sbWNlVGFibGVDZWxsUHJvcHM6ZnVuY3Rpb24oKXtlLm9wZW4oe3VybDpnKyIvY2VsbC5odG0iLHdpZHRoOjQwMCtwYXJzZUludChmLmdldExhbmcoInRhYmxlLmNlbGxwcm9wc19kZWx0YV93aWR0aCIsMCkpLGhlaWdodDoyOTUrcGFyc2VJbnQoZi5nZXRMYW5nKCJ0YWJsZS5jZWxscHJvcHNfZGVsdGFfaGVpZ2h0IiwwKSksaW5saW5lOjF9LHtwbHVnaW5fdXJsOmd9KX19LGZ1bmN0aW9uKG0sbCl7Zi5hZGRDb21tYW5kKGwsZnVuY3Rpb24obixvKXttKG8pfSl9KX19KTtjLlBsdWdpbk1hbmFnZXIuYWRkKCJ0YWJsZSIsYy5wbHVnaW5zLlRhYmxlUGx1Z2luKX0pKHRpbnltY2UpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgkvLyBDaGVja3MgaWYgdGhlIHNlbGVjdGlvbi9jYXJldCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNwZWNpZmllZCBibG9jayBlbGVtZW50DQoJZnVuY3Rpb24gaXNBdFN0YXJ0KHJuZywgcGFyKSB7DQoJCXZhciBkb2MgPSBwYXIub3duZXJEb2N1bWVudCwgcm5nMiA9IGRvYy5jcmVhdGVSYW5nZSgpLCBlbG07DQoNCgkJcm5nMi5zZXRTdGFydEJlZm9yZShwYXIpOw0KCQlybmcyLnNldEVuZChybmcuZW5kQ29udGFpbmVyLCBybmcuZW5kT2Zmc2V0KTsNCg0KCQllbG0gPSBkb2MuY3JlYXRlRWxlbWVudCgnYm9keScpOw0KCQllbG0uYXBwZW5kQ2hpbGQocm5nMi5jbG9uZUNvbnRlbnRzKCkpOw0KDQoJCS8vIENoZWNrIGZvciB0ZXh0IGNoYXJhY3RlcnMgb2Ygb3RoZXIgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBjb250ZW50DQoJCXJldHVybiBlbG0uaW5uZXJIVE1MLnJlcGxhY2UoLzwoYnJ8aW1nfG9iamVjdHxlbWJlZHxpbnB1dHx0ZXh0YXJlYSlbXj5dKj4vZ2ksICctJykucmVwbGFjZSgvPFtePl0rPi9nLCAnJykubGVuZ3RoID09IDA7DQoJfTsNCg0KCS8qKg0KCSAqIFRhYmxlIEdyaWQgY2xhc3MuDQoJICovDQoJZnVuY3Rpb24gVGFibGVHcmlkKHRhYmxlLCBkb20sIHNlbGVjdGlvbikgew0KCQl2YXIgZ3JpZCwgc3RhcnRQb3MsIGVuZFBvcywgc2VsZWN0ZWRDZWxsOw0KDQoJCWJ1aWxkR3JpZCgpOw0KCQlzZWxlY3RlZENlbGwgPSBkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXRTdGFydCgpLCAndGgsdGQnKTsNCgkJaWYgKHNlbGVjdGVkQ2VsbCkgew0KCQkJc3RhcnRQb3MgPSBnZXRQb3Moc2VsZWN0ZWRDZWxsKTsNCgkJCWVuZFBvcyA9IGZpbmRFbmRQb3MoKTsNCgkJCXNlbGVjdGVkQ2VsbCA9IGdldENlbGwoc3RhcnRQb3MueCwgc3RhcnRQb3MueSk7DQoJCX0NCg0KCQlmdW5jdGlvbiBjbG9uZU5vZGUobm9kZSwgY2hpbGRyZW4pIHsNCgkJCW5vZGUgPSBub2RlLmNsb25lTm9kZShjaGlsZHJlbik7DQoJCQlub2RlLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsNCg0KCQkJcmV0dXJuIG5vZGU7DQoJCX0NCg0KCQlmdW5jdGlvbiBidWlsZEdyaWQoKSB7DQoJCQl2YXIgc3RhcnRZID0gMDsNCg0KCQkJZ3JpZCA9IFtdOw0KDQoJCQllYWNoKFsndGhlYWQnLCAndGJvZHknLCAndGZvb3QnXSwgZnVuY3Rpb24ocGFydCkgew0KCQkJCXZhciByb3dzID0gZG9tLnNlbGVjdCgnPiAnICsgcGFydCArICcgdHInLCB0YWJsZSk7DQoNCgkJCQllYWNoKHJvd3MsIGZ1bmN0aW9uKHRyLCB5KSB7DQoJCQkJCXkgKz0gc3RhcnRZOw0KDQoJCQkJCWVhY2goZG9tLnNlbGVjdCgnPiB0ZCwgPiB0aCcsIHRyKSwgZnVuY3Rpb24odGQsIHgpIHsNCgkJCQkJCXZhciB4MiwgeTIsIHJvd3NwYW4sIGNvbHNwYW47DQoNCgkJCQkJCS8vIFNraXAgb3ZlciBleGlzdGluZyBjZWxscyBwcm9kdWNlZCBieSByb3dzcGFuDQoJCQkJCQlpZiAoZ3JpZFt5XSkgew0KCQkJCQkJCXdoaWxlIChncmlkW3ldW3hdKQ0KCQkJCQkJCQl4Kys7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEdldCBjb2wvcm93c3BhbiBmcm9tIGNlbGwNCgkJCQkJCXJvd3NwYW4gPSBnZXRTcGFuVmFsKHRkLCAncm93c3BhbicpOw0KCQkJCQkJY29sc3BhbiA9IGdldFNwYW5WYWwodGQsICdjb2xzcGFuJyk7DQoNCgkJCQkJCS8vIEZpbGwgb3V0IHJvd3NwYW4vY29sc3BhbiByaWdodCBhbmQgZG93bg0KCQkJCQkJZm9yICh5MiA9IHk7IHkyIDwgeSArIHJvd3NwYW47IHkyKyspIHsNCgkJCQkJCQlpZiAoIWdyaWRbeTJdKQ0KCQkJCQkJCQlncmlkW3kyXSA9IFtdOw0KDQoJCQkJCQkJZm9yICh4MiA9IHg7IHgyIDwgeCArIGNvbHNwYW47IHgyKyspIHsNCgkJCQkJCQkJZ3JpZFt5Ml1beDJdID0gew0KCQkJCQkJCQkJcGFydCA6IHBhcnQsDQoJCQkJCQkJCQlyZWFsIDogeTIgPT0geSAmJiB4MiA9PSB4LA0KCQkJCQkJCQkJZWxtIDogdGQsDQoJCQkJCQkJCQlyb3dzcGFuIDogcm93c3BhbiwNCgkJCQkJCQkJCWNvbHNwYW4gOiBjb2xzcGFuDQoJCQkJCQkJCX07DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9KTsNCg0KCQkJCXN0YXJ0WSArPSByb3dzLmxlbmd0aDsNCgkJCX0pOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGdldENlbGwoeCwgeSkgew0KCQkJdmFyIHJvdzsNCg0KCQkJcm93ID0gZ3JpZFt5XTsNCgkJCWlmIChyb3cpDQoJCQkJcmV0dXJuIHJvd1t4XTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBnZXRTcGFuVmFsKHRkLCBuYW1lKSB7DQoJCQlyZXR1cm4gcGFyc2VJbnQodGQuZ2V0QXR0cmlidXRlKG5hbWUpIHx8IDEpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGlzQ2VsbFNlbGVjdGVkKGNlbGwpIHsNCgkJCXJldHVybiBkb20uaGFzQ2xhc3MoY2VsbC5lbG0sICdtY2VTZWxlY3RlZCcpIHx8IGNlbGwgPT0gc2VsZWN0ZWRDZWxsOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGdldFNlbGVjdGVkUm93cygpIHsNCgkJCXZhciByb3dzID0gW107DQoNCgkJCWVhY2godGFibGUucm93cywgZnVuY3Rpb24ocm93KSB7DQoJCQkJZWFjaChyb3cuY2VsbHMsIGZ1bmN0aW9uKGNlbGwpIHsNCgkJCQkJaWYgKGRvbS5oYXNDbGFzcyhjZWxsLCAnbWNlU2VsZWN0ZWQnKSB8fCBjZWxsID09IHNlbGVjdGVkQ2VsbC5lbG0pIHsNCgkJCQkJCXJvd3MucHVzaChyb3cpOw0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9KTsNCg0KCQkJcmV0dXJuIHJvd3M7DQoJCX07DQoNCgkJZnVuY3Rpb24gZGVsZXRlVGFibGUoKSB7DQoJCQl2YXIgcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KDQoJCQlybmcuc2V0U3RhcnRBZnRlcih0YWJsZSk7DQoJCQlybmcuc2V0RW5kQWZ0ZXIodGFibGUpOw0KDQoJCQlzZWxlY3Rpb24uc2V0Um5nKHJuZyk7DQoNCgkJCWRvbS5yZW1vdmUodGFibGUpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGNsb25lQ2VsbChjZWxsKSB7DQoJCQl2YXIgZm9ybWF0Tm9kZTsNCg0KCQkJLy8gQ2xvbmUgZm9ybWF0cw0KCQkJdGlueW1jZS53YWxrKGNlbGwsIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQl2YXIgY3VyTm9kZTsNCg0KCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDMpIHsNCgkJCQkJZWFjaChkb20uZ2V0UGFyZW50cyhub2RlLnBhcmVudE5vZGUsIG51bGwsIGNlbGwpLnJldmVyc2UoKSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJbm9kZSA9IGNsb25lTm9kZShub2RlLCBmYWxzZSk7DQoNCgkJCQkJCWlmICghZm9ybWF0Tm9kZSkNCgkJCQkJCQlmb3JtYXROb2RlID0gY3VyTm9kZSA9IG5vZGU7DQoJCQkJCQllbHNlIGlmIChjdXJOb2RlKQ0KCQkJCQkJCWN1ck5vZGUuYXBwZW5kQ2hpbGQobm9kZSk7DQoNCgkJCQkJCWN1ck5vZGUgPSBub2RlOw0KCQkJCQl9KTsNCg0KCQkJCQkvLyBBZGQgc29tZXRoaW5nIHRvIHRoZSBpbm5lciBub2RlDQoJCQkJCWlmIChjdXJOb2RlKQ0KCQkJCQkJY3VyTm9kZS5pbm5lckhUTUwgPSB0aW55bWNlLmlzSUUgPyAnJm5ic3A7JyA6ICc8YnIgX21jZV9ib2d1cz0iMSIgLz4nOw0KDQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9LCAnY2hpbGROb2RlcycpOw0KDQoJCQljZWxsID0gY2xvbmVOb2RlKGNlbGwsIGZhbHNlKTsNCgkJCWNlbGwucm93U3BhbiA9IGNlbGwuY29sU3BhbiA9IDE7DQoNCgkJCWlmIChmb3JtYXROb2RlKSB7DQoJCQkJY2VsbC5hcHBlbmRDaGlsZChmb3JtYXROb2RlKTsNCgkJCX0gZWxzZSB7DQoJCQkJaWYgKCF0aW55bWNlLmlzSUUpDQoJCQkJCWNlbGwuaW5uZXJIVE1MID0gJzxiciBfbWNlX2JvZ3VzPSIxIiAvPic7DQoJCQl9DQoNCgkJCXJldHVybiBjZWxsOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGNsZWFudXAoKSB7DQoJCQl2YXIgcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KDQoJCQkvLyBFbXB0eSByb3dzDQoJCQllYWNoKGRvbS5zZWxlY3QoJ3RyJywgdGFibGUpLCBmdW5jdGlvbih0cikgew0KCQkJCWlmICh0ci5jZWxscy5sZW5ndGggPT0gMCkNCgkJCQkJZG9tLnJlbW92ZSh0cik7DQoJCQl9KTsNCg0KCQkJLy8gRW1wdHkgdGFibGUNCgkJCWlmIChkb20uc2VsZWN0KCd0cicsIHRhYmxlKS5sZW5ndGggPT0gMCkgew0KCQkJCXJuZy5zZXRTdGFydEFmdGVyKHRhYmxlKTsNCgkJCQlybmcuc2V0RW5kQWZ0ZXIodGFibGUpOw0KCQkJCXNlbGVjdGlvbi5zZXRSbmcocm5nKTsNCgkJCQlkb20ucmVtb3ZlKHRhYmxlKTsNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCS8vIEVtcHR5IGhlYWRlci9ib2R5L2Zvb3Rlcg0KCQkJZWFjaChkb20uc2VsZWN0KCd0aGVhZCx0Ym9keSx0Zm9vdCcsIHRhYmxlKSwgZnVuY3Rpb24ocGFydCkgew0KCQkJCWlmIChwYXJ0LnJvd3MubGVuZ3RoID09IDApDQoJCQkJCWRvbS5yZW1vdmUocGFydCk7DQoJCQl9KTsNCg0KCQkJLy8gUmVzdG9yZSBzZWxlY3Rpb24gdG8gc3RhcnQgcG9zaXRpb24gaWYgaXQgc3RpbGwgZXhpc3RzDQoJCQlidWlsZEdyaWQoKTsNCg0KCQkJLy8gUmVzdG9yZSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBjbG9zZXN0IHRhYmxlIHBvc2l0aW9uDQoJCQlyb3cgPSBncmlkW01hdGgubWluKGdyaWQubGVuZ3RoIC0gMSwgc3RhcnRQb3MueSldOw0KCQkJaWYgKHJvdykgew0KCQkJCXNlbGVjdGlvbi5zZWxlY3Qocm93W01hdGgubWluKHJvdy5sZW5ndGggLSAxLCBzdGFydFBvcy54KV0uZWxtLCB0cnVlKTsNCgkJCQlzZWxlY3Rpb24uY29sbGFwc2UodHJ1ZSk7DQoJCQl9DQoJCX07DQoNCgkJZnVuY3Rpb24gZmlsbExlZnREb3duKHgsIHksIHJvd3MsIGNvbHMpIHsNCgkJCXZhciB0ciwgeDIsIHIsIGMsIGNlbGw7DQoNCgkJCXRyID0gZ3JpZFt5XVt4XS5lbG0ucGFyZW50Tm9kZTsNCgkJCWZvciAociA9IDE7IHIgPD0gcm93czsgcisrKSB7DQoJCQkJdHIgPSBkb20uZ2V0TmV4dCh0ciwgJ3RyJyk7DQoNCgkJCQlpZiAodHIpIHsNCgkJCQkJLy8gTG9vcCBsZWZ0IHRvIGZpbmQgcmVhbCBjZWxsDQoJCQkJCWZvciAoeDIgPSB4OyB4MiA+PSAwOyB4Mi0tKSB7DQoJCQkJCQljZWxsID0gZ3JpZFt5ICsgcl1beDJdLmVsbTsNCg0KCQkJCQkJaWYgKGNlbGwucGFyZW50Tm9kZSA9PSB0cikgew0KCQkJCQkJCS8vIEFwcGVuZCBjbG9uZXMgYWZ0ZXINCgkJCQkJCQlmb3IgKGMgPSAxOyBjIDw9IGNvbHM7IGMrKykNCgkJCQkJCQkJZG9tLmluc2VydEFmdGVyKGNsb25lQ2VsbChjZWxsKSwgY2VsbCk7DQoNCgkJCQkJCQlicmVhazsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCWlmICh4MiA9PSAtMSkgew0KCQkJCQkJLy8gSW5zZXJ0IG5vZGVzIGJlZm9yZSBmaXJzdCBjZWxsDQoJCQkJCQlmb3IgKGMgPSAxOyBjIDw9IGNvbHM7IGMrKykNCgkJCQkJCQl0ci5pbnNlcnRCZWZvcmUoY2xvbmVDZWxsKHRyLmNlbGxzWzBdKSwgdHIuY2VsbHNbMF0pOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHNwbGl0KCkgew0KCQkJZWFjaChncmlkLCBmdW5jdGlvbihyb3csIHkpIHsNCgkJCQllYWNoKHJvdywgZnVuY3Rpb24oY2VsbCwgeCkgew0KCQkJCQl2YXIgY29sU3Bhbiwgcm93U3BhbiwgbmV3Q2VsbCwgaTsNCg0KCQkJCQlpZiAoaXNDZWxsU2VsZWN0ZWQoY2VsbCkpIHsNCgkJCQkJCWNlbGwgPSBjZWxsLmVsbTsNCgkJCQkJCWNvbFNwYW4gPSBnZXRTcGFuVmFsKGNlbGwsICdjb2xzcGFuJyk7DQoJCQkJCQlyb3dTcGFuID0gZ2V0U3BhblZhbChjZWxsLCAncm93c3BhbicpOw0KDQoJCQkJCQlpZiAoY29sU3BhbiA+IDEgfHwgcm93U3BhbiA+IDEpIHsNCgkJCQkJCQljZWxsLmNvbFNwYW4gPSBjZWxsLnJvd1NwYW4gPSAxOw0KDQoJCQkJCQkJLy8gSW5zZXJ0IGNlbGxzIHJpZ2h0DQoJCQkJCQkJZm9yIChpID0gMDsgaSA8IGNvbFNwYW4gLSAxOyBpKyspDQoJCQkJCQkJCWRvbS5pbnNlcnRBZnRlcihjbG9uZUNlbGwoY2VsbCksIGNlbGwpOw0KDQoJCQkJCQkJZmlsbExlZnREb3duKHgsIHksIHJvd1NwYW4gLSAxLCBjb2xTcGFuKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gbWVyZ2UoY2VsbCwgY29scywgcm93cykgew0KCQkJdmFyIHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCB4LCB5LCBzdGFydENlbGwsIGVuZENlbGwsIGNlbGwsIGNoaWxkcmVuOw0KDQoJCQkvLyBVc2Ugc3BlY2lmaWVkIGNlbGwgYW5kIGNvbHMvcm93cw0KCQkJaWYgKGNlbGwpIHsNCgkJCQlwb3MgPSBnZXRQb3MoY2VsbCk7DQoJCQkJc3RhcnRYID0gcG9zLng7DQoJCQkJc3RhcnRZID0gcG9zLnk7DQoJCQkJZW5kWCA9IHN0YXJ0WCArIChjb2xzIC0gMSk7DQoJCQkJZW5kWSA9IHN0YXJ0WSArIChyb3dzIC0gMSk7DQoJCQl9IGVsc2Ugew0KCQkJCS8vIFVzZSBzZWxlY3Rpb24NCgkJCQlzdGFydFggPSBzdGFydFBvcy54Ow0KCQkJCXN0YXJ0WSA9IHN0YXJ0UG9zLnk7DQoJCQkJZW5kWCA9IGVuZFBvcy54Ow0KCQkJCWVuZFkgPSBlbmRQb3MueTsNCgkJCX0NCg0KCQkJLy8gRmluZCBzdGFydC9lbmQgY2VsbHMNCgkJCXN0YXJ0Q2VsbCA9IGdldENlbGwoc3RhcnRYLCBzdGFydFkpOw0KCQkJZW5kQ2VsbCA9IGdldENlbGwoZW5kWCwgZW5kWSk7DQoNCgkJCS8vIENoZWNrIGlmIHRoZSBjZWxscyBleGlzdHMgYW5kIGlmIHRoZXkgYXJlIG9mIHRoZSBzYW1lIHBhcnQgZm9yIGV4YW1wbGUgdGJvZHkgPSB0Ym9keQ0KCQkJaWYgKHN0YXJ0Q2VsbCAmJiBlbmRDZWxsICYmIHN0YXJ0Q2VsbC5wYXJ0ID09IGVuZENlbGwucGFydCkgew0KCQkJCS8vIFNwbGl0IGFuZCByZWJ1aWxkIGdyaWQNCgkJCQlzcGxpdCgpOw0KCQkJCWJ1aWxkR3JpZCgpOw0KDQoJCQkJLy8gU2V0IHJvdy9jb2wgc3BhbiB0byBzdGFydCBjZWxsDQoJCQkJc3RhcnRDZWxsID0gZ2V0Q2VsbChzdGFydFgsIHN0YXJ0WSkuZWxtOw0KCQkJCXN0YXJ0Q2VsbC5jb2xTcGFuID0gKGVuZFggLSBzdGFydFgpICsgMTsNCgkJCQlzdGFydENlbGwucm93U3BhbiA9IChlbmRZIC0gc3RhcnRZKSArIDE7DQoNCgkJCQkvLyBSZW1vdmUgb3RoZXIgY2VsbHMgYW5kIGFkZCBpdCdzIGNvbnRlbnRzIHRvIHRoZSBzdGFydCBjZWxsDQoJCQkJZm9yICh5ID0gc3RhcnRZOyB5IDw9IGVuZFk7IHkrKykgew0KCQkJCQlmb3IgKHggPSBzdGFydFg7IHggPD0gZW5kWDsgeCsrKSB7DQoJCQkJCQljZWxsID0gZ3JpZFt5XVt4XS5lbG07DQoNCgkJCQkJCWlmIChjZWxsICE9IHN0YXJ0Q2VsbCkgew0KCQkJCQkJCS8vIE1vdmUgY2hpbGRyZW4gdG8gc3RhcnRDZWxsDQoJCQkJCQkJY2hpbGRyZW4gPSB0aW55bWNlLmdyZXAoY2VsbC5jaGlsZE5vZGVzKTsNCgkJCQkJCQllYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihub2RlLCBpKSB7DQoJCQkJCQkJCS8vIEp1bXAgb3ZlciBsYXN0IEJSIGVsZW1lbnQNCgkJCQkJCQkJaWYgKG5vZGUubm9kZU5hbWUgIT0gJ0JSJyB8fCBpICE9IGNoaWxkcmVuLmxlbmd0aCAtIDEpDQoJCQkJCQkJCQlzdGFydENlbGwuYXBwZW5kQ2hpbGQobm9kZSk7DQoJCQkJCQkJfSk7DQoNCgkJCQkJCQkvLyBSZW1vdmUgY2VsbA0KCQkJCQkJCWRvbS5yZW1vdmUoY2VsbCk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBSZW1vdmUgZW1wdHkgcm93cyBldGMgYW5kIHJlc3RvcmUgY2FyZXQgbG9jYXRpb24NCgkJCQljbGVhbnVwKCk7DQoJCQl9DQoJCX07DQoNCgkJZnVuY3Rpb24gaW5zZXJ0Um93KGJlZm9yZSkgew0KCQkJdmFyIHBvc1ksIGNlbGwsIGxhc3RDZWxsLCB4LCByb3dFbG0sIG5ld1JvdywgbmV3Q2VsbCwgb3RoZXJDZWxsOw0KDQoJCQkvLyBGaW5kIGZpcnN0L2xhc3Qgcm93DQoJCQllYWNoKGdyaWQsIGZ1bmN0aW9uKHJvdywgeSkgew0KCQkJCWVhY2gocm93LCBmdW5jdGlvbihjZWxsLCB4KSB7DQoJCQkJCWlmIChpc0NlbGxTZWxlY3RlZChjZWxsKSkgew0KCQkJCQkJY2VsbCA9IGNlbGwuZWxtOw0KCQkJCQkJcm93RWxtID0gY2VsbC5wYXJlbnROb2RlOw0KCQkJCQkJbmV3Um93ID0gY2xvbmVOb2RlKHJvd0VsbSwgZmFsc2UpOw0KCQkJCQkJcG9zWSA9IHk7DQoNCgkJCQkJCWlmIChiZWZvcmUpDQoJCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQlpZiAoYmVmb3JlKQ0KCQkJCQlyZXR1cm4gIXBvc1k7DQoJCQl9KTsNCg0KCQkJZm9yICh4ID0gMDsgeCA8IGdyaWRbMF0ubGVuZ3RoOyB4KyspIHsNCgkJCQljZWxsID0gZ3JpZFtwb3NZXVt4XS5lbG07DQoNCgkJCQlpZiAoY2VsbCAhPSBsYXN0Q2VsbCkgew0KCQkJCQlpZiAoIWJlZm9yZSkgew0KCQkJCQkJcm93U3BhbiA9IGdldFNwYW5WYWwoY2VsbCwgJ3Jvd3NwYW4nKTsNCgkJCQkJCWlmIChyb3dTcGFuID4gMSkgew0KCQkJCQkJCWNlbGwucm93U3BhbiA9IHJvd1NwYW4gKyAxOw0KCQkJCQkJCWNvbnRpbnVlOw0KCQkJCQkJfQ0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJLy8gQ2hlY2sgaWYgY2VsbCBhYm92ZSBjYW4gYmUgZXhwYW5kZWQNCgkJCQkJCWlmIChwb3NZID4gMCAmJiBncmlkW3Bvc1kgLSAxXVt4XSkgew0KCQkJCQkJCW90aGVyQ2VsbCA9IGdyaWRbcG9zWSAtIDFdW3hdLmVsbTsNCgkJCQkJCQlyb3dTcGFuID0gZ2V0U3BhblZhbChvdGhlckNlbGwsICdyb3dzcGFuJyk7DQoJCQkJCQkJaWYgKHJvd1NwYW4gPiAxKSB7DQoJCQkJCQkJCW90aGVyQ2VsbC5yb3dTcGFuID0gcm93U3BhbiArIDE7DQoJCQkJCQkJCWNvbnRpbnVlOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIEluc2VydCBuZXcgY2VsbCBpbnRvIG5ldyByb3cNCgkJCQkJbmV3Q2VsbCA9IGNsb25lQ2VsbChjZWxsKQ0KCQkJCQluZXdDZWxsLmNvbFNwYW4gPSBjZWxsLmNvbFNwYW47DQoJCQkJCW5ld1Jvdy5hcHBlbmRDaGlsZChuZXdDZWxsKTsNCg0KCQkJCQlsYXN0Q2VsbCA9IGNlbGw7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAobmV3Um93Lmhhc0NoaWxkTm9kZXMoKSkgew0KCQkJCWlmICghYmVmb3JlKQ0KCQkJCQlkb20uaW5zZXJ0QWZ0ZXIobmV3Um93LCByb3dFbG0pOw0KCQkJCWVsc2UNCgkJCQkJcm93RWxtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld1Jvdywgcm93RWxtKTsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBpbnNlcnRDb2woYmVmb3JlKSB7DQoJCQl2YXIgcG9zWCwgbGFzdENlbGw7DQoNCgkJCS8vIEZpbmQgZmlyc3QvbGFzdCBjb2x1bW4NCgkJCWVhY2goZ3JpZCwgZnVuY3Rpb24ocm93LCB5KSB7DQoJCQkJZWFjaChyb3csIGZ1bmN0aW9uKGNlbGwsIHgpIHsNCgkJCQkJaWYgKGlzQ2VsbFNlbGVjdGVkKGNlbGwpKSB7DQoJCQkJCQlwb3NYID0geDsNCg0KCQkJCQkJaWYgKGJlZm9yZSkNCgkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCWlmIChiZWZvcmUpDQoJCQkJCXJldHVybiAhcG9zWDsNCgkJCX0pOw0KDQoJCQllYWNoKGdyaWQsIGZ1bmN0aW9uKHJvdywgeSkgew0KCQkJCXZhciBjZWxsID0gcm93W3Bvc1hdLmVsbSwgcm93U3BhbiwgY29sU3BhbjsNCg0KCQkJCWlmIChjZWxsICE9IGxhc3RDZWxsKSB7DQoJCQkJCWNvbFNwYW4gPSBnZXRTcGFuVmFsKGNlbGwsICdjb2xzcGFuJyk7DQoJCQkJCXJvd1NwYW4gPSBnZXRTcGFuVmFsKGNlbGwsICdyb3dzcGFuJyk7DQoNCgkJCQkJaWYgKGNvbFNwYW4gPT0gMSkgew0KCQkJCQkJaWYgKCFiZWZvcmUpIHsNCgkJCQkJCQlkb20uaW5zZXJ0QWZ0ZXIoY2xvbmVDZWxsKGNlbGwpLCBjZWxsKTsNCgkJCQkJCQlmaWxsTGVmdERvd24ocG9zWCwgeSwgcm93U3BhbiAtIDEsIGNvbFNwYW4pOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQljZWxsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNsb25lQ2VsbChjZWxsKSwgY2VsbCk7DQoJCQkJCQkJZmlsbExlZnREb3duKHBvc1gsIHksIHJvd1NwYW4gLSAxLCBjb2xTcGFuKTsNCgkJCQkJCX0NCgkJCQkJfSBlbHNlDQoJCQkJCQljZWxsLmNvbFNwYW4rKzsNCg0KCQkJCQlsYXN0Q2VsbCA9IGNlbGw7DQoJCQkJfQ0KCQkJfSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZGVsZXRlQ29scygpIHsNCgkJCXZhciBjb2xzID0gW107DQoNCgkJCS8vIEdldCBzZWxlY3RlZCBjb2x1bW4gaW5kZXhlcw0KCQkJZWFjaChncmlkLCBmdW5jdGlvbihyb3csIHkpIHsNCgkJCQllYWNoKHJvdywgZnVuY3Rpb24oY2VsbCwgeCkgew0KCQkJCQlpZiAoaXNDZWxsU2VsZWN0ZWQoY2VsbCkgJiYgdGlueW1jZS5pbkFycmF5KGNvbHMsIHgpID09PSAtMSkgew0KCQkJCQkJZWFjaChncmlkLCBmdW5jdGlvbihyb3cpIHsNCgkJCQkJCQl2YXIgY2VsbCA9IHJvd1t4XS5lbG0sIGNvbFNwYW47DQoNCgkJCQkJCQljb2xTcGFuID0gZ2V0U3BhblZhbChjZWxsLCAnY29sc3BhbicpOw0KDQoJCQkJCQkJaWYgKGNvbFNwYW4gPiAxKQ0KCQkJCQkJCQljZWxsLmNvbFNwYW4gPSBjb2xTcGFuIC0gMTsNCgkJCQkJCQllbHNlDQoJCQkJCQkJCWRvbS5yZW1vdmUoY2VsbCk7DQoJCQkJCQl9KTsNCg0KCQkJCQkJY29scy5wdXNoKHgpOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9KTsNCg0KCQkJY2xlYW51cCgpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGRlbGV0ZVJvd3MoKSB7DQoJCQl2YXIgcm93czsNCg0KCQkJZnVuY3Rpb24gZGVsZXRlUm93KHRyKSB7DQoJCQkJdmFyIG5leHRUciwgcG9zLCBsYXN0Q2VsbDsNCg0KCQkJCW5leHRUciA9IGRvbS5nZXROZXh0KHRyLCAndHInKTsNCg0KCQkJCS8vIE1vdmUgZG93biByb3cgc3Bhbm5lZCBjZWxscw0KCQkJCWVhY2godHIuY2VsbHMsIGZ1bmN0aW9uKGNlbGwpIHsNCgkJCQkJdmFyIHJvd1NwYW4gPSBnZXRTcGFuVmFsKGNlbGwsICdyb3dzcGFuJyk7DQoNCgkJCQkJaWYgKHJvd1NwYW4gPiAxKSB7DQoJCQkJCQljZWxsLnJvd1NwYW4gPSByb3dTcGFuIC0gMTsNCgkJCQkJCXBvcyA9IGdldFBvcyhjZWxsKTsNCgkJCQkJCWZpbGxMZWZ0RG93bihwb3MueCwgcG9zLnksIDEsIDEpOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQkvLyBEZWxldGUgY2VsbHMNCgkJCQlwb3MgPSBnZXRQb3ModHIuY2VsbHNbMF0pOw0KCQkJCWVhY2goZ3JpZFtwb3MueV0sIGZ1bmN0aW9uKGNlbGwpIHsNCgkJCQkJdmFyIHJvd1NwYW47DQoNCgkJCQkJY2VsbCA9IGNlbGwuZWxtOw0KDQoJCQkJCWlmIChjZWxsICE9IGxhc3RDZWxsKSB7DQoJCQkJCQlyb3dTcGFuID0gZ2V0U3BhblZhbChjZWxsLCAncm93c3BhbicpOw0KDQoJCQkJCQlpZiAocm93U3BhbiA8PSAxKQ0KCQkJCQkJCWRvbS5yZW1vdmUoY2VsbCk7DQoJCQkJCQllbHNlDQoJCQkJCQkJY2VsbC5yb3dTcGFuID0gcm93U3BhbiAtIDE7DQoNCgkJCQkJCWxhc3RDZWxsID0gY2VsbDsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfTsNCg0KCQkJLy8gR2V0IHNlbGVjdGVkIHJvd3MgYW5kIG1vdmUgc2VsZWN0aW9uIG91dCBvZiBzY29wZQ0KCQkJcm93cyA9IGdldFNlbGVjdGVkUm93cygpOw0KDQoJCQkvLyBEZWxldGUgYWxsIHNlbGVjdGVkIHJvd3MNCgkJCWVhY2gocm93cy5yZXZlcnNlKCksIGZ1bmN0aW9uKHRyKSB7DQoJCQkJZGVsZXRlUm93KHRyKTsNCgkJCX0pOw0KDQoJCQljbGVhbnVwKCk7DQoJCX07DQoNCgkJZnVuY3Rpb24gY3V0Um93cygpIHsNCgkJCXZhciByb3dzID0gZ2V0U2VsZWN0ZWRSb3dzKCk7DQoNCgkJCWRvbS5yZW1vdmUocm93cyk7DQoJCQljbGVhbnVwKCk7DQoNCgkJCXJldHVybiByb3dzOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGNvcHlSb3dzKCkgew0KCQkJdmFyIHJvd3MgPSBnZXRTZWxlY3RlZFJvd3MoKTsNCg0KCQkJZWFjaChyb3dzLCBmdW5jdGlvbihyb3csIGkpIHsNCgkJCQlyb3dzW2ldID0gY2xvbmVOb2RlKHJvdywgdHJ1ZSk7DQoJCQl9KTsNCg0KCQkJcmV0dXJuIHJvd3M7DQoJCX07DQoNCgkJZnVuY3Rpb24gcGFzdGVSb3dzKHJvd3MsIGJlZm9yZSkgew0KCQkJdmFyIHNlbGVjdGVkUm93cyA9IGdldFNlbGVjdGVkUm93cygpLA0KCQkJCXRhcmdldFJvdyA9IHNlbGVjdGVkUm93c1tiZWZvcmUgPyAwIDogc2VsZWN0ZWRSb3dzLmxlbmd0aCAtIDFdLA0KCQkJCXRhcmdldENlbGxDb3VudCA9IHRhcmdldFJvdy5jZWxscy5sZW5ndGg7DQoNCgkJCS8vIENhbGMgdGFyZ2V0IGNlbGwgY291bnQNCgkJCWVhY2goZ3JpZCwgZnVuY3Rpb24ocm93KSB7DQoJCQkJdmFyIG1hdGNoOw0KDQoJCQkJdGFyZ2V0Q2VsbENvdW50ID0gMDsNCgkJCQllYWNoKHJvdywgZnVuY3Rpb24oY2VsbCwgeCkgew0KCQkJCQlpZiAoY2VsbC5yZWFsKQ0KCQkJCQkJdGFyZ2V0Q2VsbENvdW50ICs9IGNlbGwuY29sc3BhbjsNCg0KCQkJCQlpZiAoY2VsbC5lbG0ucGFyZW50Tm9kZSA9PSB0YXJnZXRSb3cpDQoJCQkJCQltYXRjaCA9IDE7DQoJCQkJfSk7DQoNCgkJCQlpZiAobWF0Y2gpDQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCX0pOw0KDQoJCQlpZiAoIWJlZm9yZSkNCgkJCQlyb3dzLnJldmVyc2UoKTsNCg0KCQkJZWFjaChyb3dzLCBmdW5jdGlvbihyb3cpIHsNCgkJCQl2YXIgY2VsbENvdW50ID0gcm93LmNlbGxzLmxlbmd0aCwgY2VsbDsNCg0KCQkJCS8vIFJlbW92ZSBjb2wvcm93c3BhbnMNCgkJCQlmb3IgKGkgPSAwOyBpIDwgY2VsbENvdW50OyBpKyspIHsNCgkJCQkJY2VsbCA9IHJvdy5jZWxsc1tpXTsNCgkJCQkJY2VsbC5jb2xTcGFuID0gY2VsbC5yb3dTcGFuID0gMTsNCgkJCQl9DQoNCgkJCQkvLyBOZWVkcyBtb3JlIGNlbGxzDQoJCQkJZm9yIChpID0gY2VsbENvdW50OyBpIDwgdGFyZ2V0Q2VsbENvdW50OyBpKyspDQoJCQkJCXJvdy5hcHBlbmRDaGlsZChjbG9uZUNlbGwocm93LmNlbGxzW2NlbGxDb3VudCAtIDFdKSk7DQoNCgkJCQkvLyBOZWVkcyBsZXNzIGNlbGxzDQoJCQkJZm9yIChpID0gdGFyZ2V0Q2VsbENvdW50OyBpIDwgY2VsbENvdW50OyBpKyspDQoJCQkJCWRvbS5yZW1vdmUocm93LmNlbGxzW2ldKTsNCg0KCQkJCS8vIEFkZCBiZWZvcmUvYWZ0ZXINCgkJCQlpZiAoYmVmb3JlKQ0KCQkJCQl0YXJnZXRSb3cucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocm93LCB0YXJnZXRSb3cpOw0KCQkJCWVsc2UNCgkJCQkJZG9tLmluc2VydEFmdGVyKHJvdywgdGFyZ2V0Um93KTsNCgkJCX0pOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGdldFBvcyh0YXJnZXQpIHsNCgkJCXZhciBwb3M7DQoNCgkJCWVhY2goZ3JpZCwgZnVuY3Rpb24ocm93LCB5KSB7DQoJCQkJZWFjaChyb3csIGZ1bmN0aW9uKGNlbGwsIHgpIHsNCgkJCQkJaWYgKGNlbGwuZWxtID09IHRhcmdldCkgew0KCQkJCQkJcG9zID0ge3ggOiB4LCB5IDogeX07DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCXJldHVybiAhcG9zOw0KCQkJfSk7DQoNCgkJCXJldHVybiBwb3M7DQoJCX07DQoNCgkJZnVuY3Rpb24gc2V0U3RhcnRDZWxsKGNlbGwpIHsNCgkJCXN0YXJ0UG9zID0gZ2V0UG9zKGNlbGwpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGZpbmRFbmRQb3MoKSB7DQoJCQl2YXIgcG9zLCBtYXhYLCBtYXhZOw0KDQoJCQltYXhYID0gbWF4WSA9IDA7DQoNCgkJCWVhY2goZ3JpZCwgZnVuY3Rpb24ocm93LCB5KSB7DQoJCQkJZWFjaChyb3csIGZ1bmN0aW9uKGNlbGwsIHgpIHsNCgkJCQkJdmFyIGNvbFNwYW4sIHJvd1NwYW47DQoNCgkJCQkJaWYgKGlzQ2VsbFNlbGVjdGVkKGNlbGwpKSB7DQoJCQkJCQljZWxsID0gZ3JpZFt5XVt4XTsNCg0KCQkJCQkJaWYgKHggPiBtYXhYKQ0KCQkJCQkJCW1heFggPSB4Ow0KDQoJCQkJCQlpZiAoeSA+IG1heFkpDQoJCQkJCQkJbWF4WSA9IHk7DQoNCgkJCQkJCWlmIChjZWxsLnJlYWwpIHsNCgkJCQkJCQljb2xTcGFuID0gY2VsbC5jb2xzcGFuIC0gMTsNCgkJCQkJCQlyb3dTcGFuID0gY2VsbC5yb3dzcGFuIC0gMTsNCg0KCQkJCQkJCWlmIChjb2xTcGFuKSB7DQoJCQkJCQkJCWlmICh4ICsgY29sU3BhbiA+IG1heFgpDQoJCQkJCQkJCQltYXhYID0geCArIGNvbFNwYW47DQoJCQkJCQkJfQ0KDQoJCQkJCQkJaWYgKHJvd1NwYW4pIHsNCgkJCQkJCQkJaWYgKHkgKyByb3dTcGFuID4gbWF4WSkNCgkJCQkJCQkJCW1heFkgPSB5ICsgcm93U3BhbjsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQlyZXR1cm4ge3ggOiBtYXhYLCB5IDogbWF4WX07DQoJCX07DQoNCgkJZnVuY3Rpb24gc2V0RW5kQ2VsbChjZWxsKSB7DQoJCQl2YXIgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIG1heFgsIG1heFksIGNvbFNwYW4sIHJvd1NwYW47DQoNCgkJCWVuZFBvcyA9IGdldFBvcyhjZWxsKTsNCg0KCQkJaWYgKHN0YXJ0UG9zICYmIGVuZFBvcykgew0KCQkJCS8vIEdldCBzdGFydC9lbmQgcG9zaXRpb25zDQoJCQkJc3RhcnRYID0gTWF0aC5taW4oc3RhcnRQb3MueCwgZW5kUG9zLngpOw0KCQkJCXN0YXJ0WSA9IE1hdGgubWluKHN0YXJ0UG9zLnksIGVuZFBvcy55KTsNCgkJCQllbmRYID0gTWF0aC5tYXgoc3RhcnRQb3MueCwgZW5kUG9zLngpOw0KCQkJCWVuZFkgPSBNYXRoLm1heChzdGFydFBvcy55LCBlbmRQb3MueSk7DQoNCgkJCQkvLyBFeHBhbmQgZW5kIHBvc2l0b24gdG8gaW5jbHVkZSBzcGFucw0KCQkJCW1heFggPSBlbmRYOw0KCQkJCW1heFkgPSBlbmRZOw0KDQoJCQkJLy8gRXhwYW5kIHN0YXJ0WA0KCQkJCWZvciAoeSA9IHN0YXJ0WTsgeSA8PSBtYXhZOyB5KyspIHsNCgkJCQkJY2VsbCA9IGdyaWRbeV1bc3RhcnRYXTsNCg0KCQkJCQlpZiAoIWNlbGwucmVhbCkgew0KCQkJCQkJaWYgKHN0YXJ0WCAtIChjZWxsLmNvbHNwYW4gLSAxKSA8IHN0YXJ0WCkNCgkJCQkJCQlzdGFydFggLT0gY2VsbC5jb2xzcGFuIC0gMTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIEV4cGFuZCBzdGFydFkNCgkJCQlmb3IgKHggPSBzdGFydFg7IHggPD0gbWF4WDsgeCsrKSB7DQoJCQkJCWNlbGwgPSBncmlkW3N0YXJ0WV1beF07DQoNCgkJCQkJaWYgKCFjZWxsLnJlYWwpIHsNCgkJCQkJCWlmIChzdGFydFkgLSAoY2VsbC5yb3dzcGFuIC0gMSkgPCBzdGFydFkpDQoJCQkJCQkJc3RhcnRZIC09IGNlbGwucm93c3BhbiAtIDE7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBGaW5kIG1heCBYLCBZDQoJCQkJZm9yICh5ID0gc3RhcnRZOyB5IDw9IGVuZFk7IHkrKykgew0KCQkJCQlmb3IgKHggPSBzdGFydFg7IHggPD0gZW5kWDsgeCsrKSB7DQoJCQkJCQljZWxsID0gZ3JpZFt5XVt4XTsNCg0KCQkJCQkJaWYgKGNlbGwucmVhbCkgew0KCQkJCQkJCWNvbFNwYW4gPSBjZWxsLmNvbHNwYW4gLSAxOw0KCQkJCQkJCXJvd1NwYW4gPSBjZWxsLnJvd3NwYW4gLSAxOw0KDQoJCQkJCQkJaWYgKGNvbFNwYW4pIHsNCgkJCQkJCQkJaWYgKHggKyBjb2xTcGFuID4gbWF4WCkNCgkJCQkJCQkJCW1heFggPSB4ICsgY29sU3BhbjsNCgkJCQkJCQl9DQoNCgkJCQkJCQlpZiAocm93U3Bhbikgew0KCQkJCQkJCQlpZiAoeSArIHJvd1NwYW4gPiBtYXhZKQ0KCQkJCQkJCQkJbWF4WSA9IHkgKyByb3dTcGFuOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIFJlbW92ZSBjdXJyZW50IHNlbGVjdGlvbg0KCQkJCWRvbS5yZW1vdmVDbGFzcyhkb20uc2VsZWN0KCd0ZC5tY2VTZWxlY3RlZCx0aC5tY2VTZWxlY3RlZCcpLCAnbWNlU2VsZWN0ZWQnKTsNCg0KCQkJCS8vIEFkZCBuZXcgc2VsZWN0aW9uDQoJCQkJZm9yICh5ID0gc3RhcnRZOyB5IDw9IG1heFk7IHkrKykgew0KCQkJCQlmb3IgKHggPSBzdGFydFg7IHggPD0gbWF4WDsgeCsrKQ0KCQkJCQkJZG9tLmFkZENsYXNzKGdyaWRbeV1beF0uZWxtLCAnbWNlU2VsZWN0ZWQnKTsNCgkJCQl9DQoJCQl9DQoJCX07DQoNCgkJLy8gRXhwb3NlIHRvIHB1YmxpYw0KCQl0aW55bWNlLmV4dGVuZCh0aGlzLCB7DQoJCQlkZWxldGVUYWJsZSA6IGRlbGV0ZVRhYmxlLA0KCQkJc3BsaXQgOiBzcGxpdCwNCgkJCW1lcmdlIDogbWVyZ2UsDQoJCQlpbnNlcnRSb3cgOiBpbnNlcnRSb3csDQoJCQlpbnNlcnRDb2wgOiBpbnNlcnRDb2wsDQoJCQlkZWxldGVDb2xzIDogZGVsZXRlQ29scywNCgkJCWRlbGV0ZVJvd3MgOiBkZWxldGVSb3dzLA0KCQkJY3V0Um93cyA6IGN1dFJvd3MsDQoJCQljb3B5Um93cyA6IGNvcHlSb3dzLA0KCQkJcGFzdGVSb3dzIDogcGFzdGVSb3dzLA0KCQkJZ2V0UG9zIDogZ2V0UG9zLA0KCQkJc2V0U3RhcnRDZWxsIDogc2V0U3RhcnRDZWxsLA0KCQkJc2V0RW5kQ2VsbCA6IHNldEVuZENlbGwNCgkJfSk7DQoJfTsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnBsdWdpbnMuVGFibGVQbHVnaW4nLCB7DQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQl2YXIgd2luTWFuLCBjbGlwYm9hcmRSb3dzOw0KDQoJCQlmdW5jdGlvbiBjcmVhdGVUYWJsZUdyaWQobm9kZSkgew0KCQkJCXZhciBzZWxlY3Rpb24gPSBlZC5zZWxlY3Rpb24sIHRibEVsbSA9IGVkLmRvbS5nZXRQYXJlbnQobm9kZSB8fCBzZWxlY3Rpb24uZ2V0Tm9kZSgpLCAndGFibGUnKTsNCg0KCQkJCWlmICh0YmxFbG0pDQoJCQkJCXJldHVybiBuZXcgVGFibGVHcmlkKHRibEVsbSwgZWQuZG9tLCBzZWxlY3Rpb24pOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gY2xlYW51cCgpIHsNCgkJCQkvLyBSZXN0b3JlIHNlbGVjdGlvbiBwb3NzaWJpbGl0aWVzDQoJCQkJZWQuZ2V0Qm9keSgpLnN0eWxlLndlYmtpdFVzZXJTZWxlY3QgPSAnJzsNCgkJCQllZC5kb20ucmVtb3ZlQ2xhc3MoZWQuZG9tLnNlbGVjdCgndGQubWNlU2VsZWN0ZWQsdGgubWNlU2VsZWN0ZWQnKSwgJ21jZVNlbGVjdGVkJyk7DQoJCQl9Ow0KDQoJCQkvLyBSZWdpc3RlciBidXR0b25zDQoJCQllYWNoKFsNCgkJCQlbJ3RhYmxlJywgJ3RhYmxlLmRlc2MnLCAnbWNlSW5zZXJ0VGFibGUnLCB0cnVlXSwNCgkJCQlbJ2RlbGV0ZV90YWJsZScsICd0YWJsZS5kZWwnLCAnbWNlVGFibGVEZWxldGUnXSwNCgkJCQlbJ2RlbGV0ZV9jb2wnLCAndGFibGUuZGVsZXRlX2NvbF9kZXNjJywgJ21jZVRhYmxlRGVsZXRlQ29sJ10sDQoJCQkJWydkZWxldGVfcm93JywgJ3RhYmxlLmRlbGV0ZV9yb3dfZGVzYycsICdtY2VUYWJsZURlbGV0ZVJvdyddLA0KCQkJCVsnY29sX2FmdGVyJywgJ3RhYmxlLmNvbF9hZnRlcl9kZXNjJywgJ21jZVRhYmxlSW5zZXJ0Q29sQWZ0ZXInXSwNCgkJCQlbJ2NvbF9iZWZvcmUnLCAndGFibGUuY29sX2JlZm9yZV9kZXNjJywgJ21jZVRhYmxlSW5zZXJ0Q29sQmVmb3JlJ10sDQoJCQkJWydyb3dfYWZ0ZXInLCAndGFibGUucm93X2FmdGVyX2Rlc2MnLCAnbWNlVGFibGVJbnNlcnRSb3dBZnRlciddLA0KCQkJCVsncm93X2JlZm9yZScsICd0YWJsZS5yb3dfYmVmb3JlX2Rlc2MnLCAnbWNlVGFibGVJbnNlcnRSb3dCZWZvcmUnXSwNCgkJCQlbJ3Jvd19wcm9wcycsICd0YWJsZS5yb3dfZGVzYycsICdtY2VUYWJsZVJvd1Byb3BzJywgdHJ1ZV0sDQoJCQkJWydjZWxsX3Byb3BzJywgJ3RhYmxlLmNlbGxfZGVzYycsICdtY2VUYWJsZUNlbGxQcm9wcycsIHRydWVdLA0KCQkJCVsnc3BsaXRfY2VsbHMnLCAndGFibGUuc3BsaXRfY2VsbHNfZGVzYycsICdtY2VUYWJsZVNwbGl0Q2VsbHMnLCB0cnVlXSwNCgkJCQlbJ21lcmdlX2NlbGxzJywgJ3RhYmxlLm1lcmdlX2NlbGxzX2Rlc2MnLCAnbWNlVGFibGVNZXJnZUNlbGxzJywgdHJ1ZV0NCgkJCV0sIGZ1bmN0aW9uKGMpIHsNCgkJCQllZC5hZGRCdXR0b24oY1swXSwge3RpdGxlIDogY1sxXSwgY21kIDogY1syXSwgdWkgOiBjWzNdfSk7DQoJCQl9KTsNCg0KCQkJLy8gU2VsZWN0IHdob2xlIHRhYmxlIGlzIGEgdGFibGUgYm9yZGVyIGlzIGNsaWNrZWQNCgkJCWlmICghdGlueW1jZS5pc0lFKSB7DQoJCQkJZWQub25DbGljay5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJCWlmIChlLm5vZGVOYW1lID09PSAnVEFCTEUnKQ0KCQkJCQkJZWQuc2VsZWN0aW9uLnNlbGVjdChlKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gSGFuZGxlIG5vZGUgY2hhbmdlIHVwZGF0ZXMNCgkJCWVkLm9uTm9kZUNoYW5nZS5hZGQoZnVuY3Rpb24oZWQsIGNtLCBuKSB7DQoJCQkJdmFyIHA7DQoNCgkJCQluID0gZWQuc2VsZWN0aW9uLmdldFN0YXJ0KCk7DQoJCQkJcCA9IGVkLmRvbS5nZXRQYXJlbnQobiwgJ3RkLHRoLGNhcHRpb24nKTsNCgkJCQljbS5zZXRBY3RpdmUoJ3RhYmxlJywgbi5ub2RlTmFtZSA9PT0gJ1RBQkxFJyB8fCAhIXApOw0KDQoJCQkJLy8gRGlzYWJsZSB0YWJsZSB0b29scyBpZiB3ZSBhcmUgaW4gY2FwdGlvbg0KCQkJCWlmIChwICYmIHAubm9kZU5hbWUgPT09ICdDQVBUSU9OJykNCgkJCQkJcCA9IDA7DQoNCgkJCQljbS5zZXREaXNhYmxlZCgnZGVsZXRlX3RhYmxlJywgIXApOw0KCQkJCWNtLnNldERpc2FibGVkKCdkZWxldGVfY29sJywgIXApOw0KCQkJCWNtLnNldERpc2FibGVkKCdkZWxldGVfdGFibGUnLCAhcCk7DQoJCQkJY20uc2V0RGlzYWJsZWQoJ2RlbGV0ZV9yb3cnLCAhcCk7DQoJCQkJY20uc2V0RGlzYWJsZWQoJ2NvbF9hZnRlcicsICFwKTsNCgkJCQljbS5zZXREaXNhYmxlZCgnY29sX2JlZm9yZScsICFwKTsNCgkJCQljbS5zZXREaXNhYmxlZCgncm93X2FmdGVyJywgIXApOw0KCQkJCWNtLnNldERpc2FibGVkKCdyb3dfYmVmb3JlJywgIXApOw0KCQkJCWNtLnNldERpc2FibGVkKCdyb3dfcHJvcHMnLCAhcCk7DQoJCQkJY20uc2V0RGlzYWJsZWQoJ2NlbGxfcHJvcHMnLCAhcCk7DQoJCQkJY20uc2V0RGlzYWJsZWQoJ3NwbGl0X2NlbGxzJywgIXApOw0KCQkJCWNtLnNldERpc2FibGVkKCdtZXJnZV9jZWxscycsICFwKTsNCgkJCX0pOw0KDQoJCQllZC5vbkluaXQuYWRkKGZ1bmN0aW9uKGVkKSB7DQoJCQkJdmFyIHN0YXJ0VGFibGUsIHN0YXJ0Q2VsbCwgZG9tID0gZWQuZG9tLCB0YWJsZUdyaWQ7DQoNCgkJCQl3aW5NYW4gPSBlZC53aW5kb3dNYW5hZ2VyOw0KDQoJCQkJLy8gQWRkIGNlbGwgc2VsZWN0aW9uIGxvZ2ljDQoJCQkJZWQub25Nb3VzZURvd24uYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCWlmIChlLmJ1dHRvbiAhPSAyKSB7DQoJCQkJCQljbGVhbnVwKCk7DQoNCgkJCQkJCXN0YXJ0Q2VsbCA9IGRvbS5nZXRQYXJlbnQoZS50YXJnZXQsICd0ZCx0aCcpOw0KCQkJCQkJc3RhcnRUYWJsZSA9IGRvbS5nZXRQYXJlbnQoc3RhcnRDZWxsLCAndGFibGUnKTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJZG9tLmJpbmQoZWQuZ2V0RG9jKCksICdtb3VzZW92ZXInLCBmdW5jdGlvbihlKSB7DQoJCQkJCXZhciBzZWwsIHRhYmxlLCB0YXJnZXQgPSBlLnRhcmdldDsNCg0KCQkJCQlpZiAoc3RhcnRDZWxsICYmICh0YWJsZUdyaWQgfHwgdGFyZ2V0ICE9IHN0YXJ0Q2VsbCkgJiYgKHRhcmdldC5ub2RlTmFtZSA9PSAnVEQnIHx8IHRhcmdldC5ub2RlTmFtZSA9PSAnVEgnKSkgew0KCQkJCQkJdGFibGUgPSBkb20uZ2V0UGFyZW50KHRhcmdldCwgJ3RhYmxlJyk7DQoJCQkJCQlpZiAodGFibGUgPT0gc3RhcnRUYWJsZSkgew0KCQkJCQkJCWlmICghdGFibGVHcmlkKSB7DQoJCQkJCQkJCXRhYmxlR3JpZCA9IGNyZWF0ZVRhYmxlR3JpZCh0YWJsZSk7DQoJCQkJCQkJCXRhYmxlR3JpZC5zZXRTdGFydENlbGwoc3RhcnRDZWxsKTsNCg0KCQkJCQkJCQllZC5nZXRCb2R5KCkuc3R5bGUud2Via2l0VXNlclNlbGVjdCA9ICdub25lJzsNCgkJCQkJCQl9DQoNCgkJCQkJCQl0YWJsZUdyaWQuc2V0RW5kQ2VsbCh0YXJnZXQpOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBSZW1vdmUgY3VycmVudCBzZWxlY3Rpb24NCgkJCQkJCXNlbCA9IGVkLnNlbGVjdGlvbi5nZXRTZWwoKTsNCg0KCQkJCQkJaWYgKHNlbC5yZW1vdmVBbGxSYW5nZXMpDQoJCQkJCQkJc2VsLnJlbW92ZUFsbFJhbmdlcygpOw0KCQkJCQkJZWxzZQ0KCQkJCQkJCXNlbC5lbXB0eSgpOw0KDQoJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCWVkLm9uTW91c2VVcC5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJdmFyIHJuZywgc2VsID0gZWQuc2VsZWN0aW9uLCBzZWxlY3RlZENlbGxzLCBuYXRpdmVTZWwgPSBzZWwuZ2V0U2VsKCksIHdhbGtlciwgbm9kZSwgbGFzdE5vZGUsIGVuZE5vZGU7DQoNCgkJCQkJLy8gTW92ZSBzZWxlY3Rpb24gdG8gc3RhcnRDZWxsDQoJCQkJCWlmIChzdGFydENlbGwpIHsNCgkJCQkJCWlmICh0YWJsZUdyaWQpDQoJCQkJCQkJZWQuZ2V0Qm9keSgpLnN0eWxlLndlYmtpdFVzZXJTZWxlY3QgPSAnJzsNCg0KCQkJCQkJZnVuY3Rpb24gc2V0UG9pbnQobm9kZSwgc3RhcnQpIHsNCgkJCQkJCQl2YXIgd2Fsa2VyID0gbmV3IHRpbnltY2UuZG9tLlRyZWVXYWxrZXIobm9kZSwgbm9kZSk7DQoNCgkJCQkJCQlkbyB7DQoJCQkJCQkJCS8vIFRleHQgbm9kZQ0KCQkJCQkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmIHRpbnltY2UudHJpbShub2RlLm5vZGVWYWx1ZSkubGVuZ3RoICE9IDApIHsNCgkJCQkJCQkJCWlmIChzdGFydCkNCgkJCQkJCQkJCQlybmcuc2V0U3RhcnQobm9kZSwgMCk7DQoJCQkJCQkJCQllbHNlDQoJCQkJCQkJCQkJcm5nLnNldEVuZChub2RlLCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpOw0KDQoJCQkJCQkJCQlyZXR1cm47DQoJCQkJCQkJCX0NCg0KCQkJCQkJCQkvLyBCUiBlbGVtZW50DQoJCQkJCQkJCWlmIChub2RlLm5vZGVOYW1lID09ICdCUicpIHsNCgkJCQkJCQkJCWlmIChzdGFydCkNCgkJCQkJCQkJCQlybmcuc2V0U3RhcnRCZWZvcmUobm9kZSk7DQoJCQkJCQkJCQllbHNlDQoJCQkJCQkJCQkJcm5nLnNldEVuZEJlZm9yZShub2RlKTsNCg0KCQkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCQl9DQoJCQkJCQkJfSB3aGlsZSAobm9kZSA9IChzdGFydCA/IHdhbGtlci5uZXh0KCkgOiB3YWxrZXIucHJldigpKSk7DQoJCQkJCQl9Ow0KDQoJCQkJCQkvLyBUcnkgdG8gZXhwYW5kIHRleHQgc2VsZWN0aW9uIGFzIG11Y2ggYXMgd2UgY2FuIG9ubHkgR2Vja28gc3VwcG9ydHMgY2VsbCBzZWxlY3Rpb24NCgkJCQkJCXNlbGVjdGVkQ2VsbHMgPSBkb20uc2VsZWN0KCd0ZC5tY2VTZWxlY3RlZCx0aC5tY2VTZWxlY3RlZCcpOw0KCQkJCQkJaWYgKHNlbGVjdGVkQ2VsbHMubGVuZ3RoID4gMCkgew0KCQkJCQkJCXJuZyA9IGRvbS5jcmVhdGVSbmcoKTsNCgkJCQkJCQlub2RlID0gc2VsZWN0ZWRDZWxsc1swXTsNCgkJCQkJCQllbmROb2RlID0gc2VsZWN0ZWRDZWxsc1tzZWxlY3RlZENlbGxzLmxlbmd0aCAtIDFdOw0KDQoJCQkJCQkJc2V0UG9pbnQobm9kZSwgMSk7DQoJCQkJCQkJd2Fsa2VyID0gbmV3IHRpbnltY2UuZG9tLlRyZWVXYWxrZXIobm9kZSwgZG9tLmdldFBhcmVudChzZWxlY3RlZENlbGxzWzBdLCAndGFibGUnKSk7DQoNCgkJCQkJCQlkbyB7DQoJCQkJCQkJCWlmIChub2RlLm5vZGVOYW1lID09ICdURCcgfHwgbm9kZS5ub2RlTmFtZSA9PSAnVEgnKSB7DQoJCQkJCQkJCQlpZiAoIWRvbS5oYXNDbGFzcyhub2RlLCAnbWNlU2VsZWN0ZWQnKSkNCgkJCQkJCQkJCQlicmVhazsNCg0KCQkJCQkJCQkJbGFzdE5vZGUgPSBub2RlOw0KCQkJCQkJCQl9DQoJCQkJCQkJfSB3aGlsZSAobm9kZSA9IHdhbGtlci5uZXh0KCkpOw0KDQoJCQkJCQkJc2V0UG9pbnQobGFzdE5vZGUpOw0KDQoJCQkJCQkJc2VsLnNldFJuZyhybmcpOw0KCQkJCQkJfQ0KDQoJCQkJCQllZC5ub2RlQ2hhbmdlZCgpOw0KCQkJCQkJc3RhcnRDZWxsID0gdGFibGVHcmlkID0gc3RhcnRUYWJsZSA9IG51bGw7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCWVkLm9uS2V5VXAuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCWNsZWFudXAoKTsNCgkJCQl9KTsNCg0KCQkJCS8vIEFkZCBjb250ZXh0IG1lbnUNCgkJCQlpZiAoZWQgJiYgZWQucGx1Z2lucy5jb250ZXh0bWVudSkgew0KCQkJCQllZC5wbHVnaW5zLmNvbnRleHRtZW51Lm9uQ29udGV4dE1lbnUuYWRkKGZ1bmN0aW9uKHRoLCBtLCBlKSB7DQoJCQkJCQl2YXIgc20sIHNlID0gZWQuc2VsZWN0aW9uLCBlbCA9IHNlLmdldE5vZGUoKSB8fCBlZC5nZXRCb2R5KCk7DQoNCgkJCQkJCWlmIChlZC5kb20uZ2V0UGFyZW50KGUsICd0ZCcpIHx8IGVkLmRvbS5nZXRQYXJlbnQoZSwgJ3RoJykgfHwgZWQuZG9tLnNlbGVjdCgndGQubWNlU2VsZWN0ZWQsdGgubWNlU2VsZWN0ZWQnKS5sZW5ndGgpIHsNCgkJCQkJCQltLnJlbW92ZUFsbCgpOw0KDQoJCQkJCQkJaWYgKGVsLm5vZGVOYW1lID09ICdBJyAmJiAhZWQuZG9tLmdldEF0dHJpYihlbCwgJ25hbWUnKSkgew0KCQkJCQkJCQltLmFkZCh7dGl0bGUgOiAnYWR2YW5jZWQubGlua19kZXNjJywgaWNvbiA6ICdsaW5rJywgY21kIDogZWQucGx1Z2lucy5hZHZsaW5rID8gJ21jZUFkdkxpbmsnIDogJ21jZUxpbmsnLCB1aSA6IHRydWV9KTsNCgkJCQkJCQkJbS5hZGQoe3RpdGxlIDogJ2FkdmFuY2VkLnVubGlua19kZXNjJywgaWNvbiA6ICd1bmxpbmsnLCBjbWQgOiAnVW5MaW5rJ30pOw0KCQkJCQkJCQltLmFkZFNlcGFyYXRvcigpOw0KCQkJCQkJCX0NCg0KCQkJCQkJCWlmIChlbC5ub2RlTmFtZSA9PSAnSU1HJyAmJiBlbC5jbGFzc05hbWUuaW5kZXhPZignbWNlSXRlbScpID09IC0xKSB7DQoJCQkJCQkJCW0uYWRkKHt0aXRsZSA6ICdhZHZhbmNlZC5pbWFnZV9kZXNjJywgaWNvbiA6ICdpbWFnZScsIGNtZCA6IGVkLnBsdWdpbnMuYWR2aW1hZ2UgPyAnbWNlQWR2SW1hZ2UnIDogJ21jZUltYWdlJywgdWkgOiB0cnVlfSk7DQoJCQkJCQkJCW0uYWRkU2VwYXJhdG9yKCk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJbS5hZGQoe3RpdGxlIDogJ3RhYmxlLmRlc2MnLCBpY29uIDogJ3RhYmxlJywgY21kIDogJ21jZUluc2VydFRhYmxlJywgdmFsdWUgOiB7YWN0aW9uIDogJ2luc2VydCd9fSk7DQoJCQkJCQkJbS5hZGQoe3RpdGxlIDogJ3RhYmxlLnByb3BzX2Rlc2MnLCBpY29uIDogJ3RhYmxlX3Byb3BzJywgY21kIDogJ21jZUluc2VydFRhYmxlJ30pOw0KCQkJCQkJCW0uYWRkKHt0aXRsZSA6ICd0YWJsZS5kZWwnLCBpY29uIDogJ2RlbGV0ZV90YWJsZScsIGNtZCA6ICdtY2VUYWJsZURlbGV0ZSd9KTsNCgkJCQkJCQltLmFkZFNlcGFyYXRvcigpOw0KDQoJCQkJCQkJLy8gQ2VsbCBtZW51DQoJCQkJCQkJc20gPSBtLmFkZE1lbnUoe3RpdGxlIDogJ3RhYmxlLmNlbGwnfSk7DQoJCQkJCQkJc20uYWRkKHt0aXRsZSA6ICd0YWJsZS5jZWxsX2Rlc2MnLCBpY29uIDogJ2NlbGxfcHJvcHMnLCBjbWQgOiAnbWNlVGFibGVDZWxsUHJvcHMnfSk7DQoJCQkJCQkJc20uYWRkKHt0aXRsZSA6ICd0YWJsZS5zcGxpdF9jZWxsc19kZXNjJywgaWNvbiA6ICdzcGxpdF9jZWxscycsIGNtZCA6ICdtY2VUYWJsZVNwbGl0Q2VsbHMnfSk7DQoJCQkJCQkJc20uYWRkKHt0aXRsZSA6ICd0YWJsZS5tZXJnZV9jZWxsc19kZXNjJywgaWNvbiA6ICdtZXJnZV9jZWxscycsIGNtZCA6ICdtY2VUYWJsZU1lcmdlQ2VsbHMnfSk7DQoNCgkJCQkJCQkvLyBSb3cgbWVudQ0KCQkJCQkJCXNtID0gbS5hZGRNZW51KHt0aXRsZSA6ICd0YWJsZS5yb3cnfSk7DQoJCQkJCQkJc20uYWRkKHt0aXRsZSA6ICd0YWJsZS5yb3dfZGVzYycsIGljb24gOiAncm93X3Byb3BzJywgY21kIDogJ21jZVRhYmxlUm93UHJvcHMnfSk7DQoJCQkJCQkJc20uYWRkKHt0aXRsZSA6ICd0YWJsZS5yb3dfYmVmb3JlX2Rlc2MnLCBpY29uIDogJ3Jvd19iZWZvcmUnLCBjbWQgOiAnbWNlVGFibGVJbnNlcnRSb3dCZWZvcmUnfSk7DQoJCQkJCQkJc20uYWRkKHt0aXRsZSA6ICd0YWJsZS5yb3dfYWZ0ZXJfZGVzYycsIGljb24gOiAncm93X2FmdGVyJywgY21kIDogJ21jZVRhYmxlSW5zZXJ0Um93QWZ0ZXInfSk7DQoJCQkJCQkJc20uYWRkKHt0aXRsZSA6ICd0YWJsZS5kZWxldGVfcm93X2Rlc2MnLCBpY29uIDogJ2RlbGV0ZV9yb3cnLCBjbWQgOiAnbWNlVGFibGVEZWxldGVSb3cnfSk7DQoJCQkJCQkJc20uYWRkU2VwYXJhdG9yKCk7DQoJCQkJCQkJc20uYWRkKHt0aXRsZSA6ICd0YWJsZS5jdXRfcm93X2Rlc2MnLCBpY29uIDogJ2N1dCcsIGNtZCA6ICdtY2VUYWJsZUN1dFJvdyd9KTsNCgkJCQkJCQlzbS5hZGQoe3RpdGxlIDogJ3RhYmxlLmNvcHlfcm93X2Rlc2MnLCBpY29uIDogJ2NvcHknLCBjbWQgOiAnbWNlVGFibGVDb3B5Um93J30pOw0KCQkJCQkJCXNtLmFkZCh7dGl0bGUgOiAndGFibGUucGFzdGVfcm93X2JlZm9yZV9kZXNjJywgaWNvbiA6ICdwYXN0ZScsIGNtZCA6ICdtY2VUYWJsZVBhc3RlUm93QmVmb3JlJ30pLnNldERpc2FibGVkKCFjbGlwYm9hcmRSb3dzKTsNCgkJCQkJCQlzbS5hZGQoe3RpdGxlIDogJ3RhYmxlLnBhc3RlX3Jvd19hZnRlcl9kZXNjJywgaWNvbiA6ICdwYXN0ZScsIGNtZCA6ICdtY2VUYWJsZVBhc3RlUm93QWZ0ZXInfSkuc2V0RGlzYWJsZWQoIWNsaXBib2FyZFJvd3MpOw0KDQoJCQkJCQkJLy8gQ29sdW1uIG1lbnUNCgkJCQkJCQlzbSA9IG0uYWRkTWVudSh7dGl0bGUgOiAndGFibGUuY29sJ30pOw0KCQkJCQkJCXNtLmFkZCh7dGl0bGUgOiAndGFibGUuY29sX2JlZm9yZV9kZXNjJywgaWNvbiA6ICdjb2xfYmVmb3JlJywgY21kIDogJ21jZVRhYmxlSW5zZXJ0Q29sQmVmb3JlJ30pOw0KCQkJCQkJCXNtLmFkZCh7dGl0bGUgOiAndGFibGUuY29sX2FmdGVyX2Rlc2MnLCBpY29uIDogJ2NvbF9hZnRlcicsIGNtZCA6ICdtY2VUYWJsZUluc2VydENvbEFmdGVyJ30pOw0KCQkJCQkJCXNtLmFkZCh7dGl0bGUgOiAndGFibGUuZGVsZXRlX2NvbF9kZXNjJywgaWNvbiA6ICdkZWxldGVfY29sJywgY21kIDogJ21jZVRhYmxlRGVsZXRlQ29sJ30pOw0KCQkJCQkJfSBlbHNlDQoJCQkJCQkJbS5hZGQoe3RpdGxlIDogJ3RhYmxlLmRlc2MnLCBpY29uIDogJ3RhYmxlJywgY21kIDogJ21jZUluc2VydFRhYmxlJ30pOw0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQkvLyBGaXhlcyBhbiBpc3N1ZSBvbiBHZWNrbyB3aGVyZSBpdCdzIGltcG9zc2libGUgdG8gcGxhY2UgdGhlIGNhcmV0IGJlaGluZCBhIHRhYmxlDQoJCQkJLy8gVGhpcyBmaXggd2lsbCBmb3JjZSBhIHBhcmFncmFwaCBlbGVtZW50IGFmdGVyIHRoZSB0YWJsZSBidXQgb25seSB3aGVuIHRoZSBmb3JjZWRfcm9vdF9ibG9jayBzZXR0aW5nIGlzIGVuYWJsZWQNCgkJCQlpZiAoIXRpbnltY2UuaXNJRSkgew0KCQkJCQlmdW5jdGlvbiBmaXhUYWJsZUNhcmV0UG9zKCkgew0KCQkJCQkJdmFyIGxhc3Q7DQoNCgkJCQkJCS8vIFNraXAgZW1wdHkgdGV4dCBub2RlcyBmb3JtIHRoZSBlbmQNCgkJCQkJCWZvciAobGFzdCA9IGVkLmdldEJvZHkoKS5sYXN0Q2hpbGQ7IGxhc3QgJiYgbGFzdC5ub2RlVHlwZSA9PSAzICYmICFsYXN0Lm5vZGVWYWx1ZS5sZW5ndGg7IGxhc3QgPSBsYXN0LnByZXZpb3VzU2libGluZykgOw0KDQoJCQkJCQlpZiAobGFzdCAmJiBsYXN0Lm5vZGVOYW1lID09ICdUQUJMRScpDQoJCQkJCQkJZWQuZG9tLmFkZChlZC5nZXRCb2R5KCksICdwJywgbnVsbCwgJzxiciBtY2VfYm9ndXM9IjEiIC8+Jyk7DQoJCQkJCX07DQoNCgkJCQkJLy8gRml4ZXMgYW4gYnVnIHdoZXJlIGl0J3MgaW1wb3NzaWJsZSB0byBwbGFjZSB0aGUgY2FyZXQgYmVmb3JlIGEgdGFibGUgaW4gR2Vja28NCgkJCQkJLy8gdGhpcyBmaXggc29sdmVzIGl0IGJ5IGRldGVjdGluZyB3aGVuIHRoZSBjYXJldCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHN1Y2ggYSB0YWJsZQ0KCQkJCQkvLyBhbmQgdGhlbiBtYW51YWxseSBtb3ZlcyB0aGUgY2FyZXQgaW5mcm9udCBvZiB0aGUgdGFibGUNCgkJCQkJaWYgKHRpbnltY2UuaXNHZWNrbykgew0KCQkJCQkJZWQub25LZXlEb3duLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJCXZhciBybmcsIHRhYmxlLCBkb20gPSBlZC5kb207DQoNCgkJCQkJCQkvLyBPbiBnZWNrbyBpdCdzIG5vdCBwb3NzaWJsZSB0byBwbGFjZSB0aGUgY2FyZXQgYmVmb3JlIGEgdGFibGUNCgkJCQkJCQlpZiAoZS5rZXlDb2RlID09IDM3IHx8IGUua2V5Q29kZSA9PSAzOCkgew0KCQkJCQkJCQlybmcgPSBlZC5zZWxlY3Rpb24uZ2V0Um5nKCk7DQoJCQkJCQkJCXRhYmxlID0gZG9tLmdldFBhcmVudChybmcuc3RhcnRDb250YWluZXIsICd0YWJsZScpOw0KDQoJCQkJCQkJCWlmICh0YWJsZSAmJiBlZC5nZXRCb2R5KCkuZmlyc3RDaGlsZCA9PSB0YWJsZSkgew0KCQkJCQkJCQkJaWYgKGlzQXRTdGFydChybmcsIHRhYmxlKSkgew0KCQkJCQkJCQkJCXJuZyA9IGRvbS5jcmVhdGVSbmcoKTsNCg0KCQkJCQkJCQkJCXJuZy5zZXRTdGFydEJlZm9yZSh0YWJsZSk7DQoJCQkJCQkJCQkJcm5nLnNldEVuZEJlZm9yZSh0YWJsZSk7DQoNCgkJCQkJCQkJCQllZC5zZWxlY3Rpb24uc2V0Um5nKHJuZyk7DQoNCgkJCQkJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9KTsNCgkJCQkJfQ0KDQoJCQkJCWVkLm9uS2V5VXAuYWRkKGZpeFRhYmxlQ2FyZXRQb3MpOw0KCQkJCQllZC5vblNldENvbnRlbnQuYWRkKGZpeFRhYmxlQ2FyZXRQb3MpOw0KCQkJCQllZC5vblZpc3VhbEFpZC5hZGQoZml4VGFibGVDYXJldFBvcyk7DQoNCgkJCQkJZWQub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQkJdmFyIGxhc3QgPSBvLm5vZGUubGFzdENoaWxkOw0KDQoJCQkJCQlpZiAobGFzdCAmJiBsYXN0LmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJiYgbGFzdC5maXJzdENoaWxkLm5vZGVOYW1lID09ICdCUicpDQoJCQkJCQkJZWQuZG9tLnJlbW92ZShsYXN0KTsNCgkJCQkJfSk7DQoNCgkJCQkJZml4VGFibGVDYXJldFBvcygpOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQkvLyBSZWdpc3RlciBhY3Rpb24gY29tbWFuZHMNCgkJCWVhY2goew0KCQkJCW1jZVRhYmxlU3BsaXRDZWxscyA6IGZ1bmN0aW9uKGdyaWQpIHsNCgkJCQkJZ3JpZC5zcGxpdCgpOw0KCQkJCX0sDQoNCgkJCQltY2VUYWJsZU1lcmdlQ2VsbHMgOiBmdW5jdGlvbihncmlkKSB7DQoJCQkJCXZhciByb3dTcGFuLCBjb2xTcGFuLCBjZWxsOw0KDQoJCQkJCWNlbGwgPSBlZC5kb20uZ2V0UGFyZW50KGVkLnNlbGVjdGlvbi5nZXROb2RlKCksICd0aCx0ZCcpOw0KCQkJCQlpZiAoY2VsbCkgew0KCQkJCQkJcm93U3BhbiA9IGNlbGwucm93U3BhbjsNCgkJCQkJCWNvbFNwYW4gPSBjZWxsLmNvbFNwYW47DQoJCQkJCX0NCg0KCQkJCQlpZiAoIWVkLmRvbS5zZWxlY3QoJ3RkLm1jZVNlbGVjdGVkLHRoLm1jZVNlbGVjdGVkJykubGVuZ3RoKSB7DQoJCQkJCQl3aW5NYW4ub3Blbih7DQoJCQkJCQkJdXJsIDogdXJsICsgJy9tZXJnZV9jZWxscy5odG0nLA0KCQkJCQkJCXdpZHRoIDogMjQwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygndGFibGUubWVyZ2VfY2VsbHNfZGVsdGFfd2lkdGgnLCAwKSksDQoJCQkJCQkJaGVpZ2h0IDogMTEwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygndGFibGUubWVyZ2VfY2VsbHNfZGVsdGFfaGVpZ2h0JywgMCkpLA0KCQkJCQkJCWlubGluZSA6IDENCgkJCQkJCX0sIHsNCgkJCQkJCQlyb3dzIDogcm93U3BhbiwNCgkJCQkJCQljb2xzIDogY29sU3BhbiwNCgkJCQkJCQlvbmFjdGlvbiA6IGZ1bmN0aW9uKGRhdGEpIHsNCgkJCQkJCQkJZ3JpZC5tZXJnZShjZWxsLCBkYXRhLmNvbHMsIGRhdGEucm93cyk7DQoJCQkJCQkJfSwNCgkJCQkJCQlwbHVnaW5fdXJsIDogdXJsDQoJCQkJCQl9KTsNCgkJCQkJfSBlbHNlDQoJCQkJCQlncmlkLm1lcmdlKCk7DQoJCQkJfSwNCg0KCQkJCW1jZVRhYmxlSW5zZXJ0Um93QmVmb3JlIDogZnVuY3Rpb24oZ3JpZCkgew0KCQkJCQlncmlkLmluc2VydFJvdyh0cnVlKTsNCgkJCQl9LA0KDQoJCQkJbWNlVGFibGVJbnNlcnRSb3dBZnRlciA6IGZ1bmN0aW9uKGdyaWQpIHsNCgkJCQkJZ3JpZC5pbnNlcnRSb3coKTsNCgkJCQl9LA0KDQoJCQkJbWNlVGFibGVJbnNlcnRDb2xCZWZvcmUgOiBmdW5jdGlvbihncmlkKSB7DQoJCQkJCWdyaWQuaW5zZXJ0Q29sKHRydWUpOw0KCQkJCX0sDQoNCgkJCQltY2VUYWJsZUluc2VydENvbEFmdGVyIDogZnVuY3Rpb24oZ3JpZCkgew0KCQkJCQlncmlkLmluc2VydENvbCgpOw0KCQkJCX0sDQoNCgkJCQltY2VUYWJsZURlbGV0ZUNvbCA6IGZ1bmN0aW9uKGdyaWQpIHsNCgkJCQkJZ3JpZC5kZWxldGVDb2xzKCk7DQoJCQkJfSwNCg0KCQkJCW1jZVRhYmxlRGVsZXRlUm93IDogZnVuY3Rpb24oZ3JpZCkgew0KCQkJCQlncmlkLmRlbGV0ZVJvd3MoKTsNCgkJCQl9LA0KDQoJCQkJbWNlVGFibGVDdXRSb3cgOiBmdW5jdGlvbihncmlkKSB7DQoJCQkJCWNsaXBib2FyZFJvd3MgPSBncmlkLmN1dFJvd3MoKTsNCgkJCQl9LA0KDQoJCQkJbWNlVGFibGVDb3B5Um93IDogZnVuY3Rpb24oZ3JpZCkgew0KCQkJCQljbGlwYm9hcmRSb3dzID0gZ3JpZC5jb3B5Um93cygpOw0KCQkJCX0sDQoNCgkJCQltY2VUYWJsZVBhc3RlUm93QmVmb3JlIDogZnVuY3Rpb24oZ3JpZCkgew0KCQkJCQlncmlkLnBhc3RlUm93cyhjbGlwYm9hcmRSb3dzLCB0cnVlKTsNCgkJCQl9LA0KDQoJCQkJbWNlVGFibGVQYXN0ZVJvd0FmdGVyIDogZnVuY3Rpb24oZ3JpZCkgew0KCQkJCQlncmlkLnBhc3RlUm93cyhjbGlwYm9hcmRSb3dzKTsNCgkJCQl9LA0KDQoJCQkJbWNlVGFibGVEZWxldGUgOiBmdW5jdGlvbihncmlkKSB7DQoJCQkJCWdyaWQuZGVsZXRlVGFibGUoKTsNCgkJCQl9DQoJCQl9LCBmdW5jdGlvbihmdW5jLCBuYW1lKSB7DQoJCQkJZWQuYWRkQ29tbWFuZChuYW1lLCBmdW5jdGlvbigpIHsNCgkJCQkJdmFyIGdyaWQgPSBjcmVhdGVUYWJsZUdyaWQoKTsNCg0KCQkJCQlpZiAoZ3JpZCkgew0KCQkJCQkJZnVuYyhncmlkKTsNCgkJCQkJCWVkLmV4ZWNDb21tYW5kKCdtY2VSZXBhaW50Jyk7DQoJCQkJCQljbGVhbnVwKCk7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQkvLyBSZWdpc3RlciBkaWFsb2cgY29tbWFuZHMNCgkJCWVhY2goew0KCQkJCW1jZUluc2VydFRhYmxlIDogZnVuY3Rpb24odmFsKSB7DQoJCQkJCXdpbk1hbi5vcGVuKHsNCgkJCQkJCXVybCA6IHVybCArICcvdGFibGUuaHRtJywNCgkJCQkJCXdpZHRoIDogNDAwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygndGFibGUudGFibGVfZGVsdGFfd2lkdGgnLCAwKSksDQoJCQkJCQloZWlnaHQgOiAzMjAgKyBwYXJzZUludChlZC5nZXRMYW5nKCd0YWJsZS50YWJsZV9kZWx0YV9oZWlnaHQnLCAwKSksDQoJCQkJCQlpbmxpbmUgOiAxDQoJCQkJCX0sIHsNCgkJCQkJCXBsdWdpbl91cmwgOiB1cmwsDQoJCQkJCQlhY3Rpb24gOiB2YWwgPyB2YWwuYWN0aW9uIDogMA0KCQkJCQl9KTsNCgkJCQl9LA0KDQoJCQkJbWNlVGFibGVSb3dQcm9wcyA6IGZ1bmN0aW9uKCkgew0KCQkJCQl3aW5NYW4ub3Blbih7DQoJCQkJCQl1cmwgOiB1cmwgKyAnL3Jvdy5odG0nLA0KCQkJCQkJd2lkdGggOiA0MDAgKyBwYXJzZUludChlZC5nZXRMYW5nKCd0YWJsZS5yb3dwcm9wc19kZWx0YV93aWR0aCcsIDApKSwNCgkJCQkJCWhlaWdodCA6IDI5NSArIHBhcnNlSW50KGVkLmdldExhbmcoJ3RhYmxlLnJvd3Byb3BzX2RlbHRhX2hlaWdodCcsIDApKSwNCgkJCQkJCWlubGluZSA6IDENCgkJCQkJfSwgew0KCQkJCQkJcGx1Z2luX3VybCA6IHVybA0KCQkJCQl9KTsNCgkJCQl9LA0KDQoJCQkJbWNlVGFibGVDZWxsUHJvcHMgOiBmdW5jdGlvbigpIHsNCgkJCQkJd2luTWFuLm9wZW4oew0KCQkJCQkJdXJsIDogdXJsICsgJy9jZWxsLmh0bScsDQoJCQkJCQl3aWR0aCA6IDQwMCArIHBhcnNlSW50KGVkLmdldExhbmcoJ3RhYmxlLmNlbGxwcm9wc19kZWx0YV93aWR0aCcsIDApKSwNCgkJCQkJCWhlaWdodCA6IDI5NSArIHBhcnNlSW50KGVkLmdldExhbmcoJ3RhYmxlLmNlbGxwcm9wc19kZWx0YV9oZWlnaHQnLCAwKSksDQoJCQkJCQlpbmxpbmUgOiAxDQoJCQkJCX0sIHsNCgkJCQkJCXBsdWdpbl91cmwgOiB1cmwNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfSwgZnVuY3Rpb24oZnVuYywgbmFtZSkgew0KCQkJCWVkLmFkZENvbW1hbmQobmFtZSwgZnVuY3Rpb24odWksIHZhbCkgew0KCQkJCQlmdW5jKHZhbCk7DQoJCQkJfSk7DQoJCQl9KTsNCgkJfQ0KCX0pOw0KDQoJLy8gUmVnaXN0ZXIgcGx1Z2luDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgndGFibGUnLCB0aW55bWNlLnBsdWdpbnMuVGFibGVQbHVnaW4pOw0KfSkodGlueW1jZSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/js/cell.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgZWQ7DQoNCmZ1bmN0aW9uIGluaXQoKSB7DQoJZWQgPSB0aW55TUNFUG9wdXAuZWRpdG9yOw0KCXRpbnlNQ0VQb3B1cC5yZXNpemVUb0lubmVyU2l6ZSgpOw0KDQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2tncm91bmRpbWFnZWJyb3dzZXJjb250YWluZXInKS5pbm5lckhUTUwgPSBnZXRCcm93c2VySFRNTCgnYmFja2dyb3VuZGltYWdlYnJvd3NlcicsJ2JhY2tncm91bmRpbWFnZScsJ2ltYWdlJywndGFibGUnKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm9yZGVyY29sb3JfcGlja2NvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldENvbG9yUGlja2VySFRNTCgnYm9yZGVyY29sb3JfcGljaycsJ2JvcmRlcmNvbG9yJyk7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JnY29sb3JfcGlja2NvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldENvbG9yUGlja2VySFRNTCgnYmdjb2xvcl9waWNrJywnYmdjb2xvcicpDQoNCgl2YXIgaW5zdCA9IGVkOw0KCXZhciB0ZEVsbSA9IGVkLmRvbS5nZXRQYXJlbnQoZWQuc2VsZWN0aW9uLmdldFN0YXJ0KCksICJ0ZCx0aCIpOw0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoJdmFyIHN0ID0gZWQuZG9tLnBhcnNlU3R5bGUoZWQuZG9tLmdldEF0dHJpYih0ZEVsbSwgInN0eWxlIikpOw0KDQoJLy8gR2V0IHRhYmxlIGNlbGwgZGF0YQ0KCXZhciBjZWxsdHlwZSA9IHRkRWxtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7DQoJdmFyIGFsaWduID0gZWQuZG9tLmdldEF0dHJpYih0ZEVsbSwgJ2FsaWduJyk7DQoJdmFyIHZhbGlnbiA9IGVkLmRvbS5nZXRBdHRyaWIodGRFbG0sICd2YWxpZ24nKTsNCgl2YXIgd2lkdGggPSB0cmltU2l6ZShnZXRTdHlsZSh0ZEVsbSwgJ3dpZHRoJywgJ3dpZHRoJykpOw0KCXZhciBoZWlnaHQgPSB0cmltU2l6ZShnZXRTdHlsZSh0ZEVsbSwgJ2hlaWdodCcsICdoZWlnaHQnKSk7DQoJdmFyIGJvcmRlcmNvbG9yID0gY29udmVydFJHQlRvSGV4KGdldFN0eWxlKHRkRWxtLCAnYm9yZGVyY29sb3InLCAnYm9yZGVyTGVmdENvbG9yJykpOw0KCXZhciBiZ2NvbG9yID0gY29udmVydFJHQlRvSGV4KGdldFN0eWxlKHRkRWxtLCAnYmdjb2xvcicsICdiYWNrZ3JvdW5kQ29sb3InKSk7DQoJdmFyIGNsYXNzTmFtZSA9IGVkLmRvbS5nZXRBdHRyaWIodGRFbG0sICdjbGFzcycpOw0KCXZhciBiYWNrZ3JvdW5kaW1hZ2UgPSBnZXRTdHlsZSh0ZEVsbSwgJ2JhY2tncm91bmQnLCAnYmFja2dyb3VuZEltYWdlJykucmVwbGFjZShuZXcgUmVnRXhwKCJ1cmxcXChbJ1wiXT8oW14nXCJdKilbJ1wiXT9cXCkiLCAnZ2knKSwgIiQxIik7DQoJdmFyIGlkID0gZWQuZG9tLmdldEF0dHJpYih0ZEVsbSwgJ2lkJyk7DQoJdmFyIGxhbmcgPSBlZC5kb20uZ2V0QXR0cmliKHRkRWxtLCAnbGFuZycpOw0KCXZhciBkaXIgPSBlZC5kb20uZ2V0QXR0cmliKHRkRWxtLCAnZGlyJyk7DQoJdmFyIHNjb3BlID0gZWQuZG9tLmdldEF0dHJpYih0ZEVsbSwgJ3Njb3BlJyk7DQoNCgkvLyBTZXR1cCBmb3JtDQoJYWRkQ2xhc3Nlc1RvTGlzdCgnY2xhc3MnLCAndGFibGVfY2VsbF9zdHlsZXMnKTsNCglUaW55TUNFX0VkaXRhYmxlU2VsZWN0cy5pbml0KCk7DQoNCglpZiAoIWVkLmRvbS5oYXNDbGFzcyh0ZEVsbSwgJ21jZVNlbGVjdGVkJykpIHsNCgkJZm9ybU9iai5ib3JkZXJjb2xvci52YWx1ZSA9IGJvcmRlcmNvbG9yOw0KCQlmb3JtT2JqLmJnY29sb3IudmFsdWUgPSBiZ2NvbG9yOw0KCQlmb3JtT2JqLmJhY2tncm91bmRpbWFnZS52YWx1ZSA9IGJhY2tncm91bmRpbWFnZTsNCgkJZm9ybU9iai53aWR0aC52YWx1ZSA9IHdpZHRoOw0KCQlmb3JtT2JqLmhlaWdodC52YWx1ZSA9IGhlaWdodDsNCgkJZm9ybU9iai5pZC52YWx1ZSA9IGlkOw0KCQlmb3JtT2JqLmxhbmcudmFsdWUgPSBsYW5nOw0KCQlmb3JtT2JqLnN0eWxlLnZhbHVlID0gZWQuZG9tLnNlcmlhbGl6ZVN0eWxlKHN0KTsNCgkJc2VsZWN0QnlWYWx1ZShmb3JtT2JqLCAnYWxpZ24nLCBhbGlnbik7DQoJCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ3ZhbGlnbicsIHZhbGlnbik7DQoJCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ2NsYXNzJywgY2xhc3NOYW1lLCB0cnVlLCB0cnVlKTsNCgkJc2VsZWN0QnlWYWx1ZShmb3JtT2JqLCAnY2VsbHR5cGUnLCBjZWxsdHlwZSk7DQoJCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ2RpcicsIGRpcik7DQoJCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ3Njb3BlJywgc2NvcGUpOw0KDQoJCS8vIFJlc2l6ZSBzb21lIGVsZW1lbnRzDQoJCWlmIChpc1Zpc2libGUoJ2JhY2tncm91bmRpbWFnZWJyb3dzZXInKSkNCgkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrZ3JvdW5kaW1hZ2UnKS5zdHlsZS53aWR0aCA9ICcxODBweCc7DQoNCgkJdXBkYXRlQ29sb3IoJ2JvcmRlcmNvbG9yX3BpY2snLCAnYm9yZGVyY29sb3InKTsNCgkJdXBkYXRlQ29sb3IoJ2JnY29sb3JfcGljaycsICdiZ2NvbG9yJyk7DQoJfSBlbHNlDQoJCXRpbnlNQ0VQb3B1cC5kb20uaGlkZSgnYWN0aW9uJyk7DQp9DQoNCmZ1bmN0aW9uIHVwZGF0ZUFjdGlvbigpIHsNCgl2YXIgZWwsIGluc3QgPSBlZCwgdGRFbG0sIHRyRWxtLCB0YWJsZUVsbSwgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KDQoJdGlueU1DRVBvcHVwLnJlc3RvcmVTZWxlY3Rpb24oKTsNCgllbCA9IGVkLnNlbGVjdGlvbi5nZXRTdGFydCgpOw0KCXRkRWxtID0gZWQuZG9tLmdldFBhcmVudChlbCwgInRkLHRoIik7DQoJdHJFbG0gPSBlZC5kb20uZ2V0UGFyZW50KGVsLCAidHIiKTsNCgl0YWJsZUVsbSA9IGVkLmRvbS5nZXRQYXJlbnQoZWwsICJ0YWJsZSIpOw0KDQoJLy8gQ2VsbCBpcyBzZWxlY3RlZA0KCWlmIChlZC5kb20uaGFzQ2xhc3ModGRFbG0sICdtY2VTZWxlY3RlZCcpKSB7DQoJCS8vIFVwZGF0ZSBhbGwgc2VsZWN0ZWQgc2VsbHMNCgkJdGlueW1jZS5lYWNoKGVkLmRvbS5zZWxlY3QoJ3RkLm1jZVNlbGVjdGVkLHRoLm1jZVNlbGVjdGVkJyksIGZ1bmN0aW9uKHRkKSB7DQoJCQl1cGRhdGVDZWxsKHRkKTsNCgkJfSk7DQoNCgkJZWQuYWRkVmlzdWFsKCk7DQoJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCWluc3QuZXhlY0NvbW1hbmQoJ21jZUVuZFVuZG9MZXZlbCcpOw0KCQl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCgkJcmV0dXJuOw0KCX0NCg0KCWVkLmV4ZWNDb21tYW5kKCdtY2VCZWdpblVuZG9MZXZlbCcpOw0KDQoJc3dpdGNoIChnZXRTZWxlY3RWYWx1ZShmb3JtT2JqLCAnYWN0aW9uJykpIHsNCgkJY2FzZSAiY2VsbCI6DQoJCQl2YXIgY2VsbHR5cGUgPSBnZXRTZWxlY3RWYWx1ZShmb3JtT2JqLCAnY2VsbHR5cGUnKTsNCgkJCXZhciBzY29wZSA9IGdldFNlbGVjdFZhbHVlKGZvcm1PYmosICdzY29wZScpOw0KDQoJCQlmdW5jdGlvbiBkb1VwZGF0ZShzKSB7DQoJCQkJaWYgKHMpIHsNCgkJCQkJdXBkYXRlQ2VsbCh0ZEVsbSk7DQoNCgkJCQkJZWQuYWRkVmlzdWFsKCk7DQoJCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCQkJCWluc3QuZXhlY0NvbW1hbmQoJ21jZUVuZFVuZG9MZXZlbCcpOw0KCQkJCQl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCgkJCQl9DQoJCQl9Ow0KDQoJCQlpZiAoZWQuZ2V0UGFyYW0oImFjY2Vzc2liaWxpdHlfd2FybmluZ3MiLCAxKSkgew0KCQkJCWlmIChjZWxsdHlwZSA9PSAidGgiICYmIHNjb3BlID09ICIiKQ0KCQkJCQl0aW55TUNFUG9wdXAuY29uZmlybShlZC5nZXRMYW5nKCd0YWJsZV9kbGcubWlzc2luZ19zY29wZScsICcnLCB0cnVlKSwgZG9VcGRhdGUpOw0KCQkJCWVsc2UNCgkJCQkJZG9VcGRhdGUoMSk7DQoNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCXVwZGF0ZUNlbGwodGRFbG0pOw0KCQkJYnJlYWs7DQoNCgkJY2FzZSAicm93IjoNCgkJCXZhciBjZWxsID0gdHJFbG0uZmlyc3RDaGlsZDsNCg0KCQkJaWYgKGNlbGwubm9kZU5hbWUgIT0gIlREIiAmJiBjZWxsLm5vZGVOYW1lICE9ICJUSCIpDQoJCQkJY2VsbCA9IG5leHRDZWxsKGNlbGwpOw0KDQoJCQlkbyB7DQoJCQkJY2VsbCA9IHVwZGF0ZUNlbGwoY2VsbCwgdHJ1ZSk7DQoJCQl9IHdoaWxlICgoY2VsbCA9IG5leHRDZWxsKGNlbGwpKSAhPSBudWxsKTsNCg0KCQkJYnJlYWs7DQoNCgkJY2FzZSAiYWxsIjoNCgkJCXZhciByb3dzID0gdGFibGVFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRyIik7DQoNCgkJCWZvciAodmFyIGk9MDsgaTxyb3dzLmxlbmd0aDsgaSsrKSB7DQoJCQkJdmFyIGNlbGwgPSByb3dzW2ldLmZpcnN0Q2hpbGQ7DQoNCgkJCQlpZiAoY2VsbC5ub2RlTmFtZSAhPSAiVEQiICYmIGNlbGwubm9kZU5hbWUgIT0gIlRIIikNCgkJCQkJY2VsbCA9IG5leHRDZWxsKGNlbGwpOw0KDQoJCQkJZG8gew0KCQkJCQljZWxsID0gdXBkYXRlQ2VsbChjZWxsLCB0cnVlKTsNCgkJCQl9IHdoaWxlICgoY2VsbCA9IG5leHRDZWxsKGNlbGwpKSAhPSBudWxsKTsNCgkJCX0NCg0KCQkJYnJlYWs7DQoJfQ0KDQoJZWQuYWRkVmlzdWFsKCk7DQoJZWQubm9kZUNoYW5nZWQoKTsNCglpbnN0LmV4ZWNDb21tYW5kKCdtY2VFbmRVbmRvTGV2ZWwnKTsNCgl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCn0NCg0KZnVuY3Rpb24gbmV4dENlbGwoZWxtKSB7DQoJd2hpbGUgKChlbG0gPSBlbG0ubmV4dFNpYmxpbmcpICE9IG51bGwpIHsNCgkJaWYgKGVsbS5ub2RlTmFtZSA9PSAiVEQiIHx8IGVsbS5ub2RlTmFtZSA9PSAiVEgiKQ0KCQkJcmV0dXJuIGVsbTsNCgl9DQoNCglyZXR1cm4gbnVsbDsNCn0NCg0KZnVuY3Rpb24gdXBkYXRlQ2VsbCh0ZCwgc2tpcF9pZCkgew0KCXZhciBpbnN0ID0gZWQ7DQoJdmFyIGZvcm1PYmogPSBkb2N1bWVudC5mb3Jtc1swXTsNCgl2YXIgY3VyQ2VsbFR5cGUgPSB0ZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KCXZhciBjZWxsdHlwZSA9IGdldFNlbGVjdFZhbHVlKGZvcm1PYmosICdjZWxsdHlwZScpOw0KCXZhciBkb2MgPSBpbnN0LmdldERvYygpOw0KCXZhciBkb20gPSBlZC5kb207DQoNCglpZiAoIXNraXBfaWQpDQoJCXRkLnNldEF0dHJpYnV0ZSgnaWQnLCBmb3JtT2JqLmlkLnZhbHVlKTsNCg0KCXRkLnNldEF0dHJpYnV0ZSgnYWxpZ24nLCBmb3JtT2JqLmFsaWduLnZhbHVlKTsNCgl0ZC5zZXRBdHRyaWJ1dGUoJ3ZBbGlnbicsIGZvcm1PYmoudmFsaWduLnZhbHVlKTsNCgl0ZC5zZXRBdHRyaWJ1dGUoJ2xhbmcnLCBmb3JtT2JqLmxhbmcudmFsdWUpOw0KCXRkLnNldEF0dHJpYnV0ZSgnZGlyJywgZ2V0U2VsZWN0VmFsdWUoZm9ybU9iaiwgJ2RpcicpKTsNCgl0ZC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgZWQuZG9tLnNlcmlhbGl6ZVN0eWxlKGVkLmRvbS5wYXJzZVN0eWxlKGZvcm1PYmouc3R5bGUudmFsdWUpKSk7DQoJdGQuc2V0QXR0cmlidXRlKCdzY29wZScsIGZvcm1PYmouc2NvcGUudmFsdWUpOw0KCWVkLmRvbS5zZXRBdHRyaWIodGQsICdjbGFzcycsIGdldFNlbGVjdFZhbHVlKGZvcm1PYmosICdjbGFzcycpKTsNCg0KCS8vIENsZWFyIGRlcHJlY2F0ZWQgYXR0cmlidXRlcw0KCWVkLmRvbS5zZXRBdHRyaWIodGQsICd3aWR0aCcsICcnKTsNCgllZC5kb20uc2V0QXR0cmliKHRkLCAnaGVpZ2h0JywgJycpOw0KCWVkLmRvbS5zZXRBdHRyaWIodGQsICdiZ0NvbG9yJywgJycpOw0KCWVkLmRvbS5zZXRBdHRyaWIodGQsICdib3JkZXJDb2xvcicsICcnKTsNCgllZC5kb20uc2V0QXR0cmliKHRkLCAnYmFja2dyb3VuZCcsICcnKTsNCg0KCS8vIFNldCBzdHlsZXMNCgl0ZC5zdHlsZS53aWR0aCA9IGdldENTU1NpemUoZm9ybU9iai53aWR0aC52YWx1ZSk7DQoJdGQuc3R5bGUuaGVpZ2h0ID0gZ2V0Q1NTU2l6ZShmb3JtT2JqLmhlaWdodC52YWx1ZSk7DQoJaWYgKGZvcm1PYmouYm9yZGVyY29sb3IudmFsdWUgIT0gIiIpIHsNCgkJdGQuc3R5bGUuYm9yZGVyQ29sb3IgPSBmb3JtT2JqLmJvcmRlcmNvbG9yLnZhbHVlOw0KCQl0ZC5zdHlsZS5ib3JkZXJTdHlsZSA9IHRkLnN0eWxlLmJvcmRlclN0eWxlID09ICIiID8gInNvbGlkIiA6IHRkLnN0eWxlLmJvcmRlclN0eWxlOw0KCQl0ZC5zdHlsZS5ib3JkZXJXaWR0aCA9IHRkLnN0eWxlLmJvcmRlcldpZHRoID09ICIiID8gIjFweCIgOiB0ZC5zdHlsZS5ib3JkZXJXaWR0aDsNCgl9IGVsc2UNCgkJdGQuc3R5bGUuYm9yZGVyQ29sb3IgPSAnJzsNCg0KCXRkLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGZvcm1PYmouYmdjb2xvci52YWx1ZTsNCg0KCWlmIChmb3JtT2JqLmJhY2tncm91bmRpbWFnZS52YWx1ZSAhPSAiIikNCgkJdGQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgnIiArIGZvcm1PYmouYmFja2dyb3VuZGltYWdlLnZhbHVlICsgIicpIjsNCgllbHNlDQoJCXRkLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICcnOw0KDQoJaWYgKGN1ckNlbGxUeXBlICE9IGNlbGx0eXBlKSB7DQoJCS8vIGNoYW5naW5nIHRvIGEgZGlmZmVyZW50IG5vZGUgdHlwZQ0KCQl2YXIgbmV3Q2VsbCA9IGRvYy5jcmVhdGVFbGVtZW50KGNlbGx0eXBlKTsNCg0KCQlmb3IgKHZhciBjPTA7IGM8dGQuY2hpbGROb2Rlcy5sZW5ndGg7IGMrKykNCgkJCW5ld0NlbGwuYXBwZW5kQ2hpbGQodGQuY2hpbGROb2Rlc1tjXS5jbG9uZU5vZGUoMSkpOw0KDQoJCWZvciAodmFyIGE9MDsgYTx0ZC5hdHRyaWJ1dGVzLmxlbmd0aDsgYSsrKQ0KCQkJZWQuZG9tLnNldEF0dHJpYihuZXdDZWxsLCB0ZC5hdHRyaWJ1dGVzW2FdLm5hbWUsIGVkLmRvbS5nZXRBdHRyaWIodGQsIHRkLmF0dHJpYnV0ZXNbYV0ubmFtZSkpOw0KDQoJCXRkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0NlbGwsIHRkKTsNCgkJdGQgPSBuZXdDZWxsOw0KCX0NCg0KCWRvbS5zZXRBdHRyaWIodGQsICdzdHlsZScsIGRvbS5zZXJpYWxpemVTdHlsZShkb20ucGFyc2VTdHlsZSh0ZC5zdHlsZS5jc3NUZXh0KSkpOw0KDQoJcmV0dXJuIHRkOw0KfQ0KDQpmdW5jdGlvbiBjaGFuZ2VkQmFja2dyb3VuZEltYWdlKCkgew0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoJdmFyIHN0ID0gZWQuZG9tLnBhcnNlU3R5bGUoZm9ybU9iai5zdHlsZS52YWx1ZSk7DQoNCglzdFsnYmFja2dyb3VuZC1pbWFnZSddID0gInVybCgnIiArIGZvcm1PYmouYmFja2dyb3VuZGltYWdlLnZhbHVlICsgIicpIjsNCg0KCWZvcm1PYmouc3R5bGUudmFsdWUgPSBlZC5kb20uc2VyaWFsaXplU3R5bGUoc3QpOw0KfQ0KDQpmdW5jdGlvbiBjaGFuZ2VkU2l6ZSgpIHsNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KCXZhciBzdCA9IGVkLmRvbS5wYXJzZVN0eWxlKGZvcm1PYmouc3R5bGUudmFsdWUpOw0KDQoJdmFyIHdpZHRoID0gZm9ybU9iai53aWR0aC52YWx1ZTsNCglpZiAod2lkdGggIT0gIiIpDQoJCXN0Wyd3aWR0aCddID0gZ2V0Q1NTU2l6ZSh3aWR0aCk7DQoJZWxzZQ0KCQlzdFsnd2lkdGgnXSA9ICIiOw0KDQoJdmFyIGhlaWdodCA9IGZvcm1PYmouaGVpZ2h0LnZhbHVlOw0KCWlmIChoZWlnaHQgIT0gIiIpDQoJCXN0WydoZWlnaHQnXSA9IGdldENTU1NpemUoaGVpZ2h0KTsNCgllbHNlDQoJCXN0WydoZWlnaHQnXSA9ICIiOw0KDQoJZm9ybU9iai5zdHlsZS52YWx1ZSA9IGVkLmRvbS5zZXJpYWxpemVTdHlsZShzdCk7DQp9DQoNCmZ1bmN0aW9uIGNoYW5nZWRDb2xvcigpIHsNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KCXZhciBzdCA9IGVkLmRvbS5wYXJzZVN0eWxlKGZvcm1PYmouc3R5bGUudmFsdWUpOw0KDQoJc3RbJ2JhY2tncm91bmQtY29sb3InXSA9IGZvcm1PYmouYmdjb2xvci52YWx1ZTsNCglzdFsnYm9yZGVyLWNvbG9yJ10gPSBmb3JtT2JqLmJvcmRlcmNvbG9yLnZhbHVlOw0KDQoJZm9ybU9iai5zdHlsZS52YWx1ZSA9IGVkLmRvbS5zZXJpYWxpemVTdHlsZShzdCk7DQp9DQoNCmZ1bmN0aW9uIGNoYW5nZWRTdHlsZSgpIHsNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KCXZhciBzdCA9IGVkLmRvbS5wYXJzZVN0eWxlKGZvcm1PYmouc3R5bGUudmFsdWUpOw0KDQoJaWYgKHN0WydiYWNrZ3JvdW5kLWltYWdlJ10pDQoJCWZvcm1PYmouYmFja2dyb3VuZGltYWdlLnZhbHVlID0gc3RbJ2JhY2tncm91bmQtaW1hZ2UnXS5yZXBsYWNlKG5ldyBSZWdFeHAoInVybFxcKCc/KFteJ10qKSc/XFwpIiwgJ2dpJyksICIkMSIpOw0KCWVsc2UNCgkJZm9ybU9iai5iYWNrZ3JvdW5kaW1hZ2UudmFsdWUgPSAnJzsNCg0KCWlmIChzdFsnd2lkdGgnXSkNCgkJZm9ybU9iai53aWR0aC52YWx1ZSA9IHRyaW1TaXplKHN0Wyd3aWR0aCddKTsNCg0KCWlmIChzdFsnaGVpZ2h0J10pDQoJCWZvcm1PYmouaGVpZ2h0LnZhbHVlID0gdHJpbVNpemUoc3RbJ2hlaWdodCddKTsNCg0KCWlmIChzdFsnYmFja2dyb3VuZC1jb2xvciddKSB7DQoJCWZvcm1PYmouYmdjb2xvci52YWx1ZSA9IHN0WydiYWNrZ3JvdW5kLWNvbG9yJ107DQoJCXVwZGF0ZUNvbG9yKCdiZ2NvbG9yX3BpY2snLCdiZ2NvbG9yJyk7DQoJfQ0KDQoJaWYgKHN0Wydib3JkZXItY29sb3InXSkgew0KCQlmb3JtT2JqLmJvcmRlcmNvbG9yLnZhbHVlID0gc3RbJ2JvcmRlci1jb2xvciddOw0KCQl1cGRhdGVDb2xvcignYm9yZGVyY29sb3JfcGljaycsJ2JvcmRlcmNvbG9yJyk7DQoJfQ0KfQ0KDQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChpbml0KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/js/merge_cells.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgTWVyZ2VDZWxsc0RpYWxvZyA9IHsNCglpbml0IDogZnVuY3Rpb24oKSB7DQoJCXZhciBmID0gZG9jdW1lbnQuZm9ybXNbMF07DQoNCgkJZi5udW1jb2xzLnZhbHVlID0gdGlueU1DRVBvcHVwLmdldFdpbmRvd0FyZygnY29scycsIDEpOw0KCQlmLm51bXJvd3MudmFsdWUgPSB0aW55TUNFUG9wdXAuZ2V0V2luZG93QXJnKCdyb3dzJywgMSk7DQoJfSwNCg0KCW1lcmdlIDogZnVuY3Rpb24oKSB7DQoJCXZhciBmdW5jLCBmID0gZG9jdW1lbnQuZm9ybXNbMF07DQoNCgkJdGlueU1DRVBvcHVwLnJlc3RvcmVTZWxlY3Rpb24oKTsNCg0KCQlmdW5jID0gdGlueU1DRVBvcHVwLmdldFdpbmRvd0FyZygnb25hY3Rpb24nKTsNCg0KCQlmdW5jKHsNCgkJCWNvbHMgOiBmLm51bWNvbHMudmFsdWUsDQoJCQlyb3dzIDogZi5udW1yb3dzLnZhbHVlDQoJCX0pOw0KDQoJCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KCX0NCn07DQoNCnRpbnlNQ0VQb3B1cC5vbkluaXQuYWRkKE1lcmdlQ2VsbHNEaWFsb2cuaW5pdCwgTWVyZ2VDZWxsc0RpYWxvZyk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/js/row.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQpmdW5jdGlvbiBpbml0KCkgew0KCXRpbnlNQ0VQb3B1cC5yZXNpemVUb0lubmVyU2l6ZSgpOw0KDQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2tncm91bmRpbWFnZWJyb3dzZXJjb250YWluZXInKS5pbm5lckhUTUwgPSBnZXRCcm93c2VySFRNTCgnYmFja2dyb3VuZGltYWdlYnJvd3NlcicsJ2JhY2tncm91bmRpbWFnZScsJ2ltYWdlJywndGFibGUnKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmdjb2xvcl9waWNrY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0Q29sb3JQaWNrZXJIVE1MKCdiZ2NvbG9yX3BpY2snLCdiZ2NvbG9yJyk7DQoNCgl2YXIgaW5zdCA9IHRpbnlNQ0VQb3B1cC5lZGl0b3I7DQoJdmFyIGRvbSA9IGluc3QuZG9tOw0KCXZhciB0ckVsbSA9IGRvbS5nZXRQYXJlbnQoaW5zdC5zZWxlY3Rpb24uZ2V0U3RhcnQoKSwgInRyIik7DQoJdmFyIGZvcm1PYmogPSBkb2N1bWVudC5mb3Jtc1swXTsNCgl2YXIgc3QgPSBkb20ucGFyc2VTdHlsZShkb20uZ2V0QXR0cmliKHRyRWxtLCAic3R5bGUiKSk7DQoNCgkvLyBHZXQgdGFibGUgcm93IGRhdGENCgl2YXIgcm93dHlwZSA9IHRyRWxtLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsNCgl2YXIgYWxpZ24gPSBkb20uZ2V0QXR0cmliKHRyRWxtLCAnYWxpZ24nKTsNCgl2YXIgdmFsaWduID0gZG9tLmdldEF0dHJpYih0ckVsbSwgJ3ZhbGlnbicpOw0KCXZhciBoZWlnaHQgPSB0cmltU2l6ZShnZXRTdHlsZSh0ckVsbSwgJ2hlaWdodCcsICdoZWlnaHQnKSk7DQoJdmFyIGNsYXNzTmFtZSA9IGRvbS5nZXRBdHRyaWIodHJFbG0sICdjbGFzcycpOw0KCXZhciBiZ2NvbG9yID0gY29udmVydFJHQlRvSGV4KGdldFN0eWxlKHRyRWxtLCAnYmdjb2xvcicsICdiYWNrZ3JvdW5kQ29sb3InKSk7DQoJdmFyIGJhY2tncm91bmRpbWFnZSA9IGdldFN0eWxlKHRyRWxtLCAnYmFja2dyb3VuZCcsICdiYWNrZ3JvdW5kSW1hZ2UnKS5yZXBsYWNlKG5ldyBSZWdFeHAoInVybFxcKFsnXCJdPyhbXidcIl0qKVsnXCJdP1xcKSIsICdnaScpLCAiJDEiKTsNCgl2YXIgaWQgPSBkb20uZ2V0QXR0cmliKHRyRWxtLCAnaWQnKTsNCgl2YXIgbGFuZyA9IGRvbS5nZXRBdHRyaWIodHJFbG0sICdsYW5nJyk7DQoJdmFyIGRpciA9IGRvbS5nZXRBdHRyaWIodHJFbG0sICdkaXInKTsNCg0KCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ3Jvd3R5cGUnLCByb3d0eXBlKTsNCg0KCS8vIEFueSBjZWxscyBzZWxlY3RlZA0KCWlmIChkb20uc2VsZWN0KCd0ZC5tY2VTZWxlY3RlZCx0aC5tY2VTZWxlY3RlZCcsIHRyRWxtKS5sZW5ndGggPT0gMCkgew0KCQkvLyBTZXR1cCBmb3JtDQoJCWFkZENsYXNzZXNUb0xpc3QoJ2NsYXNzJywgJ3RhYmxlX3Jvd19zdHlsZXMnKTsNCgkJVGlueU1DRV9FZGl0YWJsZVNlbGVjdHMuaW5pdCgpOw0KDQoJCWZvcm1PYmouYmdjb2xvci52YWx1ZSA9IGJnY29sb3I7DQoJCWZvcm1PYmouYmFja2dyb3VuZGltYWdlLnZhbHVlID0gYmFja2dyb3VuZGltYWdlOw0KCQlmb3JtT2JqLmhlaWdodC52YWx1ZSA9IGhlaWdodDsNCgkJZm9ybU9iai5pZC52YWx1ZSA9IGlkOw0KCQlmb3JtT2JqLmxhbmcudmFsdWUgPSBsYW5nOw0KCQlmb3JtT2JqLnN0eWxlLnZhbHVlID0gZG9tLnNlcmlhbGl6ZVN0eWxlKHN0KTsNCgkJc2VsZWN0QnlWYWx1ZShmb3JtT2JqLCAnYWxpZ24nLCBhbGlnbik7DQoJCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ3ZhbGlnbicsIHZhbGlnbik7DQoJCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ2NsYXNzJywgY2xhc3NOYW1lLCB0cnVlLCB0cnVlKTsNCgkJc2VsZWN0QnlWYWx1ZShmb3JtT2JqLCAnZGlyJywgZGlyKTsNCg0KCQkvLyBSZXNpemUgc29tZSBlbGVtZW50cw0KCQlpZiAoaXNWaXNpYmxlKCdiYWNrZ3JvdW5kaW1hZ2Vicm93c2VyJykpDQoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja2dyb3VuZGltYWdlJykuc3R5bGUud2lkdGggPSAnMTgwcHgnOw0KDQoJCXVwZGF0ZUNvbG9yKCdiZ2NvbG9yX3BpY2snLCAnYmdjb2xvcicpOw0KCX0gZWxzZQ0KCQl0aW55TUNFUG9wdXAuZG9tLmhpZGUoJ2FjdGlvbicpOw0KfQ0KDQpmdW5jdGlvbiB1cGRhdGVBY3Rpb24oKSB7DQoJdmFyIGluc3QgPSB0aW55TUNFUG9wdXAuZWRpdG9yLCBkb20gPSBpbnN0LmRvbSwgdHJFbG0sIHRhYmxlRWxtLCBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoJdmFyIGFjdGlvbiA9IGdldFNlbGVjdFZhbHVlKGZvcm1PYmosICdhY3Rpb24nKTsNCg0KCXRpbnlNQ0VQb3B1cC5yZXN0b3JlU2VsZWN0aW9uKCk7DQoJdHJFbG0gPSBkb20uZ2V0UGFyZW50KGluc3Quc2VsZWN0aW9uLmdldFN0YXJ0KCksICJ0ciIpOw0KCXRhYmxlRWxtID0gZG9tLmdldFBhcmVudChpbnN0LnNlbGVjdGlvbi5nZXRTdGFydCgpLCAidGFibGUiKTsNCg0KCS8vIFVwZGF0ZSBhbGwgc2VsZWN0ZWQgcm93cw0KCWlmIChkb20uc2VsZWN0KCd0ZC5tY2VTZWxlY3RlZCx0aC5tY2VTZWxlY3RlZCcsIHRyRWxtKS5sZW5ndGggPiAwKSB7DQoJCXRpbnltY2UuZWFjaCh0YWJsZUVsbS5yb3dzLCBmdW5jdGlvbih0cikgew0KCQkJdmFyIGk7DQoNCgkJCWZvciAoaSA9IDA7IGkgPCB0ci5jZWxscy5sZW5ndGg7IGkrKykgew0KCQkJCWlmIChkb20uaGFzQ2xhc3ModHIuY2VsbHNbaV0sICdtY2VTZWxlY3RlZCcpKSB7DQoJCQkJCXVwZGF0ZVJvdyh0ciwgdHJ1ZSk7DQoJCQkJCXJldHVybjsNCgkJCQl9DQoJCQl9DQoJCX0pOw0KDQoJCWluc3QuYWRkVmlzdWFsKCk7DQoJCWluc3Qubm9kZUNoYW5nZWQoKTsNCgkJaW5zdC5leGVjQ29tbWFuZCgnbWNlRW5kVW5kb0xldmVsJyk7DQoJCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KCQlyZXR1cm47DQoJfQ0KDQoJaW5zdC5leGVjQ29tbWFuZCgnbWNlQmVnaW5VbmRvTGV2ZWwnKTsNCg0KCXN3aXRjaCAoYWN0aW9uKSB7DQoJCWNhc2UgInJvdyI6DQoJCQl1cGRhdGVSb3codHJFbG0pOw0KCQkJYnJlYWs7DQoNCgkJY2FzZSAiYWxsIjoNCgkJCXZhciByb3dzID0gdGFibGVFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRyIik7DQoNCgkJCWZvciAodmFyIGk9MDsgaTxyb3dzLmxlbmd0aDsgaSsrKQ0KCQkJCXVwZGF0ZVJvdyhyb3dzW2ldLCB0cnVlKTsNCg0KCQkJYnJlYWs7DQoNCgkJY2FzZSAib2RkIjoNCgkJY2FzZSAiZXZlbiI6DQoJCQl2YXIgcm93cyA9IHRhYmxlRWxtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ciIpOw0KDQoJCQlmb3IgKHZhciBpPTA7IGk8cm93cy5sZW5ndGg7IGkrKykgew0KCQkJCWlmICgoaSAlIDIgPT0gMCAmJiBhY3Rpb24gPT0gIm9kZCIpIHx8IChpICUgMiAhPSAwICYmIGFjdGlvbiA9PSAiZXZlbiIpKQ0KCQkJCQl1cGRhdGVSb3cocm93c1tpXSwgdHJ1ZSwgdHJ1ZSk7DQoJCQl9DQoNCgkJCWJyZWFrOw0KCX0NCg0KCWluc3QuYWRkVmlzdWFsKCk7DQoJaW5zdC5ub2RlQ2hhbmdlZCgpOw0KCWluc3QuZXhlY0NvbW1hbmQoJ21jZUVuZFVuZG9MZXZlbCcpOw0KCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KfQ0KDQpmdW5jdGlvbiB1cGRhdGVSb3codHJfZWxtLCBza2lwX2lkLCBza2lwX3BhcmVudCkgew0KCXZhciBpbnN0ID0gdGlueU1DRVBvcHVwLmVkaXRvcjsNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KCXZhciBkb20gPSBpbnN0LmRvbTsNCgl2YXIgY3VyUm93VHlwZSA9IHRyX2VsbS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7DQoJdmFyIHJvd3R5cGUgPSBnZXRTZWxlY3RWYWx1ZShmb3JtT2JqLCAncm93dHlwZScpOw0KCXZhciBkb2MgPSBpbnN0LmdldERvYygpOw0KDQoJLy8gVXBkYXRlIHJvdyBlbGVtZW50DQoJaWYgKCFza2lwX2lkKQ0KCQl0cl9lbG0uc2V0QXR0cmlidXRlKCdpZCcsIGZvcm1PYmouaWQudmFsdWUpOw0KDQoJdHJfZWxtLnNldEF0dHJpYnV0ZSgnYWxpZ24nLCBnZXRTZWxlY3RWYWx1ZShmb3JtT2JqLCAnYWxpZ24nKSk7DQoJdHJfZWxtLnNldEF0dHJpYnV0ZSgndkFsaWduJywgZ2V0U2VsZWN0VmFsdWUoZm9ybU9iaiwgJ3ZhbGlnbicpKTsNCgl0cl9lbG0uc2V0QXR0cmlidXRlKCdsYW5nJywgZm9ybU9iai5sYW5nLnZhbHVlKTsNCgl0cl9lbG0uc2V0QXR0cmlidXRlKCdkaXInLCBnZXRTZWxlY3RWYWx1ZShmb3JtT2JqLCAnZGlyJykpOw0KCXRyX2VsbS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgZG9tLnNlcmlhbGl6ZVN0eWxlKGRvbS5wYXJzZVN0eWxlKGZvcm1PYmouc3R5bGUudmFsdWUpKSk7DQoJZG9tLnNldEF0dHJpYih0cl9lbG0sICdjbGFzcycsIGdldFNlbGVjdFZhbHVlKGZvcm1PYmosICdjbGFzcycpKTsNCg0KCS8vIENsZWFyIGRlcHJlY2F0ZWQgYXR0cmlidXRlcw0KCXRyX2VsbS5zZXRBdHRyaWJ1dGUoJ2JhY2tncm91bmQnLCAnJyk7DQoJdHJfZWxtLnNldEF0dHJpYnV0ZSgnYmdDb2xvcicsICcnKTsNCgl0cl9lbG0uc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyk7DQoNCgkvLyBTZXQgc3R5bGVzDQoJdHJfZWxtLnN0eWxlLmhlaWdodCA9IGdldENTU1NpemUoZm9ybU9iai5oZWlnaHQudmFsdWUpOw0KCXRyX2VsbS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBmb3JtT2JqLmJnY29sb3IudmFsdWU7DQoNCglpZiAoZm9ybU9iai5iYWNrZ3JvdW5kaW1hZ2UudmFsdWUgIT0gIiIpDQoJCXRyX2VsbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKCciICsgZm9ybU9iai5iYWNrZ3JvdW5kaW1hZ2UudmFsdWUgKyAiJykiOw0KCWVsc2UNCgkJdHJfZWxtLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICcnOw0KDQoJLy8gU2V0dXAgbmV3IHJvd3R5cGUNCglpZiAoY3VyUm93VHlwZSAhPSByb3d0eXBlICYmICFza2lwX3BhcmVudCkgew0KCQkvLyBmaXJzdCwgY2xvbmUgdGhlIG5vZGUgd2UgYXJlIHdvcmtpbmcgb24NCgkJdmFyIG5ld1JvdyA9IHRyX2VsbS5jbG9uZU5vZGUoMSk7DQoNCgkJLy8gbmV4dCwgZmluZCB0aGUgcGFyZW50IG9mIGl0cyBuZXcgZGVzdGluYXRpb24gKGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeSkNCgkJdmFyIHRoZVRhYmxlID0gZG9tLmdldFBhcmVudCh0cl9lbG0sICJ0YWJsZSIpOw0KCQl2YXIgZGVzdCA9IHJvd3R5cGU7DQoJCXZhciBuZXdQYXJlbnQgPSBudWxsOw0KCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoZVRhYmxlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCgkJCWlmICh0aGVUYWJsZS5jaGlsZE5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gZGVzdCkNCgkJCQluZXdQYXJlbnQgPSB0aGVUYWJsZS5jaGlsZE5vZGVzW2ldOw0KCQl9DQoNCgkJaWYgKG5ld1BhcmVudCA9PSBudWxsKSB7DQoJCQluZXdQYXJlbnQgPSBkb2MuY3JlYXRlRWxlbWVudChkZXN0KTsNCg0KCQkJaWYgKGRlc3QgPT0gInRoZWFkIikgew0KCQkJCWlmICh0aGVUYWJsZS5maXJzdENoaWxkLm5vZGVOYW1lID09ICdDQVBUSU9OJykNCgkJCQkJaW5zdC5kb20uaW5zZXJ0QWZ0ZXIobmV3UGFyZW50LCB0aGVUYWJsZS5maXJzdENoaWxkKTsNCgkJCQllbHNlDQoJCQkJCXRoZVRhYmxlLmluc2VydEJlZm9yZShuZXdQYXJlbnQsIHRoZVRhYmxlLmZpcnN0Q2hpbGQpOw0KCQkJfSBlbHNlDQoJCQkJdGhlVGFibGUuYXBwZW5kQ2hpbGQobmV3UGFyZW50KTsNCgkJfQ0KDQoJCS8vIGFwcGVuZCB0aGUgcm93IHRvIHRoZSBuZXcgcGFyZW50DQoJCW5ld1BhcmVudC5hcHBlbmRDaGlsZChuZXdSb3cpOw0KDQoJCS8vIHJlbW92ZSB0aGUgb3JpZ2luYWwNCgkJdHJfZWxtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodHJfZWxtKTsNCg0KCQkvLyBzZXQgdHJfZWxtIHRvIHRoZSBuZXcgbm9kZQ0KCQl0cl9lbG0gPSBuZXdSb3c7DQoJfQ0KDQoJZG9tLnNldEF0dHJpYih0cl9lbG0sICdzdHlsZScsIGRvbS5zZXJpYWxpemVTdHlsZShkb20ucGFyc2VTdHlsZSh0cl9lbG0uc3R5bGUuY3NzVGV4dCkpKTsNCn0NCg0KZnVuY3Rpb24gY2hhbmdlZEJhY2tncm91bmRJbWFnZSgpIHsNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdLCBkb20gPSB0aW55TUNFUG9wdXAuZWRpdG9yLmRvbTsNCgl2YXIgc3QgPSBkb20ucGFyc2VTdHlsZShmb3JtT2JqLnN0eWxlLnZhbHVlKTsNCg0KCXN0WydiYWNrZ3JvdW5kLWltYWdlJ10gPSAidXJsKCciICsgZm9ybU9iai5iYWNrZ3JvdW5kaW1hZ2UudmFsdWUgKyAiJykiOw0KDQoJZm9ybU9iai5zdHlsZS52YWx1ZSA9IGRvbS5zZXJpYWxpemVTdHlsZShzdCk7DQp9DQoNCmZ1bmN0aW9uIGNoYW5nZWRTdHlsZSgpIHsNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdLCBkb20gPSB0aW55TUNFUG9wdXAuZWRpdG9yLmRvbTsNCgl2YXIgc3QgPSBkb20ucGFyc2VTdHlsZShmb3JtT2JqLnN0eWxlLnZhbHVlKTsNCg0KCWlmIChzdFsnYmFja2dyb3VuZC1pbWFnZSddKQ0KCQlmb3JtT2JqLmJhY2tncm91bmRpbWFnZS52YWx1ZSA9IHN0WydiYWNrZ3JvdW5kLWltYWdlJ10ucmVwbGFjZShuZXcgUmVnRXhwKCJ1cmxcXCgnPyhbXiddKiknP1xcKSIsICdnaScpLCAiJDEiKTsNCgllbHNlDQoJCWZvcm1PYmouYmFja2dyb3VuZGltYWdlLnZhbHVlID0gJyc7DQoNCglpZiAoc3RbJ2hlaWdodCddKQ0KCQlmb3JtT2JqLmhlaWdodC52YWx1ZSA9IHRyaW1TaXplKHN0WydoZWlnaHQnXSk7DQoNCglpZiAoc3RbJ2JhY2tncm91bmQtY29sb3InXSkgew0KCQlmb3JtT2JqLmJnY29sb3IudmFsdWUgPSBzdFsnYmFja2dyb3VuZC1jb2xvciddOw0KCQl1cGRhdGVDb2xvcignYmdjb2xvcl9waWNrJywnYmdjb2xvcicpOw0KCX0NCn0NCg0KZnVuY3Rpb24gY2hhbmdlZFNpemUoKSB7DQoJdmFyIGZvcm1PYmogPSBkb2N1bWVudC5mb3Jtc1swXSwgZG9tID0gdGlueU1DRVBvcHVwLmVkaXRvci5kb207DQoJdmFyIHN0ID0gZG9tLnBhcnNlU3R5bGUoZm9ybU9iai5zdHlsZS52YWx1ZSk7DQoNCgl2YXIgaGVpZ2h0ID0gZm9ybU9iai5oZWlnaHQudmFsdWU7DQoJaWYgKGhlaWdodCAhPSAiIikNCgkJc3RbJ2hlaWdodCddID0gZ2V0Q1NTU2l6ZShoZWlnaHQpOw0KCWVsc2UNCgkJc3RbJ2hlaWdodCddID0gIiI7DQoNCglmb3JtT2JqLnN0eWxlLnZhbHVlID0gZG9tLnNlcmlhbGl6ZVN0eWxlKHN0KTsNCn0NCg0KZnVuY3Rpb24gY2hhbmdlZENvbG9yKCkgew0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF0sIGRvbSA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9tOw0KCXZhciBzdCA9IGRvbS5wYXJzZVN0eWxlKGZvcm1PYmouc3R5bGUudmFsdWUpOw0KDQoJc3RbJ2JhY2tncm91bmQtY29sb3InXSA9IGZvcm1PYmouYmdjb2xvci52YWx1ZTsNCg0KCWZvcm1PYmouc3R5bGUudmFsdWUgPSBkb20uc2VyaWFsaXplU3R5bGUoc3QpOw0KfQ0KDQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChpbml0KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/js/table.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgYWN0aW9uLCBvcmdUYWJsZVdpZHRoLCBvcmdUYWJsZUhlaWdodCwgZG9tID0gdGlueU1DRVBvcHVwLmVkaXRvci5kb207DQoNCmZ1bmN0aW9uIGluc2VydFRhYmxlKCkgew0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoJdmFyIGluc3QgPSB0aW55TUNFUG9wdXAuZWRpdG9yLCBkb20gPSBpbnN0LmRvbTsNCgl2YXIgY29scyA9IDIsIHJvd3MgPSAyLCBib3JkZXIgPSAwLCBjZWxscGFkZGluZyA9IC0xLCBjZWxsc3BhY2luZyA9IC0xLCBhbGlnbiwgd2lkdGgsIGhlaWdodCwgY2xhc3NOYW1lLCBjYXB0aW9uLCBmcmFtZSwgcnVsZXM7DQoJdmFyIGh0bWwgPSAnJywgY2FwRWwsIGVsbTsNCgl2YXIgY2VsbExpbWl0LCByb3dMaW1pdCwgY29sTGltaXQ7DQoNCgl0aW55TUNFUG9wdXAucmVzdG9yZVNlbGVjdGlvbigpOw0KDQoJaWYgKCFBdXRvVmFsaWRhdG9yLnZhbGlkYXRlKGZvcm1PYmopKSB7DQoJCXRpbnlNQ0VQb3B1cC5hbGVydChpbnN0LmdldExhbmcoJ2ludmFsaWRfZGF0YScpKTsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCWVsbSA9IGRvbS5nZXRQYXJlbnQoaW5zdC5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAndGFibGUnKTsNCg0KCS8vIEdldCBmb3JtIGRhdGENCgljb2xzID0gZm9ybU9iai5lbGVtZW50c1snY29scyddLnZhbHVlOw0KCXJvd3MgPSBmb3JtT2JqLmVsZW1lbnRzWydyb3dzJ10udmFsdWU7DQoJYm9yZGVyID0gZm9ybU9iai5lbGVtZW50c1snYm9yZGVyJ10udmFsdWUgIT0gIiIgPyBmb3JtT2JqLmVsZW1lbnRzWydib3JkZXInXS52YWx1ZSAgOiAwOw0KCWNlbGxwYWRkaW5nID0gZm9ybU9iai5lbGVtZW50c1snY2VsbHBhZGRpbmcnXS52YWx1ZSAhPSAiIiA/IGZvcm1PYmouZWxlbWVudHNbJ2NlbGxwYWRkaW5nJ10udmFsdWUgOiAiIjsNCgljZWxsc3BhY2luZyA9IGZvcm1PYmouZWxlbWVudHNbJ2NlbGxzcGFjaW5nJ10udmFsdWUgIT0gIiIgPyBmb3JtT2JqLmVsZW1lbnRzWydjZWxsc3BhY2luZyddLnZhbHVlIDogIiI7DQoJYWxpZ24gPSBnZXRTZWxlY3RWYWx1ZShmb3JtT2JqLCAiYWxpZ24iKTsNCglmcmFtZSA9IGdldFNlbGVjdFZhbHVlKGZvcm1PYmosICJ0ZnJhbWUiKTsNCglydWxlcyA9IGdldFNlbGVjdFZhbHVlKGZvcm1PYmosICJydWxlcyIpOw0KCXdpZHRoID0gZm9ybU9iai5lbGVtZW50c1snd2lkdGgnXS52YWx1ZTsNCgloZWlnaHQgPSBmb3JtT2JqLmVsZW1lbnRzWydoZWlnaHQnXS52YWx1ZTsNCglib3JkZXJjb2xvciA9IGZvcm1PYmouZWxlbWVudHNbJ2JvcmRlcmNvbG9yJ10udmFsdWU7DQoJYmdjb2xvciA9IGZvcm1PYmouZWxlbWVudHNbJ2JnY29sb3InXS52YWx1ZTsNCgljbGFzc05hbWUgPSBnZXRTZWxlY3RWYWx1ZShmb3JtT2JqLCAiY2xhc3MiKTsNCglpZCA9IGZvcm1PYmouZWxlbWVudHNbJ2lkJ10udmFsdWU7DQoJc3VtbWFyeSA9IGZvcm1PYmouZWxlbWVudHNbJ3N1bW1hcnknXS52YWx1ZTsNCglzdHlsZSA9IGZvcm1PYmouZWxlbWVudHNbJ3N0eWxlJ10udmFsdWU7DQoJZGlyID0gZm9ybU9iai5lbGVtZW50c1snZGlyJ10udmFsdWU7DQoJbGFuZyA9IGZvcm1PYmouZWxlbWVudHNbJ2xhbmcnXS52YWx1ZTsNCgliYWNrZ3JvdW5kID0gZm9ybU9iai5lbGVtZW50c1snYmFja2dyb3VuZGltYWdlJ10udmFsdWU7DQoJY2FwdGlvbiA9IGZvcm1PYmouZWxlbWVudHNbJ2NhcHRpb24nXS5jaGVja2VkOw0KDQoJY2VsbExpbWl0ID0gdGlueU1DRVBvcHVwLmdldFBhcmFtKCd0YWJsZV9jZWxsX2xpbWl0JywgZmFsc2UpOw0KCXJvd0xpbWl0ID0gdGlueU1DRVBvcHVwLmdldFBhcmFtKCd0YWJsZV9yb3dfbGltaXQnLCBmYWxzZSk7DQoJY29sTGltaXQgPSB0aW55TUNFUG9wdXAuZ2V0UGFyYW0oJ3RhYmxlX2NvbF9saW1pdCcsIGZhbHNlKTsNCg0KCS8vIFZhbGlkYXRlIHRhYmxlIHNpemUNCglpZiAoY29sTGltaXQgJiYgY29scyA+IGNvbExpbWl0KSB7DQoJCXRpbnlNQ0VQb3B1cC5hbGVydChpbnN0LmdldExhbmcoJ3RhYmxlX2RsZy5jb2xfbGltaXQnKS5yZXBsYWNlKC9ce1wkY29sc1x9L2csIGNvbExpbWl0KSk7DQoJCXJldHVybiBmYWxzZTsNCgl9IGVsc2UgaWYgKHJvd0xpbWl0ICYmIHJvd3MgPiByb3dMaW1pdCkgew0KCQl0aW55TUNFUG9wdXAuYWxlcnQoaW5zdC5nZXRMYW5nKCd0YWJsZV9kbGcucm93X2xpbWl0JykucmVwbGFjZSgvXHtcJHJvd3NcfS9nLCByb3dMaW1pdCkpOw0KCQlyZXR1cm4gZmFsc2U7DQoJfSBlbHNlIGlmIChjZWxsTGltaXQgJiYgY29scyAqIHJvd3MgPiBjZWxsTGltaXQpIHsNCgkJdGlueU1DRVBvcHVwLmFsZXJ0KGluc3QuZ2V0TGFuZygndGFibGVfZGxnLmNlbGxfbGltaXQnKS5yZXBsYWNlKC9ce1wkY2VsbHNcfS9nLCBjZWxsTGltaXQpKTsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8vIFVwZGF0ZSB0YWJsZQ0KCWlmIChhY3Rpb24gPT0gInVwZGF0ZSIpIHsNCgkJaW5zdC5leGVjQ29tbWFuZCgnbWNlQmVnaW5VbmRvTGV2ZWwnKTsNCg0KCQlkb20uc2V0QXR0cmliKGVsbSwgJ2NlbGxQYWRkaW5nJywgY2VsbHBhZGRpbmcsIHRydWUpOw0KCQlkb20uc2V0QXR0cmliKGVsbSwgJ2NlbGxTcGFjaW5nJywgY2VsbHNwYWNpbmcsIHRydWUpOw0KCQlkb20uc2V0QXR0cmliKGVsbSwgJ2JvcmRlcicsIGJvcmRlcik7DQoJCWRvbS5zZXRBdHRyaWIoZWxtLCAnYWxpZ24nLCBhbGlnbik7DQoJCWRvbS5zZXRBdHRyaWIoZWxtLCAnZnJhbWUnLCBmcmFtZSk7DQoJCWRvbS5zZXRBdHRyaWIoZWxtLCAncnVsZXMnLCBydWxlcyk7DQoJCWRvbS5zZXRBdHRyaWIoZWxtLCAnY2xhc3MnLCBjbGFzc05hbWUpOw0KCQlkb20uc2V0QXR0cmliKGVsbSwgJ3N0eWxlJywgc3R5bGUpOw0KCQlkb20uc2V0QXR0cmliKGVsbSwgJ2lkJywgaWQpOw0KCQlkb20uc2V0QXR0cmliKGVsbSwgJ3N1bW1hcnknLCBzdW1tYXJ5KTsNCgkJZG9tLnNldEF0dHJpYihlbG0sICdkaXInLCBkaXIpOw0KCQlkb20uc2V0QXR0cmliKGVsbSwgJ2xhbmcnLCBsYW5nKTsNCg0KCQljYXBFbCA9IGluc3QuZG9tLnNlbGVjdCgnY2FwdGlvbicsIGVsbSlbMF07DQoNCgkJaWYgKGNhcEVsICYmICFjYXB0aW9uKQ0KCQkJY2FwRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjYXBFbCk7DQoNCgkJaWYgKCFjYXBFbCAmJiBjYXB0aW9uKSB7DQoJCQljYXBFbCA9IGVsbS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhcHRpb24nKTsNCg0KCQkJaWYgKCF0aW55bWNlLmlzSUUpDQoJCQkJY2FwRWwuaW5uZXJIVE1MID0gJzxiciBfbWNlX2JvZ3VzPSIxIi8+JzsNCg0KCQkJZWxtLmluc2VydEJlZm9yZShjYXBFbCwgZWxtLmZpcnN0Q2hpbGQpOw0KCQl9DQoNCgkJaWYgKHdpZHRoICYmIGluc3Quc2V0dGluZ3MuaW5saW5lX3N0eWxlcykgew0KCQkJZG9tLnNldFN0eWxlKGVsbSwgJ3dpZHRoJywgd2lkdGgpOw0KCQkJZG9tLnNldEF0dHJpYihlbG0sICd3aWR0aCcsICcnKTsNCgkJfSBlbHNlIHsNCgkJCWRvbS5zZXRBdHRyaWIoZWxtLCAnd2lkdGgnLCB3aWR0aCwgdHJ1ZSk7DQoJCQlkb20uc2V0U3R5bGUoZWxtLCAnd2lkdGgnLCAnJyk7DQoJCX0NCg0KCQkvLyBSZW1vdmUgdGhlc2Ugc2luY2UgdGhleSBhcmUgbm90IHZhbGlkIFhIVE1MDQoJCWRvbS5zZXRBdHRyaWIoZWxtLCAnYm9yZGVyQ29sb3InLCAnJyk7DQoJCWRvbS5zZXRBdHRyaWIoZWxtLCAnYmdDb2xvcicsICcnKTsNCgkJZG9tLnNldEF0dHJpYihlbG0sICdiYWNrZ3JvdW5kJywgJycpOw0KDQoJCWlmIChoZWlnaHQgJiYgaW5zdC5zZXR0aW5ncy5pbmxpbmVfc3R5bGVzKSB7DQoJCQlkb20uc2V0U3R5bGUoZWxtLCAnaGVpZ2h0JywgaGVpZ2h0KTsNCgkJCWRvbS5zZXRBdHRyaWIoZWxtLCAnaGVpZ2h0JywgJycpOw0KCQl9IGVsc2Ugew0KCQkJZG9tLnNldEF0dHJpYihlbG0sICdoZWlnaHQnLCBoZWlnaHQsIHRydWUpOw0KCQkJZG9tLnNldFN0eWxlKGVsbSwgJ2hlaWdodCcsICcnKTsNCiAJCX0NCg0KCQlpZiAoYmFja2dyb3VuZCAhPSAnJykNCgkJCWVsbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKCciICsgYmFja2dyb3VuZCArICInKSI7DQoJCWVsc2UNCgkJCWVsbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAnJzsNCg0KLyoJCWlmICh0aW55TUNFUG9wdXAuZ2V0UGFyYW0oImlubGluZV9zdHlsZXMiKSkgew0KCQkJaWYgKHdpZHRoICE9ICcnKQ0KCQkJCWVsbS5zdHlsZS53aWR0aCA9IGdldENTU1NpemUod2lkdGgpOw0KCQl9Ki8NCg0KCQlpZiAoYm9yZGVyY29sb3IgIT0gIiIpIHsNCgkJCWVsbS5zdHlsZS5ib3JkZXJDb2xvciA9IGJvcmRlcmNvbG9yOw0KCQkJZWxtLnN0eWxlLmJvcmRlclN0eWxlID0gZWxtLnN0eWxlLmJvcmRlclN0eWxlID09ICIiID8gInNvbGlkIiA6IGVsbS5zdHlsZS5ib3JkZXJTdHlsZTsNCgkJCWVsbS5zdHlsZS5ib3JkZXJXaWR0aCA9IGJvcmRlciA9PSAiIiA/ICIxcHgiIDogYm9yZGVyOw0KCQl9IGVsc2UNCgkJCWVsbS5zdHlsZS5ib3JkZXJDb2xvciA9ICcnOw0KDQoJCWVsbS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiZ2NvbG9yOw0KCQllbG0uc3R5bGUuaGVpZ2h0ID0gZ2V0Q1NTU2l6ZShoZWlnaHQpOw0KDQoJCWluc3QuYWRkVmlzdWFsKCk7DQoNCgkJLy8gRml4IGZvciBzdGFuZ2UgTVNJRSBhbGlnbiBidWcNCgkJLy9lbG0ub3V0ZXJIVE1MID0gZWxtLm91dGVySFRNTDsNCg0KCQlpbnN0Lm5vZGVDaGFuZ2VkKCk7DQoJCWluc3QuZXhlY0NvbW1hbmQoJ21jZUVuZFVuZG9MZXZlbCcpOw0KDQoJCS8vIFJlcGFpbnQgaWYgZGltZW5zaW9ucyBjaGFuZ2VkDQoJCWlmIChmb3JtT2JqLndpZHRoLnZhbHVlICE9IG9yZ1RhYmxlV2lkdGggfHwgZm9ybU9iai5oZWlnaHQudmFsdWUgIT0gb3JnVGFibGVIZWlnaHQpDQoJCQlpbnN0LmV4ZWNDb21tYW5kKCdtY2VSZXBhaW50Jyk7DQoNCgkJdGlueU1DRVBvcHVwLmNsb3NlKCk7DQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCS8vIENyZWF0ZSBuZXcgdGFibGUNCglodG1sICs9ICc8dGFibGUnOw0KDQoJaHRtbCArPSBtYWtlQXR0cmliKCdpZCcsIGlkKTsNCglodG1sICs9IG1ha2VBdHRyaWIoJ2JvcmRlcicsIGJvcmRlcik7DQoJaHRtbCArPSBtYWtlQXR0cmliKCdjZWxscGFkZGluZycsIGNlbGxwYWRkaW5nKTsNCglodG1sICs9IG1ha2VBdHRyaWIoJ2NlbGxzcGFjaW5nJywgY2VsbHNwYWNpbmcpOw0KCWh0bWwgKz0gbWFrZUF0dHJpYignX21jZV9uZXcnLCAnMScpOw0KDQoJaWYgKHdpZHRoICYmIGluc3Quc2V0dGluZ3MuaW5saW5lX3N0eWxlcykgew0KCQlpZiAoc3R5bGUpDQoJCQlzdHlsZSArPSAnOyAnOw0KDQoJCS8vIEZvcmNlIHB4DQoJCWlmICgvXlswLTlcLl0rJC8udGVzdCh3aWR0aCkpDQoJCQl3aWR0aCArPSAncHgnOw0KDQoJCXN0eWxlICs9ICd3aWR0aDogJyArIHdpZHRoOw0KCX0gZWxzZQ0KCQlodG1sICs9IG1ha2VBdHRyaWIoJ3dpZHRoJywgd2lkdGgpOw0KDQovKglpZiAoaGVpZ2h0KSB7DQoJCWlmIChzdHlsZSkNCgkJCXN0eWxlICs9ICc7ICc7DQoNCgkJc3R5bGUgKz0gJ2hlaWdodDogJyArIGhlaWdodDsNCgl9Ki8NCg0KCS8vaHRtbCArPSBtYWtlQXR0cmliKCdoZWlnaHQnLCBoZWlnaHQpOw0KCS8vaHRtbCArPSBtYWtlQXR0cmliKCdib3JkZXJjb2xvcicsIGJvcmRlcmNvbG9yKTsNCgkvL2h0bWwgKz0gbWFrZUF0dHJpYignYmdjb2xvcicsIGJnY29sb3IpOw0KCWh0bWwgKz0gbWFrZUF0dHJpYignYWxpZ24nLCBhbGlnbik7DQoJaHRtbCArPSBtYWtlQXR0cmliKCdmcmFtZScsIGZyYW1lKTsNCglodG1sICs9IG1ha2VBdHRyaWIoJ3J1bGVzJywgcnVsZXMpOw0KCWh0bWwgKz0gbWFrZUF0dHJpYignY2xhc3MnLCBjbGFzc05hbWUpOw0KCWh0bWwgKz0gbWFrZUF0dHJpYignc3R5bGUnLCBzdHlsZSk7DQoJaHRtbCArPSBtYWtlQXR0cmliKCdzdW1tYXJ5Jywgc3VtbWFyeSk7DQoJaHRtbCArPSBtYWtlQXR0cmliKCdkaXInLCBkaXIpOw0KCWh0bWwgKz0gbWFrZUF0dHJpYignbGFuZycsIGxhbmcpOw0KCWh0bWwgKz0gJz4nOw0KDQoJaWYgKGNhcHRpb24pIHsNCgkJaWYgKCF0aW55bWNlLmlzSUUpDQoJCQlodG1sICs9ICc8Y2FwdGlvbj48YnIgX21jZV9ib2d1cz0iMSIvPjwvY2FwdGlvbj4nOw0KCQllbHNlDQoJCQlodG1sICs9ICc8Y2FwdGlvbj48L2NhcHRpb24+JzsNCgl9DQoNCglmb3IgKHZhciB5PTA7IHk8cm93czsgeSsrKSB7DQoJCWh0bWwgKz0gIjx0cj4iOw0KDQoJCWZvciAodmFyIHg9MDsgeDxjb2xzOyB4KyspIHsNCgkJCWlmICghdGlueW1jZS5pc0lFKQ0KCQkJCWh0bWwgKz0gJzx0ZD48YnIgX21jZV9ib2d1cz0iMSIvPjwvdGQ+JzsNCgkJCWVsc2UNCgkJCQlodG1sICs9ICc8dGQ+PC90ZD4nOw0KCQl9DQoNCgkJaHRtbCArPSAiPC90cj4iOw0KCX0NCg0KCWh0bWwgKz0gIjwvdGFibGU+IjsNCg0KCWluc3QuZXhlY0NvbW1hbmQoJ21jZUJlZ2luVW5kb0xldmVsJyk7DQoNCgkvLyBNb3ZlIHRhYmxlDQoJaWYgKGluc3Quc2V0dGluZ3MuZml4X3RhYmxlX2VsZW1lbnRzKSB7DQoJCXZhciBwYXR0ID0gJyc7DQoNCgkJaW5zdC5mb2N1cygpOw0KCQlpbnN0LnNlbGVjdGlvbi5zZXRDb250ZW50KCc8YnIgY2xhc3M9Il9tY2VfbWFya2VyIiAvPicpOw0KDQoJCXRpbnltY2UuZWFjaCgnaDEsaDIsaDMsaDQsaDUsaDYscCcuc3BsaXQoJywnKSwgZnVuY3Rpb24obikgew0KCQkJaWYgKHBhdHQpDQoJCQkJcGF0dCArPSAnLCc7DQoNCgkJCXBhdHQgKz0gbiArICcgLl9tY2VfbWFya2VyJzsNCgkJfSk7DQoNCgkJdGlueW1jZS5lYWNoKGluc3QuZG9tLnNlbGVjdChwYXR0KSwgZnVuY3Rpb24obikgew0KCQkJaW5zdC5kb20uc3BsaXQoaW5zdC5kb20uZ2V0UGFyZW50KG4sICdoMSxoMixoMyxoNCxoNSxoNixwJyksIG4pOw0KCQl9KTsNCg0KCQlkb20uc2V0T3V0ZXJIVE1MKGRvbS5zZWxlY3QoJ2JyLl9tY2VfbWFya2VyJylbMF0sIGh0bWwpOw0KCX0gZWxzZQ0KCQlpbnN0LmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDb250ZW50JywgZmFsc2UsIGh0bWwpOw0KDQoJdGlueW1jZS5lYWNoKGRvbS5zZWxlY3QoJ3RhYmxlW19tY2VfbmV3XScpLCBmdW5jdGlvbihub2RlKSB7DQoJCXZhciB0ZCA9IGRvbS5zZWxlY3QoJ3RkJywgbm9kZSk7DQoNCgkJdHJ5IHsNCgkJCS8vIElFOSBtaWdodCBmYWlsIHRvIGRvIHRoaXMgc2VsZWN0aW9uDQoJCQlpbnN0LnNlbGVjdGlvbi5zZWxlY3QodGRbMF0sIHRydWUpOw0KCQkJaW5zdC5zZWxlY3Rpb24uY29sbGFwc2UoKTsNCgkJfSBjYXRjaCAoZXgpIHsNCgkJCS8vIElnbm9yZQ0KCQl9DQoNCgkJZG9tLnNldEF0dHJpYihub2RlLCAnX21jZV9uZXcnLCAnJyk7DQoJfSk7DQoNCglpbnN0LmFkZFZpc3VhbCgpOw0KCWluc3QuZXhlY0NvbW1hbmQoJ21jZUVuZFVuZG9MZXZlbCcpOw0KDQoJdGlueU1DRVBvcHVwLmNsb3NlKCk7DQp9DQoNCmZ1bmN0aW9uIG1ha2VBdHRyaWIoYXR0cmliLCB2YWx1ZSkgew0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoJdmFyIHZhbHVlRWxtID0gZm9ybU9iai5lbGVtZW50c1thdHRyaWJdOw0KDQoJaWYgKHR5cGVvZih2YWx1ZSkgPT0gInVuZGVmaW5lZCIgfHwgdmFsdWUgPT0gbnVsbCkgew0KCQl2YWx1ZSA9ICIiOw0KDQoJCWlmICh2YWx1ZUVsbSkNCgkJCXZhbHVlID0gdmFsdWVFbG0udmFsdWU7DQoJfQ0KDQoJaWYgKHZhbHVlID09ICIiKQ0KCQlyZXR1cm4gIiI7DQoNCgkvLyBYTUwgZW5jb2RlIGl0DQoJdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC8mL2csICcmYW1wOycpOw0KCXZhbHVlID0gdmFsdWUucmVwbGFjZSgvXCIvZywgJyZxdW90OycpOw0KCXZhbHVlID0gdmFsdWUucmVwbGFjZSgvPC9nLCAnJmx0OycpOw0KCXZhbHVlID0gdmFsdWUucmVwbGFjZSgvPi9nLCAnJmd0OycpOw0KDQoJcmV0dXJuICcgJyArIGF0dHJpYiArICc9IicgKyB2YWx1ZSArICciJzsNCn0NCg0KZnVuY3Rpb24gaW5pdCgpIHsNCgl0aW55TUNFUG9wdXAucmVzaXplVG9Jbm5lclNpemUoKTsNCg0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrZ3JvdW5kaW1hZ2Vicm93c2VyY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0QnJvd3NlckhUTUwoJ2JhY2tncm91bmRpbWFnZWJyb3dzZXInLCdiYWNrZ3JvdW5kaW1hZ2UnLCdpbWFnZScsJ3RhYmxlJyk7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2tncm91bmRpbWFnZWJyb3dzZXJjb250YWluZXInKS5pbm5lckhUTUwgPSBnZXRCcm93c2VySFRNTCgnYmFja2dyb3VuZGltYWdlYnJvd3NlcicsJ2JhY2tncm91bmRpbWFnZScsJ2ltYWdlJywndGFibGUnKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm9yZGVyY29sb3JfcGlja2NvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldENvbG9yUGlja2VySFRNTCgnYm9yZGVyY29sb3JfcGljaycsJ2JvcmRlcmNvbG9yJyk7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JnY29sb3JfcGlja2NvbnRhaW5lcicpLmlubmVySFRNTCA9IGdldENvbG9yUGlja2VySFRNTCgnYmdjb2xvcl9waWNrJywnYmdjb2xvcicpOw0KDQoJdmFyIGNvbHMgPSAyLCByb3dzID0gMiwgYm9yZGVyID0gdGlueU1DRVBvcHVwLmdldFBhcmFtKCd0YWJsZV9kZWZhdWx0X2JvcmRlcicsICcwJyksIGNlbGxwYWRkaW5nID0gdGlueU1DRVBvcHVwLmdldFBhcmFtKCd0YWJsZV9kZWZhdWx0X2NlbGxwYWRkaW5nJywgJycpLCBjZWxsc3BhY2luZyA9IHRpbnlNQ0VQb3B1cC5nZXRQYXJhbSgndGFibGVfZGVmYXVsdF9jZWxsc3BhY2luZycsICcnKTsNCgl2YXIgYWxpZ24gPSAiIiwgd2lkdGggPSAiIiwgaGVpZ2h0ID0gIiIsIGJvcmRlcmNvbG9yID0gIiIsIGJnY29sb3IgPSAiIiwgY2xhc3NOYW1lID0gIiI7DQoJdmFyIGlkID0gIiIsIHN1bW1hcnkgPSAiIiwgc3R5bGUgPSAiIiwgZGlyID0gIiIsIGxhbmcgPSAiIiwgYmFja2dyb3VuZCA9ICIiLCBiZ2NvbG9yID0gIiIsIGJvcmRlcmNvbG9yID0gIiIsIHJ1bGVzID0gIiIsIGZyYW1lID0gIiI7DQoJdmFyIGluc3QgPSB0aW55TUNFUG9wdXAuZWRpdG9yLCBkb20gPSBpbnN0LmRvbTsNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KCXZhciBlbG0gPSBkb20uZ2V0UGFyZW50KGluc3Quc2VsZWN0aW9uLmdldE5vZGUoKSwgInRhYmxlIik7DQoNCglhY3Rpb24gPSB0aW55TUNFUG9wdXAuZ2V0V2luZG93QXJnKCdhY3Rpb24nKTsNCg0KCWlmICghYWN0aW9uKQ0KCQlhY3Rpb24gPSBlbG0gPyAidXBkYXRlIiA6ICJpbnNlcnQiOw0KDQoJaWYgKGVsbSAmJiBhY3Rpb24gIT0gImluc2VydCIpIHsNCgkJdmFyIHJvd3NBciA9IGVsbS5yb3dzOw0KCQl2YXIgY29scyA9IDA7DQoJCWZvciAodmFyIGk9MDsgaTxyb3dzQXIubGVuZ3RoOyBpKyspDQoJCQlpZiAocm93c0FyW2ldLmNlbGxzLmxlbmd0aCA+IGNvbHMpDQoJCQkJY29scyA9IHJvd3NBcltpXS5jZWxscy5sZW5ndGg7DQoNCgkJY29scyA9IGNvbHM7DQoJCXJvd3MgPSByb3dzQXIubGVuZ3RoOw0KDQoJCXN0ID0gZG9tLnBhcnNlU3R5bGUoZG9tLmdldEF0dHJpYihlbG0sICJzdHlsZSIpKTsNCgkJYm9yZGVyID0gdHJpbVNpemUoZ2V0U3R5bGUoZWxtLCAnYm9yZGVyJywgJ2JvcmRlcldpZHRoJykpOw0KCQljZWxscGFkZGluZyA9IGRvbS5nZXRBdHRyaWIoZWxtLCAnY2VsbHBhZGRpbmcnLCAiIik7DQoJCWNlbGxzcGFjaW5nID0gZG9tLmdldEF0dHJpYihlbG0sICdjZWxsc3BhY2luZycsICIiKTsNCgkJd2lkdGggPSB0cmltU2l6ZShnZXRTdHlsZShlbG0sICd3aWR0aCcsICd3aWR0aCcpKTsNCgkJaGVpZ2h0ID0gdHJpbVNpemUoZ2V0U3R5bGUoZWxtLCAnaGVpZ2h0JywgJ2hlaWdodCcpKTsNCgkJYm9yZGVyY29sb3IgPSBjb252ZXJ0UkdCVG9IZXgoZ2V0U3R5bGUoZWxtLCAnYm9yZGVyY29sb3InLCAnYm9yZGVyTGVmdENvbG9yJykpOw0KCQliZ2NvbG9yID0gY29udmVydFJHQlRvSGV4KGdldFN0eWxlKGVsbSwgJ2JnY29sb3InLCAnYmFja2dyb3VuZENvbG9yJykpOw0KCQlhbGlnbiA9IGRvbS5nZXRBdHRyaWIoZWxtLCAnYWxpZ24nLCBhbGlnbik7DQoJCWZyYW1lID0gZG9tLmdldEF0dHJpYihlbG0sICdmcmFtZScpOw0KCQlydWxlcyA9IGRvbS5nZXRBdHRyaWIoZWxtLCAncnVsZXMnKTsNCgkJY2xhc3NOYW1lID0gdGlueW1jZS50cmltKGRvbS5nZXRBdHRyaWIoZWxtLCAnY2xhc3MnKS5yZXBsYWNlKC9tY2VJdGVtLisvZywgJycpKTsNCgkJaWQgPSBkb20uZ2V0QXR0cmliKGVsbSwgJ2lkJyk7DQoJCXN1bW1hcnkgPSBkb20uZ2V0QXR0cmliKGVsbSwgJ3N1bW1hcnknKTsNCgkJc3R5bGUgPSBkb20uc2VyaWFsaXplU3R5bGUoc3QpOw0KCQlkaXIgPSBkb20uZ2V0QXR0cmliKGVsbSwgJ2RpcicpOw0KCQlsYW5nID0gZG9tLmdldEF0dHJpYihlbG0sICdsYW5nJyk7DQoJCWJhY2tncm91bmQgPSBnZXRTdHlsZShlbG0sICdiYWNrZ3JvdW5kJywgJ2JhY2tncm91bmRJbWFnZScpLnJlcGxhY2UobmV3IFJlZ0V4cCgidXJsXFwoWydcIl0/KFteJ1wiXSopWydcIl0/XFwpIiwgJ2dpJyksICIkMSIpOw0KCQlmb3JtT2JqLmNhcHRpb24uY2hlY2tlZCA9IGVsbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY2FwdGlvbicpLmxlbmd0aCA+IDA7DQoNCgkJb3JnVGFibGVXaWR0aCA9IHdpZHRoOw0KCQlvcmdUYWJsZUhlaWdodCA9IGhlaWdodDsNCg0KCQlhY3Rpb24gPSAidXBkYXRlIjsNCgkJZm9ybU9iai5pbnNlcnQudmFsdWUgPSBpbnN0LmdldExhbmcoJ3VwZGF0ZScpOw0KCX0NCg0KCWFkZENsYXNzZXNUb0xpc3QoJ2NsYXNzJywgInRhYmxlX3N0eWxlcyIpOw0KCVRpbnlNQ0VfRWRpdGFibGVTZWxlY3RzLmluaXQoKTsNCg0KCS8vIFVwZGF0ZSBmb3JtDQoJc2VsZWN0QnlWYWx1ZShmb3JtT2JqLCAnYWxpZ24nLCBhbGlnbik7DQoJc2VsZWN0QnlWYWx1ZShmb3JtT2JqLCAndGZyYW1lJywgZnJhbWUpOw0KCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ3J1bGVzJywgcnVsZXMpOw0KCXNlbGVjdEJ5VmFsdWUoZm9ybU9iaiwgJ2NsYXNzJywgY2xhc3NOYW1lLCB0cnVlLCB0cnVlKTsNCglmb3JtT2JqLmNvbHMudmFsdWUgPSBjb2xzOw0KCWZvcm1PYmoucm93cy52YWx1ZSA9IHJvd3M7DQoJZm9ybU9iai5ib3JkZXIudmFsdWUgPSBib3JkZXI7DQoJZm9ybU9iai5jZWxscGFkZGluZy52YWx1ZSA9IGNlbGxwYWRkaW5nOw0KCWZvcm1PYmouY2VsbHNwYWNpbmcudmFsdWUgPSBjZWxsc3BhY2luZzsNCglmb3JtT2JqLndpZHRoLnZhbHVlID0gd2lkdGg7DQoJZm9ybU9iai5oZWlnaHQudmFsdWUgPSBoZWlnaHQ7DQoJZm9ybU9iai5ib3JkZXJjb2xvci52YWx1ZSA9IGJvcmRlcmNvbG9yOw0KCWZvcm1PYmouYmdjb2xvci52YWx1ZSA9IGJnY29sb3I7DQoJZm9ybU9iai5pZC52YWx1ZSA9IGlkOw0KCWZvcm1PYmouc3VtbWFyeS52YWx1ZSA9IHN1bW1hcnk7DQoJZm9ybU9iai5zdHlsZS52YWx1ZSA9IHN0eWxlOw0KCWZvcm1PYmouZGlyLnZhbHVlID0gZGlyOw0KCWZvcm1PYmoubGFuZy52YWx1ZSA9IGxhbmc7DQoJZm9ybU9iai5iYWNrZ3JvdW5kaW1hZ2UudmFsdWUgPSBiYWNrZ3JvdW5kOw0KDQoJdXBkYXRlQ29sb3IoJ2JvcmRlcmNvbG9yX3BpY2snLCAnYm9yZGVyY29sb3InKTsNCgl1cGRhdGVDb2xvcignYmdjb2xvcl9waWNrJywgJ2JnY29sb3InKTsNCg0KCS8vIFJlc2l6ZSBzb21lIGVsZW1lbnRzDQoJaWYgKGlzVmlzaWJsZSgnYmFja2dyb3VuZGltYWdlYnJvd3NlcicpKQ0KCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja2dyb3VuZGltYWdlJykuc3R5bGUud2lkdGggPSAnMTgwcHgnOw0KDQoJLy8gRGlzYWJsZSBzb21lIGZpZWxkcyBpbiB1cGRhdGUgbW9kZQ0KCWlmIChhY3Rpb24gPT0gInVwZGF0ZSIpIHsNCgkJZm9ybU9iai5jb2xzLmRpc2FibGVkID0gdHJ1ZTsNCgkJZm9ybU9iai5yb3dzLmRpc2FibGVkID0gdHJ1ZTsNCgl9DQp9DQoNCmZ1bmN0aW9uIGNoYW5nZWRTaXplKCkgew0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoJdmFyIHN0ID0gZG9tLnBhcnNlU3R5bGUoZm9ybU9iai5zdHlsZS52YWx1ZSk7DQoNCi8qCXZhciB3aWR0aCA9IGZvcm1PYmoud2lkdGgudmFsdWU7DQoJaWYgKHdpZHRoICE9ICIiKQ0KCQlzdFsnd2lkdGgnXSA9IHRpbnlNQ0VQb3B1cC5nZXRQYXJhbSgiaW5saW5lX3N0eWxlcyIpID8gZ2V0Q1NTU2l6ZSh3aWR0aCkgOiAiIjsNCgllbHNlDQoJCXN0Wyd3aWR0aCddID0gIiI7Ki8NCg0KCXZhciBoZWlnaHQgPSBmb3JtT2JqLmhlaWdodC52YWx1ZTsNCglpZiAoaGVpZ2h0ICE9ICIiKQ0KCQlzdFsnaGVpZ2h0J10gPSBnZXRDU1NTaXplKGhlaWdodCk7DQoJZWxzZQ0KCQlzdFsnaGVpZ2h0J10gPSAiIjsNCg0KCWZvcm1PYmouc3R5bGUudmFsdWUgPSBkb20uc2VyaWFsaXplU3R5bGUoc3QpOw0KfQ0KDQpmdW5jdGlvbiBjaGFuZ2VkQmFja2dyb3VuZEltYWdlKCkgew0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoJdmFyIHN0ID0gZG9tLnBhcnNlU3R5bGUoZm9ybU9iai5zdHlsZS52YWx1ZSk7DQoNCglzdFsnYmFja2dyb3VuZC1pbWFnZSddID0gInVybCgnIiArIGZvcm1PYmouYmFja2dyb3VuZGltYWdlLnZhbHVlICsgIicpIjsNCg0KCWZvcm1PYmouc3R5bGUudmFsdWUgPSBkb20uc2VyaWFsaXplU3R5bGUoc3QpOw0KfQ0KDQpmdW5jdGlvbiBjaGFuZ2VkQm9yZGVyKCkgew0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoJdmFyIHN0ID0gZG9tLnBhcnNlU3R5bGUoZm9ybU9iai5zdHlsZS52YWx1ZSk7DQoNCgkvLyBVcGRhdGUgYm9yZGVyIHdpZHRoIGlmIHRoZSBlbGVtZW50IGhhcyBhIGNvbG9yDQoJaWYgKGZvcm1PYmouYm9yZGVyLnZhbHVlICE9ICIiICYmIGZvcm1PYmouYm9yZGVyY29sb3IudmFsdWUgIT0gIiIpDQoJCXN0Wydib3JkZXItd2lkdGgnXSA9IGZvcm1PYmouYm9yZGVyLnZhbHVlICsgInB4IjsNCg0KCWZvcm1PYmouc3R5bGUudmFsdWUgPSBkb20uc2VyaWFsaXplU3R5bGUoc3QpOw0KfQ0KDQpmdW5jdGlvbiBjaGFuZ2VkQ29sb3IoKSB7DQoJdmFyIGZvcm1PYmogPSBkb2N1bWVudC5mb3Jtc1swXTsNCgl2YXIgc3QgPSBkb20ucGFyc2VTdHlsZShmb3JtT2JqLnN0eWxlLnZhbHVlKTsNCg0KCXN0WydiYWNrZ3JvdW5kLWNvbG9yJ10gPSBmb3JtT2JqLmJnY29sb3IudmFsdWU7DQoNCglpZiAoZm9ybU9iai5ib3JkZXJjb2xvci52YWx1ZSAhPSAiIikgew0KCQlzdFsnYm9yZGVyLWNvbG9yJ10gPSBmb3JtT2JqLmJvcmRlcmNvbG9yLnZhbHVlOw0KDQoJCS8vIEFkZCBib3JkZXItd2lkdGggaWYgaXQncyBtaXNzaW5nDQoJCWlmICghc3RbJ2JvcmRlci13aWR0aCddKQ0KCQkJc3RbJ2JvcmRlci13aWR0aCddID0gZm9ybU9iai5ib3JkZXIudmFsdWUgPT0gIiIgPyAiMXB4IiA6IGZvcm1PYmouYm9yZGVyLnZhbHVlICsgInB4IjsNCgl9DQoNCglmb3JtT2JqLnN0eWxlLnZhbHVlID0gZG9tLnNlcmlhbGl6ZVN0eWxlKHN0KTsNCn0NCg0KZnVuY3Rpb24gY2hhbmdlZFN0eWxlKCkgew0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoJdmFyIHN0ID0gZG9tLnBhcnNlU3R5bGUoZm9ybU9iai5zdHlsZS52YWx1ZSk7DQoNCglpZiAoc3RbJ2JhY2tncm91bmQtaW1hZ2UnXSkNCgkJZm9ybU9iai5iYWNrZ3JvdW5kaW1hZ2UudmFsdWUgPSBzdFsnYmFja2dyb3VuZC1pbWFnZSddLnJlcGxhY2UobmV3IFJlZ0V4cCgidXJsXFwoWydcIl0/KFteJ1wiXSopWydcIl0/XFwpIiwgJ2dpJyksICIkMSIpOw0KCWVsc2UNCgkJZm9ybU9iai5iYWNrZ3JvdW5kaW1hZ2UudmFsdWUgPSAnJzsNCg0KCWlmIChzdFsnd2lkdGgnXSkNCgkJZm9ybU9iai53aWR0aC52YWx1ZSA9IHRyaW1TaXplKHN0Wyd3aWR0aCddKTsNCg0KCWlmIChzdFsnaGVpZ2h0J10pDQoJCWZvcm1PYmouaGVpZ2h0LnZhbHVlID0gdHJpbVNpemUoc3RbJ2hlaWdodCddKTsNCg0KCWlmIChzdFsnYmFja2dyb3VuZC1jb2xvciddKSB7DQoJCWZvcm1PYmouYmdjb2xvci52YWx1ZSA9IHN0WydiYWNrZ3JvdW5kLWNvbG9yJ107DQoJCXVwZGF0ZUNvbG9yKCdiZ2NvbG9yX3BpY2snLCdiZ2NvbG9yJyk7DQoJfQ0KDQoJaWYgKHN0Wydib3JkZXItY29sb3InXSkgew0KCQlmb3JtT2JqLmJvcmRlcmNvbG9yLnZhbHVlID0gc3RbJ2JvcmRlci1jb2xvciddOw0KCQl1cGRhdGVDb2xvcignYm9yZGVyY29sb3JfcGljaycsJ2JvcmRlcmNvbG9yJyk7DQoJfQ0KfQ0KDQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChpbml0KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi50YWJsZV9kbGcnLHsNCmdlbmVyYWxfdGFiOiJHZW5lcmFsIiwNCmFkdmFuY2VkX3RhYjoiQWR2YW5jZWQiLA0KZ2VuZXJhbF9wcm9wczoiR2VuZXJhbCBwcm9wZXJ0aWVzIiwNCmFkdmFuY2VkX3Byb3BzOiJBZHZhbmNlZCBwcm9wZXJ0aWVzIiwNCnJvd3R5cGU6IlJvdyBpbiB0YWJsZSBwYXJ0IiwNCnRpdGxlOiJJbnNlcnQvTW9kaWZ5IHRhYmxlIiwNCndpZHRoOiJXaWR0aCIsDQpoZWlnaHQ6IkhlaWdodCIsDQpjb2xzOiJDb2xzIiwNCnJvd3M6IlJvd3MiLA0KY2VsbHNwYWNpbmc6IkNlbGxzcGFjaW5nIiwNCmNlbGxwYWRkaW5nOiJDZWxscGFkZGluZyIsDQpib3JkZXI6IkJvcmRlciIsDQphbGlnbjoiQWxpZ25tZW50IiwNCmFsaWduX2RlZmF1bHQ6IkRlZmF1bHQiLA0KYWxpZ25fbGVmdDoiTGVmdCIsDQphbGlnbl9yaWdodDoiUmlnaHQiLA0KYWxpZ25fbWlkZGxlOiJDZW50ZXIiLA0Kcm93X3RpdGxlOiJUYWJsZSByb3cgcHJvcGVydGllcyIsDQpjZWxsX3RpdGxlOiJUYWJsZSBjZWxsIHByb3BlcnRpZXMiLA0KY2VsbF90eXBlOiJDZWxsIHR5cGUiLA0KdmFsaWduOiJWZXJ0aWNhbCBhbGlnbm1lbnQiLA0KYWxpZ25fdG9wOiJUb3AiLA0KYWxpZ25fYm90dG9tOiJCb3R0b20iLA0KYm9yZGVyY29sb3I6IkJvcmRlciBjb2xvciIsDQpiZ2NvbG9yOiJCYWNrZ3JvdW5kIGNvbG9yIiwNCm1lcmdlX2NlbGxzX3RpdGxlOiJNZXJnZSB0YWJsZSBjZWxscyIsDQppZDoiSWQiLA0Kc3R5bGU6IlN0eWxlIiwNCmxhbmdkaXI6Ikxhbmd1YWdlIGRpcmVjdGlvbiIsDQpsYW5nY29kZToiTGFuZ3VhZ2UgY29kZSIsDQptaW1lOiJUYXJnZXQgTUlNRSB0eXBlIiwNCmx0cjoiTGVmdCB0byByaWdodCIsDQpydGw6IlJpZ2h0IHRvIGxlZnQiLA0KYmdpbWFnZToiQmFja2dyb3VuZCBpbWFnZSIsDQpzdW1tYXJ5OiJTdW1tYXJ5IiwNCnRkOiJEYXRhIiwNCnRoOiJIZWFkZXIiLA0KY2VsbF9jZWxsOiJVcGRhdGUgY3VycmVudCBjZWxsIiwNCmNlbGxfcm93OiJVcGRhdGUgYWxsIGNlbGxzIGluIHJvdyIsDQpjZWxsX2FsbDoiVXBkYXRlIGFsbCBjZWxscyBpbiB0YWJsZSIsDQpyb3dfcm93OiJVcGRhdGUgY3VycmVudCByb3ciLA0Kcm93X29kZDoiVXBkYXRlIG9kZCByb3dzIGluIHRhYmxlIiwNCnJvd19ldmVuOiJVcGRhdGUgZXZlbiByb3dzIGluIHRhYmxlIiwNCnJvd19hbGw6IlVwZGF0ZSBhbGwgcm93cyBpbiB0YWJsZSIsDQp0aGVhZDoiVGFibGUgSGVhZCIsDQp0Ym9keToiVGFibGUgQm9keSIsDQp0Zm9vdDoiVGFibGUgRm9vdCIsDQpzY29wZToiU2NvcGUiLA0Kcm93Z3JvdXA6IlJvdyBHcm91cCIsDQpjb2xncm91cDoiQ29sIEdyb3VwIiwNCmNvbF9saW1pdDoiWW91J3ZlIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2x1bW5zIG9mIHskY29sc30uIiwNCnJvd19saW1pdDoiWW91J3ZlIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIG9mIHskcm93c30uIiwNCmNlbGxfbGltaXQ6IllvdSd2ZSBleGNlZWRlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2VsbHMgb2YgeyRjZWxsc30uIiwNCm1pc3Npbmdfc2NvcGU6IkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZSB3aXRob3V0IHNwZWNpZnlpbmcgYSBzY29wZSBmb3IgdGhpcyB0YWJsZSBoZWFkZXIgY2VsbC4gV2l0aG91dCBpdCwgaXQgbWF5IGJlIGRpZmZpY3VsdCBmb3Igc29tZSB1c2VycyB3aXRoIGRpc2FiaWxpdGllcyB0byB1bmRlcnN0YW5kIHRoZSBjb250ZW50IG9yIGRhdGEgZGlzcGxheWVkIG9mIHRoZSB0YWJsZS4iLA0KY2FwdGlvbjoiVGFibGUgY2FwdGlvbiIsDQpmcmFtZToiRnJhbWUiLA0KZnJhbWVfbm9uZToibm9uZSIsDQpmcmFtZV9ncm91cHM6Imdyb3VwcyIsDQpmcmFtZV9yb3dzOiJyb3dzIiwNCmZyYW1lX2NvbHM6ImNvbHMiLA0KZnJhbWVfYWxsOiJhbGwiLA0KcnVsZXM6IlJ1bGVzIiwNCnJ1bGVzX3ZvaWQ6InZvaWQiLA0KcnVsZXNfYWJvdmU6ImFib3ZlIiwNCnJ1bGVzX2JlbG93OiJiZWxvdyIsDQpydWxlc19oc2lkZXM6ImhzaWRlcyIsDQpydWxlc19saHM6ImxocyIsDQpydWxlc19yaHM6InJocyIsDQpydWxlc192c2lkZXM6InZzaWRlcyIsDQpydWxlc19ib3g6ImJveCIsDQpydWxlc19ib3JkZXI6ImJvcmRlciINCn0pOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/merge_cells.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjdGFibGVfZGxnLm1lcmdlX2NlbGxzX3RpdGxlfTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9tY3RhYnMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvdmFsaWRhdGUuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvbWVyZ2VfY2VsbHMuanMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5IHN0eWxlPSJtYXJnaW46IDhweCI+Cjxmb3JtIG9uc3VibWl0PSJNZXJnZUNlbGxzRGlhbG9nLm1lcmdlKCk7cmV0dXJuIGZhbHNlOyIgYWN0aW9uPSIjIj4KCTxmaWVsZHNldD4KCQk8bGVnZW5kPnsjdGFibGVfZGxnLm1lcmdlX2NlbGxzX3RpdGxlfTwvbGVnZW5kPgoJCSAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIzIiB3aWR0aD0iMTAwJSI+CgkJCSAgPHRyPgoJCQkJPHRkPnsjdGFibGVfZGxnLmNvbHN9OjwvdGQ+CgkJCQk8dGQgYWxpZ249InJpZ2h0Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibnVtY29scyIgdmFsdWU9IiIgY2xhc3M9Im51bWJlciBtaW4xIG1jZUZvY3VzIiBzdHlsZT0id2lkdGg6IDMwcHgiIC8+PC90ZD4KCQkJICA8L3RyPgoJCQkgIDx0cj4KCQkJCTx0ZD57I3RhYmxlX2RsZy5yb3dzfTo8L3RkPgoJCQkJPHRkIGFsaWduPSJyaWdodCI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im51bXJvd3MiIHZhbHVlPSIiIGNsYXNzPSJudW1iZXIgbWluMSIgc3R5bGU9IndpZHRoOiAzMHB4IiAvPjwvdGQ+CgkJCSAgPC90cj4KCQkgIDwvdGFibGU+Cgk8L2ZpZWxkc2V0PgoKCTxkaXYgY2xhc3M9Im1jZUFjdGlvblBhbmVsIj4KCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBpZD0iaW5zZXJ0IiBuYW1lPSJpbnNlcnQiIHZhbHVlPSJ7I3VwZGF0ZX0iIC8+CgkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNhbmNlbCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0ieyNjYW5jZWx9IiBvbmNsaWNrPSJ0aW55TUNFUG9wdXAuY2xvc2UoKTsiIC8+Cgk8L2Rpdj4KPC9mb3JtPgo8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/row.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjdGFibGVfZGxnLnJvd190aXRsZX08L3RpdGxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdGlueV9tY2VfcG9wdXAuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvbWN0YWJzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL2Zvcm1fdXRpbHMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZWRpdGFibGVfc2VsZWN0cy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9yb3cuanMiPjwvc2NyaXB0PgoJPGxpbmsgaHJlZj0iY3NzL3Jvdy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+CjwvaGVhZD4KPGJvZHkgaWQ9InRhYmxlcm93IiBzdHlsZT0iZGlzcGxheTogbm9uZSI+Cgk8Zm9ybSBvbnN1Ym1pdD0idXBkYXRlQWN0aW9uKCk7cmV0dXJuIGZhbHNlOyIgYWN0aW9uPSIjIj4KCQk8ZGl2IGNsYXNzPSJ0YWJzIj4KCQkJPHVsPgoJCQkJPGxpIGlkPSJnZW5lcmFsX3RhYiIgY2xhc3M9ImN1cnJlbnQiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2dlbmVyYWxfdGFiJywnZ2VuZXJhbF9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjdGFibGVfZGxnLmdlbmVyYWxfdGFifTwvYT48L3NwYW4+PC9saT4KCQkJCTxsaSBpZD0iYWR2YW5jZWRfdGFiIj48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdhZHZhbmNlZF90YWInLCdhZHZhbmNlZF9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjdGFibGVfZGxnLmFkdmFuY2VkX3RhYn08L2E+PC9zcGFuPjwvbGk+CgkJCTwvdWw+CgkJPC9kaXY+CgoJCTxkaXYgY2xhc3M9InBhbmVsX3dyYXBwZXIiPgoJCQk8ZGl2IGlkPSJnZW5lcmFsX3BhbmVsIiBjbGFzcz0icGFuZWwgY3VycmVudCI+CgkJCQk8ZmllbGRzZXQ+CgkJCQkJPGxlZ2VuZD57I3RhYmxlX2RsZy5nZW5lcmFsX3Byb3BzfTwvbGVnZW5kPgoKCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0icm93dHlwZSI+eyN0YWJsZV9kbGcucm93dHlwZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbDIiPgoJCQkJCQkJCTxzZWxlY3QgaWQ9InJvd3R5cGUiIG5hbWU9InJvd3R5cGUiIGNsYXNzPSJtY2VGb2N1cyI+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InRoZWFkIj57I3RhYmxlX2RsZy50aGVhZH08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idGJvZHkiPnsjdGFibGVfZGxnLnRib2R5fTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJ0Zm9vdCI+eyN0YWJsZV9kbGcudGZvb3R9PC9vcHRpb24+CgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9ImFsaWduIj57I3RhYmxlX2RsZy5hbGlnbn08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbDIiPgoJCQkJCQkJCTxzZWxlY3QgaWQ9ImFsaWduIiBuYW1lPSJhbGlnbiI+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJjZW50ZXIiPnsjdGFibGVfZGxnLmFsaWduX21pZGRsZX08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibGVmdCI+eyN0YWJsZV9kbGcuYWxpZ25fbGVmdH08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icmlnaHQiPnsjdGFibGVfZGxnLmFsaWduX3JpZ2h0fTwvb3B0aW9uPgoJCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgZm9yPSJ2YWxpZ24iPnsjdGFibGVfZGxnLnZhbGlnbn08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbDIiPgoJCQkJCQkJCTxzZWxlY3QgaWQ9InZhbGlnbiIgbmFtZT0idmFsaWduIj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InRvcCI+eyN0YWJsZV9kbGcuYWxpZ25fdG9wfTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJtaWRkbGUiPnsjdGFibGVfZGxnLmFsaWduX21pZGRsZX08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYm90dG9tIj57I3RhYmxlX2RsZy5hbGlnbl9ib3R0b219PC9vcHRpb24+CgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyIGlkPSJzdHlsZVNlbGVjdFJvdyI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iY2xhc3MiPnsjY2xhc3NfbmFtZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbDIiPgoJCQkJCQkJCTxzZWxlY3QgaWQ9ImNsYXNzIiBuYW1lPSJjbGFzcyIgY2xhc3M9Im1jZUVkaXRhYmxlU2VsZWN0Ij4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIiBzZWxlY3RlZD0ic2VsZWN0ZWQiPnsjbm90X3NldH08L29wdGlvbj4KCQkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0iaGVpZ2h0Ij57I3RhYmxlX2RsZy5oZWlnaHR9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2wyIj48aW5wdXQgbmFtZT0iaGVpZ2h0IiB0eXBlPSJ0ZXh0IiBpZD0iaGVpZ2h0IiB2YWx1ZT0iIiBzaXplPSI0IiBtYXhsZW5ndGg9IjQiIG9uY2hhbmdlPSJjaGFuZ2VkU2l6ZSgpOyIgLz48L3RkPgoJCQkJCQk8L3RyPgoJCQkJCTwvdGFibGU+CgkJCQk8L2ZpZWxkc2V0PgoJCQk8L2Rpdj4KCgkJCTxkaXYgaWQ9ImFkdmFuY2VkX3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJCQkJPGZpZWxkc2V0PgoJCQkJCTxsZWdlbmQ+eyN0YWJsZV9kbGcuYWR2YW5jZWRfcHJvcHN9PC9sZWdlbmQ+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iNCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iaWQiPnsjdGFibGVfZGxnLmlkfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJpZCIgbmFtZT0iaWQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHN0eWxlPSJ3aWR0aDogMjAwcHgiIC8+PC90ZD4gCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+PGxhYmVsIGZvcj0ic3R5bGUiPnsjdGFibGVfZGxnLnN0eWxlfTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InN0eWxlIiBuYW1lPSJzdHlsZSIgdmFsdWU9IiIgc3R5bGU9IndpZHRoOiAyMDBweDsiIG9uY2hhbmdlPSJjaGFuZ2VkU3R5bGUoKTsiIC8+PC90ZD4KCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iZGlyIj57I3RhYmxlX2RsZy5sYW5nZGlyfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHNlbGVjdCBpZD0iZGlyIiBuYW1lPSJkaXIiIHN0eWxlPSJ3aWR0aDogMjAwcHgiPiAKCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPiAKCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Imx0ciI+eyN0YWJsZV9kbGcubHRyfTwvb3B0aW9uPiAKCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InJ0bCI+eyN0YWJsZV9kbGcucnRsfTwvb3B0aW9uPiAKCQkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJCTwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJsYW5nIj57I3RhYmxlX2RsZy5sYW5nY29kZX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTxpbnB1dCBpZD0ibGFuZyIgbmFtZT0ibGFuZyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc3R5bGU9IndpZHRoOiAyMDBweCIgLz4KCQkJCQkJCTwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJiYWNrZ3JvdW5kaW1hZ2UiPnsjdGFibGVfZGxnLmJnaW1hZ2V9PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJiYWNrZ3JvdW5kaW1hZ2UiIG5hbWU9ImJhY2tncm91bmRpbWFnZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc3R5bGU9IndpZHRoOiAyMDBweCIgb25jaGFuZ2U9ImNoYW5nZWRCYWNrZ3JvdW5kSW1hZ2UoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZCBpZD0iYmFja2dyb3VuZGltYWdlYnJvd3NlcmNvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4gCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImJnY29sb3IiPnsjdGFibGVfZGxnLmJnY29sb3J9PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJiZ2NvbG9yIiBuYW1lPSJiZ2NvbG9yIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzaXplPSI5IiBvbmNoYW5nZT0idXBkYXRlQ29sb3IoJ2JnY29sb3JfcGljaycsJ2JnY29sb3InKTtjaGFuZ2VkQ29sb3IoKTsiIC8+PC90ZD4KCQkJCQkJCQkJCTx0ZCBpZD0iYmdjb2xvcl9waWNrY29udGFpbmVyIj4mbmJzcDs8L3RkPgoJCQkJCQkJCQk8L3RyPgoJCQkJCQkJCTwvdGFibGU+CgkJCQkJCQk8L3RkPiAKCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJPC9maWVsZHNldD4KCQkJPC9kaXY+CgkJPC9kaXY+CgoJCTxkaXYgY2xhc3M9Im1jZUFjdGlvblBhbmVsIj4KCQkJPGRpdj4KCQkJCTxzZWxlY3QgaWQ9ImFjdGlvbiIgbmFtZT0iYWN0aW9uIj4KCQkJCQk8b3B0aW9uIHZhbHVlPSJyb3ciPnsjdGFibGVfZGxnLnJvd19yb3d9PC9vcHRpb24+CgkJCQkJPG9wdGlvbiB2YWx1ZT0ib2RkIj57I3RhYmxlX2RsZy5yb3dfb2RkfTwvb3B0aW9uPgoJCQkJCTxvcHRpb24gdmFsdWU9ImV2ZW4iPnsjdGFibGVfZGxnLnJvd19ldmVufTwvb3B0aW9uPgoJCQkJCTxvcHRpb24gdmFsdWU9ImFsbCI+eyN0YWJsZV9kbGcucm93X2FsbH08L29wdGlvbj4KCQkJCTwvc2VsZWN0PgoJCQk8L2Rpdj4KCgkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJpbnNlcnQiIG5hbWU9Imluc2VydCIgdmFsdWU9InsjdXBkYXRlfSIgLz4KCQkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNhbmNlbCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0ieyNjYW5jZWx9IiBvbmNsaWNrPSJ0aW55TUNFUG9wdXAuY2xvc2UoKTsiIC8+CgkJPC9kaXY+Cgk8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/table/table.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjdGFibGVfZGxnLnRpdGxlfTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9tY3RhYnMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZm9ybV91dGlscy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy92YWxpZGF0ZS5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9lZGl0YWJsZV9zZWxlY3RzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL3RhYmxlLmpzIj48L3NjcmlwdD4KCTxsaW5rIGhyZWY9ImNzcy90YWJsZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+CjwvaGVhZD4KPGJvZHkgaWQ9InRhYmxlIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+Cgk8Zm9ybSBvbnN1Ym1pdD0iaW5zZXJ0VGFibGUoKTtyZXR1cm4gZmFsc2U7IiBhY3Rpb249IiMiPgoJCTxkaXYgY2xhc3M9InRhYnMiPgoJCQk8dWw+CgkJCQk8bGkgaWQ9ImdlbmVyYWxfdGFiIiBjbGFzcz0iY3VycmVudCI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignZ2VuZXJhbF90YWInLCdnZW5lcmFsX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyN0YWJsZV9kbGcuZ2VuZXJhbF90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCQkJPGxpIGlkPSJhZHZhbmNlZF90YWIiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2FkdmFuY2VkX3RhYicsJ2FkdmFuY2VkX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyN0YWJsZV9kbGcuYWR2YW5jZWRfdGFifTwvYT48L3NwYW4+PC9saT4KCQkJPC91bD4KCQk8L2Rpdj4KCgkJPGRpdiBjbGFzcz0icGFuZWxfd3JhcHBlciI+CgkJCTxkaXYgaWQ9ImdlbmVyYWxfcGFuZWwiIGNsYXNzPSJwYW5lbCBjdXJyZW50Ij4KCQkJCTxmaWVsZHNldD4KCQkJCQk8bGVnZW5kPnsjdGFibGVfZGxnLmdlbmVyYWxfcHJvcHN9PC9sZWdlbmQ+CgkJCQkJICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KCQkJCQkJCSAgPHRyPgoJCQkJCQkJCTx0ZD48bGFiZWwgaWQ9ImNvbHNsYWJlbCIgZm9yPSJjb2xzIj57I3RhYmxlX2RsZy5jb2xzfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJjb2xzIiBuYW1lPSJjb2xzIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzaXplPSIzIiBtYXhsZW5ndGg9IjMiIGNsYXNzPSJyZXF1aXJlZCBudW1iZXIgbWluMSBtY2VGb2N1cyIgLz48L3RkPgoJCQkJCQkJCTx0ZD48bGFiZWwgaWQ9InJvd3NsYWJlbCIgZm9yPSJyb3dzIj57I3RhYmxlX2RsZy5yb3dzfTwvbGFiZWw+PC90ZD4KCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJyb3dzIiBuYW1lPSJyb3dzIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzaXplPSIzIiBtYXhsZW5ndGg9IjMiIGNsYXNzPSJyZXF1aXJlZCBudW1iZXIgbWluMSIgLz48L3RkPgoJCQkJCQkJICA8L3RyPgoJCQkJCQkJICA8dHI+CgkJCQkJCQkJPHRkPjxsYWJlbCBpZD0iY2VsbHBhZGRpbmdsYWJlbCIgZm9yPSJjZWxscGFkZGluZyI+eyN0YWJsZV9kbGcuY2VsbHBhZGRpbmd9PC9sYWJlbD48L3RkPgoJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImNlbGxwYWRkaW5nIiBuYW1lPSJjZWxscGFkZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iMyIgbWF4bGVuZ3RoPSIzIiBjbGFzcz0ibnVtYmVyIiAvPjwvdGQ+CgkJCQkJCQkJPHRkPjxsYWJlbCBpZD0iY2VsbHNwYWNpbmdsYWJlbCIgZm9yPSJjZWxsc3BhY2luZyI+eyN0YWJsZV9kbGcuY2VsbHNwYWNpbmd9PC9sYWJlbD48L3RkPgoJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImNlbGxzcGFjaW5nIiBuYW1lPSJjZWxsc3BhY2luZyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iMyIgbWF4bGVuZ3RoPSIzIiBjbGFzcz0ibnVtYmVyIiAvPjwvdGQ+CgkJCQkJCQkgIDwvdHI+CgkJCQkJCQkgIDx0cj4KCQkJCQkJCQk8dGQ+PGxhYmVsIGlkPSJhbGlnbmxhYmVsIiBmb3I9ImFsaWduIj57I3RhYmxlX2RsZy5hbGlnbn08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJPHRkPjxzZWxlY3QgaWQ9ImFsaWduIiBuYW1lPSJhbGlnbiI+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPgoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJjZW50ZXIiPnsjdGFibGVfZGxnLmFsaWduX21pZGRsZX08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibGVmdCI+eyN0YWJsZV9kbGcuYWxpZ25fbGVmdH08L29wdGlvbj4KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icmlnaHQiPnsjdGFibGVfZGxnLmFsaWduX3JpZ2h0fTwvb3B0aW9uPgoJCQkJCQkJCSAgPC9zZWxlY3Q+PC90ZD4KCQkJCQkJCQk8dGQ+PGxhYmVsIGlkPSJib3JkZXJsYWJlbCIgZm9yPSJib3JkZXIiPnsjdGFibGVfZGxnLmJvcmRlcn08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJPHRkPjxpbnB1dCBpZD0iYm9yZGVyIiBuYW1lPSJib3JkZXIiIHR5cGU9InRleHQiIHZhbHVlPSIiIHNpemU9IjMiIG1heGxlbmd0aD0iMyIgb25jaGFuZ2U9ImNoYW5nZWRCb3JkZXIoKTsiIGNsYXNzPSJudW1iZXIiIC8+PC90ZD4KCQkJCQkJCSAgPC90cj4KCQkJCQkJCSAgPHRyIGlkPSJ3aWR0aF9yb3ciPgoJCQkJCQkJCTx0ZD48bGFiZWwgaWQ9IndpZHRobGFiZWwiIGZvcj0id2lkdGgiPnsjdGFibGVfZGxnLndpZHRofTwvbGFiZWw+PC90ZD4KCQkJCQkJCQk8dGQ+PGlucHV0IG5hbWU9IndpZHRoIiB0eXBlPSJ0ZXh0IiBpZD0id2lkdGgiIHZhbHVlPSIiIHNpemU9IjQiIG1heGxlbmd0aD0iNCIgb25jaGFuZ2U9ImNoYW5nZWRTaXplKCk7IiBjbGFzcz0ic2l6ZSIgLz48L3RkPgoJCQkJCQkJCTx0ZD48bGFiZWwgaWQ9ImhlaWdodGxhYmVsIiBmb3I9ImhlaWdodCI+eyN0YWJsZV9kbGcuaGVpZ2h0fTwvbGFiZWw+PC90ZD4KCQkJCQkJCQk8dGQ+PGlucHV0IG5hbWU9ImhlaWdodCIgdHlwZT0idGV4dCIgaWQ9ImhlaWdodCIgdmFsdWU9IiIgc2l6ZT0iNCIgbWF4bGVuZ3RoPSI0IiBvbmNoYW5nZT0iY2hhbmdlZFNpemUoKTsiIGNsYXNzPSJzaXplIiAvPjwvdGQ+CgkJCQkJCQkgIDwvdHI+CgkJCQkJCQkgIDx0ciBpZD0ic3R5bGVTZWxlY3RSb3ciPgoJCQkJCQkJCTx0ZD48bGFiZWwgaWQ9ImNsYXNzbGFiZWwiIGZvcj0iY2xhc3MiPnsjY2xhc3NfbmFtZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQkJPHRkIGNvbHNwYW49IjMiPgoJCQkJCQkJCSA8c2VsZWN0IGlkPSJjbGFzcyIgbmFtZT0iY2xhc3MiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCI+CgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiIgc2VsZWN0ZWQ9InNlbGVjdGVkIj57I25vdF9zZXR9PC9vcHRpb24+CgkJCQkJCQkJIDwvc2VsZWN0PjwvdGQ+CgkJCQkJCQkgIDwvdHI+CgkJCQkJCQkgIDx0cj4KCQkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImNhcHRpb24iPnsjdGFibGVfZGxnLmNhcHRpb259PC9sYWJlbD48L3RkPiAKCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJjYXB0aW9uIiBuYW1lPSJjYXB0aW9uIiB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94IiB2YWx1ZT0idHJ1ZSIgLz48L3RkPiAKCQkJCQkJCSAgPC90cj4KCQkJCQkJCTwvdGFibGU+CgkJCQk8L2ZpZWxkc2V0PgoJCQk8L2Rpdj4KCgkJCTxkaXYgaWQ9ImFkdmFuY2VkX3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJCQkJPGZpZWxkc2V0PgoJCQkJCTxsZWdlbmQ+eyN0YWJsZV9kbGcuYWR2YW5jZWRfcHJvcHN9PC9sZWdlbmQ+CgoJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iNCI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0iaWQiPnsjdGFibGVfZGxnLmlkfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+PGlucHV0IGlkPSJpZCIgbmFtZT0iaWQiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJhZHZmaWVsZCIgLz48L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0ic3VtbWFyeSI+eyN0YWJsZV9kbGcuc3VtbWFyeX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPjxpbnB1dCBpZD0ic3VtbWFyeSIgbmFtZT0ic3VtbWFyeSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImFkdmZpZWxkIiAvPjwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBmb3I9InN0eWxlIj57I3RhYmxlX2RsZy5zdHlsZX08L2xhYmVsPjwvdGQ+CgkJCQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJzdHlsZSIgbmFtZT0ic3R5bGUiIHZhbHVlPSIiIGNsYXNzPSJhZHZmaWVsZCIgb25jaGFuZ2U9ImNoYW5nZWRTdHlsZSgpOyIgLz48L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgaWQ9ImxhbmdsYWJlbCIgZm9yPSJsYW5nIj57I3RhYmxlX2RsZy5sYW5nY29kZX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTxpbnB1dCBpZD0ibGFuZyIgbmFtZT0ibGFuZyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImFkdmZpZWxkIiAvPgoJCQkJCQkJPC90ZD4gCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImJhY2tncm91bmRpbWFnZSI+eyN0YWJsZV9kbGcuYmdpbWFnZX08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgkJCQkJCQkJCTx0cj4KCQkJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImJhY2tncm91bmRpbWFnZSIgbmFtZT0iYmFja2dyb3VuZGltYWdlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iYWR2ZmllbGQiIG9uY2hhbmdlPSJjaGFuZ2VkQmFja2dyb3VuZEltYWdlKCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQgaWQ9ImJhY2tncm91bmRpbWFnZWJyb3dzZXJjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJ0ZnJhbWUiPnsjdGFibGVfZGxnLmZyYW1lfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHNlbGVjdCBpZD0idGZyYW1lIiBuYW1lPSJ0ZnJhbWUiIGNsYXNzPSJhZHZmaWVsZCI+IAoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+CgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJ2b2lkIj57I3RhYmxlX2RsZy5ydWxlc192b2lkfTwvb3B0aW9uPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYWJvdmUiPnsjdGFibGVfZGxnLnJ1bGVzX2Fib3ZlfTwvb3B0aW9uPiAKCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9ImJlbG93Ij57I3RhYmxlX2RsZy5ydWxlc19iZWxvd308L29wdGlvbj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJoc2lkZXMiPnsjdGFibGVfZGxnLnJ1bGVzX2hzaWRlc308L29wdGlvbj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJsaHMiPnsjdGFibGVfZGxnLnJ1bGVzX2xoc308L29wdGlvbj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJyaHMiPnsjdGFibGVfZGxnLnJ1bGVzX3Joc308L29wdGlvbj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJ2c2lkZXMiPnsjdGFibGVfZGxnLnJ1bGVzX3ZzaWRlc308L29wdGlvbj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJib3giPnsjdGFibGVfZGxnLnJ1bGVzX2JveH08L29wdGlvbj4gCgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJib3JkZXIiPnsjdGFibGVfZGxnLnJ1bGVzX2JvcmRlcn08L29wdGlvbj4gCgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L3RkPiAKCQkJCQkJPC90cj4KCgkJCQkJCTx0cj4KCQkJCQkJCTx0ZCBjbGFzcz0iY29sdW1uMSI+PGxhYmVsIGZvcj0icnVsZXMiPnsjdGFibGVfZGxnLnJ1bGVzfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHNlbGVjdCBpZD0icnVsZXMiIG5hbWU9InJ1bGVzIiBjbGFzcz0iYWR2ZmllbGQiPiAKCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPiAKCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Im5vbmUiPnsjdGFibGVfZGxnLmZyYW1lX25vbmV9PC9vcHRpb24+CgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJncm91cHMiPnsjdGFibGVfZGxnLmZyYW1lX2dyb3Vwc308L29wdGlvbj4KCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InJvd3MiPnsjdGFibGVfZGxnLmZyYW1lX3Jvd3N9PC9vcHRpb24+CgkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJjb2xzIj57I3RhYmxlX2RsZy5mcmFtZV9jb2xzfTwvb3B0aW9uPgoJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYWxsIj57I3RhYmxlX2RsZy5mcmFtZV9hbGx9PC9vcHRpb24+CgkJCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQkJPC90ZD4gCgkJCQkJCTwvdHI+CgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY2xhc3M9ImNvbHVtbjEiPjxsYWJlbCBmb3I9ImRpciI+eyN0YWJsZV9kbGcubGFuZ2Rpcn08L2xhYmVsPjwvdGQ+IAoJCQkJCQkJPHRkPgoJCQkJCQkJCTxzZWxlY3QgaWQ9ImRpciIgbmFtZT0iZGlyIiBjbGFzcz0iYWR2ZmllbGQiPiAKCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPiAKCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Imx0ciI+eyN0YWJsZV9kbGcubHRyfTwvb3B0aW9uPiAKCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9InJ0bCI+eyN0YWJsZV9kbGcucnRsfTwvb3B0aW9uPiAKCQkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJCTwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJib3JkZXJjb2xvciI+eyN0YWJsZV9kbGcuYm9yZGVyY29sb3J9PC9sYWJlbD48L3RkPiAKCQkJCQkJCTx0ZD4KCQkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJCQkJCQk8dHI+CgkJCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJib3JkZXJjb2xvciIgbmFtZT0iYm9yZGVyY29sb3IiIHR5cGU9InRleHQiIHZhbHVlPSIiIHNpemU9IjkiIG9uY2hhbmdlPSJ1cGRhdGVDb2xvcignYm9yZGVyY29sb3JfcGljaycsJ2JvcmRlcmNvbG9yJyk7Y2hhbmdlZENvbG9yKCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQgaWQ9ImJvcmRlcmNvbG9yX3BpY2tjb250YWluZXIiPiZuYnNwOzwvdGQ+CgkJCQkJCQkJCTwvdHI+CgkJCQkJCQkJPC90YWJsZT4KCQkJCQkJCTwvdGQ+IAoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNsYXNzPSJjb2x1bW4xIj48bGFiZWwgZm9yPSJiZ2NvbG9yIj57I3RhYmxlX2RsZy5iZ2NvbG9yfTwvbGFiZWw+PC90ZD4gCgkJCQkJCQk8dGQ+CgkJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCQkJCQkJCQkJPHRyPgoJCQkJCQkJCQkJPHRkPjxpbnB1dCBpZD0iYmdjb2xvciIgbmFtZT0iYmdjb2xvciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iOSIgb25jaGFuZ2U9InVwZGF0ZUNvbG9yKCdiZ2NvbG9yX3BpY2snLCdiZ2NvbG9yJyk7Y2hhbmdlZENvbG9yKCk7IiAvPjwvdGQ+CgkJCQkJCQkJCQk8dGQgaWQ9ImJnY29sb3JfcGlja2NvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJCQkJCQkJPC90cj4KCQkJCQkJCQk8L3RhYmxlPgoJCQkJCQkJPC90ZD4gCgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCTwvZmllbGRzZXQ+CgkJCTwvZGl2PgoJCTwvZGl2PgoKCQk8ZGl2IGNsYXNzPSJtY2VBY3Rpb25QYW5lbCI+CgkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJpbnNlcnQiIG5hbWU9Imluc2VydCIgdmFsdWU9InsjaW5zZXJ0fSIgLz4KCQkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNhbmNlbCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0ieyNjYW5jZWx9IiBvbmNsaWNrPSJ0aW55TUNFUG9wdXAuY2xvc2UoKTsiIC8+CgkJPC9kaXY+Cgk8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/template/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/template/blank.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KCTx0aXRsZT5ibGFua19wYWdlPC90aXRsZT4KCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCXBhcmVudC5UZW1wbGF0ZURpYWxvZy5sb2FkQ1NTRmlsZXMoZG9jdW1lbnQpOwoJPC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHkgaWQ9Im1jZVRlbXBsYXRlUHJldmlldyIgY2xhc3M9Im1jZUNvbnRlbnRCb2R5Ij4KCjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/template/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/template/css/template.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[I2ZybWJvZHkgewoJcGFkZGluZzogMTBweDsKCWJhY2tncm91bmQtY29sb3I6ICNGRkY7Cglib3JkZXI6IDFweCBzb2xpZCAjQ0NDOwp9CgouZnJtUm93IHsKCW1hcmdpbi1ib3R0b206IDEwcHg7Cn0KCiN0ZW1wbGF0ZXNyYyB7Cglib3JkZXI6IG5vbmU7Cgl3aWR0aDogMzIwcHg7CgloZWlnaHQ6IDI0MHB4Owp9CgoudGl0bGUgewoJcGFkZGluZy1ib3R0b206IDVweDsKfQoKLm1jZUFjdGlvblBhbmVsIHsKCXBhZGRpbmctdG9wOiA1cHg7Cn0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/template/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dmFyIGE9dGlueW1jZS5lYWNoO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnBsdWdpbnMuVGVtcGxhdGVQbHVnaW4iLHtpbml0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcztkLmVkaXRvcj1iO2IuYWRkQ29tbWFuZCgibWNlVGVtcGxhdGUiLGZ1bmN0aW9uKGUpe2Iud2luZG93TWFuYWdlci5vcGVuKHtmaWxlOmMrIi90ZW1wbGF0ZS5odG0iLHdpZHRoOmIuZ2V0UGFyYW0oInRlbXBsYXRlX3BvcHVwX3dpZHRoIiw3NTApLGhlaWdodDpiLmdldFBhcmFtKCJ0ZW1wbGF0ZV9wb3B1cF9oZWlnaHQiLDYwMCksaW5saW5lOjF9LHtwbHVnaW5fdXJsOmN9KX0pO2IuYWRkQ29tbWFuZCgibWNlSW5zZXJ0VGVtcGxhdGUiLGQuX2luc2VydFRlbXBsYXRlLGQpO2IuYWRkQnV0dG9uKCJ0ZW1wbGF0ZSIse3RpdGxlOiJ0ZW1wbGF0ZS5kZXNjIixjbWQ6Im1jZVRlbXBsYXRlIn0pO2Iub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihlLGcpe3ZhciBmPWUuZG9tO2EoZi5zZWxlY3QoImRpdiIsZy5ub2RlKSxmdW5jdGlvbihoKXtpZihmLmhhc0NsYXNzKGgsIm1jZVRtcGwiKSl7YShmLnNlbGVjdCgiKiIsaCksZnVuY3Rpb24oaSl7aWYoZi5oYXNDbGFzcyhpLGUuZ2V0UGFyYW0oInRlbXBsYXRlX21kYXRlX2NsYXNzZXMiLCJtZGF0ZSIpLnJlcGxhY2UoL1xzKy9nLCJ8IikpKXtpLmlubmVySFRNTD1kLl9nZXREYXRlVGltZShuZXcgRGF0ZSgpLGUuZ2V0UGFyYW0oInRlbXBsYXRlX21kYXRlX2Zvcm1hdCIsZS5nZXRMYW5nKCJ0ZW1wbGF0ZS5tZGF0ZV9mb3JtYXQiKSkpfX0pO2QuX3JlcGxhY2VWYWxzKGgpfX0pfSl9LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6IlRlbXBsYXRlIHBsdWdpbiIsYXV0aG9yOiJNb3hpZWNvZGUgU3lzdGVtcyBBQiIsYXV0aG9ydXJsOiJodHRwOi8vd3d3Lm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy90ZW1wbGF0ZSIsdmVyc2lvbjp0aW55bWNlLm1ham9yVmVyc2lvbisiLiIrdGlueW1jZS5taW5vclZlcnNpb259fSxfaW5zZXJ0VGVtcGxhdGU6ZnVuY3Rpb24oaSxqKXt2YXIgaz10aGlzLGc9ay5lZGl0b3IsZixjLGQ9Zy5kb20sYj1nLnNlbGVjdGlvbi5nZXRDb250ZW50KCk7Zj1qLmNvbnRlbnQ7YShrLmVkaXRvci5nZXRQYXJhbSgidGVtcGxhdGVfcmVwbGFjZV92YWx1ZXMiKSxmdW5jdGlvbihsLGgpe2lmKHR5cGVvZihsKSE9ImZ1bmN0aW9uIil7Zj1mLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFx7XFwkIitoKyJcXH0iLCJnIiksbCl9fSk7Yz1kLmNyZWF0ZSgiZGl2IixudWxsLGYpO249ZC5zZWxlY3QoIi5tY2VUbXBsIixjKTtpZihuJiZuLmxlbmd0aD4wKXtjPWQuY3JlYXRlKCJkaXYiLG51bGwpO2MuYXBwZW5kQ2hpbGQoblswXS5jbG9uZU5vZGUodHJ1ZSkpfWZ1bmN0aW9uIGUobCxoKXtyZXR1cm4gbmV3IFJlZ0V4cCgiXFxiIitoKyJcXGIiLCJnIikudGVzdChsLmNsYXNzTmFtZSl9YShkLnNlbGVjdCgiKiIsYyksZnVuY3Rpb24oaCl7aWYoZShoLGcuZ2V0UGFyYW0oInRlbXBsYXRlX2NkYXRlX2NsYXNzZXMiLCJjZGF0ZSIpLnJlcGxhY2UoL1xzKy9nLCJ8IikpKXtoLmlubmVySFRNTD1rLl9nZXREYXRlVGltZShuZXcgRGF0ZSgpLGcuZ2V0UGFyYW0oInRlbXBsYXRlX2NkYXRlX2Zvcm1hdCIsZy5nZXRMYW5nKCJ0ZW1wbGF0ZS5jZGF0ZV9mb3JtYXQiKSkpfWlmKGUoaCxnLmdldFBhcmFtKCJ0ZW1wbGF0ZV9tZGF0ZV9jbGFzc2VzIiwibWRhdGUiKS5yZXBsYWNlKC9ccysvZywifCIpKSl7aC5pbm5lckhUTUw9ay5fZ2V0RGF0ZVRpbWUobmV3IERhdGUoKSxnLmdldFBhcmFtKCJ0ZW1wbGF0ZV9tZGF0ZV9mb3JtYXQiLGcuZ2V0TGFuZygidGVtcGxhdGUubWRhdGVfZm9ybWF0IikpKX1pZihlKGgsZy5nZXRQYXJhbSgidGVtcGxhdGVfc2VsZWN0ZWRfY29udGVudF9jbGFzc2VzIiwic2VsY29udGVudCIpLnJlcGxhY2UoL1xzKy9nLCJ8IikpKXtoLmlubmVySFRNTD1ifX0pO2suX3JlcGxhY2VWYWxzKGMpO2cuZXhlY0NvbW1hbmQoIm1jZUluc2VydENvbnRlbnQiLGZhbHNlLGMuaW5uZXJIVE1MKTtnLmFkZFZpc3VhbCgpfSxfcmVwbGFjZVZhbHM6ZnVuY3Rpb24oYyl7dmFyIGQ9dGhpcy5lZGl0b3IuZG9tLGI9dGhpcy5lZGl0b3IuZ2V0UGFyYW0oInRlbXBsYXRlX3JlcGxhY2VfdmFsdWVzIik7YShkLnNlbGVjdCgiKiIsYyksZnVuY3Rpb24oZil7YShiLGZ1bmN0aW9uKGcsZSl7aWYoZC5oYXNDbGFzcyhmLGUpKXtpZih0eXBlb2YoYltlXSk9PSJmdW5jdGlvbiIpe2JbZV0oZil9fX0pfSl9LF9nZXREYXRlVGltZTpmdW5jdGlvbihlLGIpe2lmKCFiKXtyZXR1cm4iIn1mdW5jdGlvbiBjKGcsZCl7dmFyIGY7Zz0iIitnO2lmKGcubGVuZ3RoPGQpe2ZvcihmPTA7ZjwoZC1nLmxlbmd0aCk7ZisrKXtnPSIwIitnfX1yZXR1cm4gZ31iPWIucmVwbGFjZSgiJUQiLCIlbS8lZC8leSIpO2I9Yi5yZXBsYWNlKCIlciIsIiVJOiVNOiVTICVwIik7Yj1iLnJlcGxhY2UoIiVZIiwiIitlLmdldEZ1bGxZZWFyKCkpO2I9Yi5yZXBsYWNlKCIleSIsIiIrZS5nZXRZZWFyKCkpO2I9Yi5yZXBsYWNlKCIlbSIsYyhlLmdldE1vbnRoKCkrMSwyKSk7Yj1iLnJlcGxhY2UoIiVkIixjKGUuZ2V0RGF0ZSgpLDIpKTtiPWIucmVwbGFjZSgiJUgiLCIiK2MoZS5nZXRIb3VycygpLDIpKTtiPWIucmVwbGFjZSgiJU0iLCIiK2MoZS5nZXRNaW51dGVzKCksMikpO2I9Yi5yZXBsYWNlKCIlUyIsIiIrYyhlLmdldFNlY29uZHMoKSwyKSk7Yj1iLnJlcGxhY2UoIiVJIiwiIisoKGUuZ2V0SG91cnMoKSsxMSklMTIrMSkpO2I9Yi5yZXBsYWNlKCIlcCIsIiIrKGUuZ2V0SG91cnMoKTwxMj8iQU0iOiJQTSIpKTtiPWIucmVwbGFjZSgiJUIiLCIiK3RoaXMuZWRpdG9yLmdldExhbmcoInRlbXBsYXRlX21vbnRoc19sb25nIikuc3BsaXQoIiwiKVtlLmdldE1vbnRoKCldKTtiPWIucmVwbGFjZSgiJWIiLCIiK3RoaXMuZWRpdG9yLmdldExhbmcoInRlbXBsYXRlX21vbnRoc19zaG9ydCIpLnNwbGl0KCIsIilbZS5nZXRNb250aCgpXSk7Yj1iLnJlcGxhY2UoIiVBIiwiIit0aGlzLmVkaXRvci5nZXRMYW5nKCJ0ZW1wbGF0ZV9kYXlfbG9uZyIpLnNwbGl0KCIsIilbZS5nZXREYXkoKV0pO2I9Yi5yZXBsYWNlKCIlYSIsIiIrdGhpcy5lZGl0b3IuZ2V0TGFuZygidGVtcGxhdGVfZGF5X3Nob3J0Iikuc3BsaXQoIiwiKVtlLmdldERheSgpXSk7Yj1iLnJlcGxhY2UoIiUlIiwiJSIpO3JldHVybiBifX0pO3RpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoInRlbXBsYXRlIix0aW55bWNlLnBsdWdpbnMuVGVtcGxhdGVQbHVnaW4pfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/template/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgZWFjaCA9IHRpbnltY2UuZWFjaDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnBsdWdpbnMuVGVtcGxhdGVQbHVnaW4nLCB7DQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQuZWRpdG9yID0gZWQ7DQoNCgkJCS8vIFJlZ2lzdGVyIGNvbW1hbmRzDQoJCQllZC5hZGRDb21tYW5kKCdtY2VUZW1wbGF0ZScsIGZ1bmN0aW9uKHVpKSB7DQoJCQkJZWQud2luZG93TWFuYWdlci5vcGVuKHsNCgkJCQkJZmlsZSA6IHVybCArICcvdGVtcGxhdGUuaHRtJywNCgkJCQkJd2lkdGggOiBlZC5nZXRQYXJhbSgndGVtcGxhdGVfcG9wdXBfd2lkdGgnLCA3NTApLA0KCQkJCQloZWlnaHQgOiBlZC5nZXRQYXJhbSgndGVtcGxhdGVfcG9wdXBfaGVpZ2h0JywgNjAwKSwNCgkJCQkJaW5saW5lIDogMQ0KCQkJCX0sIHsNCgkJCQkJcGx1Z2luX3VybCA6IHVybA0KCQkJCX0pOw0KCQkJfSk7DQoNCgkJCWVkLmFkZENvbW1hbmQoJ21jZUluc2VydFRlbXBsYXRlJywgdC5faW5zZXJ0VGVtcGxhdGUsIHQpOw0KDQoJCQkvLyBSZWdpc3RlciBidXR0b25zDQoJCQllZC5hZGRCdXR0b24oJ3RlbXBsYXRlJywge3RpdGxlIDogJ3RlbXBsYXRlLmRlc2MnLCBjbWQgOiAnbWNlVGVtcGxhdGUnfSk7DQoNCgkJCWVkLm9uUHJlUHJvY2Vzcy5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQl2YXIgZG9tID0gZWQuZG9tOw0KDQoJCQkJZWFjaChkb20uc2VsZWN0KCdkaXYnLCBvLm5vZGUpLCBmdW5jdGlvbihlKSB7DQoJCQkJCWlmIChkb20uaGFzQ2xhc3MoZSwgJ21jZVRtcGwnKSkgew0KCQkJCQkJZWFjaChkb20uc2VsZWN0KCcqJywgZSksIGZ1bmN0aW9uKGUpIHsNCgkJCQkJCQlpZiAoZG9tLmhhc0NsYXNzKGUsIGVkLmdldFBhcmFtKCd0ZW1wbGF0ZV9tZGF0ZV9jbGFzc2VzJywgJ21kYXRlJykucmVwbGFjZSgvXHMrL2csICd8JykpKQ0KCQkJCQkJCQllLmlubmVySFRNTCA9IHQuX2dldERhdGVUaW1lKG5ldyBEYXRlKCksIGVkLmdldFBhcmFtKCJ0ZW1wbGF0ZV9tZGF0ZV9mb3JtYXQiLCBlZC5nZXRMYW5nKCJ0ZW1wbGF0ZS5tZGF0ZV9mb3JtYXQiKSkpOw0KCQkJCQkJfSk7DQoNCgkJCQkJCXQuX3JlcGxhY2VWYWxzKGUpOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9KTsNCgkJfSwNCg0KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gew0KCQkJCWxvbmduYW1lIDogJ1RlbXBsYXRlIHBsdWdpbicsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3d3dy5tb3hpZWNvZGUuY29tJywNCgkJCQlpbmZvdXJsIDogJ2h0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy90ZW1wbGF0ZScsDQoJCQkJdmVyc2lvbiA6IHRpbnltY2UubWFqb3JWZXJzaW9uICsgIi4iICsgdGlueW1jZS5taW5vclZlcnNpb24NCgkJCX07DQoJCX0sDQoNCgkJX2luc2VydFRlbXBsYXRlIDogZnVuY3Rpb24odWksIHYpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgaCwgZWwsIGRvbSA9IGVkLmRvbSwgc2VsID0gZWQuc2VsZWN0aW9uLmdldENvbnRlbnQoKTsNCg0KCQkJaCA9IHYuY29udGVudDsNCg0KCQkJZWFjaCh0LmVkaXRvci5nZXRQYXJhbSgndGVtcGxhdGVfcmVwbGFjZV92YWx1ZXMnKSwgZnVuY3Rpb24odiwgaykgew0KCQkJCWlmICh0eXBlb2YodikgIT0gJ2Z1bmN0aW9uJykNCgkJCQkJaCA9IGgucmVwbGFjZShuZXcgUmVnRXhwKCdcXHtcXCQnICsgayArICdcXH0nLCAnZycpLCB2KTsNCgkJCX0pOw0KDQoJCQllbCA9IGRvbS5jcmVhdGUoJ2RpdicsIG51bGwsIGgpOw0KDQoJCQkvLyBGaW5kIHRlbXBsYXRlIGVsZW1lbnQgd2l0aGluIGRpdg0KCQkJbiA9IGRvbS5zZWxlY3QoJy5tY2VUbXBsJywgZWwpOw0KCQkJaWYgKG4gJiYgbi5sZW5ndGggPiAwKSB7DQoJCQkJZWwgPSBkb20uY3JlYXRlKCdkaXYnLCBudWxsKTsNCgkJCQllbC5hcHBlbmRDaGlsZChuWzBdLmNsb25lTm9kZSh0cnVlKSk7DQoJCQl9DQoNCgkJCWZ1bmN0aW9uIGhhc0NsYXNzKG4sIGMpIHsNCgkJCQlyZXR1cm4gbmV3IFJlZ0V4cCgnXFxiJyArIGMgKyAnXFxiJywgJ2cnKS50ZXN0KG4uY2xhc3NOYW1lKTsNCgkJCX07DQoNCgkJCWVhY2goZG9tLnNlbGVjdCgnKicsIGVsKSwgZnVuY3Rpb24obikgew0KCQkJCS8vIFJlcGxhY2UgY2RhdGUNCgkJCQlpZiAoaGFzQ2xhc3MobiwgZWQuZ2V0UGFyYW0oJ3RlbXBsYXRlX2NkYXRlX2NsYXNzZXMnLCAnY2RhdGUnKS5yZXBsYWNlKC9ccysvZywgJ3wnKSkpDQoJCQkJCW4uaW5uZXJIVE1MID0gdC5fZ2V0RGF0ZVRpbWUobmV3IERhdGUoKSwgZWQuZ2V0UGFyYW0oInRlbXBsYXRlX2NkYXRlX2Zvcm1hdCIsIGVkLmdldExhbmcoInRlbXBsYXRlLmNkYXRlX2Zvcm1hdCIpKSk7DQoNCgkJCQkvLyBSZXBsYWNlIG1kYXRlDQoJCQkJaWYgKGhhc0NsYXNzKG4sIGVkLmdldFBhcmFtKCd0ZW1wbGF0ZV9tZGF0ZV9jbGFzc2VzJywgJ21kYXRlJykucmVwbGFjZSgvXHMrL2csICd8JykpKQ0KCQkJCQluLmlubmVySFRNTCA9IHQuX2dldERhdGVUaW1lKG5ldyBEYXRlKCksIGVkLmdldFBhcmFtKCJ0ZW1wbGF0ZV9tZGF0ZV9mb3JtYXQiLCBlZC5nZXRMYW5nKCJ0ZW1wbGF0ZS5tZGF0ZV9mb3JtYXQiKSkpOw0KDQoJCQkJLy8gUmVwbGFjZSBzZWxlY3Rpb24NCgkJCQlpZiAoaGFzQ2xhc3MobiwgZWQuZ2V0UGFyYW0oJ3RlbXBsYXRlX3NlbGVjdGVkX2NvbnRlbnRfY2xhc3NlcycsICdzZWxjb250ZW50JykucmVwbGFjZSgvXHMrL2csICd8JykpKQ0KCQkJCQluLmlubmVySFRNTCA9IHNlbDsNCgkJCX0pOw0KDQoJCQl0Ll9yZXBsYWNlVmFscyhlbCk7DQoNCgkJCWVkLmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDb250ZW50JywgZmFsc2UsIGVsLmlubmVySFRNTCk7DQoJCQllZC5hZGRWaXN1YWwoKTsNCgkJfSwNCg0KCQlfcmVwbGFjZVZhbHMgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgZG9tID0gdGhpcy5lZGl0b3IuZG9tLCB2bCA9IHRoaXMuZWRpdG9yLmdldFBhcmFtKCd0ZW1wbGF0ZV9yZXBsYWNlX3ZhbHVlcycpOw0KDQoJCQllYWNoKGRvbS5zZWxlY3QoJyonLCBlKSwgZnVuY3Rpb24oZSkgew0KCQkJCWVhY2godmwsIGZ1bmN0aW9uKHYsIGspIHsNCgkJCQkJaWYgKGRvbS5oYXNDbGFzcyhlLCBrKSkgew0KCQkJCQkJaWYgKHR5cGVvZih2bFtrXSkgPT0gJ2Z1bmN0aW9uJykNCgkJCQkJCQl2bFtrXShlKTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfSk7DQoJCX0sDQoNCgkJX2dldERhdGVUaW1lIDogZnVuY3Rpb24oZCwgZm10KSB7DQoJCQkJaWYgKCFmbXQpDQoJCQkJCXJldHVybiAiIjsNCg0KCQkJCWZ1bmN0aW9uIGFkZFplcm9zKHZhbHVlLCBsZW4pIHsNCgkJCQkJdmFyIGk7DQoNCgkJCQkJdmFsdWUgPSAiIiArIHZhbHVlOw0KDQoJCQkJCWlmICh2YWx1ZS5sZW5ndGggPCBsZW4pIHsNCgkJCQkJCWZvciAoaT0wOyBpPChsZW4tdmFsdWUubGVuZ3RoKTsgaSsrKQ0KCQkJCQkJCXZhbHVlID0gIjAiICsgdmFsdWU7DQoJCQkJCX0NCg0KCQkJCQlyZXR1cm4gdmFsdWU7DQoJCQkJfQ0KDQoJCQkJZm10ID0gZm10LnJlcGxhY2UoIiVEIiwgIiVtLyVkLyV5Iik7DQoJCQkJZm10ID0gZm10LnJlcGxhY2UoIiVyIiwgIiVJOiVNOiVTICVwIik7DQoJCQkJZm10ID0gZm10LnJlcGxhY2UoIiVZIiwgIiIgKyBkLmdldEZ1bGxZZWFyKCkpOw0KCQkJCWZtdCA9IGZtdC5yZXBsYWNlKCIleSIsICIiICsgZC5nZXRZZWFyKCkpOw0KCQkJCWZtdCA9IGZtdC5yZXBsYWNlKCIlbSIsIGFkZFplcm9zKGQuZ2V0TW9udGgoKSsxLCAyKSk7DQoJCQkJZm10ID0gZm10LnJlcGxhY2UoIiVkIiwgYWRkWmVyb3MoZC5nZXREYXRlKCksIDIpKTsNCgkJCQlmbXQgPSBmbXQucmVwbGFjZSgiJUgiLCAiIiArIGFkZFplcm9zKGQuZ2V0SG91cnMoKSwgMikpOw0KCQkJCWZtdCA9IGZtdC5yZXBsYWNlKCIlTSIsICIiICsgYWRkWmVyb3MoZC5nZXRNaW51dGVzKCksIDIpKTsNCgkJCQlmbXQgPSBmbXQucmVwbGFjZSgiJVMiLCAiIiArIGFkZFplcm9zKGQuZ2V0U2Vjb25kcygpLCAyKSk7DQoJCQkJZm10ID0gZm10LnJlcGxhY2UoIiVJIiwgIiIgKyAoKGQuZ2V0SG91cnMoKSArIDExKSAlIDEyICsgMSkpOw0KCQkJCWZtdCA9IGZtdC5yZXBsYWNlKCIlcCIsICIiICsgKGQuZ2V0SG91cnMoKSA8IDEyID8gIkFNIiA6ICJQTSIpKTsNCgkJCQlmbXQgPSBmbXQucmVwbGFjZSgiJUIiLCAiIiArIHRoaXMuZWRpdG9yLmdldExhbmcoInRlbXBsYXRlX21vbnRoc19sb25nIikuc3BsaXQoJywnKVtkLmdldE1vbnRoKCldKTsNCgkJCQlmbXQgPSBmbXQucmVwbGFjZSgiJWIiLCAiIiArIHRoaXMuZWRpdG9yLmdldExhbmcoInRlbXBsYXRlX21vbnRoc19zaG9ydCIpLnNwbGl0KCcsJylbZC5nZXRNb250aCgpXSk7DQoJCQkJZm10ID0gZm10LnJlcGxhY2UoIiVBIiwgIiIgKyB0aGlzLmVkaXRvci5nZXRMYW5nKCJ0ZW1wbGF0ZV9kYXlfbG9uZyIpLnNwbGl0KCcsJylbZC5nZXREYXkoKV0pOw0KCQkJCWZtdCA9IGZtdC5yZXBsYWNlKCIlYSIsICIiICsgdGhpcy5lZGl0b3IuZ2V0TGFuZygidGVtcGxhdGVfZGF5X3Nob3J0Iikuc3BsaXQoJywnKVtkLmdldERheSgpXSk7DQoJCQkJZm10ID0gZm10LnJlcGxhY2UoIiUlIiwgIiUiKTsNCg0KCQkJCXJldHVybiBmbXQ7DQoJCX0NCgl9KTsNCg0KCS8vIFJlZ2lzdGVyIHBsdWdpbg0KCXRpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoJ3RlbXBsYXRlJywgdGlueW1jZS5wbHVnaW5zLlRlbXBsYXRlUGx1Z2luKTsNCn0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/template/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/template/js/template.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgVGVtcGxhdGVEaWFsb2cgPSB7DQoJcHJlSW5pdCA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgdXJsID0gdGlueU1DRVBvcHVwLmdldFBhcmFtKCJ0ZW1wbGF0ZV9leHRlcm5hbF9saXN0X3VybCIpOw0KDQoJCWlmICh1cmwgIT0gbnVsbCkNCgkJCWRvY3VtZW50LndyaXRlKCc8c2MnKydyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyArIHRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUodXJsKSArICciPjwvc2MnKydyaXB0PicpOw0KCX0sDQoNCglpbml0IDogZnVuY3Rpb24oKSB7DQoJCXZhciBlZCA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IsIHRzcmMsIHNlbCwgeCwgdTsNCg0KIAkJdHNyYyA9IGVkLmdldFBhcmFtKCJ0ZW1wbGF0ZV90ZW1wbGF0ZXMiLCBmYWxzZSk7DQogCQlzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHBhdGgnKTsNCg0KCQkvLyBTZXR1cCBleHRlcm5hbCB0ZW1wbGF0ZSBsaXN0DQoJCWlmICghdHNyYyAmJiB0eXBlb2YodGlueU1DRVRlbXBsYXRlTGlzdCkgIT0gJ3VuZGVmaW5lZCcpIHsNCgkJCWZvciAoeD0wLCB0c3JjID0gW107IHg8dGlueU1DRVRlbXBsYXRlTGlzdC5sZW5ndGg7IHgrKykNCgkJCQl0c3JjLnB1c2goe3RpdGxlIDogdGlueU1DRVRlbXBsYXRlTGlzdFt4XVswXSwgc3JjIDogdGlueU1DRVRlbXBsYXRlTGlzdFt4XVsxXSwgZGVzY3JpcHRpb24gOiB0aW55TUNFVGVtcGxhdGVMaXN0W3hdWzJdfSk7DQoJCX0NCg0KCQlmb3IgKHg9MDsgeDx0c3JjLmxlbmd0aDsgeCsrKQ0KCQkJc2VsLm9wdGlvbnNbc2VsLm9wdGlvbnMubGVuZ3RoXSA9IG5ldyBPcHRpb24odHNyY1t4XS50aXRsZSwgdGlueU1DRVBvcHVwLmVkaXRvci5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZSh0c3JjW3hdLnNyYykpOw0KDQoJCXRoaXMucmVzaXplKCk7DQoJCXRoaXMudHNyYyA9IHRzcmM7DQoJfSwNCg0KCXJlc2l6ZSA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgdywgaCwgZTsNCg0KCQlpZiAoIXNlbGYuaW5uZXJXaWR0aCkgew0KCQkJdyA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggLSA1MDsNCgkJCWggPSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCAtIDE2MDsNCgkJfSBlbHNlIHsNCgkJCXcgPSBzZWxmLmlubmVyV2lkdGggLSA1MDsNCgkJCWggPSBzZWxmLmlubmVySGVpZ2h0IC0gMTcwOw0KCQl9DQoNCgkJZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZW1wbGF0ZXNyYycpOw0KDQoJCWlmIChlKSB7DQoJCQllLnN0eWxlLmhlaWdodCA9IE1hdGguYWJzKGgpICsgJ3B4JzsNCgkJCWUuc3R5bGUud2lkdGggID0gTWF0aC5hYnModyAtIDUpICsgJ3B4JzsNCgkJfQ0KCX0sDQoNCglsb2FkQ1NTRmlsZXMgOiBmdW5jdGlvbihkKSB7DQoJCXZhciBlZCA9IHRpbnlNQ0VQb3B1cC5lZGl0b3I7DQoNCgkJdGlueW1jZS5lYWNoKGVkLmdldFBhcmFtKCJjb250ZW50X2NzcyIsICcnKS5zcGxpdCgnLCcpLCBmdW5jdGlvbih1KSB7DQoJCQlkLndyaXRlKCc8bGluayBocmVmPSInICsgZWQuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUodSkgKyAnIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiAvPicpOw0KCQl9KTsNCgl9LA0KDQoJc2VsZWN0VGVtcGxhdGUgOiBmdW5jdGlvbih1LCB0aSkgew0KCQl2YXIgZCA9IHdpbmRvdy5mcmFtZXNbJ3RlbXBsYXRlc3JjJ10uZG9jdW1lbnQsIHgsIHRzcmMgPSB0aGlzLnRzcmM7DQoNCgkJaWYgKCF1KQ0KCQkJcmV0dXJuOw0KDQoJCWQuYm9keS5pbm5lckhUTUwgPSB0aGlzLnRlbXBsYXRlSFRNTCA9IHRoaXMuZ2V0RmlsZUNvbnRlbnRzKHUpOw0KDQoJCWZvciAoeD0wOyB4PHRzcmMubGVuZ3RoOyB4KyspIHsNCgkJCWlmICh0c3JjW3hdLnRpdGxlID09IHRpKQ0KCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0bXBsZGVzYycpLmlubmVySFRNTCA9IHRzcmNbeF0uZGVzY3JpcHRpb24gfHwgJyc7DQoJCX0NCgl9LA0KDQogCWluc2VydCA6IGZ1bmN0aW9uKCkgew0KCQl0aW55TUNFUG9wdXAuZXhlY0NvbW1hbmQoJ21jZUluc2VydFRlbXBsYXRlJywgZmFsc2UsIHsNCgkJCWNvbnRlbnQgOiB0aGlzLnRlbXBsYXRlSFRNTCwNCgkJCXNlbGVjdGlvbiA6IHRpbnlNQ0VQb3B1cC5lZGl0b3Iuc2VsZWN0aW9uLmdldENvbnRlbnQoKQ0KCQl9KTsNCg0KCQl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCgl9LA0KDQoJZ2V0RmlsZUNvbnRlbnRzIDogZnVuY3Rpb24odSkgew0KCQl2YXIgeCwgZCwgdCA9ICd0ZXh0L3BsYWluJzsNCg0KCQlmdW5jdGlvbiBnKHMpIHsNCgkJCXggPSAwOw0KDQoJCQl0cnkgew0KCQkJCXggPSBuZXcgQWN0aXZlWE9iamVjdChzKTsNCgkJCX0gY2F0Y2ggKHMpIHsNCgkJCX0NCg0KCQkJcmV0dXJuIHg7DQoJCX07DQoNCgkJeCA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ID8gZygnTXN4bWwyLlhNTEhUVFAnKSB8fCBnKCdNaWNyb3NvZnQuWE1MSFRUUCcpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQoNCgkJLy8gU3luY2hyb25vdXMgQUpBWCBsb2FkIGZpbGUNCgkJeC5vdmVycmlkZU1pbWVUeXBlICYmIHgub3ZlcnJpZGVNaW1lVHlwZSh0KTsNCgkJeC5vcGVuKCJHRVQiLCB1LCBmYWxzZSk7DQoJCXguc2VuZChudWxsKTsNCg0KCQlyZXR1cm4geC5yZXNwb25zZVRleHQ7DQoJfQ0KfTsNCg0KVGVtcGxhdGVEaWFsb2cucHJlSW5pdCgpOw0KdGlueU1DRVBvcHVwLm9uSW5pdC5hZGQoVGVtcGxhdGVEaWFsb2cuaW5pdCwgVGVtcGxhdGVEaWFsb2cpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/template/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/template/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi50ZW1wbGF0ZV9kbGcnLHsNCnRpdGxlOiJUZW1wbGF0ZXMiLA0KbGFiZWw6IlRlbXBsYXRlIiwNCmRlc2NfbGFiZWw6IkRlc2NyaXB0aW9uIiwNCmRlc2M6Ikluc2VydCBwcmVkZWZpbmVkIHRlbXBsYXRlIGNvbnRlbnQiLA0Kc2VsZWN0OiJTZWxlY3QgYSB0ZW1wbGF0ZSIsDQpwcmV2aWV3OiJQcmV2aWV3IiwNCndhcm5pbmc6Ildhcm5pbmc6IFVwZGF0aW5nIGEgdGVtcGxhdGUgd2l0aCBhIGRpZmZlcmVudCBvbmUgbWF5IGNhdXNlIGRhdGEgbG9zcy4iLA0KbWRhdGVfZm9ybWF0OiIlWS0lbS0lZCAlSDolTTolUyIsDQpjZGF0ZV9mb3JtYXQ6IiVZLSVtLSVkICVIOiVNOiVTIiwNCm1vbnRoc19sb25nOiJKYW51YXJ5LEZlYnJ1YXJ5LE1hcmNoLEFwcmlsLE1heSxKdW5lLEp1bHksQXVndXN0LFNlcHRlbWJlcixPY3RvYmVyLE5vdmVtYmVyLERlY2VtYmVyIiwNCm1vbnRoc19zaG9ydDoiSmFuLEZlYixNYXIsQXByLE1heSxKdW4sSnVsLEF1ZyxTZXAsT2N0LE5vdixEZWMiLA0KZGF5X2xvbmc6IlN1bmRheSxNb25kYXksVHVlc2RheSxXZWRuZXNkYXksVGh1cnNkYXksRnJpZGF5LFNhdHVyZGF5LFN1bmRheSIsDQpkYXlfc2hvcnQ6IlN1bixNb24sVHVlLFdlZCxUaHUsRnJpLFNhdCxTdW4iDQp9KTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/template/template.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KCTx0aXRsZT57I3RlbXBsYXRlX2RsZy50aXRsZX08L3RpdGxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdGlueV9tY2VfcG9wdXAuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvdGVtcGxhdGUuanMiPjwvc2NyaXB0PgoJPGxpbmsgaHJlZj0iY3NzL3RlbXBsYXRlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgLz4KPC9oZWFkPgo8Ym9keSBvbnJlc2l6ZT0iVGVtcGxhdGVEaWFsb2cucmVzaXplKCk7Ij4gCgk8Zm9ybSBvbnN1Ym1pdD0iVGVtcGxhdGVEaWFsb2cuaW5zZXJ0KCk7cmV0dXJuIGZhbHNlOyI+CgkJPGRpdiBpZD0iZnJtYm9keSI+CgkJCTxkaXYgY2xhc3M9InRpdGxlIj57I3RlbXBsYXRlX2RsZy5kZXNjfTwvZGl2PgoJCQk8ZGl2IGNsYXNzPSJmcm1Sb3ciPjxsYWJlbCBmb3I9InRwYXRoIiB0aXRsZT0ieyN0ZW1wbGF0ZV9kbGcuc2VsZWN0fSI+eyN0ZW1wbGF0ZV9kbGcubGFiZWx9OjwvbGFiZWw+CgkJCTxzZWxlY3QgaWQ9InRwYXRoIiBuYW1lPSJ0cGF0aCIgb25jaGFuZ2U9IlRlbXBsYXRlRGlhbG9nLnNlbGVjdFRlbXBsYXRlKHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlLCB0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS50ZXh0KTsiIGNsYXNzPSJtY2VGb2N1cyI+CgkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjdGVtcGxhdGVfZGxnLnNlbGVjdH0uLi48L29wdGlvbj4KCQkJPC9zZWxlY3Q+CgkJCTxzcGFuIGlkPSJ3YXJuaW5nIj48L3NwYW4+PC9kaXY+CgkJCTxkaXYgY2xhc3M9ImZybVJvdyI+PGxhYmVsIGZvcj0idGRlc2MiPnsjdGVtcGxhdGVfZGxnLmRlc2NfbGFiZWx9OjwvbGFiZWw+CgkJCTxzcGFuIGlkPSJ0bXBsZGVzYyI+PC9zcGFuPjwvZGl2PgoJCQk8ZmllbGRzZXQ+CgkJCQk8bGVnZW5kPnsjdGVtcGxhdGVfZGxnLnByZXZpZXd9PC9sZWdlbmQ+CgkJCQk8aWZyYW1lIGlkPSJ0ZW1wbGF0ZXNyYyIgbmFtZT0idGVtcGxhdGVzcmMiIHNyYz0iYmxhbmsuaHRtIiB3aWR0aD0iNjkwIiBoZWlnaHQ9IjQwMCIgZnJhbWVib3JkZXI9IjAiPjwvaWZyYW1lPgoJCQk8L2ZpZWxkc2V0PgoJCTwvZGl2PgoJCQoJCTxkaXYgY2xhc3M9Im1jZUFjdGlvblBhbmVsIj4KCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgaWQ9Imluc2VydCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0ieyNpbnNlcnR9IiAvPgoJCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iY2FuY2VsIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJ7I2NhbmNlbH0iIG9uY2xpY2s9InRpbnlNQ0VQb3B1cC5jbG9zZSgpOyIgLz4KCQk8L2Rpdj4KCTwvZm9ybT4KPC9ib2R5PiAKPC9odG1sPiAK]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/visualchars/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/visualchars/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5WaXN1YWxDaGFycyIse2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO2MuZWRpdG9yPWE7YS5hZGRDb21tYW5kKCJtY2VWaXN1YWxDaGFycyIsYy5fdG9nZ2xlVmlzdWFsQ2hhcnMsYyk7YS5hZGRCdXR0b24oInZpc3VhbGNoYXJzIix7dGl0bGU6InZpc3VhbGNoYXJzLmRlc2MiLGNtZDoibWNlVmlzdWFsQ2hhcnMifSk7YS5vbkJlZm9yZUdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKGQsZSl7aWYoYy5zdGF0ZSYmZS5mb3JtYXQhPSJyYXciJiYhZS5kcmFmdCl7Yy5zdGF0ZT10cnVlO2MuX3RvZ2dsZVZpc3VhbENoYXJzKGZhbHNlKX19KX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiVmlzdWFsIGNoYXJhY3RlcnMiLGF1dGhvcjoiTW94aWVjb2RlIFN5c3RlbXMgQUIiLGF1dGhvcnVybDoiaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbSIsaW5mb3VybDoiaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL3Zpc3VhbGNoYXJzIix2ZXJzaW9uOnRpbnltY2UubWFqb3JWZXJzaW9uKyIuIit0aW55bWNlLm1pbm9yVmVyc2lvbn19LF90b2dnbGVWaXN1YWxDaGFyczpmdW5jdGlvbihtKXt2YXIgcD10aGlzLGs9cC5lZGl0b3IsYSxnLGosbj1rLmdldERvYygpLG89ay5nZXRCb2R5KCksbCxxPWsuc2VsZWN0aW9uLGUsYyxmO3Auc3RhdGU9IXAuc3RhdGU7ay5jb250cm9sTWFuYWdlci5zZXRBY3RpdmUoInZpc3VhbGNoYXJzIixwLnN0YXRlKTtpZihtKXtmPXEuZ2V0Qm9va21hcmsoKX1pZihwLnN0YXRlKXthPVtdO3RpbnltY2Uud2FsayhvLGZ1bmN0aW9uKGIpe2lmKGIubm9kZVR5cGU9PTMmJmIubm9kZVZhbHVlJiZiLm5vZGVWYWx1ZS5pbmRleE9mKCJcdTAwYTAiKSE9LTEpe2EucHVzaChiKX19LCJjaGlsZE5vZGVzIik7Zm9yKGc9MDtnPGEubGVuZ3RoO2crKyl7bD1hW2ddLm5vZGVWYWx1ZTtsPWwucmVwbGFjZSgvKFx1MDBhMCkvZywnPHNwYW4gX21jZV9ib2d1cz0iMSIgY2xhc3M9Im1jZUl0ZW1IaWRkZW4gbWNlSXRlbU5ic3AiPiQxPC9zcGFuPicpO2M9ay5kb20uY3JlYXRlKCJkaXYiLG51bGwsbCk7d2hpbGUobm9kZT1jLmxhc3RDaGlsZCl7ay5kb20uaW5zZXJ0QWZ0ZXIobm9kZSxhW2ddKX1rLmRvbS5yZW1vdmUoYVtnXSl9fWVsc2V7YT1rLmRvbS5zZWxlY3QoInNwYW4ubWNlSXRlbU5ic3AiLG8pO2ZvcihnPWEubGVuZ3RoLTE7Zz49MDtnLS0pe2suZG9tLnJlbW92ZShhW2ddLDEpfX1xLm1vdmVUb0Jvb2ttYXJrKGYpfX0pO3RpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoInZpc3VhbGNoYXJzIix0aW55bWNlLnBsdWdpbnMuVmlzdWFsQ2hhcnMpfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/visualchars/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLlZpc3VhbENoYXJzJywgew0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmVkaXRvciA9IGVkOw0KDQoJCQkvLyBSZWdpc3RlciBjb21tYW5kcw0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlVmlzdWFsQ2hhcnMnLCB0Ll90b2dnbGVWaXN1YWxDaGFycywgdCk7DQoNCgkJCS8vIFJlZ2lzdGVyIGJ1dHRvbnMNCgkJCWVkLmFkZEJ1dHRvbigndmlzdWFsY2hhcnMnLCB7dGl0bGUgOiAndmlzdWFsY2hhcnMuZGVzYycsIGNtZCA6ICdtY2VWaXN1YWxDaGFycyd9KTsNCg0KCQkJZWQub25CZWZvcmVHZXRDb250ZW50LmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCWlmICh0LnN0YXRlICYmIG8uZm9ybWF0ICE9ICdyYXcnICYmICFvLmRyYWZ0KSB7DQoJCQkJCXQuc3RhdGUgPSB0cnVlOw0KCQkJCQl0Ll90b2dnbGVWaXN1YWxDaGFycyhmYWxzZSk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdWaXN1YWwgY2hhcmFjdGVycycsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbScsDQoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvdmlzdWFsY2hhcnMnLA0KCQkJCXZlcnNpb24gOiB0aW55bWNlLm1ham9yVmVyc2lvbiArICIuIiArIHRpbnltY2UubWlub3JWZXJzaW9uDQoJCQl9Ow0KCQl9LA0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KDQoJCV90b2dnbGVWaXN1YWxDaGFycyA6IGZ1bmN0aW9uKGJvb2ttYXJrKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIG5sLCBpLCBoLCBkID0gZWQuZ2V0RG9jKCksIGIgPSBlZC5nZXRCb2R5KCksIG52LCBzID0gZWQuc2VsZWN0aW9uLCBibywgZGl2LCBibTsNCg0KCQkJdC5zdGF0ZSA9ICF0LnN0YXRlOw0KCQkJZWQuY29udHJvbE1hbmFnZXIuc2V0QWN0aXZlKCd2aXN1YWxjaGFycycsIHQuc3RhdGUpOw0KDQoJCQlpZiAoYm9va21hcmspDQoJCQkJYm0gPSBzLmdldEJvb2ttYXJrKCk7DQoNCgkJCWlmICh0LnN0YXRlKSB7DQoJCQkJbmwgPSBbXTsNCgkJCQl0aW55bWNlLndhbGsoYiwgZnVuY3Rpb24obikgew0KCQkJCQlpZiAobi5ub2RlVHlwZSA9PSAzICYmIG4ubm9kZVZhbHVlICYmIG4ubm9kZVZhbHVlLmluZGV4T2YoJ1x1MDBhMCcpICE9IC0xKQ0KCQkJCQkJbmwucHVzaChuKTsNCgkJCQl9LCAnY2hpbGROb2RlcycpOw0KDQoJCQkJZm9yIChpID0gMDsgaSA8IG5sLmxlbmd0aDsgaSsrKSB7DQoJCQkJCW52ID0gbmxbaV0ubm9kZVZhbHVlOw0KCQkJCQludiA9IG52LnJlcGxhY2UoLyhcdTAwYTApL2csICc8c3BhbiBfbWNlX2JvZ3VzPSIxIiBjbGFzcz0ibWNlSXRlbUhpZGRlbiBtY2VJdGVtTmJzcCI+JDE8L3NwYW4+Jyk7DQoNCgkJCQkJZGl2ID0gZWQuZG9tLmNyZWF0ZSgnZGl2JywgbnVsbCwgbnYpOw0KCQkJCQl3aGlsZSAobm9kZSA9IGRpdi5sYXN0Q2hpbGQpDQoJCQkJCQllZC5kb20uaW5zZXJ0QWZ0ZXIobm9kZSwgbmxbaV0pOw0KDQoJCQkJCWVkLmRvbS5yZW1vdmUobmxbaV0pOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJbmwgPSBlZC5kb20uc2VsZWN0KCdzcGFuLm1jZUl0ZW1OYnNwJywgYik7DQoNCgkJCQlmb3IgKGkgPSBubC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkNCgkJCQkJZWQuZG9tLnJlbW92ZShubFtpXSwgMSk7DQoJCQl9DQoNCgkJCXMubW92ZVRvQm9va21hcmsoYm0pOw0KCQl9DQoJfSk7DQoNCgkvLyBSZWdpc3RlciBwbHVnaW4NCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIuYWRkKCd2aXN1YWxjaGFycycsIHRpbnltY2UucGx1Z2lucy5WaXN1YWxDaGFycyk7DQp9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/wordcount/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/wordcount/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5Xb3JkQ291bnQiLHtibG9jazowLGlkOm51bGwsY291bnRyZTpudWxsLGNsZWFucmU6bnVsbCxpbml0OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPTA7Yy5jb3VudHJlPWEuZ2V0UGFyYW0oIndvcmRjb3VudF9jb3VudHJlZ2V4IiwvXFNccysvZyk7Yy5jbGVhbnJlPWEuZ2V0UGFyYW0oIndvcmRjb3VudF9jbGVhbnJlZ2V4IiwvWzAtOS4oKSw7OiE/JSMkvyciXys9XFxcLy1dKi9nKTtjLmlkPWEuaWQrIi13b3JkLWNvdW50IjthLm9uUG9zdFJlbmRlci5hZGQoZnVuY3Rpb24oZixlKXt2YXIgZyxoO2g9Zi5nZXRQYXJhbSgid29yZGNvdW50X3RhcmdldF9pZCIpO2lmKCFoKXtnPXRpbnltY2UuRE9NLmdldChmLmlkKyJfcGF0aF9yb3ciKTtpZihnKXt0aW55bWNlLkRPTS5hZGQoZy5wYXJlbnROb2RlLCJkaXYiLHtzdHlsZToiZmxvYXQ6IHJpZ2h0In0sZi5nZXRMYW5nKCJ3b3JkY291bnQud29yZHMiLCJXb3JkczogIikrJzxzcGFuIGlkPSInK2MuaWQrJyI+MDwvc3Bhbj4nKX19ZWxzZXt0aW55bWNlLkRPTS5hZGQoaCwic3BhbiIse30sJzxzcGFuIGlkPSInK2MuaWQrJyI+MDwvc3Bhbj4nKX19KTthLm9uSW5pdC5hZGQoZnVuY3Rpb24oZSl7ZS5zZWxlY3Rpb24ub25TZXRDb250ZW50LmFkZChmdW5jdGlvbigpe2MuX2NvdW50KGUpfSk7Yy5fY291bnQoZSl9KTthLm9uU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oZSl7Yy5fY291bnQoZSl9KTthLm9uS2V5VXAuYWRkKGZ1bmN0aW9uKGYsZyl7aWYoZy5rZXlDb2RlPT1kKXtyZXR1cm59aWYoMTM9PWcua2V5Q29kZXx8OD09ZHx8NDY9PWQpe2MuX2NvdW50KGYpfWQ9Zy5rZXlDb2RlfSl9LF9jb3VudDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGE9MDtpZihjLmJsb2NrKXtyZXR1cm59Yy5ibG9jaz0xO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZD1iLmdldENvbnRlbnQoe2Zvcm1hdDoicmF3In0pO2lmKGQpe2Q9ZC5yZXBsYWNlKC88LltePD5dKj8+L2csIiAiKS5yZXBsYWNlKC8mbmJzcDt8JiMxNjA7L2dpLCIgIik7ZD1kLnJlcGxhY2UoYy5jbGVhbnJlLCIiKTtkLnJlcGxhY2UoYy5jb3VudHJlLGZ1bmN0aW9uKCl7YSsrfSl9dGlueW1jZS5ET00uc2V0SFRNTChjLmlkLGEudG9TdHJpbmcoKSk7c2V0VGltZW91dChmdW5jdGlvbigpe2MuYmxvY2s9MH0sMjAwMCl9LDEpfSxnZXRJbmZvOmZ1bmN0aW9uKCl7cmV0dXJue2xvbmduYW1lOiJXb3JkIENvdW50IHBsdWdpbiIsYXV0aG9yOiJNb3hpZWNvZGUgU3lzdGVtcyBBQiIsYXV0aG9ydXJsOiJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tIixpbmZvdXJsOiJodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMvd29yZGNvdW50Iix2ZXJzaW9uOnRpbnltY2UubWFqb3JWZXJzaW9uKyIuIit0aW55bWNlLm1pbm9yVmVyc2lvbn19fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgid29yZGNvdW50Iix0aW55bWNlLnBsdWdpbnMuV29yZENvdW50KX0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/wordcount/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCiAgICB0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLldvcmRDb3VudCcsIHsNCgkJYmxvY2sgOiAwLA0KCQlpZCA6IG51bGwsDQoJCWNvdW50cmUgOiBudWxsLA0KCQljbGVhbnJlIDogbnVsbCwNCg0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJdmFyIHQgPSB0aGlzLCBsYXN0ID0gMDsNCg0KCQkJdC5jb3VudHJlID0gZWQuZ2V0UGFyYW0oJ3dvcmRjb3VudF9jb3VudHJlZ2V4JywgL1xTXHMrL2cpOw0KCQkJdC5jbGVhbnJlID0gZWQuZ2V0UGFyYW0oJ3dvcmRjb3VudF9jbGVhbnJlZ2V4JywgL1swLTkuKCksOzohPyUjJL8nIl8rPVxcXC8tXSovZyk7DQoJCQl0LmlkID0gZWQuaWQgKyAnLXdvcmQtY291bnQnOw0KDQoJCQllZC5vblBvc3RSZW5kZXIuYWRkKGZ1bmN0aW9uKGVkLCBjbSkgew0KCQkJCXZhciByb3csIGlkOw0KDQoJCQkJLy8gQWRkIGl0IHRvIHRoZSBzcGVjaWZpZWQgaWQgb3IgdGhlIHRoZW1lIGFkdmFuY2VkIHBhdGgNCgkJCQlpZCA9IGVkLmdldFBhcmFtKCd3b3JkY291bnRfdGFyZ2V0X2lkJyk7DQoJCQkJaWYgKCFpZCkgew0KCQkJCQlyb3cgPSB0aW55bWNlLkRPTS5nZXQoZWQuaWQgKyAnX3BhdGhfcm93Jyk7DQoNCgkJCQkJaWYgKHJvdykNCgkJCQkJCXRpbnltY2UuRE9NLmFkZChyb3cucGFyZW50Tm9kZSwgJ2RpdicsIHsnc3R5bGUnOiAnZmxvYXQ6IHJpZ2h0J30sIGVkLmdldExhbmcoJ3dvcmRjb3VudC53b3JkcycsICdXb3JkczogJykgKyAnPHNwYW4gaWQ9IicgKyB0LmlkICsgJyI+MDwvc3Bhbj4nKTsNCgkJCQl9IGVsc2UNCgkJCQkJdGlueW1jZS5ET00uYWRkKGlkLCAnc3BhbicsIHt9LCAnPHNwYW4gaWQ9IicgKyB0LmlkICsgJyI+MDwvc3Bhbj4nKTsNCgkJCX0pOw0KDQogICAgICAgICAgICBlZC5vbkluaXQuYWRkKGZ1bmN0aW9uKGVkKSB7DQoJCQkJZWQuc2VsZWN0aW9uLm9uU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCXQuX2NvdW50KGVkKTsNCgkJCQl9KTsNCg0KCQkJCXQuX2NvdW50KGVkKTsNCgkJCX0pOw0KDQoJCQllZC5vblNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKGVkKSB7DQoJCQkJdC5fY291bnQoZWQpOw0KCQkJfSk7DQoNCgkJCWVkLm9uS2V5VXAuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJaWYgKGUua2V5Q29kZSA9PSBsYXN0KQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlpZiAoMTMgPT0gZS5rZXlDb2RlIHx8IDggPT0gbGFzdCB8fCA0NiA9PSBsYXN0KQ0KCQkJCQl0Ll9jb3VudChlZCk7DQoNCgkJCQlsYXN0ID0gZS5rZXlDb2RlOw0KCQkJfSk7DQoJCX0sDQoNCgkJX2NvdW50IDogZnVuY3Rpb24oZWQpIHsNCgkJCXZhciB0ID0gdGhpcywgdGMgPSAwOw0KDQoJCQkvLyBLZWVwIG11bHRpcGxlIGNhbGxzIGZyb20gaGFwcGVuaW5nIGF0IHRoZSBzYW1lIHRpbWUNCgkJCWlmICh0LmJsb2NrKQ0KCQkJCXJldHVybjsNCg0KCQkJdC5ibG9jayA9IDE7DQoNCgkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoJCQkJdmFyIHR4ID0gZWQuZ2V0Q29udGVudCh7Zm9ybWF0IDogJ3Jhdyd9KTsNCg0KCQkJCWlmICh0eCkgew0KCQkJCQl0eCA9IHR4LnJlcGxhY2UoLzwuW148Pl0qPz4vZywgJyAnKS5yZXBsYWNlKC8mbmJzcDt8JiMxNjA7L2dpLCAnICcpOyAvLyByZW1vdmUgaHRtbCB0YWdzIGFuZCBzcGFjZSBjaGFycw0KCQkJCQl0eCA9IHR4LnJlcGxhY2UodC5jbGVhbnJlLCAnJyk7IC8vIHJlbW92ZSBudW1iZXJzIGFuZCBwdW5jdHVhdGlvbg0KCQkJCQl0eC5yZXBsYWNlKHQuY291bnRyZSwgZnVuY3Rpb24oKSB7dGMrKzt9KTsgLy8gY291bnQgdGhlIHdvcmRzDQoJCQkJfQ0KDQoJCQkJdGlueW1jZS5ET00uc2V0SFRNTCh0LmlkLCB0Yy50b1N0cmluZygpKTsNCg0KCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7dC5ibG9jayA9IDA7fSwgMjAwMCk7DQoJCQl9LCAxKTsNCgkJfSwNCg0KICAgICAgICBnZXRJbmZvOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB7DQoJCQkJbG9uZ25hbWUgOiAnV29yZCBDb3VudCBwbHVnaW4nLA0KCQkJCWF1dGhvciA6ICdNb3hpZWNvZGUgU3lzdGVtcyBBQicsDQoJCQkJYXV0aG9ydXJsIDogJ2h0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20nLA0KCQkJCWluZm91cmwgOiAnaHR0cDovL3dpa2kubW94aWVjb2RlLmNvbS9pbmRleC5waHAvVGlueU1DRTpQbHVnaW5zL3dvcmRjb3VudCcsDQoJCQkJdmVyc2lvbiA6IHRpbnltY2UubWFqb3JWZXJzaW9uICsgIi4iICsgdGlueW1jZS5taW5vclZlcnNpb24NCgkJCX07DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoJ3dvcmRjb3VudCcsIHRpbnltY2UucGx1Z2lucy5Xb3JkQ291bnQpOw0KfSkoKTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/abbr.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjeGh0bWx4dHJhc19kbGcudGl0bGVfYWJicl9lbGVtZW50fTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9tY3RhYnMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZm9ybV91dGlscy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9lZGl0YWJsZV9zZWxlY3RzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2VsZW1lbnRfY29tbW9uLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2FiYnIuanMiPjwvc2NyaXB0PgoJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL3BvcHVwLmNzcyIgLz4KPC9oZWFkPgo8Ym9keSBzdHlsZT0iZGlzcGxheTogbm9uZSI+Cjxmb3JtIG9uc3VibWl0PSJpbnNlcnRBYmJyKCk7cmV0dXJuIGZhbHNlOyIgYWN0aW9uPSIjIj4KCTxkaXYgY2xhc3M9InRhYnMiPgoJCTx1bD4KCQkJPGxpIGlkPSJnZW5lcmFsX3RhYiIgY2xhc3M9ImN1cnJlbnQiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2dlbmVyYWxfdGFiJywnZ2VuZXJhbF9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjeGh0bWx4dHJhc19kbGcuZ2VuZXJhbF90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCQk8IS0tIDxsaSBpZD0iZXZlbnRzX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignZXZlbnRzX3RhYicsJ2V2ZW50c19wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjeGh0bWx4dHJhc19kbGcuZXZlbnRzX3RhYn08L2E+PC9zcGFuPjwvbGk+IC0tPgoJCTwvdWw+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJwYW5lbF93cmFwcGVyIj4KCQk8ZGl2IGlkPSJnZW5lcmFsX3BhbmVsIiBjbGFzcz0icGFuZWwgY3VycmVudCI+CgkJCTxmaWVsZHNldD4KCQkJCTxsZWdlbmQ+eyN4aHRtbHh0cmFzX2RsZy5maWVsZHNldF9hdHRyaWJfdGFifTwvbGVnZW5kPgoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSI0Ij4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBpZD0idGl0bGVsYWJlbCIgZm9yPSJ0aXRsZSI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfbGFiZWxfdGl0bGV9PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9InRpdGxlIiBuYW1lPSJ0aXRsZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIG1jZUZvY3VzIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9ImlkbGFiZWwiIGZvcj0iaWQiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX2lkfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJpZCIgbmFtZT0iaWQiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJjbGFzc2xhYmVsIiBmb3I9ImNsYXNzIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9jbGFzc308L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPgoJCQkJCQkJPHNlbGVjdCBpZD0iY2xhc3MiIG5hbWU9ImNsYXNzIiBjbGFzcz0iZmllbGQgbWNlRWRpdGFibGVTZWxlY3QiPgoJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPiAKCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQk8L3RkPgoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9InN0eWxlbGFiZWwiIGZvcj0iY2xhc3MiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX3N0eWxlfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJzdHlsZSIgbmFtZT0ic3R5bGUiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJkaXJsYWJlbCIgZm9yPSJkaXIiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX2xhbmdkaXJ9PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD4KCQkJCQkJCTxzZWxlY3QgaWQ9ImRpciIgbmFtZT0iZGlyIiBjbGFzcz0iZmllbGQiPiAKCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibHRyIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9vcHRpb25fbHRyfTwvb3B0aW9uPiAKCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJydGwiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX29wdGlvbl9ydGx9PC9vcHRpb24+IAoJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCTwvdGQ+IAoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9ImxhbmdsYWJlbCIgZm9yPSJsYW5nIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9sYW5nY29kZX08L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPgoJCQkJCQkJPGlucHV0IGlkPSJsYW5nIiBuYW1lPSJsYW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+CgkJCQkJCTwvdGQ+IAoJCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L2ZpZWxkc2V0PgoJCTwvZGl2PgoJCTxkaXYgaWQ9ImV2ZW50c19wYW5lbCIgY2xhc3M9InBhbmVsIj4KCQkJPGZpZWxkc2V0PgoJCQkJPGxlZ2VuZD57I3hodG1seHRyYXNfZGxnLmZpZWxkc2V0X2V2ZW50c190YWJ9PC9sZWdlbmQ+CgoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSI0Ij4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9uZm9jdXMiPm9uZm9jdXM8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25mb2N1cyIgbmFtZT0ib25mb2N1cyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25ibHVyIj5vbmJsdXI8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25ibHVyIiBuYW1lPSJvbmJsdXIiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9uY2xpY2siPm9uY2xpY2s8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25jbGljayIgbmFtZT0ib25jbGljayIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25kYmxjbGljayI+b25kYmxjbGljazwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmRibGNsaWNrIiBuYW1lPSJvbmRibGNsaWNrIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbm1vdXNlZG93biI+b25tb3VzZWRvd248L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25tb3VzZWRvd24iIG5hbWU9Im9ubW91c2Vkb3duIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbm1vdXNldXAiPm9ubW91c2V1cDwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNldXAiIG5hbWU9Im9ubW91c2V1cCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZW92ZXIiPm9ubW91c2VvdmVyPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2VvdmVyIiBuYW1lPSJvbm1vdXNlb3ZlciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZW1vdmUiPm9ubW91c2Vtb3ZlPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2Vtb3ZlIiBuYW1lPSJvbm1vdXNlbW92ZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZW91dCI+b25tb3VzZW91dDwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNlb3V0IiBuYW1lPSJvbm1vdXNlb3V0IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmtleXByZXNzIj5vbmtleXByZXNzPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5cHJlc3MiIG5hbWU9Im9ua2V5cHJlc3MiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ua2V5ZG93biI+b25rZXlkb3duPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5ZG93biIgbmFtZT0ib25rZXlkb3duIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmtleXVwIj5vbmtleXVwPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5dXAiIG5hbWU9Im9ua2V5dXAiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJPC90YWJsZT4KCQkJPC9maWVsZHNldD4KCQk8L2Rpdj4KCTwvZGl2PgoJPGRpdiBjbGFzcz0ibWNlQWN0aW9uUGFuZWwiPgoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJpbnNlcnQiIG5hbWU9Imluc2VydCIgdmFsdWU9InsjdXBkYXRlfSIgLz4KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0icmVtb3ZlIiBuYW1lPSJyZW1vdmUiIGNsYXNzPSJidXR0b24iIHZhbHVlPSJ7I3hodG1seHRyYXNfZGxnLnJlbW92ZX0iIG9uY2xpY2s9InJlbW92ZUFiYnIoKTsiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgLz4KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iY2FuY2VsIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJ7I2NhbmNlbH0iIG9uY2xpY2s9InRpbnlNQ0VQb3B1cC5jbG9zZSgpOyIgLz4KCTwvZGl2Pgo8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/acronym.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjeGh0bWx4dHJhc19kbGcudGl0bGVfYWNyb255bV9lbGVtZW50fTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9tY3RhYnMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZm9ybV91dGlscy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9lZGl0YWJsZV9zZWxlY3RzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2VsZW1lbnRfY29tbW9uLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2Fjcm9ueW0uanMiPjwvc2NyaXB0PgoJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL3BvcHVwLmNzcyIgLz4KPC9oZWFkPgo8Ym9keSBzdHlsZT0iZGlzcGxheTogbm9uZSI+Cjxmb3JtIG9uc3VibWl0PSJpbnNlcnRBY3JvbnltKCk7cmV0dXJuIGZhbHNlOyIgYWN0aW9uPSIjIj4KCTxkaXYgY2xhc3M9InRhYnMiPgoJCTx1bD4KCQkJPGxpIGlkPSJnZW5lcmFsX3RhYiIgY2xhc3M9ImN1cnJlbnQiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2dlbmVyYWxfdGFiJywnZ2VuZXJhbF9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjeGh0bWx4dHJhc19kbGcuZ2VuZXJhbF90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCQk8IS0tIDxsaSBpZD0iZXZlbnRzX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignZXZlbnRzX3RhYicsJ2V2ZW50c19wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjeGh0bWx4dHJhc19kbGcuZXZlbnRzX3RhYn08L2E+PC9zcGFuPjwvbGk+IC0tPgoJCTwvdWw+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJwYW5lbF93cmFwcGVyIj4KCQk8ZGl2IGlkPSJnZW5lcmFsX3BhbmVsIiBjbGFzcz0icGFuZWwgY3VycmVudCI+CgkJCTxmaWVsZHNldD4KCQkJCTxsZWdlbmQ+eyN4aHRtbHh0cmFzX2RsZy5maWVsZHNldF9hdHRyaWJfdGFifTwvbGVnZW5kPgoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSI0Ij4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBpZD0idGl0bGVsYWJlbCIgZm9yPSJ0aXRsZSI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfbGFiZWxfdGl0bGV9PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9InRpdGxlIiBuYW1lPSJ0aXRsZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIG1jZUZvY3VzIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9ImlkbGFiZWwiIGZvcj0iaWQiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX2lkfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJpZCIgbmFtZT0iaWQiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJjbGFzc2xhYmVsIiBmb3I9ImNsYXNzIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9jbGFzc308L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPgoJCQkJCQkJPHNlbGVjdCBpZD0iY2xhc3MiIG5hbWU9ImNsYXNzIiBjbGFzcz0iZmllbGQgbWNlRWRpdGFibGVTZWxlY3QiPgoJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPiAKCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQk8L3RkPgoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9InN0eWxlbGFiZWwiIGZvcj0iY2xhc3MiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX3N0eWxlfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJzdHlsZSIgbmFtZT0ic3R5bGUiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJkaXJsYWJlbCIgZm9yPSJkaXIiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX2xhbmdkaXJ9PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD4KCQkJCQkJCTxzZWxlY3QgaWQ9ImRpciIgbmFtZT0iZGlyIiBjbGFzcz0iZmllbGQiPiAKCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibHRyIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9vcHRpb25fbHRyfTwvb3B0aW9uPiAKCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJydGwiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX29wdGlvbl9ydGx9PC9vcHRpb24+IAoJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCTwvdGQ+IAoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9ImxhbmdsYWJlbCIgZm9yPSJsYW5nIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9sYW5nY29kZX08L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPgoJCQkJCQkJPGlucHV0IGlkPSJsYW5nIiBuYW1lPSJsYW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+CgkJCQkJCTwvdGQ+IAoJCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L2ZpZWxkc2V0PgoJCTwvZGl2PgoJCTxkaXYgaWQ9ImV2ZW50c19wYW5lbCIgY2xhc3M9InBhbmVsIj4KCQkJPGZpZWxkc2V0PgoJCQkJPGxlZ2VuZD57I3hodG1seHRyYXNfZGxnLmZpZWxkc2V0X2V2ZW50c190YWJ9PC9sZWdlbmQ+CgoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSI0Ij4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9uZm9jdXMiPm9uZm9jdXM8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25mb2N1cyIgbmFtZT0ib25mb2N1cyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25ibHVyIj5vbmJsdXI8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25ibHVyIiBuYW1lPSJvbmJsdXIiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9uY2xpY2siPm9uY2xpY2s8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25jbGljayIgbmFtZT0ib25jbGljayIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25kYmxjbGljayI+b25kYmxjbGljazwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmRibGNsaWNrIiBuYW1lPSJvbmRibGNsaWNrIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbm1vdXNlZG93biI+b25tb3VzZWRvd248L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25tb3VzZWRvd24iIG5hbWU9Im9ubW91c2Vkb3duIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbm1vdXNldXAiPm9ubW91c2V1cDwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNldXAiIG5hbWU9Im9ubW91c2V1cCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZW92ZXIiPm9ubW91c2VvdmVyPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2VvdmVyIiBuYW1lPSJvbm1vdXNlb3ZlciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZW1vdmUiPm9ubW91c2Vtb3ZlPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2Vtb3ZlIiBuYW1lPSJvbm1vdXNlbW92ZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZW91dCI+b25tb3VzZW91dDwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNlb3V0IiBuYW1lPSJvbm1vdXNlb3V0IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmtleXByZXNzIj5vbmtleXByZXNzPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5cHJlc3MiIG5hbWU9Im9ua2V5cHJlc3MiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ua2V5ZG93biI+b25rZXlkb3duPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5ZG93biIgbmFtZT0ib25rZXlkb3duIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmtleXVwIj5vbmtleXVwPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5dXAiIG5hbWU9Im9ua2V5dXAiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJPC90YWJsZT4KCQkJPC9maWVsZHNldD4KCQk8L2Rpdj4KCTwvZGl2PgoJPGRpdiBjbGFzcz0ibWNlQWN0aW9uUGFuZWwiPgoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJpbnNlcnQiIG5hbWU9Imluc2VydCIgdmFsdWU9InsjdXBkYXRlfSIgLz4KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0icmVtb3ZlIiBuYW1lPSJyZW1vdmUiIGNsYXNzPSJidXR0b24iIHZhbHVlPSJ7I3hodG1seHRyYXNfZGxnLnJlbW92ZX0iIG9uY2xpY2s9InJlbW92ZUFjcm9ueW0oKTsiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgLz4KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iY2FuY2VsIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJ7I2NhbmNlbH0iIG9uY2xpY2s9InRpbnlNQ0VQb3B1cC5jbG9zZSgpOyIgLz4KCTwvZGl2Pgo8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/attributes.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlic190aXRsZX08L3RpdGxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdGlueV9tY2VfcG9wdXAuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvbWN0YWJzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL2VkaXRhYmxlX3NlbGVjdHMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZm9ybV91dGlscy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9hdHRyaWJ1dGVzLmpzIj48L3NjcmlwdD4KCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9hdHRyaWJ1dGVzLmNzcyIgLz4KPC9oZWFkPgo8Ym9keSBzdHlsZT0iZGlzcGxheTogbm9uZSI+Cjxmb3JtIG9uc3VibWl0PSJpbnNlcnRBY3Rpb24oKTtyZXR1cm4gZmFsc2U7IiBhY3Rpb249IiMiPgoJPGRpdiBjbGFzcz0idGFicyI+CgkJPHVsPgoJCQk8bGkgaWQ9ImdlbmVyYWxfdGFiIiBjbGFzcz0iY3VycmVudCI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignZ2VuZXJhbF90YWInLCdnZW5lcmFsX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfYXR0cmliX3RhYn08L2E+PC9zcGFuPjwvbGk+CgkJCTxsaSBpZD0iZXZlbnRzX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignZXZlbnRzX3RhYicsJ2V2ZW50c19wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2V2ZW50c190YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCTwvdWw+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJwYW5lbF93cmFwcGVyIj4KCQk8ZGl2IGlkPSJnZW5lcmFsX3BhbmVsIiBjbGFzcz0icGFuZWwgY3VycmVudCI+CgkJCTxmaWVsZHNldD4KCQkJCTxsZWdlbmQ+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfYXR0cmliX3RhYn08L2xlZ2VuZD4KCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iNCI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9InRpdGxlbGFiZWwiIGZvcj0idGl0bGUiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX3RpdGxlfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJ0aXRsZSIgbmFtZT0idGl0bGUiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJtY2VGb2N1cyIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJpZGxhYmVsIiBmb3I9ImlkIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9pZH08L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0iaWQiIG5hbWU9ImlkIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQ+PGxhYmVsIGlkPSJjbGFzc2xhYmVsIiBmb3I9ImNsYXNzbGlzdCI+eyNjbGFzc19uYW1lfTwvbGFiZWw+PC90ZD4KCQkJCQkJPHRkPgoJCQkJCQkJPHNlbGVjdCBpZD0iY2xhc3NsaXN0IiBuYW1lPSJjbGFzc2xpc3QiIGNsYXNzPSJtY2VFZGl0YWJsZVNlbGVjdCI+CgkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIiBzZWxlY3RlZD0ic2VsZWN0ZWQiPnsjbm90X3NldH08L29wdGlvbj4KCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQk8L3RkPgoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9InN0eWxlbGFiZWwiIGZvcj0ic3R5bGUiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX3N0eWxlfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJzdHlsZSIgbmFtZT0ic3R5bGUiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4gCgkJCQkJPC90cj4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBpZD0iZGlybGFiZWwiIGZvcj0iZGlyIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9sYW5nZGlyfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+CgkJCQkJCQk8c2VsZWN0IGlkPSJkaXIiIG5hbWU9ImRpciI+IAoJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPiAKCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJsdHIiPnsjeGh0bWx4dHJhc19kbGcub3B0aW9uX2x0cn08L29wdGlvbj4gCgkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icnRsIj57I3hodG1seHRyYXNfZGxnLm9wdGlvbl9ydGx9PC9vcHRpb24+IAoJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCTwvdGQ+IAoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9ImxhbmdsYWJlbCIgZm9yPSJsYW5nIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9sYW5nY29kZX08L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPgoJCQkJCQkJPGlucHV0IGlkPSJsYW5nIiBuYW1lPSJsYW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPgoJCQkJCQk8L3RkPiAKCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJCTx0ZD48bGFiZWwgaWQ9InRhYmluZGV4bGFiZWwiIGZvcj0idGFiaW5kZXgiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX3RhYmluZGV4fTwvbGFiZWw+PC90ZD4KCQkJCQkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InRhYmluZGV4IiBuYW1lPSJ0YWJpbmRleCIgdmFsdWU9IiIgLz48L3RkPgoJCQkJCQk8L3RyPgoKCQkJCQkJPHRyPgoJCQkJCQkJPHRkPjxsYWJlbCBpZD0iYWNjZXNza2V5bGFiZWwiIGZvcj0iYWNjZXNza2V5Ij57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9hY2Nlc3NrZXl9PC9sYWJlbD48L3RkPgoJCQkJCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYWNjZXNza2V5IiBuYW1lPSJhY2Nlc3NrZXkiIHZhbHVlPSIiIC8+PC90ZD4KCQkJCQkJPC90cj4KCQkJCTwvdGFibGU+CgkJCTwvZmllbGRzZXQ+CgkJPC9kaXY+CgkJPGRpdiBpZD0iZXZlbnRzX3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJCQk8ZmllbGRzZXQ+CgkJCQk8bGVnZW5kPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2V2ZW50c190YWJ9PC9sZWdlbmQ+CgoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSI0Ij4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9uZm9jdXMiPm9uZm9jdXM8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25mb2N1cyIgbmFtZT0ib25mb2N1cyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9uYmx1ciI+b25ibHVyPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9uYmx1ciIgbmFtZT0ib25ibHVyIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25jbGljayI+b25jbGljazwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmNsaWNrIiBuYW1lPSJvbmNsaWNrIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25kYmxjbGljayI+b25kYmxjbGljazwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmRibGNsaWNrIiBuYW1lPSJvbmRibGNsaWNrIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZWRvd24iPm9ubW91c2Vkb3duPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2Vkb3duIiBuYW1lPSJvbm1vdXNlZG93biIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ubW91c2V1cCI+b25tb3VzZXVwPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2V1cCIgbmFtZT0ib25tb3VzZXVwIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZW92ZXIiPm9ubW91c2VvdmVyPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2VvdmVyIiBuYW1lPSJvbm1vdXNlb3ZlciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ubW91c2Vtb3ZlIj5vbm1vdXNlbW92ZTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNlbW92ZSIgbmFtZT0ib25tb3VzZW1vdmUiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbm1vdXNlb3V0Ij5vbm1vdXNlb3V0PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2VvdXQiIG5hbWU9Im9ubW91c2VvdXQiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmtleXByZXNzIj5vbmtleXByZXNzPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5cHJlc3MiIG5hbWU9Im9ua2V5cHJlc3MiIHR5cGU9InRleHQiIHZhbHVlPSIiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmtleWRvd24iPm9ua2V5ZG93bjwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmtleWRvd24iIG5hbWU9Im9ua2V5ZG93biIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ua2V5dXAiPm9ua2V5dXA8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25rZXl1cCIgbmFtZT0ib25rZXl1cCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJPC90YWJsZT4KCQkJPC9maWVsZHNldD4KCQk8L2Rpdj4KCTwvZGl2PgoJPGRpdiBjbGFzcz0ibWNlQWN0aW9uUGFuZWwiPgoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJpbnNlcnQiIG5hbWU9Imluc2VydCIgdmFsdWU9InsjaW5zZXJ0fSIgLz4KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iY2FuY2VsIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJ7I2NhbmNlbH0iIG9uY2xpY2s9InRpbnlNQ0VQb3B1cC5jbG9zZSgpOyIgLz4KCTwvZGl2Pgo8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/cite.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjeGh0bWx4dHJhc19kbGcudGl0bGVfY2l0ZV9lbGVtZW50fTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9tY3RhYnMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZm9ybV91dGlscy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9lZGl0YWJsZV9zZWxlY3RzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2VsZW1lbnRfY29tbW9uLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2NpdGUuanMiPjwvc2NyaXB0PgoJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL3BvcHVwLmNzcyIgLz4KPC9oZWFkPgo8Ym9keSBzdHlsZT0iZGlzcGxheTogbm9uZSI+Cjxmb3JtIG9uc3VibWl0PSJpbnNlcnRDaXRlKCk7cmV0dXJuIGZhbHNlOyIgYWN0aW9uPSIjIj4KCTxkaXYgY2xhc3M9InRhYnMiPgoJCTx1bD4KCQkJPGxpIGlkPSJnZW5lcmFsX3RhYiIgY2xhc3M9ImN1cnJlbnQiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2dlbmVyYWxfdGFiJywnZ2VuZXJhbF9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjeGh0bWx4dHJhc19kbGcuZ2VuZXJhbF90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCQk8IS0tIDxsaSBpZD0iZXZlbnRzX3RhYiI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignZXZlbnRzX3RhYicsJ2V2ZW50c19wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjeGh0bWx4dHJhc19kbGcuZXZlbnRzX3RhYn08L2E+PC9zcGFuPjwvbGk+IC0tPgoJCTwvdWw+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJwYW5lbF93cmFwcGVyIj4KCQk8ZGl2IGlkPSJnZW5lcmFsX3BhbmVsIiBjbGFzcz0icGFuZWwgY3VycmVudCI+CgkJCTxmaWVsZHNldD4KCQkJCTxsZWdlbmQ+eyN4aHRtbHh0cmFzX2RsZy5maWVsZHNldF9hdHRyaWJfdGFifTwvbGVnZW5kPgoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSI0Ij4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBpZD0idGl0bGVsYWJlbCIgZm9yPSJ0aXRsZSI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfbGFiZWxfdGl0bGV9PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9InRpdGxlIiBuYW1lPSJ0aXRsZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIG1jZUZvY3VzIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9ImlkbGFiZWwiIGZvcj0iaWQiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX2lkfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJpZCIgbmFtZT0iaWQiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJjbGFzc2xhYmVsIiBmb3I9ImNsYXNzIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9jbGFzc308L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPgoJCQkJCQkJPHNlbGVjdCBpZD0iY2xhc3MiIG5hbWU9ImNsYXNzIiBjbGFzcz0iZmllbGQgbWNlRWRpdGFibGVTZWxlY3QiPgoJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPiAKCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQk8L3RkPgoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9InN0eWxlbGFiZWwiIGZvcj0iY2xhc3MiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX3N0eWxlfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJzdHlsZSIgbmFtZT0ic3R5bGUiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJkaXJsYWJlbCIgZm9yPSJkaXIiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX2xhbmdkaXJ9PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD4KCQkJCQkJCTxzZWxlY3QgaWQ9ImRpciIgbmFtZT0iZGlyIiBjbGFzcz0iZmllbGQiPiAKCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibHRyIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9vcHRpb25fbHRyfTwvb3B0aW9uPiAKCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJydGwiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX29wdGlvbl9ydGx9PC9vcHRpb24+IAoJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCTwvdGQ+IAoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9ImxhbmdsYWJlbCIgZm9yPSJsYW5nIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9sYW5nY29kZX08L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPgoJCQkJCQkJPGlucHV0IGlkPSJsYW5nIiBuYW1lPSJsYW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+CgkJCQkJCTwvdGQ+IAoJCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L2ZpZWxkc2V0PgoJCTwvZGl2PgoJCTxkaXYgaWQ9ImV2ZW50c19wYW5lbCIgY2xhc3M9InBhbmVsIj4KCQkJPGZpZWxkc2V0PgoJCQkJPGxlZ2VuZD57I3hodG1seHRyYXNfZGxnLmZpZWxkc2V0X2V2ZW50c190YWJ9PC9sZWdlbmQ+CgoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSI0Ij4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9uZm9jdXMiPm9uZm9jdXM8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25mb2N1cyIgbmFtZT0ib25mb2N1cyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25ibHVyIj5vbmJsdXI8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25ibHVyIiBuYW1lPSJvbmJsdXIiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9uY2xpY2siPm9uY2xpY2s8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25jbGljayIgbmFtZT0ib25jbGljayIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25kYmxjbGljayI+b25kYmxjbGljazwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmRibGNsaWNrIiBuYW1lPSJvbmRibGNsaWNrIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbm1vdXNlZG93biI+b25tb3VzZWRvd248L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25tb3VzZWRvd24iIG5hbWU9Im9ubW91c2Vkb3duIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbm1vdXNldXAiPm9ubW91c2V1cDwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNldXAiIG5hbWU9Im9ubW91c2V1cCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZW92ZXIiPm9ubW91c2VvdmVyPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2VvdmVyIiBuYW1lPSJvbm1vdXNlb3ZlciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZW1vdmUiPm9ubW91c2Vtb3ZlPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2Vtb3ZlIiBuYW1lPSJvbm1vdXNlbW92ZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZW91dCI+b25tb3VzZW91dDwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNlb3V0IiBuYW1lPSJvbm1vdXNlb3V0IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmtleXByZXNzIj5vbmtleXByZXNzPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5cHJlc3MiIG5hbWU9Im9ua2V5cHJlc3MiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ua2V5ZG93biI+b25rZXlkb3duPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5ZG93biIgbmFtZT0ib25rZXlkb3duIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmtleXVwIj5vbmtleXVwPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ua2V5dXAiIG5hbWU9Im9ua2V5dXAiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJPC90YWJsZT4KCQkJPC9maWVsZHNldD4KCQk8L2Rpdj4KCTwvZGl2PgoJPGRpdiBjbGFzcz0ibWNlQWN0aW9uUGFuZWwiPgoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJpbnNlcnQiIG5hbWU9Imluc2VydCIgdmFsdWU9InsjdXBkYXRlfSIgLz4KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0icmVtb3ZlIiBuYW1lPSJyZW1vdmUiIGNsYXNzPSJidXR0b24iIHZhbHVlPSJ7I3hodG1seHRyYXNfZGxnLnJlbW92ZX0iIG9uY2xpY2s9InJlbW92ZUNpdGUoKTsiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgLz4KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iY2FuY2VsIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJ7I2NhbmNlbH0iIG9uY2xpY2s9InRpbnlNQ0VQb3B1cC5jbG9zZSgpOyIgLz4KCTwvZGl2Pgo8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/css/attributes.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LnBhbmVsX3dyYXBwZXIgZGl2LmN1cnJlbnQgewoJaGVpZ2h0OiAyOTBweDsKfQoKI2lkLCAjc3R5bGUsICN0aXRsZSwgI2RpciwgI2hyZWZsYW5nLCAjbGFuZywgI2NsYXNzbGlzdCwgI3RhYmluZGV4LCAjYWNjZXNza2V5IHsKCXdpZHRoOiAyMDBweDsKfQoKI2V2ZW50c19wYW5lbCBpbnB1dCB7Cgl3aWR0aDogMjAwcHg7Cn0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/css/popup.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW5wdXQuZmllbGQsIHNlbGVjdC5maWVsZCB7d2lkdGg6MjAwcHg7fQppbnB1dC5waWNrZXIge3dpZHRoOjE3OXB4OyBtYXJnaW4tbGVmdDogNXB4O30KaW5wdXQuZGlzYWJsZWQge2JvcmRlci1jb2xvcjojRjJGMkYyO30KaW1nLnBpY2tlciB7dmVydGljYWwtYWxpZ246dGV4dC1ib3R0b207IGN1cnNvcjpwb2ludGVyO30KaDEge3BhZGRpbmc6IDAgMCA1cHggMDt9Ci5wYW5lbF93cmFwcGVyIGRpdi5jdXJyZW50IHtoZWlnaHQ6MTYwcHg7fQojeGh0bWx4dHJhc2RlbCAucGFuZWxfd3JhcHBlciBkaXYuY3VycmVudCwgI3hodG1seHRyYXNpbnMgLnBhbmVsX3dyYXBwZXIgZGl2LmN1cnJlbnQge2hlaWdodDogMjMwcHg7fQphLmJyb3dzZSBzcGFuIHtkaXNwbGF5OmJsb2NrOyB3aWR0aDoyMHB4OyBoZWlnaHQ6MjBweDsgYmFja2dyb3VuZDp1cmwoJy4uLy4uLy4uL3RoZW1lcy9hZHZhbmNlZC9pbWcvaWNvbnMuZ2lmJykgLTE0MHB4IC0yMHB4O30KI2RhdGV0aW1lIHt3aWR0aDoxODBweDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/del.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjeGh0bWx4dHJhc19kbGcudGl0bGVfZGVsX2VsZW1lbnR9PC90aXRsZT4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3RpbnlfbWNlX3BvcHVwLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL21jdGFicy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9mb3JtX3V0aWxzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL2VkaXRhYmxlX3NlbGVjdHMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvZWxlbWVudF9jb21tb24uanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvZGVsLmpzIj48L3NjcmlwdD4KCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9wb3B1cC5jc3MiIC8+CjwvaGVhZD4KPGJvZHkgaWQ9InhodG1seHRyYXNpbnMiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KPGZvcm0gb25zdWJtaXQ9Imluc2VydERlbCgpO3JldHVybiBmYWxzZTsiIGFjdGlvbj0iIyI+Cgk8ZGl2IGNsYXNzPSJ0YWJzIj4KCQk8dWw+CgkJCTxsaSBpZD0iZ2VuZXJhbF90YWIiIGNsYXNzPSJjdXJyZW50Ij48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdnZW5lcmFsX3RhYicsJ2dlbmVyYWxfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I3hodG1seHRyYXNfZGxnLmdlbmVyYWxfdGFifTwvYT48L3NwYW4+PC9saT4KCQkJPCEtLSA8bGkgaWQ9ImV2ZW50c190YWIiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2V2ZW50c190YWInLCdldmVudHNfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I3hodG1seHRyYXNfZGxnLmV2ZW50c190YWJ9PC9hPjwvc3Bhbj48L2xpPiAtLT4KCQk8L3VsPgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0icGFuZWxfd3JhcHBlciI+CgkJPGRpdiBpZD0iZ2VuZXJhbF9wYW5lbCIgY2xhc3M9InBhbmVsIGN1cnJlbnQiPgoJCQk8ZmllbGRzZXQ+CgkJCQk8bGVnZW5kPnsjeGh0bWx4dHJhc19kbGcuZmllbGRzZXRfZ2VuZXJhbF90YWJ9PC9sZWdlbmQ+CgkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjQiPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJkYXRldGltZWxhYmVsIiBmb3I9ImRhdGV0aW1lIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9kYXRldGltZX08L2xhYmVsPjo8L3RkPgoJCQkJCQk8dGQ+CgkJCQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgoJCQkJCQkJCTx0cj4gCgkJCQkJCQkJCTx0ZD48aW5wdXQgaWQ9ImRhdGV0aW1lIiBuYW1lPSJkYXRldGltZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgbWF4bGVuZ3RoPSIxOSIgY2xhc3M9ImZpZWxkIG1jZUZvY3VzIiAvPjwvdGQ+IAoJCQkJCQkJCQk8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDppbnNlcnREYXRlVGltZSgnZGF0ZXRpbWUnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7IiBjbGFzcz0iYnJvd3NlIj48c3BhbiBjbGFzcz0iZGF0ZXRpbWUiIHRpdGxlPSJ7I3hodG1seHRyYXNfZGxnLmluc2VydF9kYXRlfSI+PC9zcGFuPjwvYT48L3RkPgoJCQkJCQkJCTwvdHI+CgkJCQkJCQk8L3RhYmxlPgoJCQkJCQk8L3RkPgoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9ImNpdGVsYWJlbCIgZm9yPSJjaXRlIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9jaXRlfTwvbGFiZWw+OjwvdGQ+CgkJCQkJCTx0ZD48aW5wdXQgaWQ9ImNpdGUiIG5hbWU9ImNpdGUiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJPC90YWJsZT4KCQkJPC9maWVsZHNldD4KCQkJPGZpZWxkc2V0PgoJCQkJPGxlZ2VuZD57I3hodG1seHRyYXNfZGxnLmZpZWxkc2V0X2F0dHJpYl90YWJ9PC9sZWdlbmQ+CgkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjQiPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJ0aXRsZWxhYmVsIiBmb3I9InRpdGxlIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF90aXRsZX08L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0idGl0bGUiIG5hbWU9InRpdGxlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBpZD0iaWRsYWJlbCIgZm9yPSJpZCI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfbGFiZWxfaWR9PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9ImlkIiBuYW1lPSJpZCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9ImNsYXNzbGFiZWwiIGZvcj0iY2xhc3MiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX2NsYXNzfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+CgkJCQkJCQk8c2VsZWN0IGlkPSJjbGFzcyIgbmFtZT0iY2xhc3MiIGNsYXNzPSJmaWVsZCBtY2VFZGl0YWJsZVNlbGVjdCI+CgkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+IAoJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCTwvdGQ+CgkJCQkJPC90cj4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBpZD0ic3R5bGVsYWJlbCIgZm9yPSJjbGFzcyI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfbGFiZWxfc3R5bGV9PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9InN0eWxlIiBuYW1lPSJzdHlsZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9ImRpcmxhYmVsIiBmb3I9ImRpciI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfbGFiZWxfbGFuZ2Rpcn08L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPgoJCQkJCQkJPHNlbGVjdCBpZD0iZGlyIiBuYW1lPSJkaXIiIGNsYXNzPSJmaWVsZCI+IAoJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPiAKCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJsdHIiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX29wdGlvbl9sdHJ9PC9vcHRpb24+IAoJCQkJCQkJCTxvcHRpb24gdmFsdWU9InJ0bCI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfb3B0aW9uX3J0bH08L29wdGlvbj4gCgkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJPC90ZD4gCgkJCQkJPC90cj4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBpZD0ibGFuZ2xhYmVsIiBmb3I9ImxhbmciPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX2xhbmdjb2RlfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+CgkJCQkJCQk8aW5wdXQgaWQ9ImxhbmciIG5hbWU9ImxhbmciIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz4KCQkJCQkJPC90ZD4gCgkJCQkJPC90cj4KCQkJCTwvdGFibGU+CgkJCTwvZmllbGRzZXQ+CgkJPC9kaXY+CgkJPGRpdiBpZD0iZXZlbnRzX3BhbmVsIiBjbGFzcz0icGFuZWwiPgoJCQk8ZmllbGRzZXQ+CgkJCQk8bGVnZW5kPnsjeGh0bWx4dHJhc19kbGcuZmllbGRzZXRfZXZlbnRzX3RhYn08L2xlZ2VuZD4KCgkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjQiPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25mb2N1cyI+b25mb2N1czwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmZvY3VzIiBuYW1lPSJvbmZvY3VzIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmJsdXIiPm9uYmx1cjwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmJsdXIiIG5hbWU9Im9uYmx1ciIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25jbGljayI+b25jbGljazwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmNsaWNrIiBuYW1lPSJvbmNsaWNrIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmRibGNsaWNrIj5vbmRibGNsaWNrPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9uZGJsY2xpY2siIG5hbWU9Im9uZGJsY2xpY2siIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ubW91c2Vkb3duIj5vbm1vdXNlZG93bjwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNlZG93biIgbmFtZT0ib25tb3VzZWRvd24iIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ubW91c2V1cCI+b25tb3VzZXVwPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2V1cCIgbmFtZT0ib25tb3VzZXVwIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbm1vdXNlb3ZlciI+b25tb3VzZW92ZXI8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25tb3VzZW92ZXIiIG5hbWU9Im9ubW91c2VvdmVyIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbm1vdXNlbW92ZSI+b25tb3VzZW1vdmU8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25tb3VzZW1vdmUiIG5hbWU9Im9ubW91c2Vtb3ZlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbm1vdXNlb3V0Ij5vbm1vdXNlb3V0PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2VvdXQiIG5hbWU9Im9ubW91c2VvdXQiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ua2V5cHJlc3MiPm9ua2V5cHJlc3M8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25rZXlwcmVzcyIgbmFtZT0ib25rZXlwcmVzcyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25rZXlkb3duIj5vbmtleWRvd248L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25rZXlkb3duIiBuYW1lPSJvbmtleWRvd24iIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ua2V5dXAiPm9ua2V5dXA8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25rZXl1cCIgbmFtZT0ib25rZXl1cCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L2ZpZWxkc2V0PgoJCTwvZGl2PgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJtY2VBY3Rpb25QYW5lbCI+CgkJPGlucHV0IHR5cGU9InN1Ym1pdCIgaWQ9Imluc2VydCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0ieyN1cGRhdGV9IiAvPgoJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJyZW1vdmUiIG5hbWU9InJlbW92ZSIgY2xhc3M9ImJ1dHRvbiIgdmFsdWU9InsjeGh0bWx4dHJhc19kbGcucmVtb3ZlfSIgb25jbGljaz0icmVtb3ZlRGVsKCk7IiBzdHlsZT0iZGlzcGxheTogbm9uZTsiIC8+CgkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNhbmNlbCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0ieyNjYW5jZWx9IiBvbmNsaWNrPSJ0aW55TUNFUG9wdXAuY2xvc2UoKTsiIC8+Cgk8L2Rpdj4KPC9mb3JtPgo8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/editor_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dGlueW1jZS5jcmVhdGUoInRpbnltY2UucGx1Z2lucy5YSFRNTFh0cmFzUGx1Z2luIix7aW5pdDpmdW5jdGlvbihhLGIpe2EuYWRkQ29tbWFuZCgibWNlQ2l0ZSIsZnVuY3Rpb24oKXthLndpbmRvd01hbmFnZXIub3Blbih7ZmlsZTpiKyIvY2l0ZS5odG0iLHdpZHRoOjM1MCtwYXJzZUludChhLmdldExhbmcoInhodG1seHRyYXMuY2l0ZV9kZWx0YV93aWR0aCIsMCkpLGhlaWdodDoyNTArcGFyc2VJbnQoYS5nZXRMYW5nKCJ4aHRtbHh0cmFzLmNpdGVfZGVsdGFfaGVpZ2h0IiwwKSksaW5saW5lOjF9LHtwbHVnaW5fdXJsOmJ9KX0pO2EuYWRkQ29tbWFuZCgibWNlQWNyb255bSIsZnVuY3Rpb24oKXthLndpbmRvd01hbmFnZXIub3Blbih7ZmlsZTpiKyIvYWNyb255bS5odG0iLHdpZHRoOjM1MCtwYXJzZUludChhLmdldExhbmcoInhodG1seHRyYXMuYWNyb255bV9kZWx0YV93aWR0aCIsMCkpLGhlaWdodDoyNTArcGFyc2VJbnQoYS5nZXRMYW5nKCJ4aHRtbHh0cmFzLmFjcm9ueW1fZGVsdGFfd2lkdGgiLDApKSxpbmxpbmU6MX0se3BsdWdpbl91cmw6Yn0pfSk7YS5hZGRDb21tYW5kKCJtY2VBYmJyIixmdW5jdGlvbigpe2Eud2luZG93TWFuYWdlci5vcGVuKHtmaWxlOmIrIi9hYmJyLmh0bSIsd2lkdGg6MzUwK3BhcnNlSW50KGEuZ2V0TGFuZygieGh0bWx4dHJhcy5hYmJyX2RlbHRhX3dpZHRoIiwwKSksaGVpZ2h0OjI1MCtwYXJzZUludChhLmdldExhbmcoInhodG1seHRyYXMuYWJicl9kZWx0YV93aWR0aCIsMCkpLGlubGluZToxfSx7cGx1Z2luX3VybDpifSl9KTthLmFkZENvbW1hbmQoIm1jZURlbCIsZnVuY3Rpb24oKXthLndpbmRvd01hbmFnZXIub3Blbih7ZmlsZTpiKyIvZGVsLmh0bSIsd2lkdGg6MzQwK3BhcnNlSW50KGEuZ2V0TGFuZygieGh0bWx4dHJhcy5kZWxfZGVsdGFfd2lkdGgiLDApKSxoZWlnaHQ6MzEwK3BhcnNlSW50KGEuZ2V0TGFuZygieGh0bWx4dHJhcy5kZWxfZGVsdGFfd2lkdGgiLDApKSxpbmxpbmU6MX0se3BsdWdpbl91cmw6Yn0pfSk7YS5hZGRDb21tYW5kKCJtY2VJbnMiLGZ1bmN0aW9uKCl7YS53aW5kb3dNYW5hZ2VyLm9wZW4oe2ZpbGU6YisiL2lucy5odG0iLHdpZHRoOjM0MCtwYXJzZUludChhLmdldExhbmcoInhodG1seHRyYXMuaW5zX2RlbHRhX3dpZHRoIiwwKSksaGVpZ2h0OjMxMCtwYXJzZUludChhLmdldExhbmcoInhodG1seHRyYXMuaW5zX2RlbHRhX3dpZHRoIiwwKSksaW5saW5lOjF9LHtwbHVnaW5fdXJsOmJ9KX0pO2EuYWRkQ29tbWFuZCgibWNlQXR0cmlidXRlcyIsZnVuY3Rpb24oKXthLndpbmRvd01hbmFnZXIub3Blbih7ZmlsZTpiKyIvYXR0cmlidXRlcy5odG0iLHdpZHRoOjM4MCxoZWlnaHQ6MzcwLGlubGluZToxfSx7cGx1Z2luX3VybDpifSl9KTthLmFkZEJ1dHRvbigiY2l0ZSIse3RpdGxlOiJ4aHRtbHh0cmFzLmNpdGVfZGVzYyIsY21kOiJtY2VDaXRlIn0pO2EuYWRkQnV0dG9uKCJhY3JvbnltIix7dGl0bGU6InhodG1seHRyYXMuYWNyb255bV9kZXNjIixjbWQ6Im1jZUFjcm9ueW0ifSk7YS5hZGRCdXR0b24oImFiYnIiLHt0aXRsZToieGh0bWx4dHJhcy5hYmJyX2Rlc2MiLGNtZDoibWNlQWJiciJ9KTthLmFkZEJ1dHRvbigiZGVsIix7dGl0bGU6InhodG1seHRyYXMuZGVsX2Rlc2MiLGNtZDoibWNlRGVsIn0pO2EuYWRkQnV0dG9uKCJpbnMiLHt0aXRsZToieGh0bWx4dHJhcy5pbnNfZGVzYyIsY21kOiJtY2VJbnMifSk7YS5hZGRCdXR0b24oImF0dHJpYnMiLHt0aXRsZToieGh0bWx4dHJhcy5hdHRyaWJzX2Rlc2MiLGNtZDoibWNlQXR0cmlidXRlcyJ9KTthLm9uTm9kZUNoYW5nZS5hZGQoZnVuY3Rpb24oZCxjLGYsZSl7Zj1kLmRvbS5nZXRQYXJlbnQoZiwiQ0lURSxBQ1JPTllNLEFCQlIsREVMLElOUyIpO2Muc2V0RGlzYWJsZWQoImNpdGUiLGUpO2Muc2V0RGlzYWJsZWQoImFjcm9ueW0iLGUpO2Muc2V0RGlzYWJsZWQoImFiYnIiLGUpO2Muc2V0RGlzYWJsZWQoImRlbCIsZSk7Yy5zZXREaXNhYmxlZCgiaW5zIixlKTtjLnNldERpc2FibGVkKCJhdHRyaWJzIixmJiZmLm5vZGVOYW1lPT0iQk9EWSIpO2Muc2V0QWN0aXZlKCJjaXRlIiwwKTtjLnNldEFjdGl2ZSgiYWNyb255bSIsMCk7Yy5zZXRBY3RpdmUoImFiYnIiLDApO2Muc2V0QWN0aXZlKCJkZWwiLDApO2Muc2V0QWN0aXZlKCJpbnMiLDApO2lmKGYpe2Rve2Muc2V0RGlzYWJsZWQoZi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLDApO2Muc2V0QWN0aXZlKGYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwxKX13aGlsZShmPWYucGFyZW50Tm9kZSl9fSk7YS5vblByZUluaXQuYWRkKGZ1bmN0aW9uKCl7YS5kb20uY3JlYXRlKCJhYmJyIil9KX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiWEhUTUwgWHRyYXMgUGx1Z2luIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLGluZm91cmw6Imh0dHA6Ly93aWtpLm1veGllY29kZS5jb20vaW5kZXgucGhwL1RpbnlNQ0U6UGx1Z2lucy94aHRtbHh0cmFzIix2ZXJzaW9uOnRpbnltY2UubWFqb3JWZXJzaW9uKyIuIit0aW55bWNlLm1pbm9yVmVyc2lvbn19fSk7dGlueW1jZS5QbHVnaW5NYW5hZ2VyLmFkZCgieGh0bWx4dHJhcyIsdGlueW1jZS5wbHVnaW5zLlhIVE1MWHRyYXNQbHVnaW4pfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfcGx1Z2luX3NyYy5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCihmdW5jdGlvbigpIHsNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLlhIVE1MWHRyYXNQbHVnaW4nLCB7DQoJCWluaXQgOiBmdW5jdGlvbihlZCwgdXJsKSB7DQoJCQkvLyBSZWdpc3RlciBjb21tYW5kcw0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlQ2l0ZScsIGZ1bmN0aW9uKCkgew0KCQkJCWVkLndpbmRvd01hbmFnZXIub3Blbih7DQoJCQkJCWZpbGUgOiB1cmwgKyAnL2NpdGUuaHRtJywNCgkJCQkJd2lkdGggOiAzNTAgKyBwYXJzZUludChlZC5nZXRMYW5nKCd4aHRtbHh0cmFzLmNpdGVfZGVsdGFfd2lkdGgnLCAwKSksDQoJCQkJCWhlaWdodCA6IDI1MCArIHBhcnNlSW50KGVkLmdldExhbmcoJ3hodG1seHRyYXMuY2l0ZV9kZWx0YV9oZWlnaHQnLCAwKSksDQoJCQkJCWlubGluZSA6IDENCgkJCQl9LCB7DQoJCQkJCXBsdWdpbl91cmwgOiB1cmwNCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQllZC5hZGRDb21tYW5kKCdtY2VBY3JvbnltJywgZnVuY3Rpb24oKSB7DQoJCQkJZWQud2luZG93TWFuYWdlci5vcGVuKHsNCgkJCQkJZmlsZSA6IHVybCArICcvYWNyb255bS5odG0nLA0KCQkJCQl3aWR0aCA6IDM1MCArIHBhcnNlSW50KGVkLmdldExhbmcoJ3hodG1seHRyYXMuYWNyb255bV9kZWx0YV93aWR0aCcsIDApKSwNCgkJCQkJaGVpZ2h0IDogMjUwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygneGh0bWx4dHJhcy5hY3JvbnltX2RlbHRhX3dpZHRoJywgMCkpLA0KCQkJCQlpbmxpbmUgOiAxDQoJCQkJfSwgew0KCQkJCQlwbHVnaW5fdXJsIDogdXJsDQoJCQkJfSk7DQoJCQl9KTsNCg0KCQkJZWQuYWRkQ29tbWFuZCgnbWNlQWJicicsIGZ1bmN0aW9uKCkgew0KCQkJCWVkLndpbmRvd01hbmFnZXIub3Blbih7DQoJCQkJCWZpbGUgOiB1cmwgKyAnL2FiYnIuaHRtJywNCgkJCQkJd2lkdGggOiAzNTAgKyBwYXJzZUludChlZC5nZXRMYW5nKCd4aHRtbHh0cmFzLmFiYnJfZGVsdGFfd2lkdGgnLCAwKSksDQoJCQkJCWhlaWdodCA6IDI1MCArIHBhcnNlSW50KGVkLmdldExhbmcoJ3hodG1seHRyYXMuYWJicl9kZWx0YV93aWR0aCcsIDApKSwNCgkJCQkJaW5saW5lIDogMQ0KCQkJCX0sIHsNCgkJCQkJcGx1Z2luX3VybCA6IHVybA0KCQkJCX0pOw0KCQkJfSk7DQoNCgkJCWVkLmFkZENvbW1hbmQoJ21jZURlbCcsIGZ1bmN0aW9uKCkgew0KCQkJCWVkLndpbmRvd01hbmFnZXIub3Blbih7DQoJCQkJCWZpbGUgOiB1cmwgKyAnL2RlbC5odG0nLA0KCQkJCQl3aWR0aCA6IDM0MCArIHBhcnNlSW50KGVkLmdldExhbmcoJ3hodG1seHRyYXMuZGVsX2RlbHRhX3dpZHRoJywgMCkpLA0KCQkJCQloZWlnaHQgOiAzMTAgKyBwYXJzZUludChlZC5nZXRMYW5nKCd4aHRtbHh0cmFzLmRlbF9kZWx0YV93aWR0aCcsIDApKSwNCgkJCQkJaW5saW5lIDogMQ0KCQkJCX0sIHsNCgkJCQkJcGx1Z2luX3VybCA6IHVybA0KCQkJCX0pOw0KCQkJfSk7DQoNCgkJCWVkLmFkZENvbW1hbmQoJ21jZUlucycsIGZ1bmN0aW9uKCkgew0KCQkJCWVkLndpbmRvd01hbmFnZXIub3Blbih7DQoJCQkJCWZpbGUgOiB1cmwgKyAnL2lucy5odG0nLA0KCQkJCQl3aWR0aCA6IDM0MCArIHBhcnNlSW50KGVkLmdldExhbmcoJ3hodG1seHRyYXMuaW5zX2RlbHRhX3dpZHRoJywgMCkpLA0KCQkJCQloZWlnaHQgOiAzMTAgKyBwYXJzZUludChlZC5nZXRMYW5nKCd4aHRtbHh0cmFzLmluc19kZWx0YV93aWR0aCcsIDApKSwNCgkJCQkJaW5saW5lIDogMQ0KCQkJCX0sIHsNCgkJCQkJcGx1Z2luX3VybCA6IHVybA0KCQkJCX0pOw0KCQkJfSk7DQoNCgkJCWVkLmFkZENvbW1hbmQoJ21jZUF0dHJpYnV0ZXMnLCBmdW5jdGlvbigpIHsNCgkJCQllZC53aW5kb3dNYW5hZ2VyLm9wZW4oew0KCQkJCQlmaWxlIDogdXJsICsgJy9hdHRyaWJ1dGVzLmh0bScsDQoJCQkJCXdpZHRoIDogMzgwLA0KCQkJCQloZWlnaHQgOiAzNzAsDQoJCQkJCWlubGluZSA6IDENCgkJCQl9LCB7DQoJCQkJCXBsdWdpbl91cmwgOiB1cmwNCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQkvLyBSZWdpc3RlciBidXR0b25zDQoJCQllZC5hZGRCdXR0b24oJ2NpdGUnLCB7dGl0bGUgOiAneGh0bWx4dHJhcy5jaXRlX2Rlc2MnLCBjbWQgOiAnbWNlQ2l0ZSd9KTsNCgkJCWVkLmFkZEJ1dHRvbignYWNyb255bScsIHt0aXRsZSA6ICd4aHRtbHh0cmFzLmFjcm9ueW1fZGVzYycsIGNtZCA6ICdtY2VBY3JvbnltJ30pOw0KCQkJZWQuYWRkQnV0dG9uKCdhYmJyJywge3RpdGxlIDogJ3hodG1seHRyYXMuYWJicl9kZXNjJywgY21kIDogJ21jZUFiYnInfSk7DQoJCQllZC5hZGRCdXR0b24oJ2RlbCcsIHt0aXRsZSA6ICd4aHRtbHh0cmFzLmRlbF9kZXNjJywgY21kIDogJ21jZURlbCd9KTsNCgkJCWVkLmFkZEJ1dHRvbignaW5zJywge3RpdGxlIDogJ3hodG1seHRyYXMuaW5zX2Rlc2MnLCBjbWQgOiAnbWNlSW5zJ30pOw0KCQkJZWQuYWRkQnV0dG9uKCdhdHRyaWJzJywge3RpdGxlIDogJ3hodG1seHRyYXMuYXR0cmlic19kZXNjJywgY21kIDogJ21jZUF0dHJpYnV0ZXMnfSk7DQoNCgkJCWVkLm9uTm9kZUNoYW5nZS5hZGQoZnVuY3Rpb24oZWQsIGNtLCBuLCBjbykgew0KCQkJCW4gPSBlZC5kb20uZ2V0UGFyZW50KG4sICdDSVRFLEFDUk9OWU0sQUJCUixERUwsSU5TJyk7DQoNCgkJCQljbS5zZXREaXNhYmxlZCgnY2l0ZScsIGNvKTsNCgkJCQljbS5zZXREaXNhYmxlZCgnYWNyb255bScsIGNvKTsNCgkJCQljbS5zZXREaXNhYmxlZCgnYWJicicsIGNvKTsNCgkJCQljbS5zZXREaXNhYmxlZCgnZGVsJywgY28pOw0KCQkJCWNtLnNldERpc2FibGVkKCdpbnMnLCBjbyk7DQoJCQkJY20uc2V0RGlzYWJsZWQoJ2F0dHJpYnMnLCBuICYmIG4ubm9kZU5hbWUgPT0gJ0JPRFknKTsNCgkJCQljbS5zZXRBY3RpdmUoJ2NpdGUnLCAwKTsNCgkJCQljbS5zZXRBY3RpdmUoJ2Fjcm9ueW0nLCAwKTsNCgkJCQljbS5zZXRBY3RpdmUoJ2FiYnInLCAwKTsNCgkJCQljbS5zZXRBY3RpdmUoJ2RlbCcsIDApOw0KCQkJCWNtLnNldEFjdGl2ZSgnaW5zJywgMCk7DQoNCgkJCQkvLyBBY3RpdmF0ZSBhbGwNCgkJCQlpZiAobikgew0KCQkJCQlkbyB7DQoJCQkJCQljbS5zZXREaXNhYmxlZChuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIDApOw0KCQkJCQkJY20uc2V0QWN0aXZlKG4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgMSk7DQoJCQkJCX0gd2hpbGUgKG4gPSBuLnBhcmVudE5vZGUpOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQllZC5vblByZUluaXQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCS8vIEZpeGVkIElFIGlzc3VlIHdoZXJlIGl0IGNhbid0IGhhbmRsZSB0aGVzZSBlbGVtZW50cyBjb3JyZWN0bHkNCgkJCQllZC5kb20uY3JlYXRlKCdhYmJyJyk7DQoJCQl9KTsNCgkJfSwNCg0KCQlnZXRJbmZvIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gew0KCQkJCWxvbmduYW1lIDogJ1hIVE1MIFh0cmFzIFBsdWdpbicsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbScsDQoJCQkJaW5mb3VybCA6ICdodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOlBsdWdpbnMveGh0bWx4dHJhcycsDQoJCQkJdmVyc2lvbiA6IHRpbnltY2UubWFqb3JWZXJzaW9uICsgIi4iICsgdGlueW1jZS5taW5vclZlcnNpb24NCgkJCX07DQoJCX0NCgl9KTsNCg0KCS8vIFJlZ2lzdGVyIHBsdWdpbg0KCXRpbnltY2UuUGx1Z2luTWFuYWdlci5hZGQoJ3hodG1seHRyYXMnLCB0aW55bWNlLnBsdWdpbnMuWEhUTUxYdHJhc1BsdWdpbik7DQp9KSgpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/ins.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjeGh0bWx4dHJhc19kbGcudGl0bGVfaW5zX2VsZW1lbnR9PC90aXRsZT4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3RpbnlfbWNlX3BvcHVwLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL21jdGFicy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9mb3JtX3V0aWxzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL2VkaXRhYmxlX3NlbGVjdHMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvZWxlbWVudF9jb21tb24uanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvaW5zLmpzIj48L3NjcmlwdD4KCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9wb3B1cC5jc3MiIC8+CjwvaGVhZD4KPGJvZHkgaWQ9InhodG1seHRyYXNpbnMiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KPGZvcm0gb25zdWJtaXQ9Imluc2VydElucygpO3JldHVybiBmYWxzZTsiIGFjdGlvbj0iIyI+Cgk8ZGl2IGNsYXNzPSJ0YWJzIj4KCQk8dWw+CgkJCTxsaSBpZD0iZ2VuZXJhbF90YWIiIGNsYXNzPSJjdXJyZW50Ij48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdnZW5lcmFsX3RhYicsJ2dlbmVyYWxfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I3hodG1seHRyYXNfZGxnLmdlbmVyYWxfdGFifTwvYT48L3NwYW4+PC9saT4KCQkJPCEtLSA8bGkgaWQ9ImV2ZW50c190YWIiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2V2ZW50c190YWInLCdldmVudHNfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I3hodG1seHRyYXNfZGxnLmV2ZW50c190YWJ9PC9hPjwvc3Bhbj48L2xpPiAtLT4KCQk8L3VsPgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0icGFuZWxfd3JhcHBlciI+CgkJPGRpdiBpZD0iZ2VuZXJhbF9wYW5lbCIgY2xhc3M9InBhbmVsIGN1cnJlbnQiPgoJCQk8ZmllbGRzZXQ+CgkJCQk8bGVnZW5kPnsjeGh0bWx4dHJhc19kbGcuZmllbGRzZXRfZ2VuZXJhbF90YWJ9PC9sZWdlbmQ+CgkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjQiPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJkYXRldGltZWxhYmVsIiBmb3I9ImRhdGV0aW1lIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9kYXRldGltZX08L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPgoJCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KCQkJCQkJCQk8dHI+IAoJCQkJCQkJCQk8dGQ+PGlucHV0IGlkPSJkYXRldGltZSIgbmFtZT0iZGF0ZXRpbWUiIHR5cGU9InRleHQiIHZhbHVlPSIiIG1heGxlbmd0aD0iMTkiIGNsYXNzPSJmaWVsZCBtY2VGb2N1cyIgLz48L3RkPiAKCQkJCQkJCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6aW5zZXJ0RGF0ZVRpbWUoJ2RhdGV0aW1lJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyIgY2xhc3M9ImJyb3dzZSI+PHNwYW4gY2xhc3M9ImRhdGV0aW1lIiB0aXRsZT0ieyN4aHRtbHh0cmFzX2RsZy5pbnNlcnRfZGF0ZX0iPjwvc3Bhbj48L2E+PC90ZD4KCQkJCQkJCQk8L3RyPgoJCQkJCQkJPC90YWJsZT4KCQkJCQkJPC90ZD4KCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJjaXRlbGFiZWwiIGZvcj0iY2l0ZSI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfbGFiZWxfY2l0ZX08L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0iY2l0ZSIgbmFtZT0iY2l0ZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L2ZpZWxkc2V0PgoJCQk8ZmllbGRzZXQ+CgkJCQk8bGVnZW5kPnsjeGh0bWx4dHJhc19kbGcuZmllbGRzZXRfYXR0cmliX3RhYn08L2xlZ2VuZD4KCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iNCI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgaWQ9InRpdGxlbGFiZWwiIGZvcj0idGl0bGUiPnsjeGh0bWx4dHJhc19kbGcuYXR0cmlidXRlX2xhYmVsX3RpdGxlfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJ0aXRsZSIgbmFtZT0idGl0bGUiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJpZGxhYmVsIiBmb3I9ImlkIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9pZH08L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0iaWQiIG5hbWU9ImlkIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBpZD0iY2xhc3NsYWJlbCIgZm9yPSJjbGFzcyI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfbGFiZWxfY2xhc3N9PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD4KCQkJCQkJCTxzZWxlY3QgaWQ9ImNsYXNzIiBuYW1lPSJjbGFzcyIgY2xhc3M9ImZpZWxkIG1jZUVkaXRhYmxlU2VsZWN0Ij4KCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiPnsjbm90X3NldH08L29wdGlvbj4gCgkJCQkJCQk8L3NlbGVjdD4KCQkJCQkJPC90ZD4KCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJzdHlsZWxhYmVsIiBmb3I9ImNsYXNzIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9zdHlsZX08L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ic3R5bGUiIG5hbWU9InN0eWxlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBpZD0iZGlybGFiZWwiIGZvcj0iZGlyIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9sYWJlbF9sYW5nZGlyfTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+CgkJCQkJCQk8c2VsZWN0IGlkPSJkaXIiIG5hbWU9ImRpciIgY2xhc3M9ImZpZWxkIj4gCgkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj57I25vdF9zZXR9PC9vcHRpb24+IAoJCQkJCQkJCTxvcHRpb24gdmFsdWU9Imx0ciI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfb3B0aW9uX2x0cn08L29wdGlvbj4gCgkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icnRsIj57I3hodG1seHRyYXNfZGxnLmF0dHJpYnV0ZV9vcHRpb25fcnRsfTwvb3B0aW9uPiAKCQkJCQkJCTwvc2VsZWN0PgoJCQkJCQk8L3RkPiAKCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGlkPSJsYW5nbGFiZWwiIGZvcj0ibGFuZyI+eyN4aHRtbHh0cmFzX2RsZy5hdHRyaWJ1dGVfbGFiZWxfbGFuZ2NvZGV9PC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD4KCQkJCQkJCTxpbnB1dCBpZD0ibGFuZyIgbmFtZT0ibGFuZyIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPgoJCQkJCQk8L3RkPiAKCQkJCQk8L3RyPgoJCQkJPC90YWJsZT4KCQkJPC9maWVsZHNldD4KCQk8L2Rpdj4KCQk8ZGl2IGlkPSJldmVudHNfcGFuZWwiIGNsYXNzPSJwYW5lbCI+CgkJCTxmaWVsZHNldD4KCQkJCTxsZWdlbmQ+eyN4aHRtbHh0cmFzX2RsZy5maWVsZHNldF9ldmVudHNfdGFifTwvbGVnZW5kPgoKCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iNCI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmZvY3VzIj5vbmZvY3VzPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9uZm9jdXMiIG5hbWU9Im9uZm9jdXMiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9uYmx1ciI+b25ibHVyPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9uYmx1ciIgbmFtZT0ib25ibHVyIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmNsaWNrIj5vbmNsaWNrPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9uY2xpY2siIG5hbWU9Im9uY2xpY2siIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9uZGJsY2xpY2siPm9uZGJsY2xpY2s8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25kYmxjbGljayIgbmFtZT0ib25kYmxjbGljayIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZWRvd24iPm9ubW91c2Vkb3duPC9sYWJlbD46PC90ZD4gCgkJCQkJCTx0ZD48aW5wdXQgaWQ9Im9ubW91c2Vkb3duIiBuYW1lPSJvbm1vdXNlZG93biIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25tb3VzZXVwIj5vbm1vdXNldXA8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25tb3VzZXVwIiBuYW1lPSJvbm1vdXNldXAiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ubW91c2VvdmVyIj5vbm1vdXNlb3ZlcjwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNlb3ZlciIgbmFtZT0ib25tb3VzZW92ZXIiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ubW91c2Vtb3ZlIj5vbm1vdXNlbW92ZTwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbm1vdXNlbW92ZSIgbmFtZT0ib25tb3VzZW1vdmUiIHR5cGU9InRleHQiIHZhbHVlPSIiIGNsYXNzPSJmaWVsZCIgLz48L3RkPiAKCQkJCQk8L3RyPgoKCQkJCQk8dHI+CgkJCQkJCTx0ZCBjbGFzcz0ibGFiZWwiPjxsYWJlbCBmb3I9Im9ubW91c2VvdXQiPm9ubW91c2VvdXQ8L2xhYmVsPjo8L3RkPiAKCQkJCQkJPHRkPjxpbnB1dCBpZD0ib25tb3VzZW91dCIgbmFtZT0ib25tb3VzZW91dCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25rZXlwcmVzcyI+b25rZXlwcmVzczwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmtleXByZXNzIiBuYW1lPSJvbmtleXByZXNzIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCgkJCQkJPHRyPgoJCQkJCQk8dGQgY2xhc3M9ImxhYmVsIj48bGFiZWwgZm9yPSJvbmtleWRvd24iPm9ua2V5ZG93bjwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmtleWRvd24iIG5hbWU9Im9ua2V5ZG93biIgdHlwZT0idGV4dCIgdmFsdWU9IiIgY2xhc3M9ImZpZWxkIiAvPjwvdGQ+IAoJCQkJCTwvdHI+CgoJCQkJCTx0cj4KCQkJCQkJPHRkIGNsYXNzPSJsYWJlbCI+PGxhYmVsIGZvcj0ib25rZXl1cCI+b25rZXl1cDwvbGFiZWw+OjwvdGQ+IAoJCQkJCQk8dGQ+PGlucHV0IGlkPSJvbmtleXVwIiBuYW1lPSJvbmtleXVwIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBjbGFzcz0iZmllbGQiIC8+PC90ZD4gCgkJCQkJPC90cj4KCQkJCTwvdGFibGU+CgkJCTwvZmllbGRzZXQ+CgkJPC9kaXY+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9Im1jZUFjdGlvblBhbmVsIj4KCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBpZD0iaW5zZXJ0IiBuYW1lPSJpbnNlcnQiIHZhbHVlPSJ7I3VwZGF0ZX0iIC8+CgkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9InJlbW92ZSIgbmFtZT0icmVtb3ZlIiBjbGFzcz0iYnV0dG9uIiB2YWx1ZT0ieyN4aHRtbHh0cmFzX2RsZy5yZW1vdmV9IiBvbmNsaWNrPSJyZW1vdmVJbnMoKTsiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgLz4KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iY2FuY2VsIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJ7I2NhbmNlbH0iIG9uY2xpY2s9InRpbnlNQ0VQb3B1cC5jbG9zZSgpOyIgLz4KCTwvZGl2Pgo8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/js/abbr.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBhYmJyLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KZnVuY3Rpb24gaW5pdCgpIHsNCglTWEUuaW5pdEVsZW1lbnREaWFsb2coJ2FiYnInKTsNCglpZiAoU1hFLmN1cnJlbnRBY3Rpb24gPT0gInVwZGF0ZSIpIHsNCgkJU1hFLnNob3dSZW1vdmVCdXR0b24oKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIGluc2VydEFiYnIoKSB7DQoJU1hFLmluc2VydEVsZW1lbnQoJ2FiYnInKTsNCgl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCn0NCg0KZnVuY3Rpb24gcmVtb3ZlQWJicigpIHsNCglTWEUucmVtb3ZlRWxlbWVudCgnYWJicicpOw0KCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KfQ0KDQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChpbml0KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/js/acronym.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBhY3JvbnltLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KZnVuY3Rpb24gaW5pdCgpIHsNCglTWEUuaW5pdEVsZW1lbnREaWFsb2coJ2Fjcm9ueW0nKTsNCglpZiAoU1hFLmN1cnJlbnRBY3Rpb24gPT0gInVwZGF0ZSIpIHsNCgkJU1hFLnNob3dSZW1vdmVCdXR0b24oKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIGluc2VydEFjcm9ueW0oKSB7DQoJU1hFLmluc2VydEVsZW1lbnQoJ2Fjcm9ueW0nKTsNCgl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCn0NCg0KZnVuY3Rpb24gcmVtb3ZlQWNyb255bSgpIHsNCglTWEUucmVtb3ZlRWxlbWVudCgnYWNyb255bScpOw0KCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KfQ0KDQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChpbml0KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/js/attributes.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBhdHRyaWJ1dGVzLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KZnVuY3Rpb24gaW5pdCgpIHsNCgl0aW55TUNFUG9wdXAucmVzaXplVG9Jbm5lclNpemUoKTsNCgl2YXIgaW5zdCA9IHRpbnlNQ0VQb3B1cC5lZGl0b3I7DQoJdmFyIGRvbSA9IGluc3QuZG9tOw0KCXZhciBlbG0gPSBpbnN0LnNlbGVjdGlvbi5nZXROb2RlKCk7DQoJdmFyIGYgPSBkb2N1bWVudC5mb3Jtc1swXTsNCgl2YXIgb25jbGljayA9IGRvbS5nZXRBdHRyaWIoZWxtLCAnb25jbGljaycpOw0KDQoJc2V0Rm9ybVZhbHVlKCd0aXRsZScsIGRvbS5nZXRBdHRyaWIoZWxtLCAndGl0bGUnKSk7DQoJc2V0Rm9ybVZhbHVlKCdpZCcsIGRvbS5nZXRBdHRyaWIoZWxtLCAnaWQnKSk7DQoJc2V0Rm9ybVZhbHVlKCdzdHlsZScsIGRvbS5nZXRBdHRyaWIoZWxtLCAic3R5bGUiKSk7DQoJc2V0Rm9ybVZhbHVlKCdkaXInLCBkb20uZ2V0QXR0cmliKGVsbSwgJ2RpcicpKTsNCglzZXRGb3JtVmFsdWUoJ2xhbmcnLCBkb20uZ2V0QXR0cmliKGVsbSwgJ2xhbmcnKSk7DQoJc2V0Rm9ybVZhbHVlKCd0YWJpbmRleCcsIGRvbS5nZXRBdHRyaWIoZWxtLCAndGFiaW5kZXgnLCB0eXBlb2YoZWxtLnRhYmluZGV4KSAhPSAidW5kZWZpbmVkIiA/IGVsbS50YWJpbmRleCA6ICIiKSk7DQoJc2V0Rm9ybVZhbHVlKCdhY2Nlc3NrZXknLCBkb20uZ2V0QXR0cmliKGVsbSwgJ2FjY2Vzc2tleScsIHR5cGVvZihlbG0uYWNjZXNza2V5KSAhPSAidW5kZWZpbmVkIiA/IGVsbS5hY2Nlc3NrZXkgOiAiIikpOw0KCXNldEZvcm1WYWx1ZSgnb25mb2N1cycsIGRvbS5nZXRBdHRyaWIoZWxtLCAnb25mb2N1cycpKTsNCglzZXRGb3JtVmFsdWUoJ29uYmx1cicsIGRvbS5nZXRBdHRyaWIoZWxtLCAnb25ibHVyJykpOw0KCXNldEZvcm1WYWx1ZSgnb25jbGljaycsIG9uY2xpY2spOw0KCXNldEZvcm1WYWx1ZSgnb25kYmxjbGljaycsIGRvbS5nZXRBdHRyaWIoZWxtLCAnb25kYmxjbGljaycpKTsNCglzZXRGb3JtVmFsdWUoJ29ubW91c2Vkb3duJywgZG9tLmdldEF0dHJpYihlbG0sICdvbm1vdXNlZG93bicpKTsNCglzZXRGb3JtVmFsdWUoJ29ubW91c2V1cCcsIGRvbS5nZXRBdHRyaWIoZWxtLCAnb25tb3VzZXVwJykpOw0KCXNldEZvcm1WYWx1ZSgnb25tb3VzZW92ZXInLCBkb20uZ2V0QXR0cmliKGVsbSwgJ29ubW91c2VvdmVyJykpOw0KCXNldEZvcm1WYWx1ZSgnb25tb3VzZW1vdmUnLCBkb20uZ2V0QXR0cmliKGVsbSwgJ29ubW91c2Vtb3ZlJykpOw0KCXNldEZvcm1WYWx1ZSgnb25tb3VzZW91dCcsIGRvbS5nZXRBdHRyaWIoZWxtLCAnb25tb3VzZW91dCcpKTsNCglzZXRGb3JtVmFsdWUoJ29ua2V5cHJlc3MnLCBkb20uZ2V0QXR0cmliKGVsbSwgJ29ua2V5cHJlc3MnKSk7DQoJc2V0Rm9ybVZhbHVlKCdvbmtleWRvd24nLCBkb20uZ2V0QXR0cmliKGVsbSwgJ29ua2V5ZG93bicpKTsNCglzZXRGb3JtVmFsdWUoJ29ua2V5dXAnLCBkb20uZ2V0QXR0cmliKGVsbSwgJ29ua2V5dXAnKSk7DQoJY2xhc3NOYW1lID0gZG9tLmdldEF0dHJpYihlbG0sICdjbGFzcycpOw0KDQoJYWRkQ2xhc3Nlc1RvTGlzdCgnY2xhc3NsaXN0JywgJ2Fkdmxpbmtfc3R5bGVzJyk7DQoJc2VsZWN0QnlWYWx1ZShmLCAnY2xhc3NsaXN0JywgY2xhc3NOYW1lLCB0cnVlKTsNCg0KCVRpbnlNQ0VfRWRpdGFibGVTZWxlY3RzLmluaXQoKTsNCn0NCg0KZnVuY3Rpb24gc2V0Rm9ybVZhbHVlKG5hbWUsIHZhbHVlKSB7DQoJaWYodmFsdWUgJiYgZG9jdW1lbnQuZm9ybXNbMF0uZWxlbWVudHNbbmFtZV0pew0KCQlkb2N1bWVudC5mb3Jtc1swXS5lbGVtZW50c1tuYW1lXS52YWx1ZSA9IHZhbHVlOw0KCX0NCn0NCg0KZnVuY3Rpb24gaW5zZXJ0QWN0aW9uKCkgew0KCXZhciBpbnN0ID0gdGlueU1DRVBvcHVwLmVkaXRvcjsNCgl2YXIgZWxtID0gaW5zdC5zZWxlY3Rpb24uZ2V0Tm9kZSgpOw0KDQoJdGlueU1DRVBvcHVwLmV4ZWNDb21tYW5kKCJtY2VCZWdpblVuZG9MZXZlbCIpOwkNCglzZXRBbGxBdHRyaWJzKGVsbSk7DQoJdGlueU1DRVBvcHVwLmV4ZWNDb21tYW5kKCJtY2VFbmRVbmRvTGV2ZWwiKTsNCgl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCn0NCg0KZnVuY3Rpb24gc2V0QXR0cmliKGVsbSwgYXR0cmliLCB2YWx1ZSkgew0KCXZhciBmb3JtT2JqID0gZG9jdW1lbnQuZm9ybXNbMF07DQoJdmFyIHZhbHVlRWxtID0gZm9ybU9iai5lbGVtZW50c1thdHRyaWIudG9Mb3dlckNhc2UoKV07DQoJdmFyIGluc3QgPSB0aW55TUNFUG9wdXAuZWRpdG9yOw0KCXZhciBkb20gPSBpbnN0LmRvbTsNCg0KCWlmICh0eXBlb2YodmFsdWUpID09ICJ1bmRlZmluZWQiIHx8IHZhbHVlID09IG51bGwpIHsNCgkJdmFsdWUgPSAiIjsNCg0KCQlpZiAodmFsdWVFbG0pDQoJCQl2YWx1ZSA9IHZhbHVlRWxtLnZhbHVlOw0KCX0NCg0KCWlmICh2YWx1ZSAhPSAiIikgew0KCQlkb20uc2V0QXR0cmliKGVsbSwgYXR0cmliLnRvTG93ZXJDYXNlKCksIHZhbHVlKTsNCg0KCQlpZiAoYXR0cmliID09ICJzdHlsZSIpDQoJCQlhdHRyaWIgPSAic3R5bGUuY3NzVGV4dCI7DQoNCgkJaWYgKGF0dHJpYi5zdWJzdHJpbmcoMCwgMikgPT0gJ29uJykNCgkJCXZhbHVlID0gJ3JldHVybiB0cnVlOycgKyB2YWx1ZTsNCg0KCQlpZiAoYXR0cmliID09ICJjbGFzcyIpDQoJCQlhdHRyaWIgPSAiY2xhc3NOYW1lIjsNCg0KCQllbG1bYXR0cmliXT12YWx1ZTsNCgl9IGVsc2UNCgkJZWxtLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWIpOw0KfQ0KDQpmdW5jdGlvbiBzZXRBbGxBdHRyaWJzKGVsbSkgew0KCXZhciBmID0gZG9jdW1lbnQuZm9ybXNbMF07DQoNCglzZXRBdHRyaWIoZWxtLCAndGl0bGUnKTsNCglzZXRBdHRyaWIoZWxtLCAnaWQnKTsNCglzZXRBdHRyaWIoZWxtLCAnc3R5bGUnKTsNCglzZXRBdHRyaWIoZWxtLCAnY2xhc3MnLCBnZXRTZWxlY3RWYWx1ZShmLCAnY2xhc3NsaXN0JykpOw0KCXNldEF0dHJpYihlbG0sICdkaXInKTsNCglzZXRBdHRyaWIoZWxtLCAnbGFuZycpOw0KCXNldEF0dHJpYihlbG0sICd0YWJpbmRleCcpOw0KCXNldEF0dHJpYihlbG0sICdhY2Nlc3NrZXknKTsNCglzZXRBdHRyaWIoZWxtLCAnb25mb2N1cycpOw0KCXNldEF0dHJpYihlbG0sICdvbmJsdXInKTsNCglzZXRBdHRyaWIoZWxtLCAnb25jbGljaycpOw0KCXNldEF0dHJpYihlbG0sICdvbmRibGNsaWNrJyk7DQoJc2V0QXR0cmliKGVsbSwgJ29ubW91c2Vkb3duJyk7DQoJc2V0QXR0cmliKGVsbSwgJ29ubW91c2V1cCcpOw0KCXNldEF0dHJpYihlbG0sICdvbm1vdXNlb3ZlcicpOw0KCXNldEF0dHJpYihlbG0sICdvbm1vdXNlbW92ZScpOw0KCXNldEF0dHJpYihlbG0sICdvbm1vdXNlb3V0Jyk7DQoJc2V0QXR0cmliKGVsbSwgJ29ua2V5cHJlc3MnKTsNCglzZXRBdHRyaWIoZWxtLCAnb25rZXlkb3duJyk7DQoJc2V0QXR0cmliKGVsbSwgJ29ua2V5dXAnKTsNCg0KCS8vIFJlZnJlc2ggaW4gb2xkIE1TSUUNCi8vCWlmICh0aW55TUNFLmlzTVNJRTUpDQovLwkJZWxtLm91dGVySFRNTCA9IGVsbS5vdXRlckhUTUw7DQp9DQoNCmZ1bmN0aW9uIGluc2VydEF0dHJpYnV0ZSgpIHsNCgl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCn0NCg0KdGlueU1DRVBvcHVwLm9uSW5pdC5hZGQoaW5pdCk7DQp0aW55TUNFUG9wdXAucmVxdWlyZUxhbmdQYWNrKCk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/js/cite.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBjaXRlLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KZnVuY3Rpb24gaW5pdCgpIHsNCglTWEUuaW5pdEVsZW1lbnREaWFsb2coJ2NpdGUnKTsNCglpZiAoU1hFLmN1cnJlbnRBY3Rpb24gPT0gInVwZGF0ZSIpIHsNCgkJU1hFLnNob3dSZW1vdmVCdXR0b24oKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIGluc2VydENpdGUoKSB7DQoJU1hFLmluc2VydEVsZW1lbnQoJ2NpdGUnKTsNCgl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCn0NCg0KZnVuY3Rpb24gcmVtb3ZlQ2l0ZSgpIHsNCglTWEUucmVtb3ZlRWxlbWVudCgnY2l0ZScpOw0KCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KfQ0KDQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChpbml0KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/js/del.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBkZWwuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQpmdW5jdGlvbiBpbml0KCkgew0KCVNYRS5pbml0RWxlbWVudERpYWxvZygnZGVsJyk7DQoJaWYgKFNYRS5jdXJyZW50QWN0aW9uID09ICJ1cGRhdGUiKSB7DQoJCXNldEZvcm1WYWx1ZSgnZGF0ZXRpbWUnLCB0aW55TUNFUG9wdXAuZWRpdG9yLmRvbS5nZXRBdHRyaWIoU1hFLnVwZGF0ZUVsZW1lbnQsICdkYXRldGltZScpKTsNCgkJc2V0Rm9ybVZhbHVlKCdjaXRlJywgdGlueU1DRVBvcHVwLmVkaXRvci5kb20uZ2V0QXR0cmliKFNYRS51cGRhdGVFbGVtZW50LCAnY2l0ZScpKTsNCgkJU1hFLnNob3dSZW1vdmVCdXR0b24oKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIHNldEVsZW1lbnRBdHRyaWJzKGVsbSkgew0KCXNldEFsbENvbW1vbkF0dHJpYnMoZWxtKTsNCglzZXRBdHRyaWIoZWxtLCAnZGF0ZXRpbWUnKTsNCglzZXRBdHRyaWIoZWxtLCAnY2l0ZScpOw0KfQ0KDQpmdW5jdGlvbiBpbnNlcnREZWwoKSB7DQoJdmFyIGVsbSA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9tLmdldFBhcmVudChTWEUuZm9jdXNFbGVtZW50LCAnREVMJyk7DQoNCgl0aW55TUNFUG9wdXAuZXhlY0NvbW1hbmQoJ21jZUJlZ2luVW5kb0xldmVsJyk7DQoJaWYgKGVsbSA9PSBudWxsKSB7DQoJCXZhciBzID0gU1hFLmluc3Quc2VsZWN0aW9uLmdldENvbnRlbnQoKTsNCgkJaWYocy5sZW5ndGggPiAwKSB7DQoJCQlpbnNlcnRJbmxpbmVFbGVtZW50KCdkZWwnKTsNCgkJCXZhciBlbGVtZW50QXJyYXkgPSB0aW55bWNlLmdyZXAoU1hFLmluc3QuZG9tLnNlbGVjdCgnZGVsJyksIGZ1bmN0aW9uKG4pIHtyZXR1cm4gbi5pZCA9PSAnI3N4ZV90ZW1wX2RlbCMnO30pOw0KCQkJZm9yICh2YXIgaT0wOyBpPGVsZW1lbnRBcnJheS5sZW5ndGg7IGkrKykgew0KCQkJCXZhciBlbG0gPSBlbGVtZW50QXJyYXlbaV07DQoJCQkJc2V0RWxlbWVudEF0dHJpYnMoZWxtKTsNCgkJCX0NCgkJfQ0KCX0gZWxzZSB7DQoJCXNldEVsZW1lbnRBdHRyaWJzKGVsbSk7DQoJfQ0KCXRpbnlNQ0VQb3B1cC5lZGl0b3Iubm9kZUNoYW5nZWQoKTsNCgl0aW55TUNFUG9wdXAuZXhlY0NvbW1hbmQoJ21jZUVuZFVuZG9MZXZlbCcpOw0KCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KfQ0KDQpmdW5jdGlvbiByZW1vdmVEZWwoKSB7DQoJU1hFLnJlbW92ZUVsZW1lbnQoJ2RlbCcpOw0KCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KfQ0KDQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChpbml0KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/js/element_common.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlbGVtZW50X2NvbW1vbi5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCnRpbnlNQ0VQb3B1cC5yZXF1aXJlTGFuZ1BhY2soKTsNCg0KZnVuY3Rpb24gaW5pdENvbW1vbkF0dHJpYnV0ZXMoZWxtKSB7DQoJdmFyIGZvcm1PYmogPSBkb2N1bWVudC5mb3Jtc1swXSwgZG9tID0gdGlueU1DRVBvcHVwLmVkaXRvci5kb207DQoNCgkvLyBTZXR1cCBmb3JtIGRhdGEgZm9yIGNvbW1vbiBlbGVtZW50IGF0dHJpYnV0ZXMNCglzZXRGb3JtVmFsdWUoJ3RpdGxlJywgZG9tLmdldEF0dHJpYihlbG0sICd0aXRsZScpKTsNCglzZXRGb3JtVmFsdWUoJ2lkJywgZG9tLmdldEF0dHJpYihlbG0sICdpZCcpKTsNCglzZWxlY3RCeVZhbHVlKGZvcm1PYmosICdjbGFzcycsIGRvbS5nZXRBdHRyaWIoZWxtLCAnY2xhc3MnKSwgdHJ1ZSk7DQoJc2V0Rm9ybVZhbHVlKCdzdHlsZScsIGRvbS5nZXRBdHRyaWIoZWxtLCAnc3R5bGUnKSk7DQoJc2VsZWN0QnlWYWx1ZShmb3JtT2JqLCAnZGlyJywgZG9tLmdldEF0dHJpYihlbG0sICdkaXInKSk7DQoJc2V0Rm9ybVZhbHVlKCdsYW5nJywgZG9tLmdldEF0dHJpYihlbG0sICdsYW5nJykpOw0KCXNldEZvcm1WYWx1ZSgnb25mb2N1cycsIGRvbS5nZXRBdHRyaWIoZWxtLCAnb25mb2N1cycpKTsNCglzZXRGb3JtVmFsdWUoJ29uYmx1cicsIGRvbS5nZXRBdHRyaWIoZWxtLCAnb25ibHVyJykpOw0KCXNldEZvcm1WYWx1ZSgnb25jbGljaycsIGRvbS5nZXRBdHRyaWIoZWxtLCAnb25jbGljaycpKTsNCglzZXRGb3JtVmFsdWUoJ29uZGJsY2xpY2snLCBkb20uZ2V0QXR0cmliKGVsbSwgJ29uZGJsY2xpY2snKSk7DQoJc2V0Rm9ybVZhbHVlKCdvbm1vdXNlZG93bicsIGRvbS5nZXRBdHRyaWIoZWxtLCAnb25tb3VzZWRvd24nKSk7DQoJc2V0Rm9ybVZhbHVlKCdvbm1vdXNldXAnLCBkb20uZ2V0QXR0cmliKGVsbSwgJ29ubW91c2V1cCcpKTsNCglzZXRGb3JtVmFsdWUoJ29ubW91c2VvdmVyJywgZG9tLmdldEF0dHJpYihlbG0sICdvbm1vdXNlb3ZlcicpKTsNCglzZXRGb3JtVmFsdWUoJ29ubW91c2Vtb3ZlJywgZG9tLmdldEF0dHJpYihlbG0sICdvbm1vdXNlbW92ZScpKTsNCglzZXRGb3JtVmFsdWUoJ29ubW91c2VvdXQnLCBkb20uZ2V0QXR0cmliKGVsbSwgJ29ubW91c2VvdXQnKSk7DQoJc2V0Rm9ybVZhbHVlKCdvbmtleXByZXNzJywgZG9tLmdldEF0dHJpYihlbG0sICdvbmtleXByZXNzJykpOw0KCXNldEZvcm1WYWx1ZSgnb25rZXlkb3duJywgZG9tLmdldEF0dHJpYihlbG0sICdvbmtleWRvd24nKSk7DQoJc2V0Rm9ybVZhbHVlKCdvbmtleXVwJywgZG9tLmdldEF0dHJpYihlbG0sICdvbmtleXVwJykpOw0KfQ0KDQpmdW5jdGlvbiBzZXRGb3JtVmFsdWUobmFtZSwgdmFsdWUpIHsNCglpZihkb2N1bWVudC5mb3Jtc1swXS5lbGVtZW50c1tuYW1lXSkgZG9jdW1lbnQuZm9ybXNbMF0uZWxlbWVudHNbbmFtZV0udmFsdWUgPSB2YWx1ZTsNCn0NCg0KZnVuY3Rpb24gaW5zZXJ0RGF0ZVRpbWUoaWQpIHsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkudmFsdWUgPSBnZXREYXRlVGltZShuZXcgRGF0ZSgpLCAiJVktJW0tJWRUJUg6JU06JVMiKTsNCn0NCg0KZnVuY3Rpb24gZ2V0RGF0ZVRpbWUoZCwgZm10KSB7DQoJZm10ID0gZm10LnJlcGxhY2UoIiVEIiwgIiVtLyVkLyV5Iik7DQoJZm10ID0gZm10LnJlcGxhY2UoIiVyIiwgIiVJOiVNOiVTICVwIik7DQoJZm10ID0gZm10LnJlcGxhY2UoIiVZIiwgIiIgKyBkLmdldEZ1bGxZZWFyKCkpOw0KCWZtdCA9IGZtdC5yZXBsYWNlKCIleSIsICIiICsgZC5nZXRZZWFyKCkpOw0KCWZtdCA9IGZtdC5yZXBsYWNlKCIlbSIsIGFkZFplcm9zKGQuZ2V0TW9udGgoKSsxLCAyKSk7DQoJZm10ID0gZm10LnJlcGxhY2UoIiVkIiwgYWRkWmVyb3MoZC5nZXREYXRlKCksIDIpKTsNCglmbXQgPSBmbXQucmVwbGFjZSgiJUgiLCAiIiArIGFkZFplcm9zKGQuZ2V0SG91cnMoKSwgMikpOw0KCWZtdCA9IGZtdC5yZXBsYWNlKCIlTSIsICIiICsgYWRkWmVyb3MoZC5nZXRNaW51dGVzKCksIDIpKTsNCglmbXQgPSBmbXQucmVwbGFjZSgiJVMiLCAiIiArIGFkZFplcm9zKGQuZ2V0U2Vjb25kcygpLCAyKSk7DQoJZm10ID0gZm10LnJlcGxhY2UoIiVJIiwgIiIgKyAoKGQuZ2V0SG91cnMoKSArIDExKSAlIDEyICsgMSkpOw0KCWZtdCA9IGZtdC5yZXBsYWNlKCIlcCIsICIiICsgKGQuZ2V0SG91cnMoKSA8IDEyID8gIkFNIiA6ICJQTSIpKTsNCglmbXQgPSBmbXQucmVwbGFjZSgiJSUiLCAiJSIpOw0KDQoJcmV0dXJuIGZtdDsNCn0NCg0KZnVuY3Rpb24gYWRkWmVyb3ModmFsdWUsIGxlbikgew0KCXZhciBpOw0KDQoJdmFsdWUgPSAiIiArIHZhbHVlOw0KDQoJaWYgKHZhbHVlLmxlbmd0aCA8IGxlbikgew0KCQlmb3IgKGk9MDsgaTwobGVuLXZhbHVlLmxlbmd0aCk7IGkrKykNCgkJCXZhbHVlID0gIjAiICsgdmFsdWU7DQoJfQ0KDQoJcmV0dXJuIHZhbHVlOw0KfQ0KDQpmdW5jdGlvbiBzZWxlY3RCeVZhbHVlKGZvcm1fb2JqLCBmaWVsZF9uYW1lLCB2YWx1ZSwgYWRkX2N1c3RvbSwgaWdub3JlX2Nhc2UpIHsNCglpZiAoIWZvcm1fb2JqIHx8ICFmb3JtX29iai5lbGVtZW50c1tmaWVsZF9uYW1lXSkNCgkJcmV0dXJuOw0KDQoJdmFyIHNlbCA9IGZvcm1fb2JqLmVsZW1lbnRzW2ZpZWxkX25hbWVdOw0KDQoJdmFyIGZvdW5kID0gZmFsc2U7DQoJZm9yICh2YXIgaT0wOyBpPHNlbC5vcHRpb25zLmxlbmd0aDsgaSsrKSB7DQoJCXZhciBvcHRpb24gPSBzZWwub3B0aW9uc1tpXTsNCg0KCQlpZiAob3B0aW9uLnZhbHVlID09IHZhbHVlIHx8IChpZ25vcmVfY2FzZSAmJiBvcHRpb24udmFsdWUudG9Mb3dlckNhc2UoKSA9PSB2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KCQkJb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTsNCgkJCWZvdW5kID0gdHJ1ZTsNCgkJfSBlbHNlDQoJCQlvcHRpb24uc2VsZWN0ZWQgPSBmYWxzZTsNCgl9DQoNCglpZiAoIWZvdW5kICYmIGFkZF9jdXN0b20gJiYgdmFsdWUgIT0gJycpIHsNCgkJdmFyIG9wdGlvbiA9IG5ldyBPcHRpb24oJ1ZhbHVlOiAnICsgdmFsdWUsIHZhbHVlKTsNCgkJb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTsNCgkJc2VsLm9wdGlvbnNbc2VsLm9wdGlvbnMubGVuZ3RoXSA9IG9wdGlvbjsNCgl9DQoNCglyZXR1cm4gZm91bmQ7DQp9DQoNCmZ1bmN0aW9uIHNldEF0dHJpYihlbG0sIGF0dHJpYiwgdmFsdWUpIHsNCgl2YXIgZm9ybU9iaiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KCXZhciB2YWx1ZUVsbSA9IGZvcm1PYmouZWxlbWVudHNbYXR0cmliLnRvTG93ZXJDYXNlKCldOw0KCXRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9tLnNldEF0dHJpYihlbG0sIGF0dHJpYiwgdmFsdWUgfHwgdmFsdWVFbG0udmFsdWUpOw0KfQ0KDQpmdW5jdGlvbiBzZXRBbGxDb21tb25BdHRyaWJzKGVsbSkgew0KCXNldEF0dHJpYihlbG0sICd0aXRsZScpOw0KCXNldEF0dHJpYihlbG0sICdpZCcpOw0KCXNldEF0dHJpYihlbG0sICdjbGFzcycpOw0KCXNldEF0dHJpYihlbG0sICdzdHlsZScpOw0KCXNldEF0dHJpYihlbG0sICdkaXInKTsNCglzZXRBdHRyaWIoZWxtLCAnbGFuZycpOw0KCS8qc2V0QXR0cmliKGVsbSwgJ29uZm9jdXMnKTsNCglzZXRBdHRyaWIoZWxtLCAnb25ibHVyJyk7DQoJc2V0QXR0cmliKGVsbSwgJ29uY2xpY2snKTsNCglzZXRBdHRyaWIoZWxtLCAnb25kYmxjbGljaycpOw0KCXNldEF0dHJpYihlbG0sICdvbm1vdXNlZG93bicpOw0KCXNldEF0dHJpYihlbG0sICdvbm1vdXNldXAnKTsNCglzZXRBdHRyaWIoZWxtLCAnb25tb3VzZW92ZXInKTsNCglzZXRBdHRyaWIoZWxtLCAnb25tb3VzZW1vdmUnKTsNCglzZXRBdHRyaWIoZWxtLCAnb25tb3VzZW91dCcpOw0KCXNldEF0dHJpYihlbG0sICdvbmtleXByZXNzJyk7DQoJc2V0QXR0cmliKGVsbSwgJ29ua2V5ZG93bicpOw0KCXNldEF0dHJpYihlbG0sICdvbmtleXVwJyk7Ki8NCn0NCg0KU1hFID0gew0KCWN1cnJlbnRBY3Rpb24gOiAiaW5zZXJ0IiwNCglpbnN0IDogdGlueU1DRVBvcHVwLmVkaXRvciwNCgl1cGRhdGVFbGVtZW50IDogbnVsbA0KfQ0KDQpTWEUuZm9jdXNFbGVtZW50ID0gU1hFLmluc3Quc2VsZWN0aW9uLmdldE5vZGUoKTsNCg0KU1hFLmluaXRFbGVtZW50RGlhbG9nID0gZnVuY3Rpb24oZWxlbWVudF9uYW1lKSB7DQoJYWRkQ2xhc3Nlc1RvTGlzdCgnY2xhc3MnLCAneGh0bWx4dHJhc19zdHlsZXMnKTsNCglUaW55TUNFX0VkaXRhYmxlU2VsZWN0cy5pbml0KCk7DQoNCgllbGVtZW50X25hbWUgPSBlbGVtZW50X25hbWUudG9Mb3dlckNhc2UoKTsNCgl2YXIgZWxtID0gU1hFLmluc3QuZG9tLmdldFBhcmVudChTWEUuZm9jdXNFbGVtZW50LCBlbGVtZW50X25hbWUudG9VcHBlckNhc2UoKSk7DQoJaWYgKGVsbSAhPSBudWxsICYmIGVsbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09IGVsZW1lbnRfbmFtZS50b1VwcGVyQ2FzZSgpKSB7DQoJCVNYRS5jdXJyZW50QWN0aW9uID0gInVwZGF0ZSI7DQoJfQ0KDQoJaWYgKFNYRS5jdXJyZW50QWN0aW9uID09ICJ1cGRhdGUiKSB7DQoJCWluaXRDb21tb25BdHRyaWJ1dGVzKGVsbSk7DQoJCVNYRS51cGRhdGVFbGVtZW50ID0gZWxtOw0KCX0NCg0KCWRvY3VtZW50LmZvcm1zWzBdLmluc2VydC52YWx1ZSA9IHRpbnlNQ0VQb3B1cC5nZXRMYW5nKFNYRS5jdXJyZW50QWN0aW9uLCAnSW5zZXJ0JywgdHJ1ZSk7IA0KfQ0KDQpTWEUuaW5zZXJ0RWxlbWVudCA9IGZ1bmN0aW9uKGVsZW1lbnRfbmFtZSkgew0KCXZhciBlbG0gPSBTWEUuaW5zdC5kb20uZ2V0UGFyZW50KFNYRS5mb2N1c0VsZW1lbnQsIGVsZW1lbnRfbmFtZS50b1VwcGVyQ2FzZSgpKSwgaCwgdGFnTmFtZTsNCg0KCXRpbnlNQ0VQb3B1cC5leGVjQ29tbWFuZCgnbWNlQmVnaW5VbmRvTGV2ZWwnKTsNCglpZiAoZWxtID09IG51bGwpIHsNCgkJdmFyIHMgPSBTWEUuaW5zdC5zZWxlY3Rpb24uZ2V0Q29udGVudCgpOw0KCQlpZihzLmxlbmd0aCA+IDApIHsNCgkJCXRhZ05hbWUgPSBlbGVtZW50X25hbWU7DQoNCgkJCWluc2VydElubGluZUVsZW1lbnQoZWxlbWVudF9uYW1lKTsNCgkJCXZhciBlbGVtZW50QXJyYXkgPSB0aW55bWNlLmdyZXAoU1hFLmluc3QuZG9tLnNlbGVjdChlbGVtZW50X25hbWUpKTsNCgkJCWZvciAodmFyIGk9MDsgaTxlbGVtZW50QXJyYXkubGVuZ3RoOyBpKyspIHsNCgkJCQl2YXIgZWxtID0gZWxlbWVudEFycmF5W2ldOw0KDQoJCQkJaWYgKFNYRS5pbnN0LmRvbS5nZXRBdHRyaWIoZWxtLCAnX21jZV9uZXcnKSkgew0KCQkJCQllbG0uaWQgPSAnJzsNCgkJCQkJZWxtLnNldEF0dHJpYnV0ZSgnaWQnLCAnJyk7DQoJCQkJCWVsbS5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7DQoJCQkJCWVsbS5yZW1vdmVBdHRyaWJ1dGUoJ19tY2VfbmV3Jyk7DQoNCgkJCQkJc2V0QWxsQ29tbW9uQXR0cmlicyhlbG0pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0gZWxzZSB7DQoJCXNldEFsbENvbW1vbkF0dHJpYnMoZWxtKTsNCgl9DQoJU1hFLmluc3Qubm9kZUNoYW5nZWQoKTsNCgl0aW55TUNFUG9wdXAuZXhlY0NvbW1hbmQoJ21jZUVuZFVuZG9MZXZlbCcpOw0KfQ0KDQpTWEUucmVtb3ZlRWxlbWVudCA9IGZ1bmN0aW9uKGVsZW1lbnRfbmFtZSl7DQoJZWxlbWVudF9uYW1lID0gZWxlbWVudF9uYW1lLnRvTG93ZXJDYXNlKCk7DQoJZWxtID0gU1hFLmluc3QuZG9tLmdldFBhcmVudChTWEUuZm9jdXNFbGVtZW50LCBlbGVtZW50X25hbWUudG9VcHBlckNhc2UoKSk7DQoJaWYoZWxtICYmIGVsbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09IGVsZW1lbnRfbmFtZS50b1VwcGVyQ2FzZSgpKXsNCgkJdGlueU1DRVBvcHVwLmV4ZWNDb21tYW5kKCdtY2VCZWdpblVuZG9MZXZlbCcpOw0KCQl0aW55TUNFLmV4ZWNDb21tYW5kKCdtY2VSZW1vdmVOb2RlJywgZmFsc2UsIGVsbSk7DQoJCVNYRS5pbnN0Lm5vZGVDaGFuZ2VkKCk7DQoJCXRpbnlNQ0VQb3B1cC5leGVjQ29tbWFuZCgnbWNlRW5kVW5kb0xldmVsJyk7DQoJfQ0KfQ0KDQpTWEUuc2hvd1JlbW92ZUJ1dHRvbiA9IGZ1bmN0aW9uKCkgew0KCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVtb3ZlIikuc3R5bGUuZGlzcGxheSA9ICcnOw0KfQ0KDQpTWEUuY29udGFpbnNDbGFzcyA9IGZ1bmN0aW9uKGVsbSxjbCkgew0KCXJldHVybiAoZWxtLmNsYXNzTmFtZS5pbmRleE9mKGNsKSA+IC0xKSA/IHRydWUgOiBmYWxzZTsNCn0NCg0KU1hFLnJlbW92ZUNsYXNzID0gZnVuY3Rpb24oZWxtLGNsKSB7DQoJaWYoZWxtLmNsYXNzTmFtZSA9PSBudWxsIHx8IGVsbS5jbGFzc05hbWUgPT0gIiIgfHwgIVNYRS5jb250YWluc0NsYXNzKGVsbSxjbCkpIHsNCgkJcmV0dXJuIHRydWU7DQoJfQ0KCXZhciBjbGFzc05hbWVzID0gZWxtLmNsYXNzTmFtZS5zcGxpdCgiICIpOw0KCXZhciBuZXdDbGFzc05hbWVzID0gIiI7DQoJZm9yICh2YXIgeCA9IDAsIGNubCA9IGNsYXNzTmFtZXMubGVuZ3RoOyB4IDwgY25sOyB4KyspIHsNCgkJaWYgKGNsYXNzTmFtZXNbeF0gIT0gY2wpIHsNCgkJCW5ld0NsYXNzTmFtZXMgKz0gKGNsYXNzTmFtZXNbeF0gKyAiICIpOw0KCQl9DQoJfQ0KCWVsbS5jbGFzc05hbWUgPSBuZXdDbGFzc05hbWVzLnN1YnN0cmluZygwLG5ld0NsYXNzTmFtZXMubGVuZ3RoLTEpOyAvL3JlbW92ZXMgZXh0cmEgc3BhY2UgYXQgdGhlIGVuZA0KfQ0KDQpTWEUuYWRkQ2xhc3MgPSBmdW5jdGlvbihlbG0sY2wpIHsNCglpZighU1hFLmNvbnRhaW5zQ2xhc3MoZWxtLGNsKSkgZWxtLmNsYXNzTmFtZSA/IGVsbS5jbGFzc05hbWUgKz0gIiAiICsgY2wgOiBlbG0uY2xhc3NOYW1lID0gY2w7DQoJcmV0dXJuIHRydWU7DQp9DQoNCmZ1bmN0aW9uIGluc2VydElubGluZUVsZW1lbnQoZW4pIHsNCgl2YXIgZWQgPSB0aW55TUNFUG9wdXAuZWRpdG9yLCBkb20gPSBlZC5kb207DQoNCgllZC5nZXREb2MoKS5leGVjQ29tbWFuZCgnRm9udE5hbWUnLCBmYWxzZSwgJ21jZWlubGluZScpOw0KCXRpbnltY2UuZWFjaChkb20uc2VsZWN0KCdzcGFuLGZvbnQnKSwgZnVuY3Rpb24obikgew0KCQlpZiAobi5zdHlsZS5mb250RmFtaWx5ID09ICdtY2VpbmxpbmUnIHx8IG4uZmFjZSA9PSAnbWNlaW5saW5lJykNCgkJCWRvbS5yZXBsYWNlKGRvbS5jcmVhdGUoZW4sIHtfbWNlX25ldyA6IDF9KSwgbiwgMSk7DQoJfSk7DQp9DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/js/ins.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBpbnMuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQpmdW5jdGlvbiBpbml0KCkgew0KCVNYRS5pbml0RWxlbWVudERpYWxvZygnaW5zJyk7DQoJaWYgKFNYRS5jdXJyZW50QWN0aW9uID09ICJ1cGRhdGUiKSB7DQoJCXNldEZvcm1WYWx1ZSgnZGF0ZXRpbWUnLCB0aW55TUNFUG9wdXAuZWRpdG9yLmRvbS5nZXRBdHRyaWIoU1hFLnVwZGF0ZUVsZW1lbnQsICdkYXRldGltZScpKTsNCgkJc2V0Rm9ybVZhbHVlKCdjaXRlJywgdGlueU1DRVBvcHVwLmVkaXRvci5kb20uZ2V0QXR0cmliKFNYRS51cGRhdGVFbGVtZW50LCAnY2l0ZScpKTsNCgkJU1hFLnNob3dSZW1vdmVCdXR0b24oKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIHNldEVsZW1lbnRBdHRyaWJzKGVsbSkgew0KCXNldEFsbENvbW1vbkF0dHJpYnMoZWxtKTsNCglzZXRBdHRyaWIoZWxtLCAnZGF0ZXRpbWUnKTsNCglzZXRBdHRyaWIoZWxtLCAnY2l0ZScpOw0KfQ0KDQpmdW5jdGlvbiBpbnNlcnRJbnMoKSB7DQoJdmFyIGVsbSA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9tLmdldFBhcmVudChTWEUuZm9jdXNFbGVtZW50LCAnSU5TJyk7DQoJdGlueU1DRVBvcHVwLmV4ZWNDb21tYW5kKCdtY2VCZWdpblVuZG9MZXZlbCcpOw0KCWlmIChlbG0gPT0gbnVsbCkgew0KCQl2YXIgcyA9IFNYRS5pbnN0LnNlbGVjdGlvbi5nZXRDb250ZW50KCk7DQoJCWlmKHMubGVuZ3RoID4gMCkgew0KCQkJaW5zZXJ0SW5saW5lRWxlbWVudCgnSU5TJyk7DQoJCQl2YXIgZWxlbWVudEFycmF5ID0gdGlueW1jZS5ncmVwKFNYRS5pbnN0LmRvbS5zZWxlY3QoJ2lucycpLCBmdW5jdGlvbihuKSB7cmV0dXJuIG4uaWQgPT0gJyNzeGVfdGVtcF9pbnMjJzt9KTsNCgkJCWZvciAodmFyIGk9MDsgaTxlbGVtZW50QXJyYXkubGVuZ3RoOyBpKyspIHsNCgkJCQl2YXIgZWxtID0gZWxlbWVudEFycmF5W2ldOw0KCQkJCXNldEVsZW1lbnRBdHRyaWJzKGVsbSk7DQoJCQl9DQoJCX0NCgl9IGVsc2Ugew0KCQlzZXRFbGVtZW50QXR0cmlicyhlbG0pOw0KCX0NCgl0aW55TUNFUG9wdXAuZWRpdG9yLm5vZGVDaGFuZ2VkKCk7DQoJdGlueU1DRVBvcHVwLmV4ZWNDb21tYW5kKCdtY2VFbmRVbmRvTGV2ZWwnKTsNCgl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCn0NCg0KZnVuY3Rpb24gcmVtb3ZlSW5zKCkgew0KCVNYRS5yZW1vdmVFbGVtZW50KCdpbnMnKTsNCgl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCn0NCg0KdGlueU1DRVBvcHVwLm9uSW5pdC5hZGQoaW5pdCk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi54aHRtbHh0cmFzX2RsZycsew0KYXR0cmlidXRlX2xhYmVsX3RpdGxlOiJUaXRsZSIsDQphdHRyaWJ1dGVfbGFiZWxfaWQ6IklEIiwNCmF0dHJpYnV0ZV9sYWJlbF9jbGFzczoiQ2xhc3MiLA0KYXR0cmlidXRlX2xhYmVsX3N0eWxlOiJTdHlsZSIsDQphdHRyaWJ1dGVfbGFiZWxfY2l0ZToiQ2l0ZSIsDQphdHRyaWJ1dGVfbGFiZWxfZGF0ZXRpbWU6IkRhdGUvVGltZSIsDQphdHRyaWJ1dGVfbGFiZWxfbGFuZ2RpcjoiVGV4dCBEaXJlY3Rpb24iLA0KYXR0cmlidXRlX29wdGlvbl9sdHI6IkxlZnQgdG8gcmlnaHQiLA0KYXR0cmlidXRlX29wdGlvbl9ydGw6IlJpZ2h0IHRvIGxlZnQiLA0KYXR0cmlidXRlX2xhYmVsX2xhbmdjb2RlOiJMYW5ndWFnZSIsDQphdHRyaWJ1dGVfbGFiZWxfdGFiaW5kZXg6IlRhYkluZGV4IiwNCmF0dHJpYnV0ZV9sYWJlbF9hY2Nlc3NrZXk6IkFjY2Vzc0tleSIsDQphdHRyaWJ1dGVfZXZlbnRzX3RhYjoiRXZlbnRzIiwNCmF0dHJpYnV0ZV9hdHRyaWJfdGFiOiJBdHRyaWJ1dGVzIiwNCmdlbmVyYWxfdGFiOiJHZW5lcmFsIiwNCmF0dHJpYl90YWI6IkF0dHJpYnV0ZXMiLA0KZXZlbnRzX3RhYjoiRXZlbnRzIiwNCmZpZWxkc2V0X2dlbmVyYWxfdGFiOiJHZW5lcmFsIFNldHRpbmdzIiwNCmZpZWxkc2V0X2F0dHJpYl90YWI6IkVsZW1lbnQgQXR0cmlidXRlcyIsDQpmaWVsZHNldF9ldmVudHNfdGFiOiJFbGVtZW50IEV2ZW50cyIsDQp0aXRsZV9pbnNfZWxlbWVudDoiSW5zZXJ0aW9uIEVsZW1lbnQiLA0KdGl0bGVfZGVsX2VsZW1lbnQ6IkRlbGV0aW9uIEVsZW1lbnQiLA0KdGl0bGVfYWNyb255bV9lbGVtZW50OiJBY3JvbnltIEVsZW1lbnQiLA0KdGl0bGVfYWJicl9lbGVtZW50OiJBYmJyZXZpYXRpb24gRWxlbWVudCIsDQp0aXRsZV9jaXRlX2VsZW1lbnQ6IkNpdGF0aW9uIEVsZW1lbnQiLA0KcmVtb3ZlOiJSZW1vdmUiLA0KaW5zZXJ0X2RhdGU6Ikluc2VydCBjdXJyZW50IGRhdGUvdGltZSIsDQpvcHRpb25fbHRyOiJMZWZ0IHRvIHJpZ2h0IiwNCm9wdGlvbl9ydGw6IlJpZ2h0IHRvIGxlZnQiLA0KYXR0cmlic190aXRsZToiSW5zZXJ0L0VkaXQgQXR0cmlidXRlcyINCn0pOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/about.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPiAKPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KCTx0aXRsZT57I2FkdmFuY2VkX2RsZy5hYm91dF90aXRsZX08L3RpdGxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdGlueV9tY2VfcG9wdXAuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvbWN0YWJzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2Fib3V0LmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBpZD0iYWJvdXQiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KCQk8ZGl2IGNsYXNzPSJ0YWJzIj4KCQkJPHVsPgoJCQkJPGxpIGlkPSJnZW5lcmFsX3RhYiIgY2xhc3M9ImN1cnJlbnQiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWNUYWJzLmRpc3BsYXlUYWIoJ2dlbmVyYWxfdGFiJywnZ2VuZXJhbF9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjYWR2YW5jZWRfZGxnLmFib3V0X2dlbmVyYWx9PC9hPjwvc3Bhbj48L2xpPgoJCQkJPGxpIGlkPSJoZWxwX3RhYiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignaGVscF90YWInLCdoZWxwX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNhZHZhbmNlZF9kbGcuYWJvdXRfaGVscH08L2E+PC9zcGFuPjwvbGk+CgkJCQk8bGkgaWQ9InBsdWdpbnNfdGFiIj48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdwbHVnaW5zX3RhYicsJ3BsdWdpbnNfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I2FkdmFuY2VkX2RsZy5hYm91dF9wbHVnaW5zfTwvYT48L3NwYW4+PC9saT4KCQkJPC91bD4KCQk8L2Rpdj4KCgkJPGRpdiBjbGFzcz0icGFuZWxfd3JhcHBlciI+CgkJCTxkaXYgaWQ9ImdlbmVyYWxfcGFuZWwiIGNsYXNzPSJwYW5lbCBjdXJyZW50Ij4KCQkJCTxoMz57I2FkdmFuY2VkX2RsZy5hYm91dF90aXRsZX08L2gzPgoJCQkJPHA+VmVyc2lvbjogPHNwYW4gaWQ9InZlcnNpb24iPjwvc3Bhbj4gKDxzcGFuIGlkPSJkYXRlIj48L3NwYW4+KTwvcD4KCQkJCTxwPlRpbnlNQ0UgaXMgYSBwbGF0Zm9ybSBpbmRlcGVuZGVudCB3ZWIgYmFzZWQgSmF2YXNjcmlwdCBIVE1MIFdZU0lXWUcgZWRpdG9yIGNvbnRyb2wgcmVsZWFzZWQgYXMgT3BlbiBTb3VyY2UgdW5kZXIgPGEgaHJlZj0iLi4vLi4vbGljZW5zZS50eHQiIHRhcmdldD0iX2JsYW5rIj5MR1BMPC9hPgoJCQkJYnkgTW94aWVjb2RlIFN5c3RlbXMgQUIuIEl0IGhhcyB0aGUgYWJpbGl0eSB0byBjb252ZXJ0IEhUTUwgVEVYVEFSRUEgZmllbGRzIG9yIG90aGVyIEhUTUwgZWxlbWVudHMgdG8gZWRpdG9yIGluc3RhbmNlcy48L3A+CgkJCQk8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMDMtMjAwOCwgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3hpZWNvZGUuY29tIiB0YXJnZXQ9Il9ibGFuayI+TW94aWVjb2RlIFN5c3RlbXMgQUI8L2E+LCBBbGwgcmlnaHRzIHJlc2VydmVkLjwvcD4KCQkJCTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc29mdHdhcmUgdmlzaXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iIHRhcmdldD0iX2JsYW5rIj5UaW55TUNFIHdlYnNpdGU8L2E+LjwvcD4KCgkJCQk8ZGl2IGlkPSJidXR0b25jb250YWluZXIiPgoJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cubW94aWVjb2RlLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3JjPSJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2ltYWdlcy9nb3Rtb3hpZS5wbmciIGFsdD0iR290IE1veGllPyIgYm9yZGVyPSIwIiAvPjwvYT4KCQkJCQk8YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3RpbnltY2UvIiB0YXJnZXQ9Il9ibGFuayI+PGltZyBzcmM9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvc2Zsb2dvLnBocD9ncm91cF9pZD0xMDMyODEiIGFsdD0iSG9zdGVkIEJ5IFNvdXJjZWZvcmdlIiBib3JkZXI9IjAiIC8+PC9hPgoJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuZnJlc2htZWF0Lm5ldC9wcm9qZWN0cy90aW55bWNlIiB0YXJnZXQ9Il9ibGFuayI+PGltZyBzcmM9Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vaW1hZ2VzL2ZtLmdpZiIgYWx0PSJBbHNvIG9uIGZyZXNobWVhdCIgYm9yZGVyPSIwIiAvPjwvYT4KCQkJCTwvZGl2PgoJCQk8L2Rpdj4KCgkJCTxkaXYgaWQ9InBsdWdpbnNfcGFuZWwiIGNsYXNzPSJwYW5lbCI+CgkJCQk8ZGl2IGlkPSJwbHVnaW5zY29udGFpbmVyIj4KCQkJCQk8aDM+eyNhZHZhbmNlZF9kbGcuYWJvdXRfbG9hZGVkfTwvaDM+CgoJCQkJCTxkaXYgaWQ9InBsdWdpbnRhYmxlY29udGFpbmVyIj4KCQkJCQk8L2Rpdj4KCgkJCQkJPHA+Jm5ic3A7PC9wPgoJCQkJPC9kaXY+CgkJCTwvZGl2PgoKCQkJPGRpdiBpZD0iaGVscF9wYW5lbCIgY2xhc3M9InBhbmVsIG5vc2Nyb2xsIiBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7Ij4KCQkJCTxkaXYgaWQ9ImlmcmFtZWNvbnRhaW5lciI+PC9kaXY+CgkJCTwvZGl2PgoJCTwvZGl2PgoKCQk8ZGl2IGNsYXNzPSJtY2VBY3Rpb25QYW5lbCI+CgkJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJjYW5jZWwiIG5hbWU9ImNhbmNlbCIgdmFsdWU9InsjY2xvc2V9IiBvbmNsaWNrPSJ0aW55TUNFUG9wdXAuY2xvc2UoKTsiIC8+CgkJPC9kaXY+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/anchor.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjYWR2YW5jZWRfZGxnLmFuY2hvcl90aXRsZX08L3RpdGxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdGlueV9tY2VfcG9wdXAuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvYW5jaG9yLmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBzdHlsZT0iZGlzcGxheTogbm9uZSI+Cjxmb3JtIG9uc3VibWl0PSJBbmNob3JEaWFsb2cudXBkYXRlKCk7cmV0dXJuIGZhbHNlOyIgYWN0aW9uPSIjIj4KCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CgkJPHRyPgoJCQk8dGQgY29sc3Bhbj0iMiIgY2xhc3M9InRpdGxlIj57I2FkdmFuY2VkX2RsZy5hbmNob3JfdGl0bGV9PC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkIGNsYXNzPSJub3dyYXAiPnsjYWR2YW5jZWRfZGxnLmFuY2hvcl9uYW1lfTo8L3RkPgoJCQk8dGQ+PGlucHV0IG5hbWU9ImFuY2hvck5hbWUiIHR5cGU9InRleHQiIGNsYXNzPSJtY2VGb2N1cyIgaWQ9ImFuY2hvck5hbWUiIHZhbHVlPSIiIHN0eWxlPSJ3aWR0aDogMjAwcHgiIC8+PC90ZD4KCQk8L3RyPgoJPC90YWJsZT4KCgk8ZGl2IGNsYXNzPSJtY2VBY3Rpb25QYW5lbCI+CgkJPGlucHV0IHR5cGU9InN1Ym1pdCIgaWQ9Imluc2VydCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0ieyN1cGRhdGV9IiAvPgoJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJjYW5jZWwiIG5hbWU9ImNhbmNlbCIgdmFsdWU9InsjY2FuY2VsfSIgb25jbGljaz0idGlueU1DRVBvcHVwLmNsb3NlKCk7IiAvPgoJPC9kaXY+CjwvZm9ybT4KPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/charmap.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjYWR2YW5jZWRfZGxnLmNoYXJtYXBfdGl0bGV9PC90aXRsZT4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3RpbnlfbWNlX3BvcHVwLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2NoYXJtYXAuanMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5IGlkPSJjaGFybWFwIiBzdHlsZT0iZGlzcGxheTpub25lIj4KPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KICAgIDx0cj4KICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9InRpdGxlIj57I2FkdmFuY2VkX2RsZy5jaGFybWFwX3RpdGxlfTwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBpZD0iY2hhcm1hcFZpZXciIHJvd3NwYW49IjIiIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+CgkJCTwhLS0gQ2hhcnMgd2lsbCBiZSByZW5kZXJlZCBoZXJlIC0tPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSIxMDAiIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwIiBzdHlsZT0iaGVpZ2h0OjEwMHB4Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9ImNvZGVWIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9ImNvZGVOIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgdmFsaWduPSJib3R0b20iIHN0eWxlPSJwYWRkaW5nLWJvdHRvbTogM3B4OyI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwIiBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJib3JkZXItbGVmdDogMXB4IHNvbGlkICM2NjY2OTk7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjNjY2Njk5OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNjY2Njk5OyI+SFRNTC1Db2RlPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBib3JkZXItbGVmdDogMXB4IHNvbGlkICM2NjY2OTk7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNjY2Njk5OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNjY2Njk5OyIgaWQ9ImNvZGVBIiBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMXB4OyI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJib3JkZXItbGVmdDogMXB4IHNvbGlkICM2NjY2OTk7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjNjY2Njk5OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNjY2Njk5OyI+TlVNLUNvZGU8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzY2NjY5OTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2NjY2OTk7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICM2NjY2OTk7IiBpZD0iY29kZUIiIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgoKPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/color_picker.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjYWR2YW5jZWRfZGxnLmNvbG9ycGlja2VyX3RpdGxlfTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9tY3RhYnMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvY29sb3JfcGlja2VyLmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBpZD0iY29sb3JwaWNrZXIiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KPGZvcm0gb25zdWJtaXQ9Imluc2VydEFjdGlvbigpO3JldHVybiBmYWxzZSIgYWN0aW9uPSIjIj4KCTxkaXYgY2xhc3M9InRhYnMiPgoJCTx1bD4KCQkJPGxpIGlkPSJwaWNrZXJfdGFiIiBjbGFzcz0iY3VycmVudCI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYigncGlja2VyX3RhYicsJ3BpY2tlcl9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjYWR2YW5jZWRfZGxnLmNvbG9ycGlja2VyX3BpY2tlcl90YWJ9PC9hPjwvc3Bhbj48L2xpPgoJCQk8bGkgaWQ9InJnYl90YWIiPjxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgb25jbGljaz0iZ2VuZXJhdGVXZWJDb2xvcnMoKTttY1RhYnMuZGlzcGxheVRhYigncmdiX3RhYicsJ3JnYl9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjYWR2YW5jZWRfZGxnLmNvbG9ycGlja2VyX3BhbGV0dGVfdGFifTwvYT48L3NwYW4+PC9saT4KCQkJPGxpIGlkPSJuYW1lZF90YWIiPjxzcGFuPjxhICBocmVmPSJqYXZhc2NyaXB0OjsiIG9uY2xpY2s9ImdlbmVyYXRlTmFtZWRDb2xvcnMoKTtqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCduYW1lZF90YWInLCduYW1lZF9wYW5lbCcpOyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiPnsjYWR2YW5jZWRfZGxnLmNvbG9ycGlja2VyX25hbWVkX3RhYn08L2E+PC9zcGFuPjwvbGk+CgkJPC91bD4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9InBhbmVsX3dyYXBwZXIiPgoJCTxkaXYgaWQ9InBpY2tlcl9wYW5lbCIgY2xhc3M9InBhbmVsIGN1cnJlbnQiPgoJCQk8ZmllbGRzZXQ+CgkJCQk8bGVnZW5kPnsjYWR2YW5jZWRfZGxnLmNvbG9ycGlja2VyX3BpY2tlcl90aXRsZX08L2xlZ2VuZD4KCQkJCTxkaXYgaWQ9InBpY2tlciI+CgkJCQkJPGltZyBpZD0iY29sb3JzIiBzcmM9ImltZy9jb2xvcnBpY2tlci5qcGciIG9uY2xpY2s9ImNvbXB1dGVDb2xvcihldmVudCkiIG9ubW91c2Vkb3duPSJpc01vdXNlRG93biA9IHRydWU7cmV0dXJuIGZhbHNlOyIgb25tb3VzZXVwPSJpc01vdXNlRG93biA9IGZhbHNlOyIgb25tb3VzZW1vdmU9ImlmIChpc01vdXNlRG93biAmJiBpc01vdXNlT3ZlcikgY29tcHV0ZUNvbG9yKGV2ZW50KTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9ImlzTW91c2VPdmVyPXRydWU7IiBvbm1vdXNlb3V0PSJpc01vdXNlT3Zlcj1mYWxzZTsiIGFsdD0iIiAvPgoKCQkJCQk8ZGl2IGlkPSJsaWdodCI+CgkJCQkJCTwhLS0gV2lsbCBiZSBmaWxsZWQgd2l0aCBkaXZzIC0tPgoJCQkJCTwvZGl2PgoKCQkJCQk8YnIgc3R5bGU9ImNsZWFyOiBib3RoIiAvPgoJCQkJPC9kaXY+CgkJCTwvZmllbGRzZXQ+CgkJPC9kaXY+CgoJCTxkaXYgaWQ9InJnYl9wYW5lbCIgY2xhc3M9InBhbmVsIj4KCQkJPGZpZWxkc2V0PgoJCQkJPGxlZ2VuZD57I2FkdmFuY2VkX2RsZy5jb2xvcnBpY2tlcl9wYWxldHRlX3RpdGxlfTwvbGVnZW5kPgoJCQkJPGRpdiBpZD0id2ViY29sb3JzIj4KCQkJCQk8IS0tIEdldHMgZmlsbGVkIHdpdGggd2ViIHNhZmUgY29sb3JzLS0+CgkJCQk8L2Rpdj4KCgkJCQk8YnIgc3R5bGU9ImNsZWFyOiBib3RoIiAvPgoJCQk8L2ZpZWxkc2V0PgoJCTwvZGl2PgoKCQk8ZGl2IGlkPSJuYW1lZF9wYW5lbCIgY2xhc3M9InBhbmVsIj4KCQkJPGZpZWxkc2V0PgoJCQkJPGxlZ2VuZD57I2FkdmFuY2VkX2RsZy5jb2xvcnBpY2tlcl9uYW1lZF90aXRsZX08L2xlZ2VuZD4KCQkJCTxkaXYgaWQ9Im5hbWVkY29sb3JzIj4KCQkJCQk8IS0tIEdldHMgZmlsbGVkIHdpdGggbmFtZWQgY29sb3JzLS0+CgkJCQk8L2Rpdj4KCgkJCQk8YnIgc3R5bGU9ImNsZWFyOiBib3RoIiAvPgoKCQkJCTxkaXYgaWQ9ImNvbG9ybmFtZWNvbnRhaW5lciI+CgkJCQkJeyNhZHZhbmNlZF9kbGcuY29sb3JwaWNrZXJfbmFtZX0gPHNwYW4gaWQ9ImNvbG9ybmFtZSI+PC9zcGFuPgoJCQkJPC9kaXY+CgkJCTwvZmllbGRzZXQ+CgkJPC9kaXY+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJtY2VBY3Rpb25QYW5lbCI+CgkJPGlucHV0IHR5cGU9InN1Ym1pdCIgaWQ9Imluc2VydCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0ieyNhcHBseX0iIC8+CgoJCTxkaXYgaWQ9InByZXZpZXciPjwvZGl2PgoKCQk8ZGl2IGlkPSJwcmV2aWV3YmxvY2siPgoJCQk8bGFiZWwgZm9yPSJjb2xvciI+eyNhZHZhbmNlZF9kbGcuY29sb3JwaWNrZXJfY29sb3J9PC9sYWJlbD4gPGlucHV0IGlkPSJjb2xvciIgdHlwZT0idGV4dCIgc2l6ZT0iOCIgbWF4bGVuZ3RoPSI4IiBjbGFzcz0idGV4dCBtY2VGb2N1cyIgLz4KCQk8L2Rpdj4KCTwvZGl2Pgo8L2Zvcm0+CjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/editor_template.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGUpe3ZhciBkPWUuRE9NLGI9ZS5kb20uRXZlbnQsaD1lLmV4dGVuZCxmPWUuZWFjaCxhPWUudXRpbC5Db29raWUsZyxjPWUuZXhwbG9kZTtlLlRoZW1lTWFuYWdlci5yZXF1aXJlTGFuZ1BhY2soImFkdmFuY2VkIik7ZS5jcmVhdGUoInRpbnltY2UudGhlbWVzLkFkdmFuY2VkVGhlbWUiLHtzaXplczpbOCwxMCwxMiwxNCwxOCwyNCwzNl0sY29udHJvbHM6e2JvbGQ6WyJib2xkX2Rlc2MiLCJCb2xkIl0saXRhbGljOlsiaXRhbGljX2Rlc2MiLCJJdGFsaWMiXSx1bmRlcmxpbmU6WyJ1bmRlcmxpbmVfZGVzYyIsIlVuZGVybGluZSJdLHN0cmlrZXRocm91Z2g6WyJzdHJpa2V0cm91Z2hfZGVzYyIsIlN0cmlrZXRocm91Z2giXSxqdXN0aWZ5bGVmdDpbImp1c3RpZnlsZWZ0X2Rlc2MiLCJKdXN0aWZ5TGVmdCJdLGp1c3RpZnljZW50ZXI6WyJqdXN0aWZ5Y2VudGVyX2Rlc2MiLCJKdXN0aWZ5Q2VudGVyIl0sanVzdGlmeXJpZ2h0OlsianVzdGlmeXJpZ2h0X2Rlc2MiLCJKdXN0aWZ5UmlnaHQiXSxqdXN0aWZ5ZnVsbDpbImp1c3RpZnlmdWxsX2Rlc2MiLCJKdXN0aWZ5RnVsbCJdLGJ1bGxpc3Q6WyJidWxsaXN0X2Rlc2MiLCJJbnNlcnRVbm9yZGVyZWRMaXN0Il0sbnVtbGlzdDpbIm51bWxpc3RfZGVzYyIsIkluc2VydE9yZGVyZWRMaXN0Il0sb3V0ZGVudDpbIm91dGRlbnRfZGVzYyIsIk91dGRlbnQiXSxpbmRlbnQ6WyJpbmRlbnRfZGVzYyIsIkluZGVudCJdLGN1dDpbImN1dF9kZXNjIiwiQ3V0Il0sY29weTpbImNvcHlfZGVzYyIsIkNvcHkiXSxwYXN0ZTpbInBhc3RlX2Rlc2MiLCJQYXN0ZSJdLHVuZG86WyJ1bmRvX2Rlc2MiLCJVbmRvIl0scmVkbzpbInJlZG9fZGVzYyIsIlJlZG8iXSxsaW5rOlsibGlua19kZXNjIiwibWNlTGluayJdLHVubGluazpbInVubGlua19kZXNjIiwidW5saW5rIl0saW1hZ2U6WyJpbWFnZV9kZXNjIiwibWNlSW1hZ2UiXSxjbGVhbnVwOlsiY2xlYW51cF9kZXNjIiwibWNlQ2xlYW51cCJdLGhlbHA6WyJoZWxwX2Rlc2MiLCJtY2VIZWxwIl0sY29kZTpbImNvZGVfZGVzYyIsIm1jZUNvZGVFZGl0b3IiXSxocjpbImhyX2Rlc2MiLCJJbnNlcnRIb3Jpem9udGFsUnVsZSJdLHJlbW92ZWZvcm1hdDpbInJlbW92ZWZvcm1hdF9kZXNjIiwiUmVtb3ZlRm9ybWF0Il0sc3ViOlsic3ViX2Rlc2MiLCJzdWJzY3JpcHQiXSxzdXA6WyJzdXBfZGVzYyIsInN1cGVyc2NyaXB0Il0sZm9yZWNvbG9yOlsiZm9yZWNvbG9yX2Rlc2MiLCJGb3JlQ29sb3IiXSxmb3JlY29sb3JwaWNrZXI6WyJmb3JlY29sb3JfZGVzYyIsIm1jZUZvcmVDb2xvciJdLGJhY2tjb2xvcjpbImJhY2tjb2xvcl9kZXNjIiwiSGlsaXRlQ29sb3IiXSxiYWNrY29sb3JwaWNrZXI6WyJiYWNrY29sb3JfZGVzYyIsIm1jZUJhY2tDb2xvciJdLGNoYXJtYXA6WyJjaGFybWFwX2Rlc2MiLCJtY2VDaGFyTWFwIl0sdmlzdWFsYWlkOlsidmlzdWFsYWlkX2Rlc2MiLCJtY2VUb2dnbGVWaXN1YWxBaWQiXSxhbmNob3I6WyJhbmNob3JfZGVzYyIsIm1jZUluc2VydEFuY2hvciJdLG5ld2RvY3VtZW50OlsibmV3ZG9jdW1lbnRfZGVzYyIsIm1jZU5ld0RvY3VtZW50Il0sYmxvY2txdW90ZTpbImJsb2NrcXVvdGVfZGVzYyIsIm1jZUJsb2NrUXVvdGUiXX0sc3RhdGVDb250cm9sczpbImJvbGQiLCJpdGFsaWMiLCJ1bmRlcmxpbmUiLCJzdHJpa2V0aHJvdWdoIiwiYnVsbGlzdCIsIm51bWxpc3QiLCJqdXN0aWZ5bGVmdCIsImp1c3RpZnljZW50ZXIiLCJqdXN0aWZ5cmlnaHQiLCJqdXN0aWZ5ZnVsbCIsInN1YiIsInN1cCIsImJsb2NrcXVvdGUiXSxpbml0OmZ1bmN0aW9uKGosayl7dmFyIGw9dGhpcyxtLGksbjtsLmVkaXRvcj1qO2wudXJsPWs7bC5vblJlc29sdmVOYW1lPW5ldyBlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTtsLnNldHRpbmdzPW09aCh7dGhlbWVfYWR2YW5jZWRfcGF0aDp0cnVlLHRoZW1lX2FkdmFuY2VkX3Rvb2xiYXJfbG9jYXRpb246ImJvdHRvbSIsdGhlbWVfYWR2YW5jZWRfYnV0dG9uczE6ImJvbGQsaXRhbGljLHVuZGVybGluZSxzdHJpa2V0aHJvdWdoLHwsanVzdGlmeWxlZnQsanVzdGlmeWNlbnRlcixqdXN0aWZ5cmlnaHQsanVzdGlmeWZ1bGwsfCxzdHlsZXNlbGVjdCxmb3JtYXRzZWxlY3QiLHRoZW1lX2FkdmFuY2VkX2J1dHRvbnMyOiJidWxsaXN0LG51bWxpc3QsfCxvdXRkZW50LGluZGVudCx8LHVuZG8scmVkbyx8LGxpbmssdW5saW5rLGFuY2hvcixpbWFnZSxjbGVhbnVwLGhlbHAsY29kZSIsdGhlbWVfYWR2YW5jZWRfYnV0dG9uczM6ImhyLHJlbW92ZWZvcm1hdCx2aXN1YWxhaWQsfCxzdWIsc3VwLHwsY2hhcm1hcCIsdGhlbWVfYWR2YW5jZWRfYmxvY2tmb3JtYXRzOiJwLGFkZHJlc3MscHJlLGgxLGgyLGgzLGg0LGg1LGg2Iix0aGVtZV9hZHZhbmNlZF90b29sYmFyX2FsaWduOiJjZW50ZXIiLHRoZW1lX2FkdmFuY2VkX2ZvbnRzOiJBbmRhbGUgTW9ubz1hbmRhbGUgbW9ubyx0aW1lcztBcmlhbD1hcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjtBcmlhbCBCbGFjaz1hcmlhbCBibGFjayxhdmFudCBnYXJkZTtCb29rIEFudGlxdWE9Ym9vayBhbnRpcXVhLHBhbGF0aW5vO0NvbWljIFNhbnMgTVM9Y29taWMgc2FucyBtcyxzYW5zLXNlcmlmO0NvdXJpZXIgTmV3PWNvdXJpZXIgbmV3LGNvdXJpZXI7R2VvcmdpYT1nZW9yZ2lhLHBhbGF0aW5vO0hlbHZldGljYT1oZWx2ZXRpY2E7SW1wYWN0PWltcGFjdCxjaGljYWdvO1N5bWJvbD1zeW1ib2w7VGFob21hPXRhaG9tYSxhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjtUZXJtaW5hbD10ZXJtaW5hbCxtb25hY287VGltZXMgTmV3IFJvbWFuPXRpbWVzIG5ldyByb21hbix0aW1lcztUcmVidWNoZXQgTVM9dHJlYnVjaGV0IG1zLGdlbmV2YTtWZXJkYW5hPXZlcmRhbmEsZ2VuZXZhO1dlYmRpbmdzPXdlYmRpbmdzO1dpbmdkaW5ncz13aW5nZGluZ3MsemFwZiBkaW5nYmF0cyIsdGhlbWVfYWR2YW5jZWRfbW9yZV9jb2xvcnM6MSx0aGVtZV9hZHZhbmNlZF9yb3dfaGVpZ2h0OjIzLHRoZW1lX2FkdmFuY2VkX3Jlc2l6ZV9ob3Jpem9udGFsOjEsdGhlbWVfYWR2YW5jZWRfcmVzaXppbmdfdXNlX2Nvb2tpZToxLHRoZW1lX2FkdmFuY2VkX2ZvbnRfc2l6ZXM6IjEsMiwzLDQsNSw2LDciLHJlYWRvbmx5Omouc2V0dGluZ3MucmVhZG9ubHl9LGouc2V0dGluZ3MpO2lmKCFtLmZvbnRfc2l6ZV9zdHlsZV92YWx1ZXMpe20uZm9udF9zaXplX3N0eWxlX3ZhbHVlcz0iOHB0LDEwcHQsMTJwdCwxNHB0LDE4cHQsMjRwdCwzNnB0In1pZihlLmlzKG0udGhlbWVfYWR2YW5jZWRfZm9udF9zaXplcywic3RyaW5nIikpe20uZm9udF9zaXplX3N0eWxlX3ZhbHVlcz1lLmV4cGxvZGUobS5mb250X3NpemVfc3R5bGVfdmFsdWVzKTttLmZvbnRfc2l6ZV9jbGFzc2VzPWUuZXhwbG9kZShtLmZvbnRfc2l6ZV9jbGFzc2VzfHwiIik7bj17fTtqLnNldHRpbmdzLnRoZW1lX2FkdmFuY2VkX2ZvbnRfc2l6ZXM9bS50aGVtZV9hZHZhbmNlZF9mb250X3NpemVzO2Yoai5nZXRQYXJhbSgidGhlbWVfYWR2YW5jZWRfZm9udF9zaXplcyIsIiIsImhhc2giKSxmdW5jdGlvbihxLHApe3ZhciBvO2lmKHA9PXEmJnE+PTEmJnE8PTcpe3A9cSsiICgiK2wuc2l6ZXNbcS0xXSsicHQpIjtvPW0uZm9udF9zaXplX2NsYXNzZXNbcS0xXTtxPW0uZm9udF9zaXplX3N0eWxlX3ZhbHVlc1txLTFdfHwobC5zaXplc1txLTFdKyJwdCIpfWlmKC9eXHMqXC4vLnRlc3QocSkpe289cS5yZXBsYWNlKC9cLi9nLCIiKX1uW3BdPW8/eyJjbGFzcyI6b306e2ZvbnRTaXplOnF9fSk7bS50aGVtZV9hZHZhbmNlZF9mb250X3NpemVzPW59aWYoKGk9bS50aGVtZV9hZHZhbmNlZF9wYXRoX2xvY2F0aW9uKSYmaSE9Im5vbmUiKXttLnRoZW1lX2FkdmFuY2VkX3N0YXR1c2Jhcl9sb2NhdGlvbj1tLnRoZW1lX2FkdmFuY2VkX3BhdGhfbG9jYXRpb259aWYobS50aGVtZV9hZHZhbmNlZF9zdGF0dXNiYXJfbG9jYXRpb249PSJub25lIil7bS50aGVtZV9hZHZhbmNlZF9zdGF0dXNiYXJfbG9jYXRpb249MH1qLm9uSW5pdC5hZGQoZnVuY3Rpb24oKXtpZighai5zZXR0aW5ncy5yZWFkb25seSl7ai5vbk5vZGVDaGFuZ2UuYWRkKGwuX25vZGVDaGFuZ2VkLGwpfWlmKGouc2V0dGluZ3MuY29udGVudF9jc3MhPT1mYWxzZSl7ai5kb20ubG9hZENTUyhqLmJhc2VVUkkudG9BYnNvbHV0ZShrKyIvc2tpbnMvIitqLnNldHRpbmdzLnNraW4rIi9jb250ZW50LmNzcyIpKX19KTtqLm9uU2V0UHJvZ3Jlc3NTdGF0ZS5hZGQoZnVuY3Rpb24ocSxvLHIpe3ZhciBzLHQ9cS5pZCxwO2lmKG8pe2wucHJvZ3Jlc3NUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cz1xLmdldENvbnRhaW5lcigpO3M9cy5pbnNlcnRCZWZvcmUoZC5jcmVhdGUoIkRJViIse3N0eWxlOiJwb3NpdGlvbjpyZWxhdGl2ZSJ9KSxzLmZpcnN0Q2hpbGQpO3A9ZC5nZXQocS5pZCsiX3RibCIpO2QuYWRkKHMsImRpdiIse2lkOnQrIl9ibG9ja2VyIiwiY2xhc3MiOiJtY2VCbG9ja2VyIixzdHlsZTp7d2lkdGg6cC5jbGllbnRXaWR0aCsyLGhlaWdodDpwLmNsaWVudEhlaWdodCsyfX0pO2QuYWRkKHMsImRpdiIse2lkOnQrIl9wcm9ncmVzcyIsImNsYXNzIjoibWNlUHJvZ3Jlc3MiLHN0eWxlOntsZWZ0OnAuY2xpZW50V2lkdGgvMix0b3A6cC5jbGllbnRIZWlnaHQvMn19KX0scnx8MCl9ZWxzZXtkLnJlbW92ZSh0KyJfYmxvY2tlciIpO2QucmVtb3ZlKHQrIl9wcm9ncmVzcyIpO2NsZWFyVGltZW91dChsLnByb2dyZXNzVGltZXIpfX0pO2QubG9hZENTUyhtLmVkaXRvcl9jc3M/ai5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShtLmVkaXRvcl9jc3MpOmsrIi9za2lucy8iK2ouc2V0dGluZ3Muc2tpbisiL3VpLmNzcyIpO2lmKG0uc2tpbl92YXJpYW50KXtkLmxvYWRDU1MoaysiL3NraW5zLyIrai5zZXR0aW5ncy5za2luKyIvdWlfIittLnNraW5fdmFyaWFudCsiLmNzcyIpfX0sY3JlYXRlQ29udHJvbDpmdW5jdGlvbihsLGkpe3ZhciBqLGs7aWYoaz1pLmNyZWF0ZUNvbnRyb2wobCkpe3JldHVybiBrfXN3aXRjaChsKXtjYXNlInN0eWxlc2VsZWN0IjpyZXR1cm4gdGhpcy5fY3JlYXRlU3R5bGVTZWxlY3QoKTtjYXNlImZvcm1hdHNlbGVjdCI6cmV0dXJuIHRoaXMuX2NyZWF0ZUJsb2NrRm9ybWF0cygpO2Nhc2UiZm9udHNlbGVjdCI6cmV0dXJuIHRoaXMuX2NyZWF0ZUZvbnRTZWxlY3QoKTtjYXNlImZvbnRzaXplc2VsZWN0IjpyZXR1cm4gdGhpcy5fY3JlYXRlRm9udFNpemVTZWxlY3QoKTtjYXNlImZvcmVjb2xvciI6cmV0dXJuIHRoaXMuX2NyZWF0ZUZvcmVDb2xvck1lbnUoKTtjYXNlImJhY2tjb2xvciI6cmV0dXJuIHRoaXMuX2NyZWF0ZUJhY2tDb2xvck1lbnUoKX1pZigoaj10aGlzLmNvbnRyb2xzW2xdKSl7cmV0dXJuIGkuY3JlYXRlQnV0dG9uKGwse3RpdGxlOiJhZHZhbmNlZC4iK2pbMF0sY21kOmpbMV0sdWk6alsyXSx2YWx1ZTpqWzNdfSl9fSxleGVjQ29tbWFuZDpmdW5jdGlvbihrLGosbCl7dmFyIGk9dGhpc1siXyIra107aWYoaSl7aS5jYWxsKHRoaXMsaixsKTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9LF9pbXBvcnRDbGFzc2VzOmZ1bmN0aW9uKGspe3ZhciBpPXRoaXMuZWRpdG9yLGo9aS5jb250cm9sTWFuYWdlci5nZXQoInN0eWxlc2VsZWN0Iik7aWYoai5nZXRMZW5ndGgoKT09MCl7ZihpLmRvbS5nZXRDbGFzc2VzKCksZnVuY3Rpb24obixsKXt2YXIgbT0ic3R5bGVfIitsO2kuZm9ybWF0dGVyLnJlZ2lzdGVyKG0se2lubGluZToic3BhbiIsYXR0cmlidXRlczp7ImNsYXNzIjpuWyJjbGFzcyJdfSxzZWxlY3RvcjoiKiJ9KTtqLmFkZChuWyJjbGFzcyJdLG0pfSl9fSxfY3JlYXRlU3R5bGVTZWxlY3Q6ZnVuY3Rpb24obSl7dmFyIGs9dGhpcyxpPWsuZWRpdG9yLGo9aS5jb250cm9sTWFuYWdlcixsO2w9ai5jcmVhdGVMaXN0Qm94KCJzdHlsZXNlbGVjdCIse3RpdGxlOiJhZHZhbmNlZC5zdHlsZV9zZWxlY3QiLG9uc2VsZWN0OmZ1bmN0aW9uKG8pe3ZhciBwLG49W107ZihsLml0ZW1zLGZ1bmN0aW9uKHEpe24ucHVzaChxLnZhbHVlKX0pO2kuZm9jdXMoKTtpLnVuZG9NYW5hZ2VyLmFkZCgpO3A9aS5mb3JtYXR0ZXIubWF0Y2hBbGwobik7aWYoIW98fHBbMF09PW8pe2kuZm9ybWF0dGVyLnJlbW92ZShwWzBdKX1lbHNle2kuZm9ybWF0dGVyLmFwcGx5KG8pfWkudW5kb01hbmFnZXIuYWRkKCk7aS5ub2RlQ2hhbmdlZCgpO3JldHVybiBmYWxzZX19KTtpLm9uSW5pdC5hZGQoZnVuY3Rpb24oKXt2YXIgbz0wLG49aS5nZXRQYXJhbSgic3R5bGVfZm9ybWF0cyIpO2lmKG4pe2YobixmdW5jdGlvbihwKXt2YXIgcSxyPTA7ZihwLGZ1bmN0aW9uKCl7cisrfSk7aWYocj4xKXtxPXAubmFtZT1wLm5hbWV8fCJzdHlsZV8iKyhvKyspO2kuZm9ybWF0dGVyLnJlZ2lzdGVyKHEscCk7bC5hZGQocC50aXRsZSxxKX1lbHNle2wuYWRkKHAudGl0bGUpfX0pfWVsc2V7ZihpLmdldFBhcmFtKCJ0aGVtZV9hZHZhbmNlZF9zdHlsZXMiLCIiLCJoYXNoIiksZnVuY3Rpb24ocixxKXt2YXIgcDtpZihyKXtwPSJzdHlsZV8iKyhvKyspO2kuZm9ybWF0dGVyLnJlZ2lzdGVyKHAse2lubGluZToic3BhbiIsY2xhc3NlczpyLHNlbGVjdG9yOiIqIn0pO2wuYWRkKGsuZWRpdG9yLnRyYW5zbGF0ZShxKSxwKX19KX19KTtpZihsLmdldExlbmd0aCgpPT0wKXtsLm9uUG9zdFJlbmRlci5hZGQoZnVuY3Rpb24obyxwKXtpZighbC5OYXRpdmVMaXN0Qm94KXtiLmFkZChwLmlkKyJfdGV4dCIsImZvY3VzIixrLl9pbXBvcnRDbGFzc2VzLGspO2IuYWRkKHAuaWQrIl90ZXh0IiwibW91c2Vkb3duIixrLl9pbXBvcnRDbGFzc2VzLGspO2IuYWRkKHAuaWQrIl9vcGVuIiwiZm9jdXMiLGsuX2ltcG9ydENsYXNzZXMsayk7Yi5hZGQocC5pZCsiX29wZW4iLCJtb3VzZWRvd24iLGsuX2ltcG9ydENsYXNzZXMsayl9ZWxzZXtiLmFkZChwLmlkLCJmb2N1cyIsay5faW1wb3J0Q2xhc3NlcyxrKX19KX1yZXR1cm4gbH0sX2NyZWF0ZUZvbnRTZWxlY3Q6ZnVuY3Rpb24oKXt2YXIgayxqPXRoaXMsaT1qLmVkaXRvcjtrPWkuY29udHJvbE1hbmFnZXIuY3JlYXRlTGlzdEJveCgiZm9udHNlbGVjdCIse3RpdGxlOiJhZHZhbmNlZC5mb250ZGVmYXVsdCIsb25zZWxlY3Q6ZnVuY3Rpb24obCl7dmFyIG09ay5pdGVtc1trLnNlbGVjdGVkSW5kZXhdO2lmKCFsJiZtKXtpLmV4ZWNDb21tYW5kKCJGb250TmFtZSIsZmFsc2UsbS52YWx1ZSk7cmV0dXJufWkuZXhlY0NvbW1hbmQoIkZvbnROYW1lIixmYWxzZSxsKTtrLnNlbGVjdChmdW5jdGlvbihuKXtyZXR1cm4gbD09bn0pO3JldHVybiBmYWxzZX19KTtpZihrKXtmKGkuZ2V0UGFyYW0oInRoZW1lX2FkdmFuY2VkX2ZvbnRzIixqLnNldHRpbmdzLnRoZW1lX2FkdmFuY2VkX2ZvbnRzLCJoYXNoIiksZnVuY3Rpb24obSxsKXtrLmFkZChpLnRyYW5zbGF0ZShsKSxtLHtzdHlsZTptLmluZGV4T2YoImRpbmdzIik9PS0xPyJmb250LWZhbWlseToiK206IiJ9KX0pfXJldHVybiBrfSxfY3JlYXRlRm9udFNpemVTZWxlY3Q6ZnVuY3Rpb24oKXt2YXIgbT10aGlzLGs9bS5lZGl0b3IsbixsPTAsaj1bXTtuPWsuY29udHJvbE1hbmFnZXIuY3JlYXRlTGlzdEJveCgiZm9udHNpemVzZWxlY3QiLHt0aXRsZToiYWR2YW5jZWQuZm9udF9zaXplIixvbnNlbGVjdDpmdW5jdGlvbihpKXt2YXIgbz1uLml0ZW1zW24uc2VsZWN0ZWRJbmRleF07aWYoIWkmJm8pe289by52YWx1ZTtpZihvWyJjbGFzcyJdKXtrLmZvcm1hdHRlci50b2dnbGUoImZvbnRzaXplX2NsYXNzIix7dmFsdWU6b1siY2xhc3MiXX0pO2sudW5kb01hbmFnZXIuYWRkKCk7ay5ub2RlQ2hhbmdlZCgpfWVsc2V7ay5leGVjQ29tbWFuZCgiRm9udFNpemUiLGZhbHNlLG8uZm9udFNpemUpfXJldHVybn1pZihpWyJjbGFzcyJdKXtrLmZvY3VzKCk7ay51bmRvTWFuYWdlci5hZGQoKTtrLmZvcm1hdHRlci50b2dnbGUoImZvbnRzaXplX2NsYXNzIix7dmFsdWU6aVsiY2xhc3MiXX0pO2sudW5kb01hbmFnZXIuYWRkKCk7ay5ub2RlQ2hhbmdlZCgpfWVsc2V7ay5leGVjQ29tbWFuZCgiRm9udFNpemUiLGZhbHNlLGkuZm9udFNpemUpfW4uc2VsZWN0KGZ1bmN0aW9uKHApe3JldHVybiBpPT1wfSk7cmV0dXJuIGZhbHNlfX0pO2lmKG4pe2YobS5zZXR0aW5ncy50aGVtZV9hZHZhbmNlZF9mb250X3NpemVzLGZ1bmN0aW9uKG8saSl7dmFyIHA9by5mb250U2l6ZTtpZihwPj0xJiZwPD03KXtwPW0uc2l6ZXNbcGFyc2VJbnQocCktMV0rInB0In1uLmFkZChpLG8se3N0eWxlOiJmb250LXNpemU6IitwLCJjbGFzcyI6Im1jZUZvbnRTaXplIisobCsrKSsoIiAiKyhvWyJjbGFzcyJdfHwiIikpfSl9KX1yZXR1cm4gbn0sX2NyZWF0ZUJsb2NrRm9ybWF0czpmdW5jdGlvbigpe3ZhciBrLGk9e3A6ImFkdmFuY2VkLnBhcmFncmFwaCIsYWRkcmVzczoiYWR2YW5jZWQuYWRkcmVzcyIscHJlOiJhZHZhbmNlZC5wcmUiLGgxOiJhZHZhbmNlZC5oMSIsaDI6ImFkdmFuY2VkLmgyIixoMzoiYWR2YW5jZWQuaDMiLGg0OiJhZHZhbmNlZC5oNCIsaDU6ImFkdmFuY2VkLmg1IixoNjoiYWR2YW5jZWQuaDYiLGRpdjoiYWR2YW5jZWQuZGl2IixibG9ja3F1b3RlOiJhZHZhbmNlZC5ibG9ja3F1b3RlIixjb2RlOiJhZHZhbmNlZC5jb2RlIixkdDoiYWR2YW5jZWQuZHQiLGRkOiJhZHZhbmNlZC5kZCIsc2FtcDoiYWR2YW5jZWQuc2FtcCJ9LGo9dGhpcztrPWouZWRpdG9yLmNvbnRyb2xNYW5hZ2VyLmNyZWF0ZUxpc3RCb3goImZvcm1hdHNlbGVjdCIse3RpdGxlOiJhZHZhbmNlZC5ibG9jayIsY21kOiJGb3JtYXRCbG9jayJ9KTtpZihrKXtmKGouZWRpdG9yLmdldFBhcmFtKCJ0aGVtZV9hZHZhbmNlZF9ibG9ja2Zvcm1hdHMiLGouc2V0dGluZ3MudGhlbWVfYWR2YW5jZWRfYmxvY2tmb3JtYXRzLCJoYXNoIiksZnVuY3Rpb24obSxsKXtrLmFkZChqLmVkaXRvci50cmFuc2xhdGUobCE9bT9sOmlbbV0pLG0seyJjbGFzcyI6Im1jZV9mb3JtYXRQcmV2aWV3IG1jZV8iK219KX0pfXJldHVybiBrfSxfY3JlYXRlRm9yZUNvbG9yTWVudTpmdW5jdGlvbigpe3ZhciBtLGo9dGhpcyxrPWouc2V0dGluZ3MsbD17fSxpO2lmKGsudGhlbWVfYWR2YW5jZWRfbW9yZV9jb2xvcnMpe2wubW9yZV9jb2xvcnNfZnVuYz1mdW5jdGlvbigpe2ouX21jZUNvbG9yUGlja2VyKDAse2NvbG9yOm0udmFsdWUsZnVuYzpmdW5jdGlvbihuKXttLnNldENvbG9yKG4pfX0pfX1pZihpPWsudGhlbWVfYWR2YW5jZWRfdGV4dF9jb2xvcnMpe2wuY29sb3JzPWl9aWYoay50aGVtZV9hZHZhbmNlZF9kZWZhdWx0X2ZvcmVncm91bmRfY29sb3Ipe2wuZGVmYXVsdF9jb2xvcj1rLnRoZW1lX2FkdmFuY2VkX2RlZmF1bHRfZm9yZWdyb3VuZF9jb2xvcn1sLnRpdGxlPSJhZHZhbmNlZC5mb3JlY29sb3JfZGVzYyI7bC5jbWQ9IkZvcmVDb2xvciI7bC5zY29wZT10aGlzO209ai5lZGl0b3IuY29udHJvbE1hbmFnZXIuY3JlYXRlQ29sb3JTcGxpdEJ1dHRvbigiZm9yZWNvbG9yIixsKTtyZXR1cm4gbX0sX2NyZWF0ZUJhY2tDb2xvck1lbnU6ZnVuY3Rpb24oKXt2YXIgbSxqPXRoaXMsaz1qLnNldHRpbmdzLGw9e30saTtpZihrLnRoZW1lX2FkdmFuY2VkX21vcmVfY29sb3JzKXtsLm1vcmVfY29sb3JzX2Z1bmM9ZnVuY3Rpb24oKXtqLl9tY2VDb2xvclBpY2tlcigwLHtjb2xvcjptLnZhbHVlLGZ1bmM6ZnVuY3Rpb24obil7bS5zZXRDb2xvcihuKX19KX19aWYoaT1rLnRoZW1lX2FkdmFuY2VkX2JhY2tncm91bmRfY29sb3JzKXtsLmNvbG9ycz1pfWlmKGsudGhlbWVfYWR2YW5jZWRfZGVmYXVsdF9iYWNrZ3JvdW5kX2NvbG9yKXtsLmRlZmF1bHRfY29sb3I9ay50aGVtZV9hZHZhbmNlZF9kZWZhdWx0X2JhY2tncm91bmRfY29sb3J9bC50aXRsZT0iYWR2YW5jZWQuYmFja2NvbG9yX2Rlc2MiO2wuY21kPSJIaWxpdGVDb2xvciI7bC5zY29wZT10aGlzO209ai5lZGl0b3IuY29udHJvbE1hbmFnZXIuY3JlYXRlQ29sb3JTcGxpdEJ1dHRvbigiYmFja2NvbG9yIixsKTtyZXR1cm4gbX0scmVuZGVyVUk6ZnVuY3Rpb24oayl7dmFyIG0sbCxxLHY9dGhpcyxyPXYuZWRpdG9yLHc9di5zZXR0aW5ncyx1LGosaTttPWo9ZC5jcmVhdGUoInNwYW4iLHtpZDpyLmlkKyJfcGFyZW50IiwiY2xhc3MiOiJtY2VFZGl0b3IgIityLnNldHRpbmdzLnNraW4rIlNraW4iKyh3LnNraW5fdmFyaWFudD8iICIrci5zZXR0aW5ncy5za2luKyJTa2luIit2Ll91Zmlyc3Qody5za2luX3ZhcmlhbnQpOiIiKX0pO2lmKCFkLmJveE1vZGVsKXttPWQuYWRkKG0sImRpdiIseyJjbGFzcyI6Im1jZU9sZEJveE1vZGVsIn0pfW09dT1kLmFkZChtLCJ0YWJsZSIse2lkOnIuaWQrIl90YmwiLCJjbGFzcyI6Im1jZUxheW91dCIsY2VsbFNwYWNpbmc6MCxjZWxsUGFkZGluZzowfSk7bT1xPWQuYWRkKG0sInRib2R5Iik7c3dpdGNoKCh3LnRoZW1lX2FkdmFuY2VkX2xheW91dF9tYW5hZ2VyfHwiIikudG9Mb3dlckNhc2UoKSl7Y2FzZSJyb3dsYXlvdXQiOmw9di5fcm93TGF5b3V0KHcscSxrKTticmVhaztjYXNlImN1c3RvbWxheW91dCI6bD1yLmV4ZWNDYWxsYmFjaygidGhlbWVfYWR2YW5jZWRfY3VzdG9tX2xheW91dCIsdyxxLGssaik7YnJlYWs7ZGVmYXVsdDpsPXYuX3NpbXBsZUxheW91dCh3LHEsayxqKX1tPWsudGFyZ2V0Tm9kZTtpPWQuc3RkTW9kZT91LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ciIpOnUucm93cztkLmFkZENsYXNzKGlbMF0sIm1jZUZpcnN0Iik7ZC5hZGRDbGFzcyhpW2kubGVuZ3RoLTFdLCJtY2VMYXN0Iik7ZihkLnNlbGVjdCgidHIiLHEpLGZ1bmN0aW9uKG8pe2QuYWRkQ2xhc3Moby5maXJzdENoaWxkLCJtY2VGaXJzdCIpO2QuYWRkQ2xhc3Moby5jaGlsZE5vZGVzW28uY2hpbGROb2Rlcy5sZW5ndGgtMV0sIm1jZUxhc3QiKX0pO2lmKGQuZ2V0KHcudGhlbWVfYWR2YW5jZWRfdG9vbGJhcl9jb250YWluZXIpKXtkLmdldCh3LnRoZW1lX2FkdmFuY2VkX3Rvb2xiYXJfY29udGFpbmVyKS5hcHBlbmRDaGlsZChqKX1lbHNle2QuaW5zZXJ0QWZ0ZXIoaixtKX1iLmFkZChyLmlkKyJfcGF0aF9yb3ciLCJjbGljayIsZnVuY3Rpb24obil7bj1uLnRhcmdldDtpZihuLm5vZGVOYW1lPT0iQSIpe3YuX3NlbChuLmNsYXNzTmFtZS5yZXBsYWNlKC9eLiptY2VQYXRoXyhbMC05XSspLiokLywiJDEiKSk7cmV0dXJuIGIuY2FuY2VsKG4pfX0pO2lmKCFyLmdldFBhcmFtKCJhY2Nlc3NpYmlsaXR5X2ZvY3VzIikpe2IuYWRkKGQuYWRkKGosImEiLHtocmVmOiIjIn0sIjwhLS0gSUUgLS0+IiksImZvY3VzIixmdW5jdGlvbigpe3RpbnlNQ0UuZ2V0KHIuaWQpLmZvY3VzKCl9KX1pZih3LnRoZW1lX2FkdmFuY2VkX3Rvb2xiYXJfbG9jYXRpb249PSJleHRlcm5hbCIpe2suZGVsdGFIZWlnaHQ9MH12LmRlbHRhSGVpZ2h0PWsuZGVsdGFIZWlnaHQ7ay50YXJnZXROb2RlPW51bGw7cmV0dXJue2lmcmFtZUNvbnRhaW5lcjpsLGVkaXRvckNvbnRhaW5lcjpyLmlkKyJfcGFyZW50IixzaXplQ29udGFpbmVyOnUsZGVsdGFIZWlnaHQ6ay5kZWx0YUhlaWdodH19LGdldEluZm86ZnVuY3Rpb24oKXtyZXR1cm57bG9uZ25hbWU6IkFkdmFuY2VkIHRoZW1lIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLHZlcnNpb246ZS5tYWpvclZlcnNpb24rIi4iK2UubWlub3JWZXJzaW9ufX0scmVzaXplQnk6ZnVuY3Rpb24oaSxqKXt2YXIgaz1kLmdldCh0aGlzLmVkaXRvci5pZCsiX3RibCIpO3RoaXMucmVzaXplVG8oay5jbGllbnRXaWR0aCtpLGsuY2xpZW50SGVpZ2h0K2opfSxyZXNpemVUbzpmdW5jdGlvbihpLG0sayl7dmFyIGo9dGhpcy5lZGl0b3IsbD10aGlzLnNldHRpbmdzLG49ZC5nZXQoai5pZCsiX3RibCIpLG89ZC5nZXQoai5pZCsiX2lmciIpO2k9TWF0aC5tYXgobC50aGVtZV9hZHZhbmNlZF9yZXNpemluZ19taW5fd2lkdGh8fDEwMCxpKTttPU1hdGgubWF4KGwudGhlbWVfYWR2YW5jZWRfcmVzaXppbmdfbWluX2hlaWdodHx8MTAwLG0pO2k9TWF0aC5taW4obC50aGVtZV9hZHZhbmNlZF9yZXNpemluZ19tYXhfd2lkdGh8fDY1NTM1LGkpO209TWF0aC5taW4obC50aGVtZV9hZHZhbmNlZF9yZXNpemluZ19tYXhfaGVpZ2h0fHw2NTUzNSxtKTtkLnNldFN0eWxlKG4sImhlaWdodCIsIiIpO2Quc2V0U3R5bGUobywiaGVpZ2h0IixtKTtpZihsLnRoZW1lX2FkdmFuY2VkX3Jlc2l6ZV9ob3Jpem9udGFsKXtkLnNldFN0eWxlKG4sIndpZHRoIiwiIik7ZC5zZXRTdHlsZShvLCJ3aWR0aCIsaSk7aWYoaTxuLmNsaWVudFdpZHRoKXtpPW4uY2xpZW50V2lkdGg7ZC5zZXRTdHlsZShvLCJ3aWR0aCIsbi5jbGllbnRXaWR0aCl9fWlmKGsmJmwudGhlbWVfYWR2YW5jZWRfcmVzaXppbmdfdXNlX2Nvb2tpZSl7YS5zZXRIYXNoKCJUaW55TUNFXyIrai5pZCsiX3NpemUiLHtjdzppLGNoOm19KX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmVkaXRvci5pZDtiLmNsZWFyKGkrIl9yZXNpemUiKTtiLmNsZWFyKGkrIl9wYXRoX3JvdyIpO2IuY2xlYXIoaSsiX2V4dGVybmFsX2Nsb3NlIil9LF9zaW1wbGVMYXlvdXQ6ZnVuY3Rpb24oeSxyLGssaSl7dmFyIHg9dGhpcyx1PXguZWRpdG9yLHY9eS50aGVtZV9hZHZhbmNlZF90b29sYmFyX2xvY2F0aW9uLG09eS50aGVtZV9hZHZhbmNlZF9zdGF0dXNiYXJfbG9jYXRpb24sbCxqLHEsdztpZih5LnJlYWRvbmx5KXtsPWQuYWRkKHIsInRyIik7bD1qPWQuYWRkKGwsInRkIix7ImNsYXNzIjoibWNlSWZyYW1lQ29udGFpbmVyIn0pO3JldHVybiBqfWlmKHY9PSJ0b3AiKXt4Ll9hZGRUb29sYmFycyhyLGspfWlmKHY9PSJleHRlcm5hbCIpe2w9dz1kLmNyZWF0ZSgiZGl2Iix7c3R5bGU6InBvc2l0aW9uOnJlbGF0aXZlIn0pO2w9ZC5hZGQobCwiZGl2Iix7aWQ6dS5pZCsiX2V4dGVybmFsIiwiY2xhc3MiOiJtY2VFeHRlcm5hbFRvb2xiYXIifSk7ZC5hZGQobCwiYSIse2lkOnUuaWQrIl9leHRlcm5hbF9jbG9zZSIsaHJlZjoiamF2YXNjcmlwdDo7IiwiY2xhc3MiOiJtY2VFeHRlcm5hbENsb3NlIn0pO2w9ZC5hZGQobCwidGFibGUiLHtpZDp1LmlkKyJfdGJsZXh0IixjZWxsU3BhY2luZzowLGNlbGxQYWRkaW5nOjB9KTtxPWQuYWRkKGwsInRib2R5Iik7aWYoaS5maXJzdENoaWxkLmNsYXNzTmFtZT09Im1jZU9sZEJveE1vZGVsIil7aS5maXJzdENoaWxkLmFwcGVuZENoaWxkKHcpfWVsc2V7aS5pbnNlcnRCZWZvcmUodyxpLmZpcnN0Q2hpbGQpfXguX2FkZFRvb2xiYXJzKHEsayk7dS5vbk1vdXNlVXAuYWRkKGZ1bmN0aW9uKCl7dmFyIG89ZC5nZXQodS5pZCsiX2V4dGVybmFsIik7ZC5zaG93KG8pO2QuaGlkZShnKTt2YXIgbj1iLmFkZCh1LmlkKyJfZXh0ZXJuYWxfY2xvc2UiLCJjbGljayIsZnVuY3Rpb24oKXtkLmhpZGUodS5pZCsiX2V4dGVybmFsIik7Yi5yZW1vdmUodS5pZCsiX2V4dGVybmFsX2Nsb3NlIiwiY2xpY2siLG4pfSk7ZC5zaG93KG8pO2Quc2V0U3R5bGUobywidG9wIiwwLWQuZ2V0UmVjdCh1LmlkKyJfdGJsZXh0IikuaC0xKTtkLmhpZGUobyk7ZC5zaG93KG8pO28uc3R5bGUuZmlsdGVyPSIiO2c9dS5pZCsiX2V4dGVybmFsIjtvPW51bGx9KX1pZihtPT0idG9wIil7eC5fYWRkU3RhdHVzQmFyKHIsayl9aWYoIXkudGhlbWVfYWR2YW5jZWRfdG9vbGJhcl9jb250YWluZXIpe2w9ZC5hZGQociwidHIiKTtsPWo9ZC5hZGQobCwidGQiLHsiY2xhc3MiOiJtY2VJZnJhbWVDb250YWluZXIifSl9aWYodj09ImJvdHRvbSIpe3guX2FkZFRvb2xiYXJzKHIsayl9aWYobT09ImJvdHRvbSIpe3guX2FkZFN0YXR1c0JhcihyLGspfXJldHVybiBqfSxfcm93TGF5b3V0OmZ1bmN0aW9uKHcsbSxrKXt2YXIgdj10aGlzLHA9di5lZGl0b3IsdSx4LGk9cC5jb250cm9sTWFuYWdlcixsLGoscixxO3U9dy50aGVtZV9hZHZhbmNlZF9jb250YWluZXJzX2RlZmF1bHRfY2xhc3N8fCIiO3g9dy50aGVtZV9hZHZhbmNlZF9jb250YWluZXJzX2RlZmF1bHRfYWxpZ258fCJjZW50ZXIiO2YoYyh3LnRoZW1lX2FkdmFuY2VkX2NvbnRhaW5lcnN8fCIiKSxmdW5jdGlvbihzLG8pe3ZhciBuPXdbInRoZW1lX2FkdmFuY2VkX2NvbnRhaW5lcl8iK3NdfHwiIjtzd2l0Y2gobi50b0xvd2VyQ2FzZSgpKXtjYXNlIm1jZWVkaXRvciI6bD1kLmFkZChtLCJ0ciIpO2w9aj1kLmFkZChsLCJ0ZCIseyJjbGFzcyI6Im1jZUlmcmFtZUNvbnRhaW5lciJ9KTticmVhaztjYXNlIm1jZWVsZW1lbnRwYXRoIjp2Ll9hZGRTdGF0dXNCYXIobSxrKTticmVhaztkZWZhdWx0OnE9KHdbInRoZW1lX2FkdmFuY2VkX2NvbnRhaW5lcl8iK3MrIl9hbGlnbiJdfHx4KS50b0xvd2VyQ2FzZSgpO3E9Im1jZSIrdi5fdWZpcnN0KHEpO2w9ZC5hZGQoZC5hZGQobSwidHIiKSwidGQiLHsiY2xhc3MiOiJtY2VUb29sYmFyICIrKHdbInRoZW1lX2FkdmFuY2VkX2NvbnRhaW5lcl8iK3MrIl9jbGFzcyJdfHx1KSsiICIrcXx8eH0pO3I9aS5jcmVhdGVUb29sYmFyKCJ0b29sYmFyIitvKTt2Ll9hZGRDb250cm9scyhuLHIpO2Quc2V0SFRNTChsLHIucmVuZGVySFRNTCgpKTtrLmRlbHRhSGVpZ2h0LT13LnRoZW1lX2FkdmFuY2VkX3Jvd19oZWlnaHR9fSk7cmV0dXJuIGp9LF9hZGRDb250cm9sczpmdW5jdGlvbihqLGkpe3ZhciBrPXRoaXMsbD1rLnNldHRpbmdzLG0sbj1rLmVkaXRvci5jb250cm9sTWFuYWdlcjtpZihsLnRoZW1lX2FkdmFuY2VkX2Rpc2FibGUmJiFrLl9kaXNhYmxlZCl7bT17fTtmKGMobC50aGVtZV9hZHZhbmNlZF9kaXNhYmxlKSxmdW5jdGlvbihvKXttW29dPTF9KTtrLl9kaXNhYmxlZD1tfWVsc2V7bT1rLl9kaXNhYmxlZH1mKGMoaiksZnVuY3Rpb24ocCl7dmFyIG87aWYobSYmbVtwXSl7cmV0dXJufWlmKHA9PSJ0YWJsZWNvbnRyb2xzIil7ZihbInRhYmxlIiwifCIsInJvd19wcm9wcyIsImNlbGxfcHJvcHMiLCJ8Iiwicm93X2JlZm9yZSIsInJvd19hZnRlciIsImRlbGV0ZV9yb3ciLCJ8IiwiY29sX2JlZm9yZSIsImNvbF9hZnRlciIsImRlbGV0ZV9jb2wiLCJ8Iiwic3BsaXRfY2VsbHMiLCJtZXJnZV9jZWxscyJdLGZ1bmN0aW9uKHEpe3E9ay5jcmVhdGVDb250cm9sKHEsbik7aWYocSl7aS5hZGQocSl9fSk7cmV0dXJufW89ay5jcmVhdGVDb250cm9sKHAsbik7aWYobyl7aS5hZGQobyl9fSl9LF9hZGRUb29sYmFyczpmdW5jdGlvbih3LGspe3ZhciB6PXRoaXMscCxtLHI9ei5lZGl0b3IsQT16LnNldHRpbmdzLHksaj1yLmNvbnRyb2xNYW5hZ2VyLHUsbCxxPVtdLHg7eD1BLnRoZW1lX2FkdmFuY2VkX3Rvb2xiYXJfYWxpZ24udG9Mb3dlckNhc2UoKTt4PSJtY2UiK3ouX3VmaXJzdCh4KTtsPWQuYWRkKGQuYWRkKHcsInRyIiksInRkIix7ImNsYXNzIjoibWNlVG9vbGJhciAiK3h9KTtpZighci5nZXRQYXJhbSgiYWNjZXNzaWJpbGl0eV9mb2N1cyIpKXtxLnB1c2goZC5jcmVhdGVIVE1MKCJhIix7aHJlZjoiIyIsb25mb2N1czoidGlueU1DRS5nZXQoJyIrci5pZCsiJykuZm9jdXMoKTsifSwiPCEtLSBJRSAtLT4iKSl9cS5wdXNoKGQuY3JlYXRlSFRNTCgiYSIse2hyZWY6IiMiLGFjY2Vzc2tleToicSIsdGl0bGU6ci5nZXRMYW5nKCJhZHZhbmNlZC50b29sYmFyX2ZvY3VzIil9LCI8IS0tIElFIC0tPiIpKTtmb3IocD0xOyh5PUFbInRoZW1lX2FkdmFuY2VkX2J1dHRvbnMiK3BdKTtwKyspe209ai5jcmVhdGVUb29sYmFyKCJ0b29sYmFyIitwLHsiY2xhc3MiOiJtY2VUb29sYmFyUm93IitwfSk7aWYoQVsidGhlbWVfYWR2YW5jZWRfYnV0dG9ucyIrcCsiX2FkZCJdKXt5Kz0iLCIrQVsidGhlbWVfYWR2YW5jZWRfYnV0dG9ucyIrcCsiX2FkZCJdfWlmKEFbInRoZW1lX2FkdmFuY2VkX2J1dHRvbnMiK3ArIl9hZGRfYmVmb3JlIl0pe3k9QVsidGhlbWVfYWR2YW5jZWRfYnV0dG9ucyIrcCsiX2FkZF9iZWZvcmUiXSsiLCIreX16Ll9hZGRDb250cm9scyh5LG0pO3EucHVzaChtLnJlbmRlckhUTUwoKSk7ay5kZWx0YUhlaWdodC09QS50aGVtZV9hZHZhbmNlZF9yb3dfaGVpZ2h0fXEucHVzaChkLmNyZWF0ZUhUTUwoImEiLHtocmVmOiIjIixhY2Nlc3NrZXk6InoiLHRpdGxlOnIuZ2V0TGFuZygiYWR2YW5jZWQudG9vbGJhcl9mb2N1cyIpLG9uZm9jdXM6InRpbnlNQ0UuZ2V0SW5zdGFuY2VCeUlkKCciK3IuaWQrIicpLmZvY3VzKCk7In0sIjwhLS0gSUUgLS0+IikpO2Quc2V0SFRNTChsLHEuam9pbigiIikpfSxfYWRkU3RhdHVzQmFyOmZ1bmN0aW9uKG0sail7dmFyIGssdj10aGlzLHA9di5lZGl0b3Isdz12LnNldHRpbmdzLGkscSx1LGw7az1kLmFkZChtLCJ0ciIpO2s9bD1kLmFkZChrLCJ0ZCIseyJjbGFzcyI6Im1jZVN0YXR1c2JhciJ9KTtrPWQuYWRkKGssImRpdiIse2lkOnAuaWQrIl9wYXRoX3JvdyJ9LHcudGhlbWVfYWR2YW5jZWRfcGF0aD9wLnRyYW5zbGF0ZSgiYWR2YW5jZWQucGF0aCIpKyI6ICI6IiYjMTYwOyIpO2QuYWRkKGssImEiLHtocmVmOiIjIixhY2Nlc3NrZXk6IngifSk7aWYody50aGVtZV9hZHZhbmNlZF9yZXNpemluZyl7ZC5hZGQobCwiYSIse2lkOnAuaWQrIl9yZXNpemUiLGhyZWY6ImphdmFzY3JpcHQ6OyIsb25jbGljazoicmV0dXJuIGZhbHNlOyIsImNsYXNzIjoibWNlUmVzaXplIn0pO2lmKHcudGhlbWVfYWR2YW5jZWRfcmVzaXppbmdfdXNlX2Nvb2tpZSl7cC5vblBvc3RSZW5kZXIuYWRkKGZ1bmN0aW9uKCl7dmFyIG49YS5nZXRIYXNoKCJUaW55TUNFXyIrcC5pZCsiX3NpemUiKSxyPWQuZ2V0KHAuaWQrIl90YmwiKTtpZighbil7cmV0dXJufXYucmVzaXplVG8obi5jdyxuLmNoKX0pfXAub25Qb3N0UmVuZGVyLmFkZChmdW5jdGlvbigpe2IuYWRkKHAuaWQrIl9yZXNpemUiLCJjbGljayIsZnVuY3Rpb24obil7bi5wcmV2ZW50RGVmYXVsdCgpfSk7Yi5hZGQocC5pZCsiX3Jlc2l6ZSIsIm1vdXNlZG93biIsZnVuY3Rpb24oRCl7dmFyIHQscixzLG8sQyx6LEEsRixuLEUseDtmdW5jdGlvbiB5KEcpe0cucHJldmVudERlZmF1bHQoKTtuPUErKEcuc2NyZWVuWC1DKTtFPUYrKEcuc2NyZWVuWS16KTt2LnJlc2l6ZVRvKG4sRSl9ZnVuY3Rpb24gQihHKXtiLnJlbW92ZShkLmRvYywibW91c2Vtb3ZlIix0KTtiLnJlbW92ZShwLmdldERvYygpLCJtb3VzZW1vdmUiLHIpO2IucmVtb3ZlKGQuZG9jLCJtb3VzZXVwIixzKTtiLnJlbW92ZShwLmdldERvYygpLCJtb3VzZXVwIixvKTtuPUErKEcuc2NyZWVuWC1DKTtFPUYrKEcuc2NyZWVuWS16KTt2LnJlc2l6ZVRvKG4sRSx0cnVlKX1ELnByZXZlbnREZWZhdWx0KCk7Qz1ELnNjcmVlblg7ej1ELnNjcmVlblk7eD1kLmdldCh2LmVkaXRvci5pZCsiX2lmciIpO0E9bj14LmNsaWVudFdpZHRoO0Y9RT14LmNsaWVudEhlaWdodDt0PWIuYWRkKGQuZG9jLCJtb3VzZW1vdmUiLHkpO3I9Yi5hZGQocC5nZXREb2MoKSwibW91c2Vtb3ZlIix5KTtzPWIuYWRkKGQuZG9jLCJtb3VzZXVwIixCKTtvPWIuYWRkKHAuZ2V0RG9jKCksIm1vdXNldXAiLEIpfSl9KX1qLmRlbHRhSGVpZ2h0LT0yMTtrPW09bnVsbH0sX25vZGVDaGFuZ2VkOmZ1bmN0aW9uKHIseixsLHgsail7dmFyIEM9dGhpcyxpLHk9MCxCLHUsRD1DLnNldHRpbmdzLEEsayx3LG0scTtlLmVhY2goQy5zdGF0ZUNvbnRyb2xzLGZ1bmN0aW9uKG4pe3ouc2V0QWN0aXZlKG4sci5xdWVyeUNvbW1hbmRTdGF0ZShDLmNvbnRyb2xzW25dWzFdKSl9KTtmdW5jdGlvbiBvKHApe3ZhciBzLG49ai5wYXJlbnRzLHQ9cDtpZih0eXBlb2YocCk9PSJzdHJpbmciKXt0PWZ1bmN0aW9uKHYpe3JldHVybiB2Lm5vZGVOYW1lPT1wfX1mb3Iocz0wO3M8bi5sZW5ndGg7cysrKXtpZih0KG5bc10pKXtyZXR1cm4gbltzXX19fXouc2V0QWN0aXZlKCJ2aXN1YWxhaWQiLHIuaGFzVmlzdWFsKTt6LnNldERpc2FibGVkKCJ1bmRvIiwhci51bmRvTWFuYWdlci5oYXNVbmRvKCkmJiFyLnR5cGluZyk7ei5zZXREaXNhYmxlZCgicmVkbyIsIXIudW5kb01hbmFnZXIuaGFzUmVkbygpKTt6LnNldERpc2FibGVkKCJvdXRkZW50Iiwhci5xdWVyeUNvbW1hbmRTdGF0ZSgiT3V0ZGVudCIpKTtpPW8oIkEiKTtpZih1PXouZ2V0KCJsaW5rIikpe2lmKCFpfHwhaS5uYW1lKXt1LnNldERpc2FibGVkKCFpJiZ4KTt1LnNldEFjdGl2ZSghIWkpfX1pZih1PXouZ2V0KCJ1bmxpbmsiKSl7dS5zZXREaXNhYmxlZCghaSYmeCk7dS5zZXRBY3RpdmUoISFpJiYhaS5uYW1lKX1pZih1PXouZ2V0KCJhbmNob3IiKSl7dS5zZXRBY3RpdmUoISFpJiZpLm5hbWUpfWk9bygiSU1HIik7aWYodT16LmdldCgiaW1hZ2UiKSl7dS5zZXRBY3RpdmUoISFpJiZsLmNsYXNzTmFtZS5pbmRleE9mKCJtY2VJdGVtIik9PS0xKX1pZih1PXouZ2V0KCJzdHlsZXNlbGVjdCIpKXtDLl9pbXBvcnRDbGFzc2VzKCk7bT1bXTtmKHUuaXRlbXMsZnVuY3Rpb24obil7bS5wdXNoKG4udmFsdWUpfSk7cT1yLmZvcm1hdHRlci5tYXRjaEFsbChtKTt1LnNlbGVjdChxWzBdKX1pZih1PXouZ2V0KCJmb3JtYXRzZWxlY3QiKSl7aT1vKGQuaXNCbG9jayk7aWYoaSl7dS5zZWxlY3QoaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKX19byhmdW5jdGlvbihwKXtpZihwLm5vZGVOYW1lPT09IlNQQU4iKXtpZighQSYmcC5jbGFzc05hbWUpe0E9cC5jbGFzc05hbWV9aWYoIWsmJnAuc3R5bGUuZm9udFNpemUpe2s9cC5zdHlsZS5mb250U2l6ZX1pZighdyYmcC5zdHlsZS5mb250RmFtaWx5KXt3PXAuc3R5bGUuZm9udEZhbWlseS5yZXBsYWNlKC9bXCJcJ10rL2csIiIpLnJlcGxhY2UoL14oW14sXSspLiovLCIkMSIpLnRvTG93ZXJDYXNlKCl9fXJldHVybiBmYWxzZX0pO2lmKHU9ei5nZXQoImZvbnRzZWxlY3QiKSl7dS5zZWxlY3QoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvXihbXixdKykuKi8sIiQxIikudG9Mb3dlckNhc2UoKT09d30pfWlmKHU9ei5nZXQoImZvbnRzaXplc2VsZWN0Iikpe2lmKEQudGhlbWVfYWR2YW5jZWRfcnVudGltZV9mb250c2l6ZSYmIWsmJiFBKXtrPXIuZG9tLmdldFN0eWxlKGwsImZvbnRTaXplIix0cnVlKX11LnNlbGVjdChmdW5jdGlvbihuKXtpZihuLmZvbnRTaXplJiZuLmZvbnRTaXplPT09ayl7cmV0dXJuIHRydWV9aWYoblsiY2xhc3MiXSYmblsiY2xhc3MiXT09PUEpe3JldHVybiB0cnVlfX0pfWlmKEQudGhlbWVfYWR2YW5jZWRfcGF0aCYmRC50aGVtZV9hZHZhbmNlZF9zdGF0dXNiYXJfbG9jYXRpb24pe2k9ZC5nZXQoci5pZCsiX3BhdGgiKXx8ZC5hZGQoci5pZCsiX3BhdGhfcm93Iiwic3BhbiIse2lkOnIuaWQrIl9wYXRoIn0pO2Quc2V0SFRNTChpLCIiKTtvKGZ1bmN0aW9uKEUpe3ZhciBwPUUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxzLHYsdD0iIjtpZihFLm5vZGVUeXBlIT0xfHxFLm5vZGVOYW1lPT09IkJSInx8KGQuaGFzQ2xhc3MoRSwibWNlSXRlbUhpZGRlbiIpfHxkLmhhc0NsYXNzKEUsIm1jZUl0ZW1SZW1vdmVkIikpKXtyZXR1cm59aWYoQj1kLmdldEF0dHJpYihFLCJtY2VfbmFtZSIpKXtwPUJ9aWYoZS5pc0lFJiZFLnNjb3BlTmFtZSE9PSJIVE1MIil7cD1FLnNjb3BlTmFtZSsiOiIrcH1wPXAucmVwbGFjZSgvbWNlXDovZywiIik7c3dpdGNoKHApe2Nhc2UiYiI6cD0ic3Ryb25nIjticmVhaztjYXNlImkiOnA9ImVtIjticmVhaztjYXNlImltZyI6aWYoQj1kLmdldEF0dHJpYihFLCJzcmMiKSl7dCs9InNyYzogIitCKyIgIn1icmVhaztjYXNlImEiOmlmKEI9ZC5nZXRBdHRyaWIoRSwibmFtZSIpKXt0Kz0ibmFtZTogIitCKyIgIjtwKz0iIyIrQn1pZihCPWQuZ2V0QXR0cmliKEUsImhyZWYiKSl7dCs9ImhyZWY6ICIrQisiICJ9YnJlYWs7Y2FzZSJmb250IjppZihCPWQuZ2V0QXR0cmliKEUsImZhY2UiKSl7dCs9ImZvbnQ6ICIrQisiICJ9aWYoQj1kLmdldEF0dHJpYihFLCJzaXplIikpe3QrPSJzaXplOiAiK0IrIiAifWlmKEI9ZC5nZXRBdHRyaWIoRSwiY29sb3IiKSl7dCs9ImNvbG9yOiAiK0IrIiAifWJyZWFrO2Nhc2Uic3BhbiI6aWYoQj1kLmdldEF0dHJpYihFLCJzdHlsZSIpKXt0Kz0ic3R5bGU6ICIrQisiICJ9YnJlYWt9aWYoQj1kLmdldEF0dHJpYihFLCJpZCIpKXt0Kz0iaWQ6ICIrQisiICJ9aWYoQj1FLmNsYXNzTmFtZSl7Qj1CLnJlcGxhY2UoL1xiXHMqKHdlYmtpdHxtY2V8QXBwbGUtKVx3K1xzKlxiL2csIiIpO2lmKEIpe3QrPSJjbGFzczogIitCKyIgIjtpZihkLmlzQmxvY2soRSl8fHA9PSJpbWcifHxwPT0ic3BhbiIpe3ArPSIuIitCfX19cD1wLnJlcGxhY2UoLyhodG1sOikvZywiIik7cD17bmFtZTpwLG5vZGU6RSx0aXRsZTp0fTtDLm9uUmVzb2x2ZU5hbWUuZGlzcGF0Y2goQyxwKTt0PXAudGl0bGU7cD1wLm5hbWU7dj1kLmNyZWF0ZSgiYSIse2hyZWY6ImphdmFzY3JpcHQ6OyIsb25tb3VzZWRvd246InJldHVybiBmYWxzZTsiLHRpdGxlOnQsImNsYXNzIjoibWNlUGF0aF8iKyh5KyspfSxwKTtpZihpLmhhc0NoaWxkTm9kZXMoKSl7aS5pbnNlcnRCZWZvcmUoZC5kb2MuY3JlYXRlVGV4dE5vZGUoIiBcdTAwYmIgIiksaS5maXJzdENoaWxkKTtpLmluc2VydEJlZm9yZSh2LGkuZmlyc3RDaGlsZCl9ZWxzZXtpLmFwcGVuZENoaWxkKHYpfX0sci5nZXRCb2R5KCkpfX0sX3NlbDpmdW5jdGlvbihpKXt0aGlzLmVkaXRvci5leGVjQ29tbWFuZCgibWNlU2VsZWN0Tm9kZURlcHRoIixmYWxzZSxpKX0sX21jZUluc2VydEFuY2hvcjpmdW5jdGlvbihrLGope3ZhciBpPXRoaXMuZWRpdG9yO2kud2luZG93TWFuYWdlci5vcGVuKHt1cmw6dGhpcy51cmwrIi9hbmNob3IuaHRtIix3aWR0aDozMjArcGFyc2VJbnQoaS5nZXRMYW5nKCJhZHZhbmNlZC5hbmNob3JfZGVsdGFfd2lkdGgiLDApKSxoZWlnaHQ6OTArcGFyc2VJbnQoaS5nZXRMYW5nKCJhZHZhbmNlZC5hbmNob3JfZGVsdGFfaGVpZ2h0IiwwKSksaW5saW5lOnRydWV9LHt0aGVtZV91cmw6dGhpcy51cmx9KX0sX21jZUNoYXJNYXA6ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmVkaXRvcjtpLndpbmRvd01hbmFnZXIub3Blbih7dXJsOnRoaXMudXJsKyIvY2hhcm1hcC5odG0iLHdpZHRoOjU1MCtwYXJzZUludChpLmdldExhbmcoImFkdmFuY2VkLmNoYXJtYXBfZGVsdGFfd2lkdGgiLDApKSxoZWlnaHQ6MjUwK3BhcnNlSW50KGkuZ2V0TGFuZygiYWR2YW5jZWQuY2hhcm1hcF9kZWx0YV9oZWlnaHQiLDApKSxpbmxpbmU6dHJ1ZX0se3RoZW1lX3VybDp0aGlzLnVybH0pfSxfbWNlSGVscDpmdW5jdGlvbigpe3ZhciBpPXRoaXMuZWRpdG9yO2kud2luZG93TWFuYWdlci5vcGVuKHt1cmw6dGhpcy51cmwrIi9hYm91dC5odG0iLHdpZHRoOjQ4MCxoZWlnaHQ6MzgwLGlubGluZTp0cnVlfSx7dGhlbWVfdXJsOnRoaXMudXJsfSl9LF9tY2VDb2xvclBpY2tlcjpmdW5jdGlvbihrLGope3ZhciBpPXRoaXMuZWRpdG9yO2o9anx8e307aS53aW5kb3dNYW5hZ2VyLm9wZW4oe3VybDp0aGlzLnVybCsiL2NvbG9yX3BpY2tlci5odG0iLHdpZHRoOjM3NStwYXJzZUludChpLmdldExhbmcoImFkdmFuY2VkLmNvbG9ycGlja2VyX2RlbHRhX3dpZHRoIiwwKSksaGVpZ2h0OjI1MCtwYXJzZUludChpLmdldExhbmcoImFkdmFuY2VkLmNvbG9ycGlja2VyX2RlbHRhX2hlaWdodCIsMCkpLGNsb3NlX3ByZXZpb3VzOmZhbHNlLGlubGluZTp0cnVlfSx7aW5wdXRfY29sb3I6ai5jb2xvcixmdW5jOmouZnVuYyx0aGVtZV91cmw6dGhpcy51cmx9KX0sX21jZUNvZGVFZGl0b3I6ZnVuY3Rpb24oaixrKXt2YXIgaT10aGlzLmVkaXRvcjtpLndpbmRvd01hbmFnZXIub3Blbih7dXJsOnRoaXMudXJsKyIvc291cmNlX2VkaXRvci5odG0iLHdpZHRoOnBhcnNlSW50KGkuZ2V0UGFyYW0oInRoZW1lX2FkdmFuY2VkX3NvdXJjZV9lZGl0b3Jfd2lkdGgiLDcyMCkpLGhlaWdodDpwYXJzZUludChpLmdldFBhcmFtKCJ0aGVtZV9hZHZhbmNlZF9zb3VyY2VfZWRpdG9yX2hlaWdodCIsNTgwKSksaW5saW5lOnRydWUscmVzaXphYmxlOnRydWUsbWF4aW1pemFibGU6dHJ1ZX0se3RoZW1lX3VybDp0aGlzLnVybH0pfSxfbWNlSW1hZ2U6ZnVuY3Rpb24oaixrKXt2YXIgaT10aGlzLmVkaXRvcjtpZihpLmRvbS5nZXRBdHRyaWIoaS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCJjbGFzcyIpLmluZGV4T2YoIm1jZUl0ZW0iKSE9LTEpe3JldHVybn1pLndpbmRvd01hbmFnZXIub3Blbih7dXJsOnRoaXMudXJsKyIvaW1hZ2UuaHRtIix3aWR0aDozNTUrcGFyc2VJbnQoaS5nZXRMYW5nKCJhZHZhbmNlZC5pbWFnZV9kZWx0YV93aWR0aCIsMCkpLGhlaWdodDoyNzUrcGFyc2VJbnQoaS5nZXRMYW5nKCJhZHZhbmNlZC5pbWFnZV9kZWx0YV9oZWlnaHQiLDApKSxpbmxpbmU6dHJ1ZX0se3RoZW1lX3VybDp0aGlzLnVybH0pfSxfbWNlTGluazpmdW5jdGlvbihqLGspe3ZhciBpPXRoaXMuZWRpdG9yO2kud2luZG93TWFuYWdlci5vcGVuKHt1cmw6dGhpcy51cmwrIi9saW5rLmh0bSIsd2lkdGg6MzEwK3BhcnNlSW50KGkuZ2V0TGFuZygiYWR2YW5jZWQubGlua19kZWx0YV93aWR0aCIsMCkpLGhlaWdodDoyMDArcGFyc2VJbnQoaS5nZXRMYW5nKCJhZHZhbmNlZC5saW5rX2RlbHRhX2hlaWdodCIsMCkpLGlubGluZTp0cnVlfSx7dGhlbWVfdXJsOnRoaXMudXJsfSl9LF9tY2VOZXdEb2N1bWVudDpmdW5jdGlvbigpe3ZhciBpPXRoaXMuZWRpdG9yO2kud2luZG93TWFuYWdlci5jb25maXJtKCJhZHZhbmNlZC5uZXdkb2N1bWVudCIsZnVuY3Rpb24oail7aWYoail7aS5leGVjQ29tbWFuZCgibWNlU2V0Q29udGVudCIsZmFsc2UsIiIpfX0pfSxfbWNlRm9yZUNvbG9yOmZ1bmN0aW9uKCl7dmFyIGk9dGhpczt0aGlzLl9tY2VDb2xvclBpY2tlcigwLHtjb2xvcjppLmZnQ29sb3IsZnVuYzpmdW5jdGlvbihqKXtpLmZnQ29sb3I9ajtpLmVkaXRvci5leGVjQ29tbWFuZCgiRm9yZUNvbG9yIixmYWxzZSxqKX19KX0sX21jZUJhY2tDb2xvcjpmdW5jdGlvbigpe3ZhciBpPXRoaXM7dGhpcy5fbWNlQ29sb3JQaWNrZXIoMCx7Y29sb3I6aS5iZ0NvbG9yLGZ1bmM6ZnVuY3Rpb24oail7aS5iZ0NvbG9yPWo7aS5lZGl0b3IuZXhlY0NvbW1hbmQoIkhpbGl0ZUNvbG9yIixmYWxzZSxqKX19KX0sX3VmaXJzdDpmdW5jdGlvbihpKXtyZXR1cm4gaS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK2kuc3Vic3RyaW5nKDEpfX0pO2UuVGhlbWVNYW5hZ2VyLmFkZCgiYWR2YW5jZWQiLGUudGhlbWVzLkFkdmFuY2VkVGhlbWUpfSh0aW55bWNlKSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/editor_template_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfdGVtcGxhdGVfc3JjLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIGV4dGVuZCA9IHRpbnltY2UuZXh0ZW5kLCBlYWNoID0gdGlueW1jZS5lYWNoLCBDb29raWUgPSB0aW55bWNlLnV0aWwuQ29va2llLCBsYXN0RXh0SUQsIGV4cGxvZGUgPSB0aW55bWNlLmV4cGxvZGU7DQoNCgkvLyBUZWxsIGl0IHRvIGxvYWQgdGhlbWUgc3BlY2lmaWMgbGFuZ3VhZ2UgcGFjayhzKQ0KCXRpbnltY2UuVGhlbWVNYW5hZ2VyLnJlcXVpcmVMYW5nUGFjaygnYWR2YW5jZWQnKTsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnRoZW1lcy5BZHZhbmNlZFRoZW1lJywgew0KCQlzaXplcyA6IFs4LCAxMCwgMTIsIDE0LCAxOCwgMjQsIDM2XSwNCg0KCQkvLyBDb250cm9sIG5hbWUgbG9va3VwLCBmb3JtYXQ6IHRpdGxlLCBjb21tYW5kDQoJCWNvbnRyb2xzIDogew0KCQkJYm9sZCA6IFsnYm9sZF9kZXNjJywgJ0JvbGQnXSwNCgkJCWl0YWxpYyA6IFsnaXRhbGljX2Rlc2MnLCAnSXRhbGljJ10sDQoJCQl1bmRlcmxpbmUgOiBbJ3VuZGVybGluZV9kZXNjJywgJ1VuZGVybGluZSddLA0KCQkJc3RyaWtldGhyb3VnaCA6IFsnc3RyaWtldHJvdWdoX2Rlc2MnLCAnU3RyaWtldGhyb3VnaCddLA0KCQkJanVzdGlmeWxlZnQgOiBbJ2p1c3RpZnlsZWZ0X2Rlc2MnLCAnSnVzdGlmeUxlZnQnXSwNCgkJCWp1c3RpZnljZW50ZXIgOiBbJ2p1c3RpZnljZW50ZXJfZGVzYycsICdKdXN0aWZ5Q2VudGVyJ10sDQoJCQlqdXN0aWZ5cmlnaHQgOiBbJ2p1c3RpZnlyaWdodF9kZXNjJywgJ0p1c3RpZnlSaWdodCddLA0KCQkJanVzdGlmeWZ1bGwgOiBbJ2p1c3RpZnlmdWxsX2Rlc2MnLCAnSnVzdGlmeUZ1bGwnXSwNCgkJCWJ1bGxpc3QgOiBbJ2J1bGxpc3RfZGVzYycsICdJbnNlcnRVbm9yZGVyZWRMaXN0J10sDQoJCQludW1saXN0IDogWydudW1saXN0X2Rlc2MnLCAnSW5zZXJ0T3JkZXJlZExpc3QnXSwNCgkJCW91dGRlbnQgOiBbJ291dGRlbnRfZGVzYycsICdPdXRkZW50J10sDQoJCQlpbmRlbnQgOiBbJ2luZGVudF9kZXNjJywgJ0luZGVudCddLA0KCQkJY3V0IDogWydjdXRfZGVzYycsICdDdXQnXSwNCgkJCWNvcHkgOiBbJ2NvcHlfZGVzYycsICdDb3B5J10sDQoJCQlwYXN0ZSA6IFsncGFzdGVfZGVzYycsICdQYXN0ZSddLA0KCQkJdW5kbyA6IFsndW5kb19kZXNjJywgJ1VuZG8nXSwNCgkJCXJlZG8gOiBbJ3JlZG9fZGVzYycsICdSZWRvJ10sDQoJCQlsaW5rIDogWydsaW5rX2Rlc2MnLCAnbWNlTGluayddLA0KCQkJdW5saW5rIDogWyd1bmxpbmtfZGVzYycsICd1bmxpbmsnXSwNCgkJCWltYWdlIDogWydpbWFnZV9kZXNjJywgJ21jZUltYWdlJ10sDQoJCQljbGVhbnVwIDogWydjbGVhbnVwX2Rlc2MnLCAnbWNlQ2xlYW51cCddLA0KCQkJaGVscCA6IFsnaGVscF9kZXNjJywgJ21jZUhlbHAnXSwNCgkJCWNvZGUgOiBbJ2NvZGVfZGVzYycsICdtY2VDb2RlRWRpdG9yJ10sDQoJCQlociA6IFsnaHJfZGVzYycsICdJbnNlcnRIb3Jpem9udGFsUnVsZSddLA0KCQkJcmVtb3ZlZm9ybWF0IDogWydyZW1vdmVmb3JtYXRfZGVzYycsICdSZW1vdmVGb3JtYXQnXSwNCgkJCXN1YiA6IFsnc3ViX2Rlc2MnLCAnc3Vic2NyaXB0J10sDQoJCQlzdXAgOiBbJ3N1cF9kZXNjJywgJ3N1cGVyc2NyaXB0J10sDQoJCQlmb3JlY29sb3IgOiBbJ2ZvcmVjb2xvcl9kZXNjJywgJ0ZvcmVDb2xvciddLA0KCQkJZm9yZWNvbG9ycGlja2VyIDogWydmb3JlY29sb3JfZGVzYycsICdtY2VGb3JlQ29sb3InXSwNCgkJCWJhY2tjb2xvciA6IFsnYmFja2NvbG9yX2Rlc2MnLCAnSGlsaXRlQ29sb3InXSwNCgkJCWJhY2tjb2xvcnBpY2tlciA6IFsnYmFja2NvbG9yX2Rlc2MnLCAnbWNlQmFja0NvbG9yJ10sDQoJCQljaGFybWFwIDogWydjaGFybWFwX2Rlc2MnLCAnbWNlQ2hhck1hcCddLA0KCQkJdmlzdWFsYWlkIDogWyd2aXN1YWxhaWRfZGVzYycsICdtY2VUb2dnbGVWaXN1YWxBaWQnXSwNCgkJCWFuY2hvciA6IFsnYW5jaG9yX2Rlc2MnLCAnbWNlSW5zZXJ0QW5jaG9yJ10sDQoJCQluZXdkb2N1bWVudCA6IFsnbmV3ZG9jdW1lbnRfZGVzYycsICdtY2VOZXdEb2N1bWVudCddLA0KCQkJYmxvY2txdW90ZSA6IFsnYmxvY2txdW90ZV9kZXNjJywgJ21jZUJsb2NrUXVvdGUnXQ0KCQl9LA0KDQoJCXN0YXRlQ29udHJvbHMgOiBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ2J1bGxpc3QnLCAnbnVtbGlzdCcsICdqdXN0aWZ5bGVmdCcsICdqdXN0aWZ5Y2VudGVyJywgJ2p1c3RpZnlyaWdodCcsICdqdXN0aWZ5ZnVsbCcsICdzdWInLCAnc3VwJywgJ2Jsb2NrcXVvdGUnXSwNCg0KCQlpbml0IDogZnVuY3Rpb24oZWQsIHVybCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzLCB2LCBvOw0KCQ0KCQkJdC5lZGl0b3IgPSBlZDsNCgkJCXQudXJsID0gdXJsOw0KCQkJdC5vblJlc29sdmVOYW1lID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpOw0KDQoJCQkvLyBEZWZhdWx0IHNldHRpbmdzDQoJCQl0LnNldHRpbmdzID0gcyA9IGV4dGVuZCh7DQoJCQkJdGhlbWVfYWR2YW5jZWRfcGF0aCA6IHRydWUsDQoJCQkJdGhlbWVfYWR2YW5jZWRfdG9vbGJhcl9sb2NhdGlvbiA6ICdib3R0b20nLA0KCQkJCXRoZW1lX2FkdmFuY2VkX2J1dHRvbnMxIDogImJvbGQsaXRhbGljLHVuZGVybGluZSxzdHJpa2V0aHJvdWdoLHwsanVzdGlmeWxlZnQsanVzdGlmeWNlbnRlcixqdXN0aWZ5cmlnaHQsanVzdGlmeWZ1bGwsfCxzdHlsZXNlbGVjdCxmb3JtYXRzZWxlY3QiLA0KCQkJCXRoZW1lX2FkdmFuY2VkX2J1dHRvbnMyIDogImJ1bGxpc3QsbnVtbGlzdCx8LG91dGRlbnQsaW5kZW50LHwsdW5kbyxyZWRvLHwsbGluayx1bmxpbmssYW5jaG9yLGltYWdlLGNsZWFudXAsaGVscCxjb2RlIiwNCgkJCQl0aGVtZV9hZHZhbmNlZF9idXR0b25zMyA6ICJocixyZW1vdmVmb3JtYXQsdmlzdWFsYWlkLHwsc3ViLHN1cCx8LGNoYXJtYXAiLA0KCQkJCXRoZW1lX2FkdmFuY2VkX2Jsb2NrZm9ybWF0cyA6ICJwLGFkZHJlc3MscHJlLGgxLGgyLGgzLGg0LGg1LGg2IiwNCgkJCQl0aGVtZV9hZHZhbmNlZF90b29sYmFyX2FsaWduIDogImNlbnRlciIsDQoJCQkJdGhlbWVfYWR2YW5jZWRfZm9udHMgOiAiQW5kYWxlIE1vbm89YW5kYWxlIG1vbm8sdGltZXM7QXJpYWw9YXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7QXJpYWwgQmxhY2s9YXJpYWwgYmxhY2ssYXZhbnQgZ2FyZGU7Qm9vayBBbnRpcXVhPWJvb2sgYW50aXF1YSxwYWxhdGlubztDb21pYyBTYW5zIE1TPWNvbWljIHNhbnMgbXMsc2Fucy1zZXJpZjtDb3VyaWVyIE5ldz1jb3VyaWVyIG5ldyxjb3VyaWVyO0dlb3JnaWE9Z2VvcmdpYSxwYWxhdGlubztIZWx2ZXRpY2E9aGVsdmV0aWNhO0ltcGFjdD1pbXBhY3QsY2hpY2FnbztTeW1ib2w9c3ltYm9sO1RhaG9tYT10YWhvbWEsYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7VGVybWluYWw9dGVybWluYWwsbW9uYWNvO1RpbWVzIE5ldyBSb21hbj10aW1lcyBuZXcgcm9tYW4sdGltZXM7VHJlYnVjaGV0IE1TPXRyZWJ1Y2hldCBtcyxnZW5ldmE7VmVyZGFuYT12ZXJkYW5hLGdlbmV2YTtXZWJkaW5ncz13ZWJkaW5ncztXaW5nZGluZ3M9d2luZ2RpbmdzLHphcGYgZGluZ2JhdHMiLA0KCQkJCXRoZW1lX2FkdmFuY2VkX21vcmVfY29sb3JzIDogMSwNCgkJCQl0aGVtZV9hZHZhbmNlZF9yb3dfaGVpZ2h0IDogMjMsDQoJCQkJdGhlbWVfYWR2YW5jZWRfcmVzaXplX2hvcml6b250YWwgOiAxLA0KCQkJCXRoZW1lX2FkdmFuY2VkX3Jlc2l6aW5nX3VzZV9jb29raWUgOiAxLA0KCQkJCXRoZW1lX2FkdmFuY2VkX2ZvbnRfc2l6ZXMgOiAiMSwyLDMsNCw1LDYsNyIsDQoJCQkJcmVhZG9ubHkgOiBlZC5zZXR0aW5ncy5yZWFkb25seQ0KCQkJfSwgZWQuc2V0dGluZ3MpOw0KDQoJCQkvLyBTZXR1cCBkZWZhdWx0IGZvbnRfc2l6ZV9zdHlsZV92YWx1ZXMNCgkJCWlmICghcy5mb250X3NpemVfc3R5bGVfdmFsdWVzKQ0KCQkJCXMuZm9udF9zaXplX3N0eWxlX3ZhbHVlcyA9ICI4cHQsMTBwdCwxMnB0LDE0cHQsMThwdCwyNHB0LDM2cHQiOw0KDQoJCQlpZiAodGlueW1jZS5pcyhzLnRoZW1lX2FkdmFuY2VkX2ZvbnRfc2l6ZXMsICdzdHJpbmcnKSkgew0KCQkJCXMuZm9udF9zaXplX3N0eWxlX3ZhbHVlcyA9IHRpbnltY2UuZXhwbG9kZShzLmZvbnRfc2l6ZV9zdHlsZV92YWx1ZXMpOw0KCQkJCXMuZm9udF9zaXplX2NsYXNzZXMgPSB0aW55bWNlLmV4cGxvZGUocy5mb250X3NpemVfY2xhc3NlcyB8fCAnJyk7DQoNCgkJCQkvLyBQYXJzZSBzdHJpbmcgdmFsdWUNCgkJCQlvID0ge307DQoJCQkJZWQuc2V0dGluZ3MudGhlbWVfYWR2YW5jZWRfZm9udF9zaXplcyA9IHMudGhlbWVfYWR2YW5jZWRfZm9udF9zaXplczsNCgkJCQllYWNoKGVkLmdldFBhcmFtKCd0aGVtZV9hZHZhbmNlZF9mb250X3NpemVzJywgJycsICdoYXNoJyksIGZ1bmN0aW9uKHYsIGspIHsNCgkJCQkJdmFyIGNsOw0KDQoJCQkJCWlmIChrID09IHYgJiYgdiA+PSAxICYmIHYgPD0gNykgew0KCQkJCQkJayA9IHYgKyAnICgnICsgdC5zaXplc1t2IC0gMV0gKyAncHQpJzsNCgkJCQkJCWNsID0gcy5mb250X3NpemVfY2xhc3Nlc1t2IC0gMV07DQoJCQkJCQl2ID0gcy5mb250X3NpemVfc3R5bGVfdmFsdWVzW3YgLSAxXSB8fCAodC5zaXplc1t2IC0gMV0gKyAncHQnKTsNCgkJCQkJfQ0KDQoJCQkJCWlmICgvXlxzKlwuLy50ZXN0KHYpKQ0KCQkJCQkJY2wgPSB2LnJlcGxhY2UoL1wuL2csICcnKTsNCg0KCQkJCQlvW2tdID0gY2wgPyB7J2NsYXNzJyA6IGNsfSA6IHtmb250U2l6ZSA6IHZ9Ow0KCQkJCX0pOw0KDQoJCQkJcy50aGVtZV9hZHZhbmNlZF9mb250X3NpemVzID0gbzsNCgkJCX0NCg0KCQkJaWYgKCh2ID0gcy50aGVtZV9hZHZhbmNlZF9wYXRoX2xvY2F0aW9uKSAmJiB2ICE9ICdub25lJykNCgkJCQlzLnRoZW1lX2FkdmFuY2VkX3N0YXR1c2Jhcl9sb2NhdGlvbiA9IHMudGhlbWVfYWR2YW5jZWRfcGF0aF9sb2NhdGlvbjsNCg0KCQkJaWYgKHMudGhlbWVfYWR2YW5jZWRfc3RhdHVzYmFyX2xvY2F0aW9uID09ICdub25lJykNCgkJCQlzLnRoZW1lX2FkdmFuY2VkX3N0YXR1c2Jhcl9sb2NhdGlvbiA9IDA7DQoNCgkJCS8vIEluaXQgZWRpdG9yDQoJCQllZC5vbkluaXQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCWlmICghZWQuc2V0dGluZ3MucmVhZG9ubHkpDQoJCQkJCWVkLm9uTm9kZUNoYW5nZS5hZGQodC5fbm9kZUNoYW5nZWQsIHQpOw0KDQoJCQkJaWYgKGVkLnNldHRpbmdzLmNvbnRlbnRfY3NzICE9PSBmYWxzZSkNCgkJCQkJZWQuZG9tLmxvYWRDU1MoZWQuYmFzZVVSSS50b0Fic29sdXRlKHVybCArICIvc2tpbnMvIiArIGVkLnNldHRpbmdzLnNraW4gKyAiL2NvbnRlbnQuY3NzIikpOw0KCQkJfSk7DQoNCgkJCWVkLm9uU2V0UHJvZ3Jlc3NTdGF0ZS5hZGQoZnVuY3Rpb24oZWQsIGIsIHRpKSB7DQoJCQkJdmFyIGNvLCBpZCA9IGVkLmlkLCB0YjsNCg0KCQkJCWlmIChiKSB7DQoJCQkJCXQucHJvZ3Jlc3NUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoJCQkJCQljbyA9IGVkLmdldENvbnRhaW5lcigpOw0KCQkJCQkJY28gPSBjby5pbnNlcnRCZWZvcmUoRE9NLmNyZWF0ZSgnRElWJywge3N0eWxlIDogJ3Bvc2l0aW9uOnJlbGF0aXZlJ30pLCBjby5maXJzdENoaWxkKTsNCgkJCQkJCXRiID0gRE9NLmdldChlZC5pZCArICdfdGJsJyk7DQoNCgkJCQkJCURPTS5hZGQoY28sICdkaXYnLCB7aWQgOiBpZCArICdfYmxvY2tlcicsICdjbGFzcycgOiAnbWNlQmxvY2tlcicsIHN0eWxlIDoge3dpZHRoIDogdGIuY2xpZW50V2lkdGggKyAyLCBoZWlnaHQgOiB0Yi5jbGllbnRIZWlnaHQgKyAyfX0pOw0KCQkJCQkJRE9NLmFkZChjbywgJ2RpdicsIHtpZCA6IGlkICsgJ19wcm9ncmVzcycsICdjbGFzcycgOiAnbWNlUHJvZ3Jlc3MnLCBzdHlsZSA6IHtsZWZ0IDogdGIuY2xpZW50V2lkdGggLyAyLCB0b3AgOiB0Yi5jbGllbnRIZWlnaHQgLyAyfX0pOw0KCQkJCQl9LCB0aSB8fCAwKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlET00ucmVtb3ZlKGlkICsgJ19ibG9ja2VyJyk7DQoJCQkJCURPTS5yZW1vdmUoaWQgKyAnX3Byb2dyZXNzJyk7DQoJCQkJCWNsZWFyVGltZW91dCh0LnByb2dyZXNzVGltZXIpOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQlET00ubG9hZENTUyhzLmVkaXRvcl9jc3MgPyBlZC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShzLmVkaXRvcl9jc3MpIDogdXJsICsgIi9za2lucy8iICsgZWQuc2V0dGluZ3Muc2tpbiArICIvdWkuY3NzIik7DQoNCgkJCWlmIChzLnNraW5fdmFyaWFudCkNCgkJCQlET00ubG9hZENTUyh1cmwgKyAiL3NraW5zLyIgKyBlZC5zZXR0aW5ncy5za2luICsgIi91aV8iICsgcy5za2luX3ZhcmlhbnQgKyAiLmNzcyIpOw0KCQl9LA0KDQoJCWNyZWF0ZUNvbnRyb2wgOiBmdW5jdGlvbihuLCBjZikgew0KCQkJdmFyIGNkLCBjOw0KDQoJCQlpZiAoYyA9IGNmLmNyZWF0ZUNvbnRyb2wobikpDQoJCQkJcmV0dXJuIGM7DQoNCgkJCXN3aXRjaCAobikgew0KCQkJCWNhc2UgInN0eWxlc2VsZWN0IjoNCgkJCQkJcmV0dXJuIHRoaXMuX2NyZWF0ZVN0eWxlU2VsZWN0KCk7DQoNCgkJCQljYXNlICJmb3JtYXRzZWxlY3QiOg0KCQkJCQlyZXR1cm4gdGhpcy5fY3JlYXRlQmxvY2tGb3JtYXRzKCk7DQoNCgkJCQljYXNlICJmb250c2VsZWN0IjoNCgkJCQkJcmV0dXJuIHRoaXMuX2NyZWF0ZUZvbnRTZWxlY3QoKTsNCg0KCQkJCWNhc2UgImZvbnRzaXplc2VsZWN0IjoNCgkJCQkJcmV0dXJuIHRoaXMuX2NyZWF0ZUZvbnRTaXplU2VsZWN0KCk7DQoNCgkJCQljYXNlICJmb3JlY29sb3IiOg0KCQkJCQlyZXR1cm4gdGhpcy5fY3JlYXRlRm9yZUNvbG9yTWVudSgpOw0KDQoJCQkJY2FzZSAiYmFja2NvbG9yIjoNCgkJCQkJcmV0dXJuIHRoaXMuX2NyZWF0ZUJhY2tDb2xvck1lbnUoKTsNCgkJCX0NCg0KCQkJaWYgKChjZCA9IHRoaXMuY29udHJvbHNbbl0pKQ0KCQkJCXJldHVybiBjZi5jcmVhdGVCdXR0b24obiwge3RpdGxlIDogImFkdmFuY2VkLiIgKyBjZFswXSwgY21kIDogY2RbMV0sIHVpIDogY2RbMl0sIHZhbHVlIDogY2RbM119KTsNCgkJfSwNCg0KCQlleGVjQ29tbWFuZCA6IGZ1bmN0aW9uKGNtZCwgdWksIHZhbCkgew0KCQkJdmFyIGYgPSB0aGlzWydfJyArIGNtZF07DQoNCgkJCWlmIChmKSB7DQoJCQkJZi5jYWxsKHRoaXMsIHVpLCB2YWwpOw0KCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0sDQoNCgkJX2ltcG9ydENsYXNzZXMgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvciwgY3RybCA9IGVkLmNvbnRyb2xNYW5hZ2VyLmdldCgnc3R5bGVzZWxlY3QnKTsNCg0KCQkJaWYgKGN0cmwuZ2V0TGVuZ3RoKCkgPT0gMCkgew0KCQkJCWVhY2goZWQuZG9tLmdldENsYXNzZXMoKSwgZnVuY3Rpb24obywgaWR4KSB7DQoJCQkJCXZhciBuYW1lID0gJ3N0eWxlXycgKyBpZHg7DQoNCgkJCQkJZWQuZm9ybWF0dGVyLnJlZ2lzdGVyKG5hbWUsIHsNCgkJCQkJCWlubGluZSA6ICdzcGFuJywNCgkJCQkJCWF0dHJpYnV0ZXMgOiB7J2NsYXNzJyA6IG9bJ2NsYXNzJ119LA0KCQkJCQkJc2VsZWN0b3IgOiAnKicNCgkJCQkJfSk7DQoNCgkJCQkJY3RybC5hZGQob1snY2xhc3MnXSwgbmFtZSk7DQoJCQkJfSk7DQoJCQl9DQoJCX0sDQoNCgkJX2NyZWF0ZVN0eWxlU2VsZWN0IDogZnVuY3Rpb24obikgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBjdHJsTWFuID0gZWQuY29udHJvbE1hbmFnZXIsIGN0cmw7DQoNCgkJCS8vIFNldHVwIHN0eWxlIHNlbGVjdCBib3gNCgkJCWN0cmwgPSBjdHJsTWFuLmNyZWF0ZUxpc3RCb3goJ3N0eWxlc2VsZWN0Jywgew0KCQkJCXRpdGxlIDogJ2FkdmFuY2VkLnN0eWxlX3NlbGVjdCcsDQoJCQkJb25zZWxlY3QgOiBmdW5jdGlvbihuYW1lKSB7DQoJCQkJCXZhciBtYXRjaGVzLCBmb3JtYXROYW1lcyA9IFtdOw0KDQoJCQkJCWVhY2goY3RybC5pdGVtcywgZnVuY3Rpb24oaXRlbSkgew0KCQkJCQkJZm9ybWF0TmFtZXMucHVzaChpdGVtLnZhbHVlKTsNCgkJCQkJfSk7DQoNCgkJCQkJZWQuZm9jdXMoKTsNCgkJCQkJZWQudW5kb01hbmFnZXIuYWRkKCk7DQoNCgkJCQkJLy8gVG9nZ2xlIG9mZiB0aGUgY3VycmVudCBmb3JtYXQNCgkJCQkJbWF0Y2hlcyA9IGVkLmZvcm1hdHRlci5tYXRjaEFsbChmb3JtYXROYW1lcyk7DQoJCQkJCWlmICghbmFtZSB8fCBtYXRjaGVzWzBdID09IG5hbWUpDQoJCQkJCQllZC5mb3JtYXR0ZXIucmVtb3ZlKG1hdGNoZXNbMF0pOw0KCQkJCQllbHNlDQoJCQkJCQllZC5mb3JtYXR0ZXIuYXBwbHkobmFtZSk7DQoNCgkJCQkJZWQudW5kb01hbmFnZXIuYWRkKCk7DQoJCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoNCgkJCQkJcmV0dXJuIGZhbHNlOyAvLyBObyBhdXRvIHNlbGVjdA0KCQkJCX0NCgkJCX0pOw0KDQoJCQkvLyBIYW5kbGUgc3BlY2lmaWVkIGZvcm1hdA0KCQkJZWQub25Jbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCQl2YXIgY291bnRlciA9IDAsIGZvcm1hdHMgPSBlZC5nZXRQYXJhbSgnc3R5bGVfZm9ybWF0cycpOw0KDQoJCQkJaWYgKGZvcm1hdHMpIHsNCgkJCQkJZWFjaChmb3JtYXRzLCBmdW5jdGlvbihmbXQpIHsNCgkJCQkJCXZhciBuYW1lLCBrZXlzID0gMDsNCg0KCQkJCQkJZWFjaChmbXQsIGZ1bmN0aW9uKCkge2tleXMrKzt9KTsNCg0KCQkJCQkJaWYgKGtleXMgPiAxKSB7DQoJCQkJCQkJbmFtZSA9IGZtdC5uYW1lID0gZm10Lm5hbWUgfHwgJ3N0eWxlXycgKyAoY291bnRlcisrKTsNCgkJCQkJCQllZC5mb3JtYXR0ZXIucmVnaXN0ZXIobmFtZSwgZm10KTsNCgkJCQkJCQljdHJsLmFkZChmbXQudGl0bGUsIG5hbWUpOw0KCQkJCQkJfSBlbHNlDQoJCQkJCQkJY3RybC5hZGQoZm10LnRpdGxlKTsNCgkJCQkJfSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJZWFjaChlZC5nZXRQYXJhbSgndGhlbWVfYWR2YW5jZWRfc3R5bGVzJywgJycsICdoYXNoJyksIGZ1bmN0aW9uKHZhbCwga2V5KSB7DQoJCQkJCQl2YXIgbmFtZTsNCg0KCQkJCQkJaWYgKHZhbCkgew0KCQkJCQkJCW5hbWUgPSAnc3R5bGVfJyArIChjb3VudGVyKyspOw0KDQoJCQkJCQkJZWQuZm9ybWF0dGVyLnJlZ2lzdGVyKG5hbWUsIHsNCgkJCQkJCQkJaW5saW5lIDogJ3NwYW4nLA0KCQkJCQkJCQljbGFzc2VzIDogdmFsLA0KCQkJCQkJCQlzZWxlY3RvciA6ICcqJw0KCQkJCQkJCX0pOw0KDQoJCQkJCQkJY3RybC5hZGQodC5lZGl0b3IudHJhbnNsYXRlKGtleSksIG5hbWUpOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJLy8gQXV0byBpbXBvcnQgY2xhc3NlcyBpZiB0aGUgY3RybCBib3ggaXMgZW1wdHkNCgkJCWlmIChjdHJsLmdldExlbmd0aCgpID09IDApIHsNCgkJCQljdHJsLm9uUG9zdFJlbmRlci5hZGQoZnVuY3Rpb24oZWQsIG4pIHsNCgkJCQkJaWYgKCFjdHJsLk5hdGl2ZUxpc3RCb3gpIHsNCgkJCQkJCUV2ZW50LmFkZChuLmlkICsgJ190ZXh0JywgJ2ZvY3VzJywgdC5faW1wb3J0Q2xhc3NlcywgdCk7DQoJCQkJCQlFdmVudC5hZGQobi5pZCArICdfdGV4dCcsICdtb3VzZWRvd24nLCB0Ll9pbXBvcnRDbGFzc2VzLCB0KTsNCgkJCQkJCUV2ZW50LmFkZChuLmlkICsgJ19vcGVuJywgJ2ZvY3VzJywgdC5faW1wb3J0Q2xhc3NlcywgdCk7DQoJCQkJCQlFdmVudC5hZGQobi5pZCArICdfb3BlbicsICdtb3VzZWRvd24nLCB0Ll9pbXBvcnRDbGFzc2VzLCB0KTsNCgkJCQkJfSBlbHNlDQoJCQkJCQlFdmVudC5hZGQobi5pZCwgJ2ZvY3VzJywgdC5faW1wb3J0Q2xhc3NlcywgdCk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiBjdHJsOw0KCQl9LA0KDQoJCV9jcmVhdGVGb250U2VsZWN0IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgYywgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3I7DQoNCgkJCWMgPSBlZC5jb250cm9sTWFuYWdlci5jcmVhdGVMaXN0Qm94KCdmb250c2VsZWN0Jywgew0KCQkJCXRpdGxlIDogJ2FkdmFuY2VkLmZvbnRkZWZhdWx0JywNCgkJCQlvbnNlbGVjdCA6IGZ1bmN0aW9uKHYpIHsNCgkJCQkJdmFyIGN1ciA9IGMuaXRlbXNbYy5zZWxlY3RlZEluZGV4XTsNCg0KCQkJCQlpZiAoIXYgJiYgY3VyKSB7DQoJCQkJCQllZC5leGVjQ29tbWFuZCgnRm9udE5hbWUnLCBmYWxzZSwgY3VyLnZhbHVlKTsNCgkJCQkJCXJldHVybjsNCgkJCQkJfQ0KDQoJCQkJCWVkLmV4ZWNDb21tYW5kKCdGb250TmFtZScsIGZhbHNlLCB2KTsNCg0KCQkJCQkvLyBGYWtlIHNlbGVjdGlvbiwgZXhlY0NvbW1hbmQgd2lsbCBmaXJlIGEgbm9kZUNoYW5nZSBhbmQgdXBkYXRlIHRoZSBzZWxlY3Rpb24NCgkJCQkJYy5zZWxlY3QoZnVuY3Rpb24oc3YpIHsNCgkJCQkJCXJldHVybiB2ID09IHN2Ow0KCQkJCQl9KTsNCg0KCQkJCQlyZXR1cm4gZmFsc2U7IC8vIE5vIGF1dG8gc2VsZWN0DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWlmIChjKSB7DQoJCQkJZWFjaChlZC5nZXRQYXJhbSgndGhlbWVfYWR2YW5jZWRfZm9udHMnLCB0LnNldHRpbmdzLnRoZW1lX2FkdmFuY2VkX2ZvbnRzLCAnaGFzaCcpLCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJCWMuYWRkKGVkLnRyYW5zbGF0ZShrKSwgdiwge3N0eWxlIDogdi5pbmRleE9mKCdkaW5ncycpID09IC0xID8gJ2ZvbnQtZmFtaWx5OicgKyB2IDogJyd9KTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJcmV0dXJuIGM7DQoJCX0sDQoNCgkJX2NyZWF0ZUZvbnRTaXplU2VsZWN0IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIGMsIGkgPSAwLCBjbCA9IFtdOw0KDQoJCQljID0gZWQuY29udHJvbE1hbmFnZXIuY3JlYXRlTGlzdEJveCgnZm9udHNpemVzZWxlY3QnLCB7dGl0bGUgOiAnYWR2YW5jZWQuZm9udF9zaXplJywgb25zZWxlY3QgOiBmdW5jdGlvbih2KSB7DQoJCQkJdmFyIGN1ciA9IGMuaXRlbXNbYy5zZWxlY3RlZEluZGV4XTsNCg0KCQkJCWlmICghdiAmJiBjdXIpIHsNCgkJCQkJY3VyID0gY3VyLnZhbHVlOw0KDQoJCQkJCWlmIChjdXJbJ2NsYXNzJ10pIHsNCgkJCQkJCWVkLmZvcm1hdHRlci50b2dnbGUoJ2ZvbnRzaXplX2NsYXNzJywge3ZhbHVlIDogY3VyWydjbGFzcyddfSk7DQoJCQkJCQllZC51bmRvTWFuYWdlci5hZGQoKTsNCgkJCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQllZC5leGVjQ29tbWFuZCgnRm9udFNpemUnLCBmYWxzZSwgY3VyLmZvbnRTaXplKTsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybjsNCgkJCQl9DQoNCgkJCQlpZiAodlsnY2xhc3MnXSkgew0KCQkJCQllZC5mb2N1cygpOw0KCQkJCQllZC51bmRvTWFuYWdlci5hZGQoKTsNCgkJCQkJZWQuZm9ybWF0dGVyLnRvZ2dsZSgnZm9udHNpemVfY2xhc3MnLCB7dmFsdWUgOiB2WydjbGFzcyddfSk7DQoJCQkJCWVkLnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJCQllZC5ub2RlQ2hhbmdlZCgpOw0KCQkJCX0gZWxzZQ0KCQkJCQllZC5leGVjQ29tbWFuZCgnRm9udFNpemUnLCBmYWxzZSwgdi5mb250U2l6ZSk7DQoNCgkJCQkvLyBGYWtlIHNlbGVjdGlvbiwgZXhlY0NvbW1hbmQgd2lsbCBmaXJlIGEgbm9kZUNoYW5nZSBhbmQgdXBkYXRlIHRoZSBzZWxlY3Rpb24NCgkJCQljLnNlbGVjdChmdW5jdGlvbihzdikgew0KCQkJCQlyZXR1cm4gdiA9PSBzdjsNCgkJCQl9KTsNCg0KCQkJCXJldHVybiBmYWxzZTsgLy8gTm8gYXV0byBzZWxlY3QNCgkJCX19KTsNCg0KCQkJaWYgKGMpIHsNCgkJCQllYWNoKHQuc2V0dGluZ3MudGhlbWVfYWR2YW5jZWRfZm9udF9zaXplcywgZnVuY3Rpb24odiwgaykgew0KCQkJCQl2YXIgZnogPSB2LmZvbnRTaXplOw0KDQoJCQkJCWlmIChmeiA+PSAxICYmIGZ6IDw9IDcpDQoJCQkJCQlmeiA9IHQuc2l6ZXNbcGFyc2VJbnQoZnopIC0gMV0gKyAncHQnOw0KDQoJCQkJCWMuYWRkKGssIHYsIHsnc3R5bGUnIDogJ2ZvbnQtc2l6ZTonICsgZnosICdjbGFzcycgOiAnbWNlRm9udFNpemUnICsgKGkrKykgKyAoJyAnICsgKHZbJ2NsYXNzJ10gfHwgJycpKX0pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlyZXR1cm4gYzsNCgkJfSwNCg0KCQlfY3JlYXRlQmxvY2tGb3JtYXRzIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgYywgZm10cyA9IHsNCgkJCQlwIDogJ2FkdmFuY2VkLnBhcmFncmFwaCcsDQoJCQkJYWRkcmVzcyA6ICdhZHZhbmNlZC5hZGRyZXNzJywNCgkJCQlwcmUgOiAnYWR2YW5jZWQucHJlJywNCgkJCQloMSA6ICdhZHZhbmNlZC5oMScsDQoJCQkJaDIgOiAnYWR2YW5jZWQuaDInLA0KCQkJCWgzIDogJ2FkdmFuY2VkLmgzJywNCgkJCQloNCA6ICdhZHZhbmNlZC5oNCcsDQoJCQkJaDUgOiAnYWR2YW5jZWQuaDUnLA0KCQkJCWg2IDogJ2FkdmFuY2VkLmg2JywNCgkJCQlkaXYgOiAnYWR2YW5jZWQuZGl2JywNCgkJCQlibG9ja3F1b3RlIDogJ2FkdmFuY2VkLmJsb2NrcXVvdGUnLA0KCQkJCWNvZGUgOiAnYWR2YW5jZWQuY29kZScsDQoJCQkJZHQgOiAnYWR2YW5jZWQuZHQnLA0KCQkJCWRkIDogJ2FkdmFuY2VkLmRkJywNCgkJCQlzYW1wIDogJ2FkdmFuY2VkLnNhbXAnDQoJCQl9LCB0ID0gdGhpczsNCg0KCQkJYyA9IHQuZWRpdG9yLmNvbnRyb2xNYW5hZ2VyLmNyZWF0ZUxpc3RCb3goJ2Zvcm1hdHNlbGVjdCcsIHt0aXRsZSA6ICdhZHZhbmNlZC5ibG9jaycsIGNtZCA6ICdGb3JtYXRCbG9jayd9KTsNCgkJCWlmIChjKSB7DQoJCQkJZWFjaCh0LmVkaXRvci5nZXRQYXJhbSgndGhlbWVfYWR2YW5jZWRfYmxvY2tmb3JtYXRzJywgdC5zZXR0aW5ncy50aGVtZV9hZHZhbmNlZF9ibG9ja2Zvcm1hdHMsICdoYXNoJyksIGZ1bmN0aW9uKHYsIGspIHsNCgkJCQkJYy5hZGQodC5lZGl0b3IudHJhbnNsYXRlKGsgIT0gdiA/IGsgOiBmbXRzW3ZdKSwgdiwgeydjbGFzcycgOiAnbWNlX2Zvcm1hdFByZXZpZXcgbWNlXycgKyB2fSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiBjOw0KCQl9LA0KDQoJCV9jcmVhdGVGb3JlQ29sb3JNZW51IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgYywgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBvID0ge30sIHY7DQoNCgkJCWlmIChzLnRoZW1lX2FkdmFuY2VkX21vcmVfY29sb3JzKSB7DQoJCQkJby5tb3JlX2NvbG9yc19mdW5jID0gZnVuY3Rpb24oKSB7DQoJCQkJCXQuX21jZUNvbG9yUGlja2VyKDAsIHsNCgkJCQkJCWNvbG9yIDogYy52YWx1ZSwNCgkJCQkJCWZ1bmMgOiBmdW5jdGlvbihjbykgew0KCQkJCQkJCWMuc2V0Q29sb3IoY28pOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQlpZiAodiA9IHMudGhlbWVfYWR2YW5jZWRfdGV4dF9jb2xvcnMpDQoJCQkJby5jb2xvcnMgPSB2Ow0KDQoJCQlpZiAocy50aGVtZV9hZHZhbmNlZF9kZWZhdWx0X2ZvcmVncm91bmRfY29sb3IpDQoJCQkJby5kZWZhdWx0X2NvbG9yID0gcy50aGVtZV9hZHZhbmNlZF9kZWZhdWx0X2ZvcmVncm91bmRfY29sb3I7DQoNCgkJCW8udGl0bGUgPSAnYWR2YW5jZWQuZm9yZWNvbG9yX2Rlc2MnOw0KCQkJby5jbWQgPSAnRm9yZUNvbG9yJzsNCgkJCW8uc2NvcGUgPSB0aGlzOw0KDQoJCQljID0gdC5lZGl0b3IuY29udHJvbE1hbmFnZXIuY3JlYXRlQ29sb3JTcGxpdEJ1dHRvbignZm9yZWNvbG9yJywgbyk7DQoNCgkJCXJldHVybiBjOw0KCQl9LA0KDQoJCV9jcmVhdGVCYWNrQ29sb3JNZW51IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgYywgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBvID0ge30sIHY7DQoNCgkJCWlmIChzLnRoZW1lX2FkdmFuY2VkX21vcmVfY29sb3JzKSB7DQoJCQkJby5tb3JlX2NvbG9yc19mdW5jID0gZnVuY3Rpb24oKSB7DQoJCQkJCXQuX21jZUNvbG9yUGlja2VyKDAsIHsNCgkJCQkJCWNvbG9yIDogYy52YWx1ZSwNCgkJCQkJCWZ1bmMgOiBmdW5jdGlvbihjbykgew0KCQkJCQkJCWMuc2V0Q29sb3IoY28pOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQlpZiAodiA9IHMudGhlbWVfYWR2YW5jZWRfYmFja2dyb3VuZF9jb2xvcnMpDQoJCQkJby5jb2xvcnMgPSB2Ow0KDQoJCQlpZiAocy50aGVtZV9hZHZhbmNlZF9kZWZhdWx0X2JhY2tncm91bmRfY29sb3IpDQoJCQkJby5kZWZhdWx0X2NvbG9yID0gcy50aGVtZV9hZHZhbmNlZF9kZWZhdWx0X2JhY2tncm91bmRfY29sb3I7DQoNCgkJCW8udGl0bGUgPSAnYWR2YW5jZWQuYmFja2NvbG9yX2Rlc2MnOw0KCQkJby5jbWQgPSAnSGlsaXRlQ29sb3InOw0KCQkJby5zY29wZSA9IHRoaXM7DQoNCgkJCWMgPSB0LmVkaXRvci5jb250cm9sTWFuYWdlci5jcmVhdGVDb2xvclNwbGl0QnV0dG9uKCdiYWNrY29sb3InLCBvKTsNCg0KCQkJcmV0dXJuIGM7DQoJCX0sDQoNCgkJcmVuZGVyVUkgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgbiwgaWMsIHRiLCB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgcyA9IHQuc2V0dGluZ3MsIHNjLCBwLCBubDsNCg0KCQkJbiA9IHAgPSBET00uY3JlYXRlKCdzcGFuJywge2lkIDogZWQuaWQgKyAnX3BhcmVudCcsICdjbGFzcycgOiAnbWNlRWRpdG9yICcgKyBlZC5zZXR0aW5ncy5za2luICsgJ1NraW4nICsgKHMuc2tpbl92YXJpYW50ID8gJyAnICsgZWQuc2V0dGluZ3Muc2tpbiArICdTa2luJyArIHQuX3VmaXJzdChzLnNraW5fdmFyaWFudCkgOiAnJyl9KTsNCg0KCQkJaWYgKCFET00uYm94TW9kZWwpDQoJCQkJbiA9IERPTS5hZGQobiwgJ2RpdicsIHsnY2xhc3MnIDogJ21jZU9sZEJveE1vZGVsJ30pOw0KDQoJCQluID0gc2MgPSBET00uYWRkKG4sICd0YWJsZScsIHtpZCA6IGVkLmlkICsgJ190YmwnLCAnY2xhc3MnIDogJ21jZUxheW91dCcsIGNlbGxTcGFjaW5nIDogMCwgY2VsbFBhZGRpbmcgOiAwfSk7DQoJCQluID0gdGIgPSBET00uYWRkKG4sICd0Ym9keScpOw0KDQoJCQlzd2l0Y2ggKChzLnRoZW1lX2FkdmFuY2VkX2xheW91dF9tYW5hZ2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpKSB7DQoJCQkJY2FzZSAicm93bGF5b3V0IjoNCgkJCQkJaWMgPSB0Ll9yb3dMYXlvdXQocywgdGIsIG8pOw0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgImN1c3RvbWxheW91dCI6DQoJCQkJCWljID0gZWQuZXhlY0NhbGxiYWNrKCJ0aGVtZV9hZHZhbmNlZF9jdXN0b21fbGF5b3V0IiwgcywgdGIsIG8sIHApOw0KCQkJCQlicmVhazsNCg0KCQkJCWRlZmF1bHQ6DQoJCQkJCWljID0gdC5fc2ltcGxlTGF5b3V0KHMsIHRiLCBvLCBwKTsNCgkJCX0NCg0KCQkJbiA9IG8udGFyZ2V0Tm9kZTsNCg0KCQkJLy8gQWRkIGNsYXNzZXMgdG8gZmlyc3QgYW5kIGxhc3QgVFJzDQoJCQlubCA9IERPTS5zdGRNb2RlID8gc2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RyJykgOiBzYy5yb3dzOyAvLyBRdWljayBmaXggZm9yIElFIDgNCgkJCURPTS5hZGRDbGFzcyhubFswXSwgJ21jZUZpcnN0Jyk7DQoJCQlET00uYWRkQ2xhc3MobmxbbmwubGVuZ3RoIC0gMV0sICdtY2VMYXN0Jyk7DQoNCgkJCS8vIEFkZCBjbGFzc2VzIHRvIGZpcnN0IGFuZCBsYXN0IFREcw0KCQkJZWFjaChET00uc2VsZWN0KCd0cicsIHRiKSwgZnVuY3Rpb24obikgew0KCQkJCURPTS5hZGRDbGFzcyhuLmZpcnN0Q2hpbGQsICdtY2VGaXJzdCcpOw0KCQkJCURPTS5hZGRDbGFzcyhuLmNoaWxkTm9kZXNbbi5jaGlsZE5vZGVzLmxlbmd0aCAtIDFdLCAnbWNlTGFzdCcpOw0KCQkJfSk7DQoNCgkJCWlmIChET00uZ2V0KHMudGhlbWVfYWR2YW5jZWRfdG9vbGJhcl9jb250YWluZXIpKQ0KCQkJCURPTS5nZXQocy50aGVtZV9hZHZhbmNlZF90b29sYmFyX2NvbnRhaW5lcikuYXBwZW5kQ2hpbGQocCk7DQoJCQllbHNlDQoJCQkJRE9NLmluc2VydEFmdGVyKHAsIG4pOw0KDQoJCQlFdmVudC5hZGQoZWQuaWQgKyAnX3BhdGhfcm93JywgJ2NsaWNrJywgZnVuY3Rpb24oZSkgew0KCQkJCWUgPSBlLnRhcmdldDsNCg0KCQkJCWlmIChlLm5vZGVOYW1lID09ICdBJykgew0KCQkJCQl0Ll9zZWwoZS5jbGFzc05hbWUucmVwbGFjZSgvXi4qbWNlUGF0aF8oWzAtOV0rKS4qJC8sICckMScpKTsNCg0KCQkJCQlyZXR1cm4gRXZlbnQuY2FuY2VsKGUpOw0KCQkJCX0NCgkJCX0pOw0KLyoNCgkJCWlmIChET00uZ2V0KGVkLmlkICsgJ19wYXRoX3JvdycpKSB7DQoJCQkJRXZlbnQuYWRkKGVkLmlkICsgJ190YmwnLCAnbW91c2VvdmVyJywgZnVuY3Rpb24oZSkgew0KCQkJCQl2YXIgcmU7DQoJDQoJCQkJCWUgPSBlLnRhcmdldDsNCg0KCQkJCQlpZiAoZS5ub2RlTmFtZSA9PSAnU1BBTicgJiYgRE9NLmhhc0NsYXNzKGUucGFyZW50Tm9kZSwgJ21jZUJ1dHRvbicpKSB7DQoJCQkJCQlyZSA9IERPTS5nZXQoZWQuaWQgKyAnX3BhdGhfcm93Jyk7DQoJCQkJCQl0Lmxhc3RQYXRoID0gcmUuaW5uZXJIVE1MOw0KCQkJCQkJRE9NLnNldEhUTUwocmUsIGUucGFyZW50Tm9kZS50aXRsZSk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCUV2ZW50LmFkZChlZC5pZCArICdfdGJsJywgJ21vdXNlb3V0JywgZnVuY3Rpb24oZSkgew0KCQkJCQlpZiAodC5sYXN0UGF0aCkgew0KCQkJCQkJRE9NLnNldEhUTUwoZWQuaWQgKyAnX3BhdGhfcm93JywgdC5sYXN0UGF0aCk7DQoJCQkJCQl0Lmxhc3RQYXRoID0gMDsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KKi8NCg0KCQkJaWYgKCFlZC5nZXRQYXJhbSgnYWNjZXNzaWJpbGl0eV9mb2N1cycpKQ0KCQkJCUV2ZW50LmFkZChET00uYWRkKHAsICdhJywge2hyZWYgOiAnIyd9LCAnPCEtLSBJRSAtLT4nKSwgJ2ZvY3VzJywgZnVuY3Rpb24oKSB7dGlueU1DRS5nZXQoZWQuaWQpLmZvY3VzKCk7fSk7DQoNCgkJCWlmIChzLnRoZW1lX2FkdmFuY2VkX3Rvb2xiYXJfbG9jYXRpb24gPT0gJ2V4dGVybmFsJykNCgkJCQlvLmRlbHRhSGVpZ2h0ID0gMDsNCg0KCQkJdC5kZWx0YUhlaWdodCA9IG8uZGVsdGFIZWlnaHQ7DQoJCQlvLnRhcmdldE5vZGUgPSBudWxsOw0KDQoJCQlyZXR1cm4gew0KCQkJCWlmcmFtZUNvbnRhaW5lciA6IGljLA0KCQkJCWVkaXRvckNvbnRhaW5lciA6IGVkLmlkICsgJ19wYXJlbnQnLA0KCQkJCXNpemVDb250YWluZXIgOiBzYywNCgkJCQlkZWx0YUhlaWdodCA6IG8uZGVsdGFIZWlnaHQNCgkJCX07DQoJCX0sDQoNCgkJZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHsNCgkJCQlsb25nbmFtZSA6ICdBZHZhbmNlZCB0aGVtZScsDQoJCQkJYXV0aG9yIDogJ01veGllY29kZSBTeXN0ZW1zIEFCJywNCgkJCQlhdXRob3J1cmwgOiAnaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbScsDQoJCQkJdmVyc2lvbiA6IHRpbnltY2UubWFqb3JWZXJzaW9uICsgIi4iICsgdGlueW1jZS5taW5vclZlcnNpb24NCgkJCX0NCgkJfSwNCg0KCQlyZXNpemVCeSA6IGZ1bmN0aW9uKGR3LCBkaCkgew0KCQkJdmFyIGUgPSBET00uZ2V0KHRoaXMuZWRpdG9yLmlkICsgJ190YmwnKTsNCg0KCQkJdGhpcy5yZXNpemVUbyhlLmNsaWVudFdpZHRoICsgZHcsIGUuY2xpZW50SGVpZ2h0ICsgZGgpOw0KCQl9LA0KDQoJCXJlc2l6ZVRvIDogZnVuY3Rpb24odywgaCwgc3RvcmUpIHsNCgkJCXZhciBlZCA9IHRoaXMuZWRpdG9yLCBzID0gdGhpcy5zZXR0aW5ncywgZSA9IERPTS5nZXQoZWQuaWQgKyAnX3RibCcpLCBpZnIgPSBET00uZ2V0KGVkLmlkICsgJ19pZnInKTsNCg0KCQkJLy8gQm91bmRlcnkgZml4IGJveA0KCQkJdyA9IE1hdGgubWF4KHMudGhlbWVfYWR2YW5jZWRfcmVzaXppbmdfbWluX3dpZHRoIHx8IDEwMCwgdyk7DQoJCQloID0gTWF0aC5tYXgocy50aGVtZV9hZHZhbmNlZF9yZXNpemluZ19taW5faGVpZ2h0IHx8IDEwMCwgaCk7DQoJCQl3ID0gTWF0aC5taW4ocy50aGVtZV9hZHZhbmNlZF9yZXNpemluZ19tYXhfd2lkdGggfHwgMHhGRkZGLCB3KTsNCgkJCWggPSBNYXRoLm1pbihzLnRoZW1lX2FkdmFuY2VkX3Jlc2l6aW5nX21heF9oZWlnaHQgfHwgMHhGRkZGLCBoKTsNCg0KCQkJLy8gUmVzaXplIGlmcmFtZSBhbmQgY29udGFpbmVyDQoJCQlET00uc2V0U3R5bGUoZSwgJ2hlaWdodCcsICcnKTsNCgkJCURPTS5zZXRTdHlsZShpZnIsICdoZWlnaHQnLCBoKTsNCg0KCQkJaWYgKHMudGhlbWVfYWR2YW5jZWRfcmVzaXplX2hvcml6b250YWwpIHsNCgkJCQlET00uc2V0U3R5bGUoZSwgJ3dpZHRoJywgJycpOw0KCQkJCURPTS5zZXRTdHlsZShpZnIsICd3aWR0aCcsIHcpOw0KDQoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHNpemUgaXMgbmV2ZXIgc21hbGxlciB0aGFuIHRoZSBvdmVyIGFsbCB1aQ0KCQkJCWlmICh3IDwgZS5jbGllbnRXaWR0aCkgew0KCQkJCQl3ID0gZS5jbGllbnRXaWR0aDsNCgkJCQkJRE9NLnNldFN0eWxlKGlmciwgJ3dpZHRoJywgZS5jbGllbnRXaWR0aCk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBTdG9yZSBhd2F5IHRoZSBzaXplDQoJCQlpZiAoc3RvcmUgJiYgcy50aGVtZV9hZHZhbmNlZF9yZXNpemluZ191c2VfY29va2llKSB7DQoJCQkJQ29va2llLnNldEhhc2goIlRpbnlNQ0VfIiArIGVkLmlkICsgIl9zaXplIiwgew0KCQkJCQljdyA6IHcsDQoJCQkJCWNoIDogaA0KCQkJCX0pOw0KCQkJfQ0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBpZCA9IHRoaXMuZWRpdG9yLmlkOw0KDQoJCQlFdmVudC5jbGVhcihpZCArICdfcmVzaXplJyk7DQoJCQlFdmVudC5jbGVhcihpZCArICdfcGF0aF9yb3cnKTsNCgkJCUV2ZW50LmNsZWFyKGlkICsgJ19leHRlcm5hbF9jbG9zZScpOw0KCQl9LA0KDQoJCS8vIEludGVybmFsIGZ1bmN0aW9ucw0KDQoJCV9zaW1wbGVMYXlvdXQgOiBmdW5jdGlvbihzLCB0YiwgbywgcCkgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBsbyA9IHMudGhlbWVfYWR2YW5jZWRfdG9vbGJhcl9sb2NhdGlvbiwgc2wgPSBzLnRoZW1lX2FkdmFuY2VkX3N0YXR1c2Jhcl9sb2NhdGlvbiwgbiwgaWMsIGV0YiwgYzsNCg0KCQkJaWYgKHMucmVhZG9ubHkpIHsNCgkJCQluID0gRE9NLmFkZCh0YiwgJ3RyJyk7DQoJCQkJbiA9IGljID0gRE9NLmFkZChuLCAndGQnLCB7J2NsYXNzJyA6ICdtY2VJZnJhbWVDb250YWluZXInfSk7DQoJCQkJcmV0dXJuIGljOw0KCQkJfQ0KDQoJCQkvLyBDcmVhdGUgdG9vbGJhciBjb250YWluZXIgYXQgdG9wDQoJCQlpZiAobG8gPT0gJ3RvcCcpDQoJCQkJdC5fYWRkVG9vbGJhcnModGIsIG8pOw0KDQoJCQkvLyBDcmVhdGUgZXh0ZXJuYWwgdG9vbGJhcg0KCQkJaWYgKGxvID09ICdleHRlcm5hbCcpIHsNCgkJCQluID0gYyA9IERPTS5jcmVhdGUoJ2RpdicsIHtzdHlsZSA6ICdwb3NpdGlvbjpyZWxhdGl2ZSd9KTsNCgkJCQluID0gRE9NLmFkZChuLCAnZGl2Jywge2lkIDogZWQuaWQgKyAnX2V4dGVybmFsJywgJ2NsYXNzJyA6ICdtY2VFeHRlcm5hbFRvb2xiYXInfSk7DQoJCQkJRE9NLmFkZChuLCAnYScsIHtpZCA6IGVkLmlkICsgJ19leHRlcm5hbF9jbG9zZScsIGhyZWYgOiAnamF2YXNjcmlwdDo7JywgJ2NsYXNzJyA6ICdtY2VFeHRlcm5hbENsb3NlJ30pOw0KCQkJCW4gPSBET00uYWRkKG4sICd0YWJsZScsIHtpZCA6IGVkLmlkICsgJ190YmxleHQnLCBjZWxsU3BhY2luZyA6IDAsIGNlbGxQYWRkaW5nIDogMH0pOw0KCQkJCWV0YiA9IERPTS5hZGQobiwgJ3Rib2R5Jyk7DQoNCgkJCQlpZiAocC5maXJzdENoaWxkLmNsYXNzTmFtZSA9PSAnbWNlT2xkQm94TW9kZWwnKQ0KCQkJCQlwLmZpcnN0Q2hpbGQuYXBwZW5kQ2hpbGQoYyk7DQoJCQkJZWxzZQ0KCQkJCQlwLmluc2VydEJlZm9yZShjLCBwLmZpcnN0Q2hpbGQpOw0KDQoJCQkJdC5fYWRkVG9vbGJhcnMoZXRiLCBvKTsNCg0KCQkJCWVkLm9uTW91c2VVcC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCXZhciBlID0gRE9NLmdldChlZC5pZCArICdfZXh0ZXJuYWwnKTsNCgkJCQkJRE9NLnNob3coZSk7DQoNCgkJCQkJRE9NLmhpZGUobGFzdEV4dElEKTsNCg0KCQkJCQl2YXIgZiA9IEV2ZW50LmFkZChlZC5pZCArICdfZXh0ZXJuYWxfY2xvc2UnLCAnY2xpY2snLCBmdW5jdGlvbigpIHsNCgkJCQkJCURPTS5oaWRlKGVkLmlkICsgJ19leHRlcm5hbCcpOw0KCQkJCQkJRXZlbnQucmVtb3ZlKGVkLmlkICsgJ19leHRlcm5hbF9jbG9zZScsICdjbGljaycsIGYpOw0KCQkJCQl9KTsNCg0KCQkJCQlET00uc2hvdyhlKTsNCgkJCQkJRE9NLnNldFN0eWxlKGUsICd0b3AnLCAwIC0gRE9NLmdldFJlY3QoZWQuaWQgKyAnX3RibGV4dCcpLmggLSAxKTsNCg0KCQkJCQkvLyBGaXhlcyBJRSByZW5kZXJpbmcgYnVnDQoJCQkJCURPTS5oaWRlKGUpOw0KCQkJCQlET00uc2hvdyhlKTsNCgkJCQkJZS5zdHlsZS5maWx0ZXIgPSAnJzsNCg0KCQkJCQlsYXN0RXh0SUQgPSBlZC5pZCArICdfZXh0ZXJuYWwnOw0KDQoJCQkJCWUgPSBudWxsOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAoc2wgPT0gJ3RvcCcpDQoJCQkJdC5fYWRkU3RhdHVzQmFyKHRiLCBvKTsNCg0KCQkJLy8gQ3JlYXRlIGlmcmFtZSBjb250YWluZXINCgkJCWlmICghcy50aGVtZV9hZHZhbmNlZF90b29sYmFyX2NvbnRhaW5lcikgew0KCQkJCW4gPSBET00uYWRkKHRiLCAndHInKTsNCgkJCQluID0gaWMgPSBET00uYWRkKG4sICd0ZCcsIHsnY2xhc3MnIDogJ21jZUlmcmFtZUNvbnRhaW5lcid9KTsNCgkJCX0NCg0KCQkJLy8gQ3JlYXRlIHRvb2xiYXIgY29udGFpbmVyIGF0IGJvdHRvbQ0KCQkJaWYgKGxvID09ICdib3R0b20nKQ0KCQkJCXQuX2FkZFRvb2xiYXJzKHRiLCBvKTsNCg0KCQkJaWYgKHNsID09ICdib3R0b20nKQ0KCQkJCXQuX2FkZFN0YXR1c0Jhcih0Yiwgbyk7DQoNCgkJCXJldHVybiBpYzsNCgkJfSwNCg0KCQlfcm93TGF5b3V0IDogZnVuY3Rpb24ocywgdGIsIG8pIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgZGMsIGRhLCBjZiA9IGVkLmNvbnRyb2xNYW5hZ2VyLCBuLCBpYywgdG8sIGE7DQoNCgkJCWRjID0gcy50aGVtZV9hZHZhbmNlZF9jb250YWluZXJzX2RlZmF1bHRfY2xhc3MgfHwgJyc7DQoJCQlkYSA9IHMudGhlbWVfYWR2YW5jZWRfY29udGFpbmVyc19kZWZhdWx0X2FsaWduIHx8ICdjZW50ZXInOw0KDQoJCQllYWNoKGV4cGxvZGUocy50aGVtZV9hZHZhbmNlZF9jb250YWluZXJzIHx8ICcnKSwgZnVuY3Rpb24oYywgaSkgew0KCQkJCXZhciB2ID0gc1sndGhlbWVfYWR2YW5jZWRfY29udGFpbmVyXycgKyBjXSB8fCAnJzsNCg0KCQkJCXN3aXRjaCAodi50b0xvd2VyQ2FzZSgpKSB7DQoJCQkJCWNhc2UgJ21jZWVkaXRvcic6DQoJCQkJCQluID0gRE9NLmFkZCh0YiwgJ3RyJyk7DQoJCQkJCQluID0gaWMgPSBET00uYWRkKG4sICd0ZCcsIHsnY2xhc3MnIDogJ21jZUlmcmFtZUNvbnRhaW5lcid9KTsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ21jZWVsZW1lbnRwYXRoJzoNCgkJCQkJCXQuX2FkZFN0YXR1c0Jhcih0Yiwgbyk7DQoJCQkJCQlicmVhazsNCg0KCQkJCQlkZWZhdWx0Og0KCQkJCQkJYSA9IChzWyd0aGVtZV9hZHZhbmNlZF9jb250YWluZXJfJyArIGMgKyAnX2FsaWduJ10gfHwgZGEpLnRvTG93ZXJDYXNlKCk7DQoJCQkJCQlhID0gJ21jZScgKyB0Ll91Zmlyc3QoYSk7DQoNCgkJCQkJCW4gPSBET00uYWRkKERPTS5hZGQodGIsICd0cicpLCAndGQnLCB7DQoJCQkJCQkJJ2NsYXNzJyA6ICdtY2VUb29sYmFyICcgKyAoc1sndGhlbWVfYWR2YW5jZWRfY29udGFpbmVyXycgKyBjICsgJ19jbGFzcyddIHx8IGRjKSArICcgJyArIGEgfHwgZGENCgkJCQkJCX0pOw0KDQoJCQkJCQl0byA9IGNmLmNyZWF0ZVRvb2xiYXIoInRvb2xiYXIiICsgaSk7DQoJCQkJCQl0Ll9hZGRDb250cm9scyh2LCB0byk7DQoJCQkJCQlET00uc2V0SFRNTChuLCB0by5yZW5kZXJIVE1MKCkpOw0KCQkJCQkJby5kZWx0YUhlaWdodCAtPSBzLnRoZW1lX2FkdmFuY2VkX3Jvd19oZWlnaHQ7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXJldHVybiBpYzsNCgkJfSwNCg0KCQlfYWRkQ29udHJvbHMgOiBmdW5jdGlvbih2LCB0Yikgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgZGksIGNmID0gdC5lZGl0b3IuY29udHJvbE1hbmFnZXI7DQoNCgkJCWlmIChzLnRoZW1lX2FkdmFuY2VkX2Rpc2FibGUgJiYgIXQuX2Rpc2FibGVkKSB7DQoJCQkJZGkgPSB7fTsNCg0KCQkJCWVhY2goZXhwbG9kZShzLnRoZW1lX2FkdmFuY2VkX2Rpc2FibGUpLCBmdW5jdGlvbih2KSB7DQoJCQkJCWRpW3ZdID0gMTsNCgkJCQl9KTsNCg0KCQkJCXQuX2Rpc2FibGVkID0gZGk7DQoJCQl9IGVsc2UNCgkJCQlkaSA9IHQuX2Rpc2FibGVkOw0KDQoJCQllYWNoKGV4cGxvZGUodiksIGZ1bmN0aW9uKG4pIHsNCgkJCQl2YXIgYzsNCg0KCQkJCWlmIChkaSAmJiBkaVtuXSkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJLy8gQ29tcGF0aWJsaXR5IHdpdGggMi54DQoJCQkJaWYgKG4gPT0gJ3RhYmxlY29udHJvbHMnKSB7DQoJCQkJCWVhY2goWyJ0YWJsZSIsInwiLCJyb3dfcHJvcHMiLCJjZWxsX3Byb3BzIiwifCIsInJvd19iZWZvcmUiLCJyb3dfYWZ0ZXIiLCJkZWxldGVfcm93IiwifCIsImNvbF9iZWZvcmUiLCJjb2xfYWZ0ZXIiLCJkZWxldGVfY29sIiwifCIsInNwbGl0X2NlbGxzIiwibWVyZ2VfY2VsbHMiXSwgZnVuY3Rpb24obikgew0KCQkJCQkJbiA9IHQuY3JlYXRlQ29udHJvbChuLCBjZik7DQoNCgkJCQkJCWlmIChuKQ0KCQkJCQkJCXRiLmFkZChuKTsNCgkJCQkJfSk7DQoNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCg0KCQkJCWMgPSB0LmNyZWF0ZUNvbnRyb2wobiwgY2YpOw0KDQoJCQkJaWYgKGMpDQoJCQkJCXRiLmFkZChjKTsNCgkJCX0pOw0KCQl9LA0KDQoJCV9hZGRUb29sYmFycyA6IGZ1bmN0aW9uKGMsIG8pIHsNCgkJCXZhciB0ID0gdGhpcywgaSwgdGIsIGVkID0gdC5lZGl0b3IsIHMgPSB0LnNldHRpbmdzLCB2LCBjZiA9IGVkLmNvbnRyb2xNYW5hZ2VyLCBkaSwgbiwgaCA9IFtdLCBhOw0KDQoJCQlhID0gcy50aGVtZV9hZHZhbmNlZF90b29sYmFyX2FsaWduLnRvTG93ZXJDYXNlKCk7DQoJCQlhID0gJ21jZScgKyB0Ll91Zmlyc3QoYSk7DQoNCgkJCW4gPSBET00uYWRkKERPTS5hZGQoYywgJ3RyJyksICd0ZCcsIHsnY2xhc3MnIDogJ21jZVRvb2xiYXIgJyArIGF9KTsNCg0KCQkJaWYgKCFlZC5nZXRQYXJhbSgnYWNjZXNzaWJpbGl0eV9mb2N1cycpKQ0KCQkJCWgucHVzaChET00uY3JlYXRlSFRNTCgnYScsIHtocmVmIDogJyMnLCBvbmZvY3VzIDogJ3RpbnlNQ0UuZ2V0KFwnJyArIGVkLmlkICsgJ1wnKS5mb2N1cygpOyd9LCAnPCEtLSBJRSAtLT4nKSk7DQoNCgkJCWgucHVzaChET00uY3JlYXRlSFRNTCgnYScsIHtocmVmIDogJyMnLCBhY2Nlc3NrZXkgOiAncScsIHRpdGxlIDogZWQuZ2V0TGFuZygiYWR2YW5jZWQudG9vbGJhcl9mb2N1cyIpfSwgJzwhLS0gSUUgLS0+JykpOw0KDQoJCQkvLyBDcmVhdGUgdG9vbGJhciBhbmQgYWRkIHRoZSBjb250cm9scw0KCQkJZm9yIChpPTE7ICh2ID0gc1sndGhlbWVfYWR2YW5jZWRfYnV0dG9ucycgKyBpXSk7IGkrKykgew0KCQkJCXRiID0gY2YuY3JlYXRlVG9vbGJhcigidG9vbGJhciIgKyBpLCB7J2NsYXNzJyA6ICdtY2VUb29sYmFyUm93JyArIGl9KTsNCg0KCQkJCWlmIChzWyd0aGVtZV9hZHZhbmNlZF9idXR0b25zJyArIGkgKyAnX2FkZCddKQ0KCQkJCQl2ICs9ICcsJyArIHNbJ3RoZW1lX2FkdmFuY2VkX2J1dHRvbnMnICsgaSArICdfYWRkJ107DQoNCgkJCQlpZiAoc1sndGhlbWVfYWR2YW5jZWRfYnV0dG9ucycgKyBpICsgJ19hZGRfYmVmb3JlJ10pDQoJCQkJCXYgPSBzWyd0aGVtZV9hZHZhbmNlZF9idXR0b25zJyArIGkgKyAnX2FkZF9iZWZvcmUnXSArICcsJyArIHY7DQoNCgkJCQl0Ll9hZGRDb250cm9scyh2LCB0Yik7DQoNCgkJCQkvL24uYXBwZW5kQ2hpbGQobiA9IHRiLnJlbmRlcigpKTsNCgkJCQloLnB1c2godGIucmVuZGVySFRNTCgpKTsNCg0KCQkJCW8uZGVsdGFIZWlnaHQgLT0gcy50aGVtZV9hZHZhbmNlZF9yb3dfaGVpZ2h0Ow0KCQkJfQ0KDQoJCQloLnB1c2goRE9NLmNyZWF0ZUhUTUwoJ2EnLCB7aHJlZiA6ICcjJywgYWNjZXNza2V5IDogJ3onLCB0aXRsZSA6IGVkLmdldExhbmcoImFkdmFuY2VkLnRvb2xiYXJfZm9jdXMiKSwgb25mb2N1cyA6ICd0aW55TUNFLmdldEluc3RhbmNlQnlJZChcJycgKyBlZC5pZCArICdcJykuZm9jdXMoKTsnfSwgJzwhLS0gSUUgLS0+JykpOw0KCQkJRE9NLnNldEhUTUwobiwgaC5qb2luKCcnKSk7DQoJCX0sDQoNCgkJX2FkZFN0YXR1c0JhciA6IGZ1bmN0aW9uKHRiLCBvKSB7DQoJCQl2YXIgbiwgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIHMgPSB0LnNldHRpbmdzLCByLCBtZiwgbWUsIHRkOw0KDQoJCQluID0gRE9NLmFkZCh0YiwgJ3RyJyk7DQoJCQluID0gdGQgPSBET00uYWRkKG4sICd0ZCcsIHsnY2xhc3MnIDogJ21jZVN0YXR1c2Jhcid9KTsNCgkJCW4gPSBET00uYWRkKG4sICdkaXYnLCB7aWQgOiBlZC5pZCArICdfcGF0aF9yb3cnfSwgcy50aGVtZV9hZHZhbmNlZF9wYXRoID8gZWQudHJhbnNsYXRlKCdhZHZhbmNlZC5wYXRoJykgKyAnOiAnIDogJyYjMTYwOycpOw0KCQkJRE9NLmFkZChuLCAnYScsIHtocmVmIDogJyMnLCBhY2Nlc3NrZXkgOiAneCd9KTsNCg0KCQkJaWYgKHMudGhlbWVfYWR2YW5jZWRfcmVzaXppbmcpIHsNCgkJCQlET00uYWRkKHRkLCAnYScsIHtpZCA6IGVkLmlkICsgJ19yZXNpemUnLCBocmVmIDogJ2phdmFzY3JpcHQ6OycsIG9uY2xpY2sgOiAicmV0dXJuIGZhbHNlOyIsICdjbGFzcycgOiAnbWNlUmVzaXplJ30pOw0KDQoJCQkJaWYgKHMudGhlbWVfYWR2YW5jZWRfcmVzaXppbmdfdXNlX2Nvb2tpZSkgew0KCQkJCQllZC5vblBvc3RSZW5kZXIuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQkJdmFyIG8gPSBDb29raWUuZ2V0SGFzaCgiVGlueU1DRV8iICsgZWQuaWQgKyAiX3NpemUiKSwgYyA9IERPTS5nZXQoZWQuaWQgKyAnX3RibCcpOw0KDQoJCQkJCQlpZiAoIW8pDQoJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQl0LnJlc2l6ZVRvKG8uY3csIG8uY2gpOw0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQllZC5vblBvc3RSZW5kZXIuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQlFdmVudC5hZGQoZWQuaWQgKyAnX3Jlc2l6ZScsICdjbGljaycsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsNCgkJCQkJfSk7DQoNCgkJCQkJRXZlbnQuYWRkKGVkLmlkICsgJ19yZXNpemUnLCAnbW91c2Vkb3duJywgZnVuY3Rpb24oZSkgew0KCQkJCQkJdmFyIG1vdXNlTW92ZUhhbmRsZXIxLCBtb3VzZU1vdmVIYW5kbGVyMiwNCgkJCQkJCQltb3VzZVVwSGFuZGxlcjEsIG1vdXNlVXBIYW5kbGVyMiwNCgkJCQkJCQlzdGFydFgsIHN0YXJ0WSwgc3RhcnRXaWR0aCwgc3RhcnRIZWlnaHQsIHdpZHRoLCBoZWlnaHQsIGlmckVsbTsNCg0KCQkJCQkJZnVuY3Rpb24gcmVzaXplT25Nb3ZlKGUpIHsNCgkJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7DQoNCgkJCQkJCQl3aWR0aCA9IHN0YXJ0V2lkdGggKyAoZS5zY3JlZW5YIC0gc3RhcnRYKTsNCgkJCQkJCQloZWlnaHQgPSBzdGFydEhlaWdodCArIChlLnNjcmVlblkgLSBzdGFydFkpOw0KDQoJCQkJCQkJdC5yZXNpemVUbyh3aWR0aCwgaGVpZ2h0KTsNCgkJCQkJCX07DQoNCgkJCQkJCWZ1bmN0aW9uIGVuZFJlc2l6ZShlKSB7DQoJCQkJCQkJLy8gU3RvcCBsaXN0ZW5pbmcNCgkJCQkJCQlFdmVudC5yZW1vdmUoRE9NLmRvYywgJ21vdXNlbW92ZScsIG1vdXNlTW92ZUhhbmRsZXIxKTsNCgkJCQkJCQlFdmVudC5yZW1vdmUoZWQuZ2V0RG9jKCksICdtb3VzZW1vdmUnLCBtb3VzZU1vdmVIYW5kbGVyMik7DQoJCQkJCQkJRXZlbnQucmVtb3ZlKERPTS5kb2MsICdtb3VzZXVwJywgbW91c2VVcEhhbmRsZXIxKTsNCgkJCQkJCQlFdmVudC5yZW1vdmUoZWQuZ2V0RG9jKCksICdtb3VzZXVwJywgbW91c2VVcEhhbmRsZXIyKTsNCg0KCQkJCQkJCXdpZHRoID0gc3RhcnRXaWR0aCArIChlLnNjcmVlblggLSBzdGFydFgpOw0KCQkJCQkJCWhlaWdodCA9IHN0YXJ0SGVpZ2h0ICsgKGUuc2NyZWVuWSAtIHN0YXJ0WSk7DQoJCQkJCQkJdC5yZXNpemVUbyh3aWR0aCwgaGVpZ2h0LCB0cnVlKTsNCgkJCQkJCX07DQoNCgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsNCg0KCQkJCQkJLy8gR2V0IHRoZSBjdXJyZW50IHJlY3Qgc2l6ZQ0KCQkJCQkJc3RhcnRYID0gZS5zY3JlZW5YOw0KCQkJCQkJc3RhcnRZID0gZS5zY3JlZW5ZOw0KCQkJCQkJaWZyRWxtID0gRE9NLmdldCh0LmVkaXRvci5pZCArICdfaWZyJyk7DQoJCQkJCQlzdGFydFdpZHRoID0gd2lkdGggPSBpZnJFbG0uY2xpZW50V2lkdGg7DQoJCQkJCQlzdGFydEhlaWdodCA9IGhlaWdodCA9IGlmckVsbS5jbGllbnRIZWlnaHQ7DQoNCgkJCQkJCS8vIFJlZ2lzdGVyIGVudmVudCBoYW5kbGVycw0KCQkJCQkJbW91c2VNb3ZlSGFuZGxlcjEgPSBFdmVudC5hZGQoRE9NLmRvYywgJ21vdXNlbW92ZScsIHJlc2l6ZU9uTW92ZSk7DQoJCQkJCQltb3VzZU1vdmVIYW5kbGVyMiA9IEV2ZW50LmFkZChlZC5nZXREb2MoKSwgJ21vdXNlbW92ZScsIHJlc2l6ZU9uTW92ZSk7DQoJCQkJCQltb3VzZVVwSGFuZGxlcjEgPSBFdmVudC5hZGQoRE9NLmRvYywgJ21vdXNldXAnLCBlbmRSZXNpemUpOw0KCQkJCQkJbW91c2VVcEhhbmRsZXIyID0gRXZlbnQuYWRkKGVkLmdldERvYygpLCAnbW91c2V1cCcsIGVuZFJlc2l6ZSk7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlvLmRlbHRhSGVpZ2h0IC09IDIxOw0KCQkJbiA9IHRiID0gbnVsbDsNCgkJfSwNCg0KCQlfbm9kZUNoYW5nZWQgOiBmdW5jdGlvbihlZCwgY20sIG4sIGNvLCBvYikgew0KCQkJdmFyIHQgPSB0aGlzLCBwLCBkZSA9IDAsIHYsIGMsIHMgPSB0LnNldHRpbmdzLCBjbCwgZnosIGZuLCBmb3JtYXROYW1lcywgbWF0Y2hlczsNCg0KCQkJdGlueW1jZS5lYWNoKHQuc3RhdGVDb250cm9scywgZnVuY3Rpb24oYykgew0KCQkJCWNtLnNldEFjdGl2ZShjLCBlZC5xdWVyeUNvbW1hbmRTdGF0ZSh0LmNvbnRyb2xzW2NdWzFdKSk7DQoJCQl9KTsNCg0KCQkJZnVuY3Rpb24gZ2V0UGFyZW50KG5hbWUpIHsNCgkJCQl2YXIgaSwgcGFyZW50cyA9IG9iLnBhcmVudHMsIGZ1bmMgPSBuYW1lOw0KDQoJCQkJaWYgKHR5cGVvZihuYW1lKSA9PSAnc3RyaW5nJykgew0KCQkJCQlmdW5jID0gZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJcmV0dXJuIG5vZGUubm9kZU5hbWUgPT0gbmFtZTsNCgkJCQkJfTsNCgkJCQl9DQoNCgkJCQlmb3IgKGkgPSAwOyBpIDwgcGFyZW50cy5sZW5ndGg7IGkrKykgew0KCQkJCQlpZiAoZnVuYyhwYXJlbnRzW2ldKSkNCgkJCQkJCXJldHVybiBwYXJlbnRzW2ldOw0KCQkJCX0NCgkJCX07DQoNCgkJCWNtLnNldEFjdGl2ZSgndmlzdWFsYWlkJywgZWQuaGFzVmlzdWFsKTsNCgkJCWNtLnNldERpc2FibGVkKCd1bmRvJywgIWVkLnVuZG9NYW5hZ2VyLmhhc1VuZG8oKSAmJiAhZWQudHlwaW5nKTsNCgkJCWNtLnNldERpc2FibGVkKCdyZWRvJywgIWVkLnVuZG9NYW5hZ2VyLmhhc1JlZG8oKSk7DQoJCQljbS5zZXREaXNhYmxlZCgnb3V0ZGVudCcsICFlZC5xdWVyeUNvbW1hbmRTdGF0ZSgnT3V0ZGVudCcpKTsNCg0KCQkJcCA9IGdldFBhcmVudCgnQScpOw0KCQkJaWYgKGMgPSBjbS5nZXQoJ2xpbmsnKSkgew0KCQkJCWlmICghcCB8fCAhcC5uYW1lKSB7DQoJCQkJCWMuc2V0RGlzYWJsZWQoIXAgJiYgY28pOw0KCQkJCQljLnNldEFjdGl2ZSghIXApOw0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKGMgPSBjbS5nZXQoJ3VubGluaycpKSB7DQoJCQkJYy5zZXREaXNhYmxlZCghcCAmJiBjbyk7DQoJCQkJYy5zZXRBY3RpdmUoISFwICYmICFwLm5hbWUpOw0KCQkJfQ0KDQoJCQlpZiAoYyA9IGNtLmdldCgnYW5jaG9yJykpIHsNCgkJCQljLnNldEFjdGl2ZSghIXAgJiYgcC5uYW1lKTsNCgkJCX0NCg0KCQkJcCA9IGdldFBhcmVudCgnSU1HJyk7DQoJCQlpZiAoYyA9IGNtLmdldCgnaW1hZ2UnKSkNCgkJCQljLnNldEFjdGl2ZSghIXAgJiYgbi5jbGFzc05hbWUuaW5kZXhPZignbWNlSXRlbScpID09IC0xKTsNCg0KCQkJaWYgKGMgPSBjbS5nZXQoJ3N0eWxlc2VsZWN0JykpIHsNCgkJCQl0Ll9pbXBvcnRDbGFzc2VzKCk7DQoNCgkJCQlmb3JtYXROYW1lcyA9IFtdOw0KCQkJCWVhY2goYy5pdGVtcywgZnVuY3Rpb24oaXRlbSkgew0KCQkJCQlmb3JtYXROYW1lcy5wdXNoKGl0ZW0udmFsdWUpOw0KCQkJCX0pOw0KDQoJCQkJbWF0Y2hlcyA9IGVkLmZvcm1hdHRlci5tYXRjaEFsbChmb3JtYXROYW1lcyk7DQoJCQkJYy5zZWxlY3QobWF0Y2hlc1swXSk7DQoJCQl9DQoNCgkJCWlmIChjID0gY20uZ2V0KCdmb3JtYXRzZWxlY3QnKSkgew0KCQkJCXAgPSBnZXRQYXJlbnQoRE9NLmlzQmxvY2spOw0KDQoJCQkJaWYgKHApDQoJCQkJCWMuc2VsZWN0KHAubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7DQoJCQl9DQoNCgkJCS8vIEZpbmQgb3V0IGN1cnJlbnQgZm9udFNpemUsIGZvbnRGYW1pbHkgYW5kIGZvbnRDbGFzcw0KCQkJZ2V0UGFyZW50KGZ1bmN0aW9uKG4pIHsNCgkJCQlpZiAobi5ub2RlTmFtZSA9PT0gJ1NQQU4nKSB7DQoJCQkJCWlmICghY2wgJiYgbi5jbGFzc05hbWUpDQoJCQkJCQljbCA9IG4uY2xhc3NOYW1lOw0KDQoJCQkJCWlmICghZnogJiYgbi5zdHlsZS5mb250U2l6ZSkNCgkJCQkJCWZ6ID0gbi5zdHlsZS5mb250U2l6ZTsNCg0KCQkJCQlpZiAoIWZuICYmIG4uc3R5bGUuZm9udEZhbWlseSkNCgkJCQkJCWZuID0gbi5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2UoL1tcIlwnXSsvZywgJycpLnJlcGxhY2UoL14oW14sXSspLiovLCAnJDEnKS50b0xvd2VyQ2FzZSgpOw0KCQkJCX0NCg0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0pOw0KDQoJCQlpZiAoYyA9IGNtLmdldCgnZm9udHNlbGVjdCcpKSB7DQoJCQkJYy5zZWxlY3QoZnVuY3Rpb24odikgew0KCQkJCQlyZXR1cm4gdi5yZXBsYWNlKC9eKFteLF0rKS4qLywgJyQxJykudG9Mb3dlckNhc2UoKSA9PSBmbjsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gU2VsZWN0IGZvbnQgc2l6ZQ0KCQkJaWYgKGMgPSBjbS5nZXQoJ2ZvbnRzaXplc2VsZWN0JykpIHsNCgkJCQkvLyBVc2UgY29tcHV0ZWQgc3R5bGUNCgkJCQlpZiAocy50aGVtZV9hZHZhbmNlZF9ydW50aW1lX2ZvbnRzaXplICYmICFmeiAmJiAhY2wpDQoJCQkJCWZ6ID0gZWQuZG9tLmdldFN0eWxlKG4sICdmb250U2l6ZScsIHRydWUpOw0KDQoJCQkJYy5zZWxlY3QoZnVuY3Rpb24odikgew0KCQkJCQlpZiAodi5mb250U2l6ZSAmJiB2LmZvbnRTaXplID09PSBmeikNCgkJCQkJCXJldHVybiB0cnVlOw0KDQoJCQkJCWlmICh2WydjbGFzcyddICYmIHZbJ2NsYXNzJ10gPT09IGNsKQ0KCQkJCQkJcmV0dXJuIHRydWU7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLnRoZW1lX2FkdmFuY2VkX3BhdGggJiYgcy50aGVtZV9hZHZhbmNlZF9zdGF0dXNiYXJfbG9jYXRpb24pIHsNCgkJCQlwID0gRE9NLmdldChlZC5pZCArICdfcGF0aCcpIHx8IERPTS5hZGQoZWQuaWQgKyAnX3BhdGhfcm93JywgJ3NwYW4nLCB7aWQgOiBlZC5pZCArICdfcGF0aCd9KTsNCgkJCQlET00uc2V0SFRNTChwLCAnJyk7DQoNCgkJCQlnZXRQYXJlbnQoZnVuY3Rpb24obikgew0KCQkJCQl2YXIgbmEgPSBuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHUsIHBpLCB0aSA9ICcnOw0KDQoJCQkJCS8qaWYgKG4uZ2V0QXR0cmlidXRlKCdfbWNlX2JvZ3VzJykpDQoJCQkJCQlyZXR1cm47DQoqLw0KCQkJCQkvLyBJZ25vcmUgbm9uIGVsZW1lbnQgYW5kIGhpZGRlbiBlbGVtZW50cw0KCQkJCQlpZiAobi5ub2RlVHlwZSAhPSAxIHx8IG4ubm9kZU5hbWUgPT09ICdCUicgfHwgKERPTS5oYXNDbGFzcyhuLCAnbWNlSXRlbUhpZGRlbicpIHx8IERPTS5oYXNDbGFzcyhuLCAnbWNlSXRlbVJlbW92ZWQnKSkpDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJLy8gRmFrZSBuYW1lDQoJCQkJCWlmICh2ID0gRE9NLmdldEF0dHJpYihuLCAnbWNlX25hbWUnKSkNCgkJCQkJCW5hID0gdjsNCg0KCQkJCQkvLyBIYW5kbGUgcHJlZml4DQoJCQkJCWlmICh0aW55bWNlLmlzSUUgJiYgbi5zY29wZU5hbWUgIT09ICdIVE1MJykNCgkJCQkJCW5hID0gbi5zY29wZU5hbWUgKyAnOicgKyBuYTsNCg0KCQkJCQkvLyBSZW1vdmUgaW50ZXJuYWwgcHJlZml4DQoJCQkJCW5hID0gbmEucmVwbGFjZSgvbWNlXDovZywgJycpOw0KDQoJCQkJCS8vIEhhbmRsZSBub2RlIG5hbWUNCgkJCQkJc3dpdGNoIChuYSkgew0KCQkJCQkJY2FzZSAnYic6DQoJCQkJCQkJbmEgPSAnc3Ryb25nJzsNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJY2FzZSAnaSc6DQoJCQkJCQkJbmEgPSAnZW0nOw0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQljYXNlICdpbWcnOg0KCQkJCQkJCWlmICh2ID0gRE9NLmdldEF0dHJpYihuLCAnc3JjJykpDQoJCQkJCQkJCXRpICs9ICdzcmM6ICcgKyB2ICsgJyAnOw0KDQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWNhc2UgJ2EnOg0KCQkJCQkJCWlmICh2ID0gRE9NLmdldEF0dHJpYihuLCAnbmFtZScpKSB7DQoJCQkJCQkJCXRpICs9ICduYW1lOiAnICsgdiArICcgJzsNCgkJCQkJCQkJbmEgKz0gJyMnICsgdjsNCgkJCQkJCQl9DQoNCgkJCQkJCQlpZiAodiA9IERPTS5nZXRBdHRyaWIobiwgJ2hyZWYnKSkNCgkJCQkJCQkJdGkgKz0gJ2hyZWY6ICcgKyB2ICsgJyAnOw0KDQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWNhc2UgJ2ZvbnQnOg0KCQkJCQkJCWlmICh2ID0gRE9NLmdldEF0dHJpYihuLCAnZmFjZScpKQ0KCQkJCQkJCQl0aSArPSAnZm9udDogJyArIHYgKyAnICc7DQoNCgkJCQkJCQlpZiAodiA9IERPTS5nZXRBdHRyaWIobiwgJ3NpemUnKSkNCgkJCQkJCQkJdGkgKz0gJ3NpemU6ICcgKyB2ICsgJyAnOw0KDQoJCQkJCQkJaWYgKHYgPSBET00uZ2V0QXR0cmliKG4sICdjb2xvcicpKQ0KCQkJCQkJCQl0aSArPSAnY29sb3I6ICcgKyB2ICsgJyAnOw0KDQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWNhc2UgJ3NwYW4nOg0KCQkJCQkJCWlmICh2ID0gRE9NLmdldEF0dHJpYihuLCAnc3R5bGUnKSkNCgkJCQkJCQkJdGkgKz0gJ3N0eWxlOiAnICsgdiArICcgJzsNCg0KCQkJCQkJCWJyZWFrOw0KCQkJCQl9DQoNCgkJCQkJaWYgKHYgPSBET00uZ2V0QXR0cmliKG4sICdpZCcpKQ0KCQkJCQkJdGkgKz0gJ2lkOiAnICsgdiArICcgJzsNCg0KCQkJCQlpZiAodiA9IG4uY2xhc3NOYW1lKSB7DQoJCQkJCQl2ID0gdi5yZXBsYWNlKC9cYlxzKih3ZWJraXR8bWNlfEFwcGxlLSlcdytccypcYi9nLCAnJykNCg0KCQkJCQkJaWYgKHYpIHsNCgkJCQkJCQl0aSArPSAnY2xhc3M6ICcgKyB2ICsgJyAnOw0KDQoJCQkJCQkJaWYgKERPTS5pc0Jsb2NrKG4pIHx8IG5hID09ICdpbWcnIHx8IG5hID09ICdzcGFuJykNCgkJCQkJCQkJbmEgKz0gJy4nICsgdjsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCW5hID0gbmEucmVwbGFjZSgvKGh0bWw6KS9nLCAnJyk7DQoJCQkJCW5hID0ge25hbWUgOiBuYSwgbm9kZSA6IG4sIHRpdGxlIDogdGl9Ow0KCQkJCQl0Lm9uUmVzb2x2ZU5hbWUuZGlzcGF0Y2godCwgbmEpOw0KCQkJCQl0aSA9IG5hLnRpdGxlOw0KCQkJCQluYSA9IG5hLm5hbWU7DQoNCgkJCQkJLy91ID0gImphdmFzY3JpcHQ6dGlueW1jZS5FZGl0b3JNYW5hZ2VyLmdldCgnIiArIGVkLmlkICsgIicpLnRoZW1lLl9zZWwoJyIgKyAoZGUrKykgKyAiJyk7IjsNCgkJCQkJcGkgPSBET00uY3JlYXRlKCdhJywgeydocmVmJyA6ICJqYXZhc2NyaXB0OjsiLCBvbm1vdXNlZG93biA6ICJyZXR1cm4gZmFsc2U7IiwgdGl0bGUgOiB0aSwgJ2NsYXNzJyA6ICdtY2VQYXRoXycgKyAoZGUrKyl9LCBuYSk7DQoNCgkJCQkJaWYgKHAuaGFzQ2hpbGROb2RlcygpKSB7DQoJCQkJCQlwLmluc2VydEJlZm9yZShET00uZG9jLmNyZWF0ZVRleHROb2RlKCcgXHUwMGJiICcpLCBwLmZpcnN0Q2hpbGQpOw0KCQkJCQkJcC5pbnNlcnRCZWZvcmUocGksIHAuZmlyc3RDaGlsZCk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJcC5hcHBlbmRDaGlsZChwaSk7DQoJCQkJfSwgZWQuZ2V0Qm9keSgpKTsNCgkJCX0NCgkJfSwNCg0KCQkvLyBDb21tYW5kcyBnZXRzIGNhbGxlZCBieSBleGVjQ29tbWFuZA0KDQoJCV9zZWwgOiBmdW5jdGlvbih2KSB7DQoJCQl0aGlzLmVkaXRvci5leGVjQ29tbWFuZCgnbWNlU2VsZWN0Tm9kZURlcHRoJywgZmFsc2UsIHYpOw0KCQl9LA0KDQoJCV9tY2VJbnNlcnRBbmNob3IgOiBmdW5jdGlvbih1aSwgdikgew0KCQkJdmFyIGVkID0gdGhpcy5lZGl0b3I7DQoNCgkJCWVkLndpbmRvd01hbmFnZXIub3Blbih7DQoJCQkJdXJsIDogdGhpcy51cmwgKyAnL2FuY2hvci5odG0nLA0KCQkJCXdpZHRoIDogMzIwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygnYWR2YW5jZWQuYW5jaG9yX2RlbHRhX3dpZHRoJywgMCkpLA0KCQkJCWhlaWdodCA6IDkwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygnYWR2YW5jZWQuYW5jaG9yX2RlbHRhX2hlaWdodCcsIDApKSwNCgkJCQlpbmxpbmUgOiB0cnVlDQoJCQl9LCB7DQoJCQkJdGhlbWVfdXJsIDogdGhpcy51cmwNCgkJCX0pOw0KCQl9LA0KDQoJCV9tY2VDaGFyTWFwIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvcjsNCg0KCQkJZWQud2luZG93TWFuYWdlci5vcGVuKHsNCgkJCQl1cmwgOiB0aGlzLnVybCArICcvY2hhcm1hcC5odG0nLA0KCQkJCXdpZHRoIDogNTUwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygnYWR2YW5jZWQuY2hhcm1hcF9kZWx0YV93aWR0aCcsIDApKSwNCgkJCQloZWlnaHQgOiAyNTAgKyBwYXJzZUludChlZC5nZXRMYW5nKCdhZHZhbmNlZC5jaGFybWFwX2RlbHRhX2hlaWdodCcsIDApKSwNCgkJCQlpbmxpbmUgOiB0cnVlDQoJCQl9LCB7DQoJCQkJdGhlbWVfdXJsIDogdGhpcy51cmwNCgkJCX0pOw0KCQl9LA0KDQoJCV9tY2VIZWxwIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvcjsNCg0KCQkJZWQud2luZG93TWFuYWdlci5vcGVuKHsNCgkJCQl1cmwgOiB0aGlzLnVybCArICcvYWJvdXQuaHRtJywNCgkJCQl3aWR0aCA6IDQ4MCwNCgkJCQloZWlnaHQgOiAzODAsDQoJCQkJaW5saW5lIDogdHJ1ZQ0KCQkJfSwgew0KCQkJCXRoZW1lX3VybCA6IHRoaXMudXJsDQoJCQl9KTsNCgkJfSwNCg0KCQlfbWNlQ29sb3JQaWNrZXIgOiBmdW5jdGlvbih1LCB2KSB7DQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvcjsNCg0KCQkJdiA9IHYgfHwge307DQoNCgkJCWVkLndpbmRvd01hbmFnZXIub3Blbih7DQoJCQkJdXJsIDogdGhpcy51cmwgKyAnL2NvbG9yX3BpY2tlci5odG0nLA0KCQkJCXdpZHRoIDogMzc1ICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygnYWR2YW5jZWQuY29sb3JwaWNrZXJfZGVsdGFfd2lkdGgnLCAwKSksDQoJCQkJaGVpZ2h0IDogMjUwICsgcGFyc2VJbnQoZWQuZ2V0TGFuZygnYWR2YW5jZWQuY29sb3JwaWNrZXJfZGVsdGFfaGVpZ2h0JywgMCkpLA0KCQkJCWNsb3NlX3ByZXZpb3VzIDogZmFsc2UsDQoJCQkJaW5saW5lIDogdHJ1ZQ0KCQkJfSwgew0KCQkJCWlucHV0X2NvbG9yIDogdi5jb2xvciwNCgkJCQlmdW5jIDogdi5mdW5jLA0KCQkJCXRoZW1lX3VybCA6IHRoaXMudXJsDQoJCQl9KTsNCgkJfSwNCg0KCQlfbWNlQ29kZUVkaXRvciA6IGZ1bmN0aW9uKHVpLCB2YWwpIHsNCgkJCXZhciBlZCA9IHRoaXMuZWRpdG9yOw0KDQoJCQllZC53aW5kb3dNYW5hZ2VyLm9wZW4oew0KCQkJCXVybCA6IHRoaXMudXJsICsgJy9zb3VyY2VfZWRpdG9yLmh0bScsDQoJCQkJd2lkdGggOiBwYXJzZUludChlZC5nZXRQYXJhbSgidGhlbWVfYWR2YW5jZWRfc291cmNlX2VkaXRvcl93aWR0aCIsIDcyMCkpLA0KCQkJCWhlaWdodCA6IHBhcnNlSW50KGVkLmdldFBhcmFtKCJ0aGVtZV9hZHZhbmNlZF9zb3VyY2VfZWRpdG9yX2hlaWdodCIsIDU4MCkpLA0KCQkJCWlubGluZSA6IHRydWUsDQoJCQkJcmVzaXphYmxlIDogdHJ1ZSwNCgkJCQltYXhpbWl6YWJsZSA6IHRydWUNCgkJCX0sIHsNCgkJCQl0aGVtZV91cmwgOiB0aGlzLnVybA0KCQkJfSk7DQoJCX0sDQoNCgkJX21jZUltYWdlIDogZnVuY3Rpb24odWksIHZhbCkgew0KCQkJdmFyIGVkID0gdGhpcy5lZGl0b3I7DQoNCgkJCS8vIEludGVybmFsIGltYWdlIG9iamVjdCBsaWtlIGEgZmxhc2ggcGxhY2Vob2xkZXINCgkJCWlmIChlZC5kb20uZ2V0QXR0cmliKGVkLnNlbGVjdGlvbi5nZXROb2RlKCksICdjbGFzcycpLmluZGV4T2YoJ21jZUl0ZW0nKSAhPSAtMSkNCgkJCQlyZXR1cm47DQoNCgkJCWVkLndpbmRvd01hbmFnZXIub3Blbih7DQoJCQkJdXJsIDogdGhpcy51cmwgKyAnL2ltYWdlLmh0bScsDQoJCQkJd2lkdGggOiAzNTUgKyBwYXJzZUludChlZC5nZXRMYW5nKCdhZHZhbmNlZC5pbWFnZV9kZWx0YV93aWR0aCcsIDApKSwNCgkJCQloZWlnaHQgOiAyNzUgKyBwYXJzZUludChlZC5nZXRMYW5nKCdhZHZhbmNlZC5pbWFnZV9kZWx0YV9oZWlnaHQnLCAwKSksDQoJCQkJaW5saW5lIDogdHJ1ZQ0KCQkJfSwgew0KCQkJCXRoZW1lX3VybCA6IHRoaXMudXJsDQoJCQl9KTsNCgkJfSwNCg0KCQlfbWNlTGluayA6IGZ1bmN0aW9uKHVpLCB2YWwpIHsNCgkJCXZhciBlZCA9IHRoaXMuZWRpdG9yOw0KDQoJCQllZC53aW5kb3dNYW5hZ2VyLm9wZW4oew0KCQkJCXVybCA6IHRoaXMudXJsICsgJy9saW5rLmh0bScsDQoJCQkJd2lkdGggOiAzMTAgKyBwYXJzZUludChlZC5nZXRMYW5nKCdhZHZhbmNlZC5saW5rX2RlbHRhX3dpZHRoJywgMCkpLA0KCQkJCWhlaWdodCA6IDIwMCArIHBhcnNlSW50KGVkLmdldExhbmcoJ2FkdmFuY2VkLmxpbmtfZGVsdGFfaGVpZ2h0JywgMCkpLA0KCQkJCWlubGluZSA6IHRydWUNCgkJCX0sIHsNCgkJCQl0aGVtZV91cmwgOiB0aGlzLnVybA0KCQkJfSk7DQoJCX0sDQoNCgkJX21jZU5ld0RvY3VtZW50IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvcjsNCg0KCQkJZWQud2luZG93TWFuYWdlci5jb25maXJtKCdhZHZhbmNlZC5uZXdkb2N1bWVudCcsIGZ1bmN0aW9uKHMpIHsNCgkJCQlpZiAocykNCgkJCQkJZWQuZXhlY0NvbW1hbmQoJ21jZVNldENvbnRlbnQnLCBmYWxzZSwgJycpOw0KCQkJfSk7DQoJCX0sDQoNCgkJX21jZUZvcmVDb2xvciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0aGlzLl9tY2VDb2xvclBpY2tlcigwLCB7DQoJCQkJY29sb3I6IHQuZmdDb2xvciwNCgkJCQlmdW5jIDogZnVuY3Rpb24oY28pIHsNCgkJCQkJdC5mZ0NvbG9yID0gY287DQoJCQkJCXQuZWRpdG9yLmV4ZWNDb21tYW5kKCdGb3JlQ29sb3InLCBmYWxzZSwgY28pOw0KCQkJCX0NCgkJCX0pOw0KCQl9LA0KDQoJCV9tY2VCYWNrQ29sb3IgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdGhpcy5fbWNlQ29sb3JQaWNrZXIoMCwgew0KCQkJCWNvbG9yOiB0LmJnQ29sb3IsDQoJCQkJZnVuYyA6IGZ1bmN0aW9uKGNvKSB7DQoJCQkJCXQuYmdDb2xvciA9IGNvOw0KCQkJCQl0LmVkaXRvci5leGVjQ29tbWFuZCgnSGlsaXRlQ29sb3InLCBmYWxzZSwgY28pOw0KCQkJCX0NCgkJCX0pOw0KCQl9LA0KDQoJCV91Zmlyc3QgOiBmdW5jdGlvbihzKSB7DQoJCQlyZXR1cm4gcy5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHMuc3Vic3RyaW5nKDEpOw0KCQl9DQoJfSk7DQoNCgl0aW55bWNlLlRoZW1lTWFuYWdlci5hZGQoJ2FkdmFuY2VkJywgdGlueW1jZS50aGVtZXMuQWR2YW5jZWRUaGVtZSk7DQp9KHRpbnltY2UpKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/image.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjYWR2YW5jZWRfZGxnLmltYWdlX3RpdGxlfTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9tY3RhYnMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vdXRpbHMvZm9ybV91dGlscy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9pbWFnZS5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHkgaWQ9ImltYWdlIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+Cjxmb3JtIG9uc3VibWl0PSJJbWFnZURpYWxvZy51cGRhdGUoKTtyZXR1cm4gZmFsc2U7IiBhY3Rpb249IiMiPgoJPGRpdiBjbGFzcz0idGFicyI+CgkJPHVsPgoJCQk8bGkgaWQ9ImdlbmVyYWxfdGFiIiBjbGFzcz0iY3VycmVudCI+PHNwYW4+PGEgaHJlZj0iamF2YXNjcmlwdDptY1RhYnMuZGlzcGxheVRhYignZ2VuZXJhbF90YWInLCdnZW5lcmFsX3BhbmVsJyk7IiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyI+eyNhZHZhbmNlZF9kbGcuaW1hZ2VfdGl0bGV9PC9hPjwvc3Bhbj48L2xpPgoJCTwvdWw+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJwYW5lbF93cmFwcGVyIj4KCQk8ZGl2IGlkPSJnZW5lcmFsX3BhbmVsIiBjbGFzcz0icGFuZWwgY3VycmVudCI+CiAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJub3dyYXAiPjxsYWJlbCBmb3I9InNyYyI+eyNhZHZhbmNlZF9kbGcuaW1hZ2Vfc3JjfTwvbGFiZWw+PC90ZD4KICAgICAgICAgICAgPHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgaWQ9InNyYyIgbmFtZT0ic3JjIiB0eXBlPSJ0ZXh0IiBjbGFzcz0ibWNlRm9jdXMiIHZhbHVlPSIiIHN0eWxlPSJ3aWR0aDogMjAwcHgiIG9uY2hhbmdlPSJJbWFnZURpYWxvZy5nZXRJbWFnZURhdGEoKTsiIC8+PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGlkPSJzcmNicm93c2VyY29udGFpbmVyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPjwvdGQ+CiAgICAgICAgICA8L3RyPgoJCSAgPHRyPgoJCQk8dGQ+PGxhYmVsIGZvcj0iaW1hZ2VfbGlzdCI+eyNhZHZhbmNlZF9kbGcuaW1hZ2VfbGlzdH08L2xhYmVsPjwvdGQ+CgkJCTx0ZD48c2VsZWN0IGlkPSJpbWFnZV9saXN0IiBuYW1lPSJpbWFnZV9saXN0IiBvbmNoYW5nZT0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NyYycpLnZhbHVlPXRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbHQnKS52YWx1ZT10aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS50ZXh0OyI+PC9zZWxlY3Q+PC90ZD4KCQkgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgZm9yPSJhbHQiPnsjYWR2YW5jZWRfZGxnLmltYWdlX2FsdH08L2xhYmVsPjwvdGQ+CiAgICAgICAgICAgIDx0ZD48aW5wdXQgaWQ9ImFsdCIgbmFtZT0iYWx0IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzdHlsZT0id2lkdGg6IDIwMHB4IiAvPjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9Im5vd3JhcCI+PGxhYmVsIGZvcj0iYWxpZ24iPnsjYWR2YW5jZWRfZGxnLmltYWdlX2FsaWdufTwvbGFiZWw+PC90ZD4KICAgICAgICAgICAgPHRkPjxzZWxlY3QgaWQ9ImFsaWduIiBuYW1lPSJhbGlnbiIgb25jaGFuZ2U9IkltYWdlRGlhbG9nLnVwZGF0ZVN0eWxlKCk7Ij4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+eyNub3Rfc2V0fTwvb3B0aW9uPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYmFzZWxpbmUiPnsjYWR2YW5jZWRfZGxnLmltYWdlX2FsaWduX2Jhc2VsaW5lfTwvb3B0aW9uPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idG9wIj57I2FkdmFuY2VkX2RsZy5pbWFnZV9hbGlnbl90b3B9PC9vcHRpb24+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJtaWRkbGUiPnsjYWR2YW5jZWRfZGxnLmltYWdlX2FsaWduX21pZGRsZX08L29wdGlvbj4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImJvdHRvbSI+eyNhZHZhbmNlZF9kbGcuaW1hZ2VfYWxpZ25fYm90dG9tfTwvb3B0aW9uPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idGV4dC10b3AiPnsjYWR2YW5jZWRfZGxnLmltYWdlX2FsaWduX3RleHR0b3B9PC9vcHRpb24+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ0ZXh0LWJvdHRvbSI+eyNhZHZhbmNlZF9kbGcuaW1hZ2VfYWxpZ25fdGV4dGJvdHRvbX08L29wdGlvbj4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImxlZnQiPnsjYWR2YW5jZWRfZGxnLmltYWdlX2FsaWduX2xlZnR9PC9vcHRpb24+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJyaWdodCI+eyNhZHZhbmNlZF9kbGcuaW1hZ2VfYWxpZ25fcmlnaHR9PC9vcHRpb24+CiAgICAgICAgICAgICAgPC9zZWxlY3Q+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgZm9yPSJ3aWR0aCI+eyNhZHZhbmNlZF9kbGcuaW1hZ2VfZGltZW5zaW9uc308L2xhYmVsPjwvdGQ+CiAgICAgICAgICAgIDx0ZD48aW5wdXQgaWQ9IndpZHRoIiBuYW1lPSJ3aWR0aCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iMyIgbWF4bGVuZ3RoPSI1IiAvPgogICAgICAgICAgICAgIHgKICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImhlaWdodCIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzaXplPSIzIiBtYXhsZW5ndGg9IjUiIC8+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgZm9yPSJib3JkZXIiPnsjYWR2YW5jZWRfZGxnLmltYWdlX2JvcmRlcn08L2xhYmVsPjwvdGQ+CiAgICAgICAgICAgIDx0ZD48aW5wdXQgaWQ9ImJvcmRlciIgbmFtZT0iYm9yZGVyIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzaXplPSIzIiBtYXhsZW5ndGg9IjMiIG9uY2hhbmdlPSJJbWFnZURpYWxvZy51cGRhdGVTdHlsZSgpOyIgLz48L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJub3dyYXAiPjxsYWJlbCBmb3I9InZzcGFjZSI+eyNhZHZhbmNlZF9kbGcuaW1hZ2VfdnNwYWNlfTwvbGFiZWw+PC90ZD4KICAgICAgICAgICAgPHRkPjxpbnB1dCBpZD0idnNwYWNlIiBuYW1lPSJ2c3BhY2UiIHR5cGU9InRleHQiIHZhbHVlPSIiIHNpemU9IjMiIG1heGxlbmd0aD0iMyIgb25jaGFuZ2U9IkltYWdlRGlhbG9nLnVwZGF0ZVN0eWxlKCk7IiAvPjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9Im5vd3JhcCI+PGxhYmVsIGZvcj0iaHNwYWNlIj57I2FkdmFuY2VkX2RsZy5pbWFnZV9oc3BhY2V9PC9sYWJlbD48L3RkPgogICAgICAgICAgICA8dGQ+PGlucHV0IGlkPSJoc3BhY2UiIG5hbWU9ImhzcGFjZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgc2l6ZT0iMyIgbWF4bGVuZ3RoPSIzIiBvbmNoYW5nZT0iSW1hZ2VEaWFsb2cudXBkYXRlU3R5bGUoKTsiIC8+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KCQk8L2Rpdj4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9Im1jZUFjdGlvblBhbmVsIj4KCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBpZD0iaW5zZXJ0IiBuYW1lPSJpbnNlcnQiIHZhbHVlPSJ7I2luc2VydH0iIC8+CgkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNhbmNlbCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0ieyNjYW5jZWx9IiBvbmNsaWNrPSJ0aW55TUNFUG9wdXAuY2xvc2UoKTsiIC8+Cgk8L2Rpdj4KPC9mb3JtPgo8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/img/colorpicker.jpg</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBkZWZhdWx0IHF1YWxpdHkK/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAlgEsAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A5a2HSti27Vk246VrW/avkK0T9exEzXtu1a9selZFv2rWtz0ryK8TwsRI2bY9K17ZulYtuela1u3SvIrQPCxDNNm+QVVlapWb5BVaRq5YQPBxRXlaqcpqxIaqSGuuED5zFIrSmqcpq1IaqSGuyED53FRKzH5qcppjH5qcpr0cNHU8ScNSZTUimoVNSKa+iwqMJQJ1NSKagU1Kpr6LCmMoEwPFUbk9auA8VRuD1r6HDvQdKHvGVc96x7nvWvcd6ybjvXr0JHtYeJj3I61kXI61s3A61k3I6169GZ7uHiYlyvWq8S1duF61XjWvTjP3T3cMieJauRCq8a1cjFYTmfRYUsRCrkQqtGKtxiuScz6LCyLUQqx2qCMVY7VxVZaH0OHnoRNUTCpmFRsK8HFM7IzIWFRMKnYVGwr53FG0ZkDCoyKmYUwjmvnsQtTVTLduOlalv2rNgHStODtXnVonk15mpb9q1bc9KyrftWnAeleXWieLXka9uelatu3SseA9K1IG6V5daB4tdmiW+UVWkapC3yiq8jVyxgeJiSCQ1VkNTyGqshrqhA8DEoryGqshqxIaqyGuuEDwcTErt96nKaYx+anA134eOp484akqmpFNRA08GvewyMXAmU1IDUINSA17+GMnAmB4qlcHrVoHiqk5617lBhThqZlx3rKuO9ak/esufvXq0ZHr0ImVcDrWVcDrWvOOtZc4616tGZ7VCJj3C9agjWrk69agjWvRjP3T2sOiaNatRioY1q1GKxnM97DE8Yq1GKgjFWoxXJOZ7+GkWIxU+OKijFT9q5KktD3aE9CJhUbCpTTGFeLiWdSmQsKjYVMRUZFeBiTVTIWFRkVMRTCK8KutTVTLUA6VpQdqz4R0rRh7Vw1YnlVpmlB2rSgPSsyHtWjCelebVieTWkakB6VpQN0rKgPStGFulebVgeRWZoFvlFV5Gp5b5RUDtXPGB4+IIpGqtIalc1Wc10wgeLiEQyGq0hqdzVZzXTCB4mIiQseaUGmnrSg120I6nlShqSg08GogakBr2sOjJwJQakBqEGng17eHMnAmB4qpOetWAeKqznrXs0WOnDUzp+9Zs/etKbvWdNXp0pHqUYmZOOtZs461qTjrWdMOtejSmetRRkzr1qGNatzr1qFFrvjPQ9egiSNatRiokWrCLWU5ntYcmjFWUFQoKsoK5pTPbw8ieMVN2qJBU2OK5aktD2aM9CM1GRUpFMIryMQzqUyIioyKmIphFeJiDRTISKYRUpFMIrxay1NFMswjpWhDVKIVehrkqRPLqzL8NaEJrOiq/Ca4KkTzKsjRhNaELdKzITV+Jq4KkDzKrLxb5RUDtTi3yioXasIwPLrEbmq7mpHNQOa3jA8isiJzVdzUzmq7muiMDyK0SI9acKYetKDXXRjqebKGpKDTwaiBp4NetQRm4EoNPBqIGnA169AzcCYHiqsxqcHiq0xr1qTCENSjNVCYdavzVQmr0Kcj0aUTPmHWs+YVpSiqEorvpzPUpRMyZaiRatTLUSLXYp6Hp0UPRasItRotWEFZymevRZIgqwgqJBU6CueUz1qEiZBUuOKYgqXHFc85aHrUp6EZFMIqQimkV5dZnQpkRFMIqUimEV5FY0UyIimYqUim4ryaq1LUyxEKuxVUjFXIq5qiPNqzLkVXYjVKKrkRrjqRPPqSL0Rq9E1Z0Zq7E1cVSB59Rlwt8tQu1KW4qJmrGMDzqo12qBzT2aoWNbRgeZVRG5qBzUrGoWNbxgeZViRnrSg00nmgGumlE4JQ1JAaeDUYNOBr06SIcCQGng1EDTwa9OkQ4EgNV5TU2eKgkNelTYQhqU5apS1dlqnLXbTkd1KJRlFUpRV+QVTlFdlOZ6FJGdKvWo0WrMi1Gq11qeh6FJDkWpkFNVamUVnKZ6dFj0FToKjUVMorGUz06UiVBUnamKKk7VhOWh6VOegwimEVKaYRXnVWbKZGRTCKlIppFeZVLUyIim4qQim4rzai1LUyeMVbjqtGKtR1hNHnVJlmOrcZqpHVmM1yzicdSRdjNWo2qkhqzG1cs4HFUZbLcVGzUhbio2as1A4agjGomNKxqJjWqgcFRDWNRMaexqJjWqgcFSIw9aUGmnrSit6cTjcB4NOBqMU4Gu+miHAkBpwNRg04Gu+mS4EmahkNSZqGQ13QYRhqVpKqSVbeqsldcJHZTgVJBVSQVdcVWkFdUJnZTiUZFqNVqxItMVa6FPQ7aaBVqZRSKtSqtQ5nfTFUVMopiipVFZOZ305D1FSY4pqin44rGUjuhPQYRTSKkIppFcdRmymRkU0ipCKaRXn1ClMjIpuKkIpMVwzRSmTIKsJUKCp0rOSOCcydKsIarJU6GueUTlnItIasI1VENTo1YSgc02WS3FMZqbu4phas1A5ZisaiY0pNRk1ooHJNCMajY04moya0UDjnEQ9aAaaaXNbQic7gPBpQaYDTs11QRHIPBpwNR5pc12QE4Emaic07NRua6oMIw1IXqu9TvUL10RkdEIlZxVdxVpxUDiuiMzqhEqOtMVandaaFrZT0OmCEVakUUBakAqHM64MFFSKKQCpAKhzOuEhyinYpAKfispSOuMxhFNIqQimkVzTZopjCKaRUhFIRXJMpTIyKbipMUmK5JornJVFTLUaipFqWjglMlWplNQrUi1k4mMpE6mplaqympFasnAxkyxu4ppambuKaWqVAwkOJphNITTSapQMJICaaTQTTSatQOeURCaXNNozWkYmTgPzS5pmaXNbxRPIPzS5pmaM1vEXISZqNjS5prGt4sFAjaoWqVqjatVI2jEhYVCwqwwqNhWqmbRRWZaaFqZlpAtac5tFDQtPApQtOApOZvEQCngUAU8CoczojIAKdQBS4qHI3jMbikxT8UmKxkyucZikxT8UmKwkVzjMUmKfijFYSQ+ceBTxQBSihxOJzHCng0wU4GpcSHIkBp4aoQacGqHAhsm3Uhao91Juo5CGPJpCabupM0+QzaFJpCaTNJmnyEOIZpc03NGapRI5B2aXNNzRmrSFyDs0uaZmlzWiDkH5ppNJmkJq0w5BDTDTjSGqUilAjIphFSkU0irUy1EhK0gWpitJtp85aRGFpwFP20uKOc0TGAU4CnYoxS5y1IQClxS4pcVPMWpjcUmKfikxUNlc43FJin4oxUMOcZikxT8UYrNoOcfiiiiqOa7ClooosFxc0ZoopWEG6jNFFFgDNGaKKdgDNJRRRYVgoooosFkFFFFMLIM0ZoooFYXNJRRTCwUmKKKLjsFJiiii4BijbRRRdjDFGKKKLsAxS4ooouMKKKKLhcKKKKQXYYoxRRQF2GKTFFFAXZ//Z]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/img/icons.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlh6AM8APcAADljwqezxgAAAPHvbiU0T5w4KpW6/aPD+29wcXmOrm6SzzRLY+Ps+3B6jZSnw////zFRjsXS4vfvro+asNClFViGzKO301iE39fZ3bm5uPzLyvLRcFFRUsrL1Jqbmj04Kebx/NAQEKiZiIOXw9Ha7O3YipzL8vn1U7dzYrvL7y9p5LSVFQGbAVR81Y14WfUHB5Ohs8jIyPsuLfbrkfv5xlldZvH5/rLM/Kenp3JbEHaFlbu+wfDx/Z3QFIODhrWqT5WIbUF349fe9LOpioKl8WzB8JGjuZWAyXRs02HNVU9QrZrhaPXYEsS4kTVmtqGvwy1Nqu+6Oebl5P31N8+wUY6O7ODo85/PqNTLtGeW5oCl2brD0U81hGBwhfGzEsuRNvtNR8r+/1l1p6KxynKa6JmZh97l8PPNUqeYa6K/9ODg8NLi/sa0cdbFKoKRn8PJ3ttLS8J6QlJjgPLy8oWKncDQ74qm4tzp/IKo8qiptnOdz3WX9JairrGbUph5GRFNsUZImnxsT2Y+puu0sff5/jC4Q9jHaEJnsmR9qpGr8ZGlzpOIiFJ7u2tXQEtzwbG70UBgmbTB0vhBOD9nqay1y9UuLs7Y+jw8P8ACAr+jMf5iVfD44Ovv9tDV3GKBt6epz2KR8FOI8uD//2GM4IKt/pCv1K/A4sDCxNSTBJOt4tfux8josOjo93NLv4MAANDQjRkVEbHA2YSkxJuYzfggHsaYlk9xrMLY9CFAePv8/V9vj7/I1x1ChP7+/v79/vDv8GaZAPz8/omq9MLa/ou0/f+Zmb6+/v9nZPrkID5Ra+PcsRJTySJYwl6MnLDI3VNwoiVjAPf1+NDh8K6m/ldusbSvov/4/05Yxgk5hkxwl8jZ8N/f4PD48Ki4uMLW/kqydvC2Y7Cztai1x9rm/qK63SJa4hL+ArvI4NqOcoevh6XY8LDQ4M7NzKae5lC4tvTj31VnizJScja/f95bW/i+Wj+uy5CosCgpJ/v7+9/V0KCltKDg8MDt+rCcYICwwP///yH5BAEAAP8ALAAAAADoAzwAAAj/AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKH3UqKGSZUMPMGPKnCnzA8qbOHPq3Mmzp8+fQIMKHUq0qNGjSDvWePBgadOXHaJKnUpVqs2kWLNq3epwUS6uSQMEKCgWrNmzaNMW3KVLrduLKpk29QH1g927ePN+2HZ1wQJefgH/DUz4reHDiBF6TdwzgK5dBHWN/diJXCoterSQ8yi3s2e5CwUwLrmrdGmxASA/FA2RjevEukgIbPuPBO2O4YyQ1R3yiaePA4IHhyV8gM8HKnOxfPCSr8MPHa7yerAgF+HBg62PPhsgwWSN20aM/+iQkcSFiqUPqDZK4oB72QYXa0zwOGT7A0QuXCCSmqN70/09xFYCA9G3HkfOaHFLLgzmcoseznD0gAkUVmhhhcxtx9MuDTYYwAIHZuQaG0BIIEEJjQCh4kMkGGFEAgnAB1Rs/7RlG0Km5bgLajx+R1Z9A0mG0A3OFBkAOeRJ5Ak1PmpU3ADECffPFiPA2GRJcTHlEkMeROfQAsosIBBhvABm5mBmaghWAhfwIpAAcMYJZ0QdjFAFNbdZdAEAA8npJ0LuESEoESEChd+g7sX3VUbekSDmR/hd4F0A+elHoEYHdOhYoQolYARkO17akTPkOEhEKKEQcQsImm00oYXAmP8AjAcWZkiQnP/4ieutuvZqUK++FgSsrr8Ou2tGAXTI4KcgJoTrsASxYaIEHkgABIouDEBBIw212CAJMZqkH28JtWVuQh0sq2yHDDDwqEEd6OLBQB4AaZAzmtrrECXUUAOJRz/AAssPUApMMJXejQAPTk41XNdzXv5TXS4PrKvsu2rmBKxCAfAi6kQkhCNynXdCUENoxxpEAgBXMrTLAXsCoB+hAvHJ0bNxJkSEQIcC4PMFiUZm60WxffiQHhUQpEUFmxm0i34hJuBzyxNx2OCn+i4kFoGTetSJFrmkEUQaDIKwRxogVMDpRK/KakIPPQAj9zYUDp0xSskqa4RfGF//JK21JUgQHBCNuLAtQ952CO5JAdh8kdVGWJxLu+4m5MGn/5zyYkJWL7tLM0k65IknkEAwQkfCEUdcwAM4kEsdC8DTN5YrtUQXl841BJ10TBVQwC9y+Q48U7PffVLOuc4J0jbhbNPBNh6MQI3J4TAEJxAK+ez4QzDLHPN+L28v7JvIJ89asX2efxARgX4vNdAFyYeRY0I2pEDSAyEd4UHj8g9AnhbhUHta5J4CHkBGCYGRpxKwNouQ4xa3CMIecnGDUNwgF0EgkgM08ipgwO2D0IhV3QqiHxlBq1gbO4ixUka+FFrvhAQhQQBchDkZ0pBqedPb3jjGGxj+42+Ea4QQ/4VoOG4pJHEMalcuPhaZ+n0IFhZp3JVIsAsa0sY2LipUFSc1QxcpEEa6KJ5AjBAOuvggNwlJ1i1uQEAi4ScNCEQIJChRun9xJGACg9JwXvGAX9QhAQuoXla6dBWG7KUvFfOd8HKhyN89wE3G05jyyteRJjRBGeH4xfN8oIsaCFIhulCeR7onECL8TFDiu1Wf3pQrVqrwfKJc36B8xhuZ7Ywg8gNZEx1yP6Ux4hw6Y5n/AAhJN5XJTdrz2T/OQ5AcTi5TDTJlAwWyQBh9RA+5IEIQUqUCFUwwFBUAQTM4SCEPgpAFtSqIeS5gBNn4UEMyJAGDdjEpeeaCni1zZod2eP+QAJSwhcSi17S0RYGCGrSQB0Hi5BiwRADS6wMLEMsHBDAvhoSxoh5YABR91rd4MohGtpmnd9bCoLwljp7tOoAYqekBT/kgdAZxJgMuGE0ATFN6/3BA6Ta4kSipbgA/aIQEOFEHBwRyK4SEGO9+wVSmMqipw1tpJEWCPEqSZaQQwcIrmiABGtBAGR7YxhkXcDuUOZSE7JQIzG7DlkqlsoWuFI36Xpk+hehnPwwciC3jtyiK+CiMzUSIBWxhAYIwQgEKcYYyDTK1ghRTIJDkk2SXSZawHQqaDGKfTRcimbNmpAK5CEU3uxkKBzGDGbmwI0YmJMIPyg0a6DTB0O6qvdX/rDCWADUWCle4W902s0ULkIxYdhRcMp5Vn0nkJ1pj9taDVEs4FKAhGD1bm8g1SIkwWmlGFzDRinIJojDpbhqBS6MahVEXxiVpLpJFAnDdE6U3UKlCLucDmHDMslrQAmZzsYcbbBYh2XiCQEq3MIT8qSEB+wAsqCCwD1zBjyM4Kk7s9pCkOpcmEVtAH31HsQ0XoMPamepNgoUQNkHShQPBgjK8ymIJvKK+ugAsZ3GLkMblloU82xNBIgUASP6qleZzpbNgOVcS2vICMpLZAfhqEazW6F2OQcgIDnE6gVjgEJ54REJWJsxm+ixEx3zsPybLJ2YOxLrtkqFlzeMzHxvk/0W80EWcybUR0AZhtKW9ATP+gFrV3ti3A5nQNuTWAxOwABiHBgY0tmG3TmhvLAGNZORAlMP2PqadxUNuu5RLkE4YwWfwiTRBnjsAZET3ugyIcUKtWzaGZpdqAvHARKnrXL+INyGT5lQHMF3ZXEj3izGOsVRrFA5a/8O6IGAACVLxAPaZhxk9rjEkpj1tCPBCwAamcUKeNAA2XCEfRZXwTZBDkbAidNRVCdOYKNZI4LX7kSIe8SS1LZCOMXEhWAicV01UghI0gSU1GHbyjP0PKUrkaY5LZpl6y1u6ki97ybTZyi4QIl1QGCIxVo2MbSNGT0zi4wRywMc/zrnFDmRPhf8Sc2THzHIzjzGbgvIOu2To5sjwoscd6zHBI3IB/qqgHOUgQi6WQfRwZoODD5Db3FiwjQJs49BMKUiMTXjgbKOYV7dlOI6tTuJ6t8hTYV6Ap3JzVlZfF7gK+fSNnVtqU58aNbbZxezMjl1AwrrgE4WTd18y0WEHoEXo9YtAsDhDAObNuihlwAFis+yVwlnOzaBzQSJHhMxkZuYdQwgiqOEAFzkAArFTSJEV8iQ0SAALYhc3SpBT1ohY2CBd8lPEppMLqFbM9tSJN0qqSu+KKOMVXT1Rv0kU8E8iJJSjZ6zJIQK11aySNXJFWV0j0jiXCySXErGXjAvecQhAAAr/GgP/BOoYiQT+9x+7+N9BVF4zlpdZP2fORXtLI3RB3TXz8PKYLvgUZzlPUyIOsEblUHRaQHR/gCT3RhFyAQwPUACHVgBy0xm6xyJk1F704SJ/By7odRBmt1BopxFAUGoGlQAeyBa2NnlK1CCvxjHd5QF6t0wAIHkFIWtxsndOYwR/J3eyYRtUdIG9FjmlkQAztXgkIChi1Ax89gdGkITjxIHyR0W7UH96cFfkUHMCQUeUQBCIgA0CNxGmJzhoAAvGdxKsVxGvN4MdoAxxkoaPomG/wGFM8YYFIBchNoEkwXvJZxFY0AT9NnxUsAIfMIavtHMWATPWN2RyVXVWlT7m0nsJ/6EfV4J9EUEfqcFx6EcfK+V94ycQmggBCEFxK3MbKGdjGbE3fCN239Ie+EcWvMAW/MdA18YRHaAHrEJ0zPYHf6AFIJAAp4B0nVEAH/AZFIYzXWc+DYd1x5g+WScst1Vk9HReY/GMxYUQHahsVbRSxChqIWhQFCCEqPEpLnJuDLQLJOBqdrcQsEBRsaY8pOhcLfiCnEMf5RVsMSaDefNF8kiP20cQp/AHzZANy/AP/giQvfhmp7gA2MQgJHALzhAAfxBT2WAyBWImvJCFHOECGGkXglgSZXhxdUETMSEVAmAVY+JhvmOScwhvdjgSV/cjd5cQTXAtJcAGf/gBNshwDP+hH82Vk/BTElXnEJ3gT4dYIx7pEGwRY5gobB6jEJ7wMSOACAmhPTenV8kEEj13V5BohQV3c0uZAFz5kgCoi+RQAafFNLt4kxXxAB/0QR9QAGvZA0W5kqU4c1TEaRcBBNxIAbpgjacxQ+cGLp6Cg+foV112EOmIUY44EfeYUntZhIxHBMWzhB3QDPxHDf0og/zzAFhZAas4EJTwBA7AU/9ACTSEg4zRka0HER6gDFUhFaz5mmk4e3HYVBQDVRTThXJ5ErrQJn+Wh//QBC5Ak4CIlhhxAZPxTmj1fz7xNMZ5EJIYESZIJrwAlhDRZgtXM1X5EQCwXjxiBFrpirexf1n/gxGd4ABqAwJlQ0/EqYBKJzcQCIHtOYw5k5jKWIz1CWj3+ZOih5wVETmlWZrYOJ++KRBBZBex8Z/h2E/B1pIQh5sRERvnkkYMIoTxFRupQAQWCpkHEQ646I//kABJuJEG0XNH8o1aGW+omZoPYRfcpRcQdRctyl1jcpDXwTeAkZtBYW8V8W8uYJMgoXbooZwXwZ+A0k6K0VcBFEZxFi6GIZVhdqI3QU/ZMG3ZwIsd8QAsAFtamqVcCltxiaP9SaOnGBK64KJ2gRY0YiPU9SFiKqYHsQvZoH4C0QzMADoN4aR/cEy5maJg2qckwaMg0Vhy+Zx+CqbCeKihUai7h6Pz/zh4hKioOcGnXwqplFqpkYqklpqpmrqpnLqnPkAXqNmpojqqpFqqpnqqqDqBn/oPfJqqrvqqsBqrsjqrtFqrtnqruJqrurqrvNqrsfoDKxCsK/ADvlqsahILyJqssfAEb2CsGoEFKIACWJCbXZAGqNI31XqtzrqtB7EDQzAEHlAGIrAIOIADV2AWbLACbXACwXECbbACbJAQiTCviYAHRLAHZDAKo3ABQdCvOiEMAAuw+ToK/RoEukcABFAQCKuwCTsQC0sQD+uwDasTPoAAKooAHHAyBzEPHNuxHAsHcFAJlbAQ3yoCEWFJQxASsbAuT7AAzdoQGLAFMjuzMqsQtP/wAjibs7SQEMbQs8YwDdPQDlUwtFWABEZ7EBxwEKPFEZHQAFvABxnbAAEwARxwCZegDwyRCvhTEdCKDuiAAtSaBqeCrWIbCg76CE+QthMwARixtm7gBl3QBWCRAqagBQpwt3h7t1pQCqXgFt4KruJKruaqFhkwBP02ABtwBlSwCFdwrlyRCRRwApI7BVMguSdAAZmAEIlQQAZgAMRACqRABmSwB6AgPmNwuqibuqiLEEn7DxygBAPxugghDJ3buQIrugYLEgNaECUrAr4rAmVQBtiTEL37u8E7vAeBsBZgAWOQtgibtqEJAxH7D8rLvM5LANDrANI7sQJRvL57vAr/4b3AK7wLgQA4gLEckL7q6wEaWxAc+w6HyhSYYBDfOgQlciKBAASLgLz0+61fiCJAQL4IwQB7YAlCUMAEbAkJzAAXYAkFsbLKwqwuyxAYgAHKYgWUIAcYgBC0IAPHcAyaEMKaQAs7exA9WwW9kMIqnMLXoASwWxA4wAE4oLQqoBCKkACqJQ44jBCPwAcIwAdQ+w+fygE68A81gAALYQFZcAh6yAaP8LUFUBD0Wq94UMVWbMUOoQEv8A5arAGw5wtg7AEaoAHFQABg7AvcKxCzsMZsPAvr2RBuMAxi2zdxPMcPccY2YANuUBGsMQEMMAxynAYEobqE/J9STK+DksiD/1IQhKy6hkwQ5BC/ctG3CFEGl2CfPFG4h5u4i9u4H+EbEgHKCjHFeEAJhtsIJbABiRsFUQAESZARMJURL2sQP9AGA+CubUC5bbCuA9AGxGoQ9Gqv+aofBRsE2zMGhJDMyrzMhAACIDA7SVvD0ey6ChGwwkAG1nzN+lqwCNEBO8AHb8sHO9AQu0sQQ0AD0yIBM5DKSEy86Dwt67wB7YwQYyDJTOFQ9WzPDnXO6RzP83wQ/AzP7Fy+CIAARXDQRfAKJcABCHBuAgEHGgDRh4oP82vO0yICgBMIfrABXhAIAD0tpucCwBkIGxAFRmQQCJzSCqzSDPDA67IDfMMQlMAgMv9LCZSAAXHLwR4MBjLQ0zIgCSNcwgVxwiuswtFwDQTwwgQxzQVRwzWcQITgYwkQ1Tx8MvcwAQJwDwhABxzAtgJBDqOQEGRwAX6mucFsxQbQAWwwA4bgAwXQBFJcu3I913hwyPN6xXiQsy8QAlA0g2csxmRsxmCcxv9wxob9xgwRx3JMx4CcBg4KxnnMAA1AEXKi2GU7yCk8AkUtBkXdN4kw16BtALc0EGOQ2UWNCJ1dEFrQNhdSN4h1EGUgJ3QhACrKE6aMIqm8yq38yh6hANRQWBDh28Ctue5hAU9guIGAImdwBlHQBhTgArx9EaMQOjtQA1V7CfdwCQfBDhhrtVb/OxBvENYHsQK3PAU58AGUe96VOwArcBAWwA3wbQXC2LKDTAh52wIK4Aj67QhBUDkFoQTd5LpP3boCodQC8QTBEAwREAy0W7u3Swa5WxDezAA24As20AENkAfWAxEYbSLxvAFU8M8G0eHqnNshrhAWEL82wANq0L4DkeKHuuItPuICrconnhAk/uE3nhA+cL7ygNBXMAA1gAMuPhBw8AAaUAmDIBdSgABSgA9SUNED0eEyWQJn0AeN4Aeo4NH0ayJAwIepjAZZjgonXRArrcCWkMLREA0MrMDW9wS5sA3VcAXpsAO58AZPMNkKsQVWcMEZbJEF0cEgrAE8LQNgQOhg/0DCBjENxoDCRR0NrAAFSGDg/xDD3TTDEKHDz+B9/3DDm+6JBtEAsHAPWq3dCGC1k10DclABv7E+oOAIqjULrXAQm+seneseEdAHbN0HsDCtdo3XeJ0McR3aBiAAOCsAi/DFYUzGxyDYaGwQhg3GYYDYC+HHi10Q1u7YDxHZ7SK3lC0QDZAGZRsKmN0Lmr3CnL3Cnj2viqzIwl7u567Cz5DaBKEAEwJB+I7vsrW1BXHJVfUTy2vcyK3czO3c0O0RlGALtlDWC5HwCz/K8/oOyG0IgXAGjRAFFOAHOYAA0W0RLTDdAtHd94ADsIDp8VO1YiiGAnEOo+AIB1HLJ0C5dv8h8+hdub5sEE8AA26gD/rwAORADhZQCorwAPRN2va9BmvgDQbUuf09O7Bbw0qQD1A/EJT+DwgeDAQgANY8sMUMLztQ4Ttg4TYQC10wzq+knwjR4TOg4yJeEGrP9gqRz59hDTI+O3LvGXTP4rPz9ibe9gTB9zbu9wRhsRxfCAhdBCtB4ARRCUwxCCGw5A/ADgIQA1KAAa7Au14OBDAgHps/AnTQAA0ADwXWvSaCkS5gB6hvB3fbAi3gBE5QEAvMAL2QAZ8aDb3g5g5MEHCeDldQBN/wDXzgAW7QANuQEBgw01ZQ01uA03IAAzBgEC9wDIfOIGAABgyiAYb+AotuDEj/8OisIASSTukE/tQCQf4JMQKEcA4j4Cbofw6KoJX3MNk6kI7ZrQ8NcA8CcwiHMAYHARCpQGk5BOHfv09IuBxkeDDRQzwRDXToM8NQH1hPGjJ81Mtjp17vekXYVjJCso0PE0VkiWfQC5gvNh70oEsXAQ8aih0jYPPmTF9BfYUhqmvmUaT/Jkxw06DLxqVNnybduMDqVapZGXa5arXhmBEjEoxNIMYsJEgQ1C7YaMFjL5BSRkqhe3IjWLFjESF69gytWghsGyp4YMLwYcQPGCGFJcCxgIOQtU6mnNTtuyElAhkKdKZRFAp+ciBIUrmyJ09pR5xODWE10o69hrxqlGFz/6AosD7cq8Gh9MGobroM59rV6tSGo1K1CPAPwaV79zrAQvocFnXq/96MIuLk6IoTJ6ZMyZFjfPnx4VdszBNOGj8HXdg9oE+f2xPBB8cQUrCGEAgQDjjAAAOICIKB/BhS4Z8FVVjwIAeVOOoJEhAgYIsnggkmAg236DDBg3awISg+GLCBgTVGaCArAchw0UUFKqgAKREkmKGEEjbYAJwvEKCqxhtz3LFHqp6orz4bePjFCjUiAPEfI498IMklm3wSSBx15NHHpLAUcsusEPCAtCTKdKeeGhDg4KhK6ssHk0EeYEeADDBgx5WNapRAgg1gkDKaaKw4BZ6GhtgzRwrseP9r0V7+2GgPSxjYoxccEHiOg14YuMASITZ64o1vCskii3R2YIABPtxAagtKtsjl1VyssIISOdygdaYXNJEBDFhhlYQWMGTaqB1jkFg0GlaE0AYKJCRs6EEGTftnBE+eUQsSTxKwlhdp/9GiBVscOMoCUFZL6yAkWllopthG6mWbii6CBQsYJnwLJJFIMkmOjSJ5K4J/Q8DkOkwkQ6oZnXiiygOGG3bYg24ZMnimiSd75JEnnmCKMowzXoqyMTxK4AaSS75BwAFBdOujXuSKgC4pIuD3K5FLHqHkZwQkA8QKpPRZMaQueUyyiiM2+i7ZaLONs9x26+03hjxZ7B+pI4b/5JG0IKns6qyTiu0dF7axIYZGMvkAhwVq+CedRhiaYJxxhrkhDVCCsDuIUPYwIA0dZmphlFFa6ACHGi6BZTqkwlETu4O4GwWK7wYYbzxkkGHicsxPWI+hU6IUJQx/GpDGmTFKUWQT/L7izxtvUC6QiCwOfJIqZ2fKcBsBasgwGD588KGGLVhJfSM+hGqgg1OHKWX2hlqU0oIWaJQgyw266SYPPiagQ4cV85xeyDOi+CIQ7bnfiAAC6rMmSVmZJOEN9BtCX332ZVXj/fgbqpF667Evv3v9fU9H4Rvf/46CgEotQYEL5IAH1jSTNs1hDot40yDmVKc7eS9HZxjBAwIw/zQBwCAAKGFIGaa3gTN4wQ6msEMLhOBCMdjBUQ2JFKSigQOPcOASvdiUEC7gqR1koRDfcMMOYIWqasxkCzCgRBNh4AYddEEOcugCDHQws4bkSga76tWvXhCsmVShWG9BlrK08QckAIIy0ELKCAhBiFt4ghcQSMAb48ityrTQFmNACigOgRa0/OMIrRDEujbSLoDhoAny2kYE1Ga7TkQgAi3BQyci+QgSMuQJ//pXLWCxCBzAAmJJaUYxdkIAqgRFA6tcpSmLMcp/FI1FSZFlKoNiAxuoajJCwaUutRKyXozMZCcTkAF25qlISlKZEbBkBCKRSf3UjGTCPAAkDkCMY/82pGeM4OYDzPBNcALtKIsYWmSygke1HGQShzgIN2eCx4MEsiGMmFFDNgk2sZHNbGg7CNvmOYl2AvQgnpiEJ6hW0KSMQAz/cIBaxKUVhTLUoUh5wjKX2QgS1CFtBxEHQ9wgtzTgoW53AwUe0nCDYfiSIYcoSAf+0YEdhBJxSGFHOBinHSc4AnIzWYHkpmA5zAWVCZprSB7WgcvPqaMG9eHGJlQxPP2sDgSnWkNV1xC7NTDvKLWzHe8IgAAKRYAPNagBbzL2JDfcsgZ5WIPchIFKqjiPG9xgBSseYQuklGEGOkJhN6SAgU7EIAMZgGtD9MrX8ImPA4Il7PnSR5/18UD/VtIgAQlMkb+DzA+y9aOsZTF7kMMO0K+AZWxhS7jXAUZBsaU9oKU48FrYfoADH2DTAyYoAHZUkE52wpP+SnCGFNIBUAKIhgCsIIAIwACaZdhgFFQohBYKwQlCEAMiZsgQSUXKI5XSYS84dYEUeGobWWhGIdzAgCPGAoAMgUGv3Bsr4WCRIVrkoq9gIglhNUSMxbpGf6HwXzReQ40zYeNkzlHHcyjiGbwQRwLMcAtFeAIXHT3KIxryCC2M4hAPnYkWGMHHfzjiELNoxRG4YEh7LvMOOMRIByLwiEd66i2U3AaAoHqQilrUojDOSimPobCksFInrvyxLkBYmcccJcmV/7nlidZrS1wy4MlJAaYYTOY6AmVTk0Tgcpe9TIQb/wOYiAhLAvbil7QEhmcPcIQWnOBNTsSZE2YQ5zgNRzSqcItbBtEaQPG6mHoeRM8MgZxA/zE1T+FS0WPDqEYZQuGARlqdEFjMJCidFDFo5B9pIZRWMh1PCHTadpz0CEl4cIcw/0MHaTDAHkJxtyCA4qTDgNsEZqKW5jTkcNlJyk3/cQ4n7HQj4JkCE1YgVGMzARlEZYgO1iGKz/FDHcmIAOlMpwoHJGg/CnAdl0fVgiBklTJcnQkfSEAA4O3OQ6wQAAmEh1YTIWgBXbiZArTKEDI8gK53uIMDvHMU5qY2DxiIAf9j82Ba0IJPteL7wGAPPhM/PSCyk81oBMbwpIhP3AqUrYPFnxRwFEZh4AV3OML/AfLEMrzkB6xUEVxehFeUgAM+eOBG2uSBxjimBpioQZ1i0FuGiOC3zhVuAIwugADAQOm0LeHQvUABBfRCAU4wBTbsAAkhYONRkQIUBxAQje5aAryWIF4unpANN5z3VQzQxhO41BA3sIoST4TicKYYRWgeRIu8cq8MXoDfMBrDGNOoQuGRcHgkXEMJA57MgkABikRsRBHaUgsvcEFHa0HA8gY5pCnSYAcLP4IIZHCCEZACvYeOgRGHKPE/TmyvUvcCATWAxTZOnep/GGHGLQEQCML/vMnYl9r2qL73P3wMZKQMeSc/Zr5RzGmaWsZSWlE+FXKyQn0GWJ8quu+FlUmGZQOQwt4bMcKXzR9m7iOiZIgQEDEgQAxijGDNTnAznE815wfgdZbSTwov/P+PdPqHdWonRBO0OWIIeWqnCVm0EzEDaaiDFGAeSwOoCRyoS/OES5uvmNhADtxAX5iJAACkNMMFTdsIB3iLDviXUyO+mSgO4yCOLki7j9kICMg1XZupXvsHXtMOYWuIH2iDYhONNricNsgBP2CCKWiDH2gIHZgAouCHO7AHMWkqVajCbFMdbkMRq2IdcBM3AtuIAiu3YNgCx1C3YPCBS2AFEkg1PogF/6uSmxsQBkaYspkgDFbgNyHwN6QAgg2gAj/8Aj7oAMbCARwwOT70Qyr4AkVcgYYjRJPzE1yqEo6LgDdQBIybEhuQxIqrxCc5xD8MxEEsxJnwxERcxEYUxZmogd+Rh5e7ggHwOqazOdsip1OoxVPAhFpghx0AuoNYhA1wLi9oACuIAFlBrghIulg8uV/0gqeLOkRwAjHABifAhl7QOhqSFEqZuWi4hB2KhhTwobLLhR3YAQ8wFbbThgbwgCSCOyt4LyswB3NgASnKu3/QIg14FUmQhFfRAFoAvI1AgmkgPLIayC5QPCVAMQihClBwiIZwIzNIMHjyhG86hxHgvAtLBP8uI4Mx0AIiOITXmAlF+CPOYwRIIKQTe72ZOEGPSMFSW0HcM4JLoqSMeQIjABGV7AWWHAmXLL5msInPmgn0CUqh/MmGYAqnWIC0O8rKMEquSEquqArjoAzjKD6GMAKzsDLwIwVSIIPxawiYjASwDMuZpEkQMQK+eAZiegb4cz9sQoT504M3MwNOuD8607+4ej6kGDQ+E8B/+LN/CLR/GLSDMAhDK0BNsgF90AcbgIGlWApykEAIoMDIZAh3OjTDZAi+0Ael0wcIwAVRQwq+cAAYMAIHiAfPPAoYiIAO6ICwjISOeYIrPJqZcKmZ2LWs8LWDOIejaAIKOIHKyYHruI7/HKicE6CAJmiIU0AAWdgHdZDCfgCCMqjCVVgFGNA2/hgQb8uCFtjOcHsSB4EWB8kKPugQVjC3LdgCPhAAPpjJJ+mABigFkxEGBYiHHdAKO7wDIbAEB+jBhgACBAiEQGgEDpgAxsoAHPAAQ/zPAH2t3YAFA0VQiKMSJuG4N3gDZ7DECFWSCc2oCr3QTlRQASXQwXrQBAVQAZ2te3DQAzW5f0iTGkiCQni5ImDQowiBB/iFbUAADNhRDKgFV1iEcODFf+BDZvQCeLACpYOBEErSZCTSp0OFFug+SKg6bDCFatyI7OqFbbwEHboEH4gGHwqvhuCDXtkGN2jDJ2gADkAD/zRYx4NwAwxwLyu4AXPoARaQg2SgR1oAFjDQAPx6ARnQABn4FRmYCYAsvBoQgEsQAiHoAiVYPIRECmhZyH+IPIZAsAiLyImsyJkYAyc4hAqAHTIAgMukikH6hIMoJNRUTdYMy9eMTfJ7i46wsd6ryY1IzdVszVelSv6zJaEIClhKigk4EQQZ1lPhVeAg1gUwVgRZSqYQDuu7GI9Rqe3zCGsqJgLRShgpy7eIBB741if4Vh6wVa+01jP7i7VYAAJ4y7iUM/yzS1rCy6PQS84bwEP7y4bYMwD8ByjQmn9gp0ObkUB7AkVjAAdMgRQgh8dECoIyqIalzKmpzI2gBAighP+GQAQCwAWqoFiLZQgxwAWNhbhu/VZUuwNt0AZYlU2VjZgf9E1kCA0/oADiVMKZYAcEyNMa6IMooAIg8ICMUTrrVIAuGxXttJsW8EIwDM/wFM8IOM8nGM8xJKuwwr086AIFEAb5ZIR44IPJqAALsAAHCFtZ4M+koIPBIkQP8AEW3QizNdADVVuIqyxKNAVTIIcx+ARF0AL5i1sSmNu6vdu83dusaFu0hdvBPdu3ZdEawAHfKJMkOJMP8IBkZAhMmAMpCCxbPIUMAAJXcAEhBQIvQAXRbYBoIMbHqEUYaNIoEF3RjVJprEYn8AhrZAhIYYAU0FIhOBbwElOGINP1jIX/WCBH1wqEL6AHNKjPg5i7dpQVDCAZFnjePNW+g9hTMPC7mOhHWihUQyW8KiicBqirBoACQICCSI2WZ6FUyEuEfGgITJWjqNlUi2wISmAEKHCEFgAAKOjYyfiEVpiFg/iEQjoCkfUIb709k0XZ2eG+XniE3nuCWgURGBhZAz7ZlI3XrPjVoAiDYKWoKFsAgj0RZIWSDv7gZt2/CWCAYRiGNEiDhuClXKIM7rMmAgk/beXKrqxKCeaBcP1WcsXhXrAm+IOEtVwAF3mG+XOCuASnb8o/rcCzlV1Zgn0CfTADxmxMOwjhgZqaqgFBW4gHLEoAkAVZ/W2IALCWLw5jXBjj/3+IYI94BJc82QOozieeY2nJhDYQj59ChvRog0ygqR04BR9oBAqIgn4IBDrAU69giP0AkFOhKquqKub5zh/SCj7oCqjdgkuIgLCqZKTYATeogXWtAeTVigqwBVtA4v8iW6TQAbdNWzdYWyZsZR94ZceSg65AH+P4LPSx5avA5VuG5YNg5cKl5awQ5rcl5o34gBr4gAVaIFigvaPAhG2IgR0IB0K8Zg/wXCEd0gD9gAZIriQN58l1gUZohA/4gNhlFNndiBqyBG9kgGjYg2/cXUcgnqlcgAZwAwRohDgo3kBgiC2A03AeaOXaAqSg3nxM6OxFCiQoPCi4hHGsUA5I5f/yTcgGSYSFtFRLPYj21dQEc982goBDgIIEqIwjKKR1UZcTQ9WGYOMFfmNtiOMEfjFpnUkjuOkePgiXdmN+ewI4luMm1opfJYowcL4i8QUQfgKkLuHJUOqkXuriG5qPUmEiCIUWRmong2GPgIAZnuEXUYAbPggjcCawHEuczunc2+q1fD/4I4AiBhHC+JkjWaj9iz46ngwHsIE7cEAIVNhUSAUspgxKCFvTS95wVuPkdQB9KOx/oATN5AMmulVnqumMCVugvWvM1oofoIA7Do8TaAMKWEKtKINGYMR/Top7nkqqUIEL2OjK4IOmxZCZ5ANOzmyjaYChJMqZwO3cdiz/35Yf0/pJ4Qbmf+DtodQK4xbKozgb2YKt14KFUEIKV5hu6q7u6c4KeDhn7d7uyd0IJ/gD8MYG8R5vLK3dHgKvME0BR+DdyagGfm4EN/2HLZiiKcpT+85Tat0IWuhAWkiKVGiWR108QACEk+SCkM0KFaBUjWZfv6i8qOkLtTjwo0gACDAo205N13xN2BRNoCa/1I7Klp5sDbfsDqclx8iK3O4JrVBqpF6AR7ilEGZxG3BxGA/q4l7hqrZqhsA+6UWKmvxwEK9KIMcKrxzyrtgIctACqeEmU25yWxCDkrZtKc+9IZ/yynheLM9yLcdy9jLywLbyiGmCH8gECqCATPiB/+OkDBH4gNOectd+bSAHczmfczo3mtmqOYb4AN2ocz43mmr4gPjuczqm1Ep9CEGfiVZIdEVf9ES/VS+f4+o08smwa9l88Ra39BmvDEyn8RavDBdM5INQ7UMfdVIvdVM/9VIvuIJDdVZvdVd/dViPdVmfdVqvdVu/dVzPdV3fdV7vdV//dWAPdmEfdmIvdmM/dmRPdmVfdmZvdmd/dmiPdmmfdmqvdmu/dmzPdm3fdm7vdm+X9aWS6yPphRj7dnM/d3RPd3Vfd3ZvdzlHAHE/El94u5lIh0JAgAiYhVnQTXfvd3//d4APeIEf+FqvgV6I9/oo94ZIgka4AivgAU4ggf9P8F+Cr3iLv3iMz3iNr3gE8AWEpw96ZwgXKIQrwIdXeSNCeIOP3HiWb3mXf3mYj/leD3eEJ/eZSIIr4IBowIc3ShJKSIA3iHKZH3qiL3qjP3qk7xYXnT2mX/qlv/krAAYbIIQk4YFYgIe6ovik33qu73qv/3qiT4JAKIR04ABouAQb4IRPwPo7sIJYQASwj3u5n3u6r/tjlwVZ+Ae8x3u93/u+53u+P4gkWAIYvYRV4AESgAfFhwchgAfGs3vIj3zJn3zKx/VCAIYPWIWpegR9nwVGrQP5qnzRH33SL33TZ4imT32nn72juIRdEAUGsIK9ZlRLsIRPMOrTz33d333v3jd6g1dn4Ff4g5BL2WdURj1ZbRD63l9+5m9+5/d3BMCHj3+AkE/eWMBP2kf+WcD95+9+7/9+8Id2mo93m5/wR8jP5NeGW9j+8G9/939/+Od1eP94fKh+zEyAT0gBavgERAAIXf8GEixo8CDChAoXMmzo8CHEiBInUqxo8SLGjBo3cuzo8SPIkCJHkixp8iTKlCpXsrRYo9eDmDJnyqyxcJYuLlx0TWjp8yfQoEKHEi1q9CjSpEqXMm3qFCMCXzSnxkTw9CrWrFq3cu3q9SvYsGLHki1r9izatGrXsm3r9i3cuHLn0q1r9y7evHovBgQAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/js/about.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQpmdW5jdGlvbiBpbml0KCkgew0KCXZhciBlZCwgdGNvbnQ7DQoNCgl0aW55TUNFUG9wdXAucmVzaXplVG9Jbm5lclNpemUoKTsNCgllZCA9IHRpbnlNQ0VQb3B1cC5lZGl0b3I7DQoNCgkvLyBHaXZlIEZGIHNvbWUgdGltZQ0KCXdpbmRvdy5zZXRUaW1lb3V0KGluc2VydEhlbHBJRnJhbWUsIDEwKTsNCg0KCXRjb250ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BsdWdpbnRhYmxlY29udGFpbmVyJyk7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BsdWdpbnNfdGFiJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCg0KCXZhciBodG1sID0gIiI7DQoJaHRtbCArPSAnPHRhYmxlIGlkPSJwbHVnaW50YWJsZSI+JzsNCglodG1sICs9ICc8dGhlYWQ+JzsNCglodG1sICs9ICc8dHI+JzsNCglodG1sICs9ICc8dGQ+JyArIGVkLmdldExhbmcoJ2FkdmFuY2VkX2RsZy5hYm91dF9wbHVnaW4nKSArICc8L3RkPic7DQoJaHRtbCArPSAnPHRkPicgKyBlZC5nZXRMYW5nKCdhZHZhbmNlZF9kbGcuYWJvdXRfYXV0aG9yJykgKyAnPC90ZD4nOw0KCWh0bWwgKz0gJzx0ZD4nICsgZWQuZ2V0TGFuZygnYWR2YW5jZWRfZGxnLmFib3V0X3ZlcnNpb24nKSArICc8L3RkPic7DQoJaHRtbCArPSAnPC90cj4nOw0KCWh0bWwgKz0gJzwvdGhlYWQ+JzsNCglodG1sICs9ICc8dGJvZHk+JzsNCg0KCXRpbnltY2UuZWFjaChlZC5wbHVnaW5zLCBmdW5jdGlvbihwLCBuKSB7DQoJCXZhciBpbmZvOw0KDQoJCWlmICghcC5nZXRJbmZvKQ0KCQkJcmV0dXJuOw0KDQoJCWh0bWwgKz0gJzx0cj4nOw0KDQoJCWluZm8gPSBwLmdldEluZm8oKTsNCg0KCQlpZiAoaW5mby5pbmZvdXJsICE9IG51bGwgJiYgaW5mby5pbmZvdXJsICE9ICcnKQ0KCQkJaHRtbCArPSAnPHRkIHdpZHRoPSI1MCUiIHRpdGxlPSInICsgbiArICciPjxhIGhyZWY9IicgKyBpbmZvLmluZm91cmwgKyAnIiB0YXJnZXQ9Il9ibGFuayI+JyArIGluZm8ubG9uZ25hbWUgKyAnPC9hPjwvdGQ+JzsNCgkJZWxzZQ0KCQkJaHRtbCArPSAnPHRkIHdpZHRoPSI1MCUiIHRpdGxlPSInICsgbiArICciPicgKyBpbmZvLmxvbmduYW1lICsgJzwvdGQ+JzsNCg0KCQlpZiAoaW5mby5hdXRob3J1cmwgIT0gbnVsbCAmJiBpbmZvLmF1dGhvcnVybCAhPSAnJykNCgkJCWh0bWwgKz0gJzx0ZCB3aWR0aD0iMzUlIj48YSBocmVmPSInICsgaW5mby5hdXRob3J1cmwgKyAnIiB0YXJnZXQ9Il9ibGFuayI+JyArIGluZm8uYXV0aG9yICsgJzwvYT48L3RkPic7DQoJCWVsc2UNCgkJCWh0bWwgKz0gJzx0ZCB3aWR0aD0iMzUlIj4nICsgaW5mby5hdXRob3IgKyAnPC90ZD4nOw0KDQoJCWh0bWwgKz0gJzx0ZCB3aWR0aD0iMTUlIj4nICsgaW5mby52ZXJzaW9uICsgJzwvdGQ+JzsNCgkJaHRtbCArPSAnPC90cj4nOw0KDQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbHVnaW5zX3RhYicpLnN0eWxlLmRpc3BsYXkgPSAnJzsNCg0KCX0pOw0KDQoJaHRtbCArPSAnPC90Ym9keT4nOw0KCWh0bWwgKz0gJzwvdGFibGU+JzsNCg0KCXRjb250LmlubmVySFRNTCA9IGh0bWw7DQoNCgl0aW55TUNFUG9wdXAuZG9tLmdldCgndmVyc2lvbicpLmlubmVySFRNTCA9IHRpbnltY2UubWFqb3JWZXJzaW9uICsgIi4iICsgdGlueW1jZS5taW5vclZlcnNpb247DQoJdGlueU1DRVBvcHVwLmRvbS5nZXQoJ2RhdGUnKS5pbm5lckhUTUwgPSB0aW55bWNlLnJlbGVhc2VEYXRlOw0KfQ0KDQpmdW5jdGlvbiBpbnNlcnRIZWxwSUZyYW1lKCkgew0KCXZhciBodG1sOw0KDQoJaWYgKHRpbnlNQ0VQb3B1cC5nZXRQYXJhbSgnZG9jc191cmwnKSkgew0KCQlodG1sID0gJzxpZnJhbWUgd2lkdGg9IjEwMCUiIGhlaWdodD0iMzAwIiBzcmM9IicgKyB0aW55TUNFUG9wdXAuZWRpdG9yLmJhc2VVUkkudG9BYnNvbHV0ZSh0aW55TUNFUG9wdXAuZ2V0UGFyYW0oJ2RvY3NfdXJsJykpICsgJyI+PC9pZnJhbWU+JzsNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lmcmFtZWNvbnRhaW5lcicpLmlubmVySFRNTCA9IGh0bWw7DQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWxwX3RhYicpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KCX0NCn0NCg0KdGlueU1DRVBvcHVwLm9uSW5pdC5hZGQoaW5pdCk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/js/anchor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgQW5jaG9yRGlhbG9nID0gew0KCWluaXQgOiBmdW5jdGlvbihlZCkgew0KCQl2YXIgYWN0aW9uLCBlbG0sIGYgPSBkb2N1bWVudC5mb3Jtc1swXTsNCg0KCQl0aGlzLmVkaXRvciA9IGVkOw0KCQllbG0gPSBlZC5kb20uZ2V0UGFyZW50KGVkLnNlbGVjdGlvbi5nZXROb2RlKCksICdBJyk7DQoJCXYgPSBlZC5kb20uZ2V0QXR0cmliKGVsbSwgJ25hbWUnKTsNCg0KCQlpZiAodikgew0KCQkJdGhpcy5hY3Rpb24gPSAndXBkYXRlJzsNCgkJCWYuYW5jaG9yTmFtZS52YWx1ZSA9IHY7DQoJCX0NCg0KCQlmLmluc2VydC52YWx1ZSA9IGVkLmdldExhbmcoZWxtID8gJ3VwZGF0ZScgOiAnaW5zZXJ0Jyk7DQoJfSwNCg0KCXVwZGF0ZSA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgZWQgPSB0aGlzLmVkaXRvciwgZWxtLCBuYW1lID0gZG9jdW1lbnQuZm9ybXNbMF0uYW5jaG9yTmFtZS52YWx1ZTsNCg0KCQl0aW55TUNFUG9wdXAucmVzdG9yZVNlbGVjdGlvbigpOw0KDQoJCWlmICh0aGlzLmFjdGlvbiAhPSAndXBkYXRlJykNCgkJCWVkLnNlbGVjdGlvbi5jb2xsYXBzZSgxKTsNCg0KCQllbG0gPSBlZC5kb20uZ2V0UGFyZW50KGVkLnNlbGVjdGlvbi5nZXROb2RlKCksICdBJyk7DQoJCWlmIChlbG0pDQoJCQllbG0ubmFtZSA9IG5hbWU7DQoJCWVsc2UNCgkJCWVkLmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDb250ZW50JywgMCwgZWQuZG9tLmNyZWF0ZUhUTUwoJ2EnLCB7bmFtZSA6IG5hbWUsICdjbGFzcycgOiAnbWNlSXRlbUFuY2hvcid9LCAnJykpOw0KDQoJCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KCX0NCn07DQoNCnRpbnlNQ0VQb3B1cC5vbkluaXQuYWRkKEFuY2hvckRpYWxvZy5pbml0LCBBbmNob3JEaWFsb2cpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/js/charmap.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBjaGFybWFwLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KdGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgY2hhcm1hcCA9IFsNCglbJyZuYnNwOycsICAgICcmIzE2MDsnLCAgdHJ1ZSwgJ25vLWJyZWFrIHNwYWNlJ10sDQoJWycmYW1wOycsICAgICAnJiMzODsnLCAgIHRydWUsICdhbXBlcnNhbmQnXSwNCglbJyZxdW90OycsICAgICcmIzM0OycsICAgdHJ1ZSwgJ3F1b3RhdGlvbiBtYXJrJ10sDQovLyBmaW5hbmNlDQoJWycmY2VudDsnLCAgICAnJiMxNjI7JywgIHRydWUsICdjZW50IHNpZ24nXSwNCglbJyZldXJvOycsICAgICcmIzgzNjQ7JywgdHJ1ZSwgJ2V1cm8gc2lnbiddLA0KCVsnJnBvdW5kOycsICAgJyYjMTYzOycsICB0cnVlLCAncG91bmQgc2lnbiddLA0KCVsnJnllbjsnLCAgICAgJyYjMTY1OycsICB0cnVlLCAneWVuIHNpZ24nXSwNCi8vIHNpZ25zDQoJWycmY29weTsnLCAgICAnJiMxNjk7JywgIHRydWUsICdjb3B5cmlnaHQgc2lnbiddLA0KCVsnJnJlZzsnLCAgICAgJyYjMTc0OycsICB0cnVlLCAncmVnaXN0ZXJlZCBzaWduJ10sDQoJWycmdHJhZGU7JywgICAnJiM4NDgyOycsIHRydWUsICd0cmFkZSBtYXJrIHNpZ24nXSwNCglbJyZwZXJtaWw7JywgICcmIzgyNDA7JywgdHJ1ZSwgJ3BlciBtaWxsZSBzaWduJ10sDQoJWycmbWljcm87JywgICAnJiMxODE7JywgIHRydWUsICdtaWNybyBzaWduJ10sDQoJWycmbWlkZG90OycsICAnJiMxODM7JywgIHRydWUsICdtaWRkbGUgZG90J10sDQoJWycmYnVsbDsnLCAgICAnJiM4MjI2OycsIHRydWUsICdidWxsZXQnXSwNCglbJyZoZWxsaXA7JywgICcmIzgyMzA7JywgdHJ1ZSwgJ3RocmVlIGRvdCBsZWFkZXInXSwNCglbJyZwcmltZTsnLCAgICcmIzgyNDI7JywgdHJ1ZSwgJ21pbnV0ZXMgLyBmZWV0J10sDQoJWycmUHJpbWU7JywgICAnJiM4MjQzOycsIHRydWUsICdzZWNvbmRzIC8gaW5jaGVzJ10sDQoJWycmc2VjdDsnLCAgICAnJiMxNjc7JywgIHRydWUsICdzZWN0aW9uIHNpZ24nXSwNCglbJyZwYXJhOycsICAgICcmIzE4MjsnLCAgdHJ1ZSwgJ3BhcmFncmFwaCBzaWduJ10sDQoJWycmc3psaWc7JywgICAnJiMyMjM7JywgIHRydWUsICdzaGFycCBzIC8gZXNzLXplZCddLA0KLy8gcXVvdGF0aW9ucw0KCVsnJmxzYXF1bzsnLCAgJyYjODI0OTsnLCB0cnVlLCAnc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnXSwNCglbJyZyc2FxdW87JywgICcmIzgyNTA7JywgdHJ1ZSwgJ3NpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyayddLA0KCVsnJmxhcXVvOycsICAgJyYjMTcxOycsICB0cnVlLCAnbGVmdCBwb2ludGluZyBndWlsbGVtZXQnXSwNCglbJyZyYXF1bzsnLCAgICcmIzE4NzsnLCAgdHJ1ZSwgJ3JpZ2h0IHBvaW50aW5nIGd1aWxsZW1ldCddLA0KCVsnJmxzcXVvOycsICAgJyYjODIxNjsnLCB0cnVlLCAnbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsnXSwNCglbJyZyc3F1bzsnLCAgICcmIzgyMTc7JywgdHJ1ZSwgJ3JpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyayddLA0KCVsnJmxkcXVvOycsICAgJyYjODIyMDsnLCB0cnVlLCAnbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmsnXSwNCglbJyZyZHF1bzsnLCAgICcmIzgyMjE7JywgdHJ1ZSwgJ3JpZ2h0IGRvdWJsZSBxdW90YXRpb24gbWFyayddLA0KCVsnJnNicXVvOycsICAgJyYjODIxODsnLCB0cnVlLCAnc2luZ2xlIGxvdy05IHF1b3RhdGlvbiBtYXJrJ10sDQoJWycmYmRxdW87JywgICAnJiM4MjIyOycsIHRydWUsICdkb3VibGUgbG93LTkgcXVvdGF0aW9uIG1hcmsnXSwNCglbJyZsdDsnLCAgICAgICcmIzYwOycsICAgdHJ1ZSwgJ2xlc3MtdGhhbiBzaWduJ10sDQoJWycmZ3Q7JywgICAgICAnJiM2MjsnLCAgIHRydWUsICdncmVhdGVyLXRoYW4gc2lnbiddLA0KCVsnJmxlOycsICAgICAgJyYjODgwNDsnLCB0cnVlLCAnbGVzcy10aGFuIG9yIGVxdWFsIHRvJ10sDQoJWycmZ2U7JywgICAgICAnJiM4ODA1OycsIHRydWUsICdncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8nXSwNCglbJyZuZGFzaDsnLCAgICcmIzgyMTE7JywgdHJ1ZSwgJ2VuIGRhc2gnXSwNCglbJyZtZGFzaDsnLCAgICcmIzgyMTI7JywgdHJ1ZSwgJ2VtIGRhc2gnXSwNCglbJyZtYWNyOycsICAgICcmIzE3NTsnLCAgdHJ1ZSwgJ21hY3JvbiddLA0KCVsnJm9saW5lOycsICAgJyYjODI1NDsnLCB0cnVlLCAnb3ZlcmxpbmUnXSwNCglbJyZjdXJyZW47JywgICcmIzE2NDsnLCAgdHJ1ZSwgJ2N1cnJlbmN5IHNpZ24nXSwNCglbJyZicnZiYXI7JywgICcmIzE2NjsnLCAgdHJ1ZSwgJ2Jyb2tlbiBiYXInXSwNCglbJyZ1bWw7JywgICAgICcmIzE2ODsnLCAgdHJ1ZSwgJ2RpYWVyZXNpcyddLA0KCVsnJmlleGNsOycsICAgJyYjMTYxOycsICB0cnVlLCAnaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyayddLA0KCVsnJmlxdWVzdDsnLCAgJyYjMTkxOycsICB0cnVlLCAndHVybmVkIHF1ZXN0aW9uIG1hcmsnXSwNCglbJyZjaXJjOycsICAgICcmIzcxMDsnLCAgdHJ1ZSwgJ2NpcmN1bWZsZXggYWNjZW50J10sDQoJWycmdGlsZGU7JywgICAnJiM3MzI7JywgIHRydWUsICdzbWFsbCB0aWxkZSddLA0KCVsnJmRlZzsnLCAgICAgJyYjMTc2OycsICB0cnVlLCAnZGVncmVlIHNpZ24nXSwNCglbJyZtaW51czsnLCAgICcmIzg3MjI7JywgdHJ1ZSwgJ21pbnVzIHNpZ24nXSwNCglbJyZwbHVzbW47JywgICcmIzE3NzsnLCAgdHJ1ZSwgJ3BsdXMtbWludXMgc2lnbiddLA0KCVsnJmRpdmlkZTsnLCAgJyYjMjQ3OycsICB0cnVlLCAnZGl2aXNpb24gc2lnbiddLA0KCVsnJmZyYXNsOycsICAgJyYjODI2MDsnLCB0cnVlLCAnZnJhY3Rpb24gc2xhc2gnXSwNCglbJyZ0aW1lczsnLCAgICcmIzIxNTsnLCAgdHJ1ZSwgJ211bHRpcGxpY2F0aW9uIHNpZ24nXSwNCglbJyZzdXAxOycsICAgICcmIzE4NTsnLCAgdHJ1ZSwgJ3N1cGVyc2NyaXB0IG9uZSddLA0KCVsnJnN1cDI7JywgICAgJyYjMTc4OycsICB0cnVlLCAnc3VwZXJzY3JpcHQgdHdvJ10sDQoJWycmc3VwMzsnLCAgICAnJiMxNzk7JywgIHRydWUsICdzdXBlcnNjcmlwdCB0aHJlZSddLA0KCVsnJmZyYWMxNDsnLCAgJyYjMTg4OycsICB0cnVlLCAnZnJhY3Rpb24gb25lIHF1YXJ0ZXInXSwNCglbJyZmcmFjMTI7JywgICcmIzE4OTsnLCAgdHJ1ZSwgJ2ZyYWN0aW9uIG9uZSBoYWxmJ10sDQoJWycmZnJhYzM0OycsICAnJiMxOTA7JywgIHRydWUsICdmcmFjdGlvbiB0aHJlZSBxdWFydGVycyddLA0KLy8gbWF0aCAvIGxvZ2ljYWwNCglbJyZmbm9mOycsICAgICcmIzQwMjsnLCAgdHJ1ZSwgJ2Z1bmN0aW9uIC8gZmxvcmluJ10sDQoJWycmaW50OycsICAgICAnJiM4NzQ3OycsIHRydWUsICdpbnRlZ3JhbCddLA0KCVsnJnN1bTsnLCAgICAgJyYjODcyMTsnLCB0cnVlLCAnbi1hcnkgc3VtYXRpb24nXSwNCglbJyZpbmZpbjsnLCAgICcmIzg3MzQ7JywgdHJ1ZSwgJ2luZmluaXR5J10sDQoJWycmcmFkaWM7JywgICAnJiM4NzMwOycsIHRydWUsICdzcXVhcmUgcm9vdCddLA0KCVsnJnNpbTsnLCAgICAgJyYjODc2NDsnLCBmYWxzZSwnc2ltaWxhciB0byddLA0KCVsnJmNvbmc7JywgICAgJyYjODc3MzsnLCBmYWxzZSwnYXBwcm94aW1hdGVseSBlcXVhbCB0byddLA0KCVsnJmFzeW1wOycsICAgJyYjODc3NjsnLCB0cnVlLCAnYWxtb3N0IGVxdWFsIHRvJ10sDQoJWycmbmU7JywgICAgICAnJiM4ODAwOycsIHRydWUsICdub3QgZXF1YWwgdG8nXSwNCglbJyZlcXVpdjsnLCAgICcmIzg4MDE7JywgdHJ1ZSwgJ2lkZW50aWNhbCB0byddLA0KCVsnJmlzaW47JywgICAgJyYjODcxMjsnLCBmYWxzZSwnZWxlbWVudCBvZiddLA0KCVsnJm5vdGluOycsICAgJyYjODcxMzsnLCBmYWxzZSwnbm90IGFuIGVsZW1lbnQgb2YnXSwNCglbJyZuaTsnLCAgICAgICcmIzg3MTU7JywgZmFsc2UsJ2NvbnRhaW5zIGFzIG1lbWJlciddLA0KCVsnJnByb2Q7JywgICAgJyYjODcxOTsnLCB0cnVlLCAnbi1hcnkgcHJvZHVjdCddLA0KCVsnJmFuZDsnLCAgICAgJyYjODc0MzsnLCBmYWxzZSwnbG9naWNhbCBhbmQnXSwNCglbJyZvcjsnLCAgICAgICcmIzg3NDQ7JywgZmFsc2UsJ2xvZ2ljYWwgb3InXSwNCglbJyZub3Q7JywgICAgICcmIzE3MjsnLCAgdHJ1ZSwgJ25vdCBzaWduJ10sDQoJWycmY2FwOycsICAgICAnJiM4NzQ1OycsIHRydWUsICdpbnRlcnNlY3Rpb24nXSwNCglbJyZjdXA7JywgICAgICcmIzg3NDY7JywgZmFsc2UsJ3VuaW9uJ10sDQoJWycmcGFydDsnLCAgICAnJiM4NzA2OycsIHRydWUsICdwYXJ0aWFsIGRpZmZlcmVudGlhbCddLA0KCVsnJmZvcmFsbDsnLCAgJyYjODcwNDsnLCBmYWxzZSwnZm9yIGFsbCddLA0KCVsnJmV4aXN0OycsICAgJyYjODcwNzsnLCBmYWxzZSwndGhlcmUgZXhpc3RzJ10sDQoJWycmZW1wdHk7JywgICAnJiM4NzA5OycsIGZhbHNlLCdkaWFtZXRlciddLA0KCVsnJm5hYmxhOycsICAgJyYjODcxMTsnLCBmYWxzZSwnYmFja3dhcmQgZGlmZmVyZW5jZSddLA0KCVsnJmxvd2FzdDsnLCAgJyYjODcyNzsnLCBmYWxzZSwnYXN0ZXJpc2sgb3BlcmF0b3InXSwNCglbJyZwcm9wOycsICAgICcmIzg3MzM7JywgZmFsc2UsJ3Byb3BvcnRpb25hbCB0byddLA0KCVsnJmFuZzsnLCAgICAgJyYjODczNjsnLCBmYWxzZSwnYW5nbGUnXSwNCi8vIHVuZGVmaW5lZA0KCVsnJmFjdXRlOycsICAgJyYjMTgwOycsICB0cnVlLCAnYWN1dGUgYWNjZW50J10sDQoJWycmY2VkaWw7JywgICAnJiMxODQ7JywgIHRydWUsICdjZWRpbGxhJ10sDQoJWycmb3JkZjsnLCAgICAnJiMxNzA7JywgIHRydWUsICdmZW1pbmluZSBvcmRpbmFsIGluZGljYXRvciddLA0KCVsnJm9yZG07JywgICAgJyYjMTg2OycsICB0cnVlLCAnbWFzY3VsaW5lIG9yZGluYWwgaW5kaWNhdG9yJ10sDQoJWycmZGFnZ2VyOycsICAnJiM4MjI0OycsIHRydWUsICdkYWdnZXInXSwNCglbJyZEYWdnZXI7JywgICcmIzgyMjU7JywgdHJ1ZSwgJ2RvdWJsZSBkYWdnZXInXSwNCi8vIGFscGhhYmV0aWNhbCBzcGVjaWFsIGNoYXJzDQoJWycmQWdyYXZlOycsICAnJiMxOTI7JywgIHRydWUsICdBIC0gZ3JhdmUnXSwNCglbJyZBYWN1dGU7JywgICcmIzE5MzsnLCAgdHJ1ZSwgJ0EgLSBhY3V0ZSddLA0KCVsnJkFjaXJjOycsICAgJyYjMTk0OycsICB0cnVlLCAnQSAtIGNpcmN1bWZsZXgnXSwNCglbJyZBdGlsZGU7JywgICcmIzE5NTsnLCAgdHJ1ZSwgJ0EgLSB0aWxkZSddLA0KCVsnJkF1bWw7JywgICAgJyYjMTk2OycsICB0cnVlLCAnQSAtIGRpYWVyZXNpcyddLA0KCVsnJkFyaW5nOycsICAgJyYjMTk3OycsICB0cnVlLCAnQSAtIHJpbmcgYWJvdmUnXSwNCglbJyZBRWxpZzsnLCAgICcmIzE5ODsnLCAgdHJ1ZSwgJ2xpZ2F0dXJlIEFFJ10sDQoJWycmQ2NlZGlsOycsICAnJiMxOTk7JywgIHRydWUsICdDIC0gY2VkaWxsYSddLA0KCVsnJkVncmF2ZTsnLCAgJyYjMjAwOycsICB0cnVlLCAnRSAtIGdyYXZlJ10sDQoJWycmRWFjdXRlOycsICAnJiMyMDE7JywgIHRydWUsICdFIC0gYWN1dGUnXSwNCglbJyZFY2lyYzsnLCAgICcmIzIwMjsnLCAgdHJ1ZSwgJ0UgLSBjaXJjdW1mbGV4J10sDQoJWycmRXVtbDsnLCAgICAnJiMyMDM7JywgIHRydWUsICdFIC0gZGlhZXJlc2lzJ10sDQoJWycmSWdyYXZlOycsICAnJiMyMDQ7JywgIHRydWUsICdJIC0gZ3JhdmUnXSwNCglbJyZJYWN1dGU7JywgICcmIzIwNTsnLCAgdHJ1ZSwgJ0kgLSBhY3V0ZSddLA0KCVsnJkljaXJjOycsICAgJyYjMjA2OycsICB0cnVlLCAnSSAtIGNpcmN1bWZsZXgnXSwNCglbJyZJdW1sOycsICAgICcmIzIwNzsnLCAgdHJ1ZSwgJ0kgLSBkaWFlcmVzaXMnXSwNCglbJyZFVEg7JywgICAgICcmIzIwODsnLCAgdHJ1ZSwgJ0VUSCddLA0KCVsnJk50aWxkZTsnLCAgJyYjMjA5OycsICB0cnVlLCAnTiAtIHRpbGRlJ10sDQoJWycmT2dyYXZlOycsICAnJiMyMTA7JywgIHRydWUsICdPIC0gZ3JhdmUnXSwNCglbJyZPYWN1dGU7JywgICcmIzIxMTsnLCAgdHJ1ZSwgJ08gLSBhY3V0ZSddLA0KCVsnJk9jaXJjOycsICAgJyYjMjEyOycsICB0cnVlLCAnTyAtIGNpcmN1bWZsZXgnXSwNCglbJyZPdGlsZGU7JywgICcmIzIxMzsnLCAgdHJ1ZSwgJ08gLSB0aWxkZSddLA0KCVsnJk91bWw7JywgICAgJyYjMjE0OycsICB0cnVlLCAnTyAtIGRpYWVyZXNpcyddLA0KCVsnJk9zbGFzaDsnLCAgJyYjMjE2OycsICB0cnVlLCAnTyAtIHNsYXNoJ10sDQoJWycmT0VsaWc7JywgICAnJiMzMzg7JywgIHRydWUsICdsaWdhdHVyZSBPRSddLA0KCVsnJlNjYXJvbjsnLCAgJyYjMzUyOycsICB0cnVlLCAnUyAtIGNhcm9uJ10sDQoJWycmVWdyYXZlOycsICAnJiMyMTc7JywgIHRydWUsICdVIC0gZ3JhdmUnXSwNCglbJyZVYWN1dGU7JywgICcmIzIxODsnLCAgdHJ1ZSwgJ1UgLSBhY3V0ZSddLA0KCVsnJlVjaXJjOycsICAgJyYjMjE5OycsICB0cnVlLCAnVSAtIGNpcmN1bWZsZXgnXSwNCglbJyZVdW1sOycsICAgICcmIzIyMDsnLCAgdHJ1ZSwgJ1UgLSBkaWFlcmVzaXMnXSwNCglbJyZZYWN1dGU7JywgICcmIzIyMTsnLCAgdHJ1ZSwgJ1kgLSBhY3V0ZSddLA0KCVsnJll1bWw7JywgICAgJyYjMzc2OycsICB0cnVlLCAnWSAtIGRpYWVyZXNpcyddLA0KCVsnJlRIT1JOOycsICAgJyYjMjIyOycsICB0cnVlLCAnVEhPUk4nXSwNCglbJyZhZ3JhdmU7JywgICcmIzIyNDsnLCAgdHJ1ZSwgJ2EgLSBncmF2ZSddLA0KCVsnJmFhY3V0ZTsnLCAgJyYjMjI1OycsICB0cnVlLCAnYSAtIGFjdXRlJ10sDQoJWycmYWNpcmM7JywgICAnJiMyMjY7JywgIHRydWUsICdhIC0gY2lyY3VtZmxleCddLA0KCVsnJmF0aWxkZTsnLCAgJyYjMjI3OycsICB0cnVlLCAnYSAtIHRpbGRlJ10sDQoJWycmYXVtbDsnLCAgICAnJiMyMjg7JywgIHRydWUsICdhIC0gZGlhZXJlc2lzJ10sDQoJWycmYXJpbmc7JywgICAnJiMyMjk7JywgIHRydWUsICdhIC0gcmluZyBhYm92ZSddLA0KCVsnJmFlbGlnOycsICAgJyYjMjMwOycsICB0cnVlLCAnbGlnYXR1cmUgYWUnXSwNCglbJyZjY2VkaWw7JywgICcmIzIzMTsnLCAgdHJ1ZSwgJ2MgLSBjZWRpbGxhJ10sDQoJWycmZWdyYXZlOycsICAnJiMyMzI7JywgIHRydWUsICdlIC0gZ3JhdmUnXSwNCglbJyZlYWN1dGU7JywgICcmIzIzMzsnLCAgdHJ1ZSwgJ2UgLSBhY3V0ZSddLA0KCVsnJmVjaXJjOycsICAgJyYjMjM0OycsICB0cnVlLCAnZSAtIGNpcmN1bWZsZXgnXSwNCglbJyZldW1sOycsICAgICcmIzIzNTsnLCAgdHJ1ZSwgJ2UgLSBkaWFlcmVzaXMnXSwNCglbJyZpZ3JhdmU7JywgICcmIzIzNjsnLCAgdHJ1ZSwgJ2kgLSBncmF2ZSddLA0KCVsnJmlhY3V0ZTsnLCAgJyYjMjM3OycsICB0cnVlLCAnaSAtIGFjdXRlJ10sDQoJWycmaWNpcmM7JywgICAnJiMyMzg7JywgIHRydWUsICdpIC0gY2lyY3VtZmxleCddLA0KCVsnJml1bWw7JywgICAgJyYjMjM5OycsICB0cnVlLCAnaSAtIGRpYWVyZXNpcyddLA0KCVsnJmV0aDsnLCAgICAgJyYjMjQwOycsICB0cnVlLCAnZXRoJ10sDQoJWycmbnRpbGRlOycsICAnJiMyNDE7JywgIHRydWUsICduIC0gdGlsZGUnXSwNCglbJyZvZ3JhdmU7JywgICcmIzI0MjsnLCAgdHJ1ZSwgJ28gLSBncmF2ZSddLA0KCVsnJm9hY3V0ZTsnLCAgJyYjMjQzOycsICB0cnVlLCAnbyAtIGFjdXRlJ10sDQoJWycmb2NpcmM7JywgICAnJiMyNDQ7JywgIHRydWUsICdvIC0gY2lyY3VtZmxleCddLA0KCVsnJm90aWxkZTsnLCAgJyYjMjQ1OycsICB0cnVlLCAnbyAtIHRpbGRlJ10sDQoJWycmb3VtbDsnLCAgICAnJiMyNDY7JywgIHRydWUsICdvIC0gZGlhZXJlc2lzJ10sDQoJWycmb3NsYXNoOycsICAnJiMyNDg7JywgIHRydWUsICdvIHNsYXNoJ10sDQoJWycmb2VsaWc7JywgICAnJiMzMzk7JywgIHRydWUsICdsaWdhdHVyZSBvZSddLA0KCVsnJnNjYXJvbjsnLCAgJyYjMzUzOycsICB0cnVlLCAncyAtIGNhcm9uJ10sDQoJWycmdWdyYXZlOycsICAnJiMyNDk7JywgIHRydWUsICd1IC0gZ3JhdmUnXSwNCglbJyZ1YWN1dGU7JywgICcmIzI1MDsnLCAgdHJ1ZSwgJ3UgLSBhY3V0ZSddLA0KCVsnJnVjaXJjOycsICAgJyYjMjUxOycsICB0cnVlLCAndSAtIGNpcmN1bWZsZXgnXSwNCglbJyZ1dW1sOycsICAgICcmIzI1MjsnLCAgdHJ1ZSwgJ3UgLSBkaWFlcmVzaXMnXSwNCglbJyZ5YWN1dGU7JywgICcmIzI1MzsnLCAgdHJ1ZSwgJ3kgLSBhY3V0ZSddLA0KCVsnJnRob3JuOycsICAgJyYjMjU0OycsICB0cnVlLCAndGhvcm4nXSwNCglbJyZ5dW1sOycsICAgICcmIzI1NTsnLCAgdHJ1ZSwgJ3kgLSBkaWFlcmVzaXMnXSwNCiAgICBbJyZBbHBoYTsnLCAgICcmIzkxMzsnLCAgdHJ1ZSwgJ0FscGhhJ10sDQoJWycmQmV0YTsnLCAgICAnJiM5MTQ7JywgIHRydWUsICdCZXRhJ10sDQoJWycmR2FtbWE7JywgICAnJiM5MTU7JywgIHRydWUsICdHYW1tYSddLA0KCVsnJkRlbHRhOycsICAgJyYjOTE2OycsICB0cnVlLCAnRGVsdGEnXSwNCglbJyZFcHNpbG9uOycsICcmIzkxNzsnLCAgdHJ1ZSwgJ0Vwc2lsb24nXSwNCglbJyZaZXRhOycsICAgICcmIzkxODsnLCAgdHJ1ZSwgJ1pldGEnXSwNCglbJyZFdGE7JywgICAgICcmIzkxOTsnLCAgdHJ1ZSwgJ0V0YSddLA0KCVsnJlRoZXRhOycsICAgJyYjOTIwOycsICB0cnVlLCAnVGhldGEnXSwNCglbJyZJb3RhOycsICAgICcmIzkyMTsnLCAgdHJ1ZSwgJ0lvdGEnXSwNCglbJyZLYXBwYTsnLCAgICcmIzkyMjsnLCAgdHJ1ZSwgJ0thcHBhJ10sDQoJWycmTGFtYmRhOycsICAnJiM5MjM7JywgIHRydWUsICdMYW1iZGEnXSwNCglbJyZNdTsnLCAgICAgICcmIzkyNDsnLCAgdHJ1ZSwgJ011J10sDQoJWycmTnU7JywgICAgICAnJiM5MjU7JywgIHRydWUsICdOdSddLA0KCVsnJlhpOycsICAgICAgJyYjOTI2OycsICB0cnVlLCAnWGknXSwNCglbJyZPbWljcm9uOycsICcmIzkyNzsnLCAgdHJ1ZSwgJ09taWNyb24nXSwNCglbJyZQaTsnLCAgICAgICcmIzkyODsnLCAgdHJ1ZSwgJ1BpJ10sDQoJWycmUmhvOycsICAgICAnJiM5Mjk7JywgIHRydWUsICdSaG8nXSwNCglbJyZTaWdtYTsnLCAgICcmIzkzMTsnLCAgdHJ1ZSwgJ1NpZ21hJ10sDQoJWycmVGF1OycsICAgICAnJiM5MzI7JywgIHRydWUsICdUYXUnXSwNCglbJyZVcHNpbG9uOycsICcmIzkzMzsnLCAgdHJ1ZSwgJ1Vwc2lsb24nXSwNCglbJyZQaGk7JywgICAgICcmIzkzNDsnLCAgdHJ1ZSwgJ1BoaSddLA0KCVsnJkNoaTsnLCAgICAgJyYjOTM1OycsICB0cnVlLCAnQ2hpJ10sDQoJWycmUHNpOycsICAgICAnJiM5MzY7JywgIHRydWUsICdQc2knXSwNCglbJyZPbWVnYTsnLCAgICcmIzkzNzsnLCAgdHJ1ZSwgJ09tZWdhJ10sDQoJWycmYWxwaGE7JywgICAnJiM5NDU7JywgIHRydWUsICdhbHBoYSddLA0KCVsnJmJldGE7JywgICAgJyYjOTQ2OycsICB0cnVlLCAnYmV0YSddLA0KCVsnJmdhbW1hOycsICAgJyYjOTQ3OycsICB0cnVlLCAnZ2FtbWEnXSwNCglbJyZkZWx0YTsnLCAgICcmIzk0ODsnLCAgdHJ1ZSwgJ2RlbHRhJ10sDQoJWycmZXBzaWxvbjsnLCAnJiM5NDk7JywgIHRydWUsICdlcHNpbG9uJ10sDQoJWycmemV0YTsnLCAgICAnJiM5NTA7JywgIHRydWUsICd6ZXRhJ10sDQoJWycmZXRhOycsICAgICAnJiM5NTE7JywgIHRydWUsICdldGEnXSwNCglbJyZ0aGV0YTsnLCAgICcmIzk1MjsnLCAgdHJ1ZSwgJ3RoZXRhJ10sDQoJWycmaW90YTsnLCAgICAnJiM5NTM7JywgIHRydWUsICdpb3RhJ10sDQoJWycma2FwcGE7JywgICAnJiM5NTQ7JywgIHRydWUsICdrYXBwYSddLA0KCVsnJmxhbWJkYTsnLCAgJyYjOTU1OycsICB0cnVlLCAnbGFtYmRhJ10sDQoJWycmbXU7JywgICAgICAnJiM5NTY7JywgIHRydWUsICdtdSddLA0KCVsnJm51OycsICAgICAgJyYjOTU3OycsICB0cnVlLCAnbnUnXSwNCglbJyZ4aTsnLCAgICAgICcmIzk1ODsnLCAgdHJ1ZSwgJ3hpJ10sDQoJWycmb21pY3JvbjsnLCAnJiM5NTk7JywgIHRydWUsICdvbWljcm9uJ10sDQoJWycmcGk7JywgICAgICAnJiM5NjA7JywgIHRydWUsICdwaSddLA0KCVsnJnJobzsnLCAgICAgJyYjOTYxOycsICB0cnVlLCAncmhvJ10sDQoJWycmc2lnbWFmOycsICAnJiM5NjI7JywgIHRydWUsICdmaW5hbCBzaWdtYSddLA0KCVsnJnNpZ21hOycsICAgJyYjOTYzOycsICB0cnVlLCAnc2lnbWEnXSwNCglbJyZ0YXU7JywgICAgICcmIzk2NDsnLCAgdHJ1ZSwgJ3RhdSddLA0KCVsnJnVwc2lsb247JywgJyYjOTY1OycsICB0cnVlLCAndXBzaWxvbiddLA0KCVsnJnBoaTsnLCAgICAgJyYjOTY2OycsICB0cnVlLCAncGhpJ10sDQoJWycmY2hpOycsICAgICAnJiM5Njc7JywgIHRydWUsICdjaGknXSwNCglbJyZwc2k7JywgICAgICcmIzk2ODsnLCAgdHJ1ZSwgJ3BzaSddLA0KCVsnJm9tZWdhOycsICAgJyYjOTY5OycsICB0cnVlLCAnb21lZ2EnXSwNCi8vIHN5bWJvbHMNCglbJyZhbGVmc3ltOycsICcmIzg1MDE7JywgZmFsc2UsJ2FsZWYgc3ltYm9sJ10sDQoJWycmcGl2OycsICAgICAnJiM5ODI7JywgIGZhbHNlLCdwaSBzeW1ib2wnXSwNCglbJyZyZWFsOycsICAgICcmIzg0NzY7JywgZmFsc2UsJ3JlYWwgcGFydCBzeW1ib2wnXSwNCglbJyZ0aGV0YXN5bTsnLCcmIzk3NzsnLCAgZmFsc2UsJ3RoZXRhIHN5bWJvbCddLA0KCVsnJnVwc2loOycsICAgJyYjOTc4OycsICBmYWxzZSwndXBzaWxvbiAtIGhvb2sgc3ltYm9sJ10sDQoJWycmd2VpZXJwOycsICAnJiM4NDcyOycsIGZhbHNlLCdXZWllcnN0cmFzcyBwJ10sDQoJWycmaW1hZ2U7JywgICAnJiM4NDY1OycsIGZhbHNlLCdpbWFnaW5hcnkgcGFydCddLA0KLy8gYXJyb3dzDQoJWycmbGFycjsnLCAgICAnJiM4NTkyOycsIHRydWUsICdsZWZ0d2FyZHMgYXJyb3cnXSwNCglbJyZ1YXJyOycsICAgICcmIzg1OTM7JywgdHJ1ZSwgJ3Vwd2FyZHMgYXJyb3cnXSwNCglbJyZyYXJyOycsICAgICcmIzg1OTQ7JywgdHJ1ZSwgJ3JpZ2h0d2FyZHMgYXJyb3cnXSwNCglbJyZkYXJyOycsICAgICcmIzg1OTU7JywgdHJ1ZSwgJ2Rvd253YXJkcyBhcnJvdyddLA0KCVsnJmhhcnI7JywgICAgJyYjODU5NjsnLCB0cnVlLCAnbGVmdCByaWdodCBhcnJvdyddLA0KCVsnJmNyYXJyOycsICAgJyYjODYyOTsnLCBmYWxzZSwnY2FycmlhZ2UgcmV0dXJuJ10sDQoJWycmbEFycjsnLCAgICAnJiM4NjU2OycsIGZhbHNlLCdsZWZ0d2FyZHMgZG91YmxlIGFycm93J10sDQoJWycmdUFycjsnLCAgICAnJiM4NjU3OycsIGZhbHNlLCd1cHdhcmRzIGRvdWJsZSBhcnJvdyddLA0KCVsnJnJBcnI7JywgICAgJyYjODY1ODsnLCBmYWxzZSwncmlnaHR3YXJkcyBkb3VibGUgYXJyb3cnXSwNCglbJyZkQXJyOycsICAgICcmIzg2NTk7JywgZmFsc2UsJ2Rvd253YXJkcyBkb3VibGUgYXJyb3cnXSwNCglbJyZoQXJyOycsICAgICcmIzg2NjA7JywgZmFsc2UsJ2xlZnQgcmlnaHQgZG91YmxlIGFycm93J10sDQoJWycmdGhlcmU0OycsICAnJiM4NzU2OycsIGZhbHNlLCd0aGVyZWZvcmUnXSwNCglbJyZzdWI7JywgICAgICcmIzg4MzQ7JywgZmFsc2UsJ3N1YnNldCBvZiddLA0KCVsnJnN1cDsnLCAgICAgJyYjODgzNTsnLCBmYWxzZSwnc3VwZXJzZXQgb2YnXSwNCglbJyZuc3ViOycsICAgICcmIzg4MzY7JywgZmFsc2UsJ25vdCBhIHN1YnNldCBvZiddLA0KCVsnJnN1YmU7JywgICAgJyYjODgzODsnLCBmYWxzZSwnc3Vic2V0IG9mIG9yIGVxdWFsIHRvJ10sDQoJWycmc3VwZTsnLCAgICAnJiM4ODM5OycsIGZhbHNlLCdzdXBlcnNldCBvZiBvciBlcXVhbCB0byddLA0KCVsnJm9wbHVzOycsICAgJyYjODg1MzsnLCBmYWxzZSwnY2lyY2xlZCBwbHVzJ10sDQoJWycmb3RpbWVzOycsICAnJiM4ODU1OycsIGZhbHNlLCdjaXJjbGVkIHRpbWVzJ10sDQoJWycmcGVycDsnLCAgICAnJiM4ODY5OycsIGZhbHNlLCdwZXJwZW5kaWN1bGFyJ10sDQoJWycmc2RvdDsnLCAgICAnJiM4OTAxOycsIGZhbHNlLCdkb3Qgb3BlcmF0b3InXSwNCglbJyZsY2VpbDsnLCAgICcmIzg5Njg7JywgZmFsc2UsJ2xlZnQgY2VpbGluZyddLA0KCVsnJnJjZWlsOycsICAgJyYjODk2OTsnLCBmYWxzZSwncmlnaHQgY2VpbGluZyddLA0KCVsnJmxmbG9vcjsnLCAgJyYjODk3MDsnLCBmYWxzZSwnbGVmdCBmbG9vciddLA0KCVsnJnJmbG9vcjsnLCAgJyYjODk3MTsnLCBmYWxzZSwncmlnaHQgZmxvb3InXSwNCglbJyZsYW5nOycsICAgICcmIzkwMDE7JywgZmFsc2UsJ2xlZnQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCddLA0KCVsnJnJhbmc7JywgICAgJyYjOTAwMjsnLCBmYWxzZSwncmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCddLA0KCVsnJmxvejsnLCAgICAgJyYjOTY3NDsnLCB0cnVlLCdsb3plbmdlJ10sDQoJWycmc3BhZGVzOycsICAnJiM5ODI0OycsIGZhbHNlLCdibGFjayBzcGFkZSBzdWl0J10sDQoJWycmY2x1YnM7JywgICAnJiM5ODI3OycsIHRydWUsICdibGFjayBjbHViIHN1aXQnXSwNCglbJyZoZWFydHM7JywgICcmIzk4Mjk7JywgdHJ1ZSwgJ2JsYWNrIGhlYXJ0IHN1aXQnXSwNCglbJyZkaWFtczsnLCAgICcmIzk4MzA7JywgdHJ1ZSwgJ2JsYWNrIGRpYW1vbmQgc3VpdCddLA0KCVsnJmVuc3A7JywgICAgJyYjODE5NDsnLCBmYWxzZSwnZW4gc3BhY2UnXSwNCglbJyZlbXNwOycsICAgICcmIzgxOTU7JywgZmFsc2UsJ2VtIHNwYWNlJ10sDQoJWycmdGhpbnNwOycsICAnJiM4MjAxOycsIGZhbHNlLCd0aGluIHNwYWNlJ10sDQoJWycmenduajsnLCAgICAnJiM4MjA0OycsIGZhbHNlLCd6ZXJvIHdpZHRoIG5vbi1qb2luZXInXSwNCglbJyZ6d2o7JywgICAgICcmIzgyMDU7JywgZmFsc2UsJ3plcm8gd2lkdGggam9pbmVyJ10sDQoJWycmbHJtOycsICAgICAnJiM4MjA2OycsIGZhbHNlLCdsZWZ0LXRvLXJpZ2h0IG1hcmsnXSwNCglbJyZybG07JywgICAgICcmIzgyMDc7JywgZmFsc2UsJ3JpZ2h0LXRvLWxlZnQgbWFyayddLA0KCVsnJnNoeTsnLCAgICAgJyYjMTczOycsICBmYWxzZSwnc29mdCBoeXBoZW4nXQ0KXTsNCg0KdGlueU1DRVBvcHVwLm9uSW5pdC5hZGQoZnVuY3Rpb24oKSB7DQoJdGlueU1DRVBvcHVwLmRvbS5zZXRIVE1MKCdjaGFybWFwVmlldycsIHJlbmRlckNoYXJNYXBIVE1MKCkpOw0KfSk7DQoNCmZ1bmN0aW9uIHJlbmRlckNoYXJNYXBIVE1MKCkgew0KCXZhciBjaGFyc1BlclJvdyA9IDIwLCB0ZFdpZHRoPTIwLCB0ZEhlaWdodD0yMCwgaTsNCgl2YXIgaHRtbCA9ICc8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSInICsgKHRkV2lkdGgqY2hhcnNQZXJSb3cpICsgJyI+PHRyIGhlaWdodD0iJyArIHRkSGVpZ2h0ICsgJyI+JzsNCgl2YXIgY29scz0tMTsNCg0KCWZvciAoaT0wOyBpPGNoYXJtYXAubGVuZ3RoOyBpKyspIHsNCgkJaWYgKGNoYXJtYXBbaV1bMl09PXRydWUpIHsNCgkJCWNvbHMrKzsNCgkJCWh0bWwgKz0gJycNCgkJCQkrICc8dGQgY2xhc3M9ImNoYXJtYXAiPicNCgkJCQkrICc8YSBvbm1vdXNlb3Zlcj0icHJldmlld0NoYXIoXCcnICsgY2hhcm1hcFtpXVsxXS5zdWJzdHJpbmcoMSxjaGFybWFwW2ldWzFdLmxlbmd0aCkgKyAnXCcsXCcnICsgY2hhcm1hcFtpXVswXS5zdWJzdHJpbmcoMSxjaGFybWFwW2ldWzBdLmxlbmd0aCkgKyAnXCcsXCcnICsgY2hhcm1hcFtpXVszXSArICdcJyk7IiBvbmZvY3VzPSJwcmV2aWV3Q2hhcihcJycgKyBjaGFybWFwW2ldWzFdLnN1YnN0cmluZygxLGNoYXJtYXBbaV1bMV0ubGVuZ3RoKSArICdcJyxcJycgKyBjaGFybWFwW2ldWzBdLnN1YnN0cmluZygxLGNoYXJtYXBbaV1bMF0ubGVuZ3RoKSArICdcJyxcJycgKyBjaGFybWFwW2ldWzNdICsgJ1wnKTsiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgb25jbGljaz0iaW5zZXJ0Q2hhcihcJycgKyBjaGFybWFwW2ldWzFdLnN1YnN0cmluZygyLGNoYXJtYXBbaV1bMV0ubGVuZ3RoLTEpICsgJ1wnKTsiIG9uY2xpY2s9InJldHVybiBmYWxzZTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7IiB0aXRsZT0iJyArIGNoYXJtYXBbaV1bM10gKyAnIj4nDQoJCQkJKyBjaGFybWFwW2ldWzFdDQoJCQkJKyAnPC9hPjwvdGQ+JzsNCgkJCWlmICgoY29scysxKSAlIGNoYXJzUGVyUm93ID09IDApDQoJCQkJaHRtbCArPSAnPC90cj48dHIgaGVpZ2h0PSInICsgdGRIZWlnaHQgKyAnIj4nOw0KCQl9DQoJIH0NCg0KCWlmIChjb2xzICUgY2hhcnNQZXJSb3cgPiAwKSB7DQoJCXZhciBwYWRkID0gY2hhcnNQZXJSb3cgLSAoY29scyAlIGNoYXJzUGVyUm93KTsNCgkJZm9yICh2YXIgaT0wOyBpPHBhZGQtMTsgaSsrKQ0KCQkJaHRtbCArPSAnPHRkIHdpZHRoPSInICsgdGRXaWR0aCArICciIGhlaWdodD0iJyArIHRkSGVpZ2h0ICsgJyIgY2xhc3M9ImNoYXJtYXAiPiZuYnNwOzwvdGQ+JzsNCgl9DQoNCglodG1sICs9ICc8L3RyPjwvdGFibGU+JzsNCg0KCXJldHVybiBodG1sOw0KfQ0KDQpmdW5jdGlvbiBpbnNlcnRDaGFyKGNocikgew0KCXRpbnlNQ0VQb3B1cC5leGVjQ29tbWFuZCgnbWNlSW5zZXJ0Q29udGVudCcsIGZhbHNlLCAnJiMnICsgY2hyICsgJzsnKTsNCg0KCS8vIFJlZm9jdXMgaW4gd2luZG93DQoJaWYgKHRpbnlNQ0VQb3B1cC5pc1dpbmRvdykNCgkJd2luZG93LmZvY3VzKCk7DQoNCgl0aW55TUNFUG9wdXAuZWRpdG9yLmZvY3VzKCk7DQoJdGlueU1DRVBvcHVwLmNsb3NlKCk7DQp9DQoNCmZ1bmN0aW9uIHByZXZpZXdDaGFyKGNvZGVBLCBjb2RlQiwgY29kZU4pIHsNCgl2YXIgZWxtQSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2RlQScpOw0KCXZhciBlbG1CID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvZGVCJyk7DQoJdmFyIGVsbVYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29kZVYnKTsNCgl2YXIgZWxtTiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2RlTicpOw0KDQoJaWYgKGNvZGVBPT0nIzE2MDsnKSB7DQoJCWVsbVYuaW5uZXJIVE1MID0gJ19fJzsNCgl9IGVsc2Ugew0KCQllbG1WLmlubmVySFRNTCA9ICcmJyArIGNvZGVBOw0KCX0NCg0KCWVsbUIuaW5uZXJIVE1MID0gJyZhbXA7JyArIGNvZGVBOw0KCWVsbUEuaW5uZXJIVE1MID0gJyZhbXA7JyArIGNvZGVCOw0KCWVsbU4uaW5uZXJIVE1MID0gY29kZU47DQp9DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/js/color_picker.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgZGV0YWlsID0gNTAsIHN0cmhleCA9ICIwMTIzNDU2Nzg5YWJjZGVmIiwgaSwgaXNNb3VzZURvd24gPSBmYWxzZSwgaXNNb3VzZU92ZXIgPSBmYWxzZTsNCg0KdmFyIGNvbG9ycyA9IFsNCgkiIzAwMDAwMCIsIiMwMDAwMzMiLCIjMDAwMDY2IiwiIzAwMDA5OSIsIiMwMDAwY2MiLCIjMDAwMGZmIiwiIzMzMDAwMCIsIiMzMzAwMzMiLA0KCSIjMzMwMDY2IiwiIzMzMDA5OSIsIiMzMzAwY2MiLCIjMzMwMGZmIiwiIzY2MDAwMCIsIiM2NjAwMzMiLCIjNjYwMDY2IiwiIzY2MDA5OSIsDQoJIiM2NjAwY2MiLCIjNjYwMGZmIiwiIzk5MDAwMCIsIiM5OTAwMzMiLCIjOTkwMDY2IiwiIzk5MDA5OSIsIiM5OTAwY2MiLCIjOTkwMGZmIiwNCgkiI2NjMDAwMCIsIiNjYzAwMzMiLCIjY2MwMDY2IiwiI2NjMDA5OSIsIiNjYzAwY2MiLCIjY2MwMGZmIiwiI2ZmMDAwMCIsIiNmZjAwMzMiLA0KCSIjZmYwMDY2IiwiI2ZmMDA5OSIsIiNmZjAwY2MiLCIjZmYwMGZmIiwiIzAwMzMwMCIsIiMwMDMzMzMiLCIjMDAzMzY2IiwiIzAwMzM5OSIsDQoJIiMwMDMzY2MiLCIjMDAzM2ZmIiwiIzMzMzMwMCIsIiMzMzMzMzMiLCIjMzMzMzY2IiwiIzMzMzM5OSIsIiMzMzMzY2MiLCIjMzMzM2ZmIiwNCgkiIzY2MzMwMCIsIiM2NjMzMzMiLCIjNjYzMzY2IiwiIzY2MzM5OSIsIiM2NjMzY2MiLCIjNjYzM2ZmIiwiIzk5MzMwMCIsIiM5OTMzMzMiLA0KCSIjOTkzMzY2IiwiIzk5MzM5OSIsIiM5OTMzY2MiLCIjOTkzM2ZmIiwiI2NjMzMwMCIsIiNjYzMzMzMiLCIjY2MzMzY2IiwiI2NjMzM5OSIsDQoJIiNjYzMzY2MiLCIjY2MzM2ZmIiwiI2ZmMzMwMCIsIiNmZjMzMzMiLCIjZmYzMzY2IiwiI2ZmMzM5OSIsIiNmZjMzY2MiLCIjZmYzM2ZmIiwNCgkiIzAwNjYwMCIsIiMwMDY2MzMiLCIjMDA2NjY2IiwiIzAwNjY5OSIsIiMwMDY2Y2MiLCIjMDA2NmZmIiwiIzMzNjYwMCIsIiMzMzY2MzMiLA0KCSIjMzM2NjY2IiwiIzMzNjY5OSIsIiMzMzY2Y2MiLCIjMzM2NmZmIiwiIzY2NjYwMCIsIiM2NjY2MzMiLCIjNjY2NjY2IiwiIzY2NjY5OSIsDQoJIiM2NjY2Y2MiLCIjNjY2NmZmIiwiIzk5NjYwMCIsIiM5OTY2MzMiLCIjOTk2NjY2IiwiIzk5NjY5OSIsIiM5OTY2Y2MiLCIjOTk2NmZmIiwNCgkiI2NjNjYwMCIsIiNjYzY2MzMiLCIjY2M2NjY2IiwiI2NjNjY5OSIsIiNjYzY2Y2MiLCIjY2M2NmZmIiwiI2ZmNjYwMCIsIiNmZjY2MzMiLA0KCSIjZmY2NjY2IiwiI2ZmNjY5OSIsIiNmZjY2Y2MiLCIjZmY2NmZmIiwiIzAwOTkwMCIsIiMwMDk5MzMiLCIjMDA5OTY2IiwiIzAwOTk5OSIsDQoJIiMwMDk5Y2MiLCIjMDA5OWZmIiwiIzMzOTkwMCIsIiMzMzk5MzMiLCIjMzM5OTY2IiwiIzMzOTk5OSIsIiMzMzk5Y2MiLCIjMzM5OWZmIiwNCgkiIzY2OTkwMCIsIiM2Njk5MzMiLCIjNjY5OTY2IiwiIzY2OTk5OSIsIiM2Njk5Y2MiLCIjNjY5OWZmIiwiIzk5OTkwMCIsIiM5OTk5MzMiLA0KCSIjOTk5OTY2IiwiIzk5OTk5OSIsIiM5OTk5Y2MiLCIjOTk5OWZmIiwiI2NjOTkwMCIsIiNjYzk5MzMiLCIjY2M5OTY2IiwiI2NjOTk5OSIsDQoJIiNjYzk5Y2MiLCIjY2M5OWZmIiwiI2ZmOTkwMCIsIiNmZjk5MzMiLCIjZmY5OTY2IiwiI2ZmOTk5OSIsIiNmZjk5Y2MiLCIjZmY5OWZmIiwNCgkiIzAwY2MwMCIsIiMwMGNjMzMiLCIjMDBjYzY2IiwiIzAwY2M5OSIsIiMwMGNjY2MiLCIjMDBjY2ZmIiwiIzMzY2MwMCIsIiMzM2NjMzMiLA0KCSIjMzNjYzY2IiwiIzMzY2M5OSIsIiMzM2NjY2MiLCIjMzNjY2ZmIiwiIzY2Y2MwMCIsIiM2NmNjMzMiLCIjNjZjYzY2IiwiIzY2Y2M5OSIsDQoJIiM2NmNjY2MiLCIjNjZjY2ZmIiwiIzk5Y2MwMCIsIiM5OWNjMzMiLCIjOTljYzY2IiwiIzk5Y2M5OSIsIiM5OWNjY2MiLCIjOTljY2ZmIiwNCgkiI2NjY2MwMCIsIiNjY2NjMzMiLCIjY2NjYzY2IiwiI2NjY2M5OSIsIiNjY2NjY2MiLCIjY2NjY2ZmIiwiI2ZmY2MwMCIsIiNmZmNjMzMiLA0KCSIjZmZjYzY2IiwiI2ZmY2M5OSIsIiNmZmNjY2MiLCIjZmZjY2ZmIiwiIzAwZmYwMCIsIiMwMGZmMzMiLCIjMDBmZjY2IiwiIzAwZmY5OSIsDQoJIiMwMGZmY2MiLCIjMDBmZmZmIiwiIzMzZmYwMCIsIiMzM2ZmMzMiLCIjMzNmZjY2IiwiIzMzZmY5OSIsIiMzM2ZmY2MiLCIjMzNmZmZmIiwNCgkiIzY2ZmYwMCIsIiM2NmZmMzMiLCIjNjZmZjY2IiwiIzY2ZmY5OSIsIiM2NmZmY2MiLCIjNjZmZmZmIiwiIzk5ZmYwMCIsIiM5OWZmMzMiLA0KCSIjOTlmZjY2IiwiIzk5ZmY5OSIsIiM5OWZmY2MiLCIjOTlmZmZmIiwiI2NjZmYwMCIsIiNjY2ZmMzMiLCIjY2NmZjY2IiwiI2NjZmY5OSIsDQoJIiNjY2ZmY2MiLCIjY2NmZmZmIiwiI2ZmZmYwMCIsIiNmZmZmMzMiLCIjZmZmZjY2IiwiI2ZmZmY5OSIsIiNmZmZmY2MiLCIjZmZmZmZmIg0KXTsNCg0KdmFyIG5hbWVkID0gew0KCScjRjBGOEZGJzonQWxpY2VCbHVlJywnI0ZBRUJENyc6J0FudGlxdWVXaGl0ZScsJyMwMEZGRkYnOidBcXVhJywnIzdGRkZENCc6J0FxdWFtYXJpbmUnLCcjRjBGRkZGJzonQXp1cmUnLCcjRjVGNURDJzonQmVpZ2UnLA0KCScjRkZFNEM0JzonQmlzcXVlJywnIzAwMDAwMCc6J0JsYWNrJywnI0ZGRUJDRCc6J0JsYW5jaGVkQWxtb25kJywnIzAwMDBGRic6J0JsdWUnLCcjOEEyQkUyJzonQmx1ZVZpb2xldCcsJyNBNTJBMkEnOidCcm93bicsDQoJJyNERUI4ODcnOidCdXJseVdvb2QnLCcjNUY5RUEwJzonQ2FkZXRCbHVlJywnIzdGRkYwMCc6J0NoYXJ0cmV1c2UnLCcjRDI2OTFFJzonQ2hvY29sYXRlJywnI0ZGN0Y1MCc6J0NvcmFsJywnIzY0OTVFRCc6J0Nvcm5mbG93ZXJCbHVlJywNCgknI0ZGRjhEQyc6J0Nvcm5zaWxrJywnI0RDMTQzQyc6J0NyaW1zb24nLCcjMDBGRkZGJzonQ3lhbicsJyMwMDAwOEInOidEYXJrQmx1ZScsJyMwMDhCOEInOidEYXJrQ3lhbicsJyNCODg2MEInOidEYXJrR29sZGVuUm9kJywNCgknI0E5QTlBOSc6J0RhcmtHcmF5JywnI0E5QTlBOSc6J0RhcmtHcmV5JywnIzAwNjQwMCc6J0RhcmtHcmVlbicsJyNCREI3NkInOidEYXJrS2hha2knLCcjOEIwMDhCJzonRGFya01hZ2VudGEnLCcjNTU2QjJGJzonRGFya09saXZlR3JlZW4nLA0KCScjRkY4QzAwJzonRGFya29yYW5nZScsJyM5OTMyQ0MnOidEYXJrT3JjaGlkJywnIzhCMDAwMCc6J0RhcmtSZWQnLCcjRTk5NjdBJzonRGFya1NhbG1vbicsJyM4RkJDOEYnOidEYXJrU2VhR3JlZW4nLCcjNDgzRDhCJzonRGFya1NsYXRlQmx1ZScsDQoJJyMyRjRGNEYnOidEYXJrU2xhdGVHcmF5JywnIzJGNEY0Ric6J0RhcmtTbGF0ZUdyZXknLCcjMDBDRUQxJzonRGFya1R1cnF1b2lzZScsJyM5NDAwRDMnOidEYXJrVmlvbGV0JywnI0ZGMTQ5Myc6J0RlZXBQaW5rJywnIzAwQkZGRic6J0RlZXBTa3lCbHVlJywNCgknIzY5Njk2OSc6J0RpbUdyYXknLCcjNjk2OTY5JzonRGltR3JleScsJyMxRTkwRkYnOidEb2RnZXJCbHVlJywnI0IyMjIyMic6J0ZpcmVCcmljaycsJyNGRkZBRjAnOidGbG9yYWxXaGl0ZScsJyMyMjhCMjInOidGb3Jlc3RHcmVlbicsDQoJJyNGRjAwRkYnOidGdWNoc2lhJywnI0RDRENEQyc6J0dhaW5zYm9ybycsJyNGOEY4RkYnOidHaG9zdFdoaXRlJywnI0ZGRDcwMCc6J0dvbGQnLCcjREFBNTIwJzonR29sZGVuUm9kJywnIzgwODA4MCc6J0dyYXknLCcjODA4MDgwJzonR3JleScsDQoJJyMwMDgwMDAnOidHcmVlbicsJyNBREZGMkYnOidHcmVlblllbGxvdycsJyNGMEZGRjAnOidIb25leURldycsJyNGRjY5QjQnOidIb3RQaW5rJywnI0NENUM1Qyc6J0luZGlhblJlZCcsJyM0QjAwODInOidJbmRpZ28nLCcjRkZGRkYwJzonSXZvcnknLA0KCScjRjBFNjhDJzonS2hha2knLCcjRTZFNkZBJzonTGF2ZW5kZXInLCcjRkZGMEY1JzonTGF2ZW5kZXJCbHVzaCcsJyM3Q0ZDMDAnOidMYXduR3JlZW4nLCcjRkZGQUNEJzonTGVtb25DaGlmZm9uJywnI0FERDhFNic6J0xpZ2h0Qmx1ZScsDQoJJyNGMDgwODAnOidMaWdodENvcmFsJywnI0UwRkZGRic6J0xpZ2h0Q3lhbicsJyNGQUZBRDInOidMaWdodEdvbGRlblJvZFllbGxvdycsJyNEM0QzRDMnOidMaWdodEdyYXknLCcjRDNEM0QzJzonTGlnaHRHcmV5JywnIzkwRUU5MCc6J0xpZ2h0R3JlZW4nLA0KCScjRkZCNkMxJzonTGlnaHRQaW5rJywnI0ZGQTA3QSc6J0xpZ2h0U2FsbW9uJywnIzIwQjJBQSc6J0xpZ2h0U2VhR3JlZW4nLCcjODdDRUZBJzonTGlnaHRTa3lCbHVlJywnIzc3ODg5OSc6J0xpZ2h0U2xhdGVHcmF5JywnIzc3ODg5OSc6J0xpZ2h0U2xhdGVHcmV5JywNCgknI0IwQzRERSc6J0xpZ2h0U3RlZWxCbHVlJywnI0ZGRkZFMCc6J0xpZ2h0WWVsbG93JywnIzAwRkYwMCc6J0xpbWUnLCcjMzJDRDMyJzonTGltZUdyZWVuJywnI0ZBRjBFNic6J0xpbmVuJywnI0ZGMDBGRic6J01hZ2VudGEnLCcjODAwMDAwJzonTWFyb29uJywNCgknIzY2Q0RBQSc6J01lZGl1bUFxdWFNYXJpbmUnLCcjMDAwMENEJzonTWVkaXVtQmx1ZScsJyNCQTU1RDMnOidNZWRpdW1PcmNoaWQnLCcjOTM3MEQ4JzonTWVkaXVtUHVycGxlJywnIzNDQjM3MSc6J01lZGl1bVNlYUdyZWVuJywnIzdCNjhFRSc6J01lZGl1bVNsYXRlQmx1ZScsDQoJJyMwMEZBOUEnOidNZWRpdW1TcHJpbmdHcmVlbicsJyM0OEQxQ0MnOidNZWRpdW1UdXJxdW9pc2UnLCcjQzcxNTg1JzonTWVkaXVtVmlvbGV0UmVkJywnIzE5MTk3MCc6J01pZG5pZ2h0Qmx1ZScsJyNGNUZGRkEnOidNaW50Q3JlYW0nLCcjRkZFNEUxJzonTWlzdHlSb3NlJywnI0ZGRTRCNSc6J01vY2Nhc2luJywNCgknI0ZGREVBRCc6J05hdmFqb1doaXRlJywnIzAwMDA4MCc6J05hdnknLCcjRkRGNUU2JzonT2xkTGFjZScsJyM4MDgwMDAnOidPbGl2ZScsJyM2QjhFMjMnOidPbGl2ZURyYWInLCcjRkZBNTAwJzonT3JhbmdlJywnI0ZGNDUwMCc6J09yYW5nZVJlZCcsJyNEQTcwRDYnOidPcmNoaWQnLA0KCScjRUVFOEFBJzonUGFsZUdvbGRlblJvZCcsJyM5OEZCOTgnOidQYWxlR3JlZW4nLCcjQUZFRUVFJzonUGFsZVR1cnF1b2lzZScsJyNEODcwOTMnOidQYWxlVmlvbGV0UmVkJywnI0ZGRUZENSc6J1BhcGF5YVdoaXAnLCcjRkZEQUI5JzonUGVhY2hQdWZmJywNCgknI0NEODUzRic6J1BlcnUnLCcjRkZDMENCJzonUGluaycsJyNEREEwREQnOidQbHVtJywnI0IwRTBFNic6J1Bvd2RlckJsdWUnLCcjODAwMDgwJzonUHVycGxlJywnI0ZGMDAwMCc6J1JlZCcsJyNCQzhGOEYnOidSb3N5QnJvd24nLCcjNDE2OUUxJzonUm95YWxCbHVlJywNCgknIzhCNDUxMyc6J1NhZGRsZUJyb3duJywnI0ZBODA3Mic6J1NhbG1vbicsJyNGNEE0NjAnOidTYW5keUJyb3duJywnIzJFOEI1Nyc6J1NlYUdyZWVuJywnI0ZGRjVFRSc6J1NlYVNoZWxsJywnI0EwNTIyRCc6J1NpZW5uYScsJyNDMEMwQzAnOidTaWx2ZXInLA0KCScjODdDRUVCJzonU2t5Qmx1ZScsJyM2QTVBQ0QnOidTbGF0ZUJsdWUnLCcjNzA4MDkwJzonU2xhdGVHcmF5JywnIzcwODA5MCc6J1NsYXRlR3JleScsJyNGRkZBRkEnOidTbm93JywnIzAwRkY3Ric6J1NwcmluZ0dyZWVuJywNCgknIzQ2ODJCNCc6J1N0ZWVsQmx1ZScsJyNEMkI0OEMnOidUYW4nLCcjMDA4MDgwJzonVGVhbCcsJyNEOEJGRDgnOidUaGlzdGxlJywnI0ZGNjM0Nyc6J1RvbWF0bycsJyM0MEUwRDAnOidUdXJxdW9pc2UnLCcjRUU4MkVFJzonVmlvbGV0JywNCgknI0Y1REVCMyc6J1doZWF0JywnI0ZGRkZGRic6J1doaXRlJywnI0Y1RjVGNSc6J1doaXRlU21va2UnLCcjRkZGRjAwJzonWWVsbG93JywnIzlBQ0QzMic6J1llbGxvd0dyZWVuJw0KfTsNCg0KZnVuY3Rpb24gaW5pdCgpIHsNCgl2YXIgaW5wdXRDb2xvciA9IGNvbnZlcnRSR0JUb0hleCh0aW55TUNFUG9wdXAuZ2V0V2luZG93QXJnKCdpbnB1dF9jb2xvcicpKTsNCg0KCXRpbnlNQ0VQb3B1cC5yZXNpemVUb0lubmVyU2l6ZSgpOw0KDQoJZ2VuZXJhdGVQaWNrZXIoKTsNCg0KCWlmIChpbnB1dENvbG9yKSB7DQoJCWNoYW5nZUZpbmFsQ29sb3IoaW5wdXRDb2xvcik7DQoNCgkJY29sID0gY29udmVydEhleFRvUkdCKGlucHV0Q29sb3IpOw0KDQoJCWlmIChjb2wpDQoJCQl1cGRhdGVMaWdodChjb2wuciwgY29sLmcsIGNvbC5iKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIGluc2VydEFjdGlvbigpIHsNCgl2YXIgY29sb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29sb3IiKS52YWx1ZSwgZiA9IHRpbnlNQ0VQb3B1cC5nZXRXaW5kb3dBcmcoJ2Z1bmMnKTsNCg0KCXRpbnlNQ0VQb3B1cC5yZXN0b3JlU2VsZWN0aW9uKCk7DQoNCglpZiAoZikNCgkJZihjb2xvcik7DQoNCgl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCn0NCg0KZnVuY3Rpb24gc2hvd0NvbG9yKGNvbG9yLCBuYW1lKSB7DQoJaWYgKG5hbWUpDQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2xvcm5hbWUiKS5pbm5lckhUTUwgPSBuYW1lOw0KDQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByZXZpZXciKS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29sb3IiKS52YWx1ZSA9IGNvbG9yLnRvTG93ZXJDYXNlKCk7DQp9DQoNCmZ1bmN0aW9uIGNvbnZlcnRSR0JUb0hleChjb2wpIHsNCgl2YXIgcmUgPSBuZXcgUmVnRXhwKCJyZ2JcXHMqXFwoXFxzKihbMC05XSspLiosXFxzKihbMC05XSspLiosXFxzKihbMC05XSspLipcXCkiLCAiZ2kiKTsNCg0KCWlmICghY29sKQ0KCQlyZXR1cm4gY29sOw0KDQoJdmFyIHJnYiA9IGNvbC5yZXBsYWNlKHJlLCAiJDEsJDIsJDMiKS5zcGxpdCgnLCcpOw0KCWlmIChyZ2IubGVuZ3RoID09IDMpIHsNCgkJciA9IHBhcnNlSW50KHJnYlswXSkudG9TdHJpbmcoMTYpOw0KCQlnID0gcGFyc2VJbnQocmdiWzFdKS50b1N0cmluZygxNik7DQoJCWIgPSBwYXJzZUludChyZ2JbMl0pLnRvU3RyaW5nKDE2KTsNCg0KCQlyID0gci5sZW5ndGggPT0gMSA/ICcwJyArIHIgOiByOw0KCQlnID0gZy5sZW5ndGggPT0gMSA/ICcwJyArIGcgOiBnOw0KCQliID0gYi5sZW5ndGggPT0gMSA/ICcwJyArIGIgOiBiOw0KDQoJCXJldHVybiAiIyIgKyByICsgZyArIGI7DQoJfQ0KDQoJcmV0dXJuIGNvbDsNCn0NCg0KZnVuY3Rpb24gY29udmVydEhleFRvUkdCKGNvbCkgew0KCWlmIChjb2wuaW5kZXhPZignIycpICE9IC0xKSB7DQoJCWNvbCA9IGNvbC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1teMC05QS1GXScsICdnaScpLCAnJyk7DQoNCgkJciA9IHBhcnNlSW50KGNvbC5zdWJzdHJpbmcoMCwgMiksIDE2KTsNCgkJZyA9IHBhcnNlSW50KGNvbC5zdWJzdHJpbmcoMiwgNCksIDE2KTsNCgkJYiA9IHBhcnNlSW50KGNvbC5zdWJzdHJpbmcoNCwgNiksIDE2KTsNCg0KCQlyZXR1cm4ge3IgOiByLCBnIDogZywgYiA6IGJ9Ow0KCX0NCg0KCXJldHVybiBudWxsOw0KfQ0KDQpmdW5jdGlvbiBnZW5lcmF0ZVBpY2tlcigpIHsNCgl2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlnaHQnKSwgaCA9ICcnLCBpOw0KDQoJZm9yIChpID0gMDsgaSA8IGRldGFpbDsgaSsrKXsNCgkJaCArPSAnPGRpdiBpZD0iZ3MnK2krJyIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzAwMDAwMDsgd2lkdGg6MTVweDsgaGVpZ2h0OjNweDsgYm9yZGVyLXN0eWxlOm5vbmU7IGJvcmRlci13aWR0aDowcHg7IicNCgkJKyAnIG9uY2xpY2s9ImNoYW5nZUZpbmFsQ29sb3IodGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIicNCgkJKyAnIG9ubW91c2Vkb3duPSJpc01vdXNlRG93biA9IHRydWU7IHJldHVybiBmYWxzZTsiJw0KCQkrICcgb25tb3VzZXVwPSJpc01vdXNlRG93biA9IGZhbHNlOyInDQoJCSsgJyBvbm1vdXNlbW92ZT0iaWYgKGlzTW91c2VEb3duICYmIGlzTW91c2VPdmVyKSBjaGFuZ2VGaW5hbENvbG9yKHRoaXMuc3R5bGUuYmFja2dyb3VuZENvbG9yKTsgcmV0dXJuIGZhbHNlOyInDQoJCSsgJyBvbm1vdXNlb3Zlcj0iaXNNb3VzZU92ZXIgPSB0cnVlOyInDQoJCSsgJyBvbm1vdXNlb3V0PSJpc01vdXNlT3ZlciA9IGZhbHNlOyInDQoJCSsgJz48L2Rpdj4nOw0KCX0NCg0KCWVsLmlubmVySFRNTCA9IGg7DQp9DQoNCmZ1bmN0aW9uIGdlbmVyYXRlV2ViQ29sb3JzKCkgew0KCXZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWJjb2xvcnMnKSwgaCA9ICcnLCBpOw0KDQoJaWYgKGVsLmNsYXNzTmFtZSA9PSAnZ2VuZXJhdGVkJykNCgkJcmV0dXJuOw0KDQoJaCArPSAnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIj4nDQoJCSsgJzx0cj4nOw0KDQoJZm9yIChpPTA7IGk8Y29sb3JzLmxlbmd0aDsgaSsrKSB7DQoJCWggKz0gJzx0ZCBiZ2NvbG9yPSInICsgY29sb3JzW2ldICsgJyIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIj4nDQoJCQkrICc8YSBocmVmPSJqYXZhc2NyaXB0Omluc2VydEFjdGlvbigpOyIgb25mb2N1cz0ic2hvd0NvbG9yKFwnJyArIGNvbG9yc1tpXSArICAnXCcpOyIgb25tb3VzZW92ZXI9InNob3dDb2xvcihcJycgKyBjb2xvcnNbaV0gKyAgJ1wnKTsiIHN0eWxlPSJkaXNwbGF5OmJsb2NrO3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7b3ZlcmZsb3c6aGlkZGVuOyI+Jw0KCQkJKyAnPC9hPjwvdGQ+JzsNCgkJaWYgKChpKzEpICUgMTggPT0gMCkNCgkJCWggKz0gJzwvdHI+PHRyPic7DQoJfQ0KDQoJaCArPSAnPC90YWJsZT4nOw0KDQoJZWwuaW5uZXJIVE1MID0gaDsNCgllbC5jbGFzc05hbWUgPSAnZ2VuZXJhdGVkJzsNCn0NCg0KZnVuY3Rpb24gZ2VuZXJhdGVOYW1lZENvbG9ycygpIHsNCgl2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmFtZWRjb2xvcnMnKSwgaCA9ICcnLCBuLCB2LCBpID0gMDsNCg0KCWlmIChlbC5jbGFzc05hbWUgPT0gJ2dlbmVyYXRlZCcpDQoJCXJldHVybjsNCg0KCWZvciAobiBpbiBuYW1lZCkgew0KCQl2ID0gbmFtZWRbbl07DQoJCWggKz0gJzxhIGhyZWY9ImphdmFzY3JpcHQ6aW5zZXJ0QWN0aW9uKCk7IiBvbm1vdXNlb3Zlcj0ic2hvd0NvbG9yKFwnJyArIG4gKyAgJ1wnLFwnJyArIHYgKyAnXCcpOyIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICcgKyBuICsgJyI+PCEtLSBJRSAtLT48L2E+Jw0KCX0NCg0KCWVsLmlubmVySFRNTCA9IGg7DQoJZWwuY2xhc3NOYW1lID0gJ2dlbmVyYXRlZCc7DQp9DQoNCmZ1bmN0aW9uIGRlY2hleChuKSB7DQoJcmV0dXJuIHN0cmhleC5jaGFyQXQoTWF0aC5mbG9vcihuIC8gMTYpKSArIHN0cmhleC5jaGFyQXQobiAlIDE2KTsNCn0NCg0KZnVuY3Rpb24gY29tcHV0ZUNvbG9yKGUpIHsNCgl2YXIgeCwgeSwgcGFydFdpZHRoLCBwYXJ0RGV0YWlsLCBpbUhlaWdodCwgciwgZywgYiwgY29lZiwgaSwgZmluYWxDb2VmLCBmaW5hbFIsIGZpbmFsRywgZmluYWxCOw0KDQoJeCA9IGUub2Zmc2V0WCA/IGUub2Zmc2V0WCA6IChlLnRhcmdldCA/IGUuY2xpZW50WCAtIGUudGFyZ2V0LnggOiAwKTsNCgl5ID0gZS5vZmZzZXRZID8gZS5vZmZzZXRZIDogKGUudGFyZ2V0ID8gZS5jbGllbnRZIC0gZS50YXJnZXQueSA6IDApOw0KDQoJcGFydFdpZHRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbG9ycycpLndpZHRoIC8gNjsNCglwYXJ0RGV0YWlsID0gZGV0YWlsIC8gMjsNCglpbUhlaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xvcnMnKS5oZWlnaHQ7DQoNCglyID0gKHggPj0gMCkqKHggPCBwYXJ0V2lkdGgpKjI1NSArICh4ID49IHBhcnRXaWR0aCkqKHggPCAyKnBhcnRXaWR0aCkqKDIqMjU1IC0geCAqIDI1NSAvIHBhcnRXaWR0aCkgKyAoeCA+PSA0KnBhcnRXaWR0aCkqKHggPCA1KnBhcnRXaWR0aCkqKC00KjI1NSArIHggKiAyNTUgLyBwYXJ0V2lkdGgpICsgKHggPj0gNSpwYXJ0V2lkdGgpKih4IDwgNipwYXJ0V2lkdGgpKjI1NTsNCglnID0gKHggPj0gMCkqKHggPCBwYXJ0V2lkdGgpKih4ICogMjU1IC8gcGFydFdpZHRoKSArICh4ID49IHBhcnRXaWR0aCkqKHggPCAzKnBhcnRXaWR0aCkqMjU1CSsgKHggPj0gMypwYXJ0V2lkdGgpKih4IDwgNCpwYXJ0V2lkdGgpKig0KjI1NSAtIHggKiAyNTUgLyBwYXJ0V2lkdGgpOw0KCWIgPSAoeCA+PSAyKnBhcnRXaWR0aCkqKHggPCAzKnBhcnRXaWR0aCkqKC0yKjI1NSArIHggKiAyNTUgLyBwYXJ0V2lkdGgpICsgKHggPj0gMypwYXJ0V2lkdGgpKih4IDwgNSpwYXJ0V2lkdGgpKjI1NSArICh4ID49IDUqcGFydFdpZHRoKSooeCA8IDYqcGFydFdpZHRoKSooNioyNTUgLSB4ICogMjU1IC8gcGFydFdpZHRoKTsNCg0KCWNvZWYgPSAoaW1IZWlnaHQgLSB5KSAvIGltSGVpZ2h0Ow0KCXIgPSAxMjggKyAociAtIDEyOCkgKiBjb2VmOw0KCWcgPSAxMjggKyAoZyAtIDEyOCkgKiBjb2VmOw0KCWIgPSAxMjggKyAoYiAtIDEyOCkgKiBjb2VmOw0KDQoJY2hhbmdlRmluYWxDb2xvcignIycgKyBkZWNoZXgocikgKyBkZWNoZXgoZykgKyBkZWNoZXgoYikpOw0KCXVwZGF0ZUxpZ2h0KHIsIGcsIGIpOw0KfQ0KDQpmdW5jdGlvbiB1cGRhdGVMaWdodChyLCBnLCBiKSB7DQoJdmFyIGksIHBhcnREZXRhaWwgPSBkZXRhaWwgLyAyLCBmaW5hbENvZWYsIGZpbmFsUiwgZmluYWxHLCBmaW5hbEIsIGNvbG9yOw0KDQoJZm9yIChpPTA7IGk8ZGV0YWlsOyBpKyspIHsNCgkJaWYgKChpPj0wKSAmJiAoaTxwYXJ0RGV0YWlsKSkgew0KCQkJZmluYWxDb2VmID0gaSAvIHBhcnREZXRhaWw7DQoJCQlmaW5hbFIgPSBkZWNoZXgoMjU1IC0gKDI1NSAtIHIpICogZmluYWxDb2VmKTsNCgkJCWZpbmFsRyA9IGRlY2hleCgyNTUgLSAoMjU1IC0gZykgKiBmaW5hbENvZWYpOw0KCQkJZmluYWxCID0gZGVjaGV4KDI1NSAtICgyNTUgLSBiKSAqIGZpbmFsQ29lZik7DQoJCX0gZWxzZSB7DQoJCQlmaW5hbENvZWYgPSAyIC0gaSAvIHBhcnREZXRhaWw7DQoJCQlmaW5hbFIgPSBkZWNoZXgociAqIGZpbmFsQ29lZik7DQoJCQlmaW5hbEcgPSBkZWNoZXgoZyAqIGZpbmFsQ29lZik7DQoJCQlmaW5hbEIgPSBkZWNoZXgoYiAqIGZpbmFsQ29lZik7DQoJCX0NCg0KCQljb2xvciA9IGZpbmFsUiArIGZpbmFsRyArIGZpbmFsQjsNCg0KCQlzZXRDb2woJ2dzJyArIGksICcjJytjb2xvcik7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBjaGFuZ2VGaW5hbENvbG9yKGNvbG9yKSB7DQoJaWYgKGNvbG9yLmluZGV4T2YoJyMnKSA9PSAtMSkNCgkJY29sb3IgPSBjb252ZXJ0UkdCVG9IZXgoY29sb3IpOw0KDQoJc2V0Q29sKCdwcmV2aWV3JywgY29sb3IpOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xvcicpLnZhbHVlID0gY29sb3I7DQp9DQoNCmZ1bmN0aW9uIHNldENvbChlLCBjKSB7DQoJdHJ5IHsNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYzsNCgl9IGNhdGNoIChleCkgew0KCQkvLyBJZ25vcmUgSUUgd2FybmluZw0KCX0NCn0NCg0KdGlueU1DRVBvcHVwLm9uSW5pdC5hZGQoaW5pdCk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/js/image.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIEltYWdlRGlhbG9nID0gew0KCXByZUluaXQgOiBmdW5jdGlvbigpIHsNCgkJdmFyIHVybDsNCg0KCQl0aW55TUNFUG9wdXAucmVxdWlyZUxhbmdQYWNrKCk7DQoNCgkJaWYgKHVybCA9IHRpbnlNQ0VQb3B1cC5nZXRQYXJhbSgiZXh0ZXJuYWxfaW1hZ2VfbGlzdF91cmwiKSkNCgkJCWRvY3VtZW50LndyaXRlKCc8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyArIHRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUodXJsKSArICciPjwvc2NyaXB0PicpOw0KCX0sDQoNCglpbml0IDogZnVuY3Rpb24oKSB7DQoJCXZhciBmID0gZG9jdW1lbnQuZm9ybXNbMF0sIGVkID0gdGlueU1DRVBvcHVwLmVkaXRvcjsNCg0KCQkvLyBTZXR1cCBicm93c2UgYnV0dG9uDQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcmNicm93c2VyY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0QnJvd3NlckhUTUwoJ3NyY2Jyb3dzZXInLCdzcmMnLCdpbWFnZScsJ3RoZW1lX2FkdmFuY2VkX2ltYWdlJyk7DQoJCWlmIChpc1Zpc2libGUoJ3NyY2Jyb3dzZXInKSkNCgkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcmMnKS5zdHlsZS53aWR0aCA9ICcxODBweCc7DQoNCgkJZSA9IGVkLnNlbGVjdGlvbi5nZXROb2RlKCk7DQoNCgkJdGhpcy5maWxsRmlsZUxpc3QoJ2ltYWdlX2xpc3QnLCAndGlueU1DRUltYWdlTGlzdCcpOw0KDQoJCWlmIChlLm5vZGVOYW1lID09ICdJTUcnKSB7DQoJCQlmLnNyYy52YWx1ZSA9IGVkLmRvbS5nZXRBdHRyaWIoZSwgJ3NyYycpOw0KCQkJZi5hbHQudmFsdWUgPSBlZC5kb20uZ2V0QXR0cmliKGUsICdhbHQnKTsNCgkJCWYuYm9yZGVyLnZhbHVlID0gdGhpcy5nZXRBdHRyaWIoZSwgJ2JvcmRlcicpOw0KCQkJZi52c3BhY2UudmFsdWUgPSB0aGlzLmdldEF0dHJpYihlLCAndnNwYWNlJyk7DQoJCQlmLmhzcGFjZS52YWx1ZSA9IHRoaXMuZ2V0QXR0cmliKGUsICdoc3BhY2UnKTsNCgkJCWYud2lkdGgudmFsdWUgPSBlZC5kb20uZ2V0QXR0cmliKGUsICd3aWR0aCcpOw0KCQkJZi5oZWlnaHQudmFsdWUgPSBlZC5kb20uZ2V0QXR0cmliKGUsICdoZWlnaHQnKTsNCgkJCWYuaW5zZXJ0LnZhbHVlID0gZWQuZ2V0TGFuZygndXBkYXRlJyk7DQoJCQl0aGlzLnN0eWxlVmFsID0gZWQuZG9tLmdldEF0dHJpYihlLCAnc3R5bGUnKTsNCgkJCXNlbGVjdEJ5VmFsdWUoZiwgJ2ltYWdlX2xpc3QnLCBmLnNyYy52YWx1ZSk7DQoJCQlzZWxlY3RCeVZhbHVlKGYsICdhbGlnbicsIHRoaXMuZ2V0QXR0cmliKGUsICdhbGlnbicpKTsNCgkJCXRoaXMudXBkYXRlU3R5bGUoKTsNCgkJfQ0KCX0sDQoNCglmaWxsRmlsZUxpc3QgOiBmdW5jdGlvbihpZCwgbCkgew0KCQl2YXIgZG9tID0gdGlueU1DRVBvcHVwLmRvbSwgbHN0ID0gZG9tLmdldChpZCksIHYsIGNsOw0KDQoJCWwgPSB3aW5kb3dbbF07DQoNCgkJaWYgKGwgJiYgbC5sZW5ndGggPiAwKSB7DQoJCQlsc3Qub3B0aW9uc1tsc3Qub3B0aW9ucy5sZW5ndGhdID0gbmV3IE9wdGlvbignJywgJycpOw0KDQoJCQl0aW55bWNlLmVhY2gobCwgZnVuY3Rpb24obykgew0KCQkJCWxzdC5vcHRpb25zW2xzdC5vcHRpb25zLmxlbmd0aF0gPSBuZXcgT3B0aW9uKG9bMF0sIG9bMV0pOw0KCQkJfSk7DQoJCX0gZWxzZQ0KCQkJZG9tLnJlbW92ZShkb20uZ2V0UGFyZW50KGlkLCAndHInKSk7DQoJfSwNCg0KCXVwZGF0ZSA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgZiA9IGRvY3VtZW50LmZvcm1zWzBdLCBubCA9IGYuZWxlbWVudHMsIGVkID0gdGlueU1DRVBvcHVwLmVkaXRvciwgYXJncyA9IHt9LCBlbDsNCg0KCQl0aW55TUNFUG9wdXAucmVzdG9yZVNlbGVjdGlvbigpOw0KDQoJCWlmIChmLnNyYy52YWx1ZSA9PT0gJycpIHsNCgkJCWlmIChlZC5zZWxlY3Rpb24uZ2V0Tm9kZSgpLm5vZGVOYW1lID09ICdJTUcnKSB7DQoJCQkJZWQuZG9tLnJlbW92ZShlZC5zZWxlY3Rpb24uZ2V0Tm9kZSgpKTsNCgkJCQllZC5leGVjQ29tbWFuZCgnbWNlUmVwYWludCcpOw0KCQkJfQ0KDQoJCQl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCWlmICghZWQuc2V0dGluZ3MuaW5saW5lX3N0eWxlcykgew0KCQkJYXJncyA9IHRpbnltY2UuZXh0ZW5kKGFyZ3MsIHsNCgkJCQl2c3BhY2UgOiBubC52c3BhY2UudmFsdWUsDQoJCQkJaHNwYWNlIDogbmwuaHNwYWNlLnZhbHVlLA0KCQkJCWJvcmRlciA6IG5sLmJvcmRlci52YWx1ZSwNCgkJCQlhbGlnbiA6IGdldFNlbGVjdFZhbHVlKGYsICdhbGlnbicpDQoJCQl9KTsNCgkJfSBlbHNlDQoJCQlhcmdzLnN0eWxlID0gdGhpcy5zdHlsZVZhbDsNCg0KCQl0aW55bWNlLmV4dGVuZChhcmdzLCB7DQoJCQlzcmMgOiBmLnNyYy52YWx1ZSwNCgkJCWFsdCA6IGYuYWx0LnZhbHVlLA0KCQkJd2lkdGggOiBmLndpZHRoLnZhbHVlLA0KCQkJaGVpZ2h0IDogZi5oZWlnaHQudmFsdWUNCgkJfSk7DQoNCgkJZWwgPSBlZC5zZWxlY3Rpb24uZ2V0Tm9kZSgpOw0KDQoJCWlmIChlbCAmJiBlbC5ub2RlTmFtZSA9PSAnSU1HJykgew0KCQkJZWQuZG9tLnNldEF0dHJpYnMoZWwsIGFyZ3MpOw0KCQl9IGVsc2Ugew0KCQkJZWQuZXhlY0NvbW1hbmQoJ21jZUluc2VydENvbnRlbnQnLCBmYWxzZSwgJzxpbWcgaWQ9Il9fbWNlX3RtcCIgLz4nLCB7c2tpcF91bmRvIDogMX0pOw0KCQkJZWQuZG9tLnNldEF0dHJpYnMoJ19fbWNlX3RtcCcsIGFyZ3MpOw0KCQkJZWQuZG9tLnNldEF0dHJpYignX19tY2VfdG1wJywgJ2lkJywgJycpOw0KCQkJZWQudW5kb01hbmFnZXIuYWRkKCk7DQoJCX0NCg0KCQl0aW55TUNFUG9wdXAuY2xvc2UoKTsNCgl9LA0KDQoJdXBkYXRlU3R5bGUgOiBmdW5jdGlvbigpIHsNCgkJdmFyIGRvbSA9IHRpbnlNQ0VQb3B1cC5kb20sIHN0LCB2LCBmID0gZG9jdW1lbnQuZm9ybXNbMF07DQoNCgkJaWYgKHRpbnlNQ0VQb3B1cC5lZGl0b3Iuc2V0dGluZ3MuaW5saW5lX3N0eWxlcykgew0KCQkJc3QgPSB0aW55TUNFUG9wdXAuZG9tLnBhcnNlU3R5bGUodGhpcy5zdHlsZVZhbCk7DQoNCgkJCS8vIEhhbmRsZSBhbGlnbg0KCQkJdiA9IGdldFNlbGVjdFZhbHVlKGYsICdhbGlnbicpOw0KCQkJaWYgKHYpIHsNCgkJCQlpZiAodiA9PSAnbGVmdCcgfHwgdiA9PSAncmlnaHQnKSB7DQoJCQkJCXN0WydmbG9hdCddID0gdjsNCgkJCQkJZGVsZXRlIHN0Wyd2ZXJ0aWNhbC1hbGlnbiddOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXN0Wyd2ZXJ0aWNhbC1hbGlnbiddID0gdjsNCgkJCQkJZGVsZXRlIHN0WydmbG9hdCddOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZGVsZXRlIHN0WydmbG9hdCddOw0KCQkJCWRlbGV0ZSBzdFsndmVydGljYWwtYWxpZ24nXTsNCgkJCX0NCg0KCQkJLy8gSGFuZGxlIGJvcmRlcg0KCQkJdiA9IGYuYm9yZGVyLnZhbHVlOw0KCQkJaWYgKHYgfHwgdiA9PSAnMCcpIHsNCgkJCQlpZiAodiA9PSAnMCcpDQoJCQkJCXN0Wydib3JkZXInXSA9ICcwJzsNCgkJCQllbHNlDQoJCQkJCXN0Wydib3JkZXInXSA9IHYgKyAncHggc29saWQgYmxhY2snOw0KCQkJfSBlbHNlDQoJCQkJZGVsZXRlIHN0Wydib3JkZXInXTsNCg0KCQkJLy8gSGFuZGxlIGhzcGFjZQ0KCQkJdiA9IGYuaHNwYWNlLnZhbHVlOw0KCQkJaWYgKHYpIHsNCgkJCQlkZWxldGUgc3RbJ21hcmdpbiddOw0KCQkJCXN0WydtYXJnaW4tbGVmdCddID0gdiArICdweCc7DQoJCQkJc3RbJ21hcmdpbi1yaWdodCddID0gdiArICdweCc7DQoJCQl9IGVsc2Ugew0KCQkJCWRlbGV0ZSBzdFsnbWFyZ2luLWxlZnQnXTsNCgkJCQlkZWxldGUgc3RbJ21hcmdpbi1yaWdodCddOw0KCQkJfQ0KDQoJCQkvLyBIYW5kbGUgdnNwYWNlDQoJCQl2ID0gZi52c3BhY2UudmFsdWU7DQoJCQlpZiAodikgew0KCQkJCWRlbGV0ZSBzdFsnbWFyZ2luJ107DQoJCQkJc3RbJ21hcmdpbi10b3AnXSA9IHYgKyAncHgnOw0KCQkJCXN0WydtYXJnaW4tYm90dG9tJ10gPSB2ICsgJ3B4JzsNCgkJCX0gZWxzZSB7DQoJCQkJZGVsZXRlIHN0WydtYXJnaW4tdG9wJ107DQoJCQkJZGVsZXRlIHN0WydtYXJnaW4tYm90dG9tJ107DQoJCQl9DQoNCgkJCS8vIE1lcmdlDQoJCQlzdCA9IHRpbnlNQ0VQb3B1cC5kb20ucGFyc2VTdHlsZShkb20uc2VyaWFsaXplU3R5bGUoc3QpLCAnaW1nJyk7DQoJCQl0aGlzLnN0eWxlVmFsID0gZG9tLnNlcmlhbGl6ZVN0eWxlKHN0LCAnaW1nJyk7DQoJCX0NCgl9LA0KDQoJZ2V0QXR0cmliIDogZnVuY3Rpb24oZSwgYXQpIHsNCgkJdmFyIGVkID0gdGlueU1DRVBvcHVwLmVkaXRvciwgZG9tID0gZWQuZG9tLCB2LCB2MjsNCg0KCQlpZiAoZWQuc2V0dGluZ3MuaW5saW5lX3N0eWxlcykgew0KCQkJc3dpdGNoIChhdCkgew0KCQkJCWNhc2UgJ2FsaWduJzoNCgkJCQkJaWYgKHYgPSBkb20uZ2V0U3R5bGUoZSwgJ2Zsb2F0JykpDQoJCQkJCQlyZXR1cm4gdjsNCg0KCQkJCQlpZiAodiA9IGRvbS5nZXRTdHlsZShlLCAndmVydGljYWwtYWxpZ24nKSkNCgkJCQkJCXJldHVybiB2Ow0KDQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAnaHNwYWNlJzoNCgkJCQkJdiA9IGRvbS5nZXRTdHlsZShlLCAnbWFyZ2luLWxlZnQnKQ0KCQkJCQl2MiA9IGRvbS5nZXRTdHlsZShlLCAnbWFyZ2luLXJpZ2h0Jyk7DQoJCQkJCWlmICh2ICYmIHYgPT0gdjIpDQoJCQkJCQlyZXR1cm4gcGFyc2VJbnQodi5yZXBsYWNlKC9bXjAtOV0vZywgJycpKTsNCg0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgJ3ZzcGFjZSc6DQoJCQkJCXYgPSBkb20uZ2V0U3R5bGUoZSwgJ21hcmdpbi10b3AnKQ0KCQkJCQl2MiA9IGRvbS5nZXRTdHlsZShlLCAnbWFyZ2luLWJvdHRvbScpOw0KCQkJCQlpZiAodiAmJiB2ID09IHYyKQ0KCQkJCQkJcmV0dXJuIHBhcnNlSW50KHYucmVwbGFjZSgvW14wLTldL2csICcnKSk7DQoNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlICdib3JkZXInOg0KCQkJCQl2ID0gMDsNCg0KCQkJCQl0aW55bWNlLmVhY2goWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXSwgZnVuY3Rpb24oc3YpIHsNCgkJCQkJCXN2ID0gZG9tLmdldFN0eWxlKGUsICdib3JkZXItJyArIHN2ICsgJy13aWR0aCcpOw0KDQoJCQkJCQkvLyBGYWxzZSBvciBub3QgdGhlIHNhbWUgYXMgcHJldg0KCQkJCQkJaWYgKCFzdiB8fCAoc3YgIT0gdiAmJiB2ICE9PSAwKSkgew0KCQkJCQkJCXYgPSAwOw0KCQkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJCX0NCg0KCQkJCQkJaWYgKHN2KQ0KCQkJCQkJCXYgPSBzdjsNCgkJCQkJfSk7DQoNCgkJCQkJaWYgKHYpDQoJCQkJCQlyZXR1cm4gcGFyc2VJbnQodi5yZXBsYWNlKC9bXjAtOV0vZywgJycpKTsNCg0KCQkJCQlicmVhazsNCgkJCX0NCgkJfQ0KDQoJCWlmICh2ID0gZG9tLmdldEF0dHJpYihlLCBhdCkpDQoJCQlyZXR1cm4gdjsNCg0KCQlyZXR1cm4gJyc7DQoJfSwNCg0KCXJlc2V0SW1hZ2VEYXRhIDogZnVuY3Rpb24oKSB7DQoJCXZhciBmID0gZG9jdW1lbnQuZm9ybXNbMF07DQoNCgkJZi53aWR0aC52YWx1ZSA9IGYuaGVpZ2h0LnZhbHVlID0gIiI7CQ0KCX0sDQoNCgl1cGRhdGVJbWFnZURhdGEgOiBmdW5jdGlvbigpIHsNCgkJdmFyIGYgPSBkb2N1bWVudC5mb3Jtc1swXSwgdCA9IEltYWdlRGlhbG9nOw0KDQoJCWlmIChmLndpZHRoLnZhbHVlID09ICIiKQ0KCQkJZi53aWR0aC52YWx1ZSA9IHQucHJlbG9hZEltZy53aWR0aDsNCg0KCQlpZiAoZi5oZWlnaHQudmFsdWUgPT0gIiIpDQoJCQlmLmhlaWdodC52YWx1ZSA9IHQucHJlbG9hZEltZy5oZWlnaHQ7DQoJfSwNCg0KCWdldEltYWdlRGF0YSA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgZiA9IGRvY3VtZW50LmZvcm1zWzBdOw0KDQoJCXRoaXMucHJlbG9hZEltZyA9IG5ldyBJbWFnZSgpOw0KCQl0aGlzLnByZWxvYWRJbWcub25sb2FkID0gdGhpcy51cGRhdGVJbWFnZURhdGE7DQoJCXRoaXMucHJlbG9hZEltZy5vbmVycm9yID0gdGhpcy5yZXNldEltYWdlRGF0YTsNCgkJdGhpcy5wcmVsb2FkSW1nLnNyYyA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUoZi5zcmMudmFsdWUpOw0KCX0NCn07DQoNCkltYWdlRGlhbG9nLnByZUluaXQoKTsNCnRpbnlNQ0VQb3B1cC5vbkluaXQuYWRkKEltYWdlRGlhbG9nLmluaXQsIEltYWdlRGlhbG9nKTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/js/link.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KDQp2YXIgTGlua0RpYWxvZyA9IHsNCglwcmVJbml0IDogZnVuY3Rpb24oKSB7DQoJCXZhciB1cmw7DQoNCgkJaWYgKHVybCA9IHRpbnlNQ0VQb3B1cC5nZXRQYXJhbSgiZXh0ZXJuYWxfbGlua19saXN0X3VybCIpKQ0KCQkJZG9jdW1lbnQud3JpdGUoJzxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInICsgdGlueU1DRVBvcHVwLmVkaXRvci5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZSh1cmwpICsgJyI+PC9zY3JpcHQ+Jyk7DQoJfSwNCg0KCWluaXQgOiBmdW5jdGlvbigpIHsNCgkJdmFyIGYgPSBkb2N1bWVudC5mb3Jtc1swXSwgZWQgPSB0aW55TUNFUG9wdXAuZWRpdG9yOw0KDQoJCS8vIFNldHVwIGJyb3dzZSBidXR0b24NCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hyZWZicm93c2VyY29udGFpbmVyJykuaW5uZXJIVE1MID0gZ2V0QnJvd3NlckhUTUwoJ2hyZWZicm93c2VyJywgJ2hyZWYnLCAnZmlsZScsICd0aGVtZV9hZHZhbmNlZF9saW5rJyk7DQoJCWlmIChpc1Zpc2libGUoJ2hyZWZicm93c2VyJykpDQoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaHJlZicpLnN0eWxlLndpZHRoID0gJzE4MHB4JzsNCg0KCQl0aGlzLmZpbGxDbGFzc0xpc3QoJ2NsYXNzX2xpc3QnKTsNCgkJdGhpcy5maWxsRmlsZUxpc3QoJ2xpbmtfbGlzdCcsICd0aW55TUNFTGlua0xpc3QnKTsNCgkJdGhpcy5maWxsVGFyZ2V0TGlzdCgndGFyZ2V0X2xpc3QnKTsNCg0KCQlpZiAoZSA9IGVkLmRvbS5nZXRQYXJlbnQoZWQuc2VsZWN0aW9uLmdldE5vZGUoKSwgJ0EnKSkgew0KCQkJZi5ocmVmLnZhbHVlID0gZWQuZG9tLmdldEF0dHJpYihlLCAnaHJlZicpOw0KCQkJZi5saW5rdGl0bGUudmFsdWUgPSBlZC5kb20uZ2V0QXR0cmliKGUsICd0aXRsZScpOw0KCQkJZi5pbnNlcnQudmFsdWUgPSBlZC5nZXRMYW5nKCd1cGRhdGUnKTsNCgkJCXNlbGVjdEJ5VmFsdWUoZiwgJ2xpbmtfbGlzdCcsIGYuaHJlZi52YWx1ZSk7DQoJCQlzZWxlY3RCeVZhbHVlKGYsICd0YXJnZXRfbGlzdCcsIGVkLmRvbS5nZXRBdHRyaWIoZSwgJ3RhcmdldCcpKTsNCgkJCXNlbGVjdEJ5VmFsdWUoZiwgJ2NsYXNzX2xpc3QnLCBlZC5kb20uZ2V0QXR0cmliKGUsICdjbGFzcycpKTsNCgkJfQ0KCX0sDQoNCgl1cGRhdGUgOiBmdW5jdGlvbigpIHsNCgkJdmFyIGYgPSBkb2N1bWVudC5mb3Jtc1swXSwgZWQgPSB0aW55TUNFUG9wdXAuZWRpdG9yLCBlLCBiOw0KDQoJCXRpbnlNQ0VQb3B1cC5yZXN0b3JlU2VsZWN0aW9uKCk7DQoJCWUgPSBlZC5kb20uZ2V0UGFyZW50KGVkLnNlbGVjdGlvbi5nZXROb2RlKCksICdBJyk7DQoNCgkJLy8gUmVtb3ZlIGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gaHJlZg0KCQlpZiAoIWYuaHJlZi52YWx1ZSkgew0KCQkJaWYgKGUpIHsNCgkJCQl0aW55TUNFUG9wdXAuZXhlY0NvbW1hbmQoIm1jZUJlZ2luVW5kb0xldmVsIik7DQoJCQkJYiA9IGVkLnNlbGVjdGlvbi5nZXRCb29rbWFyaygpOw0KCQkJCWVkLmRvbS5yZW1vdmUoZSwgMSk7DQoJCQkJZWQuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGIpOw0KCQkJCXRpbnlNQ0VQb3B1cC5leGVjQ29tbWFuZCgibWNlRW5kVW5kb0xldmVsIik7DQoJCQkJdGlueU1DRVBvcHVwLmNsb3NlKCk7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQl9DQoNCgkJdGlueU1DRVBvcHVwLmV4ZWNDb21tYW5kKCJtY2VCZWdpblVuZG9MZXZlbCIpOw0KDQoJCS8vIENyZWF0ZSBuZXcgYW5jaG9yIGVsZW1lbnRzDQoJCWlmIChlID09IG51bGwpIHsNCgkJCWVkLmdldERvYygpLmV4ZWNDb21tYW5kKCJ1bmxpbmsiLCBmYWxzZSwgbnVsbCk7DQoJCQl0aW55TUNFUG9wdXAuZXhlY0NvbW1hbmQoIkNyZWF0ZUxpbmsiLCBmYWxzZSwgIiNtY2VfdGVtcF91cmwjIiwge3NraXBfdW5kbyA6IDF9KTsNCg0KCQkJdGlueW1jZS5lYWNoKGVkLmRvbS5zZWxlY3QoImEiKSwgZnVuY3Rpb24obikgew0KCQkJCWlmIChlZC5kb20uZ2V0QXR0cmliKG4sICdocmVmJykgPT0gJyNtY2VfdGVtcF91cmwjJykgew0KCQkJCQllID0gbjsNCg0KCQkJCQllZC5kb20uc2V0QXR0cmlicyhlLCB7DQoJCQkJCQlocmVmIDogZi5ocmVmLnZhbHVlLA0KCQkJCQkJdGl0bGUgOiBmLmxpbmt0aXRsZS52YWx1ZSwNCgkJCQkJCXRhcmdldCA6IGYudGFyZ2V0X2xpc3QgPyBnZXRTZWxlY3RWYWx1ZShmLCAidGFyZ2V0X2xpc3QiKSA6IG51bGwsDQoJCQkJCQknY2xhc3MnIDogZi5jbGFzc19saXN0ID8gZ2V0U2VsZWN0VmFsdWUoZiwgImNsYXNzX2xpc3QiKSA6IG51bGwNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0gZWxzZSB7DQoJCQllZC5kb20uc2V0QXR0cmlicyhlLCB7DQoJCQkJaHJlZiA6IGYuaHJlZi52YWx1ZSwNCgkJCQl0aXRsZSA6IGYubGlua3RpdGxlLnZhbHVlLA0KCQkJCXRhcmdldCA6IGYudGFyZ2V0X2xpc3QgPyBnZXRTZWxlY3RWYWx1ZShmLCAidGFyZ2V0X2xpc3QiKSA6IG51bGwsDQoJCQkJJ2NsYXNzJyA6IGYuY2xhc3NfbGlzdCA/IGdldFNlbGVjdFZhbHVlKGYsICJjbGFzc19saXN0IikgOiBudWxsDQoJCQl9KTsNCgkJfQ0KDQoJCS8vIERvbid0IG1vdmUgY2FyZXQgaWYgc2VsZWN0aW9uIHdhcyBpbWFnZQ0KCQlpZiAoZS5jaGlsZE5vZGVzLmxlbmd0aCAhPSAxIHx8IGUuZmlyc3RDaGlsZC5ub2RlTmFtZSAhPSAnSU1HJykgew0KCQkJZWQuZm9jdXMoKTsNCgkJCWVkLnNlbGVjdGlvbi5zZWxlY3QoZSk7DQoJCQllZC5zZWxlY3Rpb24uY29sbGFwc2UoMCk7DQoJCQl0aW55TUNFUG9wdXAuc3RvcmVTZWxlY3Rpb24oKTsNCgkJfQ0KDQoJCXRpbnlNQ0VQb3B1cC5leGVjQ29tbWFuZCgibWNlRW5kVW5kb0xldmVsIik7DQoJCXRpbnlNQ0VQb3B1cC5jbG9zZSgpOw0KCX0sDQoNCgljaGVja1ByZWZpeCA6IGZ1bmN0aW9uKG4pIHsNCgkJaWYgKG4udmFsdWUgJiYgVmFsaWRhdG9yLmlzRW1haWwobikgJiYgIS9eXHMqbWFpbHRvOi9pLnRlc3Qobi52YWx1ZSkgJiYgY29uZmlybSh0aW55TUNFUG9wdXAuZ2V0TGFuZygnYWR2YW5jZWRfZGxnLmxpbmtfaXNfZW1haWwnKSkpDQoJCQluLnZhbHVlID0gJ21haWx0bzonICsgbi52YWx1ZTsNCg0KCQlpZiAoL15ccyp3d3dcLi9pLnRlc3Qobi52YWx1ZSkgJiYgY29uZmlybSh0aW55TUNFUG9wdXAuZ2V0TGFuZygnYWR2YW5jZWRfZGxnLmxpbmtfaXNfZXh0ZXJuYWwnKSkpDQoJCQluLnZhbHVlID0gJ2h0dHA6Ly8nICsgbi52YWx1ZTsNCgl9LA0KDQoJZmlsbEZpbGVMaXN0IDogZnVuY3Rpb24oaWQsIGwpIHsNCgkJdmFyIGRvbSA9IHRpbnlNQ0VQb3B1cC5kb20sIGxzdCA9IGRvbS5nZXQoaWQpLCB2LCBjbDsNCg0KCQlsID0gd2luZG93W2xdOw0KDQoJCWlmIChsICYmIGwubGVuZ3RoID4gMCkgew0KCQkJbHN0Lm9wdGlvbnNbbHN0Lm9wdGlvbnMubGVuZ3RoXSA9IG5ldyBPcHRpb24oJycsICcnKTsNCg0KCQkJdGlueW1jZS5lYWNoKGwsIGZ1bmN0aW9uKG8pIHsNCgkJCQlsc3Qub3B0aW9uc1tsc3Qub3B0aW9ucy5sZW5ndGhdID0gbmV3IE9wdGlvbihvWzBdLCBvWzFdKTsNCgkJCX0pOw0KCQl9IGVsc2UNCgkJCWRvbS5yZW1vdmUoZG9tLmdldFBhcmVudChpZCwgJ3RyJykpOw0KCX0sDQoNCglmaWxsQ2xhc3NMaXN0IDogZnVuY3Rpb24oaWQpIHsNCgkJdmFyIGRvbSA9IHRpbnlNQ0VQb3B1cC5kb20sIGxzdCA9IGRvbS5nZXQoaWQpLCB2LCBjbDsNCg0KCQlpZiAodiA9IHRpbnlNQ0VQb3B1cC5nZXRQYXJhbSgndGhlbWVfYWR2YW5jZWRfc3R5bGVzJykpIHsNCgkJCWNsID0gW107DQoNCgkJCXRpbnltY2UuZWFjaCh2LnNwbGl0KCc7JyksIGZ1bmN0aW9uKHYpIHsNCgkJCQl2YXIgcCA9IHYuc3BsaXQoJz0nKTsNCg0KCQkJCWNsLnB1c2goeyd0aXRsZScgOiBwWzBdLCAnY2xhc3MnIDogcFsxXX0pOw0KCQkJfSk7DQoJCX0gZWxzZQ0KCQkJY2wgPSB0aW55TUNFUG9wdXAuZWRpdG9yLmRvbS5nZXRDbGFzc2VzKCk7DQoNCgkJaWYgKGNsLmxlbmd0aCA+IDApIHsNCgkJCWxzdC5vcHRpb25zW2xzdC5vcHRpb25zLmxlbmd0aF0gPSBuZXcgT3B0aW9uKHRpbnlNQ0VQb3B1cC5nZXRMYW5nKCdub3Rfc2V0JyksICcnKTsNCg0KCQkJdGlueW1jZS5lYWNoKGNsLCBmdW5jdGlvbihvKSB7DQoJCQkJbHN0Lm9wdGlvbnNbbHN0Lm9wdGlvbnMubGVuZ3RoXSA9IG5ldyBPcHRpb24oby50aXRsZSB8fCBvWydjbGFzcyddLCBvWydjbGFzcyddKTsNCgkJCX0pOw0KCQl9IGVsc2UNCgkJCWRvbS5yZW1vdmUoZG9tLmdldFBhcmVudChpZCwgJ3RyJykpOw0KCX0sDQoNCglmaWxsVGFyZ2V0TGlzdCA6IGZ1bmN0aW9uKGlkKSB7DQoJCXZhciBkb20gPSB0aW55TUNFUG9wdXAuZG9tLCBsc3QgPSBkb20uZ2V0KGlkKSwgdjsNCg0KCQlsc3Qub3B0aW9uc1tsc3Qub3B0aW9ucy5sZW5ndGhdID0gbmV3IE9wdGlvbih0aW55TUNFUG9wdXAuZ2V0TGFuZygnbm90X3NldCcpLCAnJyk7DQoJCWxzdC5vcHRpb25zW2xzdC5vcHRpb25zLmxlbmd0aF0gPSBuZXcgT3B0aW9uKHRpbnlNQ0VQb3B1cC5nZXRMYW5nKCdhZHZhbmNlZF9kbGcubGlua190YXJnZXRfc2FtZScpLCAnX3NlbGYnKTsNCgkJbHN0Lm9wdGlvbnNbbHN0Lm9wdGlvbnMubGVuZ3RoXSA9IG5ldyBPcHRpb24odGlueU1DRVBvcHVwLmdldExhbmcoJ2FkdmFuY2VkX2RsZy5saW5rX3RhcmdldF9ibGFuaycpLCAnX2JsYW5rJyk7DQoNCgkJaWYgKHYgPSB0aW55TUNFUG9wdXAuZ2V0UGFyYW0oJ3RoZW1lX2FkdmFuY2VkX2xpbmtfdGFyZ2V0cycpKSB7DQoJCQl0aW55bWNlLmVhY2godi5zcGxpdCgnLCcpLCBmdW5jdGlvbih2KSB7DQoJCQkJdiA9IHYuc3BsaXQoJz0nKTsNCgkJCQlsc3Qub3B0aW9uc1tsc3Qub3B0aW9ucy5sZW5ndGhdID0gbmV3IE9wdGlvbih2WzBdLCB2WzFdKTsNCgkJCX0pOw0KCQl9DQoJfQ0KfTsNCg0KTGlua0RpYWxvZy5wcmVJbml0KCk7DQp0aW55TUNFUG9wdXAub25Jbml0LmFkZChMaW5rRGlhbG9nLmluaXQsIExpbmtEaWFsb2cpOw0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/js/source_editor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRVBvcHVwLnJlcXVpcmVMYW5nUGFjaygpOw0KdGlueU1DRVBvcHVwLm9uSW5pdC5hZGQob25Mb2FkSW5pdCk7DQoNCmZ1bmN0aW9uIHNhdmVDb250ZW50KCkgew0KCXRpbnlNQ0VQb3B1cC5lZGl0b3Iuc2V0Q29udGVudChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaHRtbFNvdXJjZScpLnZhbHVlLCB7c291cmNlX3ZpZXcgOiB0cnVlfSk7DQoJdGlueU1DRVBvcHVwLmNsb3NlKCk7DQp9DQoNCmZ1bmN0aW9uIG9uTG9hZEluaXQoKSB7DQoJdGlueU1DRVBvcHVwLnJlc2l6ZVRvSW5uZXJTaXplKCk7DQoNCgkvLyBSZW1vdmUgR2Vja28gc3BlbGxjaGVja2luZw0KCWlmICh0aW55bWNlLmlzR2Vja28pDQoJCWRvY3VtZW50LmJvZHkuc3BlbGxjaGVjayA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IuZ2V0UGFyYW0oImdlY2tvX3NwZWxsY2hlY2siKTsNCg0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdodG1sU291cmNlJykudmFsdWUgPSB0aW55TUNFUG9wdXAuZWRpdG9yLmdldENvbnRlbnQoe3NvdXJjZV92aWV3IDogdHJ1ZX0pOw0KDQoJaWYgKHRpbnlNQ0VQb3B1cC5lZGl0b3IuZ2V0UGFyYW0oInRoZW1lX2FkdmFuY2VkX3NvdXJjZV9lZGl0b3Jfd3JhcCIsIHRydWUpKSB7DQoJCXNldFdyYXAoJ3NvZnQnKTsNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dyYXBlZCcpLmNoZWNrZWQgPSB0cnVlOw0KCX0NCg0KCXJlc2l6ZUlucHV0cygpOw0KfQ0KDQpmdW5jdGlvbiBzZXRXcmFwKHZhbCkgew0KCXZhciB2LCBuLCBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2h0bWxTb3VyY2UnKTsNCg0KCXMud3JhcCA9IHZhbDsNCg0KCWlmICghdGlueW1jZS5pc0lFKSB7DQoJCXYgPSBzLnZhbHVlOw0KCQluID0gcy5jbG9uZU5vZGUoZmFsc2UpOw0KCQluLnNldEF0dHJpYnV0ZSgid3JhcCIsIHZhbCk7DQoJCXMucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobiwgcyk7DQoJCW4udmFsdWUgPSB2Ow0KCX0NCn0NCg0KZnVuY3Rpb24gdG9nZ2xlV29yZFdyYXAoZWxtKSB7DQoJaWYgKGVsbS5jaGVja2VkKQ0KCQlzZXRXcmFwKCdzb2Z0Jyk7DQoJZWxzZQ0KCQlzZXRXcmFwKCdvZmYnKTsNCn0NCg0KZnVuY3Rpb24gcmVzaXplSW5wdXRzKCkgew0KCXZhciB2cCA9IHRpbnlNQ0VQb3B1cC5kb20uZ2V0Vmlld1BvcnQod2luZG93KSwgZWw7DQoNCgllbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdodG1sU291cmNlJyk7DQoNCglpZiAoZWwpIHsNCgkJZWwuc3R5bGUud2lkdGggID0gKHZwLncgLSAyMCkgKyAncHgnOw0KCQllbC5zdHlsZS5oZWlnaHQgPSAodnAuaCAtIDY1KSArICdweCc7DQoJfQ0KfQ0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/langs/en.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5hZHZhbmNlZCcsew0Kc3R5bGVfc2VsZWN0OiJTdHlsZXMiLA0KZm9udF9zaXplOiJGb250IHNpemUiLA0KZm9udGRlZmF1bHQ6IkZvbnQgZmFtaWx5IiwNCmJsb2NrOiJGb3JtYXQiLA0KcGFyYWdyYXBoOiJQYXJhZ3JhcGgiLA0KZGl2OiJEaXYiLA0KYWRkcmVzczoiQWRkcmVzcyIsDQpwcmU6IlByZWZvcm1hdHRlZCIsDQpoMToiSGVhZGluZyAxIiwNCmgyOiJIZWFkaW5nIDIiLA0KaDM6IkhlYWRpbmcgMyIsDQpoNDoiSGVhZGluZyA0IiwNCmg1OiJIZWFkaW5nIDUiLA0KaDY6IkhlYWRpbmcgNiIsDQpibG9ja3F1b3RlOiJCbG9ja3F1b3RlIiwNCmNvZGU6IkNvZGUiLA0Kc2FtcDoiQ29kZSBzYW1wbGUiLA0KZHQ6IkRlZmluaXRpb24gdGVybSAiLA0KZGQ6IkRlZmluaXRpb24gZGVzY3JpcHRpb24iLA0KYm9sZF9kZXNjOiJCb2xkIChDdHJsK0IpIiwNCml0YWxpY19kZXNjOiJJdGFsaWMgKEN0cmwrSSkiLA0KdW5kZXJsaW5lX2Rlc2M6IlVuZGVybGluZSAoQ3RybCtVKSIsDQpzdHJpa2V0cm91Z2hfZGVzYzoiU3RyaWtldGhyb3VnaCIsDQpqdXN0aWZ5bGVmdF9kZXNjOiJBbGlnbiBsZWZ0IiwNCmp1c3RpZnljZW50ZXJfZGVzYzoiQWxpZ24gY2VudGVyIiwNCmp1c3RpZnlyaWdodF9kZXNjOiJBbGlnbiByaWdodCIsDQpqdXN0aWZ5ZnVsbF9kZXNjOiJBbGlnbiBmdWxsIiwNCmJ1bGxpc3RfZGVzYzoiVW5vcmRlcmVkIGxpc3QiLA0KbnVtbGlzdF9kZXNjOiJPcmRlcmVkIGxpc3QiLA0Kb3V0ZGVudF9kZXNjOiJPdXRkZW50IiwNCmluZGVudF9kZXNjOiJJbmRlbnQiLA0KdW5kb19kZXNjOiJVbmRvIChDdHJsK1opIiwNCnJlZG9fZGVzYzoiUmVkbyAoQ3RybCtZKSIsDQpsaW5rX2Rlc2M6Ikluc2VydC9lZGl0IGxpbmsiLA0KdW5saW5rX2Rlc2M6IlVubGluayIsDQppbWFnZV9kZXNjOiJJbnNlcnQvZWRpdCBpbWFnZSIsDQpjbGVhbnVwX2Rlc2M6IkNsZWFudXAgbWVzc3kgY29kZSIsDQpjb2RlX2Rlc2M6IkVkaXQgSFRNTCBTb3VyY2UiLA0Kc3ViX2Rlc2M6IlN1YnNjcmlwdCIsDQpzdXBfZGVzYzoiU3VwZXJzY3JpcHQiLA0KaHJfZGVzYzoiSW5zZXJ0IGhvcml6b250YWwgcnVsZXIiLA0KcmVtb3ZlZm9ybWF0X2Rlc2M6IlJlbW92ZSBmb3JtYXR0aW5nIiwNCmN1c3RvbTFfZGVzYzoiWW91ciBjdXN0b20gZGVzY3JpcHRpb24gaGVyZSIsDQpmb3JlY29sb3JfZGVzYzoiU2VsZWN0IHRleHQgY29sb3IiLA0KYmFja2NvbG9yX2Rlc2M6IlNlbGVjdCBiYWNrZ3JvdW5kIGNvbG9yIiwNCmNoYXJtYXBfZGVzYzoiSW5zZXJ0IGN1c3RvbSBjaGFyYWN0ZXIiLA0KdmlzdWFsYWlkX2Rlc2M6IlRvZ2dsZSBndWlkZWxpbmVzL2ludmlzaWJsZSBlbGVtZW50cyIsDQphbmNob3JfZGVzYzoiSW5zZXJ0L2VkaXQgYW5jaG9yIiwNCmN1dF9kZXNjOiJDdXQiLA0KY29weV9kZXNjOiJDb3B5IiwNCnBhc3RlX2Rlc2M6IlBhc3RlIiwNCmltYWdlX3Byb3BzX2Rlc2M6IkltYWdlIHByb3BlcnRpZXMiLA0KbmV3ZG9jdW1lbnRfZGVzYzoiTmV3IGRvY3VtZW50IiwNCmhlbHBfZGVzYzoiSGVscCIsDQpibG9ja3F1b3RlX2Rlc2M6IkJsb2NrcXVvdGUiLA0KY2xpcGJvYXJkX21zZzoiQ29weS9DdXQvUGFzdGUgaXMgbm90IGF2YWlsYWJsZSBpbiBNb3ppbGxhIGFuZCBGaXJlZm94LlxyXG5EbyB5b3Ugd2FudCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaXNzdWU/IiwNCnBhdGg6IlBhdGgiLA0KbmV3ZG9jdW1lbnQ6IkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCBjbGVhciBhbGwgY29udGVudHM/IiwNCnRvb2xiYXJfZm9jdXM6Ikp1bXAgdG8gdG9vbCBidXR0b25zIC0gQWx0K1EsIEp1bXAgdG8gZWRpdG9yIC0gQWx0LVosIEp1bXAgdG8gZWxlbWVudCBwYXRoIC0gQWx0LVgiLA0KbW9yZV9jb2xvcnM6Ik1vcmUgY29sb3JzIg0KfSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/langs/en_dlg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5hZHZhbmNlZF9kbGcnLHsNCmFib3V0X3RpdGxlOiJBYm91dCBUaW55TUNFIiwNCmFib3V0X2dlbmVyYWw6IkFib3V0IiwNCmFib3V0X2hlbHA6IkhlbHAiLA0KYWJvdXRfbGljZW5zZToiTGljZW5zZSIsDQphYm91dF9wbHVnaW5zOiJQbHVnaW5zIiwNCmFib3V0X3BsdWdpbjoiUGx1Z2luIiwNCmFib3V0X2F1dGhvcjoiQXV0aG9yIiwNCmFib3V0X3ZlcnNpb246IlZlcnNpb24iLA0KYWJvdXRfbG9hZGVkOiJMb2FkZWQgcGx1Z2lucyIsDQphbmNob3JfdGl0bGU6Ikluc2VydC9lZGl0IGFuY2hvciIsDQphbmNob3JfbmFtZToiQW5jaG9yIG5hbWUiLA0KY29kZV90aXRsZToiSFRNTCBTb3VyY2UgRWRpdG9yIiwNCmNvZGVfd29yZHdyYXA6IldvcmQgd3JhcCIsDQpjb2xvcnBpY2tlcl90aXRsZToiU2VsZWN0IGEgY29sb3IiLA0KY29sb3JwaWNrZXJfcGlja2VyX3RhYjoiUGlja2VyIiwNCmNvbG9ycGlja2VyX3BpY2tlcl90aXRsZToiQ29sb3IgcGlja2VyIiwNCmNvbG9ycGlja2VyX3BhbGV0dGVfdGFiOiJQYWxldHRlIiwNCmNvbG9ycGlja2VyX3BhbGV0dGVfdGl0bGU6IlBhbGV0dGUgY29sb3JzIiwNCmNvbG9ycGlja2VyX25hbWVkX3RhYjoiTmFtZWQiLA0KY29sb3JwaWNrZXJfbmFtZWRfdGl0bGU6Ik5hbWVkIGNvbG9ycyIsDQpjb2xvcnBpY2tlcl9jb2xvcjoiQ29sb3I6IiwNCmNvbG9ycGlja2VyX25hbWU6Ik5hbWU6IiwNCmNoYXJtYXBfdGl0bGU6IlNlbGVjdCBjdXN0b20gY2hhcmFjdGVyIiwNCmltYWdlX3RpdGxlOiJJbnNlcnQvZWRpdCBpbWFnZSIsDQppbWFnZV9zcmM6IkltYWdlIFVSTCIsDQppbWFnZV9hbHQ6IkltYWdlIGRlc2NyaXB0aW9uIiwNCmltYWdlX2xpc3Q6IkltYWdlIGxpc3QiLA0KaW1hZ2VfYm9yZGVyOiJCb3JkZXIiLA0KaW1hZ2VfZGltZW5zaW9uczoiRGltZW5zaW9ucyIsDQppbWFnZV92c3BhY2U6IlZlcnRpY2FsIHNwYWNlIiwNCmltYWdlX2hzcGFjZToiSG9yaXpvbnRhbCBzcGFjZSIsDQppbWFnZV9hbGlnbjoiQWxpZ25tZW50IiwNCmltYWdlX2FsaWduX2Jhc2VsaW5lOiJCYXNlbGluZSIsDQppbWFnZV9hbGlnbl90b3A6IlRvcCIsDQppbWFnZV9hbGlnbl9taWRkbGU6Ik1pZGRsZSIsDQppbWFnZV9hbGlnbl9ib3R0b206IkJvdHRvbSIsDQppbWFnZV9hbGlnbl90ZXh0dG9wOiJUZXh0IHRvcCIsDQppbWFnZV9hbGlnbl90ZXh0Ym90dG9tOiJUZXh0IGJvdHRvbSIsDQppbWFnZV9hbGlnbl9sZWZ0OiJMZWZ0IiwNCmltYWdlX2FsaWduX3JpZ2h0OiJSaWdodCIsDQpsaW5rX3RpdGxlOiJJbnNlcnQvZWRpdCBsaW5rIiwNCmxpbmtfdXJsOiJMaW5rIFVSTCIsDQpsaW5rX3RhcmdldDoiVGFyZ2V0IiwNCmxpbmtfdGFyZ2V0X3NhbWU6Ik9wZW4gbGluayBpbiB0aGUgc2FtZSB3aW5kb3ciLA0KbGlua190YXJnZXRfYmxhbms6Ik9wZW4gbGluayBpbiBhIG5ldyB3aW5kb3ciLA0KbGlua190aXRsZWZpZWxkOiJUaXRsZSIsDQpsaW5rX2lzX2VtYWlsOiJUaGUgVVJMIHlvdSBlbnRlcmVkIHNlZW1zIHRvIGJlIGFuIGVtYWlsIGFkZHJlc3MsIGRvIHlvdSB3YW50IHRvIGFkZCB0aGUgcmVxdWlyZWQgbWFpbHRvOiBwcmVmaXg/IiwNCmxpbmtfaXNfZXh0ZXJuYWw6IlRoZSBVUkwgeW91IGVudGVyZWQgc2VlbXMgdG8gZXh0ZXJuYWwgbGluaywgZG8geW91IHdhbnQgdG8gYWRkIHRoZSByZXF1aXJlZCBodHRwOi8vIHByZWZpeD8iLA0KbGlua19saXN0OiJMaW5rIGxpc3QiDQp9KTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/link.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgoJPHRpdGxlPnsjYWR2YW5jZWRfZGxnLmxpbmtfdGl0bGV9PC90aXRsZT4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3RpbnlfbWNlX3BvcHVwLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL21jdGFicy5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi91dGlscy9mb3JtX3V0aWxzLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL3V0aWxzL3ZhbGlkYXRlLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2xpbmsuanMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5IGlkPSJsaW5rIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+Cjxmb3JtIG9uc3VibWl0PSJMaW5rRGlhbG9nLnVwZGF0ZSgpO3JldHVybiBmYWxzZTsiIGFjdGlvbj0iIyI+Cgk8ZGl2IGNsYXNzPSJ0YWJzIj4KCQk8dWw+CgkJCTxsaSBpZD0iZ2VuZXJhbF90YWIiIGNsYXNzPSJjdXJyZW50Ij48c3Bhbj48YSBocmVmPSJqYXZhc2NyaXB0Om1jVGFicy5kaXNwbGF5VGFiKCdnZW5lcmFsX3RhYicsJ2dlbmVyYWxfcGFuZWwnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7Ij57I2FkdmFuY2VkX2RsZy5saW5rX3RpdGxlfTwvYT48L3NwYW4+PC9saT4KCQk8L3VsPgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0icGFuZWxfd3JhcHBlciI+CgkJPGRpdiBpZD0iZ2VuZXJhbF9wYW5lbCIgY2xhc3M9InBhbmVsIGN1cnJlbnQiPgoKCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9Im5vd3JhcCI+PGxhYmVsIGZvcj0iaHJlZiI+eyNhZHZhbmNlZF9kbGcubGlua191cmx9PC9sYWJlbD48L3RkPgogICAgICAgICAgICA8dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4gCgkJCQkgIDx0cj4gCgkJCQkJPHRkPjxpbnB1dCBpZD0iaHJlZiIgbmFtZT0iaHJlZiIgdHlwZT0idGV4dCIgY2xhc3M9Im1jZUZvY3VzIiB2YWx1ZT0iIiBzdHlsZT0id2lkdGg6IDIwMHB4IiBvbmNoYW5nZT0iTGlua0RpYWxvZy5jaGVja1ByZWZpeCh0aGlzKTsiIC8+PC90ZD4gCgkJCQkJPHRkIGlkPSJocmVmYnJvd3NlcmNvbnRhaW5lciI+Jm5ic3A7PC90ZD4KCQkJCSAgPC90cj4gCgkJCQk8L3RhYmxlPjwvdGQ+CiAgICAgICAgICA8L3RyPgoJCSAgPHRyPgoJCQk8dGQ+PGxhYmVsIGZvcj0ibGlua19saXN0Ij57I2FkdmFuY2VkX2RsZy5saW5rX2xpc3R9PC9sYWJlbD48L3RkPgoJCQk8dGQ+PHNlbGVjdCBpZD0ibGlua19saXN0IiBuYW1lPSJsaW5rX2xpc3QiIG9uY2hhbmdlPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaHJlZicpLnZhbHVlPXRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlOyI+PC9zZWxlY3Q+PC90ZD4KCQkgIDwvdHI+CgkJPHRyPgoJCQk8dGQ+PGxhYmVsIGlkPSJ0YXJnZXRsaXN0bGFiZWwiIGZvcj0idGFyZ2V0bGlzdCI+eyNhZHZhbmNlZF9kbGcubGlua190YXJnZXR9PC9sYWJlbD48L3RkPgoJCQk8dGQ+PHNlbGVjdCBpZD0idGFyZ2V0X2xpc3QiIG5hbWU9InRhcmdldF9saXN0Ij48L3NlbGVjdD48L3RkPgoJCTwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0ibm93cmFwIj48bGFiZWwgZm9yPSJsaW5rdGl0bGUiPnsjYWR2YW5jZWRfZGxnLmxpbmtfdGl0bGVmaWVsZH08L2xhYmVsPjwvdGQ+CiAgICAgICAgICAgIDx0ZD48aW5wdXQgaWQ9Imxpbmt0aXRsZSIgbmFtZT0ibGlua3RpdGxlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzdHlsZT0id2lkdGg6IDIwMHB4IiAvPjwvdGQ+CiAgICAgICAgICA8L3RyPgoJCQk8dHI+CgkJCQk8dGQ+PGxhYmVsIGZvcj0iY2xhc3NfbGlzdCI+eyNjbGFzc19uYW1lfTwvbGFiZWw+PC90ZD4KCQkJCTx0ZD48c2VsZWN0IGlkPSJjbGFzc19saXN0IiBuYW1lPSJjbGFzc19saXN0Ij48L3NlbGVjdD48L3RkPgoJCQk8L3RyPgogICAgICAgIDwvdGFibGU+CgkJPC9kaXY+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJtY2VBY3Rpb25QYW5lbCI+CgkJPGlucHV0IHR5cGU9InN1Ym1pdCIgaWQ9Imluc2VydCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0ieyNpbnNlcnR9IiAvPgoJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJjYW5jZWwiIG5hbWU9ImNhbmNlbCIgdmFsdWU9InsjY2FuY2VsfSIgb25jbGljaz0idGlueU1DRVBvcHVwLmNsb3NlKCk7IiAvPgoJPC9kaXY+CjwvZm9ybT4KPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/default/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/default/content.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ym9keSwgdGQsIHByZSB7Y29sb3I6IzAwMDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOjEwcHg7IG1hcmdpbjo4cHg7fQpib2R5IHtiYWNrZ3JvdW5kOiNGRkY7fQpib2R5Lm1jZUZvcmNlQ29sb3JzIHtiYWNrZ3JvdW5kOiNGRkY7IGNvbG9yOiMwMDA7fQpoMSB7Zm9udC1zaXplOiAyZW19CmgyIHtmb250LXNpemU6IDEuNWVtfQpoMyB7Zm9udC1zaXplOiAxLjE3ZW19Cmg0IHtmb250LXNpemU6IDFlbX0KaDUge2ZvbnQtc2l6ZTogLjgzZW19Cmg2IHtmb250LXNpemU6IC43NWVtfQoubWNlSXRlbVRhYmxlLCAubWNlSXRlbVRhYmxlIHRkLCAubWNlSXRlbVRhYmxlIHRoLCAubWNlSXRlbVRhYmxlIGNhcHRpb24sIC5tY2VJdGVtVmlzdWFsQWlkIHtib3JkZXI6IDFweCBkYXNoZWQgI0JCQjt9CmEubWNlSXRlbUFuY2hvciB7ZGlzcGxheTppbmxpbmUtYmxvY2s7IHdpZHRoOjExcHggIWltcG9ydGFudDsgaGVpZ2h0OjExcHggICFpbXBvcnRhbnQ7IGJhY2tncm91bmQ6dXJsKGltZy9pdGVtcy5naWYpIG5vLXJlcGVhdCAwIDA7fQpzcGFuLm1jZUl0ZW1OYnNwIHtiYWNrZ3JvdW5kOiAjREREfQp0ZC5tY2VTZWxlY3RlZCwgdGgubWNlU2VsZWN0ZWQge2JhY2tncm91bmQtY29sb3I6IzMzOTlmZiAhaW1wb3J0YW50fQppbWcge2JvcmRlcjowO30KdGFibGUge2N1cnNvcjpkZWZhdWx0fQp0YWJsZSB0ZCwgdGFibGUgdGgge2N1cnNvcjp0ZXh0fQppbnMge2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyZWVuOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOmdyZWVufQpkZWwge2NvbG9yOnJlZDsgdGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaH0KY2l0ZSB7Ym9yZGVyLWJvdHRvbToxcHggZGFzaGVkIGJsdWV9CmFjcm9ueW0ge2JvcmRlci1ib3R0b206MXB4IGRvdHRlZCAjQ0NDOyBjdXJzb3I6aGVscH0KYWJiciB7Ym9yZGVyLWJvdHRvbToxcHggZGFzaGVkICNDQ0M7IGN1cnNvcjpoZWxwfQoKLyogSUUgKi8KKiBodG1sIGJvZHkgewpzY3JvbGxiYXItM2RsaWdodC1jb2xvcjojRjBGMEVFOwpzY3JvbGxiYXItYXJyb3ctY29sb3I6IzY3NjY2MjsKc2Nyb2xsYmFyLWJhc2UtY29sb3I6I0YwRjBFRTsKc2Nyb2xsYmFyLWRhcmtzaGFkb3ctY29sb3I6I0RERDsKc2Nyb2xsYmFyLWZhY2UtY29sb3I6I0UwRTBERDsKc2Nyb2xsYmFyLWhpZ2hsaWdodC1jb2xvcjojRjBGMEVFOwpzY3JvbGxiYXItc2hhZG93LWNvbG9yOiNGMEYwRUU7CnNjcm9sbGJhci10cmFjay1jb2xvcjojRjVGNUY1Owp9CgppbWc6LW1vei1icm9rZW4gey1tb3otZm9yY2UtYnJva2VuLWltYWdlLWljb246MTsgd2lkdGg6MjRweDsgaGVpZ2h0OjI0cHh9CmZvbnRbZmFjZT1tY2VpbmxpbmVdIHtmb250LWZhbWlseTppbmhlcml0ICFpbXBvcnRhbnR9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/default/dialog.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogR2VuZXJpYyAqLwpib2R5IHsKZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOjExcHg7CnNjcm9sbGJhci0zZGxpZ2h0LWNvbG9yOiNGMEYwRUU7CnNjcm9sbGJhci1hcnJvdy1jb2xvcjojNjc2NjYyOwpzY3JvbGxiYXItYmFzZS1jb2xvcjojRjBGMEVFOwpzY3JvbGxiYXItZGFya3NoYWRvdy1jb2xvcjojREREREREOwpzY3JvbGxiYXItZmFjZS1jb2xvcjojRTBFMEREOwpzY3JvbGxiYXItaGlnaGxpZ2h0LWNvbG9yOiNGMEYwRUU7CnNjcm9sbGJhci1zaGFkb3ctY29sb3I6I0YwRjBFRTsKc2Nyb2xsYmFyLXRyYWNrLWNvbG9yOiNGNUY1RjU7CmJhY2tncm91bmQ6I0YwRjBFRTsKcGFkZGluZzowOwptYXJnaW46OHB4IDhweCAwIDhweDsKfQoKaHRtbCB7YmFja2dyb3VuZDojRjBGMEVFO30KdGQge2ZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZToxMHB4O30KdGV4dGFyZWEge3Jlc2l6ZTpub25lO291dGxpbmU6bm9uZTt9CmE6bGluaywgYTp2aXNpdGVkIHtjb2xvcjpibGFjazt9CmE6aG92ZXIge2NvbG9yOiMyQjZGQjY7fQoubm93cmFwIHt3aGl0ZS1zcGFjZTogbm93cmFwfQoKLyogRm9ybXMgKi8KZmllbGRzZXQge21hcmdpbjowOyBwYWRkaW5nOjRweDsgYm9yZGVyOjFweCBzb2xpZCAjOTE5QjlDOyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbDsgZm9udC1zaXplOjEwcHg7fQpsZWdlbmQge2NvbG9yOiMyQjZGQjY7IGZvbnQtd2VpZ2h0OmJvbGQ7fQpsYWJlbC5tc2cge2Rpc3BsYXk6bm9uZTt9CmxhYmVsLmludmFsaWQge2NvbG9yOiNFRTAwMDA7IGRpc3BsYXk6aW5saW5lO30KaW5wdXQuaW52YWxpZCB7Ym9yZGVyOjFweCBzb2xpZCAjRUUwMDAwO30KaW5wdXQge2JhY2tncm91bmQ6I0ZGRjsgYm9yZGVyOjFweCBzb2xpZCAjQ0NDO30KaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEge2ZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZToxMHB4O30KaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEge2JvcmRlcjoxcHggc29saWQgIzgwODA4MDt9CmlucHV0LnJhZGlvIHtib3JkZXI6MXB4IG5vbmUgIzAwMDAwMDsgYmFja2dyb3VuZDp0cmFuc3BhcmVudDsgdmVydGljYWwtYWxpZ246bWlkZGxlO30KaW5wdXQuY2hlY2tib3gge2JvcmRlcjoxcHggbm9uZSAjMDAwMDAwOyBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50OyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fQouaW5wdXRfbm9ib3JkZXIge2JvcmRlcjowO30KCi8qIEJ1dHRvbnMgKi8KI2luc2VydCwgI2NhbmNlbCwgaW5wdXQuYnV0dG9uLCAudXBkYXRlQnV0dG9uIHsKYm9yZGVyOjA7IG1hcmdpbjowOyBwYWRkaW5nOjA7CmZvbnQtd2VpZ2h0OmJvbGQ7CndpZHRoOjk0cHg7IGhlaWdodDoyNnB4OwpiYWNrZ3JvdW5kOnVybChpbWcvYnV0dG9ucy5wbmcpIDAgLTI2cHg7CmN1cnNvcjpwb2ludGVyOwpwYWRkaW5nLWJvdHRvbToycHg7CmZsb2F0OmxlZnQ7Cn0KCiNpbnNlcnQge2JhY2tncm91bmQ6dXJsKGltZy9idXR0b25zLnBuZykgMCAtNTJweH0KI2NhbmNlbCB7YmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbnMucG5nKSAwIDA7IGZsb2F0OnJpZ2h0fQoKLyogQnJvd3NlICovCmEucGlja2NvbG9yLCBhLmJyb3dzZSB7dGV4dC1kZWNvcmF0aW9uOm5vbmV9CmEuYnJvd3NlIHNwYW4ge2Rpc3BsYXk6YmxvY2s7IHdpZHRoOjIwcHg7IGhlaWdodDoxOHB4OyBiYWNrZ3JvdW5kOnVybCguLi8uLi9pbWcvaWNvbnMuZ2lmKSAtODYwcHggMDsgYm9yZGVyOjFweCBzb2xpZCAjRkZGOyBtYXJnaW4tbGVmdDoxcHg7fQoubWNlT2xkQm94TW9kZWwgYS5icm93c2Ugc3BhbiB7d2lkdGg6MjJweDsgaGVpZ2h0OjIwcHg7fQphLmJyb3dzZTpob3ZlciBzcGFuIHtib3JkZXI6MXB4IHNvbGlkICMwQTI0NkE7IGJhY2tncm91bmQtY29sb3I6I0IyQkJEMDt9CmEuYnJvd3NlIHNwYW4uZGlzYWJsZWQge2JvcmRlcjoxcHggc29saWQgd2hpdGU7IG9wYWNpdHk6MC4zOyAtbXMtZmlsdGVyOidhbHBoYShvcGFjaXR5PTMwKSc7IGZpbHRlcjphbHBoYShvcGFjaXR5PTMwKX0KYS5icm93c2U6aG92ZXIgc3Bhbi5kaXNhYmxlZCB7Ym9yZGVyOjFweCBzb2xpZCB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt9CmEucGlja2NvbG9yIHNwYW4ge2Rpc3BsYXk6YmxvY2s7IHdpZHRoOjIwcHg7IGhlaWdodDoxNnB4OyBiYWNrZ3JvdW5kOnVybCguLi8uLi9pbWcvaWNvbnMuZ2lmKSAtODQwcHggMDsgbWFyZ2luLWxlZnQ6MnB4O30KLm1jZU9sZEJveE1vZGVsIGEucGlja2NvbG9yIHNwYW4ge3dpZHRoOjIxcHg7IGhlaWdodDoxN3B4O30KYS5waWNrY29sb3I6aG92ZXIgc3BhbiB7YmFja2dyb3VuZC1jb2xvcjojQjJCQkQwO30KYS5waWNrY29sb3I6aG92ZXIgc3Bhbi5kaXNhYmxlZCB7fQoKLyogQ2hhcm1hcCAqLwp0YWJsZS5jaGFybWFwIHtib3JkZXI6MXB4IHNvbGlkICNBQUE7IHRleHQtYWxpZ246Y2VudGVyfQp0ZC5jaGFybWFwLCAjY2hhcm1hcCBhIHt3aWR0aDoxOHB4OyBoZWlnaHQ6MThweDsgY29sb3I6IzAwMDsgYm9yZGVyOjFweCBzb2xpZCAjQUFBOyB0ZXh0LWFsaWduOmNlbnRlcjsgZm9udC1zaXplOjEycHg7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTsgbGluZS1oZWlnaHQ6IDE4cHg7fQojY2hhcm1hcCBhIHtkaXNwbGF5OmJsb2NrOyBjb2xvcjojMDAwOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgYm9yZGVyOjB9CiNjaGFybWFwIGE6aG92ZXIge2JhY2tncm91bmQ6I0NDQztjb2xvcjojMkI2RkI2fQojY2hhcm1hcCAjY29kZU4ge2ZvbnQtc2l6ZToxMHB4OyBmb250LWZhbWlseTpBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsgdGV4dC1hbGlnbjpjZW50ZXJ9CiNjaGFybWFwICNjb2RlViB7Zm9udC1zaXplOjQwcHg7IGhlaWdodDo4MHB4OyBib3JkZXI6MXB4IHNvbGlkICNBQUE7IHRleHQtYWxpZ246Y2VudGVyfQoKLyogU291cmNlICovCi53b3JkV3JhcENvZGUge3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsgYm9yZGVyOjFweCBub25lICMwMDAwMDA7IGJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7fQoubWNlQWN0aW9uUGFuZWwge21hcmdpbi10b3A6NXB4O30KCi8qIFRhYnMgY2xhc3NlcyAqLwoudGFicyB7d2lkdGg6MTAwJTsgaGVpZ2h0OjE4cHg7IGxpbmUtaGVpZ2h0Om5vcm1hbDsgYmFja2dyb3VuZDp1cmwoaW1nL3RhYnMuZ2lmKSByZXBlYXQteCAwIC03MnB4O30KLnRhYnMgdWwge21hcmdpbjowOyBwYWRkaW5nOjA7IGxpc3Qtc3R5bGU6bm9uZTt9Ci50YWJzIGxpIHtmbG9hdDpsZWZ0OyBiYWNrZ3JvdW5kOnVybChpbWcvdGFicy5naWYpIG5vLXJlcGVhdCAwIDA7IG1hcmdpbjowIDJweCAwIDA7IHBhZGRpbmc6MCAwIDAgMTBweDsgbGluZS1oZWlnaHQ6MTdweDsgaGVpZ2h0OjE4cHg7IGRpc3BsYXk6YmxvY2s7fQoudGFicyBsaS5jdXJyZW50IHtiYWNrZ3JvdW5kOnVybChpbWcvdGFicy5naWYpIG5vLXJlcGVhdCAwIC0xOHB4OyBtYXJnaW4tcmlnaHQ6MnB4O30KLnRhYnMgc3BhbiB7ZmxvYXQ6bGVmdDsgZGlzcGxheTpibG9jazsgYmFja2dyb3VuZDp1cmwoaW1nL3RhYnMuZ2lmKSBuby1yZXBlYXQgcmlnaHQgLTM2cHg7IHBhZGRpbmc6MHB4IDEwcHggMCAwO30KLnRhYnMgLmN1cnJlbnQgc3BhbiB7YmFja2dyb3VuZDp1cmwoaW1nL3RhYnMuZ2lmKSBuby1yZXBlYXQgcmlnaHQgLTU0cHg7fQoudGFicyBhIHt0ZXh0LWRlY29yYXRpb246bm9uZTsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWw7IGZvbnQtc2l6ZToxMHB4O30KLnRhYnMgYTpsaW5rLCAudGFicyBhOnZpc2l0ZWQsIC50YWJzIGE6aG92ZXIge2NvbG9yOmJsYWNrO30KCi8qIFBhbmVscyAqLwoucGFuZWxfd3JhcHBlciBkaXYucGFuZWwge2Rpc3BsYXk6bm9uZTt9Ci5wYW5lbF93cmFwcGVyIGRpdi5jdXJyZW50IHtkaXNwbGF5OmJsb2NrOyB3aWR0aDoxMDAlOyBoZWlnaHQ6MzAwcHg7IG92ZXJmbG93OnZpc2libGU7fQoucGFuZWxfd3JhcHBlciB7Ym9yZGVyOjFweCBzb2xpZCAjOTE5QjlDOyBib3JkZXItdG9wOjBweDsgcGFkZGluZzoxMHB4OyBwYWRkaW5nLXRvcDo1cHg7IGNsZWFyOmJvdGg7IGJhY2tncm91bmQ6d2hpdGU7fQoKLyogQ29sdW1ucyAqLwouY29sdW1uIHtmbG9hdDpsZWZ0O30KLnByb3BlcnRpZXMge3dpZHRoOjEwMCU7fQoucHJvcGVydGllcyAuY29sdW1uMSB7fQoucHJvcGVydGllcyAuY29sdW1uMiB7dGV4dC1hbGlnbjpsZWZ0O30KCi8qIFRpdGxlcyAqLwpoMSwgaDIsIGgzLCBoNCB7Y29sb3I6IzJCNkZCNjsgbWFyZ2luOjA7IHBhZGRpbmc6MDsgcGFkZGluZy10b3A6NXB4O30KaDMge2ZvbnQtc2l6ZToxNHB4O30KLnRpdGxlIHtmb250LXNpemU6MTJweDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6IzJCNkZCNjt9CgovKiBEaWFsb2cgc3BlY2lmaWMgKi8KI2xpbmsgLnBhbmVsX3dyYXBwZXIsICNsaW5rIGRpdi5jdXJyZW50IHtoZWlnaHQ6MTI1cHg7fQojaW1hZ2UgLnBhbmVsX3dyYXBwZXIsICNpbWFnZSBkaXYuY3VycmVudCB7aGVpZ2h0OjIwMHB4O30KI3BsdWdpbnRhYmxlIHRoZWFkIHtmb250LXdlaWdodDpib2xkOyBiYWNrZ3JvdW5kOiNEREQ7fQojcGx1Z2ludGFibGUsICNhYm91dCAjcGx1Z2ludGFibGUgdGQge2JvcmRlcjoxcHggc29saWQgIzkxOUI5Qzt9CiNwbHVnaW50YWJsZSB7d2lkdGg6OTYlOyBtYXJnaW4tdG9wOjEwcHg7fQojcGx1Z2luc2NvbnRhaW5lciB7aGVpZ2h0OjI5MHB4OyBvdmVyZmxvdzphdXRvO30KI2NvbG9ycGlja2VyICNwcmV2aWV3IHtmbG9hdDpyaWdodDsgd2lkdGg6NTBweDsgaGVpZ2h0OjE0cHg7bGluZS1oZWlnaHQ6MXB4OyBib3JkZXI6MXB4IHNvbGlkIGJsYWNrOyBtYXJnaW4tbGVmdDo1cHg7fQojY29sb3JwaWNrZXIgI2NvbG9ycyB7ZmxvYXQ6bGVmdDsgYm9yZGVyOjFweCBzb2xpZCBncmF5OyBjdXJzb3I6Y3Jvc3NoYWlyO30KI2NvbG9ycGlja2VyICNsaWdodCB7Ym9yZGVyOjFweCBzb2xpZCBncmF5OyBtYXJnaW4tbGVmdDo1cHg7IGZsb2F0OmxlZnQ7d2lkdGg6MTVweDsgaGVpZ2h0OjE1MHB4OyBjdXJzb3I6Y3Jvc3NoYWlyO30KI2NvbG9ycGlja2VyICNsaWdodCBkaXYge292ZXJmbG93OmhpZGRlbjt9CiNjb2xvcnBpY2tlciAjcHJldmlld2Jsb2NrIHtmbG9hdDpyaWdodDsgcGFkZGluZy1sZWZ0OjEwcHg7IGhlaWdodDoyMHB4O30KI2NvbG9ycGlja2VyIC5wYW5lbF93cmFwcGVyIGRpdi5jdXJyZW50IHtoZWlnaHQ6MTc1cHg7fQojY29sb3JwaWNrZXIgI25hbWVkY29sb3JzIHt3aWR0aDoxNTBweDt9CiNjb2xvcnBpY2tlciAjbmFtZWRjb2xvcnMgYSB7ZGlzcGxheTpibG9jazsgZmxvYXQ6bGVmdDsgd2lkdGg6MTBweDsgaGVpZ2h0OjEwcHg7IG1hcmdpbjoxcHggMXB4IDAgMDsgb3ZlcmZsb3c6aGlkZGVuO30KI2NvbG9ycGlja2VyICNjb2xvcm5hbWVjb250YWluZXIge21hcmdpbi10b3A6NXB4O30KI2NvbG9ycGlja2VyICNwaWNrZXJfcGFuZWwgZmllbGRzZXQge21hcmdpbjphdXRvO3dpZHRoOjMyNXB4O30K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/default/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/default/img/buttons.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAF4AAABOCAMAAACe2lHHAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJPUExURe/u7eTk5PDPxfDv7vT08/n5+PHw7/X19O3s650hDPHx8LSzsvLQxubGwFtbW/XTyPj49qa0XuXFvvLy8dfX13WIGPTRx/Tz8qSzXIgdCmFwFZSTkuzr6e3Nxfn5+eno5urp5+zr6ujJwuzMxKsnC3h4ePj494ODg+rKwufHwff39mxsbPb29fj4+EhISOTj4fPy8t3b2OrLxOLCu+jIweLg3ioqKgcHB/Dw8PLx8OzLw2tra9y7tPr6+uTEvefIwfPz8vPy8efHv+HBut6+tunKwzQ0NPf39+fm5ODe2+jn5UpKSgEBAe3s6te3r+TEu9m5sXl5eXp6ektLS/X19e7Mwt+/uF1dXYSZHd7c2evq6M7Ny9za1+nIv+bl4+Ti4HZ2duPDvKq6XoaYMH2PIxMTE+De3PX08/X09Pb19Tk5OVVVVUJCQjExMfDw75mpS/T09NvZ1vTz81lZWfDu7eXj4ZGiOfT08vHx7+jm5GBgYPf29m5ubo6dRPb29OPj4+np6cfGxcC/vaGwWcXEwz4+Ptzc3MjHxuro5+zMw3Jycre2terKwE1NTePh3+nn5e/w7vLy8NPT07++vHR0dKmop/Dw7pmZl+zq6evp6Obk4u/t7P39/czLyWdnZ+Hg3ezLxIuKicjIyPX29dza2Pb39iUlJfHw7uXk4ezs6uXk4uLg3+fl42JxFZiYl+ro5oWFg+7u7JGQj8HBv+7s6/Pz8+bl4u3t6/f39e/u7ujn5urIwOfl5Pb29u7t7M3NzcPDwckxAvLy8t3d3e/v78xNzvMAAAoBSURBVHjatJb7XxNXGsZHMsmEgVDMVOLuBmYikQ0YCFkIBIQASSQJJRBXiOYCLshV5VqpUldFQMHitV6rbV3rrffrtt1bIgJ/2L7nnJnJpOCnv5BvPpk5Oec5z3POzMC8VFFR0VqGAGuqaO3+QWBf3r6DaezLI+w7+OffR1YrxAcP3l8D+7lDrzNE3lwRtbYjc/Y71kT7goLc3IKCgrfQVwR6cuGUi5A7t0AWEL2E0h5GsrKQvxKpJwvxhoSC3NQgNN5K85fszUjTjYUyBbnd3eScC63u7k3pOBmPiD9SLczr14ewfY0Z2XfXF2alU1+P0+CQVVgPXJHC4Uriawlz4EM8ySJyFZiV9oX1V69kpQdYoIdcGJRlAYoVu8vNunL1quVqt9SFJKKWYDbL9j31xRa3pbi4sBB9RXp6LFnoTFKLLT2AvEX4+V8QKBZUeLVH/gWTwL6GXHuzWa9363V6C1yBfwDFBLeuRxFWWGhx63R6nbsattGD5Hp3vWK0sNjtviI1gcKUfba+E6GzSPwFqNd16tAVL5apd3cqqS5Oc7d0dlqIjKCwr9ZVIar3iBxA6Ks6xSSJ4uq+KonOPcVK6uurq6oOYBVa34EDluyUvdutDwNV7qampmrEHkjqDFdJSdKeLE0epPN4wqJVCove40FiaYXVCnu9XufxAh4doRTR5w27qwl7ZPReTLj0gIw4AvJqidKmpj6FvUuvd3kbAK8L7pmYUdXQoCt146TSajnHg2QNfXsUNGE8DWGidQM6T4Nkn2fO7nO5XGE8r8GjlwB7l3I3ALjosaq0SQke84a8RKxHKwuFFPZwq/o8oZA3DN1eyCL2oZCYJYbo0LrAJhQKl8q48WKBhpBXjx5XIAwSr8Legwh1hKs8DR0doTDajMtV1dGR2koqxdPR0dGnSweNhjq8RAZGHSFPX8qe+MM47MILsxuq+vqwvdclkUqA7g7Xb6wBF6wOnVzIAIyyFfbm7D9sM9lms8LenL3dmKV/affF1/ChmppUq6bmEDru20ze1t1ITeaJJjU198G+aO7tDz98OwOA6xwqROZ2ZIg5VIhktoz6uHHSuZERnJONH1ONzu8/BU688+5+kb9jTrxDOPzBnTt/E9m7969bI6v3Y92dOx8gfnQ2UpMXxm7fXs0At2+fvDBJOdfHfroYW1rcXu/FpdjFn06uO6mNy2MXP4mVl3d1lcsUIXxdXYmiovJEF+DDPY1bIQkawaGrKEXsk4snL29QG+tjsZjPV0bTZSVKyqEngbLKGBqwlquBot9SbiWD0FQzNKMWQfNisUvr2H5p3mq10hyTSCTKZErKmrnzPp+vxOc738xxHG1FoWpxf8ShnIEB7nRZOfwqKWnmaHFpMKukbH7pOLZvX1xhurqa2Z+tEgmElWUnUQ5EJn5mgTWrL32DDAe9HIPbZT4fxzbDcqTlWVcWx4j9as55hmZvcswIuowM89T6lLFau8ZvcgkrfBL/ep5g2Jsq1TgEoOk+DMPd3Bi/Wfkcm/nKzibY8dNnn5eJy3s6mrP6AtsPruZQXLMmqTJMDw9PT6OLOTI8PDxCJTWjDDDKjFpHRytVVDKZZGlxgwZNEn5rhq1nz1rR9+wo6A2joERTRkYYJmd1ENsfX80xmbQmk4ltaWmpBJoRBkPSRJEwmh4eGRmhNUhjSv57XKOicFNbx8iMjDSbTNzwMJZPT08bDDmr7bK9gNCeYesIt25xXEtQ+ALyxCyDYdrAJQUllEF0A06fNpwRhDoDErdgOIW9KnijDaBe3hvXIM6cgZtmahNQEno4ODKlmeLbJASNAdOMLcGTavvPGSS9hdbHsnUK++QPpl6gjVKpNlSIe6p749HeNgg7w0IU2RPH1almH/Y+xFK2RVwlGCLXui96Z0HM4uWNj99TKeyDQe3sUWAW7l7y0aNHFEI4OkOpCC9fakRMRzEzVJ2MOLJ89KGoVp2C2bzC/oHJFL3uAGaiWiCJWXZ8pcU51KlT0kSN5n9I5hA0CsjQrOPLU0T+KJnUfu1Q2H8UjUa/HAoMDQ09nkXPRBCF8ENDURKUpETAJQiiIYe0LQIesw3NEPE/tdrlr4YCkv2l1ZzvvlsWZiOR658H4CBEH6AIEx+J3AgGg/JuxJTrkUikl0oHDT6OzIAxTDCZPgfJjGy/uNLWduNGWyT+C9/2OB6P/II2E43y8XgvzgkGlSlfx+Pxj5LpwKApEp8JYvmNQDwemBVWFkX7pfm76FGLTM3wPH80PjX1mBcgYfnZlI3sg0SgC/ZrMslPTT0zpZx/Rd0wGn029RB0D6I2MLjOL9+dXyJ/tZdisdW73/5pW/n27moshu0vX4LXyfxKzrayMg+vkxfwOnGu/3iSMNY+SN7H144PtrcPjr2AwwnCu8BhwvvXoPvw+5jDEjA8Bt1oXvvYtWvXkMtg+/fwMpy88Oqzz15lAHCFV3mj88L65fUMcHn9AhQiGS6j1Go6U/a0Wk2pnU9QaZZXkbc/jbwKQt7+vb+PrFaK9z9xqina1rqwsDMDLCxU2Gh4MFt37+zv37l7W8GOFahKW2+Fdn4+w+TL4FIowTAJtTo/gd6kCfUbkQXgwCj6wb8C/1No7e+HygFqsvw0pJ4ErtIS+W8wTw0qqjQ0r79ftN89gexxlZYiP2HgzuNz4rwBVWk4Sy3vD59IlZYg3QaOllYG2sTE7lZsX7swAfsysIZEOixLS00DqtI4FKZErNJExwSX7nBuQbSfOIeqtA0OdoeBMfgyzg1O1jKsU6VycsrpDAeP9kalYjnO08rhcxOyPcUZUJVmoGn0FYEqTSqS4PZJVZq0H1Kl0Sk70BuwEqBhoecmasm1nzhnNGqNRiNbSSAFjCFppBRhNFRpoDEmKSeq0lBTy6aqNFiY0ciJSjxdtn/vmJFUaawEumOVWkGbykJsqtJS0VClsYLAYhlZI3fsPdlepeURlEbjxKUFzjDygpgEWWRbFC8jVWkilZUwRsTiEhX2yR+MfoCXqzSNSuM0+nmnmCTtiVX5bfBBUulKciKs1u9HYrw8J1xAhT28jf02wK+sOASbjZKrJwmjjUClUsUR3mZLq9Jk+2MD6Ebh6stmTFVpvMOxRZXmf1OV5nfYTslVj9bvGDgm2wtgbwsgHH78TOAqLRAwbq7StFi1VZUWsMlFD+8IBGT7IwPoVvntdoctAAeUheDtdh7npFdpDrvd7t+iSnPYbUQNK7XbA7aBI0p7Htz8PB9AkwXJHm+F7EVOgWXYhc1VmjEA9mQeeAT8gsJ+F7KHcThCst3BCwK2txklUgnQbTemW+M1S2piwO9K2R85suubP24r3+wCU2JfAa2BXdvMAJiif2nO9Sfia7i1tjbVqq1tRce8zVRs3Y3UZJ5oUlv7BF6GtO1VxoBXudppW88QNihEMltG/V+AAQCsbKzEMPlbkgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/default/img/items.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwALAJEAAAAAAP//////zP///yH5BAEAAAMALAAAAAALAAsAQAIXhIx3Jsvb2oNxgqTU1XzG/2GgNJJi+RUAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFAAUAIABAAAAAP///yH5BAEAAAEALAAAAAAUABQAAAIbjI+py+0Po5wM0APszXryHnEbKJHXiabqyioFADs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/default/img/menu_check.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFAAUAIABAAAAAP///yH5BAEAAAEALAAAAAAUABQAAAIdjI+py+0Po5y0ghrAhTvr+GndI36TiI3YyrbuexQAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/default/img/progress.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhIAAgALMAAP///7Ozs/v7+9bW1uHh4fLy8rq6uoGBgTQ0NAEBARsbG8TExJeXl/39/VRUVAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBQAAACwAAAAAIAAgAAAE5xDISSlLrOrNp0pKNRCdFhxVolJLEJQUoSgOpSYT4RowNSsvyW1icA16k8MMMRkCBjskBTFDAZyuAEkqCfxIQ2hgQRFvAQEEIjNxVDW6XNE4YagRjuBCwe60smQUDnd4Rz1ZAQZnFAGDd0hihh12CEE9kjAEVlycXIg7BAsMB6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YEvpJivxNaGmLHT0VnOgGYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ/V/nmOM82XiHQjYKhKP1oZmADdEAAAh+QQFBQAAACwAAAAAGAAXAAAEchDISasKNeuJFKoHs4mUYlJIkmjIV54Soypsa0wmLSnqoTEtBw52mG0AjhYpBxioEqRNy8V0qFzNw+GGwlJki4lBqx1IBgjMkRIghwjrzcDti2/Gh7D9qN774wQGAYOEfwCChIV/gYmDho+QkZKTR3p7EQAh+QQFBQAAACwBAAAAHQAOAAAEchDISWdANesNHHJZwE2DUSEo5SjKKB2HOKGYFLD1CB/DnEoIlkti2PlyuKGEATMBaAACSyGbEDYD4zN1YIEmh0SCQQgYehNmTNNaKsQJXmBuuEYPi9ECAU/UFnNzeUp9VBQEBoFOLmFxWHNoQw6RWEocEQAh+QQFBQAAACwHAAAAGQARAAAEaRDICdZZNOvNDsvfBhBDdpwZgohBgE3nQaki0AYEjEqOGmqDlkEnAzBUjhrA0CoBYhLVSkm4SaAAWkahCFAWTU0A4RxzFWJnzXFWJJWb9pTihRu5dvghl+/7NQmBggo/fYKHCX8AiAmEEQAh+QQFBQAAACwOAAAAEgAYAAAEZXCwAaq9ODAMDOUAI17McYDhWA3mCYpb1RooXBktmsbt944BU6zCQCBQiwPB4jAihiCK86irTB20qvWp7Xq/FYV4TNWNz4oqWoEIgL0HX/eQSLi69boCikTkE2VVDAp5d1p0CW4RACH5BAUFAAAALA4AAAASAB4AAASAkBgCqr3YBIMXvkEIMsxXhcFFpiZqBaTXisBClibgAnd+ijYGq2I4HAamwXBgNHJ8BEbzgPNNjz7LwpnFDLvgLGJMdnw/5DRCrHaE3xbKm6FQwOt1xDnpwCvcJgcJMgEIeCYOCQlrF4YmBIoJVV2CCXZvCooHbwGRcAiKcmFUJhEAIfkEBQUAAAAsDwABABEAHwAABHsQyAkGoRivELInnOFlBjeM1BCiFBdcbMUtKQdTN0CUJru5NJQrYMh5VIFTTKJcOj2HqJQRhEqvqGuU+uw6AwgEwxkOO55lxIihoDjKY8pBoThPxmpAYi+hKzoeewkTdHkZghMIdCOIhIuHfBMOjxiNLR4KCW1ODAlxSxEAIfkEBQUAAAAsCAAOABgAEgAABGwQyEkrCDgbYvvMoOF5ILaNaIoGKroch9hacD3MFMHUBzMHiBtgwJMBFolDB4GoGGBCACKRcAAUWAmzOWJQExysQsJgWj0KqvKalTiYPhp1LBFTtp10Is6mT5gdVFx1bRN8FTsVCAqDOB9+KhEAIfkEBQUAAAAsAgASAB0ADgAABHgQyEmrBePS4bQdQZBdR5IcHmWEgUFQgWKaKbWwwSIhc4LonsXhBSCsQoOSScGQDJiWwOHQnAxWBIYJNXEoFCiEWDI9jCzESey7GwMM5doEwW4jJoypQQ743u1WcTV0CgFzbhJ5XClfHYd/EwZnHoYVDgiOfHKQNREAIfkEBQUAAAAsAAAPABkAEQAABGeQqUQruDjrW3vaYCZ5X2ie6EkcKaooTAsi7ytnTq046BBsNcTvItz4AotMwKZBIC6H6CVAJaCcT0CUBTgaTg5nTCu9GKiDEMPJg5YBBOpwlnVzLwtqyKnZagZWahoMB2M3GgsHSRsRACH5BAUFAAAALAEACAARABgAAARcMKR0gL34npkUyyCAcAmyhBijkGi2UW02VHFt33iu7yiDIDaD4/erEYGDlu/nuBAOJ9Dvc2EcDgFAYIuaXS3bbOh6MIC5IAP5Eh5fk2exC4tpgwZyiyFgvhEMBBEAIfkEBQUAAAAsAAACAA4AHQAABHMQyAnYoViSlFDGXBJ808Ep5KRwV8qEg+pRCOeoioKMwJK0Ekcu54h9AoghKgXIMZgAApQZcCCu2Ax2O6NUud2pmJcyHA4L0uDM/ljYDCnGfGakJQE5YH0wUBYBAUYfBIFkHwaBgxkDgX5lgXpHAXcpBIsRADs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/default/img/tabs.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhLAFaANUAAAAAAP////z8/jJKYpKisrbEzZGntOTp7OPp7O3x86Gzu6m5v+Pp65GbnPr7+8jRzdDW0PDw6vT07/Pz7vLy7fHx7PDw6/b28vX18fT08PPz7/Ly7vHx7fb28/X18vv7+fj49vb29P39/Pz8+/r6+fj49/Hv3+7t5uvq4+/u6Ozr5fHw6/Dv6uXi2ufk3evo4ebj3enm4Ojl3/Px7vb08v7+/vz8/Pr6+v///wAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADgALAAAAAAsAVoAAAb/QBNkYSgaj8ikcslsOp/QqHRKrVqv2KwWCykcAuCweEwum8/otHrNbrvf8Lh8Tq/PF4iafs/v+/+AgYKDhIWGh4iJiouMjY6PjgYiIjYjlpeYmZqbnJ2en6ChoqOkpaanqKmqq6gGNySwsbKztLW2t7i5uru8vb6/wMHCw8TFxAYlIMrLzM3Oz9DR0tPU1dbX2Nna29zd3t/eBiEhHeXm5+jp6uvs7e7v8PHy8/T19vf4+fr4BuUX/wADChxIsKDBgwgTKlzIsKHDhxAjSpxIUaKBCx4waNzIsaPHjyBDihxJsqTJkyhTqlzJsqXLly0NaMxAs6bNmzhz6tzJs6fP/59AgwodSrSo0aNIkx41QFOD06dQo0qdSrWq1atYs2rdyrWr169gw4odG9aABAkT0qpdy7at27dw48qdS7eu3bt48+rdy7evX74G0lIYTLiw4cOIEytezLix48eQI0ueTLmy5cuYLRvYsIGD58+gQ4seTbq06dOoU6tezbq169ewY8ueHdvA4Aq4c+vezbu379/AgwsfTry48ePIkytfzrz5cgO4LUifTr269evYs2vfzr279+/gw4sfT768+fPlDViIwL69+/fw48ufT7++/fv48+vfz7+///8ABgjgFgQWaOCBCCao4IIMSuEABANEKOGEFFZo4YUYZqjhhhx26P/hhyCGKOKIJJZoYokQEqDiiiy26OKLMMYo44w01mjjjTjmqOOOPPbo448+GgDkkEQWaeSRSCap5JI2GiDAk1BGKeWUVEppx5VYZqnlllx26SUbTlYp5phWfmnmmWimqeaaa4RJ5ptVsinnnHTWaWcabsKpJ5R39unnn4BimeeeegZq6KGIJhrAoIS+qeijkEaKJqONjinppZhmKgellcap6aeghhoGp51OKeqpqEZKaqlRpurqq4CuyuqTsNZqq5yyznrrrrx6mSurvQYrbB2/zmrsscgmq+yyzDbrLKvFPivttNRWa+212AqAw7bcduvtt+CGK+645JZr7rnopqv/7rrstuvuu/C6q8ADJsRr77345qvvvvz262+5CRQAwb8EF2zwwQgnfHANDCyg8MMQRyzxxAV/QIMBFGes8cYcd0wDCxh3LPLIJJd87wwqhGzyyiy37PIKL6js8sw01xwxzDLbrPPOPOPLQgw59yz00ESPmwLQRSettNInyBD00lBH3XLTT0tt9dUbq+BC1Vh37XXCKsDA9ddkl71v2GObrfba7aLQQtpsxy33uC+8PffdeOet997rDgCBA3wHjjcBfgtueNwqwn344ks/qTjjkA/teOSUWz155ZgrfXnmnAu9eeeg2/x56KS3PHrpqJN8euqsb7x667BL/HrstCc8S3vtuBN8e+6877t778Db+3vwxLc7fPHIJ6/88sw37/zz0Ecv/fTUV2/99dhnr/323Hfv/ffghy/++OSXb/75yjeo/vrst+/++/AHAQA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/default/ui.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUmVzZXQgKi8KLmRlZmF1bHRTa2luIHRhYmxlLCAuZGVmYXVsdFNraW4gdGJvZHksIC5kZWZhdWx0U2tpbiBhLCAuZGVmYXVsdFNraW4gaW1nLCAuZGVmYXVsdFNraW4gdHIsIC5kZWZhdWx0U2tpbiBkaXYsIC5kZWZhdWx0U2tpbiB0ZCwgLmRlZmF1bHRTa2luIGlmcmFtZSwgLmRlZmF1bHRTa2luIHNwYW4sIC5kZWZhdWx0U2tpbiAqLCAuZGVmYXVsdFNraW4gLm1jZVRleHQge2JvcmRlcjowOyBtYXJnaW46MDsgcGFkZGluZzowOyBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50OyB3aGl0ZS1zcGFjZTpub3dyYXA7IHRleHQtZGVjb3JhdGlvbjpub25lOyBmb250LXdlaWdodDpub3JtYWw7IGN1cnNvcjpkZWZhdWx0OyBjb2xvcjojMDAwOyB2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTsgd2lkdGg6YXV0bzsgYm9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlOyB0ZXh0LWFsaWduOmxlZnR9Ci5kZWZhdWx0U2tpbiBhOmhvdmVyLCAuZGVmYXVsdFNraW4gYTpsaW5rLCAuZGVmYXVsdFNraW4gYTp2aXNpdGVkLCAuZGVmYXVsdFNraW4gYTphY3RpdmUge3RleHQtZGVjb3JhdGlvbjpub25lOyBmb250LXdlaWdodDpub3JtYWw7IGN1cnNvcjpkZWZhdWx0OyBjb2xvcjojMDAwfQouZGVmYXVsdFNraW4gdGFibGUgdGQge3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0KCi8qIENvbnRhaW5lcnMgKi8KLmRlZmF1bHRTa2luIHRhYmxlIHtkaXJlY3Rpb246bHRyOyBiYWNrZ3JvdW5kOiNGMEYwRUV9Ci5kZWZhdWx0U2tpbiBpZnJhbWUge2Rpc3BsYXk6YmxvY2s7IGJhY2tncm91bmQ6I0ZGRn0KLmRlZmF1bHRTa2luIC5tY2VUb29sYmFyIHtoZWlnaHQ6MjZweH0KLmRlZmF1bHRTa2luIC5tY2VMZWZ0IHt0ZXh0LWFsaWduOmxlZnR9Ci5kZWZhdWx0U2tpbiAubWNlUmlnaHQge3RleHQtYWxpZ246cmlnaHR9CgovKiBFeHRlcm5hbCAqLwouZGVmYXVsdFNraW4gLm1jZUV4dGVybmFsVG9vbGJhciB7cG9zaXRpb246YWJzb2x1dGU7IGJvcmRlcjoxcHggc29saWQgI0NDQzsgYm9yZGVyLWJvdHRvbTowOyBkaXNwbGF5Om5vbmU7fQouZGVmYXVsdFNraW4gLm1jZUV4dGVybmFsVG9vbGJhciB0ZC5tY2VUb29sYmFyIHtwYWRkaW5nLXJpZ2h0OjEzcHg7fQouZGVmYXVsdFNraW4gLm1jZUV4dGVybmFsQ2xvc2Uge3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6M3B4OyByaWdodDozcHg7IHdpZHRoOjdweDsgaGVpZ2h0OjdweDsgYmFja2dyb3VuZDp1cmwoLi4vLi4vaW1nL2ljb25zLmdpZikgLTgyMHB4IDB9CgovKiBMYXlvdXQgKi8KLmRlZmF1bHRTa2luIHRhYmxlLm1jZUxheW91dCB7Ym9yZGVyOjA7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjQ0NDOyBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNDQ0N9Ci5kZWZhdWx0U2tpbiB0YWJsZS5tY2VMYXlvdXQgdHIubWNlRmlyc3QgdGQge2JvcmRlci10b3A6MXB4IHNvbGlkICNDQ0N9Ci5kZWZhdWx0U2tpbiB0YWJsZS5tY2VMYXlvdXQgdHIubWNlTGFzdCB0ZCB7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI0NDQ30KLmRlZmF1bHRTa2luIHRhYmxlLm1jZVRvb2xiYXIsIC5kZWZhdWx0U2tpbiB0ci5tY2VGaXJzdCAubWNlVG9vbGJhciB0ciB0ZCwgLmRlZmF1bHRTa2luIHRyLm1jZUxhc3QgLm1jZVRvb2xiYXIgdHIgdGQge2JvcmRlcjowOyBtYXJnaW46MDsgcGFkZGluZzowO30KLmRlZmF1bHRTa2luIHRkLm1jZVRvb2xiYXIge3BhZGRpbmctdG9wOjFweDsgdmVydGljYWwtYWxpZ246dG9wfQouZGVmYXVsdFNraW4gLm1jZUlmcmFtZUNvbnRhaW5lciB7Ym9yZGVyLXRvcDoxcHggc29saWQgI0NDQzsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0NDQ30KLmRlZmF1bHRTa2luIC5tY2VTdGF0dXNiYXIge2ZvbnQtZmFtaWx5OidNUyBTYW5zIFNlcmlmJyxzYW5zLXNlcmlmLFZlcmRhbmEsQXJpYWw7IGZvbnQtc2l6ZTo5cHQ7IGxpbmUtaGVpZ2h0OjE2cHg7IG92ZXJmbG93OnZpc2libGU7IGNvbG9yOiMwMDA7IGRpc3BsYXk6YmxvY2s7IGhlaWdodDoyMHB4fQouZGVmYXVsdFNraW4gLm1jZVN0YXR1c2JhciBkaXYge2Zsb2F0OmxlZnQ7IG1hcmdpbjoycHh9Ci5kZWZhdWx0U2tpbiAubWNlU3RhdHVzYmFyIGEubWNlUmVzaXplIHtkaXNwbGF5OmJsb2NrOyBmbG9hdDpyaWdodDsgYmFja2dyb3VuZDp1cmwoLi4vLi4vaW1nL2ljb25zLmdpZikgLTgwMHB4IDA7IHdpZHRoOjIwcHg7IGhlaWdodDoyMHB4OyBjdXJzb3I6c2UtcmVzaXplOyBvdXRsaW5lOjB9Ci5kZWZhdWx0U2tpbiAubWNlU3RhdHVzYmFyIGE6aG92ZXIge3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9Ci5kZWZhdWx0U2tpbiB0YWJsZS5tY2VUb29sYmFyIHttYXJnaW4tbGVmdDozcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZUljb24sIC5kZWZhdWx0U2tpbiBpbWcubWNlSWNvbiB7ZGlzcGxheTpibG9jazsgd2lkdGg6MjBweDsgaGVpZ2h0OjIwcHh9Ci5kZWZhdWx0U2tpbiAubWNlSWNvbiB7YmFja2dyb3VuZDp1cmwoLi4vLi4vaW1nL2ljb25zLmdpZikgbm8tcmVwZWF0IDIwcHggMjBweH0KLmRlZmF1bHRTa2luIHRkLm1jZUNlbnRlciB7dGV4dC1hbGlnbjpjZW50ZXI7fQouZGVmYXVsdFNraW4gdGQubWNlQ2VudGVyIHRhYmxlIHttYXJnaW46MCBhdXRvOyB0ZXh0LWFsaWduOmxlZnQ7fQouZGVmYXVsdFNraW4gdGQubWNlUmlnaHQgdGFibGUge21hcmdpbjowIDAgMCBhdXRvO30KCi8qIEJ1dHRvbiAqLwouZGVmYXVsdFNraW4gLm1jZUJ1dHRvbiB7ZGlzcGxheTpibG9jazsgYm9yZGVyOjFweCBzb2xpZCAjRjBGMEVFOyB3aWR0aDoyMHB4OyBoZWlnaHQ6MjBweDsgbWFyZ2luLXJpZ2h0OjFweH0KLmRlZmF1bHRTa2luIGEubWNlQnV0dG9uRW5hYmxlZDpob3ZlciB7Ym9yZGVyOjFweCBzb2xpZCAjMEEyNDZBOyBiYWNrZ3JvdW5kLWNvbG9yOiNCMkJCRDB9Ci5kZWZhdWx0U2tpbiBhLm1jZUJ1dHRvbkFjdGl2ZSwgLmRlZmF1bHRTa2luIGEubWNlQnV0dG9uU2VsZWN0ZWQge2JvcmRlcjoxcHggc29saWQgIzBBMjQ2QTsgYmFja2dyb3VuZC1jb2xvcjojQzJDQkUwfQouZGVmYXVsdFNraW4gLm1jZUJ1dHRvbkRpc2FibGVkIC5tY2VJY29uIHtvcGFjaXR5OjAuMzsgLW1zLWZpbHRlcjonYWxwaGEob3BhY2l0eT0zMCknOyBmaWx0ZXI6YWxwaGEob3BhY2l0eT0zMCl9Ci5kZWZhdWx0U2tpbiAubWNlQnV0dG9uTGFiZWxlZCB7d2lkdGg6YXV0b30KLmRlZmF1bHRTa2luIC5tY2VCdXR0b25MYWJlbGVkIHNwYW4ubWNlSWNvbiB7ZmxvYXQ6bGVmdH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlQnV0dG9uTGFiZWwge2Rpc3BsYXk6YmxvY2s7IGZvbnQtc2l6ZToxMHB4OyBwYWRkaW5nOjRweCA2cHggMCAyMnB4OyBmb250LWZhbWlseTpUYWhvbWEsVmVyZGFuYSxBcmlhbCxIZWx2ZXRpY2F9Ci5kZWZhdWx0U2tpbiAubWNlQnV0dG9uRGlzYWJsZWQgLm1jZUJ1dHRvbkxhYmVsIHtjb2xvcjojODg4fQoKLyogU2VwYXJhdG9yICovCi5kZWZhdWx0U2tpbiAubWNlU2VwYXJhdG9yIHtkaXNwbGF5OmJsb2NrOyBiYWNrZ3JvdW5kOnVybCguLi8uLi9pbWcvaWNvbnMuZ2lmKSAtMTgwcHggMDsgd2lkdGg6MnB4OyBoZWlnaHQ6MjBweDsgbWFyZ2luOjJweCAycHggMCA0cHh9CgovKiBMaXN0Qm94ICovCi5kZWZhdWx0U2tpbiAubWNlTGlzdEJveCwgLmRlZmF1bHRTa2luIC5tY2VMaXN0Qm94IGEge2Rpc3BsYXk6YmxvY2t9Ci5kZWZhdWx0U2tpbiAubWNlTGlzdEJveCAubWNlVGV4dCB7cGFkZGluZy1sZWZ0OjRweDsgd2lkdGg6NzBweDsgdGV4dC1hbGlnbjpsZWZ0OyBib3JkZXI6MXB4IHNvbGlkICNDQ0M7IGJvcmRlci1yaWdodDowOyBiYWNrZ3JvdW5kOiNGRkY7IGZvbnQtZmFtaWx5OlRhaG9tYSxWZXJkYW5hLEFyaWFsLEhlbHZldGljYTsgZm9udC1zaXplOjExcHg7IGhlaWdodDoyMHB4OyBsaW5lLWhlaWdodDoyMHB4OyBvdmVyZmxvdzpoaWRkZW59Ci5kZWZhdWx0U2tpbiAubWNlTGlzdEJveCAubWNlT3BlbiB7d2lkdGg6OXB4OyBoZWlnaHQ6MjBweDsgYmFja2dyb3VuZDp1cmwoLi4vLi4vaW1nL2ljb25zLmdpZikgLTc0MXB4IDA7IG1hcmdpbi1yaWdodDoycHg7IGJvcmRlcjoxcHggc29saWQgI0NDQzt9Ci5kZWZhdWx0U2tpbiB0YWJsZS5tY2VMaXN0Qm94RW5hYmxlZDpob3ZlciAubWNlVGV4dCwgLmRlZmF1bHRTa2luIC5tY2VMaXN0Qm94SG92ZXIgLm1jZVRleHQsIC5kZWZhdWx0U2tpbiAubWNlTGlzdEJveFNlbGVjdGVkIC5tY2VUZXh0IHtib3JkZXI6MXB4IHNvbGlkICNBMkFCQzA7IGJvcmRlci1yaWdodDowOyBiYWNrZ3JvdW5kOiNGRkZ9Ci5kZWZhdWx0U2tpbiB0YWJsZS5tY2VMaXN0Qm94RW5hYmxlZDpob3ZlciAubWNlT3BlbiwgLmRlZmF1bHRTa2luIC5tY2VMaXN0Qm94SG92ZXIgLm1jZU9wZW4sIC5kZWZhdWx0U2tpbiAubWNlTGlzdEJveFNlbGVjdGVkIC5tY2VPcGVuIHtiYWNrZ3JvdW5kLWNvbG9yOiNGRkY7IGJvcmRlcjoxcHggc29saWQgI0EyQUJDMH0KLmRlZmF1bHRTa2luIC5tY2VMaXN0Qm94RGlzYWJsZWQgYS5tY2VUZXh0IHtjb2xvcjpncmF5OyBiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O30KLmRlZmF1bHRTa2luIC5tY2VMaXN0Qm94TWVudSB7b3ZlcmZsb3c6YXV0bzsgb3ZlcmZsb3cteDpoaWRkZW59Ci5kZWZhdWx0U2tpbiAubWNlT2xkQm94TW9kZWwgLm1jZUxpc3RCb3ggLm1jZVRleHQge2hlaWdodDoyMnB4fQouZGVmYXVsdFNraW4gLm1jZU9sZEJveE1vZGVsIC5tY2VMaXN0Qm94IC5tY2VPcGVuIHt3aWR0aDoxMXB4OyBoZWlnaHQ6MjJweDt9Ci5kZWZhdWx0U2tpbiBzZWxlY3QubWNlTmF0aXZlTGlzdEJveCB7Zm9udC1mYW1pbHk6J01TIFNhbnMgU2VyaWYnLHNhbnMtc2VyaWYsVmVyZGFuYSxBcmlhbDsgZm9udC1zaXplOjdwdDsgYmFja2dyb3VuZDojRjBGMEVFOyBib3JkZXI6MXB4IHNvbGlkIGdyYXk7IG1hcmdpbi1yaWdodDoycHg7fQoKLyogU3BsaXRCdXR0b24gKi8KLmRlZmF1bHRTa2luIC5tY2VTcGxpdEJ1dHRvbiB7d2lkdGg6MzJweDsgaGVpZ2h0OjIwcHg7IGRpcmVjdGlvbjpsdHJ9Ci5kZWZhdWx0U2tpbiAubWNlU3BsaXRCdXR0b24gYSwgLmRlZmF1bHRTa2luIC5tY2VTcGxpdEJ1dHRvbiBzcGFuIHtoZWlnaHQ6MjBweDsgZGlzcGxheTpibG9ja30KLmRlZmF1bHRTa2luIC5tY2VTcGxpdEJ1dHRvbiBhLm1jZUFjdGlvbiB7d2lkdGg6MjBweDsgYm9yZGVyOjFweCBzb2xpZCAjRjBGMEVFOyBib3JkZXItcmlnaHQ6MDt9Ci5kZWZhdWx0U2tpbiAubWNlU3BsaXRCdXR0b24gc3Bhbi5tY2VBY3Rpb24ge3dpZHRoOjIwcHg7IGJhY2tncm91bmQtaW1hZ2U6dXJsKC4uLy4uL2ltZy9pY29ucy5naWYpO30KLmRlZmF1bHRTa2luIC5tY2VTcGxpdEJ1dHRvbiBhLm1jZU9wZW4ge3dpZHRoOjlweDsgYmFja2dyb3VuZDp1cmwoLi4vLi4vaW1nL2ljb25zLmdpZikgLTc0MXB4IDA7IGJvcmRlcjoxcHggc29saWQgI0YwRjBFRTt9Ci5kZWZhdWx0U2tpbiAubWNlU3BsaXRCdXR0b24gc3Bhbi5tY2VPcGVuIHtkaXNwbGF5Om5vbmV9Ci5kZWZhdWx0U2tpbiB0YWJsZS5tY2VTcGxpdEJ1dHRvbkVuYWJsZWQ6aG92ZXIgYS5tY2VBY3Rpb24sIC5kZWZhdWx0U2tpbiAubWNlU3BsaXRCdXR0b25Ib3ZlciBhLm1jZUFjdGlvbiwgLmRlZmF1bHRTa2luIC5tY2VTcGxpdEJ1dHRvblNlbGVjdGVkIGEubWNlQWN0aW9uIHtib3JkZXI6MXB4IHNvbGlkICMwQTI0NkE7IGJvcmRlci1yaWdodDowOyBiYWNrZ3JvdW5kLWNvbG9yOiNCMkJCRDB9Ci5kZWZhdWx0U2tpbiB0YWJsZS5tY2VTcGxpdEJ1dHRvbkVuYWJsZWQ6aG92ZXIgYS5tY2VPcGVuLCAuZGVmYXVsdFNraW4gLm1jZVNwbGl0QnV0dG9uSG92ZXIgYS5tY2VPcGVuLCAuZGVmYXVsdFNraW4gLm1jZVNwbGl0QnV0dG9uU2VsZWN0ZWQgYS5tY2VPcGVuIHtiYWNrZ3JvdW5kLWNvbG9yOiNCMkJCRDA7IGJvcmRlcjoxcHggc29saWQgIzBBMjQ2QTt9Ci5kZWZhdWx0U2tpbiAubWNlU3BsaXRCdXR0b25EaXNhYmxlZCAubWNlQWN0aW9uLCAuZGVmYXVsdFNraW4gLm1jZVNwbGl0QnV0dG9uRGlzYWJsZWQgYS5tY2VPcGVuIHtvcGFjaXR5OjAuMzsgLW1zLWZpbHRlcjonYWxwaGEob3BhY2l0eT0zMCknOyBmaWx0ZXI6YWxwaGEob3BhY2l0eT0zMCl9Ci5kZWZhdWx0U2tpbiAubWNlU3BsaXRCdXR0b25BY3RpdmUgYS5tY2VBY3Rpb24ge2JvcmRlcjoxcHggc29saWQgIzBBMjQ2QTsgYmFja2dyb3VuZC1jb2xvcjojQzJDQkUwfQouZGVmYXVsdFNraW4gLm1jZVNwbGl0QnV0dG9uQWN0aXZlIGEubWNlT3BlbiB7Ym9yZGVyLWxlZnQ6MDt9CgovKiBDb2xvclNwbGl0QnV0dG9uICovCi5kZWZhdWx0U2tpbiBkaXYubWNlQ29sb3JTcGxpdE1lbnUgdGFibGUge2JhY2tncm91bmQ6I0ZGRjsgYm9yZGVyOjFweCBzb2xpZCBncmF5fQouZGVmYXVsdFNraW4gLm1jZUNvbG9yU3BsaXRNZW51IHRkIHtwYWRkaW5nOjJweH0KLmRlZmF1bHRTa2luIC5tY2VDb2xvclNwbGl0TWVudSBhIHtkaXNwbGF5OmJsb2NrOyB3aWR0aDo5cHg7IGhlaWdodDo5cHg7IG92ZXJmbG93OmhpZGRlbjsgYm9yZGVyOjFweCBzb2xpZCAjODA4MDgwfQouZGVmYXVsdFNraW4gLm1jZUNvbG9yU3BsaXRNZW51IHRkLm1jZU1vcmVDb2xvcnMge3BhZGRpbmc6MXB4IDNweCAxcHggMXB4fQouZGVmYXVsdFNraW4gLm1jZUNvbG9yU3BsaXRNZW51IGEubWNlTW9yZUNvbG9ycyB7d2lkdGg6MTAwJTsgaGVpZ2h0OmF1dG87IHRleHQtYWxpZ246Y2VudGVyOyBmb250LWZhbWlseTpUYWhvbWEsVmVyZGFuYSxBcmlhbCxIZWx2ZXRpY2E7IGZvbnQtc2l6ZToxMXB4OyBsaW5lLWhlaWdodDoyMHB4OyBib3JkZXI6MXB4IHNvbGlkICNGRkZ9Ci5kZWZhdWx0U2tpbiAubWNlQ29sb3JTcGxpdE1lbnUgYS5tY2VNb3JlQ29sb3JzOmhvdmVyIHtib3JkZXI6MXB4IHNvbGlkICMwQTI0NkE7IGJhY2tncm91bmQtY29sb3I6I0I2QkREMn0KLmRlZmF1bHRTa2luIGEubWNlTW9yZUNvbG9yczpob3ZlciB7Ym9yZGVyOjFweCBzb2xpZCAjMEEyNDZBfQouZGVmYXVsdFNraW4gLm1jZUNvbG9yUHJldmlldyB7bWFyZ2luLWxlZnQ6MnB4OyB3aWR0aDoxNnB4OyBoZWlnaHQ6NHB4OyBvdmVyZmxvdzpoaWRkZW47IGJhY2tncm91bmQ6IzlhOWI5YX0KLmRlZmF1bHRTa2luIC5tY2VfZm9yZWNvbG9yIHNwYW4ubWNlQWN0aW9uLCAuZGVmYXVsdFNraW4gLm1jZV9iYWNrY29sb3Igc3Bhbi5tY2VBY3Rpb24ge292ZXJmbG93OmhpZGRlbjsgaGVpZ2h0OjE2cHh9CgovKiBNZW51ICovCi5kZWZhdWx0U2tpbiAubWNlTWVudSB7cG9zaXRpb246YWJzb2x1dGU7IGxlZnQ6MDsgdG9wOjA7IHotaW5kZXg6MTAwMDsgYm9yZGVyOjFweCBzb2xpZCAjRDREMEM4fQouZGVmYXVsdFNraW4gLm1jZU5vSWNvbnMgc3Bhbi5tY2VJY29uIHt3aWR0aDowO30KLmRlZmF1bHRTa2luIC5tY2VOb0ljb25zIGEgLm1jZVRleHQge3BhZGRpbmctbGVmdDoxMHB4fQouZGVmYXVsdFNraW4gLm1jZU1lbnUgdGFibGUge2JhY2tncm91bmQ6I0ZGRn0KLmRlZmF1bHRTa2luIC5tY2VNZW51IGEsIC5kZWZhdWx0U2tpbiAubWNlTWVudSBzcGFuLCAuZGVmYXVsdFNraW4gLm1jZU1lbnUge2Rpc3BsYXk6YmxvY2t9Ci5kZWZhdWx0U2tpbiAubWNlTWVudSB0ZCB7aGVpZ2h0OjIwcHh9Ci5kZWZhdWx0U2tpbiAubWNlTWVudSBhIHtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjNweCAwIDRweCAwfQouZGVmYXVsdFNraW4gLm1jZU1lbnUgLm1jZVRleHQge3Bvc2l0aW9uOnJlbGF0aXZlOyBkaXNwbGF5OmJsb2NrOyBmb250LWZhbWlseTpUYWhvbWEsVmVyZGFuYSxBcmlhbCxIZWx2ZXRpY2E7IGNvbG9yOiMwMDA7IGN1cnNvcjpkZWZhdWx0OyBtYXJnaW46MDsgcGFkZGluZzowIDI1cHggMCAyNXB4OyBkaXNwbGF5OmJsb2NrfQouZGVmYXVsdFNraW4gLm1jZU1lbnUgc3Bhbi5tY2VUZXh0LCAuZGVmYXVsdFNraW4gLm1jZU1lbnUgLm1jZVByZXZpZXcge2ZvbnQtc2l6ZToxMXB4fQouZGVmYXVsdFNraW4gLm1jZU1lbnUgcHJlLm1jZVRleHQge2ZvbnQtZmFtaWx5Ok1vbm9zcGFjZX0KLmRlZmF1bHRTa2luIC5tY2VNZW51IC5tY2VJY29uIHtwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7IGxlZnQ6MDsgd2lkdGg6MjJweDt9Ci5kZWZhdWx0U2tpbiAubWNlTWVudSAubWNlTWVudUl0ZW1FbmFibGVkIGE6aG92ZXIsIC5kZWZhdWx0U2tpbiAubWNlTWVudSAubWNlTWVudUl0ZW1BY3RpdmUge2JhY2tncm91bmQtY29sb3I6I2RiZWNmM30KLmRlZmF1bHRTa2luIHRkLm1jZU1lbnVJdGVtU2VwYXJhdG9yIHtiYWNrZ3JvdW5kOiNEREQ7IGhlaWdodDoxcHh9Ci5kZWZhdWx0U2tpbiAubWNlTWVudUl0ZW1UaXRsZSBhIHtib3JkZXI6MDsgYmFja2dyb3VuZDojRUVFOyBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjREREfQouZGVmYXVsdFNraW4gLm1jZU1lbnVJdGVtVGl0bGUgc3Bhbi5tY2VUZXh0IHtjb2xvcjojMDAwOyBmb250LXdlaWdodDpib2xkOyBwYWRkaW5nLWxlZnQ6NHB4fQouZGVmYXVsdFNraW4gLm1jZU1lbnVJdGVtRGlzYWJsZWQgLm1jZVRleHQge2NvbG9yOiM4ODh9Ci5kZWZhdWx0U2tpbiAubWNlTWVudUl0ZW1TZWxlY3RlZCAubWNlSWNvbiB7YmFja2dyb3VuZDp1cmwoaW1nL21lbnVfY2hlY2suZ2lmKX0KLmRlZmF1bHRTa2luIC5tY2VOb0ljb25zIC5tY2VNZW51SXRlbVNlbGVjdGVkIGEge2JhY2tncm91bmQ6dXJsKGltZy9tZW51X2Fycm93LmdpZikgbm8tcmVwZWF0IC02cHggY2VudGVyfQouZGVmYXVsdFNraW4gLm1jZU1lbnUgc3Bhbi5tY2VNZW51TGluZSB7ZGlzcGxheTpub25lfQouZGVmYXVsdFNraW4gLm1jZU1lbnVJdGVtU3ViIGEge2JhY2tncm91bmQ6dXJsKGltZy9tZW51X2Fycm93LmdpZikgbm8tcmVwZWF0IHRvcCByaWdodDt9CgovKiBQcm9ncmVzcyxSZXNpemUgKi8KLmRlZmF1bHRTa2luIC5tY2VCbG9ja2VyIHtwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDowOyB0b3A6MDsgei1pbmRleDoxMDAwOyBvcGFjaXR5OjAuNTsgLW1zLWZpbHRlcjonYWxwaGEob3BhY2l0eT01MCknOyBmaWx0ZXI6YWxwaGEob3BhY2l0eT01MCk7IGJhY2tncm91bmQ6I0ZGRn0KLmRlZmF1bHRTa2luIC5tY2VQcm9ncmVzcyB7cG9zaXRpb246YWJzb2x1dGU7IGxlZnQ6MDsgdG9wOjA7IHotaW5kZXg6MTAwMTsgYmFja2dyb3VuZDp1cmwoaW1nL3Byb2dyZXNzLmdpZikgbm8tcmVwZWF0OyB3aWR0aDozMnB4OyBoZWlnaHQ6MzJweDsgbWFyZ2luOi0xNnB4IDAgMCAtMTZweH0KCi8qIEZvcm1hdHMgKi8KLmRlZmF1bHRTa2luIC5tY2VfZm9ybWF0UHJldmlldyBhIHtmb250LXNpemU6MTBweH0KLmRlZmF1bHRTa2luIC5tY2VfcCBzcGFuLm1jZVRleHQge30KLmRlZmF1bHRTa2luIC5tY2VfYWRkcmVzcyBzcGFuLm1jZVRleHQge2ZvbnQtc3R5bGU6aXRhbGljfQouZGVmYXVsdFNraW4gLm1jZV9wcmUgc3Bhbi5tY2VUZXh0IHtmb250LWZhbWlseTptb25vc3BhY2V9Ci5kZWZhdWx0U2tpbiAubWNlX2gxIHNwYW4ubWNlVGV4dCB7Zm9udC13ZWlnaHQ6Ym9sZGVyOyBmb250LXNpemU6IDJlbX0KLmRlZmF1bHRTa2luIC5tY2VfaDIgc3Bhbi5tY2VUZXh0IHtmb250LXdlaWdodDpib2xkZXI7IGZvbnQtc2l6ZTogMS41ZW19Ci5kZWZhdWx0U2tpbiAubWNlX2gzIHNwYW4ubWNlVGV4dCB7Zm9udC13ZWlnaHQ6Ym9sZGVyOyBmb250LXNpemU6IDEuMTdlbX0KLmRlZmF1bHRTa2luIC5tY2VfaDQgc3Bhbi5tY2VUZXh0IHtmb250LXdlaWdodDpib2xkZXI7IGZvbnQtc2l6ZTogMWVtfQouZGVmYXVsdFNraW4gLm1jZV9oNSBzcGFuLm1jZVRleHQge2ZvbnQtd2VpZ2h0OmJvbGRlcjsgZm9udC1zaXplOiAuODNlbX0KLmRlZmF1bHRTa2luIC5tY2VfaDYgc3Bhbi5tY2VUZXh0IHtmb250LXdlaWdodDpib2xkZXI7IGZvbnQtc2l6ZTogLjc1ZW19CgovKiBUaGVtZSAqLwouZGVmYXVsdFNraW4gc3Bhbi5tY2VfYm9sZCB7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9pdGFsaWMge2JhY2tncm91bmQtcG9zaXRpb246LTYwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX3VuZGVybGluZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX3N0cmlrZXRocm91Z2gge2JhY2tncm91bmQtcG9zaXRpb246LTEyMHB4IDB9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV91bmRvIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAwfQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfcmVkbyB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTAwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2NsZWFudXAge2JhY2tncm91bmQtcG9zaXRpb246LTQwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2J1bGxpc3Qge2JhY2tncm91bmQtcG9zaXRpb246LTIwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX251bWxpc3Qge2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2p1c3RpZnlsZWZ0IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00NjBweCAwfQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfanVzdGlmeXJpZ2h0IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00ODBweCAwfQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfanVzdGlmeWNlbnRlciB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDIwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2p1c3RpZnlmdWxsIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00NDBweCAwfQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfYW5jaG9yIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDBweCAwfQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfaW5kZW50IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MDBweCAwfQouZGVmYXVsdFNraW4gc3Bhbi5tY2Vfb3V0ZGVudCB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTQwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2xpbmsge2JhY2tncm91bmQtcG9zaXRpb246LTUwMHB4IDB9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV91bmxpbmsge2JhY2tncm91bmQtcG9zaXRpb246LTY0MHB4IDB9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9zdWIge2JhY2tncm91bmQtcG9zaXRpb246LTYwMHB4IDB9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9zdXAge2JhY2tncm91bmQtcG9zaXRpb246LTYyMHB4IDB9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9yZW1vdmVmb3JtYXQge2JhY2tncm91bmQtcG9zaXRpb246LTU4MHB4IDB9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9uZXdkb2N1bWVudCB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTIwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2ltYWdlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zODBweCAwfQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfaGVscCB7YmFja2dyb3VuZC1wb3NpdGlvbjotMzQwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2NvZGUge2JhY2tncm91bmQtcG9zaXRpb246LTI2MHB4IDB9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9ociB7YmFja2dyb3VuZC1wb3NpdGlvbjotMzYwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX3Zpc3VhbGFpZCB7YmFja2dyb3VuZC1wb3NpdGlvbjotNjYwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2NoYXJtYXAge2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IDB9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9wYXN0ZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTYwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2NvcHkge2JhY2tncm91bmQtcG9zaXRpb246LTcwMHB4IDB9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9jdXQge2JhY2tncm91bmQtcG9zaXRpb246LTY4MHB4IDB9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9ibG9ja3F1b3RlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjBweCAwfQouZGVmYXVsdFNraW4gLm1jZV9mb3JlY29sb3Igc3Bhbi5tY2VBY3Rpb24ge2JhY2tncm91bmQtcG9zaXRpb246LTcyMHB4IDB9Ci5kZWZhdWx0U2tpbiAubWNlX2JhY2tjb2xvciBzcGFuLm1jZUFjdGlvbiB7YmFja2dyb3VuZC1wb3NpdGlvbjotNzYwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2ZvcmVjb2xvcnBpY2tlciB7YmFja2dyb3VuZC1wb3NpdGlvbjotNzIwcHggMH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2JhY2tjb2xvcnBpY2tlciB7YmFja2dyb3VuZC1wb3NpdGlvbjotNzYwcHggMH0KCi8qIFBsdWdpbnMgKi8KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2FkdmhyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0wcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9sdHIge2JhY2tncm91bmQtcG9zaXRpb246LTIwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9ydGwge2JhY2tncm91bmQtcG9zaXRpb246LTQwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9lbW90aW9ucyB7YmFja2dyb3VuZC1wb3NpdGlvbjotNjBweCAtMjBweH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2Z1bGxwYWdlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfZnVsbHNjcmVlbiB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTAwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9pZXNwZWxsIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjBweCAtMjBweH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2luc2VydGRhdGUge2JhY2tncm91bmQtcG9zaXRpb246LTE0MHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfaW5zZXJ0dGltZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9hYnNvbHV0ZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTgwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9iYWNrd2FyZCB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjAwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9mb3J3YXJkIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjBweCAtMjBweH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2luc2VydF9sYXllciB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9pbnNlcnRsYXllciB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjYwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9tb3ZlYmFja3dhcmQge2JhY2tncm91bmQtcG9zaXRpb246LTI4MHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfbW92ZWZvcndhcmQge2JhY2tncm91bmQtcG9zaXRpb246LTMwMHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfbWVkaWEge2JhY2tncm91bmQtcG9zaXRpb246LTMyMHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2Vfbm9uYnJlYWtpbmcge2JhY2tncm91bmQtcG9zaXRpb246LTM0MHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfcGFzdGV0ZXh0IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNjBweCAtMjBweH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX3Bhc3Rld29yZCB7YmFja2dyb3VuZC1wb3NpdGlvbjotMzgwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9zZWxlY3RhbGwge2JhY2tncm91bmQtcG9zaXRpb246LTQwMHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfcHJldmlldyB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDIwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9wcmludCB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDQwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9jYW5jZWwge2JhY2tncm91bmQtcG9zaXRpb246LTQ2MHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2Vfc2F2ZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDgwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9yZXBsYWNlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01MDBweCAtMjBweH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX3NlYXJjaCB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTIwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9zdHlsZXByb3BzIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01NjBweCAtMjBweH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX3RhYmxlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01ODBweCAtMjBweH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2NlbGxfcHJvcHMge2JhY2tncm91bmQtcG9zaXRpb246LTYwMHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfZGVsZXRlX3RhYmxlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02MjBweCAtMjBweH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2RlbGV0ZV9jb2wge2JhY2tncm91bmQtcG9zaXRpb246LTY0MHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfZGVsZXRlX3JvdyB7YmFja2dyb3VuZC1wb3NpdGlvbjotNjYwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9jb2xfYWZ0ZXIge2JhY2tncm91bmQtcG9zaXRpb246LTY4MHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfY29sX2JlZm9yZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotNzAwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9yb3dfYWZ0ZXIge2JhY2tncm91bmQtcG9zaXRpb246LTcyMHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2Vfcm93X2JlZm9yZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotNzQwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9tZXJnZV9jZWxscyB7YmFja2dyb3VuZC1wb3NpdGlvbjotNzYwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV90YWJsZV9wcm9wcyB7YmFja2dyb3VuZC1wb3NpdGlvbjotOTgwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9yb3dfcHJvcHMge2JhY2tncm91bmQtcG9zaXRpb246LTc4MHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2Vfc3BsaXRfY2VsbHMge2JhY2tncm91bmQtcG9zaXRpb246LTgwMHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfdGVtcGxhdGUge2JhY2tncm91bmQtcG9zaXRpb246LTgyMHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfdmlzdWFsY2hhcnMge2JhY2tncm91bmQtcG9zaXRpb246LTg0MHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfYWJiciB7YmFja2dyb3VuZC1wb3NpdGlvbjotODYwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9hY3JvbnltIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04ODBweCAtMjBweH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX2F0dHJpYnMge2JhY2tncm91bmQtcG9zaXRpb246LTkwMHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfY2l0ZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotOTIwcHggLTIwcHh9Ci5kZWZhdWx0U2tpbiBzcGFuLm1jZV9kZWwge2JhY2tncm91bmQtcG9zaXRpb246LTk0MHB4IC0yMHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfaW5zIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NjBweCAtMjBweH0KLmRlZmF1bHRTa2luIHNwYW4ubWNlX3BhZ2VicmVhayB7YmFja2dyb3VuZC1wb3NpdGlvbjowIC00MHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2VfcmVzdG9yZWRyYWZ0IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMHB4IC00MHB4fQouZGVmYXVsdFNraW4gc3Bhbi5tY2Vfc3BlbGxjaGVja2VyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01NDBweCAtMjBweH0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/o2k7/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/o2k7/content.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ym9keSwgdGQsIHByZSB7Y29sb3I6IzAwMDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOjEwcHg7IG1hcmdpbjo4cHg7fQpib2R5IHtiYWNrZ3JvdW5kOiNGRkY7fQpib2R5Lm1jZUZvcmNlQ29sb3JzIHtiYWNrZ3JvdW5kOiNGRkY7IGNvbG9yOiMwMDA7fQpoMSB7Zm9udC1zaXplOiAyZW19CmgyIHtmb250LXNpemU6IDEuNWVtfQpoMyB7Zm9udC1zaXplOiAxLjE3ZW19Cmg0IHtmb250LXNpemU6IDFlbX0KaDUge2ZvbnQtc2l6ZTogLjgzZW19Cmg2IHtmb250LXNpemU6IC43NWVtfQoubWNlSXRlbVRhYmxlLCAubWNlSXRlbVRhYmxlIHRkLCAubWNlSXRlbVRhYmxlIHRoLCAubWNlSXRlbVRhYmxlIGNhcHRpb24sIC5tY2VJdGVtVmlzdWFsQWlkIHtib3JkZXI6IDFweCBkYXNoZWQgI0JCQjt9CmEubWNlSXRlbUFuY2hvciB7ZGlzcGxheTppbmxpbmUtYmxvY2s7IHdpZHRoOjExcHggIWltcG9ydGFudDsgaGVpZ2h0OjExcHggICFpbXBvcnRhbnQ7IGJhY2tncm91bmQ6dXJsKC4uL2RlZmF1bHQvaW1nL2l0ZW1zLmdpZikgbm8tcmVwZWF0IDAgMDt9CnNwYW4ubWNlSXRlbU5ic3Age2JhY2tncm91bmQ6ICNERER9CnRkLm1jZVNlbGVjdGVkLCB0aC5tY2VTZWxlY3RlZCB7YmFja2dyb3VuZC1jb2xvcjojMzM5OWZmICFpbXBvcnRhbnR9CmltZyB7Ym9yZGVyOjA7fQp0YWJsZSB7Y3Vyc29yOmRlZmF1bHR9CnRhYmxlIHRkLCB0YWJsZSB0aCB7Y3Vyc29yOnRleHR9CmlucyB7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JlZW47IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6Z3JlZW59CmRlbCB7Y29sb3I6cmVkOyB0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdofQpjaXRlIHtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgYmx1ZX0KYWNyb255bSB7Ym9yZGVyLWJvdHRvbToxcHggZG90dGVkICNDQ0M7IGN1cnNvcjpoZWxwfQphYmJyIHtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI0NDQzsgY3Vyc29yOmhlbHB9CgovKiBJRSAqLwoqIGh0bWwgYm9keSB7CnNjcm9sbGJhci0zZGxpZ2h0LWNvbG9yOiNGMEYwRUU7CnNjcm9sbGJhci1hcnJvdy1jb2xvcjojNjc2NjYyOwpzY3JvbGxiYXItYmFzZS1jb2xvcjojRjBGMEVFOwpzY3JvbGxiYXItZGFya3NoYWRvdy1jb2xvcjojREREOwpzY3JvbGxiYXItZmFjZS1jb2xvcjojRTBFMEREOwpzY3JvbGxiYXItaGlnaGxpZ2h0LWNvbG9yOiNGMEYwRUU7CnNjcm9sbGJhci1zaGFkb3ctY29sb3I6I0YwRjBFRTsKc2Nyb2xsYmFyLXRyYWNrLWNvbG9yOiNGNUY1RjU7Cn0KCmltZzotbW96LWJyb2tlbiB7LW1vei1mb3JjZS1icm9rZW4taW1hZ2UtaWNvbjoxOyB3aWR0aDoyNHB4OyBoZWlnaHQ6MjRweH0KZm9udFtmYWNlPW1jZWlubGluZV0ge2ZvbnQtZmFtaWx5OmluaGVyaXQgIWltcG9ydGFudH0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/o2k7/dialog.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogR2VuZXJpYyAqLwpib2R5IHsKZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOjExcHg7CnNjcm9sbGJhci0zZGxpZ2h0LWNvbG9yOiNGMEYwRUU7CnNjcm9sbGJhci1hcnJvdy1jb2xvcjojNjc2NjYyOwpzY3JvbGxiYXItYmFzZS1jb2xvcjojRjBGMEVFOwpzY3JvbGxiYXItZGFya3NoYWRvdy1jb2xvcjojREREREREOwpzY3JvbGxiYXItZmFjZS1jb2xvcjojRTBFMEREOwpzY3JvbGxiYXItaGlnaGxpZ2h0LWNvbG9yOiNGMEYwRUU7CnNjcm9sbGJhci1zaGFkb3ctY29sb3I6I0YwRjBFRTsKc2Nyb2xsYmFyLXRyYWNrLWNvbG9yOiNGNUY1RjU7CmJhY2tncm91bmQ6I0YwRjBFRTsKcGFkZGluZzowOwptYXJnaW46OHB4IDhweCAwIDhweDsKfQoKaHRtbCB7YmFja2dyb3VuZDojRjBGMEVFO30KdGQge2ZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZToxMHB4O30KdGV4dGFyZWEge3Jlc2l6ZTpub25lO291dGxpbmU6bm9uZTt9CmE6bGluaywgYTp2aXNpdGVkIHtjb2xvcjpibGFjazt9CmE6aG92ZXIge2NvbG9yOiMyQjZGQjY7fQoubm93cmFwIHt3aGl0ZS1zcGFjZTogbm93cmFwfQoKLyogRm9ybXMgKi8KZmllbGRzZXQge21hcmdpbjowOyBwYWRkaW5nOjRweDsgYm9yZGVyOjFweCBzb2xpZCAjOTE5QjlDOyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbDsgZm9udC1zaXplOjEwcHg7fQpsZWdlbmQge2NvbG9yOiMyQjZGQjY7IGZvbnQtd2VpZ2h0OmJvbGQ7fQpsYWJlbC5tc2cge2Rpc3BsYXk6bm9uZTt9CmxhYmVsLmludmFsaWQge2NvbG9yOiNFRTAwMDA7IGRpc3BsYXk6aW5saW5lO30KaW5wdXQuaW52YWxpZCB7Ym9yZGVyOjFweCBzb2xpZCAjRUUwMDAwO30KaW5wdXQge2JhY2tncm91bmQ6I0ZGRjsgYm9yZGVyOjFweCBzb2xpZCAjQ0NDO30KaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEge2ZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZToxMHB4O30KaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEge2JvcmRlcjoxcHggc29saWQgIzgwODA4MDt9CmlucHV0LnJhZGlvIHtib3JkZXI6MXB4IG5vbmUgIzAwMDAwMDsgYmFja2dyb3VuZDp0cmFuc3BhcmVudDsgdmVydGljYWwtYWxpZ246bWlkZGxlO30KaW5wdXQuY2hlY2tib3gge2JvcmRlcjoxcHggbm9uZSAjMDAwMDAwOyBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50OyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fQouaW5wdXRfbm9ib3JkZXIge2JvcmRlcjowO30KCi8qIEJ1dHRvbnMgKi8KI2luc2VydCwgI2NhbmNlbCwgaW5wdXQuYnV0dG9uLCAudXBkYXRlQnV0dG9uIHsKYm9yZGVyOjA7IG1hcmdpbjowOyBwYWRkaW5nOjA7CmZvbnQtd2VpZ2h0OmJvbGQ7CndpZHRoOjk0cHg7IGhlaWdodDoyNnB4OwpiYWNrZ3JvdW5kOnVybCguLi9kZWZhdWx0L2ltZy9idXR0b25zLnBuZykgMCAtMjZweDsKY3Vyc29yOnBvaW50ZXI7CnBhZGRpbmctYm90dG9tOjJweDsKZmxvYXQ6bGVmdDsKfQoKI2luc2VydCB7YmFja2dyb3VuZDp1cmwoLi4vZGVmYXVsdC9pbWcvYnV0dG9ucy5wbmcpIDAgLTUycHh9CiNjYW5jZWwge2JhY2tncm91bmQ6dXJsKC4uL2RlZmF1bHQvaW1nL2J1dHRvbnMucG5nKSAwIDA7IGZsb2F0OnJpZ2h0fQoKLyogQnJvd3NlICovCmEucGlja2NvbG9yLCBhLmJyb3dzZSB7dGV4dC1kZWNvcmF0aW9uOm5vbmV9CmEuYnJvd3NlIHNwYW4ge2Rpc3BsYXk6YmxvY2s7IHdpZHRoOjIwcHg7IGhlaWdodDoxOHB4OyBiYWNrZ3JvdW5kOnVybCguLi8uLi9pbWcvaWNvbnMuZ2lmKSAtODYwcHggMDsgYm9yZGVyOjFweCBzb2xpZCAjRkZGOyBtYXJnaW4tbGVmdDoxcHg7fQoubWNlT2xkQm94TW9kZWwgYS5icm93c2Ugc3BhbiB7d2lkdGg6MjJweDsgaGVpZ2h0OjIwcHg7fQphLmJyb3dzZTpob3ZlciBzcGFuIHtib3JkZXI6MXB4IHNvbGlkICMwQTI0NkE7IGJhY2tncm91bmQtY29sb3I6I0IyQkJEMDt9CmEuYnJvd3NlIHNwYW4uZGlzYWJsZWQge2JvcmRlcjoxcHggc29saWQgd2hpdGU7IG9wYWNpdHk6MC4zOyAtbXMtZmlsdGVyOidhbHBoYShvcGFjaXR5PTMwKSc7IGZpbHRlcjphbHBoYShvcGFjaXR5PTMwKX0KYS5icm93c2U6aG92ZXIgc3Bhbi5kaXNhYmxlZCB7Ym9yZGVyOjFweCBzb2xpZCB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt9CmEucGlja2NvbG9yIHNwYW4ge2Rpc3BsYXk6YmxvY2s7IHdpZHRoOjIwcHg7IGhlaWdodDoxNnB4OyBiYWNrZ3JvdW5kOnVybCguLi8uLi9pbWcvaWNvbnMuZ2lmKSAtODQwcHggMDsgbWFyZ2luLWxlZnQ6MnB4O30KLm1jZU9sZEJveE1vZGVsIGEucGlja2NvbG9yIHNwYW4ge3dpZHRoOjIxcHg7IGhlaWdodDoxN3B4O30KYS5waWNrY29sb3I6aG92ZXIgc3BhbiB7YmFja2dyb3VuZC1jb2xvcjojQjJCQkQwO30KYS5waWNrY29sb3I6aG92ZXIgc3Bhbi5kaXNhYmxlZCB7fQoKLyogQ2hhcm1hcCAqLwp0YWJsZS5jaGFybWFwIHtib3JkZXI6MXB4IHNvbGlkICNBQUE7IHRleHQtYWxpZ246Y2VudGVyfQp0ZC5jaGFybWFwLCAjY2hhcm1hcCBhIHt3aWR0aDoxOHB4OyBoZWlnaHQ6MThweDsgY29sb3I6IzAwMDsgYm9yZGVyOjFweCBzb2xpZCAjQUFBOyB0ZXh0LWFsaWduOmNlbnRlcjsgZm9udC1zaXplOjEycHg7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTsgbGluZS1oZWlnaHQ6IDE4cHg7fQojY2hhcm1hcCBhIHtkaXNwbGF5OmJsb2NrOyBjb2xvcjojMDAwOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgYm9yZGVyOjB9CiNjaGFybWFwIGE6aG92ZXIge2JhY2tncm91bmQ6I0NDQztjb2xvcjojMkI2RkI2fQojY2hhcm1hcCAjY29kZU4ge2ZvbnQtc2l6ZToxMHB4OyBmb250LWZhbWlseTpBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsgdGV4dC1hbGlnbjpjZW50ZXJ9CiNjaGFybWFwICNjb2RlViB7Zm9udC1zaXplOjQwcHg7IGhlaWdodDo4MHB4OyBib3JkZXI6MXB4IHNvbGlkICNBQUE7IHRleHQtYWxpZ246Y2VudGVyfQoKLyogU291cmNlICovCi53b3JkV3JhcENvZGUge3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsgYm9yZGVyOjFweCBub25lICMwMDAwMDA7IGJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7fQoubWNlQWN0aW9uUGFuZWwge21hcmdpbi10b3A6NXB4O30KCi8qIFRhYnMgY2xhc3NlcyAqLwoudGFicyB7d2lkdGg6MTAwJTsgaGVpZ2h0OjE4cHg7IGxpbmUtaGVpZ2h0Om5vcm1hbDsgYmFja2dyb3VuZDp1cmwoLi4vZGVmYXVsdC9pbWcvdGFicy5naWYpIHJlcGVhdC14IDAgLTcycHg7fQoudGFicyB1bCB7bWFyZ2luOjA7IHBhZGRpbmc6MDsgbGlzdC1zdHlsZTpub25lO30KLnRhYnMgbGkge2Zsb2F0OmxlZnQ7IGJhY2tncm91bmQ6dXJsKC4uL2RlZmF1bHQvaW1nL3RhYnMuZ2lmKSBuby1yZXBlYXQgMCAwOyBtYXJnaW46MCAycHggMCAwOyBwYWRkaW5nOjAgMCAwIDEwcHg7IGxpbmUtaGVpZ2h0OjE3cHg7IGhlaWdodDoxOHB4OyBkaXNwbGF5OmJsb2NrO30KLnRhYnMgbGkuY3VycmVudCB7YmFja2dyb3VuZDp1cmwoLi4vZGVmYXVsdC9pbWcvdGFicy5naWYpIG5vLXJlcGVhdCAwIC0xOHB4OyBtYXJnaW4tcmlnaHQ6MnB4O30KLnRhYnMgc3BhbiB7ZmxvYXQ6bGVmdDsgZGlzcGxheTpibG9jazsgYmFja2dyb3VuZDp1cmwoLi4vZGVmYXVsdC9pbWcvdGFicy5naWYpIG5vLXJlcGVhdCByaWdodCAtMzZweDsgcGFkZGluZzowcHggMTBweCAwIDA7fQoudGFicyAuY3VycmVudCBzcGFuIHtiYWNrZ3JvdW5kOnVybCguLi9kZWZhdWx0L2ltZy90YWJzLmdpZikgbm8tcmVwZWF0IHJpZ2h0IC01NHB4O30KLnRhYnMgYSB7dGV4dC1kZWNvcmF0aW9uOm5vbmU7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsOyBmb250LXNpemU6MTBweDt9Ci50YWJzIGE6bGluaywgLnRhYnMgYTp2aXNpdGVkLCAudGFicyBhOmhvdmVyIHtjb2xvcjpibGFjazt9CgovKiBQYW5lbHMgKi8KLnBhbmVsX3dyYXBwZXIgZGl2LnBhbmVsIHtkaXNwbGF5Om5vbmU7fQoucGFuZWxfd3JhcHBlciBkaXYuY3VycmVudCB7ZGlzcGxheTpibG9jazsgd2lkdGg6MTAwJTsgaGVpZ2h0OjMwMHB4OyBvdmVyZmxvdzp2aXNpYmxlO30KLnBhbmVsX3dyYXBwZXIge2JvcmRlcjoxcHggc29saWQgIzkxOUI5QzsgYm9yZGVyLXRvcDowcHg7IHBhZGRpbmc6MTBweDsgcGFkZGluZy10b3A6NXB4OyBjbGVhcjpib3RoOyBiYWNrZ3JvdW5kOndoaXRlO30KCi8qIENvbHVtbnMgKi8KLmNvbHVtbiB7ZmxvYXQ6bGVmdDt9Ci5wcm9wZXJ0aWVzIHt3aWR0aDoxMDAlO30KLnByb3BlcnRpZXMgLmNvbHVtbjEge30KLnByb3BlcnRpZXMgLmNvbHVtbjIge3RleHQtYWxpZ246bGVmdDt9CgovKiBUaXRsZXMgKi8KaDEsIGgyLCBoMywgaDQge2NvbG9yOiMyQjZGQjY7IG1hcmdpbjowOyBwYWRkaW5nOjA7IHBhZGRpbmctdG9wOjVweDt9CmgzIHtmb250LXNpemU6MTRweDt9Ci50aXRsZSB7Zm9udC1zaXplOjEycHg7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOiMyQjZGQjY7fQoKLyogRGlhbG9nIHNwZWNpZmljICovCiNsaW5rIC5wYW5lbF93cmFwcGVyLCAjbGluayBkaXYuY3VycmVudCB7aGVpZ2h0OjEyNXB4O30KI2ltYWdlIC5wYW5lbF93cmFwcGVyLCAjaW1hZ2UgZGl2LmN1cnJlbnQge2hlaWdodDoyMDBweDt9CiNwbHVnaW50YWJsZSB0aGVhZCB7Zm9udC13ZWlnaHQ6Ym9sZDsgYmFja2dyb3VuZDojREREO30KI3BsdWdpbnRhYmxlLCAjYWJvdXQgI3BsdWdpbnRhYmxlIHRkIHtib3JkZXI6MXB4IHNvbGlkICM5MTlCOUM7fQojcGx1Z2ludGFibGUge3dpZHRoOjk2JTsgbWFyZ2luLXRvcDoxMHB4O30KI3BsdWdpbnNjb250YWluZXIge2hlaWdodDoyOTBweDsgb3ZlcmZsb3c6YXV0bzt9CiNjb2xvcnBpY2tlciAjcHJldmlldyB7ZmxvYXQ6cmlnaHQ7IHdpZHRoOjUwcHg7IGhlaWdodDoxNHB4O2xpbmUtaGVpZ2h0OjFweDsgYm9yZGVyOjFweCBzb2xpZCBibGFjazsgbWFyZ2luLWxlZnQ6NXB4O30KI2NvbG9ycGlja2VyICNjb2xvcnMge2Zsb2F0OmxlZnQ7IGJvcmRlcjoxcHggc29saWQgZ3JheTsgY3Vyc29yOmNyb3NzaGFpcjt9CiNjb2xvcnBpY2tlciAjbGlnaHQge2JvcmRlcjoxcHggc29saWQgZ3JheTsgbWFyZ2luLWxlZnQ6NXB4OyBmbG9hdDpsZWZ0O3dpZHRoOjE1cHg7IGhlaWdodDoxNTBweDsgY3Vyc29yOmNyb3NzaGFpcjt9CiNjb2xvcnBpY2tlciAjbGlnaHQgZGl2IHtvdmVyZmxvdzpoaWRkZW47fQojY29sb3JwaWNrZXIgI3ByZXZpZXdibG9jayB7ZmxvYXQ6cmlnaHQ7IHBhZGRpbmctbGVmdDoxMHB4OyBoZWlnaHQ6MjBweDt9CiNjb2xvcnBpY2tlciAucGFuZWxfd3JhcHBlciBkaXYuY3VycmVudCB7aGVpZ2h0OjE3NXB4O30KI2NvbG9ycGlja2VyICNuYW1lZGNvbG9ycyB7d2lkdGg6MTUwcHg7fQojY29sb3JwaWNrZXIgI25hbWVkY29sb3JzIGEge2Rpc3BsYXk6YmxvY2s7IGZsb2F0OmxlZnQ7IHdpZHRoOjEwcHg7IGhlaWdodDoxMHB4OyBtYXJnaW46MXB4IDFweCAwIDA7IG92ZXJmbG93OmhpZGRlbjt9CiNjb2xvcnBpY2tlciAjY29sb3JuYW1lY29udGFpbmVyIHttYXJnaW4tdG9wOjVweDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/o2k7/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAFgAAABCCAMAAADkBuH7AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMAUExURQAAAP///9vOmcrc8a/E34OUw4OTw4SUxISUw5u34KC85JWv1aC74pav1LjL59jk9eDp9lZ9sZ+74p+74aC84qC73sHU7r7R6r3Q6bzP6MPW78LV7sHU7b7Q6cHT7MXX8Mrc9dDh983d8tHg9NXj9trn+dnm99fk9d3q+9zp+t/r+93p+ePt+9/p9ujx/eTt+ePs+Jy53J+73qC83p+73bTJ4r7U7r7T7b3R6r7S6snd9sTX78LV7cjb88XY8Mve9sbZ8MXY783f9s3e8s7f89bl+NXk99Lh9Nbk9s/d7uPv/uLu/eHt/OHs+uTv/Mve9Mjb8cfa8Mve88nc8cvd8srb7tLi9NHh89Df787d7c3c7Nfk89rn9eTw/t/r+Mjb7src79Hi9NXj8d7p9Mjb7dHh8NDg78/f7ury+f//+f//+////f/81f/82v/6xf/83f/84v/+9f/5zP/85f/97f/+9//1t//4y/72yv/86v71yf71yv3qnf3qnvzpnfvpnf/vp/710P/31P310/755f/76f356P/76//87//88P/99P/kgP7kf/7jf//olv3yyv/20/710//77Pnptvvsu/vsvPzvw/vuw/312v/44v/55v756P/77v/QSf/STf/RTf/STv/RTv/TVv/VYP7VZP/WZf/WZv/Xav/adv3fjf/ikP3hj//ilP3hlP3ilP/kmP/lnP7ln/7loP/npfnkp/rlqP/qsvrosvvqt/rptv/uu//uv//vwf/vw//wx//xyvzvyv/yz//z0/zx0P/01v3z1f/23f/33//34f/88//Zdf/ZeP/afP/cgf/cg/3Zg/7ahP3ahP/fi/7fjf/hlP/oq//ruP/xzP/02f/12//78f/Wef/Vef3UeP/Wev3ZhP/56/7JdfzHdP7JdvzIdfy7X/28YP7DaP7Dav3Caf/Oh/7Nhv/PiPu0Vfu0Vvy2V/y1V/27YP/UmP3YqP/aqsq0l8m0mP/Zqfrbtvnatcq0mMmzmOzTtevTtfratf///7/1OEQAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAH5klEQVR42pTXf1wbZx3A8a6nLUJafVi4XclJdQF/bbNYbq4zGEGiEX/SclzBX2OTBuZvnHpZCQkejYIUJJ0yN0quYJkykygd1WSBqnUWAZXgr9XBmZ4FIuDiKZ1AtGx/XO7ypLnzug+vPMkrf7x5Xg93932xQ6fX36rP1emydbn6XH2uPlun0+lyKysr6z764o29KhX07SvSkr7dcYuRoo5S91spiqIoaW0g6urqiAz4Abm7YfgTUCn4rgap+8S3moaGhttyKisr92TA98kdg+H3Q6Xg19TX19ckX/U14lpvyKmrrMvJgBG5j8HwB6BScHFNfU19PSLC0u9Ac+rqKv8f/HEY/iAUBCMkiSAIgpAkiZAkiSAIieB76pSO4ojcHTD8FqgU3IQgCHmEJEmEREgSQUgEQUg8q9Zm25UBf0TukzD8JqgbYBJBqkkRR44gJInvarTV7s6A3yV3AIbfDAXDR8hqEkFElRQP454sm9KO3yF3pzZcjBtQgwHNx3GDAcVRA4riOL53l+1YbSaM4zgAAAAcT/vjFRUVAQAAKCoqKkrBn7oN24dhGIZhh7DXYoewffswDNubZWtU2DGGYU0AgCYMewCGCwsLaQAAXVhYWAjt2IDiuAFHcRw1oLjBYEBxA7p3l63RlnnGBQUFBU2gqaCg4C4YtlgsFhrQFovFYoFuEBTHDSiKojiO5htwFEUNKL43q7H2WFYGXFpaWlraVFpaWpp2gxiNRqORNhqNRqMRgk1mk8m832Q2lZv3m8vLTWZT+X4sy9Zoe2UGnC/3ahimoGDYlG8y55vM5nJzudlkMuWbzKZDu2tttswd75d7Iwy/DwqCzYfNZYfLysrMyVdZmbkM2614uZXJFd4EXFV1uKoquVQdFl9vz6GMVOaz4p1y74XhN0BBj81qhEQQBCGrEYQkq8Xb7549FKUAv04ubcd3QEE7rrBUVFgqKiyWCsvtFRaLxXK7xYLvsRqtmQ+hd8ul7fhDUNCOrZTVSlFH76coK3WUoiir1UqZcoxKO3693Htg+MNQ0GgqLi4uLj5QLL4dEJejOYpHcaccBsNvhUrBBEHkEQcJgiCIEqKEOEgQRAlBWCmKojLgt6XSHqZ6fa5Or8vN1umz9bm5t+p12dl6nf5FxbJTQd/uTCt1FG63u9/9cL/b7e7vd7u/7nb3u/vdyvBnviIFT+mdn4ZKwe5+D+NhGKa3vZfpZRiGYZh2hlGGmzuTNTenwV+Ug+B+xtPOeDztnl6ml2lnGMbjYTweFfi01Ddh+MEvyD2Ygh9uOX78uL3FbrfbaXtLC91it7e02JXhqVNSU2nw5+Qg2NP3aN8NPdrXpwx3uqU60+DPykFwbzD0SCgUCgWDjwSDwWAoGAoGQyEV+HGpDhhu/rxcM7TjUCgYCoWCyTUUDIVCoaAy3PGY1Kk0+KtyENw3NjY2NnZeXM9Ln1XgSalvaMNPer2s1+v1elkv62VZL8t6vWdYlaMIhwEAAITDz8DwVFsbAACAtra2qRT8Q5YVyTMs6/WyXi/LsqwK3BEO0wAAOhy+DMMdPT00AIDu6enpSMEBVta8rFekvSrw5Pj4OA3o8fHxNPjK9PQ0Dejp6enpKynYx54RSfEUWJb1qu740sTExAQ9MTEx8Zc0eGZmZoaemZmZmYHg0eHhs2eHh4fPDg8PPzEspQxfviB1KQ3+jVw6PJwOP3FWDb74M6lJGD71O7lTKXiMm+e4+XmO4/7KcRzHcQvzCwucMvzsL6R+rQ2H5ubmZiOz0dlINBKZm41EopG5SEQZvnBR6gQMn/693OkUHBwZGRn5g7wkV2V4/Bmpx9MuN58cdLn1BXwBvz/g9wcCgUDAF/D7/D6/XxkOX5bqh+HOH8t1QnDfqNg5cTl3bnR0dFQZfvpSsitXYPi5p+Seg0bTcbu9hbbT9hba3iI9lvcqww99WeretFsaaic0pQ8SBJGXR4jl5eURRF6eMnwwlfYwTSQS/0kk/ptIJMRPLyQSicQLL2dKK7fjekb/u35dUJnS8gS5Wxve3tzc2t7c3N7c2t7e3t7e3Nzc2tpSgZuZZCdOaMMb6+vr19bX169tXNu4tr6xsb6+sbGhBn9N6jFt+N9KqcBT35Ka1IbXVtfWVtfW/rG6Kn5YXV1bW1WBO+VB/l1teJHneX7xKs/zizzP/43neZ7n1eBvJ/vOr7TheFwQBEGI/1MQhOcFIR4X4kL8eZXR9FOpX94UHI8LQlwQhHjqRwU+L/VzbTgJiosgxOOCIMRV4M6BAQAAAAMDT2rDy0vLS0vLS8tLy8n+tby0rLbjgQEaAEDfFBxbWYnFVmJ/j8VisZWV2EostrISU/njTQ4ODtKAHhwc9GnDV3me53lxXVzkef4qf1Xtqrg0NDQ0RA8NDQ39SBsW59wCx3EL3Dw3zy3McxynAl/+ntSoNhydi0Qjc5HZSGR2NhqNRKKz0WhUBb74famntOGRtMSJN6ICP/sDqT9pw4GAP+ALBHzizPP7fQG/P6ACX/it1E+0YVery+lodbhcLqfD4Wx1OF2uVofK5TYuj/k/a8NOl8PlcjmdLofT6XC6XE6X0+FU2XH4j1Lhm4AdTqfT2epyOZwuR6vL5XQ6VOGnkwN9dGJCG77lZFd3V9fJrq6uk90nu7u7u7u7urpU4Ie+JHWvNkwQREkJQeQRRIn4bzSRR5QQL2dKK/fSAOI2cs3mFD53AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAFgAAABCCAYAAADT2BHJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAOzSURBVHja7FvPaxNBFH4b9l6PSrEHrwUpNFCFUiLGs169iFhK0IL4p4hQNYeA7bHkIhSKZsW0hGpRsYhFD1ZoMfSmWOsPzGbHQ4pNJpNkZne+TTa8B3uY9M2b975+eTOzH3FevX0vCGCV9TJV1p//H0/PXKA7t+edqHFfb21r5ZueGHcQceUam2u6e29ByDW6QQDBl6ZnMhLAGStxUfmmJ8at1CybK0QASbhel8d1K3FR+RIRbb55p+07NXm2rSZVjTAGo5iHzNc0tuyvmu8GIiaALa2DzNc0tuyvmu+KIIgFYFvrIPM1jS37q+Yzg9EM5h4M7sHIXRmx+yPzNY0t+6vmM4PxDBYxMVhYjXMpc77tb6XyC2s56sSXa1LVmCIShHtalrf1ryIiQaXyhlT8Rpe1zWLrx+9dY8r3A0I9zSaPw1pz/FWvQkREq16l69phYuvE16nRtXWF7X11rkPirDxZg8XuFV/rquzHBLCtdZD5msaW/VXzE8/gfuaox2A/JgZbWgeZr2ls2V81nxkMZzD3YO7B3IMV9uv3n5bxwY+fA9+Dr1+9YuQv16SqEcbg3Z2PXcdhzPO8EVS++UfLkBrdSQtin8pKK8vS4h8ix8xms99PbG1D8s2Nlc0njbUOT4+ebAc4/XUBknCxWHQQcdOf5vUcJ0IAdm7WzP9loWWoVJWJiGjqml0UNpdwu+WZy719Pj8O+a6nZn2TbAAc+JQYC2rA2NFwUL4PhiedKICjxVZqcja+GvECDPy2RcRBqSozg+NgMPdgcA/mFmGnRQhuEdgW0ZnBfuIY7Fx80M6gZzcjMvgYB+dU+91A7C/1YLBSVSbCqsmgb7MEZmRwJRzE/qIE7qJGnZ0ADny7D5rBR48ozTXKKs3ZWV+qQ1QbV2FRLWjVqVSVE7fJidbrqHh6o+0zm5uc+PJQG5/OV2U+RVg5Rfid30Ukl8GDdIpgBqMZ7A8DwEgG415XMoNt4ODXmcF9YvDut+QA/PdgYAFWqsr5vQwk1xwgpud5IzuHt3Dr7x1Gyk+lKjuo3yqb/lZY11C/VUaZq63SmloYVVcHOG0V/P5AdLRGD9ZRak0srKqrYzoKOFLVDgUwH9MYYFtn1T4BnCBWiBozmBnMPZhbBLcIbhHDyuAjVTmE6tsPS1HiTEf1ZQZb2eREtUDO6Oyx6juwLULUE0Tg1h5sovoyg4f2FJEkBvMpghk8VD2YGcwtghmMBxip1Nq2JCngROTmNVVaU8uBEtZVwXMDAvC/AQBwhdbeq6yrlwAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAFgAAABCCAYAAADT2BHJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAoJSURBVHja7FxNjBxHFf5edc/O7trYHjsxYIQiJE7JIQcUTEQOaDUSNy4czJlTkhtInHxBzuYUCU4k4Qg3R/KB844djjEo4oawgnd2IwGKvfKsSbTb1TNTj0N1dVf19GxXt6fWbeSSeqe7uvp11dev3m/V0u3bt1kphVWX4XBIk8mEzfVgMKBV0L1z5453f4fDofc7R6MRCyHQFIvad3CgsrOzw48ePcqPnZ0dZmas4GhavOhm/Ws8xgoaDt14MpmsnHsHgwFClSb9bTprGtL2aieeNgjPavEdo8DzErQ8B/hZBfjgwYMTr/8fis8YawDm5yz4hCVm5iXAkgOyXVNXQn4WZm7Ul6a0qzF4AoCPkyRHhLI/DAblryAwA2SAJgJMR4iyLjCYqfgkFA7gJEl0/5jw4QfvL9x/8+23wcygFn04To71eMH4/fsfLNJ+6y2wGbMnFwkpJaSUSKWETBMkUiJNJKRMIZMUSZIglRJJdqSJhExT/UySQCYSSZIiTRMkMkGSJpBSBgNYmv6kEje2t517N7a3kUj9/qRFH1IpIWWCNFlCO83GnGHlp+TYcCtrxsymIDMA4pxDDYszMZBxCOfcyjlTFw8HEhHZ1CJm7O7u5kDc2N7G7u64mIncRkSYMRHGC7R3C5rM3kOMKZtL+QQngMzDRLmYAOm3kyUCSGSDJbKESthCVIgiArA3HuPG9jb2xmMtFsx9akfbusA4oz3eGzv3mtCPhRAZiJZQLz1MYBCJHFhRoQeK91NQDhZE1su0ttjb3wcJUegNaqeehBAlJiHs7+9DFJyUvYALJvQBuIyWqz9t+PUQyFKBbmNzERBgEekPmIGsT0sav6UBYLCoetx6ZTMrQkQC4Ex3LsPGlgtWg8Xm4cWEENHSd5ANTgswIhGBV9z/OCKhTS/SU5+50BIEgJkyuaw/obEVCQQmhmDD05z/goAXLl92XlS+bluiqJhxlrUIMCHrqquYm3y8SOQmYE6BsmsqhBJAIPYbo+ZgY+tStWZFlUzjJb5gKC+gNI3By/3Qtl1YFJcMsCjew7aJQr4yOFoy0Vpo4VOwIwoQVt+Letql1zRTcsufZrZqqIpN2BElly5dCguwrV/ZtY+NyOAW7qSxqMryPK+zxnzx4kU/gH0bdqWE7G8I2hQi6SmEwNbW1sqTnqPR6DyAwyZ9aED7SwBnm4gSpVRt0lOEyCgbmoPBgMyxCrrD4fBx0z40KGeb0PalHw+HQ2BWBIpZMUhob4nnSp9b97SLTNmLGCI7N8+xYtDa14NN4+FwC+C0tt3dT/7WgvaPGs6oP5dnAZc5OsbsgQZu9lADpxgQVOizOedVZEKVigoLTRVKQc0YFL8ITr8IBzIngJrWzOEerv7g1Xb05//xNMi/6cfBrBikDsAWRxpONUpTUK6aASKHc23OFoLAs4e6MiAXg2um51wCYq2FMawATBu09YmmRQI8Oyo8N4U8qEFk+RSMQgRk7Sgi8Lyw4fJxB3Q0oJTf4FoHnOardZVZfgGVytbBjGUBkWgjFMJzTxDaAjVdLcBEAE+/AjNDVTCfiYMqZh0qdABlHQvOfk07AIhCGsPKA7yoTcR9BqhDv7ZitlBVlVWOmYtkn7CCOQZcAx6haEeldgAWngsogDUQtc1acvD0v56s6dlMpYfg6eOF+BMR5dxYrmcLUC59jHZxrKYYz/0+RAdKHH35KaLD2yeHoXiZc146NyfMwLd+FqjLBBzvAQCu/XaR227+4lxhxcQvNFegqRYR136zuUj7l0fFRd/PihAqz/RVfHxTb1IlVbEgKrXl0JxT0L95/YoLgHPdRgvMADkB5KSadnYPcqLb+gAM6lWDxhUmTxXHGq6mUzDRAGB6qLOtJIDjoxyIm9evAMdHxb1WBsoMeDzWx/5HLu39j4p7j8e6rVfcosyKZU6lJaCXOf20RB+rzIfMjuMkAzdx69uCjKg49m9l4N5y6xvMjpijM6DeNxxLwLYCbBNsOdKnWNQMoJIKTyrq2gJcpvP5nxbrmii5ss3LrWUogVkFNtGgAz3kwUFtABYEiL5/Wx+Ap7yOWF2CEDrG4DgXJibBOga6LEQnsqSpSVcp5nDrYpVErjdq1EsnzDTqnQfWzhbePTPYcHKUrYMgguJipnDWrvDerDUZofUcT724jEXcoh8CiNb925ZKZVaZiIDeRq1htEzH0RJ9R09ZRFC7tVP+QRRPURhT7ywQ9SFMjIrNegAXLa74fsqIDyuMrE7FiqgHmCFaQEwNONgTYADgr70KPvrnCY8s8m++yMT6ywDowiuBEZ4BokarR+fazSAmQGz4t/VylS+8AT76C9B/JZ/jFJGTArLrlskAp+3ma+HwPfcyQPVcdvfuPVx9vaGrTAJ48SerVXKj0SgACiMMh8PVU9VZ5WBl9PEnT/R8VYY5Pi/vVyutEwLwVasvF1usHuDhcPg4DEM029fciIO/89K3VxXjyqXH4PM/AngzEBBbwOygXkT89X437ODzfVhrbbMtA3kyrlhRSTWmCvMpuc+cACaxutQGHuD733upGwD3+KvcY9PRHwE1V851Li/yrLLS3hsXKSI7nTQPjbGqiWSph6CoG0vCYkwnCz5JnZMpnqZDqhR4Xr/whMS8GwCzfOQEeZxzw70lMVBuvywSF6bMwfP6LVoqmnYiGhGr6cQJDDGMV0bOcnprwY+7SKXCfgguhud1e9QIpKYd4eCDfcwrOE8ZpScKP1nXKVAWCpyXOLrg7KCbacGz4/pWvY4A7HSqapqze59IOEH4Mrj6N7SUOPKQ1Wk3AC5zrrMWogK88geoAjtsIfQe/gEAcO3Woq1986cf6pOLPwYuvNYBgPsbBUilBSimzt5dWRlPMkv6s9U/KjkKKiJyMK9fwbV3/+1c4x/oVBHUXwf1N4G1DYh1fZhz6m9mv+v5gTV935xTfx20bs439XVIS2J6qDMa1APuveNmfu+9U9xD3A0RgbVzoIrthMuSm/beNHv3Ljlh+YD/FIkVIKxo2mfv4eb1XwGfvefWi44AzGdEBVu7C/lMnWJGlOXuKPs1+TjbG8RBwB6rGSBKq27u/26hjqkffImGHwf3zuYJS+MR56ssK1ZNKhAQId9Vqczi4eiUhsPpIsCVntxaV0TEhqM6lv2erG5O01WWQOSxX4W6AnDUdyyBPDeXxRnUkgWBRnoIKnJ5rmkRioOngDjjob773QBY9Tdy+Uow+1u0spqxq/jcKKZuM7eySCKrC2oLcwpEm88OBxPM6nXNrZzJVLJsApGZyHaWQ+W77m3GZQv8kFaER2Iy6ggHwwKQSh6dKq9izzm5tBIeT76/w7/MwPHJIoI2v9sZRyOOLv8c/K9fQ8B1hxmM2Mm8sbMCZWGP/mkF3M+9DDpT/59P736a4urrHQBYJxHfWC3VtR8GSHnqMvr473iWyv8GAJ+ZILX/oruaAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/o2k7/ui.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUmVzZXQgKi8KLm8yazdTa2luIHRhYmxlLCAubzJrN1NraW4gdGJvZHksIC5vMms3U2tpbiBhLCAubzJrN1NraW4gaW1nLCAubzJrN1NraW4gdHIsIC5vMms3U2tpbiBkaXYsIC5vMms3U2tpbiB0ZCwgLm8yazdTa2luIGlmcmFtZSwgLm8yazdTa2luIHNwYW4sIC5vMms3U2tpbiAqLCAubzJrN1NraW4gLm1jZVRleHQge2JvcmRlcjowOyBtYXJnaW46MDsgcGFkZGluZzowOyBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50OyB3aGl0ZS1zcGFjZTpub3dyYXA7IHRleHQtZGVjb3JhdGlvbjpub25lOyBmb250LXdlaWdodDpub3JtYWw7IGN1cnNvcjpkZWZhdWx0OyBjb2xvcjojMDAwOyB2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTsgd2lkdGg6YXV0bzsgYm9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlOyB0ZXh0LWFsaWduOmxlZnR9Ci5vMms3U2tpbiBhOmhvdmVyLCAubzJrN1NraW4gYTpsaW5rLCAubzJrN1NraW4gYTp2aXNpdGVkLCAubzJrN1NraW4gYTphY3RpdmUge3RleHQtZGVjb3JhdGlvbjpub25lOyBmb250LXdlaWdodDpub3JtYWw7IGN1cnNvcjpkZWZhdWx0OyBjb2xvcjojMDAwfQoubzJrN1NraW4gdGFibGUgdGQge3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0KCi8qIENvbnRhaW5lcnMgKi8KLm8yazdTa2luIHRhYmxlIHtiYWNrZ3JvdW5kOiNFNUVGRkR9Ci5vMms3U2tpbiBpZnJhbWUge2Rpc3BsYXk6YmxvY2s7IGJhY2tncm91bmQ6I0ZGRn0KLm8yazdTa2luIC5tY2VUb29sYmFyIHtoZWlnaHQ6MjZweH0KCi8qIEV4dGVybmFsICovCi5vMms3U2tpbiAubWNlRXh0ZXJuYWxUb29sYmFyIHtwb3NpdGlvbjphYnNvbHV0ZTsgYm9yZGVyOjFweCBzb2xpZCAjQUJDNkREOyBib3JkZXItYm90dG9tOjA7IGRpc3BsYXk6bm9uZX0KLm8yazdTa2luIC5tY2VFeHRlcm5hbFRvb2xiYXIgdGQubWNlVG9vbGJhciB7cGFkZGluZy1yaWdodDoxM3B4O30KLm8yazdTa2luIC5tY2VFeHRlcm5hbENsb3NlIHtwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjNweDsgcmlnaHQ6M3B4OyB3aWR0aDo3cHg7IGhlaWdodDo3cHg7IGJhY2tncm91bmQ6dXJsKC4uLy4uL2ltZy9pY29ucy5naWYpIC04MjBweCAwfQoKLyogTGF5b3V0ICovCi5vMms3U2tpbiB0YWJsZS5tY2VMYXlvdXQge2JvcmRlcjowOyBib3JkZXItbGVmdDoxcHggc29saWQgI0FCQzZERDsgYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjQUJDNkREfQoubzJrN1NraW4gdGFibGUubWNlTGF5b3V0IHRyLm1jZUZpcnN0IHRkIHtib3JkZXItdG9wOjFweCBzb2xpZCAjQUJDNkREfQoubzJrN1NraW4gdGFibGUubWNlTGF5b3V0IHRyLm1jZUxhc3QgdGQge2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNBQkM2RER9Ci5vMms3U2tpbiB0YWJsZS5tY2VUb29sYmFyLCAubzJrN1NraW4gdHIubWNlRmlyc3QgLm1jZVRvb2xiYXIgdHIgdGQsIC5vMms3U2tpbiB0ci5tY2VMYXN0IC5tY2VUb29sYmFyIHRyIHRkIHtib3JkZXI6MDsgbWFyZ2luOjA7IHBhZGRpbmc6MH0KLm8yazdTa2luIC5tY2VJZnJhbWVDb250YWluZXIge2JvcmRlci10b3A6MXB4IHNvbGlkICNBQkM2REQ7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNBQkM2RER9Ci5vMms3U2tpbiAubWNlU3RhdHVzYmFyIHtkaXNwbGF5OmJsb2NrOyBmb250LWZhbWlseTonTVMgU2FucyBTZXJpZicsc2Fucy1zZXJpZixWZXJkYW5hLEFyaWFsOyBmb250LXNpemU6OXB0OyBsaW5lLWhlaWdodDoxNnB4OyBvdmVyZmxvdzp2aXNpYmxlOyBjb2xvcjojMDAwOyBoZWlnaHQ6MjBweH0KLm8yazdTa2luIC5tY2VTdGF0dXNiYXIgZGl2IHtmbG9hdDpsZWZ0OyBwYWRkaW5nOjJweH0KLm8yazdTa2luIC5tY2VTdGF0dXNiYXIgYS5tY2VSZXNpemUge2Rpc3BsYXk6YmxvY2s7IGZsb2F0OnJpZ2h0OyBiYWNrZ3JvdW5kOnVybCguLi8uLi9pbWcvaWNvbnMuZ2lmKSAtODAwcHggMDsgd2lkdGg6MjBweDsgaGVpZ2h0OjIwcHg7IGN1cnNvcjpzZS1yZXNpemU7IG91dGxpbmU6MH0KLm8yazdTa2luIC5tY2VTdGF0dXNiYXIgYTpob3ZlciB7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0KLm8yazdTa2luIHRhYmxlLm1jZVRvb2xiYXIge21hcmdpbi1sZWZ0OjNweH0KLm8yazdTa2luIC5tY2VUb29sYmFyIC5tY2VUb29sYmFyU3RhcnQgc3BhbiB7ZGlzcGxheTpibG9jazsgYmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbl9iZy5wbmcpIC0yMnB4IDA7IHdpZHRoOjFweDsgaGVpZ2h0OjIycHg7IG1hcmdpbi1sZWZ0OjNweDt9Ci5vMms3U2tpbiAubWNlVG9vbGJhciB0ZC5tY2VGaXJzdCBzcGFuIHttYXJnaW46MH0KLm8yazdTa2luIC5tY2VUb29sYmFyIC5tY2VUb29sYmFyRW5kIHNwYW4ge2Rpc3BsYXk6YmxvY2s7IGJhY2tncm91bmQ6dXJsKGltZy9idXR0b25fYmcucG5nKSAtMjJweCAwOyB3aWR0aDoxcHg7IGhlaWdodDoyMnB4fQoubzJrN1NraW4gLm1jZVRvb2xiYXIgLm1jZVRvb2xiYXJFbmRMaXN0Qm94IHNwYW4sIC5vMms3U2tpbiAubWNlVG9vbGJhciAubWNlVG9vbGJhclN0YXJ0TGlzdEJveCBzcGFuIHtkaXNwbGF5Om5vbmV9Ci5vMms3U2tpbiBzcGFuLm1jZUljb24sIC5vMms3U2tpbiBpbWcubWNlSWNvbiB7ZGlzcGxheTpibG9jazsgd2lkdGg6MjBweDsgaGVpZ2h0OjIwcHh9Ci5vMms3U2tpbiAubWNlSWNvbiB7YmFja2dyb3VuZDp1cmwoLi4vLi4vaW1nL2ljb25zLmdpZikgbm8tcmVwZWF0IDIwcHggMjBweH0KLm8yazdTa2luIHRkLm1jZUNlbnRlciB7dGV4dC1hbGlnbjpjZW50ZXI7fQoubzJrN1NraW4gdGQubWNlQ2VudGVyIHRhYmxlIHttYXJnaW46MCBhdXRvOyB0ZXh0LWFsaWduOmxlZnQ7fQoubzJrN1NraW4gdGQubWNlUmlnaHQgdGFibGUge21hcmdpbjowIDAgMCBhdXRvO30KCi8qIEJ1dHRvbiAqLwoubzJrN1NraW4gLm1jZUJ1dHRvbiB7ZGlzcGxheTpibG9jazsgYmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbl9iZy5wbmcpOyB3aWR0aDoyMnB4OyBoZWlnaHQ6MjJweH0KLm8yazdTa2luIGEubWNlQnV0dG9uIHNwYW4sIC5vMms3U2tpbiBhLm1jZUJ1dHRvbiBpbWcge21hcmdpbi1sZWZ0OjFweH0KLm8yazdTa2luIC5tY2VPbGRCb3hNb2RlbCBhLm1jZUJ1dHRvbiBzcGFuLCAubzJrN1NraW4gLm1jZU9sZEJveE1vZGVsIGEubWNlQnV0dG9uIGltZyB7bWFyZ2luOjAgMCAwIDFweH0KLm8yazdTa2luIGEubWNlQnV0dG9uRW5hYmxlZDpob3ZlciB7YmFja2dyb3VuZC1jb2xvcjojQjJCQkQwOyBiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTIycHh9Ci5vMms3U2tpbiBhLm1jZUJ1dHRvbkFjdGl2ZSwgLm8yazdTa2luIGEubWNlQnV0dG9uU2VsZWN0ZWQge2JhY2tncm91bmQtcG9zaXRpb246MCAtNDRweH0KLm8yazdTa2luIC5tY2VCdXR0b25EaXNhYmxlZCAubWNlSWNvbiB7b3BhY2l0eTowLjM7IC1tcy1maWx0ZXI6J2FscGhhKG9wYWNpdHk9MzApJzsgZmlsdGVyOmFscGhhKG9wYWNpdHk9MzApfQoubzJrN1NraW4gLm1jZUJ1dHRvbkxhYmVsZWQge3dpZHRoOmF1dG99Ci5vMms3U2tpbiAubWNlQnV0dG9uTGFiZWxlZCBzcGFuLm1jZUljb24ge2Zsb2F0OmxlZnR9Ci5vMms3U2tpbiBzcGFuLm1jZUJ1dHRvbkxhYmVsIHtkaXNwbGF5OmJsb2NrOyBmb250LXNpemU6MTBweDsgcGFkZGluZzo0cHggNnB4IDAgMjJweDsgZm9udC1mYW1pbHk6VGFob21hLFZlcmRhbmEsQXJpYWwsSGVsdmV0aWNhfQoubzJrN1NraW4gLm1jZUJ1dHRvbkRpc2FibGVkIC5tY2VCdXR0b25MYWJlbCB7Y29sb3I6Izg4OH0KCi8qIFNlcGFyYXRvciAqLwoubzJrN1NraW4gLm1jZVNlcGFyYXRvciB7ZGlzcGxheTpibG9jazsgYmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbl9iZy5wbmcpIC0yMnB4IDA7IHdpZHRoOjVweDsgaGVpZ2h0OjIycHh9CgovKiBMaXN0Qm94ICovCi5vMms3U2tpbiAubWNlTGlzdEJveCB7bWFyZ2luLWxlZnQ6M3B4fQoubzJrN1NraW4gLm1jZUxpc3RCb3gsIC5vMms3U2tpbiAubWNlTGlzdEJveCBhIHtkaXNwbGF5OmJsb2NrfQoubzJrN1NraW4gLm1jZUxpc3RCb3ggLm1jZVRleHQge3BhZGRpbmctbGVmdDo0cHg7IHRleHQtYWxpZ246bGVmdDsgd2lkdGg6NzBweDsgYm9yZGVyOjFweCBzb2xpZCAjYjNjN2UxOyBib3JkZXItcmlnaHQ6MDsgYmFja2dyb3VuZDojZWFmMmZiOyBmb250LWZhbWlseTpUYWhvbWEsVmVyZGFuYSxBcmlhbCxIZWx2ZXRpY2E7IGZvbnQtc2l6ZToxMXB4OyBoZWlnaHQ6MjBweDsgbGluZS1oZWlnaHQ6MjBweDsgb3ZlcmZsb3c6aGlkZGVufQoubzJrN1NraW4gLm1jZUxpc3RCb3ggLm1jZU9wZW4ge3dpZHRoOjE0cHg7IGhlaWdodDoyMnB4OyBiYWNrZ3JvdW5kOnVybChpbWcvYnV0dG9uX2JnLnBuZykgLTY2cHggMH0KLm8yazdTa2luIHRhYmxlLm1jZUxpc3RCb3hFbmFibGVkOmhvdmVyIC5tY2VUZXh0LCAubzJrN1NraW4gLm1jZUxpc3RCb3hIb3ZlciAubWNlVGV4dCwgLm8yazdTa2luIC5tY2VMaXN0Qm94U2VsZWN0ZWQgLm1jZVRleHQge2JhY2tncm91bmQ6I0ZGRn0KLm8yazdTa2luIHRhYmxlLm1jZUxpc3RCb3hFbmFibGVkOmhvdmVyIC5tY2VPcGVuLCAubzJrN1NraW4gLm1jZUxpc3RCb3hIb3ZlciAubWNlT3BlbiwgLm8yazdTa2luIC5tY2VMaXN0Qm94U2VsZWN0ZWQgLm1jZU9wZW4ge2JhY2tncm91bmQtcG9zaXRpb246LTY2cHggLTIycHh9Ci5vMms3U2tpbiAubWNlTGlzdEJveERpc2FibGVkIC5tY2VUZXh0IHtjb2xvcjpncmF5fQoubzJrN1NraW4gLm1jZUxpc3RCb3hNZW51IHtvdmVyZmxvdzphdXRvOyBvdmVyZmxvdy14OmhpZGRlbn0KLm8yazdTa2luIC5tY2VPbGRCb3hNb2RlbCAubWNlTGlzdEJveCAubWNlVGV4dCB7aGVpZ2h0OjIycHh9Ci5vMms3U2tpbiBzZWxlY3QubWNlTGlzdEJveCB7Zm9udC1mYW1pbHk6VGFob21hLFZlcmRhbmEsQXJpYWwsSGVsdmV0aWNhOyBmb250LXNpemU6MTJweDsgYm9yZGVyOjFweCBzb2xpZCAjYjNjN2UxOyBiYWNrZ3JvdW5kOiNGRkY7fQoKLyogU3BsaXRCdXR0b24gKi8KLm8yazdTa2luIC5tY2VTcGxpdEJ1dHRvbiwgLm8yazdTa2luIC5tY2VTcGxpdEJ1dHRvbiBhLCAubzJrN1NraW4gLm1jZVNwbGl0QnV0dG9uIHNwYW4ge2Rpc3BsYXk6YmxvY2s7IGhlaWdodDoyMnB4fQoubzJrN1NraW4gLm1jZVNwbGl0QnV0dG9uIHtiYWNrZ3JvdW5kOnVybChpbWcvYnV0dG9uX2JnLnBuZyl9Ci5vMms3U2tpbiAubWNlU3BsaXRCdXR0b24gYS5tY2VBY3Rpb24ge3dpZHRoOjIycHh9Ci5vMms3U2tpbiAubWNlU3BsaXRCdXR0b24gc3Bhbi5tY2VBY3Rpb24ge3dpZHRoOjIycHg7IGJhY2tncm91bmQtaW1hZ2U6dXJsKC4uLy4uL2ltZy9pY29ucy5naWYpfQoubzJrN1NraW4gLm1jZVNwbGl0QnV0dG9uIGEubWNlT3BlbiB7d2lkdGg6MTBweDsgYmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbl9iZy5wbmcpIC00NHB4IDB9Ci5vMms3U2tpbiAubWNlU3BsaXRCdXR0b24gc3Bhbi5tY2VPcGVuIHtkaXNwbGF5Om5vbmV9Ci5vMms3U2tpbiB0YWJsZS5tY2VTcGxpdEJ1dHRvbkVuYWJsZWQ6aG92ZXIgYS5tY2VBY3Rpb24sIC5vMms3U2tpbiAubWNlU3BsaXRCdXR0b25Ib3ZlciBhLm1jZUFjdGlvbiwgLm8yazdTa2luIC5tY2VTcGxpdEJ1dHRvblNlbGVjdGVkIHtiYWNrZ3JvdW5kOnVybChpbWcvYnV0dG9uX2JnLnBuZykgMCAtMjJweH0KLm8yazdTa2luIHRhYmxlLm1jZVNwbGl0QnV0dG9uRW5hYmxlZDpob3ZlciBhLm1jZU9wZW4sIC5vMms3U2tpbiAubWNlU3BsaXRCdXR0b25Ib3ZlciBhLm1jZU9wZW4sIC5vMms3U2tpbiAubWNlU3BsaXRCdXR0b25TZWxlY3RlZCBhLm1jZU9wZW4ge2JhY2tncm91bmQtcG9zaXRpb246LTQ0cHggLTQ0cHh9Ci5vMms3U2tpbiAubWNlU3BsaXRCdXR0b25EaXNhYmxlZCAubWNlQWN0aW9uIHtvcGFjaXR5OjAuMzsgLW1zLWZpbHRlcjonYWxwaGEob3BhY2l0eT0zMCknOyBmaWx0ZXI6YWxwaGEob3BhY2l0eT0zMCl9Ci5vMms3U2tpbiAubWNlU3BsaXRCdXR0b25BY3RpdmUge2JhY2tncm91bmQtcG9zaXRpb246MCAtNDRweH0KCi8qIENvbG9yU3BsaXRCdXR0b24gKi8KLm8yazdTa2luIGRpdi5tY2VDb2xvclNwbGl0TWVudSB0YWJsZSB7YmFja2dyb3VuZDojRkZGOyBib3JkZXI6MXB4IHNvbGlkIGdyYXl9Ci5vMms3U2tpbiAubWNlQ29sb3JTcGxpdE1lbnUgdGQge3BhZGRpbmc6MnB4fQoubzJrN1NraW4gLm1jZUNvbG9yU3BsaXRNZW51IGEge2Rpc3BsYXk6YmxvY2s7IHdpZHRoOjlweDsgaGVpZ2h0OjlweDsgb3ZlcmZsb3c6aGlkZGVuOyBib3JkZXI6MXB4IHNvbGlkICM4MDgwODB9Ci5vMms3U2tpbiAubWNlQ29sb3JTcGxpdE1lbnUgdGQubWNlTW9yZUNvbG9ycyB7cGFkZGluZzoxcHggM3B4IDFweCAxcHh9Ci5vMms3U2tpbiAubWNlQ29sb3JTcGxpdE1lbnUgYS5tY2VNb3JlQ29sb3JzIHt3aWR0aDoxMDAlOyBoZWlnaHQ6YXV0bzsgdGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtZmFtaWx5OlRhaG9tYSxWZXJkYW5hLEFyaWFsLEhlbHZldGljYTsgZm9udC1zaXplOjExcHg7IGxpbmUtaGVpZ2h0OjIwcHg7IGJvcmRlcjoxcHggc29saWQgI0ZGRn0KLm8yazdTa2luIC5tY2VDb2xvclNwbGl0TWVudSBhLm1jZU1vcmVDb2xvcnM6aG92ZXIge2JvcmRlcjoxcHggc29saWQgIzBBMjQ2QTsgYmFja2dyb3VuZC1jb2xvcjojQjZCREQyfQoubzJrN1NraW4gYS5tY2VNb3JlQ29sb3JzOmhvdmVyIHtib3JkZXI6MXB4IHNvbGlkICMwQTI0NkF9Ci5vMms3U2tpbiAubWNlQ29sb3JQcmV2aWV3IHttYXJnaW4tbGVmdDoycHg7IHdpZHRoOjE2cHg7IGhlaWdodDo0cHg7IG92ZXJmbG93OmhpZGRlbjsgYmFja2dyb3VuZDojOWE5YjlhO292ZXJmbG93OmhpZGRlbn0KLm8yazdTa2luIC5tY2VfZm9yZWNvbG9yIHNwYW4ubWNlQWN0aW9uLCAubzJrN1NraW4gLm1jZV9iYWNrY29sb3Igc3Bhbi5tY2VBY3Rpb24ge2hlaWdodDoxNXB4O292ZXJmbG93OmhpZGRlbn0KCi8qIE1lbnUgKi8KLm8yazdTa2luIC5tY2VNZW51IHtwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDowOyB0b3A6MDsgei1pbmRleDoxMDAwOyBib3JkZXI6MXB4IHNvbGlkICNBQkM2RER9Ci5vMms3U2tpbiAubWNlTm9JY29ucyBzcGFuLm1jZUljb24ge3dpZHRoOjA7fQoubzJrN1NraW4gLm1jZU5vSWNvbnMgYSAubWNlVGV4dCB7cGFkZGluZy1sZWZ0OjEwcHh9Ci5vMms3U2tpbiAubWNlTWVudSB0YWJsZSB7YmFja2dyb3VuZDojRkZGfQoubzJrN1NraW4gLm1jZU1lbnUgYSwgLm8yazdTa2luIC5tY2VNZW51IHNwYW4sIC5vMms3U2tpbiAubWNlTWVudSB7ZGlzcGxheTpibG9ja30KLm8yazdTa2luIC5tY2VNZW51IHRkIHtoZWlnaHQ6MjBweH0KLm8yazdTa2luIC5tY2VNZW51IGEge3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6M3B4IDAgNHB4IDB9Ci5vMms3U2tpbiAubWNlTWVudSAubWNlVGV4dCB7cG9zaXRpb246cmVsYXRpdmU7IGRpc3BsYXk6YmxvY2s7IGZvbnQtZmFtaWx5OlRhaG9tYSxWZXJkYW5hLEFyaWFsLEhlbHZldGljYTsgY29sb3I6IzAwMDsgY3Vyc29yOmRlZmF1bHQ7IG1hcmdpbjowOyBwYWRkaW5nOjAgMjVweCAwIDI1cHg7IGRpc3BsYXk6YmxvY2t9Ci5vMms3U2tpbiAubWNlTWVudSBzcGFuLm1jZVRleHQsIC5vMms3U2tpbiAubWNlTWVudSAubWNlUHJldmlldyB7Zm9udC1zaXplOjExcHh9Ci5vMms3U2tpbiAubWNlTWVudSBwcmUubWNlVGV4dCB7Zm9udC1mYW1pbHk6TW9ub3NwYWNlfQoubzJrN1NraW4gLm1jZU1lbnUgLm1jZUljb24ge3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6MDsgbGVmdDowOyB3aWR0aDoyMnB4O30KLm8yazdTa2luIC5tY2VNZW51IC5tY2VNZW51SXRlbUVuYWJsZWQgYTpob3ZlciwgLm8yazdTa2luIC5tY2VNZW51IC5tY2VNZW51SXRlbUFjdGl2ZSB7YmFja2dyb3VuZC1jb2xvcjojZGJlY2YzfQoubzJrN1NraW4gdGQubWNlTWVudUl0ZW1TZXBhcmF0b3Ige2JhY2tncm91bmQ6I0RERDsgaGVpZ2h0OjFweH0KLm8yazdTa2luIC5tY2VNZW51SXRlbVRpdGxlIGEge2JvcmRlcjowOyBiYWNrZ3JvdW5kOiNFNUVGRkQ7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNBQkM2RER9Ci5vMms3U2tpbiAubWNlTWVudUl0ZW1UaXRsZSBzcGFuLm1jZVRleHQge2NvbG9yOiMwMDA7IGZvbnQtd2VpZ2h0OmJvbGQ7IHBhZGRpbmctbGVmdDo0cHh9Ci5vMms3U2tpbiAubWNlTWVudUl0ZW1EaXNhYmxlZCAubWNlVGV4dCB7Y29sb3I6Izg4OH0KLm8yazdTa2luIC5tY2VNZW51SXRlbVNlbGVjdGVkIC5tY2VJY29uIHtiYWNrZ3JvdW5kOnVybCguLi9kZWZhdWx0L2ltZy9tZW51X2NoZWNrLmdpZil9Ci5vMms3U2tpbiAubWNlTm9JY29ucyAubWNlTWVudUl0ZW1TZWxlY3RlZCBhIHtiYWNrZ3JvdW5kOnVybCguLi9kZWZhdWx0L2ltZy9tZW51X2Fycm93LmdpZikgbm8tcmVwZWF0IC02cHggY2VudGVyfQoubzJrN1NraW4gLm1jZU1lbnUgc3Bhbi5tY2VNZW51TGluZSB7ZGlzcGxheTpub25lfQoubzJrN1NraW4gLm1jZU1lbnVJdGVtU3ViIGEge2JhY2tncm91bmQ6dXJsKC4uL2RlZmF1bHQvaW1nL21lbnVfYXJyb3cuZ2lmKSBuby1yZXBlYXQgdG9wIHJpZ2h0O30KCi8qIFByb2dyZXNzLFJlc2l6ZSAqLwoubzJrN1NraW4gLm1jZUJsb2NrZXIge3Bvc2l0aW9uOmFic29sdXRlOyBsZWZ0OjA7IHRvcDowOyB6LWluZGV4OjEwMDA7IG9wYWNpdHk6MC41OyAtbXMtZmlsdGVyOidhbHBoYShvcGFjaXR5PTMwKSc7IGZpbHRlcjphbHBoYShvcGFjaXR5PTUwKTsgYmFja2dyb3VuZDojRkZGfQoubzJrN1NraW4gLm1jZVByb2dyZXNzIHtwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDowOyB0b3A6MDsgei1pbmRleDoxMDAxOyBiYWNrZ3JvdW5kOnVybCguLi9kZWZhdWx0L2ltZy9wcm9ncmVzcy5naWYpIG5vLXJlcGVhdDsgd2lkdGg6MzJweDsgaGVpZ2h0OjMycHg7IG1hcmdpbjotMTZweCAwIDAgLTE2cHh9CgovKiBGb3JtYXRzICovCi5vMms3U2tpbiAubWNlX2Zvcm1hdFByZXZpZXcgYSB7Zm9udC1zaXplOjEwcHh9Ci5vMms3U2tpbiAubWNlX3Agc3Bhbi5tY2VUZXh0IHt9Ci5vMms3U2tpbiAubWNlX2FkZHJlc3Mgc3Bhbi5tY2VUZXh0IHtmb250LXN0eWxlOml0YWxpY30KLm8yazdTa2luIC5tY2VfcHJlIHNwYW4ubWNlVGV4dCB7Zm9udC1mYW1pbHk6bW9ub3NwYWNlfQoubzJrN1NraW4gLm1jZV9oMSBzcGFuLm1jZVRleHQge2ZvbnQtd2VpZ2h0OmJvbGRlcjsgZm9udC1zaXplOiAyZW19Ci5vMms3U2tpbiAubWNlX2gyIHNwYW4ubWNlVGV4dCB7Zm9udC13ZWlnaHQ6Ym9sZGVyOyBmb250LXNpemU6IDEuNWVtfQoubzJrN1NraW4gLm1jZV9oMyBzcGFuLm1jZVRleHQge2ZvbnQtd2VpZ2h0OmJvbGRlcjsgZm9udC1zaXplOiAxLjE3ZW19Ci5vMms3U2tpbiAubWNlX2g0IHNwYW4ubWNlVGV4dCB7Zm9udC13ZWlnaHQ6Ym9sZGVyOyBmb250LXNpemU6IDFlbX0KLm8yazdTa2luIC5tY2VfaDUgc3Bhbi5tY2VUZXh0IHtmb250LXdlaWdodDpib2xkZXI7IGZvbnQtc2l6ZTogLjgzZW19Ci5vMms3U2tpbiAubWNlX2g2IHNwYW4ubWNlVGV4dCB7Zm9udC13ZWlnaHQ6Ym9sZGVyOyBmb250LXNpemU6IC43NWVtfQoKLyogVGhlbWUgKi8KLm8yazdTa2luIHNwYW4ubWNlX2JvbGQge2JhY2tncm91bmQtcG9zaXRpb246MCAwfQoubzJrN1NraW4gc3Bhbi5tY2VfaXRhbGljIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02MHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV91bmRlcmxpbmUge2JhY2tncm91bmQtcG9zaXRpb246LTE0MHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9zdHJpa2V0aHJvdWdoIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjBweCAwfQoubzJrN1NraW4gc3Bhbi5tY2VfdW5kbyB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggMH0KLm8yazdTa2luIHNwYW4ubWNlX3JlZG8ge2JhY2tncm91bmQtcG9zaXRpb246LTEwMHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9jbGVhbnVwIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9idWxsaXN0IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9udW1saXN0IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9qdXN0aWZ5bGVmdCB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDYwcHggMH0KLm8yazdTa2luIHNwYW4ubWNlX2p1c3RpZnlyaWdodCB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDgwcHggMH0KLm8yazdTa2luIHNwYW4ubWNlX2p1c3RpZnljZW50ZXIge2JhY2tncm91bmQtcG9zaXRpb246LTQyMHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9qdXN0aWZ5ZnVsbCB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDQwcHggMH0KLm8yazdTa2luIHNwYW4ubWNlX2FuY2hvciB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjAwcHggMH0KLm8yazdTa2luIHNwYW4ubWNlX2luZGVudCB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDAwcHggMH0KLm8yazdTa2luIHNwYW4ubWNlX291dGRlbnQge2JhY2tncm91bmQtcG9zaXRpb246LTU0MHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9saW5rIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01MDBweCAwfQoubzJrN1NraW4gc3Bhbi5tY2VfdW5saW5rIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NDBweCAwfQoubzJrN1NraW4gc3Bhbi5tY2Vfc3ViIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02MDBweCAwfQoubzJrN1NraW4gc3Bhbi5tY2Vfc3VwIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02MjBweCAwfQoubzJrN1NraW4gc3Bhbi5tY2VfcmVtb3ZlZm9ybWF0IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01ODBweCAwfQoubzJrN1NraW4gc3Bhbi5tY2VfbmV3ZG9jdW1lbnQge2JhY2tncm91bmQtcG9zaXRpb246LTUyMHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9pbWFnZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotMzgwcHggMH0KLm8yazdTa2luIHNwYW4ubWNlX2hlbHAge2JhY2tncm91bmQtcG9zaXRpb246LTM0MHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9jb2RlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNjBweCAwfQoubzJrN1NraW4gc3Bhbi5tY2VfaHIge2JhY2tncm91bmQtcG9zaXRpb246LTM2MHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV92aXN1YWxhaWQge2JhY2tncm91bmQtcG9zaXRpb246LTY2MHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9jaGFybWFwIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAwfQoubzJrN1NraW4gc3Bhbi5tY2VfcGFzdGUge2JhY2tncm91bmQtcG9zaXRpb246LTU2MHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9jb3B5IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MDBweCAwfQoubzJrN1NraW4gc3Bhbi5tY2VfY3V0IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02ODBweCAwfQoubzJrN1NraW4gc3Bhbi5tY2VfYmxvY2txdW90ZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjIwcHggMH0KLm8yazdTa2luIC5tY2VfZm9yZWNvbG9yIHNwYW4ubWNlQWN0aW9uIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MjBweCAwfQoubzJrN1NraW4gLm1jZV9iYWNrY29sb3Igc3Bhbi5tY2VBY3Rpb24ge2JhY2tncm91bmQtcG9zaXRpb246LTc2MHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9mb3JlY29sb3JwaWNrZXIge2JhY2tncm91bmQtcG9zaXRpb246LTcyMHB4IDB9Ci5vMms3U2tpbiBzcGFuLm1jZV9iYWNrY29sb3JwaWNrZXIge2JhY2tncm91bmQtcG9zaXRpb246LTc2MHB4IDB9CgovKiBQbHVnaW5zICovCi5vMms3U2tpbiBzcGFuLm1jZV9hZHZociB7YmFja2dyb3VuZC1wb3NpdGlvbjotMHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfbHRyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfcnRsIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfZW1vdGlvbnMge2JhY2tncm91bmQtcG9zaXRpb246LTYwcHggLTIwcHh9Ci5vMms3U2tpbiBzcGFuLm1jZV9mdWxscGFnZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX2Z1bGxzY3JlZW4ge2JhY2tncm91bmQtcG9zaXRpb246LTEwMHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfaWVzcGVsbCB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTIwcHggLTIwcHh9Ci5vMms3U2tpbiBzcGFuLm1jZV9pbnNlcnRkYXRlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX2luc2VydHRpbWUge2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfYWJzb2x1dGUge2JhY2tncm91bmQtcG9zaXRpb246LTE4MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfYmFja3dhcmQge2JhY2tncm91bmQtcG9zaXRpb246LTIwMHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfZm9yd2FyZCB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjIwcHggLTIwcHh9Ci5vMms3U2tpbiBzcGFuLm1jZV9pbnNlcnRfbGF5ZXIge2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfaW5zZXJ0bGF5ZXIge2JhY2tncm91bmQtcG9zaXRpb246LTI2MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfbW92ZWJhY2t3YXJkIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yODBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX21vdmVmb3J3YXJkIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMDBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX21lZGlhIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMjBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX25vbmJyZWFraW5nIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNDBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX3Bhc3RldGV4dCB7YmFja2dyb3VuZC1wb3NpdGlvbjotMzYwcHggLTIwcHh9Ci5vMms3U2tpbiBzcGFuLm1jZV9wYXN0ZXdvcmQge2JhY2tncm91bmQtcG9zaXRpb246LTM4MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2Vfc2VsZWN0YWxsIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MDBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX3ByZXZpZXcge2JhY2tncm91bmQtcG9zaXRpb246LTQyMHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfcHJpbnQge2JhY2tncm91bmQtcG9zaXRpb246LTQ0MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfY2FuY2VsIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00NjBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX3NhdmUge2JhY2tncm91bmQtcG9zaXRpb246LTQ4MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfcmVwbGFjZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTAwcHggLTIwcHh9Ci5vMms3U2tpbiBzcGFuLm1jZV9zZWFyY2gge2JhY2tncm91bmQtcG9zaXRpb246LTUyMHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2Vfc3R5bGVwcm9wcyB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTYwcHggLTIwcHh9Ci5vMms3U2tpbiBzcGFuLm1jZV90YWJsZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTgwcHggLTIwcHh9Ci5vMms3U2tpbiBzcGFuLm1jZV9jZWxsX3Byb3BzIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02MDBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX2RlbGV0ZV90YWJsZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotNjIwcHggLTIwcHh9Ci5vMms3U2tpbiBzcGFuLm1jZV9kZWxldGVfY29sIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NDBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX2RlbGV0ZV9yb3cge2JhY2tncm91bmQtcG9zaXRpb246LTY2MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfY29sX2FmdGVyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02ODBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX2NvbF9iZWZvcmUge2JhY2tncm91bmQtcG9zaXRpb246LTcwMHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2Vfcm93X2FmdGVyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MjBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX3Jvd19iZWZvcmUge2JhY2tncm91bmQtcG9zaXRpb246LTc0MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfbWVyZ2VfY2VsbHMge2JhY2tncm91bmQtcG9zaXRpb246LTc2MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfdGFibGVfcHJvcHMge2JhY2tncm91bmQtcG9zaXRpb246LTk4MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2Vfcm93X3Byb3BzIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03ODBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX3NwbGl0X2NlbGxzIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MDBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX3RlbXBsYXRlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MjBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX3Zpc3VhbGNoYXJzIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04NDBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX2FiYnIge2JhY2tncm91bmQtcG9zaXRpb246LTg2MHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfYWNyb255bSB7YmFja2dyb3VuZC1wb3NpdGlvbjotODgwcHggLTIwcHh9Ci5vMms3U2tpbiBzcGFuLm1jZV9hdHRyaWJzIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi05MDBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX2NpdGUge2JhY2tncm91bmQtcG9zaXRpb246LTkyMHB4IC0yMHB4fQoubzJrN1NraW4gc3Bhbi5tY2VfZGVsIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NDBweCAtMjBweH0KLm8yazdTa2luIHNwYW4ubWNlX2lucyB7YmFja2dyb3VuZC1wb3NpdGlvbjotOTYwcHggLTIwcHh9Ci5vMms3U2tpbiBzcGFuLm1jZV9wYWdlYnJlYWsge2JhY2tncm91bmQtcG9zaXRpb246MCAtNDBweH0KLm8yazdTa2luIHNwYW4ubWNlX3Jlc3RvcmVkcmFmdCB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjBweCAtNDBweH0KLm8yazdTa2luIHNwYW4ubWNlX3NwZWxsY2hlY2tlciB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTQwcHggLTIwcHh9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/o2k7/ui_black.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQmxhY2sgKi8KLm8yazdTa2luQmxhY2sgLm1jZVRvb2xiYXIgLm1jZVRvb2xiYXJTdGFydCBzcGFuLCAubzJrN1NraW5CbGFjayAubWNlVG9vbGJhciAubWNlVG9vbGJhckVuZCBzcGFuLCAubzJrN1NraW5CbGFjayAubWNlQnV0dG9uLCAubzJrN1NraW5CbGFjayAubWNlU3BsaXRCdXR0b24sIC5vMms3U2tpbkJsYWNrIC5tY2VTZXBhcmF0b3IsIC5vMms3U2tpbkJsYWNrIC5tY2VTcGxpdEJ1dHRvbiBhLm1jZU9wZW4sIC5vMms3U2tpbkJsYWNrIC5tY2VMaXN0Qm94IGEubWNlT3BlbiB7YmFja2dyb3VuZC1pbWFnZTp1cmwoaW1nL2J1dHRvbl9iZ19ibGFjay5wbmcpfQoubzJrN1NraW5CbGFjayB0YWJsZSwgLm8yazdTa2luQmxhY2sgLm1jZU1lbnVJdGVtVGl0bGUgYSwgLm8yazdTa2luQmxhY2sgLm1jZU1lbnVJdGVtVGl0bGUgc3Bhbi5tY2VUZXh0LCAubzJrN1NraW5CbGFjayAubWNlU3RhdHVzYmFyIGRpdiwgLm8yazdTa2luQmxhY2sgLm1jZVN0YXR1c2JhciBzcGFuLCAubzJrN1NraW5CbGFjayAubWNlU3RhdHVzYmFyIGEge2JhY2tncm91bmQ6IzUzNTM1MzsgY29sb3I6I0ZGRn0KLm8yazdTa2luQmxhY2sgdGFibGUubWNlTGlzdEJveEVuYWJsZWQgLm1jZVRleHQsIG8yazdTa2luQmxhY2sgLm1jZUxpc3RCb3ggLm1jZVRleHQge2JhY2tncm91bmQ6I0ZGRjsgYm9yZGVyOjFweCBzb2xpZCAjQ0JDRkQ0OyBib3JkZXItYm90dG9tLWNvbG9yOiM5ODlGQTk7IGJvcmRlci1yaWdodDowfQoubzJrN1NraW5CbGFjayB0YWJsZS5tY2VMaXN0Qm94RW5hYmxlZDpob3ZlciAubWNlVGV4dCwgLm8yazdTa2luQmxhY2sgLm1jZUxpc3RCb3hIb3ZlciAubWNlVGV4dCwgLm8yazdTa2luQmxhY2sgLm1jZUxpc3RCb3hTZWxlY3RlZCAubWNlVGV4dCB7YmFja2dyb3VuZDojRkZGOyBib3JkZXI6MXB4IHNvbGlkICNGRkJENjk7IGJvcmRlci1yaWdodDowfQoubzJrN1NraW5CbGFjayAubWNlRXh0ZXJuYWxUb29sYmFyLCAubzJrN1NraW5CbGFjayAubWNlTGlzdEJveCAubWNlVGV4dCwgLm8yazdTa2luQmxhY2sgZGl2Lm1jZU1lbnUsIC5vMms3U2tpbkJsYWNrIHRhYmxlLm1jZUxheW91dCwgLm8yazdTa2luQmxhY2sgLm1jZU1lbnVJdGVtVGl0bGUgYSwgLm8yazdTa2luQmxhY2sgdGFibGUubWNlTGF5b3V0IHRyLm1jZUZpcnN0IHRkLCAubzJrN1NraW5CbGFjayB0YWJsZS5tY2VMYXlvdXQsIC5vMms3U2tpbkJsYWNrIC5tY2VNZW51SXRlbVRpdGxlIGEsIC5vMms3U2tpbkJsYWNrIHRhYmxlLm1jZUxheW91dCB0ci5tY2VMYXN0IHRkLCAubzJrN1NraW5CbGFjayAubWNlSWZyYW1lQ29udGFpbmVyIHtib3JkZXItY29sb3I6ICM1MzUzNTM7fQoubzJrN1NraW5CbGFjayB0YWJsZS5tY2VTcGxpdEJ1dHRvbkVuYWJsZWQ6aG92ZXIgYS5tY2VBY3Rpb24sIC5vMms3U2tpbkJsYWNrIC5tY2VTcGxpdEJ1dHRvbkhvdmVyIGEubWNlQWN0aW9uLCAubzJrN1NraW5CbGFjayAubWNlU3BsaXRCdXR0b25TZWxlY3RlZCB7YmFja2dyb3VuZC1pbWFnZTp1cmwoaW1nL2J1dHRvbl9iZ19ibGFjay5wbmcpfQoubzJrN1NraW5CbGFjayAubWNlTWVudSAubWNlTWVudUl0ZW1FbmFibGVkIGE6aG92ZXIsIC5vMms3U2tpbkJsYWNrIC5tY2VNZW51IC5tY2VNZW51SXRlbUFjdGl2ZSB7YmFja2dyb3VuZC1jb2xvcjojRkZFN0ExfQ==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogU2lsdmVyICovCi5vMms3U2tpblNpbHZlciAubWNlVG9vbGJhciAubWNlVG9vbGJhclN0YXJ0IHNwYW4sIC5vMms3U2tpblNpbHZlciAubWNlQnV0dG9uLCAubzJrN1NraW5TaWx2ZXIgLm1jZVNwbGl0QnV0dG9uLCAubzJrN1NraW5TaWx2ZXIgLm1jZVNlcGFyYXRvciwgLm8yazdTa2luU2lsdmVyIC5tY2VTcGxpdEJ1dHRvbiBhLm1jZU9wZW4sIC5vMms3U2tpblNpbHZlciAubWNlTGlzdEJveCBhLm1jZU9wZW4ge2JhY2tncm91bmQtaW1hZ2U6dXJsKGltZy9idXR0b25fYmdfc2lsdmVyLnBuZyl9Ci5vMms3U2tpblNpbHZlciB0YWJsZSwgLm8yazdTa2luU2lsdmVyIC5tY2VNZW51SXRlbVRpdGxlIGEge2JhY2tncm91bmQ6I2VlZX0KLm8yazdTa2luU2lsdmVyIC5tY2VMaXN0Qm94IC5tY2VUZXh0IHtiYWNrZ3JvdW5kOiNGRkZ9Ci5vMms3U2tpblNpbHZlciAubWNlRXh0ZXJuYWxUb29sYmFyLCAubzJrN1NraW5TaWx2ZXIgLm1jZUxpc3RCb3ggLm1jZVRleHQsIC5vMms3U2tpblNpbHZlciBkaXYubWNlTWVudSwgLm8yazdTa2luU2lsdmVyIHRhYmxlLm1jZUxheW91dCwgLm8yazdTa2luU2lsdmVyIC5tY2VNZW51SXRlbVRpdGxlIGEsIC5vMms3U2tpblNpbHZlciB0YWJsZS5tY2VMYXlvdXQgdHIubWNlRmlyc3QgdGQsIC5vMms3U2tpblNpbHZlciB0YWJsZS5tY2VMYXlvdXQsIC5vMms3U2tpblNpbHZlciAubWNlTWVudUl0ZW1UaXRsZSBhLCAubzJrN1NraW5TaWx2ZXIgdGFibGUubWNlTGF5b3V0IHRyLm1jZUxhc3QgdGQsIC5vMms3U2tpblNpbHZlciAubWNlSWZyYW1lQ29udGFpbmVyIHtib3JkZXItY29sb3I6ICNiYmJ9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/advanced/source_editor.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KCTx0aXRsZT57I2FkdmFuY2VkX2RsZy5jb2RlX3RpdGxlfTwvdGl0bGU+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi90aW55X21jZV9wb3B1cC5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9zb3VyY2VfZWRpdG9yLmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBvbnJlc2l6ZT0icmVzaXplSW5wdXRzKCk7IiBzdHlsZT0iZGlzcGxheTpub25lOyBvdmVyZmxvdzpoaWRkZW47Ij4KCTxmb3JtIG5hbWU9InNvdXJjZSIgb25zdWJtaXQ9InNhdmVDb250ZW50KCk7cmV0dXJuIGZhbHNlOyIgYWN0aW9uPSIjIj4KCQk8ZGl2IHN0eWxlPSJmbG9hdDogbGVmdCIgY2xhc3M9InRpdGxlIj57I2FkdmFuY2VkX2RsZy5jb2RlX3RpdGxlfTwvZGl2PgoKCQk8ZGl2IGlkPSJ3cmFwbGluZSIgc3R5bGU9ImZsb2F0OiByaWdodCI+CgkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0id3JhcGVkIiBpZD0id3JhcGVkIiBvbmNsaWNrPSJ0b2dnbGVXb3JkV3JhcCh0aGlzKTsiIGNsYXNzPSJ3b3JkV3JhcENvZGUiIC8+PGxhYmVsIGZvcj0id3JhcGVkIj57I2FkdmFuY2VkX2RsZy5jb2RlX3dvcmR3cmFwfTwvbGFiZWw+CgkJPC9kaXY+CgoJCTxiciBzdHlsZT0iY2xlYXI6IGJvdGgiIC8+CgoJCTx0ZXh0YXJlYSBuYW1lPSJodG1sU291cmNlIiBpZD0iaHRtbFNvdXJjZSIgcm93cz0iMTUiIGNvbHM9IjEwMCIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLENvdXJpZXIsbW9ub3NwYWNlOyBmb250LXNpemU6IDEycHg7IiBkaXI9Imx0ciIgd3JhcD0ib2ZmIiBjbGFzcz0ibWNlRm9jdXMiPjwvdGV4dGFyZWE+CgoJCTxkaXYgY2xhc3M9Im1jZUFjdGlvblBhbmVsIj4KCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0ieyN1cGRhdGV9IiBpZD0iaW5zZXJ0IiAvPgoJCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJ7I2NhbmNlbH0iIG9uY2xpY2s9InRpbnlNQ0VQb3B1cC5jbG9zZSgpOyIgaWQ9ImNhbmNlbCIgLz4KCQk8L2Rpdj4KCTwvZm9ybT4KPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/editor_template.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7dmFyIGE9dGlueW1jZS5ET007dGlueW1jZS5UaGVtZU1hbmFnZXIucmVxdWlyZUxhbmdQYWNrKCJzaW1wbGUiKTt0aW55bWNlLmNyZWF0ZSgidGlueW1jZS50aGVtZXMuU2ltcGxlVGhlbWUiLHtpbml0OmZ1bmN0aW9uKGMsZCl7dmFyIGU9dGhpcyxiPVsiQm9sZCIsIkl0YWxpYyIsIlVuZGVybGluZSIsIlN0cmlrZXRocm91Z2giLCJJbnNlcnRVbm9yZGVyZWRMaXN0IiwiSW5zZXJ0T3JkZXJlZExpc3QiXSxmPWMuc2V0dGluZ3M7ZS5lZGl0b3I9YztjLm9uSW5pdC5hZGQoZnVuY3Rpb24oKXtjLm9uTm9kZUNoYW5nZS5hZGQoZnVuY3Rpb24oaCxnKXt0aW55bWNlLmVhY2goYixmdW5jdGlvbihpKXtnLmdldChpLnRvTG93ZXJDYXNlKCkpLnNldEFjdGl2ZShoLnF1ZXJ5Q29tbWFuZFN0YXRlKGkpKX0pfSk7Yy5kb20ubG9hZENTUyhkKyIvc2tpbnMvIitmLnNraW4rIi9jb250ZW50LmNzcyIpfSk7YS5sb2FkQ1NTKChmLmVkaXRvcl9jc3M/Yy5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShmLmVkaXRvcl9jc3MpOiIiKXx8ZCsiL3NraW5zLyIrZi5za2luKyIvdWkuY3NzIil9LHJlbmRlclVJOmZ1bmN0aW9uKGgpe3ZhciBlPXRoaXMsaT1oLnRhcmdldE5vZGUsYixjLGQ9ZS5lZGl0b3IsZj1kLmNvbnRyb2xNYW5hZ2VyLGc7aT1hLmluc2VydEFmdGVyKGEuY3JlYXRlKCJzcGFuIix7aWQ6ZC5pZCsiX2NvbnRhaW5lciIsImNsYXNzIjoibWNlRWRpdG9yICIrZC5zZXR0aW5ncy5za2luKyJTaW1wbGVTa2luIn0pLGkpO2k9Zz1hLmFkZChpLCJ0YWJsZSIse2NlbGxQYWRkaW5nOjAsY2VsbFNwYWNpbmc6MCwiY2xhc3MiOiJtY2VMYXlvdXQifSk7aT1jPWEuYWRkKGksInRib2R5Iik7aT1hLmFkZChjLCJ0ciIpO2k9Yj1hLmFkZChhLmFkZChpLCJ0ZCIpLCJkaXYiLHsiY2xhc3MiOiJtY2VJZnJhbWVDb250YWluZXIifSk7aT1hLmFkZChhLmFkZChjLCJ0ciIseyJjbGFzcyI6Imxhc3QifSksInRkIix7ImNsYXNzIjoibWNlVG9vbGJhciBtY2VMYXN0IixhbGlnbjoiY2VudGVyIn0pO2M9ZS50b29sYmFyPWYuY3JlYXRlVG9vbGJhcigidG9vbHMxIik7Yy5hZGQoZi5jcmVhdGVCdXR0b24oImJvbGQiLHt0aXRsZToic2ltcGxlLmJvbGRfZGVzYyIsY21kOiJCb2xkIn0pKTtjLmFkZChmLmNyZWF0ZUJ1dHRvbigiaXRhbGljIix7dGl0bGU6InNpbXBsZS5pdGFsaWNfZGVzYyIsY21kOiJJdGFsaWMifSkpO2MuYWRkKGYuY3JlYXRlQnV0dG9uKCJ1bmRlcmxpbmUiLHt0aXRsZToic2ltcGxlLnVuZGVybGluZV9kZXNjIixjbWQ6IlVuZGVybGluZSJ9KSk7Yy5hZGQoZi5jcmVhdGVCdXR0b24oInN0cmlrZXRocm91Z2giLHt0aXRsZToic2ltcGxlLnN0cmlrZXRyb3VnaF9kZXNjIixjbWQ6IlN0cmlrZXRocm91Z2gifSkpO2MuYWRkKGYuY3JlYXRlU2VwYXJhdG9yKCkpO2MuYWRkKGYuY3JlYXRlQnV0dG9uKCJ1bmRvIix7dGl0bGU6InNpbXBsZS51bmRvX2Rlc2MiLGNtZDoiVW5kbyJ9KSk7Yy5hZGQoZi5jcmVhdGVCdXR0b24oInJlZG8iLHt0aXRsZToic2ltcGxlLnJlZG9fZGVzYyIsY21kOiJSZWRvIn0pKTtjLmFkZChmLmNyZWF0ZVNlcGFyYXRvcigpKTtjLmFkZChmLmNyZWF0ZUJ1dHRvbigiY2xlYW51cCIse3RpdGxlOiJzaW1wbGUuY2xlYW51cF9kZXNjIixjbWQ6Im1jZUNsZWFudXAifSkpO2MuYWRkKGYuY3JlYXRlU2VwYXJhdG9yKCkpO2MuYWRkKGYuY3JlYXRlQnV0dG9uKCJpbnNlcnR1bm9yZGVyZWRsaXN0Iix7dGl0bGU6InNpbXBsZS5idWxsaXN0X2Rlc2MiLGNtZDoiSW5zZXJ0VW5vcmRlcmVkTGlzdCJ9KSk7Yy5hZGQoZi5jcmVhdGVCdXR0b24oImluc2VydG9yZGVyZWRsaXN0Iix7dGl0bGU6InNpbXBsZS5udW1saXN0X2Rlc2MiLGNtZDoiSW5zZXJ0T3JkZXJlZExpc3QifSkpO2MucmVuZGVyVG8oaSk7cmV0dXJue2lmcmFtZUNvbnRhaW5lcjpiLGVkaXRvckNvbnRhaW5lcjpkLmlkKyJfY29udGFpbmVyIixzaXplQ29udGFpbmVyOmcsZGVsdGFIZWlnaHQ6LTIwfX0sZ2V0SW5mbzpmdW5jdGlvbigpe3JldHVybntsb25nbmFtZToiU2ltcGxlIHRoZW1lIixhdXRob3I6Ik1veGllY29kZSBTeXN0ZW1zIEFCIixhdXRob3J1cmw6Imh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20iLHZlcnNpb246dGlueW1jZS5tYWpvclZlcnNpb24rIi4iK3RpbnltY2UubWlub3JWZXJzaW9ufX19KTt0aW55bWNlLlRoZW1lTWFuYWdlci5hZGQoInNpbXBsZSIsdGlueW1jZS50aGVtZXMuU2ltcGxlVGhlbWUpfSkoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/editor_template_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0b3JfdGVtcGxhdGVfc3JjLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KKGZ1bmN0aW9uKCkgew0KCXZhciBET00gPSB0aW55bWNlLkRPTTsNCg0KCS8vIFRlbGwgaXQgdG8gbG9hZCB0aGVtZSBzcGVjaWZpYyBsYW5ndWFnZSBwYWNrKHMpDQoJdGlueW1jZS5UaGVtZU1hbmFnZXIucmVxdWlyZUxhbmdQYWNrKCdzaW1wbGUnKTsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnRoZW1lcy5TaW1wbGVUaGVtZScsIHsNCgkJaW5pdCA6IGZ1bmN0aW9uKGVkLCB1cmwpIHsNCgkJCXZhciB0ID0gdGhpcywgc3RhdGVzID0gWydCb2xkJywgJ0l0YWxpYycsICdVbmRlcmxpbmUnLCAnU3RyaWtldGhyb3VnaCcsICdJbnNlcnRVbm9yZGVyZWRMaXN0JywgJ0luc2VydE9yZGVyZWRMaXN0J10sIHMgPSBlZC5zZXR0aW5nczsNCg0KCQkJdC5lZGl0b3IgPSBlZDsNCg0KCQkJZWQub25Jbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCQllZC5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKGVkLCBjbSkgew0KCQkJCQl0aW55bWNlLmVhY2goc3RhdGVzLCBmdW5jdGlvbihjKSB7DQoJCQkJCQljbS5nZXQoYy50b0xvd2VyQ2FzZSgpKS5zZXRBY3RpdmUoZWQucXVlcnlDb21tYW5kU3RhdGUoYykpOw0KCQkJCQl9KTsNCgkJCQl9KTsNCg0KCQkJCWVkLmRvbS5sb2FkQ1NTKHVybCArICIvc2tpbnMvIiArIHMuc2tpbiArICIvY29udGVudC5jc3MiKTsNCgkJCX0pOw0KDQoJCQlET00ubG9hZENTUygocy5lZGl0b3JfY3NzID8gZWQuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUocy5lZGl0b3JfY3NzKSA6ICcnKSB8fCB1cmwgKyAiL3NraW5zLyIgKyBzLnNraW4gKyAiL3VpLmNzcyIpOw0KCQl9LA0KDQoJCXJlbmRlclVJIDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzLCBuID0gby50YXJnZXROb2RlLCBpYywgdGIsIGVkID0gdC5lZGl0b3IsIGNmID0gZWQuY29udHJvbE1hbmFnZXIsIHNjOw0KDQoJCQluID0gRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGUoJ3NwYW4nLCB7aWQgOiBlZC5pZCArICdfY29udGFpbmVyJywgJ2NsYXNzJyA6ICdtY2VFZGl0b3IgJyArIGVkLnNldHRpbmdzLnNraW4gKyAnU2ltcGxlU2tpbid9KSwgbik7DQoJCQluID0gc2MgPSBET00uYWRkKG4sICd0YWJsZScsIHtjZWxsUGFkZGluZyA6IDAsIGNlbGxTcGFjaW5nIDogMCwgJ2NsYXNzJyA6ICdtY2VMYXlvdXQnfSk7DQoJCQluID0gdGIgPSBET00uYWRkKG4sICd0Ym9keScpOw0KDQoJCQkvLyBDcmVhdGUgaWZyYW1lIGNvbnRhaW5lcg0KCQkJbiA9IERPTS5hZGQodGIsICd0cicpOw0KCQkJbiA9IGljID0gRE9NLmFkZChET00uYWRkKG4sICd0ZCcpLCAnZGl2JywgeydjbGFzcycgOiAnbWNlSWZyYW1lQ29udGFpbmVyJ30pOw0KDQoJCQkvLyBDcmVhdGUgdG9vbGJhciBjb250YWluZXINCgkJCW4gPSBET00uYWRkKERPTS5hZGQodGIsICd0cicsIHsnY2xhc3MnIDogJ2xhc3QnfSksICd0ZCcsIHsnY2xhc3MnIDogJ21jZVRvb2xiYXIgbWNlTGFzdCcsIGFsaWduIDogJ2NlbnRlcid9KTsNCg0KCQkJLy8gQ3JlYXRlIHRvb2xiYXINCgkJCXRiID0gdC50b29sYmFyID0gY2YuY3JlYXRlVG9vbGJhcigidG9vbHMxIik7DQoJCQl0Yi5hZGQoY2YuY3JlYXRlQnV0dG9uKCdib2xkJywge3RpdGxlIDogJ3NpbXBsZS5ib2xkX2Rlc2MnLCBjbWQgOiAnQm9sZCd9KSk7DQoJCQl0Yi5hZGQoY2YuY3JlYXRlQnV0dG9uKCdpdGFsaWMnLCB7dGl0bGUgOiAnc2ltcGxlLml0YWxpY19kZXNjJywgY21kIDogJ0l0YWxpYyd9KSk7DQoJCQl0Yi5hZGQoY2YuY3JlYXRlQnV0dG9uKCd1bmRlcmxpbmUnLCB7dGl0bGUgOiAnc2ltcGxlLnVuZGVybGluZV9kZXNjJywgY21kIDogJ1VuZGVybGluZSd9KSk7DQoJCQl0Yi5hZGQoY2YuY3JlYXRlQnV0dG9uKCdzdHJpa2V0aHJvdWdoJywge3RpdGxlIDogJ3NpbXBsZS5zdHJpa2V0cm91Z2hfZGVzYycsIGNtZCA6ICdTdHJpa2V0aHJvdWdoJ30pKTsNCgkJCXRiLmFkZChjZi5jcmVhdGVTZXBhcmF0b3IoKSk7DQoJCQl0Yi5hZGQoY2YuY3JlYXRlQnV0dG9uKCd1bmRvJywge3RpdGxlIDogJ3NpbXBsZS51bmRvX2Rlc2MnLCBjbWQgOiAnVW5kbyd9KSk7DQoJCQl0Yi5hZGQoY2YuY3JlYXRlQnV0dG9uKCdyZWRvJywge3RpdGxlIDogJ3NpbXBsZS5yZWRvX2Rlc2MnLCBjbWQgOiAnUmVkbyd9KSk7DQoJCQl0Yi5hZGQoY2YuY3JlYXRlU2VwYXJhdG9yKCkpOw0KCQkJdGIuYWRkKGNmLmNyZWF0ZUJ1dHRvbignY2xlYW51cCcsIHt0aXRsZSA6ICdzaW1wbGUuY2xlYW51cF9kZXNjJywgY21kIDogJ21jZUNsZWFudXAnfSkpOw0KCQkJdGIuYWRkKGNmLmNyZWF0ZVNlcGFyYXRvcigpKTsNCgkJCXRiLmFkZChjZi5jcmVhdGVCdXR0b24oJ2luc2VydHVub3JkZXJlZGxpc3QnLCB7dGl0bGUgOiAnc2ltcGxlLmJ1bGxpc3RfZGVzYycsIGNtZCA6ICdJbnNlcnRVbm9yZGVyZWRMaXN0J30pKTsNCgkJCXRiLmFkZChjZi5jcmVhdGVCdXR0b24oJ2luc2VydG9yZGVyZWRsaXN0Jywge3RpdGxlIDogJ3NpbXBsZS5udW1saXN0X2Rlc2MnLCBjbWQgOiAnSW5zZXJ0T3JkZXJlZExpc3QnfSkpOw0KCQkJdGIucmVuZGVyVG8obik7DQoNCgkJCXJldHVybiB7DQoJCQkJaWZyYW1lQ29udGFpbmVyIDogaWMsDQoJCQkJZWRpdG9yQ29udGFpbmVyIDogZWQuaWQgKyAnX2NvbnRhaW5lcicsDQoJCQkJc2l6ZUNvbnRhaW5lciA6IHNjLA0KCQkJCWRlbHRhSGVpZ2h0IDogLTIwDQoJCQl9Ow0KCQl9LA0KDQoJCWdldEluZm8gOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB7DQoJCQkJbG9uZ25hbWUgOiAnU2ltcGxlIHRoZW1lJywNCgkJCQlhdXRob3IgOiAnTW94aWVjb2RlIFN5c3RlbXMgQUInLA0KCQkJCWF1dGhvcnVybCA6ICdodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tJywNCgkJCQl2ZXJzaW9uIDogdGlueW1jZS5tYWpvclZlcnNpb24gKyAiLiIgKyB0aW55bWNlLm1pbm9yVmVyc2lvbg0KCQkJfQ0KCQl9DQoJfSk7DQoNCgl0aW55bWNlLlRoZW1lTWFuYWdlci5hZGQoJ3NpbXBsZScsIHRpbnltY2UudGhlbWVzLlNpbXBsZVRoZW1lKTsNCn0pKCk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/img/icons.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhyAAUAPcAADljwqezxgAAAPHvbiU0T5w4KpW6/aPD+29wcXmOrm6SzzRLY+Ps+3B6jZSnw////zFRjsXS4vfvro+asNClFViGzKO301iE39fZ3bm5uPzLyvLRcFFRUsrL1Jqbmj04Kebx/NAQEKiZiIOXw9Ha7O3YipzL8vn1U7dzYrvL7y9p5LSVFQGbAVR81Y14WfUHB5Ohs8jIyPsuLfbrkfv5xlldZvH5/rLM/Kenp3JbEHaFlbu+wfDx/Z3QFIODhrWqT5WIbUF349fe9LOpioKl8WzB8JGjuZWAyXRs02HNVU9QrZrhaPXYEsS4kTVmtqGvwy1Nqu+6Oebl5P31N8+wUY6O7ODo85/PqNTLtGeW5oCl2brD0U81hGBwhfGzEsuRNvtNR8r+/1l1p6KxynKa6JmZh97l8PPNUqeYa6K/9ODg8NLi/sa0cdbFKoKRn8PJ3ttLS8J6QlJjgPLy8oWKncDQ74qm4tzp/IKo8qiptnOdz3WX9JairrGbUph5GRFNsUZImnxsT2Y+puu0sff5/jC4Q9jHaEJnsmR9qpGr8ZGlzpOIiFJ7u2tXQEtzwbG70UBgmbTB0vhBOD9nqay1y9UuLs7Y+jw8P8ACAr+jMf5iVfD44Ovv9tDV3GKBt6epz2KR8FOI8uD//2GM4IKt/pCv1K/A4sDCxNSTBJOt4tfux8josOjo93NLv4MAANDQjRkVEbHA2YSkxJuYzfggHsaYlk9xrMLY9CFAePv8/V9vj7/I1x1ChP7+/v79/vDv8GaZAPz8/omq9MLa/ou0/f+Zmb6+/v9nZPrkID5Ra+PcsRJTySJYwl6MnLDI3VNwoiVjAPf1+NDh8K6m/ldusbSvov/4/05Yxgk5hkxwl8jZ8N/f4PD48Ki4uMLW/kqydvC2Y7Cztai1x9rm/qK63SJa4hL+ArvI4NqOcoevh6XY8LDQ4M7NzKae5lC4tvTj31VnizJScja/f95bW/i+Wj+uy5CosCgpJ/v7+9/V0KCltKDg8MDt+rCcYICwwP///yH5BAEAAP8ALAAAAADIABQAAAj/AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIENOXJRLpMmTKFNKJKlSYIAEAThuGzGiQ0YSFyru2nVgV0uJJA4IJXGQZcsEF3gJFMC0KdOIHUZUoaYr4wUAA51qRSiUiFciPn82PPCViFCDRitqbaowAK8EFkmEmxt1KoQaC7ciJAEgZkSeVwFcuABWIFaOTv8lRkhEIFkiACJfOEtQ1wOMbBU/Bbkt3LYO2zyMoHY3HEOmQBRGPgzxwNXBksEeYG1QwNLMmm0f3KxZoVmygS8kEHygYFq1m3F3bNJEWbhfoH3oqmF6oS7eHV0fhizYK+2CuhUv/xVPvnZ47AbLRjZimLDxkhczKy/40u9DLK+aSKBBQ5mHbT6Es4APDTFVlUKDsReRawf+s4suRMCGkHzjhTfheRYaNBhhCYT1T3fvYbaWQkgplZteBGGhDH8sSvCKDx7oossCDF2XIUIBHLbWfI5dRRBwAJhYG3kUKsQbegW9FiFR7RVH0HEUyYfkQG7BdV8J+9EggQQllNBEDT7UQGNeAjSYUI72PbSLj4atxouQWe0o54VxqrZaZALxdYGHAlkmom48XqTMK/tx2SUbQIhZXUI2NrTaRIPxmVdWRJZH520S5ZhTiPElN+VFWDTR5aFUrPDBogkZaJJrm5721Ii33X14W1WNRjRYmgJBKdGcZ+qCq0NNAEGqqR6QuRiCbEo0mJMnoehQJwEMdpCfLemSVKzOGtSEC2yU+kGxHl3gl5yyDhSpWH/dWhR8KlVZ0ZcufAuSEd/9JalH5D50gBFMosUuuhTBC1JkvwIMsK4GJ6zwwgY98C/DEEcsMUMBAQA7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/langs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/langs/en.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGlueU1DRS5hZGRJMThuKCdlbi5zaW1wbGUnLHsNCmJvbGRfZGVzYzoiQm9sZCAoQ3RybCtCKSIsDQppdGFsaWNfZGVzYzoiSXRhbGljIChDdHJsK0kpIiwNCnVuZGVybGluZV9kZXNjOiJVbmRlcmxpbmUgKEN0cmwrVSkiLA0Kc3RyaWtldHJvdWdoX2Rlc2M6IlN0cmlrZXRocm91Z2giLA0KYnVsbGlzdF9kZXNjOiJVbm9yZGVyZWQgbGlzdCIsDQpudW1saXN0X2Rlc2M6Ik9yZGVyZWQgbGlzdCIsDQp1bmRvX2Rlc2M6IlVuZG8gKEN0cmwrWikiLA0KcmVkb19kZXNjOiJSZWRvIChDdHJsK1kpIiwNCmNsZWFudXBfZGVzYzoiQ2xlYW51cCBtZXNzeSBjb2RlIg0KfSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/skins/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/skins/default/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/skins/default/content.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ym9keSwgdGQsIHByZSB7Cglmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKCWZvbnQtc2l6ZTogMTBweDsKfQoKYm9keSB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwp9CgoubWNlVmlzdWFsQWlkIHsKCWJvcmRlcjogMXB4IGRhc2hlZCAjQkJCQkJCOwp9CgovKiBNU0lFIHNwZWNpZmljICovCgoqIGh0bWwgYm9keSB7CglzY3JvbGxiYXItM2RsaWdodC1jb2xvcjogI0YwRjBFRTsKCXNjcm9sbGJhci1hcnJvdy1jb2xvcjogIzY3NjY2MjsKCXNjcm9sbGJhci1iYXNlLWNvbG9yOiAjRjBGMEVFOwoJc2Nyb2xsYmFyLWRhcmtzaGFkb3ctY29sb3I6ICNEREREREQ7CglzY3JvbGxiYXItZmFjZS1jb2xvcjogI0UwRTBERDsKCXNjcm9sbGJhci1oaWdobGlnaHQtY29sb3I6ICNGMEYwRUU7CglzY3JvbGxiYXItc2hhZG93LWNvbG9yOiAjRjBGMEVFOwoJc2Nyb2xsYmFyLXRyYWNrLWNvbG9yOiAjRjVGNUY1OwkKfQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/skins/default/ui.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUmVzZXQgKi8KLmRlZmF1bHRTaW1wbGVTa2luIHRhYmxlLCAuZGVmYXVsdFNpbXBsZVNraW4gdGJvZHksIC5kZWZhdWx0U2ltcGxlU2tpbiBhLCAuZGVmYXVsdFNpbXBsZVNraW4gaW1nLCAuZGVmYXVsdFNpbXBsZVNraW4gdHIsIC5kZWZhdWx0U2ltcGxlU2tpbiBkaXYsIC5kZWZhdWx0U2ltcGxlU2tpbiB0ZCwgLmRlZmF1bHRTaW1wbGVTa2luIGlmcmFtZSwgLmRlZmF1bHRTaW1wbGVTa2luIHNwYW4sIC5kZWZhdWx0U2ltcGxlU2tpbiAqIHtib3JkZXI6MDsgbWFyZ2luOjA7IHBhZGRpbmc6MDsgYmFja2dyb3VuZDp0cmFuc3BhcmVudDsgd2hpdGUtc3BhY2U6bm93cmFwOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgZm9udC13ZWlnaHQ6bm9ybWFsOyBjdXJzb3I6ZGVmYXVsdDsgY29sb3I6IzAwMH0KCi8qIENvbnRhaW5lcnMgKi8KLmRlZmF1bHRTaW1wbGVTa2luIHtwb3NpdGlvbjpyZWxhdGl2ZX0KLmRlZmF1bHRTaW1wbGVTa2luIHRhYmxlLm1jZUxheW91dCB7YmFja2dyb3VuZDojRjBGMEVFOyBib3JkZXI6MXB4IHNvbGlkICNDQ0M7fQouZGVmYXVsdFNpbXBsZVNraW4gaWZyYW1lIHtkaXNwbGF5OmJsb2NrOyBiYWNrZ3JvdW5kOiNGRkY7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNDQ0M7fQouZGVmYXVsdFNpbXBsZVNraW4gLm1jZVRvb2xiYXIge2hlaWdodDoyNHB4O30KCi8qIExheW91dCAqLwouZGVmYXVsdFNpbXBsZVNraW4gc3Bhbi5tY2VJY29uLCAuZGVmYXVsdFNpbXBsZVNraW4gaW1nLm1jZUljb24ge2Rpc3BsYXk6YmxvY2s7IHdpZHRoOjIwcHg7IGhlaWdodDoyMHB4fQouZGVmYXVsdFNpbXBsZVNraW4gLm1jZUljb24ge2JhY2tncm91bmQ6dXJsKC4uLy4uL2ltZy9pY29ucy5naWYpIG5vLXJlcGVhdCAyMHB4IDIwcHh9CgovKiBCdXR0b24gKi8KLmRlZmF1bHRTaW1wbGVTa2luIC5tY2VCdXR0b24ge2Rpc3BsYXk6YmxvY2s7IGJvcmRlcjoxcHggc29saWQgI0YwRjBFRTsgd2lkdGg6MjBweDsgaGVpZ2h0OjIwcHh9Ci5kZWZhdWx0U2ltcGxlU2tpbiBhLm1jZUJ1dHRvbkVuYWJsZWQ6aG92ZXIge2JvcmRlcjoxcHggc29saWQgIzBBMjQ2QTsgYmFja2dyb3VuZC1jb2xvcjojQjJCQkQwfQouZGVmYXVsdFNpbXBsZVNraW4gYS5tY2VCdXR0b25BY3RpdmUge2JvcmRlcjoxcHggc29saWQgIzBBMjQ2QTsgYmFja2dyb3VuZC1jb2xvcjojQzJDQkUwfQouZGVmYXVsdFNpbXBsZVNraW4gLm1jZUJ1dHRvbkRpc2FibGVkIHNwYW4ge29wYWNpdHk6MC4zOyAtbXMtZmlsdGVyOidhbHBoYShvcGFjaXR5PTMwKSc7IGZpbHRlcjphbHBoYShvcGFjaXR5PTMwKX0KCi8qIFNlcGFyYXRvciAqLwouZGVmYXVsdFNpbXBsZVNraW4gLm1jZVNlcGFyYXRvciB7ZGlzcGxheTpibG9jazsgYmFja2dyb3VuZDp1cmwoLi4vLi4vaW1nL2ljb25zLmdpZikgLTE4MHB4IDA7IHdpZHRoOjJweDsgaGVpZ2h0OjIwcHg7IG1hcmdpbjowIDJweCAwIDRweH0KCi8qIFRoZW1lICovCi5kZWZhdWx0U2ltcGxlU2tpbiBzcGFuLm1jZV9ib2xkIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMH0KLmRlZmF1bHRTaW1wbGVTa2luIHNwYW4ubWNlX2l0YWxpYyB7YmFja2dyb3VuZC1wb3NpdGlvbjotNjBweCAwfQouZGVmYXVsdFNpbXBsZVNraW4gc3Bhbi5tY2VfdW5kZXJsaW5lIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDBweCAwfQouZGVmYXVsdFNpbXBsZVNraW4gc3Bhbi5tY2Vfc3RyaWtldGhyb3VnaCB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTIwcHggMH0KLmRlZmF1bHRTaW1wbGVTa2luIHNwYW4ubWNlX3VuZG8ge2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IDB9Ci5kZWZhdWx0U2ltcGxlU2tpbiBzcGFuLm1jZV9yZWRvIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDBweCAwfQouZGVmYXVsdFNpbXBsZVNraW4gc3Bhbi5tY2VfY2xlYW51cCB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDBweCAwfQouZGVmYXVsdFNpbXBsZVNraW4gc3Bhbi5tY2VfaW5zZXJ0dW5vcmRlcmVkbGlzdCB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjBweCAwfQouZGVmYXVsdFNpbXBsZVNraW4gc3Bhbi5tY2VfaW5zZXJ0b3JkZXJlZGxpc3Qge2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggMH0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/skins/o2k7/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/skins/o2k7/content.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ym9keSwgdGQsIHByZSB7Zm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOjEwcHg7fQoKYm9keSB7YmFja2dyb3VuZDogI0ZGRjt9Ci5tY2VWaXN1YWxBaWQge2JvcmRlcjogMXB4IGRhc2hlZCAjQkJCO30KCi8qIElFICovCgoqIGh0bWwgYm9keSB7CnNjcm9sbGJhci0zZGxpZ2h0LWNvbG9yOiAjRjBGMEVFOwpzY3JvbGxiYXItYXJyb3ctY29sb3I6ICM2NzY2NjI7CnNjcm9sbGJhci1iYXNlLWNvbG9yOiAjRjBGMEVFOwpzY3JvbGxiYXItZGFya3NoYWRvdy1jb2xvcjogI0RERERERDsKc2Nyb2xsYmFyLWZhY2UtY29sb3I6ICNFMEUwREQ7CnNjcm9sbGJhci1oaWdobGlnaHQtY29sb3I6ICNGMEYwRUU7CnNjcm9sbGJhci1zaGFkb3ctY29sb3I6ICNGMEYwRUU7CnNjcm9sbGJhci10cmFjay1jb2xvcjogI0Y1RjVGNTsJCn0K]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/skins/o2k7/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABCCAMAAAAST2RjAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMAUExURQAAAP///9vOmcrc8a/E34OUw4OTw4SUxISUw5u34KC85JWv1aC74pav1LjL59jk9eDp9lZ9sZ+74p+74aC84qC73sHU7r7R6r3Q6bzP6MPW78LV7sHU7b7Q6cHT7MXX8Mrc9dDh983d8tHg9NXj9trn+dnm99fk9d3q+9zp+t/r+93p+ePt+9/p9ujx/eTt+ePs+Jy53J+73qC83p+73bTJ4r7U7r7T7b3R6r7S6snd9sTX78LV7cjb88XY8Mve9sbZ8MXY783f9s3e8s7f89bl+NXk99Lh9Nbk9s/d7uPv/uLu/eHt/OHs+uTv/Mve9Mjb8cfa8Mve88nc8cvd8srb7tLi9NHh89Df787d7c3c7Nfk89rn9eTw/t/r+Mjb7src79Hi9NXj8d7p9Mjb7dHh8NDg78/f7ury+f//+f//+////f/81f/82v/6xf/83f/84v/+9f/5zP/85f/97f/+9//1t//4y/72yv/86v71yf71yv3qnf3qnvzpnfvpnf/vp/710P/31P310/755f/76f356P/76//87//88P/99P/kgP7kf/7jf//olv3yyv/20/710//77Pnptvvsu/vsvPzvw/vuw/312v/44v/55v756P/77v/QSf/STf/RTf/STv/RTv/TVv/VYP7VZP/WZf/WZv/Xav/adv3fjf/ikP3hj//ilP3hlP3ilP/kmP/lnP7ln/7loP/npfnkp/rlqP/qsvrosvvqt/rptv/uu//uv//vwf/vw//wx//xyvzvyv/yz//z0/zx0P/01v3z1f/23f/33//34f/88//Zdf/ZeP/afP/cgf/cg/3Zg/7ahP3ahP/fi/7fjf/hlP/oq//ruP/xzP/02f/12//78f/Wef/Vef3UeP/Wev3ZhP/56/7JdfzHdP7JdvzIdfy7X/28YP7DaP7Dav3Caf/Oh/7Nhv/PiPu0Vfu0Vvy2V/y1V/27YP/UmP3YqP/aqsq0l8m0mP/Zqfrbtvnatcq0mMmzmOzTtevTtfratf///7/1OEQAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAE8UlEQVR42mzV72/aRhgH8EanpVEgUUTBdWNPlZrXVVE4rZUsWUQgId4lzcUJezOqpWT/QWggtuSIvSFIQZXSF0h2X4RK2cBSqlSy/wqM9pJ4yEsCg6zMG+kgbKV7YdItcF90j0/iw3P4x8m3nG73HbfL6Zx0utwut8s96XQ6na5wOBz5+tP/c2tsjuNWuWchjuM47rquw0gkAm/Ch+vX+cY+rKyvr991hMPhqZtwJhqNrgxGdMWuUcoRCUccN6F3JboSjQIbXv+GcEQi4WEIEAIAAIAQAgghAAAC9FRkZOnvAADoKUIIIIAQAAgAgOiJtVhsHAMRAMvIxuApQIge34it3R6GT9EyAsBWyF788URspKOXpgiKImZpmqIImqAIgqbp6fHY87Uh+O1d8h5JkiRJPiG/JJ+Q9+6RJDk9EdsY6UgRNE3RBE0TFEFTFEXQFDE9HtuIDf3HGYKmKYIgCJomZimaIAiKoKcnNtaeTwxBhmUY9j7DMgvsfXZhgWGZhfvkRGwj9sUwZGYZdpZh2QV2gWUYZpZhmSe312Kx4Y7sEutf8vv97GD4/ayfvD16eWYWF5cWFwdlcckeXzm4OW7oXj9cBggAANAyAAgt27fn8RTHDcOZQDAQCAYCwWAg+CAQDAaDD4JBeio0Fxp6KB6GuFCI41afcVyIW+U4LhQKcYxjbqTjmNfr9Xofee3DI7usOkaXhhB64DyEEEIf9MF5CKEPwhDHcdxN6Ha7nG6na9LpnnS7XHfczslJt9P9aSS3xlKpVC71IpdKpXK5VOr7VCqXyqUwMJXLillRFPd29sQ9URRFUdwRRQzMidkdMZvdye6Je+KOKIrZrJjNYuCLxNbWVjwRj8fjm/FEYjMRjycScQzM7r/aH8qr/X0M3FO1l5qmaar6UlVVVVM1VdU0XEdNUzVNUwdVUzVN01QM3D8+Pj4+fmfXd9dzDPxBkmRJkiRJlmRJliVZlqTXMgb+KMs2eS3LkiRLkizLMg4q8udvJVmyqYSDBfm1TexVZVmW8B2P8vmDg3w+f5DP59/kr4OH+ZvwzQEWHhsVw6hUDMP42TAMwzBOKicnBgZq5XK5pJeqJb2q6+WSrlf1sq5joHp4eHj40+cyqLg7oxSUYlEpFhVFUZSCUiwUC8UiDu4f2Xlrl7dvj46OjnBbYSseT2zGN+OJzXji+rGcxkAI5yGEHg+04/F4IPR4MLDX6/3V6/3d6/Xs2Yder9f7gIEfR/LPx48WBva73at+t9vvXvX7/X6/2+1eXV3hYKfdbl+22+3LzmXnst3ptNudTgcH/8QFBy+aFxfNi4vfmk170mxeXDRx8Mw0TfPs1DTNM9M0fzFN0zRNHGy1LMuyrNbvlmW9t6xWy2pZrfd42GpZVsuyrNZ/HwwcALtYVqtlWVYLB2vntfPz2nntvDbIH7XzGg7WG416vVH/tV6v1xuNeqNebzTquJM5NU3TNO16dmaa5ql5ij1re5+cGIZxYlSMinFSMQwDB6tlvaqX9ZKul0rVqq5XS9VqFQcPb8TeMYc4qChFpaAoBXvPFIsFpVhUcFDYFvjkdlIQBD6Z5LeTvCBsJ3GXhxeSgiDwvJDk+SQvCLzAJ3lcRz7J8zy/LQhJXkhuCwLPJ/FwbDedSad30+n0bmY3k8lkMul02sLuQujzQeiB0Ge/BqEH+uAo/HcAkNZNYMln60sAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/themes/simple/skins/o2k7/ui.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUmVzZXQgKi8KLm8yazdTaW1wbGVTa2luIHRhYmxlLCAubzJrN1NpbXBsZVNraW4gdGJvZHksIC5vMms3U2ltcGxlU2tpbiBhLCAubzJrN1NpbXBsZVNraW4gaW1nLCAubzJrN1NpbXBsZVNraW4gdHIsIC5vMms3U2ltcGxlU2tpbiBkaXYsIC5vMms3U2ltcGxlU2tpbiB0ZCwgLm8yazdTaW1wbGVTa2luIGlmcmFtZSwgLm8yazdTaW1wbGVTa2luIHNwYW4sIC5vMms3U2ltcGxlU2tpbiAqIHtib3JkZXI6MDsgbWFyZ2luOjA7IHBhZGRpbmc6MDsgYmFja2dyb3VuZDp0cmFuc3BhcmVudDsgd2hpdGUtc3BhY2U6bm93cmFwOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgZm9udC13ZWlnaHQ6bm9ybWFsOyBjdXJzb3I6ZGVmYXVsdDsgY29sb3I6IzAwMH0KCi8qIENvbnRhaW5lcnMgKi8KLm8yazdTaW1wbGVTa2luIHtwb3NpdGlvbjpyZWxhdGl2ZX0KLm8yazdTaW1wbGVTa2luIHRhYmxlLm1jZUxheW91dCB7YmFja2dyb3VuZDojRTVFRkZEOyBib3JkZXI6MXB4IHNvbGlkICNBQkM2REQ7fQoubzJrN1NpbXBsZVNraW4gaWZyYW1lIHtkaXNwbGF5OmJsb2NrOyBiYWNrZ3JvdW5kOiNGRkY7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNBQkM2REQ7fQoubzJrN1NpbXBsZVNraW4gLm1jZVRvb2xiYXIge2hlaWdodDoyNnB4O30KCi8qIExheW91dCAqLwoubzJrN1NpbXBsZVNraW4gLm1jZVRvb2xiYXIgLm1jZVRvb2xiYXJTdGFydCBzcGFuIHtkaXNwbGF5OmJsb2NrOyBiYWNrZ3JvdW5kOnVybChpbWcvYnV0dG9uX2JnLnBuZykgLTIycHggMDsgd2lkdGg6MXB4OyBoZWlnaHQ6MjJweDsgfQoubzJrN1NpbXBsZVNraW4gLm1jZVRvb2xiYXIgLm1jZVRvb2xiYXJFbmQgc3BhbiB7ZGlzcGxheTpibG9jazsgYmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbl9iZy5wbmcpIC0yMnB4IDA7IHdpZHRoOjFweDsgaGVpZ2h0OjIycHh9Ci5vMms3U2ltcGxlU2tpbiBzcGFuLm1jZUljb24sIC5vMms3U2ltcGxlU2tpbiBpbWcubWNlSWNvbiB7ZGlzcGxheTpibG9jazsgd2lkdGg6MjBweDsgaGVpZ2h0OjIwcHh9Ci5vMms3U2ltcGxlU2tpbiAubWNlSWNvbiB7YmFja2dyb3VuZDp1cmwoLi4vLi4vaW1nL2ljb25zLmdpZikgbm8tcmVwZWF0IDIwcHggMjBweH0KCi8qIEJ1dHRvbiAqLwoubzJrN1NpbXBsZVNraW4gLm1jZUJ1dHRvbiB7ZGlzcGxheTpibG9jazsgYmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbl9iZy5wbmcpOyB3aWR0aDoyMnB4OyBoZWlnaHQ6MjJweH0KLm8yazdTaW1wbGVTa2luIGEubWNlQnV0dG9uIHNwYW4sIC5vMms3U2ltcGxlU2tpbiBhLm1jZUJ1dHRvbiBpbWcge21hcmdpbjoxcHggMCAwIDFweH0KLm8yazdTaW1wbGVTa2luIGEubWNlQnV0dG9uRW5hYmxlZDpob3ZlciB7YmFja2dyb3VuZC1jb2xvcjojQjJCQkQwOyBiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTIycHh9Ci5vMms3U2ltcGxlU2tpbiBhLm1jZUJ1dHRvbkFjdGl2ZSB7YmFja2dyb3VuZC1wb3NpdGlvbjowIC00NHB4fQoubzJrN1NpbXBsZVNraW4gLm1jZUJ1dHRvbkRpc2FibGVkIHNwYW4ge29wYWNpdHk6MC4zOyAtbXMtZmlsdGVyOidhbHBoYShvcGFjaXR5PTMwKSc7IGZpbHRlcjphbHBoYShvcGFjaXR5PTMwKX0KCi8qIFNlcGFyYXRvciAqLwoubzJrN1NpbXBsZVNraW4gLm1jZVNlcGFyYXRvciB7ZGlzcGxheTpibG9jazsgYmFja2dyb3VuZDp1cmwoaW1nL2J1dHRvbl9iZy5wbmcpIC0yMnB4IDA7IHdpZHRoOjVweDsgaGVpZ2h0OjIycHh9CgovKiBUaGVtZSAqLwoubzJrN1NpbXBsZVNraW4gc3Bhbi5tY2VfYm9sZCB7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9Ci5vMms3U2ltcGxlU2tpbiBzcGFuLm1jZV9pdGFsaWMge2JhY2tncm91bmQtcG9zaXRpb246LTYwcHggMH0KLm8yazdTaW1wbGVTa2luIHNwYW4ubWNlX3VuZGVybGluZSB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQwcHggMH0KLm8yazdTaW1wbGVTa2luIHNwYW4ubWNlX3N0cmlrZXRocm91Z2gge2JhY2tncm91bmQtcG9zaXRpb246LTEyMHB4IDB9Ci5vMms3U2ltcGxlU2tpbiBzcGFuLm1jZV91bmRvIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAwfQoubzJrN1NpbXBsZVNraW4gc3Bhbi5tY2VfcmVkbyB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTAwcHggMH0KLm8yazdTaW1wbGVTa2luIHNwYW4ubWNlX2NsZWFudXAge2JhY2tncm91bmQtcG9zaXRpb246LTQwcHggMH0KLm8yazdTaW1wbGVTa2luIHNwYW4ubWNlX2luc2VydHVub3JkZXJlZGxpc3Qge2JhY2tncm91bmQtcG9zaXRpb246LTIwcHggMH0KLm8yazdTaW1wbGVTa2luIHNwYW4ubWNlX2luc2VydG9yZGVyZWRsaXN0IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IDB9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/tiny_mce.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGQpe3ZhciBhPS9eXHMqfFxzKiQvZyxlLGM9IkIiLnJlcGxhY2UoL0EoLil8Qi8sIiQxIik9PT0iJDEiO3ZhciBiPXttYWpvclZlcnNpb246IjMiLG1pbm9yVmVyc2lvbjoiMy45LjMiLHJlbGVhc2VEYXRlOiIyMDEwLTEyLTIwIixfaW5pdDpmdW5jdGlvbigpe3ZhciBzPXRoaXMscT1kb2N1bWVudCxvPW5hdmlnYXRvcixnPW8udXNlckFnZW50LG0sZixsLGssaixyO3MuaXNPcGVyYT1kLm9wZXJhJiZvcGVyYS5idWlsZE51bWJlcjtzLmlzV2ViS2l0PS9XZWJLaXQvLnRlc3QoZyk7cy5pc0lFPSFzLmlzV2ViS2l0JiYhcy5pc09wZXJhJiYoL01TSUUvZ2kpLnRlc3QoZykmJigvRXhwbG9yZXIvZ2kpLnRlc3Qoby5hcHBOYW1lKTtzLmlzSUU2PXMuaXNJRSYmL01TSUUgWzU2XS8udGVzdChnKTtzLmlzR2Vja289IXMuaXNXZWJLaXQmJi9HZWNrby8udGVzdChnKTtzLmlzTWFjPWcuaW5kZXhPZigiTWFjIikhPS0xO3MuaXNBaXI9L2Fkb2JlYWlyL2kudGVzdChnKTtzLmlzSURldmljZT0vKGlQYWR8aVBob25lKS8udGVzdChnKTtpZihkLnRpbnlNQ0VQcmVJbml0KXtzLnN1ZmZpeD10aW55TUNFUHJlSW5pdC5zdWZmaXg7cy5iYXNlVVJMPXRpbnlNQ0VQcmVJbml0LmJhc2U7cy5xdWVyeT10aW55TUNFUHJlSW5pdC5xdWVyeTtyZXR1cm59cy5zdWZmaXg9IiI7Zj1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIik7Zm9yKG09MDttPGYubGVuZ3RoO20rKyl7aWYocj1mW21dLmhyZWYpe2lmKC9eaHR0cHM/OlwvXC9bXlwvXSskLy50ZXN0KHIpKXtyKz0iLyJ9az1yP3IubWF0Y2goLy4qXC8vKVswXToiIn19ZnVuY3Rpb24gaChpKXtpZihpLnNyYyYmL3RpbnlfbWNlKHxfZ3ppcHxfanF1ZXJ5fF9wcm90b3R5cGV8X2Z1bGwpKF9kZXZ8X3NyYyk/LmpzLy50ZXN0KGkuc3JjKSl7aWYoL18oc3JjfGRldilcLmpzL2cudGVzdChpLnNyYykpe3Muc3VmZml4PSJfc3JjIn1pZigoaj1pLnNyYy5pbmRleE9mKCI/IikpIT0tMSl7cy5xdWVyeT1pLnNyYy5zdWJzdHJpbmcoaisxKX1zLmJhc2VVUkw9aS5zcmMuc3Vic3RyaW5nKDAsaS5zcmMubGFzdEluZGV4T2YoIi8iKSk7aWYoayYmcy5iYXNlVVJMLmluZGV4T2YoIjovLyIpPT0tMSYmcy5iYXNlVVJMLmluZGV4T2YoIi8iKSE9PTApe3MuYmFzZVVSTD1rK3MuYmFzZVVSTH1yZXR1cm4gcy5iYXNlVVJMfXJldHVybiBudWxsfWY9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKG09MDttPGYubGVuZ3RoO20rKyl7aWYoaChmW21dKSl7cmV0dXJufX1sPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTtpZihsKXtmPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2ZvcihtPTA7bTxmLmxlbmd0aDttKyspe2lmKGgoZlttXSkpe3JldHVybn19fXJldHVybn0saXM6ZnVuY3Rpb24oZyxmKXtpZighZil7cmV0dXJuIGchPT1lfWlmKGY9PSJhcnJheSImJihnLmhhc093blByb3BlcnR5JiZnIGluc3RhbmNlb2YgQXJyYXkpKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gdHlwZW9mKGcpPT1mfSxlYWNoOmZ1bmN0aW9uKGksZixoKXt2YXIgaixnO2lmKCFpKXtyZXR1cm4gMH1oPWh8fGk7aWYoaS5sZW5ndGghPT1lKXtmb3Ioaj0wLGc9aS5sZW5ndGg7ajxnO2orKyl7aWYoZi5jYWxsKGgsaVtqXSxqLGkpPT09ZmFsc2Upe3JldHVybiAwfX19ZWxzZXtmb3IoaiBpbiBpKXtpZihpLmhhc093blByb3BlcnR5KGopKXtpZihmLmNhbGwoaCxpW2pdLGosaSk9PT1mYWxzZSl7cmV0dXJuIDB9fX19cmV0dXJuIDF9LG1hcDpmdW5jdGlvbihnLGgpe3ZhciBpPVtdO2IuZWFjaChnLGZ1bmN0aW9uKGYpe2kucHVzaChoKGYpKX0pO3JldHVybiBpfSxncmVwOmZ1bmN0aW9uKGcsaCl7dmFyIGk9W107Yi5lYWNoKGcsZnVuY3Rpb24oZil7aWYoIWh8fGgoZikpe2kucHVzaChmKX19KTtyZXR1cm4gaX0saW5BcnJheTpmdW5jdGlvbihnLGgpe3ZhciBqLGY7aWYoZyl7Zm9yKGo9MCxmPWcubGVuZ3RoO2o8ZjtqKyspe2lmKGdbal09PT1oKXtyZXR1cm4gan19fXJldHVybiAtMX0sZXh0ZW5kOmZ1bmN0aW9uKGssail7dmFyIGgsZyxmPWFyZ3VtZW50cztmb3IoaD0xLGc9Zi5sZW5ndGg7aDxnO2grKyl7aj1mW2hdO2IuZWFjaChqLGZ1bmN0aW9uKGksbCl7aWYoaSE9PWUpe2tbbF09aX19KX1yZXR1cm4ga30sdHJpbTpmdW5jdGlvbihmKXtyZXR1cm4oZj8iIitmOiIiKS5yZXBsYWNlKGEsIiIpfSxjcmVhdGU6ZnVuY3Rpb24obixmKXt2YXIgbT10aGlzLGcsaSxqLGssaCxsPTA7bj0vXigoc3RhdGljKSApPyhbXHcuXSspKDooW1x3Ll0rKSk/Ly5leGVjKG4pO2o9blszXS5tYXRjaCgvKF58XC4pKFx3KykkL2kpWzJdO2k9bS5jcmVhdGVOUyhuWzNdLnJlcGxhY2UoL1wuXHcrJC8sIiIpKTtpZihpW2pdKXtyZXR1cm59aWYoblsyXT09InN0YXRpYyIpe2lbal09ZjtpZih0aGlzLm9uQ3JlYXRlKXt0aGlzLm9uQ3JlYXRlKG5bMl0sblszXSxpW2pdKX1yZXR1cm59aWYoIWZbal0pe2Zbal09ZnVuY3Rpb24oKXt9O2w9MX1pW2pdPWZbal07bS5leHRlbmQoaVtqXS5wcm90b3R5cGUsZik7aWYobls1XSl7Zz1tLnJlc29sdmUobls1XSkucHJvdG90eXBlO2s9bls1XS5tYXRjaCgvXC4oXHcrKSQvaSlbMV07aD1pW2pdO2lmKGwpe2lbal09ZnVuY3Rpb24oKXtyZXR1cm4gZ1trXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWVsc2V7aVtqXT1mdW5jdGlvbigpe3RoaXMucGFyZW50PWdba107cmV0dXJuIGguYXBwbHkodGhpcyxhcmd1bWVudHMpfX1pW2pdLnByb3RvdHlwZVtqXT1pW2pdO20uZWFjaChnLGZ1bmN0aW9uKG8scCl7aVtqXS5wcm90b3R5cGVbcF09Z1twXX0pO20uZWFjaChmLGZ1bmN0aW9uKG8scCl7aWYoZ1twXSl7aVtqXS5wcm90b3R5cGVbcF09ZnVuY3Rpb24oKXt0aGlzLnBhcmVudD1nW3BdO3JldHVybiBvLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZWxzZXtpZihwIT1qKXtpW2pdLnByb3RvdHlwZVtwXT1vfX19KX1tLmVhY2goZlsic3RhdGljIl0sZnVuY3Rpb24obyxwKXtpW2pdW3BdPW99KTtpZih0aGlzLm9uQ3JlYXRlKXt0aGlzLm9uQ3JlYXRlKG5bMl0sblszXSxpW2pdLnByb3RvdHlwZSl9fSx3YWxrOmZ1bmN0aW9uKGksaCxqLGcpe2c9Z3x8dGhpcztpZihpKXtpZihqKXtpPWlbal19Yi5lYWNoKGksZnVuY3Rpb24oayxmKXtpZihoLmNhbGwoZyxrLGYsaik9PT1mYWxzZSl7cmV0dXJuIGZhbHNlfWIud2FsayhrLGgsaixnKX0pfX0sY3JlYXRlTlM6ZnVuY3Rpb24oaixoKXt2YXIgZyxmO2g9aHx8ZDtqPWouc3BsaXQoIi4iKTtmb3IoZz0wO2c8ai5sZW5ndGg7ZysrKXtmPWpbZ107aWYoIWhbZl0pe2hbZl09e319aD1oW2ZdfXJldHVybiBofSxyZXNvbHZlOmZ1bmN0aW9uKGosaCl7dmFyIGcsZjtoPWh8fGQ7aj1qLnNwbGl0KCIuIik7Zm9yKGc9MCxmPWoubGVuZ3RoO2c8ZjtnKyspe2g9aFtqW2ddXTtpZighaCl7YnJlYWt9fXJldHVybiBofSxhZGRVbmxvYWQ6ZnVuY3Rpb24oaixpKXt2YXIgaD10aGlzO2o9e2Z1bmM6aixzY29wZTppfHx0aGlzfTtpZighaC51bmxvYWRzKXtmdW5jdGlvbiBnKCl7dmFyIGY9aC51bmxvYWRzLGwsbTtpZihmKXtmb3IobSBpbiBmKXtsPWZbbV07aWYobCYmbC5mdW5jKXtsLmZ1bmMuY2FsbChsLnNjb3BlLDEpfX1pZihkLmRldGFjaEV2ZW50KXtkLmRldGFjaEV2ZW50KCJvbmJlZm9yZXVubG9hZCIsayk7ZC5kZXRhY2hFdmVudCgib251bmxvYWQiLGcpfWVsc2V7aWYoZC5yZW1vdmVFdmVudExpc3RlbmVyKXtkLnJlbW92ZUV2ZW50TGlzdGVuZXIoInVubG9hZCIsZyxmYWxzZSl9fWgudW5sb2Fkcz1sPWY9dz1nPTA7aWYoZC5Db2xsZWN0R2FyYmFnZSl7Q29sbGVjdEdhcmJhZ2UoKX19fWZ1bmN0aW9uIGsoKXt2YXIgbD1kb2N1bWVudDtpZihsLnJlYWR5U3RhdGU9PSJpbnRlcmFjdGl2ZSIpe2Z1bmN0aW9uIGYoKXtsLmRldGFjaEV2ZW50KCJvbnN0b3AiLGYpO2lmKGcpe2coKX1sPTB9aWYobCl7bC5hdHRhY2hFdmVudCgib25zdG9wIixmKX1kLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihsKXtsLmRldGFjaEV2ZW50KCJvbnN0b3AiLGYpfX0sMCl9fWlmKGQuYXR0YWNoRXZlbnQpe2QuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixnKTtkLmF0dGFjaEV2ZW50KCJvbmJlZm9yZXVubG9hZCIsayl9ZWxzZXtpZihkLmFkZEV2ZW50TGlzdGVuZXIpe2QuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixnLGZhbHNlKX19aC51bmxvYWRzPVtqXX1lbHNle2gudW5sb2Fkcy5wdXNoKGopfXJldHVybiBqfSxyZW1vdmVVbmxvYWQ6ZnVuY3Rpb24oaSl7dmFyIGc9dGhpcy51bmxvYWRzLGg9bnVsbDtiLmVhY2goZyxmdW5jdGlvbihqLGYpe2lmKGomJmouZnVuYz09aSl7Zy5zcGxpY2UoZiwxKTtoPWk7cmV0dXJuIGZhbHNlfX0pO3JldHVybiBofSxleHBsb2RlOmZ1bmN0aW9uKGYsZyl7cmV0dXJuIGY/Yi5tYXAoZi5zcGxpdChnfHwiLCIpLGIudHJpbSk6Zn0sX2FkZFZlcjpmdW5jdGlvbihnKXt2YXIgZjtpZighdGhpcy5xdWVyeSl7cmV0dXJuIGd9Zj0oZy5pbmRleE9mKCI/Iik9PS0xPyI/IjoiJiIpK3RoaXMucXVlcnk7aWYoZy5pbmRleE9mKCIjIik9PS0xKXtyZXR1cm4gZytmfXJldHVybiBnLnJlcGxhY2UoIiMiLGYrIiMiKX0sX3JlcGxhY2U6ZnVuY3Rpb24oaCxmLGcpe2lmKGMpe3JldHVybiBnLnJlcGxhY2UoaCxmdW5jdGlvbigpe3ZhciBsPWYsaj1hcmd1bWVudHMsaztmb3Ioaz0wO2s8ai5sZW5ndGgtMjtrKyspe2lmKGpba109PT1lKXtsPWwucmVwbGFjZShuZXcgUmVnRXhwKCJcXCQiK2ssImciKSwiIil9ZWxzZXtsPWwucmVwbGFjZShuZXcgUmVnRXhwKCJcXCQiK2ssImciKSxqW2tdKX19cmV0dXJuIGx9KX1yZXR1cm4gZy5yZXBsYWNlKGgsZil9fTtiLl9pbml0KCk7ZC50aW55bWNlPWQudGlueU1DRT1ifSkod2luZG93KTt0aW55bWNlLmNyZWF0ZSgidGlueW1jZS51dGlsLkRpc3BhdGNoZXIiLHtzY29wZTpudWxsLGxpc3RlbmVyczpudWxsLERpc3BhdGNoZXI6ZnVuY3Rpb24oYSl7dGhpcy5zY29wZT1hfHx0aGlzO3RoaXMubGlzdGVuZXJzPVtdfSxhZGQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxpc3RlbmVycy5wdXNoKHtjYjphLHNjb3BlOmJ8fHRoaXMuc2NvcGV9KTtyZXR1cm4gYX0sYWRkVG9Ub3A6ZnVuY3Rpb24oYSxiKXt0aGlzLmxpc3RlbmVycy51bnNoaWZ0KHtjYjphLHNjb3BlOmJ8fHRoaXMuc2NvcGV9KTtyZXR1cm4gYX0scmVtb3ZlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGlzdGVuZXJzLGM9bnVsbDt0aW55bWNlLmVhY2goYixmdW5jdGlvbihlLGQpe2lmKGE9PWUuY2Ipe2M9YTtiLnNwbGljZShkLDEpO3JldHVybiBmYWxzZX19KTtyZXR1cm4gY30sZGlzcGF0Y2g6ZnVuY3Rpb24oKXt2YXIgZixkPWFyZ3VtZW50cyxlLGI9dGhpcy5saXN0ZW5lcnMsZztmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKXtnPWJbZV07Zj1nLmNiLmFwcGx5KGcuc2NvcGUsZCk7aWYoZj09PWZhbHNlKXticmVha319cmV0dXJuIGZ9fSk7KGZ1bmN0aW9uKCl7dmFyIGE9dGlueW1jZS5lYWNoO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnV0aWwuVVJJIix7VVJJOmZ1bmN0aW9uKGUsZyl7dmFyIGY9dGhpcyxoLGQsYztlPXRpbnltY2UudHJpbShlKTtnPWYuc2V0dGluZ3M9Z3x8e307aWYoL14obWFpbHRvfHRlbHxuZXdzfGphdmFzY3JpcHR8YWJvdXR8ZGF0YSk6L2kudGVzdChlKXx8L15ccyojLy50ZXN0KGUpKXtmLnNvdXJjZT1lO3JldHVybn1pZihlLmluZGV4T2YoIi8iKT09PTAmJmUuaW5kZXhPZigiLy8iKSE9PTApe2U9KGcuYmFzZV91cmk/Zy5iYXNlX3VyaS5wcm90b2NvbHx8Imh0dHAiOiJodHRwIikrIjovL21jZV9ob3N0IitlfWlmKCEvXlx3Kjo/XC9cLy8udGVzdChlKSl7ZT0oZy5iYXNlX3VyaS5wcm90b2NvbHx8Imh0dHAiKSsiOi8vbWNlX2hvc3QiK2YudG9BYnNQYXRoKGcuYmFzZV91cmkucGF0aCxlKX1lPWUucmVwbGFjZSgvQEAvZywiKG1jZV9hdCkiKTtlPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopOj8oW146QF0qKSk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhlKTthKFsic291cmNlIiwicHJvdG9jb2wiLCJhdXRob3JpdHkiLCJ1c2VySW5mbyIsInVzZXIiLCJwYXNzd29yZCIsImhvc3QiLCJwb3J0IiwicmVsYXRpdmUiLCJwYXRoIiwiZGlyZWN0b3J5IiwiZmlsZSIsInF1ZXJ5IiwiYW5jaG9yIl0sZnVuY3Rpb24oYixqKXt2YXIgaz1lW2pdO2lmKGspe2s9ay5yZXBsYWNlKC9cKG1jZV9hdFwpL2csIkBAIil9ZltiXT1rfSk7aWYoYz1nLmJhc2VfdXJpKXtpZighZi5wcm90b2NvbCl7Zi5wcm90b2NvbD1jLnByb3RvY29sfWlmKCFmLnVzZXJJbmZvKXtmLnVzZXJJbmZvPWMudXNlckluZm99aWYoIWYucG9ydCYmZi5ob3N0PT0ibWNlX2hvc3QiKXtmLnBvcnQ9Yy5wb3J0fWlmKCFmLmhvc3R8fGYuaG9zdD09Im1jZV9ob3N0Iil7Zi5ob3N0PWMuaG9zdH1mLnNvdXJjZT0iIn19LHNldFBhdGg6ZnVuY3Rpb24oYyl7dmFyIGI9dGhpcztjPS9eKC4qPylcLz8oXHcrKT8kLy5leGVjKGMpO2IucGF0aD1jWzBdO2IuZGlyZWN0b3J5PWNbMV07Yi5maWxlPWNbMl07Yi5zb3VyY2U9IiI7Yi5nZXRVUkkoKX0sdG9SZWxhdGl2ZTpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGQ7aWYoYj09PSIuLyIpe3JldHVybiBifWI9bmV3IHRpbnltY2UudXRpbC5VUkkoYix7YmFzZV91cmk6Y30pO2lmKChiLmhvc3QhPSJtY2VfaG9zdCImJmMuaG9zdCE9Yi5ob3N0JiZiLmhvc3QpfHxjLnBvcnQhPWIucG9ydHx8Yy5wcm90b2NvbCE9Yi5wcm90b2NvbCl7cmV0dXJuIGIuZ2V0VVJJKCl9ZD1jLnRvUmVsUGF0aChjLnBhdGgsYi5wYXRoKTtpZihiLnF1ZXJ5KXtkKz0iPyIrYi5xdWVyeX1pZihiLmFuY2hvcil7ZCs9IiMiK2IuYW5jaG9yfXJldHVybiBkfSx0b0Fic29sdXRlOmZ1bmN0aW9uKGIsYyl7dmFyIGI9bmV3IHRpbnltY2UudXRpbC5VUkkoYix7YmFzZV91cmk6dGhpc30pO3JldHVybiBiLmdldFVSSSh0aGlzLmhvc3Q9PWIuaG9zdCYmdGhpcy5wcm90b2NvbD09Yi5wcm90b2NvbD9jOjApfSx0b1JlbFBhdGg6ZnVuY3Rpb24oZyxoKXt2YXIgYyxmPTAsZD0iIixlLGI7Zz1nLnN1YnN0cmluZygwLGcubGFzdEluZGV4T2YoIi8iKSk7Zz1nLnNwbGl0KCIvIik7Yz1oLnNwbGl0KCIvIik7aWYoZy5sZW5ndGg+PWMubGVuZ3RoKXtmb3IoZT0wLGI9Zy5sZW5ndGg7ZTxiO2UrKyl7aWYoZT49Yy5sZW5ndGh8fGdbZV0hPWNbZV0pe2Y9ZSsxO2JyZWFrfX19aWYoZy5sZW5ndGg8Yy5sZW5ndGgpe2ZvcihlPTAsYj1jLmxlbmd0aDtlPGI7ZSsrKXtpZihlPj1nLmxlbmd0aHx8Z1tlXSE9Y1tlXSl7Zj1lKzE7YnJlYWt9fX1pZihmPT0xKXtyZXR1cm4gaH1mb3IoZT0wLGI9Zy5sZW5ndGgtKGYtMSk7ZTxiO2UrKyl7ZCs9Ii4uLyJ9Zm9yKGU9Zi0xLGI9Yy5sZW5ndGg7ZTxiO2UrKyl7aWYoZSE9Zi0xKXtkKz0iLyIrY1tlXX1lbHNle2QrPWNbZV19fXJldHVybiBkfSx0b0Fic1BhdGg6ZnVuY3Rpb24oZSxmKXt2YXIgYyxiPTAsaD1bXSxkLGc7ZD0vXC8kLy50ZXN0KGYpPyIvIjoiIjtlPWUuc3BsaXQoIi8iKTtmPWYuc3BsaXQoIi8iKTthKGUsZnVuY3Rpb24oaSl7aWYoaSl7aC5wdXNoKGkpfX0pO2U9aDtmb3IoYz1mLmxlbmd0aC0xLGg9W107Yz49MDtjLS0pe2lmKGZbY10ubGVuZ3RoPT0wfHxmW2NdPT0iLiIpe2NvbnRpbnVlfWlmKGZbY109PSIuLiIpe2IrKztjb250aW51ZX1pZihiPjApe2ItLTtjb250aW51ZX1oLnB1c2goZltjXSl9Yz1lLmxlbmd0aC1iO2lmKGM8PTApe2c9aC5yZXZlcnNlKCkuam9pbigiLyIpfWVsc2V7Zz1lLnNsaWNlKDAsYykuam9pbigiLyIpKyIvIitoLnJldmVyc2UoKS5qb2luKCIvIil9aWYoZy5pbmRleE9mKCIvIikhPT0wKXtnPSIvIitnfWlmKGQmJmcubGFzdEluZGV4T2YoIi8iKSE9PWcubGVuZ3RoLTEpe2crPWR9cmV0dXJuIGd9LGdldFVSSTpmdW5jdGlvbihkKXt2YXIgYyxiPXRoaXM7aWYoIWIuc291cmNlfHxkKXtjPSIiO2lmKCFkKXtpZihiLnByb3RvY29sKXtjKz1iLnByb3RvY29sKyI6Ly8ifWlmKGIudXNlckluZm8pe2MrPWIudXNlckluZm8rIkAifWlmKGIuaG9zdCl7Yys9Yi5ob3N0fWlmKGIucG9ydCl7Yys9IjoiK2IucG9ydH19aWYoYi5wYXRoKXtjKz1iLnBhdGh9aWYoYi5xdWVyeSl7Yys9Ij8iK2IucXVlcnl9aWYoYi5hbmNob3Ipe2MrPSIjIitiLmFuY2hvcn1iLnNvdXJjZT1jfXJldHVybiBiLnNvdXJjZX19KX0pKCk7KGZ1bmN0aW9uKCl7dmFyIGE9dGlueW1jZS5lYWNoO3RpbnltY2UuY3JlYXRlKCJzdGF0aWMgdGlueW1jZS51dGlsLkNvb2tpZSIse2dldEhhc2g6ZnVuY3Rpb24oZCl7dmFyIGI9dGhpcy5nZXQoZCksYztpZihiKXthKGIuc3BsaXQoIiYiKSxmdW5jdGlvbihlKXtlPWUuc3BsaXQoIj0iKTtjPWN8fHt9O2NbdW5lc2NhcGUoZVswXSldPXVuZXNjYXBlKGVbMV0pfSl9cmV0dXJuIGN9LHNldEhhc2g6ZnVuY3Rpb24oaixiLGcsZixpLGMpe3ZhciBoPSIiO2EoYixmdW5jdGlvbihlLGQpe2grPSghaD8iIjoiJiIpK2VzY2FwZShkKSsiPSIrZXNjYXBlKGUpfSk7dGhpcy5zZXQoaixoLGcsZixpLGMpfSxnZXQ6ZnVuY3Rpb24oaSl7dmFyIGg9ZG9jdW1lbnQuY29va2llLGcsZj1pKyI9IixkO2lmKCFoKXtyZXR1cm59ZD1oLmluZGV4T2YoIjsgIitmKTtpZihkPT0tMSl7ZD1oLmluZGV4T2YoZik7aWYoZCE9MCl7cmV0dXJuIG51bGx9fWVsc2V7ZCs9Mn1nPWguaW5kZXhPZigiOyIsZCk7aWYoZz09LTEpe2c9aC5sZW5ndGh9cmV0dXJuIHVuZXNjYXBlKGguc3Vic3RyaW5nKGQrZi5sZW5ndGgsZykpfSxzZXQ6ZnVuY3Rpb24oaSxiLGcsZixoLGMpe2RvY3VtZW50LmNvb2tpZT1pKyI9Iitlc2NhcGUoYikrKChnKT8iOyBleHBpcmVzPSIrZy50b0dNVFN0cmluZygpOiIiKSsoKGYpPyI7IHBhdGg9Iitlc2NhcGUoZik6IiIpKygoaCk/IjsgZG9tYWluPSIraDoiIikrKChjKT8iOyBzZWN1cmUiOiIiKX0scmVtb3ZlOmZ1bmN0aW9uKGUsYil7dmFyIGM9bmV3IERhdGUoKTtjLnNldFRpbWUoYy5nZXRUaW1lKCktMTAwMCk7dGhpcy5zZXQoZSwiIixjLGIsYyl9fSl9KSgpO3RpbnltY2UuY3JlYXRlKCJzdGF0aWMgdGlueW1jZS51dGlsLkpTT04iLHtzZXJpYWxpemU6ZnVuY3Rpb24oZSl7dmFyIGMsYSxkPXRpbnltY2UudXRpbC5KU09OLnNlcmlhbGl6ZSxiO2lmKGU9PW51bGwpe3JldHVybiJudWxsIn1iPXR5cGVvZiBlO2lmKGI9PSJzdHJpbmciKXthPSJcYmJcdHRcbm5cZmZccnJcIlwiJydcXFxcIjtyZXR1cm4nIicrZS5yZXBsYWNlKC8oW1x1MDA4MC1cdUZGRkZceDAwLVx4MWZcIl0pL2csZnVuY3Rpb24oZyxmKXtjPWEuaW5kZXhPZihmKTtpZihjKzEpe3JldHVybiJcXCIrYS5jaGFyQXQoYysxKX1nPWYuY2hhckNvZGVBdCgpLnRvU3RyaW5nKDE2KTtyZXR1cm4iXFx1IisiMDAwMCIuc3Vic3RyaW5nKGcubGVuZ3RoKStnfSkrJyInfWlmKGI9PSJvYmplY3QiKXtpZihlLmhhc093blByb3BlcnR5JiZlIGluc3RhbmNlb2YgQXJyYXkpe2ZvcihjPTAsYT0iWyI7YzxlLmxlbmd0aDtjKyspe2ErPShjPjA/IiwiOiIiKStkKGVbY10pfXJldHVybiBhKyJdIn1hPSJ7Ijtmb3IoYyBpbiBlKXthKz10eXBlb2YgZVtjXSE9ImZ1bmN0aW9uIj8oYS5sZW5ndGg+MT8nLCInOiciJykrYysnIjonK2QoZVtjXSk6IiJ9cmV0dXJuIGErIn0ifXJldHVybiIiK2V9LHBhcnNlOmZ1bmN0aW9uKHMpe3RyeXtyZXR1cm4gZXZhbCgiKCIrcysiKSIpfWNhdGNoKGV4KXt9fX0pO3RpbnltY2UuY3JlYXRlKCJzdGF0aWMgdGlueW1jZS51dGlsLlhIUiIse3NlbmQ6ZnVuY3Rpb24oZyl7dmFyIGEsZSxiPXdpbmRvdyxoPTA7Zy5zY29wZT1nLnNjb3BlfHx0aGlzO2cuc3VjY2Vzc19zY29wZT1nLnN1Y2Nlc3Nfc2NvcGV8fGcuc2NvcGU7Zy5lcnJvcl9zY29wZT1nLmVycm9yX3Njb3BlfHxnLnNjb3BlO2cuYXN5bmM9Zy5hc3luYz09PWZhbHNlP2ZhbHNlOnRydWU7Zy5kYXRhPWcuZGF0YXx8IiI7ZnVuY3Rpb24gZChpKXthPTA7dHJ5e2E9bmV3IEFjdGl2ZVhPYmplY3QoaSl9Y2F0Y2goYyl7fXJldHVybiBhfWE9Yi5YTUxIdHRwUmVxdWVzdD9uZXcgWE1MSHR0cFJlcXVlc3QoKTpkKCJNaWNyb3NvZnQuWE1MSFRUUCIpfHxkKCJNc3htbDIuWE1MSFRUUCIpO2lmKGEpe2lmKGEub3ZlcnJpZGVNaW1lVHlwZSl7YS5vdmVycmlkZU1pbWVUeXBlKGcuY29udGVudF90eXBlKX1hLm9wZW4oZy50eXBlfHwoZy5kYXRhPyJQT1NUIjoiR0VUIiksZy51cmwsZy5hc3luYyk7aWYoZy5jb250ZW50X3R5cGUpe2Euc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixnLmNvbnRlbnRfdHlwZSl9YS5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKTthLnNlbmQoZy5kYXRhKTtmdW5jdGlvbiBmKCl7aWYoIWcuYXN5bmN8fGEucmVhZHlTdGF0ZT09NHx8aCsrPjEwMDAwKXtpZihnLnN1Y2Nlc3MmJmg8MTAwMDAmJmEuc3RhdHVzPT0yMDApe2cuc3VjY2Vzcy5jYWxsKGcuc3VjY2Vzc19zY29wZSwiIithLnJlc3BvbnNlVGV4dCxhLGcpfWVsc2V7aWYoZy5lcnJvcil7Zy5lcnJvci5jYWxsKGcuZXJyb3Jfc2NvcGUsaD4xMDAwMD8iVElNRURfT1VUIjoiR0VORVJBTCIsYSxnKX19YT1udWxsfWVsc2V7Yi5zZXRUaW1lb3V0KGYsMTApfX1pZighZy5hc3luYyl7cmV0dXJuIGYoKX1lPWIuc2V0VGltZW91dChmLDEwKX19fSk7KGZ1bmN0aW9uKCl7dmFyIGM9dGlueW1jZS5leHRlbmQsYj10aW55bWNlLnV0aWwuSlNPTixhPXRpbnltY2UudXRpbC5YSFI7dGlueW1jZS5jcmVhdGUoInRpbnltY2UudXRpbC5KU09OUmVxdWVzdCIse0pTT05SZXF1ZXN0OmZ1bmN0aW9uKGQpe3RoaXMuc2V0dGluZ3M9Yyh7fSxkKTt0aGlzLmNvdW50PTB9LHNlbmQ6ZnVuY3Rpb24oZil7dmFyIGU9Zi5lcnJvcixkPWYuc3VjY2VzcztmPWModGhpcy5zZXR0aW5ncyxmKTtmLnN1Y2Nlc3M9ZnVuY3Rpb24oaCxnKXtoPWIucGFyc2UoaCk7aWYodHlwZW9mKGgpPT0idW5kZWZpbmVkIil7aD17ZXJyb3I6IkpTT04gUGFyc2UgZXJyb3IuIn19aWYoaC5lcnJvcil7ZS5jYWxsKGYuZXJyb3Jfc2NvcGV8fGYuc2NvcGUsaC5lcnJvcixnKX1lbHNle2QuY2FsbChmLnN1Y2Nlc3Nfc2NvcGV8fGYuc2NvcGUsaC5yZXN1bHQpfX07Zi5lcnJvcj1mdW5jdGlvbihoLGcpe2UuY2FsbChmLmVycm9yX3Njb3BlfHxmLnNjb3BlLGgsZyl9O2YuZGF0YT1iLnNlcmlhbGl6ZSh7aWQ6Zi5pZHx8ImMiKyh0aGlzLmNvdW50KyspLG1ldGhvZDpmLm1ldGhvZCxwYXJhbXM6Zi5wYXJhbXN9KTtmLmNvbnRlbnRfdHlwZT0iYXBwbGljYXRpb24vanNvbiI7YS5zZW5kKGYpfSwic3RhdGljIjp7c2VuZFJQQzpmdW5jdGlvbihkKXtyZXR1cm4gbmV3IHRpbnltY2UudXRpbC5KU09OUmVxdWVzdCgpLnNlbmQoZCl9fX0pfSgpKTsoZnVuY3Rpb24obSl7dmFyIGs9bS5lYWNoLGo9bS5pcyxpPW0uaXNXZWJLaXQsZD1tLmlzSUUsYT0vXihIWzEtNlJdfFB8RElWfEFERFJFU1N8UFJFfEZPUk18VChBQkxFfEJPRFl8SEVBRHxGT09UfEh8UnxEKXxMSXxPTHxVTHxDQVBUSU9OfEJMT0NLUVVPVEV8Q0VOVEVSfERMfERUfEREfERJUnxGSUVMRFNFVHxOT1NDUklQVHxNRU5VfElTSU5ERVh8U0FNUCkkLyxlPWcoImNoZWNrZWQsY29tcGFjdCxkZWNsYXJlLGRlZmVyLGRpc2FibGVkLGlzbWFwLG11bHRpcGxlLG5vaHJlZixub3Jlc2l6ZSxub3NoYWRlLG5vd3JhcCxyZWFkb25seSxzZWxlY3RlZCIpLGY9Zygic3JjLGhyZWYsc3R5bGUsY29vcmRzLHNoYXBlIiksYz17IiYiOiImYW1wOyIsJyInOiImcXVvdDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7In0sbj0vWzw+JlwiXS9nLGI9L14oW2EtejAtOV0sPykrJC9pLGg9LzwoXHcrKSgoPzpccytcdysoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKShccypcLz8pPi9nLGw9LyhcdyspKD86XHMqPVxzKig/Oig/OiIoKD86XFwufFteIl0pKikiKXwoPzonKCg/OlxcLnxbXiddKSopJyl8KFtePlxzXSspKSk/L2c7ZnVuY3Rpb24gZyhxKXt2YXIgcD17fSxvO3E9cS5zcGxpdCgiLCIpO2ZvcihvPXEubGVuZ3RoO28+PTA7by0tKXtwW3Fbb11dPTF9cmV0dXJuIHB9bS5jcmVhdGUoInRpbnltY2UuZG9tLkRPTVV0aWxzIix7ZG9jOm51bGwscm9vdDpudWxsLGZpbGVzOm51bGwscGl4ZWxTdHlsZXM6L14odG9wfGxlZnR8Ym90dG9tfHJpZ2h0fHdpZHRofGhlaWdodHxib3JkZXJXaWR0aCkkLyxwcm9wczp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsY2xhc3NOYW1lOiJjbGFzc05hbWUiLGNoZWNrZWQ6ImNoZWNrZWQiLGRpc2FibGVkOiJkaXNhYmxlZCIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLHJlYWRvbmx5OiJyZWFkT25seSIsc2VsZWN0ZWQ6InNlbGVjdGVkIix2YWx1ZToidmFsdWUiLGlkOiJpZCIsbmFtZToibmFtZSIsdHlwZToidHlwZSJ9LERPTVV0aWxzOmZ1bmN0aW9uKHUscSl7dmFyIHA9dGhpcyxvO3AuZG9jPXU7cC53aW49d2luZG93O3AuZmlsZXM9e307cC5jc3NGbGlja2VyPWZhbHNlO3AuY291bnRlcj0wO3Auc3RkTW9kZT11LmRvY3VtZW50TW9kZT49ODtwLmJveE1vZGVsPSFtLmlzSUV8fHUuY29tcGF0TW9kZT09IkNTUzFDb21wYXQifHxwLnN0ZE1vZGU7cC5zZXR0aW5ncz1xPW0uZXh0ZW5kKHtrZWVwX3ZhbHVlczpmYWxzZSxoZXhfY29sb3JzOjEscHJvY2Vzc19odG1sOjF9LHEpO2lmKG0uaXNJRTYpe3RyeXt1LmV4ZWNDb21tYW5kKCJCYWNrZ3JvdW5kSW1hZ2VDYWNoZSIsZmFsc2UsdHJ1ZSl9Y2F0Y2gocil7cC5jc3NGbGlja2VyPXRydWV9fWlmKHEudmFsaWRfc3R5bGVzKXtwLl9zdHlsZXM9e307ayhxLnZhbGlkX3N0eWxlcyxmdW5jdGlvbih0LHMpe3AuX3N0eWxlc1tzXT1tLmV4cGxvZGUodCl9KX1tLmFkZFVubG9hZChwLmRlc3Ryb3kscCl9LGdldFJvb3Q6ZnVuY3Rpb24oKXt2YXIgbz10aGlzLHA9by5zZXR0aW5ncztyZXR1cm4ocCYmby5nZXQocC5yb290X2VsZW1lbnQpKXx8by5kb2MuYm9keX0sZ2V0Vmlld1BvcnQ6ZnVuY3Rpb24ocCl7dmFyIHEsbztwPSFwP3RoaXMud2luOnA7cT1wLmRvY3VtZW50O289dGhpcy5ib3hNb2RlbD9xLmRvY3VtZW50RWxlbWVudDpxLmJvZHk7cmV0dXJue3g6cC5wYWdlWE9mZnNldHx8by5zY3JvbGxMZWZ0LHk6cC5wYWdlWU9mZnNldHx8by5zY3JvbGxUb3AsdzpwLmlubmVyV2lkdGh8fG8uY2xpZW50V2lkdGgsaDpwLmlubmVySGVpZ2h0fHxvLmNsaWVudEhlaWdodH19LGdldFJlY3Q6ZnVuY3Rpb24ocyl7dmFyIHIsbz10aGlzLHE7cz1vLmdldChzKTtyPW8uZ2V0UG9zKHMpO3E9by5nZXRTaXplKHMpO3JldHVybnt4OnIueCx5OnIueSx3OnEudyxoOnEuaH19LGdldFNpemU6ZnVuY3Rpb24ocil7dmFyIHA9dGhpcyxvLHE7cj1wLmdldChyKTtvPXAuZ2V0U3R5bGUociwid2lkdGgiKTtxPXAuZ2V0U3R5bGUociwiaGVpZ2h0Iik7aWYoby5pbmRleE9mKCJweCIpPT09LTEpe289MH1pZihxLmluZGV4T2YoInB4Iik9PT0tMSl7cT0wfXJldHVybnt3OnBhcnNlSW50KG8pfHxyLm9mZnNldFdpZHRofHxyLmNsaWVudFdpZHRoLGg6cGFyc2VJbnQocSl8fHIub2Zmc2V0SGVpZ2h0fHxyLmNsaWVudEhlaWdodH19LGdldFBhcmVudDpmdW5jdGlvbihxLHAsbyl7cmV0dXJuIHRoaXMuZ2V0UGFyZW50cyhxLHAsbyxmYWxzZSl9LGdldFBhcmVudHM6ZnVuY3Rpb24oeix2LHMseSl7dmFyIHE9dGhpcyxwLHU9cS5zZXR0aW5ncyx4PVtdO3o9cS5nZXQoeik7eT15PT09dW5kZWZpbmVkO2lmKHUuc3RyaWN0X3Jvb3Qpe3M9c3x8cS5nZXRSb290KCl9aWYoaih2LCJzdHJpbmciKSl7cD12O2lmKHY9PT0iKiIpe3Y9ZnVuY3Rpb24obyl7cmV0dXJuIG8ubm9kZVR5cGU9PTF9fWVsc2V7dj1mdW5jdGlvbihvKXtyZXR1cm4gcS5pcyhvLHApfX19d2hpbGUoeil7aWYoej09c3x8IXoubm9kZVR5cGV8fHoubm9kZVR5cGU9PT05KXticmVha31pZighdnx8dih6KSl7aWYoeSl7eC5wdXNoKHopfWVsc2V7cmV0dXJuIHp9fXo9ei5wYXJlbnROb2RlfXJldHVybiB5P3g6bnVsbH0sZ2V0OmZ1bmN0aW9uKG8pe3ZhciBwO2lmKG8mJnRoaXMuZG9jJiZ0eXBlb2Yobyk9PSJzdHJpbmciKXtwPW87bz10aGlzLmRvYy5nZXRFbGVtZW50QnlJZChvKTtpZihvJiZvLmlkIT09cCl7cmV0dXJuIHRoaXMuZG9jLmdldEVsZW1lbnRzQnlOYW1lKHApWzFdfX1yZXR1cm4gb30sZ2V0TmV4dDpmdW5jdGlvbihwLG8pe3JldHVybiB0aGlzLl9maW5kU2liKHAsbywibmV4dFNpYmxpbmciKX0sZ2V0UHJldjpmdW5jdGlvbihwLG8pe3JldHVybiB0aGlzLl9maW5kU2liKHAsbywicHJldmlvdXNTaWJsaW5nIil9LHNlbGVjdDpmdW5jdGlvbihxLHApe3ZhciBvPXRoaXM7cmV0dXJuIG0uZG9tLlNpenpsZShxLG8uZ2V0KHApfHxvLmdldChvLnNldHRpbmdzLnJvb3RfZWxlbWVudCl8fG8uZG9jLFtdKX0saXM6ZnVuY3Rpb24ocSxvKXt2YXIgcDtpZihxLmxlbmd0aD09PXVuZGVmaW5lZCl7aWYobz09PSIqIil7cmV0dXJuIHEubm9kZVR5cGU9PTF9aWYoYi50ZXN0KG8pKXtvPW8udG9Mb3dlckNhc2UoKS5zcGxpdCgvLC8pO3E9cS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2ZvcihwPW8ubGVuZ3RoLTE7cD49MDtwLS0pe2lmKG9bcF09PXEpe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9fXJldHVybiBtLmRvbS5TaXp6bGUubWF0Y2hlcyhvLHEubm9kZVR5cGU/W3FdOnEpLmxlbmd0aD4wfSxhZGQ6ZnVuY3Rpb24ocyx2LG8scix1KXt2YXIgcT10aGlzO3JldHVybiB0aGlzLnJ1bihzLGZ1bmN0aW9uKHkpe3ZhciB4LHQ7eD1qKHYsInN0cmluZyIpP3EuZG9jLmNyZWF0ZUVsZW1lbnQodik6djtxLnNldEF0dHJpYnMoeCxvKTtpZihyKXtpZihyLm5vZGVUeXBlKXt4LmFwcGVuZENoaWxkKHIpfWVsc2V7cS5zZXRIVE1MKHgscil9fXJldHVybiAhdT95LmFwcGVuZENoaWxkKHgpOnh9KX0sY3JlYXRlOmZ1bmN0aW9uKHEsbyxwKXtyZXR1cm4gdGhpcy5hZGQodGhpcy5kb2MuY3JlYXRlRWxlbWVudChxKSxxLG8scCwxKX0sY3JlYXRlSFRNTDpmdW5jdGlvbih2LHAscyl7dmFyIHU9IiIscj10aGlzLHE7dSs9IjwiK3Y7Zm9yKHEgaW4gcCl7aWYocC5oYXNPd25Qcm9wZXJ0eShxKSl7dSs9IiAiK3ErJz0iJytyLmVuY29kZShwW3FdKSsnIid9fWlmKHR5cGVvZihzKSE9InVuZGVmaW5lZCIpe3JldHVybiB1KyI+IitzKyI8LyIrdisiPiJ9cmV0dXJuIHUrIiAvPiJ9LHJlbW92ZTpmdW5jdGlvbihvLHApe3JldHVybiB0aGlzLnJ1bihvLGZ1bmN0aW9uKHIpe3ZhciBxLHM7cT1yLnBhcmVudE5vZGU7aWYoIXEpe3JldHVybiBudWxsfWlmKHApe3doaWxlKHM9ci5maXJzdENoaWxkKXtpZighbS5pc0lFfHxzLm5vZGVUeXBlIT09M3x8cy5ub2RlVmFsdWUpe3EuaW5zZXJ0QmVmb3JlKHMscil9ZWxzZXtyLnJlbW92ZUNoaWxkKHMpfX19cmV0dXJuIHEucmVtb3ZlQ2hpbGQocil9KX0sc2V0U3R5bGU6ZnVuY3Rpb24ocixvLHApe3ZhciBxPXRoaXM7cmV0dXJuIHEucnVuKHIsZnVuY3Rpb24odil7dmFyIHUsdDt1PXYuc3R5bGU7bz1vLnJlcGxhY2UoLy0oXEQpL2csZnVuY3Rpb24oeCxzKXtyZXR1cm4gcy50b1VwcGVyQ2FzZSgpfSk7aWYocS5waXhlbFN0eWxlcy50ZXN0KG8pJiYobS5pcyhwLCJudW1iZXIiKXx8L15bXC0wLTlcLl0rJC8udGVzdChwKSkpe3ArPSJweCJ9c3dpdGNoKG8pe2Nhc2Uib3BhY2l0eSI6aWYoZCl7dS5maWx0ZXI9cD09PSIiPyIiOiJhbHBoYShvcGFjaXR5PSIrKHAqMTAwKSsiKSI7aWYoIXIuY3VycmVudFN0eWxlfHwhci5jdXJyZW50U3R5bGUuaGFzTGF5b3V0KXt1LmRpc3BsYXk9ImlubGluZS1ibG9jayJ9fXVbb109dVsiLW1vei1vcGFjaXR5Il09dVsiLWtodG1sLW9wYWNpdHkiXT1wfHwiIjticmVhaztjYXNlImZsb2F0IjpkP3Uuc3R5bGVGbG9hdD1wOnUuY3NzRmxvYXQ9cDticmVhaztkZWZhdWx0OnVbb109cHx8IiJ9aWYocS5zZXR0aW5ncy51cGRhdGVfc3R5bGVzKXtxLnNldEF0dHJpYih2LCJfbWNlX3N0eWxlIil9fSl9LGdldFN0eWxlOmZ1bmN0aW9uKHIsbyxxKXtyPXRoaXMuZ2V0KHIpO2lmKCFyKXtyZXR1cm4gZmFsc2V9aWYodGhpcy5kb2MuZGVmYXVsdFZpZXcmJnEpe289by5yZXBsYWNlKC9bQS1aXS9nLGZ1bmN0aW9uKHMpe3JldHVybiItIitzfSk7dHJ5e3JldHVybiB0aGlzLmRvYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShvKX1jYXRjaChwKXtyZXR1cm4gbnVsbH19bz1vLnJlcGxhY2UoLy0oXEQpL2csZnVuY3Rpb24odCxzKXtyZXR1cm4gcy50b1VwcGVyQ2FzZSgpfSk7aWYobz09ImZsb2F0Iil7bz1kPyJzdHlsZUZsb2F0IjoiY3NzRmxvYXQifWlmKHIuY3VycmVudFN0eWxlJiZxKXtyZXR1cm4gci5jdXJyZW50U3R5bGVbb119cmV0dXJuIHIuc3R5bGVbb119LHNldFN0eWxlczpmdW5jdGlvbih1LHYpe3ZhciBxPXRoaXMscj1xLnNldHRpbmdzLHA7cD1yLnVwZGF0ZV9zdHlsZXM7ci51cGRhdGVfc3R5bGVzPTA7ayh2LGZ1bmN0aW9uKG8scyl7cS5zZXRTdHlsZSh1LHMsbyl9KTtyLnVwZGF0ZV9zdHlsZXM9cDtpZihyLnVwZGF0ZV9zdHlsZXMpe3Euc2V0QXR0cmliKHUsci5jc3NUZXh0KX19LHNldEF0dHJpYjpmdW5jdGlvbihxLHIsbyl7dmFyIHA9dGhpcztpZighcXx8IXIpe3JldHVybn1pZihwLnNldHRpbmdzLnN0cmljdCl7cj1yLnRvTG93ZXJDYXNlKCl9cmV0dXJuIHRoaXMucnVuKHEsZnVuY3Rpb24odSl7dmFyIHQ9cC5zZXR0aW5ncztzd2l0Y2gocil7Y2FzZSJzdHlsZSI6aWYoIWoobywic3RyaW5nIikpe2sobyxmdW5jdGlvbihzLHgpe3Auc2V0U3R5bGUodSx4LHMpfSk7cmV0dXJufWlmKHQua2VlcF92YWx1ZXMpe2lmKG8mJiFwLl9pc1JlcyhvKSl7dS5zZXRBdHRyaWJ1dGUoIl9tY2Vfc3R5bGUiLG8sMil9ZWxzZXt1LnJlbW92ZUF0dHJpYnV0ZSgiX21jZV9zdHlsZSIsMil9fXUuc3R5bGUuY3NzVGV4dD1vO2JyZWFrO2Nhc2UiY2xhc3MiOnUuY2xhc3NOYW1lPW98fCIiO2JyZWFrO2Nhc2Uic3JjIjpjYXNlImhyZWYiOmlmKHQua2VlcF92YWx1ZXMpe2lmKHQudXJsX2NvbnZlcnRlcil7bz10LnVybF9jb252ZXJ0ZXIuY2FsbCh0LnVybF9jb252ZXJ0ZXJfc2NvcGV8fHAsbyxyLHUpfXAuc2V0QXR0cmliKHUsIl9tY2VfIityLG8sMil9YnJlYWs7Y2FzZSJzaGFwZSI6dS5zZXRBdHRyaWJ1dGUoIl9tY2Vfc3R5bGUiLG8pO2JyZWFrfWlmKGoobykmJm8hPT1udWxsJiZvLmxlbmd0aCE9PTApe3Uuc2V0QXR0cmlidXRlKHIsIiIrbywyKX1lbHNle3UucmVtb3ZlQXR0cmlidXRlKHIsMil9fSl9LHNldEF0dHJpYnM6ZnVuY3Rpb24ocSxyKXt2YXIgcD10aGlzO3JldHVybiB0aGlzLnJ1bihxLGZ1bmN0aW9uKG8pe2socixmdW5jdGlvbihzLHQpe3Auc2V0QXR0cmliKG8sdCxzKX0pfSl9LGdldEF0dHJpYjpmdW5jdGlvbihyLHMscSl7dmFyIG8scD10aGlzO3I9cC5nZXQocik7aWYoIXJ8fHIubm9kZVR5cGUhPT0xKXtyZXR1cm4gZmFsc2V9aWYoIWoocSkpe3E9IiJ9aWYoL14oc3JjfGhyZWZ8c3R5bGV8Y29vcmRzfHNoYXBlKSQvLnRlc3Qocykpe289ci5nZXRBdHRyaWJ1dGUoIl9tY2VfIitzKTtpZihvKXtyZXR1cm4gb319aWYoZCYmcC5wcm9wc1tzXSl7bz1yW3AucHJvcHNbc11dO289byYmby5ub2RlVmFsdWU/by5ub2RlVmFsdWU6b31pZighbyl7bz1yLmdldEF0dHJpYnV0ZShzLDIpfWlmKC9eKGNoZWNrZWR8Y29tcGFjdHxkZWNsYXJlfGRlZmVyfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfG5vaHJlZnxub3NoYWRlfG5vd3JhcHxyZWFkb25seXxzZWxlY3RlZCkkLy50ZXN0KHMpKXtpZihyW3AucHJvcHNbc11dPT09dHJ1ZSYmbz09PSIiKXtyZXR1cm4gc31yZXR1cm4gbz9zOiIifWlmKHIubm9kZU5hbWU9PT0iRk9STSImJnIuZ2V0QXR0cmlidXRlTm9kZShzKSl7cmV0dXJuIHIuZ2V0QXR0cmlidXRlTm9kZShzKS5ub2RlVmFsdWV9aWYocz09PSJzdHlsZSIpe289b3x8ci5zdHlsZS5jc3NUZXh0O2lmKG8pe289cC5zZXJpYWxpemVTdHlsZShwLnBhcnNlU3R5bGUobyksci5ub2RlTmFtZSk7aWYocC5zZXR0aW5ncy5rZWVwX3ZhbHVlcyYmIXAuX2lzUmVzKG8pKXtyLnNldEF0dHJpYnV0ZSgiX21jZV9zdHlsZSIsbyl9fX1pZihpJiZzPT09ImNsYXNzIiYmbyl7bz1vLnJlcGxhY2UoLyhhcHBsZXx3ZWJraXQpXC1bYS16XC1dKy9naSwiIil9aWYoZCl7c3dpdGNoKHMpe2Nhc2Uicm93c3BhbiI6Y2FzZSJjb2xzcGFuIjppZihvPT09MSl7bz0iIn1icmVhaztjYXNlInNpemUiOmlmKG89PT0iKzAifHxvPT09MjB8fG89PT0wKXtvPSIifWJyZWFrO2Nhc2Uid2lkdGgiOmNhc2UiaGVpZ2h0IjpjYXNlInZzcGFjZSI6Y2FzZSJjaGVja2VkIjpjYXNlImRpc2FibGVkIjpjYXNlInJlYWRvbmx5IjppZihvPT09MCl7bz0iIn1icmVhaztjYXNlImhzcGFjZSI6aWYobz09PS0xKXtvPSIifWJyZWFrO2Nhc2UibWF4bGVuZ3RoIjpjYXNlInRhYmluZGV4IjppZihvPT09MzI3Njh8fG89PT0yMTQ3NDgzNjQ3fHxvPT09IjMyNzY4Iil7bz0iIn1icmVhaztjYXNlIm11bHRpcGxlIjpjYXNlImNvbXBhY3QiOmNhc2Uibm9zaGFkZSI6Y2FzZSJub3dyYXAiOmlmKG89PT02NTUzNSl7cmV0dXJuIHN9cmV0dXJuIHE7Y2FzZSJzaGFwZSI6bz1vLnRvTG93ZXJDYXNlKCk7YnJlYWs7ZGVmYXVsdDppZihzLmluZGV4T2YoIm9uIik9PT0wJiZvKXtvPW0uX3JlcGxhY2UoL15mdW5jdGlvblxzK1x3K1woXClccytce1xzKyguKilccytcfSQvLCIkMSIsIiIrbyl9fX1yZXR1cm4obyE9PXVuZGVmaW5lZCYmbyE9PW51bGwmJm8hPT0iIik/IiIrbzpxfSxnZXRQb3M6ZnVuY3Rpb24oQSxzKXt2YXIgcD10aGlzLG89MCx6PTAsdSx2PXAuZG9jLHE7QT1wLmdldChBKTtzPXN8fHYuYm9keTtpZihBKXtpZihkJiYhcC5zdGRNb2RlKXtBPUEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dT1wLmJveE1vZGVsP3YuZG9jdW1lbnRFbGVtZW50OnYuYm9keTtvPXAuZ2V0U3R5bGUocC5zZWxlY3QoImh0bWwiKVswXSwiYm9yZGVyV2lkdGgiKTtvPShvPT0ibWVkaXVtInx8cC5ib3hNb2RlbCYmIXAuaXNJRTYpJiYyfHxvO3JldHVybnt4OkEubGVmdCt1LnNjcm9sbExlZnQtbyx5OkEudG9wK3Uuc2Nyb2xsVG9wLW99fXE9QTt3aGlsZShxJiZxIT1zJiZxLm5vZGVUeXBlKXtvKz1xLm9mZnNldExlZnR8fDA7eis9cS5vZmZzZXRUb3B8fDA7cT1xLm9mZnNldFBhcmVudH1xPUEucGFyZW50Tm9kZTt3aGlsZShxJiZxIT1zJiZxLm5vZGVUeXBlKXtvLT1xLnNjcm9sbExlZnR8fDA7ei09cS5zY3JvbGxUb3B8fDA7cT1xLnBhcmVudE5vZGV9fXJldHVybnt4Om8seTp6fX0scGFyc2VTdHlsZTpmdW5jdGlvbihyKXt2YXIgdT10aGlzLHY9dS5zZXR0aW5ncyx4PXt9O2lmKCFyKXtyZXR1cm4geH1mdW5jdGlvbiBwKEQsQSxDKXt2YXIgeixCLG8seTt6PXhbRCsiLXRvcCIrQV07aWYoIXope3JldHVybn1CPXhbRCsiLXJpZ2h0IitBXTtpZih6IT1CKXtyZXR1cm59bz14W0QrIi1ib3R0b20iK0FdO2lmKEIhPW8pe3JldHVybn15PXhbRCsiLWxlZnQiK0FdO2lmKG8hPXkpe3JldHVybn14W0NdPXk7ZGVsZXRlIHhbRCsiLXRvcCIrQV07ZGVsZXRlIHhbRCsiLXJpZ2h0IitBXTtkZWxldGUgeFtEKyItYm90dG9tIitBXTtkZWxldGUgeFtEKyItbGVmdCIrQV19ZnVuY3Rpb24gcSh5LHMsbyxBKXt2YXIgejt6PXhbc107aWYoIXope3JldHVybn16PXhbb107aWYoIXope3JldHVybn16PXhbQV07aWYoIXope3JldHVybn14W3ldPXhbc10rIiAiK3hbb10rIiAiK3hbQV07ZGVsZXRlIHhbc107ZGVsZXRlIHhbb107ZGVsZXRlIHhbQV19cj1yLnJlcGxhY2UoLyYoIz9bYS16MC05XSspOy9nLCImJDFfTUNFX1NFTUlfIik7ayhyLnNwbGl0KCI7IiksZnVuY3Rpb24ocyl7dmFyIG8sdD1bXTtpZihzKXtzPXMucmVwbGFjZSgvX01DRV9TRU1JXy9nLCI7Iik7cz1zLnJlcGxhY2UoL3VybFwoW15cKV0rXCkvZyxmdW5jdGlvbih5KXt0LnB1c2goeSk7cmV0dXJuInVybCgiK3QubGVuZ3RoKyIpIn0pO3M9cy5zcGxpdCgiOiIpO289bS50cmltKHNbMV0pO289by5yZXBsYWNlKC91cmxcKChbXlwpXSspXCkvZyxmdW5jdGlvbih6LHkpe3JldHVybiB0W3BhcnNlSW50KHkpLTFdfSk7bz1vLnJlcGxhY2UoL3JnYlwoW15cKV0rXCkvZyxmdW5jdGlvbih5KXtyZXR1cm4gdS50b0hleCh5KX0pO2lmKHYudXJsX2NvbnZlcnRlcil7bz1vLnJlcGxhY2UoL3VybFwoW1wnXCJdPyhbXlwpXCdcIl0rKVtcJ1wiXT9cKS9nLGZ1bmN0aW9uKHkseil7cmV0dXJuInVybCgiK3YudXJsX2NvbnZlcnRlci5jYWxsKHYudXJsX2NvbnZlcnRlcl9zY29wZXx8dSx1LmRlY29kZSh6KSwic3R5bGUiLG51bGwpKyIpIn0pfXhbbS50cmltKHNbMF0pLnRvTG93ZXJDYXNlKCldPW99fSk7cCgiYm9yZGVyIiwiIiwiYm9yZGVyIik7cCgiYm9yZGVyIiwiLXdpZHRoIiwiYm9yZGVyLXdpZHRoIik7cCgiYm9yZGVyIiwiLWNvbG9yIiwiYm9yZGVyLWNvbG9yIik7cCgiYm9yZGVyIiwiLXN0eWxlIiwiYm9yZGVyLXN0eWxlIik7cCgicGFkZGluZyIsIiIsInBhZGRpbmciKTtwKCJtYXJnaW4iLCIiLCJtYXJnaW4iKTtxKCJib3JkZXIiLCJib3JkZXItd2lkdGgiLCJib3JkZXItc3R5bGUiLCJib3JkZXItY29sb3IiKTtpZihkKXtpZih4LmJvcmRlcj09Im1lZGl1bSBub25lIil7eC5ib3JkZXI9IiJ9fXJldHVybiB4fSxzZXJpYWxpemVTdHlsZTpmdW5jdGlvbih2LHApe3ZhciBxPXRoaXMscj0iIjtmdW5jdGlvbiB1KHMsbyl7aWYobyYmcyl7aWYoby5pbmRleE9mKCItIik9PT0wKXtyZXR1cm59c3dpdGNoKG8pe2Nhc2UiZm9udC13ZWlnaHQiOmlmKHM9PTcwMCl7cz0iYm9sZCJ9YnJlYWs7Y2FzZSJjb2xvciI6Y2FzZSJiYWNrZ3JvdW5kLWNvbG9yIjpzPXMudG9Mb3dlckNhc2UoKTticmVha31yKz0ocj8iICI6IiIpK28rIjogIitzKyI7In19aWYocCYmcS5fc3R5bGVzKXtrKHEuX3N0eWxlc1siKiJdLGZ1bmN0aW9uKG8pe3UodltvXSxvKX0pO2socS5fc3R5bGVzW3AudG9Mb3dlckNhc2UoKV0sZnVuY3Rpb24obyl7dSh2W29dLG8pfSl9ZWxzZXtrKHYsdSl9cmV0dXJuIHJ9LGxvYWRDU1M6ZnVuY3Rpb24obyl7dmFyIHE9dGhpcyxyPXEuZG9jLHA7aWYoIW8pe289IiJ9cD1xLnNlbGVjdCgiaGVhZCIpWzBdO2soby5zcGxpdCgiLCIpLGZ1bmN0aW9uKHMpe3ZhciB0O2lmKHEuZmlsZXNbc10pe3JldHVybn1xLmZpbGVzW3NdPXRydWU7dD1xLmNyZWF0ZSgibGluayIse3JlbDoic3R5bGVzaGVldCIsaHJlZjptLl9hZGRWZXIocyl9KTtpZihkJiZyLmRvY3VtZW50TW9kZSYmci5yZWNhbGMpe3Qub25sb2FkPWZ1bmN0aW9uKCl7ci5yZWNhbGMoKTt0Lm9ubG9hZD1udWxsfX1wLmFwcGVuZENoaWxkKHQpfSl9LGFkZENsYXNzOmZ1bmN0aW9uKG8scCl7cmV0dXJuIHRoaXMucnVuKG8sZnVuY3Rpb24ocSl7dmFyIHI7aWYoIXApe3JldHVybiAwfWlmKHRoaXMuaGFzQ2xhc3MocSxwKSl7cmV0dXJuIHEuY2xhc3NOYW1lfXI9dGhpcy5yZW1vdmVDbGFzcyhxLHApO3JldHVybiBxLmNsYXNzTmFtZT0ociE9IiI/KHIrIiAiKToiIikrcH0pfSxyZW1vdmVDbGFzczpmdW5jdGlvbihxLHIpe3ZhciBvPXRoaXMscDtyZXR1cm4gby5ydW4ocSxmdW5jdGlvbih0KXt2YXIgcztpZihvLmhhc0NsYXNzKHQscikpe2lmKCFwKXtwPW5ldyBSZWdFeHAoIihefFxccyspIityKyIoXFxzK3wkKSIsImciKX1zPXQuY2xhc3NOYW1lLnJlcGxhY2UocCwiICIpO3M9bS50cmltKHMhPSIgIj9zOiIiKTt0LmNsYXNzTmFtZT1zO2lmKCFzKXt0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTt0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9cmV0dXJuIHN9cmV0dXJuIHQuY2xhc3NOYW1lfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKHAsbyl7cD10aGlzLmdldChwKTtpZighcHx8IW8pe3JldHVybiBmYWxzZX1yZXR1cm4oIiAiK3AuY2xhc3NOYW1lKyIgIikuaW5kZXhPZigiICIrbysiICIpIT09LTF9LHNob3c6ZnVuY3Rpb24obyl7cmV0dXJuIHRoaXMuc2V0U3R5bGUobywiZGlzcGxheSIsImJsb2NrIil9LGhpZGU6ZnVuY3Rpb24obyl7cmV0dXJuIHRoaXMuc2V0U3R5bGUobywiZGlzcGxheSIsIm5vbmUiKX0saXNIaWRkZW46ZnVuY3Rpb24obyl7bz10aGlzLmdldChvKTtyZXR1cm4gIW98fG8uc3R5bGUuZGlzcGxheT09Im5vbmUifHx0aGlzLmdldFN0eWxlKG8sImRpc3BsYXkiKT09Im5vbmUifSx1bmlxdWVJZDpmdW5jdGlvbihvKXtyZXR1cm4oIW8/Im1jZV8iOm8pKyh0aGlzLmNvdW50ZXIrKyl9LHNldEhUTUw6ZnVuY3Rpb24ocSxwKXt2YXIgbz10aGlzO3JldHVybiB0aGlzLnJ1bihxLGZ1bmN0aW9uKHYpe3ZhciByLHQscyx6LHUscjtwPW8ucHJvY2Vzc0hUTUwocCk7aWYoZCl7ZnVuY3Rpb24geSgpe3doaWxlKHYuZmlyc3RDaGlsZCl7di5maXJzdENoaWxkLnJlbW92ZU5vZGUoKX10cnl7di5pbm5lckhUTUw9IjxiciAvPiIrcDt2LnJlbW92ZUNoaWxkKHYuZmlyc3RDaGlsZCl9Y2F0Y2goeCl7cj1vLmNyZWF0ZSgiZGl2Iik7ci5pbm5lckhUTUw9IjxiciAvPiIrcDtrKHIuY2hpbGROb2RlcyxmdW5jdGlvbihCLEEpe2lmKEEpe3YuYXBwZW5kQ2hpbGQoQil9fSl9fWlmKG8uc2V0dGluZ3MuZml4X2llX3BhcmFncmFwaHMpe3A9cC5yZXBsYWNlKC88cD48XC9wPnw8cChbXj5dKyk+PFwvcD58PHBbXlwvK11cLz4vZ2ksJzxwJDEgX21jZV9rZWVwPSJ0cnVlIj4mbmJzcDs8L3A+Jyl9eSgpO2lmKG8uc2V0dGluZ3MuZml4X2llX3BhcmFncmFwaHMpe3M9di5nZXRFbGVtZW50c0J5VGFnTmFtZSgicCIpO2Zvcih0PXMubGVuZ3RoLTEscj0wO3Q+PTA7dC0tKXt6PXNbdF07aWYoIXouaGFzQ2hpbGROb2RlcygpKXtpZighei5fbWNlX2tlZXApe3I9MTticmVha316LnJlbW92ZUF0dHJpYnV0ZSgiX21jZV9rZWVwIil9fX1pZihyKXtwPXAucmVwbGFjZSgvPHAgKFtePl0rKT58PHA+L2lnLCc8ZGl2ICQxIF9tY2VfdG1wPSIxIj4nKTtwPXAucmVwbGFjZSgvPFwvcD4vZ2ksIjwvZGl2PiIpO3koKTtpZihvLnNldHRpbmdzLmZpeF9pZV9wYXJhZ3JhcGhzKXtzPXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkRJViIpO2Zvcih0PXMubGVuZ3RoLTE7dD49MDt0LS0pe3o9c1t0XTtpZih6Ll9tY2VfdG1wKXt1PW8uZG9jLmNyZWF0ZUVsZW1lbnQoInAiKTt6LmNsb25lTm9kZShmYWxzZSkub3V0ZXJIVE1MLnJlcGxhY2UoLyhbYS16MC05XC1fXSspPS9naSxmdW5jdGlvbihBLHgpe3ZhciBCO2lmKHghPT0iX21jZV90bXAiKXtCPXouZ2V0QXR0cmlidXRlKHgpO2lmKCFCJiZ4PT09ImNsYXNzIil7Qj16LmNsYXNzTmFtZX11LnNldEF0dHJpYnV0ZSh4LEIpfX0pO2ZvcihyPTA7cjx6LmNoaWxkTm9kZXMubGVuZ3RoO3IrKyl7dS5hcHBlbmRDaGlsZCh6LmNoaWxkTm9kZXNbcl0uY2xvbmVOb2RlKHRydWUpKX16LnN3YXBOb2RlKHUpfX19fX1lbHNle3YuaW5uZXJIVE1MPXB9cmV0dXJuIHB9KX0scHJvY2Vzc0hUTUw6ZnVuY3Rpb24ocil7dmFyIHA9dGhpcyxxPXAuc2V0dGluZ3Msdj1bXTtpZighcS5wcm9jZXNzX2h0bWwpe3JldHVybiByfWlmKGQpe3I9ci5yZXBsYWNlKC8mYXBvczsvZywiJiMzOTsiKTtyPXIucmVwbGFjZSgvXHMrKGRpc2FibGVkfGNoZWNrZWR8cmVhZG9ubHl8c2VsZWN0ZWQpXHMqPVxzKltcIlwnXT8oZmFsc2V8MClbXCJcJ10/L2dpLCIiKX1yPW0uX3JlcGxhY2UoLzxhKCApKFtePl0rKVwvPnw8YVwvPi9naSwiPGEkMSQyPjwvYT4iLHIpO2lmKHEua2VlcF92YWx1ZXMpe2lmKC88c2NyaXB0fG5vc2NyaXB0fHN0eWxlL2kudGVzdChyKSl7ZnVuY3Rpb24gbyh0KXt0PXQucmVwbGFjZSgvKDwhLS1cW0NEQVRBXFt8XF1cXS0tPikvZywiXG4iKTt0PXQucmVwbGFjZSgvXltcclxuXSp8W1xyXG5dKiQvZywiIik7dD10LnJlcGxhY2UoL15ccyooXC9cL1xzKjwhLS18XC9cL1xzKjwhXFtDREFUQVxbfDwhLS18PCFcW0NEQVRBXFspW1xyXG5dKi9nLCIiKTt0PXQucmVwbGFjZSgvXHMqKFwvXC9ccypcXVxdPnxcL1wvXHMqLS0+fFxdXF0+fC0tPnxcXVxdLS0+KVxzKiQvZywiIik7cmV0dXJuIHR9cj1yLnJlcGxhY2UoLzxzY3JpcHQoW14+XSt8KT4oW1xzXFNdKj8pPFwvc2NyaXB0Pi9naSxmdW5jdGlvbihzLHgsdCl7aWYoIXgpe3g9JyB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiJ314PXgucmVwbGFjZSgvc3JjPVwiKFteXCJdKylcIj8vaSxmdW5jdGlvbih5LHope2lmKHEudXJsX2NvbnZlcnRlcil7ej1wLmVuY29kZShxLnVybF9jb252ZXJ0ZXIuY2FsbChxLnVybF9jb252ZXJ0ZXJfc2NvcGV8fHAscC5kZWNvZGUoeiksInNyYyIsInNjcmlwdCIpKX1yZXR1cm4nX21jZV9zcmM9IicreisnIid9KTtpZihtLnRyaW0odCkpe3YucHVzaChvKHQpKTt0PSI8IS0tXG5NQ0VfU0NSSVBUOiIrKHYubGVuZ3RoLTEpKyJcbi8vIC0tPiJ9cmV0dXJuIjxtY2U6c2NyaXB0Iit4KyI+Iit0KyI8L21jZTpzY3JpcHQ+In0pO3I9ci5yZXBsYWNlKC88c3R5bGUoW14+XSt8KT4oW1xzXFNdKj8pPFwvc3R5bGU+L2dpLGZ1bmN0aW9uKHMseCx0KXtpZih0KXt2LnB1c2gobyh0KSk7dD0iPCEtLVxuTUNFX1NDUklQVDoiKyh2Lmxlbmd0aC0xKSsiXG4tLT4ifXJldHVybiI8bWNlOnN0eWxlIit4KyI+Iit0KyI8L21jZTpzdHlsZT48c3R5bGUgIit4KycgX21jZV9ib2d1cz0iMSI+Jyt0KyI8L3N0eWxlPiJ9KTtyPXIucmVwbGFjZSgvPG5vc2NyaXB0KFtePl0rfCk+KFtcc1xTXSo/KTxcL25vc2NyaXB0Pi9nLGZ1bmN0aW9uKHMseCx0KXtyZXR1cm4iPG1jZTpub3NjcmlwdCIreCsiPjwhLS0iK3AuZW5jb2RlKHQpLnJlcGxhY2UoLy0tL2csIiYjNDU7JiM0NTsiKSsiLS0+PC9tY2U6bm9zY3JpcHQ+In0pfXI9bS5fcmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKylcXVxdPi9nLCI8IS0tW0NEQVRBWyQxXV0tLT4iLHIpO2Z1bmN0aW9uIHUocyl7cmV0dXJuIHMucmVwbGFjZShoLGZ1bmN0aW9uKHkseix4LHQpe3JldHVybiI8Iit6K3gucmVwbGFjZShsLGZ1bmN0aW9uKEIsQSxFLEQsQyl7dmFyIEY7QT1BLnRvTG93ZXJDYXNlKCk7RT1FfHxEfHxDfHwiIjtpZihlW0FdKXtpZihFPT09ImZhbHNlInx8RT09PSIwIil7cmV0dXJufXJldHVybiBBKyc9IicrQSsnIid9aWYoZltBXSYmeC5pbmRleE9mKCJfbWNlXyIrQSk9PS0xKXtGPXAuZGVjb2RlKEUpO2lmKHEudXJsX2NvbnZlcnRlciYmKEE9PSJzcmMifHxBPT0iaHJlZiIpKXtGPXEudXJsX2NvbnZlcnRlci5jYWxsKHEudXJsX2NvbnZlcnRlcl9zY29wZXx8cCxGLEEseil9aWYoQT09InN0eWxlIil7Rj1wLnNlcmlhbGl6ZVN0eWxlKHAucGFyc2VTdHlsZShGKSxBKX1yZXR1cm4gQSsnPSInK0UrJyIgX21jZV8nK0ErJz0iJytwLmVuY29kZShGKSsnIid9cmV0dXJuIEJ9KSt0KyI+In0pfXI9dShyKTtyPXIucmVwbGFjZSgvTUNFX1NDUklQVDooWzAtOV0rKS9nLGZ1bmN0aW9uKHQscyl7cmV0dXJuIHZbc119KX1yZXR1cm4gcn0sZ2V0T3V0ZXJIVE1MOmZ1bmN0aW9uKG8pe3ZhciBwO289dGhpcy5nZXQobyk7aWYoIW8pe3JldHVybiBudWxsfWlmKG8ub3V0ZXJIVE1MIT09dW5kZWZpbmVkKXtyZXR1cm4gby5vdXRlckhUTUx9cD0oby5vd25lckRvY3VtZW50fHx0aGlzLmRvYykuY3JlYXRlRWxlbWVudCgiYm9keSIpO3AuYXBwZW5kQ2hpbGQoby5jbG9uZU5vZGUodHJ1ZSkpO3JldHVybiBwLmlubmVySFRNTH0sc2V0T3V0ZXJIVE1MOmZ1bmN0aW9uKHIscCxzKXt2YXIgbz10aGlzO2Z1bmN0aW9uIHEodSx0LHgpe3ZhciB5LHY7dj14LmNyZWF0ZUVsZW1lbnQoImJvZHkiKTt2LmlubmVySFRNTD10O3k9di5sYXN0Q2hpbGQ7d2hpbGUoeSl7by5pbnNlcnRBZnRlcih5LmNsb25lTm9kZSh0cnVlKSx1KTt5PXkucHJldmlvdXNTaWJsaW5nfW8ucmVtb3ZlKHUpfXJldHVybiB0aGlzLnJ1bihyLGZ1bmN0aW9uKHUpe3U9by5nZXQodSk7aWYodS5ub2RlVHlwZT09MSl7cz1zfHx1Lm93bmVyRG9jdW1lbnR8fG8uZG9jO2lmKGQpe3RyeXtpZihkJiZ1Lm5vZGVUeXBlPT0xKXt1Lm91dGVySFRNTD1wfWVsc2V7cSh1LHAscyl9fWNhdGNoKHQpe3EodSxwLHMpfX1lbHNle3EodSxwLHMpfX19KX0sZGVjb2RlOmZ1bmN0aW9uKHApe3ZhciBxLHIsbztpZigvJltcdyNdKzsvLnRlc3QocCkpe3E9dGhpcy5kb2MuY3JlYXRlRWxlbWVudCgiZGl2Iik7cS5pbm5lckhUTUw9cDtyPXEuZmlyc3RDaGlsZDtvPSIiO2lmKHIpe2Rve28rPXIubm9kZVZhbHVlfXdoaWxlKHI9ci5uZXh0U2libGluZyl9cmV0dXJuIG98fHB9cmV0dXJuIHB9LGVuY29kZTpmdW5jdGlvbihvKXtyZXR1cm4oIiIrbykucmVwbGFjZShuLGZ1bmN0aW9uKHApe3JldHVybiBjW3BdfSl9LGluc2VydEFmdGVyOmZ1bmN0aW9uKG8scCl7cD10aGlzLmdldChwKTtyZXR1cm4gdGhpcy5ydW4obyxmdW5jdGlvbihyKXt2YXIgcSxzO3E9cC5wYXJlbnROb2RlO3M9cC5uZXh0U2libGluZztpZihzKXtxLmluc2VydEJlZm9yZShyLHMpfWVsc2V7cS5hcHBlbmRDaGlsZChyKX1yZXR1cm4gcn0pfSxpc0Jsb2NrOmZ1bmN0aW9uKG8pe2lmKG8ubm9kZVR5cGUmJm8ubm9kZVR5cGUhPT0xKXtyZXR1cm4gZmFsc2V9bz1vLm5vZGVOYW1lfHxvO3JldHVybiBhLnRlc3Qobyl9LHJlcGxhY2U6ZnVuY3Rpb24ocyxyLHApe3ZhciBxPXRoaXM7aWYoaihyLCJhcnJheSIpKXtzPXMuY2xvbmVOb2RlKHRydWUpfXJldHVybiBxLnJ1bihyLGZ1bmN0aW9uKHQpe2lmKHApe2sobS5ncmVwKHQuY2hpbGROb2RlcyksZnVuY3Rpb24obyl7cy5hcHBlbmRDaGlsZChvKX0pfXJldHVybiB0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHMsdCl9KX0scmVuYW1lOmZ1bmN0aW9uKHIsbyl7dmFyIHE9dGhpcyxwO2lmKHIubm9kZU5hbWUhPW8udG9VcHBlckNhc2UoKSl7cD1xLmNyZWF0ZShvKTtrKHEuZ2V0QXR0cmlicyhyKSxmdW5jdGlvbihzKXtxLnNldEF0dHJpYihwLHMubm9kZU5hbWUscS5nZXRBdHRyaWIocixzLm5vZGVOYW1lKSl9KTtxLnJlcGxhY2UocCxyLDEpfXJldHVybiBwfHxyfSxmaW5kQ29tbW9uQW5jZXN0b3I6ZnVuY3Rpb24ocSxvKXt2YXIgcj1xLHA7d2hpbGUocil7cD1vO3doaWxlKHAmJnIhPXApe3A9cC5wYXJlbnROb2RlfWlmKHI9PXApe2JyZWFrfXI9ci5wYXJlbnROb2RlfWlmKCFyJiZxLm93bmVyRG9jdW1lbnQpe3JldHVybiBxLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fXJldHVybiByfSx0b0hleDpmdW5jdGlvbihvKXt2YXIgcT0vXlxzKnJnYlxzKj9cKFxzKj8oWzAtOV0rKVxzKj8sXHMqPyhbMC05XSspXHMqPyxccyo/KFswLTldKylccyo/XClccyokL2kuZXhlYyhvKTtmdW5jdGlvbiBwKHIpe3I9cGFyc2VJbnQocikudG9TdHJpbmcoMTYpO3JldHVybiByLmxlbmd0aD4xP3I6IjAiK3J9aWYocSl7bz0iIyIrcChxWzFdKStwKHFbMl0pK3AocVszXSk7cmV0dXJuIG99cmV0dXJuIG99LGdldENsYXNzZXM6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLG89W10scix1PXt9LHY9cy5zZXR0aW5ncy5jbGFzc19maWx0ZXIscTtpZihzLmNsYXNzZXMpe3JldHVybiBzLmNsYXNzZXN9ZnVuY3Rpb24geCh0KXtrKHQuaW1wb3J0cyxmdW5jdGlvbih5KXt4KHkpfSk7ayh0LmNzc1J1bGVzfHx0LnJ1bGVzLGZ1bmN0aW9uKHkpe3N3aXRjaCh5LnR5cGV8fDEpe2Nhc2UgMTppZih5LnNlbGVjdG9yVGV4dCl7ayh5LnNlbGVjdG9yVGV4dC5zcGxpdCgiLCIpLGZ1bmN0aW9uKHope3o9ei5yZXBsYWNlKC9eXHMqfFxzKiR8XlxzXC4vZywiIik7aWYoL1wubWNlLy50ZXN0KHopfHwhL1wuW1x3XC1dKyQvLnRlc3Qoeikpe3JldHVybn1xPXo7ej1tLl9yZXBsYWNlKC8uKlwuKFthLXowLTlfXC1dKykuKi9pLCIkMSIseik7aWYodiYmISh6PXYoeixxKSkpe3JldHVybn1pZighdVt6XSl7by5wdXNoKHsiY2xhc3MiOnp9KTt1W3pdPTF9fSl9YnJlYWs7Y2FzZSAzOngoeS5zdHlsZVNoZWV0KTticmVha319KX10cnl7ayhzLmRvYy5zdHlsZVNoZWV0cyx4KX1jYXRjaChwKXt9aWYoby5sZW5ndGg+MCl7cy5jbGFzc2VzPW99cmV0dXJuIG99LHJ1bjpmdW5jdGlvbih1LHIscSl7dmFyIHA9dGhpcyx2O2lmKHAuZG9jJiZ0eXBlb2YodSk9PT0ic3RyaW5nIil7dT1wLmdldCh1KX1pZighdSl7cmV0dXJuIGZhbHNlfXE9cXx8dGhpcztpZighdS5ub2RlVHlwZSYmKHUubGVuZ3RofHx1Lmxlbmd0aD09PTApKXt2PVtdO2sodSxmdW5jdGlvbihzLG8pe2lmKHMpe2lmKHR5cGVvZihzKT09InN0cmluZyIpe3M9cC5kb2MuZ2V0RWxlbWVudEJ5SWQocyl9di5wdXNoKHIuY2FsbChxLHMsbykpfX0pO3JldHVybiB2fXJldHVybiByLmNhbGwocSx1KX0sZ2V0QXR0cmliczpmdW5jdGlvbihxKXt2YXIgcDtxPXRoaXMuZ2V0KHEpO2lmKCFxKXtyZXR1cm5bXX1pZihkKXtwPVtdO2lmKHEubm9kZU5hbWU9PSJPQkpFQ1QiKXtyZXR1cm4gcS5hdHRyaWJ1dGVzfWlmKHEubm9kZU5hbWU9PT0iT1BUSU9OIiYmdGhpcy5nZXRBdHRyaWIocSwic2VsZWN0ZWQiKSl7cC5wdXNoKHtzcGVjaWZpZWQ6MSxub2RlTmFtZToic2VsZWN0ZWQifSl9cS5jbG9uZU5vZGUoZmFsc2UpLm91dGVySFRNTC5yZXBsYWNlKC88XC8/W1x3OlwtXSsgP3w9W1wiXVteXCJdK1wifD1cJ1teXCddK1wnfD1bXHdcLV0rfD4vZ2ksIiIpLnJlcGxhY2UoL1tcdzpcLV0rL2dpLGZ1bmN0aW9uKG8pe3AucHVzaCh7c3BlY2lmaWVkOjEsbm9kZU5hbWU6b30pfSk7cmV0dXJuIHB9cmV0dXJuIHEuYXR0cmlidXRlc30sZGVzdHJveTpmdW5jdGlvbihwKXt2YXIgbz10aGlzO2lmKG8uZXZlbnRzKXtvLmV2ZW50cy5kZXN0cm95KCl9by53aW49by5kb2M9by5yb290PW8uZXZlbnRzPW51bGw7aWYoIXApe20ucmVtb3ZlVW5sb2FkKG8uZGVzdHJveSl9fSxjcmVhdGVSbmc6ZnVuY3Rpb24oKXt2YXIgbz10aGlzLmRvYztyZXR1cm4gby5jcmVhdGVSYW5nZT9vLmNyZWF0ZVJhbmdlKCk6bmV3IG0uZG9tLlJhbmdlKHRoaXMpfSxub2RlSW5kZXg6ZnVuY3Rpb24ocyx0KXt2YXIgbz0wLHEscixwO2lmKHMpe2ZvcihxPXMubm9kZVR5cGUscz1zLnByZXZpb3VzU2libGluZyxyPXM7cztzPXMucHJldmlvdXNTaWJsaW5nKXtwPXMubm9kZVR5cGU7aWYodCYmcD09Myl7aWYocD09cXx8IXMubm9kZVZhbHVlLmxlbmd0aCl7Y29udGludWV9fW8rKztxPXB9fXJldHVybiBvfSxzcGxpdDpmdW5jdGlvbih1LHMseSl7dmFyIHo9dGhpcyxvPXouY3JlYXRlUm5nKCksdixxLHg7ZnVuY3Rpb24gcChBKXt2YXIgdCxyPUEuY2hpbGROb2RlcztpZihBLm5vZGVUeXBlPT0xJiZBLmdldEF0dHJpYnV0ZSgiX21jZV90eXBlIik9PSJib29rbWFyayIpe3JldHVybn1mb3IodD1yLmxlbmd0aC0xO3Q+PTA7dC0tKXtwKHJbdF0pfWlmKEEubm9kZVR5cGUhPTkpe2lmKEEubm9kZVR5cGU9PTMmJkEubm9kZVZhbHVlLmxlbmd0aD4wKXtpZighei5pc0Jsb2NrKEEucGFyZW50Tm9kZSl8fG0udHJpbShBLm5vZGVWYWx1ZSkubGVuZ3RoPjApe3JldHVybn19aWYoQS5ub2RlVHlwZT09MSl7cj1BLmNoaWxkTm9kZXM7aWYoci5sZW5ndGg9PTEmJnJbMF0mJnJbMF0ubm9kZVR5cGU9PTEmJnJbMF0uZ2V0QXR0cmlidXRlKCJfbWNlX3R5cGUiKT09ImJvb2ttYXJrIil7QS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyWzBdLEEpfWlmKHIubGVuZ3RofHwvXihicnxocnxpbnB1dHxpbWcpJC9pLnRlc3QoQS5ub2RlTmFtZSkpe3JldHVybn19ei5yZW1vdmUoQSl9cmV0dXJuIEF9aWYodSYmcyl7by5zZXRTdGFydCh1LnBhcmVudE5vZGUsei5ub2RlSW5kZXgodSkpO28uc2V0RW5kKHMucGFyZW50Tm9kZSx6Lm5vZGVJbmRleChzKSk7dj1vLmV4dHJhY3RDb250ZW50cygpO289ei5jcmVhdGVSbmcoKTtvLnNldFN0YXJ0KHMucGFyZW50Tm9kZSx6Lm5vZGVJbmRleChzKSsxKTtvLnNldEVuZCh1LnBhcmVudE5vZGUsei5ub2RlSW5kZXgodSkrMSk7cT1vLmV4dHJhY3RDb250ZW50cygpO3g9dS5wYXJlbnROb2RlO3guaW5zZXJ0QmVmb3JlKHAodiksdSk7aWYoeSl7eC5yZXBsYWNlQ2hpbGQoeSxzKX1lbHNle3guaW5zZXJ0QmVmb3JlKHMsdSl9eC5pbnNlcnRCZWZvcmUocChxKSx1KTt6LnJlbW92ZSh1KTtyZXR1cm4geXx8c319LGJpbmQ6ZnVuY3Rpb24ocyxvLHIscSl7dmFyIHA9dGhpcztpZighcC5ldmVudHMpe3AuZXZlbnRzPW5ldyBtLmRvbS5FdmVudFV0aWxzKCl9cmV0dXJuIHAuZXZlbnRzLmFkZChzLG8scixxfHx0aGlzKX0sdW5iaW5kOmZ1bmN0aW9uKHIsbyxxKXt2YXIgcD10aGlzO2lmKCFwLmV2ZW50cyl7cC5ldmVudHM9bmV3IG0uZG9tLkV2ZW50VXRpbHMoKX1yZXR1cm4gcC5ldmVudHMucmVtb3ZlKHIsbyxxKX0sX2ZpbmRTaWI6ZnVuY3Rpb24ocixvLHApe3ZhciBxPXRoaXMscz1vO2lmKHIpe2lmKGoocywic3RyaW5nIikpe3M9ZnVuY3Rpb24odCl7cmV0dXJuIHEuaXModCxvKX19Zm9yKHI9cltwXTtyO3I9cltwXSl7aWYocyhyKSl7cmV0dXJuIHJ9fX1yZXR1cm4gbnVsbH0sX2lzUmVzOmZ1bmN0aW9uKG8pe3JldHVybi9eKHRvcHxsZWZ0fGJvdHRvbXxyaWdodHx3aWR0aHxoZWlnaHQpL2kudGVzdChvKXx8LztccyoodG9wfGxlZnR8Ym90dG9tfHJpZ2h0fHdpZHRofGhlaWdodCkvaS50ZXN0KG8pfX0pO20uRE9NPW5ldyBtLmRvbS5ET01VdGlscyhkb2N1bWVudCx7cHJvY2Vzc19odG1sOjB9KX0pKHRpbnltY2UpOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGMpe3ZhciBOPXRoaXMsZT1jLmRvYyxTPTAsRT0xLGo9MixEPXRydWUsUj1mYWxzZSxVPSJzdGFydE9mZnNldCIsaD0ic3RhcnRDb250YWluZXIiLFA9ImVuZENvbnRhaW5lciIsej0iZW5kT2Zmc2V0IixrPXRpbnltY2UuZXh0ZW5kLG49Yy5ub2RlSW5kZXg7ayhOLHtzdGFydENvbnRhaW5lcjplLHN0YXJ0T2Zmc2V0OjAsZW5kQ29udGFpbmVyOmUsZW5kT2Zmc2V0OjAsY29sbGFwc2VkOkQsY29tbW9uQW5jZXN0b3JDb250YWluZXI6ZSxTVEFSVF9UT19TVEFSVDowLFNUQVJUX1RPX0VORDoxLEVORF9UT19FTkQ6MixFTkRfVE9fU1RBUlQ6MyxzZXRTdGFydDpxLHNldEVuZDpzLHNldFN0YXJ0QmVmb3JlOmcsc2V0U3RhcnRBZnRlcjpJLHNldEVuZEJlZm9yZTpKLHNldEVuZEFmdGVyOnUsY29sbGFwc2U6QSxzZWxlY3ROb2RlOngsc2VsZWN0Tm9kZUNvbnRlbnRzOkYsY29tcGFyZUJvdW5kYXJ5UG9pbnRzOnYsZGVsZXRlQ29udGVudHM6cCxleHRyYWN0Q29udGVudHM6SCxjbG9uZUNvbnRlbnRzOmQsaW5zZXJ0Tm9kZTpDLHN1cnJvdW5kQ29udGVudHM6TSxjbG9uZVJhbmdlOkt9KTtmdW5jdGlvbiBxKFYsdCl7QihELFYsdCl9ZnVuY3Rpb24gcyhWLHQpe0IoUixWLHQpfWZ1bmN0aW9uIGcodCl7cSh0LnBhcmVudE5vZGUsbih0KSl9ZnVuY3Rpb24gSSh0KXtxKHQucGFyZW50Tm9kZSxuKHQpKzEpfWZ1bmN0aW9uIEoodCl7cyh0LnBhcmVudE5vZGUsbih0KSl9ZnVuY3Rpb24gdSh0KXtzKHQucGFyZW50Tm9kZSxuKHQpKzEpfWZ1bmN0aW9uIEEodCl7aWYodCl7TltQXT1OW2hdO05bel09TltVXX1lbHNle05baF09TltQXTtOW1VdPU5bel19Ti5jb2xsYXBzZWQ9RH1mdW5jdGlvbiB4KHQpe2codCk7dSh0KX1mdW5jdGlvbiBGKHQpe3EodCwwKTtzKHQsdC5ub2RlVHlwZT09PTE/dC5jaGlsZE5vZGVzLmxlbmd0aDp0Lm5vZGVWYWx1ZS5sZW5ndGgpfWZ1bmN0aW9uIHYoVyxYKXt2YXIgWj1OW2hdLFk9TltVXSxWPU5bUF0sdD1OW3pdO2lmKFc9PT0wKXtyZXR1cm4gRyhaLFksWixZKX1pZihXPT09MSl7cmV0dXJuIEcoWixZLFYsdCl9aWYoVz09PTIpe3JldHVybiBHKFYsdCxWLHQpfWlmKFc9PT0zKXtyZXR1cm4gRyhWLHQsWixZKX19ZnVuY3Rpb24gcCgpe20oail9ZnVuY3Rpb24gSCgpe3JldHVybiBtKFMpfWZ1bmN0aW9uIGQoKXtyZXR1cm4gbShFKX1mdW5jdGlvbiBDKFkpe3ZhciBWPXRoaXNbaF0sdD10aGlzW1VdLFgsVztpZigoVi5ub2RlVHlwZT09PTN8fFYubm9kZVR5cGU9PT00KSYmVi5ub2RlVmFsdWUpe2lmKCF0KXtWLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKFksVil9ZWxzZXtpZih0Pj1WLm5vZGVWYWx1ZS5sZW5ndGgpe2MuaW5zZXJ0QWZ0ZXIoWSxWKX1lbHNle1g9Vi5zcGxpdFRleHQodCk7Vi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShZLFgpfX19ZWxzZXtpZihWLmNoaWxkTm9kZXMubGVuZ3RoPjApe1c9Vi5jaGlsZE5vZGVzW3RdfWlmKFcpe1YuaW5zZXJ0QmVmb3JlKFksVyl9ZWxzZXtWLmFwcGVuZENoaWxkKFkpfX19ZnVuY3Rpb24gTShWKXt2YXIgdD1OLmV4dHJhY3RDb250ZW50cygpO04uaW5zZXJ0Tm9kZShWKTtWLmFwcGVuZENoaWxkKHQpO04uc2VsZWN0Tm9kZShWKX1mdW5jdGlvbiBLKCl7cmV0dXJuIGsobmV3IGIoYykse3N0YXJ0Q29udGFpbmVyOk5baF0sc3RhcnRPZmZzZXQ6TltVXSxlbmRDb250YWluZXI6TltQXSxlbmRPZmZzZXQ6Tlt6XSxjb2xsYXBzZWQ6Ti5jb2xsYXBzZWQsY29tbW9uQW5jZXN0b3JDb250YWluZXI6Ti5jb21tb25BbmNlc3RvckNvbnRhaW5lcn0pfWZ1bmN0aW9uIE8odCxWKXt2YXIgVztpZih0Lm5vZGVUeXBlPT0zKXtyZXR1cm4gdH1pZihWPDApe3JldHVybiB0fVc9dC5maXJzdENoaWxkO3doaWxlKFcmJlY+MCl7LS1WO1c9Vy5uZXh0U2libGluZ31pZihXKXtyZXR1cm4gV31yZXR1cm4gdH1mdW5jdGlvbiBsKCl7cmV0dXJuKE5baF09PU5bUF0mJk5bVV09PU5bel0pfWZ1bmN0aW9uIEcoWCxaLFYsWSl7dmFyIGFhLFcsdCxhYixhZCxhYztpZihYPT1WKXtpZihaPT1ZKXtyZXR1cm4gMH1pZihaPFkpe3JldHVybiAtMX1yZXR1cm4gMX1hYT1WO3doaWxlKGFhJiZhYS5wYXJlbnROb2RlIT1YKXthYT1hYS5wYXJlbnROb2RlfWlmKGFhKXtXPTA7dD1YLmZpcnN0Q2hpbGQ7d2hpbGUodCE9YWEmJlc8Wil7VysrO3Q9dC5uZXh0U2libGluZ31pZihaPD1XKXtyZXR1cm4gLTF9cmV0dXJuIDF9YWE9WDt3aGlsZShhYSYmYWEucGFyZW50Tm9kZSE9Vil7YWE9YWEucGFyZW50Tm9kZX1pZihhYSl7Vz0wO3Q9Vi5maXJzdENoaWxkO3doaWxlKHQhPWFhJiZXPFkpe1crKzt0PXQubmV4dFNpYmxpbmd9aWYoVzxZKXtyZXR1cm4gLTF9cmV0dXJuIDF9YWI9Yy5maW5kQ29tbW9uQW5jZXN0b3IoWCxWKTthZD1YO3doaWxlKGFkJiZhZC5wYXJlbnROb2RlIT1hYil7YWQ9YWQucGFyZW50Tm9kZX1pZighYWQpe2FkPWFifWFjPVY7d2hpbGUoYWMmJmFjLnBhcmVudE5vZGUhPWFiKXthYz1hYy5wYXJlbnROb2RlfWlmKCFhYyl7YWM9YWJ9aWYoYWQ9PWFjKXtyZXR1cm4gMH10PWFiLmZpcnN0Q2hpbGQ7d2hpbGUodCl7aWYodD09YWQpe3JldHVybiAtMX1pZih0PT1hYyl7cmV0dXJuIDF9dD10Lm5leHRTaWJsaW5nfX1mdW5jdGlvbiBCKFYsWSxYKXt2YXIgdCxXO2lmKFYpe05baF09WTtOW1VdPVh9ZWxzZXtOW1BdPVk7Tlt6XT1YfXQ9TltQXTt3aGlsZSh0LnBhcmVudE5vZGUpe3Q9dC5wYXJlbnROb2RlfVc9TltoXTt3aGlsZShXLnBhcmVudE5vZGUpe1c9Vy5wYXJlbnROb2RlfWlmKFc9PXQpe2lmKEcoTltoXSxOW1VdLE5bUF0sTlt6XSk+MCl7Ti5jb2xsYXBzZShWKX19ZWxzZXtOLmNvbGxhcHNlKFYpfU4uY29sbGFwc2VkPWwoKTtOLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyPWMuZmluZENvbW1vbkFuY2VzdG9yKE5baF0sTltQXSl9ZnVuY3Rpb24gbShhYil7dmFyIGFhLFg9MCxhZD0wLFYsWixXLFksdCxhYztpZihOW2hdPT1OW1BdKXtyZXR1cm4gZihhYil9Zm9yKGFhPU5bUF0sVj1hYS5wYXJlbnROb2RlO1Y7YWE9VixWPVYucGFyZW50Tm9kZSl7aWYoVj09TltoXSl7cmV0dXJuIHIoYWEsYWIpfSsrWH1mb3IoYWE9TltoXSxWPWFhLnBhcmVudE5vZGU7VjthYT1WLFY9Vi5wYXJlbnROb2RlKXtpZihWPT1OW1BdKXtyZXR1cm4gVChhYSxhYil9KythZH1aPWFkLVg7Vz1OW2hdO3doaWxlKFo+MCl7Vz1XLnBhcmVudE5vZGU7Wi0tfVk9TltQXTt3aGlsZShaPDApe1k9WS5wYXJlbnROb2RlO1orK31mb3IodD1XLnBhcmVudE5vZGUsYWM9WS5wYXJlbnROb2RlO3QhPWFjO3Q9dC5wYXJlbnROb2RlLGFjPWFjLnBhcmVudE5vZGUpe1c9dDtZPWFjfXJldHVybiBvKFcsWSxhYil9ZnVuY3Rpb24gZihaKXt2YXIgYWIsWSxYLGFhLHQsVyxWO2lmKFohPWope2FiPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpfWlmKE5bVV09PU5bel0pe3JldHVybiBhYn1pZihOW2hdLm5vZGVUeXBlPT0zKXtZPU5baF0ubm9kZVZhbHVlO1g9WS5zdWJzdHJpbmcoTltVXSxOW3pdKTtpZihaIT1FKXtOW2hdLmRlbGV0ZURhdGEoTltVXSxOW3pdLU5bVV0pO04uY29sbGFwc2UoRCl9aWYoWj09ail7cmV0dXJufWFiLmFwcGVuZENoaWxkKGUuY3JlYXRlVGV4dE5vZGUoWCkpO3JldHVybiBhYn1hYT1PKE5baF0sTltVXSk7dD1OW3pdLU5bVV07d2hpbGUodD4wKXtXPWFhLm5leHRTaWJsaW5nO1Y9eShhYSxaKTtpZihhYil7YWIuYXBwZW5kQ2hpbGQoVil9LS10O2FhPVd9aWYoWiE9RSl7Ti5jb2xsYXBzZShEKX1yZXR1cm4gYWJ9ZnVuY3Rpb24gcihhYixZKXt2YXIgYWEsWixWLHQsWCxXO2lmKFkhPWope2FhPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpfVo9aShhYixZKTtpZihhYSl7YWEuYXBwZW5kQ2hpbGQoWil9Vj1uKGFiKTt0PVYtTltVXTtpZih0PD0wKXtpZihZIT1FKXtOLnNldEVuZEJlZm9yZShhYik7Ti5jb2xsYXBzZShSKX1yZXR1cm4gYWF9Wj1hYi5wcmV2aW91c1NpYmxpbmc7d2hpbGUodD4wKXtYPVoucHJldmlvdXNTaWJsaW5nO1c9eShaLFkpO2lmKGFhKXthYS5pbnNlcnRCZWZvcmUoVyxhYS5maXJzdENoaWxkKX0tLXQ7Wj1YfWlmKFkhPUUpe04uc2V0RW5kQmVmb3JlKGFiKTtOLmNvbGxhcHNlKFIpfXJldHVybiBhYX1mdW5jdGlvbiBUKFosWSl7dmFyIGFiLFYsYWEsdCxYLFc7aWYoWSE9ail7YWI9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCl9YWE9UShaLFkpO2lmKGFiKXthYi5hcHBlbmRDaGlsZChhYSl9Vj1uKFopOysrVjt0PU5bel0tVjthYT1aLm5leHRTaWJsaW5nO3doaWxlKHQ+MCl7WD1hYS5uZXh0U2libGluZztXPXkoYWEsWSk7aWYoYWIpe2FiLmFwcGVuZENoaWxkKFcpfS0tdDthYT1YfWlmKFkhPUUpe04uc2V0U3RhcnRBZnRlcihaKTtOLmNvbGxhcHNlKEQpfXJldHVybiBhYn1mdW5jdGlvbiBvKFosdCxhYyl7dmFyIFcsYWUsWSxhYSxhYixWLGFkLFg7aWYoYWMhPWope2FlPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpfVc9UShaLGFjKTtpZihhZSl7YWUuYXBwZW5kQ2hpbGQoVyl9WT1aLnBhcmVudE5vZGU7YWE9bihaKTthYj1uKHQpOysrYWE7Vj1hYi1hYTthZD1aLm5leHRTaWJsaW5nO3doaWxlKFY+MCl7WD1hZC5uZXh0U2libGluZztXPXkoYWQsYWMpO2lmKGFlKXthZS5hcHBlbmRDaGlsZChXKX1hZD1YOy0tVn1XPWkodCxhYyk7aWYoYWUpe2FlLmFwcGVuZENoaWxkKFcpfWlmKGFjIT1FKXtOLnNldFN0YXJ0QWZ0ZXIoWik7Ti5jb2xsYXBzZShEKX1yZXR1cm4gYWV9ZnVuY3Rpb24gaShhYSxhYil7dmFyIFc9TyhOW1BdLE5bel0tMSksYWMsWixZLHQsVixYPVchPU5bUF07aWYoVz09YWEpe3JldHVybiBMKFcsWCxSLGFiKX1hYz1XLnBhcmVudE5vZGU7Wj1MKGFjLFIsUixhYik7d2hpbGUoYWMpe3doaWxlKFcpe1k9Vy5wcmV2aW91c1NpYmxpbmc7dD1MKFcsWCxSLGFiKTtpZihhYiE9ail7Wi5pbnNlcnRCZWZvcmUodCxaLmZpcnN0Q2hpbGQpfVg9RDtXPVl9aWYoYWM9PWFhKXtyZXR1cm4gWn1XPWFjLnByZXZpb3VzU2libGluZzthYz1hYy5wYXJlbnROb2RlO1Y9TChhYyxSLFIsYWIpO2lmKGFiIT1qKXtWLmFwcGVuZENoaWxkKFopfVo9Vn19ZnVuY3Rpb24gUShhYSxhYil7dmFyIFg9TyhOW2hdLE5bVV0pLFk9WCE9TltoXSxhYyxaLFcsdCxWO2lmKFg9PWFhKXtyZXR1cm4gTChYLFksRCxhYil9YWM9WC5wYXJlbnROb2RlO1o9TChhYyxSLEQsYWIpO3doaWxlKGFjKXt3aGlsZShYKXtXPVgubmV4dFNpYmxpbmc7dD1MKFgsWSxELGFiKTtpZihhYiE9ail7Wi5hcHBlbmRDaGlsZCh0KX1ZPUQ7WD1XfWlmKGFjPT1hYSl7cmV0dXJuIFp9WD1hYy5uZXh0U2libGluZzthYz1hYy5wYXJlbnROb2RlO1Y9TChhYyxSLEQsYWIpO2lmKGFiIT1qKXtWLmFwcGVuZENoaWxkKFopfVo9Vn19ZnVuY3Rpb24gTCh0LFksYWIsYWMpe3ZhciBYLFcsWixWLGFhO2lmKFkpe3JldHVybiB5KHQsYWMpfWlmKHQubm9kZVR5cGU9PTMpe1g9dC5ub2RlVmFsdWU7aWYoYWIpe1Y9TltVXTtXPVguc3Vic3RyaW5nKFYpO1o9WC5zdWJzdHJpbmcoMCxWKX1lbHNle1Y9Tlt6XTtXPVguc3Vic3RyaW5nKDAsVik7Wj1YLnN1YnN0cmluZyhWKX1pZihhYyE9RSl7dC5ub2RlVmFsdWU9Wn1pZihhYz09ail7cmV0dXJufWFhPXQuY2xvbmVOb2RlKFIpO2FhLm5vZGVWYWx1ZT1XO3JldHVybiBhYX1pZihhYz09ail7cmV0dXJufXJldHVybiB0LmNsb25lTm9kZShSKX1mdW5jdGlvbiB5KFYsdCl7aWYodCE9ail7cmV0dXJuIHQ9PUU/Vi5jbG9uZU5vZGUoRCk6Vn1WLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoVil9fWEuUmFuZ2U9Yn0pKHRpbnltY2UuZG9tKTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGcpe3ZhciBpPXRoaXMsaj0iXHVGRUZGIixlLGgsZD1nLmRvbSxjPXRydWUsZj1mYWxzZTtmdW5jdGlvbiBiKCl7dmFyIG49Zy5nZXRSbmcoKSxrPWQuY3JlYXRlUm5nKCksbSxvO209bi5pdGVtP24uaXRlbSgwKTpuLnBhcmVudEVsZW1lbnQoKTtpZihtLm93bmVyRG9jdW1lbnQhPWQuZG9jKXtyZXR1cm4ga31pZihuLml0ZW18fCFtLmhhc0NoaWxkTm9kZXMoKSl7ay5zZXRTdGFydChtLnBhcmVudE5vZGUsZC5ub2RlSW5kZXgobSkpO2suc2V0RW5kKGsuc3RhcnRDb250YWluZXIsay5zdGFydE9mZnNldCsxKTtyZXR1cm4ga31vPWcuaXNDb2xsYXBzZWQoKTtmdW5jdGlvbiBsKHMpe3ZhciB1LHEsdCxwLEE9MCx4LHkseixyLHY7cj1uLmR1cGxpY2F0ZSgpO3IuY29sbGFwc2Uocyk7dT1kLmNyZWF0ZSgiYSIpO3o9ci5wYXJlbnRFbGVtZW50KCk7aWYoIXouaGFzQ2hpbGROb2RlcygpKXtrW3M/InNldFN0YXJ0Ijoic2V0RW5kIl0oeiwwKTtyZXR1cm59ei5hcHBlbmRDaGlsZCh1KTtyLm1vdmVUb0VsZW1lbnRUZXh0KHUpO3Y9bi5jb21wYXJlRW5kUG9pbnRzKHM/IlN0YXJ0VG9TdGFydCI6IkVuZFRvRW5kIixyKTtpZih2PjApe2tbcz8ic2V0U3RhcnRBZnRlciI6InNldEVuZEFmdGVyIl0oeik7ZC5yZW1vdmUodSk7cmV0dXJufXA9dGlueW1jZS5ncmVwKHouY2hpbGROb2Rlcyk7eD1wLmxlbmd0aC0xO3doaWxlKEE8PXgpe3k9TWF0aC5mbG9vcigoQSt4KS8yKTt6Lmluc2VydEJlZm9yZSh1LHBbeV0pO3IubW92ZVRvRWxlbWVudFRleHQodSk7dj1uLmNvbXBhcmVFbmRQb2ludHMocz8iU3RhcnRUb1N0YXJ0IjoiRW5kVG9FbmQiLHIpO2lmKHY+MCl7QT15KzF9ZWxzZXtpZih2PDApe3g9eS0xfWVsc2V7Zm91bmQ9dHJ1ZTticmVha319fXE9dj4wfHx5PT0wP3UubmV4dFNpYmxpbmc6dS5wcmV2aW91c1NpYmxpbmc7aWYocS5ub2RlVHlwZT09MSl7ZC5yZW1vdmUodSk7dD1kLm5vZGVJbmRleChxKTtxPXEucGFyZW50Tm9kZTtpZighc3x8eT4wKXt0Kyt9fWVsc2V7aWYodj4wfHx5PT0wKXtyLnNldEVuZFBvaW50KHM/IlN0YXJ0VG9TdGFydCI6IkVuZFRvRW5kIixuKTt0PXIudGV4dC5sZW5ndGh9ZWxzZXtyLnNldEVuZFBvaW50KHM/IlN0YXJ0VG9TdGFydCI6IkVuZFRvRW5kIixuKTt0PXEubm9kZVZhbHVlLmxlbmd0aC1yLnRleHQubGVuZ3RofWQucmVtb3ZlKHUpfWtbcz8ic2V0U3RhcnQiOiJzZXRFbmQiXShxLHQpfWwodHJ1ZSk7aWYoIW8pe2woKX1yZXR1cm4ga310aGlzLmFkZFJhbmdlPWZ1bmN0aW9uKGspe3ZhciBwLG4sbSxyLHUscyx0PWcuZG9tLmRvYyxvPXQuYm9keTtmdW5jdGlvbiBsKEIpe3ZhciB4LEEsdix6LHk7dj1kLmNyZWF0ZSgiYSIpO3g9Qj9tOnU7QT1CP3I6czt6PXAuZHVwbGljYXRlKCk7aWYoeD09dCl7eD1vO0E9MH1pZih4Lm5vZGVUeXBlPT0zKXt4LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHYseCk7ei5tb3ZlVG9FbGVtZW50VGV4dCh2KTt6Lm1vdmVTdGFydCgiY2hhcmFjdGVyIixBKTtkLnJlbW92ZSh2KTtwLnNldEVuZFBvaW50KEI/IlN0YXJ0VG9TdGFydCI6IkVuZFRvRW5kIix6KX1lbHNle3k9eC5jaGlsZE5vZGVzO2lmKHkubGVuZ3RoKXtpZihBPj15Lmxlbmd0aCl7ZC5pbnNlcnRBZnRlcih2LHlbeS5sZW5ndGgtMV0pfWVsc2V7eC5pbnNlcnRCZWZvcmUodix5W0FdKX16Lm1vdmVUb0VsZW1lbnRUZXh0KHYpfWVsc2V7dj10LmNyZWF0ZVRleHROb2RlKGopO3guYXBwZW5kQ2hpbGQodik7ei5tb3ZlVG9FbGVtZW50VGV4dCh2LnBhcmVudE5vZGUpO3ouY29sbGFwc2UoYyl9cC5zZXRFbmRQb2ludChCPyJTdGFydFRvU3RhcnQiOiJFbmRUb0VuZCIseik7ZC5yZW1vdmUodil9fXRoaXMuZGVzdHJveSgpO209ay5zdGFydENvbnRhaW5lcjtyPWsuc3RhcnRPZmZzZXQ7dT1rLmVuZENvbnRhaW5lcjtzPWsuZW5kT2Zmc2V0O3A9by5jcmVhdGVUZXh0UmFuZ2UoKTtpZihtPT11JiZtLm5vZGVUeXBlPT0xJiZyPT1zLTEpe2lmKHI9PXMtMSl7dHJ5e249by5jcmVhdGVDb250cm9sUmFuZ2UoKTtuLmFkZEVsZW1lbnQobS5jaGlsZE5vZGVzW3JdKTtuLnNlbGVjdCgpO24uc2Nyb2xsSW50b1ZpZXcoKTtyZXR1cm59Y2F0Y2gocSl7fX19bCh0cnVlKTtsKCk7cC5zZWxlY3QoKTtwLnNjcm9sbEludG9WaWV3KCl9O3RoaXMuZ2V0UmFuZ2VBdD1mdW5jdGlvbigpe2lmKCFlfHwhdGlueW1jZS5kb20uUmFuZ2VVdGlscy5jb21wYXJlUmFuZ2VzKGgsZy5nZXRSbmcoKSkpe2U9YigpO2g9Zy5nZXRSbmcoKX10cnl7ZS5zdGFydENvbnRhaW5lci5uZXh0U2libGluZ31jYXRjaChrKXtlPWIoKTtoPW51bGx9cmV0dXJuIGV9O3RoaXMuZGVzdHJveT1mdW5jdGlvbigpe2g9ZT1udWxsfX10aW55bWNlLmRvbS5UcmlkZW50U2VsZWN0aW9uPWF9KSgpOyhmdW5jdGlvbigpe3ZhciBwPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csaj0wLGQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxvPWZhbHNlLGk9dHJ1ZTtbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7aT1mYWxzZTtyZXR1cm4gMH0pO3ZhciBiPWZ1bmN0aW9uKHYsZSx6LEEpe3o9enx8W107ZT1lfHxkb2N1bWVudDt2YXIgQz1lO2lmKGUubm9kZVR5cGUhPT0xJiZlLm5vZGVUeXBlIT09OSl7cmV0dXJuW119aWYoIXZ8fHR5cGVvZiB2IT09InN0cmluZyIpe3JldHVybiB6fXZhciB4PVtdLHMsRSxILHIsdT10cnVlLHQ9Yi5pc1hNTChlKSxCPXYsRCxHLEYseTtkb3twLmV4ZWMoIiIpO3M9cC5leGVjKEIpO2lmKHMpe0I9c1szXTt4LnB1c2goc1sxXSk7aWYoc1syXSl7cj1zWzNdO2JyZWFrfX19d2hpbGUocyk7aWYoeC5sZW5ndGg+MSYmay5leGVjKHYpKXtpZih4Lmxlbmd0aD09PTImJmYucmVsYXRpdmVbeFswXV0pe0U9aCh4WzBdK3hbMV0sZSl9ZWxzZXtFPWYucmVsYXRpdmVbeFswXV0/W2VdOmIoeC5zaGlmdCgpLGUpO3doaWxlKHgubGVuZ3RoKXt2PXguc2hpZnQoKTtpZihmLnJlbGF0aXZlW3ZdKXt2Kz14LnNoaWZ0KCl9RT1oKHYsRSl9fX1lbHNle2lmKCFBJiZ4Lmxlbmd0aD4xJiZlLm5vZGVUeXBlPT09OSYmIXQmJmYubWF0Y2guSUQudGVzdCh4WzBdKSYmIWYubWF0Y2guSUQudGVzdCh4W3gubGVuZ3RoLTFdKSl7RD1iLmZpbmQoeC5zaGlmdCgpLGUsdCk7ZT1ELmV4cHI/Yi5maWx0ZXIoRC5leHByLEQuc2V0KVswXTpELnNldFswXX1pZihlKXtEPUE/e2V4cHI6eC5wb3AoKSxzZXQ6YShBKX06Yi5maW5kKHgucG9wKCkseC5sZW5ndGg9PT0xJiYoeFswXT09PSJ+Inx8eFswXT09PSIrIikmJmUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGU6ZSx0KTtFPUQuZXhwcj9iLmZpbHRlcihELmV4cHIsRC5zZXQpOkQuc2V0O2lmKHgubGVuZ3RoPjApe0g9YShFKX1lbHNle3U9ZmFsc2V9d2hpbGUoeC5sZW5ndGgpe0c9eC5wb3AoKTtGPUc7aWYoIWYucmVsYXRpdmVbR10pe0c9IiJ9ZWxzZXtGPXgucG9wKCl9aWYoRj09bnVsbCl7Rj1lfWYucmVsYXRpdmVbR10oSCxGLHQpfX1lbHNle0g9eD1bXX19aWYoIUgpe0g9RX1pZighSCl7Yi5lcnJvcihHfHx2KX1pZihkLmNhbGwoSCk9PT0iW29iamVjdCBBcnJheV0iKXtpZighdSl7ei5wdXNoLmFwcGx5KHosSCl9ZWxzZXtpZihlJiZlLm5vZGVUeXBlPT09MSl7Zm9yKHk9MDtIW3ldIT1udWxsO3krKyl7aWYoSFt5XSYmKEhbeV09PT10cnVlfHxIW3ldLm5vZGVUeXBlPT09MSYmYi5jb250YWlucyhlLEhbeV0pKSl7ei5wdXNoKEVbeV0pfX19ZWxzZXtmb3IoeT0wO0hbeV0hPW51bGw7eSsrKXtpZihIW3ldJiZIW3ldLm5vZGVUeXBlPT09MSl7ei5wdXNoKEVbeV0pfX19fX1lbHNle2EoSCx6KX1pZihyKXtiKHIsQyx6LEEpO2IudW5pcXVlU29ydCh6KX1yZXR1cm4gen07Yi51bmlxdWVTb3J0PWZ1bmN0aW9uKHIpe2lmKGMpe289aTtyLnNvcnQoYyk7aWYobyl7Zm9yKHZhciBlPTE7ZTxyLmxlbmd0aDtlKyspe2lmKHJbZV09PT1yW2UtMV0pe3Iuc3BsaWNlKGUtLSwxKX19fX1yZXR1cm4gcn07Yi5tYXRjaGVzPWZ1bmN0aW9uKGUscil7cmV0dXJuIGIoZSxudWxsLG51bGwscil9O2IuZmluZD1mdW5jdGlvbih5LGUseil7dmFyIHg7aWYoIXkpe3JldHVybltdfWZvcih2YXIgdD0wLHM9Zi5vcmRlci5sZW5ndGg7dDxzO3QrKyl7dmFyIHY9Zi5vcmRlclt0XSx1O2lmKCh1PWYubGVmdE1hdGNoW3ZdLmV4ZWMoeSkpKXt2YXIgcj11WzFdO3Uuc3BsaWNlKDEsMSk7aWYoci5zdWJzdHIoci5sZW5ndGgtMSkhPT0iXFwiKXt1WzFdPSh1WzFdfHwiIikucmVwbGFjZSgvXFwvZywiIik7eD1mLmZpbmRbdl0odSxlLHopO2lmKHghPW51bGwpe3k9eS5yZXBsYWNlKGYubWF0Y2hbdl0sIiIpO2JyZWFrfX19fWlmKCF4KXt4PWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKX1yZXR1cm57c2V0OngsZXhwcjp5fX07Yi5maWx0ZXI9ZnVuY3Rpb24oQyxCLEYsdSl7dmFyIHM9QyxIPVtdLHo9Qix4LGUseT1CJiZCWzBdJiZiLmlzWE1MKEJbMF0pO3doaWxlKEMmJkIubGVuZ3RoKXtmb3IodmFyIEEgaW4gZi5maWx0ZXIpe2lmKCh4PWYubGVmdE1hdGNoW0FdLmV4ZWMoQykpIT1udWxsJiZ4WzJdKXt2YXIgcj1mLmZpbHRlcltBXSxHLEUsdD14WzFdO2U9ZmFsc2U7eC5zcGxpY2UoMSwxKTtpZih0LnN1YnN0cih0Lmxlbmd0aC0xKT09PSJcXCIpe2NvbnRpbnVlfWlmKHo9PT1IKXtIPVtdfWlmKGYucHJlRmlsdGVyW0FdKXt4PWYucHJlRmlsdGVyW0FdKHgseixGLEgsdSx5KTtpZigheCl7ZT1HPXRydWV9ZWxzZXtpZih4PT09dHJ1ZSl7Y29udGludWV9fX1pZih4KXtmb3IodmFyIHY9MDsoRT16W3ZdKSE9bnVsbDt2Kyspe2lmKEUpe0c9cihFLHgsdix6KTt2YXIgRD11XiEhRztpZihGJiZHIT1udWxsKXtpZihEKXtlPXRydWV9ZWxzZXt6W3ZdPWZhbHNlfX1lbHNle2lmKEQpe0gucHVzaChFKTtlPXRydWV9fX19fWlmKEchPT11bmRlZmluZWQpe2lmKCFGKXt6PUh9Qz1DLnJlcGxhY2UoZi5tYXRjaFtBXSwiIik7aWYoIWUpe3JldHVybltdfWJyZWFrfX19aWYoQz09PXMpe2lmKGU9PW51bGwpe2IuZXJyb3IoQyl9ZWxzZXticmVha319cz1DfXJldHVybiB6fTtiLmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZX07dmFyIGY9Yi5zZWxlY3RvcnM9e29yZGVyOlsiSUQiLCJOQU1FIiwiVEFHIl0sbWF0Y2g6e0lEOi8jKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxDTEFTUzovXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLE5BTUU6L1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVsnIl0qXF0vLEFUVFI6L1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKFsnIl0qKSguKj8pXDN8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKChldmVufG9kZHxbXGRuK1wtXSopXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaHJlZiIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbih4LHIpe3ZhciB0PXR5cGVvZiByPT09InN0cmluZyIsdj10JiYhL1xXLy50ZXN0KHIpLHk9dCYmIXY7aWYodil7cj1yLnRvTG93ZXJDYXNlKCl9Zm9yKHZhciBzPTAsZT14Lmxlbmd0aCx1O3M8ZTtzKyspe2lmKCh1PXhbc10pKXt3aGlsZSgodT11LnByZXZpb3VzU2libGluZykmJnUubm9kZVR5cGUhPT0xKXt9eFtzXT15fHx1JiZ1Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yP3V8fGZhbHNlOnU9PT1yfX1pZih5KXtiLmZpbHRlcihyLHgsdHJ1ZSl9fSwiPiI6ZnVuY3Rpb24oeCxyKXt2YXIgdT10eXBlb2Ygcj09PSJzdHJpbmciLHYscz0wLGU9eC5sZW5ndGg7aWYodSYmIS9cVy8udGVzdChyKSl7cj1yLnRvTG93ZXJDYXNlKCk7Zm9yKDtzPGU7cysrKXt2PXhbc107aWYodil7dmFyIHQ9di5wYXJlbnROb2RlO3hbc109dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cj90OmZhbHNlfX19ZWxzZXtmb3IoO3M8ZTtzKyspe3Y9eFtzXTtpZih2KXt4W3NdPXU/di5wYXJlbnROb2RlOnYucGFyZW50Tm9kZT09PXJ9fWlmKHUpe2IuZmlsdGVyKHIseCx0cnVlKX19fSwiIjpmdW5jdGlvbih0LHIsdil7dmFyIHM9aisrLGU9cSx1O2lmKHR5cGVvZiByPT09InN0cmluZyImJiEvXFcvLnRlc3Qocikpe3I9ci50b0xvd2VyQ2FzZSgpO3U9cjtlPW59ZSgicGFyZW50Tm9kZSIscixzLHQsdSx2KX0sIn4iOmZ1bmN0aW9uKHQscix2KXt2YXIgcz1qKyssZT1xLHU7aWYodHlwZW9mIHI9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChyKSl7cj1yLnRvTG93ZXJDYXNlKCk7dT1yO2U9bn1lKCJwcmV2aW91c1NpYmxpbmciLHIscyx0LHUsdil9fSxmaW5kOntJRDpmdW5jdGlvbihyLHMsdCl7aWYodHlwZW9mIHMuZ2V0RWxlbWVudEJ5SWQhPT0idW5kZWZpbmVkIiYmIXQpe3ZhciBlPXMuZ2V0RWxlbWVudEJ5SWQoclsxXSk7cmV0dXJuIGU/W2VdOltdfX0sTkFNRTpmdW5jdGlvbihzLHYpe2lmKHR5cGVvZiB2LmdldEVsZW1lbnRzQnlOYW1lIT09InVuZGVmaW5lZCIpe3ZhciByPVtdLHU9di5nZXRFbGVtZW50c0J5TmFtZShzWzFdKTtmb3IodmFyIHQ9MCxlPXUubGVuZ3RoO3Q8ZTt0Kyspe2lmKHVbdF0uZ2V0QXR0cmlidXRlKCJuYW1lIik9PT1zWzFdKXtyLnB1c2godVt0XSl9fXJldHVybiByLmxlbmd0aD09PTA/bnVsbDpyfX0sVEFHOmZ1bmN0aW9uKGUscil7cmV0dXJuIHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZVsxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKHQscixzLGUseCx5KXt0PSIgIit0WzFdLnJlcGxhY2UoL1xcL2csIiIpKyIgIjtpZih5KXtyZXR1cm4gdH1mb3IodmFyIHU9MCx2Oyh2PXJbdV0pIT1udWxsO3UrKyl7aWYodil7aWYoeF4odi5jbGFzc05hbWUmJigiICIrdi5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcbl0vZywiICIpLmluZGV4T2YodCk+PTApKXtpZighcyl7ZS5wdXNoKHYpfX1lbHNle2lmKHMpe3JbdV09ZmFsc2V9fX19cmV0dXJuIGZhbHNlfSxJRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXS5yZXBsYWNlKC9cXC9nLCIiKX0sVEFHOmZ1bmN0aW9uKHIsZSl7cmV0dXJuIHJbMV0udG9Mb3dlckNhc2UoKX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7aWYoZVsxXT09PSJudGgiKXt2YXIgcj0vKC0/KShcZCopbigoPzpcK3wtKT9cZCopLy5leGVjKGVbMl09PT0iZXZlbiImJiIybiJ8fGVbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KGVbMl0pJiYiMG4rIitlWzJdfHxlWzJdKTtlWzJdPShyWzFdKyhyWzJdfHwxKSktMDtlWzNdPXJbM10tMH1lWzBdPWorKztyZXR1cm4gZX0sQVRUUjpmdW5jdGlvbih1LHIscyxlLHYseCl7dmFyIHQ9dVsxXS5yZXBsYWNlKC9cXC9nLCIiKTtpZigheCYmZi5hdHRyTWFwW3RdKXt1WzFdPWYuYXR0ck1hcFt0XX1pZih1WzJdPT09In49Iil7dVs0XT0iICIrdVs0XSsiICJ9cmV0dXJuIHV9LFBTRVVETzpmdW5jdGlvbih1LHIscyxlLHYpe2lmKHVbMV09PT0ibm90Iil7aWYoKHAuZXhlYyh1WzNdKXx8IiIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KHVbM10pKXt1WzNdPWIodVszXSxudWxsLG51bGwscil9ZWxzZXt2YXIgdD1iLmZpbHRlcih1WzNdLHIscyx0cnVlXnYpO2lmKCFzKXtlLnB1c2guYXBwbHkoZSx0KX1yZXR1cm4gZmFsc2V9fWVsc2V7aWYoZi5tYXRjaC5QT1MudGVzdCh1WzBdKXx8Zi5tYXRjaC5DSElMRC50ZXN0KHVbMF0pKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIHV9LFBPUzpmdW5jdGlvbihlKXtlLnVuc2hpZnQodHJ1ZSk7cmV0dXJuIGV9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ZmFsc2UmJmUudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PXRydWV9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hlY2tlZD09PXRydWV9LHNlbGVjdGVkOmZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O3JldHVybiBlLnNlbGVjdGVkPT09dHJ1ZX0scGFyZW50OmZ1bmN0aW9uKGUpe3JldHVybiAhIWUuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oZSl7cmV0dXJuICFlLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihzLHIsZSl7cmV0dXJuICEhYihlWzNdLHMpLmxlbmd0aH0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybigvaFxkL2kpLnRlc3QoZS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuInRleHQiPT09ZS50eXBlfSxyYWRpbzpmdW5jdGlvbihlKXtyZXR1cm4icmFkaW8iPT09ZS50eXBlfSxjaGVja2JveDpmdW5jdGlvbihlKXtyZXR1cm4iY2hlY2tib3giPT09ZS50eXBlfSxmaWxlOmZ1bmN0aW9uKGUpe3JldHVybiJmaWxlIj09PWUudHlwZX0scGFzc3dvcmQ6ZnVuY3Rpb24oZSl7cmV0dXJuInBhc3N3b3JkIj09PWUudHlwZX0sc3VibWl0OmZ1bmN0aW9uKGUpe3JldHVybiJzdWJtaXQiPT09ZS50eXBlfSxpbWFnZTpmdW5jdGlvbihlKXtyZXR1cm4iaW1hZ2UiPT09ZS50eXBlfSxyZXNldDpmdW5jdGlvbihlKXtyZXR1cm4icmVzZXQiPT09ZS50eXBlfSxidXR0b246ZnVuY3Rpb24oZSl7cmV0dXJuImJ1dHRvbiI9PT1lLnR5cGV8fGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJidXR0b24ifSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4oL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaSkudGVzdChlLm5vZGVOYW1lKX19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKHIsZSl7cmV0dXJuIGU9PT0wfSxsYXN0OmZ1bmN0aW9uKHMscixlLHQpe3JldHVybiByPT09dC5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihyLGUpe3JldHVybiBlJTI9PT0wfSxvZGQ6ZnVuY3Rpb24ocixlKXtyZXR1cm4gZSUyPT09MX0sbHQ6ZnVuY3Rpb24ocyxyLGUpe3JldHVybiByPGVbM10tMH0sZ3Q6ZnVuY3Rpb24ocyxyLGUpe3JldHVybiByPmVbM10tMH0sbnRoOmZ1bmN0aW9uKHMscixlKXtyZXR1cm4gZVszXS0wPT09cn0sZXE6ZnVuY3Rpb24ocyxyLGUpe3JldHVybiBlWzNdLTA9PT1yfX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24ocyx5LHgseil7dmFyIGU9eVsxXSxyPWYuZmlsdGVyc1tlXTtpZihyKXtyZXR1cm4gcihzLHgseSx6KX1lbHNle2lmKGU9PT0iY29udGFpbnMiKXtyZXR1cm4ocy50ZXh0Q29udGVudHx8cy5pbm5lclRleHR8fGIuZ2V0VGV4dChbc10pfHwiIikuaW5kZXhPZih5WzNdKT49MH1lbHNle2lmKGU9PT0ibm90Iil7dmFyIHQ9eVszXTtmb3IodmFyIHY9MCx1PXQubGVuZ3RoO3Y8dTt2Kyspe2lmKHRbdl09PT1zKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfWVsc2V7Yi5lcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlKX19fX0sQ0hJTEQ6ZnVuY3Rpb24oZSx0KXt2YXIgeD10WzFdLHI9ZTtzd2l0Y2goeCl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZSgocj1yLnByZXZpb3VzU2libGluZykpe2lmKHIubm9kZVR5cGU9PT0xKXtyZXR1cm4gZmFsc2V9fWlmKHg9PT0iZmlyc3QiKXtyZXR1cm4gdHJ1ZX1yPWU7Y2FzZSJsYXN0Ijp3aGlsZSgocj1yLm5leHRTaWJsaW5nKSl7aWYoci5ub2RlVHlwZT09PTEpe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWU7Y2FzZSJudGgiOnZhciBzPXRbMl0sQT10WzNdO2lmKHM9PT0xJiZBPT09MCl7cmV0dXJuIHRydWV9dmFyIHY9dFswXSx6PWUucGFyZW50Tm9kZTtpZih6JiYoei5zaXpjYWNoZSE9PXZ8fCFlLm5vZGVJbmRleCkpe3ZhciB1PTA7Zm9yKHI9ei5maXJzdENoaWxkO3I7cj1yLm5leHRTaWJsaW5nKXtpZihyLm5vZGVUeXBlPT09MSl7ci5ub2RlSW5kZXg9Kyt1fX16LnNpemNhY2hlPXZ9dmFyIHk9ZS5ub2RlSW5kZXgtQTtpZihzPT09MCl7cmV0dXJuIHk9PT0wfWVsc2V7cmV0dXJuKHklcz09PTAmJnkvcz49MCl9fX0sSUQ6ZnVuY3Rpb24ocixlKXtyZXR1cm4gci5ub2RlVHlwZT09PTEmJnIuZ2V0QXR0cmlidXRlKCJpZCIpPT09ZX0sVEFHOmZ1bmN0aW9uKHIsZSl7cmV0dXJuKGU9PT0iKiImJnIubm9kZVR5cGU9PT0xKXx8ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZX0sQ0xBU1M6ZnVuY3Rpb24ocixlKXtyZXR1cm4oIiAiKyhyLmNsYXNzTmFtZXx8ci5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihlKT4tMX0sQVRUUjpmdW5jdGlvbih2LHQpe3ZhciBzPXRbMV0sZT1mLmF0dHJIYW5kbGVbc10/Zi5hdHRySGFuZGxlW3NdKHYpOnZbc10hPW51bGw/dltzXTp2LmdldEF0dHJpYnV0ZShzKSx4PWUrIiIsdT10WzJdLHI9dFs0XTtyZXR1cm4gZT09bnVsbD91PT09IiE9Ijp1PT09Ij0iP3g9PT1yOnU9PT0iKj0iP3guaW5kZXhPZihyKT49MDp1PT09In49Ij8oIiAiK3grIiAiKS5pbmRleE9mKHIpPj0wOiFyP3gmJmUhPT1mYWxzZTp1PT09IiE9Ij94IT09cjp1PT09Il49Ij94LmluZGV4T2Yocik9PT0wOnU9PT0iJD0iP3guc3Vic3RyKHgubGVuZ3RoLXIubGVuZ3RoKT09PXI6dT09PSJ8PSI/eD09PXJ8fHguc3Vic3RyKDAsci5sZW5ndGgrMSk9PT1yKyItIjpmYWxzZX0sUE9TOmZ1bmN0aW9uKHUscixzLHYpe3ZhciBlPXJbMl0sdD1mLnNldEZpbHRlcnNbZV07aWYodCl7cmV0dXJuIHQodSxzLHIsdil9fX19O3ZhciBrPWYubWF0Y2guUE9TLGc9ZnVuY3Rpb24ocixlKXtyZXR1cm4iXFwiKyhlLTArMSl9O2Zvcih2YXIgbSBpbiBmLm1hdGNoKXtmLm1hdGNoW21dPW5ldyBSZWdFeHAoZi5tYXRjaFttXS5zb3VyY2UrKC8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSkpO2YubGVmdE1hdGNoW21dPW5ldyBSZWdFeHAoLyheKD86LnxccnxcbikqPykvLnNvdXJjZStmLm1hdGNoW21dLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2csZykpfXZhciBhPWZ1bmN0aW9uKHIsZSl7cj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChyLDApO2lmKGUpe2UucHVzaC5hcHBseShlLHIpO3JldHVybiBlfXJldHVybiByfTt0cnl7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2gobCl7YT1mdW5jdGlvbih1LHQpe3ZhciByPXR8fFtdLHM9MDtpZihkLmNhbGwodSk9PT0iW29iamVjdCBBcnJheV0iKXtBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyLHUpfWVsc2V7aWYodHlwZW9mIHUubGVuZ3RoPT09Im51bWJlciIpe2Zvcih2YXIgZT11Lmxlbmd0aDtzPGU7cysrKXtyLnB1c2godVtzXSl9fWVsc2V7Zm9yKDt1W3NdO3MrKyl7ci5wdXNoKHVbc10pfX19cmV0dXJuIHJ9fXZhciBjO2lmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbil7Yz1mdW5jdGlvbihyLGUpe2lmKCFyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9ufHwhZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbil7aWYocj09ZSl7bz10cnVlfXJldHVybiByLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjF9dmFyIHM9ci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKSY0Py0xOnI9PT1lPzA6MTtpZihzPT09MCl7bz10cnVlfXJldHVybiBzfX1lbHNle2lmKCJzb3VyY2VJbmRleCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KXtjPWZ1bmN0aW9uKHIsZSl7aWYoIXIuc291cmNlSW5kZXh8fCFlLnNvdXJjZUluZGV4KXtpZihyPT1lKXtvPXRydWV9cmV0dXJuIHIuc291cmNlSW5kZXg/LTE6MX12YXIgcz1yLnNvdXJjZUluZGV4LWUuc291cmNlSW5kZXg7aWYocz09PTApe289dHJ1ZX1yZXR1cm4gc319ZWxzZXtpZihkb2N1bWVudC5jcmVhdGVSYW5nZSl7Yz1mdW5jdGlvbih0LHIpe2lmKCF0Lm93bmVyRG9jdW1lbnR8fCFyLm93bmVyRG9jdW1lbnQpe2lmKHQ9PXIpe289dHJ1ZX1yZXR1cm4gdC5vd25lckRvY3VtZW50Py0xOjF9dmFyIHM9dC5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksZT1yLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtzLnNldFN0YXJ0KHQsMCk7cy5zZXRFbmQodCwwKTtlLnNldFN0YXJ0KHIsMCk7ZS5zZXRFbmQociwwKTt2YXIgdT1zLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsZSk7aWYodT09PTApe289dHJ1ZX1yZXR1cm4gdX19fX1iLmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHI9IiIsdDtmb3IodmFyIHM9MDtlW3NdO3MrKyl7dD1lW3NdO2lmKHQubm9kZVR5cGU9PT0zfHx0Lm5vZGVUeXBlPT09NCl7cis9dC5ub2RlVmFsdWV9ZWxzZXtpZih0Lm5vZGVUeXBlIT09OCl7cis9Yi5nZXRUZXh0KHQuY2hpbGROb2Rlcyl9fX1yZXR1cm4gcn07KGZ1bmN0aW9uKCl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikscz0ic2NyaXB0IisobmV3IERhdGUoKSkuZ2V0VGltZSgpO3IuaW5uZXJIVE1MPSI8YSBuYW1lPSciK3MrIicvPiI7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2UuaW5zZXJ0QmVmb3JlKHIsZS5maXJzdENoaWxkKTtpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzKSl7Zi5maW5kLklEPWZ1bmN0aW9uKHUsdix4KXtpZih0eXBlb2Ygdi5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYheCl7dmFyIHQ9di5nZXRFbGVtZW50QnlJZCh1WzFdKTtyZXR1cm4gdD90LmlkPT09dVsxXXx8dHlwZW9mIHQuZ2V0QXR0cmlidXRlTm9kZSE9PSJ1bmRlZmluZWQiJiZ0LmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09dVsxXT9bdF06dW5kZWZpbmVkOltdfX07Zi5maWx0ZXIuSUQ9ZnVuY3Rpb24odix0KXt2YXIgdT10eXBlb2Ygdi5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJnYuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gdi5ub2RlVHlwZT09PTEmJnUmJnUubm9kZVZhbHVlPT09dH19ZS5yZW1vdmVDaGlsZChyKTtlPXI9bnVsbH0pKCk7KGZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSk7aWYoZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wKXtmLmZpbmQuVEFHPWZ1bmN0aW9uKHIsdil7dmFyIHU9di5nZXRFbGVtZW50c0J5VGFnTmFtZShyWzFdKTtpZihyWzFdPT09IioiKXt2YXIgdD1bXTtmb3IodmFyIHM9MDt1W3NdO3MrKyl7aWYodVtzXS5ub2RlVHlwZT09PTEpe3QucHVzaCh1W3NdKX19dT10fXJldHVybiB1fX1lLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiI7aWYoZS5maXJzdENoaWxkJiZ0eXBlb2YgZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PSJ1bmRlZmluZWQiJiZlLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyIpe2YuYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKHIpe3JldHVybiByLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9fWU9bnVsbH0pKCk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCl7KGZ1bmN0aW9uKCl7dmFyIGU9YixzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3MuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYocy5xdWVyeVNlbGVjdG9yQWxsJiZzLnF1ZXJ5U2VsZWN0b3JBbGwoIi5URVNUIikubGVuZ3RoPT09MCl7cmV0dXJufWI9ZnVuY3Rpb24oeCx2LHQsdSl7dj12fHxkb2N1bWVudDtpZighdSYmdi5ub2RlVHlwZT09PTkmJiFiLmlzWE1MKHYpKXt0cnl7cmV0dXJuIGEodi5xdWVyeVNlbGVjdG9yQWxsKHgpLHQpfWNhdGNoKHkpe319cmV0dXJuIGUoeCx2LHQsdSl9O2Zvcih2YXIgciBpbiBlKXtiW3JdPWVbcl19cz1udWxsfSkoKX0oZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCFlLmdldEVsZW1lbnRzQnlDbGFzc05hbWV8fGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTApe3JldHVybn1lLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpe3JldHVybn1mLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIik7Zi5maW5kLkNMQVNTPWZ1bmN0aW9uKHIscyx0KXtpZih0eXBlb2Ygcy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09InVuZGVmaW5lZCImJiF0KXtyZXR1cm4gcy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHJbMV0pfX07ZT1udWxsfSkoKTtmdW5jdGlvbiBuKHIseCx2LEEseSx6KXtmb3IodmFyIHQ9MCxzPUEubGVuZ3RoO3Q8czt0Kyspe3ZhciBlPUFbdF07aWYoZSl7ZT1lW3JdO3ZhciB1PWZhbHNlO3doaWxlKGUpe2lmKGUuc2l6Y2FjaGU9PT12KXt1PUFbZS5zaXpzZXRdO2JyZWFrfWlmKGUubm9kZVR5cGU9PT0xJiYheil7ZS5zaXpjYWNoZT12O2Uuc2l6c2V0PXR9aWYoZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eCl7dT1lO2JyZWFrfWU9ZVtyXX1BW3RdPXV9fX1mdW5jdGlvbiBxKHIseCx2LEEseSx6KXtmb3IodmFyIHQ9MCxzPUEubGVuZ3RoO3Q8czt0Kyspe3ZhciBlPUFbdF07aWYoZSl7ZT1lW3JdO3ZhciB1PWZhbHNlO3doaWxlKGUpe2lmKGUuc2l6Y2FjaGU9PT12KXt1PUFbZS5zaXpzZXRdO2JyZWFrfWlmKGUubm9kZVR5cGU9PT0xKXtpZigheil7ZS5zaXpjYWNoZT12O2Uuc2l6c2V0PXR9aWYodHlwZW9mIHghPT0ic3RyaW5nIil7aWYoZT09PXgpe3U9dHJ1ZTticmVha319ZWxzZXtpZihiLmZpbHRlcih4LFtlXSkubGVuZ3RoPjApe3U9ZTticmVha319fWU9ZVtyXX1BW3RdPXV9fX1iLmNvbnRhaW5zPWRvY3VtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKHIsZSl7cmV0dXJuICEhKHIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSkmMTYpfTpmdW5jdGlvbihyLGUpe3JldHVybiByIT09ZSYmKHIuY29udGFpbnM/ci5jb250YWlucyhlKTp0cnVlKX07Yi5pc1hNTD1mdW5jdGlvbihlKXt2YXIgcj0oZT9lLm93bmVyRG9jdW1lbnR8fGU6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiByP3Iubm9kZU5hbWUhPT0iSFRNTCI6ZmFsc2V9O3ZhciBoPWZ1bmN0aW9uKGUseSl7dmFyIHQ9W10sdT0iIix2LHM9eS5ub2RlVHlwZT9beV06eTt3aGlsZSgodj1mLm1hdGNoLlBTRVVETy5leGVjKGUpKSl7dSs9dlswXTtlPWUucmVwbGFjZShmLm1hdGNoLlBTRVVETywiIil9ZT1mLnJlbGF0aXZlW2VdP2UrIioiOmU7Zm9yKHZhciB4PTAscj1zLmxlbmd0aDt4PHI7eCsrKXtiKGUsc1t4XSx0KX1yZXR1cm4gYi5maWx0ZXIodSx0KX07d2luZG93LnRpbnltY2UuZG9tLlNpenpsZT1ifSkoKTsoZnVuY3Rpb24oZCl7dmFyIGY9ZC5lYWNoLGM9ZC5ET00sYj1kLmlzSUUsZT1kLmlzV2ViS2l0LGE7ZC5jcmVhdGUoInRpbnltY2UuZG9tLkV2ZW50VXRpbHMiLHtFdmVudFV0aWxzOmZ1bmN0aW9uKCl7dGhpcy5pbml0cz1bXTt0aGlzLmV2ZW50cz1bXX0sYWRkOmZ1bmN0aW9uKG0scCxsLGope3ZhciBnLGg9dGhpcyxpPWguZXZlbnRzLGs7aWYocCBpbnN0YW5jZW9mIEFycmF5KXtrPVtdO2YocCxmdW5jdGlvbihvKXtrLnB1c2goaC5hZGQobSxvLGwsaikpfSk7cmV0dXJuIGt9aWYobSYmbS5oYXNPd25Qcm9wZXJ0eSYmbSBpbnN0YW5jZW9mIEFycmF5KXtrPVtdO2YobSxmdW5jdGlvbihuKXtuPWMuZ2V0KG4pO2sucHVzaChoLmFkZChuLHAsbCxqKSl9KTtyZXR1cm4ga31tPWMuZ2V0KG0pO2lmKCFtKXtyZXR1cm59Zz1mdW5jdGlvbihuKXtpZihoLmRpc2FibGVkKXtyZXR1cm59bj1ufHx3aW5kb3cuZXZlbnQ7aWYobiYmYil7aWYoIW4udGFyZ2V0KXtuLnRhcmdldD1uLnNyY0VsZW1lbnR9ZC5leHRlbmQobixoLl9zdG9wcGVycyl9aWYoIWope3JldHVybiBsKG4pfXJldHVybiBsLmNhbGwoaixuKX07aWYocD09InVubG9hZCIpe2QudW5sb2Fkcy51bnNoaWZ0KHtmdW5jOmd9KTtyZXR1cm4gZ31pZihwPT0iaW5pdCIpe2lmKGguZG9tTG9hZGVkKXtnKCl9ZWxzZXtoLmluaXRzLnB1c2goZyl9cmV0dXJuIGd9aS5wdXNoKHtvYmo6bSxuYW1lOnAsZnVuYzpsLGNmdW5jOmcsc2NvcGU6an0pO2guX2FkZChtLHAsZyk7cmV0dXJuIGx9LHJlbW92ZTpmdW5jdGlvbihsLG0sayl7dmFyIGg9dGhpcyxnPWguZXZlbnRzLGk9ZmFsc2UsajtpZihsJiZsLmhhc093blByb3BlcnR5JiZsIGluc3RhbmNlb2YgQXJyYXkpe2o9W107ZihsLGZ1bmN0aW9uKG4pe249Yy5nZXQobik7ai5wdXNoKGgucmVtb3ZlKG4sbSxrKSl9KTtyZXR1cm4gan1sPWMuZ2V0KGwpO2YoZyxmdW5jdGlvbihvLG4pe2lmKG8ub2JqPT1sJiZvLm5hbWU9PW0mJigha3x8KG8uZnVuYz09a3x8by5jZnVuYz09aykpKXtnLnNwbGljZShuLDEpO2guX3JlbW92ZShsLG0sby5jZnVuYyk7aT10cnVlO3JldHVybiBmYWxzZX19KTtyZXR1cm4gaX0sY2xlYXI6ZnVuY3Rpb24obCl7dmFyIGo9dGhpcyxnPWouZXZlbnRzLGgsaztpZihsKXtsPWMuZ2V0KGwpO2ZvcihoPWcubGVuZ3RoLTE7aD49MDtoLS0pe2s9Z1toXTtpZihrLm9iaj09PWwpe2ouX3JlbW92ZShrLm9iaixrLm5hbWUsay5jZnVuYyk7ay5vYmo9ay5jZnVuYz1udWxsO2cuc3BsaWNlKGgsMSl9fX19LGNhbmNlbDpmdW5jdGlvbihnKXtpZighZyl7cmV0dXJuIGZhbHNlfXRoaXMuc3RvcChnKTtyZXR1cm4gdGhpcy5wcmV2ZW50KGcpfSxzdG9wOmZ1bmN0aW9uKGcpe2lmKGcuc3RvcFByb3BhZ2F0aW9uKXtnLnN0b3BQcm9wYWdhdGlvbigpfWVsc2V7Zy5jYW5jZWxCdWJibGU9dHJ1ZX1yZXR1cm4gZmFsc2V9LHByZXZlbnQ6ZnVuY3Rpb24oZyl7aWYoZy5wcmV2ZW50RGVmYXVsdCl7Zy5wcmV2ZW50RGVmYXVsdCgpfWVsc2V7Zy5yZXR1cm5WYWx1ZT1mYWxzZX1yZXR1cm4gZmFsc2V9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZz10aGlzO2YoZy5ldmVudHMsZnVuY3Rpb24oaixoKXtnLl9yZW1vdmUoai5vYmosai5uYW1lLGouY2Z1bmMpO2oub2JqPWouY2Z1bmM9bnVsbH0pO2cuZXZlbnRzPVtdO2c9bnVsbH0sX2FkZDpmdW5jdGlvbihoLGksZyl7aWYoaC5hdHRhY2hFdmVudCl7aC5hdHRhY2hFdmVudCgib24iK2ksZyl9ZWxzZXtpZihoLmFkZEV2ZW50TGlzdGVuZXIpe2guYWRkRXZlbnRMaXN0ZW5lcihpLGcsZmFsc2UpfWVsc2V7aFsib24iK2ldPWd9fX0sX3JlbW92ZTpmdW5jdGlvbihpLGosaCl7aWYoaSl7dHJ5e2lmKGkuZGV0YWNoRXZlbnQpe2kuZGV0YWNoRXZlbnQoIm9uIitqLGgpfWVsc2V7aWYoaS5yZW1vdmVFdmVudExpc3RlbmVyKXtpLnJlbW92ZUV2ZW50TGlzdGVuZXIoaixoLGZhbHNlKX1lbHNle2lbIm9uIitqXT1udWxsfX19Y2F0Y2goZyl7fX19LF9wYWdlSW5pdDpmdW5jdGlvbihoKXt2YXIgZz10aGlzO2lmKGcuZG9tTG9hZGVkKXtyZXR1cm59Zy5kb21Mb2FkZWQ9dHJ1ZTtmKGcuaW5pdHMsZnVuY3Rpb24oaSl7aSgpfSk7Zy5pbml0cz1bXX0sX3dhaXQ6ZnVuY3Rpb24oaSl7dmFyIGc9dGhpcyxoPWkuZG9jdW1lbnQ7aWYoaS50aW55TUNFX0daJiZ0aW55TUNFX0daLmxvYWRlZCl7Zy5kb21Mb2FkZWQ9MTtyZXR1cm59aWYoaC5hdHRhY2hFdmVudCl7aC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixmdW5jdGlvbigpe2lmKGgucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpe2guZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsYXJndW1lbnRzLmNhbGxlZSk7Zy5fcGFnZUluaXQoaSl9fSk7aWYoaC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmk9PWkudG9wKXsoZnVuY3Rpb24oKXtpZihnLmRvbUxvYWRlZCl7cmV0dXJufXRyeXtoLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGope3NldFRpbWVvdXQoYXJndW1lbnRzLmNhbGxlZSwwKTtyZXR1cm59Zy5fcGFnZUluaXQoaSl9KSgpfX1lbHNle2lmKGguYWRkRXZlbnRMaXN0ZW5lcil7Zy5fYWRkKGksIkRPTUNvbnRlbnRMb2FkZWQiLGZ1bmN0aW9uKCl7Zy5fcGFnZUluaXQoaSl9KX19Zy5fYWRkKGksImxvYWQiLGZ1bmN0aW9uKCl7Zy5fcGFnZUluaXQoaSl9KX0sX3N0b3BwZXJzOntwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMucmV0dXJuVmFsdWU9ZmFsc2V9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQnViYmxlPXRydWV9fX0pO2E9ZC5kb20uRXZlbnQ9bmV3IGQuZG9tLkV2ZW50VXRpbHMoKTthLl93YWl0KHdpbmRvdyk7ZC5hZGRVbmxvYWQoZnVuY3Rpb24oKXthLmRlc3Ryb3koKX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGEpe2EuZG9tLkVsZW1lbnQ9ZnVuY3Rpb24oZixkKXt2YXIgYj10aGlzLGUsYztiLnNldHRpbmdzPWQ9ZHx8e307Yi5pZD1mO2IuZG9tPWU9ZC5kb218fGEuRE9NO2lmKCFhLmlzSUUpe2M9ZS5nZXQoYi5pZCl9YS5lYWNoKCgiZ2V0UG9zLGdldFJlY3QsZ2V0UGFyZW50LGFkZCxzZXRTdHlsZSxnZXRTdHlsZSxzZXRTdHlsZXMsc2V0QXR0cmliLHNldEF0dHJpYnMsZ2V0QXR0cmliLGFkZENsYXNzLHJlbW92ZUNsYXNzLGhhc0NsYXNzLGdldE91dGVySFRNTCxzZXRPdXRlckhUTUwscmVtb3ZlLHNob3csaGlkZSxpc0hpZGRlbixzZXRIVE1MLGdldCIpLnNwbGl0KC8sLyksZnVuY3Rpb24oZyl7YltnXT1mdW5jdGlvbigpe3ZhciBoPVtmXSxqO2ZvcihqPTA7ajxhcmd1bWVudHMubGVuZ3RoO2orKyl7aC5wdXNoKGFyZ3VtZW50c1tqXSl9aD1lW2ddLmFwcGx5KGUsaCk7Yi51cGRhdGUoZyk7cmV0dXJuIGh9fSk7YS5leHRlbmQoYix7b246ZnVuY3Rpb24oaSxoLGcpe3JldHVybiBhLmRvbS5FdmVudC5hZGQoYi5pZCxpLGgsZyl9LGdldFhZOmZ1bmN0aW9uKCl7cmV0dXJue3g6cGFyc2VJbnQoYi5nZXRTdHlsZSgibGVmdCIpKSx5OnBhcnNlSW50KGIuZ2V0U3R5bGUoInRvcCIpKX19LGdldFNpemU6ZnVuY3Rpb24oKXt2YXIgZz1lLmdldChiLmlkKTtyZXR1cm57dzpwYXJzZUludChiLmdldFN0eWxlKCJ3aWR0aCIpfHxnLmNsaWVudFdpZHRoKSxoOnBhcnNlSW50KGIuZ2V0U3R5bGUoImhlaWdodCIpfHxnLmNsaWVudEhlaWdodCl9fSxtb3ZlVG86ZnVuY3Rpb24oZyxoKXtiLnNldFN0eWxlcyh7bGVmdDpnLHRvcDpofSl9LG1vdmVCeTpmdW5jdGlvbihnLGkpe3ZhciBoPWIuZ2V0WFkoKTtiLm1vdmVUbyhoLngrZyxoLnkraSl9LHJlc2l6ZVRvOmZ1bmN0aW9uKGcsaSl7Yi5zZXRTdHlsZXMoe3dpZHRoOmcsaGVpZ2h0Oml9KX0scmVzaXplQnk6ZnVuY3Rpb24oZyxqKXt2YXIgaT1iLmdldFNpemUoKTtiLnJlc2l6ZVRvKGkudytnLGkuaCtqKX0sdXBkYXRlOmZ1bmN0aW9uKGgpe3ZhciBnO2lmKGEuaXNJRTYmJmQuYmxvY2tlcil7aD1ofHwiIjtpZihoLmluZGV4T2YoImdldCIpPT09MHx8aC5pbmRleE9mKCJoYXMiKT09PTB8fGguaW5kZXhPZigiaXMiKT09PTApe3JldHVybn1pZihoPT0icmVtb3ZlIil7ZS5yZW1vdmUoYi5ibG9ja2VyKTtyZXR1cm59aWYoIWIuYmxvY2tlcil7Yi5ibG9ja2VyPWUudW5pcXVlSWQoKTtnPWUuYWRkKGQuY29udGFpbmVyfHxlLmdldFJvb3QoKSwiaWZyYW1lIix7aWQ6Yi5ibG9ja2VyLHN0eWxlOiJwb3NpdGlvbjphYnNvbHV0ZTsiLGZyYW1lQm9yZGVyOjAsc3JjOidqYXZhc2NyaXB0OiIiJ30pO2Uuc2V0U3R5bGUoZywib3BhY2l0eSIsMCl9ZWxzZXtnPWUuZ2V0KGIuYmxvY2tlcil9ZS5zZXRTdHlsZXMoZyx7bGVmdDpiLmdldFN0eWxlKCJsZWZ0IiwxKSx0b3A6Yi5nZXRTdHlsZSgidG9wIiwxKSx3aWR0aDpiLmdldFN0eWxlKCJ3aWR0aCIsMSksaGVpZ2h0OmIuZ2V0U3R5bGUoImhlaWdodCIsMSksZGlzcGxheTpiLmdldFN0eWxlKCJkaXNwbGF5IiwxKSx6SW5kZXg6cGFyc2VJbnQoYi5nZXRTdHlsZSgiekluZGV4IiwxKXx8MCktMX0pfX19KX19KSh0aW55bWNlKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZShmKXtyZXR1cm4gZi5yZXBsYWNlKC9bXG5ccl0rL2csIiIpfXZhciBiPWMuaXMsYT1jLmlzSUUsZD1jLmVhY2g7Yy5jcmVhdGUoInRpbnltY2UuZG9tLlNlbGVjdGlvbiIse1NlbGVjdGlvbjpmdW5jdGlvbihpLGgsZyl7dmFyIGY9dGhpcztmLmRvbT1pO2Yud2luPWg7Zi5zZXJpYWxpemVyPWc7ZChbIm9uQmVmb3JlU2V0Q29udGVudCIsIm9uQmVmb3JlR2V0Q29udGVudCIsIm9uU2V0Q29udGVudCIsIm9uR2V0Q29udGVudCJdLGZ1bmN0aW9uKGope2Zbal09bmV3IGMudXRpbC5EaXNwYXRjaGVyKGYpfSk7aWYoIWYud2luLmdldFNlbGVjdGlvbil7Zi50cmlkZW50U2VsPW5ldyBjLmRvbS5UcmlkZW50U2VsZWN0aW9uKGYpfWlmKGMuaXNJRSYmaS5ib3hNb2RlbCl7dGhpcy5fZml4SUVTZWxlY3Rpb24oKX1jLmFkZFVubG9hZChmLmRlc3Ryb3ksZil9LGdldENvbnRlbnQ6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcyxoPWYuZ2V0Um5nKCksbD1mLmRvbS5jcmVhdGUoImJvZHkiKSxqPWYuZ2V0U2VsKCksaSxrLG07Zz1nfHx7fTtpPWs9IiI7Zy5nZXQ9dHJ1ZTtnLmZvcm1hdD1nLmZvcm1hdHx8Imh0bWwiO2Yub25CZWZvcmVHZXRDb250ZW50LmRpc3BhdGNoKGYsZyk7aWYoZy5mb3JtYXQ9PSJ0ZXh0Iil7cmV0dXJuIGYuaXNDb2xsYXBzZWQoKT8iIjooaC50ZXh0fHwoai50b1N0cmluZz9qLnRvU3RyaW5nKCk6IiIpKX1pZihoLmNsb25lQ29udGVudHMpe209aC5jbG9uZUNvbnRlbnRzKCk7aWYobSl7bC5hcHBlbmRDaGlsZChtKX19ZWxzZXtpZihiKGguaXRlbSl8fGIoaC5odG1sVGV4dCkpe2wuaW5uZXJIVE1MPWguaXRlbT9oLml0ZW0oMCkub3V0ZXJIVE1MOmguaHRtbFRleHR9ZWxzZXtsLmlubmVySFRNTD1oLnRvU3RyaW5nKCl9fWlmKC9eXHMvLnRlc3QobC5pbm5lckhUTUwpKXtpPSIgIn1pZigvXHMrJC8udGVzdChsLmlubmVySFRNTCkpe2s9IiAifWcuZ2V0SW5uZXI9dHJ1ZTtnLmNvbnRlbnQ9Zi5pc0NvbGxhcHNlZCgpPyIiOmkrZi5zZXJpYWxpemVyLnNlcmlhbGl6ZShsLGcpK2s7Zi5vbkdldENvbnRlbnQuZGlzcGF0Y2goZixnKTtyZXR1cm4gZy5jb250ZW50fSxzZXRDb250ZW50OmZ1bmN0aW9uKGosaSl7dmFyIGc9dGhpcyxrPWcuZ2V0Um5nKCksbixsPWcud2luLmRvY3VtZW50O2k9aXx8e2Zvcm1hdDoiaHRtbCJ9O2kuc2V0PXRydWU7aj1pLmNvbnRlbnQ9Zy5kb20ucHJvY2Vzc0hUTUwoaik7Zy5vbkJlZm9yZVNldENvbnRlbnQuZGlzcGF0Y2goZyxpKTtqPWkuY29udGVudDtpZihrLmluc2VydE5vZGUpe2orPSc8c3BhbiBpZD0iX19jYXJldCI+Xzwvc3Bhbj4nO2lmKGsuc3RhcnRDb250YWluZXI9PWwmJmsuZW5kQ29udGFpbmVyPT1sKXtsLmJvZHkuaW5uZXJIVE1MPWp9ZWxzZXtrLmRlbGV0ZUNvbnRlbnRzKCk7aWYobC5ib2R5LmNoaWxkTm9kZXMubGVuZ3RoPT0wKXtsLmJvZHkuaW5uZXJIVE1MPWp9ZWxzZXtpZihrLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCl7ay5pbnNlcnROb2RlKGsuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGopKX1lbHNle3ZhciBtPWwuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGY9bC5jcmVhdGVFbGVtZW50KCJkaXYiKTttLmFwcGVuZENoaWxkKGYpO2Yub3V0ZXJIVE1MPWo7ay5pbnNlcnROb2RlKG0pfX19bj1nLmRvbS5nZXQoIl9fY2FyZXQiKTtrPWwuY3JlYXRlUmFuZ2UoKTtrLnNldFN0YXJ0QmVmb3JlKG4pO2suc2V0RW5kQmVmb3JlKG4pO2cuc2V0Um5nKGspO2cuZG9tLnJlbW92ZSgiX19jYXJldCIpfWVsc2V7aWYoay5pdGVtKXtsLmV4ZWNDb21tYW5kKCJEZWxldGUiLGZhbHNlLG51bGwpO2s9Zy5nZXRSbmcoKX1rLnBhc3RlSFRNTChqKX1nLm9uU2V0Q29udGVudC5kaXNwYXRjaChnLGkpfSxnZXRTdGFydDpmdW5jdGlvbigpe3ZhciBnPXRoaXMuZ2V0Um5nKCksaCxmLGosaTtpZihnLmR1cGxpY2F0ZXx8Zy5pdGVtKXtpZihnLml0ZW0pe3JldHVybiBnLml0ZW0oMCl9aj1nLmR1cGxpY2F0ZSgpO2ouY29sbGFwc2UoMSk7aD1qLnBhcmVudEVsZW1lbnQoKTtmPWk9Zy5wYXJlbnRFbGVtZW50KCk7d2hpbGUoaT1pLnBhcmVudE5vZGUpe2lmKGk9PWgpe2g9ZjticmVha319aWYoaCYmaC5ub2RlTmFtZT09IkJPRFkiKXtyZXR1cm4gaC5maXJzdENoaWxkfHxofXJldHVybiBofWVsc2V7aD1nLnN0YXJ0Q29udGFpbmVyO2lmKGgubm9kZVR5cGU9PTEmJmguaGFzQ2hpbGROb2RlcygpKXtoPWguY2hpbGROb2Rlc1tNYXRoLm1pbihoLmNoaWxkTm9kZXMubGVuZ3RoLTEsZy5zdGFydE9mZnNldCldfWlmKGgmJmgubm9kZVR5cGU9PTMpe3JldHVybiBoLnBhcmVudE5vZGV9cmV0dXJuIGh9fSxnZXRFbmQ6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGg9Zy5nZXRSbmcoKSxpLGY7aWYoaC5kdXBsaWNhdGV8fGguaXRlbSl7aWYoaC5pdGVtKXtyZXR1cm4gaC5pdGVtKDApfWg9aC5kdXBsaWNhdGUoKTtoLmNvbGxhcHNlKDApO2k9aC5wYXJlbnRFbGVtZW50KCk7aWYoaSYmaS5ub2RlTmFtZT09IkJPRFkiKXtyZXR1cm4gaS5sYXN0Q2hpbGR8fGl9cmV0dXJuIGl9ZWxzZXtpPWguZW5kQ29udGFpbmVyO2Y9aC5lbmRPZmZzZXQ7aWYoaS5ub2RlVHlwZT09MSYmaS5oYXNDaGlsZE5vZGVzKCkpe2k9aS5jaGlsZE5vZGVzW2Y+MD9mLTE6Zl19aWYoaSYmaS5ub2RlVHlwZT09Myl7cmV0dXJuIGkucGFyZW50Tm9kZX1yZXR1cm4gaX19LGdldEJvb2ttYXJrOmZ1bmN0aW9uKHEscil7dmFyIHU9dGhpcyxtPXUuZG9tLGcsaixpLG4saCxvLHAsbD0iXHVGRUZGIixzO2Z1bmN0aW9uIGYodix4KXt2YXIgdD0wO2QobS5zZWxlY3QodiksZnVuY3Rpb24oeix5KXtpZih6PT14KXt0PXl9fSk7cmV0dXJuIHR9aWYocT09Mil7ZnVuY3Rpb24gaygpe3ZhciB2PXUuZ2V0Um5nKHRydWUpLHQ9bS5nZXRSb290KCkseD17fTtmdW5jdGlvbiB5KEIsRyl7dmFyIEE9QltHPyJzdGFydENvbnRhaW5lciI6ImVuZENvbnRhaW5lciJdLEY9QltHPyJzdGFydE9mZnNldCI6ImVuZE9mZnNldCJdLHo9W10sQyxFLEQ9MDtpZihBLm5vZGVUeXBlPT0zKXtpZihyKXtmb3IoQz1BLnByZXZpb3VzU2libGluZztDJiZDLm5vZGVUeXBlPT0zO0M9Qy5wcmV2aW91c1NpYmxpbmcpe0YrPUMubm9kZVZhbHVlLmxlbmd0aH19ei5wdXNoKEYpfWVsc2V7RT1BLmNoaWxkTm9kZXM7aWYoRj49RS5sZW5ndGgmJkUubGVuZ3RoKXtEPTE7Rj1NYXRoLm1heCgwLEUubGVuZ3RoLTEpfXoucHVzaCh1LmRvbS5ub2RlSW5kZXgoRVtGXSxyKStEKX1mb3IoO0EmJkEhPXQ7QT1BLnBhcmVudE5vZGUpe3oucHVzaCh1LmRvbS5ub2RlSW5kZXgoQSxyKSl9cmV0dXJuIHp9eC5zdGFydD15KHYsdHJ1ZSk7aWYoIXUuaXNDb2xsYXBzZWQoKSl7eC5lbmQ9eSh2KX1yZXR1cm4geH1yZXR1cm4gaygpfWlmKHEpe3JldHVybntybmc6dS5nZXRSbmcoKX19Zz11LmdldFJuZygpO2k9bS51bmlxdWVJZCgpO249dGlueU1DRS5hY3RpdmVFZGl0b3Iuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCk7cz0ib3ZlcmZsb3c6aGlkZGVuO2xpbmUtaGVpZ2h0OjBweCI7aWYoZy5kdXBsaWNhdGV8fGcuaXRlbSl7aWYoIWcuaXRlbSl7aj1nLmR1cGxpY2F0ZSgpO2cuY29sbGFwc2UoKTtnLnBhc3RlSFRNTCgnPHNwYW4gX21jZV90eXBlPSJib29rbWFyayIgaWQ9IicraSsnX3N0YXJ0IiBzdHlsZT0iJytzKyciPicrbCsiPC9zcGFuPiIpO2lmKCFuKXtqLmNvbGxhcHNlKGZhbHNlKTtqLnBhc3RlSFRNTCgnPHNwYW4gX21jZV90eXBlPSJib29rbWFyayIgaWQ9IicraSsnX2VuZCIgc3R5bGU9IicrcysnIj4nK2wrIjwvc3Bhbj4iKX19ZWxzZXtvPWcuaXRlbSgwKTtoPW8ubm9kZU5hbWU7cmV0dXJue25hbWU6aCxpbmRleDpmKGgsbyl9fX1lbHNle289dS5nZXROb2RlKCk7aD1vLm5vZGVOYW1lO2lmKGg9PSJJTUciKXtyZXR1cm57bmFtZTpoLGluZGV4OmYoaCxvKX19aj1nLmNsb25lUmFuZ2UoKTtpZighbil7ai5jb2xsYXBzZShmYWxzZSk7ai5pbnNlcnROb2RlKG0uY3JlYXRlKCJzcGFuIix7X21jZV90eXBlOiJib29rbWFyayIsaWQ6aSsiX2VuZCIsc3R5bGU6c30sbCkpfWcuY29sbGFwc2UodHJ1ZSk7Zy5pbnNlcnROb2RlKG0uY3JlYXRlKCJzcGFuIix7X21jZV90eXBlOiJib29rbWFyayIsaWQ6aSsiX3N0YXJ0IixzdHlsZTpzfSxsKSl9dS5tb3ZlVG9Cb29rbWFyayh7aWQ6aSxrZWVwOjF9KTtyZXR1cm57aWQ6aX19LG1vdmVUb0Jvb2ttYXJrOmZ1bmN0aW9uKG4pe3ZhciByPXRoaXMsbD1yLmRvbSxpLGgsZixxLGoscyxvLHA7aWYoci50cmlkZW50U2VsKXtyLnRyaWRlbnRTZWwuZGVzdHJveSgpfWlmKG4pe2lmKG4uc3RhcnQpe2Y9bC5jcmVhdGVSbmcoKTtxPWwuZ2V0Um9vdCgpO2Z1bmN0aW9uIGcoeil7dmFyIHQ9blt6PyJzdGFydCI6ImVuZCJdLHYseCx5LHU7aWYodCl7Zm9yKHg9cSx2PXQubGVuZ3RoLTE7dj49MTt2LS0pe3U9eC5jaGlsZE5vZGVzO2lmKHUubGVuZ3RoKXt4PXVbdFt2XV19fWlmKHope2Yuc2V0U3RhcnQoeCx0WzBdKX1lbHNle2Yuc2V0RW5kKHgsdFswXSl9fX1nKHRydWUpO2coKTtyLnNldFJuZyhmKX1lbHNle2lmKG4uaWQpe2Z1bmN0aW9uIGsoQSl7dmFyIHU9bC5nZXQobi5pZCsiXyIrQSkseix0LHgseSx2PW4ua2VlcDtpZih1KXt6PXUucGFyZW50Tm9kZTtpZihBPT0ic3RhcnQiKXtpZighdil7dD1sLm5vZGVJbmRleCh1KX1lbHNle3o9dS5maXJzdENoaWxkO3Q9MX1qPXM9ejtvPXA9dH1lbHNle2lmKCF2KXt0PWwubm9kZUluZGV4KHUpfWVsc2V7ej11LmZpcnN0Q2hpbGQ7dD0xfXM9ejtwPXR9aWYoIXYpe3k9dS5wcmV2aW91c1NpYmxpbmc7eD11Lm5leHRTaWJsaW5nO2QoYy5ncmVwKHUuY2hpbGROb2RlcyksZnVuY3Rpb24oQil7aWYoQi5ub2RlVHlwZT09Myl7Qi5ub2RlVmFsdWU9Qi5ub2RlVmFsdWUucmVwbGFjZSgvXHVGRUZGL2csIiIpfX0pO3doaWxlKHU9bC5nZXQobi5pZCsiXyIrQSkpe2wucmVtb3ZlKHUsMSl9aWYoeSYmeCYmeS5ub2RlVHlwZT09eC5ub2RlVHlwZSYmeS5ub2RlVHlwZT09MyYmIWMuaXNPcGVyYSl7dD15Lm5vZGVWYWx1ZS5sZW5ndGg7eS5hcHBlbmREYXRhKHgubm9kZVZhbHVlKTtsLnJlbW92ZSh4KTtpZihBPT0ic3RhcnQiKXtqPXM9eTtvPXA9dH1lbHNle3M9eTtwPXR9fX19fWZ1bmN0aW9uIG0odCl7aWYoIWEmJmwuaXNCbG9jayh0KSYmIXQuaW5uZXJIVE1MKXt0LmlubmVySFRNTD0nPGJyIF9tY2VfYm9ndXM9IjEiIC8+J31yZXR1cm4gdH1rKCJzdGFydCIpO2soImVuZCIpO2lmKGope2Y9bC5jcmVhdGVSbmcoKTtmLnNldFN0YXJ0KG0oaiksbyk7Zi5zZXRFbmQobShzKSxwKTtyLnNldFJuZyhmKX19ZWxzZXtpZihuLm5hbWUpe3Iuc2VsZWN0KGwuc2VsZWN0KG4ubmFtZSlbbi5pbmRleF0pfWVsc2V7aWYobi5ybmcpe3Iuc2V0Um5nKG4ucm5nKX19fX19fSxzZWxlY3Q6ZnVuY3Rpb24oayxqKXt2YXIgaT10aGlzLGw9aS5kb20sZz1sLmNyZWF0ZVJuZygpLGY7Zj1sLm5vZGVJbmRleChrKTtnLnNldFN0YXJ0KGsucGFyZW50Tm9kZSxmKTtnLnNldEVuZChrLnBhcmVudE5vZGUsZisxKTtpZihqKXtmdW5jdGlvbiBoKG0sbyl7dmFyIG49bmV3IGMuZG9tLlRyZWVXYWxrZXIobSxtKTtkb3tpZihtLm5vZGVUeXBlPT0zJiZjLnRyaW0obS5ub2RlVmFsdWUpLmxlbmd0aCE9MCl7aWYobyl7Zy5zZXRTdGFydChtLDApfWVsc2V7Zy5zZXRFbmQobSxtLm5vZGVWYWx1ZS5sZW5ndGgpfXJldHVybn1pZihtLm5vZGVOYW1lPT0iQlIiKXtpZihvKXtnLnNldFN0YXJ0QmVmb3JlKG0pfWVsc2V7Zy5zZXRFbmRCZWZvcmUobSl9cmV0dXJufX13aGlsZShtPShvP24ubmV4dCgpOm4ucHJldigpKSl9aChrLDEpO2goayl9aS5zZXRSbmcoZyk7cmV0dXJuIGt9LGlzQ29sbGFwc2VkOmZ1bmN0aW9uKCl7dmFyIGY9dGhpcyxoPWYuZ2V0Um5nKCksZz1mLmdldFNlbCgpO2lmKCFofHxoLml0ZW0pe3JldHVybiBmYWxzZX1pZihoLmNvbXBhcmVFbmRQb2ludHMpe3JldHVybiBoLmNvbXBhcmVFbmRQb2ludHMoIlN0YXJ0VG9FbmQiLGgpPT09MH1yZXR1cm4gIWd8fGguY29sbGFwc2VkfSxjb2xsYXBzZTpmdW5jdGlvbihmKXt2YXIgZz10aGlzLGg9Zy5nZXRSbmcoKSxpO2lmKGguaXRlbSl7aT1oLml0ZW0oMCk7aD10aGlzLndpbi5kb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO2gubW92ZVRvRWxlbWVudFRleHQoaSl9aC5jb2xsYXBzZSghIWYpO2cuc2V0Um5nKGgpfSxnZXRTZWw6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGY9dGhpcy53aW47cmV0dXJuIGYuZ2V0U2VsZWN0aW9uP2YuZ2V0U2VsZWN0aW9uKCk6Zi5kb2N1bWVudC5zZWxlY3Rpb259LGdldFJuZzpmdW5jdGlvbihsKXt2YXIgZz10aGlzLGgsaSxrLGo9Zy53aW4uZG9jdW1lbnQ7aWYobCYmZy50cmlkZW50U2VsKXtyZXR1cm4gZy50cmlkZW50U2VsLmdldFJhbmdlQXQoMCl9dHJ5e2lmKGg9Zy5nZXRTZWwoKSl7aT1oLnJhbmdlQ291bnQ+MD9oLmdldFJhbmdlQXQoMCk6KGguY3JlYXRlUmFuZ2U/aC5jcmVhdGVSYW5nZSgpOmouY3JlYXRlUmFuZ2UoKSl9fWNhdGNoKGYpe31pZihjLmlzSUUmJmkuc2V0U3RhcnQmJmouc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaXRlbSl7az1qLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLml0ZW0oMCk7aT1qLmNyZWF0ZVJhbmdlKCk7aS5zZXRTdGFydEJlZm9yZShrKTtpLnNldEVuZEFmdGVyKGspfWlmKCFpKXtpPWouY3JlYXRlUmFuZ2U/ai5jcmVhdGVSYW5nZSgpOmouYm9keS5jcmVhdGVUZXh0UmFuZ2UoKX1pZihnLnNlbGVjdGVkUmFuZ2UmJmcuZXhwbGljaXRSYW5nZSl7aWYoaS5jb21wYXJlQm91bmRhcnlQb2ludHMoaS5TVEFSVF9UT19TVEFSVCxnLnNlbGVjdGVkUmFuZ2UpPT09MCYmaS5jb21wYXJlQm91bmRhcnlQb2ludHMoaS5FTkRfVE9fRU5ELGcuc2VsZWN0ZWRSYW5nZSk9PT0wKXtpPWcuZXhwbGljaXRSYW5nZX1lbHNle2cuc2VsZWN0ZWRSYW5nZT1udWxsO2cuZXhwbGljaXRSYW5nZT1udWxsfX1yZXR1cm4gaX0sc2V0Um5nOmZ1bmN0aW9uKGkpe3ZhciBoLGc9dGhpcztpZighZy50cmlkZW50U2VsKXtoPWcuZ2V0U2VsKCk7aWYoaCl7Zy5leHBsaWNpdFJhbmdlPWk7aC5yZW1vdmVBbGxSYW5nZXMoKTtoLmFkZFJhbmdlKGkpO2cuc2VsZWN0ZWRSYW5nZT1oLmdldFJhbmdlQXQoMCl9fWVsc2V7aWYoaS5jbG9uZVJhbmdlKXtnLnRyaWRlbnRTZWwuYWRkUmFuZ2UoaSk7cmV0dXJufXRyeXtpLnNlbGVjdCgpfWNhdGNoKGYpe319fSxzZXROb2RlOmZ1bmN0aW9uKGcpe3ZhciBmPXRoaXM7Zi5zZXRDb250ZW50KGYuZG9tLmdldE91dGVySFRNTChnKSk7cmV0dXJuIGd9LGdldE5vZGU6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGY9Zy5nZXRSbmcoKSxoPWcuZ2V0U2VsKCksaTtpZihmLnNldFN0YXJ0KXtpZighZil7cmV0dXJuIGcuZG9tLmdldFJvb3QoKX1pPWYuY29tbW9uQW5jZXN0b3JDb250YWluZXI7aWYoIWYuY29sbGFwc2VkKXtpZihmLnN0YXJ0Q29udGFpbmVyPT1mLmVuZENvbnRhaW5lcil7aWYoZi5zdGFydE9mZnNldC1mLmVuZE9mZnNldDwyKXtpZihmLnN0YXJ0Q29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSl7aT1mLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbZi5zdGFydE9mZnNldF19fX1pZihjLmlzV2ViS2l0JiZoLmFuY2hvck5vZGUmJmguYW5jaG9yTm9kZS5ub2RlVHlwZT09MSl7cmV0dXJuIGguYW5jaG9yTm9kZS5jaGlsZE5vZGVzW2guYW5jaG9yT2Zmc2V0XX19aWYoaSYmaS5ub2RlVHlwZT09Myl7cmV0dXJuIGkucGFyZW50Tm9kZX1yZXR1cm4gaX1yZXR1cm4gZi5pdGVtP2YuaXRlbSgwKTpmLnBhcmVudEVsZW1lbnQoKX0sZ2V0U2VsZWN0ZWRCbG9ja3M6ZnVuY3Rpb24oZyxmKXt2YXIgaT10aGlzLGo9aS5kb20sbSxoLGwsaz1bXTttPWouZ2V0UGFyZW50KGd8fGkuZ2V0U3RhcnQoKSxqLmlzQmxvY2spO2g9ai5nZXRQYXJlbnQoZnx8aS5nZXRFbmQoKSxqLmlzQmxvY2spO2lmKG0pe2sucHVzaChtKX1pZihtJiZoJiZtIT1oKXtsPW07d2hpbGUoKGw9bC5uZXh0U2libGluZykmJmwhPWgpe2lmKGouaXNCbG9jayhsKSl7ay5wdXNoKGwpfX19aWYoaCYmbSE9aCl7ay5wdXNoKGgpfXJldHVybiBrfSxkZXN0cm95OmZ1bmN0aW9uKGcpe3ZhciBmPXRoaXM7Zi53aW49bnVsbDtpZihmLnRyaWRlbnRTZWwpe2YudHJpZGVudFNlbC5kZXN0cm95KCl9aWYoIWcpe2MucmVtb3ZlVW5sb2FkKGYuZGVzdHJveSl9fSxfZml4SUVTZWxlY3Rpb246ZnVuY3Rpb24oKXt2YXIgbT10aGlzLmRvbSxsPW0uZG9jLGc9bC5ib2R5LGksajtsLmRvY3VtZW50RWxlbWVudC51bnNlbGVjdGFibGU9dHJ1ZTtmdW5jdGlvbiBrKG4scSl7dmFyIG89Zy5jcmVhdGVUZXh0UmFuZ2UoKTt0cnl7by5tb3ZlVG9Qb2ludChuLHEpfWNhdGNoKHApe289bnVsbH1yZXR1cm4gb31mdW5jdGlvbiBoKG8pe3ZhciBuO2lmKG8uYnV0dG9uKXtuPWsoby54LG8ueSk7aWYobil7aWYobi5jb21wYXJlRW5kUG9pbnRzKCJTdGFydFRvU3RhcnQiLGopPjApe24uc2V0RW5kUG9pbnQoIlN0YXJ0VG9TdGFydCIsail9ZWxzZXtuLnNldEVuZFBvaW50KCJFbmRUb0VuZCIsail9bi5zZWxlY3QoKX19ZWxzZXtmKCl9fWZ1bmN0aW9uIGYoKXttLnVuYmluZChsLCJtb3VzZXVwIixmKTttLnVuYmluZChsLCJtb3VzZW1vdmUiLGgpO2k9MH1tLmJpbmQobCwibW91c2Vkb3duIixmdW5jdGlvbihuKXtpZihuLnRhcmdldC5ub2RlTmFtZT09PSJIVE1MIil7aWYoaSl7ZigpfWk9MTtqPWsobi54LG4ueSk7aWYoail7bS5iaW5kKGwsIm1vdXNldXAiLGYpO20uYmluZChsLCJtb3VzZW1vdmUiLGgpO20ud2luLmZvY3VzKCk7ai5zZWxlY3QoKX19fSl9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYSl7YS5jcmVhdGUoInRpbnltY2UuZG9tLlhNTFdyaXRlciIse25vZGU6bnVsbCxYTUxXcml0ZXI6ZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3ZhciBlPWRvY3VtZW50LmltcGxlbWVudGF0aW9uO2lmKCFlfHwhZS5jcmVhdGVEb2N1bWVudCl7dHJ5e3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTVNYTUwyLkRPTURvY3VtZW50Iil9Y2F0Y2goZCl7fXRyeXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YbWxEb20iKX1jYXRjaChkKXt9fWVsc2V7cmV0dXJuIGUuY3JlYXRlRG9jdW1lbnQoIiIsIiIsbnVsbCl9fXRoaXMuZG9jPWIoKTt0aGlzLnZhbGlkPWEuaXNPcGVyYXx8YS5pc1dlYktpdDt0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWIuZG9jO2lmKGMuZmlyc3RDaGlsZCl7Yy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpfWIubm9kZT1jLmFwcGVuZENoaWxkKGMuY3JlYXRlRWxlbWVudCgiaHRtbCIpKX0sd3JpdGVTdGFydEVsZW1lbnQ6ZnVuY3Rpb24oYyl7dmFyIGI9dGhpcztiLm5vZGU9Yi5ub2RlLmFwcGVuZENoaWxkKGIuZG9jLmNyZWF0ZUVsZW1lbnQoYykpfSx3cml0ZUF0dHJpYnV0ZTpmdW5jdGlvbihjLGIpe2lmKHRoaXMudmFsaWQpe2I9Yi5yZXBsYWNlKC8+L2csIiVNQ0dUJSIpfXRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoYyxiKX0sd3JpdGVFbmRFbGVtZW50OmZ1bmN0aW9uKCl7dGhpcy5ub2RlPXRoaXMubm9kZS5wYXJlbnROb2RlfSx3cml0ZUZ1bGxFbmRFbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWIubm9kZTtjLmFwcGVuZENoaWxkKGIuZG9jLmNyZWF0ZVRleHROb2RlKCIiKSk7Yi5ub2RlPWMucGFyZW50Tm9kZX0sd3JpdGVUZXh0OmZ1bmN0aW9uKGIpe2lmKHRoaXMudmFsaWQpe2I9Yi5yZXBsYWNlKC8+L2csIiVNQ0dUJSIpfXRoaXMubm9kZS5hcHBlbmRDaGlsZCh0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZShiKSl9LHdyaXRlQ0RBVEE6ZnVuY3Rpb24oYil7dGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihiKSl9LHdyaXRlQ29tbWVudDpmdW5jdGlvbihiKXtpZihhLmlzSUUpe2I9Yi5yZXBsYWNlKC9eXC18XC0kL2csIiAiKX10aGlzLm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kb2MuY3JlYXRlQ29tbWVudChiLnJlcGxhY2UoL1wtXC0vZywiICIpKSl9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXt2YXIgYjtiPXRoaXMuZG9jLnhtbHx8bmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh0aGlzLmRvYyk7Yj1iLnJlcGxhY2UoLzxcP1teP10rXD8+fDxodG1sW14+XSo+fDxcL2h0bWw+fDxodG1sXC8+fDwhRE9DVFlQRVtePl0rPi9nLCIiKTtiPWIucmVwbGFjZSgvID9cLz4vZywiIC8+Iik7aWYodGhpcy52YWxpZCl7Yj1iLnJlcGxhY2UoL1wlTUNHVCUvZywiJmd0OyIpfXJldHVybiBifX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGMpe3ZhciBkPS9bJlwiPD5dL2csYj0vWzw+Jl0vZyxhPXsiJiI6IiZhbXA7IiwnIic6IiZxdW90OyIsIjwiOiImbHQ7IiwiPiI6IiZndDsifTtjLmNyZWF0ZSgidGlueW1jZS5kb20uU3RyaW5nV3JpdGVyIix7c3RyOm51bGwsdGFnczpudWxsLGNvdW50OjAsc2V0dGluZ3M6bnVsbCxpbmRlbnQ6bnVsbCxTdHJpbmdXcml0ZXI6ZnVuY3Rpb24oZSl7dGhpcy5zZXR0aW5ncz1jLmV4dGVuZCh7aW5kZW50X2NoYXI6IiAiLGluZGVudGF0aW9uOjB9LGUpO3RoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLmluZGVudD0iIjt0aGlzLnN0cj0iIjt0aGlzLnRhZ3M9W107dGhpcy5jb3VudD0wfSx3cml0ZVN0YXJ0RWxlbWVudDpmdW5jdGlvbihlKXt0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTt0aGlzLndyaXRlUmF3KCI8IitlKTt0aGlzLnRhZ3MucHVzaChlKTt0aGlzLmluQXR0cj10cnVlO3RoaXMuY291bnQrKzt0aGlzLmVsZW1lbnRDb3VudD10aGlzLmNvdW50O3RoaXMuYXR0cnM9e319LHdyaXRlQXR0cmlidXRlOmZ1bmN0aW9uKGcsZSl7dmFyIGY9dGhpcztpZighZi5hdHRyc1tnXSl7Zi53cml0ZVJhdygiICIrZi5lbmNvZGUoZyx0cnVlKSsnPSInK2YuZW5jb2RlKGUsdHJ1ZSkrJyInKTtmLmF0dHJzW2ddPWV9fSx3cml0ZUVuZEVsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgZTtpZih0aGlzLnRhZ3MubGVuZ3RoPjApe2U9dGhpcy50YWdzLnBvcCgpO2lmKHRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgxKSl7dGhpcy53cml0ZVJhdygiPC8iK2UrIj4iKX1pZih0aGlzLnNldHRpbmdzLmluZGVudGF0aW9uPjApe3RoaXMud3JpdGVSYXcoIlxuIil9fX0sd3JpdGVGdWxsRW5kRWxlbWVudDpmdW5jdGlvbigpe2lmKHRoaXMudGFncy5sZW5ndGg+MCl7dGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7dGhpcy53cml0ZVJhdygiPC8iK3RoaXMudGFncy5wb3AoKSsiPiIpO2lmKHRoaXMuc2V0dGluZ3MuaW5kZW50YXRpb24+MCl7dGhpcy53cml0ZVJhdygiXG4iKX19fSx3cml0ZVRleHQ6ZnVuY3Rpb24oZSl7dGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7dGhpcy53cml0ZVJhdyh0aGlzLmVuY29kZShlKSk7dGhpcy5jb3VudCsrfSx3cml0ZUNEQVRBOmZ1bmN0aW9uKGUpe3RoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgpO3RoaXMud3JpdGVSYXcoIjwhW0NEQVRBWyIrZSsiXV0+Iik7dGhpcy5jb3VudCsrfSx3cml0ZUNvbW1lbnQ6ZnVuY3Rpb24oZSl7dGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7dGhpcy53cml0ZVJhdygiPCEtLSIrZSsiLS0+Iik7dGhpcy5jb3VudCsrfSx3cml0ZVJhdzpmdW5jdGlvbihlKXt0aGlzLnN0cis9ZX0sZW5jb2RlOmZ1bmN0aW9uKGYsZSl7cmV0dXJuIGYucmVwbGFjZShlP2Q6YixmdW5jdGlvbihnKXtyZXR1cm4gYVtnXX0pfSxnZXRDb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyfSxfd3JpdGVBdHRyaWJ1dGVzRW5kOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmluQXR0cil7cmV0dXJufXRoaXMuaW5BdHRyPWZhbHNlO2lmKGUmJnRoaXMuZWxlbWVudENvdW50PT10aGlzLmNvdW50KXt0aGlzLndyaXRlUmF3KCIgLz4iKTtyZXR1cm4gZmFsc2V9dGhpcy53cml0ZVJhdygiPiIpO3JldHVybiB0cnVlfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGUpe3ZhciBnPWUuZXh0ZW5kLGY9ZS5lYWNoLGI9ZS51dGlsLkRpc3BhdGNoZXIsZD1lLmlzSUUsYT1lLmlzR2Vja287ZnVuY3Rpb24gYyhoKXtyZXR1cm4gaC5yZXBsYWNlKC8oWz8rKl0pL2csIi4kMSIpfWUuY3JlYXRlKCJ0aW55bWNlLmRvbS5TZXJpYWxpemVyIix7U2VyaWFsaXplcjpmdW5jdGlvbihqKXt2YXIgaT10aGlzO2kua2V5PTA7aS5vblByZVByb2Nlc3M9bmV3IGIoaSk7aS5vblBvc3RQcm9jZXNzPW5ldyBiKGkpO3RyeXtpLndyaXRlcj1uZXcgZS5kb20uWE1MV3JpdGVyKCl9Y2F0Y2goaCl7aS53cml0ZXI9bmV3IGUuZG9tLlN0cmluZ1dyaXRlcigpfWlmKGUuaXNJRSYmZG9jdW1lbnQuZG9jdW1lbnRNb2RlPjgpe2kud3JpdGVyPW5ldyBlLmRvbS5TdHJpbmdXcml0ZXIoKX1pLnNldHRpbmdzPWo9Zyh7ZG9tOmUuRE9NLHZhbGlkX25vZGVzOjAsbm9kZV9maWx0ZXI6MCxhdHRyX2ZpbHRlcjowLGludmFsaWRfYXR0cnM6L14oX21jZV98X21vel98c2l6c2V0fHNpemNhY2hlKS8sY2xvc2VkOi9eKGJyfGhyfGlucHV0fG1ldGF8aW1nfGxpbmt8cGFyYW18YXJlYSkkLyxlbnRpdHlfZW5jb2Rpbmc6Im5hbWVkIixlbnRpdGllczoiMTYwLG5ic3AsMTYxLGlleGNsLDE2MixjZW50LDE2Myxwb3VuZCwxNjQsY3VycmVuLDE2NSx5ZW4sMTY2LGJydmJhciwxNjcsc2VjdCwxNjgsdW1sLDE2OSxjb3B5LDE3MCxvcmRmLDE3MSxsYXF1bywxNzIsbm90LDE3MyxzaHksMTc0LHJlZywxNzUsbWFjciwxNzYsZGVnLDE3NyxwbHVzbW4sMTc4LHN1cDIsMTc5LHN1cDMsMTgwLGFjdXRlLDE4MSxtaWNybywxODIscGFyYSwxODMsbWlkZG90LDE4NCxjZWRpbCwxODUsc3VwMSwxODYsb3JkbSwxODcscmFxdW8sMTg4LGZyYWMxNCwxODksZnJhYzEyLDE5MCxmcmFjMzQsMTkxLGlxdWVzdCwxOTIsQWdyYXZlLDE5MyxBYWN1dGUsMTk0LEFjaXJjLDE5NSxBdGlsZGUsMTk2LEF1bWwsMTk3LEFyaW5nLDE5OCxBRWxpZywxOTksQ2NlZGlsLDIwMCxFZ3JhdmUsMjAxLEVhY3V0ZSwyMDIsRWNpcmMsMjAzLEV1bWwsMjA0LElncmF2ZSwyMDUsSWFjdXRlLDIwNixJY2lyYywyMDcsSXVtbCwyMDgsRVRILDIwOSxOdGlsZGUsMjEwLE9ncmF2ZSwyMTEsT2FjdXRlLDIxMixPY2lyYywyMTMsT3RpbGRlLDIxNCxPdW1sLDIxNSx0aW1lcywyMTYsT3NsYXNoLDIxNyxVZ3JhdmUsMjE4LFVhY3V0ZSwyMTksVWNpcmMsMjIwLFV1bWwsMjIxLFlhY3V0ZSwyMjIsVEhPUk4sMjIzLHN6bGlnLDIyNCxhZ3JhdmUsMjI1LGFhY3V0ZSwyMjYsYWNpcmMsMjI3LGF0aWxkZSwyMjgsYXVtbCwyMjksYXJpbmcsMjMwLGFlbGlnLDIzMSxjY2VkaWwsMjMyLGVncmF2ZSwyMzMsZWFjdXRlLDIzNCxlY2lyYywyMzUsZXVtbCwyMzYsaWdyYXZlLDIzNyxpYWN1dGUsMjM4LGljaXJjLDIzOSxpdW1sLDI0MCxldGgsMjQxLG50aWxkZSwyNDIsb2dyYXZlLDI0MyxvYWN1dGUsMjQ0LG9jaXJjLDI0NSxvdGlsZGUsMjQ2LG91bWwsMjQ3LGRpdmlkZSwyNDgsb3NsYXNoLDI0OSx1Z3JhdmUsMjUwLHVhY3V0ZSwyNTEsdWNpcmMsMjUyLHV1bWwsMjUzLHlhY3V0ZSwyNTQsdGhvcm4sMjU1LHl1bWwsNDAyLGZub2YsOTEzLEFscGhhLDkxNCxCZXRhLDkxNSxHYW1tYSw5MTYsRGVsdGEsOTE3LEVwc2lsb24sOTE4LFpldGEsOTE5LEV0YSw5MjAsVGhldGEsOTIxLElvdGEsOTIyLEthcHBhLDkyMyxMYW1iZGEsOTI0LE11LDkyNSxOdSw5MjYsWGksOTI3LE9taWNyb24sOTI4LFBpLDkyOSxSaG8sOTMxLFNpZ21hLDkzMixUYXUsOTMzLFVwc2lsb24sOTM0LFBoaSw5MzUsQ2hpLDkzNixQc2ksOTM3LE9tZWdhLDk0NSxhbHBoYSw5NDYsYmV0YSw5NDcsZ2FtbWEsOTQ4LGRlbHRhLDk0OSxlcHNpbG9uLDk1MCx6ZXRhLDk1MSxldGEsOTUyLHRoZXRhLDk1Myxpb3RhLDk1NCxrYXBwYSw5NTUsbGFtYmRhLDk1NixtdSw5NTcsbnUsOTU4LHhpLDk1OSxvbWljcm9uLDk2MCxwaSw5NjEscmhvLDk2MixzaWdtYWYsOTYzLHNpZ21hLDk2NCx0YXUsOTY1LHVwc2lsb24sOTY2LHBoaSw5NjcsY2hpLDk2OCxwc2ksOTY5LG9tZWdhLDk3Nyx0aGV0YXN5bSw5NzgsdXBzaWgsOTgyLHBpdiw4MjI2LGJ1bGwsODIzMCxoZWxsaXAsODI0MixwcmltZSw4MjQzLFByaW1lLDgyNTQsb2xpbmUsODI2MCxmcmFzbCw4NDcyLHdlaWVycCw4NDY1LGltYWdlLDg0NzYscmVhbCw4NDgyLHRyYWRlLDg1MDEsYWxlZnN5bSw4NTkyLGxhcnIsODU5Myx1YXJyLDg1OTQscmFyciw4NTk1LGRhcnIsODU5NixoYXJyLDg2MjksY3JhcnIsODY1NixsQXJyLDg2NTcsdUFyciw4NjU4LHJBcnIsODY1OSxkQXJyLDg2NjAsaEFyciw4NzA0LGZvcmFsbCw4NzA2LHBhcnQsODcwNyxleGlzdCw4NzA5LGVtcHR5LDg3MTEsbmFibGEsODcxMixpc2luLDg3MTMsbm90aW4sODcxNSxuaSw4NzE5LHByb2QsODcyMSxzdW0sODcyMixtaW51cyw4NzI3LGxvd2FzdCw4NzMwLHJhZGljLDg3MzMscHJvcCw4NzM0LGluZmluLDg3MzYsYW5nLDg3NDMsYW5kLDg3NDQsb3IsODc0NSxjYXAsODc0NixjdXAsODc0NyxpbnQsODc1Nix0aGVyZTQsODc2NCxzaW0sODc3Myxjb25nLDg3NzYsYXN5bXAsODgwMCxuZSw4ODAxLGVxdWl2LDg4MDQsbGUsODgwNSxnZSw4ODM0LHN1Yiw4ODM1LHN1cCw4ODM2LG5zdWIsODgzOCxzdWJlLDg4Mzksc3VwZSw4ODUzLG9wbHVzLDg4NTUsb3RpbWVzLDg4NjkscGVycCw4OTAxLHNkb3QsODk2OCxsY2VpbCw4OTY5LHJjZWlsLDg5NzAsbGZsb29yLDg5NzEscmZsb29yLDkwMDEsbGFuZyw5MDAyLHJhbmcsOTY3NCxsb3osOTgyNCxzcGFkZXMsOTgyNyxjbHVicyw5ODI5LGhlYXJ0cyw5ODMwLGRpYW1zLDMzOCxPRWxpZywzMzksb2VsaWcsMzUyLFNjYXJvbiwzNTMsc2Nhcm9uLDM3NixZdW1sLDcxMCxjaXJjLDczMix0aWxkZSw4MTk0LGVuc3AsODE5NSxlbXNwLDgyMDEsdGhpbnNwLDgyMDQsenduaiw4MjA1LHp3aiw4MjA2LGxybSw4MjA3LHJsbSw4MjExLG5kYXNoLDgyMTIsbWRhc2gsODIxNixsc3F1byw4MjE3LHJzcXVvLDgyMTgsc2JxdW8sODIyMCxsZHF1byw4MjIxLHJkcXVvLDgyMjIsYmRxdW8sODIyNCxkYWdnZXIsODIyNSxEYWdnZXIsODI0MCxwZXJtaWwsODI0OSxsc2FxdW8sODI1MCxyc2FxdW8sODM2NCxldXJvIix2YWxpZF9lbGVtZW50czoiKlsqXSIsZXh0ZW5kZWRfdmFsaWRfZWxlbWVudHM6MCxpbnZhbGlkX2VsZW1lbnRzOjAsZml4X3RhYmxlX2VsZW1lbnRzOjEsZml4X2xpc3RfZWxlbWVudHM6dHJ1ZSxmaXhfY29udGVudF9kdXBsaWNhdGlvbjp0cnVlLGNvbnZlcnRfZm9udHNfdG9fc3BhbnM6ZmFsc2UsZm9udF9zaXplX2NsYXNzZXM6MCxhcHBseV9zb3VyY2VfZm9ybWF0dGluZzowLGluZGVudF9tb2RlOiJzaW1wbGUiLGluZGVudF9jaGFyOiJcdCIsaW5kZW50X2xldmVsczoxLHJlbW92ZV9saW5lYnJlYWtzOjEscmVtb3ZlX3JlZHVuZGFudF9icnM6MSxlbGVtZW50X2Zvcm1hdDoieGh0bWwifSxqKTtpLmRvbT1qLmRvbTtpLnNjaGVtYT1qLnNjaGVtYTtpZihqLmVudGl0eV9lbmNvZGluZz09Im5hbWVkIiYmIWouZW50aXRpZXMpe2ouZW50aXR5X2VuY29kaW5nPSJyYXcifWlmKGoucmVtb3ZlX3JlZHVuZGFudF9icnMpe2kub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24oayxsKXtsLmNvbnRlbnQ9bC5jb250ZW50LnJlcGxhY2UoLyg8YnIgXC8+XHMqKSs8XC8ocHxoWzEtNl18ZGl2fGxpKT4vZ2ksZnVuY3Rpb24obixtLG8pe2lmKC9ePGJyIFwvPlxzKjxcLy8udGVzdChuKSl7cmV0dXJuIjwvIitvKyI+In1yZXR1cm4gbn0pfSl9aWYoai5lbGVtZW50X2Zvcm1hdD09Imh0bWwiKXtpLm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKGssbCl7bC5jb250ZW50PWwuY29udGVudC5yZXBsYWNlKC88KFtePl0rKSBcLz4vZywiPCQxPiIpfSl9aWYoai5maXhfbGlzdF9lbGVtZW50cyl7aS5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHYscyl7dmFyIGwseix5PVsib2wiLCJ1bCJdLHUsdCxxLGs9L14oT0x8VUwpJC8sQTtmdW5jdGlvbiBtKHIseCl7dmFyIG89eC5zcGxpdCgiLCIpLHA7d2hpbGUoKHI9ci5wcmV2aW91c1NpYmxpbmcpIT1udWxsKXtmb3IocD0wO3A8by5sZW5ndGg7cCsrKXtpZihyLm5vZGVOYW1lPT1vW3BdKXtyZXR1cm4gcn19fXJldHVybiBudWxsfWZvcih6PTA7ejx5Lmxlbmd0aDt6Kyspe2w9aS5kb20uc2VsZWN0KHlbel0scy5ub2RlKTtmb3IodT0wO3U8bC5sZW5ndGg7dSsrKXt0PWxbdV07cT10LnBhcmVudE5vZGU7aWYoay50ZXN0KHEubm9kZU5hbWUpKXtBPW0odCwiTEkiKTtpZighQSl7QT1pLmRvbS5jcmVhdGUoImxpIik7QS5pbm5lckhUTUw9IiZuYnNwOyI7QS5hcHBlbmRDaGlsZCh0KTtxLmluc2VydEJlZm9yZShBLHEuZmlyc3RDaGlsZCl9ZWxzZXtBLmFwcGVuZENoaWxkKHQpfX19fX0pfWlmKGouZml4X3RhYmxlX2VsZW1lbnRzKXtpLm9uUHJlUHJvY2Vzcy5hZGQoZnVuY3Rpb24oayxsKXtmKGkuZG9tLnNlbGVjdCgicCB0YWJsZSIsbC5ub2RlKS5yZXZlcnNlKCksZnVuY3Rpb24ocCl7dmFyIG89aS5kb20uZ2V0UGFyZW50KHAucGFyZW50Tm9kZSwidGFibGUscCIpO2lmKG8ubm9kZU5hbWUhPSJUQUJMRSIpe3RyeXtpLmRvbS5zcGxpdChvLHApfWNhdGNoKG0pe319fSl9KX19LHNldEVudGl0aWVzOmZ1bmN0aW9uKG8pe3ZhciBuPXRoaXMsaixtLGg9e30saztpZihuLmVudGl0eUxvb2t1cCl7cmV0dXJufWo9by5zcGxpdCgiLCIpO2ZvcihtPTA7bTxqLmxlbmd0aDttKz0yKXtrPWpbbV07aWYoaz09MzR8fGs9PTM4fHxrPT02MHx8az09NjIpe2NvbnRpbnVlfWhbU3RyaW5nLmZyb21DaGFyQ29kZShqW21dKV09alttKzFdO2s9cGFyc2VJbnQoalttXSkudG9TdHJpbmcoMTYpfW4uZW50aXR5TG9va3VwPWh9LHNldFJ1bGVzOmZ1bmN0aW9uKGkpe3ZhciBoPXRoaXM7aC5fc2V0dXAoKTtoLnJ1bGVzPXt9O2gud2lsZFJ1bGVzPVtdO2gudmFsaWRFbGVtZW50cz17fTtyZXR1cm4gaC5hZGRSdWxlcyhpKX0sYWRkUnVsZXM6ZnVuY3Rpb24oaSl7dmFyIGg9dGhpcyxqO2lmKCFpKXtyZXR1cm59aC5fc2V0dXAoKTtmKGkuc3BsaXQoIiwiKSxmdW5jdGlvbihtKXt2YXIgcT1tLnNwbGl0KC9cW3xcXS8pLGw9cVswXS5zcGxpdCgiLyIpLHIsayxvLG49W107aWYoail7az1lLmV4dGVuZChbXSxqLmF0dHJpYnMpfWlmKHEubGVuZ3RoPjEpe2YocVsxXS5zcGxpdCgifCIpLGZ1bmN0aW9uKHUpe3ZhciBwPXt9LHQ7az1rfHxbXTt1PXUucmVwbGFjZSgvOjovZywifiIpO3U9L14oWyFcLV0pPyhbXHcqLj9+X1wtXSt8KShbPTo8XSk/KC4rKT8kLy5leGVjKHUpO3VbMl09dVsyXS5yZXBsYWNlKC9+L2csIjoiKTtpZih1WzFdPT0iISIpe3I9cnx8W107ci5wdXNoKHVbMl0pfWlmKHVbMV09PSItIil7Zm9yKHQ9MDt0PGsubGVuZ3RoO3QrKyl7aWYoa1t0XS5uYW1lPT11WzJdKXtrLnNwbGljZSh0LDEpO3JldHVybn19fXN3aXRjaCh1WzNdKXtjYXNlIj0iOnAuZGVmYXVsdFZhbD11WzRdfHwiIjticmVhaztjYXNlIjoiOnAuZm9yY2VkVmFsPXVbNF07YnJlYWs7Y2FzZSI8IjpwLnZhbGlkVmFscz11WzRdLnNwbGl0KCI/Iik7YnJlYWt9aWYoL1sqLj9dLy50ZXN0KHVbMl0pKXtvPW98fFtdO3AubmFtZVJFPW5ldyBSZWdFeHAoIl4iK2ModVsyXSkrIiQiKTtvLnB1c2gocCl9ZWxzZXtwLm5hbWU9dVsyXTtrLnB1c2gocCl9bi5wdXNoKHVbMl0pfSl9ZihsLGZ1bmN0aW9uKHYsdSl7dmFyIHk9di5jaGFyQXQoMCksdD0xLHA9e307aWYoail7aWYoai5ub0VtcHR5KXtwLm5vRW1wdHk9ai5ub0VtcHR5fWlmKGouZnVsbEVuZCl7cC5mdWxsRW5kPWouZnVsbEVuZH1pZihqLnBhZGQpe3AucGFkZD1qLnBhZGR9fXN3aXRjaCh5KXtjYXNlIi0iOnAubm9FbXB0eT10cnVlO2JyZWFrO2Nhc2UiKyI6cC5mdWxsRW5kPXRydWU7YnJlYWs7Y2FzZSIjIjpwLnBhZGQ9dHJ1ZTticmVhaztkZWZhdWx0OnQ9MH1sW3VdPXY9di5zdWJzdHJpbmcodCk7aC52YWxpZEVsZW1lbnRzW3ZdPTE7aWYoL1sqLj9dLy50ZXN0KGxbMF0pKXtwLm5hbWVSRT1uZXcgUmVnRXhwKCJeIitjKGxbMF0pKyIkIik7aC53aWxkUnVsZXM9aC53aWxkUnVsZXN8fHt9O2gud2lsZFJ1bGVzLnB1c2gocCl9ZWxzZXtwLm5hbWU9bFswXTtpZihsWzBdPT0iQCIpe2o9cH1oLnJ1bGVzW3ZdPXB9cC5hdHRyaWJzPWs7aWYocil7cC5yZXF1aXJlZEF0dHJpYnM9cn1pZihvKXt2PSIiO2YobixmdW5jdGlvbihzKXtpZih2KXt2Kz0ifCJ9dis9IigiK2MocykrIikifSk7cC52YWxpZEF0dHJpYnNSRT1uZXcgUmVnRXhwKCJeIit2LnRvTG93ZXJDYXNlKCkrIiQiKTtwLndpbGRBdHRyaWJzPW99fSl9KTtpPSIiO2YoaC52YWxpZEVsZW1lbnRzLGZ1bmN0aW9uKG0sbCl7aWYoaSl7aSs9InwifWlmKGwhPSJAIil7aSs9bH19KTtoLnZhbGlkRWxlbWVudHNSRT1uZXcgUmVnRXhwKCJeKCIrYyhpLnRvTG93ZXJDYXNlKCkpKyIpJCIpfSxmaW5kUnVsZTpmdW5jdGlvbihtKXt2YXIgaj10aGlzLGw9ai5ydWxlcyxoLGs7ai5fc2V0dXAoKTtrPWxbbV07aWYoayl7cmV0dXJuIGt9bD1qLndpbGRSdWxlcztmb3IoaD0wO2g8bC5sZW5ndGg7aCsrKXtpZihsW2hdLm5hbWVSRS50ZXN0KG0pKXtyZXR1cm4gbFtoXX19cmV0dXJuIG51bGx9LGZpbmRBdHRyaWJSdWxlOmZ1bmN0aW9uKGgsbCl7dmFyIGosaz1oLndpbGRBdHRyaWJzO2ZvcihqPTA7ajxrLmxlbmd0aDtqKyspe2lmKGtbal0ubmFtZVJFLnRlc3QobCkpe3JldHVybiBrW2pdfX1yZXR1cm4gbnVsbH0sc2VyaWFsaXplOmZ1bmN0aW9uKHIscSl7dmFyIG0saz10aGlzLHAsaSxqLGw7ay5fc2V0dXAoKTtxPXF8fHt9O3EuZm9ybWF0PXEuZm9ybWF0fHwiaHRtbCI7ay5wcm9jZXNzT2JqPXE7aWYoZCl7bD1bXTtmKHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9wdGlvbiIpLGZ1bmN0aW9uKG8pe3ZhciBoPWsuZG9tLmdldEF0dHJpYihvLCJzZWxlY3RlZCIpO2wucHVzaChoP2g6bnVsbCl9KX1yPXIuY2xvbmVOb2RlKHRydWUpO2lmKGQpe2Yoci5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3B0aW9uIiksZnVuY3Rpb24obyxoKXtrLmRvbS5zZXRBdHRyaWIobywic2VsZWN0ZWQiLGxbaF0pfSl9aj1yLm93bmVyRG9jdW1lbnQuaW1wbGVtZW50YXRpb247aWYoai5jcmVhdGVIVE1MRG9jdW1lbnQpe3A9ai5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpO2Yoci5ub2RlTmFtZT09IkJPRFkiP3IuY2hpbGROb2Rlczpbcl0sZnVuY3Rpb24oaCl7cC5ib2R5LmFwcGVuZENoaWxkKHAuaW1wb3J0Tm9kZShoLHRydWUpKX0pO2lmKHIubm9kZU5hbWUhPSJCT0RZIil7cj1wLmJvZHkuZmlyc3RDaGlsZH1lbHNle3I9cC5ib2R5fWk9ay5kb20uZG9jO2suZG9tLmRvYz1wfWsua2V5PSIiKyhwYXJzZUludChrLmtleSkrMSk7aWYoIXEubm9fZXZlbnRzKXtxLm5vZGU9cjtrLm9uUHJlUHJvY2Vzcy5kaXNwYXRjaChrLHEpfWsud3JpdGVyLnJlc2V0KCk7ay5faW5mbz1xO2suX3NlcmlhbGl6ZU5vZGUocixxLmdldElubmVyKTtxLmNvbnRlbnQ9ay53cml0ZXIuZ2V0Q29udGVudCgpO2lmKGkpe2suZG9tLmRvYz1pfWlmKCFxLm5vX2V2ZW50cyl7ay5vblBvc3RQcm9jZXNzLmRpc3BhdGNoKGsscSl9ay5fcG9zdFByb2Nlc3MocSk7cS5ub2RlPW51bGw7cmV0dXJuIGUudHJpbShxLmNvbnRlbnQpfSxfcG9zdFByb2Nlc3M6ZnVuY3Rpb24obil7dmFyIGk9dGhpcyxrPWkuc2V0dGluZ3Msaj1uLmNvbnRlbnQsbT1bXSxsO2lmKG4uZm9ybWF0PT0iaHRtbCIpe2w9aS5fcHJvdGVjdCh7Y29udGVudDpqLHBhdHRlcm5zOlt7cGF0dGVybjovKDxzY3JpcHRbXj5dKj4pKC4qPykoPFwvc2NyaXB0PikvZ30se3BhdHRlcm46Lyg8bm9zY3JpcHRbXj5dKj4pKC4qPykoPFwvbm9zY3JpcHQ+KS9nfSx7cGF0dGVybjovKDxzdHlsZVtePl0qPikoLio/KSg8XC9zdHlsZT4pL2d9LHtwYXR0ZXJuOi8oPHByZVtePl0qPikoLio/KSg8XC9wcmU+KS9nLGVuY29kZToxfSx7cGF0dGVybjovKDwhLS1cW0NEQVRBXFspKC4qPykoXF1cXS0tPikvZ31dfSk7aj1sLmNvbnRlbnQ7aWYoay5lbnRpdHlfZW5jb2RpbmchPT0icmF3Iil7aj1pLl9lbmNvZGUoail9aWYoIW4uc2V0KXtqPWUuX3JlcGxhY2UoLzxwPlxzKzxcL3A+fDxwKFtePl0rKT5ccys8XC9wPi9nLGsuZW50aXR5X2VuY29kaW5nPT0ibnVtZXJpYyI/IjxwJDE+JiMxNjA7PC9wPiI6IjxwJDE+Jm5ic3A7PC9wPiIsaik7aWYoay5yZW1vdmVfbGluZWJyZWFrcyl7aj1qLnJlcGxhY2UoL1xyP1xufFxyL2csIiAiKTtqPWUuX3JlcGxhY2UoLyg8W14+XSs+KVxzKy9nLCIkMSAiLGopO2o9ZS5fcmVwbGFjZSgvXHMrKDxcL1tePl0rPikvZywiICQxIixqKTtqPWUuX3JlcGxhY2UoLzwocHxoWzEtNl18YmxvY2txdW90ZXxocnxkaXZ8dGFibGV8dGJvZHl8dHJ8dGR8Ym9keXxoZWFkfGh0bWx8dGl0bGV8bWV0YXxzdHlsZXxwcmV8c2NyaXB0fGxpbmt8b2JqZWN0KSAoW14+XSspPlxzKy9nLCI8JDEgJDI+IixqKTtqPWUuX3JlcGxhY2UoLzwocHxoWzEtNl18YmxvY2txdW90ZXxocnxkaXZ8dGFibGV8dGJvZHl8dHJ8dGR8Ym9keXxoZWFkfGh0bWx8dGl0bGV8bWV0YXxzdHlsZXxwcmV8c2NyaXB0fGxpbmt8b2JqZWN0KT5ccysvZywiPCQxPiIsaik7aj1lLl9yZXBsYWNlKC9ccys8XC8ocHxoWzEtNl18YmxvY2txdW90ZXxocnxkaXZ8dGFibGV8dGJvZHl8dHJ8dGR8Ym9keXxoZWFkfGh0bWx8dGl0bGV8bWV0YXxzdHlsZXxwcmV8c2NyaXB0fGxpbmt8b2JqZWN0KT4vZywiPC8kMT4iLGopfWlmKGsuYXBwbHlfc291cmNlX2Zvcm1hdHRpbmcmJmsuaW5kZW50X21vZGU9PSJzaW1wbGUiKXtqPWUuX3JlcGxhY2UoLzwoXC8/KSh1bHxocnx0YWJsZXxtZXRhfGxpbmt8dGJvZHl8dHJ8b2JqZWN0fGJvZHl8aGVhZHxodG1sfG1hcCkofFtePl0rKT5ccyovZywiXG48JDEkMiQzPlxuIixqKTtqPWUuX3JlcGxhY2UoL1xzKjwocHxoWzEtNl18YmxvY2txdW90ZXxkaXZ8dGl0bGV8c3R5bGV8cHJlfHNjcmlwdHx0ZHxsaXxhcmVhKSh8W14+XSspPi9nLCJcbjwkMSQyPiIsaik7aj1lLl9yZXBsYWNlKC88XC8ocHxoWzEtNl18YmxvY2txdW90ZXxkaXZ8dGl0bGV8c3R5bGV8cHJlfHNjcmlwdHx0ZHxsaSk+XHMqL2csIjwvJDE+XG4iLGopO2o9ai5yZXBsYWNlKC9cblxuL2csIlxuIil9fWo9aS5fdW5wcm90ZWN0KGosbCk7aj1lLl9yZXBsYWNlKC88IS0tXFtDREFUQVxbKFtcc1xTXSspXF1cXS0tPi9nLCI8IVtDREFUQVskMV1dPiIsaik7aWYoay5lbnRpdHlfZW5jb2Rpbmc9PSJyYXciKXtqPWUuX3JlcGxhY2UoLzxwPiZuYnNwOzxcL3A+fDxwKFtePl0rKT4mbmJzcDs8XC9wPi9nLCI8cCQxPlx1MDBhMDwvcD4iLGopfWo9ai5yZXBsYWNlKC88bm9zY3JpcHQoW14+XSt8KT4oW1xzXFNdKj8pPFwvbm9zY3JpcHQ+L2csZnVuY3Rpb24oaCxwLG8pe3JldHVybiI8bm9zY3JpcHQiK3ArIj4iK2kuZG9tLmRlY29kZShvLnJlcGxhY2UoLzwhLS18LS0+L2csIiIpKSsiPC9ub3NjcmlwdD4ifSl9bi5jb250ZW50PWp9LF9zZXJpYWxpemVOb2RlOmZ1bmN0aW9uKEUsSil7dmFyIEE9dGhpcyxCPUEuc2V0dGluZ3MseT1BLndyaXRlcixxLGosdSxHLEYsSSxDLGgseixrLHIsRCxwLG0sSCxvLHg7aWYoIUIubm9kZV9maWx0ZXJ8fEIubm9kZV9maWx0ZXIoRSkpe3N3aXRjaChFLm5vZGVUeXBlKXtjYXNlIDE6aWYoRS5oYXNBdHRyaWJ1dGU/RS5oYXNBdHRyaWJ1dGUoIl9tY2VfYm9ndXMiKTpFLmdldEF0dHJpYnV0ZSgiX21jZV9ib2d1cyIpKXtyZXR1cm59cD1IPWZhbHNlO3E9RS5oYXNDaGlsZE5vZGVzKCk7az1FLmdldEF0dHJpYnV0ZSgiX21jZV9uYW1lIil8fEUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtvPUUuZ2V0QXR0cmlidXRlKCJfbWNlX3R5cGUiKTtpZihvKXtpZighQS5faW5mby5jbGVhbnVwKXtwPXRydWU7cmV0dXJufWVsc2V7SD0xfX1pZihkKXt4PUUuc2NvcGVOYW1lO2lmKHgmJnghPT0iSFRNTCImJnghPT0iaHRtbCIpe2s9eCsiOiIra319aWYoay5pbmRleE9mKCJtY2U6Iik9PT0wKXtrPWsuc3Vic3RyaW5nKDQpfWlmKCFIKXtpZighQS52YWxpZEVsZW1lbnRzUkV8fCFBLnZhbGlkRWxlbWVudHNSRS50ZXN0KGspfHwoQS5pbnZhbGlkRWxlbWVudHNSRSYmQS5pbnZhbGlkRWxlbWVudHNSRS50ZXN0KGspKXx8Sil7cD10cnVlO2JyZWFrfX1pZihkKXtpZihCLmZpeF9jb250ZW50X2R1cGxpY2F0aW9uKXtpZihFLl9tY2Vfc2VyaWFsaXplZD09QS5rZXkpe3JldHVybn1FLl9tY2Vfc2VyaWFsaXplZD1BLmtleX1pZihrLmNoYXJBdCgwKT09Ii8iKXtrPWsuc3Vic3RyaW5nKDEpfX1lbHNle2lmKGEpe2lmKEUubm9kZU5hbWU9PT0iQlIiJiZFLmdldEF0dHJpYnV0ZSgidHlwZSIpPT0iX21veiIpe3JldHVybn19fWlmKEIudmFsaWRhdGVfY2hpbGRyZW4pe2lmKEEuZWxlbWVudE5hbWUmJiFBLnNjaGVtYS5pc1ZhbGlkKEEuZWxlbWVudE5hbWUsaykpe3A9dHJ1ZTticmVha31BLmVsZW1lbnROYW1lPWt9cj1BLmZpbmRSdWxlKGspO2lmKCFyKXtwPXRydWU7YnJlYWt9az1yLm5hbWV8fGs7bT1CLmNsb3NlZC50ZXN0KGspO2lmKCghcSYmci5ub0VtcHR5KXx8KGQmJiFrKSl7cD10cnVlO2JyZWFrfWlmKHIucmVxdWlyZWRBdHRyaWJzKXtJPXIucmVxdWlyZWRBdHRyaWJzO2ZvcihHPUkubGVuZ3RoLTE7Rz49MDtHLS0pe2lmKHRoaXMuZG9tLmdldEF0dHJpYihFLElbR10pIT09IiIpe2JyZWFrfX1pZihHPT0tMSl7cD10cnVlO2JyZWFrfX15LndyaXRlU3RhcnRFbGVtZW50KGspO2lmKHIuYXR0cmlicyl7Zm9yKEc9MCxDPXIuYXR0cmlicyxGPUMubGVuZ3RoO0c8RjtHKyspe0k9Q1tHXTt6PUEuX2dldEF0dHJpYihFLEkpO2lmKHohPT1udWxsKXt5LndyaXRlQXR0cmlidXRlKEkubmFtZSx6KX19fWlmKHIudmFsaWRBdHRyaWJzUkUpe0M9QS5kb20uZ2V0QXR0cmlicyhFKTtmb3IoRz1DLmxlbmd0aC0xO0c+LTE7Ry0tKXtoPUNbR107aWYoaC5zcGVjaWZpZWQpe0k9aC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKEIuaW52YWxpZF9hdHRycy50ZXN0KEkpfHwhci52YWxpZEF0dHJpYnNSRS50ZXN0KEkpKXtjb250aW51ZX1EPUEuZmluZEF0dHJpYlJ1bGUocixJKTt6PUEuX2dldEF0dHJpYihFLEQsSSk7aWYoeiE9PW51bGwpe3kud3JpdGVBdHRyaWJ1dGUoSSx6KX19fX1pZihvJiZIKXt5LndyaXRlQXR0cmlidXRlKCJfbWNlX3R5cGUiLG8pfWlmKGs9PT0ic2NyaXB0IiYmZS50cmltKEUuaW5uZXJIVE1MKSl7eS53cml0ZVRleHQoIi8vICIpO3kud3JpdGVDREFUQShFLmlubmVySFRNTC5yZXBsYWNlKC88IS0tfC0tPnw8XFtDREFUQVxbfFxdXF0+L2csIiIpKTtxPWZhbHNlO2JyZWFrfWlmKHIucGFkZCl7aWYocSYmKHU9RS5maXJzdENoaWxkKSYmdS5ub2RlVHlwZT09PTEmJkUuY2hpbGROb2Rlcy5sZW5ndGg9PT0xKXtpZih1Lmhhc0F0dHJpYnV0ZT91Lmhhc0F0dHJpYnV0ZSgiX21jZV9ib2d1cyIpOnUuZ2V0QXR0cmlidXRlKCJfbWNlX2JvZ3VzIikpe3kud3JpdGVUZXh0KCJcdTAwYTAiKX19ZWxzZXtpZighcSl7eS53cml0ZVRleHQoIlx1MDBhMCIpfX19YnJlYWs7Y2FzZSAzOmlmKEIudmFsaWRhdGVfY2hpbGRyZW4mJkEuZWxlbWVudE5hbWUmJiFBLnNjaGVtYS5pc1ZhbGlkKEEuZWxlbWVudE5hbWUsIiN0ZXh0Iikpe3JldHVybn1yZXR1cm4geS53cml0ZVRleHQoRS5ub2RlVmFsdWUpO2Nhc2UgNDpyZXR1cm4geS53cml0ZUNEQVRBKEUubm9kZVZhbHVlKTtjYXNlIDg6cmV0dXJuIHkud3JpdGVDb21tZW50KEUubm9kZVZhbHVlKX19ZWxzZXtpZihFLm5vZGVUeXBlPT0xKXtxPUUuaGFzQ2hpbGROb2RlcygpfX1pZihxJiYhbSl7dT1FLmZpcnN0Q2hpbGQ7d2hpbGUodSl7QS5fc2VyaWFsaXplTm9kZSh1KTtBLmVsZW1lbnROYW1lPWs7dT11Lm5leHRTaWJsaW5nfX1pZighcCl7aWYoIW0pe3kud3JpdGVGdWxsRW5kRWxlbWVudCgpfWVsc2V7eS53cml0ZUVuZEVsZW1lbnQoKX19fSxfcHJvdGVjdDpmdW5jdGlvbihqKXt2YXIgaT10aGlzO2ouaXRlbXM9ai5pdGVtc3x8W107ZnVuY3Rpb24gaChsKXtyZXR1cm4gbC5yZXBsYWNlKC9bXHJcblxcXS9nLGZ1bmN0aW9uKG0pe2lmKG09PT0iXG4iKXtyZXR1cm4iXFxuIn1lbHNle2lmKG09PT0iXFwiKXtyZXR1cm4iXFxcXCJ9fXJldHVybiJcXHIifSl9ZnVuY3Rpb24gayhsKXtyZXR1cm4gbC5yZXBsYWNlKC9cXFtcXHJuXS9nLGZ1bmN0aW9uKG0pe2lmKG09PT0iXFxuIil7cmV0dXJuIlxuIn1lbHNle2lmKG09PT0iXFxcXCIpe3JldHVybiJcXCJ9fXJldHVybiJcciJ9KX1mKGoucGF0dGVybnMsZnVuY3Rpb24obCl7ai5jb250ZW50PWsoaChqLmNvbnRlbnQpLnJlcGxhY2UobC5wYXR0ZXJuLGZ1bmN0aW9uKG4sbyxtLHApe209ayhtKTtpZihsLmVuY29kZSl7bT1pLl9lbmNvZGUobSl9ai5pdGVtcy5wdXNoKG0pO3JldHVybiBvKyI8IS0tbWNlOiIrKGouaXRlbXMubGVuZ3RoLTEpKyItLT4iK3B9KSl9KTtyZXR1cm4gan0sX3VucHJvdGVjdDpmdW5jdGlvbihpLGope2k9aS5yZXBsYWNlKC9cPCEtLW1jZTooWzAtOV0rKS0tXD4vZyxmdW5jdGlvbihrLGgpe3JldHVybiBqLml0ZW1zW3BhcnNlSW50KGgpXX0pO2ouaXRlbXM9W107cmV0dXJuIGl9LF9lbmNvZGU6ZnVuY3Rpb24obSl7dmFyIGo9dGhpcyxrPWouc2V0dGluZ3MsaTtpZihrLmVudGl0eV9lbmNvZGluZyE9PSJyYXciKXtpZihrLmVudGl0eV9lbmNvZGluZy5pbmRleE9mKCJuYW1lZCIpIT0tMSl7ai5zZXRFbnRpdGllcyhrLmVudGl0aWVzKTtpPWouZW50aXR5TG9va3VwO209bS5yZXBsYWNlKC9bXHUwMDdFLVx1RkZGRl0vZyxmdW5jdGlvbihoKXt2YXIgbDtpZihsPWlbaF0pe2g9IiYiK2wrIjsifXJldHVybiBofSl9aWYoay5lbnRpdHlfZW5jb2RpbmcuaW5kZXhPZigibnVtZXJpYyIpIT0tMSl7bT1tLnJlcGxhY2UoL1tcdTAwN0UtXHVGRkZGXS9nLGZ1bmN0aW9uKGgpe3JldHVybiImIyIraC5jaGFyQ29kZUF0KDApKyI7In0pfX1yZXR1cm4gbX0sX3NldHVwOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcyxpPXRoaXMuc2V0dGluZ3M7aWYoaC5kb25lKXtyZXR1cm59aC5kb25lPTE7aC5zZXRSdWxlcyhpLnZhbGlkX2VsZW1lbnRzKTtoLmFkZFJ1bGVzKGkuZXh0ZW5kZWRfdmFsaWRfZWxlbWVudHMpO2lmKGkuaW52YWxpZF9lbGVtZW50cyl7aC5pbnZhbGlkRWxlbWVudHNSRT1uZXcgUmVnRXhwKCJeKCIrYyhpLmludmFsaWRfZWxlbWVudHMucmVwbGFjZSgvLC9nLCJ8IikudG9Mb3dlckNhc2UoKSkrIikkIil9aWYoaS5hdHRyaWJfdmFsdWVfZmlsdGVyKXtoLmF0dHJpYlZhbHVlRmlsdGVyPWkuYXR0cmliVmFsdWVGaWx0ZXJ9fSxfZ2V0QXR0cmliOmZ1bmN0aW9uKG0saixoKXt2YXIgbCxrO2g9aHx8ai5uYW1lO2lmKGouZm9yY2VkVmFsJiYoaz1qLmZvcmNlZFZhbCkpe2lmKGs9PT0ieyR1aWR9Iil7cmV0dXJuIHRoaXMuZG9tLnVuaXF1ZUlkKCl9cmV0dXJuIGt9az10aGlzLmRvbS5nZXRBdHRyaWIobSxoKTtzd2l0Y2goaCl7Y2FzZSJyb3dzcGFuIjpjYXNlImNvbHNwYW4iOmlmKGs9PSIxIil7az0iIn1icmVha31pZih0aGlzLmF0dHJpYlZhbHVlRmlsdGVyKXtrPXRoaXMuYXR0cmliVmFsdWVGaWx0ZXIoaCxrLG0pfWlmKGoudmFsaWRWYWxzKXtmb3IobD1qLnZhbGlkVmFscy5sZW5ndGgtMTtsPj0wO2wtLSl7aWYoaz09ai52YWxpZFZhbHNbbF0pe2JyZWFrfX1pZihsPT0tMSl7cmV0dXJuIG51bGx9fWlmKGs9PT0iIiYmdHlwZW9mKGouZGVmYXVsdFZhbCkhPSJ1bmRlZmluZWQiKXtrPWouZGVmYXVsdFZhbDtpZihrPT09InskdWlkfSIpe3JldHVybiB0aGlzLmRvbS51bmlxdWVJZCgpfXJldHVybiBrfWVsc2V7aWYoaD09ImNsYXNzIiYmdGhpcy5wcm9jZXNzT2JqLmdldCl7az1rLnJlcGxhY2UoL1xzP21jZUl0ZW1cdytccz8vZywiIil9fWlmKGs9PT0iIil7cmV0dXJuIG51bGx9cmV0dXJuIGt9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYSl7YS5kb20uU2NyaXB0TG9hZGVyPWZ1bmN0aW9uKGgpe3ZhciBjPTAsaz0xLGk9MixsPXt9LGo9W10sZj17fSxkPVtdLGc9MCxlO2Z1bmN0aW9uIGIobSx1KXt2YXIgdj10aGlzLHE9YS5ET00scyxvLHIsbjtmdW5jdGlvbiBwKCl7cS5yZW1vdmUobik7aWYocyl7cy5vbnJlYWR5c3RhdGVjaGFuZ2U9cy5vbmxvYWQ9cz1udWxsfXUoKX1uPXEudW5pcXVlSWQoKTtpZihhLmlzSUU2KXtvPW5ldyBhLnV0aWwuVVJJKG0pO3I9bG9jYXRpb247aWYoby5ob3N0PT1yLmhvc3RuYW1lJiZvLnBvcnQ9PXIucG9ydCYmKG8ucHJvdG9jb2wrIjoiKT09ci5wcm90b2NvbCl7YS51dGlsLlhIUi5zZW5kKHt1cmw6YS5fYWRkVmVyKG8uZ2V0VVJJKCkpLHN1Y2Nlc3M6ZnVuY3Rpb24oeCl7dmFyIHQ9cS5jcmVhdGUoInNjcmlwdCIse3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KTt0LnRleHQ9eDtkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHQpO3EucmVtb3ZlKHQpO3AoKX19KTtyZXR1cm59fXM9cS5jcmVhdGUoInNjcmlwdCIse2lkOm4sdHlwZToidGV4dC9qYXZhc2NyaXB0IixzcmM6YS5fYWRkVmVyKG0pfSk7aWYoIWEuaXNJRSl7cy5vbmxvYWQ9cH1zLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciB0PXMucmVhZHlTdGF0ZTtpZih0PT0iY29tcGxldGUifHx0PT0ibG9hZGVkIil7cCgpfX07KGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKHMpfXRoaXMuaXNEb25lPWZ1bmN0aW9uKG0pe3JldHVybiBsW21dPT1pfTt0aGlzLm1hcmtEb25lPWZ1bmN0aW9uKG0pe2xbbV09aX07dGhpcy5hZGQ9dGhpcy5sb2FkPWZ1bmN0aW9uKG0scSxuKXt2YXIgbyxwPWxbbV07aWYocD09ZSl7ai5wdXNoKG0pO2xbbV09Y31pZihxKXtpZighZlttXSl7ZlttXT1bXX1mW21dLnB1c2goe2Z1bmM6cSxzY29wZTpufHx0aGlzfSl9fTt0aGlzLmxvYWRRdWV1ZT1mdW5jdGlvbihuLG0pe3RoaXMubG9hZFNjcmlwdHMoaixuLG0pfTt0aGlzLmxvYWRTY3JpcHRzPWZ1bmN0aW9uKG0scSxwKXt2YXIgbztmdW5jdGlvbiBuKHIpe2EuZWFjaChmW3JdLGZ1bmN0aW9uKHMpe3MuZnVuYy5jYWxsKHMuc2NvcGUpfSk7ZltyXT1lfWQucHVzaCh7ZnVuYzpxLHNjb3BlOnB8fHRoaXN9KTtvPWZ1bmN0aW9uKCl7dmFyIHI9YS5ncmVwKG0pO20ubGVuZ3RoPTA7YS5lYWNoKHIsZnVuY3Rpb24ocyl7aWYobFtzXT09aSl7bihzKTtyZXR1cm59aWYobFtzXSE9ayl7bFtzXT1rO2crKztiKHMsZnVuY3Rpb24oKXtsW3NdPWk7Zy0tO24ocyk7bygpfSl9fSk7aWYoIWcpe2EuZWFjaChkLGZ1bmN0aW9uKHMpe3MuZnVuYy5jYWxsKHMuc2NvcGUpfSk7ZC5sZW5ndGg9MH19O28oKX19O2EuU2NyaXB0TG9hZGVyPW5ldyBhLmRvbS5TY3JpcHRMb2FkZXIoKX0pKHRpbnltY2UpO3RpbnltY2UuZG9tLlRyZWVXYWxrZXI9ZnVuY3Rpb24oYSxjKXt2YXIgYj1hO2Z1bmN0aW9uIGQoaSxmLGUsail7dmFyIGgsZztpZihpKXtpZighaiYmaVtmXSl7cmV0dXJuIGlbZl19aWYoaSE9Yyl7aD1pW2VdO2lmKGgpe3JldHVybiBofWZvcihnPWkucGFyZW50Tm9kZTtnJiZnIT1jO2c9Zy5wYXJlbnROb2RlKXtoPWdbZV07aWYoaCl7cmV0dXJuIGh9fX19fXRoaXMuY3VycmVudD1mdW5jdGlvbigpe3JldHVybiBifTt0aGlzLm5leHQ9ZnVuY3Rpb24oZSl7cmV0dXJuKGI9ZChiLCJmaXJzdENoaWxkIiwibmV4dFNpYmxpbmciLGUpKX07dGhpcy5wcmV2PWZ1bmN0aW9uKGUpe3JldHVybihiPWQoYiwibGFzdENoaWxkIiwibGFzdFNpYmxpbmciLGUpKX19OyhmdW5jdGlvbigpe3ZhciBhPXt9O2Z1bmN0aW9uIGIoZixlKXt2YXIgZDtmdW5jdGlvbiBjKGcpe3JldHVybiBnLnJlcGxhY2UoL1tBLVpdKy9nLGZ1bmN0aW9uKGgpe3JldHVybiBjKGZbaF0pfSl9Zm9yKGQgaW4gZil7aWYoZi5oYXNPd25Qcm9wZXJ0eShkKSl7ZltkXT1jKGZbZF0pfX1jKGUpLnJlcGxhY2UoLyMvZywiI3RleHQiKS5yZXBsYWNlKC8oXHcrKVxbKFteXF1dKylcXS9nLGZ1bmN0aW9uKGwsZyxqKXt2YXIgaCxrPXt9O2o9ai5zcGxpdCgvXHwvKTtmb3IoaD1qLmxlbmd0aC0xO2g+PTA7aC0tKXtrW2pbaF1dPTF9YVtnXT1rfSl9Yih7WjoiI3xIfEt8TnxPfFAiLFk6IiN8WHxmb3JtfFJ8USIsWDoicHxUfGRpdnxVfFd8aXNpbmRleHxmaWVsZHNldHx0YWJsZSIsVzoicHJlfGhyfGJsb2NrcXVvdGV8YWRkcmVzc3xjZW50ZXJ8bm9mcmFtZXMiLFU6InVsfG9sfGRsfG1lbnV8ZGlyIixaQzoiI3xwfFl8ZGl2fFV8V3x0YWJsZXxicnxzcGFufGJkb3xvYmplY3R8YXBwbGV0fGltZ3xtYXB8S3xOfFEiLFQ6ImgxfGgyfGgzfGg0fGg1fGg2IixaQjoiI3xYfFN8USIsUzoiUnxQIixaQToiI3xhfEd8SnxNfE98UCIsUjoiI3xhfEh8S3xOfE8iLFE6Im5vc2NyaXB0fFAiLFA6Imluc3xkZWx8c2NyaXB0IixPOiJpbnB1dHxzZWxlY3R8dGV4dGFyZWF8bGFiZWx8YnV0dG9uIixOOiJNfEwiLE06ImVtfHN0cm9uZ3xkZm58Y29kZXxxfHNhbXB8a2JkfHZhcnxjaXRlfGFiYnJ8YWNyb255bSIsTDoic3VifHN1cCIsSzoiSnxJIixKOiJ0dHxpfGJ8dXxzfHN0cmlrZSIsSToiYmlnfHNtYWxsfGZvbnR8YmFzZWZvbnQiLEg6Ikd8RiIsRzoiYnJ8c3BhbnxiZG8iLEY6Im9iamVjdHxhcHBsZXR8aW1nfG1hcHxpZnJhbWUifSwic2NyaXB0W11zdHlsZVtdb2JqZWN0WyN8cGFyYW18WHxmb3JtfGF8SHxLfE58T3xRXXBhcmFtW11wW1NdYVtaXWJyW11zcGFuW1NdYmRvW1NdYXBwbGV0WyN8cGFyYW18WHxmb3JtfGF8SHxLfE58T3xRXWgxW1NdaW1nW11tYXBbWHxmb3JtfFF8YXJlYV1oMltTXWlmcmFtZVsjfFh8Zm9ybXxhfEh8S3xOfE98UV1oM1tTXXR0W1NdaVtTXWJbU111W1Ndc1tTXXN0cmlrZVtTXWJpZ1tTXXNtYWxsW1NdZm9udFtTXWJhc2Vmb250W11lbVtTXXN0cm9uZ1tTXWRmbltTXWNvZGVbU11xW1Ndc2FtcFtTXWtiZFtTXXZhcltTXWNpdGVbU11hYmJyW1NdYWNyb255bVtTXXN1YltTXXN1cFtTXWlucHV0W11zZWxlY3Rbb3B0Z3JvdXB8b3B0aW9uXW9wdGdyb3VwW29wdGlvbl1vcHRpb25bXXRleHRhcmVhW11sYWJlbFtTXWJ1dHRvblsjfHB8VHxkaXZ8VXxXfHRhYmxlfEd8b2JqZWN0fGFwcGxldHxpbWd8bWFwfEt8TnxRXWg0W1NdaW5zWyN8WHxmb3JtfGF8SHxLfE58T3xRXWg1W1NdZGVsWyN8WHxmb3JtfGF8SHxLfE58T3xRXWg2W1NdZGl2WyN8WHxmb3JtfGF8SHxLfE58T3xRXXVsW2xpXWxpWyN8WHxmb3JtfGF8SHxLfE58T3xRXW9sW2xpXWRsW2R0fGRkXWR0W1NdZGRbI3xYfGZvcm18YXxIfEt8TnxPfFFdbWVudVtsaV1kaXJbbGldcHJlW1pBXWhyW11ibG9ja3F1b3RlWyN8WHxmb3JtfGF8SHxLfE58T3xRXWFkZHJlc3NbU3xwXWNlbnRlclsjfFh8Zm9ybXxhfEh8S3xOfE98UV1ub2ZyYW1lc1sjfFh8Zm9ybXxhfEh8S3xOfE98UV1pc2luZGV4W11maWVsZHNldFsjfGxlZ2VuZHxYfGZvcm18YXxIfEt8TnxPfFFdbGVnZW5kW1NddGFibGVbY2FwdGlvbnxjb2x8Y29sZ3JvdXB8dGhlYWR8dGZvb3R8dGJvZHl8dHJdY2FwdGlvbltTXWNvbFtdY29sZ3JvdXBbY29sXXRoZWFkW3RyXXRyW3RofHRkXXRoWyN8WHxmb3JtfGF8SHxLfE58T3xRXWZvcm1bI3xYfGF8SHxLfE58T3xRXW5vc2NyaXB0WyN8WHxmb3JtfGF8SHxLfE58T3xRXXRkWyN8WHxmb3JtfGF8SHxLfE58T3xRXXRmb290W3RyXXRib2R5W3RyXWFyZWFbXWJhc2VbXWJvZHlbI3xYfGZvcm18YXxIfEt8TnxPfFFdIik7dGlueW1jZS5kb20uU2NoZW1hPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcyxkPWE7Yy5pc1ZhbGlkPWZ1bmN0aW9uKGYsZSl7dmFyIGc9ZFtmXTtyZXR1cm4gISEoZyYmKCFlfHxnW2VdKSl9fX0pKCk7KGZ1bmN0aW9uKGEpe2EuZG9tLlJhbmdlVXRpbHM9ZnVuY3Rpb24oYyl7dmFyIGI9Ilx1RkVGRiI7dGhpcy53YWxrPWZ1bmN0aW9uKGQscil7dmFyIGg9ZC5zdGFydENvbnRhaW5lcixrPWQuc3RhcnRPZmZzZXQscz1kLmVuZENvbnRhaW5lcixsPWQuZW5kT2Zmc2V0LGksZixuLGcscSxwLGU7ZT1jLnNlbGVjdCgidGQubWNlU2VsZWN0ZWQsdGgubWNlU2VsZWN0ZWQiKTtpZihlLmxlbmd0aD4wKXthLmVhY2goZSxmdW5jdGlvbih0KXtyKFt0XSl9KTtyZXR1cm59ZnVuY3Rpb24gbyh2LHUsdCl7dmFyIHg9W107Zm9yKDt2JiZ2IT10O3Y9dlt1XSl7eC5wdXNoKHYpfXJldHVybiB4fWZ1bmN0aW9uIG0odSx0KXtkb3tpZih1LnBhcmVudE5vZGU9PXQpe3JldHVybiB1fXU9dS5wYXJlbnROb2RlfXdoaWxlKHUpfWZ1bmN0aW9uIGoodix1LHgpe3ZhciB0PXg/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIjtmb3IoZz12LHE9Zy5wYXJlbnROb2RlO2cmJmchPXU7Zz1xKXtxPWcucGFyZW50Tm9kZTtwPW8oZz09dj9nOmdbdF0sdCk7aWYocC5sZW5ndGgpe2lmKCF4KXtwLnJldmVyc2UoKX1yKHApfX19aWYoaC5ub2RlVHlwZT09MSYmaC5oYXNDaGlsZE5vZGVzKCkpe2g9aC5jaGlsZE5vZGVzW2tdfWlmKHMubm9kZVR5cGU9PTEmJnMuaGFzQ2hpbGROb2RlcygpKXtzPXMuY2hpbGROb2Rlc1tNYXRoLm1pbihrPT1sP2w6bC0xLHMuY2hpbGROb2Rlcy5sZW5ndGgtMSldfWk9Yy5maW5kQ29tbW9uQW5jZXN0b3IoaCxzKTtpZihoPT1zKXtyZXR1cm4gcihbaF0pfWZvcihnPWg7ZztnPWcucGFyZW50Tm9kZSl7aWYoZz09cyl7cmV0dXJuIGooaCxpLHRydWUpfWlmKGc9PWkpe2JyZWFrfX1mb3IoZz1zO2c7Zz1nLnBhcmVudE5vZGUpe2lmKGc9PWgpe3JldHVybiBqKHMsaSl9aWYoZz09aSl7YnJlYWt9fWY9bShoLGkpfHxoO249bShzLGkpfHxzO2ooaCxmLHRydWUpO3A9byhmPT1oP2Y6Zi5uZXh0U2libGluZywibmV4dFNpYmxpbmciLG49PXM/bi5uZXh0U2libGluZzpuKTtpZihwLmxlbmd0aCl7cihwKX1qKHMsbil9fTthLmRvbS5SYW5nZVV0aWxzLmNvbXBhcmVSYW5nZXM9ZnVuY3Rpb24oYyxiKXtpZihjJiZiKXtpZihjLml0ZW18fGMuZHVwbGljYXRlKXtpZihjLml0ZW0mJmIuaXRlbSYmYy5pdGVtKDApPT09Yi5pdGVtKDApKXtyZXR1cm4gdHJ1ZX1pZihjLmlzRXF1YWwmJmIuaXNFcXVhbCYmYi5pc0VxdWFsKGMpKXtyZXR1cm4gdHJ1ZX19ZWxzZXtyZXR1cm4gYy5zdGFydENvbnRhaW5lcj09Yi5zdGFydENvbnRhaW5lciYmYy5zdGFydE9mZnNldD09Yi5zdGFydE9mZnNldH19cmV0dXJuIGZhbHNlfX0pKHRpbnltY2UpOyhmdW5jdGlvbihjKXt2YXIgYj1jLkRPTSxhPWMuaXM7Yy5jcmVhdGUoInRpbnltY2UudWkuQ29udHJvbCIse0NvbnRyb2w6ZnVuY3Rpb24oZSxkKXt0aGlzLmlkPWU7dGhpcy5zZXR0aW5ncz1kPWR8fHt9O3RoaXMucmVuZGVyZWQ9ZmFsc2U7dGhpcy5vblJlbmRlcj1uZXcgYy51dGlsLkRpc3BhdGNoZXIodGhpcyk7dGhpcy5jbGFzc1ByZWZpeD0iIjt0aGlzLnNjb3BlPWQuc2NvcGV8fHRoaXM7dGhpcy5kaXNhYmxlZD0wO3RoaXMuYWN0aXZlPTB9LHNldERpc2FibGVkOmZ1bmN0aW9uKGQpe3ZhciBmO2lmKGQhPXRoaXMuZGlzYWJsZWQpe2Y9Yi5nZXQodGhpcy5pZCk7aWYoZiYmdGhpcy5zZXR0aW5ncy51bmF2YWlsYWJsZV9wcmVmaXgpe2lmKGQpe3RoaXMucHJldlRpdGxlPWYudGl0bGU7Zi50aXRsZT10aGlzLnNldHRpbmdzLnVuYXZhaWxhYmxlX3ByZWZpeCsiOiAiK2YudGl0bGV9ZWxzZXtmLnRpdGxlPXRoaXMucHJldlRpdGxlfX10aGlzLnNldFN0YXRlKCJEaXNhYmxlZCIsZCk7dGhpcy5zZXRTdGF0ZSgiRW5hYmxlZCIsIWQpO3RoaXMuZGlzYWJsZWQ9ZH19LGlzRGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNhYmxlZH0sc2V0QWN0aXZlOmZ1bmN0aW9uKGQpe2lmKGQhPXRoaXMuYWN0aXZlKXt0aGlzLnNldFN0YXRlKCJBY3RpdmUiLGQpO3RoaXMuYWN0aXZlPWR9fSxpc0FjdGl2ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZX0sc2V0U3RhdGU6ZnVuY3Rpb24oZixkKXt2YXIgZT1iLmdldCh0aGlzLmlkKTtmPXRoaXMuY2xhc3NQcmVmaXgrZjtpZihkKXtiLmFkZENsYXNzKGUsZil9ZWxzZXtiLnJlbW92ZUNsYXNzKGUsZil9fSxpc1JlbmRlcmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZWR9LHJlbmRlckhUTUw6ZnVuY3Rpb24oKXt9LHJlbmRlclRvOmZ1bmN0aW9uKGQpe2Iuc2V0SFRNTChkLHRoaXMucmVuZGVySFRNTCgpKX0scG9zdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsZDtpZihhKGUuZGlzYWJsZWQpKXtkPWUuZGlzYWJsZWQ7ZS5kaXNhYmxlZD0tMTtlLnNldERpc2FibGVkKGQpfWlmKGEoZS5hY3RpdmUpKXtkPWUuYWN0aXZlO2UuYWN0aXZlPS0xO2Uuc2V0QWN0aXZlKGQpfX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmUodGhpcy5pZCk7dGhpcy5kZXN0cm95KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtjLmRvbS5FdmVudC5jbGVhcih0aGlzLmlkKX19KX0pKHRpbnltY2UpO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnVpLkNvbnRhaW5lcjp0aW55bWNlLnVpLkNvbnRyb2wiLHtDb250YWluZXI6ZnVuY3Rpb24oYixhKXt0aGlzLnBhcmVudChiLGEpO3RoaXMuY29udHJvbHM9W107dGhpcy5sb29rdXA9e319LGFkZDpmdW5jdGlvbihhKXt0aGlzLmxvb2t1cFthLmlkXT1hO3RoaXMuY29udHJvbHMucHVzaChhKTtyZXR1cm4gYX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvb2t1cFthXX19KTt0aW55bWNlLmNyZWF0ZSgidGlueW1jZS51aS5TZXBhcmF0b3I6dGlueW1jZS51aS5Db250cm9sIix7U2VwYXJhdG9yOmZ1bmN0aW9uKGIsYSl7dGhpcy5wYXJlbnQoYixhKTt0aGlzLmNsYXNzUHJlZml4PSJtY2VTZXBhcmF0b3IifSxyZW5kZXJIVE1MOmZ1bmN0aW9uKCl7cmV0dXJuIHRpbnltY2UuRE9NLmNyZWF0ZUhUTUwoInNwYW4iLHsiY2xhc3MiOnRoaXMuY2xhc3NQcmVmaXh9KX19KTsoZnVuY3Rpb24oZCl7dmFyIGM9ZC5pcyxiPWQuRE9NLGU9ZC5lYWNoLGE9ZC53YWxrO2QuY3JlYXRlKCJ0aW55bWNlLnVpLk1lbnVJdGVtOnRpbnltY2UudWkuQ29udHJvbCIse01lbnVJdGVtOmZ1bmN0aW9uKGcsZil7dGhpcy5wYXJlbnQoZyxmKTt0aGlzLmNsYXNzUHJlZml4PSJtY2VNZW51SXRlbSJ9LHNldFNlbGVjdGVkOmZ1bmN0aW9uKGYpe3RoaXMuc2V0U3RhdGUoIlNlbGVjdGVkIixmKTt0aGlzLnNlbGVjdGVkPWZ9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3RlZH0scG9zdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBmPXRoaXM7Zi5wYXJlbnQoKTtpZihjKGYuc2VsZWN0ZWQpKXtmLnNldFNlbGVjdGVkKGYuc2VsZWN0ZWQpfX19KX0pKHRpbnltY2UpOyhmdW5jdGlvbihkKXt2YXIgYz1kLmlzLGI9ZC5ET00sZT1kLmVhY2gsYT1kLndhbGs7ZC5jcmVhdGUoInRpbnltY2UudWkuTWVudTp0aW55bWNlLnVpLk1lbnVJdGVtIix7TWVudTpmdW5jdGlvbihoLGcpe3ZhciBmPXRoaXM7Zi5wYXJlbnQoaCxnKTtmLml0ZW1zPXt9O2YuY29sbGFwc2VkPWZhbHNlO2YubWVudUNvdW50PTA7Zi5vbkFkZEl0ZW09bmV3IGQudXRpbC5EaXNwYXRjaGVyKHRoaXMpfSxleHBhbmQ6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcztpZihnKXthKGYsZnVuY3Rpb24oaCl7aWYoaC5leHBhbmQpe2guZXhwYW5kKCl9fSwiaXRlbXMiLGYpfWYuY29sbGFwc2VkPWZhbHNlfSxjb2xsYXBzZTpmdW5jdGlvbihnKXt2YXIgZj10aGlzO2lmKGcpe2EoZixmdW5jdGlvbihoKXtpZihoLmNvbGxhcHNlKXtoLmNvbGxhcHNlKCl9fSwiaXRlbXMiLGYpfWYuY29sbGFwc2VkPXRydWV9LGlzQ29sbGFwc2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sbGFwc2VkfSxhZGQ6ZnVuY3Rpb24oZil7aWYoIWYuc2V0dGluZ3Mpe2Y9bmV3IGQudWkuTWVudUl0ZW0oZi5pZHx8Yi51bmlxdWVJZCgpLGYpfXRoaXMub25BZGRJdGVtLmRpc3BhdGNoKHRoaXMsZik7cmV0dXJuIHRoaXMuaXRlbXNbZi5pZF09Zn0sYWRkU2VwYXJhdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHtzZXBhcmF0b3I6dHJ1ZX0pfSxhZGRNZW51OmZ1bmN0aW9uKGYpe2lmKCFmLmNvbGxhcHNlKXtmPXRoaXMuY3JlYXRlTWVudShmKX10aGlzLm1lbnVDb3VudCsrO3JldHVybiB0aGlzLmFkZChmKX0saGFzTWVudXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51Q291bnQhPT0wfSxyZW1vdmU6ZnVuY3Rpb24oZil7ZGVsZXRlIHRoaXMuaXRlbXNbZi5pZF19LHJlbW92ZUFsbDpmdW5jdGlvbigpe3ZhciBmPXRoaXM7YShmLGZ1bmN0aW9uKGcpe2lmKGcucmVtb3ZlQWxsKXtnLnJlbW92ZUFsbCgpfWVsc2V7Zy5yZW1vdmUoKX1nLmRlc3Ryb3koKX0sIml0ZW1zIixmKTtmLml0ZW1zPXt9fSxjcmVhdGVNZW51OmZ1bmN0aW9uKGcpe3ZhciBmPW5ldyBkLnVpLk1lbnUoZy5pZHx8Yi51bmlxdWVJZCgpLGcpO2Yub25BZGRJdGVtLmFkZCh0aGlzLm9uQWRkSXRlbS5kaXNwYXRjaCx0aGlzLm9uQWRkSXRlbSk7cmV0dXJuIGZ9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oZSl7dmFyIGQ9ZS5pcyxjPWUuRE9NLGY9ZS5lYWNoLGE9ZS5kb20uRXZlbnQsYj1lLmRvbS5FbGVtZW50O2UuY3JlYXRlKCJ0aW55bWNlLnVpLkRyb3BNZW51OnRpbnltY2UudWkuTWVudSIse0Ryb3BNZW51OmZ1bmN0aW9uKGgsZyl7Zz1nfHx7fTtnLmNvbnRhaW5lcj1nLmNvbnRhaW5lcnx8Yy5kb2MuYm9keTtnLm9mZnNldF94PWcub2Zmc2V0X3h8fDA7Zy5vZmZzZXRfeT1nLm9mZnNldF95fHwwO2cudnBfb2Zmc2V0X3g9Zy52cF9vZmZzZXRfeHx8MDtnLnZwX29mZnNldF95PWcudnBfb2Zmc2V0X3l8fDA7aWYoZChnLmljb25zKSYmIWcuaWNvbnMpe2dbImNsYXNzIl0rPSIgbWNlTm9JY29ucyJ9dGhpcy5wYXJlbnQoaCxnKTt0aGlzLm9uU2hvd01lbnU9bmV3IGUudXRpbC5EaXNwYXRjaGVyKHRoaXMpO3RoaXMub25IaWRlTWVudT1uZXcgZS51dGlsLkRpc3BhdGNoZXIodGhpcyk7dGhpcy5jbGFzc1ByZWZpeD0ibWNlTWVudSJ9LGNyZWF0ZU1lbnU6ZnVuY3Rpb24oail7dmFyIGg9dGhpcyxpPWguc2V0dGluZ3MsZztqLmNvbnRhaW5lcj1qLmNvbnRhaW5lcnx8aS5jb250YWluZXI7ai5wYXJlbnQ9aDtqLmNvbnN0cmFpbj1qLmNvbnN0cmFpbnx8aS5jb25zdHJhaW47alsiY2xhc3MiXT1qWyJjbGFzcyJdfHxpWyJjbGFzcyJdO2oudnBfb2Zmc2V0X3g9ai52cF9vZmZzZXRfeHx8aS52cF9vZmZzZXRfeDtqLnZwX29mZnNldF95PWoudnBfb2Zmc2V0X3l8fGkudnBfb2Zmc2V0X3k7Zz1uZXcgZS51aS5Ecm9wTWVudShqLmlkfHxjLnVuaXF1ZUlkKCksaik7Zy5vbkFkZEl0ZW0uYWRkKGgub25BZGRJdGVtLmRpc3BhdGNoLGgub25BZGRJdGVtKTtyZXR1cm4gZ30sdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxqPWkuc2V0dGluZ3MsZz1jLmdldCgibWVudV8iK2kuaWQrIl90YmwiKSxsPWMuZ2V0KCJtZW51XyIraS5pZCsiX2NvIiksaCxrO2g9ai5tYXhfd2lkdGg/TWF0aC5taW4oZy5jbGllbnRXaWR0aCxqLm1heF93aWR0aCk6Zy5jbGllbnRXaWR0aDtrPWoubWF4X2hlaWdodD9NYXRoLm1pbihnLmNsaWVudEhlaWdodCxqLm1heF9oZWlnaHQpOmcuY2xpZW50SGVpZ2h0O2lmKCFjLmJveE1vZGVsKXtpLmVsZW1lbnQuc2V0U3R5bGVzKHt3aWR0aDpoKzIsaGVpZ2h0OmsrMn0pfWVsc2V7aS5lbGVtZW50LnNldFN0eWxlcyh7d2lkdGg6aCxoZWlnaHQ6a30pfWlmKGoubWF4X3dpZHRoKXtjLnNldFN0eWxlKGwsIndpZHRoIixoKX1pZihqLm1heF9oZWlnaHQpe2Muc2V0U3R5bGUobCwiaGVpZ2h0IixrKTtpZihnLmNsaWVudEhlaWdodDxqLm1heF9oZWlnaHQpe2Muc2V0U3R5bGUobCwib3ZlcmZsb3ciLCJoaWRkZW4iKX19fSxzaG93TWVudTpmdW5jdGlvbihwLG4scil7dmFyIHo9dGhpcyxBPXouc2V0dGluZ3MsbyxnPWMuZ2V0Vmlld1BvcnQoKSx1LGwsdixxLGk9MixrLGosbT16LmNsYXNzUHJlZml4O3ouY29sbGFwc2UoMSk7aWYoei5pc01lbnVWaXNpYmxlKXtyZXR1cm59aWYoIXoucmVuZGVyZWQpe289Yy5hZGQoei5zZXR0aW5ncy5jb250YWluZXIsei5yZW5kZXJOb2RlKCkpO2Yoei5pdGVtcyxmdW5jdGlvbihoKXtoLnBvc3RSZW5kZXIoKX0pO3ouZWxlbWVudD1uZXcgYigibWVudV8iK3ouaWQse2Jsb2NrZXI6MSxjb250YWluZXI6QS5jb250YWluZXJ9KX1lbHNle289Yy5nZXQoIm1lbnVfIit6LmlkKX1pZighZS5pc09wZXJhKXtjLnNldFN0eWxlcyhvLHtsZWZ0Oi02NTUzNSx0b3A6LTY1NTM1fSl9Yy5zaG93KG8pO3oudXBkYXRlKCk7cCs9QS5vZmZzZXRfeHx8MDtuKz1BLm9mZnNldF95fHwwO2cudy09NDtnLmgtPTQ7aWYoQS5jb25zdHJhaW4pe3U9by5jbGllbnRXaWR0aC1pO2w9by5jbGllbnRIZWlnaHQtaTt2PWcueCtnLnc7cT1nLnkrZy5oO2lmKChwK0EudnBfb2Zmc2V0X3grdSk+dil7cD1yP3ItdTpNYXRoLm1heCgwLCh2LUEudnBfb2Zmc2V0X3gpLXUpfWlmKChuK0EudnBfb2Zmc2V0X3krbCk+cSl7bj1NYXRoLm1heCgwLChxLUEudnBfb2Zmc2V0X3kpLWwpfX1jLnNldFN0eWxlcyhvLHtsZWZ0OnAsdG9wOm59KTt6LmVsZW1lbnQudXBkYXRlKCk7ei5pc01lbnVWaXNpYmxlPTE7ei5tb3VzZUNsaWNrRnVuYz1hLmFkZChvLCJjbGljayIsZnVuY3Rpb24ocyl7dmFyIGg7cz1zLnRhcmdldDtpZihzJiYocz1jLmdldFBhcmVudChzLCJ0ciIpKSYmIWMuaGFzQ2xhc3MocyxtKyJJdGVtU3ViIikpe2g9ei5pdGVtc1tzLmlkXTtpZihoLmlzRGlzYWJsZWQoKSl7cmV0dXJufWs9ejt3aGlsZShrKXtpZihrLmhpZGVNZW51KXtrLmhpZGVNZW51KCl9az1rLnNldHRpbmdzLnBhcmVudH1pZihoLnNldHRpbmdzLm9uY2xpY2spe2guc2V0dGluZ3Mub25jbGljayhzKX1yZXR1cm4gYS5jYW5jZWwocyl9fSk7aWYoei5oYXNNZW51cygpKXt6Lm1vdXNlT3ZlckZ1bmM9YS5hZGQobywibW91c2VvdmVyIixmdW5jdGlvbih4KXt2YXIgaCx0LHM7eD14LnRhcmdldDtpZih4JiYoeD1jLmdldFBhcmVudCh4LCJ0ciIpKSl7aD16Lml0ZW1zW3guaWRdO2lmKHoubGFzdE1lbnUpe3oubGFzdE1lbnUuY29sbGFwc2UoMSl9aWYoaC5pc0Rpc2FibGVkKCkpe3JldHVybn1pZih4JiZjLmhhc0NsYXNzKHgsbSsiSXRlbVN1YiIpKXt0PWMuZ2V0UmVjdCh4KTtoLnNob3dNZW51KCh0LngrdC53LWkpLHQueS1pLHQueCk7ei5sYXN0TWVudT1oO2MuYWRkQ2xhc3MoYy5nZXQoaC5pZCkuZmlyc3RDaGlsZCxtKyJJdGVtQWN0aXZlIil9fX0pfXoub25TaG93TWVudS5kaXNwYXRjaCh6KTtpZihBLmtleWJvYXJkX2ZvY3VzKXthLmFkZChvLCJrZXlkb3duIix6Ll9rZXlIYW5kbGVyLHopO2Muc2VsZWN0KCJhIiwibWVudV8iK3ouaWQpWzBdLmZvY3VzKCk7ei5fZm9jdXNJZHg9MH19LGhpZGVNZW51OmZ1bmN0aW9uKGope3ZhciBnPXRoaXMsaT1jLmdldCgibWVudV8iK2cuaWQpLGg7aWYoIWcuaXNNZW51VmlzaWJsZSl7cmV0dXJufWEucmVtb3ZlKGksIm1vdXNlb3ZlciIsZy5tb3VzZU92ZXJGdW5jKTthLnJlbW92ZShpLCJjbGljayIsZy5tb3VzZUNsaWNrRnVuYyk7YS5yZW1vdmUoaSwia2V5ZG93biIsZy5fa2V5SGFuZGxlcik7Yy5oaWRlKGkpO2cuaXNNZW51VmlzaWJsZT0wO2lmKCFqKXtnLmNvbGxhcHNlKDEpfWlmKGcuZWxlbWVudCl7Zy5lbGVtZW50LmhpZGUoKX1pZihoPWMuZ2V0KGcuaWQpKXtjLnJlbW92ZUNsYXNzKGguZmlyc3RDaGlsZCxnLmNsYXNzUHJlZml4KyJJdGVtQWN0aXZlIil9Zy5vbkhpZGVNZW51LmRpc3BhdGNoKGcpfSxhZGQ6ZnVuY3Rpb24oaSl7dmFyIGc9dGhpcyxoO2k9Zy5wYXJlbnQoaSk7aWYoZy5pc1JlbmRlcmVkJiYoaD1jLmdldCgibWVudV8iK2cuaWQpKSl7Zy5fYWRkKGMuc2VsZWN0KCJ0Ym9keSIsaClbMF0saSl9cmV0dXJuIGl9LGNvbGxhcHNlOmZ1bmN0aW9uKGcpe3RoaXMucGFyZW50KGcpO3RoaXMuaGlkZU1lbnUoMSl9LHJlbW92ZTpmdW5jdGlvbihnKXtjLnJlbW92ZShnLmlkKTt0aGlzLmRlc3Ryb3koKTtyZXR1cm4gdGhpcy5wYXJlbnQoZyl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGg9Yy5nZXQoIm1lbnVfIitnLmlkKTthLnJlbW92ZShoLCJtb3VzZW92ZXIiLGcubW91c2VPdmVyRnVuYyk7YS5yZW1vdmUoaCwiY2xpY2siLGcubW91c2VDbGlja0Z1bmMpO2lmKGcuZWxlbWVudCl7Zy5lbGVtZW50LnJlbW92ZSgpfWMucmVtb3ZlKGgpfSxyZW5kZXJOb2RlOmZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxqPWkuc2V0dGluZ3MsbCxoLGssZztnPWMuY3JlYXRlKCJkaXYiLHtpZDoibWVudV8iK2kuaWQsImNsYXNzIjpqWyJjbGFzcyJdLHN0eWxlOiJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7ei1pbmRleDoyMDAwMDAifSk7az1jLmFkZChnLCJkaXYiLHtpZDoibWVudV8iK2kuaWQrIl9jbyIsImNsYXNzIjppLmNsYXNzUHJlZml4KyhqWyJjbGFzcyJdPyIgIitqWyJjbGFzcyJdOiIiKX0pO2kuZWxlbWVudD1uZXcgYigibWVudV8iK2kuaWQse2Jsb2NrZXI6MSxjb250YWluZXI6ai5jb250YWluZXJ9KTtpZihqLm1lbnVfbGluZSl7Yy5hZGQoaywic3BhbiIseyJjbGFzcyI6aS5jbGFzc1ByZWZpeCsiTGluZSJ9KX1sPWMuYWRkKGssInRhYmxlIix7aWQ6Im1lbnVfIitpLmlkKyJfdGJsIixib3JkZXI6MCxjZWxsUGFkZGluZzowLGNlbGxTcGFjaW5nOjB9KTtoPWMuYWRkKGwsInRib2R5Iik7ZihpLml0ZW1zLGZ1bmN0aW9uKG0pe2kuX2FkZChoLG0pfSk7aS5yZW5kZXJlZD10cnVlO3JldHVybiBnfSxfa2V5SGFuZGxlcjpmdW5jdGlvbihqKXt2YXIgaT10aGlzLGg9ai5rZXlDb2RlO2Z1bmN0aW9uIGcobSl7dmFyIGs9aS5fZm9jdXNJZHgrbSxsPWMuc2VsZWN0KCJhIiwibWVudV8iK2kuaWQpW2tdO2lmKGwpe2kuX2ZvY3VzSWR4PWs7bC5mb2N1cygpfX1zd2l0Y2goaCl7Y2FzZSAzODpnKC0xKTtyZXR1cm47Y2FzZSA0MDpnKDEpO3JldHVybjtjYXNlIDEzOnJldHVybjtjYXNlIDI3OnJldHVybiB0aGlzLmhpZGVNZW51KCl9fSxfYWRkOmZ1bmN0aW9uKGosaCl7dmFyIGkscT1oLnNldHRpbmdzLHAsbCxrLG09dGhpcy5jbGFzc1ByZWZpeCxnO2lmKHEuc2VwYXJhdG9yKXtsPWMuYWRkKGosInRyIix7aWQ6aC5pZCwiY2xhc3MiOm0rIkl0ZW1TZXBhcmF0b3IifSk7Yy5hZGQobCwidGQiLHsiY2xhc3MiOm0rIkl0ZW1TZXBhcmF0b3IifSk7aWYoaT1sLnByZXZpb3VzU2libGluZyl7Yy5hZGRDbGFzcyhpLCJtY2VMYXN0Iil9cmV0dXJufWk9bD1jLmFkZChqLCJ0ciIse2lkOmguaWQsImNsYXNzIjptKyJJdGVtICIrbSsiSXRlbUVuYWJsZWQifSk7aT1rPWMuYWRkKGksInRkIik7aT1wPWMuYWRkKGksImEiLHtocmVmOiJqYXZhc2NyaXB0OjsiLG9uY2xpY2s6InJldHVybiBmYWxzZTsiLG9ubW91c2Vkb3duOiJyZXR1cm4gZmFsc2U7In0pO2MuYWRkQ2xhc3MoayxxWyJjbGFzcyJdKTtnPWMuYWRkKGksInNwYW4iLHsiY2xhc3MiOiJtY2VJY29uIisocS5pY29uPyIgbWNlXyIrcS5pY29uOiIiKX0pO2lmKHEuaWNvbl9zcmMpe2MuYWRkKGcsImltZyIse3NyYzpxLmljb25fc3JjfSl9aT1jLmFkZChpLHEuZWxlbWVudHx8InNwYW4iLHsiY2xhc3MiOiJtY2VUZXh0Iix0aXRsZTpoLnNldHRpbmdzLnRpdGxlfSxoLnNldHRpbmdzLnRpdGxlKTtpZihoLnNldHRpbmdzLnN0eWxlKXtjLnNldEF0dHJpYihpLCJzdHlsZSIsaC5zZXR0aW5ncy5zdHlsZSl9aWYoai5jaGlsZE5vZGVzLmxlbmd0aD09MSl7Yy5hZGRDbGFzcyhsLCJtY2VGaXJzdCIpfWlmKChpPWwucHJldmlvdXNTaWJsaW5nKSYmYy5oYXNDbGFzcyhpLG0rIkl0ZW1TZXBhcmF0b3IiKSl7Yy5hZGRDbGFzcyhsLCJtY2VGaXJzdCIpfWlmKGguY29sbGFwc2Upe2MuYWRkQ2xhc3MobCxtKyJJdGVtU3ViIil9aWYoaT1sLnByZXZpb3VzU2libGluZyl7Yy5yZW1vdmVDbGFzcyhpLCJtY2VMYXN0Iil9Yy5hZGRDbGFzcyhsLCJtY2VMYXN0Iil9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYil7dmFyIGE9Yi5ET007Yi5jcmVhdGUoInRpbnltY2UudWkuQnV0dG9uOnRpbnltY2UudWkuQ29udHJvbCIse0J1dHRvbjpmdW5jdGlvbihkLGMpe3RoaXMucGFyZW50KGQsYyk7dGhpcy5jbGFzc1ByZWZpeD0ibWNlQnV0dG9uIn0scmVuZGVySFRNTDpmdW5jdGlvbigpe3ZhciBmPXRoaXMuY2xhc3NQcmVmaXgsZT10aGlzLnNldHRpbmdzLGQsYztjPWEuZW5jb2RlKGUubGFiZWx8fCIiKTtkPSc8YSBpZD0iJyt0aGlzLmlkKyciIGhyZWY9ImphdmFzY3JpcHQ6OyIgY2xhc3M9IicrZisiICIrZisiRW5hYmxlZCAiK2VbImNsYXNzIl0rKGM/IiAiK2YrIkxhYmVsZWQiOiIiKSsnIiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyIgb25jbGljaz0icmV0dXJuIGZhbHNlOyIgdGl0bGU9IicrYS5lbmNvZGUoZS50aXRsZSkrJyI+JztpZihlLmltYWdlKXtkKz0nPGltZyBjbGFzcz0ibWNlSWNvbiIgc3JjPSInK2UuaW1hZ2UrJyIgLz4nK2MrIjwvYT4ifWVsc2V7ZCs9JzxzcGFuIGNsYXNzPSJtY2VJY29uICcrZVsiY2xhc3MiXSsnIj48L3NwYW4+JysoYz8nPHNwYW4gY2xhc3M9IicrZisnTGFiZWwiPicrYysiPC9zcGFuPiI6IiIpKyI8L2E+In1yZXR1cm4gZH0scG9zdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBjPXRoaXMsZD1jLnNldHRpbmdzO2IuZG9tLkV2ZW50LmFkZChjLmlkLCJjbGljayIsZnVuY3Rpb24oZil7aWYoIWMuaXNEaXNhYmxlZCgpKXtyZXR1cm4gZC5vbmNsaWNrLmNhbGwoZC5zY29wZSxmKX19KX19KX0pKHRpbnltY2UpOyhmdW5jdGlvbihkKXt2YXIgYz1kLkRPTSxiPWQuZG9tLkV2ZW50LGU9ZC5lYWNoLGE9ZC51dGlsLkRpc3BhdGNoZXI7ZC5jcmVhdGUoInRpbnltY2UudWkuTGlzdEJveDp0aW55bWNlLnVpLkNvbnRyb2wiLHtMaXN0Qm94OmZ1bmN0aW9uKGgsZyl7dmFyIGY9dGhpcztmLnBhcmVudChoLGcpO2YuaXRlbXM9W107Zi5vbkNoYW5nZT1uZXcgYShmKTtmLm9uUG9zdFJlbmRlcj1uZXcgYShmKTtmLm9uQWRkPW5ldyBhKGYpO2Yub25SZW5kZXJNZW51PW5ldyBkLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTtmLmNsYXNzUHJlZml4PSJtY2VMaXN0Qm94In0sc2VsZWN0OmZ1bmN0aW9uKGgpe3ZhciBnPXRoaXMsaixpO2lmKGg9PXVuZGVmaW5lZCl7cmV0dXJuIGcuc2VsZWN0QnlJbmRleCgtMSl9aWYoaCYmaC5jYWxsKXtpPWh9ZWxzZXtpPWZ1bmN0aW9uKGYpe3JldHVybiBmPT1ofX1pZihoIT1nLnNlbGVjdGVkVmFsdWUpe2UoZy5pdGVtcyxmdW5jdGlvbihrLGYpe2lmKGkoay52YWx1ZSkpe2o9MTtnLnNlbGVjdEJ5SW5kZXgoZik7cmV0dXJuIGZhbHNlfX0pO2lmKCFqKXtnLnNlbGVjdEJ5SW5kZXgoLTEpfX19LHNlbGVjdEJ5SW5kZXg6ZnVuY3Rpb24oZil7dmFyIGc9dGhpcyxoLGk7aWYoZiE9Zy5zZWxlY3RlZEluZGV4KXtoPWMuZ2V0KGcuaWQrIl90ZXh0Iik7aT1nLml0ZW1zW2ZdO2lmKGkpe2cuc2VsZWN0ZWRWYWx1ZT1pLnZhbHVlO2cuc2VsZWN0ZWRJbmRleD1mO2Muc2V0SFRNTChoLGMuZW5jb2RlKGkudGl0bGUpKTtjLnJlbW92ZUNsYXNzKGgsIm1jZVRpdGxlIil9ZWxzZXtjLnNldEhUTUwoaCxjLmVuY29kZShnLnNldHRpbmdzLnRpdGxlKSk7Yy5hZGRDbGFzcyhoLCJtY2VUaXRsZSIpO2cuc2VsZWN0ZWRWYWx1ZT1nLnNlbGVjdGVkSW5kZXg9bnVsbH1oPTB9fSxhZGQ6ZnVuY3Rpb24oaSxmLGgpe3ZhciBnPXRoaXM7aD1ofHx7fTtoPWQuZXh0ZW5kKGgse3RpdGxlOmksdmFsdWU6Zn0pO2cuaXRlbXMucHVzaChoKTtnLm9uQWRkLmRpc3BhdGNoKGcsaCl9LGdldExlbmd0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZW1zLmxlbmd0aH0scmVuZGVySFRNTDpmdW5jdGlvbigpe3ZhciBpPSIiLGY9dGhpcyxnPWYuc2V0dGluZ3Msaj1mLmNsYXNzUHJlZml4O2k9Jzx0YWJsZSBpZD0iJytmLmlkKyciIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9IicraisiICIraisiRW5hYmxlZCIrKGdbImNsYXNzIl0/KCIgIitnWyJjbGFzcyJdKToiIikrJyI+PHRib2R5Pjx0cj4nO2krPSI8dGQ+IitjLmNyZWF0ZUhUTUwoImEiLHtpZDpmLmlkKyJfdGV4dCIsaHJlZjoiamF2YXNjcmlwdDo7IiwiY2xhc3MiOiJtY2VUZXh0IixvbmNsaWNrOiJyZXR1cm4gZmFsc2U7Iixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyJ9LGMuZW5jb2RlKGYuc2V0dGluZ3MudGl0bGUpKSsiPC90ZD4iO2krPSI8dGQ+IitjLmNyZWF0ZUhUTUwoImEiLHtpZDpmLmlkKyJfb3BlbiIsdGFiaW5kZXg6LTEsaHJlZjoiamF2YXNjcmlwdDo7IiwiY2xhc3MiOiJtY2VPcGVuIixvbmNsaWNrOiJyZXR1cm4gZmFsc2U7Iixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyJ9LCI8c3Bhbj48L3NwYW4+IikrIjwvdGQ+IjtpKz0iPC90cj48L3Rib2R5PjwvdGFibGU+IjtyZXR1cm4gaX0sc2hvd01lbnU6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGosaSxoPWMuZ2V0KHRoaXMuaWQpLGY7aWYoZy5pc0Rpc2FibGVkKCl8fGcuaXRlbXMubGVuZ3RoPT0wKXtyZXR1cm59aWYoZy5tZW51JiZnLm1lbnUuaXNNZW51VmlzaWJsZSl7cmV0dXJuIGcuaGlkZU1lbnUoKX1pZighZy5pc01lbnVSZW5kZXJlZCl7Zy5yZW5kZXJNZW51KCk7Zy5pc01lbnVSZW5kZXJlZD10cnVlfWo9Yy5nZXRQb3ModGhpcy5zZXR0aW5ncy5tZW51X2NvbnRhaW5lcik7aT1jLmdldFBvcyhoKTtmPWcubWVudTtmLnNldHRpbmdzLm9mZnNldF94PWkueDtmLnNldHRpbmdzLm9mZnNldF95PWkueTtmLnNldHRpbmdzLmtleWJvYXJkX2ZvY3VzPSFkLmlzT3BlcmE7aWYoZy5vbGRJRCl7Zi5pdGVtc1tnLm9sZElEXS5zZXRTZWxlY3RlZCgwKX1lKGcuaXRlbXMsZnVuY3Rpb24oayl7aWYoay52YWx1ZT09PWcuc2VsZWN0ZWRWYWx1ZSl7Zi5pdGVtc1trLmlkXS5zZXRTZWxlY3RlZCgxKTtnLm9sZElEPWsuaWR9fSk7Zi5zaG93TWVudSgwLGguY2xpZW50SGVpZ2h0KTtiLmFkZChjLmRvYywibW91c2Vkb3duIixnLmhpZGVNZW51LGcpO2MuYWRkQ2xhc3MoZy5pZCxnLmNsYXNzUHJlZml4KyJTZWxlY3RlZCIpfSxoaWRlTWVudTpmdW5jdGlvbihnKXt2YXIgZj10aGlzO2lmKGYubWVudSYmZi5tZW51LmlzTWVudVZpc2libGUpe2lmKGcmJmcudHlwZT09Im1vdXNlZG93biImJihnLnRhcmdldC5pZD09Zi5pZCsiX3RleHQifHxnLnRhcmdldC5pZD09Zi5pZCsiX29wZW4iKSl7cmV0dXJufWlmKCFnfHwhYy5nZXRQYXJlbnQoZy50YXJnZXQsIi5tY2VNZW51Iikpe2MucmVtb3ZlQ2xhc3MoZi5pZCxmLmNsYXNzUHJlZml4KyJTZWxlY3RlZCIpO2IucmVtb3ZlKGMuZG9jLCJtb3VzZWRvd24iLGYuaGlkZU1lbnUsZik7Zi5tZW51LmhpZGVNZW51KCl9fX0scmVuZGVyTWVudTpmdW5jdGlvbigpe3ZhciBnPXRoaXMsZjtmPWcuc2V0dGluZ3MuY29udHJvbF9tYW5hZ2VyLmNyZWF0ZURyb3BNZW51KGcuaWQrIl9tZW51Iix7bWVudV9saW5lOjEsImNsYXNzIjpnLmNsYXNzUHJlZml4KyJNZW51IG1jZU5vSWNvbnMiLG1heF93aWR0aDoxNTAsbWF4X2hlaWdodDoxNTB9KTtmLm9uSGlkZU1lbnUuYWRkKGcuaGlkZU1lbnUsZyk7Zi5hZGQoe3RpdGxlOmcuc2V0dGluZ3MudGl0bGUsImNsYXNzIjoibWNlTWVudUl0ZW1UaXRsZSIsb25jbGljazpmdW5jdGlvbigpe2lmKGcuc2V0dGluZ3Mub25zZWxlY3QoIiIpIT09ZmFsc2Upe2cuc2VsZWN0KCIiKX19fSk7ZShnLml0ZW1zLGZ1bmN0aW9uKGgpe2lmKGgudmFsdWU9PT11bmRlZmluZWQpe2YuYWRkKHt0aXRsZTpoLnRpdGxlLCJjbGFzcyI6Im1jZU1lbnVJdGVtVGl0bGUiLG9uY2xpY2s6ZnVuY3Rpb24oKXtpZihnLnNldHRpbmdzLm9uc2VsZWN0KCIiKSE9PWZhbHNlKXtnLnNlbGVjdCgiIil9fX0pfWVsc2V7aC5pZD1jLnVuaXF1ZUlkKCk7aC5vbmNsaWNrPWZ1bmN0aW9uKCl7aWYoZy5zZXR0aW5ncy5vbnNlbGVjdChoLnZhbHVlKSE9PWZhbHNlKXtnLnNlbGVjdChoLnZhbHVlKX19O2YuYWRkKGgpfX0pO2cub25SZW5kZXJNZW51LmRpc3BhdGNoKGcsZik7Zy5tZW51PWZ9LHBvc3RSZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZj10aGlzLGc9Zi5jbGFzc1ByZWZpeDtiLmFkZChmLmlkLCJjbGljayIsZi5zaG93TWVudSxmKTtiLmFkZChmLmlkKyJfdGV4dCIsImZvY3VzIixmdW5jdGlvbigpe2lmKCFmLl9mb2N1c2VkKXtmLmtleURvd25IYW5kbGVyPWIuYWRkKGYuaWQrIl90ZXh0Iiwia2V5ZG93biIsZnVuY3Rpb24oayl7dmFyIGg9LTEsaSxqPWsua2V5Q29kZTtlKGYuaXRlbXMsZnVuY3Rpb24obCxtKXtpZihmLnNlbGVjdGVkVmFsdWU9PWwudmFsdWUpe2g9bX19KTtpZihqPT0zOCl7aT1mLml0ZW1zW2gtMV19ZWxzZXtpZihqPT00MCl7aT1mLml0ZW1zW2grMV19ZWxzZXtpZihqPT0xMyl7aT1mLnNlbGVjdGVkVmFsdWU7Zi5zZWxlY3RlZFZhbHVlPW51bGw7Zi5zZXR0aW5ncy5vbnNlbGVjdChpKTtyZXR1cm4gYi5jYW5jZWwoayl9fX1pZihpKXtmLmhpZGVNZW51KCk7Zi5zZWxlY3QoaS52YWx1ZSl9fSl9Zi5fZm9jdXNlZD0xfSk7Yi5hZGQoZi5pZCsiX3RleHQiLCJibHVyIixmdW5jdGlvbigpe2IucmVtb3ZlKGYuaWQrIl90ZXh0Iiwia2V5ZG93biIsZi5rZXlEb3duSGFuZGxlcik7Zi5fZm9jdXNlZD0wfSk7aWYoZC5pc0lFNnx8IWMuYm94TW9kZWwpe2IuYWRkKGYuaWQsIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXtpZighYy5oYXNDbGFzcyhmLmlkLGcrIkRpc2FibGVkIikpe2MuYWRkQ2xhc3MoZi5pZCxnKyJIb3ZlciIpfX0pO2IuYWRkKGYuaWQsIm1vdXNlb3V0IixmdW5jdGlvbigpe2lmKCFjLmhhc0NsYXNzKGYuaWQsZysiRGlzYWJsZWQiKSl7Yy5yZW1vdmVDbGFzcyhmLmlkLGcrIkhvdmVyIil9fSl9Zi5vblBvc3RSZW5kZXIuZGlzcGF0Y2goZixjLmdldChmLmlkKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnBhcmVudCgpO2IuY2xlYXIodGhpcy5pZCsiX3RleHQiKTtiLmNsZWFyKHRoaXMuaWQrIl9vcGVuIil9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oZCl7dmFyIGM9ZC5ET00sYj1kLmRvbS5FdmVudCxlPWQuZWFjaCxhPWQudXRpbC5EaXNwYXRjaGVyO2QuY3JlYXRlKCJ0aW55bWNlLnVpLk5hdGl2ZUxpc3RCb3g6dGlueW1jZS51aS5MaXN0Qm94Iix7TmF0aXZlTGlzdEJveDpmdW5jdGlvbihnLGYpe3RoaXMucGFyZW50KGcsZik7dGhpcy5jbGFzc1ByZWZpeD0ibWNlTmF0aXZlTGlzdEJveCJ9LHNldERpc2FibGVkOmZ1bmN0aW9uKGYpe2MuZ2V0KHRoaXMuaWQpLmRpc2FibGVkPWZ9LGlzRGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5nZXQodGhpcy5pZCkuZGlzYWJsZWR9LHNlbGVjdDpmdW5jdGlvbihoKXt2YXIgZz10aGlzLGosaTtpZihoPT11bmRlZmluZWQpe3JldHVybiBnLnNlbGVjdEJ5SW5kZXgoLTEpfWlmKGgmJmguY2FsbCl7aT1ofWVsc2V7aT1mdW5jdGlvbihmKXtyZXR1cm4gZj09aH19aWYoaCE9Zy5zZWxlY3RlZFZhbHVlKXtlKGcuaXRlbXMsZnVuY3Rpb24oayxmKXtpZihpKGsudmFsdWUpKXtqPTE7Zy5zZWxlY3RCeUluZGV4KGYpO3JldHVybiBmYWxzZX19KTtpZighail7Zy5zZWxlY3RCeUluZGV4KC0xKX19fSxzZWxlY3RCeUluZGV4OmZ1bmN0aW9uKGYpe2MuZ2V0KHRoaXMuaWQpLnNlbGVjdGVkSW5kZXg9ZisxO3RoaXMuc2VsZWN0ZWRWYWx1ZT10aGlzLml0ZW1zW2ZdP3RoaXMuaXRlbXNbZl0udmFsdWU6bnVsbH0sYWRkOmZ1bmN0aW9uKGosZyxmKXt2YXIgaSxoPXRoaXM7Zj1mfHx7fTtmLnZhbHVlPWc7aWYoaC5pc1JlbmRlcmVkKCkpe2MuYWRkKGMuZ2V0KHRoaXMuaWQpLCJvcHRpb24iLGYsail9aT17dGl0bGU6aix2YWx1ZTpnLGF0dHJpYnM6Zn07aC5pdGVtcy5wdXNoKGkpO2gub25BZGQuZGlzcGF0Y2goaCxpKX0sZ2V0TGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RofSxyZW5kZXJIVE1MOmZ1bmN0aW9uKCl7dmFyIGcsZj10aGlzO2c9Yy5jcmVhdGVIVE1MKCJvcHRpb24iLHt2YWx1ZToiIn0sIi0tICIrZi5zZXR0aW5ncy50aXRsZSsiIC0tIik7ZShmLml0ZW1zLGZ1bmN0aW9uKGgpe2crPWMuY3JlYXRlSFRNTCgib3B0aW9uIix7dmFsdWU6aC52YWx1ZX0saC50aXRsZSl9KTtnPWMuY3JlYXRlSFRNTCgic2VsZWN0Iix7aWQ6Zi5pZCwiY2xhc3MiOiJtY2VOYXRpdmVMaXN0Qm94In0sZyk7cmV0dXJuIGd9LHBvc3RSZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGg7Zy5yZW5kZXJlZD10cnVlO2Z1bmN0aW9uIGYoail7dmFyIGk9Zy5pdGVtc1tqLnRhcmdldC5zZWxlY3RlZEluZGV4LTFdO2lmKGkmJihpPWkudmFsdWUpKXtnLm9uQ2hhbmdlLmRpc3BhdGNoKGcsaSk7aWYoZy5zZXR0aW5ncy5vbnNlbGVjdCl7Zy5zZXR0aW5ncy5vbnNlbGVjdChpKX19fWIuYWRkKGcuaWQsImNoYW5nZSIsZik7Yi5hZGQoZy5pZCwia2V5ZG93biIsZnVuY3Rpb24oail7dmFyIGk7Yi5yZW1vdmUoZy5pZCwiY2hhbmdlIixoKTtpPWIuYWRkKGcuaWQsImJsdXIiLGZ1bmN0aW9uKCl7Yi5hZGQoZy5pZCwiY2hhbmdlIixmKTtiLnJlbW92ZShnLmlkLCJibHVyIixpKX0pO2lmKGoua2V5Q29kZT09MTN8fGoua2V5Q29kZT09MzIpe2Yoaik7cmV0dXJuIGIuY2FuY2VsKGopfX0pO2cub25Qb3N0UmVuZGVyLmRpc3BhdGNoKGcsYy5nZXQoZy5pZCkpfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGMpe3ZhciBiPWMuRE9NLGE9Yy5kb20uRXZlbnQsZD1jLmVhY2g7Yy5jcmVhdGUoInRpbnltY2UudWkuTWVudUJ1dHRvbjp0aW55bWNlLnVpLkJ1dHRvbiIse01lbnVCdXR0b246ZnVuY3Rpb24oZixlKXt0aGlzLnBhcmVudChmLGUpO3RoaXMub25SZW5kZXJNZW51PW5ldyBjLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTtlLm1lbnVfY29udGFpbmVyPWUubWVudV9jb250YWluZXJ8fGIuZG9jLmJvZHl9LHNob3dNZW51OmZ1bmN0aW9uKCl7dmFyIGc9dGhpcyxqLGksaD1iLmdldChnLmlkKSxmO2lmKGcuaXNEaXNhYmxlZCgpKXtyZXR1cm59aWYoIWcuaXNNZW51UmVuZGVyZWQpe2cucmVuZGVyTWVudSgpO2cuaXNNZW51UmVuZGVyZWQ9dHJ1ZX1pZihnLmlzTWVudVZpc2libGUpe3JldHVybiBnLmhpZGVNZW51KCl9aj1iLmdldFBvcyhnLnNldHRpbmdzLm1lbnVfY29udGFpbmVyKTtpPWIuZ2V0UG9zKGgpO2Y9Zy5tZW51O2Yuc2V0dGluZ3Mub2Zmc2V0X3g9aS54O2Yuc2V0dGluZ3Mub2Zmc2V0X3k9aS55O2Yuc2V0dGluZ3MudnBfb2Zmc2V0X3g9aS54O2Yuc2V0dGluZ3MudnBfb2Zmc2V0X3k9aS55O2Yuc2V0dGluZ3Mua2V5Ym9hcmRfZm9jdXM9Zy5fZm9jdXNlZDtmLnNob3dNZW51KDAsaC5jbGllbnRIZWlnaHQpO2EuYWRkKGIuZG9jLCJtb3VzZWRvd24iLGcuaGlkZU1lbnUsZyk7Zy5zZXRTdGF0ZSgiU2VsZWN0ZWQiLDEpO2cuaXNNZW51VmlzaWJsZT0xfSxyZW5kZXJNZW51OmZ1bmN0aW9uKCl7dmFyIGY9dGhpcyxlO2U9Zi5zZXR0aW5ncy5jb250cm9sX21hbmFnZXIuY3JlYXRlRHJvcE1lbnUoZi5pZCsiX21lbnUiLHttZW51X2xpbmU6MSwiY2xhc3MiOnRoaXMuY2xhc3NQcmVmaXgrIk1lbnUiLGljb25zOmYuc2V0dGluZ3MuaWNvbnN9KTtlLm9uSGlkZU1lbnUuYWRkKGYuaGlkZU1lbnUsZik7Zi5vblJlbmRlck1lbnUuZGlzcGF0Y2goZixlKTtmLm1lbnU9ZX0saGlkZU1lbnU6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcztpZihnJiZnLnR5cGU9PSJtb3VzZWRvd24iJiZiLmdldFBhcmVudChnLnRhcmdldCxmdW5jdGlvbihoKXtyZXR1cm4gaC5pZD09PWYuaWR8fGguaWQ9PT1mLmlkKyJfb3BlbiJ9KSl7cmV0dXJufWlmKCFnfHwhYi5nZXRQYXJlbnQoZy50YXJnZXQsIi5tY2VNZW51Iikpe2Yuc2V0U3RhdGUoIlNlbGVjdGVkIiwwKTthLnJlbW92ZShiLmRvYywibW91c2Vkb3duIixmLmhpZGVNZW51LGYpO2lmKGYubWVudSl7Zi5tZW51LmhpZGVNZW51KCl9fWYuaXNNZW51VmlzaWJsZT0wfSxwb3N0UmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxmPWUuc2V0dGluZ3M7YS5hZGQoZS5pZCwiY2xpY2siLGZ1bmN0aW9uKCl7aWYoIWUuaXNEaXNhYmxlZCgpKXtpZihmLm9uY2xpY2spe2Yub25jbGljayhlLnZhbHVlKX1lLnNob3dNZW51KCl9fSl9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYyl7dmFyIGI9Yy5ET00sYT1jLmRvbS5FdmVudCxkPWMuZWFjaDtjLmNyZWF0ZSgidGlueW1jZS51aS5TcGxpdEJ1dHRvbjp0aW55bWNlLnVpLk1lbnVCdXR0b24iLHtTcGxpdEJ1dHRvbjpmdW5jdGlvbihmLGUpe3RoaXMucGFyZW50KGYsZSk7dGhpcy5jbGFzc1ByZWZpeD0ibWNlU3BsaXRCdXR0b24ifSxyZW5kZXJIVE1MOmZ1bmN0aW9uKCl7dmFyIGksZj10aGlzLGc9Zi5zZXR0aW5ncyxlO2k9Ijx0Ym9keT48dHI+IjtpZihnLmltYWdlKXtlPWIuY3JlYXRlSFRNTCgiaW1nICIse3NyYzpnLmltYWdlLCJjbGFzcyI6Im1jZUFjdGlvbiAiK2dbImNsYXNzIl19KX1lbHNle2U9Yi5jcmVhdGVIVE1MKCJzcGFuIix7ImNsYXNzIjoibWNlQWN0aW9uICIrZ1siY2xhc3MiXX0sIiIpfWkrPSI8dGQ+IitiLmNyZWF0ZUhUTUwoImEiLHtpZDpmLmlkKyJfYWN0aW9uIixocmVmOiJqYXZhc2NyaXB0OjsiLCJjbGFzcyI6Im1jZUFjdGlvbiAiK2dbImNsYXNzIl0sb25jbGljazoicmV0dXJuIGZhbHNlOyIsb25tb3VzZWRvd246InJldHVybiBmYWxzZTsiLHRpdGxlOmcudGl0bGV9LGUpKyI8L3RkPiI7ZT1iLmNyZWF0ZUhUTUwoInNwYW4iLHsiY2xhc3MiOiJtY2VPcGVuICIrZ1siY2xhc3MiXX0pO2krPSI8dGQ+IitiLmNyZWF0ZUhUTUwoImEiLHtpZDpmLmlkKyJfb3BlbiIsaHJlZjoiamF2YXNjcmlwdDo7IiwiY2xhc3MiOiJtY2VPcGVuICIrZ1siY2xhc3MiXSxvbmNsaWNrOiJyZXR1cm4gZmFsc2U7Iixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyIsdGl0bGU6Zy50aXRsZX0sZSkrIjwvdGQ+IjtpKz0iPC90cj48L3Rib2R5PiI7cmV0dXJuIGIuY3JlYXRlSFRNTCgidGFibGUiLHtpZDpmLmlkLCJjbGFzcyI6Im1jZVNwbGl0QnV0dG9uIG1jZVNwbGl0QnV0dG9uRW5hYmxlZCAiK2dbImNsYXNzIl0sY2VsbHBhZGRpbmc6IjAiLGNlbGxzcGFjaW5nOiIwIixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyIsdGl0bGU6Zy50aXRsZX0saSl9LHBvc3RSZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGY9ZS5zZXR0aW5ncztpZihmLm9uY2xpY2spe2EuYWRkKGUuaWQrIl9hY3Rpb24iLCJjbGljayIsZnVuY3Rpb24oKXtpZighZS5pc0Rpc2FibGVkKCkpe2Yub25jbGljayhlLnZhbHVlKX19KX1hLmFkZChlLmlkKyJfb3BlbiIsImNsaWNrIixlLnNob3dNZW51LGUpO2EuYWRkKGUuaWQrIl9vcGVuIiwiZm9jdXMiLGZ1bmN0aW9uKCl7ZS5fZm9jdXNlZD0xfSk7YS5hZGQoZS5pZCsiX29wZW4iLCJibHVyIixmdW5jdGlvbigpe2UuX2ZvY3VzZWQ9MH0pO2lmKGMuaXNJRTZ8fCFiLmJveE1vZGVsKXthLmFkZChlLmlkLCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7aWYoIWIuaGFzQ2xhc3MoZS5pZCwibWNlU3BsaXRCdXR0b25EaXNhYmxlZCIpKXtiLmFkZENsYXNzKGUuaWQsIm1jZVNwbGl0QnV0dG9uSG92ZXIiKX19KTthLmFkZChlLmlkLCJtb3VzZW91dCIsZnVuY3Rpb24oKXtpZighYi5oYXNDbGFzcyhlLmlkLCJtY2VTcGxpdEJ1dHRvbkRpc2FibGVkIikpe2IucmVtb3ZlQ2xhc3MoZS5pZCwibWNlU3BsaXRCdXR0b25Ib3ZlciIpfX0pfX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMucGFyZW50KCk7YS5jbGVhcih0aGlzLmlkKyJfYWN0aW9uIik7YS5jbGVhcih0aGlzLmlkKyJfb3BlbiIpfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGQpe3ZhciBjPWQuRE9NLGE9ZC5kb20uRXZlbnQsYj1kLmlzLGU9ZC5lYWNoO2QuY3JlYXRlKCJ0aW55bWNlLnVpLkNvbG9yU3BsaXRCdXR0b246dGlueW1jZS51aS5TcGxpdEJ1dHRvbiIse0NvbG9yU3BsaXRCdXR0b246ZnVuY3Rpb24oaCxnKXt2YXIgZj10aGlzO2YucGFyZW50KGgsZyk7Zi5zZXR0aW5ncz1nPWQuZXh0ZW5kKHtjb2xvcnM6IjAwMDAwMCw5OTMzMDAsMzMzMzAwLDAwMzMwMCwwMDMzNjYsMDAwMDgwLDMzMzM5OSwzMzMzMzMsODAwMDAwLEZGNjYwMCw4MDgwMDAsMDA4MDAwLDAwODA4MCwwMDAwRkYsNjY2Njk5LDgwODA4MCxGRjAwMDAsRkY5OTAwLDk5Q0MwMCwzMzk5NjYsMzNDQ0NDLDMzNjZGRiw4MDAwODAsOTk5OTk5LEZGMDBGRixGRkNDMDAsRkZGRjAwLDAwRkYwMCwwMEZGRkYsMDBDQ0ZGLDk5MzM2NixDMEMwQzAsRkY5OUNDLEZGQ0M5OSxGRkZGOTksQ0NGRkNDLENDRkZGRiw5OUNDRkYsQ0M5OUZGLEZGRkZGRiIsZ3JpZF93aWR0aDo4LGRlZmF1bHRfY29sb3I6IiM4ODg4ODgifSxmLnNldHRpbmdzKTtmLm9uU2hvd01lbnU9bmV3IGQudXRpbC5EaXNwYXRjaGVyKGYpO2Yub25IaWRlTWVudT1uZXcgZC51dGlsLkRpc3BhdGNoZXIoZik7Zi52YWx1ZT1nLmRlZmF1bHRfY29sb3J9LHNob3dNZW51OmZ1bmN0aW9uKCl7dmFyIGY9dGhpcyxnLGosaSxoO2lmKGYuaXNEaXNhYmxlZCgpKXtyZXR1cm59aWYoIWYuaXNNZW51UmVuZGVyZWQpe2YucmVuZGVyTWVudSgpO2YuaXNNZW51UmVuZGVyZWQ9dHJ1ZX1pZihmLmlzTWVudVZpc2libGUpe3JldHVybiBmLmhpZGVNZW51KCl9aT1jLmdldChmLmlkKTtjLnNob3coZi5pZCsiX21lbnUiKTtjLmFkZENsYXNzKGksIm1jZVNwbGl0QnV0dG9uU2VsZWN0ZWQiKTtoPWMuZ2V0UG9zKGkpO2Muc2V0U3R5bGVzKGYuaWQrIl9tZW51Iix7bGVmdDpoLngsdG9wOmgueStpLmNsaWVudEhlaWdodCx6SW5kZXg6MjAwMDAwfSk7aT0wO2EuYWRkKGMuZG9jLCJtb3VzZWRvd24iLGYuaGlkZU1lbnUsZik7Zi5vblNob3dNZW51LmRpc3BhdGNoKGYpO2lmKGYuX2ZvY3VzZWQpe2YuX2tleUhhbmRsZXI9YS5hZGQoZi5pZCsiX21lbnUiLCJrZXlkb3duIixmdW5jdGlvbihrKXtpZihrLmtleUNvZGU9PTI3KXtmLmhpZGVNZW51KCl9fSk7Yy5zZWxlY3QoImEiLGYuaWQrIl9tZW51IilbMF0uZm9jdXMoKX1mLmlzTWVudVZpc2libGU9MX0saGlkZU1lbnU6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcztpZihnJiZnLnR5cGU9PSJtb3VzZWRvd24iJiZjLmdldFBhcmVudChnLnRhcmdldCxmdW5jdGlvbihoKXtyZXR1cm4gaC5pZD09PWYuaWQrIl9vcGVuIn0pKXtyZXR1cm59aWYoIWd8fCFjLmdldFBhcmVudChnLnRhcmdldCwiLm1jZVNwbGl0QnV0dG9uTWVudSIpKXtjLnJlbW92ZUNsYXNzKGYuaWQsIm1jZVNwbGl0QnV0dG9uU2VsZWN0ZWQiKTthLnJlbW92ZShjLmRvYywibW91c2Vkb3duIixmLmhpZGVNZW51LGYpO2EucmVtb3ZlKGYuaWQrIl9tZW51Iiwia2V5ZG93biIsZi5fa2V5SGFuZGxlcik7Yy5oaWRlKGYuaWQrIl9tZW51Iil9Zi5vbkhpZGVNZW51LmRpc3BhdGNoKGYpO2YuaXNNZW51VmlzaWJsZT0wfSxyZW5kZXJNZW51OmZ1bmN0aW9uKCl7dmFyIGs9dGhpcyxmLGo9MCxsPWsuc2V0dGluZ3MscCxoLG8sZztnPWMuYWRkKGwubWVudV9jb250YWluZXIsImRpdiIse2lkOmsuaWQrIl9tZW51IiwiY2xhc3MiOmwubWVudV9jbGFzcysiICIrbFsiY2xhc3MiXSxzdHlsZToicG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDotMTAwMHB4OyJ9KTtmPWMuYWRkKGcsImRpdiIseyJjbGFzcyI6bFsiY2xhc3MiXSsiIG1jZVNwbGl0QnV0dG9uTWVudSJ9KTtjLmFkZChmLCJzcGFuIix7ImNsYXNzIjoibWNlTWVudUxpbmUifSk7cD1jLmFkZChmLCJ0YWJsZSIseyJjbGFzcyI6Im1jZUNvbG9yU3BsaXRNZW51In0pO2g9Yy5hZGQocCwidGJvZHkiKTtqPTA7ZShiKGwuY29sb3JzLCJhcnJheSIpP2wuY29sb3JzOmwuY29sb3JzLnNwbGl0KCIsIiksZnVuY3Rpb24oaSl7aT1pLnJlcGxhY2UoL14jLywiIik7aWYoIWotLSl7bz1jLmFkZChoLCJ0ciIpO2o9bC5ncmlkX3dpZHRoLTF9cD1jLmFkZChvLCJ0ZCIpO3A9Yy5hZGQocCwiYSIse2hyZWY6ImphdmFzY3JpcHQ6OyIsc3R5bGU6e2JhY2tncm91bmRDb2xvcjoiIyIraX0sX21jZV9jb2xvcjoiIyIraX0pfSk7aWYobC5tb3JlX2NvbG9yc19mdW5jKXtwPWMuYWRkKGgsInRyIik7cD1jLmFkZChwLCJ0ZCIse2NvbHNwYW46bC5ncmlkX3dpZHRoLCJjbGFzcyI6Im1jZU1vcmVDb2xvcnMifSk7cD1jLmFkZChwLCJhIix7aWQ6ay5pZCsiX21vcmUiLGhyZWY6ImphdmFzY3JpcHQ6OyIsb25jbGljazoicmV0dXJuIGZhbHNlOyIsImNsYXNzIjoibWNlTW9yZUNvbG9ycyJ9LGwubW9yZV9jb2xvcnNfdGl0bGUpO2EuYWRkKHAsImNsaWNrIixmdW5jdGlvbihpKXtsLm1vcmVfY29sb3JzX2Z1bmMuY2FsbChsLm1vcmVfY29sb3JzX3Njb3BlfHx0aGlzKTtyZXR1cm4gYS5jYW5jZWwoaSl9KX1jLmFkZENsYXNzKGYsIm1jZUNvbG9yU3BsaXRNZW51Iik7YS5hZGQoay5pZCsiX21lbnUiLCJjbGljayIsZnVuY3Rpb24oaSl7dmFyIG07aT1pLnRhcmdldDtpZihpLm5vZGVOYW1lPT0iQSImJihtPWkuZ2V0QXR0cmlidXRlKCJfbWNlX2NvbG9yIikpKXtrLnNldENvbG9yKG0pfXJldHVybiBhLmNhbmNlbChpKX0pO3JldHVybiBnfSxzZXRDb2xvcjpmdW5jdGlvbihnKXt2YXIgZj10aGlzO2Muc2V0U3R5bGUoZi5pZCsiX3ByZXZpZXciLCJiYWNrZ3JvdW5kQ29sb3IiLGcpO2YudmFsdWU9ZztmLmhpZGVNZW51KCk7Zi5zZXR0aW5ncy5vbnNlbGVjdChnKX0scG9zdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBmPXRoaXMsZz1mLmlkO2YucGFyZW50KCk7Yy5hZGQoZysiX2FjdGlvbiIsImRpdiIse2lkOmcrIl9wcmV2aWV3IiwiY2xhc3MiOiJtY2VDb2xvclByZXZpZXcifSk7Yy5zZXRTdHlsZShmLmlkKyJfcHJldmlldyIsImJhY2tncm91bmRDb2xvciIsZi52YWx1ZSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnBhcmVudCgpO2EuY2xlYXIodGhpcy5pZCsiX21lbnUiKTthLmNsZWFyKHRoaXMuaWQrIl9tb3JlIik7Yy5yZW1vdmUodGhpcy5pZCsiX21lbnUiKX19KX0pKHRpbnltY2UpO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnVpLlRvb2xiYXI6dGlueW1jZS51aS5Db250YWluZXIiLHtyZW5kZXJIVE1MOmZ1bmN0aW9uKCl7dmFyIGw9dGhpcyxlPSIiLGcsaixiPXRpbnltY2UuRE9NLG09bC5zZXR0aW5ncyxkLGEsZixrO2s9bC5jb250cm9scztmb3IoZD0wO2Q8ay5sZW5ndGg7ZCsrKXtqPWtbZF07YT1rW2QtMV07Zj1rW2QrMV07aWYoZD09PTApe2c9Im1jZVRvb2xiYXJTdGFydCI7aWYoai5CdXR0b24pe2crPSIgbWNlVG9vbGJhclN0YXJ0QnV0dG9uIn1lbHNle2lmKGouU3BsaXRCdXR0b24pe2crPSIgbWNlVG9vbGJhclN0YXJ0U3BsaXRCdXR0b24ifWVsc2V7aWYoai5MaXN0Qm94KXtnKz0iIG1jZVRvb2xiYXJTdGFydExpc3RCb3gifX19ZSs9Yi5jcmVhdGVIVE1MKCJ0ZCIseyJjbGFzcyI6Z30sYi5jcmVhdGVIVE1MKCJzcGFuIixudWxsLCI8IS0tIElFIC0tPiIpKX1pZihhJiZqLkxpc3RCb3gpe2lmKGEuQnV0dG9ufHxhLlNwbGl0QnV0dG9uKXtlKz1iLmNyZWF0ZUhUTUwoInRkIix7ImNsYXNzIjoibWNlVG9vbGJhckVuZCJ9LGIuY3JlYXRlSFRNTCgic3BhbiIsbnVsbCwiPCEtLSBJRSAtLT4iKSl9fWlmKGIuc3RkTW9kZSl7ZSs9Jzx0ZCBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlIj4nK2oucmVuZGVySFRNTCgpKyI8L3RkPiJ9ZWxzZXtlKz0iPHRkPiIrai5yZW5kZXJIVE1MKCkrIjwvdGQ+In1pZihmJiZqLkxpc3RCb3gpe2lmKGYuQnV0dG9ufHxmLlNwbGl0QnV0dG9uKXtlKz1iLmNyZWF0ZUhUTUwoInRkIix7ImNsYXNzIjoibWNlVG9vbGJhclN0YXJ0In0sYi5jcmVhdGVIVE1MKCJzcGFuIixudWxsLCI8IS0tIElFIC0tPiIpKX19fWc9Im1jZVRvb2xiYXJFbmQiO2lmKGouQnV0dG9uKXtnKz0iIG1jZVRvb2xiYXJFbmRCdXR0b24ifWVsc2V7aWYoai5TcGxpdEJ1dHRvbil7Zys9IiBtY2VUb29sYmFyRW5kU3BsaXRCdXR0b24ifWVsc2V7aWYoai5MaXN0Qm94KXtnKz0iIG1jZVRvb2xiYXJFbmRMaXN0Qm94In19fWUrPWIuY3JlYXRlSFRNTCgidGQiLHsiY2xhc3MiOmd9LGIuY3JlYXRlSFRNTCgic3BhbiIsbnVsbCwiPCEtLSBJRSAtLT4iKSk7cmV0dXJuIGIuY3JlYXRlSFRNTCgidGFibGUiLHtpZDpsLmlkLCJjbGFzcyI6Im1jZVRvb2xiYXIiKyhtWyJjbGFzcyJdPyIgIittWyJjbGFzcyJdOiIiKSxjZWxscGFkZGluZzoiMCIsY2VsbHNwYWNpbmc6IjAiLGFsaWduOmwuc2V0dGluZ3MuYWxpZ258fCIifSwiPHRib2R5Pjx0cj4iK2UrIjwvdHI+PC90Ym9keT4iKX19KTsoZnVuY3Rpb24oYil7dmFyIGE9Yi51dGlsLkRpc3BhdGNoZXIsYz1iLmVhY2g7Yi5jcmVhdGUoInRpbnltY2UuQWRkT25NYW5hZ2VyIix7QWRkT25NYW5hZ2VyOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcztkLml0ZW1zPVtdO2QudXJscz17fTtkLmxvb2t1cD17fTtkLm9uQWRkPW5ldyBhKGQpfSxnZXQ6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMubG9va3VwW2RdfSxyZXF1aXJlTGFuZ1BhY2s6ZnVuY3Rpb24oZSl7dmFyIGQ9Yi5zZXR0aW5ncztpZihkJiZkLmxhbmd1YWdlKXtiLlNjcmlwdExvYWRlci5hZGQodGhpcy51cmxzW2VdKyIvbGFuZ3MvIitkLmxhbmd1YWdlKyIuanMiKX19LGFkZDpmdW5jdGlvbihlLGQpe3RoaXMuaXRlbXMucHVzaChkKTt0aGlzLmxvb2t1cFtlXT1kO3RoaXMub25BZGQuZGlzcGF0Y2godGhpcyxlLGQpO3JldHVybiBkfSxsb2FkOmZ1bmN0aW9uKGgsZSxkLGcpe3ZhciBmPXRoaXM7aWYoZi51cmxzW2hdKXtyZXR1cm59aWYoZS5pbmRleE9mKCIvIikhPTAmJmUuaW5kZXhPZigiOi8vIik9PS0xKXtlPWIuYmFzZVVSTCsiLyIrZX1mLnVybHNbaF09ZS5zdWJzdHJpbmcoMCxlLmxhc3RJbmRleE9mKCIvIikpO2lmKCFmLmxvb2t1cFtoXSl7Yi5TY3JpcHRMb2FkZXIuYWRkKGUsZCxnKX19fSk7Yi5QbHVnaW5NYW5hZ2VyPW5ldyBiLkFkZE9uTWFuYWdlcigpO2IuVGhlbWVNYW5hZ2VyPW5ldyBiLkFkZE9uTWFuYWdlcigpfSh0aW55bWNlKSk7KGZ1bmN0aW9uKGope3ZhciBnPWouZWFjaCxkPWouZXh0ZW5kLGs9ai5ET00saT1qLmRvbS5FdmVudCxmPWouVGhlbWVNYW5hZ2VyLGI9ai5QbHVnaW5NYW5hZ2VyLGU9ai5leHBsb2RlLGg9ai51dGlsLkRpc3BhdGNoZXIsYSxjPTA7ai5kb2N1bWVudEJhc2VVUkw9d2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgvW1w/I10uKiQvLCIiKS5yZXBsYWNlKC9bXC9cXF1bXlwvXSskLywiIik7aWYoIS9bXC9cXF0kLy50ZXN0KGouZG9jdW1lbnRCYXNlVVJMKSl7ai5kb2N1bWVudEJhc2VVUkwrPSIvIn1qLmJhc2VVUkw9bmV3IGoudXRpbC5VUkkoai5kb2N1bWVudEJhc2VVUkwpLnRvQWJzb2x1dGUoai5iYXNlVVJMKTtqLmJhc2VVUkk9bmV3IGoudXRpbC5VUkkoai5iYXNlVVJMKTtqLm9uQmVmb3JlVW5sb2FkPW5ldyBoKGopO2kuYWRkKHdpbmRvdywiYmVmb3JldW5sb2FkIixmdW5jdGlvbihsKXtqLm9uQmVmb3JlVW5sb2FkLmRpc3BhdGNoKGosbCl9KTtqLm9uQWRkRWRpdG9yPW5ldyBoKGopO2oub25SZW1vdmVFZGl0b3I9bmV3IGgoaik7ai5FZGl0b3JNYW5hZ2VyPWQoaix7ZWRpdG9yczpbXSxpMThuOnt9LGFjdGl2ZUVkaXRvcjpudWxsLGluaXQ6ZnVuY3Rpb24ocSl7dmFyIG49dGhpcyxwLGw9ai5TY3JpcHRMb2FkZXIsdSxvPVtdLG07ZnVuY3Rpb24gcih4LHksdCl7dmFyIHY9eFt5XTtpZighdil7cmV0dXJufWlmKGouaXModiwic3RyaW5nIikpe3Q9di5yZXBsYWNlKC9cLlx3KyQvLCIiKTt0PXQ/ai5yZXNvbHZlKHQpOjA7dj1qLnJlc29sdmUodil9cmV0dXJuIHYuYXBwbHkodHx8dGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfXE9ZCh7dGhlbWU6InNpbXBsZSIsbGFuZ3VhZ2U6ImVuIn0scSk7bi5zZXR0aW5ncz1xO2kuYWRkKGRvY3VtZW50LCJpbml0IixmdW5jdGlvbigpe3ZhciBzLHY7cihxLCJvbnBhZ2Vsb2FkIik7c3dpdGNoKHEubW9kZSl7Y2FzZSJleGFjdCI6cz1xLmVsZW1lbnRzfHwiIjtpZihzLmxlbmd0aD4wKXtnKGUocyksZnVuY3Rpb24oeCl7aWYoay5nZXQoeCkpe209bmV3IGouRWRpdG9yKHgscSk7by5wdXNoKG0pO20ucmVuZGVyKDEpfWVsc2V7Zyhkb2N1bWVudC5mb3JtcyxmdW5jdGlvbih5KXtnKHkuZWxlbWVudHMsZnVuY3Rpb24oeil7aWYoei5uYW1lPT09eCl7eD0ibWNlX2VkaXRvcl8iK2MrKztrLnNldEF0dHJpYih6LCJpZCIseCk7bT1uZXcgai5FZGl0b3IoeCxxKTtvLnB1c2gobSk7bS5yZW5kZXIoMSl9fSl9KX19KX1icmVhaztjYXNlInRleHRhcmVhcyI6Y2FzZSJzcGVjaWZpY190ZXh0YXJlYXMiOmZ1bmN0aW9uIHQoeSx4KXtyZXR1cm4geC5jb25zdHJ1Y3Rvcj09PVJlZ0V4cD94LnRlc3QoeS5jbGFzc05hbWUpOmsuaGFzQ2xhc3MoeSx4KX1nKGsuc2VsZWN0KCJ0ZXh0YXJlYSIpLGZ1bmN0aW9uKHgpe2lmKHEuZWRpdG9yX2Rlc2VsZWN0b3ImJnQoeCxxLmVkaXRvcl9kZXNlbGVjdG9yKSl7cmV0dXJufWlmKCFxLmVkaXRvcl9zZWxlY3Rvcnx8dCh4LHEuZWRpdG9yX3NlbGVjdG9yKSl7dT1rLmdldCh4Lm5hbWUpO2lmKCF4LmlkJiYhdSl7eC5pZD14Lm5hbWV9aWYoIXguaWR8fG4uZ2V0KHguaWQpKXt4LmlkPWsudW5pcXVlSWQoKX1tPW5ldyBqLkVkaXRvcih4LmlkLHEpO28ucHVzaChtKTttLnJlbmRlcigxKX19KTticmVha31pZihxLm9uaW5pdCl7cz12PTA7ZyhvLGZ1bmN0aW9uKHgpe3YrKztpZigheC5pbml0aWFsaXplZCl7eC5vbkluaXQuYWRkKGZ1bmN0aW9uKCl7cysrO2lmKHM9PXYpe3IocSwib25pbml0Iil9fSl9ZWxzZXtzKyt9aWYocz09dil7cihxLCJvbmluaXQiKX19KX19KX0sZ2V0OmZ1bmN0aW9uKGwpe2lmKGw9PT1hKXtyZXR1cm4gdGhpcy5lZGl0b3JzfXJldHVybiB0aGlzLmVkaXRvcnNbbF19LGdldEluc3RhbmNlQnlJZDpmdW5jdGlvbihsKXtyZXR1cm4gdGhpcy5nZXQobCl9LGFkZDpmdW5jdGlvbihtKXt2YXIgbD10aGlzLG49bC5lZGl0b3JzO25bbS5pZF09bTtuLnB1c2gobSk7bC5fc2V0QWN0aXZlKG0pO2wub25BZGRFZGl0b3IuZGlzcGF0Y2gobCxtKTtyZXR1cm4gbX0scmVtb3ZlOmZ1bmN0aW9uKG4pe3ZhciBtPXRoaXMsbCxvPW0uZWRpdG9ycztpZighb1tuLmlkXSl7cmV0dXJuIG51bGx9ZGVsZXRlIG9bbi5pZF07Zm9yKGw9MDtsPG8ubGVuZ3RoO2wrKyl7aWYob1tsXT09bil7by5zcGxpY2UobCwxKTticmVha319aWYobS5hY3RpdmVFZGl0b3I9PW4pe20uX3NldEFjdGl2ZShvWzBdKX1uLmRlc3Ryb3koKTttLm9uUmVtb3ZlRWRpdG9yLmRpc3BhdGNoKG0sbik7cmV0dXJuIG59LGV4ZWNDb21tYW5kOmZ1bmN0aW9uKHIscCxvKXt2YXIgcT10aGlzLG49cS5nZXQobyksbDtzd2l0Y2gocil7Y2FzZSJtY2VGb2N1cyI6bi5mb2N1cygpO3JldHVybiB0cnVlO2Nhc2UibWNlQWRkRWRpdG9yIjpjYXNlIm1jZUFkZENvbnRyb2wiOmlmKCFxLmdldChvKSl7bmV3IGouRWRpdG9yKG8scS5zZXR0aW5ncykucmVuZGVyKCl9cmV0dXJuIHRydWU7Y2FzZSJtY2VBZGRGcmFtZUNvbnRyb2wiOmw9by53aW5kb3c7bC50aW55TUNFPXRpbnlNQ0U7bC50aW55bWNlPWo7ai5ET00uZG9jPWwuZG9jdW1lbnQ7ai5ET00ud2luPWw7bj1uZXcgai5FZGl0b3Ioby5lbGVtZW50X2lkLG8pO24ucmVuZGVyKCk7aWYoai5pc0lFKXtmdW5jdGlvbiBtKCl7bi5kZXN0cm95KCk7bC5kZXRhY2hFdmVudCgib251bmxvYWQiLG0pO2w9bC50aW55TUNFPWwudGlueW1jZT1udWxsfWwuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixtKX1vLnBhZ2Vfd2luZG93PW51bGw7cmV0dXJuIHRydWU7Y2FzZSJtY2VSZW1vdmVFZGl0b3IiOmNhc2UibWNlUmVtb3ZlQ29udHJvbCI6aWYobil7bi5yZW1vdmUoKX1yZXR1cm4gdHJ1ZTtjYXNlIm1jZVRvZ2dsZUVkaXRvciI6aWYoIW4pe3EuZXhlY0NvbW1hbmQoIm1jZUFkZENvbnRyb2wiLDAsbyk7cmV0dXJuIHRydWV9aWYobi5pc0hpZGRlbigpKXtuLnNob3coKX1lbHNle24uaGlkZSgpfXJldHVybiB0cnVlfWlmKHEuYWN0aXZlRWRpdG9yKXtyZXR1cm4gcS5hY3RpdmVFZGl0b3IuZXhlY0NvbW1hbmQocixwLG8pfXJldHVybiBmYWxzZX0sZXhlY0luc3RhbmNlQ29tbWFuZDpmdW5jdGlvbihwLG8sbixtKXt2YXIgbD10aGlzLmdldChwKTtpZihsKXtyZXR1cm4gbC5leGVjQ29tbWFuZChvLG4sbSl9cmV0dXJuIGZhbHNlfSx0cmlnZ2VyU2F2ZTpmdW5jdGlvbigpe2codGhpcy5lZGl0b3JzLGZ1bmN0aW9uKGwpe2wuc2F2ZSgpfSl9LGFkZEkxOG46ZnVuY3Rpb24obixxKXt2YXIgbCxtPXRoaXMuaTE4bjtpZighai5pcyhuLCJzdHJpbmciKSl7ZyhuLGZ1bmN0aW9uKHIscCl7ZyhyLGZ1bmN0aW9uKHQscyl7Zyh0LGZ1bmN0aW9uKHYsdSl7aWYocz09PSJjb21tb24iKXttW3ArIi4iK3VdPXZ9ZWxzZXttW3ArIi4iK3MrIi4iK3VdPXZ9fSl9KX0pfWVsc2V7ZyhxLGZ1bmN0aW9uKHIscCl7bVtuKyIuIitwXT1yfSl9fSxfc2V0QWN0aXZlOmZ1bmN0aW9uKGwpe3RoaXMuc2VsZWN0ZWRJbnN0YW5jZT10aGlzLmFjdGl2ZUVkaXRvcj1sfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKG0pe3ZhciBuPW0uRE9NLGo9bS5kb20uRXZlbnQsZj1tLmV4dGVuZCxrPW0udXRpbC5EaXNwYXRjaGVyLGk9bS5lYWNoLGE9bS5pc0dlY2tvLGI9bS5pc0lFLGU9bS5pc1dlYktpdCxkPW0uaXMsaD1tLlRoZW1lTWFuYWdlcixjPW0uUGx1Z2luTWFuYWdlcixvPW0uaW5BcnJheSxsPW0uZ3JlcCxnPW0uZXhwbG9kZTttLmNyZWF0ZSgidGlueW1jZS5FZGl0b3IiLHtFZGl0b3I6ZnVuY3Rpb24ocixxKXt2YXIgcD10aGlzO3AuaWQ9cC5lZGl0b3JJZD1yO3AuZXhlY0NvbW1hbmRzPXt9O3AucXVlcnlTdGF0ZUNvbW1hbmRzPXt9O3AucXVlcnlWYWx1ZUNvbW1hbmRzPXt9O3AuaXNOb3REaXJ0eT1mYWxzZTtwLnBsdWdpbnM9e307aShbIm9uUHJlSW5pdCIsIm9uQmVmb3JlUmVuZGVyVUkiLCJvblBvc3RSZW5kZXIiLCJvbkluaXQiLCJvblJlbW92ZSIsIm9uQWN0aXZhdGUiLCJvbkRlYWN0aXZhdGUiLCJvbkNsaWNrIiwib25FdmVudCIsIm9uTW91c2VVcCIsIm9uTW91c2VEb3duIiwib25EYmxDbGljayIsIm9uS2V5RG93biIsIm9uS2V5VXAiLCJvbktleVByZXNzIiwib25Db250ZXh0TWVudSIsIm9uU3VibWl0Iiwib25SZXNldCIsIm9uUGFzdGUiLCJvblByZVByb2Nlc3MiLCJvblBvc3RQcm9jZXNzIiwib25CZWZvcmVTZXRDb250ZW50Iiwib25CZWZvcmVHZXRDb250ZW50Iiwib25TZXRDb250ZW50Iiwib25HZXRDb250ZW50Iiwib25Mb2FkQ29udGVudCIsIm9uU2F2ZUNvbnRlbnQiLCJvbk5vZGVDaGFuZ2UiLCJvbkNoYW5nZSIsIm9uQmVmb3JlRXhlY0NvbW1hbmQiLCJvbkV4ZWNDb21tYW5kIiwib25VbmRvIiwib25SZWRvIiwib25WaXN1YWxBaWQiLCJvblNldFByb2dyZXNzU3RhdGUiXSxmdW5jdGlvbihzKXtwW3NdPW5ldyBrKHApfSk7cC5zZXR0aW5ncz1xPWYoe2lkOnIsbGFuZ3VhZ2U6ImVuIixkb2NzX2xhbmd1YWdlOiJlbiIsdGhlbWU6InNpbXBsZSIsc2tpbjoiZGVmYXVsdCIsZGVsdGFfd2lkdGg6MCxkZWx0YV9oZWlnaHQ6MCxwb3B1cF9jc3M6IiIscGx1Z2luczoiIixkb2N1bWVudF9iYXNlX3VybDptLmRvY3VtZW50QmFzZVVSTCxhZGRfZm9ybV9zdWJtaXRfdHJpZ2dlcjoxLHN1Ym1pdF9wYXRjaDoxLGFkZF91bmxvYWRfdHJpZ2dlcjoxLGNvbnZlcnRfdXJsczoxLHJlbGF0aXZlX3VybHM6MSxyZW1vdmVfc2NyaXB0X2hvc3Q6MSx0YWJsZV9pbmxpbmVfZWRpdGluZzowLG9iamVjdF9yZXNpemluZzoxLGNsZWFudXA6MSxhY2Nlc3NpYmlsaXR5X2ZvY3VzOjEsY3VzdG9tX3Nob3J0Y3V0czoxLGN1c3RvbV91bmRvX3JlZG9fa2V5Ym9hcmRfc2hvcnRjdXRzOjEsY3VzdG9tX3VuZG9fcmVkb19yZXN0b3JlX3NlbGVjdGlvbjoxLGN1c3RvbV91bmRvX3JlZG86MSxkb2N0eXBlOm0uaXNJRTY/JzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPic6IjwhRE9DVFlQRT4iLHZpc3VhbF90YWJsZV9jbGFzczoibWNlSXRlbVRhYmxlIix2aXN1YWw6MSxmb250X3NpemVfc3R5bGVfdmFsdWVzOiJ4eC1zbWFsbCx4LXNtYWxsLHNtYWxsLG1lZGl1bSxsYXJnZSx4LWxhcmdlLHh4LWxhcmdlIixhcHBseV9zb3VyY2VfZm9ybWF0dGluZzoxLGRpcmVjdGlvbmFsaXR5OiJsdHIiLGZvcmNlZF9yb290X2Jsb2NrOiJwIix2YWxpZF9lbGVtZW50czoiQFtpZHxjbGFzc3xzdHlsZXx0aXRsZXxkaXI8bHRyP3J0bHxsYW5nfHhtbDo6bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25tb3VzZWRvd258b25tb3VzZXVwfG9ubW91c2VvdmVyfG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25rZXlwcmVzc3xvbmtleWRvd258b25rZXl1cF0sYVtyZWx8cmV2fGNoYXJzZXR8aHJlZmxhbmd8dGFiaW5kZXh8YWNjZXNza2V5fHR5cGV8bmFtZXxocmVmfHRhcmdldHx0aXRsZXxjbGFzc3xvbmZvY3VzfG9uYmx1cl0sc3Ryb25nL2IsZW0vaSxzdHJpa2UsdSwjcCwtb2xbdHlwZXxjb21wYWN0XSwtdWxbdHlwZXxjb21wYWN0XSwtbGksYnIsaW1nW2xvbmdkZXNjfHVzZW1hcHxzcmN8Ym9yZGVyfGFsdD18dGl0bGV8aHNwYWNlfHZzcGFjZXx3aWR0aHxoZWlnaHR8YWxpZ25dLC1zdWIsLXN1cCwtYmxvY2txdW90ZVtjaXRlXSwtdGFibGVbYm9yZGVyfGNlbGxzcGFjaW5nfGNlbGxwYWRkaW5nfHdpZHRofGZyYW1lfHJ1bGVzfGhlaWdodHxhbGlnbnxzdW1tYXJ5fGJnY29sb3J8YmFja2dyb3VuZHxib3JkZXJjb2xvcl0sLXRyW3Jvd3NwYW58d2lkdGh8aGVpZ2h0fGFsaWdufHZhbGlnbnxiZ2NvbG9yfGJhY2tncm91bmR8Ym9yZGVyY29sb3JdLHRib2R5LHRoZWFkLHRmb290LCN0ZFtjb2xzcGFufHJvd3NwYW58d2lkdGh8aGVpZ2h0fGFsaWdufHZhbGlnbnxiZ2NvbG9yfGJhY2tncm91bmR8Ym9yZGVyY29sb3J8c2NvcGVdLCN0aFtjb2xzcGFufHJvd3NwYW58d2lkdGh8aGVpZ2h0fGFsaWdufHZhbGlnbnxzY29wZV0sY2FwdGlvbiwtZGl2LC1zcGFuLC1jb2RlLC1wcmUsYWRkcmVzcywtaDEsLWgyLC1oMywtaDQsLWg1LC1oNixocltzaXplfG5vc2hhZGVdLC1mb250W2ZhY2V8c2l6ZXxjb2xvcl0sZGQsZGwsZHQsY2l0ZSxhYmJyLGFjcm9ueW0sZGVsW2RhdGV0aW1lfGNpdGVdLGluc1tkYXRldGltZXxjaXRlXSxvYmplY3RbY2xhc3NpZHx3aWR0aHxoZWlnaHR8Y29kZWJhc2V8Kl0scGFyYW1bbmFtZXx2YWx1ZV0sZW1iZWRbdHlwZXx3aWR0aHxoZWlnaHR8c3JjfCpdLHNjcmlwdFtzcmN8dHlwZV0sbWFwW25hbWVdLGFyZWFbc2hhcGV8Y29vcmRzfGhyZWZ8YWx0fHRhcmdldF0sYmRvLGJ1dHRvbixjb2xbYWxpZ258Y2hhcnxjaGFyb2ZmfHNwYW58dmFsaWdufHdpZHRoXSxjb2xncm91cFthbGlnbnxjaGFyfGNoYXJvZmZ8c3Bhbnx2YWxpZ258d2lkdGhdLGRmbixmaWVsZHNldCxmb3JtW2FjdGlvbnxhY2NlcHR8YWNjZXB0LWNoYXJzZXR8ZW5jdHlwZXxtZXRob2RdLGlucHV0W2FjY2VwdHxhbHR8Y2hlY2tlZHxkaXNhYmxlZHxtYXhsZW5ndGh8bmFtZXxyZWFkb25seXxzaXplfHNyY3x0eXBlfHZhbHVlfHRhYmluZGV4fGFjY2Vzc2tleV0sa2JkLGxhYmVsW2Zvcl0sbGVnZW5kLG5vc2NyaXB0LG9wdGdyb3VwW2xhYmVsfGRpc2FibGVkXSxvcHRpb25bZGlzYWJsZWR8bGFiZWx8c2VsZWN0ZWR8dmFsdWVdLHFbY2l0ZV0sc2FtcCxzZWxlY3RbZGlzYWJsZWR8bXVsdGlwbGV8bmFtZXxzaXplXSxzbWFsbCx0ZXh0YXJlYVtjb2xzfHJvd3N8ZGlzYWJsZWR8bmFtZXxyZWFkb25seV0sdHQsdmFyLGJpZyIsaGlkZGVuX2lucHV0OjEscGFkZF9lbXB0eV9lZGl0b3I6MSxyZW5kZXJfdWk6MSxpbml0X3RoZW1lOjEsZm9yY2VfcF9uZXdsaW5lczoxLGluZGVudGF0aW9uOiIzMHB4IixrZWVwX3N0eWxlczoxLGZpeF90YWJsZV9lbGVtZW50czoxLGlubGluZV9zdHlsZXM6MSxjb252ZXJ0X2ZvbnRzX3RvX3NwYW5zOnRydWV9LHEpO3AuZG9jdW1lbnRCYXNlVVJJPW5ldyBtLnV0aWwuVVJJKHEuZG9jdW1lbnRfYmFzZV91cmx8fG0uZG9jdW1lbnRCYXNlVVJMLHtiYXNlX3VyaTp0aW55TUNFLmJhc2VVUkl9KTtwLmJhc2VVUkk9bS5iYXNlVVJJO3AuZXhlY0NhbGxiYWNrKCJzZXR1cCIscCl9LHJlbmRlcjpmdW5jdGlvbihyKXt2YXIgdT10aGlzLHY9dS5zZXR0aW5ncyx4PXUuaWQscD1tLlNjcmlwdExvYWRlcjtpZighai5kb21Mb2FkZWQpe2ouYWRkKGRvY3VtZW50LCJpbml0IixmdW5jdGlvbigpe3UucmVuZGVyKCl9KTtyZXR1cm59dGlueU1DRS5zZXR0aW5ncz12O2lmKCF1LmdldEVsZW1lbnQoKSl7cmV0dXJufWlmKG0uaXNJRGV2aWNlKXtyZXR1cm59aWYoIS9URVhUQVJFQXxJTlBVVC9pLnRlc3QodS5nZXRFbGVtZW50KCkubm9kZU5hbWUpJiZ2LmhpZGRlbl9pbnB1dCYmbi5nZXRQYXJlbnQoeCwiZm9ybSIpKXtuLmluc2VydEFmdGVyKG4uY3JlYXRlKCJpbnB1dCIse3R5cGU6ImhpZGRlbiIsbmFtZTp4fSkseCl9aWYobS5XaW5kb3dNYW5hZ2VyKXt1LndpbmRvd01hbmFnZXI9bmV3IG0uV2luZG93TWFuYWdlcih1KX1pZih2LmVuY29kaW5nPT0ieG1sIil7dS5vbkdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKHMsdCl7aWYodC5zYXZlKXt0LmNvbnRlbnQ9bi5lbmNvZGUodC5jb250ZW50KX19KX1pZih2LmFkZF9mb3JtX3N1Ym1pdF90cmlnZ2VyKXt1Lm9uU3VibWl0LmFkZFRvVG9wKGZ1bmN0aW9uKCl7aWYodS5pbml0aWFsaXplZCl7dS5zYXZlKCk7dS5pc05vdERpcnR5PTF9fSl9aWYodi5hZGRfdW5sb2FkX3RyaWdnZXIpe3UuX2JlZm9yZVVubG9hZD10aW55TUNFLm9uQmVmb3JlVW5sb2FkLmFkZChmdW5jdGlvbigpe2lmKHUuaW5pdGlhbGl6ZWQmJiF1LmRlc3Ryb3llZCYmIXUuaXNIaWRkZW4oKSl7dS5zYXZlKHtmb3JtYXQ6InJhdyIsbm9fZXZlbnRzOnRydWV9KX19KX1tLmFkZFVubG9hZCh1LmRlc3Ryb3ksdSk7aWYodi5zdWJtaXRfcGF0Y2gpe3Uub25CZWZvcmVSZW5kZXJVSS5hZGQoZnVuY3Rpb24oKXt2YXIgcz11LmdldEVsZW1lbnQoKS5mb3JtO2lmKCFzKXtyZXR1cm59aWYocy5fbWNlT2xkU3VibWl0KXtyZXR1cm59aWYoIXMuc3VibWl0Lm5vZGVUeXBlJiYhcy5zdWJtaXQubGVuZ3RoKXt1LmZvcm1FbGVtZW50PXM7cy5fbWNlT2xkU3VibWl0PXMuc3VibWl0O3Muc3VibWl0PWZ1bmN0aW9uKCl7bS50cmlnZ2VyU2F2ZSgpO3UuaXNOb3REaXJ0eT0xO3JldHVybiB1LmZvcm1FbGVtZW50Ll9tY2VPbGRTdWJtaXQodS5mb3JtRWxlbWVudCl9fXM9bnVsbH0pfWZ1bmN0aW9uIHEoKXtpZih2Lmxhbmd1YWdlKXtwLmFkZChtLmJhc2VVUkwrIi9sYW5ncy8iK3YubGFuZ3VhZ2UrIi5qcyIpfWlmKHYudGhlbWUmJnYudGhlbWUuY2hhckF0KDApIT0iLSImJiFoLnVybHNbdi50aGVtZV0pe2gubG9hZCh2LnRoZW1lLCJ0aGVtZXMvIit2LnRoZW1lKyIvZWRpdG9yX3RlbXBsYXRlIittLnN1ZmZpeCsiLmpzIil9aShnKHYucGx1Z2lucyksZnVuY3Rpb24ocyl7aWYocyYmcy5jaGFyQXQoMCkhPSItIiYmIWMudXJsc1tzXSl7aWYocz09InNhZmFyaSIpe3JldHVybn1jLmxvYWQocywicGx1Z2lucy8iK3MrIi9lZGl0b3JfcGx1Z2luIittLnN1ZmZpeCsiLmpzIil9fSk7cC5sb2FkUXVldWUoZnVuY3Rpb24oKXtpZighdS5yZW1vdmVkKXt1LmluaXQoKX19KX1xKCl9LGluaXQ6ZnVuY3Rpb24oKXt2YXIgcixFPXRoaXMsRj1FLnNldHRpbmdzLEIseSxBPUUuZ2V0RWxlbWVudCgpLHEscCxDLHgseixEO20uYWRkKEUpO2lmKEYudGhlbWUpe0YudGhlbWU9Ri50aGVtZS5yZXBsYWNlKC8tLywiIik7cT1oLmdldChGLnRoZW1lKTtFLnRoZW1lPW5ldyBxKCk7aWYoRS50aGVtZS5pbml0JiZGLmluaXRfdGhlbWUpe0UudGhlbWUuaW5pdChFLGgudXJsc1tGLnRoZW1lXXx8bS5kb2N1bWVudEJhc2VVUkwucmVwbGFjZSgvXC8kLywiIikpfX1pKGcoRi5wbHVnaW5zLnJlcGxhY2UoL1wtL2csIiIpKSxmdW5jdGlvbihHKXt2YXIgSD1jLmdldChHKSx0PWMudXJsc1tHXXx8bS5kb2N1bWVudEJhc2VVUkwucmVwbGFjZSgvXC8kLywiIikscztpZihIKXtzPW5ldyBIKEUsdCk7RS5wbHVnaW5zW0ddPXM7aWYocy5pbml0KXtzLmluaXQoRSx0KX19fSk7aWYoRi5wb3B1cF9jc3MhPT1mYWxzZSl7aWYoRi5wb3B1cF9jc3Mpe0YucG9wdXBfY3NzPUUuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUoRi5wb3B1cF9jc3MpfWVsc2V7Ri5wb3B1cF9jc3M9RS5iYXNlVVJJLnRvQWJzb2x1dGUoInRoZW1lcy8iK0YudGhlbWUrIi9za2lucy8iK0Yuc2tpbisiL2RpYWxvZy5jc3MiKX19aWYoRi5wb3B1cF9jc3NfYWRkKXtGLnBvcHVwX2Nzcys9IiwiK0UuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUoRi5wb3B1cF9jc3NfYWRkKX1FLmNvbnRyb2xNYW5hZ2VyPW5ldyBtLkNvbnRyb2xNYW5hZ2VyKEUpO2lmKEYuY3VzdG9tX3VuZG9fcmVkbyl7RS5vbkJlZm9yZUV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbih0LEcsdSxILHMpe2lmKEchPSJVbmRvIiYmRyE9IlJlZG8iJiZHIT0ibWNlUmVwYWludCImJighc3x8IXMuc2tpcF91bmRvKSl7aWYoIUUudW5kb01hbmFnZXIuaGFzVW5kbygpKXtFLnVuZG9NYW5hZ2VyLmFkZCgpfX19KTtFLm9uRXhlY0NvbW1hbmQuYWRkKGZ1bmN0aW9uKHQsRyx1LEgscyl7aWYoRyE9IlVuZG8iJiZHIT0iUmVkbyImJkchPSJtY2VSZXBhaW50IiYmKCFzfHwhcy5za2lwX3VuZG8pKXtFLnVuZG9NYW5hZ2VyLmFkZCgpfX0pfUUub25FeGVjQ29tbWFuZC5hZGQoZnVuY3Rpb24ocyx0KXtpZighL14oRm9udE5hbWV8Rm9udFNpemUpJC8udGVzdCh0KSl7RS5ub2RlQ2hhbmdlZCgpfX0pO2lmKGEpe2Z1bmN0aW9uIHYocyx0KXtpZighdHx8IXQuaW5pdGlhbCl7RS5leGVjQ29tbWFuZCgibWNlUmVwYWludCIpfX1FLm9uVW5kby5hZGQodik7RS5vblJlZG8uYWRkKHYpO0Uub25TZXRDb250ZW50LmFkZCh2KX1FLm9uQmVmb3JlUmVuZGVyVUkuZGlzcGF0Y2goRSxFLmNvbnRyb2xNYW5hZ2VyKTtpZihGLnJlbmRlcl91aSl7Qj1GLndpZHRofHxBLnN0eWxlLndpZHRofHxBLm9mZnNldFdpZHRoO3k9Ri5oZWlnaHR8fEEuc3R5bGUuaGVpZ2h0fHxBLm9mZnNldEhlaWdodDtFLm9yZ0Rpc3BsYXk9QS5zdHlsZS5kaXNwbGF5O0Q9L15bMC05XC5dKyh8cHgpJC9pO2lmKEQudGVzdCgiIitCKSl7Qj1NYXRoLm1heChwYXJzZUludChCKSsocS5kZWx0YVdpZHRofHwwKSwxMDApfWlmKEQudGVzdCgiIit5KSl7eT1NYXRoLm1heChwYXJzZUludCh5KSsocS5kZWx0YUhlaWdodHx8MCksMTAwKX1xPUUudGhlbWUucmVuZGVyVUkoe3RhcmdldE5vZGU6QSx3aWR0aDpCLGhlaWdodDp5LGRlbHRhV2lkdGg6Ri5kZWx0YV93aWR0aCxkZWx0YUhlaWdodDpGLmRlbHRhX2hlaWdodH0pO0UuZWRpdG9yQ29udGFpbmVyPXEuZWRpdG9yQ29udGFpbmVyfWlmKGRvY3VtZW50LmRvbWFpbiYmbG9jYXRpb24uaG9zdG5hbWUhPWRvY3VtZW50LmRvbWFpbil7bS5yZWxheGVkRG9tYWluPWRvY3VtZW50LmRvbWFpbn1uLnNldFN0eWxlcyhxLnNpemVDb250YWluZXJ8fHEuZWRpdG9yQ29udGFpbmVyLHt3aWR0aDpCLGhlaWdodDp5fSk7eT0ocS5pZnJhbWVIZWlnaHR8fHkpKyh0eXBlb2YoeSk9PSJudW1iZXIiPyhxLmRlbHRhSGVpZ2h0fHwwKToiIik7aWYoeTwxMDApe3k9MTAwfUUuaWZyYW1lSFRNTD1GLmRvY3R5cGUrJzxodG1sPjxoZWFkIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4nO2lmKEYuZG9jdW1lbnRfYmFzZV91cmwhPW0uZG9jdW1lbnRCYXNlVVJMKXtFLmlmcmFtZUhUTUwrPSc8YmFzZSBocmVmPSInK0UuZG9jdW1lbnRCYXNlVVJJLmdldFVSSSgpKyciIC8+J31FLmlmcmFtZUhUTUwrPSc8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPTciIC8+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+JztpZihtLnJlbGF4ZWREb21haW4pe0UuaWZyYW1lSFRNTCs9JzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kb2N1bWVudC5kb21haW4gPSAiJyttLnJlbGF4ZWREb21haW4rJyI7PFwvc2NyaXB0Pid9eD1GLmJvZHlfaWR8fCJ0aW55bWNlIjtpZih4LmluZGV4T2YoIj0iKSE9LTEpe3g9RS5nZXRQYXJhbSgiYm9keV9pZCIsIiIsImhhc2giKTt4PXhbRS5pZF18fHh9ej1GLmJvZHlfY2xhc3N8fCIiO2lmKHouaW5kZXhPZigiPSIpIT0tMSl7ej1FLmdldFBhcmFtKCJib2R5X2NsYXNzIiwiIiwiaGFzaCIpO3o9eltFLmlkXXx8IiJ9RS5pZnJhbWVIVE1MKz0nPC9oZWFkPjxib2R5IGlkPSInK3grJyIgY2xhc3M9Im1jZUNvbnRlbnRCb2R5ICcreisnIj48L2JvZHk+PC9odG1sPic7aWYobS5yZWxheGVkRG9tYWluKXtpZihifHwobS5pc09wZXJhJiZwYXJzZUZsb2F0KG9wZXJhLnZlcnNpb24oKSk+PTkuNSkpe0M9J2phdmFzY3JpcHQ6KGZ1bmN0aW9uKCl7ZG9jdW1lbnQub3BlbigpO2RvY3VtZW50LmRvbWFpbj0iJytkb2N1bWVudC5kb21haW4rJyI7dmFyIGVkID0gd2luZG93LnBhcmVudC50aW55TUNFLmdldCgiJytFLmlkKyciKTtkb2N1bWVudC53cml0ZShlZC5pZnJhbWVIVE1MKTtkb2N1bWVudC5jbG9zZSgpO2VkLnNldHVwSWZyYW1lKCk7fSkoKSd9ZWxzZXtpZihtLmlzT3BlcmEpe0M9J2phdmFzY3JpcHQ6KGZ1bmN0aW9uKCl7ZG9jdW1lbnQub3BlbigpO2RvY3VtZW50LmRvbWFpbj0iJytkb2N1bWVudC5kb21haW4rJyI7ZG9jdW1lbnQuY2xvc2UoKTtlZC5zZXR1cElmcmFtZSgpO30pKCknfX19cj1uLmFkZChxLmlmcmFtZUNvbnRhaW5lciwiaWZyYW1lIix7aWQ6RS5pZCsiX2lmciIsc3JjOkN8fCdqYXZhc2NyaXB0OiIiJyxmcmFtZUJvcmRlcjoiMCIsc3R5bGU6e3dpZHRoOiIxMDAlIixoZWlnaHQ6eX19KTtFLmNvbnRlbnRBcmVhQ29udGFpbmVyPXEuaWZyYW1lQ29udGFpbmVyO24uZ2V0KHEuZWRpdG9yQ29udGFpbmVyKS5zdHlsZS5kaXNwbGF5PUUub3JnRGlzcGxheTtuLmdldChFLmlkKS5zdHlsZS5kaXNwbGF5PSJub25lIjtpZighYnx8IW0ucmVsYXhlZERvbWFpbil7RS5zZXR1cElmcmFtZSgpfUE9cj1xPW51bGx9LHNldHVwSWZyYW1lOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcyxBPXouc2V0dGluZ3Mscj1uLmdldCh6LmlkKSx1PXouZ2V0RG9jKCkscSx4O2lmKCFifHwhbS5yZWxheGVkRG9tYWluKXt1Lm9wZW4oKTt1LndyaXRlKHouaWZyYW1lSFRNTCk7dS5jbG9zZSgpfWlmKCFiKXt0cnl7aWYoIUEucmVhZG9ubHkpe3UuZGVzaWduTW9kZT0iT24ifX1jYXRjaCh2KXt9fWlmKGIpe3g9ei5nZXRCb2R5KCk7bi5oaWRlKHgpO2lmKCFBLnJlYWRvbmx5KXt4LmNvbnRlbnRFZGl0YWJsZT10cnVlfW4uc2hvdyh4KX16LmRvbT1uZXcgbS5kb20uRE9NVXRpbHMoei5nZXREb2MoKSx7a2VlcF92YWx1ZXM6dHJ1ZSx1cmxfY29udmVydGVyOnouY29udmVydFVSTCx1cmxfY29udmVydGVyX3Njb3BlOnosaGV4X2NvbG9yczpBLmZvcmNlX2hleF9zdHlsZV9jb2xvcnMsY2xhc3NfZmlsdGVyOkEuY2xhc3NfZmlsdGVyLHVwZGF0ZV9zdHlsZXM6MSxmaXhfaWVfcGFyYWdyYXBoczoxLHZhbGlkX3N0eWxlczpBLnZhbGlkX3N0eWxlc30pO3ouc2NoZW1hPW5ldyBtLmRvbS5TY2hlbWEoKTt6LnNlcmlhbGl6ZXI9bmV3IG0uZG9tLlNlcmlhbGl6ZXIoZihBLHt2YWxpZF9lbGVtZW50czpBLnZlcmlmeV9odG1sPT09ZmFsc2U/IipbKl0iOkEudmFsaWRfZWxlbWVudHMsZG9tOnouZG9tLHNjaGVtYTp6LnNjaGVtYX0pKTt6LnNlbGVjdGlvbj1uZXcgbS5kb20uU2VsZWN0aW9uKHouZG9tLHouZ2V0V2luKCksei5zZXJpYWxpemVyKTt6LmZvcm1hdHRlcj1uZXcgbS5Gb3JtYXR0ZXIodGhpcyk7ei5mb3JtYXR0ZXIucmVnaXN0ZXIoe2FsaWdubGVmdDpbe3NlbGVjdG9yOiJwLGgxLGgyLGgzLGg0LGg1LGg2LHRkLHRoLGRpdix1bCxvbCxsaSIsc3R5bGVzOnt0ZXh0QWxpZ246ImxlZnQifX0se3NlbGVjdG9yOiJpbWcsdGFibGUiLHN0eWxlczp7ImZsb2F0IjoibGVmdCJ9fV0sYWxpZ25jZW50ZXI6W3tzZWxlY3RvcjoicCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGkiLHN0eWxlczp7dGV4dEFsaWduOiJjZW50ZXIifX0se3NlbGVjdG9yOiJpbWciLHN0eWxlczp7ZGlzcGxheToiYmxvY2siLG1hcmdpbkxlZnQ6ImF1dG8iLG1hcmdpblJpZ2h0OiJhdXRvIn19LHtzZWxlY3RvcjoidGFibGUiLHN0eWxlczp7bWFyZ2luTGVmdDoiYXV0byIsbWFyZ2luUmlnaHQ6ImF1dG8ifX1dLGFsaWducmlnaHQ6W3tzZWxlY3RvcjoicCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGkiLHN0eWxlczp7dGV4dEFsaWduOiJyaWdodCJ9fSx7c2VsZWN0b3I6ImltZyx0YWJsZSIsc3R5bGVzOnsiZmxvYXQiOiJyaWdodCJ9fV0sYWxpZ25mdWxsOlt7c2VsZWN0b3I6InAsaDEsaDIsaDMsaDQsaDUsaDYsdGQsdGgsZGl2LHVsLG9sLGxpIixzdHlsZXM6e3RleHRBbGlnbjoianVzdGlmeSJ9fV0sYm9sZDpbe2lubGluZToic3Ryb25nIn0se2lubGluZToic3BhbiIsc3R5bGVzOntmb250V2VpZ2h0OiJib2xkIn19LHtpbmxpbmU6ImIifV0saXRhbGljOlt7aW5saW5lOiJlbSJ9LHtpbmxpbmU6InNwYW4iLHN0eWxlczp7Zm9udFN0eWxlOiJpdGFsaWMifX0se2lubGluZToiaSJ9XSx1bmRlcmxpbmU6W3tpbmxpbmU6InNwYW4iLHN0eWxlczp7dGV4dERlY29yYXRpb246InVuZGVybGluZSJ9LGV4YWN0OnRydWV9LHtpbmxpbmU6InUifV0sc3RyaWtldGhyb3VnaDpbe2lubGluZToic3BhbiIsc3R5bGVzOnt0ZXh0RGVjb3JhdGlvbjoibGluZS10aHJvdWdoIn0sZXhhY3Q6dHJ1ZX0se2lubGluZToidSJ9XSxmb3JlY29sb3I6e2lubGluZToic3BhbiIsc3R5bGVzOntjb2xvcjoiJXZhbHVlIn0sd3JhcF9saW5rczpmYWxzZX0saGlsaXRlY29sb3I6e2lubGluZToic3BhbiIsc3R5bGVzOntiYWNrZ3JvdW5kQ29sb3I6IiV2YWx1ZSJ9LHdyYXBfbGlua3M6ZmFsc2V9LGZvbnRuYW1lOntpbmxpbmU6InNwYW4iLHN0eWxlczp7Zm9udEZhbWlseToiJXZhbHVlIn19LGZvbnRzaXplOntpbmxpbmU6InNwYW4iLHN0eWxlczp7Zm9udFNpemU6IiV2YWx1ZSJ9fSxmb250c2l6ZV9jbGFzczp7aW5saW5lOiJzcGFuIixhdHRyaWJ1dGVzOnsiY2xhc3MiOiIldmFsdWUifX0sYmxvY2txdW90ZTp7YmxvY2s6ImJsb2NrcXVvdGUiLHdyYXBwZXI6MSxyZW1vdmU6ImFsbCJ9LHJlbW92ZWZvcm1hdDpbe3NlbGVjdG9yOiJiLHN0cm9uZyxlbSxpLGZvbnQsdSxzdHJpa2UiLHJlbW92ZToiYWxsIixzcGxpdDp0cnVlLGV4cGFuZDpmYWxzZSxibG9ja19leHBhbmQ6dHJ1ZSxkZWVwOnRydWV9LHtzZWxlY3Rvcjoic3BhbiIsYXR0cmlidXRlczpbInN0eWxlIiwiY2xhc3MiXSxyZW1vdmU6ImVtcHR5IixzcGxpdDp0cnVlLGV4cGFuZDpmYWxzZSxkZWVwOnRydWV9LHtzZWxlY3RvcjoiKiIsYXR0cmlidXRlczpbInN0eWxlIiwiY2xhc3MiXSxzcGxpdDpmYWxzZSxleHBhbmQ6ZmFsc2UsZGVlcDp0cnVlfV19KTtpKCJwIGgxIGgyIGgzIGg0IGg1IGg2IGRpdiBhZGRyZXNzIHByZSBkaXYgY29kZSBkdCBkZCBzYW1wIi5zcGxpdCgvXHMvKSxmdW5jdGlvbihzKXt6LmZvcm1hdHRlci5yZWdpc3RlcihzLHtibG9jazpzLHJlbW92ZToiYWxsIn0pfSk7ei5mb3JtYXR0ZXIucmVnaXN0ZXIoei5zZXR0aW5ncy5mb3JtYXRzKTt6LnVuZG9NYW5hZ2VyPW5ldyBtLlVuZG9NYW5hZ2VyKHopO3oudW5kb01hbmFnZXIub25BZGQuYWRkKGZ1bmN0aW9uKHQscyl7aWYoIXMuaW5pdGlhbCl7cmV0dXJuIHoub25DaGFuZ2UuZGlzcGF0Y2goeixzLHQpfX0pO3oudW5kb01hbmFnZXIub25VbmRvLmFkZChmdW5jdGlvbih0LHMpe3JldHVybiB6Lm9uVW5kby5kaXNwYXRjaCh6LHMsdCl9KTt6LnVuZG9NYW5hZ2VyLm9uUmVkby5hZGQoZnVuY3Rpb24odCxzKXtyZXR1cm4gei5vblJlZG8uZGlzcGF0Y2goeixzLHQpfSk7ei5mb3JjZUJsb2Nrcz1uZXcgbS5Gb3JjZUJsb2Nrcyh6LHtmb3JjZWRfcm9vdF9ibG9jazpBLmZvcmNlZF9yb290X2Jsb2NrfSk7ei5lZGl0b3JDb21tYW5kcz1uZXcgbS5FZGl0b3JDb21tYW5kcyh6KTt6LnNlcmlhbGl6ZXIub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe3JldHVybiB6Lm9uUHJlUHJvY2Vzcy5kaXNwYXRjaCh6LHQscyl9KTt6LnNlcmlhbGl6ZXIub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24ocyx0KXtyZXR1cm4gei5vblBvc3RQcm9jZXNzLmRpc3BhdGNoKHosdCxzKX0pO3oub25QcmVJbml0LmRpc3BhdGNoKHopO2lmKCFBLmdlY2tvX3NwZWxsY2hlY2spe3ouZ2V0Qm9keSgpLnNwZWxsY2hlY2s9MH1pZighQS5yZWFkb25seSl7ei5fYWRkRXZlbnRzKCl9ei5jb250cm9sTWFuYWdlci5vblBvc3RSZW5kZXIuZGlzcGF0Y2goeix6LmNvbnRyb2xNYW5hZ2VyKTt6Lm9uUG9zdFJlbmRlci5kaXNwYXRjaCh6KTtpZihBLmRpcmVjdGlvbmFsaXR5KXt6LmdldEJvZHkoKS5kaXI9QS5kaXJlY3Rpb25hbGl0eX1pZihBLm5vd3JhcCl7ei5nZXRCb2R5KCkuc3R5bGUud2hpdGVTcGFjZT0ibm93cmFwIn1pZihBLmN1c3RvbV9lbGVtZW50cyl7ZnVuY3Rpb24geShzLHQpe2koZyhBLmN1c3RvbV9lbGVtZW50cyksZnVuY3Rpb24oQil7dmFyIEM7aWYoQi5pbmRleE9mKCJ+Iik9PT0wKXtCPUIuc3Vic3RyaW5nKDEpO0M9InNwYW4ifWVsc2V7Qz0iZGl2In10LmNvbnRlbnQ9dC5jb250ZW50LnJlcGxhY2UobmV3IFJlZ0V4cCgiPCgiK0IrIikoW14+XSopPiIsImciKSwiPCIrQysnIF9tY2VfbmFtZT0iJDEiJDI+Jyk7dC5jb250ZW50PXQuY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAoIjwvKCIrQisiKT4iLCJnIiksIjwvIitDKyI+Iil9KX16Lm9uQmVmb3JlU2V0Q29udGVudC5hZGQoeSk7ei5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe2lmKHQuc2V0KXt5KHMsdCl9fSl9aWYoQS5oYW5kbGVfbm9kZV9jaGFuZ2VfY2FsbGJhY2spe3oub25Ob2RlQ2hhbmdlLmFkZChmdW5jdGlvbih0LHMsQil7ei5leGVjQ2FsbGJhY2soImhhbmRsZV9ub2RlX2NoYW5nZV9jYWxsYmFjayIsei5pZCxCLC0xLC0xLHRydWUsei5zZWxlY3Rpb24uaXNDb2xsYXBzZWQoKSl9KX1pZihBLnNhdmVfY2FsbGJhY2spe3oub25TYXZlQ29udGVudC5hZGQoZnVuY3Rpb24ocyxCKXt2YXIgdD16LmV4ZWNDYWxsYmFjaygic2F2ZV9jYWxsYmFjayIsei5pZCxCLmNvbnRlbnQsei5nZXRCb2R5KCkpO2lmKHQpe0IuY29udGVudD10fX0pfWlmKEEub25jaGFuZ2VfY2FsbGJhY2spe3oub25DaGFuZ2UuYWRkKGZ1bmN0aW9uKHQscyl7ei5leGVjQ2FsbGJhY2soIm9uY2hhbmdlX2NhbGxiYWNrIix6LHMpfSl9aWYoQS5jb252ZXJ0X25ld2xpbmVzX3RvX2Jycyl7ei5vbkJlZm9yZVNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKHMsdCl7aWYodC5pbml0aWFsKXt0LmNvbnRlbnQ9dC5jb250ZW50LnJlcGxhY2UoL1xyP1xuL2csIjxiciAvPiIpfX0pfWlmKEEuZml4X25lc3RpbmcmJmIpe3oub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihzLHQpe3QuY29udGVudD16Ll9maXhOZXN0aW5nKHQuY29udGVudCl9KX1pZihBLnByZWZvcm1hdHRlZCl7ei5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe3QuY29udGVudD10LmNvbnRlbnQucmVwbGFjZSgvXlxzKjxwcmUuKj8+LywiIik7dC5jb250ZW50PXQuY29udGVudC5yZXBsYWNlKC88XC9wcmU+XHMqJC8sIiIpO2lmKHQuc2V0KXt0LmNvbnRlbnQ9JzxwcmUgY2xhc3M9Im1jZUl0ZW1IaWRkZW4iPicrdC5jb250ZW50KyI8L3ByZT4ifX0pfWlmKEEudmVyaWZ5X2Nzc19jbGFzc2VzKXt6LnNlcmlhbGl6ZXIuYXR0cmliVmFsdWVGaWx0ZXI9ZnVuY3Rpb24oRCxCKXt2YXIgQyx0O2lmKEQ9PSJjbGFzcyIpe2lmKCF6LmNsYXNzZXNSRSl7dD16LmRvbS5nZXRDbGFzc2VzKCk7aWYodC5sZW5ndGg+MCl7Qz0iIjtpKHQsZnVuY3Rpb24ocyl7Qys9KEM/InwiOiIiKStzWyJjbGFzcyJdfSk7ei5jbGFzc2VzUkU9bmV3IFJlZ0V4cCgiKCIrQysiKSIsImdpIil9fXJldHVybiAhei5jbGFzc2VzUkV8fC8oXGJtY2VJdGVtXHcrXGJ8XGJtY2VUZW1wXHcrXGIpL2cudGVzdChCKXx8ei5jbGFzc2VzUkUudGVzdChCKT9COiIifXJldHVybiBCfX1pZihBLmNsZWFudXBfY2FsbGJhY2spe3oub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihzLHQpe3QuY29udGVudD16LmV4ZWNDYWxsYmFjaygiY2xlYW51cF9jYWxsYmFjayIsImluc2VydF90b19lZGl0b3IiLHQuY29udGVudCx0KX0pO3oub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe2lmKHQuc2V0KXt6LmV4ZWNDYWxsYmFjaygiY2xlYW51cF9jYWxsYmFjayIsImluc2VydF90b19lZGl0b3JfZG9tIix0Lm5vZGUsdCl9aWYodC5nZXQpe3ouZXhlY0NhbGxiYWNrKCJjbGVhbnVwX2NhbGxiYWNrIiwiZ2V0X2Zyb21fZWRpdG9yX2RvbSIsdC5ub2RlLHQpfX0pO3oub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24ocyx0KXtpZih0LnNldCl7dC5jb250ZW50PXouZXhlY0NhbGxiYWNrKCJjbGVhbnVwX2NhbGxiYWNrIiwiaW5zZXJ0X3RvX2VkaXRvciIsdC5jb250ZW50LHQpfWlmKHQuZ2V0KXt0LmNvbnRlbnQ9ei5leGVjQ2FsbGJhY2soImNsZWFudXBfY2FsbGJhY2siLCJnZXRfZnJvbV9lZGl0b3IiLHQuY29udGVudCx0KX19KX1pZihBLnNhdmVfY2FsbGJhY2spe3oub25HZXRDb250ZW50LmFkZChmdW5jdGlvbihzLHQpe2lmKHQuc2F2ZSl7dC5jb250ZW50PXouZXhlY0NhbGxiYWNrKCJzYXZlX2NhbGxiYWNrIix6LmlkLHQuY29udGVudCx6LmdldEJvZHkoKSl9fSl9aWYoQS5oYW5kbGVfZXZlbnRfY2FsbGJhY2spe3oub25FdmVudC5hZGQoZnVuY3Rpb24ocyx0LEIpe2lmKHouZXhlY0NhbGxiYWNrKCJoYW5kbGVfZXZlbnRfY2FsbGJhY2siLHQscyxCKT09PWZhbHNlKXtqLmNhbmNlbCh0KX19KX16Lm9uU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oKXt6LmFkZFZpc3VhbCh6LmdldEJvZHkoKSl9KTtpZihBLnBhZGRfZW1wdHlfZWRpdG9yKXt6Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKHMsdCl7dC5jb250ZW50PXQuY29udGVudC5yZXBsYWNlKC9eKDxwW14+XSo+KCZuYnNwO3wmIzE2MDt8XHN8XHUwMGEwfCk8XC9wPltcclxuXSp8PGJyIFwvPltcclxuXSopJC8sIiIpfSl9aWYoYSl7ZnVuY3Rpb24gcChzLHQpe2kocy5kb20uc2VsZWN0KCJhIiksZnVuY3Rpb24oQyl7dmFyIEI9Qy5wYXJlbnROb2RlO2lmKHMuZG9tLmlzQmxvY2soQikmJkIubGFzdENoaWxkPT09Qyl7cy5kb20uYWRkKEIsImJyIix7X21jZV9ib2d1czoxfSl9fSl9ei5vbkV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihzLHQpe2lmKHQ9PT0iQ3JlYXRlTGluayIpe3Aocyl9fSk7ei5vblNldENvbnRlbnQuYWRkKHouc2VsZWN0aW9uLm9uU2V0Q29udGVudC5hZGQocCkpO2lmKCFBLnJlYWRvbmx5KXt0cnl7dS5kZXNpZ25Nb2RlPSJPZmYiO3UuZGVzaWduTW9kZT0iT24ifWNhdGNoKHYpe319fXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZih6LnJlbW92ZWQpe3JldHVybn16LmxvYWQoe2luaXRpYWw6dHJ1ZSxmb3JtYXQ6KEEuY2xlYW51cF9vbl9zdGFydHVwPyJodG1sIjoicmF3Iil9KTt6LnN0YXJ0Q29udGVudD16LmdldENvbnRlbnQoe2Zvcm1hdDoicmF3In0pO3ouaW5pdGlhbGl6ZWQ9dHJ1ZTt6Lm9uSW5pdC5kaXNwYXRjaCh6KTt6LmV4ZWNDYWxsYmFjaygic2V0dXBjb250ZW50X2NhbGxiYWNrIix6LmlkLHouZ2V0Qm9keSgpLHouZ2V0RG9jKCkpO3ouZXhlY0NhbGxiYWNrKCJpbml0X2luc3RhbmNlX2NhbGxiYWNrIix6KTt6LmZvY3VzKHRydWUpO3oubm9kZUNoYW5nZWQoe2luaXRpYWw6MX0pO2lmKEEuY29udGVudF9jc3Mpe20uZWFjaChnKEEuY29udGVudF9jc3MpLGZ1bmN0aW9uKHMpe3ouZG9tLmxvYWRDU1Moei5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShzKSl9KX1pZihBLmF1dG9fZm9jdXMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgcz1tLmdldChBLmF1dG9fZm9jdXMpO3Muc2VsZWN0aW9uLnNlbGVjdChzLmdldEJvZHkoKSwxKTtzLnNlbGVjdGlvbi5jb2xsYXBzZSgxKTtzLmdldFdpbigpLmZvY3VzKCl9LDEwMCl9fSwxKTtyPW51bGx9LGZvY3VzOmZ1bmN0aW9uKHMpe3ZhciB4LHE9dGhpcyx2PXEuc2V0dGluZ3MuY29udGVudF9lZGl0YWJsZSxyLHAsdT1xLmdldERvYygpO2lmKCFzKXtyPXEuc2VsZWN0aW9uLmdldFJuZygpO2lmKHIuaXRlbSl7cD1yLml0ZW0oMCl9aWYoIXYpe3EuZ2V0V2luKCkuZm9jdXMoKX1pZihwJiZwLm93bmVyRG9jdW1lbnQ9PXUpe3I9dS5ib2R5LmNyZWF0ZUNvbnRyb2xSYW5nZSgpO3IuYWRkRWxlbWVudChwKTtyLnNlbGVjdCgpfX1pZihtLmFjdGl2ZUVkaXRvciE9cSl7aWYoKHg9bS5hY3RpdmVFZGl0b3IpIT1udWxsKXt4Lm9uRGVhY3RpdmF0ZS5kaXNwYXRjaCh4LHEpfXEub25BY3RpdmF0ZS5kaXNwYXRjaChxLHgpfW0uX3NldEFjdGl2ZShxKX0sZXhlY0NhbGxiYWNrOmZ1bmN0aW9uKHUpe3ZhciBwPXRoaXMscj1wLnNldHRpbmdzW3VdLHE7aWYoIXIpe3JldHVybn1pZihwLmNhbGxiYWNrTG9va3VwJiYocT1wLmNhbGxiYWNrTG9va3VwW3VdKSl7cj1xLmZ1bmM7cT1xLnNjb3BlfWlmKGQociwic3RyaW5nIikpe3E9ci5yZXBsYWNlKC9cLlx3KyQvLCIiKTtxPXE/bS5yZXNvbHZlKHEpOjA7cj1tLnJlc29sdmUocik7cC5jYWxsYmFja0xvb2t1cD1wLmNhbGxiYWNrTG9va3VwfHx7fTtwLmNhbGxiYWNrTG9va3VwW3VdPXtmdW5jOnIsc2NvcGU6cX19cmV0dXJuIHIuYXBwbHkocXx8cCxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24ocCl7dmFyIHI9dGhpcy5zZXR0aW5ncy5sYW5ndWFnZXx8ImVuIixxPW0uaTE4bjtpZighcCl7cmV0dXJuIiJ9cmV0dXJuIHFbcisiLiIrcF18fHAucmVwbGFjZSgve1wjKFtefV0rKVx9L2csZnVuY3Rpb24odCxzKXtyZXR1cm4gcVtyKyIuIitzXXx8InsjIitzKyJ9In0pfSxnZXRMYW5nOmZ1bmN0aW9uKHEscCl7cmV0dXJuIG0uaTE4blsodGhpcy5zZXR0aW5ncy5sYW5ndWFnZXx8ImVuIikrIi4iK3FdfHwoZChwKT9wOiJ7IyIrcSsifSIpfSxnZXRQYXJhbTpmdW5jdGlvbih1LHIscCl7dmFyIHM9bS50cmltLHE9ZCh0aGlzLnNldHRpbmdzW3VdKT90aGlzLnNldHRpbmdzW3VdOnIsdDtpZihwPT09Imhhc2giKXt0PXt9O2lmKGQocSwic3RyaW5nIikpe2kocS5pbmRleE9mKCI9Iik+MD9xLnNwbGl0KC9bOyxdKD8hW149OyxdKig/Ols7LF18JCkpLyk6cS5zcGxpdCgiLCIpLGZ1bmN0aW9uKHgpe3g9eC5zcGxpdCgiPSIpO2lmKHgubGVuZ3RoPjEpe3Rbcyh4WzBdKV09cyh4WzFdKX1lbHNle3Rbcyh4WzBdKV09cyh4KX19KX1lbHNle3Q9cX1yZXR1cm4gdH1yZXR1cm4gcX0sbm9kZUNoYW5nZWQ6ZnVuY3Rpb24ocil7dmFyIHA9dGhpcyxxPXAuc2VsZWN0aW9uLHU9KGI/cS5nZXROb2RlKCk6cS5nZXRTdGFydCgpKXx8cC5nZXRCb2R5KCk7aWYocC5pbml0aWFsaXplZCl7cj1yfHx7fTt1PWImJnUub3duZXJEb2N1bWVudCE9cC5nZXREb2MoKT9wLmdldEJvZHkoKTp1O3IucGFyZW50cz1bXTtwLmRvbS5nZXRQYXJlbnQodSxmdW5jdGlvbihzKXtpZihzLm5vZGVOYW1lPT0iQk9EWSIpe3JldHVybiB0cnVlfXIucGFyZW50cy5wdXNoKHMpfSk7cC5vbk5vZGVDaGFuZ2UuZGlzcGF0Y2gocCxyP3IuY29udHJvbE1hbmFnZXJ8fHAuY29udHJvbE1hbmFnZXI6cC5jb250cm9sTWFuYWdlcix1LHEuaXNDb2xsYXBzZWQoKSxyKX19LGFkZEJ1dHRvbjpmdW5jdGlvbihyLHEpe3ZhciBwPXRoaXM7cC5idXR0b25zPXAuYnV0dG9uc3x8e307cC5idXR0b25zW3JdPXF9LGFkZENvbW1hbmQ6ZnVuY3Rpb24ocixxLHApe3RoaXMuZXhlY0NvbW1hbmRzW3JdPXtmdW5jOnEsc2NvcGU6cHx8dGhpc319LGFkZFF1ZXJ5U3RhdGVIYW5kbGVyOmZ1bmN0aW9uKHIscSxwKXt0aGlzLnF1ZXJ5U3RhdGVDb21tYW5kc1tyXT17ZnVuYzpxLHNjb3BlOnB8fHRoaXN9fSxhZGRRdWVyeVZhbHVlSGFuZGxlcjpmdW5jdGlvbihyLHEscCl7dGhpcy5xdWVyeVZhbHVlQ29tbWFuZHNbcl09e2Z1bmM6cSxzY29wZTpwfHx0aGlzfX0sYWRkU2hvcnRjdXQ6ZnVuY3Rpb24ocix1LHAscyl7dmFyIHE9dGhpcyx2O2lmKCFxLnNldHRpbmdzLmN1c3RvbV9zaG9ydGN1dHMpe3JldHVybiBmYWxzZX1xLnNob3J0Y3V0cz1xLnNob3J0Y3V0c3x8e307aWYoZChwLCJzdHJpbmciKSl7dj1wO3A9ZnVuY3Rpb24oKXtxLmV4ZWNDb21tYW5kKHYsZmFsc2UsbnVsbCl9fWlmKGQocCwib2JqZWN0Iikpe3Y9cDtwPWZ1bmN0aW9uKCl7cS5leGVjQ29tbWFuZCh2WzBdLHZbMV0sdlsyXSl9fWkoZyhyKSxmdW5jdGlvbih0KXt2YXIgeD17ZnVuYzpwLHNjb3BlOnN8fHRoaXMsZGVzYzp1LGFsdDpmYWxzZSxjdHJsOmZhbHNlLHNoaWZ0OmZhbHNlfTtpKGcodCwiKyIpLGZ1bmN0aW9uKHkpe3N3aXRjaCh5KXtjYXNlImFsdCI6Y2FzZSJjdHJsIjpjYXNlInNoaWZ0Ijp4W3ldPXRydWU7YnJlYWs7ZGVmYXVsdDp4LmNoYXJDb2RlPXkuY2hhckNvZGVBdCgwKTt4LmtleUNvZGU9eS50b1VwcGVyQ2FzZSgpLmNoYXJDb2RlQXQoMCl9fSk7cS5zaG9ydGN1dHNbKHguY3RybD8iY3RybCI6IiIpKyIsIisoeC5hbHQ/ImFsdCI6IiIpKyIsIisoeC5zaGlmdD8ic2hpZnQiOiIiKSsiLCIreC5rZXlDb2RlXT14fSk7cmV0dXJuIHRydWV9LGV4ZWNDb21tYW5kOmZ1bmN0aW9uKHgsdix6LHApe3ZhciByPXRoaXMsdT0wLHkscTtpZighL14obWNlQWRkVW5kb0xldmVsfG1jZUVuZFVuZG9MZXZlbHxtY2VCZWdpblVuZG9MZXZlbHxtY2VSZXBhaW50fFNlbGVjdEFsbCkkLy50ZXN0KHgpJiYoIXB8fCFwLnNraXBfZm9jdXMpKXtyLmZvY3VzKCl9eT17fTtyLm9uQmVmb3JlRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseix5KTtpZih5LnRlcm1pbmF0ZSl7cmV0dXJuIGZhbHNlfWlmKHIuZXhlY0NhbGxiYWNrKCJleGVjY29tbWFuZF9jYWxsYmFjayIsci5pZCxyLnNlbGVjdGlvbi5nZXROb2RlKCkseCx2LHopKXtyLm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseixwKTtyZXR1cm4gdHJ1ZX1pZih5PXIuZXhlY0NvbW1hbmRzW3hdKXtxPXkuZnVuYy5jYWxsKHkuc2NvcGUsdix6KTtpZihxIT09dHJ1ZSl7ci5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHIseCx2LHoscCk7cmV0dXJuIHF9fWkoci5wbHVnaW5zLGZ1bmN0aW9uKHMpe2lmKHMuZXhlY0NvbW1hbmQmJnMuZXhlY0NvbW1hbmQoeCx2LHopKXtyLm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseixwKTt1PTE7cmV0dXJuIGZhbHNlfX0pO2lmKHUpe3JldHVybiB0cnVlfWlmKHIudGhlbWUmJnIudGhlbWUuZXhlY0NvbW1hbmQmJnIudGhlbWUuZXhlY0NvbW1hbmQoeCx2LHopKXtyLm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseixwKTtyZXR1cm4gdHJ1ZX1pZihtLkdsb2JhbENvbW1hbmRzLmV4ZWNDb21tYW5kKHIseCx2LHopKXtyLm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseixwKTtyZXR1cm4gdHJ1ZX1pZihyLmVkaXRvckNvbW1hbmRzLmV4ZWNDb21tYW5kKHgsdix6KSl7ci5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHIseCx2LHoscCk7cmV0dXJuIHRydWV9ci5nZXREb2MoKS5leGVjQ29tbWFuZCh4LHYseik7ci5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHIseCx2LHoscCl9LHF1ZXJ5Q29tbWFuZFN0YXRlOmZ1bmN0aW9uKHUpe3ZhciBxPXRoaXMsdixyO2lmKHEuX2lzSGlkZGVuKCkpe3JldHVybn1pZih2PXEucXVlcnlTdGF0ZUNvbW1hbmRzW3VdKXtyPXYuZnVuYy5jYWxsKHYuc2NvcGUpO2lmKHIhPT10cnVlKXtyZXR1cm4gcn19dj1xLmVkaXRvckNvbW1hbmRzLnF1ZXJ5Q29tbWFuZFN0YXRlKHUpO2lmKHYhPT0tMSl7cmV0dXJuIHZ9dHJ5e3JldHVybiB0aGlzLmdldERvYygpLnF1ZXJ5Q29tbWFuZFN0YXRlKHUpfWNhdGNoKHApe319LHF1ZXJ5Q29tbWFuZFZhbHVlOmZ1bmN0aW9uKHYpe3ZhciBxPXRoaXMsdSxyO2lmKHEuX2lzSGlkZGVuKCkpe3JldHVybn1pZih1PXEucXVlcnlWYWx1ZUNvbW1hbmRzW3ZdKXtyPXUuZnVuYy5jYWxsKHUuc2NvcGUpO2lmKHIhPT10cnVlKXtyZXR1cm4gcn19dT1xLmVkaXRvckNvbW1hbmRzLnF1ZXJ5Q29tbWFuZFZhbHVlKHYpO2lmKGQodSkpe3JldHVybiB1fXRyeXtyZXR1cm4gdGhpcy5nZXREb2MoKS5xdWVyeUNvbW1hbmRWYWx1ZSh2KX1jYXRjaChwKXt9fSxzaG93OmZ1bmN0aW9uKCl7dmFyIHA9dGhpcztuLnNob3cocC5nZXRDb250YWluZXIoKSk7bi5oaWRlKHAuaWQpO3AubG9hZCgpfSxoaWRlOmZ1bmN0aW9uKCl7dmFyIHA9dGhpcyxxPXAuZ2V0RG9jKCk7aWYoYiYmcSl7cS5leGVjQ29tbWFuZCgiU2VsZWN0QWxsIil9cC5zYXZlKCk7bi5oaWRlKHAuZ2V0Q29udGFpbmVyKCkpO24uc2V0U3R5bGUocC5pZCwiZGlzcGxheSIscC5vcmdEaXNwbGF5KX0saXNIaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4gIW4uaXNIaWRkZW4odGhpcy5pZCl9LHNldFByb2dyZXNzU3RhdGU6ZnVuY3Rpb24ocCxxLHIpe3RoaXMub25TZXRQcm9ncmVzc1N0YXRlLmRpc3BhdGNoKHRoaXMscCxxLHIpO3JldHVybiBwfSxsb2FkOmZ1bmN0aW9uKHMpe3ZhciBwPXRoaXMscj1wLmdldEVsZW1lbnQoKSxxO2lmKHIpe3M9c3x8e307cy5sb2FkPXRydWU7cT1wLnNldENvbnRlbnQoZChyLnZhbHVlKT9yLnZhbHVlOnIuaW5uZXJIVE1MLHMpO3MuZWxlbWVudD1yO2lmKCFzLm5vX2V2ZW50cyl7cC5vbkxvYWRDb250ZW50LmRpc3BhdGNoKHAscyl9cy5lbGVtZW50PXI9bnVsbDtyZXR1cm4gcX19LHNhdmU6ZnVuY3Rpb24odSl7dmFyIHA9dGhpcyxzPXAuZ2V0RWxlbWVudCgpLHEscjtpZighc3x8IXAuaW5pdGlhbGl6ZWQpe3JldHVybn11PXV8fHt9O3Uuc2F2ZT10cnVlO2lmKCF1Lm5vX2V2ZW50cyl7cC51bmRvTWFuYWdlci50eXBpbmc9MDtwLnVuZG9NYW5hZ2VyLmFkZCgpfXUuZWxlbWVudD1zO3E9dS5jb250ZW50PXAuZ2V0Q29udGVudCh1KTtpZighdS5ub19ldmVudHMpe3Aub25TYXZlQ29udGVudC5kaXNwYXRjaChwLHUpfXE9dS5jb250ZW50O2lmKCEvVEVYVEFSRUF8SU5QVVQvaS50ZXN0KHMubm9kZU5hbWUpKXtzLmlubmVySFRNTD1xO2lmKHI9bi5nZXRQYXJlbnQocC5pZCwiZm9ybSIpKXtpKHIuZWxlbWVudHMsZnVuY3Rpb24odCl7aWYodC5uYW1lPT1wLmlkKXt0LnZhbHVlPXE7cmV0dXJuIGZhbHNlfX0pfX1lbHNle3MudmFsdWU9cX11LmVsZW1lbnQ9cz1udWxsO3JldHVybiBxfSxzZXRDb250ZW50OmZ1bmN0aW9uKHEscil7dmFyIHA9dGhpcztyPXJ8fHt9O3IuZm9ybWF0PXIuZm9ybWF0fHwiaHRtbCI7ci5zZXQ9dHJ1ZTtyLmNvbnRlbnQ9cTtpZighci5ub19ldmVudHMpe3Aub25CZWZvcmVTZXRDb250ZW50LmRpc3BhdGNoKHAscil9aWYoIW0uaXNJRSYmKHEubGVuZ3RoPT09MHx8L15ccyskLy50ZXN0KHEpKSl7ci5jb250ZW50PXAuZG9tLnNldEhUTUwocC5nZXRCb2R5KCksJzxiciBfbWNlX2JvZ3VzPSIxIiAvPicpO3IuZm9ybWF0PSJyYXcifXIuY29udGVudD1wLmRvbS5zZXRIVE1MKHAuZ2V0Qm9keSgpLG0udHJpbShyLmNvbnRlbnQpKTtpZihyLmZvcm1hdCE9InJhdyImJnAuc2V0dGluZ3MuY2xlYW51cCl7ci5nZXRJbm5lcj10cnVlO3IuY29udGVudD1wLmRvbS5zZXRIVE1MKHAuZ2V0Qm9keSgpLHAuc2VyaWFsaXplci5zZXJpYWxpemUocC5nZXRCb2R5KCkscikpfWlmKCFyLm5vX2V2ZW50cyl7cC5vblNldENvbnRlbnQuZGlzcGF0Y2gocCxyKX1yZXR1cm4gci5jb250ZW50fSxnZXRDb250ZW50OmZ1bmN0aW9uKHIpe3ZhciBwPXRoaXMscTtyPXJ8fHt9O3IuZm9ybWF0PXIuZm9ybWF0fHwiaHRtbCI7ci5nZXQ9dHJ1ZTtpZighci5ub19ldmVudHMpe3Aub25CZWZvcmVHZXRDb250ZW50LmRpc3BhdGNoKHAscil9aWYoci5mb3JtYXQhPSJyYXciJiZwLnNldHRpbmdzLmNsZWFudXApe3IuZ2V0SW5uZXI9dHJ1ZTtxPXAuc2VyaWFsaXplci5zZXJpYWxpemUocC5nZXRCb2R5KCkscil9ZWxzZXtxPXAuZ2V0Qm9keSgpLmlubmVySFRNTH1xPXEucmVwbGFjZSgvXlxzKnxccyokL2csIiIpO3IuY29udGVudD1xO2lmKCFyLm5vX2V2ZW50cyl7cC5vbkdldENvbnRlbnQuZGlzcGF0Y2gocCxyKX1yZXR1cm4gci5jb250ZW50fSxpc0RpcnR5OmZ1bmN0aW9uKCl7dmFyIHA9dGhpcztyZXR1cm4gbS50cmltKHAuc3RhcnRDb250ZW50KSE9bS50cmltKHAuZ2V0Q29udGVudCh7Zm9ybWF0OiJyYXciLG5vX2V2ZW50czoxfSkpJiYhcC5pc05vdERpcnR5fSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXt2YXIgcD10aGlzO2lmKCFwLmNvbnRhaW5lcil7cC5jb250YWluZXI9bi5nZXQocC5lZGl0b3JDb250YWluZXJ8fHAuaWQrIl9wYXJlbnQiKX1yZXR1cm4gcC5jb250YWluZXJ9LGdldENvbnRlbnRBcmVhQ29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudEFyZWFDb250YWluZXJ9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5nZXQodGhpcy5zZXR0aW5ncy5jb250ZW50X2VsZW1lbnR8fHRoaXMuaWQpfSxnZXRXaW46ZnVuY3Rpb24oKXt2YXIgcD10aGlzLHE7aWYoIXAuY29udGVudFdpbmRvdyl7cT1uLmdldChwLmlkKyJfaWZyIik7aWYocSl7cC5jb250ZW50V2luZG93PXEuY29udGVudFdpbmRvd319cmV0dXJuIHAuY29udGVudFdpbmRvd30sZ2V0RG9jOmZ1bmN0aW9uKCl7dmFyIHE9dGhpcyxwO2lmKCFxLmNvbnRlbnREb2N1bWVudCl7cD1xLmdldFdpbigpO2lmKHApe3EuY29udGVudERvY3VtZW50PXAuZG9jdW1lbnR9fXJldHVybiBxLmNvbnRlbnREb2N1bWVudH0sZ2V0Qm9keTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvZHlFbGVtZW50fHx0aGlzLmdldERvYygpLmJvZHl9LGNvbnZlcnRVUkw6ZnVuY3Rpb24ocCx4LHYpe3ZhciBxPXRoaXMscj1xLnNldHRpbmdzO2lmKHIudXJsY29udmVydGVyX2NhbGxiYWNrKXtyZXR1cm4gcS5leGVjQ2FsbGJhY2soInVybGNvbnZlcnRlcl9jYWxsYmFjayIscCx2LHRydWUseCl9aWYoIXIuY29udmVydF91cmxzfHwodiYmdi5ub2RlTmFtZT09IkxJTksiKXx8cC5pbmRleE9mKCJmaWxlOiIpPT09MCl7cmV0dXJuIHB9aWYoci5yZWxhdGl2ZV91cmxzKXtyZXR1cm4gcS5kb2N1bWVudEJhc2VVUkkudG9SZWxhdGl2ZShwKX1wPXEuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUocCxyLnJlbW92ZV9zY3JpcHRfaG9zdCk7cmV0dXJuIHB9LGFkZFZpc3VhbDpmdW5jdGlvbihyKXt2YXIgcD10aGlzLHE9cC5zZXR0aW5ncztyPXJ8fHAuZ2V0Qm9keSgpO2lmKCFkKHAuaGFzVmlzdWFsKSl7cC5oYXNWaXN1YWw9cS52aXN1YWx9aShwLmRvbS5zZWxlY3QoInRhYmxlLGEiLHIpLGZ1bmN0aW9uKHQpe3ZhciBzO3N3aXRjaCh0Lm5vZGVOYW1lKXtjYXNlIlRBQkxFIjpzPXAuZG9tLmdldEF0dHJpYih0LCJib3JkZXIiKTtpZighc3x8cz09IjAiKXtpZihwLmhhc1Zpc3VhbCl7cC5kb20uYWRkQ2xhc3ModCxxLnZpc3VhbF90YWJsZV9jbGFzcyl9ZWxzZXtwLmRvbS5yZW1vdmVDbGFzcyh0LHEudmlzdWFsX3RhYmxlX2NsYXNzKX19cmV0dXJuO2Nhc2UiQSI6cz1wLmRvbS5nZXRBdHRyaWIodCwibmFtZSIpO2lmKHMpe2lmKHAuaGFzVmlzdWFsKXtwLmRvbS5hZGRDbGFzcyh0LCJtY2VJdGVtQW5jaG9yIil9ZWxzZXtwLmRvbS5yZW1vdmVDbGFzcyh0LCJtY2VJdGVtQW5jaG9yIil9fXJldHVybn19KTtwLm9uVmlzdWFsQWlkLmRpc3BhdGNoKHAscixwLmhhc1Zpc3VhbCl9LHJlbW92ZTpmdW5jdGlvbigpe3ZhciBwPXRoaXMscT1wLmdldENvbnRhaW5lcigpO3AucmVtb3ZlZD0xO3AuaGlkZSgpO3AuZXhlY0NhbGxiYWNrKCJyZW1vdmVfaW5zdGFuY2VfY2FsbGJhY2siLHApO3Aub25SZW1vdmUuZGlzcGF0Y2gocCk7cC5vbkV4ZWNDb21tYW5kLmxpc3RlbmVycz1bXTttLnJlbW92ZShwKTtuLnJlbW92ZShxKX0sZGVzdHJveTpmdW5jdGlvbihxKXt2YXIgcD10aGlzO2lmKHAuZGVzdHJveWVkKXtyZXR1cm59aWYoIXEpe20ucmVtb3ZlVW5sb2FkKHAuZGVzdHJveSk7dGlueU1DRS5vbkJlZm9yZVVubG9hZC5yZW1vdmUocC5fYmVmb3JlVW5sb2FkKTtpZihwLnRoZW1lJiZwLnRoZW1lLmRlc3Ryb3kpe3AudGhlbWUuZGVzdHJveSgpfXAuY29udHJvbE1hbmFnZXIuZGVzdHJveSgpO3Auc2VsZWN0aW9uLmRlc3Ryb3koKTtwLmRvbS5kZXN0cm95KCk7aWYoIXAuc2V0dGluZ3MuY29udGVudF9lZGl0YWJsZSl7ai5jbGVhcihwLmdldFdpbigpKTtqLmNsZWFyKHAuZ2V0RG9jKCkpfWouY2xlYXIocC5nZXRCb2R5KCkpO2ouY2xlYXIocC5mb3JtRWxlbWVudCl9aWYocC5mb3JtRWxlbWVudCl7cC5mb3JtRWxlbWVudC5zdWJtaXQ9cC5mb3JtRWxlbWVudC5fbWNlT2xkU3VibWl0O3AuZm9ybUVsZW1lbnQuX21jZU9sZFN1Ym1pdD1udWxsfXAuY29udGVudEFyZWFDb250YWluZXI9cC5mb3JtRWxlbWVudD1wLmNvbnRhaW5lcj1wLnNldHRpbmdzLmNvbnRlbnRfZWxlbWVudD1wLmJvZHlFbGVtZW50PXAuY29udGVudERvY3VtZW50PXAuY29udGVudFdpbmRvdz1udWxsO2lmKHAuc2VsZWN0aW9uKXtwLnNlbGVjdGlvbj1wLnNlbGVjdGlvbi53aW49cC5zZWxlY3Rpb24uZG9tPXAuc2VsZWN0aW9uLmRvbS5kb2M9bnVsbH1wLmRlc3Ryb3llZD0xfSxfYWRkRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcyxyLEE9ei5zZXR0aW5ncyxxPXouZG9tLHg9e21vdXNldXA6Im9uTW91c2VVcCIsbW91c2Vkb3duOiJvbk1vdXNlRG93biIsY2xpY2s6Im9uQ2xpY2siLGtleXVwOiJvbktleVVwIixrZXlkb3duOiJvbktleURvd24iLGtleXByZXNzOiJvbktleVByZXNzIixzdWJtaXQ6Im9uU3VibWl0IixyZXNldDoib25SZXNldCIsY29udGV4dG1lbnU6Im9uQ29udGV4dE1lbnUiLGRibGNsaWNrOiJvbkRibENsaWNrIixwYXN0ZToib25QYXN0ZSJ9O2Z1bmN0aW9uIHAodCxCKXt2YXIgcz10LnR5cGU7aWYoei5yZW1vdmVkKXtyZXR1cm59aWYoei5vbkV2ZW50LmRpc3BhdGNoKHosdCxCKSE9PWZhbHNlKXt6W3hbdC5mYWtlVHlwZXx8dC50eXBlXV0uZGlzcGF0Y2goeix0LEIpfX1pKHgsZnVuY3Rpb24odCxzKXtzd2l0Y2gocyl7Y2FzZSJjb250ZXh0bWVudSI6aWYobS5pc09wZXJhKXtxLmJpbmQoei5nZXRCb2R5KCksIm1vdXNlZG93biIsZnVuY3Rpb24oQil7aWYoQi5jdHJsS2V5KXtCLmZha2VUeXBlPSJjb250ZXh0bWVudSI7cChCKX19KX1lbHNle3EuYmluZCh6LmdldEJvZHkoKSxzLHApfWJyZWFrO2Nhc2UicGFzdGUiOnEuYmluZCh6LmdldEJvZHkoKSxzLGZ1bmN0aW9uKEIpe3AoQil9KTticmVhaztjYXNlInN1Ym1pdCI6Y2FzZSJyZXNldCI6cS5iaW5kKHouZ2V0RWxlbWVudCgpLmZvcm18fG4uZ2V0UGFyZW50KHouaWQsImZvcm0iKSxzLHApO2JyZWFrO2RlZmF1bHQ6cS5iaW5kKEEuY29udGVudF9lZGl0YWJsZT96LmdldEJvZHkoKTp6LmdldERvYygpLHMscCl9fSk7cS5iaW5kKEEuY29udGVudF9lZGl0YWJsZT96LmdldEJvZHkoKTooYT96LmdldERvYygpOnouZ2V0V2luKCkpLCJmb2N1cyIsZnVuY3Rpb24ocyl7ei5mb2N1cyh0cnVlKX0pO2lmKG0uaXNHZWNrbyl7cS5iaW5kKHouZ2V0RG9jKCksIkRPTU5vZGVJbnNlcnRlZCIsZnVuY3Rpb24odCl7dmFyIHM7dD10LnRhcmdldDtpZih0Lm5vZGVUeXBlPT09MSYmdC5ub2RlTmFtZT09PSJJTUciJiYocz10LmdldEF0dHJpYnV0ZSgiX21jZV9zcmMiKSkpe3Quc3JjPXouZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUocyl9fSl9aWYoYSl7ZnVuY3Rpb24gdSgpe3ZhciBDPXRoaXMsRT1DLmdldERvYygpLEQ9Qy5zZXR0aW5ncztpZihhJiYhRC5yZWFkb25seSl7aWYoQy5faXNIaWRkZW4oKSl7dHJ5e2lmKCFELmNvbnRlbnRfZWRpdGFibGUpe0UuZGVzaWduTW9kZT0iT24ifX1jYXRjaChCKXt9fXRyeXtFLmV4ZWNDb21tYW5kKCJzdHlsZVdpdGhDU1MiLDAsZmFsc2UpfWNhdGNoKEIpe2lmKCFDLl9pc0hpZGRlbigpKXt0cnl7RS5leGVjQ29tbWFuZCgidXNlQ1NTIiwwLHRydWUpfWNhdGNoKEIpe319fWlmKCFELnRhYmxlX2lubGluZV9lZGl0aW5nKXt0cnl7RS5leGVjQ29tbWFuZCgiZW5hYmxlSW5saW5lVGFibGVFZGl0aW5nIixmYWxzZSxmYWxzZSl9Y2F0Y2goQil7fX1pZighRC5vYmplY3RfcmVzaXppbmcpe3RyeXtFLmV4ZWNDb21tYW5kKCJlbmFibGVPYmplY3RSZXNpemluZyIsZmFsc2UsZmFsc2UpfWNhdGNoKEIpe319fX16Lm9uQmVmb3JlRXhlY0NvbW1hbmQuYWRkKHUpO3oub25Nb3VzZURvd24uYWRkKHUpfWlmKG0uaXNXZWJLaXQpe3oub25DbGljay5hZGQoZnVuY3Rpb24ocyx0KXt0PXQudGFyZ2V0O2lmKHQubm9kZU5hbWU9PSJJTUcifHwodC5ub2RlTmFtZT09IkEiJiZxLmhhc0NsYXNzKHQsIm1jZUl0ZW1BbmNob3IiKSkpe3ouc2VsZWN0aW9uLmdldFNlbCgpLnNldEJhc2VBbmRFeHRlbnQodCwwLHQsMSk7ei5ub2RlQ2hhbmdlZCgpfX0pfXoub25Nb3VzZVVwLmFkZCh6Lm5vZGVDaGFuZ2VkKTt6Lm9uS2V5VXAuYWRkKGZ1bmN0aW9uKHMsdCl7dmFyIEI9dC5rZXlDb2RlO2lmKChCPj0zMyYmQjw9MzYpfHwoQj49MzcmJkI8PTQwKXx8Qj09MTN8fEI9PTQ1fHxCPT00Nnx8Qj09OHx8KG0uaXNNYWMmJihCPT05MXx8Qj09OTMpKXx8dC5jdHJsS2V5KXt6Lm5vZGVDaGFuZ2VkKCl9fSk7ei5vblJlc2V0LmFkZChmdW5jdGlvbigpe3ouc2V0Q29udGVudCh6LnN0YXJ0Q29udGVudCx7Zm9ybWF0OiJyYXcifSl9KTtpZihBLmN1c3RvbV9zaG9ydGN1dHMpe2lmKEEuY3VzdG9tX3VuZG9fcmVkb19rZXlib2FyZF9zaG9ydGN1dHMpe3ouYWRkU2hvcnRjdXQoImN0cmwreiIsei5nZXRMYW5nKCJ1bmRvX2Rlc2MiKSwiVW5kbyIpO3ouYWRkU2hvcnRjdXQoImN0cmwreSIsei5nZXRMYW5nKCJyZWRvX2Rlc2MiKSwiUmVkbyIpfXouYWRkU2hvcnRjdXQoImN0cmwrYiIsei5nZXRMYW5nKCJib2xkX2Rlc2MiKSwiQm9sZCIpO3ouYWRkU2hvcnRjdXQoImN0cmwraSIsei5nZXRMYW5nKCJpdGFsaWNfZGVzYyIpLCJJdGFsaWMiKTt6LmFkZFNob3J0Y3V0KCJjdHJsK3UiLHouZ2V0TGFuZygidW5kZXJsaW5lX2Rlc2MiKSwiVW5kZXJsaW5lIik7Zm9yKHI9MTtyPD02O3IrKyl7ei5hZGRTaG9ydGN1dCgiY3RybCsiK3IsIiIsWyJGb3JtYXRCbG9jayIsZmFsc2UsImgiK3JdKX16LmFkZFNob3J0Y3V0KCJjdHJsKzciLCIiLFsiRm9ybWF0QmxvY2siLGZhbHNlLCI8cD4iXSk7ei5hZGRTaG9ydGN1dCgiY3RybCs4IiwiIixbIkZvcm1hdEJsb2NrIixmYWxzZSwiPGRpdj4iXSk7ei5hZGRTaG9ydGN1dCgiY3RybCs5IiwiIixbIkZvcm1hdEJsb2NrIixmYWxzZSwiPGFkZHJlc3M+Il0pO2Z1bmN0aW9uIHYodCl7dmFyIHM9bnVsbDtpZighdC5hbHRLZXkmJiF0LmN0cmxLZXkmJiF0Lm1ldGFLZXkpe3JldHVybiBzfWkoei5zaG9ydGN1dHMsZnVuY3Rpb24oQil7aWYobS5pc01hYyYmQi5jdHJsIT10Lm1ldGFLZXkpe3JldHVybn1lbHNle2lmKCFtLmlzTWFjJiZCLmN0cmwhPXQuY3RybEtleSl7cmV0dXJufX1pZihCLmFsdCE9dC5hbHRLZXkpe3JldHVybn1pZihCLnNoaWZ0IT10LnNoaWZ0S2V5KXtyZXR1cm59aWYodC5rZXlDb2RlPT1CLmtleUNvZGV8fCh0LmNoYXJDb2RlJiZ0LmNoYXJDb2RlPT1CLmNoYXJDb2RlKSl7cz1CO3JldHVybiBmYWxzZX19KTtyZXR1cm4gc316Lm9uS2V5VXAuYWRkKGZ1bmN0aW9uKHMsdCl7dmFyIEI9dih0KTtpZihCKXtyZXR1cm4gai5jYW5jZWwodCl9fSk7ei5vbktleVByZXNzLmFkZChmdW5jdGlvbihzLHQpe3ZhciBCPXYodCk7aWYoQil7cmV0dXJuIGouY2FuY2VsKHQpfX0pO3oub25LZXlEb3duLmFkZChmdW5jdGlvbihzLHQpe3ZhciBCPXYodCk7aWYoQil7Qi5mdW5jLmNhbGwoQi5zY29wZSk7cmV0dXJuIGouY2FuY2VsKHQpfX0pfWlmKG0uaXNJRSl7cS5iaW5kKHouZ2V0RG9jKCksImNvbnRyb2xzZWxlY3QiLGZ1bmN0aW9uKEIpe3ZhciB0PXoucmVzaXplSW5mbyxzO0I9Qi50YXJnZXQ7aWYoQi5ub2RlTmFtZSE9PSJJTUciKXtyZXR1cm59aWYodCl7cS51bmJpbmQodC5ub2RlLHQuZXYsdC5jYil9aWYoIXEuaGFzQ2xhc3MoQiwibWNlSXRlbU5vUmVzaXplIikpe2V2PSJyZXNpemVlbmQiO3M9cS5iaW5kKEIsZXYsZnVuY3Rpb24oRCl7dmFyIEM7RD1ELnRhcmdldDtpZihDPXEuZ2V0U3R5bGUoRCwid2lkdGgiKSl7cS5zZXRBdHRyaWIoRCwid2lkdGgiLEMucmVwbGFjZSgvW14wLTklXSsvZywiIikpO3Euc2V0U3R5bGUoRCwid2lkdGgiLCIiKX1pZihDPXEuZ2V0U3R5bGUoRCwiaGVpZ2h0Iikpe3Euc2V0QXR0cmliKEQsImhlaWdodCIsQy5yZXBsYWNlKC9bXjAtOSVdKy9nLCIiKSk7cS5zZXRTdHlsZShELCJoZWlnaHQiLCIiKX19KX1lbHNle2V2PSJyZXNpemVzdGFydCI7cz1xLmJpbmQoQiwicmVzaXplc3RhcnQiLGouY2FuY2VsLGopfXQ9ei5yZXNpemVJbmZvPXtub2RlOkIsZXY6ZXYsY2I6c319KTt6Lm9uS2V5RG93bi5hZGQoZnVuY3Rpb24ocyx0KXtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIDg6aWYoei5zZWxlY3Rpb24uZ2V0Um5nKCkuaXRlbSl7cy5kb20ucmVtb3ZlKHouc2VsZWN0aW9uLmdldFJuZygpLml0ZW0oMCkpO3JldHVybiBqLmNhbmNlbCh0KX19fSl9aWYobS5pc09wZXJhKXt6Lm9uQ2xpY2suYWRkKGZ1bmN0aW9uKHMsdCl7ai5wcmV2ZW50KHQpfSl9aWYoQS5jdXN0b21fdW5kb19yZWRvKXtmdW5jdGlvbiB5KCl7ei51bmRvTWFuYWdlci50eXBpbmc9MDt6LnVuZG9NYW5hZ2VyLmFkZCgpfXEuYmluZCh6LmdldERvYygpLCJmb2N1c291dCIsZnVuY3Rpb24ocyl7aWYoIXoucmVtb3ZlZCYmei51bmRvTWFuYWdlci50eXBpbmcpe3koKX19KTt6Lm9uS2V5VXAuYWRkKGZ1bmN0aW9uKHMsdCl7aWYoKHQua2V5Q29kZT49MzMmJnQua2V5Q29kZTw9MzYpfHwodC5rZXlDb2RlPj0zNyYmdC5rZXlDb2RlPD00MCl8fHQua2V5Q29kZT09MTN8fHQua2V5Q29kZT09NDV8fHQuY3RybEtleSl7eSgpfX0pO3oub25LZXlEb3duLmFkZChmdW5jdGlvbih0LEUpe3ZhciBzLEQsQztpZihiJiZFLmtleUNvZGU9PTQ2KXtzPXouc2VsZWN0aW9uLmdldFJuZygpO2lmKHMucGFyZW50RWxlbWVudCl7RD1zLnBhcmVudEVsZW1lbnQoKTtpZihFLmN0cmxLZXkpe3MubW92ZUVuZCgid29yZCIsMSk7cy5zZWxlY3QoKX16LnNlbGVjdGlvbi5nZXRTZWwoKS5jbGVhcigpO2lmKHMucGFyZW50RWxlbWVudCgpPT1EKXtDPXouc2VsZWN0aW9uLmdldEJvb2ttYXJrKCk7dHJ5e0QuaW5uZXJIVE1MPUQuaW5uZXJIVE1MfWNhdGNoKEIpe316LnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhDKX1FLnByZXZlbnREZWZhdWx0KCk7cmV0dXJufX1pZigoRS5rZXlDb2RlPj0zMyYmRS5rZXlDb2RlPD0zNil8fChFLmtleUNvZGU+PTM3JiZFLmtleUNvZGU8PTQwKXx8RS5rZXlDb2RlPT0xM3x8RS5rZXlDb2RlPT00NSl7aWYoei51bmRvTWFuYWdlci50eXBpbmcpe3koKX1yZXR1cm59aWYoIXoudW5kb01hbmFnZXIudHlwaW5nKXt6LnVuZG9NYW5hZ2VyLmFkZCgpO3oudW5kb01hbmFnZXIudHlwaW5nPTF9fSk7ei5vbk1vdXNlRG93bi5hZGQoZnVuY3Rpb24oKXtpZih6LnVuZG9NYW5hZ2VyLnR5cGluZyl7eSgpfX0pfX0sX2lzSGlkZGVuOmZ1bmN0aW9uKCl7dmFyIHA7aWYoIWEpe3JldHVybiAwfXA9dGhpcy5zZWxlY3Rpb24uZ2V0U2VsKCk7cmV0dXJuKCFwfHwhcC5yYW5nZUNvdW50fHxwLnJhbmdlQ291bnQ9PTApfSxfZml4TmVzdGluZzpmdW5jdGlvbihxKXt2YXIgcj1bXSxwO3E9cS5yZXBsYWNlKC88KFwvKT8oW15ccz5dKylbXj5dKj8+L2csZnVuY3Rpb24odCxzLHYpe3ZhciB1O2lmKHM9PT0iLyIpe2lmKCFyLmxlbmd0aCl7cmV0dXJuIiJ9aWYodiE9PXJbci5sZW5ndGgtMV0udGFnKXtmb3IocD1yLmxlbmd0aC0xO3A+PTA7cC0tKXtpZihyW3BdLnRhZz09PXYpe3JbcF0uY2xvc2U9MTticmVha319cmV0dXJuIiJ9ZWxzZXtyLnBvcCgpO2lmKHIubGVuZ3RoJiZyW3IubGVuZ3RoLTFdLmNsb3NlKXt0PXQrIjwvIityW3IubGVuZ3RoLTFdLnRhZysiPiI7ci5wb3AoKX19fWVsc2V7aWYoL14oYnJ8aHJ8aW5wdXR8bWV0YXxpbWd8bGlua3xwYXJhbSkkL2kudGVzdCh2KSl7cmV0dXJuIHR9aWYoL1wvPiQvLnRlc3QodCkpe3JldHVybiB0fXIucHVzaCh7dGFnOnZ9KX1yZXR1cm4gdH0pO2ZvcihwPXIubGVuZ3RoLTE7cD49MDtwLS0pe3ErPSI8LyIrcltwXS50YWcrIj4ifXJldHVybiBxfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGMpe3ZhciBkPWMuZWFjaCxlLGE9dHJ1ZSxiPWZhbHNlO2MuRWRpdG9yQ29tbWFuZHM9ZnVuY3Rpb24obil7dmFyIGw9bi5kb20scD1uLnNlbGVjdGlvbixqPXtzdGF0ZTp7fSxleGVjOnt9LHZhbHVlOnt9fSxrPW4uc2V0dGluZ3MsbztmdW5jdGlvbiBxKHkseCx2KXt2YXIgdTt5PXkudG9Mb3dlckNhc2UoKTtpZih1PWouZXhlY1t5XSl7dSh5LHgsdik7cmV0dXJuIGF9cmV0dXJuIGJ9ZnVuY3Rpb24gbSh2KXt2YXIgdTt2PXYudG9Mb3dlckNhc2UoKTtpZih1PWouc3RhdGVbdl0pe3JldHVybiB1KHYpfXJldHVybiAtMX1mdW5jdGlvbiBoKHYpe3ZhciB1O3Y9di50b0xvd2VyQ2FzZSgpO2lmKHU9ai52YWx1ZVt2XSl7cmV0dXJuIHUodil9cmV0dXJuIGJ9ZnVuY3Rpb24gdCh1LHYpe3Y9dnx8ImV4ZWMiO2QodSxmdW5jdGlvbih5LHgpe2QoeC50b0xvd2VyQ2FzZSgpLnNwbGl0KCIsIiksZnVuY3Rpb24oeil7alt2XVt6XT15fSl9KX1jLmV4dGVuZCh0aGlzLHtleGVjQ29tbWFuZDpxLHF1ZXJ5Q29tbWFuZFN0YXRlOm0scXVlcnlDb21tYW5kVmFsdWU6aCxhZGRDb21tYW5kczp0fSk7ZnVuY3Rpb24gZih4LHYsdSl7aWYodj09PWUpe3Y9Yn1pZih1PT09ZSl7dT1udWxsfXJldHVybiBuLmdldERvYygpLmV4ZWNDb21tYW5kKHgsdix1KX1mdW5jdGlvbiBzKHUpe3JldHVybiBuLmZvcm1hdHRlci5tYXRjaCh1KX1mdW5jdGlvbiByKHUsdil7bi5mb3JtYXR0ZXIudG9nZ2xlKHUsdj97dmFsdWU6dn06ZSl9ZnVuY3Rpb24gaSh1KXtvPXAuZ2V0Qm9va21hcmsodSl9ZnVuY3Rpb24gZygpe3AubW92ZVRvQm9va21hcmsobyl9dCh7Im1jZVJlc2V0RGVzaWduTW9kZSxtY2VCZWdpblVuZG9MZXZlbCI6ZnVuY3Rpb24oKXt9LCJtY2VFbmRVbmRvTGV2ZWwsbWNlQWRkVW5kb0xldmVsIjpmdW5jdGlvbigpe24udW5kb01hbmFnZXIuYWRkKCl9LCJDdXQsQ29weSxQYXN0ZSI6ZnVuY3Rpb24oeSl7dmFyIHg9bi5nZXREb2MoKSx1O3RyeXtmKHkpfWNhdGNoKHYpe3U9YX1pZih1fHwheC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQoeSkpe2lmKGMuaXNHZWNrbyl7bi53aW5kb3dNYW5hZ2VyLmNvbmZpcm0obi5nZXRMYW5nKCJjbGlwYm9hcmRfbXNnIiksZnVuY3Rpb24oeil7aWYoeil7b3BlbigiaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9lZGl0b3IvbWlkYXNkZW1vL3NlY3VyaXR5cHJlZnMuaHRtbCIsIl9ibGFuayIpfX0pfWVsc2V7bi53aW5kb3dNYW5hZ2VyLmFsZXJ0KG4uZ2V0TGFuZygiY2xpcGJvYXJkX25vX3N1cHBvcnQiKSl9fX0sdW5saW5rOmZ1bmN0aW9uKHUpe2lmKHAuaXNDb2xsYXBzZWQoKSl7cC5zZWxlY3QocC5nZXROb2RlKCkpfWYodSk7cC5jb2xsYXBzZShiKX0sIkp1c3RpZnlMZWZ0LEp1c3RpZnlDZW50ZXIsSnVzdGlmeVJpZ2h0LEp1c3RpZnlGdWxsIjpmdW5jdGlvbih1KXt2YXIgdj11LnN1YnN0cmluZyg3KTtkKCJsZWZ0LGNlbnRlcixyaWdodCxmdWxsIi5zcGxpdCgiLCIpLGZ1bmN0aW9uKHgpe2lmKHYhPXgpe24uZm9ybWF0dGVyLnJlbW92ZSgiYWxpZ24iK3gpfX0pO3IoImFsaWduIit2KX0sIkluc2VydFVub3JkZXJlZExpc3QsSW5zZXJ0T3JkZXJlZExpc3QiOmZ1bmN0aW9uKHgpe3ZhciB1LHY7Zih4KTt1PWwuZ2V0UGFyZW50KHAuZ2V0Tm9kZSgpLCJvbCx1bCIpO2lmKHUpe3Y9dS5wYXJlbnROb2RlO2lmKC9eKEhbMS02XXxQfEFERFJFU1N8UFJFKSQvLnRlc3Qodi5ub2RlTmFtZSkpe2koKTtsLnNwbGl0KHYsdSk7ZygpfX19LCJCb2xkLEl0YWxpYyxVbmRlcmxpbmUsU3RyaWtldGhyb3VnaCI6ZnVuY3Rpb24odSl7cih1KX0sIkZvcmVDb2xvcixIaWxpdGVDb2xvcixGb250TmFtZSI6ZnVuY3Rpb24oeCx2LHUpe3IoeCx1KX0sRm9udFNpemU6ZnVuY3Rpb24oeSx4LHYpe3ZhciB1LHo7aWYodj49MSYmdjw9Nyl7ej1jLmV4cGxvZGUoay5mb250X3NpemVfc3R5bGVfdmFsdWVzKTt1PWMuZXhwbG9kZShrLmZvbnRfc2l6ZV9jbGFzc2VzKTtpZih1KXt2PXVbdi0xXXx8dn1lbHNle3Y9elt2LTFdfHx2fX1yKHksdil9LFJlbW92ZUZvcm1hdDpmdW5jdGlvbih1KXtuLmZvcm1hdHRlci5yZW1vdmUodSl9LG1jZUJsb2NrUXVvdGU6ZnVuY3Rpb24odSl7cigiYmxvY2txdW90ZSIpfSxGb3JtYXRCbG9jazpmdW5jdGlvbih4LHYsdSl7cmV0dXJuIHIodXx8InAiKX0sbWNlQ2xlYW51cDpmdW5jdGlvbigpe3ZhciB1PXAuZ2V0Qm9va21hcmsoKTtuLnNldENvbnRlbnQobi5nZXRDb250ZW50KHtjbGVhbnVwOmF9KSx7Y2xlYW51cDphfSk7cC5tb3ZlVG9Cb29rbWFyayh1KX0sbWNlUmVtb3ZlTm9kZTpmdW5jdGlvbih5LHgsdil7dmFyIHU9dnx8cC5nZXROb2RlKCk7aWYodSE9bi5nZXRCb2R5KCkpe2koKTtuLmRvbS5yZW1vdmUodSxhKTtnKCl9fSxtY2VTZWxlY3ROb2RlRGVwdGg6ZnVuY3Rpb24oeSx4LHYpe3ZhciB1PTA7bC5nZXRQYXJlbnQocC5nZXROb2RlKCksZnVuY3Rpb24oeil7aWYoei5ub2RlVHlwZT09MSYmdSsrPT12KXtwLnNlbGVjdCh6KTtyZXR1cm4gYn19LG4uZ2V0Qm9keSgpKX0sbWNlU2VsZWN0Tm9kZTpmdW5jdGlvbih4LHYsdSl7cC5zZWxlY3QodSl9LG1jZUluc2VydENvbnRlbnQ6ZnVuY3Rpb24oeCx2LHUpe3Auc2V0Q29udGVudCh1KX0sbWNlSW5zZXJ0UmF3SFRNTDpmdW5jdGlvbih4LHYsdSl7cC5zZXRDb250ZW50KCJ0aW55X21jZV9tYXJrZXIiKTtuLnNldENvbnRlbnQobi5nZXRDb250ZW50KCkucmVwbGFjZSgvdGlueV9tY2VfbWFya2VyL2csZnVuY3Rpb24oKXtyZXR1cm4gdX0pKX0sbWNlU2V0Q29udGVudDpmdW5jdGlvbih4LHYsdSl7bi5zZXRDb250ZW50KHUpfSwiSW5kZW50LE91dGRlbnQiOmZ1bmN0aW9uKHkpe3ZhciB2LHUseDt2PWsuaW5kZW50YXRpb247dT0vW2EteiVdKyQvaS5leGVjKHYpO3Y9cGFyc2VJbnQodik7aWYoIW0oIkluc2VydFVub3JkZXJlZExpc3QiKSYmIW0oIkluc2VydE9yZGVyZWRMaXN0Iikpe2QocC5nZXRTZWxlY3RlZEJsb2NrcygpLGZ1bmN0aW9uKHope2lmKHk9PSJvdXRkZW50Iil7eD1NYXRoLm1heCgwLHBhcnNlSW50KHouc3R5bGUucGFkZGluZ0xlZnR8fDApLXYpO2wuc2V0U3R5bGUoeiwicGFkZGluZ0xlZnQiLHg/eCt1OiIiKX1lbHNle2wuc2V0U3R5bGUoeiwicGFkZGluZ0xlZnQiLChwYXJzZUludCh6LnN0eWxlLnBhZGRpbmdMZWZ0fHwwKSt2KSt1KX19KX1lbHNle2YoeSl9fSxtY2VSZXBhaW50OmZ1bmN0aW9uKCl7dmFyIHY7aWYoYy5pc0dlY2tvKXt0cnl7aShhKTtpZihwLmdldFNlbCgpKXtwLmdldFNlbCgpLnNlbGVjdEFsbENoaWxkcmVuKG4uZ2V0Qm9keSgpKX1wLmNvbGxhcHNlKGEpO2coKX1jYXRjaCh1KXt9fX0sbWNlVG9nZ2xlRm9ybWF0OmZ1bmN0aW9uKHgsdix1KXtuLmZvcm1hdHRlci50b2dnbGUodSl9LEluc2VydEhvcml6b250YWxSdWxlOmZ1bmN0aW9uKCl7cC5zZXRDb250ZW50KCI8aHIgLz4iKX0sbWNlVG9nZ2xlVmlzdWFsQWlkOmZ1bmN0aW9uKCl7bi5oYXNWaXN1YWw9IW4uaGFzVmlzdWFsO24uYWRkVmlzdWFsKCl9LG1jZVJlcGxhY2VDb250ZW50OmZ1bmN0aW9uKHgsdix1KXtwLnNldENvbnRlbnQodS5yZXBsYWNlKC9ce1wkc2VsZWN0aW9uXH0vZyxwLmdldENvbnRlbnQoe2Zvcm1hdDoidGV4dCJ9KSkpfSxtY2VJbnNlcnRMaW5rOmZ1bmN0aW9uKHkseCx2KXt2YXIgdT1sLmdldFBhcmVudChwLmdldE5vZGUoKSwiYSIpO2lmKGMuaXModiwic3RyaW5nIikpe3Y9e2hyZWY6dn19aWYoIXUpe2YoIkNyZWF0ZUxpbmsiLGIsImphdmFzY3JpcHQ6bWN0bXAoMCk7Iik7ZChsLnNlbGVjdCgiYVtocmVmPWphdmFzY3JpcHQ6bWN0bXAoMCk7XSIpLGZ1bmN0aW9uKHope2wuc2V0QXR0cmlicyh6LHYpfSl9ZWxzZXtpZih2LmhyZWYpe2wuc2V0QXR0cmlicyh1LHYpfWVsc2V7bi5kb20ucmVtb3ZlKHUsYSl9fX0sc2VsZWN0QWxsOmZ1bmN0aW9uKCl7dmFyIHY9bC5nZXRSb290KCksdT1sLmNyZWF0ZVJuZygpO3Uuc2V0U3RhcnQodiwwKTt1LnNldEVuZCh2LHYuY2hpbGROb2Rlcy5sZW5ndGgpO24uc2VsZWN0aW9uLnNldFJuZyh1KX19KTt0KHsiSnVzdGlmeUxlZnQsSnVzdGlmeUNlbnRlcixKdXN0aWZ5UmlnaHQsSnVzdGlmeUZ1bGwiOmZ1bmN0aW9uKHUpe3JldHVybiBzKCJhbGlnbiIrdS5zdWJzdHJpbmcoNykpfSwiQm9sZCxJdGFsaWMsVW5kZXJsaW5lLFN0cmlrZXRocm91Z2giOmZ1bmN0aW9uKHUpe3JldHVybiBzKHUpfSxtY2VCbG9ja1F1b3RlOmZ1bmN0aW9uKCl7cmV0dXJuIHMoImJsb2NrcXVvdGUiKX0sT3V0ZGVudDpmdW5jdGlvbigpe3ZhciB1O2lmKGsuaW5saW5lX3N0eWxlcyl7aWYoKHU9bC5nZXRQYXJlbnQocC5nZXRTdGFydCgpLGwuaXNCbG9jaykpJiZwYXJzZUludCh1LnN0eWxlLnBhZGRpbmdMZWZ0KT4wKXtyZXR1cm4gYX1pZigodT1sLmdldFBhcmVudChwLmdldEVuZCgpLGwuaXNCbG9jaykpJiZwYXJzZUludCh1LnN0eWxlLnBhZGRpbmdMZWZ0KT4wKXtyZXR1cm4gYX19cmV0dXJuIG0oIkluc2VydFVub3JkZXJlZExpc3QiKXx8bSgiSW5zZXJ0T3JkZXJlZExpc3QiKXx8KCFrLmlubGluZV9zdHlsZXMmJiEhbC5nZXRQYXJlbnQocC5nZXROb2RlKCksIkJMT0NLUVVPVEUiKSl9LCJJbnNlcnRVbm9yZGVyZWRMaXN0LEluc2VydE9yZGVyZWRMaXN0IjpmdW5jdGlvbih1KXtyZXR1cm4gbC5nZXRQYXJlbnQocC5nZXROb2RlKCksdT09Imluc2VydHVub3JkZXJlZGxpc3QiPyJVTCI6Ik9MIil9fSwic3RhdGUiKTt0KHsiRm9udFNpemUsRm9udE5hbWUiOmZ1bmN0aW9uKHgpe3ZhciB2PTAsdTtpZih1PWwuZ2V0UGFyZW50KHAuZ2V0Tm9kZSgpLCJzcGFuIikpe2lmKHg9PSJmb250c2l6ZSIpe3Y9dS5zdHlsZS5mb250U2l6ZX1lbHNle3Y9dS5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2UoLywgL2csIiwiKS5yZXBsYWNlKC9bXCdcIl0vZywiIikudG9Mb3dlckNhc2UoKX19cmV0dXJuIHZ9fSwidmFsdWUiKTtpZihrLmN1c3RvbV91bmRvX3JlZG8pe3Qoe1VuZG86ZnVuY3Rpb24oKXtuLnVuZG9NYW5hZ2VyLnVuZG8oKX0sUmVkbzpmdW5jdGlvbigpe24udW5kb01hbmFnZXIucmVkbygpfX0pfX19KSh0aW55bWNlKTsoZnVuY3Rpb24oYil7dmFyIGE9Yi51dGlsLkRpc3BhdGNoZXI7Yi5VbmRvTWFuYWdlcj1mdW5jdGlvbihlKXt2YXIgYyxkPTAsZz1bXTtmdW5jdGlvbiBmKCl7cmV0dXJuIGIudHJpbShlLmdldENvbnRlbnQoe2Zvcm1hdDoicmF3Iixub19ldmVudHM6MX0pKX1yZXR1cm4gYz17dHlwaW5nOjAsb25BZGQ6bmV3IGEoYyksb25VbmRvOm5ldyBhKGMpLG9uUmVkbzpuZXcgYShjKSxhZGQ6ZnVuY3Rpb24obCl7dmFyIGgsaj1lLnNldHRpbmdzLGs7bD1sfHx7fTtsLmNvbnRlbnQ9ZigpO2s9Z1tkXTtpZihrJiZrLmNvbnRlbnQ9PWwuY29udGVudCl7aWYoZD4wfHxnLmxlbmd0aD09MSl7cmV0dXJuIG51bGx9fWlmKGouY3VzdG9tX3VuZG9fcmVkb19sZXZlbHMpe2lmKGcubGVuZ3RoPmouY3VzdG9tX3VuZG9fcmVkb19sZXZlbHMpe2ZvcihoPTA7aDxnLmxlbmd0aC0xO2grKyl7Z1toXT1nW2grMV19Zy5sZW5ndGgtLTtkPWcubGVuZ3RofX1sLmJvb2ttYXJrPWUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDIsdHJ1ZSk7aWYoZDxnLmxlbmd0aC0xKXtpZihkPT0wKXtnPVtdfWVsc2V7Zy5sZW5ndGg9ZCsxfX1nLnB1c2gobCk7ZD1nLmxlbmd0aC0xO2Mub25BZGQuZGlzcGF0Y2goYyxsKTtlLmlzTm90RGlydHk9MDtyZXR1cm4gbH0sdW5kbzpmdW5jdGlvbigpe3ZhciBqLGg7aWYoYy50eXBpbmcpe2MuYWRkKCk7Yy50eXBpbmc9MH1pZihkPjApe2o9Z1stLWRdO2Uuc2V0Q29udGVudChqLmNvbnRlbnQse2Zvcm1hdDoicmF3In0pO2Uuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGouYm9va21hcmspO2Mub25VbmRvLmRpc3BhdGNoKGMsail9cmV0dXJuIGp9LHJlZG86ZnVuY3Rpb24oKXt2YXIgaDtpZihkPGcubGVuZ3RoLTEpe2g9Z1srK2RdO2Uuc2V0Q29udGVudChoLmNvbnRlbnQse2Zvcm1hdDoicmF3In0pO2Uuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGguYm9va21hcmspO2Mub25SZWRvLmRpc3BhdGNoKGMsaCl9cmV0dXJuIGh9LGNsZWFyOmZ1bmN0aW9uKCl7Zz1bXTtkPWMudHlwaW5nPTB9LGhhc1VuZG86ZnVuY3Rpb24oKXtyZXR1cm4gZD4wfHxjLnR5cGluZ30saGFzUmVkbzpmdW5jdGlvbigpe3JldHVybiBkPGcubGVuZ3RoLTF9fX19KSh0aW55bWNlKTsoZnVuY3Rpb24obSl7dmFyIGs9bS5kb20uRXZlbnQsYz1tLmlzSUUsYT1tLmlzR2Vja28sYj1tLmlzT3BlcmEsaj1tLmVhY2gsaT1tLmV4dGVuZCxkPXRydWUsaD1mYWxzZTtmdW5jdGlvbiBsKHApe3ZhciBxLG8sbjtkb3tpZigvXihTUEFOfFNUUk9OR3xCfEVNfEl8Rk9OVHxTVFJJS0V8VSkkLy50ZXN0KHAubm9kZU5hbWUpKXtpZihxKXtvPXAuY2xvbmVOb2RlKGZhbHNlKTtvLmFwcGVuZENoaWxkKHEpO3E9b31lbHNle3E9bj1wLmNsb25lTm9kZShmYWxzZSl9cS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fXdoaWxlKHA9cC5wYXJlbnROb2RlKTtpZihxKXtyZXR1cm57d3JhcHBlcjpxLGlubmVyOm59fX1mdW5jdGlvbiBnKG8scCl7dmFyIG49cC5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7bi5zZXRTdGFydChvLmVuZENvbnRhaW5lcixvLmVuZE9mZnNldCk7bi5zZXRFbmRBZnRlcihwKTtyZXR1cm4gbi5jbG9uZUNvbnRlbnRzKCkudGV4dENvbnRlbnQubGVuZ3RoPT0wfWZ1bmN0aW9uIGYobyl7bz1vLmlubmVySFRNTDtvPW8ucmVwbGFjZSgvPChpbWd8aHJ8dGFibGV8aW5wdXR8c2VsZWN0fHRleHRhcmVhKVsgXD5dL2dpLCItIik7bz1vLnJlcGxhY2UoLzxbXj5dKz4vZywiIik7cmV0dXJuIG8ucmVwbGFjZSgvWyBcdTAwYTBcdFxyXG5dKy9nLCIiKT09IiJ9ZnVuY3Rpb24gZShwLHIsbil7dmFyIG8scTtpZihmKG4pKXtvPXIuZ2V0UGFyZW50KG4sInVsLG9sIik7aWYoIXIuZ2V0UGFyZW50KG8ucGFyZW50Tm9kZSwidWwsb2wiKSl7ci5zcGxpdChvLG4pO3E9ci5jcmVhdGUoInAiLDAsJzxiciBfbWNlX2JvZ3VzPSIxIiAvPicpO3IucmVwbGFjZShxLG4pO3Auc2VsZWN0KHEsMSl9cmV0dXJuIGh9cmV0dXJuIGR9bS5jcmVhdGUoInRpbnltY2UuRm9yY2VCbG9ja3MiLHtGb3JjZUJsb2NrczpmdW5jdGlvbihvKXt2YXIgcD10aGlzLHE9by5zZXR0aW5ncyxyO3AuZWRpdG9yPW87cC5kb209by5kb207cj0ocS5mb3JjZWRfcm9vdF9ibG9ja3x8InAiKS50b0xvd2VyQ2FzZSgpO3EuZWxlbWVudD1yLnRvVXBwZXJDYXNlKCk7by5vblByZUluaXQuYWRkKHAuc2V0dXAscCk7cC5yZU9wZXJhPW5ldyBSZWdFeHAoIihcXHUwMGEwfCYjMTYwO3wmbmJzcDspPC8iK3IrIj4iLCJnaSIpO3AucmVQYWRkPW5ldyBSZWdFeHAoIjxwKCApKFtePl0rKT48XFwvcD58PHAoICkoW14+XSspXFwvPnw8cCggKShbXj5dKyk+XFxzKzxcXC9wPnw8cD48XFwvcD58PHBcXC8+fDxwPlxccys8XFwvcD4iLnJlcGxhY2UoL3AvZyxyKSwiZ2kiKTtwLnJlTmJzcDJCUjE9bmV3IFJlZ0V4cCgiPHAoICkoW14+XSspPltcXHNcXHUwMGEwXSs8XFwvcD58PHA+W1xcc1xcdTAwYTBdKzxcXC9wPiIucmVwbGFjZSgvcC9nLHIpLCJnaSIpO3AucmVOYnNwMkJSMj1uZXcgUmVnRXhwKCI8JXAoKShbXj5dKyk+KCZuYnNwO3wmIzE2MDspPFxcLyVwPnw8JXA+KCZuYnNwO3wmIzE2MDspPFxcLyVwPiIucmVwbGFjZSgvJXAvZyxyKSwiZ2kiKTtwLnJlQlIyTmJzcD1uZXcgUmVnRXhwKCI8cCggKShbXj5dKyk+XFxzKjxiciBcXC8+XFxzKjxcXC9wPnw8cD5cXHMqPGJyIFxcLz5cXHMqPFxcL3A+Ii5yZXBsYWNlKC9wL2csciksImdpIik7ZnVuY3Rpb24gbihzLHQpe2lmKGIpe3QuY29udGVudD10LmNvbnRlbnQucmVwbGFjZShwLnJlT3BlcmEsIjwvIityKyI+Iil9dC5jb250ZW50PW0uX3JlcGxhY2UocC5yZVBhZGQsIjwiK3IrIiQxJDIkMyQ0JDUkNj5cdTAwYTA8LyIrcisiPiIsdC5jb250ZW50KTtpZighYyYmIWImJnQuc2V0KXt0LmNvbnRlbnQ9dC5jb250ZW50LnJlcGxhY2UocC5yZU5ic3AyQlIxLCI8IityKyIkMSQyPjxiciAvPjwvIityKyI+Iik7dC5jb250ZW50PXQuY29udGVudC5yZXBsYWNlKHAucmVOYnNwMkJSMiwiPCIrcisiJDEkMj48YnIgLz48LyIrcisiPiIpfWVsc2V7dC5jb250ZW50PW0uX3JlcGxhY2UocC5yZUJSMk5ic3AsIjwiK3IrIiQxJDI+XHUwMGEwPC8iK3IrIj4iLHQuY29udGVudCl9fW8ub25CZWZvcmVTZXRDb250ZW50LmFkZChuKTtvLm9uUG9zdFByb2Nlc3MuYWRkKG4pO2lmKHEuZm9yY2VkX3Jvb3RfYmxvY2spe28ub25Jbml0LmFkZChwLmZvcmNlUm9vdHMscCk7by5vblNldENvbnRlbnQuYWRkKHAuZm9yY2VSb290cyxwKTtvLm9uQmVmb3JlR2V0Q29udGVudC5hZGQocC5mb3JjZVJvb3RzLHApfX0sc2V0dXA6ZnVuY3Rpb24oKXt2YXIgbz10aGlzLG49by5lZGl0b3IscT1uLnNldHRpbmdzLHU9bi5kb20scD1uLnNlbGVjdGlvbjtpZihxLmZvcmNlZF9yb290X2Jsb2NrKXtuLm9uQmVmb3JlRXhlY0NvbW1hbmQuYWRkKG8uZm9yY2VSb290cyxvKTtuLm9uS2V5VXAuYWRkKG8uZm9yY2VSb290cyxvKTtuLm9uUHJlUHJvY2Vzcy5hZGQoby5mb3JjZVJvb3RzLG8pfWlmKHEuZm9yY2VfYnJfbmV3bGluZXMpe2lmKGMpe24ub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24ocyx0KXt2YXIgdjtpZih0LmtleUNvZGU9PTEzJiZwLmdldE5vZGUoKS5ub2RlTmFtZSE9IkxJIil7cC5zZXRDb250ZW50KCc8YnIgaWQ9Il9fIiAvPiAnLHtmb3JtYXQ6InJhdyJ9KTt2PXUuZ2V0KCJfXyIpO3YucmVtb3ZlQXR0cmlidXRlKCJpZCIpO3Auc2VsZWN0KHYpO3AuY29sbGFwc2UoKTtyZXR1cm4gay5jYW5jZWwodCl9fSl9fWlmKHEuZm9yY2VfcF9uZXdsaW5lcyl7aWYoIWMpe24ub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24ocyx0KXtpZih0LmtleUNvZGU9PTEzJiYhdC5zaGlmdEtleSYmIW8uaW5zZXJ0UGFyYSh0KSl7ay5jYW5jZWwodCl9fSl9ZWxzZXttLmFkZFVubG9hZChmdW5jdGlvbigpe28uX3ByZXZpb3VzRm9ybWF0cz0wfSk7bi5vbktleVByZXNzLmFkZChmdW5jdGlvbihzLHQpe28uX3ByZXZpb3VzRm9ybWF0cz0wO2lmKHQua2V5Q29kZT09MTMmJiF0LnNoaWZ0S2V5JiZzLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpJiZxLmtlZXBfc3R5bGVzKXtvLl9wcmV2aW91c0Zvcm1hdHM9bChzLnNlbGVjdGlvbi5nZXRTdGFydCgpKX19KTtuLm9uS2V5VXAuYWRkKGZ1bmN0aW9uKHQseCl7aWYoeC5rZXlDb2RlPT0xMyYmIXguc2hpZnRLZXkpe3ZhciB2PXQuc2VsZWN0aW9uLmdldFN0YXJ0KCkscz1vLl9wcmV2aW91c0Zvcm1hdHM7aWYoIXYuaGFzQ2hpbGROb2RlcygpJiZzKXt2PXUuZ2V0UGFyZW50KHYsdS5pc0Jsb2NrKTtpZih2JiZ2Lm5vZGVOYW1lIT0iTEkiKXt2LmlubmVySFRNTD0iIjtpZihvLl9wcmV2aW91c0Zvcm1hdHMpe3YuYXBwZW5kQ2hpbGQocy53cmFwcGVyKTtzLmlubmVyLmlubmVySFRNTD0iXHVGRUZGIn1lbHNle3YuaW5uZXJIVE1MPSJcdUZFRkYifXAuc2VsZWN0KHYsMSk7dC5nZXREb2MoKS5leGVjQ29tbWFuZCgiRGVsZXRlIixmYWxzZSxudWxsKTtvLl9wcmV2aW91c0Zvcm1hdHM9MH19fX0pfWlmKGEpe24ub25LZXlEb3duLmFkZChmdW5jdGlvbihzLHQpe2lmKCh0LmtleUNvZGU9PTh8fHQua2V5Q29kZT09NDYpJiYhdC5zaGlmdEtleSl7by5iYWNrc3BhY2VEZWxldGUodCx0LmtleUNvZGU9PTgpfX0pfX1pZihtLmlzV2ViS2l0KXtmdW5jdGlvbiByKHQpe3ZhciBzPXAuZ2V0Um5nKCksdix6PXUuY3JlYXRlKCJkaXYiLG51bGwsIiAiKSx5LHg9dS5nZXRWaWV3UG9ydCh0LmdldFdpbigpKS5oO3MuaW5zZXJ0Tm9kZSh2PXUuY3JlYXRlKCJiciIpKTtzLnNldFN0YXJ0QWZ0ZXIodik7cy5zZXRFbmRBZnRlcih2KTtwLnNldFJuZyhzKTtpZihwLmdldFNlbCgpLmZvY3VzTm9kZT09di5wcmV2aW91c1NpYmxpbmcpe3Auc2VsZWN0KHUuaW5zZXJ0QWZ0ZXIodS5kb2MuY3JlYXRlVGV4dE5vZGUoIlx1MDBhMCIpLHYpKTtwLmNvbGxhcHNlKGQpfXUuaW5zZXJ0QWZ0ZXIoeix2KTt5PXUuZ2V0UG9zKHopLnk7dS5yZW1vdmUoeik7aWYoeT54KXt0LmdldFdpbigpLnNjcm9sbFRvKDAseSl9fW4ub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24ocyx0KXtpZih0LmtleUNvZGU9PTEzJiYodC5zaGlmdEtleXx8KHEuZm9yY2VfYnJfbmV3bGluZXMmJiF1LmdldFBhcmVudChwLmdldE5vZGUoKSwiaDEsaDIsaDMsaDQsaDUsaDYsb2wsdWwiKSkpKXtyKHMpO2suY2FuY2VsKHQpfX0pfW4ub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe2oodS5zZWxlY3QoInAsaDEsaDIsaDMsaDQsaDUsaDYsZGl2Iix0Lm5vZGUpLGZ1bmN0aW9uKHYpe2lmKGYodikpe2oodS5zZWxlY3QoInNwYW4sZW0sc3Ryb25nLGIsaSIsdC5ub2RlKSxmdW5jdGlvbih4KXtpZigheC5oYXNDaGlsZE5vZGVzKCkpe3guYXBwZW5kQ2hpbGQocy5nZXREb2MoKS5jcmVhdGVUZXh0Tm9kZSgiXHUwMGEwIikpO3JldHVybiBofX0pfX0pfSk7aWYoYyl7aWYocS5lbGVtZW50IT0iUCIpe24ub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24ocyx0KXtvLmxhc3RFbG09cC5nZXROb2RlKCkubm9kZU5hbWV9KTtuLm9uS2V5VXAuYWRkKGZ1bmN0aW9uKHQsdil7dmFyIHkseD1wLmdldE5vZGUoKSxzPXQuZ2V0Qm9keSgpO2lmKHMuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZ4Lm5vZGVOYW1lPT0iUCIpe3g9dS5yZW5hbWUoeCxxLmVsZW1lbnQpO3Auc2VsZWN0KHgpO3AuY29sbGFwc2UoKTt0Lm5vZGVDaGFuZ2VkKCl9ZWxzZXtpZih2LmtleUNvZGU9PTEzJiYhdi5zaGlmdEtleSYmby5sYXN0RWxtIT0iUCIpe3k9dS5nZXRQYXJlbnQoeCwicCIpO2lmKHkpe3UucmVuYW1lKHkscS5lbGVtZW50KTt0Lm5vZGVDaGFuZ2VkKCl9fX19KX19fSxmaW5kOmZ1bmN0aW9uKHYscSxyKXt2YXIgcD10aGlzLmVkaXRvcixvPXAuZ2V0RG9jKCkuY3JlYXRlVHJlZVdhbGtlcih2LDQsbnVsbCxoKSx1PS0xO3doaWxlKHY9by5uZXh0Tm9kZSgpKXt1Kys7aWYocT09MCYmdj09cil7cmV0dXJuIHV9aWYocT09MSYmdT09cil7cmV0dXJuIHZ9fXJldHVybiAtMX0sZm9yY2VSb290czpmdW5jdGlvbih4LEkpe3ZhciB6PXRoaXMseD16LmVkaXRvcixNPXguZ2V0Qm9keSgpLEo9eC5nZXREb2MoKSxQPXguc2VsZWN0aW9uLEE9UC5nZXRTZWwoKSxCPVAuZ2V0Um5nKCksTj0tMix2LEcsbyxwLEs9LTE2Nzc3MjE1O3ZhciBMLHEsTyxGLEMsdT1NLmNoaWxkTm9kZXMsRSxELHk7Zm9yKEU9dS5sZW5ndGgtMTtFPj0wO0UtLSl7TD11W0VdO2lmKEwubm9kZVR5cGU9PT0xJiZMLmdldEF0dHJpYnV0ZSgiX21jZV90eXBlIikpe3E9bnVsbDtjb250aW51ZX1pZihMLm5vZGVUeXBlPT09M3x8KCF6LmRvbS5pc0Jsb2NrKEwpJiZMLm5vZGVUeXBlIT09OCYmIS9eKHNjcmlwdHxtY2U6c2NyaXB0fHN0eWxlfG1jZTpzdHlsZSkkL2kudGVzdChMLm5vZGVOYW1lKSkpe2lmKCFxKXtpZihMLm5vZGVUeXBlIT0zfHwvW15cc10vZy50ZXN0KEwubm9kZVZhbHVlKSl7aWYoTj09LTImJkIpe2lmKCFjfHxCLnNldFN0YXJ0KXtpZihCLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlPT0xJiYoRD1CLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbQi5zdGFydE9mZnNldF0pJiZELm5vZGVUeXBlPT0xKXt5PUQuZ2V0QXR0cmlidXRlKCJpZCIpO0Quc2V0QXR0cmlidXRlKCJpZCIsIl9fbWNlIil9ZWxzZXtpZih4LmRvbS5nZXRQYXJlbnQoQi5zdGFydENvbnRhaW5lcixmdW5jdGlvbihuKXtyZXR1cm4gbj09PU19KSl7Rz1CLnN0YXJ0T2Zmc2V0O289Qi5lbmRPZmZzZXQ7Tj16LmZpbmQoTSwwLEIuc3RhcnRDb250YWluZXIpO3Y9ei5maW5kKE0sMCxCLmVuZENvbnRhaW5lcil9fX1lbHNle2lmKEIuaXRlbSl7cD1KLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7cC5tb3ZlVG9FbGVtZW50VGV4dChCLml0ZW0oMCkpO0I9cH1wPUouYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTtwLm1vdmVUb0VsZW1lbnRUZXh0KE0pO3AuY29sbGFwc2UoMSk7Tz1wLm1vdmUoImNoYXJhY3RlciIsSykqLTE7cD1CLmR1cGxpY2F0ZSgpO3AuY29sbGFwc2UoMSk7Rj1wLm1vdmUoImNoYXJhY3RlciIsSykqLTE7cD1CLmR1cGxpY2F0ZSgpO3AuY29sbGFwc2UoMCk7Qz0ocC5tb3ZlKCJjaGFyYWN0ZXIiLEspKi0xKS1GO049Ri1PO3Y9Q319cT14LmRvbS5jcmVhdGUoeC5zZXR0aW5ncy5mb3JjZWRfcm9vdF9ibG9jayk7TC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChxLEwpO3EuYXBwZW5kQ2hpbGQoTCl9fWVsc2V7aWYocS5oYXNDaGlsZE5vZGVzKCkpe3EuaW5zZXJ0QmVmb3JlKEwscS5maXJzdENoaWxkKX1lbHNle3EuYXBwZW5kQ2hpbGQoTCl9fX1lbHNle3E9bnVsbH19aWYoTiE9LTIpe2lmKCFjfHxCLnNldFN0YXJ0KXtxPU0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoeC5zZXR0aW5ncy5lbGVtZW50KVswXTtCPUouY3JlYXRlUmFuZ2UoKTtpZihOIT0tMSl7Qi5zZXRTdGFydCh6LmZpbmQoTSwxLE4pLEcpfWVsc2V7Qi5zZXRTdGFydChxLDApfWlmKHYhPS0xKXtCLnNldEVuZCh6LmZpbmQoTSwxLHYpLG8pfWVsc2V7Qi5zZXRFbmQocSwwKX1pZihBKXtBLnJlbW92ZUFsbFJhbmdlcygpO0EuYWRkUmFuZ2UoQil9fWVsc2V7dHJ5e0I9QS5jcmVhdGVSYW5nZSgpO0IubW92ZVRvRWxlbWVudFRleHQoTSk7Qi5jb2xsYXBzZSgxKTtCLm1vdmVTdGFydCgiY2hhcmFjdGVyIixOKTtCLm1vdmVFbmQoImNoYXJhY3RlciIsdik7Qi5zZWxlY3QoKX1jYXRjaChIKXt9fX1lbHNle2lmKCghY3x8Qi5zZXRTdGFydCkmJihEPXguZG9tLmdldCgiX19tY2UiKSkpe2lmKHkpe0Quc2V0QXR0cmlidXRlKCJpZCIseSl9ZWxzZXtELnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX1CPUouY3JlYXRlUmFuZ2UoKTtCLnNldFN0YXJ0QmVmb3JlKEQpO0Iuc2V0RW5kQmVmb3JlKEQpO1Auc2V0Um5nKEIpfX19LGdldFBhcmVudEJsb2NrOmZ1bmN0aW9uKHApe3ZhciBvPXRoaXMuZG9tO3JldHVybiBvLmdldFBhcmVudChwLG8uaXNCbG9jayl9LGluc2VydFBhcmE6ZnVuY3Rpb24oUyl7dmFyIEc9dGhpcyx4PUcuZWRpdG9yLE89eC5kb20sVD14LmdldERvYygpLFg9eC5zZXR0aW5ncyxIPXguc2VsZWN0aW9uLmdldFNlbCgpLEk9SC5nZXRSYW5nZUF0KDApLFc9VC5ib2R5O3ZhciBMLE0sSixRLFAsdSxwLHYsQSxvLEUsVixxLHosSyxOPU8uZ2V0Vmlld1BvcnQoeC5nZXRXaW4oKSksRCxGLEM7TD1ULmNyZWF0ZVJhbmdlKCk7TC5zZXRTdGFydChILmFuY2hvck5vZGUsSC5hbmNob3JPZmZzZXQpO0wuY29sbGFwc2UoZCk7TT1ULmNyZWF0ZVJhbmdlKCk7TS5zZXRTdGFydChILmZvY3VzTm9kZSxILmZvY3VzT2Zmc2V0KTtNLmNvbGxhcHNlKGQpO0o9TC5jb21wYXJlQm91bmRhcnlQb2ludHMoTC5TVEFSVF9UT19FTkQsTSk8MDtRPUo/SC5hbmNob3JOb2RlOkguZm9jdXNOb2RlO1A9Sj9ILmFuY2hvck9mZnNldDpILmZvY3VzT2Zmc2V0O3U9Sj9ILmZvY3VzTm9kZTpILmFuY2hvck5vZGU7cD1KP0guZm9jdXNPZmZzZXQ6SC5hbmNob3JPZmZzZXQ7aWYoUT09PXUmJi9eKFREfFRIKSQvLnRlc3QoUS5ub2RlTmFtZSkpe2lmKFEuZmlyc3RDaGlsZC5ub2RlTmFtZT09IkJSIil7Ty5yZW1vdmUoUS5maXJzdENoaWxkKX1pZihRLmNoaWxkTm9kZXMubGVuZ3RoPT0wKXt4LmRvbS5hZGQoUSxYLmVsZW1lbnQsbnVsbCwiPGJyIC8+Iik7Vj14LmRvbS5hZGQoUSxYLmVsZW1lbnQsbnVsbCwiPGJyIC8+Iil9ZWxzZXtLPVEuaW5uZXJIVE1MO1EuaW5uZXJIVE1MPSIiO3guZG9tLmFkZChRLFguZWxlbWVudCxudWxsLEspO1Y9eC5kb20uYWRkKFEsWC5lbGVtZW50LG51bGwsIjxiciAvPiIpfUk9VC5jcmVhdGVSYW5nZSgpO0kuc2VsZWN0Tm9kZUNvbnRlbnRzKFYpO0kuY29sbGFwc2UoMSk7eC5zZWxlY3Rpb24uc2V0Um5nKEkpO3JldHVybiBofWlmKFE9PVcmJnU9PVcmJlcuZmlyc3RDaGlsZCYmeC5kb20uaXNCbG9jayhXLmZpcnN0Q2hpbGQpKXtRPXU9US5maXJzdENoaWxkO1A9cD0wO0w9VC5jcmVhdGVSYW5nZSgpO0wuc2V0U3RhcnQoUSwwKTtNPVQuY3JlYXRlUmFuZ2UoKTtNLnNldFN0YXJ0KHUsMCl9UT1RLm5vZGVOYW1lPT0iSFRNTCI/VC5ib2R5OlE7UT1RLm5vZGVOYW1lPT0iQk9EWSI/US5maXJzdENoaWxkOlE7dT11Lm5vZGVOYW1lPT0iSFRNTCI/VC5ib2R5OnU7dT11Lm5vZGVOYW1lPT0iQk9EWSI/dS5maXJzdENoaWxkOnU7dj1HLmdldFBhcmVudEJsb2NrKFEpO0E9Ry5nZXRQYXJlbnRCbG9jayh1KTtvPXY/di5ub2RlTmFtZTpYLmVsZW1lbnQ7aWYoSz1HLmRvbS5nZXRQYXJlbnQodiwibGkscHJlIikpe2lmKEsubm9kZU5hbWU9PSJMSSIpe3JldHVybiBlKHguc2VsZWN0aW9uLEcuZG9tLEspfXJldHVybiBkfWlmKHYmJih2Lm5vZGVOYW1lPT0iQ0FQVElPTiJ8fC9hYnNvbHV0ZXxyZWxhdGl2ZXxmaXhlZC9naS50ZXN0KE8uZ2V0U3R5bGUodiwicG9zaXRpb24iLDEpKSkpe289WC5lbGVtZW50O3Y9bnVsbH1pZihBJiYoQS5ub2RlTmFtZT09IkNBUFRJT04ifHwvYWJzb2x1dGV8cmVsYXRpdmV8Zml4ZWQvZ2kudGVzdChPLmdldFN0eWxlKHYsInBvc2l0aW9uIiwxKSkpKXtvPVguZWxlbWVudDtBPW51bGx9aWYoLyhURHxUQUJMRXxUSHxDQVBUSU9OKS8udGVzdChvKXx8KHYmJm89PSJESVYiJiYvbGVmdHxyaWdodC9naS50ZXN0KE8uZ2V0U3R5bGUodiwiZmxvYXQiLDEpKSkpe289WC5lbGVtZW50O3Y9QT1udWxsfUU9KHYmJnYubm9kZU5hbWU9PW8pP3YuY2xvbmVOb2RlKDApOnguZG9tLmNyZWF0ZShvKTtWPShBJiZBLm5vZGVOYW1lPT1vKT9BLmNsb25lTm9kZSgwKTp4LmRvbS5jcmVhdGUobyk7Vi5yZW1vdmVBdHRyaWJ1dGUoImlkIik7aWYoL14oSFsxLTZdKSQvLnRlc3QobykmJmcoSSx2KSl7Vj14LmRvbS5jcmVhdGUoWC5lbGVtZW50KX1LPXE9UTtkb3tpZihLPT1XfHxLLm5vZGVUeXBlPT05fHxHLmRvbS5pc0Jsb2NrKEspfHwvKFREfFRBQkxFfFRIfENBUFRJT04pLy50ZXN0KEsubm9kZU5hbWUpKXticmVha31xPUt9d2hpbGUoKEs9Sy5wcmV2aW91c1NpYmxpbmc/Sy5wcmV2aW91c1NpYmxpbmc6Sy5wYXJlbnROb2RlKSk7Sz16PXU7ZG97aWYoSz09V3x8Sy5ub2RlVHlwZT09OXx8Ry5kb20uaXNCbG9jayhLKXx8LyhURHxUQUJMRXxUSHxDQVBUSU9OKS8udGVzdChLLm5vZGVOYW1lKSl7YnJlYWt9ej1LfXdoaWxlKChLPUsubmV4dFNpYmxpbmc/Sy5uZXh0U2libGluZzpLLnBhcmVudE5vZGUpKTtpZihxLm5vZGVOYW1lPT1vKXtMLnNldFN0YXJ0KHEsMCl9ZWxzZXtMLnNldFN0YXJ0QmVmb3JlKHEpfUwuc2V0RW5kKFEsUCk7RS5hcHBlbmRDaGlsZChMLmNsb25lQ29udGVudHMoKXx8VC5jcmVhdGVUZXh0Tm9kZSgiIikpO3RyeXtNLnNldEVuZEFmdGVyKHopfWNhdGNoKFIpe31NLnNldFN0YXJ0KHUscCk7Vi5hcHBlbmRDaGlsZChNLmNsb25lQ29udGVudHMoKXx8VC5jcmVhdGVUZXh0Tm9kZSgiIikpO0k9VC5jcmVhdGVSYW5nZSgpO2lmKCFxLnByZXZpb3VzU2libGluZyYmcS5wYXJlbnROb2RlLm5vZGVOYW1lPT1vKXtJLnNldFN0YXJ0QmVmb3JlKHEucGFyZW50Tm9kZSl9ZWxzZXtpZihMLnN0YXJ0Q29udGFpbmVyLm5vZGVOYW1lPT1vJiZMLnN0YXJ0T2Zmc2V0PT0wKXtJLnNldFN0YXJ0QmVmb3JlKEwuc3RhcnRDb250YWluZXIpfWVsc2V7SS5zZXRTdGFydChMLnN0YXJ0Q29udGFpbmVyLEwuc3RhcnRPZmZzZXQpfX1pZighei5uZXh0U2libGluZyYmei5wYXJlbnROb2RlLm5vZGVOYW1lPT1vKXtJLnNldEVuZEFmdGVyKHoucGFyZW50Tm9kZSl9ZWxzZXtJLnNldEVuZChNLmVuZENvbnRhaW5lcixNLmVuZE9mZnNldCl9SS5kZWxldGVDb250ZW50cygpO2lmKGIpe3guZ2V0V2luKCkuc2Nyb2xsVG8oMCxOLnkpfWlmKEUuZmlyc3RDaGlsZCYmRS5maXJzdENoaWxkLm5vZGVOYW1lPT1vKXtFLmlubmVySFRNTD1FLmZpcnN0Q2hpbGQuaW5uZXJIVE1MfWlmKFYuZmlyc3RDaGlsZCYmVi5maXJzdENoaWxkLm5vZGVOYW1lPT1vKXtWLmlubmVySFRNTD1WLmZpcnN0Q2hpbGQuaW5uZXJIVE1MfWlmKGYoRSkpe0UuaW5uZXJIVE1MPSI8YnIgLz4ifWZ1bmN0aW9uIFUoeSxzKXt2YXIgcj1bXSxaLFksdDt5LmlubmVySFRNTD0iIjtpZihYLmtlZXBfc3R5bGVzKXtZPXM7ZG97aWYoL14oU1BBTnxTVFJPTkd8QnxFTXxJfEZPTlR8U1RSSUtFfFUpJC8udGVzdChZLm5vZGVOYW1lKSl7Wj1ZLmNsb25lTm9kZShoKTtPLnNldEF0dHJpYihaLCJpZCIsIiIpO3IucHVzaChaKX19d2hpbGUoWT1ZLnBhcmVudE5vZGUpfWlmKHIubGVuZ3RoPjApe2Zvcih0PXIubGVuZ3RoLTEsWj15O3Q+PTA7dC0tKXtaPVouYXBwZW5kQ2hpbGQoclt0XSl9clswXS5pbm5lckhUTUw9Yj8iJm5ic3A7IjoiPGJyIC8+IjtyZXR1cm4gclswXX1lbHNle3kuaW5uZXJIVE1MPWI/IiZuYnNwOyI6IjxiciAvPiJ9fWlmKGYoVikpe0M9VShWLHUpfWlmKGImJnBhcnNlRmxvYXQob3BlcmEudmVyc2lvbigpKTw5LjUpe0kuaW5zZXJ0Tm9kZShFKTtJLmluc2VydE5vZGUoVil9ZWxzZXtJLmluc2VydE5vZGUoVik7SS5pbnNlcnROb2RlKEUpfVYubm9ybWFsaXplKCk7RS5ub3JtYWxpemUoKTtmdW5jdGlvbiBCKHIpe3JldHVybiBULmNyZWF0ZVRyZWVXYWxrZXIocixOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLGgpLm5leHROb2RlKCl8fHJ9ST1ULmNyZWF0ZVJhbmdlKCk7SS5zZWxlY3ROb2RlQ29udGVudHMoYT9CKEN8fFYpOkN8fFYpO0kuY29sbGFwc2UoMSk7SC5yZW1vdmVBbGxSYW5nZXMoKTtILmFkZFJhbmdlKEkpO0Q9eC5kb20uZ2V0UG9zKFYpLnk7Rj1WLmNsaWVudEhlaWdodDtpZihEPE4ueXx8RCtGPk4ueStOLmgpe3guZ2V0V2luKCkuc2Nyb2xsVG8oMCxEPE4ueT9EOkQtTi5oKzI1KX1yZXR1cm4gaH0sYmFja3NwYWNlRGVsZXRlOmZ1bmN0aW9uKHYsQyl7dmFyIEQ9dGhpcyx1PUQuZWRpdG9yLHo9dS5nZXRCb2R5KCkscz11LmRvbSxxLHg9dS5zZWxlY3Rpb24scD14LmdldFJuZygpLHk9cC5zdGFydENvbnRhaW5lcixxLEEsQixvO2lmKCFDJiZwLmNvbGxhcHNlZCYmeS5ub2RlVHlwZT09MSYmcC5zdGFydE9mZnNldD09eS5jaGlsZE5vZGVzLmxlbmd0aCl7bz1uZXcgbS5kb20uVHJlZVdhbGtlcih5Lmxhc3RDaGlsZCx5KTtmb3IocT15Lmxhc3RDaGlsZDtxO3E9by5wcmV2KCkpe2lmKHEubm9kZVR5cGU9PTMpe3Auc2V0U3RhcnQocSxxLm5vZGVWYWx1ZS5sZW5ndGgpO3AuY29sbGFwc2UodHJ1ZSk7eC5zZXRSbmcocCk7cmV0dXJufX19aWYoeSYmdS5kb20uaXNCbG9jayh5KSYmIS9eKFREfFRIKSQvLnRlc3QoeS5ub2RlTmFtZSkmJkMpe2lmKHkuY2hpbGROb2Rlcy5sZW5ndGg9PTB8fCh5LmNoaWxkTm9kZXMubGVuZ3RoPT0xJiZ5LmZpcnN0Q2hpbGQubm9kZU5hbWU9PSJCUiIpKXtxPXk7d2hpbGUoKHE9cS5wcmV2aW91c1NpYmxpbmcpJiYhdS5kb20uaXNCbG9jayhxKSl7fWlmKHEpe2lmKHkhPXouZmlyc3RDaGlsZCl7QT11LmRvbS5kb2MuY3JlYXRlVHJlZVdhbGtlcihxLE5vZGVGaWx0ZXIuU0hPV19URVhULG51bGwsaCk7d2hpbGUoQj1BLm5leHROb2RlKCkpe3E9Qn1wPXUuZ2V0RG9jKCkuY3JlYXRlUmFuZ2UoKTtwLnNldFN0YXJ0KHEscS5ub2RlVmFsdWU/cS5ub2RlVmFsdWUubGVuZ3RoOjApO3Auc2V0RW5kKHEscS5ub2RlVmFsdWU/cS5ub2RlVmFsdWUubGVuZ3RoOjApO3guc2V0Um5nKHApO3UuZG9tLnJlbW92ZSh5KX1yZXR1cm4gay5jYW5jZWwodil9fX19fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYyl7dmFyIGI9Yy5ET00sYT1jLmRvbS5FdmVudCxkPWMuZWFjaCxlPWMuZXh0ZW5kO2MuY3JlYXRlKCJ0aW55bWNlLkNvbnRyb2xNYW5hZ2VyIix7Q29udHJvbE1hbmFnZXI6ZnVuY3Rpb24oZixqKXt2YXIgaD10aGlzLGc7aj1qfHx7fTtoLmVkaXRvcj1mO2guY29udHJvbHM9e307aC5vbkFkZD1uZXcgYy51dGlsLkRpc3BhdGNoZXIoaCk7aC5vblBvc3RSZW5kZXI9bmV3IGMudXRpbC5EaXNwYXRjaGVyKGgpO2gucHJlZml4PWoucHJlZml4fHxmLmlkKyJfIjtoLl9jbHM9e307aC5vblBvc3RSZW5kZXIuYWRkKGZ1bmN0aW9uKCl7ZChoLmNvbnRyb2xzLGZ1bmN0aW9uKGkpe2kucG9zdFJlbmRlcigpfSl9KX0sZ2V0OmZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLmNvbnRyb2xzW3RoaXMucHJlZml4K2ZdfHx0aGlzLmNvbnRyb2xzW2ZdfSxzZXRBY3RpdmU6ZnVuY3Rpb24oaCxmKXt2YXIgZz1udWxsO2lmKGc9dGhpcy5nZXQoaCkpe2cuc2V0QWN0aXZlKGYpfXJldHVybiBnfSxzZXREaXNhYmxlZDpmdW5jdGlvbihoLGYpe3ZhciBnPW51bGw7aWYoZz10aGlzLmdldChoKSl7Zy5zZXREaXNhYmxlZChmKX1yZXR1cm4gZ30sYWRkOmZ1bmN0aW9uKGcpe3ZhciBmPXRoaXM7aWYoZyl7Zi5jb250cm9sc1tnLmlkXT1nO2Yub25BZGQuZGlzcGF0Y2goZyxmKX1yZXR1cm4gZ30sY3JlYXRlQ29udHJvbDpmdW5jdGlvbihpKXt2YXIgaCxnPXRoaXMsZj1nLmVkaXRvcjtkKGYucGx1Z2lucyxmdW5jdGlvbihqKXtpZihqLmNyZWF0ZUNvbnRyb2wpe2g9ai5jcmVhdGVDb250cm9sKGksZyk7aWYoaCl7cmV0dXJuIGZhbHNlfX19KTtzd2l0Y2goaSl7Y2FzZSJ8IjpjYXNlInNlcGFyYXRvciI6cmV0dXJuIGcuY3JlYXRlU2VwYXJhdG9yKCl9aWYoIWgmJmYuYnV0dG9ucyYmKGg9Zi5idXR0b25zW2ldKSl7cmV0dXJuIGcuY3JlYXRlQnV0dG9uKGksaCl9cmV0dXJuIGcuYWRkKGgpfSxjcmVhdGVEcm9wTWVudTpmdW5jdGlvbihmLG4saCl7dmFyIG09dGhpcyxpPW0uZWRpdG9yLGosZyxrLGw7bj1lKHsiY2xhc3MiOiJtY2VEcm9wRG93biIsY29uc3RyYWluOmkuc2V0dGluZ3MuY29uc3RyYWluX21lbnVzfSxuKTtuWyJjbGFzcyJdPW5bImNsYXNzIl0rIiAiK2kuZ2V0UGFyYW0oInNraW4iKSsiU2tpbiI7aWYoaz1pLmdldFBhcmFtKCJza2luX3ZhcmlhbnQiKSl7blsiY2xhc3MiXSs9IiAiK2kuZ2V0UGFyYW0oInNraW4iKSsiU2tpbiIray5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK2suc3Vic3RyaW5nKDEpfWY9bS5wcmVmaXgrZjtsPWh8fG0uX2Nscy5kcm9wbWVudXx8Yy51aS5Ecm9wTWVudTtqPW0uY29udHJvbHNbZl09bmV3IGwoZixuKTtqLm9uQWRkSXRlbS5hZGQoZnVuY3Rpb24ocixxKXt2YXIgcD1xLnNldHRpbmdzO3AudGl0bGU9aS5nZXRMYW5nKHAudGl0bGUscC50aXRsZSk7aWYoIXAub25jbGljayl7cC5vbmNsaWNrPWZ1bmN0aW9uKG8pe2lmKHAuY21kKXtpLmV4ZWNDb21tYW5kKHAuY21kLHAudWl8fGZhbHNlLHAudmFsdWUpfX19fSk7aS5vblJlbW92ZS5hZGQoZnVuY3Rpb24oKXtqLmRlc3Ryb3koKX0pO2lmKGMuaXNJRSl7ai5vblNob3dNZW51LmFkZChmdW5jdGlvbigpe2kuZm9jdXMoKTtnPWkuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpfSk7ai5vbkhpZGVNZW51LmFkZChmdW5jdGlvbigpe2lmKGcpe2kuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGcpO2c9MH19KX1yZXR1cm4gbS5hZGQoail9LGNyZWF0ZUxpc3RCb3g6ZnVuY3Rpb24obSxpLGwpe3ZhciBoPXRoaXMsZz1oLmVkaXRvcixqLGssZjtpZihoLmdldChtKSl7cmV0dXJuIG51bGx9aS50aXRsZT1nLnRyYW5zbGF0ZShpLnRpdGxlKTtpLnNjb3BlPWkuc2NvcGV8fGc7aWYoIWkub25zZWxlY3Qpe2kub25zZWxlY3Q9ZnVuY3Rpb24obil7Zy5leGVjQ29tbWFuZChpLmNtZCxpLnVpfHxmYWxzZSxufHxpLnZhbHVlKX19aT1lKHt0aXRsZTppLnRpdGxlLCJjbGFzcyI6Im1jZV8iK20sc2NvcGU6aS5zY29wZSxjb250cm9sX21hbmFnZXI6aH0saSk7bT1oLnByZWZpeCttO2lmKGcuc2V0dGluZ3MudXNlX25hdGl2ZV9zZWxlY3RzKXtrPW5ldyBjLnVpLk5hdGl2ZUxpc3RCb3gobSxpKX1lbHNle2Y9bHx8aC5fY2xzLmxpc3Rib3h8fGMudWkuTGlzdEJveDtrPW5ldyBmKG0saSl9aC5jb250cm9sc1ttXT1rO2lmKGMuaXNXZWJLaXQpe2sub25Qb3N0UmVuZGVyLmFkZChmdW5jdGlvbihwLG8pe2EuYWRkKG8sIm1vdXNlZG93biIsZnVuY3Rpb24oKXtnLmJvb2ttYXJrPWcuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpfSk7YS5hZGQobywiZm9jdXMiLGZ1bmN0aW9uKCl7Zy5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoZy5ib29rbWFyayk7Zy5ib29rbWFyaz1udWxsfSl9KX1pZihrLmhpZGVNZW51KXtnLm9uTW91c2VEb3duLmFkZChrLmhpZGVNZW51LGspfXJldHVybiBoLmFkZChrKX0sY3JlYXRlQnV0dG9uOmZ1bmN0aW9uKG0saSxsKXt2YXIgaD10aGlzLGc9aC5lZGl0b3IsaixrLGY7aWYoaC5nZXQobSkpe3JldHVybiBudWxsfWkudGl0bGU9Zy50cmFuc2xhdGUoaS50aXRsZSk7aS5sYWJlbD1nLnRyYW5zbGF0ZShpLmxhYmVsKTtpLnNjb3BlPWkuc2NvcGV8fGc7aWYoIWkub25jbGljayYmIWkubWVudV9idXR0b24pe2kub25jbGljaz1mdW5jdGlvbigpe2cuZXhlY0NvbW1hbmQoaS5jbWQsaS51aXx8ZmFsc2UsaS52YWx1ZSl9fWk9ZSh7dGl0bGU6aS50aXRsZSwiY2xhc3MiOiJtY2VfIittLHVuYXZhaWxhYmxlX3ByZWZpeDpnLmdldExhbmcoInVuYXZhaWxhYmxlIiwiIiksc2NvcGU6aS5zY29wZSxjb250cm9sX21hbmFnZXI6aH0saSk7bT1oLnByZWZpeCttO2lmKGkubWVudV9idXR0b24pe2Y9bHx8aC5fY2xzLm1lbnVidXR0b258fGMudWkuTWVudUJ1dHRvbjtrPW5ldyBmKG0saSk7Zy5vbk1vdXNlRG93bi5hZGQoay5oaWRlTWVudSxrKX1lbHNle2Y9aC5fY2xzLmJ1dHRvbnx8Yy51aS5CdXR0b247az1uZXcgZihtLGkpfXJldHVybiBoLmFkZChrKX0sY3JlYXRlTWVudUJ1dHRvbjpmdW5jdGlvbihoLGYsZyl7Zj1mfHx7fTtmLm1lbnVfYnV0dG9uPTE7cmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKGgsZixnKX0sY3JlYXRlU3BsaXRCdXR0b246ZnVuY3Rpb24obSxpLGwpe3ZhciBoPXRoaXMsZz1oLmVkaXRvcixqLGssZjtpZihoLmdldChtKSl7cmV0dXJuIG51bGx9aS50aXRsZT1nLnRyYW5zbGF0ZShpLnRpdGxlKTtpLnNjb3BlPWkuc2NvcGV8fGc7aWYoIWkub25jbGljayl7aS5vbmNsaWNrPWZ1bmN0aW9uKG4pe2cuZXhlY0NvbW1hbmQoaS5jbWQsaS51aXx8ZmFsc2Usbnx8aS52YWx1ZSl9fWlmKCFpLm9uc2VsZWN0KXtpLm9uc2VsZWN0PWZ1bmN0aW9uKG4pe2cuZXhlY0NvbW1hbmQoaS5jbWQsaS51aXx8ZmFsc2Usbnx8aS52YWx1ZSl9fWk9ZSh7dGl0bGU6aS50aXRsZSwiY2xhc3MiOiJtY2VfIittLHNjb3BlOmkuc2NvcGUsY29udHJvbF9tYW5hZ2VyOmh9LGkpO209aC5wcmVmaXgrbTtmPWx8fGguX2Nscy5zcGxpdGJ1dHRvbnx8Yy51aS5TcGxpdEJ1dHRvbjtrPWguYWRkKG5ldyBmKG0saSkpO2cub25Nb3VzZURvd24uYWRkKGsuaGlkZU1lbnUsayk7cmV0dXJuIGt9LGNyZWF0ZUNvbG9yU3BsaXRCdXR0b246ZnVuY3Rpb24oZixuLGgpe3ZhciBsPXRoaXMsaj1sLmVkaXRvcixpLGssbSxnO2lmKGwuZ2V0KGYpKXtyZXR1cm4gbnVsbH1uLnRpdGxlPWoudHJhbnNsYXRlKG4udGl0bGUpO24uc2NvcGU9bi5zY29wZXx8ajtpZighbi5vbmNsaWNrKXtuLm9uY2xpY2s9ZnVuY3Rpb24obyl7aWYoYy5pc0lFKXtnPWouc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpfWouZXhlY0NvbW1hbmQobi5jbWQsbi51aXx8ZmFsc2Usb3x8bi52YWx1ZSl9fWlmKCFuLm9uc2VsZWN0KXtuLm9uc2VsZWN0PWZ1bmN0aW9uKG8pe2ouZXhlY0NvbW1hbmQobi5jbWQsbi51aXx8ZmFsc2Usb3x8bi52YWx1ZSl9fW49ZSh7dGl0bGU6bi50aXRsZSwiY2xhc3MiOiJtY2VfIitmLG1lbnVfY2xhc3M6ai5nZXRQYXJhbSgic2tpbiIpKyJTa2luIixzY29wZTpuLnNjb3BlLG1vcmVfY29sb3JzX3RpdGxlOmouZ2V0TGFuZygibW9yZV9jb2xvcnMiKX0sbik7Zj1sLnByZWZpeCtmO209aHx8bC5fY2xzLmNvbG9yc3BsaXRidXR0b258fGMudWkuQ29sb3JTcGxpdEJ1dHRvbjtrPW5ldyBtKGYsbik7ai5vbk1vdXNlRG93bi5hZGQoay5oaWRlTWVudSxrKTtqLm9uUmVtb3ZlLmFkZChmdW5jdGlvbigpe2suZGVzdHJveSgpfSk7aWYoYy5pc0lFKXtrLm9uU2hvd01lbnUuYWRkKGZ1bmN0aW9uKCl7ai5mb2N1cygpO2c9ai5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMSl9KTtrLm9uSGlkZU1lbnUuYWRkKGZ1bmN0aW9uKCl7aWYoZyl7ai5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoZyk7Zz0wfX0pfXJldHVybiBsLmFkZChrKX0sY3JlYXRlVG9vbGJhcjpmdW5jdGlvbihrLGgsail7dmFyIGksZz10aGlzLGY7az1nLnByZWZpeCtrO2Y9anx8Zy5fY2xzLnRvb2xiYXJ8fGMudWkuVG9vbGJhcjtpPW5ldyBmKGssaCk7aWYoZy5nZXQoaykpe3JldHVybiBudWxsfXJldHVybiBnLmFkZChpKX0sY3JlYXRlU2VwYXJhdG9yOmZ1bmN0aW9uKGcpe3ZhciBmPWd8fHRoaXMuX2Nscy5zZXBhcmF0b3J8fGMudWkuU2VwYXJhdG9yO3JldHVybiBuZXcgZigpfSxzZXRDb250cm9sVHlwZTpmdW5jdGlvbihnLGYpe3JldHVybiB0aGlzLl9jbHNbZy50b0xvd2VyQ2FzZSgpXT1mfSxkZXN0cm95OmZ1bmN0aW9uKCl7ZCh0aGlzLmNvbnRyb2xzLGZ1bmN0aW9uKGYpe2YuZGVzdHJveSgpfSk7dGhpcy5jb250cm9scz1udWxsfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGQpe3ZhciBhPWQudXRpbC5EaXNwYXRjaGVyLGU9ZC5lYWNoLGM9ZC5pc0lFLGI9ZC5pc09wZXJhO2QuY3JlYXRlKCJ0aW55bWNlLldpbmRvd01hbmFnZXIiLHtXaW5kb3dNYW5hZ2VyOmZ1bmN0aW9uKGYpe3ZhciBnPXRoaXM7Zy5lZGl0b3I9ZjtnLm9uT3Blbj1uZXcgYShnKTtnLm9uQ2xvc2U9bmV3IGEoZyk7Zy5wYXJhbXM9e307Zy5mZWF0dXJlcz17fX0sb3BlbjpmdW5jdGlvbih6LGgpe3ZhciB2PXRoaXMsaz0iIixuLG0saT12LmVkaXRvci5zZXR0aW5ncy5kaWFsb2dfdHlwZT09Im1vZGFsIixxLG8saixnPWQuRE9NLmdldFZpZXdQb3J0KCkscjt6PXp8fHt9O2g9aHx8e307bz1iP2cudzpzY3JlZW4ud2lkdGg7aj1iP2cuaDpzY3JlZW4uaGVpZ2h0O3oubmFtZT16Lm5hbWV8fCJtY18iK25ldyBEYXRlKCkuZ2V0VGltZSgpO3oud2lkdGg9cGFyc2VJbnQoei53aWR0aHx8MzIwKTt6LmhlaWdodD1wYXJzZUludCh6LmhlaWdodHx8MjQwKTt6LnJlc2l6YWJsZT10cnVlO3oubGVmdD16LmxlZnR8fHBhcnNlSW50KG8vMiktKHoud2lkdGgvMik7ei50b3A9ei50b3B8fHBhcnNlSW50KGovMiktKHouaGVpZ2h0LzIpO2guaW5saW5lPWZhbHNlO2gubWNlX3dpZHRoPXoud2lkdGg7aC5tY2VfaGVpZ2h0PXouaGVpZ2h0O2gubWNlX2F1dG9fZm9jdXM9ei5hdXRvX2ZvY3VzO2lmKGkpe2lmKGMpe3ouY2VudGVyPXRydWU7ei5oZWxwPWZhbHNlO3ouZGlhbG9nV2lkdGg9ei53aWR0aCsicHgiO3ouZGlhbG9nSGVpZ2h0PXouaGVpZ2h0KyJweCI7ei5zY3JvbGw9ei5zY3JvbGxiYXJzfHxmYWxzZX19ZSh6LGZ1bmN0aW9uKHAsZil7aWYoZC5pcyhwLCJib29sZWFuIikpe3A9cD8ieWVzIjoibm8ifWlmKCEvXihuYW1lfHVybCkkLy50ZXN0KGYpKXtpZihjJiZpKXtrKz0oaz8iOyI6IiIpK2YrIjoiK3B9ZWxzZXtrKz0oaz8iLCI6IiIpK2YrIj0iK3B9fX0pO3YuZmVhdHVyZXM9ejt2LnBhcmFtcz1oO3Yub25PcGVuLmRpc3BhdGNoKHYseixoKTtyPXoudXJsfHx6LmZpbGU7cj1kLl9hZGRWZXIocik7dHJ5e2lmKGMmJmkpe3E9MTt3aW5kb3cuc2hvd01vZGFsRGlhbG9nKHIsd2luZG93LGspfWVsc2V7cT13aW5kb3cub3BlbihyLHoubmFtZSxrKX19Y2F0Y2gobCl7fWlmKCFxKXthbGVydCh2LmVkaXRvci5nZXRMYW5nKCJwb3B1cF9ibG9ja2VkIikpfX0sY2xvc2U6ZnVuY3Rpb24oZil7Zi5jbG9zZSgpO3RoaXMub25DbG9zZS5kaXNwYXRjaCh0aGlzKX0sY3JlYXRlSW5zdGFuY2U6ZnVuY3Rpb24oaSxoLGcsbSxsLGspe3ZhciBqPWQucmVzb2x2ZShpKTtyZXR1cm4gbmV3IGooaCxnLG0sbCxrKX0sY29uZmlybTpmdW5jdGlvbihoLGYsaSxnKXtnPWd8fHdpbmRvdztmLmNhbGwoaXx8dGhpcyxnLmNvbmZpcm0odGhpcy5fZGVjb2RlKHRoaXMuZWRpdG9yLmdldExhbmcoaCxoKSkpKX0sYWxlcnQ6ZnVuY3Rpb24oaCxmLGosZyl7dmFyIGk9dGhpcztnPWd8fHdpbmRvdztnLmFsZXJ0KGkuX2RlY29kZShpLmVkaXRvci5nZXRMYW5nKGgsaCkpKTtpZihmKXtmLmNhbGwoanx8aSl9fSxyZXNpemVCeTpmdW5jdGlvbihmLGcsaCl7aC5yZXNpemVCeShmLGcpfSxfZGVjb2RlOmZ1bmN0aW9uKGYpe3JldHVybiBkLkRPTS5kZWNvZGUoZikucmVwbGFjZSgvXFxuL2csIlxuIil9fSl9KHRpbnltY2UpKTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3ZhciBkPXt9LGM9e30sZT17fTtmdW5jdGlvbiBmKGosaSxoLGcpe2lmKHR5cGVvZihpKT09InN0cmluZyIpe2k9W2ldfWEuZWFjaChpLGZ1bmN0aW9uKGspe2pbay50b0xvd2VyQ2FzZSgpXT17ZnVuYzpoLHNjb3BlOmd9fSl9YS5leHRlbmQodGhpcyx7YWRkOmZ1bmN0aW9uKGksaCxnKXtmKGQsaSxoLGcpfSxhZGRRdWVyeVN0YXRlSGFuZGxlcjpmdW5jdGlvbihpLGgsZyl7ZihjLGksaCxnKX0sYWRkUXVlcnlWYWx1ZUhhbmRsZXI6ZnVuY3Rpb24oaSxoLGcpe2YoZSxpLGgsZyl9LGV4ZWNDb21tYW5kOmZ1bmN0aW9uKGgsayxqLGksZyl7aWYoaz1kW2sudG9Mb3dlckNhc2UoKV0pe2lmKGsuZnVuYy5jYWxsKGh8fGsuc2NvcGUsaixpLGcpIT09ZmFsc2Upe3JldHVybiB0cnVlfX19LHF1ZXJ5Q29tbWFuZFZhbHVlOmZ1bmN0aW9uKCl7aWYoY21kPWVbY21kLnRvTG93ZXJDYXNlKCldKXtyZXR1cm4gY21kLmZ1bmMuY2FsbChzY29wZXx8Y21kLnNjb3BlLHVpLHZhbHVlLGFyZ3MpfX0scXVlcnlDb21tYW5kU3RhdGU6ZnVuY3Rpb24oKXtpZihjbWQ9Y1tjbWQudG9Mb3dlckNhc2UoKV0pe3JldHVybiBjbWQuZnVuYy5jYWxsKHNjb3BlfHxjbWQuc2NvcGUsdWksdmFsdWUsYXJncyl9fX0pfWEuR2xvYmFsQ29tbWFuZHM9bmV3IGIoKX0pKHRpbnltY2UpOyhmdW5jdGlvbihhKXthLkZvcm1hdHRlcj1mdW5jdGlvbihUKXt2YXIgSz17fSxNPWEuZWFjaCxjPVQuZG9tLHA9VC5zZWxlY3Rpb24scz1hLmRvbS5UcmVlV2Fsa2VyLEk9bmV3IGEuZG9tLlJhbmdlVXRpbHMoYyksZD1ULnNjaGVtYS5pc1ZhbGlkLEU9Yy5pc0Jsb2NrLGs9VC5zZXR0aW5ncy5mb3JjZWRfcm9vdF9ibG9jayxyPWMubm9kZUluZGV4LEQ9Ilx1RkVGRiIsZT0vXihzcmN8aHJlZnxzdHlsZSkkLyxRPWZhbHNlLEE9dHJ1ZSxvLE49e2FwcGx5OltdLHJlbW92ZTpbXX07ZnVuY3Rpb24geShVKXtyZXR1cm4gVSBpbnN0YW5jZW9mIEFycmF5fWZ1bmN0aW9uIGwoVixVKXtyZXR1cm4gYy5nZXRQYXJlbnRzKFYsVSxjLmdldFJvb3QoKSl9ZnVuY3Rpb24gYihVKXtyZXR1cm4gVS5ub2RlVHlwZT09PTEmJihVLmZhY2U9PT0ibWNlaW5saW5lInx8VS5zdHlsZS5mb250RmFtaWx5PT09Im1jZWlubGluZSIpfWZ1bmN0aW9uIFAoVSl7cmV0dXJuIFU/S1tVXTpLfWZ1bmN0aW9uIGooVSxWKXtpZihVKXtpZih0eXBlb2YoVSkhPT0ic3RyaW5nIil7TShVLGZ1bmN0aW9uKFgsVyl7aihXLFgpfSl9ZWxzZXtWPVYubGVuZ3RoP1Y6W1ZdO00oVixmdW5jdGlvbihXKXtpZihXLmRlZXA9PT1vKXtXLmRlZXA9IVcuc2VsZWN0b3J9aWYoVy5zcGxpdD09PW8pe1cuc3BsaXQ9IVcuc2VsZWN0b3J8fFcuaW5saW5lfWlmKFcucmVtb3ZlPT09byYmVy5zZWxlY3RvciYmIVcuaW5saW5lKXtXLnJlbW92ZT0ibm9uZSJ9aWYoVy5zZWxlY3RvciYmVy5pbmxpbmUpe1cubWl4ZWQ9dHJ1ZTtXLmJsb2NrX2V4cGFuZD10cnVlfWlmKHR5cGVvZihXLmNsYXNzZXMpPT09InN0cmluZyIpe1cuY2xhc3Nlcz1XLmNsYXNzZXMuc3BsaXQoL1xzKy8pfX0pO0tbVV09Vn19fWZ1bmN0aW9uIFIoVyxhYyxZKXt2YXIgWj1QKFcpLGFkPVpbMF0sYWIsVixhYTtmdW5jdGlvbiBYKGFnKXt2YXIgYWY9YWcuc3RhcnRDb250YWluZXIsYWo9YWcuc3RhcnRPZmZzZXQsYWksYWg7aWYoYWYubm9kZVR5cGU9PTF8fGFmLm5vZGVWYWx1ZT09PSIiKXthZj1hZi5ub2RlVHlwZT09MT9hZi5jaGlsZE5vZGVzW2FqXTphZjtpZihhZil7YWk9bmV3IHMoYWYsYWYucGFyZW50Tm9kZSk7Zm9yKGFoPWFpLmN1cnJlbnQoKTthaDthaD1haS5uZXh0KCkpe2lmKGFoLm5vZGVUeXBlPT0zJiYhZihhaCkpe2FnLnNldFN0YXJ0KGFoLDApO2JyZWFrfX19fXJldHVybiBhZ31mdW5jdGlvbiBVKGFnLGFmKXthZj1hZnx8YWQ7aWYoYWcpe00oYWYuc3R5bGVzLGZ1bmN0aW9uKGFpLGFoKXtjLnNldFN0eWxlKGFnLGFoLHEoYWksYWMpKX0pO00oYWYuYXR0cmlidXRlcyxmdW5jdGlvbihhaSxhaCl7Yy5zZXRBdHRyaWIoYWcsYWgscShhaSxhYykpfSk7TShhZi5jbGFzc2VzLGZ1bmN0aW9uKGFoKXthaD1xKGFoLGFjKTtpZighYy5oYXNDbGFzcyhhZyxhaCkpe2MuYWRkQ2xhc3MoYWcsYWgpfX0pfX1mdW5jdGlvbiBhZShhZyl7dmFyIGFmPVtdLGFpLGFoO2FpPWFkLmlubGluZXx8YWQuYmxvY2s7YWg9Yy5jcmVhdGUoYWkpO1UoYWgpO0kud2FsayhhZyxmdW5jdGlvbihhail7dmFyIGFrO2Z1bmN0aW9uIGFsKGFtKXt2YXIgYXA9YW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxhbz1hbS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYW47aWYoZyhhcCwiYnIiKSl7YWs9MDtpZihhZC5ibG9jayl7Yy5yZW1vdmUoYW0pfXJldHVybn1pZihhZC53cmFwcGVyJiZ2KGFtLFcsYWMpKXthaz0wO3JldHVybn1pZihhZC5ibG9jayYmIWFkLndyYXBwZXImJkYoYXApKXthbT1jLnJlbmFtZShhbSxhaSk7VShhbSk7YWYucHVzaChhbSk7YWs9MDtyZXR1cm59aWYoYWQuc2VsZWN0b3Ipe00oWixmdW5jdGlvbihhcSl7aWYoYy5pcyhhbSxhcS5zZWxlY3RvcikmJiFiKGFtKSl7VShhbSxhcSk7YW49dHJ1ZX19KTtpZighYWQuaW5saW5lfHxhbil7YWs9MDtyZXR1cm59fWlmKChhZC53cmFwX2xpbmtzIT09ZmFsc2V8fGFwIT0iYSIpJiZkKGFpLGFwKSYmZChhbyxhaSkpe2lmKCFhayl7YWs9YWguY2xvbmVOb2RlKFEpO2FtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGFrLGFtKTthZi5wdXNoKGFrKX1hay5hcHBlbmRDaGlsZChhbSl9ZWxzZXthaz0wO00oYS5ncmVwKGFtLmNoaWxkTm9kZXMpLGFsKTthaz0wfX1NKGFqLGFsKX0pO00oYWYsZnVuY3Rpb24oYWwpe3ZhciBhajtmdW5jdGlvbiBhbShhbyl7dmFyIGFuPTA7TShhby5jaGlsZE5vZGVzLGZ1bmN0aW9uKGFwKXtpZighZihhcCkmJiFHKGFwKSl7YW4rK319KTtyZXR1cm4gYW59ZnVuY3Rpb24gYWsoYW4pe3ZhciBhcCxhbztNKGFuLmNoaWxkTm9kZXMsZnVuY3Rpb24oYXEpe2lmKGFxLm5vZGVUeXBlPT0xJiYhRyhhcSkmJiFiKGFxKSl7YXA9YXE7cmV0dXJuIFF9fSk7aWYoYXAmJmgoYXAsYWQpKXthbz1hcC5jbG9uZU5vZGUoUSk7VShhbyk7Yy5yZXBsYWNlKGFvLGFuLEEpO2MucmVtb3ZlKGFwLDEpfXJldHVybiBhb3x8YW59YWo9YW0oYWwpO2lmKGFqPT09MCl7Yy5yZW1vdmUoYWwsMSk7cmV0dXJufWlmKGFkLmlubGluZXx8YWQud3JhcHBlcil7aWYoIWFkLmV4YWN0JiZhaj09PTEpe2FsPWFrKGFsKX1NKFosZnVuY3Rpb24oYW4pe00oYy5zZWxlY3QoYW4uaW5saW5lLGFsKSxmdW5jdGlvbihhbyl7UyhhbixhYyxhbyxhbi5leGFjdD9hbzpudWxsKX0pfSk7aWYodihhbC5wYXJlbnROb2RlLFcsYWMpKXtjLnJlbW92ZShhbCwxKTthbD0wO3JldHVybiBBfWlmKGFkLm1lcmdlX3dpdGhfcGFyZW50cyl7Yy5nZXRQYXJlbnQoYWwucGFyZW50Tm9kZSxmdW5jdGlvbihhbil7aWYodihhbixXLGFjKSl7Yy5yZW1vdmUoYWwsMSk7YWw9MDtyZXR1cm4gQX19KX1pZihhbCl7YWw9dChCKGFsKSxhbCk7YWw9dChhbCxCKGFsLEEpKX19fSl9aWYoYWQpe2lmKFkpe1Y9Yy5jcmVhdGVSbmcoKTtWLnNldFN0YXJ0QmVmb3JlKFkpO1Yuc2V0RW5kQWZ0ZXIoWSk7YWUobihWLFopKX1lbHNle2lmKCFwLmlzQ29sbGFwc2VkKCl8fCFhZC5pbmxpbmUpe2FiPXAuZ2V0Qm9va21hcmsoKTthZShuKHAuZ2V0Um5nKEEpLFopKTtwLm1vdmVUb0Jvb2ttYXJrKGFiKTtwLnNldFJuZyhYKHAuZ2V0Um5nKEEpKSk7VC5ub2RlQ2hhbmdlZCgpfWVsc2V7TygiYXBwbHkiLFcsYWMpfX19fWZ1bmN0aW9uIHooVyxhZixaKXt2YXIgYWE9UChXKSxhaD1hYVswXSxhZSxhZCxWO2Z1bmN0aW9uIFkoYWspe3ZhciBhaj1hay5zdGFydENvbnRhaW5lcixhcD1hay5zdGFydE9mZnNldCxhbyxhbixhbCxhbTtpZihhai5ub2RlVHlwZT09MyYmYXA+PWFqLm5vZGVWYWx1ZS5sZW5ndGgtMSl7YWo9YWoucGFyZW50Tm9kZTthcD1yKGFqKSsxfWlmKGFqLm5vZGVUeXBlPT0xKXthbD1hai5jaGlsZE5vZGVzO2FqPWFsW01hdGgubWluKGFwLGFsLmxlbmd0aC0xKV07YW89bmV3IHMoYWopO2lmKGFwPmFsLmxlbmd0aC0xKXthby5uZXh0KCl9Zm9yKGFuPWFvLmN1cnJlbnQoKTthbjthbj1hby5uZXh0KCkpe2lmKGFuLm5vZGVUeXBlPT0zJiYhZihhbikpe2FtPWMuY3JlYXRlKCJhIixudWxsLEQpO2FuLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGFtLGFuKTthay5zZXRTdGFydChhbiwwKTtwLnNldFJuZyhhayk7Yy5yZW1vdmUoYW0pO3JldHVybn19fX1mdW5jdGlvbiBYKGFtKXt2YXIgYWwsYWssYWo7YWw9YS5ncmVwKGFtLmNoaWxkTm9kZXMpO2Zvcihhaz0wLGFqPWFhLmxlbmd0aDthazxhajthaysrKXtpZihTKGFhW2FrXSxhZixhbSxhbSkpe2JyZWFrfX1pZihhaC5kZWVwKXtmb3IoYWs9MCxhaj1hbC5sZW5ndGg7YWs8YWo7YWsrKyl7WChhbFtha10pfX19ZnVuY3Rpb24gYWIoYWope3ZhciBhaztNKGwoYWoucGFyZW50Tm9kZSkucmV2ZXJzZSgpLGZ1bmN0aW9uKGFsKXt2YXIgYW07aWYoIWFrJiZhbC5pZCE9Il9zdGFydCImJmFsLmlkIT0iX2VuZCIpe2FtPXYoYWwsVyxhZik7aWYoYW0mJmFtLnNwbGl0IT09ZmFsc2Upe2FrPWFsfX19KTtyZXR1cm4gYWt9ZnVuY3Rpb24gVShhbSxhaixhbyxhcil7dmFyIGF0LGFxLGFwLGFsLGFuLGFrO2lmKGFtKXthaz1hbS5wYXJlbnROb2RlO2ZvcihhdD1hai5wYXJlbnROb2RlO2F0JiZhdCE9YWs7YXQ9YXQucGFyZW50Tm9kZSl7YXE9YXQuY2xvbmVOb2RlKFEpO2Zvcihhbj0wO2FuPGFhLmxlbmd0aDthbisrKXtpZihTKGFhW2FuXSxhZixhcSxhcSkpe2FxPTA7YnJlYWt9fWlmKGFxKXtpZihhcCl7YXEuYXBwZW5kQ2hpbGQoYXApfWlmKCFhbCl7YWw9YXF9YXA9YXF9fWlmKGFyJiYoIWFoLm1peGVkfHwhRShhbSkpKXthaj1jLnNwbGl0KGFtLGFqKX1pZihhcCl7YW8ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYXAsYW8pO2FsLmFwcGVuZENoaWxkKGFvKX19cmV0dXJuIGFqfWZ1bmN0aW9uIGFnKGFqKXtyZXR1cm4gVShhYihhaiksYWosYWosdHJ1ZSl9ZnVuY3Rpb24gYWMoYWwpe3ZhciBhaz1jLmdldChhbD8iX3N0YXJ0IjoiX2VuZCIpLGFqPWFrW2FsPyJmaXJzdENoaWxkIjoibGFzdENoaWxkIl07aWYoRyhhaikpe2FqPWFqW2FsPyJmaXJzdENoaWxkIjoibGFzdENoaWxkIl19Yy5yZW1vdmUoYWssdHJ1ZSk7cmV0dXJuIGFqfWZ1bmN0aW9uIGFpKGFqKXt2YXIgYWssYWw7YWo9bihhaixhYSxBKTtpZihhaC5zcGxpdCl7YWs9SChhaixBKTthbD1IKGFqKTtpZihhayE9YWwpe2FrPUwoYWssInNwYW4iLHtpZDoiX3N0YXJ0IixfbWNlX3R5cGU6ImJvb2ttYXJrIn0pO2FsPUwoYWwsInNwYW4iLHtpZDoiX2VuZCIsX21jZV90eXBlOiJib29rbWFyayJ9KTthZyhhayk7YWcoYWwpO2FrPWFjKEEpO2FsPWFjKCl9ZWxzZXthaz1hbD1hZyhhayl9YWouc3RhcnRDb250YWluZXI9YWsucGFyZW50Tm9kZTthai5zdGFydE9mZnNldD1yKGFrKTthai5lbmRDb250YWluZXI9YWwucGFyZW50Tm9kZTthai5lbmRPZmZzZXQ9cihhbCkrMX1JLndhbGsoYWosZnVuY3Rpb24oYW0pe00oYW0sZnVuY3Rpb24oYW4pe1goYW4pfSl9KX1pZihaKXtWPWMuY3JlYXRlUm5nKCk7Vi5zZXRTdGFydEJlZm9yZShaKTtWLnNldEVuZEFmdGVyKFopO2FpKFYpO3JldHVybn1pZighcC5pc0NvbGxhcHNlZCgpfHwhYWguaW5saW5lKXthZT1wLmdldEJvb2ttYXJrKCk7YWkocC5nZXRSbmcoQSkpO3AubW92ZVRvQm9va21hcmsoYWUpO2lmKGkoVyxhZixwLmdldFN0YXJ0KCkpKXtZKHAuZ2V0Um5nKHRydWUpKX1ULm5vZGVDaGFuZ2VkKCl9ZWxzZXtPKCJyZW1vdmUiLFcsYWYpfX1mdW5jdGlvbiBDKFUsVyxWKXtpZihpKFUsVyxWKSl7eihVLFcsVil9ZWxzZXtSKFUsVyxWKX19ZnVuY3Rpb24gdihWLFUsYWEsWSl7dmFyIFc9UChVKSxhYixaLFg7ZnVuY3Rpb24gYWMoYWcsYWksYWope3ZhciBhZixhaCxhZD1haVthal0sYWU7aWYoYWQpe2lmKGFkLmxlbmd0aD09PW8pe2ZvcihhZiBpbiBhZCl7aWYoYWQuaGFzT3duUHJvcGVydHkoYWYpKXtpZihhaj09PSJhdHRyaWJ1dGVzIil7YWg9Yy5nZXRBdHRyaWIoYWcsYWYpfWVsc2V7YWg9SihhZyxhZil9aWYoWSYmIWFoJiYhYWkuZXhhY3Qpe3JldHVybn1pZigoIVl8fGFpLmV4YWN0KSYmIWcoYWgscShhZFthZl0sYWEpKSl7cmV0dXJufX19fWVsc2V7Zm9yKGFlPTA7YWU8YWQubGVuZ3RoO2FlKyspe2lmKGFqPT09ImF0dHJpYnV0ZXMiP2MuZ2V0QXR0cmliKGFnLGFkW2FlXSk6SihhZyxhZFthZV0pKXtyZXR1cm4gYWl9fX19cmV0dXJuIGFpfWlmKFcmJlYpe2ZvcihaPTA7WjxXLmxlbmd0aDtaKyspe2FiPVdbWl07aWYoaChWLGFiKSYmYWMoVixhYiwiYXR0cmlidXRlcyIpJiZhYyhWLGFiLCJzdHlsZXMiKSl7aWYoWD1hYi5jbGFzc2VzKXtmb3IoWj0wO1o8WC5sZW5ndGg7WisrKXtpZighYy5oYXNDbGFzcyhWLFhbWl0pKXtyZXR1cm59fX1yZXR1cm4gYWJ9fX19ZnVuY3Rpb24gaShXLFosWSl7dmFyIFYsWDtmdW5jdGlvbiBVKGFhKXthYT1jLmdldFBhcmVudChhYSxmdW5jdGlvbihhYil7cmV0dXJuICEhdihhYixXLFosdHJ1ZSl9KTtyZXR1cm4gdihhYSxXLFopfWlmKFkpe3JldHVybiBVKFkpfWlmKHAuaXNDb2xsYXBzZWQoKSl7Zm9yKFg9Ti5hcHBseS5sZW5ndGgtMTtYPj0wO1gtLSl7aWYoTi5hcHBseVtYXS5uYW1lPT1XKXtyZXR1cm4gdHJ1ZX19Zm9yKFg9Ti5yZW1vdmUubGVuZ3RoLTE7WD49MDtYLS0pe2lmKE4ucmVtb3ZlW1hdLm5hbWU9PVcpe3JldHVybiBmYWxzZX19cmV0dXJuIFUocC5nZXROb2RlKCkpfVk9cC5nZXROb2RlKCk7aWYoVShZKSl7cmV0dXJuIEF9Vj1wLmdldFN0YXJ0KCk7aWYoViE9WSl7aWYoVShWKSl7cmV0dXJuIEF9fXJldHVybiBRfWZ1bmN0aW9uIHUoYWIsYWEpe3ZhciBZLFo9W10sWD17fSxXLFYsVTtpZihwLmlzQ29sbGFwc2VkKCkpe2ZvcihWPTA7VjxhYi5sZW5ndGg7VisrKXtmb3IoVz1OLnJlbW92ZS5sZW5ndGgtMTtXPj0wO1ctLSl7VT1hYltWXTtpZihOLnJlbW92ZVtXXS5uYW1lPT1VKXtYW1VdPXRydWU7YnJlYWt9fX1mb3IoVz1OLmFwcGx5Lmxlbmd0aC0xO1c+PTA7Vy0tKXtmb3IoVj0wO1Y8YWIubGVuZ3RoO1YrKyl7VT1hYltWXTtpZighWFtVXSYmTi5hcHBseVtXXS5uYW1lPT1VKXtYW1VdPXRydWU7Wi5wdXNoKFUpfX19fVk9cC5nZXRTdGFydCgpO2MuZ2V0UGFyZW50KFksZnVuY3Rpb24oYWUpe3ZhciBhZCxhYztmb3IoYWQ9MDthZDxhYi5sZW5ndGg7YWQrKyl7YWM9YWJbYWRdO2lmKCFYW2FjXSYmdihhZSxhYyxhYSkpe1hbYWNdPXRydWU7Wi5wdXNoKGFjKX19fSk7cmV0dXJuIFp9ZnVuY3Rpb24geChZKXt2YXIgYWE9UChZKSxYLFcsWixWLFU7aWYoYWEpe1g9cC5nZXRTdGFydCgpO1c9bChYKTtmb3IoVj1hYS5sZW5ndGgtMTtWPj0wO1YtLSl7VT1hYVtWXS5zZWxlY3RvcjtpZighVSl7cmV0dXJuIEF9Zm9yKFo9Vy5sZW5ndGgtMTtaPj0wO1otLSl7aWYoYy5pcyhXW1pdLFUpKXtyZXR1cm4gQX19fX1yZXR1cm4gUX1hLmV4dGVuZCh0aGlzLHtnZXQ6UCxyZWdpc3RlcjpqLGFwcGx5OlIscmVtb3ZlOnosdG9nZ2xlOkMsbWF0Y2g6aSxtYXRjaEFsbDp1LG1hdGNoTm9kZTp2LGNhbkFwcGx5Onh9KTtmdW5jdGlvbiBoKFUsVil7aWYoZyhVLFYuaW5saW5lKSl7cmV0dXJuIEF9aWYoZyhVLFYuYmxvY2spKXtyZXR1cm4gQX1pZihWLnNlbGVjdG9yKXtyZXR1cm4gYy5pcyhVLFYuc2VsZWN0b3IpfX1mdW5jdGlvbiBnKFYsVSl7Vj1WfHwiIjtVPVV8fCIiO1Y9IiIrKFYubm9kZU5hbWV8fFYpO1U9IiIrKFUubm9kZU5hbWV8fFUpO3JldHVybiBWLnRvTG93ZXJDYXNlKCk9PVUudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBKKFYsVSl7dmFyIFc9Yy5nZXRTdHlsZShWLFUpO2lmKFU9PSJjb2xvciJ8fFU9PSJiYWNrZ3JvdW5kQ29sb3IiKXtXPWMudG9IZXgoVyl9aWYoVT09ImZvbnRXZWlnaHQiJiZXPT03MDApe1c9ImJvbGQifXJldHVybiIiK1d9ZnVuY3Rpb24gcShVLFYpe2lmKHR5cGVvZihVKSE9InN0cmluZyIpe1U9VShWKX1lbHNle2lmKFYpe1U9VS5yZXBsYWNlKC8lKFx3KykvZyxmdW5jdGlvbihYLFcpe3JldHVybiBWW1ddfHxYfSl9fXJldHVybiBVfWZ1bmN0aW9uIGYoVSl7cmV0dXJuIFUmJlUubm9kZVR5cGU9PT0zJiYvXihbXHNcclxuXSt8KSQvLnRlc3QoVS5ub2RlVmFsdWUpfWZ1bmN0aW9uIEwoVyxWLFUpe3ZhciBYPWMuY3JlYXRlKFYsVSk7Vy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShYLFcpO1guYXBwZW5kQ2hpbGQoVyk7cmV0dXJuIFh9ZnVuY3Rpb24gbihVLGFjLFgpe3ZhciBXPVUuc3RhcnRDb250YWluZXIsWj1VLnN0YXJ0T2Zmc2V0LGFmPVUuZW5kQ29udGFpbmVyLGFhPVUuZW5kT2Zmc2V0LGFlLGFiO2Z1bmN0aW9uIGFkKGFpLGFqLGFnLGFoKXt2YXIgYWssYWw7YWg9YWh8fGMuZ2V0Um9vdCgpO2Zvcig7Oyl7YWs9YWkucGFyZW50Tm9kZTtpZihhaz09YWh8fCghYWNbMF0uYmxvY2tfZXhwYW5kJiZFKGFrKSkpe3JldHVybiBhaX1mb3IoYWU9YWtbYWpdO2FlJiZhZSE9YWk7YWU9YWVbYWddKXtpZihhZS5ub2RlVHlwZT09MSYmIUcoYWUpKXtyZXR1cm4gYWl9aWYoYWUubm9kZVR5cGU9PTMmJiFmKGFlKSl7cmV0dXJuIGFpfX1haT1haS5wYXJlbnROb2RlfXJldHVybiBhaX1pZihXLm5vZGVUeXBlPT0xJiZXLmhhc0NoaWxkTm9kZXMoKSl7YWI9Vy5jaGlsZE5vZGVzLmxlbmd0aC0xO1c9Vy5jaGlsZE5vZGVzW1o+YWI/YWI6Wl07aWYoVy5ub2RlVHlwZT09Myl7Wj0wfX1pZihhZi5ub2RlVHlwZT09MSYmYWYuaGFzQ2hpbGROb2RlcygpKXthYj1hZi5jaGlsZE5vZGVzLmxlbmd0aC0xO2FmPWFmLmNoaWxkTm9kZXNbYWE+YWI/YWI6YWEtMV07aWYoYWYubm9kZVR5cGU9PTMpe2FhPWFmLm5vZGVWYWx1ZS5sZW5ndGh9fWlmKEcoVy5wYXJlbnROb2RlKSl7Vz1XLnBhcmVudE5vZGV9aWYoRyhXKSl7Vz1XLm5leHRTaWJsaW5nfHxXfWlmKEcoYWYucGFyZW50Tm9kZSkpe2FmPWFmLnBhcmVudE5vZGV9aWYoRyhhZikpe2FmPWFmLnByZXZpb3VzU2libGluZ3x8YWZ9aWYoYWNbMF0uaW5saW5lfHxhY1swXS5ibG9ja19leHBhbmQpe1c9YWQoVywiZmlyc3RDaGlsZCIsIm5leHRTaWJsaW5nIik7YWY9YWQoYWYsImxhc3RDaGlsZCIsInByZXZpb3VzU2libGluZyIpfWlmKGFjWzBdLnNlbGVjdG9yJiZhY1swXS5leHBhbmQhPT1RJiYhYWNbMF0uaW5saW5lKXtmdW5jdGlvbiBZKGFoLGFnKXt2YXIgYWksYWosYWs7aWYoYWgubm9kZVR5cGU9PTMmJmFoLm5vZGVWYWx1ZS5sZW5ndGg9PTAmJmFoW2FnXSl7YWg9YWhbYWddfWFpPWwoYWgpO2Zvcihhaj0wO2FqPGFpLmxlbmd0aDthaisrKXtmb3IoYWs9MDthazxhYy5sZW5ndGg7YWsrKyl7aWYoYy5pcyhhaVthal0sYWNbYWtdLnNlbGVjdG9yKSl7cmV0dXJuIGFpW2FqXX19fXJldHVybiBhaH1XPVkoVywicHJldmlvdXNTaWJsaW5nIik7YWY9WShhZiwibmV4dFNpYmxpbmciKX1pZihhY1swXS5ibG9ja3x8YWNbMF0uc2VsZWN0b3Ipe2Z1bmN0aW9uIFYoYWgsYWcsYWope3ZhciBhaTtpZighYWNbMF0ud3JhcHBlcil7YWk9Yy5nZXRQYXJlbnQoYWgsYWNbMF0uYmxvY2spfWlmKCFhaSl7YWk9Yy5nZXRQYXJlbnQoYWgubm9kZVR5cGU9PTM/YWgucGFyZW50Tm9kZTphaCxFKX1pZihhaSYmYWNbMF0ud3JhcHBlcil7YWk9bChhaSwidWwsb2wiKS5yZXZlcnNlKClbMF18fGFpfWlmKCFhaSl7YWk9YWg7d2hpbGUoYWlbYWddJiYhRShhaVthZ10pKXthaT1haVthZ107aWYoZyhhaSwiYnIiKSl7YnJlYWt9fX1yZXR1cm4gYWl8fGFofVc9VihXLCJwcmV2aW91c1NpYmxpbmciKTthZj1WKGFmLCJuZXh0U2libGluZyIpO2lmKGFjWzBdLmJsb2NrKXtpZighRShXKSl7Vz1hZChXLCJmaXJzdENoaWxkIiwibmV4dFNpYmxpbmciKX1pZighRShhZikpe2FmPWFkKGFmLCJsYXN0Q2hpbGQiLCJwcmV2aW91c1NpYmxpbmciKX19fWlmKFcubm9kZVR5cGU9PTEpe1o9cihXKTtXPVcucGFyZW50Tm9kZX1pZihhZi5ub2RlVHlwZT09MSl7YWE9cihhZikrMTthZj1hZi5wYXJlbnROb2RlfXJldHVybntzdGFydENvbnRhaW5lcjpXLHN0YXJ0T2Zmc2V0OlosZW5kQ29udGFpbmVyOmFmLGVuZE9mZnNldDphYX19ZnVuY3Rpb24gUyhhYSxaLFgsVSl7dmFyIFcsVixZO2lmKCFoKFgsYWEpKXtyZXR1cm4gUX1pZihhYS5yZW1vdmUhPSJhbGwiKXtNKGFhLnN0eWxlcyxmdW5jdGlvbihhYyxhYil7YWM9cShhYyxaKTtpZih0eXBlb2YoYWIpPT09Im51bWJlciIpe2FiPWFjO1U9MH1pZighVXx8ZyhKKFUsYWIpLGFjKSl7Yy5zZXRTdHlsZShYLGFiLCIiKX1ZPTF9KTtpZihZJiZjLmdldEF0dHJpYihYLCJzdHlsZSIpPT0iIil7WC5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7WC5yZW1vdmVBdHRyaWJ1dGUoIl9tY2Vfc3R5bGUiKX1NKGFhLmF0dHJpYnV0ZXMsZnVuY3Rpb24oYWQsYWIpe3ZhciBhYzthZD1xKGFkLFopO2lmKHR5cGVvZihhYik9PT0ibnVtYmVyIil7YWI9YWQ7VT0wfWlmKCFVfHxnKGMuZ2V0QXR0cmliKFUsYWIpLGFkKSl7aWYoYWI9PSJjbGFzcyIpe2FkPWMuZ2V0QXR0cmliKFgsYWIpO2lmKGFkKXthYz0iIjtNKGFkLnNwbGl0KC9ccysvKSxmdW5jdGlvbihhZSl7aWYoL21jZVx3Ky8udGVzdChhZSkpe2FjKz0oYWM/IiAiOiIiKSthZX19KTtpZihhYyl7Yy5zZXRBdHRyaWIoWCxhYixhYyk7cmV0dXJufX19aWYoYWI9PSJjbGFzcyIpe1gucmVtb3ZlQXR0cmlidXRlKCJjbGFzc05hbWUiKX1pZihlLnRlc3QoYWIpKXtYLnJlbW92ZUF0dHJpYnV0ZSgiX21jZV8iK2FiKX1YLnJlbW92ZUF0dHJpYnV0ZShhYil9fSk7TShhYS5jbGFzc2VzLGZ1bmN0aW9uKGFiKXthYj1xKGFiLFopO2lmKCFVfHxjLmhhc0NsYXNzKFUsYWIpKXtjLnJlbW92ZUNsYXNzKFgsYWIpfX0pO1Y9Yy5nZXRBdHRyaWJzKFgpO2ZvcihXPTA7VzxWLmxlbmd0aDtXKyspe2lmKFZbV10ubm9kZU5hbWUuaW5kZXhPZigiXyIpIT09MCl7cmV0dXJuIFF9fX1pZihhYS5yZW1vdmUhPSJub25lIil7bShYLGFhKTtyZXR1cm4gQX19ZnVuY3Rpb24gbShXLFgpe3ZhciBVPVcucGFyZW50Tm9kZSxWO2lmKFguYmxvY2spe2lmKCFrKXtmdW5jdGlvbiBZKGFhLFosYWIpe2FhPUIoYWEsWixhYik7cmV0dXJuICFhYXx8KGFhLm5vZGVOYW1lPT0iQlIifHxFKGFhKSl9aWYoRShXKSYmIUUoVSkpe2lmKCFZKFcsUSkmJiFZKFcuZmlyc3RDaGlsZCxBLDEpKXtXLmluc2VydEJlZm9yZShjLmNyZWF0ZSgiYnIiKSxXLmZpcnN0Q2hpbGQpfWlmKCFZKFcsQSkmJiFZKFcubGFzdENoaWxkLFEsMSkpe1cuYXBwZW5kQ2hpbGQoYy5jcmVhdGUoImJyIikpfX19ZWxzZXtpZihVPT1jLmdldFJvb3QoKSl7aWYoIVgubGlzdF9ibG9ja3x8IWcoVyxYLmxpc3RfYmxvY2spKXtNKGEuZ3JlcChXLmNoaWxkTm9kZXMpLGZ1bmN0aW9uKFope2lmKGQoayxaLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZighVil7Vj1MKFosayl9ZWxzZXtWLmFwcGVuZENoaWxkKFopfX1lbHNle1Y9MH19KX19fX1pZihYLnNlbGVjdG9yJiZYLmlubGluZSYmIWcoWC5pbmxpbmUsVykpe3JldHVybn1jLnJlbW92ZShXLDEpfWZ1bmN0aW9uIEIoVixVLFcpe2lmKFYpe1U9VT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciO2ZvcihWPVc/VjpWW1VdO1Y7Vj1WW1VdKXtpZihWLm5vZGVUeXBlPT0xfHwhZihWKSl7cmV0dXJuIFZ9fX19ZnVuY3Rpb24gRyhVKXtyZXR1cm4gVSYmVS5ub2RlVHlwZT09MSYmVS5nZXRBdHRyaWJ1dGUoIl9tY2VfdHlwZSIpPT0iYm9va21hcmsifWZ1bmN0aW9uIHQoWSxYKXt2YXIgVSxXLFY7ZnVuY3Rpb24gYWEoYWQsYWMpe2lmKGFkLm5vZGVOYW1lIT1hYy5ub2RlTmFtZSl7cmV0dXJuIFF9ZnVuY3Rpb24gYWIoYWYpe3ZhciBhZz17fTtNKGMuZ2V0QXR0cmlicyhhZiksZnVuY3Rpb24oYWgpe3ZhciBhaT1haC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKGFpLmluZGV4T2YoIl8iKSE9PTAmJmFpIT09InN0eWxlIil7YWdbYWldPWMuZ2V0QXR0cmliKGFmLGFpKX19KTtyZXR1cm4gYWd9ZnVuY3Rpb24gYWUoYWksYWgpe3ZhciBhZyxhZjtmb3IoYWYgaW4gYWkpe2lmKGFpLmhhc093blByb3BlcnR5KGFmKSl7YWc9YWhbYWZdO2lmKGFnPT09byl7cmV0dXJuIFF9aWYoYWlbYWZdIT1hZyl7cmV0dXJuIFF9ZGVsZXRlIGFoW2FmXX19Zm9yKGFmIGluIGFoKXtpZihhaC5oYXNPd25Qcm9wZXJ0eShhZikpe3JldHVybiBRfX1yZXR1cm4gQX1pZighYWUoYWIoYWQpLGFiKGFjKSkpe3JldHVybiBRfWlmKCFhZShjLnBhcnNlU3R5bGUoYy5nZXRBdHRyaWIoYWQsInN0eWxlIikpLGMucGFyc2VTdHlsZShjLmdldEF0dHJpYihhYywic3R5bGUiKSkpKXtyZXR1cm4gUX1yZXR1cm4gQX1pZihZJiZYKXtmdW5jdGlvbiBaKGFjLGFiKXtmb3IoVz1hYztXO1c9V1thYl0pe2lmKFcubm9kZVR5cGU9PTMmJiFmKFcpKXtyZXR1cm4gYWN9aWYoVy5ub2RlVHlwZT09MSYmIUcoVykpe3JldHVybiBXfX1yZXR1cm4gYWN9WT1aKFksInByZXZpb3VzU2libGluZyIpO1g9WihYLCJuZXh0U2libGluZyIpO2lmKGFhKFksWCkpe2ZvcihXPVkubmV4dFNpYmxpbmc7VyYmVyE9WDspe1Y9VztXPVcubmV4dFNpYmxpbmc7WS5hcHBlbmRDaGlsZChWKX1jLnJlbW92ZShYKTtNKGEuZ3JlcChYLmNoaWxkTm9kZXMpLGZ1bmN0aW9uKGFiKXtZLmFwcGVuZENoaWxkKGFiKX0pO3JldHVybiBZfX1yZXR1cm4gWH1mdW5jdGlvbiBGKFUpe3JldHVybi9eKGhbMS02XXxwfGRpdnxwcmV8YWRkcmVzc3xkbHxkdHxkZCkkLy50ZXN0KFUpfWZ1bmN0aW9uIEgoVixZKXt2YXIgVSxYLFc7VT1WW1k/InN0YXJ0Q29udGFpbmVyIjoiZW5kQ29udGFpbmVyIl07WD1WW1k/InN0YXJ0T2Zmc2V0IjoiZW5kT2Zmc2V0Il07aWYoVS5ub2RlVHlwZT09MSl7Vz1VLmNoaWxkTm9kZXMubGVuZ3RoLTE7aWYoIVkmJlgpe1gtLX1VPVUuY2hpbGROb2Rlc1tYPlc/VzpYXX1yZXR1cm4gVX1mdW5jdGlvbiBPKFosVixZKXt2YXIgVyxVPU5bWl0sYWE9TltaPT0iYXBwbHkiPyJyZW1vdmUiOiJhcHBseSJdO2Z1bmN0aW9uIGFiKCl7cmV0dXJuIE4uYXBwbHkubGVuZ3RofHxOLnJlbW92ZS5sZW5ndGh9ZnVuY3Rpb24gWCgpe04uYXBwbHk9W107Ti5yZW1vdmU9W119ZnVuY3Rpb24gYWMoYWQpe00oTi5hcHBseS5yZXZlcnNlKCksZnVuY3Rpb24oYWUpe1IoYWUubmFtZSxhZS52YXJzLGFkKX0pO00oTi5yZW1vdmUucmV2ZXJzZSgpLGZ1bmN0aW9uKGFlKXt6KGFlLm5hbWUsYWUudmFycyxhZCl9KTtjLnJlbW92ZShhZCwxKTtYKCl9Zm9yKFc9VS5sZW5ndGgtMTtXPj0wO1ctLSl7aWYoVVtXXS5uYW1lPT1WKXtyZXR1cm59fVUucHVzaCh7bmFtZTpWLHZhcnM6WX0pO2ZvcihXPWFhLmxlbmd0aC0xO1c+PTA7Vy0tKXtpZihhYVtXXS5uYW1lPT1WKXthYS5zcGxpY2UoVywxKX19aWYoYWIoKSl7VC5nZXREb2MoKS5leGVjQ29tbWFuZCgiRm9udE5hbWUiLGZhbHNlLCJtY2VpbmxpbmUiKTtOLmxhc3RSbmc9cC5nZXRSbmcoKTtNKGMuc2VsZWN0KCJmb250LHNwYW4iKSxmdW5jdGlvbihhZSl7dmFyIGFkO2lmKGIoYWUpKXthZD1wLmdldEJvb2ttYXJrKCk7YWMoYWUpO3AubW92ZVRvQm9va21hcmsoYWQpO1Qubm9kZUNoYW5nZWQoKX19KTtpZighTi5pc0xpc3RlbmluZyYmYWIoKSl7Ti5pc0xpc3RlbmluZz10cnVlO00oIm9uS2V5RG93bixvbktleVVwLG9uS2V5UHJlc3Msb25Nb3VzZVVwIi5zcGxpdCgiLCIpLGZ1bmN0aW9uKGFkKXtUW2FkXS5hZGRUb1RvcChmdW5jdGlvbihhZSxhZil7aWYoYWIoKSYmIWEuZG9tLlJhbmdlVXRpbHMuY29tcGFyZVJhbmdlcyhOLmxhc3RSbmcscC5nZXRSbmcoKSkpe00oYy5zZWxlY3QoImZvbnQsc3BhbiIpLGZ1bmN0aW9uKGFoKXt2YXIgYWksYWc7aWYoYihhaCkpe2FpPWFoLmZpcnN0Q2hpbGQ7aWYoYWkpe2FjKGFoKTthZz1jLmNyZWF0ZVJuZygpO2FnLnNldFN0YXJ0KGFpLGFpLm5vZGVWYWx1ZS5sZW5ndGgpO2FnLnNldEVuZChhaSxhaS5ub2RlVmFsdWUubGVuZ3RoKTtwLnNldFJuZyhhZyk7YWUubm9kZUNoYW5nZWQoKX1lbHNle2MucmVtb3ZlKGFoKX19fSk7aWYoYWYudHlwZT09ImtleXVwInx8YWYudHlwZT09Im1vdXNldXAiKXtYKCl9fX0pfSl9fX19fSkodGlueW1jZSk7dGlueW1jZS5vbkFkZEVkaXRvci5hZGQoZnVuY3Rpb24oZSxhKXt2YXIgZCxoLGcsYz1hLnNldHRpbmdzO2lmKGMuaW5saW5lX3N0eWxlcyl7aD1lLmV4cGxvZGUoYy5mb250X3NpemVfc3R5bGVfdmFsdWVzKTtmdW5jdGlvbiBiKGosaSl7ZS5lYWNoKGksZnVuY3Rpb24obCxrKXtpZihsKXtnLnNldFN0eWxlKGosayxsKX19KTtnLnJlbmFtZShqLCJzcGFuIil9ZD17Zm9udDpmdW5jdGlvbihqLGkpe2IoaSx7YmFja2dyb3VuZENvbG9yOmkuc3R5bGUuYmFja2dyb3VuZENvbG9yLGNvbG9yOmkuY29sb3IsZm9udEZhbWlseTppLmZhY2UsZm9udFNpemU6aFtwYXJzZUludChpLnNpemUpLTFdfSl9LHU6ZnVuY3Rpb24oaixpKXtiKGkse3RleHREZWNvcmF0aW9uOiJ1bmRlcmxpbmUifSl9LHN0cmlrZTpmdW5jdGlvbihqLGkpe2IoaSx7dGV4dERlY29yYXRpb246ImxpbmUtdGhyb3VnaCJ9KX19O2Z1bmN0aW9uIGYoaSxqKXtnPWkuZG9tO2lmKGMuY29udmVydF9mb250c190b19zcGFucyl7ZS5lYWNoKGcuc2VsZWN0KCJmb250LHUsc3RyaWtlIixqLm5vZGUpLGZ1bmN0aW9uKGspe2Rbay5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXShhLmRvbSxrKX0pfX1hLm9uUHJlUHJvY2Vzcy5hZGQoZik7YS5vbkluaXQuYWRkKGZ1bmN0aW9uKCl7YS5zZWxlY3Rpb24ub25TZXRDb250ZW50LmFkZChmKX0pfX0pOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/tiny_mce_dev.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiB0aW55X21jZV9kZXYuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqDQogKiBUaGlzIGZpbGUgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGlsZSBkZXZlbG9waW5nIFRpbnlNQ0UgDQogKiB0aW55X21jZS5qcyBvciB0aW55X21jZV9zcmMuanMgc2hvdWxkIGJlIHVzZWQgaW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50Lg0KICogVGhpcyBmaWxlIGxvYWRzIHRoZSBqcyBmaWxlcyBmcm9tIGNsYXNzZXMgaW5zdGVhZCBvZiBhIG1lcmdlZCBjb3B5Lg0KICovDQoNCihmdW5jdGlvbigpIHsNCgl2YXIgaSwgbmwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JyksIGJhc2UsIHNyYywgcCwgbGksIHF1ZXJ5ID0gJycsIGl0LCBzY3JpcHRzID0gW107DQoNCglpZiAod2luZG93LnRpbnlNQ0VQcmVJbml0KSB7DQoJCWJhc2UgPSB0aW55TUNFUHJlSW5pdC5iYXNlOw0KCQlxdWVyeSA9IHRpbnlNQ0VQcmVJbml0LnF1ZXJ5IHx8ICcnOw0KCX0gZWxzZSB7DQoJCWZvciAoaT0wOyBpPG5sLmxlbmd0aDsgaSsrKSB7DQoJCQlzcmMgPSBubFtpXS5zcmM7DQoNCgkJCWlmIChzcmMgJiYgc3JjLmluZGV4T2YoInRpbnlfbWNlX2Rldi5qcyIpICE9IC0xKSB7DQoJCQkJYmFzZSA9IHNyYy5zdWJzdHJpbmcoMCwgc3JjLmxhc3RJbmRleE9mKCcvJykpOw0KDQoJCQkJaWYgKChwID0gc3JjLmluZGV4T2YoJz8nKSkgIT0gLTEpDQoJCQkJCXF1ZXJ5ID0gc3JjLnN1YnN0cmluZyhwICsgMSk7DQoJCQl9DQoJCX0NCgl9DQoNCgkvLyBQYXJzZSBxdWVyeSBzdHJpbmcNCglsaSA9IHF1ZXJ5LnNwbGl0KCcmJyk7DQoJcXVlcnkgPSB7fTsNCglmb3IgKGk9MDsgaTxsaS5sZW5ndGg7IGkrKykgew0KCQlpdCA9IGxpW2ldLnNwbGl0KCc9Jyk7DQoJCXF1ZXJ5W3VuZXNjYXBlKGl0WzBdKV0gPSB1bmVzY2FwZShpdFsxXSk7DQoJfQ0KDQoJbmwgPSBudWxsOyAvLyBJRSBsZWFrIGZpeA0KDQoJZnVuY3Rpb24gaW5jbHVkZSh1KSB7DQoJCXNjcmlwdHMucHVzaChiYXNlICsgJy9jbGFzc2VzLycgKyB1KTsNCgl9Ow0KDQoJZnVuY3Rpb24gbG9hZCgpIHsNCgkJdmFyIGksIGh0bWwgPSAnJzsNCg0KCQlmb3IgKGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKykNCgkJCWh0bWwgKz0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicgKyBzY3JpcHRzW2ldICsgJyI+PC9zY3JpcHQ+XG4nOw0KDQoJCWRvY3VtZW50LndyaXRlKGh0bWwpOw0KCX07DQoNCgkvLyBGaXJlYnVnDQoJaWYgKHF1ZXJ5LmRlYnVnKQ0KCQlpbmNsdWRlKCdmaXJlYnVnL2ZpcmVidWctbGl0ZS5qcycpOw0KDQoJLy8gQ29yZSBucw0KCWluY2x1ZGUoJ3RpbnltY2UuanMnKTsNCg0KCS8vIExvYWQgZnJhbWV3b3JrIGFkYXB0ZXINCglpZiAocXVlcnkuYXBpKQ0KCQlpbmNsdWRlKCdhZGFwdGVyLycgKyBxdWVyeS5hcGkgKyAnL2FkYXB0ZXIuanMnKTsNCg0KCS8vIENvcmUgQVBJDQoJaW5jbHVkZSgndXRpbC9EaXNwYXRjaGVyLmpzJyk7DQoJaW5jbHVkZSgndXRpbC9VUkkuanMnKTsNCglpbmNsdWRlKCd1dGlsL0Nvb2tpZS5qcycpOw0KCWluY2x1ZGUoJ3V0aWwvSlNPTi5qcycpOw0KCWluY2x1ZGUoJ3V0aWwvSlNPTlAuanMnKTsNCglpbmNsdWRlKCd1dGlsL1hIUi5qcycpOw0KCWluY2x1ZGUoJ3V0aWwvSlNPTlJlcXVlc3QuanMnKTsNCglpbmNsdWRlKCdkb20vRE9NVXRpbHMuanMnKTsNCglpbmNsdWRlKCdkb20vUmFuZ2UuanMnKTsNCglpbmNsdWRlKCdkb20vVHJpZGVudFNlbGVjdGlvbi5qcycpOw0KCWluY2x1ZGUoJ2RvbS9TaXp6bGUuanMnKTsNCglpbmNsdWRlKCdkb20vRXZlbnRVdGlscy5qcycpOw0KCWluY2x1ZGUoJ2RvbS9FbGVtZW50LmpzJyk7DQoJaW5jbHVkZSgnZG9tL1NlbGVjdGlvbi5qcycpOw0KCWluY2x1ZGUoJ2RvbS9YTUxXcml0ZXIuanMnKTsNCglpbmNsdWRlKCdkb20vU2NoZW1hLmpzJyk7DQoJaW5jbHVkZSgnZG9tL1N0cmluZ1dyaXRlci5qcycpOw0KCWluY2x1ZGUoJ2RvbS9TZXJpYWxpemVyLmpzJyk7DQoJaW5jbHVkZSgnZG9tL1NjcmlwdExvYWRlci5qcycpOw0KCWluY2x1ZGUoJ2RvbS9UcmVlV2Fsa2VyLmpzJyk7DQoJaW5jbHVkZSgnZG9tL1JhbmdlVXRpbHMuanMnKTsNCglpbmNsdWRlKCd1aS9Db250cm9sLmpzJyk7DQoJaW5jbHVkZSgndWkvQ29udGFpbmVyLmpzJyk7DQoJaW5jbHVkZSgndWkvU2VwYXJhdG9yLmpzJyk7DQoJaW5jbHVkZSgndWkvTWVudUl0ZW0uanMnKTsNCglpbmNsdWRlKCd1aS9NZW51LmpzJyk7DQoJaW5jbHVkZSgndWkvRHJvcE1lbnUuanMnKTsNCglpbmNsdWRlKCd1aS9CdXR0b24uanMnKTsNCglpbmNsdWRlKCd1aS9MaXN0Qm94LmpzJyk7DQoJaW5jbHVkZSgndWkvTmF0aXZlTGlzdEJveC5qcycpOw0KCWluY2x1ZGUoJ3VpL01lbnVCdXR0b24uanMnKTsNCglpbmNsdWRlKCd1aS9TcGxpdEJ1dHRvbi5qcycpOw0KCWluY2x1ZGUoJ3VpL0NvbG9yU3BsaXRCdXR0b24uanMnKTsNCglpbmNsdWRlKCd1aS9Ub29sYmFyLmpzJyk7DQoJaW5jbHVkZSgnQWRkT25NYW5hZ2VyLmpzJyk7DQoJaW5jbHVkZSgnRWRpdG9yTWFuYWdlci5qcycpOw0KCWluY2x1ZGUoJ0VkaXRvci5qcycpOw0KCWluY2x1ZGUoJ0VkaXRvckNvbW1hbmRzLmpzJyk7DQoJaW5jbHVkZSgnVW5kb01hbmFnZXIuanMnKTsNCglpbmNsdWRlKCdGb3JjZUJsb2Nrcy5qcycpOw0KCWluY2x1ZGUoJ0NvbnRyb2xNYW5hZ2VyLmpzJyk7DQoJaW5jbHVkZSgnV2luZG93TWFuYWdlci5qcycpOw0KCWluY2x1ZGUoJ0Zvcm1hdHRlci5qcycpOw0KCWluY2x1ZGUoJ0NvbW1hbmRNYW5hZ2VyLmpzJyk7DQoJaW5jbHVkZSgnTGVnYWN5SW5wdXQuanMnKTsNCg0KCS8vIERldmVsb3BlciBBUEkNCglpbmNsdWRlKCd4bWwvUGFyc2VyLmpzJyk7DQoJaW5jbHVkZSgnRGV2ZWxvcGVyLmpzJyk7DQoNCglsb2FkKCk7DQp9KCkpOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/tiny_mce_jquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGQpe3ZhciBhPS9eXHMqfFxzKiQvZyxlLGM9IkIiLnJlcGxhY2UoL0EoLil8Qi8sIiQxIik9PT0iJDEiO3ZhciBiPXttYWpvclZlcnNpb246IjMiLG1pbm9yVmVyc2lvbjoiMy45LjMiLHJlbGVhc2VEYXRlOiIyMDEwLTEyLTIwIixfaW5pdDpmdW5jdGlvbigpe3ZhciBzPXRoaXMscT1kb2N1bWVudCxvPW5hdmlnYXRvcixnPW8udXNlckFnZW50LG0sZixsLGssaixyO3MuaXNPcGVyYT1kLm9wZXJhJiZvcGVyYS5idWlsZE51bWJlcjtzLmlzV2ViS2l0PS9XZWJLaXQvLnRlc3QoZyk7cy5pc0lFPSFzLmlzV2ViS2l0JiYhcy5pc09wZXJhJiYoL01TSUUvZ2kpLnRlc3QoZykmJigvRXhwbG9yZXIvZ2kpLnRlc3Qoby5hcHBOYW1lKTtzLmlzSUU2PXMuaXNJRSYmL01TSUUgWzU2XS8udGVzdChnKTtzLmlzR2Vja289IXMuaXNXZWJLaXQmJi9HZWNrby8udGVzdChnKTtzLmlzTWFjPWcuaW5kZXhPZigiTWFjIikhPS0xO3MuaXNBaXI9L2Fkb2JlYWlyL2kudGVzdChnKTtzLmlzSURldmljZT0vKGlQYWR8aVBob25lKS8udGVzdChnKTtpZihkLnRpbnlNQ0VQcmVJbml0KXtzLnN1ZmZpeD10aW55TUNFUHJlSW5pdC5zdWZmaXg7cy5iYXNlVVJMPXRpbnlNQ0VQcmVJbml0LmJhc2U7cy5xdWVyeT10aW55TUNFUHJlSW5pdC5xdWVyeTtyZXR1cm59cy5zdWZmaXg9IiI7Zj1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIik7Zm9yKG09MDttPGYubGVuZ3RoO20rKyl7aWYocj1mW21dLmhyZWYpe2lmKC9eaHR0cHM/OlwvXC9bXlwvXSskLy50ZXN0KHIpKXtyKz0iLyJ9az1yP3IubWF0Y2goLy4qXC8vKVswXToiIn19ZnVuY3Rpb24gaChpKXtpZihpLnNyYyYmL3RpbnlfbWNlKHxfZ3ppcHxfanF1ZXJ5fF9wcm90b3R5cGV8X2Z1bGwpKF9kZXZ8X3NyYyk/LmpzLy50ZXN0KGkuc3JjKSl7aWYoL18oc3JjfGRldilcLmpzL2cudGVzdChpLnNyYykpe3Muc3VmZml4PSJfc3JjIn1pZigoaj1pLnNyYy5pbmRleE9mKCI/IikpIT0tMSl7cy5xdWVyeT1pLnNyYy5zdWJzdHJpbmcoaisxKX1zLmJhc2VVUkw9aS5zcmMuc3Vic3RyaW5nKDAsaS5zcmMubGFzdEluZGV4T2YoIi8iKSk7aWYoayYmcy5iYXNlVVJMLmluZGV4T2YoIjovLyIpPT0tMSYmcy5iYXNlVVJMLmluZGV4T2YoIi8iKSE9PTApe3MuYmFzZVVSTD1rK3MuYmFzZVVSTH1yZXR1cm4gcy5iYXNlVVJMfXJldHVybiBudWxsfWY9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKG09MDttPGYubGVuZ3RoO20rKyl7aWYoaChmW21dKSl7cmV0dXJufX1sPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTtpZihsKXtmPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2ZvcihtPTA7bTxmLmxlbmd0aDttKyspe2lmKGgoZlttXSkpe3JldHVybn19fXJldHVybn0saXM6ZnVuY3Rpb24oZyxmKXtpZighZil7cmV0dXJuIGchPT1lfWlmKGY9PSJhcnJheSImJihnLmhhc093blByb3BlcnR5JiZnIGluc3RhbmNlb2YgQXJyYXkpKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gdHlwZW9mKGcpPT1mfSxlYWNoOmZ1bmN0aW9uKGksZixoKXt2YXIgaixnO2lmKCFpKXtyZXR1cm4gMH1oPWh8fGk7aWYoaS5sZW5ndGghPT1lKXtmb3Ioaj0wLGc9aS5sZW5ndGg7ajxnO2orKyl7aWYoZi5jYWxsKGgsaVtqXSxqLGkpPT09ZmFsc2Upe3JldHVybiAwfX19ZWxzZXtmb3IoaiBpbiBpKXtpZihpLmhhc093blByb3BlcnR5KGopKXtpZihmLmNhbGwoaCxpW2pdLGosaSk9PT1mYWxzZSl7cmV0dXJuIDB9fX19cmV0dXJuIDF9LHRyaW06ZnVuY3Rpb24oZil7cmV0dXJuKGY/IiIrZjoiIikucmVwbGFjZShhLCIiKX0sY3JlYXRlOmZ1bmN0aW9uKG4sZil7dmFyIG09dGhpcyxnLGksaixrLGgsbD0wO249L14oKHN0YXRpYykgKT8oW1x3Ll0rKSg6KFtcdy5dKykpPy8uZXhlYyhuKTtqPW5bM10ubWF0Y2goLyhefFwuKShcdyspJC9pKVsyXTtpPW0uY3JlYXRlTlMoblszXS5yZXBsYWNlKC9cLlx3KyQvLCIiKSk7aWYoaVtqXSl7cmV0dXJufWlmKG5bMl09PSJzdGF0aWMiKXtpW2pdPWY7aWYodGhpcy5vbkNyZWF0ZSl7dGhpcy5vbkNyZWF0ZShuWzJdLG5bM10saVtqXSl9cmV0dXJufWlmKCFmW2pdKXtmW2pdPWZ1bmN0aW9uKCl7fTtsPTF9aVtqXT1mW2pdO20uZXh0ZW5kKGlbal0ucHJvdG90eXBlLGYpO2lmKG5bNV0pe2c9bS5yZXNvbHZlKG5bNV0pLnByb3RvdHlwZTtrPW5bNV0ubWF0Y2goL1wuKFx3KykkL2kpWzFdO2g9aVtqXTtpZihsKXtpW2pdPWZ1bmN0aW9uKCl7cmV0dXJuIGdba10uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1lbHNle2lbal09ZnVuY3Rpb24oKXt0aGlzLnBhcmVudD1nW2tdO3JldHVybiBoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19aVtqXS5wcm90b3R5cGVbal09aVtqXTttLmVhY2goZyxmdW5jdGlvbihvLHApe2lbal0ucHJvdG90eXBlW3BdPWdbcF19KTttLmVhY2goZixmdW5jdGlvbihvLHApe2lmKGdbcF0pe2lbal0ucHJvdG90eXBlW3BdPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQ9Z1twXTtyZXR1cm4gby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWVsc2V7aWYocCE9ail7aVtqXS5wcm90b3R5cGVbcF09b319fSl9bS5lYWNoKGZbInN0YXRpYyJdLGZ1bmN0aW9uKG8scCl7aVtqXVtwXT1vfSk7aWYodGhpcy5vbkNyZWF0ZSl7dGhpcy5vbkNyZWF0ZShuWzJdLG5bM10saVtqXS5wcm90b3R5cGUpfX0sd2FsazpmdW5jdGlvbihpLGgsaixnKXtnPWd8fHRoaXM7aWYoaSl7aWYoail7aT1pW2pdfWIuZWFjaChpLGZ1bmN0aW9uKGssZil7aWYoaC5jYWxsKGcsayxmLGopPT09ZmFsc2Upe3JldHVybiBmYWxzZX1iLndhbGsoayxoLGosZyl9KX19LGNyZWF0ZU5TOmZ1bmN0aW9uKGosaCl7dmFyIGcsZjtoPWh8fGQ7aj1qLnNwbGl0KCIuIik7Zm9yKGc9MDtnPGoubGVuZ3RoO2crKyl7Zj1qW2ddO2lmKCFoW2ZdKXtoW2ZdPXt9fWg9aFtmXX1yZXR1cm4gaH0scmVzb2x2ZTpmdW5jdGlvbihqLGgpe3ZhciBnLGY7aD1ofHxkO2o9ai5zcGxpdCgiLiIpO2ZvcihnPTAsZj1qLmxlbmd0aDtnPGY7ZysrKXtoPWhbaltnXV07aWYoIWgpe2JyZWFrfX1yZXR1cm4gaH0sYWRkVW5sb2FkOmZ1bmN0aW9uKGosaSl7dmFyIGg9dGhpcztqPXtmdW5jOmosc2NvcGU6aXx8dGhpc307aWYoIWgudW5sb2Fkcyl7ZnVuY3Rpb24gZygpe3ZhciBmPWgudW5sb2FkcyxsLG07aWYoZil7Zm9yKG0gaW4gZil7bD1mW21dO2lmKGwmJmwuZnVuYyl7bC5mdW5jLmNhbGwobC5zY29wZSwxKX19aWYoZC5kZXRhY2hFdmVudCl7ZC5kZXRhY2hFdmVudCgib25iZWZvcmV1bmxvYWQiLGspO2QuZGV0YWNoRXZlbnQoIm9udW5sb2FkIixnKX1lbHNle2lmKGQucmVtb3ZlRXZlbnRMaXN0ZW5lcil7ZC5yZW1vdmVFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGcsZmFsc2UpfX1oLnVubG9hZHM9bD1mPXc9Zz0wO2lmKGQuQ29sbGVjdEdhcmJhZ2Upe0NvbGxlY3RHYXJiYWdlKCl9fX1mdW5jdGlvbiBrKCl7dmFyIGw9ZG9jdW1lbnQ7aWYobC5yZWFkeVN0YXRlPT0iaW50ZXJhY3RpdmUiKXtmdW5jdGlvbiBmKCl7bC5kZXRhY2hFdmVudCgib25zdG9wIixmKTtpZihnKXtnKCl9bD0wfWlmKGwpe2wuYXR0YWNoRXZlbnQoIm9uc3RvcCIsZil9ZC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYobCl7bC5kZXRhY2hFdmVudCgib25zdG9wIixmKX19LDApfX1pZihkLmF0dGFjaEV2ZW50KXtkLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsZyk7ZC5hdHRhY2hFdmVudCgib25iZWZvcmV1bmxvYWQiLGspfWVsc2V7aWYoZC5hZGRFdmVudExpc3RlbmVyKXtkLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZyxmYWxzZSl9fWgudW5sb2Fkcz1bal19ZWxzZXtoLnVubG9hZHMucHVzaChqKX1yZXR1cm4gan0scmVtb3ZlVW5sb2FkOmZ1bmN0aW9uKGkpe3ZhciBnPXRoaXMudW5sb2FkcyxoPW51bGw7Yi5lYWNoKGcsZnVuY3Rpb24oaixmKXtpZihqJiZqLmZ1bmM9PWkpe2cuc3BsaWNlKGYsMSk7aD1pO3JldHVybiBmYWxzZX19KTtyZXR1cm4gaH0sZXhwbG9kZTpmdW5jdGlvbihmLGcpe3JldHVybiBmP2IubWFwKGYuc3BsaXQoZ3x8IiwiKSxiLnRyaW0pOmZ9LF9hZGRWZXI6ZnVuY3Rpb24oZyl7dmFyIGY7aWYoIXRoaXMucXVlcnkpe3JldHVybiBnfWY9KGcuaW5kZXhPZigiPyIpPT0tMT8iPyI6IiYiKSt0aGlzLnF1ZXJ5O2lmKGcuaW5kZXhPZigiIyIpPT0tMSl7cmV0dXJuIGcrZn1yZXR1cm4gZy5yZXBsYWNlKCIjIixmKyIjIil9LF9yZXBsYWNlOmZ1bmN0aW9uKGgsZixnKXtpZihjKXtyZXR1cm4gZy5yZXBsYWNlKGgsZnVuY3Rpb24oKXt2YXIgbD1mLGo9YXJndW1lbnRzLGs7Zm9yKGs9MDtrPGoubGVuZ3RoLTI7aysrKXtpZihqW2tdPT09ZSl7bD1sLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFwkIitrLCJnIiksIiIpfWVsc2V7bD1sLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFwkIitrLCJnIiksaltrXSl9fXJldHVybiBsfSl9cmV0dXJuIGcucmVwbGFjZShoLGYpfX07Yi5faW5pdCgpO2QudGlueW1jZT1kLnRpbnlNQ0U9Yn0pKHdpbmRvdyk7KGZ1bmN0aW9uKGUsZCl7dmFyIGM9ZC5pcyxiPS9eKGhyZWZ8c3JjfHN0eWxlKSQvaSxmO2lmKCFlKXtyZXR1cm4gYWxlcnQoIkxvYWQgalF1ZXJ5IGZpcnN0ISIpfWQuJD1lO2QuYWRhcHRlcj17cGF0Y2hFZGl0b3I6ZnVuY3Rpb24oail7dmFyIGk9ZS5mbjtmdW5jdGlvbiBoKG4sbyl7dmFyIG09dGhpcztpZihvKXttLnJlbW92ZUF0dHIoIl9tY2Vfc3R5bGUiKX1yZXR1cm4gaS5jc3MuYXBwbHkobSxhcmd1bWVudHMpfWZ1bmN0aW9uIGcobixvKXt2YXIgbT10aGlzO2lmKGIudGVzdChuKSl7aWYobyE9PWYpe20uZWFjaChmdW5jdGlvbihwLHEpe2ouZG9tLnNldEF0dHJpYihxLG4sbyl9KTtyZXR1cm4gbX1lbHNle3JldHVybiBtLmF0dHIoIl9tY2VfIituKX19cmV0dXJuIGkuYXR0ci5hcHBseShtLGFyZ3VtZW50cyl9ZnVuY3Rpb24gayhtKXtyZXR1cm4gZnVuY3Rpb24obil7aWYobil7bj1qLmRvbS5wcm9jZXNzSFRNTChuKX1yZXR1cm4gbS5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIGwobSl7aWYobS5jc3MhPT1oKXttLmNzcz1oO20uYXR0cj1nO20uaHRtbD1rKGkuaHRtbCk7bS5hcHBlbmQ9ayhpLmFwcGVuZCk7bS5wcmVwZW5kPWsoaS5wcmVwZW5kKTttLmFmdGVyPWsoaS5hZnRlcik7bS5iZWZvcmU9ayhpLmJlZm9yZSk7bS5yZXBsYWNlV2l0aD1rKGkucmVwbGFjZVdpdGgpO20udGlueW1jZT1qO20ucHVzaFN0YWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGwoaS5wdXNoU3RhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpKX19cmV0dXJuIG19ai4kPWZ1bmN0aW9uKG0sbil7dmFyIG89ai5nZXREb2MoKTtyZXR1cm4gbChlKG18fG8sb3x8bikpfX19O2QuZXh0ZW5kPWUuZXh0ZW5kO2QuZXh0ZW5kKGQse21hcDplLm1hcCxncmVwOmZ1bmN0aW9uKGcsaCl7cmV0dXJuIGUuZ3JlcChnLGh8fGZ1bmN0aW9uKCl7cmV0dXJuIDF9KX0saW5BcnJheTpmdW5jdGlvbihnLGgpe3JldHVybiBlLmluQXJyYXkoaCxnfHxbXSl9fSk7dmFyIGE9eyJ0aW55bWNlLmRvbS5ET01VdGlscyI6e3NlbGVjdDpmdW5jdGlvbihpLGgpe3ZhciBnPXRoaXM7cmV0dXJuIGUuZmluZChpLGcuZ2V0KGgpfHxnLmdldChnLnNldHRpbmdzLnJvb3RfZWxlbWVudCl8fGcuZG9jLFtdKX0saXM6ZnVuY3Rpb24oaCxnKXtyZXR1cm4gZSh0aGlzLmdldChoKSkuaXMoZyl9fX07ZC5vbkNyZWF0ZT1mdW5jdGlvbihnLGksaCl7ZC5leHRlbmQoaCxhW2ldKX19KSh3aW5kb3cualF1ZXJ5LHRpbnltY2UpO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnV0aWwuRGlzcGF0Y2hlciIse3Njb3BlOm51bGwsbGlzdGVuZXJzOm51bGwsRGlzcGF0Y2hlcjpmdW5jdGlvbihhKXt0aGlzLnNjb3BlPWF8fHRoaXM7dGhpcy5saXN0ZW5lcnM9W119LGFkZDpmdW5jdGlvbihhLGIpe3RoaXMubGlzdGVuZXJzLnB1c2goe2NiOmEsc2NvcGU6Ynx8dGhpcy5zY29wZX0pO3JldHVybiBhfSxhZGRUb1RvcDpmdW5jdGlvbihhLGIpe3RoaXMubGlzdGVuZXJzLnVuc2hpZnQoe2NiOmEsc2NvcGU6Ynx8dGhpcy5zY29wZX0pO3JldHVybiBhfSxyZW1vdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5saXN0ZW5lcnMsYz1udWxsO3RpbnltY2UuZWFjaChiLGZ1bmN0aW9uKGUsZCl7aWYoYT09ZS5jYil7Yz1hO2Iuc3BsaWNlKGQsMSk7cmV0dXJuIGZhbHNlfX0pO3JldHVybiBjfSxkaXNwYXRjaDpmdW5jdGlvbigpe3ZhciBmLGQ9YXJndW1lbnRzLGUsYj10aGlzLmxpc3RlbmVycyxnO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspe2c9YltlXTtmPWcuY2IuYXBwbHkoZy5zY29wZSxkKTtpZihmPT09ZmFsc2Upe2JyZWFrfX1yZXR1cm4gZn19KTsoZnVuY3Rpb24oKXt2YXIgYT10aW55bWNlLmVhY2g7dGlueW1jZS5jcmVhdGUoInRpbnltY2UudXRpbC5VUkkiLHtVUkk6ZnVuY3Rpb24oZSxnKXt2YXIgZj10aGlzLGgsZCxjO2U9dGlueW1jZS50cmltKGUpO2c9Zi5zZXR0aW5ncz1nfHx7fTtpZigvXihtYWlsdG98dGVsfG5ld3N8amF2YXNjcmlwdHxhYm91dHxkYXRhKTovaS50ZXN0KGUpfHwvXlxzKiMvLnRlc3QoZSkpe2Yuc291cmNlPWU7cmV0dXJufWlmKGUuaW5kZXhPZigiLyIpPT09MCYmZS5pbmRleE9mKCIvLyIpIT09MCl7ZT0oZy5iYXNlX3VyaT9nLmJhc2VfdXJpLnByb3RvY29sfHwiaHR0cCI6Imh0dHAiKSsiOi8vbWNlX2hvc3QiK2V9aWYoIS9eXHcqOj9cL1wvLy50ZXN0KGUpKXtlPShnLmJhc2VfdXJpLnByb3RvY29sfHwiaHR0cCIpKyI6Ly9tY2VfaG9zdCIrZi50b0Fic1BhdGgoZy5iYXNlX3VyaS5wYXRoLGUpfWU9ZS5yZXBsYWNlKC9AQC9nLCIobWNlX2F0KSIpO2U9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKik6PyhbXjpAXSopKT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGUpO2EoWyJzb3VyY2UiLCJwcm90b2NvbCIsImF1dGhvcml0eSIsInVzZXJJbmZvIiwidXNlciIsInBhc3N3b3JkIiwiaG9zdCIsInBvcnQiLCJyZWxhdGl2ZSIsInBhdGgiLCJkaXJlY3RvcnkiLCJmaWxlIiwicXVlcnkiLCJhbmNob3IiXSxmdW5jdGlvbihiLGope3ZhciBrPWVbal07aWYoayl7az1rLnJlcGxhY2UoL1wobWNlX2F0XCkvZywiQEAiKX1mW2JdPWt9KTtpZihjPWcuYmFzZV91cmkpe2lmKCFmLnByb3RvY29sKXtmLnByb3RvY29sPWMucHJvdG9jb2x9aWYoIWYudXNlckluZm8pe2YudXNlckluZm89Yy51c2VySW5mb31pZighZi5wb3J0JiZmLmhvc3Q9PSJtY2VfaG9zdCIpe2YucG9ydD1jLnBvcnR9aWYoIWYuaG9zdHx8Zi5ob3N0PT0ibWNlX2hvc3QiKXtmLmhvc3Q9Yy5ob3N0fWYuc291cmNlPSIifX0sc2V0UGF0aDpmdW5jdGlvbihjKXt2YXIgYj10aGlzO2M9L14oLio/KVwvPyhcdyspPyQvLmV4ZWMoYyk7Yi5wYXRoPWNbMF07Yi5kaXJlY3Rvcnk9Y1sxXTtiLmZpbGU9Y1syXTtiLnNvdXJjZT0iIjtiLmdldFVSSSgpfSx0b1JlbGF0aXZlOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZDtpZihiPT09Ii4vIil7cmV0dXJuIGJ9Yj1uZXcgdGlueW1jZS51dGlsLlVSSShiLHtiYXNlX3VyaTpjfSk7aWYoKGIuaG9zdCE9Im1jZV9ob3N0IiYmYy5ob3N0IT1iLmhvc3QmJmIuaG9zdCl8fGMucG9ydCE9Yi5wb3J0fHxjLnByb3RvY29sIT1iLnByb3RvY29sKXtyZXR1cm4gYi5nZXRVUkkoKX1kPWMudG9SZWxQYXRoKGMucGF0aCxiLnBhdGgpO2lmKGIucXVlcnkpe2QrPSI/IitiLnF1ZXJ5fWlmKGIuYW5jaG9yKXtkKz0iIyIrYi5hbmNob3J9cmV0dXJuIGR9LHRvQWJzb2x1dGU6ZnVuY3Rpb24oYixjKXt2YXIgYj1uZXcgdGlueW1jZS51dGlsLlVSSShiLHtiYXNlX3VyaTp0aGlzfSk7cmV0dXJuIGIuZ2V0VVJJKHRoaXMuaG9zdD09Yi5ob3N0JiZ0aGlzLnByb3RvY29sPT1iLnByb3RvY29sP2M6MCl9LHRvUmVsUGF0aDpmdW5jdGlvbihnLGgpe3ZhciBjLGY9MCxkPSIiLGUsYjtnPWcuc3Vic3RyaW5nKDAsZy5sYXN0SW5kZXhPZigiLyIpKTtnPWcuc3BsaXQoIi8iKTtjPWguc3BsaXQoIi8iKTtpZihnLmxlbmd0aD49Yy5sZW5ndGgpe2ZvcihlPTAsYj1nLmxlbmd0aDtlPGI7ZSsrKXtpZihlPj1jLmxlbmd0aHx8Z1tlXSE9Y1tlXSl7Zj1lKzE7YnJlYWt9fX1pZihnLmxlbmd0aDxjLmxlbmd0aCl7Zm9yKGU9MCxiPWMubGVuZ3RoO2U8YjtlKyspe2lmKGU+PWcubGVuZ3RofHxnW2VdIT1jW2VdKXtmPWUrMTticmVha319fWlmKGY9PTEpe3JldHVybiBofWZvcihlPTAsYj1nLmxlbmd0aC0oZi0xKTtlPGI7ZSsrKXtkKz0iLi4vIn1mb3IoZT1mLTEsYj1jLmxlbmd0aDtlPGI7ZSsrKXtpZihlIT1mLTEpe2QrPSIvIitjW2VdfWVsc2V7ZCs9Y1tlXX19cmV0dXJuIGR9LHRvQWJzUGF0aDpmdW5jdGlvbihlLGYpe3ZhciBjLGI9MCxoPVtdLGQsZztkPS9cLyQvLnRlc3QoZik/Ii8iOiIiO2U9ZS5zcGxpdCgiLyIpO2Y9Zi5zcGxpdCgiLyIpO2EoZSxmdW5jdGlvbihpKXtpZihpKXtoLnB1c2goaSl9fSk7ZT1oO2ZvcihjPWYubGVuZ3RoLTEsaD1bXTtjPj0wO2MtLSl7aWYoZltjXS5sZW5ndGg9PTB8fGZbY109PSIuIil7Y29udGludWV9aWYoZltjXT09Ii4uIil7YisrO2NvbnRpbnVlfWlmKGI+MCl7Yi0tO2NvbnRpbnVlfWgucHVzaChmW2NdKX1jPWUubGVuZ3RoLWI7aWYoYzw9MCl7Zz1oLnJldmVyc2UoKS5qb2luKCIvIil9ZWxzZXtnPWUuc2xpY2UoMCxjKS5qb2luKCIvIikrIi8iK2gucmV2ZXJzZSgpLmpvaW4oIi8iKX1pZihnLmluZGV4T2YoIi8iKSE9PTApe2c9Ii8iK2d9aWYoZCYmZy5sYXN0SW5kZXhPZigiLyIpIT09Zy5sZW5ndGgtMSl7Zys9ZH1yZXR1cm4gZ30sZ2V0VVJJOmZ1bmN0aW9uKGQpe3ZhciBjLGI9dGhpcztpZighYi5zb3VyY2V8fGQpe2M9IiI7aWYoIWQpe2lmKGIucHJvdG9jb2wpe2MrPWIucHJvdG9jb2wrIjovLyJ9aWYoYi51c2VySW5mbyl7Yys9Yi51c2VySW5mbysiQCJ9aWYoYi5ob3N0KXtjKz1iLmhvc3R9aWYoYi5wb3J0KXtjKz0iOiIrYi5wb3J0fX1pZihiLnBhdGgpe2MrPWIucGF0aH1pZihiLnF1ZXJ5KXtjKz0iPyIrYi5xdWVyeX1pZihiLmFuY2hvcil7Yys9IiMiK2IuYW5jaG9yfWIuc291cmNlPWN9cmV0dXJuIGIuc291cmNlfX0pfSkoKTsoZnVuY3Rpb24oKXt2YXIgYT10aW55bWNlLmVhY2g7dGlueW1jZS5jcmVhdGUoInN0YXRpYyB0aW55bWNlLnV0aWwuQ29va2llIix7Z2V0SGFzaDpmdW5jdGlvbihkKXt2YXIgYj10aGlzLmdldChkKSxjO2lmKGIpe2EoYi5zcGxpdCgiJiIpLGZ1bmN0aW9uKGUpe2U9ZS5zcGxpdCgiPSIpO2M9Y3x8e307Y1t1bmVzY2FwZShlWzBdKV09dW5lc2NhcGUoZVsxXSl9KX1yZXR1cm4gY30sc2V0SGFzaDpmdW5jdGlvbihqLGIsZyxmLGksYyl7dmFyIGg9IiI7YShiLGZ1bmN0aW9uKGUsZCl7aCs9KCFoPyIiOiImIikrZXNjYXBlKGQpKyI9Iitlc2NhcGUoZSl9KTt0aGlzLnNldChqLGgsZyxmLGksYyl9LGdldDpmdW5jdGlvbihpKXt2YXIgaD1kb2N1bWVudC5jb29raWUsZyxmPWkrIj0iLGQ7aWYoIWgpe3JldHVybn1kPWguaW5kZXhPZigiOyAiK2YpO2lmKGQ9PS0xKXtkPWguaW5kZXhPZihmKTtpZihkIT0wKXtyZXR1cm4gbnVsbH19ZWxzZXtkKz0yfWc9aC5pbmRleE9mKCI7IixkKTtpZihnPT0tMSl7Zz1oLmxlbmd0aH1yZXR1cm4gdW5lc2NhcGUoaC5zdWJzdHJpbmcoZCtmLmxlbmd0aCxnKSl9LHNldDpmdW5jdGlvbihpLGIsZyxmLGgsYyl7ZG9jdW1lbnQuY29va2llPWkrIj0iK2VzY2FwZShiKSsoKGcpPyI7IGV4cGlyZXM9IitnLnRvR01UU3RyaW5nKCk6IiIpKygoZik/IjsgcGF0aD0iK2VzY2FwZShmKToiIikrKChoKT8iOyBkb21haW49IitoOiIiKSsoKGMpPyI7IHNlY3VyZSI6IiIpfSxyZW1vdmU6ZnVuY3Rpb24oZSxiKXt2YXIgYz1uZXcgRGF0ZSgpO2Muc2V0VGltZShjLmdldFRpbWUoKS0xMDAwKTt0aGlzLnNldChlLCIiLGMsYixjKX19KX0pKCk7dGlueW1jZS5jcmVhdGUoInN0YXRpYyB0aW55bWNlLnV0aWwuSlNPTiIse3NlcmlhbGl6ZTpmdW5jdGlvbihlKXt2YXIgYyxhLGQ9dGlueW1jZS51dGlsLkpTT04uc2VyaWFsaXplLGI7aWYoZT09bnVsbCl7cmV0dXJuIm51bGwifWI9dHlwZW9mIGU7aWYoYj09InN0cmluZyIpe2E9IlxiYlx0dFxublxmZlxyclwiXCInJ1xcXFwiO3JldHVybiciJytlLnJlcGxhY2UoLyhbXHUwMDgwLVx1RkZGRlx4MDAtXHgxZlwiXSkvZyxmdW5jdGlvbihnLGYpe2M9YS5pbmRleE9mKGYpO2lmKGMrMSl7cmV0dXJuIlxcIithLmNoYXJBdChjKzEpfWc9Zi5jaGFyQ29kZUF0KCkudG9TdHJpbmcoMTYpO3JldHVybiJcXHUiKyIwMDAwIi5zdWJzdHJpbmcoZy5sZW5ndGgpK2d9KSsnIid9aWYoYj09Im9iamVjdCIpe2lmKGUuaGFzT3duUHJvcGVydHkmJmUgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKGM9MCxhPSJbIjtjPGUubGVuZ3RoO2MrKyl7YSs9KGM+MD8iLCI6IiIpK2QoZVtjXSl9cmV0dXJuIGErIl0ifWE9InsiO2ZvcihjIGluIGUpe2ErPXR5cGVvZiBlW2NdIT0iZnVuY3Rpb24iPyhhLmxlbmd0aD4xPycsIic6JyInKStjKyciOicrZChlW2NdKToiIn1yZXR1cm4gYSsifSJ9cmV0dXJuIiIrZX0scGFyc2U6ZnVuY3Rpb24ocyl7dHJ5e3JldHVybiBldmFsKCIoIitzKyIpIil9Y2F0Y2goZXgpe319fSk7dGlueW1jZS5jcmVhdGUoInN0YXRpYyB0aW55bWNlLnV0aWwuWEhSIix7c2VuZDpmdW5jdGlvbihnKXt2YXIgYSxlLGI9d2luZG93LGg9MDtnLnNjb3BlPWcuc2NvcGV8fHRoaXM7Zy5zdWNjZXNzX3Njb3BlPWcuc3VjY2Vzc19zY29wZXx8Zy5zY29wZTtnLmVycm9yX3Njb3BlPWcuZXJyb3Jfc2NvcGV8fGcuc2NvcGU7Zy5hc3luYz1nLmFzeW5jPT09ZmFsc2U/ZmFsc2U6dHJ1ZTtnLmRhdGE9Zy5kYXRhfHwiIjtmdW5jdGlvbiBkKGkpe2E9MDt0cnl7YT1uZXcgQWN0aXZlWE9iamVjdChpKX1jYXRjaChjKXt9cmV0dXJuIGF9YT1iLlhNTEh0dHBSZXF1ZXN0P25ldyBYTUxIdHRwUmVxdWVzdCgpOmQoIk1pY3Jvc29mdC5YTUxIVFRQIil8fGQoIk1zeG1sMi5YTUxIVFRQIik7aWYoYSl7aWYoYS5vdmVycmlkZU1pbWVUeXBlKXthLm92ZXJyaWRlTWltZVR5cGUoZy5jb250ZW50X3R5cGUpfWEub3BlbihnLnR5cGV8fChnLmRhdGE/IlBPU1QiOiJHRVQiKSxnLnVybCxnLmFzeW5jKTtpZihnLmNvbnRlbnRfdHlwZSl7YS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGcuY29udGVudF90eXBlKX1hLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCJYTUxIdHRwUmVxdWVzdCIpO2Euc2VuZChnLmRhdGEpO2Z1bmN0aW9uIGYoKXtpZighZy5hc3luY3x8YS5yZWFkeVN0YXRlPT00fHxoKys+MTAwMDApe2lmKGcuc3VjY2VzcyYmaDwxMDAwMCYmYS5zdGF0dXM9PTIwMCl7Zy5zdWNjZXNzLmNhbGwoZy5zdWNjZXNzX3Njb3BlLCIiK2EucmVzcG9uc2VUZXh0LGEsZyl9ZWxzZXtpZihnLmVycm9yKXtnLmVycm9yLmNhbGwoZy5lcnJvcl9zY29wZSxoPjEwMDAwPyJUSU1FRF9PVVQiOiJHRU5FUkFMIixhLGcpfX1hPW51bGx9ZWxzZXtiLnNldFRpbWVvdXQoZiwxMCl9fWlmKCFnLmFzeW5jKXtyZXR1cm4gZigpfWU9Yi5zZXRUaW1lb3V0KGYsMTApfX19KTsoZnVuY3Rpb24oKXt2YXIgYz10aW55bWNlLmV4dGVuZCxiPXRpbnltY2UudXRpbC5KU09OLGE9dGlueW1jZS51dGlsLlhIUjt0aW55bWNlLmNyZWF0ZSgidGlueW1jZS51dGlsLkpTT05SZXF1ZXN0Iix7SlNPTlJlcXVlc3Q6ZnVuY3Rpb24oZCl7dGhpcy5zZXR0aW5ncz1jKHt9LGQpO3RoaXMuY291bnQ9MH0sc2VuZDpmdW5jdGlvbihmKXt2YXIgZT1mLmVycm9yLGQ9Zi5zdWNjZXNzO2Y9Yyh0aGlzLnNldHRpbmdzLGYpO2Yuc3VjY2Vzcz1mdW5jdGlvbihoLGcpe2g9Yi5wYXJzZShoKTtpZih0eXBlb2YoaCk9PSJ1bmRlZmluZWQiKXtoPXtlcnJvcjoiSlNPTiBQYXJzZSBlcnJvci4ifX1pZihoLmVycm9yKXtlLmNhbGwoZi5lcnJvcl9zY29wZXx8Zi5zY29wZSxoLmVycm9yLGcpfWVsc2V7ZC5jYWxsKGYuc3VjY2Vzc19zY29wZXx8Zi5zY29wZSxoLnJlc3VsdCl9fTtmLmVycm9yPWZ1bmN0aW9uKGgsZyl7ZS5jYWxsKGYuZXJyb3Jfc2NvcGV8fGYuc2NvcGUsaCxnKX07Zi5kYXRhPWIuc2VyaWFsaXplKHtpZDpmLmlkfHwiYyIrKHRoaXMuY291bnQrKyksbWV0aG9kOmYubWV0aG9kLHBhcmFtczpmLnBhcmFtc30pO2YuY29udGVudF90eXBlPSJhcHBsaWNhdGlvbi9qc29uIjthLnNlbmQoZil9LCJzdGF0aWMiOntzZW5kUlBDOmZ1bmN0aW9uKGQpe3JldHVybiBuZXcgdGlueW1jZS51dGlsLkpTT05SZXF1ZXN0KCkuc2VuZChkKX19fSl9KCkpOyhmdW5jdGlvbihtKXt2YXIgaz1tLmVhY2gsaj1tLmlzLGk9bS5pc1dlYktpdCxkPW0uaXNJRSxhPS9eKEhbMS02Ul18UHxESVZ8QUREUkVTU3xQUkV8Rk9STXxUKEFCTEV8Qk9EWXxIRUFEfEZPT1R8SHxSfEQpfExJfE9MfFVMfENBUFRJT058QkxPQ0tRVU9URXxDRU5URVJ8REx8RFR8RER8RElSfEZJRUxEU0VUfE5PU0NSSVBUfE1FTlV8SVNJTkRFWHxTQU1QKSQvLGU9ZygiY2hlY2tlZCxjb21wYWN0LGRlY2xhcmUsZGVmZXIsZGlzYWJsZWQsaXNtYXAsbXVsdGlwbGUsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm93cmFwLHJlYWRvbmx5LHNlbGVjdGVkIiksZj1nKCJzcmMsaHJlZixzdHlsZSxjb29yZHMsc2hhcGUiKSxjPXsiJiI6IiZhbXA7IiwnIic6IiZxdW90OyIsIjwiOiImbHQ7IiwiPiI6IiZndDsifSxuPS9bPD4mXCJdL2csYj0vXihbYS16MC05XSw/KSskL2ksaD0vPChcdyspKCg/OlxzK1x3Kyg/OlxzKj1ccyooPzooPzoiW14iXSoiKXwoPzonW14nXSonKXxbXj5cc10rKSk/KSopKFxzKlwvPyk+L2csbD0vKFx3KykoPzpccyo9XHMqKD86KD86IigoPzpcXC58W14iXSkqKSIpfCg/OicoKD86XFwufFteJ10pKiknKXwoW14+XHNdKykpKT8vZztmdW5jdGlvbiBnKHEpe3ZhciBwPXt9LG87cT1xLnNwbGl0KCIsIik7Zm9yKG89cS5sZW5ndGg7bz49MDtvLS0pe3BbcVtvXV09MX1yZXR1cm4gcH1tLmNyZWF0ZSgidGlueW1jZS5kb20uRE9NVXRpbHMiLHtkb2M6bnVsbCxyb290Om51bGwsZmlsZXM6bnVsbCxwaXhlbFN0eWxlczovXih0b3B8bGVmdHxib3R0b218cmlnaHR8d2lkdGh8aGVpZ2h0fGJvcmRlcldpZHRoKSQvLHByb3BzOnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixjbGFzc05hbWU6ImNsYXNzTmFtZSIsY2hlY2tlZDoiY2hlY2tlZCIsZGlzYWJsZWQ6ImRpc2FibGVkIixtYXhsZW5ndGg6Im1heExlbmd0aCIscmVhZG9ubHk6InJlYWRPbmx5IixzZWxlY3RlZDoic2VsZWN0ZWQiLHZhbHVlOiJ2YWx1ZSIsaWQ6ImlkIixuYW1lOiJuYW1lIix0eXBlOiJ0eXBlIn0sRE9NVXRpbHM6ZnVuY3Rpb24odSxxKXt2YXIgcD10aGlzLG87cC5kb2M9dTtwLndpbj13aW5kb3c7cC5maWxlcz17fTtwLmNzc0ZsaWNrZXI9ZmFsc2U7cC5jb3VudGVyPTA7cC5zdGRNb2RlPXUuZG9jdW1lbnRNb2RlPj04O3AuYm94TW9kZWw9IW0uaXNJRXx8dS5jb21wYXRNb2RlPT0iQ1NTMUNvbXBhdCJ8fHAuc3RkTW9kZTtwLnNldHRpbmdzPXE9bS5leHRlbmQoe2tlZXBfdmFsdWVzOmZhbHNlLGhleF9jb2xvcnM6MSxwcm9jZXNzX2h0bWw6MX0scSk7aWYobS5pc0lFNil7dHJ5e3UuZXhlY0NvbW1hbmQoIkJhY2tncm91bmRJbWFnZUNhY2hlIixmYWxzZSx0cnVlKX1jYXRjaChyKXtwLmNzc0ZsaWNrZXI9dHJ1ZX19aWYocS52YWxpZF9zdHlsZXMpe3AuX3N0eWxlcz17fTtrKHEudmFsaWRfc3R5bGVzLGZ1bmN0aW9uKHQscyl7cC5fc3R5bGVzW3NdPW0uZXhwbG9kZSh0KX0pfW0uYWRkVW5sb2FkKHAuZGVzdHJveSxwKX0sZ2V0Um9vdDpmdW5jdGlvbigpe3ZhciBvPXRoaXMscD1vLnNldHRpbmdzO3JldHVybihwJiZvLmdldChwLnJvb3RfZWxlbWVudCkpfHxvLmRvYy5ib2R5fSxnZXRWaWV3UG9ydDpmdW5jdGlvbihwKXt2YXIgcSxvO3A9IXA/dGhpcy53aW46cDtxPXAuZG9jdW1lbnQ7bz10aGlzLmJveE1vZGVsP3EuZG9jdW1lbnRFbGVtZW50OnEuYm9keTtyZXR1cm57eDpwLnBhZ2VYT2Zmc2V0fHxvLnNjcm9sbExlZnQseTpwLnBhZ2VZT2Zmc2V0fHxvLnNjcm9sbFRvcCx3OnAuaW5uZXJXaWR0aHx8by5jbGllbnRXaWR0aCxoOnAuaW5uZXJIZWlnaHR8fG8uY2xpZW50SGVpZ2h0fX0sZ2V0UmVjdDpmdW5jdGlvbihzKXt2YXIgcixvPXRoaXMscTtzPW8uZ2V0KHMpO3I9by5nZXRQb3Mocyk7cT1vLmdldFNpemUocyk7cmV0dXJue3g6ci54LHk6ci55LHc6cS53LGg6cS5ofX0sZ2V0U2l6ZTpmdW5jdGlvbihyKXt2YXIgcD10aGlzLG8scTtyPXAuZ2V0KHIpO289cC5nZXRTdHlsZShyLCJ3aWR0aCIpO3E9cC5nZXRTdHlsZShyLCJoZWlnaHQiKTtpZihvLmluZGV4T2YoInB4Iik9PT0tMSl7bz0wfWlmKHEuaW5kZXhPZigicHgiKT09PS0xKXtxPTB9cmV0dXJue3c6cGFyc2VJbnQobyl8fHIub2Zmc2V0V2lkdGh8fHIuY2xpZW50V2lkdGgsaDpwYXJzZUludChxKXx8ci5vZmZzZXRIZWlnaHR8fHIuY2xpZW50SGVpZ2h0fX0sZ2V0UGFyZW50OmZ1bmN0aW9uKHEscCxvKXtyZXR1cm4gdGhpcy5nZXRQYXJlbnRzKHEscCxvLGZhbHNlKX0sZ2V0UGFyZW50czpmdW5jdGlvbih6LHYscyx5KXt2YXIgcT10aGlzLHAsdT1xLnNldHRpbmdzLHg9W107ej1xLmdldCh6KTt5PXk9PT11bmRlZmluZWQ7aWYodS5zdHJpY3Rfcm9vdCl7cz1zfHxxLmdldFJvb3QoKX1pZihqKHYsInN0cmluZyIpKXtwPXY7aWYodj09PSIqIil7dj1mdW5jdGlvbihvKXtyZXR1cm4gby5ub2RlVHlwZT09MX19ZWxzZXt2PWZ1bmN0aW9uKG8pe3JldHVybiBxLmlzKG8scCl9fX13aGlsZSh6KXtpZih6PT1zfHwhei5ub2RlVHlwZXx8ei5ub2RlVHlwZT09PTkpe2JyZWFrfWlmKCF2fHx2KHopKXtpZih5KXt4LnB1c2goeil9ZWxzZXtyZXR1cm4gen19ej16LnBhcmVudE5vZGV9cmV0dXJuIHk/eDpudWxsfSxnZXQ6ZnVuY3Rpb24obyl7dmFyIHA7aWYobyYmdGhpcy5kb2MmJnR5cGVvZihvKT09InN0cmluZyIpe3A9bztvPXRoaXMuZG9jLmdldEVsZW1lbnRCeUlkKG8pO2lmKG8mJm8uaWQhPT1wKXtyZXR1cm4gdGhpcy5kb2MuZ2V0RWxlbWVudHNCeU5hbWUocClbMV19fXJldHVybiBvfSxnZXROZXh0OmZ1bmN0aW9uKHAsbyl7cmV0dXJuIHRoaXMuX2ZpbmRTaWIocCxvLCJuZXh0U2libGluZyIpfSxnZXRQcmV2OmZ1bmN0aW9uKHAsbyl7cmV0dXJuIHRoaXMuX2ZpbmRTaWIocCxvLCJwcmV2aW91c1NpYmxpbmciKX0sYWRkOmZ1bmN0aW9uKHMsdixvLHIsdSl7dmFyIHE9dGhpcztyZXR1cm4gdGhpcy5ydW4ocyxmdW5jdGlvbih5KXt2YXIgeCx0O3g9aih2LCJzdHJpbmciKT9xLmRvYy5jcmVhdGVFbGVtZW50KHYpOnY7cS5zZXRBdHRyaWJzKHgsbyk7aWYocil7aWYoci5ub2RlVHlwZSl7eC5hcHBlbmRDaGlsZChyKX1lbHNle3Euc2V0SFRNTCh4LHIpfX1yZXR1cm4gIXU/eS5hcHBlbmRDaGlsZCh4KTp4fSl9LGNyZWF0ZTpmdW5jdGlvbihxLG8scCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQocSkscSxvLHAsMSl9LGNyZWF0ZUhUTUw6ZnVuY3Rpb24odixwLHMpe3ZhciB1PSIiLHI9dGhpcyxxO3UrPSI8Iit2O2ZvcihxIGluIHApe2lmKHAuaGFzT3duUHJvcGVydHkocSkpe3UrPSIgIitxKyc9Iicrci5lbmNvZGUocFtxXSkrJyInfX1pZih0eXBlb2YocykhPSJ1bmRlZmluZWQiKXtyZXR1cm4gdSsiPiIrcysiPC8iK3YrIj4ifXJldHVybiB1KyIgLz4ifSxyZW1vdmU6ZnVuY3Rpb24obyxwKXtyZXR1cm4gdGhpcy5ydW4obyxmdW5jdGlvbihyKXt2YXIgcSxzO3E9ci5wYXJlbnROb2RlO2lmKCFxKXtyZXR1cm4gbnVsbH1pZihwKXt3aGlsZShzPXIuZmlyc3RDaGlsZCl7aWYoIW0uaXNJRXx8cy5ub2RlVHlwZSE9PTN8fHMubm9kZVZhbHVlKXtxLmluc2VydEJlZm9yZShzLHIpfWVsc2V7ci5yZW1vdmVDaGlsZChzKX19fXJldHVybiBxLnJlbW92ZUNoaWxkKHIpfSl9LHNldFN0eWxlOmZ1bmN0aW9uKHIsbyxwKXt2YXIgcT10aGlzO3JldHVybiBxLnJ1bihyLGZ1bmN0aW9uKHYpe3ZhciB1LHQ7dT12LnN0eWxlO289by5yZXBsYWNlKC8tKFxEKS9nLGZ1bmN0aW9uKHgscyl7cmV0dXJuIHMudG9VcHBlckNhc2UoKX0pO2lmKHEucGl4ZWxTdHlsZXMudGVzdChvKSYmKG0uaXMocCwibnVtYmVyIil8fC9eW1wtMC05XC5dKyQvLnRlc3QocCkpKXtwKz0icHgifXN3aXRjaChvKXtjYXNlIm9wYWNpdHkiOmlmKGQpe3UuZmlsdGVyPXA9PT0iIj8iIjoiYWxwaGEob3BhY2l0eT0iKyhwKjEwMCkrIikiO2lmKCFyLmN1cnJlbnRTdHlsZXx8IXIuY3VycmVudFN0eWxlLmhhc0xheW91dCl7dS5kaXNwbGF5PSJpbmxpbmUtYmxvY2sifX11W29dPXVbIi1tb3otb3BhY2l0eSJdPXVbIi1raHRtbC1vcGFjaXR5Il09cHx8IiI7YnJlYWs7Y2FzZSJmbG9hdCI6ZD91LnN0eWxlRmxvYXQ9cDp1LmNzc0Zsb2F0PXA7YnJlYWs7ZGVmYXVsdDp1W29dPXB8fCIifWlmKHEuc2V0dGluZ3MudXBkYXRlX3N0eWxlcyl7cS5zZXRBdHRyaWIodiwiX21jZV9zdHlsZSIpfX0pfSxnZXRTdHlsZTpmdW5jdGlvbihyLG8scSl7cj10aGlzLmdldChyKTtpZighcil7cmV0dXJuIGZhbHNlfWlmKHRoaXMuZG9jLmRlZmF1bHRWaWV3JiZxKXtvPW8ucmVwbGFjZSgvW0EtWl0vZyxmdW5jdGlvbihzKXtyZXR1cm4iLSIrc30pO3RyeXtyZXR1cm4gdGhpcy5kb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShyLG51bGwpLmdldFByb3BlcnR5VmFsdWUobyl9Y2F0Y2gocCl7cmV0dXJuIG51bGx9fW89by5yZXBsYWNlKC8tKFxEKS9nLGZ1bmN0aW9uKHQscyl7cmV0dXJuIHMudG9VcHBlckNhc2UoKX0pO2lmKG89PSJmbG9hdCIpe289ZD8ic3R5bGVGbG9hdCI6ImNzc0Zsb2F0In1pZihyLmN1cnJlbnRTdHlsZSYmcSl7cmV0dXJuIHIuY3VycmVudFN0eWxlW29dfXJldHVybiByLnN0eWxlW29dfSxzZXRTdHlsZXM6ZnVuY3Rpb24odSx2KXt2YXIgcT10aGlzLHI9cS5zZXR0aW5ncyxwO3A9ci51cGRhdGVfc3R5bGVzO3IudXBkYXRlX3N0eWxlcz0wO2sodixmdW5jdGlvbihvLHMpe3Euc2V0U3R5bGUodSxzLG8pfSk7ci51cGRhdGVfc3R5bGVzPXA7aWYoci51cGRhdGVfc3R5bGVzKXtxLnNldEF0dHJpYih1LHIuY3NzVGV4dCl9fSxzZXRBdHRyaWI6ZnVuY3Rpb24ocSxyLG8pe3ZhciBwPXRoaXM7aWYoIXF8fCFyKXtyZXR1cm59aWYocC5zZXR0aW5ncy5zdHJpY3Qpe3I9ci50b0xvd2VyQ2FzZSgpfXJldHVybiB0aGlzLnJ1bihxLGZ1bmN0aW9uKHUpe3ZhciB0PXAuc2V0dGluZ3M7c3dpdGNoKHIpe2Nhc2Uic3R5bGUiOmlmKCFqKG8sInN0cmluZyIpKXtrKG8sZnVuY3Rpb24ocyx4KXtwLnNldFN0eWxlKHUseCxzKX0pO3JldHVybn1pZih0LmtlZXBfdmFsdWVzKXtpZihvJiYhcC5faXNSZXMobykpe3Uuc2V0QXR0cmlidXRlKCJfbWNlX3N0eWxlIixvLDIpfWVsc2V7dS5yZW1vdmVBdHRyaWJ1dGUoIl9tY2Vfc3R5bGUiLDIpfX11LnN0eWxlLmNzc1RleHQ9bzticmVhaztjYXNlImNsYXNzIjp1LmNsYXNzTmFtZT1vfHwiIjticmVhaztjYXNlInNyYyI6Y2FzZSJocmVmIjppZih0LmtlZXBfdmFsdWVzKXtpZih0LnVybF9jb252ZXJ0ZXIpe289dC51cmxfY29udmVydGVyLmNhbGwodC51cmxfY29udmVydGVyX3Njb3BlfHxwLG8scix1KX1wLnNldEF0dHJpYih1LCJfbWNlXyIrcixvLDIpfWJyZWFrO2Nhc2Uic2hhcGUiOnUuc2V0QXR0cmlidXRlKCJfbWNlX3N0eWxlIixvKTticmVha31pZihqKG8pJiZvIT09bnVsbCYmby5sZW5ndGghPT0wKXt1LnNldEF0dHJpYnV0ZShyLCIiK28sMil9ZWxzZXt1LnJlbW92ZUF0dHJpYnV0ZShyLDIpfX0pfSxzZXRBdHRyaWJzOmZ1bmN0aW9uKHEscil7dmFyIHA9dGhpcztyZXR1cm4gdGhpcy5ydW4ocSxmdW5jdGlvbihvKXtrKHIsZnVuY3Rpb24ocyx0KXtwLnNldEF0dHJpYihvLHQscyl9KX0pfSxnZXRBdHRyaWI6ZnVuY3Rpb24ocixzLHEpe3ZhciBvLHA9dGhpcztyPXAuZ2V0KHIpO2lmKCFyfHxyLm5vZGVUeXBlIT09MSl7cmV0dXJuIGZhbHNlfWlmKCFqKHEpKXtxPSIifWlmKC9eKHNyY3xocmVmfHN0eWxlfGNvb3Jkc3xzaGFwZSkkLy50ZXN0KHMpKXtvPXIuZ2V0QXR0cmlidXRlKCJfbWNlXyIrcyk7aWYobyl7cmV0dXJuIG99fWlmKGQmJnAucHJvcHNbc10pe289cltwLnByb3BzW3NdXTtvPW8mJm8ubm9kZVZhbHVlP28ubm9kZVZhbHVlOm99aWYoIW8pe289ci5nZXRBdHRyaWJ1dGUocywyKX1pZigvXihjaGVja2VkfGNvbXBhY3R8ZGVjbGFyZXxkZWZlcnxkaXNhYmxlZHxpc21hcHxtdWx0aXBsZXxub2hyZWZ8bm9zaGFkZXxub3dyYXB8cmVhZG9ubHl8c2VsZWN0ZWQpJC8udGVzdChzKSl7aWYocltwLnByb3BzW3NdXT09PXRydWUmJm89PT0iIil7cmV0dXJuIHN9cmV0dXJuIG8/czoiIn1pZihyLm5vZGVOYW1lPT09IkZPUk0iJiZyLmdldEF0dHJpYnV0ZU5vZGUocykpe3JldHVybiByLmdldEF0dHJpYnV0ZU5vZGUocykubm9kZVZhbHVlfWlmKHM9PT0ic3R5bGUiKXtvPW98fHIuc3R5bGUuY3NzVGV4dDtpZihvKXtvPXAuc2VyaWFsaXplU3R5bGUocC5wYXJzZVN0eWxlKG8pLHIubm9kZU5hbWUpO2lmKHAuc2V0dGluZ3Mua2VlcF92YWx1ZXMmJiFwLl9pc1JlcyhvKSl7ci5zZXRBdHRyaWJ1dGUoIl9tY2Vfc3R5bGUiLG8pfX19aWYoaSYmcz09PSJjbGFzcyImJm8pe289by5yZXBsYWNlKC8oYXBwbGV8d2Via2l0KVwtW2EtelwtXSsvZ2ksIiIpfWlmKGQpe3N3aXRjaChzKXtjYXNlInJvd3NwYW4iOmNhc2UiY29sc3BhbiI6aWYobz09PTEpe289IiJ9YnJlYWs7Y2FzZSJzaXplIjppZihvPT09IiswInx8bz09PTIwfHxvPT09MCl7bz0iIn1icmVhaztjYXNlIndpZHRoIjpjYXNlImhlaWdodCI6Y2FzZSJ2c3BhY2UiOmNhc2UiY2hlY2tlZCI6Y2FzZSJkaXNhYmxlZCI6Y2FzZSJyZWFkb25seSI6aWYobz09PTApe289IiJ9YnJlYWs7Y2FzZSJoc3BhY2UiOmlmKG89PT0tMSl7bz0iIn1icmVhaztjYXNlIm1heGxlbmd0aCI6Y2FzZSJ0YWJpbmRleCI6aWYobz09PTMyNzY4fHxvPT09MjE0NzQ4MzY0N3x8bz09PSIzMjc2OCIpe289IiJ9YnJlYWs7Y2FzZSJtdWx0aXBsZSI6Y2FzZSJjb21wYWN0IjpjYXNlIm5vc2hhZGUiOmNhc2Uibm93cmFwIjppZihvPT09NjU1MzUpe3JldHVybiBzfXJldHVybiBxO2Nhc2Uic2hhcGUiOm89by50b0xvd2VyQ2FzZSgpO2JyZWFrO2RlZmF1bHQ6aWYocy5pbmRleE9mKCJvbiIpPT09MCYmbyl7bz1tLl9yZXBsYWNlKC9eZnVuY3Rpb25ccytcdytcKFwpXHMrXHtccysoLiopXHMrXH0kLywiJDEiLCIiK28pfX19cmV0dXJuKG8hPT11bmRlZmluZWQmJm8hPT1udWxsJiZvIT09IiIpPyIiK286cX0sZ2V0UG9zOmZ1bmN0aW9uKEEscyl7dmFyIHA9dGhpcyxvPTAsej0wLHUsdj1wLmRvYyxxO0E9cC5nZXQoQSk7cz1zfHx2LmJvZHk7aWYoQSl7aWYoZCYmIXAuc3RkTW9kZSl7QT1BLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3U9cC5ib3hNb2RlbD92LmRvY3VtZW50RWxlbWVudDp2LmJvZHk7bz1wLmdldFN0eWxlKHAuc2VsZWN0KCJodG1sIilbMF0sImJvcmRlcldpZHRoIik7bz0obz09Im1lZGl1bSJ8fHAuYm94TW9kZWwmJiFwLmlzSUU2KSYmMnx8bztyZXR1cm57eDpBLmxlZnQrdS5zY3JvbGxMZWZ0LW8seTpBLnRvcCt1LnNjcm9sbFRvcC1vfX1xPUE7d2hpbGUocSYmcSE9cyYmcS5ub2RlVHlwZSl7bys9cS5vZmZzZXRMZWZ0fHwwO3orPXEub2Zmc2V0VG9wfHwwO3E9cS5vZmZzZXRQYXJlbnR9cT1BLnBhcmVudE5vZGU7d2hpbGUocSYmcSE9cyYmcS5ub2RlVHlwZSl7by09cS5zY3JvbGxMZWZ0fHwwO3otPXEuc2Nyb2xsVG9wfHwwO3E9cS5wYXJlbnROb2RlfX1yZXR1cm57eDpvLHk6en19LHBhcnNlU3R5bGU6ZnVuY3Rpb24ocil7dmFyIHU9dGhpcyx2PXUuc2V0dGluZ3MseD17fTtpZighcil7cmV0dXJuIHh9ZnVuY3Rpb24gcChELEEsQyl7dmFyIHosQixvLHk7ej14W0QrIi10b3AiK0FdO2lmKCF6KXtyZXR1cm59Qj14W0QrIi1yaWdodCIrQV07aWYoeiE9Qil7cmV0dXJufW89eFtEKyItYm90dG9tIitBXTtpZihCIT1vKXtyZXR1cm59eT14W0QrIi1sZWZ0IitBXTtpZihvIT15KXtyZXR1cm59eFtDXT15O2RlbGV0ZSB4W0QrIi10b3AiK0FdO2RlbGV0ZSB4W0QrIi1yaWdodCIrQV07ZGVsZXRlIHhbRCsiLWJvdHRvbSIrQV07ZGVsZXRlIHhbRCsiLWxlZnQiK0FdfWZ1bmN0aW9uIHEoeSxzLG8sQSl7dmFyIHo7ej14W3NdO2lmKCF6KXtyZXR1cm59ej14W29dO2lmKCF6KXtyZXR1cm59ej14W0FdO2lmKCF6KXtyZXR1cm59eFt5XT14W3NdKyIgIit4W29dKyIgIit4W0FdO2RlbGV0ZSB4W3NdO2RlbGV0ZSB4W29dO2RlbGV0ZSB4W0FdfXI9ci5yZXBsYWNlKC8mKCM/W2EtejAtOV0rKTsvZywiJiQxX01DRV9TRU1JXyIpO2soci5zcGxpdCgiOyIpLGZ1bmN0aW9uKHMpe3ZhciBvLHQ9W107aWYocyl7cz1zLnJlcGxhY2UoL19NQ0VfU0VNSV8vZywiOyIpO3M9cy5yZXBsYWNlKC91cmxcKFteXCldK1wpL2csZnVuY3Rpb24oeSl7dC5wdXNoKHkpO3JldHVybiJ1cmwoIit0Lmxlbmd0aCsiKSJ9KTtzPXMuc3BsaXQoIjoiKTtvPW0udHJpbShzWzFdKTtvPW8ucmVwbGFjZSgvdXJsXCgoW15cKV0rKVwpL2csZnVuY3Rpb24oeix5KXtyZXR1cm4gdFtwYXJzZUludCh5KS0xXX0pO289by5yZXBsYWNlKC9yZ2JcKFteXCldK1wpL2csZnVuY3Rpb24oeSl7cmV0dXJuIHUudG9IZXgoeSl9KTtpZih2LnVybF9jb252ZXJ0ZXIpe289by5yZXBsYWNlKC91cmxcKFtcJ1wiXT8oW15cKVwnXCJdKylbXCdcIl0/XCkvZyxmdW5jdGlvbih5LHope3JldHVybiJ1cmwoIit2LnVybF9jb252ZXJ0ZXIuY2FsbCh2LnVybF9jb252ZXJ0ZXJfc2NvcGV8fHUsdS5kZWNvZGUoeiksInN0eWxlIixudWxsKSsiKSJ9KX14W20udHJpbShzWzBdKS50b0xvd2VyQ2FzZSgpXT1vfX0pO3AoImJvcmRlciIsIiIsImJvcmRlciIpO3AoImJvcmRlciIsIi13aWR0aCIsImJvcmRlci13aWR0aCIpO3AoImJvcmRlciIsIi1jb2xvciIsImJvcmRlci1jb2xvciIpO3AoImJvcmRlciIsIi1zdHlsZSIsImJvcmRlci1zdHlsZSIpO3AoInBhZGRpbmciLCIiLCJwYWRkaW5nIik7cCgibWFyZ2luIiwiIiwibWFyZ2luIik7cSgiYm9yZGVyIiwiYm9yZGVyLXdpZHRoIiwiYm9yZGVyLXN0eWxlIiwiYm9yZGVyLWNvbG9yIik7aWYoZCl7aWYoeC5ib3JkZXI9PSJtZWRpdW0gbm9uZSIpe3guYm9yZGVyPSIifX1yZXR1cm4geH0sc2VyaWFsaXplU3R5bGU6ZnVuY3Rpb24odixwKXt2YXIgcT10aGlzLHI9IiI7ZnVuY3Rpb24gdShzLG8pe2lmKG8mJnMpe2lmKG8uaW5kZXhPZigiLSIpPT09MCl7cmV0dXJufXN3aXRjaChvKXtjYXNlImZvbnQtd2VpZ2h0IjppZihzPT03MDApe3M9ImJvbGQifWJyZWFrO2Nhc2UiY29sb3IiOmNhc2UiYmFja2dyb3VuZC1jb2xvciI6cz1zLnRvTG93ZXJDYXNlKCk7YnJlYWt9cis9KHI/IiAiOiIiKStvKyI6ICIrcysiOyJ9fWlmKHAmJnEuX3N0eWxlcyl7ayhxLl9zdHlsZXNbIioiXSxmdW5jdGlvbihvKXt1KHZbb10sbyl9KTtrKHEuX3N0eWxlc1twLnRvTG93ZXJDYXNlKCldLGZ1bmN0aW9uKG8pe3UodltvXSxvKX0pfWVsc2V7ayh2LHUpfXJldHVybiByfSxsb2FkQ1NTOmZ1bmN0aW9uKG8pe3ZhciBxPXRoaXMscj1xLmRvYyxwO2lmKCFvKXtvPSIifXA9cS5zZWxlY3QoImhlYWQiKVswXTtrKG8uc3BsaXQoIiwiKSxmdW5jdGlvbihzKXt2YXIgdDtpZihxLmZpbGVzW3NdKXtyZXR1cm59cS5maWxlc1tzXT10cnVlO3Q9cS5jcmVhdGUoImxpbmsiLHtyZWw6InN0eWxlc2hlZXQiLGhyZWY6bS5fYWRkVmVyKHMpfSk7aWYoZCYmci5kb2N1bWVudE1vZGUmJnIucmVjYWxjKXt0Lm9ubG9hZD1mdW5jdGlvbigpe3IucmVjYWxjKCk7dC5vbmxvYWQ9bnVsbH19cC5hcHBlbmRDaGlsZCh0KX0pfSxhZGRDbGFzczpmdW5jdGlvbihvLHApe3JldHVybiB0aGlzLnJ1bihvLGZ1bmN0aW9uKHEpe3ZhciByO2lmKCFwKXtyZXR1cm4gMH1pZih0aGlzLmhhc0NsYXNzKHEscCkpe3JldHVybiBxLmNsYXNzTmFtZX1yPXRoaXMucmVtb3ZlQ2xhc3MocSxwKTtyZXR1cm4gcS5jbGFzc05hbWU9KHIhPSIiPyhyKyIgIik6IiIpK3B9KX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24ocSxyKXt2YXIgbz10aGlzLHA7cmV0dXJuIG8ucnVuKHEsZnVuY3Rpb24odCl7dmFyIHM7aWYoby5oYXNDbGFzcyh0LHIpKXtpZighcCl7cD1uZXcgUmVnRXhwKCIoXnxcXHMrKSIrcisiKFxccyt8JCkiLCJnIil9cz10LmNsYXNzTmFtZS5yZXBsYWNlKHAsIiAiKTtzPW0udHJpbShzIT0iICI/czoiIik7dC5jbGFzc05hbWU9cztpZighcyl7dC5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIik7dC5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfXJldHVybiBzfXJldHVybiB0LmNsYXNzTmFtZX0pfSxoYXNDbGFzczpmdW5jdGlvbihwLG8pe3A9dGhpcy5nZXQocCk7aWYoIXB8fCFvKXtyZXR1cm4gZmFsc2V9cmV0dXJuKCIgIitwLmNsYXNzTmFtZSsiICIpLmluZGV4T2YoIiAiK28rIiAiKSE9PS0xfSxzaG93OmZ1bmN0aW9uKG8pe3JldHVybiB0aGlzLnNldFN0eWxlKG8sImRpc3BsYXkiLCJibG9jayIpfSxoaWRlOmZ1bmN0aW9uKG8pe3JldHVybiB0aGlzLnNldFN0eWxlKG8sImRpc3BsYXkiLCJub25lIil9LGlzSGlkZGVuOmZ1bmN0aW9uKG8pe289dGhpcy5nZXQobyk7cmV0dXJuICFvfHxvLnN0eWxlLmRpc3BsYXk9PSJub25lInx8dGhpcy5nZXRTdHlsZShvLCJkaXNwbGF5Iik9PSJub25lIn0sdW5pcXVlSWQ6ZnVuY3Rpb24obyl7cmV0dXJuKCFvPyJtY2VfIjpvKSsodGhpcy5jb3VudGVyKyspfSxzZXRIVE1MOmZ1bmN0aW9uKHEscCl7dmFyIG89dGhpcztyZXR1cm4gdGhpcy5ydW4ocSxmdW5jdGlvbih2KXt2YXIgcix0LHMseix1LHI7cD1vLnByb2Nlc3NIVE1MKHApO2lmKGQpe2Z1bmN0aW9uIHkoKXt3aGlsZSh2LmZpcnN0Q2hpbGQpe3YuZmlyc3RDaGlsZC5yZW1vdmVOb2RlKCl9dHJ5e3YuaW5uZXJIVE1MPSI8YnIgLz4iK3A7di5yZW1vdmVDaGlsZCh2LmZpcnN0Q2hpbGQpfWNhdGNoKHgpe3I9by5jcmVhdGUoImRpdiIpO3IuaW5uZXJIVE1MPSI8YnIgLz4iK3A7ayhyLmNoaWxkTm9kZXMsZnVuY3Rpb24oQixBKXtpZihBKXt2LmFwcGVuZENoaWxkKEIpfX0pfX1pZihvLnNldHRpbmdzLmZpeF9pZV9wYXJhZ3JhcGhzKXtwPXAucmVwbGFjZSgvPHA+PFwvcD58PHAoW14+XSspPjxcL3A+fDxwW15cLytdXC8+L2dpLCc8cCQxIF9tY2Vfa2VlcD0idHJ1ZSI+Jm5ic3A7PC9wPicpfXkoKTtpZihvLnNldHRpbmdzLmZpeF9pZV9wYXJhZ3JhcGhzKXtzPXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInAiKTtmb3IodD1zLmxlbmd0aC0xLHI9MDt0Pj0wO3QtLSl7ej1zW3RdO2lmKCF6Lmhhc0NoaWxkTm9kZXMoKSl7aWYoIXouX21jZV9rZWVwKXtyPTE7YnJlYWt9ei5yZW1vdmVBdHRyaWJ1dGUoIl9tY2Vfa2VlcCIpfX19aWYocil7cD1wLnJlcGxhY2UoLzxwIChbXj5dKyk+fDxwPi9pZywnPGRpdiAkMSBfbWNlX3RtcD0iMSI+Jyk7cD1wLnJlcGxhY2UoLzxcL3A+L2dpLCI8L2Rpdj4iKTt5KCk7aWYoby5zZXR0aW5ncy5maXhfaWVfcGFyYWdyYXBocyl7cz12LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJESVYiKTtmb3IodD1zLmxlbmd0aC0xO3Q+PTA7dC0tKXt6PXNbdF07aWYoei5fbWNlX3RtcCl7dT1vLmRvYy5jcmVhdGVFbGVtZW50KCJwIik7ei5jbG9uZU5vZGUoZmFsc2UpLm91dGVySFRNTC5yZXBsYWNlKC8oW2EtejAtOVwtX10rKT0vZ2ksZnVuY3Rpb24oQSx4KXt2YXIgQjtpZih4IT09Il9tY2VfdG1wIil7Qj16LmdldEF0dHJpYnV0ZSh4KTtpZighQiYmeD09PSJjbGFzcyIpe0I9ei5jbGFzc05hbWV9dS5zZXRBdHRyaWJ1dGUoeCxCKX19KTtmb3Iocj0wO3I8ei5jaGlsZE5vZGVzLmxlbmd0aDtyKyspe3UuYXBwZW5kQ2hpbGQoei5jaGlsZE5vZGVzW3JdLmNsb25lTm9kZSh0cnVlKSl9ei5zd2FwTm9kZSh1KX19fX19ZWxzZXt2LmlubmVySFRNTD1wfXJldHVybiBwfSl9LHByb2Nlc3NIVE1MOmZ1bmN0aW9uKHIpe3ZhciBwPXRoaXMscT1wLnNldHRpbmdzLHY9W107aWYoIXEucHJvY2Vzc19odG1sKXtyZXR1cm4gcn1pZihkKXtyPXIucmVwbGFjZSgvJmFwb3M7L2csIiYjMzk7Iik7cj1yLnJlcGxhY2UoL1xzKyhkaXNhYmxlZHxjaGVja2VkfHJlYWRvbmx5fHNlbGVjdGVkKVxzKj1ccypbXCJcJ10/KGZhbHNlfDApW1wiXCddPy9naSwiIil9cj1tLl9yZXBsYWNlKC88YSggKShbXj5dKylcLz58PGFcLz4vZ2ksIjxhJDEkMj48L2E+IixyKTtpZihxLmtlZXBfdmFsdWVzKXtpZigvPHNjcmlwdHxub3NjcmlwdHxzdHlsZS9pLnRlc3Qocikpe2Z1bmN0aW9uIG8odCl7dD10LnJlcGxhY2UoLyg8IS0tXFtDREFUQVxbfFxdXF0tLT4pL2csIlxuIik7dD10LnJlcGxhY2UoL15bXHJcbl0qfFtcclxuXSokL2csIiIpO3Q9dC5yZXBsYWNlKC9eXHMqKFwvXC9ccyo8IS0tfFwvXC9ccyo8IVxbQ0RBVEFcW3w8IS0tfDwhXFtDREFUQVxbKVtcclxuXSovZywiIik7dD10LnJlcGxhY2UoL1xzKihcL1wvXHMqXF1cXT58XC9cL1xzKi0tPnxcXVxdPnwtLT58XF1cXS0tPilccyokL2csIiIpO3JldHVybiB0fXI9ci5yZXBsYWNlKC88c2NyaXB0KFtePl0rfCk+KFtcc1xTXSo/KTxcL3NjcmlwdD4vZ2ksZnVuY3Rpb24ocyx4LHQpe2lmKCF4KXt4PScgdHlwZT0idGV4dC9qYXZhc2NyaXB0Iid9eD14LnJlcGxhY2UoL3NyYz1cIihbXlwiXSspXCI/L2ksZnVuY3Rpb24oeSx6KXtpZihxLnVybF9jb252ZXJ0ZXIpe3o9cC5lbmNvZGUocS51cmxfY29udmVydGVyLmNhbGwocS51cmxfY29udmVydGVyX3Njb3BlfHxwLHAuZGVjb2RlKHopLCJzcmMiLCJzY3JpcHQiKSl9cmV0dXJuJ19tY2Vfc3JjPSInK3orJyInfSk7aWYobS50cmltKHQpKXt2LnB1c2gobyh0KSk7dD0iPCEtLVxuTUNFX1NDUklQVDoiKyh2Lmxlbmd0aC0xKSsiXG4vLyAtLT4ifXJldHVybiI8bWNlOnNjcmlwdCIreCsiPiIrdCsiPC9tY2U6c2NyaXB0PiJ9KTtyPXIucmVwbGFjZSgvPHN0eWxlKFtePl0rfCk+KFtcc1xTXSo/KTxcL3N0eWxlPi9naSxmdW5jdGlvbihzLHgsdCl7aWYodCl7di5wdXNoKG8odCkpO3Q9IjwhLS1cbk1DRV9TQ1JJUFQ6Iisodi5sZW5ndGgtMSkrIlxuLS0+In1yZXR1cm4iPG1jZTpzdHlsZSIreCsiPiIrdCsiPC9tY2U6c3R5bGU+PHN0eWxlICIreCsnIF9tY2VfYm9ndXM9IjEiPicrdCsiPC9zdHlsZT4ifSk7cj1yLnJlcGxhY2UoLzxub3NjcmlwdChbXj5dK3wpPihbXHNcU10qPyk8XC9ub3NjcmlwdD4vZyxmdW5jdGlvbihzLHgsdCl7cmV0dXJuIjxtY2U6bm9zY3JpcHQiK3grIj48IS0tIitwLmVuY29kZSh0KS5yZXBsYWNlKC8tLS9nLCImIzQ1OyYjNDU7IikrIi0tPjwvbWNlOm5vc2NyaXB0PiJ9KX1yPW0uX3JlcGxhY2UoLzwhXFtDREFUQVxbKFtcc1xTXSspXF1cXT4vZywiPCEtLVtDREFUQVskMV1dLS0+IixyKTtmdW5jdGlvbiB1KHMpe3JldHVybiBzLnJlcGxhY2UoaCxmdW5jdGlvbih5LHoseCx0KXtyZXR1cm4iPCIreit4LnJlcGxhY2UobCxmdW5jdGlvbihCLEEsRSxELEMpe3ZhciBGO0E9QS50b0xvd2VyQ2FzZSgpO0U9RXx8RHx8Q3x8IiI7aWYoZVtBXSl7aWYoRT09PSJmYWxzZSJ8fEU9PT0iMCIpe3JldHVybn1yZXR1cm4gQSsnPSInK0ErJyInfWlmKGZbQV0mJnguaW5kZXhPZigiX21jZV8iK0EpPT0tMSl7Rj1wLmRlY29kZShFKTtpZihxLnVybF9jb252ZXJ0ZXImJihBPT0ic3JjInx8QT09ImhyZWYiKSl7Rj1xLnVybF9jb252ZXJ0ZXIuY2FsbChxLnVybF9jb252ZXJ0ZXJfc2NvcGV8fHAsRixBLHopfWlmKEE9PSJzdHlsZSIpe0Y9cC5zZXJpYWxpemVTdHlsZShwLnBhcnNlU3R5bGUoRiksQSl9cmV0dXJuIEErJz0iJytFKyciIF9tY2VfJytBKyc9IicrcC5lbmNvZGUoRikrJyInfXJldHVybiBCfSkrdCsiPiJ9KX1yPXUocik7cj1yLnJlcGxhY2UoL01DRV9TQ1JJUFQ6KFswLTldKykvZyxmdW5jdGlvbih0LHMpe3JldHVybiB2W3NdfSl9cmV0dXJuIHJ9LGdldE91dGVySFRNTDpmdW5jdGlvbihvKXt2YXIgcDtvPXRoaXMuZ2V0KG8pO2lmKCFvKXtyZXR1cm4gbnVsbH1pZihvLm91dGVySFRNTCE9PXVuZGVmaW5lZCl7cmV0dXJuIG8ub3V0ZXJIVE1MfXA9KG8ub3duZXJEb2N1bWVudHx8dGhpcy5kb2MpLmNyZWF0ZUVsZW1lbnQoImJvZHkiKTtwLmFwcGVuZENoaWxkKG8uY2xvbmVOb2RlKHRydWUpKTtyZXR1cm4gcC5pbm5lckhUTUx9LHNldE91dGVySFRNTDpmdW5jdGlvbihyLHAscyl7dmFyIG89dGhpcztmdW5jdGlvbiBxKHUsdCx4KXt2YXIgeSx2O3Y9eC5jcmVhdGVFbGVtZW50KCJib2R5Iik7di5pbm5lckhUTUw9dDt5PXYubGFzdENoaWxkO3doaWxlKHkpe28uaW5zZXJ0QWZ0ZXIoeS5jbG9uZU5vZGUodHJ1ZSksdSk7eT15LnByZXZpb3VzU2libGluZ31vLnJlbW92ZSh1KX1yZXR1cm4gdGhpcy5ydW4ocixmdW5jdGlvbih1KXt1PW8uZ2V0KHUpO2lmKHUubm9kZVR5cGU9PTEpe3M9c3x8dS5vd25lckRvY3VtZW50fHxvLmRvYztpZihkKXt0cnl7aWYoZCYmdS5ub2RlVHlwZT09MSl7dS5vdXRlckhUTUw9cH1lbHNle3EodSxwLHMpfX1jYXRjaCh0KXtxKHUscCxzKX19ZWxzZXtxKHUscCxzKX19fSl9LGRlY29kZTpmdW5jdGlvbihwKXt2YXIgcSxyLG87aWYoLyZbXHcjXSs7Ly50ZXN0KHApKXtxPXRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3EuaW5uZXJIVE1MPXA7cj1xLmZpcnN0Q2hpbGQ7bz0iIjtpZihyKXtkb3tvKz1yLm5vZGVWYWx1ZX13aGlsZShyPXIubmV4dFNpYmxpbmcpfXJldHVybiBvfHxwfXJldHVybiBwfSxlbmNvZGU6ZnVuY3Rpb24obyl7cmV0dXJuKCIiK28pLnJlcGxhY2UobixmdW5jdGlvbihwKXtyZXR1cm4gY1twXX0pfSxpbnNlcnRBZnRlcjpmdW5jdGlvbihvLHApe3A9dGhpcy5nZXQocCk7cmV0dXJuIHRoaXMucnVuKG8sZnVuY3Rpb24ocil7dmFyIHEscztxPXAucGFyZW50Tm9kZTtzPXAubmV4dFNpYmxpbmc7aWYocyl7cS5pbnNlcnRCZWZvcmUocixzKX1lbHNle3EuYXBwZW5kQ2hpbGQocil9cmV0dXJuIHJ9KX0saXNCbG9jazpmdW5jdGlvbihvKXtpZihvLm5vZGVUeXBlJiZvLm5vZGVUeXBlIT09MSl7cmV0dXJuIGZhbHNlfW89by5ub2RlTmFtZXx8bztyZXR1cm4gYS50ZXN0KG8pfSxyZXBsYWNlOmZ1bmN0aW9uKHMscixwKXt2YXIgcT10aGlzO2lmKGoociwiYXJyYXkiKSl7cz1zLmNsb25lTm9kZSh0cnVlKX1yZXR1cm4gcS5ydW4ocixmdW5jdGlvbih0KXtpZihwKXtrKG0uZ3JlcCh0LmNoaWxkTm9kZXMpLGZ1bmN0aW9uKG8pe3MuYXBwZW5kQ2hpbGQobyl9KX1yZXR1cm4gdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChzLHQpfSl9LHJlbmFtZTpmdW5jdGlvbihyLG8pe3ZhciBxPXRoaXMscDtpZihyLm5vZGVOYW1lIT1vLnRvVXBwZXJDYXNlKCkpe3A9cS5jcmVhdGUobyk7ayhxLmdldEF0dHJpYnMociksZnVuY3Rpb24ocyl7cS5zZXRBdHRyaWIocCxzLm5vZGVOYW1lLHEuZ2V0QXR0cmliKHIscy5ub2RlTmFtZSkpfSk7cS5yZXBsYWNlKHAsciwxKX1yZXR1cm4gcHx8cn0sZmluZENvbW1vbkFuY2VzdG9yOmZ1bmN0aW9uKHEsbyl7dmFyIHI9cSxwO3doaWxlKHIpe3A9bzt3aGlsZShwJiZyIT1wKXtwPXAucGFyZW50Tm9kZX1pZihyPT1wKXticmVha31yPXIucGFyZW50Tm9kZX1pZighciYmcS5vd25lckRvY3VtZW50KXtyZXR1cm4gcS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudH1yZXR1cm4gcn0sdG9IZXg6ZnVuY3Rpb24obyl7dmFyIHE9L15ccypyZ2Jccyo/XChccyo/KFswLTldKylccyo/LFxzKj8oWzAtOV0rKVxzKj8sXHMqPyhbMC05XSspXHMqP1wpXHMqJC9pLmV4ZWMobyk7ZnVuY3Rpb24gcChyKXtyPXBhcnNlSW50KHIpLnRvU3RyaW5nKDE2KTtyZXR1cm4gci5sZW5ndGg+MT9yOiIwIityfWlmKHEpe289IiMiK3AocVsxXSkrcChxWzJdKStwKHFbM10pO3JldHVybiBvfXJldHVybiBvfSxnZXRDbGFzc2VzOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxvPVtdLHIsdT17fSx2PXMuc2V0dGluZ3MuY2xhc3NfZmlsdGVyLHE7aWYocy5jbGFzc2VzKXtyZXR1cm4gcy5jbGFzc2VzfWZ1bmN0aW9uIHgodCl7ayh0LmltcG9ydHMsZnVuY3Rpb24oeSl7eCh5KX0pO2sodC5jc3NSdWxlc3x8dC5ydWxlcyxmdW5jdGlvbih5KXtzd2l0Y2goeS50eXBlfHwxKXtjYXNlIDE6aWYoeS5zZWxlY3RvclRleHQpe2soeS5zZWxlY3RvclRleHQuc3BsaXQoIiwiKSxmdW5jdGlvbih6KXt6PXoucmVwbGFjZSgvXlxzKnxccyokfF5cc1wuL2csIiIpO2lmKC9cLm1jZS8udGVzdCh6KXx8IS9cLltcd1wtXSskLy50ZXN0KHopKXtyZXR1cm59cT16O3o9bS5fcmVwbGFjZSgvLipcLihbYS16MC05X1wtXSspLiovaSwiJDEiLHopO2lmKHYmJiEoej12KHoscSkpKXtyZXR1cm59aWYoIXVbel0pe28ucHVzaCh7ImNsYXNzIjp6fSk7dVt6XT0xfX0pfWJyZWFrO2Nhc2UgMzp4KHkuc3R5bGVTaGVldCk7YnJlYWt9fSl9dHJ5e2socy5kb2Muc3R5bGVTaGVldHMseCl9Y2F0Y2gocCl7fWlmKG8ubGVuZ3RoPjApe3MuY2xhc3Nlcz1vfXJldHVybiBvfSxydW46ZnVuY3Rpb24odSxyLHEpe3ZhciBwPXRoaXMsdjtpZihwLmRvYyYmdHlwZW9mKHUpPT09InN0cmluZyIpe3U9cC5nZXQodSl9aWYoIXUpe3JldHVybiBmYWxzZX1xPXF8fHRoaXM7aWYoIXUubm9kZVR5cGUmJih1Lmxlbmd0aHx8dS5sZW5ndGg9PT0wKSl7dj1bXTtrKHUsZnVuY3Rpb24ocyxvKXtpZihzKXtpZih0eXBlb2Yocyk9PSJzdHJpbmciKXtzPXAuZG9jLmdldEVsZW1lbnRCeUlkKHMpfXYucHVzaChyLmNhbGwocSxzLG8pKX19KTtyZXR1cm4gdn1yZXR1cm4gci5jYWxsKHEsdSl9LGdldEF0dHJpYnM6ZnVuY3Rpb24ocSl7dmFyIHA7cT10aGlzLmdldChxKTtpZighcSl7cmV0dXJuW119aWYoZCl7cD1bXTtpZihxLm5vZGVOYW1lPT0iT0JKRUNUIil7cmV0dXJuIHEuYXR0cmlidXRlc31pZihxLm5vZGVOYW1lPT09Ik9QVElPTiImJnRoaXMuZ2V0QXR0cmliKHEsInNlbGVjdGVkIikpe3AucHVzaCh7c3BlY2lmaWVkOjEsbm9kZU5hbWU6InNlbGVjdGVkIn0pfXEuY2xvbmVOb2RlKGZhbHNlKS5vdXRlckhUTUwucmVwbGFjZSgvPFwvP1tcdzpcLV0rID98PVtcIl1bXlwiXStcInw9XCdbXlwnXStcJ3w9W1x3XC1dK3w+L2dpLCIiKS5yZXBsYWNlKC9bXHc6XC1dKy9naSxmdW5jdGlvbihvKXtwLnB1c2goe3NwZWNpZmllZDoxLG5vZGVOYW1lOm99KX0pO3JldHVybiBwfXJldHVybiBxLmF0dHJpYnV0ZXN9LGRlc3Ryb3k6ZnVuY3Rpb24ocCl7dmFyIG89dGhpcztpZihvLmV2ZW50cyl7by5ldmVudHMuZGVzdHJveSgpfW8ud2luPW8uZG9jPW8ucm9vdD1vLmV2ZW50cz1udWxsO2lmKCFwKXttLnJlbW92ZVVubG9hZChvLmRlc3Ryb3kpfX0sY3JlYXRlUm5nOmZ1bmN0aW9uKCl7dmFyIG89dGhpcy5kb2M7cmV0dXJuIG8uY3JlYXRlUmFuZ2U/by5jcmVhdGVSYW5nZSgpOm5ldyBtLmRvbS5SYW5nZSh0aGlzKX0sbm9kZUluZGV4OmZ1bmN0aW9uKHMsdCl7dmFyIG89MCxxLHIscDtpZihzKXtmb3IocT1zLm5vZGVUeXBlLHM9cy5wcmV2aW91c1NpYmxpbmcscj1zO3M7cz1zLnByZXZpb3VzU2libGluZyl7cD1zLm5vZGVUeXBlO2lmKHQmJnA9PTMpe2lmKHA9PXF8fCFzLm5vZGVWYWx1ZS5sZW5ndGgpe2NvbnRpbnVlfX1vKys7cT1wfX1yZXR1cm4gb30sc3BsaXQ6ZnVuY3Rpb24odSxzLHkpe3ZhciB6PXRoaXMsbz16LmNyZWF0ZVJuZygpLHYscSx4O2Z1bmN0aW9uIHAoQSl7dmFyIHQscj1BLmNoaWxkTm9kZXM7aWYoQS5ub2RlVHlwZT09MSYmQS5nZXRBdHRyaWJ1dGUoIl9tY2VfdHlwZSIpPT0iYm9va21hcmsiKXtyZXR1cm59Zm9yKHQ9ci5sZW5ndGgtMTt0Pj0wO3QtLSl7cChyW3RdKX1pZihBLm5vZGVUeXBlIT05KXtpZihBLm5vZGVUeXBlPT0zJiZBLm5vZGVWYWx1ZS5sZW5ndGg+MCl7aWYoIXouaXNCbG9jayhBLnBhcmVudE5vZGUpfHxtLnRyaW0oQS5ub2RlVmFsdWUpLmxlbmd0aD4wKXtyZXR1cm59fWlmKEEubm9kZVR5cGU9PTEpe3I9QS5jaGlsZE5vZGVzO2lmKHIubGVuZ3RoPT0xJiZyWzBdJiZyWzBdLm5vZGVUeXBlPT0xJiZyWzBdLmdldEF0dHJpYnV0ZSgiX21jZV90eXBlIik9PSJib29rbWFyayIpe0EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoclswXSxBKX1pZihyLmxlbmd0aHx8L14oYnJ8aHJ8aW5wdXR8aW1nKSQvaS50ZXN0KEEubm9kZU5hbWUpKXtyZXR1cm59fXoucmVtb3ZlKEEpfXJldHVybiBBfWlmKHUmJnMpe28uc2V0U3RhcnQodS5wYXJlbnROb2RlLHoubm9kZUluZGV4KHUpKTtvLnNldEVuZChzLnBhcmVudE5vZGUsei5ub2RlSW5kZXgocykpO3Y9by5leHRyYWN0Q29udGVudHMoKTtvPXouY3JlYXRlUm5nKCk7by5zZXRTdGFydChzLnBhcmVudE5vZGUsei5ub2RlSW5kZXgocykrMSk7by5zZXRFbmQodS5wYXJlbnROb2RlLHoubm9kZUluZGV4KHUpKzEpO3E9by5leHRyYWN0Q29udGVudHMoKTt4PXUucGFyZW50Tm9kZTt4Lmluc2VydEJlZm9yZShwKHYpLHUpO2lmKHkpe3gucmVwbGFjZUNoaWxkKHkscyl9ZWxzZXt4Lmluc2VydEJlZm9yZShzLHUpfXguaW5zZXJ0QmVmb3JlKHAocSksdSk7ei5yZW1vdmUodSk7cmV0dXJuIHl8fHN9fSxiaW5kOmZ1bmN0aW9uKHMsbyxyLHEpe3ZhciBwPXRoaXM7aWYoIXAuZXZlbnRzKXtwLmV2ZW50cz1uZXcgbS5kb20uRXZlbnRVdGlscygpfXJldHVybiBwLmV2ZW50cy5hZGQocyxvLHIscXx8dGhpcyl9LHVuYmluZDpmdW5jdGlvbihyLG8scSl7dmFyIHA9dGhpcztpZighcC5ldmVudHMpe3AuZXZlbnRzPW5ldyBtLmRvbS5FdmVudFV0aWxzKCl9cmV0dXJuIHAuZXZlbnRzLnJlbW92ZShyLG8scSl9LF9maW5kU2liOmZ1bmN0aW9uKHIsbyxwKXt2YXIgcT10aGlzLHM9bztpZihyKXtpZihqKHMsInN0cmluZyIpKXtzPWZ1bmN0aW9uKHQpe3JldHVybiBxLmlzKHQsbyl9fWZvcihyPXJbcF07cjtyPXJbcF0pe2lmKHMocikpe3JldHVybiByfX19cmV0dXJuIG51bGx9LF9pc1JlczpmdW5jdGlvbihvKXtyZXR1cm4vXih0b3B8bGVmdHxib3R0b218cmlnaHR8d2lkdGh8aGVpZ2h0KS9pLnRlc3Qobyl8fC87XHMqKHRvcHxsZWZ0fGJvdHRvbXxyaWdodHx3aWR0aHxoZWlnaHQpL2kudGVzdChvKX19KTttLkRPTT1uZXcgbS5kb20uRE9NVXRpbHMoZG9jdW1lbnQse3Byb2Nlc3NfaHRtbDowfSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihjKXt2YXIgTj10aGlzLGU9Yy5kb2MsUz0wLEU9MSxqPTIsRD10cnVlLFI9ZmFsc2UsVT0ic3RhcnRPZmZzZXQiLGg9InN0YXJ0Q29udGFpbmVyIixQPSJlbmRDb250YWluZXIiLHo9ImVuZE9mZnNldCIsaz10aW55bWNlLmV4dGVuZCxuPWMubm9kZUluZGV4O2soTix7c3RhcnRDb250YWluZXI6ZSxzdGFydE9mZnNldDowLGVuZENvbnRhaW5lcjplLGVuZE9mZnNldDowLGNvbGxhcHNlZDpELGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyOmUsU1RBUlRfVE9fU1RBUlQ6MCxTVEFSVF9UT19FTkQ6MSxFTkRfVE9fRU5EOjIsRU5EX1RPX1NUQVJUOjMsc2V0U3RhcnQ6cSxzZXRFbmQ6cyxzZXRTdGFydEJlZm9yZTpnLHNldFN0YXJ0QWZ0ZXI6SSxzZXRFbmRCZWZvcmU6SixzZXRFbmRBZnRlcjp1LGNvbGxhcHNlOkEsc2VsZWN0Tm9kZTp4LHNlbGVjdE5vZGVDb250ZW50czpGLGNvbXBhcmVCb3VuZGFyeVBvaW50czp2LGRlbGV0ZUNvbnRlbnRzOnAsZXh0cmFjdENvbnRlbnRzOkgsY2xvbmVDb250ZW50czpkLGluc2VydE5vZGU6QyxzdXJyb3VuZENvbnRlbnRzOk0sY2xvbmVSYW5nZTpLfSk7ZnVuY3Rpb24gcShWLHQpe0IoRCxWLHQpfWZ1bmN0aW9uIHMoVix0KXtCKFIsVix0KX1mdW5jdGlvbiBnKHQpe3EodC5wYXJlbnROb2RlLG4odCkpfWZ1bmN0aW9uIEkodCl7cSh0LnBhcmVudE5vZGUsbih0KSsxKX1mdW5jdGlvbiBKKHQpe3ModC5wYXJlbnROb2RlLG4odCkpfWZ1bmN0aW9uIHUodCl7cyh0LnBhcmVudE5vZGUsbih0KSsxKX1mdW5jdGlvbiBBKHQpe2lmKHQpe05bUF09TltoXTtOW3pdPU5bVV19ZWxzZXtOW2hdPU5bUF07TltVXT1OW3pdfU4uY29sbGFwc2VkPUR9ZnVuY3Rpb24geCh0KXtnKHQpO3UodCl9ZnVuY3Rpb24gRih0KXtxKHQsMCk7cyh0LHQubm9kZVR5cGU9PT0xP3QuY2hpbGROb2Rlcy5sZW5ndGg6dC5ub2RlVmFsdWUubGVuZ3RoKX1mdW5jdGlvbiB2KFcsWCl7dmFyIFo9TltoXSxZPU5bVV0sVj1OW1BdLHQ9Tlt6XTtpZihXPT09MCl7cmV0dXJuIEcoWixZLFosWSl9aWYoVz09PTEpe3JldHVybiBHKFosWSxWLHQpfWlmKFc9PT0yKXtyZXR1cm4gRyhWLHQsVix0KX1pZihXPT09Myl7cmV0dXJuIEcoVix0LFosWSl9fWZ1bmN0aW9uIHAoKXttKGopfWZ1bmN0aW9uIEgoKXtyZXR1cm4gbShTKX1mdW5jdGlvbiBkKCl7cmV0dXJuIG0oRSl9ZnVuY3Rpb24gQyhZKXt2YXIgVj10aGlzW2hdLHQ9dGhpc1tVXSxYLFc7aWYoKFYubm9kZVR5cGU9PT0zfHxWLm5vZGVUeXBlPT09NCkmJlYubm9kZVZhbHVlKXtpZighdCl7Vi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShZLFYpfWVsc2V7aWYodD49Vi5ub2RlVmFsdWUubGVuZ3RoKXtjLmluc2VydEFmdGVyKFksVil9ZWxzZXtYPVYuc3BsaXRUZXh0KHQpO1YucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoWSxYKX19fWVsc2V7aWYoVi5jaGlsZE5vZGVzLmxlbmd0aD4wKXtXPVYuY2hpbGROb2Rlc1t0XX1pZihXKXtWLmluc2VydEJlZm9yZShZLFcpfWVsc2V7Vi5hcHBlbmRDaGlsZChZKX19fWZ1bmN0aW9uIE0oVil7dmFyIHQ9Ti5leHRyYWN0Q29udGVudHMoKTtOLmluc2VydE5vZGUoVik7Vi5hcHBlbmRDaGlsZCh0KTtOLnNlbGVjdE5vZGUoVil9ZnVuY3Rpb24gSygpe3JldHVybiBrKG5ldyBiKGMpLHtzdGFydENvbnRhaW5lcjpOW2hdLHN0YXJ0T2Zmc2V0Ok5bVV0sZW5kQ29udGFpbmVyOk5bUF0sZW5kT2Zmc2V0Ok5bel0sY29sbGFwc2VkOk4uY29sbGFwc2VkLGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyOk4uY29tbW9uQW5jZXN0b3JDb250YWluZXJ9KX1mdW5jdGlvbiBPKHQsVil7dmFyIFc7aWYodC5ub2RlVHlwZT09Myl7cmV0dXJuIHR9aWYoVjwwKXtyZXR1cm4gdH1XPXQuZmlyc3RDaGlsZDt3aGlsZShXJiZWPjApey0tVjtXPVcubmV4dFNpYmxpbmd9aWYoVyl7cmV0dXJuIFd9cmV0dXJuIHR9ZnVuY3Rpb24gbCgpe3JldHVybihOW2hdPT1OW1BdJiZOW1VdPT1OW3pdKX1mdW5jdGlvbiBHKFgsWixWLFkpe3ZhciBhYSxXLHQsYWIsYWQsYWM7aWYoWD09Vil7aWYoWj09WSl7cmV0dXJuIDB9aWYoWjxZKXtyZXR1cm4gLTF9cmV0dXJuIDF9YWE9Vjt3aGlsZShhYSYmYWEucGFyZW50Tm9kZSE9WCl7YWE9YWEucGFyZW50Tm9kZX1pZihhYSl7Vz0wO3Q9WC5maXJzdENoaWxkO3doaWxlKHQhPWFhJiZXPFope1crKzt0PXQubmV4dFNpYmxpbmd9aWYoWjw9Vyl7cmV0dXJuIC0xfXJldHVybiAxfWFhPVg7d2hpbGUoYWEmJmFhLnBhcmVudE5vZGUhPVYpe2FhPWFhLnBhcmVudE5vZGV9aWYoYWEpe1c9MDt0PVYuZmlyc3RDaGlsZDt3aGlsZSh0IT1hYSYmVzxZKXtXKys7dD10Lm5leHRTaWJsaW5nfWlmKFc8WSl7cmV0dXJuIC0xfXJldHVybiAxfWFiPWMuZmluZENvbW1vbkFuY2VzdG9yKFgsVik7YWQ9WDt3aGlsZShhZCYmYWQucGFyZW50Tm9kZSE9YWIpe2FkPWFkLnBhcmVudE5vZGV9aWYoIWFkKXthZD1hYn1hYz1WO3doaWxlKGFjJiZhYy5wYXJlbnROb2RlIT1hYil7YWM9YWMucGFyZW50Tm9kZX1pZighYWMpe2FjPWFifWlmKGFkPT1hYyl7cmV0dXJuIDB9dD1hYi5maXJzdENoaWxkO3doaWxlKHQpe2lmKHQ9PWFkKXtyZXR1cm4gLTF9aWYodD09YWMpe3JldHVybiAxfXQ9dC5uZXh0U2libGluZ319ZnVuY3Rpb24gQihWLFksWCl7dmFyIHQsVztpZihWKXtOW2hdPVk7TltVXT1YfWVsc2V7TltQXT1ZO05bel09WH10PU5bUF07d2hpbGUodC5wYXJlbnROb2RlKXt0PXQucGFyZW50Tm9kZX1XPU5baF07d2hpbGUoVy5wYXJlbnROb2RlKXtXPVcucGFyZW50Tm9kZX1pZihXPT10KXtpZihHKE5baF0sTltVXSxOW1BdLE5bel0pPjApe04uY29sbGFwc2UoVil9fWVsc2V7Ti5jb2xsYXBzZShWKX1OLmNvbGxhcHNlZD1sKCk7Ti5jb21tb25BbmNlc3RvckNvbnRhaW5lcj1jLmZpbmRDb21tb25BbmNlc3RvcihOW2hdLE5bUF0pfWZ1bmN0aW9uIG0oYWIpe3ZhciBhYSxYPTAsYWQ9MCxWLFosVyxZLHQsYWM7aWYoTltoXT09TltQXSl7cmV0dXJuIGYoYWIpfWZvcihhYT1OW1BdLFY9YWEucGFyZW50Tm9kZTtWO2FhPVYsVj1WLnBhcmVudE5vZGUpe2lmKFY9PU5baF0pe3JldHVybiByKGFhLGFiKX0rK1h9Zm9yKGFhPU5baF0sVj1hYS5wYXJlbnROb2RlO1Y7YWE9VixWPVYucGFyZW50Tm9kZSl7aWYoVj09TltQXSl7cmV0dXJuIFQoYWEsYWIpfSsrYWR9Wj1hZC1YO1c9TltoXTt3aGlsZShaPjApe1c9Vy5wYXJlbnROb2RlO1otLX1ZPU5bUF07d2hpbGUoWjwwKXtZPVkucGFyZW50Tm9kZTtaKyt9Zm9yKHQ9Vy5wYXJlbnROb2RlLGFjPVkucGFyZW50Tm9kZTt0IT1hYzt0PXQucGFyZW50Tm9kZSxhYz1hYy5wYXJlbnROb2RlKXtXPXQ7WT1hY31yZXR1cm4gbyhXLFksYWIpfWZ1bmN0aW9uIGYoWil7dmFyIGFiLFksWCxhYSx0LFcsVjtpZihaIT1qKXthYj1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKX1pZihOW1VdPT1OW3pdKXtyZXR1cm4gYWJ9aWYoTltoXS5ub2RlVHlwZT09Myl7WT1OW2hdLm5vZGVWYWx1ZTtYPVkuc3Vic3RyaW5nKE5bVV0sTlt6XSk7aWYoWiE9RSl7TltoXS5kZWxldGVEYXRhKE5bVV0sTlt6XS1OW1VdKTtOLmNvbGxhcHNlKEQpfWlmKFo9PWope3JldHVybn1hYi5hcHBlbmRDaGlsZChlLmNyZWF0ZVRleHROb2RlKFgpKTtyZXR1cm4gYWJ9YWE9TyhOW2hdLE5bVV0pO3Q9Tlt6XS1OW1VdO3doaWxlKHQ+MCl7Vz1hYS5uZXh0U2libGluZztWPXkoYWEsWik7aWYoYWIpe2FiLmFwcGVuZENoaWxkKFYpfS0tdDthYT1XfWlmKFohPUUpe04uY29sbGFwc2UoRCl9cmV0dXJuIGFifWZ1bmN0aW9uIHIoYWIsWSl7dmFyIGFhLFosVix0LFgsVztpZihZIT1qKXthYT1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKX1aPWkoYWIsWSk7aWYoYWEpe2FhLmFwcGVuZENoaWxkKFopfVY9bihhYik7dD1WLU5bVV07aWYodDw9MCl7aWYoWSE9RSl7Ti5zZXRFbmRCZWZvcmUoYWIpO04uY29sbGFwc2UoUil9cmV0dXJuIGFhfVo9YWIucHJldmlvdXNTaWJsaW5nO3doaWxlKHQ+MCl7WD1aLnByZXZpb3VzU2libGluZztXPXkoWixZKTtpZihhYSl7YWEuaW5zZXJ0QmVmb3JlKFcsYWEuZmlyc3RDaGlsZCl9LS10O1o9WH1pZihZIT1FKXtOLnNldEVuZEJlZm9yZShhYik7Ti5jb2xsYXBzZShSKX1yZXR1cm4gYWF9ZnVuY3Rpb24gVChaLFkpe3ZhciBhYixWLGFhLHQsWCxXO2lmKFkhPWope2FiPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpfWFhPVEoWixZKTtpZihhYil7YWIuYXBwZW5kQ2hpbGQoYWEpfVY9bihaKTsrK1Y7dD1OW3pdLVY7YWE9Wi5uZXh0U2libGluZzt3aGlsZSh0PjApe1g9YWEubmV4dFNpYmxpbmc7Vz15KGFhLFkpO2lmKGFiKXthYi5hcHBlbmRDaGlsZChXKX0tLXQ7YWE9WH1pZihZIT1FKXtOLnNldFN0YXJ0QWZ0ZXIoWik7Ti5jb2xsYXBzZShEKX1yZXR1cm4gYWJ9ZnVuY3Rpb24gbyhaLHQsYWMpe3ZhciBXLGFlLFksYWEsYWIsVixhZCxYO2lmKGFjIT1qKXthZT1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKX1XPVEoWixhYyk7aWYoYWUpe2FlLmFwcGVuZENoaWxkKFcpfVk9Wi5wYXJlbnROb2RlO2FhPW4oWik7YWI9bih0KTsrK2FhO1Y9YWItYWE7YWQ9Wi5uZXh0U2libGluZzt3aGlsZShWPjApe1g9YWQubmV4dFNpYmxpbmc7Vz15KGFkLGFjKTtpZihhZSl7YWUuYXBwZW5kQ2hpbGQoVyl9YWQ9WDstLVZ9Vz1pKHQsYWMpO2lmKGFlKXthZS5hcHBlbmRDaGlsZChXKX1pZihhYyE9RSl7Ti5zZXRTdGFydEFmdGVyKFopO04uY29sbGFwc2UoRCl9cmV0dXJuIGFlfWZ1bmN0aW9uIGkoYWEsYWIpe3ZhciBXPU8oTltQXSxOW3pdLTEpLGFjLFosWSx0LFYsWD1XIT1OW1BdO2lmKFc9PWFhKXtyZXR1cm4gTChXLFgsUixhYil9YWM9Vy5wYXJlbnROb2RlO1o9TChhYyxSLFIsYWIpO3doaWxlKGFjKXt3aGlsZShXKXtZPVcucHJldmlvdXNTaWJsaW5nO3Q9TChXLFgsUixhYik7aWYoYWIhPWope1ouaW5zZXJ0QmVmb3JlKHQsWi5maXJzdENoaWxkKX1YPUQ7Vz1ZfWlmKGFjPT1hYSl7cmV0dXJuIFp9Vz1hYy5wcmV2aW91c1NpYmxpbmc7YWM9YWMucGFyZW50Tm9kZTtWPUwoYWMsUixSLGFiKTtpZihhYiE9ail7Vi5hcHBlbmRDaGlsZChaKX1aPVZ9fWZ1bmN0aW9uIFEoYWEsYWIpe3ZhciBYPU8oTltoXSxOW1VdKSxZPVghPU5baF0sYWMsWixXLHQsVjtpZihYPT1hYSl7cmV0dXJuIEwoWCxZLEQsYWIpfWFjPVgucGFyZW50Tm9kZTtaPUwoYWMsUixELGFiKTt3aGlsZShhYyl7d2hpbGUoWCl7Vz1YLm5leHRTaWJsaW5nO3Q9TChYLFksRCxhYik7aWYoYWIhPWope1ouYXBwZW5kQ2hpbGQodCl9WT1EO1g9V31pZihhYz09YWEpe3JldHVybiBafVg9YWMubmV4dFNpYmxpbmc7YWM9YWMucGFyZW50Tm9kZTtWPUwoYWMsUixELGFiKTtpZihhYiE9ail7Vi5hcHBlbmRDaGlsZChaKX1aPVZ9fWZ1bmN0aW9uIEwodCxZLGFiLGFjKXt2YXIgWCxXLFosVixhYTtpZihZKXtyZXR1cm4geSh0LGFjKX1pZih0Lm5vZGVUeXBlPT0zKXtYPXQubm9kZVZhbHVlO2lmKGFiKXtWPU5bVV07Vz1YLnN1YnN0cmluZyhWKTtaPVguc3Vic3RyaW5nKDAsVil9ZWxzZXtWPU5bel07Vz1YLnN1YnN0cmluZygwLFYpO1o9WC5zdWJzdHJpbmcoVil9aWYoYWMhPUUpe3Qubm9kZVZhbHVlPVp9aWYoYWM9PWope3JldHVybn1hYT10LmNsb25lTm9kZShSKTthYS5ub2RlVmFsdWU9VztyZXR1cm4gYWF9aWYoYWM9PWope3JldHVybn1yZXR1cm4gdC5jbG9uZU5vZGUoUil9ZnVuY3Rpb24geShWLHQpe2lmKHQhPWope3JldHVybiB0PT1FP1YuY2xvbmVOb2RlKEQpOlZ9Vi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKFYpfX1hLlJhbmdlPWJ9KSh0aW55bWNlLmRvbSk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShnKXt2YXIgaT10aGlzLGo9Ilx1RkVGRiIsZSxoLGQ9Zy5kb20sYz10cnVlLGY9ZmFsc2U7ZnVuY3Rpb24gYigpe3ZhciBuPWcuZ2V0Um5nKCksaz1kLmNyZWF0ZVJuZygpLG0sbzttPW4uaXRlbT9uLml0ZW0oMCk6bi5wYXJlbnRFbGVtZW50KCk7aWYobS5vd25lckRvY3VtZW50IT1kLmRvYyl7cmV0dXJuIGt9aWYobi5pdGVtfHwhbS5oYXNDaGlsZE5vZGVzKCkpe2suc2V0U3RhcnQobS5wYXJlbnROb2RlLGQubm9kZUluZGV4KG0pKTtrLnNldEVuZChrLnN0YXJ0Q29udGFpbmVyLGsuc3RhcnRPZmZzZXQrMSk7cmV0dXJuIGt9bz1nLmlzQ29sbGFwc2VkKCk7ZnVuY3Rpb24gbChzKXt2YXIgdSxxLHQscCxBPTAseCx5LHoscix2O3I9bi5kdXBsaWNhdGUoKTtyLmNvbGxhcHNlKHMpO3U9ZC5jcmVhdGUoImEiKTt6PXIucGFyZW50RWxlbWVudCgpO2lmKCF6Lmhhc0NoaWxkTm9kZXMoKSl7a1tzPyJzZXRTdGFydCI6InNldEVuZCJdKHosMCk7cmV0dXJufXouYXBwZW5kQ2hpbGQodSk7ci5tb3ZlVG9FbGVtZW50VGV4dCh1KTt2PW4uY29tcGFyZUVuZFBvaW50cyhzPyJTdGFydFRvU3RhcnQiOiJFbmRUb0VuZCIscik7aWYodj4wKXtrW3M/InNldFN0YXJ0QWZ0ZXIiOiJzZXRFbmRBZnRlciJdKHopO2QucmVtb3ZlKHUpO3JldHVybn1wPXRpbnltY2UuZ3JlcCh6LmNoaWxkTm9kZXMpO3g9cC5sZW5ndGgtMTt3aGlsZShBPD14KXt5PU1hdGguZmxvb3IoKEEreCkvMik7ei5pbnNlcnRCZWZvcmUodSxwW3ldKTtyLm1vdmVUb0VsZW1lbnRUZXh0KHUpO3Y9bi5jb21wYXJlRW5kUG9pbnRzKHM/IlN0YXJ0VG9TdGFydCI6IkVuZFRvRW5kIixyKTtpZih2PjApe0E9eSsxfWVsc2V7aWYodjwwKXt4PXktMX1lbHNle2ZvdW5kPXRydWU7YnJlYWt9fX1xPXY+MHx8eT09MD91Lm5leHRTaWJsaW5nOnUucHJldmlvdXNTaWJsaW5nO2lmKHEubm9kZVR5cGU9PTEpe2QucmVtb3ZlKHUpO3Q9ZC5ub2RlSW5kZXgocSk7cT1xLnBhcmVudE5vZGU7aWYoIXN8fHk+MCl7dCsrfX1lbHNle2lmKHY+MHx8eT09MCl7ci5zZXRFbmRQb2ludChzPyJTdGFydFRvU3RhcnQiOiJFbmRUb0VuZCIsbik7dD1yLnRleHQubGVuZ3RofWVsc2V7ci5zZXRFbmRQb2ludChzPyJTdGFydFRvU3RhcnQiOiJFbmRUb0VuZCIsbik7dD1xLm5vZGVWYWx1ZS5sZW5ndGgtci50ZXh0Lmxlbmd0aH1kLnJlbW92ZSh1KX1rW3M/InNldFN0YXJ0Ijoic2V0RW5kIl0ocSx0KX1sKHRydWUpO2lmKCFvKXtsKCl9cmV0dXJuIGt9dGhpcy5hZGRSYW5nZT1mdW5jdGlvbihrKXt2YXIgcCxuLG0scix1LHMsdD1nLmRvbS5kb2Msbz10LmJvZHk7ZnVuY3Rpb24gbChCKXt2YXIgeCxBLHYseix5O3Y9ZC5jcmVhdGUoImEiKTt4PUI/bTp1O0E9Qj9yOnM7ej1wLmR1cGxpY2F0ZSgpO2lmKHg9PXQpe3g9bztBPTB9aWYoeC5ub2RlVHlwZT09Myl7eC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh2LHgpO3oubW92ZVRvRWxlbWVudFRleHQodik7ei5tb3ZlU3RhcnQoImNoYXJhY3RlciIsQSk7ZC5yZW1vdmUodik7cC5zZXRFbmRQb2ludChCPyJTdGFydFRvU3RhcnQiOiJFbmRUb0VuZCIseil9ZWxzZXt5PXguY2hpbGROb2RlcztpZih5Lmxlbmd0aCl7aWYoQT49eS5sZW5ndGgpe2QuaW5zZXJ0QWZ0ZXIodix5W3kubGVuZ3RoLTFdKX1lbHNle3guaW5zZXJ0QmVmb3JlKHYseVtBXSl9ei5tb3ZlVG9FbGVtZW50VGV4dCh2KX1lbHNle3Y9dC5jcmVhdGVUZXh0Tm9kZShqKTt4LmFwcGVuZENoaWxkKHYpO3oubW92ZVRvRWxlbWVudFRleHQodi5wYXJlbnROb2RlKTt6LmNvbGxhcHNlKGMpfXAuc2V0RW5kUG9pbnQoQj8iU3RhcnRUb1N0YXJ0IjoiRW5kVG9FbmQiLHopO2QucmVtb3ZlKHYpfX10aGlzLmRlc3Ryb3koKTttPWsuc3RhcnRDb250YWluZXI7cj1rLnN0YXJ0T2Zmc2V0O3U9ay5lbmRDb250YWluZXI7cz1rLmVuZE9mZnNldDtwPW8uY3JlYXRlVGV4dFJhbmdlKCk7aWYobT09dSYmbS5ub2RlVHlwZT09MSYmcj09cy0xKXtpZihyPT1zLTEpe3RyeXtuPW8uY3JlYXRlQ29udHJvbFJhbmdlKCk7bi5hZGRFbGVtZW50KG0uY2hpbGROb2Rlc1tyXSk7bi5zZWxlY3QoKTtuLnNjcm9sbEludG9WaWV3KCk7cmV0dXJufWNhdGNoKHEpe319fWwodHJ1ZSk7bCgpO3Auc2VsZWN0KCk7cC5zY3JvbGxJbnRvVmlldygpfTt0aGlzLmdldFJhbmdlQXQ9ZnVuY3Rpb24oKXtpZighZXx8IXRpbnltY2UuZG9tLlJhbmdlVXRpbHMuY29tcGFyZVJhbmdlcyhoLGcuZ2V0Um5nKCkpKXtlPWIoKTtoPWcuZ2V0Um5nKCl9dHJ5e2Uuc3RhcnRDb250YWluZXIubmV4dFNpYmxpbmd9Y2F0Y2goayl7ZT1iKCk7aD1udWxsfXJldHVybiBlfTt0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXtoPWU9bnVsbH19dGlueW1jZS5kb20uVHJpZGVudFNlbGVjdGlvbj1hfSkoKTsoZnVuY3Rpb24oZCl7dmFyIGY9ZC5lYWNoLGM9ZC5ET00sYj1kLmlzSUUsZT1kLmlzV2ViS2l0LGE7ZC5jcmVhdGUoInRpbnltY2UuZG9tLkV2ZW50VXRpbHMiLHtFdmVudFV0aWxzOmZ1bmN0aW9uKCl7dGhpcy5pbml0cz1bXTt0aGlzLmV2ZW50cz1bXX0sYWRkOmZ1bmN0aW9uKG0scCxsLGope3ZhciBnLGg9dGhpcyxpPWguZXZlbnRzLGs7aWYocCBpbnN0YW5jZW9mIEFycmF5KXtrPVtdO2YocCxmdW5jdGlvbihvKXtrLnB1c2goaC5hZGQobSxvLGwsaikpfSk7cmV0dXJuIGt9aWYobSYmbS5oYXNPd25Qcm9wZXJ0eSYmbSBpbnN0YW5jZW9mIEFycmF5KXtrPVtdO2YobSxmdW5jdGlvbihuKXtuPWMuZ2V0KG4pO2sucHVzaChoLmFkZChuLHAsbCxqKSl9KTtyZXR1cm4ga31tPWMuZ2V0KG0pO2lmKCFtKXtyZXR1cm59Zz1mdW5jdGlvbihuKXtpZihoLmRpc2FibGVkKXtyZXR1cm59bj1ufHx3aW5kb3cuZXZlbnQ7aWYobiYmYil7aWYoIW4udGFyZ2V0KXtuLnRhcmdldD1uLnNyY0VsZW1lbnR9ZC5leHRlbmQobixoLl9zdG9wcGVycyl9aWYoIWope3JldHVybiBsKG4pfXJldHVybiBsLmNhbGwoaixuKX07aWYocD09InVubG9hZCIpe2QudW5sb2Fkcy51bnNoaWZ0KHtmdW5jOmd9KTtyZXR1cm4gZ31pZihwPT0iaW5pdCIpe2lmKGguZG9tTG9hZGVkKXtnKCl9ZWxzZXtoLmluaXRzLnB1c2goZyl9cmV0dXJuIGd9aS5wdXNoKHtvYmo6bSxuYW1lOnAsZnVuYzpsLGNmdW5jOmcsc2NvcGU6an0pO2guX2FkZChtLHAsZyk7cmV0dXJuIGx9LHJlbW92ZTpmdW5jdGlvbihsLG0sayl7dmFyIGg9dGhpcyxnPWguZXZlbnRzLGk9ZmFsc2UsajtpZihsJiZsLmhhc093blByb3BlcnR5JiZsIGluc3RhbmNlb2YgQXJyYXkpe2o9W107ZihsLGZ1bmN0aW9uKG4pe249Yy5nZXQobik7ai5wdXNoKGgucmVtb3ZlKG4sbSxrKSl9KTtyZXR1cm4gan1sPWMuZ2V0KGwpO2YoZyxmdW5jdGlvbihvLG4pe2lmKG8ub2JqPT1sJiZvLm5hbWU9PW0mJigha3x8KG8uZnVuYz09a3x8by5jZnVuYz09aykpKXtnLnNwbGljZShuLDEpO2guX3JlbW92ZShsLG0sby5jZnVuYyk7aT10cnVlO3JldHVybiBmYWxzZX19KTtyZXR1cm4gaX0sY2xlYXI6ZnVuY3Rpb24obCl7dmFyIGo9dGhpcyxnPWouZXZlbnRzLGgsaztpZihsKXtsPWMuZ2V0KGwpO2ZvcihoPWcubGVuZ3RoLTE7aD49MDtoLS0pe2s9Z1toXTtpZihrLm9iaj09PWwpe2ouX3JlbW92ZShrLm9iaixrLm5hbWUsay5jZnVuYyk7ay5vYmo9ay5jZnVuYz1udWxsO2cuc3BsaWNlKGgsMSl9fX19LGNhbmNlbDpmdW5jdGlvbihnKXtpZighZyl7cmV0dXJuIGZhbHNlfXRoaXMuc3RvcChnKTtyZXR1cm4gdGhpcy5wcmV2ZW50KGcpfSxzdG9wOmZ1bmN0aW9uKGcpe2lmKGcuc3RvcFByb3BhZ2F0aW9uKXtnLnN0b3BQcm9wYWdhdGlvbigpfWVsc2V7Zy5jYW5jZWxCdWJibGU9dHJ1ZX1yZXR1cm4gZmFsc2V9LHByZXZlbnQ6ZnVuY3Rpb24oZyl7aWYoZy5wcmV2ZW50RGVmYXVsdCl7Zy5wcmV2ZW50RGVmYXVsdCgpfWVsc2V7Zy5yZXR1cm5WYWx1ZT1mYWxzZX1yZXR1cm4gZmFsc2V9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZz10aGlzO2YoZy5ldmVudHMsZnVuY3Rpb24oaixoKXtnLl9yZW1vdmUoai5vYmosai5uYW1lLGouY2Z1bmMpO2oub2JqPWouY2Z1bmM9bnVsbH0pO2cuZXZlbnRzPVtdO2c9bnVsbH0sX2FkZDpmdW5jdGlvbihoLGksZyl7aWYoaC5hdHRhY2hFdmVudCl7aC5hdHRhY2hFdmVudCgib24iK2ksZyl9ZWxzZXtpZihoLmFkZEV2ZW50TGlzdGVuZXIpe2guYWRkRXZlbnRMaXN0ZW5lcihpLGcsZmFsc2UpfWVsc2V7aFsib24iK2ldPWd9fX0sX3JlbW92ZTpmdW5jdGlvbihpLGosaCl7aWYoaSl7dHJ5e2lmKGkuZGV0YWNoRXZlbnQpe2kuZGV0YWNoRXZlbnQoIm9uIitqLGgpfWVsc2V7aWYoaS5yZW1vdmVFdmVudExpc3RlbmVyKXtpLnJlbW92ZUV2ZW50TGlzdGVuZXIoaixoLGZhbHNlKX1lbHNle2lbIm9uIitqXT1udWxsfX19Y2F0Y2goZyl7fX19LF9wYWdlSW5pdDpmdW5jdGlvbihoKXt2YXIgZz10aGlzO2lmKGcuZG9tTG9hZGVkKXtyZXR1cm59Zy5kb21Mb2FkZWQ9dHJ1ZTtmKGcuaW5pdHMsZnVuY3Rpb24oaSl7aSgpfSk7Zy5pbml0cz1bXX0sX3dhaXQ6ZnVuY3Rpb24oaSl7dmFyIGc9dGhpcyxoPWkuZG9jdW1lbnQ7aWYoaS50aW55TUNFX0daJiZ0aW55TUNFX0daLmxvYWRlZCl7Zy5kb21Mb2FkZWQ9MTtyZXR1cm59aWYoaC5hdHRhY2hFdmVudCl7aC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixmdW5jdGlvbigpe2lmKGgucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpe2guZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsYXJndW1lbnRzLmNhbGxlZSk7Zy5fcGFnZUluaXQoaSl9fSk7aWYoaC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmk9PWkudG9wKXsoZnVuY3Rpb24oKXtpZihnLmRvbUxvYWRlZCl7cmV0dXJufXRyeXtoLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGope3NldFRpbWVvdXQoYXJndW1lbnRzLmNhbGxlZSwwKTtyZXR1cm59Zy5fcGFnZUluaXQoaSl9KSgpfX1lbHNle2lmKGguYWRkRXZlbnRMaXN0ZW5lcil7Zy5fYWRkKGksIkRPTUNvbnRlbnRMb2FkZWQiLGZ1bmN0aW9uKCl7Zy5fcGFnZUluaXQoaSl9KX19Zy5fYWRkKGksImxvYWQiLGZ1bmN0aW9uKCl7Zy5fcGFnZUluaXQoaSl9KX0sX3N0b3BwZXJzOntwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMucmV0dXJuVmFsdWU9ZmFsc2V9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQnViYmxlPXRydWV9fX0pO2E9ZC5kb20uRXZlbnQ9bmV3IGQuZG9tLkV2ZW50VXRpbHMoKTthLl93YWl0KHdpbmRvdyk7ZC5hZGRVbmxvYWQoZnVuY3Rpb24oKXthLmRlc3Ryb3koKX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGEpe2EuZG9tLkVsZW1lbnQ9ZnVuY3Rpb24oZixkKXt2YXIgYj10aGlzLGUsYztiLnNldHRpbmdzPWQ9ZHx8e307Yi5pZD1mO2IuZG9tPWU9ZC5kb218fGEuRE9NO2lmKCFhLmlzSUUpe2M9ZS5nZXQoYi5pZCl9YS5lYWNoKCgiZ2V0UG9zLGdldFJlY3QsZ2V0UGFyZW50LGFkZCxzZXRTdHlsZSxnZXRTdHlsZSxzZXRTdHlsZXMsc2V0QXR0cmliLHNldEF0dHJpYnMsZ2V0QXR0cmliLGFkZENsYXNzLHJlbW92ZUNsYXNzLGhhc0NsYXNzLGdldE91dGVySFRNTCxzZXRPdXRlckhUTUwscmVtb3ZlLHNob3csaGlkZSxpc0hpZGRlbixzZXRIVE1MLGdldCIpLnNwbGl0KC8sLyksZnVuY3Rpb24oZyl7YltnXT1mdW5jdGlvbigpe3ZhciBoPVtmXSxqO2ZvcihqPTA7ajxhcmd1bWVudHMubGVuZ3RoO2orKyl7aC5wdXNoKGFyZ3VtZW50c1tqXSl9aD1lW2ddLmFwcGx5KGUsaCk7Yi51cGRhdGUoZyk7cmV0dXJuIGh9fSk7YS5leHRlbmQoYix7b246ZnVuY3Rpb24oaSxoLGcpe3JldHVybiBhLmRvbS5FdmVudC5hZGQoYi5pZCxpLGgsZyl9LGdldFhZOmZ1bmN0aW9uKCl7cmV0dXJue3g6cGFyc2VJbnQoYi5nZXRTdHlsZSgibGVmdCIpKSx5OnBhcnNlSW50KGIuZ2V0U3R5bGUoInRvcCIpKX19LGdldFNpemU6ZnVuY3Rpb24oKXt2YXIgZz1lLmdldChiLmlkKTtyZXR1cm57dzpwYXJzZUludChiLmdldFN0eWxlKCJ3aWR0aCIpfHxnLmNsaWVudFdpZHRoKSxoOnBhcnNlSW50KGIuZ2V0U3R5bGUoImhlaWdodCIpfHxnLmNsaWVudEhlaWdodCl9fSxtb3ZlVG86ZnVuY3Rpb24oZyxoKXtiLnNldFN0eWxlcyh7bGVmdDpnLHRvcDpofSl9LG1vdmVCeTpmdW5jdGlvbihnLGkpe3ZhciBoPWIuZ2V0WFkoKTtiLm1vdmVUbyhoLngrZyxoLnkraSl9LHJlc2l6ZVRvOmZ1bmN0aW9uKGcsaSl7Yi5zZXRTdHlsZXMoe3dpZHRoOmcsaGVpZ2h0Oml9KX0scmVzaXplQnk6ZnVuY3Rpb24oZyxqKXt2YXIgaT1iLmdldFNpemUoKTtiLnJlc2l6ZVRvKGkudytnLGkuaCtqKX0sdXBkYXRlOmZ1bmN0aW9uKGgpe3ZhciBnO2lmKGEuaXNJRTYmJmQuYmxvY2tlcil7aD1ofHwiIjtpZihoLmluZGV4T2YoImdldCIpPT09MHx8aC5pbmRleE9mKCJoYXMiKT09PTB8fGguaW5kZXhPZigiaXMiKT09PTApe3JldHVybn1pZihoPT0icmVtb3ZlIil7ZS5yZW1vdmUoYi5ibG9ja2VyKTtyZXR1cm59aWYoIWIuYmxvY2tlcil7Yi5ibG9ja2VyPWUudW5pcXVlSWQoKTtnPWUuYWRkKGQuY29udGFpbmVyfHxlLmdldFJvb3QoKSwiaWZyYW1lIix7aWQ6Yi5ibG9ja2VyLHN0eWxlOiJwb3NpdGlvbjphYnNvbHV0ZTsiLGZyYW1lQm9yZGVyOjAsc3JjOidqYXZhc2NyaXB0OiIiJ30pO2Uuc2V0U3R5bGUoZywib3BhY2l0eSIsMCl9ZWxzZXtnPWUuZ2V0KGIuYmxvY2tlcil9ZS5zZXRTdHlsZXMoZyx7bGVmdDpiLmdldFN0eWxlKCJsZWZ0IiwxKSx0b3A6Yi5nZXRTdHlsZSgidG9wIiwxKSx3aWR0aDpiLmdldFN0eWxlKCJ3aWR0aCIsMSksaGVpZ2h0OmIuZ2V0U3R5bGUoImhlaWdodCIsMSksZGlzcGxheTpiLmdldFN0eWxlKCJkaXNwbGF5IiwxKSx6SW5kZXg6cGFyc2VJbnQoYi5nZXRTdHlsZSgiekluZGV4IiwxKXx8MCktMX0pfX19KX19KSh0aW55bWNlKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZShmKXtyZXR1cm4gZi5yZXBsYWNlKC9bXG5ccl0rL2csIiIpfXZhciBiPWMuaXMsYT1jLmlzSUUsZD1jLmVhY2g7Yy5jcmVhdGUoInRpbnltY2UuZG9tLlNlbGVjdGlvbiIse1NlbGVjdGlvbjpmdW5jdGlvbihpLGgsZyl7dmFyIGY9dGhpcztmLmRvbT1pO2Yud2luPWg7Zi5zZXJpYWxpemVyPWc7ZChbIm9uQmVmb3JlU2V0Q29udGVudCIsIm9uQmVmb3JlR2V0Q29udGVudCIsIm9uU2V0Q29udGVudCIsIm9uR2V0Q29udGVudCJdLGZ1bmN0aW9uKGope2Zbal09bmV3IGMudXRpbC5EaXNwYXRjaGVyKGYpfSk7aWYoIWYud2luLmdldFNlbGVjdGlvbil7Zi50cmlkZW50U2VsPW5ldyBjLmRvbS5UcmlkZW50U2VsZWN0aW9uKGYpfWlmKGMuaXNJRSYmaS5ib3hNb2RlbCl7dGhpcy5fZml4SUVTZWxlY3Rpb24oKX1jLmFkZFVubG9hZChmLmRlc3Ryb3ksZil9LGdldENvbnRlbnQ6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcyxoPWYuZ2V0Um5nKCksbD1mLmRvbS5jcmVhdGUoImJvZHkiKSxqPWYuZ2V0U2VsKCksaSxrLG07Zz1nfHx7fTtpPWs9IiI7Zy5nZXQ9dHJ1ZTtnLmZvcm1hdD1nLmZvcm1hdHx8Imh0bWwiO2Yub25CZWZvcmVHZXRDb250ZW50LmRpc3BhdGNoKGYsZyk7aWYoZy5mb3JtYXQ9PSJ0ZXh0Iil7cmV0dXJuIGYuaXNDb2xsYXBzZWQoKT8iIjooaC50ZXh0fHwoai50b1N0cmluZz9qLnRvU3RyaW5nKCk6IiIpKX1pZihoLmNsb25lQ29udGVudHMpe209aC5jbG9uZUNvbnRlbnRzKCk7aWYobSl7bC5hcHBlbmRDaGlsZChtKX19ZWxzZXtpZihiKGguaXRlbSl8fGIoaC5odG1sVGV4dCkpe2wuaW5uZXJIVE1MPWguaXRlbT9oLml0ZW0oMCkub3V0ZXJIVE1MOmguaHRtbFRleHR9ZWxzZXtsLmlubmVySFRNTD1oLnRvU3RyaW5nKCl9fWlmKC9eXHMvLnRlc3QobC5pbm5lckhUTUwpKXtpPSIgIn1pZigvXHMrJC8udGVzdChsLmlubmVySFRNTCkpe2s9IiAifWcuZ2V0SW5uZXI9dHJ1ZTtnLmNvbnRlbnQ9Zi5pc0NvbGxhcHNlZCgpPyIiOmkrZi5zZXJpYWxpemVyLnNlcmlhbGl6ZShsLGcpK2s7Zi5vbkdldENvbnRlbnQuZGlzcGF0Y2goZixnKTtyZXR1cm4gZy5jb250ZW50fSxzZXRDb250ZW50OmZ1bmN0aW9uKGosaSl7dmFyIGc9dGhpcyxrPWcuZ2V0Um5nKCksbixsPWcud2luLmRvY3VtZW50O2k9aXx8e2Zvcm1hdDoiaHRtbCJ9O2kuc2V0PXRydWU7aj1pLmNvbnRlbnQ9Zy5kb20ucHJvY2Vzc0hUTUwoaik7Zy5vbkJlZm9yZVNldENvbnRlbnQuZGlzcGF0Y2goZyxpKTtqPWkuY29udGVudDtpZihrLmluc2VydE5vZGUpe2orPSc8c3BhbiBpZD0iX19jYXJldCI+Xzwvc3Bhbj4nO2lmKGsuc3RhcnRDb250YWluZXI9PWwmJmsuZW5kQ29udGFpbmVyPT1sKXtsLmJvZHkuaW5uZXJIVE1MPWp9ZWxzZXtrLmRlbGV0ZUNvbnRlbnRzKCk7aWYobC5ib2R5LmNoaWxkTm9kZXMubGVuZ3RoPT0wKXtsLmJvZHkuaW5uZXJIVE1MPWp9ZWxzZXtpZihrLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCl7ay5pbnNlcnROb2RlKGsuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGopKX1lbHNle3ZhciBtPWwuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGY9bC5jcmVhdGVFbGVtZW50KCJkaXYiKTttLmFwcGVuZENoaWxkKGYpO2Yub3V0ZXJIVE1MPWo7ay5pbnNlcnROb2RlKG0pfX19bj1nLmRvbS5nZXQoIl9fY2FyZXQiKTtrPWwuY3JlYXRlUmFuZ2UoKTtrLnNldFN0YXJ0QmVmb3JlKG4pO2suc2V0RW5kQmVmb3JlKG4pO2cuc2V0Um5nKGspO2cuZG9tLnJlbW92ZSgiX19jYXJldCIpfWVsc2V7aWYoay5pdGVtKXtsLmV4ZWNDb21tYW5kKCJEZWxldGUiLGZhbHNlLG51bGwpO2s9Zy5nZXRSbmcoKX1rLnBhc3RlSFRNTChqKX1nLm9uU2V0Q29udGVudC5kaXNwYXRjaChnLGkpfSxnZXRTdGFydDpmdW5jdGlvbigpe3ZhciBnPXRoaXMuZ2V0Um5nKCksaCxmLGosaTtpZihnLmR1cGxpY2F0ZXx8Zy5pdGVtKXtpZihnLml0ZW0pe3JldHVybiBnLml0ZW0oMCl9aj1nLmR1cGxpY2F0ZSgpO2ouY29sbGFwc2UoMSk7aD1qLnBhcmVudEVsZW1lbnQoKTtmPWk9Zy5wYXJlbnRFbGVtZW50KCk7d2hpbGUoaT1pLnBhcmVudE5vZGUpe2lmKGk9PWgpe2g9ZjticmVha319aWYoaCYmaC5ub2RlTmFtZT09IkJPRFkiKXtyZXR1cm4gaC5maXJzdENoaWxkfHxofXJldHVybiBofWVsc2V7aD1nLnN0YXJ0Q29udGFpbmVyO2lmKGgubm9kZVR5cGU9PTEmJmguaGFzQ2hpbGROb2RlcygpKXtoPWguY2hpbGROb2Rlc1tNYXRoLm1pbihoLmNoaWxkTm9kZXMubGVuZ3RoLTEsZy5zdGFydE9mZnNldCldfWlmKGgmJmgubm9kZVR5cGU9PTMpe3JldHVybiBoLnBhcmVudE5vZGV9cmV0dXJuIGh9fSxnZXRFbmQ6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGg9Zy5nZXRSbmcoKSxpLGY7aWYoaC5kdXBsaWNhdGV8fGguaXRlbSl7aWYoaC5pdGVtKXtyZXR1cm4gaC5pdGVtKDApfWg9aC5kdXBsaWNhdGUoKTtoLmNvbGxhcHNlKDApO2k9aC5wYXJlbnRFbGVtZW50KCk7aWYoaSYmaS5ub2RlTmFtZT09IkJPRFkiKXtyZXR1cm4gaS5sYXN0Q2hpbGR8fGl9cmV0dXJuIGl9ZWxzZXtpPWguZW5kQ29udGFpbmVyO2Y9aC5lbmRPZmZzZXQ7aWYoaS5ub2RlVHlwZT09MSYmaS5oYXNDaGlsZE5vZGVzKCkpe2k9aS5jaGlsZE5vZGVzW2Y+MD9mLTE6Zl19aWYoaSYmaS5ub2RlVHlwZT09Myl7cmV0dXJuIGkucGFyZW50Tm9kZX1yZXR1cm4gaX19LGdldEJvb2ttYXJrOmZ1bmN0aW9uKHEscil7dmFyIHU9dGhpcyxtPXUuZG9tLGcsaixpLG4saCxvLHAsbD0iXHVGRUZGIixzO2Z1bmN0aW9uIGYodix4KXt2YXIgdD0wO2QobS5zZWxlY3QodiksZnVuY3Rpb24oeix5KXtpZih6PT14KXt0PXl9fSk7cmV0dXJuIHR9aWYocT09Mil7ZnVuY3Rpb24gaygpe3ZhciB2PXUuZ2V0Um5nKHRydWUpLHQ9bS5nZXRSb290KCkseD17fTtmdW5jdGlvbiB5KEIsRyl7dmFyIEE9QltHPyJzdGFydENvbnRhaW5lciI6ImVuZENvbnRhaW5lciJdLEY9QltHPyJzdGFydE9mZnNldCI6ImVuZE9mZnNldCJdLHo9W10sQyxFLEQ9MDtpZihBLm5vZGVUeXBlPT0zKXtpZihyKXtmb3IoQz1BLnByZXZpb3VzU2libGluZztDJiZDLm5vZGVUeXBlPT0zO0M9Qy5wcmV2aW91c1NpYmxpbmcpe0YrPUMubm9kZVZhbHVlLmxlbmd0aH19ei5wdXNoKEYpfWVsc2V7RT1BLmNoaWxkTm9kZXM7aWYoRj49RS5sZW5ndGgmJkUubGVuZ3RoKXtEPTE7Rj1NYXRoLm1heCgwLEUubGVuZ3RoLTEpfXoucHVzaCh1LmRvbS5ub2RlSW5kZXgoRVtGXSxyKStEKX1mb3IoO0EmJkEhPXQ7QT1BLnBhcmVudE5vZGUpe3oucHVzaCh1LmRvbS5ub2RlSW5kZXgoQSxyKSl9cmV0dXJuIHp9eC5zdGFydD15KHYsdHJ1ZSk7aWYoIXUuaXNDb2xsYXBzZWQoKSl7eC5lbmQ9eSh2KX1yZXR1cm4geH1yZXR1cm4gaygpfWlmKHEpe3JldHVybntybmc6dS5nZXRSbmcoKX19Zz11LmdldFJuZygpO2k9bS51bmlxdWVJZCgpO249dGlueU1DRS5hY3RpdmVFZGl0b3Iuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCk7cz0ib3ZlcmZsb3c6aGlkZGVuO2xpbmUtaGVpZ2h0OjBweCI7aWYoZy5kdXBsaWNhdGV8fGcuaXRlbSl7aWYoIWcuaXRlbSl7aj1nLmR1cGxpY2F0ZSgpO2cuY29sbGFwc2UoKTtnLnBhc3RlSFRNTCgnPHNwYW4gX21jZV90eXBlPSJib29rbWFyayIgaWQ9IicraSsnX3N0YXJ0IiBzdHlsZT0iJytzKyciPicrbCsiPC9zcGFuPiIpO2lmKCFuKXtqLmNvbGxhcHNlKGZhbHNlKTtqLnBhc3RlSFRNTCgnPHNwYW4gX21jZV90eXBlPSJib29rbWFyayIgaWQ9IicraSsnX2VuZCIgc3R5bGU9IicrcysnIj4nK2wrIjwvc3Bhbj4iKX19ZWxzZXtvPWcuaXRlbSgwKTtoPW8ubm9kZU5hbWU7cmV0dXJue25hbWU6aCxpbmRleDpmKGgsbyl9fX1lbHNle289dS5nZXROb2RlKCk7aD1vLm5vZGVOYW1lO2lmKGg9PSJJTUciKXtyZXR1cm57bmFtZTpoLGluZGV4OmYoaCxvKX19aj1nLmNsb25lUmFuZ2UoKTtpZighbil7ai5jb2xsYXBzZShmYWxzZSk7ai5pbnNlcnROb2RlKG0uY3JlYXRlKCJzcGFuIix7X21jZV90eXBlOiJib29rbWFyayIsaWQ6aSsiX2VuZCIsc3R5bGU6c30sbCkpfWcuY29sbGFwc2UodHJ1ZSk7Zy5pbnNlcnROb2RlKG0uY3JlYXRlKCJzcGFuIix7X21jZV90eXBlOiJib29rbWFyayIsaWQ6aSsiX3N0YXJ0IixzdHlsZTpzfSxsKSl9dS5tb3ZlVG9Cb29rbWFyayh7aWQ6aSxrZWVwOjF9KTtyZXR1cm57aWQ6aX19LG1vdmVUb0Jvb2ttYXJrOmZ1bmN0aW9uKG4pe3ZhciByPXRoaXMsbD1yLmRvbSxpLGgsZixxLGoscyxvLHA7aWYoci50cmlkZW50U2VsKXtyLnRyaWRlbnRTZWwuZGVzdHJveSgpfWlmKG4pe2lmKG4uc3RhcnQpe2Y9bC5jcmVhdGVSbmcoKTtxPWwuZ2V0Um9vdCgpO2Z1bmN0aW9uIGcoeil7dmFyIHQ9blt6PyJzdGFydCI6ImVuZCJdLHYseCx5LHU7aWYodCl7Zm9yKHg9cSx2PXQubGVuZ3RoLTE7dj49MTt2LS0pe3U9eC5jaGlsZE5vZGVzO2lmKHUubGVuZ3RoKXt4PXVbdFt2XV19fWlmKHope2Yuc2V0U3RhcnQoeCx0WzBdKX1lbHNle2Yuc2V0RW5kKHgsdFswXSl9fX1nKHRydWUpO2coKTtyLnNldFJuZyhmKX1lbHNle2lmKG4uaWQpe2Z1bmN0aW9uIGsoQSl7dmFyIHU9bC5nZXQobi5pZCsiXyIrQSkseix0LHgseSx2PW4ua2VlcDtpZih1KXt6PXUucGFyZW50Tm9kZTtpZihBPT0ic3RhcnQiKXtpZighdil7dD1sLm5vZGVJbmRleCh1KX1lbHNle3o9dS5maXJzdENoaWxkO3Q9MX1qPXM9ejtvPXA9dH1lbHNle2lmKCF2KXt0PWwubm9kZUluZGV4KHUpfWVsc2V7ej11LmZpcnN0Q2hpbGQ7dD0xfXM9ejtwPXR9aWYoIXYpe3k9dS5wcmV2aW91c1NpYmxpbmc7eD11Lm5leHRTaWJsaW5nO2QoYy5ncmVwKHUuY2hpbGROb2RlcyksZnVuY3Rpb24oQil7aWYoQi5ub2RlVHlwZT09Myl7Qi5ub2RlVmFsdWU9Qi5ub2RlVmFsdWUucmVwbGFjZSgvXHVGRUZGL2csIiIpfX0pO3doaWxlKHU9bC5nZXQobi5pZCsiXyIrQSkpe2wucmVtb3ZlKHUsMSl9aWYoeSYmeCYmeS5ub2RlVHlwZT09eC5ub2RlVHlwZSYmeS5ub2RlVHlwZT09MyYmIWMuaXNPcGVyYSl7dD15Lm5vZGVWYWx1ZS5sZW5ndGg7eS5hcHBlbmREYXRhKHgubm9kZVZhbHVlKTtsLnJlbW92ZSh4KTtpZihBPT0ic3RhcnQiKXtqPXM9eTtvPXA9dH1lbHNle3M9eTtwPXR9fX19fWZ1bmN0aW9uIG0odCl7aWYoIWEmJmwuaXNCbG9jayh0KSYmIXQuaW5uZXJIVE1MKXt0LmlubmVySFRNTD0nPGJyIF9tY2VfYm9ndXM9IjEiIC8+J31yZXR1cm4gdH1rKCJzdGFydCIpO2soImVuZCIpO2lmKGope2Y9bC5jcmVhdGVSbmcoKTtmLnNldFN0YXJ0KG0oaiksbyk7Zi5zZXRFbmQobShzKSxwKTtyLnNldFJuZyhmKX19ZWxzZXtpZihuLm5hbWUpe3Iuc2VsZWN0KGwuc2VsZWN0KG4ubmFtZSlbbi5pbmRleF0pfWVsc2V7aWYobi5ybmcpe3Iuc2V0Um5nKG4ucm5nKX19fX19fSxzZWxlY3Q6ZnVuY3Rpb24oayxqKXt2YXIgaT10aGlzLGw9aS5kb20sZz1sLmNyZWF0ZVJuZygpLGY7Zj1sLm5vZGVJbmRleChrKTtnLnNldFN0YXJ0KGsucGFyZW50Tm9kZSxmKTtnLnNldEVuZChrLnBhcmVudE5vZGUsZisxKTtpZihqKXtmdW5jdGlvbiBoKG0sbyl7dmFyIG49bmV3IGMuZG9tLlRyZWVXYWxrZXIobSxtKTtkb3tpZihtLm5vZGVUeXBlPT0zJiZjLnRyaW0obS5ub2RlVmFsdWUpLmxlbmd0aCE9MCl7aWYobyl7Zy5zZXRTdGFydChtLDApfWVsc2V7Zy5zZXRFbmQobSxtLm5vZGVWYWx1ZS5sZW5ndGgpfXJldHVybn1pZihtLm5vZGVOYW1lPT0iQlIiKXtpZihvKXtnLnNldFN0YXJ0QmVmb3JlKG0pfWVsc2V7Zy5zZXRFbmRCZWZvcmUobSl9cmV0dXJufX13aGlsZShtPShvP24ubmV4dCgpOm4ucHJldigpKSl9aChrLDEpO2goayl9aS5zZXRSbmcoZyk7cmV0dXJuIGt9LGlzQ29sbGFwc2VkOmZ1bmN0aW9uKCl7dmFyIGY9dGhpcyxoPWYuZ2V0Um5nKCksZz1mLmdldFNlbCgpO2lmKCFofHxoLml0ZW0pe3JldHVybiBmYWxzZX1pZihoLmNvbXBhcmVFbmRQb2ludHMpe3JldHVybiBoLmNvbXBhcmVFbmRQb2ludHMoIlN0YXJ0VG9FbmQiLGgpPT09MH1yZXR1cm4gIWd8fGguY29sbGFwc2VkfSxjb2xsYXBzZTpmdW5jdGlvbihmKXt2YXIgZz10aGlzLGg9Zy5nZXRSbmcoKSxpO2lmKGguaXRlbSl7aT1oLml0ZW0oMCk7aD10aGlzLndpbi5kb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO2gubW92ZVRvRWxlbWVudFRleHQoaSl9aC5jb2xsYXBzZSghIWYpO2cuc2V0Um5nKGgpfSxnZXRTZWw6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGY9dGhpcy53aW47cmV0dXJuIGYuZ2V0U2VsZWN0aW9uP2YuZ2V0U2VsZWN0aW9uKCk6Zi5kb2N1bWVudC5zZWxlY3Rpb259LGdldFJuZzpmdW5jdGlvbihsKXt2YXIgZz10aGlzLGgsaSxrLGo9Zy53aW4uZG9jdW1lbnQ7aWYobCYmZy50cmlkZW50U2VsKXtyZXR1cm4gZy50cmlkZW50U2VsLmdldFJhbmdlQXQoMCl9dHJ5e2lmKGg9Zy5nZXRTZWwoKSl7aT1oLnJhbmdlQ291bnQ+MD9oLmdldFJhbmdlQXQoMCk6KGguY3JlYXRlUmFuZ2U/aC5jcmVhdGVSYW5nZSgpOmouY3JlYXRlUmFuZ2UoKSl9fWNhdGNoKGYpe31pZihjLmlzSUUmJmkuc2V0U3RhcnQmJmouc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaXRlbSl7az1qLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLml0ZW0oMCk7aT1qLmNyZWF0ZVJhbmdlKCk7aS5zZXRTdGFydEJlZm9yZShrKTtpLnNldEVuZEFmdGVyKGspfWlmKCFpKXtpPWouY3JlYXRlUmFuZ2U/ai5jcmVhdGVSYW5nZSgpOmouYm9keS5jcmVhdGVUZXh0UmFuZ2UoKX1pZihnLnNlbGVjdGVkUmFuZ2UmJmcuZXhwbGljaXRSYW5nZSl7aWYoaS5jb21wYXJlQm91bmRhcnlQb2ludHMoaS5TVEFSVF9UT19TVEFSVCxnLnNlbGVjdGVkUmFuZ2UpPT09MCYmaS5jb21wYXJlQm91bmRhcnlQb2ludHMoaS5FTkRfVE9fRU5ELGcuc2VsZWN0ZWRSYW5nZSk9PT0wKXtpPWcuZXhwbGljaXRSYW5nZX1lbHNle2cuc2VsZWN0ZWRSYW5nZT1udWxsO2cuZXhwbGljaXRSYW5nZT1udWxsfX1yZXR1cm4gaX0sc2V0Um5nOmZ1bmN0aW9uKGkpe3ZhciBoLGc9dGhpcztpZighZy50cmlkZW50U2VsKXtoPWcuZ2V0U2VsKCk7aWYoaCl7Zy5leHBsaWNpdFJhbmdlPWk7aC5yZW1vdmVBbGxSYW5nZXMoKTtoLmFkZFJhbmdlKGkpO2cuc2VsZWN0ZWRSYW5nZT1oLmdldFJhbmdlQXQoMCl9fWVsc2V7aWYoaS5jbG9uZVJhbmdlKXtnLnRyaWRlbnRTZWwuYWRkUmFuZ2UoaSk7cmV0dXJufXRyeXtpLnNlbGVjdCgpfWNhdGNoKGYpe319fSxzZXROb2RlOmZ1bmN0aW9uKGcpe3ZhciBmPXRoaXM7Zi5zZXRDb250ZW50KGYuZG9tLmdldE91dGVySFRNTChnKSk7cmV0dXJuIGd9LGdldE5vZGU6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGY9Zy5nZXRSbmcoKSxoPWcuZ2V0U2VsKCksaTtpZihmLnNldFN0YXJ0KXtpZighZil7cmV0dXJuIGcuZG9tLmdldFJvb3QoKX1pPWYuY29tbW9uQW5jZXN0b3JDb250YWluZXI7aWYoIWYuY29sbGFwc2VkKXtpZihmLnN0YXJ0Q29udGFpbmVyPT1mLmVuZENvbnRhaW5lcil7aWYoZi5zdGFydE9mZnNldC1mLmVuZE9mZnNldDwyKXtpZihmLnN0YXJ0Q29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSl7aT1mLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbZi5zdGFydE9mZnNldF19fX1pZihjLmlzV2ViS2l0JiZoLmFuY2hvck5vZGUmJmguYW5jaG9yTm9kZS5ub2RlVHlwZT09MSl7cmV0dXJuIGguYW5jaG9yTm9kZS5jaGlsZE5vZGVzW2guYW5jaG9yT2Zmc2V0XX19aWYoaSYmaS5ub2RlVHlwZT09Myl7cmV0dXJuIGkucGFyZW50Tm9kZX1yZXR1cm4gaX1yZXR1cm4gZi5pdGVtP2YuaXRlbSgwKTpmLnBhcmVudEVsZW1lbnQoKX0sZ2V0U2VsZWN0ZWRCbG9ja3M6ZnVuY3Rpb24oZyxmKXt2YXIgaT10aGlzLGo9aS5kb20sbSxoLGwsaz1bXTttPWouZ2V0UGFyZW50KGd8fGkuZ2V0U3RhcnQoKSxqLmlzQmxvY2spO2g9ai5nZXRQYXJlbnQoZnx8aS5nZXRFbmQoKSxqLmlzQmxvY2spO2lmKG0pe2sucHVzaChtKX1pZihtJiZoJiZtIT1oKXtsPW07d2hpbGUoKGw9bC5uZXh0U2libGluZykmJmwhPWgpe2lmKGouaXNCbG9jayhsKSl7ay5wdXNoKGwpfX19aWYoaCYmbSE9aCl7ay5wdXNoKGgpfXJldHVybiBrfSxkZXN0cm95OmZ1bmN0aW9uKGcpe3ZhciBmPXRoaXM7Zi53aW49bnVsbDtpZihmLnRyaWRlbnRTZWwpe2YudHJpZGVudFNlbC5kZXN0cm95KCl9aWYoIWcpe2MucmVtb3ZlVW5sb2FkKGYuZGVzdHJveSl9fSxfZml4SUVTZWxlY3Rpb246ZnVuY3Rpb24oKXt2YXIgbT10aGlzLmRvbSxsPW0uZG9jLGc9bC5ib2R5LGksajtsLmRvY3VtZW50RWxlbWVudC51bnNlbGVjdGFibGU9dHJ1ZTtmdW5jdGlvbiBrKG4scSl7dmFyIG89Zy5jcmVhdGVUZXh0UmFuZ2UoKTt0cnl7by5tb3ZlVG9Qb2ludChuLHEpfWNhdGNoKHApe289bnVsbH1yZXR1cm4gb31mdW5jdGlvbiBoKG8pe3ZhciBuO2lmKG8uYnV0dG9uKXtuPWsoby54LG8ueSk7aWYobil7aWYobi5jb21wYXJlRW5kUG9pbnRzKCJTdGFydFRvU3RhcnQiLGopPjApe24uc2V0RW5kUG9pbnQoIlN0YXJ0VG9TdGFydCIsail9ZWxzZXtuLnNldEVuZFBvaW50KCJFbmRUb0VuZCIsail9bi5zZWxlY3QoKX19ZWxzZXtmKCl9fWZ1bmN0aW9uIGYoKXttLnVuYmluZChsLCJtb3VzZXVwIixmKTttLnVuYmluZChsLCJtb3VzZW1vdmUiLGgpO2k9MH1tLmJpbmQobCwibW91c2Vkb3duIixmdW5jdGlvbihuKXtpZihuLnRhcmdldC5ub2RlTmFtZT09PSJIVE1MIil7aWYoaSl7ZigpfWk9MTtqPWsobi54LG4ueSk7aWYoail7bS5iaW5kKGwsIm1vdXNldXAiLGYpO20uYmluZChsLCJtb3VzZW1vdmUiLGgpO20ud2luLmZvY3VzKCk7ai5zZWxlY3QoKX19fSl9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYSl7YS5jcmVhdGUoInRpbnltY2UuZG9tLlhNTFdyaXRlciIse25vZGU6bnVsbCxYTUxXcml0ZXI6ZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3ZhciBlPWRvY3VtZW50LmltcGxlbWVudGF0aW9uO2lmKCFlfHwhZS5jcmVhdGVEb2N1bWVudCl7dHJ5e3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTVNYTUwyLkRPTURvY3VtZW50Iil9Y2F0Y2goZCl7fXRyeXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YbWxEb20iKX1jYXRjaChkKXt9fWVsc2V7cmV0dXJuIGUuY3JlYXRlRG9jdW1lbnQoIiIsIiIsbnVsbCl9fXRoaXMuZG9jPWIoKTt0aGlzLnZhbGlkPWEuaXNPcGVyYXx8YS5pc1dlYktpdDt0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWIuZG9jO2lmKGMuZmlyc3RDaGlsZCl7Yy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpfWIubm9kZT1jLmFwcGVuZENoaWxkKGMuY3JlYXRlRWxlbWVudCgiaHRtbCIpKX0sd3JpdGVTdGFydEVsZW1lbnQ6ZnVuY3Rpb24oYyl7dmFyIGI9dGhpcztiLm5vZGU9Yi5ub2RlLmFwcGVuZENoaWxkKGIuZG9jLmNyZWF0ZUVsZW1lbnQoYykpfSx3cml0ZUF0dHJpYnV0ZTpmdW5jdGlvbihjLGIpe2lmKHRoaXMudmFsaWQpe2I9Yi5yZXBsYWNlKC8+L2csIiVNQ0dUJSIpfXRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoYyxiKX0sd3JpdGVFbmRFbGVtZW50OmZ1bmN0aW9uKCl7dGhpcy5ub2RlPXRoaXMubm9kZS5wYXJlbnROb2RlfSx3cml0ZUZ1bGxFbmRFbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWIubm9kZTtjLmFwcGVuZENoaWxkKGIuZG9jLmNyZWF0ZVRleHROb2RlKCIiKSk7Yi5ub2RlPWMucGFyZW50Tm9kZX0sd3JpdGVUZXh0OmZ1bmN0aW9uKGIpe2lmKHRoaXMudmFsaWQpe2I9Yi5yZXBsYWNlKC8+L2csIiVNQ0dUJSIpfXRoaXMubm9kZS5hcHBlbmRDaGlsZCh0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZShiKSl9LHdyaXRlQ0RBVEE6ZnVuY3Rpb24oYil7dGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihiKSl9LHdyaXRlQ29tbWVudDpmdW5jdGlvbihiKXtpZihhLmlzSUUpe2I9Yi5yZXBsYWNlKC9eXC18XC0kL2csIiAiKX10aGlzLm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kb2MuY3JlYXRlQ29tbWVudChiLnJlcGxhY2UoL1wtXC0vZywiICIpKSl9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXt2YXIgYjtiPXRoaXMuZG9jLnhtbHx8bmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh0aGlzLmRvYyk7Yj1iLnJlcGxhY2UoLzxcP1teP10rXD8+fDxodG1sW14+XSo+fDxcL2h0bWw+fDxodG1sXC8+fDwhRE9DVFlQRVtePl0rPi9nLCIiKTtiPWIucmVwbGFjZSgvID9cLz4vZywiIC8+Iik7aWYodGhpcy52YWxpZCl7Yj1iLnJlcGxhY2UoL1wlTUNHVCUvZywiJmd0OyIpfXJldHVybiBifX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGMpe3ZhciBkPS9bJlwiPD5dL2csYj0vWzw+Jl0vZyxhPXsiJiI6IiZhbXA7IiwnIic6IiZxdW90OyIsIjwiOiImbHQ7IiwiPiI6IiZndDsifTtjLmNyZWF0ZSgidGlueW1jZS5kb20uU3RyaW5nV3JpdGVyIix7c3RyOm51bGwsdGFnczpudWxsLGNvdW50OjAsc2V0dGluZ3M6bnVsbCxpbmRlbnQ6bnVsbCxTdHJpbmdXcml0ZXI6ZnVuY3Rpb24oZSl7dGhpcy5zZXR0aW5ncz1jLmV4dGVuZCh7aW5kZW50X2NoYXI6IiAiLGluZGVudGF0aW9uOjB9LGUpO3RoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLmluZGVudD0iIjt0aGlzLnN0cj0iIjt0aGlzLnRhZ3M9W107dGhpcy5jb3VudD0wfSx3cml0ZVN0YXJ0RWxlbWVudDpmdW5jdGlvbihlKXt0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTt0aGlzLndyaXRlUmF3KCI8IitlKTt0aGlzLnRhZ3MucHVzaChlKTt0aGlzLmluQXR0cj10cnVlO3RoaXMuY291bnQrKzt0aGlzLmVsZW1lbnRDb3VudD10aGlzLmNvdW50O3RoaXMuYXR0cnM9e319LHdyaXRlQXR0cmlidXRlOmZ1bmN0aW9uKGcsZSl7dmFyIGY9dGhpcztpZighZi5hdHRyc1tnXSl7Zi53cml0ZVJhdygiICIrZi5lbmNvZGUoZyx0cnVlKSsnPSInK2YuZW5jb2RlKGUsdHJ1ZSkrJyInKTtmLmF0dHJzW2ddPWV9fSx3cml0ZUVuZEVsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgZTtpZih0aGlzLnRhZ3MubGVuZ3RoPjApe2U9dGhpcy50YWdzLnBvcCgpO2lmKHRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgxKSl7dGhpcy53cml0ZVJhdygiPC8iK2UrIj4iKX1pZih0aGlzLnNldHRpbmdzLmluZGVudGF0aW9uPjApe3RoaXMud3JpdGVSYXcoIlxuIil9fX0sd3JpdGVGdWxsRW5kRWxlbWVudDpmdW5jdGlvbigpe2lmKHRoaXMudGFncy5sZW5ndGg+MCl7dGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7dGhpcy53cml0ZVJhdygiPC8iK3RoaXMudGFncy5wb3AoKSsiPiIpO2lmKHRoaXMuc2V0dGluZ3MuaW5kZW50YXRpb24+MCl7dGhpcy53cml0ZVJhdygiXG4iKX19fSx3cml0ZVRleHQ6ZnVuY3Rpb24oZSl7dGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7dGhpcy53cml0ZVJhdyh0aGlzLmVuY29kZShlKSk7dGhpcy5jb3VudCsrfSx3cml0ZUNEQVRBOmZ1bmN0aW9uKGUpe3RoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgpO3RoaXMud3JpdGVSYXcoIjwhW0NEQVRBWyIrZSsiXV0+Iik7dGhpcy5jb3VudCsrfSx3cml0ZUNvbW1lbnQ6ZnVuY3Rpb24oZSl7dGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7dGhpcy53cml0ZVJhdygiPCEtLSIrZSsiLS0+Iik7dGhpcy5jb3VudCsrfSx3cml0ZVJhdzpmdW5jdGlvbihlKXt0aGlzLnN0cis9ZX0sZW5jb2RlOmZ1bmN0aW9uKGYsZSl7cmV0dXJuIGYucmVwbGFjZShlP2Q6YixmdW5jdGlvbihnKXtyZXR1cm4gYVtnXX0pfSxnZXRDb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyfSxfd3JpdGVBdHRyaWJ1dGVzRW5kOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmluQXR0cil7cmV0dXJufXRoaXMuaW5BdHRyPWZhbHNlO2lmKGUmJnRoaXMuZWxlbWVudENvdW50PT10aGlzLmNvdW50KXt0aGlzLndyaXRlUmF3KCIgLz4iKTtyZXR1cm4gZmFsc2V9dGhpcy53cml0ZVJhdygiPiIpO3JldHVybiB0cnVlfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGUpe3ZhciBnPWUuZXh0ZW5kLGY9ZS5lYWNoLGI9ZS51dGlsLkRpc3BhdGNoZXIsZD1lLmlzSUUsYT1lLmlzR2Vja287ZnVuY3Rpb24gYyhoKXtyZXR1cm4gaC5yZXBsYWNlKC8oWz8rKl0pL2csIi4kMSIpfWUuY3JlYXRlKCJ0aW55bWNlLmRvbS5TZXJpYWxpemVyIix7U2VyaWFsaXplcjpmdW5jdGlvbihqKXt2YXIgaT10aGlzO2kua2V5PTA7aS5vblByZVByb2Nlc3M9bmV3IGIoaSk7aS5vblBvc3RQcm9jZXNzPW5ldyBiKGkpO3RyeXtpLndyaXRlcj1uZXcgZS5kb20uWE1MV3JpdGVyKCl9Y2F0Y2goaCl7aS53cml0ZXI9bmV3IGUuZG9tLlN0cmluZ1dyaXRlcigpfWlmKGUuaXNJRSYmZG9jdW1lbnQuZG9jdW1lbnRNb2RlPjgpe2kud3JpdGVyPW5ldyBlLmRvbS5TdHJpbmdXcml0ZXIoKX1pLnNldHRpbmdzPWo9Zyh7ZG9tOmUuRE9NLHZhbGlkX25vZGVzOjAsbm9kZV9maWx0ZXI6MCxhdHRyX2ZpbHRlcjowLGludmFsaWRfYXR0cnM6L14oX21jZV98X21vel98c2l6c2V0fHNpemNhY2hlKS8sY2xvc2VkOi9eKGJyfGhyfGlucHV0fG1ldGF8aW1nfGxpbmt8cGFyYW18YXJlYSkkLyxlbnRpdHlfZW5jb2Rpbmc6Im5hbWVkIixlbnRpdGllczoiMTYwLG5ic3AsMTYxLGlleGNsLDE2MixjZW50LDE2Myxwb3VuZCwxNjQsY3VycmVuLDE2NSx5ZW4sMTY2LGJydmJhciwxNjcsc2VjdCwxNjgsdW1sLDE2OSxjb3B5LDE3MCxvcmRmLDE3MSxsYXF1bywxNzIsbm90LDE3MyxzaHksMTc0LHJlZywxNzUsbWFjciwxNzYsZGVnLDE3NyxwbHVzbW4sMTc4LHN1cDIsMTc5LHN1cDMsMTgwLGFjdXRlLDE4MSxtaWNybywxODIscGFyYSwxODMsbWlkZG90LDE4NCxjZWRpbCwxODUsc3VwMSwxODYsb3JkbSwxODcscmFxdW8sMTg4LGZyYWMxNCwxODksZnJhYzEyLDE5MCxmcmFjMzQsMTkxLGlxdWVzdCwxOTIsQWdyYXZlLDE5MyxBYWN1dGUsMTk0LEFjaXJjLDE5NSxBdGlsZGUsMTk2LEF1bWwsMTk3LEFyaW5nLDE5OCxBRWxpZywxOTksQ2NlZGlsLDIwMCxFZ3JhdmUsMjAxLEVhY3V0ZSwyMDIsRWNpcmMsMjAzLEV1bWwsMjA0LElncmF2ZSwyMDUsSWFjdXRlLDIwNixJY2lyYywyMDcsSXVtbCwyMDgsRVRILDIwOSxOdGlsZGUsMjEwLE9ncmF2ZSwyMTEsT2FjdXRlLDIxMixPY2lyYywyMTMsT3RpbGRlLDIxNCxPdW1sLDIxNSx0aW1lcywyMTYsT3NsYXNoLDIxNyxVZ3JhdmUsMjE4LFVhY3V0ZSwyMTksVWNpcmMsMjIwLFV1bWwsMjIxLFlhY3V0ZSwyMjIsVEhPUk4sMjIzLHN6bGlnLDIyNCxhZ3JhdmUsMjI1LGFhY3V0ZSwyMjYsYWNpcmMsMjI3LGF0aWxkZSwyMjgsYXVtbCwyMjksYXJpbmcsMjMwLGFlbGlnLDIzMSxjY2VkaWwsMjMyLGVncmF2ZSwyMzMsZWFjdXRlLDIzNCxlY2lyYywyMzUsZXVtbCwyMzYsaWdyYXZlLDIzNyxpYWN1dGUsMjM4LGljaXJjLDIzOSxpdW1sLDI0MCxldGgsMjQxLG50aWxkZSwyNDIsb2dyYXZlLDI0MyxvYWN1dGUsMjQ0LG9jaXJjLDI0NSxvdGlsZGUsMjQ2LG91bWwsMjQ3LGRpdmlkZSwyNDgsb3NsYXNoLDI0OSx1Z3JhdmUsMjUwLHVhY3V0ZSwyNTEsdWNpcmMsMjUyLHV1bWwsMjUzLHlhY3V0ZSwyNTQsdGhvcm4sMjU1LHl1bWwsNDAyLGZub2YsOTEzLEFscGhhLDkxNCxCZXRhLDkxNSxHYW1tYSw5MTYsRGVsdGEsOTE3LEVwc2lsb24sOTE4LFpldGEsOTE5LEV0YSw5MjAsVGhldGEsOTIxLElvdGEsOTIyLEthcHBhLDkyMyxMYW1iZGEsOTI0LE11LDkyNSxOdSw5MjYsWGksOTI3LE9taWNyb24sOTI4LFBpLDkyOSxSaG8sOTMxLFNpZ21hLDkzMixUYXUsOTMzLFVwc2lsb24sOTM0LFBoaSw5MzUsQ2hpLDkzNixQc2ksOTM3LE9tZWdhLDk0NSxhbHBoYSw5NDYsYmV0YSw5NDcsZ2FtbWEsOTQ4LGRlbHRhLDk0OSxlcHNpbG9uLDk1MCx6ZXRhLDk1MSxldGEsOTUyLHRoZXRhLDk1Myxpb3RhLDk1NCxrYXBwYSw5NTUsbGFtYmRhLDk1NixtdSw5NTcsbnUsOTU4LHhpLDk1OSxvbWljcm9uLDk2MCxwaSw5NjEscmhvLDk2MixzaWdtYWYsOTYzLHNpZ21hLDk2NCx0YXUsOTY1LHVwc2lsb24sOTY2LHBoaSw5NjcsY2hpLDk2OCxwc2ksOTY5LG9tZWdhLDk3Nyx0aGV0YXN5bSw5NzgsdXBzaWgsOTgyLHBpdiw4MjI2LGJ1bGwsODIzMCxoZWxsaXAsODI0MixwcmltZSw4MjQzLFByaW1lLDgyNTQsb2xpbmUsODI2MCxmcmFzbCw4NDcyLHdlaWVycCw4NDY1LGltYWdlLDg0NzYscmVhbCw4NDgyLHRyYWRlLDg1MDEsYWxlZnN5bSw4NTkyLGxhcnIsODU5Myx1YXJyLDg1OTQscmFyciw4NTk1LGRhcnIsODU5NixoYXJyLDg2MjksY3JhcnIsODY1NixsQXJyLDg2NTcsdUFyciw4NjU4LHJBcnIsODY1OSxkQXJyLDg2NjAsaEFyciw4NzA0LGZvcmFsbCw4NzA2LHBhcnQsODcwNyxleGlzdCw4NzA5LGVtcHR5LDg3MTEsbmFibGEsODcxMixpc2luLDg3MTMsbm90aW4sODcxNSxuaSw4NzE5LHByb2QsODcyMSxzdW0sODcyMixtaW51cyw4NzI3LGxvd2FzdCw4NzMwLHJhZGljLDg3MzMscHJvcCw4NzM0LGluZmluLDg3MzYsYW5nLDg3NDMsYW5kLDg3NDQsb3IsODc0NSxjYXAsODc0NixjdXAsODc0NyxpbnQsODc1Nix0aGVyZTQsODc2NCxzaW0sODc3Myxjb25nLDg3NzYsYXN5bXAsODgwMCxuZSw4ODAxLGVxdWl2LDg4MDQsbGUsODgwNSxnZSw4ODM0LHN1Yiw4ODM1LHN1cCw4ODM2LG5zdWIsODgzOCxzdWJlLDg4Mzksc3VwZSw4ODUzLG9wbHVzLDg4NTUsb3RpbWVzLDg4NjkscGVycCw4OTAxLHNkb3QsODk2OCxsY2VpbCw4OTY5LHJjZWlsLDg5NzAsbGZsb29yLDg5NzEscmZsb29yLDkwMDEsbGFuZyw5MDAyLHJhbmcsOTY3NCxsb3osOTgyNCxzcGFkZXMsOTgyNyxjbHVicyw5ODI5LGhlYXJ0cyw5ODMwLGRpYW1zLDMzOCxPRWxpZywzMzksb2VsaWcsMzUyLFNjYXJvbiwzNTMsc2Nhcm9uLDM3NixZdW1sLDcxMCxjaXJjLDczMix0aWxkZSw4MTk0LGVuc3AsODE5NSxlbXNwLDgyMDEsdGhpbnNwLDgyMDQsenduaiw4MjA1LHp3aiw4MjA2LGxybSw4MjA3LHJsbSw4MjExLG5kYXNoLDgyMTIsbWRhc2gsODIxNixsc3F1byw4MjE3LHJzcXVvLDgyMTgsc2JxdW8sODIyMCxsZHF1byw4MjIxLHJkcXVvLDgyMjIsYmRxdW8sODIyNCxkYWdnZXIsODIyNSxEYWdnZXIsODI0MCxwZXJtaWwsODI0OSxsc2FxdW8sODI1MCxyc2FxdW8sODM2NCxldXJvIix2YWxpZF9lbGVtZW50czoiKlsqXSIsZXh0ZW5kZWRfdmFsaWRfZWxlbWVudHM6MCxpbnZhbGlkX2VsZW1lbnRzOjAsZml4X3RhYmxlX2VsZW1lbnRzOjEsZml4X2xpc3RfZWxlbWVudHM6dHJ1ZSxmaXhfY29udGVudF9kdXBsaWNhdGlvbjp0cnVlLGNvbnZlcnRfZm9udHNfdG9fc3BhbnM6ZmFsc2UsZm9udF9zaXplX2NsYXNzZXM6MCxhcHBseV9zb3VyY2VfZm9ybWF0dGluZzowLGluZGVudF9tb2RlOiJzaW1wbGUiLGluZGVudF9jaGFyOiJcdCIsaW5kZW50X2xldmVsczoxLHJlbW92ZV9saW5lYnJlYWtzOjEscmVtb3ZlX3JlZHVuZGFudF9icnM6MSxlbGVtZW50X2Zvcm1hdDoieGh0bWwifSxqKTtpLmRvbT1qLmRvbTtpLnNjaGVtYT1qLnNjaGVtYTtpZihqLmVudGl0eV9lbmNvZGluZz09Im5hbWVkIiYmIWouZW50aXRpZXMpe2ouZW50aXR5X2VuY29kaW5nPSJyYXcifWlmKGoucmVtb3ZlX3JlZHVuZGFudF9icnMpe2kub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24oayxsKXtsLmNvbnRlbnQ9bC5jb250ZW50LnJlcGxhY2UoLyg8YnIgXC8+XHMqKSs8XC8ocHxoWzEtNl18ZGl2fGxpKT4vZ2ksZnVuY3Rpb24obixtLG8pe2lmKC9ePGJyIFwvPlxzKjxcLy8udGVzdChuKSl7cmV0dXJuIjwvIitvKyI+In1yZXR1cm4gbn0pfSl9aWYoai5lbGVtZW50X2Zvcm1hdD09Imh0bWwiKXtpLm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKGssbCl7bC5jb250ZW50PWwuY29udGVudC5yZXBsYWNlKC88KFtePl0rKSBcLz4vZywiPCQxPiIpfSl9aWYoai5maXhfbGlzdF9lbGVtZW50cyl7aS5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHYscyl7dmFyIGwseix5PVsib2wiLCJ1bCJdLHUsdCxxLGs9L14oT0x8VUwpJC8sQTtmdW5jdGlvbiBtKHIseCl7dmFyIG89eC5zcGxpdCgiLCIpLHA7d2hpbGUoKHI9ci5wcmV2aW91c1NpYmxpbmcpIT1udWxsKXtmb3IocD0wO3A8by5sZW5ndGg7cCsrKXtpZihyLm5vZGVOYW1lPT1vW3BdKXtyZXR1cm4gcn19fXJldHVybiBudWxsfWZvcih6PTA7ejx5Lmxlbmd0aDt6Kyspe2w9aS5kb20uc2VsZWN0KHlbel0scy5ub2RlKTtmb3IodT0wO3U8bC5sZW5ndGg7dSsrKXt0PWxbdV07cT10LnBhcmVudE5vZGU7aWYoay50ZXN0KHEubm9kZU5hbWUpKXtBPW0odCwiTEkiKTtpZighQSl7QT1pLmRvbS5jcmVhdGUoImxpIik7QS5pbm5lckhUTUw9IiZuYnNwOyI7QS5hcHBlbmRDaGlsZCh0KTtxLmluc2VydEJlZm9yZShBLHEuZmlyc3RDaGlsZCl9ZWxzZXtBLmFwcGVuZENoaWxkKHQpfX19fX0pfWlmKGouZml4X3RhYmxlX2VsZW1lbnRzKXtpLm9uUHJlUHJvY2Vzcy5hZGQoZnVuY3Rpb24oayxsKXtmKGkuZG9tLnNlbGVjdCgicCB0YWJsZSIsbC5ub2RlKS5yZXZlcnNlKCksZnVuY3Rpb24ocCl7dmFyIG89aS5kb20uZ2V0UGFyZW50KHAucGFyZW50Tm9kZSwidGFibGUscCIpO2lmKG8ubm9kZU5hbWUhPSJUQUJMRSIpe3RyeXtpLmRvbS5zcGxpdChvLHApfWNhdGNoKG0pe319fSl9KX19LHNldEVudGl0aWVzOmZ1bmN0aW9uKG8pe3ZhciBuPXRoaXMsaixtLGg9e30saztpZihuLmVudGl0eUxvb2t1cCl7cmV0dXJufWo9by5zcGxpdCgiLCIpO2ZvcihtPTA7bTxqLmxlbmd0aDttKz0yKXtrPWpbbV07aWYoaz09MzR8fGs9PTM4fHxrPT02MHx8az09NjIpe2NvbnRpbnVlfWhbU3RyaW5nLmZyb21DaGFyQ29kZShqW21dKV09alttKzFdO2s9cGFyc2VJbnQoalttXSkudG9TdHJpbmcoMTYpfW4uZW50aXR5TG9va3VwPWh9LHNldFJ1bGVzOmZ1bmN0aW9uKGkpe3ZhciBoPXRoaXM7aC5fc2V0dXAoKTtoLnJ1bGVzPXt9O2gud2lsZFJ1bGVzPVtdO2gudmFsaWRFbGVtZW50cz17fTtyZXR1cm4gaC5hZGRSdWxlcyhpKX0sYWRkUnVsZXM6ZnVuY3Rpb24oaSl7dmFyIGg9dGhpcyxqO2lmKCFpKXtyZXR1cm59aC5fc2V0dXAoKTtmKGkuc3BsaXQoIiwiKSxmdW5jdGlvbihtKXt2YXIgcT1tLnNwbGl0KC9cW3xcXS8pLGw9cVswXS5zcGxpdCgiLyIpLHIsayxvLG49W107aWYoail7az1lLmV4dGVuZChbXSxqLmF0dHJpYnMpfWlmKHEubGVuZ3RoPjEpe2YocVsxXS5zcGxpdCgifCIpLGZ1bmN0aW9uKHUpe3ZhciBwPXt9LHQ7az1rfHxbXTt1PXUucmVwbGFjZSgvOjovZywifiIpO3U9L14oWyFcLV0pPyhbXHcqLj9+X1wtXSt8KShbPTo8XSk/KC4rKT8kLy5leGVjKHUpO3VbMl09dVsyXS5yZXBsYWNlKC9+L2csIjoiKTtpZih1WzFdPT0iISIpe3I9cnx8W107ci5wdXNoKHVbMl0pfWlmKHVbMV09PSItIil7Zm9yKHQ9MDt0PGsubGVuZ3RoO3QrKyl7aWYoa1t0XS5uYW1lPT11WzJdKXtrLnNwbGljZSh0LDEpO3JldHVybn19fXN3aXRjaCh1WzNdKXtjYXNlIj0iOnAuZGVmYXVsdFZhbD11WzRdfHwiIjticmVhaztjYXNlIjoiOnAuZm9yY2VkVmFsPXVbNF07YnJlYWs7Y2FzZSI8IjpwLnZhbGlkVmFscz11WzRdLnNwbGl0KCI/Iik7YnJlYWt9aWYoL1sqLj9dLy50ZXN0KHVbMl0pKXtvPW98fFtdO3AubmFtZVJFPW5ldyBSZWdFeHAoIl4iK2ModVsyXSkrIiQiKTtvLnB1c2gocCl9ZWxzZXtwLm5hbWU9dVsyXTtrLnB1c2gocCl9bi5wdXNoKHVbMl0pfSl9ZihsLGZ1bmN0aW9uKHYsdSl7dmFyIHk9di5jaGFyQXQoMCksdD0xLHA9e307aWYoail7aWYoai5ub0VtcHR5KXtwLm5vRW1wdHk9ai5ub0VtcHR5fWlmKGouZnVsbEVuZCl7cC5mdWxsRW5kPWouZnVsbEVuZH1pZihqLnBhZGQpe3AucGFkZD1qLnBhZGR9fXN3aXRjaCh5KXtjYXNlIi0iOnAubm9FbXB0eT10cnVlO2JyZWFrO2Nhc2UiKyI6cC5mdWxsRW5kPXRydWU7YnJlYWs7Y2FzZSIjIjpwLnBhZGQ9dHJ1ZTticmVhaztkZWZhdWx0OnQ9MH1sW3VdPXY9di5zdWJzdHJpbmcodCk7aC52YWxpZEVsZW1lbnRzW3ZdPTE7aWYoL1sqLj9dLy50ZXN0KGxbMF0pKXtwLm5hbWVSRT1uZXcgUmVnRXhwKCJeIitjKGxbMF0pKyIkIik7aC53aWxkUnVsZXM9aC53aWxkUnVsZXN8fHt9O2gud2lsZFJ1bGVzLnB1c2gocCl9ZWxzZXtwLm5hbWU9bFswXTtpZihsWzBdPT0iQCIpe2o9cH1oLnJ1bGVzW3ZdPXB9cC5hdHRyaWJzPWs7aWYocil7cC5yZXF1aXJlZEF0dHJpYnM9cn1pZihvKXt2PSIiO2YobixmdW5jdGlvbihzKXtpZih2KXt2Kz0ifCJ9dis9IigiK2MocykrIikifSk7cC52YWxpZEF0dHJpYnNSRT1uZXcgUmVnRXhwKCJeIit2LnRvTG93ZXJDYXNlKCkrIiQiKTtwLndpbGRBdHRyaWJzPW99fSl9KTtpPSIiO2YoaC52YWxpZEVsZW1lbnRzLGZ1bmN0aW9uKG0sbCl7aWYoaSl7aSs9InwifWlmKGwhPSJAIil7aSs9bH19KTtoLnZhbGlkRWxlbWVudHNSRT1uZXcgUmVnRXhwKCJeKCIrYyhpLnRvTG93ZXJDYXNlKCkpKyIpJCIpfSxmaW5kUnVsZTpmdW5jdGlvbihtKXt2YXIgaj10aGlzLGw9ai5ydWxlcyxoLGs7ai5fc2V0dXAoKTtrPWxbbV07aWYoayl7cmV0dXJuIGt9bD1qLndpbGRSdWxlcztmb3IoaD0wO2g8bC5sZW5ndGg7aCsrKXtpZihsW2hdLm5hbWVSRS50ZXN0KG0pKXtyZXR1cm4gbFtoXX19cmV0dXJuIG51bGx9LGZpbmRBdHRyaWJSdWxlOmZ1bmN0aW9uKGgsbCl7dmFyIGosaz1oLndpbGRBdHRyaWJzO2ZvcihqPTA7ajxrLmxlbmd0aDtqKyspe2lmKGtbal0ubmFtZVJFLnRlc3QobCkpe3JldHVybiBrW2pdfX1yZXR1cm4gbnVsbH0sc2VyaWFsaXplOmZ1bmN0aW9uKHIscSl7dmFyIG0saz10aGlzLHAsaSxqLGw7ay5fc2V0dXAoKTtxPXF8fHt9O3EuZm9ybWF0PXEuZm9ybWF0fHwiaHRtbCI7ay5wcm9jZXNzT2JqPXE7aWYoZCl7bD1bXTtmKHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9wdGlvbiIpLGZ1bmN0aW9uKG8pe3ZhciBoPWsuZG9tLmdldEF0dHJpYihvLCJzZWxlY3RlZCIpO2wucHVzaChoP2g6bnVsbCl9KX1yPXIuY2xvbmVOb2RlKHRydWUpO2lmKGQpe2Yoci5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3B0aW9uIiksZnVuY3Rpb24obyxoKXtrLmRvbS5zZXRBdHRyaWIobywic2VsZWN0ZWQiLGxbaF0pfSl9aj1yLm93bmVyRG9jdW1lbnQuaW1wbGVtZW50YXRpb247aWYoai5jcmVhdGVIVE1MRG9jdW1lbnQpe3A9ai5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpO2Yoci5ub2RlTmFtZT09IkJPRFkiP3IuY2hpbGROb2Rlczpbcl0sZnVuY3Rpb24oaCl7cC5ib2R5LmFwcGVuZENoaWxkKHAuaW1wb3J0Tm9kZShoLHRydWUpKX0pO2lmKHIubm9kZU5hbWUhPSJCT0RZIil7cj1wLmJvZHkuZmlyc3RDaGlsZH1lbHNle3I9cC5ib2R5fWk9ay5kb20uZG9jO2suZG9tLmRvYz1wfWsua2V5PSIiKyhwYXJzZUludChrLmtleSkrMSk7aWYoIXEubm9fZXZlbnRzKXtxLm5vZGU9cjtrLm9uUHJlUHJvY2Vzcy5kaXNwYXRjaChrLHEpfWsud3JpdGVyLnJlc2V0KCk7ay5faW5mbz1xO2suX3NlcmlhbGl6ZU5vZGUocixxLmdldElubmVyKTtxLmNvbnRlbnQ9ay53cml0ZXIuZ2V0Q29udGVudCgpO2lmKGkpe2suZG9tLmRvYz1pfWlmKCFxLm5vX2V2ZW50cyl7ay5vblBvc3RQcm9jZXNzLmRpc3BhdGNoKGsscSl9ay5fcG9zdFByb2Nlc3MocSk7cS5ub2RlPW51bGw7cmV0dXJuIGUudHJpbShxLmNvbnRlbnQpfSxfcG9zdFByb2Nlc3M6ZnVuY3Rpb24obil7dmFyIGk9dGhpcyxrPWkuc2V0dGluZ3Msaj1uLmNvbnRlbnQsbT1bXSxsO2lmKG4uZm9ybWF0PT0iaHRtbCIpe2w9aS5fcHJvdGVjdCh7Y29udGVudDpqLHBhdHRlcm5zOlt7cGF0dGVybjovKDxzY3JpcHRbXj5dKj4pKC4qPykoPFwvc2NyaXB0PikvZ30se3BhdHRlcm46Lyg8bm9zY3JpcHRbXj5dKj4pKC4qPykoPFwvbm9zY3JpcHQ+KS9nfSx7cGF0dGVybjovKDxzdHlsZVtePl0qPikoLio/KSg8XC9zdHlsZT4pL2d9LHtwYXR0ZXJuOi8oPHByZVtePl0qPikoLio/KSg8XC9wcmU+KS9nLGVuY29kZToxfSx7cGF0dGVybjovKDwhLS1cW0NEQVRBXFspKC4qPykoXF1cXS0tPikvZ31dfSk7aj1sLmNvbnRlbnQ7aWYoay5lbnRpdHlfZW5jb2RpbmchPT0icmF3Iil7aj1pLl9lbmNvZGUoail9aWYoIW4uc2V0KXtqPWUuX3JlcGxhY2UoLzxwPlxzKzxcL3A+fDxwKFtePl0rKT5ccys8XC9wPi9nLGsuZW50aXR5X2VuY29kaW5nPT0ibnVtZXJpYyI/IjxwJDE+JiMxNjA7PC9wPiI6IjxwJDE+Jm5ic3A7PC9wPiIsaik7aWYoay5yZW1vdmVfbGluZWJyZWFrcyl7aj1qLnJlcGxhY2UoL1xyP1xufFxyL2csIiAiKTtqPWUuX3JlcGxhY2UoLyg8W14+XSs+KVxzKy9nLCIkMSAiLGopO2o9ZS5fcmVwbGFjZSgvXHMrKDxcL1tePl0rPikvZywiICQxIixqKTtqPWUuX3JlcGxhY2UoLzwocHxoWzEtNl18YmxvY2txdW90ZXxocnxkaXZ8dGFibGV8dGJvZHl8dHJ8dGR8Ym9keXxoZWFkfGh0bWx8dGl0bGV8bWV0YXxzdHlsZXxwcmV8c2NyaXB0fGxpbmt8b2JqZWN0KSAoW14+XSspPlxzKy9nLCI8JDEgJDI+IixqKTtqPWUuX3JlcGxhY2UoLzwocHxoWzEtNl18YmxvY2txdW90ZXxocnxkaXZ8dGFibGV8dGJvZHl8dHJ8dGR8Ym9keXxoZWFkfGh0bWx8dGl0bGV8bWV0YXxzdHlsZXxwcmV8c2NyaXB0fGxpbmt8b2JqZWN0KT5ccysvZywiPCQxPiIsaik7aj1lLl9yZXBsYWNlKC9ccys8XC8ocHxoWzEtNl18YmxvY2txdW90ZXxocnxkaXZ8dGFibGV8dGJvZHl8dHJ8dGR8Ym9keXxoZWFkfGh0bWx8dGl0bGV8bWV0YXxzdHlsZXxwcmV8c2NyaXB0fGxpbmt8b2JqZWN0KT4vZywiPC8kMT4iLGopfWlmKGsuYXBwbHlfc291cmNlX2Zvcm1hdHRpbmcmJmsuaW5kZW50X21vZGU9PSJzaW1wbGUiKXtqPWUuX3JlcGxhY2UoLzwoXC8/KSh1bHxocnx0YWJsZXxtZXRhfGxpbmt8dGJvZHl8dHJ8b2JqZWN0fGJvZHl8aGVhZHxodG1sfG1hcCkofFtePl0rKT5ccyovZywiXG48JDEkMiQzPlxuIixqKTtqPWUuX3JlcGxhY2UoL1xzKjwocHxoWzEtNl18YmxvY2txdW90ZXxkaXZ8dGl0bGV8c3R5bGV8cHJlfHNjcmlwdHx0ZHxsaXxhcmVhKSh8W14+XSspPi9nLCJcbjwkMSQyPiIsaik7aj1lLl9yZXBsYWNlKC88XC8ocHxoWzEtNl18YmxvY2txdW90ZXxkaXZ8dGl0bGV8c3R5bGV8cHJlfHNjcmlwdHx0ZHxsaSk+XHMqL2csIjwvJDE+XG4iLGopO2o9ai5yZXBsYWNlKC9cblxuL2csIlxuIil9fWo9aS5fdW5wcm90ZWN0KGosbCk7aj1lLl9yZXBsYWNlKC88IS0tXFtDREFUQVxbKFtcc1xTXSspXF1cXS0tPi9nLCI8IVtDREFUQVskMV1dPiIsaik7aWYoay5lbnRpdHlfZW5jb2Rpbmc9PSJyYXciKXtqPWUuX3JlcGxhY2UoLzxwPiZuYnNwOzxcL3A+fDxwKFtePl0rKT4mbmJzcDs8XC9wPi9nLCI8cCQxPlx1MDBhMDwvcD4iLGopfWo9ai5yZXBsYWNlKC88bm9zY3JpcHQoW14+XSt8KT4oW1xzXFNdKj8pPFwvbm9zY3JpcHQ+L2csZnVuY3Rpb24oaCxwLG8pe3JldHVybiI8bm9zY3JpcHQiK3ArIj4iK2kuZG9tLmRlY29kZShvLnJlcGxhY2UoLzwhLS18LS0+L2csIiIpKSsiPC9ub3NjcmlwdD4ifSl9bi5jb250ZW50PWp9LF9zZXJpYWxpemVOb2RlOmZ1bmN0aW9uKEUsSil7dmFyIEE9dGhpcyxCPUEuc2V0dGluZ3MseT1BLndyaXRlcixxLGosdSxHLEYsSSxDLGgseixrLHIsRCxwLG0sSCxvLHg7aWYoIUIubm9kZV9maWx0ZXJ8fEIubm9kZV9maWx0ZXIoRSkpe3N3aXRjaChFLm5vZGVUeXBlKXtjYXNlIDE6aWYoRS5oYXNBdHRyaWJ1dGU/RS5oYXNBdHRyaWJ1dGUoIl9tY2VfYm9ndXMiKTpFLmdldEF0dHJpYnV0ZSgiX21jZV9ib2d1cyIpKXtyZXR1cm59cD1IPWZhbHNlO3E9RS5oYXNDaGlsZE5vZGVzKCk7az1FLmdldEF0dHJpYnV0ZSgiX21jZV9uYW1lIil8fEUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtvPUUuZ2V0QXR0cmlidXRlKCJfbWNlX3R5cGUiKTtpZihvKXtpZighQS5faW5mby5jbGVhbnVwKXtwPXRydWU7cmV0dXJufWVsc2V7SD0xfX1pZihkKXt4PUUuc2NvcGVOYW1lO2lmKHgmJnghPT0iSFRNTCImJnghPT0iaHRtbCIpe2s9eCsiOiIra319aWYoay5pbmRleE9mKCJtY2U6Iik9PT0wKXtrPWsuc3Vic3RyaW5nKDQpfWlmKCFIKXtpZighQS52YWxpZEVsZW1lbnRzUkV8fCFBLnZhbGlkRWxlbWVudHNSRS50ZXN0KGspfHwoQS5pbnZhbGlkRWxlbWVudHNSRSYmQS5pbnZhbGlkRWxlbWVudHNSRS50ZXN0KGspKXx8Sil7cD10cnVlO2JyZWFrfX1pZihkKXtpZihCLmZpeF9jb250ZW50X2R1cGxpY2F0aW9uKXtpZihFLl9tY2Vfc2VyaWFsaXplZD09QS5rZXkpe3JldHVybn1FLl9tY2Vfc2VyaWFsaXplZD1BLmtleX1pZihrLmNoYXJBdCgwKT09Ii8iKXtrPWsuc3Vic3RyaW5nKDEpfX1lbHNle2lmKGEpe2lmKEUubm9kZU5hbWU9PT0iQlIiJiZFLmdldEF0dHJpYnV0ZSgidHlwZSIpPT0iX21veiIpe3JldHVybn19fWlmKEIudmFsaWRhdGVfY2hpbGRyZW4pe2lmKEEuZWxlbWVudE5hbWUmJiFBLnNjaGVtYS5pc1ZhbGlkKEEuZWxlbWVudE5hbWUsaykpe3A9dHJ1ZTticmVha31BLmVsZW1lbnROYW1lPWt9cj1BLmZpbmRSdWxlKGspO2lmKCFyKXtwPXRydWU7YnJlYWt9az1yLm5hbWV8fGs7bT1CLmNsb3NlZC50ZXN0KGspO2lmKCghcSYmci5ub0VtcHR5KXx8KGQmJiFrKSl7cD10cnVlO2JyZWFrfWlmKHIucmVxdWlyZWRBdHRyaWJzKXtJPXIucmVxdWlyZWRBdHRyaWJzO2ZvcihHPUkubGVuZ3RoLTE7Rz49MDtHLS0pe2lmKHRoaXMuZG9tLmdldEF0dHJpYihFLElbR10pIT09IiIpe2JyZWFrfX1pZihHPT0tMSl7cD10cnVlO2JyZWFrfX15LndyaXRlU3RhcnRFbGVtZW50KGspO2lmKHIuYXR0cmlicyl7Zm9yKEc9MCxDPXIuYXR0cmlicyxGPUMubGVuZ3RoO0c8RjtHKyspe0k9Q1tHXTt6PUEuX2dldEF0dHJpYihFLEkpO2lmKHohPT1udWxsKXt5LndyaXRlQXR0cmlidXRlKEkubmFtZSx6KX19fWlmKHIudmFsaWRBdHRyaWJzUkUpe0M9QS5kb20uZ2V0QXR0cmlicyhFKTtmb3IoRz1DLmxlbmd0aC0xO0c+LTE7Ry0tKXtoPUNbR107aWYoaC5zcGVjaWZpZWQpe0k9aC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKEIuaW52YWxpZF9hdHRycy50ZXN0KEkpfHwhci52YWxpZEF0dHJpYnNSRS50ZXN0KEkpKXtjb250aW51ZX1EPUEuZmluZEF0dHJpYlJ1bGUocixJKTt6PUEuX2dldEF0dHJpYihFLEQsSSk7aWYoeiE9PW51bGwpe3kud3JpdGVBdHRyaWJ1dGUoSSx6KX19fX1pZihvJiZIKXt5LndyaXRlQXR0cmlidXRlKCJfbWNlX3R5cGUiLG8pfWlmKGs9PT0ic2NyaXB0IiYmZS50cmltKEUuaW5uZXJIVE1MKSl7eS53cml0ZVRleHQoIi8vICIpO3kud3JpdGVDREFUQShFLmlubmVySFRNTC5yZXBsYWNlKC88IS0tfC0tPnw8XFtDREFUQVxbfFxdXF0+L2csIiIpKTtxPWZhbHNlO2JyZWFrfWlmKHIucGFkZCl7aWYocSYmKHU9RS5maXJzdENoaWxkKSYmdS5ub2RlVHlwZT09PTEmJkUuY2hpbGROb2Rlcy5sZW5ndGg9PT0xKXtpZih1Lmhhc0F0dHJpYnV0ZT91Lmhhc0F0dHJpYnV0ZSgiX21jZV9ib2d1cyIpOnUuZ2V0QXR0cmlidXRlKCJfbWNlX2JvZ3VzIikpe3kud3JpdGVUZXh0KCJcdTAwYTAiKX19ZWxzZXtpZighcSl7eS53cml0ZVRleHQoIlx1MDBhMCIpfX19YnJlYWs7Y2FzZSAzOmlmKEIudmFsaWRhdGVfY2hpbGRyZW4mJkEuZWxlbWVudE5hbWUmJiFBLnNjaGVtYS5pc1ZhbGlkKEEuZWxlbWVudE5hbWUsIiN0ZXh0Iikpe3JldHVybn1yZXR1cm4geS53cml0ZVRleHQoRS5ub2RlVmFsdWUpO2Nhc2UgNDpyZXR1cm4geS53cml0ZUNEQVRBKEUubm9kZVZhbHVlKTtjYXNlIDg6cmV0dXJuIHkud3JpdGVDb21tZW50KEUubm9kZVZhbHVlKX19ZWxzZXtpZihFLm5vZGVUeXBlPT0xKXtxPUUuaGFzQ2hpbGROb2RlcygpfX1pZihxJiYhbSl7dT1FLmZpcnN0Q2hpbGQ7d2hpbGUodSl7QS5fc2VyaWFsaXplTm9kZSh1KTtBLmVsZW1lbnROYW1lPWs7dT11Lm5leHRTaWJsaW5nfX1pZighcCl7aWYoIW0pe3kud3JpdGVGdWxsRW5kRWxlbWVudCgpfWVsc2V7eS53cml0ZUVuZEVsZW1lbnQoKX19fSxfcHJvdGVjdDpmdW5jdGlvbihqKXt2YXIgaT10aGlzO2ouaXRlbXM9ai5pdGVtc3x8W107ZnVuY3Rpb24gaChsKXtyZXR1cm4gbC5yZXBsYWNlKC9bXHJcblxcXS9nLGZ1bmN0aW9uKG0pe2lmKG09PT0iXG4iKXtyZXR1cm4iXFxuIn1lbHNle2lmKG09PT0iXFwiKXtyZXR1cm4iXFxcXCJ9fXJldHVybiJcXHIifSl9ZnVuY3Rpb24gayhsKXtyZXR1cm4gbC5yZXBsYWNlKC9cXFtcXHJuXS9nLGZ1bmN0aW9uKG0pe2lmKG09PT0iXFxuIil7cmV0dXJuIlxuIn1lbHNle2lmKG09PT0iXFxcXCIpe3JldHVybiJcXCJ9fXJldHVybiJcciJ9KX1mKGoucGF0dGVybnMsZnVuY3Rpb24obCl7ai5jb250ZW50PWsoaChqLmNvbnRlbnQpLnJlcGxhY2UobC5wYXR0ZXJuLGZ1bmN0aW9uKG4sbyxtLHApe209ayhtKTtpZihsLmVuY29kZSl7bT1pLl9lbmNvZGUobSl9ai5pdGVtcy5wdXNoKG0pO3JldHVybiBvKyI8IS0tbWNlOiIrKGouaXRlbXMubGVuZ3RoLTEpKyItLT4iK3B9KSl9KTtyZXR1cm4gan0sX3VucHJvdGVjdDpmdW5jdGlvbihpLGope2k9aS5yZXBsYWNlKC9cPCEtLW1jZTooWzAtOV0rKS0tXD4vZyxmdW5jdGlvbihrLGgpe3JldHVybiBqLml0ZW1zW3BhcnNlSW50KGgpXX0pO2ouaXRlbXM9W107cmV0dXJuIGl9LF9lbmNvZGU6ZnVuY3Rpb24obSl7dmFyIGo9dGhpcyxrPWouc2V0dGluZ3MsaTtpZihrLmVudGl0eV9lbmNvZGluZyE9PSJyYXciKXtpZihrLmVudGl0eV9lbmNvZGluZy5pbmRleE9mKCJuYW1lZCIpIT0tMSl7ai5zZXRFbnRpdGllcyhrLmVudGl0aWVzKTtpPWouZW50aXR5TG9va3VwO209bS5yZXBsYWNlKC9bXHUwMDdFLVx1RkZGRl0vZyxmdW5jdGlvbihoKXt2YXIgbDtpZihsPWlbaF0pe2g9IiYiK2wrIjsifXJldHVybiBofSl9aWYoay5lbnRpdHlfZW5jb2RpbmcuaW5kZXhPZigibnVtZXJpYyIpIT0tMSl7bT1tLnJlcGxhY2UoL1tcdTAwN0UtXHVGRkZGXS9nLGZ1bmN0aW9uKGgpe3JldHVybiImIyIraC5jaGFyQ29kZUF0KDApKyI7In0pfX1yZXR1cm4gbX0sX3NldHVwOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcyxpPXRoaXMuc2V0dGluZ3M7aWYoaC5kb25lKXtyZXR1cm59aC5kb25lPTE7aC5zZXRSdWxlcyhpLnZhbGlkX2VsZW1lbnRzKTtoLmFkZFJ1bGVzKGkuZXh0ZW5kZWRfdmFsaWRfZWxlbWVudHMpO2lmKGkuaW52YWxpZF9lbGVtZW50cyl7aC5pbnZhbGlkRWxlbWVudHNSRT1uZXcgUmVnRXhwKCJeKCIrYyhpLmludmFsaWRfZWxlbWVudHMucmVwbGFjZSgvLC9nLCJ8IikudG9Mb3dlckNhc2UoKSkrIikkIil9aWYoaS5hdHRyaWJfdmFsdWVfZmlsdGVyKXtoLmF0dHJpYlZhbHVlRmlsdGVyPWkuYXR0cmliVmFsdWVGaWx0ZXJ9fSxfZ2V0QXR0cmliOmZ1bmN0aW9uKG0saixoKXt2YXIgbCxrO2g9aHx8ai5uYW1lO2lmKGouZm9yY2VkVmFsJiYoaz1qLmZvcmNlZFZhbCkpe2lmKGs9PT0ieyR1aWR9Iil7cmV0dXJuIHRoaXMuZG9tLnVuaXF1ZUlkKCl9cmV0dXJuIGt9az10aGlzLmRvbS5nZXRBdHRyaWIobSxoKTtzd2l0Y2goaCl7Y2FzZSJyb3dzcGFuIjpjYXNlImNvbHNwYW4iOmlmKGs9PSIxIil7az0iIn1icmVha31pZih0aGlzLmF0dHJpYlZhbHVlRmlsdGVyKXtrPXRoaXMuYXR0cmliVmFsdWVGaWx0ZXIoaCxrLG0pfWlmKGoudmFsaWRWYWxzKXtmb3IobD1qLnZhbGlkVmFscy5sZW5ndGgtMTtsPj0wO2wtLSl7aWYoaz09ai52YWxpZFZhbHNbbF0pe2JyZWFrfX1pZihsPT0tMSl7cmV0dXJuIG51bGx9fWlmKGs9PT0iIiYmdHlwZW9mKGouZGVmYXVsdFZhbCkhPSJ1bmRlZmluZWQiKXtrPWouZGVmYXVsdFZhbDtpZihrPT09InskdWlkfSIpe3JldHVybiB0aGlzLmRvbS51bmlxdWVJZCgpfXJldHVybiBrfWVsc2V7aWYoaD09ImNsYXNzIiYmdGhpcy5wcm9jZXNzT2JqLmdldCl7az1rLnJlcGxhY2UoL1xzP21jZUl0ZW1cdytccz8vZywiIil9fWlmKGs9PT0iIil7cmV0dXJuIG51bGx9cmV0dXJuIGt9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYSl7YS5kb20uU2NyaXB0TG9hZGVyPWZ1bmN0aW9uKGgpe3ZhciBjPTAsaz0xLGk9MixsPXt9LGo9W10sZj17fSxkPVtdLGc9MCxlO2Z1bmN0aW9uIGIobSx1KXt2YXIgdj10aGlzLHE9YS5ET00scyxvLHIsbjtmdW5jdGlvbiBwKCl7cS5yZW1vdmUobik7aWYocyl7cy5vbnJlYWR5c3RhdGVjaGFuZ2U9cy5vbmxvYWQ9cz1udWxsfXUoKX1uPXEudW5pcXVlSWQoKTtpZihhLmlzSUU2KXtvPW5ldyBhLnV0aWwuVVJJKG0pO3I9bG9jYXRpb247aWYoby5ob3N0PT1yLmhvc3RuYW1lJiZvLnBvcnQ9PXIucG9ydCYmKG8ucHJvdG9jb2wrIjoiKT09ci5wcm90b2NvbCl7YS51dGlsLlhIUi5zZW5kKHt1cmw6YS5fYWRkVmVyKG8uZ2V0VVJJKCkpLHN1Y2Nlc3M6ZnVuY3Rpb24oeCl7dmFyIHQ9cS5jcmVhdGUoInNjcmlwdCIse3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KTt0LnRleHQ9eDtkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHQpO3EucmVtb3ZlKHQpO3AoKX19KTtyZXR1cm59fXM9cS5jcmVhdGUoInNjcmlwdCIse2lkOm4sdHlwZToidGV4dC9qYXZhc2NyaXB0IixzcmM6YS5fYWRkVmVyKG0pfSk7aWYoIWEuaXNJRSl7cy5vbmxvYWQ9cH1zLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciB0PXMucmVhZHlTdGF0ZTtpZih0PT0iY29tcGxldGUifHx0PT0ibG9hZGVkIil7cCgpfX07KGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKHMpfXRoaXMuaXNEb25lPWZ1bmN0aW9uKG0pe3JldHVybiBsW21dPT1pfTt0aGlzLm1hcmtEb25lPWZ1bmN0aW9uKG0pe2xbbV09aX07dGhpcy5hZGQ9dGhpcy5sb2FkPWZ1bmN0aW9uKG0scSxuKXt2YXIgbyxwPWxbbV07aWYocD09ZSl7ai5wdXNoKG0pO2xbbV09Y31pZihxKXtpZighZlttXSl7ZlttXT1bXX1mW21dLnB1c2goe2Z1bmM6cSxzY29wZTpufHx0aGlzfSl9fTt0aGlzLmxvYWRRdWV1ZT1mdW5jdGlvbihuLG0pe3RoaXMubG9hZFNjcmlwdHMoaixuLG0pfTt0aGlzLmxvYWRTY3JpcHRzPWZ1bmN0aW9uKG0scSxwKXt2YXIgbztmdW5jdGlvbiBuKHIpe2EuZWFjaChmW3JdLGZ1bmN0aW9uKHMpe3MuZnVuYy5jYWxsKHMuc2NvcGUpfSk7ZltyXT1lfWQucHVzaCh7ZnVuYzpxLHNjb3BlOnB8fHRoaXN9KTtvPWZ1bmN0aW9uKCl7dmFyIHI9YS5ncmVwKG0pO20ubGVuZ3RoPTA7YS5lYWNoKHIsZnVuY3Rpb24ocyl7aWYobFtzXT09aSl7bihzKTtyZXR1cm59aWYobFtzXSE9ayl7bFtzXT1rO2crKztiKHMsZnVuY3Rpb24oKXtsW3NdPWk7Zy0tO24ocyk7bygpfSl9fSk7aWYoIWcpe2EuZWFjaChkLGZ1bmN0aW9uKHMpe3MuZnVuYy5jYWxsKHMuc2NvcGUpfSk7ZC5sZW5ndGg9MH19O28oKX19O2EuU2NyaXB0TG9hZGVyPW5ldyBhLmRvbS5TY3JpcHRMb2FkZXIoKX0pKHRpbnltY2UpO3RpbnltY2UuZG9tLlRyZWVXYWxrZXI9ZnVuY3Rpb24oYSxjKXt2YXIgYj1hO2Z1bmN0aW9uIGQoaSxmLGUsail7dmFyIGgsZztpZihpKXtpZighaiYmaVtmXSl7cmV0dXJuIGlbZl19aWYoaSE9Yyl7aD1pW2VdO2lmKGgpe3JldHVybiBofWZvcihnPWkucGFyZW50Tm9kZTtnJiZnIT1jO2c9Zy5wYXJlbnROb2RlKXtoPWdbZV07aWYoaCl7cmV0dXJuIGh9fX19fXRoaXMuY3VycmVudD1mdW5jdGlvbigpe3JldHVybiBifTt0aGlzLm5leHQ9ZnVuY3Rpb24oZSl7cmV0dXJuKGI9ZChiLCJmaXJzdENoaWxkIiwibmV4dFNpYmxpbmciLGUpKX07dGhpcy5wcmV2PWZ1bmN0aW9uKGUpe3JldHVybihiPWQoYiwibGFzdENoaWxkIiwibGFzdFNpYmxpbmciLGUpKX19OyhmdW5jdGlvbigpe3ZhciBhPXt9O2Z1bmN0aW9uIGIoZixlKXt2YXIgZDtmdW5jdGlvbiBjKGcpe3JldHVybiBnLnJlcGxhY2UoL1tBLVpdKy9nLGZ1bmN0aW9uKGgpe3JldHVybiBjKGZbaF0pfSl9Zm9yKGQgaW4gZil7aWYoZi5oYXNPd25Qcm9wZXJ0eShkKSl7ZltkXT1jKGZbZF0pfX1jKGUpLnJlcGxhY2UoLyMvZywiI3RleHQiKS5yZXBsYWNlKC8oXHcrKVxbKFteXF1dKylcXS9nLGZ1bmN0aW9uKGwsZyxqKXt2YXIgaCxrPXt9O2o9ai5zcGxpdCgvXHwvKTtmb3IoaD1qLmxlbmd0aC0xO2g+PTA7aC0tKXtrW2pbaF1dPTF9YVtnXT1rfSl9Yih7WjoiI3xIfEt8TnxPfFAiLFk6IiN8WHxmb3JtfFJ8USIsWDoicHxUfGRpdnxVfFd8aXNpbmRleHxmaWVsZHNldHx0YWJsZSIsVzoicHJlfGhyfGJsb2NrcXVvdGV8YWRkcmVzc3xjZW50ZXJ8bm9mcmFtZXMiLFU6InVsfG9sfGRsfG1lbnV8ZGlyIixaQzoiI3xwfFl8ZGl2fFV8V3x0YWJsZXxicnxzcGFufGJkb3xvYmplY3R8YXBwbGV0fGltZ3xtYXB8S3xOfFEiLFQ6ImgxfGgyfGgzfGg0fGg1fGg2IixaQjoiI3xYfFN8USIsUzoiUnxQIixaQToiI3xhfEd8SnxNfE98UCIsUjoiI3xhfEh8S3xOfE8iLFE6Im5vc2NyaXB0fFAiLFA6Imluc3xkZWx8c2NyaXB0IixPOiJpbnB1dHxzZWxlY3R8dGV4dGFyZWF8bGFiZWx8YnV0dG9uIixOOiJNfEwiLE06ImVtfHN0cm9uZ3xkZm58Y29kZXxxfHNhbXB8a2JkfHZhcnxjaXRlfGFiYnJ8YWNyb255bSIsTDoic3VifHN1cCIsSzoiSnxJIixKOiJ0dHxpfGJ8dXxzfHN0cmlrZSIsSToiYmlnfHNtYWxsfGZvbnR8YmFzZWZvbnQiLEg6Ikd8RiIsRzoiYnJ8c3BhbnxiZG8iLEY6Im9iamVjdHxhcHBsZXR8aW1nfG1hcHxpZnJhbWUifSwic2NyaXB0W11zdHlsZVtdb2JqZWN0WyN8cGFyYW18WHxmb3JtfGF8SHxLfE58T3xRXXBhcmFtW11wW1NdYVtaXWJyW11zcGFuW1NdYmRvW1NdYXBwbGV0WyN8cGFyYW18WHxmb3JtfGF8SHxLfE58T3xRXWgxW1NdaW1nW11tYXBbWHxmb3JtfFF8YXJlYV1oMltTXWlmcmFtZVsjfFh8Zm9ybXxhfEh8S3xOfE98UV1oM1tTXXR0W1NdaVtTXWJbU111W1Ndc1tTXXN0cmlrZVtTXWJpZ1tTXXNtYWxsW1NdZm9udFtTXWJhc2Vmb250W11lbVtTXXN0cm9uZ1tTXWRmbltTXWNvZGVbU11xW1Ndc2FtcFtTXWtiZFtTXXZhcltTXWNpdGVbU11hYmJyW1NdYWNyb255bVtTXXN1YltTXXN1cFtTXWlucHV0W11zZWxlY3Rbb3B0Z3JvdXB8b3B0aW9uXW9wdGdyb3VwW29wdGlvbl1vcHRpb25bXXRleHRhcmVhW11sYWJlbFtTXWJ1dHRvblsjfHB8VHxkaXZ8VXxXfHRhYmxlfEd8b2JqZWN0fGFwcGxldHxpbWd8bWFwfEt8TnxRXWg0W1NdaW5zWyN8WHxmb3JtfGF8SHxLfE58T3xRXWg1W1NdZGVsWyN8WHxmb3JtfGF8SHxLfE58T3xRXWg2W1NdZGl2WyN8WHxmb3JtfGF8SHxLfE58T3xRXXVsW2xpXWxpWyN8WHxmb3JtfGF8SHxLfE58T3xRXW9sW2xpXWRsW2R0fGRkXWR0W1NdZGRbI3xYfGZvcm18YXxIfEt8TnxPfFFdbWVudVtsaV1kaXJbbGldcHJlW1pBXWhyW11ibG9ja3F1b3RlWyN8WHxmb3JtfGF8SHxLfE58T3xRXWFkZHJlc3NbU3xwXWNlbnRlclsjfFh8Zm9ybXxhfEh8S3xOfE98UV1ub2ZyYW1lc1sjfFh8Zm9ybXxhfEh8S3xOfE98UV1pc2luZGV4W11maWVsZHNldFsjfGxlZ2VuZHxYfGZvcm18YXxIfEt8TnxPfFFdbGVnZW5kW1NddGFibGVbY2FwdGlvbnxjb2x8Y29sZ3JvdXB8dGhlYWR8dGZvb3R8dGJvZHl8dHJdY2FwdGlvbltTXWNvbFtdY29sZ3JvdXBbY29sXXRoZWFkW3RyXXRyW3RofHRkXXRoWyN8WHxmb3JtfGF8SHxLfE58T3xRXWZvcm1bI3xYfGF8SHxLfE58T3xRXW5vc2NyaXB0WyN8WHxmb3JtfGF8SHxLfE58T3xRXXRkWyN8WHxmb3JtfGF8SHxLfE58T3xRXXRmb290W3RyXXRib2R5W3RyXWFyZWFbXWJhc2VbXWJvZHlbI3xYfGZvcm18YXxIfEt8TnxPfFFdIik7dGlueW1jZS5kb20uU2NoZW1hPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcyxkPWE7Yy5pc1ZhbGlkPWZ1bmN0aW9uKGYsZSl7dmFyIGc9ZFtmXTtyZXR1cm4gISEoZyYmKCFlfHxnW2VdKSl9fX0pKCk7KGZ1bmN0aW9uKGEpe2EuZG9tLlJhbmdlVXRpbHM9ZnVuY3Rpb24oYyl7dmFyIGI9Ilx1RkVGRiI7dGhpcy53YWxrPWZ1bmN0aW9uKGQscil7dmFyIGg9ZC5zdGFydENvbnRhaW5lcixrPWQuc3RhcnRPZmZzZXQscz1kLmVuZENvbnRhaW5lcixsPWQuZW5kT2Zmc2V0LGksZixuLGcscSxwLGU7ZT1jLnNlbGVjdCgidGQubWNlU2VsZWN0ZWQsdGgubWNlU2VsZWN0ZWQiKTtpZihlLmxlbmd0aD4wKXthLmVhY2goZSxmdW5jdGlvbih0KXtyKFt0XSl9KTtyZXR1cm59ZnVuY3Rpb24gbyh2LHUsdCl7dmFyIHg9W107Zm9yKDt2JiZ2IT10O3Y9dlt1XSl7eC5wdXNoKHYpfXJldHVybiB4fWZ1bmN0aW9uIG0odSx0KXtkb3tpZih1LnBhcmVudE5vZGU9PXQpe3JldHVybiB1fXU9dS5wYXJlbnROb2RlfXdoaWxlKHUpfWZ1bmN0aW9uIGoodix1LHgpe3ZhciB0PXg/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIjtmb3IoZz12LHE9Zy5wYXJlbnROb2RlO2cmJmchPXU7Zz1xKXtxPWcucGFyZW50Tm9kZTtwPW8oZz09dj9nOmdbdF0sdCk7aWYocC5sZW5ndGgpe2lmKCF4KXtwLnJldmVyc2UoKX1yKHApfX19aWYoaC5ub2RlVHlwZT09MSYmaC5oYXNDaGlsZE5vZGVzKCkpe2g9aC5jaGlsZE5vZGVzW2tdfWlmKHMubm9kZVR5cGU9PTEmJnMuaGFzQ2hpbGROb2RlcygpKXtzPXMuY2hpbGROb2Rlc1tNYXRoLm1pbihrPT1sP2w6bC0xLHMuY2hpbGROb2Rlcy5sZW5ndGgtMSldfWk9Yy5maW5kQ29tbW9uQW5jZXN0b3IoaCxzKTtpZihoPT1zKXtyZXR1cm4gcihbaF0pfWZvcihnPWg7ZztnPWcucGFyZW50Tm9kZSl7aWYoZz09cyl7cmV0dXJuIGooaCxpLHRydWUpfWlmKGc9PWkpe2JyZWFrfX1mb3IoZz1zO2c7Zz1nLnBhcmVudE5vZGUpe2lmKGc9PWgpe3JldHVybiBqKHMsaSl9aWYoZz09aSl7YnJlYWt9fWY9bShoLGkpfHxoO249bShzLGkpfHxzO2ooaCxmLHRydWUpO3A9byhmPT1oP2Y6Zi5uZXh0U2libGluZywibmV4dFNpYmxpbmciLG49PXM/bi5uZXh0U2libGluZzpuKTtpZihwLmxlbmd0aCl7cihwKX1qKHMsbil9fTthLmRvbS5SYW5nZVV0aWxzLmNvbXBhcmVSYW5nZXM9ZnVuY3Rpb24oYyxiKXtpZihjJiZiKXtpZihjLml0ZW18fGMuZHVwbGljYXRlKXtpZihjLml0ZW0mJmIuaXRlbSYmYy5pdGVtKDApPT09Yi5pdGVtKDApKXtyZXR1cm4gdHJ1ZX1pZihjLmlzRXF1YWwmJmIuaXNFcXVhbCYmYi5pc0VxdWFsKGMpKXtyZXR1cm4gdHJ1ZX19ZWxzZXtyZXR1cm4gYy5zdGFydENvbnRhaW5lcj09Yi5zdGFydENvbnRhaW5lciYmYy5zdGFydE9mZnNldD09Yi5zdGFydE9mZnNldH19cmV0dXJuIGZhbHNlfX0pKHRpbnltY2UpOyhmdW5jdGlvbihjKXt2YXIgYj1jLkRPTSxhPWMuaXM7Yy5jcmVhdGUoInRpbnltY2UudWkuQ29udHJvbCIse0NvbnRyb2w6ZnVuY3Rpb24oZSxkKXt0aGlzLmlkPWU7dGhpcy5zZXR0aW5ncz1kPWR8fHt9O3RoaXMucmVuZGVyZWQ9ZmFsc2U7dGhpcy5vblJlbmRlcj1uZXcgYy51dGlsLkRpc3BhdGNoZXIodGhpcyk7dGhpcy5jbGFzc1ByZWZpeD0iIjt0aGlzLnNjb3BlPWQuc2NvcGV8fHRoaXM7dGhpcy5kaXNhYmxlZD0wO3RoaXMuYWN0aXZlPTB9LHNldERpc2FibGVkOmZ1bmN0aW9uKGQpe3ZhciBmO2lmKGQhPXRoaXMuZGlzYWJsZWQpe2Y9Yi5nZXQodGhpcy5pZCk7aWYoZiYmdGhpcy5zZXR0aW5ncy51bmF2YWlsYWJsZV9wcmVmaXgpe2lmKGQpe3RoaXMucHJldlRpdGxlPWYudGl0bGU7Zi50aXRsZT10aGlzLnNldHRpbmdzLnVuYXZhaWxhYmxlX3ByZWZpeCsiOiAiK2YudGl0bGV9ZWxzZXtmLnRpdGxlPXRoaXMucHJldlRpdGxlfX10aGlzLnNldFN0YXRlKCJEaXNhYmxlZCIsZCk7dGhpcy5zZXRTdGF0ZSgiRW5hYmxlZCIsIWQpO3RoaXMuZGlzYWJsZWQ9ZH19LGlzRGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNhYmxlZH0sc2V0QWN0aXZlOmZ1bmN0aW9uKGQpe2lmKGQhPXRoaXMuYWN0aXZlKXt0aGlzLnNldFN0YXRlKCJBY3RpdmUiLGQpO3RoaXMuYWN0aXZlPWR9fSxpc0FjdGl2ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZX0sc2V0U3RhdGU6ZnVuY3Rpb24oZixkKXt2YXIgZT1iLmdldCh0aGlzLmlkKTtmPXRoaXMuY2xhc3NQcmVmaXgrZjtpZihkKXtiLmFkZENsYXNzKGUsZil9ZWxzZXtiLnJlbW92ZUNsYXNzKGUsZil9fSxpc1JlbmRlcmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZWR9LHJlbmRlckhUTUw6ZnVuY3Rpb24oKXt9LHJlbmRlclRvOmZ1bmN0aW9uKGQpe2Iuc2V0SFRNTChkLHRoaXMucmVuZGVySFRNTCgpKX0scG9zdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsZDtpZihhKGUuZGlzYWJsZWQpKXtkPWUuZGlzYWJsZWQ7ZS5kaXNhYmxlZD0tMTtlLnNldERpc2FibGVkKGQpfWlmKGEoZS5hY3RpdmUpKXtkPWUuYWN0aXZlO2UuYWN0aXZlPS0xO2Uuc2V0QWN0aXZlKGQpfX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmUodGhpcy5pZCk7dGhpcy5kZXN0cm95KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtjLmRvbS5FdmVudC5jbGVhcih0aGlzLmlkKX19KX0pKHRpbnltY2UpO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnVpLkNvbnRhaW5lcjp0aW55bWNlLnVpLkNvbnRyb2wiLHtDb250YWluZXI6ZnVuY3Rpb24oYixhKXt0aGlzLnBhcmVudChiLGEpO3RoaXMuY29udHJvbHM9W107dGhpcy5sb29rdXA9e319LGFkZDpmdW5jdGlvbihhKXt0aGlzLmxvb2t1cFthLmlkXT1hO3RoaXMuY29udHJvbHMucHVzaChhKTtyZXR1cm4gYX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvb2t1cFthXX19KTt0aW55bWNlLmNyZWF0ZSgidGlueW1jZS51aS5TZXBhcmF0b3I6dGlueW1jZS51aS5Db250cm9sIix7U2VwYXJhdG9yOmZ1bmN0aW9uKGIsYSl7dGhpcy5wYXJlbnQoYixhKTt0aGlzLmNsYXNzUHJlZml4PSJtY2VTZXBhcmF0b3IifSxyZW5kZXJIVE1MOmZ1bmN0aW9uKCl7cmV0dXJuIHRpbnltY2UuRE9NLmNyZWF0ZUhUTUwoInNwYW4iLHsiY2xhc3MiOnRoaXMuY2xhc3NQcmVmaXh9KX19KTsoZnVuY3Rpb24oZCl7dmFyIGM9ZC5pcyxiPWQuRE9NLGU9ZC5lYWNoLGE9ZC53YWxrO2QuY3JlYXRlKCJ0aW55bWNlLnVpLk1lbnVJdGVtOnRpbnltY2UudWkuQ29udHJvbCIse01lbnVJdGVtOmZ1bmN0aW9uKGcsZil7dGhpcy5wYXJlbnQoZyxmKTt0aGlzLmNsYXNzUHJlZml4PSJtY2VNZW51SXRlbSJ9LHNldFNlbGVjdGVkOmZ1bmN0aW9uKGYpe3RoaXMuc2V0U3RhdGUoIlNlbGVjdGVkIixmKTt0aGlzLnNlbGVjdGVkPWZ9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3RlZH0scG9zdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBmPXRoaXM7Zi5wYXJlbnQoKTtpZihjKGYuc2VsZWN0ZWQpKXtmLnNldFNlbGVjdGVkKGYuc2VsZWN0ZWQpfX19KX0pKHRpbnltY2UpOyhmdW5jdGlvbihkKXt2YXIgYz1kLmlzLGI9ZC5ET00sZT1kLmVhY2gsYT1kLndhbGs7ZC5jcmVhdGUoInRpbnltY2UudWkuTWVudTp0aW55bWNlLnVpLk1lbnVJdGVtIix7TWVudTpmdW5jdGlvbihoLGcpe3ZhciBmPXRoaXM7Zi5wYXJlbnQoaCxnKTtmLml0ZW1zPXt9O2YuY29sbGFwc2VkPWZhbHNlO2YubWVudUNvdW50PTA7Zi5vbkFkZEl0ZW09bmV3IGQudXRpbC5EaXNwYXRjaGVyKHRoaXMpfSxleHBhbmQ6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcztpZihnKXthKGYsZnVuY3Rpb24oaCl7aWYoaC5leHBhbmQpe2guZXhwYW5kKCl9fSwiaXRlbXMiLGYpfWYuY29sbGFwc2VkPWZhbHNlfSxjb2xsYXBzZTpmdW5jdGlvbihnKXt2YXIgZj10aGlzO2lmKGcpe2EoZixmdW5jdGlvbihoKXtpZihoLmNvbGxhcHNlKXtoLmNvbGxhcHNlKCl9fSwiaXRlbXMiLGYpfWYuY29sbGFwc2VkPXRydWV9LGlzQ29sbGFwc2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sbGFwc2VkfSxhZGQ6ZnVuY3Rpb24oZil7aWYoIWYuc2V0dGluZ3Mpe2Y9bmV3IGQudWkuTWVudUl0ZW0oZi5pZHx8Yi51bmlxdWVJZCgpLGYpfXRoaXMub25BZGRJdGVtLmRpc3BhdGNoKHRoaXMsZik7cmV0dXJuIHRoaXMuaXRlbXNbZi5pZF09Zn0sYWRkU2VwYXJhdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHtzZXBhcmF0b3I6dHJ1ZX0pfSxhZGRNZW51OmZ1bmN0aW9uKGYpe2lmKCFmLmNvbGxhcHNlKXtmPXRoaXMuY3JlYXRlTWVudShmKX10aGlzLm1lbnVDb3VudCsrO3JldHVybiB0aGlzLmFkZChmKX0saGFzTWVudXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51Q291bnQhPT0wfSxyZW1vdmU6ZnVuY3Rpb24oZil7ZGVsZXRlIHRoaXMuaXRlbXNbZi5pZF19LHJlbW92ZUFsbDpmdW5jdGlvbigpe3ZhciBmPXRoaXM7YShmLGZ1bmN0aW9uKGcpe2lmKGcucmVtb3ZlQWxsKXtnLnJlbW92ZUFsbCgpfWVsc2V7Zy5yZW1vdmUoKX1nLmRlc3Ryb3koKX0sIml0ZW1zIixmKTtmLml0ZW1zPXt9fSxjcmVhdGVNZW51OmZ1bmN0aW9uKGcpe3ZhciBmPW5ldyBkLnVpLk1lbnUoZy5pZHx8Yi51bmlxdWVJZCgpLGcpO2Yub25BZGRJdGVtLmFkZCh0aGlzLm9uQWRkSXRlbS5kaXNwYXRjaCx0aGlzLm9uQWRkSXRlbSk7cmV0dXJuIGZ9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oZSl7dmFyIGQ9ZS5pcyxjPWUuRE9NLGY9ZS5lYWNoLGE9ZS5kb20uRXZlbnQsYj1lLmRvbS5FbGVtZW50O2UuY3JlYXRlKCJ0aW55bWNlLnVpLkRyb3BNZW51OnRpbnltY2UudWkuTWVudSIse0Ryb3BNZW51OmZ1bmN0aW9uKGgsZyl7Zz1nfHx7fTtnLmNvbnRhaW5lcj1nLmNvbnRhaW5lcnx8Yy5kb2MuYm9keTtnLm9mZnNldF94PWcub2Zmc2V0X3h8fDA7Zy5vZmZzZXRfeT1nLm9mZnNldF95fHwwO2cudnBfb2Zmc2V0X3g9Zy52cF9vZmZzZXRfeHx8MDtnLnZwX29mZnNldF95PWcudnBfb2Zmc2V0X3l8fDA7aWYoZChnLmljb25zKSYmIWcuaWNvbnMpe2dbImNsYXNzIl0rPSIgbWNlTm9JY29ucyJ9dGhpcy5wYXJlbnQoaCxnKTt0aGlzLm9uU2hvd01lbnU9bmV3IGUudXRpbC5EaXNwYXRjaGVyKHRoaXMpO3RoaXMub25IaWRlTWVudT1uZXcgZS51dGlsLkRpc3BhdGNoZXIodGhpcyk7dGhpcy5jbGFzc1ByZWZpeD0ibWNlTWVudSJ9LGNyZWF0ZU1lbnU6ZnVuY3Rpb24oail7dmFyIGg9dGhpcyxpPWguc2V0dGluZ3MsZztqLmNvbnRhaW5lcj1qLmNvbnRhaW5lcnx8aS5jb250YWluZXI7ai5wYXJlbnQ9aDtqLmNvbnN0cmFpbj1qLmNvbnN0cmFpbnx8aS5jb25zdHJhaW47alsiY2xhc3MiXT1qWyJjbGFzcyJdfHxpWyJjbGFzcyJdO2oudnBfb2Zmc2V0X3g9ai52cF9vZmZzZXRfeHx8aS52cF9vZmZzZXRfeDtqLnZwX29mZnNldF95PWoudnBfb2Zmc2V0X3l8fGkudnBfb2Zmc2V0X3k7Zz1uZXcgZS51aS5Ecm9wTWVudShqLmlkfHxjLnVuaXF1ZUlkKCksaik7Zy5vbkFkZEl0ZW0uYWRkKGgub25BZGRJdGVtLmRpc3BhdGNoLGgub25BZGRJdGVtKTtyZXR1cm4gZ30sdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxqPWkuc2V0dGluZ3MsZz1jLmdldCgibWVudV8iK2kuaWQrIl90YmwiKSxsPWMuZ2V0KCJtZW51XyIraS5pZCsiX2NvIiksaCxrO2g9ai5tYXhfd2lkdGg/TWF0aC5taW4oZy5jbGllbnRXaWR0aCxqLm1heF93aWR0aCk6Zy5jbGllbnRXaWR0aDtrPWoubWF4X2hlaWdodD9NYXRoLm1pbihnLmNsaWVudEhlaWdodCxqLm1heF9oZWlnaHQpOmcuY2xpZW50SGVpZ2h0O2lmKCFjLmJveE1vZGVsKXtpLmVsZW1lbnQuc2V0U3R5bGVzKHt3aWR0aDpoKzIsaGVpZ2h0OmsrMn0pfWVsc2V7aS5lbGVtZW50LnNldFN0eWxlcyh7d2lkdGg6aCxoZWlnaHQ6a30pfWlmKGoubWF4X3dpZHRoKXtjLnNldFN0eWxlKGwsIndpZHRoIixoKX1pZihqLm1heF9oZWlnaHQpe2Muc2V0U3R5bGUobCwiaGVpZ2h0IixrKTtpZihnLmNsaWVudEhlaWdodDxqLm1heF9oZWlnaHQpe2Muc2V0U3R5bGUobCwib3ZlcmZsb3ciLCJoaWRkZW4iKX19fSxzaG93TWVudTpmdW5jdGlvbihwLG4scil7dmFyIHo9dGhpcyxBPXouc2V0dGluZ3MsbyxnPWMuZ2V0Vmlld1BvcnQoKSx1LGwsdixxLGk9MixrLGosbT16LmNsYXNzUHJlZml4O3ouY29sbGFwc2UoMSk7aWYoei5pc01lbnVWaXNpYmxlKXtyZXR1cm59aWYoIXoucmVuZGVyZWQpe289Yy5hZGQoei5zZXR0aW5ncy5jb250YWluZXIsei5yZW5kZXJOb2RlKCkpO2Yoei5pdGVtcyxmdW5jdGlvbihoKXtoLnBvc3RSZW5kZXIoKX0pO3ouZWxlbWVudD1uZXcgYigibWVudV8iK3ouaWQse2Jsb2NrZXI6MSxjb250YWluZXI6QS5jb250YWluZXJ9KX1lbHNle289Yy5nZXQoIm1lbnVfIit6LmlkKX1pZighZS5pc09wZXJhKXtjLnNldFN0eWxlcyhvLHtsZWZ0Oi02NTUzNSx0b3A6LTY1NTM1fSl9Yy5zaG93KG8pO3oudXBkYXRlKCk7cCs9QS5vZmZzZXRfeHx8MDtuKz1BLm9mZnNldF95fHwwO2cudy09NDtnLmgtPTQ7aWYoQS5jb25zdHJhaW4pe3U9by5jbGllbnRXaWR0aC1pO2w9by5jbGllbnRIZWlnaHQtaTt2PWcueCtnLnc7cT1nLnkrZy5oO2lmKChwK0EudnBfb2Zmc2V0X3grdSk+dil7cD1yP3ItdTpNYXRoLm1heCgwLCh2LUEudnBfb2Zmc2V0X3gpLXUpfWlmKChuK0EudnBfb2Zmc2V0X3krbCk+cSl7bj1NYXRoLm1heCgwLChxLUEudnBfb2Zmc2V0X3kpLWwpfX1jLnNldFN0eWxlcyhvLHtsZWZ0OnAsdG9wOm59KTt6LmVsZW1lbnQudXBkYXRlKCk7ei5pc01lbnVWaXNpYmxlPTE7ei5tb3VzZUNsaWNrRnVuYz1hLmFkZChvLCJjbGljayIsZnVuY3Rpb24ocyl7dmFyIGg7cz1zLnRhcmdldDtpZihzJiYocz1jLmdldFBhcmVudChzLCJ0ciIpKSYmIWMuaGFzQ2xhc3MocyxtKyJJdGVtU3ViIikpe2g9ei5pdGVtc1tzLmlkXTtpZihoLmlzRGlzYWJsZWQoKSl7cmV0dXJufWs9ejt3aGlsZShrKXtpZihrLmhpZGVNZW51KXtrLmhpZGVNZW51KCl9az1rLnNldHRpbmdzLnBhcmVudH1pZihoLnNldHRpbmdzLm9uY2xpY2spe2guc2V0dGluZ3Mub25jbGljayhzKX1yZXR1cm4gYS5jYW5jZWwocyl9fSk7aWYoei5oYXNNZW51cygpKXt6Lm1vdXNlT3ZlckZ1bmM9YS5hZGQobywibW91c2VvdmVyIixmdW5jdGlvbih4KXt2YXIgaCx0LHM7eD14LnRhcmdldDtpZih4JiYoeD1jLmdldFBhcmVudCh4LCJ0ciIpKSl7aD16Lml0ZW1zW3guaWRdO2lmKHoubGFzdE1lbnUpe3oubGFzdE1lbnUuY29sbGFwc2UoMSl9aWYoaC5pc0Rpc2FibGVkKCkpe3JldHVybn1pZih4JiZjLmhhc0NsYXNzKHgsbSsiSXRlbVN1YiIpKXt0PWMuZ2V0UmVjdCh4KTtoLnNob3dNZW51KCh0LngrdC53LWkpLHQueS1pLHQueCk7ei5sYXN0TWVudT1oO2MuYWRkQ2xhc3MoYy5nZXQoaC5pZCkuZmlyc3RDaGlsZCxtKyJJdGVtQWN0aXZlIil9fX0pfXoub25TaG93TWVudS5kaXNwYXRjaCh6KTtpZihBLmtleWJvYXJkX2ZvY3VzKXthLmFkZChvLCJrZXlkb3duIix6Ll9rZXlIYW5kbGVyLHopO2Muc2VsZWN0KCJhIiwibWVudV8iK3ouaWQpWzBdLmZvY3VzKCk7ei5fZm9jdXNJZHg9MH19LGhpZGVNZW51OmZ1bmN0aW9uKGope3ZhciBnPXRoaXMsaT1jLmdldCgibWVudV8iK2cuaWQpLGg7aWYoIWcuaXNNZW51VmlzaWJsZSl7cmV0dXJufWEucmVtb3ZlKGksIm1vdXNlb3ZlciIsZy5tb3VzZU92ZXJGdW5jKTthLnJlbW92ZShpLCJjbGljayIsZy5tb3VzZUNsaWNrRnVuYyk7YS5yZW1vdmUoaSwia2V5ZG93biIsZy5fa2V5SGFuZGxlcik7Yy5oaWRlKGkpO2cuaXNNZW51VmlzaWJsZT0wO2lmKCFqKXtnLmNvbGxhcHNlKDEpfWlmKGcuZWxlbWVudCl7Zy5lbGVtZW50LmhpZGUoKX1pZihoPWMuZ2V0KGcuaWQpKXtjLnJlbW92ZUNsYXNzKGguZmlyc3RDaGlsZCxnLmNsYXNzUHJlZml4KyJJdGVtQWN0aXZlIil9Zy5vbkhpZGVNZW51LmRpc3BhdGNoKGcpfSxhZGQ6ZnVuY3Rpb24oaSl7dmFyIGc9dGhpcyxoO2k9Zy5wYXJlbnQoaSk7aWYoZy5pc1JlbmRlcmVkJiYoaD1jLmdldCgibWVudV8iK2cuaWQpKSl7Zy5fYWRkKGMuc2VsZWN0KCJ0Ym9keSIsaClbMF0saSl9cmV0dXJuIGl9LGNvbGxhcHNlOmZ1bmN0aW9uKGcpe3RoaXMucGFyZW50KGcpO3RoaXMuaGlkZU1lbnUoMSl9LHJlbW92ZTpmdW5jdGlvbihnKXtjLnJlbW92ZShnLmlkKTt0aGlzLmRlc3Ryb3koKTtyZXR1cm4gdGhpcy5wYXJlbnQoZyl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGg9Yy5nZXQoIm1lbnVfIitnLmlkKTthLnJlbW92ZShoLCJtb3VzZW92ZXIiLGcubW91c2VPdmVyRnVuYyk7YS5yZW1vdmUoaCwiY2xpY2siLGcubW91c2VDbGlja0Z1bmMpO2lmKGcuZWxlbWVudCl7Zy5lbGVtZW50LnJlbW92ZSgpfWMucmVtb3ZlKGgpfSxyZW5kZXJOb2RlOmZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxqPWkuc2V0dGluZ3MsbCxoLGssZztnPWMuY3JlYXRlKCJkaXYiLHtpZDoibWVudV8iK2kuaWQsImNsYXNzIjpqWyJjbGFzcyJdLHN0eWxlOiJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7ei1pbmRleDoyMDAwMDAifSk7az1jLmFkZChnLCJkaXYiLHtpZDoibWVudV8iK2kuaWQrIl9jbyIsImNsYXNzIjppLmNsYXNzUHJlZml4KyhqWyJjbGFzcyJdPyIgIitqWyJjbGFzcyJdOiIiKX0pO2kuZWxlbWVudD1uZXcgYigibWVudV8iK2kuaWQse2Jsb2NrZXI6MSxjb250YWluZXI6ai5jb250YWluZXJ9KTtpZihqLm1lbnVfbGluZSl7Yy5hZGQoaywic3BhbiIseyJjbGFzcyI6aS5jbGFzc1ByZWZpeCsiTGluZSJ9KX1sPWMuYWRkKGssInRhYmxlIix7aWQ6Im1lbnVfIitpLmlkKyJfdGJsIixib3JkZXI6MCxjZWxsUGFkZGluZzowLGNlbGxTcGFjaW5nOjB9KTtoPWMuYWRkKGwsInRib2R5Iik7ZihpLml0ZW1zLGZ1bmN0aW9uKG0pe2kuX2FkZChoLG0pfSk7aS5yZW5kZXJlZD10cnVlO3JldHVybiBnfSxfa2V5SGFuZGxlcjpmdW5jdGlvbihqKXt2YXIgaT10aGlzLGg9ai5rZXlDb2RlO2Z1bmN0aW9uIGcobSl7dmFyIGs9aS5fZm9jdXNJZHgrbSxsPWMuc2VsZWN0KCJhIiwibWVudV8iK2kuaWQpW2tdO2lmKGwpe2kuX2ZvY3VzSWR4PWs7bC5mb2N1cygpfX1zd2l0Y2goaCl7Y2FzZSAzODpnKC0xKTtyZXR1cm47Y2FzZSA0MDpnKDEpO3JldHVybjtjYXNlIDEzOnJldHVybjtjYXNlIDI3OnJldHVybiB0aGlzLmhpZGVNZW51KCl9fSxfYWRkOmZ1bmN0aW9uKGosaCl7dmFyIGkscT1oLnNldHRpbmdzLHAsbCxrLG09dGhpcy5jbGFzc1ByZWZpeCxnO2lmKHEuc2VwYXJhdG9yKXtsPWMuYWRkKGosInRyIix7aWQ6aC5pZCwiY2xhc3MiOm0rIkl0ZW1TZXBhcmF0b3IifSk7Yy5hZGQobCwidGQiLHsiY2xhc3MiOm0rIkl0ZW1TZXBhcmF0b3IifSk7aWYoaT1sLnByZXZpb3VzU2libGluZyl7Yy5hZGRDbGFzcyhpLCJtY2VMYXN0Iil9cmV0dXJufWk9bD1jLmFkZChqLCJ0ciIse2lkOmguaWQsImNsYXNzIjptKyJJdGVtICIrbSsiSXRlbUVuYWJsZWQifSk7aT1rPWMuYWRkKGksInRkIik7aT1wPWMuYWRkKGksImEiLHtocmVmOiJqYXZhc2NyaXB0OjsiLG9uY2xpY2s6InJldHVybiBmYWxzZTsiLG9ubW91c2Vkb3duOiJyZXR1cm4gZmFsc2U7In0pO2MuYWRkQ2xhc3MoayxxWyJjbGFzcyJdKTtnPWMuYWRkKGksInNwYW4iLHsiY2xhc3MiOiJtY2VJY29uIisocS5pY29uPyIgbWNlXyIrcS5pY29uOiIiKX0pO2lmKHEuaWNvbl9zcmMpe2MuYWRkKGcsImltZyIse3NyYzpxLmljb25fc3JjfSl9aT1jLmFkZChpLHEuZWxlbWVudHx8InNwYW4iLHsiY2xhc3MiOiJtY2VUZXh0Iix0aXRsZTpoLnNldHRpbmdzLnRpdGxlfSxoLnNldHRpbmdzLnRpdGxlKTtpZihoLnNldHRpbmdzLnN0eWxlKXtjLnNldEF0dHJpYihpLCJzdHlsZSIsaC5zZXR0aW5ncy5zdHlsZSl9aWYoai5jaGlsZE5vZGVzLmxlbmd0aD09MSl7Yy5hZGRDbGFzcyhsLCJtY2VGaXJzdCIpfWlmKChpPWwucHJldmlvdXNTaWJsaW5nKSYmYy5oYXNDbGFzcyhpLG0rIkl0ZW1TZXBhcmF0b3IiKSl7Yy5hZGRDbGFzcyhsLCJtY2VGaXJzdCIpfWlmKGguY29sbGFwc2Upe2MuYWRkQ2xhc3MobCxtKyJJdGVtU3ViIil9aWYoaT1sLnByZXZpb3VzU2libGluZyl7Yy5yZW1vdmVDbGFzcyhpLCJtY2VMYXN0Iil9Yy5hZGRDbGFzcyhsLCJtY2VMYXN0Iil9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYil7dmFyIGE9Yi5ET007Yi5jcmVhdGUoInRpbnltY2UudWkuQnV0dG9uOnRpbnltY2UudWkuQ29udHJvbCIse0J1dHRvbjpmdW5jdGlvbihkLGMpe3RoaXMucGFyZW50KGQsYyk7dGhpcy5jbGFzc1ByZWZpeD0ibWNlQnV0dG9uIn0scmVuZGVySFRNTDpmdW5jdGlvbigpe3ZhciBmPXRoaXMuY2xhc3NQcmVmaXgsZT10aGlzLnNldHRpbmdzLGQsYztjPWEuZW5jb2RlKGUubGFiZWx8fCIiKTtkPSc8YSBpZD0iJyt0aGlzLmlkKyciIGhyZWY9ImphdmFzY3JpcHQ6OyIgY2xhc3M9IicrZisiICIrZisiRW5hYmxlZCAiK2VbImNsYXNzIl0rKGM/IiAiK2YrIkxhYmVsZWQiOiIiKSsnIiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyIgb25jbGljaz0icmV0dXJuIGZhbHNlOyIgdGl0bGU9IicrYS5lbmNvZGUoZS50aXRsZSkrJyI+JztpZihlLmltYWdlKXtkKz0nPGltZyBjbGFzcz0ibWNlSWNvbiIgc3JjPSInK2UuaW1hZ2UrJyIgLz4nK2MrIjwvYT4ifWVsc2V7ZCs9JzxzcGFuIGNsYXNzPSJtY2VJY29uICcrZVsiY2xhc3MiXSsnIj48L3NwYW4+JysoYz8nPHNwYW4gY2xhc3M9IicrZisnTGFiZWwiPicrYysiPC9zcGFuPiI6IiIpKyI8L2E+In1yZXR1cm4gZH0scG9zdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBjPXRoaXMsZD1jLnNldHRpbmdzO2IuZG9tLkV2ZW50LmFkZChjLmlkLCJjbGljayIsZnVuY3Rpb24oZil7aWYoIWMuaXNEaXNhYmxlZCgpKXtyZXR1cm4gZC5vbmNsaWNrLmNhbGwoZC5zY29wZSxmKX19KX19KX0pKHRpbnltY2UpOyhmdW5jdGlvbihkKXt2YXIgYz1kLkRPTSxiPWQuZG9tLkV2ZW50LGU9ZC5lYWNoLGE9ZC51dGlsLkRpc3BhdGNoZXI7ZC5jcmVhdGUoInRpbnltY2UudWkuTGlzdEJveDp0aW55bWNlLnVpLkNvbnRyb2wiLHtMaXN0Qm94OmZ1bmN0aW9uKGgsZyl7dmFyIGY9dGhpcztmLnBhcmVudChoLGcpO2YuaXRlbXM9W107Zi5vbkNoYW5nZT1uZXcgYShmKTtmLm9uUG9zdFJlbmRlcj1uZXcgYShmKTtmLm9uQWRkPW5ldyBhKGYpO2Yub25SZW5kZXJNZW51PW5ldyBkLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTtmLmNsYXNzUHJlZml4PSJtY2VMaXN0Qm94In0sc2VsZWN0OmZ1bmN0aW9uKGgpe3ZhciBnPXRoaXMsaixpO2lmKGg9PXVuZGVmaW5lZCl7cmV0dXJuIGcuc2VsZWN0QnlJbmRleCgtMSl9aWYoaCYmaC5jYWxsKXtpPWh9ZWxzZXtpPWZ1bmN0aW9uKGYpe3JldHVybiBmPT1ofX1pZihoIT1nLnNlbGVjdGVkVmFsdWUpe2UoZy5pdGVtcyxmdW5jdGlvbihrLGYpe2lmKGkoay52YWx1ZSkpe2o9MTtnLnNlbGVjdEJ5SW5kZXgoZik7cmV0dXJuIGZhbHNlfX0pO2lmKCFqKXtnLnNlbGVjdEJ5SW5kZXgoLTEpfX19LHNlbGVjdEJ5SW5kZXg6ZnVuY3Rpb24oZil7dmFyIGc9dGhpcyxoLGk7aWYoZiE9Zy5zZWxlY3RlZEluZGV4KXtoPWMuZ2V0KGcuaWQrIl90ZXh0Iik7aT1nLml0ZW1zW2ZdO2lmKGkpe2cuc2VsZWN0ZWRWYWx1ZT1pLnZhbHVlO2cuc2VsZWN0ZWRJbmRleD1mO2Muc2V0SFRNTChoLGMuZW5jb2RlKGkudGl0bGUpKTtjLnJlbW92ZUNsYXNzKGgsIm1jZVRpdGxlIil9ZWxzZXtjLnNldEhUTUwoaCxjLmVuY29kZShnLnNldHRpbmdzLnRpdGxlKSk7Yy5hZGRDbGFzcyhoLCJtY2VUaXRsZSIpO2cuc2VsZWN0ZWRWYWx1ZT1nLnNlbGVjdGVkSW5kZXg9bnVsbH1oPTB9fSxhZGQ6ZnVuY3Rpb24oaSxmLGgpe3ZhciBnPXRoaXM7aD1ofHx7fTtoPWQuZXh0ZW5kKGgse3RpdGxlOmksdmFsdWU6Zn0pO2cuaXRlbXMucHVzaChoKTtnLm9uQWRkLmRpc3BhdGNoKGcsaCl9LGdldExlbmd0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZW1zLmxlbmd0aH0scmVuZGVySFRNTDpmdW5jdGlvbigpe3ZhciBpPSIiLGY9dGhpcyxnPWYuc2V0dGluZ3Msaj1mLmNsYXNzUHJlZml4O2k9Jzx0YWJsZSBpZD0iJytmLmlkKyciIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9IicraisiICIraisiRW5hYmxlZCIrKGdbImNsYXNzIl0/KCIgIitnWyJjbGFzcyJdKToiIikrJyI+PHRib2R5Pjx0cj4nO2krPSI8dGQ+IitjLmNyZWF0ZUhUTUwoImEiLHtpZDpmLmlkKyJfdGV4dCIsaHJlZjoiamF2YXNjcmlwdDo7IiwiY2xhc3MiOiJtY2VUZXh0IixvbmNsaWNrOiJyZXR1cm4gZmFsc2U7Iixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyJ9LGMuZW5jb2RlKGYuc2V0dGluZ3MudGl0bGUpKSsiPC90ZD4iO2krPSI8dGQ+IitjLmNyZWF0ZUhUTUwoImEiLHtpZDpmLmlkKyJfb3BlbiIsdGFiaW5kZXg6LTEsaHJlZjoiamF2YXNjcmlwdDo7IiwiY2xhc3MiOiJtY2VPcGVuIixvbmNsaWNrOiJyZXR1cm4gZmFsc2U7Iixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyJ9LCI8c3Bhbj48L3NwYW4+IikrIjwvdGQ+IjtpKz0iPC90cj48L3Rib2R5PjwvdGFibGU+IjtyZXR1cm4gaX0sc2hvd01lbnU6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGosaSxoPWMuZ2V0KHRoaXMuaWQpLGY7aWYoZy5pc0Rpc2FibGVkKCl8fGcuaXRlbXMubGVuZ3RoPT0wKXtyZXR1cm59aWYoZy5tZW51JiZnLm1lbnUuaXNNZW51VmlzaWJsZSl7cmV0dXJuIGcuaGlkZU1lbnUoKX1pZighZy5pc01lbnVSZW5kZXJlZCl7Zy5yZW5kZXJNZW51KCk7Zy5pc01lbnVSZW5kZXJlZD10cnVlfWo9Yy5nZXRQb3ModGhpcy5zZXR0aW5ncy5tZW51X2NvbnRhaW5lcik7aT1jLmdldFBvcyhoKTtmPWcubWVudTtmLnNldHRpbmdzLm9mZnNldF94PWkueDtmLnNldHRpbmdzLm9mZnNldF95PWkueTtmLnNldHRpbmdzLmtleWJvYXJkX2ZvY3VzPSFkLmlzT3BlcmE7aWYoZy5vbGRJRCl7Zi5pdGVtc1tnLm9sZElEXS5zZXRTZWxlY3RlZCgwKX1lKGcuaXRlbXMsZnVuY3Rpb24oayl7aWYoay52YWx1ZT09PWcuc2VsZWN0ZWRWYWx1ZSl7Zi5pdGVtc1trLmlkXS5zZXRTZWxlY3RlZCgxKTtnLm9sZElEPWsuaWR9fSk7Zi5zaG93TWVudSgwLGguY2xpZW50SGVpZ2h0KTtiLmFkZChjLmRvYywibW91c2Vkb3duIixnLmhpZGVNZW51LGcpO2MuYWRkQ2xhc3MoZy5pZCxnLmNsYXNzUHJlZml4KyJTZWxlY3RlZCIpfSxoaWRlTWVudTpmdW5jdGlvbihnKXt2YXIgZj10aGlzO2lmKGYubWVudSYmZi5tZW51LmlzTWVudVZpc2libGUpe2lmKGcmJmcudHlwZT09Im1vdXNlZG93biImJihnLnRhcmdldC5pZD09Zi5pZCsiX3RleHQifHxnLnRhcmdldC5pZD09Zi5pZCsiX29wZW4iKSl7cmV0dXJufWlmKCFnfHwhYy5nZXRQYXJlbnQoZy50YXJnZXQsIi5tY2VNZW51Iikpe2MucmVtb3ZlQ2xhc3MoZi5pZCxmLmNsYXNzUHJlZml4KyJTZWxlY3RlZCIpO2IucmVtb3ZlKGMuZG9jLCJtb3VzZWRvd24iLGYuaGlkZU1lbnUsZik7Zi5tZW51LmhpZGVNZW51KCl9fX0scmVuZGVyTWVudTpmdW5jdGlvbigpe3ZhciBnPXRoaXMsZjtmPWcuc2V0dGluZ3MuY29udHJvbF9tYW5hZ2VyLmNyZWF0ZURyb3BNZW51KGcuaWQrIl9tZW51Iix7bWVudV9saW5lOjEsImNsYXNzIjpnLmNsYXNzUHJlZml4KyJNZW51IG1jZU5vSWNvbnMiLG1heF93aWR0aDoxNTAsbWF4X2hlaWdodDoxNTB9KTtmLm9uSGlkZU1lbnUuYWRkKGcuaGlkZU1lbnUsZyk7Zi5hZGQoe3RpdGxlOmcuc2V0dGluZ3MudGl0bGUsImNsYXNzIjoibWNlTWVudUl0ZW1UaXRsZSIsb25jbGljazpmdW5jdGlvbigpe2lmKGcuc2V0dGluZ3Mub25zZWxlY3QoIiIpIT09ZmFsc2Upe2cuc2VsZWN0KCIiKX19fSk7ZShnLml0ZW1zLGZ1bmN0aW9uKGgpe2lmKGgudmFsdWU9PT11bmRlZmluZWQpe2YuYWRkKHt0aXRsZTpoLnRpdGxlLCJjbGFzcyI6Im1jZU1lbnVJdGVtVGl0bGUiLG9uY2xpY2s6ZnVuY3Rpb24oKXtpZihnLnNldHRpbmdzLm9uc2VsZWN0KCIiKSE9PWZhbHNlKXtnLnNlbGVjdCgiIil9fX0pfWVsc2V7aC5pZD1jLnVuaXF1ZUlkKCk7aC5vbmNsaWNrPWZ1bmN0aW9uKCl7aWYoZy5zZXR0aW5ncy5vbnNlbGVjdChoLnZhbHVlKSE9PWZhbHNlKXtnLnNlbGVjdChoLnZhbHVlKX19O2YuYWRkKGgpfX0pO2cub25SZW5kZXJNZW51LmRpc3BhdGNoKGcsZik7Zy5tZW51PWZ9LHBvc3RSZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZj10aGlzLGc9Zi5jbGFzc1ByZWZpeDtiLmFkZChmLmlkLCJjbGljayIsZi5zaG93TWVudSxmKTtiLmFkZChmLmlkKyJfdGV4dCIsImZvY3VzIixmdW5jdGlvbigpe2lmKCFmLl9mb2N1c2VkKXtmLmtleURvd25IYW5kbGVyPWIuYWRkKGYuaWQrIl90ZXh0Iiwia2V5ZG93biIsZnVuY3Rpb24oayl7dmFyIGg9LTEsaSxqPWsua2V5Q29kZTtlKGYuaXRlbXMsZnVuY3Rpb24obCxtKXtpZihmLnNlbGVjdGVkVmFsdWU9PWwudmFsdWUpe2g9bX19KTtpZihqPT0zOCl7aT1mLml0ZW1zW2gtMV19ZWxzZXtpZihqPT00MCl7aT1mLml0ZW1zW2grMV19ZWxzZXtpZihqPT0xMyl7aT1mLnNlbGVjdGVkVmFsdWU7Zi5zZWxlY3RlZFZhbHVlPW51bGw7Zi5zZXR0aW5ncy5vbnNlbGVjdChpKTtyZXR1cm4gYi5jYW5jZWwoayl9fX1pZihpKXtmLmhpZGVNZW51KCk7Zi5zZWxlY3QoaS52YWx1ZSl9fSl9Zi5fZm9jdXNlZD0xfSk7Yi5hZGQoZi5pZCsiX3RleHQiLCJibHVyIixmdW5jdGlvbigpe2IucmVtb3ZlKGYuaWQrIl90ZXh0Iiwia2V5ZG93biIsZi5rZXlEb3duSGFuZGxlcik7Zi5fZm9jdXNlZD0wfSk7aWYoZC5pc0lFNnx8IWMuYm94TW9kZWwpe2IuYWRkKGYuaWQsIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXtpZighYy5oYXNDbGFzcyhmLmlkLGcrIkRpc2FibGVkIikpe2MuYWRkQ2xhc3MoZi5pZCxnKyJIb3ZlciIpfX0pO2IuYWRkKGYuaWQsIm1vdXNlb3V0IixmdW5jdGlvbigpe2lmKCFjLmhhc0NsYXNzKGYuaWQsZysiRGlzYWJsZWQiKSl7Yy5yZW1vdmVDbGFzcyhmLmlkLGcrIkhvdmVyIil9fSl9Zi5vblBvc3RSZW5kZXIuZGlzcGF0Y2goZixjLmdldChmLmlkKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnBhcmVudCgpO2IuY2xlYXIodGhpcy5pZCsiX3RleHQiKTtiLmNsZWFyKHRoaXMuaWQrIl9vcGVuIil9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oZCl7dmFyIGM9ZC5ET00sYj1kLmRvbS5FdmVudCxlPWQuZWFjaCxhPWQudXRpbC5EaXNwYXRjaGVyO2QuY3JlYXRlKCJ0aW55bWNlLnVpLk5hdGl2ZUxpc3RCb3g6dGlueW1jZS51aS5MaXN0Qm94Iix7TmF0aXZlTGlzdEJveDpmdW5jdGlvbihnLGYpe3RoaXMucGFyZW50KGcsZik7dGhpcy5jbGFzc1ByZWZpeD0ibWNlTmF0aXZlTGlzdEJveCJ9LHNldERpc2FibGVkOmZ1bmN0aW9uKGYpe2MuZ2V0KHRoaXMuaWQpLmRpc2FibGVkPWZ9LGlzRGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5nZXQodGhpcy5pZCkuZGlzYWJsZWR9LHNlbGVjdDpmdW5jdGlvbihoKXt2YXIgZz10aGlzLGosaTtpZihoPT11bmRlZmluZWQpe3JldHVybiBnLnNlbGVjdEJ5SW5kZXgoLTEpfWlmKGgmJmguY2FsbCl7aT1ofWVsc2V7aT1mdW5jdGlvbihmKXtyZXR1cm4gZj09aH19aWYoaCE9Zy5zZWxlY3RlZFZhbHVlKXtlKGcuaXRlbXMsZnVuY3Rpb24oayxmKXtpZihpKGsudmFsdWUpKXtqPTE7Zy5zZWxlY3RCeUluZGV4KGYpO3JldHVybiBmYWxzZX19KTtpZighail7Zy5zZWxlY3RCeUluZGV4KC0xKX19fSxzZWxlY3RCeUluZGV4OmZ1bmN0aW9uKGYpe2MuZ2V0KHRoaXMuaWQpLnNlbGVjdGVkSW5kZXg9ZisxO3RoaXMuc2VsZWN0ZWRWYWx1ZT10aGlzLml0ZW1zW2ZdP3RoaXMuaXRlbXNbZl0udmFsdWU6bnVsbH0sYWRkOmZ1bmN0aW9uKGosZyxmKXt2YXIgaSxoPXRoaXM7Zj1mfHx7fTtmLnZhbHVlPWc7aWYoaC5pc1JlbmRlcmVkKCkpe2MuYWRkKGMuZ2V0KHRoaXMuaWQpLCJvcHRpb24iLGYsail9aT17dGl0bGU6aix2YWx1ZTpnLGF0dHJpYnM6Zn07aC5pdGVtcy5wdXNoKGkpO2gub25BZGQuZGlzcGF0Y2goaCxpKX0sZ2V0TGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RofSxyZW5kZXJIVE1MOmZ1bmN0aW9uKCl7dmFyIGcsZj10aGlzO2c9Yy5jcmVhdGVIVE1MKCJvcHRpb24iLHt2YWx1ZToiIn0sIi0tICIrZi5zZXR0aW5ncy50aXRsZSsiIC0tIik7ZShmLml0ZW1zLGZ1bmN0aW9uKGgpe2crPWMuY3JlYXRlSFRNTCgib3B0aW9uIix7dmFsdWU6aC52YWx1ZX0saC50aXRsZSl9KTtnPWMuY3JlYXRlSFRNTCgic2VsZWN0Iix7aWQ6Zi5pZCwiY2xhc3MiOiJtY2VOYXRpdmVMaXN0Qm94In0sZyk7cmV0dXJuIGd9LHBvc3RSZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGg7Zy5yZW5kZXJlZD10cnVlO2Z1bmN0aW9uIGYoail7dmFyIGk9Zy5pdGVtc1tqLnRhcmdldC5zZWxlY3RlZEluZGV4LTFdO2lmKGkmJihpPWkudmFsdWUpKXtnLm9uQ2hhbmdlLmRpc3BhdGNoKGcsaSk7aWYoZy5zZXR0aW5ncy5vbnNlbGVjdCl7Zy5zZXR0aW5ncy5vbnNlbGVjdChpKX19fWIuYWRkKGcuaWQsImNoYW5nZSIsZik7Yi5hZGQoZy5pZCwia2V5ZG93biIsZnVuY3Rpb24oail7dmFyIGk7Yi5yZW1vdmUoZy5pZCwiY2hhbmdlIixoKTtpPWIuYWRkKGcuaWQsImJsdXIiLGZ1bmN0aW9uKCl7Yi5hZGQoZy5pZCwiY2hhbmdlIixmKTtiLnJlbW92ZShnLmlkLCJibHVyIixpKX0pO2lmKGoua2V5Q29kZT09MTN8fGoua2V5Q29kZT09MzIpe2Yoaik7cmV0dXJuIGIuY2FuY2VsKGopfX0pO2cub25Qb3N0UmVuZGVyLmRpc3BhdGNoKGcsYy5nZXQoZy5pZCkpfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGMpe3ZhciBiPWMuRE9NLGE9Yy5kb20uRXZlbnQsZD1jLmVhY2g7Yy5jcmVhdGUoInRpbnltY2UudWkuTWVudUJ1dHRvbjp0aW55bWNlLnVpLkJ1dHRvbiIse01lbnVCdXR0b246ZnVuY3Rpb24oZixlKXt0aGlzLnBhcmVudChmLGUpO3RoaXMub25SZW5kZXJNZW51PW5ldyBjLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTtlLm1lbnVfY29udGFpbmVyPWUubWVudV9jb250YWluZXJ8fGIuZG9jLmJvZHl9LHNob3dNZW51OmZ1bmN0aW9uKCl7dmFyIGc9dGhpcyxqLGksaD1iLmdldChnLmlkKSxmO2lmKGcuaXNEaXNhYmxlZCgpKXtyZXR1cm59aWYoIWcuaXNNZW51UmVuZGVyZWQpe2cucmVuZGVyTWVudSgpO2cuaXNNZW51UmVuZGVyZWQ9dHJ1ZX1pZihnLmlzTWVudVZpc2libGUpe3JldHVybiBnLmhpZGVNZW51KCl9aj1iLmdldFBvcyhnLnNldHRpbmdzLm1lbnVfY29udGFpbmVyKTtpPWIuZ2V0UG9zKGgpO2Y9Zy5tZW51O2Yuc2V0dGluZ3Mub2Zmc2V0X3g9aS54O2Yuc2V0dGluZ3Mub2Zmc2V0X3k9aS55O2Yuc2V0dGluZ3MudnBfb2Zmc2V0X3g9aS54O2Yuc2V0dGluZ3MudnBfb2Zmc2V0X3k9aS55O2Yuc2V0dGluZ3Mua2V5Ym9hcmRfZm9jdXM9Zy5fZm9jdXNlZDtmLnNob3dNZW51KDAsaC5jbGllbnRIZWlnaHQpO2EuYWRkKGIuZG9jLCJtb3VzZWRvd24iLGcuaGlkZU1lbnUsZyk7Zy5zZXRTdGF0ZSgiU2VsZWN0ZWQiLDEpO2cuaXNNZW51VmlzaWJsZT0xfSxyZW5kZXJNZW51OmZ1bmN0aW9uKCl7dmFyIGY9dGhpcyxlO2U9Zi5zZXR0aW5ncy5jb250cm9sX21hbmFnZXIuY3JlYXRlRHJvcE1lbnUoZi5pZCsiX21lbnUiLHttZW51X2xpbmU6MSwiY2xhc3MiOnRoaXMuY2xhc3NQcmVmaXgrIk1lbnUiLGljb25zOmYuc2V0dGluZ3MuaWNvbnN9KTtlLm9uSGlkZU1lbnUuYWRkKGYuaGlkZU1lbnUsZik7Zi5vblJlbmRlck1lbnUuZGlzcGF0Y2goZixlKTtmLm1lbnU9ZX0saGlkZU1lbnU6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcztpZihnJiZnLnR5cGU9PSJtb3VzZWRvd24iJiZiLmdldFBhcmVudChnLnRhcmdldCxmdW5jdGlvbihoKXtyZXR1cm4gaC5pZD09PWYuaWR8fGguaWQ9PT1mLmlkKyJfb3BlbiJ9KSl7cmV0dXJufWlmKCFnfHwhYi5nZXRQYXJlbnQoZy50YXJnZXQsIi5tY2VNZW51Iikpe2Yuc2V0U3RhdGUoIlNlbGVjdGVkIiwwKTthLnJlbW92ZShiLmRvYywibW91c2Vkb3duIixmLmhpZGVNZW51LGYpO2lmKGYubWVudSl7Zi5tZW51LmhpZGVNZW51KCl9fWYuaXNNZW51VmlzaWJsZT0wfSxwb3N0UmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxmPWUuc2V0dGluZ3M7YS5hZGQoZS5pZCwiY2xpY2siLGZ1bmN0aW9uKCl7aWYoIWUuaXNEaXNhYmxlZCgpKXtpZihmLm9uY2xpY2spe2Yub25jbGljayhlLnZhbHVlKX1lLnNob3dNZW51KCl9fSl9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYyl7dmFyIGI9Yy5ET00sYT1jLmRvbS5FdmVudCxkPWMuZWFjaDtjLmNyZWF0ZSgidGlueW1jZS51aS5TcGxpdEJ1dHRvbjp0aW55bWNlLnVpLk1lbnVCdXR0b24iLHtTcGxpdEJ1dHRvbjpmdW5jdGlvbihmLGUpe3RoaXMucGFyZW50KGYsZSk7dGhpcy5jbGFzc1ByZWZpeD0ibWNlU3BsaXRCdXR0b24ifSxyZW5kZXJIVE1MOmZ1bmN0aW9uKCl7dmFyIGksZj10aGlzLGc9Zi5zZXR0aW5ncyxlO2k9Ijx0Ym9keT48dHI+IjtpZihnLmltYWdlKXtlPWIuY3JlYXRlSFRNTCgiaW1nICIse3NyYzpnLmltYWdlLCJjbGFzcyI6Im1jZUFjdGlvbiAiK2dbImNsYXNzIl19KX1lbHNle2U9Yi5jcmVhdGVIVE1MKCJzcGFuIix7ImNsYXNzIjoibWNlQWN0aW9uICIrZ1siY2xhc3MiXX0sIiIpfWkrPSI8dGQ+IitiLmNyZWF0ZUhUTUwoImEiLHtpZDpmLmlkKyJfYWN0aW9uIixocmVmOiJqYXZhc2NyaXB0OjsiLCJjbGFzcyI6Im1jZUFjdGlvbiAiK2dbImNsYXNzIl0sb25jbGljazoicmV0dXJuIGZhbHNlOyIsb25tb3VzZWRvd246InJldHVybiBmYWxzZTsiLHRpdGxlOmcudGl0bGV9LGUpKyI8L3RkPiI7ZT1iLmNyZWF0ZUhUTUwoInNwYW4iLHsiY2xhc3MiOiJtY2VPcGVuICIrZ1siY2xhc3MiXX0pO2krPSI8dGQ+IitiLmNyZWF0ZUhUTUwoImEiLHtpZDpmLmlkKyJfb3BlbiIsaHJlZjoiamF2YXNjcmlwdDo7IiwiY2xhc3MiOiJtY2VPcGVuICIrZ1siY2xhc3MiXSxvbmNsaWNrOiJyZXR1cm4gZmFsc2U7Iixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyIsdGl0bGU6Zy50aXRsZX0sZSkrIjwvdGQ+IjtpKz0iPC90cj48L3Rib2R5PiI7cmV0dXJuIGIuY3JlYXRlSFRNTCgidGFibGUiLHtpZDpmLmlkLCJjbGFzcyI6Im1jZVNwbGl0QnV0dG9uIG1jZVNwbGl0QnV0dG9uRW5hYmxlZCAiK2dbImNsYXNzIl0sY2VsbHBhZGRpbmc6IjAiLGNlbGxzcGFjaW5nOiIwIixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyIsdGl0bGU6Zy50aXRsZX0saSl9LHBvc3RSZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGY9ZS5zZXR0aW5ncztpZihmLm9uY2xpY2spe2EuYWRkKGUuaWQrIl9hY3Rpb24iLCJjbGljayIsZnVuY3Rpb24oKXtpZighZS5pc0Rpc2FibGVkKCkpe2Yub25jbGljayhlLnZhbHVlKX19KX1hLmFkZChlLmlkKyJfb3BlbiIsImNsaWNrIixlLnNob3dNZW51LGUpO2EuYWRkKGUuaWQrIl9vcGVuIiwiZm9jdXMiLGZ1bmN0aW9uKCl7ZS5fZm9jdXNlZD0xfSk7YS5hZGQoZS5pZCsiX29wZW4iLCJibHVyIixmdW5jdGlvbigpe2UuX2ZvY3VzZWQ9MH0pO2lmKGMuaXNJRTZ8fCFiLmJveE1vZGVsKXthLmFkZChlLmlkLCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7aWYoIWIuaGFzQ2xhc3MoZS5pZCwibWNlU3BsaXRCdXR0b25EaXNhYmxlZCIpKXtiLmFkZENsYXNzKGUuaWQsIm1jZVNwbGl0QnV0dG9uSG92ZXIiKX19KTthLmFkZChlLmlkLCJtb3VzZW91dCIsZnVuY3Rpb24oKXtpZighYi5oYXNDbGFzcyhlLmlkLCJtY2VTcGxpdEJ1dHRvbkRpc2FibGVkIikpe2IucmVtb3ZlQ2xhc3MoZS5pZCwibWNlU3BsaXRCdXR0b25Ib3ZlciIpfX0pfX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMucGFyZW50KCk7YS5jbGVhcih0aGlzLmlkKyJfYWN0aW9uIik7YS5jbGVhcih0aGlzLmlkKyJfb3BlbiIpfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGQpe3ZhciBjPWQuRE9NLGE9ZC5kb20uRXZlbnQsYj1kLmlzLGU9ZC5lYWNoO2QuY3JlYXRlKCJ0aW55bWNlLnVpLkNvbG9yU3BsaXRCdXR0b246dGlueW1jZS51aS5TcGxpdEJ1dHRvbiIse0NvbG9yU3BsaXRCdXR0b246ZnVuY3Rpb24oaCxnKXt2YXIgZj10aGlzO2YucGFyZW50KGgsZyk7Zi5zZXR0aW5ncz1nPWQuZXh0ZW5kKHtjb2xvcnM6IjAwMDAwMCw5OTMzMDAsMzMzMzAwLDAwMzMwMCwwMDMzNjYsMDAwMDgwLDMzMzM5OSwzMzMzMzMsODAwMDAwLEZGNjYwMCw4MDgwMDAsMDA4MDAwLDAwODA4MCwwMDAwRkYsNjY2Njk5LDgwODA4MCxGRjAwMDAsRkY5OTAwLDk5Q0MwMCwzMzk5NjYsMzNDQ0NDLDMzNjZGRiw4MDAwODAsOTk5OTk5LEZGMDBGRixGRkNDMDAsRkZGRjAwLDAwRkYwMCwwMEZGRkYsMDBDQ0ZGLDk5MzM2NixDMEMwQzAsRkY5OUNDLEZGQ0M5OSxGRkZGOTksQ0NGRkNDLENDRkZGRiw5OUNDRkYsQ0M5OUZGLEZGRkZGRiIsZ3JpZF93aWR0aDo4LGRlZmF1bHRfY29sb3I6IiM4ODg4ODgifSxmLnNldHRpbmdzKTtmLm9uU2hvd01lbnU9bmV3IGQudXRpbC5EaXNwYXRjaGVyKGYpO2Yub25IaWRlTWVudT1uZXcgZC51dGlsLkRpc3BhdGNoZXIoZik7Zi52YWx1ZT1nLmRlZmF1bHRfY29sb3J9LHNob3dNZW51OmZ1bmN0aW9uKCl7dmFyIGY9dGhpcyxnLGosaSxoO2lmKGYuaXNEaXNhYmxlZCgpKXtyZXR1cm59aWYoIWYuaXNNZW51UmVuZGVyZWQpe2YucmVuZGVyTWVudSgpO2YuaXNNZW51UmVuZGVyZWQ9dHJ1ZX1pZihmLmlzTWVudVZpc2libGUpe3JldHVybiBmLmhpZGVNZW51KCl9aT1jLmdldChmLmlkKTtjLnNob3coZi5pZCsiX21lbnUiKTtjLmFkZENsYXNzKGksIm1jZVNwbGl0QnV0dG9uU2VsZWN0ZWQiKTtoPWMuZ2V0UG9zKGkpO2Muc2V0U3R5bGVzKGYuaWQrIl9tZW51Iix7bGVmdDpoLngsdG9wOmgueStpLmNsaWVudEhlaWdodCx6SW5kZXg6MjAwMDAwfSk7aT0wO2EuYWRkKGMuZG9jLCJtb3VzZWRvd24iLGYuaGlkZU1lbnUsZik7Zi5vblNob3dNZW51LmRpc3BhdGNoKGYpO2lmKGYuX2ZvY3VzZWQpe2YuX2tleUhhbmRsZXI9YS5hZGQoZi5pZCsiX21lbnUiLCJrZXlkb3duIixmdW5jdGlvbihrKXtpZihrLmtleUNvZGU9PTI3KXtmLmhpZGVNZW51KCl9fSk7Yy5zZWxlY3QoImEiLGYuaWQrIl9tZW51IilbMF0uZm9jdXMoKX1mLmlzTWVudVZpc2libGU9MX0saGlkZU1lbnU6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcztpZihnJiZnLnR5cGU9PSJtb3VzZWRvd24iJiZjLmdldFBhcmVudChnLnRhcmdldCxmdW5jdGlvbihoKXtyZXR1cm4gaC5pZD09PWYuaWQrIl9vcGVuIn0pKXtyZXR1cm59aWYoIWd8fCFjLmdldFBhcmVudChnLnRhcmdldCwiLm1jZVNwbGl0QnV0dG9uTWVudSIpKXtjLnJlbW92ZUNsYXNzKGYuaWQsIm1jZVNwbGl0QnV0dG9uU2VsZWN0ZWQiKTthLnJlbW92ZShjLmRvYywibW91c2Vkb3duIixmLmhpZGVNZW51LGYpO2EucmVtb3ZlKGYuaWQrIl9tZW51Iiwia2V5ZG93biIsZi5fa2V5SGFuZGxlcik7Yy5oaWRlKGYuaWQrIl9tZW51Iil9Zi5vbkhpZGVNZW51LmRpc3BhdGNoKGYpO2YuaXNNZW51VmlzaWJsZT0wfSxyZW5kZXJNZW51OmZ1bmN0aW9uKCl7dmFyIGs9dGhpcyxmLGo9MCxsPWsuc2V0dGluZ3MscCxoLG8sZztnPWMuYWRkKGwubWVudV9jb250YWluZXIsImRpdiIse2lkOmsuaWQrIl9tZW51IiwiY2xhc3MiOmwubWVudV9jbGFzcysiICIrbFsiY2xhc3MiXSxzdHlsZToicG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDotMTAwMHB4OyJ9KTtmPWMuYWRkKGcsImRpdiIseyJjbGFzcyI6bFsiY2xhc3MiXSsiIG1jZVNwbGl0QnV0dG9uTWVudSJ9KTtjLmFkZChmLCJzcGFuIix7ImNsYXNzIjoibWNlTWVudUxpbmUifSk7cD1jLmFkZChmLCJ0YWJsZSIseyJjbGFzcyI6Im1jZUNvbG9yU3BsaXRNZW51In0pO2g9Yy5hZGQocCwidGJvZHkiKTtqPTA7ZShiKGwuY29sb3JzLCJhcnJheSIpP2wuY29sb3JzOmwuY29sb3JzLnNwbGl0KCIsIiksZnVuY3Rpb24oaSl7aT1pLnJlcGxhY2UoL14jLywiIik7aWYoIWotLSl7bz1jLmFkZChoLCJ0ciIpO2o9bC5ncmlkX3dpZHRoLTF9cD1jLmFkZChvLCJ0ZCIpO3A9Yy5hZGQocCwiYSIse2hyZWY6ImphdmFzY3JpcHQ6OyIsc3R5bGU6e2JhY2tncm91bmRDb2xvcjoiIyIraX0sX21jZV9jb2xvcjoiIyIraX0pfSk7aWYobC5tb3JlX2NvbG9yc19mdW5jKXtwPWMuYWRkKGgsInRyIik7cD1jLmFkZChwLCJ0ZCIse2NvbHNwYW46bC5ncmlkX3dpZHRoLCJjbGFzcyI6Im1jZU1vcmVDb2xvcnMifSk7cD1jLmFkZChwLCJhIix7aWQ6ay5pZCsiX21vcmUiLGhyZWY6ImphdmFzY3JpcHQ6OyIsb25jbGljazoicmV0dXJuIGZhbHNlOyIsImNsYXNzIjoibWNlTW9yZUNvbG9ycyJ9LGwubW9yZV9jb2xvcnNfdGl0bGUpO2EuYWRkKHAsImNsaWNrIixmdW5jdGlvbihpKXtsLm1vcmVfY29sb3JzX2Z1bmMuY2FsbChsLm1vcmVfY29sb3JzX3Njb3BlfHx0aGlzKTtyZXR1cm4gYS5jYW5jZWwoaSl9KX1jLmFkZENsYXNzKGYsIm1jZUNvbG9yU3BsaXRNZW51Iik7YS5hZGQoay5pZCsiX21lbnUiLCJjbGljayIsZnVuY3Rpb24oaSl7dmFyIG07aT1pLnRhcmdldDtpZihpLm5vZGVOYW1lPT0iQSImJihtPWkuZ2V0QXR0cmlidXRlKCJfbWNlX2NvbG9yIikpKXtrLnNldENvbG9yKG0pfXJldHVybiBhLmNhbmNlbChpKX0pO3JldHVybiBnfSxzZXRDb2xvcjpmdW5jdGlvbihnKXt2YXIgZj10aGlzO2Muc2V0U3R5bGUoZi5pZCsiX3ByZXZpZXciLCJiYWNrZ3JvdW5kQ29sb3IiLGcpO2YudmFsdWU9ZztmLmhpZGVNZW51KCk7Zi5zZXR0aW5ncy5vbnNlbGVjdChnKX0scG9zdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBmPXRoaXMsZz1mLmlkO2YucGFyZW50KCk7Yy5hZGQoZysiX2FjdGlvbiIsImRpdiIse2lkOmcrIl9wcmV2aWV3IiwiY2xhc3MiOiJtY2VDb2xvclByZXZpZXcifSk7Yy5zZXRTdHlsZShmLmlkKyJfcHJldmlldyIsImJhY2tncm91bmRDb2xvciIsZi52YWx1ZSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnBhcmVudCgpO2EuY2xlYXIodGhpcy5pZCsiX21lbnUiKTthLmNsZWFyKHRoaXMuaWQrIl9tb3JlIik7Yy5yZW1vdmUodGhpcy5pZCsiX21lbnUiKX19KX0pKHRpbnltY2UpO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnVpLlRvb2xiYXI6dGlueW1jZS51aS5Db250YWluZXIiLHtyZW5kZXJIVE1MOmZ1bmN0aW9uKCl7dmFyIGw9dGhpcyxlPSIiLGcsaixiPXRpbnltY2UuRE9NLG09bC5zZXR0aW5ncyxkLGEsZixrO2s9bC5jb250cm9scztmb3IoZD0wO2Q8ay5sZW5ndGg7ZCsrKXtqPWtbZF07YT1rW2QtMV07Zj1rW2QrMV07aWYoZD09PTApe2c9Im1jZVRvb2xiYXJTdGFydCI7aWYoai5CdXR0b24pe2crPSIgbWNlVG9vbGJhclN0YXJ0QnV0dG9uIn1lbHNle2lmKGouU3BsaXRCdXR0b24pe2crPSIgbWNlVG9vbGJhclN0YXJ0U3BsaXRCdXR0b24ifWVsc2V7aWYoai5MaXN0Qm94KXtnKz0iIG1jZVRvb2xiYXJTdGFydExpc3RCb3gifX19ZSs9Yi5jcmVhdGVIVE1MKCJ0ZCIseyJjbGFzcyI6Z30sYi5jcmVhdGVIVE1MKCJzcGFuIixudWxsLCI8IS0tIElFIC0tPiIpKX1pZihhJiZqLkxpc3RCb3gpe2lmKGEuQnV0dG9ufHxhLlNwbGl0QnV0dG9uKXtlKz1iLmNyZWF0ZUhUTUwoInRkIix7ImNsYXNzIjoibWNlVG9vbGJhckVuZCJ9LGIuY3JlYXRlSFRNTCgic3BhbiIsbnVsbCwiPCEtLSBJRSAtLT4iKSl9fWlmKGIuc3RkTW9kZSl7ZSs9Jzx0ZCBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlIj4nK2oucmVuZGVySFRNTCgpKyI8L3RkPiJ9ZWxzZXtlKz0iPHRkPiIrai5yZW5kZXJIVE1MKCkrIjwvdGQ+In1pZihmJiZqLkxpc3RCb3gpe2lmKGYuQnV0dG9ufHxmLlNwbGl0QnV0dG9uKXtlKz1iLmNyZWF0ZUhUTUwoInRkIix7ImNsYXNzIjoibWNlVG9vbGJhclN0YXJ0In0sYi5jcmVhdGVIVE1MKCJzcGFuIixudWxsLCI8IS0tIElFIC0tPiIpKX19fWc9Im1jZVRvb2xiYXJFbmQiO2lmKGouQnV0dG9uKXtnKz0iIG1jZVRvb2xiYXJFbmRCdXR0b24ifWVsc2V7aWYoai5TcGxpdEJ1dHRvbil7Zys9IiBtY2VUb29sYmFyRW5kU3BsaXRCdXR0b24ifWVsc2V7aWYoai5MaXN0Qm94KXtnKz0iIG1jZVRvb2xiYXJFbmRMaXN0Qm94In19fWUrPWIuY3JlYXRlSFRNTCgidGQiLHsiY2xhc3MiOmd9LGIuY3JlYXRlSFRNTCgic3BhbiIsbnVsbCwiPCEtLSBJRSAtLT4iKSk7cmV0dXJuIGIuY3JlYXRlSFRNTCgidGFibGUiLHtpZDpsLmlkLCJjbGFzcyI6Im1jZVRvb2xiYXIiKyhtWyJjbGFzcyJdPyIgIittWyJjbGFzcyJdOiIiKSxjZWxscGFkZGluZzoiMCIsY2VsbHNwYWNpbmc6IjAiLGFsaWduOmwuc2V0dGluZ3MuYWxpZ258fCIifSwiPHRib2R5Pjx0cj4iK2UrIjwvdHI+PC90Ym9keT4iKX19KTsoZnVuY3Rpb24oYil7dmFyIGE9Yi51dGlsLkRpc3BhdGNoZXIsYz1iLmVhY2g7Yi5jcmVhdGUoInRpbnltY2UuQWRkT25NYW5hZ2VyIix7QWRkT25NYW5hZ2VyOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcztkLml0ZW1zPVtdO2QudXJscz17fTtkLmxvb2t1cD17fTtkLm9uQWRkPW5ldyBhKGQpfSxnZXQ6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMubG9va3VwW2RdfSxyZXF1aXJlTGFuZ1BhY2s6ZnVuY3Rpb24oZSl7dmFyIGQ9Yi5zZXR0aW5ncztpZihkJiZkLmxhbmd1YWdlKXtiLlNjcmlwdExvYWRlci5hZGQodGhpcy51cmxzW2VdKyIvbGFuZ3MvIitkLmxhbmd1YWdlKyIuanMiKX19LGFkZDpmdW5jdGlvbihlLGQpe3RoaXMuaXRlbXMucHVzaChkKTt0aGlzLmxvb2t1cFtlXT1kO3RoaXMub25BZGQuZGlzcGF0Y2godGhpcyxlLGQpO3JldHVybiBkfSxsb2FkOmZ1bmN0aW9uKGgsZSxkLGcpe3ZhciBmPXRoaXM7aWYoZi51cmxzW2hdKXtyZXR1cm59aWYoZS5pbmRleE9mKCIvIikhPTAmJmUuaW5kZXhPZigiOi8vIik9PS0xKXtlPWIuYmFzZVVSTCsiLyIrZX1mLnVybHNbaF09ZS5zdWJzdHJpbmcoMCxlLmxhc3RJbmRleE9mKCIvIikpO2lmKCFmLmxvb2t1cFtoXSl7Yi5TY3JpcHRMb2FkZXIuYWRkKGUsZCxnKX19fSk7Yi5QbHVnaW5NYW5hZ2VyPW5ldyBiLkFkZE9uTWFuYWdlcigpO2IuVGhlbWVNYW5hZ2VyPW5ldyBiLkFkZE9uTWFuYWdlcigpfSh0aW55bWNlKSk7KGZ1bmN0aW9uKGope3ZhciBnPWouZWFjaCxkPWouZXh0ZW5kLGs9ai5ET00saT1qLmRvbS5FdmVudCxmPWouVGhlbWVNYW5hZ2VyLGI9ai5QbHVnaW5NYW5hZ2VyLGU9ai5leHBsb2RlLGg9ai51dGlsLkRpc3BhdGNoZXIsYSxjPTA7ai5kb2N1bWVudEJhc2VVUkw9d2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgvW1w/I10uKiQvLCIiKS5yZXBsYWNlKC9bXC9cXF1bXlwvXSskLywiIik7aWYoIS9bXC9cXF0kLy50ZXN0KGouZG9jdW1lbnRCYXNlVVJMKSl7ai5kb2N1bWVudEJhc2VVUkwrPSIvIn1qLmJhc2VVUkw9bmV3IGoudXRpbC5VUkkoai5kb2N1bWVudEJhc2VVUkwpLnRvQWJzb2x1dGUoai5iYXNlVVJMKTtqLmJhc2VVUkk9bmV3IGoudXRpbC5VUkkoai5iYXNlVVJMKTtqLm9uQmVmb3JlVW5sb2FkPW5ldyBoKGopO2kuYWRkKHdpbmRvdywiYmVmb3JldW5sb2FkIixmdW5jdGlvbihsKXtqLm9uQmVmb3JlVW5sb2FkLmRpc3BhdGNoKGosbCl9KTtqLm9uQWRkRWRpdG9yPW5ldyBoKGopO2oub25SZW1vdmVFZGl0b3I9bmV3IGgoaik7ai5FZGl0b3JNYW5hZ2VyPWQoaix7ZWRpdG9yczpbXSxpMThuOnt9LGFjdGl2ZUVkaXRvcjpudWxsLGluaXQ6ZnVuY3Rpb24ocSl7dmFyIG49dGhpcyxwLGw9ai5TY3JpcHRMb2FkZXIsdSxvPVtdLG07ZnVuY3Rpb24gcih4LHksdCl7dmFyIHY9eFt5XTtpZighdil7cmV0dXJufWlmKGouaXModiwic3RyaW5nIikpe3Q9di5yZXBsYWNlKC9cLlx3KyQvLCIiKTt0PXQ/ai5yZXNvbHZlKHQpOjA7dj1qLnJlc29sdmUodil9cmV0dXJuIHYuYXBwbHkodHx8dGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfXE9ZCh7dGhlbWU6InNpbXBsZSIsbGFuZ3VhZ2U6ImVuIn0scSk7bi5zZXR0aW5ncz1xO2kuYWRkKGRvY3VtZW50LCJpbml0IixmdW5jdGlvbigpe3ZhciBzLHY7cihxLCJvbnBhZ2Vsb2FkIik7c3dpdGNoKHEubW9kZSl7Y2FzZSJleGFjdCI6cz1xLmVsZW1lbnRzfHwiIjtpZihzLmxlbmd0aD4wKXtnKGUocyksZnVuY3Rpb24oeCl7aWYoay5nZXQoeCkpe209bmV3IGouRWRpdG9yKHgscSk7by5wdXNoKG0pO20ucmVuZGVyKDEpfWVsc2V7Zyhkb2N1bWVudC5mb3JtcyxmdW5jdGlvbih5KXtnKHkuZWxlbWVudHMsZnVuY3Rpb24oeil7aWYoei5uYW1lPT09eCl7eD0ibWNlX2VkaXRvcl8iK2MrKztrLnNldEF0dHJpYih6LCJpZCIseCk7bT1uZXcgai5FZGl0b3IoeCxxKTtvLnB1c2gobSk7bS5yZW5kZXIoMSl9fSl9KX19KX1icmVhaztjYXNlInRleHRhcmVhcyI6Y2FzZSJzcGVjaWZpY190ZXh0YXJlYXMiOmZ1bmN0aW9uIHQoeSx4KXtyZXR1cm4geC5jb25zdHJ1Y3Rvcj09PVJlZ0V4cD94LnRlc3QoeS5jbGFzc05hbWUpOmsuaGFzQ2xhc3MoeSx4KX1nKGsuc2VsZWN0KCJ0ZXh0YXJlYSIpLGZ1bmN0aW9uKHgpe2lmKHEuZWRpdG9yX2Rlc2VsZWN0b3ImJnQoeCxxLmVkaXRvcl9kZXNlbGVjdG9yKSl7cmV0dXJufWlmKCFxLmVkaXRvcl9zZWxlY3Rvcnx8dCh4LHEuZWRpdG9yX3NlbGVjdG9yKSl7dT1rLmdldCh4Lm5hbWUpO2lmKCF4LmlkJiYhdSl7eC5pZD14Lm5hbWV9aWYoIXguaWR8fG4uZ2V0KHguaWQpKXt4LmlkPWsudW5pcXVlSWQoKX1tPW5ldyBqLkVkaXRvcih4LmlkLHEpO28ucHVzaChtKTttLnJlbmRlcigxKX19KTticmVha31pZihxLm9uaW5pdCl7cz12PTA7ZyhvLGZ1bmN0aW9uKHgpe3YrKztpZigheC5pbml0aWFsaXplZCl7eC5vbkluaXQuYWRkKGZ1bmN0aW9uKCl7cysrO2lmKHM9PXYpe3IocSwib25pbml0Iil9fSl9ZWxzZXtzKyt9aWYocz09dil7cihxLCJvbmluaXQiKX19KX19KX0sZ2V0OmZ1bmN0aW9uKGwpe2lmKGw9PT1hKXtyZXR1cm4gdGhpcy5lZGl0b3JzfXJldHVybiB0aGlzLmVkaXRvcnNbbF19LGdldEluc3RhbmNlQnlJZDpmdW5jdGlvbihsKXtyZXR1cm4gdGhpcy5nZXQobCl9LGFkZDpmdW5jdGlvbihtKXt2YXIgbD10aGlzLG49bC5lZGl0b3JzO25bbS5pZF09bTtuLnB1c2gobSk7bC5fc2V0QWN0aXZlKG0pO2wub25BZGRFZGl0b3IuZGlzcGF0Y2gobCxtKTtpZihqLmFkYXB0ZXIpe2ouYWRhcHRlci5wYXRjaEVkaXRvcihtKX1yZXR1cm4gbX0scmVtb3ZlOmZ1bmN0aW9uKG4pe3ZhciBtPXRoaXMsbCxvPW0uZWRpdG9ycztpZighb1tuLmlkXSl7cmV0dXJuIG51bGx9ZGVsZXRlIG9bbi5pZF07Zm9yKGw9MDtsPG8ubGVuZ3RoO2wrKyl7aWYob1tsXT09bil7by5zcGxpY2UobCwxKTticmVha319aWYobS5hY3RpdmVFZGl0b3I9PW4pe20uX3NldEFjdGl2ZShvWzBdKX1uLmRlc3Ryb3koKTttLm9uUmVtb3ZlRWRpdG9yLmRpc3BhdGNoKG0sbik7cmV0dXJuIG59LGV4ZWNDb21tYW5kOmZ1bmN0aW9uKHIscCxvKXt2YXIgcT10aGlzLG49cS5nZXQobyksbDtzd2l0Y2gocil7Y2FzZSJtY2VGb2N1cyI6bi5mb2N1cygpO3JldHVybiB0cnVlO2Nhc2UibWNlQWRkRWRpdG9yIjpjYXNlIm1jZUFkZENvbnRyb2wiOmlmKCFxLmdldChvKSl7bmV3IGouRWRpdG9yKG8scS5zZXR0aW5ncykucmVuZGVyKCl9cmV0dXJuIHRydWU7Y2FzZSJtY2VBZGRGcmFtZUNvbnRyb2wiOmw9by53aW5kb3c7bC50aW55TUNFPXRpbnlNQ0U7bC50aW55bWNlPWo7ai5ET00uZG9jPWwuZG9jdW1lbnQ7ai5ET00ud2luPWw7bj1uZXcgai5FZGl0b3Ioby5lbGVtZW50X2lkLG8pO24ucmVuZGVyKCk7aWYoai5pc0lFKXtmdW5jdGlvbiBtKCl7bi5kZXN0cm95KCk7bC5kZXRhY2hFdmVudCgib251bmxvYWQiLG0pO2w9bC50aW55TUNFPWwudGlueW1jZT1udWxsfWwuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixtKX1vLnBhZ2Vfd2luZG93PW51bGw7cmV0dXJuIHRydWU7Y2FzZSJtY2VSZW1vdmVFZGl0b3IiOmNhc2UibWNlUmVtb3ZlQ29udHJvbCI6aWYobil7bi5yZW1vdmUoKX1yZXR1cm4gdHJ1ZTtjYXNlIm1jZVRvZ2dsZUVkaXRvciI6aWYoIW4pe3EuZXhlY0NvbW1hbmQoIm1jZUFkZENvbnRyb2wiLDAsbyk7cmV0dXJuIHRydWV9aWYobi5pc0hpZGRlbigpKXtuLnNob3coKX1lbHNle24uaGlkZSgpfXJldHVybiB0cnVlfWlmKHEuYWN0aXZlRWRpdG9yKXtyZXR1cm4gcS5hY3RpdmVFZGl0b3IuZXhlY0NvbW1hbmQocixwLG8pfXJldHVybiBmYWxzZX0sZXhlY0luc3RhbmNlQ29tbWFuZDpmdW5jdGlvbihwLG8sbixtKXt2YXIgbD10aGlzLmdldChwKTtpZihsKXtyZXR1cm4gbC5leGVjQ29tbWFuZChvLG4sbSl9cmV0dXJuIGZhbHNlfSx0cmlnZ2VyU2F2ZTpmdW5jdGlvbigpe2codGhpcy5lZGl0b3JzLGZ1bmN0aW9uKGwpe2wuc2F2ZSgpfSl9LGFkZEkxOG46ZnVuY3Rpb24obixxKXt2YXIgbCxtPXRoaXMuaTE4bjtpZighai5pcyhuLCJzdHJpbmciKSl7ZyhuLGZ1bmN0aW9uKHIscCl7ZyhyLGZ1bmN0aW9uKHQscyl7Zyh0LGZ1bmN0aW9uKHYsdSl7aWYocz09PSJjb21tb24iKXttW3ArIi4iK3VdPXZ9ZWxzZXttW3ArIi4iK3MrIi4iK3VdPXZ9fSl9KX0pfWVsc2V7ZyhxLGZ1bmN0aW9uKHIscCl7bVtuKyIuIitwXT1yfSl9fSxfc2V0QWN0aXZlOmZ1bmN0aW9uKGwpe3RoaXMuc2VsZWN0ZWRJbnN0YW5jZT10aGlzLmFjdGl2ZUVkaXRvcj1sfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKG0pe3ZhciBuPW0uRE9NLGo9bS5kb20uRXZlbnQsZj1tLmV4dGVuZCxrPW0udXRpbC5EaXNwYXRjaGVyLGk9bS5lYWNoLGE9bS5pc0dlY2tvLGI9bS5pc0lFLGU9bS5pc1dlYktpdCxkPW0uaXMsaD1tLlRoZW1lTWFuYWdlcixjPW0uUGx1Z2luTWFuYWdlcixvPW0uaW5BcnJheSxsPW0uZ3JlcCxnPW0uZXhwbG9kZTttLmNyZWF0ZSgidGlueW1jZS5FZGl0b3IiLHtFZGl0b3I6ZnVuY3Rpb24ocixxKXt2YXIgcD10aGlzO3AuaWQ9cC5lZGl0b3JJZD1yO3AuZXhlY0NvbW1hbmRzPXt9O3AucXVlcnlTdGF0ZUNvbW1hbmRzPXt9O3AucXVlcnlWYWx1ZUNvbW1hbmRzPXt9O3AuaXNOb3REaXJ0eT1mYWxzZTtwLnBsdWdpbnM9e307aShbIm9uUHJlSW5pdCIsIm9uQmVmb3JlUmVuZGVyVUkiLCJvblBvc3RSZW5kZXIiLCJvbkluaXQiLCJvblJlbW92ZSIsIm9uQWN0aXZhdGUiLCJvbkRlYWN0aXZhdGUiLCJvbkNsaWNrIiwib25FdmVudCIsIm9uTW91c2VVcCIsIm9uTW91c2VEb3duIiwib25EYmxDbGljayIsIm9uS2V5RG93biIsIm9uS2V5VXAiLCJvbktleVByZXNzIiwib25Db250ZXh0TWVudSIsIm9uU3VibWl0Iiwib25SZXNldCIsIm9uUGFzdGUiLCJvblByZVByb2Nlc3MiLCJvblBvc3RQcm9jZXNzIiwib25CZWZvcmVTZXRDb250ZW50Iiwib25CZWZvcmVHZXRDb250ZW50Iiwib25TZXRDb250ZW50Iiwib25HZXRDb250ZW50Iiwib25Mb2FkQ29udGVudCIsIm9uU2F2ZUNvbnRlbnQiLCJvbk5vZGVDaGFuZ2UiLCJvbkNoYW5nZSIsIm9uQmVmb3JlRXhlY0NvbW1hbmQiLCJvbkV4ZWNDb21tYW5kIiwib25VbmRvIiwib25SZWRvIiwib25WaXN1YWxBaWQiLCJvblNldFByb2dyZXNzU3RhdGUiXSxmdW5jdGlvbihzKXtwW3NdPW5ldyBrKHApfSk7cC5zZXR0aW5ncz1xPWYoe2lkOnIsbGFuZ3VhZ2U6ImVuIixkb2NzX2xhbmd1YWdlOiJlbiIsdGhlbWU6InNpbXBsZSIsc2tpbjoiZGVmYXVsdCIsZGVsdGFfd2lkdGg6MCxkZWx0YV9oZWlnaHQ6MCxwb3B1cF9jc3M6IiIscGx1Z2luczoiIixkb2N1bWVudF9iYXNlX3VybDptLmRvY3VtZW50QmFzZVVSTCxhZGRfZm9ybV9zdWJtaXRfdHJpZ2dlcjoxLHN1Ym1pdF9wYXRjaDoxLGFkZF91bmxvYWRfdHJpZ2dlcjoxLGNvbnZlcnRfdXJsczoxLHJlbGF0aXZlX3VybHM6MSxyZW1vdmVfc2NyaXB0X2hvc3Q6MSx0YWJsZV9pbmxpbmVfZWRpdGluZzowLG9iamVjdF9yZXNpemluZzoxLGNsZWFudXA6MSxhY2Nlc3NpYmlsaXR5X2ZvY3VzOjEsY3VzdG9tX3Nob3J0Y3V0czoxLGN1c3RvbV91bmRvX3JlZG9fa2V5Ym9hcmRfc2hvcnRjdXRzOjEsY3VzdG9tX3VuZG9fcmVkb19yZXN0b3JlX3NlbGVjdGlvbjoxLGN1c3RvbV91bmRvX3JlZG86MSxkb2N0eXBlOm0uaXNJRTY/JzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPic6IjwhRE9DVFlQRT4iLHZpc3VhbF90YWJsZV9jbGFzczoibWNlSXRlbVRhYmxlIix2aXN1YWw6MSxmb250X3NpemVfc3R5bGVfdmFsdWVzOiJ4eC1zbWFsbCx4LXNtYWxsLHNtYWxsLG1lZGl1bSxsYXJnZSx4LWxhcmdlLHh4LWxhcmdlIixhcHBseV9zb3VyY2VfZm9ybWF0dGluZzoxLGRpcmVjdGlvbmFsaXR5OiJsdHIiLGZvcmNlZF9yb290X2Jsb2NrOiJwIix2YWxpZF9lbGVtZW50czoiQFtpZHxjbGFzc3xzdHlsZXx0aXRsZXxkaXI8bHRyP3J0bHxsYW5nfHhtbDo6bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25tb3VzZWRvd258b25tb3VzZXVwfG9ubW91c2VvdmVyfG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25rZXlwcmVzc3xvbmtleWRvd258b25rZXl1cF0sYVtyZWx8cmV2fGNoYXJzZXR8aHJlZmxhbmd8dGFiaW5kZXh8YWNjZXNza2V5fHR5cGV8bmFtZXxocmVmfHRhcmdldHx0aXRsZXxjbGFzc3xvbmZvY3VzfG9uYmx1cl0sc3Ryb25nL2IsZW0vaSxzdHJpa2UsdSwjcCwtb2xbdHlwZXxjb21wYWN0XSwtdWxbdHlwZXxjb21wYWN0XSwtbGksYnIsaW1nW2xvbmdkZXNjfHVzZW1hcHxzcmN8Ym9yZGVyfGFsdD18dGl0bGV8aHNwYWNlfHZzcGFjZXx3aWR0aHxoZWlnaHR8YWxpZ25dLC1zdWIsLXN1cCwtYmxvY2txdW90ZVtjaXRlXSwtdGFibGVbYm9yZGVyfGNlbGxzcGFjaW5nfGNlbGxwYWRkaW5nfHdpZHRofGZyYW1lfHJ1bGVzfGhlaWdodHxhbGlnbnxzdW1tYXJ5fGJnY29sb3J8YmFja2dyb3VuZHxib3JkZXJjb2xvcl0sLXRyW3Jvd3NwYW58d2lkdGh8aGVpZ2h0fGFsaWdufHZhbGlnbnxiZ2NvbG9yfGJhY2tncm91bmR8Ym9yZGVyY29sb3JdLHRib2R5LHRoZWFkLHRmb290LCN0ZFtjb2xzcGFufHJvd3NwYW58d2lkdGh8aGVpZ2h0fGFsaWdufHZhbGlnbnxiZ2NvbG9yfGJhY2tncm91bmR8Ym9yZGVyY29sb3J8c2NvcGVdLCN0aFtjb2xzcGFufHJvd3NwYW58d2lkdGh8aGVpZ2h0fGFsaWdufHZhbGlnbnxzY29wZV0sY2FwdGlvbiwtZGl2LC1zcGFuLC1jb2RlLC1wcmUsYWRkcmVzcywtaDEsLWgyLC1oMywtaDQsLWg1LC1oNixocltzaXplfG5vc2hhZGVdLC1mb250W2ZhY2V8c2l6ZXxjb2xvcl0sZGQsZGwsZHQsY2l0ZSxhYmJyLGFjcm9ueW0sZGVsW2RhdGV0aW1lfGNpdGVdLGluc1tkYXRldGltZXxjaXRlXSxvYmplY3RbY2xhc3NpZHx3aWR0aHxoZWlnaHR8Y29kZWJhc2V8Kl0scGFyYW1bbmFtZXx2YWx1ZV0sZW1iZWRbdHlwZXx3aWR0aHxoZWlnaHR8c3JjfCpdLHNjcmlwdFtzcmN8dHlwZV0sbWFwW25hbWVdLGFyZWFbc2hhcGV8Y29vcmRzfGhyZWZ8YWx0fHRhcmdldF0sYmRvLGJ1dHRvbixjb2xbYWxpZ258Y2hhcnxjaGFyb2ZmfHNwYW58dmFsaWdufHdpZHRoXSxjb2xncm91cFthbGlnbnxjaGFyfGNoYXJvZmZ8c3Bhbnx2YWxpZ258d2lkdGhdLGRmbixmaWVsZHNldCxmb3JtW2FjdGlvbnxhY2NlcHR8YWNjZXB0LWNoYXJzZXR8ZW5jdHlwZXxtZXRob2RdLGlucHV0W2FjY2VwdHxhbHR8Y2hlY2tlZHxkaXNhYmxlZHxtYXhsZW5ndGh8bmFtZXxyZWFkb25seXxzaXplfHNyY3x0eXBlfHZhbHVlfHRhYmluZGV4fGFjY2Vzc2tleV0sa2JkLGxhYmVsW2Zvcl0sbGVnZW5kLG5vc2NyaXB0LG9wdGdyb3VwW2xhYmVsfGRpc2FibGVkXSxvcHRpb25bZGlzYWJsZWR8bGFiZWx8c2VsZWN0ZWR8dmFsdWVdLHFbY2l0ZV0sc2FtcCxzZWxlY3RbZGlzYWJsZWR8bXVsdGlwbGV8bmFtZXxzaXplXSxzbWFsbCx0ZXh0YXJlYVtjb2xzfHJvd3N8ZGlzYWJsZWR8bmFtZXxyZWFkb25seV0sdHQsdmFyLGJpZyIsaGlkZGVuX2lucHV0OjEscGFkZF9lbXB0eV9lZGl0b3I6MSxyZW5kZXJfdWk6MSxpbml0X3RoZW1lOjEsZm9yY2VfcF9uZXdsaW5lczoxLGluZGVudGF0aW9uOiIzMHB4IixrZWVwX3N0eWxlczoxLGZpeF90YWJsZV9lbGVtZW50czoxLGlubGluZV9zdHlsZXM6MSxjb252ZXJ0X2ZvbnRzX3RvX3NwYW5zOnRydWV9LHEpO3AuZG9jdW1lbnRCYXNlVVJJPW5ldyBtLnV0aWwuVVJJKHEuZG9jdW1lbnRfYmFzZV91cmx8fG0uZG9jdW1lbnRCYXNlVVJMLHtiYXNlX3VyaTp0aW55TUNFLmJhc2VVUkl9KTtwLmJhc2VVUkk9bS5iYXNlVVJJO3AuZXhlY0NhbGxiYWNrKCJzZXR1cCIscCl9LHJlbmRlcjpmdW5jdGlvbihyKXt2YXIgdT10aGlzLHY9dS5zZXR0aW5ncyx4PXUuaWQscD1tLlNjcmlwdExvYWRlcjtpZighai5kb21Mb2FkZWQpe2ouYWRkKGRvY3VtZW50LCJpbml0IixmdW5jdGlvbigpe3UucmVuZGVyKCl9KTtyZXR1cm59dGlueU1DRS5zZXR0aW5ncz12O2lmKCF1LmdldEVsZW1lbnQoKSl7cmV0dXJufWlmKG0uaXNJRGV2aWNlKXtyZXR1cm59aWYoIS9URVhUQVJFQXxJTlBVVC9pLnRlc3QodS5nZXRFbGVtZW50KCkubm9kZU5hbWUpJiZ2LmhpZGRlbl9pbnB1dCYmbi5nZXRQYXJlbnQoeCwiZm9ybSIpKXtuLmluc2VydEFmdGVyKG4uY3JlYXRlKCJpbnB1dCIse3R5cGU6ImhpZGRlbiIsbmFtZTp4fSkseCl9aWYobS5XaW5kb3dNYW5hZ2VyKXt1LndpbmRvd01hbmFnZXI9bmV3IG0uV2luZG93TWFuYWdlcih1KX1pZih2LmVuY29kaW5nPT0ieG1sIil7dS5vbkdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKHMsdCl7aWYodC5zYXZlKXt0LmNvbnRlbnQ9bi5lbmNvZGUodC5jb250ZW50KX19KX1pZih2LmFkZF9mb3JtX3N1Ym1pdF90cmlnZ2VyKXt1Lm9uU3VibWl0LmFkZFRvVG9wKGZ1bmN0aW9uKCl7aWYodS5pbml0aWFsaXplZCl7dS5zYXZlKCk7dS5pc05vdERpcnR5PTF9fSl9aWYodi5hZGRfdW5sb2FkX3RyaWdnZXIpe3UuX2JlZm9yZVVubG9hZD10aW55TUNFLm9uQmVmb3JlVW5sb2FkLmFkZChmdW5jdGlvbigpe2lmKHUuaW5pdGlhbGl6ZWQmJiF1LmRlc3Ryb3llZCYmIXUuaXNIaWRkZW4oKSl7dS5zYXZlKHtmb3JtYXQ6InJhdyIsbm9fZXZlbnRzOnRydWV9KX19KX1tLmFkZFVubG9hZCh1LmRlc3Ryb3ksdSk7aWYodi5zdWJtaXRfcGF0Y2gpe3Uub25CZWZvcmVSZW5kZXJVSS5hZGQoZnVuY3Rpb24oKXt2YXIgcz11LmdldEVsZW1lbnQoKS5mb3JtO2lmKCFzKXtyZXR1cm59aWYocy5fbWNlT2xkU3VibWl0KXtyZXR1cm59aWYoIXMuc3VibWl0Lm5vZGVUeXBlJiYhcy5zdWJtaXQubGVuZ3RoKXt1LmZvcm1FbGVtZW50PXM7cy5fbWNlT2xkU3VibWl0PXMuc3VibWl0O3Muc3VibWl0PWZ1bmN0aW9uKCl7bS50cmlnZ2VyU2F2ZSgpO3UuaXNOb3REaXJ0eT0xO3JldHVybiB1LmZvcm1FbGVtZW50Ll9tY2VPbGRTdWJtaXQodS5mb3JtRWxlbWVudCl9fXM9bnVsbH0pfWZ1bmN0aW9uIHEoKXtpZih2Lmxhbmd1YWdlKXtwLmFkZChtLmJhc2VVUkwrIi9sYW5ncy8iK3YubGFuZ3VhZ2UrIi5qcyIpfWlmKHYudGhlbWUmJnYudGhlbWUuY2hhckF0KDApIT0iLSImJiFoLnVybHNbdi50aGVtZV0pe2gubG9hZCh2LnRoZW1lLCJ0aGVtZXMvIit2LnRoZW1lKyIvZWRpdG9yX3RlbXBsYXRlIittLnN1ZmZpeCsiLmpzIil9aShnKHYucGx1Z2lucyksZnVuY3Rpb24ocyl7aWYocyYmcy5jaGFyQXQoMCkhPSItIiYmIWMudXJsc1tzXSl7aWYocz09InNhZmFyaSIpe3JldHVybn1jLmxvYWQocywicGx1Z2lucy8iK3MrIi9lZGl0b3JfcGx1Z2luIittLnN1ZmZpeCsiLmpzIil9fSk7cC5sb2FkUXVldWUoZnVuY3Rpb24oKXtpZighdS5yZW1vdmVkKXt1LmluaXQoKX19KX1xKCl9LGluaXQ6ZnVuY3Rpb24oKXt2YXIgcixFPXRoaXMsRj1FLnNldHRpbmdzLEIseSxBPUUuZ2V0RWxlbWVudCgpLHEscCxDLHgseixEO20uYWRkKEUpO2lmKEYudGhlbWUpe0YudGhlbWU9Ri50aGVtZS5yZXBsYWNlKC8tLywiIik7cT1oLmdldChGLnRoZW1lKTtFLnRoZW1lPW5ldyBxKCk7aWYoRS50aGVtZS5pbml0JiZGLmluaXRfdGhlbWUpe0UudGhlbWUuaW5pdChFLGgudXJsc1tGLnRoZW1lXXx8bS5kb2N1bWVudEJhc2VVUkwucmVwbGFjZSgvXC8kLywiIikpfX1pKGcoRi5wbHVnaW5zLnJlcGxhY2UoL1wtL2csIiIpKSxmdW5jdGlvbihHKXt2YXIgSD1jLmdldChHKSx0PWMudXJsc1tHXXx8bS5kb2N1bWVudEJhc2VVUkwucmVwbGFjZSgvXC8kLywiIikscztpZihIKXtzPW5ldyBIKEUsdCk7RS5wbHVnaW5zW0ddPXM7aWYocy5pbml0KXtzLmluaXQoRSx0KX19fSk7aWYoRi5wb3B1cF9jc3MhPT1mYWxzZSl7aWYoRi5wb3B1cF9jc3Mpe0YucG9wdXBfY3NzPUUuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUoRi5wb3B1cF9jc3MpfWVsc2V7Ri5wb3B1cF9jc3M9RS5iYXNlVVJJLnRvQWJzb2x1dGUoInRoZW1lcy8iK0YudGhlbWUrIi9za2lucy8iK0Yuc2tpbisiL2RpYWxvZy5jc3MiKX19aWYoRi5wb3B1cF9jc3NfYWRkKXtGLnBvcHVwX2Nzcys9IiwiK0UuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUoRi5wb3B1cF9jc3NfYWRkKX1FLmNvbnRyb2xNYW5hZ2VyPW5ldyBtLkNvbnRyb2xNYW5hZ2VyKEUpO2lmKEYuY3VzdG9tX3VuZG9fcmVkbyl7RS5vbkJlZm9yZUV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbih0LEcsdSxILHMpe2lmKEchPSJVbmRvIiYmRyE9IlJlZG8iJiZHIT0ibWNlUmVwYWludCImJighc3x8IXMuc2tpcF91bmRvKSl7aWYoIUUudW5kb01hbmFnZXIuaGFzVW5kbygpKXtFLnVuZG9NYW5hZ2VyLmFkZCgpfX19KTtFLm9uRXhlY0NvbW1hbmQuYWRkKGZ1bmN0aW9uKHQsRyx1LEgscyl7aWYoRyE9IlVuZG8iJiZHIT0iUmVkbyImJkchPSJtY2VSZXBhaW50IiYmKCFzfHwhcy5za2lwX3VuZG8pKXtFLnVuZG9NYW5hZ2VyLmFkZCgpfX0pfUUub25FeGVjQ29tbWFuZC5hZGQoZnVuY3Rpb24ocyx0KXtpZighL14oRm9udE5hbWV8Rm9udFNpemUpJC8udGVzdCh0KSl7RS5ub2RlQ2hhbmdlZCgpfX0pO2lmKGEpe2Z1bmN0aW9uIHYocyx0KXtpZighdHx8IXQuaW5pdGlhbCl7RS5leGVjQ29tbWFuZCgibWNlUmVwYWludCIpfX1FLm9uVW5kby5hZGQodik7RS5vblJlZG8uYWRkKHYpO0Uub25TZXRDb250ZW50LmFkZCh2KX1FLm9uQmVmb3JlUmVuZGVyVUkuZGlzcGF0Y2goRSxFLmNvbnRyb2xNYW5hZ2VyKTtpZihGLnJlbmRlcl91aSl7Qj1GLndpZHRofHxBLnN0eWxlLndpZHRofHxBLm9mZnNldFdpZHRoO3k9Ri5oZWlnaHR8fEEuc3R5bGUuaGVpZ2h0fHxBLm9mZnNldEhlaWdodDtFLm9yZ0Rpc3BsYXk9QS5zdHlsZS5kaXNwbGF5O0Q9L15bMC05XC5dKyh8cHgpJC9pO2lmKEQudGVzdCgiIitCKSl7Qj1NYXRoLm1heChwYXJzZUludChCKSsocS5kZWx0YVdpZHRofHwwKSwxMDApfWlmKEQudGVzdCgiIit5KSl7eT1NYXRoLm1heChwYXJzZUludCh5KSsocS5kZWx0YUhlaWdodHx8MCksMTAwKX1xPUUudGhlbWUucmVuZGVyVUkoe3RhcmdldE5vZGU6QSx3aWR0aDpCLGhlaWdodDp5LGRlbHRhV2lkdGg6Ri5kZWx0YV93aWR0aCxkZWx0YUhlaWdodDpGLmRlbHRhX2hlaWdodH0pO0UuZWRpdG9yQ29udGFpbmVyPXEuZWRpdG9yQ29udGFpbmVyfWlmKGRvY3VtZW50LmRvbWFpbiYmbG9jYXRpb24uaG9zdG5hbWUhPWRvY3VtZW50LmRvbWFpbil7bS5yZWxheGVkRG9tYWluPWRvY3VtZW50LmRvbWFpbn1uLnNldFN0eWxlcyhxLnNpemVDb250YWluZXJ8fHEuZWRpdG9yQ29udGFpbmVyLHt3aWR0aDpCLGhlaWdodDp5fSk7eT0ocS5pZnJhbWVIZWlnaHR8fHkpKyh0eXBlb2YoeSk9PSJudW1iZXIiPyhxLmRlbHRhSGVpZ2h0fHwwKToiIik7aWYoeTwxMDApe3k9MTAwfUUuaWZyYW1lSFRNTD1GLmRvY3R5cGUrJzxodG1sPjxoZWFkIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4nO2lmKEYuZG9jdW1lbnRfYmFzZV91cmwhPW0uZG9jdW1lbnRCYXNlVVJMKXtFLmlmcmFtZUhUTUwrPSc8YmFzZSBocmVmPSInK0UuZG9jdW1lbnRCYXNlVVJJLmdldFVSSSgpKyciIC8+J31FLmlmcmFtZUhUTUwrPSc8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPTciIC8+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+JztpZihtLnJlbGF4ZWREb21haW4pe0UuaWZyYW1lSFRNTCs9JzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kb2N1bWVudC5kb21haW4gPSAiJyttLnJlbGF4ZWREb21haW4rJyI7PFwvc2NyaXB0Pid9eD1GLmJvZHlfaWR8fCJ0aW55bWNlIjtpZih4LmluZGV4T2YoIj0iKSE9LTEpe3g9RS5nZXRQYXJhbSgiYm9keV9pZCIsIiIsImhhc2giKTt4PXhbRS5pZF18fHh9ej1GLmJvZHlfY2xhc3N8fCIiO2lmKHouaW5kZXhPZigiPSIpIT0tMSl7ej1FLmdldFBhcmFtKCJib2R5X2NsYXNzIiwiIiwiaGFzaCIpO3o9eltFLmlkXXx8IiJ9RS5pZnJhbWVIVE1MKz0nPC9oZWFkPjxib2R5IGlkPSInK3grJyIgY2xhc3M9Im1jZUNvbnRlbnRCb2R5ICcreisnIj48L2JvZHk+PC9odG1sPic7aWYobS5yZWxheGVkRG9tYWluKXtpZihifHwobS5pc09wZXJhJiZwYXJzZUZsb2F0KG9wZXJhLnZlcnNpb24oKSk+PTkuNSkpe0M9J2phdmFzY3JpcHQ6KGZ1bmN0aW9uKCl7ZG9jdW1lbnQub3BlbigpO2RvY3VtZW50LmRvbWFpbj0iJytkb2N1bWVudC5kb21haW4rJyI7dmFyIGVkID0gd2luZG93LnBhcmVudC50aW55TUNFLmdldCgiJytFLmlkKyciKTtkb2N1bWVudC53cml0ZShlZC5pZnJhbWVIVE1MKTtkb2N1bWVudC5jbG9zZSgpO2VkLnNldHVwSWZyYW1lKCk7fSkoKSd9ZWxzZXtpZihtLmlzT3BlcmEpe0M9J2phdmFzY3JpcHQ6KGZ1bmN0aW9uKCl7ZG9jdW1lbnQub3BlbigpO2RvY3VtZW50LmRvbWFpbj0iJytkb2N1bWVudC5kb21haW4rJyI7ZG9jdW1lbnQuY2xvc2UoKTtlZC5zZXR1cElmcmFtZSgpO30pKCknfX19cj1uLmFkZChxLmlmcmFtZUNvbnRhaW5lciwiaWZyYW1lIix7aWQ6RS5pZCsiX2lmciIsc3JjOkN8fCdqYXZhc2NyaXB0OiIiJyxmcmFtZUJvcmRlcjoiMCIsc3R5bGU6e3dpZHRoOiIxMDAlIixoZWlnaHQ6eX19KTtFLmNvbnRlbnRBcmVhQ29udGFpbmVyPXEuaWZyYW1lQ29udGFpbmVyO24uZ2V0KHEuZWRpdG9yQ29udGFpbmVyKS5zdHlsZS5kaXNwbGF5PUUub3JnRGlzcGxheTtuLmdldChFLmlkKS5zdHlsZS5kaXNwbGF5PSJub25lIjtpZighYnx8IW0ucmVsYXhlZERvbWFpbil7RS5zZXR1cElmcmFtZSgpfUE9cj1xPW51bGx9LHNldHVwSWZyYW1lOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcyxBPXouc2V0dGluZ3Mscj1uLmdldCh6LmlkKSx1PXouZ2V0RG9jKCkscSx4O2lmKCFifHwhbS5yZWxheGVkRG9tYWluKXt1Lm9wZW4oKTt1LndyaXRlKHouaWZyYW1lSFRNTCk7dS5jbG9zZSgpfWlmKCFiKXt0cnl7aWYoIUEucmVhZG9ubHkpe3UuZGVzaWduTW9kZT0iT24ifX1jYXRjaCh2KXt9fWlmKGIpe3g9ei5nZXRCb2R5KCk7bi5oaWRlKHgpO2lmKCFBLnJlYWRvbmx5KXt4LmNvbnRlbnRFZGl0YWJsZT10cnVlfW4uc2hvdyh4KX16LmRvbT1uZXcgbS5kb20uRE9NVXRpbHMoei5nZXREb2MoKSx7a2VlcF92YWx1ZXM6dHJ1ZSx1cmxfY29udmVydGVyOnouY29udmVydFVSTCx1cmxfY29udmVydGVyX3Njb3BlOnosaGV4X2NvbG9yczpBLmZvcmNlX2hleF9zdHlsZV9jb2xvcnMsY2xhc3NfZmlsdGVyOkEuY2xhc3NfZmlsdGVyLHVwZGF0ZV9zdHlsZXM6MSxmaXhfaWVfcGFyYWdyYXBoczoxLHZhbGlkX3N0eWxlczpBLnZhbGlkX3N0eWxlc30pO3ouc2NoZW1hPW5ldyBtLmRvbS5TY2hlbWEoKTt6LnNlcmlhbGl6ZXI9bmV3IG0uZG9tLlNlcmlhbGl6ZXIoZihBLHt2YWxpZF9lbGVtZW50czpBLnZlcmlmeV9odG1sPT09ZmFsc2U/IipbKl0iOkEudmFsaWRfZWxlbWVudHMsZG9tOnouZG9tLHNjaGVtYTp6LnNjaGVtYX0pKTt6LnNlbGVjdGlvbj1uZXcgbS5kb20uU2VsZWN0aW9uKHouZG9tLHouZ2V0V2luKCksei5zZXJpYWxpemVyKTt6LmZvcm1hdHRlcj1uZXcgbS5Gb3JtYXR0ZXIodGhpcyk7ei5mb3JtYXR0ZXIucmVnaXN0ZXIoe2FsaWdubGVmdDpbe3NlbGVjdG9yOiJwLGgxLGgyLGgzLGg0LGg1LGg2LHRkLHRoLGRpdix1bCxvbCxsaSIsc3R5bGVzOnt0ZXh0QWxpZ246ImxlZnQifX0se3NlbGVjdG9yOiJpbWcsdGFibGUiLHN0eWxlczp7ImZsb2F0IjoibGVmdCJ9fV0sYWxpZ25jZW50ZXI6W3tzZWxlY3RvcjoicCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGkiLHN0eWxlczp7dGV4dEFsaWduOiJjZW50ZXIifX0se3NlbGVjdG9yOiJpbWciLHN0eWxlczp7ZGlzcGxheToiYmxvY2siLG1hcmdpbkxlZnQ6ImF1dG8iLG1hcmdpblJpZ2h0OiJhdXRvIn19LHtzZWxlY3RvcjoidGFibGUiLHN0eWxlczp7bWFyZ2luTGVmdDoiYXV0byIsbWFyZ2luUmlnaHQ6ImF1dG8ifX1dLGFsaWducmlnaHQ6W3tzZWxlY3RvcjoicCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGkiLHN0eWxlczp7dGV4dEFsaWduOiJyaWdodCJ9fSx7c2VsZWN0b3I6ImltZyx0YWJsZSIsc3R5bGVzOnsiZmxvYXQiOiJyaWdodCJ9fV0sYWxpZ25mdWxsOlt7c2VsZWN0b3I6InAsaDEsaDIsaDMsaDQsaDUsaDYsdGQsdGgsZGl2LHVsLG9sLGxpIixzdHlsZXM6e3RleHRBbGlnbjoianVzdGlmeSJ9fV0sYm9sZDpbe2lubGluZToic3Ryb25nIn0se2lubGluZToic3BhbiIsc3R5bGVzOntmb250V2VpZ2h0OiJib2xkIn19LHtpbmxpbmU6ImIifV0saXRhbGljOlt7aW5saW5lOiJlbSJ9LHtpbmxpbmU6InNwYW4iLHN0eWxlczp7Zm9udFN0eWxlOiJpdGFsaWMifX0se2lubGluZToiaSJ9XSx1bmRlcmxpbmU6W3tpbmxpbmU6InNwYW4iLHN0eWxlczp7dGV4dERlY29yYXRpb246InVuZGVybGluZSJ9LGV4YWN0OnRydWV9LHtpbmxpbmU6InUifV0sc3RyaWtldGhyb3VnaDpbe2lubGluZToic3BhbiIsc3R5bGVzOnt0ZXh0RGVjb3JhdGlvbjoibGluZS10aHJvdWdoIn0sZXhhY3Q6dHJ1ZX0se2lubGluZToidSJ9XSxmb3JlY29sb3I6e2lubGluZToic3BhbiIsc3R5bGVzOntjb2xvcjoiJXZhbHVlIn0sd3JhcF9saW5rczpmYWxzZX0saGlsaXRlY29sb3I6e2lubGluZToic3BhbiIsc3R5bGVzOntiYWNrZ3JvdW5kQ29sb3I6IiV2YWx1ZSJ9LHdyYXBfbGlua3M6ZmFsc2V9LGZvbnRuYW1lOntpbmxpbmU6InNwYW4iLHN0eWxlczp7Zm9udEZhbWlseToiJXZhbHVlIn19LGZvbnRzaXplOntpbmxpbmU6InNwYW4iLHN0eWxlczp7Zm9udFNpemU6IiV2YWx1ZSJ9fSxmb250c2l6ZV9jbGFzczp7aW5saW5lOiJzcGFuIixhdHRyaWJ1dGVzOnsiY2xhc3MiOiIldmFsdWUifX0sYmxvY2txdW90ZTp7YmxvY2s6ImJsb2NrcXVvdGUiLHdyYXBwZXI6MSxyZW1vdmU6ImFsbCJ9LHJlbW92ZWZvcm1hdDpbe3NlbGVjdG9yOiJiLHN0cm9uZyxlbSxpLGZvbnQsdSxzdHJpa2UiLHJlbW92ZToiYWxsIixzcGxpdDp0cnVlLGV4cGFuZDpmYWxzZSxibG9ja19leHBhbmQ6dHJ1ZSxkZWVwOnRydWV9LHtzZWxlY3Rvcjoic3BhbiIsYXR0cmlidXRlczpbInN0eWxlIiwiY2xhc3MiXSxyZW1vdmU6ImVtcHR5IixzcGxpdDp0cnVlLGV4cGFuZDpmYWxzZSxkZWVwOnRydWV9LHtzZWxlY3RvcjoiKiIsYXR0cmlidXRlczpbInN0eWxlIiwiY2xhc3MiXSxzcGxpdDpmYWxzZSxleHBhbmQ6ZmFsc2UsZGVlcDp0cnVlfV19KTtpKCJwIGgxIGgyIGgzIGg0IGg1IGg2IGRpdiBhZGRyZXNzIHByZSBkaXYgY29kZSBkdCBkZCBzYW1wIi5zcGxpdCgvXHMvKSxmdW5jdGlvbihzKXt6LmZvcm1hdHRlci5yZWdpc3RlcihzLHtibG9jazpzLHJlbW92ZToiYWxsIn0pfSk7ei5mb3JtYXR0ZXIucmVnaXN0ZXIoei5zZXR0aW5ncy5mb3JtYXRzKTt6LnVuZG9NYW5hZ2VyPW5ldyBtLlVuZG9NYW5hZ2VyKHopO3oudW5kb01hbmFnZXIub25BZGQuYWRkKGZ1bmN0aW9uKHQscyl7aWYoIXMuaW5pdGlhbCl7cmV0dXJuIHoub25DaGFuZ2UuZGlzcGF0Y2goeixzLHQpfX0pO3oudW5kb01hbmFnZXIub25VbmRvLmFkZChmdW5jdGlvbih0LHMpe3JldHVybiB6Lm9uVW5kby5kaXNwYXRjaCh6LHMsdCl9KTt6LnVuZG9NYW5hZ2VyLm9uUmVkby5hZGQoZnVuY3Rpb24odCxzKXtyZXR1cm4gei5vblJlZG8uZGlzcGF0Y2goeixzLHQpfSk7ei5mb3JjZUJsb2Nrcz1uZXcgbS5Gb3JjZUJsb2Nrcyh6LHtmb3JjZWRfcm9vdF9ibG9jazpBLmZvcmNlZF9yb290X2Jsb2NrfSk7ei5lZGl0b3JDb21tYW5kcz1uZXcgbS5FZGl0b3JDb21tYW5kcyh6KTt6LnNlcmlhbGl6ZXIub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe3JldHVybiB6Lm9uUHJlUHJvY2Vzcy5kaXNwYXRjaCh6LHQscyl9KTt6LnNlcmlhbGl6ZXIub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24ocyx0KXtyZXR1cm4gei5vblBvc3RQcm9jZXNzLmRpc3BhdGNoKHosdCxzKX0pO3oub25QcmVJbml0LmRpc3BhdGNoKHopO2lmKCFBLmdlY2tvX3NwZWxsY2hlY2spe3ouZ2V0Qm9keSgpLnNwZWxsY2hlY2s9MH1pZighQS5yZWFkb25seSl7ei5fYWRkRXZlbnRzKCl9ei5jb250cm9sTWFuYWdlci5vblBvc3RSZW5kZXIuZGlzcGF0Y2goeix6LmNvbnRyb2xNYW5hZ2VyKTt6Lm9uUG9zdFJlbmRlci5kaXNwYXRjaCh6KTtpZihBLmRpcmVjdGlvbmFsaXR5KXt6LmdldEJvZHkoKS5kaXI9QS5kaXJlY3Rpb25hbGl0eX1pZihBLm5vd3JhcCl7ei5nZXRCb2R5KCkuc3R5bGUud2hpdGVTcGFjZT0ibm93cmFwIn1pZihBLmN1c3RvbV9lbGVtZW50cyl7ZnVuY3Rpb24geShzLHQpe2koZyhBLmN1c3RvbV9lbGVtZW50cyksZnVuY3Rpb24oQil7dmFyIEM7aWYoQi5pbmRleE9mKCJ+Iik9PT0wKXtCPUIuc3Vic3RyaW5nKDEpO0M9InNwYW4ifWVsc2V7Qz0iZGl2In10LmNvbnRlbnQ9dC5jb250ZW50LnJlcGxhY2UobmV3IFJlZ0V4cCgiPCgiK0IrIikoW14+XSopPiIsImciKSwiPCIrQysnIF9tY2VfbmFtZT0iJDEiJDI+Jyk7dC5jb250ZW50PXQuY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAoIjwvKCIrQisiKT4iLCJnIiksIjwvIitDKyI+Iil9KX16Lm9uQmVmb3JlU2V0Q29udGVudC5hZGQoeSk7ei5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe2lmKHQuc2V0KXt5KHMsdCl9fSl9aWYoQS5oYW5kbGVfbm9kZV9jaGFuZ2VfY2FsbGJhY2spe3oub25Ob2RlQ2hhbmdlLmFkZChmdW5jdGlvbih0LHMsQil7ei5leGVjQ2FsbGJhY2soImhhbmRsZV9ub2RlX2NoYW5nZV9jYWxsYmFjayIsei5pZCxCLC0xLC0xLHRydWUsei5zZWxlY3Rpb24uaXNDb2xsYXBzZWQoKSl9KX1pZihBLnNhdmVfY2FsbGJhY2spe3oub25TYXZlQ29udGVudC5hZGQoZnVuY3Rpb24ocyxCKXt2YXIgdD16LmV4ZWNDYWxsYmFjaygic2F2ZV9jYWxsYmFjayIsei5pZCxCLmNvbnRlbnQsei5nZXRCb2R5KCkpO2lmKHQpe0IuY29udGVudD10fX0pfWlmKEEub25jaGFuZ2VfY2FsbGJhY2spe3oub25DaGFuZ2UuYWRkKGZ1bmN0aW9uKHQscyl7ei5leGVjQ2FsbGJhY2soIm9uY2hhbmdlX2NhbGxiYWNrIix6LHMpfSl9aWYoQS5jb252ZXJ0X25ld2xpbmVzX3RvX2Jycyl7ei5vbkJlZm9yZVNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKHMsdCl7aWYodC5pbml0aWFsKXt0LmNvbnRlbnQ9dC5jb250ZW50LnJlcGxhY2UoL1xyP1xuL2csIjxiciAvPiIpfX0pfWlmKEEuZml4X25lc3RpbmcmJmIpe3oub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihzLHQpe3QuY29udGVudD16Ll9maXhOZXN0aW5nKHQuY29udGVudCl9KX1pZihBLnByZWZvcm1hdHRlZCl7ei5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe3QuY29udGVudD10LmNvbnRlbnQucmVwbGFjZSgvXlxzKjxwcmUuKj8+LywiIik7dC5jb250ZW50PXQuY29udGVudC5yZXBsYWNlKC88XC9wcmU+XHMqJC8sIiIpO2lmKHQuc2V0KXt0LmNvbnRlbnQ9JzxwcmUgY2xhc3M9Im1jZUl0ZW1IaWRkZW4iPicrdC5jb250ZW50KyI8L3ByZT4ifX0pfWlmKEEudmVyaWZ5X2Nzc19jbGFzc2VzKXt6LnNlcmlhbGl6ZXIuYXR0cmliVmFsdWVGaWx0ZXI9ZnVuY3Rpb24oRCxCKXt2YXIgQyx0O2lmKEQ9PSJjbGFzcyIpe2lmKCF6LmNsYXNzZXNSRSl7dD16LmRvbS5nZXRDbGFzc2VzKCk7aWYodC5sZW5ndGg+MCl7Qz0iIjtpKHQsZnVuY3Rpb24ocyl7Qys9KEM/InwiOiIiKStzWyJjbGFzcyJdfSk7ei5jbGFzc2VzUkU9bmV3IFJlZ0V4cCgiKCIrQysiKSIsImdpIil9fXJldHVybiAhei5jbGFzc2VzUkV8fC8oXGJtY2VJdGVtXHcrXGJ8XGJtY2VUZW1wXHcrXGIpL2cudGVzdChCKXx8ei5jbGFzc2VzUkUudGVzdChCKT9COiIifXJldHVybiBCfX1pZihBLmNsZWFudXBfY2FsbGJhY2spe3oub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihzLHQpe3QuY29udGVudD16LmV4ZWNDYWxsYmFjaygiY2xlYW51cF9jYWxsYmFjayIsImluc2VydF90b19lZGl0b3IiLHQuY29udGVudCx0KX0pO3oub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe2lmKHQuc2V0KXt6LmV4ZWNDYWxsYmFjaygiY2xlYW51cF9jYWxsYmFjayIsImluc2VydF90b19lZGl0b3JfZG9tIix0Lm5vZGUsdCl9aWYodC5nZXQpe3ouZXhlY0NhbGxiYWNrKCJjbGVhbnVwX2NhbGxiYWNrIiwiZ2V0X2Zyb21fZWRpdG9yX2RvbSIsdC5ub2RlLHQpfX0pO3oub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24ocyx0KXtpZih0LnNldCl7dC5jb250ZW50PXouZXhlY0NhbGxiYWNrKCJjbGVhbnVwX2NhbGxiYWNrIiwiaW5zZXJ0X3RvX2VkaXRvciIsdC5jb250ZW50LHQpfWlmKHQuZ2V0KXt0LmNvbnRlbnQ9ei5leGVjQ2FsbGJhY2soImNsZWFudXBfY2FsbGJhY2siLCJnZXRfZnJvbV9lZGl0b3IiLHQuY29udGVudCx0KX19KX1pZihBLnNhdmVfY2FsbGJhY2spe3oub25HZXRDb250ZW50LmFkZChmdW5jdGlvbihzLHQpe2lmKHQuc2F2ZSl7dC5jb250ZW50PXouZXhlY0NhbGxiYWNrKCJzYXZlX2NhbGxiYWNrIix6LmlkLHQuY29udGVudCx6LmdldEJvZHkoKSl9fSl9aWYoQS5oYW5kbGVfZXZlbnRfY2FsbGJhY2spe3oub25FdmVudC5hZGQoZnVuY3Rpb24ocyx0LEIpe2lmKHouZXhlY0NhbGxiYWNrKCJoYW5kbGVfZXZlbnRfY2FsbGJhY2siLHQscyxCKT09PWZhbHNlKXtqLmNhbmNlbCh0KX19KX16Lm9uU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oKXt6LmFkZFZpc3VhbCh6LmdldEJvZHkoKSl9KTtpZihBLnBhZGRfZW1wdHlfZWRpdG9yKXt6Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKHMsdCl7dC5jb250ZW50PXQuY29udGVudC5yZXBsYWNlKC9eKDxwW14+XSo+KCZuYnNwO3wmIzE2MDt8XHN8XHUwMGEwfCk8XC9wPltcclxuXSp8PGJyIFwvPltcclxuXSopJC8sIiIpfSl9aWYoYSl7ZnVuY3Rpb24gcChzLHQpe2kocy5kb20uc2VsZWN0KCJhIiksZnVuY3Rpb24oQyl7dmFyIEI9Qy5wYXJlbnROb2RlO2lmKHMuZG9tLmlzQmxvY2soQikmJkIubGFzdENoaWxkPT09Qyl7cy5kb20uYWRkKEIsImJyIix7X21jZV9ib2d1czoxfSl9fSl9ei5vbkV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihzLHQpe2lmKHQ9PT0iQ3JlYXRlTGluayIpe3Aocyl9fSk7ei5vblNldENvbnRlbnQuYWRkKHouc2VsZWN0aW9uLm9uU2V0Q29udGVudC5hZGQocCkpO2lmKCFBLnJlYWRvbmx5KXt0cnl7dS5kZXNpZ25Nb2RlPSJPZmYiO3UuZGVzaWduTW9kZT0iT24ifWNhdGNoKHYpe319fXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZih6LnJlbW92ZWQpe3JldHVybn16LmxvYWQoe2luaXRpYWw6dHJ1ZSxmb3JtYXQ6KEEuY2xlYW51cF9vbl9zdGFydHVwPyJodG1sIjoicmF3Iil9KTt6LnN0YXJ0Q29udGVudD16LmdldENvbnRlbnQoe2Zvcm1hdDoicmF3In0pO3ouaW5pdGlhbGl6ZWQ9dHJ1ZTt6Lm9uSW5pdC5kaXNwYXRjaCh6KTt6LmV4ZWNDYWxsYmFjaygic2V0dXBjb250ZW50X2NhbGxiYWNrIix6LmlkLHouZ2V0Qm9keSgpLHouZ2V0RG9jKCkpO3ouZXhlY0NhbGxiYWNrKCJpbml0X2luc3RhbmNlX2NhbGxiYWNrIix6KTt6LmZvY3VzKHRydWUpO3oubm9kZUNoYW5nZWQoe2luaXRpYWw6MX0pO2lmKEEuY29udGVudF9jc3Mpe20uZWFjaChnKEEuY29udGVudF9jc3MpLGZ1bmN0aW9uKHMpe3ouZG9tLmxvYWRDU1Moei5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShzKSl9KX1pZihBLmF1dG9fZm9jdXMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgcz1tLmdldChBLmF1dG9fZm9jdXMpO3Muc2VsZWN0aW9uLnNlbGVjdChzLmdldEJvZHkoKSwxKTtzLnNlbGVjdGlvbi5jb2xsYXBzZSgxKTtzLmdldFdpbigpLmZvY3VzKCl9LDEwMCl9fSwxKTtyPW51bGx9LGZvY3VzOmZ1bmN0aW9uKHMpe3ZhciB4LHE9dGhpcyx2PXEuc2V0dGluZ3MuY29udGVudF9lZGl0YWJsZSxyLHAsdT1xLmdldERvYygpO2lmKCFzKXtyPXEuc2VsZWN0aW9uLmdldFJuZygpO2lmKHIuaXRlbSl7cD1yLml0ZW0oMCl9aWYoIXYpe3EuZ2V0V2luKCkuZm9jdXMoKX1pZihwJiZwLm93bmVyRG9jdW1lbnQ9PXUpe3I9dS5ib2R5LmNyZWF0ZUNvbnRyb2xSYW5nZSgpO3IuYWRkRWxlbWVudChwKTtyLnNlbGVjdCgpfX1pZihtLmFjdGl2ZUVkaXRvciE9cSl7aWYoKHg9bS5hY3RpdmVFZGl0b3IpIT1udWxsKXt4Lm9uRGVhY3RpdmF0ZS5kaXNwYXRjaCh4LHEpfXEub25BY3RpdmF0ZS5kaXNwYXRjaChxLHgpfW0uX3NldEFjdGl2ZShxKX0sZXhlY0NhbGxiYWNrOmZ1bmN0aW9uKHUpe3ZhciBwPXRoaXMscj1wLnNldHRpbmdzW3VdLHE7aWYoIXIpe3JldHVybn1pZihwLmNhbGxiYWNrTG9va3VwJiYocT1wLmNhbGxiYWNrTG9va3VwW3VdKSl7cj1xLmZ1bmM7cT1xLnNjb3BlfWlmKGQociwic3RyaW5nIikpe3E9ci5yZXBsYWNlKC9cLlx3KyQvLCIiKTtxPXE/bS5yZXNvbHZlKHEpOjA7cj1tLnJlc29sdmUocik7cC5jYWxsYmFja0xvb2t1cD1wLmNhbGxiYWNrTG9va3VwfHx7fTtwLmNhbGxiYWNrTG9va3VwW3VdPXtmdW5jOnIsc2NvcGU6cX19cmV0dXJuIHIuYXBwbHkocXx8cCxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24ocCl7dmFyIHI9dGhpcy5zZXR0aW5ncy5sYW5ndWFnZXx8ImVuIixxPW0uaTE4bjtpZighcCl7cmV0dXJuIiJ9cmV0dXJuIHFbcisiLiIrcF18fHAucmVwbGFjZSgve1wjKFtefV0rKVx9L2csZnVuY3Rpb24odCxzKXtyZXR1cm4gcVtyKyIuIitzXXx8InsjIitzKyJ9In0pfSxnZXRMYW5nOmZ1bmN0aW9uKHEscCl7cmV0dXJuIG0uaTE4blsodGhpcy5zZXR0aW5ncy5sYW5ndWFnZXx8ImVuIikrIi4iK3FdfHwoZChwKT9wOiJ7IyIrcSsifSIpfSxnZXRQYXJhbTpmdW5jdGlvbih1LHIscCl7dmFyIHM9bS50cmltLHE9ZCh0aGlzLnNldHRpbmdzW3VdKT90aGlzLnNldHRpbmdzW3VdOnIsdDtpZihwPT09Imhhc2giKXt0PXt9O2lmKGQocSwic3RyaW5nIikpe2kocS5pbmRleE9mKCI9Iik+MD9xLnNwbGl0KC9bOyxdKD8hW149OyxdKig/Ols7LF18JCkpLyk6cS5zcGxpdCgiLCIpLGZ1bmN0aW9uKHgpe3g9eC5zcGxpdCgiPSIpO2lmKHgubGVuZ3RoPjEpe3Rbcyh4WzBdKV09cyh4WzFdKX1lbHNle3Rbcyh4WzBdKV09cyh4KX19KX1lbHNle3Q9cX1yZXR1cm4gdH1yZXR1cm4gcX0sbm9kZUNoYW5nZWQ6ZnVuY3Rpb24ocil7dmFyIHA9dGhpcyxxPXAuc2VsZWN0aW9uLHU9KGI/cS5nZXROb2RlKCk6cS5nZXRTdGFydCgpKXx8cC5nZXRCb2R5KCk7aWYocC5pbml0aWFsaXplZCl7cj1yfHx7fTt1PWImJnUub3duZXJEb2N1bWVudCE9cC5nZXREb2MoKT9wLmdldEJvZHkoKTp1O3IucGFyZW50cz1bXTtwLmRvbS5nZXRQYXJlbnQodSxmdW5jdGlvbihzKXtpZihzLm5vZGVOYW1lPT0iQk9EWSIpe3JldHVybiB0cnVlfXIucGFyZW50cy5wdXNoKHMpfSk7cC5vbk5vZGVDaGFuZ2UuZGlzcGF0Y2gocCxyP3IuY29udHJvbE1hbmFnZXJ8fHAuY29udHJvbE1hbmFnZXI6cC5jb250cm9sTWFuYWdlcix1LHEuaXNDb2xsYXBzZWQoKSxyKX19LGFkZEJ1dHRvbjpmdW5jdGlvbihyLHEpe3ZhciBwPXRoaXM7cC5idXR0b25zPXAuYnV0dG9uc3x8e307cC5idXR0b25zW3JdPXF9LGFkZENvbW1hbmQ6ZnVuY3Rpb24ocixxLHApe3RoaXMuZXhlY0NvbW1hbmRzW3JdPXtmdW5jOnEsc2NvcGU6cHx8dGhpc319LGFkZFF1ZXJ5U3RhdGVIYW5kbGVyOmZ1bmN0aW9uKHIscSxwKXt0aGlzLnF1ZXJ5U3RhdGVDb21tYW5kc1tyXT17ZnVuYzpxLHNjb3BlOnB8fHRoaXN9fSxhZGRRdWVyeVZhbHVlSGFuZGxlcjpmdW5jdGlvbihyLHEscCl7dGhpcy5xdWVyeVZhbHVlQ29tbWFuZHNbcl09e2Z1bmM6cSxzY29wZTpwfHx0aGlzfX0sYWRkU2hvcnRjdXQ6ZnVuY3Rpb24ocix1LHAscyl7dmFyIHE9dGhpcyx2O2lmKCFxLnNldHRpbmdzLmN1c3RvbV9zaG9ydGN1dHMpe3JldHVybiBmYWxzZX1xLnNob3J0Y3V0cz1xLnNob3J0Y3V0c3x8e307aWYoZChwLCJzdHJpbmciKSl7dj1wO3A9ZnVuY3Rpb24oKXtxLmV4ZWNDb21tYW5kKHYsZmFsc2UsbnVsbCl9fWlmKGQocCwib2JqZWN0Iikpe3Y9cDtwPWZ1bmN0aW9uKCl7cS5leGVjQ29tbWFuZCh2WzBdLHZbMV0sdlsyXSl9fWkoZyhyKSxmdW5jdGlvbih0KXt2YXIgeD17ZnVuYzpwLHNjb3BlOnN8fHRoaXMsZGVzYzp1LGFsdDpmYWxzZSxjdHJsOmZhbHNlLHNoaWZ0OmZhbHNlfTtpKGcodCwiKyIpLGZ1bmN0aW9uKHkpe3N3aXRjaCh5KXtjYXNlImFsdCI6Y2FzZSJjdHJsIjpjYXNlInNoaWZ0Ijp4W3ldPXRydWU7YnJlYWs7ZGVmYXVsdDp4LmNoYXJDb2RlPXkuY2hhckNvZGVBdCgwKTt4LmtleUNvZGU9eS50b1VwcGVyQ2FzZSgpLmNoYXJDb2RlQXQoMCl9fSk7cS5zaG9ydGN1dHNbKHguY3RybD8iY3RybCI6IiIpKyIsIisoeC5hbHQ/ImFsdCI6IiIpKyIsIisoeC5zaGlmdD8ic2hpZnQiOiIiKSsiLCIreC5rZXlDb2RlXT14fSk7cmV0dXJuIHRydWV9LGV4ZWNDb21tYW5kOmZ1bmN0aW9uKHgsdix6LHApe3ZhciByPXRoaXMsdT0wLHkscTtpZighL14obWNlQWRkVW5kb0xldmVsfG1jZUVuZFVuZG9MZXZlbHxtY2VCZWdpblVuZG9MZXZlbHxtY2VSZXBhaW50fFNlbGVjdEFsbCkkLy50ZXN0KHgpJiYoIXB8fCFwLnNraXBfZm9jdXMpKXtyLmZvY3VzKCl9eT17fTtyLm9uQmVmb3JlRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseix5KTtpZih5LnRlcm1pbmF0ZSl7cmV0dXJuIGZhbHNlfWlmKHIuZXhlY0NhbGxiYWNrKCJleGVjY29tbWFuZF9jYWxsYmFjayIsci5pZCxyLnNlbGVjdGlvbi5nZXROb2RlKCkseCx2LHopKXtyLm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseixwKTtyZXR1cm4gdHJ1ZX1pZih5PXIuZXhlY0NvbW1hbmRzW3hdKXtxPXkuZnVuYy5jYWxsKHkuc2NvcGUsdix6KTtpZihxIT09dHJ1ZSl7ci5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHIseCx2LHoscCk7cmV0dXJuIHF9fWkoci5wbHVnaW5zLGZ1bmN0aW9uKHMpe2lmKHMuZXhlY0NvbW1hbmQmJnMuZXhlY0NvbW1hbmQoeCx2LHopKXtyLm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseixwKTt1PTE7cmV0dXJuIGZhbHNlfX0pO2lmKHUpe3JldHVybiB0cnVlfWlmKHIudGhlbWUmJnIudGhlbWUuZXhlY0NvbW1hbmQmJnIudGhlbWUuZXhlY0NvbW1hbmQoeCx2LHopKXtyLm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseixwKTtyZXR1cm4gdHJ1ZX1pZihtLkdsb2JhbENvbW1hbmRzLmV4ZWNDb21tYW5kKHIseCx2LHopKXtyLm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseixwKTtyZXR1cm4gdHJ1ZX1pZihyLmVkaXRvckNvbW1hbmRzLmV4ZWNDb21tYW5kKHgsdix6KSl7ci5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHIseCx2LHoscCk7cmV0dXJuIHRydWV9ci5nZXREb2MoKS5leGVjQ29tbWFuZCh4LHYseik7ci5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHIseCx2LHoscCl9LHF1ZXJ5Q29tbWFuZFN0YXRlOmZ1bmN0aW9uKHUpe3ZhciBxPXRoaXMsdixyO2lmKHEuX2lzSGlkZGVuKCkpe3JldHVybn1pZih2PXEucXVlcnlTdGF0ZUNvbW1hbmRzW3VdKXtyPXYuZnVuYy5jYWxsKHYuc2NvcGUpO2lmKHIhPT10cnVlKXtyZXR1cm4gcn19dj1xLmVkaXRvckNvbW1hbmRzLnF1ZXJ5Q29tbWFuZFN0YXRlKHUpO2lmKHYhPT0tMSl7cmV0dXJuIHZ9dHJ5e3JldHVybiB0aGlzLmdldERvYygpLnF1ZXJ5Q29tbWFuZFN0YXRlKHUpfWNhdGNoKHApe319LHF1ZXJ5Q29tbWFuZFZhbHVlOmZ1bmN0aW9uKHYpe3ZhciBxPXRoaXMsdSxyO2lmKHEuX2lzSGlkZGVuKCkpe3JldHVybn1pZih1PXEucXVlcnlWYWx1ZUNvbW1hbmRzW3ZdKXtyPXUuZnVuYy5jYWxsKHUuc2NvcGUpO2lmKHIhPT10cnVlKXtyZXR1cm4gcn19dT1xLmVkaXRvckNvbW1hbmRzLnF1ZXJ5Q29tbWFuZFZhbHVlKHYpO2lmKGQodSkpe3JldHVybiB1fXRyeXtyZXR1cm4gdGhpcy5nZXREb2MoKS5xdWVyeUNvbW1hbmRWYWx1ZSh2KX1jYXRjaChwKXt9fSxzaG93OmZ1bmN0aW9uKCl7dmFyIHA9dGhpcztuLnNob3cocC5nZXRDb250YWluZXIoKSk7bi5oaWRlKHAuaWQpO3AubG9hZCgpfSxoaWRlOmZ1bmN0aW9uKCl7dmFyIHA9dGhpcyxxPXAuZ2V0RG9jKCk7aWYoYiYmcSl7cS5leGVjQ29tbWFuZCgiU2VsZWN0QWxsIil9cC5zYXZlKCk7bi5oaWRlKHAuZ2V0Q29udGFpbmVyKCkpO24uc2V0U3R5bGUocC5pZCwiZGlzcGxheSIscC5vcmdEaXNwbGF5KX0saXNIaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4gIW4uaXNIaWRkZW4odGhpcy5pZCl9LHNldFByb2dyZXNzU3RhdGU6ZnVuY3Rpb24ocCxxLHIpe3RoaXMub25TZXRQcm9ncmVzc1N0YXRlLmRpc3BhdGNoKHRoaXMscCxxLHIpO3JldHVybiBwfSxsb2FkOmZ1bmN0aW9uKHMpe3ZhciBwPXRoaXMscj1wLmdldEVsZW1lbnQoKSxxO2lmKHIpe3M9c3x8e307cy5sb2FkPXRydWU7cT1wLnNldENvbnRlbnQoZChyLnZhbHVlKT9yLnZhbHVlOnIuaW5uZXJIVE1MLHMpO3MuZWxlbWVudD1yO2lmKCFzLm5vX2V2ZW50cyl7cC5vbkxvYWRDb250ZW50LmRpc3BhdGNoKHAscyl9cy5lbGVtZW50PXI9bnVsbDtyZXR1cm4gcX19LHNhdmU6ZnVuY3Rpb24odSl7dmFyIHA9dGhpcyxzPXAuZ2V0RWxlbWVudCgpLHEscjtpZighc3x8IXAuaW5pdGlhbGl6ZWQpe3JldHVybn11PXV8fHt9O3Uuc2F2ZT10cnVlO2lmKCF1Lm5vX2V2ZW50cyl7cC51bmRvTWFuYWdlci50eXBpbmc9MDtwLnVuZG9NYW5hZ2VyLmFkZCgpfXUuZWxlbWVudD1zO3E9dS5jb250ZW50PXAuZ2V0Q29udGVudCh1KTtpZighdS5ub19ldmVudHMpe3Aub25TYXZlQ29udGVudC5kaXNwYXRjaChwLHUpfXE9dS5jb250ZW50O2lmKCEvVEVYVEFSRUF8SU5QVVQvaS50ZXN0KHMubm9kZU5hbWUpKXtzLmlubmVySFRNTD1xO2lmKHI9bi5nZXRQYXJlbnQocC5pZCwiZm9ybSIpKXtpKHIuZWxlbWVudHMsZnVuY3Rpb24odCl7aWYodC5uYW1lPT1wLmlkKXt0LnZhbHVlPXE7cmV0dXJuIGZhbHNlfX0pfX1lbHNle3MudmFsdWU9cX11LmVsZW1lbnQ9cz1udWxsO3JldHVybiBxfSxzZXRDb250ZW50OmZ1bmN0aW9uKHEscil7dmFyIHA9dGhpcztyPXJ8fHt9O3IuZm9ybWF0PXIuZm9ybWF0fHwiaHRtbCI7ci5zZXQ9dHJ1ZTtyLmNvbnRlbnQ9cTtpZighci5ub19ldmVudHMpe3Aub25CZWZvcmVTZXRDb250ZW50LmRpc3BhdGNoKHAscil9aWYoIW0uaXNJRSYmKHEubGVuZ3RoPT09MHx8L15ccyskLy50ZXN0KHEpKSl7ci5jb250ZW50PXAuZG9tLnNldEhUTUwocC5nZXRCb2R5KCksJzxiciBfbWNlX2JvZ3VzPSIxIiAvPicpO3IuZm9ybWF0PSJyYXcifXIuY29udGVudD1wLmRvbS5zZXRIVE1MKHAuZ2V0Qm9keSgpLG0udHJpbShyLmNvbnRlbnQpKTtpZihyLmZvcm1hdCE9InJhdyImJnAuc2V0dGluZ3MuY2xlYW51cCl7ci5nZXRJbm5lcj10cnVlO3IuY29udGVudD1wLmRvbS5zZXRIVE1MKHAuZ2V0Qm9keSgpLHAuc2VyaWFsaXplci5zZXJpYWxpemUocC5nZXRCb2R5KCkscikpfWlmKCFyLm5vX2V2ZW50cyl7cC5vblNldENvbnRlbnQuZGlzcGF0Y2gocCxyKX1yZXR1cm4gci5jb250ZW50fSxnZXRDb250ZW50OmZ1bmN0aW9uKHIpe3ZhciBwPXRoaXMscTtyPXJ8fHt9O3IuZm9ybWF0PXIuZm9ybWF0fHwiaHRtbCI7ci5nZXQ9dHJ1ZTtpZighci5ub19ldmVudHMpe3Aub25CZWZvcmVHZXRDb250ZW50LmRpc3BhdGNoKHAscil9aWYoci5mb3JtYXQhPSJyYXciJiZwLnNldHRpbmdzLmNsZWFudXApe3IuZ2V0SW5uZXI9dHJ1ZTtxPXAuc2VyaWFsaXplci5zZXJpYWxpemUocC5nZXRCb2R5KCkscil9ZWxzZXtxPXAuZ2V0Qm9keSgpLmlubmVySFRNTH1xPXEucmVwbGFjZSgvXlxzKnxccyokL2csIiIpO3IuY29udGVudD1xO2lmKCFyLm5vX2V2ZW50cyl7cC5vbkdldENvbnRlbnQuZGlzcGF0Y2gocCxyKX1yZXR1cm4gci5jb250ZW50fSxpc0RpcnR5OmZ1bmN0aW9uKCl7dmFyIHA9dGhpcztyZXR1cm4gbS50cmltKHAuc3RhcnRDb250ZW50KSE9bS50cmltKHAuZ2V0Q29udGVudCh7Zm9ybWF0OiJyYXciLG5vX2V2ZW50czoxfSkpJiYhcC5pc05vdERpcnR5fSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXt2YXIgcD10aGlzO2lmKCFwLmNvbnRhaW5lcil7cC5jb250YWluZXI9bi5nZXQocC5lZGl0b3JDb250YWluZXJ8fHAuaWQrIl9wYXJlbnQiKX1yZXR1cm4gcC5jb250YWluZXJ9LGdldENvbnRlbnRBcmVhQ29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudEFyZWFDb250YWluZXJ9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5nZXQodGhpcy5zZXR0aW5ncy5jb250ZW50X2VsZW1lbnR8fHRoaXMuaWQpfSxnZXRXaW46ZnVuY3Rpb24oKXt2YXIgcD10aGlzLHE7aWYoIXAuY29udGVudFdpbmRvdyl7cT1uLmdldChwLmlkKyJfaWZyIik7aWYocSl7cC5jb250ZW50V2luZG93PXEuY29udGVudFdpbmRvd319cmV0dXJuIHAuY29udGVudFdpbmRvd30sZ2V0RG9jOmZ1bmN0aW9uKCl7dmFyIHE9dGhpcyxwO2lmKCFxLmNvbnRlbnREb2N1bWVudCl7cD1xLmdldFdpbigpO2lmKHApe3EuY29udGVudERvY3VtZW50PXAuZG9jdW1lbnR9fXJldHVybiBxLmNvbnRlbnREb2N1bWVudH0sZ2V0Qm9keTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvZHlFbGVtZW50fHx0aGlzLmdldERvYygpLmJvZHl9LGNvbnZlcnRVUkw6ZnVuY3Rpb24ocCx4LHYpe3ZhciBxPXRoaXMscj1xLnNldHRpbmdzO2lmKHIudXJsY29udmVydGVyX2NhbGxiYWNrKXtyZXR1cm4gcS5leGVjQ2FsbGJhY2soInVybGNvbnZlcnRlcl9jYWxsYmFjayIscCx2LHRydWUseCl9aWYoIXIuY29udmVydF91cmxzfHwodiYmdi5ub2RlTmFtZT09IkxJTksiKXx8cC5pbmRleE9mKCJmaWxlOiIpPT09MCl7cmV0dXJuIHB9aWYoci5yZWxhdGl2ZV91cmxzKXtyZXR1cm4gcS5kb2N1bWVudEJhc2VVUkkudG9SZWxhdGl2ZShwKX1wPXEuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUocCxyLnJlbW92ZV9zY3JpcHRfaG9zdCk7cmV0dXJuIHB9LGFkZFZpc3VhbDpmdW5jdGlvbihyKXt2YXIgcD10aGlzLHE9cC5zZXR0aW5ncztyPXJ8fHAuZ2V0Qm9keSgpO2lmKCFkKHAuaGFzVmlzdWFsKSl7cC5oYXNWaXN1YWw9cS52aXN1YWx9aShwLmRvbS5zZWxlY3QoInRhYmxlLGEiLHIpLGZ1bmN0aW9uKHQpe3ZhciBzO3N3aXRjaCh0Lm5vZGVOYW1lKXtjYXNlIlRBQkxFIjpzPXAuZG9tLmdldEF0dHJpYih0LCJib3JkZXIiKTtpZighc3x8cz09IjAiKXtpZihwLmhhc1Zpc3VhbCl7cC5kb20uYWRkQ2xhc3ModCxxLnZpc3VhbF90YWJsZV9jbGFzcyl9ZWxzZXtwLmRvbS5yZW1vdmVDbGFzcyh0LHEudmlzdWFsX3RhYmxlX2NsYXNzKX19cmV0dXJuO2Nhc2UiQSI6cz1wLmRvbS5nZXRBdHRyaWIodCwibmFtZSIpO2lmKHMpe2lmKHAuaGFzVmlzdWFsKXtwLmRvbS5hZGRDbGFzcyh0LCJtY2VJdGVtQW5jaG9yIil9ZWxzZXtwLmRvbS5yZW1vdmVDbGFzcyh0LCJtY2VJdGVtQW5jaG9yIil9fXJldHVybn19KTtwLm9uVmlzdWFsQWlkLmRpc3BhdGNoKHAscixwLmhhc1Zpc3VhbCl9LHJlbW92ZTpmdW5jdGlvbigpe3ZhciBwPXRoaXMscT1wLmdldENvbnRhaW5lcigpO3AucmVtb3ZlZD0xO3AuaGlkZSgpO3AuZXhlY0NhbGxiYWNrKCJyZW1vdmVfaW5zdGFuY2VfY2FsbGJhY2siLHApO3Aub25SZW1vdmUuZGlzcGF0Y2gocCk7cC5vbkV4ZWNDb21tYW5kLmxpc3RlbmVycz1bXTttLnJlbW92ZShwKTtuLnJlbW92ZShxKX0sZGVzdHJveTpmdW5jdGlvbihxKXt2YXIgcD10aGlzO2lmKHAuZGVzdHJveWVkKXtyZXR1cm59aWYoIXEpe20ucmVtb3ZlVW5sb2FkKHAuZGVzdHJveSk7dGlueU1DRS5vbkJlZm9yZVVubG9hZC5yZW1vdmUocC5fYmVmb3JlVW5sb2FkKTtpZihwLnRoZW1lJiZwLnRoZW1lLmRlc3Ryb3kpe3AudGhlbWUuZGVzdHJveSgpfXAuY29udHJvbE1hbmFnZXIuZGVzdHJveSgpO3Auc2VsZWN0aW9uLmRlc3Ryb3koKTtwLmRvbS5kZXN0cm95KCk7aWYoIXAuc2V0dGluZ3MuY29udGVudF9lZGl0YWJsZSl7ai5jbGVhcihwLmdldFdpbigpKTtqLmNsZWFyKHAuZ2V0RG9jKCkpfWouY2xlYXIocC5nZXRCb2R5KCkpO2ouY2xlYXIocC5mb3JtRWxlbWVudCl9aWYocC5mb3JtRWxlbWVudCl7cC5mb3JtRWxlbWVudC5zdWJtaXQ9cC5mb3JtRWxlbWVudC5fbWNlT2xkU3VibWl0O3AuZm9ybUVsZW1lbnQuX21jZU9sZFN1Ym1pdD1udWxsfXAuY29udGVudEFyZWFDb250YWluZXI9cC5mb3JtRWxlbWVudD1wLmNvbnRhaW5lcj1wLnNldHRpbmdzLmNvbnRlbnRfZWxlbWVudD1wLmJvZHlFbGVtZW50PXAuY29udGVudERvY3VtZW50PXAuY29udGVudFdpbmRvdz1udWxsO2lmKHAuc2VsZWN0aW9uKXtwLnNlbGVjdGlvbj1wLnNlbGVjdGlvbi53aW49cC5zZWxlY3Rpb24uZG9tPXAuc2VsZWN0aW9uLmRvbS5kb2M9bnVsbH1wLmRlc3Ryb3llZD0xfSxfYWRkRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcyxyLEE9ei5zZXR0aW5ncyxxPXouZG9tLHg9e21vdXNldXA6Im9uTW91c2VVcCIsbW91c2Vkb3duOiJvbk1vdXNlRG93biIsY2xpY2s6Im9uQ2xpY2siLGtleXVwOiJvbktleVVwIixrZXlkb3duOiJvbktleURvd24iLGtleXByZXNzOiJvbktleVByZXNzIixzdWJtaXQ6Im9uU3VibWl0IixyZXNldDoib25SZXNldCIsY29udGV4dG1lbnU6Im9uQ29udGV4dE1lbnUiLGRibGNsaWNrOiJvbkRibENsaWNrIixwYXN0ZToib25QYXN0ZSJ9O2Z1bmN0aW9uIHAodCxCKXt2YXIgcz10LnR5cGU7aWYoei5yZW1vdmVkKXtyZXR1cm59aWYoei5vbkV2ZW50LmRpc3BhdGNoKHosdCxCKSE9PWZhbHNlKXt6W3hbdC5mYWtlVHlwZXx8dC50eXBlXV0uZGlzcGF0Y2goeix0LEIpfX1pKHgsZnVuY3Rpb24odCxzKXtzd2l0Y2gocyl7Y2FzZSJjb250ZXh0bWVudSI6aWYobS5pc09wZXJhKXtxLmJpbmQoei5nZXRCb2R5KCksIm1vdXNlZG93biIsZnVuY3Rpb24oQil7aWYoQi5jdHJsS2V5KXtCLmZha2VUeXBlPSJjb250ZXh0bWVudSI7cChCKX19KX1lbHNle3EuYmluZCh6LmdldEJvZHkoKSxzLHApfWJyZWFrO2Nhc2UicGFzdGUiOnEuYmluZCh6LmdldEJvZHkoKSxzLGZ1bmN0aW9uKEIpe3AoQil9KTticmVhaztjYXNlInN1Ym1pdCI6Y2FzZSJyZXNldCI6cS5iaW5kKHouZ2V0RWxlbWVudCgpLmZvcm18fG4uZ2V0UGFyZW50KHouaWQsImZvcm0iKSxzLHApO2JyZWFrO2RlZmF1bHQ6cS5iaW5kKEEuY29udGVudF9lZGl0YWJsZT96LmdldEJvZHkoKTp6LmdldERvYygpLHMscCl9fSk7cS5iaW5kKEEuY29udGVudF9lZGl0YWJsZT96LmdldEJvZHkoKTooYT96LmdldERvYygpOnouZ2V0V2luKCkpLCJmb2N1cyIsZnVuY3Rpb24ocyl7ei5mb2N1cyh0cnVlKX0pO2lmKG0uaXNHZWNrbyl7cS5iaW5kKHouZ2V0RG9jKCksIkRPTU5vZGVJbnNlcnRlZCIsZnVuY3Rpb24odCl7dmFyIHM7dD10LnRhcmdldDtpZih0Lm5vZGVUeXBlPT09MSYmdC5ub2RlTmFtZT09PSJJTUciJiYocz10LmdldEF0dHJpYnV0ZSgiX21jZV9zcmMiKSkpe3Quc3JjPXouZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUocyl9fSl9aWYoYSl7ZnVuY3Rpb24gdSgpe3ZhciBDPXRoaXMsRT1DLmdldERvYygpLEQ9Qy5zZXR0aW5ncztpZihhJiYhRC5yZWFkb25seSl7aWYoQy5faXNIaWRkZW4oKSl7dHJ5e2lmKCFELmNvbnRlbnRfZWRpdGFibGUpe0UuZGVzaWduTW9kZT0iT24ifX1jYXRjaChCKXt9fXRyeXtFLmV4ZWNDb21tYW5kKCJzdHlsZVdpdGhDU1MiLDAsZmFsc2UpfWNhdGNoKEIpe2lmKCFDLl9pc0hpZGRlbigpKXt0cnl7RS5leGVjQ29tbWFuZCgidXNlQ1NTIiwwLHRydWUpfWNhdGNoKEIpe319fWlmKCFELnRhYmxlX2lubGluZV9lZGl0aW5nKXt0cnl7RS5leGVjQ29tbWFuZCgiZW5hYmxlSW5saW5lVGFibGVFZGl0aW5nIixmYWxzZSxmYWxzZSl9Y2F0Y2goQil7fX1pZighRC5vYmplY3RfcmVzaXppbmcpe3RyeXtFLmV4ZWNDb21tYW5kKCJlbmFibGVPYmplY3RSZXNpemluZyIsZmFsc2UsZmFsc2UpfWNhdGNoKEIpe319fX16Lm9uQmVmb3JlRXhlY0NvbW1hbmQuYWRkKHUpO3oub25Nb3VzZURvd24uYWRkKHUpfWlmKG0uaXNXZWJLaXQpe3oub25DbGljay5hZGQoZnVuY3Rpb24ocyx0KXt0PXQudGFyZ2V0O2lmKHQubm9kZU5hbWU9PSJJTUcifHwodC5ub2RlTmFtZT09IkEiJiZxLmhhc0NsYXNzKHQsIm1jZUl0ZW1BbmNob3IiKSkpe3ouc2VsZWN0aW9uLmdldFNlbCgpLnNldEJhc2VBbmRFeHRlbnQodCwwLHQsMSk7ei5ub2RlQ2hhbmdlZCgpfX0pfXoub25Nb3VzZVVwLmFkZCh6Lm5vZGVDaGFuZ2VkKTt6Lm9uS2V5VXAuYWRkKGZ1bmN0aW9uKHMsdCl7dmFyIEI9dC5rZXlDb2RlO2lmKChCPj0zMyYmQjw9MzYpfHwoQj49MzcmJkI8PTQwKXx8Qj09MTN8fEI9PTQ1fHxCPT00Nnx8Qj09OHx8KG0uaXNNYWMmJihCPT05MXx8Qj09OTMpKXx8dC5jdHJsS2V5KXt6Lm5vZGVDaGFuZ2VkKCl9fSk7ei5vblJlc2V0LmFkZChmdW5jdGlvbigpe3ouc2V0Q29udGVudCh6LnN0YXJ0Q29udGVudCx7Zm9ybWF0OiJyYXcifSl9KTtpZihBLmN1c3RvbV9zaG9ydGN1dHMpe2lmKEEuY3VzdG9tX3VuZG9fcmVkb19rZXlib2FyZF9zaG9ydGN1dHMpe3ouYWRkU2hvcnRjdXQoImN0cmwreiIsei5nZXRMYW5nKCJ1bmRvX2Rlc2MiKSwiVW5kbyIpO3ouYWRkU2hvcnRjdXQoImN0cmwreSIsei5nZXRMYW5nKCJyZWRvX2Rlc2MiKSwiUmVkbyIpfXouYWRkU2hvcnRjdXQoImN0cmwrYiIsei5nZXRMYW5nKCJib2xkX2Rlc2MiKSwiQm9sZCIpO3ouYWRkU2hvcnRjdXQoImN0cmwraSIsei5nZXRMYW5nKCJpdGFsaWNfZGVzYyIpLCJJdGFsaWMiKTt6LmFkZFNob3J0Y3V0KCJjdHJsK3UiLHouZ2V0TGFuZygidW5kZXJsaW5lX2Rlc2MiKSwiVW5kZXJsaW5lIik7Zm9yKHI9MTtyPD02O3IrKyl7ei5hZGRTaG9ydGN1dCgiY3RybCsiK3IsIiIsWyJGb3JtYXRCbG9jayIsZmFsc2UsImgiK3JdKX16LmFkZFNob3J0Y3V0KCJjdHJsKzciLCIiLFsiRm9ybWF0QmxvY2siLGZhbHNlLCI8cD4iXSk7ei5hZGRTaG9ydGN1dCgiY3RybCs4IiwiIixbIkZvcm1hdEJsb2NrIixmYWxzZSwiPGRpdj4iXSk7ei5hZGRTaG9ydGN1dCgiY3RybCs5IiwiIixbIkZvcm1hdEJsb2NrIixmYWxzZSwiPGFkZHJlc3M+Il0pO2Z1bmN0aW9uIHYodCl7dmFyIHM9bnVsbDtpZighdC5hbHRLZXkmJiF0LmN0cmxLZXkmJiF0Lm1ldGFLZXkpe3JldHVybiBzfWkoei5zaG9ydGN1dHMsZnVuY3Rpb24oQil7aWYobS5pc01hYyYmQi5jdHJsIT10Lm1ldGFLZXkpe3JldHVybn1lbHNle2lmKCFtLmlzTWFjJiZCLmN0cmwhPXQuY3RybEtleSl7cmV0dXJufX1pZihCLmFsdCE9dC5hbHRLZXkpe3JldHVybn1pZihCLnNoaWZ0IT10LnNoaWZ0S2V5KXtyZXR1cm59aWYodC5rZXlDb2RlPT1CLmtleUNvZGV8fCh0LmNoYXJDb2RlJiZ0LmNoYXJDb2RlPT1CLmNoYXJDb2RlKSl7cz1CO3JldHVybiBmYWxzZX19KTtyZXR1cm4gc316Lm9uS2V5VXAuYWRkKGZ1bmN0aW9uKHMsdCl7dmFyIEI9dih0KTtpZihCKXtyZXR1cm4gai5jYW5jZWwodCl9fSk7ei5vbktleVByZXNzLmFkZChmdW5jdGlvbihzLHQpe3ZhciBCPXYodCk7aWYoQil7cmV0dXJuIGouY2FuY2VsKHQpfX0pO3oub25LZXlEb3duLmFkZChmdW5jdGlvbihzLHQpe3ZhciBCPXYodCk7aWYoQil7Qi5mdW5jLmNhbGwoQi5zY29wZSk7cmV0dXJuIGouY2FuY2VsKHQpfX0pfWlmKG0uaXNJRSl7cS5iaW5kKHouZ2V0RG9jKCksImNvbnRyb2xzZWxlY3QiLGZ1bmN0aW9uKEIpe3ZhciB0PXoucmVzaXplSW5mbyxzO0I9Qi50YXJnZXQ7aWYoQi5ub2RlTmFtZSE9PSJJTUciKXtyZXR1cm59aWYodCl7cS51bmJpbmQodC5ub2RlLHQuZXYsdC5jYil9aWYoIXEuaGFzQ2xhc3MoQiwibWNlSXRlbU5vUmVzaXplIikpe2V2PSJyZXNpemVlbmQiO3M9cS5iaW5kKEIsZXYsZnVuY3Rpb24oRCl7dmFyIEM7RD1ELnRhcmdldDtpZihDPXEuZ2V0U3R5bGUoRCwid2lkdGgiKSl7cS5zZXRBdHRyaWIoRCwid2lkdGgiLEMucmVwbGFjZSgvW14wLTklXSsvZywiIikpO3Euc2V0U3R5bGUoRCwid2lkdGgiLCIiKX1pZihDPXEuZ2V0U3R5bGUoRCwiaGVpZ2h0Iikpe3Euc2V0QXR0cmliKEQsImhlaWdodCIsQy5yZXBsYWNlKC9bXjAtOSVdKy9nLCIiKSk7cS5zZXRTdHlsZShELCJoZWlnaHQiLCIiKX19KX1lbHNle2V2PSJyZXNpemVzdGFydCI7cz1xLmJpbmQoQiwicmVzaXplc3RhcnQiLGouY2FuY2VsLGopfXQ9ei5yZXNpemVJbmZvPXtub2RlOkIsZXY6ZXYsY2I6c319KTt6Lm9uS2V5RG93bi5hZGQoZnVuY3Rpb24ocyx0KXtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIDg6aWYoei5zZWxlY3Rpb24uZ2V0Um5nKCkuaXRlbSl7cy5kb20ucmVtb3ZlKHouc2VsZWN0aW9uLmdldFJuZygpLml0ZW0oMCkpO3JldHVybiBqLmNhbmNlbCh0KX19fSl9aWYobS5pc09wZXJhKXt6Lm9uQ2xpY2suYWRkKGZ1bmN0aW9uKHMsdCl7ai5wcmV2ZW50KHQpfSl9aWYoQS5jdXN0b21fdW5kb19yZWRvKXtmdW5jdGlvbiB5KCl7ei51bmRvTWFuYWdlci50eXBpbmc9MDt6LnVuZG9NYW5hZ2VyLmFkZCgpfXEuYmluZCh6LmdldERvYygpLCJmb2N1c291dCIsZnVuY3Rpb24ocyl7aWYoIXoucmVtb3ZlZCYmei51bmRvTWFuYWdlci50eXBpbmcpe3koKX19KTt6Lm9uS2V5VXAuYWRkKGZ1bmN0aW9uKHMsdCl7aWYoKHQua2V5Q29kZT49MzMmJnQua2V5Q29kZTw9MzYpfHwodC5rZXlDb2RlPj0zNyYmdC5rZXlDb2RlPD00MCl8fHQua2V5Q29kZT09MTN8fHQua2V5Q29kZT09NDV8fHQuY3RybEtleSl7eSgpfX0pO3oub25LZXlEb3duLmFkZChmdW5jdGlvbih0LEUpe3ZhciBzLEQsQztpZihiJiZFLmtleUNvZGU9PTQ2KXtzPXouc2VsZWN0aW9uLmdldFJuZygpO2lmKHMucGFyZW50RWxlbWVudCl7RD1zLnBhcmVudEVsZW1lbnQoKTtpZihFLmN0cmxLZXkpe3MubW92ZUVuZCgid29yZCIsMSk7cy5zZWxlY3QoKX16LnNlbGVjdGlvbi5nZXRTZWwoKS5jbGVhcigpO2lmKHMucGFyZW50RWxlbWVudCgpPT1EKXtDPXouc2VsZWN0aW9uLmdldEJvb2ttYXJrKCk7dHJ5e0QuaW5uZXJIVE1MPUQuaW5uZXJIVE1MfWNhdGNoKEIpe316LnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhDKX1FLnByZXZlbnREZWZhdWx0KCk7cmV0dXJufX1pZigoRS5rZXlDb2RlPj0zMyYmRS5rZXlDb2RlPD0zNil8fChFLmtleUNvZGU+PTM3JiZFLmtleUNvZGU8PTQwKXx8RS5rZXlDb2RlPT0xM3x8RS5rZXlDb2RlPT00NSl7aWYoei51bmRvTWFuYWdlci50eXBpbmcpe3koKX1yZXR1cm59aWYoIXoudW5kb01hbmFnZXIudHlwaW5nKXt6LnVuZG9NYW5hZ2VyLmFkZCgpO3oudW5kb01hbmFnZXIudHlwaW5nPTF9fSk7ei5vbk1vdXNlRG93bi5hZGQoZnVuY3Rpb24oKXtpZih6LnVuZG9NYW5hZ2VyLnR5cGluZyl7eSgpfX0pfX0sX2lzSGlkZGVuOmZ1bmN0aW9uKCl7dmFyIHA7aWYoIWEpe3JldHVybiAwfXA9dGhpcy5zZWxlY3Rpb24uZ2V0U2VsKCk7cmV0dXJuKCFwfHwhcC5yYW5nZUNvdW50fHxwLnJhbmdlQ291bnQ9PTApfSxfZml4TmVzdGluZzpmdW5jdGlvbihxKXt2YXIgcj1bXSxwO3E9cS5yZXBsYWNlKC88KFwvKT8oW15ccz5dKylbXj5dKj8+L2csZnVuY3Rpb24odCxzLHYpe3ZhciB1O2lmKHM9PT0iLyIpe2lmKCFyLmxlbmd0aCl7cmV0dXJuIiJ9aWYodiE9PXJbci5sZW5ndGgtMV0udGFnKXtmb3IocD1yLmxlbmd0aC0xO3A+PTA7cC0tKXtpZihyW3BdLnRhZz09PXYpe3JbcF0uY2xvc2U9MTticmVha319cmV0dXJuIiJ9ZWxzZXtyLnBvcCgpO2lmKHIubGVuZ3RoJiZyW3IubGVuZ3RoLTFdLmNsb3NlKXt0PXQrIjwvIityW3IubGVuZ3RoLTFdLnRhZysiPiI7ci5wb3AoKX19fWVsc2V7aWYoL14oYnJ8aHJ8aW5wdXR8bWV0YXxpbWd8bGlua3xwYXJhbSkkL2kudGVzdCh2KSl7cmV0dXJuIHR9aWYoL1wvPiQvLnRlc3QodCkpe3JldHVybiB0fXIucHVzaCh7dGFnOnZ9KX1yZXR1cm4gdH0pO2ZvcihwPXIubGVuZ3RoLTE7cD49MDtwLS0pe3ErPSI8LyIrcltwXS50YWcrIj4ifXJldHVybiBxfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGMpe3ZhciBkPWMuZWFjaCxlLGE9dHJ1ZSxiPWZhbHNlO2MuRWRpdG9yQ29tbWFuZHM9ZnVuY3Rpb24obil7dmFyIGw9bi5kb20scD1uLnNlbGVjdGlvbixqPXtzdGF0ZTp7fSxleGVjOnt9LHZhbHVlOnt9fSxrPW4uc2V0dGluZ3MsbztmdW5jdGlvbiBxKHkseCx2KXt2YXIgdTt5PXkudG9Mb3dlckNhc2UoKTtpZih1PWouZXhlY1t5XSl7dSh5LHgsdik7cmV0dXJuIGF9cmV0dXJuIGJ9ZnVuY3Rpb24gbSh2KXt2YXIgdTt2PXYudG9Mb3dlckNhc2UoKTtpZih1PWouc3RhdGVbdl0pe3JldHVybiB1KHYpfXJldHVybiAtMX1mdW5jdGlvbiBoKHYpe3ZhciB1O3Y9di50b0xvd2VyQ2FzZSgpO2lmKHU9ai52YWx1ZVt2XSl7cmV0dXJuIHUodil9cmV0dXJuIGJ9ZnVuY3Rpb24gdCh1LHYpe3Y9dnx8ImV4ZWMiO2QodSxmdW5jdGlvbih5LHgpe2QoeC50b0xvd2VyQ2FzZSgpLnNwbGl0KCIsIiksZnVuY3Rpb24oeil7alt2XVt6XT15fSl9KX1jLmV4dGVuZCh0aGlzLHtleGVjQ29tbWFuZDpxLHF1ZXJ5Q29tbWFuZFN0YXRlOm0scXVlcnlDb21tYW5kVmFsdWU6aCxhZGRDb21tYW5kczp0fSk7ZnVuY3Rpb24gZih4LHYsdSl7aWYodj09PWUpe3Y9Yn1pZih1PT09ZSl7dT1udWxsfXJldHVybiBuLmdldERvYygpLmV4ZWNDb21tYW5kKHgsdix1KX1mdW5jdGlvbiBzKHUpe3JldHVybiBuLmZvcm1hdHRlci5tYXRjaCh1KX1mdW5jdGlvbiByKHUsdil7bi5mb3JtYXR0ZXIudG9nZ2xlKHUsdj97dmFsdWU6dn06ZSl9ZnVuY3Rpb24gaSh1KXtvPXAuZ2V0Qm9va21hcmsodSl9ZnVuY3Rpb24gZygpe3AubW92ZVRvQm9va21hcmsobyl9dCh7Im1jZVJlc2V0RGVzaWduTW9kZSxtY2VCZWdpblVuZG9MZXZlbCI6ZnVuY3Rpb24oKXt9LCJtY2VFbmRVbmRvTGV2ZWwsbWNlQWRkVW5kb0xldmVsIjpmdW5jdGlvbigpe24udW5kb01hbmFnZXIuYWRkKCl9LCJDdXQsQ29weSxQYXN0ZSI6ZnVuY3Rpb24oeSl7dmFyIHg9bi5nZXREb2MoKSx1O3RyeXtmKHkpfWNhdGNoKHYpe3U9YX1pZih1fHwheC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQoeSkpe2lmKGMuaXNHZWNrbyl7bi53aW5kb3dNYW5hZ2VyLmNvbmZpcm0obi5nZXRMYW5nKCJjbGlwYm9hcmRfbXNnIiksZnVuY3Rpb24oeil7aWYoeil7b3BlbigiaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9lZGl0b3IvbWlkYXNkZW1vL3NlY3VyaXR5cHJlZnMuaHRtbCIsIl9ibGFuayIpfX0pfWVsc2V7bi53aW5kb3dNYW5hZ2VyLmFsZXJ0KG4uZ2V0TGFuZygiY2xpcGJvYXJkX25vX3N1cHBvcnQiKSl9fX0sdW5saW5rOmZ1bmN0aW9uKHUpe2lmKHAuaXNDb2xsYXBzZWQoKSl7cC5zZWxlY3QocC5nZXROb2RlKCkpfWYodSk7cC5jb2xsYXBzZShiKX0sIkp1c3RpZnlMZWZ0LEp1c3RpZnlDZW50ZXIsSnVzdGlmeVJpZ2h0LEp1c3RpZnlGdWxsIjpmdW5jdGlvbih1KXt2YXIgdj11LnN1YnN0cmluZyg3KTtkKCJsZWZ0LGNlbnRlcixyaWdodCxmdWxsIi5zcGxpdCgiLCIpLGZ1bmN0aW9uKHgpe2lmKHYhPXgpe24uZm9ybWF0dGVyLnJlbW92ZSgiYWxpZ24iK3gpfX0pO3IoImFsaWduIit2KX0sIkluc2VydFVub3JkZXJlZExpc3QsSW5zZXJ0T3JkZXJlZExpc3QiOmZ1bmN0aW9uKHgpe3ZhciB1LHY7Zih4KTt1PWwuZ2V0UGFyZW50KHAuZ2V0Tm9kZSgpLCJvbCx1bCIpO2lmKHUpe3Y9dS5wYXJlbnROb2RlO2lmKC9eKEhbMS02XXxQfEFERFJFU1N8UFJFKSQvLnRlc3Qodi5ub2RlTmFtZSkpe2koKTtsLnNwbGl0KHYsdSk7ZygpfX19LCJCb2xkLEl0YWxpYyxVbmRlcmxpbmUsU3RyaWtldGhyb3VnaCI6ZnVuY3Rpb24odSl7cih1KX0sIkZvcmVDb2xvcixIaWxpdGVDb2xvcixGb250TmFtZSI6ZnVuY3Rpb24oeCx2LHUpe3IoeCx1KX0sRm9udFNpemU6ZnVuY3Rpb24oeSx4LHYpe3ZhciB1LHo7aWYodj49MSYmdjw9Nyl7ej1jLmV4cGxvZGUoay5mb250X3NpemVfc3R5bGVfdmFsdWVzKTt1PWMuZXhwbG9kZShrLmZvbnRfc2l6ZV9jbGFzc2VzKTtpZih1KXt2PXVbdi0xXXx8dn1lbHNle3Y9elt2LTFdfHx2fX1yKHksdil9LFJlbW92ZUZvcm1hdDpmdW5jdGlvbih1KXtuLmZvcm1hdHRlci5yZW1vdmUodSl9LG1jZUJsb2NrUXVvdGU6ZnVuY3Rpb24odSl7cigiYmxvY2txdW90ZSIpfSxGb3JtYXRCbG9jazpmdW5jdGlvbih4LHYsdSl7cmV0dXJuIHIodXx8InAiKX0sbWNlQ2xlYW51cDpmdW5jdGlvbigpe3ZhciB1PXAuZ2V0Qm9va21hcmsoKTtuLnNldENvbnRlbnQobi5nZXRDb250ZW50KHtjbGVhbnVwOmF9KSx7Y2xlYW51cDphfSk7cC5tb3ZlVG9Cb29rbWFyayh1KX0sbWNlUmVtb3ZlTm9kZTpmdW5jdGlvbih5LHgsdil7dmFyIHU9dnx8cC5nZXROb2RlKCk7aWYodSE9bi5nZXRCb2R5KCkpe2koKTtuLmRvbS5yZW1vdmUodSxhKTtnKCl9fSxtY2VTZWxlY3ROb2RlRGVwdGg6ZnVuY3Rpb24oeSx4LHYpe3ZhciB1PTA7bC5nZXRQYXJlbnQocC5nZXROb2RlKCksZnVuY3Rpb24oeil7aWYoei5ub2RlVHlwZT09MSYmdSsrPT12KXtwLnNlbGVjdCh6KTtyZXR1cm4gYn19LG4uZ2V0Qm9keSgpKX0sbWNlU2VsZWN0Tm9kZTpmdW5jdGlvbih4LHYsdSl7cC5zZWxlY3QodSl9LG1jZUluc2VydENvbnRlbnQ6ZnVuY3Rpb24oeCx2LHUpe3Auc2V0Q29udGVudCh1KX0sbWNlSW5zZXJ0UmF3SFRNTDpmdW5jdGlvbih4LHYsdSl7cC5zZXRDb250ZW50KCJ0aW55X21jZV9tYXJrZXIiKTtuLnNldENvbnRlbnQobi5nZXRDb250ZW50KCkucmVwbGFjZSgvdGlueV9tY2VfbWFya2VyL2csZnVuY3Rpb24oKXtyZXR1cm4gdX0pKX0sbWNlU2V0Q29udGVudDpmdW5jdGlvbih4LHYsdSl7bi5zZXRDb250ZW50KHUpfSwiSW5kZW50LE91dGRlbnQiOmZ1bmN0aW9uKHkpe3ZhciB2LHUseDt2PWsuaW5kZW50YXRpb247dT0vW2EteiVdKyQvaS5leGVjKHYpO3Y9cGFyc2VJbnQodik7aWYoIW0oIkluc2VydFVub3JkZXJlZExpc3QiKSYmIW0oIkluc2VydE9yZGVyZWRMaXN0Iikpe2QocC5nZXRTZWxlY3RlZEJsb2NrcygpLGZ1bmN0aW9uKHope2lmKHk9PSJvdXRkZW50Iil7eD1NYXRoLm1heCgwLHBhcnNlSW50KHouc3R5bGUucGFkZGluZ0xlZnR8fDApLXYpO2wuc2V0U3R5bGUoeiwicGFkZGluZ0xlZnQiLHg/eCt1OiIiKX1lbHNle2wuc2V0U3R5bGUoeiwicGFkZGluZ0xlZnQiLChwYXJzZUludCh6LnN0eWxlLnBhZGRpbmdMZWZ0fHwwKSt2KSt1KX19KX1lbHNle2YoeSl9fSxtY2VSZXBhaW50OmZ1bmN0aW9uKCl7dmFyIHY7aWYoYy5pc0dlY2tvKXt0cnl7aShhKTtpZihwLmdldFNlbCgpKXtwLmdldFNlbCgpLnNlbGVjdEFsbENoaWxkcmVuKG4uZ2V0Qm9keSgpKX1wLmNvbGxhcHNlKGEpO2coKX1jYXRjaCh1KXt9fX0sbWNlVG9nZ2xlRm9ybWF0OmZ1bmN0aW9uKHgsdix1KXtuLmZvcm1hdHRlci50b2dnbGUodSl9LEluc2VydEhvcml6b250YWxSdWxlOmZ1bmN0aW9uKCl7cC5zZXRDb250ZW50KCI8aHIgLz4iKX0sbWNlVG9nZ2xlVmlzdWFsQWlkOmZ1bmN0aW9uKCl7bi5oYXNWaXN1YWw9IW4uaGFzVmlzdWFsO24uYWRkVmlzdWFsKCl9LG1jZVJlcGxhY2VDb250ZW50OmZ1bmN0aW9uKHgsdix1KXtwLnNldENvbnRlbnQodS5yZXBsYWNlKC9ce1wkc2VsZWN0aW9uXH0vZyxwLmdldENvbnRlbnQoe2Zvcm1hdDoidGV4dCJ9KSkpfSxtY2VJbnNlcnRMaW5rOmZ1bmN0aW9uKHkseCx2KXt2YXIgdT1sLmdldFBhcmVudChwLmdldE5vZGUoKSwiYSIpO2lmKGMuaXModiwic3RyaW5nIikpe3Y9e2hyZWY6dn19aWYoIXUpe2YoIkNyZWF0ZUxpbmsiLGIsImphdmFzY3JpcHQ6bWN0bXAoMCk7Iik7ZChsLnNlbGVjdCgiYVtocmVmPWphdmFzY3JpcHQ6bWN0bXAoMCk7XSIpLGZ1bmN0aW9uKHope2wuc2V0QXR0cmlicyh6LHYpfSl9ZWxzZXtpZih2LmhyZWYpe2wuc2V0QXR0cmlicyh1LHYpfWVsc2V7bi5kb20ucmVtb3ZlKHUsYSl9fX0sc2VsZWN0QWxsOmZ1bmN0aW9uKCl7dmFyIHY9bC5nZXRSb290KCksdT1sLmNyZWF0ZVJuZygpO3Uuc2V0U3RhcnQodiwwKTt1LnNldEVuZCh2LHYuY2hpbGROb2Rlcy5sZW5ndGgpO24uc2VsZWN0aW9uLnNldFJuZyh1KX19KTt0KHsiSnVzdGlmeUxlZnQsSnVzdGlmeUNlbnRlcixKdXN0aWZ5UmlnaHQsSnVzdGlmeUZ1bGwiOmZ1bmN0aW9uKHUpe3JldHVybiBzKCJhbGlnbiIrdS5zdWJzdHJpbmcoNykpfSwiQm9sZCxJdGFsaWMsVW5kZXJsaW5lLFN0cmlrZXRocm91Z2giOmZ1bmN0aW9uKHUpe3JldHVybiBzKHUpfSxtY2VCbG9ja1F1b3RlOmZ1bmN0aW9uKCl7cmV0dXJuIHMoImJsb2NrcXVvdGUiKX0sT3V0ZGVudDpmdW5jdGlvbigpe3ZhciB1O2lmKGsuaW5saW5lX3N0eWxlcyl7aWYoKHU9bC5nZXRQYXJlbnQocC5nZXRTdGFydCgpLGwuaXNCbG9jaykpJiZwYXJzZUludCh1LnN0eWxlLnBhZGRpbmdMZWZ0KT4wKXtyZXR1cm4gYX1pZigodT1sLmdldFBhcmVudChwLmdldEVuZCgpLGwuaXNCbG9jaykpJiZwYXJzZUludCh1LnN0eWxlLnBhZGRpbmdMZWZ0KT4wKXtyZXR1cm4gYX19cmV0dXJuIG0oIkluc2VydFVub3JkZXJlZExpc3QiKXx8bSgiSW5zZXJ0T3JkZXJlZExpc3QiKXx8KCFrLmlubGluZV9zdHlsZXMmJiEhbC5nZXRQYXJlbnQocC5nZXROb2RlKCksIkJMT0NLUVVPVEUiKSl9LCJJbnNlcnRVbm9yZGVyZWRMaXN0LEluc2VydE9yZGVyZWRMaXN0IjpmdW5jdGlvbih1KXtyZXR1cm4gbC5nZXRQYXJlbnQocC5nZXROb2RlKCksdT09Imluc2VydHVub3JkZXJlZGxpc3QiPyJVTCI6Ik9MIil9fSwic3RhdGUiKTt0KHsiRm9udFNpemUsRm9udE5hbWUiOmZ1bmN0aW9uKHgpe3ZhciB2PTAsdTtpZih1PWwuZ2V0UGFyZW50KHAuZ2V0Tm9kZSgpLCJzcGFuIikpe2lmKHg9PSJmb250c2l6ZSIpe3Y9dS5zdHlsZS5mb250U2l6ZX1lbHNle3Y9dS5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2UoLywgL2csIiwiKS5yZXBsYWNlKC9bXCdcIl0vZywiIikudG9Mb3dlckNhc2UoKX19cmV0dXJuIHZ9fSwidmFsdWUiKTtpZihrLmN1c3RvbV91bmRvX3JlZG8pe3Qoe1VuZG86ZnVuY3Rpb24oKXtuLnVuZG9NYW5hZ2VyLnVuZG8oKX0sUmVkbzpmdW5jdGlvbigpe24udW5kb01hbmFnZXIucmVkbygpfX0pfX19KSh0aW55bWNlKTsoZnVuY3Rpb24oYil7dmFyIGE9Yi51dGlsLkRpc3BhdGNoZXI7Yi5VbmRvTWFuYWdlcj1mdW5jdGlvbihlKXt2YXIgYyxkPTAsZz1bXTtmdW5jdGlvbiBmKCl7cmV0dXJuIGIudHJpbShlLmdldENvbnRlbnQoe2Zvcm1hdDoicmF3Iixub19ldmVudHM6MX0pKX1yZXR1cm4gYz17dHlwaW5nOjAsb25BZGQ6bmV3IGEoYyksb25VbmRvOm5ldyBhKGMpLG9uUmVkbzpuZXcgYShjKSxhZGQ6ZnVuY3Rpb24obCl7dmFyIGgsaj1lLnNldHRpbmdzLGs7bD1sfHx7fTtsLmNvbnRlbnQ9ZigpO2s9Z1tkXTtpZihrJiZrLmNvbnRlbnQ9PWwuY29udGVudCl7aWYoZD4wfHxnLmxlbmd0aD09MSl7cmV0dXJuIG51bGx9fWlmKGouY3VzdG9tX3VuZG9fcmVkb19sZXZlbHMpe2lmKGcubGVuZ3RoPmouY3VzdG9tX3VuZG9fcmVkb19sZXZlbHMpe2ZvcihoPTA7aDxnLmxlbmd0aC0xO2grKyl7Z1toXT1nW2grMV19Zy5sZW5ndGgtLTtkPWcubGVuZ3RofX1sLmJvb2ttYXJrPWUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDIsdHJ1ZSk7aWYoZDxnLmxlbmd0aC0xKXtpZihkPT0wKXtnPVtdfWVsc2V7Zy5sZW5ndGg9ZCsxfX1nLnB1c2gobCk7ZD1nLmxlbmd0aC0xO2Mub25BZGQuZGlzcGF0Y2goYyxsKTtlLmlzTm90RGlydHk9MDtyZXR1cm4gbH0sdW5kbzpmdW5jdGlvbigpe3ZhciBqLGg7aWYoYy50eXBpbmcpe2MuYWRkKCk7Yy50eXBpbmc9MH1pZihkPjApe2o9Z1stLWRdO2Uuc2V0Q29udGVudChqLmNvbnRlbnQse2Zvcm1hdDoicmF3In0pO2Uuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGouYm9va21hcmspO2Mub25VbmRvLmRpc3BhdGNoKGMsail9cmV0dXJuIGp9LHJlZG86ZnVuY3Rpb24oKXt2YXIgaDtpZihkPGcubGVuZ3RoLTEpe2g9Z1srK2RdO2Uuc2V0Q29udGVudChoLmNvbnRlbnQse2Zvcm1hdDoicmF3In0pO2Uuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGguYm9va21hcmspO2Mub25SZWRvLmRpc3BhdGNoKGMsaCl9cmV0dXJuIGh9LGNsZWFyOmZ1bmN0aW9uKCl7Zz1bXTtkPWMudHlwaW5nPTB9LGhhc1VuZG86ZnVuY3Rpb24oKXtyZXR1cm4gZD4wfHxjLnR5cGluZ30saGFzUmVkbzpmdW5jdGlvbigpe3JldHVybiBkPGcubGVuZ3RoLTF9fX19KSh0aW55bWNlKTsoZnVuY3Rpb24obSl7dmFyIGs9bS5kb20uRXZlbnQsYz1tLmlzSUUsYT1tLmlzR2Vja28sYj1tLmlzT3BlcmEsaj1tLmVhY2gsaT1tLmV4dGVuZCxkPXRydWUsaD1mYWxzZTtmdW5jdGlvbiBsKHApe3ZhciBxLG8sbjtkb3tpZigvXihTUEFOfFNUUk9OR3xCfEVNfEl8Rk9OVHxTVFJJS0V8VSkkLy50ZXN0KHAubm9kZU5hbWUpKXtpZihxKXtvPXAuY2xvbmVOb2RlKGZhbHNlKTtvLmFwcGVuZENoaWxkKHEpO3E9b31lbHNle3E9bj1wLmNsb25lTm9kZShmYWxzZSl9cS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fXdoaWxlKHA9cC5wYXJlbnROb2RlKTtpZihxKXtyZXR1cm57d3JhcHBlcjpxLGlubmVyOm59fX1mdW5jdGlvbiBnKG8scCl7dmFyIG49cC5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7bi5zZXRTdGFydChvLmVuZENvbnRhaW5lcixvLmVuZE9mZnNldCk7bi5zZXRFbmRBZnRlcihwKTtyZXR1cm4gbi5jbG9uZUNvbnRlbnRzKCkudGV4dENvbnRlbnQubGVuZ3RoPT0wfWZ1bmN0aW9uIGYobyl7bz1vLmlubmVySFRNTDtvPW8ucmVwbGFjZSgvPChpbWd8aHJ8dGFibGV8aW5wdXR8c2VsZWN0fHRleHRhcmVhKVsgXD5dL2dpLCItIik7bz1vLnJlcGxhY2UoLzxbXj5dKz4vZywiIik7cmV0dXJuIG8ucmVwbGFjZSgvWyBcdTAwYTBcdFxyXG5dKy9nLCIiKT09IiJ9ZnVuY3Rpb24gZShwLHIsbil7dmFyIG8scTtpZihmKG4pKXtvPXIuZ2V0UGFyZW50KG4sInVsLG9sIik7aWYoIXIuZ2V0UGFyZW50KG8ucGFyZW50Tm9kZSwidWwsb2wiKSl7ci5zcGxpdChvLG4pO3E9ci5jcmVhdGUoInAiLDAsJzxiciBfbWNlX2JvZ3VzPSIxIiAvPicpO3IucmVwbGFjZShxLG4pO3Auc2VsZWN0KHEsMSl9cmV0dXJuIGh9cmV0dXJuIGR9bS5jcmVhdGUoInRpbnltY2UuRm9yY2VCbG9ja3MiLHtGb3JjZUJsb2NrczpmdW5jdGlvbihvKXt2YXIgcD10aGlzLHE9by5zZXR0aW5ncyxyO3AuZWRpdG9yPW87cC5kb209by5kb207cj0ocS5mb3JjZWRfcm9vdF9ibG9ja3x8InAiKS50b0xvd2VyQ2FzZSgpO3EuZWxlbWVudD1yLnRvVXBwZXJDYXNlKCk7by5vblByZUluaXQuYWRkKHAuc2V0dXAscCk7cC5yZU9wZXJhPW5ldyBSZWdFeHAoIihcXHUwMGEwfCYjMTYwO3wmbmJzcDspPC8iK3IrIj4iLCJnaSIpO3AucmVQYWRkPW5ldyBSZWdFeHAoIjxwKCApKFtePl0rKT48XFwvcD58PHAoICkoW14+XSspXFwvPnw8cCggKShbXj5dKyk+XFxzKzxcXC9wPnw8cD48XFwvcD58PHBcXC8+fDxwPlxccys8XFwvcD4iLnJlcGxhY2UoL3AvZyxyKSwiZ2kiKTtwLnJlTmJzcDJCUjE9bmV3IFJlZ0V4cCgiPHAoICkoW14+XSspPltcXHNcXHUwMGEwXSs8XFwvcD58PHA+W1xcc1xcdTAwYTBdKzxcXC9wPiIucmVwbGFjZSgvcC9nLHIpLCJnaSIpO3AucmVOYnNwMkJSMj1uZXcgUmVnRXhwKCI8JXAoKShbXj5dKyk+KCZuYnNwO3wmIzE2MDspPFxcLyVwPnw8JXA+KCZuYnNwO3wmIzE2MDspPFxcLyVwPiIucmVwbGFjZSgvJXAvZyxyKSwiZ2kiKTtwLnJlQlIyTmJzcD1uZXcgUmVnRXhwKCI8cCggKShbXj5dKyk+XFxzKjxiciBcXC8+XFxzKjxcXC9wPnw8cD5cXHMqPGJyIFxcLz5cXHMqPFxcL3A+Ii5yZXBsYWNlKC9wL2csciksImdpIik7ZnVuY3Rpb24gbihzLHQpe2lmKGIpe3QuY29udGVudD10LmNvbnRlbnQucmVwbGFjZShwLnJlT3BlcmEsIjwvIityKyI+Iil9dC5jb250ZW50PW0uX3JlcGxhY2UocC5yZVBhZGQsIjwiK3IrIiQxJDIkMyQ0JDUkNj5cdTAwYTA8LyIrcisiPiIsdC5jb250ZW50KTtpZighYyYmIWImJnQuc2V0KXt0LmNvbnRlbnQ9dC5jb250ZW50LnJlcGxhY2UocC5yZU5ic3AyQlIxLCI8IityKyIkMSQyPjxiciAvPjwvIityKyI+Iik7dC5jb250ZW50PXQuY29udGVudC5yZXBsYWNlKHAucmVOYnNwMkJSMiwiPCIrcisiJDEkMj48YnIgLz48LyIrcisiPiIpfWVsc2V7dC5jb250ZW50PW0uX3JlcGxhY2UocC5yZUJSMk5ic3AsIjwiK3IrIiQxJDI+XHUwMGEwPC8iK3IrIj4iLHQuY29udGVudCl9fW8ub25CZWZvcmVTZXRDb250ZW50LmFkZChuKTtvLm9uUG9zdFByb2Nlc3MuYWRkKG4pO2lmKHEuZm9yY2VkX3Jvb3RfYmxvY2spe28ub25Jbml0LmFkZChwLmZvcmNlUm9vdHMscCk7by5vblNldENvbnRlbnQuYWRkKHAuZm9yY2VSb290cyxwKTtvLm9uQmVmb3JlR2V0Q29udGVudC5hZGQocC5mb3JjZVJvb3RzLHApfX0sc2V0dXA6ZnVuY3Rpb24oKXt2YXIgbz10aGlzLG49by5lZGl0b3IscT1uLnNldHRpbmdzLHU9bi5kb20scD1uLnNlbGVjdGlvbjtpZihxLmZvcmNlZF9yb290X2Jsb2NrKXtuLm9uQmVmb3JlRXhlY0NvbW1hbmQuYWRkKG8uZm9yY2VSb290cyxvKTtuLm9uS2V5VXAuYWRkKG8uZm9yY2VSb290cyxvKTtuLm9uUHJlUHJvY2Vzcy5hZGQoby5mb3JjZVJvb3RzLG8pfWlmKHEuZm9yY2VfYnJfbmV3bGluZXMpe2lmKGMpe24ub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24ocyx0KXt2YXIgdjtpZih0LmtleUNvZGU9PTEzJiZwLmdldE5vZGUoKS5ub2RlTmFtZSE9IkxJIil7cC5zZXRDb250ZW50KCc8YnIgaWQ9Il9fIiAvPiAnLHtmb3JtYXQ6InJhdyJ9KTt2PXUuZ2V0KCJfXyIpO3YucmVtb3ZlQXR0cmlidXRlKCJpZCIpO3Auc2VsZWN0KHYpO3AuY29sbGFwc2UoKTtyZXR1cm4gay5jYW5jZWwodCl9fSl9fWlmKHEuZm9yY2VfcF9uZXdsaW5lcyl7aWYoIWMpe24ub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24ocyx0KXtpZih0LmtleUNvZGU9PTEzJiYhdC5zaGlmdEtleSYmIW8uaW5zZXJ0UGFyYSh0KSl7ay5jYW5jZWwodCl9fSl9ZWxzZXttLmFkZFVubG9hZChmdW5jdGlvbigpe28uX3ByZXZpb3VzRm9ybWF0cz0wfSk7bi5vbktleVByZXNzLmFkZChmdW5jdGlvbihzLHQpe28uX3ByZXZpb3VzRm9ybWF0cz0wO2lmKHQua2V5Q29kZT09MTMmJiF0LnNoaWZ0S2V5JiZzLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpJiZxLmtlZXBfc3R5bGVzKXtvLl9wcmV2aW91c0Zvcm1hdHM9bChzLnNlbGVjdGlvbi5nZXRTdGFydCgpKX19KTtuLm9uS2V5VXAuYWRkKGZ1bmN0aW9uKHQseCl7aWYoeC5rZXlDb2RlPT0xMyYmIXguc2hpZnRLZXkpe3ZhciB2PXQuc2VsZWN0aW9uLmdldFN0YXJ0KCkscz1vLl9wcmV2aW91c0Zvcm1hdHM7aWYoIXYuaGFzQ2hpbGROb2RlcygpJiZzKXt2PXUuZ2V0UGFyZW50KHYsdS5pc0Jsb2NrKTtpZih2JiZ2Lm5vZGVOYW1lIT0iTEkiKXt2LmlubmVySFRNTD0iIjtpZihvLl9wcmV2aW91c0Zvcm1hdHMpe3YuYXBwZW5kQ2hpbGQocy53cmFwcGVyKTtzLmlubmVyLmlubmVySFRNTD0iXHVGRUZGIn1lbHNle3YuaW5uZXJIVE1MPSJcdUZFRkYifXAuc2VsZWN0KHYsMSk7dC5nZXREb2MoKS5leGVjQ29tbWFuZCgiRGVsZXRlIixmYWxzZSxudWxsKTtvLl9wcmV2aW91c0Zvcm1hdHM9MH19fX0pfWlmKGEpe24ub25LZXlEb3duLmFkZChmdW5jdGlvbihzLHQpe2lmKCh0LmtleUNvZGU9PTh8fHQua2V5Q29kZT09NDYpJiYhdC5zaGlmdEtleSl7by5iYWNrc3BhY2VEZWxldGUodCx0LmtleUNvZGU9PTgpfX0pfX1pZihtLmlzV2ViS2l0KXtmdW5jdGlvbiByKHQpe3ZhciBzPXAuZ2V0Um5nKCksdix6PXUuY3JlYXRlKCJkaXYiLG51bGwsIiAiKSx5LHg9dS5nZXRWaWV3UG9ydCh0LmdldFdpbigpKS5oO3MuaW5zZXJ0Tm9kZSh2PXUuY3JlYXRlKCJiciIpKTtzLnNldFN0YXJ0QWZ0ZXIodik7cy5zZXRFbmRBZnRlcih2KTtwLnNldFJuZyhzKTtpZihwLmdldFNlbCgpLmZvY3VzTm9kZT09di5wcmV2aW91c1NpYmxpbmcpe3Auc2VsZWN0KHUuaW5zZXJ0QWZ0ZXIodS5kb2MuY3JlYXRlVGV4dE5vZGUoIlx1MDBhMCIpLHYpKTtwLmNvbGxhcHNlKGQpfXUuaW5zZXJ0QWZ0ZXIoeix2KTt5PXUuZ2V0UG9zKHopLnk7dS5yZW1vdmUoeik7aWYoeT54KXt0LmdldFdpbigpLnNjcm9sbFRvKDAseSl9fW4ub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24ocyx0KXtpZih0LmtleUNvZGU9PTEzJiYodC5zaGlmdEtleXx8KHEuZm9yY2VfYnJfbmV3bGluZXMmJiF1LmdldFBhcmVudChwLmdldE5vZGUoKSwiaDEsaDIsaDMsaDQsaDUsaDYsb2wsdWwiKSkpKXtyKHMpO2suY2FuY2VsKHQpfX0pfW4ub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe2oodS5zZWxlY3QoInAsaDEsaDIsaDMsaDQsaDUsaDYsZGl2Iix0Lm5vZGUpLGZ1bmN0aW9uKHYpe2lmKGYodikpe2oodS5zZWxlY3QoInNwYW4sZW0sc3Ryb25nLGIsaSIsdC5ub2RlKSxmdW5jdGlvbih4KXtpZigheC5oYXNDaGlsZE5vZGVzKCkpe3guYXBwZW5kQ2hpbGQocy5nZXREb2MoKS5jcmVhdGVUZXh0Tm9kZSgiXHUwMGEwIikpO3JldHVybiBofX0pfX0pfSk7aWYoYyl7aWYocS5lbGVtZW50IT0iUCIpe24ub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24ocyx0KXtvLmxhc3RFbG09cC5nZXROb2RlKCkubm9kZU5hbWV9KTtuLm9uS2V5VXAuYWRkKGZ1bmN0aW9uKHQsdil7dmFyIHkseD1wLmdldE5vZGUoKSxzPXQuZ2V0Qm9keSgpO2lmKHMuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZ4Lm5vZGVOYW1lPT0iUCIpe3g9dS5yZW5hbWUoeCxxLmVsZW1lbnQpO3Auc2VsZWN0KHgpO3AuY29sbGFwc2UoKTt0Lm5vZGVDaGFuZ2VkKCl9ZWxzZXtpZih2LmtleUNvZGU9PTEzJiYhdi5zaGlmdEtleSYmby5sYXN0RWxtIT0iUCIpe3k9dS5nZXRQYXJlbnQoeCwicCIpO2lmKHkpe3UucmVuYW1lKHkscS5lbGVtZW50KTt0Lm5vZGVDaGFuZ2VkKCl9fX19KX19fSxmaW5kOmZ1bmN0aW9uKHYscSxyKXt2YXIgcD10aGlzLmVkaXRvcixvPXAuZ2V0RG9jKCkuY3JlYXRlVHJlZVdhbGtlcih2LDQsbnVsbCxoKSx1PS0xO3doaWxlKHY9by5uZXh0Tm9kZSgpKXt1Kys7aWYocT09MCYmdj09cil7cmV0dXJuIHV9aWYocT09MSYmdT09cil7cmV0dXJuIHZ9fXJldHVybiAtMX0sZm9yY2VSb290czpmdW5jdGlvbih4LEkpe3ZhciB6PXRoaXMseD16LmVkaXRvcixNPXguZ2V0Qm9keSgpLEo9eC5nZXREb2MoKSxQPXguc2VsZWN0aW9uLEE9UC5nZXRTZWwoKSxCPVAuZ2V0Um5nKCksTj0tMix2LEcsbyxwLEs9LTE2Nzc3MjE1O3ZhciBMLHEsTyxGLEMsdT1NLmNoaWxkTm9kZXMsRSxELHk7Zm9yKEU9dS5sZW5ndGgtMTtFPj0wO0UtLSl7TD11W0VdO2lmKEwubm9kZVR5cGU9PT0xJiZMLmdldEF0dHJpYnV0ZSgiX21jZV90eXBlIikpe3E9bnVsbDtjb250aW51ZX1pZihMLm5vZGVUeXBlPT09M3x8KCF6LmRvbS5pc0Jsb2NrKEwpJiZMLm5vZGVUeXBlIT09OCYmIS9eKHNjcmlwdHxtY2U6c2NyaXB0fHN0eWxlfG1jZTpzdHlsZSkkL2kudGVzdChMLm5vZGVOYW1lKSkpe2lmKCFxKXtpZihMLm5vZGVUeXBlIT0zfHwvW15cc10vZy50ZXN0KEwubm9kZVZhbHVlKSl7aWYoTj09LTImJkIpe2lmKCFjfHxCLnNldFN0YXJ0KXtpZihCLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlPT0xJiYoRD1CLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbQi5zdGFydE9mZnNldF0pJiZELm5vZGVUeXBlPT0xKXt5PUQuZ2V0QXR0cmlidXRlKCJpZCIpO0Quc2V0QXR0cmlidXRlKCJpZCIsIl9fbWNlIil9ZWxzZXtpZih4LmRvbS5nZXRQYXJlbnQoQi5zdGFydENvbnRhaW5lcixmdW5jdGlvbihuKXtyZXR1cm4gbj09PU19KSl7Rz1CLnN0YXJ0T2Zmc2V0O289Qi5lbmRPZmZzZXQ7Tj16LmZpbmQoTSwwLEIuc3RhcnRDb250YWluZXIpO3Y9ei5maW5kKE0sMCxCLmVuZENvbnRhaW5lcil9fX1lbHNle2lmKEIuaXRlbSl7cD1KLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7cC5tb3ZlVG9FbGVtZW50VGV4dChCLml0ZW0oMCkpO0I9cH1wPUouYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTtwLm1vdmVUb0VsZW1lbnRUZXh0KE0pO3AuY29sbGFwc2UoMSk7Tz1wLm1vdmUoImNoYXJhY3RlciIsSykqLTE7cD1CLmR1cGxpY2F0ZSgpO3AuY29sbGFwc2UoMSk7Rj1wLm1vdmUoImNoYXJhY3RlciIsSykqLTE7cD1CLmR1cGxpY2F0ZSgpO3AuY29sbGFwc2UoMCk7Qz0ocC5tb3ZlKCJjaGFyYWN0ZXIiLEspKi0xKS1GO049Ri1PO3Y9Q319cT14LmRvbS5jcmVhdGUoeC5zZXR0aW5ncy5mb3JjZWRfcm9vdF9ibG9jayk7TC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChxLEwpO3EuYXBwZW5kQ2hpbGQoTCl9fWVsc2V7aWYocS5oYXNDaGlsZE5vZGVzKCkpe3EuaW5zZXJ0QmVmb3JlKEwscS5maXJzdENoaWxkKX1lbHNle3EuYXBwZW5kQ2hpbGQoTCl9fX1lbHNle3E9bnVsbH19aWYoTiE9LTIpe2lmKCFjfHxCLnNldFN0YXJ0KXtxPU0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoeC5zZXR0aW5ncy5lbGVtZW50KVswXTtCPUouY3JlYXRlUmFuZ2UoKTtpZihOIT0tMSl7Qi5zZXRTdGFydCh6LmZpbmQoTSwxLE4pLEcpfWVsc2V7Qi5zZXRTdGFydChxLDApfWlmKHYhPS0xKXtCLnNldEVuZCh6LmZpbmQoTSwxLHYpLG8pfWVsc2V7Qi5zZXRFbmQocSwwKX1pZihBKXtBLnJlbW92ZUFsbFJhbmdlcygpO0EuYWRkUmFuZ2UoQil9fWVsc2V7dHJ5e0I9QS5jcmVhdGVSYW5nZSgpO0IubW92ZVRvRWxlbWVudFRleHQoTSk7Qi5jb2xsYXBzZSgxKTtCLm1vdmVTdGFydCgiY2hhcmFjdGVyIixOKTtCLm1vdmVFbmQoImNoYXJhY3RlciIsdik7Qi5zZWxlY3QoKX1jYXRjaChIKXt9fX1lbHNle2lmKCghY3x8Qi5zZXRTdGFydCkmJihEPXguZG9tLmdldCgiX19tY2UiKSkpe2lmKHkpe0Quc2V0QXR0cmlidXRlKCJpZCIseSl9ZWxzZXtELnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX1CPUouY3JlYXRlUmFuZ2UoKTtCLnNldFN0YXJ0QmVmb3JlKEQpO0Iuc2V0RW5kQmVmb3JlKEQpO1Auc2V0Um5nKEIpfX19LGdldFBhcmVudEJsb2NrOmZ1bmN0aW9uKHApe3ZhciBvPXRoaXMuZG9tO3JldHVybiBvLmdldFBhcmVudChwLG8uaXNCbG9jayl9LGluc2VydFBhcmE6ZnVuY3Rpb24oUyl7dmFyIEc9dGhpcyx4PUcuZWRpdG9yLE89eC5kb20sVD14LmdldERvYygpLFg9eC5zZXR0aW5ncyxIPXguc2VsZWN0aW9uLmdldFNlbCgpLEk9SC5nZXRSYW5nZUF0KDApLFc9VC5ib2R5O3ZhciBMLE0sSixRLFAsdSxwLHYsQSxvLEUsVixxLHosSyxOPU8uZ2V0Vmlld1BvcnQoeC5nZXRXaW4oKSksRCxGLEM7TD1ULmNyZWF0ZVJhbmdlKCk7TC5zZXRTdGFydChILmFuY2hvck5vZGUsSC5hbmNob3JPZmZzZXQpO0wuY29sbGFwc2UoZCk7TT1ULmNyZWF0ZVJhbmdlKCk7TS5zZXRTdGFydChILmZvY3VzTm9kZSxILmZvY3VzT2Zmc2V0KTtNLmNvbGxhcHNlKGQpO0o9TC5jb21wYXJlQm91bmRhcnlQb2ludHMoTC5TVEFSVF9UT19FTkQsTSk8MDtRPUo/SC5hbmNob3JOb2RlOkguZm9jdXNOb2RlO1A9Sj9ILmFuY2hvck9mZnNldDpILmZvY3VzT2Zmc2V0O3U9Sj9ILmZvY3VzTm9kZTpILmFuY2hvck5vZGU7cD1KP0guZm9jdXNPZmZzZXQ6SC5hbmNob3JPZmZzZXQ7aWYoUT09PXUmJi9eKFREfFRIKSQvLnRlc3QoUS5ub2RlTmFtZSkpe2lmKFEuZmlyc3RDaGlsZC5ub2RlTmFtZT09IkJSIil7Ty5yZW1vdmUoUS5maXJzdENoaWxkKX1pZihRLmNoaWxkTm9kZXMubGVuZ3RoPT0wKXt4LmRvbS5hZGQoUSxYLmVsZW1lbnQsbnVsbCwiPGJyIC8+Iik7Vj14LmRvbS5hZGQoUSxYLmVsZW1lbnQsbnVsbCwiPGJyIC8+Iil9ZWxzZXtLPVEuaW5uZXJIVE1MO1EuaW5uZXJIVE1MPSIiO3guZG9tLmFkZChRLFguZWxlbWVudCxudWxsLEspO1Y9eC5kb20uYWRkKFEsWC5lbGVtZW50LG51bGwsIjxiciAvPiIpfUk9VC5jcmVhdGVSYW5nZSgpO0kuc2VsZWN0Tm9kZUNvbnRlbnRzKFYpO0kuY29sbGFwc2UoMSk7eC5zZWxlY3Rpb24uc2V0Um5nKEkpO3JldHVybiBofWlmKFE9PVcmJnU9PVcmJlcuZmlyc3RDaGlsZCYmeC5kb20uaXNCbG9jayhXLmZpcnN0Q2hpbGQpKXtRPXU9US5maXJzdENoaWxkO1A9cD0wO0w9VC5jcmVhdGVSYW5nZSgpO0wuc2V0U3RhcnQoUSwwKTtNPVQuY3JlYXRlUmFuZ2UoKTtNLnNldFN0YXJ0KHUsMCl9UT1RLm5vZGVOYW1lPT0iSFRNTCI/VC5ib2R5OlE7UT1RLm5vZGVOYW1lPT0iQk9EWSI/US5maXJzdENoaWxkOlE7dT11Lm5vZGVOYW1lPT0iSFRNTCI/VC5ib2R5OnU7dT11Lm5vZGVOYW1lPT0iQk9EWSI/dS5maXJzdENoaWxkOnU7dj1HLmdldFBhcmVudEJsb2NrKFEpO0E9Ry5nZXRQYXJlbnRCbG9jayh1KTtvPXY/di5ub2RlTmFtZTpYLmVsZW1lbnQ7aWYoSz1HLmRvbS5nZXRQYXJlbnQodiwibGkscHJlIikpe2lmKEsubm9kZU5hbWU9PSJMSSIpe3JldHVybiBlKHguc2VsZWN0aW9uLEcuZG9tLEspfXJldHVybiBkfWlmKHYmJih2Lm5vZGVOYW1lPT0iQ0FQVElPTiJ8fC9hYnNvbHV0ZXxyZWxhdGl2ZXxmaXhlZC9naS50ZXN0KE8uZ2V0U3R5bGUodiwicG9zaXRpb24iLDEpKSkpe289WC5lbGVtZW50O3Y9bnVsbH1pZihBJiYoQS5ub2RlTmFtZT09IkNBUFRJT04ifHwvYWJzb2x1dGV8cmVsYXRpdmV8Zml4ZWQvZ2kudGVzdChPLmdldFN0eWxlKHYsInBvc2l0aW9uIiwxKSkpKXtvPVguZWxlbWVudDtBPW51bGx9aWYoLyhURHxUQUJMRXxUSHxDQVBUSU9OKS8udGVzdChvKXx8KHYmJm89PSJESVYiJiYvbGVmdHxyaWdodC9naS50ZXN0KE8uZ2V0U3R5bGUodiwiZmxvYXQiLDEpKSkpe289WC5lbGVtZW50O3Y9QT1udWxsfUU9KHYmJnYubm9kZU5hbWU9PW8pP3YuY2xvbmVOb2RlKDApOnguZG9tLmNyZWF0ZShvKTtWPShBJiZBLm5vZGVOYW1lPT1vKT9BLmNsb25lTm9kZSgwKTp4LmRvbS5jcmVhdGUobyk7Vi5yZW1vdmVBdHRyaWJ1dGUoImlkIik7aWYoL14oSFsxLTZdKSQvLnRlc3QobykmJmcoSSx2KSl7Vj14LmRvbS5jcmVhdGUoWC5lbGVtZW50KX1LPXE9UTtkb3tpZihLPT1XfHxLLm5vZGVUeXBlPT05fHxHLmRvbS5pc0Jsb2NrKEspfHwvKFREfFRBQkxFfFRIfENBUFRJT04pLy50ZXN0KEsubm9kZU5hbWUpKXticmVha31xPUt9d2hpbGUoKEs9Sy5wcmV2aW91c1NpYmxpbmc/Sy5wcmV2aW91c1NpYmxpbmc6Sy5wYXJlbnROb2RlKSk7Sz16PXU7ZG97aWYoSz09V3x8Sy5ub2RlVHlwZT09OXx8Ry5kb20uaXNCbG9jayhLKXx8LyhURHxUQUJMRXxUSHxDQVBUSU9OKS8udGVzdChLLm5vZGVOYW1lKSl7YnJlYWt9ej1LfXdoaWxlKChLPUsubmV4dFNpYmxpbmc/Sy5uZXh0U2libGluZzpLLnBhcmVudE5vZGUpKTtpZihxLm5vZGVOYW1lPT1vKXtMLnNldFN0YXJ0KHEsMCl9ZWxzZXtMLnNldFN0YXJ0QmVmb3JlKHEpfUwuc2V0RW5kKFEsUCk7RS5hcHBlbmRDaGlsZChMLmNsb25lQ29udGVudHMoKXx8VC5jcmVhdGVUZXh0Tm9kZSgiIikpO3RyeXtNLnNldEVuZEFmdGVyKHopfWNhdGNoKFIpe31NLnNldFN0YXJ0KHUscCk7Vi5hcHBlbmRDaGlsZChNLmNsb25lQ29udGVudHMoKXx8VC5jcmVhdGVUZXh0Tm9kZSgiIikpO0k9VC5jcmVhdGVSYW5nZSgpO2lmKCFxLnByZXZpb3VzU2libGluZyYmcS5wYXJlbnROb2RlLm5vZGVOYW1lPT1vKXtJLnNldFN0YXJ0QmVmb3JlKHEucGFyZW50Tm9kZSl9ZWxzZXtpZihMLnN0YXJ0Q29udGFpbmVyLm5vZGVOYW1lPT1vJiZMLnN0YXJ0T2Zmc2V0PT0wKXtJLnNldFN0YXJ0QmVmb3JlKEwuc3RhcnRDb250YWluZXIpfWVsc2V7SS5zZXRTdGFydChMLnN0YXJ0Q29udGFpbmVyLEwuc3RhcnRPZmZzZXQpfX1pZighei5uZXh0U2libGluZyYmei5wYXJlbnROb2RlLm5vZGVOYW1lPT1vKXtJLnNldEVuZEFmdGVyKHoucGFyZW50Tm9kZSl9ZWxzZXtJLnNldEVuZChNLmVuZENvbnRhaW5lcixNLmVuZE9mZnNldCl9SS5kZWxldGVDb250ZW50cygpO2lmKGIpe3guZ2V0V2luKCkuc2Nyb2xsVG8oMCxOLnkpfWlmKEUuZmlyc3RDaGlsZCYmRS5maXJzdENoaWxkLm5vZGVOYW1lPT1vKXtFLmlubmVySFRNTD1FLmZpcnN0Q2hpbGQuaW5uZXJIVE1MfWlmKFYuZmlyc3RDaGlsZCYmVi5maXJzdENoaWxkLm5vZGVOYW1lPT1vKXtWLmlubmVySFRNTD1WLmZpcnN0Q2hpbGQuaW5uZXJIVE1MfWlmKGYoRSkpe0UuaW5uZXJIVE1MPSI8YnIgLz4ifWZ1bmN0aW9uIFUoeSxzKXt2YXIgcj1bXSxaLFksdDt5LmlubmVySFRNTD0iIjtpZihYLmtlZXBfc3R5bGVzKXtZPXM7ZG97aWYoL14oU1BBTnxTVFJPTkd8QnxFTXxJfEZPTlR8U1RSSUtFfFUpJC8udGVzdChZLm5vZGVOYW1lKSl7Wj1ZLmNsb25lTm9kZShoKTtPLnNldEF0dHJpYihaLCJpZCIsIiIpO3IucHVzaChaKX19d2hpbGUoWT1ZLnBhcmVudE5vZGUpfWlmKHIubGVuZ3RoPjApe2Zvcih0PXIubGVuZ3RoLTEsWj15O3Q+PTA7dC0tKXtaPVouYXBwZW5kQ2hpbGQoclt0XSl9clswXS5pbm5lckhUTUw9Yj8iJm5ic3A7IjoiPGJyIC8+IjtyZXR1cm4gclswXX1lbHNle3kuaW5uZXJIVE1MPWI/IiZuYnNwOyI6IjxiciAvPiJ9fWlmKGYoVikpe0M9VShWLHUpfWlmKGImJnBhcnNlRmxvYXQob3BlcmEudmVyc2lvbigpKTw5LjUpe0kuaW5zZXJ0Tm9kZShFKTtJLmluc2VydE5vZGUoVil9ZWxzZXtJLmluc2VydE5vZGUoVik7SS5pbnNlcnROb2RlKEUpfVYubm9ybWFsaXplKCk7RS5ub3JtYWxpemUoKTtmdW5jdGlvbiBCKHIpe3JldHVybiBULmNyZWF0ZVRyZWVXYWxrZXIocixOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLGgpLm5leHROb2RlKCl8fHJ9ST1ULmNyZWF0ZVJhbmdlKCk7SS5zZWxlY3ROb2RlQ29udGVudHMoYT9CKEN8fFYpOkN8fFYpO0kuY29sbGFwc2UoMSk7SC5yZW1vdmVBbGxSYW5nZXMoKTtILmFkZFJhbmdlKEkpO0Q9eC5kb20uZ2V0UG9zKFYpLnk7Rj1WLmNsaWVudEhlaWdodDtpZihEPE4ueXx8RCtGPk4ueStOLmgpe3guZ2V0V2luKCkuc2Nyb2xsVG8oMCxEPE4ueT9EOkQtTi5oKzI1KX1yZXR1cm4gaH0sYmFja3NwYWNlRGVsZXRlOmZ1bmN0aW9uKHYsQyl7dmFyIEQ9dGhpcyx1PUQuZWRpdG9yLHo9dS5nZXRCb2R5KCkscz11LmRvbSxxLHg9dS5zZWxlY3Rpb24scD14LmdldFJuZygpLHk9cC5zdGFydENvbnRhaW5lcixxLEEsQixvO2lmKCFDJiZwLmNvbGxhcHNlZCYmeS5ub2RlVHlwZT09MSYmcC5zdGFydE9mZnNldD09eS5jaGlsZE5vZGVzLmxlbmd0aCl7bz1uZXcgbS5kb20uVHJlZVdhbGtlcih5Lmxhc3RDaGlsZCx5KTtmb3IocT15Lmxhc3RDaGlsZDtxO3E9by5wcmV2KCkpe2lmKHEubm9kZVR5cGU9PTMpe3Auc2V0U3RhcnQocSxxLm5vZGVWYWx1ZS5sZW5ndGgpO3AuY29sbGFwc2UodHJ1ZSk7eC5zZXRSbmcocCk7cmV0dXJufX19aWYoeSYmdS5kb20uaXNCbG9jayh5KSYmIS9eKFREfFRIKSQvLnRlc3QoeS5ub2RlTmFtZSkmJkMpe2lmKHkuY2hpbGROb2Rlcy5sZW5ndGg9PTB8fCh5LmNoaWxkTm9kZXMubGVuZ3RoPT0xJiZ5LmZpcnN0Q2hpbGQubm9kZU5hbWU9PSJCUiIpKXtxPXk7d2hpbGUoKHE9cS5wcmV2aW91c1NpYmxpbmcpJiYhdS5kb20uaXNCbG9jayhxKSl7fWlmKHEpe2lmKHkhPXouZmlyc3RDaGlsZCl7QT11LmRvbS5kb2MuY3JlYXRlVHJlZVdhbGtlcihxLE5vZGVGaWx0ZXIuU0hPV19URVhULG51bGwsaCk7d2hpbGUoQj1BLm5leHROb2RlKCkpe3E9Qn1wPXUuZ2V0RG9jKCkuY3JlYXRlUmFuZ2UoKTtwLnNldFN0YXJ0KHEscS5ub2RlVmFsdWU/cS5ub2RlVmFsdWUubGVuZ3RoOjApO3Auc2V0RW5kKHEscS5ub2RlVmFsdWU/cS5ub2RlVmFsdWUubGVuZ3RoOjApO3guc2V0Um5nKHApO3UuZG9tLnJlbW92ZSh5KX1yZXR1cm4gay5jYW5jZWwodil9fX19fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYyl7dmFyIGI9Yy5ET00sYT1jLmRvbS5FdmVudCxkPWMuZWFjaCxlPWMuZXh0ZW5kO2MuY3JlYXRlKCJ0aW55bWNlLkNvbnRyb2xNYW5hZ2VyIix7Q29udHJvbE1hbmFnZXI6ZnVuY3Rpb24oZixqKXt2YXIgaD10aGlzLGc7aj1qfHx7fTtoLmVkaXRvcj1mO2guY29udHJvbHM9e307aC5vbkFkZD1uZXcgYy51dGlsLkRpc3BhdGNoZXIoaCk7aC5vblBvc3RSZW5kZXI9bmV3IGMudXRpbC5EaXNwYXRjaGVyKGgpO2gucHJlZml4PWoucHJlZml4fHxmLmlkKyJfIjtoLl9jbHM9e307aC5vblBvc3RSZW5kZXIuYWRkKGZ1bmN0aW9uKCl7ZChoLmNvbnRyb2xzLGZ1bmN0aW9uKGkpe2kucG9zdFJlbmRlcigpfSl9KX0sZ2V0OmZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLmNvbnRyb2xzW3RoaXMucHJlZml4K2ZdfHx0aGlzLmNvbnRyb2xzW2ZdfSxzZXRBY3RpdmU6ZnVuY3Rpb24oaCxmKXt2YXIgZz1udWxsO2lmKGc9dGhpcy5nZXQoaCkpe2cuc2V0QWN0aXZlKGYpfXJldHVybiBnfSxzZXREaXNhYmxlZDpmdW5jdGlvbihoLGYpe3ZhciBnPW51bGw7aWYoZz10aGlzLmdldChoKSl7Zy5zZXREaXNhYmxlZChmKX1yZXR1cm4gZ30sYWRkOmZ1bmN0aW9uKGcpe3ZhciBmPXRoaXM7aWYoZyl7Zi5jb250cm9sc1tnLmlkXT1nO2Yub25BZGQuZGlzcGF0Y2goZyxmKX1yZXR1cm4gZ30sY3JlYXRlQ29udHJvbDpmdW5jdGlvbihpKXt2YXIgaCxnPXRoaXMsZj1nLmVkaXRvcjtkKGYucGx1Z2lucyxmdW5jdGlvbihqKXtpZihqLmNyZWF0ZUNvbnRyb2wpe2g9ai5jcmVhdGVDb250cm9sKGksZyk7aWYoaCl7cmV0dXJuIGZhbHNlfX19KTtzd2l0Y2goaSl7Y2FzZSJ8IjpjYXNlInNlcGFyYXRvciI6cmV0dXJuIGcuY3JlYXRlU2VwYXJhdG9yKCl9aWYoIWgmJmYuYnV0dG9ucyYmKGg9Zi5idXR0b25zW2ldKSl7cmV0dXJuIGcuY3JlYXRlQnV0dG9uKGksaCl9cmV0dXJuIGcuYWRkKGgpfSxjcmVhdGVEcm9wTWVudTpmdW5jdGlvbihmLG4saCl7dmFyIG09dGhpcyxpPW0uZWRpdG9yLGosZyxrLGw7bj1lKHsiY2xhc3MiOiJtY2VEcm9wRG93biIsY29uc3RyYWluOmkuc2V0dGluZ3MuY29uc3RyYWluX21lbnVzfSxuKTtuWyJjbGFzcyJdPW5bImNsYXNzIl0rIiAiK2kuZ2V0UGFyYW0oInNraW4iKSsiU2tpbiI7aWYoaz1pLmdldFBhcmFtKCJza2luX3ZhcmlhbnQiKSl7blsiY2xhc3MiXSs9IiAiK2kuZ2V0UGFyYW0oInNraW4iKSsiU2tpbiIray5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK2suc3Vic3RyaW5nKDEpfWY9bS5wcmVmaXgrZjtsPWh8fG0uX2Nscy5kcm9wbWVudXx8Yy51aS5Ecm9wTWVudTtqPW0uY29udHJvbHNbZl09bmV3IGwoZixuKTtqLm9uQWRkSXRlbS5hZGQoZnVuY3Rpb24ocixxKXt2YXIgcD1xLnNldHRpbmdzO3AudGl0bGU9aS5nZXRMYW5nKHAudGl0bGUscC50aXRsZSk7aWYoIXAub25jbGljayl7cC5vbmNsaWNrPWZ1bmN0aW9uKG8pe2lmKHAuY21kKXtpLmV4ZWNDb21tYW5kKHAuY21kLHAudWl8fGZhbHNlLHAudmFsdWUpfX19fSk7aS5vblJlbW92ZS5hZGQoZnVuY3Rpb24oKXtqLmRlc3Ryb3koKX0pO2lmKGMuaXNJRSl7ai5vblNob3dNZW51LmFkZChmdW5jdGlvbigpe2kuZm9jdXMoKTtnPWkuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpfSk7ai5vbkhpZGVNZW51LmFkZChmdW5jdGlvbigpe2lmKGcpe2kuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGcpO2c9MH19KX1yZXR1cm4gbS5hZGQoail9LGNyZWF0ZUxpc3RCb3g6ZnVuY3Rpb24obSxpLGwpe3ZhciBoPXRoaXMsZz1oLmVkaXRvcixqLGssZjtpZihoLmdldChtKSl7cmV0dXJuIG51bGx9aS50aXRsZT1nLnRyYW5zbGF0ZShpLnRpdGxlKTtpLnNjb3BlPWkuc2NvcGV8fGc7aWYoIWkub25zZWxlY3Qpe2kub25zZWxlY3Q9ZnVuY3Rpb24obil7Zy5leGVjQ29tbWFuZChpLmNtZCxpLnVpfHxmYWxzZSxufHxpLnZhbHVlKX19aT1lKHt0aXRsZTppLnRpdGxlLCJjbGFzcyI6Im1jZV8iK20sc2NvcGU6aS5zY29wZSxjb250cm9sX21hbmFnZXI6aH0saSk7bT1oLnByZWZpeCttO2lmKGcuc2V0dGluZ3MudXNlX25hdGl2ZV9zZWxlY3RzKXtrPW5ldyBjLnVpLk5hdGl2ZUxpc3RCb3gobSxpKX1lbHNle2Y9bHx8aC5fY2xzLmxpc3Rib3h8fGMudWkuTGlzdEJveDtrPW5ldyBmKG0saSl9aC5jb250cm9sc1ttXT1rO2lmKGMuaXNXZWJLaXQpe2sub25Qb3N0UmVuZGVyLmFkZChmdW5jdGlvbihwLG8pe2EuYWRkKG8sIm1vdXNlZG93biIsZnVuY3Rpb24oKXtnLmJvb2ttYXJrPWcuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpfSk7YS5hZGQobywiZm9jdXMiLGZ1bmN0aW9uKCl7Zy5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoZy5ib29rbWFyayk7Zy5ib29rbWFyaz1udWxsfSl9KX1pZihrLmhpZGVNZW51KXtnLm9uTW91c2VEb3duLmFkZChrLmhpZGVNZW51LGspfXJldHVybiBoLmFkZChrKX0sY3JlYXRlQnV0dG9uOmZ1bmN0aW9uKG0saSxsKXt2YXIgaD10aGlzLGc9aC5lZGl0b3IsaixrLGY7aWYoaC5nZXQobSkpe3JldHVybiBudWxsfWkudGl0bGU9Zy50cmFuc2xhdGUoaS50aXRsZSk7aS5sYWJlbD1nLnRyYW5zbGF0ZShpLmxhYmVsKTtpLnNjb3BlPWkuc2NvcGV8fGc7aWYoIWkub25jbGljayYmIWkubWVudV9idXR0b24pe2kub25jbGljaz1mdW5jdGlvbigpe2cuZXhlY0NvbW1hbmQoaS5jbWQsaS51aXx8ZmFsc2UsaS52YWx1ZSl9fWk9ZSh7dGl0bGU6aS50aXRsZSwiY2xhc3MiOiJtY2VfIittLHVuYXZhaWxhYmxlX3ByZWZpeDpnLmdldExhbmcoInVuYXZhaWxhYmxlIiwiIiksc2NvcGU6aS5zY29wZSxjb250cm9sX21hbmFnZXI6aH0saSk7bT1oLnByZWZpeCttO2lmKGkubWVudV9idXR0b24pe2Y9bHx8aC5fY2xzLm1lbnVidXR0b258fGMudWkuTWVudUJ1dHRvbjtrPW5ldyBmKG0saSk7Zy5vbk1vdXNlRG93bi5hZGQoay5oaWRlTWVudSxrKX1lbHNle2Y9aC5fY2xzLmJ1dHRvbnx8Yy51aS5CdXR0b247az1uZXcgZihtLGkpfXJldHVybiBoLmFkZChrKX0sY3JlYXRlTWVudUJ1dHRvbjpmdW5jdGlvbihoLGYsZyl7Zj1mfHx7fTtmLm1lbnVfYnV0dG9uPTE7cmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKGgsZixnKX0sY3JlYXRlU3BsaXRCdXR0b246ZnVuY3Rpb24obSxpLGwpe3ZhciBoPXRoaXMsZz1oLmVkaXRvcixqLGssZjtpZihoLmdldChtKSl7cmV0dXJuIG51bGx9aS50aXRsZT1nLnRyYW5zbGF0ZShpLnRpdGxlKTtpLnNjb3BlPWkuc2NvcGV8fGc7aWYoIWkub25jbGljayl7aS5vbmNsaWNrPWZ1bmN0aW9uKG4pe2cuZXhlY0NvbW1hbmQoaS5jbWQsaS51aXx8ZmFsc2Usbnx8aS52YWx1ZSl9fWlmKCFpLm9uc2VsZWN0KXtpLm9uc2VsZWN0PWZ1bmN0aW9uKG4pe2cuZXhlY0NvbW1hbmQoaS5jbWQsaS51aXx8ZmFsc2Usbnx8aS52YWx1ZSl9fWk9ZSh7dGl0bGU6aS50aXRsZSwiY2xhc3MiOiJtY2VfIittLHNjb3BlOmkuc2NvcGUsY29udHJvbF9tYW5hZ2VyOmh9LGkpO209aC5wcmVmaXgrbTtmPWx8fGguX2Nscy5zcGxpdGJ1dHRvbnx8Yy51aS5TcGxpdEJ1dHRvbjtrPWguYWRkKG5ldyBmKG0saSkpO2cub25Nb3VzZURvd24uYWRkKGsuaGlkZU1lbnUsayk7cmV0dXJuIGt9LGNyZWF0ZUNvbG9yU3BsaXRCdXR0b246ZnVuY3Rpb24oZixuLGgpe3ZhciBsPXRoaXMsaj1sLmVkaXRvcixpLGssbSxnO2lmKGwuZ2V0KGYpKXtyZXR1cm4gbnVsbH1uLnRpdGxlPWoudHJhbnNsYXRlKG4udGl0bGUpO24uc2NvcGU9bi5zY29wZXx8ajtpZighbi5vbmNsaWNrKXtuLm9uY2xpY2s9ZnVuY3Rpb24obyl7aWYoYy5pc0lFKXtnPWouc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpfWouZXhlY0NvbW1hbmQobi5jbWQsbi51aXx8ZmFsc2Usb3x8bi52YWx1ZSl9fWlmKCFuLm9uc2VsZWN0KXtuLm9uc2VsZWN0PWZ1bmN0aW9uKG8pe2ouZXhlY0NvbW1hbmQobi5jbWQsbi51aXx8ZmFsc2Usb3x8bi52YWx1ZSl9fW49ZSh7dGl0bGU6bi50aXRsZSwiY2xhc3MiOiJtY2VfIitmLG1lbnVfY2xhc3M6ai5nZXRQYXJhbSgic2tpbiIpKyJTa2luIixzY29wZTpuLnNjb3BlLG1vcmVfY29sb3JzX3RpdGxlOmouZ2V0TGFuZygibW9yZV9jb2xvcnMiKX0sbik7Zj1sLnByZWZpeCtmO209aHx8bC5fY2xzLmNvbG9yc3BsaXRidXR0b258fGMudWkuQ29sb3JTcGxpdEJ1dHRvbjtrPW5ldyBtKGYsbik7ai5vbk1vdXNlRG93bi5hZGQoay5oaWRlTWVudSxrKTtqLm9uUmVtb3ZlLmFkZChmdW5jdGlvbigpe2suZGVzdHJveSgpfSk7aWYoYy5pc0lFKXtrLm9uU2hvd01lbnUuYWRkKGZ1bmN0aW9uKCl7ai5mb2N1cygpO2c9ai5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMSl9KTtrLm9uSGlkZU1lbnUuYWRkKGZ1bmN0aW9uKCl7aWYoZyl7ai5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoZyk7Zz0wfX0pfXJldHVybiBsLmFkZChrKX0sY3JlYXRlVG9vbGJhcjpmdW5jdGlvbihrLGgsail7dmFyIGksZz10aGlzLGY7az1nLnByZWZpeCtrO2Y9anx8Zy5fY2xzLnRvb2xiYXJ8fGMudWkuVG9vbGJhcjtpPW5ldyBmKGssaCk7aWYoZy5nZXQoaykpe3JldHVybiBudWxsfXJldHVybiBnLmFkZChpKX0sY3JlYXRlU2VwYXJhdG9yOmZ1bmN0aW9uKGcpe3ZhciBmPWd8fHRoaXMuX2Nscy5zZXBhcmF0b3J8fGMudWkuU2VwYXJhdG9yO3JldHVybiBuZXcgZigpfSxzZXRDb250cm9sVHlwZTpmdW5jdGlvbihnLGYpe3JldHVybiB0aGlzLl9jbHNbZy50b0xvd2VyQ2FzZSgpXT1mfSxkZXN0cm95OmZ1bmN0aW9uKCl7ZCh0aGlzLmNvbnRyb2xzLGZ1bmN0aW9uKGYpe2YuZGVzdHJveSgpfSk7dGhpcy5jb250cm9scz1udWxsfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGQpe3ZhciBhPWQudXRpbC5EaXNwYXRjaGVyLGU9ZC5lYWNoLGM9ZC5pc0lFLGI9ZC5pc09wZXJhO2QuY3JlYXRlKCJ0aW55bWNlLldpbmRvd01hbmFnZXIiLHtXaW5kb3dNYW5hZ2VyOmZ1bmN0aW9uKGYpe3ZhciBnPXRoaXM7Zy5lZGl0b3I9ZjtnLm9uT3Blbj1uZXcgYShnKTtnLm9uQ2xvc2U9bmV3IGEoZyk7Zy5wYXJhbXM9e307Zy5mZWF0dXJlcz17fX0sb3BlbjpmdW5jdGlvbih6LGgpe3ZhciB2PXRoaXMsaz0iIixuLG0saT12LmVkaXRvci5zZXR0aW5ncy5kaWFsb2dfdHlwZT09Im1vZGFsIixxLG8saixnPWQuRE9NLmdldFZpZXdQb3J0KCkscjt6PXp8fHt9O2g9aHx8e307bz1iP2cudzpzY3JlZW4ud2lkdGg7aj1iP2cuaDpzY3JlZW4uaGVpZ2h0O3oubmFtZT16Lm5hbWV8fCJtY18iK25ldyBEYXRlKCkuZ2V0VGltZSgpO3oud2lkdGg9cGFyc2VJbnQoei53aWR0aHx8MzIwKTt6LmhlaWdodD1wYXJzZUludCh6LmhlaWdodHx8MjQwKTt6LnJlc2l6YWJsZT10cnVlO3oubGVmdD16LmxlZnR8fHBhcnNlSW50KG8vMiktKHoud2lkdGgvMik7ei50b3A9ei50b3B8fHBhcnNlSW50KGovMiktKHouaGVpZ2h0LzIpO2guaW5saW5lPWZhbHNlO2gubWNlX3dpZHRoPXoud2lkdGg7aC5tY2VfaGVpZ2h0PXouaGVpZ2h0O2gubWNlX2F1dG9fZm9jdXM9ei5hdXRvX2ZvY3VzO2lmKGkpe2lmKGMpe3ouY2VudGVyPXRydWU7ei5oZWxwPWZhbHNlO3ouZGlhbG9nV2lkdGg9ei53aWR0aCsicHgiO3ouZGlhbG9nSGVpZ2h0PXouaGVpZ2h0KyJweCI7ei5zY3JvbGw9ei5zY3JvbGxiYXJzfHxmYWxzZX19ZSh6LGZ1bmN0aW9uKHAsZil7aWYoZC5pcyhwLCJib29sZWFuIikpe3A9cD8ieWVzIjoibm8ifWlmKCEvXihuYW1lfHVybCkkLy50ZXN0KGYpKXtpZihjJiZpKXtrKz0oaz8iOyI6IiIpK2YrIjoiK3B9ZWxzZXtrKz0oaz8iLCI6IiIpK2YrIj0iK3B9fX0pO3YuZmVhdHVyZXM9ejt2LnBhcmFtcz1oO3Yub25PcGVuLmRpc3BhdGNoKHYseixoKTtyPXoudXJsfHx6LmZpbGU7cj1kLl9hZGRWZXIocik7dHJ5e2lmKGMmJmkpe3E9MTt3aW5kb3cuc2hvd01vZGFsRGlhbG9nKHIsd2luZG93LGspfWVsc2V7cT13aW5kb3cub3BlbihyLHoubmFtZSxrKX19Y2F0Y2gobCl7fWlmKCFxKXthbGVydCh2LmVkaXRvci5nZXRMYW5nKCJwb3B1cF9ibG9ja2VkIikpfX0sY2xvc2U6ZnVuY3Rpb24oZil7Zi5jbG9zZSgpO3RoaXMub25DbG9zZS5kaXNwYXRjaCh0aGlzKX0sY3JlYXRlSW5zdGFuY2U6ZnVuY3Rpb24oaSxoLGcsbSxsLGspe3ZhciBqPWQucmVzb2x2ZShpKTtyZXR1cm4gbmV3IGooaCxnLG0sbCxrKX0sY29uZmlybTpmdW5jdGlvbihoLGYsaSxnKXtnPWd8fHdpbmRvdztmLmNhbGwoaXx8dGhpcyxnLmNvbmZpcm0odGhpcy5fZGVjb2RlKHRoaXMuZWRpdG9yLmdldExhbmcoaCxoKSkpKX0sYWxlcnQ6ZnVuY3Rpb24oaCxmLGosZyl7dmFyIGk9dGhpcztnPWd8fHdpbmRvdztnLmFsZXJ0KGkuX2RlY29kZShpLmVkaXRvci5nZXRMYW5nKGgsaCkpKTtpZihmKXtmLmNhbGwoanx8aSl9fSxyZXNpemVCeTpmdW5jdGlvbihmLGcsaCl7aC5yZXNpemVCeShmLGcpfSxfZGVjb2RlOmZ1bmN0aW9uKGYpe3JldHVybiBkLkRPTS5kZWNvZGUoZikucmVwbGFjZSgvXFxuL2csIlxuIil9fSl9KHRpbnltY2UpKTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3ZhciBkPXt9LGM9e30sZT17fTtmdW5jdGlvbiBmKGosaSxoLGcpe2lmKHR5cGVvZihpKT09InN0cmluZyIpe2k9W2ldfWEuZWFjaChpLGZ1bmN0aW9uKGspe2pbay50b0xvd2VyQ2FzZSgpXT17ZnVuYzpoLHNjb3BlOmd9fSl9YS5leHRlbmQodGhpcyx7YWRkOmZ1bmN0aW9uKGksaCxnKXtmKGQsaSxoLGcpfSxhZGRRdWVyeVN0YXRlSGFuZGxlcjpmdW5jdGlvbihpLGgsZyl7ZihjLGksaCxnKX0sYWRkUXVlcnlWYWx1ZUhhbmRsZXI6ZnVuY3Rpb24oaSxoLGcpe2YoZSxpLGgsZyl9LGV4ZWNDb21tYW5kOmZ1bmN0aW9uKGgsayxqLGksZyl7aWYoaz1kW2sudG9Mb3dlckNhc2UoKV0pe2lmKGsuZnVuYy5jYWxsKGh8fGsuc2NvcGUsaixpLGcpIT09ZmFsc2Upe3JldHVybiB0cnVlfX19LHF1ZXJ5Q29tbWFuZFZhbHVlOmZ1bmN0aW9uKCl7aWYoY21kPWVbY21kLnRvTG93ZXJDYXNlKCldKXtyZXR1cm4gY21kLmZ1bmMuY2FsbChzY29wZXx8Y21kLnNjb3BlLHVpLHZhbHVlLGFyZ3MpfX0scXVlcnlDb21tYW5kU3RhdGU6ZnVuY3Rpb24oKXtpZihjbWQ9Y1tjbWQudG9Mb3dlckNhc2UoKV0pe3JldHVybiBjbWQuZnVuYy5jYWxsKHNjb3BlfHxjbWQuc2NvcGUsdWksdmFsdWUsYXJncyl9fX0pfWEuR2xvYmFsQ29tbWFuZHM9bmV3IGIoKX0pKHRpbnltY2UpOyhmdW5jdGlvbihhKXthLkZvcm1hdHRlcj1mdW5jdGlvbihUKXt2YXIgSz17fSxNPWEuZWFjaCxjPVQuZG9tLHA9VC5zZWxlY3Rpb24scz1hLmRvbS5UcmVlV2Fsa2VyLEk9bmV3IGEuZG9tLlJhbmdlVXRpbHMoYyksZD1ULnNjaGVtYS5pc1ZhbGlkLEU9Yy5pc0Jsb2NrLGs9VC5zZXR0aW5ncy5mb3JjZWRfcm9vdF9ibG9jayxyPWMubm9kZUluZGV4LEQ9Ilx1RkVGRiIsZT0vXihzcmN8aHJlZnxzdHlsZSkkLyxRPWZhbHNlLEE9dHJ1ZSxvLE49e2FwcGx5OltdLHJlbW92ZTpbXX07ZnVuY3Rpb24geShVKXtyZXR1cm4gVSBpbnN0YW5jZW9mIEFycmF5fWZ1bmN0aW9uIGwoVixVKXtyZXR1cm4gYy5nZXRQYXJlbnRzKFYsVSxjLmdldFJvb3QoKSl9ZnVuY3Rpb24gYihVKXtyZXR1cm4gVS5ub2RlVHlwZT09PTEmJihVLmZhY2U9PT0ibWNlaW5saW5lInx8VS5zdHlsZS5mb250RmFtaWx5PT09Im1jZWlubGluZSIpfWZ1bmN0aW9uIFAoVSl7cmV0dXJuIFU/S1tVXTpLfWZ1bmN0aW9uIGooVSxWKXtpZihVKXtpZih0eXBlb2YoVSkhPT0ic3RyaW5nIil7TShVLGZ1bmN0aW9uKFgsVyl7aihXLFgpfSl9ZWxzZXtWPVYubGVuZ3RoP1Y6W1ZdO00oVixmdW5jdGlvbihXKXtpZihXLmRlZXA9PT1vKXtXLmRlZXA9IVcuc2VsZWN0b3J9aWYoVy5zcGxpdD09PW8pe1cuc3BsaXQ9IVcuc2VsZWN0b3J8fFcuaW5saW5lfWlmKFcucmVtb3ZlPT09byYmVy5zZWxlY3RvciYmIVcuaW5saW5lKXtXLnJlbW92ZT0ibm9uZSJ9aWYoVy5zZWxlY3RvciYmVy5pbmxpbmUpe1cubWl4ZWQ9dHJ1ZTtXLmJsb2NrX2V4cGFuZD10cnVlfWlmKHR5cGVvZihXLmNsYXNzZXMpPT09InN0cmluZyIpe1cuY2xhc3Nlcz1XLmNsYXNzZXMuc3BsaXQoL1xzKy8pfX0pO0tbVV09Vn19fWZ1bmN0aW9uIFIoVyxhYyxZKXt2YXIgWj1QKFcpLGFkPVpbMF0sYWIsVixhYTtmdW5jdGlvbiBYKGFnKXt2YXIgYWY9YWcuc3RhcnRDb250YWluZXIsYWo9YWcuc3RhcnRPZmZzZXQsYWksYWg7aWYoYWYubm9kZVR5cGU9PTF8fGFmLm5vZGVWYWx1ZT09PSIiKXthZj1hZi5ub2RlVHlwZT09MT9hZi5jaGlsZE5vZGVzW2FqXTphZjtpZihhZil7YWk9bmV3IHMoYWYsYWYucGFyZW50Tm9kZSk7Zm9yKGFoPWFpLmN1cnJlbnQoKTthaDthaD1haS5uZXh0KCkpe2lmKGFoLm5vZGVUeXBlPT0zJiYhZihhaCkpe2FnLnNldFN0YXJ0KGFoLDApO2JyZWFrfX19fXJldHVybiBhZ31mdW5jdGlvbiBVKGFnLGFmKXthZj1hZnx8YWQ7aWYoYWcpe00oYWYuc3R5bGVzLGZ1bmN0aW9uKGFpLGFoKXtjLnNldFN0eWxlKGFnLGFoLHEoYWksYWMpKX0pO00oYWYuYXR0cmlidXRlcyxmdW5jdGlvbihhaSxhaCl7Yy5zZXRBdHRyaWIoYWcsYWgscShhaSxhYykpfSk7TShhZi5jbGFzc2VzLGZ1bmN0aW9uKGFoKXthaD1xKGFoLGFjKTtpZighYy5oYXNDbGFzcyhhZyxhaCkpe2MuYWRkQ2xhc3MoYWcsYWgpfX0pfX1mdW5jdGlvbiBhZShhZyl7dmFyIGFmPVtdLGFpLGFoO2FpPWFkLmlubGluZXx8YWQuYmxvY2s7YWg9Yy5jcmVhdGUoYWkpO1UoYWgpO0kud2FsayhhZyxmdW5jdGlvbihhail7dmFyIGFrO2Z1bmN0aW9uIGFsKGFtKXt2YXIgYXA9YW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxhbz1hbS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYW47aWYoZyhhcCwiYnIiKSl7YWs9MDtpZihhZC5ibG9jayl7Yy5yZW1vdmUoYW0pfXJldHVybn1pZihhZC53cmFwcGVyJiZ2KGFtLFcsYWMpKXthaz0wO3JldHVybn1pZihhZC5ibG9jayYmIWFkLndyYXBwZXImJkYoYXApKXthbT1jLnJlbmFtZShhbSxhaSk7VShhbSk7YWYucHVzaChhbSk7YWs9MDtyZXR1cm59aWYoYWQuc2VsZWN0b3Ipe00oWixmdW5jdGlvbihhcSl7aWYoYy5pcyhhbSxhcS5zZWxlY3RvcikmJiFiKGFtKSl7VShhbSxhcSk7YW49dHJ1ZX19KTtpZighYWQuaW5saW5lfHxhbil7YWs9MDtyZXR1cm59fWlmKChhZC53cmFwX2xpbmtzIT09ZmFsc2V8fGFwIT0iYSIpJiZkKGFpLGFwKSYmZChhbyxhaSkpe2lmKCFhayl7YWs9YWguY2xvbmVOb2RlKFEpO2FtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGFrLGFtKTthZi5wdXNoKGFrKX1hay5hcHBlbmRDaGlsZChhbSl9ZWxzZXthaz0wO00oYS5ncmVwKGFtLmNoaWxkTm9kZXMpLGFsKTthaz0wfX1NKGFqLGFsKX0pO00oYWYsZnVuY3Rpb24oYWwpe3ZhciBhajtmdW5jdGlvbiBhbShhbyl7dmFyIGFuPTA7TShhby5jaGlsZE5vZGVzLGZ1bmN0aW9uKGFwKXtpZighZihhcCkmJiFHKGFwKSl7YW4rK319KTtyZXR1cm4gYW59ZnVuY3Rpb24gYWsoYW4pe3ZhciBhcCxhbztNKGFuLmNoaWxkTm9kZXMsZnVuY3Rpb24oYXEpe2lmKGFxLm5vZGVUeXBlPT0xJiYhRyhhcSkmJiFiKGFxKSl7YXA9YXE7cmV0dXJuIFF9fSk7aWYoYXAmJmgoYXAsYWQpKXthbz1hcC5jbG9uZU5vZGUoUSk7VShhbyk7Yy5yZXBsYWNlKGFvLGFuLEEpO2MucmVtb3ZlKGFwLDEpfXJldHVybiBhb3x8YW59YWo9YW0oYWwpO2lmKGFqPT09MCl7Yy5yZW1vdmUoYWwsMSk7cmV0dXJufWlmKGFkLmlubGluZXx8YWQud3JhcHBlcil7aWYoIWFkLmV4YWN0JiZhaj09PTEpe2FsPWFrKGFsKX1NKFosZnVuY3Rpb24oYW4pe00oYy5zZWxlY3QoYW4uaW5saW5lLGFsKSxmdW5jdGlvbihhbyl7UyhhbixhYyxhbyxhbi5leGFjdD9hbzpudWxsKX0pfSk7aWYodihhbC5wYXJlbnROb2RlLFcsYWMpKXtjLnJlbW92ZShhbCwxKTthbD0wO3JldHVybiBBfWlmKGFkLm1lcmdlX3dpdGhfcGFyZW50cyl7Yy5nZXRQYXJlbnQoYWwucGFyZW50Tm9kZSxmdW5jdGlvbihhbil7aWYodihhbixXLGFjKSl7Yy5yZW1vdmUoYWwsMSk7YWw9MDtyZXR1cm4gQX19KX1pZihhbCl7YWw9dChCKGFsKSxhbCk7YWw9dChhbCxCKGFsLEEpKX19fSl9aWYoYWQpe2lmKFkpe1Y9Yy5jcmVhdGVSbmcoKTtWLnNldFN0YXJ0QmVmb3JlKFkpO1Yuc2V0RW5kQWZ0ZXIoWSk7YWUobihWLFopKX1lbHNle2lmKCFwLmlzQ29sbGFwc2VkKCl8fCFhZC5pbmxpbmUpe2FiPXAuZ2V0Qm9va21hcmsoKTthZShuKHAuZ2V0Um5nKEEpLFopKTtwLm1vdmVUb0Jvb2ttYXJrKGFiKTtwLnNldFJuZyhYKHAuZ2V0Um5nKEEpKSk7VC5ub2RlQ2hhbmdlZCgpfWVsc2V7TygiYXBwbHkiLFcsYWMpfX19fWZ1bmN0aW9uIHooVyxhZixaKXt2YXIgYWE9UChXKSxhaD1hYVswXSxhZSxhZCxWO2Z1bmN0aW9uIFkoYWspe3ZhciBhaj1hay5zdGFydENvbnRhaW5lcixhcD1hay5zdGFydE9mZnNldCxhbyxhbixhbCxhbTtpZihhai5ub2RlVHlwZT09MyYmYXA+PWFqLm5vZGVWYWx1ZS5sZW5ndGgtMSl7YWo9YWoucGFyZW50Tm9kZTthcD1yKGFqKSsxfWlmKGFqLm5vZGVUeXBlPT0xKXthbD1hai5jaGlsZE5vZGVzO2FqPWFsW01hdGgubWluKGFwLGFsLmxlbmd0aC0xKV07YW89bmV3IHMoYWopO2lmKGFwPmFsLmxlbmd0aC0xKXthby5uZXh0KCl9Zm9yKGFuPWFvLmN1cnJlbnQoKTthbjthbj1hby5uZXh0KCkpe2lmKGFuLm5vZGVUeXBlPT0zJiYhZihhbikpe2FtPWMuY3JlYXRlKCJhIixudWxsLEQpO2FuLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGFtLGFuKTthay5zZXRTdGFydChhbiwwKTtwLnNldFJuZyhhayk7Yy5yZW1vdmUoYW0pO3JldHVybn19fX1mdW5jdGlvbiBYKGFtKXt2YXIgYWwsYWssYWo7YWw9YS5ncmVwKGFtLmNoaWxkTm9kZXMpO2Zvcihhaz0wLGFqPWFhLmxlbmd0aDthazxhajthaysrKXtpZihTKGFhW2FrXSxhZixhbSxhbSkpe2JyZWFrfX1pZihhaC5kZWVwKXtmb3IoYWs9MCxhaj1hbC5sZW5ndGg7YWs8YWo7YWsrKyl7WChhbFtha10pfX19ZnVuY3Rpb24gYWIoYWope3ZhciBhaztNKGwoYWoucGFyZW50Tm9kZSkucmV2ZXJzZSgpLGZ1bmN0aW9uKGFsKXt2YXIgYW07aWYoIWFrJiZhbC5pZCE9Il9zdGFydCImJmFsLmlkIT0iX2VuZCIpe2FtPXYoYWwsVyxhZik7aWYoYW0mJmFtLnNwbGl0IT09ZmFsc2Upe2FrPWFsfX19KTtyZXR1cm4gYWt9ZnVuY3Rpb24gVShhbSxhaixhbyxhcil7dmFyIGF0LGFxLGFwLGFsLGFuLGFrO2lmKGFtKXthaz1hbS5wYXJlbnROb2RlO2ZvcihhdD1hai5wYXJlbnROb2RlO2F0JiZhdCE9YWs7YXQ9YXQucGFyZW50Tm9kZSl7YXE9YXQuY2xvbmVOb2RlKFEpO2Zvcihhbj0wO2FuPGFhLmxlbmd0aDthbisrKXtpZihTKGFhW2FuXSxhZixhcSxhcSkpe2FxPTA7YnJlYWt9fWlmKGFxKXtpZihhcCl7YXEuYXBwZW5kQ2hpbGQoYXApfWlmKCFhbCl7YWw9YXF9YXA9YXF9fWlmKGFyJiYoIWFoLm1peGVkfHwhRShhbSkpKXthaj1jLnNwbGl0KGFtLGFqKX1pZihhcCl7YW8ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYXAsYW8pO2FsLmFwcGVuZENoaWxkKGFvKX19cmV0dXJuIGFqfWZ1bmN0aW9uIGFnKGFqKXtyZXR1cm4gVShhYihhaiksYWosYWosdHJ1ZSl9ZnVuY3Rpb24gYWMoYWwpe3ZhciBhaz1jLmdldChhbD8iX3N0YXJ0IjoiX2VuZCIpLGFqPWFrW2FsPyJmaXJzdENoaWxkIjoibGFzdENoaWxkIl07aWYoRyhhaikpe2FqPWFqW2FsPyJmaXJzdENoaWxkIjoibGFzdENoaWxkIl19Yy5yZW1vdmUoYWssdHJ1ZSk7cmV0dXJuIGFqfWZ1bmN0aW9uIGFpKGFqKXt2YXIgYWssYWw7YWo9bihhaixhYSxBKTtpZihhaC5zcGxpdCl7YWs9SChhaixBKTthbD1IKGFqKTtpZihhayE9YWwpe2FrPUwoYWssInNwYW4iLHtpZDoiX3N0YXJ0IixfbWNlX3R5cGU6ImJvb2ttYXJrIn0pO2FsPUwoYWwsInNwYW4iLHtpZDoiX2VuZCIsX21jZV90eXBlOiJib29rbWFyayJ9KTthZyhhayk7YWcoYWwpO2FrPWFjKEEpO2FsPWFjKCl9ZWxzZXthaz1hbD1hZyhhayl9YWouc3RhcnRDb250YWluZXI9YWsucGFyZW50Tm9kZTthai5zdGFydE9mZnNldD1yKGFrKTthai5lbmRDb250YWluZXI9YWwucGFyZW50Tm9kZTthai5lbmRPZmZzZXQ9cihhbCkrMX1JLndhbGsoYWosZnVuY3Rpb24oYW0pe00oYW0sZnVuY3Rpb24oYW4pe1goYW4pfSl9KX1pZihaKXtWPWMuY3JlYXRlUm5nKCk7Vi5zZXRTdGFydEJlZm9yZShaKTtWLnNldEVuZEFmdGVyKFopO2FpKFYpO3JldHVybn1pZighcC5pc0NvbGxhcHNlZCgpfHwhYWguaW5saW5lKXthZT1wLmdldEJvb2ttYXJrKCk7YWkocC5nZXRSbmcoQSkpO3AubW92ZVRvQm9va21hcmsoYWUpO2lmKGkoVyxhZixwLmdldFN0YXJ0KCkpKXtZKHAuZ2V0Um5nKHRydWUpKX1ULm5vZGVDaGFuZ2VkKCl9ZWxzZXtPKCJyZW1vdmUiLFcsYWYpfX1mdW5jdGlvbiBDKFUsVyxWKXtpZihpKFUsVyxWKSl7eihVLFcsVil9ZWxzZXtSKFUsVyxWKX19ZnVuY3Rpb24gdihWLFUsYWEsWSl7dmFyIFc9UChVKSxhYixaLFg7ZnVuY3Rpb24gYWMoYWcsYWksYWope3ZhciBhZixhaCxhZD1haVthal0sYWU7aWYoYWQpe2lmKGFkLmxlbmd0aD09PW8pe2ZvcihhZiBpbiBhZCl7aWYoYWQuaGFzT3duUHJvcGVydHkoYWYpKXtpZihhaj09PSJhdHRyaWJ1dGVzIil7YWg9Yy5nZXRBdHRyaWIoYWcsYWYpfWVsc2V7YWg9SihhZyxhZil9aWYoWSYmIWFoJiYhYWkuZXhhY3Qpe3JldHVybn1pZigoIVl8fGFpLmV4YWN0KSYmIWcoYWgscShhZFthZl0sYWEpKSl7cmV0dXJufX19fWVsc2V7Zm9yKGFlPTA7YWU8YWQubGVuZ3RoO2FlKyspe2lmKGFqPT09ImF0dHJpYnV0ZXMiP2MuZ2V0QXR0cmliKGFnLGFkW2FlXSk6SihhZyxhZFthZV0pKXtyZXR1cm4gYWl9fX19cmV0dXJuIGFpfWlmKFcmJlYpe2ZvcihaPTA7WjxXLmxlbmd0aDtaKyspe2FiPVdbWl07aWYoaChWLGFiKSYmYWMoVixhYiwiYXR0cmlidXRlcyIpJiZhYyhWLGFiLCJzdHlsZXMiKSl7aWYoWD1hYi5jbGFzc2VzKXtmb3IoWj0wO1o8WC5sZW5ndGg7WisrKXtpZighYy5oYXNDbGFzcyhWLFhbWl0pKXtyZXR1cm59fX1yZXR1cm4gYWJ9fX19ZnVuY3Rpb24gaShXLFosWSl7dmFyIFYsWDtmdW5jdGlvbiBVKGFhKXthYT1jLmdldFBhcmVudChhYSxmdW5jdGlvbihhYil7cmV0dXJuICEhdihhYixXLFosdHJ1ZSl9KTtyZXR1cm4gdihhYSxXLFopfWlmKFkpe3JldHVybiBVKFkpfWlmKHAuaXNDb2xsYXBzZWQoKSl7Zm9yKFg9Ti5hcHBseS5sZW5ndGgtMTtYPj0wO1gtLSl7aWYoTi5hcHBseVtYXS5uYW1lPT1XKXtyZXR1cm4gdHJ1ZX19Zm9yKFg9Ti5yZW1vdmUubGVuZ3RoLTE7WD49MDtYLS0pe2lmKE4ucmVtb3ZlW1hdLm5hbWU9PVcpe3JldHVybiBmYWxzZX19cmV0dXJuIFUocC5nZXROb2RlKCkpfVk9cC5nZXROb2RlKCk7aWYoVShZKSl7cmV0dXJuIEF9Vj1wLmdldFN0YXJ0KCk7aWYoViE9WSl7aWYoVShWKSl7cmV0dXJuIEF9fXJldHVybiBRfWZ1bmN0aW9uIHUoYWIsYWEpe3ZhciBZLFo9W10sWD17fSxXLFYsVTtpZihwLmlzQ29sbGFwc2VkKCkpe2ZvcihWPTA7VjxhYi5sZW5ndGg7VisrKXtmb3IoVz1OLnJlbW92ZS5sZW5ndGgtMTtXPj0wO1ctLSl7VT1hYltWXTtpZihOLnJlbW92ZVtXXS5uYW1lPT1VKXtYW1VdPXRydWU7YnJlYWt9fX1mb3IoVz1OLmFwcGx5Lmxlbmd0aC0xO1c+PTA7Vy0tKXtmb3IoVj0wO1Y8YWIubGVuZ3RoO1YrKyl7VT1hYltWXTtpZighWFtVXSYmTi5hcHBseVtXXS5uYW1lPT1VKXtYW1VdPXRydWU7Wi5wdXNoKFUpfX19fVk9cC5nZXRTdGFydCgpO2MuZ2V0UGFyZW50KFksZnVuY3Rpb24oYWUpe3ZhciBhZCxhYztmb3IoYWQ9MDthZDxhYi5sZW5ndGg7YWQrKyl7YWM9YWJbYWRdO2lmKCFYW2FjXSYmdihhZSxhYyxhYSkpe1hbYWNdPXRydWU7Wi5wdXNoKGFjKX19fSk7cmV0dXJuIFp9ZnVuY3Rpb24geChZKXt2YXIgYWE9UChZKSxYLFcsWixWLFU7aWYoYWEpe1g9cC5nZXRTdGFydCgpO1c9bChYKTtmb3IoVj1hYS5sZW5ndGgtMTtWPj0wO1YtLSl7VT1hYVtWXS5zZWxlY3RvcjtpZighVSl7cmV0dXJuIEF9Zm9yKFo9Vy5sZW5ndGgtMTtaPj0wO1otLSl7aWYoYy5pcyhXW1pdLFUpKXtyZXR1cm4gQX19fX1yZXR1cm4gUX1hLmV4dGVuZCh0aGlzLHtnZXQ6UCxyZWdpc3RlcjpqLGFwcGx5OlIscmVtb3ZlOnosdG9nZ2xlOkMsbWF0Y2g6aSxtYXRjaEFsbDp1LG1hdGNoTm9kZTp2LGNhbkFwcGx5Onh9KTtmdW5jdGlvbiBoKFUsVil7aWYoZyhVLFYuaW5saW5lKSl7cmV0dXJuIEF9aWYoZyhVLFYuYmxvY2spKXtyZXR1cm4gQX1pZihWLnNlbGVjdG9yKXtyZXR1cm4gYy5pcyhVLFYuc2VsZWN0b3IpfX1mdW5jdGlvbiBnKFYsVSl7Vj1WfHwiIjtVPVV8fCIiO1Y9IiIrKFYubm9kZU5hbWV8fFYpO1U9IiIrKFUubm9kZU5hbWV8fFUpO3JldHVybiBWLnRvTG93ZXJDYXNlKCk9PVUudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBKKFYsVSl7dmFyIFc9Yy5nZXRTdHlsZShWLFUpO2lmKFU9PSJjb2xvciJ8fFU9PSJiYWNrZ3JvdW5kQ29sb3IiKXtXPWMudG9IZXgoVyl9aWYoVT09ImZvbnRXZWlnaHQiJiZXPT03MDApe1c9ImJvbGQifXJldHVybiIiK1d9ZnVuY3Rpb24gcShVLFYpe2lmKHR5cGVvZihVKSE9InN0cmluZyIpe1U9VShWKX1lbHNle2lmKFYpe1U9VS5yZXBsYWNlKC8lKFx3KykvZyxmdW5jdGlvbihYLFcpe3JldHVybiBWW1ddfHxYfSl9fXJldHVybiBVfWZ1bmN0aW9uIGYoVSl7cmV0dXJuIFUmJlUubm9kZVR5cGU9PT0zJiYvXihbXHNcclxuXSt8KSQvLnRlc3QoVS5ub2RlVmFsdWUpfWZ1bmN0aW9uIEwoVyxWLFUpe3ZhciBYPWMuY3JlYXRlKFYsVSk7Vy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShYLFcpO1guYXBwZW5kQ2hpbGQoVyk7cmV0dXJuIFh9ZnVuY3Rpb24gbihVLGFjLFgpe3ZhciBXPVUuc3RhcnRDb250YWluZXIsWj1VLnN0YXJ0T2Zmc2V0LGFmPVUuZW5kQ29udGFpbmVyLGFhPVUuZW5kT2Zmc2V0LGFlLGFiO2Z1bmN0aW9uIGFkKGFpLGFqLGFnLGFoKXt2YXIgYWssYWw7YWg9YWh8fGMuZ2V0Um9vdCgpO2Zvcig7Oyl7YWs9YWkucGFyZW50Tm9kZTtpZihhaz09YWh8fCghYWNbMF0uYmxvY2tfZXhwYW5kJiZFKGFrKSkpe3JldHVybiBhaX1mb3IoYWU9YWtbYWpdO2FlJiZhZSE9YWk7YWU9YWVbYWddKXtpZihhZS5ub2RlVHlwZT09MSYmIUcoYWUpKXtyZXR1cm4gYWl9aWYoYWUubm9kZVR5cGU9PTMmJiFmKGFlKSl7cmV0dXJuIGFpfX1haT1haS5wYXJlbnROb2RlfXJldHVybiBhaX1pZihXLm5vZGVUeXBlPT0xJiZXLmhhc0NoaWxkTm9kZXMoKSl7YWI9Vy5jaGlsZE5vZGVzLmxlbmd0aC0xO1c9Vy5jaGlsZE5vZGVzW1o+YWI/YWI6Wl07aWYoVy5ub2RlVHlwZT09Myl7Wj0wfX1pZihhZi5ub2RlVHlwZT09MSYmYWYuaGFzQ2hpbGROb2RlcygpKXthYj1hZi5jaGlsZE5vZGVzLmxlbmd0aC0xO2FmPWFmLmNoaWxkTm9kZXNbYWE+YWI/YWI6YWEtMV07aWYoYWYubm9kZVR5cGU9PTMpe2FhPWFmLm5vZGVWYWx1ZS5sZW5ndGh9fWlmKEcoVy5wYXJlbnROb2RlKSl7Vz1XLnBhcmVudE5vZGV9aWYoRyhXKSl7Vz1XLm5leHRTaWJsaW5nfHxXfWlmKEcoYWYucGFyZW50Tm9kZSkpe2FmPWFmLnBhcmVudE5vZGV9aWYoRyhhZikpe2FmPWFmLnByZXZpb3VzU2libGluZ3x8YWZ9aWYoYWNbMF0uaW5saW5lfHxhY1swXS5ibG9ja19leHBhbmQpe1c9YWQoVywiZmlyc3RDaGlsZCIsIm5leHRTaWJsaW5nIik7YWY9YWQoYWYsImxhc3RDaGlsZCIsInByZXZpb3VzU2libGluZyIpfWlmKGFjWzBdLnNlbGVjdG9yJiZhY1swXS5leHBhbmQhPT1RJiYhYWNbMF0uaW5saW5lKXtmdW5jdGlvbiBZKGFoLGFnKXt2YXIgYWksYWosYWs7aWYoYWgubm9kZVR5cGU9PTMmJmFoLm5vZGVWYWx1ZS5sZW5ndGg9PTAmJmFoW2FnXSl7YWg9YWhbYWddfWFpPWwoYWgpO2Zvcihhaj0wO2FqPGFpLmxlbmd0aDthaisrKXtmb3IoYWs9MDthazxhYy5sZW5ndGg7YWsrKyl7aWYoYy5pcyhhaVthal0sYWNbYWtdLnNlbGVjdG9yKSl7cmV0dXJuIGFpW2FqXX19fXJldHVybiBhaH1XPVkoVywicHJldmlvdXNTaWJsaW5nIik7YWY9WShhZiwibmV4dFNpYmxpbmciKX1pZihhY1swXS5ibG9ja3x8YWNbMF0uc2VsZWN0b3Ipe2Z1bmN0aW9uIFYoYWgsYWcsYWope3ZhciBhaTtpZighYWNbMF0ud3JhcHBlcil7YWk9Yy5nZXRQYXJlbnQoYWgsYWNbMF0uYmxvY2spfWlmKCFhaSl7YWk9Yy5nZXRQYXJlbnQoYWgubm9kZVR5cGU9PTM/YWgucGFyZW50Tm9kZTphaCxFKX1pZihhaSYmYWNbMF0ud3JhcHBlcil7YWk9bChhaSwidWwsb2wiKS5yZXZlcnNlKClbMF18fGFpfWlmKCFhaSl7YWk9YWg7d2hpbGUoYWlbYWddJiYhRShhaVthZ10pKXthaT1haVthZ107aWYoZyhhaSwiYnIiKSl7YnJlYWt9fX1yZXR1cm4gYWl8fGFofVc9VihXLCJwcmV2aW91c1NpYmxpbmciKTthZj1WKGFmLCJuZXh0U2libGluZyIpO2lmKGFjWzBdLmJsb2NrKXtpZighRShXKSl7Vz1hZChXLCJmaXJzdENoaWxkIiwibmV4dFNpYmxpbmciKX1pZighRShhZikpe2FmPWFkKGFmLCJsYXN0Q2hpbGQiLCJwcmV2aW91c1NpYmxpbmciKX19fWlmKFcubm9kZVR5cGU9PTEpe1o9cihXKTtXPVcucGFyZW50Tm9kZX1pZihhZi5ub2RlVHlwZT09MSl7YWE9cihhZikrMTthZj1hZi5wYXJlbnROb2RlfXJldHVybntzdGFydENvbnRhaW5lcjpXLHN0YXJ0T2Zmc2V0OlosZW5kQ29udGFpbmVyOmFmLGVuZE9mZnNldDphYX19ZnVuY3Rpb24gUyhhYSxaLFgsVSl7dmFyIFcsVixZO2lmKCFoKFgsYWEpKXtyZXR1cm4gUX1pZihhYS5yZW1vdmUhPSJhbGwiKXtNKGFhLnN0eWxlcyxmdW5jdGlvbihhYyxhYil7YWM9cShhYyxaKTtpZih0eXBlb2YoYWIpPT09Im51bWJlciIpe2FiPWFjO1U9MH1pZighVXx8ZyhKKFUsYWIpLGFjKSl7Yy5zZXRTdHlsZShYLGFiLCIiKX1ZPTF9KTtpZihZJiZjLmdldEF0dHJpYihYLCJzdHlsZSIpPT0iIil7WC5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7WC5yZW1vdmVBdHRyaWJ1dGUoIl9tY2Vfc3R5bGUiKX1NKGFhLmF0dHJpYnV0ZXMsZnVuY3Rpb24oYWQsYWIpe3ZhciBhYzthZD1xKGFkLFopO2lmKHR5cGVvZihhYik9PT0ibnVtYmVyIil7YWI9YWQ7VT0wfWlmKCFVfHxnKGMuZ2V0QXR0cmliKFUsYWIpLGFkKSl7aWYoYWI9PSJjbGFzcyIpe2FkPWMuZ2V0QXR0cmliKFgsYWIpO2lmKGFkKXthYz0iIjtNKGFkLnNwbGl0KC9ccysvKSxmdW5jdGlvbihhZSl7aWYoL21jZVx3Ky8udGVzdChhZSkpe2FjKz0oYWM/IiAiOiIiKSthZX19KTtpZihhYyl7Yy5zZXRBdHRyaWIoWCxhYixhYyk7cmV0dXJufX19aWYoYWI9PSJjbGFzcyIpe1gucmVtb3ZlQXR0cmlidXRlKCJjbGFzc05hbWUiKX1pZihlLnRlc3QoYWIpKXtYLnJlbW92ZUF0dHJpYnV0ZSgiX21jZV8iK2FiKX1YLnJlbW92ZUF0dHJpYnV0ZShhYil9fSk7TShhYS5jbGFzc2VzLGZ1bmN0aW9uKGFiKXthYj1xKGFiLFopO2lmKCFVfHxjLmhhc0NsYXNzKFUsYWIpKXtjLnJlbW92ZUNsYXNzKFgsYWIpfX0pO1Y9Yy5nZXRBdHRyaWJzKFgpO2ZvcihXPTA7VzxWLmxlbmd0aDtXKyspe2lmKFZbV10ubm9kZU5hbWUuaW5kZXhPZigiXyIpIT09MCl7cmV0dXJuIFF9fX1pZihhYS5yZW1vdmUhPSJub25lIil7bShYLGFhKTtyZXR1cm4gQX19ZnVuY3Rpb24gbShXLFgpe3ZhciBVPVcucGFyZW50Tm9kZSxWO2lmKFguYmxvY2spe2lmKCFrKXtmdW5jdGlvbiBZKGFhLFosYWIpe2FhPUIoYWEsWixhYik7cmV0dXJuICFhYXx8KGFhLm5vZGVOYW1lPT0iQlIifHxFKGFhKSl9aWYoRShXKSYmIUUoVSkpe2lmKCFZKFcsUSkmJiFZKFcuZmlyc3RDaGlsZCxBLDEpKXtXLmluc2VydEJlZm9yZShjLmNyZWF0ZSgiYnIiKSxXLmZpcnN0Q2hpbGQpfWlmKCFZKFcsQSkmJiFZKFcubGFzdENoaWxkLFEsMSkpe1cuYXBwZW5kQ2hpbGQoYy5jcmVhdGUoImJyIikpfX19ZWxzZXtpZihVPT1jLmdldFJvb3QoKSl7aWYoIVgubGlzdF9ibG9ja3x8IWcoVyxYLmxpc3RfYmxvY2spKXtNKGEuZ3JlcChXLmNoaWxkTm9kZXMpLGZ1bmN0aW9uKFope2lmKGQoayxaLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZighVil7Vj1MKFosayl9ZWxzZXtWLmFwcGVuZENoaWxkKFopfX1lbHNle1Y9MH19KX19fX1pZihYLnNlbGVjdG9yJiZYLmlubGluZSYmIWcoWC5pbmxpbmUsVykpe3JldHVybn1jLnJlbW92ZShXLDEpfWZ1bmN0aW9uIEIoVixVLFcpe2lmKFYpe1U9VT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciO2ZvcihWPVc/VjpWW1VdO1Y7Vj1WW1VdKXtpZihWLm5vZGVUeXBlPT0xfHwhZihWKSl7cmV0dXJuIFZ9fX19ZnVuY3Rpb24gRyhVKXtyZXR1cm4gVSYmVS5ub2RlVHlwZT09MSYmVS5nZXRBdHRyaWJ1dGUoIl9tY2VfdHlwZSIpPT0iYm9va21hcmsifWZ1bmN0aW9uIHQoWSxYKXt2YXIgVSxXLFY7ZnVuY3Rpb24gYWEoYWQsYWMpe2lmKGFkLm5vZGVOYW1lIT1hYy5ub2RlTmFtZSl7cmV0dXJuIFF9ZnVuY3Rpb24gYWIoYWYpe3ZhciBhZz17fTtNKGMuZ2V0QXR0cmlicyhhZiksZnVuY3Rpb24oYWgpe3ZhciBhaT1haC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKGFpLmluZGV4T2YoIl8iKSE9PTAmJmFpIT09InN0eWxlIil7YWdbYWldPWMuZ2V0QXR0cmliKGFmLGFpKX19KTtyZXR1cm4gYWd9ZnVuY3Rpb24gYWUoYWksYWgpe3ZhciBhZyxhZjtmb3IoYWYgaW4gYWkpe2lmKGFpLmhhc093blByb3BlcnR5KGFmKSl7YWc9YWhbYWZdO2lmKGFnPT09byl7cmV0dXJuIFF9aWYoYWlbYWZdIT1hZyl7cmV0dXJuIFF9ZGVsZXRlIGFoW2FmXX19Zm9yKGFmIGluIGFoKXtpZihhaC5oYXNPd25Qcm9wZXJ0eShhZikpe3JldHVybiBRfX1yZXR1cm4gQX1pZighYWUoYWIoYWQpLGFiKGFjKSkpe3JldHVybiBRfWlmKCFhZShjLnBhcnNlU3R5bGUoYy5nZXRBdHRyaWIoYWQsInN0eWxlIikpLGMucGFyc2VTdHlsZShjLmdldEF0dHJpYihhYywic3R5bGUiKSkpKXtyZXR1cm4gUX1yZXR1cm4gQX1pZihZJiZYKXtmdW5jdGlvbiBaKGFjLGFiKXtmb3IoVz1hYztXO1c9V1thYl0pe2lmKFcubm9kZVR5cGU9PTMmJiFmKFcpKXtyZXR1cm4gYWN9aWYoVy5ub2RlVHlwZT09MSYmIUcoVykpe3JldHVybiBXfX1yZXR1cm4gYWN9WT1aKFksInByZXZpb3VzU2libGluZyIpO1g9WihYLCJuZXh0U2libGluZyIpO2lmKGFhKFksWCkpe2ZvcihXPVkubmV4dFNpYmxpbmc7VyYmVyE9WDspe1Y9VztXPVcubmV4dFNpYmxpbmc7WS5hcHBlbmRDaGlsZChWKX1jLnJlbW92ZShYKTtNKGEuZ3JlcChYLmNoaWxkTm9kZXMpLGZ1bmN0aW9uKGFiKXtZLmFwcGVuZENoaWxkKGFiKX0pO3JldHVybiBZfX1yZXR1cm4gWH1mdW5jdGlvbiBGKFUpe3JldHVybi9eKGhbMS02XXxwfGRpdnxwcmV8YWRkcmVzc3xkbHxkdHxkZCkkLy50ZXN0KFUpfWZ1bmN0aW9uIEgoVixZKXt2YXIgVSxYLFc7VT1WW1k/InN0YXJ0Q29udGFpbmVyIjoiZW5kQ29udGFpbmVyIl07WD1WW1k/InN0YXJ0T2Zmc2V0IjoiZW5kT2Zmc2V0Il07aWYoVS5ub2RlVHlwZT09MSl7Vz1VLmNoaWxkTm9kZXMubGVuZ3RoLTE7aWYoIVkmJlgpe1gtLX1VPVUuY2hpbGROb2Rlc1tYPlc/VzpYXX1yZXR1cm4gVX1mdW5jdGlvbiBPKFosVixZKXt2YXIgVyxVPU5bWl0sYWE9TltaPT0iYXBwbHkiPyJyZW1vdmUiOiJhcHBseSJdO2Z1bmN0aW9uIGFiKCl7cmV0dXJuIE4uYXBwbHkubGVuZ3RofHxOLnJlbW92ZS5sZW5ndGh9ZnVuY3Rpb24gWCgpe04uYXBwbHk9W107Ti5yZW1vdmU9W119ZnVuY3Rpb24gYWMoYWQpe00oTi5hcHBseS5yZXZlcnNlKCksZnVuY3Rpb24oYWUpe1IoYWUubmFtZSxhZS52YXJzLGFkKX0pO00oTi5yZW1vdmUucmV2ZXJzZSgpLGZ1bmN0aW9uKGFlKXt6KGFlLm5hbWUsYWUudmFycyxhZCl9KTtjLnJlbW92ZShhZCwxKTtYKCl9Zm9yKFc9VS5sZW5ndGgtMTtXPj0wO1ctLSl7aWYoVVtXXS5uYW1lPT1WKXtyZXR1cm59fVUucHVzaCh7bmFtZTpWLHZhcnM6WX0pO2ZvcihXPWFhLmxlbmd0aC0xO1c+PTA7Vy0tKXtpZihhYVtXXS5uYW1lPT1WKXthYS5zcGxpY2UoVywxKX19aWYoYWIoKSl7VC5nZXREb2MoKS5leGVjQ29tbWFuZCgiRm9udE5hbWUiLGZhbHNlLCJtY2VpbmxpbmUiKTtOLmxhc3RSbmc9cC5nZXRSbmcoKTtNKGMuc2VsZWN0KCJmb250LHNwYW4iKSxmdW5jdGlvbihhZSl7dmFyIGFkO2lmKGIoYWUpKXthZD1wLmdldEJvb2ttYXJrKCk7YWMoYWUpO3AubW92ZVRvQm9va21hcmsoYWQpO1Qubm9kZUNoYW5nZWQoKX19KTtpZighTi5pc0xpc3RlbmluZyYmYWIoKSl7Ti5pc0xpc3RlbmluZz10cnVlO00oIm9uS2V5RG93bixvbktleVVwLG9uS2V5UHJlc3Msb25Nb3VzZVVwIi5zcGxpdCgiLCIpLGZ1bmN0aW9uKGFkKXtUW2FkXS5hZGRUb1RvcChmdW5jdGlvbihhZSxhZil7aWYoYWIoKSYmIWEuZG9tLlJhbmdlVXRpbHMuY29tcGFyZVJhbmdlcyhOLmxhc3RSbmcscC5nZXRSbmcoKSkpe00oYy5zZWxlY3QoImZvbnQsc3BhbiIpLGZ1bmN0aW9uKGFoKXt2YXIgYWksYWc7aWYoYihhaCkpe2FpPWFoLmZpcnN0Q2hpbGQ7aWYoYWkpe2FjKGFoKTthZz1jLmNyZWF0ZVJuZygpO2FnLnNldFN0YXJ0KGFpLGFpLm5vZGVWYWx1ZS5sZW5ndGgpO2FnLnNldEVuZChhaSxhaS5ub2RlVmFsdWUubGVuZ3RoKTtwLnNldFJuZyhhZyk7YWUubm9kZUNoYW5nZWQoKX1lbHNle2MucmVtb3ZlKGFoKX19fSk7aWYoYWYudHlwZT09ImtleXVwInx8YWYudHlwZT09Im1vdXNldXAiKXtYKCl9fX0pfSl9fX19fSkodGlueW1jZSk7dGlueW1jZS5vbkFkZEVkaXRvci5hZGQoZnVuY3Rpb24oZSxhKXt2YXIgZCxoLGcsYz1hLnNldHRpbmdzO2lmKGMuaW5saW5lX3N0eWxlcyl7aD1lLmV4cGxvZGUoYy5mb250X3NpemVfc3R5bGVfdmFsdWVzKTtmdW5jdGlvbiBiKGosaSl7ZS5lYWNoKGksZnVuY3Rpb24obCxrKXtpZihsKXtnLnNldFN0eWxlKGosayxsKX19KTtnLnJlbmFtZShqLCJzcGFuIil9ZD17Zm9udDpmdW5jdGlvbihqLGkpe2IoaSx7YmFja2dyb3VuZENvbG9yOmkuc3R5bGUuYmFja2dyb3VuZENvbG9yLGNvbG9yOmkuY29sb3IsZm9udEZhbWlseTppLmZhY2UsZm9udFNpemU6aFtwYXJzZUludChpLnNpemUpLTFdfSl9LHU6ZnVuY3Rpb24oaixpKXtiKGkse3RleHREZWNvcmF0aW9uOiJ1bmRlcmxpbmUifSl9LHN0cmlrZTpmdW5jdGlvbihqLGkpe2IoaSx7dGV4dERlY29yYXRpb246ImxpbmUtdGhyb3VnaCJ9KX19O2Z1bmN0aW9uIGYoaSxqKXtnPWkuZG9tO2lmKGMuY29udmVydF9mb250c190b19zcGFucyl7ZS5lYWNoKGcuc2VsZWN0KCJmb250LHUsc3RyaWtlIixqLm5vZGUpLGZ1bmN0aW9uKGspe2Rbay5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXShhLmRvbSxrKX0pfX1hLm9uUHJlUHJvY2Vzcy5hZGQoZik7YS5vbkluaXQuYWRkKGZ1bmN0aW9uKCl7YS5zZWxlY3Rpb24ub25TZXRDb250ZW50LmFkZChmKX0pfX0pOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/tiny_mce_jquery_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKHdpbikgew0KCXZhciB3aGl0ZVNwYWNlUmUgPSAvXlxzKnxccyokL2csDQoJCXVuZGVmaW5lZCwgaXNSZWdFeHBCcm9rZW4gPSAnQicucmVwbGFjZSgvQSguKXxCLywgJyQxJykgPT09ICckMSc7DQoNCgl2YXIgdGlueW1jZSA9IHsNCgkJbWFqb3JWZXJzaW9uIDogJzMnLA0KDQoJCW1pbm9yVmVyc2lvbiA6ICczLjkuMycsDQoNCgkJcmVsZWFzZURhdGUgOiAnMjAxMC0xMi0yMCcsDQoNCgkJX2luaXQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZCA9IGRvY3VtZW50LCBuYSA9IG5hdmlnYXRvciwgdWEgPSBuYS51c2VyQWdlbnQsIGksIG5sLCBuLCBiYXNlLCBwLCB2Ow0KDQoJCQl0LmlzT3BlcmEgPSB3aW4ub3BlcmEgJiYgb3BlcmEuYnVpbGROdW1iZXI7DQoNCgkJCXQuaXNXZWJLaXQgPSAvV2ViS2l0Ly50ZXN0KHVhKTsNCg0KCQkJdC5pc0lFID0gIXQuaXNXZWJLaXQgJiYgIXQuaXNPcGVyYSAmJiAoL01TSUUvZ2kpLnRlc3QodWEpICYmICgvRXhwbG9yZXIvZ2kpLnRlc3QobmEuYXBwTmFtZSk7DQoNCgkJCXQuaXNJRTYgPSB0LmlzSUUgJiYgL01TSUUgWzU2XS8udGVzdCh1YSk7DQoNCgkJCXQuaXNHZWNrbyA9ICF0LmlzV2ViS2l0ICYmIC9HZWNrby8udGVzdCh1YSk7DQoNCgkJCXQuaXNNYWMgPSB1YS5pbmRleE9mKCdNYWMnKSAhPSAtMTsNCg0KCQkJdC5pc0FpciA9IC9hZG9iZWFpci9pLnRlc3QodWEpOw0KDQoJCQl0LmlzSURldmljZSA9IC8oaVBhZHxpUGhvbmUpLy50ZXN0KHVhKTsNCg0KCQkJLy8gVGlueU1DRSAuTkVUIHdlYmNvbnRyb2wgbWlnaHQgYmUgc2V0dGluZyB0aGUgdmFsdWVzIGZvciBUaW55TUNFDQoJCQlpZiAod2luLnRpbnlNQ0VQcmVJbml0KSB7DQoJCQkJdC5zdWZmaXggPSB0aW55TUNFUHJlSW5pdC5zdWZmaXg7DQoJCQkJdC5iYXNlVVJMID0gdGlueU1DRVByZUluaXQuYmFzZTsNCgkJCQl0LnF1ZXJ5ID0gdGlueU1DRVByZUluaXQucXVlcnk7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQkvLyBHZXQgc3VmZml4IGFuZCBiYXNlDQoJCQl0LnN1ZmZpeCA9ICcnOw0KDQoJCQkvLyBJZiBiYXNlIGVsZW1lbnQgZm91bmQsIGFkZCB0aGF0IGluZnJvbnQgb2YgYmFzZVVSTA0KCQkJbmwgPSBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJyk7DQoJCQlmb3IgKGk9MDsgaTxubC5sZW5ndGg7IGkrKykgew0KCQkJCWlmICh2ID0gbmxbaV0uaHJlZikgew0KCQkJCQkvLyBIb3N0IG9ubHkgdmFsdWUgbGlrZSBodHRwOi8vc2l0ZS5jb20gb3IgaHR0cDovL3NpdGUuY29tOjgwMDgNCgkJCQkJaWYgKC9eaHR0cHM/OlwvXC9bXlwvXSskLy50ZXN0KHYpKQ0KCQkJCQkJdiArPSAnLyc7DQoNCgkJCQkJYmFzZSA9IHYgPyB2Lm1hdGNoKC8uKlwvLylbMF0gOiAnJzsgLy8gR2V0IG9ubHkgZGlyZWN0b3J5DQoJCQkJfQ0KCQkJfQ0KDQoJCQlmdW5jdGlvbiBnZXRCYXNlKG4pIHsNCgkJCQlpZiAobi5zcmMgJiYgL3RpbnlfbWNlKHxfZ3ppcHxfanF1ZXJ5fF9wcm90b3R5cGV8X2Z1bGwpKF9kZXZ8X3NyYyk/LmpzLy50ZXN0KG4uc3JjKSkgew0KCQkJCQlpZiAoL18oc3JjfGRldilcLmpzL2cudGVzdChuLnNyYykpDQoJCQkJCQl0LnN1ZmZpeCA9ICdfc3JjJzsNCg0KCQkJCQlpZiAoKHAgPSBuLnNyYy5pbmRleE9mKCc/JykpICE9IC0xKQ0KCQkJCQkJdC5xdWVyeSA9IG4uc3JjLnN1YnN0cmluZyhwICsgMSk7DQoNCgkJCQkJdC5iYXNlVVJMID0gbi5zcmMuc3Vic3RyaW5nKDAsIG4uc3JjLmxhc3RJbmRleE9mKCcvJykpOw0KDQoJCQkJCS8vIElmIHBhdGggdG8gc2NyaXB0IGlzIHJlbGF0aXZlIGFuZCBhIGJhc2UgaHJlZiB3YXMgZm91bmQgYWRkIHRoYXQgb25lIGluZnJvbnQNCgkJCQkJLy8gdGhlIHNyYyBwcm9wZXJ0eSB3aWxsIGFsd2F5cyBiZSBhbiBhYnNvbHV0ZSBvbmUgb24gbm9uIElFIGJyb3dzZXJzIGFuZCBJRSA4DQoJCQkJCS8vIHNvIHRoaXMgbG9naWMgd2lsbCBiYXNpY2FsbHkgb25seSBiZSBleGVjdXRlZCBvbiBvbGRlciBJRSB2ZXJzaW9ucw0KCQkJCQlpZiAoYmFzZSAmJiB0LmJhc2VVUkwuaW5kZXhPZignOi8vJykgPT0gLTEgJiYgdC5iYXNlVVJMLmluZGV4T2YoJy8nKSAhPT0gMCkNCgkJCQkJCXQuYmFzZVVSTCA9IGJhc2UgKyB0LmJhc2VVUkw7DQoNCgkJCQkJcmV0dXJuIHQuYmFzZVVSTDsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gbnVsbDsNCgkJCX07DQoNCgkJCS8vIENoZWNrIGRvY3VtZW50DQoJCQlubCA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOw0KCQkJZm9yIChpPTA7IGk8bmwubGVuZ3RoOyBpKyspIHsNCgkJCQlpZiAoZ2V0QmFzZShubFtpXSkpDQoJCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJLy8gQ2hlY2sgaGVhZA0KCQkJbiA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsNCgkJCWlmIChuKSB7DQoJCQkJbmwgPSBuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTsNCgkJCQlmb3IgKGk9MDsgaTxubC5sZW5ndGg7IGkrKykgew0KCQkJCQlpZiAoZ2V0QmFzZShubFtpXSkpDQoJCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm47DQoJCX0sDQoNCgkJaXMgOiBmdW5jdGlvbihvLCB0KSB7DQoJCQlpZiAoIXQpDQoJCQkJcmV0dXJuIG8gIT09IHVuZGVmaW5lZDsNCg0KCQkJaWYgKHQgPT0gJ2FycmF5JyAmJiAoby5oYXNPd25Qcm9wZXJ0eSAmJiBvIGluc3RhbmNlb2YgQXJyYXkpKQ0KCQkJCXJldHVybiB0cnVlOw0KDQoJCQlyZXR1cm4gdHlwZW9mKG8pID09IHQ7DQoJCX0sDQoNCgkJZWFjaCA6IGZ1bmN0aW9uKG8sIGNiLCBzKSB7DQoJCQl2YXIgbiwgbDsNCg0KCQkJaWYgKCFvKQ0KCQkJCXJldHVybiAwOw0KDQoJCQlzID0gcyB8fCBvOw0KDQoJCQlpZiAoby5sZW5ndGggIT09IHVuZGVmaW5lZCkgew0KCQkJCS8vIEluZGV4ZWQgYXJyYXlzLCBuZWVkZWQgZm9yIFNhZmFyaQ0KCQkJCWZvciAobj0wLCBsID0gby5sZW5ndGg7IG4gPCBsOyBuKyspIHsNCgkJCQkJaWYgKGNiLmNhbGwocywgb1tuXSwgbiwgbykgPT09IGZhbHNlKQ0KCQkJCQkJcmV0dXJuIDA7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkvLyBIYXNodGFibGVzDQoJCQkJZm9yIChuIGluIG8pIHsNCgkJCQkJaWYgKG8uaGFzT3duUHJvcGVydHkobikpIHsNCgkJCQkJCWlmIChjYi5jYWxsKHMsIG9bbl0sIG4sIG8pID09PSBmYWxzZSkNCgkJCQkJCQlyZXR1cm4gMDsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIDE7DQoJCX0sDQoNCg0KCQl0cmltIDogZnVuY3Rpb24ocykgew0KCQkJcmV0dXJuIChzID8gJycgKyBzIDogJycpLnJlcGxhY2Uod2hpdGVTcGFjZVJlLCAnJyk7DQoJCX0sDQoNCgkJY3JlYXRlIDogZnVuY3Rpb24ocywgcCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzcCwgbnMsIGNuLCBzY24sIGMsIGRlID0gMDsNCg0KCQkJLy8gUGFyc2UgOiA8cHJlZml4PiA8Y2xhc3M+OjxzdXBlciBjbGFzcz4NCgkJCXMgPSAvXigoc3RhdGljKSApPyhbXHcuXSspKDooW1x3Ll0rKSk/Ly5leGVjKHMpOw0KCQkJY24gPSBzWzNdLm1hdGNoKC8oXnxcLikoXHcrKSQvaSlbMl07IC8vIENsYXNzIG5hbWUNCg0KCQkJLy8gQ3JlYXRlIG5hbWVzcGFjZSBmb3IgbmV3IGNsYXNzDQoJCQlucyA9IHQuY3JlYXRlTlMoc1szXS5yZXBsYWNlKC9cLlx3KyQvLCAnJykpOw0KDQoJCQkvLyBDbGFzcyBhbHJlYWR5IGV4aXN0cw0KCQkJaWYgKG5zW2NuXSkNCgkJCQlyZXR1cm47DQoNCgkJCS8vIE1ha2UgcHVyZSBzdGF0aWMgY2xhc3MNCgkJCWlmIChzWzJdID09ICdzdGF0aWMnKSB7DQoJCQkJbnNbY25dID0gcDsNCg0KCQkJCWlmICh0aGlzLm9uQ3JlYXRlKQ0KCQkJCQl0aGlzLm9uQ3JlYXRlKHNbMl0sIHNbM10sIG5zW2NuXSk7DQoNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCS8vIENyZWF0ZSBkZWZhdWx0IGNvbnN0cnVjdG9yDQoJCQlpZiAoIXBbY25dKSB7DQoJCQkJcFtjbl0gPSBmdW5jdGlvbigpIHt9Ow0KCQkJCWRlID0gMTsNCgkJCX0NCg0KCQkJLy8gQWRkIGNvbnN0cnVjdG9yIGFuZCBtZXRob2RzDQoJCQluc1tjbl0gPSBwW2NuXTsNCgkJCXQuZXh0ZW5kKG5zW2NuXS5wcm90b3R5cGUsIHApOw0KDQoJCQkvLyBFeHRlbmQNCgkJCWlmIChzWzVdKSB7DQoJCQkJc3AgPSB0LnJlc29sdmUoc1s1XSkucHJvdG90eXBlOw0KCQkJCXNjbiA9IHNbNV0ubWF0Y2goL1wuKFx3KykkL2kpWzFdOyAvLyBDbGFzcyBuYW1lDQoNCgkJCQkvLyBFeHRlbmQgY29uc3RydWN0b3INCgkJCQljID0gbnNbY25dOw0KCQkJCWlmIChkZSkgew0KCQkJCQkvLyBBZGQgcGFzc3Rocm91Z2ggY29uc3RydWN0b3INCgkJCQkJbnNbY25dID0gZnVuY3Rpb24oKSB7DQoJCQkJCQlyZXR1cm4gc3Bbc2NuXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KCQkJCQl9Ow0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIEFkZCBpbmhlcml0IGNvbnN0cnVjdG9yDQoJCQkJCW5zW2NuXSA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJdGhpcy5wYXJlbnQgPSBzcFtzY25dOw0KCQkJCQkJcmV0dXJuIGMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCgkJCQkJfTsNCgkJCQl9DQoJCQkJbnNbY25dLnByb3RvdHlwZVtjbl0gPSBuc1tjbl07DQoNCgkJCQkvLyBBZGQgc3VwZXIgbWV0aG9kcw0KCQkJCXQuZWFjaChzcCwgZnVuY3Rpb24oZiwgbikgew0KCQkJCQluc1tjbl0ucHJvdG90eXBlW25dID0gc3Bbbl07DQoJCQkJfSk7DQoNCgkJCQkvLyBBZGQgb3ZlcnJpZGRlbiBtZXRob2RzDQoJCQkJdC5lYWNoKHAsIGZ1bmN0aW9uKGYsIG4pIHsNCgkJCQkJLy8gRXh0ZW5kIG1ldGhvZHMgaWYgbmVlZGVkDQoJCQkJCWlmIChzcFtuXSkgew0KCQkJCQkJbnNbY25dLnByb3RvdHlwZVtuXSA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJCXRoaXMucGFyZW50ID0gc3Bbbl07DQoJCQkJCQkJcmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCgkJCQkJCX07DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlpZiAobiAhPSBjbikNCgkJCQkJCQluc1tjbl0ucHJvdG90eXBlW25dID0gZjsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBBZGQgc3RhdGljIG1ldGhvZHMNCgkJCXQuZWFjaChwWydzdGF0aWMnXSwgZnVuY3Rpb24oZiwgbikgew0KCQkJCW5zW2NuXVtuXSA9IGY7DQoJCQl9KTsNCg0KCQkJaWYgKHRoaXMub25DcmVhdGUpDQoJCQkJdGhpcy5vbkNyZWF0ZShzWzJdLCBzWzNdLCBuc1tjbl0ucHJvdG90eXBlKTsNCgkJfSwNCg0KCQl3YWxrIDogZnVuY3Rpb24obywgZiwgbiwgcykgew0KCQkJcyA9IHMgfHwgdGhpczsNCg0KCQkJaWYgKG8pIHsNCgkJCQlpZiAobikNCgkJCQkJbyA9IG9bbl07DQoNCgkJCQl0aW55bWNlLmVhY2gobywgZnVuY3Rpb24obywgaSkgew0KCQkJCQlpZiAoZi5jYWxsKHMsIG8sIGksIG4pID09PSBmYWxzZSkNCgkJCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJCQl0aW55bWNlLndhbGsobywgZiwgbiwgcyk7DQoJCQkJfSk7DQoJCQl9DQoJCX0sDQoNCgkJY3JlYXRlTlMgOiBmdW5jdGlvbihuLCBvKSB7DQoJCQl2YXIgaSwgdjsNCg0KCQkJbyA9IG8gfHwgd2luOw0KDQoJCQluID0gbi5zcGxpdCgnLicpOw0KCQkJZm9yIChpPTA7IGk8bi5sZW5ndGg7IGkrKykgew0KCQkJCXYgPSBuW2ldOw0KDQoJCQkJaWYgKCFvW3ZdKQ0KCQkJCQlvW3ZdID0ge307DQoNCgkJCQlvID0gb1t2XTsNCgkJCX0NCg0KCQkJcmV0dXJuIG87DQoJCX0sDQoNCgkJcmVzb2x2ZSA6IGZ1bmN0aW9uKG4sIG8pIHsNCgkJCXZhciBpLCBsOw0KDQoJCQlvID0gbyB8fCB3aW47DQoNCgkJCW4gPSBuLnNwbGl0KCcuJyk7DQoJCQlmb3IgKGkgPSAwLCBsID0gbi5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCgkJCQlvID0gb1tuW2ldXTsNCg0KCQkJCWlmICghbykNCgkJCQkJYnJlYWs7DQoJCQl9DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCWFkZFVubG9hZCA6IGZ1bmN0aW9uKGYsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJZiA9IHtmdW5jIDogZiwgc2NvcGUgOiBzIHx8IHRoaXN9Ow0KDQoJCQlpZiAoIXQudW5sb2Fkcykgew0KCQkJCWZ1bmN0aW9uIHVubG9hZCgpIHsNCgkJCQkJdmFyIGxpID0gdC51bmxvYWRzLCBvLCBuOw0KDQoJCQkJCWlmIChsaSkgew0KCQkJCQkJLy8gQ2FsbCB1bmxvYWQgaGFuZGxlcnMNCgkJCQkJCWZvciAobiBpbiBsaSkgew0KCQkJCQkJCW8gPSBsaVtuXTsNCg0KCQkJCQkJCWlmIChvICYmIG8uZnVuYykNCgkJCQkJCQkJby5mdW5jLmNhbGwoby5zY29wZSwgMSk7IC8vIFNlbmQgaW4gb25lIGFyZyB0byBkaXN0aW5jdCB1bmxvYWQgYW5kIHVzZXIgZGVzdHJveQ0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBEZXRhY2ggdW5sb2FkIGZ1bmN0aW9uDQoJCQkJCQlpZiAod2luLmRldGFjaEV2ZW50KSB7DQoJCQkJCQkJd2luLmRldGFjaEV2ZW50KCdvbmJlZm9yZXVubG9hZCcsIGZha2VVbmxvYWQpOw0KCQkJCQkJCXdpbi5kZXRhY2hFdmVudCgnb251bmxvYWQnLCB1bmxvYWQpOw0KCQkJCQkJfSBlbHNlIGlmICh3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcikNCgkJCQkJCQl3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndW5sb2FkJywgdW5sb2FkLCBmYWxzZSk7DQoNCgkJCQkJCS8vIERlc3Ryb3kgcmVmZXJlbmNlcw0KCQkJCQkJdC51bmxvYWRzID0gbyA9IGxpID0gdyA9IHVubG9hZCA9IDA7DQoNCgkJCQkJCS8vIFJ1biBnYXJiYXJnZSBjb2xsZWN0b3Igb24gSUUNCgkJCQkJCWlmICh3aW4uQ29sbGVjdEdhcmJhZ2UpDQoJCQkJCQkJQ29sbGVjdEdhcmJhZ2UoKTsNCgkJCQkJfQ0KCQkJCX07DQoNCgkJCQlmdW5jdGlvbiBmYWtlVW5sb2FkKCkgew0KCQkJCQl2YXIgZCA9IGRvY3VtZW50Ow0KDQoJCQkJCS8vIElzIHRoZXJlIHRoaW5ncyBzdGlsbCBsb2FkaW5nLCB0aGVuIGRvIHNvbWUgbWFnaWMNCgkJCQkJaWYgKGQucmVhZHlTdGF0ZSA9PSAnaW50ZXJhY3RpdmUnKSB7DQoJCQkJCQlmdW5jdGlvbiBzdG9wKCkgew0KCQkJCQkJCS8vIFByZXZlbnQgbWVtb3J5IGxlYWsNCgkJCQkJCQlkLmRldGFjaEV2ZW50KCdvbnN0b3AnLCBzdG9wKTsNCg0KCQkJCQkJCS8vIENhbGwgdW5sb2FkIGhhbmRsZXINCgkJCQkJCQlpZiAodW5sb2FkKQ0KCQkJCQkJCQl1bmxvYWQoKTsNCg0KCQkJCQkJCWQgPSAwOw0KCQkJCQkJfTsNCg0KCQkJCQkJLy8gRmlyZSB1bmxvYWQgd2hlbiB0aGUgY3VycmVudGx5IGxvYWRpbmcgcGFnZSBpcyBzdG9wcGVkDQoJCQkJCQlpZiAoZCkNCgkJCQkJCQlkLmF0dGFjaEV2ZW50KCdvbnN0b3AnLCBzdG9wKTsNCg0KCQkJCQkJLy8gUmVtb3ZlIG9uc3RvcCBsaXN0ZW5lciBhZnRlciBhIHdoaWxlIHRvIHByZXZlbnQgdGhlIHVubG9hZCBmdW5jdGlvbg0KCQkJCQkJLy8gdG8gZXhlY3V0ZSBpZiB0aGUgdXNlciBwcmVzc2VzIGNhbmNlbCBpbiBhbiBvbmJlZm9yZXVubG9hZA0KCQkJCQkJLy8gY29uZmlybSBkaWFsb2cgYW5kIHRoZW4gcHJlc3NlcyB0aGUgYnJvd3NlciBzdG9wIGJ1dHRvbg0KCQkJCQkJd2luLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoJCQkJCQkJaWYgKGQpDQoJCQkJCQkJCWQuZGV0YWNoRXZlbnQoJ29uc3RvcCcsIHN0b3ApOw0KCQkJCQkJfSwgMCk7DQoJCQkJCX0NCgkJCQl9Ow0KDQoJCQkJLy8gQXR0YWNoIHVubG9hZCBoYW5kbGVyDQoJCQkJaWYgKHdpbi5hdHRhY2hFdmVudCkgew0KCQkJCQl3aW4uYXR0YWNoRXZlbnQoJ29udW5sb2FkJywgdW5sb2FkKTsNCgkJCQkJd2luLmF0dGFjaEV2ZW50KCdvbmJlZm9yZXVubG9hZCcsIGZha2VVbmxvYWQpOw0KCQkJCX0gZWxzZSBpZiAod2luLmFkZEV2ZW50TGlzdGVuZXIpDQoJCQkJCXdpbi5hZGRFdmVudExpc3RlbmVyKCd1bmxvYWQnLCB1bmxvYWQsIGZhbHNlKTsNCg0KCQkJCS8vIFNldHVwIGluaXRpYWwgdW5sb2FkIGhhbmRsZXIgYXJyYXkNCgkJCQl0LnVubG9hZHMgPSBbZl07DQoJCQl9IGVsc2UNCgkJCQl0LnVubG9hZHMucHVzaChmKTsNCg0KCQkJcmV0dXJuIGY7DQoJCX0sDQoNCgkJcmVtb3ZlVW5sb2FkIDogZnVuY3Rpb24oZikgew0KCQkJdmFyIHUgPSB0aGlzLnVubG9hZHMsIHIgPSBudWxsOw0KDQoJCQl0aW55bWNlLmVhY2godSwgZnVuY3Rpb24obywgaSkgew0KCQkJCWlmIChvICYmIG8uZnVuYyA9PSBmKSB7DQoJCQkJCXUuc3BsaWNlKGksIDEpOw0KCQkJCQlyID0gZjsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQlyZXR1cm4gcjsNCgkJfSwNCg0KCQlleHBsb2RlIDogZnVuY3Rpb24ocywgZCkgew0KCQkJcmV0dXJuIHMgPyB0aW55bWNlLm1hcChzLnNwbGl0KGQgfHwgJywnKSwgdGlueW1jZS50cmltKSA6IHM7DQoJCX0sDQoNCgkJX2FkZFZlciA6IGZ1bmN0aW9uKHUpIHsNCgkJCXZhciB2Ow0KDQoJCQlpZiAoIXRoaXMucXVlcnkpDQoJCQkJcmV0dXJuIHU7DQoNCgkJCXYgPSAodS5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJicpICsgdGhpcy5xdWVyeTsNCg0KCQkJaWYgKHUuaW5kZXhPZignIycpID09IC0xKQ0KCQkJCXJldHVybiB1ICsgdjsNCg0KCQkJcmV0dXJuIHUucmVwbGFjZSgnIycsIHYgKyAnIycpOw0KCQl9LA0KDQoJCS8vIEZpeCBmdW5jdGlvbiBmb3IgSUUgOSB3aGVyZSByZWdleHBzIGlzbid0IHdvcmtpbmcgY29ycmVjdGx5DQoJCS8vIFRvZG86IHJlbW92ZSBtZSBvbmNlIE1TIGZpeGVzIHRoZSBidWcNCgkJX3JlcGxhY2UgOiBmdW5jdGlvbihmaW5kLCByZXBsYWNlLCBzdHIpIHsNCgkJCS8vIE9uIElFOSB3ZSBoYXZlIHRvIGZha2UgJHggcmVwbGFjZW1lbnQNCgkJCWlmIChpc1JlZ0V4cEJyb2tlbikgew0KCQkJCXJldHVybiBzdHIucmVwbGFjZShmaW5kLCBmdW5jdGlvbigpIHsNCgkJCQkJdmFyIHZhbCA9IHJlcGxhY2UsIGFyZ3MgPSBhcmd1bWVudHMsIGk7DQoNCgkJCQkJZm9yIChpID0gMDsgaSA8IGFyZ3MubGVuZ3RoIC0gMjsgaSsrKSB7DQoJCQkJCQlpZiAoYXJnc1tpXSA9PT0gdW5kZWZpbmVkKSB7DQoJCQkJCQkJdmFsID0gdmFsLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFwkJyArIGksICdnJyksICcnKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJdmFsID0gdmFsLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFwkJyArIGksICdnJyksIGFyZ3NbaV0pOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJcmV0dXJuIHZhbDsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJcmV0dXJuIHN0ci5yZXBsYWNlKGZpbmQsIHJlcGxhY2UpOw0KCQl9DQoNCgkJfTsNCg0KCS8vIEluaXRpYWxpemUgdGhlIEFQSQ0KCXRpbnltY2UuX2luaXQoKTsNCg0KCS8vIEV4cG9zZSB0aW55bWNlIG5hbWVzcGFjZSB0byB0aGUgZ2xvYmFsIG5hbWVzcGFjZSAod2luZG93KQ0KCXdpbi50aW55bWNlID0gd2luLnRpbnlNQ0UgPSB0aW55bWNlOw0KfSkod2luZG93KTsNCg0KKGZ1bmN0aW9uKCQsIHRpbnltY2UpIHsNCgl2YXIgaXMgPSB0aW55bWNlLmlzLCBhdHRyUmVnRXhwID0gL14oaHJlZnxzcmN8c3R5bGUpJC9pLCB1bmRlZmluZWQ7DQoNCgkvLyBqUXVlcnkgaXMgdW5kZWZpbmVkDQoJaWYgKCEkKQ0KCQlyZXR1cm4gYWxlcnQoIkxvYWQgalF1ZXJ5IGZpcnN0ISIpOw0KDQoJLy8gU3RpY2sgalF1ZXJ5IGludG8gdGhlIHRpbnltY2UgbmFtZXNwYWNlDQoJdGlueW1jZS4kID0gJDsNCg0KCS8vIFNldHVwIGFkYXB0ZXINCgl0aW55bWNlLmFkYXB0ZXIgPSB7DQoJCXBhdGNoRWRpdG9yIDogZnVuY3Rpb24oZWRpdG9yKSB7DQoJCQl2YXIgZm4gPSAkLmZuOw0KDQoJCQkvLyBBZGFwdCB0aGUgY3NzIGZ1bmN0aW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBfbWNlX3N0eWxlDQoJCQkvLyBhdHRyaWJ1dGUgZ2V0cyB1cGRhdGVkIHdpdGggdGhlIG5ldyBzdHlsZSBpbmZvcm1hdGlvbg0KCQkJZnVuY3Rpb24gY3NzKG5hbWUsIHZhbHVlKSB7DQoJCQkJdmFyIHNlbGYgPSB0aGlzOw0KDQoJCQkJLy8gUmVtb3ZlIF9tY2Vfc3R5bGUgd2hlbiBzZXQgb3BlcmF0aW9uIG9jY3Vycw0KCQkJCWlmICh2YWx1ZSkNCgkJCQkJc2VsZi5yZW1vdmVBdHRyKCdfbWNlX3N0eWxlJyk7DQoNCgkJCQlyZXR1cm4gZm4uY3NzLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7DQoJCQl9Ow0KDQoJCQkvLyBBcGFwdCB0aGUgYXR0ciBmdW5jdGlvbiB0byBtYWtlIHN1cmUgdGhhdCBpdCB1c2VzIHRoZSBfbWNlXyBwcmVmaXhlZCB2YXJpYW50cw0KCQkJZnVuY3Rpb24gYXR0cihuYW1lLCB2YWx1ZSkgew0KCQkJCXZhciBzZWxmID0gdGhpczsNCg0KCQkJCS8vIFVwZGF0ZS9yZXRyaXZlIF9tY2VfIGF0dHJpYnV0ZSB2YXJpYW50cw0KCQkJCWlmIChhdHRyUmVnRXhwLnRlc3QobmFtZSkpIHsNCgkJCQkJaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsNCgkJCQkJCS8vIFVzZSBUaW55TUNFIGJlaGF2aW9yIHdoZW4gc2V0dGluZyB0aGUgc3BlY2lmYyBhdHRyaWJ1dGVzDQoJCQkJCQlzZWxmLmVhY2goZnVuY3Rpb24oaSwgbm9kZSkgew0KCQkJCQkJCWVkaXRvci5kb20uc2V0QXR0cmliKG5vZGUsIG5hbWUsIHZhbHVlKTsNCgkJCQkJCX0pOw0KDQoJCQkJCQlyZXR1cm4gc2VsZjsNCgkJCQkJfSBlbHNlDQoJCQkJCQlyZXR1cm4gc2VsZi5hdHRyKCdfbWNlXycgKyBuYW1lKTsNCgkJCQl9DQoNCgkJCQkvLyBEZWZhdWx0IGJlaGF2aW9yDQoJCQkJcmV0dXJuIGZuLmF0dHIuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIGh0bWxQYXRjaEZ1bmMoZnVuYykgew0KCQkJCS8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB0aGF0IHByb2Nlc3Nlcw0KCQkJCS8vIHRoZSBIVE1MIGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbiB0aGlzIG1ha2VzIHN1cmUNCgkJCQkvLyB0aGF0IGhyZWYvc3JjIGV0YyBnZXRzIG1vdmVkIGludG8gdGhlIF9tY2VfIHZhcmlhbnRzDQoJCQkJcmV0dXJuIGZ1bmN0aW9uKGNvbnRlbnQpIHsNCgkJCQkJaWYgKGNvbnRlbnQpDQoJCQkJCQljb250ZW50ID0gZWRpdG9yLmRvbS5wcm9jZXNzSFRNTChjb250ZW50KTsNCg0KCQkJCQlyZXR1cm4gZnVuYy5jYWxsKHRoaXMsIGNvbnRlbnQpOw0KCQkJCX07DQoJCQl9Ow0KDQoJCQkvLyBQYXRjaCB2YXJpb3VzIGpRdWVyeSBmdW5jdGlvbnMgdG8gaGFuZGxlIHRpbnltY2Ugc3BlY2lmaWMgYXR0cmlidXRlIGFuZCBjb250ZW50IGJlaGF2aW9yDQoJCQkvLyB3ZSBkb24ndCBwYXRjaCB0aGUgalF1ZXJ5LmZuIGRpcmVjdGx5IHNpbmNlIGl0IHdpbGwgbW9zdCBsaWtlbHkgYnJlYWsgY29tcGF0aWJpbGl0eQ0KCQkJLy8gd2l0aCBvdGhlciBqUXVlcnkgbG9naWMgb24gdGhlIHBhZ2UuIE9ubHkgaW5zdGFuY2VzIGNyZWF0ZWQgYnkgVGlueU1DRSBzaG91bGQgYmUgcGF0Y2hlZC4NCgkJCWZ1bmN0aW9uIHBhdGNoKGpxKSB7DQoJCQkJLy8gUGF0Y2ggc29tZSBmdW5jdGlvbnMsIG9ubHkgcGF0Y2ggdGhlIG9iamVjdCBvbmNlDQoJCQkJaWYgKGpxLmNzcyAhPT0gY3NzKSB7DQoJCQkJCS8vIFBhdGNoIGNzcy9hdHRyIHRvIHVzZSB0aGUgX21jZV8gcHJlZml4ZWQgYXR0cmlidXRlIHZhcmlhbnRzDQoJCQkJCWpxLmNzcyA9IGNzczsNCgkJCQkJanEuYXR0ciA9IGF0dHI7DQoNCgkJCQkJLy8gUGF0Y2ggSFRNTCBmdW5jdGlvbnMgdG8gdXNlIHRoZSBET01VdGlscy5wcm9jZXNzSFRNTCBmaWx0ZXIgbG9naWMNCgkJCQkJanEuaHRtbCA9IGh0bWxQYXRjaEZ1bmMoZm4uaHRtbCk7DQoJCQkJCWpxLmFwcGVuZCA9IGh0bWxQYXRjaEZ1bmMoZm4uYXBwZW5kKTsNCgkJCQkJanEucHJlcGVuZCA9IGh0bWxQYXRjaEZ1bmMoZm4ucHJlcGVuZCk7DQoJCQkJCWpxLmFmdGVyID0gaHRtbFBhdGNoRnVuYyhmbi5hZnRlcik7DQoJCQkJCWpxLmJlZm9yZSA9IGh0bWxQYXRjaEZ1bmMoZm4uYmVmb3JlKTsNCgkJCQkJanEucmVwbGFjZVdpdGggPSBodG1sUGF0Y2hGdW5jKGZuLnJlcGxhY2VXaXRoKTsNCgkJCQkJanEudGlueW1jZSA9IGVkaXRvcjsNCg0KCQkJCQkvLyBFYWNoIHB1c2hlZCBqUXVlcnkgaW5zdGFuY2UgbmVlZHMgdG8gYmUgcGF0Y2hlZA0KCQkJCQkvLyBhcyB3ZWxsIGZvciBleGFtcGxlIHdoZW4gdHJhdmVyc2luZyB0aGUgRE9NDQoJCQkJCWpxLnB1c2hTdGFjayA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJcmV0dXJuIHBhdGNoKGZuLnB1c2hTdGFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsNCgkJCQkJfTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4ganE7DQoJCQl9Ow0KDQoJCQkvLyBBZGQgYSAkIGZ1bmN0aW9uIG9uIGVhY2ggZWRpdG9yIGluc3RhbmNlIHRoaXMgb25lIGlzIHNjb3BlZCBmb3IgdGhlIGVkaXRvciBkb2N1bWVudCBvYmplY3QNCgkJCS8vIHRoaXMgd2F5IHlvdSBjYW4gZG8gY2hhaW5pbmcgbGlrZSB0aGlzIHRpbnltY2UuZ2V0KDApLiQoJ3AnKS5hcHBlbmQoJ3RleHQnKS5jc3MoJ2NvbG9yJywgJ3JlZCcpOw0KCQkJZWRpdG9yLiQgPSBmdW5jdGlvbihzZWxlY3Rvciwgc2NvcGUpIHsNCgkJCQl2YXIgZG9jID0gZWRpdG9yLmdldERvYygpOw0KDQoJCQkJcmV0dXJuIHBhdGNoKCQoc2VsZWN0b3IgfHwgZG9jLCBkb2MgfHwgc2NvcGUpKTsNCgkJCX07DQoJCX0NCgl9Ow0KDQoJLy8gUGF0Y2ggaW4gY29yZSBOUyBmdW5jdGlvbnMNCgl0aW55bWNlLmV4dGVuZCA9ICQuZXh0ZW5kOw0KCXRpbnltY2UuZXh0ZW5kKHRpbnltY2UsIHsNCgkJbWFwIDogJC5tYXAsDQoJCWdyZXAgOiBmdW5jdGlvbihhLCBmKSB7cmV0dXJuICQuZ3JlcChhLCBmIHx8IGZ1bmN0aW9uKCl7cmV0dXJuIDE7fSk7fSwNCgkJaW5BcnJheSA6IGZ1bmN0aW9uKGEsIHYpIHtyZXR1cm4gJC5pbkFycmF5KHYsIGEgfHwgW10pO30NCg0KCQkvKiBEaWRuJ3QgaXRlcmF0ZSBzdHlsZXNoZWV0cw0KCQllYWNoIDogZnVuY3Rpb24obywgY2IsIHMpIHsNCgkJCWlmICghbykNCgkJCQlyZXR1cm4gMDsNCg0KCQkJdmFyIHIgPSAxOw0KDQoJCQkkLmVhY2gobywgZnVuY3Rpb24obnIsIGVsKXsNCgkJCQlpZiAoY2IuY2FsbChzLCBlbCwgbnIsIG8pID09PSBmYWxzZSkgew0KCQkJCQlyID0gMDsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQlyZXR1cm4gcjsNCgkJfSovDQoJfSk7DQoNCgkvLyBQYXRjaCBpbiBmdW5jdGlvbnMgaW4gdmFyaW91cyBjbGFzZXMNCgkvLyBBZGQgYSAiI2lmbmRlZmpxdWVyeSIgc3RhdGVtZW50IGFyb3VuZCBlYWNoIGNvcmUgQVBJIGZ1bmN0aW9uIHlvdSBhZGQgYmVsb3cNCgl2YXIgcGF0Y2hlcyA9IHsNCgkJJ3RpbnltY2UuZG9tLkRPTVV0aWxzJyA6IHsNCgkJCS8qDQoJCQlhZGRDbGFzcyA6IGZ1bmN0aW9uKGUsIGMpIHsNCgkJCQlpZiAoaXMoZSwgJ2FycmF5JykgJiYgaXMoZVswXSwgJ3N0cmluZycpKQ0KCQkJCQllID0gZS5qb2luKCcsIycpOw0KCQkJCXJldHVybiAoZSAmJiAkKGlzKGUsICdzdHJpbmcnKSA/ICcjJyArIGUgOiBlKQ0KCQkJCQkuYWRkQ2xhc3MoYykNCgkJCQkJLmF0dHIoJ2NsYXNzJykpIHx8IGZhbHNlOw0KCQkJfSwNCg0KCQkJaGFzQ2xhc3MgOiBmdW5jdGlvbihuLCBjKSB7DQoJCQkJcmV0dXJuICQoaXMobiwgJ3N0cmluZycpID8gJyMnICsgbiA6IG4pLmhhc0NsYXNzKGMpOw0KCQkJfSwNCg0KCQkJcmVtb3ZlQ2xhc3MgOiBmdW5jdGlvbihlLCBjKSB7DQoJCQkJaWYgKCFlKQ0KCQkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCQl2YXIgciA9IFtdOw0KDQoJCQkJJChpcyhlLCAnc3RyaW5nJykgPyAnIycgKyBlIDogZSkNCgkJCQkJLnJlbW92ZUNsYXNzKGMpDQoJCQkJCS5lYWNoKGZ1bmN0aW9uKCl7DQoJCQkJCQlyLnB1c2godGhpcy5jbGFzc05hbWUpOw0KCQkJCQl9KTsNCg0KCQkJCXJldHVybiByLmxlbmd0aCA9PSAxID8gclswXSA6IHI7DQoJCQl9LA0KCQkJKi8NCg0KCQkJc2VsZWN0IDogZnVuY3Rpb24ocGF0dGVybiwgc2NvcGUpIHsNCgkJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCQlyZXR1cm4gJC5maW5kKHBhdHRlcm4sIHQuZ2V0KHNjb3BlKSB8fCB0LmdldCh0LnNldHRpbmdzLnJvb3RfZWxlbWVudCkgfHwgdC5kb2MsIFtdKTsNCgkJCX0sDQoNCgkJCWlzIDogZnVuY3Rpb24obiwgcGF0dCkgew0KCQkJCXJldHVybiAkKHRoaXMuZ2V0KG4pKS5pcyhwYXR0KTsNCgkJCX0NCg0KCQkJLyoNCgkJCXNob3cgOiBmdW5jdGlvbihlKSB7DQoJCQkJaWYgKGlzKGUsICdhcnJheScpICYmIGlzKGVbMF0sICdzdHJpbmcnKSkNCgkJCQkJZSA9IGUuam9pbignLCMnKTsNCg0KCQkJCSQoaXMoZSwgJ3N0cmluZycpID8gJyMnICsgZSA6IGUpLmNzcygnZGlzcGxheScsICdibG9jaycpOw0KCQkJfSwNCg0KCQkJaGlkZSA6IGZ1bmN0aW9uKGUpIHsNCgkJCQlpZiAoaXMoZSwgJ2FycmF5JykgJiYgaXMoZVswXSwgJ3N0cmluZycpKQ0KCQkJCQllID0gZS5qb2luKCcsIycpOw0KDQoJCQkJJChpcyhlLCAnc3RyaW5nJykgPyAnIycgKyBlIDogZSkuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsNCgkJCX0sDQoNCgkJCWlzSGlkZGVuIDogZnVuY3Rpb24oZSkgew0KCQkJCXJldHVybiAkKGlzKGUsICdzdHJpbmcnKSA/ICcjJyArIGUgOiBlKS5pcygnOmhpZGRlbicpOw0KCQkJfSwNCg0KCQkJaW5zZXJ0QWZ0ZXIgOiBmdW5jdGlvbihuLCBlKSB7DQoJCQkJcmV0dXJuICQoaXMoZSwgJ3N0cmluZycpID8gJyMnICsgZSA6IGUpLmFmdGVyKG4pOw0KCQkJfSwNCg0KCQkJcmVwbGFjZSA6IGZ1bmN0aW9uKG8sIG4sIGspIHsNCgkJCQluID0gJChpcyhuLCAnc3RyaW5nJykgPyAnIycgKyBuIDogbik7DQoNCgkJCQlpZiAoaykNCgkJCQkJbi5jaGlsZHJlbigpLmFwcGVuZFRvKG8pOw0KDQoJCQkJbi5yZXBsYWNlV2l0aChvKTsNCgkJCX0sDQoNCgkJCXNldFN0eWxlIDogZnVuY3Rpb24obiwgbmEsIHYpIHsNCgkJCQlpZiAoaXMobiwgJ2FycmF5JykgJiYgaXMoblswXSwgJ3N0cmluZycpKQ0KCQkJCQluID0gbi5qb2luKCcsIycpOw0KDQoJCQkJJChpcyhuLCAnc3RyaW5nJykgPyAnIycgKyBuIDogbikuY3NzKG5hLCB2KTsNCgkJCX0sDQoNCgkJCWdldFN0eWxlIDogZnVuY3Rpb24obiwgbmEsIGMpIHsNCgkJCQlyZXR1cm4gJChpcyhuLCAnc3RyaW5nJykgPyAnIycgKyBuIDogbikuY3NzKG5hKTsNCgkJCX0sDQoNCgkJCXNldFN0eWxlcyA6IGZ1bmN0aW9uKGUsIG8pIHsNCgkJCQlpZiAoaXMoZSwgJ2FycmF5JykgJiYgaXMoZVswXSwgJ3N0cmluZycpKQ0KCQkJCQllID0gZS5qb2luKCcsIycpOw0KCQkJCSQoaXMoZSwgJ3N0cmluZycpID8gJyMnICsgZSA6IGUpLmNzcyhvKTsNCgkJCX0sDQoNCgkJCXNldEF0dHJpYiA6IGZ1bmN0aW9uKGUsIG4sIHYpIHsNCgkJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzOw0KDQoJCQkJaWYgKGlzKGUsICdhcnJheScpICYmIGlzKGVbMF0sICdzdHJpbmcnKSkNCgkJCQkJZSA9IGUuam9pbignLCMnKTsNCg0KCQkJCWUgPSAkKGlzKGUsICdzdHJpbmcnKSA/ICcjJyArIGUgOiBlKTsNCg0KCQkJCXN3aXRjaCAobikgew0KCQkJCQljYXNlICJzdHlsZSI6DQoJCQkJCQllLmVhY2goZnVuY3Rpb24oaSwgdil7DQoJCQkJCQkJaWYgKHMua2VlcF92YWx1ZXMpDQoJCQkJCQkJCSQodikuYXR0cignX21jZV9zdHlsZScsIHYpOw0KDQoJCQkJCQkJdi5zdHlsZS5jc3NUZXh0ID0gdjsNCgkJCQkJCX0pOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAiY2xhc3MiOg0KCQkJCQkJZS5lYWNoKGZ1bmN0aW9uKCl7DQoJCQkJCQkJdGhpcy5jbGFzc05hbWUgPSB2Ow0KCQkJCQkJfSk7DQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICJzcmMiOg0KCQkJCQljYXNlICJocmVmIjoNCgkJCQkJCWUuZWFjaChmdW5jdGlvbihpLCB2KXsNCgkJCQkJCQlpZiAocy5rZWVwX3ZhbHVlcykgew0KCQkJCQkJCQlpZiAocy51cmxfY29udmVydGVyKQ0KCQkJCQkJCQkJdiA9IHMudXJsX2NvbnZlcnRlci5jYWxsKHMudXJsX2NvbnZlcnRlcl9zY29wZSB8fCB0LCB2LCBuLCB2KTsNCg0KCQkJCQkJCQl0LnNldEF0dHJpYih2LCAnX21jZV8nICsgbiwgdik7DQoJCQkJCQkJfQ0KCQkJCQkJfSk7DQoNCgkJCQkJCWJyZWFrOw0KCQkJCX0NCg0KCQkJCWlmICh2ICE9PSBudWxsICYmIHYubGVuZ3RoICE9PSAwKQ0KCQkJCQllLmF0dHIobiwgJycgKyB2KTsNCgkJCQllbHNlDQoJCQkJCWUucmVtb3ZlQXR0cihuKTsNCgkJCX0sDQoNCgkJCXNldEF0dHJpYnMgOiBmdW5jdGlvbihlLCBvKSB7DQoJCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQkJJC5lYWNoKG8sIGZ1bmN0aW9uKG4sIHYpew0KCQkJCQl0LnNldEF0dHJpYihlLG4sdik7DQoJCQkJfSk7DQoJCQl9DQoJCQkqLw0KCQl9DQoNCi8qDQoJCSd0aW55bWNlLmRvbS5FdmVudCcgOiB7DQoJCQlhZGQgOiBmdW5jdGlvbiAobywgbiwgZiwgcykgew0KCQkJCXZhciBsbywgY2I7DQoNCgkJCQljYiA9IGZ1bmN0aW9uKGUpIHsNCgkJCQkJZS50YXJnZXQgPSBlLnRhcmdldCB8fCB0aGlzOw0KCQkJCQlmLmNhbGwocyB8fCB0aGlzLCBlKTsNCgkJCQl9Ow0KDQoJCQkJaWYgKGlzKG8sICdhcnJheScpICYmIGlzKG9bMF0sICdzdHJpbmcnKSkNCgkJCQkJbyA9IG8uam9pbignLCMnKTsNCgkJCQlvID0gJChpcyhvLCAnc3RyaW5nJykgPyAnIycgKyBvIDogbyk7DQoJCQkJaWYgKG4gPT0gJ2luaXQnKSB7DQoJCQkJCW8ucmVhZHkoY2IsIHMpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWlmIChzKSB7DQoJCQkJCQlvLmJpbmQobiwgcywgY2IpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJby5iaW5kKG4sIGNiKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCWxvID0gdGhpcy5fanFMb29rdXAgfHwgKHRoaXMuX2pxTG9va3VwID0gW10pOw0KCQkJCWxvLnB1c2goe2Z1bmMgOiBmLCBjZnVuYyA6IGNifSk7DQoNCgkJCQlyZXR1cm4gY2I7DQoJCQl9LA0KDQoJCQlyZW1vdmUgOiBmdW5jdGlvbihvLCBuLCBmKSB7DQoJCQkJLy8gRmluZCBjZnVuYw0KCQkJCSQodGhpcy5fanFMb29rdXApLmVhY2goZnVuY3Rpb24oKSB7DQoJCQkJCWlmICh0aGlzLmZ1bmMgPT09IGYpDQoJCQkJCQlmID0gdGhpcy5jZnVuYzsNCgkJCQl9KTsNCg0KCQkJCWlmIChpcyhvLCAnYXJyYXknKSAmJiBpcyhvWzBdLCAnc3RyaW5nJykpDQoJCQkJCW8gPSBvLmpvaW4oJywjJyk7DQoNCgkJCQkkKGlzKG8sICdzdHJpbmcnKSA/ICcjJyArIG8gOiBvKS51bmJpbmQobixmKTsNCg0KCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KCQl9DQoqLw0KCX07DQoNCgkvLyBQYXRjaCBmdW5jdGlvbnMgYWZ0ZXIgYSBjbGFzcyBpcyBjcmVhdGVkDQoJdGlueW1jZS5vbkNyZWF0ZSA9IGZ1bmN0aW9uKHR5LCBjLCBwKSB7DQoJCXRpbnltY2UuZXh0ZW5kKHAsIHBhdGNoZXNbY10pOw0KCX07DQp9KSh3aW5kb3cualF1ZXJ5LCB0aW55bWNlKTsNCg0KDQoNCnRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcicsIHsNCglzY29wZSA6IG51bGwsDQoJbGlzdGVuZXJzIDogbnVsbCwNCg0KCURpc3BhdGNoZXIgOiBmdW5jdGlvbihzKSB7DQoJCXRoaXMuc2NvcGUgPSBzIHx8IHRoaXM7DQoJCXRoaXMubGlzdGVuZXJzID0gW107DQoJfSwNCg0KCWFkZCA6IGZ1bmN0aW9uKGNiLCBzKSB7DQoJCXRoaXMubGlzdGVuZXJzLnB1c2goe2NiIDogY2IsIHNjb3BlIDogcyB8fCB0aGlzLnNjb3BlfSk7DQoNCgkJcmV0dXJuIGNiOw0KCX0sDQoNCglhZGRUb1RvcCA6IGZ1bmN0aW9uKGNiLCBzKSB7DQoJCXRoaXMubGlzdGVuZXJzLnVuc2hpZnQoe2NiIDogY2IsIHNjb3BlIDogcyB8fCB0aGlzLnNjb3BlfSk7DQoNCgkJcmV0dXJuIGNiOw0KCX0sDQoNCglyZW1vdmUgOiBmdW5jdGlvbihjYikgew0KCQl2YXIgbCA9IHRoaXMubGlzdGVuZXJzLCBvID0gbnVsbDsNCg0KCQl0aW55bWNlLmVhY2gobCwgZnVuY3Rpb24oYywgaSkgew0KCQkJaWYgKGNiID09IGMuY2IpIHsNCgkJCQlvID0gY2I7DQoJCQkJbC5zcGxpY2UoaSwgMSk7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfQ0KCQl9KTsNCg0KCQlyZXR1cm4gbzsNCgl9LA0KDQoJZGlzcGF0Y2ggOiBmdW5jdGlvbigpIHsNCgkJdmFyIHMsIGEgPSBhcmd1bWVudHMsIGksIGxpID0gdGhpcy5saXN0ZW5lcnMsIGM7DQoNCgkJLy8gTmVlZHMgdG8gYmUgYSByZWFsIGxvb3Agc2luY2UgdGhlIGxpc3RlbmVyIGNvdW50IG1pZ2h0IGNoYW5nZSB3aGlsZSBsb29waW5nDQoJCS8vIEFuZCB0aGlzIGlzIGFsc28gbW9yZSBlZmZpY2llbnQNCgkJZm9yIChpID0gMDsgaTxsaS5sZW5ndGg7IGkrKykgew0KCQkJYyA9IGxpW2ldOw0KCQkJcyA9IGMuY2IuYXBwbHkoYy5zY29wZSwgYSk7DQoNCgkJCWlmIChzID09PSBmYWxzZSkNCgkJCQlicmVhazsNCgkJfQ0KDQoJCXJldHVybiBzOw0KCX0NCg0KCX0pOw0KDQooZnVuY3Rpb24oKSB7DQoJdmFyIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51dGlsLlVSSScsIHsNCgkJVVJJIDogZnVuY3Rpb24odSwgcykgew0KCQkJdmFyIHQgPSB0aGlzLCBvLCBhLCBiOw0KDQoJCQkvLyBUcmltIHdoaXRlc3BhY2UNCgkJCXUgPSB0aW55bWNlLnRyaW0odSk7DQoNCgkJCS8vIERlZmF1bHQgc2V0dGluZ3MNCgkJCXMgPSB0LnNldHRpbmdzID0gcyB8fCB7fTsNCg0KCQkJLy8gU3RyYW5nZSBhcHAgcHJvdG9jb2wgb3IgbG9jYWwgYW5jaG9yDQoJCQlpZiAoL14obWFpbHRvfHRlbHxuZXdzfGphdmFzY3JpcHR8YWJvdXR8ZGF0YSk6L2kudGVzdCh1KSB8fCAvXlxzKiMvLnRlc3QodSkpIHsNCgkJCQl0LnNvdXJjZSA9IHU7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQkvLyBBYnNvbHV0ZSBwYXRoIHdpdGggbm8gaG9zdCwgZmFrZSBob3N0IGFuZCBwcm90b2NvbA0KCQkJaWYgKHUuaW5kZXhPZignLycpID09PSAwICYmIHUuaW5kZXhPZignLy8nKSAhPT0gMCkNCgkJCQl1ID0gKHMuYmFzZV91cmkgPyBzLmJhc2VfdXJpLnByb3RvY29sIHx8ICdodHRwJyA6ICdodHRwJykgKyAnOi8vbWNlX2hvc3QnICsgdTsNCg0KCQkJLy8gUmVsYXRpdmUgcGF0aCBodHRwOi8vIG9yIHByb3RvY29sIHJlbGF0aXZlIC8vcGF0aA0KCQkJaWYgKCEvXlx3Kjo/XC9cLy8udGVzdCh1KSkNCgkJCQl1ID0gKHMuYmFzZV91cmkucHJvdG9jb2wgfHwgJ2h0dHAnKSArICc6Ly9tY2VfaG9zdCcgKyB0LnRvQWJzUGF0aChzLmJhc2VfdXJpLnBhdGgsIHUpOw0KDQoJCQkvLyBQYXJzZSBVUkwgKENyZWRpdHMgZ29lcyB0byBTdGVhdmUsIGh0dHA6Ly9ibG9nLnN0ZXZlbmxldml0aGFuLmNvbS9hcmNoaXZlcy9wYXJzZXVyaSkNCgkJCXUgPSB1LnJlcGxhY2UoL0BAL2csICcobWNlX2F0KScpOyAvLyBab3BlIDMgd29ya2Fyb3VuZCwgdGhleSB1c2UgQEBzb21ldGhpbmcNCgkJCXUgPSAvXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKTo/KFteOkBdKikpP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWModSk7DQoJCQllYWNoKFsic291cmNlIiwicHJvdG9jb2wiLCJhdXRob3JpdHkiLCJ1c2VySW5mbyIsInVzZXIiLCJwYXNzd29yZCIsImhvc3QiLCJwb3J0IiwicmVsYXRpdmUiLCJwYXRoIiwiZGlyZWN0b3J5IiwiZmlsZSIsInF1ZXJ5IiwiYW5jaG9yIl0sIGZ1bmN0aW9uKHYsIGkpIHsNCgkJCQl2YXIgcyA9IHVbaV07DQoNCgkJCQkvLyBab3BlIDMgd29ya2Fyb3VuZCwgdGhleSB1c2UgQEBzb21ldGhpbmcNCgkJCQlpZiAocykNCgkJCQkJcyA9IHMucmVwbGFjZSgvXChtY2VfYXRcKS9nLCAnQEAnKTsNCg0KCQkJCXRbdl0gPSBzOw0KCQkJfSk7DQoNCgkJCWlmIChiID0gcy5iYXNlX3VyaSkgew0KCQkJCWlmICghdC5wcm90b2NvbCkNCgkJCQkJdC5wcm90b2NvbCA9IGIucHJvdG9jb2w7DQoNCgkJCQlpZiAoIXQudXNlckluZm8pDQoJCQkJCXQudXNlckluZm8gPSBiLnVzZXJJbmZvOw0KDQoJCQkJaWYgKCF0LnBvcnQgJiYgdC5ob3N0ID09ICdtY2VfaG9zdCcpDQoJCQkJCXQucG9ydCA9IGIucG9ydDsNCg0KCQkJCWlmICghdC5ob3N0IHx8IHQuaG9zdCA9PSAnbWNlX2hvc3QnKQ0KCQkJCQl0Lmhvc3QgPSBiLmhvc3Q7DQoNCgkJCQl0LnNvdXJjZSA9ICcnOw0KCQkJfQ0KDQoJCQkvL3QucGF0aCA9IHQucGF0aCB8fCAnLyc7DQoJCX0sDQoNCgkJc2V0UGF0aCA6IGZ1bmN0aW9uKHApIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJcCA9IC9eKC4qPylcLz8oXHcrKT8kLy5leGVjKHApOw0KDQoJCQkvLyBVcGRhdGUgcGF0aCBwYXJ0cw0KCQkJdC5wYXRoID0gcFswXTsNCgkJCXQuZGlyZWN0b3J5ID0gcFsxXTsNCgkJCXQuZmlsZSA9IHBbMl07DQoNCgkJCS8vIFJlYnVpbGQgc291cmNlDQoJCQl0LnNvdXJjZSA9ICcnOw0KCQkJdC5nZXRVUkkoKTsNCgkJfSwNCg0KCQl0b1JlbGF0aXZlIDogZnVuY3Rpb24odSkgew0KCQkJdmFyIHQgPSB0aGlzLCBvOw0KDQoJCQlpZiAodSA9PT0gIi4vIikNCgkJCQlyZXR1cm4gdTsNCg0KCQkJdSA9IG5ldyB0aW55bWNlLnV0aWwuVVJJKHUsIHtiYXNlX3VyaSA6IHR9KTsNCg0KCQkJLy8gTm90IG9uIHNhbWUgZG9tYWluL3BvcnQgb3IgcHJvdG9jb2wNCgkJCWlmICgodS5ob3N0ICE9ICdtY2VfaG9zdCcgJiYgdC5ob3N0ICE9IHUuaG9zdCAmJiB1Lmhvc3QpIHx8IHQucG9ydCAhPSB1LnBvcnQgfHwgdC5wcm90b2NvbCAhPSB1LnByb3RvY29sKQ0KCQkJCXJldHVybiB1LmdldFVSSSgpOw0KDQoJCQlvID0gdC50b1JlbFBhdGgodC5wYXRoLCB1LnBhdGgpOw0KDQoJCQkvLyBBZGQgcXVlcnkNCgkJCWlmICh1LnF1ZXJ5KQ0KCQkJCW8gKz0gJz8nICsgdS5xdWVyeTsNCg0KCQkJLy8gQWRkIGFuY2hvcg0KCQkJaWYgKHUuYW5jaG9yKQ0KCQkJCW8gKz0gJyMnICsgdS5hbmNob3I7DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KCQ0KCQl0b0Fic29sdXRlIDogZnVuY3Rpb24odSwgbmgpIHsNCgkJCXZhciB1ID0gbmV3IHRpbnltY2UudXRpbC5VUkkodSwge2Jhc2VfdXJpIDogdGhpc30pOw0KDQoJCQlyZXR1cm4gdS5nZXRVUkkodGhpcy5ob3N0ID09IHUuaG9zdCAmJiB0aGlzLnByb3RvY29sID09IHUucHJvdG9jb2wgPyBuaCA6IDApOw0KCQl9LA0KDQoJCXRvUmVsUGF0aCA6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsNCgkJCXZhciBpdGVtcywgYnAgPSAwLCBvdXQgPSAnJywgaSwgbDsNCg0KCQkJLy8gU3BsaXQgdGhlIHBhdGhzDQoJCQliYXNlID0gYmFzZS5zdWJzdHJpbmcoMCwgYmFzZS5sYXN0SW5kZXhPZignLycpKTsNCgkJCWJhc2UgPSBiYXNlLnNwbGl0KCcvJyk7DQoJCQlpdGVtcyA9IHBhdGguc3BsaXQoJy8nKTsNCg0KCQkJaWYgKGJhc2UubGVuZ3RoID49IGl0ZW1zLmxlbmd0aCkgew0KCQkJCWZvciAoaSA9IDAsIGwgPSBiYXNlLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KCQkJCQlpZiAoaSA+PSBpdGVtcy5sZW5ndGggfHwgYmFzZVtpXSAhPSBpdGVtc1tpXSkgew0KCQkJCQkJYnAgPSBpICsgMTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoYmFzZS5sZW5ndGggPCBpdGVtcy5sZW5ndGgpIHsNCgkJCQlmb3IgKGkgPSAwLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQoJCQkJCWlmIChpID49IGJhc2UubGVuZ3RoIHx8IGJhc2VbaV0gIT0gaXRlbXNbaV0pIHsNCgkJCQkJCWJwID0gaSArIDE7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKGJwID09IDEpDQoJCQkJcmV0dXJuIHBhdGg7DQoNCgkJCWZvciAoaSA9IDAsIGwgPSBiYXNlLmxlbmd0aCAtIChicCAtIDEpOyBpIDwgbDsgaSsrKQ0KCQkJCW91dCArPSAiLi4vIjsNCg0KCQkJZm9yIChpID0gYnAgLSAxLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQoJCQkJaWYgKGkgIT0gYnAgLSAxKQ0KCQkJCQlvdXQgKz0gIi8iICsgaXRlbXNbaV07DQoJCQkJZWxzZQ0KCQkJCQlvdXQgKz0gaXRlbXNbaV07DQoJCQl9DQoNCgkJCXJldHVybiBvdXQ7DQoJCX0sDQoNCgkJdG9BYnNQYXRoIDogZnVuY3Rpb24oYmFzZSwgcGF0aCkgew0KCQkJdmFyIGksIG5iID0gMCwgbyA9IFtdLCB0ciwgb3V0UGF0aDsNCg0KCQkJLy8gU3BsaXQgcGF0aHMNCgkJCXRyID0gL1wvJC8udGVzdChwYXRoKSA/ICcvJyA6ICcnOw0KCQkJYmFzZSA9IGJhc2Uuc3BsaXQoJy8nKTsNCgkJCXBhdGggPSBwYXRoLnNwbGl0KCcvJyk7DQoNCgkJCS8vIFJlbW92ZSBlbXB0eSBjaHVua3MNCgkJCWVhY2goYmFzZSwgZnVuY3Rpb24oaykgew0KCQkJCWlmIChrKQ0KCQkJCQlvLnB1c2goayk7DQoJCQl9KTsNCg0KCQkJYmFzZSA9IG87DQoNCgkJCS8vIE1lcmdlIHJlbFVSTFBhcnRzIGNodW5rcw0KCQkJZm9yIChpID0gcGF0aC5sZW5ndGggLSAxLCBvID0gW107IGkgPj0gMDsgaS0tKSB7DQoJCQkJLy8gSWdub3JlIGVtcHR5IG9yIC4NCgkJCQlpZiAocGF0aFtpXS5sZW5ndGggPT0gMCB8fCBwYXRoW2ldID09ICIuIikNCgkJCQkJY29udGludWU7DQoNCgkJCQkvLyBJcyBwYXJlbnQNCgkJCQlpZiAocGF0aFtpXSA9PSAnLi4nKSB7DQoJCQkJCW5iKys7DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0NCg0KCQkJCS8vIE1vdmUgdXANCgkJCQlpZiAobmIgPiAwKSB7DQoJCQkJCW5iLS07DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0NCg0KCQkJCW8ucHVzaChwYXRoW2ldKTsNCgkJCX0NCg0KCQkJaSA9IGJhc2UubGVuZ3RoIC0gbmI7DQoNCgkJCS8vIElmIC9hL2IvYyBvciAvDQoJCQlpZiAoaSA8PSAwKQ0KCQkJCW91dFBhdGggPSBvLnJldmVyc2UoKS5qb2luKCcvJyk7DQoJCQllbHNlDQoJCQkJb3V0UGF0aCA9IGJhc2Uuc2xpY2UoMCwgaSkuam9pbignLycpICsgJy8nICsgby5yZXZlcnNlKCkuam9pbignLycpOw0KDQoJCQkvLyBBZGQgZnJvbnQgLyBpZiBpdCdzIG5lZWRlZA0KCQkJaWYgKG91dFBhdGguaW5kZXhPZignLycpICE9PSAwKQ0KCQkJCW91dFBhdGggPSAnLycgKyBvdXRQYXRoOw0KDQoJCQkvLyBBZGQgdHJhbGluZyAvIGlmIGl0J3MgbmVlZGVkDQoJCQlpZiAodHIgJiYgb3V0UGF0aC5sYXN0SW5kZXhPZignLycpICE9PSBvdXRQYXRoLmxlbmd0aCAtIDEpDQoJCQkJb3V0UGF0aCArPSB0cjsNCg0KCQkJcmV0dXJuIG91dFBhdGg7DQoJCX0sDQoNCgkJZ2V0VVJJIDogZnVuY3Rpb24obmgpIHsNCgkJCXZhciBzLCB0ID0gdGhpczsNCg0KCQkJLy8gUmVidWlsZCBzb3VyY2UNCgkJCWlmICghdC5zb3VyY2UgfHwgbmgpIHsNCgkJCQlzID0gJyc7DQoNCgkJCQlpZiAoIW5oKSB7DQoJCQkJCWlmICh0LnByb3RvY29sKQ0KCQkJCQkJcyArPSB0LnByb3RvY29sICsgJzovLyc7DQoNCgkJCQkJaWYgKHQudXNlckluZm8pDQoJCQkJCQlzICs9IHQudXNlckluZm8gKyAnQCc7DQoNCgkJCQkJaWYgKHQuaG9zdCkNCgkJCQkJCXMgKz0gdC5ob3N0Ow0KDQoJCQkJCWlmICh0LnBvcnQpDQoJCQkJCQlzICs9ICc6JyArIHQucG9ydDsNCgkJCQl9DQoNCgkJCQlpZiAodC5wYXRoKQ0KCQkJCQlzICs9IHQucGF0aDsNCg0KCQkJCWlmICh0LnF1ZXJ5KQ0KCQkJCQlzICs9ICc/JyArIHQucXVlcnk7DQoNCgkJCQlpZiAodC5hbmNob3IpDQoJCQkJCXMgKz0gJyMnICsgdC5hbmNob3I7DQoNCgkJCQl0LnNvdXJjZSA9IHM7DQoJCQl9DQoNCgkJCXJldHVybiB0LnNvdXJjZTsNCgkJfQ0KCX0pOw0KfSkoKTsNCg0KKGZ1bmN0aW9uKCkgew0KCXZhciBlYWNoID0gdGlueW1jZS5lYWNoOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3N0YXRpYyB0aW55bWNlLnV0aWwuQ29va2llJywgew0KCQlnZXRIYXNoIDogZnVuY3Rpb24obikgew0KCQkJdmFyIHYgPSB0aGlzLmdldChuKSwgaDsNCg0KCQkJaWYgKHYpIHsNCgkJCQllYWNoKHYuc3BsaXQoJyYnKSwgZnVuY3Rpb24odikgew0KCQkJCQl2ID0gdi5zcGxpdCgnPScpOw0KCQkJCQloID0gaCB8fCB7fTsNCgkJCQkJaFt1bmVzY2FwZSh2WzBdKV0gPSB1bmVzY2FwZSh2WzFdKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJc2V0SGFzaCA6IGZ1bmN0aW9uKG4sIHYsIGUsIHAsIGQsIHMpIHsNCgkJCXZhciBvID0gJyc7DQoNCgkJCWVhY2godiwgZnVuY3Rpb24odiwgaykgew0KCQkJCW8gKz0gKCFvID8gJycgOiAnJicpICsgZXNjYXBlKGspICsgJz0nICsgZXNjYXBlKHYpOw0KCQkJfSk7DQoNCgkJCXRoaXMuc2V0KG4sIG8sIGUsIHAsIGQsIHMpOw0KCQl9LA0KDQoJCWdldCA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciBjID0gZG9jdW1lbnQuY29va2llLCBlLCBwID0gbiArICI9IiwgYjsNCg0KCQkJLy8gU3RyaWN0IG1vZGUNCgkJCWlmICghYykNCgkJCQlyZXR1cm47DQoNCgkJCWIgPSBjLmluZGV4T2YoIjsgIiArIHApOw0KDQoJCQlpZiAoYiA9PSAtMSkgew0KCQkJCWIgPSBjLmluZGV4T2YocCk7DQoNCgkJCQlpZiAoYiAhPSAwKQ0KCQkJCQlyZXR1cm4gbnVsbDsNCgkJCX0gZWxzZQ0KCQkJCWIgKz0gMjsNCg0KCQkJZSA9IGMuaW5kZXhPZigiOyIsIGIpOw0KDQoJCQlpZiAoZSA9PSAtMSkNCgkJCQllID0gYy5sZW5ndGg7DQoNCgkJCXJldHVybiB1bmVzY2FwZShjLnN1YnN0cmluZyhiICsgcC5sZW5ndGgsIGUpKTsNCgkJfSwNCg0KCQlzZXQgOiBmdW5jdGlvbihuLCB2LCBlLCBwLCBkLCBzKSB7DQoJCQlkb2N1bWVudC5jb29raWUgPSBuICsgIj0iICsgZXNjYXBlKHYpICsNCgkJCQkoKGUpID8gIjsgZXhwaXJlcz0iICsgZS50b0dNVFN0cmluZygpIDogIiIpICsNCgkJCQkoKHApID8gIjsgcGF0aD0iICsgZXNjYXBlKHApIDogIiIpICsNCgkJCQkoKGQpID8gIjsgZG9tYWluPSIgKyBkIDogIiIpICsNCgkJCQkoKHMpID8gIjsgc2VjdXJlIiA6ICIiKTsNCgkJfSwNCg0KCQlyZW1vdmUgOiBmdW5jdGlvbihuLCBwKSB7DQoJCQl2YXIgZCA9IG5ldyBEYXRlKCk7DQoNCgkJCWQuc2V0VGltZShkLmdldFRpbWUoKSAtIDEwMDApOw0KDQoJCQl0aGlzLnNldChuLCAnJywgZCwgcCwgZCk7DQoJCX0NCgl9KTsNCn0pKCk7DQoNCnRpbnltY2UuY3JlYXRlKCdzdGF0aWMgdGlueW1jZS51dGlsLkpTT04nLCB7DQoJc2VyaWFsaXplIDogZnVuY3Rpb24obykgew0KCQl2YXIgaSwgdiwgcyA9IHRpbnltY2UudXRpbC5KU09OLnNlcmlhbGl6ZSwgdDsNCg0KCQlpZiAobyA9PSBudWxsKQ0KCQkJcmV0dXJuICdudWxsJzsNCg0KCQl0ID0gdHlwZW9mIG87DQoNCgkJaWYgKHQgPT0gJ3N0cmluZycpIHsNCgkJCXYgPSAnXGJiXHR0XG5uXGZmXHJyXCIiXCdcJ1xcXFwnOw0KDQoJCQlyZXR1cm4gJyInICsgby5yZXBsYWNlKC8oW1x1MDA4MC1cdUZGRkZceDAwLVx4MWZcIl0pL2csIGZ1bmN0aW9uKGEsIGIpIHsNCgkJCQlpID0gdi5pbmRleE9mKGIpOw0KDQoJCQkJaWYgKGkgKyAxKQ0KCQkJCQlyZXR1cm4gJ1xcJyArIHYuY2hhckF0KGkgKyAxKTsNCg0KCQkJCWEgPSBiLmNoYXJDb2RlQXQoKS50b1N0cmluZygxNik7DQoNCgkJCQlyZXR1cm4gJ1xcdScgKyAnMDAwMCcuc3Vic3RyaW5nKGEubGVuZ3RoKSArIGE7DQoJCQl9KSArICciJzsNCgkJfQ0KDQoJCWlmICh0ID09ICdvYmplY3QnKSB7DQoJCQlpZiAoby5oYXNPd25Qcm9wZXJ0eSAmJiBvIGluc3RhbmNlb2YgQXJyYXkpIHsNCgkJCQkJZm9yIChpPTAsIHYgPSAnWyc7IGk8by5sZW5ndGg7IGkrKykNCgkJCQkJCXYgKz0gKGkgPiAwID8gJywnIDogJycpICsgcyhvW2ldKTsNCg0KCQkJCQlyZXR1cm4gdiArICddJzsNCgkJCQl9DQoNCgkJCQl2ID0gJ3snOw0KDQoJCQkJZm9yIChpIGluIG8pDQoJCQkJCXYgKz0gdHlwZW9mIG9baV0gIT0gJ2Z1bmN0aW9uJyA/ICh2Lmxlbmd0aCA+IDEgPyAnLCInIDogJyInKSArIGkgKyAnIjonICsgcyhvW2ldKSA6ICcnOw0KDQoJCQkJcmV0dXJuIHYgKyAnfSc7DQoJCX0NCg0KCQlyZXR1cm4gJycgKyBvOw0KCX0sDQoNCglwYXJzZSA6IGZ1bmN0aW9uKHMpIHsNCgkJdHJ5IHsNCgkJCXJldHVybiBldmFsKCcoJyArIHMgKyAnKScpOw0KCQl9IGNhdGNoIChleCkgew0KCQkJLy8gSWdub3JlDQoJCX0NCgl9DQoNCgl9KTsNCg0KdGlueW1jZS5jcmVhdGUoJ3N0YXRpYyB0aW55bWNlLnV0aWwuWEhSJywgew0KCXNlbmQgOiBmdW5jdGlvbihvKSB7DQoJCXZhciB4LCB0LCB3ID0gd2luZG93LCBjID0gMDsNCg0KCQkvLyBEZWZhdWx0IHNldHRpbmdzDQoJCW8uc2NvcGUgPSBvLnNjb3BlIHx8IHRoaXM7DQoJCW8uc3VjY2Vzc19zY29wZSA9IG8uc3VjY2Vzc19zY29wZSB8fCBvLnNjb3BlOw0KCQlvLmVycm9yX3Njb3BlID0gby5lcnJvcl9zY29wZSB8fCBvLnNjb3BlOw0KCQlvLmFzeW5jID0gby5hc3luYyA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7DQoJCW8uZGF0YSA9IG8uZGF0YSB8fCAnJzsNCg0KCQlmdW5jdGlvbiBnZXQocykgew0KCQkJeCA9IDA7DQoNCgkJCXRyeSB7DQoJCQkJeCA9IG5ldyBBY3RpdmVYT2JqZWN0KHMpOw0KCQkJfSBjYXRjaCAoZXgpIHsNCgkJCX0NCg0KCQkJcmV0dXJuIHg7DQoJCX07DQoNCgkJeCA9IHcuWE1MSHR0cFJlcXVlc3QgPyBuZXcgWE1MSHR0cFJlcXVlc3QoKSA6IGdldCgnTWljcm9zb2Z0LlhNTEhUVFAnKSB8fCBnZXQoJ01zeG1sMi5YTUxIVFRQJyk7DQoNCgkJaWYgKHgpIHsNCgkJCWlmICh4Lm92ZXJyaWRlTWltZVR5cGUpDQoJCQkJeC5vdmVycmlkZU1pbWVUeXBlKG8uY29udGVudF90eXBlKTsNCg0KCQkJeC5vcGVuKG8udHlwZSB8fCAoby5kYXRhID8gJ1BPU1QnIDogJ0dFVCcpLCBvLnVybCwgby5hc3luYyk7DQoNCgkJCWlmIChvLmNvbnRlbnRfdHlwZSkNCgkJCQl4LnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIG8uY29udGVudF90eXBlKTsNCg0KCQkJeC5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7DQoNCgkJCXguc2VuZChvLmRhdGEpOw0KDQoJCQlmdW5jdGlvbiByZWFkeSgpIHsNCgkJCQlpZiAoIW8uYXN5bmMgfHwgeC5yZWFkeVN0YXRlID09IDQgfHwgYysrID4gMTAwMDApIHsNCgkJCQkJaWYgKG8uc3VjY2VzcyAmJiBjIDwgMTAwMDAgJiYgeC5zdGF0dXMgPT0gMjAwKQ0KCQkJCQkJby5zdWNjZXNzLmNhbGwoby5zdWNjZXNzX3Njb3BlLCAnJyArIHgucmVzcG9uc2VUZXh0LCB4LCBvKTsNCgkJCQkJZWxzZSBpZiAoby5lcnJvcikNCgkJCQkJCW8uZXJyb3IuY2FsbChvLmVycm9yX3Njb3BlLCBjID4gMTAwMDAgPyAnVElNRURfT1VUJyA6ICdHRU5FUkFMJywgeCwgbyk7DQoNCgkJCQkJeCA9IG51bGw7DQoJCQkJfSBlbHNlDQoJCQkJCXcuc2V0VGltZW91dChyZWFkeSwgMTApOw0KCQkJfTsNCg0KCQkJLy8gU3luY3Jvbm91cyByZXF1ZXN0DQoJCQlpZiAoIW8uYXN5bmMpDQoJCQkJcmV0dXJuIHJlYWR5KCk7DQoNCgkJCS8vIFdhaXQgZm9yIHJlc3BvbnNlLCBvblJlYWR5U3RhdGVDaGFuZ2UgY2FuIG5vdCBiZSB1c2VkIHNpbmNlIGl0IGxlYWtzIG1lbW9yeSBpbiBJRQ0KCQkJdCA9IHcuc2V0VGltZW91dChyZWFkeSwgMTApOw0KCQl9DQoJfQ0KfSk7DQoNCihmdW5jdGlvbigpIHsNCgl2YXIgZXh0ZW5kID0gdGlueW1jZS5leHRlbmQsIEpTT04gPSB0aW55bWNlLnV0aWwuSlNPTiwgWEhSID0gdGlueW1jZS51dGlsLlhIUjsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnV0aWwuSlNPTlJlcXVlc3QnLCB7DQoJCUpTT05SZXF1ZXN0IDogZnVuY3Rpb24ocykgew0KCQkJdGhpcy5zZXR0aW5ncyA9IGV4dGVuZCh7DQoJCQl9LCBzKTsNCgkJCXRoaXMuY291bnQgPSAwOw0KCQl9LA0KDQoJCXNlbmQgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgZWNiID0gby5lcnJvciwgc2NiID0gby5zdWNjZXNzOw0KDQoJCQlvID0gZXh0ZW5kKHRoaXMuc2V0dGluZ3MsIG8pOw0KDQoJCQlvLnN1Y2Nlc3MgPSBmdW5jdGlvbihjLCB4KSB7DQoJCQkJYyA9IEpTT04ucGFyc2UoYyk7DQoNCgkJCQlpZiAodHlwZW9mKGMpID09ICd1bmRlZmluZWQnKSB7DQoJCQkJCWMgPSB7DQoJCQkJCQllcnJvciA6ICdKU09OIFBhcnNlIGVycm9yLicNCgkJCQkJfTsNCgkJCQl9DQoNCgkJCQlpZiAoYy5lcnJvcikNCgkJCQkJZWNiLmNhbGwoby5lcnJvcl9zY29wZSB8fCBvLnNjb3BlLCBjLmVycm9yLCB4KTsNCgkJCQllbHNlDQoJCQkJCXNjYi5jYWxsKG8uc3VjY2Vzc19zY29wZSB8fCBvLnNjb3BlLCBjLnJlc3VsdCk7DQoJCQl9Ow0KDQoJCQlvLmVycm9yID0gZnVuY3Rpb24odHksIHgpIHsNCgkJCQllY2IuY2FsbChvLmVycm9yX3Njb3BlIHx8IG8uc2NvcGUsIHR5LCB4KTsNCgkJCX07DQoNCgkJCW8uZGF0YSA9IEpTT04uc2VyaWFsaXplKHsNCgkJCQlpZCA6IG8uaWQgfHwgJ2MnICsgKHRoaXMuY291bnQrKyksDQoJCQkJbWV0aG9kIDogby5tZXRob2QsDQoJCQkJcGFyYW1zIDogby5wYXJhbXMNCgkJCX0pOw0KDQoJCQkvLyBKU09OIGNvbnRlbnQgdHlwZSBmb3IgUnVieSBvbiByYWlscy4gQnVnOiAjMTg4MzI4Nw0KCQkJby5jb250ZW50X3R5cGUgPSAnYXBwbGljYXRpb24vanNvbic7DQoNCgkJCVhIUi5zZW5kKG8pOw0KCQl9LA0KDQoJCSdzdGF0aWMnIDogew0KCQkJc2VuZFJQQyA6IGZ1bmN0aW9uKG8pIHsNCgkJCQlyZXR1cm4gbmV3IHRpbnltY2UudXRpbC5KU09OUmVxdWVzdCgpLnNlbmQobyk7DQoJCQl9DQoJCX0NCgl9KTsNCn0oKSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIFNob3J0ZW4gbmFtZXMNCgl2YXIgZWFjaCA9IHRpbnltY2UuZWFjaCwNCgkJaXMgPSB0aW55bWNlLmlzLA0KCQlpc1dlYktpdCA9IHRpbnltY2UuaXNXZWJLaXQsDQoJCWlzSUUgPSB0aW55bWNlLmlzSUUsDQoJCWJsb2NrUmUgPSAvXihIWzEtNlJdfFB8RElWfEFERFJFU1N8UFJFfEZPUk18VChBQkxFfEJPRFl8SEVBRHxGT09UfEh8UnxEKXxMSXxPTHxVTHxDQVBUSU9OfEJMT0NLUVVPVEV8Q0VOVEVSfERMfERUfEREfERJUnxGSUVMRFNFVHxOT1NDUklQVHxNRU5VfElTSU5ERVh8U0FNUCkkLywNCgkJYm9vbEF0dHJzID0gbWFrZU1hcCgnY2hlY2tlZCxjb21wYWN0LGRlY2xhcmUsZGVmZXIsZGlzYWJsZWQsaXNtYXAsbXVsdGlwbGUsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm93cmFwLHJlYWRvbmx5LHNlbGVjdGVkJyksDQoJCW1jZUF0dHJpYnMgPSBtYWtlTWFwKCdzcmMsaHJlZixzdHlsZSxjb29yZHMsc2hhcGUnKSwNCgkJZW5jb2RlZENoYXJzID0geycmJyA6ICcmYW1wOycsICciJyA6ICcmcXVvdDsnLCAnPCcgOiAnJmx0OycsICc+JyA6ICcmZ3Q7J30sDQoJCWVuY29kZUNoYXJzUmUgPSAvWzw+JlwiXS9nLA0KCQlzaW1wbGVTZWxlY3RvclJlID0gL14oW2EtejAtOV0sPykrJC9pLA0KCQl0YWdSZWdFeHAgPSAvPChcdyspKCg/OlxzK1x3Kyg/OlxzKj1ccyooPzooPzoiW14iXSoiKXwoPzonW14nXSonKXxbXj5cc10rKSk/KSopKFxzKlwvPyk+L2csDQoJCWF0dHJSZWdFeHAgPSAvKFx3KykoPzpccyo9XHMqKD86KD86IigoPzpcXC58W14iXSkqKSIpfCg/OicoKD86XFwufFteJ10pKiknKXwoW14+XHNdKykpKT8vZzsNCg0KCWZ1bmN0aW9uIG1ha2VNYXAoc3RyKSB7DQoJCXZhciBtYXAgPSB7fSwgaTsNCg0KCQlzdHIgPSBzdHIuc3BsaXQoJywnKTsNCgkJZm9yIChpID0gc3RyLmxlbmd0aDsgaSA+PSAwOyBpLS0pDQoJCQltYXBbc3RyW2ldXSA9IDE7DQoNCgkJcmV0dXJuIG1hcDsNCgl9Ow0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UuZG9tLkRPTVV0aWxzJywgew0KCQlkb2MgOiBudWxsLA0KCQlyb290IDogbnVsbCwNCgkJZmlsZXMgOiBudWxsLA0KCQlwaXhlbFN0eWxlcyA6IC9eKHRvcHxsZWZ0fGJvdHRvbXxyaWdodHx3aWR0aHxoZWlnaHR8Ym9yZGVyV2lkdGgpJC8sDQoJCXByb3BzIDogew0KCQkJImZvciIgOiAiaHRtbEZvciIsDQoJCQkiY2xhc3MiIDogImNsYXNzTmFtZSIsDQoJCQljbGFzc05hbWUgOiAiY2xhc3NOYW1lIiwNCgkJCWNoZWNrZWQgOiAiY2hlY2tlZCIsDQoJCQlkaXNhYmxlZCA6ICJkaXNhYmxlZCIsDQoJCQltYXhsZW5ndGggOiAibWF4TGVuZ3RoIiwNCgkJCXJlYWRvbmx5IDogInJlYWRPbmx5IiwNCgkJCXNlbGVjdGVkIDogInNlbGVjdGVkIiwNCgkJCXZhbHVlIDogInZhbHVlIiwNCgkJCWlkIDogImlkIiwNCgkJCW5hbWUgOiAibmFtZSIsDQoJCQl0eXBlIDogInR5cGUiDQoJCX0sDQoNCgkJRE9NVXRpbHMgOiBmdW5jdGlvbihkLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGdsb2JhbFN0eWxlOw0KDQoJCQl0LmRvYyA9IGQ7DQoJCQl0LndpbiA9IHdpbmRvdzsNCgkJCXQuZmlsZXMgPSB7fTsNCgkJCXQuY3NzRmxpY2tlciA9IGZhbHNlOw0KCQkJdC5jb3VudGVyID0gMDsNCgkJCXQuc3RkTW9kZSA9IGQuZG9jdW1lbnRNb2RlID49IDg7DQoJCQl0LmJveE1vZGVsID0gIXRpbnltY2UuaXNJRSB8fCBkLmNvbXBhdE1vZGUgPT0gIkNTUzFDb21wYXQiIHx8IHQuc3RkTW9kZTsNCg0KCQkJdC5zZXR0aW5ncyA9IHMgPSB0aW55bWNlLmV4dGVuZCh7DQoJCQkJa2VlcF92YWx1ZXMgOiBmYWxzZSwNCgkJCQloZXhfY29sb3JzIDogMSwNCgkJCQlwcm9jZXNzX2h0bWwgOiAxDQoJCQl9LCBzKTsNCg0KCQkJLy8gRml4IElFNlNQMiBmbGlja2VyIGFuZCBjaGVjayBpdCBmYWlsZWQgZm9yIHByZSBTUDINCgkJCWlmICh0aW55bWNlLmlzSUU2KSB7DQoJCQkJdHJ5IHsNCgkJCQkJZC5leGVjQ29tbWFuZCgnQmFja2dyb3VuZEltYWdlQ2FjaGUnLCBmYWxzZSwgdHJ1ZSk7DQoJCQkJfSBjYXRjaCAoZSkgew0KCQkJCQl0LmNzc0ZsaWNrZXIgPSB0cnVlOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gQnVpbGQgc3R5bGVzIGxpc3QNCgkJCWlmIChzLnZhbGlkX3N0eWxlcykgew0KCQkJCXQuX3N0eWxlcyA9IHt9Ow0KDQoJCQkJLy8gQ29udmVydCBzdHlsZXMgaW50byBhIHJ1bGUgbGlzdA0KCQkJCWVhY2gocy52YWxpZF9zdHlsZXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsNCgkJCQkJdC5fc3R5bGVzW2tleV0gPSB0aW55bWNlLmV4cGxvZGUodmFsdWUpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQl0aW55bWNlLmFkZFVubG9hZCh0LmRlc3Ryb3ksIHQpOw0KCQl9LA0KDQoJCWdldFJvb3QgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3M7DQoNCgkJCXJldHVybiAocyAmJiB0LmdldChzLnJvb3RfZWxlbWVudCkpIHx8IHQuZG9jLmJvZHk7DQoJCX0sDQoNCgkJZ2V0Vmlld1BvcnQgOiBmdW5jdGlvbih3KSB7DQoJCQl2YXIgZCwgYjsNCg0KCQkJdyA9ICF3ID8gdGhpcy53aW4gOiB3Ow0KCQkJZCA9IHcuZG9jdW1lbnQ7DQoJCQliID0gdGhpcy5ib3hNb2RlbCA/IGQuZG9jdW1lbnRFbGVtZW50IDogZC5ib2R5Ow0KDQoJCQkvLyBSZXR1cm5zIHZpZXdwb3J0IHNpemUgZXhjbHVkaW5nIHNjcm9sbGJhcnMNCgkJCXJldHVybiB7DQoJCQkJeCA6IHcucGFnZVhPZmZzZXQgfHwgYi5zY3JvbGxMZWZ0LA0KCQkJCXkgOiB3LnBhZ2VZT2Zmc2V0IHx8IGIuc2Nyb2xsVG9wLA0KCQkJCXcgOiB3LmlubmVyV2lkdGggfHwgYi5jbGllbnRXaWR0aCwNCgkJCQloIDogdy5pbm5lckhlaWdodCB8fCBiLmNsaWVudEhlaWdodA0KCQkJfTsNCgkJfSwNCg0KCQlnZXRSZWN0IDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHAsIHQgPSB0aGlzLCBzcjsNCg0KCQkJZSA9IHQuZ2V0KGUpOw0KCQkJcCA9IHQuZ2V0UG9zKGUpOw0KCQkJc3IgPSB0LmdldFNpemUoZSk7DQoNCgkJCXJldHVybiB7DQoJCQkJeCA6IHAueCwNCgkJCQl5IDogcC55LA0KCQkJCXcgOiBzci53LA0KCQkJCWggOiBzci5oDQoJCQl9Ow0KCQl9LA0KDQoJCWdldFNpemUgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHcsIGg7DQoNCgkJCWUgPSB0LmdldChlKTsNCgkJCXcgPSB0LmdldFN0eWxlKGUsICd3aWR0aCcpOw0KCQkJaCA9IHQuZ2V0U3R5bGUoZSwgJ2hlaWdodCcpOw0KDQoJCQkvLyBOb24gcGl4ZWwgdmFsdWUsIHRoZW4gZm9yY2Ugb2Zmc2V0L2NsaWVudFdpZHRoDQoJCQlpZiAody5pbmRleE9mKCdweCcpID09PSAtMSkNCgkJCQl3ID0gMDsNCg0KCQkJLy8gTm9uIHBpeGVsIHZhbHVlLCB0aGVuIGZvcmNlIG9mZnNldC9jbGllbnRXaWR0aA0KCQkJaWYgKGguaW5kZXhPZigncHgnKSA9PT0gLTEpDQoJCQkJaCA9IDA7DQoNCgkJCXJldHVybiB7DQoJCQkJdyA6IHBhcnNlSW50KHcpIHx8IGUub2Zmc2V0V2lkdGggfHwgZS5jbGllbnRXaWR0aCwNCgkJCQloIDogcGFyc2VJbnQoaCkgfHwgZS5vZmZzZXRIZWlnaHQgfHwgZS5jbGllbnRIZWlnaHQNCgkJCX07DQoJCX0sDQoNCgkJZ2V0UGFyZW50IDogZnVuY3Rpb24obiwgZiwgcikgew0KCQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50cyhuLCBmLCByLCBmYWxzZSk7DQoJCX0sDQoNCgkJZ2V0UGFyZW50cyA6IGZ1bmN0aW9uKG4sIGYsIHIsIGMpIHsNCgkJCXZhciB0ID0gdGhpcywgbmEsIHNlID0gdC5zZXR0aW5ncywgbyA9IFtdOw0KDQoJCQluID0gdC5nZXQobik7DQoJCQljID0gYyA9PT0gdW5kZWZpbmVkOw0KDQoJCQlpZiAoc2Uuc3RyaWN0X3Jvb3QpDQoJCQkJciA9IHIgfHwgdC5nZXRSb290KCk7DQoNCgkJCS8vIFdyYXAgbm9kZSBuYW1lIGFzIGZ1bmMNCgkJCWlmIChpcyhmLCAnc3RyaW5nJykpIHsNCgkJCQluYSA9IGY7DQoNCgkJCQlpZiAoZiA9PT0gJyonKSB7DQoJCQkJCWYgPSBmdW5jdGlvbihuKSB7cmV0dXJuIG4ubm9kZVR5cGUgPT0gMTt9Ow0KCQkJCX0gZWxzZSB7DQoJCQkJCWYgPSBmdW5jdGlvbihuKSB7DQoJCQkJCQlyZXR1cm4gdC5pcyhuLCBuYSk7DQoJCQkJCX07DQoJCQkJfQ0KCQkJfQ0KDQoJCQl3aGlsZSAobikgew0KCQkJCWlmIChuID09IHIgfHwgIW4ubm9kZVR5cGUgfHwgbi5ub2RlVHlwZSA9PT0gOSkNCgkJCQkJYnJlYWs7DQoNCgkJCQlpZiAoIWYgfHwgZihuKSkgew0KCQkJCQlpZiAoYykNCgkJCQkJCW8ucHVzaChuKTsNCgkJCQkJZWxzZQ0KCQkJCQkJcmV0dXJuIG47DQoJCQkJfQ0KDQoJCQkJbiA9IG4ucGFyZW50Tm9kZTsNCgkJCX0NCg0KCQkJcmV0dXJuIGMgPyBvIDogbnVsbDsNCgkJfSwNCg0KCQlnZXQgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgbjsNCg0KCQkJaWYgKGUgJiYgdGhpcy5kb2MgJiYgdHlwZW9mKGUpID09ICdzdHJpbmcnKSB7DQoJCQkJbiA9IGU7DQoJCQkJZSA9IHRoaXMuZG9jLmdldEVsZW1lbnRCeUlkKGUpOw0KDQoJCQkJLy8gSUUgYW5kIE9wZXJhIHJldHVybnMgbWV0YSBlbGVtZW50cyB3aGVuIHRoZXkgbWF0Y2ggdGhlIHNwZWNpZmllZCBpbnB1dCBJRCwgYnV0IGdldEVsZW1lbnRzQnlOYW1lIHNlZW1zIHRvIGRvIHRoZSB0cmljaw0KCQkJCWlmIChlICYmIGUuaWQgIT09IG4pDQoJCQkJCXJldHVybiB0aGlzLmRvYy5nZXRFbGVtZW50c0J5TmFtZShuKVsxXTsNCgkJCX0NCg0KCQkJcmV0dXJuIGU7DQoJCX0sDQoNCgkJZ2V0TmV4dCA6IGZ1bmN0aW9uKG5vZGUsIHNlbGVjdG9yKSB7DQoJCQlyZXR1cm4gdGhpcy5fZmluZFNpYihub2RlLCBzZWxlY3RvciwgJ25leHRTaWJsaW5nJyk7DQoJCX0sDQoNCgkJZ2V0UHJldiA6IGZ1bmN0aW9uKG5vZGUsIHNlbGVjdG9yKSB7DQoJCQlyZXR1cm4gdGhpcy5fZmluZFNpYihub2RlLCBzZWxlY3RvciwgJ3ByZXZpb3VzU2libGluZycpOw0KCQl9LA0KDQoNCgkJYWRkIDogZnVuY3Rpb24ocCwgbiwgYSwgaCwgYykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlyZXR1cm4gdGhpcy5ydW4ocCwgZnVuY3Rpb24ocCkgew0KCQkJCXZhciBlLCBrOw0KDQoJCQkJZSA9IGlzKG4sICdzdHJpbmcnKSA/IHQuZG9jLmNyZWF0ZUVsZW1lbnQobikgOiBuOw0KCQkJCXQuc2V0QXR0cmlicyhlLCBhKTsNCg0KCQkJCWlmIChoKSB7DQoJCQkJCWlmIChoLm5vZGVUeXBlKQ0KCQkJCQkJZS5hcHBlbmRDaGlsZChoKTsNCgkJCQkJZWxzZQ0KCQkJCQkJdC5zZXRIVE1MKGUsIGgpOw0KCQkJCX0NCg0KCQkJCXJldHVybiAhYyA/IHAuYXBwZW5kQ2hpbGQoZSkgOiBlOw0KCQkJfSk7DQoJCX0sDQoNCgkJY3JlYXRlIDogZnVuY3Rpb24obiwgYSwgaCkgew0KCQkJcmV0dXJuIHRoaXMuYWRkKHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQobiksIG4sIGEsIGgsIDEpOw0KCQl9LA0KDQoJCWNyZWF0ZUhUTUwgOiBmdW5jdGlvbihuLCBhLCBoKSB7DQoJCQl2YXIgbyA9ICcnLCB0ID0gdGhpcywgazsNCg0KCQkJbyArPSAnPCcgKyBuOw0KDQoJCQlmb3IgKGsgaW4gYSkgew0KCQkJCWlmIChhLmhhc093blByb3BlcnR5KGspKQ0KCQkJCQlvICs9ICcgJyArIGsgKyAnPSInICsgdC5lbmNvZGUoYVtrXSkgKyAnIic7DQoJCQl9DQoNCgkJCS8vIEEgY2FsbCB0byB0aW55bWNlLmlzIGRvZXNuJ3Qgd29yayBmb3Igc29tZSBvZGQgcmVhc29uIG9uIElFOSBwb3NzaWJsZSBidWcgaW5zaWRlIHRoZWlyIEpTIHJ1bnRpbWUNCgkJCWlmICh0eXBlb2YoaCkgIT0gInVuZGVmaW5lZCIpDQoJCQkJcmV0dXJuIG8gKyAnPicgKyBoICsgJzwvJyArIG4gKyAnPic7DQoNCgkJCXJldHVybiBvICsgJyAvPic7DQoJCX0sDQoNCgkJcmVtb3ZlIDogZnVuY3Rpb24obm9kZSwga2VlcF9jaGlsZHJlbikgew0KCQkJcmV0dXJuIHRoaXMucnVuKG5vZGUsIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQl2YXIgcGFyZW50LCBjaGlsZDsNCg0KCQkJCXBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsNCg0KCQkJCWlmICghcGFyZW50KQ0KCQkJCQlyZXR1cm4gbnVsbDsNCg0KCQkJCWlmIChrZWVwX2NoaWxkcmVuKSB7DQoJCQkJCXdoaWxlIChjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZCkgew0KCQkJCQkJLy8gSUUgOCB3aWxsIGNyYXNoIGlmIHlvdSBkb24ndCByZW1vdmUgY29tcGxldGVseSBlbXB0eSB0ZXh0IG5vZGVzDQoJCQkJCQlpZiAoIXRpbnltY2UuaXNJRSB8fCBjaGlsZC5ub2RlVHlwZSAhPT0gMyB8fCBjaGlsZC5ub2RlVmFsdWUpDQoJCQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbm9kZSk7DQoJCQkJCQllbHNlDQoJCQkJCQkJbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlyZXR1cm4gcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOw0KCQkJfSk7DQoJCX0sDQoNCgkJc2V0U3R5bGUgOiBmdW5jdGlvbihuLCBuYSwgdikgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlyZXR1cm4gdC5ydW4obiwgZnVuY3Rpb24oZSkgew0KCQkJCXZhciBzLCBpOw0KDQoJCQkJcyA9IGUuc3R5bGU7DQoNCgkJCQkvLyBDYW1lbGNhc2UgaXQsIGlmIG5lZWRlZA0KCQkJCW5hID0gbmEucmVwbGFjZSgvLShcRCkvZywgZnVuY3Rpb24oYSwgYil7DQoJCQkJCXJldHVybiBiLnRvVXBwZXJDYXNlKCk7DQoJCQkJfSk7DQoNCgkJCQkvLyBEZWZhdWx0IHB4IHN1ZmZpeCBvbiB0aGVzZQ0KCQkJCWlmICh0LnBpeGVsU3R5bGVzLnRlc3QobmEpICYmICh0aW55bWNlLmlzKHYsICdudW1iZXInKSB8fCAvXltcLTAtOVwuXSskLy50ZXN0KHYpKSkNCgkJCQkJdiArPSAncHgnOw0KDQoJCQkJc3dpdGNoIChuYSkgew0KCQkJCQljYXNlICdvcGFjaXR5JzoNCgkJCQkJCS8vIElFIHNwZWNpZmljIG9wYWNpdHkNCgkJCQkJCWlmIChpc0lFKSB7DQoJCQkJCQkJcy5maWx0ZXIgPSB2ID09PSAnJyA/ICcnIDogImFscGhhKG9wYWNpdHk9IiArICh2ICogMTAwKSArICIpIjsNCg0KCQkJCQkJCWlmICghbi5jdXJyZW50U3R5bGUgfHwgIW4uY3VycmVudFN0eWxlLmhhc0xheW91dCkNCgkJCQkJCQkJcy5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEZpeCBmb3Igb2xkZXIgYnJvd3NlcnMNCgkJCQkJCXNbbmFdID0gc1snLW1vei1vcGFjaXR5J10gPSBzWycta2h0bWwtb3BhY2l0eSddID0gdiB8fCAnJzsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ2Zsb2F0JzoNCgkJCQkJCWlzSUUgPyBzLnN0eWxlRmxvYXQgPSB2IDogcy5jc3NGbG9hdCA9IHY7DQoJCQkJCQlicmVhazsNCgkJCQkJDQoJCQkJCWRlZmF1bHQ6DQoJCQkJCQlzW25hXSA9IHYgfHwgJyc7DQoJCQkJfQ0KDQoJCQkJLy8gRm9yY2UgdXBkYXRlIG9mIHRoZSBzdHlsZSBkYXRhDQoJCQkJaWYgKHQuc2V0dGluZ3MudXBkYXRlX3N0eWxlcykNCgkJCQkJdC5zZXRBdHRyaWIoZSwgJ19tY2Vfc3R5bGUnKTsNCgkJCX0pOw0KCQl9LA0KDQoJCWdldFN0eWxlIDogZnVuY3Rpb24obiwgbmEsIGMpIHsNCgkJCW4gPSB0aGlzLmdldChuKTsNCg0KCQkJaWYgKCFuKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJLy8gR2Vja28NCgkJCWlmICh0aGlzLmRvYy5kZWZhdWx0VmlldyAmJiBjKSB7DQoJCQkJLy8gUmVtb3ZlIGNhbWVsY2FzZQ0KCQkJCW5hID0gbmEucmVwbGFjZSgvW0EtWl0vZywgZnVuY3Rpb24oYSl7DQoJCQkJCXJldHVybiAnLScgKyBhOw0KCQkJCX0pOw0KDQoJCQkJdHJ5IHsNCgkJCQkJcmV0dXJuIHRoaXMuZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobiwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYSk7DQoJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJLy8gT2xkIHNhZmFyaSBtaWdodCBmYWlsDQoJCQkJCXJldHVybiBudWxsOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gQ2FtZWxjYXNlIGl0LCBpZiBuZWVkZWQNCgkJCW5hID0gbmEucmVwbGFjZSgvLShcRCkvZywgZnVuY3Rpb24oYSwgYil7DQoJCQkJcmV0dXJuIGIudG9VcHBlckNhc2UoKTsNCgkJCX0pOw0KDQoJCQlpZiAobmEgPT0gJ2Zsb2F0JykNCgkJCQluYSA9IGlzSUUgPyAnc3R5bGVGbG9hdCcgOiAnY3NzRmxvYXQnOw0KDQoJCQkvLyBJRSAmIE9wZXJhDQoJCQlpZiAobi5jdXJyZW50U3R5bGUgJiYgYykNCgkJCQlyZXR1cm4gbi5jdXJyZW50U3R5bGVbbmFdOw0KDQoJCQlyZXR1cm4gbi5zdHlsZVtuYV07DQoJCX0sDQoNCgkJc2V0U3R5bGVzIDogZnVuY3Rpb24oZSwgbykgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgb2w7DQoNCgkJCW9sID0gcy51cGRhdGVfc3R5bGVzOw0KCQkJcy51cGRhdGVfc3R5bGVzID0gMDsNCg0KCQkJZWFjaChvLCBmdW5jdGlvbih2LCBuKSB7DQoJCQkJdC5zZXRTdHlsZShlLCBuLCB2KTsNCgkJCX0pOw0KDQoJCQkvLyBVcGRhdGUgc3R5bGUgaW5mbw0KCQkJcy51cGRhdGVfc3R5bGVzID0gb2w7DQoJCQlpZiAocy51cGRhdGVfc3R5bGVzKQ0KCQkJCXQuc2V0QXR0cmliKGUsIHMuY3NzVGV4dCk7DQoJCX0sDQoNCgkJc2V0QXR0cmliIDogZnVuY3Rpb24oZSwgbiwgdikgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQkvLyBXaGF0cyB0aGUgcG9pbnQNCgkJCWlmICghZSB8fCAhbikNCgkJCQlyZXR1cm47DQoNCgkJCS8vIFN0cmljdCBYTUwgbW9kZQ0KCQkJaWYgKHQuc2V0dGluZ3Muc3RyaWN0KQ0KCQkJCW4gPSBuLnRvTG93ZXJDYXNlKCk7DQoNCgkJCXJldHVybiB0aGlzLnJ1bihlLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIHMgPSB0LnNldHRpbmdzOw0KDQoJCQkJc3dpdGNoIChuKSB7DQoJCQkJCWNhc2UgInN0eWxlIjoNCgkJCQkJCWlmICghaXModiwgJ3N0cmluZycpKSB7DQoJCQkJCQkJZWFjaCh2LCBmdW5jdGlvbih2LCBuKSB7DQoJCQkJCQkJCXQuc2V0U3R5bGUoZSwgbiwgdik7DQoJCQkJCQkJfSk7DQoNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCS8vIE5vIG1jZV9zdHlsZSBmb3IgZWxlbWVudHMgd2l0aCB0aGVzZSBzaW5jZSB0aGV5IG1pZ2h0IGdldCByZXNpemVkIGJ5IHRoZSB1c2VyDQoJCQkJCQlpZiAocy5rZWVwX3ZhbHVlcykgew0KCQkJCQkJCWlmICh2ICYmICF0Ll9pc1Jlcyh2KSkNCgkJCQkJCQkJZS5zZXRBdHRyaWJ1dGUoJ19tY2Vfc3R5bGUnLCB2LCAyKTsNCgkJCQkJCQllbHNlDQoJCQkJCQkJCWUucmVtb3ZlQXR0cmlidXRlKCdfbWNlX3N0eWxlJywgMik7DQoJCQkJCQl9DQoNCgkJCQkJCWUuc3R5bGUuY3NzVGV4dCA9IHY7DQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICJjbGFzcyI6DQoJCQkJCQllLmNsYXNzTmFtZSA9IHYgfHwgJyc7IC8vIEZpeCBJRSBudWxsIGJ1Zw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAic3JjIjoNCgkJCQkJY2FzZSAiaHJlZiI6DQoJCQkJCQlpZiAocy5rZWVwX3ZhbHVlcykgew0KCQkJCQkJCWlmIChzLnVybF9jb252ZXJ0ZXIpDQoJCQkJCQkJCXYgPSBzLnVybF9jb252ZXJ0ZXIuY2FsbChzLnVybF9jb252ZXJ0ZXJfc2NvcGUgfHwgdCwgdiwgbiwgZSk7DQoNCgkJCQkJCQl0LnNldEF0dHJpYihlLCAnX21jZV8nICsgbiwgdiwgMik7DQoJCQkJCQl9DQoNCgkJCQkJCWJyZWFrOw0KCQkJCQkNCgkJCQkJY2FzZSAic2hhcGUiOg0KCQkJCQkJZS5zZXRBdHRyaWJ1dGUoJ19tY2Vfc3R5bGUnLCB2KTsNCgkJCQkJCWJyZWFrOw0KCQkJCX0NCg0KCQkJCWlmIChpcyh2KSAmJiB2ICE9PSBudWxsICYmIHYubGVuZ3RoICE9PSAwKQ0KCQkJCQllLnNldEF0dHJpYnV0ZShuLCAnJyArIHYsIDIpOw0KCQkJCWVsc2UNCgkJCQkJZS5yZW1vdmVBdHRyaWJ1dGUobiwgMik7DQoJCQl9KTsNCgkJfSwNCg0KCQlzZXRBdHRyaWJzIDogZnVuY3Rpb24oZSwgbykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlyZXR1cm4gdGhpcy5ydW4oZSwgZnVuY3Rpb24oZSkgew0KCQkJCWVhY2gobywgZnVuY3Rpb24odiwgbikgew0KCQkJCQl0LnNldEF0dHJpYihlLCBuLCB2KTsNCgkJCQl9KTsNCgkJCX0pOw0KCQl9LA0KDQoJCWdldEF0dHJpYiA6IGZ1bmN0aW9uKGUsIG4sIGR2KSB7DQoJCQl2YXIgdiwgdCA9IHRoaXM7DQoNCgkJCWUgPSB0LmdldChlKTsNCg0KCQkJaWYgKCFlIHx8IGUubm9kZVR5cGUgIT09IDEpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQlpZiAoIWlzKGR2KSkNCgkJCQlkdiA9ICcnOw0KDQoJCQkvLyBUcnkgdGhlIG1jZSB2YXJpYW50IGZvciB0aGVzZQ0KCQkJaWYgKC9eKHNyY3xocmVmfHN0eWxlfGNvb3Jkc3xzaGFwZSkkLy50ZXN0KG4pKSB7DQoJCQkJdiA9IGUuZ2V0QXR0cmlidXRlKCJfbWNlXyIgKyBuKTsNCg0KCQkJCWlmICh2KQ0KCQkJCQlyZXR1cm4gdjsNCgkJCX0NCg0KCQkJaWYgKGlzSUUgJiYgdC5wcm9wc1tuXSkgew0KCQkJCXYgPSBlW3QucHJvcHNbbl1dOw0KCQkJCXYgPSB2ICYmIHYubm9kZVZhbHVlID8gdi5ub2RlVmFsdWUgOiB2Ow0KCQkJfQ0KDQoJCQlpZiAoIXYpDQoJCQkJdiA9IGUuZ2V0QXR0cmlidXRlKG4sIDIpOw0KDQoJCQkvLyBDaGVjayBib29sZWFuIGF0dHJpYnMNCgkJCWlmICgvXihjaGVja2VkfGNvbXBhY3R8ZGVjbGFyZXxkZWZlcnxkaXNhYmxlZHxpc21hcHxtdWx0aXBsZXxub2hyZWZ8bm9zaGFkZXxub3dyYXB8cmVhZG9ubHl8c2VsZWN0ZWQpJC8udGVzdChuKSkgew0KCQkJCWlmIChlW3QucHJvcHNbbl1dID09PSB0cnVlICYmIHYgPT09ICcnKQ0KCQkJCQlyZXR1cm4gbjsNCg0KCQkJCXJldHVybiB2ID8gbiA6ICcnOw0KCQkJfQ0KDQoJCQkvLyBJbm5lciBpbnB1dCBlbGVtZW50cyB3aWxsIG92ZXJyaWRlIGF0dHJpYnV0ZXMgb24gZm9ybSBlbGVtZW50cw0KCQkJaWYgKGUubm9kZU5hbWUgPT09ICJGT1JNIiAmJiBlLmdldEF0dHJpYnV0ZU5vZGUobikpDQoJCQkJcmV0dXJuIGUuZ2V0QXR0cmlidXRlTm9kZShuKS5ub2RlVmFsdWU7DQoNCgkJCWlmIChuID09PSAnc3R5bGUnKSB7DQoJCQkJdiA9IHYgfHwgZS5zdHlsZS5jc3NUZXh0Ow0KDQoJCQkJaWYgKHYpIHsNCgkJCQkJdiA9IHQuc2VyaWFsaXplU3R5bGUodC5wYXJzZVN0eWxlKHYpLCBlLm5vZGVOYW1lKTsNCg0KCQkJCQlpZiAodC5zZXR0aW5ncy5rZWVwX3ZhbHVlcyAmJiAhdC5faXNSZXModikpDQoJCQkJCQllLnNldEF0dHJpYnV0ZSgnX21jZV9zdHlsZScsIHYpOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gUmVtb3ZlIEFwcGxlIGFuZCBXZWJLaXQgc3R1ZmYNCgkJCWlmIChpc1dlYktpdCAmJiBuID09PSAiY2xhc3MiICYmIHYpDQoJCQkJdiA9IHYucmVwbGFjZSgvKGFwcGxlfHdlYmtpdClcLVthLXpcLV0rL2dpLCAnJyk7DQoNCgkJCS8vIEhhbmRsZSBJRSBpc3N1ZXMNCgkJCWlmIChpc0lFKSB7DQoJCQkJc3dpdGNoIChuKSB7DQoJCQkJCWNhc2UgJ3Jvd3NwYW4nOg0KCQkJCQljYXNlICdjb2xzcGFuJzoNCgkJCQkJCS8vIElFIHJldHVybnMgMSBhcyBkZWZhdWx0IHZhbHVlDQoJCQkJCQlpZiAodiA9PT0gMSkNCgkJCQkJCQl2ID0gJyc7DQoNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ3NpemUnOg0KCQkJCQkJLy8gSUUgcmV0dXJucyArMCBhcyBkZWZhdWx0IHZhbHVlIGZvciBzaXplDQoJCQkJCQlpZiAodiA9PT0gJyswJyB8fCB2ID09PSAyMCB8fCB2ID09PSAwKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnd2lkdGgnOg0KCQkJCQljYXNlICdoZWlnaHQnOg0KCQkJCQljYXNlICd2c3BhY2UnOg0KCQkJCQljYXNlICdjaGVja2VkJzoNCgkJCQkJY2FzZSAnZGlzYWJsZWQnOg0KCQkJCQljYXNlICdyZWFkb25seSc6DQoJCQkJCQlpZiAodiA9PT0gMCkNCgkJCQkJCQl2ID0gJyc7DQoNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ2hzcGFjZSc6DQoJCQkJCQkvLyBJRSByZXR1cm5zIC0xIGFzIGRlZmF1bHQgdmFsdWUNCgkJCQkJCWlmICh2ID09PSAtMSkNCgkJCQkJCQl2ID0gJyc7DQoNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ21heGxlbmd0aCc6DQoJCQkJCWNhc2UgJ3RhYmluZGV4JzoNCgkJCQkJCS8vIElFIHJldHVybnMgZGVmYXVsdCB2YWx1ZQ0KCQkJCQkJaWYgKHYgPT09IDMyNzY4IHx8IHYgPT09IDIxNDc0ODM2NDcgfHwgdiA9PT0gJzMyNzY4JykNCgkJCQkJCQl2ID0gJyc7DQoNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ211bHRpcGxlJzoNCgkJCQkJY2FzZSAnY29tcGFjdCc6DQoJCQkJCWNhc2UgJ25vc2hhZGUnOg0KCQkJCQljYXNlICdub3dyYXAnOg0KCQkJCQkJaWYgKHYgPT09IDY1NTM1KQ0KCQkJCQkJCXJldHVybiBuOw0KDQoJCQkJCQlyZXR1cm4gZHY7DQoNCgkJCQkJY2FzZSAnc2hhcGUnOg0KCQkJCQkJdiA9IHYudG9Mb3dlckNhc2UoKTsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWRlZmF1bHQ6DQoJCQkJCQkvLyBJRSBoYXMgb2RkIGFub255bW91cyBmdW5jdGlvbiBmb3IgZXZlbnQgYXR0cmlidXRlcw0KCQkJCQkJaWYgKG4uaW5kZXhPZignb24nKSA9PT0gMCAmJiB2KQ0KCQkJCQkJCXYgPSB0aW55bWNlLl9yZXBsYWNlKC9eZnVuY3Rpb25ccytcdytcKFwpXHMrXHtccysoLiopXHMrXH0kLywgJyQxJywgJycgKyB2KTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiAodiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwgJiYgdiAhPT0gJycpID8gJycgKyB2IDogZHY7DQoJCX0sDQoNCgkJZ2V0UG9zIDogZnVuY3Rpb24obiwgcm8pIHsNCgkJCXZhciB0ID0gdGhpcywgeCA9IDAsIHkgPSAwLCBlLCBkID0gdC5kb2MsIHI7DQoNCgkJCW4gPSB0LmdldChuKTsNCgkJCXJvID0gcm8gfHwgZC5ib2R5Ow0KDQoJCQlpZiAobikgew0KCQkJCS8vIFVzZSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gSUUsIE9wZXJhIGhhcyBpdCBidXQgaXQncyBub3QgcGVyZmVjdA0KCQkJCWlmIChpc0lFICYmICF0LnN0ZE1vZGUpIHsNCgkJCQkJbiA9IG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7DQoJCQkJCWUgPSB0LmJveE1vZGVsID8gZC5kb2N1bWVudEVsZW1lbnQgOiBkLmJvZHk7DQoJCQkJCXggPSB0LmdldFN0eWxlKHQuc2VsZWN0KCdodG1sJylbMF0sICdib3JkZXJXaWR0aCcpOyAvLyBSZW1vdmUgYm9yZGVyDQoJCQkJCXggPSAoeCA9PSAnbWVkaXVtJyB8fCB0LmJveE1vZGVsICYmICF0LmlzSUU2KSAmJiAyIHx8IHg7DQoNCgkJCQkJcmV0dXJuIHt4IDogbi5sZWZ0ICsgZS5zY3JvbGxMZWZ0IC0geCwgeSA6IG4udG9wICsgZS5zY3JvbGxUb3AgLSB4fTsNCgkJCQl9DQoNCgkJCQlyID0gbjsNCgkJCQl3aGlsZSAociAmJiByICE9IHJvICYmIHIubm9kZVR5cGUpIHsNCgkJCQkJeCArPSByLm9mZnNldExlZnQgfHwgMDsNCgkJCQkJeSArPSByLm9mZnNldFRvcCB8fCAwOw0KCQkJCQlyID0gci5vZmZzZXRQYXJlbnQ7DQoJCQkJfQ0KDQoJCQkJciA9IG4ucGFyZW50Tm9kZTsNCgkJCQl3aGlsZSAociAmJiByICE9IHJvICYmIHIubm9kZVR5cGUpIHsNCgkJCQkJeCAtPSByLnNjcm9sbExlZnQgfHwgMDsNCgkJCQkJeSAtPSByLnNjcm9sbFRvcCB8fCAwOw0KCQkJCQlyID0gci5wYXJlbnROb2RlOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIHt4IDogeCwgeSA6IHl9Ow0KCQl9LA0KDQoJCXBhcnNlU3R5bGUgOiBmdW5jdGlvbihzdCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgbyA9IHt9Ow0KDQoJCQlpZiAoIXN0KQ0KCQkJCXJldHVybiBvOw0KDQoJCQlmdW5jdGlvbiBjb21wcmVzcyhwLCBzLCBvdCkgew0KCQkJCXZhciB0LCByLCBiLCBsOw0KDQoJCQkJLy8gR2V0IHZhbHVlcyBhbmQgY2hlY2sgaXQgaXQgbmVlZHMgY29tcHJlc3NpbmcNCgkJCQl0ID0gb1twICsgJy10b3AnICsgc107DQoJCQkJaWYgKCF0KQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlyID0gb1twICsgJy1yaWdodCcgKyBzXTsNCgkJCQlpZiAodCAhPSByKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQliID0gb1twICsgJy1ib3R0b20nICsgc107DQoJCQkJaWYgKHIgIT0gYikNCgkJCQkJcmV0dXJuOw0KDQoJCQkJbCA9IG9bcCArICctbGVmdCcgKyBzXTsNCgkJCQlpZiAoYiAhPSBsKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQkvLyBDb21wcmVzcw0KCQkJCW9bb3RdID0gbDsNCgkJCQlkZWxldGUgb1twICsgJy10b3AnICsgc107DQoJCQkJZGVsZXRlIG9bcCArICctcmlnaHQnICsgc107DQoJCQkJZGVsZXRlIG9bcCArICctYm90dG9tJyArIHNdOw0KCQkJCWRlbGV0ZSBvW3AgKyAnLWxlZnQnICsgc107DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBjb21wcmVzczIodGEsIGEsIGIsIGMpIHsNCgkJCQl2YXIgdDsNCg0KCQkJCXQgPSBvW2FdOw0KCQkJCWlmICghdCkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJdCA9IG9bYl07DQoJCQkJaWYgKCF0KQ0KCQkJCQlyZXR1cm47DQoNCgkJCQl0ID0gb1tjXTsNCgkJCQlpZiAoIXQpDQoJCQkJCXJldHVybjsNCg0KCQkJCS8vIENvbXByZXNzDQoJCQkJb1t0YV0gPSBvW2FdICsgJyAnICsgb1tiXSArICcgJyArIG9bY107DQoJCQkJZGVsZXRlIG9bYV07DQoJCQkJZGVsZXRlIG9bYl07DQoJCQkJZGVsZXRlIG9bY107DQoJCQl9Ow0KDQoJCQlzdCA9IHN0LnJlcGxhY2UoLyYoIz9bYS16MC05XSspOy9nLCAnJiQxX01DRV9TRU1JXycpOyAvLyBQcm90ZWN0IGVudGl0aWVzDQoNCgkJCWVhY2goc3Quc3BsaXQoJzsnKSwgZnVuY3Rpb24odikgew0KCQkJCXZhciBzdiwgdXIgPSBbXTsNCg0KCQkJCWlmICh2KSB7DQoJCQkJCXYgPSB2LnJlcGxhY2UoL19NQ0VfU0VNSV8vZywgJzsnKTsgLy8gUmVzdG9yZSBlbnRpdGllcw0KCQkJCQl2ID0gdi5yZXBsYWNlKC91cmxcKFteXCldK1wpL2csIGZ1bmN0aW9uKHYpIHt1ci5wdXNoKHYpO3JldHVybiAndXJsKCcgKyB1ci5sZW5ndGggKyAnKSc7fSk7DQoJCQkJCXYgPSB2LnNwbGl0KCc6Jyk7DQoJCQkJCXN2ID0gdGlueW1jZS50cmltKHZbMV0pOw0KCQkJCQlzdiA9IHN2LnJlcGxhY2UoL3VybFwoKFteXCldKylcKS9nLCBmdW5jdGlvbihhLCBiKSB7cmV0dXJuIHVyW3BhcnNlSW50KGIpIC0gMV07fSk7DQoNCgkJCQkJc3YgPSBzdi5yZXBsYWNlKC9yZ2JcKFteXCldK1wpL2csIGZ1bmN0aW9uKHYpIHsNCgkJCQkJCXJldHVybiB0LnRvSGV4KHYpOw0KCQkJCQl9KTsNCg0KCQkJCQlpZiAocy51cmxfY29udmVydGVyKSB7DQoJCQkJCQlzdiA9IHN2LnJlcGxhY2UoL3VybFwoW1wnXCJdPyhbXlwpXCdcIl0rKVtcJ1wiXT9cKS9nLCBmdW5jdGlvbih4LCBjKSB7DQoJCQkJCQkJcmV0dXJuICd1cmwoJyArIHMudXJsX2NvbnZlcnRlci5jYWxsKHMudXJsX2NvbnZlcnRlcl9zY29wZSB8fCB0LCB0LmRlY29kZShjKSwgJ3N0eWxlJywgbnVsbCkgKyAnKSc7DQoJCQkJCQl9KTsNCgkJCQkJfQ0KDQoJCQkJCW9bdGlueW1jZS50cmltKHZbMF0pLnRvTG93ZXJDYXNlKCldID0gc3Y7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWNvbXByZXNzKCJib3JkZXIiLCAiIiwgImJvcmRlciIpOw0KCQkJY29tcHJlc3MoImJvcmRlciIsICItd2lkdGgiLCAiYm9yZGVyLXdpZHRoIik7DQoJCQljb21wcmVzcygiYm9yZGVyIiwgIi1jb2xvciIsICJib3JkZXItY29sb3IiKTsNCgkJCWNvbXByZXNzKCJib3JkZXIiLCAiLXN0eWxlIiwgImJvcmRlci1zdHlsZSIpOw0KCQkJY29tcHJlc3MoInBhZGRpbmciLCAiIiwgInBhZGRpbmciKTsNCgkJCWNvbXByZXNzKCJtYXJnaW4iLCAiIiwgIm1hcmdpbiIpOw0KCQkJY29tcHJlc3MyKCdib3JkZXInLCAnYm9yZGVyLXdpZHRoJywgJ2JvcmRlci1zdHlsZScsICdib3JkZXItY29sb3InKTsNCg0KCQkJaWYgKGlzSUUpIHsNCgkJCQkvLyBSZW1vdmUgcG9pbnRsZXNzIGJvcmRlcg0KCQkJCWlmIChvLmJvcmRlciA9PSAnbWVkaXVtIG5vbmUnKQ0KCQkJCQlvLmJvcmRlciA9ICcnOw0KCQkJfQ0KDQoJCQlyZXR1cm4gbzsNCgkJfSwNCg0KCQlzZXJpYWxpemVTdHlsZSA6IGZ1bmN0aW9uKG8sIG5hbWUpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9ICcnOw0KDQoJCQlmdW5jdGlvbiBhZGQodiwgaykgew0KCQkJCWlmIChrICYmIHYpIHsNCgkJCQkJLy8gUmVtb3ZlIGJyb3dzZXIgc3BlY2lmaWMgc3R5bGVzIGxpa2UgLW1vei0gb3IgLXdlYmtpdC0NCgkJCQkJaWYgKGsuaW5kZXhPZignLScpID09PSAwKQ0KCQkJCQkJcmV0dXJuOw0KDQoJCQkJCXN3aXRjaCAoaykgew0KCQkJCQkJY2FzZSAnZm9udC13ZWlnaHQnOg0KCQkJCQkJCS8vIE9wZXJhIHdpbGwgb3V0cHV0IGJvbGQgYXMgNzAwDQoJCQkJCQkJaWYgKHYgPT0gNzAwKQ0KCQkJCQkJCQl2ID0gJ2JvbGQnOw0KDQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWNhc2UgJ2NvbG9yJzoNCgkJCQkJCWNhc2UgJ2JhY2tncm91bmQtY29sb3InOg0KCQkJCQkJCXYgPSB2LnRvTG93ZXJDYXNlKCk7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCX0NCg0KCQkJCQlzICs9IChzID8gJyAnIDogJycpICsgayArICc6ICcgKyB2ICsgJzsnOw0KCQkJCX0NCgkJCX07DQoNCgkJCS8vIFZhbGlkYXRlIHN0eWxlIG91dHB1dA0KCQkJaWYgKG5hbWUgJiYgdC5fc3R5bGVzKSB7DQoJCQkJZWFjaCh0Ll9zdHlsZXNbJyonXSwgZnVuY3Rpb24obmFtZSkgew0KCQkJCQlhZGQob1tuYW1lXSwgbmFtZSk7DQoJCQkJfSk7DQoNCgkJCQllYWNoKHQuX3N0eWxlc1tuYW1lLnRvTG93ZXJDYXNlKCldLCBmdW5jdGlvbihuYW1lKSB7DQoJCQkJCWFkZChvW25hbWVdLCBuYW1lKTsNCgkJCQl9KTsNCgkJCX0gZWxzZQ0KCQkJCWVhY2gobywgYWRkKTsNCg0KCQkJcmV0dXJuIHM7DQoJCX0sDQoNCgkJbG9hZENTUyA6IGZ1bmN0aW9uKHUpIHsNCgkJCXZhciB0ID0gdGhpcywgZCA9IHQuZG9jLCBoZWFkOw0KDQoJCQlpZiAoIXUpDQoJCQkJdSA9ICcnOw0KDQoJCQloZWFkID0gdC5zZWxlY3QoJ2hlYWQnKVswXTsNCg0KCQkJZWFjaCh1LnNwbGl0KCcsJyksIGZ1bmN0aW9uKHUpIHsNCgkJCQl2YXIgbGluazsNCg0KCQkJCWlmICh0LmZpbGVzW3VdKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQl0LmZpbGVzW3VdID0gdHJ1ZTsNCgkJCQlsaW5rID0gdC5jcmVhdGUoJ2xpbmsnLCB7cmVsIDogJ3N0eWxlc2hlZXQnLCBocmVmIDogdGlueW1jZS5fYWRkVmVyKHUpfSk7DQoNCgkJCQkvLyBJRSA4IGhhcyBhIGJ1ZyB3aGVyZSBkeW5hbWljYWxseSBsb2FkaW5nIHN0eWxlc2hlZXRzIHdvdWxkIHByb2R1Y2UgYSAxIGl0ZW0gcmVtYWluaW5nIGJ1Zw0KCQkJCS8vIFRoaXMgZml4IHNlZW1zIHRvIHJlc29sdmUgdGhhdCBpc3N1ZSBieSByZWFsY2luZyB0aGUgZG9jdW1lbnQgb25lcyBhIHN0eWxlc2hlZXQgZmluaXNoZXMgbG9hZGluZw0KCQkJCS8vIEl0J3MgdWdseSBidXQgaXQgc2VlbXMgdG8gd29yayBmaW5lLg0KCQkJCWlmIChpc0lFICYmIGQuZG9jdW1lbnRNb2RlICYmIGQucmVjYWxjKSB7DQoJCQkJCWxpbmsub25sb2FkID0gZnVuY3Rpb24oKSB7DQoJCQkJCQlkLnJlY2FsYygpOw0KCQkJCQkJbGluay5vbmxvYWQgPSBudWxsOw0KCQkJCQl9Ow0KCQkJCX0NCg0KCQkJCWhlYWQuYXBwZW5kQ2hpbGQobGluayk7DQoJCQl9KTsNCgkJfSwNCg0KCQlhZGRDbGFzcyA6IGZ1bmN0aW9uKGUsIGMpIHsNCgkJCXJldHVybiB0aGlzLnJ1bihlLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIG87DQoNCgkJCQlpZiAoIWMpDQoJCQkJCXJldHVybiAwOw0KDQoJCQkJaWYgKHRoaXMuaGFzQ2xhc3MoZSwgYykpDQoJCQkJCXJldHVybiBlLmNsYXNzTmFtZTsNCg0KCQkJCW8gPSB0aGlzLnJlbW92ZUNsYXNzKGUsIGMpOw0KDQoJCQkJcmV0dXJuIGUuY2xhc3NOYW1lID0gKG8gIT0gJycgPyAobyArICcgJykgOiAnJykgKyBjOw0KCQkJfSk7DQoJCX0sDQoNCgkJcmVtb3ZlQ2xhc3MgOiBmdW5jdGlvbihlLCBjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHJlOw0KDQoJCQlyZXR1cm4gdC5ydW4oZSwgZnVuY3Rpb24oZSkgew0KCQkJCXZhciB2Ow0KDQoJCQkJaWYgKHQuaGFzQ2xhc3MoZSwgYykpIHsNCgkJCQkJaWYgKCFyZSkNCgkJCQkJCXJlID0gbmV3IFJlZ0V4cCgiKF58XFxzKykiICsgYyArICIoXFxzK3wkKSIsICJnIik7DQoNCgkJCQkJdiA9IGUuY2xhc3NOYW1lLnJlcGxhY2UocmUsICcgJyk7DQoJCQkJCXYgPSB0aW55bWNlLnRyaW0odiAhPSAnICcgPyB2IDogJycpOw0KDQoJCQkJCWUuY2xhc3NOYW1lID0gdjsNCg0KCQkJCQkvLyBFbXB0eSBjbGFzcyBhdHRyDQoJCQkJCWlmICghdikgew0KCQkJCQkJZS5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7DQoJCQkJCQllLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3NOYW1lJyk7DQoJCQkJCX0NCg0KCQkJCQlyZXR1cm4gdjsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gZS5jbGFzc05hbWU7DQoJCQl9KTsNCgkJfSwNCg0KCQloYXNDbGFzcyA6IGZ1bmN0aW9uKG4sIGMpIHsNCgkJCW4gPSB0aGlzLmdldChuKTsNCg0KCQkJaWYgKCFuIHx8ICFjKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJcmV0dXJuICgnICcgKyBuLmNsYXNzTmFtZSArICcgJykuaW5kZXhPZignICcgKyBjICsgJyAnKSAhPT0gLTE7DQoJCX0sDQoNCgkJc2hvdyA6IGZ1bmN0aW9uKGUpIHsNCgkJCXJldHVybiB0aGlzLnNldFN0eWxlKGUsICdkaXNwbGF5JywgJ2Jsb2NrJyk7DQoJCX0sDQoNCgkJaGlkZSA6IGZ1bmN0aW9uKGUpIHsNCgkJCXJldHVybiB0aGlzLnNldFN0eWxlKGUsICdkaXNwbGF5JywgJ25vbmUnKTsNCgkJfSwNCg0KCQlpc0hpZGRlbiA6IGZ1bmN0aW9uKGUpIHsNCgkJCWUgPSB0aGlzLmdldChlKTsNCg0KCQkJcmV0dXJuICFlIHx8IGUuc3R5bGUuZGlzcGxheSA9PSAnbm9uZScgfHwgdGhpcy5nZXRTdHlsZShlLCAnZGlzcGxheScpID09ICdub25lJzsNCgkJfSwNCg0KCQl1bmlxdWVJZCA6IGZ1bmN0aW9uKHApIHsNCgkJCXJldHVybiAoIXAgPyAnbWNlXycgOiBwKSArICh0aGlzLmNvdW50ZXIrKyk7DQoJCX0sDQoNCgkJc2V0SFRNTCA6IGZ1bmN0aW9uKGUsIGgpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJcmV0dXJuIHRoaXMucnVuKGUsIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgeCwgaSwgbmwsIG4sIHAsIHg7DQoNCgkJCQloID0gdC5wcm9jZXNzSFRNTChoKTsNCg0KCQkJCWlmIChpc0lFKSB7DQoJCQkJCWZ1bmN0aW9uIHNldCgpIHsNCgkJCQkJCS8vIFJlbW92ZSBhbGwgY2hpbGQgbm9kZXMNCgkJCQkJCXdoaWxlIChlLmZpcnN0Q2hpbGQpDQoJCQkJCQkJZS5maXJzdENoaWxkLnJlbW92ZU5vZGUoKTsNCg0KCQkJCQkJdHJ5IHsNCgkJCQkJCQkvLyBJRSB3aWxsIHJlbW92ZSBjb21tZW50cyBmcm9tIHRoZSBiZWdpbm5pbmcNCgkJCQkJCQkvLyB1bmxlc3MgeW91IHBhZGQgdGhlIGNvbnRlbnRzIHdpdGggc29tZXRoaW5nDQoJCQkJCQkJZS5pbm5lckhUTUwgPSAnPGJyIC8+JyArIGg7DQoJCQkJCQkJZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpOw0KCQkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCQkvLyBJRSBzb21ldGltZXMgcHJvZHVjZXMgYW4gdW5rbm93biBydW50aW1lIGVycm9yIG9uIGlubmVySFRNTCBpZiBpdCdzIGFuIGJsb2NrIGVsZW1lbnQgd2l0aGluIGEgYmxvY2sgZWxlbWVudCBmb3IgZXhhbXBsZSBhIGRpdiBpbnNpZGUgYSBwDQoJCQkJCQkJLy8gVGhpcyBzZWVtcyB0byBmaXggdGhpcyBwcm9ibGVtDQoNCgkJCQkJCQkvLyBDcmVhdGUgbmV3IGRpdiB3aXRoIEhUTUwgY29udGVudHMgYW5kIGEgQlIgaW5mcm9udCB0byBrZWVwIGNvbW1lbnRzDQoJCQkJCQkJeCA9IHQuY3JlYXRlKCdkaXYnKTsNCgkJCQkJCQl4LmlubmVySFRNTCA9ICc8YnIgLz4nICsgaDsNCg0KCQkJCQkJCS8vIEFkZCBhbGwgY2hpbGRyZW4gZnJvbSBkaXYgdG8gdGFyZ2V0DQoJCQkJCQkJZWFjaCAoeC5jaGlsZE5vZGVzLCBmdW5jdGlvbihuLCBpKSB7DQoJCQkJCQkJCS8vIFNraXAgYnIgZWxlbWVudA0KCQkJCQkJCQlpZiAoaSkNCgkJCQkJCQkJCWUuYXBwZW5kQ2hpbGQobik7DQoJCQkJCQkJfSk7DQoJCQkJCQl9DQoJCQkJCX07DQoNCgkJCQkJLy8gSUUgaGFzIGEgc2VyaW91cyBidWcgd2hlbiBpdCBjb21lcyB0byBwYXJhZ3JhcGhzIGl0IGNhbiBwcm9kdWNlIGFuIGludmFsaWQNCgkJCQkJLy8gRE9NIHRyZWUgaWYgY29udGVudHMgbGlrZSB0aGlzIDxwPjx1bD48bGk+SXRlbSAxPC9saT48L3VsPjwvcD4gaXMgaW5zZXJ0ZWQNCgkJCQkJLy8gSXQgc2VlbXMgdG8gYmUgdGhhdCBJRSBkb2Vzbid0IGxpa2UgYSByb290IGJsb2NrIGVsZW1lbnQgcGxhY2VkIGluc2lkZSBhbm90aGVyIHJvb3QgYmxvY2sgZWxlbWVudA0KCQkJCQlpZiAodC5zZXR0aW5ncy5maXhfaWVfcGFyYWdyYXBocykNCgkJCQkJCWggPSBoLnJlcGxhY2UoLzxwPjxcL3A+fDxwKFtePl0rKT48XC9wPnw8cFteXC8rXVwvPi9naSwgJzxwJDEgX21jZV9rZWVwPSJ0cnVlIj4mbmJzcDs8L3A+Jyk7DQoNCgkJCQkJc2V0KCk7DQoNCgkJCQkJaWYgKHQuc2V0dGluZ3MuZml4X2llX3BhcmFncmFwaHMpIHsNCgkJCQkJCS8vIENoZWNrIGZvciBvZGQgcGFyYWdyYXBocyB0aGlzIGlzIGEgc2lnbiBvZiBhIGJyb2tlbiBET00NCgkJCQkJCW5sID0gZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicCIpOw0KCQkJCQkJZm9yIChpID0gbmwubGVuZ3RoIC0gMSwgeCA9IDA7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQkJbiA9IG5sW2ldOw0KDQoJCQkJCQkJaWYgKCFuLmhhc0NoaWxkTm9kZXMoKSkgew0KCQkJCQkJCQlpZiAoIW4uX21jZV9rZWVwKSB7DQoJCQkJCQkJCQl4ID0gMTsgLy8gSXMgYnJva2VuDQoJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCW4ucmVtb3ZlQXR0cmlidXRlKCdfbWNlX2tlZXAnKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkvLyBUaW1lIHRvIGZpeCB0aGUgbWFkbmVzcyBJRSBsZWZ0IHVzDQoJCQkJCWlmICh4KSB7DQoJCQkJCQkvLyBTbyBpZiB3ZSByZXBsYWNlIHRoZSBwIGVsZW1lbnRzIHdpdGggZGl2cyBhbmQgbWFyayB0aGVtIGFuZCB0aGVuIHJlcGxhY2UgdGhlbSBiYWNrIHRvIHBhcmFncmFwaHMNCgkJCQkJCS8vIGFmdGVyIHdlIHVzZSBpbm5lckhUTUwgd2UgY2FuIGZpeCB0aGUgRE9NIHRyZWUNCgkJCQkJCWggPSBoLnJlcGxhY2UoLzxwIChbXj5dKyk+fDxwPi9pZywgJzxkaXYgJDEgX21jZV90bXA9IjEiPicpOw0KCQkJCQkJaCA9IGgucmVwbGFjZSgvPFwvcD4vZ2ksICc8L2Rpdj4nKTsNCg0KCQkJCQkJLy8gU2V0IHRoZSBuZXcgSFRNTCB3aXRoIERJVnMNCgkJCQkJCXNldCgpOw0KDQoJCQkJCQkvLyBSZXBsYWNlIGFsbCBESVYgZWxlbWVudHMgd2l0aCB0aGUgX21jZV90bXAgYXR0aWJ1dGUgYmFjayB0byBwYXJhZ3JhcGhzDQoJCQkJCQkvLyBUaGlzIGlzIG5lZWRlZCBzaW5jZSBJRSBoYXMgYSBhbm5veWluZyBidWcgc2VlIGFib3ZlIGZvciBkZXRhaWxzDQoJCQkJCQkvLyBUaGlzIGlzIGEgc2xvdyBwcm9jZXNzIGJ1dCBpdCBoYXMgdG8gYmUgZG9uZS4gOigNCgkJCQkJCWlmICh0LnNldHRpbmdzLmZpeF9pZV9wYXJhZ3JhcGhzKSB7DQoJCQkJCQkJbmwgPSBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJESVYiKTsNCgkJCQkJCQlmb3IgKGkgPSBubC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCQkJCQluID0gbmxbaV07DQoNCgkJCQkJCQkJLy8gSXMgaXQgYSB0ZW1wIGRpdg0KCQkJCQkJCQlpZiAobi5fbWNlX3RtcCkgew0KCQkJCQkJCQkJLy8gQ3JlYXRlIG5ldyBwYXJhZ3JhcGgNCgkJCQkJCQkJCXAgPSB0LmRvYy5jcmVhdGVFbGVtZW50KCdwJyk7DQoNCgkJCQkJCQkJCS8vIENvcHkgYWxsIGF0dHJpYnV0ZXMNCgkJCQkJCQkJCW4uY2xvbmVOb2RlKGZhbHNlKS5vdXRlckhUTUwucmVwbGFjZSgvKFthLXowLTlcLV9dKyk9L2dpLCBmdW5jdGlvbihhLCBiKSB7DQoJCQkJCQkJCQkJdmFyIHY7DQoNCgkJCQkJCQkJCQlpZiAoYiAhPT0gJ19tY2VfdG1wJykgew0KCQkJCQkJCQkJCQl2ID0gbi5nZXRBdHRyaWJ1dGUoYik7DQoNCgkJCQkJCQkJCQkJaWYgKCF2ICYmIGIgPT09ICdjbGFzcycpDQoJCQkJCQkJCQkJCQl2ID0gbi5jbGFzc05hbWU7DQoNCgkJCQkJCQkJCQkJcC5zZXRBdHRyaWJ1dGUoYiwgdik7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfSk7DQoNCgkJCQkJCQkJCS8vIEFwcGVuZCBhbGwgY2hpbGRyZW4gdG8gbmV3IHBhcmFncmFwaA0KCQkJCQkJCQkJZm9yICh4ID0gMDsgeDxuLmNoaWxkTm9kZXMubGVuZ3RoOyB4KyspDQoJCQkJCQkJCQkJcC5hcHBlbmRDaGlsZChuLmNoaWxkTm9kZXNbeF0uY2xvbmVOb2RlKHRydWUpKTsNCg0KCQkJCQkJCQkJLy8gUmVwbGFjZSBkaXYgd2l0aCBuZXcgcGFyYWdyYXBoDQoJCQkJCQkJCQluLnN3YXBOb2RlKHApOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSBlbHNlDQoJCQkJCWUuaW5uZXJIVE1MID0gaDsNCg0KCQkJCXJldHVybiBoOw0KCQkJfSk7DQoJCX0sDQoNCgkJcHJvY2Vzc0hUTUwgOiBmdW5jdGlvbihoKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBjb2RlQmxvY2tzID0gW107DQoNCgkJCWlmICghcy5wcm9jZXNzX2h0bWwpDQoJCQkJcmV0dXJuIGg7DQoNCgkJCWlmIChpc0lFKSB7DQoJCQkJaCA9IGgucmVwbGFjZSgvJmFwb3M7L2csICcmIzM5OycpOyAvLyBJRSBjYW4ndCBoYW5kbGUgYXBvcw0KCQkJCWggPSBoLnJlcGxhY2UoL1xzKyhkaXNhYmxlZHxjaGVja2VkfHJlYWRvbmx5fHNlbGVjdGVkKVxzKj1ccypbXCJcJ10/KGZhbHNlfDApW1wiXCddPy9naSwgJycpOyAvLyBJRSBkb2Vzbid0IGhhbmRsZSBkZWZhdWx0IHZhbHVlcyBjb3JyZWN0DQoJCQl9DQoNCgkJCS8vIEZvcmNlIHRhZ3Mgb3BlbiwgYW5kIG9uIElFOSByZXBsYWNlICQxJDIgdGhhdCBnb3QgbGVmdCBiZWhpbmQgZHVlIHRvIGJ1Z3MgaW4gdGhlaXIgUmVnRXhwIGVuZ2luZQ0KCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoLzxhKCApKFtePl0rKVwvPnw8YVwvPi9naSwgJzxhJDEkMj48L2E+JywgaCk7IC8vIEZvcmNlIG9wZW4NCg0KCQkJLy8gU3RvcmUgYXdheSBzcmMgYW5kIGhyZWYgaW4gX21jZV9zcmMgYW5kIG1jZV9ocmVmIHNpbmNlIGJyb3dzZXJzIG1lc3MgdGhlbSB1cA0KCQkJaWYgKHMua2VlcF92YWx1ZXMpIHsNCgkJCQkvLyBXcmFwIHNjcmlwdHMgYW5kIHN0eWxlcyBpbiBjb21tZW50cyBmb3Igc2VyaWFsaXphdGlvbiBwdXJwb3Nlcw0KCQkJCWlmICgvPHNjcmlwdHxub3NjcmlwdHxzdHlsZS9pLnRlc3QoaCkpIHsNCgkJCQkJZnVuY3Rpb24gdHJpbShzKSB7DQoJCQkJCQkvLyBSZW1vdmUgcHJlZml4IGFuZCBzdWZmaXggY29kZSBmb3IgZWxlbWVudA0KCQkJCQkJcyA9IHMucmVwbGFjZSgvKDwhLS1cW0NEQVRBXFt8XF1cXS0tPikvZywgJ1xuJyk7DQoJCQkJCQlzID0gcy5yZXBsYWNlKC9eW1xyXG5dKnxbXHJcbl0qJC9nLCAnJyk7DQoJCQkJCQlzID0gcy5yZXBsYWNlKC9eXHMqKFwvXC9ccyo8IS0tfFwvXC9ccyo8IVxbQ0RBVEFcW3w8IS0tfDwhXFtDREFUQVxbKVtcclxuXSovZywgJycpOw0KCQkJCQkJcyA9IHMucmVwbGFjZSgvXHMqKFwvXC9ccypcXVxdPnxcL1wvXHMqLS0+fFxdXF0+fC0tPnxcXVxdLS0+KVxzKiQvZywgJycpOw0KDQoJCQkJCQlyZXR1cm4gczsNCgkJCQkJfTsNCg0KCQkJCQkvLyBXcmFwIHRoZSBzY3JpcHQgY29udGVudHMgaW4gQ0RBVEEgYW5kIGtlZXAgdGhlbSBmcm9tIGV4ZWN1dGluZw0KCQkJCQloID0gaC5yZXBsYWNlKC88c2NyaXB0KFtePl0rfCk+KFtcc1xTXSo/KTxcL3NjcmlwdD4vZ2ksIGZ1bmN0aW9uKHYsIGF0dHJpYnMsIHRleHQpIHsNCgkJCQkJCS8vIEZvcmNlIHR5cGUgYXR0cmlidXRlDQoJCQkJCQlpZiAoIWF0dHJpYnMpDQoJCQkJCQkJYXR0cmlicyA9ICcgdHlwZT0idGV4dC9qYXZhc2NyaXB0Iic7DQoNCgkJCQkJCS8vIENvbnZlcnQgdGhlIHNyYyBhdHRyaWJ1dGUgb2YgdGhlIHNjcmlwdHMNCgkJCQkJCWF0dHJpYnMgPSBhdHRyaWJzLnJlcGxhY2UoL3NyYz1cIihbXlwiXSspXCI/L2ksIGZ1bmN0aW9uKGEsIHVybCkgew0KCQkJCQkJCWlmIChzLnVybF9jb252ZXJ0ZXIpDQoJCQkJCQkJCXVybCA9IHQuZW5jb2RlKHMudXJsX2NvbnZlcnRlci5jYWxsKHMudXJsX2NvbnZlcnRlcl9zY29wZSB8fCB0LCB0LmRlY29kZSh1cmwpLCAnc3JjJywgJ3NjcmlwdCcpKTsNCg0KCQkJCQkJCXJldHVybiAnX21jZV9zcmM9IicgKyB1cmwgKyAnIic7DQoJCQkJCQl9KTsNCg0KCQkJCQkJLy8gV3JhcCB0ZXh0IGNvbnRlbnRzDQoJCQkJCQlpZiAodGlueW1jZS50cmltKHRleHQpKSB7DQoJCQkJCQkJY29kZUJsb2Nrcy5wdXNoKHRyaW0odGV4dCkpOw0KCQkJCQkJCXRleHQgPSAnPCEtLVxuTUNFX1NDUklQVDonICsgKGNvZGVCbG9ja3MubGVuZ3RoIC0gMSkgKyAnXG4vLyAtLT4nOw0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm4gJzxtY2U6c2NyaXB0JyArIGF0dHJpYnMgKyAnPicgKyB0ZXh0ICsgJzwvbWNlOnNjcmlwdD4nOw0KCQkJCQl9KTsNCg0KCQkJCQkvLyBXcmFwIHN0eWxlIGVsZW1lbnRzDQoJCQkJCWggPSBoLnJlcGxhY2UoLzxzdHlsZShbXj5dK3wpPihbXHNcU10qPyk8XC9zdHlsZT4vZ2ksIGZ1bmN0aW9uKHYsIGF0dHJpYnMsIHRleHQpIHsNCgkJCQkJCS8vIFdyYXAgdGV4dCBjb250ZW50cw0KCQkJCQkJaWYgKHRleHQpIHsNCgkJCQkJCQljb2RlQmxvY2tzLnB1c2godHJpbSh0ZXh0KSk7DQoJCQkJCQkJdGV4dCA9ICc8IS0tXG5NQ0VfU0NSSVBUOicgKyAoY29kZUJsb2Nrcy5sZW5ndGggLSAxKSArICdcbi0tPic7DQoJCQkJCQl9DQoNCgkJCQkJCXJldHVybiAnPG1jZTpzdHlsZScgKyBhdHRyaWJzICsgJz4nICsgdGV4dCArICc8L21jZTpzdHlsZT48c3R5bGUgJyArIGF0dHJpYnMgKyAnIF9tY2VfYm9ndXM9IjEiPicgKyB0ZXh0ICsgJzwvc3R5bGU+JzsNCgkJCQkJfSk7DQoNCgkJCQkJLy8gV3JhcCBub3NjcmlwdCBlbGVtZW50cw0KCQkJCQloID0gaC5yZXBsYWNlKC88bm9zY3JpcHQoW14+XSt8KT4oW1xzXFNdKj8pPFwvbm9zY3JpcHQ+L2csIGZ1bmN0aW9uKHYsIGF0dHJpYnMsIHRleHQpIHsNCgkJCQkJCXJldHVybiAnPG1jZTpub3NjcmlwdCcgKyBhdHRyaWJzICsgJz48IS0tJyArIHQuZW5jb2RlKHRleHQpLnJlcGxhY2UoLy0tL2csICcmIzQ1OyYjNDU7JykgKyAnLS0+PC9tY2U6bm9zY3JpcHQ+JzsNCgkJCQkJfSk7DQoJCQkJfQ0KDQoJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoLzwhXFtDREFUQVxbKFtcc1xTXSspXF1cXT4vZywgJzwhLS1bQ0RBVEFbJDFdXS0tPicsIGgpOw0KDQoJCQkJLy8gVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIEhUTUwgc3RyaW5nIHRvIGZvcmNlIGJvb2xlYW4NCgkJCQkvLyBhdHRyaWJ1dGVzIHRvIHRoZSBhdHRyPSJhdHRyIiBmb3JtYXQgYW5kIGNvbnZlcnQgc3R5bGUsIHNyYyBhbmQgaHJlZiB0byBfbWNlXyB2ZXJzaW9ucw0KCQkJCWZ1bmN0aW9uIHByb2Nlc3NUYWdzKGh0bWwpIHsNCgkJCQkJcmV0dXJuIGh0bWwucmVwbGFjZSh0YWdSZWdFeHAsIGZ1bmN0aW9uKG1hdGNoLCBlbG1fbmFtZSwgYXR0cnMsIGVuZCkgew0KCQkJCQkJcmV0dXJuICc8JyArIGVsbV9uYW1lICsgYXR0cnMucmVwbGFjZShhdHRyUmVnRXhwLCBmdW5jdGlvbihtYXRjaCwgbmFtZSwgdmFsdWUsIHZhbDIsIHZhbDMpIHsNCgkJCQkJCQl2YXIgbWNlVmFsdWU7DQoNCgkJCQkJCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOw0KCQkJCQkJCXZhbHVlID0gdmFsdWUgfHwgdmFsMiB8fCB2YWwzIHx8ICIiOw0KDQoJCQkJCQkJLy8gVHJlYXQgYm9vbGVhbiBhdHRyaWJ1dGVzDQoJCQkJCQkJaWYgKGJvb2xBdHRyc1tuYW1lXSkgew0KCQkJCQkJCQkvLyBmYWxzZSBvciAwIGlzIHRyZWF0ZWQgYXMgYSBtaXNzaW5nIGF0dHJpYnV0ZQ0KCQkJCQkJCQlpZiAodmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgPT09ICcwJykNCgkJCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJCQlyZXR1cm4gbmFtZSArICc9IicgKyBuYW1lICsgJyInOw0KCQkJCQkJCX0NCg0KCQkJCQkJCS8vIElzIGF0dHJpYnV0ZSBvbmUgdGhhdCBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudA0KCQkJCQkJCWlmIChtY2VBdHRyaWJzW25hbWVdICYmIGF0dHJzLmluZGV4T2YoJ19tY2VfJyArIG5hbWUpID09IC0xKSB7DQoJCQkJCQkJCW1jZVZhbHVlID0gdC5kZWNvZGUodmFsdWUpOw0KDQoJCQkJCQkJCS8vIENvbnZlcnQgVVJMcyB0byByZWxhdGl2ZS9hYnNvbHV0ZSBvbmVzDQoJCQkJCQkJCWlmIChzLnVybF9jb252ZXJ0ZXIgJiYgKG5hbWUgPT0gInNyYyIgfHwgbmFtZSA9PSAiaHJlZiIpKQ0KCQkJCQkJCQkJbWNlVmFsdWUgPSBzLnVybF9jb252ZXJ0ZXIuY2FsbChzLnVybF9jb252ZXJ0ZXJfc2NvcGUgfHwgdCwgbWNlVmFsdWUsIG5hbWUsIGVsbV9uYW1lKTsNCg0KCQkJCQkJCQkvLyBQcm9jZXNzIHN0eWxlcyBsb3dlcmNhc2VzIHRoZW0gYW5kIGNvbXByZXNzZXMgdGhlbQ0KCQkJCQkJCQlpZiAobmFtZSA9PSAnc3R5bGUnKQ0KCQkJCQkJCQkJbWNlVmFsdWUgPSB0LnNlcmlhbGl6ZVN0eWxlKHQucGFyc2VTdHlsZShtY2VWYWx1ZSksIG5hbWUpOw0KDQoJCQkJCQkJCXJldHVybiBuYW1lICsgJz0iJyArIHZhbHVlICsgJyInICsgJyBfbWNlXycgKyBuYW1lICsgJz0iJyArIHQuZW5jb2RlKG1jZVZhbHVlKSArICciJzsNCgkJCQkJCQl9DQoNCgkJCQkJCQlyZXR1cm4gbWF0Y2g7DQoJCQkJCQl9KSArIGVuZCArICc+JzsNCgkJCQkJfSk7DQoJCQkJfTsNCg0KCQkJCWggPSBwcm9jZXNzVGFncyhoKTsNCg0KCQkJCS8vIFJlc3RvcmUgc2NyaXB0IGJsb2Nrcw0KCQkJCWggPSBoLnJlcGxhY2UoL01DRV9TQ1JJUFQ6KFswLTldKykvZywgZnVuY3Rpb24odmFsLCBpZHgpIHsNCgkJCQkJcmV0dXJuIGNvZGVCbG9ja3NbaWR4XTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJZ2V0T3V0ZXJIVE1MIDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIGQ7DQoNCgkJCWUgPSB0aGlzLmdldChlKTsNCg0KCQkJaWYgKCFlKQ0KCQkJCXJldHVybiBudWxsOw0KDQoJCQlpZiAoZS5vdXRlckhUTUwgIT09IHVuZGVmaW5lZCkNCgkJCQlyZXR1cm4gZS5vdXRlckhUTUw7DQoNCgkJCWQgPSAoZS5vd25lckRvY3VtZW50IHx8IHRoaXMuZG9jKS5jcmVhdGVFbGVtZW50KCJib2R5Iik7DQoJCQlkLmFwcGVuZENoaWxkKGUuY2xvbmVOb2RlKHRydWUpKTsNCg0KCQkJcmV0dXJuIGQuaW5uZXJIVE1MOw0KCQl9LA0KDQoJCXNldE91dGVySFRNTCA6IGZ1bmN0aW9uKGUsIGgsIGQpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJZnVuY3Rpb24gc2V0SFRNTChlLCBoLCBkKSB7DQoJCQkJdmFyIG4sIHRwOw0KDQoJCQkJdHAgPSBkLmNyZWF0ZUVsZW1lbnQoImJvZHkiKTsNCgkJCQl0cC5pbm5lckhUTUwgPSBoOw0KDQoJCQkJbiA9IHRwLmxhc3RDaGlsZDsNCgkJCQl3aGlsZSAobikgew0KCQkJCQl0Lmluc2VydEFmdGVyKG4uY2xvbmVOb2RlKHRydWUpLCBlKTsNCgkJCQkJbiA9IG4ucHJldmlvdXNTaWJsaW5nOw0KCQkJCX0NCg0KCQkJCXQucmVtb3ZlKGUpOw0KCQkJfTsNCg0KCQkJcmV0dXJuIHRoaXMucnVuKGUsIGZ1bmN0aW9uKGUpIHsNCgkJCQllID0gdC5nZXQoZSk7DQoNCgkJCQkvLyBPbmx5IHNldCBIVE1MIG9uIGVsZW1lbnRzDQoJCQkJaWYgKGUubm9kZVR5cGUgPT0gMSkgew0KCQkJCQlkID0gZCB8fCBlLm93bmVyRG9jdW1lbnQgfHwgdC5kb2M7DQoNCgkJCQkJaWYgKGlzSUUpIHsNCgkJCQkJCXRyeSB7DQoJCQkJCQkJLy8gVHJ5IG91dGVySFRNTCBmb3IgSUUgaXQgc29tZXRpbWVzIHByb2R1Y2VzIGFuIHVua25vd24gcnVudGltZSBlcnJvcg0KCQkJCQkJCWlmIChpc0lFICYmIGUubm9kZVR5cGUgPT0gMSkNCgkJCQkJCQkJZS5vdXRlckhUTUwgPSBoOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJc2V0SFRNTChlLCBoLCBkKTsNCgkJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkJLy8gRml4IGZvciB1bmtub3duIHJ1bnRpbWUgZXJyb3INCgkJCQkJCQlzZXRIVE1MKGUsIGgsIGQpOw0KCQkJCQkJfQ0KCQkJCQl9IGVsc2UNCgkJCQkJCXNldEhUTUwoZSwgaCwgZCk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0sDQoNCgkJZGVjb2RlIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIGUsIG4sIHY7DQoNCgkJCS8vIExvb2sgZm9yIGVudGl0aWVzIHRvIGRlY29kZQ0KCQkJaWYgKC8mW1x3I10rOy8udGVzdChzKSkgew0KCQkJCS8vIERlY29kZSB0aGUgZW50aXRpZXMgdXNpbmcgYSBkaXYgZWxlbWVudCBub3Qgc3VwZXIgZWZmaWNpZW50IGJ1dCBsZXNzIGNvZGUNCgkJCQllID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJCQkJZS5pbm5lckhUTUwgPSBzOw0KCQkJCW4gPSBlLmZpcnN0Q2hpbGQ7DQoJCQkJdiA9ICcnOw0KDQoJCQkJaWYgKG4pIHsNCgkJCQkJZG8gew0KCQkJCQkJdiArPSBuLm5vZGVWYWx1ZTsNCgkJCQkJfSB3aGlsZSAobiA9IG4ubmV4dFNpYmxpbmcpOw0KCQkJCX0NCg0KCQkJCXJldHVybiB2IHx8IHM7DQoJCQl9DQoNCgkJCXJldHVybiBzOw0KCQl9LA0KDQoJCWVuY29kZSA6IGZ1bmN0aW9uKHN0cikgew0KCQkJcmV0dXJuICgnJyArIHN0cikucmVwbGFjZShlbmNvZGVDaGFyc1JlLCBmdW5jdGlvbihjaHIpIHsNCgkJCQlyZXR1cm4gZW5jb2RlZENoYXJzW2Nocl07DQoJCQl9KTsNCgkJfSwNCg0KCQlpbnNlcnRBZnRlciA6IGZ1bmN0aW9uKG5vZGUsIHJlZmVyZW5jZV9ub2RlKSB7DQoJCQlyZWZlcmVuY2Vfbm9kZSA9IHRoaXMuZ2V0KHJlZmVyZW5jZV9ub2RlKTsNCg0KCQkJcmV0dXJuIHRoaXMucnVuKG5vZGUsIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQl2YXIgcGFyZW50LCBuZXh0U2libGluZzsNCg0KCQkJCXBhcmVudCA9IHJlZmVyZW5jZV9ub2RlLnBhcmVudE5vZGU7DQoJCQkJbmV4dFNpYmxpbmcgPSByZWZlcmVuY2Vfbm9kZS5uZXh0U2libGluZzsNCg0KCQkJCWlmIChuZXh0U2libGluZykNCgkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBuZXh0U2libGluZyk7DQoJCQkJZWxzZQ0KCQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQobm9kZSk7DQoNCgkJCQlyZXR1cm4gbm9kZTsNCgkJCX0pOw0KCQl9LA0KDQoJCWlzQmxvY2sgOiBmdW5jdGlvbihuKSB7DQoJCQlpZiAobi5ub2RlVHlwZSAmJiBuLm5vZGVUeXBlICE9PSAxKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJbiA9IG4ubm9kZU5hbWUgfHwgbjsNCg0KCQkJcmV0dXJuIGJsb2NrUmUudGVzdChuKTsNCgkJfSwNCg0KCQlyZXBsYWNlIDogZnVuY3Rpb24obiwgbywgaykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoaXMobywgJ2FycmF5JykpDQoJCQkJbiA9IG4uY2xvbmVOb2RlKHRydWUpOw0KDQoJCQlyZXR1cm4gdC5ydW4obywgZnVuY3Rpb24obykgew0KCQkJCWlmIChrKSB7DQoJCQkJCWVhY2godGlueW1jZS5ncmVwKG8uY2hpbGROb2RlcyksIGZ1bmN0aW9uKGMpIHsNCgkJCQkJCW4uYXBwZW5kQ2hpbGQoYyk7DQoJCQkJCX0pOw0KCQkJCX0NCg0KCQkJCXJldHVybiBvLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sIG8pOw0KCQkJfSk7DQoJCX0sDQoNCgkJcmVuYW1lIDogZnVuY3Rpb24oZWxtLCBuYW1lKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG5ld0VsbTsNCg0KCQkJaWYgKGVsbS5ub2RlTmFtZSAhPSBuYW1lLnRvVXBwZXJDYXNlKCkpIHsNCgkJCQkvLyBSZW5hbWUgYmxvY2sgZWxlbWVudA0KCQkJCW5ld0VsbSA9IHQuY3JlYXRlKG5hbWUpOw0KDQoJCQkJLy8gQ29weSBhdHRyaWJzIHRvIG5ldyBibG9jaw0KCQkJCWVhY2godC5nZXRBdHRyaWJzKGVsbSksIGZ1bmN0aW9uKGF0dHJfbm9kZSkgew0KCQkJCQl0LnNldEF0dHJpYihuZXdFbG0sIGF0dHJfbm9kZS5ub2RlTmFtZSwgdC5nZXRBdHRyaWIoZWxtLCBhdHRyX25vZGUubm9kZU5hbWUpKTsNCgkJCQl9KTsNCg0KCQkJCS8vIFJlcGxhY2UgYmxvY2sNCgkJCQl0LnJlcGxhY2UobmV3RWxtLCBlbG0sIDEpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gbmV3RWxtIHx8IGVsbTsNCgkJfSwNCg0KCQlmaW5kQ29tbW9uQW5jZXN0b3IgOiBmdW5jdGlvbihhLCBiKSB7DQoJCQl2YXIgcHMgPSBhLCBwZTsNCg0KCQkJd2hpbGUgKHBzKSB7DQoJCQkJcGUgPSBiOw0KDQoJCQkJd2hpbGUgKHBlICYmIHBzICE9IHBlKQ0KCQkJCQlwZSA9IHBlLnBhcmVudE5vZGU7DQoNCgkJCQlpZiAocHMgPT0gcGUpDQoJCQkJCWJyZWFrOw0KDQoJCQkJcHMgPSBwcy5wYXJlbnROb2RlOw0KCQkJfQ0KDQoJCQlpZiAoIXBzICYmIGEub3duZXJEb2N1bWVudCkNCgkJCQlyZXR1cm4gYS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCg0KCQkJcmV0dXJuIHBzOw0KCQl9LA0KDQoJCXRvSGV4IDogZnVuY3Rpb24ocykgew0KCQkJdmFyIGMgPSAvXlxzKnJnYlxzKj9cKFxzKj8oWzAtOV0rKVxzKj8sXHMqPyhbMC05XSspXHMqPyxccyo/KFswLTldKylccyo/XClccyokL2kuZXhlYyhzKTsNCg0KCQkJZnVuY3Rpb24gaGV4KHMpIHsNCgkJCQlzID0gcGFyc2VJbnQocykudG9TdHJpbmcoMTYpOw0KDQoJCQkJcmV0dXJuIHMubGVuZ3RoID4gMSA/IHMgOiAnMCcgKyBzOyAvLyAwIC0+IDAwDQoJCQl9Ow0KDQoJCQlpZiAoYykgew0KCQkJCXMgPSAnIycgKyBoZXgoY1sxXSkgKyBoZXgoY1syXSkgKyBoZXgoY1szXSk7DQoNCgkJCQlyZXR1cm4gczsNCgkJCX0NCg0KCQkJcmV0dXJuIHM7DQoJCX0sDQoNCgkJZ2V0Q2xhc3NlcyA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBjbCA9IFtdLCBpLCBsbyA9IHt9LCBmID0gdC5zZXR0aW5ncy5jbGFzc19maWx0ZXIsIG92Ow0KDQoJCQlpZiAodC5jbGFzc2VzKQ0KCQkJCXJldHVybiB0LmNsYXNzZXM7DQoNCgkJCWZ1bmN0aW9uIGFkZENsYXNzZXMocykgew0KCQkJCS8vIElFIHN0eWxlIGltcG9ydHMNCgkJCQllYWNoKHMuaW1wb3J0cywgZnVuY3Rpb24ocikgew0KCQkJCQlhZGRDbGFzc2VzKHIpOw0KCQkJCX0pOw0KDQoJCQkJZWFjaChzLmNzc1J1bGVzIHx8IHMucnVsZXMsIGZ1bmN0aW9uKHIpIHsNCgkJCQkJLy8gUmVhbCB0eXBlIG9yIGZha2UgaXQgb24gSUUNCgkJCQkJc3dpdGNoIChyLnR5cGUgfHwgMSkgew0KCQkJCQkJLy8gUnVsZQ0KCQkJCQkJY2FzZSAxOg0KCQkJCQkJCWlmIChyLnNlbGVjdG9yVGV4dCkgew0KCQkJCQkJCQllYWNoKHIuc2VsZWN0b3JUZXh0LnNwbGl0KCcsJyksIGZ1bmN0aW9uKHYpIHsNCgkJCQkJCQkJCXYgPSB2LnJlcGxhY2UoL15ccyp8XHMqJHxeXHNcLi9nLCAiIik7DQoNCgkJCQkJCQkJCS8vIElzIGludGVybmFsIG9yIGl0IGRvZXNuJ3QgY29udGFpbiBhIGNsYXNzDQoJCQkJCQkJCQlpZiAoL1wubWNlLy50ZXN0KHYpIHx8ICEvXC5bXHdcLV0rJC8udGVzdCh2KSkNCgkJCQkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCQkJCS8vIFJlbW92ZSBldmVyeXRoaW5nIGJ1dCBjbGFzcyBuYW1lDQoJCQkJCQkJCQlvdiA9IHY7DQoJCQkJCQkJCQl2ID0gdGlueW1jZS5fcmVwbGFjZSgvLipcLihbYS16MC05X1wtXSspLiovaSwgJyQxJywgdik7DQoNCgkJCQkJCQkJCS8vIEZpbHRlciBjbGFzc2VzDQoJCQkJCQkJCQlpZiAoZiAmJiAhKHYgPSBmKHYsIG92KSkpDQoJCQkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJCQlpZiAoIWxvW3ZdKSB7DQoJCQkJCQkJCQkJY2wucHVzaCh7J2NsYXNzJyA6IHZ9KTsNCgkJCQkJCQkJCQlsb1t2XSA9IDE7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0pOw0KCQkJCQkJCX0NCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJLy8gSW1wb3J0DQoJCQkJCQljYXNlIDM6DQoJCQkJCQkJYWRkQ2xhc3NlcyhyLnN0eWxlU2hlZXQpOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9Ow0KDQoJCQl0cnkgew0KCQkJCWVhY2godC5kb2Muc3R5bGVTaGVldHMsIGFkZENsYXNzZXMpOw0KCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkvLyBJZ25vcmUNCgkJCX0NCg0KCQkJaWYgKGNsLmxlbmd0aCA+IDApDQoJCQkJdC5jbGFzc2VzID0gY2w7DQoNCgkJCXJldHVybiBjbDsNCgkJfSwNCg0KCQlydW4gOiBmdW5jdGlvbihlLCBmLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG87DQoNCgkJCWlmICh0LmRvYyAmJiB0eXBlb2YoZSkgPT09ICdzdHJpbmcnKQ0KCQkJCWUgPSB0LmdldChlKTsNCg0KCQkJaWYgKCFlKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJcyA9IHMgfHwgdGhpczsNCgkJCWlmICghZS5ub2RlVHlwZSAmJiAoZS5sZW5ndGggfHwgZS5sZW5ndGggPT09IDApKSB7DQoJCQkJbyA9IFtdOw0KDQoJCQkJZWFjaChlLCBmdW5jdGlvbihlLCBpKSB7DQoJCQkJCWlmIChlKSB7DQoJCQkJCQlpZiAodHlwZW9mKGUpID09ICdzdHJpbmcnKQ0KCQkJCQkJCWUgPSB0LmRvYy5nZXRFbGVtZW50QnlJZChlKTsNCg0KCQkJCQkJby5wdXNoKGYuY2FsbChzLCBlLCBpKSk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCXJldHVybiBvOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZi5jYWxsKHMsIGUpOw0KCQl9LA0KDQoJCWdldEF0dHJpYnMgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgbzsNCg0KCQkJbiA9IHRoaXMuZ2V0KG4pOw0KDQoJCQlpZiAoIW4pDQoJCQkJcmV0dXJuIFtdOw0KDQoJCQlpZiAoaXNJRSkgew0KCQkJCW8gPSBbXTsNCg0KCQkJCS8vIE9iamVjdCB3aWxsIHRocm93IGV4Y2VwdGlvbiBpbiBJRQ0KCQkJCWlmIChuLm5vZGVOYW1lID09ICdPQkpFQ1QnKQ0KCQkJCQlyZXR1cm4gbi5hdHRyaWJ1dGVzOw0KDQoJCQkJLy8gSUUgZG9lc24ndCBrZWVwIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgaWYgeW91IGNsb25lIG9wdGlvbiBlbGVtZW50cw0KCQkJCWlmIChuLm5vZGVOYW1lID09PSAnT1BUSU9OJyAmJiB0aGlzLmdldEF0dHJpYihuLCAnc2VsZWN0ZWQnKSkNCgkJCQkJby5wdXNoKHtzcGVjaWZpZWQgOiAxLCBub2RlTmFtZSA6ICdzZWxlY3RlZCd9KTsNCg0KCQkJCS8vIEl0J3MgY3JhenkgdGhhdCB0aGlzIGlzIGZhc3RlciBpbiBJRSBidXQgaXQncyBiZWNhdXNlIGl0IHJldHVybnMgYWxsIGF0dHJpYnV0ZXMgYWxsIHRoZSB0aW1lDQoJCQkJbi5jbG9uZU5vZGUoZmFsc2UpLm91dGVySFRNTC5yZXBsYWNlKC88XC8/W1x3OlwtXSsgP3w9W1wiXVteXCJdK1wifD1cJ1teXCddK1wnfD1bXHdcLV0rfD4vZ2ksICcnKS5yZXBsYWNlKC9bXHc6XC1dKy9naSwgZnVuY3Rpb24oYSkgew0KCQkJCQlvLnB1c2goe3NwZWNpZmllZCA6IDEsIG5vZGVOYW1lIDogYX0pOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIG87DQoJCQl9DQoNCgkJCXJldHVybiBuLmF0dHJpYnV0ZXM7DQoJCX0sDQoNCgkJZGVzdHJveSA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKHQuZXZlbnRzKQ0KCQkJCXQuZXZlbnRzLmRlc3Ryb3koKTsNCg0KCQkJdC53aW4gPSB0LmRvYyA9IHQucm9vdCA9IHQuZXZlbnRzID0gbnVsbDsNCg0KCQkJLy8gTWFudWFsIGRlc3Ryb3kgdGhlbiByZW1vdmUgdW5sb2FkIGhhbmRsZXINCgkJCWlmICghcykNCgkJCQl0aW55bWNlLnJlbW92ZVVubG9hZCh0LmRlc3Ryb3kpOw0KCQl9LA0KDQoJCWNyZWF0ZVJuZyA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGQgPSB0aGlzLmRvYzsNCg0KCQkJcmV0dXJuIGQuY3JlYXRlUmFuZ2UgPyBkLmNyZWF0ZVJhbmdlKCkgOiBuZXcgdGlueW1jZS5kb20uUmFuZ2UodGhpcyk7DQoJCX0sDQoNCgkJbm9kZUluZGV4IDogZnVuY3Rpb24obm9kZSwgbm9ybWFsaXplZCkgew0KCQkJdmFyIGlkeCA9IDAsIGxhc3ROb2RlVHlwZSwgbGFzdE5vZGUsIG5vZGVUeXBlOw0KDQoJCQlpZiAobm9kZSkgew0KCQkJCWZvciAobGFzdE5vZGVUeXBlID0gbm9kZS5ub2RlVHlwZSwgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nLCBsYXN0Tm9kZSA9IG5vZGU7IG5vZGU7IG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykgew0KCQkJCQlub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7DQoNCgkJCQkJLy8gTm9ybWFsaXplIHRleHQgbm9kZXMNCgkJCQkJaWYgKG5vcm1hbGl6ZWQgJiYgbm9kZVR5cGUgPT0gMykgew0KCQkJCQkJaWYgKG5vZGVUeXBlID09IGxhc3ROb2RlVHlwZSB8fCAhbm9kZS5ub2RlVmFsdWUubGVuZ3RoKQ0KCQkJCQkJCWNvbnRpbnVlOw0KCQkJCQl9DQoNCgkJCQkJaWR4Kys7DQoJCQkJCWxhc3ROb2RlVHlwZSA9IG5vZGVUeXBlOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIGlkeDsNCgkJfSwNCg0KCQlzcGxpdCA6IGZ1bmN0aW9uKHBlLCBlLCByZSkgew0KCQkJdmFyIHQgPSB0aGlzLCByID0gdC5jcmVhdGVSbmcoKSwgYmVmLCBhZnQsIHBhOw0KDQoJCQkvLyBXM0MgdmFsaWQgYnJvd3NlcnMgdGVuZCB0byBsZWF2ZSBlbXB0eSBub2RlcyB0byB0aGUgbGVmdC9yaWdodCBzaWRlIG9mIHRoZSBjb250ZW50cywgdGhpcyBtYWtlcyBzZW5zZQ0KCQkJLy8gYnV0IHdlIGRvbid0IHdhbnQgdGhhdCBpbiBvdXIgY29kZSBzaW5jZSBpdCBzZXJ2ZXMgbm8gcHVycG9zZSBmb3IgdGhlIGVuZCB1c2VyDQoJCQkvLyBGb3IgZXhhbXBsZSBpZiB0aGlzIGlzIGNob3BwZWQ6DQoJCQkvLyAgIDxwPnRleHQgMTxzcGFuPjxiPkNIT1A8L2I+PC9zcGFuPnRleHQgMjwvcD4NCgkJCS8vIHdvdWxkIHByb2R1Y2U6DQoJCQkvLyAgIDxwPnRleHQgMTxzcGFuPjwvc3Bhbj48L3A+PGI+Q0hPUDwvYj48cD48c3Bhbj48L3NwYW4+dGV4dCAyPC9wPg0KCQkJLy8gdGhpcyBmdW5jdGlvbiB3aWxsIHRoZW4gdHJpbSBvZiBlbXB0eSBlZGdlcyBhbmQgcHJvZHVjZToNCgkJCS8vICAgPHA+dGV4dCAxPC9wPjxiPkNIT1A8L2I+PHA+dGV4dCAyPC9wPg0KCQkJZnVuY3Rpb24gdHJpbShub2RlKSB7DQoJCQkJdmFyIGksIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzOw0KDQoJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnX21jZV90eXBlJykgPT0gJ2Jvb2ttYXJrJykNCgkJCQkJcmV0dXJuOw0KDQoJCQkJZm9yIChpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pDQoJCQkJCXRyaW0oY2hpbGRyZW5baV0pOw0KDQoJCQkJaWYgKG5vZGUubm9kZVR5cGUgIT0gOSkgew0KCQkJCQkvLyBLZWVwIG5vbiB3aGl0ZXNwYWNlIHRleHQgbm9kZXMNCgkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB7DQoJCQkJCQkvLyBJZiBwYXJlbnQgZWxlbWVudCBpc24ndCBhIGJsb2NrIG9yIHRoZXJlIGlzbid0IGFueSB1c2VmdWwgY29udGVudHMgZm9yIGV4YW1wbGUgIjxwPiAgIDwvcD4iDQoJCQkJCQlpZiAoIXQuaXNCbG9jayhub2RlLnBhcmVudE5vZGUpIHx8IHRpbnltY2UudHJpbShub2RlLm5vZGVWYWx1ZSkubGVuZ3RoID4gMCkNCgkJCQkJCQlyZXR1cm47DQoJCQkJCX0NCg0KCQkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJCQkvLyBJZiB0aGUgb25seSBjaGlsZCBpcyBhIGJvb2ttYXJrIHRoZW4gbW92ZSBpdCB1cA0KCQkJCQkJY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7DQoJCQkJCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDEgJiYgY2hpbGRyZW5bMF0gJiYgY2hpbGRyZW5bMF0ubm9kZVR5cGUgPT0gMSAmJiBjaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoJ19tY2VfdHlwZScpID09ICdib29rbWFyaycpDQoJCQkJCQkJbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZHJlblswXSwgbm9kZSk7DQoNCgkJCQkJCS8vIEtlZXAgbm9uIGVtcHR5IGVsZW1lbnRzIG9yIGltZywgaHIgZXRjDQoJCQkJCQlpZiAoY2hpbGRyZW4ubGVuZ3RoIHx8IC9eKGJyfGhyfGlucHV0fGltZykkL2kudGVzdChub2RlLm5vZGVOYW1lKSkNCgkJCQkJCQlyZXR1cm47DQoJCQkJCX0NCg0KCQkJCQl0LnJlbW92ZShub2RlKTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gbm9kZTsNCgkJCX07DQoNCgkJCWlmIChwZSAmJiBlKSB7DQoJCQkJLy8gR2V0IGJlZm9yZSBjaHVuaw0KCQkJCXIuc2V0U3RhcnQocGUucGFyZW50Tm9kZSwgdC5ub2RlSW5kZXgocGUpKTsNCgkJCQlyLnNldEVuZChlLnBhcmVudE5vZGUsIHQubm9kZUluZGV4KGUpKTsNCgkJCQliZWYgPSByLmV4dHJhY3RDb250ZW50cygpOw0KDQoJCQkJLy8gR2V0IGFmdGVyIGNodW5rDQoJCQkJciA9IHQuY3JlYXRlUm5nKCk7DQoJCQkJci5zZXRTdGFydChlLnBhcmVudE5vZGUsIHQubm9kZUluZGV4KGUpICsgMSk7DQoJCQkJci5zZXRFbmQocGUucGFyZW50Tm9kZSwgdC5ub2RlSW5kZXgocGUpICsgMSk7DQoJCQkJYWZ0ID0gci5leHRyYWN0Q29udGVudHMoKTsNCg0KCQkJCS8vIEluc2VydCBiZWZvcmUgY2h1bmsNCgkJCQlwYSA9IHBlLnBhcmVudE5vZGU7DQoJCQkJcGEuaW5zZXJ0QmVmb3JlKHRyaW0oYmVmKSwgcGUpOw0KDQoJCQkJLy8gSW5zZXJ0IG1pZGRsZSBjaHVuaw0KCQkJCWlmIChyZSkNCgkJCQkJcGEucmVwbGFjZUNoaWxkKHJlLCBlKTsNCgkJCQllbHNlDQoJCQkJCXBhLmluc2VydEJlZm9yZShlLCBwZSk7DQoNCgkJCQkvLyBJbnNlcnQgYWZ0ZXIgY2h1bmsNCgkJCQlwYS5pbnNlcnRCZWZvcmUodHJpbShhZnQpLCBwZSk7DQoJCQkJdC5yZW1vdmUocGUpOw0KDQoJCQkJcmV0dXJuIHJlIHx8IGU7DQoJCQl9DQoJCX0sDQoNCgkJYmluZCA6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgZnVuYywgc2NvcGUpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKCF0LmV2ZW50cykNCgkJCQl0LmV2ZW50cyA9IG5ldyB0aW55bWNlLmRvbS5FdmVudFV0aWxzKCk7DQoNCgkJCXJldHVybiB0LmV2ZW50cy5hZGQodGFyZ2V0LCBuYW1lLCBmdW5jLCBzY29wZSB8fCB0aGlzKTsNCgkJfSwNCg0KCQl1bmJpbmQgOiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIGZ1bmMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKCF0LmV2ZW50cykNCgkJCQl0LmV2ZW50cyA9IG5ldyB0aW55bWNlLmRvbS5FdmVudFV0aWxzKCk7DQoNCgkJCXJldHVybiB0LmV2ZW50cy5yZW1vdmUodGFyZ2V0LCBuYW1lLCBmdW5jKTsNCgkJfSwNCg0KDQoJCV9maW5kU2liIDogZnVuY3Rpb24obm9kZSwgc2VsZWN0b3IsIG5hbWUpIHsNCgkJCXZhciB0ID0gdGhpcywgZiA9IHNlbGVjdG9yOw0KDQoJCQlpZiAobm9kZSkgew0KCQkJCS8vIElmIGV4cHJlc3Npb24gbWFrZSBhIGZ1bmN0aW9uIG9mIGl0IHVzaW5nIGlzDQoJCQkJaWYgKGlzKGYsICdzdHJpbmcnKSkgew0KCQkJCQlmID0gZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJcmV0dXJuIHQuaXMobm9kZSwgc2VsZWN0b3IpOw0KCQkJCQl9Ow0KCQkJCX0NCg0KCQkJCS8vIExvb3AgYWxsIHNpYmxpbmdzDQoJCQkJZm9yIChub2RlID0gbm9kZVtuYW1lXTsgbm9kZTsgbm9kZSA9IG5vZGVbbmFtZV0pIHsNCgkJCQkJaWYgKGYobm9kZSkpDQoJCQkJCQlyZXR1cm4gbm9kZTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiBudWxsOw0KCQl9LA0KDQoJCV9pc1JlcyA6IGZ1bmN0aW9uKGMpIHsNCgkJCS8vIElzIGxpdmUgcmVzaXpibGUgZWxlbWVudA0KCQkJcmV0dXJuIC9eKHRvcHxsZWZ0fGJvdHRvbXxyaWdodHx3aWR0aHxoZWlnaHQpL2kudGVzdChjKSB8fCAvO1xzKih0b3B8bGVmdHxib3R0b218cmlnaHR8d2lkdGh8aGVpZ2h0KS9pLnRlc3QoYyk7DQoJCX0NCg0KCQkvKg0KCQl3YWxrIDogZnVuY3Rpb24obiwgZiwgcykgew0KCQkJdmFyIGQgPSB0aGlzLmRvYywgdzsNCg0KCQkJaWYgKGQuY3JlYXRlVHJlZVdhbGtlcikgew0KCQkJCXcgPSBkLmNyZWF0ZVRyZWVXYWxrZXIobiwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwsIGZhbHNlKTsNCg0KCQkJCXdoaWxlICgobiA9IHcubmV4dE5vZGUoKSkgIT0gbnVsbCkNCgkJCQkJZi5jYWxsKHMgfHwgdGhpcywgbik7DQoJCQl9IGVsc2UNCgkJCQl0aW55bWNlLndhbGsobiwgZiwgJ2NoaWxkTm9kZXMnLCBzKTsNCgkJfQ0KCQkqLw0KDQoJCS8qDQoJCXRvUkdCIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIGMgPSAvXlxzKj8jKFswLTlBLUZdezJ9KShbMC05QS1GXXsxLDJ9KShbMC05QS1GXXsyfSk/XHMqPyQvLmV4ZWMocyk7DQoNCgkJCWlmIChjKSB7DQoJCQkJLy8gI0ZGRiAtPiAjRkZGRkZGDQoJCQkJaWYgKCFpcyhjWzNdKSkNCgkJCQkJY1szXSA9IGNbMl0gPSBjWzFdOw0KDQoJCQkJcmV0dXJuICJyZ2IoIiArIHBhcnNlSW50KGNbMV0sIDE2KSArICIsIiArIHBhcnNlSW50KGNbMl0sIDE2KSArICIsIiArIHBhcnNlSW50KGNbM10sIDE2KSArICIpIjsNCgkJCX0NCg0KCQkJcmV0dXJuIHM7DQoJCX0NCgkJKi8NCgl9KTsNCg0KCXRpbnltY2UuRE9NID0gbmV3IHRpbnltY2UuZG9tLkRPTVV0aWxzKGRvY3VtZW50LCB7cHJvY2Vzc19odG1sIDogMH0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbihucykgew0KCS8vIFJhbmdlIGNvbnN0cnVjdG9yDQoJZnVuY3Rpb24gUmFuZ2UoZG9tKSB7DQoJCXZhciB0ID0gdGhpcywNCgkJCWRvYyA9IGRvbS5kb2MsDQoJCQlFWFRSQUNUID0gMCwNCgkJCUNMT05FID0gMSwNCgkJCURFTEVURSA9IDIsDQoJCQlUUlVFID0gdHJ1ZSwNCgkJCUZBTFNFID0gZmFsc2UsDQoJCQlTVEFSVF9PRkZTRVQgPSAnc3RhcnRPZmZzZXQnLA0KCQkJU1RBUlRfQ09OVEFJTkVSID0gJ3N0YXJ0Q29udGFpbmVyJywNCgkJCUVORF9DT05UQUlORVIgPSAnZW5kQ29udGFpbmVyJywNCgkJCUVORF9PRkZTRVQgPSAnZW5kT2Zmc2V0JywNCgkJCWV4dGVuZCA9IHRpbnltY2UuZXh0ZW5kLA0KCQkJbm9kZUluZGV4ID0gZG9tLm5vZGVJbmRleDsNCg0KCQlleHRlbmQodCwgew0KCQkJLy8gSW5pdGFsIHN0YXRlcw0KCQkJc3RhcnRDb250YWluZXIgOiBkb2MsDQoJCQlzdGFydE9mZnNldCA6IDAsDQoJCQllbmRDb250YWluZXIgOiBkb2MsDQoJCQllbmRPZmZzZXQgOiAwLA0KCQkJY29sbGFwc2VkIDogVFJVRSwNCgkJCWNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIDogZG9jLA0KDQoJCQkvLyBSYW5nZSBjb25zdGFudHMNCgkJCVNUQVJUX1RPX1NUQVJUIDogMCwNCgkJCVNUQVJUX1RPX0VORCA6IDEsDQoJCQlFTkRfVE9fRU5EIDogMiwNCgkJCUVORF9UT19TVEFSVCA6IDMsDQoNCgkJCS8vIFB1YmxpYyBtZXRob2RzDQoJCQlzZXRTdGFydCA6IHNldFN0YXJ0LA0KCQkJc2V0RW5kIDogc2V0RW5kLA0KCQkJc2V0U3RhcnRCZWZvcmUgOiBzZXRTdGFydEJlZm9yZSwNCgkJCXNldFN0YXJ0QWZ0ZXIgOiBzZXRTdGFydEFmdGVyLA0KCQkJc2V0RW5kQmVmb3JlIDogc2V0RW5kQmVmb3JlLA0KCQkJc2V0RW5kQWZ0ZXIgOiBzZXRFbmRBZnRlciwNCgkJCWNvbGxhcHNlIDogY29sbGFwc2UsDQoJCQlzZWxlY3ROb2RlIDogc2VsZWN0Tm9kZSwNCgkJCXNlbGVjdE5vZGVDb250ZW50cyA6IHNlbGVjdE5vZGVDb250ZW50cywNCgkJCWNvbXBhcmVCb3VuZGFyeVBvaW50cyA6IGNvbXBhcmVCb3VuZGFyeVBvaW50cywNCgkJCWRlbGV0ZUNvbnRlbnRzIDogZGVsZXRlQ29udGVudHMsDQoJCQlleHRyYWN0Q29udGVudHMgOiBleHRyYWN0Q29udGVudHMsDQoJCQljbG9uZUNvbnRlbnRzIDogY2xvbmVDb250ZW50cywNCgkJCWluc2VydE5vZGUgOiBpbnNlcnROb2RlLA0KCQkJc3Vycm91bmRDb250ZW50cyA6IHN1cnJvdW5kQ29udGVudHMsDQoJCQljbG9uZVJhbmdlIDogY2xvbmVSYW5nZQ0KCQl9KTsNCg0KCQlmdW5jdGlvbiBzZXRTdGFydChuLCBvKSB7DQoJCQlfc2V0RW5kUG9pbnQoVFJVRSwgbiwgbyk7DQoJCX07DQoNCgkJZnVuY3Rpb24gc2V0RW5kKG4sIG8pIHsNCgkJCV9zZXRFbmRQb2ludChGQUxTRSwgbiwgbyk7DQoJCX07DQoNCgkJZnVuY3Rpb24gc2V0U3RhcnRCZWZvcmUobikgew0KCQkJc2V0U3RhcnQobi5wYXJlbnROb2RlLCBub2RlSW5kZXgobikpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHNldFN0YXJ0QWZ0ZXIobikgew0KCQkJc2V0U3RhcnQobi5wYXJlbnROb2RlLCBub2RlSW5kZXgobikgKyAxKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZXRFbmRCZWZvcmUobikgew0KCQkJc2V0RW5kKG4ucGFyZW50Tm9kZSwgbm9kZUluZGV4KG4pKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZXRFbmRBZnRlcihuKSB7DQoJCQlzZXRFbmQobi5wYXJlbnROb2RlLCBub2RlSW5kZXgobikgKyAxKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBjb2xsYXBzZSh0cykgew0KCQkJaWYgKHRzKSB7DQoJCQkJdFtFTkRfQ09OVEFJTkVSXSA9IHRbU1RBUlRfQ09OVEFJTkVSXTsNCgkJCQl0W0VORF9PRkZTRVRdID0gdFtTVEFSVF9PRkZTRVRdOw0KCQkJfSBlbHNlIHsNCgkJCQl0W1NUQVJUX0NPTlRBSU5FUl0gPSB0W0VORF9DT05UQUlORVJdOw0KCQkJCXRbU1RBUlRfT0ZGU0VUXSA9IHRbRU5EX09GRlNFVF07DQoJCQl9DQoNCgkJCXQuY29sbGFwc2VkID0gVFJVRTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZWxlY3ROb2RlKG4pIHsNCgkJCXNldFN0YXJ0QmVmb3JlKG4pOw0KCQkJc2V0RW5kQWZ0ZXIobik7DQoJCX07DQoNCgkJZnVuY3Rpb24gc2VsZWN0Tm9kZUNvbnRlbnRzKG4pIHsNCgkJCXNldFN0YXJ0KG4sIDApOw0KCQkJc2V0RW5kKG4sIG4ubm9kZVR5cGUgPT09IDEgPyBuLmNoaWxkTm9kZXMubGVuZ3RoIDogbi5ub2RlVmFsdWUubGVuZ3RoKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBjb21wYXJlQm91bmRhcnlQb2ludHMoaCwgcikgew0KCQkJdmFyIHNjID0gdFtTVEFSVF9DT05UQUlORVJdLCBzbyA9IHRbU1RBUlRfT0ZGU0VUXSwgZWMgPSB0W0VORF9DT05UQUlORVJdLCBlbyA9IHRbRU5EX09GRlNFVF07DQoNCgkJCS8vIENoZWNrIFNUQVJUX1RPX1NUQVJUDQoJCQlpZiAoaCA9PT0gMCkNCgkJCQlyZXR1cm4gX2NvbXBhcmVCb3VuZGFyeVBvaW50cyhzYywgc28sIHNjLCBzbyk7DQoNCgkJCS8vIENoZWNrIFNUQVJUX1RPX0VORA0KCQkJaWYgKGggPT09IDEpDQoJCQkJcmV0dXJuIF9jb21wYXJlQm91bmRhcnlQb2ludHMoc2MsIHNvLCBlYywgZW8pOw0KDQoJCQkvLyBDaGVjayBFTkRfVE9fRU5EDQoJCQlpZiAoaCA9PT0gMikNCgkJCQlyZXR1cm4gX2NvbXBhcmVCb3VuZGFyeVBvaW50cyhlYywgZW8sIGVjLCBlbyk7DQoNCgkJCS8vIENoZWNrIEVORF9UT19TVEFSVA0KCQkJaWYgKGggPT09IDMpDQoJCQkJcmV0dXJuIF9jb21wYXJlQm91bmRhcnlQb2ludHMoZWMsIGVvLCBzYywgc28pOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGRlbGV0ZUNvbnRlbnRzKCkgew0KCQkJX3RyYXZlcnNlKERFTEVURSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZXh0cmFjdENvbnRlbnRzKCkgew0KCQkJcmV0dXJuIF90cmF2ZXJzZShFWFRSQUNUKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBjbG9uZUNvbnRlbnRzKCkgew0KCQkJcmV0dXJuIF90cmF2ZXJzZShDTE9ORSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gaW5zZXJ0Tm9kZShuKSB7DQoJCQl2YXIgc3RhcnRDb250YWluZXIgPSB0aGlzW1NUQVJUX0NPTlRBSU5FUl0sDQoJCQkJc3RhcnRPZmZzZXQgPSB0aGlzW1NUQVJUX09GRlNFVF0sIG5uLCBvOw0KDQoJCQkvLyBOb2RlIGlzIFRFWFRfTk9ERSBvciBDREFUQQ0KCQkJaWYgKChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PT0gMyB8fCBzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PT0gNCkgJiYgc3RhcnRDb250YWluZXIubm9kZVZhbHVlKSB7DQoJCQkJaWYgKCFzdGFydE9mZnNldCkgew0KCQkJCQkvLyBBdCB0aGUgc3RhcnQgb2YgdGV4dA0KCQkJCQlzdGFydENvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCBzdGFydENvbnRhaW5lcik7DQoJCQkJfSBlbHNlIGlmIChzdGFydE9mZnNldCA+PSBzdGFydENvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoKSB7DQoJCQkJCS8vIEF0IHRoZSBlbmQgb2YgdGV4dA0KCQkJCQlkb20uaW5zZXJ0QWZ0ZXIobiwgc3RhcnRDb250YWluZXIpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIE1pZGRsZSwgbmVlZCB0byBzcGxpdA0KCQkJCQlubiA9IHN0YXJ0Q29udGFpbmVyLnNwbGl0VGV4dChzdGFydE9mZnNldCk7DQoJCQkJCXN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG4sIG5uKTsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCS8vIEluc2VydCBlbGVtZW50IG5vZGUNCgkJCQlpZiAoc3RhcnRDb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggPiAwKQ0KCQkJCQlvID0gc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tzdGFydE9mZnNldF07DQoNCgkJCQlpZiAobykNCgkJCQkJc3RhcnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKG4sIG8pOw0KCQkJCWVsc2UNCgkJCQkJc3RhcnRDb250YWluZXIuYXBwZW5kQ2hpbGQobik7DQoJCQl9DQoJCX07DQoNCgkJZnVuY3Rpb24gc3Vycm91bmRDb250ZW50cyhuKSB7DQoJCQl2YXIgZiA9IHQuZXh0cmFjdENvbnRlbnRzKCk7DQoNCgkJCXQuaW5zZXJ0Tm9kZShuKTsNCgkJCW4uYXBwZW5kQ2hpbGQoZik7DQoJCQl0LnNlbGVjdE5vZGUobik7DQoJCX07DQoNCgkJZnVuY3Rpb24gY2xvbmVSYW5nZSgpIHsNCgkJCXJldHVybiBleHRlbmQobmV3IFJhbmdlKGRvbSksIHsNCgkJCQlzdGFydENvbnRhaW5lciA6IHRbU1RBUlRfQ09OVEFJTkVSXSwNCgkJCQlzdGFydE9mZnNldCA6IHRbU1RBUlRfT0ZGU0VUXSwNCgkJCQllbmRDb250YWluZXIgOiB0W0VORF9DT05UQUlORVJdLA0KCQkJCWVuZE9mZnNldCA6IHRbRU5EX09GRlNFVF0sDQoJCQkJY29sbGFwc2VkIDogdC5jb2xsYXBzZWQsDQoJCQkJY29tbW9uQW5jZXN0b3JDb250YWluZXIgOiB0LmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyDQoJCQl9KTsNCgkJfTsNCg0KCQkvLyBQcml2YXRlIG1ldGhvZHMNCg0KCQlmdW5jdGlvbiBfZ2V0U2VsZWN0ZWROb2RlKGNvbnRhaW5lciwgb2Zmc2V0KSB7DQoJCQl2YXIgY2hpbGQ7DQoNCgkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMyAvKiBURVhUX05PREUgKi8pDQoJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCg0KCQkJaWYgKG9mZnNldCA8IDApDQoJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCg0KCQkJY2hpbGQgPSBjb250YWluZXIuZmlyc3RDaGlsZDsNCgkJCXdoaWxlIChjaGlsZCAmJiBvZmZzZXQgPiAwKSB7DQoJCQkJLS1vZmZzZXQ7DQoJCQkJY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZzsNCgkJCX0NCg0KCQkJaWYgKGNoaWxkKQ0KCQkJCXJldHVybiBjaGlsZDsNCg0KCQkJcmV0dXJuIGNvbnRhaW5lcjsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfaXNDb2xsYXBzZWQoKSB7DQoJCQlyZXR1cm4gKHRbU1RBUlRfQ09OVEFJTkVSXSA9PSB0W0VORF9DT05UQUlORVJdICYmIHRbU1RBUlRfT0ZGU0VUXSA9PSB0W0VORF9PRkZTRVRdKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfY29tcGFyZUJvdW5kYXJ5UG9pbnRzKGNvbnRhaW5lckEsIG9mZnNldEEsIGNvbnRhaW5lckIsIG9mZnNldEIpIHsNCgkJCXZhciBjLCBvZmZzZXRDLCBuLCBjbW5Sb290LCBjaGlsZEEsIGNoaWxkQjsNCg0KCQkJLy8gSW4gdGhlIGZpcnN0IGNhc2UgdGhlIGJvdW5kYXJ5LXBvaW50cyBoYXZlIHRoZSBzYW1lIGNvbnRhaW5lci4gQSBpcyBiZWZvcmUgQg0KCQkJLy8gaWYgaXRzIG9mZnNldCBpcyBsZXNzIHRoYW4gdGhlIG9mZnNldCBvZiBCLCBBIGlzIGVxdWFsIHRvIEIgaWYgaXRzIG9mZnNldCBpcw0KCQkJLy8gZXF1YWwgdG8gdGhlIG9mZnNldCBvZiBCLCBhbmQgQSBpcyBhZnRlciBCIGlmIGl0cyBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIHRoZQ0KCQkJLy8gb2Zmc2V0IG9mIEIuDQoJCQlpZiAoY29udGFpbmVyQSA9PSBjb250YWluZXJCKSB7DQoJCQkJaWYgKG9mZnNldEEgPT0gb2Zmc2V0QikNCgkJCQkJcmV0dXJuIDA7IC8vIGVxdWFsDQoNCgkJCQlpZiAob2Zmc2V0QSA8IG9mZnNldEIpDQoJCQkJCXJldHVybiAtMTsgLy8gYmVmb3JlDQoNCgkJCQlyZXR1cm4gMTsgLy8gYWZ0ZXINCgkJCX0NCg0KCQkJLy8gSW4gdGhlIHNlY29uZCBjYXNlIGEgY2hpbGQgbm9kZSBDIG9mIHRoZSBjb250YWluZXIgb2YgQSBpcyBhbiBhbmNlc3Rvcg0KCQkJLy8gY29udGFpbmVyIG9mIEIuIEluIHRoaXMgY2FzZSwgQSBpcyBiZWZvcmUgQiBpZiB0aGUgb2Zmc2V0IG9mIEEgaXMgbGVzcyB0aGFuIG9yDQoJCQkvLyBlcXVhbCB0byB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIG5vZGUgQyBhbmQgQSBpcyBhZnRlciBCIG90aGVyd2lzZS4NCgkJCWMgPSBjb250YWluZXJCOw0KCQkJd2hpbGUgKGMgJiYgYy5wYXJlbnROb2RlICE9IGNvbnRhaW5lckEpDQoJCQkJYyA9IGMucGFyZW50Tm9kZTsNCg0KCQkJaWYgKGMpIHsNCgkJCQlvZmZzZXRDID0gMDsNCgkJCQluID0gY29udGFpbmVyQS5maXJzdENoaWxkOw0KDQoJCQkJd2hpbGUgKG4gIT0gYyAmJiBvZmZzZXRDIDwgb2Zmc2V0QSkgew0KCQkJCQlvZmZzZXRDKys7DQoJCQkJCW4gPSBuLm5leHRTaWJsaW5nOw0KCQkJCX0NCg0KCQkJCWlmIChvZmZzZXRBIDw9IG9mZnNldEMpDQoJCQkJCXJldHVybiAtMTsgLy8gYmVmb3JlDQoNCgkJCQlyZXR1cm4gMTsgLy8gYWZ0ZXINCgkJCX0NCg0KCQkJLy8gSW4gdGhlIHRoaXJkIGNhc2UgYSBjaGlsZCBub2RlIEMgb2YgdGhlIGNvbnRhaW5lciBvZiBCIGlzIGFuIGFuY2VzdG9yIGNvbnRhaW5lcg0KCQkJLy8gb2YgQS4gSW4gdGhpcyBjYXNlLCBBIGlzIGJlZm9yZSBCIGlmIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgbm9kZSBDIGlzIGxlc3MgdGhhbg0KCQkJLy8gdGhlIG9mZnNldCBvZiBCIGFuZCBBIGlzIGFmdGVyIEIgb3RoZXJ3aXNlLg0KCQkJYyA9IGNvbnRhaW5lckE7DQoJCQl3aGlsZSAoYyAmJiBjLnBhcmVudE5vZGUgIT0gY29udGFpbmVyQikgew0KCQkJCWMgPSBjLnBhcmVudE5vZGU7DQoJCQl9DQoNCgkJCWlmIChjKSB7DQoJCQkJb2Zmc2V0QyA9IDA7DQoJCQkJbiA9IGNvbnRhaW5lckIuZmlyc3RDaGlsZDsNCg0KCQkJCXdoaWxlIChuICE9IGMgJiYgb2Zmc2V0QyA8IG9mZnNldEIpIHsNCgkJCQkJb2Zmc2V0QysrOw0KCQkJCQluID0gbi5uZXh0U2libGluZzsNCgkJCQl9DQoNCgkJCQlpZiAob2Zmc2V0QyA8IG9mZnNldEIpDQoJCQkJCXJldHVybiAtMTsgLy8gYmVmb3JlDQoNCgkJCQlyZXR1cm4gMTsgLy8gYWZ0ZXINCgkJCX0NCg0KCQkJLy8gSW4gdGhlIGZvdXJ0aCBjYXNlLCBub25lIG9mIHRocmVlIG90aGVyIGNhc2VzIGhvbGQ6IHRoZSBjb250YWluZXJzIG9mIEEgYW5kIEINCgkJCS8vIGFyZSBzaWJsaW5ncyBvciBkZXNjZW5kYW50cyBvZiBzaWJsaW5nIG5vZGVzLiBJbiB0aGlzIGNhc2UsIEEgaXMgYmVmb3JlIEIgaWYNCgkJCS8vIHRoZSBjb250YWluZXIgb2YgQSBpcyBiZWZvcmUgdGhlIGNvbnRhaW5lciBvZiBCIGluIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUNCgkJCS8vIFJhbmdlcycgY29udGV4dCB0cmVlIGFuZCBBIGlzIGFmdGVyIEIgb3RoZXJ3aXNlLg0KCQkJY21uUm9vdCA9IGRvbS5maW5kQ29tbW9uQW5jZXN0b3IoY29udGFpbmVyQSwgY29udGFpbmVyQik7DQoJCQljaGlsZEEgPSBjb250YWluZXJBOw0KDQoJCQl3aGlsZSAoY2hpbGRBICYmIGNoaWxkQS5wYXJlbnROb2RlICE9IGNtblJvb3QpDQoJCQkJY2hpbGRBID0gY2hpbGRBLnBhcmVudE5vZGU7DQoNCgkJCWlmICghY2hpbGRBKQ0KCQkJCWNoaWxkQSA9IGNtblJvb3Q7DQoNCgkJCWNoaWxkQiA9IGNvbnRhaW5lckI7DQoJCQl3aGlsZSAoY2hpbGRCICYmIGNoaWxkQi5wYXJlbnROb2RlICE9IGNtblJvb3QpDQoJCQkJY2hpbGRCID0gY2hpbGRCLnBhcmVudE5vZGU7DQoNCgkJCWlmICghY2hpbGRCKQ0KCQkJCWNoaWxkQiA9IGNtblJvb3Q7DQoNCgkJCWlmIChjaGlsZEEgPT0gY2hpbGRCKQ0KCQkJCXJldHVybiAwOyAvLyBlcXVhbA0KDQoJCQluID0gY21uUm9vdC5maXJzdENoaWxkOw0KCQkJd2hpbGUgKG4pIHsNCgkJCQlpZiAobiA9PSBjaGlsZEEpDQoJCQkJCXJldHVybiAtMTsgLy8gYmVmb3JlDQoNCgkJCQlpZiAobiA9PSBjaGlsZEIpDQoJCQkJCXJldHVybiAxOyAvLyBhZnRlcg0KDQoJCQkJbiA9IG4ubmV4dFNpYmxpbmc7DQoJCQl9DQoJCX07DQoNCgkJZnVuY3Rpb24gX3NldEVuZFBvaW50KHN0LCBuLCBvKSB7DQoJCQl2YXIgZWMsIHNjOw0KDQoJCQlpZiAoc3QpIHsNCgkJCQl0W1NUQVJUX0NPTlRBSU5FUl0gPSBuOw0KCQkJCXRbU1RBUlRfT0ZGU0VUXSA9IG87DQoJCQl9IGVsc2Ugew0KCQkJCXRbRU5EX0NPTlRBSU5FUl0gPSBuOw0KCQkJCXRbRU5EX09GRlNFVF0gPSBvOw0KCQkJfQ0KDQoJCQkvLyBJZiBvbmUgYm91bmRhcnktcG9pbnQgb2YgYSBSYW5nZSBpcyBzZXQgdG8gaGF2ZSBhIHJvb3QgY29udGFpbmVyDQoJCQkvLyBvdGhlciB0aGFuIHRoZSBjdXJyZW50IG9uZSBmb3IgdGhlIFJhbmdlLCB0aGUgUmFuZ2UgaXMgY29sbGFwc2VkIHRvDQoJCQkvLyB0aGUgbmV3IHBvc2l0aW9uLiBUaGlzIGVuZm9yY2VzIHRoZSByZXN0cmljdGlvbiB0aGF0IGJvdGggYm91bmRhcnktDQoJCQkvLyBwb2ludHMgb2YgYSBSYW5nZSBtdXN0IGhhdmUgdGhlIHNhbWUgcm9vdCBjb250YWluZXIuDQoJCQllYyA9IHRbRU5EX0NPTlRBSU5FUl07DQoJCQl3aGlsZSAoZWMucGFyZW50Tm9kZSkNCgkJCQllYyA9IGVjLnBhcmVudE5vZGU7DQoNCgkJCXNjID0gdFtTVEFSVF9DT05UQUlORVJdOw0KCQkJd2hpbGUgKHNjLnBhcmVudE5vZGUpDQoJCQkJc2MgPSBzYy5wYXJlbnROb2RlOw0KDQoJCQlpZiAoc2MgPT0gZWMpIHsNCgkJCQkvLyBUaGUgc3RhcnQgcG9zaXRpb24gb2YgYSBSYW5nZSBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGJlIGFmdGVyIHRoZQ0KCQkJCS8vIGVuZCBwb3NpdGlvbi4gVG8gZW5mb3JjZSB0aGlzIHJlc3RyaWN0aW9uLCBpZiB0aGUgc3RhcnQgaXMgc2V0IHRvDQoJCQkJLy8gYmUgYXQgYSBwb3NpdGlvbiBhZnRlciB0aGUgZW5kLCB0aGUgUmFuZ2UgaXMgY29sbGFwc2VkIHRvIHRoYXQNCgkJCQkvLyBwb3NpdGlvbi4NCgkJCQlpZiAoX2NvbXBhcmVCb3VuZGFyeVBvaW50cyh0W1NUQVJUX0NPTlRBSU5FUl0sIHRbU1RBUlRfT0ZGU0VUXSwgdFtFTkRfQ09OVEFJTkVSXSwgdFtFTkRfT0ZGU0VUXSkgPiAwKQ0KCQkJCQl0LmNvbGxhcHNlKHN0KTsNCgkJCX0gZWxzZQ0KCQkJCXQuY29sbGFwc2Uoc3QpOw0KDQoJCQl0LmNvbGxhcHNlZCA9IF9pc0NvbGxhcHNlZCgpOw0KCQkJdC5jb21tb25BbmNlc3RvckNvbnRhaW5lciA9IGRvbS5maW5kQ29tbW9uQW5jZXN0b3IodFtTVEFSVF9DT05UQUlORVJdLCB0W0VORF9DT05UQUlORVJdKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2UoaG93KSB7DQoJCQl2YXIgYywgZW5kQ29udGFpbmVyRGVwdGggPSAwLCBzdGFydENvbnRhaW5lckRlcHRoID0gMCwgcCwgZGVwdGhEaWZmLCBzdGFydE5vZGUsIGVuZE5vZGUsIHNwLCBlcDsNCg0KCQkJaWYgKHRbU1RBUlRfQ09OVEFJTkVSXSA9PSB0W0VORF9DT05UQUlORVJdKQ0KCQkJCXJldHVybiBfdHJhdmVyc2VTYW1lQ29udGFpbmVyKGhvdyk7DQoNCgkJCWZvciAoYyA9IHRbRU5EX0NPTlRBSU5FUl0sIHAgPSBjLnBhcmVudE5vZGU7IHA7IGMgPSBwLCBwID0gcC5wYXJlbnROb2RlKSB7DQoJCQkJaWYgKHAgPT0gdFtTVEFSVF9DT05UQUlORVJdKQ0KCQkJCQlyZXR1cm4gX3RyYXZlcnNlQ29tbW9uU3RhcnRDb250YWluZXIoYywgaG93KTsNCg0KCQkJCSsrZW5kQ29udGFpbmVyRGVwdGg7DQoJCQl9DQoNCgkJCWZvciAoYyA9IHRbU1RBUlRfQ09OVEFJTkVSXSwgcCA9IGMucGFyZW50Tm9kZTsgcDsgYyA9IHAsIHAgPSBwLnBhcmVudE5vZGUpIHsNCgkJCQlpZiAocCA9PSB0W0VORF9DT05UQUlORVJdKQ0KCQkJCQlyZXR1cm4gX3RyYXZlcnNlQ29tbW9uRW5kQ29udGFpbmVyKGMsIGhvdyk7DQoNCgkJCQkrK3N0YXJ0Q29udGFpbmVyRGVwdGg7DQoJCQl9DQoNCgkJCWRlcHRoRGlmZiA9IHN0YXJ0Q29udGFpbmVyRGVwdGggLSBlbmRDb250YWluZXJEZXB0aDsNCg0KCQkJc3RhcnROb2RlID0gdFtTVEFSVF9DT05UQUlORVJdOw0KCQkJd2hpbGUgKGRlcHRoRGlmZiA+IDApIHsNCgkJCQlzdGFydE5vZGUgPSBzdGFydE5vZGUucGFyZW50Tm9kZTsNCgkJCQlkZXB0aERpZmYtLTsNCgkJCX0NCg0KCQkJZW5kTm9kZSA9IHRbRU5EX0NPTlRBSU5FUl07DQoJCQl3aGlsZSAoZGVwdGhEaWZmIDwgMCkgew0KCQkJCWVuZE5vZGUgPSBlbmROb2RlLnBhcmVudE5vZGU7DQoJCQkJZGVwdGhEaWZmKys7DQoJCQl9DQoNCgkJCS8vIGFzY2VuZCB0aGUgYW5jZXN0b3IgaGllcmFyY2h5IHVudGlsIHdlIGhhdmUgYSBjb21tb24gcGFyZW50Lg0KCQkJZm9yIChzcCA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlLCBlcCA9IGVuZE5vZGUucGFyZW50Tm9kZTsgc3AgIT0gZXA7IHNwID0gc3AucGFyZW50Tm9kZSwgZXAgPSBlcC5wYXJlbnROb2RlKSB7DQoJCQkJc3RhcnROb2RlID0gc3A7DQoJCQkJZW5kTm9kZSA9IGVwOw0KCQkJfQ0KDQoJCQlyZXR1cm4gX3RyYXZlcnNlQ29tbW9uQW5jZXN0b3JzKHN0YXJ0Tm9kZSwgZW5kTm9kZSwgaG93KTsNCgkJfTsNCg0KCQkgZnVuY3Rpb24gX3RyYXZlcnNlU2FtZUNvbnRhaW5lcihob3cpIHsNCgkJCXZhciBmcmFnLCBzLCBzdWIsIG4sIGNudCwgc2libGluZywgeGZlck5vZGU7DQoNCgkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCWZyYWcgPSBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KDQoJCQkvLyBJZiBzZWxlY3Rpb24gaXMgZW1wdHksIGp1c3QgcmV0dXJuIHRoZSBmcmFnbWVudA0KCQkJaWYgKHRbU1RBUlRfT0ZGU0VUXSA9PSB0W0VORF9PRkZTRVRdKQ0KCQkJCXJldHVybiBmcmFnOw0KDQoJCQkvLyBUZXh0IG5vZGUgbmVlZHMgc3BlY2lhbCBjYXNlIGhhbmRsaW5nDQoJCQlpZiAodFtTVEFSVF9DT05UQUlORVJdLm5vZGVUeXBlID09IDMgLyogVEVYVF9OT0RFICovKSB7DQoJCQkJLy8gZ2V0IHRoZSBzdWJzdHJpbmcNCgkJCQlzID0gdFtTVEFSVF9DT05UQUlORVJdLm5vZGVWYWx1ZTsNCgkJCQlzdWIgPSBzLnN1YnN0cmluZyh0W1NUQVJUX09GRlNFVF0sIHRbRU5EX09GRlNFVF0pOw0KDQoJCQkJLy8gc2V0IHRoZSBvcmlnaW5hbCB0ZXh0IG5vZGUgdG8gaXRzIG5ldyB2YWx1ZQ0KCQkJCWlmIChob3cgIT0gQ0xPTkUpIHsNCgkJCQkJdFtTVEFSVF9DT05UQUlORVJdLmRlbGV0ZURhdGEodFtTVEFSVF9PRkZTRVRdLCB0W0VORF9PRkZTRVRdIC0gdFtTVEFSVF9PRkZTRVRdKTsNCg0KCQkJCQkvLyBOb3RoaW5nIGlzIHBhcnRpYWxseSBzZWxlY3RlZCwgc28gY29sbGFwc2UgdG8gc3RhcnQgcG9pbnQNCgkJCQkJdC5jb2xsYXBzZShUUlVFKTsNCgkJCQl9DQoNCgkJCQlpZiAoaG93ID09IERFTEVURSkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJZnJhZy5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoc3ViKSk7DQoJCQkJcmV0dXJuIGZyYWc7DQoJCQl9DQoNCgkJCS8vIENvcHkgbm9kZXMgYmV0d2VlbiB0aGUgc3RhcnQvZW5kIG9mZnNldHMuDQoJCQluID0gX2dldFNlbGVjdGVkTm9kZSh0W1NUQVJUX0NPTlRBSU5FUl0sIHRbU1RBUlRfT0ZGU0VUXSk7DQoJCQljbnQgPSB0W0VORF9PRkZTRVRdIC0gdFtTVEFSVF9PRkZTRVRdOw0KDQoJCQl3aGlsZSAoY250ID4gMCkgew0KCQkJCXNpYmxpbmcgPSBuLm5leHRTaWJsaW5nOw0KCQkJCXhmZXJOb2RlID0gX3RyYXZlcnNlRnVsbHlTZWxlY3RlZChuLCBob3cpOw0KDQoJCQkJaWYgKGZyYWcpDQoJCQkJCWZyYWcuYXBwZW5kQ2hpbGQoIHhmZXJOb2RlICk7DQoNCgkJCQktLWNudDsNCgkJCQluID0gc2libGluZzsNCgkJCX0NCg0KCQkJLy8gTm90aGluZyBpcyBwYXJ0aWFsbHkgc2VsZWN0ZWQsIHNvIGNvbGxhcHNlIHRvIHN0YXJ0IHBvaW50DQoJCQlpZiAoaG93ICE9IENMT05FKQ0KCQkJCXQuY29sbGFwc2UoVFJVRSk7DQoNCgkJCXJldHVybiBmcmFnOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZUNvbW1vblN0YXJ0Q29udGFpbmVyKGVuZEFuY2VzdG9yLCBob3cpIHsNCgkJCXZhciBmcmFnLCBuLCBlbmRJZHgsIGNudCwgc2libGluZywgeGZlck5vZGU7DQoNCgkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCWZyYWcgPSBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KDQoJCQluID0gX3RyYXZlcnNlUmlnaHRCb3VuZGFyeShlbmRBbmNlc3RvciwgaG93KTsNCg0KCQkJaWYgKGZyYWcpDQoJCQkJZnJhZy5hcHBlbmRDaGlsZChuKTsNCg0KCQkJZW5kSWR4ID0gbm9kZUluZGV4KGVuZEFuY2VzdG9yKTsNCgkJCWNudCA9IGVuZElkeCAtIHRbU1RBUlRfT0ZGU0VUXTsNCg0KCQkJaWYgKGNudCA8PSAwKSB7DQoJCQkJLy8gQ29sbGFwc2UgdG8ganVzdCBiZWZvcmUgdGhlIGVuZEFuY2VzdG9yLCB3aGljaA0KCQkJCS8vIGlzIHBhcnRpYWxseSBzZWxlY3RlZC4NCgkJCQlpZiAoaG93ICE9IENMT05FKSB7DQoJCQkJCXQuc2V0RW5kQmVmb3JlKGVuZEFuY2VzdG9yKTsNCgkJCQkJdC5jb2xsYXBzZShGQUxTRSk7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGZyYWc7DQoJCQl9DQoNCgkJCW4gPSBlbmRBbmNlc3Rvci5wcmV2aW91c1NpYmxpbmc7DQoJCQl3aGlsZSAoY250ID4gMCkgew0KCQkJCXNpYmxpbmcgPSBuLnByZXZpb3VzU2libGluZzsNCgkJCQl4ZmVyTm9kZSA9IF90cmF2ZXJzZUZ1bGx5U2VsZWN0ZWQobiwgaG93KTsNCg0KCQkJCWlmIChmcmFnKQ0KCQkJCQlmcmFnLmluc2VydEJlZm9yZSh4ZmVyTm9kZSwgZnJhZy5maXJzdENoaWxkKTsNCg0KCQkJCS0tY250Ow0KCQkJCW4gPSBzaWJsaW5nOw0KCQkJfQ0KDQoJCQkvLyBDb2xsYXBzZSB0byBqdXN0IGJlZm9yZSB0aGUgZW5kQW5jZXN0b3IsIHdoaWNoDQoJCQkvLyBpcyBwYXJ0aWFsbHkgc2VsZWN0ZWQuDQoJCQlpZiAoaG93ICE9IENMT05FKSB7DQoJCQkJdC5zZXRFbmRCZWZvcmUoZW5kQW5jZXN0b3IpOw0KCQkJCXQuY29sbGFwc2UoRkFMU0UpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZnJhZzsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VDb21tb25FbmRDb250YWluZXIoc3RhcnRBbmNlc3RvciwgaG93KSB7DQoJCQl2YXIgZnJhZywgc3RhcnRJZHgsIG4sIGNudCwgc2libGluZywgeGZlck5vZGU7DQoNCgkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCWZyYWcgPSBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KDQoJCQluID0gX3RyYXZlcnNlTGVmdEJvdW5kYXJ5KHN0YXJ0QW5jZXN0b3IsIGhvdyk7DQoJCQlpZiAoZnJhZykNCgkJCQlmcmFnLmFwcGVuZENoaWxkKG4pOw0KDQoJCQlzdGFydElkeCA9IG5vZGVJbmRleChzdGFydEFuY2VzdG9yKTsNCgkJCSsrc3RhcnRJZHg7ICAvLyBCZWNhdXNlIHdlIGFscmVhZHkgdHJhdmVyc2VkIGl0Li4uLg0KDQoJCQljbnQgPSB0W0VORF9PRkZTRVRdIC0gc3RhcnRJZHg7DQoJCQluID0gc3RhcnRBbmNlc3Rvci5uZXh0U2libGluZzsNCgkJCXdoaWxlIChjbnQgPiAwKSB7DQoJCQkJc2libGluZyA9IG4ubmV4dFNpYmxpbmc7DQoJCQkJeGZlck5vZGUgPSBfdHJhdmVyc2VGdWxseVNlbGVjdGVkKG4sIGhvdyk7DQoNCgkJCQlpZiAoZnJhZykNCgkJCQkJZnJhZy5hcHBlbmRDaGlsZCh4ZmVyTm9kZSk7DQoNCgkJCQktLWNudDsNCgkJCQluID0gc2libGluZzsNCgkJCX0NCg0KCQkJaWYgKGhvdyAhPSBDTE9ORSkgew0KCQkJCXQuc2V0U3RhcnRBZnRlcihzdGFydEFuY2VzdG9yKTsNCgkJCQl0LmNvbGxhcHNlKFRSVUUpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZnJhZzsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VDb21tb25BbmNlc3RvcnMoc3RhcnRBbmNlc3RvciwgZW5kQW5jZXN0b3IsIGhvdykgew0KCQkJdmFyIG4sIGZyYWcsIGNvbW1vblBhcmVudCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCwgY250LCBzaWJsaW5nLCBuZXh0U2libGluZzsNCg0KCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJZnJhZyA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQoNCgkJCW4gPSBfdHJhdmVyc2VMZWZ0Qm91bmRhcnkoc3RhcnRBbmNlc3RvciwgaG93KTsNCgkJCWlmIChmcmFnKQ0KCQkJCWZyYWcuYXBwZW5kQ2hpbGQobik7DQoNCgkJCWNvbW1vblBhcmVudCA9IHN0YXJ0QW5jZXN0b3IucGFyZW50Tm9kZTsNCgkJCXN0YXJ0T2Zmc2V0ID0gbm9kZUluZGV4KHN0YXJ0QW5jZXN0b3IpOw0KCQkJZW5kT2Zmc2V0ID0gbm9kZUluZGV4KGVuZEFuY2VzdG9yKTsNCgkJCSsrc3RhcnRPZmZzZXQ7DQoNCgkJCWNudCA9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0Ow0KCQkJc2libGluZyA9IHN0YXJ0QW5jZXN0b3IubmV4dFNpYmxpbmc7DQoNCgkJCXdoaWxlIChjbnQgPiAwKSB7DQoJCQkJbmV4dFNpYmxpbmcgPSBzaWJsaW5nLm5leHRTaWJsaW5nOw0KCQkJCW4gPSBfdHJhdmVyc2VGdWxseVNlbGVjdGVkKHNpYmxpbmcsIGhvdyk7DQoNCgkJCQlpZiAoZnJhZykNCgkJCQkJZnJhZy5hcHBlbmRDaGlsZChuKTsNCg0KCQkJCXNpYmxpbmcgPSBuZXh0U2libGluZzsNCgkJCQktLWNudDsNCgkJCX0NCg0KCQkJbiA9IF90cmF2ZXJzZVJpZ2h0Qm91bmRhcnkoZW5kQW5jZXN0b3IsIGhvdyk7DQoNCgkJCWlmIChmcmFnKQ0KCQkJCWZyYWcuYXBwZW5kQ2hpbGQobik7DQoNCgkJCWlmIChob3cgIT0gQ0xPTkUpIHsNCgkJCQl0LnNldFN0YXJ0QWZ0ZXIoc3RhcnRBbmNlc3Rvcik7DQoJCQkJdC5jb2xsYXBzZShUUlVFKTsNCgkJCX0NCg0KCQkJcmV0dXJuIGZyYWc7DQoJCX07DQoNCgkJZnVuY3Rpb24gX3RyYXZlcnNlUmlnaHRCb3VuZGFyeShyb290LCBob3cpIHsNCgkJCXZhciBuZXh0ID0gX2dldFNlbGVjdGVkTm9kZSh0W0VORF9DT05UQUlORVJdLCB0W0VORF9PRkZTRVRdIC0gMSksIHBhcmVudCwgY2xvbmVkUGFyZW50LCBwcmV2U2libGluZywgY2xvbmVkQ2hpbGQsIGNsb25lZEdyYW5kUGFyZW50LCBpc0Z1bGx5U2VsZWN0ZWQgPSBuZXh0ICE9IHRbRU5EX0NPTlRBSU5FUl07DQoNCgkJCWlmIChuZXh0ID09IHJvb3QpDQoJCQkJcmV0dXJuIF90cmF2ZXJzZU5vZGUobmV4dCwgaXNGdWxseVNlbGVjdGVkLCBGQUxTRSwgaG93KTsNCg0KCQkJcGFyZW50ID0gbmV4dC5wYXJlbnROb2RlOw0KCQkJY2xvbmVkUGFyZW50ID0gX3RyYXZlcnNlTm9kZShwYXJlbnQsIEZBTFNFLCBGQUxTRSwgaG93KTsNCg0KCQkJd2hpbGUgKHBhcmVudCkgew0KCQkJCXdoaWxlIChuZXh0KSB7DQoJCQkJCXByZXZTaWJsaW5nID0gbmV4dC5wcmV2aW91c1NpYmxpbmc7DQoJCQkJCWNsb25lZENoaWxkID0gX3RyYXZlcnNlTm9kZShuZXh0LCBpc0Z1bGx5U2VsZWN0ZWQsIEZBTFNFLCBob3cpOw0KDQoJCQkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCQkJY2xvbmVkUGFyZW50Lmluc2VydEJlZm9yZShjbG9uZWRDaGlsZCwgY2xvbmVkUGFyZW50LmZpcnN0Q2hpbGQpOw0KDQoJCQkJCWlzRnVsbHlTZWxlY3RlZCA9IFRSVUU7DQoJCQkJCW5leHQgPSBwcmV2U2libGluZzsNCgkJCQl9DQoNCgkJCQlpZiAocGFyZW50ID09IHJvb3QpDQoJCQkJCXJldHVybiBjbG9uZWRQYXJlbnQ7DQoNCgkJCQluZXh0ID0gcGFyZW50LnByZXZpb3VzU2libGluZzsNCgkJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTsNCg0KCQkJCWNsb25lZEdyYW5kUGFyZW50ID0gX3RyYXZlcnNlTm9kZShwYXJlbnQsIEZBTFNFLCBGQUxTRSwgaG93KTsNCg0KCQkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCQljbG9uZWRHcmFuZFBhcmVudC5hcHBlbmRDaGlsZChjbG9uZWRQYXJlbnQpOw0KDQoJCQkJY2xvbmVkUGFyZW50ID0gY2xvbmVkR3JhbmRQYXJlbnQ7DQoJCQl9DQoJCX07DQoNCgkJZnVuY3Rpb24gX3RyYXZlcnNlTGVmdEJvdW5kYXJ5KHJvb3QsIGhvdykgew0KCQkJdmFyIG5leHQgPSBfZ2V0U2VsZWN0ZWROb2RlKHRbU1RBUlRfQ09OVEFJTkVSXSwgdFtTVEFSVF9PRkZTRVRdKSwgaXNGdWxseVNlbGVjdGVkID0gbmV4dCAhPSB0W1NUQVJUX0NPTlRBSU5FUl0sIHBhcmVudCwgY2xvbmVkUGFyZW50LCBuZXh0U2libGluZywgY2xvbmVkQ2hpbGQsIGNsb25lZEdyYW5kUGFyZW50Ow0KDQoJCQlpZiAobmV4dCA9PSByb290KQ0KCQkJCXJldHVybiBfdHJhdmVyc2VOb2RlKG5leHQsIGlzRnVsbHlTZWxlY3RlZCwgVFJVRSwgaG93KTsNCg0KCQkJcGFyZW50ID0gbmV4dC5wYXJlbnROb2RlOw0KCQkJY2xvbmVkUGFyZW50ID0gX3RyYXZlcnNlTm9kZShwYXJlbnQsIEZBTFNFLCBUUlVFLCBob3cpOw0KDQoJCQl3aGlsZSAocGFyZW50KSB7DQoJCQkJd2hpbGUgKG5leHQpIHsNCgkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0Lm5leHRTaWJsaW5nOw0KCQkJCQljbG9uZWRDaGlsZCA9IF90cmF2ZXJzZU5vZGUobmV4dCwgaXNGdWxseVNlbGVjdGVkLCBUUlVFLCBob3cpOw0KDQoJCQkJCWlmIChob3cgIT0gREVMRVRFKQ0KCQkJCQkJY2xvbmVkUGFyZW50LmFwcGVuZENoaWxkKGNsb25lZENoaWxkKTsNCg0KCQkJCQlpc0Z1bGx5U2VsZWN0ZWQgPSBUUlVFOw0KCQkJCQluZXh0ID0gbmV4dFNpYmxpbmc7DQoJCQkJfQ0KDQoJCQkJaWYgKHBhcmVudCA9PSByb290KQ0KCQkJCQlyZXR1cm4gY2xvbmVkUGFyZW50Ow0KDQoJCQkJbmV4dCA9IHBhcmVudC5uZXh0U2libGluZzsNCgkJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTsNCg0KCQkJCWNsb25lZEdyYW5kUGFyZW50ID0gX3RyYXZlcnNlTm9kZShwYXJlbnQsIEZBTFNFLCBUUlVFLCBob3cpOw0KDQoJCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJCWNsb25lZEdyYW5kUGFyZW50LmFwcGVuZENoaWxkKGNsb25lZFBhcmVudCk7DQoNCgkJCQljbG9uZWRQYXJlbnQgPSBjbG9uZWRHcmFuZFBhcmVudDsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VOb2RlKG4sIGlzRnVsbHlTZWxlY3RlZCwgaXNMZWZ0LCBob3cpIHsNCgkJCXZhciB0eHRWYWx1ZSwgbmV3Tm9kZVZhbHVlLCBvbGROb2RlVmFsdWUsIG9mZnNldCwgbmV3Tm9kZTsNCg0KCQkJaWYgKGlzRnVsbHlTZWxlY3RlZCkNCgkJCQlyZXR1cm4gX3RyYXZlcnNlRnVsbHlTZWxlY3RlZChuLCBob3cpOw0KDQoJCQlpZiAobi5ub2RlVHlwZSA9PSAzIC8qIFRFWFRfTk9ERSAqLykgew0KCQkJCXR4dFZhbHVlID0gbi5ub2RlVmFsdWU7DQoNCgkJCQlpZiAoaXNMZWZ0KSB7DQoJCQkJCW9mZnNldCA9IHRbU1RBUlRfT0ZGU0VUXTsNCgkJCQkJbmV3Tm9kZVZhbHVlID0gdHh0VmFsdWUuc3Vic3RyaW5nKG9mZnNldCk7DQoJCQkJCW9sZE5vZGVWYWx1ZSA9IHR4dFZhbHVlLnN1YnN0cmluZygwLCBvZmZzZXQpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCW9mZnNldCA9IHRbRU5EX09GRlNFVF07DQoJCQkJCW5ld05vZGVWYWx1ZSA9IHR4dFZhbHVlLnN1YnN0cmluZygwLCBvZmZzZXQpOw0KCQkJCQlvbGROb2RlVmFsdWUgPSB0eHRWYWx1ZS5zdWJzdHJpbmcob2Zmc2V0KTsNCgkJCQl9DQoNCgkJCQlpZiAoaG93ICE9IENMT05FKQ0KCQkJCQluLm5vZGVWYWx1ZSA9IG9sZE5vZGVWYWx1ZTsNCg0KCQkJCWlmIChob3cgPT0gREVMRVRFKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQluZXdOb2RlID0gbi5jbG9uZU5vZGUoRkFMU0UpOw0KCQkJCW5ld05vZGUubm9kZVZhbHVlID0gbmV3Tm9kZVZhbHVlOw0KDQoJCQkJcmV0dXJuIG5ld05vZGU7DQoJCQl9DQoNCgkJCWlmIChob3cgPT0gREVMRVRFKQ0KCQkJCXJldHVybjsNCg0KCQkJcmV0dXJuIG4uY2xvbmVOb2RlKEZBTFNFKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VGdWxseVNlbGVjdGVkKG4sIGhvdykgew0KCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJcmV0dXJuIGhvdyA9PSBDTE9ORSA/IG4uY2xvbmVOb2RlKFRSVUUpIDogbjsNCg0KCQkJbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pOw0KCQl9Ow0KCX07DQoNCglucy5SYW5nZSA9IFJhbmdlOw0KfSkodGlueW1jZS5kb20pOw0KDQooZnVuY3Rpb24oKSB7DQoJZnVuY3Rpb24gU2VsZWN0aW9uKHNlbGVjdGlvbikgew0KCQl2YXIgdCA9IHRoaXMsIGludmlzaWJsZUNoYXIgPSAnXHVGRUZGJywgcmFuZ2UsIGxhc3RJRVJuZywgZG9tID0gc2VsZWN0aW9uLmRvbSwgVFJVRSA9IHRydWUsIEZBTFNFID0gZmFsc2U7DQoNCgkJLy8gUmV0dXJucyBhIFczQyBET00gY29tcGF0aWJsZSByYW5nZSBvYmplY3QgYnkgdXNpbmcgdGhlIElFIFJhbmdlIEFQSQ0KCQlmdW5jdGlvbiBnZXRSYW5nZSgpIHsNCgkJCXZhciBpZVJhbmdlID0gc2VsZWN0aW9uLmdldFJuZygpLCBkb21SYW5nZSA9IGRvbS5jcmVhdGVSbmcoKSwgZWxlbWVudCwgY29sbGFwc2VkOw0KDQoJCQkvLyBJZiBzZWxlY3Rpb24gaXMgb3V0c2lkZSB0aGUgY3VycmVudCBkb2N1bWVudCBqdXN0IHJldHVybiBhbiBlbXB0eSByYW5nZQ0KCQkJZWxlbWVudCA9IGllUmFuZ2UuaXRlbSA/IGllUmFuZ2UuaXRlbSgwKSA6IGllUmFuZ2UucGFyZW50RWxlbWVudCgpOw0KCQkJaWYgKGVsZW1lbnQub3duZXJEb2N1bWVudCAhPSBkb20uZG9jKQ0KCQkJCXJldHVybiBkb21SYW5nZTsNCg0KCQkJLy8gSGFuZGxlIGNvbnRyb2wgc2VsZWN0aW9uIG9yIHRleHQgc2VsZWN0aW9uIG9mIGEgaW1hZ2UNCgkJCWlmIChpZVJhbmdlLml0ZW0gfHwgIWVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7DQoJCQkJZG9tUmFuZ2Uuc2V0U3RhcnQoZWxlbWVudC5wYXJlbnROb2RlLCBkb20ubm9kZUluZGV4KGVsZW1lbnQpKTsNCgkJCQlkb21SYW5nZS5zZXRFbmQoZG9tUmFuZ2Uuc3RhcnRDb250YWluZXIsIGRvbVJhbmdlLnN0YXJ0T2Zmc2V0ICsgMSk7DQoNCgkJCQlyZXR1cm4gZG9tUmFuZ2U7DQoJCQl9DQoNCgkJCWNvbGxhcHNlZCA9IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpOw0KDQoJCQlmdW5jdGlvbiBmaW5kRW5kUG9pbnQoc3RhcnQpIHsNCgkJCQl2YXIgbWFya2VyLCBjb250YWluZXIsIG9mZnNldCwgbm9kZXMsIHN0YXJ0SW5kZXggPSAwLCBlbmRJbmRleCwgaW5kZXgsIHBhcmVudCwgY2hlY2tSbmcsIHBvc2l0aW9uOw0KDQoJCQkJLy8gU2V0dXAgdGVtcCByYW5nZSBhbmQgY29sbGFwc2UgaXQNCgkJCQljaGVja1JuZyA9IGllUmFuZ2UuZHVwbGljYXRlKCk7DQoJCQkJY2hlY2tSbmcuY29sbGFwc2Uoc3RhcnQpOw0KDQoJCQkJLy8gQ3JlYXRlIG1hcmtlciBhbmQgaW5zZXJ0IGl0IGF0IHRoZSBlbmQgb2YgdGhlIGVuZHBvaW50cyBwYXJlbnQNCgkJCQltYXJrZXIgPSBkb20uY3JlYXRlKCdhJyk7DQoJCQkJcGFyZW50ID0gY2hlY2tSbmcucGFyZW50RWxlbWVudCgpOw0KDQoJCQkJLy8gSWYgcGFyZW50IGRvZXNuJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gdGhlbiBzZXQgdGhlIGNvbnRhaW5lciB0byB0aGF0IHBhcmVudCBhbmQgdGhlIGluZGV4IHRvIDANCgkJCQlpZiAoIXBhcmVudC5oYXNDaGlsZE5vZGVzKCkpIHsNCgkJCQkJZG9tUmFuZ2Vbc3RhcnQgPyAnc2V0U3RhcnQnIDogJ3NldEVuZCddKHBhcmVudCwgMCk7DQoJCQkJCXJldHVybjsNCgkJCQl9DQoNCgkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQobWFya2VyKTsNCgkJCQljaGVja1JuZy5tb3ZlVG9FbGVtZW50VGV4dChtYXJrZXIpOw0KCQkJCXBvc2l0aW9uID0gaWVSYW5nZS5jb21wYXJlRW5kUG9pbnRzKHN0YXJ0ID8gJ1N0YXJ0VG9TdGFydCcgOiAnRW5kVG9FbmQnLCBjaGVja1JuZyk7DQoJCQkJaWYgKHBvc2l0aW9uID4gMCkgew0KCQkJCQkvLyBUaGUgcG9zaXRpb24gaXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgcGFyZW50IGVsZW1lbnQuDQoJCQkJCS8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgSUUgcHV0cyB0aGUgY2FyZXQgdG8gdGhlIGxlZnQgZWRnZSBvZiBhIHRhYmxlLg0KCQkJCQlkb21SYW5nZVtzdGFydCA/ICdzZXRTdGFydEFmdGVyJyA6ICdzZXRFbmRBZnRlciddKHBhcmVudCk7DQoJCQkJCWRvbS5yZW1vdmUobWFya2VyKTsNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCg0KCQkJCS8vIFNldHVwIG5vZGUgbGlzdCBhbmQgZW5kSW5kZXgNCgkJCQlub2RlcyA9IHRpbnltY2UuZ3JlcChwYXJlbnQuY2hpbGROb2Rlcyk7DQoJCQkJZW5kSW5kZXggPSBub2Rlcy5sZW5ndGggLSAxOw0KCQkJCS8vIFBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIGZvciB0aGUgcG9zaXRpb24NCgkJCQl3aGlsZSAoc3RhcnRJbmRleCA8PSBlbmRJbmRleCkgew0KCQkJCQlpbmRleCA9IE1hdGguZmxvb3IoKHN0YXJ0SW5kZXggKyBlbmRJbmRleCkgLyAyKTsNCg0KCQkJCQkvLyBJbnNlcnQgbWFya2VyIGFuZCBjaGVjayBpdCdzIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzZWxlY3Rpb24NCgkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShtYXJrZXIsIG5vZGVzW2luZGV4XSk7DQoJCQkJCWNoZWNrUm5nLm1vdmVUb0VsZW1lbnRUZXh0KG1hcmtlcik7DQoJCQkJCXBvc2l0aW9uID0gaWVSYW5nZS5jb21wYXJlRW5kUG9pbnRzKHN0YXJ0ID8gJ1N0YXJ0VG9TdGFydCcgOiAnRW5kVG9FbmQnLCBjaGVja1JuZyk7DQoJCQkJCWlmIChwb3NpdGlvbiA+IDApIHsNCgkJCQkJCS8vIE1hcmtlciBpcyB0byB0aGUgcmlnaHQNCgkJCQkJCXN0YXJ0SW5kZXggPSBpbmRleCArIDE7DQoJCQkJCX0gZWxzZSBpZiAocG9zaXRpb24gPCAwKSB7DQoJCQkJCQkvLyBNYXJrZXIgaXMgdG8gdGhlIGxlZnQNCgkJCQkJCWVuZEluZGV4ID0gaW5kZXggLSAxOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJLy8gTWFrZXIgaXMgd2hlcmUgd2UgYXJlDQoJCQkJCQlmb3VuZCA9IHRydWU7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIFNldHVwIGNvbnRhaW5lcg0KCQkJCWNvbnRhaW5lciA9IHBvc2l0aW9uID4gMCB8fCBpbmRleCA9PSAwID8gbWFya2VyLm5leHRTaWJsaW5nIDogbWFya2VyLnByZXZpb3VzU2libGluZzsNCg0KCQkJCS8vIEhhbmRsZSBlbGVtZW50IHNlbGVjdGlvbg0KCQkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMSkgew0KCQkJCQlkb20ucmVtb3ZlKG1hcmtlcik7DQoNCgkJCQkJLy8gRmluZCBvZmZzZXQgYW5kIGNvbnRhaW5lcg0KCQkJCQlvZmZzZXQgPSBkb20ubm9kZUluZGV4KGNvbnRhaW5lcik7DQoJCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlOw0KDQoJCQkJCS8vIE1vdmUgdGhlIG9mZnNldCBpZiB3ZSBhcmUgc2V0dGluZyB0aGUgZW5kIG9yIHRoZSBwb3NpdGlvbiBpcyBhZnRlciBhbiBlbGVtZW50DQoJCQkJCWlmICghc3RhcnQgfHwgaW5kZXggPiAwKQ0KCQkJCQkJb2Zmc2V0Kys7DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gQ2FsY3VsYXRlIG9mZnNldCB3aXRoaW4gdGV4dCBub2RlDQoJCQkJCWlmIChwb3NpdGlvbiA+IDAgfHwgaW5kZXggPT0gMCkgew0KCQkJCQkJY2hlY2tSbmcuc2V0RW5kUG9pbnQoc3RhcnQgPyAnU3RhcnRUb1N0YXJ0JyA6ICdFbmRUb0VuZCcsIGllUmFuZ2UpOw0KCQkJCQkJb2Zmc2V0ID0gY2hlY2tSbmcudGV4dC5sZW5ndGg7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQljaGVja1JuZy5zZXRFbmRQb2ludChzdGFydCA/ICdTdGFydFRvU3RhcnQnIDogJ0VuZFRvRW5kJywgaWVSYW5nZSk7DQoJCQkJCQlvZmZzZXQgPSBjb250YWluZXIubm9kZVZhbHVlLmxlbmd0aCAtIGNoZWNrUm5nLnRleHQubGVuZ3RoOw0KCQkJCQl9DQoNCgkJCQkJZG9tLnJlbW92ZShtYXJrZXIpOw0KCQkJCX0NCg0KCQkJCWRvbVJhbmdlW3N0YXJ0ID8gJ3NldFN0YXJ0JyA6ICdzZXRFbmQnXShjb250YWluZXIsIG9mZnNldCk7DQoJCQl9Ow0KDQoJCQkvLyBGaW5kIHN0YXJ0IHBvaW50DQoJCQlmaW5kRW5kUG9pbnQodHJ1ZSk7DQoNCgkJCS8vIEZpbmQgZW5kIHBvaW50IGlmIG5lZWRlZA0KCQkJaWYgKCFjb2xsYXBzZWQpDQoJCQkJZmluZEVuZFBvaW50KCk7DQoNCgkJCXJldHVybiBkb21SYW5nZTsNCgkJfTsNCg0KCQl0aGlzLmFkZFJhbmdlID0gZnVuY3Rpb24ocm5nKSB7DQoJCQl2YXIgaWVSbmcsIGN0cmxSbmcsIHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCwgZW5kQ29udGFpbmVyLCBlbmRPZmZzZXQsIGRvYyA9IHNlbGVjdGlvbi5kb20uZG9jLCBib2R5ID0gZG9jLmJvZHk7DQoNCgkJCWZ1bmN0aW9uIHNldEVuZFBvaW50KHN0YXJ0KSB7DQoJCQkJdmFyIGNvbnRhaW5lciwgb2Zmc2V0LCBtYXJrZXIsIHRtcFJuZywgbm9kZXM7DQoNCgkJCQltYXJrZXIgPSBkb20uY3JlYXRlKCdhJyk7DQoJCQkJY29udGFpbmVyID0gc3RhcnQgPyBzdGFydENvbnRhaW5lciA6IGVuZENvbnRhaW5lcjsNCgkJCQlvZmZzZXQgPSBzdGFydCA/IHN0YXJ0T2Zmc2V0IDogZW5kT2Zmc2V0Ow0KCQkJCXRtcFJuZyA9IGllUm5nLmR1cGxpY2F0ZSgpOw0KDQoJCQkJaWYgKGNvbnRhaW5lciA9PSBkb2MpIHsNCgkJCQkJY29udGFpbmVyID0gYm9keTsNCgkJCQkJb2Zmc2V0ID0gMDsNCgkJCQl9DQoNCgkJCQlpZiAoY29udGFpbmVyLm5vZGVUeXBlID09IDMpIHsNCgkJCQkJY29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG1hcmtlciwgY29udGFpbmVyKTsNCgkJCQkJdG1wUm5nLm1vdmVUb0VsZW1lbnRUZXh0KG1hcmtlcik7DQoJCQkJCXRtcFJuZy5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIG9mZnNldCk7DQoJCQkJCWRvbS5yZW1vdmUobWFya2VyKTsNCgkJCQkJaWVSbmcuc2V0RW5kUG9pbnQoc3RhcnQgPyAnU3RhcnRUb1N0YXJ0JyA6ICdFbmRUb0VuZCcsIHRtcFJuZyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJbm9kZXMgPSBjb250YWluZXIuY2hpbGROb2RlczsNCg0KCQkJCQlpZiAobm9kZXMubGVuZ3RoKSB7DQoJCQkJCQlpZiAob2Zmc2V0ID49IG5vZGVzLmxlbmd0aCkgew0KCQkJCQkJCWRvbS5pbnNlcnRBZnRlcihtYXJrZXIsIG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJY29udGFpbmVyLmluc2VydEJlZm9yZShtYXJrZXIsIG5vZGVzW29mZnNldF0pOw0KCQkJCQkJfQ0KDQoJCQkJCQl0bXBSbmcubW92ZVRvRWxlbWVudFRleHQobWFya2VyKTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCS8vIEVtcHR5IG5vZGUgc2VsZWN0aW9uIGZvciBleGFtcGxlIDxkaXY+fDwvZGl2Pg0KCQkJCQkJbWFya2VyID0gZG9jLmNyZWF0ZVRleHROb2RlKGludmlzaWJsZUNoYXIpOw0KCQkJCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKG1hcmtlcik7DQoJCQkJCQl0bXBSbmcubW92ZVRvRWxlbWVudFRleHQobWFya2VyLnBhcmVudE5vZGUpOw0KCQkJCQkJdG1wUm5nLmNvbGxhcHNlKFRSVUUpOw0KCQkJCQl9DQoNCgkJCQkJaWVSbmcuc2V0RW5kUG9pbnQoc3RhcnQgPyAnU3RhcnRUb1N0YXJ0JyA6ICdFbmRUb0VuZCcsIHRtcFJuZyk7DQoJCQkJCWRvbS5yZW1vdmUobWFya2VyKTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIERlc3Ryb3kgY2FjaGVkIHJhbmdlDQoJCQl0aGlzLmRlc3Ryb3koKTsNCg0KCQkJLy8gU2V0dXAgc29tZSBzaG9ydGVyIHZlcnNpb25zDQoJCQlzdGFydENvbnRhaW5lciA9IHJuZy5zdGFydENvbnRhaW5lcjsNCgkJCXN0YXJ0T2Zmc2V0ID0gcm5nLnN0YXJ0T2Zmc2V0Ow0KCQkJZW5kQ29udGFpbmVyID0gcm5nLmVuZENvbnRhaW5lcjsNCgkJCWVuZE9mZnNldCA9IHJuZy5lbmRPZmZzZXQ7DQoJCQlpZVJuZyA9IGJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7DQoNCgkJCS8vIElmIHNpbmdsZSBlbGVtZW50IHNlbGVjdGlvbiB0aGVuIHRyeSBtYWtpbmcgYSBjb250cm9sIHNlbGVjdGlvbiBvdXQgb2YgaXQNCgkJCWlmIChzdGFydENvbnRhaW5lciA9PSBlbmRDb250YWluZXIgJiYgc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMSAmJiBzdGFydE9mZnNldCA9PSBlbmRPZmZzZXQgLSAxKSB7DQoJCQkJaWYgKHN0YXJ0T2Zmc2V0ID09IGVuZE9mZnNldCAtIDEpIHsNCgkJCQkJdHJ5IHsNCgkJCQkJCWN0cmxSbmcgPSBib2R5LmNyZWF0ZUNvbnRyb2xSYW5nZSgpOw0KCQkJCQkJY3RybFJuZy5hZGRFbGVtZW50KHN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbc3RhcnRPZmZzZXRdKTsNCgkJCQkJCWN0cmxSbmcuc2VsZWN0KCk7DQoJCQkJCQljdHJsUm5nLnNjcm9sbEludG9WaWV3KCk7DQoJCQkJCQlyZXR1cm47DQoJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkvLyBJZ25vcmUNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gU2V0IHN0YXJ0L2VuZCBwb2ludCBvZiBzZWxlY3Rpb24NCgkJCXNldEVuZFBvaW50KHRydWUpOw0KCQkJc2V0RW5kUG9pbnQoKTsNCg0KCQkJLy8gU2VsZWN0IHRoZSBuZXcgcmFuZ2UgYW5kIHNjcm9sbCBpdCBpbnRvIHZpZXcNCgkJCWllUm5nLnNlbGVjdCgpOw0KCQkJaWVSbmcuc2Nyb2xsSW50b1ZpZXcoKTsNCgkJfTsNCg0KCQl0aGlzLmdldFJhbmdlQXQgPSBmdW5jdGlvbigpIHsNCgkJCS8vIFNldHVwIG5ldyByYW5nZSBpZiB0aGUgY2FjaGUgaXMgZW1wdHkNCgkJCWlmICghcmFuZ2UgfHwgIXRpbnltY2UuZG9tLlJhbmdlVXRpbHMuY29tcGFyZVJhbmdlcyhsYXN0SUVSbmcsIHNlbGVjdGlvbi5nZXRSbmcoKSkpIHsNCgkJCQlyYW5nZSA9IGdldFJhbmdlKCk7DQoNCgkJCQkvLyBTdG9yZSBhd2F5IHRleHQgcmFuZ2UgZm9yIG5leHQgY2FsbA0KCQkJCWxhc3RJRVJuZyA9IHNlbGVjdGlvbi5nZXRSbmcoKTsNCgkJCX0NCg0KCQkJLy8gSUUgd2lsbCBzYXkgdGhhdCB0aGUgcmFuZ2UgaXMgZXF1YWwgdGhlbiBwcm9kdWNlIGFuIGludmFsaWQgYXJndW1lbnQgZXhjZXB0aW9uDQoJCQkvLyBpZiB5b3UgcGVyZm9ybSBzcGVjaWZpYyBvcGVyYXRpb25zIGluIGEga2V5dXAgZXZlbnQuIEZvciBleGFtcGxlIEN0cmwrRGVsLg0KCQkJLy8gVGhpcyBoYWNrIHdpbGwgaW52YWxpZGF0ZSB0aGUgcmFuZ2UgY2FjaGUgaWYgdGhlIGV4Y2VwdGlvbiBvY2N1cnMNCgkJCXRyeSB7DQoJCQkJcmFuZ2Uuc3RhcnRDb250YWluZXIubmV4dFNpYmxpbmc7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJCXJhbmdlID0gZ2V0UmFuZ2UoKTsNCgkJCQlsYXN0SUVSbmcgPSBudWxsOw0KCQkJfQ0KDQoJCQkvLyBSZXR1cm4gY2FjaGVkIHJhbmdlDQoJCQlyZXR1cm4gcmFuZ2U7DQoJCX07DQoNCgkJdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKSB7DQoJCQkvLyBEZXN0cm95IGNhY2hlZCByYW5nZSBhbmQgbGFzdCBJRSByYW5nZSB0byBhdm9pZCBtZW1vcnkgbGVha3MNCgkJCWxhc3RJRVJuZyA9IHJhbmdlID0gbnVsbDsNCgkJfTsNCgl9Ow0KDQoJLy8gRXhwb3NlIHRoZSBzZWxlY3Rpb24gb2JqZWN0DQoJdGlueW1jZS5kb20uVHJpZGVudFNlbGVjdGlvbiA9IFNlbGVjdGlvbjsNCn0pKCk7DQoNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgkvLyBTaG9ydGVuIG5hbWVzDQoJdmFyIGVhY2ggPSB0aW55bWNlLmVhY2gsIERPTSA9IHRpbnltY2UuRE9NLCBpc0lFID0gdGlueW1jZS5pc0lFLCBpc1dlYktpdCA9IHRpbnltY2UuaXNXZWJLaXQsIEV2ZW50Ow0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UuZG9tLkV2ZW50VXRpbHMnLCB7DQoJCUV2ZW50VXRpbHMgOiBmdW5jdGlvbigpIHsNCgkJCXRoaXMuaW5pdHMgPSBbXTsNCgkJCXRoaXMuZXZlbnRzID0gW107DQoJCX0sDQoNCgkJYWRkIDogZnVuY3Rpb24obywgbiwgZiwgcykgew0KCQkJdmFyIGNiLCB0ID0gdGhpcywgZWwgPSB0LmV2ZW50cywgcjsNCg0KCQkJaWYgKG4gaW5zdGFuY2VvZiBBcnJheSkgew0KCQkJCXIgPSBbXTsNCg0KCQkJCWVhY2gobiwgZnVuY3Rpb24obikgew0KCQkJCQlyLnB1c2godC5hZGQobywgbiwgZiwgcykpOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIHI7DQoJCQl9DQoNCgkJCS8vIEhhbmRsZSBhcnJheQ0KCQkJaWYgKG8gJiYgby5oYXNPd25Qcm9wZXJ0eSAmJiBvIGluc3RhbmNlb2YgQXJyYXkpIHsNCgkJCQlyID0gW107DQoNCgkJCQllYWNoKG8sIGZ1bmN0aW9uKG8pIHsNCgkJCQkJbyA9IERPTS5nZXQobyk7DQoJCQkJCXIucHVzaCh0LmFkZChvLCBuLCBmLCBzKSk7DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm4gcjsNCgkJCX0NCg0KCQkJbyA9IERPTS5nZXQobyk7DQoNCgkJCWlmICghbykNCgkJCQlyZXR1cm47DQoNCgkJCS8vIFNldHVwIGV2ZW50IGNhbGxiYWNrDQoJCQljYiA9IGZ1bmN0aW9uKGUpIHsNCgkJCQkvLyBJcyBhbGwgZXZlbnRzIGRpc2FibGVkDQoJCQkJaWYgKHQuZGlzYWJsZWQpDQoJCQkJCXJldHVybjsNCg0KCQkJCWUgPSBlIHx8IHdpbmRvdy5ldmVudDsNCg0KCQkJCS8vIFBhdGNoIGluIHRhcmdldCwgcHJldmVudERlZmF1bHQgYW5kIHN0b3BQcm9wYWdhdGlvbiBpbiBJRSBpdCdzIFczQyB2YWxpZA0KCQkJCWlmIChlICYmIGlzSUUpIHsNCgkJCQkJaWYgKCFlLnRhcmdldCkNCgkJCQkJCWUudGFyZ2V0ID0gZS5zcmNFbGVtZW50Ow0KDQoJCQkJCS8vIFBhdGNoIGluIHByZXZlbnREZWZhdWx0LCBzdG9wUHJvcGFnYXRpb24gbWV0aG9kcyBmb3IgVzNDIGNvbXBhdGliaWxpdHkNCgkJCQkJdGlueW1jZS5leHRlbmQoZSwgdC5fc3RvcHBlcnMpOw0KCQkJCX0NCg0KCQkJCWlmICghcykNCgkJCQkJcmV0dXJuIGYoZSk7DQoNCgkJCQlyZXR1cm4gZi5jYWxsKHMsIGUpOw0KCQkJfTsNCg0KCQkJaWYgKG4gPT0gJ3VubG9hZCcpIHsNCgkJCQl0aW55bWNlLnVubG9hZHMudW5zaGlmdCh7ZnVuYyA6IGNifSk7DQoJCQkJcmV0dXJuIGNiOw0KCQkJfQ0KDQoJCQlpZiAobiA9PSAnaW5pdCcpIHsNCgkJCQlpZiAodC5kb21Mb2FkZWQpDQoJCQkJCWNiKCk7DQoJCQkJZWxzZQ0KCQkJCQl0LmluaXRzLnB1c2goY2IpOw0KDQoJCQkJcmV0dXJuIGNiOw0KCQkJfQ0KDQoJCQkvLyBTdG9yZSBhd2F5IGxpc3RlbmVyIHJlZmVyZW5jZQ0KCQkJZWwucHVzaCh7DQoJCQkJb2JqIDogbywNCgkJCQluYW1lIDogbiwNCgkJCQlmdW5jIDogZiwNCgkJCQljZnVuYyA6IGNiLA0KCQkJCXNjb3BlIDogcw0KCQkJfSk7DQoNCgkJCXQuX2FkZChvLCBuLCBjYik7DQoNCgkJCXJldHVybiBmOw0KCQl9LA0KDQoJCXJlbW92ZSA6IGZ1bmN0aW9uKG8sIG4sIGYpIHsNCgkJCXZhciB0ID0gdGhpcywgYSA9IHQuZXZlbnRzLCBzID0gZmFsc2UsIHI7DQoNCgkJCS8vIEhhbmRsZSBhcnJheQ0KCQkJaWYgKG8gJiYgby5oYXNPd25Qcm9wZXJ0eSAmJiBvIGluc3RhbmNlb2YgQXJyYXkpIHsNCgkJCQlyID0gW107DQoNCgkJCQllYWNoKG8sIGZ1bmN0aW9uKG8pIHsNCgkJCQkJbyA9IERPTS5nZXQobyk7DQoJCQkJCXIucHVzaCh0LnJlbW92ZShvLCBuLCBmKSk7DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm4gcjsNCgkJCX0NCg0KCQkJbyA9IERPTS5nZXQobyk7DQoNCgkJCWVhY2goYSwgZnVuY3Rpb24oZSwgaSkgew0KCQkJCWlmIChlLm9iaiA9PSBvICYmIGUubmFtZSA9PSBuICYmICghZiB8fCAoZS5mdW5jID09IGYgfHwgZS5jZnVuYyA9PSBmKSkpIHsNCgkJCQkJYS5zcGxpY2UoaSwgMSk7DQoJCQkJCXQuX3JlbW92ZShvLCBuLCBlLmNmdW5jKTsNCgkJCQkJcyA9IHRydWU7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJcmV0dXJuIHM7DQoJCX0sDQoNCgkJY2xlYXIgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGEgPSB0LmV2ZW50cywgaSwgZTsNCg0KCQkJaWYgKG8pIHsNCgkJCQlvID0gRE9NLmdldChvKTsNCg0KCQkJCWZvciAoaSA9IGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJZSA9IGFbaV07DQoNCgkJCQkJaWYgKGUub2JqID09PSBvKSB7DQoJCQkJCQl0Ll9yZW1vdmUoZS5vYmosIGUubmFtZSwgZS5jZnVuYyk7DQoJCQkJCQllLm9iaiA9IGUuY2Z1bmMgPSBudWxsOw0KCQkJCQkJYS5zcGxpY2UoaSwgMSk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkJY2FuY2VsIDogZnVuY3Rpb24oZSkgew0KCQkJaWYgKCFlKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJdGhpcy5zdG9wKGUpOw0KDQoJCQlyZXR1cm4gdGhpcy5wcmV2ZW50KGUpOw0KCQl9LA0KDQoJCXN0b3AgOiBmdW5jdGlvbihlKSB7DQoJCQlpZiAoZS5zdG9wUHJvcGFnYXRpb24pDQoJCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsNCgkJCWVsc2UNCgkJCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfSwNCg0KCQlwcmV2ZW50IDogZnVuY3Rpb24oZSkgew0KCQkJaWYgKGUucHJldmVudERlZmF1bHQpDQoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOw0KCQkJZWxzZQ0KCQkJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJZWFjaCh0LmV2ZW50cywgZnVuY3Rpb24oZSwgaSkgew0KCQkJCXQuX3JlbW92ZShlLm9iaiwgZS5uYW1lLCBlLmNmdW5jKTsNCgkJCQllLm9iaiA9IGUuY2Z1bmMgPSBudWxsOw0KCQkJfSk7DQoNCgkJCXQuZXZlbnRzID0gW107DQoJCQl0ID0gbnVsbDsNCgkJfSwNCg0KCQlfYWRkIDogZnVuY3Rpb24obywgbiwgZikgew0KCQkJaWYgKG8uYXR0YWNoRXZlbnQpDQoJCQkJby5hdHRhY2hFdmVudCgnb24nICsgbiwgZik7DQoJCQllbHNlIGlmIChvLmFkZEV2ZW50TGlzdGVuZXIpDQoJCQkJby5hZGRFdmVudExpc3RlbmVyKG4sIGYsIGZhbHNlKTsNCgkJCWVsc2UNCgkJCQlvWydvbicgKyBuXSA9IGY7DQoJCX0sDQoNCgkJX3JlbW92ZSA6IGZ1bmN0aW9uKG8sIG4sIGYpIHsNCgkJCWlmIChvKSB7DQoJCQkJdHJ5IHsNCgkJCQkJaWYgKG8uZGV0YWNoRXZlbnQpDQoJCQkJCQlvLmRldGFjaEV2ZW50KCdvbicgKyBuLCBmKTsNCgkJCQkJZWxzZSBpZiAoby5yZW1vdmVFdmVudExpc3RlbmVyKQ0KCQkJCQkJby5yZW1vdmVFdmVudExpc3RlbmVyKG4sIGYsIGZhbHNlKTsNCgkJCQkJZWxzZQ0KCQkJCQkJb1snb24nICsgbl0gPSBudWxsOw0KCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCS8vIE1pZ2h0IGZhaWwgd2l0aCBwZXJtaXNzaW9uIGRlbmluZWQgb24gSUUgc28gd2UganVzdCBpZ25vcmUgdGhhdA0KCQkJCX0NCgkJCX0NCgkJfSwNCg0KCQlfcGFnZUluaXQgOiBmdW5jdGlvbih3aW4pIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJLy8gS2VlcCBpdCBmcm9tIHJ1bm5pbmcgbW9yZSB0aGFuIG9uY2UNCgkJCWlmICh0LmRvbUxvYWRlZCkNCgkJCQlyZXR1cm47DQoNCgkJCXQuZG9tTG9hZGVkID0gdHJ1ZTsNCg0KCQkJZWFjaCh0LmluaXRzLCBmdW5jdGlvbihjKSB7DQoJCQkJYygpOw0KCQkJfSk7DQoNCgkJCXQuaW5pdHMgPSBbXTsNCgkJfSwNCg0KCQlfd2FpdCA6IGZ1bmN0aW9uKHdpbikgew0KCQkJdmFyIHQgPSB0aGlzLCBkb2MgPSB3aW4uZG9jdW1lbnQ7DQoNCgkJCS8vIE5vIG5lZWQgc2luY2UgdGhlIGRvY3VtZW50IGlzIGFscmVhZHkgbG9hZGVkDQoJCQlpZiAod2luLnRpbnlNQ0VfR1ogJiYgdGlueU1DRV9HWi5sb2FkZWQpIHsNCgkJCQl0LmRvbUxvYWRlZCA9IDE7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQkvLyBVc2UgSUUgbWV0aG9kDQoJCQlpZiAoZG9jLmF0dGFjaEV2ZW50KSB7DQoJCQkJZG9jLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsNCgkJCQkJaWYgKGRvYy5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiKSB7DQoJCQkJCQlkb2MuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGFyZ3VtZW50cy5jYWxsZWUpOw0KCQkJCQkJdC5fcGFnZUluaXQod2luKTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJaWYgKGRvYy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgJiYgd2luID09IHdpbi50b3ApIHsNCgkJCQkJKGZ1bmN0aW9uKCkgew0KCQkJCQkJaWYgKHQuZG9tTG9hZGVkKQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJdHJ5IHsNCgkJCQkJCQkvLyBJZiBJRSBpcyB1c2VkLCB1c2UgdGhlIHRyaWNrIGJ5IERpZWdvIFBlcmluaQ0KCQkJCQkJCS8vIGh0dHA6Ly9qYXZhc2NyaXB0Lm53Ym94LmNvbS9JRUNvbnRlbnRMb2FkZWQvDQoJCQkJCQkJZG9jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOw0KCQkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCQlzZXRUaW1lb3V0KGFyZ3VtZW50cy5jYWxsZWUsIDApOw0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJdC5fcGFnZUluaXQod2luKTsNCgkJCQkJfSkoKTsNCgkJCQl9DQoJCQl9IGVsc2UgaWYgKGRvYy5hZGRFdmVudExpc3RlbmVyKSB7DQoJCQkJdC5fYWRkKHdpbiwgJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHsNCgkJCQkJdC5fcGFnZUluaXQod2luKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJdC5fYWRkKHdpbiwgJ2xvYWQnLCBmdW5jdGlvbigpIHsNCgkJCQl0Ll9wYWdlSW5pdCh3aW4pOw0KCQkJfSk7DQoJCX0sDQoNCgkJX3N0b3BwZXJzIDogew0KCQkJcHJldmVudERlZmF1bHQgOiAgZnVuY3Rpb24oKSB7DQoJCQkJdGhpcy5yZXR1cm5WYWx1ZSA9IGZhbHNlOw0KCQkJfSwNCg0KCQkJc3RvcFByb3BhZ2F0aW9uIDogZnVuY3Rpb24oKSB7DQoJCQkJdGhpcy5jYW5jZWxCdWJibGUgPSB0cnVlOw0KCQkJfQ0KCQl9DQoJfSk7DQoNCglFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50ID0gbmV3IHRpbnltY2UuZG9tLkV2ZW50VXRpbHMoKTsNCg0KCS8vIERpc3BhdGNoIERPTSBjb250ZW50IGxvYWRlZCBldmVudCBmb3IgSUUgYW5kIFNhZmFyaQ0KCUV2ZW50Ll93YWl0KHdpbmRvdyk7DQoNCgl0aW55bWNlLmFkZFVubG9hZChmdW5jdGlvbigpIHsNCgkJRXZlbnQuZGVzdHJveSgpOw0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdGlueW1jZS5kb20uRWxlbWVudCA9IGZ1bmN0aW9uKGlkLCBzZXR0aW5ncykgew0KCQl2YXIgdCA9IHRoaXMsIGRvbSwgZWw7DQoNCgkJdC5zZXR0aW5ncyA9IHNldHRpbmdzID0gc2V0dGluZ3MgfHwge307DQoJCXQuaWQgPSBpZDsNCgkJdC5kb20gPSBkb20gPSBzZXR0aW5ncy5kb20gfHwgdGlueW1jZS5ET007DQoNCgkJLy8gT25seSBJRSBsZWFrcyBET00gcmVmZXJlbmNlcywgdGhpcyBpcyBhIGxvdCBmYXN0ZXINCgkJaWYgKCF0aW55bWNlLmlzSUUpDQoJCQllbCA9IGRvbS5nZXQodC5pZCk7DQoNCgkJdGlueW1jZS5lYWNoKA0KCQkJCSgnZ2V0UG9zLGdldFJlY3QsZ2V0UGFyZW50LGFkZCxzZXRTdHlsZSxnZXRTdHlsZSxzZXRTdHlsZXMsJyArIA0KCQkJCSdzZXRBdHRyaWIsc2V0QXR0cmlicyxnZXRBdHRyaWIsYWRkQ2xhc3MscmVtb3ZlQ2xhc3MsJyArIA0KCQkJCSdoYXNDbGFzcyxnZXRPdXRlckhUTUwsc2V0T3V0ZXJIVE1MLHJlbW92ZSxzaG93LGhpZGUsJyArIA0KCQkJCSdpc0hpZGRlbixzZXRIVE1MLGdldCcpLnNwbGl0KC8sLykNCgkJCSwgZnVuY3Rpb24oaykgew0KCQkJCXRba10gPSBmdW5jdGlvbigpIHsNCgkJCQkJdmFyIGEgPSBbaWRdLCBpOw0KDQoJCQkJCWZvciAoaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspDQoJCQkJCQlhLnB1c2goYXJndW1lbnRzW2ldKTsNCg0KCQkJCQlhID0gZG9tW2tdLmFwcGx5KGRvbSwgYSk7DQoJCQkJCXQudXBkYXRlKGspOw0KDQoJCQkJCXJldHVybiBhOw0KCQkJCX07DQoJCX0pOw0KDQoJCXRpbnltY2UuZXh0ZW5kKHQsIHsNCgkJCW9uIDogZnVuY3Rpb24obiwgZiwgcykgew0KCQkJCXJldHVybiB0aW55bWNlLmRvbS5FdmVudC5hZGQodC5pZCwgbiwgZiwgcyk7DQoJCQl9LA0KDQoJCQlnZXRYWSA6IGZ1bmN0aW9uKCkgew0KCQkJCXJldHVybiB7DQoJCQkJCXggOiBwYXJzZUludCh0LmdldFN0eWxlKCdsZWZ0JykpLA0KCQkJCQl5IDogcGFyc2VJbnQodC5nZXRTdHlsZSgndG9wJykpDQoJCQkJfTsNCgkJCX0sDQoNCgkJCWdldFNpemUgOiBmdW5jdGlvbigpIHsNCgkJCQl2YXIgbiA9IGRvbS5nZXQodC5pZCk7DQoNCgkJCQlyZXR1cm4gew0KCQkJCQl3IDogcGFyc2VJbnQodC5nZXRTdHlsZSgnd2lkdGgnKSB8fCBuLmNsaWVudFdpZHRoKSwNCgkJCQkJaCA6IHBhcnNlSW50KHQuZ2V0U3R5bGUoJ2hlaWdodCcpIHx8IG4uY2xpZW50SGVpZ2h0KQ0KCQkJCX07DQoJCQl9LA0KDQoJCQltb3ZlVG8gOiBmdW5jdGlvbih4LCB5KSB7DQoJCQkJdC5zZXRTdHlsZXMoe2xlZnQgOiB4LCB0b3AgOiB5fSk7DQoJCQl9LA0KDQoJCQltb3ZlQnkgOiBmdW5jdGlvbih4LCB5KSB7DQoJCQkJdmFyIHAgPSB0LmdldFhZKCk7DQoNCgkJCQl0Lm1vdmVUbyhwLnggKyB4LCBwLnkgKyB5KTsNCgkJCX0sDQoNCgkJCXJlc2l6ZVRvIDogZnVuY3Rpb24odywgaCkgew0KCQkJCXQuc2V0U3R5bGVzKHt3aWR0aCA6IHcsIGhlaWdodCA6IGh9KTsNCgkJCX0sDQoNCgkJCXJlc2l6ZUJ5IDogZnVuY3Rpb24odywgaCkgew0KCQkJCXZhciBzID0gdC5nZXRTaXplKCk7DQoNCgkJCQl0LnJlc2l6ZVRvKHMudyArIHcsIHMuaCArIGgpOw0KCQkJfSwNCg0KCQkJdXBkYXRlIDogZnVuY3Rpb24oaykgew0KCQkJCXZhciBiOw0KDQoJCQkJaWYgKHRpbnltY2UuaXNJRTYgJiYgc2V0dGluZ3MuYmxvY2tlcikgew0KCQkJCQlrID0gayB8fCAnJzsNCg0KCQkJCQkvLyBJZ25vcmUgZ2V0dGVycw0KCQkJCQlpZiAoay5pbmRleE9mKCdnZXQnKSA9PT0gMCB8fCBrLmluZGV4T2YoJ2hhcycpID09PSAwIHx8IGsuaW5kZXhPZignaXMnKSA9PT0gMCkNCgkJCQkJCXJldHVybjsNCg0KCQkJCQkvLyBSZW1vdmUgYmxvY2tlciBvbiByZW1vdmUNCgkJCQkJaWYgKGsgPT0gJ3JlbW92ZScpIHsNCgkJCQkJCWRvbS5yZW1vdmUodC5ibG9ja2VyKTsNCgkJCQkJCXJldHVybjsNCgkJCQkJfQ0KDQoJCQkJCWlmICghdC5ibG9ja2VyKSB7DQoJCQkJCQl0LmJsb2NrZXIgPSBkb20udW5pcXVlSWQoKTsNCgkJCQkJCWIgPSBkb20uYWRkKHNldHRpbmdzLmNvbnRhaW5lciB8fCBkb20uZ2V0Um9vdCgpLCAnaWZyYW1lJywge2lkIDogdC5ibG9ja2VyLCBzdHlsZSA6ICdwb3NpdGlvbjphYnNvbHV0ZTsnLCBmcmFtZUJvcmRlciA6IDAsIHNyYyA6ICdqYXZhc2NyaXB0OiIiJ30pOw0KCQkJCQkJZG9tLnNldFN0eWxlKGIsICdvcGFjaXR5JywgMCk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJYiA9IGRvbS5nZXQodC5ibG9ja2VyKTsNCg0KCQkJCQlkb20uc2V0U3R5bGVzKGIsIHsNCgkJCQkJCWxlZnQgOiB0LmdldFN0eWxlKCdsZWZ0JywgMSksDQoJCQkJCQl0b3AgOiB0LmdldFN0eWxlKCd0b3AnLCAxKSwNCgkJCQkJCXdpZHRoIDogdC5nZXRTdHlsZSgnd2lkdGgnLCAxKSwNCgkJCQkJCWhlaWdodCA6IHQuZ2V0U3R5bGUoJ2hlaWdodCcsIDEpLA0KCQkJCQkJZGlzcGxheSA6IHQuZ2V0U3R5bGUoJ2Rpc3BsYXknLCAxKSwNCgkJCQkJCXpJbmRleCA6IHBhcnNlSW50KHQuZ2V0U3R5bGUoJ3pJbmRleCcsIDEpIHx8IDApIC0gMQ0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9DQoJCX0pOw0KCX07DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCglmdW5jdGlvbiB0cmltTmwocykgew0KCQlyZXR1cm4gcy5yZXBsYWNlKC9bXG5ccl0rL2csICcnKTsNCgl9Ow0KDQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBpcyA9IHRpbnltY2UuaXMsIGlzSUUgPSB0aW55bWNlLmlzSUUsIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5kb20uU2VsZWN0aW9uJywgew0KCQlTZWxlY3Rpb24gOiBmdW5jdGlvbihkb20sIHdpbiwgc2VyaWFsaXplcikgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmRvbSA9IGRvbTsNCgkJCXQud2luID0gd2luOw0KCQkJdC5zZXJpYWxpemVyID0gc2VyaWFsaXplcjsNCg0KCQkJLy8gQWRkIGV2ZW50cw0KCQkJZWFjaChbDQoJCQkJJ29uQmVmb3JlU2V0Q29udGVudCcsDQoJCQkJJ29uQmVmb3JlR2V0Q29udGVudCcsDQoJCQkJJ29uU2V0Q29udGVudCcsDQoJCQkJJ29uR2V0Q29udGVudCcNCgkJCV0sIGZ1bmN0aW9uKGUpIHsNCgkJCQl0W2VdID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHQpOw0KCQkJfSk7DQoNCgkJCS8vIE5vIFczQyBSYW5nZSBzdXBwb3J0DQoJCQlpZiAoIXQud2luLmdldFNlbGVjdGlvbikNCgkJCQl0LnRyaWRlbnRTZWwgPSBuZXcgdGlueW1jZS5kb20uVHJpZGVudFNlbGVjdGlvbih0KTsNCg0KCQkJaWYgKHRpbnltY2UuaXNJRSAmJiBkb20uYm94TW9kZWwpDQoJCQkJdGhpcy5fZml4SUVTZWxlY3Rpb24oKTsNCg0KCQkJLy8gUHJldmVudCBsZWFrcw0KCQkJdGlueW1jZS5hZGRVbmxvYWQodC5kZXN0cm95LCB0KTsNCgkJfSwNCg0KCQlnZXRDb250ZW50IDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzLCByID0gdC5nZXRSbmcoKSwgZSA9IHQuZG9tLmNyZWF0ZSgiYm9keSIpLCBzZSA9IHQuZ2V0U2VsKCksIHdiLCB3YSwgbjsNCg0KCQkJcyA9IHMgfHwge307DQoJCQl3YiA9IHdhID0gJyc7DQoJCQlzLmdldCA9IHRydWU7DQoJCQlzLmZvcm1hdCA9IHMuZm9ybWF0IHx8ICdodG1sJzsNCgkJCXQub25CZWZvcmVHZXRDb250ZW50LmRpc3BhdGNoKHQsIHMpOw0KDQoJCQlpZiAocy5mb3JtYXQgPT0gJ3RleHQnKQ0KCQkJCXJldHVybiB0LmlzQ29sbGFwc2VkKCkgPyAnJyA6IChyLnRleHQgfHwgKHNlLnRvU3RyaW5nID8gc2UudG9TdHJpbmcoKSA6ICcnKSk7DQoNCgkJCWlmIChyLmNsb25lQ29udGVudHMpIHsNCgkJCQluID0gci5jbG9uZUNvbnRlbnRzKCk7DQoNCgkJCQlpZiAobikNCgkJCQkJZS5hcHBlbmRDaGlsZChuKTsNCgkJCX0gZWxzZSBpZiAoaXMoci5pdGVtKSB8fCBpcyhyLmh0bWxUZXh0KSkNCgkJCQllLmlubmVySFRNTCA9IHIuaXRlbSA/IHIuaXRlbSgwKS5vdXRlckhUTUwgOiByLmh0bWxUZXh0Ow0KCQkJZWxzZQ0KCQkJCWUuaW5uZXJIVE1MID0gci50b1N0cmluZygpOw0KDQoJCQkvLyBLZWVwIHdoaXRlc3BhY2UgYmVmb3JlIGFuZCBhZnRlcg0KCQkJaWYgKC9eXHMvLnRlc3QoZS5pbm5lckhUTUwpKQ0KCQkJCXdiID0gJyAnOw0KDQoJCQlpZiAoL1xzKyQvLnRlc3QoZS5pbm5lckhUTUwpKQ0KCQkJCXdhID0gJyAnOw0KDQoJCQlzLmdldElubmVyID0gdHJ1ZTsNCg0KCQkJcy5jb250ZW50ID0gdC5pc0NvbGxhcHNlZCgpID8gJycgOiB3YiArIHQuc2VyaWFsaXplci5zZXJpYWxpemUoZSwgcykgKyB3YTsNCgkJCXQub25HZXRDb250ZW50LmRpc3BhdGNoKHQsIHMpOw0KDQoJCQlyZXR1cm4gcy5jb250ZW50Ow0KCQl9LA0KDQoJCXNldENvbnRlbnQgOiBmdW5jdGlvbihoLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHIgPSB0LmdldFJuZygpLCBjLCBkID0gdC53aW4uZG9jdW1lbnQ7DQoNCgkJCXMgPSBzIHx8IHtmb3JtYXQgOiAnaHRtbCd9Ow0KCQkJcy5zZXQgPSB0cnVlOw0KCQkJaCA9IHMuY29udGVudCA9IHQuZG9tLnByb2Nlc3NIVE1MKGgpOw0KDQoJCQkvLyBEaXNwYXRjaCBiZWZvcmUgc2V0IGNvbnRlbnQgZXZlbnQNCgkJCXQub25CZWZvcmVTZXRDb250ZW50LmRpc3BhdGNoKHQsIHMpOw0KCQkJaCA9IHMuY29udGVudDsNCg0KCQkJaWYgKHIuaW5zZXJ0Tm9kZSkgew0KCQkJCS8vIE1ha2UgY2FyZXQgbWFya2VyIHNpbmNlIGluc2VydE5vZGUgcGxhY2VzIHRoZSBjYXJldCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRleHQgYWZ0ZXIgaW5zZXJ0DQoJCQkJaCArPSAnPHNwYW4gaWQ9Il9fY2FyZXQiPl88L3NwYW4+JzsNCg0KCQkJCS8vIERlbGV0ZSBhbmQgaW5zZXJ0IG5ldyBub2RlDQoJCQkJDQoJCQkJaWYgKHIuc3RhcnRDb250YWluZXIgPT0gZCAmJiByLmVuZENvbnRhaW5lciA9PSAgZCkgew0KCQkJCQkvLyBXZWJLaXQgd2lsbCBmYWlsIGlmIHRoZSBib2R5IGlzIGVtcHR5IHNpbmNlIHRoZSByYW5nZSBpcyB0aGVuIGludmFsaWQgYW5kIGl0IGNhbid0IGluc2VydCBjb250ZW50cw0KCQkJCQlkLmJvZHkuaW5uZXJIVE1MID0gaDsNCgkJCQl9IGVsc2Ugew0KCQkJCQlyLmRlbGV0ZUNvbnRlbnRzKCk7DQoJCQkJCWlmIChkLmJvZHkuY2hpbGROb2Rlcy5sZW5ndGggPT0gMCkgew0KCQkJCQkJZC5ib2R5LmlubmVySFRNTCA9IGg7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkvLyBjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQgZG9lc24ndCBleGlzdHMgaW4gSUUgOSBET01SYW5nZXMNCgkJCQkJCWlmIChyLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCkgew0KCQkJCQkJCXIuaW5zZXJ0Tm9kZShyLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChoKSk7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCS8vIEZha2UgY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IGNhbGwgaW4gSUUgOQ0KCQkJCQkJCXZhciBmcmFnID0gZC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksIHRlbXAgPSBkLmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KDQoJCQkJCQkJZnJhZy5hcHBlbmRDaGlsZCh0ZW1wKTsNCgkJCQkJCQl0ZW1wLm91dGVySFRNTCA9IGg7DQoNCgkJCQkJCQlyLmluc2VydE5vZGUoZnJhZyk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBNb3ZlIHRvIGNhcmV0IG1hcmtlcg0KCQkJCWMgPSB0LmRvbS5nZXQoJ19fY2FyZXQnKTsNCgkJCQkvLyBNYWtlIHN1cmUgd2Ugd3JhcCBpdCBjb21wbGVhdGx5LCBPcGVyYSBmYWlscyB3aXRoIGEgc2ltcGxlIHNlbGVjdCBjYWxsDQoJCQkJciA9IGQuY3JlYXRlUmFuZ2UoKTsNCgkJCQlyLnNldFN0YXJ0QmVmb3JlKGMpOw0KCQkJCXIuc2V0RW5kQmVmb3JlKGMpOw0KCQkJCXQuc2V0Um5nKHIpOw0KDQoJCQkJLy8gUmVtb3ZlIHRoZSBjYXJldCBwb3NpdGlvbg0KCQkJCXQuZG9tLnJlbW92ZSgnX19jYXJldCcpOw0KCQkJfSBlbHNlIHsNCgkJCQlpZiAoci5pdGVtKSB7DQoJCQkJCS8vIERlbGV0ZSBjb250ZW50IGFuZCBnZXQgY2FyZXQgdGV4dCBzZWxlY3Rpb24NCgkJCQkJZC5leGVjQ29tbWFuZCgnRGVsZXRlJywgZmFsc2UsIG51bGwpOw0KCQkJCQlyID0gdC5nZXRSbmcoKTsNCgkJCQl9DQoNCgkJCQlyLnBhc3RlSFRNTChoKTsNCgkJCX0NCg0KCQkJLy8gRGlzcGF0Y2ggc2V0IGNvbnRlbnQgZXZlbnQNCgkJCXQub25TZXRDb250ZW50LmRpc3BhdGNoKHQsIHMpOw0KCQl9LA0KDQoJCWdldFN0YXJ0IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgcm5nID0gdGhpcy5nZXRSbmcoKSwgc3RhcnRFbGVtZW50LCBwYXJlbnRFbGVtZW50LCBjaGVja1JuZywgbm9kZTsNCg0KCQkJaWYgKHJuZy5kdXBsaWNhdGUgfHwgcm5nLml0ZW0pIHsNCgkJCQkvLyBDb250cm9sIHNlbGVjdGlvbiwgcmV0dXJuIGZpcnN0IGl0ZW0NCgkJCQlpZiAocm5nLml0ZW0pDQoJCQkJCXJldHVybiBybmcuaXRlbSgwKTsNCg0KCQkJCS8vIEdldCBzdGFydCBlbGVtZW50DQoJCQkJY2hlY2tSbmcgPSBybmcuZHVwbGljYXRlKCk7DQoJCQkJY2hlY2tSbmcuY29sbGFwc2UoMSk7DQoJCQkJc3RhcnRFbGVtZW50ID0gY2hlY2tSbmcucGFyZW50RWxlbWVudCgpOw0KDQoJCQkJLy8gQ2hlY2sgaWYgcmFuZ2UgcGFyZW50IGlzIGluc2lkZSB0aGUgc3RhcnQgZWxlbWVudCwgdGhlbiByZXR1cm4gdGhlIGlubmVyIHBhcmVudCBlbGVtZW50DQoJCQkJLy8gVGhpcyB3aWxsIGZpeCBpc3N1ZXMgd2hlbiBhIHNpbmdsZSBlbGVtZW50IGlzIHNlbGVjdGVkLCBJRSB3b3VsZCBvdGhlcndpc2UgcmV0dXJuIHRoZSB3cm9uZyBzdGFydCBlbGVtZW50DQoJCQkJcGFyZW50RWxlbWVudCA9IG5vZGUgPSBybmcucGFyZW50RWxlbWVudCgpOw0KCQkJCXdoaWxlIChub2RlID0gbm9kZS5wYXJlbnROb2RlKSB7DQoJCQkJCWlmIChub2RlID09IHN0YXJ0RWxlbWVudCkgew0KCQkJCQkJc3RhcnRFbGVtZW50ID0gcGFyZW50RWxlbWVudDsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gSWYgc3RhcnQgZWxlbWVudCBpcyBib2R5IGVsZW1lbnQgdHJ5IHRvIG1vdmUgdG8gdGhlIGZpcnN0IGNoaWxkIGlmIGl0IGV4aXN0cw0KCQkJCWlmIChzdGFydEVsZW1lbnQgJiYgc3RhcnRFbGVtZW50Lm5vZGVOYW1lID09ICdCT0RZJykNCgkJCQkJcmV0dXJuIHN0YXJ0RWxlbWVudC5maXJzdENoaWxkIHx8IHN0YXJ0RWxlbWVudDsNCg0KCQkJCXJldHVybiBzdGFydEVsZW1lbnQ7DQoJCQl9IGVsc2Ugew0KCQkJCXN0YXJ0RWxlbWVudCA9IHJuZy5zdGFydENvbnRhaW5lcjsNCg0KCQkJCWlmIChzdGFydEVsZW1lbnQubm9kZVR5cGUgPT0gMSAmJiBzdGFydEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCQlzdGFydEVsZW1lbnQgPSBzdGFydEVsZW1lbnQuY2hpbGROb2Rlc1tNYXRoLm1pbihzdGFydEVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggLSAxLCBybmcuc3RhcnRPZmZzZXQpXTsNCg0KCQkJCWlmIChzdGFydEVsZW1lbnQgJiYgc3RhcnRFbGVtZW50Lm5vZGVUeXBlID09IDMpDQoJCQkJCXJldHVybiBzdGFydEVsZW1lbnQucGFyZW50Tm9kZTsNCg0KCQkJCXJldHVybiBzdGFydEVsZW1lbnQ7DQoJCQl9DQoJCX0sDQoNCgkJZ2V0RW5kIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHIgPSB0LmdldFJuZygpLCBlLCBlbzsNCg0KCQkJaWYgKHIuZHVwbGljYXRlIHx8IHIuaXRlbSkgew0KCQkJCWlmIChyLml0ZW0pDQoJCQkJCXJldHVybiByLml0ZW0oMCk7DQoNCgkJCQlyID0gci5kdXBsaWNhdGUoKTsNCgkJCQlyLmNvbGxhcHNlKDApOw0KCQkJCWUgPSByLnBhcmVudEVsZW1lbnQoKTsNCg0KCQkJCWlmIChlICYmIGUubm9kZU5hbWUgPT0gJ0JPRFknKQ0KCQkJCQlyZXR1cm4gZS5sYXN0Q2hpbGQgfHwgZTsNCg0KCQkJCXJldHVybiBlOw0KCQkJfSBlbHNlIHsNCgkJCQllID0gci5lbmRDb250YWluZXI7DQoJCQkJZW8gPSByLmVuZE9mZnNldDsNCg0KCQkJCWlmIChlLm5vZGVUeXBlID09IDEgJiYgZS5oYXNDaGlsZE5vZGVzKCkpDQoJCQkJCWUgPSBlLmNoaWxkTm9kZXNbZW8gPiAwID8gZW8gLSAxIDogZW9dOw0KDQoJCQkJaWYgKGUgJiYgZS5ub2RlVHlwZSA9PSAzKQ0KCQkJCQlyZXR1cm4gZS5wYXJlbnROb2RlOw0KDQoJCQkJcmV0dXJuIGU7DQoJCQl9DQoJCX0sDQoNCgkJZ2V0Qm9va21hcmsgOiBmdW5jdGlvbih0eXBlLCBub3JtYWxpemVkKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGRvbSA9IHQuZG9tLCBybmcsIHJuZzIsIGlkLCBjb2xsYXBzZWQsIG5hbWUsIGVsZW1lbnQsIGluZGV4LCBjaHIgPSAnXHVGRUZGJywgc3R5bGVzOw0KDQoJCQlmdW5jdGlvbiBmaW5kSW5kZXgobmFtZSwgZWxlbWVudCkgew0KCQkJCXZhciBpbmRleCA9IDA7DQoNCgkJCQllYWNoKGRvbS5zZWxlY3QobmFtZSksIGZ1bmN0aW9uKG5vZGUsIGkpIHsNCgkJCQkJaWYgKG5vZGUgPT0gZWxlbWVudCkNCgkJCQkJCWluZGV4ID0gaTsNCgkJCQl9KTsNCg0KCQkJCXJldHVybiBpbmRleDsNCgkJCX07DQoNCgkJCWlmICh0eXBlID09IDIpIHsNCgkJCQlmdW5jdGlvbiBnZXRMb2NhdGlvbigpIHsNCgkJCQkJdmFyIHJuZyA9IHQuZ2V0Um5nKHRydWUpLCByb290ID0gZG9tLmdldFJvb3QoKSwgYm9va21hcmsgPSB7fTsNCg0KCQkJCQlmdW5jdGlvbiBnZXRQb2ludChybmcsIHN0YXJ0KSB7DQoJCQkJCQl2YXIgY29udGFpbmVyID0gcm5nW3N0YXJ0ID8gJ3N0YXJ0Q29udGFpbmVyJyA6ICdlbmRDb250YWluZXInXSwNCgkJCQkJCQlvZmZzZXQgPSBybmdbc3RhcnQgPyAnc3RhcnRPZmZzZXQnIDogJ2VuZE9mZnNldCddLCBwb2ludCA9IFtdLCBub2RlLCBjaGlsZE5vZGVzLCBhZnRlciA9IDA7DQoNCgkJCQkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMykgew0KCQkJCQkJCWlmIChub3JtYWxpemVkKSB7DQoJCQkJCQkJCWZvciAobm9kZSA9IGNvbnRhaW5lci5wcmV2aW91c1NpYmxpbmc7IG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PSAzOyBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpDQoJCQkJCQkJCQlvZmZzZXQgKz0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoOw0KCQkJCQkJCX0NCg0KCQkJCQkJCXBvaW50LnB1c2gob2Zmc2V0KTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJY2hpbGROb2RlcyA9IGNvbnRhaW5lci5jaGlsZE5vZGVzOw0KDQoJCQkJCQkJaWYgKG9mZnNldCA+PSBjaGlsZE5vZGVzLmxlbmd0aCAmJiBjaGlsZE5vZGVzLmxlbmd0aCkgew0KCQkJCQkJCQlhZnRlciA9IDE7DQoJCQkJCQkJCW9mZnNldCA9IE1hdGgubWF4KDAsIGNoaWxkTm9kZXMubGVuZ3RoIC0gMSk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJcG9pbnQucHVzaCh0LmRvbS5ub2RlSW5kZXgoY2hpbGROb2Rlc1tvZmZzZXRdLCBub3JtYWxpemVkKSArIGFmdGVyKTsNCgkJCQkJCX0NCg0KCQkJCQkJZm9yICg7IGNvbnRhaW5lciAmJiBjb250YWluZXIgIT0gcm9vdDsgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGUpDQoJCQkJCQkJcG9pbnQucHVzaCh0LmRvbS5ub2RlSW5kZXgoY29udGFpbmVyLCBub3JtYWxpemVkKSk7DQoNCgkJCQkJCXJldHVybiBwb2ludDsNCgkJCQkJfTsNCg0KCQkJCQlib29rbWFyay5zdGFydCA9IGdldFBvaW50KHJuZywgdHJ1ZSk7DQoNCgkJCQkJaWYgKCF0LmlzQ29sbGFwc2VkKCkpDQoJCQkJCQlib29rbWFyay5lbmQgPSBnZXRQb2ludChybmcpOw0KDQoJCQkJCXJldHVybiBib29rbWFyazsNCgkJCQl9Ow0KDQoJCQkJcmV0dXJuIGdldExvY2F0aW9uKCk7DQoJCQl9DQoNCgkJCS8vIEhhbmRsZSBzaW1wbGUgcmFuZ2UNCgkJCWlmICh0eXBlKQ0KCQkJCXJldHVybiB7cm5nIDogdC5nZXRSbmcoKX07DQoNCgkJCXJuZyA9IHQuZ2V0Um5nKCk7DQoJCQlpZCA9IGRvbS51bmlxdWVJZCgpOw0KCQkJY29sbGFwc2VkID0gdGlueU1DRS5hY3RpdmVFZGl0b3Iuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCk7DQoJCQlzdHlsZXMgPSAnb3ZlcmZsb3c6aGlkZGVuO2xpbmUtaGVpZ2h0OjBweCc7DQoNCgkJCS8vIEV4cGxvcmVyIG1ldGhvZA0KCQkJaWYgKHJuZy5kdXBsaWNhdGUgfHwgcm5nLml0ZW0pIHsNCgkJCQkvLyBUZXh0IHNlbGVjdGlvbg0KCQkJCWlmICghcm5nLml0ZW0pIHsNCgkJCQkJcm5nMiA9IHJuZy5kdXBsaWNhdGUoKTsNCg0KCQkJCQkvLyBJbnNlcnQgc3RhcnQgbWFya2VyDQoJCQkJCXJuZy5jb2xsYXBzZSgpOw0KCQkJCQlybmcucGFzdGVIVE1MKCc8c3BhbiBfbWNlX3R5cGU9ImJvb2ttYXJrIiBpZD0iJyArIGlkICsgJ19zdGFydCIgc3R5bGU9IicgKyBzdHlsZXMgKyAnIj4nICsgY2hyICsgJzwvc3Bhbj4nKTsNCg0KCQkJCQkvLyBJbnNlcnQgZW5kIG1hcmtlcg0KCQkJCQlpZiAoIWNvbGxhcHNlZCkgew0KCQkJCQkJcm5nMi5jb2xsYXBzZShmYWxzZSk7DQoJCQkJCQlybmcyLnBhc3RlSFRNTCgnPHNwYW4gX21jZV90eXBlPSJib29rbWFyayIgaWQ9IicgKyBpZCArICdfZW5kIiBzdHlsZT0iJyArIHN0eWxlcyArICciPicgKyBjaHIgKyAnPC9zcGFuPicpOw0KCQkJCQl9DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gQ29udHJvbCBzZWxlY3Rpb24NCgkJCQkJZWxlbWVudCA9IHJuZy5pdGVtKDApOw0KCQkJCQluYW1lID0gZWxlbWVudC5ub2RlTmFtZTsNCg0KCQkJCQlyZXR1cm4ge25hbWUgOiBuYW1lLCBpbmRleCA6IGZpbmRJbmRleChuYW1lLCBlbGVtZW50KX07DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQllbGVtZW50ID0gdC5nZXROb2RlKCk7DQoJCQkJbmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7DQoJCQkJaWYgKG5hbWUgPT0gJ0lNRycpDQoJCQkJCXJldHVybiB7bmFtZSA6IG5hbWUsIGluZGV4IDogZmluZEluZGV4KG5hbWUsIGVsZW1lbnQpfTsNCg0KCQkJCS8vIFczQyBtZXRob2QNCgkJCQlybmcyID0gcm5nLmNsb25lUmFuZ2UoKTsNCg0KCQkJCS8vIEluc2VydCBlbmQgbWFya2VyDQoJCQkJaWYgKCFjb2xsYXBzZWQpIHsNCgkJCQkJcm5nMi5jb2xsYXBzZShmYWxzZSk7DQoJCQkJCXJuZzIuaW5zZXJ0Tm9kZShkb20uY3JlYXRlKCdzcGFuJywge19tY2VfdHlwZSA6ICJib29rbWFyayIsIGlkIDogaWQgKyAnX2VuZCcsIHN0eWxlIDogc3R5bGVzfSwgY2hyKSk7DQoJCQkJfQ0KDQoJCQkJcm5nLmNvbGxhcHNlKHRydWUpOw0KCQkJCXJuZy5pbnNlcnROb2RlKGRvbS5jcmVhdGUoJ3NwYW4nLCB7X21jZV90eXBlIDogImJvb2ttYXJrIiwgaWQgOiBpZCArICdfc3RhcnQnLCBzdHlsZSA6IHN0eWxlc30sIGNocikpOw0KCQkJfQ0KDQoJCQl0Lm1vdmVUb0Jvb2ttYXJrKHtpZCA6IGlkLCBrZWVwIDogMX0pOw0KDQoJCQlyZXR1cm4ge2lkIDogaWR9Ow0KCQl9LA0KDQoJCW1vdmVUb0Jvb2ttYXJrIDogZnVuY3Rpb24oYm9va21hcmspIHsNCgkJCXZhciB0ID0gdGhpcywgZG9tID0gdC5kb20sIG1hcmtlcjEsIG1hcmtlcjIsIHJuZywgcm9vdCwgc3RhcnRDb250YWluZXIsIGVuZENvbnRhaW5lciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsNCg0KCQkJLy8gQ2xlYXIgc2VsZWN0aW9uIGNhY2hlDQoJCQlpZiAodC50cmlkZW50U2VsKQ0KCQkJCXQudHJpZGVudFNlbC5kZXN0cm95KCk7DQoNCgkJCWlmIChib29rbWFyaykgew0KCQkJCWlmIChib29rbWFyay5zdGFydCkgew0KCQkJCQlybmcgPSBkb20uY3JlYXRlUm5nKCk7DQoJCQkJCXJvb3QgPSBkb20uZ2V0Um9vdCgpOw0KDQoJCQkJCWZ1bmN0aW9uIHNldEVuZFBvaW50KHN0YXJ0KSB7DQoJCQkJCQl2YXIgcG9pbnQgPSBib29rbWFya1tzdGFydCA/ICdzdGFydCcgOiAnZW5kJ10sIGksIG5vZGUsIG9mZnNldCwgY2hpbGRyZW47DQoNCgkJCQkJCWlmIChwb2ludCkgew0KCQkJCQkJCS8vIEZpbmQgY29udGFpbmVyIG5vZGUNCgkJCQkJCQlmb3IgKG5vZGUgPSByb290LCBpID0gcG9pbnQubGVuZ3RoIC0gMTsgaSA+PSAxOyBpLS0pIHsNCgkJCQkJCQkJY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7DQoNCgkJCQkJCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCkNCgkJCQkJCQkJCW5vZGUgPSBjaGlsZHJlbltwb2ludFtpXV07DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gU2V0IG9mZnNldCB3aXRoaW4gY29udGFpbmVyIG5vZGUNCgkJCQkJCQlpZiAoc3RhcnQpDQoJCQkJCQkJCXJuZy5zZXRTdGFydChub2RlLCBwb2ludFswXSk7DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCQlybmcuc2V0RW5kKG5vZGUsIHBvaW50WzBdKTsNCgkJCQkJCX0NCgkJCQkJfTsNCg0KCQkJCQlzZXRFbmRQb2ludCh0cnVlKTsNCgkJCQkJc2V0RW5kUG9pbnQoKTsNCg0KCQkJCQl0LnNldFJuZyhybmcpOw0KCQkJCX0gZWxzZSBpZiAoYm9va21hcmsuaWQpIHsNCgkJCQkJZnVuY3Rpb24gcmVzdG9yZUVuZFBvaW50KHN1ZmZpeCkgew0KCQkJCQkJdmFyIG1hcmtlciA9IGRvbS5nZXQoYm9va21hcmsuaWQgKyAnXycgKyBzdWZmaXgpLCBub2RlLCBpZHgsIG5leHQsIHByZXYsIGtlZXAgPSBib29rbWFyay5rZWVwOw0KDQoJCQkJCQlpZiAobWFya2VyKSB7DQoJCQkJCQkJbm9kZSA9IG1hcmtlci5wYXJlbnROb2RlOw0KDQoJCQkJCQkJaWYgKHN1ZmZpeCA9PSAnc3RhcnQnKSB7DQoJCQkJCQkJCWlmICgha2VlcCkgew0KCQkJCQkJCQkJaWR4ID0gZG9tLm5vZGVJbmRleChtYXJrZXIpOw0KCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJbm9kZSA9IG1hcmtlci5maXJzdENoaWxkOw0KCQkJCQkJCQkJaWR4ID0gMTsNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCXN0YXJ0Q29udGFpbmVyID0gZW5kQ29udGFpbmVyID0gbm9kZTsNCgkJCQkJCQkJc3RhcnRPZmZzZXQgPSBlbmRPZmZzZXQgPSBpZHg7DQoJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJaWYgKCFrZWVwKSB7DQoJCQkJCQkJCQlpZHggPSBkb20ubm9kZUluZGV4KG1hcmtlcik7DQoJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQlub2RlID0gbWFya2VyLmZpcnN0Q2hpbGQ7DQoJCQkJCQkJCQlpZHggPSAxOw0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJZW5kQ29udGFpbmVyID0gbm9kZTsNCgkJCQkJCQkJZW5kT2Zmc2V0ID0gaWR4Ow0KCQkJCQkJCX0NCg0KCQkJCQkJCWlmICgha2VlcCkgew0KCQkJCQkJCQlwcmV2ID0gbWFya2VyLnByZXZpb3VzU2libGluZzsNCgkJCQkJCQkJbmV4dCA9IG1hcmtlci5uZXh0U2libGluZzsNCg0KCQkJCQkJCQkvLyBSZW1vdmUgYWxsIG1hcmtlciB0ZXh0IG5vZGVzDQoJCQkJCQkJCWVhY2godGlueW1jZS5ncmVwKG1hcmtlci5jaGlsZE5vZGVzKSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMykNCgkJCQkJCQkJCQlub2RlLm5vZGVWYWx1ZSA9IG5vZGUubm9kZVZhbHVlLnJlcGxhY2UoL1x1RkVGRi9nLCAnJyk7DQoJCQkJCQkJCX0pOw0KDQoJCQkJCQkJCS8vIFJlbW92ZSBtYXJrZXIgYnV0IGtlZXAgY2hpbGRyZW4gaWYgZm9yIGV4YW1wbGUgY29udGVudHMgd2hlcmUgaW5zZXJ0ZWQgaW50byB0aGUgbWFya2VyDQoJCQkJCQkJCS8vIEFsc28gcmVtb3ZlIGR1cGxpY2F0ZWQgaW5zdGFuY2VzIG9mIHRoZSBtYXJrZXIgZm9yIGV4YW1wbGUgYnkgYSBzcGxpdCBvcGVyYXRpb24gb3IgYnkgV2ViS2l0IGF1dG8gc3BsaXQgb24gcGFzdGUgZmVhdHVyZQ0KCQkJCQkJCQl3aGlsZSAobWFya2VyID0gZG9tLmdldChib29rbWFyay5pZCArICdfJyArIHN1ZmZpeCkpDQoJCQkJCQkJCQlkb20ucmVtb3ZlKG1hcmtlciwgMSk7DQoNCgkJCQkJCQkJLy8gSWYgc2libGluZ3MgYXJlIHRleHQgbm9kZXMgdGhlbiBtZXJnZSB0aGVtIHVubGVzcyBpdCdzIE9wZXJhIHNpbmNlIGl0IHNvbWUgaG93IHJlbW92ZXMgdGhlIG5vZGUNCgkJCQkJCQkJLy8gYW5kIHdlIGFyZSBzbmlmZmluZyBzaW5jZSBhZGRpbmcgYSBsb3Qgb2YgZGV0ZWN0aW9uIGNvZGUgZm9yIGEgYnJvd3NlciB3aXRoIDMlIG9mIHRoZSBtYXJrZXQgaXNuJ3Qgd29ydGggdGhlIGVmZm9ydC4gU29ycnksIE9wZXJhIGJ1dCBpdCdzIGp1c3QgYSBmYWN0DQoJCQkJCQkJCWlmIChwcmV2ICYmIG5leHQgJiYgcHJldi5ub2RlVHlwZSA9PSBuZXh0Lm5vZGVUeXBlICYmIHByZXYubm9kZVR5cGUgPT0gMyAmJiAhdGlueW1jZS5pc09wZXJhKSB7DQoJCQkJCQkJCQlpZHggPSBwcmV2Lm5vZGVWYWx1ZS5sZW5ndGg7DQoJCQkJCQkJCQlwcmV2LmFwcGVuZERhdGEobmV4dC5ub2RlVmFsdWUpOw0KCQkJCQkJCQkJZG9tLnJlbW92ZShuZXh0KTsNCg0KCQkJCQkJCQkJaWYgKHN1ZmZpeCA9PSAnc3RhcnQnKSB7DQoJCQkJCQkJCQkJc3RhcnRDb250YWluZXIgPSBlbmRDb250YWluZXIgPSBwcmV2Ow0KCQkJCQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0ID0gaWR4Ow0KCQkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCQllbmRDb250YWluZXIgPSBwcmV2Ow0KCQkJCQkJCQkJCWVuZE9mZnNldCA9IGlkeDsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfTsNCg0KCQkJCQlmdW5jdGlvbiBhZGRCb2d1cyhub2RlKSB7DQoJCQkJCQkvLyBBZGRzIGEgYm9ndXMgQlIgZWxlbWVudCBmb3IgZW1wdHkgYmxvY2sgZWxlbWVudHMNCgkJCQkJCS8vIG9uIG5vbiBJRSBicm93c2VycyBqdXN0IHRvIGhhdmUgYSBwbGFjZSB0byBwdXQgdGhlIGNhcmV0DQoJCQkJCQlpZiAoIWlzSUUgJiYgZG9tLmlzQmxvY2sobm9kZSkgJiYgIW5vZGUuaW5uZXJIVE1MKQ0KCQkJCQkJCW5vZGUuaW5uZXJIVE1MID0gJzxiciBfbWNlX2JvZ3VzPSIxIiAvPic7DQoNCgkJCQkJCXJldHVybiBub2RlOw0KCQkJCQl9Ow0KDQoJCQkJCS8vIFJlc3RvcmUgc3RhcnQvZW5kIHBvaW50cw0KCQkJCQlyZXN0b3JlRW5kUG9pbnQoJ3N0YXJ0Jyk7DQoJCQkJCXJlc3RvcmVFbmRQb2ludCgnZW5kJyk7DQoNCgkJCQkJaWYgKHN0YXJ0Q29udGFpbmVyKSB7DQoJCQkJCQlybmcgPSBkb20uY3JlYXRlUm5nKCk7DQoJCQkJCQlybmcuc2V0U3RhcnQoYWRkQm9ndXMoc3RhcnRDb250YWluZXIpLCBzdGFydE9mZnNldCk7DQoJCQkJCQlybmcuc2V0RW5kKGFkZEJvZ3VzKGVuZENvbnRhaW5lciksIGVuZE9mZnNldCk7DQoJCQkJCQl0LnNldFJuZyhybmcpOw0KCQkJCQl9DQoJCQkJfSBlbHNlIGlmIChib29rbWFyay5uYW1lKSB7DQoJCQkJCXQuc2VsZWN0KGRvbS5zZWxlY3QoYm9va21hcmsubmFtZSlbYm9va21hcmsuaW5kZXhdKTsNCgkJCQl9IGVsc2UgaWYgKGJvb2ttYXJrLnJuZykNCgkJCQkJdC5zZXRSbmcoYm9va21hcmsucm5nKTsNCgkJCX0NCgkJfSwNCg0KCQlzZWxlY3QgOiBmdW5jdGlvbihub2RlLCBjb250ZW50KSB7DQoJCQl2YXIgdCA9IHRoaXMsIGRvbSA9IHQuZG9tLCBybmcgPSBkb20uY3JlYXRlUm5nKCksIGlkeDsNCg0KCQkJaWR4ID0gZG9tLm5vZGVJbmRleChub2RlKTsNCgkJCXJuZy5zZXRTdGFydChub2RlLnBhcmVudE5vZGUsIGlkeCk7DQoJCQlybmcuc2V0RW5kKG5vZGUucGFyZW50Tm9kZSwgaWR4ICsgMSk7DQoNCgkJCS8vIEZpbmQgZmlyc3QvbGFzdCB0ZXh0IG5vZGUgb3IgQlIgZWxlbWVudA0KCQkJaWYgKGNvbnRlbnQpIHsNCgkJCQlmdW5jdGlvbiBzZXRQb2ludChub2RlLCBzdGFydCkgew0KCQkJCQl2YXIgd2Fsa2VyID0gbmV3IHRpbnltY2UuZG9tLlRyZWVXYWxrZXIobm9kZSwgbm9kZSk7DQoNCgkJCQkJZG8gew0KCQkJCQkJLy8gVGV4dCBub2RlDQoJCQkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmIHRpbnltY2UudHJpbShub2RlLm5vZGVWYWx1ZSkubGVuZ3RoICE9IDApIHsNCgkJCQkJCQlpZiAoc3RhcnQpDQoJCQkJCQkJCXJuZy5zZXRTdGFydChub2RlLCAwKTsNCgkJCQkJCQllbHNlDQoJCQkJCQkJCXJuZy5zZXRFbmQobm9kZSwgbm9kZS5ub2RlVmFsdWUubGVuZ3RoKTsNCg0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gQlIgZWxlbWVudA0KCQkJCQkJaWYgKG5vZGUubm9kZU5hbWUgPT0gJ0JSJykgew0KCQkJCQkJCWlmIChzdGFydCkNCgkJCQkJCQkJcm5nLnNldFN0YXJ0QmVmb3JlKG5vZGUpOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJcm5nLnNldEVuZEJlZm9yZShub2RlKTsNCg0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCgkJCQkJfSB3aGlsZSAobm9kZSA9IChzdGFydCA/IHdhbGtlci5uZXh0KCkgOiB3YWxrZXIucHJldigpKSk7DQoJCQkJfTsNCg0KCQkJCXNldFBvaW50KG5vZGUsIDEpOw0KCQkJCXNldFBvaW50KG5vZGUpOw0KCQkJfQ0KDQoJCQl0LnNldFJuZyhybmcpOw0KDQoJCQlyZXR1cm4gbm9kZTsNCgkJfSwNCg0KCQlpc0NvbGxhcHNlZCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCByID0gdC5nZXRSbmcoKSwgcyA9IHQuZ2V0U2VsKCk7DQoNCgkJCWlmICghciB8fCByLml0ZW0pDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQlpZiAoci5jb21wYXJlRW5kUG9pbnRzKQ0KCQkJCXJldHVybiByLmNvbXBhcmVFbmRQb2ludHMoJ1N0YXJ0VG9FbmQnLCByKSA9PT0gMDsNCg0KCQkJcmV0dXJuICFzIHx8IHIuY29sbGFwc2VkOw0KCQl9LA0KDQoJCWNvbGxhcHNlIDogZnVuY3Rpb24oYikgew0KCQkJdmFyIHQgPSB0aGlzLCByID0gdC5nZXRSbmcoKSwgbjsNCg0KCQkJLy8gQ29udHJvbCByYW5nZSBvbiBJRQ0KCQkJaWYgKHIuaXRlbSkgew0KCQkJCW4gPSByLml0ZW0oMCk7DQoJCQkJciA9IHRoaXMud2luLmRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7DQoJCQkJci5tb3ZlVG9FbGVtZW50VGV4dChuKTsNCgkJCX0NCg0KCQkJci5jb2xsYXBzZSghIWIpOw0KCQkJdC5zZXRSbmcocik7DQoJCX0sDQoNCgkJZ2V0U2VsIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHcgPSB0aGlzLndpbjsNCg0KCQkJcmV0dXJuIHcuZ2V0U2VsZWN0aW9uID8gdy5nZXRTZWxlY3Rpb24oKSA6IHcuZG9jdW1lbnQuc2VsZWN0aW9uOw0KCQl9LA0KDQoJCWdldFJuZyA6IGZ1bmN0aW9uKHczYykgew0KCQkJdmFyIHQgPSB0aGlzLCBzLCByLCBlbG0sIGRvYyA9IHQud2luLmRvY3VtZW50Ow0KDQoJCQkvLyBGb3VuZCB0cmlkZW50U2VsIG9iamVjdCB0aGVuIHdlIG5lZWQgdG8gdXNlIHRoYXQgb25lDQoJCQlpZiAodzNjICYmIHQudHJpZGVudFNlbCkNCgkJCQlyZXR1cm4gdC50cmlkZW50U2VsLmdldFJhbmdlQXQoMCk7DQoNCgkJCXRyeSB7DQoJCQkJaWYgKHMgPSB0LmdldFNlbCgpKQ0KCQkJCQlyID0gcy5yYW5nZUNvdW50ID4gMCA/IHMuZ2V0UmFuZ2VBdCgwKSA6IChzLmNyZWF0ZVJhbmdlID8gcy5jcmVhdGVSYW5nZSgpIDogZG9jLmNyZWF0ZVJhbmdlKCkpOw0KCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkvLyBJRSB0aHJvd3MgdW5zcGVjaWZpZWQgZXJyb3IgaGVyZSBpZiBUaW55TUNFIGlzIHBsYWNlZCBpbiBhIGZyYW1lL2lmcmFtZQ0KCQkJfQ0KDQoJCQkvLyBXZSBoYXZlIFczQyByYW5nZXMgYW5kIGl0J3MgSUUgdGhlbiBmYWtlIGNvbnRyb2wgc2VsZWN0aW9uIHNpbmNlIElFOSBkb2Vzbid0IGhhbmRsZSB0aGF0IGNvcnJlY3RseSB5ZXQNCgkJCWlmICh0aW55bWNlLmlzSUUgJiYgci5zZXRTdGFydCAmJiBkb2Muc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaXRlbSkgew0KCQkJCWVsbSA9IGRvYy5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5pdGVtKDApOw0KCQkJCXIgPSBkb2MuY3JlYXRlUmFuZ2UoKTsNCgkJCQlyLnNldFN0YXJ0QmVmb3JlKGVsbSk7DQoJCQkJci5zZXRFbmRBZnRlcihlbG0pOw0KCQkJfQ0KDQoJCQkvLyBObyByYW5nZSBmb3VuZCB0aGVuIGNyZWF0ZSBhbiBlbXB0eSBvbmUNCgkJCS8vIFRoaXMgY2FuIG9jY3VyIHdoZW4gdGhlIGVkaXRvciBpcyBwbGFjZWQgaW4gYSBoaWRkZW4gY29udGFpbmVyIGVsZW1lbnQgb24gR2Vja28NCgkJCS8vIE9yIG9uIElFIHdoZW4gdGhlcmUgd2FzIGFuIGV4Y2VwdGlvbg0KCQkJaWYgKCFyKQ0KCQkJCXIgPSBkb2MuY3JlYXRlUmFuZ2UgPyBkb2MuY3JlYXRlUmFuZ2UoKSA6IGRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOw0KDQoJCQlpZiAodC5zZWxlY3RlZFJhbmdlICYmIHQuZXhwbGljaXRSYW5nZSkgew0KCQkJCWlmIChyLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhyLlNUQVJUX1RPX1NUQVJULCB0LnNlbGVjdGVkUmFuZ2UpID09PSAwICYmIHIuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHIuRU5EX1RPX0VORCwgdC5zZWxlY3RlZFJhbmdlKSA9PT0gMCkgew0KCQkJCQkvLyBTYWZhcmksIE9wZXJhIGFuZCBDaHJvbWUgb25seSBldmVyIHNlbGVjdCB0ZXh0IHdoaWNoIGNhdXNlcyB0aGUgcmFuZ2UgdG8gY2hhbmdlLg0KCQkJCQkvLyBUaGlzIGxldHMgdXMgdXNlIHRoZSBvcmlnaW5hbGx5IHNldCByYW5nZSBpZiB0aGUgc2VsZWN0aW9uIGhhc24ndCBiZWVuIGNoYW5nZWQgYnkgdGhlIHVzZXIuDQoJCQkJCXIgPSB0LmV4cGxpY2l0UmFuZ2U7DQoJCQkJfSBlbHNlIHsNCgkJCQkJdC5zZWxlY3RlZFJhbmdlID0gbnVsbDsNCgkJCQkJdC5leHBsaWNpdFJhbmdlID0gbnVsbDsNCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gcjsNCgkJfSwNCg0KCQlzZXRSbmcgOiBmdW5jdGlvbihyKSB7DQoJCQl2YXIgcywgdCA9IHRoaXM7DQoJCQkNCgkJCWlmICghdC50cmlkZW50U2VsKSB7DQoJCQkJcyA9IHQuZ2V0U2VsKCk7DQoNCgkJCQlpZiAocykgew0KCQkJCQl0LmV4cGxpY2l0UmFuZ2UgPSByOw0KCQkJCQlzLnJlbW92ZUFsbFJhbmdlcygpOw0KCQkJCQlzLmFkZFJhbmdlKHIpOw0KCQkJCQl0LnNlbGVjdGVkUmFuZ2UgPSBzLmdldFJhbmdlQXQoMCk7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkvLyBJcyBXM0MgUmFuZ2UNCgkJCQlpZiAoci5jbG9uZVJhbmdlKSB7DQoJCQkJCXQudHJpZGVudFNlbC5hZGRSYW5nZShyKTsNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCg0KCQkJCS8vIElzIElFIHNwZWNpZmljIHJhbmdlDQoJCQkJdHJ5IHsNCgkJCQkJci5zZWxlY3QoKTsNCgkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkvLyBOZWVkZWQgZm9yIHNvbWUgb2RkIElFIGJ1ZyAjMTg0MzMwNg0KCQkJCX0NCgkJCX0NCgkJfSwNCg0KCQlzZXROb2RlIDogZnVuY3Rpb24obikgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LnNldENvbnRlbnQodC5kb20uZ2V0T3V0ZXJIVE1MKG4pKTsNCg0KCQkJcmV0dXJuIG47DQoJCX0sDQoNCgkJZ2V0Tm9kZSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBybmcgPSB0LmdldFJuZygpLCBzZWwgPSB0LmdldFNlbCgpLCBlbG07DQoNCgkJCWlmIChybmcuc2V0U3RhcnQpIHsNCgkJCQkvLyBSYW5nZSBtYXliZSBsb3N0IGFmdGVyIHRoZSBlZGl0b3IgaXMgbWFkZSB2aXNpYmxlIGFnYWluDQoJCQkJaWYgKCFybmcpDQoJCQkJCXJldHVybiB0LmRvbS5nZXRSb290KCk7DQoNCgkJCQllbG0gPSBybmcuY29tbW9uQW5jZXN0b3JDb250YWluZXI7DQoNCgkJCQkvLyBIYW5kbGUgc2VsZWN0aW9uIGEgaW1hZ2Ugb3Igb3RoZXIgY29udHJvbCBsaWtlIGVsZW1lbnQgc3VjaCBhcyBhbmNob3JzDQoJCQkJaWYgKCFybmcuY29sbGFwc2VkKSB7DQoJCQkJCWlmIChybmcuc3RhcnRDb250YWluZXIgPT0gcm5nLmVuZENvbnRhaW5lcikgew0KCQkJCQkJaWYgKHJuZy5zdGFydE9mZnNldCAtIHJuZy5lbmRPZmZzZXQgPCAyKSB7DQoJCQkJCQkJaWYgKHJuZy5zdGFydENvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCkpDQoJCQkJCQkJCWVsbSA9IHJuZy5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3JuZy5zdGFydE9mZnNldF07DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkvLyBJZiB0aGUgYW5jaG9yIG5vZGUgaXMgYSBlbGVtZW50IGluc3RlYWQgb2YgYSB0ZXh0IG5vZGUgdGhlbiByZXR1cm4gdGhpcyBlbGVtZW50DQoJCQkJCWlmICh0aW55bWNlLmlzV2ViS2l0ICYmIHNlbC5hbmNob3JOb2RlICYmIHNlbC5hbmNob3JOb2RlLm5vZGVUeXBlID09IDEpIA0KCQkJCQkJcmV0dXJuIHNlbC5hbmNob3JOb2RlLmNoaWxkTm9kZXNbc2VsLmFuY2hvck9mZnNldF07IA0KCQkJCX0NCg0KCQkJCWlmIChlbG0gJiYgZWxtLm5vZGVUeXBlID09IDMpDQoJCQkJCXJldHVybiBlbG0ucGFyZW50Tm9kZTsNCg0KCQkJCXJldHVybiBlbG07DQoJCQl9DQoNCgkJCXJldHVybiBybmcuaXRlbSA/IHJuZy5pdGVtKDApIDogcm5nLnBhcmVudEVsZW1lbnQoKTsNCgkJfSwNCg0KCQlnZXRTZWxlY3RlZEJsb2NrcyA6IGZ1bmN0aW9uKHN0LCBlbikgew0KCQkJdmFyIHQgPSB0aGlzLCBkb20gPSB0LmRvbSwgc2IsIGViLCBuLCBibCA9IFtdOw0KDQoJCQlzYiA9IGRvbS5nZXRQYXJlbnQoc3QgfHwgdC5nZXRTdGFydCgpLCBkb20uaXNCbG9jayk7DQoJCQllYiA9IGRvbS5nZXRQYXJlbnQoZW4gfHwgdC5nZXRFbmQoKSwgZG9tLmlzQmxvY2spOw0KDQoJCQlpZiAoc2IpDQoJCQkJYmwucHVzaChzYik7DQoNCgkJCWlmIChzYiAmJiBlYiAmJiBzYiAhPSBlYikgew0KCQkJCW4gPSBzYjsNCg0KCQkJCXdoaWxlICgobiA9IG4ubmV4dFNpYmxpbmcpICYmIG4gIT0gZWIpIHsNCgkJCQkJaWYgKGRvbS5pc0Jsb2NrKG4pKQ0KCQkJCQkJYmwucHVzaChuKTsNCgkJCQl9DQoJCQl9DQoNCgkJCWlmIChlYiAmJiBzYiAhPSBlYikNCgkJCQlibC5wdXNoKGViKTsNCg0KCQkJcmV0dXJuIGJsOw0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQud2luID0gbnVsbDsNCg0KCQkJaWYgKHQudHJpZGVudFNlbCkNCgkJCQl0LnRyaWRlbnRTZWwuZGVzdHJveSgpOw0KDQoJCQkvLyBNYW51YWwgZGVzdHJveSB0aGVuIHJlbW92ZSB1bmxvYWQgaGFuZGxlcg0KCQkJaWYgKCFzKQ0KCQkJCXRpbnltY2UucmVtb3ZlVW5sb2FkKHQuZGVzdHJveSk7DQoJCX0sDQoNCgkJLy8gSUUgaGFzIGFuIGlzc3VlIHdoZXJlIHlvdSBjYW4ndCBzZWxlY3QvbW92ZSB0aGUgY2FyZXQgYnkgY2xpY2tpbmcgb3V0c2lkZSB0aGUgYm9keSBpZiB0aGUgZG9jdW1lbnQgaXMgaW4gc3RhbmRhcmRzIG1vZGUNCgkJX2ZpeElFU2VsZWN0aW9uIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgZG9tID0gdGhpcy5kb20sIGRvYyA9IGRvbS5kb2MsIGJvZHkgPSBkb2MuYm9keSwgc3RhcnRlZCwgc3RhcnRSbmc7DQoNCgkJCS8vIE1ha2UgSFRNTCBlbGVtZW50IHVuc2VsZWN0YWJsZSBzaW5jZSB3ZSBhcmUgZ29pbmcgdG8gaGFuZGxlIHNlbGVjdGlvbiBieSBoYW5kDQoJCQlkb2MuZG9jdW1lbnRFbGVtZW50LnVuc2VsZWN0YWJsZSA9IHRydWU7DQoNCgkJCS8vIFJldHVybiByYW5nZSBmcm9tIHBvaW50IG9yIG51bGwgaWYgaXQgZmFpbGVkDQoJCQlmdW5jdGlvbiBybmdGcm9tUG9pbnQoeCwgeSkgew0KCQkJCXZhciBybmcgPSBib2R5LmNyZWF0ZVRleHRSYW5nZSgpOw0KDQoJCQkJdHJ5IHsNCgkJCQkJcm5nLm1vdmVUb1BvaW50KHgsIHkpOw0KCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCS8vIElFIHNvbWV0aW1lcyB0aHJvd3MgYW5kIGV4Y2VwdGlvbiwgc28gbGV0cyBqdXN0IGlnbm9yZSBpdA0KCQkJCQlybmcgPSBudWxsOw0KCQkJCX0NCg0KCQkJCXJldHVybiBybmc7DQoJCQl9Ow0KDQoJCQkvLyBGaXJlcyB3aGlsZSB0aGUgc2VsZWN0aW9uIGlzIGNoYW5naW5nDQoJCQlmdW5jdGlvbiBzZWxlY3Rpb25DaGFuZ2UoZSkgew0KCQkJCXZhciBwb2ludFJuZzsNCg0KCQkJCS8vIENoZWNrIGlmIHRoZSBidXR0b24gaXMgZG93biBvciBub3QNCgkJCQlpZiAoZS5idXR0b24pIHsNCgkJCQkJLy8gQ3JlYXRlIHJhbmdlIGZyb20gbW91c2UgcG9zaXRpb24NCgkJCQkJcG9pbnRSbmcgPSBybmdGcm9tUG9pbnQoZS54LCBlLnkpOw0KDQoJCQkJCWlmIChwb2ludFJuZykgew0KCQkJCQkJLy8gQ2hlY2sgaWYgcG9pbnRSYW5nZSBpcyBiZWZvcmUvYWZ0ZXIgc2VsZWN0aW9uIHRoZW4gY2hhbmdlIHRoZSBlbmRQb2ludA0KCQkJCQkJaWYgKHBvaW50Um5nLmNvbXBhcmVFbmRQb2ludHMoJ1N0YXJ0VG9TdGFydCcsIHN0YXJ0Um5nKSA+IDApDQoJCQkJCQkJcG9pbnRSbmcuc2V0RW5kUG9pbnQoJ1N0YXJ0VG9TdGFydCcsIHN0YXJ0Um5nKTsNCgkJCQkJCWVsc2UNCgkJCQkJCQlwb2ludFJuZy5zZXRFbmRQb2ludCgnRW5kVG9FbmQnLCBzdGFydFJuZyk7DQoNCgkJCQkJCXBvaW50Um5nLnNlbGVjdCgpOw0KCQkJCQl9DQoJCQkJfSBlbHNlDQoJCQkJCWVuZFNlbGVjdGlvbigpOw0KCQkJfQ0KDQoJCQkvLyBSZW1vdmVzIGxpc3RlbmVycw0KCQkJZnVuY3Rpb24gZW5kU2VsZWN0aW9uKCkgew0KCQkJCWRvbS51bmJpbmQoZG9jLCAnbW91c2V1cCcsIGVuZFNlbGVjdGlvbik7DQoJCQkJZG9tLnVuYmluZChkb2MsICdtb3VzZW1vdmUnLCBzZWxlY3Rpb25DaGFuZ2UpOw0KCQkJCXN0YXJ0ZWQgPSAwOw0KCQkJfTsNCg0KCQkJLy8gRGV0ZWN0IHdoZW4gdXNlciBzZWxlY3RzIG91dHNpZGUgQk9EWQ0KCQkJZG9tLmJpbmQoZG9jLCAnbW91c2Vkb3duJywgZnVuY3Rpb24oZSkgew0KCQkJCWlmIChlLnRhcmdldC5ub2RlTmFtZSA9PT0gJ0hUTUwnKSB7DQoJCQkJCWlmIChzdGFydGVkKQ0KCQkJCQkJZW5kU2VsZWN0aW9uKCk7DQoNCgkJCQkJc3RhcnRlZCA9IDE7DQoNCgkJCQkJLy8gU2V0dXAgc3RhcnQgcG9zaXRpb24NCgkJCQkJc3RhcnRSbmcgPSBybmdGcm9tUG9pbnQoZS54LCBlLnkpOw0KCQkJCQlpZiAoc3RhcnRSbmcpIHsNCgkJCQkJCS8vIExpc3RlbiBmb3Igc2VsZWN0aW9uIGNoYW5nZSBldmVudHMNCgkJCQkJCWRvbS5iaW5kKGRvYywgJ21vdXNldXAnLCBlbmRTZWxlY3Rpb24pOw0KCQkJCQkJZG9tLmJpbmQoZG9jLCAnbW91c2Vtb3ZlJywgc2VsZWN0aW9uQ2hhbmdlKTsNCg0KCQkJCQkJZG9tLndpbi5mb2N1cygpOw0KCQkJCQkJc3RhcnRSbmcuc2VsZWN0KCk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9KTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UuZG9tLlhNTFdyaXRlcicsIHsNCgkJbm9kZSA6IG51bGwsDQoNCgkJWE1MV3JpdGVyIDogZnVuY3Rpb24ocykgew0KCQkJLy8gR2V0IFhNTCBkb2N1bWVudA0KCQkJZnVuY3Rpb24gZ2V0WE1MKCkgew0KCQkJCXZhciBpID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb247DQoNCgkJCQlpZiAoIWkgfHwgIWkuY3JlYXRlRG9jdW1lbnQpIHsNCgkJCQkJLy8gVHJ5IElFIG9iamVjdHMNCgkJCQkJdHJ5IHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01TWE1MMi5ET01Eb2N1bWVudCcpO30gY2F0Y2ggKGV4KSB7fQ0KCQkJCQl0cnkge3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhtbERvbScpO30gY2F0Y2ggKGV4KSB7fQ0KCQkJCX0gZWxzZQ0KCQkJCQlyZXR1cm4gaS5jcmVhdGVEb2N1bWVudCgnJywgJycsIG51bGwpOw0KCQkJfTsNCg0KCQkJdGhpcy5kb2MgPSBnZXRYTUwoKTsNCgkJCQ0KCQkJLy8gU2luY2UgT3BlcmEgYW5kIFdlYktpdCBkb2Vzbid0IGVzY2FwZSA+IGludG8gJmd0OyB3ZSBuZWVkIHRvIGRvIGl0IG91ciBzZWxmIHRvIG5vcm1hbGl6ZSB0aGUgb3V0cHV0IGZvciBhbGwgYnJvd3NlcnMNCgkJCXRoaXMudmFsaWQgPSB0aW55bWNlLmlzT3BlcmEgfHwgdGlueW1jZS5pc1dlYktpdDsNCg0KCQkJdGhpcy5yZXNldCgpOw0KCQl9LA0KDQoJCXJlc2V0IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGQgPSB0LmRvYzsNCg0KCQkJaWYgKGQuZmlyc3RDaGlsZCkNCgkJCQlkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7DQoNCgkJCXQubm9kZSA9IGQuYXBwZW5kQ2hpbGQoZC5jcmVhdGVFbGVtZW50KCJodG1sIikpOw0KCQl9LA0KDQoJCXdyaXRlU3RhcnRFbGVtZW50IDogZnVuY3Rpb24obikgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0Lm5vZGUgPSB0Lm5vZGUuYXBwZW5kQ2hpbGQodC5kb2MuY3JlYXRlRWxlbWVudChuKSk7DQoJCX0sDQoNCgkJd3JpdGVBdHRyaWJ1dGUgOiBmdW5jdGlvbihuLCB2KSB7DQoJCQlpZiAodGhpcy52YWxpZCkNCgkJCQl2ID0gdi5yZXBsYWNlKC8+L2csICclTUNHVCUnKTsNCg0KCQkJdGhpcy5ub2RlLnNldEF0dHJpYnV0ZShuLCB2KTsNCgkJfSwNCg0KCQl3cml0ZUVuZEVsZW1lbnQgOiBmdW5jdGlvbigpIHsNCgkJCXRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlOw0KCQl9LA0KDQoJCXdyaXRlRnVsbEVuZEVsZW1lbnQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgbiA9IHQubm9kZTsNCg0KCQkJbi5hcHBlbmRDaGlsZCh0LmRvYy5jcmVhdGVUZXh0Tm9kZSgiIikpOw0KCQkJdC5ub2RlID0gbi5wYXJlbnROb2RlOw0KCQl9LA0KDQoJCXdyaXRlVGV4dCA6IGZ1bmN0aW9uKHYpIHsNCgkJCWlmICh0aGlzLnZhbGlkKQ0KCQkJCXYgPSB2LnJlcGxhY2UoLz4vZywgJyVNQ0dUJScpOw0KDQoJCQl0aGlzLm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kb2MuY3JlYXRlVGV4dE5vZGUodikpOw0KCQl9LA0KDQoJCXdyaXRlQ0RBVEEgOiBmdW5jdGlvbih2KSB7DQoJCQl0aGlzLm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKHYpKTsNCgkJfSwNCg0KCQl3cml0ZUNvbW1lbnQgOiBmdW5jdGlvbih2KSB7DQoJCQkvLyBGaXggZm9yIGJ1ZyAjMjAzNTY5NA0KCQkJaWYgKHRpbnltY2UuaXNJRSkNCgkJCQl2ID0gdi5yZXBsYWNlKC9eXC18XC0kL2csICcgJyk7DQoNCgkJCXRoaXMubm9kZS5hcHBlbmRDaGlsZCh0aGlzLmRvYy5jcmVhdGVDb21tZW50KHYucmVwbGFjZSgvXC1cLS9nLCAnICcpKSk7DQoJCX0sDQoNCgkJZ2V0Q29udGVudCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGg7DQoNCgkJCWggPSB0aGlzLmRvYy54bWwgfHwgbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh0aGlzLmRvYyk7DQoJCQloID0gaC5yZXBsYWNlKC88XD9bXj9dK1w/Pnw8aHRtbFtePl0qPnw8XC9odG1sPnw8aHRtbFwvPnw8IURPQ1RZUEVbXj5dKz4vZywgJycpOw0KCQkJaCA9IGgucmVwbGFjZSgvID9cLz4vZywgJyAvPicpOw0KDQoJCQlpZiAodGhpcy52YWxpZCkNCgkJCQloID0gaC5yZXBsYWNlKC9cJU1DR1QlL2csICcmZ3Q7Jyk7DQoNCgkJCXJldHVybiBoOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgYXR0cnNDaGFyc1JlZ0V4cCA9IC9bJlwiPD5dL2csIHRleHRDaGFyc1JlZ0V4cCA9IC9bPD4mXS9nLCBlbmNvZGVkQ2hhcnMgPSB7JyYnIDogJyZhbXA7JywgJyInIDogJyZxdW90OycsICc8JyA6ICcmbHQ7JywgJz4nIDogJyZndDsnfTsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLmRvbS5TdHJpbmdXcml0ZXInLCB7DQoJCXN0ciA6IG51bGwsDQoJCXRhZ3MgOiBudWxsLA0KCQljb3VudCA6IDAsDQoJCXNldHRpbmdzIDogbnVsbCwNCgkJaW5kZW50IDogbnVsbCwNCg0KCQlTdHJpbmdXcml0ZXIgOiBmdW5jdGlvbihzKSB7DQoJCQl0aGlzLnNldHRpbmdzID0gdGlueW1jZS5leHRlbmQoew0KCQkJCWluZGVudF9jaGFyIDogJyAnLA0KCQkJCWluZGVudGF0aW9uIDogMA0KCQkJfSwgcyk7DQoNCgkJCXRoaXMucmVzZXQoKTsNCgkJfSwNCg0KCQlyZXNldCA6IGZ1bmN0aW9uKCkgew0KCQkJdGhpcy5pbmRlbnQgPSAnJzsNCgkJCXRoaXMuc3RyID0gIiI7DQoJCQl0aGlzLnRhZ3MgPSBbXTsNCgkJCXRoaXMuY291bnQgPSAwOw0KCQl9LA0KDQoJCXdyaXRlU3RhcnRFbGVtZW50IDogZnVuY3Rpb24obikgew0KCQkJdGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7DQoJCQl0aGlzLndyaXRlUmF3KCc8JyArIG4pOw0KCQkJdGhpcy50YWdzLnB1c2gobik7DQoJCQl0aGlzLmluQXR0ciA9IHRydWU7DQoJCQl0aGlzLmNvdW50Kys7DQoJCQl0aGlzLmVsZW1lbnRDb3VudCA9IHRoaXMuY291bnQ7DQoJCQl0aGlzLmF0dHJzID0ge307DQoJCX0sDQoNCgkJd3JpdGVBdHRyaWJ1dGUgOiBmdW5jdGlvbihuLCB2KSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWlmICghdC5hdHRyc1tuXSkgew0KCQkJCXQud3JpdGVSYXcoIiAiICsgdC5lbmNvZGUobiwgdHJ1ZSkgKyAnPSInICsgdC5lbmNvZGUodiwgdHJ1ZSkgKyAnIicpOw0KCQkJCXQuYXR0cnNbbl0gPSB2Ow0KCQkJfQ0KCQl9LA0KDQoJCXdyaXRlRW5kRWxlbWVudCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIG47DQoNCgkJCWlmICh0aGlzLnRhZ3MubGVuZ3RoID4gMCkgew0KCQkJCW4gPSB0aGlzLnRhZ3MucG9wKCk7DQoNCgkJCQlpZiAodGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKDEpKQ0KCQkJCQl0aGlzLndyaXRlUmF3KCc8LycgKyBuICsgJz4nKTsNCg0KCQkJCWlmICh0aGlzLnNldHRpbmdzLmluZGVudGF0aW9uID4gMCkNCgkJCQkJdGhpcy53cml0ZVJhdygnXG4nKTsNCgkJCX0NCgkJfSwNCg0KCQl3cml0ZUZ1bGxFbmRFbGVtZW50IDogZnVuY3Rpb24oKSB7DQoJCQlpZiAodGhpcy50YWdzLmxlbmd0aCA+IDApIHsNCgkJCQl0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTsNCgkJCQl0aGlzLndyaXRlUmF3KCc8LycgKyB0aGlzLnRhZ3MucG9wKCkgKyAnPicpOw0KDQoJCQkJaWYgKHRoaXMuc2V0dGluZ3MuaW5kZW50YXRpb24gPiAwKQ0KCQkJCQl0aGlzLndyaXRlUmF3KCdcbicpOw0KCQkJfQ0KCQl9LA0KDQoJCXdyaXRlVGV4dCA6IGZ1bmN0aW9uKHYpIHsNCgkJCXRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgpOw0KCQkJdGhpcy53cml0ZVJhdyh0aGlzLmVuY29kZSh2KSk7DQoJCQl0aGlzLmNvdW50Kys7DQoJCX0sDQoNCgkJd3JpdGVDREFUQSA6IGZ1bmN0aW9uKHYpIHsNCgkJCXRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgpOw0KCQkJdGhpcy53cml0ZVJhdygnPCFbQ0RBVEFbJyArIHYgKyAnXV0+Jyk7DQoJCQl0aGlzLmNvdW50Kys7DQoJCX0sDQoNCgkJd3JpdGVDb21tZW50IDogZnVuY3Rpb24odikgew0KCQkJdGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7DQoJCQl0aGlzLndyaXRlUmF3KCc8IS0tJyArIHYgKyAnLS0+Jyk7DQoJCQl0aGlzLmNvdW50Kys7DQoJCX0sDQoNCgkJd3JpdGVSYXcgOiBmdW5jdGlvbih2KSB7DQoJCQl0aGlzLnN0ciArPSB2Ow0KCQl9LA0KDQoJCWVuY29kZSA6IGZ1bmN0aW9uKHMsIGF0dHIpIHsNCgkJCXJldHVybiBzLnJlcGxhY2UoYXR0ciA/IGF0dHJzQ2hhcnNSZWdFeHAgOiB0ZXh0Q2hhcnNSZWdFeHAsIGZ1bmN0aW9uKHYpIHsNCgkJCQlyZXR1cm4gZW5jb2RlZENoYXJzW3ZdOw0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0Q29udGVudCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuc3RyOw0KCQl9LA0KDQoJCV93cml0ZUF0dHJpYnV0ZXNFbmQgOiBmdW5jdGlvbihzKSB7DQoJCQlpZiAoIXRoaXMuaW5BdHRyKQ0KCQkJCXJldHVybjsNCg0KCQkJdGhpcy5pbkF0dHIgPSBmYWxzZTsNCg0KCQkJaWYgKHMgJiYgdGhpcy5lbGVtZW50Q291bnQgPT0gdGhpcy5jb3VudCkgew0KCQkJCXRoaXMud3JpdGVSYXcoJyAvPicpOw0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCg0KCQkJdGhpcy53cml0ZVJhdygnPicpOw0KDQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBleHRlbmQgPSB0aW55bWNlLmV4dGVuZCwgZWFjaCA9IHRpbnltY2UuZWFjaCwgRGlzcGF0Y2hlciA9IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyLCBpc0lFID0gdGlueW1jZS5pc0lFLCBpc0dlY2tvID0gdGlueW1jZS5pc0dlY2tvOw0KDQoJZnVuY3Rpb24gd2lsZGNhcmRUb1JFKHMpIHsNCgkJcmV0dXJuIHMucmVwbGFjZSgvKFs/KypdKS9nLCAnLiQxJyk7DQoJfTsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLmRvbS5TZXJpYWxpemVyJywgew0KCQlTZXJpYWxpemVyIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmtleSA9IDA7DQoJCQl0Lm9uUHJlUHJvY2VzcyA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KCQkJdC5vblBvc3RQcm9jZXNzID0gbmV3IERpc3BhdGNoZXIodCk7DQoNCgkJCXRyeSB7DQoJCQkJdC53cml0ZXIgPSBuZXcgdGlueW1jZS5kb20uWE1MV3JpdGVyKCk7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJCS8vIElFIG1pZ2h0IHRocm93IGV4Y2VwdGlvbiBpZiBBY3RpdmVYIGlzIGRpc2FibGVkIHNvIHdlIHRoZW4gc3dpdGNoIHRvIHRoZSBzbGlnaHRseSBzbG93ZXIgU3RyaW5nV3JpdGVyDQoJCQkJdC53cml0ZXIgPSBuZXcgdGlueW1jZS5kb20uU3RyaW5nV3JpdGVyKCk7DQoJCQl9DQoNCgkJCS8vIElFOSBicm9rZSB0aGUgWE1MIGF0dHJpYnV0ZXMgb3JkZXIgc28gaXQgY2FuJ3QgYmUgdXNlZCBhbnltb3JlDQoJCQlpZiAodGlueW1jZS5pc0lFICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDgpIHsNCgkJCQl0LndyaXRlciA9IG5ldyB0aW55bWNlLmRvbS5TdHJpbmdXcml0ZXIoKTsNCgkJCX0NCg0KCQkJLy8gRGVmYXVsdCBzZXR0aW5ncw0KCQkJdC5zZXR0aW5ncyA9IHMgPSBleHRlbmQoew0KCQkJCWRvbSA6IHRpbnltY2UuRE9NLA0KCQkJCXZhbGlkX25vZGVzIDogMCwNCgkJCQlub2RlX2ZpbHRlciA6IDAsDQoJCQkJYXR0cl9maWx0ZXIgOiAwLA0KCQkJCWludmFsaWRfYXR0cnMgOiAvXihfbWNlX3xfbW96X3xzaXpzZXR8c2l6Y2FjaGUpLywNCgkJCQljbG9zZWQgOiAvXihicnxocnxpbnB1dHxtZXRhfGltZ3xsaW5rfHBhcmFtfGFyZWEpJC8sDQoJCQkJZW50aXR5X2VuY29kaW5nIDogJ25hbWVkJywNCgkJCQllbnRpdGllcyA6ICcxNjAsbmJzcCwxNjEsaWV4Y2wsMTYyLGNlbnQsMTYzLHBvdW5kLDE2NCxjdXJyZW4sMTY1LHllbiwxNjYsYnJ2YmFyLDE2NyxzZWN0LDE2OCx1bWwsMTY5LGNvcHksMTcwLG9yZGYsMTcxLGxhcXVvLDE3Mixub3QsMTczLHNoeSwxNzQscmVnLDE3NSxtYWNyLDE3NixkZWcsMTc3LHBsdXNtbiwxNzgsc3VwMiwxNzksc3VwMywxODAsYWN1dGUsMTgxLG1pY3JvLDE4MixwYXJhLDE4MyxtaWRkb3QsMTg0LGNlZGlsLDE4NSxzdXAxLDE4NixvcmRtLDE4NyxyYXF1bywxODgsZnJhYzE0LDE4OSxmcmFjMTIsMTkwLGZyYWMzNCwxOTEsaXF1ZXN0LDE5MixBZ3JhdmUsMTkzLEFhY3V0ZSwxOTQsQWNpcmMsMTk1LEF0aWxkZSwxOTYsQXVtbCwxOTcsQXJpbmcsMTk4LEFFbGlnLDE5OSxDY2VkaWwsMjAwLEVncmF2ZSwyMDEsRWFjdXRlLDIwMixFY2lyYywyMDMsRXVtbCwyMDQsSWdyYXZlLDIwNSxJYWN1dGUsMjA2LEljaXJjLDIwNyxJdW1sLDIwOCxFVEgsMjA5LE50aWxkZSwyMTAsT2dyYXZlLDIxMSxPYWN1dGUsMjEyLE9jaXJjLDIxMyxPdGlsZGUsMjE0LE91bWwsMjE1LHRpbWVzLDIxNixPc2xhc2gsMjE3LFVncmF2ZSwyMTgsVWFjdXRlLDIxOSxVY2lyYywyMjAsVXVtbCwyMjEsWWFjdXRlLDIyMixUSE9STiwyMjMsc3psaWcsMjI0LGFncmF2ZSwyMjUsYWFjdXRlLDIyNixhY2lyYywyMjcsYXRpbGRlLDIyOCxhdW1sLDIyOSxhcmluZywyMzAsYWVsaWcsMjMxLGNjZWRpbCwyMzIsZWdyYXZlLDIzMyxlYWN1dGUsMjM0LGVjaXJjLDIzNSxldW1sLDIzNixpZ3JhdmUsMjM3LGlhY3V0ZSwyMzgsaWNpcmMsMjM5LGl1bWwsMjQwLGV0aCwyNDEsbnRpbGRlLDI0MixvZ3JhdmUsMjQzLG9hY3V0ZSwyNDQsb2NpcmMsMjQ1LG90aWxkZSwyNDYsb3VtbCwyNDcsZGl2aWRlLDI0OCxvc2xhc2gsMjQ5LHVncmF2ZSwyNTAsdWFjdXRlLDI1MSx1Y2lyYywyNTIsdXVtbCwyNTMseWFjdXRlLDI1NCx0aG9ybiwyNTUseXVtbCw0MDIsZm5vZiw5MTMsQWxwaGEsOTE0LEJldGEsOTE1LEdhbW1hLDkxNixEZWx0YSw5MTcsRXBzaWxvbiw5MTgsWmV0YSw5MTksRXRhLDkyMCxUaGV0YSw5MjEsSW90YSw5MjIsS2FwcGEsOTIzLExhbWJkYSw5MjQsTXUsOTI1LE51LDkyNixYaSw5MjcsT21pY3Jvbiw5MjgsUGksOTI5LFJobyw5MzEsU2lnbWEsOTMyLFRhdSw5MzMsVXBzaWxvbiw5MzQsUGhpLDkzNSxDaGksOTM2LFBzaSw5MzcsT21lZ2EsOTQ1LGFscGhhLDk0NixiZXRhLDk0NyxnYW1tYSw5NDgsZGVsdGEsOTQ5LGVwc2lsb24sOTUwLHpldGEsOTUxLGV0YSw5NTIsdGhldGEsOTUzLGlvdGEsOTU0LGthcHBhLDk1NSxsYW1iZGEsOTU2LG11LDk1NyxudSw5NTgseGksOTU5LG9taWNyb24sOTYwLHBpLDk2MSxyaG8sOTYyLHNpZ21hZiw5NjMsc2lnbWEsOTY0LHRhdSw5NjUsdXBzaWxvbiw5NjYscGhpLDk2NyxjaGksOTY4LHBzaSw5Njksb21lZ2EsOTc3LHRoZXRhc3ltLDk3OCx1cHNpaCw5ODIscGl2LDgyMjYsYnVsbCw4MjMwLGhlbGxpcCw4MjQyLHByaW1lLDgyNDMsUHJpbWUsODI1NCxvbGluZSw4MjYwLGZyYXNsLDg0NzIsd2VpZXJwLDg0NjUsaW1hZ2UsODQ3NixyZWFsLDg0ODIsdHJhZGUsODUwMSxhbGVmc3ltLDg1OTIsbGFyciw4NTkzLHVhcnIsODU5NCxyYXJyLDg1OTUsZGFyciw4NTk2LGhhcnIsODYyOSxjcmFyciw4NjU2LGxBcnIsODY1Nyx1QXJyLDg2NTgsckFyciw4NjU5LGRBcnIsODY2MCxoQXJyLDg3MDQsZm9yYWxsLDg3MDYscGFydCw4NzA3LGV4aXN0LDg3MDksZW1wdHksODcxMSxuYWJsYSw4NzEyLGlzaW4sODcxMyxub3Rpbiw4NzE1LG5pLDg3MTkscHJvZCw4NzIxLHN1bSw4NzIyLG1pbnVzLDg3MjcsbG93YXN0LDg3MzAscmFkaWMsODczMyxwcm9wLDg3MzQsaW5maW4sODczNixhbmcsODc0MyxhbmQsODc0NCxvciw4NzQ1LGNhcCw4NzQ2LGN1cCw4NzQ3LGludCw4NzU2LHRoZXJlNCw4NzY0LHNpbSw4NzczLGNvbmcsODc3Nixhc3ltcCw4ODAwLG5lLDg4MDEsZXF1aXYsODgwNCxsZSw4ODA1LGdlLDg4MzQsc3ViLDg4MzUsc3VwLDg4MzYsbnN1Yiw4ODM4LHN1YmUsODgzOSxzdXBlLDg4NTMsb3BsdXMsODg1NSxvdGltZXMsODg2OSxwZXJwLDg5MDEsc2RvdCw4OTY4LGxjZWlsLDg5NjkscmNlaWwsODk3MCxsZmxvb3IsODk3MSxyZmxvb3IsOTAwMSxsYW5nLDkwMDIscmFuZyw5Njc0LGxveiw5ODI0LHNwYWRlcyw5ODI3LGNsdWJzLDk4MjksaGVhcnRzLDk4MzAsZGlhbXMsMzM4LE9FbGlnLDMzOSxvZWxpZywzNTIsU2Nhcm9uLDM1MyxzY2Fyb24sMzc2LFl1bWwsNzEwLGNpcmMsNzMyLHRpbGRlLDgxOTQsZW5zcCw4MTk1LGVtc3AsODIwMSx0aGluc3AsODIwNCx6d25qLDgyMDUsendqLDgyMDYsbHJtLDgyMDcscmxtLDgyMTEsbmRhc2gsODIxMixtZGFzaCw4MjE2LGxzcXVvLDgyMTcscnNxdW8sODIxOCxzYnF1byw4MjIwLGxkcXVvLDgyMjEscmRxdW8sODIyMixiZHF1byw4MjI0LGRhZ2dlciw4MjI1LERhZ2dlciw4MjQwLHBlcm1pbCw4MjQ5LGxzYXF1byw4MjUwLHJzYXF1byw4MzY0LGV1cm8nLA0KCQkJCXZhbGlkX2VsZW1lbnRzIDogJypbKl0nLA0KCQkJCWV4dGVuZGVkX3ZhbGlkX2VsZW1lbnRzIDogMCwNCgkJCQlpbnZhbGlkX2VsZW1lbnRzIDogMCwNCgkJCQlmaXhfdGFibGVfZWxlbWVudHMgOiAxLA0KCQkJCWZpeF9saXN0X2VsZW1lbnRzIDogdHJ1ZSwNCgkJCQlmaXhfY29udGVudF9kdXBsaWNhdGlvbiA6IHRydWUsDQoJCQkJY29udmVydF9mb250c190b19zcGFucyA6IGZhbHNlLA0KCQkJCWZvbnRfc2l6ZV9jbGFzc2VzIDogMCwNCgkJCQlhcHBseV9zb3VyY2VfZm9ybWF0dGluZyA6IDAsDQoJCQkJaW5kZW50X21vZGUgOiAnc2ltcGxlJywNCgkJCQlpbmRlbnRfY2hhciA6ICdcdCcsDQoJCQkJaW5kZW50X2xldmVscyA6IDEsDQoJCQkJcmVtb3ZlX2xpbmVicmVha3MgOiAxLA0KCQkJCXJlbW92ZV9yZWR1bmRhbnRfYnJzIDogMSwNCgkJCQllbGVtZW50X2Zvcm1hdCA6ICd4aHRtbCcNCgkJCX0sIHMpOw0KDQoJCQl0LmRvbSA9IHMuZG9tOw0KCQkJdC5zY2hlbWEgPSBzLnNjaGVtYTsNCg0KCQkJLy8gVXNlIHJhdyBlbnRpdGllcyBpZiBubyBlbnRpdGllcyBhcmUgZGVmaW5lZA0KCQkJaWYgKHMuZW50aXR5X2VuY29kaW5nID09ICduYW1lZCcgJiYgIXMuZW50aXRpZXMpDQoJCQkJcy5lbnRpdHlfZW5jb2RpbmcgPSAncmF3JzsNCg0KCQkJaWYgKHMucmVtb3ZlX3JlZHVuZGFudF9icnMpIHsNCgkJCQl0Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJCS8vIFJlbW92ZSBzaW5nbGUgQlIgYXQgZW5kIG9mIGJsb2NrIGVsZW1lbnRzIHNpbmNlIHRoZXkgZ2V0IHJlbmRlcmVkDQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKC8oPGJyIFwvPlxzKikrPFwvKHB8aFsxLTZdfGRpdnxsaSk+L2dpLCBmdW5jdGlvbihhLCBiLCBjKSB7DQoJCQkJCQkvLyBDaGVjayBpZiBpdCdzIGEgc2luZ2xlIGVsZW1lbnQNCgkJCQkJCWlmICgvXjxiciBcLz5ccyo8XC8vLnRlc3QoYSkpDQoJCQkJCQkJcmV0dXJuICc8LycgKyBjICsgJz4nOw0KDQoJCQkJCQlyZXR1cm4gYTsNCgkJCQkJfSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCS8vIFJlbW92ZSBYSFRNTCBlbGVtZW50IGVuZGluZ3MgaS5lLiBwcm9kdWNlIGNyYXAgOikgWEhUTUwgaXMgYmV0dGVyDQoJCQlpZiAocy5lbGVtZW50X2Zvcm1hdCA9PSAnaHRtbCcpIHsNCgkJCQl0Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKC88KFtePl0rKSBcLz4vZywgJzwkMT4nKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuZml4X2xpc3RfZWxlbWVudHMpIHsNCgkJCQl0Lm9uUHJlUHJvY2Vzcy5hZGQoZnVuY3Rpb24oc2UsIG8pIHsNCgkJCQkJdmFyIG5sLCB4LCBhID0gWydvbCcsICd1bCddLCBpLCBuLCBwLCByID0gL14oT0x8VUwpJC8sIG5wOw0KDQoJCQkJCWZ1bmN0aW9uIHByZXZOb2RlKGUsIG4pIHsNCgkJCQkJCXZhciBhID0gbi5zcGxpdCgnLCcpLCBpOw0KDQoJCQkJCQl3aGlsZSAoKGUgPSBlLnByZXZpb3VzU2libGluZykgIT0gbnVsbCkgew0KCQkJCQkJCWZvciAoaT0wOyBpPGEubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQkJaWYgKGUubm9kZU5hbWUgPT0gYVtpXSkNCgkJCQkJCQkJCXJldHVybiBlOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuIG51bGw7DQoJCQkJCX07DQoNCgkJCQkJZm9yICh4PTA7IHg8YS5sZW5ndGg7IHgrKykgew0KCQkJCQkJbmwgPSB0LmRvbS5zZWxlY3QoYVt4XSwgby5ub2RlKTsNCg0KCQkJCQkJZm9yIChpPTA7IGk8bmwubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQluID0gbmxbaV07DQoJCQkJCQkJcCA9IG4ucGFyZW50Tm9kZTsNCg0KCQkJCQkJCWlmIChyLnRlc3QocC5ub2RlTmFtZSkpIHsNCgkJCQkJCQkJbnAgPSBwcmV2Tm9kZShuLCAnTEknKTsNCg0KCQkJCQkJCQlpZiAoIW5wKSB7DQoJCQkJCQkJCQlucCA9IHQuZG9tLmNyZWF0ZSgnbGknKTsNCgkJCQkJCQkJCW5wLmlubmVySFRNTCA9ICcmbmJzcDsnOw0KCQkJCQkJCQkJbnAuYXBwZW5kQ2hpbGQobik7DQoJCQkJCQkJCQlwLmluc2VydEJlZm9yZShucCwgcC5maXJzdENoaWxkKTsNCgkJCQkJCQkJfSBlbHNlDQoJCQkJCQkJCQlucC5hcHBlbmRDaGlsZChuKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuZml4X3RhYmxlX2VsZW1lbnRzKSB7DQoJCQkJdC5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJCWVhY2godC5kb20uc2VsZWN0KCdwIHRhYmxlJywgby5ub2RlKS5yZXZlcnNlKCksIGZ1bmN0aW9uKG4pIHsNCgkJCQkJCXZhciBwYXJlbnQgPSB0LmRvbS5nZXRQYXJlbnQobi5wYXJlbnROb2RlLCAndGFibGUscCcpOw0KDQoJCQkJCQlpZiAocGFyZW50Lm5vZGVOYW1lICE9ICdUQUJMRScpIHsNCgkJCQkJCQl0cnkgew0KCQkJCQkJCQl0LmRvbS5zcGxpdChwYXJlbnQsIG4pOw0KCQkJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkJCS8vIElFIGNhbiBzb21ldGltZXMgZmlyZSBhbiB1bmtub3duIHJ1bnRpbWUgZXJyb3Igc28gd2UganVzdCBpZ25vcmUgaXQNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfQ0KCQl9LA0KDQoJCXNldEVudGl0aWVzIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzLCBhLCBpLCBsID0ge30sIHY7DQoNCgkJCS8vIE5vIG5lZWQgdG8gc2V0dXAgbW9yZSB0aGFuIG9uY2UNCgkJCWlmICh0LmVudGl0eUxvb2t1cCkNCgkJCQlyZXR1cm47DQoNCgkJCS8vIEJ1aWxkIHJlZ2V4IGFuZCBsb29rdXAgYXJyYXkNCgkJCWEgPSBzLnNwbGl0KCcsJyk7DQoJCQlmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMikgew0KCQkJCXYgPSBhW2ldOw0KDQoJCQkJLy8gRG9uJ3QgYWRkIGRlZmF1bHQgJmFtcDsgJnF1b3Q7IGV0Yy4NCgkJCQlpZiAodiA9PSAzNCB8fCB2ID09IDM4IHx8IHYgPT0gNjAgfHwgdiA9PSA2MikNCgkJCQkJY29udGludWU7DQoNCgkJCQlsW1N0cmluZy5mcm9tQ2hhckNvZGUoYVtpXSldID0gYVtpICsgMV07DQoNCgkJCQl2ID0gcGFyc2VJbnQoYVtpXSkudG9TdHJpbmcoMTYpOw0KCQkJfQ0KDQoJCQl0LmVudGl0eUxvb2t1cCA9IGw7DQoJCX0sDQoNCgkJc2V0UnVsZXMgOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQuX3NldHVwKCk7DQoJCQl0LnJ1bGVzID0ge307DQoJCQl0LndpbGRSdWxlcyA9IFtdOw0KCQkJdC52YWxpZEVsZW1lbnRzID0ge307DQoNCgkJCXJldHVybiB0LmFkZFJ1bGVzKHMpOw0KCQl9LA0KDQoJCWFkZFJ1bGVzIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzLCBkcjsNCg0KCQkJaWYgKCFzKQ0KCQkJCXJldHVybjsNCg0KCQkJdC5fc2V0dXAoKTsNCg0KCQkJZWFjaChzLnNwbGl0KCcsJyksIGZ1bmN0aW9uKHMpIHsNCgkJCQl2YXIgcCA9IHMuc3BsaXQoL1xbfFxdLyksIHRuID0gcFswXS5zcGxpdCgnLycpLCByYSwgYXQsIHdhdCwgdmEgPSBbXTsNCg0KCQkJCS8vIEV4dGVuZCB3aXRoIGRlZmF1bHQgcnVsZXMNCgkJCQlpZiAoZHIpDQoJCQkJCWF0ID0gdGlueW1jZS5leHRlbmQoW10sIGRyLmF0dHJpYnMpOw0KDQoJCQkJLy8gUGFyc2UgYXR0cmlidXRlcw0KCQkJCWlmIChwLmxlbmd0aCA+IDEpIHsNCgkJCQkJZWFjaChwWzFdLnNwbGl0KCd8JyksIGZ1bmN0aW9uKHMpIHsNCgkJCQkJCXZhciBhciA9IHt9LCBpOw0KDQoJCQkJCQlhdCA9IGF0IHx8IFtdOw0KDQoJCQkJCQkvLyBQYXJzZSBhdHRyaWJ1dGUgcnVsZQ0KCQkJCQkJcyA9IHMucmVwbGFjZSgvOjovZywgJ34nKTsNCgkJCQkJCXMgPSAvXihbIVwtXSk/KFtcdyouP35fXC1dK3wpKFs9OjxdKT8oLispPyQvLmV4ZWMocyk7DQoJCQkJCQlzWzJdID0gc1syXS5yZXBsYWNlKC9+L2csICc6Jyk7DQoNCgkJCQkJCS8vIEFkZCByZXF1aXJlZCBhdHRyaWJ1dGVzDQoJCQkJCQlpZiAoc1sxXSA9PSAnIScpIHsNCgkJCQkJCQlyYSA9IHJhIHx8IFtdOw0KCQkJCQkJCXJhLnB1c2goc1syXSk7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIFJlbW92ZSBpbmhlcml0ZWQgYXR0cmlidXRlcw0KCQkJCQkJaWYgKHNbMV0gPT0gJy0nKSB7DQoJCQkJCQkJZm9yIChpID0gMDsgaSA8YXQubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQkJaWYgKGF0W2ldLm5hbWUgPT0gc1syXSkgew0KCQkJCQkJCQkJYXQuc3BsaWNlKGksIDEpOw0KCQkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlzd2l0Y2ggKHNbM10pIHsNCgkJCQkJCQkvLyBBZGQgZGVmYXVsdCBhdHRyaWIgdmFsdWVzDQoJCQkJCQkJY2FzZSAnPSc6DQoJCQkJCQkJCWFyLmRlZmF1bHRWYWwgPSBzWzRdIHx8ICcnOw0KCQkJCQkJCQlicmVhazsNCg0KCQkJCQkJCS8vIEFkZCBmb3JjZWQgYXR0cmliIHZhbHVlcw0KCQkJCQkJCWNhc2UgJzonOg0KCQkJCQkJCQlhci5mb3JjZWRWYWwgPSBzWzRdOw0KCQkJCQkJCQlicmVhazsNCg0KCQkJCQkJCS8vIEFkZCB2YWxpZGF0aW9uIHZhbHVlcw0KCQkJCQkJCWNhc2UgJzwnOg0KCQkJCQkJCQlhci52YWxpZFZhbHMgPSBzWzRdLnNwbGl0KCc/Jyk7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoL1sqLj9dLy50ZXN0KHNbMl0pKSB7DQoJCQkJCQkJd2F0ID0gd2F0IHx8IFtdOw0KCQkJCQkJCWFyLm5hbWVSRSA9IG5ldyBSZWdFeHAoJ14nICsgd2lsZGNhcmRUb1JFKHNbMl0pICsgJyQnKTsNCgkJCQkJCQl3YXQucHVzaChhcik7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCWFyLm5hbWUgPSBzWzJdOw0KCQkJCQkJCWF0LnB1c2goYXIpOw0KCQkJCQkJfQ0KDQoJCQkJCQl2YS5wdXNoKHNbMl0pOw0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQkvLyBIYW5kbGUgZWxlbWVudCBuYW1lcw0KCQkJCWVhY2godG4sIGZ1bmN0aW9uKHMsIGkpIHsNCgkJCQkJdmFyIHByID0gcy5jaGFyQXQoMCksIHggPSAxLCBydSA9IHt9Ow0KDQoJCQkJCS8vIEV4dGVuZCB3aXRoIGRlZmF1bHQgcnVsZSBkYXRhDQoJCQkJCWlmIChkcikgew0KCQkJCQkJaWYgKGRyLm5vRW1wdHkpDQoJCQkJCQkJcnUubm9FbXB0eSA9IGRyLm5vRW1wdHk7DQoNCgkJCQkJCWlmIChkci5mdWxsRW5kKQ0KCQkJCQkJCXJ1LmZ1bGxFbmQgPSBkci5mdWxsRW5kOw0KDQoJCQkJCQlpZiAoZHIucGFkZCkNCgkJCQkJCQlydS5wYWRkID0gZHIucGFkZDsNCgkJCQkJfQ0KDQoJCQkJCS8vIEhhbmRsZSBwcmVmaXhlcw0KCQkJCQlzd2l0Y2ggKHByKSB7DQoJCQkJCQljYXNlICctJzoNCgkJCQkJCQlydS5ub0VtcHR5ID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJY2FzZSAnKyc6DQoJCQkJCQkJcnUuZnVsbEVuZCA9IHRydWU7DQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWNhc2UgJyMnOg0KCQkJCQkJCXJ1LnBhZGQgPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQlkZWZhdWx0Og0KCQkJCQkJCXggPSAwOw0KCQkJCQl9DQoNCgkJCQkJdG5baV0gPSBzID0gcy5zdWJzdHJpbmcoeCk7DQoJCQkJCXQudmFsaWRFbGVtZW50c1tzXSA9IDE7DQoNCgkJCQkJLy8gQWRkIGVsZW1lbnQgbmFtZSBvciBlbGVtZW50IHJlZ2V4DQoJCQkJCWlmICgvWyouP10vLnRlc3QodG5bMF0pKSB7DQoJCQkJCQlydS5uYW1lUkUgPSBuZXcgUmVnRXhwKCdeJyArIHdpbGRjYXJkVG9SRSh0blswXSkgKyAnJCcpOw0KCQkJCQkJdC53aWxkUnVsZXMgPSB0LndpbGRSdWxlcyB8fCB7fTsNCgkJCQkJCXQud2lsZFJ1bGVzLnB1c2gocnUpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJcnUubmFtZSA9IHRuWzBdOw0KDQoJCQkJCQkvLyBTdG9yZSBhd2F5IGRlZmF1bHQgcnVsZQ0KCQkJCQkJaWYgKHRuWzBdID09ICdAJykNCgkJCQkJCQlkciA9IHJ1Ow0KDQoJCQkJCQl0LnJ1bGVzW3NdID0gcnU7DQoJCQkJCX0NCg0KCQkJCQlydS5hdHRyaWJzID0gYXQ7DQoNCgkJCQkJaWYgKHJhKQ0KCQkJCQkJcnUucmVxdWlyZWRBdHRyaWJzID0gcmE7DQoNCgkJCQkJaWYgKHdhdCkgew0KCQkJCQkJLy8gQnVpbGQgdmFsaWQgYXR0cmlidXRlcyByZWdleHANCgkJCQkJCXMgPSAnJzsNCgkJCQkJCWVhY2godmEsIGZ1bmN0aW9uKHYpIHsNCgkJCQkJCQlpZiAocykNCgkJCQkJCQkJcyArPSAnfCc7DQoNCgkJCQkJCQlzICs9ICcoJyArIHdpbGRjYXJkVG9SRSh2KSArICcpJzsNCgkJCQkJCX0pOw0KCQkJCQkJcnUudmFsaWRBdHRyaWJzUkUgPSBuZXcgUmVnRXhwKCdeJyArIHMudG9Mb3dlckNhc2UoKSArICckJyk7DQoJCQkJCQlydS53aWxkQXR0cmlicyA9IHdhdDsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfSk7DQoNCgkJCS8vIEJ1aWxkIHZhbGlkIGVsZW1lbnRzIHJlZ2V4cA0KCQkJcyA9ICcnOw0KCQkJZWFjaCh0LnZhbGlkRWxlbWVudHMsIGZ1bmN0aW9uKHYsIGspIHsNCgkJCQlpZiAocykNCgkJCQkJcyArPSAnfCc7DQoNCgkJCQlpZiAoayAhPSAnQCcpDQoJCQkJCXMgKz0gazsNCgkJCX0pOw0KCQkJdC52YWxpZEVsZW1lbnRzUkUgPSBuZXcgUmVnRXhwKCdeKCcgKyB3aWxkY2FyZFRvUkUocy50b0xvd2VyQ2FzZSgpKSArICcpJCcpOw0KDQoJCQkvL2NvbnNvbGUuZGVidWcodC52YWxpZEVsZW1lbnRzUkUudG9TdHJpbmcoKSk7DQoJCQkvL2NvbnNvbGUuZGlyKHQucnVsZXMpOw0KCQkJLy9jb25zb2xlLmRpcih0LndpbGRSdWxlcyk7DQoJCX0sDQoNCgkJZmluZFJ1bGUgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHJsID0gdC5ydWxlcywgaSwgcjsNCg0KCQkJdC5fc2V0dXAoKTsNCg0KCQkJLy8gRXhhY3QgbWF0Y2gNCgkJCXIgPSBybFtuXTsNCgkJCWlmIChyKQ0KCQkJCXJldHVybiByOw0KDQoJCQkvLyBUcnkgd2lsZGNhcmRzDQoJCQlybCA9IHQud2lsZFJ1bGVzOw0KCQkJZm9yIChpID0gMDsgaSA8IHJsLmxlbmd0aDsgaSsrKSB7DQoJCQkJaWYgKHJsW2ldLm5hbWVSRS50ZXN0KG4pKQ0KCQkJCQlyZXR1cm4gcmxbaV07DQoJCQl9DQoNCgkJCXJldHVybiBudWxsOw0KCQl9LA0KDQoJCWZpbmRBdHRyaWJSdWxlIDogZnVuY3Rpb24ocnUsIG4pIHsNCgkJCXZhciBpLCB3YSA9IHJ1LndpbGRBdHRyaWJzOw0KDQoJCQlmb3IgKGkgPSAwOyBpIDwgd2EubGVuZ3RoOyBpKyspIHsNCgkJCQlpZiAod2FbaV0ubmFtZVJFLnRlc3QobikpDQoJCQkJCXJldHVybiB3YVtpXTsNCgkJCX0NCg0KCQkJcmV0dXJuIG51bGw7DQoJCX0sDQoNCgkJc2VyaWFsaXplIDogZnVuY3Rpb24obiwgbykgew0KCQkJdmFyIGgsIHQgPSB0aGlzLCBkb2MsIG9sZERvYywgaW1wbCwgc2VsZWN0ZWQ7DQoNCgkJCXQuX3NldHVwKCk7DQoJCQlvID0gbyB8fCB7fTsNCgkJCW8uZm9ybWF0ID0gby5mb3JtYXQgfHwgJ2h0bWwnOw0KCQkJdC5wcm9jZXNzT2JqID0gbzsNCg0KCQkJLy8gSUUgbG9vc2VzIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgb24gb3B0aW9uIGVsZW1lbnRzIHNvIHdlIG5lZWQgdG8gc3RvcmUgaXQNCgkJCS8vIFNlZTogaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi84Mjk5MDcNCgkJCWlmIChpc0lFKSB7DQoJCQkJc2VsZWN0ZWQgPSBbXTsNCgkJCQllYWNoKG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ29wdGlvbicpLCBmdW5jdGlvbihuKSB7DQoJCQkJCXZhciB2ID0gdC5kb20uZ2V0QXR0cmliKG4sICdzZWxlY3RlZCcpOw0KDQoJCQkJCXNlbGVjdGVkLnB1c2godiA/IHYgOiBudWxsKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJbiA9IG4uY2xvbmVOb2RlKHRydWUpOw0KDQoJCQkvLyBJRSBsb29zZXMgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZSBvbiBvcHRpb24gZWxlbWVudHMgc28gd2UgbmVlZCB0byByZXN0b3JlIGl0DQoJCQlpZiAoaXNJRSkgew0KCQkJCWVhY2gobi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnb3B0aW9uJyksIGZ1bmN0aW9uKG4sIGkpIHsNCgkJCQkJdC5kb20uc2V0QXR0cmliKG4sICdzZWxlY3RlZCcsIHNlbGVjdGVkW2ldKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gTm9kZXMgbmVlZHMgdG8gYmUgYXR0YWNoZWQgdG8gc29tZXRoaW5nIGluIFdlYktpdC9PcGVyYQ0KCQkJLy8gT2xkZXIgYnVpbGRzIG9mIE9wZXJhIGNyYXNoZXMgaWYgeW91IGF0dGFjaCB0aGUgbm9kZSB0byBhbiBkb2N1bWVudCBjcmVhdGVkIGR5bmFtaWNhbGx5DQoJCQkvLyBhbmQgc2luY2Ugd2UgY2FuJ3QgZmVhdHVyZSBkZXRlY3QgYSBjcmFzaCB3ZSBuZWVkIHRvIHNuaWZmIHRoZSBhY3V0YWwgYnVpbGQgbnVtYmVyDQoJCQkvLyBUaGlzIGZpeCB3aWxsIG1ha2UgRE9NIHJhbmdlcyBhbmQgbWFrZSBTaXp6bGUgaGFwcHkhDQoJCQlpbXBsID0gbi5vd25lckRvY3VtZW50LmltcGxlbWVudGF0aW9uOw0KCQkJaWYgKGltcGwuY3JlYXRlSFRNTERvY3VtZW50KSB7DQoJCQkJLy8gQ3JlYXRlIGFuIGVtcHR5IEhUTUwgZG9jdW1lbnQNCgkJCQlkb2MgPSBpbXBsLmNyZWF0ZUhUTUxEb2N1bWVudCgiIik7DQoNCgkJCQkvLyBBZGQgdGhlIGVsZW1lbnQgb3IgaXQncyBjaGlsZHJlbiBpZiBpdCdzIGEgYm9keSBlbGVtZW50IHRvIHRoZSBuZXcgZG9jdW1lbnQNCgkJCQllYWNoKG4ubm9kZU5hbWUgPT0gJ0JPRFknID8gbi5jaGlsZE5vZGVzIDogW25dLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCWRvYy5ib2R5LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKG5vZGUsIHRydWUpKTsNCgkJCQl9KTsNCg0KCQkJCS8vIEdyYWIgZmlyc3QgY2hpbGQgb3IgYm9keSBlbGVtZW50IGZvciBzZXJpYWxpemF0aW9uDQoJCQkJaWYgKG4ubm9kZU5hbWUgIT0gJ0JPRFknKQ0KCQkJCQluID0gZG9jLmJvZHkuZmlyc3RDaGlsZDsNCgkJCQllbHNlDQoJCQkJCW4gPSBkb2MuYm9keTsNCg0KCQkJCS8vIHNldCB0aGUgbmV3IGRvY3VtZW50IGluIERPTVV0aWxzIHNvIGNyZWF0ZUVsZW1lbnQgZXRjIHdvcmtzDQoJCQkJb2xkRG9jID0gdC5kb20uZG9jOw0KCQkJCXQuZG9tLmRvYyA9IGRvYzsNCgkJCX0NCg0KCQkJdC5rZXkgPSAnJyArIChwYXJzZUludCh0LmtleSkgKyAxKTsNCg0KCQkJLy8gUHJlIHByb2Nlc3MNCgkJCWlmICghby5ub19ldmVudHMpIHsNCgkJCQlvLm5vZGUgPSBuOw0KCQkJCXQub25QcmVQcm9jZXNzLmRpc3BhdGNoKHQsIG8pOw0KCQkJfQ0KDQoJCQkvLyBTZXJpYWxpemUgSFRNTCBET00gaW50byBhIHN0cmluZw0KCQkJdC53cml0ZXIucmVzZXQoKTsNCgkJCXQuX2luZm8gPSBvOw0KCQkJdC5fc2VyaWFsaXplTm9kZShuLCBvLmdldElubmVyKTsNCg0KCQkJLy8gUG9zdCBwcm9jZXNzDQoJCQlvLmNvbnRlbnQgPSB0LndyaXRlci5nZXRDb250ZW50KCk7DQoNCgkJCS8vIFJlc3RvcmUgdGhlIG9sZCBkb2N1bWVudCBpZiBpdCB3YXMgY2hhbmdlZA0KCQkJaWYgKG9sZERvYykNCgkJCQl0LmRvbS5kb2MgPSBvbGREb2M7DQoNCgkJCWlmICghby5ub19ldmVudHMpDQoJCQkJdC5vblBvc3RQcm9jZXNzLmRpc3BhdGNoKHQsIG8pOw0KDQoJCQl0Ll9wb3N0UHJvY2VzcyhvKTsNCgkJCW8ubm9kZSA9IG51bGw7DQoNCgkJCXJldHVybiB0aW55bWNlLnRyaW0oby5jb250ZW50KTsNCgkJfSwNCg0KCQkvLyBJbnRlcm5hbCBmdW5jdGlvbnMNCg0KCQlfcG9zdFByb2Nlc3MgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBoID0gby5jb250ZW50LCBzYyA9IFtdLCBwOw0KDQoJCQlpZiAoby5mb3JtYXQgPT0gJ2h0bWwnKSB7DQoJCQkJLy8gUHJvdGVjdCBzb21lIGVsZW1lbnRzDQoJCQkJcCA9IHQuX3Byb3RlY3Qoew0KCQkJCQljb250ZW50IDogaCwNCgkJCQkJcGF0dGVybnMgOiBbDQoJCQkJCQl7cGF0dGVybiA6IC8oPHNjcmlwdFtePl0qPikoLio/KSg8XC9zY3JpcHQ+KS9nfSwNCgkJCQkJCXtwYXR0ZXJuIDogLyg8bm9zY3JpcHRbXj5dKj4pKC4qPykoPFwvbm9zY3JpcHQ+KS9nfSwNCgkJCQkJCXtwYXR0ZXJuIDogLyg8c3R5bGVbXj5dKj4pKC4qPykoPFwvc3R5bGU+KS9nfSwNCgkJCQkJCXtwYXR0ZXJuIDogLyg8cHJlW14+XSo+KSguKj8pKDxcL3ByZT4pL2csIGVuY29kZSA6IDF9LA0KCQkJCQkJe3BhdHRlcm4gOiAvKDwhLS1cW0NEQVRBXFspKC4qPykoXF1cXS0tPikvZ30NCgkJCQkJXQ0KCQkJCX0pOw0KDQoJCQkJaCA9IHAuY29udGVudDsNCg0KCQkJCS8vIEVudGl0eSBlbmNvZGUNCgkJCQlpZiAocy5lbnRpdHlfZW5jb2RpbmcgIT09ICdyYXcnKQ0KCQkJCQloID0gdC5fZW5jb2RlKGgpOw0KDQoJCQkJLy8gVXNlIEJSIGluc3RlYWQgb2YgJm5ic3A7IHBhZGRlZCBQIGVsZW1lbnRzIGluc2lkZSBlZGl0b3IgYW5kIHVzZSA8cD4mbmJzcDs8L3A+IG91dHNpZGUgZWRpdG9yDQovKgkJCQlpZiAoby5zZXQpDQoJCQkJCWggPSBoLnJlcGxhY2UoLzxwPlxzKygmbmJzcDt8JiMxNjA7fFx1MDBhMHw8YnIgXC8+KVxzKzxcL3A+L2csICc8cD48YnIgLz48L3A+Jyk7DQoJCQkJZWxzZQ0KCQkJCQloID0gaC5yZXBsYWNlKC88cD5ccysoJm5ic3A7fCYjMTYwO3xcdTAwYTB8PGJyIFwvPilccys8XC9wPi9nLCAnPHA+JDE8L3A+Jyk7Ki8NCg0KCQkJCS8vIFNpbmNlIEdlY2tvIGFuZCBTYWZhcmkga2VlcHMgd2hpdGVzcGFjZSBpbiB0aGUgRE9NIHdlIG5lZWQgdG8NCgkJCQkvLyByZW1vdmUgaXQgaW5vcmRlciB0byBtYXRjaCBvdGhlciBicm93c2Vycy4gQnV0IEkgdGhpbmsgR2Vja28gYW5kIFNhZmFyaSBpcyByaWdodC4NCgkJCQkvLyBUaGlzIHByb2Nlc3MgaXMgb25seSBkb25lIHdoZW4gZ2V0dGluZyBjb250ZW50cyBvdXQgZnJvbSB0aGUgZWRpdG9yLg0KCQkJCWlmICghby5zZXQpIHsNCgkJCQkJLy8gV2UgbmVlZCB0byByZXBsYWNlIHBhcmFncmFwaCB3aGl0ZXNwYWNlIHdpdGggYW4gbmJzcCBiZWZvcmUgaW5kZW50YXRpb24gdG8ga2VlcCB0aGUgXHUwMGEwIGNoYXINCgkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoLzxwPlxzKzxcL3A+fDxwKFtePl0rKT5ccys8XC9wPi9nLCBzLmVudGl0eV9lbmNvZGluZyA9PSAnbnVtZXJpYycgPyAnPHAkMT4mIzE2MDs8L3A+JyA6ICc8cCQxPiZuYnNwOzwvcD4nLCBoKTsNCg0KCQkJCQlpZiAocy5yZW1vdmVfbGluZWJyZWFrcykgew0KCQkJCQkJaCA9IGgucmVwbGFjZSgvXHI/XG58XHIvZywgJyAnKTsNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC8oPFtePl0rPilccysvZywgJyQxICcsIGgpOw0KCQkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoL1xzKyg8XC9bXj5dKz4pL2csICcgJDEnLCBoKTsNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88KHB8aFsxLTZdfGJsb2NrcXVvdGV8aHJ8ZGl2fHRhYmxlfHRib2R5fHRyfHRkfGJvZHl8aGVhZHxodG1sfHRpdGxlfG1ldGF8c3R5bGV8cHJlfHNjcmlwdHxsaW5rfG9iamVjdCkgKFtePl0rKT5ccysvZywgJzwkMSAkMj4nLCBoKTsgLy8gVHJpbSBibG9jayBzdGFydA0KCQkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoLzwocHxoWzEtNl18YmxvY2txdW90ZXxocnxkaXZ8dGFibGV8dGJvZHl8dHJ8dGR8Ym9keXxoZWFkfGh0bWx8dGl0bGV8bWV0YXxzdHlsZXxwcmV8c2NyaXB0fGxpbmt8b2JqZWN0KT5ccysvZywgJzwkMT4nLCBoKTsgLy8gVHJpbSBibG9jayBzdGFydA0KCQkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoL1xzKzxcLyhwfGhbMS02XXxibG9ja3F1b3RlfGhyfGRpdnx0YWJsZXx0Ym9keXx0cnx0ZHxib2R5fGhlYWR8aHRtbHx0aXRsZXxtZXRhfHN0eWxlfHByZXxzY3JpcHR8bGlua3xvYmplY3QpPi9nLCAnPC8kMT4nLCBoKTsgLy8gVHJpbSBibG9jayBlbmQNCgkJCQkJfQ0KDQoJCQkJCS8vIFNpbXBsZSBpbmRlbnRhdGlvbg0KCQkJCQlpZiAocy5hcHBseV9zb3VyY2VfZm9ybWF0dGluZyAmJiBzLmluZGVudF9tb2RlID09ICdzaW1wbGUnKSB7DQoJCQkJCQkvLyBBZGQgbGluZSBicmVha3MgYmVmb3JlIGFuZCBhZnRlciBibG9jayBlbGVtZW50cw0KCQkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoLzwoXC8/KSh1bHxocnx0YWJsZXxtZXRhfGxpbmt8dGJvZHl8dHJ8b2JqZWN0fGJvZHl8aGVhZHxodG1sfG1hcCkofFtePl0rKT5ccyovZywgJ1xuPCQxJDIkMz5cbicsIGgpOw0KCQkJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoL1xzKjwocHxoWzEtNl18YmxvY2txdW90ZXxkaXZ8dGl0bGV8c3R5bGV8cHJlfHNjcmlwdHx0ZHxsaXxhcmVhKSh8W14+XSspPi9nLCAnXG48JDEkMj4nLCBoKTsNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88XC8ocHxoWzEtNl18YmxvY2txdW90ZXxkaXZ8dGl0bGV8c3R5bGV8cHJlfHNjcmlwdHx0ZHxsaSk+XHMqL2csICc8LyQxPlxuJywgaCk7DQoJCQkJCQloID0gaC5yZXBsYWNlKC9cblxuL2csICdcbicpOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJaCA9IHQuX3VucHJvdGVjdChoLCBwKTsNCg0KCQkJCS8vIFJlc3RvcmUgQ0RBVEEgc2VjdGlvbnMNCgkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPCEtLVxbQ0RBVEFcWyhbXHNcU10rKVxdXF0tLT4vZywgJzwhW0NEQVRBWyQxXV0+JywgaCk7DQoNCgkJCQkvLyBSZXN0b3JlIHRoZSBcdTAwYTAgY2hhcmFjdGVyIGlmIHJhdyBtb2RlIGlzIGVuYWJsZWQNCgkJCQlpZiAocy5lbnRpdHlfZW5jb2RpbmcgPT0gJ3JhdycpDQoJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88cD4mbmJzcDs8XC9wPnw8cChbXj5dKyk+Jm5ic3A7PFwvcD4vZywgJzxwJDE+XHUwMGEwPC9wPicsIGgpOw0KDQoJCQkJLy8gUmVzdG9yZSBub3NjcmlwdCBlbGVtZW50cw0KCQkJCWggPSBoLnJlcGxhY2UoLzxub3NjcmlwdChbXj5dK3wpPihbXHNcU10qPyk8XC9ub3NjcmlwdD4vZywgZnVuY3Rpb24odiwgYXR0cmlicywgdGV4dCkgew0KCQkJCQlyZXR1cm4gJzxub3NjcmlwdCcgKyBhdHRyaWJzICsgJz4nICsgdC5kb20uZGVjb2RlKHRleHQucmVwbGFjZSgvPCEtLXwtLT4vZywgJycpKSArICc8L25vc2NyaXB0Pic7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCW8uY29udGVudCA9IGg7DQoJCX0sDQoNCgkJX3NlcmlhbGl6ZU5vZGUgOiBmdW5jdGlvbihuLCBpbm5lcikgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgdyA9IHQud3JpdGVyLCBoYywgZWwsIGNuLCBpLCBsLCBhLCBhdCwgbm8sIHYsIG5uLCBydSwgYXIsIGl2LCBjbG9zZWQsIGtlZXAsIHR5cGUsIHNjb3BlTmFtZTsNCg0KCQkJaWYgKCFzLm5vZGVfZmlsdGVyIHx8IHMubm9kZV9maWx0ZXIobikpIHsNCgkJCQlzd2l0Y2ggKG4ubm9kZVR5cGUpIHsNCgkJCQkJY2FzZSAxOiAvLyBFbGVtZW50DQoJCQkJCQlpZiAobi5oYXNBdHRyaWJ1dGUgPyBuLmhhc0F0dHJpYnV0ZSgnX21jZV9ib2d1cycpIDogbi5nZXRBdHRyaWJ1dGUoJ19tY2VfYm9ndXMnKSkNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCWl2ID0ga2VlcCA9IGZhbHNlOw0KCQkJCQkJaGMgPSBuLmhhc0NoaWxkTm9kZXMoKTsNCgkJCQkJCW5uID0gbi5nZXRBdHRyaWJ1dGUoJ19tY2VfbmFtZScpIHx8IG4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsNCg0KCQkJCQkJLy8gR2V0IGludGVybmFsIHR5cGUNCgkJCQkJCXR5cGUgPSBuLmdldEF0dHJpYnV0ZSgnX21jZV90eXBlJyk7DQoJCQkJCQlpZiAodHlwZSkgew0KCQkJCQkJCWlmICghdC5faW5mby5jbGVhbnVwKSB7DQoJCQkJCQkJCWl2ID0gdHJ1ZTsNCgkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCX0gZWxzZQ0KCQkJCQkJCQlrZWVwID0gMTsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gQWRkIGNvcnJlY3QgcHJlZml4IG9uIElFDQoJCQkJCQlpZiAoaXNJRSkgew0KCQkJCQkJCXNjb3BlTmFtZSA9IG4uc2NvcGVOYW1lOw0KCQkJCQkJCWlmIChzY29wZU5hbWUgJiYgc2NvcGVOYW1lICE9PSAnSFRNTCcgJiYgc2NvcGVOYW1lICE9PSAnaHRtbCcpDQoJCQkJCQkJCW5uID0gc2NvcGVOYW1lICsgJzonICsgbm47DQoJCQkJCQl9DQoNCgkJCQkJCS8vIFJlbW92ZSBtY2UgcHJlZml4IG9uIElFIG5lZWRlZCBmb3IgdGhlIGFiYnIgZWxlbWVudA0KCQkJCQkJaWYgKG5uLmluZGV4T2YoJ21jZTonKSA9PT0gMCkNCgkJCQkJCQlubiA9IG5uLnN1YnN0cmluZyg0KTsNCg0KCQkJCQkJLy8gQ2hlY2sgaWYgdmFsaWQNCgkJCQkJCWlmICgha2VlcCkgew0KCQkJCQkJCWlmICghdC52YWxpZEVsZW1lbnRzUkUgfHwgIXQudmFsaWRFbGVtZW50c1JFLnRlc3Qobm4pIHx8ICh0LmludmFsaWRFbGVtZW50c1JFICYmIHQuaW52YWxpZEVsZW1lbnRzUkUudGVzdChubikpIHx8IGlubmVyKSB7DQoJCQkJCQkJCWl2ID0gdHJ1ZTsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoaXNJRSkgew0KCQkJCQkJCS8vIEZpeCBJRSBjb250ZW50IGR1cGxpY2F0aW9uIChET00gY2FuIGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIG5vZGUpDQoJCQkJCQkJaWYgKHMuZml4X2NvbnRlbnRfZHVwbGljYXRpb24pIHsNCgkJCQkJCQkJaWYgKG4uX21jZV9zZXJpYWxpemVkID09IHQua2V5KQ0KCQkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJCW4uX21jZV9zZXJpYWxpemVkID0gdC5rZXk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gSUUgc29tZXRpbWVzIGFkZHMgYSAvIGluZnJvbnQgb2YgdGhlIG5vZGUgbmFtZQ0KCQkJCQkJCWlmIChubi5jaGFyQXQoMCkgPT0gJy8nKQ0KCQkJCQkJCQlubiA9IG5uLnN1YnN0cmluZygxKTsNCgkJCQkJCX0gZWxzZSBpZiAoaXNHZWNrbykgew0KCQkJCQkJCS8vIElnbm9yZSBiciBlbGVtZW50cw0KCQkJCQkJCWlmIChuLm5vZGVOYW1lID09PSAnQlInICYmIG4uZ2V0QXR0cmlidXRlKCd0eXBlJykgPT0gJ19tb3onKQ0KCQkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCS8vIENoZWNrIGlmIHZhbGlkIGNoaWxkDQoJCQkJCQlpZiAocy52YWxpZGF0ZV9jaGlsZHJlbikgew0KCQkJCQkJCWlmICh0LmVsZW1lbnROYW1lICYmICF0LnNjaGVtYS5pc1ZhbGlkKHQuZWxlbWVudE5hbWUsIG5uKSkgew0KCQkJCQkJCQlpdiA9IHRydWU7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCg0KCQkJCQkJCXQuZWxlbWVudE5hbWUgPSBubjsNCgkJCQkJCX0NCg0KCQkJCQkJcnUgPSB0LmZpbmRSdWxlKG5uKTsNCgkJCQkJCQ0KCQkJCQkJLy8gTm8gdmFsaWQgcnVsZSBmb3IgdGhpcyBlbGVtZW50IGNvdWxkIGJlIGZvdW5kIHRoZW4gc2tpcCBpdA0KCQkJCQkJaWYgKCFydSkgew0KCQkJCQkJCWl2ID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCX0NCg0KCQkJCQkJbm4gPSBydS5uYW1lIHx8IG5uOw0KCQkJCQkJY2xvc2VkID0gcy5jbG9zZWQudGVzdChubik7DQoNCgkJCQkJCS8vIFNraXAgZW1wdHkgbm9kZXMgb3IgZW1wdHkgbm9kZSBuYW1lIGluIElFDQoJCQkJCQlpZiAoKCFoYyAmJiBydS5ub0VtcHR5KSB8fCAoaXNJRSAmJiAhbm4pKSB7DQoJCQkJCQkJaXYgPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBDaGVjayByZXF1aXJlZA0KCQkJCQkJaWYgKHJ1LnJlcXVpcmVkQXR0cmlicykgew0KCQkJCQkJCWEgPSBydS5yZXF1aXJlZEF0dHJpYnM7DQoNCgkJCQkJCQlmb3IgKGkgPSBhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQkJCWlmICh0aGlzLmRvbS5nZXRBdHRyaWIobiwgYVtpXSkgIT09ICcnKQ0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gTm9uZSBvZiB0aGUgcmVxdWlyZWQgd2FzIHRoZXJlDQoJCQkJCQkJaWYgKGkgPT0gLTEpIHsNCgkJCQkJCQkJaXYgPSB0cnVlOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCXcud3JpdGVTdGFydEVsZW1lbnQobm4pOw0KDQoJCQkJCQkvLyBBZGQgb3JkZXJlZCBhdHRyaWJ1dGVzDQoJCQkJCQlpZiAocnUuYXR0cmlicykgew0KCQkJCQkJCWZvciAoaT0wLCBhdCA9IHJ1LmF0dHJpYnMsIGwgPSBhdC5sZW5ndGg7IGk8bDsgaSsrKSB7DQoJCQkJCQkJCWEgPSBhdFtpXTsNCgkJCQkJCQkJdiA9IHQuX2dldEF0dHJpYihuLCBhKTsNCg0KCQkJCQkJCQlpZiAodiAhPT0gbnVsbCkNCgkJCQkJCQkJCXcud3JpdGVBdHRyaWJ1dGUoYS5uYW1lLCB2KTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEFkZCB3aWxkIGF0dHJpYnV0ZXMNCgkJCQkJCWlmIChydS52YWxpZEF0dHJpYnNSRSkgew0KCQkJCQkJCWF0ID0gdC5kb20uZ2V0QXR0cmlicyhuKTsNCgkJCQkJCQlmb3IgKGk9YXQubGVuZ3RoLTE7IGk+LTE7IGktLSkgew0KCQkJCQkJCQlubyA9IGF0W2ldOw0KDQoJCQkJCQkJCWlmIChuby5zcGVjaWZpZWQpIHsNCgkJCQkJCQkJCWEgPSBuby5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KDQoJCQkJCQkJCQlpZiAocy5pbnZhbGlkX2F0dHJzLnRlc3QoYSkgfHwgIXJ1LnZhbGlkQXR0cmlic1JFLnRlc3QoYSkpDQoJCQkJCQkJCQkJY29udGludWU7DQoNCgkJCQkJCQkJCWFyID0gdC5maW5kQXR0cmliUnVsZShydSwgYSk7DQoJCQkJCQkJCQl2ID0gdC5fZ2V0QXR0cmliKG4sIGFyLCBhKTsNCg0KCQkJCQkJCQkJaWYgKHYgIT09IG51bGwpDQoJCQkJCQkJCQkJdy53cml0ZUF0dHJpYnV0ZShhLCB2KTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJLy8gS2VlcCB0eXBlIGF0dHJpYnV0ZQ0KCQkJCQkJaWYgKHR5cGUgJiYga2VlcCkNCgkJCQkJCQl3LndyaXRlQXR0cmlidXRlKCdfbWNlX3R5cGUnLCB0eXBlKTsNCg0KCQkJCQkJLy8gV3JpdGUgdGV4dCBmcm9tIHNjcmlwdA0KCQkJCQkJaWYgKG5uID09PSAnc2NyaXB0JyAmJiB0aW55bWNlLnRyaW0obi5pbm5lckhUTUwpKSB7DQoJCQkJCQkJdy53cml0ZVRleHQoJy8vICcpOyAvLyBQYWRkIGl0IHdpdGggYSBjb21tZW50IHNvIGl0IHdpbGwgcGFyc2Ugb24gb2xkZXIgYnJvd3NlcnMNCgkJCQkJCQl3LndyaXRlQ0RBVEEobi5pbm5lckhUTUwucmVwbGFjZSgvPCEtLXwtLT58PFxbQ0RBVEFcW3xcXVxdPi9nLCAnJykpOyAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGNkYXRhIHN0dWN0dXJlcw0KCQkJCQkJCWhjID0gZmFsc2U7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIFBhZGQgZW1wdHkgbm9kZXMgd2l0aCBhICZuYnNwOw0KCQkJCQkJaWYgKHJ1LnBhZGQpIHsNCgkJCQkJCQkvLyBJZiBpdCBoYXMgb25seSBvbmUgYm9ndXMgY2hpbGQsIHBhZGQgaXQgYW55d2F5IHdvcmthcm91bmQgZm9yIDx0ZD48YnIgLz48L3RkPiBidWcNCgkJCQkJCQlpZiAoaGMgJiYgKGNuID0gbi5maXJzdENoaWxkKSAmJiBjbi5ub2RlVHlwZSA9PT0gMSAmJiBuLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7DQoJCQkJCQkJCWlmIChjbi5oYXNBdHRyaWJ1dGUgPyBjbi5oYXNBdHRyaWJ1dGUoJ19tY2VfYm9ndXMnKSA6IGNuLmdldEF0dHJpYnV0ZSgnX21jZV9ib2d1cycpKQ0KCQkJCQkJCQkJdy53cml0ZVRleHQoJ1x1MDBhMCcpOw0KCQkJCQkJCX0gZWxzZSBpZiAoIWhjKQ0KCQkJCQkJCQl3LndyaXRlVGV4dCgnXHUwMGEwJyk7IC8vIE5vIGNoaWxkcmVuIHRoZW4gcGFkZCBpdA0KCQkJCQkJfQ0KDQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlIDM6IC8vIFRleHQNCgkJCQkJCS8vIENoZWNrIGlmIHZhbGlkIGNoaWxkDQoJCQkJCQlpZiAocy52YWxpZGF0ZV9jaGlsZHJlbiAmJiB0LmVsZW1lbnROYW1lICYmICF0LnNjaGVtYS5pc1ZhbGlkKHQuZWxlbWVudE5hbWUsICcjdGV4dCcpKQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJcmV0dXJuIHcud3JpdGVUZXh0KG4ubm9kZVZhbHVlKTsNCg0KCQkJCQljYXNlIDQ6IC8vIENEQVRBDQoJCQkJCQlyZXR1cm4gdy53cml0ZUNEQVRBKG4ubm9kZVZhbHVlKTsNCg0KCQkJCQljYXNlIDg6IC8vIENvbW1lbnQNCgkJCQkJCXJldHVybiB3LndyaXRlQ29tbWVudChuLm5vZGVWYWx1ZSk7DQoJCQkJfQ0KCQkJfSBlbHNlIGlmIChuLm5vZGVUeXBlID09IDEpDQoJCQkJaGMgPSBuLmhhc0NoaWxkTm9kZXMoKTsNCg0KCQkJaWYgKGhjICYmICFjbG9zZWQpIHsNCgkJCQljbiA9IG4uZmlyc3RDaGlsZDsNCg0KCQkJCXdoaWxlIChjbikgew0KCQkJCQl0Ll9zZXJpYWxpemVOb2RlKGNuKTsNCgkJCQkJdC5lbGVtZW50TmFtZSA9IG5uOw0KCQkJCQljbiA9IGNuLm5leHRTaWJsaW5nOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gV3JpdGUgZWxlbWVudCBlbmQNCgkJCWlmICghaXYpIHsNCgkJCQlpZiAoIWNsb3NlZCkNCgkJCQkJdy53cml0ZUZ1bGxFbmRFbGVtZW50KCk7DQoJCQkJZWxzZQ0KCQkJCQl3LndyaXRlRW5kRWxlbWVudCgpOw0KCQkJfQ0KCQl9LA0KDQoJCV9wcm90ZWN0IDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlvLml0ZW1zID0gby5pdGVtcyB8fCBbXTsNCg0KCQkJZnVuY3Rpb24gZW5jKHMpIHsNCgkJCQlyZXR1cm4gcy5yZXBsYWNlKC9bXHJcblxcXS9nLCBmdW5jdGlvbihjKSB7DQoJCQkJCWlmIChjID09PSAnXG4nKQ0KCQkJCQkJcmV0dXJuICdcXG4nOw0KCQkJCQllbHNlIGlmIChjID09PSAnXFwnKQ0KCQkJCQkJcmV0dXJuICdcXFxcJzsNCg0KCQkJCQlyZXR1cm4gJ1xccic7DQoJCQkJfSk7DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBkZWMocykgew0KCQkJCXJldHVybiBzLnJlcGxhY2UoL1xcW1xccm5dL2csIGZ1bmN0aW9uKGMpIHsNCgkJCQkJaWYgKGMgPT09ICdcXG4nKQ0KCQkJCQkJcmV0dXJuICdcbic7DQoJCQkJCWVsc2UgaWYgKGMgPT09ICdcXFxcJykNCgkJCQkJCXJldHVybiAnXFwnOw0KDQoJCQkJCXJldHVybiAnXHInOw0KCQkJCX0pOw0KCQkJfTsNCg0KCQkJZWFjaChvLnBhdHRlcm5zLCBmdW5jdGlvbihwKSB7DQoJCQkJby5jb250ZW50ID0gZGVjKGVuYyhvLmNvbnRlbnQpLnJlcGxhY2UocC5wYXR0ZXJuLCBmdW5jdGlvbih4LCBhLCBiLCBjKSB7DQoJCQkJCWIgPSBkZWMoYik7DQoNCgkJCQkJaWYgKHAuZW5jb2RlKQ0KCQkJCQkJYiA9IHQuX2VuY29kZShiKTsNCg0KCQkJCQlvLml0ZW1zLnB1c2goYik7DQoJCQkJCXJldHVybiBhICsgJzwhLS1tY2U6JyArIChvLml0ZW1zLmxlbmd0aCAtIDEpICsgJy0tPicgKyBjOw0KCQkJCX0pKTsNCgkJCX0pOw0KDQoJCQlyZXR1cm4gbzsNCgkJfSwNCg0KCQlfdW5wcm90ZWN0IDogZnVuY3Rpb24oaCwgbykgew0KCQkJaCA9IGgucmVwbGFjZSgvXDwhLS1tY2U6KFswLTldKyktLVw+L2csIGZ1bmN0aW9uKGEsIGIpIHsNCgkJCQlyZXR1cm4gby5pdGVtc1twYXJzZUludChiKV07DQoJCQl9KTsNCg0KCQkJby5pdGVtcyA9IFtdOw0KDQoJCQlyZXR1cm4gaDsNCgkJfSwNCg0KCQlfZW5jb2RlIDogZnVuY3Rpb24oaCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgbDsNCg0KCQkJLy8gRW50aXR5IGVuY29kZQ0KCQkJaWYgKHMuZW50aXR5X2VuY29kaW5nICE9PSAncmF3Jykgew0KCQkJCWlmIChzLmVudGl0eV9lbmNvZGluZy5pbmRleE9mKCduYW1lZCcpICE9IC0xKSB7DQoJCQkJCXQuc2V0RW50aXRpZXMocy5lbnRpdGllcyk7DQoJCQkJCWwgPSB0LmVudGl0eUxvb2t1cDsNCg0KCQkJCQloID0gaC5yZXBsYWNlKC9bXHUwMDdFLVx1RkZGRl0vZywgZnVuY3Rpb24oYSkgew0KCQkJCQkJdmFyIHY7DQoNCgkJCQkJCWlmICh2ID0gbFthXSkNCgkJCQkJCQlhID0gJyYnICsgdiArICc7JzsNCg0KCQkJCQkJcmV0dXJuIGE7DQoJCQkJCX0pOw0KCQkJCX0NCg0KCQkJCWlmIChzLmVudGl0eV9lbmNvZGluZy5pbmRleE9mKCdudW1lcmljJykgIT0gLTEpIHsNCgkJCQkJaCA9IGgucmVwbGFjZSgvW1x1MDA3RS1cdUZGRkZdL2csIGZ1bmN0aW9uKGEpIHsNCgkJCQkJCXJldHVybiAnJiMnICsgYS5jaGFyQ29kZUF0KDApICsgJzsnOw0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiBoOw0KCQl9LA0KDQoJCV9zZXR1cCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdGhpcy5zZXR0aW5nczsNCg0KCQkJaWYgKHQuZG9uZSkNCgkJCQlyZXR1cm47DQoNCgkJCXQuZG9uZSA9IDE7DQoNCgkJCXQuc2V0UnVsZXMocy52YWxpZF9lbGVtZW50cyk7DQoJCQl0LmFkZFJ1bGVzKHMuZXh0ZW5kZWRfdmFsaWRfZWxlbWVudHMpOw0KDQoJCQlpZiAocy5pbnZhbGlkX2VsZW1lbnRzKQ0KCQkJCXQuaW52YWxpZEVsZW1lbnRzUkUgPSBuZXcgUmVnRXhwKCdeKCcgKyB3aWxkY2FyZFRvUkUocy5pbnZhbGlkX2VsZW1lbnRzLnJlcGxhY2UoLywvZywgJ3wnKS50b0xvd2VyQ2FzZSgpKSArICcpJCcpOw0KDQoJCQlpZiAocy5hdHRyaWJfdmFsdWVfZmlsdGVyKQ0KCQkJCXQuYXR0cmliVmFsdWVGaWx0ZXIgPSBzLmF0dHJpYlZhbHVlRmlsdGVyOw0KCQl9LA0KDQoJCV9nZXRBdHRyaWIgOiBmdW5jdGlvbihuLCBhLCBuYSkgew0KCQkJdmFyIGksIHY7DQoNCgkJCW5hID0gbmEgfHwgYS5uYW1lOw0KDQoJCQlpZiAoYS5mb3JjZWRWYWwgJiYgKHYgPSBhLmZvcmNlZFZhbCkpIHsNCgkJCQlpZiAodiA9PT0gJ3skdWlkfScpDQoJCQkJCXJldHVybiB0aGlzLmRvbS51bmlxdWVJZCgpOw0KDQoJCQkJcmV0dXJuIHY7DQoJCQl9DQoNCgkJCXYgPSB0aGlzLmRvbS5nZXRBdHRyaWIobiwgbmEpOw0KDQoJCQlzd2l0Y2ggKG5hKSB7DQoJCQkJY2FzZSAncm93c3Bhbic6DQoJCQkJY2FzZSAnY29sc3Bhbic6DQoJCQkJCS8vIFdoYXRzIHRoZSBwb2ludD8gUmVtb3ZlIHVzbGVzcyBhdHRyaWJ1dGUgdmFsdWUNCgkJCQkJaWYgKHYgPT0gJzEnKQ0KCQkJCQkJdiA9ICcnOw0KDQoJCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQlpZiAodGhpcy5hdHRyaWJWYWx1ZUZpbHRlcikNCgkJCQl2ID0gdGhpcy5hdHRyaWJWYWx1ZUZpbHRlcihuYSwgdiwgbik7DQoNCgkJCWlmIChhLnZhbGlkVmFscykgew0KCQkJCWZvciAoaSA9IGEudmFsaWRWYWxzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCWlmICh2ID09IGEudmFsaWRWYWxzW2ldKQ0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJaWYgKGkgPT0gLTEpDQoJCQkJCXJldHVybiBudWxsOw0KCQkJfQ0KDQoJCQlpZiAodiA9PT0gJycgJiYgdHlwZW9mKGEuZGVmYXVsdFZhbCkgIT0gJ3VuZGVmaW5lZCcpIHsNCgkJCQl2ID0gYS5kZWZhdWx0VmFsOw0KDQoJCQkJaWYgKHYgPT09ICd7JHVpZH0nKQ0KCQkJCQlyZXR1cm4gdGhpcy5kb20udW5pcXVlSWQoKTsNCg0KCQkJCXJldHVybiB2Ow0KCQkJfSBlbHNlIHsNCgkJCQkvLyBSZW1vdmUgaW50ZXJuYWwgbWNlSXRlbVhYIGNsYXNzZXMgd2hlbiBjb250ZW50IGlzIGV4dHJhY3RlZCBmcm9tIGVkaXRvcg0KCQkJCWlmIChuYSA9PSAnY2xhc3MnICYmIHRoaXMucHJvY2Vzc09iai5nZXQpDQoJCQkJCXYgPSB2LnJlcGxhY2UoL1xzP21jZUl0ZW1cdytccz8vZywgJycpOw0KCQkJfQ0KDQoJCQlpZiAodiA9PT0gJycpDQoJCQkJcmV0dXJuIG51bGw7DQoNCg0KCQkJcmV0dXJuIHY7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXRpbnltY2UuZG9tLlNjcmlwdExvYWRlciA9IGZ1bmN0aW9uKHNldHRpbmdzKSB7DQoJCXZhciBRVUVVRUQgPSAwLA0KCQkJTE9BRElORyA9IDEsDQoJCQlMT0FERUQgPSAyLA0KCQkJc3RhdGVzID0ge30sDQoJCQlxdWV1ZSA9IFtdLA0KCQkJc2NyaXB0TG9hZGVkQ2FsbGJhY2tzID0ge30sDQoJCQlxdWV1ZUxvYWRlZENhbGxiYWNrcyA9IFtdLA0KCQkJbG9hZGluZyA9IDAsDQoJCQl1bmRlZmluZWQ7DQoNCgkJZnVuY3Rpb24gbG9hZFNjcmlwdCh1cmwsIGNhbGxiYWNrKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGRvbSA9IHRpbnltY2UuRE9NLCBlbG0sIHVyaSwgbG9jLCBpZDsNCg0KCQkJLy8gRXhlY3V0ZSBjYWxsYmFjayB3aGVuIHNjcmlwdCBpcyBsb2FkZWQNCgkJCWZ1bmN0aW9uIGRvbmUoKSB7DQoJCQkJZG9tLnJlbW92ZShpZCk7DQoNCgkJCQlpZiAoZWxtKQ0KCQkJCQllbG0ub25yZWFkeXN0YXRlY2hhbmdlID0gZWxtLm9ubG9hZCA9IGVsbSA9IG51bGw7DQoNCgkJCQljYWxsYmFjaygpOw0KCQkJfTsNCg0KCQkJaWQgPSBkb20udW5pcXVlSWQoKTsNCg0KCQkJaWYgKHRpbnltY2UuaXNJRTYpIHsNCgkJCQl1cmkgPSBuZXcgdGlueW1jZS51dGlsLlVSSSh1cmwpOw0KCQkJCWxvYyA9IGxvY2F0aW9uOw0KDQoJCQkJLy8gSWYgc2NyaXB0IGlzIGZyb20gc2FtZSBkb21haW4gYW5kIHdlDQoJCQkJLy8gdXNlIElFIDYgdGhlbiB1c2UgWEhSIHNpbmNlIGl0J3MgbW9yZSByZWxpYWJsZQ0KCQkJCWlmICh1cmkuaG9zdCA9PSBsb2MuaG9zdG5hbWUgJiYgdXJpLnBvcnQgPT0gbG9jLnBvcnQgJiYgKHVyaS5wcm90b2NvbCArICc6JykgPT0gbG9jLnByb3RvY29sKSB7DQoJCQkJCXRpbnltY2UudXRpbC5YSFIuc2VuZCh7DQoJCQkJCQl1cmwgOiB0aW55bWNlLl9hZGRWZXIodXJpLmdldFVSSSgpKSwNCgkJCQkJCXN1Y2Nlc3MgOiBmdW5jdGlvbihjb250ZW50KSB7DQoJCQkJCQkJLy8gQ3JlYXRlIG5ldyB0ZW1wIHNjcmlwdCBlbGVtZW50DQoJCQkJCQkJdmFyIHNjcmlwdCA9IGRvbS5jcmVhdGUoJ3NjcmlwdCcsIHsNCgkJCQkJCQkJdHlwZSA6ICd0ZXh0L2phdmFzY3JpcHQnDQoJCQkJCQkJfSk7DQoNCgkJCQkJCQkvLyBFdmFsdWF0ZSBzY3JpcHQgaW4gZ2xvYmFsIHNjb3BlDQoJCQkJCQkJc2NyaXB0LnRleHQgPSBjb250ZW50Ow0KCQkJCQkJCWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsNCgkJCQkJCQlkb20ucmVtb3ZlKHNjcmlwdCk7DQoNCgkJCQkJCQlkb25lKCk7DQoJCQkJCQl9DQoJCQkJCX0pOw0KDQoJCQkJCXJldHVybjsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIENyZWF0ZSBuZXcgc2NyaXB0IGVsZW1lbnQNCgkJCWVsbSA9IGRvbS5jcmVhdGUoJ3NjcmlwdCcsIHsNCgkJCQlpZCA6IGlkLA0KCQkJCXR5cGUgOiAndGV4dC9qYXZhc2NyaXB0JywNCgkJCQlzcmMgOiB0aW55bWNlLl9hZGRWZXIodXJsKQ0KCQkJfSk7DQoNCgkJCS8vIEFkZCBvbmxvYWQgbGlzdGVuZXIgZm9yIG5vbiBJRSBicm93c2VycyBzaW5jZSBJRTkNCgkJCS8vIGZpcmVzIG9ubG9hZCBldmVudCBiZWZvcmUgdGhlIHNjcmlwdCBpcyBwYXJzZWQgYW5kIGV4ZWN1dGVkDQoJCQlpZiAoIXRpbnltY2UuaXNJRSkNCgkJCQllbG0ub25sb2FkID0gZG9uZTsNCg0KCQkJZWxtLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgew0KCQkJCXZhciBzdGF0ZSA9IGVsbS5yZWFkeVN0YXRlOw0KDQoJCQkJLy8gTG9hZGVkIHN0YXRlIGlzIHBhc3NlZCBvbiBJRSA2IGhvd2V2ZXIgdGhlcmUNCgkJCQkvLyBhcmUga25vd24gaXNzdWVzIHdpdGggdGhpcyBtZXRob2QgYnV0IHdlIGNhbid0IHVzZQ0KCQkJCS8vIFhIUiBpbiBhIGNyb3NzIGRvbWFpbiBsb2FkaW5nDQoJCQkJaWYgKHN0YXRlID09ICdjb21wbGV0ZScgfHwgc3RhdGUgPT0gJ2xvYWRlZCcpDQoJCQkJCWRvbmUoKTsNCgkJCX07DQoNCgkJCS8vIE1vc3QgYnJvd3NlcnMgc3VwcG9ydCB0aGlzIGZlYXR1cmUgc28gd2UgcmVwb3J0IGVycm9ycw0KCQkJLy8gZm9yIHRob3NlIGF0IGxlYXN0IHRvIGhlbHAgdXNlcnMgdHJhY2sgdGhlaXIgbWlzc2luZyBwbHVnaW5zIGV0Yw0KCQkJLy8gdG9kbzogUmVtb3ZlZCBzaW5jZSBpdCBwcm9kdWNlZCBlcnJvciBpZiB0aGUgZG9jdW1lbnQgaXMgdW5sb2FkZWQgYnkgbmF2aWdhdGluZyBhd2F5LCByZS1hZGQgaXQgYXMgYW4gb3B0aW9uDQoJCQkvKmVsbS5vbmVycm9yID0gZnVuY3Rpb24oKSB7DQoJCQkJYWxlcnQoJ0ZhaWxlZCB0byBsb2FkOiAnICsgdXJsKTsNCgkJCX07Ki8NCg0KCQkJLy8gQWRkIHNjcmlwdCB0byBkb2N1bWVudA0KCQkJKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0gfHwgZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQoZWxtKTsNCgkJfTsNCg0KCQl0aGlzLmlzRG9uZSA9IGZ1bmN0aW9uKHVybCkgew0KCQkJcmV0dXJuIHN0YXRlc1t1cmxdID09IExPQURFRDsNCgkJfTsNCg0KCQl0aGlzLm1hcmtEb25lID0gZnVuY3Rpb24odXJsKSB7DQoJCQlzdGF0ZXNbdXJsXSA9IExPQURFRDsNCgkJfTsNCg0KCQl0aGlzLmFkZCA9IHRoaXMubG9hZCA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2ssIHNjb3BlKSB7DQoJCQl2YXIgaXRlbSwgc3RhdGUgPSBzdGF0ZXNbdXJsXTsNCg0KCQkJLy8gQWRkIHVybCB0byBsb2FkIHF1ZXVlDQoJCQlpZiAoc3RhdGUgPT0gdW5kZWZpbmVkKSB7DQoJCQkJcXVldWUucHVzaCh1cmwpOw0KCQkJCXN0YXRlc1t1cmxdID0gUVVFVUVEOw0KCQkJfQ0KDQoJCQlpZiAoY2FsbGJhY2spIHsNCgkJCQkvLyBTdG9yZSBhd2F5IGNhbGxiYWNrIGZvciBsYXRlciBleGVjdXRpb24NCgkJCQlpZiAoIXNjcmlwdExvYWRlZENhbGxiYWNrc1t1cmxdKQ0KCQkJCQlzY3JpcHRMb2FkZWRDYWxsYmFja3NbdXJsXSA9IFtdOw0KDQoJCQkJc2NyaXB0TG9hZGVkQ2FsbGJhY2tzW3VybF0ucHVzaCh7DQoJCQkJCWZ1bmMgOiBjYWxsYmFjaywNCgkJCQkJc2NvcGUgOiBzY29wZSB8fCB0aGlzDQoJCQkJfSk7DQoJCQl9DQoJCX07DQoNCgkJdGhpcy5sb2FkUXVldWUgPSBmdW5jdGlvbihjYWxsYmFjaywgc2NvcGUpIHsNCgkJCXRoaXMubG9hZFNjcmlwdHMocXVldWUsIGNhbGxiYWNrLCBzY29wZSk7DQoJCX07DQoNCgkJdGhpcy5sb2FkU2NyaXB0cyA9IGZ1bmN0aW9uKHNjcmlwdHMsIGNhbGxiYWNrLCBzY29wZSkgew0KCQkJdmFyIGxvYWRTY3JpcHRzOw0KDQoJCQlmdW5jdGlvbiBleGVjU2NyaXB0TG9hZGVkQ2FsbGJhY2tzKHVybCkgew0KCQkJCS8vIEV4ZWN1dGUgVVJMIGNhbGxiYWNrIGZ1bmN0aW9ucw0KCQkJCXRpbnltY2UuZWFjaChzY3JpcHRMb2FkZWRDYWxsYmFja3NbdXJsXSwgZnVuY3Rpb24oY2FsbGJhY2spIHsNCgkJCQkJY2FsbGJhY2suZnVuYy5jYWxsKGNhbGxiYWNrLnNjb3BlKTsNCgkJCQl9KTsNCg0KCQkJCXNjcmlwdExvYWRlZENhbGxiYWNrc1t1cmxdID0gdW5kZWZpbmVkOw0KCQkJfTsNCg0KCQkJcXVldWVMb2FkZWRDYWxsYmFja3MucHVzaCh7DQoJCQkJZnVuYyA6IGNhbGxiYWNrLA0KCQkJCXNjb3BlIDogc2NvcGUgfHwgdGhpcw0KCQkJfSk7DQoNCgkJCWxvYWRTY3JpcHRzID0gZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGxvYWRpbmdTY3JpcHRzID0gdGlueW1jZS5ncmVwKHNjcmlwdHMpOw0KDQoJCQkJLy8gQ3VycmVudCBzY3JpcHRzIGhhcyBiZWVuIGhhbmRsZWQNCgkJCQlzY3JpcHRzLmxlbmd0aCA9IDA7DQoNCgkJCQkvLyBMb2FkIHNjcmlwdHMgdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQNCgkJCQl0aW55bWNlLmVhY2gobG9hZGluZ1NjcmlwdHMsIGZ1bmN0aW9uKHVybCkgew0KCQkJCQkvLyBTY3JpcHQgaXMgYWxyZWFkeSBsb2FkZWQgdGhlbiBleGVjdXRlIHNjcmlwdCBjYWxsYmFja3MgZGlyZWN0bHkNCgkJCQkJaWYgKHN0YXRlc1t1cmxdID09IExPQURFRCkgew0KCQkJCQkJZXhlY1NjcmlwdExvYWRlZENhbGxiYWNrcyh1cmwpOw0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoNCgkJCQkJLy8gSXMgc2NyaXB0IG5vdCBsb2FkaW5nIHRoZW4gc3RhcnQgbG9hZGluZyBpdA0KCQkJCQlpZiAoc3RhdGVzW3VybF0gIT0gTE9BRElORykgew0KCQkJCQkJc3RhdGVzW3VybF0gPSBMT0FESU5HOw0KCQkJCQkJbG9hZGluZysrOw0KDQoJCQkJCQlsb2FkU2NyaXB0KHVybCwgZnVuY3Rpb24oKSB7DQoJCQkJCQkJc3RhdGVzW3VybF0gPSBMT0FERUQ7DQoJCQkJCQkJbG9hZGluZy0tOw0KDQoJCQkJCQkJZXhlY1NjcmlwdExvYWRlZENhbGxiYWNrcyh1cmwpOw0KDQoJCQkJCQkJLy8gTG9hZCBtb3JlIHNjcmlwdHMgaWYgdGhleSB3aGVyZSBhZGRlZCBieSB0aGUgcmVjZW50bHkgbG9hZGVkIHNjcmlwdA0KCQkJCQkJCWxvYWRTY3JpcHRzKCk7DQoJCQkJCQl9KTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJLy8gTm8gc2NyaXB0cyBhcmUgY3VycmVudGx5IGxvYWRpbmcgdGhlbiBleGVjdXRlIGFsbCBwZW5kaW5nIHF1ZXVlIGxvYWRlZCBjYWxsYmFja3MNCgkJCQlpZiAoIWxvYWRpbmcpIHsNCgkJCQkJdGlueW1jZS5lYWNoKHF1ZXVlTG9hZGVkQ2FsbGJhY2tzLCBmdW5jdGlvbihjYWxsYmFjaykgew0KCQkJCQkJY2FsbGJhY2suZnVuYy5jYWxsKGNhbGxiYWNrLnNjb3BlKTsNCgkJCQkJfSk7DQoNCgkJCQkJcXVldWVMb2FkZWRDYWxsYmFja3MubGVuZ3RoID0gMDsNCgkJCQl9DQoJCQl9Ow0KDQoJCQlsb2FkU2NyaXB0cygpOw0KCQl9Ow0KCX07DQoNCgkvLyBHbG9iYWwgc2NyaXB0IGxvYWRlcg0KCXRpbnltY2UuU2NyaXB0TG9hZGVyID0gbmV3IHRpbnltY2UuZG9tLlNjcmlwdExvYWRlcigpOw0KfSkodGlueW1jZSk7DQoNCnRpbnltY2UuZG9tLlRyZWVXYWxrZXIgPSBmdW5jdGlvbihzdGFydF9ub2RlLCByb290X25vZGUpIHsNCgl2YXIgbm9kZSA9IHN0YXJ0X25vZGU7DQoNCglmdW5jdGlvbiBmaW5kU2libGluZyhub2RlLCBzdGFydF9uYW1lLCBzaWJsaW5nX25hbWUsIHNoYWxsb3cpIHsNCgkJdmFyIHNpYmxpbmcsIHBhcmVudDsNCg0KCQlpZiAobm9kZSkgew0KCQkJLy8gV2FsayBpbnRvIG5vZGVzIGlmIGl0IGhhcyBhIHN0YXJ0DQoJCQlpZiAoIXNoYWxsb3cgJiYgbm9kZVtzdGFydF9uYW1lXSkNCgkJCQlyZXR1cm4gbm9kZVtzdGFydF9uYW1lXTsNCg0KCQkJLy8gUmV0dXJuIHRoZSBzaWJsaW5nIGlmIGl0IGhhcyBvbmUNCgkJCWlmIChub2RlICE9IHJvb3Rfbm9kZSkgew0KCQkJCXNpYmxpbmcgPSBub2RlW3NpYmxpbmdfbmFtZV07DQoJCQkJaWYgKHNpYmxpbmcpDQoJCQkJCXJldHVybiBzaWJsaW5nOw0KDQoJCQkJLy8gV2FsayB1cCB0aGUgcGFyZW50cyB0byBsb29rIGZvciBzaWJsaW5ncw0KCQkJCWZvciAocGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOyBwYXJlbnQgJiYgcGFyZW50ICE9IHJvb3Rfbm9kZTsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGUpIHsNCgkJCQkJc2libGluZyA9IHBhcmVudFtzaWJsaW5nX25hbWVdOw0KCQkJCQlpZiAoc2libGluZykNCgkJCQkJCXJldHVybiBzaWJsaW5nOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX07DQoNCgl0aGlzLmN1cnJlbnQgPSBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIG5vZGU7DQoJfTsNCg0KCXRoaXMubmV4dCA9IGZ1bmN0aW9uKHNoYWxsb3cpIHsNCgkJcmV0dXJuIChub2RlID0gZmluZFNpYmxpbmcobm9kZSwgJ2ZpcnN0Q2hpbGQnLCAnbmV4dFNpYmxpbmcnLCBzaGFsbG93KSk7DQoJfTsNCg0KCXRoaXMucHJldiA9IGZ1bmN0aW9uKHNoYWxsb3cpIHsNCgkJcmV0dXJuIChub2RlID0gZmluZFNpYmxpbmcobm9kZSwgJ2xhc3RDaGlsZCcsICdsYXN0U2libGluZycsIHNoYWxsb3cpKTsNCgl9Ow0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KCXZhciB0cmFuc2l0aW9uYWwgPSB7fTsNCg0KCWZ1bmN0aW9uIHVucGFjayhsb29rdXAsIGRhdGEpIHsNCgkJdmFyIGtleTsNCg0KCQlmdW5jdGlvbiByZXBsYWNlKHZhbHVlKSB7DQoJCQlyZXR1cm4gdmFsdWUucmVwbGFjZSgvW0EtWl0rL2csIGZ1bmN0aW9uKGtleSkgew0KCQkJCXJldHVybiByZXBsYWNlKGxvb2t1cFtrZXldKTsNCgkJCX0pOw0KCQl9Ow0KDQoJCS8vIFVucGFjayBsb29rdXANCgkJZm9yIChrZXkgaW4gbG9va3VwKSB7DQoJCQlpZiAobG9va3VwLmhhc093blByb3BlcnR5KGtleSkpDQoJCQkJbG9va3VwW2tleV0gPSByZXBsYWNlKGxvb2t1cFtrZXldKTsNCgkJfQ0KDQoJCS8vIFVucGFjayBhbmQgcGFyc2UgZGF0YSBpbnRvIG9iamVjdCBtYXANCgkJcmVwbGFjZShkYXRhKS5yZXBsYWNlKC8jL2csICcjdGV4dCcpLnJlcGxhY2UoLyhcdyspXFsoW15cXV0rKVxdL2csIGZ1bmN0aW9uKHN0ciwgbmFtZSwgY2hpbGRyZW4pIHsNCgkJCXZhciBpLCBtYXAgPSB7fTsNCg0KCQkJY2hpbGRyZW4gPSBjaGlsZHJlbi5zcGxpdCgvXHwvKTsNCg0KCQkJZm9yIChpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pDQoJCQkJbWFwW2NoaWxkcmVuW2ldXSA9IDE7DQoNCgkJCXRyYW5zaXRpb25hbFtuYW1lXSA9IG1hcDsNCgkJfSk7DQoJfTsNCg0KCS8vIFRoaXMgaXMgdGhlIFhIVE1MIDEuMCB0cmFuc2l0aW9uYWwgZWxlbWVudHMgd2l0aCBpdCdzIGNoaWxkcmVuIHBhY2tlZCB0byByZWR1Y2UgaXQncyBzaXplDQoJLy8gd2Ugd2lsbCBsYXRlciBpbmNsdWRlIHRoZSBhdHRyaWJ1dGVzIGhlcmUgYW5kIHVzZSBpdCBhcyBhIGRlZmF1bHQgZm9yIHZhbGlkIGVsZW1lbnRzIGJ1dCBpdA0KCS8vIHJlcXVpcmVzIHVzIHRvIHJld3JpdGUgdGhlIHNlcmlhbGl6ZXIgZW5naW5lDQoJdW5wYWNrKHsNCgkJWiA6ICcjfEh8S3xOfE98UCcsDQoJCVkgOiAnI3xYfGZvcm18UnxRJywNCgkJWCA6ICdwfFR8ZGl2fFV8V3xpc2luZGV4fGZpZWxkc2V0fHRhYmxlJywNCgkJVyA6ICdwcmV8aHJ8YmxvY2txdW90ZXxhZGRyZXNzfGNlbnRlcnxub2ZyYW1lcycsDQoJCVUgOiAndWx8b2x8ZGx8bWVudXxkaXInLA0KCQlaQyA6ICcjfHB8WXxkaXZ8VXxXfHRhYmxlfGJyfHNwYW58YmRvfG9iamVjdHxhcHBsZXR8aW1nfG1hcHxLfE58UScsDQoJCVQgOiAnaDF8aDJ8aDN8aDR8aDV8aDYnLA0KCQlaQiA6ICcjfFh8U3xRJywNCgkJUyA6ICdSfFAnLA0KCQlaQSA6ICcjfGF8R3xKfE18T3xQJywNCgkJUiA6ICcjfGF8SHxLfE58TycsDQoJCVEgOiAnbm9zY3JpcHR8UCcsDQoJCVAgOiAnaW5zfGRlbHxzY3JpcHQnLA0KCQlPIDogJ2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxsYWJlbHxidXR0b24nLA0KCQlOIDogJ018TCcsDQoJCU0gOiAnZW18c3Ryb25nfGRmbnxjb2RlfHF8c2FtcHxrYmR8dmFyfGNpdGV8YWJicnxhY3JvbnltJywNCgkJTCA6ICdzdWJ8c3VwJywNCgkJSyA6ICdKfEknLA0KCQlKIDogJ3R0fGl8Ynx1fHN8c3RyaWtlJywNCgkJSSA6ICdiaWd8c21hbGx8Zm9udHxiYXNlZm9udCcsDQoJCUggOiAnR3xGJywNCgkJRyA6ICdicnxzcGFufGJkbycsDQoJCUYgOiAnb2JqZWN0fGFwcGxldHxpbWd8bWFwfGlmcmFtZScNCgl9LCAnc2NyaXB0W10nICsgDQoJCSdzdHlsZVtdJyArIA0KCQknb2JqZWN0WyN8cGFyYW18WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ3BhcmFtW10nICsgDQoJCSdwW1NdJyArIA0KCQknYVtaXScgKyANCgkJJ2JyW10nICsgDQoJCSdzcGFuW1NdJyArIA0KCQknYmRvW1NdJyArIA0KCQknYXBwbGV0WyN8cGFyYW18WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ2gxW1NdJyArIA0KCQknaW1nW10nICsgDQoJCSdtYXBbWHxmb3JtfFF8YXJlYV0nICsgDQoJCSdoMltTXScgKyANCgkJJ2lmcmFtZVsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdoM1tTXScgKyANCgkJJ3R0W1NdJyArIA0KCQknaVtTXScgKyANCgkJJ2JbU10nICsgDQoJCSd1W1NdJyArIA0KCQknc1tTXScgKyANCgkJJ3N0cmlrZVtTXScgKyANCgkJJ2JpZ1tTXScgKyANCgkJJ3NtYWxsW1NdJyArIA0KCQknZm9udFtTXScgKyANCgkJJ2Jhc2Vmb250W10nICsgDQoJCSdlbVtTXScgKyANCgkJJ3N0cm9uZ1tTXScgKyANCgkJJ2RmbltTXScgKyANCgkJJ2NvZGVbU10nICsgDQoJCSdxW1NdJyArIA0KCQknc2FtcFtTXScgKyANCgkJJ2tiZFtTXScgKyANCgkJJ3ZhcltTXScgKyANCgkJJ2NpdGVbU10nICsgDQoJCSdhYmJyW1NdJyArIA0KCQknYWNyb255bVtTXScgKyANCgkJJ3N1YltTXScgKyANCgkJJ3N1cFtTXScgKyANCgkJJ2lucHV0W10nICsgDQoJCSdzZWxlY3Rbb3B0Z3JvdXB8b3B0aW9uXScgKyANCgkJJ29wdGdyb3VwW29wdGlvbl0nICsgDQoJCSdvcHRpb25bXScgKyANCgkJJ3RleHRhcmVhW10nICsgDQoJCSdsYWJlbFtTXScgKyANCgkJJ2J1dHRvblsjfHB8VHxkaXZ8VXxXfHRhYmxlfEd8b2JqZWN0fGFwcGxldHxpbWd8bWFwfEt8TnxRXScgKyANCgkJJ2g0W1NdJyArIA0KCQknaW5zWyN8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ2g1W1NdJyArIA0KCQknZGVsWyN8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ2g2W1NdJyArIA0KCQknZGl2WyN8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ3VsW2xpXScgKyANCgkJJ2xpWyN8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ29sW2xpXScgKyANCgkJJ2RsW2R0fGRkXScgKyANCgkJJ2R0W1NdJyArIA0KCQknZGRbI3xYfGZvcm18YXxIfEt8TnxPfFFdJyArIA0KCQknbWVudVtsaV0nICsgDQoJCSdkaXJbbGldJyArIA0KCQkncHJlW1pBXScgKyANCgkJJ2hyW10nICsgDQoJCSdibG9ja3F1b3RlWyN8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ2FkZHJlc3NbU3xwXScgKyANCgkJJ2NlbnRlclsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdub2ZyYW1lc1sjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdpc2luZGV4W10nICsgDQoJCSdmaWVsZHNldFsjfGxlZ2VuZHxYfGZvcm18YXxIfEt8TnxPfFFdJyArIA0KCQknbGVnZW5kW1NdJyArIA0KCQkndGFibGVbY2FwdGlvbnxjb2x8Y29sZ3JvdXB8dGhlYWR8dGZvb3R8dGJvZHl8dHJdJyArIA0KCQknY2FwdGlvbltTXScgKyANCgkJJ2NvbFtdJyArIA0KCQknY29sZ3JvdXBbY29sXScgKyANCgkJJ3RoZWFkW3RyXScgKyANCgkJJ3RyW3RofHRkXScgKyANCgkJJ3RoWyN8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ2Zvcm1bI3xYfGF8SHxLfE58T3xRXScgKyANCgkJJ25vc2NyaXB0WyN8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ3RkWyN8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ3Rmb290W3RyXScgKyANCgkJJ3Rib2R5W3RyXScgKyANCgkJJ2FyZWFbXScgKyANCgkJJ2Jhc2VbXScgKyANCgkJJ2JvZHlbI3xYfGZvcm18YXxIfEt8TnxPfFFdJw0KCSk7DQoNCgl0aW55bWNlLmRvbS5TY2hlbWEgPSBmdW5jdGlvbigpIHsNCgkJdmFyIHQgPSB0aGlzLCBlbGVtZW50cyA9IHRyYW5zaXRpb25hbDsNCg0KCQl0LmlzVmFsaWQgPSBmdW5jdGlvbihuYW1lLCBjaGlsZF9uYW1lKSB7DQoJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW25hbWVdOw0KDQoJCQlyZXR1cm4gISEoZWxlbWVudCAmJiAoIWNoaWxkX25hbWUgfHwgZWxlbWVudFtjaGlsZF9uYW1lXSkpOw0KCQl9Ow0KCX07DQp9KSgpOw0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl0aW55bWNlLmRvbS5SYW5nZVV0aWxzID0gZnVuY3Rpb24oZG9tKSB7DQoJCXZhciBJTlZJU0lCTEVfQ0hBUiA9ICdcdUZFRkYnOw0KDQoJCXRoaXMud2FsayA9IGZ1bmN0aW9uKHJuZywgY2FsbGJhY2spIHsNCgkJCXZhciBzdGFydENvbnRhaW5lciA9IHJuZy5zdGFydENvbnRhaW5lciwNCgkJCQlzdGFydE9mZnNldCA9IHJuZy5zdGFydE9mZnNldCwNCgkJCQllbmRDb250YWluZXIgPSBybmcuZW5kQ29udGFpbmVyLA0KCQkJCWVuZE9mZnNldCA9IHJuZy5lbmRPZmZzZXQsDQoJCQkJYW5jZXN0b3IsIHN0YXJ0UG9pbnQsDQoJCQkJZW5kUG9pbnQsIG5vZGUsIHBhcmVudCwgc2libGluZ3MsIG5vZGVzOw0KDQoJCQkvLyBIYW5kbGUgdGFibGUgY2VsbCBzZWxlY3Rpb24gdGhlIHRhYmxlIHBsdWdpbiBlbmFibGVzDQoJCQkvLyB5b3UgdG8gZmFrZSBzZWxlY3QgdGFibGUgY2VsbHMgYW5kIHBlcmZvcm0gZm9ybWF0dGluZyBhY3Rpb25zIG9uIHRoZW0NCgkJCW5vZGVzID0gZG9tLnNlbGVjdCgndGQubWNlU2VsZWN0ZWQsdGgubWNlU2VsZWN0ZWQnKTsNCgkJCWlmIChub2Rlcy5sZW5ndGggPiAwKSB7DQoJCQkJdGlueW1jZS5lYWNoKG5vZGVzLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCWNhbGxiYWNrKFtub2RlXSk7DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCWZ1bmN0aW9uIGNvbGxlY3RTaWJsaW5ncyhub2RlLCBuYW1lLCBlbmRfbm9kZSkgew0KCQkJCXZhciBzaWJsaW5ncyA9IFtdOw0KDQoJCQkJZm9yICg7IG5vZGUgJiYgbm9kZSAhPSBlbmRfbm9kZTsgbm9kZSA9IG5vZGVbbmFtZV0pDQoJCQkJCXNpYmxpbmdzLnB1c2gobm9kZSk7DQoNCgkJCQlyZXR1cm4gc2libGluZ3M7DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBmaW5kRW5kUG9pbnQobm9kZSwgcm9vdCkgew0KCQkJCWRvIHsNCgkJCQkJaWYgKG5vZGUucGFyZW50Tm9kZSA9PSByb290KQ0KCQkJCQkJcmV0dXJuIG5vZGU7DQoNCgkJCQkJbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsNCgkJCQl9IHdoaWxlKG5vZGUpOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gd2Fsa0JvdW5kYXJ5KHN0YXJ0X25vZGUsIGVuZF9ub2RlLCBuZXh0KSB7DQoJCQkJdmFyIHNpYmxpbmdOYW1lID0gbmV4dCA/ICduZXh0U2libGluZycgOiAncHJldmlvdXNTaWJsaW5nJzsNCg0KCQkJCWZvciAobm9kZSA9IHN0YXJ0X25vZGUsIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsgbm9kZSAmJiBub2RlICE9IGVuZF9ub2RlOyBub2RlID0gcGFyZW50KSB7DQoJCQkJCXBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsNCgkJCQkJc2libGluZ3MgPSBjb2xsZWN0U2libGluZ3Mobm9kZSA9PSBzdGFydF9ub2RlID8gbm9kZSA6IG5vZGVbc2libGluZ05hbWVdLCBzaWJsaW5nTmFtZSk7DQoNCgkJCQkJaWYgKHNpYmxpbmdzLmxlbmd0aCkgew0KCQkJCQkJaWYgKCFuZXh0KQ0KCQkJCQkJCXNpYmxpbmdzLnJldmVyc2UoKTsNCg0KCQkJCQkJY2FsbGJhY2soc2libGluZ3MpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfTsNCg0KCQkJLy8gSWYgaW5kZXggYmFzZWQgc3RhcnQgcG9zaXRpb24gdGhlbiByZXNvbHZlIGl0DQoJCQlpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMSAmJiBzdGFydENvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCkpDQoJCQkJc3RhcnRDb250YWluZXIgPSBzdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3N0YXJ0T2Zmc2V0XTsNCg0KCQkJLy8gSWYgaW5kZXggYmFzZWQgZW5kIHBvc2l0aW9uIHRoZW4gcmVzb2x2ZSBpdA0KCQkJaWYgKGVuZENvbnRhaW5lci5ub2RlVHlwZSA9PSAxICYmIGVuZENvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCkpDQoJCQkJZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyLmNoaWxkTm9kZXNbTWF0aC5taW4oc3RhcnRPZmZzZXQgPT0gZW5kT2Zmc2V0ID8gZW5kT2Zmc2V0IDogZW5kT2Zmc2V0IC0gMSwgZW5kQ29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoIC0gMSldOw0KDQoJCQkvLyBGaW5kIGNvbW1vbiBhbmNlc3RvciBhbmQgZW5kIHBvaW50cw0KCQkJYW5jZXN0b3IgPSBkb20uZmluZENvbW1vbkFuY2VzdG9yKHN0YXJ0Q29udGFpbmVyLCBlbmRDb250YWluZXIpOw0KDQoJCQkvLyBTYW1lIGNvbnRhaW5lcg0KCQkJaWYgKHN0YXJ0Q29udGFpbmVyID09IGVuZENvbnRhaW5lcikNCgkJCQlyZXR1cm4gY2FsbGJhY2soW3N0YXJ0Q29udGFpbmVyXSk7DQoNCgkJCS8vIFByb2Nlc3MgbGVmdCBzaWRlDQoJCQlmb3IgKG5vZGUgPSBzdGFydENvbnRhaW5lcjsgbm9kZTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSkgew0KCQkJCWlmIChub2RlID09IGVuZENvbnRhaW5lcikNCgkJCQkJcmV0dXJuIHdhbGtCb3VuZGFyeShzdGFydENvbnRhaW5lciwgYW5jZXN0b3IsIHRydWUpOw0KDQoJCQkJaWYgKG5vZGUgPT0gYW5jZXN0b3IpDQoJCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQkvLyBQcm9jZXNzIHJpZ2h0IHNpZGUNCgkJCWZvciAobm9kZSA9IGVuZENvbnRhaW5lcjsgbm9kZTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSkgew0KCQkJCWlmIChub2RlID09IHN0YXJ0Q29udGFpbmVyKQ0KCQkJCQlyZXR1cm4gd2Fsa0JvdW5kYXJ5KGVuZENvbnRhaW5lciwgYW5jZXN0b3IpOw0KDQoJCQkJaWYgKG5vZGUgPT0gYW5jZXN0b3IpDQoJCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQkvLyBGaW5kIHN0YXJ0L2VuZCBwb2ludA0KCQkJc3RhcnRQb2ludCA9IGZpbmRFbmRQb2ludChzdGFydENvbnRhaW5lciwgYW5jZXN0b3IpIHx8IHN0YXJ0Q29udGFpbmVyOw0KCQkJZW5kUG9pbnQgPSBmaW5kRW5kUG9pbnQoZW5kQ29udGFpbmVyLCBhbmNlc3RvcikgfHwgZW5kQ29udGFpbmVyOw0KDQoJCQkvLyBXYWxrIGxlZnQgbGVhZg0KCQkJd2Fsa0JvdW5kYXJ5KHN0YXJ0Q29udGFpbmVyLCBzdGFydFBvaW50LCB0cnVlKTsNCg0KCQkJLy8gV2FsayB0aGUgbWlkZGxlIGZyb20gc3RhcnQgdG8gZW5kIHBvaW50DQoJCQlzaWJsaW5ncyA9IGNvbGxlY3RTaWJsaW5ncygNCgkJCQlzdGFydFBvaW50ID09IHN0YXJ0Q29udGFpbmVyID8gc3RhcnRQb2ludCA6IHN0YXJ0UG9pbnQubmV4dFNpYmxpbmcsDQoJCQkJJ25leHRTaWJsaW5nJywNCgkJCQllbmRQb2ludCA9PSBlbmRDb250YWluZXIgPyBlbmRQb2ludC5uZXh0U2libGluZyA6IGVuZFBvaW50DQoJCQkpOw0KDQoJCQlpZiAoc2libGluZ3MubGVuZ3RoKQ0KCQkJCWNhbGxiYWNrKHNpYmxpbmdzKTsNCg0KCQkJLy8gV2FsayByaWdodCBsZWFmDQoJCQl3YWxrQm91bmRhcnkoZW5kQ29udGFpbmVyLCBlbmRQb2ludCk7DQoJCX07DQoNCgkJLyoJCXRoaXMuc3BsaXQgPSBmdW5jdGlvbihybmcpIHsNCgkJCXZhciBzdGFydENvbnRhaW5lciA9IHJuZy5zdGFydENvbnRhaW5lciwNCgkJCQlzdGFydE9mZnNldCA9IHJuZy5zdGFydE9mZnNldCwNCgkJCQllbmRDb250YWluZXIgPSBybmcuZW5kQ29udGFpbmVyLA0KCQkJCWVuZE9mZnNldCA9IHJuZy5lbmRPZmZzZXQ7DQoNCgkJCWZ1bmN0aW9uIHNwbGl0VGV4dChub2RlLCBvZmZzZXQpIHsNCgkJCQlpZiAob2Zmc2V0ID09IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkNCgkJCQkJbm9kZS5hcHBlbmREYXRhKElOVklTSUJMRV9DSEFSKTsNCg0KCQkJCW5vZGUgPSBub2RlLnNwbGl0VGV4dChvZmZzZXQpOw0KDQoJCQkJaWYgKG5vZGUubm9kZVZhbHVlID09PSBJTlZJU0lCTEVfQ0hBUikNCgkJCQkJbm9kZS5ub2RlVmFsdWUgPSAnJzsNCg0KCQkJCXJldHVybiBub2RlOw0KCQkJfTsNCg0KCQkJLy8gSGFuZGxlIHNpbmdsZSB0ZXh0IG5vZGUNCgkJCWlmIChzdGFydENvbnRhaW5lciA9PSBlbmRDb250YWluZXIpIHsNCgkJCQlpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMykgew0KCQkJCQlpZiAoc3RhcnRPZmZzZXQgIT0gMCkNCgkJCQkJCXN0YXJ0Q29udGFpbmVyID0gZW5kQ29udGFpbmVyID0gc3BsaXRUZXh0KHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCk7DQoNCgkJCQkJaWYgKGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0ICE9IHN0YXJ0Q29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGgpDQoJCQkJCQlzcGxpdFRleHQoc3RhcnRDb250YWluZXIsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCS8vIFNwbGl0IHN0YXJ0Q29udGFpbmVyIHRleHQgbm9kZSBpZiBuZWVkZWQNCgkJCQlpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMyAmJiBzdGFydE9mZnNldCAhPSAwKSB7DQoJCQkJCXN0YXJ0Q29udGFpbmVyID0gc3BsaXRUZXh0KHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCk7DQoJCQkJCXN0YXJ0T2Zmc2V0ID0gMDsNCgkJCQl9DQoNCgkJCQkvLyBTcGxpdCBlbmRDb250YWluZXIgdGV4dCBub2RlIGlmIG5lZWRlZA0KCQkJCWlmIChlbmRDb250YWluZXIubm9kZVR5cGUgPT0gMyAmJiBlbmRPZmZzZXQgIT0gZW5kQ29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGgpIHsNCgkJCQkJZW5kQ29udGFpbmVyID0gc3BsaXRUZXh0KGVuZENvbnRhaW5lciwgZW5kT2Zmc2V0KS5wcmV2aW91c1NpYmxpbmc7DQoJCQkJCWVuZE9mZnNldCA9IGVuZENvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIHsNCgkJCQlzdGFydENvbnRhaW5lciA6IHN0YXJ0Q29udGFpbmVyLA0KCQkJCXN0YXJ0T2Zmc2V0IDogc3RhcnRPZmZzZXQsDQoJCQkJZW5kQ29udGFpbmVyIDogZW5kQ29udGFpbmVyLA0KCQkJCWVuZE9mZnNldCA6IGVuZE9mZnNldA0KCQkJfTsNCgkJfTsNCiovDQoJfTsNCg0KCXRpbnltY2UuZG9tLlJhbmdlVXRpbHMuY29tcGFyZVJhbmdlcyA9IGZ1bmN0aW9uKHJuZzEsIHJuZzIpIHsNCgkJaWYgKHJuZzEgJiYgcm5nMikgew0KCQkJLy8gQ29tcGFyZSBuYXRpdmUgSUUgcmFuZ2VzDQoJCQlpZiAocm5nMS5pdGVtIHx8IHJuZzEuZHVwbGljYXRlKSB7DQoJCQkJLy8gQm90aCBhcmUgY29udHJvbCByYW5nZXMgYW5kIHRoZSBzZWxlY3RlZCBlbGVtZW50IG1hdGNoZXMNCgkJCQlpZiAocm5nMS5pdGVtICYmIHJuZzIuaXRlbSAmJiBybmcxLml0ZW0oMCkgPT09IHJuZzIuaXRlbSgwKSkNCgkJCQkJcmV0dXJuIHRydWU7DQoNCgkJCQkvLyBCb3RoIGFyZSB0ZXh0IHJhbmdlcyBhbmQgdGhlIHJhbmdlIG1hdGNoZXMNCgkJCQlpZiAocm5nMS5pc0VxdWFsICYmIHJuZzIuaXNFcXVhbCAmJiBybmcyLmlzRXF1YWwocm5nMSkpDQoJCQkJCXJldHVybiB0cnVlOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyBDb21wYXJlIHczYyByYW5nZXMNCgkJCQlyZXR1cm4gcm5nMS5zdGFydENvbnRhaW5lciA9PSBybmcyLnN0YXJ0Q29udGFpbmVyICYmIHJuZzEuc3RhcnRPZmZzZXQgPT0gcm5nMi5zdGFydE9mZnNldDsNCgkJCX0NCgkJfQ0KDQoJCXJldHVybiBmYWxzZTsNCgl9Ow0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBjbGFzcyBuYW1lcw0KCXZhciBET00gPSB0aW55bWNlLkRPTSwgaXMgPSB0aW55bWNlLmlzOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuQ29udHJvbCcsIHsNCgkJQ29udHJvbCA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl0aGlzLmlkID0gaWQ7DQoJCQl0aGlzLnNldHRpbmdzID0gcyA9IHMgfHwge307DQoJCQl0aGlzLnJlbmRlcmVkID0gZmFsc2U7DQoJCQl0aGlzLm9uUmVuZGVyID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpOw0KCQkJdGhpcy5jbGFzc1ByZWZpeCA9ICcnOw0KCQkJdGhpcy5zY29wZSA9IHMuc2NvcGUgfHwgdGhpczsNCgkJCXRoaXMuZGlzYWJsZWQgPSAwOw0KCQkJdGhpcy5hY3RpdmUgPSAwOw0KCQl9LA0KDQoJCXNldERpc2FibGVkIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIGU7DQoNCgkJCWlmIChzICE9IHRoaXMuZGlzYWJsZWQpIHsNCgkJCQllID0gRE9NLmdldCh0aGlzLmlkKTsNCg0KCQkJCS8vIEFkZCBhY2Nlc3NpYmlsaXR5IHRpdGxlIGZvciB1bmF2YWlsYWJsZSBhY3Rpb25zDQoJCQkJaWYgKGUgJiYgdGhpcy5zZXR0aW5ncy51bmF2YWlsYWJsZV9wcmVmaXgpIHsNCgkJCQkJaWYgKHMpIHsNCgkJCQkJCXRoaXMucHJldlRpdGxlID0gZS50aXRsZTsNCgkJCQkJCWUudGl0bGUgPSB0aGlzLnNldHRpbmdzLnVuYXZhaWxhYmxlX3ByZWZpeCArICI6ICIgKyBlLnRpdGxlOw0KCQkJCQl9IGVsc2UNCgkJCQkJCWUudGl0bGUgPSB0aGlzLnByZXZUaXRsZTsNCgkJCQl9DQoNCgkJCQl0aGlzLnNldFN0YXRlKCdEaXNhYmxlZCcsIHMpOw0KCQkJCXRoaXMuc2V0U3RhdGUoJ0VuYWJsZWQnLCAhcyk7DQoJCQkJdGhpcy5kaXNhYmxlZCA9IHM7DQoJCQl9DQoJCX0sDQoNCgkJaXNEaXNhYmxlZCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuZGlzYWJsZWQ7DQoJCX0sDQoNCgkJc2V0QWN0aXZlIDogZnVuY3Rpb24ocykgew0KCQkJaWYgKHMgIT0gdGhpcy5hY3RpdmUpIHsNCgkJCQl0aGlzLnNldFN0YXRlKCdBY3RpdmUnLCBzKTsNCgkJCQl0aGlzLmFjdGl2ZSA9IHM7DQoJCQl9DQoJCX0sDQoNCgkJaXNBY3RpdmUgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLmFjdGl2ZTsNCgkJfSwNCg0KCQlzZXRTdGF0ZSA6IGZ1bmN0aW9uKGMsIHMpIHsNCgkJCXZhciBuID0gRE9NLmdldCh0aGlzLmlkKTsNCg0KCQkJYyA9IHRoaXMuY2xhc3NQcmVmaXggKyBjOw0KDQoJCQlpZiAocykNCgkJCQlET00uYWRkQ2xhc3MobiwgYyk7DQoJCQllbHNlDQoJCQkJRE9NLnJlbW92ZUNsYXNzKG4sIGMpOw0KCQl9LA0KDQoJCWlzUmVuZGVyZWQgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLnJlbmRlcmVkOw0KCQl9LA0KDQoJCXJlbmRlckhUTUwgOiBmdW5jdGlvbigpIHsNCgkJfSwNCg0KCQlyZW5kZXJUbyA6IGZ1bmN0aW9uKG4pIHsNCgkJCURPTS5zZXRIVE1MKG4sIHRoaXMucmVuZGVySFRNTCgpKTsNCgkJfSwNCg0KCQlwb3N0UmVuZGVyIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGI7DQoNCgkJCS8vIFNldCBwZW5kaW5nIHN0YXRlcw0KCQkJaWYgKGlzKHQuZGlzYWJsZWQpKSB7DQoJCQkJYiA9IHQuZGlzYWJsZWQ7DQoJCQkJdC5kaXNhYmxlZCA9IC0xOw0KCQkJCXQuc2V0RGlzYWJsZWQoYik7DQoJCQl9DQoNCgkJCWlmIChpcyh0LmFjdGl2ZSkpIHsNCgkJCQliID0gdC5hY3RpdmU7DQoJCQkJdC5hY3RpdmUgPSAtMTsNCgkJCQl0LnNldEFjdGl2ZShiKTsNCgkJCX0NCgkJfSwNCg0KCQlyZW1vdmUgOiBmdW5jdGlvbigpIHsNCgkJCURPTS5yZW1vdmUodGhpcy5pZCk7DQoJCQl0aGlzLmRlc3Ryb3koKTsNCgkJfSwNCg0KCQlkZXN0cm95IDogZnVuY3Rpb24oKSB7DQoJCQl0aW55bWNlLmRvbS5FdmVudC5jbGVhcih0aGlzLmlkKTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQp0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5Db250YWluZXI6dGlueW1jZS51aS5Db250cm9sJywgew0KCUNvbnRhaW5lciA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCXRoaXMucGFyZW50KGlkLCBzKTsNCg0KCQl0aGlzLmNvbnRyb2xzID0gW107DQoNCgkJdGhpcy5sb29rdXAgPSB7fTsNCgl9LA0KDQoJYWRkIDogZnVuY3Rpb24oYykgew0KCQl0aGlzLmxvb2t1cFtjLmlkXSA9IGM7DQoJCXRoaXMuY29udHJvbHMucHVzaChjKTsNCg0KCQlyZXR1cm4gYzsNCgl9LA0KDQoJZ2V0IDogZnVuY3Rpb24obikgew0KCQlyZXR1cm4gdGhpcy5sb29rdXBbbl07DQoJfQ0KfSk7DQoNCg0KdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuU2VwYXJhdG9yOnRpbnltY2UudWkuQ29udHJvbCcsIHsNCglTZXBhcmF0b3IgOiBmdW5jdGlvbihpZCwgcykgew0KCQl0aGlzLnBhcmVudChpZCwgcyk7DQoJCXRoaXMuY2xhc3NQcmVmaXggPSAnbWNlU2VwYXJhdG9yJzsNCgl9LA0KDQoJcmVuZGVySFRNTCA6IGZ1bmN0aW9uKCkgew0KCQlyZXR1cm4gdGlueW1jZS5ET00uY3JlYXRlSFRNTCgnc3BhbicsIHsnY2xhc3MnIDogdGhpcy5jbGFzc1ByZWZpeH0pOw0KCX0NCn0pOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBpcyA9IHRpbnltY2UuaXMsIERPTSA9IHRpbnltY2UuRE9NLCBlYWNoID0gdGlueW1jZS5lYWNoLCB3YWxrID0gdGlueW1jZS53YWxrOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuTWVudUl0ZW06dGlueW1jZS51aS5Db250cm9sJywgew0KCQlNZW51SXRlbSA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl0aGlzLnBhcmVudChpZCwgcyk7DQoJCQl0aGlzLmNsYXNzUHJlZml4ID0gJ21jZU1lbnVJdGVtJzsNCgkJfSwNCg0KCQlzZXRTZWxlY3RlZCA6IGZ1bmN0aW9uKHMpIHsNCgkJCXRoaXMuc2V0U3RhdGUoJ1NlbGVjdGVkJywgcyk7DQoJCQl0aGlzLnNlbGVjdGVkID0gczsNCgkJfSwNCg0KCQlpc1NlbGVjdGVkIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5zZWxlY3RlZDsNCgkJfSwNCg0KCQlwb3N0UmVuZGVyIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoJCQkNCgkJCXQucGFyZW50KCk7DQoNCgkJCS8vIFNldCBwZW5kaW5nIHN0YXRlDQoJCQlpZiAoaXModC5zZWxlY3RlZCkpDQoJCQkJdC5zZXRTZWxlY3RlZCh0LnNlbGVjdGVkKTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIGlzID0gdGlueW1jZS5pcywgRE9NID0gdGlueW1jZS5ET00sIGVhY2ggPSB0aW55bWNlLmVhY2gsIHdhbGsgPSB0aW55bWNlLndhbGs7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5NZW51OnRpbnltY2UudWkuTWVudUl0ZW0nLCB7DQoJCU1lbnUgOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LnBhcmVudChpZCwgcyk7DQoJCQl0Lml0ZW1zID0ge307DQoJCQl0LmNvbGxhcHNlZCA9IGZhbHNlOw0KCQkJdC5tZW51Q291bnQgPSAwOw0KCQkJdC5vbkFkZEl0ZW0gPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodGhpcyk7DQoJCX0sDQoNCgkJZXhwYW5kIDogZnVuY3Rpb24oZCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoZCkgew0KCQkJCXdhbGsodCwgZnVuY3Rpb24obykgew0KCQkJCQlpZiAoby5leHBhbmQpDQoJCQkJCQlvLmV4cGFuZCgpOw0KCQkJCX0sICdpdGVtcycsIHQpOw0KCQkJfQ0KDQoJCQl0LmNvbGxhcHNlZCA9IGZhbHNlOw0KCQl9LA0KDQoJCWNvbGxhcHNlIDogZnVuY3Rpb24oZCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoZCkgew0KCQkJCXdhbGsodCwgZnVuY3Rpb24obykgew0KCQkJCQlpZiAoby5jb2xsYXBzZSkNCgkJCQkJCW8uY29sbGFwc2UoKTsNCgkJCQl9LCAnaXRlbXMnLCB0KTsNCgkJCX0NCg0KCQkJdC5jb2xsYXBzZWQgPSB0cnVlOw0KCQl9LA0KDQoJCWlzQ29sbGFwc2VkIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5jb2xsYXBzZWQ7DQoJCX0sDQoNCgkJYWRkIDogZnVuY3Rpb24obykgew0KCQkJaWYgKCFvLnNldHRpbmdzKQ0KCQkJCW8gPSBuZXcgdGlueW1jZS51aS5NZW51SXRlbShvLmlkIHx8IERPTS51bmlxdWVJZCgpLCBvKTsNCg0KCQkJdGhpcy5vbkFkZEl0ZW0uZGlzcGF0Y2godGhpcywgbyk7DQoNCgkJCXJldHVybiB0aGlzLml0ZW1zW28uaWRdID0gbzsNCgkJfSwNCg0KCQlhZGRTZXBhcmF0b3IgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLmFkZCh7c2VwYXJhdG9yIDogdHJ1ZX0pOw0KCQl9LA0KDQoJCWFkZE1lbnUgOiBmdW5jdGlvbihvKSB7DQoJCQlpZiAoIW8uY29sbGFwc2UpDQoJCQkJbyA9IHRoaXMuY3JlYXRlTWVudShvKTsNCg0KCQkJdGhpcy5tZW51Q291bnQrKzsNCg0KCQkJcmV0dXJuIHRoaXMuYWRkKG8pOw0KCQl9LA0KDQoJCWhhc01lbnVzIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5tZW51Q291bnQgIT09IDA7DQoJCX0sDQoNCgkJcmVtb3ZlIDogZnVuY3Rpb24obykgew0KCQkJZGVsZXRlIHRoaXMuaXRlbXNbby5pZF07DQoJCX0sDQoNCgkJcmVtb3ZlQWxsIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXdhbGsodCwgZnVuY3Rpb24obykgew0KCQkJCWlmIChvLnJlbW92ZUFsbCkNCgkJCQkJby5yZW1vdmVBbGwoKTsNCgkJCQllbHNlDQoJCQkJCW8ucmVtb3ZlKCk7DQoNCgkJCQlvLmRlc3Ryb3koKTsNCgkJCX0sICdpdGVtcycsIHQpOw0KDQoJCQl0Lml0ZW1zID0ge307DQoJCX0sDQoNCgkJY3JlYXRlTWVudSA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciBtID0gbmV3IHRpbnltY2UudWkuTWVudShvLmlkIHx8IERPTS51bmlxdWVJZCgpLCBvKTsNCg0KCQkJbS5vbkFkZEl0ZW0uYWRkKHRoaXMub25BZGRJdGVtLmRpc3BhdGNoLCB0aGlzLm9uQWRkSXRlbSk7DQoNCgkJCXJldHVybiBtOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIGlzID0gdGlueW1jZS5pcywgRE9NID0gdGlueW1jZS5ET00sIGVhY2ggPSB0aW55bWNlLmVhY2gsIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIEVsZW1lbnQgPSB0aW55bWNlLmRvbS5FbGVtZW50Ow0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuRHJvcE1lbnU6dGlueW1jZS51aS5NZW51Jywgew0KCQlEcm9wTWVudSA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQlzID0gcyB8fCB7fTsNCgkJCXMuY29udGFpbmVyID0gcy5jb250YWluZXIgfHwgRE9NLmRvYy5ib2R5Ow0KCQkJcy5vZmZzZXRfeCA9IHMub2Zmc2V0X3ggfHwgMDsNCgkJCXMub2Zmc2V0X3kgPSBzLm9mZnNldF95IHx8IDA7DQoJCQlzLnZwX29mZnNldF94ID0gcy52cF9vZmZzZXRfeCB8fCAwOw0KCQkJcy52cF9vZmZzZXRfeSA9IHMudnBfb2Zmc2V0X3kgfHwgMDsNCg0KCQkJaWYgKGlzKHMuaWNvbnMpICYmICFzLmljb25zKQ0KCQkJCXNbJ2NsYXNzJ10gKz0gJyBtY2VOb0ljb25zJzsNCg0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQkJdGhpcy5vblNob3dNZW51ID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpOw0KCQkJdGhpcy5vbkhpZGVNZW51ID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpOw0KCQkJdGhpcy5jbGFzc1ByZWZpeCA9ICdtY2VNZW51JzsNCgkJfSwNCg0KCQljcmVhdGVNZW51IDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzLCBjcyA9IHQuc2V0dGluZ3MsIG07DQoNCgkJCXMuY29udGFpbmVyID0gcy5jb250YWluZXIgfHwgY3MuY29udGFpbmVyOw0KCQkJcy5wYXJlbnQgPSB0Ow0KCQkJcy5jb25zdHJhaW4gPSBzLmNvbnN0cmFpbiB8fCBjcy5jb25zdHJhaW47DQoJCQlzWydjbGFzcyddID0gc1snY2xhc3MnXSB8fCBjc1snY2xhc3MnXTsNCgkJCXMudnBfb2Zmc2V0X3ggPSBzLnZwX29mZnNldF94IHx8IGNzLnZwX29mZnNldF94Ow0KCQkJcy52cF9vZmZzZXRfeSA9IHMudnBfb2Zmc2V0X3kgfHwgY3MudnBfb2Zmc2V0X3k7DQoJCQltID0gbmV3IHRpbnltY2UudWkuRHJvcE1lbnUocy5pZCB8fCBET00udW5pcXVlSWQoKSwgcyk7DQoNCgkJCW0ub25BZGRJdGVtLmFkZCh0Lm9uQWRkSXRlbS5kaXNwYXRjaCwgdC5vbkFkZEl0ZW0pOw0KDQoJCQlyZXR1cm4gbTsNCgkJfSwNCg0KCQl1cGRhdGUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIHRiID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCArICdfdGJsJyksIGNvID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCArICdfY28nKSwgdHcsIHRoOw0KDQoJCQl0dyA9IHMubWF4X3dpZHRoID8gTWF0aC5taW4odGIuY2xpZW50V2lkdGgsIHMubWF4X3dpZHRoKSA6IHRiLmNsaWVudFdpZHRoOw0KCQkJdGggPSBzLm1heF9oZWlnaHQgPyBNYXRoLm1pbih0Yi5jbGllbnRIZWlnaHQsIHMubWF4X2hlaWdodCkgOiB0Yi5jbGllbnRIZWlnaHQ7DQoNCgkJCWlmICghRE9NLmJveE1vZGVsKQ0KCQkJCXQuZWxlbWVudC5zZXRTdHlsZXMoe3dpZHRoIDogdHcgKyAyLCBoZWlnaHQgOiB0aCArIDJ9KTsNCgkJCWVsc2UNCgkJCQl0LmVsZW1lbnQuc2V0U3R5bGVzKHt3aWR0aCA6IHR3LCBoZWlnaHQgOiB0aH0pOw0KDQoJCQlpZiAocy5tYXhfd2lkdGgpDQoJCQkJRE9NLnNldFN0eWxlKGNvLCAnd2lkdGgnLCB0dyk7DQoNCgkJCWlmIChzLm1heF9oZWlnaHQpIHsNCgkJCQlET00uc2V0U3R5bGUoY28sICdoZWlnaHQnLCB0aCk7DQoNCgkJCQlpZiAodGIuY2xpZW50SGVpZ2h0IDwgcy5tYXhfaGVpZ2h0KQ0KCQkJCQlET00uc2V0U3R5bGUoY28sICdvdmVyZmxvdycsICdoaWRkZW4nKTsNCgkJCX0NCgkJfSwNCg0KCQlzaG93TWVudSA6IGZ1bmN0aW9uKHgsIHksIHB4KSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBjbywgdnAgPSBET00uZ2V0Vmlld1BvcnQoKSwgdywgaCwgbXgsIG15LCBvdCA9IDIsIGRtLCB0YiwgY3AgPSB0LmNsYXNzUHJlZml4Ow0KDQoJCQl0LmNvbGxhcHNlKDEpOw0KDQoJCQlpZiAodC5pc01lbnVWaXNpYmxlKQ0KCQkJCXJldHVybjsNCg0KCQkJaWYgKCF0LnJlbmRlcmVkKSB7DQoJCQkJY28gPSBET00uYWRkKHQuc2V0dGluZ3MuY29udGFpbmVyLCB0LnJlbmRlck5vZGUoKSk7DQoNCgkJCQllYWNoKHQuaXRlbXMsIGZ1bmN0aW9uKG8pIHsNCgkJCQkJby5wb3N0UmVuZGVyKCk7DQoJCQkJfSk7DQoNCgkJCQl0LmVsZW1lbnQgPSBuZXcgRWxlbWVudCgnbWVudV8nICsgdC5pZCwge2Jsb2NrZXIgOiAxLCBjb250YWluZXIgOiBzLmNvbnRhaW5lcn0pOw0KCQkJfSBlbHNlDQoJCQkJY28gPSBET00uZ2V0KCdtZW51XycgKyB0LmlkKTsNCg0KCQkJLy8gTW92ZSBsYXllciBvdXQgb2Ygc2lnaHQgdW5sZXNzIGl0J3MgT3BlcmEgc2luY2UgaXQgc2Nyb2xscyB0byB0b3Agb2YgcGFnZSBkdWUgdG8gYW4gYnVnDQoJCQlpZiAoIXRpbnltY2UuaXNPcGVyYSkNCgkJCQlET00uc2V0U3R5bGVzKGNvLCB7bGVmdCA6IC0weEZGRkYgLCB0b3AgOiAtMHhGRkZGfSk7DQoNCgkJCURPTS5zaG93KGNvKTsNCgkJCXQudXBkYXRlKCk7DQoNCgkJCXggKz0gcy5vZmZzZXRfeCB8fCAwOw0KCQkJeSArPSBzLm9mZnNldF95IHx8IDA7DQoJCQl2cC53IC09IDQ7DQoJCQl2cC5oIC09IDQ7DQoNCgkJCS8vIE1vdmUgaW5zaWRlIHZpZXdwb3J0IGlmIG5vdCBzdWJtZW51DQoJCQlpZiAocy5jb25zdHJhaW4pIHsNCgkJCQl3ID0gY28uY2xpZW50V2lkdGggLSBvdDsNCgkJCQloID0gY28uY2xpZW50SGVpZ2h0IC0gb3Q7DQoJCQkJbXggPSB2cC54ICsgdnAudzsNCgkJCQlteSA9IHZwLnkgKyB2cC5oOw0KDQoJCQkJaWYgKCh4ICsgcy52cF9vZmZzZXRfeCArIHcpID4gbXgpDQoJCQkJCXggPSBweCA/IHB4IC0gdyA6IE1hdGgubWF4KDAsIChteCAtIHMudnBfb2Zmc2V0X3gpIC0gdyk7DQoNCgkJCQlpZiAoKHkgKyBzLnZwX29mZnNldF95ICsgaCkgPiBteSkNCgkJCQkJeSA9IE1hdGgubWF4KDAsIChteSAtIHMudnBfb2Zmc2V0X3kpIC0gaCk7DQoJCQl9DQoNCgkJCURPTS5zZXRTdHlsZXMoY28sIHtsZWZ0IDogeCAsIHRvcCA6IHl9KTsNCgkJCXQuZWxlbWVudC51cGRhdGUoKTsNCg0KCQkJdC5pc01lbnVWaXNpYmxlID0gMTsNCgkJCXQubW91c2VDbGlja0Z1bmMgPSBFdmVudC5hZGQoY28sICdjbGljaycsIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgbTsNCg0KCQkJCWUgPSBlLnRhcmdldDsNCg0KCQkJCWlmIChlICYmIChlID0gRE9NLmdldFBhcmVudChlLCAndHInKSkgJiYgIURPTS5oYXNDbGFzcyhlLCBjcCArICdJdGVtU3ViJykpIHsNCgkJCQkJbSA9IHQuaXRlbXNbZS5pZF07DQoNCgkJCQkJaWYgKG0uaXNEaXNhYmxlZCgpKQ0KCQkJCQkJcmV0dXJuOw0KDQoJCQkJCWRtID0gdDsNCg0KCQkJCQl3aGlsZSAoZG0pIHsNCgkJCQkJCWlmIChkbS5oaWRlTWVudSkNCgkJCQkJCQlkbS5oaWRlTWVudSgpOw0KDQoJCQkJCQlkbSA9IGRtLnNldHRpbmdzLnBhcmVudDsNCgkJCQkJfQ0KDQoJCQkJCWlmIChtLnNldHRpbmdzLm9uY2xpY2spDQoJCQkJCQltLnNldHRpbmdzLm9uY2xpY2soZSk7DQoNCgkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsgLy8gQ2FuY2VsIHRvIGZpeCBvbmJlZm9yZXVubG9hZCBwcm9ibGVtDQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWlmICh0Lmhhc01lbnVzKCkpIHsNCgkJCQl0Lm1vdXNlT3ZlckZ1bmMgPSBFdmVudC5hZGQoY28sICdtb3VzZW92ZXInLCBmdW5jdGlvbihlKSB7DQoJCQkJCXZhciBtLCByLCBtaTsNCg0KCQkJCQllID0gZS50YXJnZXQ7DQoJCQkJCWlmIChlICYmIChlID0gRE9NLmdldFBhcmVudChlLCAndHInKSkpIHsNCgkJCQkJCW0gPSB0Lml0ZW1zW2UuaWRdOw0KDQoJCQkJCQlpZiAodC5sYXN0TWVudSkNCgkJCQkJCQl0Lmxhc3RNZW51LmNvbGxhcHNlKDEpOw0KDQoJCQkJCQlpZiAobS5pc0Rpc2FibGVkKCkpDQoJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQlpZiAoZSAmJiBET00uaGFzQ2xhc3MoZSwgY3AgKyAnSXRlbVN1YicpKSB7DQoJCQkJCQkJLy9wID0gRE9NLmdldFBvcyhzLmNvbnRhaW5lcik7DQoJCQkJCQkJciA9IERPTS5nZXRSZWN0KGUpOw0KCQkJCQkJCW0uc2hvd01lbnUoKHIueCArIHIudyAtIG90KSwgci55IC0gb3QsIHIueCk7DQoJCQkJCQkJdC5sYXN0TWVudSA9IG07DQoJCQkJCQkJRE9NLmFkZENsYXNzKERPTS5nZXQobS5pZCkuZmlyc3RDaGlsZCwgY3AgKyAnSXRlbUFjdGl2ZScpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXQub25TaG93TWVudS5kaXNwYXRjaCh0KTsNCg0KCQkJaWYgKHMua2V5Ym9hcmRfZm9jdXMpIHsNCgkJCQlFdmVudC5hZGQoY28sICdrZXlkb3duJywgdC5fa2V5SGFuZGxlciwgdCk7DQoJCQkJRE9NLnNlbGVjdCgnYScsICdtZW51XycgKyB0LmlkKVswXS5mb2N1cygpOyAvLyBTZWxlY3QgZmlyc3QgbGluaw0KCQkJCXQuX2ZvY3VzSWR4ID0gMDsNCgkJCX0NCgkJfSwNCg0KCQloaWRlTWVudSA6IGZ1bmN0aW9uKGMpIHsNCgkJCXZhciB0ID0gdGhpcywgY28gPSBET00uZ2V0KCdtZW51XycgKyB0LmlkKSwgZTsNCg0KCQkJaWYgKCF0LmlzTWVudVZpc2libGUpDQoJCQkJcmV0dXJuOw0KDQoJCQlFdmVudC5yZW1vdmUoY28sICdtb3VzZW92ZXInLCB0Lm1vdXNlT3ZlckZ1bmMpOw0KCQkJRXZlbnQucmVtb3ZlKGNvLCAnY2xpY2snLCB0Lm1vdXNlQ2xpY2tGdW5jKTsNCgkJCUV2ZW50LnJlbW92ZShjbywgJ2tleWRvd24nLCB0Ll9rZXlIYW5kbGVyKTsNCgkJCURPTS5oaWRlKGNvKTsNCgkJCXQuaXNNZW51VmlzaWJsZSA9IDA7DQoNCgkJCWlmICghYykNCgkJCQl0LmNvbGxhcHNlKDEpOw0KDQoJCQlpZiAodC5lbGVtZW50KQ0KCQkJCXQuZWxlbWVudC5oaWRlKCk7DQoNCgkJCWlmIChlID0gRE9NLmdldCh0LmlkKSkNCgkJCQlET00ucmVtb3ZlQ2xhc3MoZS5maXJzdENoaWxkLCB0LmNsYXNzUHJlZml4ICsgJ0l0ZW1BY3RpdmUnKTsNCg0KCQkJdC5vbkhpZGVNZW51LmRpc3BhdGNoKHQpOw0KCQl9LA0KDQoJCWFkZCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciB0ID0gdGhpcywgY287DQoNCgkJCW8gPSB0LnBhcmVudChvKTsNCg0KCQkJaWYgKHQuaXNSZW5kZXJlZCAmJiAoY28gPSBET00uZ2V0KCdtZW51XycgKyB0LmlkKSkpDQoJCQkJdC5fYWRkKERPTS5zZWxlY3QoJ3Rib2R5JywgY28pWzBdLCBvKTsNCg0KCQkJcmV0dXJuIG87DQoJCX0sDQoNCgkJY29sbGFwc2UgOiBmdW5jdGlvbihkKSB7DQoJCQl0aGlzLnBhcmVudChkKTsNCgkJCXRoaXMuaGlkZU1lbnUoMSk7DQoJCX0sDQoNCgkJcmVtb3ZlIDogZnVuY3Rpb24obykgew0KCQkJRE9NLnJlbW92ZShvLmlkKTsNCgkJCXRoaXMuZGVzdHJveSgpOw0KDQoJCQlyZXR1cm4gdGhpcy5wYXJlbnQobyk7DQoJCX0sDQoNCgkJZGVzdHJveSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBjbyA9IERPTS5nZXQoJ21lbnVfJyArIHQuaWQpOw0KDQoJCQlFdmVudC5yZW1vdmUoY28sICdtb3VzZW92ZXInLCB0Lm1vdXNlT3ZlckZ1bmMpOw0KCQkJRXZlbnQucmVtb3ZlKGNvLCAnY2xpY2snLCB0Lm1vdXNlQ2xpY2tGdW5jKTsNCg0KCQkJaWYgKHQuZWxlbWVudCkNCgkJCQl0LmVsZW1lbnQucmVtb3ZlKCk7DQoNCgkJCURPTS5yZW1vdmUoY28pOw0KCQl9LA0KDQoJCXJlbmRlck5vZGUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIG4sIHRiLCBjbywgdzsNCg0KCQkJdyA9IERPTS5jcmVhdGUoJ2RpdicsIHtpZCA6ICdtZW51XycgKyB0LmlkLCAnY2xhc3MnIDogc1snY2xhc3MnXSwgJ3N0eWxlJyA6ICdwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7ei1pbmRleDoyMDAwMDAnfSk7DQoJCQljbyA9IERPTS5hZGQodywgJ2RpdicsIHtpZCA6ICdtZW51XycgKyB0LmlkICsgJ19jbycsICdjbGFzcycgOiB0LmNsYXNzUHJlZml4ICsgKHNbJ2NsYXNzJ10gPyAnICcgKyBzWydjbGFzcyddIDogJycpfSk7DQoJCQl0LmVsZW1lbnQgPSBuZXcgRWxlbWVudCgnbWVudV8nICsgdC5pZCwge2Jsb2NrZXIgOiAxLCBjb250YWluZXIgOiBzLmNvbnRhaW5lcn0pOw0KDQoJCQlpZiAocy5tZW51X2xpbmUpDQoJCQkJRE9NLmFkZChjbywgJ3NwYW4nLCB7J2NsYXNzJyA6IHQuY2xhc3NQcmVmaXggKyAnTGluZSd9KTsNCg0KLy8JCQluID0gRE9NLmFkZChjbywgJ2RpdicsIHtpZCA6ICdtZW51XycgKyB0LmlkICsgJ19jbycsICdjbGFzcycgOiAnbWNlTWVudUNvbnRhaW5lcid9KTsNCgkJCW4gPSBET00uYWRkKGNvLCAndGFibGUnLCB7aWQgOiAnbWVudV8nICsgdC5pZCArICdfdGJsJywgYm9yZGVyIDogMCwgY2VsbFBhZGRpbmcgOiAwLCBjZWxsU3BhY2luZyA6IDB9KTsNCgkJCXRiID0gRE9NLmFkZChuLCAndGJvZHknKTsNCg0KCQkJZWFjaCh0Lml0ZW1zLCBmdW5jdGlvbihvKSB7DQoJCQkJdC5fYWRkKHRiLCBvKTsNCgkJCX0pOw0KDQoJCQl0LnJlbmRlcmVkID0gdHJ1ZTsNCg0KCQkJcmV0dXJuIHc7DQoJCX0sDQoNCgkJLy8gSW50ZXJuYWwgZnVuY3Rpb25zDQoNCgkJX2tleUhhbmRsZXIgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGtjID0gZS5rZXlDb2RlOw0KDQoJCQlmdW5jdGlvbiBmb2N1cyhkKSB7DQoJCQkJdmFyIGkgPSB0Ll9mb2N1c0lkeCArIGQsIGUgPSBET00uc2VsZWN0KCdhJywgJ21lbnVfJyArIHQuaWQpW2ldOw0KDQoJCQkJaWYgKGUpIHsNCgkJCQkJdC5fZm9jdXNJZHggPSBpOw0KCQkJCQllLmZvY3VzKCk7DQoJCQkJfQ0KCQkJfTsNCg0KCQkJc3dpdGNoIChrYykgew0KCQkJCWNhc2UgMzg6DQoJCQkJCWZvY3VzKC0xKTsgLy8gU2VsZWN0IGZpcnN0IGxpbmsNCgkJCQkJcmV0dXJuOw0KDQoJCQkJY2FzZSA0MDoNCgkJCQkJZm9jdXMoMSk7DQoJCQkJCXJldHVybjsNCg0KCQkJCWNhc2UgMTM6DQoJCQkJCXJldHVybjsNCg0KCQkJCWNhc2UgMjc6DQoJCQkJCXJldHVybiB0aGlzLmhpZGVNZW51KCk7DQoJCQl9DQoJCX0sDQoNCgkJX2FkZCA6IGZ1bmN0aW9uKHRiLCBvKSB7DQoJCQl2YXIgbiwgcyA9IG8uc2V0dGluZ3MsIGEsIHJvLCBpdCwgY3AgPSB0aGlzLmNsYXNzUHJlZml4LCBpYzsNCg0KCQkJaWYgKHMuc2VwYXJhdG9yKSB7DQoJCQkJcm8gPSBET00uYWRkKHRiLCAndHInLCB7aWQgOiBvLmlkLCAnY2xhc3MnIDogY3AgKyAnSXRlbVNlcGFyYXRvcid9KTsNCgkJCQlET00uYWRkKHJvLCAndGQnLCB7J2NsYXNzJyA6IGNwICsgJ0l0ZW1TZXBhcmF0b3InfSk7DQoNCgkJCQlpZiAobiA9IHJvLnByZXZpb3VzU2libGluZykNCgkJCQkJRE9NLmFkZENsYXNzKG4sICdtY2VMYXN0Jyk7DQoNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCW4gPSBybyA9IERPTS5hZGQodGIsICd0cicsIHtpZCA6IG8uaWQsICdjbGFzcycgOiBjcCArICdJdGVtICcgKyBjcCArICdJdGVtRW5hYmxlZCd9KTsNCgkJCW4gPSBpdCA9IERPTS5hZGQobiwgJ3RkJyk7DQoJCQluID0gYSA9IERPTS5hZGQobiwgJ2EnLCB7aHJlZiA6ICdqYXZhc2NyaXB0OjsnLCBvbmNsaWNrIDogInJldHVybiBmYWxzZTsiLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7J30pOw0KDQoJCQlET00uYWRkQ2xhc3MoaXQsIHNbJ2NsYXNzJ10pOw0KLy8JCQluID0gRE9NLmFkZChuLCAnc3BhbicsIHsnY2xhc3MnIDogJ2l0ZW0nfSk7DQoNCgkJCWljID0gRE9NLmFkZChuLCAnc3BhbicsIHsnY2xhc3MnIDogJ21jZUljb24nICsgKHMuaWNvbiA/ICcgbWNlXycgKyBzLmljb24gOiAnJyl9KTsNCg0KCQkJaWYgKHMuaWNvbl9zcmMpDQoJCQkJRE9NLmFkZChpYywgJ2ltZycsIHtzcmMgOiBzLmljb25fc3JjfSk7DQoNCgkJCW4gPSBET00uYWRkKG4sIHMuZWxlbWVudCB8fCAnc3BhbicsIHsnY2xhc3MnIDogJ21jZVRleHQnLCB0aXRsZSA6IG8uc2V0dGluZ3MudGl0bGV9LCBvLnNldHRpbmdzLnRpdGxlKTsNCg0KCQkJaWYgKG8uc2V0dGluZ3Muc3R5bGUpDQoJCQkJRE9NLnNldEF0dHJpYihuLCAnc3R5bGUnLCBvLnNldHRpbmdzLnN0eWxlKTsNCg0KCQkJaWYgKHRiLmNoaWxkTm9kZXMubGVuZ3RoID09IDEpDQoJCQkJRE9NLmFkZENsYXNzKHJvLCAnbWNlRmlyc3QnKTsNCg0KCQkJaWYgKChuID0gcm8ucHJldmlvdXNTaWJsaW5nKSAmJiBET00uaGFzQ2xhc3MobiwgY3AgKyAnSXRlbVNlcGFyYXRvcicpKQ0KCQkJCURPTS5hZGRDbGFzcyhybywgJ21jZUZpcnN0Jyk7DQoNCgkJCWlmIChvLmNvbGxhcHNlKQ0KCQkJCURPTS5hZGRDbGFzcyhybywgY3AgKyAnSXRlbVN1YicpOw0KDQoJCQlpZiAobiA9IHJvLnByZXZpb3VzU2libGluZykNCgkJCQlET00ucmVtb3ZlQ2xhc3MobiwgJ21jZUxhc3QnKTsNCg0KCQkJRE9NLmFkZENsYXNzKHJvLCAnbWNlTGFzdCcpOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIERPTSA9IHRpbnltY2UuRE9NOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuQnV0dG9uOnRpbnltY2UudWkuQ29udHJvbCcsIHsNCgkJQnV0dG9uIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXRoaXMucGFyZW50KGlkLCBzKTsNCgkJCXRoaXMuY2xhc3NQcmVmaXggPSAnbWNlQnV0dG9uJzsNCgkJfSwNCg0KCQlyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgY3AgPSB0aGlzLmNsYXNzUHJlZml4LCBzID0gdGhpcy5zZXR0aW5ncywgaCwgbDsNCg0KCQkJbCA9IERPTS5lbmNvZGUocy5sYWJlbCB8fCAnJyk7DQoJCQloID0gJzxhIGlkPSInICsgdGhpcy5pZCArICciIGhyZWY9ImphdmFzY3JpcHQ6OyIgY2xhc3M9IicgKyBjcCArICcgJyArIGNwICsgJ0VuYWJsZWQgJyArIHNbJ2NsYXNzJ10gKyAobCA/ICcgJyArIGNwICsgJ0xhYmVsZWQnIDogJycpICsnIiBvbm1vdXNlZG93bj0icmV0dXJuIGZhbHNlOyIgb25jbGljaz0icmV0dXJuIGZhbHNlOyIgdGl0bGU9IicgKyBET00uZW5jb2RlKHMudGl0bGUpICsgJyI+JzsNCg0KCQkJaWYgKHMuaW1hZ2UpDQoJCQkJaCArPSAnPGltZyBjbGFzcz0ibWNlSWNvbiIgc3JjPSInICsgcy5pbWFnZSArICciIC8+JyArIGwgKyAnPC9hPic7DQoJCQllbHNlDQoJCQkJaCArPSAnPHNwYW4gY2xhc3M9Im1jZUljb24gJyArIHNbJ2NsYXNzJ10gKyAnIj48L3NwYW4+JyArIChsID8gJzxzcGFuIGNsYXNzPSInICsgY3AgKyAnTGFiZWwiPicgKyBsICsgJzwvc3Bhbj4nIDogJycpICsgJzwvYT4nOw0KDQoJCQlyZXR1cm4gaDsNCgkJfSwNCg0KCQlwb3N0UmVuZGVyIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzOw0KDQoJCQl0aW55bWNlLmRvbS5FdmVudC5hZGQodC5pZCwgJ2NsaWNrJywgZnVuY3Rpb24oZSkgew0KCQkJCWlmICghdC5pc0Rpc2FibGVkKCkpDQoJCQkJCXJldHVybiBzLm9uY2xpY2suY2FsbChzLnNjb3BlLCBlKTsNCgkJCX0pOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIGVhY2ggPSB0aW55bWNlLmVhY2gsIERpc3BhdGNoZXIgPSB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcjsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLkxpc3RCb3g6dGlueW1jZS51aS5Db250cm9sJywgew0KCQlMaXN0Qm94IDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5wYXJlbnQoaWQsIHMpOw0KDQoJCQl0Lml0ZW1zID0gW107DQoNCgkJCXQub25DaGFuZ2UgPSBuZXcgRGlzcGF0Y2hlcih0KTsNCg0KCQkJdC5vblBvc3RSZW5kZXIgPSBuZXcgRGlzcGF0Y2hlcih0KTsNCg0KCQkJdC5vbkFkZCA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KDQoJCQl0Lm9uUmVuZGVyTWVudSA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTsNCg0KCQkJdC5jbGFzc1ByZWZpeCA9ICdtY2VMaXN0Qm94JzsNCgkJfSwNCg0KCQlzZWxlY3QgOiBmdW5jdGlvbih2YSkgew0KCQkJdmFyIHQgPSB0aGlzLCBmdiwgZjsNCg0KCQkJaWYgKHZhID09IHVuZGVmaW5lZCkNCgkJCQlyZXR1cm4gdC5zZWxlY3RCeUluZGV4KC0xKTsNCg0KCQkJLy8gSXMgc3RyaW5nIG9yIG51bWJlciBtYWtlIGZ1bmN0aW9uIHNlbGVjdG9yDQoJCQlpZiAodmEgJiYgdmEuY2FsbCkNCgkJCQlmID0gdmE7DQoJCQllbHNlIHsNCgkJCQlmID0gZnVuY3Rpb24odikgew0KCQkJCQlyZXR1cm4gdiA9PSB2YTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQkvLyBEbyB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZz8NCgkJCWlmICh2YSAhPSB0LnNlbGVjdGVkVmFsdWUpIHsNCgkJCQkvLyBGaW5kIGl0ZW0NCgkJCQllYWNoKHQuaXRlbXMsIGZ1bmN0aW9uKG8sIGkpIHsNCgkJCQkJaWYgKGYoby52YWx1ZSkpIHsNCgkJCQkJCWZ2ID0gMTsNCgkJCQkJCXQuc2VsZWN0QnlJbmRleChpKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJaWYgKCFmdikNCgkJCQkJdC5zZWxlY3RCeUluZGV4KC0xKTsNCgkJCX0NCgkJfSwNCg0KCQlzZWxlY3RCeUluZGV4IDogZnVuY3Rpb24oaWR4KSB7DQoJCQl2YXIgdCA9IHRoaXMsIGUsIG87DQoNCgkJCWlmIChpZHggIT0gdC5zZWxlY3RlZEluZGV4KSB7DQoJCQkJZSA9IERPTS5nZXQodC5pZCArICdfdGV4dCcpOw0KCQkJCW8gPSB0Lml0ZW1zW2lkeF07DQoNCgkJCQlpZiAobykgew0KCQkJCQl0LnNlbGVjdGVkVmFsdWUgPSBvLnZhbHVlOw0KCQkJCQl0LnNlbGVjdGVkSW5kZXggPSBpZHg7DQoJCQkJCURPTS5zZXRIVE1MKGUsIERPTS5lbmNvZGUoby50aXRsZSkpOw0KCQkJCQlET00ucmVtb3ZlQ2xhc3MoZSwgJ21jZVRpdGxlJyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJRE9NLnNldEhUTUwoZSwgRE9NLmVuY29kZSh0LnNldHRpbmdzLnRpdGxlKSk7DQoJCQkJCURPTS5hZGRDbGFzcyhlLCAnbWNlVGl0bGUnKTsNCgkJCQkJdC5zZWxlY3RlZFZhbHVlID0gdC5zZWxlY3RlZEluZGV4ID0gbnVsbDsNCgkJCQl9DQoNCgkJCQllID0gMDsNCgkJCX0NCgkJfSwNCg0KCQlhZGQgOiBmdW5jdGlvbihuLCB2LCBvKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCW8gPSBvIHx8IHt9Ow0KCQkJbyA9IHRpbnltY2UuZXh0ZW5kKG8sIHsNCgkJCQl0aXRsZSA6IG4sDQoJCQkJdmFsdWUgOiB2DQoJCQl9KTsNCg0KCQkJdC5pdGVtcy5wdXNoKG8pOw0KCQkJdC5vbkFkZC5kaXNwYXRjaCh0LCBvKTsNCgkJfSwNCg0KCQlnZXRMZW5ndGggOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLml0ZW1zLmxlbmd0aDsNCgkJfSwNCg0KCQlyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgaCA9ICcnLCB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGNwID0gdC5jbGFzc1ByZWZpeDsNCg0KCQkJaCA9ICc8dGFibGUgaWQ9IicgKyB0LmlkICsgJyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0iJyArIGNwICsgJyAnICsgY3AgKyAnRW5hYmxlZCcgKyAoc1snY2xhc3MnXSA/ICgnICcgKyBzWydjbGFzcyddKSA6ICcnKSArICciPjx0Ym9keT48dHI+JzsNCgkJCWggKz0gJzx0ZD4nICsgRE9NLmNyZWF0ZUhUTUwoJ2EnLCB7aWQgOiB0LmlkICsgJ190ZXh0JywgaHJlZiA6ICdqYXZhc2NyaXB0OjsnLCAnY2xhc3MnIDogJ21jZVRleHQnLCBvbmNsaWNrIDogInJldHVybiBmYWxzZTsiLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7J30sIERPTS5lbmNvZGUodC5zZXR0aW5ncy50aXRsZSkpICsgJzwvdGQ+JzsNCgkJCWggKz0gJzx0ZD4nICsgRE9NLmNyZWF0ZUhUTUwoJ2EnLCB7aWQgOiB0LmlkICsgJ19vcGVuJywgdGFiaW5kZXggOiAtMSwgaHJlZiA6ICdqYXZhc2NyaXB0OjsnLCAnY2xhc3MnIDogJ21jZU9wZW4nLCBvbmNsaWNrIDogInJldHVybiBmYWxzZTsiLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7J30sICc8c3Bhbj48L3NwYW4+JykgKyAnPC90ZD4nOw0KCQkJaCArPSAnPC90cj48L3Rib2R5PjwvdGFibGU+JzsNCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJc2hvd01lbnUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcDEsIHAyLCBlID0gRE9NLmdldCh0aGlzLmlkKSwgbTsNCg0KCQkJaWYgKHQuaXNEaXNhYmxlZCgpIHx8IHQuaXRlbXMubGVuZ3RoID09IDApDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiAodC5tZW51ICYmIHQubWVudS5pc01lbnVWaXNpYmxlKQ0KCQkJCXJldHVybiB0LmhpZGVNZW51KCk7DQoNCgkJCWlmICghdC5pc01lbnVSZW5kZXJlZCkgew0KCQkJCXQucmVuZGVyTWVudSgpOw0KCQkJCXQuaXNNZW51UmVuZGVyZWQgPSB0cnVlOw0KCQkJfQ0KDQoJCQlwMSA9IERPTS5nZXRQb3ModGhpcy5zZXR0aW5ncy5tZW51X2NvbnRhaW5lcik7DQoJCQlwMiA9IERPTS5nZXRQb3MoZSk7DQoNCgkJCW0gPSB0Lm1lbnU7DQoJCQltLnNldHRpbmdzLm9mZnNldF94ID0gcDIueDsNCgkJCW0uc2V0dGluZ3Mub2Zmc2V0X3kgPSBwMi55Ow0KCQkJbS5zZXR0aW5ncy5rZXlib2FyZF9mb2N1cyA9ICF0aW55bWNlLmlzT3BlcmE7IC8vIE9wZXJhIGlzIGJ1Z2d5IHdoZW4gaXQgY29tZXMgdG8gYXV0byBmb2N1cw0KDQoJCQkvLyBTZWxlY3QgaW4gbWVudQ0KCQkJaWYgKHQub2xkSUQpDQoJCQkJbS5pdGVtc1t0Lm9sZElEXS5zZXRTZWxlY3RlZCgwKTsNCg0KCQkJZWFjaCh0Lml0ZW1zLCBmdW5jdGlvbihvKSB7DQoJCQkJaWYgKG8udmFsdWUgPT09IHQuc2VsZWN0ZWRWYWx1ZSkgew0KCQkJCQltLml0ZW1zW28uaWRdLnNldFNlbGVjdGVkKDEpOw0KCQkJCQl0Lm9sZElEID0gby5pZDsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJbS5zaG93TWVudSgwLCBlLmNsaWVudEhlaWdodCk7DQoNCgkJCUV2ZW50LmFkZChET00uZG9jLCAnbW91c2Vkb3duJywgdC5oaWRlTWVudSwgdCk7DQoJCQlET00uYWRkQ2xhc3ModC5pZCwgdC5jbGFzc1ByZWZpeCArICdTZWxlY3RlZCcpOw0KDQoJCQkvL0RPTS5nZXQodC5pZCArICdfdGV4dCcpLmZvY3VzKCk7DQoJCX0sDQoNCgkJaGlkZU1lbnUgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWlmICh0Lm1lbnUgJiYgdC5tZW51LmlzTWVudVZpc2libGUpIHsNCgkJCQkvLyBQcmV2ZW50IGRvdWJsZSB0b29nbGVzIGJ5IGNhbmNlbGluZyB0aGUgbW91c2UgY2xpY2sgZXZlbnQgdG8gdGhlIGJ1dHRvbg0KCQkJCWlmIChlICYmIGUudHlwZSA9PSAibW91c2Vkb3duIiAmJiAoZS50YXJnZXQuaWQgPT0gdC5pZCArICdfdGV4dCcgfHwgZS50YXJnZXQuaWQgPT0gdC5pZCArICdfb3BlbicpKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlpZiAoIWUgfHwgIURPTS5nZXRQYXJlbnQoZS50YXJnZXQsICcubWNlTWVudScpKSB7DQoJCQkJCURPTS5yZW1vdmVDbGFzcyh0LmlkLCB0LmNsYXNzUHJlZml4ICsgJ1NlbGVjdGVkJyk7DQoJCQkJCUV2ZW50LnJlbW92ZShET00uZG9jLCAnbW91c2Vkb3duJywgdC5oaWRlTWVudSwgdCk7DQoJCQkJCXQubWVudS5oaWRlTWVudSgpOw0KCQkJCX0NCgkJCX0NCgkJfSwNCg0KCQlyZW5kZXJNZW51IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG07DQoNCgkJCW0gPSB0LnNldHRpbmdzLmNvbnRyb2xfbWFuYWdlci5jcmVhdGVEcm9wTWVudSh0LmlkICsgJ19tZW51Jywgew0KCQkJCW1lbnVfbGluZSA6IDEsDQoJCQkJJ2NsYXNzJyA6IHQuY2xhc3NQcmVmaXggKyAnTWVudSBtY2VOb0ljb25zJywNCgkJCQltYXhfd2lkdGggOiAxNTAsDQoJCQkJbWF4X2hlaWdodCA6IDE1MA0KCQkJfSk7DQoNCgkJCW0ub25IaWRlTWVudS5hZGQodC5oaWRlTWVudSwgdCk7DQoNCgkJCW0uYWRkKHsNCgkJCQl0aXRsZSA6IHQuc2V0dGluZ3MudGl0bGUsDQoJCQkJJ2NsYXNzJyA6ICdtY2VNZW51SXRlbVRpdGxlJywNCgkJCQlvbmNsaWNrIDogZnVuY3Rpb24oKSB7DQoJCQkJCWlmICh0LnNldHRpbmdzLm9uc2VsZWN0KCcnKSAhPT0gZmFsc2UpDQoJCQkJCQl0LnNlbGVjdCgnJyk7IC8vIE11c3QgYmUgcnVubmVkIGFmdGVyDQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24obykgew0KCQkJCS8vIE5vIHZhbHVlIHRoZW4gdHJlYXQgaXQgYXMgYSB0aXRsZQ0KCQkJCWlmIChvLnZhbHVlID09PSB1bmRlZmluZWQpIHsNCgkJCQkJbS5hZGQoew0KCQkJCQkJdGl0bGUgOiBvLnRpdGxlLA0KCQkJCQkJJ2NsYXNzJyA6ICdtY2VNZW51SXRlbVRpdGxlJywNCgkJCQkJCW9uY2xpY2sgOiBmdW5jdGlvbigpIHsNCgkJCQkJCQlpZiAodC5zZXR0aW5ncy5vbnNlbGVjdCgnJykgIT09IGZhbHNlKQ0KCQkJCQkJCQl0LnNlbGVjdCgnJyk7IC8vIE11c3QgYmUgcnVubmVkIGFmdGVyDQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCW8uaWQgPSBET00udW5pcXVlSWQoKTsNCgkJCQkJby5vbmNsaWNrID0gZnVuY3Rpb24oKSB7DQoJCQkJCQlpZiAodC5zZXR0aW5ncy5vbnNlbGVjdChvLnZhbHVlKSAhPT0gZmFsc2UpDQoJCQkJCQkJdC5zZWxlY3Qoby52YWx1ZSk7IC8vIE11c3QgYmUgcnVubmVkIGFmdGVyDQoJCQkJCX07DQoNCgkJCQkJbS5hZGQobyk7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXQub25SZW5kZXJNZW51LmRpc3BhdGNoKHQsIG0pOw0KCQkJdC5tZW51ID0gbTsNCgkJfSwNCg0KCQlwb3N0UmVuZGVyIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNwID0gdC5jbGFzc1ByZWZpeDsNCg0KCQkJRXZlbnQuYWRkKHQuaWQsICdjbGljaycsIHQuc2hvd01lbnUsIHQpOw0KCQkJRXZlbnQuYWRkKHQuaWQgKyAnX3RleHQnLCAnZm9jdXMnLCBmdW5jdGlvbigpIHsNCgkJCQlpZiAoIXQuX2ZvY3VzZWQpIHsNCgkJCQkJdC5rZXlEb3duSGFuZGxlciA9IEV2ZW50LmFkZCh0LmlkICsgJ190ZXh0JywgJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7DQoJCQkJCQl2YXIgaWR4ID0gLTEsIHYsIGtjID0gZS5rZXlDb2RlOw0KDQoJCQkJCQkvLyBGaW5kIGN1cnJlbnQgaW5kZXgNCgkJCQkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24odiwgaSkgew0KCQkJCQkJCWlmICh0LnNlbGVjdGVkVmFsdWUgPT0gdi52YWx1ZSkNCgkJCQkJCQkJaWR4ID0gaTsNCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBNb3ZlIHVwL2Rvd24NCgkJCQkJCWlmIChrYyA9PSAzOCkNCgkJCQkJCQl2ID0gdC5pdGVtc1tpZHggLSAxXTsNCgkJCQkJCWVsc2UgaWYgKGtjID09IDQwKQ0KCQkJCQkJCXYgPSB0Lml0ZW1zW2lkeCArIDFdOw0KCQkJCQkJZWxzZSBpZiAoa2MgPT0gMTMpIHsNCgkJCQkJCQkvLyBGYWtlIHNlbGVjdCBvbiBlbnRlcg0KCQkJCQkJCXYgPSB0LnNlbGVjdGVkVmFsdWU7DQoJCQkJCQkJdC5zZWxlY3RlZFZhbHVlID0gbnVsbDsgLy8gTmVlZHMgdG8gYmUgbnVsbCB0byBmYWtlIGNoYW5nZQ0KCQkJCQkJCXQuc2V0dGluZ3Mub25zZWxlY3Qodik7DQoJCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQkJCX0NCg0KCQkJCQkJaWYgKHYpIHsNCgkJCQkJCQl0LmhpZGVNZW51KCk7DQoJCQkJCQkJdC5zZWxlY3Qodi52YWx1ZSk7DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0NCg0KCQkJCXQuX2ZvY3VzZWQgPSAxOw0KCQkJfSk7DQoJCQlFdmVudC5hZGQodC5pZCArICdfdGV4dCcsICdibHVyJywgZnVuY3Rpb24oKSB7RXZlbnQucmVtb3ZlKHQuaWQgKyAnX3RleHQnLCAna2V5ZG93bicsIHQua2V5RG93bkhhbmRsZXIpOyB0Ll9mb2N1c2VkID0gMDt9KTsNCg0KCQkJLy8gT2xkIElFIGRvZXNuJ3QgaGF2ZSBob3ZlciBvbiBhbGwgZWxlbWVudHMNCgkJCWlmICh0aW55bWNlLmlzSUU2IHx8ICFET00uYm94TW9kZWwpIHsNCgkJCQlFdmVudC5hZGQodC5pZCwgJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoIURPTS5oYXNDbGFzcyh0LmlkLCBjcCArICdEaXNhYmxlZCcpKQ0KCQkJCQkJRE9NLmFkZENsYXNzKHQuaWQsIGNwICsgJ0hvdmVyJyk7DQoJCQkJfSk7DQoNCgkJCQlFdmVudC5hZGQodC5pZCwgJ21vdXNlb3V0JywgZnVuY3Rpb24oKSB7DQoJCQkJCWlmICghRE9NLmhhc0NsYXNzKHQuaWQsIGNwICsgJ0Rpc2FibGVkJykpDQoJCQkJCQlET00ucmVtb3ZlQ2xhc3ModC5pZCwgY3AgKyAnSG92ZXInKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJdC5vblBvc3RSZW5kZXIuZGlzcGF0Y2godCwgRE9NLmdldCh0LmlkKSk7DQoJCX0sDQoNCgkJZGVzdHJveSA6IGZ1bmN0aW9uKCkgew0KCQkJdGhpcy5wYXJlbnQoKTsNCg0KCQkJRXZlbnQuY2xlYXIodGhpcy5pZCArICdfdGV4dCcpOw0KCQkJRXZlbnQuY2xlYXIodGhpcy5pZCArICdfb3BlbicpOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIERPTSA9IHRpbnltY2UuRE9NLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBlYWNoID0gdGlueW1jZS5lYWNoLCBEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXI7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5OYXRpdmVMaXN0Qm94OnRpbnltY2UudWkuTGlzdEJveCcsIHsNCgkJTmF0aXZlTGlzdEJveCA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl0aGlzLnBhcmVudChpZCwgcyk7DQoJCQl0aGlzLmNsYXNzUHJlZml4ID0gJ21jZU5hdGl2ZUxpc3RCb3gnOw0KCQl9LA0KDQoJCXNldERpc2FibGVkIDogZnVuY3Rpb24ocykgew0KCQkJRE9NLmdldCh0aGlzLmlkKS5kaXNhYmxlZCA9IHM7DQoJCX0sDQoNCgkJaXNEaXNhYmxlZCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIERPTS5nZXQodGhpcy5pZCkuZGlzYWJsZWQ7DQoJCX0sDQoNCgkJc2VsZWN0IDogZnVuY3Rpb24odmEpIHsNCgkJCXZhciB0ID0gdGhpcywgZnYsIGY7DQoNCgkJCWlmICh2YSA9PSB1bmRlZmluZWQpDQoJCQkJcmV0dXJuIHQuc2VsZWN0QnlJbmRleCgtMSk7DQoNCgkJCS8vIElzIHN0cmluZyBvciBudW1iZXIgbWFrZSBmdW5jdGlvbiBzZWxlY3Rvcg0KCQkJaWYgKHZhICYmIHZhLmNhbGwpDQoJCQkJZiA9IHZhOw0KCQkJZWxzZSB7DQoJCQkJZiA9IGZ1bmN0aW9uKHYpIHsNCgkJCQkJcmV0dXJuIHYgPT0gdmE7DQoJCQkJfTsNCgkJCX0NCg0KCQkJLy8gRG8gd2UgbmVlZCB0byBkbyBzb21ldGhpbmc/DQoJCQlpZiAodmEgIT0gdC5zZWxlY3RlZFZhbHVlKSB7DQoJCQkJLy8gRmluZCBpdGVtDQoJCQkJZWFjaCh0Lml0ZW1zLCBmdW5jdGlvbihvLCBpKSB7DQoJCQkJCWlmIChmKG8udmFsdWUpKSB7DQoJCQkJCQlmdiA9IDE7DQoJCQkJCQl0LnNlbGVjdEJ5SW5kZXgoaSk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCWlmICghZnYpDQoJCQkJCXQuc2VsZWN0QnlJbmRleCgtMSk7DQoJCQl9DQoJCX0sDQoNCgkJc2VsZWN0QnlJbmRleCA6IGZ1bmN0aW9uKGlkeCkgew0KCQkJRE9NLmdldCh0aGlzLmlkKS5zZWxlY3RlZEluZGV4ID0gaWR4ICsgMTsNCgkJCXRoaXMuc2VsZWN0ZWRWYWx1ZSA9IHRoaXMuaXRlbXNbaWR4XSA/IHRoaXMuaXRlbXNbaWR4XS52YWx1ZSA6IG51bGw7DQoJCX0sDQoNCgkJYWRkIDogZnVuY3Rpb24obiwgdiwgYSkgew0KCQkJdmFyIG8sIHQgPSB0aGlzOw0KDQoJCQlhID0gYSB8fCB7fTsNCgkJCWEudmFsdWUgPSB2Ow0KDQoJCQlpZiAodC5pc1JlbmRlcmVkKCkpDQoJCQkJRE9NLmFkZChET00uZ2V0KHRoaXMuaWQpLCAnb3B0aW9uJywgYSwgbik7DQoNCgkJCW8gPSB7DQoJCQkJdGl0bGUgOiBuLA0KCQkJCXZhbHVlIDogdiwNCgkJCQlhdHRyaWJzIDogYQ0KCQkJfTsNCg0KCQkJdC5pdGVtcy5wdXNoKG8pOw0KCQkJdC5vbkFkZC5kaXNwYXRjaCh0LCBvKTsNCgkJfSwNCg0KCQlnZXRMZW5ndGggOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLml0ZW1zLmxlbmd0aDsNCgkJfSwNCg0KCQlyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgaCwgdCA9IHRoaXM7DQoNCgkJCWggPSBET00uY3JlYXRlSFRNTCgnb3B0aW9uJywge3ZhbHVlIDogJyd9LCAnLS0gJyArIHQuc2V0dGluZ3MudGl0bGUgKyAnIC0tJyk7DQoNCgkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24oaXQpIHsNCgkJCQloICs9IERPTS5jcmVhdGVIVE1MKCdvcHRpb24nLCB7dmFsdWUgOiBpdC52YWx1ZX0sIGl0LnRpdGxlKTsNCgkJCX0pOw0KDQoJCQloID0gRE9NLmNyZWF0ZUhUTUwoJ3NlbGVjdCcsIHtpZCA6IHQuaWQsICdjbGFzcycgOiAnbWNlTmF0aXZlTGlzdEJveCd9LCBoKTsNCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBjaDsNCg0KCQkJdC5yZW5kZXJlZCA9IHRydWU7DQoNCgkJCWZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHsNCgkJCQl2YXIgdiA9IHQuaXRlbXNbZS50YXJnZXQuc2VsZWN0ZWRJbmRleCAtIDFdOw0KDQoJCQkJaWYgKHYgJiYgKHYgPSB2LnZhbHVlKSkgew0KCQkJCQl0Lm9uQ2hhbmdlLmRpc3BhdGNoKHQsIHYpOw0KDQoJCQkJCWlmICh0LnNldHRpbmdzLm9uc2VsZWN0KQ0KCQkJCQkJdC5zZXR0aW5ncy5vbnNlbGVjdCh2KTsNCgkJCQl9DQoJCQl9Ow0KDQoJCQlFdmVudC5hZGQodC5pZCwgJ2NoYW5nZScsIG9uQ2hhbmdlKTsNCg0KCQkJLy8gQWNjZXNzaWJpbGl0eSBrZXloYW5kbGVyDQoJCQlFdmVudC5hZGQodC5pZCwgJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIGJmOw0KDQoJCQkJRXZlbnQucmVtb3ZlKHQuaWQsICdjaGFuZ2UnLCBjaCk7DQoNCgkJCQliZiA9IEV2ZW50LmFkZCh0LmlkLCAnYmx1cicsIGZ1bmN0aW9uKCkgew0KCQkJCQlFdmVudC5hZGQodC5pZCwgJ2NoYW5nZScsIG9uQ2hhbmdlKTsNCgkJCQkJRXZlbnQucmVtb3ZlKHQuaWQsICdibHVyJywgYmYpOw0KCQkJCX0pOw0KDQoJCQkJaWYgKGUua2V5Q29kZSA9PSAxMyB8fCBlLmtleUNvZGUgPT0gMzIpIHsNCgkJCQkJb25DaGFuZ2UoZSk7DQoJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXQub25Qb3N0UmVuZGVyLmRpc3BhdGNoKHQsIERPTS5nZXQodC5pZCkpOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIERPTSA9IHRpbnltY2UuRE9NLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBlYWNoID0gdGlueW1jZS5lYWNoOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuTWVudUJ1dHRvbjp0aW55bWNlLnVpLkJ1dHRvbicsIHsNCgkJTWVudUJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl0aGlzLnBhcmVudChpZCwgcyk7DQoNCgkJCXRoaXMub25SZW5kZXJNZW51ID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpOw0KDQoJCQlzLm1lbnVfY29udGFpbmVyID0gcy5tZW51X2NvbnRhaW5lciB8fCBET00uZG9jLmJvZHk7DQoJCX0sDQoNCgkJc2hvd01lbnUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcDEsIHAyLCBlID0gRE9NLmdldCh0LmlkKSwgbTsNCg0KCQkJaWYgKHQuaXNEaXNhYmxlZCgpKQ0KCQkJCXJldHVybjsNCg0KCQkJaWYgKCF0LmlzTWVudVJlbmRlcmVkKSB7DQoJCQkJdC5yZW5kZXJNZW51KCk7DQoJCQkJdC5pc01lbnVSZW5kZXJlZCA9IHRydWU7DQoJCQl9DQoNCgkJCWlmICh0LmlzTWVudVZpc2libGUpDQoJCQkJcmV0dXJuIHQuaGlkZU1lbnUoKTsNCg0KCQkJcDEgPSBET00uZ2V0UG9zKHQuc2V0dGluZ3MubWVudV9jb250YWluZXIpOw0KCQkJcDIgPSBET00uZ2V0UG9zKGUpOw0KDQoJCQltID0gdC5tZW51Ow0KCQkJbS5zZXR0aW5ncy5vZmZzZXRfeCA9IHAyLng7DQoJCQltLnNldHRpbmdzLm9mZnNldF95ID0gcDIueTsNCgkJCW0uc2V0dGluZ3MudnBfb2Zmc2V0X3ggPSBwMi54Ow0KCQkJbS5zZXR0aW5ncy52cF9vZmZzZXRfeSA9IHAyLnk7DQoJCQltLnNldHRpbmdzLmtleWJvYXJkX2ZvY3VzID0gdC5fZm9jdXNlZDsNCgkJCW0uc2hvd01lbnUoMCwgZS5jbGllbnRIZWlnaHQpOw0KDQoJCQlFdmVudC5hZGQoRE9NLmRvYywgJ21vdXNlZG93bicsIHQuaGlkZU1lbnUsIHQpOw0KCQkJdC5zZXRTdGF0ZSgnU2VsZWN0ZWQnLCAxKTsNCg0KCQkJdC5pc01lbnVWaXNpYmxlID0gMTsNCgkJfSwNCg0KCQlyZW5kZXJNZW51IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG07DQoNCgkJCW0gPSB0LnNldHRpbmdzLmNvbnRyb2xfbWFuYWdlci5jcmVhdGVEcm9wTWVudSh0LmlkICsgJ19tZW51Jywgew0KCQkJCW1lbnVfbGluZSA6IDEsDQoJCQkJJ2NsYXNzJyA6IHRoaXMuY2xhc3NQcmVmaXggKyAnTWVudScsDQoJCQkJaWNvbnMgOiB0LnNldHRpbmdzLmljb25zDQoJCQl9KTsNCg0KCQkJbS5vbkhpZGVNZW51LmFkZCh0LmhpZGVNZW51LCB0KTsNCg0KCQkJdC5vblJlbmRlck1lbnUuZGlzcGF0Y2godCwgbSk7DQoJCQl0Lm1lbnUgPSBtOw0KCQl9LA0KDQoJCWhpZGVNZW51IDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQkvLyBQcmV2ZW50IGRvdWJsZSB0b29nbGVzIGJ5IGNhbmNlbGluZyB0aGUgbW91c2UgY2xpY2sgZXZlbnQgdG8gdGhlIGJ1dHRvbg0KCQkJaWYgKGUgJiYgZS50eXBlID09ICJtb3VzZWRvd24iICYmIERPTS5nZXRQYXJlbnQoZS50YXJnZXQsIGZ1bmN0aW9uKGUpIHtyZXR1cm4gZS5pZCA9PT0gdC5pZCB8fCBlLmlkID09PSB0LmlkICsgJ19vcGVuJzt9KSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICghZSB8fCAhRE9NLmdldFBhcmVudChlLnRhcmdldCwgJy5tY2VNZW51JykpIHsNCgkJCQl0LnNldFN0YXRlKCdTZWxlY3RlZCcsIDApOw0KCQkJCUV2ZW50LnJlbW92ZShET00uZG9jLCAnbW91c2Vkb3duJywgdC5oaWRlTWVudSwgdCk7DQoJCQkJaWYgKHQubWVudSkNCgkJCQkJdC5tZW51LmhpZGVNZW51KCk7DQoJCQl9DQoNCgkJCXQuaXNNZW51VmlzaWJsZSA9IDA7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJRXZlbnQuYWRkKHQuaWQsICdjbGljaycsIGZ1bmN0aW9uKCkgew0KCQkJCWlmICghdC5pc0Rpc2FibGVkKCkpIHsNCgkJCQkJaWYgKHMub25jbGljaykNCgkJCQkJCXMub25jbGljayh0LnZhbHVlKTsNCg0KCQkJCQl0LnNob3dNZW51KCk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBET00gPSB0aW55bWNlLkRPTSwgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwgZWFjaCA9IHRpbnltY2UuZWFjaDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLlNwbGl0QnV0dG9uOnRpbnltY2UudWkuTWVudUJ1dHRvbicsIHsNCgkJU3BsaXRCdXR0b24gOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQkJdGhpcy5jbGFzc1ByZWZpeCA9ICdtY2VTcGxpdEJ1dHRvbic7DQoJCX0sDQoNCgkJcmVuZGVySFRNTCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGgsIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgaDE7DQoNCgkJCWggPSAnPHRib2R5Pjx0cj4nOw0KDQoJCQlpZiAocy5pbWFnZSkNCgkJCQloMSA9IERPTS5jcmVhdGVIVE1MKCdpbWcgJywge3NyYyA6IHMuaW1hZ2UsICdjbGFzcycgOiAnbWNlQWN0aW9uICcgKyBzWydjbGFzcyddfSk7DQoJCQllbHNlDQoJCQkJaDEgPSBET00uY3JlYXRlSFRNTCgnc3BhbicsIHsnY2xhc3MnIDogJ21jZUFjdGlvbiAnICsgc1snY2xhc3MnXX0sICcnKTsNCg0KCQkJaCArPSAnPHRkPicgKyBET00uY3JlYXRlSFRNTCgnYScsIHtpZCA6IHQuaWQgKyAnX2FjdGlvbicsIGhyZWYgOiAnamF2YXNjcmlwdDo7JywgJ2NsYXNzJyA6ICdtY2VBY3Rpb24gJyArIHNbJ2NsYXNzJ10sIG9uY2xpY2sgOiAicmV0dXJuIGZhbHNlOyIsIG9ubW91c2Vkb3duIDogJ3JldHVybiBmYWxzZTsnLCB0aXRsZSA6IHMudGl0bGV9LCBoMSkgKyAnPC90ZD4nOw0KCQ0KCQkJaDEgPSBET00uY3JlYXRlSFRNTCgnc3BhbicsIHsnY2xhc3MnIDogJ21jZU9wZW4gJyArIHNbJ2NsYXNzJ119KTsNCgkJCWggKz0gJzx0ZD4nICsgRE9NLmNyZWF0ZUhUTUwoJ2EnLCB7aWQgOiB0LmlkICsgJ19vcGVuJywgaHJlZiA6ICdqYXZhc2NyaXB0OjsnLCAnY2xhc3MnIDogJ21jZU9wZW4gJyArIHNbJ2NsYXNzJ10sIG9uY2xpY2sgOiAicmV0dXJuIGZhbHNlOyIsIG9ubW91c2Vkb3duIDogJ3JldHVybiBmYWxzZTsnLCB0aXRsZSA6IHMudGl0bGV9LCBoMSkgKyAnPC90ZD4nOw0KDQoJCQloICs9ICc8L3RyPjwvdGJvZHk+JzsNCg0KCQkJcmV0dXJuIERPTS5jcmVhdGVIVE1MKCd0YWJsZScsIHtpZCA6IHQuaWQsICdjbGFzcycgOiAnbWNlU3BsaXRCdXR0b24gbWNlU3BsaXRCdXR0b25FbmFibGVkICcgKyBzWydjbGFzcyddLCBjZWxscGFkZGluZyA6ICcwJywgY2VsbHNwYWNpbmcgOiAnMCcsIG9ubW91c2Vkb3duIDogJ3JldHVybiBmYWxzZTsnLCB0aXRsZSA6IHMudGl0bGV9LCBoKTsNCgkJfSwNCg0KCQlwb3N0UmVuZGVyIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzOw0KDQoJCQlpZiAocy5vbmNsaWNrKSB7DQoJCQkJRXZlbnQuYWRkKHQuaWQgKyAnX2FjdGlvbicsICdjbGljaycsIGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoIXQuaXNEaXNhYmxlZCgpKQ0KCQkJCQkJcy5vbmNsaWNrKHQudmFsdWUpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlFdmVudC5hZGQodC5pZCArICdfb3BlbicsICdjbGljaycsIHQuc2hvd01lbnUsIHQpOw0KCQkJRXZlbnQuYWRkKHQuaWQgKyAnX29wZW4nLCAnZm9jdXMnLCBmdW5jdGlvbigpIHt0Ll9mb2N1c2VkID0gMTt9KTsNCgkJCUV2ZW50LmFkZCh0LmlkICsgJ19vcGVuJywgJ2JsdXInLCBmdW5jdGlvbigpIHt0Ll9mb2N1c2VkID0gMDt9KTsNCg0KCQkJLy8gT2xkIElFIGRvZXNuJ3QgaGF2ZSBob3ZlciBvbiBhbGwgZWxlbWVudHMNCgkJCWlmICh0aW55bWNlLmlzSUU2IHx8ICFET00uYm94TW9kZWwpIHsNCgkJCQlFdmVudC5hZGQodC5pZCwgJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoIURPTS5oYXNDbGFzcyh0LmlkLCAnbWNlU3BsaXRCdXR0b25EaXNhYmxlZCcpKQ0KCQkJCQkJRE9NLmFkZENsYXNzKHQuaWQsICdtY2VTcGxpdEJ1dHRvbkhvdmVyJyk7DQoJCQkJfSk7DQoNCgkJCQlFdmVudC5hZGQodC5pZCwgJ21vdXNlb3V0JywgZnVuY3Rpb24oKSB7DQoJCQkJCWlmICghRE9NLmhhc0NsYXNzKHQuaWQsICdtY2VTcGxpdEJ1dHRvbkRpc2FibGVkJykpDQoJCQkJCQlET00ucmVtb3ZlQ2xhc3ModC5pZCwgJ21jZVNwbGl0QnV0dG9uSG92ZXInKTsNCgkJCQl9KTsNCgkJCX0NCgkJfSwNCg0KCQlkZXN0cm95IDogZnVuY3Rpb24oKSB7DQoJCQl0aGlzLnBhcmVudCgpOw0KDQoJCQlFdmVudC5jbGVhcih0aGlzLmlkICsgJ19hY3Rpb24nKTsNCgkJCUV2ZW50LmNsZWFyKHRoaXMuaWQgKyAnX29wZW4nKTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIERPTSA9IHRpbnltY2UuRE9NLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBpcyA9IHRpbnltY2UuaXMsIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5Db2xvclNwbGl0QnV0dG9uOnRpbnltY2UudWkuU3BsaXRCdXR0b24nLCB7DQoJCUNvbG9yU3BsaXRCdXR0b24gOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LnBhcmVudChpZCwgcyk7DQoNCgkJCXQuc2V0dGluZ3MgPSBzID0gdGlueW1jZS5leHRlbmQoew0KCQkJCWNvbG9ycyA6ICcwMDAwMDAsOTkzMzAwLDMzMzMwMCwwMDMzMDAsMDAzMzY2LDAwMDA4MCwzMzMzOTksMzMzMzMzLDgwMDAwMCxGRjY2MDAsODA4MDAwLDAwODAwMCwwMDgwODAsMDAwMEZGLDY2NjY5OSw4MDgwODAsRkYwMDAwLEZGOTkwMCw5OUNDMDAsMzM5OTY2LDMzQ0NDQywzMzY2RkYsODAwMDgwLDk5OTk5OSxGRjAwRkYsRkZDQzAwLEZGRkYwMCwwMEZGMDAsMDBGRkZGLDAwQ0NGRiw5OTMzNjYsQzBDMEMwLEZGOTlDQyxGRkNDOTksRkZGRjk5LENDRkZDQyxDQ0ZGRkYsOTlDQ0ZGLENDOTlGRixGRkZGRkYnLA0KCQkJCWdyaWRfd2lkdGggOiA4LA0KCQkJCWRlZmF1bHRfY29sb3IgOiAnIzg4ODg4OCcNCgkJCX0sIHQuc2V0dGluZ3MpOw0KDQoJCQl0Lm9uU2hvd01lbnUgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodCk7DQoNCgkJCXQub25IaWRlTWVudSA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0KTsNCg0KCQkJdC52YWx1ZSA9IHMuZGVmYXVsdF9jb2xvcjsNCgkJfSwNCg0KCQlzaG93TWVudSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCByLCBwLCBlLCBwMjsNCg0KCQkJaWYgKHQuaXNEaXNhYmxlZCgpKQ0KCQkJCXJldHVybjsNCg0KCQkJaWYgKCF0LmlzTWVudVJlbmRlcmVkKSB7DQoJCQkJdC5yZW5kZXJNZW51KCk7DQoJCQkJdC5pc01lbnVSZW5kZXJlZCA9IHRydWU7DQoJCQl9DQoNCgkJCWlmICh0LmlzTWVudVZpc2libGUpDQoJCQkJcmV0dXJuIHQuaGlkZU1lbnUoKTsNCg0KCQkJZSA9IERPTS5nZXQodC5pZCk7DQoJCQlET00uc2hvdyh0LmlkICsgJ19tZW51Jyk7DQoJCQlET00uYWRkQ2xhc3MoZSwgJ21jZVNwbGl0QnV0dG9uU2VsZWN0ZWQnKTsNCgkJCXAyID0gRE9NLmdldFBvcyhlKTsNCgkJCURPTS5zZXRTdHlsZXModC5pZCArICdfbWVudScsIHsNCgkJCQlsZWZ0IDogcDIueCwNCgkJCQl0b3AgOiBwMi55ICsgZS5jbGllbnRIZWlnaHQsDQoJCQkJekluZGV4IDogMjAwMDAwDQoJCQl9KTsNCgkJCWUgPSAwOw0KDQoJCQlFdmVudC5hZGQoRE9NLmRvYywgJ21vdXNlZG93bicsIHQuaGlkZU1lbnUsIHQpOw0KCQkJdC5vblNob3dNZW51LmRpc3BhdGNoKHQpOw0KDQoJCQlpZiAodC5fZm9jdXNlZCkgew0KCQkJCXQuX2tleUhhbmRsZXIgPSBFdmVudC5hZGQodC5pZCArICdfbWVudScsICdrZXlkb3duJywgZnVuY3Rpb24oZSkgew0KCQkJCQlpZiAoZS5rZXlDb2RlID09IDI3KQ0KCQkJCQkJdC5oaWRlTWVudSgpOw0KCQkJCX0pOw0KDQoJCQkJRE9NLnNlbGVjdCgnYScsIHQuaWQgKyAnX21lbnUnKVswXS5mb2N1cygpOyAvLyBTZWxlY3QgZmlyc3QgbGluaw0KCQkJfQ0KDQoJCQl0LmlzTWVudVZpc2libGUgPSAxOw0KCQl9LA0KDQoJCWhpZGVNZW51IDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQkvLyBQcmV2ZW50IGRvdWJsZSB0b29nbGVzIGJ5IGNhbmNlbGluZyB0aGUgbW91c2UgY2xpY2sgZXZlbnQgdG8gdGhlIGJ1dHRvbg0KCQkJaWYgKGUgJiYgZS50eXBlID09ICJtb3VzZWRvd24iICYmIERPTS5nZXRQYXJlbnQoZS50YXJnZXQsIGZ1bmN0aW9uKGUpIHtyZXR1cm4gZS5pZCA9PT0gdC5pZCArICdfb3Blbic7fSkpDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiAoIWUgfHwgIURPTS5nZXRQYXJlbnQoZS50YXJnZXQsICcubWNlU3BsaXRCdXR0b25NZW51JykpIHsNCgkJCQlET00ucmVtb3ZlQ2xhc3ModC5pZCwgJ21jZVNwbGl0QnV0dG9uU2VsZWN0ZWQnKTsNCgkJCQlFdmVudC5yZW1vdmUoRE9NLmRvYywgJ21vdXNlZG93bicsIHQuaGlkZU1lbnUsIHQpOw0KCQkJCUV2ZW50LnJlbW92ZSh0LmlkICsgJ19tZW51JywgJ2tleWRvd24nLCB0Ll9rZXlIYW5kbGVyKTsNCgkJCQlET00uaGlkZSh0LmlkICsgJ19tZW51Jyk7DQoJCQl9DQoNCgkJCXQub25IaWRlTWVudS5kaXNwYXRjaCh0KTsNCg0KCQkJdC5pc01lbnVWaXNpYmxlID0gMDsNCgkJfSwNCg0KCQlyZW5kZXJNZW51IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG0sIGkgPSAwLCBzID0gdC5zZXR0aW5ncywgbiwgdGIsIHRyLCB3Ow0KDQoJCQl3ID0gRE9NLmFkZChzLm1lbnVfY29udGFpbmVyLCAnZGl2Jywge2lkIDogdC5pZCArICdfbWVudScsICdjbGFzcycgOiBzWydtZW51X2NsYXNzJ10gKyAnICcgKyBzWydjbGFzcyddLCBzdHlsZSA6ICdwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOi0xMDAwcHg7J30pOw0KCQkJbSA9IERPTS5hZGQodywgJ2RpdicsIHsnY2xhc3MnIDogc1snY2xhc3MnXSArICcgbWNlU3BsaXRCdXR0b25NZW51J30pOw0KCQkJRE9NLmFkZChtLCAnc3BhbicsIHsnY2xhc3MnIDogJ21jZU1lbnVMaW5lJ30pOw0KDQoJCQluID0gRE9NLmFkZChtLCAndGFibGUnLCB7J2NsYXNzJyA6ICdtY2VDb2xvclNwbGl0TWVudSd9KTsNCgkJCXRiID0gRE9NLmFkZChuLCAndGJvZHknKTsNCg0KCQkJLy8gR2VuZXJhdGUgY29sb3IgZ3JpZA0KCQkJaSA9IDA7DQoJCQllYWNoKGlzKHMuY29sb3JzLCAnYXJyYXknKSA/IHMuY29sb3JzIDogcy5jb2xvcnMuc3BsaXQoJywnKSwgZnVuY3Rpb24oYykgew0KCQkJCWMgPSBjLnJlcGxhY2UoL14jLywgJycpOw0KDQoJCQkJaWYgKCFpLS0pIHsNCgkJCQkJdHIgPSBET00uYWRkKHRiLCAndHInKTsNCgkJCQkJaSA9IHMuZ3JpZF93aWR0aCAtIDE7DQoJCQkJfQ0KDQoJCQkJbiA9IERPTS5hZGQodHIsICd0ZCcpOw0KDQoJCQkJbiA9IERPTS5hZGQobiwgJ2EnLCB7DQoJCQkJCWhyZWYgOiAnamF2YXNjcmlwdDo7JywNCgkJCQkJc3R5bGUgOiB7DQoJCQkJCQliYWNrZ3JvdW5kQ29sb3IgOiAnIycgKyBjDQoJCQkJCX0sDQoJCQkJCV9tY2VfY29sb3IgOiAnIycgKyBjDQoJCQkJfSk7DQoJCQl9KTsNCg0KCQkJaWYgKHMubW9yZV9jb2xvcnNfZnVuYykgew0KCQkJCW4gPSBET00uYWRkKHRiLCAndHInKTsNCgkJCQluID0gRE9NLmFkZChuLCAndGQnLCB7Y29sc3BhbiA6IHMuZ3JpZF93aWR0aCwgJ2NsYXNzJyA6ICdtY2VNb3JlQ29sb3JzJ30pOw0KCQkJCW4gPSBET00uYWRkKG4sICdhJywge2lkIDogdC5pZCArICdfbW9yZScsIGhyZWYgOiAnamF2YXNjcmlwdDo7Jywgb25jbGljayA6ICdyZXR1cm4gZmFsc2U7JywgJ2NsYXNzJyA6ICdtY2VNb3JlQ29sb3JzJ30sIHMubW9yZV9jb2xvcnNfdGl0bGUpOw0KDQoJCQkJRXZlbnQuYWRkKG4sICdjbGljaycsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJcy5tb3JlX2NvbG9yc19mdW5jLmNhbGwocy5tb3JlX2NvbG9yc19zY29wZSB8fCB0aGlzKTsNCgkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsgLy8gQ2FuY2VsIHRvIGZpeCBvbmJlZm9yZXVubG9hZCBwcm9ibGVtDQoJCQkJfSk7DQoJCQl9DQoNCgkJCURPTS5hZGRDbGFzcyhtLCAnbWNlQ29sb3JTcGxpdE1lbnUnKTsNCg0KCQkJRXZlbnQuYWRkKHQuaWQgKyAnX21lbnUnLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIGM7DQoNCgkJCQllID0gZS50YXJnZXQ7DQoNCgkJCQlpZiAoZS5ub2RlTmFtZSA9PSAnQScgJiYgKGMgPSBlLmdldEF0dHJpYnV0ZSgnX21jZV9jb2xvcicpKSkNCgkJCQkJdC5zZXRDb2xvcihjKTsNCg0KCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7IC8vIFByZXZlbnQgSUUgYXV0byBzYXZlIHdhcm5pbmcNCgkJCX0pOw0KDQoJCQlyZXR1cm4gdzsNCgkJfSwNCg0KCQlzZXRDb2xvciA6IGZ1bmN0aW9uKGMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJRE9NLnNldFN0eWxlKHQuaWQgKyAnX3ByZXZpZXcnLCAnYmFja2dyb3VuZENvbG9yJywgYyk7DQoNCgkJCXQudmFsdWUgPSBjOw0KCQkJdC5oaWRlTWVudSgpOw0KCQkJdC5zZXR0aW5ncy5vbnNlbGVjdChjKTsNCgkJfSwNCg0KCQlwb3N0UmVuZGVyIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGlkID0gdC5pZDsNCg0KCQkJdC5wYXJlbnQoKTsNCgkJCURPTS5hZGQoaWQgKyAnX2FjdGlvbicsICdkaXYnLCB7aWQgOiBpZCArICdfcHJldmlldycsICdjbGFzcycgOiAnbWNlQ29sb3JQcmV2aWV3J30pOw0KCQkJRE9NLnNldFN0eWxlKHQuaWQgKyAnX3ByZXZpZXcnLCAnYmFja2dyb3VuZENvbG9yJywgdC52YWx1ZSk7DQoJCX0sDQoNCgkJZGVzdHJveSA6IGZ1bmN0aW9uKCkgew0KCQkJdGhpcy5wYXJlbnQoKTsNCg0KCQkJRXZlbnQuY2xlYXIodGhpcy5pZCArICdfbWVudScpOw0KCQkJRXZlbnQuY2xlYXIodGhpcy5pZCArICdfbW9yZScpOw0KCQkJRE9NLnJlbW92ZSh0aGlzLmlkICsgJ19tZW51Jyk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQp0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5Ub29sYmFyOnRpbnltY2UudWkuQ29udGFpbmVyJywgew0KCXJlbmRlckhUTUwgOiBmdW5jdGlvbigpIHsNCgkJdmFyIHQgPSB0aGlzLCBoID0gJycsIGMsIGNvLCBkb20gPSB0aW55bWNlLkRPTSwgcyA9IHQuc2V0dGluZ3MsIGksIHByLCBueCwgY2w7DQoNCgkJY2wgPSB0LmNvbnRyb2xzOw0KCQlmb3IgKGk9MDsgaTxjbC5sZW5ndGg7IGkrKykgew0KCQkJLy8gR2V0IGN1cnJlbnQgY29udHJvbCwgcHJldiBjb250cm9sLCBuZXh0IGNvbnRyb2wgYW5kIGlmIHRoZSBjb250cm9sIGlzIGEgbGlzdCBib3ggb3Igbm90DQoJCQljbyA9IGNsW2ldOw0KCQkJcHIgPSBjbFtpIC0gMV07DQoJCQlueCA9IGNsW2kgKyAxXTsNCg0KCQkJLy8gQWRkIHRvb2xiYXIgc3RhcnQNCgkJCWlmIChpID09PSAwKSB7DQoJCQkJYyA9ICdtY2VUb29sYmFyU3RhcnQnOw0KDQoJCQkJaWYgKGNvLkJ1dHRvbikNCgkJCQkJYyArPSAnIG1jZVRvb2xiYXJTdGFydEJ1dHRvbic7DQoJCQkJZWxzZSBpZiAoY28uU3BsaXRCdXR0b24pDQoJCQkJCWMgKz0gJyBtY2VUb29sYmFyU3RhcnRTcGxpdEJ1dHRvbic7DQoJCQkJZWxzZSBpZiAoY28uTGlzdEJveCkNCgkJCQkJYyArPSAnIG1jZVRvb2xiYXJTdGFydExpc3RCb3gnOw0KDQoJCQkJaCArPSBkb20uY3JlYXRlSFRNTCgndGQnLCB7J2NsYXNzJyA6IGN9LCBkb20uY3JlYXRlSFRNTCgnc3BhbicsIG51bGwsICc8IS0tIElFIC0tPicpKTsNCgkJCX0NCg0KCQkJLy8gQWRkIHRvb2xiYXIgZW5kIGJlZm9yZSBsaXN0IGJveCBhbmQgYWZ0ZXIgdGhlIHByZXZpb3VzIGJ1dHRvbg0KCQkJLy8gVGhpcyBpcyB0byBmaXggdGhlIG8yazcgZWRpdG9yIHNraW5zDQoJCQlpZiAocHIgJiYgY28uTGlzdEJveCkgew0KCQkJCWlmIChwci5CdXR0b24gfHwgcHIuU3BsaXRCdXR0b24pDQoJCQkJCWggKz0gZG9tLmNyZWF0ZUhUTUwoJ3RkJywgeydjbGFzcycgOiAnbWNlVG9vbGJhckVuZCd9LCBkb20uY3JlYXRlSFRNTCgnc3BhbicsIG51bGwsICc8IS0tIElFIC0tPicpKTsNCgkJCX0NCg0KCQkJLy8gUmVuZGVyIGNvbnRyb2wgSFRNTA0KDQoJCQkvLyBJRSA4IHF1aWNrIGZpeCwgbmVlZGVkIHRvIHByb3BlcnRseSBnZW5lcmF0ZSBhIGhpdCBhcmVhIGZvciBhbmNob3JzDQoJCQlpZiAoZG9tLnN0ZE1vZGUpDQoJCQkJaCArPSAnPHRkIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmUiPicgKyBjby5yZW5kZXJIVE1MKCkgKyAnPC90ZD4nOw0KCQkJZWxzZQ0KCQkJCWggKz0gJzx0ZD4nICsgY28ucmVuZGVySFRNTCgpICsgJzwvdGQ+JzsNCg0KCQkJLy8gQWRkIHRvb2xiYXIgc3RhcnQgYWZ0ZXIgbGlzdCBib3ggYW5kIGJlZm9yZSB0aGUgbmV4dCBidXR0b24NCgkJCS8vIFRoaXMgaXMgdG8gZml4IHRoZSBvMms3IGVkaXRvciBza2lucw0KCQkJaWYgKG54ICYmIGNvLkxpc3RCb3gpIHsNCgkJCQlpZiAobnguQnV0dG9uIHx8IG54LlNwbGl0QnV0dG9uKQ0KCQkJCQloICs9IGRvbS5jcmVhdGVIVE1MKCd0ZCcsIHsnY2xhc3MnIDogJ21jZVRvb2xiYXJTdGFydCd9LCBkb20uY3JlYXRlSFRNTCgnc3BhbicsIG51bGwsICc8IS0tIElFIC0tPicpKTsNCgkJCX0NCgkJfQ0KDQoJCWMgPSAnbWNlVG9vbGJhckVuZCc7DQoNCgkJaWYgKGNvLkJ1dHRvbikNCgkJCWMgKz0gJyBtY2VUb29sYmFyRW5kQnV0dG9uJzsNCgkJZWxzZSBpZiAoY28uU3BsaXRCdXR0b24pDQoJCQljICs9ICcgbWNlVG9vbGJhckVuZFNwbGl0QnV0dG9uJzsNCgkJZWxzZSBpZiAoY28uTGlzdEJveCkNCgkJCWMgKz0gJyBtY2VUb29sYmFyRW5kTGlzdEJveCc7DQoNCgkJaCArPSBkb20uY3JlYXRlSFRNTCgndGQnLCB7J2NsYXNzJyA6IGN9LCBkb20uY3JlYXRlSFRNTCgnc3BhbicsIG51bGwsICc8IS0tIElFIC0tPicpKTsNCg0KCQlyZXR1cm4gZG9tLmNyZWF0ZUhUTUwoJ3RhYmxlJywge2lkIDogdC5pZCwgJ2NsYXNzJyA6ICdtY2VUb29sYmFyJyArIChzWydjbGFzcyddID8gJyAnICsgc1snY2xhc3MnXSA6ICcnKSwgY2VsbHBhZGRpbmcgOiAnMCcsIGNlbGxzcGFjaW5nIDogJzAnLCBhbGlnbiA6IHQuc2V0dGluZ3MuYWxpZ24gfHwgJyd9LCAnPHRib2R5Pjx0cj4nICsgaCArICc8L3RyPjwvdGJvZHk+Jyk7DQoJfQ0KfSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIERpc3BhdGNoZXIgPSB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlciwgZWFjaCA9IHRpbnltY2UuZWFjaDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLkFkZE9uTWFuYWdlcicsIHsNCgkJQWRkT25NYW5hZ2VyIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgc2VsZiA9IHRoaXM7DQoNCgkJCXNlbGYuaXRlbXMgPSBbXTsNCgkJCXNlbGYudXJscyA9IHt9Ow0KCQkJc2VsZi5sb29rdXAgPSB7fTsNCgkJCXNlbGYub25BZGQgPSBuZXcgRGlzcGF0Y2hlcihzZWxmKTsNCgkJfSwNCg0KCQlnZXQgOiBmdW5jdGlvbihuKSB7DQoJCQlyZXR1cm4gdGhpcy5sb29rdXBbbl07DQoJCX0sDQoNCgkJcmVxdWlyZUxhbmdQYWNrIDogZnVuY3Rpb24obikgew0KCQkJdmFyIHMgPSB0aW55bWNlLnNldHRpbmdzOw0KDQoJCQlpZiAocyAmJiBzLmxhbmd1YWdlKQ0KCQkJCXRpbnltY2UuU2NyaXB0TG9hZGVyLmFkZCh0aGlzLnVybHNbbl0gKyAnL2xhbmdzLycgKyBzLmxhbmd1YWdlICsgJy5qcycpOw0KCQl9LA0KDQoJCWFkZCA6IGZ1bmN0aW9uKGlkLCBvKSB7DQoJCQl0aGlzLml0ZW1zLnB1c2gobyk7DQoJCQl0aGlzLmxvb2t1cFtpZF0gPSBvOw0KCQkJdGhpcy5vbkFkZC5kaXNwYXRjaCh0aGlzLCBpZCwgbyk7DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCWxvYWQgOiBmdW5jdGlvbihuLCB1LCBjYiwgcykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAodC51cmxzW25dKQ0KCQkJCXJldHVybjsNCg0KCQkJaWYgKHUuaW5kZXhPZignLycpICE9IDAgJiYgdS5pbmRleE9mKCc6Ly8nKSA9PSAtMSkNCgkJCQl1ID0gdGlueW1jZS5iYXNlVVJMICsgJy8nICsgIHU7DQoNCgkJCXQudXJsc1tuXSA9IHUuc3Vic3RyaW5nKDAsIHUubGFzdEluZGV4T2YoJy8nKSk7DQoNCgkJCWlmICghdC5sb29rdXBbbl0pDQoJCQkJdGlueW1jZS5TY3JpcHRMb2FkZXIuYWRkKHUsIGNiLCBzKTsNCgkJfQ0KCX0pOw0KDQoJLy8gQ3JlYXRlIHBsdWdpbiBhbmQgdGhlbWUgbWFuYWdlcnMNCgl0aW55bWNlLlBsdWdpbk1hbmFnZXIgPSBuZXcgdGlueW1jZS5BZGRPbk1hbmFnZXIoKTsNCgl0aW55bWNlLlRoZW1lTWFuYWdlciA9IG5ldyB0aW55bWNlLkFkZE9uTWFuYWdlcigpOw0KfSh0aW55bWNlKSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBlYWNoID0gdGlueW1jZS5lYWNoLCBleHRlbmQgPSB0aW55bWNlLmV4dGVuZCwNCgkJRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsDQoJCVRoZW1lTWFuYWdlciA9IHRpbnltY2UuVGhlbWVNYW5hZ2VyLCBQbHVnaW5NYW5hZ2VyID0gdGlueW1jZS5QbHVnaW5NYW5hZ2VyLA0KCQlleHBsb2RlID0gdGlueW1jZS5leHBsb2RlLA0KCQlEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXIsIHVuZGVmaW5lZCwgaW5zdGFuY2VDb3VudGVyID0gMDsNCg0KCS8vIFNldHVwIHNvbWUgVVJMcyB3aGVyZSB0aGUgZWRpdG9yIEFQSSBpcyBsb2NhdGVkIGFuZCB3aGVyZSB0aGUgZG9jdW1lbnQgaXMNCgl0aW55bWNlLmRvY3VtZW50QmFzZVVSTCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1tcPyNdLiokLywgJycpLnJlcGxhY2UoL1tcL1xcXVteXC9dKyQvLCAnJyk7DQoJaWYgKCEvW1wvXFxdJC8udGVzdCh0aW55bWNlLmRvY3VtZW50QmFzZVVSTCkpDQoJCXRpbnltY2UuZG9jdW1lbnRCYXNlVVJMICs9ICcvJzsNCg0KCXRpbnltY2UuYmFzZVVSTCA9IG5ldyB0aW55bWNlLnV0aWwuVVJJKHRpbnltY2UuZG9jdW1lbnRCYXNlVVJMKS50b0Fic29sdXRlKHRpbnltY2UuYmFzZVVSTCk7DQoNCgl0aW55bWNlLmJhc2VVUkkgPSBuZXcgdGlueW1jZS51dGlsLlVSSSh0aW55bWNlLmJhc2VVUkwpOw0KDQoJLy8gQWRkIGJlZm9yZSB1bmxvYWQgbGlzdGVuZXINCgkvLyBUaGlzIHdhcyByZXF1aXJlZCBzaW5jZSBJRSB3YXMgbGVha2luZyBtZW1vcnkgaWYgeW91IGFkZGVkIGFuZCByZW1vdmVkIGJlZm9yZXVubG9hZCBsaXN0ZW5lcnMNCgkvLyB3aXRoIGF0dGFjaEV2ZW50L2RldGF0Y2hFdmVudCBzbyB0aGlzIG9ubHkgYWRkcyBvbmUgbGlzdGVuZXIgYW5kIGluc3RhbmNlcyBjYW4gdGhlIGF0dGFjaCB0byB0aGUgb25CZWZvcmVVbmxvYWQgZXZlbnQNCgl0aW55bWNlLm9uQmVmb3JlVW5sb2FkID0gbmV3IERpc3BhdGNoZXIodGlueW1jZSk7DQoNCgkvLyBNdXN0IGJlIG9uIHdpbmRvdyBvciBJRSB3aWxsIGxlYWsgaWYgdGhlIGVkaXRvciBpcyBwbGFjZWQgaW4gZnJhbWUgb3IgaWZyYW1lDQoJRXZlbnQuYWRkKHdpbmRvdywgJ2JlZm9yZXVubG9hZCcsIGZ1bmN0aW9uKGUpIHsNCgkJdGlueW1jZS5vbkJlZm9yZVVubG9hZC5kaXNwYXRjaCh0aW55bWNlLCBlKTsNCgl9KTsNCg0KCXRpbnltY2Uub25BZGRFZGl0b3IgPSBuZXcgRGlzcGF0Y2hlcih0aW55bWNlKTsNCg0KCXRpbnltY2Uub25SZW1vdmVFZGl0b3IgPSBuZXcgRGlzcGF0Y2hlcih0aW55bWNlKTsNCg0KCXRpbnltY2UuRWRpdG9yTWFuYWdlciA9IGV4dGVuZCh0aW55bWNlLCB7DQoJCWVkaXRvcnMgOiBbXSwNCg0KCQlpMThuIDoge30sDQoNCgkJYWN0aXZlRWRpdG9yIDogbnVsbCwNCg0KCQlpbml0IDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzLCBwbCwgc2wgPSB0aW55bWNlLlNjcmlwdExvYWRlciwgZSwgZWwgPSBbXSwgZWQ7DQoNCgkJCWZ1bmN0aW9uIGV4ZWNDYWxsYmFjayhzZSwgbiwgcykgew0KCQkJCXZhciBmID0gc2Vbbl07DQoNCgkJCQlpZiAoIWYpDQoJCQkJCXJldHVybjsNCg0KCQkJCWlmICh0aW55bWNlLmlzKGYsICdzdHJpbmcnKSkgew0KCQkJCQlzID0gZi5yZXBsYWNlKC9cLlx3KyQvLCAnJyk7DQoJCQkJCXMgPSBzID8gdGlueW1jZS5yZXNvbHZlKHMpIDogMDsNCgkJCQkJZiA9IHRpbnltY2UucmVzb2x2ZShmKTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gZi5hcHBseShzIHx8IHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMikpOw0KCQkJfTsNCg0KCQkJcyA9IGV4dGVuZCh7DQoJCQkJdGhlbWUgOiAic2ltcGxlIiwNCgkJCQlsYW5ndWFnZSA6ICJlbiINCgkJCX0sIHMpOw0KDQoJCQl0LnNldHRpbmdzID0gczsNCg0KCQkJLy8gTGVnYWN5IGNhbGwNCgkJCUV2ZW50LmFkZChkb2N1bWVudCwgJ2luaXQnLCBmdW5jdGlvbigpIHsNCgkJCQl2YXIgbCwgY287DQoNCgkJCQlleGVjQ2FsbGJhY2socywgJ29ucGFnZWxvYWQnKTsNCg0KCQkJCXN3aXRjaCAocy5tb2RlKSB7DQoJCQkJCWNhc2UgImV4YWN0IjoNCgkJCQkJCWwgPSBzLmVsZW1lbnRzIHx8ICcnOw0KDQoJCQkJCQlpZihsLmxlbmd0aCA+IDApIHsNCgkJCQkJCQllYWNoKGV4cGxvZGUobCksIGZ1bmN0aW9uKHYpIHsNCgkJCQkJCQkJaWYgKERPTS5nZXQodikpIHsNCgkJCQkJCQkJCWVkID0gbmV3IHRpbnltY2UuRWRpdG9yKHYsIHMpOw0KCQkJCQkJCQkJZWwucHVzaChlZCk7DQoJCQkJCQkJCQllZC5yZW5kZXIoMSk7DQoJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQllYWNoKGRvY3VtZW50LmZvcm1zLCBmdW5jdGlvbihmKSB7DQoJCQkJCQkJCQkJZWFjaChmLmVsZW1lbnRzLCBmdW5jdGlvbihlKSB7DQoJCQkJCQkJCQkJCWlmIChlLm5hbWUgPT09IHYpIHsNCgkJCQkJCQkJCQkJCXYgPSAnbWNlX2VkaXRvcl8nICsgaW5zdGFuY2VDb3VudGVyKys7DQoJCQkJCQkJCQkJCQlET00uc2V0QXR0cmliKGUsICdpZCcsIHYpOw0KDQoJCQkJCQkJCQkJCQllZCA9IG5ldyB0aW55bWNlLkVkaXRvcih2LCBzKTsNCgkJCQkJCQkJCQkJCWVsLnB1c2goZWQpOw0KCQkJCQkJCQkJCQkJZWQucmVuZGVyKDEpOw0KCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJfSk7DQoJCQkJCQkJCQl9KTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0pOw0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAidGV4dGFyZWFzIjoNCgkJCQkJY2FzZSAic3BlY2lmaWNfdGV4dGFyZWFzIjoNCgkJCQkJCWZ1bmN0aW9uIGhhc0NsYXNzKG4sIGMpIHsNCgkJCQkJCQlyZXR1cm4gYy5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwID8gYy50ZXN0KG4uY2xhc3NOYW1lKSA6IERPTS5oYXNDbGFzcyhuLCBjKTsNCgkJCQkJCX07DQoNCgkJCQkJCWVhY2goRE9NLnNlbGVjdCgndGV4dGFyZWEnKSwgZnVuY3Rpb24odikgew0KCQkJCQkJCWlmIChzLmVkaXRvcl9kZXNlbGVjdG9yICYmIGhhc0NsYXNzKHYsIHMuZWRpdG9yX2Rlc2VsZWN0b3IpKQ0KCQkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCQlpZiAoIXMuZWRpdG9yX3NlbGVjdG9yIHx8IGhhc0NsYXNzKHYsIHMuZWRpdG9yX3NlbGVjdG9yKSkgew0KCQkJCQkJCQkvLyBDYW4gd2UgdXNlIHRoZSBuYW1lDQoJCQkJCQkJCWUgPSBET00uZ2V0KHYubmFtZSk7DQoJCQkJCQkJCWlmICghdi5pZCAmJiAhZSkNCgkJCQkJCQkJCXYuaWQgPSB2Lm5hbWU7DQoNCgkJCQkJCQkJLy8gR2VuZXJhdGUgdW5pcXVlIG5hbWUgaWYgbWlzc2luZyBvciBhbHJlYWR5IGV4aXN0cw0KCQkJCQkJCQlpZiAoIXYuaWQgfHwgdC5nZXQodi5pZCkpDQoJCQkJCQkJCQl2LmlkID0gRE9NLnVuaXF1ZUlkKCk7DQoNCgkJCQkJCQkJZWQgPSBuZXcgdGlueW1jZS5FZGl0b3Iodi5pZCwgcyk7DQoJCQkJCQkJCWVsLnB1c2goZWQpOw0KCQkJCQkJCQllZC5yZW5kZXIoMSk7DQoJCQkJCQkJfQ0KCQkJCQkJfSk7DQoJCQkJCQlicmVhazsNCgkJCQl9DQoNCgkJCQkvLyBDYWxsIG9uSW5pdCB3aGVuIGFsbCBlZGl0b3JzIGFyZSBpbml0aWFsaXplZA0KCQkJCWlmIChzLm9uaW5pdCkgew0KCQkJCQlsID0gY28gPSAwOw0KDQoJCQkJCWVhY2goZWwsIGZ1bmN0aW9uKGVkKSB7DQoJCQkJCQljbysrOw0KDQoJCQkJCQlpZiAoIWVkLmluaXRpYWxpemVkKSB7DQoJCQkJCQkJLy8gV2FpdCBmb3IgaXQNCgkJCQkJCQllZC5vbkluaXQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQkJCQlsKys7DQoNCgkJCQkJCQkJLy8gQWxsIGRvbmUNCgkJCQkJCQkJaWYgKGwgPT0gY28pDQoJCQkJCQkJCQlleGVjQ2FsbGJhY2socywgJ29uaW5pdCcpOw0KCQkJCQkJCX0pOw0KCQkJCQkJfSBlbHNlDQoJCQkJCQkJbCsrOw0KDQoJCQkJCQkvLyBBbGwgZG9uZQ0KCQkJCQkJaWYgKGwgPT0gY28pDQoJCQkJCQkJZXhlY0NhbGxiYWNrKHMsICdvbmluaXQnKTsJCQkJCQ0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9KTsNCgkJfSwNCg0KCQlnZXQgOiBmdW5jdGlvbihpZCkgew0KCQkJaWYgKGlkID09PSB1bmRlZmluZWQpDQoJCQkJcmV0dXJuIHRoaXMuZWRpdG9yczsNCg0KCQkJcmV0dXJuIHRoaXMuZWRpdG9yc1tpZF07DQoJCX0sDQoNCgkJZ2V0SW5zdGFuY2VCeUlkIDogZnVuY3Rpb24oaWQpIHsNCgkJCXJldHVybiB0aGlzLmdldChpZCk7DQoJCX0sDQoNCgkJYWRkIDogZnVuY3Rpb24oZWRpdG9yKSB7DQoJCQl2YXIgc2VsZiA9IHRoaXMsIGVkaXRvcnMgPSBzZWxmLmVkaXRvcnM7DQoNCgkJCS8vIEFkZCBuYW1lZCBhbmQgaW5kZXggZWRpdG9yIGluc3RhbmNlDQoJCQllZGl0b3JzW2VkaXRvci5pZF0gPSBlZGl0b3I7DQoJCQllZGl0b3JzLnB1c2goZWRpdG9yKTsNCg0KCQkJc2VsZi5fc2V0QWN0aXZlKGVkaXRvcik7DQoJCQlzZWxmLm9uQWRkRWRpdG9yLmRpc3BhdGNoKHNlbGYsIGVkaXRvcik7DQoNCg0KCQkJLy8gUGF0Y2ggdGhlIHRpbnltY2UuRWRpdG9yIGluc3RhbmNlIHdpdGggalF1ZXJ5IGFkYXB0ZXIgbG9naWMNCgkJCWlmICh0aW55bWNlLmFkYXB0ZXIpDQoJCQkJdGlueW1jZS5hZGFwdGVyLnBhdGNoRWRpdG9yKGVkaXRvcik7DQoNCg0KCQkJcmV0dXJuIGVkaXRvcjsNCgkJfSwNCg0KCQlyZW1vdmUgOiBmdW5jdGlvbihlZGl0b3IpIHsNCgkJCXZhciB0ID0gdGhpcywgaSwgZWRpdG9ycyA9IHQuZWRpdG9yczsNCg0KCQkJLy8gTm90IGluIHRoZSBjb2xsZWN0aW9uDQoJCQlpZiAoIWVkaXRvcnNbZWRpdG9yLmlkXSkNCgkJCQlyZXR1cm4gbnVsbDsNCg0KCQkJZGVsZXRlIGVkaXRvcnNbZWRpdG9yLmlkXTsNCg0KCQkJZm9yIChpID0gMDsgaSA8IGVkaXRvcnMubGVuZ3RoOyBpKyspIHsNCgkJCQlpZiAoZWRpdG9yc1tpXSA9PSBlZGl0b3IpIHsNCgkJCQkJZWRpdG9ycy5zcGxpY2UoaSwgMSk7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gU2VsZWN0IGFub3RoZXIgZWRpdG9yIHNpbmNlIHRoZSBhY3RpdmUgb25lIHdhcyByZW1vdmVkDQoJCQlpZiAodC5hY3RpdmVFZGl0b3IgPT0gZWRpdG9yKQ0KCQkJCXQuX3NldEFjdGl2ZShlZGl0b3JzWzBdKTsNCg0KCQkJZWRpdG9yLmRlc3Ryb3koKTsNCgkJCXQub25SZW1vdmVFZGl0b3IuZGlzcGF0Y2godCwgZWRpdG9yKTsNCg0KCQkJcmV0dXJuIGVkaXRvcjsNCgkJfSwNCg0KCQlleGVjQ29tbWFuZCA6IGZ1bmN0aW9uKGMsIHUsIHYpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmdldCh2KSwgdzsNCg0KCQkJLy8gTWFuYWdlciBjb21tYW5kcw0KCQkJc3dpdGNoIChjKSB7DQoJCQkJY2FzZSAibWNlRm9jdXMiOg0KCQkJCQllZC5mb2N1cygpOw0KCQkJCQlyZXR1cm4gdHJ1ZTsNCg0KCQkJCWNhc2UgIm1jZUFkZEVkaXRvciI6DQoJCQkJY2FzZSAibWNlQWRkQ29udHJvbCI6DQoJCQkJCWlmICghdC5nZXQodikpDQoJCQkJCQluZXcgdGlueW1jZS5FZGl0b3IodiwgdC5zZXR0aW5ncykucmVuZGVyKCk7DQoNCgkJCQkJcmV0dXJuIHRydWU7DQoNCgkJCQljYXNlICJtY2VBZGRGcmFtZUNvbnRyb2wiOg0KCQkJCQl3ID0gdi53aW5kb3c7DQoNCgkJCQkJLy8gQWRkIHRpbnlNQ0UgZ2xvYmFsIGluc3RhbmNlIGFuZCB0aW55bWNlIG5hbWVzcGFjZSB0byBzcGVjaWZpZWQgd2luZG93DQoJCQkJCXcudGlueU1DRSA9IHRpbnlNQ0U7DQoJCQkJCXcudGlueW1jZSA9IHRpbnltY2U7DQoNCgkJCQkJdGlueW1jZS5ET00uZG9jID0gdy5kb2N1bWVudDsNCgkJCQkJdGlueW1jZS5ET00ud2luID0gdzsNCg0KCQkJCQllZCA9IG5ldyB0aW55bWNlLkVkaXRvcih2LmVsZW1lbnRfaWQsIHYpOw0KCQkJCQllZC5yZW5kZXIoKTsNCg0KCQkJCQkvLyBGaXggSUUgbWVtb3J5IGxlYWtzDQoJCQkJCWlmICh0aW55bWNlLmlzSUUpIHsNCgkJCQkJCWZ1bmN0aW9uIGNscigpIHsNCgkJCQkJCQllZC5kZXN0cm95KCk7DQoJCQkJCQkJdy5kZXRhY2hFdmVudCgnb251bmxvYWQnLCBjbHIpOw0KCQkJCQkJCXcgPSB3LnRpbnlNQ0UgPSB3LnRpbnltY2UgPSBudWxsOyAvLyBJRSBsZWFrDQoJCQkJCQl9Ow0KDQoJCQkJCQl3LmF0dGFjaEV2ZW50KCdvbnVubG9hZCcsIGNscik7DQoJCQkJCX0NCg0KCQkJCQl2LnBhZ2Vfd2luZG93ID0gbnVsbDsNCg0KCQkJCQlyZXR1cm4gdHJ1ZTsNCg0KCQkJCWNhc2UgIm1jZVJlbW92ZUVkaXRvciI6DQoJCQkJY2FzZSAibWNlUmVtb3ZlQ29udHJvbCI6DQoJCQkJCWlmIChlZCkNCgkJCQkJCWVkLnJlbW92ZSgpOw0KDQoJCQkJCXJldHVybiB0cnVlOw0KDQoJCQkJY2FzZSAnbWNlVG9nZ2xlRWRpdG9yJzoNCgkJCQkJaWYgKCFlZCkgew0KCQkJCQkJdC5leGVjQ29tbWFuZCgnbWNlQWRkQ29udHJvbCcsIDAsIHYpOw0KCQkJCQkJcmV0dXJuIHRydWU7DQoJCQkJCX0NCg0KCQkJCQlpZiAoZWQuaXNIaWRkZW4oKSkNCgkJCQkJCWVkLnNob3coKTsNCgkJCQkJZWxzZQ0KCQkJCQkJZWQuaGlkZSgpOw0KDQoJCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KDQoJCQkvLyBSdW4gY29tbWFuZCBvbiBhY3RpdmUgZWRpdG9yDQoJCQlpZiAodC5hY3RpdmVFZGl0b3IpDQoJCQkJcmV0dXJuIHQuYWN0aXZlRWRpdG9yLmV4ZWNDb21tYW5kKGMsIHUsIHYpOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0sDQoNCgkJZXhlY0luc3RhbmNlQ29tbWFuZCA6IGZ1bmN0aW9uKGlkLCBjLCB1LCB2KSB7DQoJCQl2YXIgZWQgPSB0aGlzLmdldChpZCk7DQoNCgkJCWlmIChlZCkNCgkJCQlyZXR1cm4gZWQuZXhlY0NvbW1hbmQoYywgdSwgdik7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfSwNCg0KCQl0cmlnZ2VyU2F2ZSA6IGZ1bmN0aW9uKCkgew0KCQkJZWFjaCh0aGlzLmVkaXRvcnMsIGZ1bmN0aW9uKGUpIHsNCgkJCQllLnNhdmUoKTsNCgkJCX0pOw0KCQl9LA0KDQoJCWFkZEkxOG4gOiBmdW5jdGlvbihwLCBvKSB7DQoJCQl2YXIgbG8sIGkxOG4gPSB0aGlzLmkxOG47DQoNCgkJCWlmICghdGlueW1jZS5pcyhwLCAnc3RyaW5nJykpIHsNCgkJCQllYWNoKHAsIGZ1bmN0aW9uKG8sIGxjKSB7DQoJCQkJCWVhY2gobywgZnVuY3Rpb24obywgZykgew0KCQkJCQkJZWFjaChvLCBmdW5jdGlvbihvLCBrKSB7DQoJCQkJCQkJaWYgKGcgPT09ICdjb21tb24nKQ0KCQkJCQkJCQlpMThuW2xjICsgJy4nICsga10gPSBvOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJaTE4bltsYyArICcuJyArIGcgKyAnLicgKyBrXSA9IG87DQoJCQkJCQl9KTsNCgkJCQkJfSk7DQoJCQkJfSk7DQoJCQl9IGVsc2Ugew0KCQkJCWVhY2gobywgZnVuY3Rpb24obywgaykgew0KCQkJCQlpMThuW3AgKyAnLicgKyBrXSA9IG87DQoJCQkJfSk7DQoJCQl9DQoJCX0sDQoNCgkJLy8gUHJpdmF0ZSBtZXRob2RzDQoNCgkJX3NldEFjdGl2ZSA6IGZ1bmN0aW9uKGVkaXRvcikgew0KCQkJdGhpcy5zZWxlY3RlZEluc3RhbmNlID0gdGhpcy5hY3RpdmVFZGl0b3IgPSBlZGl0b3I7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIFNob3J0ZW4gdGhlc2UgbmFtZXMNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIGV4dGVuZCA9IHRpbnltY2UuZXh0ZW5kLA0KCQlEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXIsIGVhY2ggPSB0aW55bWNlLmVhY2gsIGlzR2Vja28gPSB0aW55bWNlLmlzR2Vja28sDQoJCWlzSUUgPSB0aW55bWNlLmlzSUUsIGlzV2ViS2l0ID0gdGlueW1jZS5pc1dlYktpdCwgaXMgPSB0aW55bWNlLmlzLA0KCQlUaGVtZU1hbmFnZXIgPSB0aW55bWNlLlRoZW1lTWFuYWdlciwgUGx1Z2luTWFuYWdlciA9IHRpbnltY2UuUGx1Z2luTWFuYWdlciwNCgkJaW5BcnJheSA9IHRpbnltY2UuaW5BcnJheSwgZ3JlcCA9IHRpbnltY2UuZ3JlcCwgZXhwbG9kZSA9IHRpbnltY2UuZXhwbG9kZTsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLkVkaXRvcicsIHsNCgkJRWRpdG9yIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5pZCA9IHQuZWRpdG9ySWQgPSBpZDsNCg0KCQkJdC5leGVjQ29tbWFuZHMgPSB7fTsNCgkJCXQucXVlcnlTdGF0ZUNvbW1hbmRzID0ge307DQoJCQl0LnF1ZXJ5VmFsdWVDb21tYW5kcyA9IHt9Ow0KDQoJCQl0LmlzTm90RGlydHkgPSBmYWxzZTsNCg0KCQkJdC5wbHVnaW5zID0ge307DQoNCgkJCS8vIEFkZCBldmVudHMgdG8gdGhlIGVkaXRvcg0KCQkJZWFjaChbDQoJCQkJJ29uUHJlSW5pdCcsDQoNCgkJCQknb25CZWZvcmVSZW5kZXJVSScsDQoNCgkJCQknb25Qb3N0UmVuZGVyJywNCg0KCQkJCSdvbkluaXQnLA0KDQoJCQkJJ29uUmVtb3ZlJywNCg0KCQkJCSdvbkFjdGl2YXRlJywNCg0KCQkJCSdvbkRlYWN0aXZhdGUnLA0KDQoJCQkJJ29uQ2xpY2snLA0KDQoJCQkJJ29uRXZlbnQnLA0KDQoJCQkJJ29uTW91c2VVcCcsDQoNCgkJCQknb25Nb3VzZURvd24nLA0KDQoJCQkJJ29uRGJsQ2xpY2snLA0KDQoJCQkJJ29uS2V5RG93bicsDQoNCgkJCQknb25LZXlVcCcsDQoNCgkJCQknb25LZXlQcmVzcycsDQoNCgkJCQknb25Db250ZXh0TWVudScsDQoNCgkJCQknb25TdWJtaXQnLA0KDQoJCQkJJ29uUmVzZXQnLA0KDQoJCQkJJ29uUGFzdGUnLA0KDQoJCQkJJ29uUHJlUHJvY2VzcycsDQoNCgkJCQknb25Qb3N0UHJvY2VzcycsDQoNCgkJCQknb25CZWZvcmVTZXRDb250ZW50JywNCg0KCQkJCSdvbkJlZm9yZUdldENvbnRlbnQnLA0KDQoJCQkJJ29uU2V0Q29udGVudCcsDQoNCgkJCQknb25HZXRDb250ZW50JywNCg0KCQkJCSdvbkxvYWRDb250ZW50JywNCg0KCQkJCSdvblNhdmVDb250ZW50JywNCg0KCQkJCSdvbk5vZGVDaGFuZ2UnLA0KDQoJCQkJJ29uQ2hhbmdlJywNCg0KCQkJCSdvbkJlZm9yZUV4ZWNDb21tYW5kJywNCg0KCQkJCSdvbkV4ZWNDb21tYW5kJywNCg0KCQkJCSdvblVuZG8nLA0KDQoJCQkJJ29uUmVkbycsDQoNCgkJCQknb25WaXN1YWxBaWQnLA0KDQoJCQkJJ29uU2V0UHJvZ3Jlc3NTdGF0ZScNCgkJCV0sIGZ1bmN0aW9uKGUpIHsNCgkJCQl0W2VdID0gbmV3IERpc3BhdGNoZXIodCk7DQoJCQl9KTsNCg0KCQkJdC5zZXR0aW5ncyA9IHMgPSBleHRlbmQoew0KCQkJCWlkIDogaWQsDQoJCQkJbGFuZ3VhZ2UgOiAnZW4nLA0KCQkJCWRvY3NfbGFuZ3VhZ2UgOiAnZW4nLA0KCQkJCXRoZW1lIDogJ3NpbXBsZScsDQoJCQkJc2tpbiA6ICdkZWZhdWx0JywNCgkJCQlkZWx0YV93aWR0aCA6IDAsDQoJCQkJZGVsdGFfaGVpZ2h0IDogMCwNCgkJCQlwb3B1cF9jc3MgOiAnJywNCgkJCQlwbHVnaW5zIDogJycsDQoJCQkJZG9jdW1lbnRfYmFzZV91cmwgOiB0aW55bWNlLmRvY3VtZW50QmFzZVVSTCwNCgkJCQlhZGRfZm9ybV9zdWJtaXRfdHJpZ2dlciA6IDEsDQoJCQkJc3VibWl0X3BhdGNoIDogMSwNCgkJCQlhZGRfdW5sb2FkX3RyaWdnZXIgOiAxLA0KCQkJCWNvbnZlcnRfdXJscyA6IDEsDQoJCQkJcmVsYXRpdmVfdXJscyA6IDEsDQoJCQkJcmVtb3ZlX3NjcmlwdF9ob3N0IDogMSwNCgkJCQl0YWJsZV9pbmxpbmVfZWRpdGluZyA6IDAsDQoJCQkJb2JqZWN0X3Jlc2l6aW5nIDogMSwNCgkJCQljbGVhbnVwIDogMSwNCgkJCQlhY2Nlc3NpYmlsaXR5X2ZvY3VzIDogMSwNCgkJCQljdXN0b21fc2hvcnRjdXRzIDogMSwNCgkJCQljdXN0b21fdW5kb19yZWRvX2tleWJvYXJkX3Nob3J0Y3V0cyA6IDEsDQoJCQkJY3VzdG9tX3VuZG9fcmVkb19yZXN0b3JlX3NlbGVjdGlvbiA6IDEsDQoJCQkJY3VzdG9tX3VuZG9fcmVkbyA6IDEsDQoJCQkJZG9jdHlwZSA6IHRpbnltY2UuaXNJRTYgPyAnPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+JyA6ICc8IURPQ1RZUEU+JywgLy8gVXNlIG9sZCBkb2N0eXBlIG9uIElFIDYgdG8gYXZvaWQgaG9yaXpvbnRhbCBzY3JvbGwNCgkJCQl2aXN1YWxfdGFibGVfY2xhc3MgOiAnbWNlSXRlbVRhYmxlJywNCgkJCQl2aXN1YWwgOiAxLA0KCQkJCWZvbnRfc2l6ZV9zdHlsZV92YWx1ZXMgOiAneHgtc21hbGwseC1zbWFsbCxzbWFsbCxtZWRpdW0sbGFyZ2UseC1sYXJnZSx4eC1sYXJnZScsDQoJCQkJYXBwbHlfc291cmNlX2Zvcm1hdHRpbmcgOiAxLA0KCQkJCWRpcmVjdGlvbmFsaXR5IDogJ2x0cicsDQoJCQkJZm9yY2VkX3Jvb3RfYmxvY2sgOiAncCcsDQoJCQkJdmFsaWRfZWxlbWVudHMgOiAnQFtpZHxjbGFzc3xzdHlsZXx0aXRsZXxkaXI8bHRyP3J0bHxsYW5nfHhtbDo6bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25tb3VzZWRvd258b25tb3VzZXVwfG9ubW91c2VvdmVyfG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25rZXlwcmVzc3xvbmtleWRvd258b25rZXl1cF0sYVtyZWx8cmV2fGNoYXJzZXR8aHJlZmxhbmd8dGFiaW5kZXh8YWNjZXNza2V5fHR5cGV8bmFtZXxocmVmfHRhcmdldHx0aXRsZXxjbGFzc3xvbmZvY3VzfG9uYmx1cl0sc3Ryb25nL2IsZW0vaSxzdHJpa2UsdSwjcCwtb2xbdHlwZXxjb21wYWN0XSwtdWxbdHlwZXxjb21wYWN0XSwtbGksYnIsaW1nW2xvbmdkZXNjfHVzZW1hcHxzcmN8Ym9yZGVyfGFsdD18dGl0bGV8aHNwYWNlfHZzcGFjZXx3aWR0aHxoZWlnaHR8YWxpZ25dLC1zdWIsLXN1cCwtYmxvY2txdW90ZVtjaXRlXSwtdGFibGVbYm9yZGVyfGNlbGxzcGFjaW5nfGNlbGxwYWRkaW5nfHdpZHRofGZyYW1lfHJ1bGVzfGhlaWdodHxhbGlnbnxzdW1tYXJ5fGJnY29sb3J8YmFja2dyb3VuZHxib3JkZXJjb2xvcl0sLXRyW3Jvd3NwYW58d2lkdGh8aGVpZ2h0fGFsaWdufHZhbGlnbnxiZ2NvbG9yfGJhY2tncm91bmR8Ym9yZGVyY29sb3JdLHRib2R5LHRoZWFkLHRmb290LCN0ZFtjb2xzcGFufHJvd3NwYW58d2lkdGh8aGVpZ2h0fGFsaWdufHZhbGlnbnxiZ2NvbG9yfGJhY2tncm91bmR8Ym9yZGVyY29sb3J8c2NvcGVdLCN0aFtjb2xzcGFufHJvd3NwYW58d2lkdGh8aGVpZ2h0fGFsaWdufHZhbGlnbnxzY29wZV0sY2FwdGlvbiwtZGl2LC1zcGFuLC1jb2RlLC1wcmUsYWRkcmVzcywtaDEsLWgyLC1oMywtaDQsLWg1LC1oNixocltzaXplfG5vc2hhZGVdLC1mb250W2ZhY2V8c2l6ZXxjb2xvcl0sZGQsZGwsZHQsY2l0ZSxhYmJyLGFjcm9ueW0sZGVsW2RhdGV0aW1lfGNpdGVdLGluc1tkYXRldGltZXxjaXRlXSxvYmplY3RbY2xhc3NpZHx3aWR0aHxoZWlnaHR8Y29kZWJhc2V8Kl0scGFyYW1bbmFtZXx2YWx1ZV0sZW1iZWRbdHlwZXx3aWR0aHxoZWlnaHR8c3JjfCpdLHNjcmlwdFtzcmN8dHlwZV0sbWFwW25hbWVdLGFyZWFbc2hhcGV8Y29vcmRzfGhyZWZ8YWx0fHRhcmdldF0sYmRvLGJ1dHRvbixjb2xbYWxpZ258Y2hhcnxjaGFyb2ZmfHNwYW58dmFsaWdufHdpZHRoXSxjb2xncm91cFthbGlnbnxjaGFyfGNoYXJvZmZ8c3Bhbnx2YWxpZ258d2lkdGhdLGRmbixmaWVsZHNldCxmb3JtW2FjdGlvbnxhY2NlcHR8YWNjZXB0LWNoYXJzZXR8ZW5jdHlwZXxtZXRob2RdLGlucHV0W2FjY2VwdHxhbHR8Y2hlY2tlZHxkaXNhYmxlZHxtYXhsZW5ndGh8bmFtZXxyZWFkb25seXxzaXplfHNyY3x0eXBlfHZhbHVlfHRhYmluZGV4fGFjY2Vzc2tleV0sa2JkLGxhYmVsW2Zvcl0sbGVnZW5kLG5vc2NyaXB0LG9wdGdyb3VwW2xhYmVsfGRpc2FibGVkXSxvcHRpb25bZGlzYWJsZWR8bGFiZWx8c2VsZWN0ZWR8dmFsdWVdLHFbY2l0ZV0sc2FtcCxzZWxlY3RbZGlzYWJsZWR8bXVsdGlwbGV8bmFtZXxzaXplXSxzbWFsbCx0ZXh0YXJlYVtjb2xzfHJvd3N8ZGlzYWJsZWR8bmFtZXxyZWFkb25seV0sdHQsdmFyLGJpZycsDQoJCQkJaGlkZGVuX2lucHV0IDogMSwNCgkJCQlwYWRkX2VtcHR5X2VkaXRvciA6IDEsDQoJCQkJcmVuZGVyX3VpIDogMSwNCgkJCQlpbml0X3RoZW1lIDogMSwNCgkJCQlmb3JjZV9wX25ld2xpbmVzIDogMSwNCgkJCQlpbmRlbnRhdGlvbiA6ICczMHB4JywNCgkJCQlrZWVwX3N0eWxlcyA6IDEsDQoJCQkJZml4X3RhYmxlX2VsZW1lbnRzIDogMSwNCgkJCQlpbmxpbmVfc3R5bGVzIDogMSwNCgkJCQljb252ZXJ0X2ZvbnRzX3RvX3NwYW5zIDogdHJ1ZQ0KCQkJfSwgcyk7DQoNCgkJCXQuZG9jdW1lbnRCYXNlVVJJID0gbmV3IHRpbnltY2UudXRpbC5VUkkocy5kb2N1bWVudF9iYXNlX3VybCB8fCB0aW55bWNlLmRvY3VtZW50QmFzZVVSTCwgew0KCQkJCWJhc2VfdXJpIDogdGlueU1DRS5iYXNlVVJJDQoJCQl9KTsNCg0KCQkJdC5iYXNlVVJJID0gdGlueW1jZS5iYXNlVVJJOw0KDQoJCQkvLyBDYWxsIHNldHVwDQoJCQl0LmV4ZWNDYWxsYmFjaygnc2V0dXAnLCB0KTsNCgkJfSwNCg0KCQlyZW5kZXIgOiBmdW5jdGlvbihuc3QpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGlkID0gdC5pZCwgc2wgPSB0aW55bWNlLlNjcmlwdExvYWRlcjsNCg0KCQkJLy8gUGFnZSBpcyBub3QgbG9hZGVkIHlldCwgd2FpdCBmb3IgaXQNCgkJCWlmICghRXZlbnQuZG9tTG9hZGVkKSB7DQoJCQkJRXZlbnQuYWRkKGRvY3VtZW50LCAnaW5pdCcsIGZ1bmN0aW9uKCkgew0KCQkJCQl0LnJlbmRlcigpOw0KCQkJCX0pOw0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJdGlueU1DRS5zZXR0aW5ncyA9IHM7DQoNCgkJCS8vIEVsZW1lbnQgbm90IGZvdW5kLCB0aGVuIHNraXAgaW5pdGlhbGl6YXRpb24NCgkJCWlmICghdC5nZXRFbGVtZW50KCkpDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBJcyBhIGlQYWQvaVBob25lLCB0aGVuIHNraXAgaW5pdGlhbGl6YXRpb24uIFdlIG5lZWQgdG8gc25pZmYgaGVyZSBzaW5jZSB0aGUNCgkJCS8vIGJyb3dzZXIgc2F5cyBpdCBoYXMgY29udGVudEVkaXRhYmxlIHN1cHBvcnQgYnV0IHRoZXJlIGlzIG5vIHZpc2libGUgY2FyZXQNCgkJCS8vIFdlIHdpbGwgcmVtb3ZlIHRoaXMgY2hlY2sgb25lcyBBcHBsZSBpbXBsZW1lbnRzIGZ1bGwgY29udGVudEVkaXRhYmxlIHN1cHBvcnQNCgkJCWlmICh0aW55bWNlLmlzSURldmljZSkNCgkJCQlyZXR1cm47DQoNCgkJCS8vIEFkZCBoaWRkZW4gaW5wdXQgZm9yIG5vbiBpbnB1dCBlbGVtZW50cyBpbnNpZGUgZm9ybSBlbGVtZW50cw0KCQkJaWYgKCEvVEVYVEFSRUF8SU5QVVQvaS50ZXN0KHQuZ2V0RWxlbWVudCgpLm5vZGVOYW1lKSAmJiBzLmhpZGRlbl9pbnB1dCAmJiBET00uZ2V0UGFyZW50KGlkLCAnZm9ybScpKQ0KCQkJCURPTS5pbnNlcnRBZnRlcihET00uY3JlYXRlKCdpbnB1dCcsIHt0eXBlIDogJ2hpZGRlbicsIG5hbWUgOiBpZH0pLCBpZCk7DQoNCgkJCWlmICh0aW55bWNlLldpbmRvd01hbmFnZXIpDQoJCQkJdC53aW5kb3dNYW5hZ2VyID0gbmV3IHRpbnltY2UuV2luZG93TWFuYWdlcih0KTsNCg0KCQkJaWYgKHMuZW5jb2RpbmcgPT0gJ3htbCcpIHsNCgkJCQl0Lm9uR2V0Q29udGVudC5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJaWYgKG8uc2F2ZSkNCgkJCQkJCW8uY29udGVudCA9IERPTS5lbmNvZGUoby5jb250ZW50KTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuYWRkX2Zvcm1fc3VibWl0X3RyaWdnZXIpIHsNCgkJCQl0Lm9uU3VibWl0LmFkZFRvVG9wKGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAodC5pbml0aWFsaXplZCkgew0KCQkJCQkJdC5zYXZlKCk7DQoJCQkJCQl0LmlzTm90RGlydHkgPSAxOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmFkZF91bmxvYWRfdHJpZ2dlcikgew0KCQkJCXQuX2JlZm9yZVVubG9hZCA9IHRpbnlNQ0Uub25CZWZvcmVVbmxvYWQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAodC5pbml0aWFsaXplZCAmJiAhdC5kZXN0cm95ZWQgJiYgIXQuaXNIaWRkZW4oKSkNCgkJCQkJCXQuc2F2ZSh7Zm9ybWF0IDogJ3JhdycsIG5vX2V2ZW50cyA6IHRydWV9KTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJdGlueW1jZS5hZGRVbmxvYWQodC5kZXN0cm95LCB0KTsNCg0KCQkJaWYgKHMuc3VibWl0X3BhdGNoKSB7DQoJCQkJdC5vbkJlZm9yZVJlbmRlclVJLmFkZChmdW5jdGlvbigpIHsNCgkJCQkJdmFyIG4gPSB0LmdldEVsZW1lbnQoKS5mb3JtOw0KDQoJCQkJCWlmICghbikNCgkJCQkJCXJldHVybjsNCg0KCQkJCQkvLyBBbHJlYWR5IHBhdGNoZWQNCgkJCQkJaWYgKG4uX21jZU9sZFN1Ym1pdCkNCgkJCQkJCXJldHVybjsNCg0KCQkJCQkvLyBDaGVjayBwYWdlIHVzZXMgaWQ9InN1Ym1pdCIgb3IgbmFtZT0ic3VibWl0IiBmb3IgaXQncyBzdWJtaXQgYnV0dG9uDQoJCQkJCWlmICghbi5zdWJtaXQubm9kZVR5cGUgJiYgIW4uc3VibWl0Lmxlbmd0aCkgew0KCQkJCQkJdC5mb3JtRWxlbWVudCA9IG47DQoJCQkJCQluLl9tY2VPbGRTdWJtaXQgPSBuLnN1Ym1pdDsNCgkJCQkJCW4uc3VibWl0ID0gZnVuY3Rpb24oKSB7DQoJCQkJCQkJLy8gU2F2ZSBhbGwgaW5zdGFuY2VzDQoJCQkJCQkJdGlueW1jZS50cmlnZ2VyU2F2ZSgpOw0KCQkJCQkJCXQuaXNOb3REaXJ0eSA9IDE7DQoNCgkJCQkJCQlyZXR1cm4gdC5mb3JtRWxlbWVudC5fbWNlT2xkU3VibWl0KHQuZm9ybUVsZW1lbnQpOw0KCQkJCQkJfTsNCgkJCQkJfQ0KDQoJCQkJCW4gPSBudWxsOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBMb2FkIHNjcmlwdHMNCgkJCWZ1bmN0aW9uIGxvYWRTY3JpcHRzKCkgew0KCQkJCWlmIChzLmxhbmd1YWdlKQ0KCQkJCQlzbC5hZGQodGlueW1jZS5iYXNlVVJMICsgJy9sYW5ncy8nICsgcy5sYW5ndWFnZSArICcuanMnKTsNCg0KCQkJCWlmIChzLnRoZW1lICYmIHMudGhlbWUuY2hhckF0KDApICE9ICctJyAmJiAhVGhlbWVNYW5hZ2VyLnVybHNbcy50aGVtZV0pDQoJCQkJCVRoZW1lTWFuYWdlci5sb2FkKHMudGhlbWUsICd0aGVtZXMvJyArIHMudGhlbWUgKyAnL2VkaXRvcl90ZW1wbGF0ZScgKyB0aW55bWNlLnN1ZmZpeCArICcuanMnKTsNCg0KCQkJCWVhY2goZXhwbG9kZShzLnBsdWdpbnMpLCBmdW5jdGlvbihwKSB7DQoJCQkJCWlmIChwICYmIHAuY2hhckF0KDApICE9ICctJyAmJiAhUGx1Z2luTWFuYWdlci51cmxzW3BdKSB7DQoJCQkJCQkvLyBTa2lwIHNhZmFyaSBwbHVnaW4sIHNpbmNlIGl0IGlzIHJlbW92ZWQgYXMgb2YgMy4zYjENCgkJCQkJCWlmIChwID09ICdzYWZhcmknKQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJUGx1Z2luTWFuYWdlci5sb2FkKHAsICdwbHVnaW5zLycgKyBwICsgJy9lZGl0b3JfcGx1Z2luJyArIHRpbnltY2Uuc3VmZml4ICsgJy5qcycpOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQkvLyBJbml0IHdoZW4gcXVlIGlzIGxvYWRlZA0KCQkJCXNsLmxvYWRRdWV1ZShmdW5jdGlvbigpIHsNCgkJCQkJaWYgKCF0LnJlbW92ZWQpDQoJCQkJCQl0LmluaXQoKTsNCgkJCQl9KTsNCgkJCX07DQoNCgkJCWxvYWRTY3JpcHRzKCk7DQoJCX0sDQoNCgkJaW5pdCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIG4sIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgdywgaCwgZSA9IHQuZ2V0RWxlbWVudCgpLCBvLCB0aSwgdSwgYmksIGJjLCByZTsNCg0KCQkJdGlueW1jZS5hZGQodCk7DQoNCgkJCWlmIChzLnRoZW1lKSB7DQoJCQkJcy50aGVtZSA9IHMudGhlbWUucmVwbGFjZSgvLS8sICcnKTsNCgkJCQlvID0gVGhlbWVNYW5hZ2VyLmdldChzLnRoZW1lKTsNCgkJCQl0LnRoZW1lID0gbmV3IG8oKTsNCg0KCQkJCWlmICh0LnRoZW1lLmluaXQgJiYgcy5pbml0X3RoZW1lKQ0KCQkJCQl0LnRoZW1lLmluaXQodCwgVGhlbWVNYW5hZ2VyLnVybHNbcy50aGVtZV0gfHwgdGlueW1jZS5kb2N1bWVudEJhc2VVUkwucmVwbGFjZSgvXC8kLywgJycpKTsNCgkJCX0NCg0KCQkJLy8gQ3JlYXRlIGFsbCBwbHVnaW5zDQoJCQllYWNoKGV4cGxvZGUocy5wbHVnaW5zLnJlcGxhY2UoL1wtL2csICcnKSksIGZ1bmN0aW9uKHApIHsNCgkJCQl2YXIgYyA9IFBsdWdpbk1hbmFnZXIuZ2V0KHApLCB1ID0gUGx1Z2luTWFuYWdlci51cmxzW3BdIHx8IHRpbnltY2UuZG9jdW1lbnRCYXNlVVJMLnJlcGxhY2UoL1wvJC8sICcnKSwgcG87DQoNCgkJCQlpZiAoYykgew0KCQkJCQlwbyA9IG5ldyBjKHQsIHUpOw0KDQoJCQkJCXQucGx1Z2luc1twXSA9IHBvOw0KDQoJCQkJCWlmIChwby5pbml0KQ0KCQkJCQkJcG8uaW5pdCh0LCB1KTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJLy8gU2V0dXAgcG9wdXAgQ1NTIHBhdGgocykNCgkJCWlmIChzLnBvcHVwX2NzcyAhPT0gZmFsc2UpIHsNCgkJCQlpZiAocy5wb3B1cF9jc3MpDQoJCQkJCXMucG9wdXBfY3NzID0gdC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShzLnBvcHVwX2Nzcyk7DQoJCQkJZWxzZQ0KCQkJCQlzLnBvcHVwX2NzcyA9IHQuYmFzZVVSSS50b0Fic29sdXRlKCJ0aGVtZXMvIiArIHMudGhlbWUgKyAiL3NraW5zLyIgKyBzLnNraW4gKyAiL2RpYWxvZy5jc3MiKTsNCgkJCX0NCg0KCQkJaWYgKHMucG9wdXBfY3NzX2FkZCkNCgkJCQlzLnBvcHVwX2NzcyArPSAnLCcgKyB0LmRvY3VtZW50QmFzZVVSSS50b0Fic29sdXRlKHMucG9wdXBfY3NzX2FkZCk7DQoNCgkJCXQuY29udHJvbE1hbmFnZXIgPSBuZXcgdGlueW1jZS5Db250cm9sTWFuYWdlcih0KTsNCg0KCQkJaWYgKHMuY3VzdG9tX3VuZG9fcmVkbykgew0KCQkJCS8vIEFkZCBpbml0aWFsIHVuZG8gbGV2ZWwNCgkJCQl0Lm9uQmVmb3JlRXhlY0NvbW1hbmQuYWRkKGZ1bmN0aW9uKGVkLCBjbWQsIHVpLCB2YWwsIGEpIHsNCgkJCQkJaWYgKGNtZCAhPSAnVW5kbycgJiYgY21kICE9ICdSZWRvJyAmJiBjbWQgIT0gJ21jZVJlcGFpbnQnICYmICghYSB8fCAhYS5za2lwX3VuZG8pKSB7DQoJCQkJCQlpZiAoIXQudW5kb01hbmFnZXIuaGFzVW5kbygpKQ0KCQkJCQkJCXQudW5kb01hbmFnZXIuYWRkKCk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCXQub25FeGVjQ29tbWFuZC5hZGQoZnVuY3Rpb24oZWQsIGNtZCwgdWksIHZhbCwgYSkgew0KCQkJCQlpZiAoY21kICE9ICdVbmRvJyAmJiBjbWQgIT0gJ1JlZG8nICYmIGNtZCAhPSAnbWNlUmVwYWludCcgJiYgKCFhIHx8ICFhLnNraXBfdW5kbykpDQoJCQkJCQl0LnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQl0Lm9uRXhlY0NvbW1hbmQuYWRkKGZ1bmN0aW9uKGVkLCBjKSB7DQoJCQkJLy8gRG9uJ3QgcmVmcmVzaCB0aGUgc2VsZWN0IGxpc3RzIHVudGlsIGNhcmV0IG1vdmUNCgkJCQlpZiAoIS9eKEZvbnROYW1lfEZvbnRTaXplKSQvLnRlc3QoYykpDQoJCQkJCXQubm9kZUNoYW5nZWQoKTsNCgkJCX0pOw0KDQoJCQkvLyBSZW1vdmUgZ2hvc3Qgc2VsZWN0aW9ucyBvbiBpbWFnZXMgYW5kIHRhYmxlcyBpbiBHZWNrbw0KCQkJaWYgKGlzR2Vja28pIHsNCgkJCQlmdW5jdGlvbiByZXBhaW50KGEsIG8pIHsNCgkJCQkJaWYgKCFvIHx8ICFvLmluaXRpYWwpDQoJCQkJCQl0LmV4ZWNDb21tYW5kKCdtY2VSZXBhaW50Jyk7DQoJCQkJfTsNCg0KCQkJCXQub25VbmRvLmFkZChyZXBhaW50KTsNCgkJCQl0Lm9uUmVkby5hZGQocmVwYWludCk7DQoJCQkJdC5vblNldENvbnRlbnQuYWRkKHJlcGFpbnQpOw0KCQkJfQ0KDQoJCQkvLyBFbmFibGVzIHVzZXJzIHRvIG92ZXJyaWRlIHRoZSBjb250cm9sIGZhY3RvcnkNCgkJCXQub25CZWZvcmVSZW5kZXJVSS5kaXNwYXRjaCh0LCB0LmNvbnRyb2xNYW5hZ2VyKTsNCg0KCQkJLy8gTWVhc3VyZSBib3gNCgkJCWlmIChzLnJlbmRlcl91aSkgew0KCQkJCXcgPSBzLndpZHRoIHx8IGUuc3R5bGUud2lkdGggfHwgZS5vZmZzZXRXaWR0aDsNCgkJCQloID0gcy5oZWlnaHQgfHwgZS5zdHlsZS5oZWlnaHQgfHwgZS5vZmZzZXRIZWlnaHQ7DQoJCQkJdC5vcmdEaXNwbGF5ID0gZS5zdHlsZS5kaXNwbGF5Ow0KCQkJCXJlID0gL15bMC05XC5dKyh8cHgpJC9pOw0KDQoJCQkJaWYgKHJlLnRlc3QoJycgKyB3KSkNCgkJCQkJdyA9IE1hdGgubWF4KHBhcnNlSW50KHcpICsgKG8uZGVsdGFXaWR0aCB8fCAwKSwgMTAwKTsNCg0KCQkJCWlmIChyZS50ZXN0KCcnICsgaCkpDQoJCQkJCWggPSBNYXRoLm1heChwYXJzZUludChoKSArIChvLmRlbHRhSGVpZ2h0IHx8IDApLCAxMDApOw0KDQoJCQkJLy8gUmVuZGVyIFVJDQoJCQkJbyA9IHQudGhlbWUucmVuZGVyVUkoew0KCQkJCQl0YXJnZXROb2RlIDogZSwNCgkJCQkJd2lkdGggOiB3LA0KCQkJCQloZWlnaHQgOiBoLA0KCQkJCQlkZWx0YVdpZHRoIDogcy5kZWx0YV93aWR0aCwNCgkJCQkJZGVsdGFIZWlnaHQgOiBzLmRlbHRhX2hlaWdodA0KCQkJCX0pOw0KDQoJCQkJdC5lZGl0b3JDb250YWluZXIgPSBvLmVkaXRvckNvbnRhaW5lcjsNCgkJCX0NCg0KDQoJCQkvLyBVc2VyIHNwZWNpZmllZCBhIGRvY3VtZW50LmRvbWFpbiB2YWx1ZQ0KCQkJaWYgKGRvY3VtZW50LmRvbWFpbiAmJiBsb2NhdGlvbi5ob3N0bmFtZSAhPSBkb2N1bWVudC5kb21haW4pDQoJCQkJdGlueW1jZS5yZWxheGVkRG9tYWluID0gZG9jdW1lbnQuZG9tYWluOw0KDQoJCQkvLyBSZXNpemUgZWRpdG9yDQoJCQlET00uc2V0U3R5bGVzKG8uc2l6ZUNvbnRhaW5lciB8fCBvLmVkaXRvckNvbnRhaW5lciwgew0KCQkJCXdpZHRoIDogdywNCgkJCQloZWlnaHQgOiBoDQoJCQl9KTsNCg0KCQkJaCA9IChvLmlmcmFtZUhlaWdodCB8fCBoKSArICh0eXBlb2YoaCkgPT0gJ251bWJlcicgPyAoby5kZWx0YUhlaWdodCB8fCAwKSA6ICcnKTsNCgkJCWlmIChoIDwgMTAwKQ0KCQkJCWggPSAxMDA7DQoNCgkJCXQuaWZyYW1lSFRNTCA9IHMuZG9jdHlwZSArICc8aHRtbD48aGVhZCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+JzsNCg0KCQkJLy8gV2Ugb25seSBuZWVkIHRvIG92ZXJyaWRlIHBhdGhzIGlmIHdlIGhhdmUgdG8NCgkJCS8vIElFIGhhcyBhIGJ1ZyB3aGVyZSBpdCByZW1vdmUgc2l0ZSBhYnNvbHV0ZSB1cmxzIHRvIHJlbGF0aXZlIG9uZXMgaWYgdGhpcyBpcyBzcGVjaWZpZWQNCgkJCWlmIChzLmRvY3VtZW50X2Jhc2VfdXJsICE9IHRpbnltY2UuZG9jdW1lbnRCYXNlVVJMKQ0KCQkJCXQuaWZyYW1lSFRNTCArPSAnPGJhc2UgaHJlZj0iJyArIHQuZG9jdW1lbnRCYXNlVVJJLmdldFVSSSgpICsgJyIgLz4nOw0KDQoJCQl0LmlmcmFtZUhUTUwgKz0gJzxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9NyIgLz48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4nOw0KDQoJCQlpZiAodGlueW1jZS5yZWxheGVkRG9tYWluKQ0KCQkJCXQuaWZyYW1lSFRNTCArPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRvY3VtZW50LmRvbWFpbiA9ICInICsgdGlueW1jZS5yZWxheGVkRG9tYWluICsgJyI7PC9zY3JpcHQ+JzsNCg0KCQkJYmkgPSBzLmJvZHlfaWQgfHwgJ3RpbnltY2UnOw0KCQkJaWYgKGJpLmluZGV4T2YoJz0nKSAhPSAtMSkgew0KCQkJCWJpID0gdC5nZXRQYXJhbSgnYm9keV9pZCcsICcnLCAnaGFzaCcpOw0KCQkJCWJpID0gYmlbdC5pZF0gfHwgYmk7DQoJCQl9DQoNCgkJCWJjID0gcy5ib2R5X2NsYXNzIHx8ICcnOw0KCQkJaWYgKGJjLmluZGV4T2YoJz0nKSAhPSAtMSkgew0KCQkJCWJjID0gdC5nZXRQYXJhbSgnYm9keV9jbGFzcycsICcnLCAnaGFzaCcpOw0KCQkJCWJjID0gYmNbdC5pZF0gfHwgJyc7DQoJCQl9DQoNCgkJCXQuaWZyYW1lSFRNTCArPSAnPC9oZWFkPjxib2R5IGlkPSInICsgYmkgKyAnIiBjbGFzcz0ibWNlQ29udGVudEJvZHkgJyArIGJjICsgJyI+PC9ib2R5PjwvaHRtbD4nOw0KDQoJCQkvLyBEb21haW4gcmVsYXhpbmcgZW5hYmxlZCwgdGhlbiBzZXQgZG9jdW1lbnQgZG9tYWluDQoJCQlpZiAodGlueW1jZS5yZWxheGVkRG9tYWluKSB7DQoJCQkJLy8gV2UgbmVlZCB0byB3cml0ZSB0aGUgY29udGVudHMgaGVyZSBpbiBJRSBzaW5jZSBtdWx0aXBsZSB3cml0ZXMgbWVzc2VzIHVwIHJlZnJlc2ggYnV0dG9uIGFuZCBiYWNrIGJ1dHRvbg0KCQkJCWlmIChpc0lFIHx8ICh0aW55bWNlLmlzT3BlcmEgJiYgcGFyc2VGbG9hdChvcGVyYS52ZXJzaW9uKCkpID49IDkuNSkpDQoJCQkJCXUgPSAnamF2YXNjcmlwdDooZnVuY3Rpb24oKXtkb2N1bWVudC5vcGVuKCk7ZG9jdW1lbnQuZG9tYWluPSInICsgZG9jdW1lbnQuZG9tYWluICsgJyI7dmFyIGVkID0gd2luZG93LnBhcmVudC50aW55TUNFLmdldCgiJyArIHQuaWQgKyAnIik7ZG9jdW1lbnQud3JpdGUoZWQuaWZyYW1lSFRNTCk7ZG9jdW1lbnQuY2xvc2UoKTtlZC5zZXR1cElmcmFtZSgpO30pKCknOw0KCQkJCWVsc2UgaWYgKHRpbnltY2UuaXNPcGVyYSkNCgkJCQkJdSA9ICdqYXZhc2NyaXB0OihmdW5jdGlvbigpe2RvY3VtZW50Lm9wZW4oKTtkb2N1bWVudC5kb21haW49IicgKyBkb2N1bWVudC5kb21haW4gKyAnIjtkb2N1bWVudC5jbG9zZSgpO2VkLnNldHVwSWZyYW1lKCk7fSkoKSc7CQkJCQkNCgkJCX0NCg0KCQkJLy8gQ3JlYXRlIGlmcmFtZQ0KCQkJbiA9IERPTS5hZGQoby5pZnJhbWVDb250YWluZXIsICdpZnJhbWUnLCB7DQoJCQkJaWQgOiB0LmlkICsgIl9pZnIiLA0KCQkJCXNyYyA6IHUgfHwgJ2phdmFzY3JpcHQ6IiInLCAvLyBXb3JrYXJvdW5kIGZvciBIVFRQUyB3YXJuaW5nIGluIElFNi83DQoJCQkJZnJhbWVCb3JkZXIgOiAnMCcsDQoJCQkJc3R5bGUgOiB7DQoJCQkJCXdpZHRoIDogJzEwMCUnLA0KCQkJCQloZWlnaHQgOiBoDQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXQuY29udGVudEFyZWFDb250YWluZXIgPSBvLmlmcmFtZUNvbnRhaW5lcjsNCgkJCURPTS5nZXQoby5lZGl0b3JDb250YWluZXIpLnN0eWxlLmRpc3BsYXkgPSB0Lm9yZ0Rpc3BsYXk7DQoJCQlET00uZ2V0KHQuaWQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoNCgkJCWlmICghaXNJRSB8fCAhdGlueW1jZS5yZWxheGVkRG9tYWluKQ0KCQkJCXQuc2V0dXBJZnJhbWUoKTsNCg0KCQkJZSA9IG4gPSBvID0gbnVsbDsgLy8gQ2xlYW51cA0KCQl9LA0KDQoJCXNldHVwSWZyYW1lIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBlID0gRE9NLmdldCh0LmlkKSwgZCA9IHQuZ2V0RG9jKCksIGgsIGI7DQoNCgkJCS8vIFNldHVwIGlmcmFtZSBib2R5DQoJCQlpZiAoIWlzSUUgfHwgIXRpbnltY2UucmVsYXhlZERvbWFpbikgew0KCQkJCWQub3BlbigpOw0KCQkJCWQud3JpdGUodC5pZnJhbWVIVE1MKTsNCgkJCQlkLmNsb3NlKCk7DQoJCQl9DQoNCgkJCS8vIERlc2lnbiBtb2RlIG5lZWRzIHRvIGJlIGFkZGVkIGhlcmUgQ3RybCtBIHdpbGwgZmFpbCBvdGhlcndpc2UNCgkJCWlmICghaXNJRSkgew0KCQkJCXRyeSB7DQoJCQkJCWlmICghcy5yZWFkb25seSkNCgkJCQkJCWQuZGVzaWduTW9kZSA9ICdPbic7DQoJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJLy8gV2lsbCBmYWlsIG9uIEdlY2tvIGlmIHRoZSBlZGl0b3IgaXMgcGxhY2VkIGluIGFuIGhpZGRlbiBjb250YWluZXIgZWxlbWVudA0KCQkJCQkvLyBUaGUgZGVzaWduIG1vZGUgd2lsbCBiZSBzZXQgb25lcyB0aGUgZWRpdG9yIGlzIGZvY3VzZWQNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIElFIG5lZWRzIHRvIHVzZSBjb250ZW50RWRpdGFibGUgb3IgaXQgd2lsbCBkaXNwbGF5IG5vbiBzZWN1cmUgaXRlbXMgZm9yIEhUVFBTDQoJCQlpZiAoaXNJRSkgew0KCQkJCS8vIEl0IHdpbGwgbm90IHN0ZWFsIGZvY3VzIGlmIHdlIGhpZGUgaXQgd2hpbGUgc2V0dGluZyBjb250ZW50RWRpdGFibGUNCgkJCQliID0gdC5nZXRCb2R5KCk7DQoJCQkJRE9NLmhpZGUoYik7DQoNCgkJCQlpZiAoIXMucmVhZG9ubHkpDQoJCQkJCWIuY29udGVudEVkaXRhYmxlID0gdHJ1ZTsNCg0KCQkJCURPTS5zaG93KGIpOw0KCQkJfQ0KDQoJCQl0LmRvbSA9IG5ldyB0aW55bWNlLmRvbS5ET01VdGlscyh0LmdldERvYygpLCB7DQoJCQkJa2VlcF92YWx1ZXMgOiB0cnVlLA0KCQkJCXVybF9jb252ZXJ0ZXIgOiB0LmNvbnZlcnRVUkwsDQoJCQkJdXJsX2NvbnZlcnRlcl9zY29wZSA6IHQsDQoJCQkJaGV4X2NvbG9ycyA6IHMuZm9yY2VfaGV4X3N0eWxlX2NvbG9ycywNCgkJCQljbGFzc19maWx0ZXIgOiBzLmNsYXNzX2ZpbHRlciwNCgkJCQl1cGRhdGVfc3R5bGVzIDogMSwNCgkJCQlmaXhfaWVfcGFyYWdyYXBocyA6IDEsDQoJCQkJdmFsaWRfc3R5bGVzIDogcy52YWxpZF9zdHlsZXMNCgkJCX0pOw0KDQoJCQl0LnNjaGVtYSA9IG5ldyB0aW55bWNlLmRvbS5TY2hlbWEoKTsNCg0KCQkJdC5zZXJpYWxpemVyID0gbmV3IHRpbnltY2UuZG9tLlNlcmlhbGl6ZXIoZXh0ZW5kKHMsIHsNCgkJCQl2YWxpZF9lbGVtZW50cyA6IHMudmVyaWZ5X2h0bWwgPT09IGZhbHNlID8gJypbKl0nIDogcy52YWxpZF9lbGVtZW50cywNCgkJCQlkb20gOiB0LmRvbSwNCgkJCQlzY2hlbWEgOiB0LnNjaGVtYQ0KCQkJfSkpOw0KDQoJCQl0LnNlbGVjdGlvbiA9IG5ldyB0aW55bWNlLmRvbS5TZWxlY3Rpb24odC5kb20sIHQuZ2V0V2luKCksIHQuc2VyaWFsaXplcik7DQoNCgkJCXQuZm9ybWF0dGVyID0gbmV3IHRpbnltY2UuRm9ybWF0dGVyKHRoaXMpOw0KDQoJCQkvLyBSZWdpc3RlciBkZWZhdWx0IGZvcm1hdHMNCgkJCXQuZm9ybWF0dGVyLnJlZ2lzdGVyKHsNCgkJCQlhbGlnbmxlZnQgOiBbDQoJCQkJCXtzZWxlY3RvciA6ICdwLGgxLGgyLGgzLGg0LGg1LGg2LHRkLHRoLGRpdix1bCxvbCxsaScsIHN0eWxlcyA6IHt0ZXh0QWxpZ24gOiAnbGVmdCd9fSwNCgkJCQkJe3NlbGVjdG9yIDogJ2ltZyx0YWJsZScsIHN0eWxlcyA6IHsnZmxvYXQnIDogJ2xlZnQnfX0NCgkJCQldLA0KDQoJCQkJYWxpZ25jZW50ZXIgOiBbDQoJCQkJCXtzZWxlY3RvciA6ICdwLGgxLGgyLGgzLGg0LGg1LGg2LHRkLHRoLGRpdix1bCxvbCxsaScsIHN0eWxlcyA6IHt0ZXh0QWxpZ24gOiAnY2VudGVyJ319LA0KCQkJCQl7c2VsZWN0b3IgOiAnaW1nJywgc3R5bGVzIDoge2Rpc3BsYXkgOiAnYmxvY2snLCBtYXJnaW5MZWZ0IDogJ2F1dG8nLCBtYXJnaW5SaWdodCA6ICdhdXRvJ319LA0KCQkJCQl7c2VsZWN0b3IgOiAndGFibGUnLCBzdHlsZXMgOiB7bWFyZ2luTGVmdCA6ICdhdXRvJywgbWFyZ2luUmlnaHQgOiAnYXV0byd9fQ0KCQkJCV0sDQoNCgkJCQlhbGlnbnJpZ2h0IDogWw0KCQkJCQl7c2VsZWN0b3IgOiAncCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGknLCBzdHlsZXMgOiB7dGV4dEFsaWduIDogJ3JpZ2h0J319LA0KCQkJCQl7c2VsZWN0b3IgOiAnaW1nLHRhYmxlJywgc3R5bGVzIDogeydmbG9hdCcgOiAncmlnaHQnfX0NCgkJCQldLA0KDQoJCQkJYWxpZ25mdWxsIDogWw0KCQkJCQl7c2VsZWN0b3IgOiAncCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGknLCBzdHlsZXMgOiB7dGV4dEFsaWduIDogJ2p1c3RpZnknfX0NCgkJCQldLA0KDQoJCQkJYm9sZCA6IFsNCgkJCQkJe2lubGluZSA6ICdzdHJvbmcnfSwNCgkJCQkJe2lubGluZSA6ICdzcGFuJywgc3R5bGVzIDoge2ZvbnRXZWlnaHQgOiAnYm9sZCd9fSwNCgkJCQkJe2lubGluZSA6ICdiJ30NCgkJCQldLA0KDQoJCQkJaXRhbGljIDogWw0KCQkJCQl7aW5saW5lIDogJ2VtJ30sDQoJCQkJCXtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHtmb250U3R5bGUgOiAnaXRhbGljJ319LA0KCQkJCQl7aW5saW5lIDogJ2knfQ0KCQkJCV0sDQoNCgkJCQl1bmRlcmxpbmUgOiBbDQoJCQkJCXtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHt0ZXh0RGVjb3JhdGlvbiA6ICd1bmRlcmxpbmUnfSwgZXhhY3QgOiB0cnVlfSwNCgkJCQkJe2lubGluZSA6ICd1J30NCgkJCQldLA0KDQoJCQkJc3RyaWtldGhyb3VnaCA6IFsNCgkJCQkJe2lubGluZSA6ICdzcGFuJywgc3R5bGVzIDoge3RleHREZWNvcmF0aW9uIDogJ2xpbmUtdGhyb3VnaCd9LCBleGFjdCA6IHRydWV9LA0KCQkJCQl7aW5saW5lIDogJ3UnfQ0KCQkJCV0sDQoNCgkJCQlmb3JlY29sb3IgOiB7aW5saW5lIDogJ3NwYW4nLCBzdHlsZXMgOiB7Y29sb3IgOiAnJXZhbHVlJ30sIHdyYXBfbGlua3MgOiBmYWxzZX0sDQoJCQkJaGlsaXRlY29sb3IgOiB7aW5saW5lIDogJ3NwYW4nLCBzdHlsZXMgOiB7YmFja2dyb3VuZENvbG9yIDogJyV2YWx1ZSd9LCB3cmFwX2xpbmtzIDogZmFsc2V9LA0KCQkJCWZvbnRuYW1lIDoge2lubGluZSA6ICdzcGFuJywgc3R5bGVzIDoge2ZvbnRGYW1pbHkgOiAnJXZhbHVlJ319LA0KCQkJCWZvbnRzaXplIDoge2lubGluZSA6ICdzcGFuJywgc3R5bGVzIDoge2ZvbnRTaXplIDogJyV2YWx1ZSd9fSwNCgkJCQlmb250c2l6ZV9jbGFzcyA6IHtpbmxpbmUgOiAnc3BhbicsIGF0dHJpYnV0ZXMgOiB7J2NsYXNzJyA6ICcldmFsdWUnfX0sDQoJCQkJYmxvY2txdW90ZSA6IHtibG9jayA6ICdibG9ja3F1b3RlJywgd3JhcHBlciA6IDEsIHJlbW92ZSA6ICdhbGwnfSwNCg0KCQkJCXJlbW92ZWZvcm1hdCA6IFsNCgkJCQkJe3NlbGVjdG9yIDogJ2Isc3Ryb25nLGVtLGksZm9udCx1LHN0cmlrZScsIHJlbW92ZSA6ICdhbGwnLCBzcGxpdCA6IHRydWUsIGV4cGFuZCA6IGZhbHNlLCBibG9ja19leHBhbmQgOiB0cnVlLCBkZWVwIDogdHJ1ZX0sDQoJCQkJCXtzZWxlY3RvciA6ICdzcGFuJywgYXR0cmlidXRlcyA6IFsnc3R5bGUnLCAnY2xhc3MnXSwgcmVtb3ZlIDogJ2VtcHR5Jywgc3BsaXQgOiB0cnVlLCBleHBhbmQgOiBmYWxzZSwgZGVlcCA6IHRydWV9LA0KCQkJCQl7c2VsZWN0b3IgOiAnKicsIGF0dHJpYnV0ZXMgOiBbJ3N0eWxlJywgJ2NsYXNzJ10sIHNwbGl0IDogZmFsc2UsIGV4cGFuZCA6IGZhbHNlLCBkZWVwIDogdHJ1ZX0NCgkJCQldDQoJCQl9KTsNCg0KCQkJLy8gUmVnaXN0ZXIgZGVmYXVsdCBibG9jayBmb3JtYXRzDQoJCQllYWNoKCdwIGgxIGgyIGgzIGg0IGg1IGg2IGRpdiBhZGRyZXNzIHByZSBkaXYgY29kZSBkdCBkZCBzYW1wJy5zcGxpdCgvXHMvKSwgZnVuY3Rpb24obmFtZSkgew0KCQkJCXQuZm9ybWF0dGVyLnJlZ2lzdGVyKG5hbWUsIHtibG9jayA6IG5hbWUsIHJlbW92ZSA6ICdhbGwnfSk7DQoJCQl9KTsNCg0KCQkJLy8gUmVnaXN0ZXIgdXNlciBkZWZpbmVkIGZvcm1hdHMNCgkJCXQuZm9ybWF0dGVyLnJlZ2lzdGVyKHQuc2V0dGluZ3MuZm9ybWF0cyk7DQoNCgkJCXQudW5kb01hbmFnZXIgPSBuZXcgdGlueW1jZS5VbmRvTWFuYWdlcih0KTsNCg0KCQkJLy8gUGFzcyB0aHJvdWdoDQoJCQl0LnVuZG9NYW5hZ2VyLm9uQWRkLmFkZChmdW5jdGlvbih1bSwgbCkgew0KCQkJCWlmICghbC5pbml0aWFsKQ0KCQkJCQlyZXR1cm4gdC5vbkNoYW5nZS5kaXNwYXRjaCh0LCBsLCB1bSk7DQoJCQl9KTsNCg0KCQkJdC51bmRvTWFuYWdlci5vblVuZG8uYWRkKGZ1bmN0aW9uKHVtLCBsKSB7DQoJCQkJcmV0dXJuIHQub25VbmRvLmRpc3BhdGNoKHQsIGwsIHVtKTsNCgkJCX0pOw0KDQoJCQl0LnVuZG9NYW5hZ2VyLm9uUmVkby5hZGQoZnVuY3Rpb24odW0sIGwpIHsNCgkJCQlyZXR1cm4gdC5vblJlZG8uZGlzcGF0Y2godCwgbCwgdW0pOw0KCQkJfSk7DQoNCgkJCXQuZm9yY2VCbG9ja3MgPSBuZXcgdGlueW1jZS5Gb3JjZUJsb2Nrcyh0LCB7DQoJCQkJZm9yY2VkX3Jvb3RfYmxvY2sgOiBzLmZvcmNlZF9yb290X2Jsb2NrDQoJCQl9KTsNCg0KCQkJdC5lZGl0b3JDb21tYW5kcyA9IG5ldyB0aW55bWNlLkVkaXRvckNvbW1hbmRzKHQpOw0KDQoJCQkvLyBQYXNzIHRocm91Z2gNCgkJCXQuc2VyaWFsaXplci5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJcmV0dXJuIHQub25QcmVQcm9jZXNzLmRpc3BhdGNoKHQsIG8sIHNlKTsNCgkJCX0pOw0KDQoJCQl0LnNlcmlhbGl6ZXIub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24oc2UsIG8pIHsNCgkJCQlyZXR1cm4gdC5vblBvc3RQcm9jZXNzLmRpc3BhdGNoKHQsIG8sIHNlKTsNCgkJCX0pOw0KDQoJCQl0Lm9uUHJlSW5pdC5kaXNwYXRjaCh0KTsNCg0KCQkJaWYgKCFzLmdlY2tvX3NwZWxsY2hlY2spDQoJCQkJdC5nZXRCb2R5KCkuc3BlbGxjaGVjayA9IDA7DQoNCgkJCWlmICghcy5yZWFkb25seSkNCgkJCQl0Ll9hZGRFdmVudHMoKTsNCg0KCQkJdC5jb250cm9sTWFuYWdlci5vblBvc3RSZW5kZXIuZGlzcGF0Y2godCwgdC5jb250cm9sTWFuYWdlcik7DQoJCQl0Lm9uUG9zdFJlbmRlci5kaXNwYXRjaCh0KTsNCg0KCQkJaWYgKHMuZGlyZWN0aW9uYWxpdHkpDQoJCQkJdC5nZXRCb2R5KCkuZGlyID0gcy5kaXJlY3Rpb25hbGl0eTsNCg0KCQkJaWYgKHMubm93cmFwKQ0KCQkJCXQuZ2V0Qm9keSgpLnN0eWxlLndoaXRlU3BhY2UgPSAibm93cmFwIjsNCg0KCQkJaWYgKHMuY3VzdG9tX2VsZW1lbnRzKSB7DQoJCQkJZnVuY3Rpb24gaGFuZGxlQ3VzdG9tKGVkLCBvKSB7DQoJCQkJCWVhY2goZXhwbG9kZShzLmN1c3RvbV9lbGVtZW50cyksIGZ1bmN0aW9uKHYpIHsNCgkJCQkJCXZhciBuOw0KDQoJCQkJCQlpZiAodi5pbmRleE9mKCd+JykgPT09IDApIHsNCgkJCQkJCQl2ID0gdi5zdWJzdHJpbmcoMSk7DQoJCQkJCQkJbiA9ICdzcGFuJzsNCgkJCQkJCX0gZWxzZQ0KCQkJCQkJCW4gPSAnZGl2JzsNCg0KCQkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UobmV3IFJlZ0V4cCgnPCgnICsgdiArICcpKFtePl0qKT4nLCAnZycpLCAnPCcgKyBuICsgJyBfbWNlX25hbWU9IiQxIiQyPicpOw0KCQkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UobmV3IFJlZ0V4cCgnPC8oJyArIHYgKyAnKT4nLCAnZycpLCAnPC8nICsgbiArICc+Jyk7DQoJCQkJCX0pOw0KCQkJCX07DQoNCgkJCQl0Lm9uQmVmb3JlU2V0Q29udGVudC5hZGQoaGFuZGxlQ3VzdG9tKTsNCgkJCQl0Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCWlmIChvLnNldCkNCgkJCQkJCWhhbmRsZUN1c3RvbShlZCwgbyk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmhhbmRsZV9ub2RlX2NoYW5nZV9jYWxsYmFjaykgew0KCQkJCXQub25Ob2RlQ2hhbmdlLmFkZChmdW5jdGlvbihlZCwgY20sIG4pIHsNCgkJCQkJdC5leGVjQ2FsbGJhY2soJ2hhbmRsZV9ub2RlX2NoYW5nZV9jYWxsYmFjaycsIHQuaWQsIG4sIC0xLCAtMSwgdHJ1ZSwgdC5zZWxlY3Rpb24uaXNDb2xsYXBzZWQoKSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLnNhdmVfY2FsbGJhY2spIHsNCgkJCQl0Lm9uU2F2ZUNvbnRlbnQuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCXZhciBoID0gdC5leGVjQ2FsbGJhY2soJ3NhdmVfY2FsbGJhY2snLCB0LmlkLCBvLmNvbnRlbnQsIHQuZ2V0Qm9keSgpKTsNCg0KCQkJCQlpZiAoaCkNCgkJCQkJCW8uY29udGVudCA9IGg7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLm9uY2hhbmdlX2NhbGxiYWNrKSB7DQoJCQkJdC5vbkNoYW5nZS5hZGQoZnVuY3Rpb24oZWQsIGwpIHsNCgkJCQkJdC5leGVjQ2FsbGJhY2soJ29uY2hhbmdlX2NhbGxiYWNrJywgdCwgbCk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmNvbnZlcnRfbmV3bGluZXNfdG9fYnJzKSB7DQoJCQkJdC5vbkJlZm9yZVNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCWlmIChvLmluaXRpYWwpDQoJCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSgvXHI/XG4vZywgJzxiciAvPicpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5maXhfbmVzdGluZyAmJiBpc0lFKSB7DQoJCQkJdC5vbkJlZm9yZVNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCW8uY29udGVudCA9IHQuX2ZpeE5lc3Rpbmcoby5jb250ZW50KTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMucHJlZm9ybWF0dGVkKSB7DQoJCQkJdC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSgvXlxzKjxwcmUuKj8+LywgJycpOw0KCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSgvPFwvcHJlPlxzKiQvLCAnJyk7DQoNCgkJCQkJaWYgKG8uc2V0KQ0KCQkJCQkJby5jb250ZW50ID0gJzxwcmUgY2xhc3M9Im1jZUl0ZW1IaWRkZW4iPicgKyBvLmNvbnRlbnQgKyAnPC9wcmU+JzsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMudmVyaWZ5X2Nzc19jbGFzc2VzKSB7DQoJCQkJdC5zZXJpYWxpemVyLmF0dHJpYlZhbHVlRmlsdGVyID0gZnVuY3Rpb24obiwgdikgew0KCQkJCQl2YXIgcywgY2w7DQoNCgkJCQkJaWYgKG4gPT0gJ2NsYXNzJykgew0KCQkJCQkJLy8gQnVpbGQgcmVnZXhwIGZvciBjbGFzc2VzDQoJCQkJCQlpZiAoIXQuY2xhc3Nlc1JFKSB7DQoJCQkJCQkJY2wgPSB0LmRvbS5nZXRDbGFzc2VzKCk7DQoNCgkJCQkJCQlpZiAoY2wubGVuZ3RoID4gMCkgew0KCQkJCQkJCQlzID0gJyc7DQoNCgkJCQkJCQkJZWFjaCAoY2wsIGZ1bmN0aW9uKG8pIHsNCgkJCQkJCQkJCXMgKz0gKHMgPyAnfCcgOiAnJykgKyBvWydjbGFzcyddOw0KCQkJCQkJCQl9KTsNCg0KCQkJCQkJCQl0LmNsYXNzZXNSRSA9IG5ldyBSZWdFeHAoJygnICsgcyArICcpJywgJ2dpJyk7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm4gIXQuY2xhc3Nlc1JFIHx8IC8oXGJtY2VJdGVtXHcrXGJ8XGJtY2VUZW1wXHcrXGIpL2cudGVzdCh2KSB8fCB0LmNsYXNzZXNSRS50ZXN0KHYpID8gdiA6ICcnOw0KCQkJCQl9DQoNCgkJCQkJcmV0dXJuIHY7DQoJCQkJfTsNCgkJCX0NCg0KCQkJaWYgKHMuY2xlYW51cF9jYWxsYmFjaykgew0KCQkJCXQub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlvLmNvbnRlbnQgPSB0LmV4ZWNDYWxsYmFjaygnY2xlYW51cF9jYWxsYmFjaycsICdpbnNlcnRfdG9fZWRpdG9yJywgby5jb250ZW50LCBvKTsNCgkJCQl9KTsNCg0KCQkJCXQub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlpZiAoby5zZXQpDQoJCQkJCQl0LmV4ZWNDYWxsYmFjaygnY2xlYW51cF9jYWxsYmFjaycsICdpbnNlcnRfdG9fZWRpdG9yX2RvbScsIG8ubm9kZSwgbyk7DQoNCgkJCQkJaWYgKG8uZ2V0KQ0KCQkJCQkJdC5leGVjQ2FsbGJhY2soJ2NsZWFudXBfY2FsbGJhY2snLCAnZ2V0X2Zyb21fZWRpdG9yX2RvbScsIG8ubm9kZSwgbyk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCWlmIChvLnNldCkNCgkJCQkJCW8uY29udGVudCA9IHQuZXhlY0NhbGxiYWNrKCdjbGVhbnVwX2NhbGxiYWNrJywgJ2luc2VydF90b19lZGl0b3InLCBvLmNvbnRlbnQsIG8pOw0KDQoJCQkJCWlmIChvLmdldCkJCQkJCQkNCgkJCQkJCW8uY29udGVudCA9IHQuZXhlY0NhbGxiYWNrKCdjbGVhbnVwX2NhbGxiYWNrJywgJ2dldF9mcm9tX2VkaXRvcicsIG8uY29udGVudCwgbyk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLnNhdmVfY2FsbGJhY2spIHsNCgkJCQl0Lm9uR2V0Q29udGVudC5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJaWYgKG8uc2F2ZSkNCgkJCQkJCW8uY29udGVudCA9IHQuZXhlY0NhbGxiYWNrKCdzYXZlX2NhbGxiYWNrJywgdC5pZCwgby5jb250ZW50LCB0LmdldEJvZHkoKSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmhhbmRsZV9ldmVudF9jYWxsYmFjaykgew0KCQkJCXQub25FdmVudC5hZGQoZnVuY3Rpb24oZWQsIGUsIG8pIHsNCgkJCQkJaWYgKHQuZXhlY0NhbGxiYWNrKCdoYW5kbGVfZXZlbnRfY2FsbGJhY2snLCBlLCBlZCwgbykgPT09IGZhbHNlKQ0KCQkJCQkJRXZlbnQuY2FuY2VsKGUpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBBZGQgdmlzdWFsIGFpZHMgd2hlbiBuZXcgY29udGVudHMgaXMgYWRkZWQNCgkJCXQub25TZXRDb250ZW50LmFkZChmdW5jdGlvbigpIHsNCgkJCQl0LmFkZFZpc3VhbCh0LmdldEJvZHkoKSk7DQoJCQl9KTsNCg0KCQkJLy8gUmVtb3ZlIGVtcHR5IGNvbnRlbnRzDQoJCQlpZiAocy5wYWRkX2VtcHR5X2VkaXRvcikgew0KCQkJCXQub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UoL14oPHBbXj5dKj4oJm5ic3A7fCYjMTYwO3xcc3xcdTAwYTB8KTxcL3A+W1xyXG5dKnw8YnIgXC8+W1xyXG5dKikkLywgJycpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAoaXNHZWNrbykgew0KCQkJCS8vIEZpeCBnZWNrbyBsaW5rIGJ1Zywgd2hlbiBhIGxpbmsgaXMgcGxhY2VkIGF0IHRoZSBlbmQgb2YgYmxvY2sgZWxlbWVudHMgdGhlcmUgaXMNCgkJCQkvLyBubyB3YXkgdG8gbW92ZSB0aGUgY2FyZXQgYmVoaW5kIHRoZSBsaW5rLiBUaGlzIGZpeCBhZGRzIGEgYm9ndXMgYnIgZWxlbWVudCBhZnRlciB0aGUgbGluaw0KCQkJCWZ1bmN0aW9uIGZpeExpbmtzKGVkLCBvKSB7DQoJCQkJCWVhY2goZWQuZG9tLnNlbGVjdCgnYScpLCBmdW5jdGlvbihuKSB7DQoJCQkJCQl2YXIgcG4gPSBuLnBhcmVudE5vZGU7DQoNCgkJCQkJCWlmIChlZC5kb20uaXNCbG9jayhwbikgJiYgcG4ubGFzdENoaWxkID09PSBuKQ0KCQkJCQkJCWVkLmRvbS5hZGQocG4sICdicicsIHsnX21jZV9ib2d1cycgOiAxfSk7DQoJCQkJCX0pOw0KCQkJCX07DQoNCgkJCQl0Lm9uRXhlY0NvbW1hbmQuYWRkKGZ1bmN0aW9uKGVkLCBjbWQpIHsNCgkJCQkJaWYgKGNtZCA9PT0gJ0NyZWF0ZUxpbmsnKQ0KCQkJCQkJZml4TGlua3MoZWQpOw0KCQkJCX0pOw0KDQoJCQkJdC5vblNldENvbnRlbnQuYWRkKHQuc2VsZWN0aW9uLm9uU2V0Q29udGVudC5hZGQoZml4TGlua3MpKTsNCg0KCQkJCWlmICghcy5yZWFkb25seSkgew0KCQkJCQl0cnkgew0KCQkJCQkJLy8gRGVzaWduIG1vZGUgbXVzdCBiZSBzZXQgaGVyZSBvbmNlIGFnYWluIHRvIGZpeCBhIGJ1ZyB3aGVyZQ0KCQkJCQkJLy8gQ3RybCtBL0RlbGV0ZS9CYWNrc3BhY2UgZGlkbid0IHdvcmsgaWYgdGhlIGVkaXRvciB3YXMgYWRkZWQgdXNpbmcgbWNlQWRkQ29udHJvbCB0aGVuIHJlbW92ZWQgdGhlbiBhZGRlZCBhZ2Fpbg0KCQkJCQkJZC5kZXNpZ25Nb2RlID0gJ09mZic7DQoJCQkJCQlkLmRlc2lnbk1vZGUgPSAnT24nOw0KCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJLy8gV2lsbCBmYWlsIG9uIEdlY2tvIGlmIHRoZSBlZGl0b3IgaXMgcGxhY2VkIGluIGFuIGhpZGRlbiBjb250YWluZXIgZWxlbWVudA0KCQkJCQkJLy8gVGhlIGRlc2lnbiBtb2RlIHdpbGwgYmUgc2V0IG9uZXMgdGhlIGVkaXRvciBpcyBmb2N1c2VkDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCS8vIEEgc21hbGwgdGltZW91dCB3YXMgbmVlZGVkIHNpbmNlIGZpcmVmb3ggd2lsbCByZW1vdmUuIEJ1ZzogIzE4MzgzMDQNCgkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KCQkJCWlmICh0LnJlbW92ZWQpDQoJCQkJCXJldHVybjsNCg0KCQkJCXQubG9hZCh7aW5pdGlhbCA6IHRydWUsIGZvcm1hdCA6IChzLmNsZWFudXBfb25fc3RhcnR1cCA/ICdodG1sJyA6ICdyYXcnKX0pOw0KCQkJCXQuc3RhcnRDb250ZW50ID0gdC5nZXRDb250ZW50KHtmb3JtYXQgOiAncmF3J30pOw0KCQkJCXQuaW5pdGlhbGl6ZWQgPSB0cnVlOw0KDQoJCQkJdC5vbkluaXQuZGlzcGF0Y2godCk7DQoJCQkJdC5leGVjQ2FsbGJhY2soJ3NldHVwY29udGVudF9jYWxsYmFjaycsIHQuaWQsIHQuZ2V0Qm9keSgpLCB0LmdldERvYygpKTsNCgkJCQl0LmV4ZWNDYWxsYmFjaygnaW5pdF9pbnN0YW5jZV9jYWxsYmFjaycsIHQpOw0KCQkJCXQuZm9jdXModHJ1ZSk7DQoJCQkJdC5ub2RlQ2hhbmdlZCh7aW5pdGlhbCA6IDF9KTsNCg0KCQkJCS8vIExvYWQgc3BlY2lmaWVkIGNvbnRlbnQgQ1NTIGxhc3QNCgkJCQlpZiAocy5jb250ZW50X2Nzcykgew0KCQkJCQl0aW55bWNlLmVhY2goZXhwbG9kZShzLmNvbnRlbnRfY3NzKSwgZnVuY3Rpb24odSkgew0KCQkJCQkJdC5kb20ubG9hZENTUyh0LmRvY3VtZW50QmFzZVVSSS50b0Fic29sdXRlKHUpKTsNCgkJCQkJfSk7DQoJCQkJfQ0KDQoJCQkJLy8gSGFuZGxlIGF1dG8gZm9jdXMNCgkJCQlpZiAocy5hdXRvX2ZvY3VzKSB7DQoJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KCQkJCQkJdmFyIGVkID0gdGlueW1jZS5nZXQocy5hdXRvX2ZvY3VzKTsNCg0KCQkJCQkJZWQuc2VsZWN0aW9uLnNlbGVjdChlZC5nZXRCb2R5KCksIDEpOw0KCQkJCQkJZWQuc2VsZWN0aW9uLmNvbGxhcHNlKDEpOw0KCQkJCQkJZWQuZ2V0V2luKCkuZm9jdXMoKTsNCgkJCQkJfSwgMTAwKTsNCgkJCQl9DQoJCQl9LCAxKTsNCgkNCgkJCWUgPSBudWxsOw0KCQl9LA0KDQoNCgkJZm9jdXMgOiBmdW5jdGlvbihzZikgew0KCQkJdmFyIG9lZCwgdCA9IHRoaXMsIGNlID0gdC5zZXR0aW5ncy5jb250ZW50X2VkaXRhYmxlLCBpZVJuZywgY29udHJvbEVsbSwgZG9jID0gdC5nZXREb2MoKTsNCg0KCQkJaWYgKCFzZikgew0KCQkJCS8vIEdldCBzZWxlY3RlZCBjb250cm9sIGVsZW1lbnQNCgkJCQlpZVJuZyA9IHQuc2VsZWN0aW9uLmdldFJuZygpOw0KCQkJCWlmIChpZVJuZy5pdGVtKSB7DQoJCQkJCWNvbnRyb2xFbG0gPSBpZVJuZy5pdGVtKDApOw0KCQkJCX0NCg0KCQkJCS8vIElzIG5vdCBjb250ZW50IGVkaXRhYmxlDQoJCQkJaWYgKCFjZSkNCgkJCQkJdC5nZXRXaW4oKS5mb2N1cygpOw0KDQoJCQkJLy8gUmVzdG9yZSBzZWxlY3RlZCBjb250cm9sIGVsZW1lbnQNCgkJCQkvLyBUaGlzIGlzIG5lZWRlZCB3aGVuIGZvciBleGFtcGxlIGFuIGltYWdlIGlzIHNlbGVjdGVkIHdpdGhpbiBhDQoJCQkJLy8gbGF5ZXIgYSBjYWxsIHRvIGZvY3VzIHdpbGwgdGhlbiByZW1vdmUgdGhlIGNvbnRyb2wgc2VsZWN0aW9uDQoJCQkJaWYgKGNvbnRyb2xFbG0gJiYgY29udHJvbEVsbS5vd25lckRvY3VtZW50ID09IGRvYykgew0KCQkJCQlpZVJuZyA9IGRvYy5ib2R5LmNyZWF0ZUNvbnRyb2xSYW5nZSgpOw0KCQkJCQlpZVJuZy5hZGRFbGVtZW50KGNvbnRyb2xFbG0pOw0KCQkJCQlpZVJuZy5zZWxlY3QoKTsNCgkJCQl9DQoNCgkJCX0NCg0KCQkJaWYgKHRpbnltY2UuYWN0aXZlRWRpdG9yICE9IHQpIHsNCgkJCQlpZiAoKG9lZCA9IHRpbnltY2UuYWN0aXZlRWRpdG9yKSAhPSBudWxsKQ0KCQkJCQlvZWQub25EZWFjdGl2YXRlLmRpc3BhdGNoKG9lZCwgdCk7DQoNCgkJCQl0Lm9uQWN0aXZhdGUuZGlzcGF0Y2godCwgb2VkKTsNCgkJCX0NCg0KCQkJdGlueW1jZS5fc2V0QWN0aXZlKHQpOw0KCQl9LA0KDQoJCWV4ZWNDYWxsYmFjayA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciB0ID0gdGhpcywgZiA9IHQuc2V0dGluZ3Nbbl0sIHM7DQoNCgkJCWlmICghZikNCgkJCQlyZXR1cm47DQoNCgkJCS8vIExvb2sgdGhyb3VnaCBsb29rdXANCgkJCWlmICh0LmNhbGxiYWNrTG9va3VwICYmIChzID0gdC5jYWxsYmFja0xvb2t1cFtuXSkpIHsNCgkJCQlmID0gcy5mdW5jOw0KCQkJCXMgPSBzLnNjb3BlOw0KCQkJfQ0KDQoJCQlpZiAoaXMoZiwgJ3N0cmluZycpKSB7DQoJCQkJcyA9IGYucmVwbGFjZSgvXC5cdyskLywgJycpOw0KCQkJCXMgPSBzID8gdGlueW1jZS5yZXNvbHZlKHMpIDogMDsNCgkJCQlmID0gdGlueW1jZS5yZXNvbHZlKGYpOw0KCQkJCXQuY2FsbGJhY2tMb29rdXAgPSB0LmNhbGxiYWNrTG9va3VwIHx8IHt9Ow0KCQkJCXQuY2FsbGJhY2tMb29rdXBbbl0gPSB7ZnVuYyA6IGYsIHNjb3BlIDogc307DQoJCQl9DQoNCgkJCXJldHVybiBmLmFwcGx5KHMgfHwgdCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7DQoJCX0sDQoNCgkJdHJhbnNsYXRlIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIGMgPSB0aGlzLnNldHRpbmdzLmxhbmd1YWdlIHx8ICdlbicsIGkxOG4gPSB0aW55bWNlLmkxOG47DQoNCgkJCWlmICghcykNCgkJCQlyZXR1cm4gJyc7DQoNCgkJCXJldHVybiBpMThuW2MgKyAnLicgKyBzXSB8fCBzLnJlcGxhY2UoL3tcIyhbXn1dKylcfS9nLCBmdW5jdGlvbihhLCBiKSB7DQoJCQkJcmV0dXJuIGkxOG5bYyArICcuJyArIGJdIHx8ICd7IycgKyBiICsgJ30nOw0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0TGFuZyA6IGZ1bmN0aW9uKG4sIGR2KSB7DQoJCQlyZXR1cm4gdGlueW1jZS5pMThuWyh0aGlzLnNldHRpbmdzLmxhbmd1YWdlIHx8ICdlbicpICsgJy4nICsgbl0gfHwgKGlzKGR2KSA/IGR2IDogJ3sjJyArIG4gKyAnfScpOw0KCQl9LA0KDQoJCWdldFBhcmFtIDogZnVuY3Rpb24obiwgZHYsIHR5KSB7DQoJCQl2YXIgdHIgPSB0aW55bWNlLnRyaW0sIHYgPSBpcyh0aGlzLnNldHRpbmdzW25dKSA/IHRoaXMuc2V0dGluZ3Nbbl0gOiBkdiwgbzsNCg0KCQkJaWYgKHR5ID09PSAnaGFzaCcpIHsNCgkJCQlvID0ge307DQoNCgkJCQlpZiAoaXModiwgJ3N0cmluZycpKSB7DQoJCQkJCWVhY2godi5pbmRleE9mKCc9JykgPiAwID8gdi5zcGxpdCgvWzssXSg/IVtePTssXSooPzpbOyxdfCQpKS8pIDogdi5zcGxpdCgnLCcpLCBmdW5jdGlvbih2KSB7DQoJCQkJCQl2ID0gdi5zcGxpdCgnPScpOw0KDQoJCQkJCQlpZiAodi5sZW5ndGggPiAxKQ0KCQkJCQkJCW9bdHIodlswXSldID0gdHIodlsxXSk7DQoJCQkJCQllbHNlDQoJCQkJCQkJb1t0cih2WzBdKV0gPSB0cih2KTsNCgkJCQkJfSk7DQoJCQkJfSBlbHNlDQoJCQkJCW8gPSB2Ow0KDQoJCQkJcmV0dXJuIG87DQoJCQl9DQoNCgkJCXJldHVybiB2Ow0KCQl9LA0KDQoJCW5vZGVDaGFuZ2VkIDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZWxlY3Rpb24sIG4gPSAoaXNJRSA/IHMuZ2V0Tm9kZSgpIDogcy5nZXRTdGFydCgpKSB8fCB0LmdldEJvZHkoKTsNCg0KCQkJLy8gRml4IGZvciBidWcgIzE4OTY1NzcgaXQgc2VlbXMgdGhhdCB0aGlzIGNhbiBub3QgYmUgZmlyZWQgd2hpbGUgdGhlIGVkaXRvciBpcyBsb2FkaW5nDQoJCQlpZiAodC5pbml0aWFsaXplZCkgew0KCQkJCW8gPSBvIHx8IHt9Ow0KCQkJCW4gPSBpc0lFICYmIG4ub3duZXJEb2N1bWVudCAhPSB0LmdldERvYygpID8gdC5nZXRCb2R5KCkgOiBuOyAvLyBGaXggZm9yIElFIGluaXRpYWwgc3RhdGUNCg0KCQkJCS8vIEdldCBwYXJlbnRzIGFuZCBhZGQgdGhlbSB0byBvYmplY3QNCgkJCQlvLnBhcmVudHMgPSBbXTsNCgkJCQl0LmRvbS5nZXRQYXJlbnQobiwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQlpZiAobm9kZS5ub2RlTmFtZSA9PSAnQk9EWScpDQoJCQkJCQlyZXR1cm4gdHJ1ZTsNCg0KCQkJCQlvLnBhcmVudHMucHVzaChub2RlKTsNCgkJCQl9KTsNCg0KCQkJCXQub25Ob2RlQ2hhbmdlLmRpc3BhdGNoKA0KCQkJCQl0LA0KCQkJCQlvID8gby5jb250cm9sTWFuYWdlciB8fCB0LmNvbnRyb2xNYW5hZ2VyIDogdC5jb250cm9sTWFuYWdlciwNCgkJCQkJbiwNCgkJCQkJcy5pc0NvbGxhcHNlZCgpLA0KCQkJCQlvDQoJCQkJKTsNCgkJCX0NCgkJfSwNCg0KCQlhZGRCdXR0b24gOiBmdW5jdGlvbihuLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQuYnV0dG9ucyA9IHQuYnV0dG9ucyB8fCB7fTsNCgkJCXQuYnV0dG9uc1tuXSA9IHM7DQoJCX0sDQoNCgkJYWRkQ29tbWFuZCA6IGZ1bmN0aW9uKG4sIGYsIHMpIHsNCgkJCXRoaXMuZXhlY0NvbW1hbmRzW25dID0ge2Z1bmMgOiBmLCBzY29wZSA6IHMgfHwgdGhpc307DQoJCX0sDQoNCgkJYWRkUXVlcnlTdGF0ZUhhbmRsZXIgOiBmdW5jdGlvbihuLCBmLCBzKSB7DQoJCQl0aGlzLnF1ZXJ5U3RhdGVDb21tYW5kc1tuXSA9IHtmdW5jIDogZiwgc2NvcGUgOiBzIHx8IHRoaXN9Ow0KCQl9LA0KDQoJCWFkZFF1ZXJ5VmFsdWVIYW5kbGVyIDogZnVuY3Rpb24obiwgZiwgcykgew0KCQkJdGhpcy5xdWVyeVZhbHVlQ29tbWFuZHNbbl0gPSB7ZnVuYyA6IGYsIHNjb3BlIDogcyB8fCB0aGlzfTsNCgkJfSwNCg0KCQlhZGRTaG9ydGN1dCA6IGZ1bmN0aW9uKHBhLCBkZXNjLCBjbWRfZnVuYywgc2MpIHsNCgkJCXZhciB0ID0gdGhpcywgYzsNCg0KCQkJaWYgKCF0LnNldHRpbmdzLmN1c3RvbV9zaG9ydGN1dHMpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQl0LnNob3J0Y3V0cyA9IHQuc2hvcnRjdXRzIHx8IHt9Ow0KDQoJCQlpZiAoaXMoY21kX2Z1bmMsICdzdHJpbmcnKSkgew0KCQkJCWMgPSBjbWRfZnVuYzsNCg0KCQkJCWNtZF9mdW5jID0gZnVuY3Rpb24oKSB7DQoJCQkJCXQuZXhlY0NvbW1hbmQoYywgZmFsc2UsIG51bGwpOw0KCQkJCX07DQoJCQl9DQoNCgkJCWlmIChpcyhjbWRfZnVuYywgJ29iamVjdCcpKSB7DQoJCQkJYyA9IGNtZF9mdW5jOw0KDQoJCQkJY21kX2Z1bmMgPSBmdW5jdGlvbigpIHsNCgkJCQkJdC5leGVjQ29tbWFuZChjWzBdLCBjWzFdLCBjWzJdKTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQllYWNoKGV4cGxvZGUocGEpLCBmdW5jdGlvbihwYSkgew0KCQkJCXZhciBvID0gew0KCQkJCQlmdW5jIDogY21kX2Z1bmMsDQoJCQkJCXNjb3BlIDogc2MgfHwgdGhpcywNCgkJCQkJZGVzYyA6IGRlc2MsDQoJCQkJCWFsdCA6IGZhbHNlLA0KCQkJCQljdHJsIDogZmFsc2UsDQoJCQkJCXNoaWZ0IDogZmFsc2UNCgkJCQl9Ow0KDQoJCQkJZWFjaChleHBsb2RlKHBhLCAnKycpLCBmdW5jdGlvbih2KSB7DQoJCQkJCXN3aXRjaCAodikgew0KCQkJCQkJY2FzZSAnYWx0JzoNCgkJCQkJCWNhc2UgJ2N0cmwnOg0KCQkJCQkJY2FzZSAnc2hpZnQnOg0KCQkJCQkJCW9bdl0gPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQlkZWZhdWx0Og0KCQkJCQkJCW8uY2hhckNvZGUgPSB2LmNoYXJDb2RlQXQoMCk7DQoJCQkJCQkJby5rZXlDb2RlID0gdi50b1VwcGVyQ2FzZSgpLmNoYXJDb2RlQXQoMCk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCXQuc2hvcnRjdXRzWyhvLmN0cmwgPyAnY3RybCcgOiAnJykgKyAnLCcgKyAoby5hbHQgPyAnYWx0JyA6ICcnKSArICcsJyArIChvLnNoaWZ0ID8gJ3NoaWZ0JyA6ICcnKSArICcsJyArIG8ua2V5Q29kZV0gPSBvOw0KCQkJfSk7DQoNCgkJCXJldHVybiB0cnVlOw0KCQl9LA0KDQoJCWV4ZWNDb21tYW5kIDogZnVuY3Rpb24oY21kLCB1aSwgdmFsLCBhKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSAwLCBvLCBzdDsNCg0KCQkJaWYgKCEvXihtY2VBZGRVbmRvTGV2ZWx8bWNlRW5kVW5kb0xldmVsfG1jZUJlZ2luVW5kb0xldmVsfG1jZVJlcGFpbnR8U2VsZWN0QWxsKSQvLnRlc3QoY21kKSAmJiAoIWEgfHwgIWEuc2tpcF9mb2N1cykpDQoJCQkJdC5mb2N1cygpOw0KDQoJCQlvID0ge307DQoJCQl0Lm9uQmVmb3JlRXhlY0NvbW1hbmQuZGlzcGF0Y2godCwgY21kLCB1aSwgdmFsLCBvKTsNCgkJCWlmIChvLnRlcm1pbmF0ZSkNCgkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCS8vIENvbW1hbmQgY2FsbGJhY2sNCgkJCWlmICh0LmV4ZWNDYWxsYmFjaygnZXhlY2NvbW1hbmRfY2FsbGJhY2snLCB0LmlkLCB0LnNlbGVjdGlvbi5nZXROb2RlKCksIGNtZCwgdWksIHZhbCkpIHsNCgkJCQl0Lm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2godCwgY21kLCB1aSwgdmFsLCBhKTsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlpZiAobyA9IHQuZXhlY0NvbW1hbmRzW2NtZF0pIHsNCgkJCQlzdCA9IG8uZnVuYy5jYWxsKG8uc2NvcGUsIHVpLCB2YWwpOw0KDQoJCQkJLy8gRmFsbCB0aHJvdWdoIG9uIHRydWUNCgkJCQlpZiAoc3QgIT09IHRydWUpIHsNCgkJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJCXJldHVybiBzdDsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFBsdWdpbiBjb21tYW5kcw0KCQkJZWFjaCh0LnBsdWdpbnMsIGZ1bmN0aW9uKHApIHsNCgkJCQlpZiAocC5leGVjQ29tbWFuZCAmJiBwLmV4ZWNDb21tYW5kKGNtZCwgdWksIHZhbCkpIHsNCgkJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJCXMgPSAxOw0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWlmIChzKQ0KCQkJCXJldHVybiB0cnVlOw0KDQoJCQkvLyBUaGVtZSBjb21tYW5kcw0KCQkJaWYgKHQudGhlbWUgJiYgdC50aGVtZS5leGVjQ29tbWFuZCAmJiB0LnRoZW1lLmV4ZWNDb21tYW5kKGNtZCwgdWksIHZhbCkpIHsNCgkJCQl0Lm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2godCwgY21kLCB1aSwgdmFsLCBhKTsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCg0KCQkJLy8gRXhlY3V0ZSBnbG9iYWwgY29tbWFuZHMNCgkJCWlmICh0aW55bWNlLkdsb2JhbENvbW1hbmRzLmV4ZWNDb21tYW5kKHQsIGNtZCwgdWksIHZhbCkpIHsNCgkJCQl0Lm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2godCwgY21kLCB1aSwgdmFsLCBhKTsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCg0KCQkJLy8gRWRpdG9yIGNvbW1hbmRzDQoJCQlpZiAodC5lZGl0b3JDb21tYW5kcy5leGVjQ29tbWFuZChjbWQsIHVpLCB2YWwpKSB7DQoJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoNCgkJCS8vIEJyb3dzZXIgY29tbWFuZHMNCgkJCXQuZ2V0RG9jKCkuZXhlY0NvbW1hbmQoY21kLCB1aSwgdmFsKTsNCgkJCXQub25FeGVjQ29tbWFuZC5kaXNwYXRjaCh0LCBjbWQsIHVpLCB2YWwsIGEpOw0KCQl9LA0KDQoJCXF1ZXJ5Q29tbWFuZFN0YXRlIDogZnVuY3Rpb24oY21kKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG8sIHM7DQoNCgkJCS8vIElzIGhpZGRlbiB0aGVuIHJldHVybiB1bmRlZmluZWQNCgkJCWlmICh0Ll9pc0hpZGRlbigpKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlpZiAobyA9IHQucXVlcnlTdGF0ZUNvbW1hbmRzW2NtZF0pIHsNCgkJCQlzID0gby5mdW5jLmNhbGwoby5zY29wZSk7DQoNCgkJCQkvLyBGYWxsIHRob3VnaCBvbiB0cnVlDQoJCQkJaWYgKHMgIT09IHRydWUpDQoJCQkJCXJldHVybiBzOw0KCQkJfQ0KDQoJCQkvLyBSZWdpc3RyZWQgY29tbWFuZHMNCgkJCW8gPSB0LmVkaXRvckNvbW1hbmRzLnF1ZXJ5Q29tbWFuZFN0YXRlKGNtZCk7DQoJCQlpZiAobyAhPT0gLTEpDQoJCQkJcmV0dXJuIG87DQoNCgkJCS8vIEJyb3dzZXIgY29tbWFuZHMNCgkJCXRyeSB7DQoJCQkJcmV0dXJuIHRoaXMuZ2V0RG9jKCkucXVlcnlDb21tYW5kU3RhdGUoY21kKTsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJLy8gRmFpbHMgc29tZXRpbWVzIHNlZSBidWc6IDE4OTY1NzcNCgkJCX0NCgkJfSwNCg0KCQlxdWVyeUNvbW1hbmRWYWx1ZSA6IGZ1bmN0aW9uKGMpIHsNCgkJCXZhciB0ID0gdGhpcywgbywgczsNCg0KCQkJLy8gSXMgaGlkZGVuIHRoZW4gcmV0dXJuIHVuZGVmaW5lZA0KCQkJaWYgKHQuX2lzSGlkZGVuKCkpDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBSZWdpc3RyZWQgY29tbWFuZHMNCgkJCWlmIChvID0gdC5xdWVyeVZhbHVlQ29tbWFuZHNbY10pIHsNCgkJCQlzID0gby5mdW5jLmNhbGwoby5zY29wZSk7DQoNCgkJCQkvLyBGYWxsIHRob3VnaCBvbiB0cnVlDQoJCQkJaWYgKHMgIT09IHRydWUpDQoJCQkJCXJldHVybiBzOw0KCQkJfQ0KDQoJCQkvLyBSZWdpc3RyZWQgY29tbWFuZHMNCgkJCW8gPSB0LmVkaXRvckNvbW1hbmRzLnF1ZXJ5Q29tbWFuZFZhbHVlKGMpOw0KCQkJaWYgKGlzKG8pKQ0KCQkJCXJldHVybiBvOw0KDQoJCQkvLyBCcm93c2VyIGNvbW1hbmRzDQoJCQl0cnkgew0KCQkJCXJldHVybiB0aGlzLmdldERvYygpLnF1ZXJ5Q29tbWFuZFZhbHVlKGMpOw0KCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkvLyBGYWlscyBzb21ldGltZXMgc2VlIGJ1ZzogMTg5NjU3Nw0KCQkJfQ0KCQl9LA0KDQoJCXNob3cgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJRE9NLnNob3codC5nZXRDb250YWluZXIoKSk7DQoJCQlET00uaGlkZSh0LmlkKTsNCgkJCXQubG9hZCgpOw0KCQl9LA0KDQoJCWhpZGUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZCA9IHQuZ2V0RG9jKCk7DQoNCgkJCS8vIEZpeGVkIGJ1ZyB3aGVyZSBJRSBoYXMgYSBibGlua2luZyBjdXJzb3IgbGVmdCBmcm9tIHRoZSBlZGl0b3INCgkJCWlmIChpc0lFICYmIGQpDQoJCQkJZC5leGVjQ29tbWFuZCgnU2VsZWN0QWxsJyk7DQoNCgkJCS8vIFdlIG11c3Qgc2F2ZSBiZWZvcmUgd2UgaGlkZSBzbyBTYWZhcmkgZG9lc24ndCBjcmFzaA0KCQkJdC5zYXZlKCk7DQoJCQlET00uaGlkZSh0LmdldENvbnRhaW5lcigpKTsNCgkJCURPTS5zZXRTdHlsZSh0LmlkLCAnZGlzcGxheScsIHQub3JnRGlzcGxheSk7DQoJCX0sDQoNCgkJaXNIaWRkZW4gOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiAhRE9NLmlzSGlkZGVuKHRoaXMuaWQpOw0KCQl9LA0KDQoJCXNldFByb2dyZXNzU3RhdGUgOiBmdW5jdGlvbihiLCB0aSwgbykgew0KCQkJdGhpcy5vblNldFByb2dyZXNzU3RhdGUuZGlzcGF0Y2godGhpcywgYiwgdGksIG8pOw0KDQoJCQlyZXR1cm4gYjsNCgkJfSwNCg0KCQlsb2FkIDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzLCBlID0gdC5nZXRFbGVtZW50KCksIGg7DQoNCgkJCWlmIChlKSB7DQoJCQkJbyA9IG8gfHwge307DQoJCQkJby5sb2FkID0gdHJ1ZTsNCg0KCQkJCS8vIERvdWJsZSBlbmNvZGUgZXhpc3RpbmcgZW50aXRpZXMgaW4gdGhlIHZhbHVlDQoJCQkJaCA9IHQuc2V0Q29udGVudChpcyhlLnZhbHVlKSA/IGUudmFsdWUgOiBlLmlubmVySFRNTCwgbyk7DQoJCQkJby5lbGVtZW50ID0gZTsNCg0KCQkJCWlmICghby5ub19ldmVudHMpDQoJCQkJCXQub25Mb2FkQ29udGVudC5kaXNwYXRjaCh0LCBvKTsNCg0KCQkJCW8uZWxlbWVudCA9IGUgPSBudWxsOw0KDQoJCQkJcmV0dXJuIGg7DQoJCQl9DQoJCX0sDQoNCgkJc2F2ZSA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciB0ID0gdGhpcywgZSA9IHQuZ2V0RWxlbWVudCgpLCBoLCBmOw0KDQoJCQlpZiAoIWUgfHwgIXQuaW5pdGlhbGl6ZWQpDQoJCQkJcmV0dXJuOw0KDQoJCQlvID0gbyB8fCB7fTsNCgkJCW8uc2F2ZSA9IHRydWU7DQoNCgkJCS8vIEFkZCB1bmRvIGxldmVsIHdpbGwgdHJpZ2dlciBvbmNoYW5nZSBldmVudA0KCQkJaWYgKCFvLm5vX2V2ZW50cykgew0KCQkJCXQudW5kb01hbmFnZXIudHlwaW5nID0gMDsNCgkJCQl0LnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJfQ0KDQoJCQlvLmVsZW1lbnQgPSBlOw0KCQkJaCA9IG8uY29udGVudCA9IHQuZ2V0Q29udGVudChvKTsNCg0KCQkJaWYgKCFvLm5vX2V2ZW50cykNCgkJCQl0Lm9uU2F2ZUNvbnRlbnQuZGlzcGF0Y2godCwgbyk7DQoNCgkJCWggPSBvLmNvbnRlbnQ7DQoNCgkJCWlmICghL1RFWFRBUkVBfElOUFVUL2kudGVzdChlLm5vZGVOYW1lKSkgew0KCQkJCWUuaW5uZXJIVE1MID0gaDsNCg0KCQkJCS8vIFVwZGF0ZSBoaWRkZW4gZm9ybSBlbGVtZW50DQoJCQkJaWYgKGYgPSBET00uZ2V0UGFyZW50KHQuaWQsICdmb3JtJykpIHsNCgkJCQkJZWFjaChmLmVsZW1lbnRzLCBmdW5jdGlvbihlKSB7DQoJCQkJCQlpZiAoZS5uYW1lID09IHQuaWQpIHsNCgkJCQkJCQllLnZhbHVlID0gaDsNCgkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0gZWxzZQ0KCQkJCWUudmFsdWUgPSBoOw0KDQoJCQlvLmVsZW1lbnQgPSBlID0gbnVsbDsNCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJc2V0Q29udGVudCA6IGZ1bmN0aW9uKGgsIG8pIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJbyA9IG8gfHwge307DQoJCQlvLmZvcm1hdCA9IG8uZm9ybWF0IHx8ICdodG1sJzsNCgkJCW8uc2V0ID0gdHJ1ZTsNCgkJCW8uY29udGVudCA9IGg7DQoNCgkJCWlmICghby5ub19ldmVudHMpDQoJCQkJdC5vbkJlZm9yZVNldENvbnRlbnQuZGlzcGF0Y2godCwgbyk7DQoNCgkJCS8vIFBhZGQgZW1wdHkgY29udGVudCBpbiBHZWNrbyBhbmQgU2FmYXJpLiBDb21tYW5kcyB3aWxsIG90aGVyd2lzZSBmYWlsIG9uIHRoZSBjb250ZW50DQoJCQkvLyBJdCB3aWxsIGFsc28gYmUgaW1wb3NzaWJsZSB0byBwbGFjZSB0aGUgY2FyZXQgaW4gdGhlIGVkaXRvciB1bmxlc3MgdGhlcmUgaXMgYSBCUiBlbGVtZW50IHByZXNlbnQNCgkJCWlmICghdGlueW1jZS5pc0lFICYmIChoLmxlbmd0aCA9PT0gMCB8fCAvXlxzKyQvLnRlc3QoaCkpKSB7DQoJCQkJby5jb250ZW50ID0gdC5kb20uc2V0SFRNTCh0LmdldEJvZHkoKSwgJzxiciBfbWNlX2JvZ3VzPSIxIiAvPicpOw0KCQkJCW8uZm9ybWF0ID0gJ3Jhdyc7DQoJCQl9DQoNCgkJCW8uY29udGVudCA9IHQuZG9tLnNldEhUTUwodC5nZXRCb2R5KCksIHRpbnltY2UudHJpbShvLmNvbnRlbnQpKTsNCg0KCQkJaWYgKG8uZm9ybWF0ICE9ICdyYXcnICYmIHQuc2V0dGluZ3MuY2xlYW51cCkgew0KCQkJCW8uZ2V0SW5uZXIgPSB0cnVlOw0KCQkJCW8uY29udGVudCA9IHQuZG9tLnNldEhUTUwodC5nZXRCb2R5KCksIHQuc2VyaWFsaXplci5zZXJpYWxpemUodC5nZXRCb2R5KCksIG8pKTsNCgkJCX0NCg0KCQkJaWYgKCFvLm5vX2V2ZW50cykNCgkJCQl0Lm9uU2V0Q29udGVudC5kaXNwYXRjaCh0LCBvKTsNCg0KCQkJcmV0dXJuIG8uY29udGVudDsNCgkJfSwNCg0KCQlnZXRDb250ZW50IDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzLCBoOw0KDQoJCQlvID0gbyB8fCB7fTsNCgkJCW8uZm9ybWF0ID0gby5mb3JtYXQgfHwgJ2h0bWwnOw0KCQkJby5nZXQgPSB0cnVlOw0KDQoJCQlpZiAoIW8ubm9fZXZlbnRzKQ0KCQkJCXQub25CZWZvcmVHZXRDb250ZW50LmRpc3BhdGNoKHQsIG8pOw0KDQoJCQlpZiAoby5mb3JtYXQgIT0gJ3JhdycgJiYgdC5zZXR0aW5ncy5jbGVhbnVwKSB7DQoJCQkJby5nZXRJbm5lciA9IHRydWU7DQoJCQkJaCA9IHQuc2VyaWFsaXplci5zZXJpYWxpemUodC5nZXRCb2R5KCksIG8pOw0KCQkJfSBlbHNlDQoJCQkJaCA9IHQuZ2V0Qm9keSgpLmlubmVySFRNTDsNCg0KCQkJaCA9IGgucmVwbGFjZSgvXlxzKnxccyokL2csICcnKTsNCgkJCW8uY29udGVudCA9IGg7DQoNCgkJCWlmICghby5ub19ldmVudHMpDQoJCQkJdC5vbkdldENvbnRlbnQuZGlzcGF0Y2godCwgbyk7DQoNCgkJCXJldHVybiBvLmNvbnRlbnQ7DQoJCX0sDQoNCgkJaXNEaXJ0eSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlyZXR1cm4gdGlueW1jZS50cmltKHQuc3RhcnRDb250ZW50KSAhPSB0aW55bWNlLnRyaW0odC5nZXRDb250ZW50KHtmb3JtYXQgOiAncmF3Jywgbm9fZXZlbnRzIDogMX0pKSAmJiAhdC5pc05vdERpcnR5Ow0KCQl9LA0KDQoJCWdldENvbnRhaW5lciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoIXQuY29udGFpbmVyKQ0KCQkJCXQuY29udGFpbmVyID0gRE9NLmdldCh0LmVkaXRvckNvbnRhaW5lciB8fCB0LmlkICsgJ19wYXJlbnQnKTsNCg0KCQkJcmV0dXJuIHQuY29udGFpbmVyOw0KCQl9LA0KDQoJCWdldENvbnRlbnRBcmVhQ29udGFpbmVyIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5jb250ZW50QXJlYUNvbnRhaW5lcjsNCgkJfSwNCg0KCQlnZXRFbGVtZW50IDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gRE9NLmdldCh0aGlzLnNldHRpbmdzLmNvbnRlbnRfZWxlbWVudCB8fCB0aGlzLmlkKTsNCgkJfSwNCg0KCQlnZXRXaW4gOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZTsNCg0KCQkJaWYgKCF0LmNvbnRlbnRXaW5kb3cpIHsNCgkJCQllID0gRE9NLmdldCh0LmlkICsgIl9pZnIiKTsNCg0KCQkJCWlmIChlKQ0KCQkJCQl0LmNvbnRlbnRXaW5kb3cgPSBlLmNvbnRlbnRXaW5kb3c7DQoJCQl9DQoNCgkJCXJldHVybiB0LmNvbnRlbnRXaW5kb3c7DQoJCX0sDQoNCgkJZ2V0RG9jIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHc7DQoNCgkJCWlmICghdC5jb250ZW50RG9jdW1lbnQpIHsNCgkJCQl3ID0gdC5nZXRXaW4oKTsNCg0KCQkJCWlmICh3KQ0KCQkJCQl0LmNvbnRlbnREb2N1bWVudCA9IHcuZG9jdW1lbnQ7DQoJCQl9DQoNCgkJCXJldHVybiB0LmNvbnRlbnREb2N1bWVudDsNCgkJfSwNCg0KCQlnZXRCb2R5IDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5ib2R5RWxlbWVudCB8fCB0aGlzLmdldERvYygpLmJvZHk7DQoJCX0sDQoNCgkJY29udmVydFVSTCA6IGZ1bmN0aW9uKHUsIG4sIGUpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3M7DQoNCgkJCS8vIFVzZSBjYWxsYmFjayBpbnN0ZWFkDQoJCQlpZiAocy51cmxjb252ZXJ0ZXJfY2FsbGJhY2spDQoJCQkJcmV0dXJuIHQuZXhlY0NhbGxiYWNrKCd1cmxjb252ZXJ0ZXJfY2FsbGJhY2snLCB1LCBlLCB0cnVlLCBuKTsNCg0KCQkJLy8gRG9uJ3QgY29udmVydCBsaW5rIGhyZWYgc2luY2UgdGhhdHMgdGhlIENTUyBmaWxlcyB0aGF0IGdldHMgbG9hZGVkIGludG8gdGhlIGVkaXRvciBhbHNvIHNraXAgbG9jYWwgZmlsZSBVUkxzDQoJCQlpZiAoIXMuY29udmVydF91cmxzIHx8IChlICYmIGUubm9kZU5hbWUgPT0gJ0xJTksnKSB8fCB1LmluZGV4T2YoJ2ZpbGU6JykgPT09IDApDQoJCQkJcmV0dXJuIHU7DQoNCgkJCS8vIENvbnZlcnQgdG8gcmVsYXRpdmUNCgkJCWlmIChzLnJlbGF0aXZlX3VybHMpDQoJCQkJcmV0dXJuIHQuZG9jdW1lbnRCYXNlVVJJLnRvUmVsYXRpdmUodSk7DQoNCgkJCS8vIENvbnZlcnQgdG8gYWJzb2x1dGUNCgkJCXUgPSB0LmRvY3VtZW50QmFzZVVSSS50b0Fic29sdXRlKHUsIHMucmVtb3ZlX3NjcmlwdF9ob3N0KTsNCg0KCQkJcmV0dXJuIHU7DQoJCX0sDQoNCgkJYWRkVmlzdWFsIDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJZSA9IGUgfHwgdC5nZXRCb2R5KCk7DQoNCgkJCWlmICghaXModC5oYXNWaXN1YWwpKQ0KCQkJCXQuaGFzVmlzdWFsID0gcy52aXN1YWw7DQoNCgkJCWVhY2godC5kb20uc2VsZWN0KCd0YWJsZSxhJywgZSksIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgdjsNCg0KCQkJCXN3aXRjaCAoZS5ub2RlTmFtZSkgew0KCQkJCQljYXNlICdUQUJMRSc6DQoJCQkJCQl2ID0gdC5kb20uZ2V0QXR0cmliKGUsICdib3JkZXInKTsNCg0KCQkJCQkJaWYgKCF2IHx8IHYgPT0gJzAnKSB7DQoJCQkJCQkJaWYgKHQuaGFzVmlzdWFsKQ0KCQkJCQkJCQl0LmRvbS5hZGRDbGFzcyhlLCBzLnZpc3VhbF90YWJsZV9jbGFzcyk7DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCQl0LmRvbS5yZW1vdmVDbGFzcyhlLCBzLnZpc3VhbF90YWJsZV9jbGFzcyk7DQoJCQkJCQl9DQoNCgkJCQkJCXJldHVybjsNCg0KCQkJCQljYXNlICdBJzoNCgkJCQkJCXYgPSB0LmRvbS5nZXRBdHRyaWIoZSwgJ25hbWUnKTsNCg0KCQkJCQkJaWYgKHYpIHsNCgkJCQkJCQlpZiAodC5oYXNWaXN1YWwpDQoJCQkJCQkJCXQuZG9tLmFkZENsYXNzKGUsICdtY2VJdGVtQW5jaG9yJyk7DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCQl0LmRvbS5yZW1vdmVDbGFzcyhlLCAnbWNlSXRlbUFuY2hvcicpOw0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXQub25WaXN1YWxBaWQuZGlzcGF0Y2godCwgZSwgdC5oYXNWaXN1YWwpOw0KCQl9LA0KDQoJCXJlbW92ZSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBlID0gdC5nZXRDb250YWluZXIoKTsNCg0KCQkJdC5yZW1vdmVkID0gMTsgLy8gQ2FuY2VscyBwb3N0IHJlbW92ZSBldmVudCBleGVjdXRpb24NCgkJCXQuaGlkZSgpOw0KDQoJCQl0LmV4ZWNDYWxsYmFjaygncmVtb3ZlX2luc3RhbmNlX2NhbGxiYWNrJywgdCk7DQoJCQl0Lm9uUmVtb3ZlLmRpc3BhdGNoKHQpOw0KDQoJCQkvLyBDbGVhciBhbGwgZXhlY0NvbW1hbmQgbGlzdGVuZXJzIHRoaXMgaXMgcmVxdWlyZWQgdG8gYXZvaWQgZXJyb3JzIGlmIHRoZSBlZGl0b3Igd2FzIHJlbW92ZWQgaW5zaWRlIGFub3RoZXIgY29tbWFuZA0KCQkJdC5vbkV4ZWNDb21tYW5kLmxpc3RlbmVycyA9IFtdOw0KDQoJCQl0aW55bWNlLnJlbW92ZSh0KTsNCgkJCURPTS5yZW1vdmUoZSk7DQoJCX0sDQoNCgkJZGVzdHJveSA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJLy8gT25lIHRpbWUgaXMgZW5vdWdoDQoJCQlpZiAodC5kZXN0cm95ZWQpDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiAoIXMpIHsNCgkJCQl0aW55bWNlLnJlbW92ZVVubG9hZCh0LmRlc3Ryb3kpOw0KCQkJCXRpbnlNQ0Uub25CZWZvcmVVbmxvYWQucmVtb3ZlKHQuX2JlZm9yZVVubG9hZCk7DQoNCgkJCQkvLyBNYW51YWwgZGVzdHJveQ0KCQkJCWlmICh0LnRoZW1lICYmIHQudGhlbWUuZGVzdHJveSkNCgkJCQkJdC50aGVtZS5kZXN0cm95KCk7DQoNCgkJCQkvLyBEZXN0cm95IGNvbnRyb2xzLCBzZWxlY3Rpb24gYW5kIGRvbQ0KCQkJCXQuY29udHJvbE1hbmFnZXIuZGVzdHJveSgpOw0KCQkJCXQuc2VsZWN0aW9uLmRlc3Ryb3koKTsNCgkJCQl0LmRvbS5kZXN0cm95KCk7DQoNCgkJCQkvLyBSZW1vdmUgYWxsIGV2ZW50cw0KDQoJCQkJLy8gRG9uJ3QgY2xlYXIgdGhlIHdpbmRvdyBvciBkb2N1bWVudCBpZiBjb250ZW50IGVkaXRhYmxlDQoJCQkJLy8gaXMgZW5hYmxlZCBzaW5jZSBvdGhlciBpbnN0YW5jZXMgbWlnaHQgc3RpbGwgYmUgcHJlc2VudA0KCQkJCWlmICghdC5zZXR0aW5ncy5jb250ZW50X2VkaXRhYmxlKSB7DQoJCQkJCUV2ZW50LmNsZWFyKHQuZ2V0V2luKCkpOw0KCQkJCQlFdmVudC5jbGVhcih0LmdldERvYygpKTsNCgkJCQl9DQoNCgkJCQlFdmVudC5jbGVhcih0LmdldEJvZHkoKSk7DQoJCQkJRXZlbnQuY2xlYXIodC5mb3JtRWxlbWVudCk7DQoJCQl9DQoNCgkJCWlmICh0LmZvcm1FbGVtZW50KSB7DQoJCQkJdC5mb3JtRWxlbWVudC5zdWJtaXQgPSB0LmZvcm1FbGVtZW50Ll9tY2VPbGRTdWJtaXQ7DQoJCQkJdC5mb3JtRWxlbWVudC5fbWNlT2xkU3VibWl0ID0gbnVsbDsNCgkJCX0NCg0KCQkJdC5jb250ZW50QXJlYUNvbnRhaW5lciA9IHQuZm9ybUVsZW1lbnQgPSB0LmNvbnRhaW5lciA9IHQuc2V0dGluZ3MuY29udGVudF9lbGVtZW50ID0gdC5ib2R5RWxlbWVudCA9IHQuY29udGVudERvY3VtZW50ID0gdC5jb250ZW50V2luZG93ID0gbnVsbDsNCg0KCQkJaWYgKHQuc2VsZWN0aW9uKQ0KCQkJCXQuc2VsZWN0aW9uID0gdC5zZWxlY3Rpb24ud2luID0gdC5zZWxlY3Rpb24uZG9tID0gdC5zZWxlY3Rpb24uZG9tLmRvYyA9IG51bGw7DQoNCgkJCXQuZGVzdHJveWVkID0gMTsNCgkJfSwNCg0KCQkvLyBJbnRlcm5hbCBmdW5jdGlvbnMNCg0KCQlfYWRkRXZlbnRzIDogZnVuY3Rpb24oKSB7DQoJCQkvLyAnZm9jdXMnLCAnYmx1cicsICdkYmxjbGljaycsICdiZWZvcmVkZWFjdGl2YXRlJywgc3VibWl0LCByZXNldA0KCQkJdmFyIHQgPSB0aGlzLCBpLCBzID0gdC5zZXR0aW5ncywgZG9tID0gdC5kb20sIGxvID0gew0KCQkJCW1vdXNldXAgOiAnb25Nb3VzZVVwJywNCgkJCQltb3VzZWRvd24gOiAnb25Nb3VzZURvd24nLA0KCQkJCWNsaWNrIDogJ29uQ2xpY2snLA0KCQkJCWtleXVwIDogJ29uS2V5VXAnLA0KCQkJCWtleWRvd24gOiAnb25LZXlEb3duJywNCgkJCQlrZXlwcmVzcyA6ICdvbktleVByZXNzJywNCgkJCQlzdWJtaXQgOiAnb25TdWJtaXQnLA0KCQkJCXJlc2V0IDogJ29uUmVzZXQnLA0KCQkJCWNvbnRleHRtZW51IDogJ29uQ29udGV4dE1lbnUnLA0KCQkJCWRibGNsaWNrIDogJ29uRGJsQ2xpY2snLA0KCQkJCXBhc3RlIDogJ29uUGFzdGUnIC8vIERvZXNuJ3Qgd29yayBpbiBhbGwgYnJvd3NlcnMgeWV0DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBldmVudEhhbmRsZXIoZSwgbykgew0KCQkJCXZhciB0eSA9IGUudHlwZTsNCg0KCQkJCS8vIERvbid0IGZpcmUgZXZlbnRzIHdoZW4gaXQncyByZW1vdmVkDQoJCQkJaWYgKHQucmVtb3ZlZCkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJLy8gR2VuZXJpYyBldmVudCBoYW5kbGVyDQoJCQkJaWYgKHQub25FdmVudC5kaXNwYXRjaCh0LCBlLCBvKSAhPT0gZmFsc2UpIHsNCgkJCQkJLy8gU3BlY2lmaWMgZXZlbnQgaGFuZGxlcg0KCQkJCQl0W2xvW2UuZmFrZVR5cGUgfHwgZS50eXBlXV0uZGlzcGF0Y2godCwgZSwgbyk7DQoJCQkJfQ0KCQkJfTsNCg0KCQkJLy8gQWRkIERPTSBldmVudHMNCgkJCWVhY2gobG8sIGZ1bmN0aW9uKHYsIGspIHsNCgkJCQlzd2l0Y2ggKGspIHsNCgkJCQkJY2FzZSAnY29udGV4dG1lbnUnOg0KCQkJCQkJaWYgKHRpbnltY2UuaXNPcGVyYSkgew0KCQkJCQkJCS8vIEZha2UgY29udGV4dG1lbnUgb24gT3BlcmENCgkJCQkJCQlkb20uYmluZCh0LmdldEJvZHkoKSwgJ21vdXNlZG93bicsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJCQkJaWYgKGUuY3RybEtleSkgew0KCQkJCQkJCQkJZS5mYWtlVHlwZSA9ICdjb250ZXh0bWVudSc7DQoJCQkJCQkJCQlldmVudEhhbmRsZXIoZSk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9KTsNCgkJCQkJCX0gZWxzZQ0KCQkJCQkJCWRvbS5iaW5kKHQuZ2V0Qm9keSgpLCBrLCBldmVudEhhbmRsZXIpOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAncGFzdGUnOg0KCQkJCQkJZG9tLmJpbmQodC5nZXRCb2R5KCksIGssIGZ1bmN0aW9uKGUpIHsNCgkJCQkJCQlldmVudEhhbmRsZXIoZSk7DQoJCQkJCQl9KTsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ3N1Ym1pdCc6DQoJCQkJCWNhc2UgJ3Jlc2V0JzoNCgkJCQkJCWRvbS5iaW5kKHQuZ2V0RWxlbWVudCgpLmZvcm0gfHwgRE9NLmdldFBhcmVudCh0LmlkLCAnZm9ybScpLCBrLCBldmVudEhhbmRsZXIpOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJZGVmYXVsdDoNCgkJCQkJCWRvbS5iaW5kKHMuY29udGVudF9lZGl0YWJsZSA/IHQuZ2V0Qm9keSgpIDogdC5nZXREb2MoKSwgaywgZXZlbnRIYW5kbGVyKTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJZG9tLmJpbmQocy5jb250ZW50X2VkaXRhYmxlID8gdC5nZXRCb2R5KCkgOiAoaXNHZWNrbyA/IHQuZ2V0RG9jKCkgOiB0LmdldFdpbigpKSwgJ2ZvY3VzJywgZnVuY3Rpb24oZSkgew0KCQkJCXQuZm9jdXModHJ1ZSk7DQoJCQl9KTsNCg0KDQoJCQkvLyBGaXhlcyBidWcgd2hlcmUgYSBzcGVjaWZpZWQgZG9jdW1lbnRfYmFzZV91cmkgY291bGQgcmVzdWx0IGluIGJyb2tlbiBpbWFnZXMNCgkJCS8vIFRoaXMgd2lsbCBhbHNvIGZpeCBkcmFnIGRyb3Agb2YgaW1hZ2VzIGluIEdlY2tvDQoJCQlpZiAodGlueW1jZS5pc0dlY2tvKSB7DQoJCQkJZG9tLmJpbmQodC5nZXREb2MoKSwgJ0RPTU5vZGVJbnNlcnRlZCcsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJdmFyIHY7DQoNCgkJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJCWlmIChlLm5vZGVUeXBlID09PSAxICYmIGUubm9kZU5hbWUgPT09ICdJTUcnICYmICh2ID0gZS5nZXRBdHRyaWJ1dGUoJ19tY2Vfc3JjJykpKQ0KCQkJCQkJZS5zcmMgPSB0LmRvY3VtZW50QmFzZVVSSS50b0Fic29sdXRlKHYpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBTZXQgdmFyaW91cyBtaWRhcyBvcHRpb25zIGluIEdlY2tvDQoJCQlpZiAoaXNHZWNrbykgew0KCQkJCWZ1bmN0aW9uIHNldE9wdHMoKSB7DQoJCQkJCXZhciB0ID0gdGhpcywgZCA9IHQuZ2V0RG9jKCksIHMgPSB0LnNldHRpbmdzOw0KDQoJCQkJCWlmIChpc0dlY2tvICYmICFzLnJlYWRvbmx5KSB7DQoJCQkJCQlpZiAodC5faXNIaWRkZW4oKSkgew0KCQkJCQkJCXRyeSB7DQoJCQkJCQkJCWlmICghcy5jb250ZW50X2VkaXRhYmxlKQ0KCQkJCQkJCQkJZC5kZXNpZ25Nb2RlID0gJ09uJzsNCgkJCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJCQkvLyBGYWlscyBpZiBpdCdzIGhpZGRlbg0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJdHJ5IHsNCgkJCQkJCQkvLyBUcnkgbmV3IEdlY2tvIG1ldGhvZA0KCQkJCQkJCWQuZXhlY0NvbW1hbmQoInN0eWxlV2l0aENTUyIsIDAsIGZhbHNlKTsNCgkJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkJLy8gVXNlIG9sZCBtZXRob2QNCgkJCQkJCQlpZiAoIXQuX2lzSGlkZGVuKCkpDQoJCQkJCQkJCXRyeSB7ZC5leGVjQ29tbWFuZCgidXNlQ1NTIiwgMCwgdHJ1ZSk7fSBjYXRjaCAoZXgpIHt9DQoJCQkJCQl9DQoNCgkJCQkJCWlmICghcy50YWJsZV9pbmxpbmVfZWRpdGluZykNCgkJCQkJCQl0cnkge2QuZXhlY0NvbW1hbmQoJ2VuYWJsZUlubGluZVRhYmxlRWRpdGluZycsIGZhbHNlLCBmYWxzZSk7fSBjYXRjaCAoZXgpIHt9DQoNCgkJCQkJCWlmICghcy5vYmplY3RfcmVzaXppbmcpDQoJCQkJCQkJdHJ5IHtkLmV4ZWNDb21tYW5kKCdlbmFibGVPYmplY3RSZXNpemluZycsIGZhbHNlLCBmYWxzZSk7fSBjYXRjaCAoZXgpIHt9DQoJCQkJCX0NCgkJCQl9Ow0KDQoJCQkJdC5vbkJlZm9yZUV4ZWNDb21tYW5kLmFkZChzZXRPcHRzKTsNCgkJCQl0Lm9uTW91c2VEb3duLmFkZChzZXRPcHRzKTsNCgkJCX0NCg0KCQkJLy8gV29ya2Fyb3VuZCBmb3IgYnVnLCBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjI1MA0KCQkJLy8gV2ViS2l0IGNhbid0IGV2ZW4gZG8gc2ltcGxlIHRoaW5ncyBsaWtlIHNlbGVjdGluZyBhbiBpbWFnZQ0KCQkJLy8gVGhpcyBhbHNvIGZpeGVzIHNvIGl0J3MgcG9zc2libGUgdG8gc2VsZWN0IG1jZUl0ZW1BbmNob3JzDQoJCQlpZiAodGlueW1jZS5pc1dlYktpdCkgew0KCQkJCXQub25DbGljay5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJCS8vIE5lZWRzIHRvYmUgdGhlIHNldEJhc2VBbmRFeHRlbmQgb3IgaXQgd2lsbCBmYWlsIHRvIHNlbGVjdCBmbG9hdGVkIGltYWdlcw0KCQkJCQlpZiAoZS5ub2RlTmFtZSA9PSAnSU1HJyB8fCAoZS5ub2RlTmFtZSA9PSAnQScgJiYgZG9tLmhhc0NsYXNzKGUsICdtY2VJdGVtQW5jaG9yJykpKSB7DQoJCQkJCQl0LnNlbGVjdGlvbi5nZXRTZWwoKS5zZXRCYXNlQW5kRXh0ZW50KGUsIDAsIGUsIDEpOw0KCQkJCQkJdC5ub2RlQ2hhbmdlZCgpOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9DQoNCgkJCS8vIEFkZCBub2RlIGNoYW5nZSBoYW5kbGVycw0KCQkJdC5vbk1vdXNlVXAuYWRkKHQubm9kZUNoYW5nZWQpOw0KCQkJLy90Lm9uQ2xpY2suYWRkKHQubm9kZUNoYW5nZWQpOw0KCQkJdC5vbktleVVwLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCXZhciBjID0gZS5rZXlDb2RlOw0KDQoJCQkJaWYgKChjID49IDMzICYmIGMgPD0gMzYpIHx8IChjID49IDM3ICYmIGMgPD0gNDApIHx8IGMgPT0gMTMgfHwgYyA9PSA0NSB8fCBjID09IDQ2IHx8IGMgPT0gOCB8fCAodGlueW1jZS5pc01hYyAmJiAoYyA9PSA5MSB8fCBjID09IDkzKSkgfHwgZS5jdHJsS2V5KQ0KCQkJCQl0Lm5vZGVDaGFuZ2VkKCk7DQoJCQl9KTsNCg0KCQkJLy8gQWRkIHJlc2V0IGhhbmRsZXINCgkJCXQub25SZXNldC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJdC5zZXRDb250ZW50KHQuc3RhcnRDb250ZW50LCB7Zm9ybWF0IDogJ3Jhdyd9KTsNCgkJCX0pOw0KDQoJCQkvLyBBZGQgc2hvcnRjdXRzDQoJCQlpZiAocy5jdXN0b21fc2hvcnRjdXRzKSB7DQoJCQkJaWYgKHMuY3VzdG9tX3VuZG9fcmVkb19rZXlib2FyZF9zaG9ydGN1dHMpIHsNCgkJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCt6JywgdC5nZXRMYW5nKCd1bmRvX2Rlc2MnKSwgJ1VuZG8nKTsNCgkJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCt5JywgdC5nZXRMYW5nKCdyZWRvX2Rlc2MnKSwgJ1JlZG8nKTsNCgkJCQl9DQoNCgkJCQkvLyBBZGQgZGVmYXVsdCBzaG9ydGN1dHMgZm9yIGdlY2tvDQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCtiJywgdC5nZXRMYW5nKCdib2xkX2Rlc2MnKSwgJ0JvbGQnKTsNCgkJCQl0LmFkZFNob3J0Y3V0KCdjdHJsK2knLCB0LmdldExhbmcoJ2l0YWxpY19kZXNjJyksICdJdGFsaWMnKTsNCgkJCQl0LmFkZFNob3J0Y3V0KCdjdHJsK3UnLCB0LmdldExhbmcoJ3VuZGVybGluZV9kZXNjJyksICdVbmRlcmxpbmUnKTsNCg0KCQkJCS8vIEJsb2NrRm9ybWF0IHNob3J0Y3V0cyBrZXlzDQoJCQkJZm9yIChpPTE7IGk8PTY7IGkrKykNCgkJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCsnICsgaSwgJycsIFsnRm9ybWF0QmxvY2snLCBmYWxzZSwgJ2gnICsgaV0pOw0KDQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCs3JywgJycsIFsnRm9ybWF0QmxvY2snLCBmYWxzZSwgJzxwPiddKTsNCgkJCQl0LmFkZFNob3J0Y3V0KCdjdHJsKzgnLCAnJywgWydGb3JtYXRCbG9jaycsIGZhbHNlLCAnPGRpdj4nXSk7DQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCs5JywgJycsIFsnRm9ybWF0QmxvY2snLCBmYWxzZSwgJzxhZGRyZXNzPiddKTsNCg0KCQkJCWZ1bmN0aW9uIGZpbmQoZSkgew0KCQkJCQl2YXIgdiA9IG51bGw7DQoNCgkJCQkJaWYgKCFlLmFsdEtleSAmJiAhZS5jdHJsS2V5ICYmICFlLm1ldGFLZXkpDQoJCQkJCQlyZXR1cm4gdjsNCg0KCQkJCQllYWNoKHQuc2hvcnRjdXRzLCBmdW5jdGlvbihvKSB7DQoJCQkJCQlpZiAodGlueW1jZS5pc01hYyAmJiBvLmN0cmwgIT0gZS5tZXRhS2V5KQ0KCQkJCQkJCXJldHVybjsNCgkJCQkJCWVsc2UgaWYgKCF0aW55bWNlLmlzTWFjICYmIG8uY3RybCAhPSBlLmN0cmxLZXkpDQoJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQlpZiAoby5hbHQgIT0gZS5hbHRLZXkpDQoJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQlpZiAoby5zaGlmdCAhPSBlLnNoaWZ0S2V5KQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJaWYgKGUua2V5Q29kZSA9PSBvLmtleUNvZGUgfHwgKGUuY2hhckNvZGUgJiYgZS5jaGFyQ29kZSA9PSBvLmNoYXJDb2RlKSkgew0KCQkJCQkJCXYgPSBvOw0KCQkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJCX0NCgkJCQkJfSk7DQoNCgkJCQkJcmV0dXJuIHY7DQoJCQkJfTsNCg0KCQkJCXQub25LZXlVcC5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJdmFyIG8gPSBmaW5kKGUpOw0KDQoJCQkJCWlmIChvKQ0KCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQl9KTsNCg0KCQkJCXQub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJdmFyIG8gPSBmaW5kKGUpOw0KDQoJCQkJCWlmIChvKQ0KCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQl9KTsNCg0KCQkJCXQub25LZXlEb3duLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQl2YXIgbyA9IGZpbmQoZSk7DQoNCgkJCQkJaWYgKG8pIHsNCgkJCQkJCW8uZnVuYy5jYWxsKG8uc2NvcGUpOw0KCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAodGlueW1jZS5pc0lFKSB7DQoJCQkJLy8gRml4IHNvIHJlc2l6ZSB3aWxsIG9ubHkgdXBkYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGF0dHJpYnV0ZXMgbm90IHRoZSBzdHlsZXMgb2YgYW4gaW1hZ2UNCgkJCQkvLyBJdCB3aWxsIGFsc28gYmxvY2sgbWNlSXRlbU5vUmVzaXplIGl0ZW1zDQoJCQkJZG9tLmJpbmQodC5nZXREb2MoKSwgJ2NvbnRyb2xzZWxlY3QnLCBmdW5jdGlvbihlKSB7DQoJCQkJCXZhciByZSA9IHQucmVzaXplSW5mbywgY2I7DQoNCgkJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJCS8vIERvbid0IGRvIHRoaXMgYWN0aW9uIGZvciBub24gaW1hZ2UgZWxlbWVudHMNCgkJCQkJaWYgKGUubm9kZU5hbWUgIT09ICdJTUcnKQ0KCQkJCQkJcmV0dXJuOw0KDQoJCQkJCWlmIChyZSkNCgkJCQkJCWRvbS51bmJpbmQocmUubm9kZSwgcmUuZXYsIHJlLmNiKTsNCg0KCQkJCQlpZiAoIWRvbS5oYXNDbGFzcyhlLCAnbWNlSXRlbU5vUmVzaXplJykpIHsNCgkJCQkJCWV2ID0gJ3Jlc2l6ZWVuZCc7DQoJCQkJCQljYiA9IGRvbS5iaW5kKGUsIGV2LCBmdW5jdGlvbihlKSB7DQoJCQkJCQkJdmFyIHY7DQoNCgkJCQkJCQllID0gZS50YXJnZXQ7DQoNCgkJCQkJCQlpZiAodiA9IGRvbS5nZXRTdHlsZShlLCAnd2lkdGgnKSkgew0KCQkJCQkJCQlkb20uc2V0QXR0cmliKGUsICd3aWR0aCcsIHYucmVwbGFjZSgvW14wLTklXSsvZywgJycpKTsNCgkJCQkJCQkJZG9tLnNldFN0eWxlKGUsICd3aWR0aCcsICcnKTsNCgkJCQkJCQl9DQoNCgkJCQkJCQlpZiAodiA9IGRvbS5nZXRTdHlsZShlLCAnaGVpZ2h0JykpIHsNCgkJCQkJCQkJZG9tLnNldEF0dHJpYihlLCAnaGVpZ2h0Jywgdi5yZXBsYWNlKC9bXjAtOSVdKy9nLCAnJykpOw0KCQkJCQkJCQlkb20uc2V0U3R5bGUoZSwgJ2hlaWdodCcsICcnKTsNCgkJCQkJCQl9DQoJCQkJCQl9KTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWV2ID0gJ3Jlc2l6ZXN0YXJ0JzsNCgkJCQkJCWNiID0gZG9tLmJpbmQoZSwgJ3Jlc2l6ZXN0YXJ0JywgRXZlbnQuY2FuY2VsLCBFdmVudCk7DQoJCQkJCX0NCg0KCQkJCQlyZSA9IHQucmVzaXplSW5mbyA9IHsNCgkJCQkJCW5vZGUgOiBlLA0KCQkJCQkJZXYgOiBldiwNCgkJCQkJCWNiIDogY2INCgkJCQkJfTsNCgkJCQl9KTsNCg0KCQkJCXQub25LZXlEb3duLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQlzd2l0Y2ggKGUua2V5Q29kZSkgew0KCQkJCQkJY2FzZSA4Og0KCQkJCQkJCS8vIEZpeCBJRSBjb250cm9sICsgYmFja3NwYWNlIGJyb3dzZXIgYnVnDQoJCQkJCQkJaWYgKHQuc2VsZWN0aW9uLmdldFJuZygpLml0ZW0pIHsNCgkJCQkJCQkJZWQuZG9tLnJlbW92ZSh0LnNlbGVjdGlvbi5nZXRSbmcoKS5pdGVtKDApKTsNCgkJCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQkJCQl9DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCS8qaWYgKHQuZG9tLmJveE1vZGVsKSB7DQoJCQkJCXQuZ2V0Qm9keSgpLnN0eWxlLmhlaWdodCA9ICcxMDAlJzsNCg0KCQkJCQlFdmVudC5hZGQodC5nZXRXaW4oKSwgJ3Jlc2l6ZScsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJCXZhciBkb2NFbG0gPSB0LmdldERvYygpLmRvY3VtZW50RWxlbWVudDsNCg0KCQkJCQkJZG9jRWxtLnN0eWxlLmhlaWdodCA9IChkb2NFbG0ub2Zmc2V0SGVpZ2h0IC0gMTApICsgJ3B4JzsNCgkJCQkJfSk7DQoJCQkJfSovDQoJCQl9DQoNCgkJCWlmICh0aW55bWNlLmlzT3BlcmEpIHsNCgkJCQl0Lm9uQ2xpY2suYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCUV2ZW50LnByZXZlbnQoZSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCS8vIEFkZCBjdXN0b20gdW5kby9yZWRvIGhhbmRsZXJzDQoJCQlpZiAocy5jdXN0b21fdW5kb19yZWRvKSB7DQoJCQkJZnVuY3Rpb24gYWRkVW5kbygpIHsNCgkJCQkJdC51bmRvTWFuYWdlci50eXBpbmcgPSAwOw0KCQkJCQl0LnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJCX07DQoNCgkJCQlkb20uYmluZCh0LmdldERvYygpLCAnZm9jdXNvdXQnLCBmdW5jdGlvbihlKSB7DQoJCQkJCWlmICghdC5yZW1vdmVkICYmIHQudW5kb01hbmFnZXIudHlwaW5nKQ0KCQkJCQkJYWRkVW5kbygpOw0KCQkJCX0pOw0KDQoJCQkJdC5vbktleVVwLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQlpZiAoKGUua2V5Q29kZSA+PSAzMyAmJiBlLmtleUNvZGUgPD0gMzYpIHx8IChlLmtleUNvZGUgPj0gMzcgJiYgZS5rZXlDb2RlIDw9IDQwKSB8fCBlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDQ1IHx8IGUuY3RybEtleSkNCgkJCQkJCWFkZFVuZG8oKTsNCgkJCQl9KTsNCg0KCQkJCXQub25LZXlEb3duLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQl2YXIgcm5nLCBwYXJlbnQsIGJvb2ttYXJrOw0KDQoJCQkJCS8vIElFIGhhcyBhIHJlYWxseSBvZGQgYnVnIHdoZXJlIHRoZSBET00gbWlnaHQgaW5jbHVkZSBhbiBub2RlIHRoYXQgZG9lc24ndCBoYXZlDQoJCQkJCS8vIGEgcHJvcGVyIHN0cnVjdHVyZS4gSWYgeW91IHRyeSB0byBhY2Nlc3Mgbm9kZVZhbHVlIGl0IHdvdWxkIHRocm93IGFuIGlsbGVnYWwgdmFsdWUgZXhjZXB0aW9uLg0KCQkJCQkvLyBUaGlzIHNlZW1zIHRvIG9ubHkgaGFwcGVuIHdoZW4geW91IGRlbGV0ZSBjb250ZW50cyBhbmQgaXQgc2VlbXMgdG8gYmUgYXZvaWRhYmxlIGlmIHlvdSByZWZyZXNoIHRoZSBlbGVtZW50DQoJCQkJCS8vIGFmdGVyIHlvdSBkZWxldGUgY29udGVudHMgZnJvbSBpdC4gU2VlOiAjMzAwODkyMw0KCQkJCQlpZiAoaXNJRSAmJiBlLmtleUNvZGUgPT0gNDYpIHsNCgkJCQkJCXJuZyA9IHQuc2VsZWN0aW9uLmdldFJuZygpOw0KDQoJCQkJCQlpZiAocm5nLnBhcmVudEVsZW1lbnQpIHsNCgkJCQkJCQlwYXJlbnQgPSBybmcucGFyZW50RWxlbWVudCgpOw0KDQoJCQkJCQkJLy8gU2VsZWN0IG5leHQgd29yZCB3aGVuIGN0cmwga2V5IGlzIHVzZWQgaW4gY29tYm8gd2l0aCBkZWxldGUNCgkJCQkJCQlpZiAoZS5jdHJsS2V5KSB7DQoJCQkJCQkJCXJuZy5tb3ZlRW5kKCd3b3JkJywgMSk7DQoJCQkJCQkJCXJuZy5zZWxlY3QoKTsNCgkJCQkJCQl9DQoNCgkJCQkJCQkvLyBEZWxldGUgY29udGVudHMNCgkJCQkJCQl0LnNlbGVjdGlvbi5nZXRTZWwoKS5jbGVhcigpOw0KDQoJCQkJCQkJLy8gQ2hlY2sgaWYgd2UgYXJlIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQNCgkJCQkJCQlpZiAocm5nLnBhcmVudEVsZW1lbnQoKSA9PSBwYXJlbnQpIHsNCgkJCQkJCQkJYm9va21hcmsgPSB0LnNlbGVjdGlvbi5nZXRCb29rbWFyaygpOw0KDQoJCQkJCQkJCXRyeSB7DQoJCQkJCQkJCQkvLyBVcGRhdGUgdGhlIEhUTUwgYW5kIGhvcGVmdWxseSBpdCB3aWxsIHJlbW92ZSB0aGUgYXJ0aWZhY3RzDQoJCQkJCQkJCQlwYXJlbnQuaW5uZXJIVE1MID0gcGFyZW50LmlubmVySFRNTDsNCgkJCQkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCQkJCS8vIEFuZCBzaW5jZSBpdCdzIElFIGl0IGNhbiBzb21ldGltZXMgcHJvZHVjZSBhbiB1bmtub3duIHJ1bnRpbWUgZXJyb3INCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCS8vIFJlc3RvcmUgdGhlIGNhcmV0IHBvc2l0aW9uDQoJCQkJCQkJCXQuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsNCgkJCQkJCQl9DQoNCgkJCQkJCQkvLyBCbG9jayB0aGUgZGVmYXVsdCBkZWxldGUgYmVoYXZpb3Igc2luY2UgaXQgbWlnaHQgYmUgYnJva2VuDQoJCQkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOw0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIElzIGNhcmFjdGVyIHBvc2l0b24ga2V5cw0KCQkJCQlpZiAoKGUua2V5Q29kZSA+PSAzMyAmJiBlLmtleUNvZGUgPD0gMzYpIHx8IChlLmtleUNvZGUgPj0gMzcgJiYgZS5rZXlDb2RlIDw9IDQwKSB8fCBlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDQ1KSB7DQoJCQkJCQlpZiAodC51bmRvTWFuYWdlci50eXBpbmcpDQoJCQkJCQkJYWRkVW5kbygpOw0KDQoJCQkJCQlyZXR1cm47DQoJCQkJCX0NCg0KCQkJCQlpZiAoIXQudW5kb01hbmFnZXIudHlwaW5nKSB7DQoJCQkJCQl0LnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJCQkJdC51bmRvTWFuYWdlci50eXBpbmcgPSAxOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQl0Lm9uTW91c2VEb3duLmFkZChmdW5jdGlvbigpIHsNCgkJCQkJaWYgKHQudW5kb01hbmFnZXIudHlwaW5nKQ0KCQkJCQkJYWRkVW5kbygpOw0KCQkJCX0pOw0KCQkJfQ0KCQl9LA0KDQoJCV9pc0hpZGRlbiA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHM7DQoNCgkJCWlmICghaXNHZWNrbykNCgkJCQlyZXR1cm4gMDsNCg0KCQkJLy8gV2VpcmQsIHdoZXJlcyB0aGF0IGN1cnNvciBzZWxlY3Rpb24/DQoJCQlzID0gdGhpcy5zZWxlY3Rpb24uZ2V0U2VsKCk7DQoJCQlyZXR1cm4gKCFzIHx8ICFzLnJhbmdlQ291bnQgfHwgcy5yYW5nZUNvdW50ID09IDApOw0KCQl9LA0KDQoJCS8vIEZpeCBmb3IgYnVnICMxODY3MjkyDQoJCV9maXhOZXN0aW5nIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIGQgPSBbXSwgaTsNCg0KCQkJcyA9IHMucmVwbGFjZSgvPChcLyk/KFteXHM+XSspW14+XSo/Pi9nLCBmdW5jdGlvbihhLCBiLCBjKSB7DQoJCQkJdmFyIGU7DQoNCgkJCQkvLyBIYW5kbGUgZW5kIGVsZW1lbnQNCgkJCQlpZiAoYiA9PT0gJy8nKSB7DQoJCQkJCWlmICghZC5sZW5ndGgpDQoJCQkJCQlyZXR1cm4gJyc7DQoNCgkJCQkJaWYgKGMgIT09IGRbZC5sZW5ndGggLSAxXS50YWcpIHsNCgkJCQkJCWZvciAoaT1kLmxlbmd0aCAtIDE7IGk+PTA7IGktLSkgew0KCQkJCQkJCWlmIChkW2ldLnRhZyA9PT0gYykgew0KCQkJCQkJCQlkW2ldLmNsb3NlID0gMTsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm4gJyc7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlkLnBvcCgpOw0KDQoJCQkJCQlpZiAoZC5sZW5ndGggJiYgZFtkLmxlbmd0aCAtIDFdLmNsb3NlKSB7DQoJCQkJCQkJYSA9IGEgKyAnPC8nICsgZFtkLmxlbmd0aCAtIDFdLnRhZyArICc+JzsNCgkJCQkJCQlkLnBvcCgpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gSWdub3JlIHRoZXNlDQoJCQkJCWlmICgvXihicnxocnxpbnB1dHxtZXRhfGltZ3xsaW5rfHBhcmFtKSQvaS50ZXN0KGMpKQ0KCQkJCQkJcmV0dXJuIGE7DQoNCgkJCQkJLy8gSWdub3JlIGNsb3NlZCBvbmVzDQoJCQkJCWlmICgvXC8+JC8udGVzdChhKSkNCgkJCQkJCXJldHVybiBhOw0KDQoJCQkJCWQucHVzaCh7dGFnIDogY30pOyAvLyBQdXNoIHN0YXJ0IGVsZW1lbnQNCgkJCQl9DQoNCgkJCQlyZXR1cm4gYTsNCgkJCX0pOw0KDQoJCQkvLyBFbmQgYWxsIG9wZW4gdGFncw0KCQkJZm9yIChpPWQubGVuZ3RoIC0gMTsgaT49MDsgaS0tKQ0KCQkJCXMgKz0gJzwvJyArIGRbaV0udGFnICsgJz4nOw0KDQoJCQlyZXR1cm4gczsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gQWRkZWQgZm9yIGNvbXByZXNzaW9uIHB1cnBvc2VzDQoJdmFyIGVhY2ggPSB0aW55bWNlLmVhY2gsIHVuZGVmaW5lZCwgVFJVRSA9IHRydWUsIEZBTFNFID0gZmFsc2U7DQoNCgl0aW55bWNlLkVkaXRvckNvbW1hbmRzID0gZnVuY3Rpb24oZWRpdG9yKSB7DQoJCXZhciBkb20gPSBlZGl0b3IuZG9tLA0KCQkJc2VsZWN0aW9uID0gZWRpdG9yLnNlbGVjdGlvbiwNCgkJCWNvbW1hbmRzID0ge3N0YXRlOiB7fSwgZXhlYyA6IHt9LCB2YWx1ZSA6IHt9fSwNCgkJCXNldHRpbmdzID0gZWRpdG9yLnNldHRpbmdzLA0KCQkJYm9va21hcms7DQoNCgkJZnVuY3Rpb24gZXhlY0NvbW1hbmQoY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQl2YXIgZnVuYzsNCg0KCQkJY29tbWFuZCA9IGNvbW1hbmQudG9Mb3dlckNhc2UoKTsNCgkJCWlmIChmdW5jID0gY29tbWFuZHMuZXhlY1tjb21tYW5kXSkgew0KCQkJCWZ1bmMoY29tbWFuZCwgdWksIHZhbHVlKTsNCgkJCQlyZXR1cm4gVFJVRTsNCgkJCX0NCg0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHF1ZXJ5Q29tbWFuZFN0YXRlKGNvbW1hbmQpIHsNCgkJCXZhciBmdW5jOw0KDQoJCQljb21tYW5kID0gY29tbWFuZC50b0xvd2VyQ2FzZSgpOw0KCQkJaWYgKGZ1bmMgPSBjb21tYW5kcy5zdGF0ZVtjb21tYW5kXSkNCgkJCQlyZXR1cm4gZnVuYyhjb21tYW5kKTsNCg0KCQkJcmV0dXJuIC0xOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHF1ZXJ5Q29tbWFuZFZhbHVlKGNvbW1hbmQpIHsNCgkJCXZhciBmdW5jOw0KDQoJCQljb21tYW5kID0gY29tbWFuZC50b0xvd2VyQ2FzZSgpOw0KCQkJaWYgKGZ1bmMgPSBjb21tYW5kcy52YWx1ZVtjb21tYW5kXSkNCgkJCQlyZXR1cm4gZnVuYyhjb21tYW5kKTsNCg0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGFkZENvbW1hbmRzKGNvbW1hbmRfbGlzdCwgdHlwZSkgew0KCQkJdHlwZSA9IHR5cGUgfHwgJ2V4ZWMnOw0KDQoJCQllYWNoKGNvbW1hbmRfbGlzdCwgZnVuY3Rpb24oY2FsbGJhY2ssIGNvbW1hbmQpIHsNCgkJCQllYWNoKGNvbW1hbmQudG9Mb3dlckNhc2UoKS5zcGxpdCgnLCcpLCBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJCWNvbW1hbmRzW3R5cGVdW2NvbW1hbmRdID0gY2FsbGJhY2s7DQoJCQkJfSk7DQoJCQl9KTsNCgkJfTsNCg0KCQkvLyBFeHBvc2UgcHVibGljIG1ldGhvZHMNCgkJdGlueW1jZS5leHRlbmQodGhpcywgew0KCQkJZXhlY0NvbW1hbmQgOiBleGVjQ29tbWFuZCwNCgkJCXF1ZXJ5Q29tbWFuZFN0YXRlIDogcXVlcnlDb21tYW5kU3RhdGUsDQoJCQlxdWVyeUNvbW1hbmRWYWx1ZSA6IHF1ZXJ5Q29tbWFuZFZhbHVlLA0KCQkJYWRkQ29tbWFuZHMgOiBhZGRDb21tYW5kcw0KCQl9KTsNCg0KCQkvLyBQcml2YXRlIG1ldGhvZHMNCg0KCQlmdW5jdGlvbiBleGVjTmF0aXZlQ29tbWFuZChjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCWlmICh1aSA9PT0gdW5kZWZpbmVkKQ0KCQkJCXVpID0gRkFMU0U7DQoNCgkJCWlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKQ0KCQkJCXZhbHVlID0gbnVsbDsNCg0KCQkJcmV0dXJuIGVkaXRvci5nZXREb2MoKS5leGVjQ29tbWFuZChjb21tYW5kLCB1aSwgdmFsdWUpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGlzRm9ybWF0TWF0Y2gobmFtZSkgew0KCQkJcmV0dXJuIGVkaXRvci5mb3JtYXR0ZXIubWF0Y2gobmFtZSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gdG9nZ2xlRm9ybWF0KG5hbWUsIHZhbHVlKSB7DQoJCQllZGl0b3IuZm9ybWF0dGVyLnRvZ2dsZShuYW1lLCB2YWx1ZSA/IHt2YWx1ZSA6IHZhbHVlfSA6IHVuZGVmaW5lZCk7DQoJCX07DQoNCgkJZnVuY3Rpb24gc3RvcmVTZWxlY3Rpb24odHlwZSkgew0KCQkJYm9va21hcmsgPSBzZWxlY3Rpb24uZ2V0Qm9va21hcmsodHlwZSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gcmVzdG9yZVNlbGVjdGlvbigpIHsNCgkJCXNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhib29rbWFyayk7DQoJCX07DQoNCgkJLy8gQWRkIGV4ZWNDb21tYW5kIG92ZXJyaWRlcw0KCQlhZGRDb21tYW5kcyh7DQoJCQkvLyBJZ25vcmUgdGhlc2UsIGFkZGVkIGZvciBjb21wYXRpYmlsaXR5DQoJCQknbWNlUmVzZXREZXNpZ25Nb2RlLG1jZUJlZ2luVW5kb0xldmVsJyA6IGZ1bmN0aW9uKCkge30sDQoNCgkJCS8vIEFkZCB1bmRvIG1hbmFnZXIgbG9naWMNCgkJCSdtY2VFbmRVbmRvTGV2ZWwsbWNlQWRkVW5kb0xldmVsJyA6IGZ1bmN0aW9uKCkgew0KCQkJCWVkaXRvci51bmRvTWFuYWdlci5hZGQoKTsNCgkJCX0sDQoNCgkJCSdDdXQsQ29weSxQYXN0ZScgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJdmFyIGRvYyA9IGVkaXRvci5nZXREb2MoKSwgZmFpbGVkOw0KDQoJCQkJLy8gVHJ5IGV4ZWN1dGluZyB0aGUgbmF0aXZlIGNvbW1hbmQNCgkJCQl0cnkgew0KCQkJCQlleGVjTmF0aXZlQ29tbWFuZChjb21tYW5kKTsNCgkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkvLyBDb21tYW5kIGZhaWxlZA0KCQkJCQlmYWlsZWQgPSBUUlVFOw0KCQkJCX0NCg0KCQkJCS8vIFByZXNlbnQgYWxlcnQgbWVzc2FnZSBhYm91dCBjbGlwYm9hcmQgYWNjZXNzIG5vdCBiZWluZyBhdmFpbGFibGUNCgkJCQlpZiAoZmFpbGVkIHx8ICFkb2MucXVlcnlDb21tYW5kU3VwcG9ydGVkKGNvbW1hbmQpKSB7DQoJCQkJCWlmICh0aW55bWNlLmlzR2Vja28pIHsNCgkJCQkJCWVkaXRvci53aW5kb3dNYW5hZ2VyLmNvbmZpcm0oZWRpdG9yLmdldExhbmcoJ2NsaXBib2FyZF9tc2cnKSwgZnVuY3Rpb24oc3RhdGUpIHsNCgkJCQkJCQlpZiAoc3RhdGUpDQoJCQkJCQkJCW9wZW4oJ2h0dHA6Ly93d3cubW96aWxsYS5vcmcvZWRpdG9yL21pZGFzZGVtby9zZWN1cml0eXByZWZzLmh0bWwnLCAnX2JsYW5rJyk7DQoJCQkJCQl9KTsNCgkJCQkJfSBlbHNlDQoJCQkJCQllZGl0b3Iud2luZG93TWFuYWdlci5hbGVydChlZGl0b3IuZ2V0TGFuZygnY2xpcGJvYXJkX25vX3N1cHBvcnQnKSk7DQoJCQkJfQ0KCQkJfSwNCg0KCQkJLy8gT3ZlcnJpZGUgdW5saW5rIGNvbW1hbmQNCgkJCXVubGluayA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQlpZiAoc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkpDQoJCQkJCXNlbGVjdGlvbi5zZWxlY3Qoc2VsZWN0aW9uLmdldE5vZGUoKSk7DQoNCgkJCQlleGVjTmF0aXZlQ29tbWFuZChjb21tYW5kKTsNCgkJCQlzZWxlY3Rpb24uY29sbGFwc2UoRkFMU0UpOw0KCQkJfSwNCg0KCQkJLy8gT3ZlcnJpZGUganVzdGlmeSBjb21tYW5kcyB0byB1c2UgdGhlIHRleHQgZm9ybWF0dGVyIGVuZ2luZQ0KCQkJJ0p1c3RpZnlMZWZ0LEp1c3RpZnlDZW50ZXIsSnVzdGlmeVJpZ2h0LEp1c3RpZnlGdWxsJyA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQl2YXIgYWxpZ24gPSBjb21tYW5kLnN1YnN0cmluZyg3KTsNCg0KCQkJCS8vIFJlbW92ZSBhbGwgb3RoZXIgYWxpZ25tZW50cyBmaXJzdA0KCQkJCWVhY2goJ2xlZnQsY2VudGVyLHJpZ2h0LGZ1bGwnLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHsNCgkJCQkJaWYgKGFsaWduICE9IG5hbWUpDQoJCQkJCQllZGl0b3IuZm9ybWF0dGVyLnJlbW92ZSgnYWxpZ24nICsgbmFtZSk7DQoJCQkJfSk7DQoNCgkJCQl0b2dnbGVGb3JtYXQoJ2FsaWduJyArIGFsaWduKTsNCgkJCX0sDQoNCgkJCS8vIE92ZXJyaWRlIGxpc3QgY29tbWFuZHMgdG8gZml4IFdlYktpdCBidWcNCgkJCSdJbnNlcnRVbm9yZGVyZWRMaXN0LEluc2VydE9yZGVyZWRMaXN0JyA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQl2YXIgbGlzdEVsbSwgbGlzdFBhcmVudDsNCg0KCQkJCWV4ZWNOYXRpdmVDb21tYW5kKGNvbW1hbmQpOw0KDQoJCQkJLy8gV2ViS2l0IHByb2R1Y2VzIGxpc3RzIHdpdGhpbiBibG9jayBlbGVtZW50cyBzbyB3ZSBuZWVkIHRvIHNwbGl0IHRoZW0NCgkJCQkvLyB3ZSB3aWxsIHJlcGxhY2UgdGhlIG5hdGl2ZSBsaXN0IGNyZWF0aW9uIGxvZ2ljIHRvIGN1c3RvbSBsb2dpYyBsYXRlciBvbg0KCQkJCS8vIFRPRE86IFJlbW92ZSB0aGlzIHdoZW4gdGhlIGxpc3QgY3JlYXRpb24gbG9naWMgaXMgcmVtb3ZlZA0KCQkJCWxpc3RFbG0gPSBkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXROb2RlKCksICdvbCx1bCcpOw0KCQkJCWlmIChsaXN0RWxtKSB7DQoJCQkJCWxpc3RQYXJlbnQgPSBsaXN0RWxtLnBhcmVudE5vZGU7DQoNCgkJCQkJLy8gSWYgbGlzdCBpcyB3aXRoaW4gYSB0ZXh0IGJsb2NrIHRoZW4gc3BsaXQgdGhhdCBibG9jaw0KCQkJCQlpZiAoL14oSFsxLTZdfFB8QUREUkVTU3xQUkUpJC8udGVzdChsaXN0UGFyZW50Lm5vZGVOYW1lKSkgew0KCQkJCQkJc3RvcmVTZWxlY3Rpb24oKTsNCgkJCQkJCWRvbS5zcGxpdChsaXN0UGFyZW50LCBsaXN0RWxtKTsNCgkJCQkJCXJlc3RvcmVTZWxlY3Rpb24oKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0sDQoNCgkJCS8vIE92ZXJyaWRlIGNvbW1hbmRzIHRvIHVzZSB0aGUgdGV4dCBmb3JtYXR0ZXIgZW5naW5lDQoJCQknQm9sZCxJdGFsaWMsVW5kZXJsaW5lLFN0cmlrZXRocm91Z2gnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXRvZ2dsZUZvcm1hdChjb21tYW5kKTsNCgkJCX0sDQoNCgkJCS8vIE92ZXJyaWRlIGNvbW1hbmRzIHRvIHVzZSB0aGUgdGV4dCBmb3JtYXR0ZXIgZW5naW5lDQoJCQknRm9yZUNvbG9yLEhpbGl0ZUNvbG9yLEZvbnROYW1lJyA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXRvZ2dsZUZvcm1hdChjb21tYW5kLCB2YWx1ZSk7DQoJCQl9LA0KDQoJCQlGb250U2l6ZSA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXZhciBmb250Q2xhc3NlcywgZm9udFNpemVzOw0KDQoJCQkJLy8gQ29udmVydCBmb250IHNpemUgMS03IHRvIHN0eWxlcw0KCQkJCWlmICh2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDcpIHsNCgkJCQkJZm9udFNpemVzID0gdGlueW1jZS5leHBsb2RlKHNldHRpbmdzLmZvbnRfc2l6ZV9zdHlsZV92YWx1ZXMpOw0KCQkJCQlmb250Q2xhc3NlcyA9IHRpbnltY2UuZXhwbG9kZShzZXR0aW5ncy5mb250X3NpemVfY2xhc3Nlcyk7DQoNCgkJCQkJaWYgKGZvbnRDbGFzc2VzKQ0KCQkJCQkJdmFsdWUgPSBmb250Q2xhc3Nlc1t2YWx1ZSAtIDFdIHx8IHZhbHVlOw0KCQkJCQllbHNlDQoJCQkJCQl2YWx1ZSA9IGZvbnRTaXplc1t2YWx1ZSAtIDFdIHx8IHZhbHVlOw0KCQkJCX0NCg0KCQkJCXRvZ2dsZUZvcm1hdChjb21tYW5kLCB2YWx1ZSk7DQoJCQl9LA0KDQoJCQlSZW1vdmVGb3JtYXQgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJZWRpdG9yLmZvcm1hdHRlci5yZW1vdmUoY29tbWFuZCk7DQoJCQl9LA0KDQoJCQltY2VCbG9ja1F1b3RlIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXRvZ2dsZUZvcm1hdCgnYmxvY2txdW90ZScpOw0KCQkJfSwNCg0KCQkJRm9ybWF0QmxvY2sgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQlyZXR1cm4gdG9nZ2xlRm9ybWF0KHZhbHVlIHx8ICdwJyk7DQoJCQl9LA0KDQoJCQltY2VDbGVhbnVwIDogZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGJvb2ttYXJrID0gc2VsZWN0aW9uLmdldEJvb2ttYXJrKCk7DQoNCgkJCQllZGl0b3Iuc2V0Q29udGVudChlZGl0b3IuZ2V0Q29udGVudCh7Y2xlYW51cCA6IFRSVUV9KSwge2NsZWFudXAgOiBUUlVFfSk7DQoNCgkJCQlzZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoYm9va21hcmspOw0KCQkJfSwNCg0KCQkJbWNlUmVtb3ZlTm9kZSA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXZhciBub2RlID0gdmFsdWUgfHwgc2VsZWN0aW9uLmdldE5vZGUoKTsNCg0KCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBib2R5IG5vZGUgaXNuJ3QgcmVtb3ZlZA0KCQkJCWlmIChub2RlICE9IGVkaXRvci5nZXRCb2R5KCkpIHsNCgkJCQkJc3RvcmVTZWxlY3Rpb24oKTsNCgkJCQkJZWRpdG9yLmRvbS5yZW1vdmUobm9kZSwgVFJVRSk7DQoJCQkJCXJlc3RvcmVTZWxlY3Rpb24oKTsNCgkJCQl9DQoJCQl9LA0KDQoJCQltY2VTZWxlY3ROb2RlRGVwdGggOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQl2YXIgY291bnRlciA9IDA7DQoNCgkJCQlkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXROb2RlKCksIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBjb3VudGVyKysgPT0gdmFsdWUpIHsNCgkJCQkJCXNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7DQoJCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJCX0NCgkJCQl9LCBlZGl0b3IuZ2V0Qm9keSgpKTsNCgkJCX0sDQoNCgkJCW1jZVNlbGVjdE5vZGUgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQlzZWxlY3Rpb24uc2VsZWN0KHZhbHVlKTsNCgkJCX0sDQoNCgkJCW1jZUluc2VydENvbnRlbnQgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQlzZWxlY3Rpb24uc2V0Q29udGVudCh2YWx1ZSk7DQoJCQl9LA0KDQoJCQltY2VJbnNlcnRSYXdIVE1MIDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJc2VsZWN0aW9uLnNldENvbnRlbnQoJ3RpbnlfbWNlX21hcmtlcicpOw0KCQkJCWVkaXRvci5zZXRDb250ZW50KGVkaXRvci5nZXRDb250ZW50KCkucmVwbGFjZSgvdGlueV9tY2VfbWFya2VyL2csIGZ1bmN0aW9uKCkgeyByZXR1cm4gdmFsdWUgfSkpOw0KCQkJfSwNCg0KCQkJbWNlU2V0Q29udGVudCA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCWVkaXRvci5zZXRDb250ZW50KHZhbHVlKTsNCgkJCX0sDQoNCgkJCSdJbmRlbnQsT3V0ZGVudCcgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJdmFyIGludGVudFZhbHVlLCBpbmRlbnRVbml0LCB2YWx1ZTsNCg0KCQkJCS8vIFNldHVwIGluZGVudCBsZXZlbA0KCQkJCWludGVudFZhbHVlID0gc2V0dGluZ3MuaW5kZW50YXRpb247DQoJCQkJaW5kZW50VW5pdCA9IC9bYS16JV0rJC9pLmV4ZWMoaW50ZW50VmFsdWUpOw0KCQkJCWludGVudFZhbHVlID0gcGFyc2VJbnQoaW50ZW50VmFsdWUpOw0KDQoJCQkJaWYgKCFxdWVyeUNvbW1hbmRTdGF0ZSgnSW5zZXJ0VW5vcmRlcmVkTGlzdCcpICYmICFxdWVyeUNvbW1hbmRTdGF0ZSgnSW5zZXJ0T3JkZXJlZExpc3QnKSkgew0KCQkJCQllYWNoKHNlbGVjdGlvbi5nZXRTZWxlY3RlZEJsb2NrcygpLCBmdW5jdGlvbihlbGVtZW50KSB7DQoJCQkJCQlpZiAoY29tbWFuZCA9PSAnb3V0ZGVudCcpIHsNCgkJCQkJCQl2YWx1ZSA9IE1hdGgubWF4KDAsIHBhcnNlSW50KGVsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgfHwgMCkgLSBpbnRlbnRWYWx1ZSk7DQoJCQkJCQkJZG9tLnNldFN0eWxlKGVsZW1lbnQsICdwYWRkaW5nTGVmdCcsIHZhbHVlID8gdmFsdWUgKyBpbmRlbnRVbml0IDogJycpOw0KCQkJCQkJfSBlbHNlDQoJCQkJCQkJZG9tLnNldFN0eWxlKGVsZW1lbnQsICdwYWRkaW5nTGVmdCcsIChwYXJzZUludChlbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0IHx8IDApICsgaW50ZW50VmFsdWUpICsgaW5kZW50VW5pdCk7DQoJCQkJCX0pOw0KCQkJCX0gZWxzZQ0KCQkJCQlleGVjTmF0aXZlQ29tbWFuZChjb21tYW5kKTsNCgkJCX0sDQoNCgkJCW1jZVJlcGFpbnQgOiBmdW5jdGlvbigpIHsNCgkJCQl2YXIgYm9va21hcms7DQoNCgkJCQlpZiAodGlueW1jZS5pc0dlY2tvKSB7DQoJCQkJCXRyeSB7DQoJCQkJCQlzdG9yZVNlbGVjdGlvbihUUlVFKTsNCg0KCQkJCQkJaWYgKHNlbGVjdGlvbi5nZXRTZWwoKSkNCgkJCQkJCQlzZWxlY3Rpb24uZ2V0U2VsKCkuc2VsZWN0QWxsQ2hpbGRyZW4oZWRpdG9yLmdldEJvZHkoKSk7DQoNCgkJCQkJCXNlbGVjdGlvbi5jb2xsYXBzZShUUlVFKTsNCgkJCQkJCXJlc3RvcmVTZWxlY3Rpb24oKTsNCgkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCS8vIElnbm9yZQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfSwNCg0KCQkJbWNlVG9nZ2xlRm9ybWF0IDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJZWRpdG9yLmZvcm1hdHRlci50b2dnbGUodmFsdWUpOw0KCQkJfSwNCg0KCQkJSW5zZXJ0SG9yaXpvbnRhbFJ1bGUgOiBmdW5jdGlvbigpIHsNCgkJCQlzZWxlY3Rpb24uc2V0Q29udGVudCgnPGhyIC8+Jyk7DQoJCQl9LA0KDQoJCQltY2VUb2dnbGVWaXN1YWxBaWQgOiBmdW5jdGlvbigpIHsNCgkJCQllZGl0b3IuaGFzVmlzdWFsID0gIWVkaXRvci5oYXNWaXN1YWw7DQoJCQkJZWRpdG9yLmFkZFZpc3VhbCgpOw0KCQkJfSwNCg0KCQkJbWNlUmVwbGFjZUNvbnRlbnQgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQlzZWxlY3Rpb24uc2V0Q29udGVudCh2YWx1ZS5yZXBsYWNlKC9ce1wkc2VsZWN0aW9uXH0vZywgc2VsZWN0aW9uLmdldENvbnRlbnQoe2Zvcm1hdCA6ICd0ZXh0J30pKSk7DQoJCQl9LA0KDQoJCQltY2VJbnNlcnRMaW5rIDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJdmFyIGxpbmsgPSBkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXROb2RlKCksICdhJyk7DQoNCgkJCQlpZiAodGlueW1jZS5pcyh2YWx1ZSwgJ3N0cmluZycpKQ0KCQkJCQl2YWx1ZSA9IHtocmVmIDogdmFsdWV9Ow0KDQoJCQkJaWYgKCFsaW5rKSB7DQoJCQkJCWV4ZWNOYXRpdmVDb21tYW5kKCdDcmVhdGVMaW5rJywgRkFMU0UsICdqYXZhc2NyaXB0Om1jdG1wKDApOycpOw0KCQkJCQllYWNoKGRvbS5zZWxlY3QoJ2FbaHJlZj1qYXZhc2NyaXB0Om1jdG1wKDApO10nKSwgZnVuY3Rpb24obGluaykgew0KCQkJCQkJZG9tLnNldEF0dHJpYnMobGluaywgdmFsdWUpOw0KCQkJCQl9KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlpZiAodmFsdWUuaHJlZikNCgkJCQkJCWRvbS5zZXRBdHRyaWJzKGxpbmssIHZhbHVlKTsNCgkJCQkJZWxzZQ0KCQkJCQkJZWRpdG9yLmRvbS5yZW1vdmUobGluaywgVFJVRSk7DQoJCQkJfQ0KCQkJfSwNCgkJCQ0KCQkJc2VsZWN0QWxsIDogZnVuY3Rpb24oKSB7DQoJCQkJdmFyIHJvb3QgPSBkb20uZ2V0Um9vdCgpLCBybmcgPSBkb20uY3JlYXRlUm5nKCk7DQoNCgkJCQlybmcuc2V0U3RhcnQocm9vdCwgMCk7DQoJCQkJcm5nLnNldEVuZChyb290LCByb290LmNoaWxkTm9kZXMubGVuZ3RoKTsNCg0KCQkJCWVkaXRvci5zZWxlY3Rpb24uc2V0Um5nKHJuZyk7DQoJCQl9DQoJCX0pOw0KDQoJCS8vIEFkZCBxdWVyeUNvbW1hbmRTdGF0ZSBvdmVycmlkZXMNCgkJYWRkQ29tbWFuZHMoew0KCQkJLy8gT3ZlcnJpZGUganVzdGlmeSBjb21tYW5kcw0KCQkJJ0p1c3RpZnlMZWZ0LEp1c3RpZnlDZW50ZXIsSnVzdGlmeVJpZ2h0LEp1c3RpZnlGdWxsJyA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQlyZXR1cm4gaXNGb3JtYXRNYXRjaCgnYWxpZ24nICsgY29tbWFuZC5zdWJzdHJpbmcoNykpOw0KCQkJfSwNCg0KCQkJJ0JvbGQsSXRhbGljLFVuZGVybGluZSxTdHJpa2V0aHJvdWdoJyA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQlyZXR1cm4gaXNGb3JtYXRNYXRjaChjb21tYW5kKTsNCgkJCX0sDQoNCgkJCW1jZUJsb2NrUXVvdGUgOiBmdW5jdGlvbigpIHsNCgkJCQlyZXR1cm4gaXNGb3JtYXRNYXRjaCgnYmxvY2txdW90ZScpOw0KCQkJfSwNCg0KCQkJT3V0ZGVudCA6IGZ1bmN0aW9uKCkgew0KCQkJCXZhciBub2RlOw0KDQoJCQkJaWYgKHNldHRpbmdzLmlubGluZV9zdHlsZXMpIHsNCgkJCQkJaWYgKChub2RlID0gZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0U3RhcnQoKSwgZG9tLmlzQmxvY2spKSAmJiBwYXJzZUludChub2RlLnN0eWxlLnBhZGRpbmdMZWZ0KSA+IDApDQoJCQkJCQlyZXR1cm4gVFJVRTsNCg0KCQkJCQlpZiAoKG5vZGUgPSBkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXRFbmQoKSwgZG9tLmlzQmxvY2spKSAmJiBwYXJzZUludChub2RlLnN0eWxlLnBhZGRpbmdMZWZ0KSA+IDApDQoJCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gcXVlcnlDb21tYW5kU3RhdGUoJ0luc2VydFVub3JkZXJlZExpc3QnKSB8fCBxdWVyeUNvbW1hbmRTdGF0ZSgnSW5zZXJ0T3JkZXJlZExpc3QnKSB8fCAoIXNldHRpbmdzLmlubGluZV9zdHlsZXMgJiYgISFkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXROb2RlKCksICdCTE9DS1FVT1RFJykpOw0KCQkJfSwNCg0KCQkJJ0luc2VydFVub3JkZXJlZExpc3QsSW5zZXJ0T3JkZXJlZExpc3QnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXJldHVybiBkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXROb2RlKCksIGNvbW1hbmQgPT0gJ2luc2VydHVub3JkZXJlZGxpc3QnID8gJ1VMJyA6ICdPTCcpOw0KCQkJfQ0KCQl9LCAnc3RhdGUnKTsNCg0KCQkvLyBBZGQgcXVlcnlDb21tYW5kVmFsdWUgb3ZlcnJpZGVzDQoJCWFkZENvbW1hbmRzKHsNCgkJCSdGb250U2l6ZSxGb250TmFtZScgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJdmFyIHZhbHVlID0gMCwgcGFyZW50Ow0KDQoJCQkJaWYgKHBhcmVudCA9IGRvbS5nZXRQYXJlbnQoc2VsZWN0aW9uLmdldE5vZGUoKSwgJ3NwYW4nKSkgew0KCQkJCQlpZiAoY29tbWFuZCA9PSAnZm9udHNpemUnKQ0KCQkJCQkJdmFsdWUgPSBwYXJlbnQuc3R5bGUuZm9udFNpemU7DQoJCQkJCWVsc2UNCgkJCQkJCXZhbHVlID0gcGFyZW50LnN0eWxlLmZvbnRGYW1pbHkucmVwbGFjZSgvLCAvZywgJywnKS5yZXBsYWNlKC9bXCdcIl0vZywgJycpLnRvTG93ZXJDYXNlKCk7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIHZhbHVlOw0KCQkJfQ0KCQl9LCAndmFsdWUnKTsNCg0KCQkvLyBBZGQgdW5kbyBtYW5hZ2VyIGxvZ2ljDQoJCWlmIChzZXR0aW5ncy5jdXN0b21fdW5kb19yZWRvKSB7DQoJCQlhZGRDb21tYW5kcyh7DQoJCQkJVW5kbyA6IGZ1bmN0aW9uKCkgew0KCQkJCQllZGl0b3IudW5kb01hbmFnZXIudW5kbygpOw0KCQkJCX0sDQoNCgkJCQlSZWRvIDogZnVuY3Rpb24oKSB7DQoJCQkJCWVkaXRvci51bmRvTWFuYWdlci5yZWRvKCk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0NCgl9Ow0KfSkodGlueW1jZSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXI7DQoNCgl0aW55bWNlLlVuZG9NYW5hZ2VyID0gZnVuY3Rpb24oZWRpdG9yKSB7DQoJCXZhciBzZWxmLCBpbmRleCA9IDAsIGRhdGEgPSBbXTsNCg0KCQlmdW5jdGlvbiBnZXRDb250ZW50KCkgew0KCQkJcmV0dXJuIHRpbnltY2UudHJpbShlZGl0b3IuZ2V0Q29udGVudCh7Zm9ybWF0IDogJ3JhdycsIG5vX2V2ZW50cyA6IDF9KSk7DQoJCX07DQoNCgkJcmV0dXJuIHNlbGYgPSB7DQoJCQl0eXBpbmcgOiAwLA0KDQoJCQlvbkFkZCA6IG5ldyBEaXNwYXRjaGVyKHNlbGYpLA0KCQkJb25VbmRvIDogbmV3IERpc3BhdGNoZXIoc2VsZiksDQoJCQlvblJlZG8gOiBuZXcgRGlzcGF0Y2hlcihzZWxmKSwNCg0KCQkJYWRkIDogZnVuY3Rpb24obGV2ZWwpIHsNCgkJCQl2YXIgaSwgc2V0dGluZ3MgPSBlZGl0b3Iuc2V0dGluZ3MsIGxhc3RMZXZlbDsNCg0KCQkJCWxldmVsID0gbGV2ZWwgfHwge307DQoJCQkJbGV2ZWwuY29udGVudCA9IGdldENvbnRlbnQoKTsNCg0KCQkJCS8vIEFkZCB1bmRvIGxldmVsIGlmIG5lZWRlZA0KCQkJCWxhc3RMZXZlbCA9IGRhdGFbaW5kZXhdOw0KCQkJCWlmIChsYXN0TGV2ZWwgJiYgbGFzdExldmVsLmNvbnRlbnQgPT0gbGV2ZWwuY29udGVudCkgew0KCQkJCQlpZiAoaW5kZXggPiAwIHx8IGRhdGEubGVuZ3RoID09IDEpDQoJCQkJCQlyZXR1cm4gbnVsbDsNCgkJCQl9DQoNCgkJCQkvLyBUaW1lIHRvIGNvbXByZXNzDQoJCQkJaWYgKHNldHRpbmdzLmN1c3RvbV91bmRvX3JlZG9fbGV2ZWxzKSB7DQoJCQkJCWlmIChkYXRhLmxlbmd0aCA+IHNldHRpbmdzLmN1c3RvbV91bmRvX3JlZG9fbGV2ZWxzKSB7DQoJCQkJCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS5sZW5ndGggLSAxOyBpKyspDQoJCQkJCQkJZGF0YVtpXSA9IGRhdGFbaSArIDFdOw0KDQoJCQkJCQlkYXRhLmxlbmd0aC0tOw0KCQkJCQkJaW5kZXggPSBkYXRhLmxlbmd0aDsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIEdldCBhIG5vbiBpbnRydXNpdmUgbm9ybWFsaXplZCBib29rbWFyaw0KCQkJCWxldmVsLmJvb2ttYXJrID0gZWRpdG9yLnNlbGVjdGlvbi5nZXRCb29rbWFyaygyLCB0cnVlKTsNCg0KCQkJCS8vIENyb3AgYXJyYXkgaWYgbmVlZGVkDQoJCQkJaWYgKGluZGV4IDwgZGF0YS5sZW5ndGggLSAxKSB7DQoJCQkJCS8vIFRyZWF0IGZpcnN0IGxldmVsIGFzIGluaXRpYWwNCgkJCQkJaWYgKGluZGV4ID09IDApDQoJCQkJCQlkYXRhID0gW107DQoJCQkJCWVsc2UNCgkJCQkJCWRhdGEubGVuZ3RoID0gaW5kZXggKyAxOw0KCQkJCX0NCg0KCQkJCWRhdGEucHVzaChsZXZlbCk7DQoJCQkJaW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7DQoNCgkJCQlzZWxmLm9uQWRkLmRpc3BhdGNoKHNlbGYsIGxldmVsKTsNCgkJCQllZGl0b3IuaXNOb3REaXJ0eSA9IDA7DQoNCgkJCQlyZXR1cm4gbGV2ZWw7DQoJCQl9LA0KDQoJCQl1bmRvIDogZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGxldmVsLCBpOw0KDQoJCQkJaWYgKHNlbGYudHlwaW5nKSB7DQoJCQkJCXNlbGYuYWRkKCk7DQoJCQkJCXNlbGYudHlwaW5nID0gMDsNCgkJCQl9DQoNCgkJCQlpZiAoaW5kZXggPiAwKSB7DQoJCQkJCWxldmVsID0gZGF0YVstLWluZGV4XTsNCg0KCQkJCQllZGl0b3Iuc2V0Q29udGVudChsZXZlbC5jb250ZW50LCB7Zm9ybWF0IDogJ3Jhdyd9KTsNCgkJCQkJZWRpdG9yLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhsZXZlbC5ib29rbWFyayk7DQoNCgkJCQkJc2VsZi5vblVuZG8uZGlzcGF0Y2goc2VsZiwgbGV2ZWwpOw0KCQkJCX0NCg0KCQkJCXJldHVybiBsZXZlbDsNCgkJCX0sDQoNCgkJCXJlZG8gOiBmdW5jdGlvbigpIHsNCgkJCQl2YXIgbGV2ZWw7DQoNCgkJCQlpZiAoaW5kZXggPCBkYXRhLmxlbmd0aCAtIDEpIHsNCgkJCQkJbGV2ZWwgPSBkYXRhWysraW5kZXhdOw0KDQoJCQkJCWVkaXRvci5zZXRDb250ZW50KGxldmVsLmNvbnRlbnQsIHtmb3JtYXQgOiAncmF3J30pOw0KCQkJCQllZGl0b3Iuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGxldmVsLmJvb2ttYXJrKTsNCg0KCQkJCQlzZWxmLm9uUmVkby5kaXNwYXRjaChzZWxmLCBsZXZlbCk7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGxldmVsOw0KCQkJfSwNCg0KCQkJY2xlYXIgOiBmdW5jdGlvbigpIHsNCgkJCQlkYXRhID0gW107DQoJCQkJaW5kZXggPSBzZWxmLnR5cGluZyA9IDA7DQoJCQl9LA0KDQoJCQloYXNVbmRvIDogZnVuY3Rpb24oKSB7DQoJCQkJcmV0dXJuIGluZGV4ID4gMCB8fCBzZWxmLnR5cGluZzsNCgkJCX0sDQoNCgkJCWhhc1JlZG8gOiBmdW5jdGlvbigpIHsNCgkJCQlyZXR1cm4gaW5kZXggPCBkYXRhLmxlbmd0aCAtIDE7DQoJCQl9DQoJCX07DQoJfTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIFNob3J0ZW4gbmFtZXMNCgl2YXIgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwNCgkJaXNJRSA9IHRpbnltY2UuaXNJRSwNCgkJaXNHZWNrbyA9IHRpbnltY2UuaXNHZWNrbywNCgkJaXNPcGVyYSA9IHRpbnltY2UuaXNPcGVyYSwNCgkJZWFjaCA9IHRpbnltY2UuZWFjaCwNCgkJZXh0ZW5kID0gdGlueW1jZS5leHRlbmQsDQoJCVRSVUUgPSB0cnVlLA0KCQlGQUxTRSA9IGZhbHNlOw0KDQoJZnVuY3Rpb24gY2xvbmVGb3JtYXRzKG5vZGUpIHsNCgkJdmFyIGNsb25lLCB0ZW1wLCBpbm5lcjsNCg0KCQlkbyB7DQoJCQlpZiAoL14oU1BBTnxTVFJPTkd8QnxFTXxJfEZPTlR8U1RSSUtFfFUpJC8udGVzdChub2RlLm5vZGVOYW1lKSkgew0KCQkJCWlmIChjbG9uZSkgew0KCQkJCQl0ZW1wID0gbm9kZS5jbG9uZU5vZGUoZmFsc2UpOw0KCQkJCQl0ZW1wLmFwcGVuZENoaWxkKGNsb25lKTsNCgkJCQkJY2xvbmUgPSB0ZW1wOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWNsb25lID0gaW5uZXIgPSBub2RlLmNsb25lTm9kZShmYWxzZSk7DQoJCQkJfQ0KDQoJCQkJY2xvbmUucmVtb3ZlQXR0cmlidXRlKCdpZCcpOw0KCQkJfQ0KCQl9IHdoaWxlIChub2RlID0gbm9kZS5wYXJlbnROb2RlKTsNCg0KCQlpZiAoY2xvbmUpDQoJCQlyZXR1cm4ge3dyYXBwZXIgOiBjbG9uZSwgaW5uZXIgOiBpbm5lcn07DQoJfTsNCg0KCS8vIENoZWNrcyBpZiB0aGUgc2VsZWN0aW9uL2NhcmV0IGlzIGF0IHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBibG9jayBlbGVtZW50DQoJZnVuY3Rpb24gaXNBdEVuZChybmcsIHBhcikgew0KCQl2YXIgcm5nMiA9IHBhci5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7DQoNCgkJcm5nMi5zZXRTdGFydChybmcuZW5kQ29udGFpbmVyLCBybmcuZW5kT2Zmc2V0KTsNCgkJcm5nMi5zZXRFbmRBZnRlcihwYXIpOw0KDQoJCS8vIEdldCBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB0aGUgcmlnaHQgb2YgdGhlIGN1cnNvciBpZiBpdCdzIHplcm8gdGhlbiB3ZSBhcmUgYXQgdGhlIGVuZCBhbmQgbmVlZCB0byBtZXJnZSB0aGUgbmV4dCBibG9jayBlbGVtZW50DQoJCXJldHVybiBybmcyLmNsb25lQ29udGVudHMoKS50ZXh0Q29udGVudC5sZW5ndGggPT0gMDsNCgl9Ow0KDQoJZnVuY3Rpb24gaXNFbXB0eShuKSB7DQoJCW4gPSBuLmlubmVySFRNTDsNCg0KCQluID0gbi5yZXBsYWNlKC88KGltZ3xocnx0YWJsZXxpbnB1dHxzZWxlY3R8dGV4dGFyZWEpWyBcPl0vZ2ksICctJyk7IC8vIEtlZXAgdGhlc2UgY29udmVydCB0aGVtIHRvIC0gY2hhcnMNCgkJbiA9IG4ucmVwbGFjZSgvPFtePl0rPi9nLCAnJyk7IC8vIFJlbW92ZSBhbGwgdGFncw0KDQoJCXJldHVybiBuLnJlcGxhY2UoL1sgXHUwMGEwXHRcclxuXSsvZywgJycpID09ICcnOw0KCX07DQoNCglmdW5jdGlvbiBzcGxpdExpc3Qoc2VsZWN0aW9uLCBkb20sIGxpKSB7DQoJCXZhciBsaXN0QmxvY2ssIGJsb2NrOw0KDQoJCWlmIChpc0VtcHR5KGxpKSkgew0KCQkJbGlzdEJsb2NrID0gZG9tLmdldFBhcmVudChsaSwgJ3VsLG9sJyk7DQoNCgkJCWlmICghZG9tLmdldFBhcmVudChsaXN0QmxvY2sucGFyZW50Tm9kZSwgJ3VsLG9sJykpIHsNCgkJCQlkb20uc3BsaXQobGlzdEJsb2NrLCBsaSk7DQoJCQkJYmxvY2sgPSBkb20uY3JlYXRlKCdwJywgMCwgJzxiciBfbWNlX2JvZ3VzPSIxIiAvPicpOw0KCQkJCWRvbS5yZXBsYWNlKGJsb2NrLCBsaSk7DQoJCQkJc2VsZWN0aW9uLnNlbGVjdChibG9jaywgMSk7DQoJCQl9DQoNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KDQoJCXJldHVybiBUUlVFOw0KCX07DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5Gb3JjZUJsb2NrcycsIHsNCgkJRm9yY2VCbG9ja3MgOiBmdW5jdGlvbihlZCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gZWQuc2V0dGluZ3MsIGVsbTsNCg0KCQkJdC5lZGl0b3IgPSBlZDsNCgkJCXQuZG9tID0gZWQuZG9tOw0KCQkJZWxtID0gKHMuZm9yY2VkX3Jvb3RfYmxvY2sgfHwgJ3AnKS50b0xvd2VyQ2FzZSgpOw0KCQkJcy5lbGVtZW50ID0gZWxtLnRvVXBwZXJDYXNlKCk7DQoNCgkJCWVkLm9uUHJlSW5pdC5hZGQodC5zZXR1cCwgdCk7DQoNCgkJCXQucmVPcGVyYSA9IG5ldyBSZWdFeHAoJyhcXHUwMGEwfCYjMTYwO3wmbmJzcDspPFwvJyArIGVsbSArICc+JywgJ2dpJyk7DQoJCQl0LnJlUGFkZCA9IG5ldyBSZWdFeHAoJzxwKCApKFtePl0rKT48XFxcL3A+fDxwKCApKFtePl0rKVxcXC8+fDxwKCApKFtePl0rKT5cXHMrPFxcXC9wPnw8cD48XFxcL3A+fDxwXFxcLz58PHA+XFxzKzxcXFwvcD4nLnJlcGxhY2UoL3AvZywgZWxtKSwgJ2dpJyk7DQoJCQl0LnJlTmJzcDJCUjEgPSBuZXcgUmVnRXhwKCc8cCggKShbXj5dKyk+W1xcc1xcdTAwYTBdKzxcXFwvcD58PHA+W1xcc1xcdTAwYTBdKzxcXFwvcD4nLnJlcGxhY2UoL3AvZywgZWxtKSwgJ2dpJyk7DQoJCQl0LnJlTmJzcDJCUjIgPSBuZXcgUmVnRXhwKCc8JXAoKShbXj5dKyk+KCZuYnNwO3wmIzE2MDspPFxcXC8lcD58PCVwPigmbmJzcDt8JiMxNjA7KTxcXFwvJXA+Jy5yZXBsYWNlKC8lcC9nLCBlbG0pLCAnZ2knKTsNCgkJCXQucmVCUjJOYnNwID0gbmV3IFJlZ0V4cCgnPHAoICkoW14+XSspPlxccyo8YnIgXFxcLz5cXHMqPFxcXC9wPnw8cD5cXHMqPGJyIFxcXC8+XFxzKjxcXFwvcD4nLnJlcGxhY2UoL3AvZywgZWxtKSwgJ2dpJyk7DQoNCgkJCWZ1bmN0aW9uIHBhZGQoZWQsIG8pIHsNCgkJCQlpZiAoaXNPcGVyYSkNCgkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UodC5yZU9wZXJhLCAnPC8nICsgZWxtICsgJz4nKTsNCg0KCQkJCW8uY29udGVudCA9IHRpbnltY2UuX3JlcGxhY2UodC5yZVBhZGQsICc8JyArIGVsbSArICckMSQyJDMkNCQ1JDY+XHUwMGEwPC8nICsgZWxtICsgJz4nLCBvLmNvbnRlbnQpOw0KDQoJCQkJaWYgKCFpc0lFICYmICFpc09wZXJhICYmIG8uc2V0KSB7DQoJCQkJCS8vIFVzZSAmbmJzcDsgaW5zdGVhZCBvZiBCUiBpbiBwYWRkZWQgcGFyYWdyYXBocw0KCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSh0LnJlTmJzcDJCUjEsICc8JyArIGVsbSArICckMSQyPjxiciAvPjwvJyArIGVsbSArICc+Jyk7DQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKHQucmVOYnNwMkJSMiwgJzwnICsgZWxtICsgJyQxJDI+PGJyIC8+PC8nICsgZWxtICsgJz4nKTsNCgkJCQl9IGVsc2UNCgkJCQkJby5jb250ZW50ID0gdGlueW1jZS5fcmVwbGFjZSh0LnJlQlIyTmJzcCwgJzwnICsgZWxtICsgJyQxJDI+XHUwMGEwPC8nICsgZWxtICsgJz4nLCBvLmNvbnRlbnQpOw0KCQkJfTsNCg0KCQkJZWQub25CZWZvcmVTZXRDb250ZW50LmFkZChwYWRkKTsNCgkJCWVkLm9uUG9zdFByb2Nlc3MuYWRkKHBhZGQpOw0KDQoJCQlpZiAocy5mb3JjZWRfcm9vdF9ibG9jaykgew0KCQkJCWVkLm9uSW5pdC5hZGQodC5mb3JjZVJvb3RzLCB0KTsNCgkJCQllZC5vblNldENvbnRlbnQuYWRkKHQuZm9yY2VSb290cywgdCk7DQoJCQkJZWQub25CZWZvcmVHZXRDb250ZW50LmFkZCh0LmZvcmNlUm9vdHMsIHQpOw0KCQkJfQ0KCQl9LA0KDQoJCXNldHVwIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIHMgPSBlZC5zZXR0aW5ncywgZG9tID0gZWQuZG9tLCBzZWxlY3Rpb24gPSBlZC5zZWxlY3Rpb247DQoNCgkJCS8vIEZvcmNlIHJvb3QgYmxvY2tzIHdoZW4gdHlwaW5nIGFuZCB3aGVuIGdldHRpbmcgb3V0cHV0DQoJCQlpZiAocy5mb3JjZWRfcm9vdF9ibG9jaykgew0KCQkJCWVkLm9uQmVmb3JlRXhlY0NvbW1hbmQuYWRkKHQuZm9yY2VSb290cywgdCk7DQoJCQkJZWQub25LZXlVcC5hZGQodC5mb3JjZVJvb3RzLCB0KTsNCgkJCQllZC5vblByZVByb2Nlc3MuYWRkKHQuZm9yY2VSb290cywgdCk7DQoJCQl9DQoNCgkJCWlmIChzLmZvcmNlX2JyX25ld2xpbmVzKSB7DQoJCQkJLy8gRm9yY2UgSUUgdG8gcHJvZHVjZSBCUnMgb24gZW50ZXINCgkJCQlpZiAoaXNJRSkgew0KCQkJCQllZC5vbktleVByZXNzLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJdmFyIG47DQoNCgkJCQkJCWlmIChlLmtleUNvZGUgPT0gMTMgJiYgc2VsZWN0aW9uLmdldE5vZGUoKS5ub2RlTmFtZSAhPSAnTEknKSB7DQoJCQkJCQkJc2VsZWN0aW9uLnNldENvbnRlbnQoJzxiciBpZD0iX18iIC8+ICcsIHtmb3JtYXQgOiAncmF3J30pOw0KCQkJCQkJCW4gPSBkb20uZ2V0KCdfXycpOw0KCQkJCQkJCW4ucmVtb3ZlQXR0cmlidXRlKCdpZCcpOw0KCQkJCQkJCXNlbGVjdGlvbi5zZWxlY3Qobik7DQoJCQkJCQkJc2VsZWN0aW9uLmNvbGxhcHNlKCk7DQoJCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAocy5mb3JjZV9wX25ld2xpbmVzKSB7DQoJCQkJaWYgKCFpc0lFKSB7DQoJCQkJCWVkLm9uS2V5UHJlc3MuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCQlpZiAoZS5rZXlDb2RlID09IDEzICYmICFlLnNoaWZ0S2V5ICYmICF0Lmluc2VydFBhcmEoZSkpDQoJCQkJCQkJRXZlbnQuY2FuY2VsKGUpOw0KCQkJCQl9KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBVbmdseSBoYWNrIHRvIGZvciBJRSB0byBwcmVzZXJ2ZSB0aGUgZm9ybWF0dGluZyB3aGVuIHlvdSBwcmVzcw0KCQkJCQkvLyBlbnRlciBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZWxlbWVudCB3aXRoIGZvcm1hdHRlZCBjb250ZW50cw0KCQkJCQkvLyBUaGlzIGxvZ2ljIG92ZXJyaWRlcyB0aGUgYnJvd3NlcnMgZGVmYXVsdCBsb2dpYyB3aXRoDQoJCQkJCS8vIGN1c3RvbSBsb2dpYyB0aGF0IGVuYWJsZXMgdXMgdG8gY29udHJvbCB0aGUgb3V0cHV0DQoJCQkJCXRpbnltY2UuYWRkVW5sb2FkKGZ1bmN0aW9uKCkgew0KCQkJCQkJdC5fcHJldmlvdXNGb3JtYXRzID0gMDsgLy8gRml4IElFIGxlYWsNCgkJCQkJfSk7DQoNCgkJCQkJZWQub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJCXQuX3ByZXZpb3VzRm9ybWF0cyA9IDA7DQoNCgkJCQkJCS8vIENsb25lIHRoZSBjdXJyZW50IGZvcm1hdHMsIHRoaXMgd2lsbCBsYXRlciBiZSBhcHBsaWVkIHRvIHRoZSBuZXcgYmxvY2sgY29udGVudHMNCgkJCQkJCWlmIChlLmtleUNvZGUgPT0gMTMgJiYgIWUuc2hpZnRLZXkgJiYgZWQuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkgJiYgcy5rZWVwX3N0eWxlcykNCgkJCQkJCQl0Ll9wcmV2aW91c0Zvcm1hdHMgPSBjbG9uZUZvcm1hdHMoZWQuc2VsZWN0aW9uLmdldFN0YXJ0KCkpOw0KCQkJCQl9KTsNCg0KCQkJCQllZC5vbktleVVwLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJLy8gTGV0IElFIGJyZWFrIHRoZSBlbGVtZW50IGFuZCB0aGUgd3JhcCB0aGUgbmV3IGNhcmV0IGxvY2F0aW9uIGluIHRoZSBwcmV2aW91cyBmb3JtYXRzDQoJCQkJCQlpZiAoZS5rZXlDb2RlID09IDEzICYmICFlLnNoaWZ0S2V5KSB7DQoJCQkJCQkJdmFyIHBhcmVudCA9IGVkLnNlbGVjdGlvbi5nZXRTdGFydCgpLCBmbXQgPSB0Ll9wcmV2aW91c0Zvcm1hdHM7DQoNCgkJCQkJCQkvLyBQYXJlbnQgaXMgYW4gZW1wdHkgYmxvY2sNCgkJCQkJCQlpZiAoIXBhcmVudC5oYXNDaGlsZE5vZGVzKCkgJiYgZm10KSB7DQoJCQkJCQkJCXBhcmVudCA9IGRvbS5nZXRQYXJlbnQocGFyZW50LCBkb20uaXNCbG9jayk7DQoNCgkJCQkJCQkJaWYgKHBhcmVudCAmJiBwYXJlbnQubm9kZU5hbWUgIT0gJ0xJJykgew0KCQkJCQkJCQkJcGFyZW50LmlubmVySFRNTCA9ICcnOw0KDQoJCQkJCQkJCQlpZiAodC5fcHJldmlvdXNGb3JtYXRzKSB7DQoJCQkJCQkJCQkJcGFyZW50LmFwcGVuZENoaWxkKGZtdC53cmFwcGVyKTsNCgkJCQkJCQkJCQlmbXQuaW5uZXIuaW5uZXJIVE1MID0gJ1x1RkVGRic7DQoJCQkJCQkJCQl9IGVsc2UNCgkJCQkJCQkJCQlwYXJlbnQuaW5uZXJIVE1MID0gJ1x1RkVGRic7DQoNCgkJCQkJCQkJCXNlbGVjdGlvbi5zZWxlY3QocGFyZW50LCAxKTsNCgkJCQkJCQkJCWVkLmdldERvYygpLmV4ZWNDb21tYW5kKCdEZWxldGUnLCBmYWxzZSwgbnVsbCk7DQoJCQkJCQkJCQl0Ll9wcmV2aW91c0Zvcm1hdHMgPSAwOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQlpZiAoaXNHZWNrbykgew0KCQkJCQllZC5vbktleURvd24uYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCQlpZiAoKGUua2V5Q29kZSA9PSA4IHx8IGUua2V5Q29kZSA9PSA0NikgJiYgIWUuc2hpZnRLZXkpDQoJCQkJCQkJdC5iYWNrc3BhY2VEZWxldGUoZSwgZS5rZXlDb2RlID09IDgpOw0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFdvcmthcm91bmQgZm9yIG1pc3Npbmcgc2hpZnQrZW50ZXIgc3VwcG9ydCwgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY5NzMNCgkJCWlmICh0aW55bWNlLmlzV2ViS2l0KSB7DQoJCQkJZnVuY3Rpb24gaW5zZXJ0QnIoZWQpIHsNCgkJCQkJdmFyIHJuZyA9IHNlbGVjdGlvbi5nZXRSbmcoKSwgYnIsIGRpdiA9IGRvbS5jcmVhdGUoJ2RpdicsIG51bGwsICcgJyksIGRpdllQb3MsIHZwSGVpZ2h0ID0gZG9tLmdldFZpZXdQb3J0KGVkLmdldFdpbigpKS5oOw0KDQoJCQkJCS8vIEluc2VydCBCUiBlbGVtZW50DQoJCQkJCXJuZy5pbnNlcnROb2RlKGJyID0gZG9tLmNyZWF0ZSgnYnInKSk7DQoNCgkJCQkJLy8gUGxhY2UgY2FyZXQgYWZ0ZXIgQlINCgkJCQkJcm5nLnNldFN0YXJ0QWZ0ZXIoYnIpOw0KCQkJCQlybmcuc2V0RW5kQWZ0ZXIoYnIpOw0KCQkJCQlzZWxlY3Rpb24uc2V0Um5nKHJuZyk7DQoNCgkJCQkJLy8gQ291bGQgbm90IHBsYWNlIGNhcmV0IGFmdGVyIEJSIHRoZW4gaW5zZXJ0IGFuIG5ic3AgZW50aXR5IGFuZCBtb3ZlIHRoZSBjYXJldA0KCQkJCQlpZiAoc2VsZWN0aW9uLmdldFNlbCgpLmZvY3VzTm9kZSA9PSBici5wcmV2aW91c1NpYmxpbmcpIHsNCgkJCQkJCXNlbGVjdGlvbi5zZWxlY3QoZG9tLmluc2VydEFmdGVyKGRvbS5kb2MuY3JlYXRlVGV4dE5vZGUoJ1x1MDBhMCcpLCBicikpOw0KCQkJCQkJc2VsZWN0aW9uLmNvbGxhcHNlKFRSVUUpOw0KCQkJCQl9DQoNCgkJCQkJLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IERJViBhZnRlciB0aGUgQlIgYW5kIGdldCB0aGUgcG9zaXRpb24gYXMgaXQNCgkJCQkJLy8gc2VlbXMgbGlrZSBnZXRQb3MoKSByZXR1cm5zIDAgZm9yIHRleHQgbm9kZXMgYW5kIEJSIGVsZW1lbnRzLg0KCQkJCQlkb20uaW5zZXJ0QWZ0ZXIoZGl2LCBicik7DQoJCQkJCWRpdllQb3MgPSBkb20uZ2V0UG9zKGRpdikueTsNCgkJCQkJZG9tLnJlbW92ZShkaXYpOw0KDQoJCQkJCS8vIFNjcm9sbCB0byBuZXcgcG9zaXRpb24sIHNjcm9sbEludG9WaWV3IGNhbid0IGJlIHVzZWQgZHVlIHRvIGJ1ZzogaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMTcNCgkJCQkJaWYgKGRpdllQb3MgPiB2cEhlaWdodCkgLy8gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBzY3JvbGwgaWYgdGhlIERJViBpcyBpbnNpZGUgdGhlIHZpZXcgcG9ydC4NCgkJCQkJCWVkLmdldFdpbigpLnNjcm9sbFRvKDAsIGRpdllQb3MpOw0KCQkJCX07DQoNCgkJCQllZC5vbktleVByZXNzLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQlpZiAoZS5rZXlDb2RlID09IDEzICYmIChlLnNoaWZ0S2V5IHx8IChzLmZvcmNlX2JyX25ld2xpbmVzICYmICFkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXROb2RlKCksICdoMSxoMixoMyxoNCxoNSxoNixvbCx1bCcpKSkpIHsNCgkJCQkJCWluc2VydEJyKGVkKTsNCgkJCQkJCUV2ZW50LmNhbmNlbChlKTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBQYWRkIGVtcHR5IGlubGluZSBlbGVtZW50cyB3aXRoaW4gYmxvY2sgZWxlbWVudHMNCgkJCS8vIEZvciBleGFtcGxlOiA8cD48c3Ryb25nPjxlbT48L2VtPjwvc3Ryb25nPjwvcD4gYmVjb21lcyA8cD48c3Ryb25nPjxlbT4mbmJzcDs8L2VtPjwvc3Ryb25nPjwvcD4NCgkJCWVkLm9uUHJlUHJvY2Vzcy5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQllYWNoKGRvbS5zZWxlY3QoJ3AsaDEsaDIsaDMsaDQsaDUsaDYsZGl2Jywgby5ub2RlKSwgZnVuY3Rpb24ocCkgew0KCQkJCQlpZiAoaXNFbXB0eShwKSkgew0KCQkJCQkJZWFjaChkb20uc2VsZWN0KCdzcGFuLGVtLHN0cm9uZyxiLGknLCBvLm5vZGUpLCBmdW5jdGlvbihuKSB7DQoJCQkJCQkJaWYgKCFuLmhhc0NoaWxkTm9kZXMoKSkgew0KCQkJCQkJCQluLmFwcGVuZENoaWxkKGVkLmdldERvYygpLmNyZWF0ZVRleHROb2RlKCdcdTAwYTAnKSk7DQoJCQkJCQkJCXJldHVybiBGQUxTRTsgLy8gQnJlYWsgdGhlIGxvb3Agb25lIHBhZGRpbmcgaXMgZW5vdWdoDQoJCQkJCQkJfQ0KCQkJCQkJfSk7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQkvLyBJRSBzcGVjaWZpYyBmaXhlcw0KCQkJaWYgKGlzSUUpIHsNCgkJCQkvLyBSZXBsYWNlcyBJRTpzIGF1dG8gZ2VuZXJhdGVkIHBhcmFncmFwaHMgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgbmFtZQ0KCQkJCWlmIChzLmVsZW1lbnQgIT0gJ1AnKSB7DQoJCQkJCWVkLm9uS2V5UHJlc3MuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCQl0Lmxhc3RFbG0gPSBzZWxlY3Rpb24uZ2V0Tm9kZSgpLm5vZGVOYW1lOw0KCQkJCQl9KTsNCg0KCQkJCQllZC5vbktleVVwLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJdmFyIGJsLCBuID0gc2VsZWN0aW9uLmdldE5vZGUoKSwgYiA9IGVkLmdldEJvZHkoKTsNCg0KCQkJCQkJaWYgKGIuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgJiYgbi5ub2RlTmFtZSA9PSAnUCcpIHsNCgkJCQkJCQluID0gZG9tLnJlbmFtZShuLCBzLmVsZW1lbnQpOw0KCQkJCQkJCXNlbGVjdGlvbi5zZWxlY3Qobik7DQoJCQkJCQkJc2VsZWN0aW9uLmNvbGxhcHNlKCk7DQoJCQkJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCQkJCX0gZWxzZSBpZiAoZS5rZXlDb2RlID09IDEzICYmICFlLnNoaWZ0S2V5ICYmIHQubGFzdEVsbSAhPSAnUCcpIHsNCgkJCQkJCQlibCA9IGRvbS5nZXRQYXJlbnQobiwgJ3AnKTsNCg0KCQkJCQkJCWlmIChibCkgew0KCQkJCQkJCQlkb20ucmVuYW1lKGJsLCBzLmVsZW1lbnQpOw0KCQkJCQkJCQllZC5ub2RlQ2hhbmdlZCgpOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KDQoJCWZpbmQgOiBmdW5jdGlvbihuLCB0LCBzKSB7DQoJCQl2YXIgZWQgPSB0aGlzLmVkaXRvciwgdyA9IGVkLmdldERvYygpLmNyZWF0ZVRyZWVXYWxrZXIobiwgNCwgbnVsbCwgRkFMU0UpLCBjID0gLTE7DQoNCgkJCXdoaWxlIChuID0gdy5uZXh0Tm9kZSgpKSB7DQoJCQkJYysrOw0KDQoJCQkJLy8gSW5kZXggYnkgbm9kZQ0KCQkJCWlmICh0ID09IDAgJiYgbiA9PSBzKQ0KCQkJCQlyZXR1cm4gYzsNCg0KCQkJCS8vIE5vZGUgYnkgaW5kZXgNCgkJCQlpZiAodCA9PSAxICYmIGMgPT0gcykNCgkJCQkJcmV0dXJuIG47DQoJCQl9DQoNCgkJCXJldHVybiAtMTsNCgkJfSwNCg0KCQlmb3JjZVJvb3RzIDogZnVuY3Rpb24oZWQsIGUpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgYiA9IGVkLmdldEJvZHkoKSwgZCA9IGVkLmdldERvYygpLCBzZSA9IGVkLnNlbGVjdGlvbiwgcyA9IHNlLmdldFNlbCgpLCByID0gc2UuZ2V0Um5nKCksIHNpID0gLTIsIGVpLCBzbywgZW8sIHRyLCBjID0gLTB4RkZGRkZGOw0KCQkJdmFyIG54LCBibCwgYnAsIHNwLCBsZSwgbmwgPSBiLmNoaWxkTm9kZXMsIGksIG4sIGVpZDsNCg0KCQkJLy8gRml4IGZvciBidWcgIzE4NjM4NDcNCgkJCS8vaWYgKGUgJiYgZS5rZXlDb2RlID09IDEzKQ0KCQkJLy8JcmV0dXJuIFRSVUU7DQoNCgkJCS8vIFdyYXAgbm9uIGJsb2NrcyBpbnRvIGJsb2Nrcw0KCQkJZm9yIChpID0gbmwubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQlueCA9IG5sW2ldOw0KDQoJCQkJLy8gSWdub3JlIGludGVybmFsIGVsZW1lbnRzDQoJCQkJaWYgKG54Lm5vZGVUeXBlID09PSAxICYmIG54LmdldEF0dHJpYnV0ZSgnX21jZV90eXBlJykpIHsNCgkJCQkJYmwgPSBudWxsOw0KCQkJCQljb250aW51ZTsNCgkJCQl9DQoNCgkJCQkvLyBJcyB0ZXh0IG9yIG5vbiBibG9jayBlbGVtZW50DQoJCQkJaWYgKG54Lm5vZGVUeXBlID09PSAzIHx8ICghdC5kb20uaXNCbG9jayhueCkgJiYgbngubm9kZVR5cGUgIT09IDggJiYgIS9eKHNjcmlwdHxtY2U6c2NyaXB0fHN0eWxlfG1jZTpzdHlsZSkkL2kudGVzdChueC5ub2RlTmFtZSkpKSB7DQoJCQkJCWlmICghYmwpIHsNCgkJCQkJCS8vIENyZWF0ZSBuZXcgYmxvY2sgYnV0IGlnbm9yZSB3aGl0ZXNwYWNlDQoJCQkJCQlpZiAobngubm9kZVR5cGUgIT0gMyB8fCAvW15cc10vZy50ZXN0KG54Lm5vZGVWYWx1ZSkpIHsNCgkJCQkJCQkvLyBTdG9yZSBzZWxlY3Rpb24NCgkJCQkJCQlpZiAoc2kgPT0gLTIgJiYgcikgew0KCQkJCQkJCQlpZiAoIWlzSUUgfHwgci5zZXRTdGFydCkgew0KCQkJCQkJCQkJLy8gSWYgc2VsZWN0aW9uIGlzIGVsZW1lbnQgdGhlbiBtYXJrIGl0DQoJCQkJCQkJCQlpZiAoci5zdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PSAxICYmIChuID0gci5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3Iuc3RhcnRPZmZzZXRdKSAmJiBuLm5vZGVUeXBlID09IDEpIHsNCgkJCQkJCQkJCQkvLyBTYXZlIHRoZSBpZCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudA0KCQkJCQkJCQkJCWVpZCA9IG4uZ2V0QXR0cmlidXRlKCJpZCIpOw0KCQkJCQkJCQkJCW4uc2V0QXR0cmlidXRlKCJpZCIsICJfX21jZSIpOw0KCQkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCQkvLyBJZiBlbGVtZW50IGlzIGluc2lkZSBib2R5LCBtaWdodCBub3QgYmUgdGhlIGNhc2UgaW4gY29udGVudEVkaWFibGUgbW9kZQ0KCQkJCQkJCQkJCWlmIChlZC5kb20uZ2V0UGFyZW50KHIuc3RhcnRDb250YWluZXIsIGZ1bmN0aW9uKGUpIHtyZXR1cm4gZSA9PT0gYjt9KSkgew0KCQkJCQkJCQkJCQlzbyA9IHIuc3RhcnRPZmZzZXQ7DQoJCQkJCQkJCQkJCWVvID0gci5lbmRPZmZzZXQ7DQoJCQkJCQkJCQkJCXNpID0gdC5maW5kKGIsIDAsIHIuc3RhcnRDb250YWluZXIpOw0KCQkJCQkJCQkJCQllaSA9IHQuZmluZChiLCAwLCByLmVuZENvbnRhaW5lcik7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJLy8gRm9yY2UgY29udHJvbCByYW5nZSBpbnRvIHRleHQgcmFuZ2UNCgkJCQkJCQkJCWlmIChyLml0ZW0pIHsNCgkJCQkJCQkJCQl0ciA9IGQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsNCgkJCQkJCQkJCQl0ci5tb3ZlVG9FbGVtZW50VGV4dChyLml0ZW0oMCkpOw0KCQkJCQkJCQkJCXIgPSB0cjsNCgkJCQkJCQkJCX0NCg0KCQkJCQkJCQkJdHIgPSBkLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7DQoJCQkJCQkJCQl0ci5tb3ZlVG9FbGVtZW50VGV4dChiKTsNCgkJCQkJCQkJCXRyLmNvbGxhcHNlKDEpOw0KCQkJCQkJCQkJYnAgPSB0ci5tb3ZlKCdjaGFyYWN0ZXInLCBjKSAqIC0xOw0KDQoJCQkJCQkJCQl0ciA9IHIuZHVwbGljYXRlKCk7DQoJCQkJCQkJCQl0ci5jb2xsYXBzZSgxKTsNCgkJCQkJCQkJCXNwID0gdHIubW92ZSgnY2hhcmFjdGVyJywgYykgKiAtMTsNCg0KCQkJCQkJCQkJdHIgPSByLmR1cGxpY2F0ZSgpOw0KCQkJCQkJCQkJdHIuY29sbGFwc2UoMCk7DQoJCQkJCQkJCQlsZSA9ICh0ci5tb3ZlKCdjaGFyYWN0ZXInLCBjKSAqIC0xKSAtIHNwOw0KDQoJCQkJCQkJCQlzaSA9IHNwIC0gYnA7DQoJCQkJCQkJCQllaSA9IGxlOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gVXNlcyByZXBsYWNlQ2hpbGQgaW5zdGVhZCBvZiBjbG9uZU5vZGUgc2luY2UgaXQgcmVtb3ZlcyBzZWxlY3RlZCBhdHRyaWJ1dGUgZnJvbSBvcHRpb24gZWxlbWVudHMgb24gSUUNCgkJCQkJCQkvLyBTZWU6IGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvODI5OTA3DQoJCQkJCQkJYmwgPSBlZC5kb20uY3JlYXRlKGVkLnNldHRpbmdzLmZvcmNlZF9yb290X2Jsb2NrKTsNCgkJCQkJCQlueC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChibCwgbngpOw0KCQkJCQkJCWJsLmFwcGVuZENoaWxkKG54KTsNCgkJCQkJCX0NCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWlmIChibC5oYXNDaGlsZE5vZGVzKCkpDQoJCQkJCQkJYmwuaW5zZXJ0QmVmb3JlKG54LCBibC5maXJzdENoaWxkKTsNCgkJCQkJCWVsc2UNCgkJCQkJCQlibC5hcHBlbmRDaGlsZChueCk7DQoJCQkJCX0NCgkJCQl9IGVsc2UNCgkJCQkJYmwgPSBudWxsOyAvLyBUaW1lIHRvIGNyZWF0ZSBuZXcgYmxvY2sNCgkJCX0NCg0KCQkJLy8gUmVzdG9yZSBzZWxlY3Rpb24NCgkJCWlmIChzaSAhPSAtMikgew0KCQkJCWlmICghaXNJRSB8fCByLnNldFN0YXJ0KSB7DQoJCQkJCWJsID0gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShlZC5zZXR0aW5ncy5lbGVtZW50KVswXTsNCgkJCQkJciA9IGQuY3JlYXRlUmFuZ2UoKTsNCg0KCQkJCQkvLyBTZWxlY3QgbGFzdCBsb2NhdGlvbiBvciBnZW5lcmF0ZWQgYmxvY2sNCgkJCQkJaWYgKHNpICE9IC0xKQ0KCQkJCQkJci5zZXRTdGFydCh0LmZpbmQoYiwgMSwgc2kpLCBzbyk7DQoJCQkJCWVsc2UNCgkJCQkJCXIuc2V0U3RhcnQoYmwsIDApOw0KDQoJCQkJCS8vIFNlbGVjdCBsYXN0IGxvY2F0aW9uIG9yIGdlbmVyYXRlZCBibG9jaw0KCQkJCQlpZiAoZWkgIT0gLTEpDQoJCQkJCQlyLnNldEVuZCh0LmZpbmQoYiwgMSwgZWkpLCBlbyk7DQoJCQkJCWVsc2UNCgkJCQkJCXIuc2V0RW5kKGJsLCAwKTsNCg0KCQkJCQlpZiAocykgew0KCQkJCQkJcy5yZW1vdmVBbGxSYW5nZXMoKTsNCgkJCQkJCXMuYWRkUmFuZ2Uocik7DQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQl0cnkgew0KCQkJCQkJciA9IHMuY3JlYXRlUmFuZ2UoKTsNCgkJCQkJCXIubW92ZVRvRWxlbWVudFRleHQoYik7DQoJCQkJCQlyLmNvbGxhcHNlKDEpOw0KCQkJCQkJci5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHNpKTsNCgkJCQkJCXIubW92ZUVuZCgnY2hhcmFjdGVyJywgZWkpOw0KCQkJCQkJci5zZWxlY3QoKTsNCgkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCS8vIElnbm9yZQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIGlmICgoIWlzSUUgfHwgci5zZXRTdGFydCkgJiYgKG4gPSBlZC5kb20uZ2V0KCdfX21jZScpKSkgew0KCQkJCS8vIFJlc3RvcmUgdGhlIGlkIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50DQoJCQkJaWYgKGVpZCkNCgkJCQkJbi5zZXRBdHRyaWJ1dGUoJ2lkJywgZWlkKTsNCgkJCQllbHNlDQoJCQkJCW4ucmVtb3ZlQXR0cmlidXRlKCdpZCcpOw0KDQoJCQkJLy8gTW92ZSBjYXJldCBiZWZvcmUgc2VsZWN0ZWQgZWxlbWVudA0KCQkJCXIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoJCQkJci5zZXRTdGFydEJlZm9yZShuKTsNCgkJCQlyLnNldEVuZEJlZm9yZShuKTsNCgkJCQlzZS5zZXRSbmcocik7DQoJCQl9DQoJCX0sDQoNCgkJZ2V0UGFyZW50QmxvY2sgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgZCA9IHRoaXMuZG9tOw0KDQoJCQlyZXR1cm4gZC5nZXRQYXJlbnQobiwgZC5pc0Jsb2NrKTsNCgkJfSwNCg0KCQlpbnNlcnRQYXJhIDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBkb20gPSBlZC5kb20sIGQgPSBlZC5nZXREb2MoKSwgc2UgPSBlZC5zZXR0aW5ncywgcyA9IGVkLnNlbGVjdGlvbi5nZXRTZWwoKSwgciA9IHMuZ2V0UmFuZ2VBdCgwKSwgYiA9IGQuYm9keTsNCgkJCXZhciByYiwgcmEsIGRpciwgc24sIHNvLCBlbiwgZW8sIHNiLCBlYiwgYm4sIGJlZiwgYWZ0LCBzYywgZWMsIG4sIHZwID0gZG9tLmdldFZpZXdQb3J0KGVkLmdldFdpbigpKSwgeSwgY2gsIGNhcjsNCg0KCQkJLy8gSWYgcm9vdCBibG9ja3MgYXJlIGZvcmNlZCB0aGVuIHVzZSBPcGVyYXMgZGVmYXVsdCBiZWhhdmlvciBzaW5jZSBpdCdzIHJlYWxseSBnb29kDQovLyBSZW1vdmVkIGR1ZSB0byBidWc6ICMxODUzODE2DQovLwkJCWlmIChzZS5mb3JjZWRfcm9vdF9ibG9jayAmJiBpc09wZXJhKQ0KLy8JCQkJcmV0dXJuIFRSVUU7DQoNCgkJCS8vIFNldHVwIGJlZm9yZSByYW5nZQ0KCQkJcmIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoNCgkJCS8vIElmIGlzIGJlZm9yZSB0aGUgZmlyc3QgYmxvY2sgZWxlbWVudCBhbmQgaW4gYm9keSwgdGhlbiBtb3ZlIGl0IGludG8gZmlyc3QgYmxvY2sgZWxlbWVudA0KCQkJcmIuc2V0U3RhcnQocy5hbmNob3JOb2RlLCBzLmFuY2hvck9mZnNldCk7DQoJCQlyYi5jb2xsYXBzZShUUlVFKTsNCg0KCQkJLy8gU2V0dXAgYWZ0ZXIgcmFuZ2UNCgkJCXJhID0gZC5jcmVhdGVSYW5nZSgpOw0KDQoJCQkvLyBJZiBpcyBiZWZvcmUgdGhlIGZpcnN0IGJsb2NrIGVsZW1lbnQgYW5kIGluIGJvZHksIHRoZW4gbW92ZSBpdCBpbnRvIGZpcnN0IGJsb2NrIGVsZW1lbnQNCgkJCXJhLnNldFN0YXJ0KHMuZm9jdXNOb2RlLCBzLmZvY3VzT2Zmc2V0KTsNCgkJCXJhLmNvbGxhcHNlKFRSVUUpOw0KDQoJCQkvLyBTZXR1cCBzdGFydC9lbmQgcG9pbnRzDQoJCQlkaXIgPSByYi5jb21wYXJlQm91bmRhcnlQb2ludHMocmIuU1RBUlRfVE9fRU5ELCByYSkgPCAwOw0KCQkJc24gPSBkaXIgPyBzLmFuY2hvck5vZGUgOiBzLmZvY3VzTm9kZTsNCgkJCXNvID0gZGlyID8gcy5hbmNob3JPZmZzZXQgOiBzLmZvY3VzT2Zmc2V0Ow0KCQkJZW4gPSBkaXIgPyBzLmZvY3VzTm9kZSA6IHMuYW5jaG9yTm9kZTsNCgkJCWVvID0gZGlyID8gcy5mb2N1c09mZnNldCA6IHMuYW5jaG9yT2Zmc2V0Ow0KDQoJCQkvLyBJZiBzZWxlY3Rpb24gaXMgaW4gZW1wdHkgdGFibGUgY2VsbA0KCQkJaWYgKHNuID09PSBlbiAmJiAvXihURHxUSCkkLy50ZXN0KHNuLm5vZGVOYW1lKSkgew0KCQkJCWlmIChzbi5maXJzdENoaWxkLm5vZGVOYW1lID09ICdCUicpDQoJCQkJCWRvbS5yZW1vdmUoc24uZmlyc3RDaGlsZCk7IC8vIFJlbW92ZSBCUg0KDQoJCQkJLy8gQ3JlYXRlIHR3byBuZXcgYmxvY2sgZWxlbWVudHMNCgkJCQlpZiAoc24uY2hpbGROb2Rlcy5sZW5ndGggPT0gMCkgew0KCQkJCQllZC5kb20uYWRkKHNuLCBzZS5lbGVtZW50LCBudWxsLCAnPGJyIC8+Jyk7DQoJCQkJCWFmdCA9IGVkLmRvbS5hZGQoc24sIHNlLmVsZW1lbnQsIG51bGwsICc8YnIgLz4nKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQluID0gc24uaW5uZXJIVE1MOw0KCQkJCQlzbi5pbm5lckhUTUwgPSAnJzsNCgkJCQkJZWQuZG9tLmFkZChzbiwgc2UuZWxlbWVudCwgbnVsbCwgbik7DQoJCQkJCWFmdCA9IGVkLmRvbS5hZGQoc24sIHNlLmVsZW1lbnQsIG51bGwsICc8YnIgLz4nKTsNCgkJCQl9DQoNCgkJCQkvLyBNb3ZlIGNhcmV0IGludG8gdGhlIGxhc3Qgb25lDQoJCQkJciA9IGQuY3JlYXRlUmFuZ2UoKTsNCgkJCQlyLnNlbGVjdE5vZGVDb250ZW50cyhhZnQpOw0KCQkJCXIuY29sbGFwc2UoMSk7DQoJCQkJZWQuc2VsZWN0aW9uLnNldFJuZyhyKTsNCg0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCg0KCQkJLy8gSWYgdGhlIGNhcmV0IGlzIGluIGFuIGludmFsaWQgbG9jYXRpb24gaW4gRkYgd2UgbmVlZCB0byBtb3ZlIGl0IGludG8gdGhlIGZpcnN0IGJsb2NrDQoJCQlpZiAoc24gPT0gYiAmJiBlbiA9PSBiICYmIGIuZmlyc3RDaGlsZCAmJiBlZC5kb20uaXNCbG9jayhiLmZpcnN0Q2hpbGQpKSB7DQoJCQkJc24gPSBlbiA9IHNuLmZpcnN0Q2hpbGQ7DQoJCQkJc28gPSBlbyA9IDA7DQoJCQkJcmIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoJCQkJcmIuc2V0U3RhcnQoc24sIDApOw0KCQkJCXJhID0gZC5jcmVhdGVSYW5nZSgpOw0KCQkJCXJhLnNldFN0YXJ0KGVuLCAwKTsNCgkJCX0NCg0KCQkJLy8gTmV2ZXIgdXNlIGJvZHkgYXMgc3RhcnQgb3IgZW5kIG5vZGUNCgkJCXNuID0gc24ubm9kZU5hbWUgPT0gIkhUTUwiID8gZC5ib2R5IDogc247IC8vIEZpeCBmb3IgT3BlcmEgYnVnOiBodHRwczovL2J1Z3Mub3BlcmEuY29tL3Nob3dfYnVnLmNnaT9pZD0yNzMyMjQmY29tbWVudHM9eWVzDQoJCQlzbiA9IHNuLm5vZGVOYW1lID09ICJCT0RZIiA/IHNuLmZpcnN0Q2hpbGQgOiBzbjsNCgkJCWVuID0gZW4ubm9kZU5hbWUgPT0gIkhUTUwiID8gZC5ib2R5IDogZW47IC8vIEZpeCBmb3IgT3BlcmEgYnVnOiBodHRwczovL2J1Z3Mub3BlcmEuY29tL3Nob3dfYnVnLmNnaT9pZD0yNzMyMjQmY29tbWVudHM9eWVzDQoJCQllbiA9IGVuLm5vZGVOYW1lID09ICJCT0RZIiA/IGVuLmZpcnN0Q2hpbGQgOiBlbjsNCg0KCQkJLy8gR2V0IHN0YXJ0IGFuZCBlbmQgYmxvY2tzDQoJCQlzYiA9IHQuZ2V0UGFyZW50QmxvY2soc24pOw0KCQkJZWIgPSB0LmdldFBhcmVudEJsb2NrKGVuKTsNCgkJCWJuID0gc2IgPyBzYi5ub2RlTmFtZSA6IHNlLmVsZW1lbnQ7IC8vIEdldCBibG9jayBuYW1lIHRvIGNyZWF0ZQ0KDQoJCQkvLyBSZXR1cm4gaW5zaWRlIGxpc3QgdXNlIGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvcg0KCQkJaWYgKG4gPSB0LmRvbS5nZXRQYXJlbnQoc2IsICdsaSxwcmUnKSkgew0KCQkJCWlmIChuLm5vZGVOYW1lID09ICdMSScpDQoJCQkJCXJldHVybiBzcGxpdExpc3QoZWQuc2VsZWN0aW9uLCB0LmRvbSwgbik7DQoNCgkJCQlyZXR1cm4gVFJVRTsNCgkJCX0NCg0KCQkJLy8gSWYgY2FwdGlvbiBvciBhYnNvbHV0ZSBsYXllcnMgdGhlbiBhbHdheXMgZ2VuZXJhdGUgbmV3IGJsb2NrcyB3aXRoaW4NCgkJCWlmIChzYiAmJiAoc2Iubm9kZU5hbWUgPT0gJ0NBUFRJT04nIHx8IC9hYnNvbHV0ZXxyZWxhdGl2ZXxmaXhlZC9naS50ZXN0KGRvbS5nZXRTdHlsZShzYiwgJ3Bvc2l0aW9uJywgMSkpKSkgew0KCQkJCWJuID0gc2UuZWxlbWVudDsNCgkJCQlzYiA9IG51bGw7DQoJCQl9DQoNCgkJCS8vIElmIGNhcHRpb24gb3IgYWJzb2x1dGUgbGF5ZXJzIHRoZW4gYWx3YXlzIGdlbmVyYXRlIG5ldyBibG9ja3Mgd2l0aGluDQoJCQlpZiAoZWIgJiYgKGViLm5vZGVOYW1lID09ICdDQVBUSU9OJyB8fCAvYWJzb2x1dGV8cmVsYXRpdmV8Zml4ZWQvZ2kudGVzdChkb20uZ2V0U3R5bGUoc2IsICdwb3NpdGlvbicsIDEpKSkpIHsNCgkJCQlibiA9IHNlLmVsZW1lbnQ7DQoJCQkJZWIgPSBudWxsOw0KCQkJfQ0KDQoJCQkvLyBVc2UgUCBpbnN0ZWFkDQoJCQlpZiAoLyhURHxUQUJMRXxUSHxDQVBUSU9OKS8udGVzdChibikgfHwgKHNiICYmIGJuID09ICJESVYiICYmIC9sZWZ0fHJpZ2h0L2dpLnRlc3QoZG9tLmdldFN0eWxlKHNiLCAnZmxvYXQnLCAxKSkpKSB7DQoJCQkJYm4gPSBzZS5lbGVtZW50Ow0KCQkJCXNiID0gZWIgPSBudWxsOw0KCQkJfQ0KDQoJCQkvLyBTZXR1cCBuZXcgYmVmb3JlIGFuZCBhZnRlciBibG9ja3MNCgkJCWJlZiA9IChzYiAmJiBzYi5ub2RlTmFtZSA9PSBibikgPyBzYi5jbG9uZU5vZGUoMCkgOiBlZC5kb20uY3JlYXRlKGJuKTsNCgkJCWFmdCA9IChlYiAmJiBlYi5ub2RlTmFtZSA9PSBibikgPyBlYi5jbG9uZU5vZGUoMCkgOiBlZC5kb20uY3JlYXRlKGJuKTsNCg0KCQkJLy8gUmVtb3ZlIGlkIGZyb20gYWZ0ZXIgY2xvbmUNCgkJCWFmdC5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7DQoNCgkJCS8vIElzIGhlYWRlciBhbmQgY3Vyc29yIGlzIGF0IHRoZSBlbmQsIHRoZW4gZm9yY2UgcGFyYWdyYXBoIHVuZGVyDQoJCQlpZiAoL14oSFsxLTZdKSQvLnRlc3QoYm4pICYmIGlzQXRFbmQociwgc2IpKQ0KCQkJCWFmdCA9IGVkLmRvbS5jcmVhdGUoc2UuZWxlbWVudCk7DQoNCgkJCS8vIEZpbmQgc3RhcnQgY2hvcCBub2RlDQoJCQluID0gc2MgPSBzbjsNCgkJCWRvIHsNCgkJCQlpZiAobiA9PSBiIHx8IG4ubm9kZVR5cGUgPT0gOSB8fCB0LmRvbS5pc0Jsb2NrKG4pIHx8IC8oVER8VEFCTEV8VEh8Q0FQVElPTikvLnRlc3Qobi5ub2RlTmFtZSkpDQoJCQkJCWJyZWFrOw0KDQoJCQkJc2MgPSBuOw0KCQkJfSB3aGlsZSAoKG4gPSBuLnByZXZpb3VzU2libGluZyA/IG4ucHJldmlvdXNTaWJsaW5nIDogbi5wYXJlbnROb2RlKSk7DQoNCgkJCS8vIEZpbmQgZW5kIGNob3Agbm9kZQ0KCQkJbiA9IGVjID0gZW47DQoJCQlkbyB7DQoJCQkJaWYgKG4gPT0gYiB8fCBuLm5vZGVUeXBlID09IDkgfHwgdC5kb20uaXNCbG9jayhuKSB8fCAvKFREfFRBQkxFfFRIfENBUFRJT04pLy50ZXN0KG4ubm9kZU5hbWUpKQ0KCQkJCQlicmVhazsNCg0KCQkJCWVjID0gbjsNCgkJCX0gd2hpbGUgKChuID0gbi5uZXh0U2libGluZyA/IG4ubmV4dFNpYmxpbmcgOiBuLnBhcmVudE5vZGUpKTsNCg0KCQkJLy8gUGxhY2UgZmlyc3QgY2hvcCBwYXJ0IGludG8gYmVmb3JlIGJsb2NrIGVsZW1lbnQNCgkJCWlmIChzYy5ub2RlTmFtZSA9PSBibikNCgkJCQlyYi5zZXRTdGFydChzYywgMCk7DQoJCQllbHNlDQoJCQkJcmIuc2V0U3RhcnRCZWZvcmUoc2MpOw0KDQoJCQlyYi5zZXRFbmQoc24sIHNvKTsNCgkJCWJlZi5hcHBlbmRDaGlsZChyYi5jbG9uZUNvbnRlbnRzKCkgfHwgZC5jcmVhdGVUZXh0Tm9kZSgnJykpOyAvLyBFbXB0eSB0ZXh0IG5vZGUgbmVlZGVkIGZvciBTYWZhcmkNCg0KCQkJLy8gUGxhY2Ugc2VjbmQgY2hvcCBwYXJ0IHdpdGhpbiBuZXcgYmxvY2sgZWxlbWVudA0KCQkJdHJ5IHsNCgkJCQlyYS5zZXRFbmRBZnRlcihlYyk7DQoJCQl9IGNhdGNoKGV4KSB7DQoJCQkJLy9jb25zb2xlLmRlYnVnKHMuZm9jdXNOb2RlLCBzLmZvY3VzT2Zmc2V0KTsNCgkJCX0NCg0KCQkJcmEuc2V0U3RhcnQoZW4sIGVvKTsNCgkJCWFmdC5hcHBlbmRDaGlsZChyYS5jbG9uZUNvbnRlbnRzKCkgfHwgZC5jcmVhdGVUZXh0Tm9kZSgnJykpOyAvLyBFbXB0eSB0ZXh0IG5vZGUgbmVlZGVkIGZvciBTYWZhcmkNCg0KCQkJLy8gQ3JlYXRlIHJhbmdlIGFyb3VuZCBldmVyeXRoaW5nDQoJCQlyID0gZC5jcmVhdGVSYW5nZSgpOw0KCQkJaWYgKCFzYy5wcmV2aW91c1NpYmxpbmcgJiYgc2MucGFyZW50Tm9kZS5ub2RlTmFtZSA9PSBibikgew0KCQkJCXIuc2V0U3RhcnRCZWZvcmUoc2MucGFyZW50Tm9kZSk7DQoJCQl9IGVsc2Ugew0KCQkJCWlmIChyYi5zdGFydENvbnRhaW5lci5ub2RlTmFtZSA9PSBibiAmJiByYi5zdGFydE9mZnNldCA9PSAwKQ0KCQkJCQlyLnNldFN0YXJ0QmVmb3JlKHJiLnN0YXJ0Q29udGFpbmVyKTsNCgkJCQllbHNlDQoJCQkJCXIuc2V0U3RhcnQocmIuc3RhcnRDb250YWluZXIsIHJiLnN0YXJ0T2Zmc2V0KTsNCgkJCX0NCg0KCQkJaWYgKCFlYy5uZXh0U2libGluZyAmJiBlYy5wYXJlbnROb2RlLm5vZGVOYW1lID09IGJuKQ0KCQkJCXIuc2V0RW5kQWZ0ZXIoZWMucGFyZW50Tm9kZSk7DQoJCQllbHNlDQoJCQkJci5zZXRFbmQocmEuZW5kQ29udGFpbmVyLCByYS5lbmRPZmZzZXQpOw0KDQoJCQkvLyBEZWxldGUgYW5kIHJlcGxhY2UgaXQgd2l0aCBuZXcgYmxvY2sgZWxlbWVudHMNCgkJCXIuZGVsZXRlQ29udGVudHMoKTsNCg0KCQkJaWYgKGlzT3BlcmEpDQoJCQkJZWQuZ2V0V2luKCkuc2Nyb2xsVG8oMCwgdnAueSk7DQoNCgkJCS8vIE5ldmVyIHdyYXAgYmxvY2tzIGluIGJsb2Nrcw0KCQkJaWYgKGJlZi5maXJzdENoaWxkICYmIGJlZi5maXJzdENoaWxkLm5vZGVOYW1lID09IGJuKQ0KCQkJCWJlZi5pbm5lckhUTUwgPSBiZWYuZmlyc3RDaGlsZC5pbm5lckhUTUw7DQoNCgkJCWlmIChhZnQuZmlyc3RDaGlsZCAmJiBhZnQuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PSBibikNCgkJCQlhZnQuaW5uZXJIVE1MID0gYWZ0LmZpcnN0Q2hpbGQuaW5uZXJIVE1MOw0KDQoJCQkvLyBQYWRkIGVtcHR5IGJsb2Nrcw0KCQkJaWYgKGlzRW1wdHkoYmVmKSkNCgkJCQliZWYuaW5uZXJIVE1MID0gJzxiciAvPic7DQoNCgkJCWZ1bmN0aW9uIGFwcGVuZFN0eWxlcyhlLCBlbikgew0KCQkJCXZhciBubCA9IFtdLCBubiwgbiwgaTsNCg0KCQkJCWUuaW5uZXJIVE1MID0gJyc7DQoNCgkJCQkvLyBNYWtlIGNsb25lcyBvZiBzdHlsZSBlbGVtZW50cw0KCQkJCWlmIChzZS5rZWVwX3N0eWxlcykgew0KCQkJCQluID0gZW47DQoJCQkJCWRvIHsNCgkJCQkJCS8vIFdlIG9ubHkgd2FudCBzdHlsZSBzcGVjaWZpYyBlbGVtZW50cw0KCQkJCQkJaWYgKC9eKFNQQU58U1RST05HfEJ8RU18SXxGT05UfFNUUklLRXxVKSQvLnRlc3Qobi5ub2RlTmFtZSkpIHsNCgkJCQkJCQlubiA9IG4uY2xvbmVOb2RlKEZBTFNFKTsNCgkJCQkJCQlkb20uc2V0QXR0cmliKG5uLCAnaWQnLCAnJyk7IC8vIFJlbW92ZSBJRCBzaW5jZSBpdCBuZWVkcyB0byBiZSB1bmlxdWUNCgkJCQkJCQlubC5wdXNoKG5uKTsNCgkJCQkJCX0NCgkJCQkJfSB3aGlsZSAobiA9IG4ucGFyZW50Tm9kZSk7DQoJCQkJfQ0KDQoJCQkJLy8gQXBwZW5kIHN0eWxlIGVsZW1lbnRzIHRvIGFmdA0KCQkJCWlmIChubC5sZW5ndGggPiAwKSB7DQoJCQkJCWZvciAoaSA9IG5sLmxlbmd0aCAtIDEsIG5uID0gZTsgaSA+PSAwOyBpLS0pDQoJCQkJCQlubiA9IG5uLmFwcGVuZENoaWxkKG5sW2ldKTsNCg0KCQkJCQkvLyBQYWRkIG1vc3QgaW5uZXIgc3R5bGUgZWxlbWVudA0KCQkJCQlubFswXS5pbm5lckhUTUwgPSBpc09wZXJhID8gJyZuYnNwOycgOiAnPGJyIC8+JzsgLy8gRXh0cmEgc3BhY2UgZm9yIE9wZXJhIHNvIHRoYXQgdGhlIGNhcmV0IGNhbiBtb3ZlIHRoZXJlDQoJCQkJCXJldHVybiBubFswXTsgLy8gTW92ZSBjYXJldCB0byBtb3N0IGlubmVyIGVsZW1lbnQNCgkJCQl9IGVsc2UNCgkJCQkJZS5pbm5lckhUTUwgPSBpc09wZXJhID8gJyZuYnNwOycgOiAnPGJyIC8+JzsgLy8gRXh0cmEgc3BhY2UgZm9yIE9wZXJhIHNvIHRoYXQgdGhlIGNhcmV0IGNhbiBtb3ZlIHRoZXJlDQoJCQl9Ow0KDQoJCQkvLyBGaWxsIGVtcHR5IGFmdGVyYmxvb2sgd2l0aCBjdXJyZW50IHN0eWxlDQoJCQlpZiAoaXNFbXB0eShhZnQpKQ0KCQkJCWNhciA9IGFwcGVuZFN0eWxlcyhhZnQsIGVuKTsNCg0KCQkJLy8gT3BlcmEgbmVlZHMgdGhpcyBvbmUgYmFja3dhcmRzIGZvciBvbGRlciB2ZXJzaW9ucw0KCQkJaWYgKGlzT3BlcmEgJiYgcGFyc2VGbG9hdChvcGVyYS52ZXJzaW9uKCkpIDwgOS41KSB7DQoJCQkJci5pbnNlcnROb2RlKGJlZik7DQoJCQkJci5pbnNlcnROb2RlKGFmdCk7DQoJCQl9IGVsc2Ugew0KCQkJCXIuaW5zZXJ0Tm9kZShhZnQpOw0KCQkJCXIuaW5zZXJ0Tm9kZShiZWYpOw0KCQkJfQ0KDQoJCQkvLyBOb3JtYWxpemUNCgkJCWFmdC5ub3JtYWxpemUoKTsNCgkJCWJlZi5ub3JtYWxpemUoKTsNCg0KCQkJZnVuY3Rpb24gZmlyc3Qobikgew0KCQkJCXJldHVybiBkLmNyZWF0ZVRyZWVXYWxrZXIobiwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwsIEZBTFNFKS5uZXh0Tm9kZSgpIHx8IG47DQoJCQl9Ow0KDQoJCQkvLyBNb3ZlIGN1cnNvciBhbmQgc2Nyb2xsIGludG8gdmlldw0KCQkJciA9IGQuY3JlYXRlUmFuZ2UoKTsNCgkJCXIuc2VsZWN0Tm9kZUNvbnRlbnRzKGlzR2Vja28gPyBmaXJzdChjYXIgfHwgYWZ0KSA6IGNhciB8fCBhZnQpOw0KCQkJci5jb2xsYXBzZSgxKTsNCgkJCXMucmVtb3ZlQWxsUmFuZ2VzKCk7DQoJCQlzLmFkZFJhbmdlKHIpOw0KDQoJCQkvLyBzY3JvbGxJbnRvVmlldyBzZWVtcyB0byBzY3JvbGwgdGhlIHBhcmVudCB3aW5kb3cgaW4gbW9zdCBicm93c2VycyBub3cgaW5jbHVkaW5nIEZGIDMuMGI0IHNvIGl0J3MgdGltZSB0byBzdG9wIHVzaW5nIGl0IGFuZCBkbyBpdCBvdXIgc2VsZnMNCgkJCXkgPSBlZC5kb20uZ2V0UG9zKGFmdCkueTsNCgkJCWNoID0gYWZ0LmNsaWVudEhlaWdodDsNCg0KCQkJLy8gSXMgZWxlbWVudCB3aXRoaW4gdmlld3BvcnQNCgkJCWlmICh5IDwgdnAueSB8fCB5ICsgY2ggPiB2cC55ICsgdnAuaCkgew0KCQkJCWVkLmdldFdpbigpLnNjcm9sbFRvKDAsIHkgPCB2cC55ID8geSA6IHkgLSB2cC5oICsgMjUpOyAvLyBOZWVkcyB0byBiZSBoYXJkY29kZWQgdG8gcm91Z2hseSBvbmUgbGluZSBvZiB0ZXh0IGlmIGEgaHVnZSB0ZXh0IGJsb2NrIGlzIGJyb2tlbiBpbnRvIHR3byBibG9ja3MNCgkJCQkvL2NvbnNvbGUuZGVidWcoJ1NDUk9MTCEnLCAndnAueTogJyArIHZwLnksICd5JyArIHksICd2cC5oJyArIHZwLmgsICdjbGllbnRIZWlnaHQnICsgYWZ0LmNsaWVudEhlaWdodCwgJ3l5eTogJyArICh5IDwgdnAueSA/IHkgOiB5IC0gdnAuaCArIGFmdC5jbGllbnRIZWlnaHQpKTsNCgkJCX0NCg0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9LA0KDQoJCWJhY2tzcGFjZURlbGV0ZSA6IGZ1bmN0aW9uKGUsIGJzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIGIgPSBlZC5nZXRCb2R5KCksIGRvbSA9IGVkLmRvbSwgbiwgc2UgPSBlZC5zZWxlY3Rpb24sIHIgPSBzZS5nZXRSbmcoKSwgc2MgPSByLnN0YXJ0Q29udGFpbmVyLCBuLCB3LCB0biwgd2Fsa2VyOw0KDQoJCQkvLyBEZWxldGUgd2hlbiBjYXJldCBpcyBiZWhpbmQgYSBlbGVtZW50IGRvZXNuJ3Qgd29yayBjb3JyZWN0bHkgb24gR2Vja28gc2VlICMzMDExNjUxDQoJCQlpZiAoIWJzICYmIHIuY29sbGFwc2VkICYmIHNjLm5vZGVUeXBlID09IDEgJiYgci5zdGFydE9mZnNldCA9PSBzYy5jaGlsZE5vZGVzLmxlbmd0aCkgew0KCQkJCXdhbGtlciA9IG5ldyB0aW55bWNlLmRvbS5UcmVlV2Fsa2VyKHNjLmxhc3RDaGlsZCwgc2MpOw0KDQoJCQkJLy8gV2FsayB0aGUgZG9tIGJhY2t3YXJkcyB1bnRpbCB3ZSBmaW5kIGEgdGV4dCBub2RlDQoJCQkJZm9yIChuID0gc2MubGFzdENoaWxkOyBuOyBuID0gd2Fsa2VyLnByZXYoKSkgew0KCQkJCQlpZiAobi5ub2RlVHlwZSA9PSAzKSB7DQoJCQkJCQlyLnNldFN0YXJ0KG4sIG4ubm9kZVZhbHVlLmxlbmd0aCk7DQoJCQkJCQlyLmNvbGxhcHNlKHRydWUpOw0KCQkJCQkJc2Uuc2V0Um5nKHIpOw0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBUaGUgY2FyZXQgc29tZXRpbWVzIGdldHMgc3R1Y2sgaW4gR2Vja28gaWYgeW91IGRlbGV0ZSBlbXB0eSBwYXJhZ3JhcGhzDQoJCQkvLyBUaGlzIHdvcmthcm91bmQgcmVtb3ZlcyB0aGUgZWxlbWVudCBieSBoYW5kIGFuZCBtb3ZlcyB0aGUgY2FyZXQgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQNCgkJCWlmIChzYyAmJiBlZC5kb20uaXNCbG9jayhzYykgJiYgIS9eKFREfFRIKSQvLnRlc3Qoc2Mubm9kZU5hbWUpICYmIGJzKSB7DQoJCQkJaWYgKHNjLmNoaWxkTm9kZXMubGVuZ3RoID09IDAgfHwgKHNjLmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJiYgc2MuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PSAnQlInKSkgew0KCQkJCQkvLyBGaW5kIHByZXZpb3VzIGJsb2NrIGVsZW1lbnQNCgkJCQkJbiA9IHNjOw0KCQkJCQl3aGlsZSAoKG4gPSBuLnByZXZpb3VzU2libGluZykgJiYgIWVkLmRvbS5pc0Jsb2NrKG4pKSA7DQoNCgkJCQkJaWYgKG4pIHsNCgkJCQkJCWlmIChzYyAhPSBiLmZpcnN0Q2hpbGQpIHsNCgkJCQkJCQkvLyBGaW5kIGxhc3QgdGV4dCBub2RlDQoJCQkJCQkJdyA9IGVkLmRvbS5kb2MuY3JlYXRlVHJlZVdhbGtlcihuLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCwgbnVsbCwgRkFMU0UpOw0KCQkJCQkJCXdoaWxlICh0biA9IHcubmV4dE5vZGUoKSkNCgkJCQkJCQkJbiA9IHRuOw0KDQoJCQkJCQkJLy8gUGxhY2UgY2FyZXQgYXQgdGhlIGVuZCBvZiBsYXN0IHRleHQgbm9kZQ0KCQkJCQkJCXIgPSBlZC5nZXREb2MoKS5jcmVhdGVSYW5nZSgpOw0KCQkJCQkJCXIuc2V0U3RhcnQobiwgbi5ub2RlVmFsdWUgPyBuLm5vZGVWYWx1ZS5sZW5ndGggOiAwKTsNCgkJCQkJCQlyLnNldEVuZChuLCBuLm5vZGVWYWx1ZSA/IG4ubm9kZVZhbHVlLmxlbmd0aCA6IDApOw0KCQkJCQkJCXNlLnNldFJuZyhyKTsNCg0KCQkJCQkJCS8vIFJlbW92ZSB0aGUgdGFyZ2V0IGNvbnRhaW5lcg0KCQkJCQkJCWVkLmRvbS5yZW1vdmUoc2MpOw0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm4gRXZlbnQuY2FuY2VsKGUpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgkvLyBTaG9ydGVuIG5hbWVzDQoJdmFyIERPTSA9IHRpbnltY2UuRE9NLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBlYWNoID0gdGlueW1jZS5lYWNoLCBleHRlbmQgPSB0aW55bWNlLmV4dGVuZDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLkNvbnRyb2xNYW5hZ2VyJywgew0KCQlDb250cm9sTWFuYWdlciA6IGZ1bmN0aW9uKGVkLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGk7DQoNCgkJCXMgPSBzIHx8IHt9Ow0KCQkJdC5lZGl0b3IgPSBlZDsNCgkJCXQuY29udHJvbHMgPSB7fTsNCgkJCXQub25BZGQgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodCk7DQoJCQl0Lm9uUG9zdFJlbmRlciA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0KTsNCgkJCXQucHJlZml4ID0gcy5wcmVmaXggfHwgZWQuaWQgKyAnXyc7DQoJCQl0Ll9jbHMgPSB7fTsNCg0KCQkJdC5vblBvc3RSZW5kZXIuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCWVhY2godC5jb250cm9scywgZnVuY3Rpb24oYykgew0KCQkJCQljLnBvc3RSZW5kZXIoKTsNCgkJCQl9KTsNCgkJCX0pOw0KCQl9LA0KDQoJCWdldCA6IGZ1bmN0aW9uKGlkKSB7DQoJCQlyZXR1cm4gdGhpcy5jb250cm9sc1t0aGlzLnByZWZpeCArIGlkXSB8fCB0aGlzLmNvbnRyb2xzW2lkXTsNCgkJfSwNCg0KCQlzZXRBY3RpdmUgOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdmFyIGMgPSBudWxsOw0KDQoJCQlpZiAoYyA9IHRoaXMuZ2V0KGlkKSkNCgkJCQljLnNldEFjdGl2ZShzKTsNCg0KCQkJcmV0dXJuIGM7DQoJCX0sDQoNCgkJc2V0RGlzYWJsZWQgOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdmFyIGMgPSBudWxsOw0KDQoJCQlpZiAoYyA9IHRoaXMuZ2V0KGlkKSkNCgkJCQljLnNldERpc2FibGVkKHMpOw0KDQoJCQlyZXR1cm4gYzsNCgkJfSwNCg0KCQlhZGQgOiBmdW5jdGlvbihjKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWlmIChjKSB7DQoJCQkJdC5jb250cm9sc1tjLmlkXSA9IGM7DQoJCQkJdC5vbkFkZC5kaXNwYXRjaChjLCB0KTsNCgkJCX0NCg0KCQkJcmV0dXJuIGM7DQoJCX0sDQoNCgkJY3JlYXRlQ29udHJvbCA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciBjLCB0ID0gdGhpcywgZWQgPSB0LmVkaXRvcjsNCg0KCQkJZWFjaChlZC5wbHVnaW5zLCBmdW5jdGlvbihwKSB7DQoJCQkJaWYgKHAuY3JlYXRlQ29udHJvbCkgew0KCQkJCQljID0gcC5jcmVhdGVDb250cm9sKG4sIHQpOw0KDQoJCQkJCWlmIChjKQ0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQlzd2l0Y2ggKG4pIHsNCgkJCQljYXNlICJ8IjoNCgkJCQljYXNlICJzZXBhcmF0b3IiOg0KCQkJCQlyZXR1cm4gdC5jcmVhdGVTZXBhcmF0b3IoKTsNCgkJCX0NCg0KCQkJaWYgKCFjICYmIGVkLmJ1dHRvbnMgJiYgKGMgPSBlZC5idXR0b25zW25dKSkNCgkJCQlyZXR1cm4gdC5jcmVhdGVCdXR0b24obiwgYyk7DQoNCgkJCXJldHVybiB0LmFkZChjKTsNCgkJfSwNCg0KCQljcmVhdGVEcm9wTWVudSA6IGZ1bmN0aW9uKGlkLCBzLCBjYykgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBjLCBibSwgdiwgY2xzOw0KDQoJCQlzID0gZXh0ZW5kKHsNCgkJCQknY2xhc3MnIDogJ21jZURyb3BEb3duJywNCgkJCQljb25zdHJhaW4gOiBlZC5zZXR0aW5ncy5jb25zdHJhaW5fbWVudXMNCgkJCX0sIHMpOw0KDQoJCQlzWydjbGFzcyddID0gc1snY2xhc3MnXSArICcgJyArIGVkLmdldFBhcmFtKCdza2luJykgKyAnU2tpbic7DQoJCQlpZiAodiA9IGVkLmdldFBhcmFtKCdza2luX3ZhcmlhbnQnKSkNCgkJCQlzWydjbGFzcyddICs9ICcgJyArIGVkLmdldFBhcmFtKCdza2luJykgKyAnU2tpbicgKyB2LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgdi5zdWJzdHJpbmcoMSk7DQoNCgkJCWlkID0gdC5wcmVmaXggKyBpZDsNCgkJCWNscyA9IGNjIHx8IHQuX2Nscy5kcm9wbWVudSB8fCB0aW55bWNlLnVpLkRyb3BNZW51Ow0KCQkJYyA9IHQuY29udHJvbHNbaWRdID0gbmV3IGNscyhpZCwgcyk7DQoJCQljLm9uQWRkSXRlbS5hZGQoZnVuY3Rpb24oYywgbykgew0KCQkJCXZhciBzID0gby5zZXR0aW5nczsNCg0KCQkJCXMudGl0bGUgPSBlZC5nZXRMYW5nKHMudGl0bGUsIHMudGl0bGUpOw0KDQoJCQkJaWYgKCFzLm9uY2xpY2spIHsNCgkJCQkJcy5vbmNsaWNrID0gZnVuY3Rpb24odikgew0KCQkJCQkJaWYgKHMuY21kKQ0KCQkJCQkJCWVkLmV4ZWNDb21tYW5kKHMuY21kLCBzLnVpIHx8IGZhbHNlLCBzLnZhbHVlKTsNCgkJCQkJfTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJZWQub25SZW1vdmUuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCWMuZGVzdHJveSgpOw0KCQkJfSk7DQoNCgkJCS8vIEZpeCBmb3IgYnVnICMxODk3Nzg1LCAjMTg5ODAwNw0KCQkJaWYgKHRpbnltY2UuaXNJRSkgew0KCQkJCWMub25TaG93TWVudS5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCS8vIElFIDggbmVlZHMgZm9jdXMgaW4gb3JkZXIgdG8gc3RvcmUgYXdheSBhIHJhbmdlIHdpdGggdGhlIGN1cnJlbnQgY29sbGFwc2VkIGNhcmV0IGxvY2F0aW9uDQoJCQkJCWVkLmZvY3VzKCk7DQoNCgkJCQkJYm0gPSBlZC5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMSk7DQoJCQkJfSk7DQoNCgkJCQljLm9uSGlkZU1lbnUuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoYm0pIHsNCgkJCQkJCWVkLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhibSk7DQoJCQkJCQlibSA9IDA7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJcmV0dXJuIHQuYWRkKGMpOw0KCQl9LA0KDQoJCWNyZWF0ZUxpc3RCb3ggOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgY21kLCBjLCBjbHM7DQoNCgkJCWlmICh0LmdldChpZCkpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCXMudGl0bGUgPSBlZC50cmFuc2xhdGUocy50aXRsZSk7DQoJCQlzLnNjb3BlID0gcy5zY29wZSB8fCBlZDsNCg0KCQkJaWYgKCFzLm9uc2VsZWN0KSB7DQoJCQkJcy5vbnNlbGVjdCA9IGZ1bmN0aW9uKHYpIHsNCgkJCQkJZWQuZXhlY0NvbW1hbmQocy5jbWQsIHMudWkgfHwgZmFsc2UsIHYgfHwgcy52YWx1ZSk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJcyA9IGV4dGVuZCh7DQoJCQkJdGl0bGUgOiBzLnRpdGxlLA0KCQkJCSdjbGFzcycgOiAnbWNlXycgKyBpZCwNCgkJCQlzY29wZSA6IHMuc2NvcGUsDQoJCQkJY29udHJvbF9tYW5hZ2VyIDogdA0KCQkJfSwgcyk7DQoNCgkJCWlkID0gdC5wcmVmaXggKyBpZDsNCg0KCQkJaWYgKGVkLnNldHRpbmdzLnVzZV9uYXRpdmVfc2VsZWN0cykNCgkJCQljID0gbmV3IHRpbnltY2UudWkuTmF0aXZlTGlzdEJveChpZCwgcyk7DQoJCQllbHNlIHsNCgkJCQljbHMgPSBjYyB8fCB0Ll9jbHMubGlzdGJveCB8fCB0aW55bWNlLnVpLkxpc3RCb3g7DQoJCQkJYyA9IG5ldyBjbHMoaWQsIHMpOw0KCQkJfQ0KDQoJCQl0LmNvbnRyb2xzW2lkXSA9IGM7DQoNCgkJCS8vIEZpeCBmb2N1cyBwcm9ibGVtIGluIFNhZmFyaQ0KCQkJaWYgKHRpbnltY2UuaXNXZWJLaXQpIHsNCgkJCQljLm9uUG9zdFJlbmRlci5hZGQoZnVuY3Rpb24oYywgbikgew0KCQkJCQkvLyBTdG9yZSBib29rbWFyayBvbiBtb3VzZWRvd24NCgkJCQkJRXZlbnQuYWRkKG4sICdtb3VzZWRvd24nLCBmdW5jdGlvbigpIHsNCgkJCQkJCWVkLmJvb2ttYXJrID0gZWQuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpOw0KCQkJCQl9KTsNCg0KCQkJCQkvLyBSZXN0b3JlIG9uIGZvY3VzLCBzaW5jZSBpdCBtaWdodCBiZSBsb3N0DQoJCQkJCUV2ZW50LmFkZChuLCAnZm9jdXMnLCBmdW5jdGlvbigpIHsNCgkJCQkJCWVkLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhlZC5ib29rbWFyayk7DQoJCQkJCQllZC5ib29rbWFyayA9IG51bGw7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAoYy5oaWRlTWVudSkNCgkJCQllZC5vbk1vdXNlRG93bi5hZGQoYy5oaWRlTWVudSwgYyk7DQoNCgkJCXJldHVybiB0LmFkZChjKTsNCgkJfSwNCg0KCQljcmVhdGVCdXR0b24gOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgbywgYywgY2xzOw0KDQoJCQlpZiAodC5nZXQoaWQpKQ0KCQkJCXJldHVybiBudWxsOw0KDQoJCQlzLnRpdGxlID0gZWQudHJhbnNsYXRlKHMudGl0bGUpOw0KCQkJcy5sYWJlbCA9IGVkLnRyYW5zbGF0ZShzLmxhYmVsKTsNCgkJCXMuc2NvcGUgPSBzLnNjb3BlIHx8IGVkOw0KDQoJCQlpZiAoIXMub25jbGljayAmJiAhcy5tZW51X2J1dHRvbikgew0KCQkJCXMub25jbGljayA9IGZ1bmN0aW9uKCkgew0KCQkJCQllZC5leGVjQ29tbWFuZChzLmNtZCwgcy51aSB8fCBmYWxzZSwgcy52YWx1ZSk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJcyA9IGV4dGVuZCh7DQoJCQkJdGl0bGUgOiBzLnRpdGxlLA0KCQkJCSdjbGFzcycgOiAnbWNlXycgKyBpZCwNCgkJCQl1bmF2YWlsYWJsZV9wcmVmaXggOiBlZC5nZXRMYW5nKCd1bmF2YWlsYWJsZScsICcnKSwNCgkJCQlzY29wZSA6IHMuc2NvcGUsDQoJCQkJY29udHJvbF9tYW5hZ2VyIDogdA0KCQkJfSwgcyk7DQoNCgkJCWlkID0gdC5wcmVmaXggKyBpZDsNCg0KCQkJaWYgKHMubWVudV9idXR0b24pIHsNCgkJCQljbHMgPSBjYyB8fCB0Ll9jbHMubWVudWJ1dHRvbiB8fCB0aW55bWNlLnVpLk1lbnVCdXR0b247DQoJCQkJYyA9IG5ldyBjbHMoaWQsIHMpOw0KCQkJCWVkLm9uTW91c2VEb3duLmFkZChjLmhpZGVNZW51LCBjKTsNCgkJCX0gZWxzZSB7DQoJCQkJY2xzID0gdC5fY2xzLmJ1dHRvbiB8fCB0aW55bWNlLnVpLkJ1dHRvbjsNCgkJCQljID0gbmV3IGNscyhpZCwgcyk7DQoJCQl9DQoNCgkJCXJldHVybiB0LmFkZChjKTsNCgkJfSwNCg0KCQljcmVhdGVNZW51QnV0dG9uIDogZnVuY3Rpb24oaWQsIHMsIGNjKSB7DQoJCQlzID0gcyB8fCB7fTsNCgkJCXMubWVudV9idXR0b24gPSAxOw0KDQoJCQlyZXR1cm4gdGhpcy5jcmVhdGVCdXR0b24oaWQsIHMsIGNjKTsNCgkJfSwNCg0KCQljcmVhdGVTcGxpdEJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzLCBjYykgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBjbWQsIGMsIGNsczsNCg0KCQkJaWYgKHQuZ2V0KGlkKSkNCgkJCQlyZXR1cm4gbnVsbDsNCg0KCQkJcy50aXRsZSA9IGVkLnRyYW5zbGF0ZShzLnRpdGxlKTsNCgkJCXMuc2NvcGUgPSBzLnNjb3BlIHx8IGVkOw0KDQoJCQlpZiAoIXMub25jbGljaykgew0KCQkJCXMub25jbGljayA9IGZ1bmN0aW9uKHYpIHsNCgkJCQkJZWQuZXhlY0NvbW1hbmQocy5jbWQsIHMudWkgfHwgZmFsc2UsIHYgfHwgcy52YWx1ZSk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJaWYgKCFzLm9uc2VsZWN0KSB7DQoJCQkJcy5vbnNlbGVjdCA9IGZ1bmN0aW9uKHYpIHsNCgkJCQkJZWQuZXhlY0NvbW1hbmQocy5jbWQsIHMudWkgfHwgZmFsc2UsIHYgfHwgcy52YWx1ZSk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJcyA9IGV4dGVuZCh7DQoJCQkJdGl0bGUgOiBzLnRpdGxlLA0KCQkJCSdjbGFzcycgOiAnbWNlXycgKyBpZCwNCgkJCQlzY29wZSA6IHMuc2NvcGUsDQoJCQkJY29udHJvbF9tYW5hZ2VyIDogdA0KCQkJfSwgcyk7DQoNCgkJCWlkID0gdC5wcmVmaXggKyBpZDsNCgkJCWNscyA9IGNjIHx8IHQuX2Nscy5zcGxpdGJ1dHRvbiB8fCB0aW55bWNlLnVpLlNwbGl0QnV0dG9uOw0KCQkJYyA9IHQuYWRkKG5ldyBjbHMoaWQsIHMpKTsNCgkJCWVkLm9uTW91c2VEb3duLmFkZChjLmhpZGVNZW51LCBjKTsNCg0KCQkJcmV0dXJuIGM7DQoJCX0sDQoNCgkJY3JlYXRlQ29sb3JTcGxpdEJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzLCBjYykgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBjbWQsIGMsIGNscywgYm07DQoNCgkJCWlmICh0LmdldChpZCkpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCXMudGl0bGUgPSBlZC50cmFuc2xhdGUocy50aXRsZSk7DQoJCQlzLnNjb3BlID0gcy5zY29wZSB8fCBlZDsNCg0KCQkJaWYgKCFzLm9uY2xpY2spIHsNCgkJCQlzLm9uY2xpY2sgPSBmdW5jdGlvbih2KSB7DQoJCQkJCWlmICh0aW55bWNlLmlzSUUpDQoJCQkJCQlibSA9IGVkLnNlbGVjdGlvbi5nZXRCb29rbWFyaygxKTsNCg0KCQkJCQllZC5leGVjQ29tbWFuZChzLmNtZCwgcy51aSB8fCBmYWxzZSwgdiB8fCBzLnZhbHVlKTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQlpZiAoIXMub25zZWxlY3QpIHsNCgkJCQlzLm9uc2VsZWN0ID0gZnVuY3Rpb24odikgew0KCQkJCQllZC5leGVjQ29tbWFuZChzLmNtZCwgcy51aSB8fCBmYWxzZSwgdiB8fCBzLnZhbHVlKTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQlzID0gZXh0ZW5kKHsNCgkJCQl0aXRsZSA6IHMudGl0bGUsDQoJCQkJJ2NsYXNzJyA6ICdtY2VfJyArIGlkLA0KCQkJCSdtZW51X2NsYXNzJyA6IGVkLmdldFBhcmFtKCdza2luJykgKyAnU2tpbicsDQoJCQkJc2NvcGUgOiBzLnNjb3BlLA0KCQkJCW1vcmVfY29sb3JzX3RpdGxlIDogZWQuZ2V0TGFuZygnbW9yZV9jb2xvcnMnKQ0KCQkJfSwgcyk7DQoNCgkJCWlkID0gdC5wcmVmaXggKyBpZDsNCgkJCWNscyA9IGNjIHx8IHQuX2Nscy5jb2xvcnNwbGl0YnV0dG9uIHx8IHRpbnltY2UudWkuQ29sb3JTcGxpdEJ1dHRvbjsNCgkJCWMgPSBuZXcgY2xzKGlkLCBzKTsNCgkJCWVkLm9uTW91c2VEb3duLmFkZChjLmhpZGVNZW51LCBjKTsNCg0KCQkJLy8gUmVtb3ZlIHRoZSBtZW51IGVsZW1lbnQgd2hlbiB0aGUgZWRpdG9yIGlzIHJlbW92ZWQNCgkJCWVkLm9uUmVtb3ZlLmFkZChmdW5jdGlvbigpIHsNCgkJCQljLmRlc3Ryb3koKTsNCgkJCX0pOw0KDQoJCQkvLyBGaXggZm9yIGJ1ZyAjMTg5Nzc4NSwgIzE4OTgwMDcNCgkJCWlmICh0aW55bWNlLmlzSUUpIHsNCgkJCQljLm9uU2hvd01lbnUuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQkvLyBJRSA4IG5lZWRzIGZvY3VzIGluIG9yZGVyIHRvIHN0b3JlIGF3YXkgYSByYW5nZSB3aXRoIHRoZSBjdXJyZW50IGNvbGxhcHNlZCBjYXJldCBsb2NhdGlvbg0KCQkJCQllZC5mb2N1cygpOw0KCQkJCQlibSA9IGVkLnNlbGVjdGlvbi5nZXRCb29rbWFyaygxKTsNCgkJCQl9KTsNCg0KCQkJCWMub25IaWRlTWVudS5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCWlmIChibSkgew0KCQkJCQkJZWQuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJtKTsNCgkJCQkJCWJtID0gMDsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlyZXR1cm4gdC5hZGQoYyk7DQoJCX0sDQoNCgkJY3JlYXRlVG9vbGJhciA6IGZ1bmN0aW9uKGlkLCBzLCBjYykgew0KCQkJdmFyIGMsIHQgPSB0aGlzLCBjbHM7DQoNCgkJCWlkID0gdC5wcmVmaXggKyBpZDsNCgkJCWNscyA9IGNjIHx8IHQuX2Nscy50b29sYmFyIHx8IHRpbnltY2UudWkuVG9vbGJhcjsNCgkJCWMgPSBuZXcgY2xzKGlkLCBzKTsNCg0KCQkJaWYgKHQuZ2V0KGlkKSkNCgkJCQlyZXR1cm4gbnVsbDsNCg0KCQkJcmV0dXJuIHQuYWRkKGMpOw0KCQl9LA0KDQoJCWNyZWF0ZVNlcGFyYXRvciA6IGZ1bmN0aW9uKGNjKSB7DQoJCQl2YXIgY2xzID0gY2MgfHwgdGhpcy5fY2xzLnNlcGFyYXRvciB8fCB0aW55bWNlLnVpLlNlcGFyYXRvcjsNCg0KCQkJcmV0dXJuIG5ldyBjbHMoKTsNCgkJfSwNCg0KCQlzZXRDb250cm9sVHlwZSA6IGZ1bmN0aW9uKG4sIGMpIHsNCgkJCXJldHVybiB0aGlzLl9jbHNbbi50b0xvd2VyQ2FzZSgpXSA9IGM7DQoJCX0sDQoJDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbigpIHsNCgkJCWVhY2godGhpcy5jb250cm9scywgZnVuY3Rpb24oYykgew0KCQkJCWMuZGVzdHJveSgpOw0KCQkJfSk7DQoNCgkJCXRoaXMuY29udHJvbHMgPSBudWxsOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRGlzcGF0Y2hlciA9IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyLCBlYWNoID0gdGlueW1jZS5lYWNoLCBpc0lFID0gdGlueW1jZS5pc0lFLCBpc09wZXJhID0gdGlueW1jZS5pc09wZXJhOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UuV2luZG93TWFuYWdlcicsIHsNCgkJV2luZG93TWFuYWdlciA6IGZ1bmN0aW9uKGVkKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQuZWRpdG9yID0gZWQ7DQoJCQl0Lm9uT3BlbiA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KCQkJdC5vbkNsb3NlID0gbmV3IERpc3BhdGNoZXIodCk7DQoJCQl0LnBhcmFtcyA9IHt9Ow0KCQkJdC5mZWF0dXJlcyA9IHt9Ow0KCQl9LA0KDQoJCW9wZW4gOiBmdW5jdGlvbihzLCBwKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGYgPSAnJywgeCwgeSwgbW8gPSB0LmVkaXRvci5zZXR0aW5ncy5kaWFsb2dfdHlwZSA9PSAnbW9kYWwnLCB3LCBzdywgc2gsIHZwID0gdGlueW1jZS5ET00uZ2V0Vmlld1BvcnQoKSwgdTsNCg0KCQkJLy8gRGVmYXVsdCBzb21lIG9wdGlvbnMNCgkJCXMgPSBzIHx8IHt9Ow0KCQkJcCA9IHAgfHwge307DQoJCQlzdyA9IGlzT3BlcmEgPyB2cC53IDogc2NyZWVuLndpZHRoOyAvLyBPcGVyYSB1c2VzIHdpbmRvd3MgaW5zaWRlIHRoZSBPcGVyYSB3aW5kb3cNCgkJCXNoID0gaXNPcGVyYSA/IHZwLmggOiBzY3JlZW4uaGVpZ2h0Ow0KCQkJcy5uYW1lID0gcy5uYW1lIHx8ICdtY18nICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7DQoJCQlzLndpZHRoID0gcGFyc2VJbnQocy53aWR0aCB8fCAzMjApOw0KCQkJcy5oZWlnaHQgPSBwYXJzZUludChzLmhlaWdodCB8fCAyNDApOw0KCQkJcy5yZXNpemFibGUgPSB0cnVlOw0KCQkJcy5sZWZ0ID0gcy5sZWZ0IHx8IHBhcnNlSW50KHN3IC8gMi4wKSAtIChzLndpZHRoIC8gMi4wKTsNCgkJCXMudG9wID0gcy50b3AgfHwgcGFyc2VJbnQoc2ggLyAyLjApIC0gKHMuaGVpZ2h0IC8gMi4wKTsNCgkJCXAuaW5saW5lID0gZmFsc2U7DQoJCQlwLm1jZV93aWR0aCA9IHMud2lkdGg7DQoJCQlwLm1jZV9oZWlnaHQgPSBzLmhlaWdodDsNCgkJCXAubWNlX2F1dG9fZm9jdXMgPSBzLmF1dG9fZm9jdXM7DQoNCgkJCWlmIChtbykgew0KCQkJCWlmIChpc0lFKSB7DQoJCQkJCXMuY2VudGVyID0gdHJ1ZTsNCgkJCQkJcy5oZWxwID0gZmFsc2U7DQoJCQkJCXMuZGlhbG9nV2lkdGggPSBzLndpZHRoICsgJ3B4JzsNCgkJCQkJcy5kaWFsb2dIZWlnaHQgPSBzLmhlaWdodCArICdweCc7DQoJCQkJCXMuc2Nyb2xsID0gcy5zY3JvbGxiYXJzIHx8IGZhbHNlOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gQnVpbGQgZmVhdHVyZXMgc3RyaW5nDQoJCQllYWNoKHMsIGZ1bmN0aW9uKHYsIGspIHsNCgkJCQlpZiAodGlueW1jZS5pcyh2LCAnYm9vbGVhbicpKQ0KCQkJCQl2ID0gdiA/ICd5ZXMnIDogJ25vJzsNCg0KCQkJCWlmICghL14obmFtZXx1cmwpJC8udGVzdChrKSkgew0KCQkJCQlpZiAoaXNJRSAmJiBtbykNCgkJCQkJCWYgKz0gKGYgPyAnOycgOiAnJykgKyBrICsgJzonICsgdjsNCgkJCQkJZWxzZQ0KCQkJCQkJZiArPSAoZiA/ICcsJyA6ICcnKSArIGsgKyAnPScgKyB2Ow0KCQkJCX0NCgkJCX0pOw0KDQoJCQl0LmZlYXR1cmVzID0gczsNCgkJCXQucGFyYW1zID0gcDsNCgkJCXQub25PcGVuLmRpc3BhdGNoKHQsIHMsIHApOw0KDQoJCQl1ID0gcy51cmwgfHwgcy5maWxlOw0KCQkJdSA9IHRpbnltY2UuX2FkZFZlcih1KTsNCg0KCQkJdHJ5IHsNCgkJCQlpZiAoaXNJRSAmJiBtbykgew0KCQkJCQl3ID0gMTsNCgkJCQkJd2luZG93LnNob3dNb2RhbERpYWxvZyh1LCB3aW5kb3csIGYpOw0KCQkJCX0gZWxzZQ0KCQkJCQl3ID0gd2luZG93Lm9wZW4odSwgcy5uYW1lLCBmKTsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJLy8gSWdub3JlDQoJCQl9DQoNCgkJCWlmICghdykNCgkJCQlhbGVydCh0LmVkaXRvci5nZXRMYW5nKCdwb3B1cF9ibG9ja2VkJykpOw0KCQl9LA0KDQoJCWNsb3NlIDogZnVuY3Rpb24odykgew0KCQkJdy5jbG9zZSgpOw0KCQkJdGhpcy5vbkNsb3NlLmRpc3BhdGNoKHRoaXMpOw0KCQl9LA0KDQoJCWNyZWF0ZUluc3RhbmNlIDogZnVuY3Rpb24oY2wsIGEsIGIsIGMsIGQsIGUpIHsNCgkJCXZhciBmID0gdGlueW1jZS5yZXNvbHZlKGNsKTsNCg0KCQkJcmV0dXJuIG5ldyBmKGEsIGIsIGMsIGQsIGUpOw0KCQl9LA0KDQoJCWNvbmZpcm0gOiBmdW5jdGlvbih0LCBjYiwgcywgdykgew0KCQkJdyA9IHcgfHwgd2luZG93Ow0KDQoJCQljYi5jYWxsKHMgfHwgdGhpcywgdy5jb25maXJtKHRoaXMuX2RlY29kZSh0aGlzLmVkaXRvci5nZXRMYW5nKHQsIHQpKSkpOw0KCQl9LA0KDQoJCWFsZXJ0IDogZnVuY3Rpb24odHgsIGNiLCBzLCB3KSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXcgPSB3IHx8IHdpbmRvdzsNCgkJCXcuYWxlcnQodC5fZGVjb2RlKHQuZWRpdG9yLmdldExhbmcodHgsIHR4KSkpOw0KDQoJCQlpZiAoY2IpDQoJCQkJY2IuY2FsbChzIHx8IHQpOw0KCQl9LA0KDQoJCXJlc2l6ZUJ5IDogZnVuY3Rpb24oZHcsIGRoLCB3aW4pIHsNCgkJCXdpbi5yZXNpemVCeShkdywgZGgpOw0KCQl9LA0KDQoJCS8vIEludGVybmFsIGZ1bmN0aW9ucw0KDQoJCV9kZWNvZGUgOiBmdW5jdGlvbihzKSB7DQoJCQlyZXR1cm4gdGlueW1jZS5ET00uZGVjb2RlKHMpLnJlcGxhY2UoL1xcbi9nLCAnXG4nKTsNCgkJfQ0KCX0pOw0KfSh0aW55bWNlKSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCWZ1bmN0aW9uIENvbW1hbmRNYW5hZ2VyKCkgew0KCQl2YXIgZXhlY0NvbW1hbmRzID0ge30sIHF1ZXJ5U3RhdGVDb21tYW5kcyA9IHt9LCBxdWVyeVZhbHVlQ29tbWFuZHMgPSB7fTsNCg0KCQlmdW5jdGlvbiBhZGQoY29sbGVjdGlvbiwgY21kLCBmdW5jLCBzY29wZSkgew0KCQkJaWYgKHR5cGVvZihjbWQpID09ICdzdHJpbmcnKQ0KCQkJCWNtZCA9IFtjbWRdOw0KDQoJCQl0aW55bWNlLmVhY2goY21kLCBmdW5jdGlvbihjbWQpIHsNCgkJCQljb2xsZWN0aW9uW2NtZC50b0xvd2VyQ2FzZSgpXSA9IHtmdW5jIDogZnVuYywgc2NvcGUgOiBzY29wZX07DQoJCQl9KTsNCgkJfTsNCg0KCQl0aW55bWNlLmV4dGVuZCh0aGlzLCB7DQoJCQlhZGQgOiBmdW5jdGlvbihjbWQsIGZ1bmMsIHNjb3BlKSB7DQoJCQkJYWRkKGV4ZWNDb21tYW5kcywgY21kLCBmdW5jLCBzY29wZSk7DQoJCQl9LA0KDQoJCQlhZGRRdWVyeVN0YXRlSGFuZGxlciA6IGZ1bmN0aW9uKGNtZCwgZnVuYywgc2NvcGUpIHsNCgkJCQlhZGQocXVlcnlTdGF0ZUNvbW1hbmRzLCBjbWQsIGZ1bmMsIHNjb3BlKTsNCgkJCX0sDQoNCgkJCWFkZFF1ZXJ5VmFsdWVIYW5kbGVyIDogZnVuY3Rpb24oY21kLCBmdW5jLCBzY29wZSkgew0KCQkJCWFkZChxdWVyeVZhbHVlQ29tbWFuZHMsIGNtZCwgZnVuYywgc2NvcGUpOw0KCQkJfSwNCg0KCQkJZXhlY0NvbW1hbmQgOiBmdW5jdGlvbihzY29wZSwgY21kLCB1aSwgdmFsdWUsIGFyZ3MpIHsNCgkJCQlpZiAoY21kID0gZXhlY0NvbW1hbmRzW2NtZC50b0xvd2VyQ2FzZSgpXSkgew0KCQkJCQlpZiAoY21kLmZ1bmMuY2FsbChzY29wZSB8fCBjbWQuc2NvcGUsIHVpLCB2YWx1ZSwgYXJncykgIT09IGZhbHNlKQ0KCQkJCQkJcmV0dXJuIHRydWU7DQoJCQkJfQ0KCQkJfSwNCg0KCQkJcXVlcnlDb21tYW5kVmFsdWUgOiBmdW5jdGlvbigpIHsNCgkJCQlpZiAoY21kID0gcXVlcnlWYWx1ZUNvbW1hbmRzW2NtZC50b0xvd2VyQ2FzZSgpXSkNCgkJCQkJcmV0dXJuIGNtZC5mdW5jLmNhbGwoc2NvcGUgfHwgY21kLnNjb3BlLCB1aSwgdmFsdWUsIGFyZ3MpOw0KCQkJfSwNCg0KCQkJcXVlcnlDb21tYW5kU3RhdGUgOiBmdW5jdGlvbigpIHsNCgkJCQlpZiAoY21kID0gcXVlcnlTdGF0ZUNvbW1hbmRzW2NtZC50b0xvd2VyQ2FzZSgpXSkNCgkJCQkJcmV0dXJuIGNtZC5mdW5jLmNhbGwoc2NvcGUgfHwgY21kLnNjb3BlLCB1aSwgdmFsdWUsIGFyZ3MpOw0KCQkJfQ0KCQl9KTsNCgl9Ow0KDQoJdGlueW1jZS5HbG9iYWxDb21tYW5kcyA9IG5ldyBDb21tYW5kTWFuYWdlcigpOw0KfSkodGlueW1jZSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCXRpbnltY2UuRm9ybWF0dGVyID0gZnVuY3Rpb24oZWQpIHsNCgkJdmFyIGZvcm1hdHMgPSB7fSwNCgkJCWVhY2ggPSB0aW55bWNlLmVhY2gsDQoJCQlkb20gPSBlZC5kb20sDQoJCQlzZWxlY3Rpb24gPSBlZC5zZWxlY3Rpb24sDQoJCQlUcmVlV2Fsa2VyID0gdGlueW1jZS5kb20uVHJlZVdhbGtlciwNCgkJCXJhbmdlVXRpbHMgPSBuZXcgdGlueW1jZS5kb20uUmFuZ2VVdGlscyhkb20pLA0KCQkJaXNWYWxpZCA9IGVkLnNjaGVtYS5pc1ZhbGlkLA0KCQkJaXNCbG9jayA9IGRvbS5pc0Jsb2NrLA0KCQkJZm9yY2VkUm9vdEJsb2NrID0gZWQuc2V0dGluZ3MuZm9yY2VkX3Jvb3RfYmxvY2ssDQoJCQlub2RlSW5kZXggPSBkb20ubm9kZUluZGV4LA0KCQkJSU5WSVNJQkxFX0NIQVIgPSAnXHVGRUZGJywNCgkJCU1DRV9BVFRSX1JFID0gL14oc3JjfGhyZWZ8c3R5bGUpJC8sDQoJCQlGQUxTRSA9IGZhbHNlLA0KCQkJVFJVRSA9IHRydWUsDQoJCQl1bmRlZmluZWQsDQoJCQlwZW5kaW5nRm9ybWF0cyA9IHthcHBseSA6IFtdLCByZW1vdmUgOiBbXX07DQoNCgkJZnVuY3Rpb24gaXNBcnJheShvYmopIHsNCgkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBnZXRQYXJlbnRzKG5vZGUsIHNlbGVjdG9yKSB7DQoJCQlyZXR1cm4gZG9tLmdldFBhcmVudHMobm9kZSwgc2VsZWN0b3IsIGRvbS5nZXRSb290KCkpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGlzQ2FyZXROb2RlKG5vZGUpIHsNCgkJCXJldHVybiBub2RlLm5vZGVUeXBlID09PSAxICYmIChub2RlLmZhY2UgPT09ICdtY2VpbmxpbmUnIHx8IG5vZGUuc3R5bGUuZm9udEZhbWlseSA9PT0gJ21jZWlubGluZScpOw0KCQl9Ow0KDQoJCS8vIFB1YmxpYyBmdW5jdGlvbnMNCg0KCQlmdW5jdGlvbiBnZXQobmFtZSkgew0KCQkJcmV0dXJuIG5hbWUgPyBmb3JtYXRzW25hbWVdIDogZm9ybWF0czsNCgkJfTsNCg0KCQlmdW5jdGlvbiByZWdpc3RlcihuYW1lLCBmb3JtYXQpIHsNCgkJCWlmIChuYW1lKSB7DQoJCQkJaWYgKHR5cGVvZihuYW1lKSAhPT0gJ3N0cmluZycpIHsNCgkJCQkJZWFjaChuYW1lLCBmdW5jdGlvbihmb3JtYXQsIG5hbWUpIHsNCgkJCQkJCXJlZ2lzdGVyKG5hbWUsIGZvcm1hdCk7DQoJCQkJCX0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIEZvcmNlIGZvcm1hdCBpbnRvIGFycmF5IGFuZCBhZGQgaXQgdG8gaW50ZXJuYWwgY29sbGVjdGlvbg0KCQkJCQlmb3JtYXQgPSBmb3JtYXQubGVuZ3RoID8gZm9ybWF0IDogW2Zvcm1hdF07DQoNCgkJCQkJZWFjaChmb3JtYXQsIGZ1bmN0aW9uKGZvcm1hdCkgew0KCQkJCQkJLy8gU2V0IGRlZXAgdG8gZmFsc2UgYnkgZGVmYXVsdCBvbiBzZWxlY3RvciBmb3JtYXRzIHRoaXMgdG8gYXZvaWQgcmVtb3ZpbmcNCgkJCQkJCS8vIGFsaWdubWVudCBvbiBpbWFnZXMgaW5zaWRlIHBhcmFncmFwaHMgd2hlbiBhbGlnbm1lbnQgaXMgY2hhbmdlZCBvbiBwYXJhZ3JhcGhzDQoJCQkJCQlpZiAoZm9ybWF0LmRlZXAgPT09IHVuZGVmaW5lZCkNCgkJCQkJCQlmb3JtYXQuZGVlcCA9ICFmb3JtYXQuc2VsZWN0b3I7DQoNCgkJCQkJCS8vIERlZmF1bHQgdG8gdHJ1ZQ0KCQkJCQkJaWYgKGZvcm1hdC5zcGxpdCA9PT0gdW5kZWZpbmVkKQ0KCQkJCQkJCWZvcm1hdC5zcGxpdCA9ICFmb3JtYXQuc2VsZWN0b3IgfHwgZm9ybWF0LmlubGluZTsNCg0KCQkJCQkJLy8gRGVmYXVsdCB0byB0cnVlDQoJCQkJCQlpZiAoZm9ybWF0LnJlbW92ZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdC5zZWxlY3RvciAmJiAhZm9ybWF0LmlubGluZSkNCgkJCQkJCQlmb3JtYXQucmVtb3ZlID0gJ25vbmUnOw0KDQoJCQkJCQkvLyBNYXJrIGZvcm1hdCBhcyBhIG1peGVkIGZvcm1hdCBpbmxpbmUgKyBibG9jayBsZXZlbA0KCQkJCQkJaWYgKGZvcm1hdC5zZWxlY3RvciAmJiBmb3JtYXQuaW5saW5lKSB7DQoJCQkJCQkJZm9ybWF0Lm1peGVkID0gdHJ1ZTsNCgkJCQkJCQlmb3JtYXQuYmxvY2tfZXhwYW5kID0gdHJ1ZTsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gU3BsaXQgY2xhc3NlcyBpZiBuZWVkZWQNCgkJCQkJCWlmICh0eXBlb2YoZm9ybWF0LmNsYXNzZXMpID09PSAnc3RyaW5nJykNCgkJCQkJCQlmb3JtYXQuY2xhc3NlcyA9IGZvcm1hdC5jbGFzc2VzLnNwbGl0KC9ccysvKTsNCgkJCQkJfSk7DQoNCgkJCQkJZm9ybWF0c1tuYW1lXSA9IGZvcm1hdDsNCgkJCQl9DQoJCQl9DQoJCX07DQoNCgkJZnVuY3Rpb24gYXBwbHkobmFtZSwgdmFycywgbm9kZSkgew0KCQkJdmFyIGZvcm1hdExpc3QgPSBnZXQobmFtZSksIGZvcm1hdCA9IGZvcm1hdExpc3RbMF0sIGJvb2ttYXJrLCBybmcsIGk7DQoNCgkJCWZ1bmN0aW9uIG1vdmVTdGFydChybmcpIHsNCgkJCQl2YXIgY29udGFpbmVyID0gcm5nLnN0YXJ0Q29udGFpbmVyLA0KCQkJCQlvZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQsDQoJCQkJCXdhbGtlciwgbm9kZTsNCg0KCQkJCS8vIE1vdmUgc3RhcnRDb250YWluZXIvc3RhcnRPZmZzZXQgaW4gdG8gYSBzdWl0YWJsZSBub2RlDQoJCQkJaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PSAxIHx8IGNvbnRhaW5lci5ub2RlVmFsdWUgPT09ICIiKSB7DQoJCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PSAxID8gY29udGFpbmVyLmNoaWxkTm9kZXNbb2Zmc2V0XSA6IGNvbnRhaW5lcjsNCg0KCQkJCQkvLyBNaWdodCBmYWlsIGlmIHRoZSBvZmZzZXQgaXMgYmVoaW5kIHRoZSBsYXN0IGVsZW1lbnQgaW4gaXQncyBjb250YWluZXINCgkJCQkJaWYgKGNvbnRhaW5lcikgew0KCQkJCQkJd2Fsa2VyID0gbmV3IFRyZWVXYWxrZXIoY29udGFpbmVyLCBjb250YWluZXIucGFyZW50Tm9kZSk7DQoJCQkJCQlmb3IgKG5vZGUgPSB3YWxrZXIuY3VycmVudCgpOyBub2RlOyBub2RlID0gd2Fsa2VyLm5leHQoKSkgew0KCQkJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgIWlzV2hpdGVTcGFjZU5vZGUobm9kZSkpIHsNCgkJCQkJCQkJcm5nLnNldFN0YXJ0KG5vZGUsIDApOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlyZXR1cm4gcm5nOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gc2V0RWxlbWVudEZvcm1hdChlbG0sIGZtdCkgew0KCQkJCWZtdCA9IGZtdCB8fCBmb3JtYXQ7DQoNCgkJCQlpZiAoZWxtKSB7DQoJCQkJCWVhY2goZm10LnN0eWxlcywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsNCgkJCQkJCWRvbS5zZXRTdHlsZShlbG0sIG5hbWUsIHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKSk7DQoJCQkJCX0pOw0KDQoJCQkJCWVhY2goZm10LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7DQoJCQkJCQlkb20uc2V0QXR0cmliKGVsbSwgbmFtZSwgcmVwbGFjZVZhcnModmFsdWUsIHZhcnMpKTsNCgkJCQkJfSk7DQoNCgkJCQkJZWFjaChmbXQuY2xhc3NlcywgZnVuY3Rpb24odmFsdWUpIHsNCgkJCQkJCXZhbHVlID0gcmVwbGFjZVZhcnModmFsdWUsIHZhcnMpOw0KDQoJCQkJCQlpZiAoIWRvbS5oYXNDbGFzcyhlbG0sIHZhbHVlKSkNCgkJCQkJCQlkb20uYWRkQ2xhc3MoZWxtLCB2YWx1ZSk7DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX07DQoNCgkJCWZ1bmN0aW9uIGFwcGx5Um5nU3R5bGUocm5nKSB7DQoJCQkJdmFyIG5ld1dyYXBwZXJzID0gW10sIHdyYXBOYW1lLCB3cmFwRWxtOw0KDQoJCQkJLy8gU2V0dXAgd3JhcHBlciBlbGVtZW50DQoJCQkJd3JhcE5hbWUgPSBmb3JtYXQuaW5saW5lIHx8IGZvcm1hdC5ibG9jazsNCgkJCQl3cmFwRWxtID0gZG9tLmNyZWF0ZSh3cmFwTmFtZSk7DQoJCQkJc2V0RWxlbWVudEZvcm1hdCh3cmFwRWxtKTsNCg0KCQkJCXJhbmdlVXRpbHMud2FsayhybmcsIGZ1bmN0aW9uKG5vZGVzKSB7DQoJCQkJCXZhciBjdXJyZW50V3JhcEVsbTsNCg0KCQkJCQlmdW5jdGlvbiBwcm9jZXNzKG5vZGUpIHsNCgkJCQkJCXZhciBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcGFyZW50TmFtZSA9IG5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBmb3VuZDsNCg0KCQkJCQkJLy8gU3RvcCB3cmFwcGluZyBvbiBiciBlbGVtZW50cw0KCQkJCQkJaWYgKGlzRXEobm9kZU5hbWUsICdicicpKSB7DQoJCQkJCQkJY3VycmVudFdyYXBFbG0gPSAwOw0KDQoJCQkJCQkJLy8gUmVtb3ZlIGFueSBiciBlbGVtZW50cyB3aGVuIHdlIHdyYXAgdGhpbmdzDQoJCQkJCQkJaWYgKGZvcm1hdC5ibG9jaykNCgkJCQkJCQkJZG9tLnJlbW92ZShub2RlKTsNCg0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gSWYgbm9kZSBpcyB3cmFwcGVyIHR5cGUNCgkJCQkJCWlmIChmb3JtYXQud3JhcHBlciAmJiBtYXRjaE5vZGUobm9kZSwgbmFtZSwgdmFycykpIHsNCgkJCQkJCQljdXJyZW50V3JhcEVsbSA9IDA7DQoJCQkJCQkJcmV0dXJuOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBDYW4gd2UgcmVuYW1lIHRoZSBibG9jaw0KCQkJCQkJaWYgKGZvcm1hdC5ibG9jayAmJiAhZm9ybWF0LndyYXBwZXIgJiYgaXNUZXh0QmxvY2sobm9kZU5hbWUpKSB7DQoJCQkJCQkJbm9kZSA9IGRvbS5yZW5hbWUobm9kZSwgd3JhcE5hbWUpOw0KCQkJCQkJCXNldEVsZW1lbnRGb3JtYXQobm9kZSk7DQoJCQkJCQkJbmV3V3JhcHBlcnMucHVzaChub2RlKTsNCgkJCQkJCQljdXJyZW50V3JhcEVsbSA9IDA7DQoJCQkJCQkJcmV0dXJuOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBIYW5kbGUgc2VsZWN0b3IgcGF0dGVybnMNCgkJCQkJCWlmIChmb3JtYXQuc2VsZWN0b3IpIHsNCgkJCQkJCQkvLyBMb29rIGZvciBtYXRjaGluZyBmb3JtYXRzDQoJCQkJCQkJZWFjaChmb3JtYXRMaXN0LCBmdW5jdGlvbihmb3JtYXQpIHsNCgkJCQkJCQkJaWYgKGRvbS5pcyhub2RlLCBmb3JtYXQuc2VsZWN0b3IpICYmICFpc0NhcmV0Tm9kZShub2RlKSkgew0KCQkJCQkJCQkJc2V0RWxlbWVudEZvcm1hdChub2RlLCBmb3JtYXQpOw0KCQkJCQkJCQkJZm91bmQgPSB0cnVlOw0KCQkJCQkJCQl9DQoJCQkJCQkJfSk7DQoNCgkJCQkJCQkvLyBDb250aW51ZSBwcm9jZXNzaW5nIGlmIGEgc2VsZWN0b3IgbWF0Y2ggd2Fzbid0IGZvdW5kIGFuZCBhIGlubGluZSBlbGVtZW50IGlzIGRlZmluZWQNCgkJCQkJCQlpZiAoIWZvcm1hdC5pbmxpbmUgfHwgZm91bmQpIHsNCgkJCQkJCQkJY3VycmVudFdyYXBFbG0gPSAwOw0KCQkJCQkJCQlyZXR1cm47DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBJcyBpdCB2YWxpZCB0byB3cmFwIHRoaXMgaXRlbQ0KCQkJCQkJaWYgKChmb3JtYXQud3JhcF9saW5rcyAhPT0gZmFsc2UgfHwgbm9kZU5hbWUgIT0gJ2EnKSAmJiBpc1ZhbGlkKHdyYXBOYW1lLCBub2RlTmFtZSkgJiYgaXNWYWxpZChwYXJlbnROYW1lLCB3cmFwTmFtZSkpIHsNCgkJCQkJCQkvLyBTdGFydCB3cmFwcGluZw0KCQkJCQkJCWlmICghY3VycmVudFdyYXBFbG0pIHsNCgkJCQkJCQkJLy8gV3JhcCB0aGUgbm9kZQ0KCQkJCQkJCQljdXJyZW50V3JhcEVsbSA9IHdyYXBFbG0uY2xvbmVOb2RlKEZBTFNFKTsNCgkJCQkJCQkJbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjdXJyZW50V3JhcEVsbSwgbm9kZSk7DQoJCQkJCQkJCW5ld1dyYXBwZXJzLnB1c2goY3VycmVudFdyYXBFbG0pOw0KCQkJCQkJCX0NCg0KCQkJCQkJCWN1cnJlbnRXcmFwRWxtLmFwcGVuZENoaWxkKG5vZGUpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkvLyBTdGFydCBhIG5ldyB3cmFwcGVyIGZvciBwb3NzaWJsZSBjaGlsZHJlbg0KCQkJCQkJCWN1cnJlbnRXcmFwRWxtID0gMDsNCg0KCQkJCQkJCWVhY2godGlueW1jZS5ncmVwKG5vZGUuY2hpbGROb2RlcyksIHByb2Nlc3MpOw0KDQoJCQkJCQkJLy8gRW5kIHRoZSBsYXN0IHdyYXBwZXINCgkJCQkJCQljdXJyZW50V3JhcEVsbSA9IDA7DQoJCQkJCQl9DQoJCQkJCX07DQoNCgkJCQkJLy8gUHJvY2VzcyBzaWJsaW5ncyBmcm9tIHJhbmdlDQoJCQkJCWVhY2gobm9kZXMsIHByb2Nlc3MpOw0KCQkJCX0pOw0KDQoJCQkJLy8gQ2xlYW51cA0KCQkJCWVhY2gobmV3V3JhcHBlcnMsIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJdmFyIGNoaWxkQ291bnQ7DQoNCgkJCQkJZnVuY3Rpb24gZ2V0Q2hpbGRDb3VudChub2RlKSB7DQoJCQkJCQl2YXIgY291bnQgPSAwOw0KDQoJCQkJCQllYWNoKG5vZGUuY2hpbGROb2RlcywgZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJCWlmICghaXNXaGl0ZVNwYWNlTm9kZShub2RlKSAmJiAhaXNCb29rbWFya05vZGUobm9kZSkpDQoJCQkJCQkJCWNvdW50Kys7DQoJCQkJCQl9KTsNCg0KCQkJCQkJcmV0dXJuIGNvdW50Ow0KCQkJCQl9Ow0KDQoJCQkJCWZ1bmN0aW9uIG1lcmdlU3R5bGVzKG5vZGUpIHsNCgkJCQkJCXZhciBjaGlsZCwgY2xvbmU7DQoNCgkJCQkJCWVhY2gobm9kZS5jaGlsZE5vZGVzLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiAhaXNCb29rbWFya05vZGUobm9kZSkgJiYgIWlzQ2FyZXROb2RlKG5vZGUpKSB7DQoJCQkJCQkJCWNoaWxkID0gbm9kZTsNCgkJCQkJCQkJcmV0dXJuIEZBTFNFOyAvLyBicmVhayBsb29wDQoJCQkJCQkJfQ0KCQkJCQkJfSk7DQoNCgkJCQkJCS8vIElmIGNoaWxkIHdhcyBmb3VuZCBhbmQgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgY3VycmVudCBub2RlDQoJCQkJCQlpZiAoY2hpbGQgJiYgbWF0Y2hOYW1lKGNoaWxkLCBmb3JtYXQpKSB7DQoJCQkJCQkJY2xvbmUgPSBjaGlsZC5jbG9uZU5vZGUoRkFMU0UpOw0KCQkJCQkJCXNldEVsZW1lbnRGb3JtYXQoY2xvbmUpOw0KDQoJCQkJCQkJZG9tLnJlcGxhY2UoY2xvbmUsIG5vZGUsIFRSVUUpOw0KCQkJCQkJCWRvbS5yZW1vdmUoY2hpbGQsIDEpOw0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm4gY2xvbmUgfHwgbm9kZTsNCgkJCQkJfTsNCg0KCQkJCQljaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudChub2RlKTsNCg0KCQkJCQkvLyBSZW1vdmUgZW1wdHkgbm9kZXMNCgkJCQkJaWYgKGNoaWxkQ291bnQgPT09IDApIHsNCgkJCQkJCWRvbS5yZW1vdmUobm9kZSwgMSk7DQoJCQkJCQlyZXR1cm47DQoJCQkJCX0NCg0KCQkJCQlpZiAoZm9ybWF0LmlubGluZSB8fCBmb3JtYXQud3JhcHBlcikgew0KCQkJCQkJLy8gTWVyZ2VzIHRoZSBjdXJyZW50IG5vZGUgd2l0aCBpdCdzIGNoaWxkcmVuIG9mIHNpbWlsYXIgdHlwZSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KCQkJCQkJaWYgKCFmb3JtYXQuZXhhY3QgJiYgY2hpbGRDb3VudCA9PT0gMSkNCgkJCQkJCQlub2RlID0gbWVyZ2VTdHlsZXMobm9kZSk7DQoNCgkJCQkJCS8vIFJlbW92ZS9tZXJnZSBjaGlsZHJlbg0KCQkJCQkJZWFjaChmb3JtYXRMaXN0LCBmdW5jdGlvbihmb3JtYXQpIHsNCgkJCQkJCQkvLyBNZXJnZSBhbGwgY2hpbGRyZW4gb2Ygc2ltaWxhciB0eXBlIHdpbGwgbW92ZSBzdHlsZXMgZnJvbSBjaGlsZCB0byBwYXJlbnQNCgkJCQkJCQkvLyB0aGlzOiA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj48Yj48c3BhbiBzdHlsZT0iY29sb3I6cmVkOyBmb250LXNpemU6MTBweCI+dGV4dDwvc3Bhbj48L2I+PC9zcGFuPg0KCQkJCQkJCS8vIHdpbGwgYmVjb21lOiA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHgiPnRleHQ8L3NwYW4+PC9iPjwvc3Bhbj4NCgkJCQkJCQllYWNoKGRvbS5zZWxlY3QoZm9ybWF0LmlubGluZSwgbm9kZSksIGZ1bmN0aW9uKGNoaWxkKSB7DQoJCQkJCQkJCXJlbW92ZUZvcm1hdChmb3JtYXQsIHZhcnMsIGNoaWxkLCBmb3JtYXQuZXhhY3QgPyBjaGlsZCA6IG51bGwpOw0KCQkJCQkJCX0pOw0KCQkJCQkJfSk7DQoNCgkJCQkJCS8vIFJlbW92ZSBjaGlsZCBpZiBkaXJlY3QgcGFyZW50IGlzIG9mIHNhbWUgdHlwZQ0KCQkJCQkJaWYgKG1hdGNoTm9kZShub2RlLnBhcmVudE5vZGUsIG5hbWUsIHZhcnMpKSB7DQoJCQkJCQkJZG9tLnJlbW92ZShub2RlLCAxKTsNCgkJCQkJCQlub2RlID0gMDsNCgkJCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gTG9vayBmb3IgcGFyZW50IHdpdGggc2ltaWxhciBzdHlsZSBmb3JtYXQNCgkJCQkJCWlmIChmb3JtYXQubWVyZ2Vfd2l0aF9wYXJlbnRzKSB7DQoJCQkJCQkJZG9tLmdldFBhcmVudChub2RlLnBhcmVudE5vZGUsIGZ1bmN0aW9uKHBhcmVudCkgew0KCQkJCQkJCQlpZiAobWF0Y2hOb2RlKHBhcmVudCwgbmFtZSwgdmFycykpIHsNCgkJCQkJCQkJCWRvbS5yZW1vdmUobm9kZSwgMSk7DQoJCQkJCQkJCQlub2RlID0gMDsNCgkJCQkJCQkJCXJldHVybiBUUlVFOw0KCQkJCQkJCQl9DQoJCQkJCQkJfSk7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIE1lcmdlIG5leHQgYW5kIHByZXZpb3VzIHNpYmxpbmdzIGlmIHRoZXkgYXJlIHNpbWlsYXIgPGI+dGV4dDwvYj48Yj50ZXh0PC9iPiBiZWNvbWVzIDxiPnRleHR0ZXh0PC9iPg0KCQkJCQkJaWYgKG5vZGUpIHsNCgkJCQkJCQlub2RlID0gbWVyZ2VTaWJsaW5ncyhnZXROb25XaGl0ZVNwYWNlU2libGluZyhub2RlKSwgbm9kZSk7DQoJCQkJCQkJbm9kZSA9IG1lcmdlU2libGluZ3Mobm9kZSwgZ2V0Tm9uV2hpdGVTcGFjZVNpYmxpbmcobm9kZSwgVFJVRSkpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9Ow0KDQoJCQlpZiAoZm9ybWF0KSB7DQoJCQkJaWYgKG5vZGUpIHsNCgkJCQkJcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KDQoJCQkJCXJuZy5zZXRTdGFydEJlZm9yZShub2RlKTsNCgkJCQkJcm5nLnNldEVuZEFmdGVyKG5vZGUpOw0KDQoJCQkJCWFwcGx5Um5nU3R5bGUoZXhwYW5kUm5nKHJuZywgZm9ybWF0TGlzdCkpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWlmICghc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkgfHwgIWZvcm1hdC5pbmxpbmUpIHsNCgkJCQkJCS8vIEFwcGx5IGZvcm1hdHRpbmcgdG8gc2VsZWN0aW9uDQoJCQkJCQlib29rbWFyayA9IHNlbGVjdGlvbi5nZXRCb29rbWFyaygpOw0KCQkJCQkJYXBwbHlSbmdTdHlsZShleHBhbmRSbmcoc2VsZWN0aW9uLmdldFJuZyhUUlVFKSwgZm9ybWF0TGlzdCkpOw0KDQoJCQkJCQlzZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoYm9va21hcmspOw0KCQkJCQkJc2VsZWN0aW9uLnNldFJuZyhtb3ZlU3RhcnQoc2VsZWN0aW9uLmdldFJuZyhUUlVFKSkpOw0KCQkJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCQkJfSBlbHNlDQoJCQkJCQlwZXJmb3JtQ2FyZXRBY3Rpb24oJ2FwcGx5JywgbmFtZSwgdmFycyk7DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHJlbW92ZShuYW1lLCB2YXJzLCBub2RlKSB7DQoJCQl2YXIgZm9ybWF0TGlzdCA9IGdldChuYW1lKSwgZm9ybWF0ID0gZm9ybWF0TGlzdFswXSwgYm9va21hcmssIGksIHJuZzsNCg0KCQkJZnVuY3Rpb24gbW92ZVN0YXJ0KHJuZykgew0KCQkJCXZhciBjb250YWluZXIgPSBybmcuc3RhcnRDb250YWluZXIsDQoJCQkJCW9mZnNldCA9IHJuZy5zdGFydE9mZnNldCwNCgkJCQkJd2Fsa2VyLCBub2RlLCBub2RlcywgdG1wTm9kZTsNCg0KCQkJCS8vIENvbnZlcnQgdGV4dCBub2RlIGludG8gaW5kZXggaWYgcG9zc2libGUNCgkJCQlpZiAoY29udGFpbmVyLm5vZGVUeXBlID09IDMgJiYgb2Zmc2V0ID49IGNvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoIC0gMSkgew0KCQkJCQljb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTsNCgkJCQkJb2Zmc2V0ID0gbm9kZUluZGV4KGNvbnRhaW5lcikgKyAxOw0KCQkJCX0NCg0KCQkJCS8vIE1vdmUgc3RhcnRDb250YWluZXIvc3RhcnRPZmZzZXQgaW4gdG8gYSBzdWl0YWJsZSBub2RlDQoJCQkJaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJCW5vZGVzID0gY29udGFpbmVyLmNoaWxkTm9kZXM7DQoJCQkJCWNvbnRhaW5lciA9IG5vZGVzW01hdGgubWluKG9mZnNldCwgbm9kZXMubGVuZ3RoIC0gMSldOw0KCQkJCQl3YWxrZXIgPSBuZXcgVHJlZVdhbGtlcihjb250YWluZXIpOw0KDQoJCQkJCS8vIElmIG9mZnNldCBpcyBhdCBlbmQgb2YgdGhlIHBhcmVudCBub2RlIHdhbGsgdG8gdGhlIG5leHQgb25lDQoJCQkJCWlmIChvZmZzZXQgPiBub2Rlcy5sZW5ndGggLSAxKQ0KCQkJCQkJd2Fsa2VyLm5leHQoKTsNCg0KCQkJCQlmb3IgKG5vZGUgPSB3YWxrZXIuY3VycmVudCgpOyBub2RlOyBub2RlID0gd2Fsa2VyLm5leHQoKSkgew0KCQkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiAhaXNXaGl0ZVNwYWNlTm9kZShub2RlKSkgew0KCQkJCQkJCS8vIElFIGhhcyBhICJuZWF0IiBmZWF0dXJlIHdoZXJlIGl0IG1vdmVzIHRoZSBzdGFydCBub2RlIGludG8gdGhlIGNsb3Nlc3QgZWxlbWVudA0KCQkJCQkJCS8vIHdlIGNhbiBhdm9pZCB0aGlzIGJ5IGluc2VydGluZyBhbiBlbGVtZW50IGJlZm9yZSBpdCBhbmQgdGhlbiByZW1vdmUgaXQgYWZ0ZXIgd2Ugc2V0IHRoZSBzZWxlY3Rpb24NCgkJCQkJCQl0bXBOb2RlID0gZG9tLmNyZWF0ZSgnYScsIG51bGwsIElOVklTSUJMRV9DSEFSKTsNCgkJCQkJCQlub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRtcE5vZGUsIG5vZGUpOw0KDQoJCQkJCQkJLy8gU2V0IHNlbGVjdGlvbiBhbmQgcmVtb3ZlIHRtcE5vZGUNCgkJCQkJCQlybmcuc2V0U3RhcnQobm9kZSwgMCk7DQoJCQkJCQkJc2VsZWN0aW9uLnNldFJuZyhybmcpOw0KCQkJCQkJCWRvbS5yZW1vdmUodG1wTm9kZSk7DQoNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9Ow0KDQoJCQkvLyBNZXJnZXMgdGhlIHN0eWxlcyBmb3IgZWFjaCBub2RlDQoJCQlmdW5jdGlvbiBwcm9jZXNzKG5vZGUpIHsNCgkJCQl2YXIgY2hpbGRyZW4sIGksIGw7DQoNCgkJCQkvLyBHcmFiIHRoZSBjaGlsZHJlbiBmaXJzdCBzaW5jZSB0aGUgbm9kZWxpc3QgbWlnaHQgYmUgY2hhbmdlZA0KCQkJCWNoaWxkcmVuID0gdGlueW1jZS5ncmVwKG5vZGUuY2hpbGROb2Rlcyk7DQoNCgkJCQkvLyBQcm9jZXNzIGN1cnJlbnQgbm9kZQ0KCQkJCWZvciAoaSA9IDAsIGwgPSBmb3JtYXRMaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgew0KCQkJCQlpZiAocmVtb3ZlRm9ybWF0KGZvcm1hdExpc3RbaV0sIHZhcnMsIG5vZGUsIG5vZGUpKQ0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJLy8gUHJvY2VzcyB0aGUgY2hpbGRyZW4NCgkJCQlpZiAoZm9ybWF0LmRlZXApIHsNCgkJCQkJZm9yIChpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykNCgkJCQkJCXByb2Nlc3MoY2hpbGRyZW5baV0pOw0KCQkJCX0NCgkJCX07DQoNCgkJCWZ1bmN0aW9uIGZpbmRGb3JtYXRSb290KGNvbnRhaW5lcikgew0KCQkJCXZhciBmb3JtYXRSb290Ow0KDQoJCQkJLy8gRmluZCBmb3JtYXQgcm9vdA0KCQkJCWVhY2goZ2V0UGFyZW50cyhjb250YWluZXIucGFyZW50Tm9kZSkucmV2ZXJzZSgpLCBmdW5jdGlvbihwYXJlbnQpIHsNCgkJCQkJdmFyIGZvcm1hdDsNCg0KCQkJCQkvLyBGaW5kIGZvcm1hdCByb290IGVsZW1lbnQNCgkJCQkJaWYgKCFmb3JtYXRSb290ICYmIHBhcmVudC5pZCAhPSAnX3N0YXJ0JyAmJiBwYXJlbnQuaWQgIT0gJ19lbmQnKSB7DQoJCQkJCQkvLyBJcyB0aGUgbm9kZSBtYXRjaGluZyB0aGUgZm9ybWF0IHdlIGFyZSBsb29raW5nIGZvcg0KCQkJCQkJZm9ybWF0ID0gbWF0Y2hOb2RlKHBhcmVudCwgbmFtZSwgdmFycyk7DQoJCQkJCQlpZiAoZm9ybWF0ICYmIGZvcm1hdC5zcGxpdCAhPT0gZmFsc2UpDQoJCQkJCQkJZm9ybWF0Um9vdCA9IHBhcmVudDsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIGZvcm1hdFJvb3Q7DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiB3cmFwQW5kU3BsaXQoZm9ybWF0X3Jvb3QsIGNvbnRhaW5lciwgdGFyZ2V0LCBzcGxpdCkgew0KCQkJCXZhciBwYXJlbnQsIGNsb25lLCBsYXN0Q2xvbmUsIGZpcnN0Q2xvbmUsIGksIGZvcm1hdFJvb3RQYXJlbnQ7DQoNCgkJCQkvLyBGb3JtYXQgcm9vdCBmb3VuZCB0aGVuIGNsb25lIGZvcm1hdHMgYW5kIHNwbGl0IGl0DQoJCQkJaWYgKGZvcm1hdF9yb290KSB7DQoJCQkJCWZvcm1hdFJvb3RQYXJlbnQgPSBmb3JtYXRfcm9vdC5wYXJlbnROb2RlOw0KDQoJCQkJCWZvciAocGFyZW50ID0gY29udGFpbmVyLnBhcmVudE5vZGU7IHBhcmVudCAmJiBwYXJlbnQgIT0gZm9ybWF0Um9vdFBhcmVudDsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGUpIHsNCgkJCQkJCWNsb25lID0gcGFyZW50LmNsb25lTm9kZShGQUxTRSk7DQoNCgkJCQkJCWZvciAoaSA9IDA7IGkgPCBmb3JtYXRMaXN0Lmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJaWYgKHJlbW92ZUZvcm1hdChmb3JtYXRMaXN0W2ldLCB2YXJzLCBjbG9uZSwgY2xvbmUpKSB7DQoJCQkJCQkJCWNsb25lID0gMDsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBCdWlsZCB3cmFwcGVyIG5vZGUNCgkJCQkJCWlmIChjbG9uZSkgew0KCQkJCQkJCWlmIChsYXN0Q2xvbmUpDQoJCQkJCQkJCWNsb25lLmFwcGVuZENoaWxkKGxhc3RDbG9uZSk7DQoNCgkJCQkJCQlpZiAoIWZpcnN0Q2xvbmUpDQoJCQkJCQkJCWZpcnN0Q2xvbmUgPSBjbG9uZTsNCg0KCQkJCQkJCWxhc3RDbG9uZSA9IGNsb25lOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJLy8gTmV2ZXIgc3BsaXQgYmxvY2sgZWxlbWVudHMgaWYgdGhlIGZvcm1hdCBpcyBtaXhlZA0KCQkJCQlpZiAoc3BsaXQgJiYgKCFmb3JtYXQubWl4ZWQgfHwgIWlzQmxvY2soZm9ybWF0X3Jvb3QpKSkNCgkJCQkJCWNvbnRhaW5lciA9IGRvbS5zcGxpdChmb3JtYXRfcm9vdCwgY29udGFpbmVyKTsNCg0KCQkJCQkvLyBXcmFwIGNvbnRhaW5lciBpbiBjbG9uZWQgZm9ybWF0cw0KCQkJCQlpZiAobGFzdENsb25lKSB7DQoJCQkJCQl0YXJnZXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobGFzdENsb25lLCB0YXJnZXQpOw0KCQkJCQkJZmlyc3RDbG9uZS5hcHBlbmRDaGlsZCh0YXJnZXQpOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHNwbGl0VG9Gb3JtYXRSb290KGNvbnRhaW5lcikgew0KCQkJCXJldHVybiB3cmFwQW5kU3BsaXQoZmluZEZvcm1hdFJvb3QoY29udGFpbmVyKSwgY29udGFpbmVyLCBjb250YWluZXIsIHRydWUpOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gdW53cmFwKHN0YXJ0KSB7DQoJCQkJdmFyIG5vZGUgPSBkb20uZ2V0KHN0YXJ0ID8gJ19zdGFydCcgOiAnX2VuZCcpLA0KCQkJCQlvdXQgPSBub2RlW3N0YXJ0ID8gJ2ZpcnN0Q2hpbGQnIDogJ2xhc3RDaGlsZCddOw0KDQoJCQkJLy8gSWYgdGhlIGVuZCBpcyBwbGFjZWQgd2l0aGluIHRoZSBzdGFydCB0aGUgcmVzdWx0IHdpbGwgYmUgcmVtb3ZlZA0KCQkJCS8vIFNvIHRoaXMgY2hlY2tzIGlmIHRoZSBvdXQgbm9kZSBpcyBhIGJvb2ttYXJrIG5vZGUgaWYgaXQgaXMgaXQNCgkJCQkvLyBjaGVja3MgZm9yIGFub3RoZXIgbW9yZSBzdWl0YWJsZSBub2RlDQoJCQkJaWYgKGlzQm9va21hcmtOb2RlKG91dCkpDQoJCQkJCW91dCA9IG91dFtzdGFydCA/ICdmaXJzdENoaWxkJyA6ICdsYXN0Q2hpbGQnXTsNCg0KCQkJCWRvbS5yZW1vdmUobm9kZSwgdHJ1ZSk7DQoNCgkJCQlyZXR1cm4gb3V0Ow0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gcmVtb3ZlUm5nU3R5bGUocm5nKSB7DQoJCQkJdmFyIHN0YXJ0Q29udGFpbmVyLCBlbmRDb250YWluZXI7DQoNCgkJCQlybmcgPSBleHBhbmRSbmcocm5nLCBmb3JtYXRMaXN0LCBUUlVFKTsNCg0KCQkJCWlmIChmb3JtYXQuc3BsaXQpIHsNCgkJCQkJc3RhcnRDb250YWluZXIgPSBnZXRDb250YWluZXIocm5nLCBUUlVFKTsNCgkJCQkJZW5kQ29udGFpbmVyID0gZ2V0Q29udGFpbmVyKHJuZyk7DQoNCgkJCQkJaWYgKHN0YXJ0Q29udGFpbmVyICE9IGVuZENvbnRhaW5lcikgew0KCQkJCQkJLy8gV3JhcCBzdGFydC9lbmQgbm9kZXMgaW4gc3BhbiBlbGVtZW50IHNpbmNlIHRoZXNlIG1pZ2h0IGJlIGNsb25lZC9tb3ZlZA0KCQkJCQkJc3RhcnRDb250YWluZXIgPSB3cmFwKHN0YXJ0Q29udGFpbmVyLCAnc3BhbicsIHtpZCA6ICdfc3RhcnQnLCBfbWNlX3R5cGUgOiAnYm9va21hcmsnfSk7DQoJCQkJCQllbmRDb250YWluZXIgPSB3cmFwKGVuZENvbnRhaW5lciwgJ3NwYW4nLCB7aWQgOiAnX2VuZCcsIF9tY2VfdHlwZSA6ICdib29rbWFyayd9KTsNCg0KCQkJCQkJLy8gU3BsaXQgc3RhcnQvZW5kDQoJCQkJCQlzcGxpdFRvRm9ybWF0Um9vdChzdGFydENvbnRhaW5lcik7DQoJCQkJCQlzcGxpdFRvRm9ybWF0Um9vdChlbmRDb250YWluZXIpOw0KDQoJCQkJCQkvLyBVbndyYXAgc3RhcnQvZW5kIHRvIGdldCByZWFsIGVsZW1lbnRzIGFnYWluDQoJCQkJCQlzdGFydENvbnRhaW5lciA9IHVud3JhcChUUlVFKTsNCgkJCQkJCWVuZENvbnRhaW5lciA9IHVud3JhcCgpOw0KCQkJCQl9IGVsc2UNCgkJCQkJCXN0YXJ0Q29udGFpbmVyID0gZW5kQ29udGFpbmVyID0gc3BsaXRUb0Zvcm1hdFJvb3Qoc3RhcnRDb250YWluZXIpOw0KDQoJCQkJCS8vIFVwZGF0ZSByYW5nZSBwb3NpdGlvbnMgc2luY2UgdGhleSBtaWdodCBoYXZlIGNoYW5nZWQgYWZ0ZXIgdGhlIHNwbGl0IG9wZXJhdGlvbnMNCgkJCQkJcm5nLnN0YXJ0Q29udGFpbmVyID0gc3RhcnRDb250YWluZXIucGFyZW50Tm9kZTsNCgkJCQkJcm5nLnN0YXJ0T2Zmc2V0ID0gbm9kZUluZGV4KHN0YXJ0Q29udGFpbmVyKTsNCgkJCQkJcm5nLmVuZENvbnRhaW5lciA9IGVuZENvbnRhaW5lci5wYXJlbnROb2RlOw0KCQkJCQlybmcuZW5kT2Zmc2V0ID0gbm9kZUluZGV4KGVuZENvbnRhaW5lcikgKyAxOw0KCQkJCX0NCg0KCQkJCS8vIFJlbW92ZSBpdGVtcyBiZXR3ZWVuIHN0YXJ0L2VuZA0KCQkJCXJhbmdlVXRpbHMud2FsayhybmcsIGZ1bmN0aW9uKG5vZGVzKSB7DQoJCQkJCWVhY2gobm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCXByb2Nlc3Mobm9kZSk7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfTsNCg0KCQkJLy8gSGFuZGxlIG5vZGUNCgkJCWlmIChub2RlKSB7DQoJCQkJcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KCQkJCXJuZy5zZXRTdGFydEJlZm9yZShub2RlKTsNCgkJCQlybmcuc2V0RW5kQWZ0ZXIobm9kZSk7DQoJCQkJcmVtb3ZlUm5nU3R5bGUocm5nKTsNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCWlmICghc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkgfHwgIWZvcm1hdC5pbmxpbmUpIHsNCgkJCQlib29rbWFyayA9IHNlbGVjdGlvbi5nZXRCb29rbWFyaygpOw0KCQkJCXJlbW92ZVJuZ1N0eWxlKHNlbGVjdGlvbi5nZXRSbmcoVFJVRSkpOw0KCQkJCXNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhib29rbWFyayk7DQoNCgkJCQkvLyBDaGVjayBpZiBzdGFydCBlbGVtZW50IHN0aWxsIGhhcyBmb3JtYXR0aW5nIHRoZW4gd2UgYXJlIGF0OiAiPGI+dGV4dHw8L2I+dGV4dCIgYW5kIG5lZWQgdG8gbW92ZSB0aGUgc3RhcnQgaW50byB0aGUgbmV4dCB0ZXh0IG5vZGUNCgkJCQlpZiAobWF0Y2gobmFtZSwgdmFycywgc2VsZWN0aW9uLmdldFN0YXJ0KCkpKSB7DQoJCQkJCW1vdmVTdGFydChzZWxlY3Rpb24uZ2V0Um5nKHRydWUpKTsNCgkJCQl9DQoNCgkJCQllZC5ub2RlQ2hhbmdlZCgpOw0KCQkJfSBlbHNlDQoJCQkJcGVyZm9ybUNhcmV0QWN0aW9uKCdyZW1vdmUnLCBuYW1lLCB2YXJzKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiB0b2dnbGUobmFtZSwgdmFycywgbm9kZSkgew0KCQkJaWYgKG1hdGNoKG5hbWUsIHZhcnMsIG5vZGUpKQ0KCQkJCXJlbW92ZShuYW1lLCB2YXJzLCBub2RlKTsNCgkJCWVsc2UNCgkJCQlhcHBseShuYW1lLCB2YXJzLCBub2RlKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBtYXRjaE5vZGUobm9kZSwgbmFtZSwgdmFycywgc2ltaWxhcikgew0KCQkJdmFyIGZvcm1hdExpc3QgPSBnZXQobmFtZSksIGZvcm1hdCwgaSwgY2xhc3NlczsNCg0KCQkJZnVuY3Rpb24gbWF0Y2hJdGVtcyhub2RlLCBmb3JtYXQsIGl0ZW1fbmFtZSkgew0KCQkJCXZhciBrZXksIHZhbHVlLCBpdGVtcyA9IGZvcm1hdFtpdGVtX25hbWVdLCBpOw0KDQoJCQkJLy8gQ2hlY2sgYWxsIGl0ZW1zDQoJCQkJaWYgKGl0ZW1zKSB7DQoJCQkJCS8vIE5vbiBpbmRleGVkIG9iamVjdA0KCQkJCQlpZiAoaXRlbXMubGVuZ3RoID09PSB1bmRlZmluZWQpIHsNCgkJCQkJCWZvciAoa2V5IGluIGl0ZW1zKSB7DQoJCQkJCQkJaWYgKGl0ZW1zLmhhc093blByb3BlcnR5KGtleSkpIHsNCgkJCQkJCQkJaWYgKGl0ZW1fbmFtZSA9PT0gJ2F0dHJpYnV0ZXMnKQ0KCQkJCQkJCQkJdmFsdWUgPSBkb20uZ2V0QXR0cmliKG5vZGUsIGtleSk7DQoJCQkJCQkJCWVsc2UNCgkJCQkJCQkJCXZhbHVlID0gZ2V0U3R5bGUobm9kZSwga2V5KTsNCg0KCQkJCQkJCQlpZiAoc2ltaWxhciAmJiAhdmFsdWUgJiYgIWZvcm1hdC5leGFjdCkNCgkJCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJCQlpZiAoKCFzaW1pbGFyIHx8IGZvcm1hdC5leGFjdCkgJiYgIWlzRXEodmFsdWUsIHJlcGxhY2VWYXJzKGl0ZW1zW2tleV0sIHZhcnMpKSkNCgkJCQkJCQkJCXJldHVybjsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkvLyBPbmx5IG9uZSBtYXRjaCBuZWVkZWQgZm9yIGluZGV4ZWQgYXJyYXlzDQoJCQkJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQlpZiAoaXRlbV9uYW1lID09PSAnYXR0cmlidXRlcycgPyBkb20uZ2V0QXR0cmliKG5vZGUsIGl0ZW1zW2ldKSA6IGdldFN0eWxlKG5vZGUsIGl0ZW1zW2ldKSkNCgkJCQkJCQkJcmV0dXJuIGZvcm1hdDsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCXJldHVybiBmb3JtYXQ7DQoJCQl9Ow0KDQoJCQlpZiAoZm9ybWF0TGlzdCAmJiBub2RlKSB7DQoJCQkJLy8gQ2hlY2sgZWFjaCBmb3JtYXQgaW4gbGlzdA0KCQkJCWZvciAoaSA9IDA7IGkgPCBmb3JtYXRMaXN0Lmxlbmd0aDsgaSsrKSB7DQoJCQkJCWZvcm1hdCA9IGZvcm1hdExpc3RbaV07DQoNCgkJCQkJLy8gTmFtZSBuYW1lLCBhdHRyaWJ1dGVzLCBzdHlsZXMgYW5kIGNsYXNzZXMNCgkJCQkJaWYgKG1hdGNoTmFtZShub2RlLCBmb3JtYXQpICYmIG1hdGNoSXRlbXMobm9kZSwgZm9ybWF0LCAnYXR0cmlidXRlcycpICYmIG1hdGNoSXRlbXMobm9kZSwgZm9ybWF0LCAnc3R5bGVzJykpIHsNCgkJCQkJCS8vIE1hdGNoIGNsYXNzZXMNCgkJCQkJCWlmIChjbGFzc2VzID0gZm9ybWF0LmNsYXNzZXMpIHsNCgkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgew0KCQkJCQkJCQlpZiAoIWRvbS5oYXNDbGFzcyhub2RlLCBjbGFzc2VzW2ldKSkNCgkJCQkJCQkJCXJldHVybjsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCXJldHVybiBmb3JtYXQ7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX07DQoNCgkJZnVuY3Rpb24gbWF0Y2gobmFtZSwgdmFycywgbm9kZSkgew0KCQkJdmFyIHN0YXJ0Tm9kZSwgaTsNCg0KCQkJZnVuY3Rpb24gbWF0Y2hQYXJlbnRzKG5vZGUpIHsNCgkJCQkvLyBGaW5kIGZpcnN0IG5vZGUgd2l0aCBzaW1pbGFyIGZvcm1hdCBzZXR0aW5ncw0KCQkJCW5vZGUgPSBkb20uZ2V0UGFyZW50KG5vZGUsIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJcmV0dXJuICEhbWF0Y2hOb2RlKG5vZGUsIG5hbWUsIHZhcnMsIHRydWUpOw0KCQkJCX0pOw0KDQoJCQkJLy8gRG8gYW4gZXhhY3QgY2hlY2sgb24gdGhlIHNpbWlsYXIgZm9ybWF0IGVsZW1lbnQNCgkJCQlyZXR1cm4gbWF0Y2hOb2RlKG5vZGUsIG5hbWUsIHZhcnMpOw0KCQkJfTsNCg0KCQkJLy8gQ2hlY2sgc3BlY2lmaWVkIG5vZGUNCgkJCWlmIChub2RlKQ0KCQkJCXJldHVybiBtYXRjaFBhcmVudHMobm9kZSk7DQoNCgkJCS8vIENoZWNrIHBlbmRpbmcgZm9ybWF0cw0KCQkJaWYgKHNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpKSB7DQoJCQkJZm9yIChpID0gcGVuZGluZ0Zvcm1hdHMuYXBwbHkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJaWYgKHBlbmRpbmdGb3JtYXRzLmFwcGx5W2ldLm5hbWUgPT0gbmFtZSkNCgkJCQkJCXJldHVybiB0cnVlOw0KCQkJCX0NCg0KCQkJCWZvciAoaSA9IHBlbmRpbmdGb3JtYXRzLnJlbW92ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCQlpZiAocGVuZGluZ0Zvcm1hdHMucmVtb3ZlW2ldLm5hbWUgPT0gbmFtZSkNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gbWF0Y2hQYXJlbnRzKHNlbGVjdGlvbi5nZXROb2RlKCkpOw0KCQkJfQ0KDQoJCQkvLyBDaGVjayBzZWxlY3RlZCBub2RlDQoJCQlub2RlID0gc2VsZWN0aW9uLmdldE5vZGUoKTsNCgkJCWlmIChtYXRjaFBhcmVudHMobm9kZSkpDQoJCQkJcmV0dXJuIFRSVUU7DQoNCgkJCS8vIENoZWNrIHN0YXJ0IG5vZGUgaWYgaXQncyBkaWZmZXJlbnQNCgkJCXN0YXJ0Tm9kZSA9IHNlbGVjdGlvbi5nZXRTdGFydCgpOw0KCQkJaWYgKHN0YXJ0Tm9kZSAhPSBub2RlKSB7DQoJCQkJaWYgKG1hdGNoUGFyZW50cyhzdGFydE5vZGUpKQ0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCX0NCg0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIG1hdGNoQWxsKG5hbWVzLCB2YXJzKSB7DQoJCQl2YXIgc3RhcnRFbGVtZW50LCBtYXRjaGVkRm9ybWF0TmFtZXMgPSBbXSwgY2hlY2tlZE1hcCA9IHt9LCBpLCBuaSwgbmFtZTsNCg0KCQkJLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBjb2xsYXBzZWQgdGhlbiBjaGVjayBwZW5kaW5nIGZvcm1hdHMNCgkJCWlmIChzZWxlY3Rpb24uaXNDb2xsYXBzZWQoKSkgew0KCQkJCWZvciAobmkgPSAwOyBuaSA8IG5hbWVzLmxlbmd0aDsgbmkrKykgew0KCQkJCQkvLyBJZiB0aGUgbmFtZSBpcyB0byBiZSByZW1vdmVkLCB0aGVuIHN0b3AgaXQgZnJvbSBiZWluZyBhZGRlZA0KCQkJCQlmb3IgKGkgPSBwZW5kaW5nRm9ybWF0cy5yZW1vdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJCW5hbWUgPSBuYW1lc1tuaV07DQoNCgkJCQkJCWlmIChwZW5kaW5nRm9ybWF0cy5yZW1vdmVbaV0ubmFtZSA9PSBuYW1lKSB7DQoJCQkJCQkJY2hlY2tlZE1hcFtuYW1lXSA9IHRydWU7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBJZiB0aGUgZm9ybWF0IGlzIHRvIGJlIGFwcGxpZWQNCgkJCQlmb3IgKGkgPSBwZW5kaW5nRm9ybWF0cy5hcHBseS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCQlmb3IgKG5pID0gMDsgbmkgPCBuYW1lcy5sZW5ndGg7IG5pKyspIHsNCgkJCQkJCW5hbWUgPSBuYW1lc1tuaV07DQoNCgkJCQkJCWlmICghY2hlY2tlZE1hcFtuYW1lXSAmJiBwZW5kaW5nRm9ybWF0cy5hcHBseVtpXS5uYW1lID09IG5hbWUpIHsNCgkJCQkJCQljaGVja2VkTWFwW25hbWVdID0gdHJ1ZTsNCgkJCQkJCQltYXRjaGVkRm9ybWF0TmFtZXMucHVzaChuYW1lKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gQ2hlY2sgc3RhcnQgb2Ygc2VsZWN0aW9uIGZvciBmb3JtYXRzDQoJCQlzdGFydEVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0U3RhcnQoKTsNCgkJCWRvbS5nZXRQYXJlbnQoc3RhcnRFbGVtZW50LCBmdW5jdGlvbihub2RlKSB7DQoJCQkJdmFyIGksIG5hbWU7DQoNCgkJCQlmb3IgKGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsNCgkJCQkJbmFtZSA9IG5hbWVzW2ldOw0KDQoJCQkJCWlmICghY2hlY2tlZE1hcFtuYW1lXSAmJiBtYXRjaE5vZGUobm9kZSwgbmFtZSwgdmFycykpIHsNCgkJCQkJCWNoZWNrZWRNYXBbbmFtZV0gPSB0cnVlOw0KCQkJCQkJbWF0Y2hlZEZvcm1hdE5hbWVzLnB1c2gobmFtZSk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9KTsNCg0KCQkJcmV0dXJuIG1hdGNoZWRGb3JtYXROYW1lczsNCgkJfTsNCg0KCQlmdW5jdGlvbiBjYW5BcHBseShuYW1lKSB7DQoJCQl2YXIgZm9ybWF0TGlzdCA9IGdldChuYW1lKSwgc3RhcnROb2RlLCBwYXJlbnRzLCBpLCB4LCBzZWxlY3RvcjsNCg0KCQkJaWYgKGZvcm1hdExpc3QpIHsNCgkJCQlzdGFydE5vZGUgPSBzZWxlY3Rpb24uZ2V0U3RhcnQoKTsNCgkJCQlwYXJlbnRzID0gZ2V0UGFyZW50cyhzdGFydE5vZGUpOw0KDQoJCQkJZm9yICh4ID0gZm9ybWF0TGlzdC5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkgew0KCQkJCQlzZWxlY3RvciA9IGZvcm1hdExpc3RbeF0uc2VsZWN0b3I7DQoNCgkJCQkJLy8gRm9ybWF0IGlzIG5vdCBzZWxlY3RvciBiYXNlZCwgdGhlbiBhbHdheXMgcmV0dXJuIFRSVUUNCgkJCQkJaWYgKCFzZWxlY3RvcikNCgkJCQkJCXJldHVybiBUUlVFOw0KDQoJCQkJCWZvciAoaSA9IHBhcmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJCWlmIChkb20uaXMocGFyZW50c1tpXSwgc2VsZWN0b3IpKQ0KCQkJCQkJCXJldHVybiBUUlVFOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gRkFMU0U7DQoJCX07DQoNCgkJLy8gRXhwb3NlIHRvIHB1YmxpYw0KCQl0aW55bWNlLmV4dGVuZCh0aGlzLCB7DQoJCQlnZXQgOiBnZXQsDQoJCQlyZWdpc3RlciA6IHJlZ2lzdGVyLA0KCQkJYXBwbHkgOiBhcHBseSwNCgkJCXJlbW92ZSA6IHJlbW92ZSwNCgkJCXRvZ2dsZSA6IHRvZ2dsZSwNCgkJCW1hdGNoIDogbWF0Y2gsDQoJCQltYXRjaEFsbCA6IG1hdGNoQWxsLA0KCQkJbWF0Y2hOb2RlIDogbWF0Y2hOb2RlLA0KCQkJY2FuQXBwbHkgOiBjYW5BcHBseQ0KCQl9KTsNCg0KCQkvLyBQcml2YXRlIGZ1bmN0aW9ucw0KDQoJCWZ1bmN0aW9uIG1hdGNoTmFtZShub2RlLCBmb3JtYXQpIHsNCgkJCS8vIENoZWNrIGZvciBpbmxpbmUgbWF0Y2gNCgkJCWlmIChpc0VxKG5vZGUsIGZvcm1hdC5pbmxpbmUpKQ0KCQkJCXJldHVybiBUUlVFOw0KDQoJCQkvLyBDaGVjayBmb3IgYmxvY2sgbWF0Y2gNCgkJCWlmIChpc0VxKG5vZGUsIGZvcm1hdC5ibG9jaykpDQoJCQkJcmV0dXJuIFRSVUU7DQoNCgkJCS8vIENoZWNrIGZvciBzZWxlY3RvciBtYXRjaA0KCQkJaWYgKGZvcm1hdC5zZWxlY3RvcikNCgkJCQlyZXR1cm4gZG9tLmlzKG5vZGUsIGZvcm1hdC5zZWxlY3Rvcik7DQoJCX07DQoNCgkJZnVuY3Rpb24gaXNFcShzdHIxLCBzdHIyKSB7DQoJCQlzdHIxID0gc3RyMSB8fCAnJzsNCgkJCXN0cjIgPSBzdHIyIHx8ICcnOw0KDQoJCQlzdHIxID0gJycgKyAoc3RyMS5ub2RlTmFtZSB8fCBzdHIxKTsNCgkJCXN0cjIgPSAnJyArIChzdHIyLm5vZGVOYW1lIHx8IHN0cjIpOw0KDQoJCQlyZXR1cm4gc3RyMS50b0xvd2VyQ2FzZSgpID09IHN0cjIudG9Mb3dlckNhc2UoKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBnZXRTdHlsZShub2RlLCBuYW1lKSB7DQoJCQl2YXIgc3R5bGVWYWwgPSBkb20uZ2V0U3R5bGUobm9kZSwgbmFtZSk7DQoNCgkJCS8vIEZvcmNlIHRoZSBmb3JtYXQgdG8gaGV4DQoJCQlpZiAobmFtZSA9PSAnY29sb3InIHx8IG5hbWUgPT0gJ2JhY2tncm91bmRDb2xvcicpDQoJCQkJc3R5bGVWYWwgPSBkb20udG9IZXgoc3R5bGVWYWwpOw0KDQoJCQkvLyBPcGVyYSB3aWxsIHJldHVybiBib2xkIGFzIDcwMA0KCQkJaWYgKG5hbWUgPT0gJ2ZvbnRXZWlnaHQnICYmIHN0eWxlVmFsID09IDcwMCkNCgkJCQlzdHlsZVZhbCA9ICdib2xkJzsNCg0KCQkJcmV0dXJuICcnICsgc3R5bGVWYWw7DQoJCX07DQoNCgkJZnVuY3Rpb24gcmVwbGFjZVZhcnModmFsdWUsIHZhcnMpIHsNCgkJCWlmICh0eXBlb2YodmFsdWUpICE9ICJzdHJpbmciKQ0KCQkJCXZhbHVlID0gdmFsdWUodmFycyk7DQoJCQllbHNlIGlmICh2YXJzKSB7DQoJCQkJdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC8lKFx3KykvZywgZnVuY3Rpb24oc3RyLCBuYW1lKSB7DQoJCQkJCXJldHVybiB2YXJzW25hbWVdIHx8IHN0cjsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJcmV0dXJuIHZhbHVlOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGlzV2hpdGVTcGFjZU5vZGUobm9kZSkgew0KCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMyAmJiAvXihbXHNcclxuXSt8KSQvLnRlc3Qobm9kZS5ub2RlVmFsdWUpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHdyYXAobm9kZSwgbmFtZSwgYXR0cnMpIHsNCgkJCXZhciB3cmFwcGVyID0gZG9tLmNyZWF0ZShuYW1lLCBhdHRycyk7DQoNCgkJCW5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUod3JhcHBlciwgbm9kZSk7DQoJCQl3cmFwcGVyLmFwcGVuZENoaWxkKG5vZGUpOw0KDQoJCQlyZXR1cm4gd3JhcHBlcjsNCgkJfTsNCg0KCQlmdW5jdGlvbiBleHBhbmRSbmcocm5nLCBmb3JtYXQsIHJlbW92ZSkgew0KCQkJdmFyIHN0YXJ0Q29udGFpbmVyID0gcm5nLnN0YXJ0Q29udGFpbmVyLA0KCQkJCXN0YXJ0T2Zmc2V0ID0gcm5nLnN0YXJ0T2Zmc2V0LA0KCQkJCWVuZENvbnRhaW5lciA9IHJuZy5lbmRDb250YWluZXIsDQoJCQkJZW5kT2Zmc2V0ID0gcm5nLmVuZE9mZnNldCwgc2libGluZywgbGFzdElkeDsNCg0KCQkJLy8gVGhpcyBmdW5jdGlvbiB3YWxrcyB1cCB0aGUgdHJlZSBpZiB0aGVyZSBpcyBubyBzaWJsaW5ncyBiZWZvcmUvYWZ0ZXIgdGhlIG5vZGUNCgkJCWZ1bmN0aW9uIGZpbmRQYXJlbnRDb250YWluZXIoY29udGFpbmVyLCBjaGlsZF9uYW1lLCBzaWJsaW5nX25hbWUsIHJvb3QpIHsNCgkJCQl2YXIgcGFyZW50LCBjaGlsZDsNCg0KCQkJCXJvb3QgPSByb290IHx8IGRvbS5nZXRSb290KCk7DQoNCgkJCQlmb3IgKDs7KSB7DQoJCQkJCS8vIENoZWNrIGlmIHdlIGNhbiBtb3ZlIHVwIGFyZSB3ZSBhdCByb290IGxldmVsIG9yIGJvZHkgbGV2ZWwNCgkJCQkJcGFyZW50ID0gY29udGFpbmVyLnBhcmVudE5vZGU7DQoNCgkJCQkJLy8gU3RvcCBleHBhbmRpbmcgb24gYmxvY2sgZWxlbWVudHMgb3Igcm9vdCBkZXBlbmRpbmcgb24gZm9ybWF0DQoJCQkJCWlmIChwYXJlbnQgPT0gcm9vdCB8fCAoIWZvcm1hdFswXS5ibG9ja19leHBhbmQgJiYgaXNCbG9jayhwYXJlbnQpKSkNCgkJCQkJCXJldHVybiBjb250YWluZXI7DQoNCgkJCQkJZm9yIChzaWJsaW5nID0gcGFyZW50W2NoaWxkX25hbWVdOyBzaWJsaW5nICYmIHNpYmxpbmcgIT0gY29udGFpbmVyOyBzaWJsaW5nID0gc2libGluZ1tzaWJsaW5nX25hbWVdKSB7DQoJCQkJCQlpZiAoc2libGluZy5ub2RlVHlwZSA9PSAxICYmICFpc0Jvb2ttYXJrTm9kZShzaWJsaW5nKSkNCgkJCQkJCQlyZXR1cm4gY29udGFpbmVyOw0KDQoJCQkJCQlpZiAoc2libGluZy5ub2RlVHlwZSA9PSAzICYmICFpc1doaXRlU3BhY2VOb2RlKHNpYmxpbmcpKQ0KCQkJCQkJCXJldHVybiBjb250YWluZXI7DQoJCQkJCX0NCg0KCQkJCQljb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gY29udGFpbmVyOw0KCQkJfTsNCg0KCQkJLy8gSWYgaW5kZXggYmFzZWQgc3RhcnQgcG9zaXRpb24gdGhlbiByZXNvbHZlIGl0DQoJCQlpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMSAmJiBzdGFydENvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCkpIHsNCgkJCQlsYXN0SWR4ID0gc3RhcnRDb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggLSAxOw0KCQkJCXN0YXJ0Q29udGFpbmVyID0gc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tzdGFydE9mZnNldCA+IGxhc3RJZHggPyBsYXN0SWR4IDogc3RhcnRPZmZzZXRdOw0KDQoJCQkJaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDMpDQoJCQkJCXN0YXJ0T2Zmc2V0ID0gMDsNCgkJCX0NCg0KCQkJLy8gSWYgaW5kZXggYmFzZWQgZW5kIHBvc2l0aW9uIHRoZW4gcmVzb2x2ZSBpdA0KCQkJaWYgKGVuZENvbnRhaW5lci5ub2RlVHlwZSA9PSAxICYmIGVuZENvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCkpIHsNCgkJCQlsYXN0SWR4ID0gZW5kQ29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsNCgkJCQllbmRDb250YWluZXIgPSBlbmRDb250YWluZXIuY2hpbGROb2Rlc1tlbmRPZmZzZXQgPiBsYXN0SWR4ID8gbGFzdElkeCA6IGVuZE9mZnNldCAtIDFdOw0KDQoJCQkJaWYgKGVuZENvbnRhaW5lci5ub2RlVHlwZSA9PSAzKQ0KCQkJCQllbmRPZmZzZXQgPSBlbmRDb250YWluZXIubm9kZVZhbHVlLmxlbmd0aDsNCgkJCX0NCg0KCQkJLy8gRXhjbHVkZSBib29rbWFyayBub2RlcyBpZiBwb3NzaWJsZQ0KCQkJaWYgKGlzQm9va21hcmtOb2RlKHN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGUpKQ0KCQkJCXN0YXJ0Q29udGFpbmVyID0gc3RhcnRDb250YWluZXIucGFyZW50Tm9kZTsNCg0KCQkJaWYgKGlzQm9va21hcmtOb2RlKHN0YXJ0Q29udGFpbmVyKSkNCgkJCQlzdGFydENvbnRhaW5lciA9IHN0YXJ0Q29udGFpbmVyLm5leHRTaWJsaW5nIHx8IHN0YXJ0Q29udGFpbmVyOw0KDQoJCQlpZiAoaXNCb29rbWFya05vZGUoZW5kQ29udGFpbmVyLnBhcmVudE5vZGUpKQ0KCQkJCWVuZENvbnRhaW5lciA9IGVuZENvbnRhaW5lci5wYXJlbnROb2RlOw0KDQoJCQlpZiAoaXNCb29rbWFya05vZGUoZW5kQ29udGFpbmVyKSkNCgkJCQllbmRDb250YWluZXIgPSBlbmRDb250YWluZXIucHJldmlvdXNTaWJsaW5nIHx8IGVuZENvbnRhaW5lcjsNCg0KCQkJLy8gTW92ZSBzdGFydC9lbmQgcG9pbnQgdXAgdGhlIHRyZWUgaWYgdGhlIGxlYXZlcyBhcmUgc2hhcnAgYW5kIGlmIHdlIGFyZSBpbiBkaWZmZXJlbnQgY29udGFpbmVycw0KCQkJLy8gRXhhbXBsZSAqIGJlY29tZXMgITogITxwPjxiPjxpPip0ZXh0PC9pPjxpPnRleHQqPC9pPjwvYj48L3A+IQ0KCQkJLy8gVGhpcyB3aWxsIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHdyYXBwZXIgZWxlbWVudHMgdGhhdCBuZWVkcyB0byBiZSBjcmVhdGVkDQoJCQkvLyBNb3ZlIHN0YXJ0IHBvaW50IHVwIHRoZSB0cmVlDQoJCQlpZiAoZm9ybWF0WzBdLmlubGluZSB8fCBmb3JtYXRbMF0uYmxvY2tfZXhwYW5kKSB7DQoJCQkJc3RhcnRDb250YWluZXIgPSBmaW5kUGFyZW50Q29udGFpbmVyKHN0YXJ0Q29udGFpbmVyLCAnZmlyc3RDaGlsZCcsICduZXh0U2libGluZycpOw0KCQkJCWVuZENvbnRhaW5lciA9IGZpbmRQYXJlbnRDb250YWluZXIoZW5kQ29udGFpbmVyLCAnbGFzdENoaWxkJywgJ3ByZXZpb3VzU2libGluZycpOw0KCQkJfQ0KDQoJCQkvLyBFeHBhbmQgc3RhcnQvZW5kIGNvbnRhaW5lciB0byBtYXRjaGluZyBzZWxlY3Rvcg0KCQkJaWYgKGZvcm1hdFswXS5zZWxlY3RvciAmJiBmb3JtYXRbMF0uZXhwYW5kICE9PSBGQUxTRSAmJiAhZm9ybWF0WzBdLmlubGluZSkgew0KCQkJCWZ1bmN0aW9uIGZpbmRTZWxlY3RvckVuZFBvaW50KGNvbnRhaW5lciwgc2libGluZ19uYW1lKSB7DQoJCQkJCXZhciBwYXJlbnRzLCBpLCB5Ow0KDQoJCQkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMyAmJiBjb250YWluZXIubm9kZVZhbHVlLmxlbmd0aCA9PSAwICYmIGNvbnRhaW5lcltzaWJsaW5nX25hbWVdKQ0KCQkJCQkJY29udGFpbmVyID0gY29udGFpbmVyW3NpYmxpbmdfbmFtZV07DQoNCgkJCQkJcGFyZW50cyA9IGdldFBhcmVudHMoY29udGFpbmVyKTsNCgkJCQkJZm9yIChpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpKyspIHsNCgkJCQkJCWZvciAoeSA9IDA7IHkgPCBmb3JtYXQubGVuZ3RoOyB5KyspIHsNCgkJCQkJCQlpZiAoZG9tLmlzKHBhcmVudHNbaV0sIGZvcm1hdFt5XS5zZWxlY3RvcikpDQoJCQkJCQkJCXJldHVybiBwYXJlbnRzW2ldOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCgkJCQl9Ow0KDQoJCQkJLy8gRmluZCBuZXcgc3RhcnRDb250YWluZXIvZW5kQ29udGFpbmVyIGlmIHRoZXJlIGlzIGJldHRlciBvbmUNCgkJCQlzdGFydENvbnRhaW5lciA9IGZpbmRTZWxlY3RvckVuZFBvaW50KHN0YXJ0Q29udGFpbmVyLCAncHJldmlvdXNTaWJsaW5nJyk7DQoJCQkJZW5kQ29udGFpbmVyID0gZmluZFNlbGVjdG9yRW5kUG9pbnQoZW5kQ29udGFpbmVyLCAnbmV4dFNpYmxpbmcnKTsNCgkJCX0NCg0KCQkJLy8gRXhwYW5kIHN0YXJ0L2VuZCBjb250YWluZXIgdG8gbWF0Y2hpbmcgYmxvY2sgZWxlbWVudCBvciB0ZXh0IG5vZGUNCgkJCWlmIChmb3JtYXRbMF0uYmxvY2sgfHwgZm9ybWF0WzBdLnNlbGVjdG9yKSB7DQoJCQkJZnVuY3Rpb24gZmluZEJsb2NrRW5kUG9pbnQoY29udGFpbmVyLCBzaWJsaW5nX25hbWUsIHNpYmxpbmdfbmFtZTIpIHsNCgkJCQkJdmFyIG5vZGU7DQoNCgkJCQkJLy8gRXhwYW5kIHRvIGJsb2NrIG9mIHNpbWlsYXIgdHlwZQ0KCQkJCQlpZiAoIWZvcm1hdFswXS53cmFwcGVyKQ0KCQkJCQkJbm9kZSA9IGRvbS5nZXRQYXJlbnQoY29udGFpbmVyLCBmb3JtYXRbMF0uYmxvY2spOw0KDQoJCQkJCS8vIEV4cGFuZCB0byBmaXJzdCB3cmFwcGFibGUgYmxvY2sgZWxlbWVudCBvciBhbnkgYmxvY2sgZWxlbWVudA0KCQkJCQlpZiAoIW5vZGUpDQoJCQkJCQlub2RlID0gZG9tLmdldFBhcmVudChjb250YWluZXIubm9kZVR5cGUgPT0gMyA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyLCBpc0Jsb2NrKTsNCg0KCQkJCQkvLyBFeGNsdWRlIGlubmVyIGxpc3RzIGZyb20gd3JhcHBpbmcNCgkJCQkJaWYgKG5vZGUgJiYgZm9ybWF0WzBdLndyYXBwZXIpDQoJCQkJCQlub2RlID0gZ2V0UGFyZW50cyhub2RlLCAndWwsb2wnKS5yZXZlcnNlKClbMF0gfHwgbm9kZTsNCg0KCQkJCQkvLyBEaWRuJ3QgZmluZCBhIGJsb2NrIGVsZW1lbnQgbG9vayBmb3IgZmlyc3QvbGFzdCB3cmFwcGFibGUgZWxlbWVudA0KCQkJCQlpZiAoIW5vZGUpIHsNCgkJCQkJCW5vZGUgPSBjb250YWluZXI7DQoNCgkJCQkJCXdoaWxlIChub2RlW3NpYmxpbmdfbmFtZV0gJiYgIWlzQmxvY2sobm9kZVtzaWJsaW5nX25hbWVdKSkgew0KCQkJCQkJCW5vZGUgPSBub2RlW3NpYmxpbmdfbmFtZV07DQoNCgkJCQkJCQkvLyBCcmVhayBvbiBCUiBidXQgaW5jbHVkZSBpdCB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIgb24NCgkJCQkJCQkvLyB3ZSBjYW4ndCByZW1vdmUgaXQgbm93IHNpbmNlIHdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgY2FuIGJlIHdyYXBwZWQNCgkJCQkJCQlpZiAoaXNFcShub2RlLCAnYnInKSkNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQlyZXR1cm4gbm9kZSB8fCBjb250YWluZXI7DQoJCQkJfTsNCg0KCQkJCS8vIEZpbmQgbmV3IHN0YXJ0Q29udGFpbmVyL2VuZENvbnRhaW5lciBpZiB0aGVyZSBpcyBiZXR0ZXIgb25lDQoJCQkJc3RhcnRDb250YWluZXIgPSBmaW5kQmxvY2tFbmRQb2ludChzdGFydENvbnRhaW5lciwgJ3ByZXZpb3VzU2libGluZycpOw0KCQkJCWVuZENvbnRhaW5lciA9IGZpbmRCbG9ja0VuZFBvaW50KGVuZENvbnRhaW5lciwgJ25leHRTaWJsaW5nJyk7DQoNCgkJCQkvLyBOb24gYmxvY2sgZWxlbWVudCB0aGVuIHRyeSB0byBleHBhbmQgdXAgdGhlIGxlYWYNCgkJCQlpZiAoZm9ybWF0WzBdLmJsb2NrKSB7DQoJCQkJCWlmICghaXNCbG9jayhzdGFydENvbnRhaW5lcikpDQoJCQkJCQlzdGFydENvbnRhaW5lciA9IGZpbmRQYXJlbnRDb250YWluZXIoc3RhcnRDb250YWluZXIsICdmaXJzdENoaWxkJywgJ25leHRTaWJsaW5nJyk7DQoNCgkJCQkJaWYgKCFpc0Jsb2NrKGVuZENvbnRhaW5lcikpDQoJCQkJCQllbmRDb250YWluZXIgPSBmaW5kUGFyZW50Q29udGFpbmVyKGVuZENvbnRhaW5lciwgJ2xhc3RDaGlsZCcsICdwcmV2aW91c1NpYmxpbmcnKTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFNldHVwIGluZGV4IGZvciBzdGFydENvbnRhaW5lcg0KCQkJaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDEpIHsNCgkJCQlzdGFydE9mZnNldCA9IG5vZGVJbmRleChzdGFydENvbnRhaW5lcik7DQoJCQkJc3RhcnRDb250YWluZXIgPSBzdGFydENvbnRhaW5lci5wYXJlbnROb2RlOw0KCQkJfQ0KDQoJCQkvLyBTZXR1cCBpbmRleCBmb3IgZW5kQ29udGFpbmVyDQoJCQlpZiAoZW5kQ29udGFpbmVyLm5vZGVUeXBlID09IDEpIHsNCgkJCQllbmRPZmZzZXQgPSBub2RlSW5kZXgoZW5kQ29udGFpbmVyKSArIDE7DQoJCQkJZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyLnBhcmVudE5vZGU7DQoJCQl9DQoNCgkJCS8vIFJldHVybiBuZXcgcmFuZ2UgbGlrZSBvYmplY3QNCgkJCXJldHVybiB7DQoJCQkJc3RhcnRDb250YWluZXIgOiBzdGFydENvbnRhaW5lciwNCgkJCQlzdGFydE9mZnNldCA6IHN0YXJ0T2Zmc2V0LA0KCQkJCWVuZENvbnRhaW5lciA6IGVuZENvbnRhaW5lciwNCgkJCQllbmRPZmZzZXQgOiBlbmRPZmZzZXQNCgkJCX07DQoJCX0NCg0KCQlmdW5jdGlvbiByZW1vdmVGb3JtYXQoZm9ybWF0LCB2YXJzLCBub2RlLCBjb21wYXJlX25vZGUpIHsNCgkJCXZhciBpLCBhdHRycywgc3R5bGVzTW9kaWZpZWQ7DQoNCgkJCS8vIENoZWNrIGlmIG5vZGUgbWF0Y2hlcyBmb3JtYXQNCgkJCWlmICghbWF0Y2hOYW1lKG5vZGUsIGZvcm1hdCkpDQoJCQkJcmV0dXJuIEZBTFNFOw0KDQoJCQkvLyBTaG91bGQgd2UgY29tcGFyZSB3aXRoIGZvcm1hdCBhdHRyaWJzIGFuZCBzdHlsZXMNCgkJCWlmIChmb3JtYXQucmVtb3ZlICE9ICdhbGwnKSB7DQoJCQkJLy8gUmVtb3ZlIHN0eWxlcw0KCQkJCWVhY2goZm9ybWF0LnN0eWxlcywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsNCgkJCQkJdmFsdWUgPSByZXBsYWNlVmFycyh2YWx1ZSwgdmFycyk7DQoNCgkJCQkJLy8gSW5kZXhlZCBhcnJheQ0KCQkJCQlpZiAodHlwZW9mKG5hbWUpID09PSAnbnVtYmVyJykgew0KCQkJCQkJbmFtZSA9IHZhbHVlOw0KCQkJCQkJY29tcGFyZV9ub2RlID0gMDsNCgkJCQkJfQ0KDQoJCQkJCWlmICghY29tcGFyZV9ub2RlIHx8IGlzRXEoZ2V0U3R5bGUoY29tcGFyZV9ub2RlLCBuYW1lKSwgdmFsdWUpKQ0KCQkJCQkJZG9tLnNldFN0eWxlKG5vZGUsIG5hbWUsICcnKTsNCg0KCQkJCQlzdHlsZXNNb2RpZmllZCA9IDE7DQoJCQkJfSk7DQoNCgkJCQkvLyBSZW1vdmUgc3R5bGUgYXR0cmlidXRlIGlmIGl0J3MgZW1wdHkNCgkJCQlpZiAoc3R5bGVzTW9kaWZpZWQgJiYgZG9tLmdldEF0dHJpYihub2RlLCAnc3R5bGUnKSA9PSAnJykgew0KCQkJCQlub2RlLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTsNCgkJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ19tY2Vfc3R5bGUnKTsNCgkJCQl9DQoNCgkJCQkvLyBSZW1vdmUgYXR0cmlidXRlcw0KCQkJCWVhY2goZm9ybWF0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7DQoJCQkJCXZhciB2YWx1ZU91dDsNCg0KCQkJCQl2YWx1ZSA9IHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKTsNCg0KCQkJCQkvLyBJbmRleGVkIGFycmF5DQoJCQkJCWlmICh0eXBlb2YobmFtZSkgPT09ICdudW1iZXInKSB7DQoJCQkJCQluYW1lID0gdmFsdWU7DQoJCQkJCQljb21wYXJlX25vZGUgPSAwOw0KCQkJCQl9DQoNCgkJCQkJaWYgKCFjb21wYXJlX25vZGUgfHwgaXNFcShkb20uZ2V0QXR0cmliKGNvbXBhcmVfbm9kZSwgbmFtZSksIHZhbHVlKSkgew0KCQkJCQkJLy8gS2VlcCBpbnRlcm5hbCBjbGFzc2VzDQoJCQkJCQlpZiAobmFtZSA9PSAnY2xhc3MnKSB7DQoJCQkJCQkJdmFsdWUgPSBkb20uZ2V0QXR0cmliKG5vZGUsIG5hbWUpOw0KCQkJCQkJCWlmICh2YWx1ZSkgew0KCQkJCQkJCQkvLyBCdWlsZCBuZXcgY2xhc3MgdmFsdWUgd2hlcmUgZXZlcnl0aGluZyBpcyByZW1vdmVkIGV4Y2VwdCB0aGUgaW50ZXJuYWwgcHJlZml4ZWQgY2xhc3Nlcw0KCQkJCQkJCQl2YWx1ZU91dCA9ICcnOw0KCQkJCQkJCQllYWNoKHZhbHVlLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oY2xzKSB7DQoJCQkJCQkJCQlpZiAoL21jZVx3Ky8udGVzdChjbHMpKQ0KCQkJCQkJCQkJCXZhbHVlT3V0ICs9ICh2YWx1ZU91dCA/ICcgJyA6ICcnKSArIGNsczsNCgkJCQkJCQkJfSk7DQoNCgkJCQkJCQkJLy8gV2UgZ290IHNvbWUgaW50ZXJuYWwgY2xhc3NlcyBsZWZ0DQoJCQkJCQkJCWlmICh2YWx1ZU91dCkgew0KCQkJCQkJCQkJZG9tLnNldEF0dHJpYihub2RlLCBuYW1lLCB2YWx1ZU91dCk7DQoJCQkJCQkJCQlyZXR1cm47DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCS8vIElFNiBoYXMgYSBidWcgd2hlcmUgdGhlIGF0dHJpYnV0ZSBkb2Vzbid0IGdldCByZW1vdmVkIGNvcnJlY3RseQ0KCQkJCQkJaWYgKG5hbWUgPT0gImNsYXNzIikNCgkJCQkJCQlub2RlLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3NOYW1lJyk7DQoNCgkJCQkJCS8vIFJlbW92ZSBtY2UgcHJlZml4ZWQgYXR0cmlidXRlcw0KCQkJCQkJaWYgKE1DRV9BVFRSX1JFLnRlc3QobmFtZSkpDQoJCQkJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ19tY2VfJyArIG5hbWUpOw0KDQoJCQkJCQlub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJLy8gUmVtb3ZlIGNsYXNzZXMNCgkJCQllYWNoKGZvcm1hdC5jbGFzc2VzLCBmdW5jdGlvbih2YWx1ZSkgew0KCQkJCQl2YWx1ZSA9IHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKTsNCg0KCQkJCQlpZiAoIWNvbXBhcmVfbm9kZSB8fCBkb20uaGFzQ2xhc3MoY29tcGFyZV9ub2RlLCB2YWx1ZSkpDQoJCQkJCQlkb20ucmVtb3ZlQ2xhc3Mobm9kZSwgdmFsdWUpOw0KCQkJCX0pOw0KDQoJCQkJLy8gQ2hlY2sgZm9yIG5vbiBpbnRlcm5hbCBhdHRyaWJ1dGVzDQoJCQkJYXR0cnMgPSBkb20uZ2V0QXR0cmlicyhub2RlKTsNCgkJCQlmb3IgKGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsNCgkJCQkJaWYgKGF0dHJzW2ldLm5vZGVOYW1lLmluZGV4T2YoJ18nKSAhPT0gMCkNCgkJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFJlbW92ZSB0aGUgaW5saW5lIGNoaWxkIGlmIGl0J3MgZW1wdHkgZm9yIGV4YW1wbGUgPGI+IG9yIDxzcGFuPg0KCQkJaWYgKGZvcm1hdC5yZW1vdmUgIT0gJ25vbmUnKSB7DQoJCQkJcmVtb3ZlTm9kZShub2RlLCBmb3JtYXQpOw0KCQkJCXJldHVybiBUUlVFOw0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSwgZm9ybWF0KSB7DQoJCQl2YXIgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50Tm9kZSwgcm9vdEJsb2NrRWxtOw0KDQoJCQlpZiAoZm9ybWF0LmJsb2NrKSB7DQoJCQkJaWYgKCFmb3JjZWRSb290QmxvY2spIHsNCgkJCQkJZnVuY3Rpb24gZmluZChub2RlLCBuZXh0LCBpbmMpIHsNCgkJCQkJCW5vZGUgPSBnZXROb25XaGl0ZVNwYWNlU2libGluZyhub2RlLCBuZXh0LCBpbmMpOw0KDQoJCQkJCQlyZXR1cm4gIW5vZGUgfHwgKG5vZGUubm9kZU5hbWUgPT0gJ0JSJyB8fCBpc0Jsb2NrKG5vZGUpKTsNCgkJCQkJfTsNCg0KCQkJCQkvLyBBcHBlbmQgQlIgZWxlbWVudHMgaWYgbmVlZGVkIGJlZm9yZSB3ZSByZW1vdmUgdGhlIGJsb2NrDQoJCQkJCWlmIChpc0Jsb2NrKG5vZGUpICYmICFpc0Jsb2NrKHBhcmVudE5vZGUpKSB7DQoJCQkJCQlpZiAoIWZpbmQobm9kZSwgRkFMU0UpICYmICFmaW5kKG5vZGUuZmlyc3RDaGlsZCwgVFJVRSwgMSkpDQoJCQkJCQkJbm9kZS5pbnNlcnRCZWZvcmUoZG9tLmNyZWF0ZSgnYnInKSwgbm9kZS5maXJzdENoaWxkKTsNCg0KCQkJCQkJaWYgKCFmaW5kKG5vZGUsIFRSVUUpICYmICFmaW5kKG5vZGUubGFzdENoaWxkLCBGQUxTRSwgMSkpDQoJCQkJCQkJbm9kZS5hcHBlbmRDaGlsZChkb20uY3JlYXRlKCdicicpKTsNCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIFdyYXAgdGhlIGJsb2NrIGluIGEgZm9yY2VkUm9vdEJsb2NrIGlmIHdlIGFyZSBhdCB0aGUgcm9vdCBvZiBkb2N1bWVudA0KCQkJCQlpZiAocGFyZW50Tm9kZSA9PSBkb20uZ2V0Um9vdCgpKSB7DQoJCQkJCQlpZiAoIWZvcm1hdC5saXN0X2Jsb2NrIHx8ICFpc0VxKG5vZGUsIGZvcm1hdC5saXN0X2Jsb2NrKSkgew0KCQkJCQkJCWVhY2godGlueW1jZS5ncmVwKG5vZGUuY2hpbGROb2RlcyksIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCQkJaWYgKGlzVmFsaWQoZm9yY2VkUm9vdEJsb2NrLCBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7DQoJCQkJCQkJCQlpZiAoIXJvb3RCbG9ja0VsbSkNCgkJCQkJCQkJCQlyb290QmxvY2tFbG0gPSB3cmFwKG5vZGUsIGZvcmNlZFJvb3RCbG9jayk7DQoJCQkJCQkJCQllbHNlDQoJCQkJCQkJCQkJcm9vdEJsb2NrRWxtLmFwcGVuZENoaWxkKG5vZGUpOw0KCQkJCQkJCQl9IGVsc2UNCgkJCQkJCQkJCXJvb3RCbG9ja0VsbSA9IDA7DQoJCQkJCQkJfSk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCS8vIE5ldmVyIHJlbW92ZSBub2RlcyB0aGF0IGlzbid0IHRoZSBzcGVjaWZpZWQgaW5saW5lIGVsZW1lbnQgaWYgYSBzZWxlY3RvciBpcyBzcGVjaWZpZWQgdG9vDQoJCQlpZiAoZm9ybWF0LnNlbGVjdG9yICYmIGZvcm1hdC5pbmxpbmUgJiYgIWlzRXEoZm9ybWF0LmlubGluZSwgbm9kZSkpDQoJCQkJcmV0dXJuOw0KDQoJCQlkb20ucmVtb3ZlKG5vZGUsIDEpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGdldE5vbldoaXRlU3BhY2VTaWJsaW5nKG5vZGUsIG5leHQsIGluYykgew0KCQkJaWYgKG5vZGUpIHsNCgkJCQluZXh0ID0gbmV4dCA/ICduZXh0U2libGluZycgOiAncHJldmlvdXNTaWJsaW5nJzsNCg0KCQkJCWZvciAobm9kZSA9IGluYyA/IG5vZGUgOiBub2RlW25leHRdOyBub2RlOyBub2RlID0gbm9kZVtuZXh0XSkgew0KCQkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAxIHx8ICFpc1doaXRlU3BhY2VOb2RlKG5vZGUpKQ0KCQkJCQkJcmV0dXJuIG5vZGU7DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGlzQm9va21hcmtOb2RlKG5vZGUpIHsNCgkJCXJldHVybiBub2RlICYmIG5vZGUubm9kZVR5cGUgPT0gMSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnX21jZV90eXBlJykgPT0gJ2Jvb2ttYXJrJzsNCgkJfTsNCg0KCQlmdW5jdGlvbiBtZXJnZVNpYmxpbmdzKHByZXYsIG5leHQpIHsNCgkJCXZhciBtYXJrZXIsIHNpYmxpbmcsIHRtcFNpYmxpbmc7DQoNCgkJCWZ1bmN0aW9uIGNvbXBhcmVFbGVtZW50cyhub2RlMSwgbm9kZTIpIHsNCgkJCQkvLyBOb3QgdGhlIHNhbWUgbmFtZQ0KCQkJCWlmIChub2RlMS5ub2RlTmFtZSAhPSBub2RlMi5ub2RlTmFtZSkNCgkJCQkJcmV0dXJuIEZBTFNFOw0KDQoJCQkJZnVuY3Rpb24gZ2V0QXR0cmlicyhub2RlKSB7DQoJCQkJCXZhciBhdHRyaWJzID0ge307DQoNCgkJCQkJZWFjaChkb20uZ2V0QXR0cmlicyhub2RlKSwgZnVuY3Rpb24oYXR0cikgew0KCQkJCQkJdmFyIG5hbWUgPSBhdHRyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7DQoNCgkJCQkJCS8vIERvbid0IGNvbXBhcmUgaW50ZXJuYWwgYXR0cmlidXRlcyBvciBzdHlsZQ0KCQkJCQkJaWYgKG5hbWUuaW5kZXhPZignXycpICE9PSAwICYmIG5hbWUgIT09ICdzdHlsZScpDQoJCQkJCQkJYXR0cmlic1tuYW1lXSA9IGRvbS5nZXRBdHRyaWIobm9kZSwgbmFtZSk7DQoJCQkJCX0pOw0KDQoJCQkJCXJldHVybiBhdHRyaWJzOw0KCQkJCX07DQoNCgkJCQlmdW5jdGlvbiBjb21wYXJlT2JqZWN0cyhvYmoxLCBvYmoyKSB7DQoJCQkJCXZhciB2YWx1ZSwgbmFtZTsNCg0KCQkJCQlmb3IgKG5hbWUgaW4gb2JqMSkgew0KCQkJCQkJLy8gT2JqMSBoYXMgaXRlbSBvYmoyIGRvZXNuJ3QgaGF2ZQ0KCQkJCQkJaWYgKG9iajEuaGFzT3duUHJvcGVydHkobmFtZSkpIHsNCgkJCQkJCQl2YWx1ZSA9IG9iajJbbmFtZV07DQoNCgkJCQkJCQkvLyBPYmoyIGRvZXNuJ3QgaGF2ZSBvYmoxIGl0ZW0NCgkJCQkJCQlpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkNCgkJCQkJCQkJcmV0dXJuIEZBTFNFOw0KDQoJCQkJCQkJLy8gT2JqMiBpdGVtIGhhcyBhIGRpZmZlcmVudCB2YWx1ZQ0KCQkJCQkJCWlmIChvYmoxW25hbWVdICE9IHZhbHVlKQ0KCQkJCQkJCQlyZXR1cm4gRkFMU0U7DQoNCgkJCQkJCQkvLyBEZWxldGUgc2ltaWxhciB2YWx1ZQ0KCQkJCQkJCWRlbGV0ZSBvYmoyW25hbWVdOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJLy8gQ2hlY2sgaWYgb2JqIDIgaGFzIHNvbWV0aGluZyBvYmogMSBkb2Vzbid0IGhhdmUNCgkJCQkJZm9yIChuYW1lIGluIG9iajIpIHsNCgkJCQkJCS8vIE9iajIgaGFzIGl0ZW0gb2JqMSBkb2Vzbid0IGhhdmUNCgkJCQkJCWlmIChvYmoyLmhhc093blByb3BlcnR5KG5hbWUpKQ0KCQkJCQkJCXJldHVybiBGQUxTRTsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiBUUlVFOw0KCQkJCX07DQoNCgkJCQkvLyBBdHRyaWJzIGFyZSBub3QgdGhlIHNhbWUNCgkJCQlpZiAoIWNvbXBhcmVPYmplY3RzKGdldEF0dHJpYnMobm9kZTEpLCBnZXRBdHRyaWJzKG5vZGUyKSkpDQoJCQkJCXJldHVybiBGQUxTRTsNCg0KCQkJCS8vIFN0eWxlcyBhcmUgbm90IHRoZSBzYW1lDQoJCQkJaWYgKCFjb21wYXJlT2JqZWN0cyhkb20ucGFyc2VTdHlsZShkb20uZ2V0QXR0cmliKG5vZGUxLCAnc3R5bGUnKSksIGRvbS5wYXJzZVN0eWxlKGRvbS5nZXRBdHRyaWIobm9kZTIsICdzdHlsZScpKSkpDQoJCQkJCXJldHVybiBGQUxTRTsNCg0KCQkJCXJldHVybiBUUlVFOw0KCQkJfTsNCg0KCQkJLy8gQ2hlY2sgaWYgbmV4dC9wcmV2IGV4aXN0cyBhbmQgdGhhdCB0aGV5IGFyZSBlbGVtZW50cw0KCQkJaWYgKHByZXYgJiYgbmV4dCkgew0KCQkJCWZ1bmN0aW9uIGZpbmRFbGVtZW50U2libGluZyhub2RlLCBzaWJsaW5nX25hbWUpIHsNCgkJCQkJZm9yIChzaWJsaW5nID0gbm9kZTsgc2libGluZzsgc2libGluZyA9IHNpYmxpbmdbc2libGluZ19uYW1lXSkgew0KCQkJCQkJaWYgKHNpYmxpbmcubm9kZVR5cGUgPT0gMyAmJiAhaXNXaGl0ZVNwYWNlTm9kZShzaWJsaW5nKSkNCgkJCQkJCQlyZXR1cm4gbm9kZTsNCg0KCQkJCQkJaWYgKHNpYmxpbmcubm9kZVR5cGUgPT0gMSAmJiAhaXNCb29rbWFya05vZGUoc2libGluZykpDQoJCQkJCQkJcmV0dXJuIHNpYmxpbmc7DQoJCQkJCX0NCg0KCQkJCQlyZXR1cm4gbm9kZTsNCgkJCQl9Ow0KDQoJCQkJLy8gSWYgcHJldmlvdXMgc2libGluZyBpcyBlbXB0eSB0aGVuIGp1bXAgb3ZlciBpdA0KCQkJCXByZXYgPSBmaW5kRWxlbWVudFNpYmxpbmcocHJldiwgJ3ByZXZpb3VzU2libGluZycpOw0KCQkJCW5leHQgPSBmaW5kRWxlbWVudFNpYmxpbmcobmV4dCwgJ25leHRTaWJsaW5nJyk7DQoNCgkJCQkvLyBDb21wYXJlIG5leHQgYW5kIHByZXZpb3VzIG5vZGVzDQoJCQkJaWYgKGNvbXBhcmVFbGVtZW50cyhwcmV2LCBuZXh0KSkgew0KCQkJCQkvLyBBcHBlbmQgbm9kZXMgYmV0d2Vlbg0KCQkJCQlmb3IgKHNpYmxpbmcgPSBwcmV2Lm5leHRTaWJsaW5nOyBzaWJsaW5nICYmIHNpYmxpbmcgIT0gbmV4dDspIHsNCgkJCQkJCXRtcFNpYmxpbmcgPSBzaWJsaW5nOw0KCQkJCQkJc2libGluZyA9IHNpYmxpbmcubmV4dFNpYmxpbmc7DQoJCQkJCQlwcmV2LmFwcGVuZENoaWxkKHRtcFNpYmxpbmcpOw0KCQkJCQl9DQoNCgkJCQkJLy8gUmVtb3ZlIG5leHQgbm9kZQ0KCQkJCQlkb20ucmVtb3ZlKG5leHQpOw0KDQoJCQkJCS8vIE1vdmUgY2hpbGRyZW4gaW50byBwcmV2IG5vZGUNCgkJCQkJZWFjaCh0aW55bWNlLmdyZXAobmV4dC5jaGlsZE5vZGVzKSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJcHJldi5hcHBlbmRDaGlsZChub2RlKTsNCgkJCQkJfSk7DQoNCgkJCQkJcmV0dXJuIHByZXY7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gbmV4dDsNCgkJfTsNCg0KCQlmdW5jdGlvbiBpc1RleHRCbG9jayhuYW1lKSB7DQoJCQlyZXR1cm4gL14oaFsxLTZdfHB8ZGl2fHByZXxhZGRyZXNzfGRsfGR0fGRkKSQvLnRlc3QobmFtZSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZ2V0Q29udGFpbmVyKHJuZywgc3RhcnQpIHsNCgkJCXZhciBjb250YWluZXIsIG9mZnNldCwgbGFzdElkeDsNCg0KCQkJY29udGFpbmVyID0gcm5nW3N0YXJ0ID8gJ3N0YXJ0Q29udGFpbmVyJyA6ICdlbmRDb250YWluZXInXTsNCgkJCW9mZnNldCA9IHJuZ1tzdGFydCA/ICdzdGFydE9mZnNldCcgOiAnZW5kT2Zmc2V0J107DQoNCgkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMSkgew0KCQkJCWxhc3RJZHggPSBjb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggLSAxOw0KDQoJCQkJaWYgKCFzdGFydCAmJiBvZmZzZXQpDQoJCQkJCW9mZnNldC0tOw0KDQoJCQkJY29udGFpbmVyID0gY29udGFpbmVyLmNoaWxkTm9kZXNbb2Zmc2V0ID4gbGFzdElkeCA/IGxhc3RJZHggOiBvZmZzZXRdOw0KCQkJfQ0KDQoJCQlyZXR1cm4gY29udGFpbmVyOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHBlcmZvcm1DYXJldEFjdGlvbih0eXBlLCBuYW1lLCB2YXJzKSB7DQoJCQl2YXIgaSwgY3VycmVudFBlbmRpbmdGb3JtYXRzID0gcGVuZGluZ0Zvcm1hdHNbdHlwZV0sDQoJCQkJb3RoZXJQZW5kaW5nRm9ybWF0cyA9IHBlbmRpbmdGb3JtYXRzW3R5cGUgPT0gJ2FwcGx5JyA/ICdyZW1vdmUnIDogJ2FwcGx5J107DQoNCgkJCWZ1bmN0aW9uIGhhc1BlbmRpbmcoKSB7DQoJCQkJcmV0dXJuIHBlbmRpbmdGb3JtYXRzLmFwcGx5Lmxlbmd0aCB8fCBwZW5kaW5nRm9ybWF0cy5yZW1vdmUubGVuZ3RoOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gcmVzZXRQZW5kaW5nKCkgew0KCQkJCXBlbmRpbmdGb3JtYXRzLmFwcGx5ID0gW107DQoJCQkJcGVuZGluZ0Zvcm1hdHMucmVtb3ZlID0gW107DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBwZXJmb3JtKGNhcmV0X25vZGUpIHsNCgkJCQkvLyBBcHBseSBwZW5kaW5nIGZvcm1hdHMNCgkJCQllYWNoKHBlbmRpbmdGb3JtYXRzLmFwcGx5LnJldmVyc2UoKSwgZnVuY3Rpb24oaXRlbSkgew0KCQkJCQlhcHBseShpdGVtLm5hbWUsIGl0ZW0udmFycywgY2FyZXRfbm9kZSk7DQoJCQkJfSk7DQoNCgkJCQkvLyBSZW1vdmUgcGVuZGluZyBmb3JtYXRzDQoJCQkJZWFjaChwZW5kaW5nRm9ybWF0cy5yZW1vdmUucmV2ZXJzZSgpLCBmdW5jdGlvbihpdGVtKSB7DQoJCQkJCXJlbW92ZShpdGVtLm5hbWUsIGl0ZW0udmFycywgY2FyZXRfbm9kZSk7DQoJCQkJfSk7DQoNCgkJCQlkb20ucmVtb3ZlKGNhcmV0X25vZGUsIDEpOw0KCQkJCXJlc2V0UGVuZGluZygpOw0KCQkJfTsNCg0KCQkJLy8gQ2hlY2sgaWYgaXQgYWxyZWFkeSBleGlzdHMgdGhlbiBpZ25vcmUgaXQNCgkJCWZvciAoaSA9IGN1cnJlbnRQZW5kaW5nRm9ybWF0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCWlmIChjdXJyZW50UGVuZGluZ0Zvcm1hdHNbaV0ubmFtZSA9PSBuYW1lKQ0KCQkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCWN1cnJlbnRQZW5kaW5nRm9ybWF0cy5wdXNoKHtuYW1lIDogbmFtZSwgdmFycyA6IHZhcnN9KTsNCg0KCQkJLy8gQ2hlY2sgaWYgaXQncyBpbiB0aGUgb3RoZXIgdHlwZSwgdGhlbiByZW1vdmUgaXQNCgkJCWZvciAoaSA9IG90aGVyUGVuZGluZ0Zvcm1hdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQlpZiAob3RoZXJQZW5kaW5nRm9ybWF0c1tpXS5uYW1lID09IG5hbWUpDQoJCQkJCW90aGVyUGVuZGluZ0Zvcm1hdHMuc3BsaWNlKGksIDEpOw0KCQkJfQ0KDQoJCQkvLyBQZW5kaW5nIGFwcGx5IG9yIHJlbW92ZSBmb3JtYXRzDQoJCQlpZiAoaGFzUGVuZGluZygpKSB7DQoJCQkJZWQuZ2V0RG9jKCkuZXhlY0NvbW1hbmQoJ0ZvbnROYW1lJywgZmFsc2UsICdtY2VpbmxpbmUnKTsNCgkJCQlwZW5kaW5nRm9ybWF0cy5sYXN0Um5nID0gc2VsZWN0aW9uLmdldFJuZygpOw0KDQoJCQkJLy8gSUUgd2lsbCBjb252ZXJ0IHRoZSBjdXJyZW50IHdvcmQNCgkJCQllYWNoKGRvbS5zZWxlY3QoJ2ZvbnQsc3BhbicpLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCXZhciBib29rbWFyazsNCg0KCQkJCQlpZiAoaXNDYXJldE5vZGUobm9kZSkpIHsNCgkJCQkJCWJvb2ttYXJrID0gc2VsZWN0aW9uLmdldEJvb2ttYXJrKCk7DQoJCQkJCQlwZXJmb3JtKG5vZGUpOw0KCQkJCQkJc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsNCgkJCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCS8vIE9ubHkgcmVnaXN0ZXIgbGlzdGVuZXJzIG9uY2UgaWYgd2UgbmVlZCB0bw0KCQkJCWlmICghcGVuZGluZ0Zvcm1hdHMuaXNMaXN0ZW5pbmcgJiYgaGFzUGVuZGluZygpKSB7DQoJCQkJCXBlbmRpbmdGb3JtYXRzLmlzTGlzdGVuaW5nID0gdHJ1ZTsNCg0KCQkJCQllYWNoKCdvbktleURvd24sb25LZXlVcCxvbktleVByZXNzLG9uTW91c2VVcCcuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXZlbnQpIHsNCgkJCQkJCWVkW2V2ZW50XS5hZGRUb1RvcChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJCS8vIERvIHdlIGhhdmUgcGVuZGluZyBmb3JtYXRzIGFuZCBpcyB0aGUgc2VsZWN0aW9uIG1vdmVkIGhhcyBtb3ZlZA0KCQkJCQkJCWlmIChoYXNQZW5kaW5nKCkgJiYgIXRpbnltY2UuZG9tLlJhbmdlVXRpbHMuY29tcGFyZVJhbmdlcyhwZW5kaW5nRm9ybWF0cy5sYXN0Um5nLCBzZWxlY3Rpb24uZ2V0Um5nKCkpKSB7DQoJCQkJCQkJCWVhY2goZG9tLnNlbGVjdCgnZm9udCxzcGFuJyksIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCQkJCXZhciB0ZXh0Tm9kZSwgcm5nOw0KDQoJCQkJCQkJCQkvLyBMb29rIGZvciBtYXJrZXINCgkJCQkJCQkJCWlmIChpc0NhcmV0Tm9kZShub2RlKSkgew0KCQkJCQkJCQkJCXRleHROb2RlID0gbm9kZS5maXJzdENoaWxkOw0KDQoJCQkJCQkJCQkJaWYgKHRleHROb2RlKSB7DQoJCQkJCQkJCQkJCXBlcmZvcm0obm9kZSk7DQoNCgkJCQkJCQkJCQkJcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KCQkJCQkJCQkJCQlybmcuc2V0U3RhcnQodGV4dE5vZGUsIHRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGgpOw0KCQkJCQkJCQkJCQlybmcuc2V0RW5kKHRleHROb2RlLCB0ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoKTsNCgkJCQkJCQkJCQkJc2VsZWN0aW9uLnNldFJuZyhybmcpOw0KCQkJCQkJCQkJCQllZC5ub2RlQ2hhbmdlZCgpOw0KCQkJCQkJCQkJCX0gZWxzZQ0KCQkJCQkJCQkJCQlkb20ucmVtb3ZlKG5vZGUpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9KTsNCg0KCQkJCQkJCQkvLyBBbHdheXMgdW5iaW5kIGFuZCBjbGVhciBwZW5kaW5nIHN0eWxlcyBvbiBrZXl1cA0KCQkJCQkJCQlpZiAoZS50eXBlID09ICdrZXl1cCcgfHwgZS50eXBlID09ICdtb3VzZXVwJykNCgkJCQkJCQkJCXJlc2V0UGVuZGluZygpOw0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9DQoJCX07DQoJfTsNCn0pKHRpbnltY2UpOw0KDQp0aW55bWNlLm9uQWRkRWRpdG9yLmFkZChmdW5jdGlvbih0aW55bWNlLCBlZCkgew0KCXZhciBmaWx0ZXJzLCBmb250U2l6ZXMsIGRvbSwgc2V0dGluZ3MgPSBlZC5zZXR0aW5nczsNCg0KCWlmIChzZXR0aW5ncy5pbmxpbmVfc3R5bGVzKSB7DQoJCWZvbnRTaXplcyA9IHRpbnltY2UuZXhwbG9kZShzZXR0aW5ncy5mb250X3NpemVfc3R5bGVfdmFsdWVzKTsNCg0KCQlmdW5jdGlvbiByZXBsYWNlV2l0aFNwYW4obm9kZSwgc3R5bGVzKSB7DQoJCQl0aW55bWNlLmVhY2goc3R5bGVzLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkgew0KCQkJCWlmICh2YWx1ZSkNCgkJCQkJZG9tLnNldFN0eWxlKG5vZGUsIG5hbWUsIHZhbHVlKTsNCgkJCX0pOw0KDQoJCQlkb20ucmVuYW1lKG5vZGUsICdzcGFuJyk7DQoJCX07DQoNCgkJZmlsdGVycyA9IHsNCgkJCWZvbnQgOiBmdW5jdGlvbihkb20sIG5vZGUpIHsNCgkJCQlyZXBsYWNlV2l0aFNwYW4obm9kZSwgew0KCQkJCQliYWNrZ3JvdW5kQ29sb3IgOiBub2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciwNCgkJCQkJY29sb3IgOiBub2RlLmNvbG9yLA0KCQkJCQlmb250RmFtaWx5IDogbm9kZS5mYWNlLA0KCQkJCQlmb250U2l6ZSA6IGZvbnRTaXplc1twYXJzZUludChub2RlLnNpemUpIC0gMV0NCgkJCQl9KTsNCgkJCX0sDQoNCgkJCXUgOiBmdW5jdGlvbihkb20sIG5vZGUpIHsNCgkJCQlyZXBsYWNlV2l0aFNwYW4obm9kZSwgew0KCQkJCQl0ZXh0RGVjb3JhdGlvbiA6ICd1bmRlcmxpbmUnDQoJCQkJfSk7DQoJCQl9LA0KDQoJCQlzdHJpa2UgOiBmdW5jdGlvbihkb20sIG5vZGUpIHsNCgkJCQlyZXBsYWNlV2l0aFNwYW4obm9kZSwgew0KCQkJCQl0ZXh0RGVjb3JhdGlvbiA6ICdsaW5lLXRocm91Z2gnDQoJCQkJfSk7DQoJCQl9DQoJCX07DQoNCgkJZnVuY3Rpb24gY29udmVydChlZGl0b3IsIHBhcmFtcykgew0KCQkJZG9tID0gZWRpdG9yLmRvbTsNCg0KCQkJaWYgKHNldHRpbmdzLmNvbnZlcnRfZm9udHNfdG9fc3BhbnMpIHsNCgkJCQl0aW55bWNlLmVhY2goZG9tLnNlbGVjdCgnZm9udCx1LHN0cmlrZScsIHBhcmFtcy5ub2RlKSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQlmaWx0ZXJzW25vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0oZWQuZG9tLCBub2RlKTsNCgkJCQl9KTsNCgkJCX0NCgkJfTsNCg0KCQllZC5vblByZVByb2Nlc3MuYWRkKGNvbnZlcnQpOw0KDQoJCWVkLm9uSW5pdC5hZGQoZnVuY3Rpb24oKSB7DQoJCQllZC5zZWxlY3Rpb24ub25TZXRDb250ZW50LmFkZChjb252ZXJ0KTsNCgkJfSk7DQoJfQ0KfSk7DQoNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/tiny_mce_popup.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ci8vIFVuY29tbWVudCBhbmQgY2hhbmdlIHRoaXMgZG9jdW1lbnQuZG9tYWluIHZhbHVlIGlmIHlvdSBhcmUgbG9hZGluZyB0aGUgc2NyaXB0IGNyb3NzIHN1YmRvbWFpbnMKLy8gZG9jdW1lbnQuZG9tYWluID0gJ21veGllY29kZS5jb20nOwoKdmFyIHRpbnltY2U9bnVsbCx0aW55TUNFUG9wdXAsdGlueU1DRTt0aW55TUNFUG9wdXA9e2luaXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGEsYzthPWIuZ2V0V2luKCk7dGlueW1jZT1hLnRpbnltY2U7dGlueU1DRT1hLnRpbnlNQ0U7Yi5lZGl0b3I9dGlueW1jZS5FZGl0b3JNYW5hZ2VyLmFjdGl2ZUVkaXRvcjtiLnBhcmFtcz1iLmVkaXRvci53aW5kb3dNYW5hZ2VyLnBhcmFtcztiLmZlYXR1cmVzPWIuZWRpdG9yLndpbmRvd01hbmFnZXIuZmVhdHVyZXM7Yi5kb209Yi5lZGl0b3Iud2luZG93TWFuYWdlci5jcmVhdGVJbnN0YW5jZSgidGlueW1jZS5kb20uRE9NVXRpbHMiLGRvY3VtZW50KTtpZihiLmZlYXR1cmVzLnBvcHVwX2NzcyE9PWZhbHNlKXtiLmRvbS5sb2FkQ1NTKGIuZmVhdHVyZXMucG9wdXBfY3NzfHxiLmVkaXRvci5zZXR0aW5ncy5wb3B1cF9jc3MpfWIubGlzdGVuZXJzPVtdO2Iub25Jbml0PXthZGQ6ZnVuY3Rpb24oZSxkKXtiLmxpc3RlbmVycy5wdXNoKHtmdW5jOmUsc2NvcGU6ZH0pfX07Yi5pc1dpbmRvdz0hYi5nZXRXaW5kb3dBcmcoIm1jZV9pbmxpbmUiKTtiLmlkPWIuZ2V0V2luZG93QXJnKCJtY2Vfd2luZG93X2lkIik7Yi5lZGl0b3Iud2luZG93TWFuYWdlci5vbk9wZW4uZGlzcGF0Y2goYi5lZGl0b3Iud2luZG93TWFuYWdlcix3aW5kb3cpfSxnZXRXaW46ZnVuY3Rpb24oKXtyZXR1cm4oIXdpbmRvdy5mcmFtZUVsZW1lbnQmJndpbmRvdy5kaWFsb2dBcmd1bWVudHMpfHxvcGVuZXJ8fHBhcmVudHx8dG9wfSxnZXRXaW5kb3dBcmc6ZnVuY3Rpb24oYyxiKXt2YXIgYT10aGlzLnBhcmFtc1tjXTtyZXR1cm4gdGlueW1jZS5pcyhhKT9hOmJ9LGdldFBhcmFtOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIHRoaXMuZWRpdG9yLmdldFBhcmFtKGIsYSl9LGdldExhbmc6ZnVuY3Rpb24oYixhKXtyZXR1cm4gdGhpcy5lZGl0b3IuZ2V0TGFuZyhiLGEpfSxleGVjQ29tbWFuZDpmdW5jdGlvbihkLGMsZSxiKXtiPWJ8fHt9O2Iuc2tpcF9mb2N1cz0xO3RoaXMucmVzdG9yZVNlbGVjdGlvbigpO3JldHVybiB0aGlzLmVkaXRvci5leGVjQ29tbWFuZChkLGMsZSxiKX0scmVzaXplVG9Jbm5lclNpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj1hLmRvbS5nZXRWaWV3UG9ydCh3aW5kb3cpO2EuZWRpdG9yLndpbmRvd01hbmFnZXIucmVzaXplQnkoYS5nZXRXaW5kb3dBcmcoIm1jZV93aWR0aCIpLWIudyxhLmdldFdpbmRvd0FyZygibWNlX2hlaWdodCIpLWIuaCxhLmlkfHx3aW5kb3cpfSwwKX0sZXhlY3V0ZU9uTG9hZDpmdW5jdGlvbihzKXt0aGlzLm9uSW5pdC5hZGQoZnVuY3Rpb24oKXtldmFsKHMpfSl9LHN0b3JlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5lZGl0b3Iud2luZG93TWFuYWdlci5ib29rbWFyaz10aW55TUNFUG9wdXAuZWRpdG9yLnNlbGVjdGlvbi5nZXRCb29rbWFyaygxKX0scmVzdG9yZVNlbGVjdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRpbnlNQ0VQb3B1cDtpZighYS5pc1dpbmRvdyYmdGlueW1jZS5pc0lFKXthLmVkaXRvci5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoYS5lZGl0b3Iud2luZG93TWFuYWdlci5ib29rbWFyayl9fSxyZXF1aXJlTGFuZ1BhY2s6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGE9Yi5nZXRXaW5kb3dBcmcoInBsdWdpbl91cmwiKXx8Yi5nZXRXaW5kb3dBcmcoInRoZW1lX3VybCIpO2lmKGEmJmIuZWRpdG9yLnNldHRpbmdzLmxhbmd1YWdlJiZiLmZlYXR1cmVzLnRyYW5zbGF0ZV9pMThuIT09ZmFsc2Upe2ErPSIvbGFuZ3MvIitiLmVkaXRvci5zZXR0aW5ncy5sYW5ndWFnZSsiX2RsZy5qcyI7aWYoIXRpbnltY2UuU2NyaXB0TG9hZGVyLmlzRG9uZShhKSl7ZG9jdW1lbnQud3JpdGUoJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicrdGlueW1jZS5fYWRkVmVyKGEpKyciPjxcL3NjcmlwdD4nKTt0aW55bWNlLlNjcmlwdExvYWRlci5tYXJrRG9uZShhKX19fSxwaWNrQ29sb3I6ZnVuY3Rpb24oYixhKXt0aGlzLmV4ZWNDb21tYW5kKCJtY2VDb2xvclBpY2tlciIsdHJ1ZSx7Y29sb3I6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkudmFsdWUsZnVuYzpmdW5jdGlvbihlKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKS52YWx1ZT1lO3RyeXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKS5vbmNoYW5nZSgpfWNhdGNoKGQpe319fSl9LG9wZW5Ccm93c2VyOmZ1bmN0aW9uKGEsYyxiKXt0aW55TUNFUG9wdXAucmVzdG9yZVNlbGVjdGlvbigpO3RoaXMuZWRpdG9yLmV4ZWNDYWxsYmFjaygiZmlsZV9icm93c2VyX2NhbGxiYWNrIixhLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpLnZhbHVlLGMsd2luZG93KX0sY29uZmlybTpmdW5jdGlvbihiLGEsYyl7dGhpcy5lZGl0b3Iud2luZG93TWFuYWdlci5jb25maXJtKGIsYSxjLHdpbmRvdyl9LGFsZXJ0OmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmVkaXRvci53aW5kb3dNYW5hZ2VyLmFsZXJ0KGIsYSxjLHdpbmRvdyl9LGNsb3NlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcztmdW5jdGlvbiBiKCl7YS5lZGl0b3Iud2luZG93TWFuYWdlci5jbG9zZSh3aW5kb3cpO3RpbnltY2U9dGlueU1DRT1hLmVkaXRvcj1hLnBhcmFtcz1hLmRvbT1hLmRvbS5kb2M9bnVsbH1pZih0aW55bWNlLmlzT3BlcmEpe2EuZ2V0V2luKCkuc2V0VGltZW91dChiLDApfWVsc2V7YigpfX0sX3Jlc3RvcmVTZWxlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuZXZlbnQuc3JjRWxlbWVudDtpZihhLm5vZGVOYW1lPT0iSU5QVVQiJiYoYS50eXBlPT0ic3VibWl0Inx8YS50eXBlPT0iYnV0dG9uIikpe3RpbnlNQ0VQb3B1cC5yZXN0b3JlU2VsZWN0aW9uKCl9fSxfb25ET01Mb2FkZWQ6ZnVuY3Rpb24oKXt2YXIgYj10aW55TUNFUG9wdXAsZD1kb2N1bWVudC50aXRsZSxlLGMsYTtpZihiLmRvbUxvYWRlZCl7cmV0dXJufWIuZG9tTG9hZGVkPTE7aWYoYi5mZWF0dXJlcy50cmFuc2xhdGVfaTE4biE9PWZhbHNlKXtjPWRvY3VtZW50LmJvZHkuaW5uZXJIVE1MO2lmKHRpbnltY2UuaXNJRSl7Yz1jLnJlcGxhY2UoLyAodmFsdWV8dGl0bGV8YWx0KT0oW14iXVteXHM+XSspL2dpLCcgJDE9IiQyIicpfWRvY3VtZW50LmRpcj1iLmVkaXRvci5nZXRQYXJhbSgiZGlyZWN0aW9uYWxpdHkiLCIiKTtpZigoYT1iLmVkaXRvci50cmFuc2xhdGUoYykpJiZhIT1jKXtkb2N1bWVudC5ib2R5LmlubmVySFRNTD1hfWlmKChhPWIuZWRpdG9yLnRyYW5zbGF0ZShkKSkmJmEhPWQpe2RvY3VtZW50LnRpdGxlPWQ9YX19ZG9jdW1lbnQuYm9keS5zdHlsZS5kaXNwbGF5PSIiO2lmKHRpbnltY2UuaXNJRSl7ZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ubW91c2V1cCIsdGlueU1DRVBvcHVwLl9yZXN0b3JlU2VsZWN0aW9uKTtiLmRvbS5hZGQoYi5kb20uc2VsZWN0KCJoZWFkIilbMF0sImJhc2UiLHt0YXJnZXQ6Il9zZWxmIn0pfWIucmVzdG9yZVNlbGVjdGlvbigpO2IucmVzaXplVG9Jbm5lclNpemUoKTtpZighYi5pc1dpbmRvdyl7Yi5lZGl0b3Iud2luZG93TWFuYWdlci5zZXRUaXRsZSh3aW5kb3csZCl9ZWxzZXt3aW5kb3cuZm9jdXMoKX1pZighdGlueW1jZS5pc0lFJiYhYi5pc1dpbmRvdyl7dGlueW1jZS5kb20uRXZlbnQuX2FkZChkb2N1bWVudCwiZm9jdXMiLGZ1bmN0aW9uKCl7Yi5lZGl0b3Iud2luZG93TWFuYWdlci5mb2N1cyhiLmlkKX0pfXRpbnltY2UuZWFjaChiLmRvbS5zZWxlY3QoInNlbGVjdCIpLGZ1bmN0aW9uKGYpe2Yub25rZXlkb3duPXRpbnlNQ0VQb3B1cC5fYWNjZXNzSGFuZGxlcn0pO3RpbnltY2UuZWFjaChiLmxpc3RlbmVycyxmdW5jdGlvbihmKXtmLmZ1bmMuY2FsbChmLnNjb3BlLGIuZWRpdG9yKX0pO2lmKGIuZ2V0V2luZG93QXJnKCJtY2VfYXV0b19mb2N1cyIsdHJ1ZSkpe3dpbmRvdy5mb2N1cygpO3RpbnltY2UuZWFjaChkb2N1bWVudC5mb3JtcyxmdW5jdGlvbihnKXt0aW55bWNlLmVhY2goZy5lbGVtZW50cyxmdW5jdGlvbihmKXtpZihiLmRvbS5oYXNDbGFzcyhmLCJtY2VGb2N1cyIpJiYhZi5kaXNhYmxlZCl7Zi5mb2N1cygpO3JldHVybiBmYWxzZX19KX0pfWRvY3VtZW50Lm9ua2V5dXA9dGlueU1DRVBvcHVwLl9jbG9zZVdpbktleUhhbmRsZXJ9LF9hY2Nlc3NIYW5kbGVyOmZ1bmN0aW9uKGEpe2E9YXx8d2luZG93LmV2ZW50O2lmKGEua2V5Q29kZT09MTN8fGEua2V5Q29kZT09MzIpe2E9YS50YXJnZXR8fGEuc3JjRWxlbWVudDtpZihhLm9uY2hhbmdlKXthLm9uY2hhbmdlKCl9cmV0dXJuIHRpbnltY2UuZG9tLkV2ZW50LmNhbmNlbChhKX19LF9jbG9zZVdpbktleUhhbmRsZXI6ZnVuY3Rpb24oYSl7YT1hfHx3aW5kb3cuZXZlbnQ7aWYoYS5rZXlDb2RlPT0yNyl7dGlueU1DRVBvcHVwLmNsb3NlKCl9fSxfd2FpdDpmdW5jdGlvbigpe2lmKGRvY3VtZW50LmF0dGFjaEV2ZW50KXtkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixmdW5jdGlvbigpe2lmKGRvY3VtZW50LnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXtkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixhcmd1bWVudHMuY2FsbGVlKTt0aW55TUNFUG9wdXAuX29uRE9NTG9hZGVkKCl9fSk7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsJiZ3aW5kb3c9PXdpbmRvdy50b3ApeyhmdW5jdGlvbigpe2lmKHRpbnlNQ0VQb3B1cC5kb21Mb2FkZWQpe3JldHVybn10cnl7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChhcmd1bWVudHMuY2FsbGVlLDApO3JldHVybn10aW55TUNFUG9wdXAuX29uRE9NTG9hZGVkKCl9KSgpfWRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbmxvYWQiLHRpbnlNQ0VQb3B1cC5fb25ET01Mb2FkZWQpfWVsc2V7aWYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHRpbnlNQ0VQb3B1cC5fb25ET01Mb2FkZWQsZmFsc2UpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix0aW55TUNFUG9wdXAuX29uRE9NTG9hZGVkLGZhbHNlKX19fX07dGlueU1DRVBvcHVwLmluaXQoKTt0aW55TUNFUG9wdXAuX3dhaXQoKTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/tiny_mce_prototype.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGQpe3ZhciBhPS9eXHMqfFxzKiQvZyxlLGM9IkIiLnJlcGxhY2UoL0EoLil8Qi8sIiQxIik9PT0iJDEiO3ZhciBiPXttYWpvclZlcnNpb246IjMiLG1pbm9yVmVyc2lvbjoiMy45LjMiLHJlbGVhc2VEYXRlOiIyMDEwLTEyLTIwIixfaW5pdDpmdW5jdGlvbigpe3ZhciBzPXRoaXMscT1kb2N1bWVudCxvPW5hdmlnYXRvcixnPW8udXNlckFnZW50LG0sZixsLGssaixyO3MuaXNPcGVyYT1kLm9wZXJhJiZvcGVyYS5idWlsZE51bWJlcjtzLmlzV2ViS2l0PS9XZWJLaXQvLnRlc3QoZyk7cy5pc0lFPSFzLmlzV2ViS2l0JiYhcy5pc09wZXJhJiYoL01TSUUvZ2kpLnRlc3QoZykmJigvRXhwbG9yZXIvZ2kpLnRlc3Qoby5hcHBOYW1lKTtzLmlzSUU2PXMuaXNJRSYmL01TSUUgWzU2XS8udGVzdChnKTtzLmlzR2Vja289IXMuaXNXZWJLaXQmJi9HZWNrby8udGVzdChnKTtzLmlzTWFjPWcuaW5kZXhPZigiTWFjIikhPS0xO3MuaXNBaXI9L2Fkb2JlYWlyL2kudGVzdChnKTtzLmlzSURldmljZT0vKGlQYWR8aVBob25lKS8udGVzdChnKTtpZihkLnRpbnlNQ0VQcmVJbml0KXtzLnN1ZmZpeD10aW55TUNFUHJlSW5pdC5zdWZmaXg7cy5iYXNlVVJMPXRpbnlNQ0VQcmVJbml0LmJhc2U7cy5xdWVyeT10aW55TUNFUHJlSW5pdC5xdWVyeTtyZXR1cm59cy5zdWZmaXg9IiI7Zj1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIik7Zm9yKG09MDttPGYubGVuZ3RoO20rKyl7aWYocj1mW21dLmhyZWYpe2lmKC9eaHR0cHM/OlwvXC9bXlwvXSskLy50ZXN0KHIpKXtyKz0iLyJ9az1yP3IubWF0Y2goLy4qXC8vKVswXToiIn19ZnVuY3Rpb24gaChpKXtpZihpLnNyYyYmL3RpbnlfbWNlKHxfZ3ppcHxfanF1ZXJ5fF9wcm90b3R5cGV8X2Z1bGwpKF9kZXZ8X3NyYyk/LmpzLy50ZXN0KGkuc3JjKSl7aWYoL18oc3JjfGRldilcLmpzL2cudGVzdChpLnNyYykpe3Muc3VmZml4PSJfc3JjIn1pZigoaj1pLnNyYy5pbmRleE9mKCI/IikpIT0tMSl7cy5xdWVyeT1pLnNyYy5zdWJzdHJpbmcoaisxKX1zLmJhc2VVUkw9aS5zcmMuc3Vic3RyaW5nKDAsaS5zcmMubGFzdEluZGV4T2YoIi8iKSk7aWYoayYmcy5iYXNlVVJMLmluZGV4T2YoIjovLyIpPT0tMSYmcy5iYXNlVVJMLmluZGV4T2YoIi8iKSE9PTApe3MuYmFzZVVSTD1rK3MuYmFzZVVSTH1yZXR1cm4gcy5iYXNlVVJMfXJldHVybiBudWxsfWY9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKG09MDttPGYubGVuZ3RoO20rKyl7aWYoaChmW21dKSl7cmV0dXJufX1sPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTtpZihsKXtmPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2ZvcihtPTA7bTxmLmxlbmd0aDttKyspe2lmKGgoZlttXSkpe3JldHVybn19fXJldHVybn0saXM6ZnVuY3Rpb24oZyxmKXtpZighZil7cmV0dXJuIGchPT1lfWlmKGY9PSJhcnJheSImJihnLmhhc093blByb3BlcnR5JiZnIGluc3RhbmNlb2YgQXJyYXkpKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gdHlwZW9mKGcpPT1mfSxlYWNoOmZ1bmN0aW9uKGksZixoKXt2YXIgaixnO2lmKCFpKXtyZXR1cm4gMH1oPWh8fGk7aWYoaS5sZW5ndGghPT1lKXtmb3Ioaj0wLGc9aS5sZW5ndGg7ajxnO2orKyl7aWYoZi5jYWxsKGgsaVtqXSxqLGkpPT09ZmFsc2Upe3JldHVybiAwfX19ZWxzZXtmb3IoaiBpbiBpKXtpZihpLmhhc093blByb3BlcnR5KGopKXtpZihmLmNhbGwoaCxpW2pdLGosaSk9PT1mYWxzZSl7cmV0dXJuIDB9fX19cmV0dXJuIDF9LG1hcDpmdW5jdGlvbihnLGgpe3ZhciBpPVtdO2IuZWFjaChnLGZ1bmN0aW9uKGYpe2kucHVzaChoKGYpKX0pO3JldHVybiBpfSxncmVwOmZ1bmN0aW9uKGcsaCl7dmFyIGk9W107Yi5lYWNoKGcsZnVuY3Rpb24oZil7aWYoIWh8fGgoZikpe2kucHVzaChmKX19KTtyZXR1cm4gaX0saW5BcnJheTpmdW5jdGlvbihnLGgpe3ZhciBqLGY7aWYoZyl7Zm9yKGo9MCxmPWcubGVuZ3RoO2o8ZjtqKyspe2lmKGdbal09PT1oKXtyZXR1cm4gan19fXJldHVybiAtMX0sZXh0ZW5kOmZ1bmN0aW9uKGssail7dmFyIGgsZyxmPWFyZ3VtZW50cztmb3IoaD0xLGc9Zi5sZW5ndGg7aDxnO2grKyl7aj1mW2hdO2IuZWFjaChqLGZ1bmN0aW9uKGksbCl7aWYoaSE9PWUpe2tbbF09aX19KX1yZXR1cm4ga30sdHJpbTpmdW5jdGlvbihmKXtyZXR1cm4oZj8iIitmOiIiKS5yZXBsYWNlKGEsIiIpfSxjcmVhdGU6ZnVuY3Rpb24obixmKXt2YXIgbT10aGlzLGcsaSxqLGssaCxsPTA7bj0vXigoc3RhdGljKSApPyhbXHcuXSspKDooW1x3Ll0rKSk/Ly5leGVjKG4pO2o9blszXS5tYXRjaCgvKF58XC4pKFx3KykkL2kpWzJdO2k9bS5jcmVhdGVOUyhuWzNdLnJlcGxhY2UoL1wuXHcrJC8sIiIpKTtpZihpW2pdKXtyZXR1cm59aWYoblsyXT09InN0YXRpYyIpe2lbal09ZjtpZih0aGlzLm9uQ3JlYXRlKXt0aGlzLm9uQ3JlYXRlKG5bMl0sblszXSxpW2pdKX1yZXR1cm59aWYoIWZbal0pe2Zbal09ZnVuY3Rpb24oKXt9O2w9MX1pW2pdPWZbal07bS5leHRlbmQoaVtqXS5wcm90b3R5cGUsZik7aWYobls1XSl7Zz1tLnJlc29sdmUobls1XSkucHJvdG90eXBlO2s9bls1XS5tYXRjaCgvXC4oXHcrKSQvaSlbMV07aD1pW2pdO2lmKGwpe2lbal09ZnVuY3Rpb24oKXtyZXR1cm4gZ1trXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWVsc2V7aVtqXT1mdW5jdGlvbigpe3RoaXMucGFyZW50PWdba107cmV0dXJuIGguYXBwbHkodGhpcyxhcmd1bWVudHMpfX1pW2pdLnByb3RvdHlwZVtqXT1pW2pdO20uZWFjaChnLGZ1bmN0aW9uKG8scCl7aVtqXS5wcm90b3R5cGVbcF09Z1twXX0pO20uZWFjaChmLGZ1bmN0aW9uKG8scCl7aWYoZ1twXSl7aVtqXS5wcm90b3R5cGVbcF09ZnVuY3Rpb24oKXt0aGlzLnBhcmVudD1nW3BdO3JldHVybiBvLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZWxzZXtpZihwIT1qKXtpW2pdLnByb3RvdHlwZVtwXT1vfX19KX1tLmVhY2goZlsic3RhdGljIl0sZnVuY3Rpb24obyxwKXtpW2pdW3BdPW99KTtpZih0aGlzLm9uQ3JlYXRlKXt0aGlzLm9uQ3JlYXRlKG5bMl0sblszXSxpW2pdLnByb3RvdHlwZSl9fSx3YWxrOmZ1bmN0aW9uKGksaCxqLGcpe2c9Z3x8dGhpcztpZihpKXtpZihqKXtpPWlbal19Yi5lYWNoKGksZnVuY3Rpb24oayxmKXtpZihoLmNhbGwoZyxrLGYsaik9PT1mYWxzZSl7cmV0dXJuIGZhbHNlfWIud2FsayhrLGgsaixnKX0pfX0sY3JlYXRlTlM6ZnVuY3Rpb24oaixoKXt2YXIgZyxmO2g9aHx8ZDtqPWouc3BsaXQoIi4iKTtmb3IoZz0wO2c8ai5sZW5ndGg7ZysrKXtmPWpbZ107aWYoIWhbZl0pe2hbZl09e319aD1oW2ZdfXJldHVybiBofSxyZXNvbHZlOmZ1bmN0aW9uKGosaCl7dmFyIGcsZjtoPWh8fGQ7aj1qLnNwbGl0KCIuIik7Zm9yKGc9MCxmPWoubGVuZ3RoO2c8ZjtnKyspe2g9aFtqW2ddXTtpZighaCl7YnJlYWt9fXJldHVybiBofSxhZGRVbmxvYWQ6ZnVuY3Rpb24oaixpKXt2YXIgaD10aGlzO2o9e2Z1bmM6aixzY29wZTppfHx0aGlzfTtpZighaC51bmxvYWRzKXtmdW5jdGlvbiBnKCl7dmFyIGY9aC51bmxvYWRzLGwsbTtpZihmKXtmb3IobSBpbiBmKXtsPWZbbV07aWYobCYmbC5mdW5jKXtsLmZ1bmMuY2FsbChsLnNjb3BlLDEpfX1pZihkLmRldGFjaEV2ZW50KXtkLmRldGFjaEV2ZW50KCJvbmJlZm9yZXVubG9hZCIsayk7ZC5kZXRhY2hFdmVudCgib251bmxvYWQiLGcpfWVsc2V7aWYoZC5yZW1vdmVFdmVudExpc3RlbmVyKXtkLnJlbW92ZUV2ZW50TGlzdGVuZXIoInVubG9hZCIsZyxmYWxzZSl9fWgudW5sb2Fkcz1sPWY9dz1nPTA7aWYoZC5Db2xsZWN0R2FyYmFnZSl7Q29sbGVjdEdhcmJhZ2UoKX19fWZ1bmN0aW9uIGsoKXt2YXIgbD1kb2N1bWVudDtpZihsLnJlYWR5U3RhdGU9PSJpbnRlcmFjdGl2ZSIpe2Z1bmN0aW9uIGYoKXtsLmRldGFjaEV2ZW50KCJvbnN0b3AiLGYpO2lmKGcpe2coKX1sPTB9aWYobCl7bC5hdHRhY2hFdmVudCgib25zdG9wIixmKX1kLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihsKXtsLmRldGFjaEV2ZW50KCJvbnN0b3AiLGYpfX0sMCl9fWlmKGQuYXR0YWNoRXZlbnQpe2QuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixnKTtkLmF0dGFjaEV2ZW50KCJvbmJlZm9yZXVubG9hZCIsayl9ZWxzZXtpZihkLmFkZEV2ZW50TGlzdGVuZXIpe2QuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixnLGZhbHNlKX19aC51bmxvYWRzPVtqXX1lbHNle2gudW5sb2Fkcy5wdXNoKGopfXJldHVybiBqfSxyZW1vdmVVbmxvYWQ6ZnVuY3Rpb24oaSl7dmFyIGc9dGhpcy51bmxvYWRzLGg9bnVsbDtiLmVhY2goZyxmdW5jdGlvbihqLGYpe2lmKGomJmouZnVuYz09aSl7Zy5zcGxpY2UoZiwxKTtoPWk7cmV0dXJuIGZhbHNlfX0pO3JldHVybiBofSxleHBsb2RlOmZ1bmN0aW9uKGYsZyl7cmV0dXJuIGY/Yi5tYXAoZi5zcGxpdChnfHwiLCIpLGIudHJpbSk6Zn0sX2FkZFZlcjpmdW5jdGlvbihnKXt2YXIgZjtpZighdGhpcy5xdWVyeSl7cmV0dXJuIGd9Zj0oZy5pbmRleE9mKCI/Iik9PS0xPyI/IjoiJiIpK3RoaXMucXVlcnk7aWYoZy5pbmRleE9mKCIjIik9PS0xKXtyZXR1cm4gZytmfXJldHVybiBnLnJlcGxhY2UoIiMiLGYrIiMiKX0sX3JlcGxhY2U6ZnVuY3Rpb24oaCxmLGcpe2lmKGMpe3JldHVybiBnLnJlcGxhY2UoaCxmdW5jdGlvbigpe3ZhciBsPWYsaj1hcmd1bWVudHMsaztmb3Ioaz0wO2s8ai5sZW5ndGgtMjtrKyspe2lmKGpba109PT1lKXtsPWwucmVwbGFjZShuZXcgUmVnRXhwKCJcXCQiK2ssImciKSwiIil9ZWxzZXtsPWwucmVwbGFjZShuZXcgUmVnRXhwKCJcXCQiK2ssImciKSxqW2tdKX19cmV0dXJuIGx9KX1yZXR1cm4gZy5yZXBsYWNlKGgsZil9fTtiLl9pbml0KCk7ZC50aW55bWNlPWQudGlueU1DRT1ifSkod2luZG93KTsoZnVuY3Rpb24oKXtpZighd2luZG93LlByb3RvdHlwZSl7cmV0dXJuIGFsZXJ0KCJMb2FkIHByb3RvdHlwZSBmaXJzdCEiKX10aW55bWNlLmV4dGVuZCh0aW55bWNlLHt0cmltOmZ1bmN0aW9uKGIpe3JldHVybiBiP2Iuc3RyaXAoKToiIn0saW5BcnJheTpmdW5jdGlvbihiLGMpe3JldHVybiBiJiZiLmluZGV4T2Y/Yi5pbmRleE9mKGMpOi0xfX0pO3ZhciBhPXsidGlueW1jZS51dGlsLkpTT04iOnt9LH07dGlueW1jZS5vbkNyZWF0ZT1mdW5jdGlvbihiLGUsZCl7dGlueW1jZS5leHRlbmQoZCxhW2VdKX19KSgpO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnV0aWwuRGlzcGF0Y2hlciIse3Njb3BlOm51bGwsbGlzdGVuZXJzOm51bGwsRGlzcGF0Y2hlcjpmdW5jdGlvbihhKXt0aGlzLnNjb3BlPWF8fHRoaXM7dGhpcy5saXN0ZW5lcnM9W119LGFkZDpmdW5jdGlvbihhLGIpe3RoaXMubGlzdGVuZXJzLnB1c2goe2NiOmEsc2NvcGU6Ynx8dGhpcy5zY29wZX0pO3JldHVybiBhfSxhZGRUb1RvcDpmdW5jdGlvbihhLGIpe3RoaXMubGlzdGVuZXJzLnVuc2hpZnQoe2NiOmEsc2NvcGU6Ynx8dGhpcy5zY29wZX0pO3JldHVybiBhfSxyZW1vdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5saXN0ZW5lcnMsYz1udWxsO3RpbnltY2UuZWFjaChiLGZ1bmN0aW9uKGUsZCl7aWYoYT09ZS5jYil7Yz1hO2Iuc3BsaWNlKGQsMSk7cmV0dXJuIGZhbHNlfX0pO3JldHVybiBjfSxkaXNwYXRjaDpmdW5jdGlvbigpe3ZhciBmLGQ9YXJndW1lbnRzLGUsYj10aGlzLmxpc3RlbmVycyxnO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspe2c9YltlXTtmPWcuY2IuYXBwbHkoZy5zY29wZSxkKTtpZihmPT09ZmFsc2Upe2JyZWFrfX1yZXR1cm4gZn19KTsoZnVuY3Rpb24oKXt2YXIgYT10aW55bWNlLmVhY2g7dGlueW1jZS5jcmVhdGUoInRpbnltY2UudXRpbC5VUkkiLHtVUkk6ZnVuY3Rpb24oZSxnKXt2YXIgZj10aGlzLGgsZCxjO2U9dGlueW1jZS50cmltKGUpO2c9Zi5zZXR0aW5ncz1nfHx7fTtpZigvXihtYWlsdG98dGVsfG5ld3N8amF2YXNjcmlwdHxhYm91dHxkYXRhKTovaS50ZXN0KGUpfHwvXlxzKiMvLnRlc3QoZSkpe2Yuc291cmNlPWU7cmV0dXJufWlmKGUuaW5kZXhPZigiLyIpPT09MCYmZS5pbmRleE9mKCIvLyIpIT09MCl7ZT0oZy5iYXNlX3VyaT9nLmJhc2VfdXJpLnByb3RvY29sfHwiaHR0cCI6Imh0dHAiKSsiOi8vbWNlX2hvc3QiK2V9aWYoIS9eXHcqOj9cL1wvLy50ZXN0KGUpKXtlPShnLmJhc2VfdXJpLnByb3RvY29sfHwiaHR0cCIpKyI6Ly9tY2VfaG9zdCIrZi50b0Fic1BhdGgoZy5iYXNlX3VyaS5wYXRoLGUpfWU9ZS5yZXBsYWNlKC9AQC9nLCIobWNlX2F0KSIpO2U9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKik6PyhbXjpAXSopKT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGUpO2EoWyJzb3VyY2UiLCJwcm90b2NvbCIsImF1dGhvcml0eSIsInVzZXJJbmZvIiwidXNlciIsInBhc3N3b3JkIiwiaG9zdCIsInBvcnQiLCJyZWxhdGl2ZSIsInBhdGgiLCJkaXJlY3RvcnkiLCJmaWxlIiwicXVlcnkiLCJhbmNob3IiXSxmdW5jdGlvbihiLGope3ZhciBrPWVbal07aWYoayl7az1rLnJlcGxhY2UoL1wobWNlX2F0XCkvZywiQEAiKX1mW2JdPWt9KTtpZihjPWcuYmFzZV91cmkpe2lmKCFmLnByb3RvY29sKXtmLnByb3RvY29sPWMucHJvdG9jb2x9aWYoIWYudXNlckluZm8pe2YudXNlckluZm89Yy51c2VySW5mb31pZighZi5wb3J0JiZmLmhvc3Q9PSJtY2VfaG9zdCIpe2YucG9ydD1jLnBvcnR9aWYoIWYuaG9zdHx8Zi5ob3N0PT0ibWNlX2hvc3QiKXtmLmhvc3Q9Yy5ob3N0fWYuc291cmNlPSIifX0sc2V0UGF0aDpmdW5jdGlvbihjKXt2YXIgYj10aGlzO2M9L14oLio/KVwvPyhcdyspPyQvLmV4ZWMoYyk7Yi5wYXRoPWNbMF07Yi5kaXJlY3Rvcnk9Y1sxXTtiLmZpbGU9Y1syXTtiLnNvdXJjZT0iIjtiLmdldFVSSSgpfSx0b1JlbGF0aXZlOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZDtpZihiPT09Ii4vIil7cmV0dXJuIGJ9Yj1uZXcgdGlueW1jZS51dGlsLlVSSShiLHtiYXNlX3VyaTpjfSk7aWYoKGIuaG9zdCE9Im1jZV9ob3N0IiYmYy5ob3N0IT1iLmhvc3QmJmIuaG9zdCl8fGMucG9ydCE9Yi5wb3J0fHxjLnByb3RvY29sIT1iLnByb3RvY29sKXtyZXR1cm4gYi5nZXRVUkkoKX1kPWMudG9SZWxQYXRoKGMucGF0aCxiLnBhdGgpO2lmKGIucXVlcnkpe2QrPSI/IitiLnF1ZXJ5fWlmKGIuYW5jaG9yKXtkKz0iIyIrYi5hbmNob3J9cmV0dXJuIGR9LHRvQWJzb2x1dGU6ZnVuY3Rpb24oYixjKXt2YXIgYj1uZXcgdGlueW1jZS51dGlsLlVSSShiLHtiYXNlX3VyaTp0aGlzfSk7cmV0dXJuIGIuZ2V0VVJJKHRoaXMuaG9zdD09Yi5ob3N0JiZ0aGlzLnByb3RvY29sPT1iLnByb3RvY29sP2M6MCl9LHRvUmVsUGF0aDpmdW5jdGlvbihnLGgpe3ZhciBjLGY9MCxkPSIiLGUsYjtnPWcuc3Vic3RyaW5nKDAsZy5sYXN0SW5kZXhPZigiLyIpKTtnPWcuc3BsaXQoIi8iKTtjPWguc3BsaXQoIi8iKTtpZihnLmxlbmd0aD49Yy5sZW5ndGgpe2ZvcihlPTAsYj1nLmxlbmd0aDtlPGI7ZSsrKXtpZihlPj1jLmxlbmd0aHx8Z1tlXSE9Y1tlXSl7Zj1lKzE7YnJlYWt9fX1pZihnLmxlbmd0aDxjLmxlbmd0aCl7Zm9yKGU9MCxiPWMubGVuZ3RoO2U8YjtlKyspe2lmKGU+PWcubGVuZ3RofHxnW2VdIT1jW2VdKXtmPWUrMTticmVha319fWlmKGY9PTEpe3JldHVybiBofWZvcihlPTAsYj1nLmxlbmd0aC0oZi0xKTtlPGI7ZSsrKXtkKz0iLi4vIn1mb3IoZT1mLTEsYj1jLmxlbmd0aDtlPGI7ZSsrKXtpZihlIT1mLTEpe2QrPSIvIitjW2VdfWVsc2V7ZCs9Y1tlXX19cmV0dXJuIGR9LHRvQWJzUGF0aDpmdW5jdGlvbihlLGYpe3ZhciBjLGI9MCxoPVtdLGQsZztkPS9cLyQvLnRlc3QoZik/Ii8iOiIiO2U9ZS5zcGxpdCgiLyIpO2Y9Zi5zcGxpdCgiLyIpO2EoZSxmdW5jdGlvbihpKXtpZihpKXtoLnB1c2goaSl9fSk7ZT1oO2ZvcihjPWYubGVuZ3RoLTEsaD1bXTtjPj0wO2MtLSl7aWYoZltjXS5sZW5ndGg9PTB8fGZbY109PSIuIil7Y29udGludWV9aWYoZltjXT09Ii4uIil7YisrO2NvbnRpbnVlfWlmKGI+MCl7Yi0tO2NvbnRpbnVlfWgucHVzaChmW2NdKX1jPWUubGVuZ3RoLWI7aWYoYzw9MCl7Zz1oLnJldmVyc2UoKS5qb2luKCIvIil9ZWxzZXtnPWUuc2xpY2UoMCxjKS5qb2luKCIvIikrIi8iK2gucmV2ZXJzZSgpLmpvaW4oIi8iKX1pZihnLmluZGV4T2YoIi8iKSE9PTApe2c9Ii8iK2d9aWYoZCYmZy5sYXN0SW5kZXhPZigiLyIpIT09Zy5sZW5ndGgtMSl7Zys9ZH1yZXR1cm4gZ30sZ2V0VVJJOmZ1bmN0aW9uKGQpe3ZhciBjLGI9dGhpcztpZighYi5zb3VyY2V8fGQpe2M9IiI7aWYoIWQpe2lmKGIucHJvdG9jb2wpe2MrPWIucHJvdG9jb2wrIjovLyJ9aWYoYi51c2VySW5mbyl7Yys9Yi51c2VySW5mbysiQCJ9aWYoYi5ob3N0KXtjKz1iLmhvc3R9aWYoYi5wb3J0KXtjKz0iOiIrYi5wb3J0fX1pZihiLnBhdGgpe2MrPWIucGF0aH1pZihiLnF1ZXJ5KXtjKz0iPyIrYi5xdWVyeX1pZihiLmFuY2hvcil7Yys9IiMiK2IuYW5jaG9yfWIuc291cmNlPWN9cmV0dXJuIGIuc291cmNlfX0pfSkoKTsoZnVuY3Rpb24oKXt2YXIgYT10aW55bWNlLmVhY2g7dGlueW1jZS5jcmVhdGUoInN0YXRpYyB0aW55bWNlLnV0aWwuQ29va2llIix7Z2V0SGFzaDpmdW5jdGlvbihkKXt2YXIgYj10aGlzLmdldChkKSxjO2lmKGIpe2EoYi5zcGxpdCgiJiIpLGZ1bmN0aW9uKGUpe2U9ZS5zcGxpdCgiPSIpO2M9Y3x8e307Y1t1bmVzY2FwZShlWzBdKV09dW5lc2NhcGUoZVsxXSl9KX1yZXR1cm4gY30sc2V0SGFzaDpmdW5jdGlvbihqLGIsZyxmLGksYyl7dmFyIGg9IiI7YShiLGZ1bmN0aW9uKGUsZCl7aCs9KCFoPyIiOiImIikrZXNjYXBlKGQpKyI9Iitlc2NhcGUoZSl9KTt0aGlzLnNldChqLGgsZyxmLGksYyl9LGdldDpmdW5jdGlvbihpKXt2YXIgaD1kb2N1bWVudC5jb29raWUsZyxmPWkrIj0iLGQ7aWYoIWgpe3JldHVybn1kPWguaW5kZXhPZigiOyAiK2YpO2lmKGQ9PS0xKXtkPWguaW5kZXhPZihmKTtpZihkIT0wKXtyZXR1cm4gbnVsbH19ZWxzZXtkKz0yfWc9aC5pbmRleE9mKCI7IixkKTtpZihnPT0tMSl7Zz1oLmxlbmd0aH1yZXR1cm4gdW5lc2NhcGUoaC5zdWJzdHJpbmcoZCtmLmxlbmd0aCxnKSl9LHNldDpmdW5jdGlvbihpLGIsZyxmLGgsYyl7ZG9jdW1lbnQuY29va2llPWkrIj0iK2VzY2FwZShiKSsoKGcpPyI7IGV4cGlyZXM9IitnLnRvR01UU3RyaW5nKCk6IiIpKygoZik/IjsgcGF0aD0iK2VzY2FwZShmKToiIikrKChoKT8iOyBkb21haW49IitoOiIiKSsoKGMpPyI7IHNlY3VyZSI6IiIpfSxyZW1vdmU6ZnVuY3Rpb24oZSxiKXt2YXIgYz1uZXcgRGF0ZSgpO2Muc2V0VGltZShjLmdldFRpbWUoKS0xMDAwKTt0aGlzLnNldChlLCIiLGMsYixjKX19KX0pKCk7dGlueW1jZS5jcmVhdGUoInN0YXRpYyB0aW55bWNlLnV0aWwuSlNPTiIse3NlcmlhbGl6ZTpmdW5jdGlvbihlKXt2YXIgYyxhLGQ9dGlueW1jZS51dGlsLkpTT04uc2VyaWFsaXplLGI7aWYoZT09bnVsbCl7cmV0dXJuIm51bGwifWI9dHlwZW9mIGU7aWYoYj09InN0cmluZyIpe2E9IlxiYlx0dFxublxmZlxyclwiXCInJ1xcXFwiO3JldHVybiciJytlLnJlcGxhY2UoLyhbXHUwMDgwLVx1RkZGRlx4MDAtXHgxZlwiXSkvZyxmdW5jdGlvbihnLGYpe2M9YS5pbmRleE9mKGYpO2lmKGMrMSl7cmV0dXJuIlxcIithLmNoYXJBdChjKzEpfWc9Zi5jaGFyQ29kZUF0KCkudG9TdHJpbmcoMTYpO3JldHVybiJcXHUiKyIwMDAwIi5zdWJzdHJpbmcoZy5sZW5ndGgpK2d9KSsnIid9aWYoYj09Im9iamVjdCIpe2lmKGUuaGFzT3duUHJvcGVydHkmJmUgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKGM9MCxhPSJbIjtjPGUubGVuZ3RoO2MrKyl7YSs9KGM+MD8iLCI6IiIpK2QoZVtjXSl9cmV0dXJuIGErIl0ifWE9InsiO2ZvcihjIGluIGUpe2ErPXR5cGVvZiBlW2NdIT0iZnVuY3Rpb24iPyhhLmxlbmd0aD4xPycsIic6JyInKStjKyciOicrZChlW2NdKToiIn1yZXR1cm4gYSsifSJ9cmV0dXJuIiIrZX0scGFyc2U6ZnVuY3Rpb24ocyl7dHJ5e3JldHVybiBldmFsKCIoIitzKyIpIil9Y2F0Y2goZXgpe319fSk7dGlueW1jZS5jcmVhdGUoInN0YXRpYyB0aW55bWNlLnV0aWwuWEhSIix7c2VuZDpmdW5jdGlvbihnKXt2YXIgYSxlLGI9d2luZG93LGg9MDtnLnNjb3BlPWcuc2NvcGV8fHRoaXM7Zy5zdWNjZXNzX3Njb3BlPWcuc3VjY2Vzc19zY29wZXx8Zy5zY29wZTtnLmVycm9yX3Njb3BlPWcuZXJyb3Jfc2NvcGV8fGcuc2NvcGU7Zy5hc3luYz1nLmFzeW5jPT09ZmFsc2U/ZmFsc2U6dHJ1ZTtnLmRhdGE9Zy5kYXRhfHwiIjtmdW5jdGlvbiBkKGkpe2E9MDt0cnl7YT1uZXcgQWN0aXZlWE9iamVjdChpKX1jYXRjaChjKXt9cmV0dXJuIGF9YT1iLlhNTEh0dHBSZXF1ZXN0P25ldyBYTUxIdHRwUmVxdWVzdCgpOmQoIk1pY3Jvc29mdC5YTUxIVFRQIil8fGQoIk1zeG1sMi5YTUxIVFRQIik7aWYoYSl7aWYoYS5vdmVycmlkZU1pbWVUeXBlKXthLm92ZXJyaWRlTWltZVR5cGUoZy5jb250ZW50X3R5cGUpfWEub3BlbihnLnR5cGV8fChnLmRhdGE/IlBPU1QiOiJHRVQiKSxnLnVybCxnLmFzeW5jKTtpZihnLmNvbnRlbnRfdHlwZSl7YS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGcuY29udGVudF90eXBlKX1hLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCJYTUxIdHRwUmVxdWVzdCIpO2Euc2VuZChnLmRhdGEpO2Z1bmN0aW9uIGYoKXtpZighZy5hc3luY3x8YS5yZWFkeVN0YXRlPT00fHxoKys+MTAwMDApe2lmKGcuc3VjY2VzcyYmaDwxMDAwMCYmYS5zdGF0dXM9PTIwMCl7Zy5zdWNjZXNzLmNhbGwoZy5zdWNjZXNzX3Njb3BlLCIiK2EucmVzcG9uc2VUZXh0LGEsZyl9ZWxzZXtpZihnLmVycm9yKXtnLmVycm9yLmNhbGwoZy5lcnJvcl9zY29wZSxoPjEwMDAwPyJUSU1FRF9PVVQiOiJHRU5FUkFMIixhLGcpfX1hPW51bGx9ZWxzZXtiLnNldFRpbWVvdXQoZiwxMCl9fWlmKCFnLmFzeW5jKXtyZXR1cm4gZigpfWU9Yi5zZXRUaW1lb3V0KGYsMTApfX19KTsoZnVuY3Rpb24oKXt2YXIgYz10aW55bWNlLmV4dGVuZCxiPXRpbnltY2UudXRpbC5KU09OLGE9dGlueW1jZS51dGlsLlhIUjt0aW55bWNlLmNyZWF0ZSgidGlueW1jZS51dGlsLkpTT05SZXF1ZXN0Iix7SlNPTlJlcXVlc3Q6ZnVuY3Rpb24oZCl7dGhpcy5zZXR0aW5ncz1jKHt9LGQpO3RoaXMuY291bnQ9MH0sc2VuZDpmdW5jdGlvbihmKXt2YXIgZT1mLmVycm9yLGQ9Zi5zdWNjZXNzO2Y9Yyh0aGlzLnNldHRpbmdzLGYpO2Yuc3VjY2Vzcz1mdW5jdGlvbihoLGcpe2g9Yi5wYXJzZShoKTtpZih0eXBlb2YoaCk9PSJ1bmRlZmluZWQiKXtoPXtlcnJvcjoiSlNPTiBQYXJzZSBlcnJvci4ifX1pZihoLmVycm9yKXtlLmNhbGwoZi5lcnJvcl9zY29wZXx8Zi5zY29wZSxoLmVycm9yLGcpfWVsc2V7ZC5jYWxsKGYuc3VjY2Vzc19zY29wZXx8Zi5zY29wZSxoLnJlc3VsdCl9fTtmLmVycm9yPWZ1bmN0aW9uKGgsZyl7ZS5jYWxsKGYuZXJyb3Jfc2NvcGV8fGYuc2NvcGUsaCxnKX07Zi5kYXRhPWIuc2VyaWFsaXplKHtpZDpmLmlkfHwiYyIrKHRoaXMuY291bnQrKyksbWV0aG9kOmYubWV0aG9kLHBhcmFtczpmLnBhcmFtc30pO2YuY29udGVudF90eXBlPSJhcHBsaWNhdGlvbi9qc29uIjthLnNlbmQoZil9LCJzdGF0aWMiOntzZW5kUlBDOmZ1bmN0aW9uKGQpe3JldHVybiBuZXcgdGlueW1jZS51dGlsLkpTT05SZXF1ZXN0KCkuc2VuZChkKX19fSl9KCkpOyhmdW5jdGlvbihtKXt2YXIgaz1tLmVhY2gsaj1tLmlzLGk9bS5pc1dlYktpdCxkPW0uaXNJRSxhPS9eKEhbMS02Ul18UHxESVZ8QUREUkVTU3xQUkV8Rk9STXxUKEFCTEV8Qk9EWXxIRUFEfEZPT1R8SHxSfEQpfExJfE9MfFVMfENBUFRJT058QkxPQ0tRVU9URXxDRU5URVJ8REx8RFR8RER8RElSfEZJRUxEU0VUfE5PU0NSSVBUfE1FTlV8SVNJTkRFWHxTQU1QKSQvLGU9ZygiY2hlY2tlZCxjb21wYWN0LGRlY2xhcmUsZGVmZXIsZGlzYWJsZWQsaXNtYXAsbXVsdGlwbGUsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm93cmFwLHJlYWRvbmx5LHNlbGVjdGVkIiksZj1nKCJzcmMsaHJlZixzdHlsZSxjb29yZHMsc2hhcGUiKSxjPXsiJiI6IiZhbXA7IiwnIic6IiZxdW90OyIsIjwiOiImbHQ7IiwiPiI6IiZndDsifSxuPS9bPD4mXCJdL2csYj0vXihbYS16MC05XSw/KSskL2ksaD0vPChcdyspKCg/OlxzK1x3Kyg/OlxzKj1ccyooPzooPzoiW14iXSoiKXwoPzonW14nXSonKXxbXj5cc10rKSk/KSopKFxzKlwvPyk+L2csbD0vKFx3KykoPzpccyo9XHMqKD86KD86IigoPzpcXC58W14iXSkqKSIpfCg/OicoKD86XFwufFteJ10pKiknKXwoW14+XHNdKykpKT8vZztmdW5jdGlvbiBnKHEpe3ZhciBwPXt9LG87cT1xLnNwbGl0KCIsIik7Zm9yKG89cS5sZW5ndGg7bz49MDtvLS0pe3BbcVtvXV09MX1yZXR1cm4gcH1tLmNyZWF0ZSgidGlueW1jZS5kb20uRE9NVXRpbHMiLHtkb2M6bnVsbCxyb290Om51bGwsZmlsZXM6bnVsbCxwaXhlbFN0eWxlczovXih0b3B8bGVmdHxib3R0b218cmlnaHR8d2lkdGh8aGVpZ2h0fGJvcmRlcldpZHRoKSQvLHByb3BzOnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixjbGFzc05hbWU6ImNsYXNzTmFtZSIsY2hlY2tlZDoiY2hlY2tlZCIsZGlzYWJsZWQ6ImRpc2FibGVkIixtYXhsZW5ndGg6Im1heExlbmd0aCIscmVhZG9ubHk6InJlYWRPbmx5IixzZWxlY3RlZDoic2VsZWN0ZWQiLHZhbHVlOiJ2YWx1ZSIsaWQ6ImlkIixuYW1lOiJuYW1lIix0eXBlOiJ0eXBlIn0sRE9NVXRpbHM6ZnVuY3Rpb24odSxxKXt2YXIgcD10aGlzLG87cC5kb2M9dTtwLndpbj13aW5kb3c7cC5maWxlcz17fTtwLmNzc0ZsaWNrZXI9ZmFsc2U7cC5jb3VudGVyPTA7cC5zdGRNb2RlPXUuZG9jdW1lbnRNb2RlPj04O3AuYm94TW9kZWw9IW0uaXNJRXx8dS5jb21wYXRNb2RlPT0iQ1NTMUNvbXBhdCJ8fHAuc3RkTW9kZTtwLnNldHRpbmdzPXE9bS5leHRlbmQoe2tlZXBfdmFsdWVzOmZhbHNlLGhleF9jb2xvcnM6MSxwcm9jZXNzX2h0bWw6MX0scSk7aWYobS5pc0lFNil7dHJ5e3UuZXhlY0NvbW1hbmQoIkJhY2tncm91bmRJbWFnZUNhY2hlIixmYWxzZSx0cnVlKX1jYXRjaChyKXtwLmNzc0ZsaWNrZXI9dHJ1ZX19aWYocS52YWxpZF9zdHlsZXMpe3AuX3N0eWxlcz17fTtrKHEudmFsaWRfc3R5bGVzLGZ1bmN0aW9uKHQscyl7cC5fc3R5bGVzW3NdPW0uZXhwbG9kZSh0KX0pfW0uYWRkVW5sb2FkKHAuZGVzdHJveSxwKX0sZ2V0Um9vdDpmdW5jdGlvbigpe3ZhciBvPXRoaXMscD1vLnNldHRpbmdzO3JldHVybihwJiZvLmdldChwLnJvb3RfZWxlbWVudCkpfHxvLmRvYy5ib2R5fSxnZXRWaWV3UG9ydDpmdW5jdGlvbihwKXt2YXIgcSxvO3A9IXA/dGhpcy53aW46cDtxPXAuZG9jdW1lbnQ7bz10aGlzLmJveE1vZGVsP3EuZG9jdW1lbnRFbGVtZW50OnEuYm9keTtyZXR1cm57eDpwLnBhZ2VYT2Zmc2V0fHxvLnNjcm9sbExlZnQseTpwLnBhZ2VZT2Zmc2V0fHxvLnNjcm9sbFRvcCx3OnAuaW5uZXJXaWR0aHx8by5jbGllbnRXaWR0aCxoOnAuaW5uZXJIZWlnaHR8fG8uY2xpZW50SGVpZ2h0fX0sZ2V0UmVjdDpmdW5jdGlvbihzKXt2YXIgcixvPXRoaXMscTtzPW8uZ2V0KHMpO3I9by5nZXRQb3Mocyk7cT1vLmdldFNpemUocyk7cmV0dXJue3g6ci54LHk6ci55LHc6cS53LGg6cS5ofX0sZ2V0U2l6ZTpmdW5jdGlvbihyKXt2YXIgcD10aGlzLG8scTtyPXAuZ2V0KHIpO289cC5nZXRTdHlsZShyLCJ3aWR0aCIpO3E9cC5nZXRTdHlsZShyLCJoZWlnaHQiKTtpZihvLmluZGV4T2YoInB4Iik9PT0tMSl7bz0wfWlmKHEuaW5kZXhPZigicHgiKT09PS0xKXtxPTB9cmV0dXJue3c6cGFyc2VJbnQobyl8fHIub2Zmc2V0V2lkdGh8fHIuY2xpZW50V2lkdGgsaDpwYXJzZUludChxKXx8ci5vZmZzZXRIZWlnaHR8fHIuY2xpZW50SGVpZ2h0fX0sZ2V0UGFyZW50OmZ1bmN0aW9uKHEscCxvKXtyZXR1cm4gdGhpcy5nZXRQYXJlbnRzKHEscCxvLGZhbHNlKX0sZ2V0UGFyZW50czpmdW5jdGlvbih6LHYscyx5KXt2YXIgcT10aGlzLHAsdT1xLnNldHRpbmdzLHg9W107ej1xLmdldCh6KTt5PXk9PT11bmRlZmluZWQ7aWYodS5zdHJpY3Rfcm9vdCl7cz1zfHxxLmdldFJvb3QoKX1pZihqKHYsInN0cmluZyIpKXtwPXY7aWYodj09PSIqIil7dj1mdW5jdGlvbihvKXtyZXR1cm4gby5ub2RlVHlwZT09MX19ZWxzZXt2PWZ1bmN0aW9uKG8pe3JldHVybiBxLmlzKG8scCl9fX13aGlsZSh6KXtpZih6PT1zfHwhei5ub2RlVHlwZXx8ei5ub2RlVHlwZT09PTkpe2JyZWFrfWlmKCF2fHx2KHopKXtpZih5KXt4LnB1c2goeil9ZWxzZXtyZXR1cm4gen19ej16LnBhcmVudE5vZGV9cmV0dXJuIHk/eDpudWxsfSxnZXQ6ZnVuY3Rpb24obyl7dmFyIHA7aWYobyYmdGhpcy5kb2MmJnR5cGVvZihvKT09InN0cmluZyIpe3A9bztvPXRoaXMuZG9jLmdldEVsZW1lbnRCeUlkKG8pO2lmKG8mJm8uaWQhPT1wKXtyZXR1cm4gdGhpcy5kb2MuZ2V0RWxlbWVudHNCeU5hbWUocClbMV19fXJldHVybiBvfSxnZXROZXh0OmZ1bmN0aW9uKHAsbyl7cmV0dXJuIHRoaXMuX2ZpbmRTaWIocCxvLCJuZXh0U2libGluZyIpfSxnZXRQcmV2OmZ1bmN0aW9uKHAsbyl7cmV0dXJuIHRoaXMuX2ZpbmRTaWIocCxvLCJwcmV2aW91c1NpYmxpbmciKX0sc2VsZWN0OmZ1bmN0aW9uKHEscCl7dmFyIG89dGhpcztyZXR1cm4gbS5kb20uU2l6emxlKHEsby5nZXQocCl8fG8uZ2V0KG8uc2V0dGluZ3Mucm9vdF9lbGVtZW50KXx8by5kb2MsW10pfSxpczpmdW5jdGlvbihxLG8pe3ZhciBwO2lmKHEubGVuZ3RoPT09dW5kZWZpbmVkKXtpZihvPT09IioiKXtyZXR1cm4gcS5ub2RlVHlwZT09MX1pZihiLnRlc3Qobykpe289by50b0xvd2VyQ2FzZSgpLnNwbGl0KC8sLyk7cT1xLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Zm9yKHA9by5sZW5ndGgtMTtwPj0wO3AtLSl7aWYob1twXT09cSl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX19cmV0dXJuIG0uZG9tLlNpenpsZS5tYXRjaGVzKG8scS5ub2RlVHlwZT9bcV06cSkubGVuZ3RoPjB9LGFkZDpmdW5jdGlvbihzLHYsbyxyLHUpe3ZhciBxPXRoaXM7cmV0dXJuIHRoaXMucnVuKHMsZnVuY3Rpb24oeSl7dmFyIHgsdDt4PWoodiwic3RyaW5nIik/cS5kb2MuY3JlYXRlRWxlbWVudCh2KTp2O3Euc2V0QXR0cmlicyh4LG8pO2lmKHIpe2lmKHIubm9kZVR5cGUpe3guYXBwZW5kQ2hpbGQocil9ZWxzZXtxLnNldEhUTUwoeCxyKX19cmV0dXJuICF1P3kuYXBwZW5kQ2hpbGQoeCk6eH0pfSxjcmVhdGU6ZnVuY3Rpb24ocSxvLHApe3JldHVybiB0aGlzLmFkZCh0aGlzLmRvYy5jcmVhdGVFbGVtZW50KHEpLHEsbyxwLDEpfSxjcmVhdGVIVE1MOmZ1bmN0aW9uKHYscCxzKXt2YXIgdT0iIixyPXRoaXMscTt1Kz0iPCIrdjtmb3IocSBpbiBwKXtpZihwLmhhc093blByb3BlcnR5KHEpKXt1Kz0iICIrcSsnPSInK3IuZW5jb2RlKHBbcV0pKyciJ319aWYodHlwZW9mKHMpIT0idW5kZWZpbmVkIil7cmV0dXJuIHUrIj4iK3MrIjwvIit2KyI+In1yZXR1cm4gdSsiIC8+In0scmVtb3ZlOmZ1bmN0aW9uKG8scCl7cmV0dXJuIHRoaXMucnVuKG8sZnVuY3Rpb24ocil7dmFyIHEscztxPXIucGFyZW50Tm9kZTtpZighcSl7cmV0dXJuIG51bGx9aWYocCl7d2hpbGUocz1yLmZpcnN0Q2hpbGQpe2lmKCFtLmlzSUV8fHMubm9kZVR5cGUhPT0zfHxzLm5vZGVWYWx1ZSl7cS5pbnNlcnRCZWZvcmUocyxyKX1lbHNle3IucmVtb3ZlQ2hpbGQocyl9fX1yZXR1cm4gcS5yZW1vdmVDaGlsZChyKX0pfSxzZXRTdHlsZTpmdW5jdGlvbihyLG8scCl7dmFyIHE9dGhpcztyZXR1cm4gcS5ydW4ocixmdW5jdGlvbih2KXt2YXIgdSx0O3U9di5zdHlsZTtvPW8ucmVwbGFjZSgvLShcRCkvZyxmdW5jdGlvbih4LHMpe3JldHVybiBzLnRvVXBwZXJDYXNlKCl9KTtpZihxLnBpeGVsU3R5bGVzLnRlc3QobykmJihtLmlzKHAsIm51bWJlciIpfHwvXltcLTAtOVwuXSskLy50ZXN0KHApKSl7cCs9InB4In1zd2l0Y2gobyl7Y2FzZSJvcGFjaXR5IjppZihkKXt1LmZpbHRlcj1wPT09IiI/IiI6ImFscGhhKG9wYWNpdHk9IisocCoxMDApKyIpIjtpZighci5jdXJyZW50U3R5bGV8fCFyLmN1cnJlbnRTdHlsZS5oYXNMYXlvdXQpe3UuZGlzcGxheT0iaW5saW5lLWJsb2NrIn19dVtvXT11WyItbW96LW9wYWNpdHkiXT11WyIta2h0bWwtb3BhY2l0eSJdPXB8fCIiO2JyZWFrO2Nhc2UiZmxvYXQiOmQ/dS5zdHlsZUZsb2F0PXA6dS5jc3NGbG9hdD1wO2JyZWFrO2RlZmF1bHQ6dVtvXT1wfHwiIn1pZihxLnNldHRpbmdzLnVwZGF0ZV9zdHlsZXMpe3Euc2V0QXR0cmliKHYsIl9tY2Vfc3R5bGUiKX19KX0sZ2V0U3R5bGU6ZnVuY3Rpb24ocixvLHEpe3I9dGhpcy5nZXQocik7aWYoIXIpe3JldHVybiBmYWxzZX1pZih0aGlzLmRvYy5kZWZhdWx0VmlldyYmcSl7bz1vLnJlcGxhY2UoL1tBLVpdL2csZnVuY3Rpb24ocyl7cmV0dXJuIi0iK3N9KTt0cnl7cmV0dXJuIHRoaXMuZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUocixudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG8pfWNhdGNoKHApe3JldHVybiBudWxsfX1vPW8ucmVwbGFjZSgvLShcRCkvZyxmdW5jdGlvbih0LHMpe3JldHVybiBzLnRvVXBwZXJDYXNlKCl9KTtpZihvPT0iZmxvYXQiKXtvPWQ/InN0eWxlRmxvYXQiOiJjc3NGbG9hdCJ9aWYoci5jdXJyZW50U3R5bGUmJnEpe3JldHVybiByLmN1cnJlbnRTdHlsZVtvXX1yZXR1cm4gci5zdHlsZVtvXX0sc2V0U3R5bGVzOmZ1bmN0aW9uKHUsdil7dmFyIHE9dGhpcyxyPXEuc2V0dGluZ3MscDtwPXIudXBkYXRlX3N0eWxlcztyLnVwZGF0ZV9zdHlsZXM9MDtrKHYsZnVuY3Rpb24obyxzKXtxLnNldFN0eWxlKHUscyxvKX0pO3IudXBkYXRlX3N0eWxlcz1wO2lmKHIudXBkYXRlX3N0eWxlcyl7cS5zZXRBdHRyaWIodSxyLmNzc1RleHQpfX0sc2V0QXR0cmliOmZ1bmN0aW9uKHEscixvKXt2YXIgcD10aGlzO2lmKCFxfHwhcil7cmV0dXJufWlmKHAuc2V0dGluZ3Muc3RyaWN0KXtyPXIudG9Mb3dlckNhc2UoKX1yZXR1cm4gdGhpcy5ydW4ocSxmdW5jdGlvbih1KXt2YXIgdD1wLnNldHRpbmdzO3N3aXRjaChyKXtjYXNlInN0eWxlIjppZighaihvLCJzdHJpbmciKSl7ayhvLGZ1bmN0aW9uKHMseCl7cC5zZXRTdHlsZSh1LHgscyl9KTtyZXR1cm59aWYodC5rZWVwX3ZhbHVlcyl7aWYobyYmIXAuX2lzUmVzKG8pKXt1LnNldEF0dHJpYnV0ZSgiX21jZV9zdHlsZSIsbywyKX1lbHNle3UucmVtb3ZlQXR0cmlidXRlKCJfbWNlX3N0eWxlIiwyKX19dS5zdHlsZS5jc3NUZXh0PW87YnJlYWs7Y2FzZSJjbGFzcyI6dS5jbGFzc05hbWU9b3x8IiI7YnJlYWs7Y2FzZSJzcmMiOmNhc2UiaHJlZiI6aWYodC5rZWVwX3ZhbHVlcyl7aWYodC51cmxfY29udmVydGVyKXtvPXQudXJsX2NvbnZlcnRlci5jYWxsKHQudXJsX2NvbnZlcnRlcl9zY29wZXx8cCxvLHIsdSl9cC5zZXRBdHRyaWIodSwiX21jZV8iK3IsbywyKX1icmVhaztjYXNlInNoYXBlIjp1LnNldEF0dHJpYnV0ZSgiX21jZV9zdHlsZSIsbyk7YnJlYWt9aWYoaihvKSYmbyE9PW51bGwmJm8ubGVuZ3RoIT09MCl7dS5zZXRBdHRyaWJ1dGUociwiIitvLDIpfWVsc2V7dS5yZW1vdmVBdHRyaWJ1dGUociwyKX19KX0sc2V0QXR0cmliczpmdW5jdGlvbihxLHIpe3ZhciBwPXRoaXM7cmV0dXJuIHRoaXMucnVuKHEsZnVuY3Rpb24obyl7ayhyLGZ1bmN0aW9uKHMsdCl7cC5zZXRBdHRyaWIobyx0LHMpfSl9KX0sZ2V0QXR0cmliOmZ1bmN0aW9uKHIscyxxKXt2YXIgbyxwPXRoaXM7cj1wLmdldChyKTtpZighcnx8ci5ub2RlVHlwZSE9PTEpe3JldHVybiBmYWxzZX1pZighaihxKSl7cT0iIn1pZigvXihzcmN8aHJlZnxzdHlsZXxjb29yZHN8c2hhcGUpJC8udGVzdChzKSl7bz1yLmdldEF0dHJpYnV0ZSgiX21jZV8iK3MpO2lmKG8pe3JldHVybiBvfX1pZihkJiZwLnByb3BzW3NdKXtvPXJbcC5wcm9wc1tzXV07bz1vJiZvLm5vZGVWYWx1ZT9vLm5vZGVWYWx1ZTpvfWlmKCFvKXtvPXIuZ2V0QXR0cmlidXRlKHMsMil9aWYoL14oY2hlY2tlZHxjb21wYWN0fGRlY2xhcmV8ZGVmZXJ8ZGlzYWJsZWR8aXNtYXB8bXVsdGlwbGV8bm9ocmVmfG5vc2hhZGV8bm93cmFwfHJlYWRvbmx5fHNlbGVjdGVkKSQvLnRlc3Qocykpe2lmKHJbcC5wcm9wc1tzXV09PT10cnVlJiZvPT09IiIpe3JldHVybiBzfXJldHVybiBvP3M6IiJ9aWYoci5ub2RlTmFtZT09PSJGT1JNIiYmci5nZXRBdHRyaWJ1dGVOb2RlKHMpKXtyZXR1cm4gci5nZXRBdHRyaWJ1dGVOb2RlKHMpLm5vZGVWYWx1ZX1pZihzPT09InN0eWxlIil7bz1vfHxyLnN0eWxlLmNzc1RleHQ7aWYobyl7bz1wLnNlcmlhbGl6ZVN0eWxlKHAucGFyc2VTdHlsZShvKSxyLm5vZGVOYW1lKTtpZihwLnNldHRpbmdzLmtlZXBfdmFsdWVzJiYhcC5faXNSZXMobykpe3Iuc2V0QXR0cmlidXRlKCJfbWNlX3N0eWxlIixvKX19fWlmKGkmJnM9PT0iY2xhc3MiJiZvKXtvPW8ucmVwbGFjZSgvKGFwcGxlfHdlYmtpdClcLVthLXpcLV0rL2dpLCIiKX1pZihkKXtzd2l0Y2gocyl7Y2FzZSJyb3dzcGFuIjpjYXNlImNvbHNwYW4iOmlmKG89PT0xKXtvPSIifWJyZWFrO2Nhc2Uic2l6ZSI6aWYobz09PSIrMCJ8fG89PT0yMHx8bz09PTApe289IiJ9YnJlYWs7Y2FzZSJ3aWR0aCI6Y2FzZSJoZWlnaHQiOmNhc2UidnNwYWNlIjpjYXNlImNoZWNrZWQiOmNhc2UiZGlzYWJsZWQiOmNhc2UicmVhZG9ubHkiOmlmKG89PT0wKXtvPSIifWJyZWFrO2Nhc2UiaHNwYWNlIjppZihvPT09LTEpe289IiJ9YnJlYWs7Y2FzZSJtYXhsZW5ndGgiOmNhc2UidGFiaW5kZXgiOmlmKG89PT0zMjc2OHx8bz09PTIxNDc0ODM2NDd8fG89PT0iMzI3NjgiKXtvPSIifWJyZWFrO2Nhc2UibXVsdGlwbGUiOmNhc2UiY29tcGFjdCI6Y2FzZSJub3NoYWRlIjpjYXNlIm5vd3JhcCI6aWYobz09PTY1NTM1KXtyZXR1cm4gc31yZXR1cm4gcTtjYXNlInNoYXBlIjpvPW8udG9Mb3dlckNhc2UoKTticmVhaztkZWZhdWx0OmlmKHMuaW5kZXhPZigib24iKT09PTAmJm8pe289bS5fcmVwbGFjZSgvXmZ1bmN0aW9uXHMrXHcrXChcKVxzK1x7XHMrKC4qKVxzK1x9JC8sIiQxIiwiIitvKX19fXJldHVybihvIT09dW5kZWZpbmVkJiZvIT09bnVsbCYmbyE9PSIiKT8iIitvOnF9LGdldFBvczpmdW5jdGlvbihBLHMpe3ZhciBwPXRoaXMsbz0wLHo9MCx1LHY9cC5kb2MscTtBPXAuZ2V0KEEpO3M9c3x8di5ib2R5O2lmKEEpe2lmKGQmJiFwLnN0ZE1vZGUpe0E9QS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt1PXAuYm94TW9kZWw/di5kb2N1bWVudEVsZW1lbnQ6di5ib2R5O289cC5nZXRTdHlsZShwLnNlbGVjdCgiaHRtbCIpWzBdLCJib3JkZXJXaWR0aCIpO289KG89PSJtZWRpdW0ifHxwLmJveE1vZGVsJiYhcC5pc0lFNikmJjJ8fG87cmV0dXJue3g6QS5sZWZ0K3Uuc2Nyb2xsTGVmdC1vLHk6QS50b3ArdS5zY3JvbGxUb3Atb319cT1BO3doaWxlKHEmJnEhPXMmJnEubm9kZVR5cGUpe28rPXEub2Zmc2V0TGVmdHx8MDt6Kz1xLm9mZnNldFRvcHx8MDtxPXEub2Zmc2V0UGFyZW50fXE9QS5wYXJlbnROb2RlO3doaWxlKHEmJnEhPXMmJnEubm9kZVR5cGUpe28tPXEuc2Nyb2xsTGVmdHx8MDt6LT1xLnNjcm9sbFRvcHx8MDtxPXEucGFyZW50Tm9kZX19cmV0dXJue3g6byx5Onp9fSxwYXJzZVN0eWxlOmZ1bmN0aW9uKHIpe3ZhciB1PXRoaXMsdj11LnNldHRpbmdzLHg9e307aWYoIXIpe3JldHVybiB4fWZ1bmN0aW9uIHAoRCxBLEMpe3ZhciB6LEIsbyx5O3o9eFtEKyItdG9wIitBXTtpZigheil7cmV0dXJufUI9eFtEKyItcmlnaHQiK0FdO2lmKHohPUIpe3JldHVybn1vPXhbRCsiLWJvdHRvbSIrQV07aWYoQiE9byl7cmV0dXJufXk9eFtEKyItbGVmdCIrQV07aWYobyE9eSl7cmV0dXJufXhbQ109eTtkZWxldGUgeFtEKyItdG9wIitBXTtkZWxldGUgeFtEKyItcmlnaHQiK0FdO2RlbGV0ZSB4W0QrIi1ib3R0b20iK0FdO2RlbGV0ZSB4W0QrIi1sZWZ0IitBXX1mdW5jdGlvbiBxKHkscyxvLEEpe3ZhciB6O3o9eFtzXTtpZigheil7cmV0dXJufXo9eFtvXTtpZigheil7cmV0dXJufXo9eFtBXTtpZigheil7cmV0dXJufXhbeV09eFtzXSsiICIreFtvXSsiICIreFtBXTtkZWxldGUgeFtzXTtkZWxldGUgeFtvXTtkZWxldGUgeFtBXX1yPXIucmVwbGFjZSgvJigjP1thLXowLTldKyk7L2csIiYkMV9NQ0VfU0VNSV8iKTtrKHIuc3BsaXQoIjsiKSxmdW5jdGlvbihzKXt2YXIgbyx0PVtdO2lmKHMpe3M9cy5yZXBsYWNlKC9fTUNFX1NFTUlfL2csIjsiKTtzPXMucmVwbGFjZSgvdXJsXChbXlwpXStcKS9nLGZ1bmN0aW9uKHkpe3QucHVzaCh5KTtyZXR1cm4idXJsKCIrdC5sZW5ndGgrIikifSk7cz1zLnNwbGl0KCI6Iik7bz1tLnRyaW0oc1sxXSk7bz1vLnJlcGxhY2UoL3VybFwoKFteXCldKylcKS9nLGZ1bmN0aW9uKHoseSl7cmV0dXJuIHRbcGFyc2VJbnQoeSktMV19KTtvPW8ucmVwbGFjZSgvcmdiXChbXlwpXStcKS9nLGZ1bmN0aW9uKHkpe3JldHVybiB1LnRvSGV4KHkpfSk7aWYodi51cmxfY29udmVydGVyKXtvPW8ucmVwbGFjZSgvdXJsXChbXCdcIl0/KFteXClcJ1wiXSspW1wnXCJdP1wpL2csZnVuY3Rpb24oeSx6KXtyZXR1cm4idXJsKCIrdi51cmxfY29udmVydGVyLmNhbGwodi51cmxfY29udmVydGVyX3Njb3BlfHx1LHUuZGVjb2RlKHopLCJzdHlsZSIsbnVsbCkrIikifSl9eFttLnRyaW0oc1swXSkudG9Mb3dlckNhc2UoKV09b319KTtwKCJib3JkZXIiLCIiLCJib3JkZXIiKTtwKCJib3JkZXIiLCItd2lkdGgiLCJib3JkZXItd2lkdGgiKTtwKCJib3JkZXIiLCItY29sb3IiLCJib3JkZXItY29sb3IiKTtwKCJib3JkZXIiLCItc3R5bGUiLCJib3JkZXItc3R5bGUiKTtwKCJwYWRkaW5nIiwiIiwicGFkZGluZyIpO3AoIm1hcmdpbiIsIiIsIm1hcmdpbiIpO3EoImJvcmRlciIsImJvcmRlci13aWR0aCIsImJvcmRlci1zdHlsZSIsImJvcmRlci1jb2xvciIpO2lmKGQpe2lmKHguYm9yZGVyPT0ibWVkaXVtIG5vbmUiKXt4LmJvcmRlcj0iIn19cmV0dXJuIHh9LHNlcmlhbGl6ZVN0eWxlOmZ1bmN0aW9uKHYscCl7dmFyIHE9dGhpcyxyPSIiO2Z1bmN0aW9uIHUocyxvKXtpZihvJiZzKXtpZihvLmluZGV4T2YoIi0iKT09PTApe3JldHVybn1zd2l0Y2gobyl7Y2FzZSJmb250LXdlaWdodCI6aWYocz09NzAwKXtzPSJib2xkIn1icmVhaztjYXNlImNvbG9yIjpjYXNlImJhY2tncm91bmQtY29sb3IiOnM9cy50b0xvd2VyQ2FzZSgpO2JyZWFrfXIrPShyPyIgIjoiIikrbysiOiAiK3MrIjsifX1pZihwJiZxLl9zdHlsZXMpe2socS5fc3R5bGVzWyIqIl0sZnVuY3Rpb24obyl7dSh2W29dLG8pfSk7ayhxLl9zdHlsZXNbcC50b0xvd2VyQ2FzZSgpXSxmdW5jdGlvbihvKXt1KHZbb10sbyl9KX1lbHNle2sodix1KX1yZXR1cm4gcn0sbG9hZENTUzpmdW5jdGlvbihvKXt2YXIgcT10aGlzLHI9cS5kb2MscDtpZighbyl7bz0iIn1wPXEuc2VsZWN0KCJoZWFkIilbMF07ayhvLnNwbGl0KCIsIiksZnVuY3Rpb24ocyl7dmFyIHQ7aWYocS5maWxlc1tzXSl7cmV0dXJufXEuZmlsZXNbc109dHJ1ZTt0PXEuY3JlYXRlKCJsaW5rIix7cmVsOiJzdHlsZXNoZWV0IixocmVmOm0uX2FkZFZlcihzKX0pO2lmKGQmJnIuZG9jdW1lbnRNb2RlJiZyLnJlY2FsYyl7dC5vbmxvYWQ9ZnVuY3Rpb24oKXtyLnJlY2FsYygpO3Qub25sb2FkPW51bGx9fXAuYXBwZW5kQ2hpbGQodCl9KX0sYWRkQ2xhc3M6ZnVuY3Rpb24obyxwKXtyZXR1cm4gdGhpcy5ydW4obyxmdW5jdGlvbihxKXt2YXIgcjtpZighcCl7cmV0dXJuIDB9aWYodGhpcy5oYXNDbGFzcyhxLHApKXtyZXR1cm4gcS5jbGFzc05hbWV9cj10aGlzLnJlbW92ZUNsYXNzKHEscCk7cmV0dXJuIHEuY2xhc3NOYW1lPShyIT0iIj8ocisiICIpOiIiKStwfSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHEscil7dmFyIG89dGhpcyxwO3JldHVybiBvLnJ1bihxLGZ1bmN0aW9uKHQpe3ZhciBzO2lmKG8uaGFzQ2xhc3ModCxyKSl7aWYoIXApe3A9bmV3IFJlZ0V4cCgiKF58XFxzKykiK3IrIihcXHMrfCQpIiwiZyIpfXM9dC5jbGFzc05hbWUucmVwbGFjZShwLCIgIik7cz1tLnRyaW0ocyE9IiAiP3M6IiIpO3QuY2xhc3NOYW1lPXM7aWYoIXMpe3QucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpO3QucmVtb3ZlQXR0cmlidXRlKCJjbGFzc05hbWUiKX1yZXR1cm4gc31yZXR1cm4gdC5jbGFzc05hbWV9KX0saGFzQ2xhc3M6ZnVuY3Rpb24ocCxvKXtwPXRoaXMuZ2V0KHApO2lmKCFwfHwhbyl7cmV0dXJuIGZhbHNlfXJldHVybigiICIrcC5jbGFzc05hbWUrIiAiKS5pbmRleE9mKCIgIitvKyIgIikhPT0tMX0sc2hvdzpmdW5jdGlvbihvKXtyZXR1cm4gdGhpcy5zZXRTdHlsZShvLCJkaXNwbGF5IiwiYmxvY2siKX0saGlkZTpmdW5jdGlvbihvKXtyZXR1cm4gdGhpcy5zZXRTdHlsZShvLCJkaXNwbGF5Iiwibm9uZSIpfSxpc0hpZGRlbjpmdW5jdGlvbihvKXtvPXRoaXMuZ2V0KG8pO3JldHVybiAhb3x8by5zdHlsZS5kaXNwbGF5PT0ibm9uZSJ8fHRoaXMuZ2V0U3R5bGUobywiZGlzcGxheSIpPT0ibm9uZSJ9LHVuaXF1ZUlkOmZ1bmN0aW9uKG8pe3JldHVybighbz8ibWNlXyI6bykrKHRoaXMuY291bnRlcisrKX0sc2V0SFRNTDpmdW5jdGlvbihxLHApe3ZhciBvPXRoaXM7cmV0dXJuIHRoaXMucnVuKHEsZnVuY3Rpb24odil7dmFyIHIsdCxzLHosdSxyO3A9by5wcm9jZXNzSFRNTChwKTtpZihkKXtmdW5jdGlvbiB5KCl7d2hpbGUodi5maXJzdENoaWxkKXt2LmZpcnN0Q2hpbGQucmVtb3ZlTm9kZSgpfXRyeXt2LmlubmVySFRNTD0iPGJyIC8+IitwO3YucmVtb3ZlQ2hpbGQodi5maXJzdENoaWxkKX1jYXRjaCh4KXtyPW8uY3JlYXRlKCJkaXYiKTtyLmlubmVySFRNTD0iPGJyIC8+IitwO2soci5jaGlsZE5vZGVzLGZ1bmN0aW9uKEIsQSl7aWYoQSl7di5hcHBlbmRDaGlsZChCKX19KX19aWYoby5zZXR0aW5ncy5maXhfaWVfcGFyYWdyYXBocyl7cD1wLnJlcGxhY2UoLzxwPjxcL3A+fDxwKFtePl0rKT48XC9wPnw8cFteXC8rXVwvPi9naSwnPHAkMSBfbWNlX2tlZXA9InRydWUiPiZuYnNwOzwvcD4nKX15KCk7aWYoby5zZXR0aW5ncy5maXhfaWVfcGFyYWdyYXBocyl7cz12LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwIik7Zm9yKHQ9cy5sZW5ndGgtMSxyPTA7dD49MDt0LS0pe3o9c1t0XTtpZighei5oYXNDaGlsZE5vZGVzKCkpe2lmKCF6Ll9tY2Vfa2VlcCl7cj0xO2JyZWFrfXoucmVtb3ZlQXR0cmlidXRlKCJfbWNlX2tlZXAiKX19fWlmKHIpe3A9cC5yZXBsYWNlKC88cCAoW14+XSspPnw8cD4vaWcsJzxkaXYgJDEgX21jZV90bXA9IjEiPicpO3A9cC5yZXBsYWNlKC88XC9wPi9naSwiPC9kaXY+Iik7eSgpO2lmKG8uc2V0dGluZ3MuZml4X2llX3BhcmFncmFwaHMpe3M9di5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRElWIik7Zm9yKHQ9cy5sZW5ndGgtMTt0Pj0wO3QtLSl7ej1zW3RdO2lmKHouX21jZV90bXApe3U9by5kb2MuY3JlYXRlRWxlbWVudCgicCIpO3ouY2xvbmVOb2RlKGZhbHNlKS5vdXRlckhUTUwucmVwbGFjZSgvKFthLXowLTlcLV9dKyk9L2dpLGZ1bmN0aW9uKEEseCl7dmFyIEI7aWYoeCE9PSJfbWNlX3RtcCIpe0I9ei5nZXRBdHRyaWJ1dGUoeCk7aWYoIUImJng9PT0iY2xhc3MiKXtCPXouY2xhc3NOYW1lfXUuc2V0QXR0cmlidXRlKHgsQil9fSk7Zm9yKHI9MDtyPHouY2hpbGROb2Rlcy5sZW5ndGg7cisrKXt1LmFwcGVuZENoaWxkKHouY2hpbGROb2Rlc1tyXS5jbG9uZU5vZGUodHJ1ZSkpfXouc3dhcE5vZGUodSl9fX19fWVsc2V7di5pbm5lckhUTUw9cH1yZXR1cm4gcH0pfSxwcm9jZXNzSFRNTDpmdW5jdGlvbihyKXt2YXIgcD10aGlzLHE9cC5zZXR0aW5ncyx2PVtdO2lmKCFxLnByb2Nlc3NfaHRtbCl7cmV0dXJuIHJ9aWYoZCl7cj1yLnJlcGxhY2UoLyZhcG9zOy9nLCImIzM5OyIpO3I9ci5yZXBsYWNlKC9ccysoZGlzYWJsZWR8Y2hlY2tlZHxyZWFkb25seXxzZWxlY3RlZClccyo9XHMqW1wiXCddPyhmYWxzZXwwKVtcIlwnXT8vZ2ksIiIpfXI9bS5fcmVwbGFjZSgvPGEoICkoW14+XSspXC8+fDxhXC8+L2dpLCI8YSQxJDI+PC9hPiIscik7aWYocS5rZWVwX3ZhbHVlcyl7aWYoLzxzY3JpcHR8bm9zY3JpcHR8c3R5bGUvaS50ZXN0KHIpKXtmdW5jdGlvbiBvKHQpe3Q9dC5yZXBsYWNlKC8oPCEtLVxbQ0RBVEFcW3xcXVxdLS0+KS9nLCJcbiIpO3Q9dC5yZXBsYWNlKC9eW1xyXG5dKnxbXHJcbl0qJC9nLCIiKTt0PXQucmVwbGFjZSgvXlxzKihcL1wvXHMqPCEtLXxcL1wvXHMqPCFcW0NEQVRBXFt8PCEtLXw8IVxbQ0RBVEFcWylbXHJcbl0qL2csIiIpO3Q9dC5yZXBsYWNlKC9ccyooXC9cL1xzKlxdXF0+fFwvXC9ccyotLT58XF1cXT58LS0+fFxdXF0tLT4pXHMqJC9nLCIiKTtyZXR1cm4gdH1yPXIucmVwbGFjZSgvPHNjcmlwdChbXj5dK3wpPihbXHNcU10qPyk8XC9zY3JpcHQ+L2dpLGZ1bmN0aW9uKHMseCx0KXtpZigheCl7eD0nIHR5cGU9InRleHQvamF2YXNjcmlwdCInfXg9eC5yZXBsYWNlKC9zcmM9XCIoW15cIl0rKVwiPy9pLGZ1bmN0aW9uKHkseil7aWYocS51cmxfY29udmVydGVyKXt6PXAuZW5jb2RlKHEudXJsX2NvbnZlcnRlci5jYWxsKHEudXJsX2NvbnZlcnRlcl9zY29wZXx8cCxwLmRlY29kZSh6KSwic3JjIiwic2NyaXB0IikpfXJldHVybidfbWNlX3NyYz0iJyt6KyciJ30pO2lmKG0udHJpbSh0KSl7di5wdXNoKG8odCkpO3Q9IjwhLS1cbk1DRV9TQ1JJUFQ6Iisodi5sZW5ndGgtMSkrIlxuLy8gLS0+In1yZXR1cm4iPG1jZTpzY3JpcHQiK3grIj4iK3QrIjwvbWNlOnNjcmlwdD4ifSk7cj1yLnJlcGxhY2UoLzxzdHlsZShbXj5dK3wpPihbXHNcU10qPyk8XC9zdHlsZT4vZ2ksZnVuY3Rpb24ocyx4LHQpe2lmKHQpe3YucHVzaChvKHQpKTt0PSI8IS0tXG5NQ0VfU0NSSVBUOiIrKHYubGVuZ3RoLTEpKyJcbi0tPiJ9cmV0dXJuIjxtY2U6c3R5bGUiK3grIj4iK3QrIjwvbWNlOnN0eWxlPjxzdHlsZSAiK3grJyBfbWNlX2JvZ3VzPSIxIj4nK3QrIjwvc3R5bGU+In0pO3I9ci5yZXBsYWNlKC88bm9zY3JpcHQoW14+XSt8KT4oW1xzXFNdKj8pPFwvbm9zY3JpcHQ+L2csZnVuY3Rpb24ocyx4LHQpe3JldHVybiI8bWNlOm5vc2NyaXB0Iit4KyI+PCEtLSIrcC5lbmNvZGUodCkucmVwbGFjZSgvLS0vZywiJiM0NTsmIzQ1OyIpKyItLT48L21jZTpub3NjcmlwdD4ifSl9cj1tLl9yZXBsYWNlKC88IVxbQ0RBVEFcWyhbXHNcU10rKVxdXF0+L2csIjwhLS1bQ0RBVEFbJDFdXS0tPiIscik7ZnVuY3Rpb24gdShzKXtyZXR1cm4gcy5yZXBsYWNlKGgsZnVuY3Rpb24oeSx6LHgsdCl7cmV0dXJuIjwiK3oreC5yZXBsYWNlKGwsZnVuY3Rpb24oQixBLEUsRCxDKXt2YXIgRjtBPUEudG9Mb3dlckNhc2UoKTtFPUV8fER8fEN8fCIiO2lmKGVbQV0pe2lmKEU9PT0iZmFsc2UifHxFPT09IjAiKXtyZXR1cm59cmV0dXJuIEErJz0iJytBKyciJ31pZihmW0FdJiZ4LmluZGV4T2YoIl9tY2VfIitBKT09LTEpe0Y9cC5kZWNvZGUoRSk7aWYocS51cmxfY29udmVydGVyJiYoQT09InNyYyJ8fEE9PSJocmVmIikpe0Y9cS51cmxfY29udmVydGVyLmNhbGwocS51cmxfY29udmVydGVyX3Njb3BlfHxwLEYsQSx6KX1pZihBPT0ic3R5bGUiKXtGPXAuc2VyaWFsaXplU3R5bGUocC5wYXJzZVN0eWxlKEYpLEEpfXJldHVybiBBKyc9IicrRSsnIiBfbWNlXycrQSsnPSInK3AuZW5jb2RlKEYpKyciJ31yZXR1cm4gQn0pK3QrIj4ifSl9cj11KHIpO3I9ci5yZXBsYWNlKC9NQ0VfU0NSSVBUOihbMC05XSspL2csZnVuY3Rpb24odCxzKXtyZXR1cm4gdltzXX0pfXJldHVybiByfSxnZXRPdXRlckhUTUw6ZnVuY3Rpb24obyl7dmFyIHA7bz10aGlzLmdldChvKTtpZighbyl7cmV0dXJuIG51bGx9aWYoby5vdXRlckhUTUwhPT11bmRlZmluZWQpe3JldHVybiBvLm91dGVySFRNTH1wPShvLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jKS5jcmVhdGVFbGVtZW50KCJib2R5Iik7cC5hcHBlbmRDaGlsZChvLmNsb25lTm9kZSh0cnVlKSk7cmV0dXJuIHAuaW5uZXJIVE1MfSxzZXRPdXRlckhUTUw6ZnVuY3Rpb24ocixwLHMpe3ZhciBvPXRoaXM7ZnVuY3Rpb24gcSh1LHQseCl7dmFyIHksdjt2PXguY3JlYXRlRWxlbWVudCgiYm9keSIpO3YuaW5uZXJIVE1MPXQ7eT12Lmxhc3RDaGlsZDt3aGlsZSh5KXtvLmluc2VydEFmdGVyKHkuY2xvbmVOb2RlKHRydWUpLHUpO3k9eS5wcmV2aW91c1NpYmxpbmd9by5yZW1vdmUodSl9cmV0dXJuIHRoaXMucnVuKHIsZnVuY3Rpb24odSl7dT1vLmdldCh1KTtpZih1Lm5vZGVUeXBlPT0xKXtzPXN8fHUub3duZXJEb2N1bWVudHx8by5kb2M7aWYoZCl7dHJ5e2lmKGQmJnUubm9kZVR5cGU9PTEpe3Uub3V0ZXJIVE1MPXB9ZWxzZXtxKHUscCxzKX19Y2F0Y2godCl7cSh1LHAscyl9fWVsc2V7cSh1LHAscyl9fX0pfSxkZWNvZGU6ZnVuY3Rpb24ocCl7dmFyIHEscixvO2lmKC8mW1x3I10rOy8udGVzdChwKSl7cT10aGlzLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKTtxLmlubmVySFRNTD1wO3I9cS5maXJzdENoaWxkO289IiI7aWYocil7ZG97bys9ci5ub2RlVmFsdWV9d2hpbGUocj1yLm5leHRTaWJsaW5nKX1yZXR1cm4gb3x8cH1yZXR1cm4gcH0sZW5jb2RlOmZ1bmN0aW9uKG8pe3JldHVybigiIitvKS5yZXBsYWNlKG4sZnVuY3Rpb24ocCl7cmV0dXJuIGNbcF19KX0saW5zZXJ0QWZ0ZXI6ZnVuY3Rpb24obyxwKXtwPXRoaXMuZ2V0KHApO3JldHVybiB0aGlzLnJ1bihvLGZ1bmN0aW9uKHIpe3ZhciBxLHM7cT1wLnBhcmVudE5vZGU7cz1wLm5leHRTaWJsaW5nO2lmKHMpe3EuaW5zZXJ0QmVmb3JlKHIscyl9ZWxzZXtxLmFwcGVuZENoaWxkKHIpfXJldHVybiByfSl9LGlzQmxvY2s6ZnVuY3Rpb24obyl7aWYoby5ub2RlVHlwZSYmby5ub2RlVHlwZSE9PTEpe3JldHVybiBmYWxzZX1vPW8ubm9kZU5hbWV8fG87cmV0dXJuIGEudGVzdChvKX0scmVwbGFjZTpmdW5jdGlvbihzLHIscCl7dmFyIHE9dGhpcztpZihqKHIsImFycmF5Iikpe3M9cy5jbG9uZU5vZGUodHJ1ZSl9cmV0dXJuIHEucnVuKHIsZnVuY3Rpb24odCl7aWYocCl7ayhtLmdyZXAodC5jaGlsZE5vZGVzKSxmdW5jdGlvbihvKXtzLmFwcGVuZENoaWxkKG8pfSl9cmV0dXJuIHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocyx0KX0pfSxyZW5hbWU6ZnVuY3Rpb24ocixvKXt2YXIgcT10aGlzLHA7aWYoci5ub2RlTmFtZSE9by50b1VwcGVyQ2FzZSgpKXtwPXEuY3JlYXRlKG8pO2socS5nZXRBdHRyaWJzKHIpLGZ1bmN0aW9uKHMpe3Euc2V0QXR0cmliKHAscy5ub2RlTmFtZSxxLmdldEF0dHJpYihyLHMubm9kZU5hbWUpKX0pO3EucmVwbGFjZShwLHIsMSl9cmV0dXJuIHB8fHJ9LGZpbmRDb21tb25BbmNlc3RvcjpmdW5jdGlvbihxLG8pe3ZhciByPXEscDt3aGlsZShyKXtwPW87d2hpbGUocCYmciE9cCl7cD1wLnBhcmVudE5vZGV9aWYocj09cCl7YnJlYWt9cj1yLnBhcmVudE5vZGV9aWYoIXImJnEub3duZXJEb2N1bWVudCl7cmV0dXJuIHEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9cmV0dXJuIHJ9LHRvSGV4OmZ1bmN0aW9uKG8pe3ZhciBxPS9eXHMqcmdiXHMqP1woXHMqPyhbMC05XSspXHMqPyxccyo/KFswLTldKylccyo/LFxzKj8oWzAtOV0rKVxzKj9cKVxzKiQvaS5leGVjKG8pO2Z1bmN0aW9uIHAocil7cj1wYXJzZUludChyKS50b1N0cmluZygxNik7cmV0dXJuIHIubGVuZ3RoPjE/cjoiMCIrcn1pZihxKXtvPSIjIitwKHFbMV0pK3AocVsyXSkrcChxWzNdKTtyZXR1cm4gb31yZXR1cm4gb30sZ2V0Q2xhc3NlczpmdW5jdGlvbigpe3ZhciBzPXRoaXMsbz1bXSxyLHU9e30sdj1zLnNldHRpbmdzLmNsYXNzX2ZpbHRlcixxO2lmKHMuY2xhc3Nlcyl7cmV0dXJuIHMuY2xhc3Nlc31mdW5jdGlvbiB4KHQpe2sodC5pbXBvcnRzLGZ1bmN0aW9uKHkpe3goeSl9KTtrKHQuY3NzUnVsZXN8fHQucnVsZXMsZnVuY3Rpb24oeSl7c3dpdGNoKHkudHlwZXx8MSl7Y2FzZSAxOmlmKHkuc2VsZWN0b3JUZXh0KXtrKHkuc2VsZWN0b3JUZXh0LnNwbGl0KCIsIiksZnVuY3Rpb24oeil7ej16LnJlcGxhY2UoL15ccyp8XHMqJHxeXHNcLi9nLCIiKTtpZigvXC5tY2UvLnRlc3Qoeil8fCEvXC5bXHdcLV0rJC8udGVzdCh6KSl7cmV0dXJufXE9ejt6PW0uX3JlcGxhY2UoLy4qXC4oW2EtejAtOV9cLV0rKS4qL2ksIiQxIix6KTtpZih2JiYhKHo9dih6LHEpKSl7cmV0dXJufWlmKCF1W3pdKXtvLnB1c2goeyJjbGFzcyI6en0pO3Vbel09MX19KX1icmVhaztjYXNlIDM6eCh5LnN0eWxlU2hlZXQpO2JyZWFrfX0pfXRyeXtrKHMuZG9jLnN0eWxlU2hlZXRzLHgpfWNhdGNoKHApe31pZihvLmxlbmd0aD4wKXtzLmNsYXNzZXM9b31yZXR1cm4gb30scnVuOmZ1bmN0aW9uKHUscixxKXt2YXIgcD10aGlzLHY7aWYocC5kb2MmJnR5cGVvZih1KT09PSJzdHJpbmciKXt1PXAuZ2V0KHUpfWlmKCF1KXtyZXR1cm4gZmFsc2V9cT1xfHx0aGlzO2lmKCF1Lm5vZGVUeXBlJiYodS5sZW5ndGh8fHUubGVuZ3RoPT09MCkpe3Y9W107ayh1LGZ1bmN0aW9uKHMsbyl7aWYocyl7aWYodHlwZW9mKHMpPT0ic3RyaW5nIil7cz1wLmRvYy5nZXRFbGVtZW50QnlJZChzKX12LnB1c2goci5jYWxsKHEscyxvKSl9fSk7cmV0dXJuIHZ9cmV0dXJuIHIuY2FsbChxLHUpfSxnZXRBdHRyaWJzOmZ1bmN0aW9uKHEpe3ZhciBwO3E9dGhpcy5nZXQocSk7aWYoIXEpe3JldHVybltdfWlmKGQpe3A9W107aWYocS5ub2RlTmFtZT09Ik9CSkVDVCIpe3JldHVybiBxLmF0dHJpYnV0ZXN9aWYocS5ub2RlTmFtZT09PSJPUFRJT04iJiZ0aGlzLmdldEF0dHJpYihxLCJzZWxlY3RlZCIpKXtwLnB1c2goe3NwZWNpZmllZDoxLG5vZGVOYW1lOiJzZWxlY3RlZCJ9KX1xLmNsb25lTm9kZShmYWxzZSkub3V0ZXJIVE1MLnJlcGxhY2UoLzxcLz9bXHc6XC1dKyA/fD1bXCJdW15cIl0rXCJ8PVwnW15cJ10rXCd8PVtcd1wtXSt8Pi9naSwiIikucmVwbGFjZSgvW1x3OlwtXSsvZ2ksZnVuY3Rpb24obyl7cC5wdXNoKHtzcGVjaWZpZWQ6MSxub2RlTmFtZTpvfSl9KTtyZXR1cm4gcH1yZXR1cm4gcS5hdHRyaWJ1dGVzfSxkZXN0cm95OmZ1bmN0aW9uKHApe3ZhciBvPXRoaXM7aWYoby5ldmVudHMpe28uZXZlbnRzLmRlc3Ryb3koKX1vLndpbj1vLmRvYz1vLnJvb3Q9by5ldmVudHM9bnVsbDtpZighcCl7bS5yZW1vdmVVbmxvYWQoby5kZXN0cm95KX19LGNyZWF0ZVJuZzpmdW5jdGlvbigpe3ZhciBvPXRoaXMuZG9jO3JldHVybiBvLmNyZWF0ZVJhbmdlP28uY3JlYXRlUmFuZ2UoKTpuZXcgbS5kb20uUmFuZ2UodGhpcyl9LG5vZGVJbmRleDpmdW5jdGlvbihzLHQpe3ZhciBvPTAscSxyLHA7aWYocyl7Zm9yKHE9cy5ub2RlVHlwZSxzPXMucHJldmlvdXNTaWJsaW5nLHI9cztzO3M9cy5wcmV2aW91c1NpYmxpbmcpe3A9cy5ub2RlVHlwZTtpZih0JiZwPT0zKXtpZihwPT1xfHwhcy5ub2RlVmFsdWUubGVuZ3RoKXtjb250aW51ZX19bysrO3E9cH19cmV0dXJuIG99LHNwbGl0OmZ1bmN0aW9uKHUscyx5KXt2YXIgej10aGlzLG89ei5jcmVhdGVSbmcoKSx2LHEseDtmdW5jdGlvbiBwKEEpe3ZhciB0LHI9QS5jaGlsZE5vZGVzO2lmKEEubm9kZVR5cGU9PTEmJkEuZ2V0QXR0cmlidXRlKCJfbWNlX3R5cGUiKT09ImJvb2ttYXJrIil7cmV0dXJufWZvcih0PXIubGVuZ3RoLTE7dD49MDt0LS0pe3Aoclt0XSl9aWYoQS5ub2RlVHlwZSE9OSl7aWYoQS5ub2RlVHlwZT09MyYmQS5ub2RlVmFsdWUubGVuZ3RoPjApe2lmKCF6LmlzQmxvY2soQS5wYXJlbnROb2RlKXx8bS50cmltKEEubm9kZVZhbHVlKS5sZW5ndGg+MCl7cmV0dXJufX1pZihBLm5vZGVUeXBlPT0xKXtyPUEuY2hpbGROb2RlcztpZihyLmxlbmd0aD09MSYmclswXSYmclswXS5ub2RlVHlwZT09MSYmclswXS5nZXRBdHRyaWJ1dGUoIl9tY2VfdHlwZSIpPT0iYm9va21hcmsiKXtBLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHJbMF0sQSl9aWYoci5sZW5ndGh8fC9eKGJyfGhyfGlucHV0fGltZykkL2kudGVzdChBLm5vZGVOYW1lKSl7cmV0dXJufX16LnJlbW92ZShBKX1yZXR1cm4gQX1pZih1JiZzKXtvLnNldFN0YXJ0KHUucGFyZW50Tm9kZSx6Lm5vZGVJbmRleCh1KSk7by5zZXRFbmQocy5wYXJlbnROb2RlLHoubm9kZUluZGV4KHMpKTt2PW8uZXh0cmFjdENvbnRlbnRzKCk7bz16LmNyZWF0ZVJuZygpO28uc2V0U3RhcnQocy5wYXJlbnROb2RlLHoubm9kZUluZGV4KHMpKzEpO28uc2V0RW5kKHUucGFyZW50Tm9kZSx6Lm5vZGVJbmRleCh1KSsxKTtxPW8uZXh0cmFjdENvbnRlbnRzKCk7eD11LnBhcmVudE5vZGU7eC5pbnNlcnRCZWZvcmUocCh2KSx1KTtpZih5KXt4LnJlcGxhY2VDaGlsZCh5LHMpfWVsc2V7eC5pbnNlcnRCZWZvcmUocyx1KX14Lmluc2VydEJlZm9yZShwKHEpLHUpO3oucmVtb3ZlKHUpO3JldHVybiB5fHxzfX0sYmluZDpmdW5jdGlvbihzLG8scixxKXt2YXIgcD10aGlzO2lmKCFwLmV2ZW50cyl7cC5ldmVudHM9bmV3IG0uZG9tLkV2ZW50VXRpbHMoKX1yZXR1cm4gcC5ldmVudHMuYWRkKHMsbyxyLHF8fHRoaXMpfSx1bmJpbmQ6ZnVuY3Rpb24ocixvLHEpe3ZhciBwPXRoaXM7aWYoIXAuZXZlbnRzKXtwLmV2ZW50cz1uZXcgbS5kb20uRXZlbnRVdGlscygpfXJldHVybiBwLmV2ZW50cy5yZW1vdmUocixvLHEpfSxfZmluZFNpYjpmdW5jdGlvbihyLG8scCl7dmFyIHE9dGhpcyxzPW87aWYocil7aWYoaihzLCJzdHJpbmciKSl7cz1mdW5jdGlvbih0KXtyZXR1cm4gcS5pcyh0LG8pfX1mb3Iocj1yW3BdO3I7cj1yW3BdKXtpZihzKHIpKXtyZXR1cm4gcn19fXJldHVybiBudWxsfSxfaXNSZXM6ZnVuY3Rpb24obyl7cmV0dXJuL14odG9wfGxlZnR8Ym90dG9tfHJpZ2h0fHdpZHRofGhlaWdodCkvaS50ZXN0KG8pfHwvO1xzKih0b3B8bGVmdHxib3R0b218cmlnaHR8d2lkdGh8aGVpZ2h0KS9pLnRlc3Qobyl9fSk7bS5ET009bmV3IG0uZG9tLkRPTVV0aWxzKGRvY3VtZW50LHtwcm9jZXNzX2h0bWw6MH0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYyl7dmFyIE49dGhpcyxlPWMuZG9jLFM9MCxFPTEsaj0yLEQ9dHJ1ZSxSPWZhbHNlLFU9InN0YXJ0T2Zmc2V0IixoPSJzdGFydENvbnRhaW5lciIsUD0iZW5kQ29udGFpbmVyIix6PSJlbmRPZmZzZXQiLGs9dGlueW1jZS5leHRlbmQsbj1jLm5vZGVJbmRleDtrKE4se3N0YXJ0Q29udGFpbmVyOmUsc3RhcnRPZmZzZXQ6MCxlbmRDb250YWluZXI6ZSxlbmRPZmZzZXQ6MCxjb2xsYXBzZWQ6RCxjb21tb25BbmNlc3RvckNvbnRhaW5lcjplLFNUQVJUX1RPX1NUQVJUOjAsU1RBUlRfVE9fRU5EOjEsRU5EX1RPX0VORDoyLEVORF9UT19TVEFSVDozLHNldFN0YXJ0OnEsc2V0RW5kOnMsc2V0U3RhcnRCZWZvcmU6ZyxzZXRTdGFydEFmdGVyOkksc2V0RW5kQmVmb3JlOkosc2V0RW5kQWZ0ZXI6dSxjb2xsYXBzZTpBLHNlbGVjdE5vZGU6eCxzZWxlY3ROb2RlQ29udGVudHM6Rixjb21wYXJlQm91bmRhcnlQb2ludHM6dixkZWxldGVDb250ZW50czpwLGV4dHJhY3RDb250ZW50czpILGNsb25lQ29udGVudHM6ZCxpbnNlcnROb2RlOkMsc3Vycm91bmRDb250ZW50czpNLGNsb25lUmFuZ2U6S30pO2Z1bmN0aW9uIHEoVix0KXtCKEQsVix0KX1mdW5jdGlvbiBzKFYsdCl7QihSLFYsdCl9ZnVuY3Rpb24gZyh0KXtxKHQucGFyZW50Tm9kZSxuKHQpKX1mdW5jdGlvbiBJKHQpe3EodC5wYXJlbnROb2RlLG4odCkrMSl9ZnVuY3Rpb24gSih0KXtzKHQucGFyZW50Tm9kZSxuKHQpKX1mdW5jdGlvbiB1KHQpe3ModC5wYXJlbnROb2RlLG4odCkrMSl9ZnVuY3Rpb24gQSh0KXtpZih0KXtOW1BdPU5baF07Tlt6XT1OW1VdfWVsc2V7TltoXT1OW1BdO05bVV09Tlt6XX1OLmNvbGxhcHNlZD1EfWZ1bmN0aW9uIHgodCl7Zyh0KTt1KHQpfWZ1bmN0aW9uIEYodCl7cSh0LDApO3ModCx0Lm5vZGVUeXBlPT09MT90LmNoaWxkTm9kZXMubGVuZ3RoOnQubm9kZVZhbHVlLmxlbmd0aCl9ZnVuY3Rpb24gdihXLFgpe3ZhciBaPU5baF0sWT1OW1VdLFY9TltQXSx0PU5bel07aWYoVz09PTApe3JldHVybiBHKFosWSxaLFkpfWlmKFc9PT0xKXtyZXR1cm4gRyhaLFksVix0KX1pZihXPT09Mil7cmV0dXJuIEcoVix0LFYsdCl9aWYoVz09PTMpe3JldHVybiBHKFYsdCxaLFkpfX1mdW5jdGlvbiBwKCl7bShqKX1mdW5jdGlvbiBIKCl7cmV0dXJuIG0oUyl9ZnVuY3Rpb24gZCgpe3JldHVybiBtKEUpfWZ1bmN0aW9uIEMoWSl7dmFyIFY9dGhpc1toXSx0PXRoaXNbVV0sWCxXO2lmKChWLm5vZGVUeXBlPT09M3x8Vi5ub2RlVHlwZT09PTQpJiZWLm5vZGVWYWx1ZSl7aWYoIXQpe1YucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoWSxWKX1lbHNle2lmKHQ+PVYubm9kZVZhbHVlLmxlbmd0aCl7Yy5pbnNlcnRBZnRlcihZLFYpfWVsc2V7WD1WLnNwbGl0VGV4dCh0KTtWLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKFksWCl9fX1lbHNle2lmKFYuY2hpbGROb2Rlcy5sZW5ndGg+MCl7Vz1WLmNoaWxkTm9kZXNbdF19aWYoVyl7Vi5pbnNlcnRCZWZvcmUoWSxXKX1lbHNle1YuYXBwZW5kQ2hpbGQoWSl9fX1mdW5jdGlvbiBNKFYpe3ZhciB0PU4uZXh0cmFjdENvbnRlbnRzKCk7Ti5pbnNlcnROb2RlKFYpO1YuYXBwZW5kQ2hpbGQodCk7Ti5zZWxlY3ROb2RlKFYpfWZ1bmN0aW9uIEsoKXtyZXR1cm4gayhuZXcgYihjKSx7c3RhcnRDb250YWluZXI6TltoXSxzdGFydE9mZnNldDpOW1VdLGVuZENvbnRhaW5lcjpOW1BdLGVuZE9mZnNldDpOW3pdLGNvbGxhcHNlZDpOLmNvbGxhcHNlZCxjb21tb25BbmNlc3RvckNvbnRhaW5lcjpOLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyfSl9ZnVuY3Rpb24gTyh0LFYpe3ZhciBXO2lmKHQubm9kZVR5cGU9PTMpe3JldHVybiB0fWlmKFY8MCl7cmV0dXJuIHR9Vz10LmZpcnN0Q2hpbGQ7d2hpbGUoVyYmVj4wKXstLVY7Vz1XLm5leHRTaWJsaW5nfWlmKFcpe3JldHVybiBXfXJldHVybiB0fWZ1bmN0aW9uIGwoKXtyZXR1cm4oTltoXT09TltQXSYmTltVXT09Tlt6XSl9ZnVuY3Rpb24gRyhYLFosVixZKXt2YXIgYWEsVyx0LGFiLGFkLGFjO2lmKFg9PVYpe2lmKFo9PVkpe3JldHVybiAwfWlmKFo8WSl7cmV0dXJuIC0xfXJldHVybiAxfWFhPVY7d2hpbGUoYWEmJmFhLnBhcmVudE5vZGUhPVgpe2FhPWFhLnBhcmVudE5vZGV9aWYoYWEpe1c9MDt0PVguZmlyc3RDaGlsZDt3aGlsZSh0IT1hYSYmVzxaKXtXKys7dD10Lm5leHRTaWJsaW5nfWlmKFo8PVcpe3JldHVybiAtMX1yZXR1cm4gMX1hYT1YO3doaWxlKGFhJiZhYS5wYXJlbnROb2RlIT1WKXthYT1hYS5wYXJlbnROb2RlfWlmKGFhKXtXPTA7dD1WLmZpcnN0Q2hpbGQ7d2hpbGUodCE9YWEmJlc8WSl7VysrO3Q9dC5uZXh0U2libGluZ31pZihXPFkpe3JldHVybiAtMX1yZXR1cm4gMX1hYj1jLmZpbmRDb21tb25BbmNlc3RvcihYLFYpO2FkPVg7d2hpbGUoYWQmJmFkLnBhcmVudE5vZGUhPWFiKXthZD1hZC5wYXJlbnROb2RlfWlmKCFhZCl7YWQ9YWJ9YWM9Vjt3aGlsZShhYyYmYWMucGFyZW50Tm9kZSE9YWIpe2FjPWFjLnBhcmVudE5vZGV9aWYoIWFjKXthYz1hYn1pZihhZD09YWMpe3JldHVybiAwfXQ9YWIuZmlyc3RDaGlsZDt3aGlsZSh0KXtpZih0PT1hZCl7cmV0dXJuIC0xfWlmKHQ9PWFjKXtyZXR1cm4gMX10PXQubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIEIoVixZLFgpe3ZhciB0LFc7aWYoVil7TltoXT1ZO05bVV09WH1lbHNle05bUF09WTtOW3pdPVh9dD1OW1BdO3doaWxlKHQucGFyZW50Tm9kZSl7dD10LnBhcmVudE5vZGV9Vz1OW2hdO3doaWxlKFcucGFyZW50Tm9kZSl7Vz1XLnBhcmVudE5vZGV9aWYoVz09dCl7aWYoRyhOW2hdLE5bVV0sTltQXSxOW3pdKT4wKXtOLmNvbGxhcHNlKFYpfX1lbHNle04uY29sbGFwc2UoVil9Ti5jb2xsYXBzZWQ9bCgpO04uY29tbW9uQW5jZXN0b3JDb250YWluZXI9Yy5maW5kQ29tbW9uQW5jZXN0b3IoTltoXSxOW1BdKX1mdW5jdGlvbiBtKGFiKXt2YXIgYWEsWD0wLGFkPTAsVixaLFcsWSx0LGFjO2lmKE5baF09PU5bUF0pe3JldHVybiBmKGFiKX1mb3IoYWE9TltQXSxWPWFhLnBhcmVudE5vZGU7VjthYT1WLFY9Vi5wYXJlbnROb2RlKXtpZihWPT1OW2hdKXtyZXR1cm4gcihhYSxhYil9KytYfWZvcihhYT1OW2hdLFY9YWEucGFyZW50Tm9kZTtWO2FhPVYsVj1WLnBhcmVudE5vZGUpe2lmKFY9PU5bUF0pe3JldHVybiBUKGFhLGFiKX0rK2FkfVo9YWQtWDtXPU5baF07d2hpbGUoWj4wKXtXPVcucGFyZW50Tm9kZTtaLS19WT1OW1BdO3doaWxlKFo8MCl7WT1ZLnBhcmVudE5vZGU7WisrfWZvcih0PVcucGFyZW50Tm9kZSxhYz1ZLnBhcmVudE5vZGU7dCE9YWM7dD10LnBhcmVudE5vZGUsYWM9YWMucGFyZW50Tm9kZSl7Vz10O1k9YWN9cmV0dXJuIG8oVyxZLGFiKX1mdW5jdGlvbiBmKFope3ZhciBhYixZLFgsYWEsdCxXLFY7aWYoWiE9ail7YWI9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCl9aWYoTltVXT09Tlt6XSl7cmV0dXJuIGFifWlmKE5baF0ubm9kZVR5cGU9PTMpe1k9TltoXS5ub2RlVmFsdWU7WD1ZLnN1YnN0cmluZyhOW1VdLE5bel0pO2lmKFohPUUpe05baF0uZGVsZXRlRGF0YShOW1VdLE5bel0tTltVXSk7Ti5jb2xsYXBzZShEKX1pZihaPT1qKXtyZXR1cm59YWIuYXBwZW5kQ2hpbGQoZS5jcmVhdGVUZXh0Tm9kZShYKSk7cmV0dXJuIGFifWFhPU8oTltoXSxOW1VdKTt0PU5bel0tTltVXTt3aGlsZSh0PjApe1c9YWEubmV4dFNpYmxpbmc7Vj15KGFhLFopO2lmKGFiKXthYi5hcHBlbmRDaGlsZChWKX0tLXQ7YWE9V31pZihaIT1FKXtOLmNvbGxhcHNlKEQpfXJldHVybiBhYn1mdW5jdGlvbiByKGFiLFkpe3ZhciBhYSxaLFYsdCxYLFc7aWYoWSE9ail7YWE9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCl9Wj1pKGFiLFkpO2lmKGFhKXthYS5hcHBlbmRDaGlsZChaKX1WPW4oYWIpO3Q9Vi1OW1VdO2lmKHQ8PTApe2lmKFkhPUUpe04uc2V0RW5kQmVmb3JlKGFiKTtOLmNvbGxhcHNlKFIpfXJldHVybiBhYX1aPWFiLnByZXZpb3VzU2libGluZzt3aGlsZSh0PjApe1g9Wi5wcmV2aW91c1NpYmxpbmc7Vz15KFosWSk7aWYoYWEpe2FhLmluc2VydEJlZm9yZShXLGFhLmZpcnN0Q2hpbGQpfS0tdDtaPVh9aWYoWSE9RSl7Ti5zZXRFbmRCZWZvcmUoYWIpO04uY29sbGFwc2UoUil9cmV0dXJuIGFhfWZ1bmN0aW9uIFQoWixZKXt2YXIgYWIsVixhYSx0LFgsVztpZihZIT1qKXthYj1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKX1hYT1RKFosWSk7aWYoYWIpe2FiLmFwcGVuZENoaWxkKGFhKX1WPW4oWik7KytWO3Q9Tlt6XS1WO2FhPVoubmV4dFNpYmxpbmc7d2hpbGUodD4wKXtYPWFhLm5leHRTaWJsaW5nO1c9eShhYSxZKTtpZihhYil7YWIuYXBwZW5kQ2hpbGQoVyl9LS10O2FhPVh9aWYoWSE9RSl7Ti5zZXRTdGFydEFmdGVyKFopO04uY29sbGFwc2UoRCl9cmV0dXJuIGFifWZ1bmN0aW9uIG8oWix0LGFjKXt2YXIgVyxhZSxZLGFhLGFiLFYsYWQsWDtpZihhYyE9ail7YWU9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCl9Vz1RKFosYWMpO2lmKGFlKXthZS5hcHBlbmRDaGlsZChXKX1ZPVoucGFyZW50Tm9kZTthYT1uKFopO2FiPW4odCk7KythYTtWPWFiLWFhO2FkPVoubmV4dFNpYmxpbmc7d2hpbGUoVj4wKXtYPWFkLm5leHRTaWJsaW5nO1c9eShhZCxhYyk7aWYoYWUpe2FlLmFwcGVuZENoaWxkKFcpfWFkPVg7LS1WfVc9aSh0LGFjKTtpZihhZSl7YWUuYXBwZW5kQ2hpbGQoVyl9aWYoYWMhPUUpe04uc2V0U3RhcnRBZnRlcihaKTtOLmNvbGxhcHNlKEQpfXJldHVybiBhZX1mdW5jdGlvbiBpKGFhLGFiKXt2YXIgVz1PKE5bUF0sTlt6XS0xKSxhYyxaLFksdCxWLFg9VyE9TltQXTtpZihXPT1hYSl7cmV0dXJuIEwoVyxYLFIsYWIpfWFjPVcucGFyZW50Tm9kZTtaPUwoYWMsUixSLGFiKTt3aGlsZShhYyl7d2hpbGUoVyl7WT1XLnByZXZpb3VzU2libGluZzt0PUwoVyxYLFIsYWIpO2lmKGFiIT1qKXtaLmluc2VydEJlZm9yZSh0LFouZmlyc3RDaGlsZCl9WD1EO1c9WX1pZihhYz09YWEpe3JldHVybiBafVc9YWMucHJldmlvdXNTaWJsaW5nO2FjPWFjLnBhcmVudE5vZGU7Vj1MKGFjLFIsUixhYik7aWYoYWIhPWope1YuYXBwZW5kQ2hpbGQoWil9Wj1WfX1mdW5jdGlvbiBRKGFhLGFiKXt2YXIgWD1PKE5baF0sTltVXSksWT1YIT1OW2hdLGFjLFosVyx0LFY7aWYoWD09YWEpe3JldHVybiBMKFgsWSxELGFiKX1hYz1YLnBhcmVudE5vZGU7Wj1MKGFjLFIsRCxhYik7d2hpbGUoYWMpe3doaWxlKFgpe1c9WC5uZXh0U2libGluZzt0PUwoWCxZLEQsYWIpO2lmKGFiIT1qKXtaLmFwcGVuZENoaWxkKHQpfVk9RDtYPVd9aWYoYWM9PWFhKXtyZXR1cm4gWn1YPWFjLm5leHRTaWJsaW5nO2FjPWFjLnBhcmVudE5vZGU7Vj1MKGFjLFIsRCxhYik7aWYoYWIhPWope1YuYXBwZW5kQ2hpbGQoWil9Wj1WfX1mdW5jdGlvbiBMKHQsWSxhYixhYyl7dmFyIFgsVyxaLFYsYWE7aWYoWSl7cmV0dXJuIHkodCxhYyl9aWYodC5ub2RlVHlwZT09Myl7WD10Lm5vZGVWYWx1ZTtpZihhYil7Vj1OW1VdO1c9WC5zdWJzdHJpbmcoVik7Wj1YLnN1YnN0cmluZygwLFYpfWVsc2V7Vj1OW3pdO1c9WC5zdWJzdHJpbmcoMCxWKTtaPVguc3Vic3RyaW5nKFYpfWlmKGFjIT1FKXt0Lm5vZGVWYWx1ZT1afWlmKGFjPT1qKXtyZXR1cm59YWE9dC5jbG9uZU5vZGUoUik7YWEubm9kZVZhbHVlPVc7cmV0dXJuIGFhfWlmKGFjPT1qKXtyZXR1cm59cmV0dXJuIHQuY2xvbmVOb2RlKFIpfWZ1bmN0aW9uIHkoVix0KXtpZih0IT1qKXtyZXR1cm4gdD09RT9WLmNsb25lTm9kZShEKTpWfVYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChWKX19YS5SYW5nZT1ifSkodGlueW1jZS5kb20pOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGEoZyl7dmFyIGk9dGhpcyxqPSJcdUZFRkYiLGUsaCxkPWcuZG9tLGM9dHJ1ZSxmPWZhbHNlO2Z1bmN0aW9uIGIoKXt2YXIgbj1nLmdldFJuZygpLGs9ZC5jcmVhdGVSbmcoKSxtLG87bT1uLml0ZW0/bi5pdGVtKDApOm4ucGFyZW50RWxlbWVudCgpO2lmKG0ub3duZXJEb2N1bWVudCE9ZC5kb2Mpe3JldHVybiBrfWlmKG4uaXRlbXx8IW0uaGFzQ2hpbGROb2RlcygpKXtrLnNldFN0YXJ0KG0ucGFyZW50Tm9kZSxkLm5vZGVJbmRleChtKSk7ay5zZXRFbmQoay5zdGFydENvbnRhaW5lcixrLnN0YXJ0T2Zmc2V0KzEpO3JldHVybiBrfW89Zy5pc0NvbGxhcHNlZCgpO2Z1bmN0aW9uIGwocyl7dmFyIHUscSx0LHAsQT0wLHgseSx6LHIsdjtyPW4uZHVwbGljYXRlKCk7ci5jb2xsYXBzZShzKTt1PWQuY3JlYXRlKCJhIik7ej1yLnBhcmVudEVsZW1lbnQoKTtpZighei5oYXNDaGlsZE5vZGVzKCkpe2tbcz8ic2V0U3RhcnQiOiJzZXRFbmQiXSh6LDApO3JldHVybn16LmFwcGVuZENoaWxkKHUpO3IubW92ZVRvRWxlbWVudFRleHQodSk7dj1uLmNvbXBhcmVFbmRQb2ludHMocz8iU3RhcnRUb1N0YXJ0IjoiRW5kVG9FbmQiLHIpO2lmKHY+MCl7a1tzPyJzZXRTdGFydEFmdGVyIjoic2V0RW5kQWZ0ZXIiXSh6KTtkLnJlbW92ZSh1KTtyZXR1cm59cD10aW55bWNlLmdyZXAoei5jaGlsZE5vZGVzKTt4PXAubGVuZ3RoLTE7d2hpbGUoQTw9eCl7eT1NYXRoLmZsb29yKChBK3gpLzIpO3ouaW5zZXJ0QmVmb3JlKHUscFt5XSk7ci5tb3ZlVG9FbGVtZW50VGV4dCh1KTt2PW4uY29tcGFyZUVuZFBvaW50cyhzPyJTdGFydFRvU3RhcnQiOiJFbmRUb0VuZCIscik7aWYodj4wKXtBPXkrMX1lbHNle2lmKHY8MCl7eD15LTF9ZWxzZXtmb3VuZD10cnVlO2JyZWFrfX19cT12PjB8fHk9PTA/dS5uZXh0U2libGluZzp1LnByZXZpb3VzU2libGluZztpZihxLm5vZGVUeXBlPT0xKXtkLnJlbW92ZSh1KTt0PWQubm9kZUluZGV4KHEpO3E9cS5wYXJlbnROb2RlO2lmKCFzfHx5PjApe3QrK319ZWxzZXtpZih2PjB8fHk9PTApe3Iuc2V0RW5kUG9pbnQocz8iU3RhcnRUb1N0YXJ0IjoiRW5kVG9FbmQiLG4pO3Q9ci50ZXh0Lmxlbmd0aH1lbHNle3Iuc2V0RW5kUG9pbnQocz8iU3RhcnRUb1N0YXJ0IjoiRW5kVG9FbmQiLG4pO3Q9cS5ub2RlVmFsdWUubGVuZ3RoLXIudGV4dC5sZW5ndGh9ZC5yZW1vdmUodSl9a1tzPyJzZXRTdGFydCI6InNldEVuZCJdKHEsdCl9bCh0cnVlKTtpZighbyl7bCgpfXJldHVybiBrfXRoaXMuYWRkUmFuZ2U9ZnVuY3Rpb24oayl7dmFyIHAsbixtLHIsdSxzLHQ9Zy5kb20uZG9jLG89dC5ib2R5O2Z1bmN0aW9uIGwoQil7dmFyIHgsQSx2LHoseTt2PWQuY3JlYXRlKCJhIik7eD1CP206dTtBPUI/cjpzO3o9cC5kdXBsaWNhdGUoKTtpZih4PT10KXt4PW87QT0wfWlmKHgubm9kZVR5cGU9PTMpe3gucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodix4KTt6Lm1vdmVUb0VsZW1lbnRUZXh0KHYpO3oubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLEEpO2QucmVtb3ZlKHYpO3Auc2V0RW5kUG9pbnQoQj8iU3RhcnRUb1N0YXJ0IjoiRW5kVG9FbmQiLHopfWVsc2V7eT14LmNoaWxkTm9kZXM7aWYoeS5sZW5ndGgpe2lmKEE+PXkubGVuZ3RoKXtkLmluc2VydEFmdGVyKHYseVt5Lmxlbmd0aC0xXSl9ZWxzZXt4Lmluc2VydEJlZm9yZSh2LHlbQV0pfXoubW92ZVRvRWxlbWVudFRleHQodil9ZWxzZXt2PXQuY3JlYXRlVGV4dE5vZGUoaik7eC5hcHBlbmRDaGlsZCh2KTt6Lm1vdmVUb0VsZW1lbnRUZXh0KHYucGFyZW50Tm9kZSk7ei5jb2xsYXBzZShjKX1wLnNldEVuZFBvaW50KEI/IlN0YXJ0VG9TdGFydCI6IkVuZFRvRW5kIix6KTtkLnJlbW92ZSh2KX19dGhpcy5kZXN0cm95KCk7bT1rLnN0YXJ0Q29udGFpbmVyO3I9ay5zdGFydE9mZnNldDt1PWsuZW5kQ29udGFpbmVyO3M9ay5lbmRPZmZzZXQ7cD1vLmNyZWF0ZVRleHRSYW5nZSgpO2lmKG09PXUmJm0ubm9kZVR5cGU9PTEmJnI9PXMtMSl7aWYocj09cy0xKXt0cnl7bj1vLmNyZWF0ZUNvbnRyb2xSYW5nZSgpO24uYWRkRWxlbWVudChtLmNoaWxkTm9kZXNbcl0pO24uc2VsZWN0KCk7bi5zY3JvbGxJbnRvVmlldygpO3JldHVybn1jYXRjaChxKXt9fX1sKHRydWUpO2woKTtwLnNlbGVjdCgpO3Auc2Nyb2xsSW50b1ZpZXcoKX07dGhpcy5nZXRSYW5nZUF0PWZ1bmN0aW9uKCl7aWYoIWV8fCF0aW55bWNlLmRvbS5SYW5nZVV0aWxzLmNvbXBhcmVSYW5nZXMoaCxnLmdldFJuZygpKSl7ZT1iKCk7aD1nLmdldFJuZygpfXRyeXtlLnN0YXJ0Q29udGFpbmVyLm5leHRTaWJsaW5nfWNhdGNoKGspe2U9YigpO2g9bnVsbH1yZXR1cm4gZX07dGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7aD1lPW51bGx9fXRpbnltY2UuZG9tLlRyaWRlbnRTZWxlY3Rpb249YX0pKCk7KGZ1bmN0aW9uKCl7dmFyIHA9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZyxqPTAsZD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLG89ZmFsc2UsaT10cnVlO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtpPWZhbHNlO3JldHVybiAwfSk7dmFyIGI9ZnVuY3Rpb24odixlLHosQSl7ej16fHxbXTtlPWV8fGRvY3VtZW50O3ZhciBDPWU7aWYoZS5ub2RlVHlwZSE9PTEmJmUubm9kZVR5cGUhPT05KXtyZXR1cm5bXX1pZighdnx8dHlwZW9mIHYhPT0ic3RyaW5nIil7cmV0dXJuIHp9dmFyIHg9W10scyxFLEgscix1PXRydWUsdD1iLmlzWE1MKGUpLEI9dixELEcsRix5O2Rve3AuZXhlYygiIik7cz1wLmV4ZWMoQik7aWYocyl7Qj1zWzNdO3gucHVzaChzWzFdKTtpZihzWzJdKXtyPXNbM107YnJlYWt9fX13aGlsZShzKTtpZih4Lmxlbmd0aD4xJiZrLmV4ZWModikpe2lmKHgubGVuZ3RoPT09MiYmZi5yZWxhdGl2ZVt4WzBdXSl7RT1oKHhbMF0reFsxXSxlKX1lbHNle0U9Zi5yZWxhdGl2ZVt4WzBdXT9bZV06Yih4LnNoaWZ0KCksZSk7d2hpbGUoeC5sZW5ndGgpe3Y9eC5zaGlmdCgpO2lmKGYucmVsYXRpdmVbdl0pe3YrPXguc2hpZnQoKX1FPWgodixFKX19fWVsc2V7aWYoIUEmJngubGVuZ3RoPjEmJmUubm9kZVR5cGU9PT05JiYhdCYmZi5tYXRjaC5JRC50ZXN0KHhbMF0pJiYhZi5tYXRjaC5JRC50ZXN0KHhbeC5sZW5ndGgtMV0pKXtEPWIuZmluZCh4LnNoaWZ0KCksZSx0KTtlPUQuZXhwcj9iLmZpbHRlcihELmV4cHIsRC5zZXQpWzBdOkQuc2V0WzBdfWlmKGUpe0Q9QT97ZXhwcjp4LnBvcCgpLHNldDphKEEpfTpiLmZpbmQoeC5wb3AoKSx4Lmxlbmd0aD09PTEmJih4WzBdPT09In4ifHx4WzBdPT09IisiKSYmZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZTplLHQpO0U9RC5leHByP2IuZmlsdGVyKEQuZXhwcixELnNldCk6RC5zZXQ7aWYoeC5sZW5ndGg+MCl7SD1hKEUpfWVsc2V7dT1mYWxzZX13aGlsZSh4Lmxlbmd0aCl7Rz14LnBvcCgpO0Y9RztpZighZi5yZWxhdGl2ZVtHXSl7Rz0iIn1lbHNle0Y9eC5wb3AoKX1pZihGPT1udWxsKXtGPWV9Zi5yZWxhdGl2ZVtHXShILEYsdCl9fWVsc2V7SD14PVtdfX1pZighSCl7SD1FfWlmKCFIKXtiLmVycm9yKEd8fHYpfWlmKGQuY2FsbChIKT09PSJbb2JqZWN0IEFycmF5XSIpe2lmKCF1KXt6LnB1c2guYXBwbHkoeixIKX1lbHNle2lmKGUmJmUubm9kZVR5cGU9PT0xKXtmb3IoeT0wO0hbeV0hPW51bGw7eSsrKXtpZihIW3ldJiYoSFt5XT09PXRydWV8fEhbeV0ubm9kZVR5cGU9PT0xJiZiLmNvbnRhaW5zKGUsSFt5XSkpKXt6LnB1c2goRVt5XSl9fX1lbHNle2Zvcih5PTA7SFt5XSE9bnVsbDt5Kyspe2lmKEhbeV0mJkhbeV0ubm9kZVR5cGU9PT0xKXt6LnB1c2goRVt5XSl9fX19fWVsc2V7YShILHopfWlmKHIpe2IocixDLHosQSk7Yi51bmlxdWVTb3J0KHopfXJldHVybiB6fTtiLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24ocil7aWYoYyl7bz1pO3Iuc29ydChjKTtpZihvKXtmb3IodmFyIGU9MTtlPHIubGVuZ3RoO2UrKyl7aWYocltlXT09PXJbZS0xXSl7ci5zcGxpY2UoZS0tLDEpfX19fXJldHVybiByfTtiLm1hdGNoZXM9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gYihlLG51bGwsbnVsbCxyKX07Yi5maW5kPWZ1bmN0aW9uKHksZSx6KXt2YXIgeDtpZigheSl7cmV0dXJuW119Zm9yKHZhciB0PTAscz1mLm9yZGVyLmxlbmd0aDt0PHM7dCsrKXt2YXIgdj1mLm9yZGVyW3RdLHU7aWYoKHU9Zi5sZWZ0TWF0Y2hbdl0uZXhlYyh5KSkpe3ZhciByPXVbMV07dS5zcGxpY2UoMSwxKTtpZihyLnN1YnN0cihyLmxlbmd0aC0xKSE9PSJcXCIpe3VbMV09KHVbMV18fCIiKS5yZXBsYWNlKC9cXC9nLCIiKTt4PWYuZmluZFt2XSh1LGUseik7aWYoeCE9bnVsbCl7eT15LnJlcGxhY2UoZi5tYXRjaFt2XSwiIik7YnJlYWt9fX19aWYoIXgpe3g9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpfXJldHVybntzZXQ6eCxleHByOnl9fTtiLmZpbHRlcj1mdW5jdGlvbihDLEIsRix1KXt2YXIgcz1DLEg9W10sej1CLHgsZSx5PUImJkJbMF0mJmIuaXNYTUwoQlswXSk7d2hpbGUoQyYmQi5sZW5ndGgpe2Zvcih2YXIgQSBpbiBmLmZpbHRlcil7aWYoKHg9Zi5sZWZ0TWF0Y2hbQV0uZXhlYyhDKSkhPW51bGwmJnhbMl0pe3ZhciByPWYuZmlsdGVyW0FdLEcsRSx0PXhbMV07ZT1mYWxzZTt4LnNwbGljZSgxLDEpO2lmKHQuc3Vic3RyKHQubGVuZ3RoLTEpPT09IlxcIil7Y29udGludWV9aWYoej09PUgpe0g9W119aWYoZi5wcmVGaWx0ZXJbQV0pe3g9Zi5wcmVGaWx0ZXJbQV0oeCx6LEYsSCx1LHkpO2lmKCF4KXtlPUc9dHJ1ZX1lbHNle2lmKHg9PT10cnVlKXtjb250aW51ZX19fWlmKHgpe2Zvcih2YXIgdj0wOyhFPXpbdl0pIT1udWxsO3YrKyl7aWYoRSl7Rz1yKEUseCx2LHopO3ZhciBEPXVeISFHO2lmKEYmJkchPW51bGwpe2lmKEQpe2U9dHJ1ZX1lbHNle3pbdl09ZmFsc2V9fWVsc2V7aWYoRCl7SC5wdXNoKEUpO2U9dHJ1ZX19fX19aWYoRyE9PXVuZGVmaW5lZCl7aWYoIUYpe3o9SH1DPUMucmVwbGFjZShmLm1hdGNoW0FdLCIiKTtpZighZSl7cmV0dXJuW119YnJlYWt9fX1pZihDPT09cyl7aWYoZT09bnVsbCl7Yi5lcnJvcihDKX1lbHNle2JyZWFrfX1zPUN9cmV0dXJuIHp9O2IuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3ciU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlfTt2YXIgZj1iLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLENMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooWyciXSopKC4qPylcM3wpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoKGV2ZW58b2RkfFtcZG4rXC1dKilcKSk/LyxQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJocmVmIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKHgscil7dmFyIHQ9dHlwZW9mIHI9PT0ic3RyaW5nIix2PXQmJiEvXFcvLnRlc3QocikseT10JiYhdjtpZih2KXtyPXIudG9Mb3dlckNhc2UoKX1mb3IodmFyIHM9MCxlPXgubGVuZ3RoLHU7czxlO3MrKyl7aWYoKHU9eFtzXSkpe3doaWxlKCh1PXUucHJldmlvdXNTaWJsaW5nKSYmdS5ub2RlVHlwZSE9PTEpe314W3NdPXl8fHUmJnUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI/dXx8ZmFsc2U6dT09PXJ9fWlmKHkpe2IuZmlsdGVyKHIseCx0cnVlKX19LCI+IjpmdW5jdGlvbih4LHIpe3ZhciB1PXR5cGVvZiByPT09InN0cmluZyIsdixzPTAsZT14Lmxlbmd0aDtpZih1JiYhL1xXLy50ZXN0KHIpKXtyPXIudG9Mb3dlckNhc2UoKTtmb3IoO3M8ZTtzKyspe3Y9eFtzXTtpZih2KXt2YXIgdD12LnBhcmVudE5vZGU7eFtzXT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yP3Q6ZmFsc2V9fX1lbHNle2Zvcig7czxlO3MrKyl7dj14W3NdO2lmKHYpe3hbc109dT92LnBhcmVudE5vZGU6di5wYXJlbnROb2RlPT09cn19aWYodSl7Yi5maWx0ZXIocix4LHRydWUpfX19LCIiOmZ1bmN0aW9uKHQscix2KXt2YXIgcz1qKyssZT1xLHU7aWYodHlwZW9mIHI9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChyKSl7cj1yLnRvTG93ZXJDYXNlKCk7dT1yO2U9bn1lKCJwYXJlbnROb2RlIixyLHMsdCx1LHYpfSwifiI6ZnVuY3Rpb24odCxyLHYpe3ZhciBzPWorKyxlPXEsdTtpZih0eXBlb2Ygcj09PSJzdHJpbmciJiYhL1xXLy50ZXN0KHIpKXtyPXIudG9Mb3dlckNhc2UoKTt1PXI7ZT1ufWUoInByZXZpb3VzU2libGluZyIscixzLHQsdSx2KX19LGZpbmQ6e0lEOmZ1bmN0aW9uKHIscyx0KXtpZih0eXBlb2Ygcy5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYhdCl7dmFyIGU9cy5nZXRFbGVtZW50QnlJZChyWzFdKTtyZXR1cm4gZT9bZV06W119fSxOQU1FOmZ1bmN0aW9uKHMsdil7aWYodHlwZW9mIHYuZ2V0RWxlbWVudHNCeU5hbWUhPT0idW5kZWZpbmVkIil7dmFyIHI9W10sdT12LmdldEVsZW1lbnRzQnlOYW1lKHNbMV0pO2Zvcih2YXIgdD0wLGU9dS5sZW5ndGg7dDxlO3QrKyl7aWYodVt0XS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PXNbMV0pe3IucHVzaCh1W3RdKX19cmV0dXJuIHIubGVuZ3RoPT09MD9udWxsOnJ9fSxUQUc6ZnVuY3Rpb24oZSxyKXtyZXR1cm4gci5nZXRFbGVtZW50c0J5VGFnTmFtZShlWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24odCxyLHMsZSx4LHkpe3Q9IiAiK3RbMV0ucmVwbGFjZSgvXFwvZywiIikrIiAiO2lmKHkpe3JldHVybiB0fWZvcih2YXIgdT0wLHY7KHY9clt1XSkhPW51bGw7dSsrKXtpZih2KXtpZih4Xih2LmNsYXNzTmFtZSYmKCIgIit2LmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoL1tcdFxuXS9nLCIgIikuaW5kZXhPZih0KT49MCkpe2lmKCFzKXtlLnB1c2godil9fWVsc2V7aWYocyl7clt1XT1mYWxzZX19fX1yZXR1cm4gZmFsc2V9LElEOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdLnJlcGxhY2UoL1xcL2csIiIpfSxUQUc6ZnVuY3Rpb24ocixlKXtyZXR1cm4gclsxXS50b0xvd2VyQ2FzZSgpfSxDSElMRDpmdW5jdGlvbihlKXtpZihlWzFdPT09Im50aCIpe3ZhciByPS8oLT8pKFxkKiluKCg/OlwrfC0pP1xkKikvLmV4ZWMoZVsyXT09PSJldmVuIiYmIjJuInx8ZVsyXT09PSJvZGQiJiYiMm4rMSJ8fCEvXEQvLnRlc3QoZVsyXSkmJiIwbisiK2VbMl18fGVbMl0pO2VbMl09KHJbMV0rKHJbMl18fDEpKS0wO2VbM109clszXS0wfWVbMF09aisrO3JldHVybiBlfSxBVFRSOmZ1bmN0aW9uKHUscixzLGUsdix4KXt2YXIgdD11WzFdLnJlcGxhY2UoL1xcL2csIiIpO2lmKCF4JiZmLmF0dHJNYXBbdF0pe3VbMV09Zi5hdHRyTWFwW3RdfWlmKHVbMl09PT0ifj0iKXt1WzRdPSIgIit1WzRdKyIgIn1yZXR1cm4gdX0sUFNFVURPOmZ1bmN0aW9uKHUscixzLGUsdil7aWYodVsxXT09PSJub3QiKXtpZigocC5leGVjKHVbM10pfHwiIikubGVuZ3RoPjF8fC9eXHcvLnRlc3QodVszXSkpe3VbM109Yih1WzNdLG51bGwsbnVsbCxyKX1lbHNle3ZhciB0PWIuZmlsdGVyKHVbM10scixzLHRydWVedik7aWYoIXMpe2UucHVzaC5hcHBseShlLHQpfXJldHVybiBmYWxzZX19ZWxzZXtpZihmLm1hdGNoLlBPUy50ZXN0KHVbMF0pfHxmLm1hdGNoLkNISUxELnRlc3QodVswXSkpe3JldHVybiB0cnVlfX1yZXR1cm4gdX0sUE9TOmZ1bmN0aW9uKGUpe2UudW5zaGlmdCh0cnVlKTtyZXR1cm4gZX19LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9PT1mYWxzZSYmZS50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09dHJ1ZX0sY2hlY2tlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGVja2VkPT09dHJ1ZX0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7cmV0dXJuIGUuc2VsZWN0ZWQ9PT10cnVlfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuICEhZS5maXJzdENoaWxkfSxlbXB0eTpmdW5jdGlvbihlKXtyZXR1cm4gIWUuZmlyc3RDaGlsZH0saGFzOmZ1bmN0aW9uKHMscixlKXtyZXR1cm4gISFiKGVbM10scykubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuKC9oXGQvaSkudGVzdChlLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihlKXtyZXR1cm4idGV4dCI9PT1lLnR5cGV9LHJhZGlvOmZ1bmN0aW9uKGUpe3JldHVybiJyYWRpbyI9PT1lLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGUpe3JldHVybiJjaGVja2JveCI9PT1lLnR5cGV9LGZpbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImZpbGUiPT09ZS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihlKXtyZXR1cm4icGFzc3dvcmQiPT09ZS50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oZSl7cmV0dXJuInN1Ym1pdCI9PT1lLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiJpbWFnZSI9PT1lLnR5cGV9LHJlc2V0OmZ1bmN0aW9uKGUpe3JldHVybiJyZXNldCI9PT1lLnR5cGV9LGJ1dHRvbjpmdW5jdGlvbihlKXtyZXR1cm4iYnV0dG9uIj09PWUudHlwZXx8ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybigvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pKS50ZXN0KGUubm9kZU5hbWUpfX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24ocixlKXtyZXR1cm4gZT09PTB9LGxhc3Q6ZnVuY3Rpb24ocyxyLGUsdCl7cmV0dXJuIHI9PT10Lmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKHIsZSl7cmV0dXJuIGUlMj09PTB9LG9kZDpmdW5jdGlvbihyLGUpe3JldHVybiBlJTI9PT0xfSxsdDpmdW5jdGlvbihzLHIsZSl7cmV0dXJuIHI8ZVszXS0wfSxndDpmdW5jdGlvbihzLHIsZSl7cmV0dXJuIHI+ZVszXS0wfSxudGg6ZnVuY3Rpb24ocyxyLGUpe3JldHVybiBlWzNdLTA9PT1yfSxlcTpmdW5jdGlvbihzLHIsZSl7cmV0dXJuIGVbM10tMD09PXJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihzLHkseCx6KXt2YXIgZT15WzFdLHI9Zi5maWx0ZXJzW2VdO2lmKHIpe3JldHVybiByKHMseCx5LHopfWVsc2V7aWYoZT09PSJjb250YWlucyIpe3JldHVybihzLnRleHRDb250ZW50fHxzLmlubmVyVGV4dHx8Yi5nZXRUZXh0KFtzXSl8fCIiKS5pbmRleE9mKHlbM10pPj0wfWVsc2V7aWYoZT09PSJub3QiKXt2YXIgdD15WzNdO2Zvcih2YXIgdj0wLHU9dC5sZW5ndGg7djx1O3YrKyl7aWYodFt2XT09PXMpe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9ZWxzZXtiLmVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfX19fSxDSElMRDpmdW5jdGlvbihlLHQpe3ZhciB4PXRbMV0scj1lO3N3aXRjaCh4KXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKChyPXIucHJldmlvdXNTaWJsaW5nKSl7aWYoci5ub2RlVHlwZT09PTEpe3JldHVybiBmYWxzZX19aWYoeD09PSJmaXJzdCIpe3JldHVybiB0cnVlfXI9ZTtjYXNlImxhc3QiOndoaWxlKChyPXIubmV4dFNpYmxpbmcpKXtpZihyLm5vZGVUeXBlPT09MSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZTtjYXNlIm50aCI6dmFyIHM9dFsyXSxBPXRbM107aWYocz09PTEmJkE9PT0wKXtyZXR1cm4gdHJ1ZX12YXIgdj10WzBdLHo9ZS5wYXJlbnROb2RlO2lmKHomJih6LnNpemNhY2hlIT09dnx8IWUubm9kZUluZGV4KSl7dmFyIHU9MDtmb3Iocj16LmZpcnN0Q2hpbGQ7cjtyPXIubmV4dFNpYmxpbmcpe2lmKHIubm9kZVR5cGU9PT0xKXtyLm5vZGVJbmRleD0rK3V9fXouc2l6Y2FjaGU9dn12YXIgeT1lLm5vZGVJbmRleC1BO2lmKHM9PT0wKXtyZXR1cm4geT09PTB9ZWxzZXtyZXR1cm4oeSVzPT09MCYmeS9zPj0wKX19fSxJRDpmdW5jdGlvbihyLGUpe3JldHVybiByLm5vZGVUeXBlPT09MSYmci5nZXRBdHRyaWJ1dGUoImlkIik9PT1lfSxUQUc6ZnVuY3Rpb24ocixlKXtyZXR1cm4oZT09PSIqIiYmci5ub2RlVHlwZT09PTEpfHxyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1lfSxDTEFTUzpmdW5jdGlvbihyLGUpe3JldHVybigiICIrKHIuY2xhc3NOYW1lfHxyLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkrIiAiKS5pbmRleE9mKGUpPi0xfSxBVFRSOmZ1bmN0aW9uKHYsdCl7dmFyIHM9dFsxXSxlPWYuYXR0ckhhbmRsZVtzXT9mLmF0dHJIYW5kbGVbc10odik6dltzXSE9bnVsbD92W3NdOnYuZ2V0QXR0cmlidXRlKHMpLHg9ZSsiIix1PXRbMl0scj10WzRdO3JldHVybiBlPT1udWxsP3U9PT0iIT0iOnU9PT0iPSI/eD09PXI6dT09PSIqPSI/eC5pbmRleE9mKHIpPj0wOnU9PT0ifj0iPygiICIreCsiICIpLmluZGV4T2Yocik+PTA6IXI/eCYmZSE9PWZhbHNlOnU9PT0iIT0iP3ghPT1yOnU9PT0iXj0iP3guaW5kZXhPZihyKT09PTA6dT09PSIkPSI/eC5zdWJzdHIoeC5sZW5ndGgtci5sZW5ndGgpPT09cjp1PT09Inw9Ij94PT09cnx8eC5zdWJzdHIoMCxyLmxlbmd0aCsxKT09PXIrIi0iOmZhbHNlfSxQT1M6ZnVuY3Rpb24odSxyLHMsdil7dmFyIGU9clsyXSx0PWYuc2V0RmlsdGVyc1tlXTtpZih0KXtyZXR1cm4gdCh1LHMscix2KX19fX07dmFyIGs9Zi5tYXRjaC5QT1MsZz1mdW5jdGlvbihyLGUpe3JldHVybiJcXCIrKGUtMCsxKX07Zm9yKHZhciBtIGluIGYubWF0Y2gpe2YubWF0Y2hbbV09bmV3IFJlZ0V4cChmLm1hdGNoW21dLnNvdXJjZSsoLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSk7Zi5sZWZ0TWF0Y2hbbV09bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK2YubWF0Y2hbbV0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxnKSl9dmFyIGE9ZnVuY3Rpb24ocixlKXtyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHIsMCk7aWYoZSl7ZS5wdXNoLmFwcGx5KGUscik7cmV0dXJuIGV9cmV0dXJuIHJ9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcywwKVswXS5ub2RlVHlwZX1jYXRjaChsKXthPWZ1bmN0aW9uKHUsdCl7dmFyIHI9dHx8W10scz0wO2lmKGQuY2FsbCh1KT09PSJbb2JqZWN0IEFycmF5XSIpe0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHIsdSl9ZWxzZXtpZih0eXBlb2YgdS5sZW5ndGg9PT0ibnVtYmVyIil7Zm9yKHZhciBlPXUubGVuZ3RoO3M8ZTtzKyspe3IucHVzaCh1W3NdKX19ZWxzZXtmb3IoO3Vbc107cysrKXtyLnB1c2godVtzXSl9fX1yZXR1cm4gcn19dmFyIGM7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXtjPWZ1bmN0aW9uKHIsZSl7aWYoIXIuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXtpZihyPT1lKXtvPXRydWV9cmV0dXJuIHIuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MX12YXIgcz1yLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpJjQ/LTE6cj09PWU/MDoxO2lmKHM9PT0wKXtvPXRydWV9cmV0dXJuIHN9fWVsc2V7aWYoInNvdXJjZUluZGV4IiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpe2M9ZnVuY3Rpb24ocixlKXtpZighci5zb3VyY2VJbmRleHx8IWUuc291cmNlSW5kZXgpe2lmKHI9PWUpe289dHJ1ZX1yZXR1cm4gci5zb3VyY2VJbmRleD8tMToxfXZhciBzPXIuc291cmNlSW5kZXgtZS5zb3VyY2VJbmRleDtpZihzPT09MCl7bz10cnVlfXJldHVybiBzfX1lbHNle2lmKGRvY3VtZW50LmNyZWF0ZVJhbmdlKXtjPWZ1bmN0aW9uKHQscil7aWYoIXQub3duZXJEb2N1bWVudHx8IXIub3duZXJEb2N1bWVudCl7aWYodD09cil7bz10cnVlfXJldHVybiB0Lm93bmVyRG9jdW1lbnQ/LTE6MX12YXIgcz10Lm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSxlPXIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpO3Muc2V0U3RhcnQodCwwKTtzLnNldEVuZCh0LDApO2Uuc2V0U3RhcnQociwwKTtlLnNldEVuZChyLDApO3ZhciB1PXMuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLlNUQVJUX1RPX0VORCxlKTtpZih1PT09MCl7bz10cnVlfXJldHVybiB1fX19fWIuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgcj0iIix0O2Zvcih2YXIgcz0wO2Vbc107cysrKXt0PWVbc107aWYodC5ub2RlVHlwZT09PTN8fHQubm9kZVR5cGU9PT00KXtyKz10Lm5vZGVWYWx1ZX1lbHNle2lmKHQubm9kZVR5cGUhPT04KXtyKz1iLmdldFRleHQodC5jaGlsZE5vZGVzKX19fXJldHVybiByfTsoZnVuY3Rpb24oKXt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxzPSJzY3JpcHQiKyhuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7ci5pbm5lckhUTUw9IjxhIG5hbWU9JyIrcysiJy8+Ijt2YXIgZT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZS5pbnNlcnRCZWZvcmUocixlLmZpcnN0Q2hpbGQpO2lmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHMpKXtmLmZpbmQuSUQ9ZnVuY3Rpb24odSx2LHgpe2lmKHR5cGVvZiB2LmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiF4KXt2YXIgdD12LmdldEVsZW1lbnRCeUlkKHVbMV0pO3JldHVybiB0P3QuaWQ9PT11WzFdfHx0eXBlb2YgdC5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJnQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWU9PT11WzFdP1t0XTp1bmRlZmluZWQ6W119fTtmLmZpbHRlci5JRD1mdW5jdGlvbih2LHQpe3ZhciB1PXR5cGVvZiB2LmdldEF0dHJpYnV0ZU5vZGUhPT0idW5kZWZpbmVkIiYmdi5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiB2Lm5vZGVUeXBlPT09MSYmdSYmdS5ub2RlVmFsdWU9PT10fX1lLnJlbW92ZUNoaWxkKHIpO2U9cj1udWxsfSkoKTsoZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpKTtpZihlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoPjApe2YuZmluZC5UQUc9ZnVuY3Rpb24ocix2KXt2YXIgdT12LmdldEVsZW1lbnRzQnlUYWdOYW1lKHJbMV0pO2lmKHJbMV09PT0iKiIpe3ZhciB0PVtdO2Zvcih2YXIgcz0wO3Vbc107cysrKXtpZih1W3NdLm5vZGVUeXBlPT09MSl7dC5wdXNoKHVbc10pfX11PXR9cmV0dXJuIHV9fWUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IjtpZihlLmZpcnN0Q2hpbGQmJnR5cGVvZiBlLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlIT09InVuZGVmaW5lZCImJmUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIil7Zi5hdHRySGFuZGxlLmhyZWY9ZnVuY3Rpb24ocil7cmV0dXJuIHIuZ2V0QXR0cmlidXRlKCJocmVmIiwyKX19ZT1udWxsfSkoKTtpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKXsoZnVuY3Rpb24oKXt2YXIgZT1iLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cy5pbm5lckhUTUw9IjxwIGNsYXNzPSdURVNUJz48L3A+IjtpZihzLnF1ZXJ5U2VsZWN0b3JBbGwmJnMucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGg9PT0wKXtyZXR1cm59Yj1mdW5jdGlvbih4LHYsdCx1KXt2PXZ8fGRvY3VtZW50O2lmKCF1JiZ2Lm5vZGVUeXBlPT09OSYmIWIuaXNYTUwodikpe3RyeXtyZXR1cm4gYSh2LnF1ZXJ5U2VsZWN0b3JBbGwoeCksdCl9Y2F0Y2goeSl7fX1yZXR1cm4gZSh4LHYsdCx1KX07Zm9yKHZhciByIGluIGUpe2Jbcl09ZVtyXX1zPW51bGx9KSgpfShmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7aWYoIWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZXx8ZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09MCl7cmV0dXJufWUubGFzdENoaWxkLmNsYXNzTmFtZT0iZSI7aWYoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09MSl7cmV0dXJufWYub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKTtmLmZpbmQuQ0xBU1M9ZnVuY3Rpb24ocixzLHQpe2lmKHR5cGVvZiBzLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPT0idW5kZWZpbmVkIiYmIXQpe3JldHVybiBzLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoclsxXSl9fTtlPW51bGx9KSgpO2Z1bmN0aW9uIG4ocix4LHYsQSx5LHope2Zvcih2YXIgdD0wLHM9QS5sZW5ndGg7dDxzO3QrKyl7dmFyIGU9QVt0XTtpZihlKXtlPWVbcl07dmFyIHU9ZmFsc2U7d2hpbGUoZSl7aWYoZS5zaXpjYWNoZT09PXYpe3U9QVtlLnNpenNldF07YnJlYWt9aWYoZS5ub2RlVHlwZT09PTEmJiF6KXtlLnNpemNhY2hlPXY7ZS5zaXpzZXQ9dH1pZihlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT14KXt1PWU7YnJlYWt9ZT1lW3JdfUFbdF09dX19fWZ1bmN0aW9uIHEocix4LHYsQSx5LHope2Zvcih2YXIgdD0wLHM9QS5sZW5ndGg7dDxzO3QrKyl7dmFyIGU9QVt0XTtpZihlKXtlPWVbcl07dmFyIHU9ZmFsc2U7d2hpbGUoZSl7aWYoZS5zaXpjYWNoZT09PXYpe3U9QVtlLnNpenNldF07YnJlYWt9aWYoZS5ub2RlVHlwZT09PTEpe2lmKCF6KXtlLnNpemNhY2hlPXY7ZS5zaXpzZXQ9dH1pZih0eXBlb2YgeCE9PSJzdHJpbmciKXtpZihlPT09eCl7dT10cnVlO2JyZWFrfX1lbHNle2lmKGIuZmlsdGVyKHgsW2VdKS5sZW5ndGg+MCl7dT1lO2JyZWFrfX19ZT1lW3JdfUFbdF09dX19fWIuY29udGFpbnM9ZG9jdW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24ocixlKXtyZXR1cm4gISEoci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKSYxNil9OmZ1bmN0aW9uKHIsZSl7cmV0dXJuIHIhPT1lJiYoci5jb250YWlucz9yLmNvbnRhaW5zKGUpOnRydWUpfTtiLmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciByPShlP2Uub3duZXJEb2N1bWVudHx8ZTowKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHI/ci5ub2RlTmFtZSE9PSJIVE1MIjpmYWxzZX07dmFyIGg9ZnVuY3Rpb24oZSx5KXt2YXIgdD1bXSx1PSIiLHYscz15Lm5vZGVUeXBlP1t5XTp5O3doaWxlKCh2PWYubWF0Y2guUFNFVURPLmV4ZWMoZSkpKXt1Kz12WzBdO2U9ZS5yZXBsYWNlKGYubWF0Y2guUFNFVURPLCIiKX1lPWYucmVsYXRpdmVbZV0/ZSsiKiI6ZTtmb3IodmFyIHg9MCxyPXMubGVuZ3RoO3g8cjt4Kyspe2IoZSxzW3hdLHQpfXJldHVybiBiLmZpbHRlcih1LHQpfTt3aW5kb3cudGlueW1jZS5kb20uU2l6emxlPWJ9KSgpOyhmdW5jdGlvbihkKXt2YXIgZj1kLmVhY2gsYz1kLkRPTSxiPWQuaXNJRSxlPWQuaXNXZWJLaXQsYTtkLmNyZWF0ZSgidGlueW1jZS5kb20uRXZlbnRVdGlscyIse0V2ZW50VXRpbHM6ZnVuY3Rpb24oKXt0aGlzLmluaXRzPVtdO3RoaXMuZXZlbnRzPVtdfSxhZGQ6ZnVuY3Rpb24obSxwLGwsail7dmFyIGcsaD10aGlzLGk9aC5ldmVudHMsaztpZihwIGluc3RhbmNlb2YgQXJyYXkpe2s9W107ZihwLGZ1bmN0aW9uKG8pe2sucHVzaChoLmFkZChtLG8sbCxqKSl9KTtyZXR1cm4ga31pZihtJiZtLmhhc093blByb3BlcnR5JiZtIGluc3RhbmNlb2YgQXJyYXkpe2s9W107ZihtLGZ1bmN0aW9uKG4pe249Yy5nZXQobik7ay5wdXNoKGguYWRkKG4scCxsLGopKX0pO3JldHVybiBrfW09Yy5nZXQobSk7aWYoIW0pe3JldHVybn1nPWZ1bmN0aW9uKG4pe2lmKGguZGlzYWJsZWQpe3JldHVybn1uPW58fHdpbmRvdy5ldmVudDtpZihuJiZiKXtpZighbi50YXJnZXQpe24udGFyZ2V0PW4uc3JjRWxlbWVudH1kLmV4dGVuZChuLGguX3N0b3BwZXJzKX1pZighail7cmV0dXJuIGwobil9cmV0dXJuIGwuY2FsbChqLG4pfTtpZihwPT0idW5sb2FkIil7ZC51bmxvYWRzLnVuc2hpZnQoe2Z1bmM6Z30pO3JldHVybiBnfWlmKHA9PSJpbml0Iil7aWYoaC5kb21Mb2FkZWQpe2coKX1lbHNle2guaW5pdHMucHVzaChnKX1yZXR1cm4gZ31pLnB1c2goe29iajptLG5hbWU6cCxmdW5jOmwsY2Z1bmM6ZyxzY29wZTpqfSk7aC5fYWRkKG0scCxnKTtyZXR1cm4gbH0scmVtb3ZlOmZ1bmN0aW9uKGwsbSxrKXt2YXIgaD10aGlzLGc9aC5ldmVudHMsaT1mYWxzZSxqO2lmKGwmJmwuaGFzT3duUHJvcGVydHkmJmwgaW5zdGFuY2VvZiBBcnJheSl7aj1bXTtmKGwsZnVuY3Rpb24obil7bj1jLmdldChuKTtqLnB1c2goaC5yZW1vdmUobixtLGspKX0pO3JldHVybiBqfWw9Yy5nZXQobCk7ZihnLGZ1bmN0aW9uKG8sbil7aWYoby5vYmo9PWwmJm8ubmFtZT09bSYmKCFrfHwoby5mdW5jPT1rfHxvLmNmdW5jPT1rKSkpe2cuc3BsaWNlKG4sMSk7aC5fcmVtb3ZlKGwsbSxvLmNmdW5jKTtpPXRydWU7cmV0dXJuIGZhbHNlfX0pO3JldHVybiBpfSxjbGVhcjpmdW5jdGlvbihsKXt2YXIgaj10aGlzLGc9ai5ldmVudHMsaCxrO2lmKGwpe2w9Yy5nZXQobCk7Zm9yKGg9Zy5sZW5ndGgtMTtoPj0wO2gtLSl7az1nW2hdO2lmKGsub2JqPT09bCl7ai5fcmVtb3ZlKGsub2JqLGsubmFtZSxrLmNmdW5jKTtrLm9iaj1rLmNmdW5jPW51bGw7Zy5zcGxpY2UoaCwxKX19fX0sY2FuY2VsOmZ1bmN0aW9uKGcpe2lmKCFnKXtyZXR1cm4gZmFsc2V9dGhpcy5zdG9wKGcpO3JldHVybiB0aGlzLnByZXZlbnQoZyl9LHN0b3A6ZnVuY3Rpb24oZyl7aWYoZy5zdG9wUHJvcGFnYXRpb24pe2cuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZXtnLmNhbmNlbEJ1YmJsZT10cnVlfXJldHVybiBmYWxzZX0scHJldmVudDpmdW5jdGlvbihnKXtpZihnLnByZXZlbnREZWZhdWx0KXtnLnByZXZlbnREZWZhdWx0KCl9ZWxzZXtnLnJldHVyblZhbHVlPWZhbHNlfXJldHVybiBmYWxzZX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBnPXRoaXM7ZihnLmV2ZW50cyxmdW5jdGlvbihqLGgpe2cuX3JlbW92ZShqLm9iaixqLm5hbWUsai5jZnVuYyk7ai5vYmo9ai5jZnVuYz1udWxsfSk7Zy5ldmVudHM9W107Zz1udWxsfSxfYWRkOmZ1bmN0aW9uKGgsaSxnKXtpZihoLmF0dGFjaEV2ZW50KXtoLmF0dGFjaEV2ZW50KCJvbiIraSxnKX1lbHNle2lmKGguYWRkRXZlbnRMaXN0ZW5lcil7aC5hZGRFdmVudExpc3RlbmVyKGksZyxmYWxzZSl9ZWxzZXtoWyJvbiIraV09Z319fSxfcmVtb3ZlOmZ1bmN0aW9uKGksaixoKXtpZihpKXt0cnl7aWYoaS5kZXRhY2hFdmVudCl7aS5kZXRhY2hFdmVudCgib24iK2osaCl9ZWxzZXtpZihpLnJlbW92ZUV2ZW50TGlzdGVuZXIpe2kucmVtb3ZlRXZlbnRMaXN0ZW5lcihqLGgsZmFsc2UpfWVsc2V7aVsib24iK2pdPW51bGx9fX1jYXRjaChnKXt9fX0sX3BhZ2VJbml0OmZ1bmN0aW9uKGgpe3ZhciBnPXRoaXM7aWYoZy5kb21Mb2FkZWQpe3JldHVybn1nLmRvbUxvYWRlZD10cnVlO2YoZy5pbml0cyxmdW5jdGlvbihpKXtpKCl9KTtnLmluaXRzPVtdfSxfd2FpdDpmdW5jdGlvbihpKXt2YXIgZz10aGlzLGg9aS5kb2N1bWVudDtpZihpLnRpbnlNQ0VfR1omJnRpbnlNQ0VfR1oubG9hZGVkKXtnLmRvbUxvYWRlZD0xO3JldHVybn1pZihoLmF0dGFjaEV2ZW50KXtoLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7aWYoaC5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIil7aC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixhcmd1bWVudHMuY2FsbGVlKTtnLl9wYWdlSW5pdChpKX19KTtpZihoLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmaT09aS50b3ApeyhmdW5jdGlvbigpe2lmKGcuZG9tTG9hZGVkKXtyZXR1cm59dHJ5e2guZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goail7c2V0VGltZW91dChhcmd1bWVudHMuY2FsbGVlLDApO3JldHVybn1nLl9wYWdlSW5pdChpKX0pKCl9fWVsc2V7aWYoaC5hZGRFdmVudExpc3RlbmVyKXtnLl9hZGQoaSwiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXtnLl9wYWdlSW5pdChpKX0pfX1nLl9hZGQoaSwibG9hZCIsZnVuY3Rpb24oKXtnLl9wYWdlSW5pdChpKX0pfSxfc3RvcHBlcnM6e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5yZXR1cm5WYWx1ZT1mYWxzZX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxCdWJibGU9dHJ1ZX19fSk7YT1kLmRvbS5FdmVudD1uZXcgZC5kb20uRXZlbnRVdGlscygpO2EuX3dhaXQod2luZG93KTtkLmFkZFVubG9hZChmdW5jdGlvbigpe2EuZGVzdHJveSgpfSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYSl7YS5kb20uRWxlbWVudD1mdW5jdGlvbihmLGQpe3ZhciBiPXRoaXMsZSxjO2Iuc2V0dGluZ3M9ZD1kfHx7fTtiLmlkPWY7Yi5kb209ZT1kLmRvbXx8YS5ET007aWYoIWEuaXNJRSl7Yz1lLmdldChiLmlkKX1hLmVhY2goKCJnZXRQb3MsZ2V0UmVjdCxnZXRQYXJlbnQsYWRkLHNldFN0eWxlLGdldFN0eWxlLHNldFN0eWxlcyxzZXRBdHRyaWIsc2V0QXR0cmlicyxnZXRBdHRyaWIsYWRkQ2xhc3MscmVtb3ZlQ2xhc3MsaGFzQ2xhc3MsZ2V0T3V0ZXJIVE1MLHNldE91dGVySFRNTCxyZW1vdmUsc2hvdyxoaWRlLGlzSGlkZGVuLHNldEhUTUwsZ2V0Iikuc3BsaXQoLywvKSxmdW5jdGlvbihnKXtiW2ddPWZ1bmN0aW9uKCl7dmFyIGg9W2ZdLGo7Zm9yKGo9MDtqPGFyZ3VtZW50cy5sZW5ndGg7aisrKXtoLnB1c2goYXJndW1lbnRzW2pdKX1oPWVbZ10uYXBwbHkoZSxoKTtiLnVwZGF0ZShnKTtyZXR1cm4gaH19KTthLmV4dGVuZChiLHtvbjpmdW5jdGlvbihpLGgsZyl7cmV0dXJuIGEuZG9tLkV2ZW50LmFkZChiLmlkLGksaCxnKX0sZ2V0WFk6ZnVuY3Rpb24oKXtyZXR1cm57eDpwYXJzZUludChiLmdldFN0eWxlKCJsZWZ0IikpLHk6cGFyc2VJbnQoYi5nZXRTdHlsZSgidG9wIikpfX0sZ2V0U2l6ZTpmdW5jdGlvbigpe3ZhciBnPWUuZ2V0KGIuaWQpO3JldHVybnt3OnBhcnNlSW50KGIuZ2V0U3R5bGUoIndpZHRoIil8fGcuY2xpZW50V2lkdGgpLGg6cGFyc2VJbnQoYi5nZXRTdHlsZSgiaGVpZ2h0Iil8fGcuY2xpZW50SGVpZ2h0KX19LG1vdmVUbzpmdW5jdGlvbihnLGgpe2Iuc2V0U3R5bGVzKHtsZWZ0OmcsdG9wOmh9KX0sbW92ZUJ5OmZ1bmN0aW9uKGcsaSl7dmFyIGg9Yi5nZXRYWSgpO2IubW92ZVRvKGgueCtnLGgueStpKX0scmVzaXplVG86ZnVuY3Rpb24oZyxpKXtiLnNldFN0eWxlcyh7d2lkdGg6ZyxoZWlnaHQ6aX0pfSxyZXNpemVCeTpmdW5jdGlvbihnLGope3ZhciBpPWIuZ2V0U2l6ZSgpO2IucmVzaXplVG8oaS53K2csaS5oK2opfSx1cGRhdGU6ZnVuY3Rpb24oaCl7dmFyIGc7aWYoYS5pc0lFNiYmZC5ibG9ja2VyKXtoPWh8fCIiO2lmKGguaW5kZXhPZigiZ2V0Iik9PT0wfHxoLmluZGV4T2YoImhhcyIpPT09MHx8aC5pbmRleE9mKCJpcyIpPT09MCl7cmV0dXJufWlmKGg9PSJyZW1vdmUiKXtlLnJlbW92ZShiLmJsb2NrZXIpO3JldHVybn1pZighYi5ibG9ja2VyKXtiLmJsb2NrZXI9ZS51bmlxdWVJZCgpO2c9ZS5hZGQoZC5jb250YWluZXJ8fGUuZ2V0Um9vdCgpLCJpZnJhbWUiLHtpZDpiLmJsb2NrZXIsc3R5bGU6InBvc2l0aW9uOmFic29sdXRlOyIsZnJhbWVCb3JkZXI6MCxzcmM6J2phdmFzY3JpcHQ6IiInfSk7ZS5zZXRTdHlsZShnLCJvcGFjaXR5IiwwKX1lbHNle2c9ZS5nZXQoYi5ibG9ja2VyKX1lLnNldFN0eWxlcyhnLHtsZWZ0OmIuZ2V0U3R5bGUoImxlZnQiLDEpLHRvcDpiLmdldFN0eWxlKCJ0b3AiLDEpLHdpZHRoOmIuZ2V0U3R5bGUoIndpZHRoIiwxKSxoZWlnaHQ6Yi5nZXRTdHlsZSgiaGVpZ2h0IiwxKSxkaXNwbGF5OmIuZ2V0U3R5bGUoImRpc3BsYXkiLDEpLHpJbmRleDpwYXJzZUludChiLmdldFN0eWxlKCJ6SW5kZXgiLDEpfHwwKS0xfSl9fX0pfX0pKHRpbnltY2UpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBlKGYpe3JldHVybiBmLnJlcGxhY2UoL1tcblxyXSsvZywiIil9dmFyIGI9Yy5pcyxhPWMuaXNJRSxkPWMuZWFjaDtjLmNyZWF0ZSgidGlueW1jZS5kb20uU2VsZWN0aW9uIix7U2VsZWN0aW9uOmZ1bmN0aW9uKGksaCxnKXt2YXIgZj10aGlzO2YuZG9tPWk7Zi53aW49aDtmLnNlcmlhbGl6ZXI9ZztkKFsib25CZWZvcmVTZXRDb250ZW50Iiwib25CZWZvcmVHZXRDb250ZW50Iiwib25TZXRDb250ZW50Iiwib25HZXRDb250ZW50Il0sZnVuY3Rpb24oail7ZltqXT1uZXcgYy51dGlsLkRpc3BhdGNoZXIoZil9KTtpZighZi53aW4uZ2V0U2VsZWN0aW9uKXtmLnRyaWRlbnRTZWw9bmV3IGMuZG9tLlRyaWRlbnRTZWxlY3Rpb24oZil9aWYoYy5pc0lFJiZpLmJveE1vZGVsKXt0aGlzLl9maXhJRVNlbGVjdGlvbigpfWMuYWRkVW5sb2FkKGYuZGVzdHJveSxmKX0sZ2V0Q29udGVudDpmdW5jdGlvbihnKXt2YXIgZj10aGlzLGg9Zi5nZXRSbmcoKSxsPWYuZG9tLmNyZWF0ZSgiYm9keSIpLGo9Zi5nZXRTZWwoKSxpLGssbTtnPWd8fHt9O2k9az0iIjtnLmdldD10cnVlO2cuZm9ybWF0PWcuZm9ybWF0fHwiaHRtbCI7Zi5vbkJlZm9yZUdldENvbnRlbnQuZGlzcGF0Y2goZixnKTtpZihnLmZvcm1hdD09InRleHQiKXtyZXR1cm4gZi5pc0NvbGxhcHNlZCgpPyIiOihoLnRleHR8fChqLnRvU3RyaW5nP2oudG9TdHJpbmcoKToiIikpfWlmKGguY2xvbmVDb250ZW50cyl7bT1oLmNsb25lQ29udGVudHMoKTtpZihtKXtsLmFwcGVuZENoaWxkKG0pfX1lbHNle2lmKGIoaC5pdGVtKXx8YihoLmh0bWxUZXh0KSl7bC5pbm5lckhUTUw9aC5pdGVtP2guaXRlbSgwKS5vdXRlckhUTUw6aC5odG1sVGV4dH1lbHNle2wuaW5uZXJIVE1MPWgudG9TdHJpbmcoKX19aWYoL15ccy8udGVzdChsLmlubmVySFRNTCkpe2k9IiAifWlmKC9ccyskLy50ZXN0KGwuaW5uZXJIVE1MKSl7az0iICJ9Zy5nZXRJbm5lcj10cnVlO2cuY29udGVudD1mLmlzQ29sbGFwc2VkKCk/IiI6aStmLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGwsZykraztmLm9uR2V0Q29udGVudC5kaXNwYXRjaChmLGcpO3JldHVybiBnLmNvbnRlbnR9LHNldENvbnRlbnQ6ZnVuY3Rpb24oaixpKXt2YXIgZz10aGlzLGs9Zy5nZXRSbmcoKSxuLGw9Zy53aW4uZG9jdW1lbnQ7aT1pfHx7Zm9ybWF0OiJodG1sIn07aS5zZXQ9dHJ1ZTtqPWkuY29udGVudD1nLmRvbS5wcm9jZXNzSFRNTChqKTtnLm9uQmVmb3JlU2V0Q29udGVudC5kaXNwYXRjaChnLGkpO2o9aS5jb250ZW50O2lmKGsuaW5zZXJ0Tm9kZSl7ais9JzxzcGFuIGlkPSJfX2NhcmV0Ij5fPC9zcGFuPic7aWYoay5zdGFydENvbnRhaW5lcj09bCYmay5lbmRDb250YWluZXI9PWwpe2wuYm9keS5pbm5lckhUTUw9an1lbHNle2suZGVsZXRlQ29udGVudHMoKTtpZihsLmJvZHkuY2hpbGROb2Rlcy5sZW5ndGg9PTApe2wuYm9keS5pbm5lckhUTUw9an1lbHNle2lmKGsuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KXtrLmluc2VydE5vZGUoay5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaikpfWVsc2V7dmFyIG09bC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZj1sLmNyZWF0ZUVsZW1lbnQoImRpdiIpO20uYXBwZW5kQ2hpbGQoZik7Zi5vdXRlckhUTUw9ajtrLmluc2VydE5vZGUobSl9fX1uPWcuZG9tLmdldCgiX19jYXJldCIpO2s9bC5jcmVhdGVSYW5nZSgpO2suc2V0U3RhcnRCZWZvcmUobik7ay5zZXRFbmRCZWZvcmUobik7Zy5zZXRSbmcoayk7Zy5kb20ucmVtb3ZlKCJfX2NhcmV0Iil9ZWxzZXtpZihrLml0ZW0pe2wuZXhlY0NvbW1hbmQoIkRlbGV0ZSIsZmFsc2UsbnVsbCk7az1nLmdldFJuZygpfWsucGFzdGVIVE1MKGopfWcub25TZXRDb250ZW50LmRpc3BhdGNoKGcsaSl9LGdldFN0YXJ0OmZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5nZXRSbmcoKSxoLGYsaixpO2lmKGcuZHVwbGljYXRlfHxnLml0ZW0pe2lmKGcuaXRlbSl7cmV0dXJuIGcuaXRlbSgwKX1qPWcuZHVwbGljYXRlKCk7ai5jb2xsYXBzZSgxKTtoPWoucGFyZW50RWxlbWVudCgpO2Y9aT1nLnBhcmVudEVsZW1lbnQoKTt3aGlsZShpPWkucGFyZW50Tm9kZSl7aWYoaT09aCl7aD1mO2JyZWFrfX1pZihoJiZoLm5vZGVOYW1lPT0iQk9EWSIpe3JldHVybiBoLmZpcnN0Q2hpbGR8fGh9cmV0dXJuIGh9ZWxzZXtoPWcuc3RhcnRDb250YWluZXI7aWYoaC5ub2RlVHlwZT09MSYmaC5oYXNDaGlsZE5vZGVzKCkpe2g9aC5jaGlsZE5vZGVzW01hdGgubWluKGguY2hpbGROb2Rlcy5sZW5ndGgtMSxnLnN0YXJ0T2Zmc2V0KV19aWYoaCYmaC5ub2RlVHlwZT09Myl7cmV0dXJuIGgucGFyZW50Tm9kZX1yZXR1cm4gaH19LGdldEVuZDpmdW5jdGlvbigpe3ZhciBnPXRoaXMsaD1nLmdldFJuZygpLGksZjtpZihoLmR1cGxpY2F0ZXx8aC5pdGVtKXtpZihoLml0ZW0pe3JldHVybiBoLml0ZW0oMCl9aD1oLmR1cGxpY2F0ZSgpO2guY29sbGFwc2UoMCk7aT1oLnBhcmVudEVsZW1lbnQoKTtpZihpJiZpLm5vZGVOYW1lPT0iQk9EWSIpe3JldHVybiBpLmxhc3RDaGlsZHx8aX1yZXR1cm4gaX1lbHNle2k9aC5lbmRDb250YWluZXI7Zj1oLmVuZE9mZnNldDtpZihpLm5vZGVUeXBlPT0xJiZpLmhhc0NoaWxkTm9kZXMoKSl7aT1pLmNoaWxkTm9kZXNbZj4wP2YtMTpmXX1pZihpJiZpLm5vZGVUeXBlPT0zKXtyZXR1cm4gaS5wYXJlbnROb2RlfXJldHVybiBpfX0sZ2V0Qm9va21hcms6ZnVuY3Rpb24ocSxyKXt2YXIgdT10aGlzLG09dS5kb20sZyxqLGksbixoLG8scCxsPSJcdUZFRkYiLHM7ZnVuY3Rpb24gZih2LHgpe3ZhciB0PTA7ZChtLnNlbGVjdCh2KSxmdW5jdGlvbih6LHkpe2lmKHo9PXgpe3Q9eX19KTtyZXR1cm4gdH1pZihxPT0yKXtmdW5jdGlvbiBrKCl7dmFyIHY9dS5nZXRSbmcodHJ1ZSksdD1tLmdldFJvb3QoKSx4PXt9O2Z1bmN0aW9uIHkoQixHKXt2YXIgQT1CW0c/InN0YXJ0Q29udGFpbmVyIjoiZW5kQ29udGFpbmVyIl0sRj1CW0c/InN0YXJ0T2Zmc2V0IjoiZW5kT2Zmc2V0Il0sej1bXSxDLEUsRD0wO2lmKEEubm9kZVR5cGU9PTMpe2lmKHIpe2ZvcihDPUEucHJldmlvdXNTaWJsaW5nO0MmJkMubm9kZVR5cGU9PTM7Qz1DLnByZXZpb3VzU2libGluZyl7Ris9Qy5ub2RlVmFsdWUubGVuZ3RofX16LnB1c2goRil9ZWxzZXtFPUEuY2hpbGROb2RlcztpZihGPj1FLmxlbmd0aCYmRS5sZW5ndGgpe0Q9MTtGPU1hdGgubWF4KDAsRS5sZW5ndGgtMSl9ei5wdXNoKHUuZG9tLm5vZGVJbmRleChFW0ZdLHIpK0QpfWZvcig7QSYmQSE9dDtBPUEucGFyZW50Tm9kZSl7ei5wdXNoKHUuZG9tLm5vZGVJbmRleChBLHIpKX1yZXR1cm4gen14LnN0YXJ0PXkodix0cnVlKTtpZighdS5pc0NvbGxhcHNlZCgpKXt4LmVuZD15KHYpfXJldHVybiB4fXJldHVybiBrKCl9aWYocSl7cmV0dXJue3JuZzp1LmdldFJuZygpfX1nPXUuZ2V0Um5nKCk7aT1tLnVuaXF1ZUlkKCk7bj10aW55TUNFLmFjdGl2ZUVkaXRvci5zZWxlY3Rpb24uaXNDb2xsYXBzZWQoKTtzPSJvdmVyZmxvdzpoaWRkZW47bGluZS1oZWlnaHQ6MHB4IjtpZihnLmR1cGxpY2F0ZXx8Zy5pdGVtKXtpZighZy5pdGVtKXtqPWcuZHVwbGljYXRlKCk7Zy5jb2xsYXBzZSgpO2cucGFzdGVIVE1MKCc8c3BhbiBfbWNlX3R5cGU9ImJvb2ttYXJrIiBpZD0iJytpKydfc3RhcnQiIHN0eWxlPSInK3MrJyI+JytsKyI8L3NwYW4+Iik7aWYoIW4pe2ouY29sbGFwc2UoZmFsc2UpO2oucGFzdGVIVE1MKCc8c3BhbiBfbWNlX3R5cGU9ImJvb2ttYXJrIiBpZD0iJytpKydfZW5kIiBzdHlsZT0iJytzKyciPicrbCsiPC9zcGFuPiIpfX1lbHNle289Zy5pdGVtKDApO2g9by5ub2RlTmFtZTtyZXR1cm57bmFtZTpoLGluZGV4OmYoaCxvKX19fWVsc2V7bz11LmdldE5vZGUoKTtoPW8ubm9kZU5hbWU7aWYoaD09IklNRyIpe3JldHVybntuYW1lOmgsaW5kZXg6ZihoLG8pfX1qPWcuY2xvbmVSYW5nZSgpO2lmKCFuKXtqLmNvbGxhcHNlKGZhbHNlKTtqLmluc2VydE5vZGUobS5jcmVhdGUoInNwYW4iLHtfbWNlX3R5cGU6ImJvb2ttYXJrIixpZDppKyJfZW5kIixzdHlsZTpzfSxsKSl9Zy5jb2xsYXBzZSh0cnVlKTtnLmluc2VydE5vZGUobS5jcmVhdGUoInNwYW4iLHtfbWNlX3R5cGU6ImJvb2ttYXJrIixpZDppKyJfc3RhcnQiLHN0eWxlOnN9LGwpKX11Lm1vdmVUb0Jvb2ttYXJrKHtpZDppLGtlZXA6MX0pO3JldHVybntpZDppfX0sbW92ZVRvQm9va21hcms6ZnVuY3Rpb24obil7dmFyIHI9dGhpcyxsPXIuZG9tLGksaCxmLHEsaixzLG8scDtpZihyLnRyaWRlbnRTZWwpe3IudHJpZGVudFNlbC5kZXN0cm95KCl9aWYobil7aWYobi5zdGFydCl7Zj1sLmNyZWF0ZVJuZygpO3E9bC5nZXRSb290KCk7ZnVuY3Rpb24gZyh6KXt2YXIgdD1uW3o/InN0YXJ0IjoiZW5kIl0sdix4LHksdTtpZih0KXtmb3IoeD1xLHY9dC5sZW5ndGgtMTt2Pj0xO3YtLSl7dT14LmNoaWxkTm9kZXM7aWYodS5sZW5ndGgpe3g9dVt0W3ZdXX19aWYoeil7Zi5zZXRTdGFydCh4LHRbMF0pfWVsc2V7Zi5zZXRFbmQoeCx0WzBdKX19fWcodHJ1ZSk7ZygpO3Iuc2V0Um5nKGYpfWVsc2V7aWYobi5pZCl7ZnVuY3Rpb24gayhBKXt2YXIgdT1sLmdldChuLmlkKyJfIitBKSx6LHQseCx5LHY9bi5rZWVwO2lmKHUpe3o9dS5wYXJlbnROb2RlO2lmKEE9PSJzdGFydCIpe2lmKCF2KXt0PWwubm9kZUluZGV4KHUpfWVsc2V7ej11LmZpcnN0Q2hpbGQ7dD0xfWo9cz16O289cD10fWVsc2V7aWYoIXYpe3Q9bC5ub2RlSW5kZXgodSl9ZWxzZXt6PXUuZmlyc3RDaGlsZDt0PTF9cz16O3A9dH1pZighdil7eT11LnByZXZpb3VzU2libGluZzt4PXUubmV4dFNpYmxpbmc7ZChjLmdyZXAodS5jaGlsZE5vZGVzKSxmdW5jdGlvbihCKXtpZihCLm5vZGVUeXBlPT0zKXtCLm5vZGVWYWx1ZT1CLm5vZGVWYWx1ZS5yZXBsYWNlKC9cdUZFRkYvZywiIil9fSk7d2hpbGUodT1sLmdldChuLmlkKyJfIitBKSl7bC5yZW1vdmUodSwxKX1pZih5JiZ4JiZ5Lm5vZGVUeXBlPT14Lm5vZGVUeXBlJiZ5Lm5vZGVUeXBlPT0zJiYhYy5pc09wZXJhKXt0PXkubm9kZVZhbHVlLmxlbmd0aDt5LmFwcGVuZERhdGEoeC5ub2RlVmFsdWUpO2wucmVtb3ZlKHgpO2lmKEE9PSJzdGFydCIpe2o9cz15O289cD10fWVsc2V7cz15O3A9dH19fX19ZnVuY3Rpb24gbSh0KXtpZighYSYmbC5pc0Jsb2NrKHQpJiYhdC5pbm5lckhUTUwpe3QuaW5uZXJIVE1MPSc8YnIgX21jZV9ib2d1cz0iMSIgLz4nfXJldHVybiB0fWsoInN0YXJ0Iik7aygiZW5kIik7aWYoail7Zj1sLmNyZWF0ZVJuZygpO2Yuc2V0U3RhcnQobShqKSxvKTtmLnNldEVuZChtKHMpLHApO3Iuc2V0Um5nKGYpfX1lbHNle2lmKG4ubmFtZSl7ci5zZWxlY3QobC5zZWxlY3Qobi5uYW1lKVtuLmluZGV4XSl9ZWxzZXtpZihuLnJuZyl7ci5zZXRSbmcobi5ybmcpfX19fX19LHNlbGVjdDpmdW5jdGlvbihrLGope3ZhciBpPXRoaXMsbD1pLmRvbSxnPWwuY3JlYXRlUm5nKCksZjtmPWwubm9kZUluZGV4KGspO2cuc2V0U3RhcnQoay5wYXJlbnROb2RlLGYpO2cuc2V0RW5kKGsucGFyZW50Tm9kZSxmKzEpO2lmKGope2Z1bmN0aW9uIGgobSxvKXt2YXIgbj1uZXcgYy5kb20uVHJlZVdhbGtlcihtLG0pO2Rve2lmKG0ubm9kZVR5cGU9PTMmJmMudHJpbShtLm5vZGVWYWx1ZSkubGVuZ3RoIT0wKXtpZihvKXtnLnNldFN0YXJ0KG0sMCl9ZWxzZXtnLnNldEVuZChtLG0ubm9kZVZhbHVlLmxlbmd0aCl9cmV0dXJufWlmKG0ubm9kZU5hbWU9PSJCUiIpe2lmKG8pe2cuc2V0U3RhcnRCZWZvcmUobSl9ZWxzZXtnLnNldEVuZEJlZm9yZShtKX1yZXR1cm59fXdoaWxlKG09KG8/bi5uZXh0KCk6bi5wcmV2KCkpKX1oKGssMSk7aChrKX1pLnNldFJuZyhnKTtyZXR1cm4ga30saXNDb2xsYXBzZWQ6ZnVuY3Rpb24oKXt2YXIgZj10aGlzLGg9Zi5nZXRSbmcoKSxnPWYuZ2V0U2VsKCk7aWYoIWh8fGguaXRlbSl7cmV0dXJuIGZhbHNlfWlmKGguY29tcGFyZUVuZFBvaW50cyl7cmV0dXJuIGguY29tcGFyZUVuZFBvaW50cygiU3RhcnRUb0VuZCIsaCk9PT0wfXJldHVybiAhZ3x8aC5jb2xsYXBzZWR9LGNvbGxhcHNlOmZ1bmN0aW9uKGYpe3ZhciBnPXRoaXMsaD1nLmdldFJuZygpLGk7aWYoaC5pdGVtKXtpPWguaXRlbSgwKTtoPXRoaXMud2luLmRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7aC5tb3ZlVG9FbGVtZW50VGV4dChpKX1oLmNvbGxhcHNlKCEhZik7Zy5zZXRSbmcoaCl9LGdldFNlbDpmdW5jdGlvbigpe3ZhciBnPXRoaXMsZj10aGlzLndpbjtyZXR1cm4gZi5nZXRTZWxlY3Rpb24/Zi5nZXRTZWxlY3Rpb24oKTpmLmRvY3VtZW50LnNlbGVjdGlvbn0sZ2V0Um5nOmZ1bmN0aW9uKGwpe3ZhciBnPXRoaXMsaCxpLGssaj1nLndpbi5kb2N1bWVudDtpZihsJiZnLnRyaWRlbnRTZWwpe3JldHVybiBnLnRyaWRlbnRTZWwuZ2V0UmFuZ2VBdCgwKX10cnl7aWYoaD1nLmdldFNlbCgpKXtpPWgucmFuZ2VDb3VudD4wP2guZ2V0UmFuZ2VBdCgwKTooaC5jcmVhdGVSYW5nZT9oLmNyZWF0ZVJhbmdlKCk6ai5jcmVhdGVSYW5nZSgpKX19Y2F0Y2goZil7fWlmKGMuaXNJRSYmaS5zZXRTdGFydCYmai5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5pdGVtKXtrPWouc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaXRlbSgwKTtpPWouY3JlYXRlUmFuZ2UoKTtpLnNldFN0YXJ0QmVmb3JlKGspO2kuc2V0RW5kQWZ0ZXIoayl9aWYoIWkpe2k9ai5jcmVhdGVSYW5nZT9qLmNyZWF0ZVJhbmdlKCk6ai5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpfWlmKGcuc2VsZWN0ZWRSYW5nZSYmZy5leHBsaWNpdFJhbmdlKXtpZihpLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhpLlNUQVJUX1RPX1NUQVJULGcuc2VsZWN0ZWRSYW5nZSk9PT0wJiZpLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhpLkVORF9UT19FTkQsZy5zZWxlY3RlZFJhbmdlKT09PTApe2k9Zy5leHBsaWNpdFJhbmdlfWVsc2V7Zy5zZWxlY3RlZFJhbmdlPW51bGw7Zy5leHBsaWNpdFJhbmdlPW51bGx9fXJldHVybiBpfSxzZXRSbmc6ZnVuY3Rpb24oaSl7dmFyIGgsZz10aGlzO2lmKCFnLnRyaWRlbnRTZWwpe2g9Zy5nZXRTZWwoKTtpZihoKXtnLmV4cGxpY2l0UmFuZ2U9aTtoLnJlbW92ZUFsbFJhbmdlcygpO2guYWRkUmFuZ2UoaSk7Zy5zZWxlY3RlZFJhbmdlPWguZ2V0UmFuZ2VBdCgwKX19ZWxzZXtpZihpLmNsb25lUmFuZ2Upe2cudHJpZGVudFNlbC5hZGRSYW5nZShpKTtyZXR1cm59dHJ5e2kuc2VsZWN0KCl9Y2F0Y2goZil7fX19LHNldE5vZGU6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcztmLnNldENvbnRlbnQoZi5kb20uZ2V0T3V0ZXJIVE1MKGcpKTtyZXR1cm4gZ30sZ2V0Tm9kZTpmdW5jdGlvbigpe3ZhciBnPXRoaXMsZj1nLmdldFJuZygpLGg9Zy5nZXRTZWwoKSxpO2lmKGYuc2V0U3RhcnQpe2lmKCFmKXtyZXR1cm4gZy5kb20uZ2V0Um9vdCgpfWk9Zi5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtpZighZi5jb2xsYXBzZWQpe2lmKGYuc3RhcnRDb250YWluZXI9PWYuZW5kQ29udGFpbmVyKXtpZihmLnN0YXJ0T2Zmc2V0LWYuZW5kT2Zmc2V0PDIpe2lmKGYuc3RhcnRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKXtpPWYuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tmLnN0YXJ0T2Zmc2V0XX19fWlmKGMuaXNXZWJLaXQmJmguYW5jaG9yTm9kZSYmaC5hbmNob3JOb2RlLm5vZGVUeXBlPT0xKXtyZXR1cm4gaC5hbmNob3JOb2RlLmNoaWxkTm9kZXNbaC5hbmNob3JPZmZzZXRdfX1pZihpJiZpLm5vZGVUeXBlPT0zKXtyZXR1cm4gaS5wYXJlbnROb2RlfXJldHVybiBpfXJldHVybiBmLml0ZW0/Zi5pdGVtKDApOmYucGFyZW50RWxlbWVudCgpfSxnZXRTZWxlY3RlZEJsb2NrczpmdW5jdGlvbihnLGYpe3ZhciBpPXRoaXMsaj1pLmRvbSxtLGgsbCxrPVtdO209ai5nZXRQYXJlbnQoZ3x8aS5nZXRTdGFydCgpLGouaXNCbG9jayk7aD1qLmdldFBhcmVudChmfHxpLmdldEVuZCgpLGouaXNCbG9jayk7aWYobSl7ay5wdXNoKG0pfWlmKG0mJmgmJm0hPWgpe2w9bTt3aGlsZSgobD1sLm5leHRTaWJsaW5nKSYmbCE9aCl7aWYoai5pc0Jsb2NrKGwpKXtrLnB1c2gobCl9fX1pZihoJiZtIT1oKXtrLnB1c2goaCl9cmV0dXJuIGt9LGRlc3Ryb3k6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcztmLndpbj1udWxsO2lmKGYudHJpZGVudFNlbCl7Zi50cmlkZW50U2VsLmRlc3Ryb3koKX1pZighZyl7Yy5yZW1vdmVVbmxvYWQoZi5kZXN0cm95KX19LF9maXhJRVNlbGVjdGlvbjpmdW5jdGlvbigpe3ZhciBtPXRoaXMuZG9tLGw9bS5kb2MsZz1sLmJvZHksaSxqO2wuZG9jdW1lbnRFbGVtZW50LnVuc2VsZWN0YWJsZT10cnVlO2Z1bmN0aW9uIGsobixxKXt2YXIgbz1nLmNyZWF0ZVRleHRSYW5nZSgpO3RyeXtvLm1vdmVUb1BvaW50KG4scSl9Y2F0Y2gocCl7bz1udWxsfXJldHVybiBvfWZ1bmN0aW9uIGgobyl7dmFyIG47aWYoby5idXR0b24pe249ayhvLngsby55KTtpZihuKXtpZihuLmNvbXBhcmVFbmRQb2ludHMoIlN0YXJ0VG9TdGFydCIsaik+MCl7bi5zZXRFbmRQb2ludCgiU3RhcnRUb1N0YXJ0IixqKX1lbHNle24uc2V0RW5kUG9pbnQoIkVuZFRvRW5kIixqKX1uLnNlbGVjdCgpfX1lbHNle2YoKX19ZnVuY3Rpb24gZigpe20udW5iaW5kKGwsIm1vdXNldXAiLGYpO20udW5iaW5kKGwsIm1vdXNlbW92ZSIsaCk7aT0wfW0uYmluZChsLCJtb3VzZWRvd24iLGZ1bmN0aW9uKG4pe2lmKG4udGFyZ2V0Lm5vZGVOYW1lPT09IkhUTUwiKXtpZihpKXtmKCl9aT0xO2o9ayhuLngsbi55KTtpZihqKXttLmJpbmQobCwibW91c2V1cCIsZik7bS5iaW5kKGwsIm1vdXNlbW92ZSIsaCk7bS53aW4uZm9jdXMoKTtqLnNlbGVjdCgpfX19KX19KX0pKHRpbnltY2UpOyhmdW5jdGlvbihhKXthLmNyZWF0ZSgidGlueW1jZS5kb20uWE1MV3JpdGVyIix7bm9kZTpudWxsLFhNTFdyaXRlcjpmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dmFyIGU9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb247aWYoIWV8fCFlLmNyZWF0ZURvY3VtZW50KXt0cnl7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNU1hNTDIuRE9NRG9jdW1lbnQiKX1jYXRjaChkKXt9dHJ5e3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhtbERvbSIpfWNhdGNoKGQpe319ZWxzZXtyZXR1cm4gZS5jcmVhdGVEb2N1bWVudCgiIiwiIixudWxsKX19dGhpcy5kb2M9YigpO3RoaXMudmFsaWQ9YS5pc09wZXJhfHxhLmlzV2ViS2l0O3RoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9Yi5kb2M7aWYoYy5maXJzdENoaWxkKXtjLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCl9Yi5ub2RlPWMuYXBwZW5kQ2hpbGQoYy5jcmVhdGVFbGVtZW50KCJodG1sIikpfSx3cml0ZVN0YXJ0RWxlbWVudDpmdW5jdGlvbihjKXt2YXIgYj10aGlzO2Iubm9kZT1iLm5vZGUuYXBwZW5kQ2hpbGQoYi5kb2MuY3JlYXRlRWxlbWVudChjKSl9LHdyaXRlQXR0cmlidXRlOmZ1bmN0aW9uKGMsYil7aWYodGhpcy52YWxpZCl7Yj1iLnJlcGxhY2UoLz4vZywiJU1DR1QlIil9dGhpcy5ub2RlLnNldEF0dHJpYnV0ZShjLGIpfSx3cml0ZUVuZEVsZW1lbnQ6ZnVuY3Rpb24oKXt0aGlzLm5vZGU9dGhpcy5ub2RlLnBhcmVudE5vZGV9LHdyaXRlRnVsbEVuZEVsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9Yi5ub2RlO2MuYXBwZW5kQ2hpbGQoYi5kb2MuY3JlYXRlVGV4dE5vZGUoIiIpKTtiLm5vZGU9Yy5wYXJlbnROb2RlfSx3cml0ZVRleHQ6ZnVuY3Rpb24oYil7aWYodGhpcy52YWxpZCl7Yj1iLnJlcGxhY2UoLz4vZywiJU1DR1QlIil9dGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZVRleHROb2RlKGIpKX0sd3JpdGVDREFUQTpmdW5jdGlvbihiKXt0aGlzLm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKGIpKX0sd3JpdGVDb21tZW50OmZ1bmN0aW9uKGIpe2lmKGEuaXNJRSl7Yj1iLnJlcGxhY2UoL15cLXxcLSQvZywiICIpfXRoaXMubm9kZS5hcHBlbmRDaGlsZCh0aGlzLmRvYy5jcmVhdGVDb21tZW50KGIucmVwbGFjZSgvXC1cLS9nLCIgIikpKX0sZ2V0Q29udGVudDpmdW5jdGlvbigpe3ZhciBiO2I9dGhpcy5kb2MueG1sfHxuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMuZG9jKTtiPWIucmVwbGFjZSgvPFw/W14/XStcPz58PGh0bWxbXj5dKj58PFwvaHRtbD58PGh0bWxcLz58PCFET0NUWVBFW14+XSs+L2csIiIpO2I9Yi5yZXBsYWNlKC8gP1wvPi9nLCIgLz4iKTtpZih0aGlzLnZhbGlkKXtiPWIucmVwbGFjZSgvXCVNQ0dUJS9nLCImZ3Q7Iil9cmV0dXJuIGJ9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYyl7dmFyIGQ9L1smXCI8Pl0vZyxiPS9bPD4mXS9nLGE9eyImIjoiJmFtcDsiLCciJzoiJnF1b3Q7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyJ9O2MuY3JlYXRlKCJ0aW55bWNlLmRvbS5TdHJpbmdXcml0ZXIiLHtzdHI6bnVsbCx0YWdzOm51bGwsY291bnQ6MCxzZXR0aW5nczpudWxsLGluZGVudDpudWxsLFN0cmluZ1dyaXRlcjpmdW5jdGlvbihlKXt0aGlzLnNldHRpbmdzPWMuZXh0ZW5kKHtpbmRlbnRfY2hhcjoiICIsaW5kZW50YXRpb246MH0sZSk7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3RoaXMuaW5kZW50PSIiO3RoaXMuc3RyPSIiO3RoaXMudGFncz1bXTt0aGlzLmNvdW50PTB9LHdyaXRlU3RhcnRFbGVtZW50OmZ1bmN0aW9uKGUpe3RoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgpO3RoaXMud3JpdGVSYXcoIjwiK2UpO3RoaXMudGFncy5wdXNoKGUpO3RoaXMuaW5BdHRyPXRydWU7dGhpcy5jb3VudCsrO3RoaXMuZWxlbWVudENvdW50PXRoaXMuY291bnQ7dGhpcy5hdHRycz17fX0sd3JpdGVBdHRyaWJ1dGU6ZnVuY3Rpb24oZyxlKXt2YXIgZj10aGlzO2lmKCFmLmF0dHJzW2ddKXtmLndyaXRlUmF3KCIgIitmLmVuY29kZShnLHRydWUpKyc9IicrZi5lbmNvZGUoZSx0cnVlKSsnIicpO2YuYXR0cnNbZ109ZX19LHdyaXRlRW5kRWxlbWVudDpmdW5jdGlvbigpe3ZhciBlO2lmKHRoaXMudGFncy5sZW5ndGg+MCl7ZT10aGlzLnRhZ3MucG9wKCk7aWYodGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKDEpKXt0aGlzLndyaXRlUmF3KCI8LyIrZSsiPiIpfWlmKHRoaXMuc2V0dGluZ3MuaW5kZW50YXRpb24+MCl7dGhpcy53cml0ZVJhdygiXG4iKX19fSx3cml0ZUZ1bGxFbmRFbGVtZW50OmZ1bmN0aW9uKCl7aWYodGhpcy50YWdzLmxlbmd0aD4wKXt0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTt0aGlzLndyaXRlUmF3KCI8LyIrdGhpcy50YWdzLnBvcCgpKyI+Iik7aWYodGhpcy5zZXR0aW5ncy5pbmRlbnRhdGlvbj4wKXt0aGlzLndyaXRlUmF3KCJcbiIpfX19LHdyaXRlVGV4dDpmdW5jdGlvbihlKXt0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTt0aGlzLndyaXRlUmF3KHRoaXMuZW5jb2RlKGUpKTt0aGlzLmNvdW50Kyt9LHdyaXRlQ0RBVEE6ZnVuY3Rpb24oZSl7dGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7dGhpcy53cml0ZVJhdygiPCFbQ0RBVEFbIitlKyJdXT4iKTt0aGlzLmNvdW50Kyt9LHdyaXRlQ29tbWVudDpmdW5jdGlvbihlKXt0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTt0aGlzLndyaXRlUmF3KCI8IS0tIitlKyItLT4iKTt0aGlzLmNvdW50Kyt9LHdyaXRlUmF3OmZ1bmN0aW9uKGUpe3RoaXMuc3RyKz1lfSxlbmNvZGU6ZnVuY3Rpb24oZixlKXtyZXR1cm4gZi5yZXBsYWNlKGU/ZDpiLGZ1bmN0aW9uKGcpe3JldHVybiBhW2ddfSl9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJ9LF93cml0ZUF0dHJpYnV0ZXNFbmQ6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuaW5BdHRyKXtyZXR1cm59dGhpcy5pbkF0dHI9ZmFsc2U7aWYoZSYmdGhpcy5lbGVtZW50Q291bnQ9PXRoaXMuY291bnQpe3RoaXMud3JpdGVSYXcoIiAvPiIpO3JldHVybiBmYWxzZX10aGlzLndyaXRlUmF3KCI+Iik7cmV0dXJuIHRydWV9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oZSl7dmFyIGc9ZS5leHRlbmQsZj1lLmVhY2gsYj1lLnV0aWwuRGlzcGF0Y2hlcixkPWUuaXNJRSxhPWUuaXNHZWNrbztmdW5jdGlvbiBjKGgpe3JldHVybiBoLnJlcGxhY2UoLyhbPysqXSkvZywiLiQxIil9ZS5jcmVhdGUoInRpbnltY2UuZG9tLlNlcmlhbGl6ZXIiLHtTZXJpYWxpemVyOmZ1bmN0aW9uKGope3ZhciBpPXRoaXM7aS5rZXk9MDtpLm9uUHJlUHJvY2Vzcz1uZXcgYihpKTtpLm9uUG9zdFByb2Nlc3M9bmV3IGIoaSk7dHJ5e2kud3JpdGVyPW5ldyBlLmRvbS5YTUxXcml0ZXIoKX1jYXRjaChoKXtpLndyaXRlcj1uZXcgZS5kb20uU3RyaW5nV3JpdGVyKCl9aWYoZS5pc0lFJiZkb2N1bWVudC5kb2N1bWVudE1vZGU+OCl7aS53cml0ZXI9bmV3IGUuZG9tLlN0cmluZ1dyaXRlcigpfWkuc2V0dGluZ3M9aj1nKHtkb206ZS5ET00sdmFsaWRfbm9kZXM6MCxub2RlX2ZpbHRlcjowLGF0dHJfZmlsdGVyOjAsaW52YWxpZF9hdHRyczovXihfbWNlX3xfbW96X3xzaXpzZXR8c2l6Y2FjaGUpLyxjbG9zZWQ6L14oYnJ8aHJ8aW5wdXR8bWV0YXxpbWd8bGlua3xwYXJhbXxhcmVhKSQvLGVudGl0eV9lbmNvZGluZzoibmFtZWQiLGVudGl0aWVzOiIxNjAsbmJzcCwxNjEsaWV4Y2wsMTYyLGNlbnQsMTYzLHBvdW5kLDE2NCxjdXJyZW4sMTY1LHllbiwxNjYsYnJ2YmFyLDE2NyxzZWN0LDE2OCx1bWwsMTY5LGNvcHksMTcwLG9yZGYsMTcxLGxhcXVvLDE3Mixub3QsMTczLHNoeSwxNzQscmVnLDE3NSxtYWNyLDE3NixkZWcsMTc3LHBsdXNtbiwxNzgsc3VwMiwxNzksc3VwMywxODAsYWN1dGUsMTgxLG1pY3JvLDE4MixwYXJhLDE4MyxtaWRkb3QsMTg0LGNlZGlsLDE4NSxzdXAxLDE4NixvcmRtLDE4NyxyYXF1bywxODgsZnJhYzE0LDE4OSxmcmFjMTIsMTkwLGZyYWMzNCwxOTEsaXF1ZXN0LDE5MixBZ3JhdmUsMTkzLEFhY3V0ZSwxOTQsQWNpcmMsMTk1LEF0aWxkZSwxOTYsQXVtbCwxOTcsQXJpbmcsMTk4LEFFbGlnLDE5OSxDY2VkaWwsMjAwLEVncmF2ZSwyMDEsRWFjdXRlLDIwMixFY2lyYywyMDMsRXVtbCwyMDQsSWdyYXZlLDIwNSxJYWN1dGUsMjA2LEljaXJjLDIwNyxJdW1sLDIwOCxFVEgsMjA5LE50aWxkZSwyMTAsT2dyYXZlLDIxMSxPYWN1dGUsMjEyLE9jaXJjLDIxMyxPdGlsZGUsMjE0LE91bWwsMjE1LHRpbWVzLDIxNixPc2xhc2gsMjE3LFVncmF2ZSwyMTgsVWFjdXRlLDIxOSxVY2lyYywyMjAsVXVtbCwyMjEsWWFjdXRlLDIyMixUSE9STiwyMjMsc3psaWcsMjI0LGFncmF2ZSwyMjUsYWFjdXRlLDIyNixhY2lyYywyMjcsYXRpbGRlLDIyOCxhdW1sLDIyOSxhcmluZywyMzAsYWVsaWcsMjMxLGNjZWRpbCwyMzIsZWdyYXZlLDIzMyxlYWN1dGUsMjM0LGVjaXJjLDIzNSxldW1sLDIzNixpZ3JhdmUsMjM3LGlhY3V0ZSwyMzgsaWNpcmMsMjM5LGl1bWwsMjQwLGV0aCwyNDEsbnRpbGRlLDI0MixvZ3JhdmUsMjQzLG9hY3V0ZSwyNDQsb2NpcmMsMjQ1LG90aWxkZSwyNDYsb3VtbCwyNDcsZGl2aWRlLDI0OCxvc2xhc2gsMjQ5LHVncmF2ZSwyNTAsdWFjdXRlLDI1MSx1Y2lyYywyNTIsdXVtbCwyNTMseWFjdXRlLDI1NCx0aG9ybiwyNTUseXVtbCw0MDIsZm5vZiw5MTMsQWxwaGEsOTE0LEJldGEsOTE1LEdhbW1hLDkxNixEZWx0YSw5MTcsRXBzaWxvbiw5MTgsWmV0YSw5MTksRXRhLDkyMCxUaGV0YSw5MjEsSW90YSw5MjIsS2FwcGEsOTIzLExhbWJkYSw5MjQsTXUsOTI1LE51LDkyNixYaSw5MjcsT21pY3Jvbiw5MjgsUGksOTI5LFJobyw5MzEsU2lnbWEsOTMyLFRhdSw5MzMsVXBzaWxvbiw5MzQsUGhpLDkzNSxDaGksOTM2LFBzaSw5MzcsT21lZ2EsOTQ1LGFscGhhLDk0NixiZXRhLDk0NyxnYW1tYSw5NDgsZGVsdGEsOTQ5LGVwc2lsb24sOTUwLHpldGEsOTUxLGV0YSw5NTIsdGhldGEsOTUzLGlvdGEsOTU0LGthcHBhLDk1NSxsYW1iZGEsOTU2LG11LDk1NyxudSw5NTgseGksOTU5LG9taWNyb24sOTYwLHBpLDk2MSxyaG8sOTYyLHNpZ21hZiw5NjMsc2lnbWEsOTY0LHRhdSw5NjUsdXBzaWxvbiw5NjYscGhpLDk2NyxjaGksOTY4LHBzaSw5Njksb21lZ2EsOTc3LHRoZXRhc3ltLDk3OCx1cHNpaCw5ODIscGl2LDgyMjYsYnVsbCw4MjMwLGhlbGxpcCw4MjQyLHByaW1lLDgyNDMsUHJpbWUsODI1NCxvbGluZSw4MjYwLGZyYXNsLDg0NzIsd2VpZXJwLDg0NjUsaW1hZ2UsODQ3NixyZWFsLDg0ODIsdHJhZGUsODUwMSxhbGVmc3ltLDg1OTIsbGFyciw4NTkzLHVhcnIsODU5NCxyYXJyLDg1OTUsZGFyciw4NTk2LGhhcnIsODYyOSxjcmFyciw4NjU2LGxBcnIsODY1Nyx1QXJyLDg2NTgsckFyciw4NjU5LGRBcnIsODY2MCxoQXJyLDg3MDQsZm9yYWxsLDg3MDYscGFydCw4NzA3LGV4aXN0LDg3MDksZW1wdHksODcxMSxuYWJsYSw4NzEyLGlzaW4sODcxMyxub3Rpbiw4NzE1LG5pLDg3MTkscHJvZCw4NzIxLHN1bSw4NzIyLG1pbnVzLDg3MjcsbG93YXN0LDg3MzAscmFkaWMsODczMyxwcm9wLDg3MzQsaW5maW4sODczNixhbmcsODc0MyxhbmQsODc0NCxvciw4NzQ1LGNhcCw4NzQ2LGN1cCw4NzQ3LGludCw4NzU2LHRoZXJlNCw4NzY0LHNpbSw4NzczLGNvbmcsODc3Nixhc3ltcCw4ODAwLG5lLDg4MDEsZXF1aXYsODgwNCxsZSw4ODA1LGdlLDg4MzQsc3ViLDg4MzUsc3VwLDg4MzYsbnN1Yiw4ODM4LHN1YmUsODgzOSxzdXBlLDg4NTMsb3BsdXMsODg1NSxvdGltZXMsODg2OSxwZXJwLDg5MDEsc2RvdCw4OTY4LGxjZWlsLDg5NjkscmNlaWwsODk3MCxsZmxvb3IsODk3MSxyZmxvb3IsOTAwMSxsYW5nLDkwMDIscmFuZyw5Njc0LGxveiw5ODI0LHNwYWRlcyw5ODI3LGNsdWJzLDk4MjksaGVhcnRzLDk4MzAsZGlhbXMsMzM4LE9FbGlnLDMzOSxvZWxpZywzNTIsU2Nhcm9uLDM1MyxzY2Fyb24sMzc2LFl1bWwsNzEwLGNpcmMsNzMyLHRpbGRlLDgxOTQsZW5zcCw4MTk1LGVtc3AsODIwMSx0aGluc3AsODIwNCx6d25qLDgyMDUsendqLDgyMDYsbHJtLDgyMDcscmxtLDgyMTEsbmRhc2gsODIxMixtZGFzaCw4MjE2LGxzcXVvLDgyMTcscnNxdW8sODIxOCxzYnF1byw4MjIwLGxkcXVvLDgyMjEscmRxdW8sODIyMixiZHF1byw4MjI0LGRhZ2dlciw4MjI1LERhZ2dlciw4MjQwLHBlcm1pbCw4MjQ5LGxzYXF1byw4MjUwLHJzYXF1byw4MzY0LGV1cm8iLHZhbGlkX2VsZW1lbnRzOiIqWypdIixleHRlbmRlZF92YWxpZF9lbGVtZW50czowLGludmFsaWRfZWxlbWVudHM6MCxmaXhfdGFibGVfZWxlbWVudHM6MSxmaXhfbGlzdF9lbGVtZW50czp0cnVlLGZpeF9jb250ZW50X2R1cGxpY2F0aW9uOnRydWUsY29udmVydF9mb250c190b19zcGFuczpmYWxzZSxmb250X3NpemVfY2xhc3NlczowLGFwcGx5X3NvdXJjZV9mb3JtYXR0aW5nOjAsaW5kZW50X21vZGU6InNpbXBsZSIsaW5kZW50X2NoYXI6Ilx0IixpbmRlbnRfbGV2ZWxzOjEscmVtb3ZlX2xpbmVicmVha3M6MSxyZW1vdmVfcmVkdW5kYW50X2JyczoxLGVsZW1lbnRfZm9ybWF0OiJ4aHRtbCJ9LGopO2kuZG9tPWouZG9tO2kuc2NoZW1hPWouc2NoZW1hO2lmKGouZW50aXR5X2VuY29kaW5nPT0ibmFtZWQiJiYhai5lbnRpdGllcyl7ai5lbnRpdHlfZW5jb2Rpbmc9InJhdyJ9aWYoai5yZW1vdmVfcmVkdW5kYW50X2Jycyl7aS5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihrLGwpe2wuY29udGVudD1sLmNvbnRlbnQucmVwbGFjZSgvKDxiciBcLz5ccyopKzxcLyhwfGhbMS02XXxkaXZ8bGkpPi9naSxmdW5jdGlvbihuLG0sbyl7aWYoL148YnIgXC8+XHMqPFwvLy50ZXN0KG4pKXtyZXR1cm4iPC8iK28rIj4ifXJldHVybiBufSl9KX1pZihqLmVsZW1lbnRfZm9ybWF0PT0iaHRtbCIpe2kub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24oayxsKXtsLmNvbnRlbnQ9bC5jb250ZW50LnJlcGxhY2UoLzwoW14+XSspIFwvPi9nLCI8JDE+Iil9KX1pZihqLmZpeF9saXN0X2VsZW1lbnRzKXtpLm9uUHJlUHJvY2Vzcy5hZGQoZnVuY3Rpb24odixzKXt2YXIgbCx6LHk9WyJvbCIsInVsIl0sdSx0LHEsaz0vXihPTHxVTCkkLyxBO2Z1bmN0aW9uIG0ocix4KXt2YXIgbz14LnNwbGl0KCIsIikscDt3aGlsZSgocj1yLnByZXZpb3VzU2libGluZykhPW51bGwpe2ZvcihwPTA7cDxvLmxlbmd0aDtwKyspe2lmKHIubm9kZU5hbWU9PW9bcF0pe3JldHVybiByfX19cmV0dXJuIG51bGx9Zm9yKHo9MDt6PHkubGVuZ3RoO3orKyl7bD1pLmRvbS5zZWxlY3QoeVt6XSxzLm5vZGUpO2Zvcih1PTA7dTxsLmxlbmd0aDt1Kyspe3Q9bFt1XTtxPXQucGFyZW50Tm9kZTtpZihrLnRlc3QocS5ub2RlTmFtZSkpe0E9bSh0LCJMSSIpO2lmKCFBKXtBPWkuZG9tLmNyZWF0ZSgibGkiKTtBLmlubmVySFRNTD0iJm5ic3A7IjtBLmFwcGVuZENoaWxkKHQpO3EuaW5zZXJ0QmVmb3JlKEEscS5maXJzdENoaWxkKX1lbHNle0EuYXBwZW5kQ2hpbGQodCl9fX19fSl9aWYoai5maXhfdGFibGVfZWxlbWVudHMpe2kub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihrLGwpe2YoaS5kb20uc2VsZWN0KCJwIHRhYmxlIixsLm5vZGUpLnJldmVyc2UoKSxmdW5jdGlvbihwKXt2YXIgbz1pLmRvbS5nZXRQYXJlbnQocC5wYXJlbnROb2RlLCJ0YWJsZSxwIik7aWYoby5ub2RlTmFtZSE9IlRBQkxFIil7dHJ5e2kuZG9tLnNwbGl0KG8scCl9Y2F0Y2gobSl7fX19KX0pfX0sc2V0RW50aXRpZXM6ZnVuY3Rpb24obyl7dmFyIG49dGhpcyxqLG0saD17fSxrO2lmKG4uZW50aXR5TG9va3VwKXtyZXR1cm59aj1vLnNwbGl0KCIsIik7Zm9yKG09MDttPGoubGVuZ3RoO20rPTIpe2s9alttXTtpZihrPT0zNHx8az09Mzh8fGs9PTYwfHxrPT02Mil7Y29udGludWV9aFtTdHJpbmcuZnJvbUNoYXJDb2RlKGpbbV0pXT1qW20rMV07az1wYXJzZUludChqW21dKS50b1N0cmluZygxNil9bi5lbnRpdHlMb29rdXA9aH0sc2V0UnVsZXM6ZnVuY3Rpb24oaSl7dmFyIGg9dGhpcztoLl9zZXR1cCgpO2gucnVsZXM9e307aC53aWxkUnVsZXM9W107aC52YWxpZEVsZW1lbnRzPXt9O3JldHVybiBoLmFkZFJ1bGVzKGkpfSxhZGRSdWxlczpmdW5jdGlvbihpKXt2YXIgaD10aGlzLGo7aWYoIWkpe3JldHVybn1oLl9zZXR1cCgpO2YoaS5zcGxpdCgiLCIpLGZ1bmN0aW9uKG0pe3ZhciBxPW0uc3BsaXQoL1xbfFxdLyksbD1xWzBdLnNwbGl0KCIvIikscixrLG8sbj1bXTtpZihqKXtrPWUuZXh0ZW5kKFtdLGouYXR0cmlicyl9aWYocS5sZW5ndGg+MSl7ZihxWzFdLnNwbGl0KCJ8IiksZnVuY3Rpb24odSl7dmFyIHA9e30sdDtrPWt8fFtdO3U9dS5yZXBsYWNlKC86Oi9nLCJ+Iik7dT0vXihbIVwtXSk/KFtcdyouP35fXC1dK3wpKFs9OjxdKT8oLispPyQvLmV4ZWModSk7dVsyXT11WzJdLnJlcGxhY2UoL34vZywiOiIpO2lmKHVbMV09PSIhIil7cj1yfHxbXTtyLnB1c2godVsyXSl9aWYodVsxXT09Ii0iKXtmb3IodD0wO3Q8ay5sZW5ndGg7dCsrKXtpZihrW3RdLm5hbWU9PXVbMl0pe2suc3BsaWNlKHQsMSk7cmV0dXJufX19c3dpdGNoKHVbM10pe2Nhc2UiPSI6cC5kZWZhdWx0VmFsPXVbNF18fCIiO2JyZWFrO2Nhc2UiOiI6cC5mb3JjZWRWYWw9dVs0XTticmVhaztjYXNlIjwiOnAudmFsaWRWYWxzPXVbNF0uc3BsaXQoIj8iKTticmVha31pZigvWyouP10vLnRlc3QodVsyXSkpe289b3x8W107cC5uYW1lUkU9bmV3IFJlZ0V4cCgiXiIrYyh1WzJdKSsiJCIpO28ucHVzaChwKX1lbHNle3AubmFtZT11WzJdO2sucHVzaChwKX1uLnB1c2godVsyXSl9KX1mKGwsZnVuY3Rpb24odix1KXt2YXIgeT12LmNoYXJBdCgwKSx0PTEscD17fTtpZihqKXtpZihqLm5vRW1wdHkpe3Aubm9FbXB0eT1qLm5vRW1wdHl9aWYoai5mdWxsRW5kKXtwLmZ1bGxFbmQ9ai5mdWxsRW5kfWlmKGoucGFkZCl7cC5wYWRkPWoucGFkZH19c3dpdGNoKHkpe2Nhc2UiLSI6cC5ub0VtcHR5PXRydWU7YnJlYWs7Y2FzZSIrIjpwLmZ1bGxFbmQ9dHJ1ZTticmVhaztjYXNlIiMiOnAucGFkZD10cnVlO2JyZWFrO2RlZmF1bHQ6dD0wfWxbdV09dj12LnN1YnN0cmluZyh0KTtoLnZhbGlkRWxlbWVudHNbdl09MTtpZigvWyouP10vLnRlc3QobFswXSkpe3AubmFtZVJFPW5ldyBSZWdFeHAoIl4iK2MobFswXSkrIiQiKTtoLndpbGRSdWxlcz1oLndpbGRSdWxlc3x8e307aC53aWxkUnVsZXMucHVzaChwKX1lbHNle3AubmFtZT1sWzBdO2lmKGxbMF09PSJAIil7aj1wfWgucnVsZXNbdl09cH1wLmF0dHJpYnM9aztpZihyKXtwLnJlcXVpcmVkQXR0cmlicz1yfWlmKG8pe3Y9IiI7ZihuLGZ1bmN0aW9uKHMpe2lmKHYpe3YrPSJ8In12Kz0iKCIrYyhzKSsiKSJ9KTtwLnZhbGlkQXR0cmlic1JFPW5ldyBSZWdFeHAoIl4iK3YudG9Mb3dlckNhc2UoKSsiJCIpO3Aud2lsZEF0dHJpYnM9b319KX0pO2k9IiI7ZihoLnZhbGlkRWxlbWVudHMsZnVuY3Rpb24obSxsKXtpZihpKXtpKz0ifCJ9aWYobCE9IkAiKXtpKz1sfX0pO2gudmFsaWRFbGVtZW50c1JFPW5ldyBSZWdFeHAoIl4oIitjKGkudG9Mb3dlckNhc2UoKSkrIikkIil9LGZpbmRSdWxlOmZ1bmN0aW9uKG0pe3ZhciBqPXRoaXMsbD1qLnJ1bGVzLGgsaztqLl9zZXR1cCgpO2s9bFttXTtpZihrKXtyZXR1cm4ga31sPWoud2lsZFJ1bGVzO2ZvcihoPTA7aDxsLmxlbmd0aDtoKyspe2lmKGxbaF0ubmFtZVJFLnRlc3QobSkpe3JldHVybiBsW2hdfX1yZXR1cm4gbnVsbH0sZmluZEF0dHJpYlJ1bGU6ZnVuY3Rpb24oaCxsKXt2YXIgaixrPWgud2lsZEF0dHJpYnM7Zm9yKGo9MDtqPGsubGVuZ3RoO2orKyl7aWYoa1tqXS5uYW1lUkUudGVzdChsKSl7cmV0dXJuIGtbal19fXJldHVybiBudWxsfSxzZXJpYWxpemU6ZnVuY3Rpb24ocixxKXt2YXIgbSxrPXRoaXMscCxpLGosbDtrLl9zZXR1cCgpO3E9cXx8e307cS5mb3JtYXQ9cS5mb3JtYXR8fCJodG1sIjtrLnByb2Nlc3NPYmo9cTtpZihkKXtsPVtdO2Yoci5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3B0aW9uIiksZnVuY3Rpb24obyl7dmFyIGg9ay5kb20uZ2V0QXR0cmliKG8sInNlbGVjdGVkIik7bC5wdXNoKGg/aDpudWxsKX0pfXI9ci5jbG9uZU5vZGUodHJ1ZSk7aWYoZCl7ZihyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcHRpb24iKSxmdW5jdGlvbihvLGgpe2suZG9tLnNldEF0dHJpYihvLCJzZWxlY3RlZCIsbFtoXSl9KX1qPXIub3duZXJEb2N1bWVudC5pbXBsZW1lbnRhdGlvbjtpZihqLmNyZWF0ZUhUTUxEb2N1bWVudCl7cD1qLmNyZWF0ZUhUTUxEb2N1bWVudCgiIik7ZihyLm5vZGVOYW1lPT0iQk9EWSI/ci5jaGlsZE5vZGVzOltyXSxmdW5jdGlvbihoKXtwLmJvZHkuYXBwZW5kQ2hpbGQocC5pbXBvcnROb2RlKGgsdHJ1ZSkpfSk7aWYoci5ub2RlTmFtZSE9IkJPRFkiKXtyPXAuYm9keS5maXJzdENoaWxkfWVsc2V7cj1wLmJvZHl9aT1rLmRvbS5kb2M7ay5kb20uZG9jPXB9ay5rZXk9IiIrKHBhcnNlSW50KGsua2V5KSsxKTtpZighcS5ub19ldmVudHMpe3Eubm9kZT1yO2sub25QcmVQcm9jZXNzLmRpc3BhdGNoKGsscSl9ay53cml0ZXIucmVzZXQoKTtrLl9pbmZvPXE7ay5fc2VyaWFsaXplTm9kZShyLHEuZ2V0SW5uZXIpO3EuY29udGVudD1rLndyaXRlci5nZXRDb250ZW50KCk7aWYoaSl7ay5kb20uZG9jPWl9aWYoIXEubm9fZXZlbnRzKXtrLm9uUG9zdFByb2Nlc3MuZGlzcGF0Y2goayxxKX1rLl9wb3N0UHJvY2VzcyhxKTtxLm5vZGU9bnVsbDtyZXR1cm4gZS50cmltKHEuY29udGVudCl9LF9wb3N0UHJvY2VzczpmdW5jdGlvbihuKXt2YXIgaT10aGlzLGs9aS5zZXR0aW5ncyxqPW4uY29udGVudCxtPVtdLGw7aWYobi5mb3JtYXQ9PSJodG1sIil7bD1pLl9wcm90ZWN0KHtjb250ZW50OmoscGF0dGVybnM6W3twYXR0ZXJuOi8oPHNjcmlwdFtePl0qPikoLio/KSg8XC9zY3JpcHQ+KS9nfSx7cGF0dGVybjovKDxub3NjcmlwdFtePl0qPikoLio/KSg8XC9ub3NjcmlwdD4pL2d9LHtwYXR0ZXJuOi8oPHN0eWxlW14+XSo+KSguKj8pKDxcL3N0eWxlPikvZ30se3BhdHRlcm46Lyg8cHJlW14+XSo+KSguKj8pKDxcL3ByZT4pL2csZW5jb2RlOjF9LHtwYXR0ZXJuOi8oPCEtLVxbQ0RBVEFcWykoLio/KShcXVxdLS0+KS9nfV19KTtqPWwuY29udGVudDtpZihrLmVudGl0eV9lbmNvZGluZyE9PSJyYXciKXtqPWkuX2VuY29kZShqKX1pZighbi5zZXQpe2o9ZS5fcmVwbGFjZSgvPHA+XHMrPFwvcD58PHAoW14+XSspPlxzKzxcL3A+L2csay5lbnRpdHlfZW5jb2Rpbmc9PSJudW1lcmljIj8iPHAkMT4mIzE2MDs8L3A+IjoiPHAkMT4mbmJzcDs8L3A+IixqKTtpZihrLnJlbW92ZV9saW5lYnJlYWtzKXtqPWoucmVwbGFjZSgvXHI/XG58XHIvZywiICIpO2o9ZS5fcmVwbGFjZSgvKDxbXj5dKz4pXHMrL2csIiQxICIsaik7aj1lLl9yZXBsYWNlKC9ccysoPFwvW14+XSs+KS9nLCIgJDEiLGopO2o9ZS5fcmVwbGFjZSgvPChwfGhbMS02XXxibG9ja3F1b3RlfGhyfGRpdnx0YWJsZXx0Ym9keXx0cnx0ZHxib2R5fGhlYWR8aHRtbHx0aXRsZXxtZXRhfHN0eWxlfHByZXxzY3JpcHR8bGlua3xvYmplY3QpIChbXj5dKyk+XHMrL2csIjwkMSAkMj4iLGopO2o9ZS5fcmVwbGFjZSgvPChwfGhbMS02XXxibG9ja3F1b3RlfGhyfGRpdnx0YWJsZXx0Ym9keXx0cnx0ZHxib2R5fGhlYWR8aHRtbHx0aXRsZXxtZXRhfHN0eWxlfHByZXxzY3JpcHR8bGlua3xvYmplY3QpPlxzKy9nLCI8JDE+IixqKTtqPWUuX3JlcGxhY2UoL1xzKzxcLyhwfGhbMS02XXxibG9ja3F1b3RlfGhyfGRpdnx0YWJsZXx0Ym9keXx0cnx0ZHxib2R5fGhlYWR8aHRtbHx0aXRsZXxtZXRhfHN0eWxlfHByZXxzY3JpcHR8bGlua3xvYmplY3QpPi9nLCI8LyQxPiIsail9aWYoay5hcHBseV9zb3VyY2VfZm9ybWF0dGluZyYmay5pbmRlbnRfbW9kZT09InNpbXBsZSIpe2o9ZS5fcmVwbGFjZSgvPChcLz8pKHVsfGhyfHRhYmxlfG1ldGF8bGlua3x0Ym9keXx0cnxvYmplY3R8Ym9keXxoZWFkfGh0bWx8bWFwKSh8W14+XSspPlxzKi9nLCJcbjwkMSQyJDM+XG4iLGopO2o9ZS5fcmVwbGFjZSgvXHMqPChwfGhbMS02XXxibG9ja3F1b3RlfGRpdnx0aXRsZXxzdHlsZXxwcmV8c2NyaXB0fHRkfGxpfGFyZWEpKHxbXj5dKyk+L2csIlxuPCQxJDI+IixqKTtqPWUuX3JlcGxhY2UoLzxcLyhwfGhbMS02XXxibG9ja3F1b3RlfGRpdnx0aXRsZXxzdHlsZXxwcmV8c2NyaXB0fHRkfGxpKT5ccyovZywiPC8kMT5cbiIsaik7aj1qLnJlcGxhY2UoL1xuXG4vZywiXG4iKX19aj1pLl91bnByb3RlY3QoaixsKTtqPWUuX3JlcGxhY2UoLzwhLS1cW0NEQVRBXFsoW1xzXFNdKylcXVxdLS0+L2csIjwhW0NEQVRBWyQxXV0+IixqKTtpZihrLmVudGl0eV9lbmNvZGluZz09InJhdyIpe2o9ZS5fcmVwbGFjZSgvPHA+Jm5ic3A7PFwvcD58PHAoW14+XSspPiZuYnNwOzxcL3A+L2csIjxwJDE+XHUwMGEwPC9wPiIsail9aj1qLnJlcGxhY2UoLzxub3NjcmlwdChbXj5dK3wpPihbXHNcU10qPyk8XC9ub3NjcmlwdD4vZyxmdW5jdGlvbihoLHAsbyl7cmV0dXJuIjxub3NjcmlwdCIrcCsiPiIraS5kb20uZGVjb2RlKG8ucmVwbGFjZSgvPCEtLXwtLT4vZywiIikpKyI8L25vc2NyaXB0PiJ9KX1uLmNvbnRlbnQ9an0sX3NlcmlhbGl6ZU5vZGU6ZnVuY3Rpb24oRSxKKXt2YXIgQT10aGlzLEI9QS5zZXR0aW5ncyx5PUEud3JpdGVyLHEsaix1LEcsRixJLEMsaCx6LGsscixELHAsbSxILG8seDtpZighQi5ub2RlX2ZpbHRlcnx8Qi5ub2RlX2ZpbHRlcihFKSl7c3dpdGNoKEUubm9kZVR5cGUpe2Nhc2UgMTppZihFLmhhc0F0dHJpYnV0ZT9FLmhhc0F0dHJpYnV0ZSgiX21jZV9ib2d1cyIpOkUuZ2V0QXR0cmlidXRlKCJfbWNlX2JvZ3VzIikpe3JldHVybn1wPUg9ZmFsc2U7cT1FLmhhc0NoaWxkTm9kZXMoKTtrPUUuZ2V0QXR0cmlidXRlKCJfbWNlX25hbWUiKXx8RS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO289RS5nZXRBdHRyaWJ1dGUoIl9tY2VfdHlwZSIpO2lmKG8pe2lmKCFBLl9pbmZvLmNsZWFudXApe3A9dHJ1ZTtyZXR1cm59ZWxzZXtIPTF9fWlmKGQpe3g9RS5zY29wZU5hbWU7aWYoeCYmeCE9PSJIVE1MIiYmeCE9PSJodG1sIil7az14KyI6IitrfX1pZihrLmluZGV4T2YoIm1jZToiKT09PTApe2s9ay5zdWJzdHJpbmcoNCl9aWYoIUgpe2lmKCFBLnZhbGlkRWxlbWVudHNSRXx8IUEudmFsaWRFbGVtZW50c1JFLnRlc3Qoayl8fChBLmludmFsaWRFbGVtZW50c1JFJiZBLmludmFsaWRFbGVtZW50c1JFLnRlc3QoaykpfHxKKXtwPXRydWU7YnJlYWt9fWlmKGQpe2lmKEIuZml4X2NvbnRlbnRfZHVwbGljYXRpb24pe2lmKEUuX21jZV9zZXJpYWxpemVkPT1BLmtleSl7cmV0dXJufUUuX21jZV9zZXJpYWxpemVkPUEua2V5fWlmKGsuY2hhckF0KDApPT0iLyIpe2s9ay5zdWJzdHJpbmcoMSl9fWVsc2V7aWYoYSl7aWYoRS5ub2RlTmFtZT09PSJCUiImJkUuZ2V0QXR0cmlidXRlKCJ0eXBlIik9PSJfbW96Iil7cmV0dXJufX19aWYoQi52YWxpZGF0ZV9jaGlsZHJlbil7aWYoQS5lbGVtZW50TmFtZSYmIUEuc2NoZW1hLmlzVmFsaWQoQS5lbGVtZW50TmFtZSxrKSl7cD10cnVlO2JyZWFrfUEuZWxlbWVudE5hbWU9a31yPUEuZmluZFJ1bGUoayk7aWYoIXIpe3A9dHJ1ZTticmVha31rPXIubmFtZXx8azttPUIuY2xvc2VkLnRlc3Qoayk7aWYoKCFxJiZyLm5vRW1wdHkpfHwoZCYmIWspKXtwPXRydWU7YnJlYWt9aWYoci5yZXF1aXJlZEF0dHJpYnMpe0k9ci5yZXF1aXJlZEF0dHJpYnM7Zm9yKEc9SS5sZW5ndGgtMTtHPj0wO0ctLSl7aWYodGhpcy5kb20uZ2V0QXR0cmliKEUsSVtHXSkhPT0iIil7YnJlYWt9fWlmKEc9PS0xKXtwPXRydWU7YnJlYWt9fXkud3JpdGVTdGFydEVsZW1lbnQoayk7aWYoci5hdHRyaWJzKXtmb3IoRz0wLEM9ci5hdHRyaWJzLEY9Qy5sZW5ndGg7RzxGO0crKyl7ST1DW0ddO3o9QS5fZ2V0QXR0cmliKEUsSSk7aWYoeiE9PW51bGwpe3kud3JpdGVBdHRyaWJ1dGUoSS5uYW1lLHopfX19aWYoci52YWxpZEF0dHJpYnNSRSl7Qz1BLmRvbS5nZXRBdHRyaWJzKEUpO2ZvcihHPUMubGVuZ3RoLTE7Rz4tMTtHLS0pe2g9Q1tHXTtpZihoLnNwZWNpZmllZCl7ST1oLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoQi5pbnZhbGlkX2F0dHJzLnRlc3QoSSl8fCFyLnZhbGlkQXR0cmlic1JFLnRlc3QoSSkpe2NvbnRpbnVlfUQ9QS5maW5kQXR0cmliUnVsZShyLEkpO3o9QS5fZ2V0QXR0cmliKEUsRCxJKTtpZih6IT09bnVsbCl7eS53cml0ZUF0dHJpYnV0ZShJLHopfX19fWlmKG8mJkgpe3kud3JpdGVBdHRyaWJ1dGUoIl9tY2VfdHlwZSIsbyl9aWYoaz09PSJzY3JpcHQiJiZlLnRyaW0oRS5pbm5lckhUTUwpKXt5LndyaXRlVGV4dCgiLy8gIik7eS53cml0ZUNEQVRBKEUuaW5uZXJIVE1MLnJlcGxhY2UoLzwhLS18LS0+fDxcW0NEQVRBXFt8XF1cXT4vZywiIikpO3E9ZmFsc2U7YnJlYWt9aWYoci5wYWRkKXtpZihxJiYodT1FLmZpcnN0Q2hpbGQpJiZ1Lm5vZGVUeXBlPT09MSYmRS5jaGlsZE5vZGVzLmxlbmd0aD09PTEpe2lmKHUuaGFzQXR0cmlidXRlP3UuaGFzQXR0cmlidXRlKCJfbWNlX2JvZ3VzIik6dS5nZXRBdHRyaWJ1dGUoIl9tY2VfYm9ndXMiKSl7eS53cml0ZVRleHQoIlx1MDBhMCIpfX1lbHNle2lmKCFxKXt5LndyaXRlVGV4dCgiXHUwMGEwIil9fX1icmVhaztjYXNlIDM6aWYoQi52YWxpZGF0ZV9jaGlsZHJlbiYmQS5lbGVtZW50TmFtZSYmIUEuc2NoZW1hLmlzVmFsaWQoQS5lbGVtZW50TmFtZSwiI3RleHQiKSl7cmV0dXJufXJldHVybiB5LndyaXRlVGV4dChFLm5vZGVWYWx1ZSk7Y2FzZSA0OnJldHVybiB5LndyaXRlQ0RBVEEoRS5ub2RlVmFsdWUpO2Nhc2UgODpyZXR1cm4geS53cml0ZUNvbW1lbnQoRS5ub2RlVmFsdWUpfX1lbHNle2lmKEUubm9kZVR5cGU9PTEpe3E9RS5oYXNDaGlsZE5vZGVzKCl9fWlmKHEmJiFtKXt1PUUuZmlyc3RDaGlsZDt3aGlsZSh1KXtBLl9zZXJpYWxpemVOb2RlKHUpO0EuZWxlbWVudE5hbWU9azt1PXUubmV4dFNpYmxpbmd9fWlmKCFwKXtpZighbSl7eS53cml0ZUZ1bGxFbmRFbGVtZW50KCl9ZWxzZXt5LndyaXRlRW5kRWxlbWVudCgpfX19LF9wcm90ZWN0OmZ1bmN0aW9uKGope3ZhciBpPXRoaXM7ai5pdGVtcz1qLml0ZW1zfHxbXTtmdW5jdGlvbiBoKGwpe3JldHVybiBsLnJlcGxhY2UoL1tcclxuXFxdL2csZnVuY3Rpb24obSl7aWYobT09PSJcbiIpe3JldHVybiJcXG4ifWVsc2V7aWYobT09PSJcXCIpe3JldHVybiJcXFxcIn19cmV0dXJuIlxcciJ9KX1mdW5jdGlvbiBrKGwpe3JldHVybiBsLnJlcGxhY2UoL1xcW1xccm5dL2csZnVuY3Rpb24obSl7aWYobT09PSJcXG4iKXtyZXR1cm4iXG4ifWVsc2V7aWYobT09PSJcXFxcIil7cmV0dXJuIlxcIn19cmV0dXJuIlxyIn0pfWYoai5wYXR0ZXJucyxmdW5jdGlvbihsKXtqLmNvbnRlbnQ9ayhoKGouY29udGVudCkucmVwbGFjZShsLnBhdHRlcm4sZnVuY3Rpb24obixvLG0scCl7bT1rKG0pO2lmKGwuZW5jb2RlKXttPWkuX2VuY29kZShtKX1qLml0ZW1zLnB1c2gobSk7cmV0dXJuIG8rIjwhLS1tY2U6Iisoai5pdGVtcy5sZW5ndGgtMSkrIi0tPiIrcH0pKX0pO3JldHVybiBqfSxfdW5wcm90ZWN0OmZ1bmN0aW9uKGksail7aT1pLnJlcGxhY2UoL1w8IS0tbWNlOihbMC05XSspLS1cPi9nLGZ1bmN0aW9uKGssaCl7cmV0dXJuIGouaXRlbXNbcGFyc2VJbnQoaCldfSk7ai5pdGVtcz1bXTtyZXR1cm4gaX0sX2VuY29kZTpmdW5jdGlvbihtKXt2YXIgaj10aGlzLGs9ai5zZXR0aW5ncyxpO2lmKGsuZW50aXR5X2VuY29kaW5nIT09InJhdyIpe2lmKGsuZW50aXR5X2VuY29kaW5nLmluZGV4T2YoIm5hbWVkIikhPS0xKXtqLnNldEVudGl0aWVzKGsuZW50aXRpZXMpO2k9ai5lbnRpdHlMb29rdXA7bT1tLnJlcGxhY2UoL1tcdTAwN0UtXHVGRkZGXS9nLGZ1bmN0aW9uKGgpe3ZhciBsO2lmKGw9aVtoXSl7aD0iJiIrbCsiOyJ9cmV0dXJuIGh9KX1pZihrLmVudGl0eV9lbmNvZGluZy5pbmRleE9mKCJudW1lcmljIikhPS0xKXttPW0ucmVwbGFjZSgvW1x1MDA3RS1cdUZGRkZdL2csZnVuY3Rpb24oaCl7cmV0dXJuIiYjIitoLmNoYXJDb2RlQXQoMCkrIjsifSl9fXJldHVybiBtfSxfc2V0dXA6ZnVuY3Rpb24oKXt2YXIgaD10aGlzLGk9dGhpcy5zZXR0aW5ncztpZihoLmRvbmUpe3JldHVybn1oLmRvbmU9MTtoLnNldFJ1bGVzKGkudmFsaWRfZWxlbWVudHMpO2guYWRkUnVsZXMoaS5leHRlbmRlZF92YWxpZF9lbGVtZW50cyk7aWYoaS5pbnZhbGlkX2VsZW1lbnRzKXtoLmludmFsaWRFbGVtZW50c1JFPW5ldyBSZWdFeHAoIl4oIitjKGkuaW52YWxpZF9lbGVtZW50cy5yZXBsYWNlKC8sL2csInwiKS50b0xvd2VyQ2FzZSgpKSsiKSQiKX1pZihpLmF0dHJpYl92YWx1ZV9maWx0ZXIpe2guYXR0cmliVmFsdWVGaWx0ZXI9aS5hdHRyaWJWYWx1ZUZpbHRlcn19LF9nZXRBdHRyaWI6ZnVuY3Rpb24obSxqLGgpe3ZhciBsLGs7aD1ofHxqLm5hbWU7aWYoai5mb3JjZWRWYWwmJihrPWouZm9yY2VkVmFsKSl7aWYoaz09PSJ7JHVpZH0iKXtyZXR1cm4gdGhpcy5kb20udW5pcXVlSWQoKX1yZXR1cm4ga31rPXRoaXMuZG9tLmdldEF0dHJpYihtLGgpO3N3aXRjaChoKXtjYXNlInJvd3NwYW4iOmNhc2UiY29sc3BhbiI6aWYoaz09IjEiKXtrPSIifWJyZWFrfWlmKHRoaXMuYXR0cmliVmFsdWVGaWx0ZXIpe2s9dGhpcy5hdHRyaWJWYWx1ZUZpbHRlcihoLGssbSl9aWYoai52YWxpZFZhbHMpe2ZvcihsPWoudmFsaWRWYWxzLmxlbmd0aC0xO2w+PTA7bC0tKXtpZihrPT1qLnZhbGlkVmFsc1tsXSl7YnJlYWt9fWlmKGw9PS0xKXtyZXR1cm4gbnVsbH19aWYoaz09PSIiJiZ0eXBlb2Yoai5kZWZhdWx0VmFsKSE9InVuZGVmaW5lZCIpe2s9ai5kZWZhdWx0VmFsO2lmKGs9PT0ieyR1aWR9Iil7cmV0dXJuIHRoaXMuZG9tLnVuaXF1ZUlkKCl9cmV0dXJuIGt9ZWxzZXtpZihoPT0iY2xhc3MiJiZ0aGlzLnByb2Nlc3NPYmouZ2V0KXtrPWsucmVwbGFjZSgvXHM/bWNlSXRlbVx3K1xzPy9nLCIiKX19aWYoaz09PSIiKXtyZXR1cm4gbnVsbH1yZXR1cm4ga319KX0pKHRpbnltY2UpOyhmdW5jdGlvbihhKXthLmRvbS5TY3JpcHRMb2FkZXI9ZnVuY3Rpb24oaCl7dmFyIGM9MCxrPTEsaT0yLGw9e30saj1bXSxmPXt9LGQ9W10sZz0wLGU7ZnVuY3Rpb24gYihtLHUpe3ZhciB2PXRoaXMscT1hLkRPTSxzLG8scixuO2Z1bmN0aW9uIHAoKXtxLnJlbW92ZShuKTtpZihzKXtzLm9ucmVhZHlzdGF0ZWNoYW5nZT1zLm9ubG9hZD1zPW51bGx9dSgpfW49cS51bmlxdWVJZCgpO2lmKGEuaXNJRTYpe289bmV3IGEudXRpbC5VUkkobSk7cj1sb2NhdGlvbjtpZihvLmhvc3Q9PXIuaG9zdG5hbWUmJm8ucG9ydD09ci5wb3J0JiYoby5wcm90b2NvbCsiOiIpPT1yLnByb3RvY29sKXthLnV0aWwuWEhSLnNlbmQoe3VybDphLl9hZGRWZXIoby5nZXRVUkkoKSksc3VjY2VzczpmdW5jdGlvbih4KXt2YXIgdD1xLmNyZWF0ZSgic2NyaXB0Iix7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pO3QudGV4dD14O2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQodCk7cS5yZW1vdmUodCk7cCgpfX0pO3JldHVybn19cz1xLmNyZWF0ZSgic2NyaXB0Iix7aWQ6bix0eXBlOiJ0ZXh0L2phdmFzY3JpcHQiLHNyYzphLl9hZGRWZXIobSl9KTtpZighYS5pc0lFKXtzLm9ubG9hZD1wfXMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7dmFyIHQ9cy5yZWFkeVN0YXRlO2lmKHQ9PSJjb21wbGV0ZSJ8fHQ9PSJsb2FkZWQiKXtwKCl9fTsoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8ZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQocyl9dGhpcy5pc0RvbmU9ZnVuY3Rpb24obSl7cmV0dXJuIGxbbV09PWl9O3RoaXMubWFya0RvbmU9ZnVuY3Rpb24obSl7bFttXT1pfTt0aGlzLmFkZD10aGlzLmxvYWQ9ZnVuY3Rpb24obSxxLG4pe3ZhciBvLHA9bFttXTtpZihwPT1lKXtqLnB1c2gobSk7bFttXT1jfWlmKHEpe2lmKCFmW21dKXtmW21dPVtdfWZbbV0ucHVzaCh7ZnVuYzpxLHNjb3BlOm58fHRoaXN9KX19O3RoaXMubG9hZFF1ZXVlPWZ1bmN0aW9uKG4sbSl7dGhpcy5sb2FkU2NyaXB0cyhqLG4sbSl9O3RoaXMubG9hZFNjcmlwdHM9ZnVuY3Rpb24obSxxLHApe3ZhciBvO2Z1bmN0aW9uIG4ocil7YS5lYWNoKGZbcl0sZnVuY3Rpb24ocyl7cy5mdW5jLmNhbGwocy5zY29wZSl9KTtmW3JdPWV9ZC5wdXNoKHtmdW5jOnEsc2NvcGU6cHx8dGhpc30pO289ZnVuY3Rpb24oKXt2YXIgcj1hLmdyZXAobSk7bS5sZW5ndGg9MDthLmVhY2gocixmdW5jdGlvbihzKXtpZihsW3NdPT1pKXtuKHMpO3JldHVybn1pZihsW3NdIT1rKXtsW3NdPWs7ZysrO2IocyxmdW5jdGlvbigpe2xbc109aTtnLS07bihzKTtvKCl9KX19KTtpZighZyl7YS5lYWNoKGQsZnVuY3Rpb24ocyl7cy5mdW5jLmNhbGwocy5zY29wZSl9KTtkLmxlbmd0aD0wfX07bygpfX07YS5TY3JpcHRMb2FkZXI9bmV3IGEuZG9tLlNjcmlwdExvYWRlcigpfSkodGlueW1jZSk7dGlueW1jZS5kb20uVHJlZVdhbGtlcj1mdW5jdGlvbihhLGMpe3ZhciBiPWE7ZnVuY3Rpb24gZChpLGYsZSxqKXt2YXIgaCxnO2lmKGkpe2lmKCFqJiZpW2ZdKXtyZXR1cm4gaVtmXX1pZihpIT1jKXtoPWlbZV07aWYoaCl7cmV0dXJuIGh9Zm9yKGc9aS5wYXJlbnROb2RlO2cmJmchPWM7Zz1nLnBhcmVudE5vZGUpe2g9Z1tlXTtpZihoKXtyZXR1cm4gaH19fX19dGhpcy5jdXJyZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGJ9O3RoaXMubmV4dD1mdW5jdGlvbihlKXtyZXR1cm4oYj1kKGIsImZpcnN0Q2hpbGQiLCJuZXh0U2libGluZyIsZSkpfTt0aGlzLnByZXY9ZnVuY3Rpb24oZSl7cmV0dXJuKGI9ZChiLCJsYXN0Q2hpbGQiLCJsYXN0U2libGluZyIsZSkpfX07KGZ1bmN0aW9uKCl7dmFyIGE9e307ZnVuY3Rpb24gYihmLGUpe3ZhciBkO2Z1bmN0aW9uIGMoZyl7cmV0dXJuIGcucmVwbGFjZSgvW0EtWl0rL2csZnVuY3Rpb24oaCl7cmV0dXJuIGMoZltoXSl9KX1mb3IoZCBpbiBmKXtpZihmLmhhc093blByb3BlcnR5KGQpKXtmW2RdPWMoZltkXSl9fWMoZSkucmVwbGFjZSgvIy9nLCIjdGV4dCIpLnJlcGxhY2UoLyhcdyspXFsoW15cXV0rKVxdL2csZnVuY3Rpb24obCxnLGope3ZhciBoLGs9e307aj1qLnNwbGl0KC9cfC8pO2ZvcihoPWoubGVuZ3RoLTE7aD49MDtoLS0pe2tbaltoXV09MX1hW2ddPWt9KX1iKHtaOiIjfEh8S3xOfE98UCIsWToiI3xYfGZvcm18UnxRIixYOiJwfFR8ZGl2fFV8V3xpc2luZGV4fGZpZWxkc2V0fHRhYmxlIixXOiJwcmV8aHJ8YmxvY2txdW90ZXxhZGRyZXNzfGNlbnRlcnxub2ZyYW1lcyIsVToidWx8b2x8ZGx8bWVudXxkaXIiLFpDOiIjfHB8WXxkaXZ8VXxXfHRhYmxlfGJyfHNwYW58YmRvfG9iamVjdHxhcHBsZXR8aW1nfG1hcHxLfE58USIsVDoiaDF8aDJ8aDN8aDR8aDV8aDYiLFpCOiIjfFh8U3xRIixTOiJSfFAiLFpBOiIjfGF8R3xKfE18T3xQIixSOiIjfGF8SHxLfE58TyIsUToibm9zY3JpcHR8UCIsUDoiaW5zfGRlbHxzY3JpcHQiLE86ImlucHV0fHNlbGVjdHx0ZXh0YXJlYXxsYWJlbHxidXR0b24iLE46Ik18TCIsTToiZW18c3Ryb25nfGRmbnxjb2RlfHF8c2FtcHxrYmR8dmFyfGNpdGV8YWJicnxhY3JvbnltIixMOiJzdWJ8c3VwIixLOiJKfEkiLEo6InR0fGl8Ynx1fHN8c3RyaWtlIixJOiJiaWd8c21hbGx8Zm9udHxiYXNlZm9udCIsSDoiR3xGIixHOiJicnxzcGFufGJkbyIsRjoib2JqZWN0fGFwcGxldHxpbWd8bWFwfGlmcmFtZSJ9LCJzY3JpcHRbXXN0eWxlW11vYmplY3RbI3xwYXJhbXxYfGZvcm18YXxIfEt8TnxPfFFdcGFyYW1bXXBbU11hW1pdYnJbXXNwYW5bU11iZG9bU11hcHBsZXRbI3xwYXJhbXxYfGZvcm18YXxIfEt8TnxPfFFdaDFbU11pbWdbXW1hcFtYfGZvcm18UXxhcmVhXWgyW1NdaWZyYW1lWyN8WHxmb3JtfGF8SHxLfE58T3xRXWgzW1NddHRbU11pW1NdYltTXXVbU11zW1Ndc3RyaWtlW1NdYmlnW1Ndc21hbGxbU11mb250W1NdYmFzZWZvbnRbXWVtW1Ndc3Ryb25nW1NdZGZuW1NdY29kZVtTXXFbU11zYW1wW1Nda2JkW1NddmFyW1NdY2l0ZVtTXWFiYnJbU11hY3JvbnltW1Ndc3ViW1Ndc3VwW1NdaW5wdXRbXXNlbGVjdFtvcHRncm91cHxvcHRpb25db3B0Z3JvdXBbb3B0aW9uXW9wdGlvbltddGV4dGFyZWFbXWxhYmVsW1NdYnV0dG9uWyN8cHxUfGRpdnxVfFd8dGFibGV8R3xvYmplY3R8YXBwbGV0fGltZ3xtYXB8S3xOfFFdaDRbU11pbnNbI3xYfGZvcm18YXxIfEt8TnxPfFFdaDVbU11kZWxbI3xYfGZvcm18YXxIfEt8TnxPfFFdaDZbU11kaXZbI3xYfGZvcm18YXxIfEt8TnxPfFFddWxbbGldbGlbI3xYfGZvcm18YXxIfEt8TnxPfFFdb2xbbGldZGxbZHR8ZGRdZHRbU11kZFsjfFh8Zm9ybXxhfEh8S3xOfE98UV1tZW51W2xpXWRpcltsaV1wcmVbWkFdaHJbXWJsb2NrcXVvdGVbI3xYfGZvcm18YXxIfEt8TnxPfFFdYWRkcmVzc1tTfHBdY2VudGVyWyN8WHxmb3JtfGF8SHxLfE58T3xRXW5vZnJhbWVzWyN8WHxmb3JtfGF8SHxLfE58T3xRXWlzaW5kZXhbXWZpZWxkc2V0WyN8bGVnZW5kfFh8Zm9ybXxhfEh8S3xOfE98UV1sZWdlbmRbU110YWJsZVtjYXB0aW9ufGNvbHxjb2xncm91cHx0aGVhZHx0Zm9vdHx0Ym9keXx0cl1jYXB0aW9uW1NdY29sW11jb2xncm91cFtjb2xddGhlYWRbdHJddHJbdGh8dGRddGhbI3xYfGZvcm18YXxIfEt8TnxPfFFdZm9ybVsjfFh8YXxIfEt8TnxPfFFdbm9zY3JpcHRbI3xYfGZvcm18YXxIfEt8TnxPfFFddGRbI3xYfGZvcm18YXxIfEt8TnxPfFFddGZvb3RbdHJddGJvZHlbdHJdYXJlYVtdYmFzZVtdYm9keVsjfFh8Zm9ybXxhfEh8S3xOfE98UV0iKTt0aW55bWNlLmRvbS5TY2hlbWE9ZnVuY3Rpb24oKXt2YXIgYz10aGlzLGQ9YTtjLmlzVmFsaWQ9ZnVuY3Rpb24oZixlKXt2YXIgZz1kW2ZdO3JldHVybiAhIShnJiYoIWV8fGdbZV0pKX19fSkoKTsoZnVuY3Rpb24oYSl7YS5kb20uUmFuZ2VVdGlscz1mdW5jdGlvbihjKXt2YXIgYj0iXHVGRUZGIjt0aGlzLndhbGs9ZnVuY3Rpb24oZCxyKXt2YXIgaD1kLnN0YXJ0Q29udGFpbmVyLGs9ZC5zdGFydE9mZnNldCxzPWQuZW5kQ29udGFpbmVyLGw9ZC5lbmRPZmZzZXQsaSxmLG4sZyxxLHAsZTtlPWMuc2VsZWN0KCJ0ZC5tY2VTZWxlY3RlZCx0aC5tY2VTZWxlY3RlZCIpO2lmKGUubGVuZ3RoPjApe2EuZWFjaChlLGZ1bmN0aW9uKHQpe3IoW3RdKX0pO3JldHVybn1mdW5jdGlvbiBvKHYsdSx0KXt2YXIgeD1bXTtmb3IoO3YmJnYhPXQ7dj12W3VdKXt4LnB1c2godil9cmV0dXJuIHh9ZnVuY3Rpb24gbSh1LHQpe2Rve2lmKHUucGFyZW50Tm9kZT09dCl7cmV0dXJuIHV9dT11LnBhcmVudE5vZGV9d2hpbGUodSl9ZnVuY3Rpb24gaih2LHUseCl7dmFyIHQ9eD8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciO2ZvcihnPXYscT1nLnBhcmVudE5vZGU7ZyYmZyE9dTtnPXEpe3E9Zy5wYXJlbnROb2RlO3A9byhnPT12P2c6Z1t0XSx0KTtpZihwLmxlbmd0aCl7aWYoIXgpe3AucmV2ZXJzZSgpfXIocCl9fX1pZihoLm5vZGVUeXBlPT0xJiZoLmhhc0NoaWxkTm9kZXMoKSl7aD1oLmNoaWxkTm9kZXNba119aWYocy5ub2RlVHlwZT09MSYmcy5oYXNDaGlsZE5vZGVzKCkpe3M9cy5jaGlsZE5vZGVzW01hdGgubWluKGs9PWw/bDpsLTEscy5jaGlsZE5vZGVzLmxlbmd0aC0xKV19aT1jLmZpbmRDb21tb25BbmNlc3RvcihoLHMpO2lmKGg9PXMpe3JldHVybiByKFtoXSl9Zm9yKGc9aDtnO2c9Zy5wYXJlbnROb2RlKXtpZihnPT1zKXtyZXR1cm4gaihoLGksdHJ1ZSl9aWYoZz09aSl7YnJlYWt9fWZvcihnPXM7ZztnPWcucGFyZW50Tm9kZSl7aWYoZz09aCl7cmV0dXJuIGoocyxpKX1pZihnPT1pKXticmVha319Zj1tKGgsaSl8fGg7bj1tKHMsaSl8fHM7aihoLGYsdHJ1ZSk7cD1vKGY9PWg/ZjpmLm5leHRTaWJsaW5nLCJuZXh0U2libGluZyIsbj09cz9uLm5leHRTaWJsaW5nOm4pO2lmKHAubGVuZ3RoKXtyKHApfWoocyxuKX19O2EuZG9tLlJhbmdlVXRpbHMuY29tcGFyZVJhbmdlcz1mdW5jdGlvbihjLGIpe2lmKGMmJmIpe2lmKGMuaXRlbXx8Yy5kdXBsaWNhdGUpe2lmKGMuaXRlbSYmYi5pdGVtJiZjLml0ZW0oMCk9PT1iLml0ZW0oMCkpe3JldHVybiB0cnVlfWlmKGMuaXNFcXVhbCYmYi5pc0VxdWFsJiZiLmlzRXF1YWwoYykpe3JldHVybiB0cnVlfX1lbHNle3JldHVybiBjLnN0YXJ0Q29udGFpbmVyPT1iLnN0YXJ0Q29udGFpbmVyJiZjLnN0YXJ0T2Zmc2V0PT1iLnN0YXJ0T2Zmc2V0fX1yZXR1cm4gZmFsc2V9fSkodGlueW1jZSk7KGZ1bmN0aW9uKGMpe3ZhciBiPWMuRE9NLGE9Yy5pcztjLmNyZWF0ZSgidGlueW1jZS51aS5Db250cm9sIix7Q29udHJvbDpmdW5jdGlvbihlLGQpe3RoaXMuaWQ9ZTt0aGlzLnNldHRpbmdzPWQ9ZHx8e307dGhpcy5yZW5kZXJlZD1mYWxzZTt0aGlzLm9uUmVuZGVyPW5ldyBjLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTt0aGlzLmNsYXNzUHJlZml4PSIiO3RoaXMuc2NvcGU9ZC5zY29wZXx8dGhpczt0aGlzLmRpc2FibGVkPTA7dGhpcy5hY3RpdmU9MH0sc2V0RGlzYWJsZWQ6ZnVuY3Rpb24oZCl7dmFyIGY7aWYoZCE9dGhpcy5kaXNhYmxlZCl7Zj1iLmdldCh0aGlzLmlkKTtpZihmJiZ0aGlzLnNldHRpbmdzLnVuYXZhaWxhYmxlX3ByZWZpeCl7aWYoZCl7dGhpcy5wcmV2VGl0bGU9Zi50aXRsZTtmLnRpdGxlPXRoaXMuc2V0dGluZ3MudW5hdmFpbGFibGVfcHJlZml4KyI6ICIrZi50aXRsZX1lbHNle2YudGl0bGU9dGhpcy5wcmV2VGl0bGV9fXRoaXMuc2V0U3RhdGUoIkRpc2FibGVkIixkKTt0aGlzLnNldFN0YXRlKCJFbmFibGVkIiwhZCk7dGhpcy5kaXNhYmxlZD1kfX0saXNEaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfSxzZXRBY3RpdmU6ZnVuY3Rpb24oZCl7aWYoZCE9dGhpcy5hY3RpdmUpe3RoaXMuc2V0U3RhdGUoIkFjdGl2ZSIsZCk7dGhpcy5hY3RpdmU9ZH19LGlzQWN0aXZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlfSxzZXRTdGF0ZTpmdW5jdGlvbihmLGQpe3ZhciBlPWIuZ2V0KHRoaXMuaWQpO2Y9dGhpcy5jbGFzc1ByZWZpeCtmO2lmKGQpe2IuYWRkQ2xhc3MoZSxmKX1lbHNle2IucmVtb3ZlQ2xhc3MoZSxmKX19LGlzUmVuZGVyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlZH0scmVuZGVySFRNTDpmdW5jdGlvbigpe30scmVuZGVyVG86ZnVuY3Rpb24oZCl7Yi5zZXRIVE1MKGQsdGhpcy5yZW5kZXJIVE1MKCkpfSxwb3N0UmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxkO2lmKGEoZS5kaXNhYmxlZCkpe2Q9ZS5kaXNhYmxlZDtlLmRpc2FibGVkPS0xO2Uuc2V0RGlzYWJsZWQoZCl9aWYoYShlLmFjdGl2ZSkpe2Q9ZS5hY3RpdmU7ZS5hY3RpdmU9LTE7ZS5zZXRBY3RpdmUoZCl9fSxyZW1vdmU6ZnVuY3Rpb24oKXtiLnJlbW92ZSh0aGlzLmlkKTt0aGlzLmRlc3Ryb3koKX0sZGVzdHJveTpmdW5jdGlvbigpe2MuZG9tLkV2ZW50LmNsZWFyKHRoaXMuaWQpfX0pfSkodGlueW1jZSk7dGlueW1jZS5jcmVhdGUoInRpbnltY2UudWkuQ29udGFpbmVyOnRpbnltY2UudWkuQ29udHJvbCIse0NvbnRhaW5lcjpmdW5jdGlvbihiLGEpe3RoaXMucGFyZW50KGIsYSk7dGhpcy5jb250cm9scz1bXTt0aGlzLmxvb2t1cD17fX0sYWRkOmZ1bmN0aW9uKGEpe3RoaXMubG9va3VwW2EuaWRdPWE7dGhpcy5jb250cm9scy5wdXNoKGEpO3JldHVybiBhfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubG9va3VwW2FdfX0pO3RpbnltY2UuY3JlYXRlKCJ0aW55bWNlLnVpLlNlcGFyYXRvcjp0aW55bWNlLnVpLkNvbnRyb2wiLHtTZXBhcmF0b3I6ZnVuY3Rpb24oYixhKXt0aGlzLnBhcmVudChiLGEpO3RoaXMuY2xhc3NQcmVmaXg9Im1jZVNlcGFyYXRvciJ9LHJlbmRlckhUTUw6ZnVuY3Rpb24oKXtyZXR1cm4gdGlueW1jZS5ET00uY3JlYXRlSFRNTCgic3BhbiIseyJjbGFzcyI6dGhpcy5jbGFzc1ByZWZpeH0pfX0pOyhmdW5jdGlvbihkKXt2YXIgYz1kLmlzLGI9ZC5ET00sZT1kLmVhY2gsYT1kLndhbGs7ZC5jcmVhdGUoInRpbnltY2UudWkuTWVudUl0ZW06dGlueW1jZS51aS5Db250cm9sIix7TWVudUl0ZW06ZnVuY3Rpb24oZyxmKXt0aGlzLnBhcmVudChnLGYpO3RoaXMuY2xhc3NQcmVmaXg9Im1jZU1lbnVJdGVtIn0sc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24oZil7dGhpcy5zZXRTdGF0ZSgiU2VsZWN0ZWQiLGYpO3RoaXMuc2VsZWN0ZWQ9Zn0saXNTZWxlY3RlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGVkfSxwb3N0UmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGY9dGhpcztmLnBhcmVudCgpO2lmKGMoZi5zZWxlY3RlZCkpe2Yuc2V0U2VsZWN0ZWQoZi5zZWxlY3RlZCl9fX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGQpe3ZhciBjPWQuaXMsYj1kLkRPTSxlPWQuZWFjaCxhPWQud2FsaztkLmNyZWF0ZSgidGlueW1jZS51aS5NZW51OnRpbnltY2UudWkuTWVudUl0ZW0iLHtNZW51OmZ1bmN0aW9uKGgsZyl7dmFyIGY9dGhpcztmLnBhcmVudChoLGcpO2YuaXRlbXM9e307Zi5jb2xsYXBzZWQ9ZmFsc2U7Zi5tZW51Q291bnQ9MDtmLm9uQWRkSXRlbT1uZXcgZC51dGlsLkRpc3BhdGNoZXIodGhpcyl9LGV4cGFuZDpmdW5jdGlvbihnKXt2YXIgZj10aGlzO2lmKGcpe2EoZixmdW5jdGlvbihoKXtpZihoLmV4cGFuZCl7aC5leHBhbmQoKX19LCJpdGVtcyIsZil9Zi5jb2xsYXBzZWQ9ZmFsc2V9LGNvbGxhcHNlOmZ1bmN0aW9uKGcpe3ZhciBmPXRoaXM7aWYoZyl7YShmLGZ1bmN0aW9uKGgpe2lmKGguY29sbGFwc2Upe2guY29sbGFwc2UoKX19LCJpdGVtcyIsZil9Zi5jb2xsYXBzZWQ9dHJ1ZX0saXNDb2xsYXBzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xsYXBzZWR9LGFkZDpmdW5jdGlvbihmKXtpZighZi5zZXR0aW5ncyl7Zj1uZXcgZC51aS5NZW51SXRlbShmLmlkfHxiLnVuaXF1ZUlkKCksZil9dGhpcy5vbkFkZEl0ZW0uZGlzcGF0Y2godGhpcyxmKTtyZXR1cm4gdGhpcy5pdGVtc1tmLmlkXT1mfSxhZGRTZXBhcmF0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQoe3NlcGFyYXRvcjp0cnVlfSl9LGFkZE1lbnU6ZnVuY3Rpb24oZil7aWYoIWYuY29sbGFwc2Upe2Y9dGhpcy5jcmVhdGVNZW51KGYpfXRoaXMubWVudUNvdW50Kys7cmV0dXJuIHRoaXMuYWRkKGYpfSxoYXNNZW51czpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnVDb3VudCE9PTB9LHJlbW92ZTpmdW5jdGlvbihmKXtkZWxldGUgdGhpcy5pdGVtc1tmLmlkXX0scmVtb3ZlQWxsOmZ1bmN0aW9uKCl7dmFyIGY9dGhpczthKGYsZnVuY3Rpb24oZyl7aWYoZy5yZW1vdmVBbGwpe2cucmVtb3ZlQWxsKCl9ZWxzZXtnLnJlbW92ZSgpfWcuZGVzdHJveSgpfSwiaXRlbXMiLGYpO2YuaXRlbXM9e319LGNyZWF0ZU1lbnU6ZnVuY3Rpb24oZyl7dmFyIGY9bmV3IGQudWkuTWVudShnLmlkfHxiLnVuaXF1ZUlkKCksZyk7Zi5vbkFkZEl0ZW0uYWRkKHRoaXMub25BZGRJdGVtLmRpc3BhdGNoLHRoaXMub25BZGRJdGVtKTtyZXR1cm4gZn19KX0pKHRpbnltY2UpOyhmdW5jdGlvbihlKXt2YXIgZD1lLmlzLGM9ZS5ET00sZj1lLmVhY2gsYT1lLmRvbS5FdmVudCxiPWUuZG9tLkVsZW1lbnQ7ZS5jcmVhdGUoInRpbnltY2UudWkuRHJvcE1lbnU6dGlueW1jZS51aS5NZW51Iix7RHJvcE1lbnU6ZnVuY3Rpb24oaCxnKXtnPWd8fHt9O2cuY29udGFpbmVyPWcuY29udGFpbmVyfHxjLmRvYy5ib2R5O2cub2Zmc2V0X3g9Zy5vZmZzZXRfeHx8MDtnLm9mZnNldF95PWcub2Zmc2V0X3l8fDA7Zy52cF9vZmZzZXRfeD1nLnZwX29mZnNldF94fHwwO2cudnBfb2Zmc2V0X3k9Zy52cF9vZmZzZXRfeXx8MDtpZihkKGcuaWNvbnMpJiYhZy5pY29ucyl7Z1siY2xhc3MiXSs9IiBtY2VOb0ljb25zIn10aGlzLnBhcmVudChoLGcpO3RoaXMub25TaG93TWVudT1uZXcgZS51dGlsLkRpc3BhdGNoZXIodGhpcyk7dGhpcy5vbkhpZGVNZW51PW5ldyBlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTt0aGlzLmNsYXNzUHJlZml4PSJtY2VNZW51In0sY3JlYXRlTWVudTpmdW5jdGlvbihqKXt2YXIgaD10aGlzLGk9aC5zZXR0aW5ncyxnO2ouY29udGFpbmVyPWouY29udGFpbmVyfHxpLmNvbnRhaW5lcjtqLnBhcmVudD1oO2ouY29uc3RyYWluPWouY29uc3RyYWlufHxpLmNvbnN0cmFpbjtqWyJjbGFzcyJdPWpbImNsYXNzIl18fGlbImNsYXNzIl07ai52cF9vZmZzZXRfeD1qLnZwX29mZnNldF94fHxpLnZwX29mZnNldF94O2oudnBfb2Zmc2V0X3k9ai52cF9vZmZzZXRfeXx8aS52cF9vZmZzZXRfeTtnPW5ldyBlLnVpLkRyb3BNZW51KGouaWR8fGMudW5pcXVlSWQoKSxqKTtnLm9uQWRkSXRlbS5hZGQoaC5vbkFkZEl0ZW0uZGlzcGF0Y2gsaC5vbkFkZEl0ZW0pO3JldHVybiBnfSx1cGRhdGU6ZnVuY3Rpb24oKXt2YXIgaT10aGlzLGo9aS5zZXR0aW5ncyxnPWMuZ2V0KCJtZW51XyIraS5pZCsiX3RibCIpLGw9Yy5nZXQoIm1lbnVfIitpLmlkKyJfY28iKSxoLGs7aD1qLm1heF93aWR0aD9NYXRoLm1pbihnLmNsaWVudFdpZHRoLGoubWF4X3dpZHRoKTpnLmNsaWVudFdpZHRoO2s9ai5tYXhfaGVpZ2h0P01hdGgubWluKGcuY2xpZW50SGVpZ2h0LGoubWF4X2hlaWdodCk6Zy5jbGllbnRIZWlnaHQ7aWYoIWMuYm94TW9kZWwpe2kuZWxlbWVudC5zZXRTdHlsZXMoe3dpZHRoOmgrMixoZWlnaHQ6aysyfSl9ZWxzZXtpLmVsZW1lbnQuc2V0U3R5bGVzKHt3aWR0aDpoLGhlaWdodDprfSl9aWYoai5tYXhfd2lkdGgpe2Muc2V0U3R5bGUobCwid2lkdGgiLGgpfWlmKGoubWF4X2hlaWdodCl7Yy5zZXRTdHlsZShsLCJoZWlnaHQiLGspO2lmKGcuY2xpZW50SGVpZ2h0PGoubWF4X2hlaWdodCl7Yy5zZXRTdHlsZShsLCJvdmVyZmxvdyIsImhpZGRlbiIpfX19LHNob3dNZW51OmZ1bmN0aW9uKHAsbixyKXt2YXIgej10aGlzLEE9ei5zZXR0aW5ncyxvLGc9Yy5nZXRWaWV3UG9ydCgpLHUsbCx2LHEsaT0yLGssaixtPXouY2xhc3NQcmVmaXg7ei5jb2xsYXBzZSgxKTtpZih6LmlzTWVudVZpc2libGUpe3JldHVybn1pZighei5yZW5kZXJlZCl7bz1jLmFkZCh6LnNldHRpbmdzLmNvbnRhaW5lcix6LnJlbmRlck5vZGUoKSk7Zih6Lml0ZW1zLGZ1bmN0aW9uKGgpe2gucG9zdFJlbmRlcigpfSk7ei5lbGVtZW50PW5ldyBiKCJtZW51XyIrei5pZCx7YmxvY2tlcjoxLGNvbnRhaW5lcjpBLmNvbnRhaW5lcn0pfWVsc2V7bz1jLmdldCgibWVudV8iK3ouaWQpfWlmKCFlLmlzT3BlcmEpe2Muc2V0U3R5bGVzKG8se2xlZnQ6LTY1NTM1LHRvcDotNjU1MzV9KX1jLnNob3cobyk7ei51cGRhdGUoKTtwKz1BLm9mZnNldF94fHwwO24rPUEub2Zmc2V0X3l8fDA7Zy53LT00O2cuaC09NDtpZihBLmNvbnN0cmFpbil7dT1vLmNsaWVudFdpZHRoLWk7bD1vLmNsaWVudEhlaWdodC1pO3Y9Zy54K2cudztxPWcueStnLmg7aWYoKHArQS52cF9vZmZzZXRfeCt1KT52KXtwPXI/ci11Ok1hdGgubWF4KDAsKHYtQS52cF9vZmZzZXRfeCktdSl9aWYoKG4rQS52cF9vZmZzZXRfeStsKT5xKXtuPU1hdGgubWF4KDAsKHEtQS52cF9vZmZzZXRfeSktbCl9fWMuc2V0U3R5bGVzKG8se2xlZnQ6cCx0b3A6bn0pO3ouZWxlbWVudC51cGRhdGUoKTt6LmlzTWVudVZpc2libGU9MTt6Lm1vdXNlQ2xpY2tGdW5jPWEuYWRkKG8sImNsaWNrIixmdW5jdGlvbihzKXt2YXIgaDtzPXMudGFyZ2V0O2lmKHMmJihzPWMuZ2V0UGFyZW50KHMsInRyIikpJiYhYy5oYXNDbGFzcyhzLG0rIkl0ZW1TdWIiKSl7aD16Lml0ZW1zW3MuaWRdO2lmKGguaXNEaXNhYmxlZCgpKXtyZXR1cm59az16O3doaWxlKGspe2lmKGsuaGlkZU1lbnUpe2suaGlkZU1lbnUoKX1rPWsuc2V0dGluZ3MucGFyZW50fWlmKGguc2V0dGluZ3Mub25jbGljayl7aC5zZXR0aW5ncy5vbmNsaWNrKHMpfXJldHVybiBhLmNhbmNlbChzKX19KTtpZih6Lmhhc01lbnVzKCkpe3oubW91c2VPdmVyRnVuYz1hLmFkZChvLCJtb3VzZW92ZXIiLGZ1bmN0aW9uKHgpe3ZhciBoLHQsczt4PXgudGFyZ2V0O2lmKHgmJih4PWMuZ2V0UGFyZW50KHgsInRyIikpKXtoPXouaXRlbXNbeC5pZF07aWYoei5sYXN0TWVudSl7ei5sYXN0TWVudS5jb2xsYXBzZSgxKX1pZihoLmlzRGlzYWJsZWQoKSl7cmV0dXJufWlmKHgmJmMuaGFzQ2xhc3MoeCxtKyJJdGVtU3ViIikpe3Q9Yy5nZXRSZWN0KHgpO2guc2hvd01lbnUoKHQueCt0LnctaSksdC55LWksdC54KTt6Lmxhc3RNZW51PWg7Yy5hZGRDbGFzcyhjLmdldChoLmlkKS5maXJzdENoaWxkLG0rIkl0ZW1BY3RpdmUiKX19fSl9ei5vblNob3dNZW51LmRpc3BhdGNoKHopO2lmKEEua2V5Ym9hcmRfZm9jdXMpe2EuYWRkKG8sImtleWRvd24iLHouX2tleUhhbmRsZXIseik7Yy5zZWxlY3QoImEiLCJtZW51XyIrei5pZClbMF0uZm9jdXMoKTt6Ll9mb2N1c0lkeD0wfX0saGlkZU1lbnU6ZnVuY3Rpb24oail7dmFyIGc9dGhpcyxpPWMuZ2V0KCJtZW51XyIrZy5pZCksaDtpZighZy5pc01lbnVWaXNpYmxlKXtyZXR1cm59YS5yZW1vdmUoaSwibW91c2VvdmVyIixnLm1vdXNlT3ZlckZ1bmMpO2EucmVtb3ZlKGksImNsaWNrIixnLm1vdXNlQ2xpY2tGdW5jKTthLnJlbW92ZShpLCJrZXlkb3duIixnLl9rZXlIYW5kbGVyKTtjLmhpZGUoaSk7Zy5pc01lbnVWaXNpYmxlPTA7aWYoIWope2cuY29sbGFwc2UoMSl9aWYoZy5lbGVtZW50KXtnLmVsZW1lbnQuaGlkZSgpfWlmKGg9Yy5nZXQoZy5pZCkpe2MucmVtb3ZlQ2xhc3MoaC5maXJzdENoaWxkLGcuY2xhc3NQcmVmaXgrIkl0ZW1BY3RpdmUiKX1nLm9uSGlkZU1lbnUuZGlzcGF0Y2goZyl9LGFkZDpmdW5jdGlvbihpKXt2YXIgZz10aGlzLGg7aT1nLnBhcmVudChpKTtpZihnLmlzUmVuZGVyZWQmJihoPWMuZ2V0KCJtZW51XyIrZy5pZCkpKXtnLl9hZGQoYy5zZWxlY3QoInRib2R5IixoKVswXSxpKX1yZXR1cm4gaX0sY29sbGFwc2U6ZnVuY3Rpb24oZyl7dGhpcy5wYXJlbnQoZyk7dGhpcy5oaWRlTWVudSgxKX0scmVtb3ZlOmZ1bmN0aW9uKGcpe2MucmVtb3ZlKGcuaWQpO3RoaXMuZGVzdHJveSgpO3JldHVybiB0aGlzLnBhcmVudChnKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBnPXRoaXMsaD1jLmdldCgibWVudV8iK2cuaWQpO2EucmVtb3ZlKGgsIm1vdXNlb3ZlciIsZy5tb3VzZU92ZXJGdW5jKTthLnJlbW92ZShoLCJjbGljayIsZy5tb3VzZUNsaWNrRnVuYyk7aWYoZy5lbGVtZW50KXtnLmVsZW1lbnQucmVtb3ZlKCl9Yy5yZW1vdmUoaCl9LHJlbmRlck5vZGU6ZnVuY3Rpb24oKXt2YXIgaT10aGlzLGo9aS5zZXR0aW5ncyxsLGgsayxnO2c9Yy5jcmVhdGUoImRpdiIse2lkOiJtZW51XyIraS5pZCwiY2xhc3MiOmpbImNsYXNzIl0sc3R5bGU6InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt6LWluZGV4OjIwMDAwMCJ9KTtrPWMuYWRkKGcsImRpdiIse2lkOiJtZW51XyIraS5pZCsiX2NvIiwiY2xhc3MiOmkuY2xhc3NQcmVmaXgrKGpbImNsYXNzIl0/IiAiK2pbImNsYXNzIl06IiIpfSk7aS5lbGVtZW50PW5ldyBiKCJtZW51XyIraS5pZCx7YmxvY2tlcjoxLGNvbnRhaW5lcjpqLmNvbnRhaW5lcn0pO2lmKGoubWVudV9saW5lKXtjLmFkZChrLCJzcGFuIix7ImNsYXNzIjppLmNsYXNzUHJlZml4KyJMaW5lIn0pfWw9Yy5hZGQoaywidGFibGUiLHtpZDoibWVudV8iK2kuaWQrIl90YmwiLGJvcmRlcjowLGNlbGxQYWRkaW5nOjAsY2VsbFNwYWNpbmc6MH0pO2g9Yy5hZGQobCwidGJvZHkiKTtmKGkuaXRlbXMsZnVuY3Rpb24obSl7aS5fYWRkKGgsbSl9KTtpLnJlbmRlcmVkPXRydWU7cmV0dXJuIGd9LF9rZXlIYW5kbGVyOmZ1bmN0aW9uKGope3ZhciBpPXRoaXMsaD1qLmtleUNvZGU7ZnVuY3Rpb24gZyhtKXt2YXIgaz1pLl9mb2N1c0lkeCttLGw9Yy5zZWxlY3QoImEiLCJtZW51XyIraS5pZClba107aWYobCl7aS5fZm9jdXNJZHg9aztsLmZvY3VzKCl9fXN3aXRjaChoKXtjYXNlIDM4OmcoLTEpO3JldHVybjtjYXNlIDQwOmcoMSk7cmV0dXJuO2Nhc2UgMTM6cmV0dXJuO2Nhc2UgMjc6cmV0dXJuIHRoaXMuaGlkZU1lbnUoKX19LF9hZGQ6ZnVuY3Rpb24oaixoKXt2YXIgaSxxPWguc2V0dGluZ3MscCxsLGssbT10aGlzLmNsYXNzUHJlZml4LGc7aWYocS5zZXBhcmF0b3Ipe2w9Yy5hZGQoaiwidHIiLHtpZDpoLmlkLCJjbGFzcyI6bSsiSXRlbVNlcGFyYXRvciJ9KTtjLmFkZChsLCJ0ZCIseyJjbGFzcyI6bSsiSXRlbVNlcGFyYXRvciJ9KTtpZihpPWwucHJldmlvdXNTaWJsaW5nKXtjLmFkZENsYXNzKGksIm1jZUxhc3QiKX1yZXR1cm59aT1sPWMuYWRkKGosInRyIix7aWQ6aC5pZCwiY2xhc3MiOm0rIkl0ZW0gIittKyJJdGVtRW5hYmxlZCJ9KTtpPWs9Yy5hZGQoaSwidGQiKTtpPXA9Yy5hZGQoaSwiYSIse2hyZWY6ImphdmFzY3JpcHQ6OyIsb25jbGljazoicmV0dXJuIGZhbHNlOyIsb25tb3VzZWRvd246InJldHVybiBmYWxzZTsifSk7Yy5hZGRDbGFzcyhrLHFbImNsYXNzIl0pO2c9Yy5hZGQoaSwic3BhbiIseyJjbGFzcyI6Im1jZUljb24iKyhxLmljb24/IiBtY2VfIitxLmljb246IiIpfSk7aWYocS5pY29uX3NyYyl7Yy5hZGQoZywiaW1nIix7c3JjOnEuaWNvbl9zcmN9KX1pPWMuYWRkKGkscS5lbGVtZW50fHwic3BhbiIseyJjbGFzcyI6Im1jZVRleHQiLHRpdGxlOmguc2V0dGluZ3MudGl0bGV9LGguc2V0dGluZ3MudGl0bGUpO2lmKGguc2V0dGluZ3Muc3R5bGUpe2Muc2V0QXR0cmliKGksInN0eWxlIixoLnNldHRpbmdzLnN0eWxlKX1pZihqLmNoaWxkTm9kZXMubGVuZ3RoPT0xKXtjLmFkZENsYXNzKGwsIm1jZUZpcnN0Iil9aWYoKGk9bC5wcmV2aW91c1NpYmxpbmcpJiZjLmhhc0NsYXNzKGksbSsiSXRlbVNlcGFyYXRvciIpKXtjLmFkZENsYXNzKGwsIm1jZUZpcnN0Iil9aWYoaC5jb2xsYXBzZSl7Yy5hZGRDbGFzcyhsLG0rIkl0ZW1TdWIiKX1pZihpPWwucHJldmlvdXNTaWJsaW5nKXtjLnJlbW92ZUNsYXNzKGksIm1jZUxhc3QiKX1jLmFkZENsYXNzKGwsIm1jZUxhc3QiKX19KX0pKHRpbnltY2UpOyhmdW5jdGlvbihiKXt2YXIgYT1iLkRPTTtiLmNyZWF0ZSgidGlueW1jZS51aS5CdXR0b246dGlueW1jZS51aS5Db250cm9sIix7QnV0dG9uOmZ1bmN0aW9uKGQsYyl7dGhpcy5wYXJlbnQoZCxjKTt0aGlzLmNsYXNzUHJlZml4PSJtY2VCdXR0b24ifSxyZW5kZXJIVE1MOmZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5jbGFzc1ByZWZpeCxlPXRoaXMuc2V0dGluZ3MsZCxjO2M9YS5lbmNvZGUoZS5sYWJlbHx8IiIpO2Q9JzxhIGlkPSInK3RoaXMuaWQrJyIgaHJlZj0iamF2YXNjcmlwdDo7IiBjbGFzcz0iJytmKyIgIitmKyJFbmFibGVkICIrZVsiY2xhc3MiXSsoYz8iICIrZisiTGFiZWxlZCI6IiIpKyciIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7IiBvbmNsaWNrPSJyZXR1cm4gZmFsc2U7IiB0aXRsZT0iJythLmVuY29kZShlLnRpdGxlKSsnIj4nO2lmKGUuaW1hZ2Upe2QrPSc8aW1nIGNsYXNzPSJtY2VJY29uIiBzcmM9IicrZS5pbWFnZSsnIiAvPicrYysiPC9hPiJ9ZWxzZXtkKz0nPHNwYW4gY2xhc3M9Im1jZUljb24gJytlWyJjbGFzcyJdKyciPjwvc3Bhbj4nKyhjPyc8c3BhbiBjbGFzcz0iJytmKydMYWJlbCI+JytjKyI8L3NwYW4+IjoiIikrIjwvYT4ifXJldHVybiBkfSxwb3N0UmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGM9dGhpcyxkPWMuc2V0dGluZ3M7Yi5kb20uRXZlbnQuYWRkKGMuaWQsImNsaWNrIixmdW5jdGlvbihmKXtpZighYy5pc0Rpc2FibGVkKCkpe3JldHVybiBkLm9uY2xpY2suY2FsbChkLnNjb3BlLGYpfX0pfX0pfSkodGlueW1jZSk7KGZ1bmN0aW9uKGQpe3ZhciBjPWQuRE9NLGI9ZC5kb20uRXZlbnQsZT1kLmVhY2gsYT1kLnV0aWwuRGlzcGF0Y2hlcjtkLmNyZWF0ZSgidGlueW1jZS51aS5MaXN0Qm94OnRpbnltY2UudWkuQ29udHJvbCIse0xpc3RCb3g6ZnVuY3Rpb24oaCxnKXt2YXIgZj10aGlzO2YucGFyZW50KGgsZyk7Zi5pdGVtcz1bXTtmLm9uQ2hhbmdlPW5ldyBhKGYpO2Yub25Qb3N0UmVuZGVyPW5ldyBhKGYpO2Yub25BZGQ9bmV3IGEoZik7Zi5vblJlbmRlck1lbnU9bmV3IGQudXRpbC5EaXNwYXRjaGVyKHRoaXMpO2YuY2xhc3NQcmVmaXg9Im1jZUxpc3RCb3gifSxzZWxlY3Q6ZnVuY3Rpb24oaCl7dmFyIGc9dGhpcyxqLGk7aWYoaD09dW5kZWZpbmVkKXtyZXR1cm4gZy5zZWxlY3RCeUluZGV4KC0xKX1pZihoJiZoLmNhbGwpe2k9aH1lbHNle2k9ZnVuY3Rpb24oZil7cmV0dXJuIGY9PWh9fWlmKGghPWcuc2VsZWN0ZWRWYWx1ZSl7ZShnLml0ZW1zLGZ1bmN0aW9uKGssZil7aWYoaShrLnZhbHVlKSl7aj0xO2cuc2VsZWN0QnlJbmRleChmKTtyZXR1cm4gZmFsc2V9fSk7aWYoIWope2cuc2VsZWN0QnlJbmRleCgtMSl9fX0sc2VsZWN0QnlJbmRleDpmdW5jdGlvbihmKXt2YXIgZz10aGlzLGgsaTtpZihmIT1nLnNlbGVjdGVkSW5kZXgpe2g9Yy5nZXQoZy5pZCsiX3RleHQiKTtpPWcuaXRlbXNbZl07aWYoaSl7Zy5zZWxlY3RlZFZhbHVlPWkudmFsdWU7Zy5zZWxlY3RlZEluZGV4PWY7Yy5zZXRIVE1MKGgsYy5lbmNvZGUoaS50aXRsZSkpO2MucmVtb3ZlQ2xhc3MoaCwibWNlVGl0bGUiKX1lbHNle2Muc2V0SFRNTChoLGMuZW5jb2RlKGcuc2V0dGluZ3MudGl0bGUpKTtjLmFkZENsYXNzKGgsIm1jZVRpdGxlIik7Zy5zZWxlY3RlZFZhbHVlPWcuc2VsZWN0ZWRJbmRleD1udWxsfWg9MH19LGFkZDpmdW5jdGlvbihpLGYsaCl7dmFyIGc9dGhpcztoPWh8fHt9O2g9ZC5leHRlbmQoaCx7dGl0bGU6aSx2YWx1ZTpmfSk7Zy5pdGVtcy5wdXNoKGgpO2cub25BZGQuZGlzcGF0Y2goZyxoKX0sZ2V0TGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RofSxyZW5kZXJIVE1MOmZ1bmN0aW9uKCl7dmFyIGk9IiIsZj10aGlzLGc9Zi5zZXR0aW5ncyxqPWYuY2xhc3NQcmVmaXg7aT0nPHRhYmxlIGlkPSInK2YuaWQrJyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0iJytqKyIgIitqKyJFbmFibGVkIisoZ1siY2xhc3MiXT8oIiAiK2dbImNsYXNzIl0pOiIiKSsnIj48dGJvZHk+PHRyPic7aSs9Ijx0ZD4iK2MuY3JlYXRlSFRNTCgiYSIse2lkOmYuaWQrIl90ZXh0IixocmVmOiJqYXZhc2NyaXB0OjsiLCJjbGFzcyI6Im1jZVRleHQiLG9uY2xpY2s6InJldHVybiBmYWxzZTsiLG9ubW91c2Vkb3duOiJyZXR1cm4gZmFsc2U7In0sYy5lbmNvZGUoZi5zZXR0aW5ncy50aXRsZSkpKyI8L3RkPiI7aSs9Ijx0ZD4iK2MuY3JlYXRlSFRNTCgiYSIse2lkOmYuaWQrIl9vcGVuIix0YWJpbmRleDotMSxocmVmOiJqYXZhc2NyaXB0OjsiLCJjbGFzcyI6Im1jZU9wZW4iLG9uY2xpY2s6InJldHVybiBmYWxzZTsiLG9ubW91c2Vkb3duOiJyZXR1cm4gZmFsc2U7In0sIjxzcGFuPjwvc3Bhbj4iKSsiPC90ZD4iO2krPSI8L3RyPjwvdGJvZHk+PC90YWJsZT4iO3JldHVybiBpfSxzaG93TWVudTpmdW5jdGlvbigpe3ZhciBnPXRoaXMsaixpLGg9Yy5nZXQodGhpcy5pZCksZjtpZihnLmlzRGlzYWJsZWQoKXx8Zy5pdGVtcy5sZW5ndGg9PTApe3JldHVybn1pZihnLm1lbnUmJmcubWVudS5pc01lbnVWaXNpYmxlKXtyZXR1cm4gZy5oaWRlTWVudSgpfWlmKCFnLmlzTWVudVJlbmRlcmVkKXtnLnJlbmRlck1lbnUoKTtnLmlzTWVudVJlbmRlcmVkPXRydWV9aj1jLmdldFBvcyh0aGlzLnNldHRpbmdzLm1lbnVfY29udGFpbmVyKTtpPWMuZ2V0UG9zKGgpO2Y9Zy5tZW51O2Yuc2V0dGluZ3Mub2Zmc2V0X3g9aS54O2Yuc2V0dGluZ3Mub2Zmc2V0X3k9aS55O2Yuc2V0dGluZ3Mua2V5Ym9hcmRfZm9jdXM9IWQuaXNPcGVyYTtpZihnLm9sZElEKXtmLml0ZW1zW2cub2xkSURdLnNldFNlbGVjdGVkKDApfWUoZy5pdGVtcyxmdW5jdGlvbihrKXtpZihrLnZhbHVlPT09Zy5zZWxlY3RlZFZhbHVlKXtmLml0ZW1zW2suaWRdLnNldFNlbGVjdGVkKDEpO2cub2xkSUQ9ay5pZH19KTtmLnNob3dNZW51KDAsaC5jbGllbnRIZWlnaHQpO2IuYWRkKGMuZG9jLCJtb3VzZWRvd24iLGcuaGlkZU1lbnUsZyk7Yy5hZGRDbGFzcyhnLmlkLGcuY2xhc3NQcmVmaXgrIlNlbGVjdGVkIil9LGhpZGVNZW51OmZ1bmN0aW9uKGcpe3ZhciBmPXRoaXM7aWYoZi5tZW51JiZmLm1lbnUuaXNNZW51VmlzaWJsZSl7aWYoZyYmZy50eXBlPT0ibW91c2Vkb3duIiYmKGcudGFyZ2V0LmlkPT1mLmlkKyJfdGV4dCJ8fGcudGFyZ2V0LmlkPT1mLmlkKyJfb3BlbiIpKXtyZXR1cm59aWYoIWd8fCFjLmdldFBhcmVudChnLnRhcmdldCwiLm1jZU1lbnUiKSl7Yy5yZW1vdmVDbGFzcyhmLmlkLGYuY2xhc3NQcmVmaXgrIlNlbGVjdGVkIik7Yi5yZW1vdmUoYy5kb2MsIm1vdXNlZG93biIsZi5oaWRlTWVudSxmKTtmLm1lbnUuaGlkZU1lbnUoKX19fSxyZW5kZXJNZW51OmZ1bmN0aW9uKCl7dmFyIGc9dGhpcyxmO2Y9Zy5zZXR0aW5ncy5jb250cm9sX21hbmFnZXIuY3JlYXRlRHJvcE1lbnUoZy5pZCsiX21lbnUiLHttZW51X2xpbmU6MSwiY2xhc3MiOmcuY2xhc3NQcmVmaXgrIk1lbnUgbWNlTm9JY29ucyIsbWF4X3dpZHRoOjE1MCxtYXhfaGVpZ2h0OjE1MH0pO2Yub25IaWRlTWVudS5hZGQoZy5oaWRlTWVudSxnKTtmLmFkZCh7dGl0bGU6Zy5zZXR0aW5ncy50aXRsZSwiY2xhc3MiOiJtY2VNZW51SXRlbVRpdGxlIixvbmNsaWNrOmZ1bmN0aW9uKCl7aWYoZy5zZXR0aW5ncy5vbnNlbGVjdCgiIikhPT1mYWxzZSl7Zy5zZWxlY3QoIiIpfX19KTtlKGcuaXRlbXMsZnVuY3Rpb24oaCl7aWYoaC52YWx1ZT09PXVuZGVmaW5lZCl7Zi5hZGQoe3RpdGxlOmgudGl0bGUsImNsYXNzIjoibWNlTWVudUl0ZW1UaXRsZSIsb25jbGljazpmdW5jdGlvbigpe2lmKGcuc2V0dGluZ3Mub25zZWxlY3QoIiIpIT09ZmFsc2Upe2cuc2VsZWN0KCIiKX19fSl9ZWxzZXtoLmlkPWMudW5pcXVlSWQoKTtoLm9uY2xpY2s9ZnVuY3Rpb24oKXtpZihnLnNldHRpbmdzLm9uc2VsZWN0KGgudmFsdWUpIT09ZmFsc2Upe2cuc2VsZWN0KGgudmFsdWUpfX07Zi5hZGQoaCl9fSk7Zy5vblJlbmRlck1lbnUuZGlzcGF0Y2goZyxmKTtnLm1lbnU9Zn0scG9zdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBmPXRoaXMsZz1mLmNsYXNzUHJlZml4O2IuYWRkKGYuaWQsImNsaWNrIixmLnNob3dNZW51LGYpO2IuYWRkKGYuaWQrIl90ZXh0IiwiZm9jdXMiLGZ1bmN0aW9uKCl7aWYoIWYuX2ZvY3VzZWQpe2Yua2V5RG93bkhhbmRsZXI9Yi5hZGQoZi5pZCsiX3RleHQiLCJrZXlkb3duIixmdW5jdGlvbihrKXt2YXIgaD0tMSxpLGo9ay5rZXlDb2RlO2UoZi5pdGVtcyxmdW5jdGlvbihsLG0pe2lmKGYuc2VsZWN0ZWRWYWx1ZT09bC52YWx1ZSl7aD1tfX0pO2lmKGo9PTM4KXtpPWYuaXRlbXNbaC0xXX1lbHNle2lmKGo9PTQwKXtpPWYuaXRlbXNbaCsxXX1lbHNle2lmKGo9PTEzKXtpPWYuc2VsZWN0ZWRWYWx1ZTtmLnNlbGVjdGVkVmFsdWU9bnVsbDtmLnNldHRpbmdzLm9uc2VsZWN0KGkpO3JldHVybiBiLmNhbmNlbChrKX19fWlmKGkpe2YuaGlkZU1lbnUoKTtmLnNlbGVjdChpLnZhbHVlKX19KX1mLl9mb2N1c2VkPTF9KTtiLmFkZChmLmlkKyJfdGV4dCIsImJsdXIiLGZ1bmN0aW9uKCl7Yi5yZW1vdmUoZi5pZCsiX3RleHQiLCJrZXlkb3duIixmLmtleURvd25IYW5kbGVyKTtmLl9mb2N1c2VkPTB9KTtpZihkLmlzSUU2fHwhYy5ib3hNb2RlbCl7Yi5hZGQoZi5pZCwibW91c2VvdmVyIixmdW5jdGlvbigpe2lmKCFjLmhhc0NsYXNzKGYuaWQsZysiRGlzYWJsZWQiKSl7Yy5hZGRDbGFzcyhmLmlkLGcrIkhvdmVyIil9fSk7Yi5hZGQoZi5pZCwibW91c2VvdXQiLGZ1bmN0aW9uKCl7aWYoIWMuaGFzQ2xhc3MoZi5pZCxnKyJEaXNhYmxlZCIpKXtjLnJlbW92ZUNsYXNzKGYuaWQsZysiSG92ZXIiKX19KX1mLm9uUG9zdFJlbmRlci5kaXNwYXRjaChmLGMuZ2V0KGYuaWQpKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMucGFyZW50KCk7Yi5jbGVhcih0aGlzLmlkKyJfdGV4dCIpO2IuY2xlYXIodGhpcy5pZCsiX29wZW4iKX19KX0pKHRpbnltY2UpOyhmdW5jdGlvbihkKXt2YXIgYz1kLkRPTSxiPWQuZG9tLkV2ZW50LGU9ZC5lYWNoLGE9ZC51dGlsLkRpc3BhdGNoZXI7ZC5jcmVhdGUoInRpbnltY2UudWkuTmF0aXZlTGlzdEJveDp0aW55bWNlLnVpLkxpc3RCb3giLHtOYXRpdmVMaXN0Qm94OmZ1bmN0aW9uKGcsZil7dGhpcy5wYXJlbnQoZyxmKTt0aGlzLmNsYXNzUHJlZml4PSJtY2VOYXRpdmVMaXN0Qm94In0sc2V0RGlzYWJsZWQ6ZnVuY3Rpb24oZil7Yy5nZXQodGhpcy5pZCkuZGlzYWJsZWQ9Zn0saXNEaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiBjLmdldCh0aGlzLmlkKS5kaXNhYmxlZH0sc2VsZWN0OmZ1bmN0aW9uKGgpe3ZhciBnPXRoaXMsaixpO2lmKGg9PXVuZGVmaW5lZCl7cmV0dXJuIGcuc2VsZWN0QnlJbmRleCgtMSl9aWYoaCYmaC5jYWxsKXtpPWh9ZWxzZXtpPWZ1bmN0aW9uKGYpe3JldHVybiBmPT1ofX1pZihoIT1nLnNlbGVjdGVkVmFsdWUpe2UoZy5pdGVtcyxmdW5jdGlvbihrLGYpe2lmKGkoay52YWx1ZSkpe2o9MTtnLnNlbGVjdEJ5SW5kZXgoZik7cmV0dXJuIGZhbHNlfX0pO2lmKCFqKXtnLnNlbGVjdEJ5SW5kZXgoLTEpfX19LHNlbGVjdEJ5SW5kZXg6ZnVuY3Rpb24oZil7Yy5nZXQodGhpcy5pZCkuc2VsZWN0ZWRJbmRleD1mKzE7dGhpcy5zZWxlY3RlZFZhbHVlPXRoaXMuaXRlbXNbZl0/dGhpcy5pdGVtc1tmXS52YWx1ZTpudWxsfSxhZGQ6ZnVuY3Rpb24oaixnLGYpe3ZhciBpLGg9dGhpcztmPWZ8fHt9O2YudmFsdWU9ZztpZihoLmlzUmVuZGVyZWQoKSl7Yy5hZGQoYy5nZXQodGhpcy5pZCksIm9wdGlvbiIsZixqKX1pPXt0aXRsZTpqLHZhbHVlOmcsYXR0cmliczpmfTtoLml0ZW1zLnB1c2goaSk7aC5vbkFkZC5kaXNwYXRjaChoLGkpfSxnZXRMZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGh9LHJlbmRlckhUTUw6ZnVuY3Rpb24oKXt2YXIgZyxmPXRoaXM7Zz1jLmNyZWF0ZUhUTUwoIm9wdGlvbiIse3ZhbHVlOiIifSwiLS0gIitmLnNldHRpbmdzLnRpdGxlKyIgLS0iKTtlKGYuaXRlbXMsZnVuY3Rpb24oaCl7Zys9Yy5jcmVhdGVIVE1MKCJvcHRpb24iLHt2YWx1ZTpoLnZhbHVlfSxoLnRpdGxlKX0pO2c9Yy5jcmVhdGVIVE1MKCJzZWxlY3QiLHtpZDpmLmlkLCJjbGFzcyI6Im1jZU5hdGl2ZUxpc3RCb3gifSxnKTtyZXR1cm4gZ30scG9zdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBnPXRoaXMsaDtnLnJlbmRlcmVkPXRydWU7ZnVuY3Rpb24gZihqKXt2YXIgaT1nLml0ZW1zW2oudGFyZ2V0LnNlbGVjdGVkSW5kZXgtMV07aWYoaSYmKGk9aS52YWx1ZSkpe2cub25DaGFuZ2UuZGlzcGF0Y2goZyxpKTtpZihnLnNldHRpbmdzLm9uc2VsZWN0KXtnLnNldHRpbmdzLm9uc2VsZWN0KGkpfX19Yi5hZGQoZy5pZCwiY2hhbmdlIixmKTtiLmFkZChnLmlkLCJrZXlkb3duIixmdW5jdGlvbihqKXt2YXIgaTtiLnJlbW92ZShnLmlkLCJjaGFuZ2UiLGgpO2k9Yi5hZGQoZy5pZCwiYmx1ciIsZnVuY3Rpb24oKXtiLmFkZChnLmlkLCJjaGFuZ2UiLGYpO2IucmVtb3ZlKGcuaWQsImJsdXIiLGkpfSk7aWYoai5rZXlDb2RlPT0xM3x8ai5rZXlDb2RlPT0zMil7ZihqKTtyZXR1cm4gYi5jYW5jZWwoail9fSk7Zy5vblBvc3RSZW5kZXIuZGlzcGF0Y2goZyxjLmdldChnLmlkKSl9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYyl7dmFyIGI9Yy5ET00sYT1jLmRvbS5FdmVudCxkPWMuZWFjaDtjLmNyZWF0ZSgidGlueW1jZS51aS5NZW51QnV0dG9uOnRpbnltY2UudWkuQnV0dG9uIix7TWVudUJ1dHRvbjpmdW5jdGlvbihmLGUpe3RoaXMucGFyZW50KGYsZSk7dGhpcy5vblJlbmRlck1lbnU9bmV3IGMudXRpbC5EaXNwYXRjaGVyKHRoaXMpO2UubWVudV9jb250YWluZXI9ZS5tZW51X2NvbnRhaW5lcnx8Yi5kb2MuYm9keX0sc2hvd01lbnU6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLGosaSxoPWIuZ2V0KGcuaWQpLGY7aWYoZy5pc0Rpc2FibGVkKCkpe3JldHVybn1pZighZy5pc01lbnVSZW5kZXJlZCl7Zy5yZW5kZXJNZW51KCk7Zy5pc01lbnVSZW5kZXJlZD10cnVlfWlmKGcuaXNNZW51VmlzaWJsZSl7cmV0dXJuIGcuaGlkZU1lbnUoKX1qPWIuZ2V0UG9zKGcuc2V0dGluZ3MubWVudV9jb250YWluZXIpO2k9Yi5nZXRQb3MoaCk7Zj1nLm1lbnU7Zi5zZXR0aW5ncy5vZmZzZXRfeD1pLng7Zi5zZXR0aW5ncy5vZmZzZXRfeT1pLnk7Zi5zZXR0aW5ncy52cF9vZmZzZXRfeD1pLng7Zi5zZXR0aW5ncy52cF9vZmZzZXRfeT1pLnk7Zi5zZXR0aW5ncy5rZXlib2FyZF9mb2N1cz1nLl9mb2N1c2VkO2Yuc2hvd01lbnUoMCxoLmNsaWVudEhlaWdodCk7YS5hZGQoYi5kb2MsIm1vdXNlZG93biIsZy5oaWRlTWVudSxnKTtnLnNldFN0YXRlKCJTZWxlY3RlZCIsMSk7Zy5pc01lbnVWaXNpYmxlPTF9LHJlbmRlck1lbnU6ZnVuY3Rpb24oKXt2YXIgZj10aGlzLGU7ZT1mLnNldHRpbmdzLmNvbnRyb2xfbWFuYWdlci5jcmVhdGVEcm9wTWVudShmLmlkKyJfbWVudSIse21lbnVfbGluZToxLCJjbGFzcyI6dGhpcy5jbGFzc1ByZWZpeCsiTWVudSIsaWNvbnM6Zi5zZXR0aW5ncy5pY29uc30pO2Uub25IaWRlTWVudS5hZGQoZi5oaWRlTWVudSxmKTtmLm9uUmVuZGVyTWVudS5kaXNwYXRjaChmLGUpO2YubWVudT1lfSxoaWRlTWVudTpmdW5jdGlvbihnKXt2YXIgZj10aGlzO2lmKGcmJmcudHlwZT09Im1vdXNlZG93biImJmIuZ2V0UGFyZW50KGcudGFyZ2V0LGZ1bmN0aW9uKGgpe3JldHVybiBoLmlkPT09Zi5pZHx8aC5pZD09PWYuaWQrIl9vcGVuIn0pKXtyZXR1cm59aWYoIWd8fCFiLmdldFBhcmVudChnLnRhcmdldCwiLm1jZU1lbnUiKSl7Zi5zZXRTdGF0ZSgiU2VsZWN0ZWQiLDApO2EucmVtb3ZlKGIuZG9jLCJtb3VzZWRvd24iLGYuaGlkZU1lbnUsZik7aWYoZi5tZW51KXtmLm1lbnUuaGlkZU1lbnUoKX19Zi5pc01lbnVWaXNpYmxlPTB9LHBvc3RSZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGY9ZS5zZXR0aW5nczthLmFkZChlLmlkLCJjbGljayIsZnVuY3Rpb24oKXtpZighZS5pc0Rpc2FibGVkKCkpe2lmKGYub25jbGljayl7Zi5vbmNsaWNrKGUudmFsdWUpfWUuc2hvd01lbnUoKX19KX19KX0pKHRpbnltY2UpOyhmdW5jdGlvbihjKXt2YXIgYj1jLkRPTSxhPWMuZG9tLkV2ZW50LGQ9Yy5lYWNoO2MuY3JlYXRlKCJ0aW55bWNlLnVpLlNwbGl0QnV0dG9uOnRpbnltY2UudWkuTWVudUJ1dHRvbiIse1NwbGl0QnV0dG9uOmZ1bmN0aW9uKGYsZSl7dGhpcy5wYXJlbnQoZixlKTt0aGlzLmNsYXNzUHJlZml4PSJtY2VTcGxpdEJ1dHRvbiJ9LHJlbmRlckhUTUw6ZnVuY3Rpb24oKXt2YXIgaSxmPXRoaXMsZz1mLnNldHRpbmdzLGU7aT0iPHRib2R5Pjx0cj4iO2lmKGcuaW1hZ2Upe2U9Yi5jcmVhdGVIVE1MKCJpbWcgIix7c3JjOmcuaW1hZ2UsImNsYXNzIjoibWNlQWN0aW9uICIrZ1siY2xhc3MiXX0pfWVsc2V7ZT1iLmNyZWF0ZUhUTUwoInNwYW4iLHsiY2xhc3MiOiJtY2VBY3Rpb24gIitnWyJjbGFzcyJdfSwiIil9aSs9Ijx0ZD4iK2IuY3JlYXRlSFRNTCgiYSIse2lkOmYuaWQrIl9hY3Rpb24iLGhyZWY6ImphdmFzY3JpcHQ6OyIsImNsYXNzIjoibWNlQWN0aW9uICIrZ1siY2xhc3MiXSxvbmNsaWNrOiJyZXR1cm4gZmFsc2U7Iixvbm1vdXNlZG93bjoicmV0dXJuIGZhbHNlOyIsdGl0bGU6Zy50aXRsZX0sZSkrIjwvdGQ+IjtlPWIuY3JlYXRlSFRNTCgic3BhbiIseyJjbGFzcyI6Im1jZU9wZW4gIitnWyJjbGFzcyJdfSk7aSs9Ijx0ZD4iK2IuY3JlYXRlSFRNTCgiYSIse2lkOmYuaWQrIl9vcGVuIixocmVmOiJqYXZhc2NyaXB0OjsiLCJjbGFzcyI6Im1jZU9wZW4gIitnWyJjbGFzcyJdLG9uY2xpY2s6InJldHVybiBmYWxzZTsiLG9ubW91c2Vkb3duOiJyZXR1cm4gZmFsc2U7Iix0aXRsZTpnLnRpdGxlfSxlKSsiPC90ZD4iO2krPSI8L3RyPjwvdGJvZHk+IjtyZXR1cm4gYi5jcmVhdGVIVE1MKCJ0YWJsZSIse2lkOmYuaWQsImNsYXNzIjoibWNlU3BsaXRCdXR0b24gbWNlU3BsaXRCdXR0b25FbmFibGVkICIrZ1siY2xhc3MiXSxjZWxscGFkZGluZzoiMCIsY2VsbHNwYWNpbmc6IjAiLG9ubW91c2Vkb3duOiJyZXR1cm4gZmFsc2U7Iix0aXRsZTpnLnRpdGxlfSxpKX0scG9zdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsZj1lLnNldHRpbmdzO2lmKGYub25jbGljayl7YS5hZGQoZS5pZCsiX2FjdGlvbiIsImNsaWNrIixmdW5jdGlvbigpe2lmKCFlLmlzRGlzYWJsZWQoKSl7Zi5vbmNsaWNrKGUudmFsdWUpfX0pfWEuYWRkKGUuaWQrIl9vcGVuIiwiY2xpY2siLGUuc2hvd01lbnUsZSk7YS5hZGQoZS5pZCsiX29wZW4iLCJmb2N1cyIsZnVuY3Rpb24oKXtlLl9mb2N1c2VkPTF9KTthLmFkZChlLmlkKyJfb3BlbiIsImJsdXIiLGZ1bmN0aW9uKCl7ZS5fZm9jdXNlZD0wfSk7aWYoYy5pc0lFNnx8IWIuYm94TW9kZWwpe2EuYWRkKGUuaWQsIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXtpZighYi5oYXNDbGFzcyhlLmlkLCJtY2VTcGxpdEJ1dHRvbkRpc2FibGVkIikpe2IuYWRkQ2xhc3MoZS5pZCwibWNlU3BsaXRCdXR0b25Ib3ZlciIpfX0pO2EuYWRkKGUuaWQsIm1vdXNlb3V0IixmdW5jdGlvbigpe2lmKCFiLmhhc0NsYXNzKGUuaWQsIm1jZVNwbGl0QnV0dG9uRGlzYWJsZWQiKSl7Yi5yZW1vdmVDbGFzcyhlLmlkLCJtY2VTcGxpdEJ1dHRvbkhvdmVyIil9fSl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQoKTthLmNsZWFyKHRoaXMuaWQrIl9hY3Rpb24iKTthLmNsZWFyKHRoaXMuaWQrIl9vcGVuIil9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oZCl7dmFyIGM9ZC5ET00sYT1kLmRvbS5FdmVudCxiPWQuaXMsZT1kLmVhY2g7ZC5jcmVhdGUoInRpbnltY2UudWkuQ29sb3JTcGxpdEJ1dHRvbjp0aW55bWNlLnVpLlNwbGl0QnV0dG9uIix7Q29sb3JTcGxpdEJ1dHRvbjpmdW5jdGlvbihoLGcpe3ZhciBmPXRoaXM7Zi5wYXJlbnQoaCxnKTtmLnNldHRpbmdzPWc9ZC5leHRlbmQoe2NvbG9yczoiMDAwMDAwLDk5MzMwMCwzMzMzMDAsMDAzMzAwLDAwMzM2NiwwMDAwODAsMzMzMzk5LDMzMzMzMyw4MDAwMDAsRkY2NjAwLDgwODAwMCwwMDgwMDAsMDA4MDgwLDAwMDBGRiw2NjY2OTksODA4MDgwLEZGMDAwMCxGRjk5MDAsOTlDQzAwLDMzOTk2NiwzM0NDQ0MsMzM2NkZGLDgwMDA4MCw5OTk5OTksRkYwMEZGLEZGQ0MwMCxGRkZGMDAsMDBGRjAwLDAwRkZGRiwwMENDRkYsOTkzMzY2LEMwQzBDMCxGRjk5Q0MsRkZDQzk5LEZGRkY5OSxDQ0ZGQ0MsQ0NGRkZGLDk5Q0NGRixDQzk5RkYsRkZGRkZGIixncmlkX3dpZHRoOjgsZGVmYXVsdF9jb2xvcjoiIzg4ODg4OCJ9LGYuc2V0dGluZ3MpO2Yub25TaG93TWVudT1uZXcgZC51dGlsLkRpc3BhdGNoZXIoZik7Zi5vbkhpZGVNZW51PW5ldyBkLnV0aWwuRGlzcGF0Y2hlcihmKTtmLnZhbHVlPWcuZGVmYXVsdF9jb2xvcn0sc2hvd01lbnU6ZnVuY3Rpb24oKXt2YXIgZj10aGlzLGcsaixpLGg7aWYoZi5pc0Rpc2FibGVkKCkpe3JldHVybn1pZighZi5pc01lbnVSZW5kZXJlZCl7Zi5yZW5kZXJNZW51KCk7Zi5pc01lbnVSZW5kZXJlZD10cnVlfWlmKGYuaXNNZW51VmlzaWJsZSl7cmV0dXJuIGYuaGlkZU1lbnUoKX1pPWMuZ2V0KGYuaWQpO2Muc2hvdyhmLmlkKyJfbWVudSIpO2MuYWRkQ2xhc3MoaSwibWNlU3BsaXRCdXR0b25TZWxlY3RlZCIpO2g9Yy5nZXRQb3MoaSk7Yy5zZXRTdHlsZXMoZi5pZCsiX21lbnUiLHtsZWZ0OmgueCx0b3A6aC55K2kuY2xpZW50SGVpZ2h0LHpJbmRleDoyMDAwMDB9KTtpPTA7YS5hZGQoYy5kb2MsIm1vdXNlZG93biIsZi5oaWRlTWVudSxmKTtmLm9uU2hvd01lbnUuZGlzcGF0Y2goZik7aWYoZi5fZm9jdXNlZCl7Zi5fa2V5SGFuZGxlcj1hLmFkZChmLmlkKyJfbWVudSIsImtleWRvd24iLGZ1bmN0aW9uKGspe2lmKGsua2V5Q29kZT09Mjcpe2YuaGlkZU1lbnUoKX19KTtjLnNlbGVjdCgiYSIsZi5pZCsiX21lbnUiKVswXS5mb2N1cygpfWYuaXNNZW51VmlzaWJsZT0xfSxoaWRlTWVudTpmdW5jdGlvbihnKXt2YXIgZj10aGlzO2lmKGcmJmcudHlwZT09Im1vdXNlZG93biImJmMuZ2V0UGFyZW50KGcudGFyZ2V0LGZ1bmN0aW9uKGgpe3JldHVybiBoLmlkPT09Zi5pZCsiX29wZW4ifSkpe3JldHVybn1pZighZ3x8IWMuZ2V0UGFyZW50KGcudGFyZ2V0LCIubWNlU3BsaXRCdXR0b25NZW51Iikpe2MucmVtb3ZlQ2xhc3MoZi5pZCwibWNlU3BsaXRCdXR0b25TZWxlY3RlZCIpO2EucmVtb3ZlKGMuZG9jLCJtb3VzZWRvd24iLGYuaGlkZU1lbnUsZik7YS5yZW1vdmUoZi5pZCsiX21lbnUiLCJrZXlkb3duIixmLl9rZXlIYW5kbGVyKTtjLmhpZGUoZi5pZCsiX21lbnUiKX1mLm9uSGlkZU1lbnUuZGlzcGF0Y2goZik7Zi5pc01lbnVWaXNpYmxlPTB9LHJlbmRlck1lbnU6ZnVuY3Rpb24oKXt2YXIgaz10aGlzLGYsaj0wLGw9ay5zZXR0aW5ncyxwLGgsbyxnO2c9Yy5hZGQobC5tZW51X2NvbnRhaW5lciwiZGl2Iix7aWQ6ay5pZCsiX21lbnUiLCJjbGFzcyI6bC5tZW51X2NsYXNzKyIgIitsWyJjbGFzcyJdLHN0eWxlOiJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOi0xMDAwcHg7In0pO2Y9Yy5hZGQoZywiZGl2Iix7ImNsYXNzIjpsWyJjbGFzcyJdKyIgbWNlU3BsaXRCdXR0b25NZW51In0pO2MuYWRkKGYsInNwYW4iLHsiY2xhc3MiOiJtY2VNZW51TGluZSJ9KTtwPWMuYWRkKGYsInRhYmxlIix7ImNsYXNzIjoibWNlQ29sb3JTcGxpdE1lbnUifSk7aD1jLmFkZChwLCJ0Ym9keSIpO2o9MDtlKGIobC5jb2xvcnMsImFycmF5Iik/bC5jb2xvcnM6bC5jb2xvcnMuc3BsaXQoIiwiKSxmdW5jdGlvbihpKXtpPWkucmVwbGFjZSgvXiMvLCIiKTtpZighai0tKXtvPWMuYWRkKGgsInRyIik7aj1sLmdyaWRfd2lkdGgtMX1wPWMuYWRkKG8sInRkIik7cD1jLmFkZChwLCJhIix7aHJlZjoiamF2YXNjcmlwdDo7IixzdHlsZTp7YmFja2dyb3VuZENvbG9yOiIjIitpfSxfbWNlX2NvbG9yOiIjIitpfSl9KTtpZihsLm1vcmVfY29sb3JzX2Z1bmMpe3A9Yy5hZGQoaCwidHIiKTtwPWMuYWRkKHAsInRkIix7Y29sc3BhbjpsLmdyaWRfd2lkdGgsImNsYXNzIjoibWNlTW9yZUNvbG9ycyJ9KTtwPWMuYWRkKHAsImEiLHtpZDprLmlkKyJfbW9yZSIsaHJlZjoiamF2YXNjcmlwdDo7IixvbmNsaWNrOiJyZXR1cm4gZmFsc2U7IiwiY2xhc3MiOiJtY2VNb3JlQ29sb3JzIn0sbC5tb3JlX2NvbG9yc190aXRsZSk7YS5hZGQocCwiY2xpY2siLGZ1bmN0aW9uKGkpe2wubW9yZV9jb2xvcnNfZnVuYy5jYWxsKGwubW9yZV9jb2xvcnNfc2NvcGV8fHRoaXMpO3JldHVybiBhLmNhbmNlbChpKX0pfWMuYWRkQ2xhc3MoZiwibWNlQ29sb3JTcGxpdE1lbnUiKTthLmFkZChrLmlkKyJfbWVudSIsImNsaWNrIixmdW5jdGlvbihpKXt2YXIgbTtpPWkudGFyZ2V0O2lmKGkubm9kZU5hbWU9PSJBIiYmKG09aS5nZXRBdHRyaWJ1dGUoIl9tY2VfY29sb3IiKSkpe2suc2V0Q29sb3IobSl9cmV0dXJuIGEuY2FuY2VsKGkpfSk7cmV0dXJuIGd9LHNldENvbG9yOmZ1bmN0aW9uKGcpe3ZhciBmPXRoaXM7Yy5zZXRTdHlsZShmLmlkKyJfcHJldmlldyIsImJhY2tncm91bmRDb2xvciIsZyk7Zi52YWx1ZT1nO2YuaGlkZU1lbnUoKTtmLnNldHRpbmdzLm9uc2VsZWN0KGcpfSxwb3N0UmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGY9dGhpcyxnPWYuaWQ7Zi5wYXJlbnQoKTtjLmFkZChnKyJfYWN0aW9uIiwiZGl2Iix7aWQ6ZysiX3ByZXZpZXciLCJjbGFzcyI6Im1jZUNvbG9yUHJldmlldyJ9KTtjLnNldFN0eWxlKGYuaWQrIl9wcmV2aWV3IiwiYmFja2dyb3VuZENvbG9yIixmLnZhbHVlKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMucGFyZW50KCk7YS5jbGVhcih0aGlzLmlkKyJfbWVudSIpO2EuY2xlYXIodGhpcy5pZCsiX21vcmUiKTtjLnJlbW92ZSh0aGlzLmlkKyJfbWVudSIpfX0pfSkodGlueW1jZSk7dGlueW1jZS5jcmVhdGUoInRpbnltY2UudWkuVG9vbGJhcjp0aW55bWNlLnVpLkNvbnRhaW5lciIse3JlbmRlckhUTUw6ZnVuY3Rpb24oKXt2YXIgbD10aGlzLGU9IiIsZyxqLGI9dGlueW1jZS5ET00sbT1sLnNldHRpbmdzLGQsYSxmLGs7az1sLmNvbnRyb2xzO2ZvcihkPTA7ZDxrLmxlbmd0aDtkKyspe2o9a1tkXTthPWtbZC0xXTtmPWtbZCsxXTtpZihkPT09MCl7Zz0ibWNlVG9vbGJhclN0YXJ0IjtpZihqLkJ1dHRvbil7Zys9IiBtY2VUb29sYmFyU3RhcnRCdXR0b24ifWVsc2V7aWYoai5TcGxpdEJ1dHRvbil7Zys9IiBtY2VUb29sYmFyU3RhcnRTcGxpdEJ1dHRvbiJ9ZWxzZXtpZihqLkxpc3RCb3gpe2crPSIgbWNlVG9vbGJhclN0YXJ0TGlzdEJveCJ9fX1lKz1iLmNyZWF0ZUhUTUwoInRkIix7ImNsYXNzIjpnfSxiLmNyZWF0ZUhUTUwoInNwYW4iLG51bGwsIjwhLS0gSUUgLS0+IikpfWlmKGEmJmouTGlzdEJveCl7aWYoYS5CdXR0b258fGEuU3BsaXRCdXR0b24pe2UrPWIuY3JlYXRlSFRNTCgidGQiLHsiY2xhc3MiOiJtY2VUb29sYmFyRW5kIn0sYi5jcmVhdGVIVE1MKCJzcGFuIixudWxsLCI8IS0tIElFIC0tPiIpKX19aWYoYi5zdGRNb2RlKXtlKz0nPHRkIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmUiPicrai5yZW5kZXJIVE1MKCkrIjwvdGQ+In1lbHNle2UrPSI8dGQ+IitqLnJlbmRlckhUTUwoKSsiPC90ZD4ifWlmKGYmJmouTGlzdEJveCl7aWYoZi5CdXR0b258fGYuU3BsaXRCdXR0b24pe2UrPWIuY3JlYXRlSFRNTCgidGQiLHsiY2xhc3MiOiJtY2VUb29sYmFyU3RhcnQifSxiLmNyZWF0ZUhUTUwoInNwYW4iLG51bGwsIjwhLS0gSUUgLS0+IikpfX19Zz0ibWNlVG9vbGJhckVuZCI7aWYoai5CdXR0b24pe2crPSIgbWNlVG9vbGJhckVuZEJ1dHRvbiJ9ZWxzZXtpZihqLlNwbGl0QnV0dG9uKXtnKz0iIG1jZVRvb2xiYXJFbmRTcGxpdEJ1dHRvbiJ9ZWxzZXtpZihqLkxpc3RCb3gpe2crPSIgbWNlVG9vbGJhckVuZExpc3RCb3gifX19ZSs9Yi5jcmVhdGVIVE1MKCJ0ZCIseyJjbGFzcyI6Z30sYi5jcmVhdGVIVE1MKCJzcGFuIixudWxsLCI8IS0tIElFIC0tPiIpKTtyZXR1cm4gYi5jcmVhdGVIVE1MKCJ0YWJsZSIse2lkOmwuaWQsImNsYXNzIjoibWNlVG9vbGJhciIrKG1bImNsYXNzIl0/IiAiK21bImNsYXNzIl06IiIpLGNlbGxwYWRkaW5nOiIwIixjZWxsc3BhY2luZzoiMCIsYWxpZ246bC5zZXR0aW5ncy5hbGlnbnx8IiJ9LCI8dGJvZHk+PHRyPiIrZSsiPC90cj48L3Rib2R5PiIpfX0pOyhmdW5jdGlvbihiKXt2YXIgYT1iLnV0aWwuRGlzcGF0Y2hlcixjPWIuZWFjaDtiLmNyZWF0ZSgidGlueW1jZS5BZGRPbk1hbmFnZXIiLHtBZGRPbk1hbmFnZXI6ZnVuY3Rpb24oKXt2YXIgZD10aGlzO2QuaXRlbXM9W107ZC51cmxzPXt9O2QubG9va3VwPXt9O2Qub25BZGQ9bmV3IGEoZCl9LGdldDpmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5sb29rdXBbZF19LHJlcXVpcmVMYW5nUGFjazpmdW5jdGlvbihlKXt2YXIgZD1iLnNldHRpbmdzO2lmKGQmJmQubGFuZ3VhZ2Upe2IuU2NyaXB0TG9hZGVyLmFkZCh0aGlzLnVybHNbZV0rIi9sYW5ncy8iK2QubGFuZ3VhZ2UrIi5qcyIpfX0sYWRkOmZ1bmN0aW9uKGUsZCl7dGhpcy5pdGVtcy5wdXNoKGQpO3RoaXMubG9va3VwW2VdPWQ7dGhpcy5vbkFkZC5kaXNwYXRjaCh0aGlzLGUsZCk7cmV0dXJuIGR9LGxvYWQ6ZnVuY3Rpb24oaCxlLGQsZyl7dmFyIGY9dGhpcztpZihmLnVybHNbaF0pe3JldHVybn1pZihlLmluZGV4T2YoIi8iKSE9MCYmZS5pbmRleE9mKCI6Ly8iKT09LTEpe2U9Yi5iYXNlVVJMKyIvIitlfWYudXJsc1toXT1lLnN1YnN0cmluZygwLGUubGFzdEluZGV4T2YoIi8iKSk7aWYoIWYubG9va3VwW2hdKXtiLlNjcmlwdExvYWRlci5hZGQoZSxkLGcpfX19KTtiLlBsdWdpbk1hbmFnZXI9bmV3IGIuQWRkT25NYW5hZ2VyKCk7Yi5UaGVtZU1hbmFnZXI9bmV3IGIuQWRkT25NYW5hZ2VyKCl9KHRpbnltY2UpKTsoZnVuY3Rpb24oail7dmFyIGc9ai5lYWNoLGQ9ai5leHRlbmQsaz1qLkRPTSxpPWouZG9tLkV2ZW50LGY9ai5UaGVtZU1hbmFnZXIsYj1qLlBsdWdpbk1hbmFnZXIsZT1qLmV4cGxvZGUsaD1qLnV0aWwuRGlzcGF0Y2hlcixhLGM9MDtqLmRvY3VtZW50QmFzZVVSTD13aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKC9bXD8jXS4qJC8sIiIpLnJlcGxhY2UoL1tcL1xcXVteXC9dKyQvLCIiKTtpZighL1tcL1xcXSQvLnRlc3Qoai5kb2N1bWVudEJhc2VVUkwpKXtqLmRvY3VtZW50QmFzZVVSTCs9Ii8ifWouYmFzZVVSTD1uZXcgai51dGlsLlVSSShqLmRvY3VtZW50QmFzZVVSTCkudG9BYnNvbHV0ZShqLmJhc2VVUkwpO2ouYmFzZVVSST1uZXcgai51dGlsLlVSSShqLmJhc2VVUkwpO2oub25CZWZvcmVVbmxvYWQ9bmV3IGgoaik7aS5hZGQod2luZG93LCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKGwpe2oub25CZWZvcmVVbmxvYWQuZGlzcGF0Y2goaixsKX0pO2oub25BZGRFZGl0b3I9bmV3IGgoaik7ai5vblJlbW92ZUVkaXRvcj1uZXcgaChqKTtqLkVkaXRvck1hbmFnZXI9ZChqLHtlZGl0b3JzOltdLGkxOG46e30sYWN0aXZlRWRpdG9yOm51bGwsaW5pdDpmdW5jdGlvbihxKXt2YXIgbj10aGlzLHAsbD1qLlNjcmlwdExvYWRlcix1LG89W10sbTtmdW5jdGlvbiByKHgseSx0KXt2YXIgdj14W3ldO2lmKCF2KXtyZXR1cm59aWYoai5pcyh2LCJzdHJpbmciKSl7dD12LnJlcGxhY2UoL1wuXHcrJC8sIiIpO3Q9dD9qLnJlc29sdmUodCk6MDt2PWoucmVzb2x2ZSh2KX1yZXR1cm4gdi5hcHBseSh0fHx0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKSl9cT1kKHt0aGVtZToic2ltcGxlIixsYW5ndWFnZToiZW4ifSxxKTtuLnNldHRpbmdzPXE7aS5hZGQoZG9jdW1lbnQsImluaXQiLGZ1bmN0aW9uKCl7dmFyIHMsdjtyKHEsIm9ucGFnZWxvYWQiKTtzd2l0Y2gocS5tb2RlKXtjYXNlImV4YWN0IjpzPXEuZWxlbWVudHN8fCIiO2lmKHMubGVuZ3RoPjApe2coZShzKSxmdW5jdGlvbih4KXtpZihrLmdldCh4KSl7bT1uZXcgai5FZGl0b3IoeCxxKTtvLnB1c2gobSk7bS5yZW5kZXIoMSl9ZWxzZXtnKGRvY3VtZW50LmZvcm1zLGZ1bmN0aW9uKHkpe2coeS5lbGVtZW50cyxmdW5jdGlvbih6KXtpZih6Lm5hbWU9PT14KXt4PSJtY2VfZWRpdG9yXyIrYysrO2suc2V0QXR0cmliKHosImlkIix4KTttPW5ldyBqLkVkaXRvcih4LHEpO28ucHVzaChtKTttLnJlbmRlcigxKX19KX0pfX0pfWJyZWFrO2Nhc2UidGV4dGFyZWFzIjpjYXNlInNwZWNpZmljX3RleHRhcmVhcyI6ZnVuY3Rpb24gdCh5LHgpe3JldHVybiB4LmNvbnN0cnVjdG9yPT09UmVnRXhwP3gudGVzdCh5LmNsYXNzTmFtZSk6ay5oYXNDbGFzcyh5LHgpfWcoay5zZWxlY3QoInRleHRhcmVhIiksZnVuY3Rpb24oeCl7aWYocS5lZGl0b3JfZGVzZWxlY3RvciYmdCh4LHEuZWRpdG9yX2Rlc2VsZWN0b3IpKXtyZXR1cm59aWYoIXEuZWRpdG9yX3NlbGVjdG9yfHx0KHgscS5lZGl0b3Jfc2VsZWN0b3IpKXt1PWsuZ2V0KHgubmFtZSk7aWYoIXguaWQmJiF1KXt4LmlkPXgubmFtZX1pZigheC5pZHx8bi5nZXQoeC5pZCkpe3guaWQ9ay51bmlxdWVJZCgpfW09bmV3IGouRWRpdG9yKHguaWQscSk7by5wdXNoKG0pO20ucmVuZGVyKDEpfX0pO2JyZWFrfWlmKHEub25pbml0KXtzPXY9MDtnKG8sZnVuY3Rpb24oeCl7disrO2lmKCF4LmluaXRpYWxpemVkKXt4Lm9uSW5pdC5hZGQoZnVuY3Rpb24oKXtzKys7aWYocz09dil7cihxLCJvbmluaXQiKX19KX1lbHNle3MrK31pZihzPT12KXtyKHEsIm9uaW5pdCIpfX0pfX0pfSxnZXQ6ZnVuY3Rpb24obCl7aWYobD09PWEpe3JldHVybiB0aGlzLmVkaXRvcnN9cmV0dXJuIHRoaXMuZWRpdG9yc1tsXX0sZ2V0SW5zdGFuY2VCeUlkOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLmdldChsKX0sYWRkOmZ1bmN0aW9uKG0pe3ZhciBsPXRoaXMsbj1sLmVkaXRvcnM7blttLmlkXT1tO24ucHVzaChtKTtsLl9zZXRBY3RpdmUobSk7bC5vbkFkZEVkaXRvci5kaXNwYXRjaChsLG0pO3JldHVybiBtfSxyZW1vdmU6ZnVuY3Rpb24obil7dmFyIG09dGhpcyxsLG89bS5lZGl0b3JzO2lmKCFvW24uaWRdKXtyZXR1cm4gbnVsbH1kZWxldGUgb1tuLmlkXTtmb3IobD0wO2w8by5sZW5ndGg7bCsrKXtpZihvW2xdPT1uKXtvLnNwbGljZShsLDEpO2JyZWFrfX1pZihtLmFjdGl2ZUVkaXRvcj09bil7bS5fc2V0QWN0aXZlKG9bMF0pfW4uZGVzdHJveSgpO20ub25SZW1vdmVFZGl0b3IuZGlzcGF0Y2gobSxuKTtyZXR1cm4gbn0sZXhlY0NvbW1hbmQ6ZnVuY3Rpb24ocixwLG8pe3ZhciBxPXRoaXMsbj1xLmdldChvKSxsO3N3aXRjaChyKXtjYXNlIm1jZUZvY3VzIjpuLmZvY3VzKCk7cmV0dXJuIHRydWU7Y2FzZSJtY2VBZGRFZGl0b3IiOmNhc2UibWNlQWRkQ29udHJvbCI6aWYoIXEuZ2V0KG8pKXtuZXcgai5FZGl0b3IobyxxLnNldHRpbmdzKS5yZW5kZXIoKX1yZXR1cm4gdHJ1ZTtjYXNlIm1jZUFkZEZyYW1lQ29udHJvbCI6bD1vLndpbmRvdztsLnRpbnlNQ0U9dGlueU1DRTtsLnRpbnltY2U9ajtqLkRPTS5kb2M9bC5kb2N1bWVudDtqLkRPTS53aW49bDtuPW5ldyBqLkVkaXRvcihvLmVsZW1lbnRfaWQsbyk7bi5yZW5kZXIoKTtpZihqLmlzSUUpe2Z1bmN0aW9uIG0oKXtuLmRlc3Ryb3koKTtsLmRldGFjaEV2ZW50KCJvbnVubG9hZCIsbSk7bD1sLnRpbnlNQ0U9bC50aW55bWNlPW51bGx9bC5hdHRhY2hFdmVudCgib251bmxvYWQiLG0pfW8ucGFnZV93aW5kb3c9bnVsbDtyZXR1cm4gdHJ1ZTtjYXNlIm1jZVJlbW92ZUVkaXRvciI6Y2FzZSJtY2VSZW1vdmVDb250cm9sIjppZihuKXtuLnJlbW92ZSgpfXJldHVybiB0cnVlO2Nhc2UibWNlVG9nZ2xlRWRpdG9yIjppZighbil7cS5leGVjQ29tbWFuZCgibWNlQWRkQ29udHJvbCIsMCxvKTtyZXR1cm4gdHJ1ZX1pZihuLmlzSGlkZGVuKCkpe24uc2hvdygpfWVsc2V7bi5oaWRlKCl9cmV0dXJuIHRydWV9aWYocS5hY3RpdmVFZGl0b3Ipe3JldHVybiBxLmFjdGl2ZUVkaXRvci5leGVjQ29tbWFuZChyLHAsbyl9cmV0dXJuIGZhbHNlfSxleGVjSW5zdGFuY2VDb21tYW5kOmZ1bmN0aW9uKHAsbyxuLG0pe3ZhciBsPXRoaXMuZ2V0KHApO2lmKGwpe3JldHVybiBsLmV4ZWNDb21tYW5kKG8sbixtKX1yZXR1cm4gZmFsc2V9LHRyaWdnZXJTYXZlOmZ1bmN0aW9uKCl7Zyh0aGlzLmVkaXRvcnMsZnVuY3Rpb24obCl7bC5zYXZlKCl9KX0sYWRkSTE4bjpmdW5jdGlvbihuLHEpe3ZhciBsLG09dGhpcy5pMThuO2lmKCFqLmlzKG4sInN0cmluZyIpKXtnKG4sZnVuY3Rpb24ocixwKXtnKHIsZnVuY3Rpb24odCxzKXtnKHQsZnVuY3Rpb24odix1KXtpZihzPT09ImNvbW1vbiIpe21bcCsiLiIrdV09dn1lbHNle21bcCsiLiIrcysiLiIrdV09dn19KX0pfSl9ZWxzZXtnKHEsZnVuY3Rpb24ocixwKXttW24rIi4iK3BdPXJ9KX19LF9zZXRBY3RpdmU6ZnVuY3Rpb24obCl7dGhpcy5zZWxlY3RlZEluc3RhbmNlPXRoaXMuYWN0aXZlRWRpdG9yPWx9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24obSl7dmFyIG49bS5ET00saj1tLmRvbS5FdmVudCxmPW0uZXh0ZW5kLGs9bS51dGlsLkRpc3BhdGNoZXIsaT1tLmVhY2gsYT1tLmlzR2Vja28sYj1tLmlzSUUsZT1tLmlzV2ViS2l0LGQ9bS5pcyxoPW0uVGhlbWVNYW5hZ2VyLGM9bS5QbHVnaW5NYW5hZ2VyLG89bS5pbkFycmF5LGw9bS5ncmVwLGc9bS5leHBsb2RlO20uY3JlYXRlKCJ0aW55bWNlLkVkaXRvciIse0VkaXRvcjpmdW5jdGlvbihyLHEpe3ZhciBwPXRoaXM7cC5pZD1wLmVkaXRvcklkPXI7cC5leGVjQ29tbWFuZHM9e307cC5xdWVyeVN0YXRlQ29tbWFuZHM9e307cC5xdWVyeVZhbHVlQ29tbWFuZHM9e307cC5pc05vdERpcnR5PWZhbHNlO3AucGx1Z2lucz17fTtpKFsib25QcmVJbml0Iiwib25CZWZvcmVSZW5kZXJVSSIsIm9uUG9zdFJlbmRlciIsIm9uSW5pdCIsIm9uUmVtb3ZlIiwib25BY3RpdmF0ZSIsIm9uRGVhY3RpdmF0ZSIsIm9uQ2xpY2siLCJvbkV2ZW50Iiwib25Nb3VzZVVwIiwib25Nb3VzZURvd24iLCJvbkRibENsaWNrIiwib25LZXlEb3duIiwib25LZXlVcCIsIm9uS2V5UHJlc3MiLCJvbkNvbnRleHRNZW51Iiwib25TdWJtaXQiLCJvblJlc2V0Iiwib25QYXN0ZSIsIm9uUHJlUHJvY2VzcyIsIm9uUG9zdFByb2Nlc3MiLCJvbkJlZm9yZVNldENvbnRlbnQiLCJvbkJlZm9yZUdldENvbnRlbnQiLCJvblNldENvbnRlbnQiLCJvbkdldENvbnRlbnQiLCJvbkxvYWRDb250ZW50Iiwib25TYXZlQ29udGVudCIsIm9uTm9kZUNoYW5nZSIsIm9uQ2hhbmdlIiwib25CZWZvcmVFeGVjQ29tbWFuZCIsIm9uRXhlY0NvbW1hbmQiLCJvblVuZG8iLCJvblJlZG8iLCJvblZpc3VhbEFpZCIsIm9uU2V0UHJvZ3Jlc3NTdGF0ZSJdLGZ1bmN0aW9uKHMpe3Bbc109bmV3IGsocCl9KTtwLnNldHRpbmdzPXE9Zih7aWQ6cixsYW5ndWFnZToiZW4iLGRvY3NfbGFuZ3VhZ2U6ImVuIix0aGVtZToic2ltcGxlIixza2luOiJkZWZhdWx0IixkZWx0YV93aWR0aDowLGRlbHRhX2hlaWdodDowLHBvcHVwX2NzczoiIixwbHVnaW5zOiIiLGRvY3VtZW50X2Jhc2VfdXJsOm0uZG9jdW1lbnRCYXNlVVJMLGFkZF9mb3JtX3N1Ym1pdF90cmlnZ2VyOjEsc3VibWl0X3BhdGNoOjEsYWRkX3VubG9hZF90cmlnZ2VyOjEsY29udmVydF91cmxzOjEscmVsYXRpdmVfdXJsczoxLHJlbW92ZV9zY3JpcHRfaG9zdDoxLHRhYmxlX2lubGluZV9lZGl0aW5nOjAsb2JqZWN0X3Jlc2l6aW5nOjEsY2xlYW51cDoxLGFjY2Vzc2liaWxpdHlfZm9jdXM6MSxjdXN0b21fc2hvcnRjdXRzOjEsY3VzdG9tX3VuZG9fcmVkb19rZXlib2FyZF9zaG9ydGN1dHM6MSxjdXN0b21fdW5kb19yZWRvX3Jlc3RvcmVfc2VsZWN0aW9uOjEsY3VzdG9tX3VuZG9fcmVkbzoxLGRvY3R5cGU6bS5pc0lFNj8nPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+JzoiPCFET0NUWVBFPiIsdmlzdWFsX3RhYmxlX2NsYXNzOiJtY2VJdGVtVGFibGUiLHZpc3VhbDoxLGZvbnRfc2l6ZV9zdHlsZV92YWx1ZXM6Inh4LXNtYWxsLHgtc21hbGwsc21hbGwsbWVkaXVtLGxhcmdlLHgtbGFyZ2UseHgtbGFyZ2UiLGFwcGx5X3NvdXJjZV9mb3JtYXR0aW5nOjEsZGlyZWN0aW9uYWxpdHk6Imx0ciIsZm9yY2VkX3Jvb3RfYmxvY2s6InAiLHZhbGlkX2VsZW1lbnRzOiJAW2lkfGNsYXNzfHN0eWxlfHRpdGxlfGRpcjxsdHI/cnRsfGxhbmd8eG1sOjpsYW5nfG9uY2xpY2t8b25kYmxjbGlja3xvbm1vdXNlZG93bnxvbm1vdXNldXB8b25tb3VzZW92ZXJ8b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbmtleXByZXNzfG9ua2V5ZG93bnxvbmtleXVwXSxhW3JlbHxyZXZ8Y2hhcnNldHxocmVmbGFuZ3x0YWJpbmRleHxhY2Nlc3NrZXl8dHlwZXxuYW1lfGhyZWZ8dGFyZ2V0fHRpdGxlfGNsYXNzfG9uZm9jdXN8b25ibHVyXSxzdHJvbmcvYixlbS9pLHN0cmlrZSx1LCNwLC1vbFt0eXBlfGNvbXBhY3RdLC11bFt0eXBlfGNvbXBhY3RdLC1saSxicixpbWdbbG9uZ2Rlc2N8dXNlbWFwfHNyY3xib3JkZXJ8YWx0PXx0aXRsZXxoc3BhY2V8dnNwYWNlfHdpZHRofGhlaWdodHxhbGlnbl0sLXN1Yiwtc3VwLC1ibG9ja3F1b3RlW2NpdGVdLC10YWJsZVtib3JkZXJ8Y2VsbHNwYWNpbmd8Y2VsbHBhZGRpbmd8d2lkdGh8ZnJhbWV8cnVsZXN8aGVpZ2h0fGFsaWdufHN1bW1hcnl8Ymdjb2xvcnxiYWNrZ3JvdW5kfGJvcmRlcmNvbG9yXSwtdHJbcm93c3Bhbnx3aWR0aHxoZWlnaHR8YWxpZ258dmFsaWdufGJnY29sb3J8YmFja2dyb3VuZHxib3JkZXJjb2xvcl0sdGJvZHksdGhlYWQsdGZvb3QsI3RkW2NvbHNwYW58cm93c3Bhbnx3aWR0aHxoZWlnaHR8YWxpZ258dmFsaWdufGJnY29sb3J8YmFja2dyb3VuZHxib3JkZXJjb2xvcnxzY29wZV0sI3RoW2NvbHNwYW58cm93c3Bhbnx3aWR0aHxoZWlnaHR8YWxpZ258dmFsaWdufHNjb3BlXSxjYXB0aW9uLC1kaXYsLXNwYW4sLWNvZGUsLXByZSxhZGRyZXNzLC1oMSwtaDIsLWgzLC1oNCwtaDUsLWg2LGhyW3NpemV8bm9zaGFkZV0sLWZvbnRbZmFjZXxzaXplfGNvbG9yXSxkZCxkbCxkdCxjaXRlLGFiYnIsYWNyb255bSxkZWxbZGF0ZXRpbWV8Y2l0ZV0saW5zW2RhdGV0aW1lfGNpdGVdLG9iamVjdFtjbGFzc2lkfHdpZHRofGhlaWdodHxjb2RlYmFzZXwqXSxwYXJhbVtuYW1lfHZhbHVlXSxlbWJlZFt0eXBlfHdpZHRofGhlaWdodHxzcmN8Kl0sc2NyaXB0W3NyY3x0eXBlXSxtYXBbbmFtZV0sYXJlYVtzaGFwZXxjb29yZHN8aHJlZnxhbHR8dGFyZ2V0XSxiZG8sYnV0dG9uLGNvbFthbGlnbnxjaGFyfGNoYXJvZmZ8c3Bhbnx2YWxpZ258d2lkdGhdLGNvbGdyb3VwW2FsaWdufGNoYXJ8Y2hhcm9mZnxzcGFufHZhbGlnbnx3aWR0aF0sZGZuLGZpZWxkc2V0LGZvcm1bYWN0aW9ufGFjY2VwdHxhY2NlcHQtY2hhcnNldHxlbmN0eXBlfG1ldGhvZF0saW5wdXRbYWNjZXB0fGFsdHxjaGVja2VkfGRpc2FibGVkfG1heGxlbmd0aHxuYW1lfHJlYWRvbmx5fHNpemV8c3JjfHR5cGV8dmFsdWV8dGFiaW5kZXh8YWNjZXNza2V5XSxrYmQsbGFiZWxbZm9yXSxsZWdlbmQsbm9zY3JpcHQsb3B0Z3JvdXBbbGFiZWx8ZGlzYWJsZWRdLG9wdGlvbltkaXNhYmxlZHxsYWJlbHxzZWxlY3RlZHx2YWx1ZV0scVtjaXRlXSxzYW1wLHNlbGVjdFtkaXNhYmxlZHxtdWx0aXBsZXxuYW1lfHNpemVdLHNtYWxsLHRleHRhcmVhW2NvbHN8cm93c3xkaXNhYmxlZHxuYW1lfHJlYWRvbmx5XSx0dCx2YXIsYmlnIixoaWRkZW5faW5wdXQ6MSxwYWRkX2VtcHR5X2VkaXRvcjoxLHJlbmRlcl91aToxLGluaXRfdGhlbWU6MSxmb3JjZV9wX25ld2xpbmVzOjEsaW5kZW50YXRpb246IjMwcHgiLGtlZXBfc3R5bGVzOjEsZml4X3RhYmxlX2VsZW1lbnRzOjEsaW5saW5lX3N0eWxlczoxLGNvbnZlcnRfZm9udHNfdG9fc3BhbnM6dHJ1ZX0scSk7cC5kb2N1bWVudEJhc2VVUkk9bmV3IG0udXRpbC5VUkkocS5kb2N1bWVudF9iYXNlX3VybHx8bS5kb2N1bWVudEJhc2VVUkwse2Jhc2VfdXJpOnRpbnlNQ0UuYmFzZVVSSX0pO3AuYmFzZVVSST1tLmJhc2VVUkk7cC5leGVjQ2FsbGJhY2soInNldHVwIixwKX0scmVuZGVyOmZ1bmN0aW9uKHIpe3ZhciB1PXRoaXMsdj11LnNldHRpbmdzLHg9dS5pZCxwPW0uU2NyaXB0TG9hZGVyO2lmKCFqLmRvbUxvYWRlZCl7ai5hZGQoZG9jdW1lbnQsImluaXQiLGZ1bmN0aW9uKCl7dS5yZW5kZXIoKX0pO3JldHVybn10aW55TUNFLnNldHRpbmdzPXY7aWYoIXUuZ2V0RWxlbWVudCgpKXtyZXR1cm59aWYobS5pc0lEZXZpY2Upe3JldHVybn1pZighL1RFWFRBUkVBfElOUFVUL2kudGVzdCh1LmdldEVsZW1lbnQoKS5ub2RlTmFtZSkmJnYuaGlkZGVuX2lucHV0JiZuLmdldFBhcmVudCh4LCJmb3JtIikpe24uaW5zZXJ0QWZ0ZXIobi5jcmVhdGUoImlucHV0Iix7dHlwZToiaGlkZGVuIixuYW1lOnh9KSx4KX1pZihtLldpbmRvd01hbmFnZXIpe3Uud2luZG93TWFuYWdlcj1uZXcgbS5XaW5kb3dNYW5hZ2VyKHUpfWlmKHYuZW5jb2Rpbmc9PSJ4bWwiKXt1Lm9uR2V0Q29udGVudC5hZGQoZnVuY3Rpb24ocyx0KXtpZih0LnNhdmUpe3QuY29udGVudD1uLmVuY29kZSh0LmNvbnRlbnQpfX0pfWlmKHYuYWRkX2Zvcm1fc3VibWl0X3RyaWdnZXIpe3Uub25TdWJtaXQuYWRkVG9Ub3AoZnVuY3Rpb24oKXtpZih1LmluaXRpYWxpemVkKXt1LnNhdmUoKTt1LmlzTm90RGlydHk9MX19KX1pZih2LmFkZF91bmxvYWRfdHJpZ2dlcil7dS5fYmVmb3JlVW5sb2FkPXRpbnlNQ0Uub25CZWZvcmVVbmxvYWQuYWRkKGZ1bmN0aW9uKCl7aWYodS5pbml0aWFsaXplZCYmIXUuZGVzdHJveWVkJiYhdS5pc0hpZGRlbigpKXt1LnNhdmUoe2Zvcm1hdDoicmF3Iixub19ldmVudHM6dHJ1ZX0pfX0pfW0uYWRkVW5sb2FkKHUuZGVzdHJveSx1KTtpZih2LnN1Ym1pdF9wYXRjaCl7dS5vbkJlZm9yZVJlbmRlclVJLmFkZChmdW5jdGlvbigpe3ZhciBzPXUuZ2V0RWxlbWVudCgpLmZvcm07aWYoIXMpe3JldHVybn1pZihzLl9tY2VPbGRTdWJtaXQpe3JldHVybn1pZighcy5zdWJtaXQubm9kZVR5cGUmJiFzLnN1Ym1pdC5sZW5ndGgpe3UuZm9ybUVsZW1lbnQ9cztzLl9tY2VPbGRTdWJtaXQ9cy5zdWJtaXQ7cy5zdWJtaXQ9ZnVuY3Rpb24oKXttLnRyaWdnZXJTYXZlKCk7dS5pc05vdERpcnR5PTE7cmV0dXJuIHUuZm9ybUVsZW1lbnQuX21jZU9sZFN1Ym1pdCh1LmZvcm1FbGVtZW50KX19cz1udWxsfSl9ZnVuY3Rpb24gcSgpe2lmKHYubGFuZ3VhZ2Upe3AuYWRkKG0uYmFzZVVSTCsiL2xhbmdzLyIrdi5sYW5ndWFnZSsiLmpzIil9aWYodi50aGVtZSYmdi50aGVtZS5jaGFyQXQoMCkhPSItIiYmIWgudXJsc1t2LnRoZW1lXSl7aC5sb2FkKHYudGhlbWUsInRoZW1lcy8iK3YudGhlbWUrIi9lZGl0b3JfdGVtcGxhdGUiK20uc3VmZml4KyIuanMiKX1pKGcodi5wbHVnaW5zKSxmdW5jdGlvbihzKXtpZihzJiZzLmNoYXJBdCgwKSE9Ii0iJiYhYy51cmxzW3NdKXtpZihzPT0ic2FmYXJpIil7cmV0dXJufWMubG9hZChzLCJwbHVnaW5zLyIrcysiL2VkaXRvcl9wbHVnaW4iK20uc3VmZml4KyIuanMiKX19KTtwLmxvYWRRdWV1ZShmdW5jdGlvbigpe2lmKCF1LnJlbW92ZWQpe3UuaW5pdCgpfX0pfXEoKX0saW5pdDpmdW5jdGlvbigpe3ZhciByLEU9dGhpcyxGPUUuc2V0dGluZ3MsQix5LEE9RS5nZXRFbGVtZW50KCkscSxwLEMseCx6LEQ7bS5hZGQoRSk7aWYoRi50aGVtZSl7Ri50aGVtZT1GLnRoZW1lLnJlcGxhY2UoLy0vLCIiKTtxPWguZ2V0KEYudGhlbWUpO0UudGhlbWU9bmV3IHEoKTtpZihFLnRoZW1lLmluaXQmJkYuaW5pdF90aGVtZSl7RS50aGVtZS5pbml0KEUsaC51cmxzW0YudGhlbWVdfHxtLmRvY3VtZW50QmFzZVVSTC5yZXBsYWNlKC9cLyQvLCIiKSl9fWkoZyhGLnBsdWdpbnMucmVwbGFjZSgvXC0vZywiIikpLGZ1bmN0aW9uKEcpe3ZhciBIPWMuZ2V0KEcpLHQ9Yy51cmxzW0ddfHxtLmRvY3VtZW50QmFzZVVSTC5yZXBsYWNlKC9cLyQvLCIiKSxzO2lmKEgpe3M9bmV3IEgoRSx0KTtFLnBsdWdpbnNbR109cztpZihzLmluaXQpe3MuaW5pdChFLHQpfX19KTtpZihGLnBvcHVwX2NzcyE9PWZhbHNlKXtpZihGLnBvcHVwX2Nzcyl7Ri5wb3B1cF9jc3M9RS5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShGLnBvcHVwX2Nzcyl9ZWxzZXtGLnBvcHVwX2Nzcz1FLmJhc2VVUkkudG9BYnNvbHV0ZSgidGhlbWVzLyIrRi50aGVtZSsiL3NraW5zLyIrRi5za2luKyIvZGlhbG9nLmNzcyIpfX1pZihGLnBvcHVwX2Nzc19hZGQpe0YucG9wdXBfY3NzKz0iLCIrRS5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShGLnBvcHVwX2Nzc19hZGQpfUUuY29udHJvbE1hbmFnZXI9bmV3IG0uQ29udHJvbE1hbmFnZXIoRSk7aWYoRi5jdXN0b21fdW5kb19yZWRvKXtFLm9uQmVmb3JlRXhlY0NvbW1hbmQuYWRkKGZ1bmN0aW9uKHQsRyx1LEgscyl7aWYoRyE9IlVuZG8iJiZHIT0iUmVkbyImJkchPSJtY2VSZXBhaW50IiYmKCFzfHwhcy5za2lwX3VuZG8pKXtpZighRS51bmRvTWFuYWdlci5oYXNVbmRvKCkpe0UudW5kb01hbmFnZXIuYWRkKCl9fX0pO0Uub25FeGVjQ29tbWFuZC5hZGQoZnVuY3Rpb24odCxHLHUsSCxzKXtpZihHIT0iVW5kbyImJkchPSJSZWRvIiYmRyE9Im1jZVJlcGFpbnQiJiYoIXN8fCFzLnNraXBfdW5kbykpe0UudW5kb01hbmFnZXIuYWRkKCl9fSl9RS5vbkV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihzLHQpe2lmKCEvXihGb250TmFtZXxGb250U2l6ZSkkLy50ZXN0KHQpKXtFLm5vZGVDaGFuZ2VkKCl9fSk7aWYoYSl7ZnVuY3Rpb24gdihzLHQpe2lmKCF0fHwhdC5pbml0aWFsKXtFLmV4ZWNDb21tYW5kKCJtY2VSZXBhaW50Iil9fUUub25VbmRvLmFkZCh2KTtFLm9uUmVkby5hZGQodik7RS5vblNldENvbnRlbnQuYWRkKHYpfUUub25CZWZvcmVSZW5kZXJVSS5kaXNwYXRjaChFLEUuY29udHJvbE1hbmFnZXIpO2lmKEYucmVuZGVyX3VpKXtCPUYud2lkdGh8fEEuc3R5bGUud2lkdGh8fEEub2Zmc2V0V2lkdGg7eT1GLmhlaWdodHx8QS5zdHlsZS5oZWlnaHR8fEEub2Zmc2V0SGVpZ2h0O0Uub3JnRGlzcGxheT1BLnN0eWxlLmRpc3BsYXk7RD0vXlswLTlcLl0rKHxweCkkL2k7aWYoRC50ZXN0KCIiK0IpKXtCPU1hdGgubWF4KHBhcnNlSW50KEIpKyhxLmRlbHRhV2lkdGh8fDApLDEwMCl9aWYoRC50ZXN0KCIiK3kpKXt5PU1hdGgubWF4KHBhcnNlSW50KHkpKyhxLmRlbHRhSGVpZ2h0fHwwKSwxMDApfXE9RS50aGVtZS5yZW5kZXJVSSh7dGFyZ2V0Tm9kZTpBLHdpZHRoOkIsaGVpZ2h0OnksZGVsdGFXaWR0aDpGLmRlbHRhX3dpZHRoLGRlbHRhSGVpZ2h0OkYuZGVsdGFfaGVpZ2h0fSk7RS5lZGl0b3JDb250YWluZXI9cS5lZGl0b3JDb250YWluZXJ9aWYoZG9jdW1lbnQuZG9tYWluJiZsb2NhdGlvbi5ob3N0bmFtZSE9ZG9jdW1lbnQuZG9tYWluKXttLnJlbGF4ZWREb21haW49ZG9jdW1lbnQuZG9tYWlufW4uc2V0U3R5bGVzKHEuc2l6ZUNvbnRhaW5lcnx8cS5lZGl0b3JDb250YWluZXIse3dpZHRoOkIsaGVpZ2h0Onl9KTt5PShxLmlmcmFtZUhlaWdodHx8eSkrKHR5cGVvZih5KT09Im51bWJlciI/KHEuZGVsdGFIZWlnaHR8fDApOiIiKTtpZih5PDEwMCl7eT0xMDB9RS5pZnJhbWVIVE1MPUYuZG9jdHlwZSsnPGh0bWw+PGhlYWQgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPic7aWYoRi5kb2N1bWVudF9iYXNlX3VybCE9bS5kb2N1bWVudEJhc2VVUkwpe0UuaWZyYW1lSFRNTCs9JzxiYXNlIGhyZWY9IicrRS5kb2N1bWVudEJhc2VVUkkuZ2V0VVJJKCkrJyIgLz4nfUUuaWZyYW1lSFRNTCs9JzxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9NyIgLz48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4nO2lmKG0ucmVsYXhlZERvbWFpbil7RS5pZnJhbWVIVE1MKz0nPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRvY3VtZW50LmRvbWFpbiA9ICInK20ucmVsYXhlZERvbWFpbisnIjs8XC9zY3JpcHQ+J314PUYuYm9keV9pZHx8InRpbnltY2UiO2lmKHguaW5kZXhPZigiPSIpIT0tMSl7eD1FLmdldFBhcmFtKCJib2R5X2lkIiwiIiwiaGFzaCIpO3g9eFtFLmlkXXx8eH16PUYuYm9keV9jbGFzc3x8IiI7aWYoei5pbmRleE9mKCI9IikhPS0xKXt6PUUuZ2V0UGFyYW0oImJvZHlfY2xhc3MiLCIiLCJoYXNoIik7ej16W0UuaWRdfHwiIn1FLmlmcmFtZUhUTUwrPSc8L2hlYWQ+PGJvZHkgaWQ9IicreCsnIiBjbGFzcz0ibWNlQ29udGVudEJvZHkgJyt6KyciPjwvYm9keT48L2h0bWw+JztpZihtLnJlbGF4ZWREb21haW4pe2lmKGJ8fChtLmlzT3BlcmEmJnBhcnNlRmxvYXQob3BlcmEudmVyc2lvbigpKT49OS41KSl7Qz0namF2YXNjcmlwdDooZnVuY3Rpb24oKXtkb2N1bWVudC5vcGVuKCk7ZG9jdW1lbnQuZG9tYWluPSInK2RvY3VtZW50LmRvbWFpbisnIjt2YXIgZWQgPSB3aW5kb3cucGFyZW50LnRpbnlNQ0UuZ2V0KCInK0UuaWQrJyIpO2RvY3VtZW50LndyaXRlKGVkLmlmcmFtZUhUTUwpO2RvY3VtZW50LmNsb3NlKCk7ZWQuc2V0dXBJZnJhbWUoKTt9KSgpJ31lbHNle2lmKG0uaXNPcGVyYSl7Qz0namF2YXNjcmlwdDooZnVuY3Rpb24oKXtkb2N1bWVudC5vcGVuKCk7ZG9jdW1lbnQuZG9tYWluPSInK2RvY3VtZW50LmRvbWFpbisnIjtkb2N1bWVudC5jbG9zZSgpO2VkLnNldHVwSWZyYW1lKCk7fSkoKSd9fX1yPW4uYWRkKHEuaWZyYW1lQ29udGFpbmVyLCJpZnJhbWUiLHtpZDpFLmlkKyJfaWZyIixzcmM6Q3x8J2phdmFzY3JpcHQ6IiInLGZyYW1lQm9yZGVyOiIwIixzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDp5fX0pO0UuY29udGVudEFyZWFDb250YWluZXI9cS5pZnJhbWVDb250YWluZXI7bi5nZXQocS5lZGl0b3JDb250YWluZXIpLnN0eWxlLmRpc3BsYXk9RS5vcmdEaXNwbGF5O24uZ2V0KEUuaWQpLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2lmKCFifHwhbS5yZWxheGVkRG9tYWluKXtFLnNldHVwSWZyYW1lKCl9QT1yPXE9bnVsbH0sc2V0dXBJZnJhbWU6ZnVuY3Rpb24oKXt2YXIgej10aGlzLEE9ei5zZXR0aW5ncyxyPW4uZ2V0KHouaWQpLHU9ei5nZXREb2MoKSxxLHg7aWYoIWJ8fCFtLnJlbGF4ZWREb21haW4pe3Uub3BlbigpO3Uud3JpdGUoei5pZnJhbWVIVE1MKTt1LmNsb3NlKCl9aWYoIWIpe3RyeXtpZighQS5yZWFkb25seSl7dS5kZXNpZ25Nb2RlPSJPbiJ9fWNhdGNoKHYpe319aWYoYil7eD16LmdldEJvZHkoKTtuLmhpZGUoeCk7aWYoIUEucmVhZG9ubHkpe3guY29udGVudEVkaXRhYmxlPXRydWV9bi5zaG93KHgpfXouZG9tPW5ldyBtLmRvbS5ET01VdGlscyh6LmdldERvYygpLHtrZWVwX3ZhbHVlczp0cnVlLHVybF9jb252ZXJ0ZXI6ei5jb252ZXJ0VVJMLHVybF9jb252ZXJ0ZXJfc2NvcGU6eixoZXhfY29sb3JzOkEuZm9yY2VfaGV4X3N0eWxlX2NvbG9ycyxjbGFzc19maWx0ZXI6QS5jbGFzc19maWx0ZXIsdXBkYXRlX3N0eWxlczoxLGZpeF9pZV9wYXJhZ3JhcGhzOjEsdmFsaWRfc3R5bGVzOkEudmFsaWRfc3R5bGVzfSk7ei5zY2hlbWE9bmV3IG0uZG9tLlNjaGVtYSgpO3ouc2VyaWFsaXplcj1uZXcgbS5kb20uU2VyaWFsaXplcihmKEEse3ZhbGlkX2VsZW1lbnRzOkEudmVyaWZ5X2h0bWw9PT1mYWxzZT8iKlsqXSI6QS52YWxpZF9lbGVtZW50cyxkb206ei5kb20sc2NoZW1hOnouc2NoZW1hfSkpO3ouc2VsZWN0aW9uPW5ldyBtLmRvbS5TZWxlY3Rpb24oei5kb20sei5nZXRXaW4oKSx6LnNlcmlhbGl6ZXIpO3ouZm9ybWF0dGVyPW5ldyBtLkZvcm1hdHRlcih0aGlzKTt6LmZvcm1hdHRlci5yZWdpc3Rlcih7YWxpZ25sZWZ0Olt7c2VsZWN0b3I6InAsaDEsaDIsaDMsaDQsaDUsaDYsdGQsdGgsZGl2LHVsLG9sLGxpIixzdHlsZXM6e3RleHRBbGlnbjoibGVmdCJ9fSx7c2VsZWN0b3I6ImltZyx0YWJsZSIsc3R5bGVzOnsiZmxvYXQiOiJsZWZ0In19XSxhbGlnbmNlbnRlcjpbe3NlbGVjdG9yOiJwLGgxLGgyLGgzLGg0LGg1LGg2LHRkLHRoLGRpdix1bCxvbCxsaSIsc3R5bGVzOnt0ZXh0QWxpZ246ImNlbnRlciJ9fSx7c2VsZWN0b3I6ImltZyIsc3R5bGVzOntkaXNwbGF5OiJibG9jayIsbWFyZ2luTGVmdDoiYXV0byIsbWFyZ2luUmlnaHQ6ImF1dG8ifX0se3NlbGVjdG9yOiJ0YWJsZSIsc3R5bGVzOnttYXJnaW5MZWZ0OiJhdXRvIixtYXJnaW5SaWdodDoiYXV0byJ9fV0sYWxpZ25yaWdodDpbe3NlbGVjdG9yOiJwLGgxLGgyLGgzLGg0LGg1LGg2LHRkLHRoLGRpdix1bCxvbCxsaSIsc3R5bGVzOnt0ZXh0QWxpZ246InJpZ2h0In19LHtzZWxlY3RvcjoiaW1nLHRhYmxlIixzdHlsZXM6eyJmbG9hdCI6InJpZ2h0In19XSxhbGlnbmZ1bGw6W3tzZWxlY3RvcjoicCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGkiLHN0eWxlczp7dGV4dEFsaWduOiJqdXN0aWZ5In19XSxib2xkOlt7aW5saW5lOiJzdHJvbmcifSx7aW5saW5lOiJzcGFuIixzdHlsZXM6e2ZvbnRXZWlnaHQ6ImJvbGQifX0se2lubGluZToiYiJ9XSxpdGFsaWM6W3tpbmxpbmU6ImVtIn0se2lubGluZToic3BhbiIsc3R5bGVzOntmb250U3R5bGU6Iml0YWxpYyJ9fSx7aW5saW5lOiJpIn1dLHVuZGVybGluZTpbe2lubGluZToic3BhbiIsc3R5bGVzOnt0ZXh0RGVjb3JhdGlvbjoidW5kZXJsaW5lIn0sZXhhY3Q6dHJ1ZX0se2lubGluZToidSJ9XSxzdHJpa2V0aHJvdWdoOlt7aW5saW5lOiJzcGFuIixzdHlsZXM6e3RleHREZWNvcmF0aW9uOiJsaW5lLXRocm91Z2gifSxleGFjdDp0cnVlfSx7aW5saW5lOiJ1In1dLGZvcmVjb2xvcjp7aW5saW5lOiJzcGFuIixzdHlsZXM6e2NvbG9yOiIldmFsdWUifSx3cmFwX2xpbmtzOmZhbHNlfSxoaWxpdGVjb2xvcjp7aW5saW5lOiJzcGFuIixzdHlsZXM6e2JhY2tncm91bmRDb2xvcjoiJXZhbHVlIn0sd3JhcF9saW5rczpmYWxzZX0sZm9udG5hbWU6e2lubGluZToic3BhbiIsc3R5bGVzOntmb250RmFtaWx5OiIldmFsdWUifX0sZm9udHNpemU6e2lubGluZToic3BhbiIsc3R5bGVzOntmb250U2l6ZToiJXZhbHVlIn19LGZvbnRzaXplX2NsYXNzOntpbmxpbmU6InNwYW4iLGF0dHJpYnV0ZXM6eyJjbGFzcyI6IiV2YWx1ZSJ9fSxibG9ja3F1b3RlOntibG9jazoiYmxvY2txdW90ZSIsd3JhcHBlcjoxLHJlbW92ZToiYWxsIn0scmVtb3ZlZm9ybWF0Olt7c2VsZWN0b3I6ImIsc3Ryb25nLGVtLGksZm9udCx1LHN0cmlrZSIscmVtb3ZlOiJhbGwiLHNwbGl0OnRydWUsZXhwYW5kOmZhbHNlLGJsb2NrX2V4cGFuZDp0cnVlLGRlZXA6dHJ1ZX0se3NlbGVjdG9yOiJzcGFuIixhdHRyaWJ1dGVzOlsic3R5bGUiLCJjbGFzcyJdLHJlbW92ZToiZW1wdHkiLHNwbGl0OnRydWUsZXhwYW5kOmZhbHNlLGRlZXA6dHJ1ZX0se3NlbGVjdG9yOiIqIixhdHRyaWJ1dGVzOlsic3R5bGUiLCJjbGFzcyJdLHNwbGl0OmZhbHNlLGV4cGFuZDpmYWxzZSxkZWVwOnRydWV9XX0pO2koInAgaDEgaDIgaDMgaDQgaDUgaDYgZGl2IGFkZHJlc3MgcHJlIGRpdiBjb2RlIGR0IGRkIHNhbXAiLnNwbGl0KC9ccy8pLGZ1bmN0aW9uKHMpe3ouZm9ybWF0dGVyLnJlZ2lzdGVyKHMse2Jsb2NrOnMscmVtb3ZlOiJhbGwifSl9KTt6LmZvcm1hdHRlci5yZWdpc3Rlcih6LnNldHRpbmdzLmZvcm1hdHMpO3oudW5kb01hbmFnZXI9bmV3IG0uVW5kb01hbmFnZXIoeik7ei51bmRvTWFuYWdlci5vbkFkZC5hZGQoZnVuY3Rpb24odCxzKXtpZighcy5pbml0aWFsKXtyZXR1cm4gei5vbkNoYW5nZS5kaXNwYXRjaCh6LHMsdCl9fSk7ei51bmRvTWFuYWdlci5vblVuZG8uYWRkKGZ1bmN0aW9uKHQscyl7cmV0dXJuIHoub25VbmRvLmRpc3BhdGNoKHoscyx0KX0pO3oudW5kb01hbmFnZXIub25SZWRvLmFkZChmdW5jdGlvbih0LHMpe3JldHVybiB6Lm9uUmVkby5kaXNwYXRjaCh6LHMsdCl9KTt6LmZvcmNlQmxvY2tzPW5ldyBtLkZvcmNlQmxvY2tzKHose2ZvcmNlZF9yb290X2Jsb2NrOkEuZm9yY2VkX3Jvb3RfYmxvY2t9KTt6LmVkaXRvckNvbW1hbmRzPW5ldyBtLkVkaXRvckNvbW1hbmRzKHopO3ouc2VyaWFsaXplci5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHMsdCl7cmV0dXJuIHoub25QcmVQcm9jZXNzLmRpc3BhdGNoKHosdCxzKX0pO3ouc2VyaWFsaXplci5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe3JldHVybiB6Lm9uUG9zdFByb2Nlc3MuZGlzcGF0Y2goeix0LHMpfSk7ei5vblByZUluaXQuZGlzcGF0Y2goeik7aWYoIUEuZ2Vja29fc3BlbGxjaGVjayl7ei5nZXRCb2R5KCkuc3BlbGxjaGVjaz0wfWlmKCFBLnJlYWRvbmx5KXt6Ll9hZGRFdmVudHMoKX16LmNvbnRyb2xNYW5hZ2VyLm9uUG9zdFJlbmRlci5kaXNwYXRjaCh6LHouY29udHJvbE1hbmFnZXIpO3oub25Qb3N0UmVuZGVyLmRpc3BhdGNoKHopO2lmKEEuZGlyZWN0aW9uYWxpdHkpe3ouZ2V0Qm9keSgpLmRpcj1BLmRpcmVjdGlvbmFsaXR5fWlmKEEubm93cmFwKXt6LmdldEJvZHkoKS5zdHlsZS53aGl0ZVNwYWNlPSJub3dyYXAifWlmKEEuY3VzdG9tX2VsZW1lbnRzKXtmdW5jdGlvbiB5KHMsdCl7aShnKEEuY3VzdG9tX2VsZW1lbnRzKSxmdW5jdGlvbihCKXt2YXIgQztpZihCLmluZGV4T2YoIn4iKT09PTApe0I9Qi5zdWJzdHJpbmcoMSk7Qz0ic3BhbiJ9ZWxzZXtDPSJkaXYifXQuY29udGVudD10LmNvbnRlbnQucmVwbGFjZShuZXcgUmVnRXhwKCI8KCIrQisiKShbXj5dKik+IiwiZyIpLCI8IitDKycgX21jZV9uYW1lPSIkMSIkMj4nKTt0LmNvbnRlbnQ9dC5jb250ZW50LnJlcGxhY2UobmV3IFJlZ0V4cCgiPC8oIitCKyIpPiIsImciKSwiPC8iK0MrIj4iKX0pfXoub25CZWZvcmVTZXRDb250ZW50LmFkZCh5KTt6Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKHMsdCl7aWYodC5zZXQpe3kocyx0KX19KX1pZihBLmhhbmRsZV9ub2RlX2NoYW5nZV9jYWxsYmFjayl7ei5vbk5vZGVDaGFuZ2UuYWRkKGZ1bmN0aW9uKHQscyxCKXt6LmV4ZWNDYWxsYmFjaygiaGFuZGxlX25vZGVfY2hhbmdlX2NhbGxiYWNrIix6LmlkLEIsLTEsLTEsdHJ1ZSx6LnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpKX0pfWlmKEEuc2F2ZV9jYWxsYmFjayl7ei5vblNhdmVDb250ZW50LmFkZChmdW5jdGlvbihzLEIpe3ZhciB0PXouZXhlY0NhbGxiYWNrKCJzYXZlX2NhbGxiYWNrIix6LmlkLEIuY29udGVudCx6LmdldEJvZHkoKSk7aWYodCl7Qi5jb250ZW50PXR9fSl9aWYoQS5vbmNoYW5nZV9jYWxsYmFjayl7ei5vbkNoYW5nZS5hZGQoZnVuY3Rpb24odCxzKXt6LmV4ZWNDYWxsYmFjaygib25jaGFuZ2VfY2FsbGJhY2siLHoscyl9KX1pZihBLmNvbnZlcnRfbmV3bGluZXNfdG9fYnJzKXt6Lm9uQmVmb3JlU2V0Q29udGVudC5hZGQoZnVuY3Rpb24ocyx0KXtpZih0LmluaXRpYWwpe3QuY29udGVudD10LmNvbnRlbnQucmVwbGFjZSgvXHI/XG4vZywiPGJyIC8+Iil9fSl9aWYoQS5maXhfbmVzdGluZyYmYil7ei5vbkJlZm9yZVNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKHMsdCl7dC5jb250ZW50PXouX2ZpeE5lc3RpbmcodC5jb250ZW50KX0pfWlmKEEucHJlZm9ybWF0dGVkKXt6Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKHMsdCl7dC5jb250ZW50PXQuY29udGVudC5yZXBsYWNlKC9eXHMqPHByZS4qPz4vLCIiKTt0LmNvbnRlbnQ9dC5jb250ZW50LnJlcGxhY2UoLzxcL3ByZT5ccyokLywiIik7aWYodC5zZXQpe3QuY29udGVudD0nPHByZSBjbGFzcz0ibWNlSXRlbUhpZGRlbiI+Jyt0LmNvbnRlbnQrIjwvcHJlPiJ9fSl9aWYoQS52ZXJpZnlfY3NzX2NsYXNzZXMpe3ouc2VyaWFsaXplci5hdHRyaWJWYWx1ZUZpbHRlcj1mdW5jdGlvbihELEIpe3ZhciBDLHQ7aWYoRD09ImNsYXNzIil7aWYoIXouY2xhc3Nlc1JFKXt0PXouZG9tLmdldENsYXNzZXMoKTtpZih0Lmxlbmd0aD4wKXtDPSIiO2kodCxmdW5jdGlvbihzKXtDKz0oQz8ifCI6IiIpK3NbImNsYXNzIl19KTt6LmNsYXNzZXNSRT1uZXcgUmVnRXhwKCIoIitDKyIpIiwiZ2kiKX19cmV0dXJuICF6LmNsYXNzZXNSRXx8LyhcYm1jZUl0ZW1cdytcYnxcYm1jZVRlbXBcdytcYikvZy50ZXN0KEIpfHx6LmNsYXNzZXNSRS50ZXN0KEIpP0I6IiJ9cmV0dXJuIEJ9fWlmKEEuY2xlYW51cF9jYWxsYmFjayl7ei5vbkJlZm9yZVNldENvbnRlbnQuYWRkKGZ1bmN0aW9uKHMsdCl7dC5jb250ZW50PXouZXhlY0NhbGxiYWNrKCJjbGVhbnVwX2NhbGxiYWNrIiwiaW5zZXJ0X3RvX2VkaXRvciIsdC5jb250ZW50LHQpfSk7ei5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHMsdCl7aWYodC5zZXQpe3ouZXhlY0NhbGxiYWNrKCJjbGVhbnVwX2NhbGxiYWNrIiwiaW5zZXJ0X3RvX2VkaXRvcl9kb20iLHQubm9kZSx0KX1pZih0LmdldCl7ei5leGVjQ2FsbGJhY2soImNsZWFudXBfY2FsbGJhY2siLCJnZXRfZnJvbV9lZGl0b3JfZG9tIix0Lm5vZGUsdCl9fSk7ei5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihzLHQpe2lmKHQuc2V0KXt0LmNvbnRlbnQ9ei5leGVjQ2FsbGJhY2soImNsZWFudXBfY2FsbGJhY2siLCJpbnNlcnRfdG9fZWRpdG9yIix0LmNvbnRlbnQsdCl9aWYodC5nZXQpe3QuY29udGVudD16LmV4ZWNDYWxsYmFjaygiY2xlYW51cF9jYWxsYmFjayIsImdldF9mcm9tX2VkaXRvciIsdC5jb250ZW50LHQpfX0pfWlmKEEuc2F2ZV9jYWxsYmFjayl7ei5vbkdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKHMsdCl7aWYodC5zYXZlKXt0LmNvbnRlbnQ9ei5leGVjQ2FsbGJhY2soInNhdmVfY2FsbGJhY2siLHouaWQsdC5jb250ZW50LHouZ2V0Qm9keSgpKX19KX1pZihBLmhhbmRsZV9ldmVudF9jYWxsYmFjayl7ei5vbkV2ZW50LmFkZChmdW5jdGlvbihzLHQsQil7aWYoei5leGVjQ2FsbGJhY2soImhhbmRsZV9ldmVudF9jYWxsYmFjayIsdCxzLEIpPT09ZmFsc2Upe2ouY2FuY2VsKHQpfX0pfXoub25TZXRDb250ZW50LmFkZChmdW5jdGlvbigpe3ouYWRkVmlzdWFsKHouZ2V0Qm9keSgpKX0pO2lmKEEucGFkZF9lbXB0eV9lZGl0b3Ipe3oub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24ocyx0KXt0LmNvbnRlbnQ9dC5jb250ZW50LnJlcGxhY2UoL14oPHBbXj5dKj4oJm5ic3A7fCYjMTYwO3xcc3xcdTAwYTB8KTxcL3A+W1xyXG5dKnw8YnIgXC8+W1xyXG5dKikkLywiIil9KX1pZihhKXtmdW5jdGlvbiBwKHMsdCl7aShzLmRvbS5zZWxlY3QoImEiKSxmdW5jdGlvbihDKXt2YXIgQj1DLnBhcmVudE5vZGU7aWYocy5kb20uaXNCbG9jayhCKSYmQi5sYXN0Q2hpbGQ9PT1DKXtzLmRvbS5hZGQoQiwiYnIiLHtfbWNlX2JvZ3VzOjF9KX19KX16Lm9uRXhlY0NvbW1hbmQuYWRkKGZ1bmN0aW9uKHMsdCl7aWYodD09PSJDcmVhdGVMaW5rIil7cChzKX19KTt6Lm9uU2V0Q29udGVudC5hZGQoei5zZWxlY3Rpb24ub25TZXRDb250ZW50LmFkZChwKSk7aWYoIUEucmVhZG9ubHkpe3RyeXt1LmRlc2lnbk1vZGU9Ik9mZiI7dS5kZXNpZ25Nb2RlPSJPbiJ9Y2F0Y2godil7fX19c2V0VGltZW91dChmdW5jdGlvbigpe2lmKHoucmVtb3ZlZCl7cmV0dXJufXoubG9hZCh7aW5pdGlhbDp0cnVlLGZvcm1hdDooQS5jbGVhbnVwX29uX3N0YXJ0dXA/Imh0bWwiOiJyYXciKX0pO3ouc3RhcnRDb250ZW50PXouZ2V0Q29udGVudCh7Zm9ybWF0OiJyYXcifSk7ei5pbml0aWFsaXplZD10cnVlO3oub25Jbml0LmRpc3BhdGNoKHopO3ouZXhlY0NhbGxiYWNrKCJzZXR1cGNvbnRlbnRfY2FsbGJhY2siLHouaWQsei5nZXRCb2R5KCksei5nZXREb2MoKSk7ei5leGVjQ2FsbGJhY2soImluaXRfaW5zdGFuY2VfY2FsbGJhY2siLHopO3ouZm9jdXModHJ1ZSk7ei5ub2RlQ2hhbmdlZCh7aW5pdGlhbDoxfSk7aWYoQS5jb250ZW50X2Nzcyl7bS5lYWNoKGcoQS5jb250ZW50X2NzcyksZnVuY3Rpb24ocyl7ei5kb20ubG9hZENTUyh6LmRvY3VtZW50QmFzZVVSSS50b0Fic29sdXRlKHMpKX0pfWlmKEEuYXV0b19mb2N1cyl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBzPW0uZ2V0KEEuYXV0b19mb2N1cyk7cy5zZWxlY3Rpb24uc2VsZWN0KHMuZ2V0Qm9keSgpLDEpO3Muc2VsZWN0aW9uLmNvbGxhcHNlKDEpO3MuZ2V0V2luKCkuZm9jdXMoKX0sMTAwKX19LDEpO3I9bnVsbH0sZm9jdXM6ZnVuY3Rpb24ocyl7dmFyIHgscT10aGlzLHY9cS5zZXR0aW5ncy5jb250ZW50X2VkaXRhYmxlLHIscCx1PXEuZ2V0RG9jKCk7aWYoIXMpe3I9cS5zZWxlY3Rpb24uZ2V0Um5nKCk7aWYoci5pdGVtKXtwPXIuaXRlbSgwKX1pZighdil7cS5nZXRXaW4oKS5mb2N1cygpfWlmKHAmJnAub3duZXJEb2N1bWVudD09dSl7cj11LmJvZHkuY3JlYXRlQ29udHJvbFJhbmdlKCk7ci5hZGRFbGVtZW50KHApO3Iuc2VsZWN0KCl9fWlmKG0uYWN0aXZlRWRpdG9yIT1xKXtpZigoeD1tLmFjdGl2ZUVkaXRvcikhPW51bGwpe3gub25EZWFjdGl2YXRlLmRpc3BhdGNoKHgscSl9cS5vbkFjdGl2YXRlLmRpc3BhdGNoKHEseCl9bS5fc2V0QWN0aXZlKHEpfSxleGVjQ2FsbGJhY2s6ZnVuY3Rpb24odSl7dmFyIHA9dGhpcyxyPXAuc2V0dGluZ3NbdV0scTtpZighcil7cmV0dXJufWlmKHAuY2FsbGJhY2tMb29rdXAmJihxPXAuY2FsbGJhY2tMb29rdXBbdV0pKXtyPXEuZnVuYztxPXEuc2NvcGV9aWYoZChyLCJzdHJpbmciKSl7cT1yLnJlcGxhY2UoL1wuXHcrJC8sIiIpO3E9cT9tLnJlc29sdmUocSk6MDtyPW0ucmVzb2x2ZShyKTtwLmNhbGxiYWNrTG9va3VwPXAuY2FsbGJhY2tMb29rdXB8fHt9O3AuY2FsbGJhY2tMb29rdXBbdV09e2Z1bmM6cixzY29wZTpxfX1yZXR1cm4gci5hcHBseShxfHxwLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSl9LHRyYW5zbGF0ZTpmdW5jdGlvbihwKXt2YXIgcj10aGlzLnNldHRpbmdzLmxhbmd1YWdlfHwiZW4iLHE9bS5pMThuO2lmKCFwKXtyZXR1cm4iIn1yZXR1cm4gcVtyKyIuIitwXXx8cC5yZXBsYWNlKC97XCMoW159XSspXH0vZyxmdW5jdGlvbih0LHMpe3JldHVybiBxW3IrIi4iK3NdfHwieyMiK3MrIn0ifSl9LGdldExhbmc6ZnVuY3Rpb24ocSxwKXtyZXR1cm4gbS5pMThuWyh0aGlzLnNldHRpbmdzLmxhbmd1YWdlfHwiZW4iKSsiLiIrcV18fChkKHApP3A6InsjIitxKyJ9Iil9LGdldFBhcmFtOmZ1bmN0aW9uKHUscixwKXt2YXIgcz1tLnRyaW0scT1kKHRoaXMuc2V0dGluZ3NbdV0pP3RoaXMuc2V0dGluZ3NbdV06cix0O2lmKHA9PT0iaGFzaCIpe3Q9e307aWYoZChxLCJzdHJpbmciKSl7aShxLmluZGV4T2YoIj0iKT4wP3Euc3BsaXQoL1s7LF0oPyFbXj07LF0qKD86WzssXXwkKSkvKTpxLnNwbGl0KCIsIiksZnVuY3Rpb24oeCl7eD14LnNwbGl0KCI9Iik7aWYoeC5sZW5ndGg+MSl7dFtzKHhbMF0pXT1zKHhbMV0pfWVsc2V7dFtzKHhbMF0pXT1zKHgpfX0pfWVsc2V7dD1xfXJldHVybiB0fXJldHVybiBxfSxub2RlQ2hhbmdlZDpmdW5jdGlvbihyKXt2YXIgcD10aGlzLHE9cC5zZWxlY3Rpb24sdT0oYj9xLmdldE5vZGUoKTpxLmdldFN0YXJ0KCkpfHxwLmdldEJvZHkoKTtpZihwLmluaXRpYWxpemVkKXtyPXJ8fHt9O3U9YiYmdS5vd25lckRvY3VtZW50IT1wLmdldERvYygpP3AuZ2V0Qm9keSgpOnU7ci5wYXJlbnRzPVtdO3AuZG9tLmdldFBhcmVudCh1LGZ1bmN0aW9uKHMpe2lmKHMubm9kZU5hbWU9PSJCT0RZIil7cmV0dXJuIHRydWV9ci5wYXJlbnRzLnB1c2gocyl9KTtwLm9uTm9kZUNoYW5nZS5kaXNwYXRjaChwLHI/ci5jb250cm9sTWFuYWdlcnx8cC5jb250cm9sTWFuYWdlcjpwLmNvbnRyb2xNYW5hZ2VyLHUscS5pc0NvbGxhcHNlZCgpLHIpfX0sYWRkQnV0dG9uOmZ1bmN0aW9uKHIscSl7dmFyIHA9dGhpcztwLmJ1dHRvbnM9cC5idXR0b25zfHx7fTtwLmJ1dHRvbnNbcl09cX0sYWRkQ29tbWFuZDpmdW5jdGlvbihyLHEscCl7dGhpcy5leGVjQ29tbWFuZHNbcl09e2Z1bmM6cSxzY29wZTpwfHx0aGlzfX0sYWRkUXVlcnlTdGF0ZUhhbmRsZXI6ZnVuY3Rpb24ocixxLHApe3RoaXMucXVlcnlTdGF0ZUNvbW1hbmRzW3JdPXtmdW5jOnEsc2NvcGU6cHx8dGhpc319LGFkZFF1ZXJ5VmFsdWVIYW5kbGVyOmZ1bmN0aW9uKHIscSxwKXt0aGlzLnF1ZXJ5VmFsdWVDb21tYW5kc1tyXT17ZnVuYzpxLHNjb3BlOnB8fHRoaXN9fSxhZGRTaG9ydGN1dDpmdW5jdGlvbihyLHUscCxzKXt2YXIgcT10aGlzLHY7aWYoIXEuc2V0dGluZ3MuY3VzdG9tX3Nob3J0Y3V0cyl7cmV0dXJuIGZhbHNlfXEuc2hvcnRjdXRzPXEuc2hvcnRjdXRzfHx7fTtpZihkKHAsInN0cmluZyIpKXt2PXA7cD1mdW5jdGlvbigpe3EuZXhlY0NvbW1hbmQodixmYWxzZSxudWxsKX19aWYoZChwLCJvYmplY3QiKSl7dj1wO3A9ZnVuY3Rpb24oKXtxLmV4ZWNDb21tYW5kKHZbMF0sdlsxXSx2WzJdKX19aShnKHIpLGZ1bmN0aW9uKHQpe3ZhciB4PXtmdW5jOnAsc2NvcGU6c3x8dGhpcyxkZXNjOnUsYWx0OmZhbHNlLGN0cmw6ZmFsc2Usc2hpZnQ6ZmFsc2V9O2koZyh0LCIrIiksZnVuY3Rpb24oeSl7c3dpdGNoKHkpe2Nhc2UiYWx0IjpjYXNlImN0cmwiOmNhc2Uic2hpZnQiOnhbeV09dHJ1ZTticmVhaztkZWZhdWx0OnguY2hhckNvZGU9eS5jaGFyQ29kZUF0KDApO3gua2V5Q29kZT15LnRvVXBwZXJDYXNlKCkuY2hhckNvZGVBdCgwKX19KTtxLnNob3J0Y3V0c1soeC5jdHJsPyJjdHJsIjoiIikrIiwiKyh4LmFsdD8iYWx0IjoiIikrIiwiKyh4LnNoaWZ0PyJzaGlmdCI6IiIpKyIsIit4LmtleUNvZGVdPXh9KTtyZXR1cm4gdHJ1ZX0sZXhlY0NvbW1hbmQ6ZnVuY3Rpb24oeCx2LHoscCl7dmFyIHI9dGhpcyx1PTAseSxxO2lmKCEvXihtY2VBZGRVbmRvTGV2ZWx8bWNlRW5kVW5kb0xldmVsfG1jZUJlZ2luVW5kb0xldmVsfG1jZVJlcGFpbnR8U2VsZWN0QWxsKSQvLnRlc3QoeCkmJighcHx8IXAuc2tpcF9mb2N1cykpe3IuZm9jdXMoKX15PXt9O3Iub25CZWZvcmVFeGVjQ29tbWFuZC5kaXNwYXRjaChyLHgsdix6LHkpO2lmKHkudGVybWluYXRlKXtyZXR1cm4gZmFsc2V9aWYoci5leGVjQ2FsbGJhY2soImV4ZWNjb21tYW5kX2NhbGxiYWNrIixyLmlkLHIuc2VsZWN0aW9uLmdldE5vZGUoKSx4LHYseikpe3Iub25FeGVjQ29tbWFuZC5kaXNwYXRjaChyLHgsdix6LHApO3JldHVybiB0cnVlfWlmKHk9ci5leGVjQ29tbWFuZHNbeF0pe3E9eS5mdW5jLmNhbGwoeS5zY29wZSx2LHopO2lmKHEhPT10cnVlKXtyLm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseixwKTtyZXR1cm4gcX19aShyLnBsdWdpbnMsZnVuY3Rpb24ocyl7aWYocy5leGVjQ29tbWFuZCYmcy5leGVjQ29tbWFuZCh4LHYseikpe3Iub25FeGVjQ29tbWFuZC5kaXNwYXRjaChyLHgsdix6LHApO3U9MTtyZXR1cm4gZmFsc2V9fSk7aWYodSl7cmV0dXJuIHRydWV9aWYoci50aGVtZSYmci50aGVtZS5leGVjQ29tbWFuZCYmci50aGVtZS5leGVjQ29tbWFuZCh4LHYseikpe3Iub25FeGVjQ29tbWFuZC5kaXNwYXRjaChyLHgsdix6LHApO3JldHVybiB0cnVlfWlmKG0uR2xvYmFsQ29tbWFuZHMuZXhlY0NvbW1hbmQocix4LHYseikpe3Iub25FeGVjQ29tbWFuZC5kaXNwYXRjaChyLHgsdix6LHApO3JldHVybiB0cnVlfWlmKHIuZWRpdG9yQ29tbWFuZHMuZXhlY0NvbW1hbmQoeCx2LHopKXtyLm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseixwKTtyZXR1cm4gdHJ1ZX1yLmdldERvYygpLmV4ZWNDb21tYW5kKHgsdix6KTtyLm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2gocix4LHYseixwKX0scXVlcnlDb21tYW5kU3RhdGU6ZnVuY3Rpb24odSl7dmFyIHE9dGhpcyx2LHI7aWYocS5faXNIaWRkZW4oKSl7cmV0dXJufWlmKHY9cS5xdWVyeVN0YXRlQ29tbWFuZHNbdV0pe3I9di5mdW5jLmNhbGwodi5zY29wZSk7aWYociE9PXRydWUpe3JldHVybiByfX12PXEuZWRpdG9yQ29tbWFuZHMucXVlcnlDb21tYW5kU3RhdGUodSk7aWYodiE9PS0xKXtyZXR1cm4gdn10cnl7cmV0dXJuIHRoaXMuZ2V0RG9jKCkucXVlcnlDb21tYW5kU3RhdGUodSl9Y2F0Y2gocCl7fX0scXVlcnlDb21tYW5kVmFsdWU6ZnVuY3Rpb24odil7dmFyIHE9dGhpcyx1LHI7aWYocS5faXNIaWRkZW4oKSl7cmV0dXJufWlmKHU9cS5xdWVyeVZhbHVlQ29tbWFuZHNbdl0pe3I9dS5mdW5jLmNhbGwodS5zY29wZSk7aWYociE9PXRydWUpe3JldHVybiByfX11PXEuZWRpdG9yQ29tbWFuZHMucXVlcnlDb21tYW5kVmFsdWUodik7aWYoZCh1KSl7cmV0dXJuIHV9dHJ5e3JldHVybiB0aGlzLmdldERvYygpLnF1ZXJ5Q29tbWFuZFZhbHVlKHYpfWNhdGNoKHApe319LHNob3c6ZnVuY3Rpb24oKXt2YXIgcD10aGlzO24uc2hvdyhwLmdldENvbnRhaW5lcigpKTtuLmhpZGUocC5pZCk7cC5sb2FkKCl9LGhpZGU6ZnVuY3Rpb24oKXt2YXIgcD10aGlzLHE9cC5nZXREb2MoKTtpZihiJiZxKXtxLmV4ZWNDb21tYW5kKCJTZWxlY3RBbGwiKX1wLnNhdmUoKTtuLmhpZGUocC5nZXRDb250YWluZXIoKSk7bi5zZXRTdHlsZShwLmlkLCJkaXNwbGF5IixwLm9yZ0Rpc3BsYXkpfSxpc0hpZGRlbjpmdW5jdGlvbigpe3JldHVybiAhbi5pc0hpZGRlbih0aGlzLmlkKX0sc2V0UHJvZ3Jlc3NTdGF0ZTpmdW5jdGlvbihwLHEscil7dGhpcy5vblNldFByb2dyZXNzU3RhdGUuZGlzcGF0Y2godGhpcyxwLHEscik7cmV0dXJuIHB9LGxvYWQ6ZnVuY3Rpb24ocyl7dmFyIHA9dGhpcyxyPXAuZ2V0RWxlbWVudCgpLHE7aWYocil7cz1zfHx7fTtzLmxvYWQ9dHJ1ZTtxPXAuc2V0Q29udGVudChkKHIudmFsdWUpP3IudmFsdWU6ci5pbm5lckhUTUwscyk7cy5lbGVtZW50PXI7aWYoIXMubm9fZXZlbnRzKXtwLm9uTG9hZENvbnRlbnQuZGlzcGF0Y2gocCxzKX1zLmVsZW1lbnQ9cj1udWxsO3JldHVybiBxfX0sc2F2ZTpmdW5jdGlvbih1KXt2YXIgcD10aGlzLHM9cC5nZXRFbGVtZW50KCkscSxyO2lmKCFzfHwhcC5pbml0aWFsaXplZCl7cmV0dXJufXU9dXx8e307dS5zYXZlPXRydWU7aWYoIXUubm9fZXZlbnRzKXtwLnVuZG9NYW5hZ2VyLnR5cGluZz0wO3AudW5kb01hbmFnZXIuYWRkKCl9dS5lbGVtZW50PXM7cT11LmNvbnRlbnQ9cC5nZXRDb250ZW50KHUpO2lmKCF1Lm5vX2V2ZW50cyl7cC5vblNhdmVDb250ZW50LmRpc3BhdGNoKHAsdSl9cT11LmNvbnRlbnQ7aWYoIS9URVhUQVJFQXxJTlBVVC9pLnRlc3Qocy5ub2RlTmFtZSkpe3MuaW5uZXJIVE1MPXE7aWYocj1uLmdldFBhcmVudChwLmlkLCJmb3JtIikpe2koci5lbGVtZW50cyxmdW5jdGlvbih0KXtpZih0Lm5hbWU9PXAuaWQpe3QudmFsdWU9cTtyZXR1cm4gZmFsc2V9fSl9fWVsc2V7cy52YWx1ZT1xfXUuZWxlbWVudD1zPW51bGw7cmV0dXJuIHF9LHNldENvbnRlbnQ6ZnVuY3Rpb24ocSxyKXt2YXIgcD10aGlzO3I9cnx8e307ci5mb3JtYXQ9ci5mb3JtYXR8fCJodG1sIjtyLnNldD10cnVlO3IuY29udGVudD1xO2lmKCFyLm5vX2V2ZW50cyl7cC5vbkJlZm9yZVNldENvbnRlbnQuZGlzcGF0Y2gocCxyKX1pZighbS5pc0lFJiYocS5sZW5ndGg9PT0wfHwvXlxzKyQvLnRlc3QocSkpKXtyLmNvbnRlbnQ9cC5kb20uc2V0SFRNTChwLmdldEJvZHkoKSwnPGJyIF9tY2VfYm9ndXM9IjEiIC8+Jyk7ci5mb3JtYXQ9InJhdyJ9ci5jb250ZW50PXAuZG9tLnNldEhUTUwocC5nZXRCb2R5KCksbS50cmltKHIuY29udGVudCkpO2lmKHIuZm9ybWF0IT0icmF3IiYmcC5zZXR0aW5ncy5jbGVhbnVwKXtyLmdldElubmVyPXRydWU7ci5jb250ZW50PXAuZG9tLnNldEhUTUwocC5nZXRCb2R5KCkscC5zZXJpYWxpemVyLnNlcmlhbGl6ZShwLmdldEJvZHkoKSxyKSl9aWYoIXIubm9fZXZlbnRzKXtwLm9uU2V0Q29udGVudC5kaXNwYXRjaChwLHIpfXJldHVybiByLmNvbnRlbnR9LGdldENvbnRlbnQ6ZnVuY3Rpb24ocil7dmFyIHA9dGhpcyxxO3I9cnx8e307ci5mb3JtYXQ9ci5mb3JtYXR8fCJodG1sIjtyLmdldD10cnVlO2lmKCFyLm5vX2V2ZW50cyl7cC5vbkJlZm9yZUdldENvbnRlbnQuZGlzcGF0Y2gocCxyKX1pZihyLmZvcm1hdCE9InJhdyImJnAuc2V0dGluZ3MuY2xlYW51cCl7ci5nZXRJbm5lcj10cnVlO3E9cC5zZXJpYWxpemVyLnNlcmlhbGl6ZShwLmdldEJvZHkoKSxyKX1lbHNle3E9cC5nZXRCb2R5KCkuaW5uZXJIVE1MfXE9cS5yZXBsYWNlKC9eXHMqfFxzKiQvZywiIik7ci5jb250ZW50PXE7aWYoIXIubm9fZXZlbnRzKXtwLm9uR2V0Q29udGVudC5kaXNwYXRjaChwLHIpfXJldHVybiByLmNvbnRlbnR9LGlzRGlydHk6ZnVuY3Rpb24oKXt2YXIgcD10aGlzO3JldHVybiBtLnRyaW0ocC5zdGFydENvbnRlbnQpIT1tLnRyaW0ocC5nZXRDb250ZW50KHtmb3JtYXQ6InJhdyIsbm9fZXZlbnRzOjF9KSkmJiFwLmlzTm90RGlydHl9LGdldENvbnRhaW5lcjpmdW5jdGlvbigpe3ZhciBwPXRoaXM7aWYoIXAuY29udGFpbmVyKXtwLmNvbnRhaW5lcj1uLmdldChwLmVkaXRvckNvbnRhaW5lcnx8cC5pZCsiX3BhcmVudCIpfXJldHVybiBwLmNvbnRhaW5lcn0sZ2V0Q29udGVudEFyZWFDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZW50QXJlYUNvbnRhaW5lcn0sZ2V0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiBuLmdldCh0aGlzLnNldHRpbmdzLmNvbnRlbnRfZWxlbWVudHx8dGhpcy5pZCl9LGdldFdpbjpmdW5jdGlvbigpe3ZhciBwPXRoaXMscTtpZighcC5jb250ZW50V2luZG93KXtxPW4uZ2V0KHAuaWQrIl9pZnIiKTtpZihxKXtwLmNvbnRlbnRXaW5kb3c9cS5jb250ZW50V2luZG93fX1yZXR1cm4gcC5jb250ZW50V2luZG93fSxnZXREb2M6ZnVuY3Rpb24oKXt2YXIgcT10aGlzLHA7aWYoIXEuY29udGVudERvY3VtZW50KXtwPXEuZ2V0V2luKCk7aWYocCl7cS5jb250ZW50RG9jdW1lbnQ9cC5kb2N1bWVudH19cmV0dXJuIHEuY29udGVudERvY3VtZW50fSxnZXRCb2R5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYm9keUVsZW1lbnR8fHRoaXMuZ2V0RG9jKCkuYm9keX0sY29udmVydFVSTDpmdW5jdGlvbihwLHgsdil7dmFyIHE9dGhpcyxyPXEuc2V0dGluZ3M7aWYoci51cmxjb252ZXJ0ZXJfY2FsbGJhY2spe3JldHVybiBxLmV4ZWNDYWxsYmFjaygidXJsY29udmVydGVyX2NhbGxiYWNrIixwLHYsdHJ1ZSx4KX1pZighci5jb252ZXJ0X3VybHN8fCh2JiZ2Lm5vZGVOYW1lPT0iTElOSyIpfHxwLmluZGV4T2YoImZpbGU6Iik9PT0wKXtyZXR1cm4gcH1pZihyLnJlbGF0aXZlX3VybHMpe3JldHVybiBxLmRvY3VtZW50QmFzZVVSSS50b1JlbGF0aXZlKHApfXA9cS5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShwLHIucmVtb3ZlX3NjcmlwdF9ob3N0KTtyZXR1cm4gcH0sYWRkVmlzdWFsOmZ1bmN0aW9uKHIpe3ZhciBwPXRoaXMscT1wLnNldHRpbmdzO3I9cnx8cC5nZXRCb2R5KCk7aWYoIWQocC5oYXNWaXN1YWwpKXtwLmhhc1Zpc3VhbD1xLnZpc3VhbH1pKHAuZG9tLnNlbGVjdCgidGFibGUsYSIsciksZnVuY3Rpb24odCl7dmFyIHM7c3dpdGNoKHQubm9kZU5hbWUpe2Nhc2UiVEFCTEUiOnM9cC5kb20uZ2V0QXR0cmliKHQsImJvcmRlciIpO2lmKCFzfHxzPT0iMCIpe2lmKHAuaGFzVmlzdWFsKXtwLmRvbS5hZGRDbGFzcyh0LHEudmlzdWFsX3RhYmxlX2NsYXNzKX1lbHNle3AuZG9tLnJlbW92ZUNsYXNzKHQscS52aXN1YWxfdGFibGVfY2xhc3MpfX1yZXR1cm47Y2FzZSJBIjpzPXAuZG9tLmdldEF0dHJpYih0LCJuYW1lIik7aWYocyl7aWYocC5oYXNWaXN1YWwpe3AuZG9tLmFkZENsYXNzKHQsIm1jZUl0ZW1BbmNob3IiKX1lbHNle3AuZG9tLnJlbW92ZUNsYXNzKHQsIm1jZUl0ZW1BbmNob3IiKX19cmV0dXJufX0pO3Aub25WaXN1YWxBaWQuZGlzcGF0Y2gocCxyLHAuaGFzVmlzdWFsKX0scmVtb3ZlOmZ1bmN0aW9uKCl7dmFyIHA9dGhpcyxxPXAuZ2V0Q29udGFpbmVyKCk7cC5yZW1vdmVkPTE7cC5oaWRlKCk7cC5leGVjQ2FsbGJhY2soInJlbW92ZV9pbnN0YW5jZV9jYWxsYmFjayIscCk7cC5vblJlbW92ZS5kaXNwYXRjaChwKTtwLm9uRXhlY0NvbW1hbmQubGlzdGVuZXJzPVtdO20ucmVtb3ZlKHApO24ucmVtb3ZlKHEpfSxkZXN0cm95OmZ1bmN0aW9uKHEpe3ZhciBwPXRoaXM7aWYocC5kZXN0cm95ZWQpe3JldHVybn1pZighcSl7bS5yZW1vdmVVbmxvYWQocC5kZXN0cm95KTt0aW55TUNFLm9uQmVmb3JlVW5sb2FkLnJlbW92ZShwLl9iZWZvcmVVbmxvYWQpO2lmKHAudGhlbWUmJnAudGhlbWUuZGVzdHJveSl7cC50aGVtZS5kZXN0cm95KCl9cC5jb250cm9sTWFuYWdlci5kZXN0cm95KCk7cC5zZWxlY3Rpb24uZGVzdHJveSgpO3AuZG9tLmRlc3Ryb3koKTtpZighcC5zZXR0aW5ncy5jb250ZW50X2VkaXRhYmxlKXtqLmNsZWFyKHAuZ2V0V2luKCkpO2ouY2xlYXIocC5nZXREb2MoKSl9ai5jbGVhcihwLmdldEJvZHkoKSk7ai5jbGVhcihwLmZvcm1FbGVtZW50KX1pZihwLmZvcm1FbGVtZW50KXtwLmZvcm1FbGVtZW50LnN1Ym1pdD1wLmZvcm1FbGVtZW50Ll9tY2VPbGRTdWJtaXQ7cC5mb3JtRWxlbWVudC5fbWNlT2xkU3VibWl0PW51bGx9cC5jb250ZW50QXJlYUNvbnRhaW5lcj1wLmZvcm1FbGVtZW50PXAuY29udGFpbmVyPXAuc2V0dGluZ3MuY29udGVudF9lbGVtZW50PXAuYm9keUVsZW1lbnQ9cC5jb250ZW50RG9jdW1lbnQ9cC5jb250ZW50V2luZG93PW51bGw7aWYocC5zZWxlY3Rpb24pe3Auc2VsZWN0aW9uPXAuc2VsZWN0aW9uLndpbj1wLnNlbGVjdGlvbi5kb209cC5zZWxlY3Rpb24uZG9tLmRvYz1udWxsfXAuZGVzdHJveWVkPTF9LF9hZGRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgej10aGlzLHIsQT16LnNldHRpbmdzLHE9ei5kb20seD17bW91c2V1cDoib25Nb3VzZVVwIixtb3VzZWRvd246Im9uTW91c2VEb3duIixjbGljazoib25DbGljayIsa2V5dXA6Im9uS2V5VXAiLGtleWRvd246Im9uS2V5RG93biIsa2V5cHJlc3M6Im9uS2V5UHJlc3MiLHN1Ym1pdDoib25TdWJtaXQiLHJlc2V0OiJvblJlc2V0Iixjb250ZXh0bWVudToib25Db250ZXh0TWVudSIsZGJsY2xpY2s6Im9uRGJsQ2xpY2siLHBhc3RlOiJvblBhc3RlIn07ZnVuY3Rpb24gcCh0LEIpe3ZhciBzPXQudHlwZTtpZih6LnJlbW92ZWQpe3JldHVybn1pZih6Lm9uRXZlbnQuZGlzcGF0Y2goeix0LEIpIT09ZmFsc2Upe3pbeFt0LmZha2VUeXBlfHx0LnR5cGVdXS5kaXNwYXRjaCh6LHQsQil9fWkoeCxmdW5jdGlvbih0LHMpe3N3aXRjaChzKXtjYXNlImNvbnRleHRtZW51IjppZihtLmlzT3BlcmEpe3EuYmluZCh6LmdldEJvZHkoKSwibW91c2Vkb3duIixmdW5jdGlvbihCKXtpZihCLmN0cmxLZXkpe0IuZmFrZVR5cGU9ImNvbnRleHRtZW51IjtwKEIpfX0pfWVsc2V7cS5iaW5kKHouZ2V0Qm9keSgpLHMscCl9YnJlYWs7Y2FzZSJwYXN0ZSI6cS5iaW5kKHouZ2V0Qm9keSgpLHMsZnVuY3Rpb24oQil7cChCKX0pO2JyZWFrO2Nhc2Uic3VibWl0IjpjYXNlInJlc2V0IjpxLmJpbmQoei5nZXRFbGVtZW50KCkuZm9ybXx8bi5nZXRQYXJlbnQoei5pZCwiZm9ybSIpLHMscCk7YnJlYWs7ZGVmYXVsdDpxLmJpbmQoQS5jb250ZW50X2VkaXRhYmxlP3ouZ2V0Qm9keSgpOnouZ2V0RG9jKCkscyxwKX19KTtxLmJpbmQoQS5jb250ZW50X2VkaXRhYmxlP3ouZ2V0Qm9keSgpOihhP3ouZ2V0RG9jKCk6ei5nZXRXaW4oKSksImZvY3VzIixmdW5jdGlvbihzKXt6LmZvY3VzKHRydWUpfSk7aWYobS5pc0dlY2tvKXtxLmJpbmQoei5nZXREb2MoKSwiRE9NTm9kZUluc2VydGVkIixmdW5jdGlvbih0KXt2YXIgczt0PXQudGFyZ2V0O2lmKHQubm9kZVR5cGU9PT0xJiZ0Lm5vZGVOYW1lPT09IklNRyImJihzPXQuZ2V0QXR0cmlidXRlKCJfbWNlX3NyYyIpKSl7dC5zcmM9ei5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShzKX19KX1pZihhKXtmdW5jdGlvbiB1KCl7dmFyIEM9dGhpcyxFPUMuZ2V0RG9jKCksRD1DLnNldHRpbmdzO2lmKGEmJiFELnJlYWRvbmx5KXtpZihDLl9pc0hpZGRlbigpKXt0cnl7aWYoIUQuY29udGVudF9lZGl0YWJsZSl7RS5kZXNpZ25Nb2RlPSJPbiJ9fWNhdGNoKEIpe319dHJ5e0UuZXhlY0NvbW1hbmQoInN0eWxlV2l0aENTUyIsMCxmYWxzZSl9Y2F0Y2goQil7aWYoIUMuX2lzSGlkZGVuKCkpe3RyeXtFLmV4ZWNDb21tYW5kKCJ1c2VDU1MiLDAsdHJ1ZSl9Y2F0Y2goQil7fX19aWYoIUQudGFibGVfaW5saW5lX2VkaXRpbmcpe3RyeXtFLmV4ZWNDb21tYW5kKCJlbmFibGVJbmxpbmVUYWJsZUVkaXRpbmciLGZhbHNlLGZhbHNlKX1jYXRjaChCKXt9fWlmKCFELm9iamVjdF9yZXNpemluZyl7dHJ5e0UuZXhlY0NvbW1hbmQoImVuYWJsZU9iamVjdFJlc2l6aW5nIixmYWxzZSxmYWxzZSl9Y2F0Y2goQil7fX19fXoub25CZWZvcmVFeGVjQ29tbWFuZC5hZGQodSk7ei5vbk1vdXNlRG93bi5hZGQodSl9aWYobS5pc1dlYktpdCl7ei5vbkNsaWNrLmFkZChmdW5jdGlvbihzLHQpe3Q9dC50YXJnZXQ7aWYodC5ub2RlTmFtZT09IklNRyJ8fCh0Lm5vZGVOYW1lPT0iQSImJnEuaGFzQ2xhc3ModCwibWNlSXRlbUFuY2hvciIpKSl7ei5zZWxlY3Rpb24uZ2V0U2VsKCkuc2V0QmFzZUFuZEV4dGVudCh0LDAsdCwxKTt6Lm5vZGVDaGFuZ2VkKCl9fSl9ei5vbk1vdXNlVXAuYWRkKHoubm9kZUNoYW5nZWQpO3oub25LZXlVcC5hZGQoZnVuY3Rpb24ocyx0KXt2YXIgQj10LmtleUNvZGU7aWYoKEI+PTMzJiZCPD0zNil8fChCPj0zNyYmQjw9NDApfHxCPT0xM3x8Qj09NDV8fEI9PTQ2fHxCPT04fHwobS5pc01hYyYmKEI9PTkxfHxCPT05MykpfHx0LmN0cmxLZXkpe3oubm9kZUNoYW5nZWQoKX19KTt6Lm9uUmVzZXQuYWRkKGZ1bmN0aW9uKCl7ei5zZXRDb250ZW50KHouc3RhcnRDb250ZW50LHtmb3JtYXQ6InJhdyJ9KX0pO2lmKEEuY3VzdG9tX3Nob3J0Y3V0cyl7aWYoQS5jdXN0b21fdW5kb19yZWRvX2tleWJvYXJkX3Nob3J0Y3V0cyl7ei5hZGRTaG9ydGN1dCgiY3RybCt6Iix6LmdldExhbmcoInVuZG9fZGVzYyIpLCJVbmRvIik7ei5hZGRTaG9ydGN1dCgiY3RybCt5Iix6LmdldExhbmcoInJlZG9fZGVzYyIpLCJSZWRvIil9ei5hZGRTaG9ydGN1dCgiY3RybCtiIix6LmdldExhbmcoImJvbGRfZGVzYyIpLCJCb2xkIik7ei5hZGRTaG9ydGN1dCgiY3RybCtpIix6LmdldExhbmcoIml0YWxpY19kZXNjIiksIkl0YWxpYyIpO3ouYWRkU2hvcnRjdXQoImN0cmwrdSIsei5nZXRMYW5nKCJ1bmRlcmxpbmVfZGVzYyIpLCJVbmRlcmxpbmUiKTtmb3Iocj0xO3I8PTY7cisrKXt6LmFkZFNob3J0Y3V0KCJjdHJsKyIrciwiIixbIkZvcm1hdEJsb2NrIixmYWxzZSwiaCIrcl0pfXouYWRkU2hvcnRjdXQoImN0cmwrNyIsIiIsWyJGb3JtYXRCbG9jayIsZmFsc2UsIjxwPiJdKTt6LmFkZFNob3J0Y3V0KCJjdHJsKzgiLCIiLFsiRm9ybWF0QmxvY2siLGZhbHNlLCI8ZGl2PiJdKTt6LmFkZFNob3J0Y3V0KCJjdHJsKzkiLCIiLFsiRm9ybWF0QmxvY2siLGZhbHNlLCI8YWRkcmVzcz4iXSk7ZnVuY3Rpb24gdih0KXt2YXIgcz1udWxsO2lmKCF0LmFsdEtleSYmIXQuY3RybEtleSYmIXQubWV0YUtleSl7cmV0dXJuIHN9aSh6LnNob3J0Y3V0cyxmdW5jdGlvbihCKXtpZihtLmlzTWFjJiZCLmN0cmwhPXQubWV0YUtleSl7cmV0dXJufWVsc2V7aWYoIW0uaXNNYWMmJkIuY3RybCE9dC5jdHJsS2V5KXtyZXR1cm59fWlmKEIuYWx0IT10LmFsdEtleSl7cmV0dXJufWlmKEIuc2hpZnQhPXQuc2hpZnRLZXkpe3JldHVybn1pZih0LmtleUNvZGU9PUIua2V5Q29kZXx8KHQuY2hhckNvZGUmJnQuY2hhckNvZGU9PUIuY2hhckNvZGUpKXtzPUI7cmV0dXJuIGZhbHNlfX0pO3JldHVybiBzfXoub25LZXlVcC5hZGQoZnVuY3Rpb24ocyx0KXt2YXIgQj12KHQpO2lmKEIpe3JldHVybiBqLmNhbmNlbCh0KX19KTt6Lm9uS2V5UHJlc3MuYWRkKGZ1bmN0aW9uKHMsdCl7dmFyIEI9dih0KTtpZihCKXtyZXR1cm4gai5jYW5jZWwodCl9fSk7ei5vbktleURvd24uYWRkKGZ1bmN0aW9uKHMsdCl7dmFyIEI9dih0KTtpZihCKXtCLmZ1bmMuY2FsbChCLnNjb3BlKTtyZXR1cm4gai5jYW5jZWwodCl9fSl9aWYobS5pc0lFKXtxLmJpbmQoei5nZXREb2MoKSwiY29udHJvbHNlbGVjdCIsZnVuY3Rpb24oQil7dmFyIHQ9ei5yZXNpemVJbmZvLHM7Qj1CLnRhcmdldDtpZihCLm5vZGVOYW1lIT09IklNRyIpe3JldHVybn1pZih0KXtxLnVuYmluZCh0Lm5vZGUsdC5ldix0LmNiKX1pZighcS5oYXNDbGFzcyhCLCJtY2VJdGVtTm9SZXNpemUiKSl7ZXY9InJlc2l6ZWVuZCI7cz1xLmJpbmQoQixldixmdW5jdGlvbihEKXt2YXIgQztEPUQudGFyZ2V0O2lmKEM9cS5nZXRTdHlsZShELCJ3aWR0aCIpKXtxLnNldEF0dHJpYihELCJ3aWR0aCIsQy5yZXBsYWNlKC9bXjAtOSVdKy9nLCIiKSk7cS5zZXRTdHlsZShELCJ3aWR0aCIsIiIpfWlmKEM9cS5nZXRTdHlsZShELCJoZWlnaHQiKSl7cS5zZXRBdHRyaWIoRCwiaGVpZ2h0IixDLnJlcGxhY2UoL1teMC05JV0rL2csIiIpKTtxLnNldFN0eWxlKEQsImhlaWdodCIsIiIpfX0pfWVsc2V7ZXY9InJlc2l6ZXN0YXJ0IjtzPXEuYmluZChCLCJyZXNpemVzdGFydCIsai5jYW5jZWwsail9dD16LnJlc2l6ZUluZm89e25vZGU6QixldjpldixjYjpzfX0pO3oub25LZXlEb3duLmFkZChmdW5jdGlvbihzLHQpe3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgODppZih6LnNlbGVjdGlvbi5nZXRSbmcoKS5pdGVtKXtzLmRvbS5yZW1vdmUoei5zZWxlY3Rpb24uZ2V0Um5nKCkuaXRlbSgwKSk7cmV0dXJuIGouY2FuY2VsKHQpfX19KX1pZihtLmlzT3BlcmEpe3oub25DbGljay5hZGQoZnVuY3Rpb24ocyx0KXtqLnByZXZlbnQodCl9KX1pZihBLmN1c3RvbV91bmRvX3JlZG8pe2Z1bmN0aW9uIHkoKXt6LnVuZG9NYW5hZ2VyLnR5cGluZz0wO3oudW5kb01hbmFnZXIuYWRkKCl9cS5iaW5kKHouZ2V0RG9jKCksImZvY3Vzb3V0IixmdW5jdGlvbihzKXtpZighei5yZW1vdmVkJiZ6LnVuZG9NYW5hZ2VyLnR5cGluZyl7eSgpfX0pO3oub25LZXlVcC5hZGQoZnVuY3Rpb24ocyx0KXtpZigodC5rZXlDb2RlPj0zMyYmdC5rZXlDb2RlPD0zNil8fCh0LmtleUNvZGU+PTM3JiZ0LmtleUNvZGU8PTQwKXx8dC5rZXlDb2RlPT0xM3x8dC5rZXlDb2RlPT00NXx8dC5jdHJsS2V5KXt5KCl9fSk7ei5vbktleURvd24uYWRkKGZ1bmN0aW9uKHQsRSl7dmFyIHMsRCxDO2lmKGImJkUua2V5Q29kZT09NDYpe3M9ei5zZWxlY3Rpb24uZ2V0Um5nKCk7aWYocy5wYXJlbnRFbGVtZW50KXtEPXMucGFyZW50RWxlbWVudCgpO2lmKEUuY3RybEtleSl7cy5tb3ZlRW5kKCJ3b3JkIiwxKTtzLnNlbGVjdCgpfXouc2VsZWN0aW9uLmdldFNlbCgpLmNsZWFyKCk7aWYocy5wYXJlbnRFbGVtZW50KCk9PUQpe0M9ei5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKTt0cnl7RC5pbm5lckhUTUw9RC5pbm5lckhUTUx9Y2F0Y2goQil7fXouc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKEMpfUUucHJldmVudERlZmF1bHQoKTtyZXR1cm59fWlmKChFLmtleUNvZGU+PTMzJiZFLmtleUNvZGU8PTM2KXx8KEUua2V5Q29kZT49MzcmJkUua2V5Q29kZTw9NDApfHxFLmtleUNvZGU9PTEzfHxFLmtleUNvZGU9PTQ1KXtpZih6LnVuZG9NYW5hZ2VyLnR5cGluZyl7eSgpfXJldHVybn1pZighei51bmRvTWFuYWdlci50eXBpbmcpe3oudW5kb01hbmFnZXIuYWRkKCk7ei51bmRvTWFuYWdlci50eXBpbmc9MX19KTt6Lm9uTW91c2VEb3duLmFkZChmdW5jdGlvbigpe2lmKHoudW5kb01hbmFnZXIudHlwaW5nKXt5KCl9fSl9fSxfaXNIaWRkZW46ZnVuY3Rpb24oKXt2YXIgcDtpZighYSl7cmV0dXJuIDB9cD10aGlzLnNlbGVjdGlvbi5nZXRTZWwoKTtyZXR1cm4oIXB8fCFwLnJhbmdlQ291bnR8fHAucmFuZ2VDb3VudD09MCl9LF9maXhOZXN0aW5nOmZ1bmN0aW9uKHEpe3ZhciByPVtdLHA7cT1xLnJlcGxhY2UoLzwoXC8pPyhbXlxzPl0rKVtePl0qPz4vZyxmdW5jdGlvbih0LHMsdil7dmFyIHU7aWYocz09PSIvIil7aWYoIXIubGVuZ3RoKXtyZXR1cm4iIn1pZih2IT09cltyLmxlbmd0aC0xXS50YWcpe2ZvcihwPXIubGVuZ3RoLTE7cD49MDtwLS0pe2lmKHJbcF0udGFnPT09dil7cltwXS5jbG9zZT0xO2JyZWFrfX1yZXR1cm4iIn1lbHNle3IucG9wKCk7aWYoci5sZW5ndGgmJnJbci5sZW5ndGgtMV0uY2xvc2Upe3Q9dCsiPC8iK3Jbci5sZW5ndGgtMV0udGFnKyI+IjtyLnBvcCgpfX19ZWxzZXtpZigvXihicnxocnxpbnB1dHxtZXRhfGltZ3xsaW5rfHBhcmFtKSQvaS50ZXN0KHYpKXtyZXR1cm4gdH1pZigvXC8+JC8udGVzdCh0KSl7cmV0dXJuIHR9ci5wdXNoKHt0YWc6dn0pfXJldHVybiB0fSk7Zm9yKHA9ci5sZW5ndGgtMTtwPj0wO3AtLSl7cSs9IjwvIityW3BdLnRhZysiPiJ9cmV0dXJuIHF9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oYyl7dmFyIGQ9Yy5lYWNoLGUsYT10cnVlLGI9ZmFsc2U7Yy5FZGl0b3JDb21tYW5kcz1mdW5jdGlvbihuKXt2YXIgbD1uLmRvbSxwPW4uc2VsZWN0aW9uLGo9e3N0YXRlOnt9LGV4ZWM6e30sdmFsdWU6e319LGs9bi5zZXR0aW5ncyxvO2Z1bmN0aW9uIHEoeSx4LHYpe3ZhciB1O3k9eS50b0xvd2VyQ2FzZSgpO2lmKHU9ai5leGVjW3ldKXt1KHkseCx2KTtyZXR1cm4gYX1yZXR1cm4gYn1mdW5jdGlvbiBtKHYpe3ZhciB1O3Y9di50b0xvd2VyQ2FzZSgpO2lmKHU9ai5zdGF0ZVt2XSl7cmV0dXJuIHUodil9cmV0dXJuIC0xfWZ1bmN0aW9uIGgodil7dmFyIHU7dj12LnRvTG93ZXJDYXNlKCk7aWYodT1qLnZhbHVlW3ZdKXtyZXR1cm4gdSh2KX1yZXR1cm4gYn1mdW5jdGlvbiB0KHUsdil7dj12fHwiZXhlYyI7ZCh1LGZ1bmN0aW9uKHkseCl7ZCh4LnRvTG93ZXJDYXNlKCkuc3BsaXQoIiwiKSxmdW5jdGlvbih6KXtqW3ZdW3pdPXl9KX0pfWMuZXh0ZW5kKHRoaXMse2V4ZWNDb21tYW5kOnEscXVlcnlDb21tYW5kU3RhdGU6bSxxdWVyeUNvbW1hbmRWYWx1ZTpoLGFkZENvbW1hbmRzOnR9KTtmdW5jdGlvbiBmKHgsdix1KXtpZih2PT09ZSl7dj1ifWlmKHU9PT1lKXt1PW51bGx9cmV0dXJuIG4uZ2V0RG9jKCkuZXhlY0NvbW1hbmQoeCx2LHUpfWZ1bmN0aW9uIHModSl7cmV0dXJuIG4uZm9ybWF0dGVyLm1hdGNoKHUpfWZ1bmN0aW9uIHIodSx2KXtuLmZvcm1hdHRlci50b2dnbGUodSx2P3t2YWx1ZTp2fTplKX1mdW5jdGlvbiBpKHUpe289cC5nZXRCb29rbWFyayh1KX1mdW5jdGlvbiBnKCl7cC5tb3ZlVG9Cb29rbWFyayhvKX10KHsibWNlUmVzZXREZXNpZ25Nb2RlLG1jZUJlZ2luVW5kb0xldmVsIjpmdW5jdGlvbigpe30sIm1jZUVuZFVuZG9MZXZlbCxtY2VBZGRVbmRvTGV2ZWwiOmZ1bmN0aW9uKCl7bi51bmRvTWFuYWdlci5hZGQoKX0sIkN1dCxDb3B5LFBhc3RlIjpmdW5jdGlvbih5KXt2YXIgeD1uLmdldERvYygpLHU7dHJ5e2YoeSl9Y2F0Y2godil7dT1hfWlmKHV8fCF4LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZCh5KSl7aWYoYy5pc0dlY2tvKXtuLndpbmRvd01hbmFnZXIuY29uZmlybShuLmdldExhbmcoImNsaXBib2FyZF9tc2ciKSxmdW5jdGlvbih6KXtpZih6KXtvcGVuKCJodHRwOi8vd3d3Lm1vemlsbGEub3JnL2VkaXRvci9taWRhc2RlbW8vc2VjdXJpdHlwcmVmcy5odG1sIiwiX2JsYW5rIil9fSl9ZWxzZXtuLndpbmRvd01hbmFnZXIuYWxlcnQobi5nZXRMYW5nKCJjbGlwYm9hcmRfbm9fc3VwcG9ydCIpKX19fSx1bmxpbms6ZnVuY3Rpb24odSl7aWYocC5pc0NvbGxhcHNlZCgpKXtwLnNlbGVjdChwLmdldE5vZGUoKSl9Zih1KTtwLmNvbGxhcHNlKGIpfSwiSnVzdGlmeUxlZnQsSnVzdGlmeUNlbnRlcixKdXN0aWZ5UmlnaHQsSnVzdGlmeUZ1bGwiOmZ1bmN0aW9uKHUpe3ZhciB2PXUuc3Vic3RyaW5nKDcpO2QoImxlZnQsY2VudGVyLHJpZ2h0LGZ1bGwiLnNwbGl0KCIsIiksZnVuY3Rpb24oeCl7aWYodiE9eCl7bi5mb3JtYXR0ZXIucmVtb3ZlKCJhbGlnbiIreCl9fSk7cigiYWxpZ24iK3YpfSwiSW5zZXJ0VW5vcmRlcmVkTGlzdCxJbnNlcnRPcmRlcmVkTGlzdCI6ZnVuY3Rpb24oeCl7dmFyIHUsdjtmKHgpO3U9bC5nZXRQYXJlbnQocC5nZXROb2RlKCksIm9sLHVsIik7aWYodSl7dj11LnBhcmVudE5vZGU7aWYoL14oSFsxLTZdfFB8QUREUkVTU3xQUkUpJC8udGVzdCh2Lm5vZGVOYW1lKSl7aSgpO2wuc3BsaXQodix1KTtnKCl9fX0sIkJvbGQsSXRhbGljLFVuZGVybGluZSxTdHJpa2V0aHJvdWdoIjpmdW5jdGlvbih1KXtyKHUpfSwiRm9yZUNvbG9yLEhpbGl0ZUNvbG9yLEZvbnROYW1lIjpmdW5jdGlvbih4LHYsdSl7cih4LHUpfSxGb250U2l6ZTpmdW5jdGlvbih5LHgsdil7dmFyIHUsejtpZih2Pj0xJiZ2PD03KXt6PWMuZXhwbG9kZShrLmZvbnRfc2l6ZV9zdHlsZV92YWx1ZXMpO3U9Yy5leHBsb2RlKGsuZm9udF9zaXplX2NsYXNzZXMpO2lmKHUpe3Y9dVt2LTFdfHx2fWVsc2V7dj16W3YtMV18fHZ9fXIoeSx2KX0sUmVtb3ZlRm9ybWF0OmZ1bmN0aW9uKHUpe24uZm9ybWF0dGVyLnJlbW92ZSh1KX0sbWNlQmxvY2tRdW90ZTpmdW5jdGlvbih1KXtyKCJibG9ja3F1b3RlIil9LEZvcm1hdEJsb2NrOmZ1bmN0aW9uKHgsdix1KXtyZXR1cm4gcih1fHwicCIpfSxtY2VDbGVhbnVwOmZ1bmN0aW9uKCl7dmFyIHU9cC5nZXRCb29rbWFyaygpO24uc2V0Q29udGVudChuLmdldENvbnRlbnQoe2NsZWFudXA6YX0pLHtjbGVhbnVwOmF9KTtwLm1vdmVUb0Jvb2ttYXJrKHUpfSxtY2VSZW1vdmVOb2RlOmZ1bmN0aW9uKHkseCx2KXt2YXIgdT12fHxwLmdldE5vZGUoKTtpZih1IT1uLmdldEJvZHkoKSl7aSgpO24uZG9tLnJlbW92ZSh1LGEpO2coKX19LG1jZVNlbGVjdE5vZGVEZXB0aDpmdW5jdGlvbih5LHgsdil7dmFyIHU9MDtsLmdldFBhcmVudChwLmdldE5vZGUoKSxmdW5jdGlvbih6KXtpZih6Lm5vZGVUeXBlPT0xJiZ1Kys9PXYpe3Auc2VsZWN0KHopO3JldHVybiBifX0sbi5nZXRCb2R5KCkpfSxtY2VTZWxlY3ROb2RlOmZ1bmN0aW9uKHgsdix1KXtwLnNlbGVjdCh1KX0sbWNlSW5zZXJ0Q29udGVudDpmdW5jdGlvbih4LHYsdSl7cC5zZXRDb250ZW50KHUpfSxtY2VJbnNlcnRSYXdIVE1MOmZ1bmN0aW9uKHgsdix1KXtwLnNldENvbnRlbnQoInRpbnlfbWNlX21hcmtlciIpO24uc2V0Q29udGVudChuLmdldENvbnRlbnQoKS5yZXBsYWNlKC90aW55X21jZV9tYXJrZXIvZyxmdW5jdGlvbigpe3JldHVybiB1fSkpfSxtY2VTZXRDb250ZW50OmZ1bmN0aW9uKHgsdix1KXtuLnNldENvbnRlbnQodSl9LCJJbmRlbnQsT3V0ZGVudCI6ZnVuY3Rpb24oeSl7dmFyIHYsdSx4O3Y9ay5pbmRlbnRhdGlvbjt1PS9bYS16JV0rJC9pLmV4ZWModik7dj1wYXJzZUludCh2KTtpZighbSgiSW5zZXJ0VW5vcmRlcmVkTGlzdCIpJiYhbSgiSW5zZXJ0T3JkZXJlZExpc3QiKSl7ZChwLmdldFNlbGVjdGVkQmxvY2tzKCksZnVuY3Rpb24oeil7aWYoeT09Im91dGRlbnQiKXt4PU1hdGgubWF4KDAscGFyc2VJbnQoei5zdHlsZS5wYWRkaW5nTGVmdHx8MCktdik7bC5zZXRTdHlsZSh6LCJwYWRkaW5nTGVmdCIseD94K3U6IiIpfWVsc2V7bC5zZXRTdHlsZSh6LCJwYWRkaW5nTGVmdCIsKHBhcnNlSW50KHouc3R5bGUucGFkZGluZ0xlZnR8fDApK3YpK3UpfX0pfWVsc2V7Zih5KX19LG1jZVJlcGFpbnQ6ZnVuY3Rpb24oKXt2YXIgdjtpZihjLmlzR2Vja28pe3RyeXtpKGEpO2lmKHAuZ2V0U2VsKCkpe3AuZ2V0U2VsKCkuc2VsZWN0QWxsQ2hpbGRyZW4obi5nZXRCb2R5KCkpfXAuY29sbGFwc2UoYSk7ZygpfWNhdGNoKHUpe319fSxtY2VUb2dnbGVGb3JtYXQ6ZnVuY3Rpb24oeCx2LHUpe24uZm9ybWF0dGVyLnRvZ2dsZSh1KX0sSW5zZXJ0SG9yaXpvbnRhbFJ1bGU6ZnVuY3Rpb24oKXtwLnNldENvbnRlbnQoIjxociAvPiIpfSxtY2VUb2dnbGVWaXN1YWxBaWQ6ZnVuY3Rpb24oKXtuLmhhc1Zpc3VhbD0hbi5oYXNWaXN1YWw7bi5hZGRWaXN1YWwoKX0sbWNlUmVwbGFjZUNvbnRlbnQ6ZnVuY3Rpb24oeCx2LHUpe3Auc2V0Q29udGVudCh1LnJlcGxhY2UoL1x7XCRzZWxlY3Rpb25cfS9nLHAuZ2V0Q29udGVudCh7Zm9ybWF0OiJ0ZXh0In0pKSl9LG1jZUluc2VydExpbms6ZnVuY3Rpb24oeSx4LHYpe3ZhciB1PWwuZ2V0UGFyZW50KHAuZ2V0Tm9kZSgpLCJhIik7aWYoYy5pcyh2LCJzdHJpbmciKSl7dj17aHJlZjp2fX1pZighdSl7ZigiQ3JlYXRlTGluayIsYiwiamF2YXNjcmlwdDptY3RtcCgwKTsiKTtkKGwuc2VsZWN0KCJhW2hyZWY9amF2YXNjcmlwdDptY3RtcCgwKTtdIiksZnVuY3Rpb24oeil7bC5zZXRBdHRyaWJzKHosdil9KX1lbHNle2lmKHYuaHJlZil7bC5zZXRBdHRyaWJzKHUsdil9ZWxzZXtuLmRvbS5yZW1vdmUodSxhKX19fSxzZWxlY3RBbGw6ZnVuY3Rpb24oKXt2YXIgdj1sLmdldFJvb3QoKSx1PWwuY3JlYXRlUm5nKCk7dS5zZXRTdGFydCh2LDApO3Uuc2V0RW5kKHYsdi5jaGlsZE5vZGVzLmxlbmd0aCk7bi5zZWxlY3Rpb24uc2V0Um5nKHUpfX0pO3QoeyJKdXN0aWZ5TGVmdCxKdXN0aWZ5Q2VudGVyLEp1c3RpZnlSaWdodCxKdXN0aWZ5RnVsbCI6ZnVuY3Rpb24odSl7cmV0dXJuIHMoImFsaWduIit1LnN1YnN0cmluZyg3KSl9LCJCb2xkLEl0YWxpYyxVbmRlcmxpbmUsU3RyaWtldGhyb3VnaCI6ZnVuY3Rpb24odSl7cmV0dXJuIHModSl9LG1jZUJsb2NrUXVvdGU6ZnVuY3Rpb24oKXtyZXR1cm4gcygiYmxvY2txdW90ZSIpfSxPdXRkZW50OmZ1bmN0aW9uKCl7dmFyIHU7aWYoay5pbmxpbmVfc3R5bGVzKXtpZigodT1sLmdldFBhcmVudChwLmdldFN0YXJ0KCksbC5pc0Jsb2NrKSkmJnBhcnNlSW50KHUuc3R5bGUucGFkZGluZ0xlZnQpPjApe3JldHVybiBhfWlmKCh1PWwuZ2V0UGFyZW50KHAuZ2V0RW5kKCksbC5pc0Jsb2NrKSkmJnBhcnNlSW50KHUuc3R5bGUucGFkZGluZ0xlZnQpPjApe3JldHVybiBhfX1yZXR1cm4gbSgiSW5zZXJ0VW5vcmRlcmVkTGlzdCIpfHxtKCJJbnNlcnRPcmRlcmVkTGlzdCIpfHwoIWsuaW5saW5lX3N0eWxlcyYmISFsLmdldFBhcmVudChwLmdldE5vZGUoKSwiQkxPQ0tRVU9URSIpKX0sIkluc2VydFVub3JkZXJlZExpc3QsSW5zZXJ0T3JkZXJlZExpc3QiOmZ1bmN0aW9uKHUpe3JldHVybiBsLmdldFBhcmVudChwLmdldE5vZGUoKSx1PT0iaW5zZXJ0dW5vcmRlcmVkbGlzdCI/IlVMIjoiT0wiKX19LCJzdGF0ZSIpO3QoeyJGb250U2l6ZSxGb250TmFtZSI6ZnVuY3Rpb24oeCl7dmFyIHY9MCx1O2lmKHU9bC5nZXRQYXJlbnQocC5nZXROb2RlKCksInNwYW4iKSl7aWYoeD09ImZvbnRzaXplIil7dj11LnN0eWxlLmZvbnRTaXplfWVsc2V7dj11LnN0eWxlLmZvbnRGYW1pbHkucmVwbGFjZSgvLCAvZywiLCIpLnJlcGxhY2UoL1tcJ1wiXS9nLCIiKS50b0xvd2VyQ2FzZSgpfX1yZXR1cm4gdn19LCJ2YWx1ZSIpO2lmKGsuY3VzdG9tX3VuZG9fcmVkbyl7dCh7VW5kbzpmdW5jdGlvbigpe24udW5kb01hbmFnZXIudW5kbygpfSxSZWRvOmZ1bmN0aW9uKCl7bi51bmRvTWFuYWdlci5yZWRvKCl9fSl9fX0pKHRpbnltY2UpOyhmdW5jdGlvbihiKXt2YXIgYT1iLnV0aWwuRGlzcGF0Y2hlcjtiLlVuZG9NYW5hZ2VyPWZ1bmN0aW9uKGUpe3ZhciBjLGQ9MCxnPVtdO2Z1bmN0aW9uIGYoKXtyZXR1cm4gYi50cmltKGUuZ2V0Q29udGVudCh7Zm9ybWF0OiJyYXciLG5vX2V2ZW50czoxfSkpfXJldHVybiBjPXt0eXBpbmc6MCxvbkFkZDpuZXcgYShjKSxvblVuZG86bmV3IGEoYyksb25SZWRvOm5ldyBhKGMpLGFkZDpmdW5jdGlvbihsKXt2YXIgaCxqPWUuc2V0dGluZ3MsaztsPWx8fHt9O2wuY29udGVudD1mKCk7az1nW2RdO2lmKGsmJmsuY29udGVudD09bC5jb250ZW50KXtpZihkPjB8fGcubGVuZ3RoPT0xKXtyZXR1cm4gbnVsbH19aWYoai5jdXN0b21fdW5kb19yZWRvX2xldmVscyl7aWYoZy5sZW5ndGg+ai5jdXN0b21fdW5kb19yZWRvX2xldmVscyl7Zm9yKGg9MDtoPGcubGVuZ3RoLTE7aCsrKXtnW2hdPWdbaCsxXX1nLmxlbmd0aC0tO2Q9Zy5sZW5ndGh9fWwuYm9va21hcms9ZS5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMix0cnVlKTtpZihkPGcubGVuZ3RoLTEpe2lmKGQ9PTApe2c9W119ZWxzZXtnLmxlbmd0aD1kKzF9fWcucHVzaChsKTtkPWcubGVuZ3RoLTE7Yy5vbkFkZC5kaXNwYXRjaChjLGwpO2UuaXNOb3REaXJ0eT0wO3JldHVybiBsfSx1bmRvOmZ1bmN0aW9uKCl7dmFyIGosaDtpZihjLnR5cGluZyl7Yy5hZGQoKTtjLnR5cGluZz0wfWlmKGQ+MCl7aj1nWy0tZF07ZS5zZXRDb250ZW50KGouY29udGVudCx7Zm9ybWF0OiJyYXcifSk7ZS5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoai5ib29rbWFyayk7Yy5vblVuZG8uZGlzcGF0Y2goYyxqKX1yZXR1cm4gan0scmVkbzpmdW5jdGlvbigpe3ZhciBoO2lmKGQ8Zy5sZW5ndGgtMSl7aD1nWysrZF07ZS5zZXRDb250ZW50KGguY29udGVudCx7Zm9ybWF0OiJyYXcifSk7ZS5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoaC5ib29rbWFyayk7Yy5vblJlZG8uZGlzcGF0Y2goYyxoKX1yZXR1cm4gaH0sY2xlYXI6ZnVuY3Rpb24oKXtnPVtdO2Q9Yy50eXBpbmc9MH0saGFzVW5kbzpmdW5jdGlvbigpe3JldHVybiBkPjB8fGMudHlwaW5nfSxoYXNSZWRvOmZ1bmN0aW9uKCl7cmV0dXJuIGQ8Zy5sZW5ndGgtMX19fX0pKHRpbnltY2UpOyhmdW5jdGlvbihtKXt2YXIgaz1tLmRvbS5FdmVudCxjPW0uaXNJRSxhPW0uaXNHZWNrbyxiPW0uaXNPcGVyYSxqPW0uZWFjaCxpPW0uZXh0ZW5kLGQ9dHJ1ZSxoPWZhbHNlO2Z1bmN0aW9uIGwocCl7dmFyIHEsbyxuO2Rve2lmKC9eKFNQQU58U1RST05HfEJ8RU18SXxGT05UfFNUUklLRXxVKSQvLnRlc3QocC5ub2RlTmFtZSkpe2lmKHEpe289cC5jbG9uZU5vZGUoZmFsc2UpO28uYXBwZW5kQ2hpbGQocSk7cT1vfWVsc2V7cT1uPXAuY2xvbmVOb2RlKGZhbHNlKX1xLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19d2hpbGUocD1wLnBhcmVudE5vZGUpO2lmKHEpe3JldHVybnt3cmFwcGVyOnEsaW5uZXI6bn19fWZ1bmN0aW9uIGcobyxwKXt2YXIgbj1wLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtuLnNldFN0YXJ0KG8uZW5kQ29udGFpbmVyLG8uZW5kT2Zmc2V0KTtuLnNldEVuZEFmdGVyKHApO3JldHVybiBuLmNsb25lQ29udGVudHMoKS50ZXh0Q29udGVudC5sZW5ndGg9PTB9ZnVuY3Rpb24gZihvKXtvPW8uaW5uZXJIVE1MO289by5yZXBsYWNlKC88KGltZ3xocnx0YWJsZXxpbnB1dHxzZWxlY3R8dGV4dGFyZWEpWyBcPl0vZ2ksIi0iKTtvPW8ucmVwbGFjZSgvPFtePl0rPi9nLCIiKTtyZXR1cm4gby5yZXBsYWNlKC9bIFx1MDBhMFx0XHJcbl0rL2csIiIpPT0iIn1mdW5jdGlvbiBlKHAscixuKXt2YXIgbyxxO2lmKGYobikpe289ci5nZXRQYXJlbnQobiwidWwsb2wiKTtpZighci5nZXRQYXJlbnQoby5wYXJlbnROb2RlLCJ1bCxvbCIpKXtyLnNwbGl0KG8sbik7cT1yLmNyZWF0ZSgicCIsMCwnPGJyIF9tY2VfYm9ndXM9IjEiIC8+Jyk7ci5yZXBsYWNlKHEsbik7cC5zZWxlY3QocSwxKX1yZXR1cm4gaH1yZXR1cm4gZH1tLmNyZWF0ZSgidGlueW1jZS5Gb3JjZUJsb2NrcyIse0ZvcmNlQmxvY2tzOmZ1bmN0aW9uKG8pe3ZhciBwPXRoaXMscT1vLnNldHRpbmdzLHI7cC5lZGl0b3I9bztwLmRvbT1vLmRvbTtyPShxLmZvcmNlZF9yb290X2Jsb2NrfHwicCIpLnRvTG93ZXJDYXNlKCk7cS5lbGVtZW50PXIudG9VcHBlckNhc2UoKTtvLm9uUHJlSW5pdC5hZGQocC5zZXR1cCxwKTtwLnJlT3BlcmE9bmV3IFJlZ0V4cCgiKFxcdTAwYTB8JiMxNjA7fCZuYnNwOyk8LyIrcisiPiIsImdpIik7cC5yZVBhZGQ9bmV3IFJlZ0V4cCgiPHAoICkoW14+XSspPjxcXC9wPnw8cCggKShbXj5dKylcXC8+fDxwKCApKFtePl0rKT5cXHMrPFxcL3A+fDxwPjxcXC9wPnw8cFxcLz58PHA+XFxzKzxcXC9wPiIucmVwbGFjZSgvcC9nLHIpLCJnaSIpO3AucmVOYnNwMkJSMT1uZXcgUmVnRXhwKCI8cCggKShbXj5dKyk+W1xcc1xcdTAwYTBdKzxcXC9wPnw8cD5bXFxzXFx1MDBhMF0rPFxcL3A+Ii5yZXBsYWNlKC9wL2csciksImdpIik7cC5yZU5ic3AyQlIyPW5ldyBSZWdFeHAoIjwlcCgpKFtePl0rKT4oJm5ic3A7fCYjMTYwOyk8XFwvJXA+fDwlcD4oJm5ic3A7fCYjMTYwOyk8XFwvJXA+Ii5yZXBsYWNlKC8lcC9nLHIpLCJnaSIpO3AucmVCUjJOYnNwPW5ldyBSZWdFeHAoIjxwKCApKFtePl0rKT5cXHMqPGJyIFxcLz5cXHMqPFxcL3A+fDxwPlxccyo8YnIgXFwvPlxccyo8XFwvcD4iLnJlcGxhY2UoL3AvZyxyKSwiZ2kiKTtmdW5jdGlvbiBuKHMsdCl7aWYoYil7dC5jb250ZW50PXQuY29udGVudC5yZXBsYWNlKHAucmVPcGVyYSwiPC8iK3IrIj4iKX10LmNvbnRlbnQ9bS5fcmVwbGFjZShwLnJlUGFkZCwiPCIrcisiJDEkMiQzJDQkNSQ2Plx1MDBhMDwvIityKyI+Iix0LmNvbnRlbnQpO2lmKCFjJiYhYiYmdC5zZXQpe3QuY29udGVudD10LmNvbnRlbnQucmVwbGFjZShwLnJlTmJzcDJCUjEsIjwiK3IrIiQxJDI+PGJyIC8+PC8iK3IrIj4iKTt0LmNvbnRlbnQ9dC5jb250ZW50LnJlcGxhY2UocC5yZU5ic3AyQlIyLCI8IityKyIkMSQyPjxiciAvPjwvIityKyI+Iil9ZWxzZXt0LmNvbnRlbnQ9bS5fcmVwbGFjZShwLnJlQlIyTmJzcCwiPCIrcisiJDEkMj5cdTAwYTA8LyIrcisiPiIsdC5jb250ZW50KX19by5vbkJlZm9yZVNldENvbnRlbnQuYWRkKG4pO28ub25Qb3N0UHJvY2Vzcy5hZGQobik7aWYocS5mb3JjZWRfcm9vdF9ibG9jayl7by5vbkluaXQuYWRkKHAuZm9yY2VSb290cyxwKTtvLm9uU2V0Q29udGVudC5hZGQocC5mb3JjZVJvb3RzLHApO28ub25CZWZvcmVHZXRDb250ZW50LmFkZChwLmZvcmNlUm9vdHMscCl9fSxzZXR1cDpmdW5jdGlvbigpe3ZhciBvPXRoaXMsbj1vLmVkaXRvcixxPW4uc2V0dGluZ3MsdT1uLmRvbSxwPW4uc2VsZWN0aW9uO2lmKHEuZm9yY2VkX3Jvb3RfYmxvY2spe24ub25CZWZvcmVFeGVjQ29tbWFuZC5hZGQoby5mb3JjZVJvb3RzLG8pO24ub25LZXlVcC5hZGQoby5mb3JjZVJvb3RzLG8pO24ub25QcmVQcm9jZXNzLmFkZChvLmZvcmNlUm9vdHMsbyl9aWYocS5mb3JjZV9icl9uZXdsaW5lcyl7aWYoYyl7bi5vbktleVByZXNzLmFkZChmdW5jdGlvbihzLHQpe3ZhciB2O2lmKHQua2V5Q29kZT09MTMmJnAuZ2V0Tm9kZSgpLm5vZGVOYW1lIT0iTEkiKXtwLnNldENvbnRlbnQoJzxiciBpZD0iX18iIC8+ICcse2Zvcm1hdDoicmF3In0pO3Y9dS5nZXQoIl9fIik7di5yZW1vdmVBdHRyaWJ1dGUoImlkIik7cC5zZWxlY3Qodik7cC5jb2xsYXBzZSgpO3JldHVybiBrLmNhbmNlbCh0KX19KX19aWYocS5mb3JjZV9wX25ld2xpbmVzKXtpZighYyl7bi5vbktleVByZXNzLmFkZChmdW5jdGlvbihzLHQpe2lmKHQua2V5Q29kZT09MTMmJiF0LnNoaWZ0S2V5JiYhby5pbnNlcnRQYXJhKHQpKXtrLmNhbmNlbCh0KX19KX1lbHNle20uYWRkVW5sb2FkKGZ1bmN0aW9uKCl7by5fcHJldmlvdXNGb3JtYXRzPTB9KTtuLm9uS2V5UHJlc3MuYWRkKGZ1bmN0aW9uKHMsdCl7by5fcHJldmlvdXNGb3JtYXRzPTA7aWYodC5rZXlDb2RlPT0xMyYmIXQuc2hpZnRLZXkmJnMuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkmJnEua2VlcF9zdHlsZXMpe28uX3ByZXZpb3VzRm9ybWF0cz1sKHMuc2VsZWN0aW9uLmdldFN0YXJ0KCkpfX0pO24ub25LZXlVcC5hZGQoZnVuY3Rpb24odCx4KXtpZih4LmtleUNvZGU9PTEzJiYheC5zaGlmdEtleSl7dmFyIHY9dC5zZWxlY3Rpb24uZ2V0U3RhcnQoKSxzPW8uX3ByZXZpb3VzRm9ybWF0cztpZighdi5oYXNDaGlsZE5vZGVzKCkmJnMpe3Y9dS5nZXRQYXJlbnQodix1LmlzQmxvY2spO2lmKHYmJnYubm9kZU5hbWUhPSJMSSIpe3YuaW5uZXJIVE1MPSIiO2lmKG8uX3ByZXZpb3VzRm9ybWF0cyl7di5hcHBlbmRDaGlsZChzLndyYXBwZXIpO3MuaW5uZXIuaW5uZXJIVE1MPSJcdUZFRkYifWVsc2V7di5pbm5lckhUTUw9Ilx1RkVGRiJ9cC5zZWxlY3QodiwxKTt0LmdldERvYygpLmV4ZWNDb21tYW5kKCJEZWxldGUiLGZhbHNlLG51bGwpO28uX3ByZXZpb3VzRm9ybWF0cz0wfX19fSl9aWYoYSl7bi5vbktleURvd24uYWRkKGZ1bmN0aW9uKHMsdCl7aWYoKHQua2V5Q29kZT09OHx8dC5rZXlDb2RlPT00NikmJiF0LnNoaWZ0S2V5KXtvLmJhY2tzcGFjZURlbGV0ZSh0LHQua2V5Q29kZT09OCl9fSl9fWlmKG0uaXNXZWJLaXQpe2Z1bmN0aW9uIHIodCl7dmFyIHM9cC5nZXRSbmcoKSx2LHo9dS5jcmVhdGUoImRpdiIsbnVsbCwiICIpLHkseD11LmdldFZpZXdQb3J0KHQuZ2V0V2luKCkpLmg7cy5pbnNlcnROb2RlKHY9dS5jcmVhdGUoImJyIikpO3Muc2V0U3RhcnRBZnRlcih2KTtzLnNldEVuZEFmdGVyKHYpO3Auc2V0Um5nKHMpO2lmKHAuZ2V0U2VsKCkuZm9jdXNOb2RlPT12LnByZXZpb3VzU2libGluZyl7cC5zZWxlY3QodS5pbnNlcnRBZnRlcih1LmRvYy5jcmVhdGVUZXh0Tm9kZSgiXHUwMGEwIiksdikpO3AuY29sbGFwc2UoZCl9dS5pbnNlcnRBZnRlcih6LHYpO3k9dS5nZXRQb3MoeikueTt1LnJlbW92ZSh6KTtpZih5Pngpe3QuZ2V0V2luKCkuc2Nyb2xsVG8oMCx5KX19bi5vbktleVByZXNzLmFkZChmdW5jdGlvbihzLHQpe2lmKHQua2V5Q29kZT09MTMmJih0LnNoaWZ0S2V5fHwocS5mb3JjZV9icl9uZXdsaW5lcyYmIXUuZ2V0UGFyZW50KHAuZ2V0Tm9kZSgpLCJoMSxoMixoMyxoNCxoNSxoNixvbCx1bCIpKSkpe3Iocyk7ay5jYW5jZWwodCl9fSl9bi5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHMsdCl7aih1LnNlbGVjdCgicCxoMSxoMixoMyxoNCxoNSxoNixkaXYiLHQubm9kZSksZnVuY3Rpb24odil7aWYoZih2KSl7aih1LnNlbGVjdCgic3BhbixlbSxzdHJvbmcsYixpIix0Lm5vZGUpLGZ1bmN0aW9uKHgpe2lmKCF4Lmhhc0NoaWxkTm9kZXMoKSl7eC5hcHBlbmRDaGlsZChzLmdldERvYygpLmNyZWF0ZVRleHROb2RlKCJcdTAwYTAiKSk7cmV0dXJuIGh9fSl9fSl9KTtpZihjKXtpZihxLmVsZW1lbnQhPSJQIil7bi5vbktleVByZXNzLmFkZChmdW5jdGlvbihzLHQpe28ubGFzdEVsbT1wLmdldE5vZGUoKS5ub2RlTmFtZX0pO24ub25LZXlVcC5hZGQoZnVuY3Rpb24odCx2KXt2YXIgeSx4PXAuZ2V0Tm9kZSgpLHM9dC5nZXRCb2R5KCk7aWYocy5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJngubm9kZU5hbWU9PSJQIil7eD11LnJlbmFtZSh4LHEuZWxlbWVudCk7cC5zZWxlY3QoeCk7cC5jb2xsYXBzZSgpO3Qubm9kZUNoYW5nZWQoKX1lbHNle2lmKHYua2V5Q29kZT09MTMmJiF2LnNoaWZ0S2V5JiZvLmxhc3RFbG0hPSJQIil7eT11LmdldFBhcmVudCh4LCJwIik7aWYoeSl7dS5yZW5hbWUoeSxxLmVsZW1lbnQpO3Qubm9kZUNoYW5nZWQoKX19fX0pfX19LGZpbmQ6ZnVuY3Rpb24odixxLHIpe3ZhciBwPXRoaXMuZWRpdG9yLG89cC5nZXREb2MoKS5jcmVhdGVUcmVlV2Fsa2VyKHYsNCxudWxsLGgpLHU9LTE7d2hpbGUodj1vLm5leHROb2RlKCkpe3UrKztpZihxPT0wJiZ2PT1yKXtyZXR1cm4gdX1pZihxPT0xJiZ1PT1yKXtyZXR1cm4gdn19cmV0dXJuIC0xfSxmb3JjZVJvb3RzOmZ1bmN0aW9uKHgsSSl7dmFyIHo9dGhpcyx4PXouZWRpdG9yLE09eC5nZXRCb2R5KCksSj14LmdldERvYygpLFA9eC5zZWxlY3Rpb24sQT1QLmdldFNlbCgpLEI9UC5nZXRSbmcoKSxOPS0yLHYsRyxvLHAsSz0tMTY3NzcyMTU7dmFyIEwscSxPLEYsQyx1PU0uY2hpbGROb2RlcyxFLEQseTtmb3IoRT11Lmxlbmd0aC0xO0U+PTA7RS0tKXtMPXVbRV07aWYoTC5ub2RlVHlwZT09PTEmJkwuZ2V0QXR0cmlidXRlKCJfbWNlX3R5cGUiKSl7cT1udWxsO2NvbnRpbnVlfWlmKEwubm9kZVR5cGU9PT0zfHwoIXouZG9tLmlzQmxvY2soTCkmJkwubm9kZVR5cGUhPT04JiYhL14oc2NyaXB0fG1jZTpzY3JpcHR8c3R5bGV8bWNlOnN0eWxlKSQvaS50ZXN0KEwubm9kZU5hbWUpKSl7aWYoIXEpe2lmKEwubm9kZVR5cGUhPTN8fC9bXlxzXS9nLnRlc3QoTC5ub2RlVmFsdWUpKXtpZihOPT0tMiYmQil7aWYoIWN8fEIuc2V0U3RhcnQpe2lmKEIuc3RhcnRDb250YWluZXIubm9kZVR5cGU9PTEmJihEPUIuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tCLnN0YXJ0T2Zmc2V0XSkmJkQubm9kZVR5cGU9PTEpe3k9RC5nZXRBdHRyaWJ1dGUoImlkIik7RC5zZXRBdHRyaWJ1dGUoImlkIiwiX19tY2UiKX1lbHNle2lmKHguZG9tLmdldFBhcmVudChCLnN0YXJ0Q29udGFpbmVyLGZ1bmN0aW9uKG4pe3JldHVybiBuPT09TX0pKXtHPUIuc3RhcnRPZmZzZXQ7bz1CLmVuZE9mZnNldDtOPXouZmluZChNLDAsQi5zdGFydENvbnRhaW5lcik7dj16LmZpbmQoTSwwLEIuZW5kQ29udGFpbmVyKX19fWVsc2V7aWYoQi5pdGVtKXtwPUouYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTtwLm1vdmVUb0VsZW1lbnRUZXh0KEIuaXRlbSgwKSk7Qj1wfXA9Si5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO3AubW92ZVRvRWxlbWVudFRleHQoTSk7cC5jb2xsYXBzZSgxKTtPPXAubW92ZSgiY2hhcmFjdGVyIixLKSotMTtwPUIuZHVwbGljYXRlKCk7cC5jb2xsYXBzZSgxKTtGPXAubW92ZSgiY2hhcmFjdGVyIixLKSotMTtwPUIuZHVwbGljYXRlKCk7cC5jb2xsYXBzZSgwKTtDPShwLm1vdmUoImNoYXJhY3RlciIsSykqLTEpLUY7Tj1GLU87dj1DfX1xPXguZG9tLmNyZWF0ZSh4LnNldHRpbmdzLmZvcmNlZF9yb290X2Jsb2NrKTtMLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHEsTCk7cS5hcHBlbmRDaGlsZChMKX19ZWxzZXtpZihxLmhhc0NoaWxkTm9kZXMoKSl7cS5pbnNlcnRCZWZvcmUoTCxxLmZpcnN0Q2hpbGQpfWVsc2V7cS5hcHBlbmRDaGlsZChMKX19fWVsc2V7cT1udWxsfX1pZihOIT0tMil7aWYoIWN8fEIuc2V0U3RhcnQpe3E9TS5nZXRFbGVtZW50c0J5VGFnTmFtZSh4LnNldHRpbmdzLmVsZW1lbnQpWzBdO0I9Si5jcmVhdGVSYW5nZSgpO2lmKE4hPS0xKXtCLnNldFN0YXJ0KHouZmluZChNLDEsTiksRyl9ZWxzZXtCLnNldFN0YXJ0KHEsMCl9aWYodiE9LTEpe0Iuc2V0RW5kKHouZmluZChNLDEsdiksbyl9ZWxzZXtCLnNldEVuZChxLDApfWlmKEEpe0EucmVtb3ZlQWxsUmFuZ2VzKCk7QS5hZGRSYW5nZShCKX19ZWxzZXt0cnl7Qj1BLmNyZWF0ZVJhbmdlKCk7Qi5tb3ZlVG9FbGVtZW50VGV4dChNKTtCLmNvbGxhcHNlKDEpO0IubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLE4pO0IubW92ZUVuZCgiY2hhcmFjdGVyIix2KTtCLnNlbGVjdCgpfWNhdGNoKEgpe319fWVsc2V7aWYoKCFjfHxCLnNldFN0YXJ0KSYmKEQ9eC5kb20uZ2V0KCJfX21jZSIpKSl7aWYoeSl7RC5zZXRBdHRyaWJ1dGUoImlkIix5KX1lbHNle0QucmVtb3ZlQXR0cmlidXRlKCJpZCIpfUI9Si5jcmVhdGVSYW5nZSgpO0Iuc2V0U3RhcnRCZWZvcmUoRCk7Qi5zZXRFbmRCZWZvcmUoRCk7UC5zZXRSbmcoQil9fX0sZ2V0UGFyZW50QmxvY2s6ZnVuY3Rpb24ocCl7dmFyIG89dGhpcy5kb207cmV0dXJuIG8uZ2V0UGFyZW50KHAsby5pc0Jsb2NrKX0saW5zZXJ0UGFyYTpmdW5jdGlvbihTKXt2YXIgRz10aGlzLHg9Ry5lZGl0b3IsTz14LmRvbSxUPXguZ2V0RG9jKCksWD14LnNldHRpbmdzLEg9eC5zZWxlY3Rpb24uZ2V0U2VsKCksST1ILmdldFJhbmdlQXQoMCksVz1ULmJvZHk7dmFyIEwsTSxKLFEsUCx1LHAsdixBLG8sRSxWLHEseixLLE49Ty5nZXRWaWV3UG9ydCh4LmdldFdpbigpKSxELEYsQztMPVQuY3JlYXRlUmFuZ2UoKTtMLnNldFN0YXJ0KEguYW5jaG9yTm9kZSxILmFuY2hvck9mZnNldCk7TC5jb2xsYXBzZShkKTtNPVQuY3JlYXRlUmFuZ2UoKTtNLnNldFN0YXJ0KEguZm9jdXNOb2RlLEguZm9jdXNPZmZzZXQpO00uY29sbGFwc2UoZCk7Sj1MLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhMLlNUQVJUX1RPX0VORCxNKTwwO1E9Sj9ILmFuY2hvck5vZGU6SC5mb2N1c05vZGU7UD1KP0guYW5jaG9yT2Zmc2V0OkguZm9jdXNPZmZzZXQ7dT1KP0guZm9jdXNOb2RlOkguYW5jaG9yTm9kZTtwPUo/SC5mb2N1c09mZnNldDpILmFuY2hvck9mZnNldDtpZihRPT09dSYmL14oVER8VEgpJC8udGVzdChRLm5vZGVOYW1lKSl7aWYoUS5maXJzdENoaWxkLm5vZGVOYW1lPT0iQlIiKXtPLnJlbW92ZShRLmZpcnN0Q2hpbGQpfWlmKFEuY2hpbGROb2Rlcy5sZW5ndGg9PTApe3guZG9tLmFkZChRLFguZWxlbWVudCxudWxsLCI8YnIgLz4iKTtWPXguZG9tLmFkZChRLFguZWxlbWVudCxudWxsLCI8YnIgLz4iKX1lbHNle0s9US5pbm5lckhUTUw7US5pbm5lckhUTUw9IiI7eC5kb20uYWRkKFEsWC5lbGVtZW50LG51bGwsSyk7Vj14LmRvbS5hZGQoUSxYLmVsZW1lbnQsbnVsbCwiPGJyIC8+Iil9ST1ULmNyZWF0ZVJhbmdlKCk7SS5zZWxlY3ROb2RlQ29udGVudHMoVik7SS5jb2xsYXBzZSgxKTt4LnNlbGVjdGlvbi5zZXRSbmcoSSk7cmV0dXJuIGh9aWYoUT09VyYmdT09VyYmVy5maXJzdENoaWxkJiZ4LmRvbS5pc0Jsb2NrKFcuZmlyc3RDaGlsZCkpe1E9dT1RLmZpcnN0Q2hpbGQ7UD1wPTA7TD1ULmNyZWF0ZVJhbmdlKCk7TC5zZXRTdGFydChRLDApO009VC5jcmVhdGVSYW5nZSgpO00uc2V0U3RhcnQodSwwKX1RPVEubm9kZU5hbWU9PSJIVE1MIj9ULmJvZHk6UTtRPVEubm9kZU5hbWU9PSJCT0RZIj9RLmZpcnN0Q2hpbGQ6UTt1PXUubm9kZU5hbWU9PSJIVE1MIj9ULmJvZHk6dTt1PXUubm9kZU5hbWU9PSJCT0RZIj91LmZpcnN0Q2hpbGQ6dTt2PUcuZ2V0UGFyZW50QmxvY2soUSk7QT1HLmdldFBhcmVudEJsb2NrKHUpO289dj92Lm5vZGVOYW1lOlguZWxlbWVudDtpZihLPUcuZG9tLmdldFBhcmVudCh2LCJsaSxwcmUiKSl7aWYoSy5ub2RlTmFtZT09IkxJIil7cmV0dXJuIGUoeC5zZWxlY3Rpb24sRy5kb20sSyl9cmV0dXJuIGR9aWYodiYmKHYubm9kZU5hbWU9PSJDQVBUSU9OInx8L2Fic29sdXRlfHJlbGF0aXZlfGZpeGVkL2dpLnRlc3QoTy5nZXRTdHlsZSh2LCJwb3NpdGlvbiIsMSkpKSl7bz1YLmVsZW1lbnQ7dj1udWxsfWlmKEEmJihBLm5vZGVOYW1lPT0iQ0FQVElPTiJ8fC9hYnNvbHV0ZXxyZWxhdGl2ZXxmaXhlZC9naS50ZXN0KE8uZ2V0U3R5bGUodiwicG9zaXRpb24iLDEpKSkpe289WC5lbGVtZW50O0E9bnVsbH1pZigvKFREfFRBQkxFfFRIfENBUFRJT04pLy50ZXN0KG8pfHwodiYmbz09IkRJViImJi9sZWZ0fHJpZ2h0L2dpLnRlc3QoTy5nZXRTdHlsZSh2LCJmbG9hdCIsMSkpKSl7bz1YLmVsZW1lbnQ7dj1BPW51bGx9RT0odiYmdi5ub2RlTmFtZT09byk/di5jbG9uZU5vZGUoMCk6eC5kb20uY3JlYXRlKG8pO1Y9KEEmJkEubm9kZU5hbWU9PW8pP0EuY2xvbmVOb2RlKDApOnguZG9tLmNyZWF0ZShvKTtWLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKTtpZigvXihIWzEtNl0pJC8udGVzdChvKSYmZyhJLHYpKXtWPXguZG9tLmNyZWF0ZShYLmVsZW1lbnQpfUs9cT1RO2Rve2lmKEs9PVd8fEsubm9kZVR5cGU9PTl8fEcuZG9tLmlzQmxvY2soSyl8fC8oVER8VEFCTEV8VEh8Q0FQVElPTikvLnRlc3QoSy5ub2RlTmFtZSkpe2JyZWFrfXE9S313aGlsZSgoSz1LLnByZXZpb3VzU2libGluZz9LLnByZXZpb3VzU2libGluZzpLLnBhcmVudE5vZGUpKTtLPXo9dTtkb3tpZihLPT1XfHxLLm5vZGVUeXBlPT05fHxHLmRvbS5pc0Jsb2NrKEspfHwvKFREfFRBQkxFfFRIfENBUFRJT04pLy50ZXN0KEsubm9kZU5hbWUpKXticmVha316PUt9d2hpbGUoKEs9Sy5uZXh0U2libGluZz9LLm5leHRTaWJsaW5nOksucGFyZW50Tm9kZSkpO2lmKHEubm9kZU5hbWU9PW8pe0wuc2V0U3RhcnQocSwwKX1lbHNle0wuc2V0U3RhcnRCZWZvcmUocSl9TC5zZXRFbmQoUSxQKTtFLmFwcGVuZENoaWxkKEwuY2xvbmVDb250ZW50cygpfHxULmNyZWF0ZVRleHROb2RlKCIiKSk7dHJ5e00uc2V0RW5kQWZ0ZXIoeil9Y2F0Y2goUil7fU0uc2V0U3RhcnQodSxwKTtWLmFwcGVuZENoaWxkKE0uY2xvbmVDb250ZW50cygpfHxULmNyZWF0ZVRleHROb2RlKCIiKSk7ST1ULmNyZWF0ZVJhbmdlKCk7aWYoIXEucHJldmlvdXNTaWJsaW5nJiZxLnBhcmVudE5vZGUubm9kZU5hbWU9PW8pe0kuc2V0U3RhcnRCZWZvcmUocS5wYXJlbnROb2RlKX1lbHNle2lmKEwuc3RhcnRDb250YWluZXIubm9kZU5hbWU9PW8mJkwuc3RhcnRPZmZzZXQ9PTApe0kuc2V0U3RhcnRCZWZvcmUoTC5zdGFydENvbnRhaW5lcil9ZWxzZXtJLnNldFN0YXJ0KEwuc3RhcnRDb250YWluZXIsTC5zdGFydE9mZnNldCl9fWlmKCF6Lm5leHRTaWJsaW5nJiZ6LnBhcmVudE5vZGUubm9kZU5hbWU9PW8pe0kuc2V0RW5kQWZ0ZXIoei5wYXJlbnROb2RlKX1lbHNle0kuc2V0RW5kKE0uZW5kQ29udGFpbmVyLE0uZW5kT2Zmc2V0KX1JLmRlbGV0ZUNvbnRlbnRzKCk7aWYoYil7eC5nZXRXaW4oKS5zY3JvbGxUbygwLE4ueSl9aWYoRS5maXJzdENoaWxkJiZFLmZpcnN0Q2hpbGQubm9kZU5hbWU9PW8pe0UuaW5uZXJIVE1MPUUuZmlyc3RDaGlsZC5pbm5lckhUTUx9aWYoVi5maXJzdENoaWxkJiZWLmZpcnN0Q2hpbGQubm9kZU5hbWU9PW8pe1YuaW5uZXJIVE1MPVYuZmlyc3RDaGlsZC5pbm5lckhUTUx9aWYoZihFKSl7RS5pbm5lckhUTUw9IjxiciAvPiJ9ZnVuY3Rpb24gVSh5LHMpe3ZhciByPVtdLFosWSx0O3kuaW5uZXJIVE1MPSIiO2lmKFgua2VlcF9zdHlsZXMpe1k9cztkb3tpZigvXihTUEFOfFNUUk9OR3xCfEVNfEl8Rk9OVHxTVFJJS0V8VSkkLy50ZXN0KFkubm9kZU5hbWUpKXtaPVkuY2xvbmVOb2RlKGgpO08uc2V0QXR0cmliKFosImlkIiwiIik7ci5wdXNoKFopfX13aGlsZShZPVkucGFyZW50Tm9kZSl9aWYoci5sZW5ndGg+MCl7Zm9yKHQ9ci5sZW5ndGgtMSxaPXk7dD49MDt0LS0pe1o9Wi5hcHBlbmRDaGlsZChyW3RdKX1yWzBdLmlubmVySFRNTD1iPyImbmJzcDsiOiI8YnIgLz4iO3JldHVybiByWzBdfWVsc2V7eS5pbm5lckhUTUw9Yj8iJm5ic3A7IjoiPGJyIC8+In19aWYoZihWKSl7Qz1VKFYsdSl9aWYoYiYmcGFyc2VGbG9hdChvcGVyYS52ZXJzaW9uKCkpPDkuNSl7SS5pbnNlcnROb2RlKEUpO0kuaW5zZXJ0Tm9kZShWKX1lbHNle0kuaW5zZXJ0Tm9kZShWKTtJLmluc2VydE5vZGUoRSl9Vi5ub3JtYWxpemUoKTtFLm5vcm1hbGl6ZSgpO2Z1bmN0aW9uIEIocil7cmV0dXJuIFQuY3JlYXRlVHJlZVdhbGtlcihyLE5vZGVGaWx0ZXIuU0hPV19URVhULG51bGwsaCkubmV4dE5vZGUoKXx8cn1JPVQuY3JlYXRlUmFuZ2UoKTtJLnNlbGVjdE5vZGVDb250ZW50cyhhP0IoQ3x8Vik6Q3x8Vik7SS5jb2xsYXBzZSgxKTtILnJlbW92ZUFsbFJhbmdlcygpO0guYWRkUmFuZ2UoSSk7RD14LmRvbS5nZXRQb3MoVikueTtGPVYuY2xpZW50SGVpZ2h0O2lmKEQ8Ti55fHxEK0Y+Ti55K04uaCl7eC5nZXRXaW4oKS5zY3JvbGxUbygwLEQ8Ti55P0Q6RC1OLmgrMjUpfXJldHVybiBofSxiYWNrc3BhY2VEZWxldGU6ZnVuY3Rpb24odixDKXt2YXIgRD10aGlzLHU9RC5lZGl0b3Isej11LmdldEJvZHkoKSxzPXUuZG9tLHEseD11LnNlbGVjdGlvbixwPXguZ2V0Um5nKCkseT1wLnN0YXJ0Q29udGFpbmVyLHEsQSxCLG87aWYoIUMmJnAuY29sbGFwc2VkJiZ5Lm5vZGVUeXBlPT0xJiZwLnN0YXJ0T2Zmc2V0PT15LmNoaWxkTm9kZXMubGVuZ3RoKXtvPW5ldyBtLmRvbS5UcmVlV2Fsa2VyKHkubGFzdENoaWxkLHkpO2ZvcihxPXkubGFzdENoaWxkO3E7cT1vLnByZXYoKSl7aWYocS5ub2RlVHlwZT09Myl7cC5zZXRTdGFydChxLHEubm9kZVZhbHVlLmxlbmd0aCk7cC5jb2xsYXBzZSh0cnVlKTt4LnNldFJuZyhwKTtyZXR1cm59fX1pZih5JiZ1LmRvbS5pc0Jsb2NrKHkpJiYhL14oVER8VEgpJC8udGVzdCh5Lm5vZGVOYW1lKSYmQyl7aWYoeS5jaGlsZE5vZGVzLmxlbmd0aD09MHx8KHkuY2hpbGROb2Rlcy5sZW5ndGg9PTEmJnkuZmlyc3RDaGlsZC5ub2RlTmFtZT09IkJSIikpe3E9eTt3aGlsZSgocT1xLnByZXZpb3VzU2libGluZykmJiF1LmRvbS5pc0Jsb2NrKHEpKXt9aWYocSl7aWYoeSE9ei5maXJzdENoaWxkKXtBPXUuZG9tLmRvYy5jcmVhdGVUcmVlV2Fsa2VyKHEsTm9kZUZpbHRlci5TSE9XX1RFWFQsbnVsbCxoKTt3aGlsZShCPUEubmV4dE5vZGUoKSl7cT1CfXA9dS5nZXREb2MoKS5jcmVhdGVSYW5nZSgpO3Auc2V0U3RhcnQocSxxLm5vZGVWYWx1ZT9xLm5vZGVWYWx1ZS5sZW5ndGg6MCk7cC5zZXRFbmQocSxxLm5vZGVWYWx1ZT9xLm5vZGVWYWx1ZS5sZW5ndGg6MCk7eC5zZXRSbmcocCk7dS5kb20ucmVtb3ZlKHkpfXJldHVybiBrLmNhbmNlbCh2KX19fX19KX0pKHRpbnltY2UpOyhmdW5jdGlvbihjKXt2YXIgYj1jLkRPTSxhPWMuZG9tLkV2ZW50LGQ9Yy5lYWNoLGU9Yy5leHRlbmQ7Yy5jcmVhdGUoInRpbnltY2UuQ29udHJvbE1hbmFnZXIiLHtDb250cm9sTWFuYWdlcjpmdW5jdGlvbihmLGope3ZhciBoPXRoaXMsZztqPWp8fHt9O2guZWRpdG9yPWY7aC5jb250cm9scz17fTtoLm9uQWRkPW5ldyBjLnV0aWwuRGlzcGF0Y2hlcihoKTtoLm9uUG9zdFJlbmRlcj1uZXcgYy51dGlsLkRpc3BhdGNoZXIoaCk7aC5wcmVmaXg9ai5wcmVmaXh8fGYuaWQrIl8iO2guX2Nscz17fTtoLm9uUG9zdFJlbmRlci5hZGQoZnVuY3Rpb24oKXtkKGguY29udHJvbHMsZnVuY3Rpb24oaSl7aS5wb3N0UmVuZGVyKCl9KX0pfSxnZXQ6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuY29udHJvbHNbdGhpcy5wcmVmaXgrZl18fHRoaXMuY29udHJvbHNbZl19LHNldEFjdGl2ZTpmdW5jdGlvbihoLGYpe3ZhciBnPW51bGw7aWYoZz10aGlzLmdldChoKSl7Zy5zZXRBY3RpdmUoZil9cmV0dXJuIGd9LHNldERpc2FibGVkOmZ1bmN0aW9uKGgsZil7dmFyIGc9bnVsbDtpZihnPXRoaXMuZ2V0KGgpKXtnLnNldERpc2FibGVkKGYpfXJldHVybiBnfSxhZGQ6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcztpZihnKXtmLmNvbnRyb2xzW2cuaWRdPWc7Zi5vbkFkZC5kaXNwYXRjaChnLGYpfXJldHVybiBnfSxjcmVhdGVDb250cm9sOmZ1bmN0aW9uKGkpe3ZhciBoLGc9dGhpcyxmPWcuZWRpdG9yO2QoZi5wbHVnaW5zLGZ1bmN0aW9uKGope2lmKGouY3JlYXRlQ29udHJvbCl7aD1qLmNyZWF0ZUNvbnRyb2woaSxnKTtpZihoKXtyZXR1cm4gZmFsc2V9fX0pO3N3aXRjaChpKXtjYXNlInwiOmNhc2Uic2VwYXJhdG9yIjpyZXR1cm4gZy5jcmVhdGVTZXBhcmF0b3IoKX1pZighaCYmZi5idXR0b25zJiYoaD1mLmJ1dHRvbnNbaV0pKXtyZXR1cm4gZy5jcmVhdGVCdXR0b24oaSxoKX1yZXR1cm4gZy5hZGQoaCl9LGNyZWF0ZURyb3BNZW51OmZ1bmN0aW9uKGYsbixoKXt2YXIgbT10aGlzLGk9bS5lZGl0b3IsaixnLGssbDtuPWUoeyJjbGFzcyI6Im1jZURyb3BEb3duIixjb25zdHJhaW46aS5zZXR0aW5ncy5jb25zdHJhaW5fbWVudXN9LG4pO25bImNsYXNzIl09blsiY2xhc3MiXSsiICIraS5nZXRQYXJhbSgic2tpbiIpKyJTa2luIjtpZihrPWkuZ2V0UGFyYW0oInNraW5fdmFyaWFudCIpKXtuWyJjbGFzcyJdKz0iICIraS5nZXRQYXJhbSgic2tpbiIpKyJTa2luIitrLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkray5zdWJzdHJpbmcoMSl9Zj1tLnByZWZpeCtmO2w9aHx8bS5fY2xzLmRyb3BtZW51fHxjLnVpLkRyb3BNZW51O2o9bS5jb250cm9sc1tmXT1uZXcgbChmLG4pO2oub25BZGRJdGVtLmFkZChmdW5jdGlvbihyLHEpe3ZhciBwPXEuc2V0dGluZ3M7cC50aXRsZT1pLmdldExhbmcocC50aXRsZSxwLnRpdGxlKTtpZighcC5vbmNsaWNrKXtwLm9uY2xpY2s9ZnVuY3Rpb24obyl7aWYocC5jbWQpe2kuZXhlY0NvbW1hbmQocC5jbWQscC51aXx8ZmFsc2UscC52YWx1ZSl9fX19KTtpLm9uUmVtb3ZlLmFkZChmdW5jdGlvbigpe2ouZGVzdHJveSgpfSk7aWYoYy5pc0lFKXtqLm9uU2hvd01lbnUuYWRkKGZ1bmN0aW9uKCl7aS5mb2N1cygpO2c9aS5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMSl9KTtqLm9uSGlkZU1lbnUuYWRkKGZ1bmN0aW9uKCl7aWYoZyl7aS5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoZyk7Zz0wfX0pfXJldHVybiBtLmFkZChqKX0sY3JlYXRlTGlzdEJveDpmdW5jdGlvbihtLGksbCl7dmFyIGg9dGhpcyxnPWguZWRpdG9yLGosayxmO2lmKGguZ2V0KG0pKXtyZXR1cm4gbnVsbH1pLnRpdGxlPWcudHJhbnNsYXRlKGkudGl0bGUpO2kuc2NvcGU9aS5zY29wZXx8ZztpZighaS5vbnNlbGVjdCl7aS5vbnNlbGVjdD1mdW5jdGlvbihuKXtnLmV4ZWNDb21tYW5kKGkuY21kLGkudWl8fGZhbHNlLG58fGkudmFsdWUpfX1pPWUoe3RpdGxlOmkudGl0bGUsImNsYXNzIjoibWNlXyIrbSxzY29wZTppLnNjb3BlLGNvbnRyb2xfbWFuYWdlcjpofSxpKTttPWgucHJlZml4K207aWYoZy5zZXR0aW5ncy51c2VfbmF0aXZlX3NlbGVjdHMpe2s9bmV3IGMudWkuTmF0aXZlTGlzdEJveChtLGkpfWVsc2V7Zj1sfHxoLl9jbHMubGlzdGJveHx8Yy51aS5MaXN0Qm94O2s9bmV3IGYobSxpKX1oLmNvbnRyb2xzW21dPWs7aWYoYy5pc1dlYktpdCl7ay5vblBvc3RSZW5kZXIuYWRkKGZ1bmN0aW9uKHAsbyl7YS5hZGQobywibW91c2Vkb3duIixmdW5jdGlvbigpe2cuYm9va21hcms9Zy5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMSl9KTthLmFkZChvLCJmb2N1cyIsZnVuY3Rpb24oKXtnLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhnLmJvb2ttYXJrKTtnLmJvb2ttYXJrPW51bGx9KX0pfWlmKGsuaGlkZU1lbnUpe2cub25Nb3VzZURvd24uYWRkKGsuaGlkZU1lbnUsayl9cmV0dXJuIGguYWRkKGspfSxjcmVhdGVCdXR0b246ZnVuY3Rpb24obSxpLGwpe3ZhciBoPXRoaXMsZz1oLmVkaXRvcixqLGssZjtpZihoLmdldChtKSl7cmV0dXJuIG51bGx9aS50aXRsZT1nLnRyYW5zbGF0ZShpLnRpdGxlKTtpLmxhYmVsPWcudHJhbnNsYXRlKGkubGFiZWwpO2kuc2NvcGU9aS5zY29wZXx8ZztpZighaS5vbmNsaWNrJiYhaS5tZW51X2J1dHRvbil7aS5vbmNsaWNrPWZ1bmN0aW9uKCl7Zy5leGVjQ29tbWFuZChpLmNtZCxpLnVpfHxmYWxzZSxpLnZhbHVlKX19aT1lKHt0aXRsZTppLnRpdGxlLCJjbGFzcyI6Im1jZV8iK20sdW5hdmFpbGFibGVfcHJlZml4OmcuZ2V0TGFuZygidW5hdmFpbGFibGUiLCIiKSxzY29wZTppLnNjb3BlLGNvbnRyb2xfbWFuYWdlcjpofSxpKTttPWgucHJlZml4K207aWYoaS5tZW51X2J1dHRvbil7Zj1sfHxoLl9jbHMubWVudWJ1dHRvbnx8Yy51aS5NZW51QnV0dG9uO2s9bmV3IGYobSxpKTtnLm9uTW91c2VEb3duLmFkZChrLmhpZGVNZW51LGspfWVsc2V7Zj1oLl9jbHMuYnV0dG9ufHxjLnVpLkJ1dHRvbjtrPW5ldyBmKG0saSl9cmV0dXJuIGguYWRkKGspfSxjcmVhdGVNZW51QnV0dG9uOmZ1bmN0aW9uKGgsZixnKXtmPWZ8fHt9O2YubWVudV9idXR0b249MTtyZXR1cm4gdGhpcy5jcmVhdGVCdXR0b24oaCxmLGcpfSxjcmVhdGVTcGxpdEJ1dHRvbjpmdW5jdGlvbihtLGksbCl7dmFyIGg9dGhpcyxnPWguZWRpdG9yLGosayxmO2lmKGguZ2V0KG0pKXtyZXR1cm4gbnVsbH1pLnRpdGxlPWcudHJhbnNsYXRlKGkudGl0bGUpO2kuc2NvcGU9aS5zY29wZXx8ZztpZighaS5vbmNsaWNrKXtpLm9uY2xpY2s9ZnVuY3Rpb24obil7Zy5leGVjQ29tbWFuZChpLmNtZCxpLnVpfHxmYWxzZSxufHxpLnZhbHVlKX19aWYoIWkub25zZWxlY3Qpe2kub25zZWxlY3Q9ZnVuY3Rpb24obil7Zy5leGVjQ29tbWFuZChpLmNtZCxpLnVpfHxmYWxzZSxufHxpLnZhbHVlKX19aT1lKHt0aXRsZTppLnRpdGxlLCJjbGFzcyI6Im1jZV8iK20sc2NvcGU6aS5zY29wZSxjb250cm9sX21hbmFnZXI6aH0saSk7bT1oLnByZWZpeCttO2Y9bHx8aC5fY2xzLnNwbGl0YnV0dG9ufHxjLnVpLlNwbGl0QnV0dG9uO2s9aC5hZGQobmV3IGYobSxpKSk7Zy5vbk1vdXNlRG93bi5hZGQoay5oaWRlTWVudSxrKTtyZXR1cm4ga30sY3JlYXRlQ29sb3JTcGxpdEJ1dHRvbjpmdW5jdGlvbihmLG4saCl7dmFyIGw9dGhpcyxqPWwuZWRpdG9yLGksayxtLGc7aWYobC5nZXQoZikpe3JldHVybiBudWxsfW4udGl0bGU9ai50cmFuc2xhdGUobi50aXRsZSk7bi5zY29wZT1uLnNjb3BlfHxqO2lmKCFuLm9uY2xpY2spe24ub25jbGljaz1mdW5jdGlvbihvKXtpZihjLmlzSUUpe2c9ai5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMSl9ai5leGVjQ29tbWFuZChuLmNtZCxuLnVpfHxmYWxzZSxvfHxuLnZhbHVlKX19aWYoIW4ub25zZWxlY3Qpe24ub25zZWxlY3Q9ZnVuY3Rpb24obyl7ai5leGVjQ29tbWFuZChuLmNtZCxuLnVpfHxmYWxzZSxvfHxuLnZhbHVlKX19bj1lKHt0aXRsZTpuLnRpdGxlLCJjbGFzcyI6Im1jZV8iK2YsbWVudV9jbGFzczpqLmdldFBhcmFtKCJza2luIikrIlNraW4iLHNjb3BlOm4uc2NvcGUsbW9yZV9jb2xvcnNfdGl0bGU6ai5nZXRMYW5nKCJtb3JlX2NvbG9ycyIpfSxuKTtmPWwucHJlZml4K2Y7bT1ofHxsLl9jbHMuY29sb3JzcGxpdGJ1dHRvbnx8Yy51aS5Db2xvclNwbGl0QnV0dG9uO2s9bmV3IG0oZixuKTtqLm9uTW91c2VEb3duLmFkZChrLmhpZGVNZW51LGspO2oub25SZW1vdmUuYWRkKGZ1bmN0aW9uKCl7ay5kZXN0cm95KCl9KTtpZihjLmlzSUUpe2sub25TaG93TWVudS5hZGQoZnVuY3Rpb24oKXtqLmZvY3VzKCk7Zz1qLnNlbGVjdGlvbi5nZXRCb29rbWFyaygxKX0pO2sub25IaWRlTWVudS5hZGQoZnVuY3Rpb24oKXtpZihnKXtqLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhnKTtnPTB9fSl9cmV0dXJuIGwuYWRkKGspfSxjcmVhdGVUb29sYmFyOmZ1bmN0aW9uKGssaCxqKXt2YXIgaSxnPXRoaXMsZjtrPWcucHJlZml4K2s7Zj1qfHxnLl9jbHMudG9vbGJhcnx8Yy51aS5Ub29sYmFyO2k9bmV3IGYoayxoKTtpZihnLmdldChrKSl7cmV0dXJuIG51bGx9cmV0dXJuIGcuYWRkKGkpfSxjcmVhdGVTZXBhcmF0b3I6ZnVuY3Rpb24oZyl7dmFyIGY9Z3x8dGhpcy5fY2xzLnNlcGFyYXRvcnx8Yy51aS5TZXBhcmF0b3I7cmV0dXJuIG5ldyBmKCl9LHNldENvbnRyb2xUeXBlOmZ1bmN0aW9uKGcsZil7cmV0dXJuIHRoaXMuX2Nsc1tnLnRvTG93ZXJDYXNlKCldPWZ9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtkKHRoaXMuY29udHJvbHMsZnVuY3Rpb24oZil7Zi5kZXN0cm95KCl9KTt0aGlzLmNvbnRyb2xzPW51bGx9fSl9KSh0aW55bWNlKTsoZnVuY3Rpb24oZCl7dmFyIGE9ZC51dGlsLkRpc3BhdGNoZXIsZT1kLmVhY2gsYz1kLmlzSUUsYj1kLmlzT3BlcmE7ZC5jcmVhdGUoInRpbnltY2UuV2luZG93TWFuYWdlciIse1dpbmRvd01hbmFnZXI6ZnVuY3Rpb24oZil7dmFyIGc9dGhpcztnLmVkaXRvcj1mO2cub25PcGVuPW5ldyBhKGcpO2cub25DbG9zZT1uZXcgYShnKTtnLnBhcmFtcz17fTtnLmZlYXR1cmVzPXt9fSxvcGVuOmZ1bmN0aW9uKHosaCl7dmFyIHY9dGhpcyxrPSIiLG4sbSxpPXYuZWRpdG9yLnNldHRpbmdzLmRpYWxvZ190eXBlPT0ibW9kYWwiLHEsbyxqLGc9ZC5ET00uZ2V0Vmlld1BvcnQoKSxyO3o9enx8e307aD1ofHx7fTtvPWI/Zy53OnNjcmVlbi53aWR0aDtqPWI/Zy5oOnNjcmVlbi5oZWlnaHQ7ei5uYW1lPXoubmFtZXx8Im1jXyIrbmV3IERhdGUoKS5nZXRUaW1lKCk7ei53aWR0aD1wYXJzZUludCh6LndpZHRofHwzMjApO3ouaGVpZ2h0PXBhcnNlSW50KHouaGVpZ2h0fHwyNDApO3oucmVzaXphYmxlPXRydWU7ei5sZWZ0PXoubGVmdHx8cGFyc2VJbnQoby8yKS0oei53aWR0aC8yKTt6LnRvcD16LnRvcHx8cGFyc2VJbnQoai8yKS0oei5oZWlnaHQvMik7aC5pbmxpbmU9ZmFsc2U7aC5tY2Vfd2lkdGg9ei53aWR0aDtoLm1jZV9oZWlnaHQ9ei5oZWlnaHQ7aC5tY2VfYXV0b19mb2N1cz16LmF1dG9fZm9jdXM7aWYoaSl7aWYoYyl7ei5jZW50ZXI9dHJ1ZTt6LmhlbHA9ZmFsc2U7ei5kaWFsb2dXaWR0aD16LndpZHRoKyJweCI7ei5kaWFsb2dIZWlnaHQ9ei5oZWlnaHQrInB4Ijt6LnNjcm9sbD16LnNjcm9sbGJhcnN8fGZhbHNlfX1lKHosZnVuY3Rpb24ocCxmKXtpZihkLmlzKHAsImJvb2xlYW4iKSl7cD1wPyJ5ZXMiOiJubyJ9aWYoIS9eKG5hbWV8dXJsKSQvLnRlc3QoZikpe2lmKGMmJmkpe2srPShrPyI7IjoiIikrZisiOiIrcH1lbHNle2srPShrPyIsIjoiIikrZisiPSIrcH19fSk7di5mZWF0dXJlcz16O3YucGFyYW1zPWg7di5vbk9wZW4uZGlzcGF0Y2godix6LGgpO3I9ei51cmx8fHouZmlsZTtyPWQuX2FkZFZlcihyKTt0cnl7aWYoYyYmaSl7cT0xO3dpbmRvdy5zaG93TW9kYWxEaWFsb2cocix3aW5kb3csayl9ZWxzZXtxPXdpbmRvdy5vcGVuKHIsei5uYW1lLGspfX1jYXRjaChsKXt9aWYoIXEpe2FsZXJ0KHYuZWRpdG9yLmdldExhbmcoInBvcHVwX2Jsb2NrZWQiKSl9fSxjbG9zZTpmdW5jdGlvbihmKXtmLmNsb3NlKCk7dGhpcy5vbkNsb3NlLmRpc3BhdGNoKHRoaXMpfSxjcmVhdGVJbnN0YW5jZTpmdW5jdGlvbihpLGgsZyxtLGwsayl7dmFyIGo9ZC5yZXNvbHZlKGkpO3JldHVybiBuZXcgaihoLGcsbSxsLGspfSxjb25maXJtOmZ1bmN0aW9uKGgsZixpLGcpe2c9Z3x8d2luZG93O2YuY2FsbChpfHx0aGlzLGcuY29uZmlybSh0aGlzLl9kZWNvZGUodGhpcy5lZGl0b3IuZ2V0TGFuZyhoLGgpKSkpfSxhbGVydDpmdW5jdGlvbihoLGYsaixnKXt2YXIgaT10aGlzO2c9Z3x8d2luZG93O2cuYWxlcnQoaS5fZGVjb2RlKGkuZWRpdG9yLmdldExhbmcoaCxoKSkpO2lmKGYpe2YuY2FsbChqfHxpKX19LHJlc2l6ZUJ5OmZ1bmN0aW9uKGYsZyxoKXtoLnJlc2l6ZUJ5KGYsZyl9LF9kZWNvZGU6ZnVuY3Rpb24oZil7cmV0dXJuIGQuRE9NLmRlY29kZShmKS5yZXBsYWNlKC9cXG4vZywiXG4iKX19KX0odGlueW1jZSkpOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7dmFyIGQ9e30sYz17fSxlPXt9O2Z1bmN0aW9uIGYoaixpLGgsZyl7aWYodHlwZW9mKGkpPT0ic3RyaW5nIil7aT1baV19YS5lYWNoKGksZnVuY3Rpb24oayl7altrLnRvTG93ZXJDYXNlKCldPXtmdW5jOmgsc2NvcGU6Z319KX1hLmV4dGVuZCh0aGlzLHthZGQ6ZnVuY3Rpb24oaSxoLGcpe2YoZCxpLGgsZyl9LGFkZFF1ZXJ5U3RhdGVIYW5kbGVyOmZ1bmN0aW9uKGksaCxnKXtmKGMsaSxoLGcpfSxhZGRRdWVyeVZhbHVlSGFuZGxlcjpmdW5jdGlvbihpLGgsZyl7ZihlLGksaCxnKX0sZXhlY0NvbW1hbmQ6ZnVuY3Rpb24oaCxrLGosaSxnKXtpZihrPWRbay50b0xvd2VyQ2FzZSgpXSl7aWYoay5mdW5jLmNhbGwoaHx8ay5zY29wZSxqLGksZykhPT1mYWxzZSl7cmV0dXJuIHRydWV9fX0scXVlcnlDb21tYW5kVmFsdWU6ZnVuY3Rpb24oKXtpZihjbWQ9ZVtjbWQudG9Mb3dlckNhc2UoKV0pe3JldHVybiBjbWQuZnVuYy5jYWxsKHNjb3BlfHxjbWQuc2NvcGUsdWksdmFsdWUsYXJncyl9fSxxdWVyeUNvbW1hbmRTdGF0ZTpmdW5jdGlvbigpe2lmKGNtZD1jW2NtZC50b0xvd2VyQ2FzZSgpXSl7cmV0dXJuIGNtZC5mdW5jLmNhbGwoc2NvcGV8fGNtZC5zY29wZSx1aSx2YWx1ZSxhcmdzKX19fSl9YS5HbG9iYWxDb21tYW5kcz1uZXcgYigpfSkodGlueW1jZSk7KGZ1bmN0aW9uKGEpe2EuRm9ybWF0dGVyPWZ1bmN0aW9uKFQpe3ZhciBLPXt9LE09YS5lYWNoLGM9VC5kb20scD1ULnNlbGVjdGlvbixzPWEuZG9tLlRyZWVXYWxrZXIsST1uZXcgYS5kb20uUmFuZ2VVdGlscyhjKSxkPVQuc2NoZW1hLmlzVmFsaWQsRT1jLmlzQmxvY2ssaz1ULnNldHRpbmdzLmZvcmNlZF9yb290X2Jsb2NrLHI9Yy5ub2RlSW5kZXgsRD0iXHVGRUZGIixlPS9eKHNyY3xocmVmfHN0eWxlKSQvLFE9ZmFsc2UsQT10cnVlLG8sTj17YXBwbHk6W10scmVtb3ZlOltdfTtmdW5jdGlvbiB5KFUpe3JldHVybiBVIGluc3RhbmNlb2YgQXJyYXl9ZnVuY3Rpb24gbChWLFUpe3JldHVybiBjLmdldFBhcmVudHMoVixVLGMuZ2V0Um9vdCgpKX1mdW5jdGlvbiBiKFUpe3JldHVybiBVLm5vZGVUeXBlPT09MSYmKFUuZmFjZT09PSJtY2VpbmxpbmUifHxVLnN0eWxlLmZvbnRGYW1pbHk9PT0ibWNlaW5saW5lIil9ZnVuY3Rpb24gUChVKXtyZXR1cm4gVT9LW1VdOkt9ZnVuY3Rpb24gaihVLFYpe2lmKFUpe2lmKHR5cGVvZihVKSE9PSJzdHJpbmciKXtNKFUsZnVuY3Rpb24oWCxXKXtqKFcsWCl9KX1lbHNle1Y9Vi5sZW5ndGg/VjpbVl07TShWLGZ1bmN0aW9uKFcpe2lmKFcuZGVlcD09PW8pe1cuZGVlcD0hVy5zZWxlY3Rvcn1pZihXLnNwbGl0PT09byl7Vy5zcGxpdD0hVy5zZWxlY3Rvcnx8Vy5pbmxpbmV9aWYoVy5yZW1vdmU9PT1vJiZXLnNlbGVjdG9yJiYhVy5pbmxpbmUpe1cucmVtb3ZlPSJub25lIn1pZihXLnNlbGVjdG9yJiZXLmlubGluZSl7Vy5taXhlZD10cnVlO1cuYmxvY2tfZXhwYW5kPXRydWV9aWYodHlwZW9mKFcuY2xhc3Nlcyk9PT0ic3RyaW5nIil7Vy5jbGFzc2VzPVcuY2xhc3Nlcy5zcGxpdCgvXHMrLyl9fSk7S1tVXT1WfX19ZnVuY3Rpb24gUihXLGFjLFkpe3ZhciBaPVAoVyksYWQ9WlswXSxhYixWLGFhO2Z1bmN0aW9uIFgoYWcpe3ZhciBhZj1hZy5zdGFydENvbnRhaW5lcixhaj1hZy5zdGFydE9mZnNldCxhaSxhaDtpZihhZi5ub2RlVHlwZT09MXx8YWYubm9kZVZhbHVlPT09IiIpe2FmPWFmLm5vZGVUeXBlPT0xP2FmLmNoaWxkTm9kZXNbYWpdOmFmO2lmKGFmKXthaT1uZXcgcyhhZixhZi5wYXJlbnROb2RlKTtmb3IoYWg9YWkuY3VycmVudCgpO2FoO2FoPWFpLm5leHQoKSl7aWYoYWgubm9kZVR5cGU9PTMmJiFmKGFoKSl7YWcuc2V0U3RhcnQoYWgsMCk7YnJlYWt9fX19cmV0dXJuIGFnfWZ1bmN0aW9uIFUoYWcsYWYpe2FmPWFmfHxhZDtpZihhZyl7TShhZi5zdHlsZXMsZnVuY3Rpb24oYWksYWgpe2Muc2V0U3R5bGUoYWcsYWgscShhaSxhYykpfSk7TShhZi5hdHRyaWJ1dGVzLGZ1bmN0aW9uKGFpLGFoKXtjLnNldEF0dHJpYihhZyxhaCxxKGFpLGFjKSl9KTtNKGFmLmNsYXNzZXMsZnVuY3Rpb24oYWgpe2FoPXEoYWgsYWMpO2lmKCFjLmhhc0NsYXNzKGFnLGFoKSl7Yy5hZGRDbGFzcyhhZyxhaCl9fSl9fWZ1bmN0aW9uIGFlKGFnKXt2YXIgYWY9W10sYWksYWg7YWk9YWQuaW5saW5lfHxhZC5ibG9jazthaD1jLmNyZWF0ZShhaSk7VShhaCk7SS53YWxrKGFnLGZ1bmN0aW9uKGFqKXt2YXIgYWs7ZnVuY3Rpb24gYWwoYW0pe3ZhciBhcD1hbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGFvPWFtLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxhbjtpZihnKGFwLCJiciIpKXthaz0wO2lmKGFkLmJsb2NrKXtjLnJlbW92ZShhbSl9cmV0dXJufWlmKGFkLndyYXBwZXImJnYoYW0sVyxhYykpe2FrPTA7cmV0dXJufWlmKGFkLmJsb2NrJiYhYWQud3JhcHBlciYmRihhcCkpe2FtPWMucmVuYW1lKGFtLGFpKTtVKGFtKTthZi5wdXNoKGFtKTthaz0wO3JldHVybn1pZihhZC5zZWxlY3Rvcil7TShaLGZ1bmN0aW9uKGFxKXtpZihjLmlzKGFtLGFxLnNlbGVjdG9yKSYmIWIoYW0pKXtVKGFtLGFxKTthbj10cnVlfX0pO2lmKCFhZC5pbmxpbmV8fGFuKXthaz0wO3JldHVybn19aWYoKGFkLndyYXBfbGlua3MhPT1mYWxzZXx8YXAhPSJhIikmJmQoYWksYXApJiZkKGFvLGFpKSl7aWYoIWFrKXthaz1haC5jbG9uZU5vZGUoUSk7YW0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYWssYW0pO2FmLnB1c2goYWspfWFrLmFwcGVuZENoaWxkKGFtKX1lbHNle2FrPTA7TShhLmdyZXAoYW0uY2hpbGROb2RlcyksYWwpO2FrPTB9fU0oYWosYWwpfSk7TShhZixmdW5jdGlvbihhbCl7dmFyIGFqO2Z1bmN0aW9uIGFtKGFvKXt2YXIgYW49MDtNKGFvLmNoaWxkTm9kZXMsZnVuY3Rpb24oYXApe2lmKCFmKGFwKSYmIUcoYXApKXthbisrfX0pO3JldHVybiBhbn1mdW5jdGlvbiBhayhhbil7dmFyIGFwLGFvO00oYW4uY2hpbGROb2RlcyxmdW5jdGlvbihhcSl7aWYoYXEubm9kZVR5cGU9PTEmJiFHKGFxKSYmIWIoYXEpKXthcD1hcTtyZXR1cm4gUX19KTtpZihhcCYmaChhcCxhZCkpe2FvPWFwLmNsb25lTm9kZShRKTtVKGFvKTtjLnJlcGxhY2UoYW8sYW4sQSk7Yy5yZW1vdmUoYXAsMSl9cmV0dXJuIGFvfHxhbn1haj1hbShhbCk7aWYoYWo9PT0wKXtjLnJlbW92ZShhbCwxKTtyZXR1cm59aWYoYWQuaW5saW5lfHxhZC53cmFwcGVyKXtpZighYWQuZXhhY3QmJmFqPT09MSl7YWw9YWsoYWwpfU0oWixmdW5jdGlvbihhbil7TShjLnNlbGVjdChhbi5pbmxpbmUsYWwpLGZ1bmN0aW9uKGFvKXtTKGFuLGFjLGFvLGFuLmV4YWN0P2FvOm51bGwpfSl9KTtpZih2KGFsLnBhcmVudE5vZGUsVyxhYykpe2MucmVtb3ZlKGFsLDEpO2FsPTA7cmV0dXJuIEF9aWYoYWQubWVyZ2Vfd2l0aF9wYXJlbnRzKXtjLmdldFBhcmVudChhbC5wYXJlbnROb2RlLGZ1bmN0aW9uKGFuKXtpZih2KGFuLFcsYWMpKXtjLnJlbW92ZShhbCwxKTthbD0wO3JldHVybiBBfX0pfWlmKGFsKXthbD10KEIoYWwpLGFsKTthbD10KGFsLEIoYWwsQSkpfX19KX1pZihhZCl7aWYoWSl7Vj1jLmNyZWF0ZVJuZygpO1Yuc2V0U3RhcnRCZWZvcmUoWSk7Vi5zZXRFbmRBZnRlcihZKTthZShuKFYsWikpfWVsc2V7aWYoIXAuaXNDb2xsYXBzZWQoKXx8IWFkLmlubGluZSl7YWI9cC5nZXRCb29rbWFyaygpO2FlKG4ocC5nZXRSbmcoQSksWikpO3AubW92ZVRvQm9va21hcmsoYWIpO3Auc2V0Um5nKFgocC5nZXRSbmcoQSkpKTtULm5vZGVDaGFuZ2VkKCl9ZWxzZXtPKCJhcHBseSIsVyxhYyl9fX19ZnVuY3Rpb24geihXLGFmLFope3ZhciBhYT1QKFcpLGFoPWFhWzBdLGFlLGFkLFY7ZnVuY3Rpb24gWShhayl7dmFyIGFqPWFrLnN0YXJ0Q29udGFpbmVyLGFwPWFrLnN0YXJ0T2Zmc2V0LGFvLGFuLGFsLGFtO2lmKGFqLm5vZGVUeXBlPT0zJiZhcD49YWoubm9kZVZhbHVlLmxlbmd0aC0xKXthaj1hai5wYXJlbnROb2RlO2FwPXIoYWopKzF9aWYoYWoubm9kZVR5cGU9PTEpe2FsPWFqLmNoaWxkTm9kZXM7YWo9YWxbTWF0aC5taW4oYXAsYWwubGVuZ3RoLTEpXTthbz1uZXcgcyhhaik7aWYoYXA+YWwubGVuZ3RoLTEpe2FvLm5leHQoKX1mb3IoYW49YW8uY3VycmVudCgpO2FuO2FuPWFvLm5leHQoKSl7aWYoYW4ubm9kZVR5cGU9PTMmJiFmKGFuKSl7YW09Yy5jcmVhdGUoImEiLG51bGwsRCk7YW4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYW0sYW4pO2FrLnNldFN0YXJ0KGFuLDApO3Auc2V0Um5nKGFrKTtjLnJlbW92ZShhbSk7cmV0dXJufX19fWZ1bmN0aW9uIFgoYW0pe3ZhciBhbCxhayxhajthbD1hLmdyZXAoYW0uY2hpbGROb2Rlcyk7Zm9yKGFrPTAsYWo9YWEubGVuZ3RoO2FrPGFqO2FrKyspe2lmKFMoYWFbYWtdLGFmLGFtLGFtKSl7YnJlYWt9fWlmKGFoLmRlZXApe2Zvcihhaz0wLGFqPWFsLmxlbmd0aDthazxhajthaysrKXtYKGFsW2FrXSl9fX1mdW5jdGlvbiBhYihhail7dmFyIGFrO00obChhai5wYXJlbnROb2RlKS5yZXZlcnNlKCksZnVuY3Rpb24oYWwpe3ZhciBhbTtpZighYWsmJmFsLmlkIT0iX3N0YXJ0IiYmYWwuaWQhPSJfZW5kIil7YW09dihhbCxXLGFmKTtpZihhbSYmYW0uc3BsaXQhPT1mYWxzZSl7YWs9YWx9fX0pO3JldHVybiBha31mdW5jdGlvbiBVKGFtLGFqLGFvLGFyKXt2YXIgYXQsYXEsYXAsYWwsYW4sYWs7aWYoYW0pe2FrPWFtLnBhcmVudE5vZGU7Zm9yKGF0PWFqLnBhcmVudE5vZGU7YXQmJmF0IT1hazthdD1hdC5wYXJlbnROb2RlKXthcT1hdC5jbG9uZU5vZGUoUSk7Zm9yKGFuPTA7YW48YWEubGVuZ3RoO2FuKyspe2lmKFMoYWFbYW5dLGFmLGFxLGFxKSl7YXE9MDticmVha319aWYoYXEpe2lmKGFwKXthcS5hcHBlbmRDaGlsZChhcCl9aWYoIWFsKXthbD1hcX1hcD1hcX19aWYoYXImJighYWgubWl4ZWR8fCFFKGFtKSkpe2FqPWMuc3BsaXQoYW0sYWopfWlmKGFwKXthby5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhcCxhbyk7YWwuYXBwZW5kQ2hpbGQoYW8pfX1yZXR1cm4gYWp9ZnVuY3Rpb24gYWcoYWope3JldHVybiBVKGFiKGFqKSxhaixhaix0cnVlKX1mdW5jdGlvbiBhYyhhbCl7dmFyIGFrPWMuZ2V0KGFsPyJfc3RhcnQiOiJfZW5kIiksYWo9YWtbYWw/ImZpcnN0Q2hpbGQiOiJsYXN0Q2hpbGQiXTtpZihHKGFqKSl7YWo9YWpbYWw/ImZpcnN0Q2hpbGQiOiJsYXN0Q2hpbGQiXX1jLnJlbW92ZShhayx0cnVlKTtyZXR1cm4gYWp9ZnVuY3Rpb24gYWkoYWope3ZhciBhayxhbDthaj1uKGFqLGFhLEEpO2lmKGFoLnNwbGl0KXthaz1IKGFqLEEpO2FsPUgoYWopO2lmKGFrIT1hbCl7YWs9TChhaywic3BhbiIse2lkOiJfc3RhcnQiLF9tY2VfdHlwZToiYm9va21hcmsifSk7YWw9TChhbCwic3BhbiIse2lkOiJfZW5kIixfbWNlX3R5cGU6ImJvb2ttYXJrIn0pO2FnKGFrKTthZyhhbCk7YWs9YWMoQSk7YWw9YWMoKX1lbHNle2FrPWFsPWFnKGFrKX1hai5zdGFydENvbnRhaW5lcj1hay5wYXJlbnROb2RlO2FqLnN0YXJ0T2Zmc2V0PXIoYWspO2FqLmVuZENvbnRhaW5lcj1hbC5wYXJlbnROb2RlO2FqLmVuZE9mZnNldD1yKGFsKSsxfUkud2FsayhhaixmdW5jdGlvbihhbSl7TShhbSxmdW5jdGlvbihhbil7WChhbil9KX0pfWlmKFope1Y9Yy5jcmVhdGVSbmcoKTtWLnNldFN0YXJ0QmVmb3JlKFopO1Yuc2V0RW5kQWZ0ZXIoWik7YWkoVik7cmV0dXJufWlmKCFwLmlzQ29sbGFwc2VkKCl8fCFhaC5pbmxpbmUpe2FlPXAuZ2V0Qm9va21hcmsoKTthaShwLmdldFJuZyhBKSk7cC5tb3ZlVG9Cb29rbWFyayhhZSk7aWYoaShXLGFmLHAuZ2V0U3RhcnQoKSkpe1kocC5nZXRSbmcodHJ1ZSkpfVQubm9kZUNoYW5nZWQoKX1lbHNle08oInJlbW92ZSIsVyxhZil9fWZ1bmN0aW9uIEMoVSxXLFYpe2lmKGkoVSxXLFYpKXt6KFUsVyxWKX1lbHNle1IoVSxXLFYpfX1mdW5jdGlvbiB2KFYsVSxhYSxZKXt2YXIgVz1QKFUpLGFiLFosWDtmdW5jdGlvbiBhYyhhZyxhaSxhail7dmFyIGFmLGFoLGFkPWFpW2FqXSxhZTtpZihhZCl7aWYoYWQubGVuZ3RoPT09byl7Zm9yKGFmIGluIGFkKXtpZihhZC5oYXNPd25Qcm9wZXJ0eShhZikpe2lmKGFqPT09ImF0dHJpYnV0ZXMiKXthaD1jLmdldEF0dHJpYihhZyxhZil9ZWxzZXthaD1KKGFnLGFmKX1pZihZJiYhYWgmJiFhaS5leGFjdCl7cmV0dXJufWlmKCghWXx8YWkuZXhhY3QpJiYhZyhhaCxxKGFkW2FmXSxhYSkpKXtyZXR1cm59fX19ZWxzZXtmb3IoYWU9MDthZTxhZC5sZW5ndGg7YWUrKyl7aWYoYWo9PT0iYXR0cmlidXRlcyI/Yy5nZXRBdHRyaWIoYWcsYWRbYWVdKTpKKGFnLGFkW2FlXSkpe3JldHVybiBhaX19fX1yZXR1cm4gYWl9aWYoVyYmVil7Zm9yKFo9MDtaPFcubGVuZ3RoO1orKyl7YWI9V1taXTtpZihoKFYsYWIpJiZhYyhWLGFiLCJhdHRyaWJ1dGVzIikmJmFjKFYsYWIsInN0eWxlcyIpKXtpZihYPWFiLmNsYXNzZXMpe2ZvcihaPTA7WjxYLmxlbmd0aDtaKyspe2lmKCFjLmhhc0NsYXNzKFYsWFtaXSkpe3JldHVybn19fXJldHVybiBhYn19fX1mdW5jdGlvbiBpKFcsWixZKXt2YXIgVixYO2Z1bmN0aW9uIFUoYWEpe2FhPWMuZ2V0UGFyZW50KGFhLGZ1bmN0aW9uKGFiKXtyZXR1cm4gISF2KGFiLFcsWix0cnVlKX0pO3JldHVybiB2KGFhLFcsWil9aWYoWSl7cmV0dXJuIFUoWSl9aWYocC5pc0NvbGxhcHNlZCgpKXtmb3IoWD1OLmFwcGx5Lmxlbmd0aC0xO1g+PTA7WC0tKXtpZihOLmFwcGx5W1hdLm5hbWU9PVcpe3JldHVybiB0cnVlfX1mb3IoWD1OLnJlbW92ZS5sZW5ndGgtMTtYPj0wO1gtLSl7aWYoTi5yZW1vdmVbWF0ubmFtZT09Vyl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gVShwLmdldE5vZGUoKSl9WT1wLmdldE5vZGUoKTtpZihVKFkpKXtyZXR1cm4gQX1WPXAuZ2V0U3RhcnQoKTtpZihWIT1ZKXtpZihVKFYpKXtyZXR1cm4gQX19cmV0dXJuIFF9ZnVuY3Rpb24gdShhYixhYSl7dmFyIFksWj1bXSxYPXt9LFcsVixVO2lmKHAuaXNDb2xsYXBzZWQoKSl7Zm9yKFY9MDtWPGFiLmxlbmd0aDtWKyspe2ZvcihXPU4ucmVtb3ZlLmxlbmd0aC0xO1c+PTA7Vy0tKXtVPWFiW1ZdO2lmKE4ucmVtb3ZlW1ddLm5hbWU9PVUpe1hbVV09dHJ1ZTticmVha319fWZvcihXPU4uYXBwbHkubGVuZ3RoLTE7Vz49MDtXLS0pe2ZvcihWPTA7VjxhYi5sZW5ndGg7VisrKXtVPWFiW1ZdO2lmKCFYW1VdJiZOLmFwcGx5W1ddLm5hbWU9PVUpe1hbVV09dHJ1ZTtaLnB1c2goVSl9fX19WT1wLmdldFN0YXJ0KCk7Yy5nZXRQYXJlbnQoWSxmdW5jdGlvbihhZSl7dmFyIGFkLGFjO2ZvcihhZD0wO2FkPGFiLmxlbmd0aDthZCsrKXthYz1hYlthZF07aWYoIVhbYWNdJiZ2KGFlLGFjLGFhKSl7WFthY109dHJ1ZTtaLnB1c2goYWMpfX19KTtyZXR1cm4gWn1mdW5jdGlvbiB4KFkpe3ZhciBhYT1QKFkpLFgsVyxaLFYsVTtpZihhYSl7WD1wLmdldFN0YXJ0KCk7Vz1sKFgpO2ZvcihWPWFhLmxlbmd0aC0xO1Y+PTA7Vi0tKXtVPWFhW1ZdLnNlbGVjdG9yO2lmKCFVKXtyZXR1cm4gQX1mb3IoWj1XLmxlbmd0aC0xO1o+PTA7Wi0tKXtpZihjLmlzKFdbWl0sVSkpe3JldHVybiBBfX19fXJldHVybiBRfWEuZXh0ZW5kKHRoaXMse2dldDpQLHJlZ2lzdGVyOmosYXBwbHk6UixyZW1vdmU6eix0b2dnbGU6QyxtYXRjaDppLG1hdGNoQWxsOnUsbWF0Y2hOb2RlOnYsY2FuQXBwbHk6eH0pO2Z1bmN0aW9uIGgoVSxWKXtpZihnKFUsVi5pbmxpbmUpKXtyZXR1cm4gQX1pZihnKFUsVi5ibG9jaykpe3JldHVybiBBfWlmKFYuc2VsZWN0b3Ipe3JldHVybiBjLmlzKFUsVi5zZWxlY3Rvcil9fWZ1bmN0aW9uIGcoVixVKXtWPVZ8fCIiO1U9VXx8IiI7Vj0iIisoVi5ub2RlTmFtZXx8Vik7VT0iIisoVS5ub2RlTmFtZXx8VSk7cmV0dXJuIFYudG9Mb3dlckNhc2UoKT09VS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIEooVixVKXt2YXIgVz1jLmdldFN0eWxlKFYsVSk7aWYoVT09ImNvbG9yInx8VT09ImJhY2tncm91bmRDb2xvciIpe1c9Yy50b0hleChXKX1pZihVPT0iZm9udFdlaWdodCImJlc9PTcwMCl7Vz0iYm9sZCJ9cmV0dXJuIiIrV31mdW5jdGlvbiBxKFUsVil7aWYodHlwZW9mKFUpIT0ic3RyaW5nIil7VT1VKFYpfWVsc2V7aWYoVil7VT1VLnJlcGxhY2UoLyUoXHcrKS9nLGZ1bmN0aW9uKFgsVyl7cmV0dXJuIFZbV118fFh9KX19cmV0dXJuIFV9ZnVuY3Rpb24gZihVKXtyZXR1cm4gVSYmVS5ub2RlVHlwZT09PTMmJi9eKFtcc1xyXG5dK3wpJC8udGVzdChVLm5vZGVWYWx1ZSl9ZnVuY3Rpb24gTChXLFYsVSl7dmFyIFg9Yy5jcmVhdGUoVixVKTtXLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKFgsVyk7WC5hcHBlbmRDaGlsZChXKTtyZXR1cm4gWH1mdW5jdGlvbiBuKFUsYWMsWCl7dmFyIFc9VS5zdGFydENvbnRhaW5lcixaPVUuc3RhcnRPZmZzZXQsYWY9VS5lbmRDb250YWluZXIsYWE9VS5lbmRPZmZzZXQsYWUsYWI7ZnVuY3Rpb24gYWQoYWksYWosYWcsYWgpe3ZhciBhayxhbDthaD1haHx8Yy5nZXRSb290KCk7Zm9yKDs7KXthaz1haS5wYXJlbnROb2RlO2lmKGFrPT1haHx8KCFhY1swXS5ibG9ja19leHBhbmQmJkUoYWspKSl7cmV0dXJuIGFpfWZvcihhZT1ha1thal07YWUmJmFlIT1haTthZT1hZVthZ10pe2lmKGFlLm5vZGVUeXBlPT0xJiYhRyhhZSkpe3JldHVybiBhaX1pZihhZS5ub2RlVHlwZT09MyYmIWYoYWUpKXtyZXR1cm4gYWl9fWFpPWFpLnBhcmVudE5vZGV9cmV0dXJuIGFpfWlmKFcubm9kZVR5cGU9PTEmJlcuaGFzQ2hpbGROb2RlcygpKXthYj1XLmNoaWxkTm9kZXMubGVuZ3RoLTE7Vz1XLmNoaWxkTm9kZXNbWj5hYj9hYjpaXTtpZihXLm5vZGVUeXBlPT0zKXtaPTB9fWlmKGFmLm5vZGVUeXBlPT0xJiZhZi5oYXNDaGlsZE5vZGVzKCkpe2FiPWFmLmNoaWxkTm9kZXMubGVuZ3RoLTE7YWY9YWYuY2hpbGROb2Rlc1thYT5hYj9hYjphYS0xXTtpZihhZi5ub2RlVHlwZT09Myl7YWE9YWYubm9kZVZhbHVlLmxlbmd0aH19aWYoRyhXLnBhcmVudE5vZGUpKXtXPVcucGFyZW50Tm9kZX1pZihHKFcpKXtXPVcubmV4dFNpYmxpbmd8fFd9aWYoRyhhZi5wYXJlbnROb2RlKSl7YWY9YWYucGFyZW50Tm9kZX1pZihHKGFmKSl7YWY9YWYucHJldmlvdXNTaWJsaW5nfHxhZn1pZihhY1swXS5pbmxpbmV8fGFjWzBdLmJsb2NrX2V4cGFuZCl7Vz1hZChXLCJmaXJzdENoaWxkIiwibmV4dFNpYmxpbmciKTthZj1hZChhZiwibGFzdENoaWxkIiwicHJldmlvdXNTaWJsaW5nIil9aWYoYWNbMF0uc2VsZWN0b3ImJmFjWzBdLmV4cGFuZCE9PVEmJiFhY1swXS5pbmxpbmUpe2Z1bmN0aW9uIFkoYWgsYWcpe3ZhciBhaSxhaixhaztpZihhaC5ub2RlVHlwZT09MyYmYWgubm9kZVZhbHVlLmxlbmd0aD09MCYmYWhbYWddKXthaD1haFthZ119YWk9bChhaCk7Zm9yKGFqPTA7YWo8YWkubGVuZ3RoO2FqKyspe2Zvcihhaz0wO2FrPGFjLmxlbmd0aDthaysrKXtpZihjLmlzKGFpW2FqXSxhY1tha10uc2VsZWN0b3IpKXtyZXR1cm4gYWlbYWpdfX19cmV0dXJuIGFofVc9WShXLCJwcmV2aW91c1NpYmxpbmciKTthZj1ZKGFmLCJuZXh0U2libGluZyIpfWlmKGFjWzBdLmJsb2NrfHxhY1swXS5zZWxlY3Rvcil7ZnVuY3Rpb24gVihhaCxhZyxhail7dmFyIGFpO2lmKCFhY1swXS53cmFwcGVyKXthaT1jLmdldFBhcmVudChhaCxhY1swXS5ibG9jayl9aWYoIWFpKXthaT1jLmdldFBhcmVudChhaC5ub2RlVHlwZT09Mz9haC5wYXJlbnROb2RlOmFoLEUpfWlmKGFpJiZhY1swXS53cmFwcGVyKXthaT1sKGFpLCJ1bCxvbCIpLnJldmVyc2UoKVswXXx8YWl9aWYoIWFpKXthaT1haDt3aGlsZShhaVthZ10mJiFFKGFpW2FnXSkpe2FpPWFpW2FnXTtpZihnKGFpLCJiciIpKXticmVha319fXJldHVybiBhaXx8YWh9Vz1WKFcsInByZXZpb3VzU2libGluZyIpO2FmPVYoYWYsIm5leHRTaWJsaW5nIik7aWYoYWNbMF0uYmxvY2spe2lmKCFFKFcpKXtXPWFkKFcsImZpcnN0Q2hpbGQiLCJuZXh0U2libGluZyIpfWlmKCFFKGFmKSl7YWY9YWQoYWYsImxhc3RDaGlsZCIsInByZXZpb3VzU2libGluZyIpfX19aWYoVy5ub2RlVHlwZT09MSl7Wj1yKFcpO1c9Vy5wYXJlbnROb2RlfWlmKGFmLm5vZGVUeXBlPT0xKXthYT1yKGFmKSsxO2FmPWFmLnBhcmVudE5vZGV9cmV0dXJue3N0YXJ0Q29udGFpbmVyOlcsc3RhcnRPZmZzZXQ6WixlbmRDb250YWluZXI6YWYsZW5kT2Zmc2V0OmFhfX1mdW5jdGlvbiBTKGFhLFosWCxVKXt2YXIgVyxWLFk7aWYoIWgoWCxhYSkpe3JldHVybiBRfWlmKGFhLnJlbW92ZSE9ImFsbCIpe00oYWEuc3R5bGVzLGZ1bmN0aW9uKGFjLGFiKXthYz1xKGFjLFopO2lmKHR5cGVvZihhYik9PT0ibnVtYmVyIil7YWI9YWM7VT0wfWlmKCFVfHxnKEooVSxhYiksYWMpKXtjLnNldFN0eWxlKFgsYWIsIiIpfVk9MX0pO2lmKFkmJmMuZ2V0QXR0cmliKFgsInN0eWxlIik9PSIiKXtYLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKTtYLnJlbW92ZUF0dHJpYnV0ZSgiX21jZV9zdHlsZSIpfU0oYWEuYXR0cmlidXRlcyxmdW5jdGlvbihhZCxhYil7dmFyIGFjO2FkPXEoYWQsWik7aWYodHlwZW9mKGFiKT09PSJudW1iZXIiKXthYj1hZDtVPTB9aWYoIVV8fGcoYy5nZXRBdHRyaWIoVSxhYiksYWQpKXtpZihhYj09ImNsYXNzIil7YWQ9Yy5nZXRBdHRyaWIoWCxhYik7aWYoYWQpe2FjPSIiO00oYWQuc3BsaXQoL1xzKy8pLGZ1bmN0aW9uKGFlKXtpZigvbWNlXHcrLy50ZXN0KGFlKSl7YWMrPShhYz8iICI6IiIpK2FlfX0pO2lmKGFjKXtjLnNldEF0dHJpYihYLGFiLGFjKTtyZXR1cm59fX1pZihhYj09ImNsYXNzIil7WC5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfWlmKGUudGVzdChhYikpe1gucmVtb3ZlQXR0cmlidXRlKCJfbWNlXyIrYWIpfVgucmVtb3ZlQXR0cmlidXRlKGFiKX19KTtNKGFhLmNsYXNzZXMsZnVuY3Rpb24oYWIpe2FiPXEoYWIsWik7aWYoIVV8fGMuaGFzQ2xhc3MoVSxhYikpe2MucmVtb3ZlQ2xhc3MoWCxhYil9fSk7Vj1jLmdldEF0dHJpYnMoWCk7Zm9yKFc9MDtXPFYubGVuZ3RoO1crKyl7aWYoVltXXS5ub2RlTmFtZS5pbmRleE9mKCJfIikhPT0wKXtyZXR1cm4gUX19fWlmKGFhLnJlbW92ZSE9Im5vbmUiKXttKFgsYWEpO3JldHVybiBBfX1mdW5jdGlvbiBtKFcsWCl7dmFyIFU9Vy5wYXJlbnROb2RlLFY7aWYoWC5ibG9jayl7aWYoIWspe2Z1bmN0aW9uIFkoYWEsWixhYil7YWE9QihhYSxaLGFiKTtyZXR1cm4gIWFhfHwoYWEubm9kZU5hbWU9PSJCUiJ8fEUoYWEpKX1pZihFKFcpJiYhRShVKSl7aWYoIVkoVyxRKSYmIVkoVy5maXJzdENoaWxkLEEsMSkpe1cuaW5zZXJ0QmVmb3JlKGMuY3JlYXRlKCJiciIpLFcuZmlyc3RDaGlsZCl9aWYoIVkoVyxBKSYmIVkoVy5sYXN0Q2hpbGQsUSwxKSl7Vy5hcHBlbmRDaGlsZChjLmNyZWF0ZSgiYnIiKSl9fX1lbHNle2lmKFU9PWMuZ2V0Um9vdCgpKXtpZighWC5saXN0X2Jsb2NrfHwhZyhXLFgubGlzdF9ibG9jaykpe00oYS5ncmVwKFcuY2hpbGROb2RlcyksZnVuY3Rpb24oWil7aWYoZChrLFoubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpe2lmKCFWKXtWPUwoWixrKX1lbHNle1YuYXBwZW5kQ2hpbGQoWil9fWVsc2V7Vj0wfX0pfX19fWlmKFguc2VsZWN0b3ImJlguaW5saW5lJiYhZyhYLmlubGluZSxXKSl7cmV0dXJufWMucmVtb3ZlKFcsMSl9ZnVuY3Rpb24gQihWLFUsVyl7aWYoVil7VT1VPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyI7Zm9yKFY9Vz9WOlZbVV07VjtWPVZbVV0pe2lmKFYubm9kZVR5cGU9PTF8fCFmKFYpKXtyZXR1cm4gVn19fX1mdW5jdGlvbiBHKFUpe3JldHVybiBVJiZVLm5vZGVUeXBlPT0xJiZVLmdldEF0dHJpYnV0ZSgiX21jZV90eXBlIik9PSJib29rbWFyayJ9ZnVuY3Rpb24gdChZLFgpe3ZhciBVLFcsVjtmdW5jdGlvbiBhYShhZCxhYyl7aWYoYWQubm9kZU5hbWUhPWFjLm5vZGVOYW1lKXtyZXR1cm4gUX1mdW5jdGlvbiBhYihhZil7dmFyIGFnPXt9O00oYy5nZXRBdHRyaWJzKGFmKSxmdW5jdGlvbihhaCl7dmFyIGFpPWFoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoYWkuaW5kZXhPZigiXyIpIT09MCYmYWkhPT0ic3R5bGUiKXthZ1thaV09Yy5nZXRBdHRyaWIoYWYsYWkpfX0pO3JldHVybiBhZ31mdW5jdGlvbiBhZShhaSxhaCl7dmFyIGFnLGFmO2ZvcihhZiBpbiBhaSl7aWYoYWkuaGFzT3duUHJvcGVydHkoYWYpKXthZz1haFthZl07aWYoYWc9PT1vKXtyZXR1cm4gUX1pZihhaVthZl0hPWFnKXtyZXR1cm4gUX1kZWxldGUgYWhbYWZdfX1mb3IoYWYgaW4gYWgpe2lmKGFoLmhhc093blByb3BlcnR5KGFmKSl7cmV0dXJuIFF9fXJldHVybiBBfWlmKCFhZShhYihhZCksYWIoYWMpKSl7cmV0dXJuIFF9aWYoIWFlKGMucGFyc2VTdHlsZShjLmdldEF0dHJpYihhZCwic3R5bGUiKSksYy5wYXJzZVN0eWxlKGMuZ2V0QXR0cmliKGFjLCJzdHlsZSIpKSkpe3JldHVybiBRfXJldHVybiBBfWlmKFkmJlgpe2Z1bmN0aW9uIFooYWMsYWIpe2ZvcihXPWFjO1c7Vz1XW2FiXSl7aWYoVy5ub2RlVHlwZT09MyYmIWYoVykpe3JldHVybiBhY31pZihXLm5vZGVUeXBlPT0xJiYhRyhXKSl7cmV0dXJuIFd9fXJldHVybiBhY31ZPVooWSwicHJldmlvdXNTaWJsaW5nIik7WD1aKFgsIm5leHRTaWJsaW5nIik7aWYoYWEoWSxYKSl7Zm9yKFc9WS5uZXh0U2libGluZztXJiZXIT1YOyl7Vj1XO1c9Vy5uZXh0U2libGluZztZLmFwcGVuZENoaWxkKFYpfWMucmVtb3ZlKFgpO00oYS5ncmVwKFguY2hpbGROb2RlcyksZnVuY3Rpb24oYWIpe1kuYXBwZW5kQ2hpbGQoYWIpfSk7cmV0dXJuIFl9fXJldHVybiBYfWZ1bmN0aW9uIEYoVSl7cmV0dXJuL14oaFsxLTZdfHB8ZGl2fHByZXxhZGRyZXNzfGRsfGR0fGRkKSQvLnRlc3QoVSl9ZnVuY3Rpb24gSChWLFkpe3ZhciBVLFgsVztVPVZbWT8ic3RhcnRDb250YWluZXIiOiJlbmRDb250YWluZXIiXTtYPVZbWT8ic3RhcnRPZmZzZXQiOiJlbmRPZmZzZXQiXTtpZihVLm5vZGVUeXBlPT0xKXtXPVUuY2hpbGROb2Rlcy5sZW5ndGgtMTtpZighWSYmWCl7WC0tfVU9VS5jaGlsZE5vZGVzW1g+Vz9XOlhdfXJldHVybiBVfWZ1bmN0aW9uIE8oWixWLFkpe3ZhciBXLFU9TltaXSxhYT1OW1o9PSJhcHBseSI/InJlbW92ZSI6ImFwcGx5Il07ZnVuY3Rpb24gYWIoKXtyZXR1cm4gTi5hcHBseS5sZW5ndGh8fE4ucmVtb3ZlLmxlbmd0aH1mdW5jdGlvbiBYKCl7Ti5hcHBseT1bXTtOLnJlbW92ZT1bXX1mdW5jdGlvbiBhYyhhZCl7TShOLmFwcGx5LnJldmVyc2UoKSxmdW5jdGlvbihhZSl7UihhZS5uYW1lLGFlLnZhcnMsYWQpfSk7TShOLnJlbW92ZS5yZXZlcnNlKCksZnVuY3Rpb24oYWUpe3ooYWUubmFtZSxhZS52YXJzLGFkKX0pO2MucmVtb3ZlKGFkLDEpO1goKX1mb3IoVz1VLmxlbmd0aC0xO1c+PTA7Vy0tKXtpZihVW1ddLm5hbWU9PVYpe3JldHVybn19VS5wdXNoKHtuYW1lOlYsdmFyczpZfSk7Zm9yKFc9YWEubGVuZ3RoLTE7Vz49MDtXLS0pe2lmKGFhW1ddLm5hbWU9PVYpe2FhLnNwbGljZShXLDEpfX1pZihhYigpKXtULmdldERvYygpLmV4ZWNDb21tYW5kKCJGb250TmFtZSIsZmFsc2UsIm1jZWlubGluZSIpO04ubGFzdFJuZz1wLmdldFJuZygpO00oYy5zZWxlY3QoImZvbnQsc3BhbiIpLGZ1bmN0aW9uKGFlKXt2YXIgYWQ7aWYoYihhZSkpe2FkPXAuZ2V0Qm9va21hcmsoKTthYyhhZSk7cC5tb3ZlVG9Cb29rbWFyayhhZCk7VC5ub2RlQ2hhbmdlZCgpfX0pO2lmKCFOLmlzTGlzdGVuaW5nJiZhYigpKXtOLmlzTGlzdGVuaW5nPXRydWU7TSgib25LZXlEb3duLG9uS2V5VXAsb25LZXlQcmVzcyxvbk1vdXNlVXAiLnNwbGl0KCIsIiksZnVuY3Rpb24oYWQpe1RbYWRdLmFkZFRvVG9wKGZ1bmN0aW9uKGFlLGFmKXtpZihhYigpJiYhYS5kb20uUmFuZ2VVdGlscy5jb21wYXJlUmFuZ2VzKE4ubGFzdFJuZyxwLmdldFJuZygpKSl7TShjLnNlbGVjdCgiZm9udCxzcGFuIiksZnVuY3Rpb24oYWgpe3ZhciBhaSxhZztpZihiKGFoKSl7YWk9YWguZmlyc3RDaGlsZDtpZihhaSl7YWMoYWgpO2FnPWMuY3JlYXRlUm5nKCk7YWcuc2V0U3RhcnQoYWksYWkubm9kZVZhbHVlLmxlbmd0aCk7YWcuc2V0RW5kKGFpLGFpLm5vZGVWYWx1ZS5sZW5ndGgpO3Auc2V0Um5nKGFnKTthZS5ub2RlQ2hhbmdlZCgpfWVsc2V7Yy5yZW1vdmUoYWgpfX19KTtpZihhZi50eXBlPT0ia2V5dXAifHxhZi50eXBlPT0ibW91c2V1cCIpe1goKX19fSl9KX19fX19KSh0aW55bWNlKTt0aW55bWNlLm9uQWRkRWRpdG9yLmFkZChmdW5jdGlvbihlLGEpe3ZhciBkLGgsZyxjPWEuc2V0dGluZ3M7aWYoYy5pbmxpbmVfc3R5bGVzKXtoPWUuZXhwbG9kZShjLmZvbnRfc2l6ZV9zdHlsZV92YWx1ZXMpO2Z1bmN0aW9uIGIoaixpKXtlLmVhY2goaSxmdW5jdGlvbihsLGspe2lmKGwpe2cuc2V0U3R5bGUoaixrLGwpfX0pO2cucmVuYW1lKGosInNwYW4iKX1kPXtmb250OmZ1bmN0aW9uKGosaSl7YihpLHtiYWNrZ3JvdW5kQ29sb3I6aS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IsY29sb3I6aS5jb2xvcixmb250RmFtaWx5OmkuZmFjZSxmb250U2l6ZTpoW3BhcnNlSW50KGkuc2l6ZSktMV19KX0sdTpmdW5jdGlvbihqLGkpe2IoaSx7dGV4dERlY29yYXRpb246InVuZGVybGluZSJ9KX0sc3RyaWtlOmZ1bmN0aW9uKGosaSl7YihpLHt0ZXh0RGVjb3JhdGlvbjoibGluZS10aHJvdWdoIn0pfX07ZnVuY3Rpb24gZihpLGope2c9aS5kb207aWYoYy5jb252ZXJ0X2ZvbnRzX3RvX3NwYW5zKXtlLmVhY2goZy5zZWxlY3QoImZvbnQsdSxzdHJpa2UiLGoubm9kZSksZnVuY3Rpb24oayl7ZFtrLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKGEuZG9tLGspfSl9fWEub25QcmVQcm9jZXNzLmFkZChmKTthLm9uSW5pdC5hZGQoZnVuY3Rpb24oKXthLnNlbGVjdGlvbi5vblNldENvbnRlbnQuYWRkKGYpfSl9fSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/tiny_mce_prototype_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKHdpbikgew0KCXZhciB3aGl0ZVNwYWNlUmUgPSAvXlxzKnxccyokL2csDQoJCXVuZGVmaW5lZCwgaXNSZWdFeHBCcm9rZW4gPSAnQicucmVwbGFjZSgvQSguKXxCLywgJyQxJykgPT09ICckMSc7DQoNCgl2YXIgdGlueW1jZSA9IHsNCgkJbWFqb3JWZXJzaW9uIDogJzMnLA0KDQoJCW1pbm9yVmVyc2lvbiA6ICczLjkuMycsDQoNCgkJcmVsZWFzZURhdGUgOiAnMjAxMC0xMi0yMCcsDQoNCgkJX2luaXQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZCA9IGRvY3VtZW50LCBuYSA9IG5hdmlnYXRvciwgdWEgPSBuYS51c2VyQWdlbnQsIGksIG5sLCBuLCBiYXNlLCBwLCB2Ow0KDQoJCQl0LmlzT3BlcmEgPSB3aW4ub3BlcmEgJiYgb3BlcmEuYnVpbGROdW1iZXI7DQoNCgkJCXQuaXNXZWJLaXQgPSAvV2ViS2l0Ly50ZXN0KHVhKTsNCg0KCQkJdC5pc0lFID0gIXQuaXNXZWJLaXQgJiYgIXQuaXNPcGVyYSAmJiAoL01TSUUvZ2kpLnRlc3QodWEpICYmICgvRXhwbG9yZXIvZ2kpLnRlc3QobmEuYXBwTmFtZSk7DQoNCgkJCXQuaXNJRTYgPSB0LmlzSUUgJiYgL01TSUUgWzU2XS8udGVzdCh1YSk7DQoNCgkJCXQuaXNHZWNrbyA9ICF0LmlzV2ViS2l0ICYmIC9HZWNrby8udGVzdCh1YSk7DQoNCgkJCXQuaXNNYWMgPSB1YS5pbmRleE9mKCdNYWMnKSAhPSAtMTsNCg0KCQkJdC5pc0FpciA9IC9hZG9iZWFpci9pLnRlc3QodWEpOw0KDQoJCQl0LmlzSURldmljZSA9IC8oaVBhZHxpUGhvbmUpLy50ZXN0KHVhKTsNCg0KCQkJLy8gVGlueU1DRSAuTkVUIHdlYmNvbnRyb2wgbWlnaHQgYmUgc2V0dGluZyB0aGUgdmFsdWVzIGZvciBUaW55TUNFDQoJCQlpZiAod2luLnRpbnlNQ0VQcmVJbml0KSB7DQoJCQkJdC5zdWZmaXggPSB0aW55TUNFUHJlSW5pdC5zdWZmaXg7DQoJCQkJdC5iYXNlVVJMID0gdGlueU1DRVByZUluaXQuYmFzZTsNCgkJCQl0LnF1ZXJ5ID0gdGlueU1DRVByZUluaXQucXVlcnk7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQkvLyBHZXQgc3VmZml4IGFuZCBiYXNlDQoJCQl0LnN1ZmZpeCA9ICcnOw0KDQoJCQkvLyBJZiBiYXNlIGVsZW1lbnQgZm91bmQsIGFkZCB0aGF0IGluZnJvbnQgb2YgYmFzZVVSTA0KCQkJbmwgPSBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJyk7DQoJCQlmb3IgKGk9MDsgaTxubC5sZW5ndGg7IGkrKykgew0KCQkJCWlmICh2ID0gbmxbaV0uaHJlZikgew0KCQkJCQkvLyBIb3N0IG9ubHkgdmFsdWUgbGlrZSBodHRwOi8vc2l0ZS5jb20gb3IgaHR0cDovL3NpdGUuY29tOjgwMDgNCgkJCQkJaWYgKC9eaHR0cHM/OlwvXC9bXlwvXSskLy50ZXN0KHYpKQ0KCQkJCQkJdiArPSAnLyc7DQoNCgkJCQkJYmFzZSA9IHYgPyB2Lm1hdGNoKC8uKlwvLylbMF0gOiAnJzsgLy8gR2V0IG9ubHkgZGlyZWN0b3J5DQoJCQkJfQ0KCQkJfQ0KDQoJCQlmdW5jdGlvbiBnZXRCYXNlKG4pIHsNCgkJCQlpZiAobi5zcmMgJiYgL3RpbnlfbWNlKHxfZ3ppcHxfanF1ZXJ5fF9wcm90b3R5cGV8X2Z1bGwpKF9kZXZ8X3NyYyk/LmpzLy50ZXN0KG4uc3JjKSkgew0KCQkJCQlpZiAoL18oc3JjfGRldilcLmpzL2cudGVzdChuLnNyYykpDQoJCQkJCQl0LnN1ZmZpeCA9ICdfc3JjJzsNCg0KCQkJCQlpZiAoKHAgPSBuLnNyYy5pbmRleE9mKCc/JykpICE9IC0xKQ0KCQkJCQkJdC5xdWVyeSA9IG4uc3JjLnN1YnN0cmluZyhwICsgMSk7DQoNCgkJCQkJdC5iYXNlVVJMID0gbi5zcmMuc3Vic3RyaW5nKDAsIG4uc3JjLmxhc3RJbmRleE9mKCcvJykpOw0KDQoJCQkJCS8vIElmIHBhdGggdG8gc2NyaXB0IGlzIHJlbGF0aXZlIGFuZCBhIGJhc2UgaHJlZiB3YXMgZm91bmQgYWRkIHRoYXQgb25lIGluZnJvbnQNCgkJCQkJLy8gdGhlIHNyYyBwcm9wZXJ0eSB3aWxsIGFsd2F5cyBiZSBhbiBhYnNvbHV0ZSBvbmUgb24gbm9uIElFIGJyb3dzZXJzIGFuZCBJRSA4DQoJCQkJCS8vIHNvIHRoaXMgbG9naWMgd2lsbCBiYXNpY2FsbHkgb25seSBiZSBleGVjdXRlZCBvbiBvbGRlciBJRSB2ZXJzaW9ucw0KCQkJCQlpZiAoYmFzZSAmJiB0LmJhc2VVUkwuaW5kZXhPZignOi8vJykgPT0gLTEgJiYgdC5iYXNlVVJMLmluZGV4T2YoJy8nKSAhPT0gMCkNCgkJCQkJCXQuYmFzZVVSTCA9IGJhc2UgKyB0LmJhc2VVUkw7DQoNCgkJCQkJcmV0dXJuIHQuYmFzZVVSTDsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gbnVsbDsNCgkJCX07DQoNCgkJCS8vIENoZWNrIGRvY3VtZW50DQoJCQlubCA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOw0KCQkJZm9yIChpPTA7IGk8bmwubGVuZ3RoOyBpKyspIHsNCgkJCQlpZiAoZ2V0QmFzZShubFtpXSkpDQoJCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJLy8gQ2hlY2sgaGVhZA0KCQkJbiA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsNCgkJCWlmIChuKSB7DQoJCQkJbmwgPSBuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTsNCgkJCQlmb3IgKGk9MDsgaTxubC5sZW5ndGg7IGkrKykgew0KCQkJCQlpZiAoZ2V0QmFzZShubFtpXSkpDQoJCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm47DQoJCX0sDQoNCgkJaXMgOiBmdW5jdGlvbihvLCB0KSB7DQoJCQlpZiAoIXQpDQoJCQkJcmV0dXJuIG8gIT09IHVuZGVmaW5lZDsNCg0KCQkJaWYgKHQgPT0gJ2FycmF5JyAmJiAoby5oYXNPd25Qcm9wZXJ0eSAmJiBvIGluc3RhbmNlb2YgQXJyYXkpKQ0KCQkJCXJldHVybiB0cnVlOw0KDQoJCQlyZXR1cm4gdHlwZW9mKG8pID09IHQ7DQoJCX0sDQoNCgkJZWFjaCA6IGZ1bmN0aW9uKG8sIGNiLCBzKSB7DQoJCQl2YXIgbiwgbDsNCg0KCQkJaWYgKCFvKQ0KCQkJCXJldHVybiAwOw0KDQoJCQlzID0gcyB8fCBvOw0KDQoJCQlpZiAoby5sZW5ndGggIT09IHVuZGVmaW5lZCkgew0KCQkJCS8vIEluZGV4ZWQgYXJyYXlzLCBuZWVkZWQgZm9yIFNhZmFyaQ0KCQkJCWZvciAobj0wLCBsID0gby5sZW5ndGg7IG4gPCBsOyBuKyspIHsNCgkJCQkJaWYgKGNiLmNhbGwocywgb1tuXSwgbiwgbykgPT09IGZhbHNlKQ0KCQkJCQkJcmV0dXJuIDA7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkvLyBIYXNodGFibGVzDQoJCQkJZm9yIChuIGluIG8pIHsNCgkJCQkJaWYgKG8uaGFzT3duUHJvcGVydHkobikpIHsNCgkJCQkJCWlmIChjYi5jYWxsKHMsIG9bbl0sIG4sIG8pID09PSBmYWxzZSkNCgkJCQkJCQlyZXR1cm4gMDsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIDE7DQoJCX0sDQoNCg0KCQltYXAgOiBmdW5jdGlvbihhLCBmKSB7DQoJCQl2YXIgbyA9IFtdOw0KDQoJCQl0aW55bWNlLmVhY2goYSwgZnVuY3Rpb24odikgew0KCQkJCW8ucHVzaChmKHYpKTsNCgkJCX0pOw0KDQoJCQlyZXR1cm4gbzsNCgkJfSwNCg0KCQlncmVwIDogZnVuY3Rpb24oYSwgZikgew0KCQkJdmFyIG8gPSBbXTsNCg0KCQkJdGlueW1jZS5lYWNoKGEsIGZ1bmN0aW9uKHYpIHsNCgkJCQlpZiAoIWYgfHwgZih2KSkNCgkJCQkJby5wdXNoKHYpOw0KCQkJfSk7DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCWluQXJyYXkgOiBmdW5jdGlvbihhLCB2KSB7DQoJCQl2YXIgaSwgbDsNCg0KCQkJaWYgKGEpIHsNCgkJCQlmb3IgKGkgPSAwLCBsID0gYS5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCgkJCQkJaWYgKGFbaV0gPT09IHYpDQoJCQkJCQlyZXR1cm4gaTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiAtMTsNCgkJfSwNCg0KCQlleHRlbmQgOiBmdW5jdGlvbihvLCBlKSB7DQoJCQl2YXIgaSwgbCwgYSA9IGFyZ3VtZW50czsNCg0KCQkJZm9yIChpID0gMSwgbCA9IGEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQoJCQkJZSA9IGFbaV07DQoNCgkJCQl0aW55bWNlLmVhY2goZSwgZnVuY3Rpb24odiwgbikgew0KCQkJCQlpZiAodiAhPT0gdW5kZWZpbmVkKQ0KCQkJCQkJb1tuXSA9IHY7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoNCgkJdHJpbSA6IGZ1bmN0aW9uKHMpIHsNCgkJCXJldHVybiAocyA/ICcnICsgcyA6ICcnKS5yZXBsYWNlKHdoaXRlU3BhY2VSZSwgJycpOw0KCQl9LA0KDQoJCWNyZWF0ZSA6IGZ1bmN0aW9uKHMsIHApIHsNCgkJCXZhciB0ID0gdGhpcywgc3AsIG5zLCBjbiwgc2NuLCBjLCBkZSA9IDA7DQoNCgkJCS8vIFBhcnNlIDogPHByZWZpeD4gPGNsYXNzPjo8c3VwZXIgY2xhc3M+DQoJCQlzID0gL14oKHN0YXRpYykgKT8oW1x3Ll0rKSg6KFtcdy5dKykpPy8uZXhlYyhzKTsNCgkJCWNuID0gc1szXS5tYXRjaCgvKF58XC4pKFx3KykkL2kpWzJdOyAvLyBDbGFzcyBuYW1lDQoNCgkJCS8vIENyZWF0ZSBuYW1lc3BhY2UgZm9yIG5ldyBjbGFzcw0KCQkJbnMgPSB0LmNyZWF0ZU5TKHNbM10ucmVwbGFjZSgvXC5cdyskLywgJycpKTsNCg0KCQkJLy8gQ2xhc3MgYWxyZWFkeSBleGlzdHMNCgkJCWlmIChuc1tjbl0pDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBNYWtlIHB1cmUgc3RhdGljIGNsYXNzDQoJCQlpZiAoc1syXSA9PSAnc3RhdGljJykgew0KCQkJCW5zW2NuXSA9IHA7DQoNCgkJCQlpZiAodGhpcy5vbkNyZWF0ZSkNCgkJCQkJdGhpcy5vbkNyZWF0ZShzWzJdLCBzWzNdLCBuc1tjbl0pOw0KDQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQkvLyBDcmVhdGUgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KCQkJaWYgKCFwW2NuXSkgew0KCQkJCXBbY25dID0gZnVuY3Rpb24oKSB7fTsNCgkJCQlkZSA9IDE7DQoJCQl9DQoNCgkJCS8vIEFkZCBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kcw0KCQkJbnNbY25dID0gcFtjbl07DQoJCQl0LmV4dGVuZChuc1tjbl0ucHJvdG90eXBlLCBwKTsNCg0KCQkJLy8gRXh0ZW5kDQoJCQlpZiAoc1s1XSkgew0KCQkJCXNwID0gdC5yZXNvbHZlKHNbNV0pLnByb3RvdHlwZTsNCgkJCQlzY24gPSBzWzVdLm1hdGNoKC9cLihcdyspJC9pKVsxXTsgLy8gQ2xhc3MgbmFtZQ0KDQoJCQkJLy8gRXh0ZW5kIGNvbnN0cnVjdG9yDQoJCQkJYyA9IG5zW2NuXTsNCgkJCQlpZiAoZGUpIHsNCgkJCQkJLy8gQWRkIHBhc3N0aHJvdWdoIGNvbnN0cnVjdG9yDQoJCQkJCW5zW2NuXSA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJcmV0dXJuIHNwW3Njbl0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCgkJCQkJfTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBBZGQgaW5oZXJpdCBjb25zdHJ1Y3Rvcg0KCQkJCQluc1tjbl0gPSBmdW5jdGlvbigpIHsNCgkJCQkJCXRoaXMucGFyZW50ID0gc3Bbc2NuXTsNCgkJCQkJCXJldHVybiBjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQoJCQkJCX07DQoJCQkJfQ0KCQkJCW5zW2NuXS5wcm90b3R5cGVbY25dID0gbnNbY25dOw0KDQoJCQkJLy8gQWRkIHN1cGVyIG1ldGhvZHMNCgkJCQl0LmVhY2goc3AsIGZ1bmN0aW9uKGYsIG4pIHsNCgkJCQkJbnNbY25dLnByb3RvdHlwZVtuXSA9IHNwW25dOw0KCQkJCX0pOw0KDQoJCQkJLy8gQWRkIG92ZXJyaWRkZW4gbWV0aG9kcw0KCQkJCXQuZWFjaChwLCBmdW5jdGlvbihmLCBuKSB7DQoJCQkJCS8vIEV4dGVuZCBtZXRob2RzIGlmIG5lZWRlZA0KCQkJCQlpZiAoc3Bbbl0pIHsNCgkJCQkJCW5zW2NuXS5wcm90b3R5cGVbbl0gPSBmdW5jdGlvbigpIHsNCgkJCQkJCQl0aGlzLnBhcmVudCA9IHNwW25dOw0KCQkJCQkJCXJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQoJCQkJCQl9Ow0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJaWYgKG4gIT0gY24pDQoJCQkJCQkJbnNbY25dLnByb3RvdHlwZVtuXSA9IGY7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gQWRkIHN0YXRpYyBtZXRob2RzDQoJCQl0LmVhY2gocFsnc3RhdGljJ10sIGZ1bmN0aW9uKGYsIG4pIHsNCgkJCQluc1tjbl1bbl0gPSBmOw0KCQkJfSk7DQoNCgkJCWlmICh0aGlzLm9uQ3JlYXRlKQ0KCQkJCXRoaXMub25DcmVhdGUoc1syXSwgc1szXSwgbnNbY25dLnByb3RvdHlwZSk7DQoJCX0sDQoNCgkJd2FsayA6IGZ1bmN0aW9uKG8sIGYsIG4sIHMpIHsNCgkJCXMgPSBzIHx8IHRoaXM7DQoNCgkJCWlmIChvKSB7DQoJCQkJaWYgKG4pDQoJCQkJCW8gPSBvW25dOw0KDQoJCQkJdGlueW1jZS5lYWNoKG8sIGZ1bmN0aW9uKG8sIGkpIHsNCgkJCQkJaWYgKGYuY2FsbChzLCBvLCBpLCBuKSA9PT0gZmFsc2UpDQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCQkJdGlueW1jZS53YWxrKG8sIGYsIG4sIHMpOw0KCQkJCX0pOw0KCQkJfQ0KCQl9LA0KDQoJCWNyZWF0ZU5TIDogZnVuY3Rpb24obiwgbykgew0KCQkJdmFyIGksIHY7DQoNCgkJCW8gPSBvIHx8IHdpbjsNCg0KCQkJbiA9IG4uc3BsaXQoJy4nKTsNCgkJCWZvciAoaT0wOyBpPG4ubGVuZ3RoOyBpKyspIHsNCgkJCQl2ID0gbltpXTsNCg0KCQkJCWlmICghb1t2XSkNCgkJCQkJb1t2XSA9IHt9Ow0KDQoJCQkJbyA9IG9bdl07DQoJCQl9DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCXJlc29sdmUgOiBmdW5jdGlvbihuLCBvKSB7DQoJCQl2YXIgaSwgbDsNCg0KCQkJbyA9IG8gfHwgd2luOw0KDQoJCQluID0gbi5zcGxpdCgnLicpOw0KCQkJZm9yIChpID0gMCwgbCA9IG4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQoJCQkJbyA9IG9bbltpXV07DQoNCgkJCQlpZiAoIW8pDQoJCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQlyZXR1cm4gbzsNCgkJfSwNCg0KCQlhZGRVbmxvYWQgOiBmdW5jdGlvbihmLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWYgPSB7ZnVuYyA6IGYsIHNjb3BlIDogcyB8fCB0aGlzfTsNCg0KCQkJaWYgKCF0LnVubG9hZHMpIHsNCgkJCQlmdW5jdGlvbiB1bmxvYWQoKSB7DQoJCQkJCXZhciBsaSA9IHQudW5sb2FkcywgbywgbjsNCg0KCQkJCQlpZiAobGkpIHsNCgkJCQkJCS8vIENhbGwgdW5sb2FkIGhhbmRsZXJzDQoJCQkJCQlmb3IgKG4gaW4gbGkpIHsNCgkJCQkJCQlvID0gbGlbbl07DQoNCgkJCQkJCQlpZiAobyAmJiBvLmZ1bmMpDQoJCQkJCQkJCW8uZnVuYy5jYWxsKG8uc2NvcGUsIDEpOyAvLyBTZW5kIGluIG9uZSBhcmcgdG8gZGlzdGluY3QgdW5sb2FkIGFuZCB1c2VyIGRlc3Ryb3kNCgkJCQkJCX0NCg0KCQkJCQkJLy8gRGV0YWNoIHVubG9hZCBmdW5jdGlvbg0KCQkJCQkJaWYgKHdpbi5kZXRhY2hFdmVudCkgew0KCQkJCQkJCXdpbi5kZXRhY2hFdmVudCgnb25iZWZvcmV1bmxvYWQnLCBmYWtlVW5sb2FkKTsNCgkJCQkJCQl3aW4uZGV0YWNoRXZlbnQoJ29udW5sb2FkJywgdW5sb2FkKTsNCgkJCQkJCX0gZWxzZSBpZiAod2luLnJlbW92ZUV2ZW50TGlzdGVuZXIpDQoJCQkJCQkJd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3VubG9hZCcsIHVubG9hZCwgZmFsc2UpOw0KDQoJCQkJCQkvLyBEZXN0cm95IHJlZmVyZW5jZXMNCgkJCQkJCXQudW5sb2FkcyA9IG8gPSBsaSA9IHcgPSB1bmxvYWQgPSAwOw0KDQoJCQkJCQkvLyBSdW4gZ2FyYmFyZ2UgY29sbGVjdG9yIG9uIElFDQoJCQkJCQlpZiAod2luLkNvbGxlY3RHYXJiYWdlKQ0KCQkJCQkJCUNvbGxlY3RHYXJiYWdlKCk7DQoJCQkJCX0NCgkJCQl9Ow0KDQoJCQkJZnVuY3Rpb24gZmFrZVVubG9hZCgpIHsNCgkJCQkJdmFyIGQgPSBkb2N1bWVudDsNCg0KCQkJCQkvLyBJcyB0aGVyZSB0aGluZ3Mgc3RpbGwgbG9hZGluZywgdGhlbiBkbyBzb21lIG1hZ2ljDQoJCQkJCWlmIChkLnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgew0KCQkJCQkJZnVuY3Rpb24gc3RvcCgpIHsNCgkJCQkJCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrDQoJCQkJCQkJZC5kZXRhY2hFdmVudCgnb25zdG9wJywgc3RvcCk7DQoNCgkJCQkJCQkvLyBDYWxsIHVubG9hZCBoYW5kbGVyDQoJCQkJCQkJaWYgKHVubG9hZCkNCgkJCQkJCQkJdW5sb2FkKCk7DQoNCgkJCQkJCQlkID0gMDsNCgkJCQkJCX07DQoNCgkJCQkJCS8vIEZpcmUgdW5sb2FkIHdoZW4gdGhlIGN1cnJlbnRseSBsb2FkaW5nIHBhZ2UgaXMgc3RvcHBlZA0KCQkJCQkJaWYgKGQpDQoJCQkJCQkJZC5hdHRhY2hFdmVudCgnb25zdG9wJywgc3RvcCk7DQoNCgkJCQkJCS8vIFJlbW92ZSBvbnN0b3AgbGlzdGVuZXIgYWZ0ZXIgYSB3aGlsZSB0byBwcmV2ZW50IHRoZSB1bmxvYWQgZnVuY3Rpb24NCgkJCQkJCS8vIHRvIGV4ZWN1dGUgaWYgdGhlIHVzZXIgcHJlc3NlcyBjYW5jZWwgaW4gYW4gb25iZWZvcmV1bmxvYWQNCgkJCQkJCS8vIGNvbmZpcm0gZGlhbG9nIGFuZCB0aGVuIHByZXNzZXMgdGhlIGJyb3dzZXIgc3RvcCBidXR0b24NCgkJCQkJCXdpbi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KCQkJCQkJCWlmIChkKQ0KCQkJCQkJCQlkLmRldGFjaEV2ZW50KCdvbnN0b3AnLCBzdG9wKTsNCgkJCQkJCX0sIDApOw0KCQkJCQl9DQoJCQkJfTsNCg0KCQkJCS8vIEF0dGFjaCB1bmxvYWQgaGFuZGxlcg0KCQkJCWlmICh3aW4uYXR0YWNoRXZlbnQpIHsNCgkJCQkJd2luLmF0dGFjaEV2ZW50KCdvbnVubG9hZCcsIHVubG9hZCk7DQoJCQkJCXdpbi5hdHRhY2hFdmVudCgnb25iZWZvcmV1bmxvYWQnLCBmYWtlVW5sb2FkKTsNCgkJCQl9IGVsc2UgaWYgKHdpbi5hZGRFdmVudExpc3RlbmVyKQ0KCQkJCQl3aW4uYWRkRXZlbnRMaXN0ZW5lcigndW5sb2FkJywgdW5sb2FkLCBmYWxzZSk7DQoNCgkJCQkvLyBTZXR1cCBpbml0aWFsIHVubG9hZCBoYW5kbGVyIGFycmF5DQoJCQkJdC51bmxvYWRzID0gW2ZdOw0KCQkJfSBlbHNlDQoJCQkJdC51bmxvYWRzLnB1c2goZik7DQoNCgkJCXJldHVybiBmOw0KCQl9LA0KDQoJCXJlbW92ZVVubG9hZCA6IGZ1bmN0aW9uKGYpIHsNCgkJCXZhciB1ID0gdGhpcy51bmxvYWRzLCByID0gbnVsbDsNCg0KCQkJdGlueW1jZS5lYWNoKHUsIGZ1bmN0aW9uKG8sIGkpIHsNCgkJCQlpZiAobyAmJiBvLmZ1bmMgPT0gZikgew0KCQkJCQl1LnNwbGljZShpLCAxKTsNCgkJCQkJciA9IGY7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJcmV0dXJuIHI7DQoJCX0sDQoNCgkJZXhwbG9kZSA6IGZ1bmN0aW9uKHMsIGQpIHsNCgkJCXJldHVybiBzID8gdGlueW1jZS5tYXAocy5zcGxpdChkIHx8ICcsJyksIHRpbnltY2UudHJpbSkgOiBzOw0KCQl9LA0KDQoJCV9hZGRWZXIgOiBmdW5jdGlvbih1KSB7DQoJCQl2YXIgdjsNCg0KCQkJaWYgKCF0aGlzLnF1ZXJ5KQ0KCQkJCXJldHVybiB1Ow0KDQoJCQl2ID0gKHUuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnKSArIHRoaXMucXVlcnk7DQoNCgkJCWlmICh1LmluZGV4T2YoJyMnKSA9PSAtMSkNCgkJCQlyZXR1cm4gdSArIHY7DQoNCgkJCXJldHVybiB1LnJlcGxhY2UoJyMnLCB2ICsgJyMnKTsNCgkJfSwNCg0KCQkvLyBGaXggZnVuY3Rpb24gZm9yIElFIDkgd2hlcmUgcmVnZXhwcyBpc24ndCB3b3JraW5nIGNvcnJlY3RseQ0KCQkvLyBUb2RvOiByZW1vdmUgbWUgb25jZSBNUyBmaXhlcyB0aGUgYnVnDQoJCV9yZXBsYWNlIDogZnVuY3Rpb24oZmluZCwgcmVwbGFjZSwgc3RyKSB7DQoJCQkvLyBPbiBJRTkgd2UgaGF2ZSB0byBmYWtlICR4IHJlcGxhY2VtZW50DQoJCQlpZiAoaXNSZWdFeHBCcm9rZW4pIHsNCgkJCQlyZXR1cm4gc3RyLnJlcGxhY2UoZmluZCwgZnVuY3Rpb24oKSB7DQoJCQkJCXZhciB2YWwgPSByZXBsYWNlLCBhcmdzID0gYXJndW1lbnRzLCBpOw0KDQoJCQkJCWZvciAoaSA9IDA7IGkgPCBhcmdzLmxlbmd0aCAtIDI7IGkrKykgew0KCQkJCQkJaWYgKGFyZ3NbaV0gPT09IHVuZGVmaW5lZCkgew0KCQkJCQkJCXZhbCA9IHZhbC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcJCcgKyBpLCAnZycpLCAnJyk7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCXZhbCA9IHZhbC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcJCcgKyBpLCAnZycpLCBhcmdzW2ldKTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCXJldHVybiB2YWw7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiBzdHIucmVwbGFjZShmaW5kLCByZXBsYWNlKTsNCgkJfQ0KDQoJCX07DQoNCgkvLyBJbml0aWFsaXplIHRoZSBBUEkNCgl0aW55bWNlLl9pbml0KCk7DQoNCgkvLyBFeHBvc2UgdGlueW1jZSBuYW1lc3BhY2UgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UgKHdpbmRvdykNCgl3aW4udGlueW1jZSA9IHdpbi50aW55TUNFID0gdGlueW1jZTsNCn0pKHdpbmRvdyk7DQoNCg0KKGZ1bmN0aW9uKCkgew0KCWlmICghd2luZG93LlByb3RvdHlwZSkNCgkJcmV0dXJuIGFsZXJ0KCJMb2FkIHByb3RvdHlwZSBmaXJzdCEiKTsNCg0KCS8vIFBhdGNoIGluIGNvcmUgTlMgZnVuY3Rpb25zDQoJdGlueW1jZS5leHRlbmQodGlueW1jZSwgew0KCQl0cmltIDogZnVuY3Rpb24ocykge3JldHVybiBzID8gcy5zdHJpcCgpIDogJyc7fSwNCgkJaW5BcnJheSA6IGZ1bmN0aW9uKGEsIHYpIHtyZXR1cm4gYSAmJiBhLmluZGV4T2YgPyBhLmluZGV4T2YodikgOiAtMTt9DQoJfSk7DQoNCgkvLyBQYXRjaCBpbiBmdW5jdGlvbnMgaW4gdmFyaW91cyBjbGFzZXMNCgkvLyBBZGQgYSAiI2lmbmRlZmpxdWVyeSIgc3RhdGVtZW50IGFyb3VuZCBlYWNoIGNvcmUgQVBJIGZ1bmN0aW9uIHlvdSBhZGQgYmVsb3cNCgl2YXIgcGF0Y2hlcyA9IHsNCgkJJ3RpbnltY2UudXRpbC5KU09OJyA6IHsNCgkJCS8qc2VyaWFsaXplIDogZnVuY3Rpb24obykgew0KCQkJCXJldHVybiBvLnRvSlNPTigpOw0KCQkJfSovDQoJCX0sDQoJfTsNCg0KCS8vIFBhdGNoIGZ1bmN0aW9ucyBhZnRlciBhIGNsYXNzIGlzIGNyZWF0ZWQNCgl0aW55bWNlLm9uQ3JlYXRlID0gZnVuY3Rpb24odHksIGMsIHApIHsNCgkJdGlueW1jZS5leHRlbmQocCwgcGF0Y2hlc1tjXSk7DQoJfTsNCn0pKCk7DQoNCg0KdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudXRpbC5EaXNwYXRjaGVyJywgew0KCXNjb3BlIDogbnVsbCwNCglsaXN0ZW5lcnMgOiBudWxsLA0KDQoJRGlzcGF0Y2hlciA6IGZ1bmN0aW9uKHMpIHsNCgkJdGhpcy5zY29wZSA9IHMgfHwgdGhpczsNCgkJdGhpcy5saXN0ZW5lcnMgPSBbXTsNCgl9LA0KDQoJYWRkIDogZnVuY3Rpb24oY2IsIHMpIHsNCgkJdGhpcy5saXN0ZW5lcnMucHVzaCh7Y2IgOiBjYiwgc2NvcGUgOiBzIHx8IHRoaXMuc2NvcGV9KTsNCg0KCQlyZXR1cm4gY2I7DQoJfSwNCg0KCWFkZFRvVG9wIDogZnVuY3Rpb24oY2IsIHMpIHsNCgkJdGhpcy5saXN0ZW5lcnMudW5zaGlmdCh7Y2IgOiBjYiwgc2NvcGUgOiBzIHx8IHRoaXMuc2NvcGV9KTsNCg0KCQlyZXR1cm4gY2I7DQoJfSwNCg0KCXJlbW92ZSA6IGZ1bmN0aW9uKGNiKSB7DQoJCXZhciBsID0gdGhpcy5saXN0ZW5lcnMsIG8gPSBudWxsOw0KDQoJCXRpbnltY2UuZWFjaChsLCBmdW5jdGlvbihjLCBpKSB7DQoJCQlpZiAoY2IgPT0gYy5jYikgew0KCQkJCW8gPSBjYjsNCgkJCQlsLnNwbGljZShpLCAxKTsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCX0pOw0KDQoJCXJldHVybiBvOw0KCX0sDQoNCglkaXNwYXRjaCA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgcywgYSA9IGFyZ3VtZW50cywgaSwgbGkgPSB0aGlzLmxpc3RlbmVycywgYzsNCg0KCQkvLyBOZWVkcyB0byBiZSBhIHJlYWwgbG9vcCBzaW5jZSB0aGUgbGlzdGVuZXIgY291bnQgbWlnaHQgY2hhbmdlIHdoaWxlIGxvb3BpbmcNCgkJLy8gQW5kIHRoaXMgaXMgYWxzbyBtb3JlIGVmZmljaWVudA0KCQlmb3IgKGkgPSAwOyBpPGxpLmxlbmd0aDsgaSsrKSB7DQoJCQljID0gbGlbaV07DQoJCQlzID0gYy5jYi5hcHBseShjLnNjb3BlLCBhKTsNCg0KCQkJaWYgKHMgPT09IGZhbHNlKQ0KCQkJCWJyZWFrOw0KCQl9DQoNCgkJcmV0dXJuIHM7DQoJfQ0KDQoJfSk7DQoNCihmdW5jdGlvbigpIHsNCgl2YXIgZWFjaCA9IHRpbnltY2UuZWFjaDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnV0aWwuVVJJJywgew0KCQlVUkkgOiBmdW5jdGlvbih1LCBzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG8sIGEsIGI7DQoNCgkJCS8vIFRyaW0gd2hpdGVzcGFjZQ0KCQkJdSA9IHRpbnltY2UudHJpbSh1KTsNCg0KCQkJLy8gRGVmYXVsdCBzZXR0aW5ncw0KCQkJcyA9IHQuc2V0dGluZ3MgPSBzIHx8IHt9Ow0KDQoJCQkvLyBTdHJhbmdlIGFwcCBwcm90b2NvbCBvciBsb2NhbCBhbmNob3INCgkJCWlmICgvXihtYWlsdG98dGVsfG5ld3N8amF2YXNjcmlwdHxhYm91dHxkYXRhKTovaS50ZXN0KHUpIHx8IC9eXHMqIy8udGVzdCh1KSkgew0KCQkJCXQuc291cmNlID0gdTsNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCS8vIEFic29sdXRlIHBhdGggd2l0aCBubyBob3N0LCBmYWtlIGhvc3QgYW5kIHByb3RvY29sDQoJCQlpZiAodS5pbmRleE9mKCcvJykgPT09IDAgJiYgdS5pbmRleE9mKCcvLycpICE9PSAwKQ0KCQkJCXUgPSAocy5iYXNlX3VyaSA/IHMuYmFzZV91cmkucHJvdG9jb2wgfHwgJ2h0dHAnIDogJ2h0dHAnKSArICc6Ly9tY2VfaG9zdCcgKyB1Ow0KDQoJCQkvLyBSZWxhdGl2ZSBwYXRoIGh0dHA6Ly8gb3IgcHJvdG9jb2wgcmVsYXRpdmUgLy9wYXRoDQoJCQlpZiAoIS9eXHcqOj9cL1wvLy50ZXN0KHUpKQ0KCQkJCXUgPSAocy5iYXNlX3VyaS5wcm90b2NvbCB8fCAnaHR0cCcpICsgJzovL21jZV9ob3N0JyArIHQudG9BYnNQYXRoKHMuYmFzZV91cmkucGF0aCwgdSk7DQoNCgkJCS8vIFBhcnNlIFVSTCAoQ3JlZGl0cyBnb2VzIHRvIFN0ZWF2ZSwgaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL3BhcnNldXJpKQ0KCQkJdSA9IHUucmVwbGFjZSgvQEAvZywgJyhtY2VfYXQpJyk7IC8vIFpvcGUgMyB3b3JrYXJvdW5kLCB0aGV5IHVzZSBAQHNvbWV0aGluZw0KCQkJdSA9IC9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopOj8oW146QF0qKSk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyh1KTsNCgkJCWVhY2goWyJzb3VyY2UiLCJwcm90b2NvbCIsImF1dGhvcml0eSIsInVzZXJJbmZvIiwidXNlciIsInBhc3N3b3JkIiwiaG9zdCIsInBvcnQiLCJyZWxhdGl2ZSIsInBhdGgiLCJkaXJlY3RvcnkiLCJmaWxlIiwicXVlcnkiLCJhbmNob3IiXSwgZnVuY3Rpb24odiwgaSkgew0KCQkJCXZhciBzID0gdVtpXTsNCg0KCQkJCS8vIFpvcGUgMyB3b3JrYXJvdW5kLCB0aGV5IHVzZSBAQHNvbWV0aGluZw0KCQkJCWlmIChzKQ0KCQkJCQlzID0gcy5yZXBsYWNlKC9cKG1jZV9hdFwpL2csICdAQCcpOw0KDQoJCQkJdFt2XSA9IHM7DQoJCQl9KTsNCg0KCQkJaWYgKGIgPSBzLmJhc2VfdXJpKSB7DQoJCQkJaWYgKCF0LnByb3RvY29sKQ0KCQkJCQl0LnByb3RvY29sID0gYi5wcm90b2NvbDsNCg0KCQkJCWlmICghdC51c2VySW5mbykNCgkJCQkJdC51c2VySW5mbyA9IGIudXNlckluZm87DQoNCgkJCQlpZiAoIXQucG9ydCAmJiB0Lmhvc3QgPT0gJ21jZV9ob3N0JykNCgkJCQkJdC5wb3J0ID0gYi5wb3J0Ow0KDQoJCQkJaWYgKCF0Lmhvc3QgfHwgdC5ob3N0ID09ICdtY2VfaG9zdCcpDQoJCQkJCXQuaG9zdCA9IGIuaG9zdDsNCg0KCQkJCXQuc291cmNlID0gJyc7DQoJCQl9DQoNCgkJCS8vdC5wYXRoID0gdC5wYXRoIHx8ICcvJzsNCgkJfSwNCg0KCQlzZXRQYXRoIDogZnVuY3Rpb24ocCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlwID0gL14oLio/KVwvPyhcdyspPyQvLmV4ZWMocCk7DQoNCgkJCS8vIFVwZGF0ZSBwYXRoIHBhcnRzDQoJCQl0LnBhdGggPSBwWzBdOw0KCQkJdC5kaXJlY3RvcnkgPSBwWzFdOw0KCQkJdC5maWxlID0gcFsyXTsNCg0KCQkJLy8gUmVidWlsZCBzb3VyY2UNCgkJCXQuc291cmNlID0gJyc7DQoJCQl0LmdldFVSSSgpOw0KCQl9LA0KDQoJCXRvUmVsYXRpdmUgOiBmdW5jdGlvbih1KSB7DQoJCQl2YXIgdCA9IHRoaXMsIG87DQoNCgkJCWlmICh1ID09PSAiLi8iKQ0KCQkJCXJldHVybiB1Ow0KDQoJCQl1ID0gbmV3IHRpbnltY2UudXRpbC5VUkkodSwge2Jhc2VfdXJpIDogdH0pOw0KDQoJCQkvLyBOb3Qgb24gc2FtZSBkb21haW4vcG9ydCBvciBwcm90b2NvbA0KCQkJaWYgKCh1Lmhvc3QgIT0gJ21jZV9ob3N0JyAmJiB0Lmhvc3QgIT0gdS5ob3N0ICYmIHUuaG9zdCkgfHwgdC5wb3J0ICE9IHUucG9ydCB8fCB0LnByb3RvY29sICE9IHUucHJvdG9jb2wpDQoJCQkJcmV0dXJuIHUuZ2V0VVJJKCk7DQoNCgkJCW8gPSB0LnRvUmVsUGF0aCh0LnBhdGgsIHUucGF0aCk7DQoNCgkJCS8vIEFkZCBxdWVyeQ0KCQkJaWYgKHUucXVlcnkpDQoJCQkJbyArPSAnPycgKyB1LnF1ZXJ5Ow0KDQoJCQkvLyBBZGQgYW5jaG9yDQoJCQlpZiAodS5hbmNob3IpDQoJCQkJbyArPSAnIycgKyB1LmFuY2hvcjsNCg0KCQkJcmV0dXJuIG87DQoJCX0sDQoJDQoJCXRvQWJzb2x1dGUgOiBmdW5jdGlvbih1LCBuaCkgew0KCQkJdmFyIHUgPSBuZXcgdGlueW1jZS51dGlsLlVSSSh1LCB7YmFzZV91cmkgOiB0aGlzfSk7DQoNCgkJCXJldHVybiB1LmdldFVSSSh0aGlzLmhvc3QgPT0gdS5ob3N0ICYmIHRoaXMucHJvdG9jb2wgPT0gdS5wcm90b2NvbCA/IG5oIDogMCk7DQoJCX0sDQoNCgkJdG9SZWxQYXRoIDogZnVuY3Rpb24oYmFzZSwgcGF0aCkgew0KCQkJdmFyIGl0ZW1zLCBicCA9IDAsIG91dCA9ICcnLCBpLCBsOw0KDQoJCQkvLyBTcGxpdCB0aGUgcGF0aHMNCgkJCWJhc2UgPSBiYXNlLnN1YnN0cmluZygwLCBiYXNlLmxhc3RJbmRleE9mKCcvJykpOw0KCQkJYmFzZSA9IGJhc2Uuc3BsaXQoJy8nKTsNCgkJCWl0ZW1zID0gcGF0aC5zcGxpdCgnLycpOw0KDQoJCQlpZiAoYmFzZS5sZW5ndGggPj0gaXRlbXMubGVuZ3RoKSB7DQoJCQkJZm9yIChpID0gMCwgbCA9IGJhc2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQoJCQkJCWlmIChpID49IGl0ZW1zLmxlbmd0aCB8fCBiYXNlW2ldICE9IGl0ZW1zW2ldKSB7DQoJCQkJCQlicCA9IGkgKyAxOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCWlmIChiYXNlLmxlbmd0aCA8IGl0ZW1zLmxlbmd0aCkgew0KCQkJCWZvciAoaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCgkJCQkJaWYgKGkgPj0gYmFzZS5sZW5ndGggfHwgYmFzZVtpXSAhPSBpdGVtc1tpXSkgew0KCQkJCQkJYnAgPSBpICsgMTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoYnAgPT0gMSkNCgkJCQlyZXR1cm4gcGF0aDsNCg0KCQkJZm9yIChpID0gMCwgbCA9IGJhc2UubGVuZ3RoIC0gKGJwIC0gMSk7IGkgPCBsOyBpKyspDQoJCQkJb3V0ICs9ICIuLi8iOw0KDQoJCQlmb3IgKGkgPSBicCAtIDEsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCgkJCQlpZiAoaSAhPSBicCAtIDEpDQoJCQkJCW91dCArPSAiLyIgKyBpdGVtc1tpXTsNCgkJCQllbHNlDQoJCQkJCW91dCArPSBpdGVtc1tpXTsNCgkJCX0NCg0KCQkJcmV0dXJuIG91dDsNCgkJfSwNCg0KCQl0b0Fic1BhdGggOiBmdW5jdGlvbihiYXNlLCBwYXRoKSB7DQoJCQl2YXIgaSwgbmIgPSAwLCBvID0gW10sIHRyLCBvdXRQYXRoOw0KDQoJCQkvLyBTcGxpdCBwYXRocw0KCQkJdHIgPSAvXC8kLy50ZXN0KHBhdGgpID8gJy8nIDogJyc7DQoJCQliYXNlID0gYmFzZS5zcGxpdCgnLycpOw0KCQkJcGF0aCA9IHBhdGguc3BsaXQoJy8nKTsNCg0KCQkJLy8gUmVtb3ZlIGVtcHR5IGNodW5rcw0KCQkJZWFjaChiYXNlLCBmdW5jdGlvbihrKSB7DQoJCQkJaWYgKGspDQoJCQkJCW8ucHVzaChrKTsNCgkJCX0pOw0KDQoJCQliYXNlID0gbzsNCg0KCQkJLy8gTWVyZ2UgcmVsVVJMUGFydHMgY2h1bmtzDQoJCQlmb3IgKGkgPSBwYXRoLmxlbmd0aCAtIDEsIG8gPSBbXTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkvLyBJZ25vcmUgZW1wdHkgb3IgLg0KCQkJCWlmIChwYXRoW2ldLmxlbmd0aCA9PSAwIHx8IHBhdGhbaV0gPT0gIi4iKQ0KCQkJCQljb250aW51ZTsNCg0KCQkJCS8vIElzIHBhcmVudA0KCQkJCWlmIChwYXRoW2ldID09ICcuLicpIHsNCgkJCQkJbmIrKzsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KDQoJCQkJLy8gTW92ZSB1cA0KCQkJCWlmIChuYiA+IDApIHsNCgkJCQkJbmItLTsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KDQoJCQkJby5wdXNoKHBhdGhbaV0pOw0KCQkJfQ0KDQoJCQlpID0gYmFzZS5sZW5ndGggLSBuYjsNCg0KCQkJLy8gSWYgL2EvYi9jIG9yIC8NCgkJCWlmIChpIDw9IDApDQoJCQkJb3V0UGF0aCA9IG8ucmV2ZXJzZSgpLmpvaW4oJy8nKTsNCgkJCWVsc2UNCgkJCQlvdXRQYXRoID0gYmFzZS5zbGljZSgwLCBpKS5qb2luKCcvJykgKyAnLycgKyBvLnJldmVyc2UoKS5qb2luKCcvJyk7DQoNCgkJCS8vIEFkZCBmcm9udCAvIGlmIGl0J3MgbmVlZGVkDQoJCQlpZiAob3V0UGF0aC5pbmRleE9mKCcvJykgIT09IDApDQoJCQkJb3V0UGF0aCA9ICcvJyArIG91dFBhdGg7DQoNCgkJCS8vIEFkZCB0cmFsaW5nIC8gaWYgaXQncyBuZWVkZWQNCgkJCWlmICh0ciAmJiBvdXRQYXRoLmxhc3RJbmRleE9mKCcvJykgIT09IG91dFBhdGgubGVuZ3RoIC0gMSkNCgkJCQlvdXRQYXRoICs9IHRyOw0KDQoJCQlyZXR1cm4gb3V0UGF0aDsNCgkJfSwNCg0KCQlnZXRVUkkgOiBmdW5jdGlvbihuaCkgew0KCQkJdmFyIHMsIHQgPSB0aGlzOw0KDQoJCQkvLyBSZWJ1aWxkIHNvdXJjZQ0KCQkJaWYgKCF0LnNvdXJjZSB8fCBuaCkgew0KCQkJCXMgPSAnJzsNCg0KCQkJCWlmICghbmgpIHsNCgkJCQkJaWYgKHQucHJvdG9jb2wpDQoJCQkJCQlzICs9IHQucHJvdG9jb2wgKyAnOi8vJzsNCg0KCQkJCQlpZiAodC51c2VySW5mbykNCgkJCQkJCXMgKz0gdC51c2VySW5mbyArICdAJzsNCg0KCQkJCQlpZiAodC5ob3N0KQ0KCQkJCQkJcyArPSB0Lmhvc3Q7DQoNCgkJCQkJaWYgKHQucG9ydCkNCgkJCQkJCXMgKz0gJzonICsgdC5wb3J0Ow0KCQkJCX0NCg0KCQkJCWlmICh0LnBhdGgpDQoJCQkJCXMgKz0gdC5wYXRoOw0KDQoJCQkJaWYgKHQucXVlcnkpDQoJCQkJCXMgKz0gJz8nICsgdC5xdWVyeTsNCg0KCQkJCWlmICh0LmFuY2hvcikNCgkJCQkJcyArPSAnIycgKyB0LmFuY2hvcjsNCg0KCQkJCXQuc291cmNlID0gczsNCgkJCX0NCg0KCQkJcmV0dXJuIHQuc291cmNlOw0KCQl9DQoJfSk7DQp9KSgpOw0KDQooZnVuY3Rpb24oKSB7DQoJdmFyIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgl0aW55bWNlLmNyZWF0ZSgnc3RhdGljIHRpbnltY2UudXRpbC5Db29raWUnLCB7DQoJCWdldEhhc2ggOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgdiA9IHRoaXMuZ2V0KG4pLCBoOw0KDQoJCQlpZiAodikgew0KCQkJCWVhY2godi5zcGxpdCgnJicpLCBmdW5jdGlvbih2KSB7DQoJCQkJCXYgPSB2LnNwbGl0KCc9Jyk7DQoJCQkJCWggPSBoIHx8IHt9Ow0KCQkJCQloW3VuZXNjYXBlKHZbMF0pXSA9IHVuZXNjYXBlKHZbMV0pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlyZXR1cm4gaDsNCgkJfSwNCg0KCQlzZXRIYXNoIDogZnVuY3Rpb24obiwgdiwgZSwgcCwgZCwgcykgew0KCQkJdmFyIG8gPSAnJzsNCg0KCQkJZWFjaCh2LCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJbyArPSAoIW8gPyAnJyA6ICcmJykgKyBlc2NhcGUoaykgKyAnPScgKyBlc2NhcGUodik7DQoJCQl9KTsNCg0KCQkJdGhpcy5zZXQobiwgbywgZSwgcCwgZCwgcyk7DQoJCX0sDQoNCgkJZ2V0IDogZnVuY3Rpb24obikgew0KCQkJdmFyIGMgPSBkb2N1bWVudC5jb29raWUsIGUsIHAgPSBuICsgIj0iLCBiOw0KDQoJCQkvLyBTdHJpY3QgbW9kZQ0KCQkJaWYgKCFjKQ0KCQkJCXJldHVybjsNCg0KCQkJYiA9IGMuaW5kZXhPZigiOyAiICsgcCk7DQoNCgkJCWlmIChiID09IC0xKSB7DQoJCQkJYiA9IGMuaW5kZXhPZihwKTsNCg0KCQkJCWlmIChiICE9IDApDQoJCQkJCXJldHVybiBudWxsOw0KCQkJfSBlbHNlDQoJCQkJYiArPSAyOw0KDQoJCQllID0gYy5pbmRleE9mKCI7IiwgYik7DQoNCgkJCWlmIChlID09IC0xKQ0KCQkJCWUgPSBjLmxlbmd0aDsNCg0KCQkJcmV0dXJuIHVuZXNjYXBlKGMuc3Vic3RyaW5nKGIgKyBwLmxlbmd0aCwgZSkpOw0KCQl9LA0KDQoJCXNldCA6IGZ1bmN0aW9uKG4sIHYsIGUsIHAsIGQsIHMpIHsNCgkJCWRvY3VtZW50LmNvb2tpZSA9IG4gKyAiPSIgKyBlc2NhcGUodikgKw0KCQkJCSgoZSkgPyAiOyBleHBpcmVzPSIgKyBlLnRvR01UU3RyaW5nKCkgOiAiIikgKw0KCQkJCSgocCkgPyAiOyBwYXRoPSIgKyBlc2NhcGUocCkgOiAiIikgKw0KCQkJCSgoZCkgPyAiOyBkb21haW49IiArIGQgOiAiIikgKw0KCQkJCSgocykgPyAiOyBzZWN1cmUiIDogIiIpOw0KCQl9LA0KDQoJCXJlbW92ZSA6IGZ1bmN0aW9uKG4sIHApIHsNCgkJCXZhciBkID0gbmV3IERhdGUoKTsNCg0KCQkJZC5zZXRUaW1lKGQuZ2V0VGltZSgpIC0gMTAwMCk7DQoNCgkJCXRoaXMuc2V0KG4sICcnLCBkLCBwLCBkKTsNCgkJfQ0KCX0pOw0KfSkoKTsNCg0KdGlueW1jZS5jcmVhdGUoJ3N0YXRpYyB0aW55bWNlLnV0aWwuSlNPTicsIHsNCglzZXJpYWxpemUgOiBmdW5jdGlvbihvKSB7DQoJCXZhciBpLCB2LCBzID0gdGlueW1jZS51dGlsLkpTT04uc2VyaWFsaXplLCB0Ow0KDQoJCWlmIChvID09IG51bGwpDQoJCQlyZXR1cm4gJ251bGwnOw0KDQoJCXQgPSB0eXBlb2YgbzsNCg0KCQlpZiAodCA9PSAnc3RyaW5nJykgew0KCQkJdiA9ICdcYmJcdHRcbm5cZmZccnJcIiJcJ1wnXFxcXCc7DQoNCgkJCXJldHVybiAnIicgKyBvLnJlcGxhY2UoLyhbXHUwMDgwLVx1RkZGRlx4MDAtXHgxZlwiXSkvZywgZnVuY3Rpb24oYSwgYikgew0KCQkJCWkgPSB2LmluZGV4T2YoYik7DQoNCgkJCQlpZiAoaSArIDEpDQoJCQkJCXJldHVybiAnXFwnICsgdi5jaGFyQXQoaSArIDEpOw0KDQoJCQkJYSA9IGIuY2hhckNvZGVBdCgpLnRvU3RyaW5nKDE2KTsNCg0KCQkJCXJldHVybiAnXFx1JyArICcwMDAwJy5zdWJzdHJpbmcoYS5sZW5ndGgpICsgYTsNCgkJCX0pICsgJyInOw0KCQl9DQoNCgkJaWYgKHQgPT0gJ29iamVjdCcpIHsNCgkJCWlmIChvLmhhc093blByb3BlcnR5ICYmIG8gaW5zdGFuY2VvZiBBcnJheSkgew0KCQkJCQlmb3IgKGk9MCwgdiA9ICdbJzsgaTxvLmxlbmd0aDsgaSsrKQ0KCQkJCQkJdiArPSAoaSA+IDAgPyAnLCcgOiAnJykgKyBzKG9baV0pOw0KDQoJCQkJCXJldHVybiB2ICsgJ10nOw0KCQkJCX0NCg0KCQkJCXYgPSAneyc7DQoNCgkJCQlmb3IgKGkgaW4gbykNCgkJCQkJdiArPSB0eXBlb2Ygb1tpXSAhPSAnZnVuY3Rpb24nID8gKHYubGVuZ3RoID4gMSA/ICcsIicgOiAnIicpICsgaSArICciOicgKyBzKG9baV0pIDogJyc7DQoNCgkJCQlyZXR1cm4gdiArICd9JzsNCgkJfQ0KDQoJCXJldHVybiAnJyArIG87DQoJfSwNCg0KCXBhcnNlIDogZnVuY3Rpb24ocykgew0KCQl0cnkgew0KCQkJcmV0dXJuIGV2YWwoJygnICsgcyArICcpJyk7DQoJCX0gY2F0Y2ggKGV4KSB7DQoJCQkvLyBJZ25vcmUNCgkJfQ0KCX0NCg0KCX0pOw0KDQp0aW55bWNlLmNyZWF0ZSgnc3RhdGljIHRpbnltY2UudXRpbC5YSFInLCB7DQoJc2VuZCA6IGZ1bmN0aW9uKG8pIHsNCgkJdmFyIHgsIHQsIHcgPSB3aW5kb3csIGMgPSAwOw0KDQoJCS8vIERlZmF1bHQgc2V0dGluZ3MNCgkJby5zY29wZSA9IG8uc2NvcGUgfHwgdGhpczsNCgkJby5zdWNjZXNzX3Njb3BlID0gby5zdWNjZXNzX3Njb3BlIHx8IG8uc2NvcGU7DQoJCW8uZXJyb3Jfc2NvcGUgPSBvLmVycm9yX3Njb3BlIHx8IG8uc2NvcGU7DQoJCW8uYXN5bmMgPSBvLmFzeW5jID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZTsNCgkJby5kYXRhID0gby5kYXRhIHx8ICcnOw0KDQoJCWZ1bmN0aW9uIGdldChzKSB7DQoJCQl4ID0gMDsNCg0KCQkJdHJ5IHsNCgkJCQl4ID0gbmV3IEFjdGl2ZVhPYmplY3Qocyk7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJfQ0KDQoJCQlyZXR1cm4geDsNCgkJfTsNCg0KCQl4ID0gdy5YTUxIdHRwUmVxdWVzdCA/IG5ldyBYTUxIdHRwUmVxdWVzdCgpIDogZ2V0KCdNaWNyb3NvZnQuWE1MSFRUUCcpIHx8IGdldCgnTXN4bWwyLlhNTEhUVFAnKTsNCg0KCQlpZiAoeCkgew0KCQkJaWYgKHgub3ZlcnJpZGVNaW1lVHlwZSkNCgkJCQl4Lm92ZXJyaWRlTWltZVR5cGUoby5jb250ZW50X3R5cGUpOw0KDQoJCQl4Lm9wZW4oby50eXBlIHx8IChvLmRhdGEgPyAnUE9TVCcgOiAnR0VUJyksIG8udXJsLCBvLmFzeW5jKTsNCg0KCQkJaWYgKG8uY29udGVudF90eXBlKQ0KCQkJCXguc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgby5jb250ZW50X3R5cGUpOw0KDQoJCQl4LnNldFJlcXVlc3RIZWFkZXIoJ1gtUmVxdWVzdGVkLVdpdGgnLCAnWE1MSHR0cFJlcXVlc3QnKTsNCg0KCQkJeC5zZW5kKG8uZGF0YSk7DQoNCgkJCWZ1bmN0aW9uIHJlYWR5KCkgew0KCQkJCWlmICghby5hc3luYyB8fCB4LnJlYWR5U3RhdGUgPT0gNCB8fCBjKysgPiAxMDAwMCkgew0KCQkJCQlpZiAoby5zdWNjZXNzICYmIGMgPCAxMDAwMCAmJiB4LnN0YXR1cyA9PSAyMDApDQoJCQkJCQlvLnN1Y2Nlc3MuY2FsbChvLnN1Y2Nlc3Nfc2NvcGUsICcnICsgeC5yZXNwb25zZVRleHQsIHgsIG8pOw0KCQkJCQllbHNlIGlmIChvLmVycm9yKQ0KCQkJCQkJby5lcnJvci5jYWxsKG8uZXJyb3Jfc2NvcGUsIGMgPiAxMDAwMCA/ICdUSU1FRF9PVVQnIDogJ0dFTkVSQUwnLCB4LCBvKTsNCg0KCQkJCQl4ID0gbnVsbDsNCgkJCQl9IGVsc2UNCgkJCQkJdy5zZXRUaW1lb3V0KHJlYWR5LCAxMCk7DQoJCQl9Ow0KDQoJCQkvLyBTeW5jcm9ub3VzIHJlcXVlc3QNCgkJCWlmICghby5hc3luYykNCgkJCQlyZXR1cm4gcmVhZHkoKTsNCg0KCQkJLy8gV2FpdCBmb3IgcmVzcG9uc2UsIG9uUmVhZHlTdGF0ZUNoYW5nZSBjYW4gbm90IGJlIHVzZWQgc2luY2UgaXQgbGVha3MgbWVtb3J5IGluIElFDQoJCQl0ID0gdy5zZXRUaW1lb3V0KHJlYWR5LCAxMCk7DQoJCX0NCgl9DQp9KTsNCg0KKGZ1bmN0aW9uKCkgew0KCXZhciBleHRlbmQgPSB0aW55bWNlLmV4dGVuZCwgSlNPTiA9IHRpbnltY2UudXRpbC5KU09OLCBYSFIgPSB0aW55bWNlLnV0aWwuWEhSOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudXRpbC5KU09OUmVxdWVzdCcsIHsNCgkJSlNPTlJlcXVlc3QgOiBmdW5jdGlvbihzKSB7DQoJCQl0aGlzLnNldHRpbmdzID0gZXh0ZW5kKHsNCgkJCX0sIHMpOw0KCQkJdGhpcy5jb3VudCA9IDA7DQoJCX0sDQoNCgkJc2VuZCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciBlY2IgPSBvLmVycm9yLCBzY2IgPSBvLnN1Y2Nlc3M7DQoNCgkJCW8gPSBleHRlbmQodGhpcy5zZXR0aW5ncywgbyk7DQoNCgkJCW8uc3VjY2VzcyA9IGZ1bmN0aW9uKGMsIHgpIHsNCgkJCQljID0gSlNPTi5wYXJzZShjKTsNCg0KCQkJCWlmICh0eXBlb2YoYykgPT0gJ3VuZGVmaW5lZCcpIHsNCgkJCQkJYyA9IHsNCgkJCQkJCWVycm9yIDogJ0pTT04gUGFyc2UgZXJyb3IuJw0KCQkJCQl9Ow0KCQkJCX0NCg0KCQkJCWlmIChjLmVycm9yKQ0KCQkJCQllY2IuY2FsbChvLmVycm9yX3Njb3BlIHx8IG8uc2NvcGUsIGMuZXJyb3IsIHgpOw0KCQkJCWVsc2UNCgkJCQkJc2NiLmNhbGwoby5zdWNjZXNzX3Njb3BlIHx8IG8uc2NvcGUsIGMucmVzdWx0KTsNCgkJCX07DQoNCgkJCW8uZXJyb3IgPSBmdW5jdGlvbih0eSwgeCkgew0KCQkJCWVjYi5jYWxsKG8uZXJyb3Jfc2NvcGUgfHwgby5zY29wZSwgdHksIHgpOw0KCQkJfTsNCg0KCQkJby5kYXRhID0gSlNPTi5zZXJpYWxpemUoew0KCQkJCWlkIDogby5pZCB8fCAnYycgKyAodGhpcy5jb3VudCsrKSwNCgkJCQltZXRob2QgOiBvLm1ldGhvZCwNCgkJCQlwYXJhbXMgOiBvLnBhcmFtcw0KCQkJfSk7DQoNCgkJCS8vIEpTT04gY29udGVudCB0eXBlIGZvciBSdWJ5IG9uIHJhaWxzLiBCdWc6ICMxODgzMjg3DQoJCQlvLmNvbnRlbnRfdHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJzsNCg0KCQkJWEhSLnNlbmQobyk7DQoJCX0sDQoNCgkJJ3N0YXRpYycgOiB7DQoJCQlzZW5kUlBDIDogZnVuY3Rpb24obykgew0KCQkJCXJldHVybiBuZXcgdGlueW1jZS51dGlsLkpTT05SZXF1ZXN0KCkuc2VuZChvKTsNCgkJCX0NCgkJfQ0KCX0pOw0KfSgpKTsNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBlYWNoID0gdGlueW1jZS5lYWNoLA0KCQlpcyA9IHRpbnltY2UuaXMsDQoJCWlzV2ViS2l0ID0gdGlueW1jZS5pc1dlYktpdCwNCgkJaXNJRSA9IHRpbnltY2UuaXNJRSwNCgkJYmxvY2tSZSA9IC9eKEhbMS02Ul18UHxESVZ8QUREUkVTU3xQUkV8Rk9STXxUKEFCTEV8Qk9EWXxIRUFEfEZPT1R8SHxSfEQpfExJfE9MfFVMfENBUFRJT058QkxPQ0tRVU9URXxDRU5URVJ8REx8RFR8RER8RElSfEZJRUxEU0VUfE5PU0NSSVBUfE1FTlV8SVNJTkRFWHxTQU1QKSQvLA0KCQlib29sQXR0cnMgPSBtYWtlTWFwKCdjaGVja2VkLGNvbXBhY3QsZGVjbGFyZSxkZWZlcixkaXNhYmxlZCxpc21hcCxtdWx0aXBsZSxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3dyYXAscmVhZG9ubHksc2VsZWN0ZWQnKSwNCgkJbWNlQXR0cmlicyA9IG1ha2VNYXAoJ3NyYyxocmVmLHN0eWxlLGNvb3JkcyxzaGFwZScpLA0KCQllbmNvZGVkQ2hhcnMgPSB7JyYnIDogJyZhbXA7JywgJyInIDogJyZxdW90OycsICc8JyA6ICcmbHQ7JywgJz4nIDogJyZndDsnfSwNCgkJZW5jb2RlQ2hhcnNSZSA9IC9bPD4mXCJdL2csDQoJCXNpbXBsZVNlbGVjdG9yUmUgPSAvXihbYS16MC05XSw/KSskL2ksDQoJCXRhZ1JlZ0V4cCA9IC88KFx3KykoKD86XHMrXHcrKD86XHMqPVxzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKikoXHMqXC8/KT4vZywNCgkJYXR0clJlZ0V4cCA9IC8oXHcrKSg/OlxzKj1ccyooPzooPzoiKCg/OlxcLnxbXiJdKSopIil8KD86JygoPzpcXC58W14nXSkqKScpfChbXj5cc10rKSkpPy9nOw0KDQoJZnVuY3Rpb24gbWFrZU1hcChzdHIpIHsNCgkJdmFyIG1hcCA9IHt9LCBpOw0KDQoJCXN0ciA9IHN0ci5zcGxpdCgnLCcpOw0KCQlmb3IgKGkgPSBzdHIubGVuZ3RoOyBpID49IDA7IGktLSkNCgkJCW1hcFtzdHJbaV1dID0gMTsNCg0KCQlyZXR1cm4gbWFwOw0KCX07DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5kb20uRE9NVXRpbHMnLCB7DQoJCWRvYyA6IG51bGwsDQoJCXJvb3QgOiBudWxsLA0KCQlmaWxlcyA6IG51bGwsDQoJCXBpeGVsU3R5bGVzIDogL14odG9wfGxlZnR8Ym90dG9tfHJpZ2h0fHdpZHRofGhlaWdodHxib3JkZXJXaWR0aCkkLywNCgkJcHJvcHMgOiB7DQoJCQkiZm9yIiA6ICJodG1sRm9yIiwNCgkJCSJjbGFzcyIgOiAiY2xhc3NOYW1lIiwNCgkJCWNsYXNzTmFtZSA6ICJjbGFzc05hbWUiLA0KCQkJY2hlY2tlZCA6ICJjaGVja2VkIiwNCgkJCWRpc2FibGVkIDogImRpc2FibGVkIiwNCgkJCW1heGxlbmd0aCA6ICJtYXhMZW5ndGgiLA0KCQkJcmVhZG9ubHkgOiAicmVhZE9ubHkiLA0KCQkJc2VsZWN0ZWQgOiAic2VsZWN0ZWQiLA0KCQkJdmFsdWUgOiAidmFsdWUiLA0KCQkJaWQgOiAiaWQiLA0KCQkJbmFtZSA6ICJuYW1lIiwNCgkJCXR5cGUgOiAidHlwZSINCgkJfSwNCg0KCQlET01VdGlscyA6IGZ1bmN0aW9uKGQsIHMpIHsNCgkJCXZhciB0ID0gdGhpcywgZ2xvYmFsU3R5bGU7DQoNCgkJCXQuZG9jID0gZDsNCgkJCXQud2luID0gd2luZG93Ow0KCQkJdC5maWxlcyA9IHt9Ow0KCQkJdC5jc3NGbGlja2VyID0gZmFsc2U7DQoJCQl0LmNvdW50ZXIgPSAwOw0KCQkJdC5zdGRNb2RlID0gZC5kb2N1bWVudE1vZGUgPj0gODsNCgkJCXQuYm94TW9kZWwgPSAhdGlueW1jZS5pc0lFIHx8IGQuY29tcGF0TW9kZSA9PSAiQ1NTMUNvbXBhdCIgfHwgdC5zdGRNb2RlOw0KDQoJCQl0LnNldHRpbmdzID0gcyA9IHRpbnltY2UuZXh0ZW5kKHsNCgkJCQlrZWVwX3ZhbHVlcyA6IGZhbHNlLA0KCQkJCWhleF9jb2xvcnMgOiAxLA0KCQkJCXByb2Nlc3NfaHRtbCA6IDENCgkJCX0sIHMpOw0KDQoJCQkvLyBGaXggSUU2U1AyIGZsaWNrZXIgYW5kIGNoZWNrIGl0IGZhaWxlZCBmb3IgcHJlIFNQMg0KCQkJaWYgKHRpbnltY2UuaXNJRTYpIHsNCgkJCQl0cnkgew0KCQkJCQlkLmV4ZWNDb21tYW5kKCdCYWNrZ3JvdW5kSW1hZ2VDYWNoZScsIGZhbHNlLCB0cnVlKTsNCgkJCQl9IGNhdGNoIChlKSB7DQoJCQkJCXQuY3NzRmxpY2tlciA9IHRydWU7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBCdWlsZCBzdHlsZXMgbGlzdA0KCQkJaWYgKHMudmFsaWRfc3R5bGVzKSB7DQoJCQkJdC5fc3R5bGVzID0ge307DQoNCgkJCQkvLyBDb252ZXJ0IHN0eWxlcyBpbnRvIGEgcnVsZSBsaXN0DQoJCQkJZWFjaChzLnZhbGlkX3N0eWxlcywgZnVuY3Rpb24odmFsdWUsIGtleSkgew0KCQkJCQl0Ll9zdHlsZXNba2V5XSA9IHRpbnltY2UuZXhwbG9kZSh2YWx1ZSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXRpbnltY2UuYWRkVW5sb2FkKHQuZGVzdHJveSwgdCk7DQoJCX0sDQoNCgkJZ2V0Um9vdCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJcmV0dXJuIChzICYmIHQuZ2V0KHMucm9vdF9lbGVtZW50KSkgfHwgdC5kb2MuYm9keTsNCgkJfSwNCg0KCQlnZXRWaWV3UG9ydCA6IGZ1bmN0aW9uKHcpIHsNCgkJCXZhciBkLCBiOw0KDQoJCQl3ID0gIXcgPyB0aGlzLndpbiA6IHc7DQoJCQlkID0gdy5kb2N1bWVudDsNCgkJCWIgPSB0aGlzLmJveE1vZGVsID8gZC5kb2N1bWVudEVsZW1lbnQgOiBkLmJvZHk7DQoNCgkJCS8vIFJldHVybnMgdmlld3BvcnQgc2l6ZSBleGNsdWRpbmcgc2Nyb2xsYmFycw0KCQkJcmV0dXJuIHsNCgkJCQl4IDogdy5wYWdlWE9mZnNldCB8fCBiLnNjcm9sbExlZnQsDQoJCQkJeSA6IHcucGFnZVlPZmZzZXQgfHwgYi5zY3JvbGxUb3AsDQoJCQkJdyA6IHcuaW5uZXJXaWR0aCB8fCBiLmNsaWVudFdpZHRoLA0KCQkJCWggOiB3LmlubmVySGVpZ2h0IHx8IGIuY2xpZW50SGVpZ2h0DQoJCQl9Ow0KCQl9LA0KDQoJCWdldFJlY3QgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgcCwgdCA9IHRoaXMsIHNyOw0KDQoJCQllID0gdC5nZXQoZSk7DQoJCQlwID0gdC5nZXRQb3MoZSk7DQoJCQlzciA9IHQuZ2V0U2l6ZShlKTsNCg0KCQkJcmV0dXJuIHsNCgkJCQl4IDogcC54LA0KCQkJCXkgOiBwLnksDQoJCQkJdyA6IHNyLncsDQoJCQkJaCA6IHNyLmgNCgkJCX07DQoJCX0sDQoNCgkJZ2V0U2l6ZSA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpcywgdywgaDsNCg0KCQkJZSA9IHQuZ2V0KGUpOw0KCQkJdyA9IHQuZ2V0U3R5bGUoZSwgJ3dpZHRoJyk7DQoJCQloID0gdC5nZXRTdHlsZShlLCAnaGVpZ2h0Jyk7DQoNCgkJCS8vIE5vbiBwaXhlbCB2YWx1ZSwgdGhlbiBmb3JjZSBvZmZzZXQvY2xpZW50V2lkdGgNCgkJCWlmICh3LmluZGV4T2YoJ3B4JykgPT09IC0xKQ0KCQkJCXcgPSAwOw0KDQoJCQkvLyBOb24gcGl4ZWwgdmFsdWUsIHRoZW4gZm9yY2Ugb2Zmc2V0L2NsaWVudFdpZHRoDQoJCQlpZiAoaC5pbmRleE9mKCdweCcpID09PSAtMSkNCgkJCQloID0gMDsNCg0KCQkJcmV0dXJuIHsNCgkJCQl3IDogcGFyc2VJbnQodykgfHwgZS5vZmZzZXRXaWR0aCB8fCBlLmNsaWVudFdpZHRoLA0KCQkJCWggOiBwYXJzZUludChoKSB8fCBlLm9mZnNldEhlaWdodCB8fCBlLmNsaWVudEhlaWdodA0KCQkJfTsNCgkJfSwNCg0KCQlnZXRQYXJlbnQgOiBmdW5jdGlvbihuLCBmLCByKSB7DQoJCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnRzKG4sIGYsIHIsIGZhbHNlKTsNCgkJfSwNCg0KCQlnZXRQYXJlbnRzIDogZnVuY3Rpb24obiwgZiwgciwgYykgew0KCQkJdmFyIHQgPSB0aGlzLCBuYSwgc2UgPSB0LnNldHRpbmdzLCBvID0gW107DQoNCgkJCW4gPSB0LmdldChuKTsNCgkJCWMgPSBjID09PSB1bmRlZmluZWQ7DQoNCgkJCWlmIChzZS5zdHJpY3Rfcm9vdCkNCgkJCQlyID0gciB8fCB0LmdldFJvb3QoKTsNCg0KCQkJLy8gV3JhcCBub2RlIG5hbWUgYXMgZnVuYw0KCQkJaWYgKGlzKGYsICdzdHJpbmcnKSkgew0KCQkJCW5hID0gZjsNCg0KCQkJCWlmIChmID09PSAnKicpIHsNCgkJCQkJZiA9IGZ1bmN0aW9uKG4pIHtyZXR1cm4gbi5ub2RlVHlwZSA9PSAxO307DQoJCQkJfSBlbHNlIHsNCgkJCQkJZiA9IGZ1bmN0aW9uKG4pIHsNCgkJCQkJCXJldHVybiB0LmlzKG4sIG5hKTsNCgkJCQkJfTsNCgkJCQl9DQoJCQl9DQoNCgkJCXdoaWxlIChuKSB7DQoJCQkJaWYgKG4gPT0gciB8fCAhbi5ub2RlVHlwZSB8fCBuLm5vZGVUeXBlID09PSA5KQ0KCQkJCQlicmVhazsNCg0KCQkJCWlmICghZiB8fCBmKG4pKSB7DQoJCQkJCWlmIChjKQ0KCQkJCQkJby5wdXNoKG4pOw0KCQkJCQllbHNlDQoJCQkJCQlyZXR1cm4gbjsNCgkJCQl9DQoNCgkJCQluID0gbi5wYXJlbnROb2RlOw0KCQkJfQ0KDQoJCQlyZXR1cm4gYyA/IG8gOiBudWxsOw0KCQl9LA0KDQoJCWdldCA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciBuOw0KDQoJCQlpZiAoZSAmJiB0aGlzLmRvYyAmJiB0eXBlb2YoZSkgPT0gJ3N0cmluZycpIHsNCgkJCQluID0gZTsNCgkJCQllID0gdGhpcy5kb2MuZ2V0RWxlbWVudEJ5SWQoZSk7DQoNCgkJCQkvLyBJRSBhbmQgT3BlcmEgcmV0dXJucyBtZXRhIGVsZW1lbnRzIHdoZW4gdGhleSBtYXRjaCB0aGUgc3BlY2lmaWVkIGlucHV0IElELCBidXQgZ2V0RWxlbWVudHNCeU5hbWUgc2VlbXMgdG8gZG8gdGhlIHRyaWNrDQoJCQkJaWYgKGUgJiYgZS5pZCAhPT0gbikNCgkJCQkJcmV0dXJuIHRoaXMuZG9jLmdldEVsZW1lbnRzQnlOYW1lKG4pWzFdOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZTsNCgkJfSwNCg0KCQlnZXROZXh0IDogZnVuY3Rpb24obm9kZSwgc2VsZWN0b3IpIHsNCgkJCXJldHVybiB0aGlzLl9maW5kU2liKG5vZGUsIHNlbGVjdG9yLCAnbmV4dFNpYmxpbmcnKTsNCgkJfSwNCg0KCQlnZXRQcmV2IDogZnVuY3Rpb24obm9kZSwgc2VsZWN0b3IpIHsNCgkJCXJldHVybiB0aGlzLl9maW5kU2liKG5vZGUsIHNlbGVjdG9yLCAncHJldmlvdXNTaWJsaW5nJyk7DQoJCX0sDQoNCg0KCQlzZWxlY3QgOiBmdW5jdGlvbihwYSwgcykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlyZXR1cm4gdGlueW1jZS5kb20uU2l6emxlKHBhLCB0LmdldChzKSB8fCB0LmdldCh0LnNldHRpbmdzLnJvb3RfZWxlbWVudCkgfHwgdC5kb2MsIFtdKTsNCgkJfSwNCg0KCQlpcyA6IGZ1bmN0aW9uKG4sIHNlbGVjdG9yKSB7DQoJCQl2YXIgaTsNCg0KCQkJLy8gSWYgaXQgaXNuJ3QgYW4gYXJyYXkgdGhlbiB0cnkgdG8gZG8gc29tZSBzaW1wbGUgc2VsZWN0b3JzIGluc3RlYWQgb2YgU2l6emxlIGZvciB0byBib29zdCBwZXJmb3JtYW5jZQ0KCQkJaWYgKG4ubGVuZ3RoID09PSB1bmRlZmluZWQpIHsNCgkJCQkvLyBTaW1wbGUgYWxsIHNlbGVjdG9yDQoJCQkJaWYgKHNlbGVjdG9yID09PSAnKicpDQoJCQkJCXJldHVybiBuLm5vZGVUeXBlID09IDE7DQoNCgkJCQkvLyBTaW1wbGUgc2VsZWN0b3IganVzdCBlbGVtZW50cw0KCQkJCWlmIChzaW1wbGVTZWxlY3RvclJlLnRlc3Qoc2VsZWN0b3IpKSB7DQoJCQkJCXNlbGVjdG9yID0gc2VsZWN0b3IudG9Mb3dlckNhc2UoKS5zcGxpdCgvLC8pOw0KCQkJCQluID0gbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KDQoJCQkJCWZvciAoaSA9IHNlbGVjdG9yLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQlpZiAoc2VsZWN0b3JbaV0gPT0gbikNCgkJCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiB0aW55bWNlLmRvbS5TaXp6bGUubWF0Y2hlcyhzZWxlY3Rvciwgbi5ub2RlVHlwZSA/IFtuXSA6IG4pLmxlbmd0aCA+IDA7DQoJCX0sDQoNCg0KCQlhZGQgOiBmdW5jdGlvbihwLCBuLCBhLCBoLCBjKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXJldHVybiB0aGlzLnJ1bihwLCBmdW5jdGlvbihwKSB7DQoJCQkJdmFyIGUsIGs7DQoNCgkJCQllID0gaXMobiwgJ3N0cmluZycpID8gdC5kb2MuY3JlYXRlRWxlbWVudChuKSA6IG47DQoJCQkJdC5zZXRBdHRyaWJzKGUsIGEpOw0KDQoJCQkJaWYgKGgpIHsNCgkJCQkJaWYgKGgubm9kZVR5cGUpDQoJCQkJCQllLmFwcGVuZENoaWxkKGgpOw0KCQkJCQllbHNlDQoJCQkJCQl0LnNldEhUTUwoZSwgaCk7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuICFjID8gcC5hcHBlbmRDaGlsZChlKSA6IGU7DQoJCQl9KTsNCgkJfSwNCg0KCQljcmVhdGUgOiBmdW5jdGlvbihuLCBhLCBoKSB7DQoJCQlyZXR1cm4gdGhpcy5hZGQodGhpcy5kb2MuY3JlYXRlRWxlbWVudChuKSwgbiwgYSwgaCwgMSk7DQoJCX0sDQoNCgkJY3JlYXRlSFRNTCA6IGZ1bmN0aW9uKG4sIGEsIGgpIHsNCgkJCXZhciBvID0gJycsIHQgPSB0aGlzLCBrOw0KDQoJCQlvICs9ICc8JyArIG47DQoNCgkJCWZvciAoayBpbiBhKSB7DQoJCQkJaWYgKGEuaGFzT3duUHJvcGVydHkoaykpDQoJCQkJCW8gKz0gJyAnICsgayArICc9IicgKyB0LmVuY29kZShhW2tdKSArICciJzsNCgkJCX0NCg0KCQkJLy8gQSBjYWxsIHRvIHRpbnltY2UuaXMgZG9lc24ndCB3b3JrIGZvciBzb21lIG9kZCByZWFzb24gb24gSUU5IHBvc3NpYmxlIGJ1ZyBpbnNpZGUgdGhlaXIgSlMgcnVudGltZQ0KCQkJaWYgKHR5cGVvZihoKSAhPSAidW5kZWZpbmVkIikNCgkJCQlyZXR1cm4gbyArICc+JyArIGggKyAnPC8nICsgbiArICc+JzsNCg0KCQkJcmV0dXJuIG8gKyAnIC8+JzsNCgkJfSwNCg0KCQlyZW1vdmUgOiBmdW5jdGlvbihub2RlLCBrZWVwX2NoaWxkcmVuKSB7DQoJCQlyZXR1cm4gdGhpcy5ydW4obm9kZSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCXZhciBwYXJlbnQsIGNoaWxkOw0KDQoJCQkJcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOw0KDQoJCQkJaWYgKCFwYXJlbnQpDQoJCQkJCXJldHVybiBudWxsOw0KDQoJCQkJaWYgKGtlZXBfY2hpbGRyZW4pIHsNCgkJCQkJd2hpbGUgKGNoaWxkID0gbm9kZS5maXJzdENoaWxkKSB7DQoJCQkJCQkvLyBJRSA4IHdpbGwgY3Jhc2ggaWYgeW91IGRvbid0IHJlbW92ZSBjb21wbGV0ZWx5IGVtcHR5IHRleHQgbm9kZXMNCgkJCQkJCWlmICghdGlueW1jZS5pc0lFIHx8IGNoaWxkLm5vZGVUeXBlICE9PSAzIHx8IGNoaWxkLm5vZGVWYWx1ZSkNCgkJCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBub2RlKTsNCgkJCQkJCWVsc2UNCgkJCQkJCQlub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCXJldHVybiBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7DQoJCQl9KTsNCgkJfSwNCg0KCQlzZXRTdHlsZSA6IGZ1bmN0aW9uKG4sIG5hLCB2KSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXJldHVybiB0LnJ1bihuLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIHMsIGk7DQoNCgkJCQlzID0gZS5zdHlsZTsNCg0KCQkJCS8vIENhbWVsY2FzZSBpdCwgaWYgbmVlZGVkDQoJCQkJbmEgPSBuYS5yZXBsYWNlKC8tKFxEKS9nLCBmdW5jdGlvbihhLCBiKXsNCgkJCQkJcmV0dXJuIGIudG9VcHBlckNhc2UoKTsNCgkJCQl9KTsNCg0KCQkJCS8vIERlZmF1bHQgcHggc3VmZml4IG9uIHRoZXNlDQoJCQkJaWYgKHQucGl4ZWxTdHlsZXMudGVzdChuYSkgJiYgKHRpbnltY2UuaXModiwgJ251bWJlcicpIHx8IC9eW1wtMC05XC5dKyQvLnRlc3QodikpKQ0KCQkJCQl2ICs9ICdweCc7DQoNCgkJCQlzd2l0Y2ggKG5hKSB7DQoJCQkJCWNhc2UgJ29wYWNpdHknOg0KCQkJCQkJLy8gSUUgc3BlY2lmaWMgb3BhY2l0eQ0KCQkJCQkJaWYgKGlzSUUpIHsNCgkJCQkJCQlzLmZpbHRlciA9IHYgPT09ICcnID8gJycgOiAiYWxwaGEob3BhY2l0eT0iICsgKHYgKiAxMDApICsgIikiOw0KDQoJCQkJCQkJaWYgKCFuLmN1cnJlbnRTdHlsZSB8fCAhbi5jdXJyZW50U3R5bGUuaGFzTGF5b3V0KQ0KCQkJCQkJCQlzLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gRml4IGZvciBvbGRlciBicm93c2Vycw0KCQkJCQkJc1tuYV0gPSBzWyctbW96LW9wYWNpdHknXSA9IHNbJy1raHRtbC1vcGFjaXR5J10gPSB2IHx8ICcnOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnZmxvYXQnOg0KCQkJCQkJaXNJRSA/IHMuc3R5bGVGbG9hdCA9IHYgOiBzLmNzc0Zsb2F0ID0gdjsNCgkJCQkJCWJyZWFrOw0KCQkJCQkNCgkJCQkJZGVmYXVsdDoNCgkJCQkJCXNbbmFdID0gdiB8fCAnJzsNCgkJCQl9DQoNCgkJCQkvLyBGb3JjZSB1cGRhdGUgb2YgdGhlIHN0eWxlIGRhdGENCgkJCQlpZiAodC5zZXR0aW5ncy51cGRhdGVfc3R5bGVzKQ0KCQkJCQl0LnNldEF0dHJpYihlLCAnX21jZV9zdHlsZScpOw0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0U3R5bGUgOiBmdW5jdGlvbihuLCBuYSwgYykgew0KCQkJbiA9IHRoaXMuZ2V0KG4pOw0KDQoJCQlpZiAoIW4pDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQkvLyBHZWNrbw0KCQkJaWYgKHRoaXMuZG9jLmRlZmF1bHRWaWV3ICYmIGMpIHsNCgkJCQkvLyBSZW1vdmUgY2FtZWxjYXNlDQoJCQkJbmEgPSBuYS5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihhKXsNCgkJCQkJcmV0dXJuICctJyArIGE7DQoJCQkJfSk7DQoNCgkJCQl0cnkgew0KCQkJCQlyZXR1cm4gdGhpcy5kb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShuLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hKTsNCgkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkvLyBPbGQgc2FmYXJpIG1pZ2h0IGZhaWwNCgkJCQkJcmV0dXJuIG51bGw7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBDYW1lbGNhc2UgaXQsIGlmIG5lZWRlZA0KCQkJbmEgPSBuYS5yZXBsYWNlKC8tKFxEKS9nLCBmdW5jdGlvbihhLCBiKXsNCgkJCQlyZXR1cm4gYi50b1VwcGVyQ2FzZSgpOw0KCQkJfSk7DQoNCgkJCWlmIChuYSA9PSAnZmxvYXQnKQ0KCQkJCW5hID0gaXNJRSA/ICdzdHlsZUZsb2F0JyA6ICdjc3NGbG9hdCc7DQoNCgkJCS8vIElFICYgT3BlcmENCgkJCWlmIChuLmN1cnJlbnRTdHlsZSAmJiBjKQ0KCQkJCXJldHVybiBuLmN1cnJlbnRTdHlsZVtuYV07DQoNCgkJCXJldHVybiBuLnN0eWxlW25hXTsNCgkJfSwNCg0KCQlzZXRTdHlsZXMgOiBmdW5jdGlvbihlLCBvKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBvbDsNCg0KCQkJb2wgPSBzLnVwZGF0ZV9zdHlsZXM7DQoJCQlzLnVwZGF0ZV9zdHlsZXMgPSAwOw0KDQoJCQllYWNoKG8sIGZ1bmN0aW9uKHYsIG4pIHsNCgkJCQl0LnNldFN0eWxlKGUsIG4sIHYpOw0KCQkJfSk7DQoNCgkJCS8vIFVwZGF0ZSBzdHlsZSBpbmZvDQoJCQlzLnVwZGF0ZV9zdHlsZXMgPSBvbDsNCgkJCWlmIChzLnVwZGF0ZV9zdHlsZXMpDQoJCQkJdC5zZXRBdHRyaWIoZSwgcy5jc3NUZXh0KTsNCgkJfSwNCg0KCQlzZXRBdHRyaWIgOiBmdW5jdGlvbihlLCBuLCB2KSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCS8vIFdoYXRzIHRoZSBwb2ludA0KCQkJaWYgKCFlIHx8ICFuKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gU3RyaWN0IFhNTCBtb2RlDQoJCQlpZiAodC5zZXR0aW5ncy5zdHJpY3QpDQoJCQkJbiA9IG4udG9Mb3dlckNhc2UoKTsNCg0KCQkJcmV0dXJuIHRoaXMucnVuKGUsIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgcyA9IHQuc2V0dGluZ3M7DQoNCgkJCQlzd2l0Y2ggKG4pIHsNCgkJCQkJY2FzZSAic3R5bGUiOg0KCQkJCQkJaWYgKCFpcyh2LCAnc3RyaW5nJykpIHsNCgkJCQkJCQllYWNoKHYsIGZ1bmN0aW9uKHYsIG4pIHsNCgkJCQkJCQkJdC5zZXRTdHlsZShlLCBuLCB2KTsNCgkJCQkJCQl9KTsNCg0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gTm8gbWNlX3N0eWxlIGZvciBlbGVtZW50cyB3aXRoIHRoZXNlIHNpbmNlIHRoZXkgbWlnaHQgZ2V0IHJlc2l6ZWQgYnkgdGhlIHVzZXINCgkJCQkJCWlmIChzLmtlZXBfdmFsdWVzKSB7DQoJCQkJCQkJaWYgKHYgJiYgIXQuX2lzUmVzKHYpKQ0KCQkJCQkJCQllLnNldEF0dHJpYnV0ZSgnX21jZV9zdHlsZScsIHYsIDIpOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJZS5yZW1vdmVBdHRyaWJ1dGUoJ19tY2Vfc3R5bGUnLCAyKTsNCgkJCQkJCX0NCg0KCQkJCQkJZS5zdHlsZS5jc3NUZXh0ID0gdjsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgImNsYXNzIjoNCgkJCQkJCWUuY2xhc3NOYW1lID0gdiB8fCAnJzsgLy8gRml4IElFIG51bGwgYnVnDQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICJzcmMiOg0KCQkJCQljYXNlICJocmVmIjoNCgkJCQkJCWlmIChzLmtlZXBfdmFsdWVzKSB7DQoJCQkJCQkJaWYgKHMudXJsX2NvbnZlcnRlcikNCgkJCQkJCQkJdiA9IHMudXJsX2NvbnZlcnRlci5jYWxsKHMudXJsX2NvbnZlcnRlcl9zY29wZSB8fCB0LCB2LCBuLCBlKTsNCg0KCQkJCQkJCXQuc2V0QXR0cmliKGUsICdfbWNlXycgKyBuLCB2LCAyKTsNCgkJCQkJCX0NCg0KCQkJCQkJYnJlYWs7DQoJCQkJCQ0KCQkJCQljYXNlICJzaGFwZSI6DQoJCQkJCQllLnNldEF0dHJpYnV0ZSgnX21jZV9zdHlsZScsIHYpOw0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJaWYgKGlzKHYpICYmIHYgIT09IG51bGwgJiYgdi5sZW5ndGggIT09IDApDQoJCQkJCWUuc2V0QXR0cmlidXRlKG4sICcnICsgdiwgMik7DQoJCQkJZWxzZQ0KCQkJCQllLnJlbW92ZUF0dHJpYnV0ZShuLCAyKTsNCgkJCX0pOw0KCQl9LA0KDQoJCXNldEF0dHJpYnMgOiBmdW5jdGlvbihlLCBvKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXJldHVybiB0aGlzLnJ1bihlLCBmdW5jdGlvbihlKSB7DQoJCQkJZWFjaChvLCBmdW5jdGlvbih2LCBuKSB7DQoJCQkJCXQuc2V0QXR0cmliKGUsIG4sIHYpOw0KCQkJCX0pOw0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0QXR0cmliIDogZnVuY3Rpb24oZSwgbiwgZHYpIHsNCgkJCXZhciB2LCB0ID0gdGhpczsNCg0KCQkJZSA9IHQuZ2V0KGUpOw0KDQoJCQlpZiAoIWUgfHwgZS5ub2RlVHlwZSAhPT0gMSkNCgkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCWlmICghaXMoZHYpKQ0KCQkJCWR2ID0gJyc7DQoNCgkJCS8vIFRyeSB0aGUgbWNlIHZhcmlhbnQgZm9yIHRoZXNlDQoJCQlpZiAoL14oc3JjfGhyZWZ8c3R5bGV8Y29vcmRzfHNoYXBlKSQvLnRlc3QobikpIHsNCgkJCQl2ID0gZS5nZXRBdHRyaWJ1dGUoIl9tY2VfIiArIG4pOw0KDQoJCQkJaWYgKHYpDQoJCQkJCXJldHVybiB2Ow0KCQkJfQ0KDQoJCQlpZiAoaXNJRSAmJiB0LnByb3BzW25dKSB7DQoJCQkJdiA9IGVbdC5wcm9wc1tuXV07DQoJCQkJdiA9IHYgJiYgdi5ub2RlVmFsdWUgPyB2Lm5vZGVWYWx1ZSA6IHY7DQoJCQl9DQoNCgkJCWlmICghdikNCgkJCQl2ID0gZS5nZXRBdHRyaWJ1dGUobiwgMik7DQoNCgkJCS8vIENoZWNrIGJvb2xlYW4gYXR0cmlicw0KCQkJaWYgKC9eKGNoZWNrZWR8Y29tcGFjdHxkZWNsYXJlfGRlZmVyfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfG5vaHJlZnxub3NoYWRlfG5vd3JhcHxyZWFkb25seXxzZWxlY3RlZCkkLy50ZXN0KG4pKSB7DQoJCQkJaWYgKGVbdC5wcm9wc1tuXV0gPT09IHRydWUgJiYgdiA9PT0gJycpDQoJCQkJCXJldHVybiBuOw0KDQoJCQkJcmV0dXJuIHYgPyBuIDogJyc7DQoJCQl9DQoNCgkJCS8vIElubmVyIGlucHV0IGVsZW1lbnRzIHdpbGwgb3ZlcnJpZGUgYXR0cmlidXRlcyBvbiBmb3JtIGVsZW1lbnRzDQoJCQlpZiAoZS5ub2RlTmFtZSA9PT0gIkZPUk0iICYmIGUuZ2V0QXR0cmlidXRlTm9kZShuKSkNCgkJCQlyZXR1cm4gZS5nZXRBdHRyaWJ1dGVOb2RlKG4pLm5vZGVWYWx1ZTsNCg0KCQkJaWYgKG4gPT09ICdzdHlsZScpIHsNCgkJCQl2ID0gdiB8fCBlLnN0eWxlLmNzc1RleHQ7DQoNCgkJCQlpZiAodikgew0KCQkJCQl2ID0gdC5zZXJpYWxpemVTdHlsZSh0LnBhcnNlU3R5bGUodiksIGUubm9kZU5hbWUpOw0KDQoJCQkJCWlmICh0LnNldHRpbmdzLmtlZXBfdmFsdWVzICYmICF0Ll9pc1Jlcyh2KSkNCgkJCQkJCWUuc2V0QXR0cmlidXRlKCdfbWNlX3N0eWxlJywgdik7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBSZW1vdmUgQXBwbGUgYW5kIFdlYktpdCBzdHVmZg0KCQkJaWYgKGlzV2ViS2l0ICYmIG4gPT09ICJjbGFzcyIgJiYgdikNCgkJCQl2ID0gdi5yZXBsYWNlKC8oYXBwbGV8d2Via2l0KVwtW2EtelwtXSsvZ2ksICcnKTsNCg0KCQkJLy8gSGFuZGxlIElFIGlzc3Vlcw0KCQkJaWYgKGlzSUUpIHsNCgkJCQlzd2l0Y2ggKG4pIHsNCgkJCQkJY2FzZSAncm93c3Bhbic6DQoJCQkJCWNhc2UgJ2NvbHNwYW4nOg0KCQkJCQkJLy8gSUUgcmV0dXJucyAxIGFzIGRlZmF1bHQgdmFsdWUNCgkJCQkJCWlmICh2ID09PSAxKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnc2l6ZSc6DQoJCQkJCQkvLyBJRSByZXR1cm5zICswIGFzIGRlZmF1bHQgdmFsdWUgZm9yIHNpemUNCgkJCQkJCWlmICh2ID09PSAnKzAnIHx8IHYgPT09IDIwIHx8IHYgPT09IDApDQoJCQkJCQkJdiA9ICcnOw0KDQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICd3aWR0aCc6DQoJCQkJCWNhc2UgJ2hlaWdodCc6DQoJCQkJCWNhc2UgJ3ZzcGFjZSc6DQoJCQkJCWNhc2UgJ2NoZWNrZWQnOg0KCQkJCQljYXNlICdkaXNhYmxlZCc6DQoJCQkJCWNhc2UgJ3JlYWRvbmx5JzoNCgkJCQkJCWlmICh2ID09PSAwKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnaHNwYWNlJzoNCgkJCQkJCS8vIElFIHJldHVybnMgLTEgYXMgZGVmYXVsdCB2YWx1ZQ0KCQkJCQkJaWYgKHYgPT09IC0xKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnbWF4bGVuZ3RoJzoNCgkJCQkJY2FzZSAndGFiaW5kZXgnOg0KCQkJCQkJLy8gSUUgcmV0dXJucyBkZWZhdWx0IHZhbHVlDQoJCQkJCQlpZiAodiA9PT0gMzI3NjggfHwgdiA9PT0gMjE0NzQ4MzY0NyB8fCB2ID09PSAnMzI3NjgnKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnbXVsdGlwbGUnOg0KCQkJCQljYXNlICdjb21wYWN0JzoNCgkJCQkJY2FzZSAnbm9zaGFkZSc6DQoJCQkJCWNhc2UgJ25vd3JhcCc6DQoJCQkJCQlpZiAodiA9PT0gNjU1MzUpDQoJCQkJCQkJcmV0dXJuIG47DQoNCgkJCQkJCXJldHVybiBkdjsNCg0KCQkJCQljYXNlICdzaGFwZSc6DQoJCQkJCQl2ID0gdi50b0xvd2VyQ2FzZSgpOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJZGVmYXVsdDoNCgkJCQkJCS8vIElFIGhhcyBvZGQgYW5vbnltb3VzIGZ1bmN0aW9uIGZvciBldmVudCBhdHRyaWJ1dGVzDQoJCQkJCQlpZiAobi5pbmRleE9mKCdvbicpID09PSAwICYmIHYpDQoJCQkJCQkJdiA9IHRpbnltY2UuX3JlcGxhY2UoL15mdW5jdGlvblxzK1x3K1woXClccytce1xzKyguKilccytcfSQvLCAnJDEnLCAnJyArIHYpOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuICh2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCAmJiB2ICE9PSAnJykgPyAnJyArIHYgOiBkdjsNCgkJfSwNCg0KCQlnZXRQb3MgOiBmdW5jdGlvbihuLCBybykgew0KCQkJdmFyIHQgPSB0aGlzLCB4ID0gMCwgeSA9IDAsIGUsIGQgPSB0LmRvYywgcjsNCg0KCQkJbiA9IHQuZ2V0KG4pOw0KCQkJcm8gPSBybyB8fCBkLmJvZHk7DQoNCgkJCWlmIChuKSB7DQoJCQkJLy8gVXNlIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBJRSwgT3BlcmEgaGFzIGl0IGJ1dCBpdCdzIG5vdCBwZXJmZWN0DQoJCQkJaWYgKGlzSUUgJiYgIXQuc3RkTW9kZSkgew0KCQkJCQluID0gbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCgkJCQkJZSA9IHQuYm94TW9kZWwgPyBkLmRvY3VtZW50RWxlbWVudCA6IGQuYm9keTsNCgkJCQkJeCA9IHQuZ2V0U3R5bGUodC5zZWxlY3QoJ2h0bWwnKVswXSwgJ2JvcmRlcldpZHRoJyk7IC8vIFJlbW92ZSBib3JkZXINCgkJCQkJeCA9ICh4ID09ICdtZWRpdW0nIHx8IHQuYm94TW9kZWwgJiYgIXQuaXNJRTYpICYmIDIgfHwgeDsNCg0KCQkJCQlyZXR1cm4ge3ggOiBuLmxlZnQgKyBlLnNjcm9sbExlZnQgLSB4LCB5IDogbi50b3AgKyBlLnNjcm9sbFRvcCAtIHh9Ow0KCQkJCX0NCg0KCQkJCXIgPSBuOw0KCQkJCXdoaWxlIChyICYmIHIgIT0gcm8gJiYgci5ub2RlVHlwZSkgew0KCQkJCQl4ICs9IHIub2Zmc2V0TGVmdCB8fCAwOw0KCQkJCQl5ICs9IHIub2Zmc2V0VG9wIHx8IDA7DQoJCQkJCXIgPSByLm9mZnNldFBhcmVudDsNCgkJCQl9DQoNCgkJCQlyID0gbi5wYXJlbnROb2RlOw0KCQkJCXdoaWxlIChyICYmIHIgIT0gcm8gJiYgci5ub2RlVHlwZSkgew0KCQkJCQl4IC09IHIuc2Nyb2xsTGVmdCB8fCAwOw0KCQkJCQl5IC09IHIuc2Nyb2xsVG9wIHx8IDA7DQoJCQkJCXIgPSByLnBhcmVudE5vZGU7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4ge3ggOiB4LCB5IDogeX07DQoJCX0sDQoNCgkJcGFyc2VTdHlsZSA6IGZ1bmN0aW9uKHN0KSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBvID0ge307DQoNCgkJCWlmICghc3QpDQoJCQkJcmV0dXJuIG87DQoNCgkJCWZ1bmN0aW9uIGNvbXByZXNzKHAsIHMsIG90KSB7DQoJCQkJdmFyIHQsIHIsIGIsIGw7DQoNCgkJCQkvLyBHZXQgdmFsdWVzIGFuZCBjaGVjayBpdCBpdCBuZWVkcyBjb21wcmVzc2luZw0KCQkJCXQgPSBvW3AgKyAnLXRvcCcgKyBzXTsNCgkJCQlpZiAoIXQpDQoJCQkJCXJldHVybjsNCg0KCQkJCXIgPSBvW3AgKyAnLXJpZ2h0JyArIHNdOw0KCQkJCWlmICh0ICE9IHIpDQoJCQkJCXJldHVybjsNCg0KCQkJCWIgPSBvW3AgKyAnLWJvdHRvbScgKyBzXTsNCgkJCQlpZiAociAhPSBiKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlsID0gb1twICsgJy1sZWZ0JyArIHNdOw0KCQkJCWlmIChiICE9IGwpDQoJCQkJCXJldHVybjsNCg0KCQkJCS8vIENvbXByZXNzDQoJCQkJb1tvdF0gPSBsOw0KCQkJCWRlbGV0ZSBvW3AgKyAnLXRvcCcgKyBzXTsNCgkJCQlkZWxldGUgb1twICsgJy1yaWdodCcgKyBzXTsNCgkJCQlkZWxldGUgb1twICsgJy1ib3R0b20nICsgc107DQoJCQkJZGVsZXRlIG9bcCArICctbGVmdCcgKyBzXTsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIGNvbXByZXNzMih0YSwgYSwgYiwgYykgew0KCQkJCXZhciB0Ow0KDQoJCQkJdCA9IG9bYV07DQoJCQkJaWYgKCF0KQ0KCQkJCQlyZXR1cm47DQoNCgkJCQl0ID0gb1tiXTsNCgkJCQlpZiAoIXQpDQoJCQkJCXJldHVybjsNCg0KCQkJCXQgPSBvW2NdOw0KCQkJCWlmICghdCkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJLy8gQ29tcHJlc3MNCgkJCQlvW3RhXSA9IG9bYV0gKyAnICcgKyBvW2JdICsgJyAnICsgb1tjXTsNCgkJCQlkZWxldGUgb1thXTsNCgkJCQlkZWxldGUgb1tiXTsNCgkJCQlkZWxldGUgb1tjXTsNCgkJCX07DQoNCgkJCXN0ID0gc3QucmVwbGFjZSgvJigjP1thLXowLTldKyk7L2csICcmJDFfTUNFX1NFTUlfJyk7IC8vIFByb3RlY3QgZW50aXRpZXMNCg0KCQkJZWFjaChzdC5zcGxpdCgnOycpLCBmdW5jdGlvbih2KSB7DQoJCQkJdmFyIHN2LCB1ciA9IFtdOw0KDQoJCQkJaWYgKHYpIHsNCgkJCQkJdiA9IHYucmVwbGFjZSgvX01DRV9TRU1JXy9nLCAnOycpOyAvLyBSZXN0b3JlIGVudGl0aWVzDQoJCQkJCXYgPSB2LnJlcGxhY2UoL3VybFwoW15cKV0rXCkvZywgZnVuY3Rpb24odikge3VyLnB1c2godik7cmV0dXJuICd1cmwoJyArIHVyLmxlbmd0aCArICcpJzt9KTsNCgkJCQkJdiA9IHYuc3BsaXQoJzonKTsNCgkJCQkJc3YgPSB0aW55bWNlLnRyaW0odlsxXSk7DQoJCQkJCXN2ID0gc3YucmVwbGFjZSgvdXJsXCgoW15cKV0rKVwpL2csIGZ1bmN0aW9uKGEsIGIpIHtyZXR1cm4gdXJbcGFyc2VJbnQoYikgLSAxXTt9KTsNCg0KCQkJCQlzdiA9IHN2LnJlcGxhY2UoL3JnYlwoW15cKV0rXCkvZywgZnVuY3Rpb24odikgew0KCQkJCQkJcmV0dXJuIHQudG9IZXgodik7DQoJCQkJCX0pOw0KDQoJCQkJCWlmIChzLnVybF9jb252ZXJ0ZXIpIHsNCgkJCQkJCXN2ID0gc3YucmVwbGFjZSgvdXJsXChbXCdcIl0/KFteXClcJ1wiXSspW1wnXCJdP1wpL2csIGZ1bmN0aW9uKHgsIGMpIHsNCgkJCQkJCQlyZXR1cm4gJ3VybCgnICsgcy51cmxfY29udmVydGVyLmNhbGwocy51cmxfY29udmVydGVyX3Njb3BlIHx8IHQsIHQuZGVjb2RlKGMpLCAnc3R5bGUnLCBudWxsKSArICcpJzsNCgkJCQkJCX0pOw0KCQkJCQl9DQoNCgkJCQkJb1t0aW55bWNlLnRyaW0odlswXSkudG9Mb3dlckNhc2UoKV0gPSBzdjsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJY29tcHJlc3MoImJvcmRlciIsICIiLCAiYm9yZGVyIik7DQoJCQljb21wcmVzcygiYm9yZGVyIiwgIi13aWR0aCIsICJib3JkZXItd2lkdGgiKTsNCgkJCWNvbXByZXNzKCJib3JkZXIiLCAiLWNvbG9yIiwgImJvcmRlci1jb2xvciIpOw0KCQkJY29tcHJlc3MoImJvcmRlciIsICItc3R5bGUiLCAiYm9yZGVyLXN0eWxlIik7DQoJCQljb21wcmVzcygicGFkZGluZyIsICIiLCAicGFkZGluZyIpOw0KCQkJY29tcHJlc3MoIm1hcmdpbiIsICIiLCAibWFyZ2luIik7DQoJCQljb21wcmVzczIoJ2JvcmRlcicsICdib3JkZXItd2lkdGgnLCAnYm9yZGVyLXN0eWxlJywgJ2JvcmRlci1jb2xvcicpOw0KDQoJCQlpZiAoaXNJRSkgew0KCQkJCS8vIFJlbW92ZSBwb2ludGxlc3MgYm9yZGVyDQoJCQkJaWYgKG8uYm9yZGVyID09ICdtZWRpdW0gbm9uZScpDQoJCQkJCW8uYm9yZGVyID0gJyc7DQoJCQl9DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCXNlcmlhbGl6ZVN0eWxlIDogZnVuY3Rpb24obywgbmFtZSkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gJyc7DQoNCgkJCWZ1bmN0aW9uIGFkZCh2LCBrKSB7DQoJCQkJaWYgKGsgJiYgdikgew0KCQkJCQkvLyBSZW1vdmUgYnJvd3NlciBzcGVjaWZpYyBzdHlsZXMgbGlrZSAtbW96LSBvciAtd2Via2l0LQ0KCQkJCQlpZiAoay5pbmRleE9mKCctJykgPT09IDApDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJc3dpdGNoIChrKSB7DQoJCQkJCQljYXNlICdmb250LXdlaWdodCc6DQoJCQkJCQkJLy8gT3BlcmEgd2lsbCBvdXRwdXQgYm9sZCBhcyA3MDANCgkJCQkJCQlpZiAodiA9PSA3MDApDQoJCQkJCQkJCXYgPSAnYm9sZCc7DQoNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJY2FzZSAnY29sb3InOg0KCQkJCQkJY2FzZSAnYmFja2dyb3VuZC1jb2xvcic6DQoJCQkJCQkJdiA9IHYudG9Mb3dlckNhc2UoKTsNCgkJCQkJCQlicmVhazsNCgkJCQkJfQ0KDQoJCQkJCXMgKz0gKHMgPyAnICcgOiAnJykgKyBrICsgJzogJyArIHYgKyAnOyc7DQoJCQkJfQ0KCQkJfTsNCg0KCQkJLy8gVmFsaWRhdGUgc3R5bGUgb3V0cHV0DQoJCQlpZiAobmFtZSAmJiB0Ll9zdHlsZXMpIHsNCgkJCQllYWNoKHQuX3N0eWxlc1snKiddLCBmdW5jdGlvbihuYW1lKSB7DQoJCQkJCWFkZChvW25hbWVdLCBuYW1lKTsNCgkJCQl9KTsNCg0KCQkJCWVhY2godC5fc3R5bGVzW25hbWUudG9Mb3dlckNhc2UoKV0sIGZ1bmN0aW9uKG5hbWUpIHsNCgkJCQkJYWRkKG9bbmFtZV0sIG5hbWUpOw0KCQkJCX0pOw0KCQkJfSBlbHNlDQoJCQkJZWFjaChvLCBhZGQpOw0KDQoJCQlyZXR1cm4gczsNCgkJfSwNCg0KCQlsb2FkQ1NTIDogZnVuY3Rpb24odSkgew0KCQkJdmFyIHQgPSB0aGlzLCBkID0gdC5kb2MsIGhlYWQ7DQoNCgkJCWlmICghdSkNCgkJCQl1ID0gJyc7DQoNCgkJCWhlYWQgPSB0LnNlbGVjdCgnaGVhZCcpWzBdOw0KDQoJCQllYWNoKHUuc3BsaXQoJywnKSwgZnVuY3Rpb24odSkgew0KCQkJCXZhciBsaW5rOw0KDQoJCQkJaWYgKHQuZmlsZXNbdV0pDQoJCQkJCXJldHVybjsNCg0KCQkJCXQuZmlsZXNbdV0gPSB0cnVlOw0KCQkJCWxpbmsgPSB0LmNyZWF0ZSgnbGluaycsIHtyZWwgOiAnc3R5bGVzaGVldCcsIGhyZWYgOiB0aW55bWNlLl9hZGRWZXIodSl9KTsNCg0KCQkJCS8vIElFIDggaGFzIGEgYnVnIHdoZXJlIGR5bmFtaWNhbGx5IGxvYWRpbmcgc3R5bGVzaGVldHMgd291bGQgcHJvZHVjZSBhIDEgaXRlbSByZW1haW5pbmcgYnVnDQoJCQkJLy8gVGhpcyBmaXggc2VlbXMgdG8gcmVzb2x2ZSB0aGF0IGlzc3VlIGJ5IHJlYWxjaW5nIHRoZSBkb2N1bWVudCBvbmVzIGEgc3R5bGVzaGVldCBmaW5pc2hlcyBsb2FkaW5nDQoJCQkJLy8gSXQncyB1Z2x5IGJ1dCBpdCBzZWVtcyB0byB3b3JrIGZpbmUuDQoJCQkJaWYgKGlzSUUgJiYgZC5kb2N1bWVudE1vZGUgJiYgZC5yZWNhbGMpIHsNCgkJCQkJbGluay5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQkJCWQucmVjYWxjKCk7DQoJCQkJCQlsaW5rLm9ubG9hZCA9IG51bGw7DQoJCQkJCX07DQoJCQkJfQ0KDQoJCQkJaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsNCgkJCX0pOw0KCQl9LA0KDQoJCWFkZENsYXNzIDogZnVuY3Rpb24oZSwgYykgew0KCQkJcmV0dXJuIHRoaXMucnVuKGUsIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgbzsNCg0KCQkJCWlmICghYykNCgkJCQkJcmV0dXJuIDA7DQoNCgkJCQlpZiAodGhpcy5oYXNDbGFzcyhlLCBjKSkNCgkJCQkJcmV0dXJuIGUuY2xhc3NOYW1lOw0KDQoJCQkJbyA9IHRoaXMucmVtb3ZlQ2xhc3MoZSwgYyk7DQoNCgkJCQlyZXR1cm4gZS5jbGFzc05hbWUgPSAobyAhPSAnJyA/IChvICsgJyAnKSA6ICcnKSArIGM7DQoJCQl9KTsNCgkJfSwNCg0KCQlyZW1vdmVDbGFzcyA6IGZ1bmN0aW9uKGUsIGMpIHsNCgkJCXZhciB0ID0gdGhpcywgcmU7DQoNCgkJCXJldHVybiB0LnJ1bihlLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIHY7DQoNCgkJCQlpZiAodC5oYXNDbGFzcyhlLCBjKSkgew0KCQkJCQlpZiAoIXJlKQ0KCQkJCQkJcmUgPSBuZXcgUmVnRXhwKCIoXnxcXHMrKSIgKyBjICsgIihcXHMrfCQpIiwgImciKTsNCg0KCQkJCQl2ID0gZS5jbGFzc05hbWUucmVwbGFjZShyZSwgJyAnKTsNCgkJCQkJdiA9IHRpbnltY2UudHJpbSh2ICE9ICcgJyA/IHYgOiAnJyk7DQoNCgkJCQkJZS5jbGFzc05hbWUgPSB2Ow0KDQoJCQkJCS8vIEVtcHR5IGNsYXNzIGF0dHINCgkJCQkJaWYgKCF2KSB7DQoJCQkJCQllLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsNCgkJCQkJCWUucmVtb3ZlQXR0cmlidXRlKCdjbGFzc05hbWUnKTsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiB2Ow0KCQkJCX0NCg0KCQkJCXJldHVybiBlLmNsYXNzTmFtZTsNCgkJCX0pOw0KCQl9LA0KDQoJCWhhc0NsYXNzIDogZnVuY3Rpb24obiwgYykgew0KCQkJbiA9IHRoaXMuZ2V0KG4pOw0KDQoJCQlpZiAoIW4gfHwgIWMpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQlyZXR1cm4gKCcgJyArIG4uY2xhc3NOYW1lICsgJyAnKS5pbmRleE9mKCcgJyArIGMgKyAnICcpICE9PSAtMTsNCgkJfSwNCg0KCQlzaG93IDogZnVuY3Rpb24oZSkgew0KCQkJcmV0dXJuIHRoaXMuc2V0U3R5bGUoZSwgJ2Rpc3BsYXknLCAnYmxvY2snKTsNCgkJfSwNCg0KCQloaWRlIDogZnVuY3Rpb24oZSkgew0KCQkJcmV0dXJuIHRoaXMuc2V0U3R5bGUoZSwgJ2Rpc3BsYXknLCAnbm9uZScpOw0KCQl9LA0KDQoJCWlzSGlkZGVuIDogZnVuY3Rpb24oZSkgew0KCQkJZSA9IHRoaXMuZ2V0KGUpOw0KDQoJCQlyZXR1cm4gIWUgfHwgZS5zdHlsZS5kaXNwbGF5ID09ICdub25lJyB8fCB0aGlzLmdldFN0eWxlKGUsICdkaXNwbGF5JykgPT0gJ25vbmUnOw0KCQl9LA0KDQoJCXVuaXF1ZUlkIDogZnVuY3Rpb24ocCkgew0KCQkJcmV0dXJuICghcCA/ICdtY2VfJyA6IHApICsgKHRoaXMuY291bnRlcisrKTsNCgkJfSwNCg0KCQlzZXRIVE1MIDogZnVuY3Rpb24oZSwgaCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlyZXR1cm4gdGhpcy5ydW4oZSwgZnVuY3Rpb24oZSkgew0KCQkJCXZhciB4LCBpLCBubCwgbiwgcCwgeDsNCg0KCQkJCWggPSB0LnByb2Nlc3NIVE1MKGgpOw0KDQoJCQkJaWYgKGlzSUUpIHsNCgkJCQkJZnVuY3Rpb24gc2V0KCkgew0KCQkJCQkJLy8gUmVtb3ZlIGFsbCBjaGlsZCBub2Rlcw0KCQkJCQkJd2hpbGUgKGUuZmlyc3RDaGlsZCkNCgkJCQkJCQllLmZpcnN0Q2hpbGQucmVtb3ZlTm9kZSgpOw0KDQoJCQkJCQl0cnkgew0KCQkJCQkJCS8vIElFIHdpbGwgcmVtb3ZlIGNvbW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZw0KCQkJCQkJCS8vIHVubGVzcyB5b3UgcGFkZCB0aGUgY29udGVudHMgd2l0aCBzb21ldGhpbmcNCgkJCQkJCQllLmlubmVySFRNTCA9ICc8YnIgLz4nICsgaDsNCgkJCQkJCQllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7DQoJCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJCS8vIElFIHNvbWV0aW1lcyBwcm9kdWNlcyBhbiB1bmtub3duIHJ1bnRpbWUgZXJyb3Igb24gaW5uZXJIVE1MIGlmIGl0J3MgYW4gYmxvY2sgZWxlbWVudCB3aXRoaW4gYSBibG9jayBlbGVtZW50IGZvciBleGFtcGxlIGEgZGl2IGluc2lkZSBhIHANCgkJCQkJCQkvLyBUaGlzIHNlZW1zIHRvIGZpeCB0aGlzIHByb2JsZW0NCg0KCQkJCQkJCS8vIENyZWF0ZSBuZXcgZGl2IHdpdGggSFRNTCBjb250ZW50cyBhbmQgYSBCUiBpbmZyb250IHRvIGtlZXAgY29tbWVudHMNCgkJCQkJCQl4ID0gdC5jcmVhdGUoJ2RpdicpOw0KCQkJCQkJCXguaW5uZXJIVE1MID0gJzxiciAvPicgKyBoOw0KDQoJCQkJCQkJLy8gQWRkIGFsbCBjaGlsZHJlbiBmcm9tIGRpdiB0byB0YXJnZXQNCgkJCQkJCQllYWNoICh4LmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG4sIGkpIHsNCgkJCQkJCQkJLy8gU2tpcCBiciBlbGVtZW50DQoJCQkJCQkJCWlmIChpKQ0KCQkJCQkJCQkJZS5hcHBlbmRDaGlsZChuKTsNCgkJCQkJCQl9KTsNCgkJCQkJCX0NCgkJCQkJfTsNCg0KCQkJCQkvLyBJRSBoYXMgYSBzZXJpb3VzIGJ1ZyB3aGVuIGl0IGNvbWVzIHRvIHBhcmFncmFwaHMgaXQgY2FuIHByb2R1Y2UgYW4gaW52YWxpZA0KCQkJCQkvLyBET00gdHJlZSBpZiBjb250ZW50cyBsaWtlIHRoaXMgPHA+PHVsPjxsaT5JdGVtIDE8L2xpPjwvdWw+PC9wPiBpcyBpbnNlcnRlZA0KCQkJCQkvLyBJdCBzZWVtcyB0byBiZSB0aGF0IElFIGRvZXNuJ3QgbGlrZSBhIHJvb3QgYmxvY2sgZWxlbWVudCBwbGFjZWQgaW5zaWRlIGFub3RoZXIgcm9vdCBibG9jayBlbGVtZW50DQoJCQkJCWlmICh0LnNldHRpbmdzLmZpeF9pZV9wYXJhZ3JhcGhzKQ0KCQkJCQkJaCA9IGgucmVwbGFjZSgvPHA+PFwvcD58PHAoW14+XSspPjxcL3A+fDxwW15cLytdXC8+L2dpLCAnPHAkMSBfbWNlX2tlZXA9InRydWUiPiZuYnNwOzwvcD4nKTsNCg0KCQkJCQlzZXQoKTsNCg0KCQkJCQlpZiAodC5zZXR0aW5ncy5maXhfaWVfcGFyYWdyYXBocykgew0KCQkJCQkJLy8gQ2hlY2sgZm9yIG9kZCBwYXJhZ3JhcGhzIHRoaXMgaXMgYSBzaWduIG9mIGEgYnJva2VuIERPTQ0KCQkJCQkJbmwgPSBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwIik7DQoJCQkJCQlmb3IgKGkgPSBubC5sZW5ndGggLSAxLCB4ID0gMDsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJCQluID0gbmxbaV07DQoNCgkJCQkJCQlpZiAoIW4uaGFzQ2hpbGROb2RlcygpKSB7DQoJCQkJCQkJCWlmICghbi5fbWNlX2tlZXApIHsNCgkJCQkJCQkJCXggPSAxOyAvLyBJcyBicm9rZW4NCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJbi5yZW1vdmVBdHRyaWJ1dGUoJ19tY2Vfa2VlcCcpOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIFRpbWUgdG8gZml4IHRoZSBtYWRuZXNzIElFIGxlZnQgdXMNCgkJCQkJaWYgKHgpIHsNCgkJCQkJCS8vIFNvIGlmIHdlIHJlcGxhY2UgdGhlIHAgZWxlbWVudHMgd2l0aCBkaXZzIGFuZCBtYXJrIHRoZW0gYW5kIHRoZW4gcmVwbGFjZSB0aGVtIGJhY2sgdG8gcGFyYWdyYXBocw0KCQkJCQkJLy8gYWZ0ZXIgd2UgdXNlIGlubmVySFRNTCB3ZSBjYW4gZml4IHRoZSBET00gdHJlZQ0KCQkJCQkJaCA9IGgucmVwbGFjZSgvPHAgKFtePl0rKT58PHA+L2lnLCAnPGRpdiAkMSBfbWNlX3RtcD0iMSI+Jyk7DQoJCQkJCQloID0gaC5yZXBsYWNlKC88XC9wPi9naSwgJzwvZGl2PicpOw0KDQoJCQkJCQkvLyBTZXQgdGhlIG5ldyBIVE1MIHdpdGggRElWcw0KCQkJCQkJc2V0KCk7DQoNCgkJCQkJCS8vIFJlcGxhY2UgYWxsIERJViBlbGVtZW50cyB3aXRoIHRoZSBfbWNlX3RtcCBhdHRpYnV0ZSBiYWNrIHRvIHBhcmFncmFwaHMNCgkJCQkJCS8vIFRoaXMgaXMgbmVlZGVkIHNpbmNlIElFIGhhcyBhIGFubm95aW5nIGJ1ZyBzZWUgYWJvdmUgZm9yIGRldGFpbHMNCgkJCQkJCS8vIFRoaXMgaXMgYSBzbG93IHByb2Nlc3MgYnV0IGl0IGhhcyB0byBiZSBkb25lLiA6KA0KCQkJCQkJaWYgKHQuc2V0dGluZ3MuZml4X2llX3BhcmFncmFwaHMpIHsNCgkJCQkJCQlubCA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkRJViIpOw0KCQkJCQkJCWZvciAoaSA9IG5sLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQkJCW4gPSBubFtpXTsNCg0KCQkJCQkJCQkvLyBJcyBpdCBhIHRlbXAgZGl2DQoJCQkJCQkJCWlmIChuLl9tY2VfdG1wKSB7DQoJCQkJCQkJCQkvLyBDcmVhdGUgbmV3IHBhcmFncmFwaA0KCQkJCQkJCQkJcCA9IHQuZG9jLmNyZWF0ZUVsZW1lbnQoJ3AnKTsNCg0KCQkJCQkJCQkJLy8gQ29weSBhbGwgYXR0cmlidXRlcw0KCQkJCQkJCQkJbi5jbG9uZU5vZGUoZmFsc2UpLm91dGVySFRNTC5yZXBsYWNlKC8oW2EtejAtOVwtX10rKT0vZ2ksIGZ1bmN0aW9uKGEsIGIpIHsNCgkJCQkJCQkJCQl2YXIgdjsNCg0KCQkJCQkJCQkJCWlmIChiICE9PSAnX21jZV90bXAnKSB7DQoJCQkJCQkJCQkJCXYgPSBuLmdldEF0dHJpYnV0ZShiKTsNCg0KCQkJCQkJCQkJCQlpZiAoIXYgJiYgYiA9PT0gJ2NsYXNzJykNCgkJCQkJCQkJCQkJCXYgPSBuLmNsYXNzTmFtZTsNCg0KCQkJCQkJCQkJCQlwLnNldEF0dHJpYnV0ZShiLCB2KTsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQl9KTsNCg0KCQkJCQkJCQkJLy8gQXBwZW5kIGFsbCBjaGlsZHJlbiB0byBuZXcgcGFyYWdyYXBoDQoJCQkJCQkJCQlmb3IgKHggPSAwOyB4PG4uY2hpbGROb2Rlcy5sZW5ndGg7IHgrKykNCgkJCQkJCQkJCQlwLmFwcGVuZENoaWxkKG4uY2hpbGROb2Rlc1t4XS5jbG9uZU5vZGUodHJ1ZSkpOw0KDQoJCQkJCQkJCQkvLyBSZXBsYWNlIGRpdiB3aXRoIG5ldyBwYXJhZ3JhcGgNCgkJCQkJCQkJCW4uc3dhcE5vZGUocCk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9IGVsc2UNCgkJCQkJZS5pbm5lckhUTUwgPSBoOw0KDQoJCQkJcmV0dXJuIGg7DQoJCQl9KTsNCgkJfSwNCg0KCQlwcm9jZXNzSFRNTCA6IGZ1bmN0aW9uKGgpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGNvZGVCbG9ja3MgPSBbXTsNCg0KCQkJaWYgKCFzLnByb2Nlc3NfaHRtbCkNCgkJCQlyZXR1cm4gaDsNCg0KCQkJaWYgKGlzSUUpIHsNCgkJCQloID0gaC5yZXBsYWNlKC8mYXBvczsvZywgJyYjMzk7Jyk7IC8vIElFIGNhbid0IGhhbmRsZSBhcG9zDQoJCQkJaCA9IGgucmVwbGFjZSgvXHMrKGRpc2FibGVkfGNoZWNrZWR8cmVhZG9ubHl8c2VsZWN0ZWQpXHMqPVxzKltcIlwnXT8oZmFsc2V8MClbXCJcJ10/L2dpLCAnJyk7IC8vIElFIGRvZXNuJ3QgaGFuZGxlIGRlZmF1bHQgdmFsdWVzIGNvcnJlY3QNCgkJCX0NCg0KCQkJLy8gRm9yY2UgdGFncyBvcGVuLCBhbmQgb24gSUU5IHJlcGxhY2UgJDEkMiB0aGF0IGdvdCBsZWZ0IGJlaGluZCBkdWUgdG8gYnVncyBpbiB0aGVpciBSZWdFeHAgZW5naW5lDQoJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPGEoICkoW14+XSspXC8+fDxhXC8+L2dpLCAnPGEkMSQyPjwvYT4nLCBoKTsgLy8gRm9yY2Ugb3Blbg0KDQoJCQkvLyBTdG9yZSBhd2F5IHNyYyBhbmQgaHJlZiBpbiBfbWNlX3NyYyBhbmQgbWNlX2hyZWYgc2luY2UgYnJvd3NlcnMgbWVzcyB0aGVtIHVwDQoJCQlpZiAocy5rZWVwX3ZhbHVlcykgew0KCQkJCS8vIFdyYXAgc2NyaXB0cyBhbmQgc3R5bGVzIGluIGNvbW1lbnRzIGZvciBzZXJpYWxpemF0aW9uIHB1cnBvc2VzDQoJCQkJaWYgKC88c2NyaXB0fG5vc2NyaXB0fHN0eWxlL2kudGVzdChoKSkgew0KCQkJCQlmdW5jdGlvbiB0cmltKHMpIHsNCgkJCQkJCS8vIFJlbW92ZSBwcmVmaXggYW5kIHN1ZmZpeCBjb2RlIGZvciBlbGVtZW50DQoJCQkJCQlzID0gcy5yZXBsYWNlKC8oPCEtLVxbQ0RBVEFcW3xcXVxdLS0+KS9nLCAnXG4nKTsNCgkJCQkJCXMgPSBzLnJlcGxhY2UoL15bXHJcbl0qfFtcclxuXSokL2csICcnKTsNCgkJCQkJCXMgPSBzLnJlcGxhY2UoL15ccyooXC9cL1xzKjwhLS18XC9cL1xzKjwhXFtDREFUQVxbfDwhLS18PCFcW0NEQVRBXFspW1xyXG5dKi9nLCAnJyk7DQoJCQkJCQlzID0gcy5yZXBsYWNlKC9ccyooXC9cL1xzKlxdXF0+fFwvXC9ccyotLT58XF1cXT58LS0+fFxdXF0tLT4pXHMqJC9nLCAnJyk7DQoNCgkJCQkJCXJldHVybiBzOw0KCQkJCQl9Ow0KDQoJCQkJCS8vIFdyYXAgdGhlIHNjcmlwdCBjb250ZW50cyBpbiBDREFUQSBhbmQga2VlcCB0aGVtIGZyb20gZXhlY3V0aW5nDQoJCQkJCWggPSBoLnJlcGxhY2UoLzxzY3JpcHQoW14+XSt8KT4oW1xzXFNdKj8pPFwvc2NyaXB0Pi9naSwgZnVuY3Rpb24odiwgYXR0cmlicywgdGV4dCkgew0KCQkJCQkJLy8gRm9yY2UgdHlwZSBhdHRyaWJ1dGUNCgkJCQkJCWlmICghYXR0cmlicykNCgkJCQkJCQlhdHRyaWJzID0gJyB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiJzsNCg0KCQkJCQkJLy8gQ29udmVydCB0aGUgc3JjIGF0dHJpYnV0ZSBvZiB0aGUgc2NyaXB0cw0KCQkJCQkJYXR0cmlicyA9IGF0dHJpYnMucmVwbGFjZSgvc3JjPVwiKFteXCJdKylcIj8vaSwgZnVuY3Rpb24oYSwgdXJsKSB7DQoJCQkJCQkJaWYgKHMudXJsX2NvbnZlcnRlcikNCgkJCQkJCQkJdXJsID0gdC5lbmNvZGUocy51cmxfY29udmVydGVyLmNhbGwocy51cmxfY29udmVydGVyX3Njb3BlIHx8IHQsIHQuZGVjb2RlKHVybCksICdzcmMnLCAnc2NyaXB0JykpOw0KDQoJCQkJCQkJcmV0dXJuICdfbWNlX3NyYz0iJyArIHVybCArICciJzsNCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBXcmFwIHRleHQgY29udGVudHMNCgkJCQkJCWlmICh0aW55bWNlLnRyaW0odGV4dCkpIHsNCgkJCQkJCQljb2RlQmxvY2tzLnB1c2godHJpbSh0ZXh0KSk7DQoJCQkJCQkJdGV4dCA9ICc8IS0tXG5NQ0VfU0NSSVBUOicgKyAoY29kZUJsb2Nrcy5sZW5ndGggLSAxKSArICdcbi8vIC0tPic7DQoJCQkJCQl9DQoNCgkJCQkJCXJldHVybiAnPG1jZTpzY3JpcHQnICsgYXR0cmlicyArICc+JyArIHRleHQgKyAnPC9tY2U6c2NyaXB0Pic7DQoJCQkJCX0pOw0KDQoJCQkJCS8vIFdyYXAgc3R5bGUgZWxlbWVudHMNCgkJCQkJaCA9IGgucmVwbGFjZSgvPHN0eWxlKFtePl0rfCk+KFtcc1xTXSo/KTxcL3N0eWxlPi9naSwgZnVuY3Rpb24odiwgYXR0cmlicywgdGV4dCkgew0KCQkJCQkJLy8gV3JhcCB0ZXh0IGNvbnRlbnRzDQoJCQkJCQlpZiAodGV4dCkgew0KCQkJCQkJCWNvZGVCbG9ja3MucHVzaCh0cmltKHRleHQpKTsNCgkJCQkJCQl0ZXh0ID0gJzwhLS1cbk1DRV9TQ1JJUFQ6JyArIChjb2RlQmxvY2tzLmxlbmd0aCAtIDEpICsgJ1xuLS0+JzsNCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuICc8bWNlOnN0eWxlJyArIGF0dHJpYnMgKyAnPicgKyB0ZXh0ICsgJzwvbWNlOnN0eWxlPjxzdHlsZSAnICsgYXR0cmlicyArICcgX21jZV9ib2d1cz0iMSI+JyArIHRleHQgKyAnPC9zdHlsZT4nOw0KCQkJCQl9KTsNCg0KCQkJCQkvLyBXcmFwIG5vc2NyaXB0IGVsZW1lbnRzDQoJCQkJCWggPSBoLnJlcGxhY2UoLzxub3NjcmlwdChbXj5dK3wpPihbXHNcU10qPyk8XC9ub3NjcmlwdD4vZywgZnVuY3Rpb24odiwgYXR0cmlicywgdGV4dCkgew0KCQkJCQkJcmV0dXJuICc8bWNlOm5vc2NyaXB0JyArIGF0dHJpYnMgKyAnPjwhLS0nICsgdC5lbmNvZGUodGV4dCkucmVwbGFjZSgvLS0vZywgJyYjNDU7JiM0NTsnKSArICctLT48L21jZTpub3NjcmlwdD4nOw0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKylcXVxdPi9nLCAnPCEtLVtDREFUQVskMV1dLS0+JywgaCk7DQoNCgkJCQkvLyBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgYXR0cmlidXRlcyBpbiB0aGUgSFRNTCBzdHJpbmcgdG8gZm9yY2UgYm9vbGVhbg0KCQkJCS8vIGF0dHJpYnV0ZXMgdG8gdGhlIGF0dHI9ImF0dHIiIGZvcm1hdCBhbmQgY29udmVydCBzdHlsZSwgc3JjIGFuZCBocmVmIHRvIF9tY2VfIHZlcnNpb25zDQoJCQkJZnVuY3Rpb24gcHJvY2Vzc1RhZ3MoaHRtbCkgew0KCQkJCQlyZXR1cm4gaHRtbC5yZXBsYWNlKHRhZ1JlZ0V4cCwgZnVuY3Rpb24obWF0Y2gsIGVsbV9uYW1lLCBhdHRycywgZW5kKSB7DQoJCQkJCQlyZXR1cm4gJzwnICsgZWxtX25hbWUgKyBhdHRycy5yZXBsYWNlKGF0dHJSZWdFeHAsIGZ1bmN0aW9uKG1hdGNoLCBuYW1lLCB2YWx1ZSwgdmFsMiwgdmFsMykgew0KCQkJCQkJCXZhciBtY2VWYWx1ZTsNCg0KCQkJCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7DQoJCQkJCQkJdmFsdWUgPSB2YWx1ZSB8fCB2YWwyIHx8IHZhbDMgfHwgIiI7DQoNCgkJCQkJCQkvLyBUcmVhdCBib29sZWFuIGF0dHJpYnV0ZXMNCgkJCQkJCQlpZiAoYm9vbEF0dHJzW25hbWVdKSB7DQoJCQkJCQkJCS8vIGZhbHNlIG9yIDAgaXMgdHJlYXRlZCBhcyBhIG1pc3NpbmcgYXR0cmlidXRlDQoJCQkJCQkJCWlmICh2YWx1ZSA9PT0gJ2ZhbHNlJyB8fCB2YWx1ZSA9PT0gJzAnKQ0KCQkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJCXJldHVybiBuYW1lICsgJz0iJyArIG5hbWUgKyAnIic7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gSXMgYXR0cmlidXRlIG9uZSB0aGF0IG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50DQoJCQkJCQkJaWYgKG1jZUF0dHJpYnNbbmFtZV0gJiYgYXR0cnMuaW5kZXhPZignX21jZV8nICsgbmFtZSkgPT0gLTEpIHsNCgkJCQkJCQkJbWNlVmFsdWUgPSB0LmRlY29kZSh2YWx1ZSk7DQoNCgkJCQkJCQkJLy8gQ29udmVydCBVUkxzIHRvIHJlbGF0aXZlL2Fic29sdXRlIG9uZXMNCgkJCQkJCQkJaWYgKHMudXJsX2NvbnZlcnRlciAmJiAobmFtZSA9PSAic3JjIiB8fCBuYW1lID09ICJocmVmIikpDQoJCQkJCQkJCQltY2VWYWx1ZSA9IHMudXJsX2NvbnZlcnRlci5jYWxsKHMudXJsX2NvbnZlcnRlcl9zY29wZSB8fCB0LCBtY2VWYWx1ZSwgbmFtZSwgZWxtX25hbWUpOw0KDQoJCQkJCQkJCS8vIFByb2Nlc3Mgc3R5bGVzIGxvd2VyY2FzZXMgdGhlbSBhbmQgY29tcHJlc3NlcyB0aGVtDQoJCQkJCQkJCWlmIChuYW1lID09ICdzdHlsZScpDQoJCQkJCQkJCQltY2VWYWx1ZSA9IHQuc2VyaWFsaXplU3R5bGUodC5wYXJzZVN0eWxlKG1jZVZhbHVlKSwgbmFtZSk7DQoNCgkJCQkJCQkJcmV0dXJuIG5hbWUgKyAnPSInICsgdmFsdWUgKyAnIicgKyAnIF9tY2VfJyArIG5hbWUgKyAnPSInICsgdC5lbmNvZGUobWNlVmFsdWUpICsgJyInOw0KCQkJCQkJCX0NCg0KCQkJCQkJCXJldHVybiBtYXRjaDsNCgkJCQkJCX0pICsgZW5kICsgJz4nOw0KCQkJCQl9KTsNCgkJCQl9Ow0KDQoJCQkJaCA9IHByb2Nlc3NUYWdzKGgpOw0KDQoJCQkJLy8gUmVzdG9yZSBzY3JpcHQgYmxvY2tzDQoJCQkJaCA9IGgucmVwbGFjZSgvTUNFX1NDUklQVDooWzAtOV0rKS9nLCBmdW5jdGlvbih2YWwsIGlkeCkgew0KCQkJCQlyZXR1cm4gY29kZUJsb2Nrc1tpZHhdOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlyZXR1cm4gaDsNCgkJfSwNCg0KCQlnZXRPdXRlckhUTUwgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgZDsNCg0KCQkJZSA9IHRoaXMuZ2V0KGUpOw0KDQoJCQlpZiAoIWUpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCWlmIChlLm91dGVySFRNTCAhPT0gdW5kZWZpbmVkKQ0KCQkJCXJldHVybiBlLm91dGVySFRNTDsNCg0KCQkJZCA9IChlLm93bmVyRG9jdW1lbnQgfHwgdGhpcy5kb2MpLmNyZWF0ZUVsZW1lbnQoImJvZHkiKTsNCgkJCWQuYXBwZW5kQ2hpbGQoZS5jbG9uZU5vZGUodHJ1ZSkpOw0KDQoJCQlyZXR1cm4gZC5pbm5lckhUTUw7DQoJCX0sDQoNCgkJc2V0T3V0ZXJIVE1MIDogZnVuY3Rpb24oZSwgaCwgZCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlmdW5jdGlvbiBzZXRIVE1MKGUsIGgsIGQpIHsNCgkJCQl2YXIgbiwgdHA7DQoNCgkJCQl0cCA9IGQuY3JlYXRlRWxlbWVudCgiYm9keSIpOw0KCQkJCXRwLmlubmVySFRNTCA9IGg7DQoNCgkJCQluID0gdHAubGFzdENoaWxkOw0KCQkJCXdoaWxlIChuKSB7DQoJCQkJCXQuaW5zZXJ0QWZ0ZXIobi5jbG9uZU5vZGUodHJ1ZSksIGUpOw0KCQkJCQluID0gbi5wcmV2aW91c1NpYmxpbmc7DQoJCQkJfQ0KDQoJCQkJdC5yZW1vdmUoZSk7DQoJCQl9Ow0KDQoJCQlyZXR1cm4gdGhpcy5ydW4oZSwgZnVuY3Rpb24oZSkgew0KCQkJCWUgPSB0LmdldChlKTsNCg0KCQkJCS8vIE9ubHkgc2V0IEhUTUwgb24gZWxlbWVudHMNCgkJCQlpZiAoZS5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJCWQgPSBkIHx8IGUub3duZXJEb2N1bWVudCB8fCB0LmRvYzsNCg0KCQkJCQlpZiAoaXNJRSkgew0KCQkJCQkJdHJ5IHsNCgkJCQkJCQkvLyBUcnkgb3V0ZXJIVE1MIGZvciBJRSBpdCBzb21ldGltZXMgcHJvZHVjZXMgYW4gdW5rbm93biBydW50aW1lIGVycm9yDQoJCQkJCQkJaWYgKGlzSUUgJiYgZS5ub2RlVHlwZSA9PSAxKQ0KCQkJCQkJCQllLm91dGVySFRNTCA9IGg7DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCQlzZXRIVE1MKGUsIGgsIGQpOw0KCQkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCQkvLyBGaXggZm9yIHVua25vd24gcnVudGltZSBlcnJvcg0KCQkJCQkJCXNldEhUTUwoZSwgaCwgZCk7DQoJCQkJCQl9DQoJCQkJCX0gZWxzZQ0KCQkJCQkJc2V0SFRNTChlLCBoLCBkKTsNCgkJCQl9DQoJCQl9KTsNCgkJfSwNCg0KCQlkZWNvZGUgOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgZSwgbiwgdjsNCg0KCQkJLy8gTG9vayBmb3IgZW50aXRpZXMgdG8gZGVjb2RlDQoJCQlpZiAoLyZbXHcjXSs7Ly50ZXN0KHMpKSB7DQoJCQkJLy8gRGVjb2RlIHRoZSBlbnRpdGllcyB1c2luZyBhIGRpdiBlbGVtZW50IG5vdCBzdXBlciBlZmZpY2llbnQgYnV0IGxlc3MgY29kZQ0KCQkJCWUgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCgkJCQllLmlubmVySFRNTCA9IHM7DQoJCQkJbiA9IGUuZmlyc3RDaGlsZDsNCgkJCQl2ID0gJyc7DQoNCgkJCQlpZiAobikgew0KCQkJCQlkbyB7DQoJCQkJCQl2ICs9IG4ubm9kZVZhbHVlOw0KCQkJCQl9IHdoaWxlIChuID0gbi5uZXh0U2libGluZyk7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIHYgfHwgczsNCgkJCX0NCg0KCQkJcmV0dXJuIHM7DQoJCX0sDQoNCgkJZW5jb2RlIDogZnVuY3Rpb24oc3RyKSB7DQoJCQlyZXR1cm4gKCcnICsgc3RyKS5yZXBsYWNlKGVuY29kZUNoYXJzUmUsIGZ1bmN0aW9uKGNocikgew0KCQkJCXJldHVybiBlbmNvZGVkQ2hhcnNbY2hyXTsNCgkJCX0pOw0KCQl9LA0KDQoJCWluc2VydEFmdGVyIDogZnVuY3Rpb24obm9kZSwgcmVmZXJlbmNlX25vZGUpIHsNCgkJCXJlZmVyZW5jZV9ub2RlID0gdGhpcy5nZXQocmVmZXJlbmNlX25vZGUpOw0KDQoJCQlyZXR1cm4gdGhpcy5ydW4obm9kZSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCXZhciBwYXJlbnQsIG5leHRTaWJsaW5nOw0KDQoJCQkJcGFyZW50ID0gcmVmZXJlbmNlX25vZGUucGFyZW50Tm9kZTsNCgkJCQluZXh0U2libGluZyA9IHJlZmVyZW5jZV9ub2RlLm5leHRTaWJsaW5nOw0KDQoJCQkJaWYgKG5leHRTaWJsaW5nKQ0KCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHRTaWJsaW5nKTsNCgkJCQllbHNlDQoJCQkJCXBhcmVudC5hcHBlbmRDaGlsZChub2RlKTsNCg0KCQkJCXJldHVybiBub2RlOw0KCQkJfSk7DQoJCX0sDQoNCgkJaXNCbG9jayA6IGZ1bmN0aW9uKG4pIHsNCgkJCWlmIChuLm5vZGVUeXBlICYmIG4ubm9kZVR5cGUgIT09IDEpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQluID0gbi5ub2RlTmFtZSB8fCBuOw0KDQoJCQlyZXR1cm4gYmxvY2tSZS50ZXN0KG4pOw0KCQl9LA0KDQoJCXJlcGxhY2UgOiBmdW5jdGlvbihuLCBvLCBrKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWlmIChpcyhvLCAnYXJyYXknKSkNCgkJCQluID0gbi5jbG9uZU5vZGUodHJ1ZSk7DQoNCgkJCXJldHVybiB0LnJ1bihvLCBmdW5jdGlvbihvKSB7DQoJCQkJaWYgKGspIHsNCgkJCQkJZWFjaCh0aW55bWNlLmdyZXAoby5jaGlsZE5vZGVzKSwgZnVuY3Rpb24oYykgew0KCQkJCQkJbi5hcHBlbmRDaGlsZChjKTsNCgkJCQkJfSk7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIG8ucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobiwgbyk7DQoJCQl9KTsNCgkJfSwNCg0KCQlyZW5hbWUgOiBmdW5jdGlvbihlbG0sIG5hbWUpIHsNCgkJCXZhciB0ID0gdGhpcywgbmV3RWxtOw0KDQoJCQlpZiAoZWxtLm5vZGVOYW1lICE9IG5hbWUudG9VcHBlckNhc2UoKSkgew0KCQkJCS8vIFJlbmFtZSBibG9jayBlbGVtZW50DQoJCQkJbmV3RWxtID0gdC5jcmVhdGUobmFtZSk7DQoNCgkJCQkvLyBDb3B5IGF0dHJpYnMgdG8gbmV3IGJsb2NrDQoJCQkJZWFjaCh0LmdldEF0dHJpYnMoZWxtKSwgZnVuY3Rpb24oYXR0cl9ub2RlKSB7DQoJCQkJCXQuc2V0QXR0cmliKG5ld0VsbSwgYXR0cl9ub2RlLm5vZGVOYW1lLCB0LmdldEF0dHJpYihlbG0sIGF0dHJfbm9kZS5ub2RlTmFtZSkpOw0KCQkJCX0pOw0KDQoJCQkJLy8gUmVwbGFjZSBibG9jaw0KCQkJCXQucmVwbGFjZShuZXdFbG0sIGVsbSwgMSk7DQoJCQl9DQoNCgkJCXJldHVybiBuZXdFbG0gfHwgZWxtOw0KCQl9LA0KDQoJCWZpbmRDb21tb25BbmNlc3RvciA6IGZ1bmN0aW9uKGEsIGIpIHsNCgkJCXZhciBwcyA9IGEsIHBlOw0KDQoJCQl3aGlsZSAocHMpIHsNCgkJCQlwZSA9IGI7DQoNCgkJCQl3aGlsZSAocGUgJiYgcHMgIT0gcGUpDQoJCQkJCXBlID0gcGUucGFyZW50Tm9kZTsNCg0KCQkJCWlmIChwcyA9PSBwZSkNCgkJCQkJYnJlYWs7DQoNCgkJCQlwcyA9IHBzLnBhcmVudE5vZGU7DQoJCQl9DQoNCgkJCWlmICghcHMgJiYgYS5vd25lckRvY3VtZW50KQ0KCQkJCXJldHVybiBhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KDQoJCQlyZXR1cm4gcHM7DQoJCX0sDQoNCgkJdG9IZXggOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgYyA9IC9eXHMqcmdiXHMqP1woXHMqPyhbMC05XSspXHMqPyxccyo/KFswLTldKylccyo/LFxzKj8oWzAtOV0rKVxzKj9cKVxzKiQvaS5leGVjKHMpOw0KDQoJCQlmdW5jdGlvbiBoZXgocykgew0KCQkJCXMgPSBwYXJzZUludChzKS50b1N0cmluZygxNik7DQoNCgkJCQlyZXR1cm4gcy5sZW5ndGggPiAxID8gcyA6ICcwJyArIHM7IC8vIDAgLT4gMDANCgkJCX07DQoNCgkJCWlmIChjKSB7DQoJCQkJcyA9ICcjJyArIGhleChjWzFdKSArIGhleChjWzJdKSArIGhleChjWzNdKTsNCg0KCQkJCXJldHVybiBzOw0KCQkJfQ0KDQoJCQlyZXR1cm4gczsNCgkJfSwNCg0KCQlnZXRDbGFzc2VzIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNsID0gW10sIGksIGxvID0ge30sIGYgPSB0LnNldHRpbmdzLmNsYXNzX2ZpbHRlciwgb3Y7DQoNCgkJCWlmICh0LmNsYXNzZXMpDQoJCQkJcmV0dXJuIHQuY2xhc3NlczsNCg0KCQkJZnVuY3Rpb24gYWRkQ2xhc3NlcyhzKSB7DQoJCQkJLy8gSUUgc3R5bGUgaW1wb3J0cw0KCQkJCWVhY2gocy5pbXBvcnRzLCBmdW5jdGlvbihyKSB7DQoJCQkJCWFkZENsYXNzZXMocik7DQoJCQkJfSk7DQoNCgkJCQllYWNoKHMuY3NzUnVsZXMgfHwgcy5ydWxlcywgZnVuY3Rpb24ocikgew0KCQkJCQkvLyBSZWFsIHR5cGUgb3IgZmFrZSBpdCBvbiBJRQ0KCQkJCQlzd2l0Y2ggKHIudHlwZSB8fCAxKSB7DQoJCQkJCQkvLyBSdWxlDQoJCQkJCQljYXNlIDE6DQoJCQkJCQkJaWYgKHIuc2VsZWN0b3JUZXh0KSB7DQoJCQkJCQkJCWVhY2goci5zZWxlY3RvclRleHQuc3BsaXQoJywnKSwgZnVuY3Rpb24odikgew0KCQkJCQkJCQkJdiA9IHYucmVwbGFjZSgvXlxzKnxccyokfF5cc1wuL2csICIiKTsNCg0KCQkJCQkJCQkJLy8gSXMgaW50ZXJuYWwgb3IgaXQgZG9lc24ndCBjb250YWluIGEgY2xhc3MNCgkJCQkJCQkJCWlmICgvXC5tY2UvLnRlc3QodikgfHwgIS9cLltcd1wtXSskLy50ZXN0KHYpKQ0KCQkJCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJCQkJLy8gUmVtb3ZlIGV2ZXJ5dGhpbmcgYnV0IGNsYXNzIG5hbWUNCgkJCQkJCQkJCW92ID0gdjsNCgkJCQkJCQkJCXYgPSB0aW55bWNlLl9yZXBsYWNlKC8uKlwuKFthLXowLTlfXC1dKykuKi9pLCAnJDEnLCB2KTsNCg0KCQkJCQkJCQkJLy8gRmlsdGVyIGNsYXNzZXMNCgkJCQkJCQkJCWlmIChmICYmICEodiA9IGYodiwgb3YpKSkNCgkJCQkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCQkJCWlmICghbG9bdl0pIHsNCgkJCQkJCQkJCQljbC5wdXNoKHsnY2xhc3MnIDogdn0pOw0KCQkJCQkJCQkJCWxvW3ZdID0gMTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfSk7DQoJCQkJCQkJfQ0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQkvLyBJbXBvcnQNCgkJCQkJCWNhc2UgMzoNCgkJCQkJCQlhZGRDbGFzc2VzKHIuc3R5bGVTaGVldCk7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX07DQoNCgkJCXRyeSB7DQoJCQkJZWFjaCh0LmRvYy5zdHlsZVNoZWV0cywgYWRkQ2xhc3Nlcyk7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJCS8vIElnbm9yZQ0KCQkJfQ0KDQoJCQlpZiAoY2wubGVuZ3RoID4gMCkNCgkJCQl0LmNsYXNzZXMgPSBjbDsNCg0KCQkJcmV0dXJuIGNsOw0KCQl9LA0KDQoJCXJ1biA6IGZ1bmN0aW9uKGUsIGYsIHMpIHsNCgkJCXZhciB0ID0gdGhpcywgbzsNCg0KCQkJaWYgKHQuZG9jICYmIHR5cGVvZihlKSA9PT0gJ3N0cmluZycpDQoJCQkJZSA9IHQuZ2V0KGUpOw0KDQoJCQlpZiAoIWUpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQlzID0gcyB8fCB0aGlzOw0KCQkJaWYgKCFlLm5vZGVUeXBlICYmIChlLmxlbmd0aCB8fCBlLmxlbmd0aCA9PT0gMCkpIHsNCgkJCQlvID0gW107DQoNCgkJCQllYWNoKGUsIGZ1bmN0aW9uKGUsIGkpIHsNCgkJCQkJaWYgKGUpIHsNCgkJCQkJCWlmICh0eXBlb2YoZSkgPT0gJ3N0cmluZycpDQoJCQkJCQkJZSA9IHQuZG9jLmdldEVsZW1lbnRCeUlkKGUpOw0KDQoJCQkJCQlvLnB1c2goZi5jYWxsKHMsIGUsIGkpKTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIG87DQoJCQl9DQoNCgkJCXJldHVybiBmLmNhbGwocywgZSk7DQoJCX0sDQoNCgkJZ2V0QXR0cmlicyA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciBvOw0KDQoJCQluID0gdGhpcy5nZXQobik7DQoNCgkJCWlmICghbikNCgkJCQlyZXR1cm4gW107DQoNCgkJCWlmIChpc0lFKSB7DQoJCQkJbyA9IFtdOw0KDQoJCQkJLy8gT2JqZWN0IHdpbGwgdGhyb3cgZXhjZXB0aW9uIGluIElFDQoJCQkJaWYgKG4ubm9kZU5hbWUgPT0gJ09CSkVDVCcpDQoJCQkJCXJldHVybiBuLmF0dHJpYnV0ZXM7DQoNCgkJCQkvLyBJRSBkb2Vzbid0IGtlZXAgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZSBpZiB5b3UgY2xvbmUgb3B0aW9uIGVsZW1lbnRzDQoJCQkJaWYgKG4ubm9kZU5hbWUgPT09ICdPUFRJT04nICYmIHRoaXMuZ2V0QXR0cmliKG4sICdzZWxlY3RlZCcpKQ0KCQkJCQlvLnB1c2goe3NwZWNpZmllZCA6IDEsIG5vZGVOYW1lIDogJ3NlbGVjdGVkJ30pOw0KDQoJCQkJLy8gSXQncyBjcmF6eSB0aGF0IHRoaXMgaXMgZmFzdGVyIGluIElFIGJ1dCBpdCdzIGJlY2F1c2UgaXQgcmV0dXJucyBhbGwgYXR0cmlidXRlcyBhbGwgdGhlIHRpbWUNCgkJCQluLmNsb25lTm9kZShmYWxzZSkub3V0ZXJIVE1MLnJlcGxhY2UoLzxcLz9bXHc6XC1dKyA/fD1bXCJdW15cIl0rXCJ8PVwnW15cJ10rXCd8PVtcd1wtXSt8Pi9naSwgJycpLnJlcGxhY2UoL1tcdzpcLV0rL2dpLCBmdW5jdGlvbihhKSB7DQoJCQkJCW8ucHVzaCh7c3BlY2lmaWVkIDogMSwgbm9kZU5hbWUgOiBhfSk7DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm4gbzsNCgkJCX0NCg0KCQkJcmV0dXJuIG4uYXR0cmlidXRlczsNCgkJfSwNCg0KCQlkZXN0cm95IDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAodC5ldmVudHMpDQoJCQkJdC5ldmVudHMuZGVzdHJveSgpOw0KDQoJCQl0LndpbiA9IHQuZG9jID0gdC5yb290ID0gdC5ldmVudHMgPSBudWxsOw0KDQoJCQkvLyBNYW51YWwgZGVzdHJveSB0aGVuIHJlbW92ZSB1bmxvYWQgaGFuZGxlcg0KCQkJaWYgKCFzKQ0KCQkJCXRpbnltY2UucmVtb3ZlVW5sb2FkKHQuZGVzdHJveSk7DQoJCX0sDQoNCgkJY3JlYXRlUm5nIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgZCA9IHRoaXMuZG9jOw0KDQoJCQlyZXR1cm4gZC5jcmVhdGVSYW5nZSA/IGQuY3JlYXRlUmFuZ2UoKSA6IG5ldyB0aW55bWNlLmRvbS5SYW5nZSh0aGlzKTsNCgkJfSwNCg0KCQlub2RlSW5kZXggOiBmdW5jdGlvbihub2RlLCBub3JtYWxpemVkKSB7DQoJCQl2YXIgaWR4ID0gMCwgbGFzdE5vZGVUeXBlLCBsYXN0Tm9kZSwgbm9kZVR5cGU7DQoNCgkJCWlmIChub2RlKSB7DQoJCQkJZm9yIChsYXN0Tm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlLCBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcsIGxhc3ROb2RlID0gbm9kZTsgbm9kZTsgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSB7DQoJCQkJCW5vZGVUeXBlID0gbm9kZS5ub2RlVHlwZTsNCg0KCQkJCQkvLyBOb3JtYWxpemUgdGV4dCBub2Rlcw0KCQkJCQlpZiAobm9ybWFsaXplZCAmJiBub2RlVHlwZSA9PSAzKSB7DQoJCQkJCQlpZiAobm9kZVR5cGUgPT0gbGFzdE5vZGVUeXBlIHx8ICFub2RlLm5vZGVWYWx1ZS5sZW5ndGgpDQoJCQkJCQkJY29udGludWU7DQoJCQkJCX0NCg0KCQkJCQlpZHgrKzsNCgkJCQkJbGFzdE5vZGVUeXBlID0gbm9kZVR5cGU7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gaWR4Ow0KCQl9LA0KDQoJCXNwbGl0IDogZnVuY3Rpb24ocGUsIGUsIHJlKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHIgPSB0LmNyZWF0ZVJuZygpLCBiZWYsIGFmdCwgcGE7DQoNCgkJCS8vIFczQyB2YWxpZCBicm93c2VycyB0ZW5kIHRvIGxlYXZlIGVtcHR5IG5vZGVzIHRvIHRoZSBsZWZ0L3JpZ2h0IHNpZGUgb2YgdGhlIGNvbnRlbnRzLCB0aGlzIG1ha2VzIHNlbnNlDQoJCQkvLyBidXQgd2UgZG9uJ3Qgd2FudCB0aGF0IGluIG91ciBjb2RlIHNpbmNlIGl0IHNlcnZlcyBubyBwdXJwb3NlIGZvciB0aGUgZW5kIHVzZXINCgkJCS8vIEZvciBleGFtcGxlIGlmIHRoaXMgaXMgY2hvcHBlZDoNCgkJCS8vICAgPHA+dGV4dCAxPHNwYW4+PGI+Q0hPUDwvYj48L3NwYW4+dGV4dCAyPC9wPg0KCQkJLy8gd291bGQgcHJvZHVjZToNCgkJCS8vICAgPHA+dGV4dCAxPHNwYW4+PC9zcGFuPjwvcD48Yj5DSE9QPC9iPjxwPjxzcGFuPjwvc3Bhbj50ZXh0IDI8L3A+DQoJCQkvLyB0aGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiB0cmltIG9mIGVtcHR5IGVkZ2VzIGFuZCBwcm9kdWNlOg0KCQkJLy8gICA8cD50ZXh0IDE8L3A+PGI+Q0hPUDwvYj48cD50ZXh0IDI8L3A+DQoJCQlmdW5jdGlvbiB0cmltKG5vZGUpIHsNCgkJCQl2YXIgaSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7DQoNCgkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuZ2V0QXR0cmlidXRlKCdfbWNlX3R5cGUnKSA9PSAnYm9va21hcmsnKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlmb3IgKGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkNCgkJCQkJdHJpbShjaGlsZHJlbltpXSk7DQoNCgkJCQlpZiAobm9kZS5ub2RlVHlwZSAhPSA5KSB7DQoJCQkJCS8vIEtlZXAgbm9uIHdoaXRlc3BhY2UgdGV4dCBub2Rlcw0KCQkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmIG5vZGUubm9kZVZhbHVlLmxlbmd0aCA+IDApIHsNCgkJCQkJCS8vIElmIHBhcmVudCBlbGVtZW50IGlzbid0IGEgYmxvY2sgb3IgdGhlcmUgaXNuJ3QgYW55IHVzZWZ1bCBjb250ZW50cyBmb3IgZXhhbXBsZSAiPHA+ICAgPC9wPiINCgkJCQkJCWlmICghdC5pc0Jsb2NrKG5vZGUucGFyZW50Tm9kZSkgfHwgdGlueW1jZS50cmltKG5vZGUubm9kZVZhbHVlKS5sZW5ndGggPiAwKQ0KCQkJCQkJCXJldHVybjsNCgkJCQkJfQ0KDQoJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDEpIHsNCgkJCQkJCS8vIElmIHRoZSBvbmx5IGNoaWxkIGlzIGEgYm9va21hcmsgdGhlbiBtb3ZlIGl0IHVwDQoJCQkJCQljaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlczsNCgkJCQkJCWlmIChjaGlsZHJlbi5sZW5ndGggPT0gMSAmJiBjaGlsZHJlblswXSAmJiBjaGlsZHJlblswXS5ub2RlVHlwZSA9PSAxICYmIGNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZSgnX21jZV90eXBlJykgPT0gJ2Jvb2ttYXJrJykNCgkJCQkJCQlub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkcmVuWzBdLCBub2RlKTsNCg0KCQkJCQkJLy8gS2VlcCBub24gZW1wdHkgZWxlbWVudHMgb3IgaW1nLCBociBldGMNCgkJCQkJCWlmIChjaGlsZHJlbi5sZW5ndGggfHwgL14oYnJ8aHJ8aW5wdXR8aW1nKSQvaS50ZXN0KG5vZGUubm9kZU5hbWUpKQ0KCQkJCQkJCXJldHVybjsNCgkJCQkJfQ0KDQoJCQkJCXQucmVtb3ZlKG5vZGUpOw0KCQkJCX0NCg0KCQkJCXJldHVybiBub2RlOw0KCQkJfTsNCg0KCQkJaWYgKHBlICYmIGUpIHsNCgkJCQkvLyBHZXQgYmVmb3JlIGNodW5rDQoJCQkJci5zZXRTdGFydChwZS5wYXJlbnROb2RlLCB0Lm5vZGVJbmRleChwZSkpOw0KCQkJCXIuc2V0RW5kKGUucGFyZW50Tm9kZSwgdC5ub2RlSW5kZXgoZSkpOw0KCQkJCWJlZiA9IHIuZXh0cmFjdENvbnRlbnRzKCk7DQoNCgkJCQkvLyBHZXQgYWZ0ZXIgY2h1bmsNCgkJCQlyID0gdC5jcmVhdGVSbmcoKTsNCgkJCQlyLnNldFN0YXJ0KGUucGFyZW50Tm9kZSwgdC5ub2RlSW5kZXgoZSkgKyAxKTsNCgkJCQlyLnNldEVuZChwZS5wYXJlbnROb2RlLCB0Lm5vZGVJbmRleChwZSkgKyAxKTsNCgkJCQlhZnQgPSByLmV4dHJhY3RDb250ZW50cygpOw0KDQoJCQkJLy8gSW5zZXJ0IGJlZm9yZSBjaHVuaw0KCQkJCXBhID0gcGUucGFyZW50Tm9kZTsNCgkJCQlwYS5pbnNlcnRCZWZvcmUodHJpbShiZWYpLCBwZSk7DQoNCgkJCQkvLyBJbnNlcnQgbWlkZGxlIGNodW5rDQoJCQkJaWYgKHJlKQ0KCQkJCQlwYS5yZXBsYWNlQ2hpbGQocmUsIGUpOw0KCQkJCWVsc2UNCgkJCQkJcGEuaW5zZXJ0QmVmb3JlKGUsIHBlKTsNCg0KCQkJCS8vIEluc2VydCBhZnRlciBjaHVuaw0KCQkJCXBhLmluc2VydEJlZm9yZSh0cmltKGFmdCksIHBlKTsNCgkJCQl0LnJlbW92ZShwZSk7DQoNCgkJCQlyZXR1cm4gcmUgfHwgZTsNCgkJCX0NCgkJfSwNCg0KCQliaW5kIDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCBmdW5jLCBzY29wZSkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoIXQuZXZlbnRzKQ0KCQkJCXQuZXZlbnRzID0gbmV3IHRpbnltY2UuZG9tLkV2ZW50VXRpbHMoKTsNCg0KCQkJcmV0dXJuIHQuZXZlbnRzLmFkZCh0YXJnZXQsIG5hbWUsIGZ1bmMsIHNjb3BlIHx8IHRoaXMpOw0KCQl9LA0KDQoJCXVuYmluZCA6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgZnVuYykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoIXQuZXZlbnRzKQ0KCQkJCXQuZXZlbnRzID0gbmV3IHRpbnltY2UuZG9tLkV2ZW50VXRpbHMoKTsNCg0KCQkJcmV0dXJuIHQuZXZlbnRzLnJlbW92ZSh0YXJnZXQsIG5hbWUsIGZ1bmMpOw0KCQl9LA0KDQoNCgkJX2ZpbmRTaWIgOiBmdW5jdGlvbihub2RlLCBzZWxlY3RvciwgbmFtZSkgew0KCQkJdmFyIHQgPSB0aGlzLCBmID0gc2VsZWN0b3I7DQoNCgkJCWlmIChub2RlKSB7DQoJCQkJLy8gSWYgZXhwcmVzc2lvbiBtYWtlIGEgZnVuY3Rpb24gb2YgaXQgdXNpbmcgaXMNCgkJCQlpZiAoaXMoZiwgJ3N0cmluZycpKSB7DQoJCQkJCWYgPSBmdW5jdGlvbihub2RlKSB7DQoJCQkJCQlyZXR1cm4gdC5pcyhub2RlLCBzZWxlY3Rvcik7DQoJCQkJCX07DQoJCQkJfQ0KDQoJCQkJLy8gTG9vcCBhbGwgc2libGluZ3MNCgkJCQlmb3IgKG5vZGUgPSBub2RlW25hbWVdOyBub2RlOyBub2RlID0gbm9kZVtuYW1lXSkgew0KCQkJCQlpZiAoZihub2RlKSkNCgkJCQkJCXJldHVybiBub2RlOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIG51bGw7DQoJCX0sDQoNCgkJX2lzUmVzIDogZnVuY3Rpb24oYykgew0KCQkJLy8gSXMgbGl2ZSByZXNpemJsZSBlbGVtZW50DQoJCQlyZXR1cm4gL14odG9wfGxlZnR8Ym90dG9tfHJpZ2h0fHdpZHRofGhlaWdodCkvaS50ZXN0KGMpIHx8IC87XHMqKHRvcHxsZWZ0fGJvdHRvbXxyaWdodHx3aWR0aHxoZWlnaHQpL2kudGVzdChjKTsNCgkJfQ0KDQoJCS8qDQoJCXdhbGsgOiBmdW5jdGlvbihuLCBmLCBzKSB7DQoJCQl2YXIgZCA9IHRoaXMuZG9jLCB3Ow0KDQoJCQlpZiAoZC5jcmVhdGVUcmVlV2Fsa2VyKSB7DQoJCQkJdyA9IGQuY3JlYXRlVHJlZVdhbGtlcihuLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCwgbnVsbCwgZmFsc2UpOw0KDQoJCQkJd2hpbGUgKChuID0gdy5uZXh0Tm9kZSgpKSAhPSBudWxsKQ0KCQkJCQlmLmNhbGwocyB8fCB0aGlzLCBuKTsNCgkJCX0gZWxzZQ0KCQkJCXRpbnltY2Uud2FsayhuLCBmLCAnY2hpbGROb2RlcycsIHMpOw0KCQl9DQoJCSovDQoNCgkJLyoNCgkJdG9SR0IgOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgYyA9IC9eXHMqPyMoWzAtOUEtRl17Mn0pKFswLTlBLUZdezEsMn0pKFswLTlBLUZdezJ9KT9ccyo/JC8uZXhlYyhzKTsNCg0KCQkJaWYgKGMpIHsNCgkJCQkvLyAjRkZGIC0+ICNGRkZGRkYNCgkJCQlpZiAoIWlzKGNbM10pKQ0KCQkJCQljWzNdID0gY1syXSA9IGNbMV07DQoNCgkJCQlyZXR1cm4gInJnYigiICsgcGFyc2VJbnQoY1sxXSwgMTYpICsgIiwiICsgcGFyc2VJbnQoY1syXSwgMTYpICsgIiwiICsgcGFyc2VJbnQoY1szXSwgMTYpICsgIikiOw0KCQkJfQ0KDQoJCQlyZXR1cm4gczsNCgkJfQ0KCQkqLw0KCX0pOw0KDQoJdGlueW1jZS5ET00gPSBuZXcgdGlueW1jZS5kb20uRE9NVXRpbHMoZG9jdW1lbnQsIHtwcm9jZXNzX2h0bWwgOiAwfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKG5zKSB7DQoJLy8gUmFuZ2UgY29uc3RydWN0b3INCglmdW5jdGlvbiBSYW5nZShkb20pIHsNCgkJdmFyIHQgPSB0aGlzLA0KCQkJZG9jID0gZG9tLmRvYywNCgkJCUVYVFJBQ1QgPSAwLA0KCQkJQ0xPTkUgPSAxLA0KCQkJREVMRVRFID0gMiwNCgkJCVRSVUUgPSB0cnVlLA0KCQkJRkFMU0UgPSBmYWxzZSwNCgkJCVNUQVJUX09GRlNFVCA9ICdzdGFydE9mZnNldCcsDQoJCQlTVEFSVF9DT05UQUlORVIgPSAnc3RhcnRDb250YWluZXInLA0KCQkJRU5EX0NPTlRBSU5FUiA9ICdlbmRDb250YWluZXInLA0KCQkJRU5EX09GRlNFVCA9ICdlbmRPZmZzZXQnLA0KCQkJZXh0ZW5kID0gdGlueW1jZS5leHRlbmQsDQoJCQlub2RlSW5kZXggPSBkb20ubm9kZUluZGV4Ow0KDQoJCWV4dGVuZCh0LCB7DQoJCQkvLyBJbml0YWwgc3RhdGVzDQoJCQlzdGFydENvbnRhaW5lciA6IGRvYywNCgkJCXN0YXJ0T2Zmc2V0IDogMCwNCgkJCWVuZENvbnRhaW5lciA6IGRvYywNCgkJCWVuZE9mZnNldCA6IDAsDQoJCQljb2xsYXBzZWQgOiBUUlVFLA0KCQkJY29tbW9uQW5jZXN0b3JDb250YWluZXIgOiBkb2MsDQoNCgkJCS8vIFJhbmdlIGNvbnN0YW50cw0KCQkJU1RBUlRfVE9fU1RBUlQgOiAwLA0KCQkJU1RBUlRfVE9fRU5EIDogMSwNCgkJCUVORF9UT19FTkQgOiAyLA0KCQkJRU5EX1RPX1NUQVJUIDogMywNCg0KCQkJLy8gUHVibGljIG1ldGhvZHMNCgkJCXNldFN0YXJ0IDogc2V0U3RhcnQsDQoJCQlzZXRFbmQgOiBzZXRFbmQsDQoJCQlzZXRTdGFydEJlZm9yZSA6IHNldFN0YXJ0QmVmb3JlLA0KCQkJc2V0U3RhcnRBZnRlciA6IHNldFN0YXJ0QWZ0ZXIsDQoJCQlzZXRFbmRCZWZvcmUgOiBzZXRFbmRCZWZvcmUsDQoJCQlzZXRFbmRBZnRlciA6IHNldEVuZEFmdGVyLA0KCQkJY29sbGFwc2UgOiBjb2xsYXBzZSwNCgkJCXNlbGVjdE5vZGUgOiBzZWxlY3ROb2RlLA0KCQkJc2VsZWN0Tm9kZUNvbnRlbnRzIDogc2VsZWN0Tm9kZUNvbnRlbnRzLA0KCQkJY29tcGFyZUJvdW5kYXJ5UG9pbnRzIDogY29tcGFyZUJvdW5kYXJ5UG9pbnRzLA0KCQkJZGVsZXRlQ29udGVudHMgOiBkZWxldGVDb250ZW50cywNCgkJCWV4dHJhY3RDb250ZW50cyA6IGV4dHJhY3RDb250ZW50cywNCgkJCWNsb25lQ29udGVudHMgOiBjbG9uZUNvbnRlbnRzLA0KCQkJaW5zZXJ0Tm9kZSA6IGluc2VydE5vZGUsDQoJCQlzdXJyb3VuZENvbnRlbnRzIDogc3Vycm91bmRDb250ZW50cywNCgkJCWNsb25lUmFuZ2UgOiBjbG9uZVJhbmdlDQoJCX0pOw0KDQoJCWZ1bmN0aW9uIHNldFN0YXJ0KG4sIG8pIHsNCgkJCV9zZXRFbmRQb2ludChUUlVFLCBuLCBvKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZXRFbmQobiwgbykgew0KCQkJX3NldEVuZFBvaW50KEZBTFNFLCBuLCBvKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZXRTdGFydEJlZm9yZShuKSB7DQoJCQlzZXRTdGFydChuLnBhcmVudE5vZGUsIG5vZGVJbmRleChuKSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gc2V0U3RhcnRBZnRlcihuKSB7DQoJCQlzZXRTdGFydChuLnBhcmVudE5vZGUsIG5vZGVJbmRleChuKSArIDEpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHNldEVuZEJlZm9yZShuKSB7DQoJCQlzZXRFbmQobi5wYXJlbnROb2RlLCBub2RlSW5kZXgobikpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHNldEVuZEFmdGVyKG4pIHsNCgkJCXNldEVuZChuLnBhcmVudE5vZGUsIG5vZGVJbmRleChuKSArIDEpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGNvbGxhcHNlKHRzKSB7DQoJCQlpZiAodHMpIHsNCgkJCQl0W0VORF9DT05UQUlORVJdID0gdFtTVEFSVF9DT05UQUlORVJdOw0KCQkJCXRbRU5EX09GRlNFVF0gPSB0W1NUQVJUX09GRlNFVF07DQoJCQl9IGVsc2Ugew0KCQkJCXRbU1RBUlRfQ09OVEFJTkVSXSA9IHRbRU5EX0NPTlRBSU5FUl07DQoJCQkJdFtTVEFSVF9PRkZTRVRdID0gdFtFTkRfT0ZGU0VUXTsNCgkJCX0NCg0KCQkJdC5jb2xsYXBzZWQgPSBUUlVFOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHNlbGVjdE5vZGUobikgew0KCQkJc2V0U3RhcnRCZWZvcmUobik7DQoJCQlzZXRFbmRBZnRlcihuKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZWxlY3ROb2RlQ29udGVudHMobikgew0KCQkJc2V0U3RhcnQobiwgMCk7DQoJCQlzZXRFbmQobiwgbi5ub2RlVHlwZSA9PT0gMSA/IG4uY2hpbGROb2Rlcy5sZW5ndGggOiBuLm5vZGVWYWx1ZS5sZW5ndGgpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGNvbXBhcmVCb3VuZGFyeVBvaW50cyhoLCByKSB7DQoJCQl2YXIgc2MgPSB0W1NUQVJUX0NPTlRBSU5FUl0sIHNvID0gdFtTVEFSVF9PRkZTRVRdLCBlYyA9IHRbRU5EX0NPTlRBSU5FUl0sIGVvID0gdFtFTkRfT0ZGU0VUXTsNCg0KCQkJLy8gQ2hlY2sgU1RBUlRfVE9fU1RBUlQNCgkJCWlmIChoID09PSAwKQ0KCQkJCXJldHVybiBfY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHNjLCBzbywgc2MsIHNvKTsNCg0KCQkJLy8gQ2hlY2sgU1RBUlRfVE9fRU5EDQoJCQlpZiAoaCA9PT0gMSkNCgkJCQlyZXR1cm4gX2NvbXBhcmVCb3VuZGFyeVBvaW50cyhzYywgc28sIGVjLCBlbyk7DQoNCgkJCS8vIENoZWNrIEVORF9UT19FTkQNCgkJCWlmIChoID09PSAyKQ0KCQkJCXJldHVybiBfY29tcGFyZUJvdW5kYXJ5UG9pbnRzKGVjLCBlbywgZWMsIGVvKTsNCg0KCQkJLy8gQ2hlY2sgRU5EX1RPX1NUQVJUDQoJCQlpZiAoaCA9PT0gMykNCgkJCQlyZXR1cm4gX2NvbXBhcmVCb3VuZGFyeVBvaW50cyhlYywgZW8sIHNjLCBzbyk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZGVsZXRlQ29udGVudHMoKSB7DQoJCQlfdHJhdmVyc2UoREVMRVRFKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBleHRyYWN0Q29udGVudHMoKSB7DQoJCQlyZXR1cm4gX3RyYXZlcnNlKEVYVFJBQ1QpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGNsb25lQ29udGVudHMoKSB7DQoJCQlyZXR1cm4gX3RyYXZlcnNlKENMT05FKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBpbnNlcnROb2RlKG4pIHsNCgkJCXZhciBzdGFydENvbnRhaW5lciA9IHRoaXNbU1RBUlRfQ09OVEFJTkVSXSwNCgkJCQlzdGFydE9mZnNldCA9IHRoaXNbU1RBUlRfT0ZGU0VUXSwgbm4sIG87DQoNCgkJCS8vIE5vZGUgaXMgVEVYVF9OT0RFIG9yIENEQVRBDQoJCQlpZiAoKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSAzIHx8IHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSA0KSAmJiBzdGFydENvbnRhaW5lci5ub2RlVmFsdWUpIHsNCgkJCQlpZiAoIXN0YXJ0T2Zmc2V0KSB7DQoJCQkJCS8vIEF0IHRoZSBzdGFydCBvZiB0ZXh0DQoJCQkJCXN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG4sIHN0YXJ0Q29udGFpbmVyKTsNCgkJCQl9IGVsc2UgaWYgKHN0YXJ0T2Zmc2V0ID49IHN0YXJ0Q29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGgpIHsNCgkJCQkJLy8gQXQgdGhlIGVuZCBvZiB0ZXh0DQoJCQkJCWRvbS5pbnNlcnRBZnRlcihuLCBzdGFydENvbnRhaW5lcik7DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gTWlkZGxlLCBuZWVkIHRvIHNwbGl0DQoJCQkJCW5uID0gc3RhcnRDb250YWluZXIuc3BsaXRUZXh0KHN0YXJ0T2Zmc2V0KTsNCgkJCQkJc3RhcnRDb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobiwgbm4pOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJLy8gSW5zZXJ0IGVsZW1lbnQgbm9kZQ0KCQkJCWlmIChzdGFydENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCA+IDApDQoJCQkJCW8gPSBzdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3N0YXJ0T2Zmc2V0XTsNCg0KCQkJCWlmIChvKQ0KCQkJCQlzdGFydENvbnRhaW5lci5pbnNlcnRCZWZvcmUobiwgbyk7DQoJCQkJZWxzZQ0KCQkJCQlzdGFydENvbnRhaW5lci5hcHBlbmRDaGlsZChuKTsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBzdXJyb3VuZENvbnRlbnRzKG4pIHsNCgkJCXZhciBmID0gdC5leHRyYWN0Q29udGVudHMoKTsNCg0KCQkJdC5pbnNlcnROb2RlKG4pOw0KCQkJbi5hcHBlbmRDaGlsZChmKTsNCgkJCXQuc2VsZWN0Tm9kZShuKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBjbG9uZVJhbmdlKCkgew0KCQkJcmV0dXJuIGV4dGVuZChuZXcgUmFuZ2UoZG9tKSwgew0KCQkJCXN0YXJ0Q29udGFpbmVyIDogdFtTVEFSVF9DT05UQUlORVJdLA0KCQkJCXN0YXJ0T2Zmc2V0IDogdFtTVEFSVF9PRkZTRVRdLA0KCQkJCWVuZENvbnRhaW5lciA6IHRbRU5EX0NPTlRBSU5FUl0sDQoJCQkJZW5kT2Zmc2V0IDogdFtFTkRfT0ZGU0VUXSwNCgkJCQljb2xsYXBzZWQgOiB0LmNvbGxhcHNlZCwNCgkJCQljb21tb25BbmNlc3RvckNvbnRhaW5lciA6IHQuY29tbW9uQW5jZXN0b3JDb250YWluZXINCgkJCX0pOw0KCQl9Ow0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KDQoJCWZ1bmN0aW9uIF9nZXRTZWxlY3RlZE5vZGUoY29udGFpbmVyLCBvZmZzZXQpIHsNCgkJCXZhciBjaGlsZDsNCg0KCQkJaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PSAzIC8qIFRFWFRfTk9ERSAqLykNCgkJCQlyZXR1cm4gY29udGFpbmVyOw0KDQoJCQlpZiAob2Zmc2V0IDwgMCkNCgkJCQlyZXR1cm4gY29udGFpbmVyOw0KDQoJCQljaGlsZCA9IGNvbnRhaW5lci5maXJzdENoaWxkOw0KCQkJd2hpbGUgKGNoaWxkICYmIG9mZnNldCA+IDApIHsNCgkJCQktLW9mZnNldDsNCgkJCQljaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nOw0KCQkJfQ0KDQoJCQlpZiAoY2hpbGQpDQoJCQkJcmV0dXJuIGNoaWxkOw0KDQoJCQlyZXR1cm4gY29udGFpbmVyOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF9pc0NvbGxhcHNlZCgpIHsNCgkJCXJldHVybiAodFtTVEFSVF9DT05UQUlORVJdID09IHRbRU5EX0NPTlRBSU5FUl0gJiYgdFtTVEFSVF9PRkZTRVRdID09IHRbRU5EX09GRlNFVF0pOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF9jb21wYXJlQm91bmRhcnlQb2ludHMoY29udGFpbmVyQSwgb2Zmc2V0QSwgY29udGFpbmVyQiwgb2Zmc2V0Qikgew0KCQkJdmFyIGMsIG9mZnNldEMsIG4sIGNtblJvb3QsIGNoaWxkQSwgY2hpbGRCOw0KDQoJCQkvLyBJbiB0aGUgZmlyc3QgY2FzZSB0aGUgYm91bmRhcnktcG9pbnRzIGhhdmUgdGhlIHNhbWUgY29udGFpbmVyLiBBIGlzIGJlZm9yZSBCDQoJCQkvLyBpZiBpdHMgb2Zmc2V0IGlzIGxlc3MgdGhhbiB0aGUgb2Zmc2V0IG9mIEIsIEEgaXMgZXF1YWwgdG8gQiBpZiBpdHMgb2Zmc2V0IGlzDQoJCQkvLyBlcXVhbCB0byB0aGUgb2Zmc2V0IG9mIEIsIGFuZCBBIGlzIGFmdGVyIEIgaWYgaXRzIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gdGhlDQoJCQkvLyBvZmZzZXQgb2YgQi4NCgkJCWlmIChjb250YWluZXJBID09IGNvbnRhaW5lckIpIHsNCgkJCQlpZiAob2Zmc2V0QSA9PSBvZmZzZXRCKQ0KCQkJCQlyZXR1cm4gMDsgLy8gZXF1YWwNCg0KCQkJCWlmIChvZmZzZXRBIDwgb2Zmc2V0QikNCgkJCQkJcmV0dXJuIC0xOyAvLyBiZWZvcmUNCg0KCQkJCXJldHVybiAxOyAvLyBhZnRlcg0KCQkJfQ0KDQoJCQkvLyBJbiB0aGUgc2Vjb25kIGNhc2UgYSBjaGlsZCBub2RlIEMgb2YgdGhlIGNvbnRhaW5lciBvZiBBIGlzIGFuIGFuY2VzdG9yDQoJCQkvLyBjb250YWluZXIgb2YgQi4gSW4gdGhpcyBjYXNlLCBBIGlzIGJlZm9yZSBCIGlmIHRoZSBvZmZzZXQgb2YgQSBpcyBsZXNzIHRoYW4gb3INCgkJCS8vIGVxdWFsIHRvIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgbm9kZSBDIGFuZCBBIGlzIGFmdGVyIEIgb3RoZXJ3aXNlLg0KCQkJYyA9IGNvbnRhaW5lckI7DQoJCQl3aGlsZSAoYyAmJiBjLnBhcmVudE5vZGUgIT0gY29udGFpbmVyQSkNCgkJCQljID0gYy5wYXJlbnROb2RlOw0KDQoJCQlpZiAoYykgew0KCQkJCW9mZnNldEMgPSAwOw0KCQkJCW4gPSBjb250YWluZXJBLmZpcnN0Q2hpbGQ7DQoNCgkJCQl3aGlsZSAobiAhPSBjICYmIG9mZnNldEMgPCBvZmZzZXRBKSB7DQoJCQkJCW9mZnNldEMrKzsNCgkJCQkJbiA9IG4ubmV4dFNpYmxpbmc7DQoJCQkJfQ0KDQoJCQkJaWYgKG9mZnNldEEgPD0gb2Zmc2V0QykNCgkJCQkJcmV0dXJuIC0xOyAvLyBiZWZvcmUNCg0KCQkJCXJldHVybiAxOyAvLyBhZnRlcg0KCQkJfQ0KDQoJCQkvLyBJbiB0aGUgdGhpcmQgY2FzZSBhIGNoaWxkIG5vZGUgQyBvZiB0aGUgY29udGFpbmVyIG9mIEIgaXMgYW4gYW5jZXN0b3IgY29udGFpbmVyDQoJCQkvLyBvZiBBLiBJbiB0aGlzIGNhc2UsIEEgaXMgYmVmb3JlIEIgaWYgdGhlIGluZGV4IG9mIHRoZSBjaGlsZCBub2RlIEMgaXMgbGVzcyB0aGFuDQoJCQkvLyB0aGUgb2Zmc2V0IG9mIEIgYW5kIEEgaXMgYWZ0ZXIgQiBvdGhlcndpc2UuDQoJCQljID0gY29udGFpbmVyQTsNCgkJCXdoaWxlIChjICYmIGMucGFyZW50Tm9kZSAhPSBjb250YWluZXJCKSB7DQoJCQkJYyA9IGMucGFyZW50Tm9kZTsNCgkJCX0NCg0KCQkJaWYgKGMpIHsNCgkJCQlvZmZzZXRDID0gMDsNCgkJCQluID0gY29udGFpbmVyQi5maXJzdENoaWxkOw0KDQoJCQkJd2hpbGUgKG4gIT0gYyAmJiBvZmZzZXRDIDwgb2Zmc2V0Qikgew0KCQkJCQlvZmZzZXRDKys7DQoJCQkJCW4gPSBuLm5leHRTaWJsaW5nOw0KCQkJCX0NCg0KCQkJCWlmIChvZmZzZXRDIDwgb2Zmc2V0QikNCgkJCQkJcmV0dXJuIC0xOyAvLyBiZWZvcmUNCg0KCQkJCXJldHVybiAxOyAvLyBhZnRlcg0KCQkJfQ0KDQoJCQkvLyBJbiB0aGUgZm91cnRoIGNhc2UsIG5vbmUgb2YgdGhyZWUgb3RoZXIgY2FzZXMgaG9sZDogdGhlIGNvbnRhaW5lcnMgb2YgQSBhbmQgQg0KCQkJLy8gYXJlIHNpYmxpbmdzIG9yIGRlc2NlbmRhbnRzIG9mIHNpYmxpbmcgbm9kZXMuIEluIHRoaXMgY2FzZSwgQSBpcyBiZWZvcmUgQiBpZg0KCQkJLy8gdGhlIGNvbnRhaW5lciBvZiBBIGlzIGJlZm9yZSB0aGUgY29udGFpbmVyIG9mIEIgaW4gYSBwcmUtb3JkZXIgdHJhdmVyc2FsIG9mIHRoZQ0KCQkJLy8gUmFuZ2VzJyBjb250ZXh0IHRyZWUgYW5kIEEgaXMgYWZ0ZXIgQiBvdGhlcndpc2UuDQoJCQljbW5Sb290ID0gZG9tLmZpbmRDb21tb25BbmNlc3Rvcihjb250YWluZXJBLCBjb250YWluZXJCKTsNCgkJCWNoaWxkQSA9IGNvbnRhaW5lckE7DQoNCgkJCXdoaWxlIChjaGlsZEEgJiYgY2hpbGRBLnBhcmVudE5vZGUgIT0gY21uUm9vdCkNCgkJCQljaGlsZEEgPSBjaGlsZEEucGFyZW50Tm9kZTsNCg0KCQkJaWYgKCFjaGlsZEEpDQoJCQkJY2hpbGRBID0gY21uUm9vdDsNCg0KCQkJY2hpbGRCID0gY29udGFpbmVyQjsNCgkJCXdoaWxlIChjaGlsZEIgJiYgY2hpbGRCLnBhcmVudE5vZGUgIT0gY21uUm9vdCkNCgkJCQljaGlsZEIgPSBjaGlsZEIucGFyZW50Tm9kZTsNCg0KCQkJaWYgKCFjaGlsZEIpDQoJCQkJY2hpbGRCID0gY21uUm9vdDsNCg0KCQkJaWYgKGNoaWxkQSA9PSBjaGlsZEIpDQoJCQkJcmV0dXJuIDA7IC8vIGVxdWFsDQoNCgkJCW4gPSBjbW5Sb290LmZpcnN0Q2hpbGQ7DQoJCQl3aGlsZSAobikgew0KCQkJCWlmIChuID09IGNoaWxkQSkNCgkJCQkJcmV0dXJuIC0xOyAvLyBiZWZvcmUNCg0KCQkJCWlmIChuID09IGNoaWxkQikNCgkJCQkJcmV0dXJuIDE7IC8vIGFmdGVyDQoNCgkJCQluID0gbi5uZXh0U2libGluZzsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBfc2V0RW5kUG9pbnQoc3QsIG4sIG8pIHsNCgkJCXZhciBlYywgc2M7DQoNCgkJCWlmIChzdCkgew0KCQkJCXRbU1RBUlRfQ09OVEFJTkVSXSA9IG47DQoJCQkJdFtTVEFSVF9PRkZTRVRdID0gbzsNCgkJCX0gZWxzZSB7DQoJCQkJdFtFTkRfQ09OVEFJTkVSXSA9IG47DQoJCQkJdFtFTkRfT0ZGU0VUXSA9IG87DQoJCQl9DQoNCgkJCS8vIElmIG9uZSBib3VuZGFyeS1wb2ludCBvZiBhIFJhbmdlIGlzIHNldCB0byBoYXZlIGEgcm9vdCBjb250YWluZXINCgkJCS8vIG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgb25lIGZvciB0aGUgUmFuZ2UsIHRoZSBSYW5nZSBpcyBjb2xsYXBzZWQgdG8NCgkJCS8vIHRoZSBuZXcgcG9zaXRpb24uIFRoaXMgZW5mb3JjZXMgdGhlIHJlc3RyaWN0aW9uIHRoYXQgYm90aCBib3VuZGFyeS0NCgkJCS8vIHBvaW50cyBvZiBhIFJhbmdlIG11c3QgaGF2ZSB0aGUgc2FtZSByb290IGNvbnRhaW5lci4NCgkJCWVjID0gdFtFTkRfQ09OVEFJTkVSXTsNCgkJCXdoaWxlIChlYy5wYXJlbnROb2RlKQ0KCQkJCWVjID0gZWMucGFyZW50Tm9kZTsNCg0KCQkJc2MgPSB0W1NUQVJUX0NPTlRBSU5FUl07DQoJCQl3aGlsZSAoc2MucGFyZW50Tm9kZSkNCgkJCQlzYyA9IHNjLnBhcmVudE5vZGU7DQoNCgkJCWlmIChzYyA9PSBlYykgew0KCQkJCS8vIFRoZSBzdGFydCBwb3NpdGlvbiBvZiBhIFJhbmdlIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgYWZ0ZXIgdGhlDQoJCQkJLy8gZW5kIHBvc2l0aW9uLiBUbyBlbmZvcmNlIHRoaXMgcmVzdHJpY3Rpb24sIGlmIHRoZSBzdGFydCBpcyBzZXQgdG8NCgkJCQkvLyBiZSBhdCBhIHBvc2l0aW9uIGFmdGVyIHRoZSBlbmQsIHRoZSBSYW5nZSBpcyBjb2xsYXBzZWQgdG8gdGhhdA0KCQkJCS8vIHBvc2l0aW9uLg0KCQkJCWlmIChfY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHRbU1RBUlRfQ09OVEFJTkVSXSwgdFtTVEFSVF9PRkZTRVRdLCB0W0VORF9DT05UQUlORVJdLCB0W0VORF9PRkZTRVRdKSA+IDApDQoJCQkJCXQuY29sbGFwc2Uoc3QpOw0KCQkJfSBlbHNlDQoJCQkJdC5jb2xsYXBzZShzdCk7DQoNCgkJCXQuY29sbGFwc2VkID0gX2lzQ29sbGFwc2VkKCk7DQoJCQl0LmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyID0gZG9tLmZpbmRDb21tb25BbmNlc3Rvcih0W1NUQVJUX0NPTlRBSU5FUl0sIHRbRU5EX0NPTlRBSU5FUl0pOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZShob3cpIHsNCgkJCXZhciBjLCBlbmRDb250YWluZXJEZXB0aCA9IDAsIHN0YXJ0Q29udGFpbmVyRGVwdGggPSAwLCBwLCBkZXB0aERpZmYsIHN0YXJ0Tm9kZSwgZW5kTm9kZSwgc3AsIGVwOw0KDQoJCQlpZiAodFtTVEFSVF9DT05UQUlORVJdID09IHRbRU5EX0NPTlRBSU5FUl0pDQoJCQkJcmV0dXJuIF90cmF2ZXJzZVNhbWVDb250YWluZXIoaG93KTsNCg0KCQkJZm9yIChjID0gdFtFTkRfQ09OVEFJTkVSXSwgcCA9IGMucGFyZW50Tm9kZTsgcDsgYyA9IHAsIHAgPSBwLnBhcmVudE5vZGUpIHsNCgkJCQlpZiAocCA9PSB0W1NUQVJUX0NPTlRBSU5FUl0pDQoJCQkJCXJldHVybiBfdHJhdmVyc2VDb21tb25TdGFydENvbnRhaW5lcihjLCBob3cpOw0KDQoJCQkJKytlbmRDb250YWluZXJEZXB0aDsNCgkJCX0NCg0KCQkJZm9yIChjID0gdFtTVEFSVF9DT05UQUlORVJdLCBwID0gYy5wYXJlbnROb2RlOyBwOyBjID0gcCwgcCA9IHAucGFyZW50Tm9kZSkgew0KCQkJCWlmIChwID09IHRbRU5EX0NPTlRBSU5FUl0pDQoJCQkJCXJldHVybiBfdHJhdmVyc2VDb21tb25FbmRDb250YWluZXIoYywgaG93KTsNCg0KCQkJCSsrc3RhcnRDb250YWluZXJEZXB0aDsNCgkJCX0NCg0KCQkJZGVwdGhEaWZmID0gc3RhcnRDb250YWluZXJEZXB0aCAtIGVuZENvbnRhaW5lckRlcHRoOw0KDQoJCQlzdGFydE5vZGUgPSB0W1NUQVJUX0NPTlRBSU5FUl07DQoJCQl3aGlsZSAoZGVwdGhEaWZmID4gMCkgew0KCQkJCXN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlOw0KCQkJCWRlcHRoRGlmZi0tOw0KCQkJfQ0KDQoJCQllbmROb2RlID0gdFtFTkRfQ09OVEFJTkVSXTsNCgkJCXdoaWxlIChkZXB0aERpZmYgPCAwKSB7DQoJCQkJZW5kTm9kZSA9IGVuZE5vZGUucGFyZW50Tm9kZTsNCgkJCQlkZXB0aERpZmYrKzsNCgkJCX0NCg0KCQkJLy8gYXNjZW5kIHRoZSBhbmNlc3RvciBoaWVyYXJjaHkgdW50aWwgd2UgaGF2ZSBhIGNvbW1vbiBwYXJlbnQuDQoJCQlmb3IgKHNwID0gc3RhcnROb2RlLnBhcmVudE5vZGUsIGVwID0gZW5kTm9kZS5wYXJlbnROb2RlOyBzcCAhPSBlcDsgc3AgPSBzcC5wYXJlbnROb2RlLCBlcCA9IGVwLnBhcmVudE5vZGUpIHsNCgkJCQlzdGFydE5vZGUgPSBzcDsNCgkJCQllbmROb2RlID0gZXA7DQoJCQl9DQoNCgkJCXJldHVybiBfdHJhdmVyc2VDb21tb25BbmNlc3RvcnMoc3RhcnROb2RlLCBlbmROb2RlLCBob3cpOw0KCQl9Ow0KDQoJCSBmdW5jdGlvbiBfdHJhdmVyc2VTYW1lQ29udGFpbmVyKGhvdykgew0KCQkJdmFyIGZyYWcsIHMsIHN1YiwgbiwgY250LCBzaWJsaW5nLCB4ZmVyTm9kZTsNCg0KCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJZnJhZyA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQoNCgkJCS8vIElmIHNlbGVjdGlvbiBpcyBlbXB0eSwganVzdCByZXR1cm4gdGhlIGZyYWdtZW50DQoJCQlpZiAodFtTVEFSVF9PRkZTRVRdID09IHRbRU5EX09GRlNFVF0pDQoJCQkJcmV0dXJuIGZyYWc7DQoNCgkJCS8vIFRleHQgbm9kZSBuZWVkcyBzcGVjaWFsIGNhc2UgaGFuZGxpbmcNCgkJCWlmICh0W1NUQVJUX0NPTlRBSU5FUl0ubm9kZVR5cGUgPT0gMyAvKiBURVhUX05PREUgKi8pIHsNCgkJCQkvLyBnZXQgdGhlIHN1YnN0cmluZw0KCQkJCXMgPSB0W1NUQVJUX0NPTlRBSU5FUl0ubm9kZVZhbHVlOw0KCQkJCXN1YiA9IHMuc3Vic3RyaW5nKHRbU1RBUlRfT0ZGU0VUXSwgdFtFTkRfT0ZGU0VUXSk7DQoNCgkJCQkvLyBzZXQgdGhlIG9yaWdpbmFsIHRleHQgbm9kZSB0byBpdHMgbmV3IHZhbHVlDQoJCQkJaWYgKGhvdyAhPSBDTE9ORSkgew0KCQkJCQl0W1NUQVJUX0NPTlRBSU5FUl0uZGVsZXRlRGF0YSh0W1NUQVJUX09GRlNFVF0sIHRbRU5EX09GRlNFVF0gLSB0W1NUQVJUX09GRlNFVF0pOw0KDQoJCQkJCS8vIE5vdGhpbmcgaXMgcGFydGlhbGx5IHNlbGVjdGVkLCBzbyBjb2xsYXBzZSB0byBzdGFydCBwb2ludA0KCQkJCQl0LmNvbGxhcHNlKFRSVUUpOw0KCQkJCX0NCg0KCQkJCWlmIChob3cgPT0gREVMRVRFKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlmcmFnLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZShzdWIpKTsNCgkJCQlyZXR1cm4gZnJhZzsNCgkJCX0NCg0KCQkJLy8gQ29weSBub2RlcyBiZXR3ZWVuIHRoZSBzdGFydC9lbmQgb2Zmc2V0cy4NCgkJCW4gPSBfZ2V0U2VsZWN0ZWROb2RlKHRbU1RBUlRfQ09OVEFJTkVSXSwgdFtTVEFSVF9PRkZTRVRdKTsNCgkJCWNudCA9IHRbRU5EX09GRlNFVF0gLSB0W1NUQVJUX09GRlNFVF07DQoNCgkJCXdoaWxlIChjbnQgPiAwKSB7DQoJCQkJc2libGluZyA9IG4ubmV4dFNpYmxpbmc7DQoJCQkJeGZlck5vZGUgPSBfdHJhdmVyc2VGdWxseVNlbGVjdGVkKG4sIGhvdyk7DQoNCgkJCQlpZiAoZnJhZykNCgkJCQkJZnJhZy5hcHBlbmRDaGlsZCggeGZlck5vZGUgKTsNCg0KCQkJCS0tY250Ow0KCQkJCW4gPSBzaWJsaW5nOw0KCQkJfQ0KDQoJCQkvLyBOb3RoaW5nIGlzIHBhcnRpYWxseSBzZWxlY3RlZCwgc28gY29sbGFwc2UgdG8gc3RhcnQgcG9pbnQNCgkJCWlmIChob3cgIT0gQ0xPTkUpDQoJCQkJdC5jb2xsYXBzZShUUlVFKTsNCg0KCQkJcmV0dXJuIGZyYWc7DQoJCX07DQoNCgkJZnVuY3Rpb24gX3RyYXZlcnNlQ29tbW9uU3RhcnRDb250YWluZXIoZW5kQW5jZXN0b3IsIGhvdykgew0KCQkJdmFyIGZyYWcsIG4sIGVuZElkeCwgY250LCBzaWJsaW5nLCB4ZmVyTm9kZTsNCg0KCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJZnJhZyA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQoNCgkJCW4gPSBfdHJhdmVyc2VSaWdodEJvdW5kYXJ5KGVuZEFuY2VzdG9yLCBob3cpOw0KDQoJCQlpZiAoZnJhZykNCgkJCQlmcmFnLmFwcGVuZENoaWxkKG4pOw0KDQoJCQllbmRJZHggPSBub2RlSW5kZXgoZW5kQW5jZXN0b3IpOw0KCQkJY250ID0gZW5kSWR4IC0gdFtTVEFSVF9PRkZTRVRdOw0KDQoJCQlpZiAoY250IDw9IDApIHsNCgkJCQkvLyBDb2xsYXBzZSB0byBqdXN0IGJlZm9yZSB0aGUgZW5kQW5jZXN0b3IsIHdoaWNoDQoJCQkJLy8gaXMgcGFydGlhbGx5IHNlbGVjdGVkLg0KCQkJCWlmIChob3cgIT0gQ0xPTkUpIHsNCgkJCQkJdC5zZXRFbmRCZWZvcmUoZW5kQW5jZXN0b3IpOw0KCQkJCQl0LmNvbGxhcHNlKEZBTFNFKTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gZnJhZzsNCgkJCX0NCg0KCQkJbiA9IGVuZEFuY2VzdG9yLnByZXZpb3VzU2libGluZzsNCgkJCXdoaWxlIChjbnQgPiAwKSB7DQoJCQkJc2libGluZyA9IG4ucHJldmlvdXNTaWJsaW5nOw0KCQkJCXhmZXJOb2RlID0gX3RyYXZlcnNlRnVsbHlTZWxlY3RlZChuLCBob3cpOw0KDQoJCQkJaWYgKGZyYWcpDQoJCQkJCWZyYWcuaW5zZXJ0QmVmb3JlKHhmZXJOb2RlLCBmcmFnLmZpcnN0Q2hpbGQpOw0KDQoJCQkJLS1jbnQ7DQoJCQkJbiA9IHNpYmxpbmc7DQoJCQl9DQoNCgkJCS8vIENvbGxhcHNlIHRvIGp1c3QgYmVmb3JlIHRoZSBlbmRBbmNlc3Rvciwgd2hpY2gNCgkJCS8vIGlzIHBhcnRpYWxseSBzZWxlY3RlZC4NCgkJCWlmIChob3cgIT0gQ0xPTkUpIHsNCgkJCQl0LnNldEVuZEJlZm9yZShlbmRBbmNlc3Rvcik7DQoJCQkJdC5jb2xsYXBzZShGQUxTRSk7DQoJCQl9DQoNCgkJCXJldHVybiBmcmFnOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZUNvbW1vbkVuZENvbnRhaW5lcihzdGFydEFuY2VzdG9yLCBob3cpIHsNCgkJCXZhciBmcmFnLCBzdGFydElkeCwgbiwgY250LCBzaWJsaW5nLCB4ZmVyTm9kZTsNCg0KCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJZnJhZyA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQoNCgkJCW4gPSBfdHJhdmVyc2VMZWZ0Qm91bmRhcnkoc3RhcnRBbmNlc3RvciwgaG93KTsNCgkJCWlmIChmcmFnKQ0KCQkJCWZyYWcuYXBwZW5kQ2hpbGQobik7DQoNCgkJCXN0YXJ0SWR4ID0gbm9kZUluZGV4KHN0YXJ0QW5jZXN0b3IpOw0KCQkJKytzdGFydElkeDsgIC8vIEJlY2F1c2Ugd2UgYWxyZWFkeSB0cmF2ZXJzZWQgaXQuLi4uDQoNCgkJCWNudCA9IHRbRU5EX09GRlNFVF0gLSBzdGFydElkeDsNCgkJCW4gPSBzdGFydEFuY2VzdG9yLm5leHRTaWJsaW5nOw0KCQkJd2hpbGUgKGNudCA+IDApIHsNCgkJCQlzaWJsaW5nID0gbi5uZXh0U2libGluZzsNCgkJCQl4ZmVyTm9kZSA9IF90cmF2ZXJzZUZ1bGx5U2VsZWN0ZWQobiwgaG93KTsNCg0KCQkJCWlmIChmcmFnKQ0KCQkJCQlmcmFnLmFwcGVuZENoaWxkKHhmZXJOb2RlKTsNCg0KCQkJCS0tY250Ow0KCQkJCW4gPSBzaWJsaW5nOw0KCQkJfQ0KDQoJCQlpZiAoaG93ICE9IENMT05FKSB7DQoJCQkJdC5zZXRTdGFydEFmdGVyKHN0YXJ0QW5jZXN0b3IpOw0KCQkJCXQuY29sbGFwc2UoVFJVRSk7DQoJCQl9DQoNCgkJCXJldHVybiBmcmFnOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZUNvbW1vbkFuY2VzdG9ycyhzdGFydEFuY2VzdG9yLCBlbmRBbmNlc3RvciwgaG93KSB7DQoJCQl2YXIgbiwgZnJhZywgY29tbW9uUGFyZW50LCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0LCBjbnQsIHNpYmxpbmcsIG5leHRTaWJsaW5nOw0KDQoJCQlpZiAoaG93ICE9IERFTEVURSkNCgkJCQlmcmFnID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsNCg0KCQkJbiA9IF90cmF2ZXJzZUxlZnRCb3VuZGFyeShzdGFydEFuY2VzdG9yLCBob3cpOw0KCQkJaWYgKGZyYWcpDQoJCQkJZnJhZy5hcHBlbmRDaGlsZChuKTsNCg0KCQkJY29tbW9uUGFyZW50ID0gc3RhcnRBbmNlc3Rvci5wYXJlbnROb2RlOw0KCQkJc3RhcnRPZmZzZXQgPSBub2RlSW5kZXgoc3RhcnRBbmNlc3Rvcik7DQoJCQllbmRPZmZzZXQgPSBub2RlSW5kZXgoZW5kQW5jZXN0b3IpOw0KCQkJKytzdGFydE9mZnNldDsNCg0KCQkJY250ID0gZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQ7DQoJCQlzaWJsaW5nID0gc3RhcnRBbmNlc3Rvci5uZXh0U2libGluZzsNCg0KCQkJd2hpbGUgKGNudCA+IDApIHsNCgkJCQluZXh0U2libGluZyA9IHNpYmxpbmcubmV4dFNpYmxpbmc7DQoJCQkJbiA9IF90cmF2ZXJzZUZ1bGx5U2VsZWN0ZWQoc2libGluZywgaG93KTsNCg0KCQkJCWlmIChmcmFnKQ0KCQkJCQlmcmFnLmFwcGVuZENoaWxkKG4pOw0KDQoJCQkJc2libGluZyA9IG5leHRTaWJsaW5nOw0KCQkJCS0tY250Ow0KCQkJfQ0KDQoJCQluID0gX3RyYXZlcnNlUmlnaHRCb3VuZGFyeShlbmRBbmNlc3RvciwgaG93KTsNCg0KCQkJaWYgKGZyYWcpDQoJCQkJZnJhZy5hcHBlbmRDaGlsZChuKTsNCg0KCQkJaWYgKGhvdyAhPSBDTE9ORSkgew0KCQkJCXQuc2V0U3RhcnRBZnRlcihzdGFydEFuY2VzdG9yKTsNCgkJCQl0LmNvbGxhcHNlKFRSVUUpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZnJhZzsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VSaWdodEJvdW5kYXJ5KHJvb3QsIGhvdykgew0KCQkJdmFyIG5leHQgPSBfZ2V0U2VsZWN0ZWROb2RlKHRbRU5EX0NPTlRBSU5FUl0sIHRbRU5EX09GRlNFVF0gLSAxKSwgcGFyZW50LCBjbG9uZWRQYXJlbnQsIHByZXZTaWJsaW5nLCBjbG9uZWRDaGlsZCwgY2xvbmVkR3JhbmRQYXJlbnQsIGlzRnVsbHlTZWxlY3RlZCA9IG5leHQgIT0gdFtFTkRfQ09OVEFJTkVSXTsNCg0KCQkJaWYgKG5leHQgPT0gcm9vdCkNCgkJCQlyZXR1cm4gX3RyYXZlcnNlTm9kZShuZXh0LCBpc0Z1bGx5U2VsZWN0ZWQsIEZBTFNFLCBob3cpOw0KDQoJCQlwYXJlbnQgPSBuZXh0LnBhcmVudE5vZGU7DQoJCQljbG9uZWRQYXJlbnQgPSBfdHJhdmVyc2VOb2RlKHBhcmVudCwgRkFMU0UsIEZBTFNFLCBob3cpOw0KDQoJCQl3aGlsZSAocGFyZW50KSB7DQoJCQkJd2hpbGUgKG5leHQpIHsNCgkJCQkJcHJldlNpYmxpbmcgPSBuZXh0LnByZXZpb3VzU2libGluZzsNCgkJCQkJY2xvbmVkQ2hpbGQgPSBfdHJhdmVyc2VOb2RlKG5leHQsIGlzRnVsbHlTZWxlY3RlZCwgRkFMU0UsIGhvdyk7DQoNCgkJCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJCQljbG9uZWRQYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lZENoaWxkLCBjbG9uZWRQYXJlbnQuZmlyc3RDaGlsZCk7DQoNCgkJCQkJaXNGdWxseVNlbGVjdGVkID0gVFJVRTsNCgkJCQkJbmV4dCA9IHByZXZTaWJsaW5nOw0KCQkJCX0NCg0KCQkJCWlmIChwYXJlbnQgPT0gcm9vdCkNCgkJCQkJcmV0dXJuIGNsb25lZFBhcmVudDsNCg0KCQkJCW5leHQgPSBwYXJlbnQucHJldmlvdXNTaWJsaW5nOw0KCQkJCXBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOw0KDQoJCQkJY2xvbmVkR3JhbmRQYXJlbnQgPSBfdHJhdmVyc2VOb2RlKHBhcmVudCwgRkFMU0UsIEZBTFNFLCBob3cpOw0KDQoJCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJCWNsb25lZEdyYW5kUGFyZW50LmFwcGVuZENoaWxkKGNsb25lZFBhcmVudCk7DQoNCgkJCQljbG9uZWRQYXJlbnQgPSBjbG9uZWRHcmFuZFBhcmVudDsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VMZWZ0Qm91bmRhcnkocm9vdCwgaG93KSB7DQoJCQl2YXIgbmV4dCA9IF9nZXRTZWxlY3RlZE5vZGUodFtTVEFSVF9DT05UQUlORVJdLCB0W1NUQVJUX09GRlNFVF0pLCBpc0Z1bGx5U2VsZWN0ZWQgPSBuZXh0ICE9IHRbU1RBUlRfQ09OVEFJTkVSXSwgcGFyZW50LCBjbG9uZWRQYXJlbnQsIG5leHRTaWJsaW5nLCBjbG9uZWRDaGlsZCwgY2xvbmVkR3JhbmRQYXJlbnQ7DQoNCgkJCWlmIChuZXh0ID09IHJvb3QpDQoJCQkJcmV0dXJuIF90cmF2ZXJzZU5vZGUobmV4dCwgaXNGdWxseVNlbGVjdGVkLCBUUlVFLCBob3cpOw0KDQoJCQlwYXJlbnQgPSBuZXh0LnBhcmVudE5vZGU7DQoJCQljbG9uZWRQYXJlbnQgPSBfdHJhdmVyc2VOb2RlKHBhcmVudCwgRkFMU0UsIFRSVUUsIGhvdyk7DQoNCgkJCXdoaWxlIChwYXJlbnQpIHsNCgkJCQl3aGlsZSAobmV4dCkgew0KCQkJCQluZXh0U2libGluZyA9IG5leHQubmV4dFNpYmxpbmc7DQoJCQkJCWNsb25lZENoaWxkID0gX3RyYXZlcnNlTm9kZShuZXh0LCBpc0Z1bGx5U2VsZWN0ZWQsIFRSVUUsIGhvdyk7DQoNCgkJCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJCQljbG9uZWRQYXJlbnQuYXBwZW5kQ2hpbGQoY2xvbmVkQ2hpbGQpOw0KDQoJCQkJCWlzRnVsbHlTZWxlY3RlZCA9IFRSVUU7DQoJCQkJCW5leHQgPSBuZXh0U2libGluZzsNCgkJCQl9DQoNCgkJCQlpZiAocGFyZW50ID09IHJvb3QpDQoJCQkJCXJldHVybiBjbG9uZWRQYXJlbnQ7DQoNCgkJCQluZXh0ID0gcGFyZW50Lm5leHRTaWJsaW5nOw0KCQkJCXBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOw0KDQoJCQkJY2xvbmVkR3JhbmRQYXJlbnQgPSBfdHJhdmVyc2VOb2RlKHBhcmVudCwgRkFMU0UsIFRSVUUsIGhvdyk7DQoNCgkJCQlpZiAoaG93ICE9IERFTEVURSkNCgkJCQkJY2xvbmVkR3JhbmRQYXJlbnQuYXBwZW5kQ2hpbGQoY2xvbmVkUGFyZW50KTsNCg0KCQkJCWNsb25lZFBhcmVudCA9IGNsb25lZEdyYW5kUGFyZW50Ow0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZU5vZGUobiwgaXNGdWxseVNlbGVjdGVkLCBpc0xlZnQsIGhvdykgew0KCQkJdmFyIHR4dFZhbHVlLCBuZXdOb2RlVmFsdWUsIG9sZE5vZGVWYWx1ZSwgb2Zmc2V0LCBuZXdOb2RlOw0KDQoJCQlpZiAoaXNGdWxseVNlbGVjdGVkKQ0KCQkJCXJldHVybiBfdHJhdmVyc2VGdWxseVNlbGVjdGVkKG4sIGhvdyk7DQoNCgkJCWlmIChuLm5vZGVUeXBlID09IDMgLyogVEVYVF9OT0RFICovKSB7DQoJCQkJdHh0VmFsdWUgPSBuLm5vZGVWYWx1ZTsNCg0KCQkJCWlmIChpc0xlZnQpIHsNCgkJCQkJb2Zmc2V0ID0gdFtTVEFSVF9PRkZTRVRdOw0KCQkJCQluZXdOb2RlVmFsdWUgPSB0eHRWYWx1ZS5zdWJzdHJpbmcob2Zmc2V0KTsNCgkJCQkJb2xkTm9kZVZhbHVlID0gdHh0VmFsdWUuc3Vic3RyaW5nKDAsIG9mZnNldCk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJb2Zmc2V0ID0gdFtFTkRfT0ZGU0VUXTsNCgkJCQkJbmV3Tm9kZVZhbHVlID0gdHh0VmFsdWUuc3Vic3RyaW5nKDAsIG9mZnNldCk7DQoJCQkJCW9sZE5vZGVWYWx1ZSA9IHR4dFZhbHVlLnN1YnN0cmluZyhvZmZzZXQpOw0KCQkJCX0NCg0KCQkJCWlmIChob3cgIT0gQ0xPTkUpDQoJCQkJCW4ubm9kZVZhbHVlID0gb2xkTm9kZVZhbHVlOw0KDQoJCQkJaWYgKGhvdyA9PSBERUxFVEUpDQoJCQkJCXJldHVybjsNCg0KCQkJCW5ld05vZGUgPSBuLmNsb25lTm9kZShGQUxTRSk7DQoJCQkJbmV3Tm9kZS5ub2RlVmFsdWUgPSBuZXdOb2RlVmFsdWU7DQoNCgkJCQlyZXR1cm4gbmV3Tm9kZTsNCgkJCX0NCg0KCQkJaWYgKGhvdyA9PSBERUxFVEUpDQoJCQkJcmV0dXJuOw0KDQoJCQlyZXR1cm4gbi5jbG9uZU5vZGUoRkFMU0UpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZUZ1bGx5U2VsZWN0ZWQobiwgaG93KSB7DQoJCQlpZiAoaG93ICE9IERFTEVURSkNCgkJCQlyZXR1cm4gaG93ID09IENMT05FID8gbi5jbG9uZU5vZGUoVFJVRSkgOiBuOw0KDQoJCQluLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik7DQoJCX07DQoJfTsNCg0KCW5zLlJhbmdlID0gUmFuZ2U7DQp9KSh0aW55bWNlLmRvbSk7DQoNCihmdW5jdGlvbigpIHsNCglmdW5jdGlvbiBTZWxlY3Rpb24oc2VsZWN0aW9uKSB7DQoJCXZhciB0ID0gdGhpcywgaW52aXNpYmxlQ2hhciA9ICdcdUZFRkYnLCByYW5nZSwgbGFzdElFUm5nLCBkb20gPSBzZWxlY3Rpb24uZG9tLCBUUlVFID0gdHJ1ZSwgRkFMU0UgPSBmYWxzZTsNCg0KCQkvLyBSZXR1cm5zIGEgVzNDIERPTSBjb21wYXRpYmxlIHJhbmdlIG9iamVjdCBieSB1c2luZyB0aGUgSUUgUmFuZ2UgQVBJDQoJCWZ1bmN0aW9uIGdldFJhbmdlKCkgew0KCQkJdmFyIGllUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0Um5nKCksIGRvbVJhbmdlID0gZG9tLmNyZWF0ZVJuZygpLCBlbGVtZW50LCBjb2xsYXBzZWQ7DQoNCgkJCS8vIElmIHNlbGVjdGlvbiBpcyBvdXRzaWRlIHRoZSBjdXJyZW50IGRvY3VtZW50IGp1c3QgcmV0dXJuIGFuIGVtcHR5IHJhbmdlDQoJCQllbGVtZW50ID0gaWVSYW5nZS5pdGVtID8gaWVSYW5nZS5pdGVtKDApIDogaWVSYW5nZS5wYXJlbnRFbGVtZW50KCk7DQoJCQlpZiAoZWxlbWVudC5vd25lckRvY3VtZW50ICE9IGRvbS5kb2MpDQoJCQkJcmV0dXJuIGRvbVJhbmdlOw0KDQoJCQkvLyBIYW5kbGUgY29udHJvbCBzZWxlY3Rpb24gb3IgdGV4dCBzZWxlY3Rpb24gb2YgYSBpbWFnZQ0KCQkJaWYgKGllUmFuZ2UuaXRlbSB8fCAhZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsNCgkJCQlkb21SYW5nZS5zZXRTdGFydChlbGVtZW50LnBhcmVudE5vZGUsIGRvbS5ub2RlSW5kZXgoZWxlbWVudCkpOw0KCQkJCWRvbVJhbmdlLnNldEVuZChkb21SYW5nZS5zdGFydENvbnRhaW5lciwgZG9tUmFuZ2Uuc3RhcnRPZmZzZXQgKyAxKTsNCg0KCQkJCXJldHVybiBkb21SYW5nZTsNCgkJCX0NCg0KCQkJY29sbGFwc2VkID0gc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCk7DQoNCgkJCWZ1bmN0aW9uIGZpbmRFbmRQb2ludChzdGFydCkgew0KCQkJCXZhciBtYXJrZXIsIGNvbnRhaW5lciwgb2Zmc2V0LCBub2Rlcywgc3RhcnRJbmRleCA9IDAsIGVuZEluZGV4LCBpbmRleCwgcGFyZW50LCBjaGVja1JuZywgcG9zaXRpb247DQoNCgkJCQkvLyBTZXR1cCB0ZW1wIHJhbmdlIGFuZCBjb2xsYXBzZSBpdA0KCQkJCWNoZWNrUm5nID0gaWVSYW5nZS5kdXBsaWNhdGUoKTsNCgkJCQljaGVja1JuZy5jb2xsYXBzZShzdGFydCk7DQoNCgkJCQkvLyBDcmVhdGUgbWFya2VyIGFuZCBpbnNlcnQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgZW5kcG9pbnRzIHBhcmVudA0KCQkJCW1hcmtlciA9IGRvbS5jcmVhdGUoJ2EnKTsNCgkJCQlwYXJlbnQgPSBjaGVja1JuZy5wYXJlbnRFbGVtZW50KCk7DQoNCgkJCQkvLyBJZiBwYXJlbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiB0aGVuIHNldCB0aGUgY29udGFpbmVyIHRvIHRoYXQgcGFyZW50IGFuZCB0aGUgaW5kZXggdG8gMA0KCQkJCWlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkgew0KCQkJCQlkb21SYW5nZVtzdGFydCA/ICdzZXRTdGFydCcgOiAnc2V0RW5kJ10ocGFyZW50LCAwKTsNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCg0KCQkJCXBhcmVudC5hcHBlbmRDaGlsZChtYXJrZXIpOw0KCQkJCWNoZWNrUm5nLm1vdmVUb0VsZW1lbnRUZXh0KG1hcmtlcik7DQoJCQkJcG9zaXRpb24gPSBpZVJhbmdlLmNvbXBhcmVFbmRQb2ludHMoc3RhcnQgPyAnU3RhcnRUb1N0YXJ0JyA6ICdFbmRUb0VuZCcsIGNoZWNrUm5nKTsNCgkJCQlpZiAocG9zaXRpb24gPiAwKSB7DQoJCQkJCS8vIFRoZSBwb3NpdGlvbiBpcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgZWxlbWVudC4NCgkJCQkJLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBJRSBwdXRzIHRoZSBjYXJldCB0byB0aGUgbGVmdCBlZGdlIG9mIGEgdGFibGUuDQoJCQkJCWRvbVJhbmdlW3N0YXJ0ID8gJ3NldFN0YXJ0QWZ0ZXInIDogJ3NldEVuZEFmdGVyJ10ocGFyZW50KTsNCgkJCQkJZG9tLnJlbW92ZShtYXJrZXIpOw0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KDQoJCQkJLy8gU2V0dXAgbm9kZSBsaXN0IGFuZCBlbmRJbmRleA0KCQkJCW5vZGVzID0gdGlueW1jZS5ncmVwKHBhcmVudC5jaGlsZE5vZGVzKTsNCgkJCQllbmRJbmRleCA9IG5vZGVzLmxlbmd0aCAtIDE7DQoJCQkJLy8gUGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBwb3NpdGlvbg0KCQkJCXdoaWxlIChzdGFydEluZGV4IDw9IGVuZEluZGV4KSB7DQoJCQkJCWluZGV4ID0gTWF0aC5mbG9vcigoc3RhcnRJbmRleCArIGVuZEluZGV4KSAvIDIpOw0KDQoJCQkJCS8vIEluc2VydCBtYXJrZXIgYW5kIGNoZWNrIGl0J3MgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHNlbGVjdGlvbg0KCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG1hcmtlciwgbm9kZXNbaW5kZXhdKTsNCgkJCQkJY2hlY2tSbmcubW92ZVRvRWxlbWVudFRleHQobWFya2VyKTsNCgkJCQkJcG9zaXRpb24gPSBpZVJhbmdlLmNvbXBhcmVFbmRQb2ludHMoc3RhcnQgPyAnU3RhcnRUb1N0YXJ0JyA6ICdFbmRUb0VuZCcsIGNoZWNrUm5nKTsNCgkJCQkJaWYgKHBvc2l0aW9uID4gMCkgew0KCQkJCQkJLy8gTWFya2VyIGlzIHRvIHRoZSByaWdodA0KCQkJCQkJc3RhcnRJbmRleCA9IGluZGV4ICsgMTsNCgkJCQkJfSBlbHNlIGlmIChwb3NpdGlvbiA8IDApIHsNCgkJCQkJCS8vIE1hcmtlciBpcyB0byB0aGUgbGVmdA0KCQkJCQkJZW5kSW5kZXggPSBpbmRleCAtIDE7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkvLyBNYWtlciBpcyB3aGVyZSB3ZSBhcmUNCgkJCQkJCWZvdW5kID0gdHJ1ZTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gU2V0dXAgY29udGFpbmVyDQoJCQkJY29udGFpbmVyID0gcG9zaXRpb24gPiAwIHx8IGluZGV4ID09IDAgPyBtYXJrZXIubmV4dFNpYmxpbmcgOiBtYXJrZXIucHJldmlvdXNTaWJsaW5nOw0KDQoJCQkJLy8gSGFuZGxlIGVsZW1lbnQgc2VsZWN0aW9uDQoJCQkJaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJCWRvbS5yZW1vdmUobWFya2VyKTsNCg0KCQkJCQkvLyBGaW5kIG9mZnNldCBhbmQgY29udGFpbmVyDQoJCQkJCW9mZnNldCA9IGRvbS5ub2RlSW5kZXgoY29udGFpbmVyKTsNCgkJCQkJY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7DQoNCgkJCQkJLy8gTW92ZSB0aGUgb2Zmc2V0IGlmIHdlIGFyZSBzZXR0aW5nIHRoZSBlbmQgb3IgdGhlIHBvc2l0aW9uIGlzIGFmdGVyIGFuIGVsZW1lbnQNCgkJCQkJaWYgKCFzdGFydCB8fCBpbmRleCA+IDApDQoJCQkJCQlvZmZzZXQrKzsNCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBDYWxjdWxhdGUgb2Zmc2V0IHdpdGhpbiB0ZXh0IG5vZGUNCgkJCQkJaWYgKHBvc2l0aW9uID4gMCB8fCBpbmRleCA9PSAwKSB7DQoJCQkJCQljaGVja1JuZy5zZXRFbmRQb2ludChzdGFydCA/ICdTdGFydFRvU3RhcnQnIDogJ0VuZFRvRW5kJywgaWVSYW5nZSk7DQoJCQkJCQlvZmZzZXQgPSBjaGVja1JuZy50ZXh0Lmxlbmd0aDsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWNoZWNrUm5nLnNldEVuZFBvaW50KHN0YXJ0ID8gJ1N0YXJ0VG9TdGFydCcgOiAnRW5kVG9FbmQnLCBpZVJhbmdlKTsNCgkJCQkJCW9mZnNldCA9IGNvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoIC0gY2hlY2tSbmcudGV4dC5sZW5ndGg7DQoJCQkJCX0NCg0KCQkJCQlkb20ucmVtb3ZlKG1hcmtlcik7DQoJCQkJfQ0KDQoJCQkJZG9tUmFuZ2Vbc3RhcnQgPyAnc2V0U3RhcnQnIDogJ3NldEVuZCddKGNvbnRhaW5lciwgb2Zmc2V0KTsNCgkJCX07DQoNCgkJCS8vIEZpbmQgc3RhcnQgcG9pbnQNCgkJCWZpbmRFbmRQb2ludCh0cnVlKTsNCg0KCQkJLy8gRmluZCBlbmQgcG9pbnQgaWYgbmVlZGVkDQoJCQlpZiAoIWNvbGxhcHNlZCkNCgkJCQlmaW5kRW5kUG9pbnQoKTsNCg0KCQkJcmV0dXJuIGRvbVJhbmdlOw0KCQl9Ow0KDQoJCXRoaXMuYWRkUmFuZ2UgPSBmdW5jdGlvbihybmcpIHsNCgkJCXZhciBpZVJuZywgY3RybFJuZywgc3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0LCBlbmRDb250YWluZXIsIGVuZE9mZnNldCwgZG9jID0gc2VsZWN0aW9uLmRvbS5kb2MsIGJvZHkgPSBkb2MuYm9keTsNCg0KCQkJZnVuY3Rpb24gc2V0RW5kUG9pbnQoc3RhcnQpIHsNCgkJCQl2YXIgY29udGFpbmVyLCBvZmZzZXQsIG1hcmtlciwgdG1wUm5nLCBub2RlczsNCg0KCQkJCW1hcmtlciA9IGRvbS5jcmVhdGUoJ2EnKTsNCgkJCQljb250YWluZXIgPSBzdGFydCA/IHN0YXJ0Q29udGFpbmVyIDogZW5kQ29udGFpbmVyOw0KCQkJCW9mZnNldCA9IHN0YXJ0ID8gc3RhcnRPZmZzZXQgOiBlbmRPZmZzZXQ7DQoJCQkJdG1wUm5nID0gaWVSbmcuZHVwbGljYXRlKCk7DQoNCgkJCQlpZiAoY29udGFpbmVyID09IGRvYykgew0KCQkJCQljb250YWluZXIgPSBib2R5Ow0KCQkJCQlvZmZzZXQgPSAwOw0KCQkJCX0NCg0KCQkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMykgew0KCQkJCQljb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobWFya2VyLCBjb250YWluZXIpOw0KCQkJCQl0bXBSbmcubW92ZVRvRWxlbWVudFRleHQobWFya2VyKTsNCgkJCQkJdG1wUm5nLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgb2Zmc2V0KTsNCgkJCQkJZG9tLnJlbW92ZShtYXJrZXIpOw0KCQkJCQlpZVJuZy5zZXRFbmRQb2ludChzdGFydCA/ICdTdGFydFRvU3RhcnQnIDogJ0VuZFRvRW5kJywgdG1wUm5nKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlub2RlcyA9IGNvbnRhaW5lci5jaGlsZE5vZGVzOw0KDQoJCQkJCWlmIChub2Rlcy5sZW5ndGgpIHsNCgkJCQkJCWlmIChvZmZzZXQgPj0gbm9kZXMubGVuZ3RoKSB7DQoJCQkJCQkJZG9tLmluc2VydEFmdGVyKG1hcmtlciwgbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV0pOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQljb250YWluZXIuaW5zZXJ0QmVmb3JlKG1hcmtlciwgbm9kZXNbb2Zmc2V0XSk7DQoJCQkJCQl9DQoNCgkJCQkJCXRtcFJuZy5tb3ZlVG9FbGVtZW50VGV4dChtYXJrZXIpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJLy8gRW1wdHkgbm9kZSBzZWxlY3Rpb24gZm9yIGV4YW1wbGUgPGRpdj58PC9kaXY+DQoJCQkJCQltYXJrZXIgPSBkb2MuY3JlYXRlVGV4dE5vZGUoaW52aXNpYmxlQ2hhcik7DQoJCQkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQobWFya2VyKTsNCgkJCQkJCXRtcFJuZy5tb3ZlVG9FbGVtZW50VGV4dChtYXJrZXIucGFyZW50Tm9kZSk7DQoJCQkJCQl0bXBSbmcuY29sbGFwc2UoVFJVRSk7DQoJCQkJCX0NCg0KCQkJCQlpZVJuZy5zZXRFbmRQb2ludChzdGFydCA/ICdTdGFydFRvU3RhcnQnIDogJ0VuZFRvRW5kJywgdG1wUm5nKTsNCgkJCQkJZG9tLnJlbW92ZShtYXJrZXIpOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gRGVzdHJveSBjYWNoZWQgcmFuZ2UNCgkJCXRoaXMuZGVzdHJveSgpOw0KDQoJCQkvLyBTZXR1cCBzb21lIHNob3J0ZXIgdmVyc2lvbnMNCgkJCXN0YXJ0Q29udGFpbmVyID0gcm5nLnN0YXJ0Q29udGFpbmVyOw0KCQkJc3RhcnRPZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQ7DQoJCQllbmRDb250YWluZXIgPSBybmcuZW5kQ29udGFpbmVyOw0KCQkJZW5kT2Zmc2V0ID0gcm5nLmVuZE9mZnNldDsNCgkJCWllUm5nID0gYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsNCg0KCQkJLy8gSWYgc2luZ2xlIGVsZW1lbnQgc2VsZWN0aW9uIHRoZW4gdHJ5IG1ha2luZyBhIGNvbnRyb2wgc2VsZWN0aW9uIG91dCBvZiBpdA0KCQkJaWYgKHN0YXJ0Q29udGFpbmVyID09IGVuZENvbnRhaW5lciAmJiBzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PSAxICYmIHN0YXJ0T2Zmc2V0ID09IGVuZE9mZnNldCAtIDEpIHsNCgkJCQlpZiAoc3RhcnRPZmZzZXQgPT0gZW5kT2Zmc2V0IC0gMSkgew0KCQkJCQl0cnkgew0KCQkJCQkJY3RybFJuZyA9IGJvZHkuY3JlYXRlQ29udHJvbFJhbmdlKCk7DQoJCQkJCQljdHJsUm5nLmFkZEVsZW1lbnQoc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tzdGFydE9mZnNldF0pOw0KCQkJCQkJY3RybFJuZy5zZWxlY3QoKTsNCgkJCQkJCWN0cmxSbmcuc2Nyb2xsSW50b1ZpZXcoKTsNCgkJCQkJCXJldHVybjsNCgkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCS8vIElnbm9yZQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBTZXQgc3RhcnQvZW5kIHBvaW50IG9mIHNlbGVjdGlvbg0KCQkJc2V0RW5kUG9pbnQodHJ1ZSk7DQoJCQlzZXRFbmRQb2ludCgpOw0KDQoJCQkvLyBTZWxlY3QgdGhlIG5ldyByYW5nZSBhbmQgc2Nyb2xsIGl0IGludG8gdmlldw0KCQkJaWVSbmcuc2VsZWN0KCk7DQoJCQlpZVJuZy5zY3JvbGxJbnRvVmlldygpOw0KCQl9Ow0KDQoJCXRoaXMuZ2V0UmFuZ2VBdCA9IGZ1bmN0aW9uKCkgew0KCQkJLy8gU2V0dXAgbmV3IHJhbmdlIGlmIHRoZSBjYWNoZSBpcyBlbXB0eQ0KCQkJaWYgKCFyYW5nZSB8fCAhdGlueW1jZS5kb20uUmFuZ2VVdGlscy5jb21wYXJlUmFuZ2VzKGxhc3RJRVJuZywgc2VsZWN0aW9uLmdldFJuZygpKSkgew0KCQkJCXJhbmdlID0gZ2V0UmFuZ2UoKTsNCg0KCQkJCS8vIFN0b3JlIGF3YXkgdGV4dCByYW5nZSBmb3IgbmV4dCBjYWxsDQoJCQkJbGFzdElFUm5nID0gc2VsZWN0aW9uLmdldFJuZygpOw0KCQkJfQ0KDQoJCQkvLyBJRSB3aWxsIHNheSB0aGF0IHRoZSByYW5nZSBpcyBlcXVhbCB0aGVuIHByb2R1Y2UgYW4gaW52YWxpZCBhcmd1bWVudCBleGNlcHRpb24NCgkJCS8vIGlmIHlvdSBwZXJmb3JtIHNwZWNpZmljIG9wZXJhdGlvbnMgaW4gYSBrZXl1cCBldmVudC4gRm9yIGV4YW1wbGUgQ3RybCtEZWwuDQoJCQkvLyBUaGlzIGhhY2sgd2lsbCBpbnZhbGlkYXRlIHRoZSByYW5nZSBjYWNoZSBpZiB0aGUgZXhjZXB0aW9uIG9jY3Vycw0KCQkJdHJ5IHsNCgkJCQlyYW5nZS5zdGFydENvbnRhaW5lci5uZXh0U2libGluZzsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJcmFuZ2UgPSBnZXRSYW5nZSgpOw0KCQkJCWxhc3RJRVJuZyA9IG51bGw7DQoJCQl9DQoNCgkJCS8vIFJldHVybiBjYWNoZWQgcmFuZ2UNCgkJCXJldHVybiByYW5nZTsNCgkJfTsNCg0KCQl0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHsNCgkJCS8vIERlc3Ryb3kgY2FjaGVkIHJhbmdlIGFuZCBsYXN0IElFIHJhbmdlIHRvIGF2b2lkIG1lbW9yeSBsZWFrcw0KCQkJbGFzdElFUm5nID0gcmFuZ2UgPSBudWxsOw0KCQl9Ow0KCX07DQoNCgkvLyBFeHBvc2UgdGhlIHNlbGVjdGlvbiBvYmplY3QNCgl0aW55bWNlLmRvbS5UcmlkZW50U2VsZWN0aW9uID0gU2VsZWN0aW9uOw0KfSkoKTsNCg0KDQovKg0KICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgLSB2MS4wDQogKiAgQ29weXJpZ2h0IDIwMDksIFRoZSBEb2pvIEZvdW5kYXRpb24NCiAqICBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuDQogKiAgTW9yZSBpbmZvcm1hdGlvbjogaHR0cDovL3NpenpsZWpzLmNvbS8NCiAqLw0KKGZ1bmN0aW9uKCl7DQoNCnZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywNCglkb25lID0gMCwNCgl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsDQoJaGFzRHVwbGljYXRlID0gZmFsc2UsDQoJYmFzZUhhc0R1cGxpY2F0ZSA9IHRydWU7DQoNCi8vIEhlcmUgd2UgY2hlY2sgaWYgdGhlIEphdmFTY3JpcHQgZW5naW5lIGlzIHVzaW5nIHNvbWUgc29ydCBvZg0KLy8gb3B0aW1pemF0aW9uIHdoZXJlIGl0IGRvZXMgbm90IGFsd2F5cyBjYWxsIG91ciBjb21wYXJpc2lvbg0KLy8gZnVuY3Rpb24uIElmIHRoYXQgaXMgdGhlIGNhc2UsIGRpc2NhcmQgdGhlIGhhc0R1cGxpY2F0ZSB2YWx1ZS4NCi8vICAgVGh1cyBmYXIgdGhhdCBpbmNsdWRlcyBHb29nbGUgQ2hyb21lLg0KWzAsIDBdLnNvcnQoZnVuY3Rpb24oKXsNCgliYXNlSGFzRHVwbGljYXRlID0gZmFsc2U7DQoJcmV0dXJuIDA7DQp9KTsNCg0KdmFyIFNpenpsZSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkKSB7DQoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107DQoJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7DQoNCgl2YXIgb3JpZ0NvbnRleHQgPSBjb250ZXh0Ow0KDQoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7DQoJCXJldHVybiBbXTsNCgl9DQoJDQoJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsNCgkJcmV0dXJuIHJlc3VsdHM7DQoJfQ0KDQoJdmFyIHBhcnRzID0gW10sIG0sIHNldCwgY2hlY2tTZXQsIGV4dHJhLCBwcnVuZSA9IHRydWUsIGNvbnRleHRYTUwgPSBTaXp6bGUuaXNYTUwoY29udGV4dCksDQoJCXNvRmFyID0gc2VsZWN0b3IsIHJldCwgY3VyLCBwb3AsIGk7DQoJDQoJLy8gUmVzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaHVua2VyIHJlZ2V4cCAoc3RhcnQgZnJvbSBoZWFkKQ0KCWRvIHsNCgkJY2h1bmtlci5leGVjKCIiKTsNCgkJbSA9IGNodW5rZXIuZXhlYyhzb0Zhcik7DQoNCgkJaWYgKCBtICkgew0KCQkJc29GYXIgPSBtWzNdOw0KCQkNCgkJCXBhcnRzLnB1c2goIG1bMV0gKTsNCgkJDQoJCQlpZiAoIG1bMl0gKSB7DQoJCQkJZXh0cmEgPSBtWzNdOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJfSB3aGlsZSAoIG0gKTsNCg0KCWlmICggcGFydHMubGVuZ3RoID4gMSAmJiBvcmlnUE9TLmV4ZWMoIHNlbGVjdG9yICkgKSB7DQoJCWlmICggcGFydHMubGVuZ3RoID09PSAyICYmIEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gKSB7DQoJCQlzZXQgPSBwb3NQcm9jZXNzKCBwYXJ0c1swXSArIHBhcnRzWzFdLCBjb250ZXh0ICk7DQoJCX0gZWxzZSB7DQoJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8NCgkJCQlbIGNvbnRleHQgXSA6DQoJCQkJU2l6emxlKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0ICk7DQoNCgkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgew0KCQkJCXNlbGVjdG9yID0gcGFydHMuc2hpZnQoKTsNCg0KCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgc2VsZWN0b3IgXSApIHsNCgkJCQkJc2VsZWN0b3IgKz0gcGFydHMuc2hpZnQoKTsNCgkJCQl9DQoJCQkJDQoJCQkJc2V0ID0gcG9zUHJvY2Vzcyggc2VsZWN0b3IsIHNldCApOw0KCQkJfQ0KCQl9DQoJfSBlbHNlIHsNCgkJLy8gVGFrZSBhIHNob3J0Y3V0IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJvb3Qgc2VsZWN0b3IgaXMgYW4gSUQNCgkJLy8gKGJ1dCBub3QgaWYgaXQnbGwgYmUgZmFzdGVyIGlmIHRoZSBpbm5lciBzZWxlY3RvciBpcyBhbiBJRCkNCgkJaWYgKCAhc2VlZCAmJiBwYXJ0cy5sZW5ndGggPiAxICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWNvbnRleHRYTUwgJiYNCgkJCQlFeHByLm1hdGNoLklELnRlc3QocGFydHNbMF0pICYmICFFeHByLm1hdGNoLklELnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMV0pICkgew0KCQkJcmV0ID0gU2l6emxlLmZpbmQoIHBhcnRzLnNoaWZ0KCksIGNvbnRleHQsIGNvbnRleHRYTUwgKTsNCgkJCWNvbnRleHQgPSByZXQuZXhwciA/IFNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0IClbMF0gOiByZXQuc2V0WzBdOw0KCQl9DQoNCgkJaWYgKCBjb250ZXh0ICkgew0KCQkJcmV0ID0gc2VlZCA/DQoJCQkJeyBleHByOiBwYXJ0cy5wb3AoKSwgc2V0OiBtYWtlQXJyYXkoc2VlZCkgfSA6DQoJCQkJU2l6emxlLmZpbmQoIHBhcnRzLnBvcCgpLCBwYXJ0cy5sZW5ndGggPT09IDEgJiYgKHBhcnRzWzBdID09PSAifiIgfHwgcGFydHNbMF0gPT09ICIrIikgJiYgY29udGV4dC5wYXJlbnROb2RlID8gY29udGV4dC5wYXJlbnROb2RlIDogY29udGV4dCwgY29udGV4dFhNTCApOw0KCQkJc2V0ID0gcmV0LmV4cHIgPyBTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApIDogcmV0LnNldDsNCg0KCQkJaWYgKCBwYXJ0cy5sZW5ndGggPiAwICkgew0KCQkJCWNoZWNrU2V0ID0gbWFrZUFycmF5KHNldCk7DQoJCQl9IGVsc2Ugew0KCQkJCXBydW5lID0gZmFsc2U7DQoJCQl9DQoNCgkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgew0KCQkJCWN1ciA9IHBhcnRzLnBvcCgpOw0KCQkJCXBvcCA9IGN1cjsNCg0KCQkJCWlmICggIUV4cHIucmVsYXRpdmVbIGN1ciBdICkgew0KCQkJCQljdXIgPSAiIjsNCgkJCQl9IGVsc2Ugew0KCQkJCQlwb3AgPSBwYXJ0cy5wb3AoKTsNCgkJCQl9DQoNCgkJCQlpZiAoIHBvcCA9PSBudWxsICkgew0KCQkJCQlwb3AgPSBjb250ZXh0Ow0KCQkJCX0NCg0KCQkJCUV4cHIucmVsYXRpdmVbIGN1ciBdKCBjaGVja1NldCwgcG9wLCBjb250ZXh0WE1MICk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQljaGVja1NldCA9IHBhcnRzID0gW107DQoJCX0NCgl9DQoNCglpZiAoICFjaGVja1NldCApIHsNCgkJY2hlY2tTZXQgPSBzZXQ7DQoJfQ0KDQoJaWYgKCAhY2hlY2tTZXQgKSB7DQoJCVNpenpsZS5lcnJvciggY3VyIHx8IHNlbGVjdG9yICk7DQoJfQ0KDQoJaWYgKCB0b1N0cmluZy5jYWxsKGNoZWNrU2V0KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsNCgkJaWYgKCAhcHJ1bmUgKSB7DQoJCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGNoZWNrU2V0ICk7DQoJCX0gZWxzZSBpZiAoIGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gMSApIHsNCgkJCWZvciAoIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7DQoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgU2l6emxlLmNvbnRhaW5zKGNvbnRleHQsIGNoZWNrU2V0W2ldKSkgKSB7DQoJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7DQoJCQkJfQ0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJZm9yICggaSA9IDA7IGNoZWNrU2V0W2ldICE9IG51bGw7IGkrKyApIHsNCgkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0gZWxzZSB7DQoJCW1ha2VBcnJheSggY2hlY2tTZXQsIHJlc3VsdHMgKTsNCgl9DQoNCglpZiAoIGV4dHJhICkgew0KCQlTaXp6bGUoIGV4dHJhLCBvcmlnQ29udGV4dCwgcmVzdWx0cywgc2VlZCApOw0KCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOw0KCX0NCg0KCXJldHVybiByZXN1bHRzOw0KfTsNCg0KU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbihyZXN1bHRzKXsNCglpZiAoIHNvcnRPcmRlciApIHsNCgkJaGFzRHVwbGljYXRlID0gYmFzZUhhc0R1cGxpY2F0ZTsNCgkJcmVzdWx0cy5zb3J0KHNvcnRPcmRlcik7DQoNCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7DQoJCQlmb3IgKCB2YXIgaSA9IDE7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrICkgew0KCQkJCWlmICggcmVzdWx0c1tpXSA9PT0gcmVzdWx0c1tpLTFdICkgew0KCQkJCQlyZXN1bHRzLnNwbGljZShpLS0sIDEpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCg0KCXJldHVybiByZXN1bHRzOw0KfTsNCg0KU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbihleHByLCBzZXQpew0KCXJldHVybiBTaXp6bGUoZXhwciwgbnVsbCwgbnVsbCwgc2V0KTsNCn07DQoNClNpenpsZS5maW5kID0gZnVuY3Rpb24oZXhwciwgY29udGV4dCwgaXNYTUwpew0KCXZhciBzZXQ7DQoNCglpZiAoICFleHByICkgew0KCQlyZXR1cm4gW107DQoJfQ0KDQoJZm9yICggdmFyIGkgPSAwLCBsID0gRXhwci5vcmRlci5sZW5ndGg7IGkgPCBsOyBpKysgKSB7DQoJCXZhciB0eXBlID0gRXhwci5vcmRlcltpXSwgbWF0Y2g7DQoJCQ0KCQlpZiAoIChtYXRjaCA9IEV4cHIubGVmdE1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSApIHsNCgkJCXZhciBsZWZ0ID0gbWF0Y2hbMV07DQoJCQltYXRjaC5zcGxpY2UoMSwxKTsNCg0KCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7DQoJCQkJbWF0Y2hbMV0gPSAobWF0Y2hbMV0gfHwgIiIpLnJlcGxhY2UoL1xcL2csICIiKTsNCgkJCQlzZXQgPSBFeHByLmZpbmRbIHR5cGUgXSggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICk7DQoJCQkJaWYgKCBzZXQgIT0gbnVsbCApIHsNCgkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOw0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoNCglpZiAoICFzZXQgKSB7DQoJCXNldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsNCgl9DQoNCglyZXR1cm4ge3NldDogc2V0LCBleHByOiBleHByfTsNCn07DQoNClNpenpsZS5maWx0ZXIgPSBmdW5jdGlvbihleHByLCBzZXQsIGlucGxhY2UsIG5vdCl7DQoJdmFyIG9sZCA9IGV4cHIsIHJlc3VsdCA9IFtdLCBjdXJMb29wID0gc2V0LCBtYXRjaCwgYW55Rm91bmQsDQoJCWlzWE1MRmlsdGVyID0gc2V0ICYmIHNldFswXSAmJiBTaXp6bGUuaXNYTUwoc2V0WzBdKTsNCg0KCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgew0KCQlmb3IgKCB2YXIgdHlwZSBpbiBFeHByLmZpbHRlciApIHsNCgkJCWlmICggKG1hdGNoID0gRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICE9IG51bGwgJiYgbWF0Y2hbMl0gKSB7DQoJCQkJdmFyIGZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sIGZvdW5kLCBpdGVtLCBsZWZ0ID0gbWF0Y2hbMV07DQoJCQkJYW55Rm91bmQgPSBmYWxzZTsNCg0KCQkJCW1hdGNoLnNwbGljZSgxLDEpOw0KDQoJCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgPT09ICJcXCIgKSB7DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0NCg0KCQkJCWlmICggY3VyTG9vcCA9PT0gcmVzdWx0ICkgew0KCQkJCQlyZXN1bHQgPSBbXTsNCgkJCQl9DQoNCgkJCQlpZiAoIEV4cHIucHJlRmlsdGVyWyB0eXBlIF0gKSB7DQoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOw0KDQoJCQkJCWlmICggIW1hdGNoICkgew0KCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7DQoJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgew0KCQkJCQkJY29udGludWU7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlpZiAoIG1hdGNoICkgew0KCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgew0KCQkJCQkJaWYgKCBpdGVtICkgew0KCQkJCQkJCWZvdW5kID0gZmlsdGVyKCBpdGVtLCBtYXRjaCwgaSwgY3VyTG9vcCApOw0KCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsNCg0KCQkJCQkJCWlmICggaW5wbGFjZSAmJiBmb3VuZCAhPSBudWxsICkgew0KCQkJCQkJCQlpZiAoIHBhc3MgKSB7DQoJCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7DQoJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7DQoJCQkJCQkJCX0NCgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgew0KCQkJCQkJCQlyZXN1bHQucHVzaCggaXRlbSApOw0KCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJaWYgKCBmb3VuZCAhPT0gdW5kZWZpbmVkICkgew0KCQkJCQlpZiAoICFpbnBsYWNlICkgew0KCQkJCQkJY3VyTG9vcCA9IHJlc3VsdDsNCgkJCQkJfQ0KDQoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsNCg0KCQkJCQlpZiAoICFhbnlGb3VuZCApIHsNCgkJCQkJCXJldHVybiBbXTsNCgkJCQkJfQ0KDQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24NCgkJaWYgKCBleHByID09PSBvbGQgKSB7DQoJCQlpZiAoIGFueUZvdW5kID09IG51bGwgKSB7DQoJCQkJU2l6emxlLmVycm9yKCBleHByICk7DQoJCQl9IGVsc2Ugew0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoNCgkJb2xkID0gZXhwcjsNCgl9DQoNCglyZXR1cm4gY3VyTG9vcDsNCn07DQoNClNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7DQoJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2c7DQp9Ow0KDQp2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7DQoJb3JkZXI6IFsgIklEIiwgIk5BTUUiLCAiVEFHIiBdLA0KCW1hdGNoOiB7DQoJCUlEOiAvIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sDQoJCUNMQVNTOiAvXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLA0KCQlOQU1FOiAvXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sDQoJCUFUVFI6IC9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sDQoJCVRBRzogL14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sDQoJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoKGV2ZW58b2RkfFtcZG4rXC1dKilcKSk/LywNCgkJUE9TOiAvOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteXC1dfCQpLywNCgkJUFNFVURPOiAvOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/Lw0KCX0sDQoJbGVmdE1hdGNoOiB7fSwNCglhdHRyTWFwOiB7DQoJCSJjbGFzcyI6ICJjbGFzc05hbWUiLA0KCQkiZm9yIjogImh0bWxGb3IiDQoJfSwNCglhdHRySGFuZGxlOiB7DQoJCWhyZWY6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIik7DQoJCX0NCgl9LA0KCXJlbGF0aXZlOiB7DQoJCSIrIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQpew0KCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwNCgkJCQlpc1RhZyA9IGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KHBhcnQpLA0KCQkJCWlzUGFydFN0ck5vdFRhZyA9IGlzUGFydFN0ciAmJiAhaXNUYWc7DQoNCgkJCWlmICggaXNUYWcgKSB7DQoJCQkJcGFydCA9IHBhcnQudG9Mb3dlckNhc2UoKTsNCgkJCX0NCg0KCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoLCBlbGVtOyBpIDwgbDsgaSsrICkgew0KCQkJCWlmICggKGVsZW0gPSBjaGVja1NldFtpXSkgKSB7DQoJCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtLnByZXZpb3VzU2libGluZykgJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSApIHt9DQoNCgkJCQkJY2hlY2tTZXRbaV0gPSBpc1BhcnRTdHJOb3RUYWcgfHwgZWxlbSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcnQgPw0KCQkJCQkJZWxlbSB8fCBmYWxzZSA6DQoJCQkJCQllbGVtID09PSBwYXJ0Ow0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKCBpc1BhcnRTdHJOb3RUYWcgKSB7DQoJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsNCgkJCX0NCgkJfSwNCgkJIj4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCl7DQoJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciLA0KCQkJCWVsZW0sIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOw0KDQoJCQlpZiAoIGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KHBhcnQpICkgew0KCQkJCXBhcnQgPSBwYXJ0LnRvTG93ZXJDYXNlKCk7DQoNCgkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7DQoJCQkJCWVsZW0gPSBjaGVja1NldFtpXTsNCgkJCQkJaWYgKCBlbGVtICkgew0KCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsNCgkJCQkJCWNoZWNrU2V0W2ldID0gcGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcnQgPyBwYXJlbnQgOiBmYWxzZTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZm9yICggOyBpIDwgbDsgaSsrICkgew0KCQkJCQllbGVtID0gY2hlY2tTZXRbaV07DQoJCQkJCWlmICggZWxlbSApIHsNCgkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8NCgkJCQkJCQllbGVtLnBhcmVudE5vZGUgOg0KCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA9PT0gcGFydDsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCWlmICggaXNQYXJ0U3RyICkgew0KCQkJCQlTaXp6bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwgdHJ1ZSApOw0KCQkJCX0NCgkJCX0NCgkJfSwNCgkJIiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7DQoJCQl2YXIgZG9uZU5hbWUgPSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVjaywgbm9kZUNoZWNrOw0KDQoJCQlpZiAoIHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiAmJiAhL1xXLy50ZXN0KHBhcnQpICkgew0KCQkJCXBhcnQgPSBwYXJ0LnRvTG93ZXJDYXNlKCk7DQoJCQkJbm9kZUNoZWNrID0gcGFydDsNCgkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOw0KCQkJfQ0KDQoJCQljaGVja0ZuKCJwYXJlbnROb2RlIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MKTsNCgkJfSwNCgkJIn4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpew0KCQkJdmFyIGRvbmVOYW1lID0gZG9uZSsrLCBjaGVja0ZuID0gZGlyQ2hlY2ssIG5vZGVDaGVjazsNCg0KCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIS9cVy8udGVzdChwYXJ0KSApIHsNCgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOw0KCQkJCW5vZGVDaGVjayA9IHBhcnQ7DQoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsNCgkJCX0NCg0KCQkJY2hlY2tGbigicHJldmlvdXNTaWJsaW5nIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MKTsNCgkJfQ0KCX0sDQoJZmluZDogew0KCQlJRDogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsNCgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsNCgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOw0KCQkJCXJldHVybiBtID8gW21dIDogW107DQoJCQl9DQoJCX0sDQoJCU5BTUU6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0KXsNCgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUgIT09ICJ1bmRlZmluZWQiICkgew0KCQkJCXZhciByZXQgPSBbXSwgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUobWF0Y2hbMV0pOw0KDQoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7DQoJCQkJCWlmICggcmVzdWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PT0gbWF0Y2hbMV0gKSB7DQoJCQkJCQlyZXQucHVzaCggcmVzdWx0c1tpXSApOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0Ow0KCQkJfQ0KCQl9LA0KCQlUQUc6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0KXsNCgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFdKTsNCgkJfQ0KCX0sDQoJcHJlRmlsdGVyOiB7DQoJCUNMQVNTOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsNCgkJCW1hdGNoID0gIiAiICsgbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpICsgIiAiOw0KDQoJCQlpZiAoIGlzWE1MICkgew0KCQkJCXJldHVybiBtYXRjaDsNCgkJCX0NCg0KCQkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGN1ckxvb3BbaV0pICE9IG51bGw7IGkrKyApIHsNCgkJCQlpZiAoIGVsZW0gKSB7DQoJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIikucmVwbGFjZSgvW1x0XG5dL2csICIgIikuaW5kZXhPZihtYXRjaCkgPj0gMCkgKSB7DQoJCQkJCQlpZiAoICFpbnBsYWNlICkgew0KCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7DQoJCQkJCQl9DQoJCQkJCX0gZWxzZSBpZiAoIGlucGxhY2UgKSB7DQoJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfSwNCgkJSUQ6IGZ1bmN0aW9uKG1hdGNoKXsNCgkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7DQoJCX0sDQoJCVRBRzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3Apew0KCQkJcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7DQoJCX0sDQoJCUNISUxEOiBmdW5jdGlvbihtYXRjaCl7DQoJCQlpZiAoIG1hdGNoWzFdID09PSAibnRoIiApIHsNCgkJCQkvLyBwYXJzZSBlcXVhdGlvbnMgbGlrZSAnZXZlbicsICdvZGQnLCAnNScsICcybicsICczbisyJywgJzRuLTEnLCAnLW4rNicNCgkJCQl2YXIgdGVzdCA9IC8oLT8pKFxkKiluKCg/OlwrfC0pP1xkKikvLmV4ZWMoDQoJCQkJCW1hdGNoWzJdID09PSAiZXZlbiIgJiYgIjJuIiB8fCBtYXRjaFsyXSA9PT0gIm9kZCIgJiYgIjJuKzEiIHx8DQoJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7DQoNCgkJCQkvLyBjYWxjdWxhdGUgdGhlIG51bWJlcnMgKGZpcnN0KW4rKGxhc3QpIGluY2x1ZGluZyBpZiB0aGV5IGFyZSBuZWdhdGl2ZQ0KCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOw0KCQkJCW1hdGNoWzNdID0gdGVzdFszXSAtIDA7DQoJCQl9DQoNCgkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtDQoJCQltYXRjaFswXSA9IGRvbmUrKzsNCg0KCQkJcmV0dXJuIG1hdGNoOw0KCQl9LA0KCQlBVFRSOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsNCgkJCXZhciBuYW1lID0gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOw0KCQkJDQoJCQlpZiAoICFpc1hNTCAmJiBFeHByLmF0dHJNYXBbbmFtZV0gKSB7DQoJCQkJbWF0Y2hbMV0gPSBFeHByLmF0dHJNYXBbbmFtZV07DQoJCQl9DQoNCgkJCWlmICggbWF0Y2hbMl0gPT09ICJ+PSIgKSB7DQoJCQkJbWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSArICIgIjsNCgkJCX0NCg0KCQkJcmV0dXJuIG1hdGNoOw0KCQl9LA0KCQlQU0VVRE86IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCl7DQoJCQlpZiAoIG1hdGNoWzFdID09PSAibm90IiApIHsNCgkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQ0KCQkJCWlmICggKCBjaHVua2VyLmV4ZWMobWF0Y2hbM10pIHx8ICIiICkubGVuZ3RoID4gMSB8fCAvXlx3Ly50ZXN0KG1hdGNoWzNdKSApIHsNCgkJCQkJbWF0Y2hbM10gPSBTaXp6bGUobWF0Y2hbM10sIG51bGwsIG51bGwsIGN1ckxvb3ApOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsNCgkJCQkJaWYgKCAhaW5wbGFjZSApIHsNCgkJCQkJCXJlc3VsdC5wdXNoLmFwcGx5KCByZXN1bHQsIHJldCApOw0KCQkJCQl9DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJCQ0KCQkJcmV0dXJuIG1hdGNoOw0KCQl9LA0KCQlQT1M6IGZ1bmN0aW9uKG1hdGNoKXsNCgkJCW1hdGNoLnVuc2hpZnQoIHRydWUgKTsNCgkJCXJldHVybiBtYXRjaDsNCgkJfQ0KCX0sDQoJZmlsdGVyczogew0KCQllbmFibGVkOiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJoaWRkZW4iOw0KCQl9LA0KCQlkaXNhYmxlZDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsNCgkJfSwNCgkJY2hlY2tlZDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gZWxlbS5jaGVja2VkID09PSB0cnVlOw0KCQl9LA0KCQlzZWxlY3RlZDogZnVuY3Rpb24oZWxlbSl7DQoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0DQoJCQkvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5DQoJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsNCgkJCXJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlOw0KCQl9LA0KCQlwYXJlbnQ6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICEhZWxlbS5maXJzdENoaWxkOw0KCQl9LA0KCQllbXB0eTogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gIWVsZW0uZmlyc3RDaGlsZDsNCgkJfSwNCgkJaGFzOiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7DQoJCQlyZXR1cm4gISFTaXp6bGUoIG1hdGNoWzNdLCBlbGVtICkubGVuZ3RoOw0KCQl9LA0KCQloZWFkZXI6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICgvaFxkL2kpLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsNCgkJfSwNCgkJdGV4dDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gInRleHQiID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCXJhZGlvOiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiAicmFkaW8iID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCWNoZWNrYm94OiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiAiY2hlY2tib3giID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCWZpbGU6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICJmaWxlIiA9PT0gZWxlbS50eXBlOw0KCQl9LA0KCQlwYXNzd29yZDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gInBhc3N3b3JkIiA9PT0gZWxlbS50eXBlOw0KCQl9LA0KCQlzdWJtaXQ6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICJzdWJtaXQiID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCWltYWdlOiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiAiaW1hZ2UiID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCXJlc2V0OiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiAicmVzZXQiID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCWJ1dHRvbjogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gImJ1dHRvbiIgPT09IGVsZW0udHlwZSB8fCBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJidXR0b24iOw0KCQl9LA0KCQlpbnB1dDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gKC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kpLnRlc3QoZWxlbS5ub2RlTmFtZSk7DQoJCX0NCgl9LA0KCXNldEZpbHRlcnM6IHsNCgkJZmlyc3Q6IGZ1bmN0aW9uKGVsZW0sIGkpew0KCQkJcmV0dXJuIGkgPT09IDA7DQoJCX0sDQoJCWxhc3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoLCBhcnJheSl7DQoJCQlyZXR1cm4gaSA9PT0gYXJyYXkubGVuZ3RoIC0gMTsNCgkJfSwNCgkJZXZlbjogZnVuY3Rpb24oZWxlbSwgaSl7DQoJCQlyZXR1cm4gaSAlIDIgPT09IDA7DQoJCX0sDQoJCW9kZDogZnVuY3Rpb24oZWxlbSwgaSl7DQoJCQlyZXR1cm4gaSAlIDIgPT09IDE7DQoJCX0sDQoJCWx0OiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7DQoJCQlyZXR1cm4gaSA8IG1hdGNoWzNdIC0gMDsNCgkJfSwNCgkJZ3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsNCgkJCXJldHVybiBpID4gbWF0Y2hbM10gLSAwOw0KCQl9LA0KCQludGg6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsNCgkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7DQoJCX0sDQoJCWVxOiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7DQoJCQlyZXR1cm4gbWF0Y2hbM10gLSAwID09PSBpOw0KCQl9DQoJfSwNCglmaWx0ZXI6IHsNCgkJUFNFVURPOiBmdW5jdGlvbihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpew0KCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwgZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07DQoNCgkJCWlmICggZmlsdGVyICkgew0KCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOw0KCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsNCgkJCQlyZXR1cm4gKGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgU2l6emxlLmdldFRleHQoWyBlbGVtIF0pIHx8ICIiKS5pbmRleE9mKG1hdGNoWzNdKSA+PSAwOw0KCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gIm5vdCIgKSB7DQoJCQkJdmFyIG5vdCA9IG1hdGNoWzNdOw0KDQoJCQkJZm9yICggdmFyIGogPSAwLCBsID0gbm90Lmxlbmd0aDsgaiA8IGw7IGorKyApIHsNCgkJCQkJaWYgKCBub3Rbal0gPT09IGVsZW0gKSB7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0gZWxzZSB7DQoJCQkJU2l6emxlLmVycm9yKCAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIG5hbWUgKTsNCgkJCX0NCgkJfSwNCgkJQ0hJTEQ6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsNCgkJCXZhciB0eXBlID0gbWF0Y2hbMV0sIG5vZGUgPSBlbGVtOw0KCQkJc3dpdGNoICh0eXBlKSB7DQoJCQkJY2FzZSAnb25seSc6DQoJCQkJY2FzZSAnZmlyc3QnOg0KCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICkJIHsNCgkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsgDQoJCQkJCQkJcmV0dXJuIGZhbHNlOyANCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQlpZiAoIHR5cGUgPT09ICJmaXJzdCIgKSB7IA0KCQkJCQkJcmV0dXJuIHRydWU7IA0KCQkJCQl9DQoJCQkJCW5vZGUgPSBlbGVtOw0KCQkJCWNhc2UgJ2xhc3QnOg0KCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5uZXh0U2libGluZykgKQkgew0KCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgeyANCgkJCQkJCQlyZXR1cm4gZmFsc2U7IA0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCXJldHVybiB0cnVlOw0KCQkJCWNhc2UgJ250aCc6DQoJCQkJCXZhciBmaXJzdCA9IG1hdGNoWzJdLCBsYXN0ID0gbWF0Y2hbM107DQoNCgkJCQkJaWYgKCBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwICkgew0KCQkJCQkJcmV0dXJuIHRydWU7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXZhciBkb25lTmFtZSA9IG1hdGNoWzBdLA0KCQkJCQkJcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOw0KCQ0KCQkJCQlpZiAoIHBhcmVudCAmJiAocGFyZW50LnNpemNhY2hlICE9PSBkb25lTmFtZSB8fCAhZWxlbS5ub2RlSW5kZXgpICkgew0KCQkJCQkJdmFyIGNvdW50ID0gMDsNCgkJCQkJCWZvciAoIG5vZGUgPSBwYXJlbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcgKSB7DQoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQkJCQlub2RlLm5vZGVJbmRleCA9ICsrY291bnQ7DQoJCQkJCQkJfQ0KCQkJCQkJfSANCgkJCQkJCXBhcmVudC5zaXpjYWNoZSA9IGRvbmVOYW1lOw0KCQkJCQl9DQoJCQkJCQ0KCQkJCQl2YXIgZGlmZiA9IGVsZW0ubm9kZUluZGV4IC0gbGFzdDsNCgkJCQkJaWYgKCBmaXJzdCA9PT0gMCApIHsNCgkJCQkJCXJldHVybiBkaWZmID09PSAwOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJcmV0dXJuICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7DQoJCQkJCX0NCgkJCX0NCgkJfSwNCgkJSUQ6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsNCgkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpID09PSBtYXRjaDsNCgkJfSwNCgkJVEFHOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7DQoJCQlyZXR1cm4gKG1hdGNoID09PSAiKiIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSkgfHwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBtYXRjaDsNCgkJfSwNCgkJQ0xBU1M6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsNCgkJCXJldHVybiAoIiAiICsgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSArICIgIikNCgkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOw0KCQl9LA0KCQlBVFRSOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7DQoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLA0KCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8NCgkJCQkJRXhwci5hdHRySGFuZGxlWyBuYW1lIF0oIGVsZW0gKSA6DQoJCQkJCWVsZW1bIG5hbWUgXSAhPSBudWxsID8NCgkJCQkJCWVsZW1bIG5hbWUgXSA6DQoJCQkJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLA0KCQkJCXZhbHVlID0gcmVzdWx0ICsgIiIsDQoJCQkJdHlwZSA9IG1hdGNoWzJdLA0KCQkJCWNoZWNrID0gbWF0Y2hbNF07DQoNCgkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/DQoJCQkJdHlwZSA9PT0gIiE9IiA6DQoJCQkJdHlwZSA9PT0gIj0iID8NCgkJCQl2YWx1ZSA9PT0gY2hlY2sgOg0KCQkJCXR5cGUgPT09ICIqPSIgPw0KCQkJCXZhbHVlLmluZGV4T2YoY2hlY2spID49IDAgOg0KCQkJCXR5cGUgPT09ICJ+PSIgPw0KCQkJCSgiICIgKyB2YWx1ZSArICIgIikuaW5kZXhPZihjaGVjaykgPj0gMCA6DQoJCQkJIWNoZWNrID8NCgkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoNCgkJCQl0eXBlID09PSAiIT0iID8NCgkJCQl2YWx1ZSAhPT0gY2hlY2sgOg0KCQkJCXR5cGUgPT09ICJePSIgPw0KCQkJCXZhbHVlLmluZGV4T2YoY2hlY2spID09PSAwIDoNCgkJCQl0eXBlID09PSAiJD0iID8NCgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOg0KCQkJCXR5cGUgPT09ICJ8PSIgPw0KCQkJCXZhbHVlID09PSBjaGVjayB8fCB2YWx1ZS5zdWJzdHIoMCwgY2hlY2subGVuZ3RoICsgMSkgPT09IGNoZWNrICsgIi0iIDoNCgkJCQlmYWxzZTsNCgkJfSwNCgkJUE9TOiBmdW5jdGlvbihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpew0KCQkJdmFyIG5hbWUgPSBtYXRjaFsyXSwgZmlsdGVyID0gRXhwci5zZXRGaWx0ZXJzWyBuYW1lIF07DQoNCgkJCWlmICggZmlsdGVyICkgew0KCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOw0KCQkJfQ0KCQl9DQoJfQ0KfTsNCg0KdmFyIG9yaWdQT1MgPSBFeHByLm1hdGNoLlBPUywNCglmZXNjYXBlID0gZnVuY3Rpb24oYWxsLCBudW0pew0KCQlyZXR1cm4gIlxcIiArIChudW0gLSAwICsgMSk7DQoJfTsNCg0KZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsNCglFeHByLm1hdGNoWyB0eXBlIF0gPSBuZXcgUmVnRXhwKCBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlICsgKC8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSkgKTsNCglFeHByLmxlZnRNYXRjaFsgdHlwZSBdID0gbmV3IFJlZ0V4cCggLyheKD86LnxccnxcbikqPykvLnNvdXJjZSArIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLCBmZXNjYXBlKSApOw0KfQ0KDQp2YXIgbWFrZUFycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3VsdHMpIHsNCglhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSwgMCApOw0KDQoJaWYgKCByZXN1bHRzICkgew0KCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7DQoJCXJldHVybiByZXN1bHRzOw0KCX0NCgkNCglyZXR1cm4gYXJyYXk7DQp9Ow0KDQovLyBQZXJmb3JtIGEgc2ltcGxlIGNoZWNrIHRvIGRldGVybWluZSBpZiB0aGUgYnJvd3NlciBpcyBjYXBhYmxlIG9mDQovLyBjb252ZXJ0aW5nIGEgTm9kZUxpc3QgdG8gYW4gYXJyYXkgdXNpbmcgYnVpbHRpbiBtZXRob2RzLg0KLy8gQWxzbyB2ZXJpZmllcyB0aGF0IHRoZSByZXR1cm5lZCBhcnJheSBob2xkcyBET00gbm9kZXMNCi8vICh3aGljaCBpcyBub3QgdGhlIGNhc2UgaW4gdGhlIEJsYWNrYmVycnkgYnJvd3NlcikNCnRyeSB7DQoJQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLCAwIClbMF0ubm9kZVR5cGU7DQoNCi8vIFByb3ZpZGUgYSBmYWxsYmFjayBtZXRob2QgaWYgaXQgZG9lcyBub3Qgd29yaw0KfSBjYXRjaChlKXsNCgltYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgew0KCQl2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXSwgaSA9IDA7DQoNCgkJaWYgKCB0b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsNCgkJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCByZXQsIGFycmF5ICk7DQoJCX0gZWxzZSB7DQoJCQlpZiAoIHR5cGVvZiBhcnJheS5sZW5ndGggPT09ICJudW1iZXIiICkgew0KCQkJCWZvciAoIHZhciBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrICkgew0KCQkJCQlyZXQucHVzaCggYXJyYXlbaV0gKTsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCWZvciAoIDsgYXJyYXlbaV07IGkrKyApIHsNCgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIHJldDsNCgl9Ow0KfQ0KDQp2YXIgc29ydE9yZGVyOw0KDQppZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApIHsNCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsNCgkJaWYgKCAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiB8fCAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApIHsNCgkJCWlmICggYSA9PSBiICkgew0KCQkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7DQoJCQl9DQoJCQlyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/IC0xIDogMTsNCgkJfQ0KDQoJCXZhciByZXQgPSBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgNCA/IC0xIDogYSA9PT0gYiA/IDAgOiAxOw0KCQlpZiAoIHJldCA9PT0gMCApIHsNCgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7DQoJCX0NCgkJcmV0dXJuIHJldDsNCgl9Ow0KfSBlbHNlIGlmICggInNvdXJjZUluZGV4IiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgKSB7DQoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7DQoJCWlmICggIWEuc291cmNlSW5kZXggfHwgIWIuc291cmNlSW5kZXggKSB7DQoJCQlpZiAoIGEgPT0gYiApIHsNCgkJCQloYXNEdXBsaWNhdGUgPSB0cnVlOw0KCQkJfQ0KCQkJcmV0dXJuIGEuc291cmNlSW5kZXggPyAtMSA6IDE7DQoJCX0NCg0KCQl2YXIgcmV0ID0gYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7DQoJCWlmICggcmV0ID09PSAwICkgew0KCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsNCgkJfQ0KCQlyZXR1cm4gcmV0Ow0KCX07DQp9IGVsc2UgaWYgKCBkb2N1bWVudC5jcmVhdGVSYW5nZSApIHsNCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsNCgkJaWYgKCAhYS5vd25lckRvY3VtZW50IHx8ICFiLm93bmVyRG9jdW1lbnQgKSB7DQoJCQlpZiAoIGEgPT0gYiApIHsNCgkJCQloYXNEdXBsaWNhdGUgPSB0cnVlOw0KCQkJfQ0KCQkJcmV0dXJuIGEub3duZXJEb2N1bWVudCA/IC0xIDogMTsNCgkJfQ0KDQoJCXZhciBhUmFuZ2UgPSBhLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSwgYlJhbmdlID0gYi5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7DQoJCWFSYW5nZS5zZXRTdGFydChhLCAwKTsNCgkJYVJhbmdlLnNldEVuZChhLCAwKTsNCgkJYlJhbmdlLnNldFN0YXJ0KGIsIDApOw0KCQliUmFuZ2Uuc2V0RW5kKGIsIDApOw0KCQl2YXIgcmV0ID0gYVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsIGJSYW5nZSk7DQoJCWlmICggcmV0ID09PSAwICkgew0KCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsNCgkJfQ0KCQlyZXR1cm4gcmV0Ow0KCX07DQp9DQoNCi8vIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJlaXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzDQpTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtcyApIHsNCgl2YXIgcmV0ID0gIiIsIGVsZW07DQoNCglmb3IgKCB2YXIgaSA9IDA7IGVsZW1zW2ldOyBpKysgKSB7DQoJCWVsZW0gPSBlbGVtc1tpXTsNCg0KCQkvLyBHZXQgdGhlIHRleHQgZnJvbSB0ZXh0IG5vZGVzIGFuZCBDREFUQSBub2Rlcw0KCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gNCApIHsNCgkJCXJldCArPSBlbGVtLm5vZGVWYWx1ZTsNCg0KCQkvLyBUcmF2ZXJzZSBldmVyeXRoaW5nIGVsc2UsIGV4Y2VwdCBjb21tZW50IG5vZGVzDQoJCX0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgIT09IDggKSB7DQoJCQlyZXQgKz0gU2l6emxlLmdldFRleHQoIGVsZW0uY2hpbGROb2RlcyApOw0KCQl9DQoJfQ0KDQoJcmV0dXJuIHJldDsNCn07DQoNCi8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbg0KLy8gcXVlcnlpbmcgYnkgZ2V0RWxlbWVudEJ5SWQgKGFuZCBwcm92aWRlIGEgd29ya2Fyb3VuZCkNCihmdW5jdGlvbigpew0KCS8vIFdlJ3JlIGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUNCgl2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLA0KCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsNCglmb3JtLmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgaWQgKyAiJy8+IjsNCg0KCS8vIEluamVjdCBpdCBpbnRvIHRoZSByb290IGVsZW1lbnQsIGNoZWNrIGl0cyBzdGF0dXMsIGFuZCByZW1vdmUgaXQgcXVpY2tseQ0KCXZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KCXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290LmZpcnN0Q2hpbGQgKTsNCg0KCS8vIFRoZSB3b3JrYXJvdW5kIGhhcyB0byBkbyBhZGRpdGlvbmFsIGNoZWNrcyBhZnRlciBhIGdldEVsZW1lbnRCeUlkDQoJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0aGUgYnJhbmNoaW5nKQ0KCWlmICggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkICkgKSB7DQoJCUV4cHIuZmluZC5JRCA9IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7DQoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7DQoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsNCgkJCQlyZXR1cm4gbSA/IG0uaWQgPT09IG1hdGNoWzFdIHx8IHR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIG0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWUgPT09IG1hdGNoWzFdID8gW21dIDogdW5kZWZpbmVkIDogW107DQoJCQl9DQoJCX07DQoNCgkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbihlbGVtLCBtYXRjaCl7DQoJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsNCgkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIG5vZGUgJiYgbm9kZS5ub2RlVmFsdWUgPT09IG1hdGNoOw0KCQl9Ow0KCX0NCg0KCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsNCglyb290ID0gZm9ybSA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFDQp9KSgpOw0KDQooZnVuY3Rpb24oKXsNCgkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBvbmx5IGVsZW1lbnRzDQoJLy8gd2hlbiBkb2luZyBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpDQoNCgkvLyBDcmVhdGUgYSBmYWtlIGVsZW1lbnQNCgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOw0KDQoJLy8gTWFrZSBzdXJlIG5vIGNvbW1lbnRzIGFyZSBmb3VuZA0KCWlmICggZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoID4gMCApIHsNCgkJRXhwci5maW5kLlRBRyA9IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0KXsNCgkJCXZhciByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShtYXRjaFsxXSk7DQoNCgkJCS8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHMNCgkJCWlmICggbWF0Y2hbMV0gPT09ICIqIiApIHsNCgkJCQl2YXIgdG1wID0gW107DQoNCgkJCQlmb3IgKCB2YXIgaSA9IDA7IHJlc3VsdHNbaV07IGkrKyApIHsNCgkJCQkJaWYgKCByZXN1bHRzW2ldLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQkJdG1wLnB1c2goIHJlc3VsdHNbaV0gKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCXJlc3VsdHMgPSB0bXA7DQoJCQl9DQoNCgkJCXJldHVybiByZXN1bHRzOw0KCQl9Ow0KCX0NCg0KCS8vIENoZWNrIHRvIHNlZSBpZiBhbiBhdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcw0KCWRpdi5pbm5lckhUTUwgPSAiPGEgaHJlZj0nIyc+PC9hPiI7DQoJaWYgKCBkaXYuZmlyc3RDaGlsZCAmJiB0eXBlb2YgZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlICE9PSAidW5kZWZpbmVkIiAmJg0KCQkJZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgIT09ICIjIiApIHsNCgkJRXhwci5hdHRySGFuZGxlLmhyZWYgPSBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIsIDIpOw0KCQl9Ow0KCX0NCg0KCWRpdiA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFDQp9KSgpOw0KDQppZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSB7DQoJKGZ1bmN0aW9uKCl7DQoJCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KCQlkaXYuaW5uZXJIVE1MID0gIjxwIGNsYXNzPSdURVNUJz48L3A+IjsNCg0KCQkvLyBTYWZhcmkgY2FuJ3QgaGFuZGxlIHVwcGVyY2FzZSBvciB1bmljb2RlIGNoYXJhY3RlcnMgd2hlbg0KCQkvLyBpbiBxdWlya3MgbW9kZS4NCgkJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7DQoJCQlyZXR1cm47DQoJCX0NCgkNCgkJU2l6emxlID0gZnVuY3Rpb24ocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKXsNCgkJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50Ow0KDQoJCQkvLyBPbmx5IHVzZSBxdWVyeVNlbGVjdG9yQWxsIG9uIG5vbi1YTUwgZG9jdW1lbnRzDQoJCQkvLyAoSUQgc2VsZWN0b3JzIGRvbid0IHdvcmsgaW4gbm9uLUhUTUwgZG9jdW1lbnRzKQ0KCQkJaWYgKCAhc2VlZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmICFTaXp6bGUuaXNYTUwoY29udGV4dCkgKSB7DQoJCQkJdHJ5IHsNCgkJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsNCgkJCQl9IGNhdGNoKGUpe30NCgkJCX0NCgkJDQoJCQlyZXR1cm4gb2xkU2l6emxlKHF1ZXJ5LCBjb250ZXh0LCBleHRyYSwgc2VlZCk7DQoJCX07DQoNCgkJZm9yICggdmFyIHByb3AgaW4gb2xkU2l6emxlICkgew0KCQkJU2l6emxlWyBwcm9wIF0gPSBvbGRTaXp6bGVbIHByb3AgXTsNCgkJfQ0KDQoJCWRpdiA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFDQoJfSkoKTsNCn0NCg0KKGZ1bmN0aW9uKCl7DQoJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KDQoJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7DQoNCgkvLyBPcGVyYSBjYW4ndCBmaW5kIGEgc2Vjb25kIGNsYXNzbmFtZSAoaW4gOS42KQ0KCS8vIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGdldEVsZW1lbnRzQnlDbGFzc05hbWUgYWN0dWFsbHkgZXhpc3RzDQoJaWYgKCAhZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgfHwgZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDAgKSB7DQoJCXJldHVybjsNCgl9DQoNCgkvLyBTYWZhcmkgY2FjaGVzIGNsYXNzIGF0dHJpYnV0ZXMsIGRvZXNuJ3QgY2F0Y2ggY2hhbmdlcyAoaW4gMy4yKQ0KCWRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0gImUiOw0KDQoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMSApIHsNCgkJcmV0dXJuOw0KCX0NCgkNCglFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1MiKTsNCglFeHByLmZpbmQuQ0xBU1MgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpIHsNCgkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7DQoJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG1hdGNoWzFdKTsNCgkJfQ0KCX07DQoNCglkaXYgPSBudWxsOyAvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQ0KfSkoKTsNCg0KZnVuY3Rpb24gZGlyTm9kZUNoZWNrKCBkaXIsIGN1ciwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICkgew0KCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsNCgkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsNCgkJaWYgKCBlbGVtICkgew0KCQkJZWxlbSA9IGVsZW1bZGlyXTsNCgkJCXZhciBtYXRjaCA9IGZhbHNlOw0KDQoJCQl3aGlsZSAoIGVsZW0gKSB7DQoJCQkJaWYgKCBlbGVtLnNpemNhY2hlID09PSBkb25lTmFtZSApIHsNCgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07DQoJCQkJCWJyZWFrOw0KCQkJCX0NCg0KCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsNCgkJCQkJZWxlbS5zaXpjYWNoZSA9IGRvbmVOYW1lOw0KCQkJCQllbGVtLnNpenNldCA9IGk7DQoJCQkJfQ0KDQoJCQkJaWYgKCBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGN1ciApIHsNCgkJCQkJbWF0Y2ggPSBlbGVtOw0KCQkJCQlicmVhazsNCgkJCQl9DQoNCgkJCQllbGVtID0gZWxlbVtkaXJdOw0KCQkJfQ0KDQoJCQljaGVja1NldFtpXSA9IG1hdGNoOw0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsNCglmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7DQoJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07DQoJCWlmICggZWxlbSApIHsNCgkJCWVsZW0gPSBlbGVtW2Rpcl07DQoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsNCg0KCQkJd2hpbGUgKCBlbGVtICkgew0KCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7DQoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOw0KCQkJCQlicmVhazsNCgkJCQl9DQoNCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7DQoJCQkJCWlmICggIWlzWE1MICkgew0KCQkJCQkJZWxlbS5zaXpjYWNoZSA9IGRvbmVOYW1lOw0KCQkJCQkJZWxlbS5zaXpzZXQgPSBpOw0KCQkJCQl9DQoJCQkJCWlmICggdHlwZW9mIGN1ciAhPT0gInN0cmluZyIgKSB7DQoJCQkJCQlpZiAoIGVsZW0gPT09IGN1ciApIHsNCgkJCQkJCQltYXRjaCA9IHRydWU7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQl9DQoNCgkJCQkJfSBlbHNlIGlmICggU2l6emxlLmZpbHRlciggY3VyLCBbZWxlbV0gKS5sZW5ndGggPiAwICkgew0KCQkJCQkJbWF0Y2ggPSBlbGVtOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQllbGVtID0gZWxlbVtkaXJdOw0KCQkJfQ0KDQoJCQljaGVja1NldFtpXSA9IG1hdGNoOw0KCQl9DQoJfQ0KfQ0KDQpTaXp6bGUuY29udGFpbnMgPSBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/IGZ1bmN0aW9uKGEsIGIpew0KCXJldHVybiAhIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTYpOw0KfSA6IGZ1bmN0aW9uKGEsIGIpew0KCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5jb250YWlucyhiKSA6IHRydWUpOw0KfTsNCg0KU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oZWxlbSl7DQoJLy8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdA0KCS8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKSANCgl2YXIgZG9jdW1lbnRFbGVtZW50ID0gKGVsZW0gPyBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSA6IDApLmRvY3VtZW50RWxlbWVudDsNCglyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgOiBmYWxzZTsNCn07DQoNCnZhciBwb3NQcm9jZXNzID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQpew0KCXZhciB0bXBTZXQgPSBbXSwgbGF0ZXIgPSAiIiwgbWF0Y2gsDQoJCXJvb3QgPSBjb250ZXh0Lm5vZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4dDsNCg0KCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcg0KCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0byB0aGUgZW5kDQoJd2hpbGUgKCAobWF0Y2ggPSBFeHByLm1hdGNoLlBTRVVETy5leGVjKCBzZWxlY3RvciApKSApIHsNCgkJbGF0ZXIgKz0gbWF0Y2hbMF07DQoJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7DQoJfQ0KDQoJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7DQoNCglmb3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsNCgkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7DQoJfQ0KDQoJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsNCn07DQoNCi8vIEVYUE9TRQ0KDQp3aW5kb3cudGlueW1jZS5kb20uU2l6emxlID0gU2l6emxlOw0KDQp9KSgpOw0KDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBlYWNoID0gdGlueW1jZS5lYWNoLCBET00gPSB0aW55bWNlLkRPTSwgaXNJRSA9IHRpbnltY2UuaXNJRSwgaXNXZWJLaXQgPSB0aW55bWNlLmlzV2ViS2l0LCBFdmVudDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLmRvbS5FdmVudFV0aWxzJywgew0KCQlFdmVudFV0aWxzIDogZnVuY3Rpb24oKSB7DQoJCQl0aGlzLmluaXRzID0gW107DQoJCQl0aGlzLmV2ZW50cyA9IFtdOw0KCQl9LA0KDQoJCWFkZCA6IGZ1bmN0aW9uKG8sIG4sIGYsIHMpIHsNCgkJCXZhciBjYiwgdCA9IHRoaXMsIGVsID0gdC5ldmVudHMsIHI7DQoNCgkJCWlmIChuIGluc3RhbmNlb2YgQXJyYXkpIHsNCgkJCQlyID0gW107DQoNCgkJCQllYWNoKG4sIGZ1bmN0aW9uKG4pIHsNCgkJCQkJci5wdXNoKHQuYWRkKG8sIG4sIGYsIHMpKTsNCgkJCQl9KTsNCg0KCQkJCXJldHVybiByOw0KCQkJfQ0KDQoJCQkvLyBIYW5kbGUgYXJyYXkNCgkJCWlmIChvICYmIG8uaGFzT3duUHJvcGVydHkgJiYgbyBpbnN0YW5jZW9mIEFycmF5KSB7DQoJCQkJciA9IFtdOw0KDQoJCQkJZWFjaChvLCBmdW5jdGlvbihvKSB7DQoJCQkJCW8gPSBET00uZ2V0KG8pOw0KCQkJCQlyLnB1c2godC5hZGQobywgbiwgZiwgcykpOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIHI7DQoJCQl9DQoNCgkJCW8gPSBET00uZ2V0KG8pOw0KDQoJCQlpZiAoIW8pDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBTZXR1cCBldmVudCBjYWxsYmFjaw0KCQkJY2IgPSBmdW5jdGlvbihlKSB7DQoJCQkJLy8gSXMgYWxsIGV2ZW50cyBkaXNhYmxlZA0KCQkJCWlmICh0LmRpc2FibGVkKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQllID0gZSB8fCB3aW5kb3cuZXZlbnQ7DQoNCgkJCQkvLyBQYXRjaCBpbiB0YXJnZXQsIHByZXZlbnREZWZhdWx0IGFuZCBzdG9wUHJvcGFnYXRpb24gaW4gSUUgaXQncyBXM0MgdmFsaWQNCgkJCQlpZiAoZSAmJiBpc0lFKSB7DQoJCQkJCWlmICghZS50YXJnZXQpDQoJCQkJCQllLnRhcmdldCA9IGUuc3JjRWxlbWVudDsNCg0KCQkJCQkvLyBQYXRjaCBpbiBwcmV2ZW50RGVmYXVsdCwgc3RvcFByb3BhZ2F0aW9uIG1ldGhvZHMgZm9yIFczQyBjb21wYXRpYmlsaXR5DQoJCQkJCXRpbnltY2UuZXh0ZW5kKGUsIHQuX3N0b3BwZXJzKTsNCgkJCQl9DQoNCgkJCQlpZiAoIXMpDQoJCQkJCXJldHVybiBmKGUpOw0KDQoJCQkJcmV0dXJuIGYuY2FsbChzLCBlKTsNCgkJCX07DQoNCgkJCWlmIChuID09ICd1bmxvYWQnKSB7DQoJCQkJdGlueW1jZS51bmxvYWRzLnVuc2hpZnQoe2Z1bmMgOiBjYn0pOw0KCQkJCXJldHVybiBjYjsNCgkJCX0NCg0KCQkJaWYgKG4gPT0gJ2luaXQnKSB7DQoJCQkJaWYgKHQuZG9tTG9hZGVkKQ0KCQkJCQljYigpOw0KCQkJCWVsc2UNCgkJCQkJdC5pbml0cy5wdXNoKGNiKTsNCg0KCQkJCXJldHVybiBjYjsNCgkJCX0NCg0KCQkJLy8gU3RvcmUgYXdheSBsaXN0ZW5lciByZWZlcmVuY2UNCgkJCWVsLnB1c2goew0KCQkJCW9iaiA6IG8sDQoJCQkJbmFtZSA6IG4sDQoJCQkJZnVuYyA6IGYsDQoJCQkJY2Z1bmMgOiBjYiwNCgkJCQlzY29wZSA6IHMNCgkJCX0pOw0KDQoJCQl0Ll9hZGQobywgbiwgY2IpOw0KDQoJCQlyZXR1cm4gZjsNCgkJfSwNCg0KCQlyZW1vdmUgOiBmdW5jdGlvbihvLCBuLCBmKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGEgPSB0LmV2ZW50cywgcyA9IGZhbHNlLCByOw0KDQoJCQkvLyBIYW5kbGUgYXJyYXkNCgkJCWlmIChvICYmIG8uaGFzT3duUHJvcGVydHkgJiYgbyBpbnN0YW5jZW9mIEFycmF5KSB7DQoJCQkJciA9IFtdOw0KDQoJCQkJZWFjaChvLCBmdW5jdGlvbihvKSB7DQoJCQkJCW8gPSBET00uZ2V0KG8pOw0KCQkJCQlyLnB1c2godC5yZW1vdmUobywgbiwgZikpOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIHI7DQoJCQl9DQoNCgkJCW8gPSBET00uZ2V0KG8pOw0KDQoJCQllYWNoKGEsIGZ1bmN0aW9uKGUsIGkpIHsNCgkJCQlpZiAoZS5vYmogPT0gbyAmJiBlLm5hbWUgPT0gbiAmJiAoIWYgfHwgKGUuZnVuYyA9PSBmIHx8IGUuY2Z1bmMgPT0gZikpKSB7DQoJCQkJCWEuc3BsaWNlKGksIDEpOw0KCQkJCQl0Ll9yZW1vdmUobywgbiwgZS5jZnVuYyk7DQoJCQkJCXMgPSB0cnVlOw0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXJldHVybiBzOw0KCQl9LA0KDQoJCWNsZWFyIDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzLCBhID0gdC5ldmVudHMsIGksIGU7DQoNCgkJCWlmIChvKSB7DQoJCQkJbyA9IERPTS5nZXQobyk7DQoNCgkJCQlmb3IgKGkgPSBhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCWUgPSBhW2ldOw0KDQoJCQkJCWlmIChlLm9iaiA9PT0gbykgew0KCQkJCQkJdC5fcmVtb3ZlKGUub2JqLCBlLm5hbWUsIGUuY2Z1bmMpOw0KCQkJCQkJZS5vYmogPSBlLmNmdW5jID0gbnVsbDsNCgkJCQkJCWEuc3BsaWNlKGksIDEpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KDQoJCWNhbmNlbCA6IGZ1bmN0aW9uKGUpIHsNCgkJCWlmICghZSkNCgkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCXRoaXMuc3RvcChlKTsNCg0KCQkJcmV0dXJuIHRoaXMucHJldmVudChlKTsNCgkJfSwNCg0KCQlzdG9wIDogZnVuY3Rpb24oZSkgew0KCQkJaWYgKGUuc3RvcFByb3BhZ2F0aW9uKQ0KCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7DQoJCQllbHNlDQoJCQkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0sDQoNCgkJcHJldmVudCA6IGZ1bmN0aW9uKGUpIHsNCgkJCWlmIChlLnByZXZlbnREZWZhdWx0KQ0KCQkJCWUucHJldmVudERlZmF1bHQoKTsNCgkJCWVsc2UNCgkJCQllLnJldHVyblZhbHVlID0gZmFsc2U7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfSwNCg0KCQlkZXN0cm95IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWVhY2godC5ldmVudHMsIGZ1bmN0aW9uKGUsIGkpIHsNCgkJCQl0Ll9yZW1vdmUoZS5vYmosIGUubmFtZSwgZS5jZnVuYyk7DQoJCQkJZS5vYmogPSBlLmNmdW5jID0gbnVsbDsNCgkJCX0pOw0KDQoJCQl0LmV2ZW50cyA9IFtdOw0KCQkJdCA9IG51bGw7DQoJCX0sDQoNCgkJX2FkZCA6IGZ1bmN0aW9uKG8sIG4sIGYpIHsNCgkJCWlmIChvLmF0dGFjaEV2ZW50KQ0KCQkJCW8uYXR0YWNoRXZlbnQoJ29uJyArIG4sIGYpOw0KCQkJZWxzZSBpZiAoby5hZGRFdmVudExpc3RlbmVyKQ0KCQkJCW8uYWRkRXZlbnRMaXN0ZW5lcihuLCBmLCBmYWxzZSk7DQoJCQllbHNlDQoJCQkJb1snb24nICsgbl0gPSBmOw0KCQl9LA0KDQoJCV9yZW1vdmUgOiBmdW5jdGlvbihvLCBuLCBmKSB7DQoJCQlpZiAobykgew0KCQkJCXRyeSB7DQoJCQkJCWlmIChvLmRldGFjaEV2ZW50KQ0KCQkJCQkJby5kZXRhY2hFdmVudCgnb24nICsgbiwgZik7DQoJCQkJCWVsc2UgaWYgKG8ucmVtb3ZlRXZlbnRMaXN0ZW5lcikNCgkJCQkJCW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLCBmLCBmYWxzZSk7DQoJCQkJCWVsc2UNCgkJCQkJCW9bJ29uJyArIG5dID0gbnVsbDsNCgkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkvLyBNaWdodCBmYWlsIHdpdGggcGVybWlzc2lvbiBkZW5pbmVkIG9uIElFIHNvIHdlIGp1c3QgaWdub3JlIHRoYXQNCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkJX3BhZ2VJbml0IDogZnVuY3Rpb24od2luKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCS8vIEtlZXAgaXQgZnJvbSBydW5uaW5nIG1vcmUgdGhhbiBvbmNlDQoJCQlpZiAodC5kb21Mb2FkZWQpDQoJCQkJcmV0dXJuOw0KDQoJCQl0LmRvbUxvYWRlZCA9IHRydWU7DQoNCgkJCWVhY2godC5pbml0cywgZnVuY3Rpb24oYykgew0KCQkJCWMoKTsNCgkJCX0pOw0KDQoJCQl0LmluaXRzID0gW107DQoJCX0sDQoNCgkJX3dhaXQgOiBmdW5jdGlvbih3aW4pIHsNCgkJCXZhciB0ID0gdGhpcywgZG9jID0gd2luLmRvY3VtZW50Ow0KDQoJCQkvLyBObyBuZWVkIHNpbmNlIHRoZSBkb2N1bWVudCBpcyBhbHJlYWR5IGxvYWRlZA0KCQkJaWYgKHdpbi50aW55TUNFX0daICYmIHRpbnlNQ0VfR1oubG9hZGVkKSB7DQoJCQkJdC5kb21Mb2FkZWQgPSAxOw0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJLy8gVXNlIElFIG1ldGhvZA0KCQkJaWYgKGRvYy5hdHRhY2hFdmVudCkgew0KCQkJCWRvYy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7DQoJCQkJCWlmIChkb2MucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KCQkJCQkJZG9jLmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsNCgkJCQkJCXQuX3BhZ2VJbml0KHdpbik7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCWlmIChkb2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICYmIHdpbiA9PSB3aW4udG9wKSB7DQoJCQkJCShmdW5jdGlvbigpIHsNCgkJCQkJCWlmICh0LmRvbUxvYWRlZCkNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCXRyeSB7DQoJCQkJCQkJLy8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkNCgkJCQkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLw0KCQkJCQkJCWRvYy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKTsNCgkJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkJc2V0VGltZW91dChhcmd1bWVudHMuY2FsbGVlLCAwKTsNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCXQuX3BhZ2VJbml0KHdpbik7DQoJCQkJCX0pKCk7DQoJCQkJfQ0KCQkJfSBlbHNlIGlmIChkb2MuYWRkRXZlbnRMaXN0ZW5lcikgew0KCQkJCXQuX2FkZCh3aW4sICdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7DQoJCQkJCXQuX3BhZ2VJbml0KHdpbik7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXQuX2FkZCh3aW4sICdsb2FkJywgZnVuY3Rpb24oKSB7DQoJCQkJdC5fcGFnZUluaXQod2luKTsNCgkJCX0pOw0KCQl9LA0KDQoJCV9zdG9wcGVycyA6IHsNCgkJCXByZXZlbnREZWZhdWx0IDogIGZ1bmN0aW9uKCkgew0KCQkJCXRoaXMucmV0dXJuVmFsdWUgPSBmYWxzZTsNCgkJCX0sDQoNCgkJCXN0b3BQcm9wYWdhdGlvbiA6IGZ1bmN0aW9uKCkgew0KCQkJCXRoaXMuY2FuY2VsQnViYmxlID0gdHJ1ZTsNCgkJCX0NCgkJfQ0KCX0pOw0KDQoJRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCA9IG5ldyB0aW55bWNlLmRvbS5FdmVudFV0aWxzKCk7DQoNCgkvLyBEaXNwYXRjaCBET00gY29udGVudCBsb2FkZWQgZXZlbnQgZm9yIElFIGFuZCBTYWZhcmkNCglFdmVudC5fd2FpdCh3aW5kb3cpOw0KDQoJdGlueW1jZS5hZGRVbmxvYWQoZnVuY3Rpb24oKSB7DQoJCUV2ZW50LmRlc3Ryb3koKTsNCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXRpbnltY2UuZG9tLkVsZW1lbnQgPSBmdW5jdGlvbihpZCwgc2V0dGluZ3MpIHsNCgkJdmFyIHQgPSB0aGlzLCBkb20sIGVsOw0KDQoJCXQuc2V0dGluZ3MgPSBzZXR0aW5ncyA9IHNldHRpbmdzIHx8IHt9Ow0KCQl0LmlkID0gaWQ7DQoJCXQuZG9tID0gZG9tID0gc2V0dGluZ3MuZG9tIHx8IHRpbnltY2UuRE9NOw0KDQoJCS8vIE9ubHkgSUUgbGVha3MgRE9NIHJlZmVyZW5jZXMsIHRoaXMgaXMgYSBsb3QgZmFzdGVyDQoJCWlmICghdGlueW1jZS5pc0lFKQ0KCQkJZWwgPSBkb20uZ2V0KHQuaWQpOw0KDQoJCXRpbnltY2UuZWFjaCgNCgkJCQkoJ2dldFBvcyxnZXRSZWN0LGdldFBhcmVudCxhZGQsc2V0U3R5bGUsZ2V0U3R5bGUsc2V0U3R5bGVzLCcgKyANCgkJCQknc2V0QXR0cmliLHNldEF0dHJpYnMsZ2V0QXR0cmliLGFkZENsYXNzLHJlbW92ZUNsYXNzLCcgKyANCgkJCQknaGFzQ2xhc3MsZ2V0T3V0ZXJIVE1MLHNldE91dGVySFRNTCxyZW1vdmUsc2hvdyxoaWRlLCcgKyANCgkJCQknaXNIaWRkZW4sc2V0SFRNTCxnZXQnKS5zcGxpdCgvLC8pDQoJCQksIGZ1bmN0aW9uKGspIHsNCgkJCQl0W2tdID0gZnVuY3Rpb24oKSB7DQoJCQkJCXZhciBhID0gW2lkXSwgaTsNCg0KCQkJCQlmb3IgKGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQ0KCQkJCQkJYS5wdXNoKGFyZ3VtZW50c1tpXSk7DQoNCgkJCQkJYSA9IGRvbVtrXS5hcHBseShkb20sIGEpOw0KCQkJCQl0LnVwZGF0ZShrKTsNCg0KCQkJCQlyZXR1cm4gYTsNCgkJCQl9Ow0KCQl9KTsNCg0KCQl0aW55bWNlLmV4dGVuZCh0LCB7DQoJCQlvbiA6IGZ1bmN0aW9uKG4sIGYsIHMpIHsNCgkJCQlyZXR1cm4gdGlueW1jZS5kb20uRXZlbnQuYWRkKHQuaWQsIG4sIGYsIHMpOw0KCQkJfSwNCg0KCQkJZ2V0WFkgOiBmdW5jdGlvbigpIHsNCgkJCQlyZXR1cm4gew0KCQkJCQl4IDogcGFyc2VJbnQodC5nZXRTdHlsZSgnbGVmdCcpKSwNCgkJCQkJeSA6IHBhcnNlSW50KHQuZ2V0U3R5bGUoJ3RvcCcpKQ0KCQkJCX07DQoJCQl9LA0KDQoJCQlnZXRTaXplIDogZnVuY3Rpb24oKSB7DQoJCQkJdmFyIG4gPSBkb20uZ2V0KHQuaWQpOw0KDQoJCQkJcmV0dXJuIHsNCgkJCQkJdyA6IHBhcnNlSW50KHQuZ2V0U3R5bGUoJ3dpZHRoJykgfHwgbi5jbGllbnRXaWR0aCksDQoJCQkJCWggOiBwYXJzZUludCh0LmdldFN0eWxlKCdoZWlnaHQnKSB8fCBuLmNsaWVudEhlaWdodCkNCgkJCQl9Ow0KCQkJfSwNCg0KCQkJbW92ZVRvIDogZnVuY3Rpb24oeCwgeSkgew0KCQkJCXQuc2V0U3R5bGVzKHtsZWZ0IDogeCwgdG9wIDogeX0pOw0KCQkJfSwNCg0KCQkJbW92ZUJ5IDogZnVuY3Rpb24oeCwgeSkgew0KCQkJCXZhciBwID0gdC5nZXRYWSgpOw0KDQoJCQkJdC5tb3ZlVG8ocC54ICsgeCwgcC55ICsgeSk7DQoJCQl9LA0KDQoJCQlyZXNpemVUbyA6IGZ1bmN0aW9uKHcsIGgpIHsNCgkJCQl0LnNldFN0eWxlcyh7d2lkdGggOiB3LCBoZWlnaHQgOiBofSk7DQoJCQl9LA0KDQoJCQlyZXNpemVCeSA6IGZ1bmN0aW9uKHcsIGgpIHsNCgkJCQl2YXIgcyA9IHQuZ2V0U2l6ZSgpOw0KDQoJCQkJdC5yZXNpemVUbyhzLncgKyB3LCBzLmggKyBoKTsNCgkJCX0sDQoNCgkJCXVwZGF0ZSA6IGZ1bmN0aW9uKGspIHsNCgkJCQl2YXIgYjsNCg0KCQkJCWlmICh0aW55bWNlLmlzSUU2ICYmIHNldHRpbmdzLmJsb2NrZXIpIHsNCgkJCQkJayA9IGsgfHwgJyc7DQoNCgkJCQkJLy8gSWdub3JlIGdldHRlcnMNCgkJCQkJaWYgKGsuaW5kZXhPZignZ2V0JykgPT09IDAgfHwgay5pbmRleE9mKCdoYXMnKSA9PT0gMCB8fCBrLmluZGV4T2YoJ2lzJykgPT09IDApDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJLy8gUmVtb3ZlIGJsb2NrZXIgb24gcmVtb3ZlDQoJCQkJCWlmIChrID09ICdyZW1vdmUnKSB7DQoJCQkJCQlkb20ucmVtb3ZlKHQuYmxvY2tlcik7DQoJCQkJCQlyZXR1cm47DQoJCQkJCX0NCg0KCQkJCQlpZiAoIXQuYmxvY2tlcikgew0KCQkJCQkJdC5ibG9ja2VyID0gZG9tLnVuaXF1ZUlkKCk7DQoJCQkJCQliID0gZG9tLmFkZChzZXR0aW5ncy5jb250YWluZXIgfHwgZG9tLmdldFJvb3QoKSwgJ2lmcmFtZScsIHtpZCA6IHQuYmxvY2tlciwgc3R5bGUgOiAncG9zaXRpb246YWJzb2x1dGU7JywgZnJhbWVCb3JkZXIgOiAwLCBzcmMgOiAnamF2YXNjcmlwdDoiIid9KTsNCgkJCQkJCWRvbS5zZXRTdHlsZShiLCAnb3BhY2l0eScsIDApOw0KCQkJCQl9IGVsc2UNCgkJCQkJCWIgPSBkb20uZ2V0KHQuYmxvY2tlcik7DQoNCgkJCQkJZG9tLnNldFN0eWxlcyhiLCB7DQoJCQkJCQlsZWZ0IDogdC5nZXRTdHlsZSgnbGVmdCcsIDEpLA0KCQkJCQkJdG9wIDogdC5nZXRTdHlsZSgndG9wJywgMSksDQoJCQkJCQl3aWR0aCA6IHQuZ2V0U3R5bGUoJ3dpZHRoJywgMSksDQoJCQkJCQloZWlnaHQgOiB0LmdldFN0eWxlKCdoZWlnaHQnLCAxKSwNCgkJCQkJCWRpc3BsYXkgOiB0LmdldFN0eWxlKCdkaXNwbGF5JywgMSksDQoJCQkJCQl6SW5kZXggOiBwYXJzZUludCh0LmdldFN0eWxlKCd6SW5kZXgnLCAxKSB8fCAwKSAtIDENCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KCQl9KTsNCgl9Ow0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJZnVuY3Rpb24gdHJpbU5sKHMpIHsNCgkJcmV0dXJuIHMucmVwbGFjZSgvW1xuXHJdKy9nLCAnJyk7DQoJfTsNCg0KCS8vIFNob3J0ZW4gbmFtZXMNCgl2YXIgaXMgPSB0aW55bWNlLmlzLCBpc0lFID0gdGlueW1jZS5pc0lFLCBlYWNoID0gdGlueW1jZS5lYWNoOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UuZG9tLlNlbGVjdGlvbicsIHsNCgkJU2VsZWN0aW9uIDogZnVuY3Rpb24oZG9tLCB3aW4sIHNlcmlhbGl6ZXIpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5kb20gPSBkb207DQoJCQl0LndpbiA9IHdpbjsNCgkJCXQuc2VyaWFsaXplciA9IHNlcmlhbGl6ZXI7DQoNCgkJCS8vIEFkZCBldmVudHMNCgkJCWVhY2goWw0KCQkJCSdvbkJlZm9yZVNldENvbnRlbnQnLA0KCQkJCSdvbkJlZm9yZUdldENvbnRlbnQnLA0KCQkJCSdvblNldENvbnRlbnQnLA0KCQkJCSdvbkdldENvbnRlbnQnDQoJCQldLCBmdW5jdGlvbihlKSB7DQoJCQkJdFtlXSA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0KTsNCgkJCX0pOw0KDQoJCQkvLyBObyBXM0MgUmFuZ2Ugc3VwcG9ydA0KCQkJaWYgKCF0Lndpbi5nZXRTZWxlY3Rpb24pDQoJCQkJdC50cmlkZW50U2VsID0gbmV3IHRpbnltY2UuZG9tLlRyaWRlbnRTZWxlY3Rpb24odCk7DQoNCgkJCWlmICh0aW55bWNlLmlzSUUgJiYgZG9tLmJveE1vZGVsKQ0KCQkJCXRoaXMuX2ZpeElFU2VsZWN0aW9uKCk7DQoNCgkJCS8vIFByZXZlbnQgbGVha3MNCgkJCXRpbnltY2UuYWRkVW5sb2FkKHQuZGVzdHJveSwgdCk7DQoJCX0sDQoNCgkJZ2V0Q29udGVudCA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgciA9IHQuZ2V0Um5nKCksIGUgPSB0LmRvbS5jcmVhdGUoImJvZHkiKSwgc2UgPSB0LmdldFNlbCgpLCB3Yiwgd2EsIG47DQoNCgkJCXMgPSBzIHx8IHt9Ow0KCQkJd2IgPSB3YSA9ICcnOw0KCQkJcy5nZXQgPSB0cnVlOw0KCQkJcy5mb3JtYXQgPSBzLmZvcm1hdCB8fCAnaHRtbCc7DQoJCQl0Lm9uQmVmb3JlR2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCg0KCQkJaWYgKHMuZm9ybWF0ID09ICd0ZXh0JykNCgkJCQlyZXR1cm4gdC5pc0NvbGxhcHNlZCgpID8gJycgOiAoci50ZXh0IHx8IChzZS50b1N0cmluZyA/IHNlLnRvU3RyaW5nKCkgOiAnJykpOw0KDQoJCQlpZiAoci5jbG9uZUNvbnRlbnRzKSB7DQoJCQkJbiA9IHIuY2xvbmVDb250ZW50cygpOw0KDQoJCQkJaWYgKG4pDQoJCQkJCWUuYXBwZW5kQ2hpbGQobik7DQoJCQl9IGVsc2UgaWYgKGlzKHIuaXRlbSkgfHwgaXMoci5odG1sVGV4dCkpDQoJCQkJZS5pbm5lckhUTUwgPSByLml0ZW0gPyByLml0ZW0oMCkub3V0ZXJIVE1MIDogci5odG1sVGV4dDsNCgkJCWVsc2UNCgkJCQllLmlubmVySFRNTCA9IHIudG9TdHJpbmcoKTsNCg0KCQkJLy8gS2VlcCB3aGl0ZXNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXINCgkJCWlmICgvXlxzLy50ZXN0KGUuaW5uZXJIVE1MKSkNCgkJCQl3YiA9ICcgJzsNCg0KCQkJaWYgKC9ccyskLy50ZXN0KGUuaW5uZXJIVE1MKSkNCgkJCQl3YSA9ICcgJzsNCg0KCQkJcy5nZXRJbm5lciA9IHRydWU7DQoNCgkJCXMuY29udGVudCA9IHQuaXNDb2xsYXBzZWQoKSA/ICcnIDogd2IgKyB0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKGUsIHMpICsgd2E7DQoJCQl0Lm9uR2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCg0KCQkJcmV0dXJuIHMuY29udGVudDsNCgkJfSwNCg0KCQlzZXRDb250ZW50IDogZnVuY3Rpb24oaCwgcykgew0KCQkJdmFyIHQgPSB0aGlzLCByID0gdC5nZXRSbmcoKSwgYywgZCA9IHQud2luLmRvY3VtZW50Ow0KDQoJCQlzID0gcyB8fCB7Zm9ybWF0IDogJ2h0bWwnfTsNCgkJCXMuc2V0ID0gdHJ1ZTsNCgkJCWggPSBzLmNvbnRlbnQgPSB0LmRvbS5wcm9jZXNzSFRNTChoKTsNCg0KCQkJLy8gRGlzcGF0Y2ggYmVmb3JlIHNldCBjb250ZW50IGV2ZW50DQoJCQl0Lm9uQmVmb3JlU2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCgkJCWggPSBzLmNvbnRlbnQ7DQoNCgkJCWlmIChyLmluc2VydE5vZGUpIHsNCgkJCQkvLyBNYWtlIGNhcmV0IG1hcmtlciBzaW5jZSBpbnNlcnROb2RlIHBsYWNlcyB0aGUgY2FyZXQgaW4gdGhlIGJlZ2lubmluZyBvZiB0ZXh0IGFmdGVyIGluc2VydA0KCQkJCWggKz0gJzxzcGFuIGlkPSJfX2NhcmV0Ij5fPC9zcGFuPic7DQoNCgkJCQkvLyBEZWxldGUgYW5kIGluc2VydCBuZXcgbm9kZQ0KCQkJCQ0KCQkJCWlmIChyLnN0YXJ0Q29udGFpbmVyID09IGQgJiYgci5lbmRDb250YWluZXIgPT0gIGQpIHsNCgkJCQkJLy8gV2ViS2l0IHdpbGwgZmFpbCBpZiB0aGUgYm9keSBpcyBlbXB0eSBzaW5jZSB0aGUgcmFuZ2UgaXMgdGhlbiBpbnZhbGlkIGFuZCBpdCBjYW4ndCBpbnNlcnQgY29udGVudHMNCgkJCQkJZC5ib2R5LmlubmVySFRNTCA9IGg7DQoJCQkJfSBlbHNlIHsNCgkJCQkJci5kZWxldGVDb250ZW50cygpOw0KCQkJCQlpZiAoZC5ib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09IDApIHsNCgkJCQkJCWQuYm9keS5pbm5lckhUTUwgPSBoOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJLy8gY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IGRvZXNuJ3QgZXhpc3RzIGluIElFIDkgRE9NUmFuZ2VzDQoJCQkJCQlpZiAoci5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQpIHsNCgkJCQkJCQlyLmluc2VydE5vZGUoci5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaCkpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkvLyBGYWtlIGNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCBjYWxsIGluIElFIDkNCgkJCQkJCQl2YXIgZnJhZyA9IGQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLCB0ZW1wID0gZC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KCQkJCQkJCWZyYWcuYXBwZW5kQ2hpbGQodGVtcCk7DQoJCQkJCQkJdGVtcC5vdXRlckhUTUwgPSBoOw0KDQoJCQkJCQkJci5pbnNlcnROb2RlKGZyYWcpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gTW92ZSB0byBjYXJldCBtYXJrZXINCgkJCQljID0gdC5kb20uZ2V0KCdfX2NhcmV0Jyk7DQoJCQkJLy8gTWFrZSBzdXJlIHdlIHdyYXAgaXQgY29tcGxlYXRseSwgT3BlcmEgZmFpbHMgd2l0aCBhIHNpbXBsZSBzZWxlY3QgY2FsbA0KCQkJCXIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoJCQkJci5zZXRTdGFydEJlZm9yZShjKTsNCgkJCQlyLnNldEVuZEJlZm9yZShjKTsNCgkJCQl0LnNldFJuZyhyKTsNCg0KCQkJCS8vIFJlbW92ZSB0aGUgY2FyZXQgcG9zaXRpb24NCgkJCQl0LmRvbS5yZW1vdmUoJ19fY2FyZXQnKTsNCgkJCX0gZWxzZSB7DQoJCQkJaWYgKHIuaXRlbSkgew0KCQkJCQkvLyBEZWxldGUgY29udGVudCBhbmQgZ2V0IGNhcmV0IHRleHQgc2VsZWN0aW9uDQoJCQkJCWQuZXhlY0NvbW1hbmQoJ0RlbGV0ZScsIGZhbHNlLCBudWxsKTsNCgkJCQkJciA9IHQuZ2V0Um5nKCk7DQoJCQkJfQ0KDQoJCQkJci5wYXN0ZUhUTUwoaCk7DQoJCQl9DQoNCgkJCS8vIERpc3BhdGNoIHNldCBjb250ZW50IGV2ZW50DQoJCQl0Lm9uU2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCgkJfSwNCg0KCQlnZXRTdGFydCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHJuZyA9IHRoaXMuZ2V0Um5nKCksIHN0YXJ0RWxlbWVudCwgcGFyZW50RWxlbWVudCwgY2hlY2tSbmcsIG5vZGU7DQoNCgkJCWlmIChybmcuZHVwbGljYXRlIHx8IHJuZy5pdGVtKSB7DQoJCQkJLy8gQ29udHJvbCBzZWxlY3Rpb24sIHJldHVybiBmaXJzdCBpdGVtDQoJCQkJaWYgKHJuZy5pdGVtKQ0KCQkJCQlyZXR1cm4gcm5nLml0ZW0oMCk7DQoNCgkJCQkvLyBHZXQgc3RhcnQgZWxlbWVudA0KCQkJCWNoZWNrUm5nID0gcm5nLmR1cGxpY2F0ZSgpOw0KCQkJCWNoZWNrUm5nLmNvbGxhcHNlKDEpOw0KCQkJCXN0YXJ0RWxlbWVudCA9IGNoZWNrUm5nLnBhcmVudEVsZW1lbnQoKTsNCg0KCQkJCS8vIENoZWNrIGlmIHJhbmdlIHBhcmVudCBpcyBpbnNpZGUgdGhlIHN0YXJ0IGVsZW1lbnQsIHRoZW4gcmV0dXJuIHRoZSBpbm5lciBwYXJlbnQgZWxlbWVudA0KCQkJCS8vIFRoaXMgd2lsbCBmaXggaXNzdWVzIHdoZW4gYSBzaW5nbGUgZWxlbWVudCBpcyBzZWxlY3RlZCwgSUUgd291bGQgb3RoZXJ3aXNlIHJldHVybiB0aGUgd3Jvbmcgc3RhcnQgZWxlbWVudA0KCQkJCXBhcmVudEVsZW1lbnQgPSBub2RlID0gcm5nLnBhcmVudEVsZW1lbnQoKTsNCgkJCQl3aGlsZSAobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkgew0KCQkJCQlpZiAobm9kZSA9PSBzdGFydEVsZW1lbnQpIHsNCgkJCQkJCXN0YXJ0RWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIElmIHN0YXJ0IGVsZW1lbnQgaXMgYm9keSBlbGVtZW50IHRyeSB0byBtb3ZlIHRvIHRoZSBmaXJzdCBjaGlsZCBpZiBpdCBleGlzdHMNCgkJCQlpZiAoc3RhcnRFbGVtZW50ICYmIHN0YXJ0RWxlbWVudC5ub2RlTmFtZSA9PSAnQk9EWScpDQoJCQkJCXJldHVybiBzdGFydEVsZW1lbnQuZmlyc3RDaGlsZCB8fCBzdGFydEVsZW1lbnQ7DQoNCgkJCQlyZXR1cm4gc3RhcnRFbGVtZW50Ow0KCQkJfSBlbHNlIHsNCgkJCQlzdGFydEVsZW1lbnQgPSBybmcuc3RhcnRDb250YWluZXI7DQoNCgkJCQlpZiAoc3RhcnRFbGVtZW50Lm5vZGVUeXBlID09IDEgJiYgc3RhcnRFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkNCgkJCQkJc3RhcnRFbGVtZW50ID0gc3RhcnRFbGVtZW50LmNoaWxkTm9kZXNbTWF0aC5taW4oc3RhcnRFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoIC0gMSwgcm5nLnN0YXJ0T2Zmc2V0KV07DQoNCgkJCQlpZiAoc3RhcnRFbGVtZW50ICYmIHN0YXJ0RWxlbWVudC5ub2RlVHlwZSA9PSAzKQ0KCQkJCQlyZXR1cm4gc3RhcnRFbGVtZW50LnBhcmVudE5vZGU7DQoNCgkJCQlyZXR1cm4gc3RhcnRFbGVtZW50Ow0KCQkJfQ0KCQl9LA0KDQoJCWdldEVuZCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCByID0gdC5nZXRSbmcoKSwgZSwgZW87DQoNCgkJCWlmIChyLmR1cGxpY2F0ZSB8fCByLml0ZW0pIHsNCgkJCQlpZiAoci5pdGVtKQ0KCQkJCQlyZXR1cm4gci5pdGVtKDApOw0KDQoJCQkJciA9IHIuZHVwbGljYXRlKCk7DQoJCQkJci5jb2xsYXBzZSgwKTsNCgkJCQllID0gci5wYXJlbnRFbGVtZW50KCk7DQoNCgkJCQlpZiAoZSAmJiBlLm5vZGVOYW1lID09ICdCT0RZJykNCgkJCQkJcmV0dXJuIGUubGFzdENoaWxkIHx8IGU7DQoNCgkJCQlyZXR1cm4gZTsNCgkJCX0gZWxzZSB7DQoJCQkJZSA9IHIuZW5kQ29udGFpbmVyOw0KCQkJCWVvID0gci5lbmRPZmZzZXQ7DQoNCgkJCQlpZiAoZS5ub2RlVHlwZSA9PSAxICYmIGUuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCQllID0gZS5jaGlsZE5vZGVzW2VvID4gMCA/IGVvIC0gMSA6IGVvXTsNCg0KCQkJCWlmIChlICYmIGUubm9kZVR5cGUgPT0gMykNCgkJCQkJcmV0dXJuIGUucGFyZW50Tm9kZTsNCg0KCQkJCXJldHVybiBlOw0KCQkJfQ0KCQl9LA0KDQoJCWdldEJvb2ttYXJrIDogZnVuY3Rpb24odHlwZSwgbm9ybWFsaXplZCkgew0KCQkJdmFyIHQgPSB0aGlzLCBkb20gPSB0LmRvbSwgcm5nLCBybmcyLCBpZCwgY29sbGFwc2VkLCBuYW1lLCBlbGVtZW50LCBpbmRleCwgY2hyID0gJ1x1RkVGRicsIHN0eWxlczsNCg0KCQkJZnVuY3Rpb24gZmluZEluZGV4KG5hbWUsIGVsZW1lbnQpIHsNCgkJCQl2YXIgaW5kZXggPSAwOw0KDQoJCQkJZWFjaChkb20uc2VsZWN0KG5hbWUpLCBmdW5jdGlvbihub2RlLCBpKSB7DQoJCQkJCWlmIChub2RlID09IGVsZW1lbnQpDQoJCQkJCQlpbmRleCA9IGk7DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm4gaW5kZXg7DQoJCQl9Ow0KDQoJCQlpZiAodHlwZSA9PSAyKSB7DQoJCQkJZnVuY3Rpb24gZ2V0TG9jYXRpb24oKSB7DQoJCQkJCXZhciBybmcgPSB0LmdldFJuZyh0cnVlKSwgcm9vdCA9IGRvbS5nZXRSb290KCksIGJvb2ttYXJrID0ge307DQoNCgkJCQkJZnVuY3Rpb24gZ2V0UG9pbnQocm5nLCBzdGFydCkgew0KCQkJCQkJdmFyIGNvbnRhaW5lciA9IHJuZ1tzdGFydCA/ICdzdGFydENvbnRhaW5lcicgOiAnZW5kQ29udGFpbmVyJ10sDQoJCQkJCQkJb2Zmc2V0ID0gcm5nW3N0YXJ0ID8gJ3N0YXJ0T2Zmc2V0JyA6ICdlbmRPZmZzZXQnXSwgcG9pbnQgPSBbXSwgbm9kZSwgY2hpbGROb2RlcywgYWZ0ZXIgPSAwOw0KDQoJCQkJCQlpZiAoY29udGFpbmVyLm5vZGVUeXBlID09IDMpIHsNCgkJCQkJCQlpZiAobm9ybWFsaXplZCkgew0KCQkJCQkJCQlmb3IgKG5vZGUgPSBjb250YWluZXIucHJldmlvdXNTaWJsaW5nOyBub2RlICYmIG5vZGUubm9kZVR5cGUgPT0gMzsgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKQ0KCQkJCQkJCQkJb2Zmc2V0ICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDsNCgkJCQkJCQl9DQoNCgkJCQkJCQlwb2ludC5wdXNoKG9mZnNldCk7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCWNoaWxkTm9kZXMgPSBjb250YWluZXIuY2hpbGROb2RlczsNCg0KCQkJCQkJCWlmIChvZmZzZXQgPj0gY2hpbGROb2Rlcy5sZW5ndGggJiYgY2hpbGROb2Rlcy5sZW5ndGgpIHsNCgkJCQkJCQkJYWZ0ZXIgPSAxOw0KCQkJCQkJCQlvZmZzZXQgPSBNYXRoLm1heCgwLCBjaGlsZE5vZGVzLmxlbmd0aCAtIDEpOw0KCQkJCQkJCX0NCg0KCQkJCQkJCXBvaW50LnB1c2godC5kb20ubm9kZUluZGV4KGNoaWxkTm9kZXNbb2Zmc2V0XSwgbm9ybWFsaXplZCkgKyBhZnRlcik7DQoJCQkJCQl9DQoNCgkJCQkJCWZvciAoOyBjb250YWluZXIgJiYgY29udGFpbmVyICE9IHJvb3Q7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlKQ0KCQkJCQkJCXBvaW50LnB1c2godC5kb20ubm9kZUluZGV4KGNvbnRhaW5lciwgbm9ybWFsaXplZCkpOw0KDQoJCQkJCQlyZXR1cm4gcG9pbnQ7DQoJCQkJCX07DQoNCgkJCQkJYm9va21hcmsuc3RhcnQgPSBnZXRQb2ludChybmcsIHRydWUpOw0KDQoJCQkJCWlmICghdC5pc0NvbGxhcHNlZCgpKQ0KCQkJCQkJYm9va21hcmsuZW5kID0gZ2V0UG9pbnQocm5nKTsNCg0KCQkJCQlyZXR1cm4gYm9va21hcms7DQoJCQkJfTsNCg0KCQkJCXJldHVybiBnZXRMb2NhdGlvbigpOw0KCQkJfQ0KDQoJCQkvLyBIYW5kbGUgc2ltcGxlIHJhbmdlDQoJCQlpZiAodHlwZSkNCgkJCQlyZXR1cm4ge3JuZyA6IHQuZ2V0Um5nKCl9Ow0KDQoJCQlybmcgPSB0LmdldFJuZygpOw0KCQkJaWQgPSBkb20udW5pcXVlSWQoKTsNCgkJCWNvbGxhcHNlZCA9IHRpbnlNQ0UuYWN0aXZlRWRpdG9yLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpOw0KCQkJc3R5bGVzID0gJ292ZXJmbG93OmhpZGRlbjtsaW5lLWhlaWdodDowcHgnOw0KDQoJCQkvLyBFeHBsb3JlciBtZXRob2QNCgkJCWlmIChybmcuZHVwbGljYXRlIHx8IHJuZy5pdGVtKSB7DQoJCQkJLy8gVGV4dCBzZWxlY3Rpb24NCgkJCQlpZiAoIXJuZy5pdGVtKSB7DQoJCQkJCXJuZzIgPSBybmcuZHVwbGljYXRlKCk7DQoNCgkJCQkJLy8gSW5zZXJ0IHN0YXJ0IG1hcmtlcg0KCQkJCQlybmcuY29sbGFwc2UoKTsNCgkJCQkJcm5nLnBhc3RlSFRNTCgnPHNwYW4gX21jZV90eXBlPSJib29rbWFyayIgaWQ9IicgKyBpZCArICdfc3RhcnQiIHN0eWxlPSInICsgc3R5bGVzICsgJyI+JyArIGNociArICc8L3NwYW4+Jyk7DQoNCgkJCQkJLy8gSW5zZXJ0IGVuZCBtYXJrZXINCgkJCQkJaWYgKCFjb2xsYXBzZWQpIHsNCgkJCQkJCXJuZzIuY29sbGFwc2UoZmFsc2UpOw0KCQkJCQkJcm5nMi5wYXN0ZUhUTUwoJzxzcGFuIF9tY2VfdHlwZT0iYm9va21hcmsiIGlkPSInICsgaWQgKyAnX2VuZCIgc3R5bGU9IicgKyBzdHlsZXMgKyAnIj4nICsgY2hyICsgJzwvc3Bhbj4nKTsNCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIENvbnRyb2wgc2VsZWN0aW9uDQoJCQkJCWVsZW1lbnQgPSBybmcuaXRlbSgwKTsNCgkJCQkJbmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7DQoNCgkJCQkJcmV0dXJuIHtuYW1lIDogbmFtZSwgaW5kZXggOiBmaW5kSW5kZXgobmFtZSwgZWxlbWVudCl9Ow0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZWxlbWVudCA9IHQuZ2V0Tm9kZSgpOw0KCQkJCW5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lOw0KCQkJCWlmIChuYW1lID09ICdJTUcnKQ0KCQkJCQlyZXR1cm4ge25hbWUgOiBuYW1lLCBpbmRleCA6IGZpbmRJbmRleChuYW1lLCBlbGVtZW50KX07DQoNCgkJCQkvLyBXM0MgbWV0aG9kDQoJCQkJcm5nMiA9IHJuZy5jbG9uZVJhbmdlKCk7DQoNCgkJCQkvLyBJbnNlcnQgZW5kIG1hcmtlcg0KCQkJCWlmICghY29sbGFwc2VkKSB7DQoJCQkJCXJuZzIuY29sbGFwc2UoZmFsc2UpOw0KCQkJCQlybmcyLmluc2VydE5vZGUoZG9tLmNyZWF0ZSgnc3BhbicsIHtfbWNlX3R5cGUgOiAiYm9va21hcmsiLCBpZCA6IGlkICsgJ19lbmQnLCBzdHlsZSA6IHN0eWxlc30sIGNocikpOw0KCQkJCX0NCg0KCQkJCXJuZy5jb2xsYXBzZSh0cnVlKTsNCgkJCQlybmcuaW5zZXJ0Tm9kZShkb20uY3JlYXRlKCdzcGFuJywge19tY2VfdHlwZSA6ICJib29rbWFyayIsIGlkIDogaWQgKyAnX3N0YXJ0Jywgc3R5bGUgOiBzdHlsZXN9LCBjaHIpKTsNCgkJCX0NCg0KCQkJdC5tb3ZlVG9Cb29rbWFyayh7aWQgOiBpZCwga2VlcCA6IDF9KTsNCg0KCQkJcmV0dXJuIHtpZCA6IGlkfTsNCgkJfSwNCg0KCQltb3ZlVG9Cb29rbWFyayA6IGZ1bmN0aW9uKGJvb2ttYXJrKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGRvbSA9IHQuZG9tLCBtYXJrZXIxLCBtYXJrZXIyLCBybmcsIHJvb3QsIHN0YXJ0Q29udGFpbmVyLCBlbmRDb250YWluZXIsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7DQoNCgkJCS8vIENsZWFyIHNlbGVjdGlvbiBjYWNoZQ0KCQkJaWYgKHQudHJpZGVudFNlbCkNCgkJCQl0LnRyaWRlbnRTZWwuZGVzdHJveSgpOw0KDQoJCQlpZiAoYm9va21hcmspIHsNCgkJCQlpZiAoYm9va21hcmsuc3RhcnQpIHsNCgkJCQkJcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KCQkJCQlyb290ID0gZG9tLmdldFJvb3QoKTsNCg0KCQkJCQlmdW5jdGlvbiBzZXRFbmRQb2ludChzdGFydCkgew0KCQkJCQkJdmFyIHBvaW50ID0gYm9va21hcmtbc3RhcnQgPyAnc3RhcnQnIDogJ2VuZCddLCBpLCBub2RlLCBvZmZzZXQsIGNoaWxkcmVuOw0KDQoJCQkJCQlpZiAocG9pbnQpIHsNCgkJCQkJCQkvLyBGaW5kIGNvbnRhaW5lciBub2RlDQoJCQkJCQkJZm9yIChub2RlID0gcm9vdCwgaSA9IHBvaW50Lmxlbmd0aCAtIDE7IGkgPj0gMTsgaS0tKSB7DQoJCQkJCQkJCWNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzOw0KDQoJCQkJCQkJCWlmIChjaGlsZHJlbi5sZW5ndGgpDQoJCQkJCQkJCQlub2RlID0gY2hpbGRyZW5bcG9pbnRbaV1dOw0KCQkJCQkJCX0NCg0KCQkJCQkJCS8vIFNldCBvZmZzZXQgd2l0aGluIGNvbnRhaW5lciBub2RlDQoJCQkJCQkJaWYgKHN0YXJ0KQ0KCQkJCQkJCQlybmcuc2V0U3RhcnQobm9kZSwgcG9pbnRbMF0pOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJcm5nLnNldEVuZChub2RlLCBwb2ludFswXSk7DQoJCQkJCQl9DQoJCQkJCX07DQoNCgkJCQkJc2V0RW5kUG9pbnQodHJ1ZSk7DQoJCQkJCXNldEVuZFBvaW50KCk7DQoNCgkJCQkJdC5zZXRSbmcocm5nKTsNCgkJCQl9IGVsc2UgaWYgKGJvb2ttYXJrLmlkKSB7DQoJCQkJCWZ1bmN0aW9uIHJlc3RvcmVFbmRQb2ludChzdWZmaXgpIHsNCgkJCQkJCXZhciBtYXJrZXIgPSBkb20uZ2V0KGJvb2ttYXJrLmlkICsgJ18nICsgc3VmZml4KSwgbm9kZSwgaWR4LCBuZXh0LCBwcmV2LCBrZWVwID0gYm9va21hcmsua2VlcDsNCg0KCQkJCQkJaWYgKG1hcmtlcikgew0KCQkJCQkJCW5vZGUgPSBtYXJrZXIucGFyZW50Tm9kZTsNCg0KCQkJCQkJCWlmIChzdWZmaXggPT0gJ3N0YXJ0Jykgew0KCQkJCQkJCQlpZiAoIWtlZXApIHsNCgkJCQkJCQkJCWlkeCA9IGRvbS5ub2RlSW5kZXgobWFya2VyKTsNCgkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCW5vZGUgPSBtYXJrZXIuZmlyc3RDaGlsZDsNCgkJCQkJCQkJCWlkeCA9IDE7DQoJCQkJCQkJCX0NCg0KCQkJCQkJCQlzdGFydENvbnRhaW5lciA9IGVuZENvbnRhaW5lciA9IG5vZGU7DQoJCQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0ID0gaWR4Ow0KCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCWlmICgha2VlcCkgew0KCQkJCQkJCQkJaWR4ID0gZG9tLm5vZGVJbmRleChtYXJrZXIpOw0KCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJbm9kZSA9IG1hcmtlci5maXJzdENoaWxkOw0KCQkJCQkJCQkJaWR4ID0gMTsNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCWVuZENvbnRhaW5lciA9IG5vZGU7DQoJCQkJCQkJCWVuZE9mZnNldCA9IGlkeDsNCgkJCQkJCQl9DQoNCgkJCQkJCQlpZiAoIWtlZXApIHsNCgkJCQkJCQkJcHJldiA9IG1hcmtlci5wcmV2aW91c1NpYmxpbmc7DQoJCQkJCQkJCW5leHQgPSBtYXJrZXIubmV4dFNpYmxpbmc7DQoNCgkJCQkJCQkJLy8gUmVtb3ZlIGFsbCBtYXJrZXIgdGV4dCBub2Rlcw0KCQkJCQkJCQllYWNoKHRpbnltY2UuZ3JlcChtYXJrZXIuY2hpbGROb2RlcyksIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDMpDQoJCQkJCQkJCQkJbm9kZS5ub2RlVmFsdWUgPSBub2RlLm5vZGVWYWx1ZS5yZXBsYWNlKC9cdUZFRkYvZywgJycpOw0KCQkJCQkJCQl9KTsNCg0KCQkJCQkJCQkvLyBSZW1vdmUgbWFya2VyIGJ1dCBrZWVwIGNoaWxkcmVuIGlmIGZvciBleGFtcGxlIGNvbnRlbnRzIHdoZXJlIGluc2VydGVkIGludG8gdGhlIG1hcmtlcg0KCQkJCQkJCQkvLyBBbHNvIHJlbW92ZSBkdXBsaWNhdGVkIGluc3RhbmNlcyBvZiB0aGUgbWFya2VyIGZvciBleGFtcGxlIGJ5IGEgc3BsaXQgb3BlcmF0aW9uIG9yIGJ5IFdlYktpdCBhdXRvIHNwbGl0IG9uIHBhc3RlIGZlYXR1cmUNCgkJCQkJCQkJd2hpbGUgKG1hcmtlciA9IGRvbS5nZXQoYm9va21hcmsuaWQgKyAnXycgKyBzdWZmaXgpKQ0KCQkJCQkJCQkJZG9tLnJlbW92ZShtYXJrZXIsIDEpOw0KDQoJCQkJCQkJCS8vIElmIHNpYmxpbmdzIGFyZSB0ZXh0IG5vZGVzIHRoZW4gbWVyZ2UgdGhlbSB1bmxlc3MgaXQncyBPcGVyYSBzaW5jZSBpdCBzb21lIGhvdyByZW1vdmVzIHRoZSBub2RlDQoJCQkJCQkJCS8vIGFuZCB3ZSBhcmUgc25pZmZpbmcgc2luY2UgYWRkaW5nIGEgbG90IG9mIGRldGVjdGlvbiBjb2RlIGZvciBhIGJyb3dzZXIgd2l0aCAzJSBvZiB0aGUgbWFya2V0IGlzbid0IHdvcnRoIHRoZSBlZmZvcnQuIFNvcnJ5LCBPcGVyYSBidXQgaXQncyBqdXN0IGEgZmFjdA0KCQkJCQkJCQlpZiAocHJldiAmJiBuZXh0ICYmIHByZXYubm9kZVR5cGUgPT0gbmV4dC5ub2RlVHlwZSAmJiBwcmV2Lm5vZGVUeXBlID09IDMgJiYgIXRpbnltY2UuaXNPcGVyYSkgew0KCQkJCQkJCQkJaWR4ID0gcHJldi5ub2RlVmFsdWUubGVuZ3RoOw0KCQkJCQkJCQkJcHJldi5hcHBlbmREYXRhKG5leHQubm9kZVZhbHVlKTsNCgkJCQkJCQkJCWRvbS5yZW1vdmUobmV4dCk7DQoNCgkJCQkJCQkJCWlmIChzdWZmaXggPT0gJ3N0YXJ0Jykgew0KCQkJCQkJCQkJCXN0YXJ0Q29udGFpbmVyID0gZW5kQ29udGFpbmVyID0gcHJldjsNCgkJCQkJCQkJCQlzdGFydE9mZnNldCA9IGVuZE9mZnNldCA9IGlkeDsNCgkJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQkJZW5kQ29udGFpbmVyID0gcHJldjsNCgkJCQkJCQkJCQllbmRPZmZzZXQgPSBpZHg7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX07DQoNCgkJCQkJZnVuY3Rpb24gYWRkQm9ndXMobm9kZSkgew0KCQkJCQkJLy8gQWRkcyBhIGJvZ3VzIEJSIGVsZW1lbnQgZm9yIGVtcHR5IGJsb2NrIGVsZW1lbnRzDQoJCQkJCQkvLyBvbiBub24gSUUgYnJvd3NlcnMganVzdCB0byBoYXZlIGEgcGxhY2UgdG8gcHV0IHRoZSBjYXJldA0KCQkJCQkJaWYgKCFpc0lFICYmIGRvbS5pc0Jsb2NrKG5vZGUpICYmICFub2RlLmlubmVySFRNTCkNCgkJCQkJCQlub2RlLmlubmVySFRNTCA9ICc8YnIgX21jZV9ib2d1cz0iMSIgLz4nOw0KDQoJCQkJCQlyZXR1cm4gbm9kZTsNCgkJCQkJfTsNCg0KCQkJCQkvLyBSZXN0b3JlIHN0YXJ0L2VuZCBwb2ludHMNCgkJCQkJcmVzdG9yZUVuZFBvaW50KCdzdGFydCcpOw0KCQkJCQlyZXN0b3JlRW5kUG9pbnQoJ2VuZCcpOw0KDQoJCQkJCWlmIChzdGFydENvbnRhaW5lcikgew0KCQkJCQkJcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KCQkJCQkJcm5nLnNldFN0YXJ0KGFkZEJvZ3VzKHN0YXJ0Q29udGFpbmVyKSwgc3RhcnRPZmZzZXQpOw0KCQkJCQkJcm5nLnNldEVuZChhZGRCb2d1cyhlbmRDb250YWluZXIpLCBlbmRPZmZzZXQpOw0KCQkJCQkJdC5zZXRSbmcocm5nKTsNCgkJCQkJfQ0KCQkJCX0gZWxzZSBpZiAoYm9va21hcmsubmFtZSkgew0KCQkJCQl0LnNlbGVjdChkb20uc2VsZWN0KGJvb2ttYXJrLm5hbWUpW2Jvb2ttYXJrLmluZGV4XSk7DQoJCQkJfSBlbHNlIGlmIChib29rbWFyay5ybmcpDQoJCQkJCXQuc2V0Um5nKGJvb2ttYXJrLnJuZyk7DQoJCQl9DQoJCX0sDQoNCgkJc2VsZWN0IDogZnVuY3Rpb24obm9kZSwgY29udGVudCkgew0KCQkJdmFyIHQgPSB0aGlzLCBkb20gPSB0LmRvbSwgcm5nID0gZG9tLmNyZWF0ZVJuZygpLCBpZHg7DQoNCgkJCWlkeCA9IGRvbS5ub2RlSW5kZXgobm9kZSk7DQoJCQlybmcuc2V0U3RhcnQobm9kZS5wYXJlbnROb2RlLCBpZHgpOw0KCQkJcm5nLnNldEVuZChub2RlLnBhcmVudE5vZGUsIGlkeCArIDEpOw0KDQoJCQkvLyBGaW5kIGZpcnN0L2xhc3QgdGV4dCBub2RlIG9yIEJSIGVsZW1lbnQNCgkJCWlmIChjb250ZW50KSB7DQoJCQkJZnVuY3Rpb24gc2V0UG9pbnQobm9kZSwgc3RhcnQpIHsNCgkJCQkJdmFyIHdhbGtlciA9IG5ldyB0aW55bWNlLmRvbS5UcmVlV2Fsa2VyKG5vZGUsIG5vZGUpOw0KDQoJCQkJCWRvIHsNCgkJCQkJCS8vIFRleHQgbm9kZQ0KCQkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiB0aW55bWNlLnRyaW0obm9kZS5ub2RlVmFsdWUpLmxlbmd0aCAhPSAwKSB7DQoJCQkJCQkJaWYgKHN0YXJ0KQ0KCQkJCQkJCQlybmcuc2V0U3RhcnQobm9kZSwgMCk7DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCQlybmcuc2V0RW5kKG5vZGUsIG5vZGUubm9kZVZhbHVlLmxlbmd0aCk7DQoNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEJSIGVsZW1lbnQNCgkJCQkJCWlmIChub2RlLm5vZGVOYW1lID09ICdCUicpIHsNCgkJCQkJCQlpZiAoc3RhcnQpDQoJCQkJCQkJCXJuZy5zZXRTdGFydEJlZm9yZShub2RlKTsNCgkJCQkJCQllbHNlDQoJCQkJCQkJCXJuZy5zZXRFbmRCZWZvcmUobm9kZSk7DQoNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoJCQkJCX0gd2hpbGUgKG5vZGUgPSAoc3RhcnQgPyB3YWxrZXIubmV4dCgpIDogd2Fsa2VyLnByZXYoKSkpOw0KCQkJCX07DQoNCgkJCQlzZXRQb2ludChub2RlLCAxKTsNCgkJCQlzZXRQb2ludChub2RlKTsNCgkJCX0NCg0KCQkJdC5zZXRSbmcocm5nKTsNCg0KCQkJcmV0dXJuIG5vZGU7DQoJCX0sDQoNCgkJaXNDb2xsYXBzZWQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgciA9IHQuZ2V0Um5nKCksIHMgPSB0LmdldFNlbCgpOw0KDQoJCQlpZiAoIXIgfHwgci5pdGVtKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJaWYgKHIuY29tcGFyZUVuZFBvaW50cykNCgkJCQlyZXR1cm4gci5jb21wYXJlRW5kUG9pbnRzKCdTdGFydFRvRW5kJywgcikgPT09IDA7DQoNCgkJCXJldHVybiAhcyB8fCByLmNvbGxhcHNlZDsNCgkJfSwNCg0KCQljb2xsYXBzZSA6IGZ1bmN0aW9uKGIpIHsNCgkJCXZhciB0ID0gdGhpcywgciA9IHQuZ2V0Um5nKCksIG47DQoNCgkJCS8vIENvbnRyb2wgcmFuZ2Ugb24gSUUNCgkJCWlmIChyLml0ZW0pIHsNCgkJCQluID0gci5pdGVtKDApOw0KCQkJCXIgPSB0aGlzLndpbi5kb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOw0KCQkJCXIubW92ZVRvRWxlbWVudFRleHQobik7DQoJCQl9DQoNCgkJCXIuY29sbGFwc2UoISFiKTsNCgkJCXQuc2V0Um5nKHIpOw0KCQl9LA0KDQoJCWdldFNlbCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCB3ID0gdGhpcy53aW47DQoNCgkJCXJldHVybiB3LmdldFNlbGVjdGlvbiA/IHcuZ2V0U2VsZWN0aW9uKCkgOiB3LmRvY3VtZW50LnNlbGVjdGlvbjsNCgkJfSwNCg0KCQlnZXRSbmcgOiBmdW5jdGlvbih3M2MpIHsNCgkJCXZhciB0ID0gdGhpcywgcywgciwgZWxtLCBkb2MgPSB0Lndpbi5kb2N1bWVudDsNCg0KCQkJLy8gRm91bmQgdHJpZGVudFNlbCBvYmplY3QgdGhlbiB3ZSBuZWVkIHRvIHVzZSB0aGF0IG9uZQ0KCQkJaWYgKHczYyAmJiB0LnRyaWRlbnRTZWwpDQoJCQkJcmV0dXJuIHQudHJpZGVudFNlbC5nZXRSYW5nZUF0KDApOw0KDQoJCQl0cnkgew0KCQkJCWlmIChzID0gdC5nZXRTZWwoKSkNCgkJCQkJciA9IHMucmFuZ2VDb3VudCA+IDAgPyBzLmdldFJhbmdlQXQoMCkgOiAocy5jcmVhdGVSYW5nZSA/IHMuY3JlYXRlUmFuZ2UoKSA6IGRvYy5jcmVhdGVSYW5nZSgpKTsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJLy8gSUUgdGhyb3dzIHVuc3BlY2lmaWVkIGVycm9yIGhlcmUgaWYgVGlueU1DRSBpcyBwbGFjZWQgaW4gYSBmcmFtZS9pZnJhbWUNCgkJCX0NCg0KCQkJLy8gV2UgaGF2ZSBXM0MgcmFuZ2VzIGFuZCBpdCdzIElFIHRoZW4gZmFrZSBjb250cm9sIHNlbGVjdGlvbiBzaW5jZSBJRTkgZG9lc24ndCBoYW5kbGUgdGhhdCBjb3JyZWN0bHkgeWV0DQoJCQlpZiAodGlueW1jZS5pc0lFICYmIHIuc2V0U3RhcnQgJiYgZG9jLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLml0ZW0pIHsNCgkJCQllbG0gPSBkb2Muc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaXRlbSgwKTsNCgkJCQlyID0gZG9jLmNyZWF0ZVJhbmdlKCk7DQoJCQkJci5zZXRTdGFydEJlZm9yZShlbG0pOw0KCQkJCXIuc2V0RW5kQWZ0ZXIoZWxtKTsNCgkJCX0NCg0KCQkJLy8gTm8gcmFuZ2UgZm91bmQgdGhlbiBjcmVhdGUgYW4gZW1wdHkgb25lDQoJCQkvLyBUaGlzIGNhbiBvY2N1ciB3aGVuIHRoZSBlZGl0b3IgaXMgcGxhY2VkIGluIGEgaGlkZGVuIGNvbnRhaW5lciBlbGVtZW50IG9uIEdlY2tvDQoJCQkvLyBPciBvbiBJRSB3aGVuIHRoZXJlIHdhcyBhbiBleGNlcHRpb24NCgkJCWlmICghcikNCgkJCQlyID0gZG9jLmNyZWF0ZVJhbmdlID8gZG9jLmNyZWF0ZVJhbmdlKCkgOiBkb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsNCg0KCQkJaWYgKHQuc2VsZWN0ZWRSYW5nZSAmJiB0LmV4cGxpY2l0UmFuZ2UpIHsNCgkJCQlpZiAoci5jb21wYXJlQm91bmRhcnlQb2ludHMoci5TVEFSVF9UT19TVEFSVCwgdC5zZWxlY3RlZFJhbmdlKSA9PT0gMCAmJiByLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhyLkVORF9UT19FTkQsIHQuc2VsZWN0ZWRSYW5nZSkgPT09IDApIHsNCgkJCQkJLy8gU2FmYXJpLCBPcGVyYSBhbmQgQ2hyb21lIG9ubHkgZXZlciBzZWxlY3QgdGV4dCB3aGljaCBjYXVzZXMgdGhlIHJhbmdlIHRvIGNoYW5nZS4NCgkJCQkJLy8gVGhpcyBsZXRzIHVzIHVzZSB0aGUgb3JpZ2luYWxseSBzZXQgcmFuZ2UgaWYgdGhlIHNlbGVjdGlvbiBoYXNuJ3QgYmVlbiBjaGFuZ2VkIGJ5IHRoZSB1c2VyLg0KCQkJCQlyID0gdC5leHBsaWNpdFJhbmdlOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXQuc2VsZWN0ZWRSYW5nZSA9IG51bGw7DQoJCQkJCXQuZXhwbGljaXRSYW5nZSA9IG51bGw7DQoJCQkJfQ0KCQkJfQ0KCQkJcmV0dXJuIHI7DQoJCX0sDQoNCgkJc2V0Um5nIDogZnVuY3Rpb24ocikgew0KCQkJdmFyIHMsIHQgPSB0aGlzOw0KCQkJDQoJCQlpZiAoIXQudHJpZGVudFNlbCkgew0KCQkJCXMgPSB0LmdldFNlbCgpOw0KDQoJCQkJaWYgKHMpIHsNCgkJCQkJdC5leHBsaWNpdFJhbmdlID0gcjsNCgkJCQkJcy5yZW1vdmVBbGxSYW5nZXMoKTsNCgkJCQkJcy5hZGRSYW5nZShyKTsNCgkJCQkJdC5zZWxlY3RlZFJhbmdlID0gcy5nZXRSYW5nZUF0KDApOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJLy8gSXMgVzNDIFJhbmdlDQoJCQkJaWYgKHIuY2xvbmVSYW5nZSkgew0KCQkJCQl0LnRyaWRlbnRTZWwuYWRkUmFuZ2Uocik7DQoJCQkJCXJldHVybjsNCgkJCQl9DQoNCgkJCQkvLyBJcyBJRSBzcGVjaWZpYyByYW5nZQ0KCQkJCXRyeSB7DQoJCQkJCXIuc2VsZWN0KCk7DQoJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJLy8gTmVlZGVkIGZvciBzb21lIG9kZCBJRSBidWcgIzE4NDMzMDYNCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkJc2V0Tm9kZSA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5zZXRDb250ZW50KHQuZG9tLmdldE91dGVySFRNTChuKSk7DQoNCgkJCXJldHVybiBuOw0KCQl9LA0KDQoJCWdldE5vZGUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcm5nID0gdC5nZXRSbmcoKSwgc2VsID0gdC5nZXRTZWwoKSwgZWxtOw0KDQoJCQlpZiAocm5nLnNldFN0YXJ0KSB7DQoJCQkJLy8gUmFuZ2UgbWF5YmUgbG9zdCBhZnRlciB0aGUgZWRpdG9yIGlzIG1hZGUgdmlzaWJsZSBhZ2Fpbg0KCQkJCWlmICghcm5nKQ0KCQkJCQlyZXR1cm4gdC5kb20uZ2V0Um9vdCgpOw0KDQoJCQkJZWxtID0gcm5nLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyOw0KDQoJCQkJLy8gSGFuZGxlIHNlbGVjdGlvbiBhIGltYWdlIG9yIG90aGVyIGNvbnRyb2wgbGlrZSBlbGVtZW50IHN1Y2ggYXMgYW5jaG9ycw0KCQkJCWlmICghcm5nLmNvbGxhcHNlZCkgew0KCQkJCQlpZiAocm5nLnN0YXJ0Q29udGFpbmVyID09IHJuZy5lbmRDb250YWluZXIpIHsNCgkJCQkJCWlmIChybmcuc3RhcnRPZmZzZXQgLSBybmcuZW5kT2Zmc2V0IDwgMikgew0KCQkJCQkJCWlmIChybmcuc3RhcnRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCQkJCQllbG0gPSBybmcuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tybmcuc3RhcnRPZmZzZXRdOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJLy8gSWYgdGhlIGFuY2hvciBub2RlIGlzIGEgZWxlbWVudCBpbnN0ZWFkIG9mIGEgdGV4dCBub2RlIHRoZW4gcmV0dXJuIHRoaXMgZWxlbWVudA0KCQkJCQlpZiAodGlueW1jZS5pc1dlYktpdCAmJiBzZWwuYW5jaG9yTm9kZSAmJiBzZWwuYW5jaG9yTm9kZS5ub2RlVHlwZSA9PSAxKSANCgkJCQkJCXJldHVybiBzZWwuYW5jaG9yTm9kZS5jaGlsZE5vZGVzW3NlbC5hbmNob3JPZmZzZXRdOyANCgkJCQl9DQoNCgkJCQlpZiAoZWxtICYmIGVsbS5ub2RlVHlwZSA9PSAzKQ0KCQkJCQlyZXR1cm4gZWxtLnBhcmVudE5vZGU7DQoNCgkJCQlyZXR1cm4gZWxtOw0KCQkJfQ0KDQoJCQlyZXR1cm4gcm5nLml0ZW0gPyBybmcuaXRlbSgwKSA6IHJuZy5wYXJlbnRFbGVtZW50KCk7DQoJCX0sDQoNCgkJZ2V0U2VsZWN0ZWRCbG9ja3MgOiBmdW5jdGlvbihzdCwgZW4pIHsNCgkJCXZhciB0ID0gdGhpcywgZG9tID0gdC5kb20sIHNiLCBlYiwgbiwgYmwgPSBbXTsNCg0KCQkJc2IgPSBkb20uZ2V0UGFyZW50KHN0IHx8IHQuZ2V0U3RhcnQoKSwgZG9tLmlzQmxvY2spOw0KCQkJZWIgPSBkb20uZ2V0UGFyZW50KGVuIHx8IHQuZ2V0RW5kKCksIGRvbS5pc0Jsb2NrKTsNCg0KCQkJaWYgKHNiKQ0KCQkJCWJsLnB1c2goc2IpOw0KDQoJCQlpZiAoc2IgJiYgZWIgJiYgc2IgIT0gZWIpIHsNCgkJCQluID0gc2I7DQoNCgkJCQl3aGlsZSAoKG4gPSBuLm5leHRTaWJsaW5nKSAmJiBuICE9IGViKSB7DQoJCQkJCWlmIChkb20uaXNCbG9jayhuKSkNCgkJCQkJCWJsLnB1c2gobik7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoZWIgJiYgc2IgIT0gZWIpDQoJCQkJYmwucHVzaChlYik7DQoNCgkJCXJldHVybiBibDsNCgkJfSwNCg0KCQlkZXN0cm95IDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LndpbiA9IG51bGw7DQoNCgkJCWlmICh0LnRyaWRlbnRTZWwpDQoJCQkJdC50cmlkZW50U2VsLmRlc3Ryb3koKTsNCg0KCQkJLy8gTWFudWFsIGRlc3Ryb3kgdGhlbiByZW1vdmUgdW5sb2FkIGhhbmRsZXINCgkJCWlmICghcykNCgkJCQl0aW55bWNlLnJlbW92ZVVubG9hZCh0LmRlc3Ryb3kpOw0KCQl9LA0KDQoJCS8vIElFIGhhcyBhbiBpc3N1ZSB3aGVyZSB5b3UgY2FuJ3Qgc2VsZWN0L21vdmUgdGhlIGNhcmV0IGJ5IGNsaWNraW5nIG91dHNpZGUgdGhlIGJvZHkgaWYgdGhlIGRvY3VtZW50IGlzIGluIHN0YW5kYXJkcyBtb2RlDQoJCV9maXhJRVNlbGVjdGlvbiA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGRvbSA9IHRoaXMuZG9tLCBkb2MgPSBkb20uZG9jLCBib2R5ID0gZG9jLmJvZHksIHN0YXJ0ZWQsIHN0YXJ0Um5nOw0KDQoJCQkvLyBNYWtlIEhUTUwgZWxlbWVudCB1bnNlbGVjdGFibGUgc2luY2Ugd2UgYXJlIGdvaW5nIHRvIGhhbmRsZSBzZWxlY3Rpb24gYnkgaGFuZA0KCQkJZG9jLmRvY3VtZW50RWxlbWVudC51bnNlbGVjdGFibGUgPSB0cnVlOw0KDQoJCQkvLyBSZXR1cm4gcmFuZ2UgZnJvbSBwb2ludCBvciBudWxsIGlmIGl0IGZhaWxlZA0KCQkJZnVuY3Rpb24gcm5nRnJvbVBvaW50KHgsIHkpIHsNCgkJCQl2YXIgcm5nID0gYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsNCg0KCQkJCXRyeSB7DQoJCQkJCXJuZy5tb3ZlVG9Qb2ludCh4LCB5KTsNCgkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkvLyBJRSBzb21ldGltZXMgdGhyb3dzIGFuZCBleGNlcHRpb24sIHNvIGxldHMganVzdCBpZ25vcmUgaXQNCgkJCQkJcm5nID0gbnVsbDsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gcm5nOw0KCQkJfTsNCg0KCQkJLy8gRmlyZXMgd2hpbGUgdGhlIHNlbGVjdGlvbiBpcyBjaGFuZ2luZw0KCQkJZnVuY3Rpb24gc2VsZWN0aW9uQ2hhbmdlKGUpIHsNCgkJCQl2YXIgcG9pbnRSbmc7DQoNCgkJCQkvLyBDaGVjayBpZiB0aGUgYnV0dG9uIGlzIGRvd24gb3Igbm90DQoJCQkJaWYgKGUuYnV0dG9uKSB7DQoJCQkJCS8vIENyZWF0ZSByYW5nZSBmcm9tIG1vdXNlIHBvc2l0aW9uDQoJCQkJCXBvaW50Um5nID0gcm5nRnJvbVBvaW50KGUueCwgZS55KTsNCg0KCQkJCQlpZiAocG9pbnRSbmcpIHsNCgkJCQkJCS8vIENoZWNrIGlmIHBvaW50UmFuZ2UgaXMgYmVmb3JlL2FmdGVyIHNlbGVjdGlvbiB0aGVuIGNoYW5nZSB0aGUgZW5kUG9pbnQNCgkJCQkJCWlmIChwb2ludFJuZy5jb21wYXJlRW5kUG9pbnRzKCdTdGFydFRvU3RhcnQnLCBzdGFydFJuZykgPiAwKQ0KCQkJCQkJCXBvaW50Um5nLnNldEVuZFBvaW50KCdTdGFydFRvU3RhcnQnLCBzdGFydFJuZyk7DQoJCQkJCQllbHNlDQoJCQkJCQkJcG9pbnRSbmcuc2V0RW5kUG9pbnQoJ0VuZFRvRW5kJywgc3RhcnRSbmcpOw0KDQoJCQkJCQlwb2ludFJuZy5zZWxlY3QoKTsNCgkJCQkJfQ0KCQkJCX0gZWxzZQ0KCQkJCQllbmRTZWxlY3Rpb24oKTsNCgkJCX0NCg0KCQkJLy8gUmVtb3ZlcyBsaXN0ZW5lcnMNCgkJCWZ1bmN0aW9uIGVuZFNlbGVjdGlvbigpIHsNCgkJCQlkb20udW5iaW5kKGRvYywgJ21vdXNldXAnLCBlbmRTZWxlY3Rpb24pOw0KCQkJCWRvbS51bmJpbmQoZG9jLCAnbW91c2Vtb3ZlJywgc2VsZWN0aW9uQ2hhbmdlKTsNCgkJCQlzdGFydGVkID0gMDsNCgkJCX07DQoNCgkJCS8vIERldGVjdCB3aGVuIHVzZXIgc2VsZWN0cyBvdXRzaWRlIEJPRFkNCgkJCWRvbS5iaW5kKGRvYywgJ21vdXNlZG93bicsIGZ1bmN0aW9uKGUpIHsNCgkJCQlpZiAoZS50YXJnZXQubm9kZU5hbWUgPT09ICdIVE1MJykgew0KCQkJCQlpZiAoc3RhcnRlZCkNCgkJCQkJCWVuZFNlbGVjdGlvbigpOw0KDQoJCQkJCXN0YXJ0ZWQgPSAxOw0KDQoJCQkJCS8vIFNldHVwIHN0YXJ0IHBvc2l0aW9uDQoJCQkJCXN0YXJ0Um5nID0gcm5nRnJvbVBvaW50KGUueCwgZS55KTsNCgkJCQkJaWYgKHN0YXJ0Um5nKSB7DQoJCQkJCQkvLyBMaXN0ZW4gZm9yIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRzDQoJCQkJCQlkb20uYmluZChkb2MsICdtb3VzZXVwJywgZW5kU2VsZWN0aW9uKTsNCgkJCQkJCWRvbS5iaW5kKGRvYywgJ21vdXNlbW92ZScsIHNlbGVjdGlvbkNoYW5nZSk7DQoNCgkJCQkJCWRvbS53aW4uZm9jdXMoKTsNCgkJCQkJCXN0YXJ0Um5nLnNlbGVjdCgpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLmRvbS5YTUxXcml0ZXInLCB7DQoJCW5vZGUgOiBudWxsLA0KDQoJCVhNTFdyaXRlciA6IGZ1bmN0aW9uKHMpIHsNCgkJCS8vIEdldCBYTUwgZG9jdW1lbnQNCgkJCWZ1bmN0aW9uIGdldFhNTCgpIHsNCgkJCQl2YXIgaSA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uOw0KDQoJCQkJaWYgKCFpIHx8ICFpLmNyZWF0ZURvY3VtZW50KSB7DQoJCQkJCS8vIFRyeSBJRSBvYmplY3RzDQoJCQkJCXRyeSB7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNU1hNTDIuRE9NRG9jdW1lbnQnKTt9IGNhdGNoIChleCkge30NCgkJCQkJdHJ5IHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YbWxEb20nKTt9IGNhdGNoIChleCkge30NCgkJCQl9IGVsc2UNCgkJCQkJcmV0dXJuIGkuY3JlYXRlRG9jdW1lbnQoJycsICcnLCBudWxsKTsNCgkJCX07DQoNCgkJCXRoaXMuZG9jID0gZ2V0WE1MKCk7DQoJCQkNCgkJCS8vIFNpbmNlIE9wZXJhIGFuZCBXZWJLaXQgZG9lc24ndCBlc2NhcGUgPiBpbnRvICZndDsgd2UgbmVlZCB0byBkbyBpdCBvdXIgc2VsZiB0byBub3JtYWxpemUgdGhlIG91dHB1dCBmb3IgYWxsIGJyb3dzZXJzDQoJCQl0aGlzLnZhbGlkID0gdGlueW1jZS5pc09wZXJhIHx8IHRpbnltY2UuaXNXZWJLaXQ7DQoNCgkJCXRoaXMucmVzZXQoKTsNCgkJfSwNCg0KCQlyZXNldCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBkID0gdC5kb2M7DQoNCgkJCWlmIChkLmZpcnN0Q2hpbGQpDQoJCQkJZC5yZW1vdmVDaGlsZChkLmZpcnN0Q2hpbGQpOw0KDQoJCQl0Lm5vZGUgPSBkLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiaHRtbCIpKTsNCgkJfSwNCg0KCQl3cml0ZVN0YXJ0RWxlbWVudCA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5ub2RlID0gdC5ub2RlLmFwcGVuZENoaWxkKHQuZG9jLmNyZWF0ZUVsZW1lbnQobikpOw0KCQl9LA0KDQoJCXdyaXRlQXR0cmlidXRlIDogZnVuY3Rpb24obiwgdikgew0KCQkJaWYgKHRoaXMudmFsaWQpDQoJCQkJdiA9IHYucmVwbGFjZSgvPi9nLCAnJU1DR1QlJyk7DQoNCgkJCXRoaXMubm9kZS5zZXRBdHRyaWJ1dGUobiwgdik7DQoJCX0sDQoNCgkJd3JpdGVFbmRFbGVtZW50IDogZnVuY3Rpb24oKSB7DQoJCQl0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTsNCgkJfSwNCg0KCQl3cml0ZUZ1bGxFbmRFbGVtZW50IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG4gPSB0Lm5vZGU7DQoNCgkJCW4uYXBwZW5kQ2hpbGQodC5kb2MuY3JlYXRlVGV4dE5vZGUoIiIpKTsNCgkJCXQubm9kZSA9IG4ucGFyZW50Tm9kZTsNCgkJfSwNCg0KCQl3cml0ZVRleHQgOiBmdW5jdGlvbih2KSB7DQoJCQlpZiAodGhpcy52YWxpZCkNCgkJCQl2ID0gdi5yZXBsYWNlKC8+L2csICclTUNHVCUnKTsNCg0KCQkJdGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZVRleHROb2RlKHYpKTsNCgkJfSwNCg0KCQl3cml0ZUNEQVRBIDogZnVuY3Rpb24odikgew0KCQkJdGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbih2KSk7DQoJCX0sDQoNCgkJd3JpdGVDb21tZW50IDogZnVuY3Rpb24odikgew0KCQkJLy8gRml4IGZvciBidWcgIzIwMzU2OTQNCgkJCWlmICh0aW55bWNlLmlzSUUpDQoJCQkJdiA9IHYucmVwbGFjZSgvXlwtfFwtJC9nLCAnICcpOw0KDQoJCQl0aGlzLm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kb2MuY3JlYXRlQ29tbWVudCh2LnJlcGxhY2UoL1wtXC0vZywgJyAnKSkpOw0KCQl9LA0KDQoJCWdldENvbnRlbnQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBoOw0KDQoJCQloID0gdGhpcy5kb2MueG1sIHx8IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodGhpcy5kb2MpOw0KCQkJaCA9IGgucmVwbGFjZSgvPFw/W14/XStcPz58PGh0bWxbXj5dKj58PFwvaHRtbD58PGh0bWxcLz58PCFET0NUWVBFW14+XSs+L2csICcnKTsNCgkJCWggPSBoLnJlcGxhY2UoLyA/XC8+L2csICcgLz4nKTsNCg0KCQkJaWYgKHRoaXMudmFsaWQpDQoJCQkJaCA9IGgucmVwbGFjZSgvXCVNQ0dUJS9nLCAnJmd0OycpOw0KDQoJCQlyZXR1cm4gaDsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIGF0dHJzQ2hhcnNSZWdFeHAgPSAvWyZcIjw+XS9nLCB0ZXh0Q2hhcnNSZWdFeHAgPSAvWzw+Jl0vZywgZW5jb2RlZENoYXJzID0geycmJyA6ICcmYW1wOycsICciJyA6ICcmcXVvdDsnLCAnPCcgOiAnJmx0OycsICc+JyA6ICcmZ3Q7J307DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5kb20uU3RyaW5nV3JpdGVyJywgew0KCQlzdHIgOiBudWxsLA0KCQl0YWdzIDogbnVsbCwNCgkJY291bnQgOiAwLA0KCQlzZXR0aW5ncyA6IG51bGwsDQoJCWluZGVudCA6IG51bGwsDQoNCgkJU3RyaW5nV3JpdGVyIDogZnVuY3Rpb24ocykgew0KCQkJdGhpcy5zZXR0aW5ncyA9IHRpbnltY2UuZXh0ZW5kKHsNCgkJCQlpbmRlbnRfY2hhciA6ICcgJywNCgkJCQlpbmRlbnRhdGlvbiA6IDANCgkJCX0sIHMpOw0KDQoJCQl0aGlzLnJlc2V0KCk7DQoJCX0sDQoNCgkJcmVzZXQgOiBmdW5jdGlvbigpIHsNCgkJCXRoaXMuaW5kZW50ID0gJyc7DQoJCQl0aGlzLnN0ciA9ICIiOw0KCQkJdGhpcy50YWdzID0gW107DQoJCQl0aGlzLmNvdW50ID0gMDsNCgkJfSwNCg0KCQl3cml0ZVN0YXJ0RWxlbWVudCA6IGZ1bmN0aW9uKG4pIHsNCgkJCXRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgpOw0KCQkJdGhpcy53cml0ZVJhdygnPCcgKyBuKTsNCgkJCXRoaXMudGFncy5wdXNoKG4pOw0KCQkJdGhpcy5pbkF0dHIgPSB0cnVlOw0KCQkJdGhpcy5jb3VudCsrOw0KCQkJdGhpcy5lbGVtZW50Q291bnQgPSB0aGlzLmNvdW50Ow0KCQkJdGhpcy5hdHRycyA9IHt9Ow0KCQl9LA0KDQoJCXdyaXRlQXR0cmlidXRlIDogZnVuY3Rpb24obiwgdikgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoIXQuYXR0cnNbbl0pIHsNCgkJCQl0LndyaXRlUmF3KCIgIiArIHQuZW5jb2RlKG4sIHRydWUpICsgJz0iJyArIHQuZW5jb2RlKHYsIHRydWUpICsgJyInKTsNCgkJCQl0LmF0dHJzW25dID0gdjsNCgkJCX0NCgkJfSwNCg0KCQl3cml0ZUVuZEVsZW1lbnQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBuOw0KDQoJCQlpZiAodGhpcy50YWdzLmxlbmd0aCA+IDApIHsNCgkJCQluID0gdGhpcy50YWdzLnBvcCgpOw0KDQoJCQkJaWYgKHRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgxKSkNCgkJCQkJdGhpcy53cml0ZVJhdygnPC8nICsgbiArICc+Jyk7DQoNCgkJCQlpZiAodGhpcy5zZXR0aW5ncy5pbmRlbnRhdGlvbiA+IDApDQoJCQkJCXRoaXMud3JpdGVSYXcoJ1xuJyk7DQoJCQl9DQoJCX0sDQoNCgkJd3JpdGVGdWxsRW5kRWxlbWVudCA6IGZ1bmN0aW9uKCkgew0KCQkJaWYgKHRoaXMudGFncy5sZW5ndGggPiAwKSB7DQoJCQkJdGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7DQoJCQkJdGhpcy53cml0ZVJhdygnPC8nICsgdGhpcy50YWdzLnBvcCgpICsgJz4nKTsNCg0KCQkJCWlmICh0aGlzLnNldHRpbmdzLmluZGVudGF0aW9uID4gMCkNCgkJCQkJdGhpcy53cml0ZVJhdygnXG4nKTsNCgkJCX0NCgkJfSwNCg0KCQl3cml0ZVRleHQgOiBmdW5jdGlvbih2KSB7DQoJCQl0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTsNCgkJCXRoaXMud3JpdGVSYXcodGhpcy5lbmNvZGUodikpOw0KCQkJdGhpcy5jb3VudCsrOw0KCQl9LA0KDQoJCXdyaXRlQ0RBVEEgOiBmdW5jdGlvbih2KSB7DQoJCQl0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTsNCgkJCXRoaXMud3JpdGVSYXcoJzwhW0NEQVRBWycgKyB2ICsgJ11dPicpOw0KCQkJdGhpcy5jb3VudCsrOw0KCQl9LA0KDQoJCXdyaXRlQ29tbWVudCA6IGZ1bmN0aW9uKHYpIHsNCgkJCXRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgpOw0KCQkJdGhpcy53cml0ZVJhdygnPCEtLScgKyB2ICsgJy0tPicpOw0KCQkJdGhpcy5jb3VudCsrOw0KCQl9LA0KDQoJCXdyaXRlUmF3IDogZnVuY3Rpb24odikgew0KCQkJdGhpcy5zdHIgKz0gdjsNCgkJfSwNCg0KCQllbmNvZGUgOiBmdW5jdGlvbihzLCBhdHRyKSB7DQoJCQlyZXR1cm4gcy5yZXBsYWNlKGF0dHIgPyBhdHRyc0NoYXJzUmVnRXhwIDogdGV4dENoYXJzUmVnRXhwLCBmdW5jdGlvbih2KSB7DQoJCQkJcmV0dXJuIGVuY29kZWRDaGFyc1t2XTsNCgkJCX0pOw0KCQl9LA0KDQoJCWdldENvbnRlbnQgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLnN0cjsNCgkJfSwNCg0KCQlfd3JpdGVBdHRyaWJ1dGVzRW5kIDogZnVuY3Rpb24ocykgew0KCQkJaWYgKCF0aGlzLmluQXR0cikNCgkJCQlyZXR1cm47DQoNCgkJCXRoaXMuaW5BdHRyID0gZmFsc2U7DQoNCgkJCWlmIChzICYmIHRoaXMuZWxlbWVudENvdW50ID09IHRoaXMuY291bnQpIHsNCgkJCQl0aGlzLndyaXRlUmF3KCcgLz4nKTsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoNCgkJCXRoaXMud3JpdGVSYXcoJz4nKTsNCg0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIFNob3J0ZW4gbmFtZXMNCgl2YXIgZXh0ZW5kID0gdGlueW1jZS5leHRlbmQsIGVhY2ggPSB0aW55bWNlLmVhY2gsIERpc3BhdGNoZXIgPSB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlciwgaXNJRSA9IHRpbnltY2UuaXNJRSwgaXNHZWNrbyA9IHRpbnltY2UuaXNHZWNrbzsNCg0KCWZ1bmN0aW9uIHdpbGRjYXJkVG9SRShzKSB7DQoJCXJldHVybiBzLnJlcGxhY2UoLyhbPysqXSkvZywgJy4kMScpOw0KCX07DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5kb20uU2VyaWFsaXplcicsIHsNCgkJU2VyaWFsaXplciA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5rZXkgPSAwOw0KCQkJdC5vblByZVByb2Nlc3MgPSBuZXcgRGlzcGF0Y2hlcih0KTsNCgkJCXQub25Qb3N0UHJvY2VzcyA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KDQoJCQl0cnkgew0KCQkJCXQud3JpdGVyID0gbmV3IHRpbnltY2UuZG9tLlhNTFdyaXRlcigpOw0KCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkvLyBJRSBtaWdodCB0aHJvdyBleGNlcHRpb24gaWYgQWN0aXZlWCBpcyBkaXNhYmxlZCBzbyB3ZSB0aGVuIHN3aXRjaCB0byB0aGUgc2xpZ2h0bHkgc2xvd2VyIFN0cmluZ1dyaXRlcg0KCQkJCXQud3JpdGVyID0gbmV3IHRpbnltY2UuZG9tLlN0cmluZ1dyaXRlcigpOw0KCQkJfQ0KDQoJCQkvLyBJRTkgYnJva2UgdGhlIFhNTCBhdHRyaWJ1dGVzIG9yZGVyIHNvIGl0IGNhbid0IGJlIHVzZWQgYW55bW9yZQ0KCQkJaWYgKHRpbnltY2UuaXNJRSAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA4KSB7DQoJCQkJdC53cml0ZXIgPSBuZXcgdGlueW1jZS5kb20uU3RyaW5nV3JpdGVyKCk7DQoJCQl9DQoNCgkJCS8vIERlZmF1bHQgc2V0dGluZ3MNCgkJCXQuc2V0dGluZ3MgPSBzID0gZXh0ZW5kKHsNCgkJCQlkb20gOiB0aW55bWNlLkRPTSwNCgkJCQl2YWxpZF9ub2RlcyA6IDAsDQoJCQkJbm9kZV9maWx0ZXIgOiAwLA0KCQkJCWF0dHJfZmlsdGVyIDogMCwNCgkJCQlpbnZhbGlkX2F0dHJzIDogL14oX21jZV98X21vel98c2l6c2V0fHNpemNhY2hlKS8sDQoJCQkJY2xvc2VkIDogL14oYnJ8aHJ8aW5wdXR8bWV0YXxpbWd8bGlua3xwYXJhbXxhcmVhKSQvLA0KCQkJCWVudGl0eV9lbmNvZGluZyA6ICduYW1lZCcsDQoJCQkJZW50aXRpZXMgOiAnMTYwLG5ic3AsMTYxLGlleGNsLDE2MixjZW50LDE2Myxwb3VuZCwxNjQsY3VycmVuLDE2NSx5ZW4sMTY2LGJydmJhciwxNjcsc2VjdCwxNjgsdW1sLDE2OSxjb3B5LDE3MCxvcmRmLDE3MSxsYXF1bywxNzIsbm90LDE3MyxzaHksMTc0LHJlZywxNzUsbWFjciwxNzYsZGVnLDE3NyxwbHVzbW4sMTc4LHN1cDIsMTc5LHN1cDMsMTgwLGFjdXRlLDE4MSxtaWNybywxODIscGFyYSwxODMsbWlkZG90LDE4NCxjZWRpbCwxODUsc3VwMSwxODYsb3JkbSwxODcscmFxdW8sMTg4LGZyYWMxNCwxODksZnJhYzEyLDE5MCxmcmFjMzQsMTkxLGlxdWVzdCwxOTIsQWdyYXZlLDE5MyxBYWN1dGUsMTk0LEFjaXJjLDE5NSxBdGlsZGUsMTk2LEF1bWwsMTk3LEFyaW5nLDE5OCxBRWxpZywxOTksQ2NlZGlsLDIwMCxFZ3JhdmUsMjAxLEVhY3V0ZSwyMDIsRWNpcmMsMjAzLEV1bWwsMjA0LElncmF2ZSwyMDUsSWFjdXRlLDIwNixJY2lyYywyMDcsSXVtbCwyMDgsRVRILDIwOSxOdGlsZGUsMjEwLE9ncmF2ZSwyMTEsT2FjdXRlLDIxMixPY2lyYywyMTMsT3RpbGRlLDIxNCxPdW1sLDIxNSx0aW1lcywyMTYsT3NsYXNoLDIxNyxVZ3JhdmUsMjE4LFVhY3V0ZSwyMTksVWNpcmMsMjIwLFV1bWwsMjIxLFlhY3V0ZSwyMjIsVEhPUk4sMjIzLHN6bGlnLDIyNCxhZ3JhdmUsMjI1LGFhY3V0ZSwyMjYsYWNpcmMsMjI3LGF0aWxkZSwyMjgsYXVtbCwyMjksYXJpbmcsMjMwLGFlbGlnLDIzMSxjY2VkaWwsMjMyLGVncmF2ZSwyMzMsZWFjdXRlLDIzNCxlY2lyYywyMzUsZXVtbCwyMzYsaWdyYXZlLDIzNyxpYWN1dGUsMjM4LGljaXJjLDIzOSxpdW1sLDI0MCxldGgsMjQxLG50aWxkZSwyNDIsb2dyYXZlLDI0MyxvYWN1dGUsMjQ0LG9jaXJjLDI0NSxvdGlsZGUsMjQ2LG91bWwsMjQ3LGRpdmlkZSwyNDgsb3NsYXNoLDI0OSx1Z3JhdmUsMjUwLHVhY3V0ZSwyNTEsdWNpcmMsMjUyLHV1bWwsMjUzLHlhY3V0ZSwyNTQsdGhvcm4sMjU1LHl1bWwsNDAyLGZub2YsOTEzLEFscGhhLDkxNCxCZXRhLDkxNSxHYW1tYSw5MTYsRGVsdGEsOTE3LEVwc2lsb24sOTE4LFpldGEsOTE5LEV0YSw5MjAsVGhldGEsOTIxLElvdGEsOTIyLEthcHBhLDkyMyxMYW1iZGEsOTI0LE11LDkyNSxOdSw5MjYsWGksOTI3LE9taWNyb24sOTI4LFBpLDkyOSxSaG8sOTMxLFNpZ21hLDkzMixUYXUsOTMzLFVwc2lsb24sOTM0LFBoaSw5MzUsQ2hpLDkzNixQc2ksOTM3LE9tZWdhLDk0NSxhbHBoYSw5NDYsYmV0YSw5NDcsZ2FtbWEsOTQ4LGRlbHRhLDk0OSxlcHNpbG9uLDk1MCx6ZXRhLDk1MSxldGEsOTUyLHRoZXRhLDk1Myxpb3RhLDk1NCxrYXBwYSw5NTUsbGFtYmRhLDk1NixtdSw5NTcsbnUsOTU4LHhpLDk1OSxvbWljcm9uLDk2MCxwaSw5NjEscmhvLDk2MixzaWdtYWYsOTYzLHNpZ21hLDk2NCx0YXUsOTY1LHVwc2lsb24sOTY2LHBoaSw5NjcsY2hpLDk2OCxwc2ksOTY5LG9tZWdhLDk3Nyx0aGV0YXN5bSw5NzgsdXBzaWgsOTgyLHBpdiw4MjI2LGJ1bGwsODIzMCxoZWxsaXAsODI0MixwcmltZSw4MjQzLFByaW1lLDgyNTQsb2xpbmUsODI2MCxmcmFzbCw4NDcyLHdlaWVycCw4NDY1LGltYWdlLDg0NzYscmVhbCw4NDgyLHRyYWRlLDg1MDEsYWxlZnN5bSw4NTkyLGxhcnIsODU5Myx1YXJyLDg1OTQscmFyciw4NTk1LGRhcnIsODU5NixoYXJyLDg2MjksY3JhcnIsODY1NixsQXJyLDg2NTcsdUFyciw4NjU4LHJBcnIsODY1OSxkQXJyLDg2NjAsaEFyciw4NzA0LGZvcmFsbCw4NzA2LHBhcnQsODcwNyxleGlzdCw4NzA5LGVtcHR5LDg3MTEsbmFibGEsODcxMixpc2luLDg3MTMsbm90aW4sODcxNSxuaSw4NzE5LHByb2QsODcyMSxzdW0sODcyMixtaW51cyw4NzI3LGxvd2FzdCw4NzMwLHJhZGljLDg3MzMscHJvcCw4NzM0LGluZmluLDg3MzYsYW5nLDg3NDMsYW5kLDg3NDQsb3IsODc0NSxjYXAsODc0NixjdXAsODc0NyxpbnQsODc1Nix0aGVyZTQsODc2NCxzaW0sODc3Myxjb25nLDg3NzYsYXN5bXAsODgwMCxuZSw4ODAxLGVxdWl2LDg4MDQsbGUsODgwNSxnZSw4ODM0LHN1Yiw4ODM1LHN1cCw4ODM2LG5zdWIsODgzOCxzdWJlLDg4Mzksc3VwZSw4ODUzLG9wbHVzLDg4NTUsb3RpbWVzLDg4NjkscGVycCw4OTAxLHNkb3QsODk2OCxsY2VpbCw4OTY5LHJjZWlsLDg5NzAsbGZsb29yLDg5NzEscmZsb29yLDkwMDEsbGFuZyw5MDAyLHJhbmcsOTY3NCxsb3osOTgyNCxzcGFkZXMsOTgyNyxjbHVicyw5ODI5LGhlYXJ0cyw5ODMwLGRpYW1zLDMzOCxPRWxpZywzMzksb2VsaWcsMzUyLFNjYXJvbiwzNTMsc2Nhcm9uLDM3NixZdW1sLDcxMCxjaXJjLDczMix0aWxkZSw4MTk0LGVuc3AsODE5NSxlbXNwLDgyMDEsdGhpbnNwLDgyMDQsenduaiw4MjA1LHp3aiw4MjA2LGxybSw4MjA3LHJsbSw4MjExLG5kYXNoLDgyMTIsbWRhc2gsODIxNixsc3F1byw4MjE3LHJzcXVvLDgyMTgsc2JxdW8sODIyMCxsZHF1byw4MjIxLHJkcXVvLDgyMjIsYmRxdW8sODIyNCxkYWdnZXIsODIyNSxEYWdnZXIsODI0MCxwZXJtaWwsODI0OSxsc2FxdW8sODI1MCxyc2FxdW8sODM2NCxldXJvJywNCgkJCQl2YWxpZF9lbGVtZW50cyA6ICcqWypdJywNCgkJCQlleHRlbmRlZF92YWxpZF9lbGVtZW50cyA6IDAsDQoJCQkJaW52YWxpZF9lbGVtZW50cyA6IDAsDQoJCQkJZml4X3RhYmxlX2VsZW1lbnRzIDogMSwNCgkJCQlmaXhfbGlzdF9lbGVtZW50cyA6IHRydWUsDQoJCQkJZml4X2NvbnRlbnRfZHVwbGljYXRpb24gOiB0cnVlLA0KCQkJCWNvbnZlcnRfZm9udHNfdG9fc3BhbnMgOiBmYWxzZSwNCgkJCQlmb250X3NpemVfY2xhc3NlcyA6IDAsDQoJCQkJYXBwbHlfc291cmNlX2Zvcm1hdHRpbmcgOiAwLA0KCQkJCWluZGVudF9tb2RlIDogJ3NpbXBsZScsDQoJCQkJaW5kZW50X2NoYXIgOiAnXHQnLA0KCQkJCWluZGVudF9sZXZlbHMgOiAxLA0KCQkJCXJlbW92ZV9saW5lYnJlYWtzIDogMSwNCgkJCQlyZW1vdmVfcmVkdW5kYW50X2JycyA6IDEsDQoJCQkJZWxlbWVudF9mb3JtYXQgOiAneGh0bWwnDQoJCQl9LCBzKTsNCg0KCQkJdC5kb20gPSBzLmRvbTsNCgkJCXQuc2NoZW1hID0gcy5zY2hlbWE7DQoNCgkJCS8vIFVzZSByYXcgZW50aXRpZXMgaWYgbm8gZW50aXRpZXMgYXJlIGRlZmluZWQNCgkJCWlmIChzLmVudGl0eV9lbmNvZGluZyA9PSAnbmFtZWQnICYmICFzLmVudGl0aWVzKQ0KCQkJCXMuZW50aXR5X2VuY29kaW5nID0gJ3Jhdyc7DQoNCgkJCWlmIChzLnJlbW92ZV9yZWR1bmRhbnRfYnJzKSB7DQoJCQkJdC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihzZSwgbykgew0KCQkJCQkvLyBSZW1vdmUgc2luZ2xlIEJSIGF0IGVuZCBvZiBibG9jayBlbGVtZW50cyBzaW5jZSB0aGV5IGdldCByZW5kZXJlZA0KCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSgvKDxiciBcLz5ccyopKzxcLyhwfGhbMS02XXxkaXZ8bGkpPi9naSwgZnVuY3Rpb24oYSwgYiwgYykgew0KCQkJCQkJLy8gQ2hlY2sgaWYgaXQncyBhIHNpbmdsZSBlbGVtZW50DQoJCQkJCQlpZiAoL148YnIgXC8+XHMqPFwvLy50ZXN0KGEpKQ0KCQkJCQkJCXJldHVybiAnPC8nICsgYyArICc+JzsNCg0KCQkJCQkJcmV0dXJuIGE7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBSZW1vdmUgWEhUTUwgZWxlbWVudCBlbmRpbmdzIGkuZS4gcHJvZHVjZSBjcmFwIDopIFhIVE1MIGlzIGJldHRlcg0KCQkJaWYgKHMuZWxlbWVudF9mb3JtYXQgPT0gJ2h0bWwnKSB7DQoJCQkJdC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihzZSwgbykgew0KCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSgvPChbXj5dKykgXC8+L2csICc8JDE+Jyk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmZpeF9saXN0X2VsZW1lbnRzKSB7DQoJCQkJdC5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJCXZhciBubCwgeCwgYSA9IFsnb2wnLCAndWwnXSwgaSwgbiwgcCwgciA9IC9eKE9MfFVMKSQvLCBucDsNCg0KCQkJCQlmdW5jdGlvbiBwcmV2Tm9kZShlLCBuKSB7DQoJCQkJCQl2YXIgYSA9IG4uc3BsaXQoJywnKSwgaTsNCg0KCQkJCQkJd2hpbGUgKChlID0gZS5wcmV2aW91c1NpYmxpbmcpICE9IG51bGwpIHsNCgkJCQkJCQlmb3IgKGk9MDsgaTxhLmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJCWlmIChlLm5vZGVOYW1lID09IGFbaV0pDQoJCQkJCQkJCQlyZXR1cm4gZTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCXJldHVybiBudWxsOw0KCQkJCQl9Ow0KDQoJCQkJCWZvciAoeD0wOyB4PGEubGVuZ3RoOyB4KyspIHsNCgkJCQkJCW5sID0gdC5kb20uc2VsZWN0KGFbeF0sIG8ubm9kZSk7DQoNCgkJCQkJCWZvciAoaT0wOyBpPG5sLmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJbiA9IG5sW2ldOw0KCQkJCQkJCXAgPSBuLnBhcmVudE5vZGU7DQoNCgkJCQkJCQlpZiAoci50ZXN0KHAubm9kZU5hbWUpKSB7DQoJCQkJCQkJCW5wID0gcHJldk5vZGUobiwgJ0xJJyk7DQoNCgkJCQkJCQkJaWYgKCFucCkgew0KCQkJCQkJCQkJbnAgPSB0LmRvbS5jcmVhdGUoJ2xpJyk7DQoJCQkJCQkJCQlucC5pbm5lckhUTUwgPSAnJm5ic3A7JzsNCgkJCQkJCQkJCW5wLmFwcGVuZENoaWxkKG4pOw0KCQkJCQkJCQkJcC5pbnNlcnRCZWZvcmUobnAsIHAuZmlyc3RDaGlsZCk7DQoJCQkJCQkJCX0gZWxzZQ0KCQkJCQkJCQkJbnAuYXBwZW5kQ2hpbGQobik7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmZpeF90YWJsZV9lbGVtZW50cykgew0KCQkJCXQub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihzZSwgbykgew0KCQkJCQllYWNoKHQuZG9tLnNlbGVjdCgncCB0YWJsZScsIG8ubm9kZSkucmV2ZXJzZSgpLCBmdW5jdGlvbihuKSB7DQoJCQkJCQl2YXIgcGFyZW50ID0gdC5kb20uZ2V0UGFyZW50KG4ucGFyZW50Tm9kZSwgJ3RhYmxlLHAnKTsNCg0KCQkJCQkJaWYgKHBhcmVudC5ub2RlTmFtZSAhPSAnVEFCTEUnKSB7DQoJCQkJCQkJdHJ5IHsNCgkJCQkJCQkJdC5kb20uc3BsaXQocGFyZW50LCBuKTsNCgkJCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJCQkvLyBJRSBjYW4gc29tZXRpbWVzIGZpcmUgYW4gdW5rbm93biBydW50aW1lIGVycm9yIHNvIHdlIGp1c3QgaWdub3JlIGl0DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9KTsNCgkJCX0NCgkJfSwNCg0KCQlzZXRFbnRpdGllcyA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgYSwgaSwgbCA9IHt9LCB2Ow0KDQoJCQkvLyBObyBuZWVkIHRvIHNldHVwIG1vcmUgdGhhbiBvbmNlDQoJCQlpZiAodC5lbnRpdHlMb29rdXApDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBCdWlsZCByZWdleCBhbmQgbG9va3VwIGFycmF5DQoJCQlhID0gcy5zcGxpdCgnLCcpOw0KCQkJZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDIpIHsNCgkJCQl2ID0gYVtpXTsNCg0KCQkJCS8vIERvbid0IGFkZCBkZWZhdWx0ICZhbXA7ICZxdW90OyBldGMuDQoJCQkJaWYgKHYgPT0gMzQgfHwgdiA9PSAzOCB8fCB2ID09IDYwIHx8IHYgPT0gNjIpDQoJCQkJCWNvbnRpbnVlOw0KDQoJCQkJbFtTdHJpbmcuZnJvbUNoYXJDb2RlKGFbaV0pXSA9IGFbaSArIDFdOw0KDQoJCQkJdiA9IHBhcnNlSW50KGFbaV0pLnRvU3RyaW5nKDE2KTsNCgkJCX0NCg0KCQkJdC5lbnRpdHlMb29rdXAgPSBsOw0KCQl9LA0KDQoJCXNldFJ1bGVzIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0Ll9zZXR1cCgpOw0KCQkJdC5ydWxlcyA9IHt9Ow0KCQkJdC53aWxkUnVsZXMgPSBbXTsNCgkJCXQudmFsaWRFbGVtZW50cyA9IHt9Ow0KDQoJCQlyZXR1cm4gdC5hZGRSdWxlcyhzKTsNCgkJfSwNCg0KCQlhZGRSdWxlcyA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgZHI7DQoNCgkJCWlmICghcykNCgkJCQlyZXR1cm47DQoNCgkJCXQuX3NldHVwKCk7DQoNCgkJCWVhY2gocy5zcGxpdCgnLCcpLCBmdW5jdGlvbihzKSB7DQoJCQkJdmFyIHAgPSBzLnNwbGl0KC9cW3xcXS8pLCB0biA9IHBbMF0uc3BsaXQoJy8nKSwgcmEsIGF0LCB3YXQsIHZhID0gW107DQoNCgkJCQkvLyBFeHRlbmQgd2l0aCBkZWZhdWx0IHJ1bGVzDQoJCQkJaWYgKGRyKQ0KCQkJCQlhdCA9IHRpbnltY2UuZXh0ZW5kKFtdLCBkci5hdHRyaWJzKTsNCg0KCQkJCS8vIFBhcnNlIGF0dHJpYnV0ZXMNCgkJCQlpZiAocC5sZW5ndGggPiAxKSB7DQoJCQkJCWVhY2gocFsxXS5zcGxpdCgnfCcpLCBmdW5jdGlvbihzKSB7DQoJCQkJCQl2YXIgYXIgPSB7fSwgaTsNCg0KCQkJCQkJYXQgPSBhdCB8fCBbXTsNCg0KCQkJCQkJLy8gUGFyc2UgYXR0cmlidXRlIHJ1bGUNCgkJCQkJCXMgPSBzLnJlcGxhY2UoLzo6L2csICd+Jyk7DQoJCQkJCQlzID0gL14oWyFcLV0pPyhbXHcqLj9+X1wtXSt8KShbPTo8XSk/KC4rKT8kLy5leGVjKHMpOw0KCQkJCQkJc1syXSA9IHNbMl0ucmVwbGFjZSgvfi9nLCAnOicpOw0KDQoJCQkJCQkvLyBBZGQgcmVxdWlyZWQgYXR0cmlidXRlcw0KCQkJCQkJaWYgKHNbMV0gPT0gJyEnKSB7DQoJCQkJCQkJcmEgPSByYSB8fCBbXTsNCgkJCQkJCQlyYS5wdXNoKHNbMl0pOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBSZW1vdmUgaW5oZXJpdGVkIGF0dHJpYnV0ZXMNCgkJCQkJCWlmIChzWzFdID09ICctJykgew0KCQkJCQkJCWZvciAoaSA9IDA7IGkgPGF0Lmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJCWlmIChhdFtpXS5uYW1lID09IHNbMl0pIHsNCgkJCQkJCQkJCWF0LnNwbGljZShpLCAxKTsNCgkJCQkJCQkJCXJldHVybjsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJc3dpdGNoIChzWzNdKSB7DQoJCQkJCQkJLy8gQWRkIGRlZmF1bHQgYXR0cmliIHZhbHVlcw0KCQkJCQkJCWNhc2UgJz0nOg0KCQkJCQkJCQlhci5kZWZhdWx0VmFsID0gc1s0XSB8fCAnJzsNCgkJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCQkvLyBBZGQgZm9yY2VkIGF0dHJpYiB2YWx1ZXMNCgkJCQkJCQljYXNlICc6JzoNCgkJCQkJCQkJYXIuZm9yY2VkVmFsID0gc1s0XTsNCgkJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCQkvLyBBZGQgdmFsaWRhdGlvbiB2YWx1ZXMNCgkJCQkJCQljYXNlICc8JzoNCgkJCQkJCQkJYXIudmFsaWRWYWxzID0gc1s0XS5zcGxpdCgnPycpOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCX0NCg0KCQkJCQkJaWYgKC9bKi4/XS8udGVzdChzWzJdKSkgew0KCQkJCQkJCXdhdCA9IHdhdCB8fCBbXTsNCgkJCQkJCQlhci5uYW1lUkUgPSBuZXcgUmVnRXhwKCdeJyArIHdpbGRjYXJkVG9SRShzWzJdKSArICckJyk7DQoJCQkJCQkJd2F0LnB1c2goYXIpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQlhci5uYW1lID0gc1syXTsNCgkJCQkJCQlhdC5wdXNoKGFyKTsNCgkJCQkJCX0NCg0KCQkJCQkJdmEucHVzaChzWzJdKTsNCgkJCQkJfSk7DQoJCQkJfQ0KDQoJCQkJLy8gSGFuZGxlIGVsZW1lbnQgbmFtZXMNCgkJCQllYWNoKHRuLCBmdW5jdGlvbihzLCBpKSB7DQoJCQkJCXZhciBwciA9IHMuY2hhckF0KDApLCB4ID0gMSwgcnUgPSB7fTsNCg0KCQkJCQkvLyBFeHRlbmQgd2l0aCBkZWZhdWx0IHJ1bGUgZGF0YQ0KCQkJCQlpZiAoZHIpIHsNCgkJCQkJCWlmIChkci5ub0VtcHR5KQ0KCQkJCQkJCXJ1Lm5vRW1wdHkgPSBkci5ub0VtcHR5Ow0KDQoJCQkJCQlpZiAoZHIuZnVsbEVuZCkNCgkJCQkJCQlydS5mdWxsRW5kID0gZHIuZnVsbEVuZDsNCg0KCQkJCQkJaWYgKGRyLnBhZGQpDQoJCQkJCQkJcnUucGFkZCA9IGRyLnBhZGQ7DQoJCQkJCX0NCg0KCQkJCQkvLyBIYW5kbGUgcHJlZml4ZXMNCgkJCQkJc3dpdGNoIChwcikgew0KCQkJCQkJY2FzZSAnLSc6DQoJCQkJCQkJcnUubm9FbXB0eSA9IHRydWU7DQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWNhc2UgJysnOg0KCQkJCQkJCXJ1LmZ1bGxFbmQgPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQljYXNlICcjJzoNCgkJCQkJCQlydS5wYWRkID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJZGVmYXVsdDoNCgkJCQkJCQl4ID0gMDsNCgkJCQkJfQ0KDQoJCQkJCXRuW2ldID0gcyA9IHMuc3Vic3RyaW5nKHgpOw0KCQkJCQl0LnZhbGlkRWxlbWVudHNbc10gPSAxOw0KDQoJCQkJCS8vIEFkZCBlbGVtZW50IG5hbWUgb3IgZWxlbWVudCByZWdleA0KCQkJCQlpZiAoL1sqLj9dLy50ZXN0KHRuWzBdKSkgew0KCQkJCQkJcnUubmFtZVJFID0gbmV3IFJlZ0V4cCgnXicgKyB3aWxkY2FyZFRvUkUodG5bMF0pICsgJyQnKTsNCgkJCQkJCXQud2lsZFJ1bGVzID0gdC53aWxkUnVsZXMgfHwge307DQoJCQkJCQl0LndpbGRSdWxlcy5wdXNoKHJ1KTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCXJ1Lm5hbWUgPSB0blswXTsNCg0KCQkJCQkJLy8gU3RvcmUgYXdheSBkZWZhdWx0IHJ1bGUNCgkJCQkJCWlmICh0blswXSA9PSAnQCcpDQoJCQkJCQkJZHIgPSBydTsNCg0KCQkJCQkJdC5ydWxlc1tzXSA9IHJ1Ow0KCQkJCQl9DQoNCgkJCQkJcnUuYXR0cmlicyA9IGF0Ow0KDQoJCQkJCWlmIChyYSkNCgkJCQkJCXJ1LnJlcXVpcmVkQXR0cmlicyA9IHJhOw0KDQoJCQkJCWlmICh3YXQpIHsNCgkJCQkJCS8vIEJ1aWxkIHZhbGlkIGF0dHJpYnV0ZXMgcmVnZXhwDQoJCQkJCQlzID0gJyc7DQoJCQkJCQllYWNoKHZhLCBmdW5jdGlvbih2KSB7DQoJCQkJCQkJaWYgKHMpDQoJCQkJCQkJCXMgKz0gJ3wnOw0KDQoJCQkJCQkJcyArPSAnKCcgKyB3aWxkY2FyZFRvUkUodikgKyAnKSc7DQoJCQkJCQl9KTsNCgkJCQkJCXJ1LnZhbGlkQXR0cmlic1JFID0gbmV3IFJlZ0V4cCgnXicgKyBzLnRvTG93ZXJDYXNlKCkgKyAnJCcpOw0KCQkJCQkJcnUud2lsZEF0dHJpYnMgPSB3YXQ7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQkvLyBCdWlsZCB2YWxpZCBlbGVtZW50cyByZWdleHANCgkJCXMgPSAnJzsNCgkJCWVhY2godC52YWxpZEVsZW1lbnRzLCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJaWYgKHMpDQoJCQkJCXMgKz0gJ3wnOw0KDQoJCQkJaWYgKGsgIT0gJ0AnKQ0KCQkJCQlzICs9IGs7DQoJCQl9KTsNCgkJCXQudmFsaWRFbGVtZW50c1JFID0gbmV3IFJlZ0V4cCgnXignICsgd2lsZGNhcmRUb1JFKHMudG9Mb3dlckNhc2UoKSkgKyAnKSQnKTsNCg0KCQkJLy9jb25zb2xlLmRlYnVnKHQudmFsaWRFbGVtZW50c1JFLnRvU3RyaW5nKCkpOw0KCQkJLy9jb25zb2xlLmRpcih0LnJ1bGVzKTsNCgkJCS8vY29uc29sZS5kaXIodC53aWxkUnVsZXMpOw0KCQl9LA0KDQoJCWZpbmRSdWxlIDogZnVuY3Rpb24obikgew0KCQkJdmFyIHQgPSB0aGlzLCBybCA9IHQucnVsZXMsIGksIHI7DQoNCgkJCXQuX3NldHVwKCk7DQoNCgkJCS8vIEV4YWN0IG1hdGNoDQoJCQlyID0gcmxbbl07DQoJCQlpZiAocikNCgkJCQlyZXR1cm4gcjsNCg0KCQkJLy8gVHJ5IHdpbGRjYXJkcw0KCQkJcmwgPSB0LndpbGRSdWxlczsNCgkJCWZvciAoaSA9IDA7IGkgPCBybC5sZW5ndGg7IGkrKykgew0KCQkJCWlmIChybFtpXS5uYW1lUkUudGVzdChuKSkNCgkJCQkJcmV0dXJuIHJsW2ldOw0KCQkJfQ0KDQoJCQlyZXR1cm4gbnVsbDsNCgkJfSwNCg0KCQlmaW5kQXR0cmliUnVsZSA6IGZ1bmN0aW9uKHJ1LCBuKSB7DQoJCQl2YXIgaSwgd2EgPSBydS53aWxkQXR0cmliczsNCg0KCQkJZm9yIChpID0gMDsgaSA8IHdhLmxlbmd0aDsgaSsrKSB7DQoJCQkJaWYgKHdhW2ldLm5hbWVSRS50ZXN0KG4pKQ0KCQkJCQlyZXR1cm4gd2FbaV07DQoJCQl9DQoNCgkJCXJldHVybiBudWxsOw0KCQl9LA0KDQoJCXNlcmlhbGl6ZSA6IGZ1bmN0aW9uKG4sIG8pIHsNCgkJCXZhciBoLCB0ID0gdGhpcywgZG9jLCBvbGREb2MsIGltcGwsIHNlbGVjdGVkOw0KDQoJCQl0Ll9zZXR1cCgpOw0KCQkJbyA9IG8gfHwge307DQoJCQlvLmZvcm1hdCA9IG8uZm9ybWF0IHx8ICdodG1sJzsNCgkJCXQucHJvY2Vzc09iaiA9IG87DQoNCgkJCS8vIElFIGxvb3NlcyB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlIG9uIG9wdGlvbiBlbGVtZW50cyBzbyB3ZSBuZWVkIHRvIHN0b3JlIGl0DQoJCQkvLyBTZWU6IGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvODI5OTA3DQoJCQlpZiAoaXNJRSkgew0KCQkJCXNlbGVjdGVkID0gW107DQoJCQkJZWFjaChuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdvcHRpb24nKSwgZnVuY3Rpb24obikgew0KCQkJCQl2YXIgdiA9IHQuZG9tLmdldEF0dHJpYihuLCAnc2VsZWN0ZWQnKTsNCg0KCQkJCQlzZWxlY3RlZC5wdXNoKHYgPyB2IDogbnVsbCk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCW4gPSBuLmNsb25lTm9kZSh0cnVlKTsNCg0KCQkJLy8gSUUgbG9vc2VzIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgb24gb3B0aW9uIGVsZW1lbnRzIHNvIHdlIG5lZWQgdG8gcmVzdG9yZSBpdA0KCQkJaWYgKGlzSUUpIHsNCgkJCQllYWNoKG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ29wdGlvbicpLCBmdW5jdGlvbihuLCBpKSB7DQoJCQkJCXQuZG9tLnNldEF0dHJpYihuLCAnc2VsZWN0ZWQnLCBzZWxlY3RlZFtpXSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCS8vIE5vZGVzIG5lZWRzIHRvIGJlIGF0dGFjaGVkIHRvIHNvbWV0aGluZyBpbiBXZWJLaXQvT3BlcmENCgkJCS8vIE9sZGVyIGJ1aWxkcyBvZiBPcGVyYSBjcmFzaGVzIGlmIHlvdSBhdHRhY2ggdGhlIG5vZGUgdG8gYW4gZG9jdW1lbnQgY3JlYXRlZCBkeW5hbWljYWxseQ0KCQkJLy8gYW5kIHNpbmNlIHdlIGNhbid0IGZlYXR1cmUgZGV0ZWN0IGEgY3Jhc2ggd2UgbmVlZCB0byBzbmlmZiB0aGUgYWN1dGFsIGJ1aWxkIG51bWJlcg0KCQkJLy8gVGhpcyBmaXggd2lsbCBtYWtlIERPTSByYW5nZXMgYW5kIG1ha2UgU2l6emxlIGhhcHB5IQ0KCQkJaW1wbCA9IG4ub3duZXJEb2N1bWVudC5pbXBsZW1lbnRhdGlvbjsNCgkJCWlmIChpbXBsLmNyZWF0ZUhUTUxEb2N1bWVudCkgew0KCQkJCS8vIENyZWF0ZSBhbiBlbXB0eSBIVE1MIGRvY3VtZW50DQoJCQkJZG9jID0gaW1wbC5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpOw0KDQoJCQkJLy8gQWRkIHRoZSBlbGVtZW50IG9yIGl0J3MgY2hpbGRyZW4gaWYgaXQncyBhIGJvZHkgZWxlbWVudCB0byB0aGUgbmV3IGRvY3VtZW50DQoJCQkJZWFjaChuLm5vZGVOYW1lID09ICdCT0RZJyA/IG4uY2hpbGROb2RlcyA6IFtuXSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQlkb2MuYm9keS5hcHBlbmRDaGlsZChkb2MuaW1wb3J0Tm9kZShub2RlLCB0cnVlKSk7DQoJCQkJfSk7DQoNCgkJCQkvLyBHcmFiIGZpcnN0IGNoaWxkIG9yIGJvZHkgZWxlbWVudCBmb3Igc2VyaWFsaXphdGlvbg0KCQkJCWlmIChuLm5vZGVOYW1lICE9ICdCT0RZJykNCgkJCQkJbiA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7DQoJCQkJZWxzZQ0KCQkJCQluID0gZG9jLmJvZHk7DQoNCgkJCQkvLyBzZXQgdGhlIG5ldyBkb2N1bWVudCBpbiBET01VdGlscyBzbyBjcmVhdGVFbGVtZW50IGV0YyB3b3Jrcw0KCQkJCW9sZERvYyA9IHQuZG9tLmRvYzsNCgkJCQl0LmRvbS5kb2MgPSBkb2M7DQoJCQl9DQoNCgkJCXQua2V5ID0gJycgKyAocGFyc2VJbnQodC5rZXkpICsgMSk7DQoNCgkJCS8vIFByZSBwcm9jZXNzDQoJCQlpZiAoIW8ubm9fZXZlbnRzKSB7DQoJCQkJby5ub2RlID0gbjsNCgkJCQl0Lm9uUHJlUHJvY2Vzcy5kaXNwYXRjaCh0LCBvKTsNCgkJCX0NCg0KCQkJLy8gU2VyaWFsaXplIEhUTUwgRE9NIGludG8gYSBzdHJpbmcNCgkJCXQud3JpdGVyLnJlc2V0KCk7DQoJCQl0Ll9pbmZvID0gbzsNCgkJCXQuX3NlcmlhbGl6ZU5vZGUobiwgby5nZXRJbm5lcik7DQoNCgkJCS8vIFBvc3QgcHJvY2Vzcw0KCQkJby5jb250ZW50ID0gdC53cml0ZXIuZ2V0Q29udGVudCgpOw0KDQoJCQkvLyBSZXN0b3JlIHRoZSBvbGQgZG9jdW1lbnQgaWYgaXQgd2FzIGNoYW5nZWQNCgkJCWlmIChvbGREb2MpDQoJCQkJdC5kb20uZG9jID0gb2xkRG9jOw0KDQoJCQlpZiAoIW8ubm9fZXZlbnRzKQ0KCQkJCXQub25Qb3N0UHJvY2Vzcy5kaXNwYXRjaCh0LCBvKTsNCg0KCQkJdC5fcG9zdFByb2Nlc3Mobyk7DQoJCQlvLm5vZGUgPSBudWxsOw0KDQoJCQlyZXR1cm4gdGlueW1jZS50cmltKG8uY29udGVudCk7DQoJCX0sDQoNCgkJLy8gSW50ZXJuYWwgZnVuY3Rpb25zDQoNCgkJX3Bvc3RQcm9jZXNzIDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgaCA9IG8uY29udGVudCwgc2MgPSBbXSwgcDsNCg0KCQkJaWYgKG8uZm9ybWF0ID09ICdodG1sJykgew0KCQkJCS8vIFByb3RlY3Qgc29tZSBlbGVtZW50cw0KCQkJCXAgPSB0Ll9wcm90ZWN0KHsNCgkJCQkJY29udGVudCA6IGgsDQoJCQkJCXBhdHRlcm5zIDogWw0KCQkJCQkJe3BhdHRlcm4gOiAvKDxzY3JpcHRbXj5dKj4pKC4qPykoPFwvc2NyaXB0PikvZ30sDQoJCQkJCQl7cGF0dGVybiA6IC8oPG5vc2NyaXB0W14+XSo+KSguKj8pKDxcL25vc2NyaXB0PikvZ30sDQoJCQkJCQl7cGF0dGVybiA6IC8oPHN0eWxlW14+XSo+KSguKj8pKDxcL3N0eWxlPikvZ30sDQoJCQkJCQl7cGF0dGVybiA6IC8oPHByZVtePl0qPikoLio/KSg8XC9wcmU+KS9nLCBlbmNvZGUgOiAxfSwNCgkJCQkJCXtwYXR0ZXJuIDogLyg8IS0tXFtDREFUQVxbKSguKj8pKFxdXF0tLT4pL2d9DQoJCQkJCV0NCgkJCQl9KTsNCg0KCQkJCWggPSBwLmNvbnRlbnQ7DQoNCgkJCQkvLyBFbnRpdHkgZW5jb2RlDQoJCQkJaWYgKHMuZW50aXR5X2VuY29kaW5nICE9PSAncmF3JykNCgkJCQkJaCA9IHQuX2VuY29kZShoKTsNCg0KCQkJCS8vIFVzZSBCUiBpbnN0ZWFkIG9mICZuYnNwOyBwYWRkZWQgUCBlbGVtZW50cyBpbnNpZGUgZWRpdG9yIGFuZCB1c2UgPHA+Jm5ic3A7PC9wPiBvdXRzaWRlIGVkaXRvcg0KLyoJCQkJaWYgKG8uc2V0KQ0KCQkJCQloID0gaC5yZXBsYWNlKC88cD5ccysoJm5ic3A7fCYjMTYwO3xcdTAwYTB8PGJyIFwvPilccys8XC9wPi9nLCAnPHA+PGJyIC8+PC9wPicpOw0KCQkJCWVsc2UNCgkJCQkJaCA9IGgucmVwbGFjZSgvPHA+XHMrKCZuYnNwO3wmIzE2MDt8XHUwMGEwfDxiciBcLz4pXHMrPFwvcD4vZywgJzxwPiQxPC9wPicpOyovDQoNCgkJCQkvLyBTaW5jZSBHZWNrbyBhbmQgU2FmYXJpIGtlZXBzIHdoaXRlc3BhY2UgaW4gdGhlIERPTSB3ZSBuZWVkIHRvDQoJCQkJLy8gcmVtb3ZlIGl0IGlub3JkZXIgdG8gbWF0Y2ggb3RoZXIgYnJvd3NlcnMuIEJ1dCBJIHRoaW5rIEdlY2tvIGFuZCBTYWZhcmkgaXMgcmlnaHQuDQoJCQkJLy8gVGhpcyBwcm9jZXNzIGlzIG9ubHkgZG9uZSB3aGVuIGdldHRpbmcgY29udGVudHMgb3V0IGZyb20gdGhlIGVkaXRvci4NCgkJCQlpZiAoIW8uc2V0KSB7DQoJCQkJCS8vIFdlIG5lZWQgdG8gcmVwbGFjZSBwYXJhZ3JhcGggd2hpdGVzcGFjZSB3aXRoIGFuIG5ic3AgYmVmb3JlIGluZGVudGF0aW9uIHRvIGtlZXAgdGhlIFx1MDBhMCBjaGFyDQoJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88cD5ccys8XC9wPnw8cChbXj5dKyk+XHMrPFwvcD4vZywgcy5lbnRpdHlfZW5jb2RpbmcgPT0gJ251bWVyaWMnID8gJzxwJDE+JiMxNjA7PC9wPicgOiAnPHAkMT4mbmJzcDs8L3A+JywgaCk7DQoNCgkJCQkJaWYgKHMucmVtb3ZlX2xpbmVicmVha3MpIHsNCgkJCQkJCWggPSBoLnJlcGxhY2UoL1xyP1xufFxyL2csICcgJyk7DQoJCQkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvKDxbXj5dKz4pXHMrL2csICckMSAnLCBoKTsNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC9ccysoPFwvW14+XSs+KS9nLCAnICQxJywgaCk7DQoJCQkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPChwfGhbMS02XXxibG9ja3F1b3RlfGhyfGRpdnx0YWJsZXx0Ym9keXx0cnx0ZHxib2R5fGhlYWR8aHRtbHx0aXRsZXxtZXRhfHN0eWxlfHByZXxzY3JpcHR8bGlua3xvYmplY3QpIChbXj5dKyk+XHMrL2csICc8JDEgJDI+JywgaCk7IC8vIFRyaW0gYmxvY2sgc3RhcnQNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88KHB8aFsxLTZdfGJsb2NrcXVvdGV8aHJ8ZGl2fHRhYmxlfHRib2R5fHRyfHRkfGJvZHl8aGVhZHxodG1sfHRpdGxlfG1ldGF8c3R5bGV8cHJlfHNjcmlwdHxsaW5rfG9iamVjdCk+XHMrL2csICc8JDE+JywgaCk7IC8vIFRyaW0gYmxvY2sgc3RhcnQNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC9ccys8XC8ocHxoWzEtNl18YmxvY2txdW90ZXxocnxkaXZ8dGFibGV8dGJvZHl8dHJ8dGR8Ym9keXxoZWFkfGh0bWx8dGl0bGV8bWV0YXxzdHlsZXxwcmV8c2NyaXB0fGxpbmt8b2JqZWN0KT4vZywgJzwvJDE+JywgaCk7IC8vIFRyaW0gYmxvY2sgZW5kDQoJCQkJCX0NCg0KCQkJCQkvLyBTaW1wbGUgaW5kZW50YXRpb24NCgkJCQkJaWYgKHMuYXBwbHlfc291cmNlX2Zvcm1hdHRpbmcgJiYgcy5pbmRlbnRfbW9kZSA9PSAnc2ltcGxlJykgew0KCQkJCQkJLy8gQWRkIGxpbmUgYnJlYWtzIGJlZm9yZSBhbmQgYWZ0ZXIgYmxvY2sgZWxlbWVudHMNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88KFwvPykodWx8aHJ8dGFibGV8bWV0YXxsaW5rfHRib2R5fHRyfG9iamVjdHxib2R5fGhlYWR8aHRtbHxtYXApKHxbXj5dKyk+XHMqL2csICdcbjwkMSQyJDM+XG4nLCBoKTsNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC9ccyo8KHB8aFsxLTZdfGJsb2NrcXVvdGV8ZGl2fHRpdGxlfHN0eWxlfHByZXxzY3JpcHR8dGR8bGl8YXJlYSkofFtePl0rKT4vZywgJ1xuPCQxJDI+JywgaCk7DQoJCQkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPFwvKHB8aFsxLTZdfGJsb2NrcXVvdGV8ZGl2fHRpdGxlfHN0eWxlfHByZXxzY3JpcHR8dGR8bGkpPlxzKi9nLCAnPC8kMT5cbicsIGgpOw0KCQkJCQkJaCA9IGgucmVwbGFjZSgvXG5cbi9nLCAnXG4nKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCWggPSB0Ll91bnByb3RlY3QoaCwgcCk7DQoNCgkJCQkvLyBSZXN0b3JlIENEQVRBIHNlY3Rpb25zDQoJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoLzwhLS1cW0NEQVRBXFsoW1xzXFNdKylcXVxdLS0+L2csICc8IVtDREFUQVskMV1dPicsIGgpOw0KDQoJCQkJLy8gUmVzdG9yZSB0aGUgXHUwMGEwIGNoYXJhY3RlciBpZiByYXcgbW9kZSBpcyBlbmFibGVkDQoJCQkJaWYgKHMuZW50aXR5X2VuY29kaW5nID09ICdyYXcnKQ0KCQkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPHA+Jm5ic3A7PFwvcD58PHAoW14+XSspPiZuYnNwOzxcL3A+L2csICc8cCQxPlx1MDBhMDwvcD4nLCBoKTsNCg0KCQkJCS8vIFJlc3RvcmUgbm9zY3JpcHQgZWxlbWVudHMNCgkJCQloID0gaC5yZXBsYWNlKC88bm9zY3JpcHQoW14+XSt8KT4oW1xzXFNdKj8pPFwvbm9zY3JpcHQ+L2csIGZ1bmN0aW9uKHYsIGF0dHJpYnMsIHRleHQpIHsNCgkJCQkJcmV0dXJuICc8bm9zY3JpcHQnICsgYXR0cmlicyArICc+JyArIHQuZG9tLmRlY29kZSh0ZXh0LnJlcGxhY2UoLzwhLS18LS0+L2csICcnKSkgKyAnPC9ub3NjcmlwdD4nOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlvLmNvbnRlbnQgPSBoOw0KCQl9LA0KDQoJCV9zZXJpYWxpemVOb2RlIDogZnVuY3Rpb24obiwgaW5uZXIpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIHcgPSB0LndyaXRlciwgaGMsIGVsLCBjbiwgaSwgbCwgYSwgYXQsIG5vLCB2LCBubiwgcnUsIGFyLCBpdiwgY2xvc2VkLCBrZWVwLCB0eXBlLCBzY29wZU5hbWU7DQoNCgkJCWlmICghcy5ub2RlX2ZpbHRlciB8fCBzLm5vZGVfZmlsdGVyKG4pKSB7DQoJCQkJc3dpdGNoIChuLm5vZGVUeXBlKSB7DQoJCQkJCWNhc2UgMTogLy8gRWxlbWVudA0KCQkJCQkJaWYgKG4uaGFzQXR0cmlidXRlID8gbi5oYXNBdHRyaWJ1dGUoJ19tY2VfYm9ndXMnKSA6IG4uZ2V0QXR0cmlidXRlKCdfbWNlX2JvZ3VzJykpDQoJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQlpdiA9IGtlZXAgPSBmYWxzZTsNCgkJCQkJCWhjID0gbi5oYXNDaGlsZE5vZGVzKCk7DQoJCQkJCQlubiA9IG4uZ2V0QXR0cmlidXRlKCdfbWNlX25hbWUnKSB8fCBuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7DQoNCgkJCQkJCS8vIEdldCBpbnRlcm5hbCB0eXBlDQoJCQkJCQl0eXBlID0gbi5nZXRBdHRyaWJ1dGUoJ19tY2VfdHlwZScpOw0KCQkJCQkJaWYgKHR5cGUpIHsNCgkJCQkJCQlpZiAoIXQuX2luZm8uY2xlYW51cCkgew0KCQkJCQkJCQlpdiA9IHRydWU7DQoJCQkJCQkJCXJldHVybjsNCgkJCQkJCQl9IGVsc2UNCgkJCQkJCQkJa2VlcCA9IDE7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEFkZCBjb3JyZWN0IHByZWZpeCBvbiBJRQ0KCQkJCQkJaWYgKGlzSUUpIHsNCgkJCQkJCQlzY29wZU5hbWUgPSBuLnNjb3BlTmFtZTsNCgkJCQkJCQlpZiAoc2NvcGVOYW1lICYmIHNjb3BlTmFtZSAhPT0gJ0hUTUwnICYmIHNjb3BlTmFtZSAhPT0gJ2h0bWwnKQ0KCQkJCQkJCQlubiA9IHNjb3BlTmFtZSArICc6JyArIG5uOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBSZW1vdmUgbWNlIHByZWZpeCBvbiBJRSBuZWVkZWQgZm9yIHRoZSBhYmJyIGVsZW1lbnQNCgkJCQkJCWlmIChubi5pbmRleE9mKCdtY2U6JykgPT09IDApDQoJCQkJCQkJbm4gPSBubi5zdWJzdHJpbmcoNCk7DQoNCgkJCQkJCS8vIENoZWNrIGlmIHZhbGlkDQoJCQkJCQlpZiAoIWtlZXApIHsNCgkJCQkJCQlpZiAoIXQudmFsaWRFbGVtZW50c1JFIHx8ICF0LnZhbGlkRWxlbWVudHNSRS50ZXN0KG5uKSB8fCAodC5pbnZhbGlkRWxlbWVudHNSRSAmJiB0LmludmFsaWRFbGVtZW50c1JFLnRlc3Qobm4pKSB8fCBpbm5lcikgew0KCQkJCQkJCQlpdiA9IHRydWU7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJaWYgKGlzSUUpIHsNCgkJCQkJCQkvLyBGaXggSUUgY29udGVudCBkdXBsaWNhdGlvbiAoRE9NIGNhbiBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSBub2RlKQ0KCQkJCQkJCWlmIChzLmZpeF9jb250ZW50X2R1cGxpY2F0aW9uKSB7DQoJCQkJCQkJCWlmIChuLl9tY2Vfc2VyaWFsaXplZCA9PSB0LmtleSkNCgkJCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJCQluLl9tY2Vfc2VyaWFsaXplZCA9IHQua2V5Ow0KCQkJCQkJCX0NCg0KCQkJCQkJCS8vIElFIHNvbWV0aW1lcyBhZGRzIGEgLyBpbmZyb250IG9mIHRoZSBub2RlIG5hbWUNCgkJCQkJCQlpZiAobm4uY2hhckF0KDApID09ICcvJykNCgkJCQkJCQkJbm4gPSBubi5zdWJzdHJpbmcoMSk7DQoJCQkJCQl9IGVsc2UgaWYgKGlzR2Vja28pIHsNCgkJCQkJCQkvLyBJZ25vcmUgYnIgZWxlbWVudHMNCgkJCQkJCQlpZiAobi5ub2RlTmFtZSA9PT0gJ0JSJyAmJiBuLmdldEF0dHJpYnV0ZSgndHlwZScpID09ICdfbW96JykNCgkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBDaGVjayBpZiB2YWxpZCBjaGlsZA0KCQkJCQkJaWYgKHMudmFsaWRhdGVfY2hpbGRyZW4pIHsNCgkJCQkJCQlpZiAodC5lbGVtZW50TmFtZSAmJiAhdC5zY2hlbWEuaXNWYWxpZCh0LmVsZW1lbnROYW1lLCBubikpIHsNCgkJCQkJCQkJaXYgPSB0cnVlOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoNCgkJCQkJCQl0LmVsZW1lbnROYW1lID0gbm47DQoJCQkJCQl9DQoNCgkJCQkJCXJ1ID0gdC5maW5kUnVsZShubik7DQoJCQkJCQkNCgkJCQkJCS8vIE5vIHZhbGlkIHJ1bGUgZm9yIHRoaXMgZWxlbWVudCBjb3VsZCBiZSBmb3VuZCB0aGVuIHNraXAgaXQNCgkJCQkJCWlmICghcnUpIHsNCgkJCQkJCQlpdiA9IHRydWU7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQl9DQoNCgkJCQkJCW5uID0gcnUubmFtZSB8fCBubjsNCgkJCQkJCWNsb3NlZCA9IHMuY2xvc2VkLnRlc3Qobm4pOw0KDQoJCQkJCQkvLyBTa2lwIGVtcHR5IG5vZGVzIG9yIGVtcHR5IG5vZGUgbmFtZSBpbiBJRQ0KCQkJCQkJaWYgKCghaGMgJiYgcnUubm9FbXB0eSkgfHwgKGlzSUUgJiYgIW5uKSkgew0KCQkJCQkJCWl2ID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gQ2hlY2sgcmVxdWlyZWQNCgkJCQkJCWlmIChydS5yZXF1aXJlZEF0dHJpYnMpIHsNCgkJCQkJCQlhID0gcnUucmVxdWlyZWRBdHRyaWJzOw0KDQoJCQkJCQkJZm9yIChpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCQkJCQlpZiAodGhpcy5kb20uZ2V0QXR0cmliKG4sIGFbaV0pICE9PSAnJykNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCg0KCQkJCQkJCS8vIE5vbmUgb2YgdGhlIHJlcXVpcmVkIHdhcyB0aGVyZQ0KCQkJCQkJCWlmIChpID09IC0xKSB7DQoJCQkJCQkJCWl2ID0gdHJ1ZTsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQl3LndyaXRlU3RhcnRFbGVtZW50KG5uKTsNCg0KCQkJCQkJLy8gQWRkIG9yZGVyZWQgYXR0cmlidXRlcw0KCQkJCQkJaWYgKHJ1LmF0dHJpYnMpIHsNCgkJCQkJCQlmb3IgKGk9MCwgYXQgPSBydS5hdHRyaWJzLCBsID0gYXQubGVuZ3RoOyBpPGw7IGkrKykgew0KCQkJCQkJCQlhID0gYXRbaV07DQoJCQkJCQkJCXYgPSB0Ll9nZXRBdHRyaWIobiwgYSk7DQoNCgkJCQkJCQkJaWYgKHYgIT09IG51bGwpDQoJCQkJCQkJCQl3LndyaXRlQXR0cmlidXRlKGEubmFtZSwgdik7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBBZGQgd2lsZCBhdHRyaWJ1dGVzDQoJCQkJCQlpZiAocnUudmFsaWRBdHRyaWJzUkUpIHsNCgkJCQkJCQlhdCA9IHQuZG9tLmdldEF0dHJpYnMobik7DQoJCQkJCQkJZm9yIChpPWF0Lmxlbmd0aC0xOyBpPi0xOyBpLS0pIHsNCgkJCQkJCQkJbm8gPSBhdFtpXTsNCg0KCQkJCQkJCQlpZiAobm8uc3BlY2lmaWVkKSB7DQoJCQkJCQkJCQlhID0gbm8ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsNCg0KCQkJCQkJCQkJaWYgKHMuaW52YWxpZF9hdHRycy50ZXN0KGEpIHx8ICFydS52YWxpZEF0dHJpYnNSRS50ZXN0KGEpKQ0KCQkJCQkJCQkJCWNvbnRpbnVlOw0KDQoJCQkJCQkJCQlhciA9IHQuZmluZEF0dHJpYlJ1bGUocnUsIGEpOw0KCQkJCQkJCQkJdiA9IHQuX2dldEF0dHJpYihuLCBhciwgYSk7DQoNCgkJCQkJCQkJCWlmICh2ICE9PSBudWxsKQ0KCQkJCQkJCQkJCXcud3JpdGVBdHRyaWJ1dGUoYSwgdik7DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEtlZXAgdHlwZSBhdHRyaWJ1dGUNCgkJCQkJCWlmICh0eXBlICYmIGtlZXApDQoJCQkJCQkJdy53cml0ZUF0dHJpYnV0ZSgnX21jZV90eXBlJywgdHlwZSk7DQoNCgkJCQkJCS8vIFdyaXRlIHRleHQgZnJvbSBzY3JpcHQNCgkJCQkJCWlmIChubiA9PT0gJ3NjcmlwdCcgJiYgdGlueW1jZS50cmltKG4uaW5uZXJIVE1MKSkgew0KCQkJCQkJCXcud3JpdGVUZXh0KCcvLyAnKTsgLy8gUGFkZCBpdCB3aXRoIGEgY29tbWVudCBzbyBpdCB3aWxsIHBhcnNlIG9uIG9sZGVyIGJyb3dzZXJzDQoJCQkJCQkJdy53cml0ZUNEQVRBKG4uaW5uZXJIVE1MLnJlcGxhY2UoLzwhLS18LS0+fDxcW0NEQVRBXFt8XF1cXT4vZywgJycpKTsgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBjZGF0YSBzdHVjdHVyZXMNCgkJCQkJCQloYyA9IGZhbHNlOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBQYWRkIGVtcHR5IG5vZGVzIHdpdGggYSAmbmJzcDsNCgkJCQkJCWlmIChydS5wYWRkKSB7DQoJCQkJCQkJLy8gSWYgaXQgaGFzIG9ubHkgb25lIGJvZ3VzIGNoaWxkLCBwYWRkIGl0IGFueXdheSB3b3JrYXJvdW5kIGZvciA8dGQ+PGJyIC8+PC90ZD4gYnVnDQoJCQkJCQkJaWYgKGhjICYmIChjbiA9IG4uZmlyc3RDaGlsZCkgJiYgY24ubm9kZVR5cGUgPT09IDEgJiYgbi5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkgew0KCQkJCQkJCQlpZiAoY24uaGFzQXR0cmlidXRlID8gY24uaGFzQXR0cmlidXRlKCdfbWNlX2JvZ3VzJykgOiBjbi5nZXRBdHRyaWJ1dGUoJ19tY2VfYm9ndXMnKSkNCgkJCQkJCQkJCXcud3JpdGVUZXh0KCdcdTAwYTAnKTsNCgkJCQkJCQl9IGVsc2UgaWYgKCFoYykNCgkJCQkJCQkJdy53cml0ZVRleHQoJ1x1MDBhMCcpOyAvLyBObyBjaGlsZHJlbiB0aGVuIHBhZGQgaXQNCgkJCQkJCX0NCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAzOiAvLyBUZXh0DQoJCQkJCQkvLyBDaGVjayBpZiB2YWxpZCBjaGlsZA0KCQkJCQkJaWYgKHMudmFsaWRhdGVfY2hpbGRyZW4gJiYgdC5lbGVtZW50TmFtZSAmJiAhdC5zY2hlbWEuaXNWYWxpZCh0LmVsZW1lbnROYW1lLCAnI3RleHQnKSkNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCXJldHVybiB3LndyaXRlVGV4dChuLm5vZGVWYWx1ZSk7DQoNCgkJCQkJY2FzZSA0OiAvLyBDREFUQQ0KCQkJCQkJcmV0dXJuIHcud3JpdGVDREFUQShuLm5vZGVWYWx1ZSk7DQoNCgkJCQkJY2FzZSA4OiAvLyBDb21tZW50DQoJCQkJCQlyZXR1cm4gdy53cml0ZUNvbW1lbnQobi5ub2RlVmFsdWUpOw0KCQkJCX0NCgkJCX0gZWxzZSBpZiAobi5ub2RlVHlwZSA9PSAxKQ0KCQkJCWhjID0gbi5oYXNDaGlsZE5vZGVzKCk7DQoNCgkJCWlmIChoYyAmJiAhY2xvc2VkKSB7DQoJCQkJY24gPSBuLmZpcnN0Q2hpbGQ7DQoNCgkJCQl3aGlsZSAoY24pIHsNCgkJCQkJdC5fc2VyaWFsaXplTm9kZShjbik7DQoJCQkJCXQuZWxlbWVudE5hbWUgPSBubjsNCgkJCQkJY24gPSBjbi5uZXh0U2libGluZzsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFdyaXRlIGVsZW1lbnQgZW5kDQoJCQlpZiAoIWl2KSB7DQoJCQkJaWYgKCFjbG9zZWQpDQoJCQkJCXcud3JpdGVGdWxsRW5kRWxlbWVudCgpOw0KCQkJCWVsc2UNCgkJCQkJdy53cml0ZUVuZEVsZW1lbnQoKTsNCgkJCX0NCgkJfSwNCg0KCQlfcHJvdGVjdCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJby5pdGVtcyA9IG8uaXRlbXMgfHwgW107DQoNCgkJCWZ1bmN0aW9uIGVuYyhzKSB7DQoJCQkJcmV0dXJuIHMucmVwbGFjZSgvW1xyXG5cXF0vZywgZnVuY3Rpb24oYykgew0KCQkJCQlpZiAoYyA9PT0gJ1xuJykNCgkJCQkJCXJldHVybiAnXFxuJzsNCgkJCQkJZWxzZSBpZiAoYyA9PT0gJ1xcJykNCgkJCQkJCXJldHVybiAnXFxcXCc7DQoNCgkJCQkJcmV0dXJuICdcXHInOw0KCQkJCX0pOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gZGVjKHMpIHsNCgkJCQlyZXR1cm4gcy5yZXBsYWNlKC9cXFtcXHJuXS9nLCBmdW5jdGlvbihjKSB7DQoJCQkJCWlmIChjID09PSAnXFxuJykNCgkJCQkJCXJldHVybiAnXG4nOw0KCQkJCQllbHNlIGlmIChjID09PSAnXFxcXCcpDQoJCQkJCQlyZXR1cm4gJ1xcJzsNCg0KCQkJCQlyZXR1cm4gJ1xyJzsNCgkJCQl9KTsNCgkJCX07DQoNCgkJCWVhY2goby5wYXR0ZXJucywgZnVuY3Rpb24ocCkgew0KCQkJCW8uY29udGVudCA9IGRlYyhlbmMoby5jb250ZW50KS5yZXBsYWNlKHAucGF0dGVybiwgZnVuY3Rpb24oeCwgYSwgYiwgYykgew0KCQkJCQliID0gZGVjKGIpOw0KDQoJCQkJCWlmIChwLmVuY29kZSkNCgkJCQkJCWIgPSB0Ll9lbmNvZGUoYik7DQoNCgkJCQkJby5pdGVtcy5wdXNoKGIpOw0KCQkJCQlyZXR1cm4gYSArICc8IS0tbWNlOicgKyAoby5pdGVtcy5sZW5ndGggLSAxKSArICctLT4nICsgYzsNCgkJCQl9KSk7DQoJCQl9KTsNCg0KCQkJcmV0dXJuIG87DQoJCX0sDQoNCgkJX3VucHJvdGVjdCA6IGZ1bmN0aW9uKGgsIG8pIHsNCgkJCWggPSBoLnJlcGxhY2UoL1w8IS0tbWNlOihbMC05XSspLS1cPi9nLCBmdW5jdGlvbihhLCBiKSB7DQoJCQkJcmV0dXJuIG8uaXRlbXNbcGFyc2VJbnQoYildOw0KCQkJfSk7DQoNCgkJCW8uaXRlbXMgPSBbXTsNCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJX2VuY29kZSA6IGZ1bmN0aW9uKGgpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGw7DQoNCgkJCS8vIEVudGl0eSBlbmNvZGUNCgkJCWlmIChzLmVudGl0eV9lbmNvZGluZyAhPT0gJ3JhdycpIHsNCgkJCQlpZiAocy5lbnRpdHlfZW5jb2RpbmcuaW5kZXhPZignbmFtZWQnKSAhPSAtMSkgew0KCQkJCQl0LnNldEVudGl0aWVzKHMuZW50aXRpZXMpOw0KCQkJCQlsID0gdC5lbnRpdHlMb29rdXA7DQoNCgkJCQkJaCA9IGgucmVwbGFjZSgvW1x1MDA3RS1cdUZGRkZdL2csIGZ1bmN0aW9uKGEpIHsNCgkJCQkJCXZhciB2Ow0KDQoJCQkJCQlpZiAodiA9IGxbYV0pDQoJCQkJCQkJYSA9ICcmJyArIHYgKyAnOyc7DQoNCgkJCQkJCXJldHVybiBhOw0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQlpZiAocy5lbnRpdHlfZW5jb2RpbmcuaW5kZXhPZignbnVtZXJpYycpICE9IC0xKSB7DQoJCQkJCWggPSBoLnJlcGxhY2UoL1tcdTAwN0UtXHVGRkZGXS9nLCBmdW5jdGlvbihhKSB7DQoJCQkJCQlyZXR1cm4gJyYjJyArIGEuY2hhckNvZGVBdCgwKSArICc7JzsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gaDsNCgkJfSwNCg0KCQlfc2V0dXAgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHRoaXMuc2V0dGluZ3M7DQoNCgkJCWlmICh0LmRvbmUpDQoJCQkJcmV0dXJuOw0KDQoJCQl0LmRvbmUgPSAxOw0KDQoJCQl0LnNldFJ1bGVzKHMudmFsaWRfZWxlbWVudHMpOw0KCQkJdC5hZGRSdWxlcyhzLmV4dGVuZGVkX3ZhbGlkX2VsZW1lbnRzKTsNCg0KCQkJaWYgKHMuaW52YWxpZF9lbGVtZW50cykNCgkJCQl0LmludmFsaWRFbGVtZW50c1JFID0gbmV3IFJlZ0V4cCgnXignICsgd2lsZGNhcmRUb1JFKHMuaW52YWxpZF9lbGVtZW50cy5yZXBsYWNlKC8sL2csICd8JykudG9Mb3dlckNhc2UoKSkgKyAnKSQnKTsNCg0KCQkJaWYgKHMuYXR0cmliX3ZhbHVlX2ZpbHRlcikNCgkJCQl0LmF0dHJpYlZhbHVlRmlsdGVyID0gcy5hdHRyaWJWYWx1ZUZpbHRlcjsNCgkJfSwNCg0KCQlfZ2V0QXR0cmliIDogZnVuY3Rpb24obiwgYSwgbmEpIHsNCgkJCXZhciBpLCB2Ow0KDQoJCQluYSA9IG5hIHx8IGEubmFtZTsNCg0KCQkJaWYgKGEuZm9yY2VkVmFsICYmICh2ID0gYS5mb3JjZWRWYWwpKSB7DQoJCQkJaWYgKHYgPT09ICd7JHVpZH0nKQ0KCQkJCQlyZXR1cm4gdGhpcy5kb20udW5pcXVlSWQoKTsNCg0KCQkJCXJldHVybiB2Ow0KCQkJfQ0KDQoJCQl2ID0gdGhpcy5kb20uZ2V0QXR0cmliKG4sIG5hKTsNCg0KCQkJc3dpdGNoIChuYSkgew0KCQkJCWNhc2UgJ3Jvd3NwYW4nOg0KCQkJCWNhc2UgJ2NvbHNwYW4nOg0KCQkJCQkvLyBXaGF0cyB0aGUgcG9pbnQ/IFJlbW92ZSB1c2xlc3MgYXR0cmlidXRlIHZhbHVlDQoJCQkJCWlmICh2ID09ICcxJykNCgkJCQkJCXYgPSAnJzsNCg0KCQkJCQlicmVhazsNCgkJCX0NCg0KCQkJaWYgKHRoaXMuYXR0cmliVmFsdWVGaWx0ZXIpDQoJCQkJdiA9IHRoaXMuYXR0cmliVmFsdWVGaWx0ZXIobmEsIHYsIG4pOw0KDQoJCQlpZiAoYS52YWxpZFZhbHMpIHsNCgkJCQlmb3IgKGkgPSBhLnZhbGlkVmFscy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCQlpZiAodiA9PSBhLnZhbGlkVmFsc1tpXSkNCgkJCQkJCWJyZWFrOw0KCQkJCX0NCg0KCQkJCWlmIChpID09IC0xKQ0KCQkJCQlyZXR1cm4gbnVsbDsNCgkJCX0NCg0KCQkJaWYgKHYgPT09ICcnICYmIHR5cGVvZihhLmRlZmF1bHRWYWwpICE9ICd1bmRlZmluZWQnKSB7DQoJCQkJdiA9IGEuZGVmYXVsdFZhbDsNCg0KCQkJCWlmICh2ID09PSAneyR1aWR9JykNCgkJCQkJcmV0dXJuIHRoaXMuZG9tLnVuaXF1ZUlkKCk7DQoNCgkJCQlyZXR1cm4gdjsNCgkJCX0gZWxzZSB7DQoJCQkJLy8gUmVtb3ZlIGludGVybmFsIG1jZUl0ZW1YWCBjbGFzc2VzIHdoZW4gY29udGVudCBpcyBleHRyYWN0ZWQgZnJvbSBlZGl0b3INCgkJCQlpZiAobmEgPT0gJ2NsYXNzJyAmJiB0aGlzLnByb2Nlc3NPYmouZ2V0KQ0KCQkJCQl2ID0gdi5yZXBsYWNlKC9ccz9tY2VJdGVtXHcrXHM/L2csICcnKTsNCgkJCX0NCg0KCQkJaWYgKHYgPT09ICcnKQ0KCQkJCXJldHVybiBudWxsOw0KDQoNCgkJCXJldHVybiB2Ow0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl0aW55bWNlLmRvbS5TY3JpcHRMb2FkZXIgPSBmdW5jdGlvbihzZXR0aW5ncykgew0KCQl2YXIgUVVFVUVEID0gMCwNCgkJCUxPQURJTkcgPSAxLA0KCQkJTE9BREVEID0gMiwNCgkJCXN0YXRlcyA9IHt9LA0KCQkJcXVldWUgPSBbXSwNCgkJCXNjcmlwdExvYWRlZENhbGxiYWNrcyA9IHt9LA0KCQkJcXVldWVMb2FkZWRDYWxsYmFja3MgPSBbXSwNCgkJCWxvYWRpbmcgPSAwLA0KCQkJdW5kZWZpbmVkOw0KDQoJCWZ1bmN0aW9uIGxvYWRTY3JpcHQodXJsLCBjYWxsYmFjaykgew0KCQkJdmFyIHQgPSB0aGlzLCBkb20gPSB0aW55bWNlLkRPTSwgZWxtLCB1cmksIGxvYywgaWQ7DQoNCgkJCS8vIEV4ZWN1dGUgY2FsbGJhY2sgd2hlbiBzY3JpcHQgaXMgbG9hZGVkDQoJCQlmdW5jdGlvbiBkb25lKCkgew0KCQkJCWRvbS5yZW1vdmUoaWQpOw0KDQoJCQkJaWYgKGVsbSkNCgkJCQkJZWxtLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGVsbS5vbmxvYWQgPSBlbG0gPSBudWxsOw0KDQoJCQkJY2FsbGJhY2soKTsNCgkJCX07DQoNCgkJCWlkID0gZG9tLnVuaXF1ZUlkKCk7DQoNCgkJCWlmICh0aW55bWNlLmlzSUU2KSB7DQoJCQkJdXJpID0gbmV3IHRpbnltY2UudXRpbC5VUkkodXJsKTsNCgkJCQlsb2MgPSBsb2NhdGlvbjsNCg0KCQkJCS8vIElmIHNjcmlwdCBpcyBmcm9tIHNhbWUgZG9tYWluIGFuZCB3ZQ0KCQkJCS8vIHVzZSBJRSA2IHRoZW4gdXNlIFhIUiBzaW5jZSBpdCdzIG1vcmUgcmVsaWFibGUNCgkJCQlpZiAodXJpLmhvc3QgPT0gbG9jLmhvc3RuYW1lICYmIHVyaS5wb3J0ID09IGxvYy5wb3J0ICYmICh1cmkucHJvdG9jb2wgKyAnOicpID09IGxvYy5wcm90b2NvbCkgew0KCQkJCQl0aW55bWNlLnV0aWwuWEhSLnNlbmQoew0KCQkJCQkJdXJsIDogdGlueW1jZS5fYWRkVmVyKHVyaS5nZXRVUkkoKSksDQoJCQkJCQlzdWNjZXNzIDogZnVuY3Rpb24oY29udGVudCkgew0KCQkJCQkJCS8vIENyZWF0ZSBuZXcgdGVtcCBzY3JpcHQgZWxlbWVudA0KCQkJCQkJCXZhciBzY3JpcHQgPSBkb20uY3JlYXRlKCdzY3JpcHQnLCB7DQoJCQkJCQkJCXR5cGUgOiAndGV4dC9qYXZhc2NyaXB0Jw0KCQkJCQkJCX0pOw0KDQoJCQkJCQkJLy8gRXZhbHVhdGUgc2NyaXB0IGluIGdsb2JhbCBzY29wZQ0KCQkJCQkJCXNjcmlwdC50ZXh0ID0gY29udGVudDsNCgkJCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHNjcmlwdCk7DQoJCQkJCQkJZG9tLnJlbW92ZShzY3JpcHQpOw0KDQoJCQkJCQkJZG9uZSgpOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCg0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBDcmVhdGUgbmV3IHNjcmlwdCBlbGVtZW50DQoJCQllbG0gPSBkb20uY3JlYXRlKCdzY3JpcHQnLCB7DQoJCQkJaWQgOiBpZCwNCgkJCQl0eXBlIDogJ3RleHQvamF2YXNjcmlwdCcsDQoJCQkJc3JjIDogdGlueW1jZS5fYWRkVmVyKHVybCkNCgkJCX0pOw0KDQoJCQkvLyBBZGQgb25sb2FkIGxpc3RlbmVyIGZvciBub24gSUUgYnJvd3NlcnMgc2luY2UgSUU5DQoJCQkvLyBmaXJlcyBvbmxvYWQgZXZlbnQgYmVmb3JlIHRoZSBzY3JpcHQgaXMgcGFyc2VkIGFuZCBleGVjdXRlZA0KCQkJaWYgKCF0aW55bWNlLmlzSUUpDQoJCQkJZWxtLm9ubG9hZCA9IGRvbmU7DQoNCgkJCWVsbS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsNCgkJCQl2YXIgc3RhdGUgPSBlbG0ucmVhZHlTdGF0ZTsNCg0KCQkJCS8vIExvYWRlZCBzdGF0ZSBpcyBwYXNzZWQgb24gSUUgNiBob3dldmVyIHRoZXJlDQoJCQkJLy8gYXJlIGtub3duIGlzc3VlcyB3aXRoIHRoaXMgbWV0aG9kIGJ1dCB3ZSBjYW4ndCB1c2UNCgkJCQkvLyBYSFIgaW4gYSBjcm9zcyBkb21haW4gbG9hZGluZw0KCQkJCWlmIChzdGF0ZSA9PSAnY29tcGxldGUnIHx8IHN0YXRlID09ICdsb2FkZWQnKQ0KCQkJCQlkb25lKCk7DQoJCQl9Ow0KDQoJCQkvLyBNb3N0IGJyb3dzZXJzIHN1cHBvcnQgdGhpcyBmZWF0dXJlIHNvIHdlIHJlcG9ydCBlcnJvcnMNCgkJCS8vIGZvciB0aG9zZSBhdCBsZWFzdCB0byBoZWxwIHVzZXJzIHRyYWNrIHRoZWlyIG1pc3NpbmcgcGx1Z2lucyBldGMNCgkJCS8vIHRvZG86IFJlbW92ZWQgc2luY2UgaXQgcHJvZHVjZWQgZXJyb3IgaWYgdGhlIGRvY3VtZW50IGlzIHVubG9hZGVkIGJ5IG5hdmlnYXRpbmcgYXdheSwgcmUtYWRkIGl0IGFzIGFuIG9wdGlvbg0KCQkJLyplbG0ub25lcnJvciA9IGZ1bmN0aW9uKCkgew0KCQkJCWFsZXJ0KCdGYWlsZWQgdG8gbG9hZDogJyArIHVybCk7DQoJCQl9OyovDQoNCgkJCS8vIEFkZCBzY3JpcHQgdG8gZG9jdW1lbnQNCgkJCShkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdIHx8IGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKGVsbSk7DQoJCX07DQoNCgkJdGhpcy5pc0RvbmUgPSBmdW5jdGlvbih1cmwpIHsNCgkJCXJldHVybiBzdGF0ZXNbdXJsXSA9PSBMT0FERUQ7DQoJCX07DQoNCgkJdGhpcy5tYXJrRG9uZSA9IGZ1bmN0aW9uKHVybCkgew0KCQkJc3RhdGVzW3VybF0gPSBMT0FERUQ7DQoJCX07DQoNCgkJdGhpcy5hZGQgPSB0aGlzLmxvYWQgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrLCBzY29wZSkgew0KCQkJdmFyIGl0ZW0sIHN0YXRlID0gc3RhdGVzW3VybF07DQoNCgkJCS8vIEFkZCB1cmwgdG8gbG9hZCBxdWV1ZQ0KCQkJaWYgKHN0YXRlID09IHVuZGVmaW5lZCkgew0KCQkJCXF1ZXVlLnB1c2godXJsKTsNCgkJCQlzdGF0ZXNbdXJsXSA9IFFVRVVFRDsNCgkJCX0NCg0KCQkJaWYgKGNhbGxiYWNrKSB7DQoJCQkJLy8gU3RvcmUgYXdheSBjYWxsYmFjayBmb3IgbGF0ZXIgZXhlY3V0aW9uDQoJCQkJaWYgKCFzY3JpcHRMb2FkZWRDYWxsYmFja3NbdXJsXSkNCgkJCQkJc2NyaXB0TG9hZGVkQ2FsbGJhY2tzW3VybF0gPSBbXTsNCg0KCQkJCXNjcmlwdExvYWRlZENhbGxiYWNrc1t1cmxdLnB1c2goew0KCQkJCQlmdW5jIDogY2FsbGJhY2ssDQoJCQkJCXNjb3BlIDogc2NvcGUgfHwgdGhpcw0KCQkJCX0pOw0KCQkJfQ0KCQl9Ow0KDQoJCXRoaXMubG9hZFF1ZXVlID0gZnVuY3Rpb24oY2FsbGJhY2ssIHNjb3BlKSB7DQoJCQl0aGlzLmxvYWRTY3JpcHRzKHF1ZXVlLCBjYWxsYmFjaywgc2NvcGUpOw0KCQl9Ow0KDQoJCXRoaXMubG9hZFNjcmlwdHMgPSBmdW5jdGlvbihzY3JpcHRzLCBjYWxsYmFjaywgc2NvcGUpIHsNCgkJCXZhciBsb2FkU2NyaXB0czsNCg0KCQkJZnVuY3Rpb24gZXhlY1NjcmlwdExvYWRlZENhbGxiYWNrcyh1cmwpIHsNCgkJCQkvLyBFeGVjdXRlIFVSTCBjYWxsYmFjayBmdW5jdGlvbnMNCgkJCQl0aW55bWNlLmVhY2goc2NyaXB0TG9hZGVkQ2FsbGJhY2tzW3VybF0sIGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQoJCQkJCWNhbGxiYWNrLmZ1bmMuY2FsbChjYWxsYmFjay5zY29wZSk7DQoJCQkJfSk7DQoNCgkJCQlzY3JpcHRMb2FkZWRDYWxsYmFja3NbdXJsXSA9IHVuZGVmaW5lZDsNCgkJCX07DQoNCgkJCXF1ZXVlTG9hZGVkQ2FsbGJhY2tzLnB1c2goew0KCQkJCWZ1bmMgOiBjYWxsYmFjaywNCgkJCQlzY29wZSA6IHNjb3BlIHx8IHRoaXMNCgkJCX0pOw0KDQoJCQlsb2FkU2NyaXB0cyA9IGZ1bmN0aW9uKCkgew0KCQkJCXZhciBsb2FkaW5nU2NyaXB0cyA9IHRpbnltY2UuZ3JlcChzY3JpcHRzKTsNCg0KCQkJCS8vIEN1cnJlbnQgc2NyaXB0cyBoYXMgYmVlbiBoYW5kbGVkDQoJCQkJc2NyaXB0cy5sZW5ndGggPSAwOw0KDQoJCQkJLy8gTG9hZCBzY3JpcHRzIHRoYXQgbmVlZHMgdG8gYmUgbG9hZGVkDQoJCQkJdGlueW1jZS5lYWNoKGxvYWRpbmdTY3JpcHRzLCBmdW5jdGlvbih1cmwpIHsNCgkJCQkJLy8gU2NyaXB0IGlzIGFscmVhZHkgbG9hZGVkIHRoZW4gZXhlY3V0ZSBzY3JpcHQgY2FsbGJhY2tzIGRpcmVjdGx5DQoJCQkJCWlmIChzdGF0ZXNbdXJsXSA9PSBMT0FERUQpIHsNCgkJCQkJCWV4ZWNTY3JpcHRMb2FkZWRDYWxsYmFja3ModXJsKTsNCgkJCQkJCXJldHVybjsNCgkJCQkJfQ0KDQoJCQkJCS8vIElzIHNjcmlwdCBub3QgbG9hZGluZyB0aGVuIHN0YXJ0IGxvYWRpbmcgaXQNCgkJCQkJaWYgKHN0YXRlc1t1cmxdICE9IExPQURJTkcpIHsNCgkJCQkJCXN0YXRlc1t1cmxdID0gTE9BRElORzsNCgkJCQkJCWxvYWRpbmcrKzsNCg0KCQkJCQkJbG9hZFNjcmlwdCh1cmwsIGZ1bmN0aW9uKCkgew0KCQkJCQkJCXN0YXRlc1t1cmxdID0gTE9BREVEOw0KCQkJCQkJCWxvYWRpbmctLTsNCg0KCQkJCQkJCWV4ZWNTY3JpcHRMb2FkZWRDYWxsYmFja3ModXJsKTsNCg0KCQkJCQkJCS8vIExvYWQgbW9yZSBzY3JpcHRzIGlmIHRoZXkgd2hlcmUgYWRkZWQgYnkgdGhlIHJlY2VudGx5IGxvYWRlZCBzY3JpcHQNCgkJCQkJCQlsb2FkU2NyaXB0cygpOw0KCQkJCQkJfSk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCS8vIE5vIHNjcmlwdHMgYXJlIGN1cnJlbnRseSBsb2FkaW5nIHRoZW4gZXhlY3V0ZSBhbGwgcGVuZGluZyBxdWV1ZSBsb2FkZWQgY2FsbGJhY2tzDQoJCQkJaWYgKCFsb2FkaW5nKSB7DQoJCQkJCXRpbnltY2UuZWFjaChxdWV1ZUxvYWRlZENhbGxiYWNrcywgZnVuY3Rpb24oY2FsbGJhY2spIHsNCgkJCQkJCWNhbGxiYWNrLmZ1bmMuY2FsbChjYWxsYmFjay5zY29wZSk7DQoJCQkJCX0pOw0KDQoJCQkJCXF1ZXVlTG9hZGVkQ2FsbGJhY2tzLmxlbmd0aCA9IDA7DQoJCQkJfQ0KCQkJfTsNCg0KCQkJbG9hZFNjcmlwdHMoKTsNCgkJfTsNCgl9Ow0KDQoJLy8gR2xvYmFsIHNjcmlwdCBsb2FkZXINCgl0aW55bWNlLlNjcmlwdExvYWRlciA9IG5ldyB0aW55bWNlLmRvbS5TY3JpcHRMb2FkZXIoKTsNCn0pKHRpbnltY2UpOw0KDQp0aW55bWNlLmRvbS5UcmVlV2Fsa2VyID0gZnVuY3Rpb24oc3RhcnRfbm9kZSwgcm9vdF9ub2RlKSB7DQoJdmFyIG5vZGUgPSBzdGFydF9ub2RlOw0KDQoJZnVuY3Rpb24gZmluZFNpYmxpbmcobm9kZSwgc3RhcnRfbmFtZSwgc2libGluZ19uYW1lLCBzaGFsbG93KSB7DQoJCXZhciBzaWJsaW5nLCBwYXJlbnQ7DQoNCgkJaWYgKG5vZGUpIHsNCgkJCS8vIFdhbGsgaW50byBub2RlcyBpZiBpdCBoYXMgYSBzdGFydA0KCQkJaWYgKCFzaGFsbG93ICYmIG5vZGVbc3RhcnRfbmFtZV0pDQoJCQkJcmV0dXJuIG5vZGVbc3RhcnRfbmFtZV07DQoNCgkJCS8vIFJldHVybiB0aGUgc2libGluZyBpZiBpdCBoYXMgb25lDQoJCQlpZiAobm9kZSAhPSByb290X25vZGUpIHsNCgkJCQlzaWJsaW5nID0gbm9kZVtzaWJsaW5nX25hbWVdOw0KCQkJCWlmIChzaWJsaW5nKQ0KCQkJCQlyZXR1cm4gc2libGluZzsNCg0KCQkJCS8vIFdhbGsgdXAgdGhlIHBhcmVudHMgdG8gbG9vayBmb3Igc2libGluZ3MNCgkJCQlmb3IgKHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsgcGFyZW50ICYmIHBhcmVudCAhPSByb290X25vZGU7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7DQoJCQkJCXNpYmxpbmcgPSBwYXJlbnRbc2libGluZ19uYW1lXTsNCgkJCQkJaWYgKHNpYmxpbmcpDQoJCQkJCQlyZXR1cm4gc2libGluZzsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9Ow0KDQoJdGhpcy5jdXJyZW50ID0gZnVuY3Rpb24oKSB7DQoJCXJldHVybiBub2RlOw0KCX07DQoNCgl0aGlzLm5leHQgPSBmdW5jdGlvbihzaGFsbG93KSB7DQoJCXJldHVybiAobm9kZSA9IGZpbmRTaWJsaW5nKG5vZGUsICdmaXJzdENoaWxkJywgJ25leHRTaWJsaW5nJywgc2hhbGxvdykpOw0KCX07DQoNCgl0aGlzLnByZXYgPSBmdW5jdGlvbihzaGFsbG93KSB7DQoJCXJldHVybiAobm9kZSA9IGZpbmRTaWJsaW5nKG5vZGUsICdsYXN0Q2hpbGQnLCAnbGFzdFNpYmxpbmcnLCBzaGFsbG93KSk7DQoJfTsNCn07DQoNCihmdW5jdGlvbigpIHsNCgl2YXIgdHJhbnNpdGlvbmFsID0ge307DQoNCglmdW5jdGlvbiB1bnBhY2sobG9va3VwLCBkYXRhKSB7DQoJCXZhciBrZXk7DQoNCgkJZnVuY3Rpb24gcmVwbGFjZSh2YWx1ZSkgew0KCQkJcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tBLVpdKy9nLCBmdW5jdGlvbihrZXkpIHsNCgkJCQlyZXR1cm4gcmVwbGFjZShsb29rdXBba2V5XSk7DQoJCQl9KTsNCgkJfTsNCg0KCQkvLyBVbnBhY2sgbG9va3VwDQoJCWZvciAoa2V5IGluIGxvb2t1cCkgew0KCQkJaWYgKGxvb2t1cC5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KCQkJCWxvb2t1cFtrZXldID0gcmVwbGFjZShsb29rdXBba2V5XSk7DQoJCX0NCg0KCQkvLyBVbnBhY2sgYW5kIHBhcnNlIGRhdGEgaW50byBvYmplY3QgbWFwDQoJCXJlcGxhY2UoZGF0YSkucmVwbGFjZSgvIy9nLCAnI3RleHQnKS5yZXBsYWNlKC8oXHcrKVxbKFteXF1dKylcXS9nLCBmdW5jdGlvbihzdHIsIG5hbWUsIGNoaWxkcmVuKSB7DQoJCQl2YXIgaSwgbWFwID0ge307DQoNCgkJCWNoaWxkcmVuID0gY2hpbGRyZW4uc3BsaXQoL1x8Lyk7DQoNCgkJCWZvciAoaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQ0KCQkJCW1hcFtjaGlsZHJlbltpXV0gPSAxOw0KDQoJCQl0cmFuc2l0aW9uYWxbbmFtZV0gPSBtYXA7DQoJCX0pOw0KCX07DQoNCgkvLyBUaGlzIGlzIHRoZSBYSFRNTCAxLjAgdHJhbnNpdGlvbmFsIGVsZW1lbnRzIHdpdGggaXQncyBjaGlsZHJlbiBwYWNrZWQgdG8gcmVkdWNlIGl0J3Mgc2l6ZQ0KCS8vIHdlIHdpbGwgbGF0ZXIgaW5jbHVkZSB0aGUgYXR0cmlidXRlcyBoZXJlIGFuZCB1c2UgaXQgYXMgYSBkZWZhdWx0IGZvciB2YWxpZCBlbGVtZW50cyBidXQgaXQNCgkvLyByZXF1aXJlcyB1cyB0byByZXdyaXRlIHRoZSBzZXJpYWxpemVyIGVuZ2luZQ0KCXVucGFjayh7DQoJCVogOiAnI3xIfEt8TnxPfFAnLA0KCQlZIDogJyN8WHxmb3JtfFJ8UScsDQoJCVggOiAncHxUfGRpdnxVfFd8aXNpbmRleHxmaWVsZHNldHx0YWJsZScsDQoJCVcgOiAncHJlfGhyfGJsb2NrcXVvdGV8YWRkcmVzc3xjZW50ZXJ8bm9mcmFtZXMnLA0KCQlVIDogJ3VsfG9sfGRsfG1lbnV8ZGlyJywNCgkJWkMgOiAnI3xwfFl8ZGl2fFV8V3x0YWJsZXxicnxzcGFufGJkb3xvYmplY3R8YXBwbGV0fGltZ3xtYXB8S3xOfFEnLA0KCQlUIDogJ2gxfGgyfGgzfGg0fGg1fGg2JywNCgkJWkIgOiAnI3xYfFN8UScsDQoJCVMgOiAnUnxQJywNCgkJWkEgOiAnI3xhfEd8SnxNfE98UCcsDQoJCVIgOiAnI3xhfEh8S3xOfE8nLA0KCQlRIDogJ25vc2NyaXB0fFAnLA0KCQlQIDogJ2luc3xkZWx8c2NyaXB0JywNCgkJTyA6ICdpbnB1dHxzZWxlY3R8dGV4dGFyZWF8bGFiZWx8YnV0dG9uJywNCgkJTiA6ICdNfEwnLA0KCQlNIDogJ2VtfHN0cm9uZ3xkZm58Y29kZXxxfHNhbXB8a2JkfHZhcnxjaXRlfGFiYnJ8YWNyb255bScsDQoJCUwgOiAnc3VifHN1cCcsDQoJCUsgOiAnSnxJJywNCgkJSiA6ICd0dHxpfGJ8dXxzfHN0cmlrZScsDQoJCUkgOiAnYmlnfHNtYWxsfGZvbnR8YmFzZWZvbnQnLA0KCQlIIDogJ0d8RicsDQoJCUcgOiAnYnJ8c3BhbnxiZG8nLA0KCQlGIDogJ29iamVjdHxhcHBsZXR8aW1nfG1hcHxpZnJhbWUnDQoJfSwgJ3NjcmlwdFtdJyArIA0KCQknc3R5bGVbXScgKyANCgkJJ29iamVjdFsjfHBhcmFtfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdwYXJhbVtdJyArIA0KCQkncFtTXScgKyANCgkJJ2FbWl0nICsgDQoJCSdicltdJyArIA0KCQknc3BhbltTXScgKyANCgkJJ2Jkb1tTXScgKyANCgkJJ2FwcGxldFsjfHBhcmFtfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdoMVtTXScgKyANCgkJJ2ltZ1tdJyArIA0KCQknbWFwW1h8Zm9ybXxRfGFyZWFdJyArIA0KCQknaDJbU10nICsgDQoJCSdpZnJhbWVbI3xYfGZvcm18YXxIfEt8TnxPfFFdJyArIA0KCQknaDNbU10nICsgDQoJCSd0dFtTXScgKyANCgkJJ2lbU10nICsgDQoJCSdiW1NdJyArIA0KCQkndVtTXScgKyANCgkJJ3NbU10nICsgDQoJCSdzdHJpa2VbU10nICsgDQoJCSdiaWdbU10nICsgDQoJCSdzbWFsbFtTXScgKyANCgkJJ2ZvbnRbU10nICsgDQoJCSdiYXNlZm9udFtdJyArIA0KCQknZW1bU10nICsgDQoJCSdzdHJvbmdbU10nICsgDQoJCSdkZm5bU10nICsgDQoJCSdjb2RlW1NdJyArIA0KCQkncVtTXScgKyANCgkJJ3NhbXBbU10nICsgDQoJCSdrYmRbU10nICsgDQoJCSd2YXJbU10nICsgDQoJCSdjaXRlW1NdJyArIA0KCQknYWJicltTXScgKyANCgkJJ2Fjcm9ueW1bU10nICsgDQoJCSdzdWJbU10nICsgDQoJCSdzdXBbU10nICsgDQoJCSdpbnB1dFtdJyArIA0KCQknc2VsZWN0W29wdGdyb3VwfG9wdGlvbl0nICsgDQoJCSdvcHRncm91cFtvcHRpb25dJyArIA0KCQknb3B0aW9uW10nICsgDQoJCSd0ZXh0YXJlYVtdJyArIA0KCQknbGFiZWxbU10nICsgDQoJCSdidXR0b25bI3xwfFR8ZGl2fFV8V3x0YWJsZXxHfG9iamVjdHxhcHBsZXR8aW1nfG1hcHxLfE58UV0nICsgDQoJCSdoNFtTXScgKyANCgkJJ2luc1sjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdoNVtTXScgKyANCgkJJ2RlbFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdoNltTXScgKyANCgkJJ2RpdlsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSd1bFtsaV0nICsgDQoJCSdsaVsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdvbFtsaV0nICsgDQoJCSdkbFtkdHxkZF0nICsgDQoJCSdkdFtTXScgKyANCgkJJ2RkWyN8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ21lbnVbbGldJyArIA0KCQknZGlyW2xpXScgKyANCgkJJ3ByZVtaQV0nICsgDQoJCSdocltdJyArIA0KCQknYmxvY2txdW90ZVsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdhZGRyZXNzW1N8cF0nICsgDQoJCSdjZW50ZXJbI3xYfGZvcm18YXxIfEt8TnxPfFFdJyArIA0KCQknbm9mcmFtZXNbI3xYfGZvcm18YXxIfEt8TnxPfFFdJyArIA0KCQknaXNpbmRleFtdJyArIA0KCQknZmllbGRzZXRbI3xsZWdlbmR8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ2xlZ2VuZFtTXScgKyANCgkJJ3RhYmxlW2NhcHRpb258Y29sfGNvbGdyb3VwfHRoZWFkfHRmb290fHRib2R5fHRyXScgKyANCgkJJ2NhcHRpb25bU10nICsgDQoJCSdjb2xbXScgKyANCgkJJ2NvbGdyb3VwW2NvbF0nICsgDQoJCSd0aGVhZFt0cl0nICsgDQoJCSd0clt0aHx0ZF0nICsgDQoJCSd0aFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdmb3JtWyN8WHxhfEh8S3xOfE98UV0nICsgDQoJCSdub3NjcmlwdFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSd0ZFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSd0Zm9vdFt0cl0nICsgDQoJCSd0Ym9keVt0cl0nICsgDQoJCSdhcmVhW10nICsgDQoJCSdiYXNlW10nICsgDQoJCSdib2R5WyN8WHxmb3JtfGF8SHxLfE58T3xRXScNCgkpOw0KDQoJdGlueW1jZS5kb20uU2NoZW1hID0gZnVuY3Rpb24oKSB7DQoJCXZhciB0ID0gdGhpcywgZWxlbWVudHMgPSB0cmFuc2l0aW9uYWw7DQoNCgkJdC5pc1ZhbGlkID0gZnVuY3Rpb24obmFtZSwgY2hpbGRfbmFtZSkgew0KCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tuYW1lXTsNCg0KCQkJcmV0dXJuICEhKGVsZW1lbnQgJiYgKCFjaGlsZF9uYW1lIHx8IGVsZW1lbnRbY2hpbGRfbmFtZV0pKTsNCgkJfTsNCgl9Ow0KfSkoKTsNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdGlueW1jZS5kb20uUmFuZ2VVdGlscyA9IGZ1bmN0aW9uKGRvbSkgew0KCQl2YXIgSU5WSVNJQkxFX0NIQVIgPSAnXHVGRUZGJzsNCg0KCQl0aGlzLndhbGsgPSBmdW5jdGlvbihybmcsIGNhbGxiYWNrKSB7DQoJCQl2YXIgc3RhcnRDb250YWluZXIgPSBybmcuc3RhcnRDb250YWluZXIsDQoJCQkJc3RhcnRPZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQsDQoJCQkJZW5kQ29udGFpbmVyID0gcm5nLmVuZENvbnRhaW5lciwNCgkJCQllbmRPZmZzZXQgPSBybmcuZW5kT2Zmc2V0LA0KCQkJCWFuY2VzdG9yLCBzdGFydFBvaW50LA0KCQkJCWVuZFBvaW50LCBub2RlLCBwYXJlbnQsIHNpYmxpbmdzLCBub2RlczsNCg0KCQkJLy8gSGFuZGxlIHRhYmxlIGNlbGwgc2VsZWN0aW9uIHRoZSB0YWJsZSBwbHVnaW4gZW5hYmxlcw0KCQkJLy8geW91IHRvIGZha2Ugc2VsZWN0IHRhYmxlIGNlbGxzIGFuZCBwZXJmb3JtIGZvcm1hdHRpbmcgYWN0aW9ucyBvbiB0aGVtDQoJCQlub2RlcyA9IGRvbS5zZWxlY3QoJ3RkLm1jZVNlbGVjdGVkLHRoLm1jZVNlbGVjdGVkJyk7DQoJCQlpZiAobm9kZXMubGVuZ3RoID4gMCkgew0KCQkJCXRpbnltY2UuZWFjaChub2RlcywgZnVuY3Rpb24obm9kZSkgew0KCQkJCQljYWxsYmFjayhbbm9kZV0pOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQlmdW5jdGlvbiBjb2xsZWN0U2libGluZ3Mobm9kZSwgbmFtZSwgZW5kX25vZGUpIHsNCgkJCQl2YXIgc2libGluZ3MgPSBbXTsNCg0KCQkJCWZvciAoOyBub2RlICYmIG5vZGUgIT0gZW5kX25vZGU7IG5vZGUgPSBub2RlW25hbWVdKQ0KCQkJCQlzaWJsaW5ncy5wdXNoKG5vZGUpOw0KDQoJCQkJcmV0dXJuIHNpYmxpbmdzOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gZmluZEVuZFBvaW50KG5vZGUsIHJvb3QpIHsNCgkJCQlkbyB7DQoJCQkJCWlmIChub2RlLnBhcmVudE5vZGUgPT0gcm9vdCkNCgkJCQkJCXJldHVybiBub2RlOw0KDQoJCQkJCW5vZGUgPSBub2RlLnBhcmVudE5vZGU7DQoJCQkJfSB3aGlsZShub2RlKTsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHdhbGtCb3VuZGFyeShzdGFydF9ub2RlLCBlbmRfbm9kZSwgbmV4dCkgew0KCQkJCXZhciBzaWJsaW5nTmFtZSA9IG5leHQgPyAnbmV4dFNpYmxpbmcnIDogJ3ByZXZpb3VzU2libGluZyc7DQoNCgkJCQlmb3IgKG5vZGUgPSBzdGFydF9ub2RlLCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7IG5vZGUgJiYgbm9kZSAhPSBlbmRfbm9kZTsgbm9kZSA9IHBhcmVudCkgew0KCQkJCQlwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7DQoJCQkJCXNpYmxpbmdzID0gY29sbGVjdFNpYmxpbmdzKG5vZGUgPT0gc3RhcnRfbm9kZSA/IG5vZGUgOiBub2RlW3NpYmxpbmdOYW1lXSwgc2libGluZ05hbWUpOw0KDQoJCQkJCWlmIChzaWJsaW5ncy5sZW5ndGgpIHsNCgkJCQkJCWlmICghbmV4dCkNCgkJCQkJCQlzaWJsaW5ncy5yZXZlcnNlKCk7DQoNCgkJCQkJCWNhbGxiYWNrKHNpYmxpbmdzKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX07DQoNCgkJCS8vIElmIGluZGV4IGJhc2VkIHN0YXJ0IHBvc2l0aW9uIHRoZW4gcmVzb2x2ZSBpdA0KCQkJaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDEgJiYgc3RhcnRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCXN0YXJ0Q29udGFpbmVyID0gc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tzdGFydE9mZnNldF07DQoNCgkJCS8vIElmIGluZGV4IGJhc2VkIGVuZCBwb3NpdGlvbiB0aGVuIHJlc29sdmUgaXQNCgkJCWlmIChlbmRDb250YWluZXIubm9kZVR5cGUgPT0gMSAmJiBlbmRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCWVuZENvbnRhaW5lciA9IGVuZENvbnRhaW5lci5jaGlsZE5vZGVzW01hdGgubWluKHN0YXJ0T2Zmc2V0ID09IGVuZE9mZnNldCA/IGVuZE9mZnNldCA6IGVuZE9mZnNldCAtIDEsIGVuZENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCAtIDEpXTsNCg0KCQkJLy8gRmluZCBjb21tb24gYW5jZXN0b3IgYW5kIGVuZCBwb2ludHMNCgkJCWFuY2VzdG9yID0gZG9tLmZpbmRDb21tb25BbmNlc3RvcihzdGFydENvbnRhaW5lciwgZW5kQ29udGFpbmVyKTsNCg0KCQkJLy8gU2FtZSBjb250YWluZXINCgkJCWlmIChzdGFydENvbnRhaW5lciA9PSBlbmRDb250YWluZXIpDQoJCQkJcmV0dXJuIGNhbGxiYWNrKFtzdGFydENvbnRhaW5lcl0pOw0KDQoJCQkvLyBQcm9jZXNzIGxlZnQgc2lkZQ0KCQkJZm9yIChub2RlID0gc3RhcnRDb250YWluZXI7IG5vZGU7IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpIHsNCgkJCQlpZiAobm9kZSA9PSBlbmRDb250YWluZXIpDQoJCQkJCXJldHVybiB3YWxrQm91bmRhcnkoc3RhcnRDb250YWluZXIsIGFuY2VzdG9yLCB0cnVlKTsNCg0KCQkJCWlmIChub2RlID09IGFuY2VzdG9yKQ0KCQkJCQlicmVhazsNCgkJCX0NCg0KCQkJLy8gUHJvY2VzcyByaWdodCBzaWRlDQoJCQlmb3IgKG5vZGUgPSBlbmRDb250YWluZXI7IG5vZGU7IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpIHsNCgkJCQlpZiAobm9kZSA9PSBzdGFydENvbnRhaW5lcikNCgkJCQkJcmV0dXJuIHdhbGtCb3VuZGFyeShlbmRDb250YWluZXIsIGFuY2VzdG9yKTsNCg0KCQkJCWlmIChub2RlID09IGFuY2VzdG9yKQ0KCQkJCQlicmVhazsNCgkJCX0NCg0KCQkJLy8gRmluZCBzdGFydC9lbmQgcG9pbnQNCgkJCXN0YXJ0UG9pbnQgPSBmaW5kRW5kUG9pbnQoc3RhcnRDb250YWluZXIsIGFuY2VzdG9yKSB8fCBzdGFydENvbnRhaW5lcjsNCgkJCWVuZFBvaW50ID0gZmluZEVuZFBvaW50KGVuZENvbnRhaW5lciwgYW5jZXN0b3IpIHx8IGVuZENvbnRhaW5lcjsNCg0KCQkJLy8gV2FsayBsZWZ0IGxlYWYNCgkJCXdhbGtCb3VuZGFyeShzdGFydENvbnRhaW5lciwgc3RhcnRQb2ludCwgdHJ1ZSk7DQoNCgkJCS8vIFdhbGsgdGhlIG1pZGRsZSBmcm9tIHN0YXJ0IHRvIGVuZCBwb2ludA0KCQkJc2libGluZ3MgPSBjb2xsZWN0U2libGluZ3MoDQoJCQkJc3RhcnRQb2ludCA9PSBzdGFydENvbnRhaW5lciA/IHN0YXJ0UG9pbnQgOiBzdGFydFBvaW50Lm5leHRTaWJsaW5nLA0KCQkJCSduZXh0U2libGluZycsDQoJCQkJZW5kUG9pbnQgPT0gZW5kQ29udGFpbmVyID8gZW5kUG9pbnQubmV4dFNpYmxpbmcgOiBlbmRQb2ludA0KCQkJKTsNCg0KCQkJaWYgKHNpYmxpbmdzLmxlbmd0aCkNCgkJCQljYWxsYmFjayhzaWJsaW5ncyk7DQoNCgkJCS8vIFdhbGsgcmlnaHQgbGVhZg0KCQkJd2Fsa0JvdW5kYXJ5KGVuZENvbnRhaW5lciwgZW5kUG9pbnQpOw0KCQl9Ow0KDQoJCS8qCQl0aGlzLnNwbGl0ID0gZnVuY3Rpb24ocm5nKSB7DQoJCQl2YXIgc3RhcnRDb250YWluZXIgPSBybmcuc3RhcnRDb250YWluZXIsDQoJCQkJc3RhcnRPZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQsDQoJCQkJZW5kQ29udGFpbmVyID0gcm5nLmVuZENvbnRhaW5lciwNCgkJCQllbmRPZmZzZXQgPSBybmcuZW5kT2Zmc2V0Ow0KDQoJCQlmdW5jdGlvbiBzcGxpdFRleHQobm9kZSwgb2Zmc2V0KSB7DQoJCQkJaWYgKG9mZnNldCA9PSBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpDQoJCQkJCW5vZGUuYXBwZW5kRGF0YShJTlZJU0lCTEVfQ0hBUik7DQoNCgkJCQlub2RlID0gbm9kZS5zcGxpdFRleHQob2Zmc2V0KTsNCg0KCQkJCWlmIChub2RlLm5vZGVWYWx1ZSA9PT0gSU5WSVNJQkxFX0NIQVIpDQoJCQkJCW5vZGUubm9kZVZhbHVlID0gJyc7DQoNCgkJCQlyZXR1cm4gbm9kZTsNCgkJCX07DQoNCgkJCS8vIEhhbmRsZSBzaW5nbGUgdGV4dCBub2RlDQoJCQlpZiAoc3RhcnRDb250YWluZXIgPT0gZW5kQ29udGFpbmVyKSB7DQoJCQkJaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDMpIHsNCgkJCQkJaWYgKHN0YXJ0T2Zmc2V0ICE9IDApDQoJCQkJCQlzdGFydENvbnRhaW5lciA9IGVuZENvbnRhaW5lciA9IHNwbGl0VGV4dChzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQpOw0KDQoJCQkJCWlmIChlbmRPZmZzZXQgLSBzdGFydE9mZnNldCAhPSBzdGFydENvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoKQ0KCQkJCQkJc3BsaXRUZXh0KHN0YXJ0Q29udGFpbmVyLCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkvLyBTcGxpdCBzdGFydENvbnRhaW5lciB0ZXh0IG5vZGUgaWYgbmVlZGVkDQoJCQkJaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDMgJiYgc3RhcnRPZmZzZXQgIT0gMCkgew0KCQkJCQlzdGFydENvbnRhaW5lciA9IHNwbGl0VGV4dChzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQpOw0KCQkJCQlzdGFydE9mZnNldCA9IDA7DQoJCQkJfQ0KDQoJCQkJLy8gU3BsaXQgZW5kQ29udGFpbmVyIHRleHQgbm9kZSBpZiBuZWVkZWQNCgkJCQlpZiAoZW5kQ29udGFpbmVyLm5vZGVUeXBlID09IDMgJiYgZW5kT2Zmc2V0ICE9IGVuZENvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoKSB7DQoJCQkJCWVuZENvbnRhaW5lciA9IHNwbGl0VGV4dChlbmRDb250YWluZXIsIGVuZE9mZnNldCkucHJldmlvdXNTaWJsaW5nOw0KCQkJCQllbmRPZmZzZXQgPSBlbmRDb250YWluZXIubm9kZVZhbHVlLmxlbmd0aDsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiB7DQoJCQkJc3RhcnRDb250YWluZXIgOiBzdGFydENvbnRhaW5lciwNCgkJCQlzdGFydE9mZnNldCA6IHN0YXJ0T2Zmc2V0LA0KCQkJCWVuZENvbnRhaW5lciA6IGVuZENvbnRhaW5lciwNCgkJCQllbmRPZmZzZXQgOiBlbmRPZmZzZXQNCgkJCX07DQoJCX07DQoqLw0KCX07DQoNCgl0aW55bWNlLmRvbS5SYW5nZVV0aWxzLmNvbXBhcmVSYW5nZXMgPSBmdW5jdGlvbihybmcxLCBybmcyKSB7DQoJCWlmIChybmcxICYmIHJuZzIpIHsNCgkJCS8vIENvbXBhcmUgbmF0aXZlIElFIHJhbmdlcw0KCQkJaWYgKHJuZzEuaXRlbSB8fCBybmcxLmR1cGxpY2F0ZSkgew0KCQkJCS8vIEJvdGggYXJlIGNvbnRyb2wgcmFuZ2VzIGFuZCB0aGUgc2VsZWN0ZWQgZWxlbWVudCBtYXRjaGVzDQoJCQkJaWYgKHJuZzEuaXRlbSAmJiBybmcyLml0ZW0gJiYgcm5nMS5pdGVtKDApID09PSBybmcyLml0ZW0oMCkpDQoJCQkJCXJldHVybiB0cnVlOw0KDQoJCQkJLy8gQm90aCBhcmUgdGV4dCByYW5nZXMgYW5kIHRoZSByYW5nZSBtYXRjaGVzDQoJCQkJaWYgKHJuZzEuaXNFcXVhbCAmJiBybmcyLmlzRXF1YWwgJiYgcm5nMi5pc0VxdWFsKHJuZzEpKQ0KCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0gZWxzZSB7DQoJCQkJLy8gQ29tcGFyZSB3M2MgcmFuZ2VzDQoJCQkJcmV0dXJuIHJuZzEuc3RhcnRDb250YWluZXIgPT0gcm5nMi5zdGFydENvbnRhaW5lciAmJiBybmcxLnN0YXJ0T2Zmc2V0ID09IHJuZzIuc3RhcnRPZmZzZXQ7DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gZmFsc2U7DQoJfTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIFNob3J0ZW4gY2xhc3MgbmFtZXMNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIGlzID0gdGlueW1jZS5pczsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLkNvbnRyb2wnLCB7DQoJCUNvbnRyb2wgOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5pZCA9IGlkOw0KCQkJdGhpcy5zZXR0aW5ncyA9IHMgPSBzIHx8IHt9Ow0KCQkJdGhpcy5yZW5kZXJlZCA9IGZhbHNlOw0KCQkJdGhpcy5vblJlbmRlciA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTsNCgkJCXRoaXMuY2xhc3NQcmVmaXggPSAnJzsNCgkJCXRoaXMuc2NvcGUgPSBzLnNjb3BlIHx8IHRoaXM7DQoJCQl0aGlzLmRpc2FibGVkID0gMDsNCgkJCXRoaXMuYWN0aXZlID0gMDsNCgkJfSwNCg0KCQlzZXREaXNhYmxlZCA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciBlOw0KDQoJCQlpZiAocyAhPSB0aGlzLmRpc2FibGVkKSB7DQoJCQkJZSA9IERPTS5nZXQodGhpcy5pZCk7DQoNCgkJCQkvLyBBZGQgYWNjZXNzaWJpbGl0eSB0aXRsZSBmb3IgdW5hdmFpbGFibGUgYWN0aW9ucw0KCQkJCWlmIChlICYmIHRoaXMuc2V0dGluZ3MudW5hdmFpbGFibGVfcHJlZml4KSB7DQoJCQkJCWlmIChzKSB7DQoJCQkJCQl0aGlzLnByZXZUaXRsZSA9IGUudGl0bGU7DQoJCQkJCQllLnRpdGxlID0gdGhpcy5zZXR0aW5ncy51bmF2YWlsYWJsZV9wcmVmaXggKyAiOiAiICsgZS50aXRsZTsNCgkJCQkJfSBlbHNlDQoJCQkJCQllLnRpdGxlID0gdGhpcy5wcmV2VGl0bGU7DQoJCQkJfQ0KDQoJCQkJdGhpcy5zZXRTdGF0ZSgnRGlzYWJsZWQnLCBzKTsNCgkJCQl0aGlzLnNldFN0YXRlKCdFbmFibGVkJywgIXMpOw0KCQkJCXRoaXMuZGlzYWJsZWQgPSBzOw0KCQkJfQ0KCQl9LA0KDQoJCWlzRGlzYWJsZWQgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLmRpc2FibGVkOw0KCQl9LA0KDQoJCXNldEFjdGl2ZSA6IGZ1bmN0aW9uKHMpIHsNCgkJCWlmIChzICE9IHRoaXMuYWN0aXZlKSB7DQoJCQkJdGhpcy5zZXRTdGF0ZSgnQWN0aXZlJywgcyk7DQoJCQkJdGhpcy5hY3RpdmUgPSBzOw0KCQkJfQ0KCQl9LA0KDQoJCWlzQWN0aXZlIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5hY3RpdmU7DQoJCX0sDQoNCgkJc2V0U3RhdGUgOiBmdW5jdGlvbihjLCBzKSB7DQoJCQl2YXIgbiA9IERPTS5nZXQodGhpcy5pZCk7DQoNCgkJCWMgPSB0aGlzLmNsYXNzUHJlZml4ICsgYzsNCg0KCQkJaWYgKHMpDQoJCQkJRE9NLmFkZENsYXNzKG4sIGMpOw0KCQkJZWxzZQ0KCQkJCURPTS5yZW1vdmVDbGFzcyhuLCBjKTsNCgkJfSwNCg0KCQlpc1JlbmRlcmVkIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5yZW5kZXJlZDsNCgkJfSwNCg0KCQlyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCX0sDQoNCgkJcmVuZGVyVG8gOiBmdW5jdGlvbihuKSB7DQoJCQlET00uc2V0SFRNTChuLCB0aGlzLnJlbmRlckhUTUwoKSk7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBiOw0KDQoJCQkvLyBTZXQgcGVuZGluZyBzdGF0ZXMNCgkJCWlmIChpcyh0LmRpc2FibGVkKSkgew0KCQkJCWIgPSB0LmRpc2FibGVkOw0KCQkJCXQuZGlzYWJsZWQgPSAtMTsNCgkJCQl0LnNldERpc2FibGVkKGIpOw0KCQkJfQ0KDQoJCQlpZiAoaXModC5hY3RpdmUpKSB7DQoJCQkJYiA9IHQuYWN0aXZlOw0KCQkJCXQuYWN0aXZlID0gLTE7DQoJCQkJdC5zZXRBY3RpdmUoYik7DQoJCQl9DQoJCX0sDQoNCgkJcmVtb3ZlIDogZnVuY3Rpb24oKSB7DQoJCQlET00ucmVtb3ZlKHRoaXMuaWQpOw0KCQkJdGhpcy5kZXN0cm95KCk7DQoJCX0sDQoNCgkJZGVzdHJveSA6IGZ1bmN0aW9uKCkgew0KCQkJdGlueW1jZS5kb20uRXZlbnQuY2xlYXIodGhpcy5pZCk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuQ29udGFpbmVyOnRpbnltY2UudWkuQ29udHJvbCcsIHsNCglDb250YWluZXIgOiBmdW5jdGlvbihpZCwgcykgew0KCQl0aGlzLnBhcmVudChpZCwgcyk7DQoNCgkJdGhpcy5jb250cm9scyA9IFtdOw0KDQoJCXRoaXMubG9va3VwID0ge307DQoJfSwNCg0KCWFkZCA6IGZ1bmN0aW9uKGMpIHsNCgkJdGhpcy5sb29rdXBbYy5pZF0gPSBjOw0KCQl0aGlzLmNvbnRyb2xzLnB1c2goYyk7DQoNCgkJcmV0dXJuIGM7DQoJfSwNCg0KCWdldCA6IGZ1bmN0aW9uKG4pIHsNCgkJcmV0dXJuIHRoaXMubG9va3VwW25dOw0KCX0NCn0pOw0KDQoNCnRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLlNlcGFyYXRvcjp0aW55bWNlLnVpLkNvbnRyb2wnLCB7DQoJU2VwYXJhdG9yIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQl0aGlzLmNsYXNzUHJlZml4ID0gJ21jZVNlcGFyYXRvcic7DQoJfSwNCg0KCXJlbmRlckhUTUwgOiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIHRpbnltY2UuRE9NLmNyZWF0ZUhUTUwoJ3NwYW4nLCB7J2NsYXNzJyA6IHRoaXMuY2xhc3NQcmVmaXh9KTsNCgl9DQp9KTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgaXMgPSB0aW55bWNlLmlzLCBET00gPSB0aW55bWNlLkRPTSwgZWFjaCA9IHRpbnltY2UuZWFjaCwgd2FsayA9IHRpbnltY2Uud2FsazsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLk1lbnVJdGVtOnRpbnltY2UudWkuQ29udHJvbCcsIHsNCgkJTWVudUl0ZW0gOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQkJdGhpcy5jbGFzc1ByZWZpeCA9ICdtY2VNZW51SXRlbSc7DQoJCX0sDQoNCgkJc2V0U2VsZWN0ZWQgOiBmdW5jdGlvbihzKSB7DQoJCQl0aGlzLnNldFN0YXRlKCdTZWxlY3RlZCcsIHMpOw0KCQkJdGhpcy5zZWxlY3RlZCA9IHM7DQoJCX0sDQoNCgkJaXNTZWxlY3RlZCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KCQkJDQoJCQl0LnBhcmVudCgpOw0KDQoJCQkvLyBTZXQgcGVuZGluZyBzdGF0ZQ0KCQkJaWYgKGlzKHQuc2VsZWN0ZWQpKQ0KCQkJCXQuc2V0U2VsZWN0ZWQodC5zZWxlY3RlZCk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBpcyA9IHRpbnltY2UuaXMsIERPTSA9IHRpbnltY2UuRE9NLCBlYWNoID0gdGlueW1jZS5lYWNoLCB3YWxrID0gdGlueW1jZS53YWxrOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuTWVudTp0aW55bWNlLnVpLk1lbnVJdGVtJywgew0KCQlNZW51IDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5wYXJlbnQoaWQsIHMpOw0KCQkJdC5pdGVtcyA9IHt9Ow0KCQkJdC5jb2xsYXBzZWQgPSBmYWxzZTsNCgkJCXQubWVudUNvdW50ID0gMDsNCgkJCXQub25BZGRJdGVtID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpOw0KCQl9LA0KDQoJCWV4cGFuZCA6IGZ1bmN0aW9uKGQpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKGQpIHsNCgkJCQl3YWxrKHQsIGZ1bmN0aW9uKG8pIHsNCgkJCQkJaWYgKG8uZXhwYW5kKQ0KCQkJCQkJby5leHBhbmQoKTsNCgkJCQl9LCAnaXRlbXMnLCB0KTsNCgkJCX0NCg0KCQkJdC5jb2xsYXBzZWQgPSBmYWxzZTsNCgkJfSwNCg0KCQljb2xsYXBzZSA6IGZ1bmN0aW9uKGQpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKGQpIHsNCgkJCQl3YWxrKHQsIGZ1bmN0aW9uKG8pIHsNCgkJCQkJaWYgKG8uY29sbGFwc2UpDQoJCQkJCQlvLmNvbGxhcHNlKCk7DQoJCQkJfSwgJ2l0ZW1zJywgdCk7DQoJCQl9DQoNCgkJCXQuY29sbGFwc2VkID0gdHJ1ZTsNCgkJfSwNCg0KCQlpc0NvbGxhcHNlZCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuY29sbGFwc2VkOw0KCQl9LA0KDQoJCWFkZCA6IGZ1bmN0aW9uKG8pIHsNCgkJCWlmICghby5zZXR0aW5ncykNCgkJCQlvID0gbmV3IHRpbnltY2UudWkuTWVudUl0ZW0oby5pZCB8fCBET00udW5pcXVlSWQoKSwgbyk7DQoNCgkJCXRoaXMub25BZGRJdGVtLmRpc3BhdGNoKHRoaXMsIG8pOw0KDQoJCQlyZXR1cm4gdGhpcy5pdGVtc1tvLmlkXSA9IG87DQoJCX0sDQoNCgkJYWRkU2VwYXJhdG9yIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5hZGQoe3NlcGFyYXRvciA6IHRydWV9KTsNCgkJfSwNCg0KCQlhZGRNZW51IDogZnVuY3Rpb24obykgew0KCQkJaWYgKCFvLmNvbGxhcHNlKQ0KCQkJCW8gPSB0aGlzLmNyZWF0ZU1lbnUobyk7DQoNCgkJCXRoaXMubWVudUNvdW50Kys7DQoNCgkJCXJldHVybiB0aGlzLmFkZChvKTsNCgkJfSwNCg0KCQloYXNNZW51cyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMubWVudUNvdW50ICE9PSAwOw0KCQl9LA0KDQoJCXJlbW92ZSA6IGZ1bmN0aW9uKG8pIHsNCgkJCWRlbGV0ZSB0aGlzLml0ZW1zW28uaWRdOw0KCQl9LA0KDQoJCXJlbW92ZUFsbCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl3YWxrKHQsIGZ1bmN0aW9uKG8pIHsNCgkJCQlpZiAoby5yZW1vdmVBbGwpDQoJCQkJCW8ucmVtb3ZlQWxsKCk7DQoJCQkJZWxzZQ0KCQkJCQlvLnJlbW92ZSgpOw0KDQoJCQkJby5kZXN0cm95KCk7DQoJCQl9LCAnaXRlbXMnLCB0KTsNCg0KCQkJdC5pdGVtcyA9IHt9Ow0KCQl9LA0KDQoJCWNyZWF0ZU1lbnUgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgbSA9IG5ldyB0aW55bWNlLnVpLk1lbnUoby5pZCB8fCBET00udW5pcXVlSWQoKSwgbyk7DQoNCgkJCW0ub25BZGRJdGVtLmFkZCh0aGlzLm9uQWRkSXRlbS5kaXNwYXRjaCwgdGhpcy5vbkFkZEl0ZW0pOw0KDQoJCQlyZXR1cm4gbTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBpcyA9IHRpbnltY2UuaXMsIERPTSA9IHRpbnltY2UuRE9NLCBlYWNoID0gdGlueW1jZS5lYWNoLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBFbGVtZW50ID0gdGlueW1jZS5kb20uRWxlbWVudDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLkRyb3BNZW51OnRpbnltY2UudWkuTWVudScsIHsNCgkJRHJvcE1lbnUgOiBmdW5jdGlvbihpZCwgcykgew0KCQkJcyA9IHMgfHwge307DQoJCQlzLmNvbnRhaW5lciA9IHMuY29udGFpbmVyIHx8IERPTS5kb2MuYm9keTsNCgkJCXMub2Zmc2V0X3ggPSBzLm9mZnNldF94IHx8IDA7DQoJCQlzLm9mZnNldF95ID0gcy5vZmZzZXRfeSB8fCAwOw0KCQkJcy52cF9vZmZzZXRfeCA9IHMudnBfb2Zmc2V0X3ggfHwgMDsNCgkJCXMudnBfb2Zmc2V0X3kgPSBzLnZwX29mZnNldF95IHx8IDA7DQoNCgkJCWlmIChpcyhzLmljb25zKSAmJiAhcy5pY29ucykNCgkJCQlzWydjbGFzcyddICs9ICcgbWNlTm9JY29ucyc7DQoNCgkJCXRoaXMucGFyZW50KGlkLCBzKTsNCgkJCXRoaXMub25TaG93TWVudSA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTsNCgkJCXRoaXMub25IaWRlTWVudSA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTsNCgkJCXRoaXMuY2xhc3NQcmVmaXggPSAnbWNlTWVudSc7DQoJCX0sDQoNCgkJY3JlYXRlTWVudSA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgY3MgPSB0LnNldHRpbmdzLCBtOw0KDQoJCQlzLmNvbnRhaW5lciA9IHMuY29udGFpbmVyIHx8IGNzLmNvbnRhaW5lcjsNCgkJCXMucGFyZW50ID0gdDsNCgkJCXMuY29uc3RyYWluID0gcy5jb25zdHJhaW4gfHwgY3MuY29uc3RyYWluOw0KCQkJc1snY2xhc3MnXSA9IHNbJ2NsYXNzJ10gfHwgY3NbJ2NsYXNzJ107DQoJCQlzLnZwX29mZnNldF94ID0gcy52cF9vZmZzZXRfeCB8fCBjcy52cF9vZmZzZXRfeDsNCgkJCXMudnBfb2Zmc2V0X3kgPSBzLnZwX29mZnNldF95IHx8IGNzLnZwX29mZnNldF95Ow0KCQkJbSA9IG5ldyB0aW55bWNlLnVpLkRyb3BNZW51KHMuaWQgfHwgRE9NLnVuaXF1ZUlkKCksIHMpOw0KDQoJCQltLm9uQWRkSXRlbS5hZGQodC5vbkFkZEl0ZW0uZGlzcGF0Y2gsIHQub25BZGRJdGVtKTsNCg0KCQkJcmV0dXJuIG07DQoJCX0sDQoNCgkJdXBkYXRlIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCB0YiA9IERPTS5nZXQoJ21lbnVfJyArIHQuaWQgKyAnX3RibCcpLCBjbyA9IERPTS5nZXQoJ21lbnVfJyArIHQuaWQgKyAnX2NvJyksIHR3LCB0aDsNCg0KCQkJdHcgPSBzLm1heF93aWR0aCA/IE1hdGgubWluKHRiLmNsaWVudFdpZHRoLCBzLm1heF93aWR0aCkgOiB0Yi5jbGllbnRXaWR0aDsNCgkJCXRoID0gcy5tYXhfaGVpZ2h0ID8gTWF0aC5taW4odGIuY2xpZW50SGVpZ2h0LCBzLm1heF9oZWlnaHQpIDogdGIuY2xpZW50SGVpZ2h0Ow0KDQoJCQlpZiAoIURPTS5ib3hNb2RlbCkNCgkJCQl0LmVsZW1lbnQuc2V0U3R5bGVzKHt3aWR0aCA6IHR3ICsgMiwgaGVpZ2h0IDogdGggKyAyfSk7DQoJCQllbHNlDQoJCQkJdC5lbGVtZW50LnNldFN0eWxlcyh7d2lkdGggOiB0dywgaGVpZ2h0IDogdGh9KTsNCg0KCQkJaWYgKHMubWF4X3dpZHRoKQ0KCQkJCURPTS5zZXRTdHlsZShjbywgJ3dpZHRoJywgdHcpOw0KDQoJCQlpZiAocy5tYXhfaGVpZ2h0KSB7DQoJCQkJRE9NLnNldFN0eWxlKGNvLCAnaGVpZ2h0JywgdGgpOw0KDQoJCQkJaWYgKHRiLmNsaWVudEhlaWdodCA8IHMubWF4X2hlaWdodCkNCgkJCQkJRE9NLnNldFN0eWxlKGNvLCAnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7DQoJCQl9DQoJCX0sDQoNCgkJc2hvd01lbnUgOiBmdW5jdGlvbih4LCB5LCBweCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgY28sIHZwID0gRE9NLmdldFZpZXdQb3J0KCksIHcsIGgsIG14LCBteSwgb3QgPSAyLCBkbSwgdGIsIGNwID0gdC5jbGFzc1ByZWZpeDsNCg0KCQkJdC5jb2xsYXBzZSgxKTsNCg0KCQkJaWYgKHQuaXNNZW51VmlzaWJsZSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICghdC5yZW5kZXJlZCkgew0KCQkJCWNvID0gRE9NLmFkZCh0LnNldHRpbmdzLmNvbnRhaW5lciwgdC5yZW5kZXJOb2RlKCkpOw0KDQoJCQkJZWFjaCh0Lml0ZW1zLCBmdW5jdGlvbihvKSB7DQoJCQkJCW8ucG9zdFJlbmRlcigpOw0KCQkJCX0pOw0KDQoJCQkJdC5lbGVtZW50ID0gbmV3IEVsZW1lbnQoJ21lbnVfJyArIHQuaWQsIHtibG9ja2VyIDogMSwgY29udGFpbmVyIDogcy5jb250YWluZXJ9KTsNCgkJCX0gZWxzZQ0KCQkJCWNvID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCk7DQoNCgkJCS8vIE1vdmUgbGF5ZXIgb3V0IG9mIHNpZ2h0IHVubGVzcyBpdCdzIE9wZXJhIHNpbmNlIGl0IHNjcm9sbHMgdG8gdG9wIG9mIHBhZ2UgZHVlIHRvIGFuIGJ1Zw0KCQkJaWYgKCF0aW55bWNlLmlzT3BlcmEpDQoJCQkJRE9NLnNldFN0eWxlcyhjbywge2xlZnQgOiAtMHhGRkZGICwgdG9wIDogLTB4RkZGRn0pOw0KDQoJCQlET00uc2hvdyhjbyk7DQoJCQl0LnVwZGF0ZSgpOw0KDQoJCQl4ICs9IHMub2Zmc2V0X3ggfHwgMDsNCgkJCXkgKz0gcy5vZmZzZXRfeSB8fCAwOw0KCQkJdnAudyAtPSA0Ow0KCQkJdnAuaCAtPSA0Ow0KDQoJCQkvLyBNb3ZlIGluc2lkZSB2aWV3cG9ydCBpZiBub3Qgc3VibWVudQ0KCQkJaWYgKHMuY29uc3RyYWluKSB7DQoJCQkJdyA9IGNvLmNsaWVudFdpZHRoIC0gb3Q7DQoJCQkJaCA9IGNvLmNsaWVudEhlaWdodCAtIG90Ow0KCQkJCW14ID0gdnAueCArIHZwLnc7DQoJCQkJbXkgPSB2cC55ICsgdnAuaDsNCg0KCQkJCWlmICgoeCArIHMudnBfb2Zmc2V0X3ggKyB3KSA+IG14KQ0KCQkJCQl4ID0gcHggPyBweCAtIHcgOiBNYXRoLm1heCgwLCAobXggLSBzLnZwX29mZnNldF94KSAtIHcpOw0KDQoJCQkJaWYgKCh5ICsgcy52cF9vZmZzZXRfeSArIGgpID4gbXkpDQoJCQkJCXkgPSBNYXRoLm1heCgwLCAobXkgLSBzLnZwX29mZnNldF95KSAtIGgpOw0KCQkJfQ0KDQoJCQlET00uc2V0U3R5bGVzKGNvLCB7bGVmdCA6IHggLCB0b3AgOiB5fSk7DQoJCQl0LmVsZW1lbnQudXBkYXRlKCk7DQoNCgkJCXQuaXNNZW51VmlzaWJsZSA9IDE7DQoJCQl0Lm1vdXNlQ2xpY2tGdW5jID0gRXZlbnQuYWRkKGNvLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIG07DQoNCgkJCQllID0gZS50YXJnZXQ7DQoNCgkJCQlpZiAoZSAmJiAoZSA9IERPTS5nZXRQYXJlbnQoZSwgJ3RyJykpICYmICFET00uaGFzQ2xhc3MoZSwgY3AgKyAnSXRlbVN1YicpKSB7DQoJCQkJCW0gPSB0Lml0ZW1zW2UuaWRdOw0KDQoJCQkJCWlmIChtLmlzRGlzYWJsZWQoKSkNCgkJCQkJCXJldHVybjsNCg0KCQkJCQlkbSA9IHQ7DQoNCgkJCQkJd2hpbGUgKGRtKSB7DQoJCQkJCQlpZiAoZG0uaGlkZU1lbnUpDQoJCQkJCQkJZG0uaGlkZU1lbnUoKTsNCg0KCQkJCQkJZG0gPSBkbS5zZXR0aW5ncy5wYXJlbnQ7DQoJCQkJCX0NCg0KCQkJCQlpZiAobS5zZXR0aW5ncy5vbmNsaWNrKQ0KCQkJCQkJbS5zZXR0aW5ncy5vbmNsaWNrKGUpOw0KDQoJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7IC8vIENhbmNlbCB0byBmaXggb25iZWZvcmV1bmxvYWQgcHJvYmxlbQ0KCQkJCX0NCgkJCX0pOw0KDQoJCQlpZiAodC5oYXNNZW51cygpKSB7DQoJCQkJdC5tb3VzZU92ZXJGdW5jID0gRXZlbnQuYWRkKGNvLCAnbW91c2VvdmVyJywgZnVuY3Rpb24oZSkgew0KCQkJCQl2YXIgbSwgciwgbWk7DQoNCgkJCQkJZSA9IGUudGFyZ2V0Ow0KCQkJCQlpZiAoZSAmJiAoZSA9IERPTS5nZXRQYXJlbnQoZSwgJ3RyJykpKSB7DQoJCQkJCQltID0gdC5pdGVtc1tlLmlkXTsNCg0KCQkJCQkJaWYgKHQubGFzdE1lbnUpDQoJCQkJCQkJdC5sYXN0TWVudS5jb2xsYXBzZSgxKTsNCg0KCQkJCQkJaWYgKG0uaXNEaXNhYmxlZCgpKQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJaWYgKGUgJiYgRE9NLmhhc0NsYXNzKGUsIGNwICsgJ0l0ZW1TdWInKSkgew0KCQkJCQkJCS8vcCA9IERPTS5nZXRQb3Mocy5jb250YWluZXIpOw0KCQkJCQkJCXIgPSBET00uZ2V0UmVjdChlKTsNCgkJCQkJCQltLnNob3dNZW51KChyLnggKyByLncgLSBvdCksIHIueSAtIG90LCByLngpOw0KCQkJCQkJCXQubGFzdE1lbnUgPSBtOw0KCQkJCQkJCURPTS5hZGRDbGFzcyhET00uZ2V0KG0uaWQpLmZpcnN0Q2hpbGQsIGNwICsgJ0l0ZW1BY3RpdmUnKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQl0Lm9uU2hvd01lbnUuZGlzcGF0Y2godCk7DQoNCgkJCWlmIChzLmtleWJvYXJkX2ZvY3VzKSB7DQoJCQkJRXZlbnQuYWRkKGNvLCAna2V5ZG93bicsIHQuX2tleUhhbmRsZXIsIHQpOw0KCQkJCURPTS5zZWxlY3QoJ2EnLCAnbWVudV8nICsgdC5pZClbMF0uZm9jdXMoKTsgLy8gU2VsZWN0IGZpcnN0IGxpbmsNCgkJCQl0Ll9mb2N1c0lkeCA9IDA7DQoJCQl9DQoJCX0sDQoNCgkJaGlkZU1lbnUgOiBmdW5jdGlvbihjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNvID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCksIGU7DQoNCgkJCWlmICghdC5pc01lbnVWaXNpYmxlKQ0KCQkJCXJldHVybjsNCg0KCQkJRXZlbnQucmVtb3ZlKGNvLCAnbW91c2VvdmVyJywgdC5tb3VzZU92ZXJGdW5jKTsNCgkJCUV2ZW50LnJlbW92ZShjbywgJ2NsaWNrJywgdC5tb3VzZUNsaWNrRnVuYyk7DQoJCQlFdmVudC5yZW1vdmUoY28sICdrZXlkb3duJywgdC5fa2V5SGFuZGxlcik7DQoJCQlET00uaGlkZShjbyk7DQoJCQl0LmlzTWVudVZpc2libGUgPSAwOw0KDQoJCQlpZiAoIWMpDQoJCQkJdC5jb2xsYXBzZSgxKTsNCg0KCQkJaWYgKHQuZWxlbWVudCkNCgkJCQl0LmVsZW1lbnQuaGlkZSgpOw0KDQoJCQlpZiAoZSA9IERPTS5nZXQodC5pZCkpDQoJCQkJRE9NLnJlbW92ZUNsYXNzKGUuZmlyc3RDaGlsZCwgdC5jbGFzc1ByZWZpeCArICdJdGVtQWN0aXZlJyk7DQoNCgkJCXQub25IaWRlTWVudS5kaXNwYXRjaCh0KTsNCgkJfSwNCg0KCQlhZGQgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNvOw0KDQoJCQlvID0gdC5wYXJlbnQobyk7DQoNCgkJCWlmICh0LmlzUmVuZGVyZWQgJiYgKGNvID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCkpKQ0KCQkJCXQuX2FkZChET00uc2VsZWN0KCd0Ym9keScsIGNvKVswXSwgbyk7DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCWNvbGxhcHNlIDogZnVuY3Rpb24oZCkgew0KCQkJdGhpcy5wYXJlbnQoZCk7DQoJCQl0aGlzLmhpZGVNZW51KDEpOw0KCQl9LA0KDQoJCXJlbW92ZSA6IGZ1bmN0aW9uKG8pIHsNCgkJCURPTS5yZW1vdmUoby5pZCk7DQoJCQl0aGlzLmRlc3Ryb3koKTsNCg0KCQkJcmV0dXJuIHRoaXMucGFyZW50KG8pOw0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgY28gPSBET00uZ2V0KCdtZW51XycgKyB0LmlkKTsNCg0KCQkJRXZlbnQucmVtb3ZlKGNvLCAnbW91c2VvdmVyJywgdC5tb3VzZU92ZXJGdW5jKTsNCgkJCUV2ZW50LnJlbW92ZShjbywgJ2NsaWNrJywgdC5tb3VzZUNsaWNrRnVuYyk7DQoNCgkJCWlmICh0LmVsZW1lbnQpDQoJCQkJdC5lbGVtZW50LnJlbW92ZSgpOw0KDQoJCQlET00ucmVtb3ZlKGNvKTsNCgkJfSwNCg0KCQlyZW5kZXJOb2RlIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBuLCB0YiwgY28sIHc7DQoNCgkJCXcgPSBET00uY3JlYXRlKCdkaXYnLCB7aWQgOiAnbWVudV8nICsgdC5pZCwgJ2NsYXNzJyA6IHNbJ2NsYXNzJ10sICdzdHlsZScgOiAncG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO3otaW5kZXg6MjAwMDAwJ30pOw0KCQkJY28gPSBET00uYWRkKHcsICdkaXYnLCB7aWQgOiAnbWVudV8nICsgdC5pZCArICdfY28nLCAnY2xhc3MnIDogdC5jbGFzc1ByZWZpeCArIChzWydjbGFzcyddID8gJyAnICsgc1snY2xhc3MnXSA6ICcnKX0pOw0KCQkJdC5lbGVtZW50ID0gbmV3IEVsZW1lbnQoJ21lbnVfJyArIHQuaWQsIHtibG9ja2VyIDogMSwgY29udGFpbmVyIDogcy5jb250YWluZXJ9KTsNCg0KCQkJaWYgKHMubWVudV9saW5lKQ0KCQkJCURPTS5hZGQoY28sICdzcGFuJywgeydjbGFzcycgOiB0LmNsYXNzUHJlZml4ICsgJ0xpbmUnfSk7DQoNCi8vCQkJbiA9IERPTS5hZGQoY28sICdkaXYnLCB7aWQgOiAnbWVudV8nICsgdC5pZCArICdfY28nLCAnY2xhc3MnIDogJ21jZU1lbnVDb250YWluZXInfSk7DQoJCQluID0gRE9NLmFkZChjbywgJ3RhYmxlJywge2lkIDogJ21lbnVfJyArIHQuaWQgKyAnX3RibCcsIGJvcmRlciA6IDAsIGNlbGxQYWRkaW5nIDogMCwgY2VsbFNwYWNpbmcgOiAwfSk7DQoJCQl0YiA9IERPTS5hZGQobiwgJ3Rib2R5Jyk7DQoNCgkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24obykgew0KCQkJCXQuX2FkZCh0Yiwgbyk7DQoJCQl9KTsNCg0KCQkJdC5yZW5kZXJlZCA9IHRydWU7DQoNCgkJCXJldHVybiB3Ow0KCQl9LA0KDQoJCS8vIEludGVybmFsIGZ1bmN0aW9ucw0KDQoJCV9rZXlIYW5kbGVyIDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHQgPSB0aGlzLCBrYyA9IGUua2V5Q29kZTsNCg0KCQkJZnVuY3Rpb24gZm9jdXMoZCkgew0KCQkJCXZhciBpID0gdC5fZm9jdXNJZHggKyBkLCBlID0gRE9NLnNlbGVjdCgnYScsICdtZW51XycgKyB0LmlkKVtpXTsNCg0KCQkJCWlmIChlKSB7DQoJCQkJCXQuX2ZvY3VzSWR4ID0gaTsNCgkJCQkJZS5mb2N1cygpOw0KCQkJCX0NCgkJCX07DQoNCgkJCXN3aXRjaCAoa2MpIHsNCgkJCQljYXNlIDM4Og0KCQkJCQlmb2N1cygtMSk7IC8vIFNlbGVjdCBmaXJzdCBsaW5rDQoJCQkJCXJldHVybjsNCg0KCQkJCWNhc2UgNDA6DQoJCQkJCWZvY3VzKDEpOw0KCQkJCQlyZXR1cm47DQoNCgkJCQljYXNlIDEzOg0KCQkJCQlyZXR1cm47DQoNCgkJCQljYXNlIDI3Og0KCQkJCQlyZXR1cm4gdGhpcy5oaWRlTWVudSgpOw0KCQkJfQ0KCQl9LA0KDQoJCV9hZGQgOiBmdW5jdGlvbih0Yiwgbykgew0KCQkJdmFyIG4sIHMgPSBvLnNldHRpbmdzLCBhLCBybywgaXQsIGNwID0gdGhpcy5jbGFzc1ByZWZpeCwgaWM7DQoNCgkJCWlmIChzLnNlcGFyYXRvcikgew0KCQkJCXJvID0gRE9NLmFkZCh0YiwgJ3RyJywge2lkIDogby5pZCwgJ2NsYXNzJyA6IGNwICsgJ0l0ZW1TZXBhcmF0b3InfSk7DQoJCQkJRE9NLmFkZChybywgJ3RkJywgeydjbGFzcycgOiBjcCArICdJdGVtU2VwYXJhdG9yJ30pOw0KDQoJCQkJaWYgKG4gPSByby5wcmV2aW91c1NpYmxpbmcpDQoJCQkJCURPTS5hZGRDbGFzcyhuLCAnbWNlTGFzdCcpOw0KDQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQluID0gcm8gPSBET00uYWRkKHRiLCAndHInLCB7aWQgOiBvLmlkLCAnY2xhc3MnIDogY3AgKyAnSXRlbSAnICsgY3AgKyAnSXRlbUVuYWJsZWQnfSk7DQoJCQluID0gaXQgPSBET00uYWRkKG4sICd0ZCcpOw0KCQkJbiA9IGEgPSBET00uYWRkKG4sICdhJywge2hyZWYgOiAnamF2YXNjcmlwdDo7Jywgb25jbGljayA6ICJyZXR1cm4gZmFsc2U7Iiwgb25tb3VzZWRvd24gOiAncmV0dXJuIGZhbHNlOyd9KTsNCg0KCQkJRE9NLmFkZENsYXNzKGl0LCBzWydjbGFzcyddKTsNCi8vCQkJbiA9IERPTS5hZGQobiwgJ3NwYW4nLCB7J2NsYXNzJyA6ICdpdGVtJ30pOw0KDQoJCQlpYyA9IERPTS5hZGQobiwgJ3NwYW4nLCB7J2NsYXNzJyA6ICdtY2VJY29uJyArIChzLmljb24gPyAnIG1jZV8nICsgcy5pY29uIDogJycpfSk7DQoNCgkJCWlmIChzLmljb25fc3JjKQ0KCQkJCURPTS5hZGQoaWMsICdpbWcnLCB7c3JjIDogcy5pY29uX3NyY30pOw0KDQoJCQluID0gRE9NLmFkZChuLCBzLmVsZW1lbnQgfHwgJ3NwYW4nLCB7J2NsYXNzJyA6ICdtY2VUZXh0JywgdGl0bGUgOiBvLnNldHRpbmdzLnRpdGxlfSwgby5zZXR0aW5ncy50aXRsZSk7DQoNCgkJCWlmIChvLnNldHRpbmdzLnN0eWxlKQ0KCQkJCURPTS5zZXRBdHRyaWIobiwgJ3N0eWxlJywgby5zZXR0aW5ncy5zdHlsZSk7DQoNCgkJCWlmICh0Yi5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxKQ0KCQkJCURPTS5hZGRDbGFzcyhybywgJ21jZUZpcnN0Jyk7DQoNCgkJCWlmICgobiA9IHJvLnByZXZpb3VzU2libGluZykgJiYgRE9NLmhhc0NsYXNzKG4sIGNwICsgJ0l0ZW1TZXBhcmF0b3InKSkNCgkJCQlET00uYWRkQ2xhc3Mocm8sICdtY2VGaXJzdCcpOw0KDQoJCQlpZiAoby5jb2xsYXBzZSkNCgkJCQlET00uYWRkQ2xhc3Mocm8sIGNwICsgJ0l0ZW1TdWInKTsNCg0KCQkJaWYgKG4gPSByby5wcmV2aW91c1NpYmxpbmcpDQoJCQkJRE9NLnJlbW92ZUNsYXNzKG4sICdtY2VMYXN0Jyk7DQoNCgkJCURPTS5hZGRDbGFzcyhybywgJ21jZUxhc3QnKTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBET00gPSB0aW55bWNlLkRPTTsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLkJ1dHRvbjp0aW55bWNlLnVpLkNvbnRyb2wnLCB7DQoJCUJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl0aGlzLnBhcmVudChpZCwgcyk7DQoJCQl0aGlzLmNsYXNzUHJlZml4ID0gJ21jZUJ1dHRvbic7DQoJCX0sDQoNCgkJcmVuZGVySFRNTCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGNwID0gdGhpcy5jbGFzc1ByZWZpeCwgcyA9IHRoaXMuc2V0dGluZ3MsIGgsIGw7DQoNCgkJCWwgPSBET00uZW5jb2RlKHMubGFiZWwgfHwgJycpOw0KCQkJaCA9ICc8YSBpZD0iJyArIHRoaXMuaWQgKyAnIiBocmVmPSJqYXZhc2NyaXB0OjsiIGNsYXNzPSInICsgY3AgKyAnICcgKyBjcCArICdFbmFibGVkICcgKyBzWydjbGFzcyddICsgKGwgPyAnICcgKyBjcCArICdMYWJlbGVkJyA6ICcnKSArJyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiIG9uY2xpY2s9InJldHVybiBmYWxzZTsiIHRpdGxlPSInICsgRE9NLmVuY29kZShzLnRpdGxlKSArICciPic7DQoNCgkJCWlmIChzLmltYWdlKQ0KCQkJCWggKz0gJzxpbWcgY2xhc3M9Im1jZUljb24iIHNyYz0iJyArIHMuaW1hZ2UgKyAnIiAvPicgKyBsICsgJzwvYT4nOw0KCQkJZWxzZQ0KCQkJCWggKz0gJzxzcGFuIGNsYXNzPSJtY2VJY29uICcgKyBzWydjbGFzcyddICsgJyI+PC9zcGFuPicgKyAobCA/ICc8c3BhbiBjbGFzcz0iJyArIGNwICsgJ0xhYmVsIj4nICsgbCArICc8L3NwYW4+JyA6ICcnKSArICc8L2E+JzsNCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJdGlueW1jZS5kb20uRXZlbnQuYWRkKHQuaWQsICdjbGljaycsIGZ1bmN0aW9uKGUpIHsNCgkJCQlpZiAoIXQuaXNEaXNhYmxlZCgpKQ0KCQkJCQlyZXR1cm4gcy5vbmNsaWNrLmNhbGwocy5zY29wZSwgZSk7DQoJCQl9KTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIERPTSA9IHRpbnltY2UuRE9NLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBlYWNoID0gdGlueW1jZS5lYWNoLCBEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXI7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5MaXN0Qm94OnRpbnltY2UudWkuQ29udHJvbCcsIHsNCgkJTGlzdEJveCA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQucGFyZW50KGlkLCBzKTsNCg0KCQkJdC5pdGVtcyA9IFtdOw0KDQoJCQl0Lm9uQ2hhbmdlID0gbmV3IERpc3BhdGNoZXIodCk7DQoNCgkJCXQub25Qb3N0UmVuZGVyID0gbmV3IERpc3BhdGNoZXIodCk7DQoNCgkJCXQub25BZGQgPSBuZXcgRGlzcGF0Y2hlcih0KTsNCg0KCQkJdC5vblJlbmRlck1lbnUgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodGhpcyk7DQoNCgkJCXQuY2xhc3NQcmVmaXggPSAnbWNlTGlzdEJveCc7DQoJCX0sDQoNCgkJc2VsZWN0IDogZnVuY3Rpb24odmEpIHsNCgkJCXZhciB0ID0gdGhpcywgZnYsIGY7DQoNCgkJCWlmICh2YSA9PSB1bmRlZmluZWQpDQoJCQkJcmV0dXJuIHQuc2VsZWN0QnlJbmRleCgtMSk7DQoNCgkJCS8vIElzIHN0cmluZyBvciBudW1iZXIgbWFrZSBmdW5jdGlvbiBzZWxlY3Rvcg0KCQkJaWYgKHZhICYmIHZhLmNhbGwpDQoJCQkJZiA9IHZhOw0KCQkJZWxzZSB7DQoJCQkJZiA9IGZ1bmN0aW9uKHYpIHsNCgkJCQkJcmV0dXJuIHYgPT0gdmE7DQoJCQkJfTsNCgkJCX0NCg0KCQkJLy8gRG8gd2UgbmVlZCB0byBkbyBzb21ldGhpbmc/DQoJCQlpZiAodmEgIT0gdC5zZWxlY3RlZFZhbHVlKSB7DQoJCQkJLy8gRmluZCBpdGVtDQoJCQkJZWFjaCh0Lml0ZW1zLCBmdW5jdGlvbihvLCBpKSB7DQoJCQkJCWlmIChmKG8udmFsdWUpKSB7DQoJCQkJCQlmdiA9IDE7DQoJCQkJCQl0LnNlbGVjdEJ5SW5kZXgoaSk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCWlmICghZnYpDQoJCQkJCXQuc2VsZWN0QnlJbmRleCgtMSk7DQoJCQl9DQoJCX0sDQoNCgkJc2VsZWN0QnlJbmRleCA6IGZ1bmN0aW9uKGlkeCkgew0KCQkJdmFyIHQgPSB0aGlzLCBlLCBvOw0KDQoJCQlpZiAoaWR4ICE9IHQuc2VsZWN0ZWRJbmRleCkgew0KCQkJCWUgPSBET00uZ2V0KHQuaWQgKyAnX3RleHQnKTsNCgkJCQlvID0gdC5pdGVtc1tpZHhdOw0KDQoJCQkJaWYgKG8pIHsNCgkJCQkJdC5zZWxlY3RlZFZhbHVlID0gby52YWx1ZTsNCgkJCQkJdC5zZWxlY3RlZEluZGV4ID0gaWR4Ow0KCQkJCQlET00uc2V0SFRNTChlLCBET00uZW5jb2RlKG8udGl0bGUpKTsNCgkJCQkJRE9NLnJlbW92ZUNsYXNzKGUsICdtY2VUaXRsZScpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCURPTS5zZXRIVE1MKGUsIERPTS5lbmNvZGUodC5zZXR0aW5ncy50aXRsZSkpOw0KCQkJCQlET00uYWRkQ2xhc3MoZSwgJ21jZVRpdGxlJyk7DQoJCQkJCXQuc2VsZWN0ZWRWYWx1ZSA9IHQuc2VsZWN0ZWRJbmRleCA9IG51bGw7DQoJCQkJfQ0KDQoJCQkJZSA9IDA7DQoJCQl9DQoJCX0sDQoNCgkJYWRkIDogZnVuY3Rpb24obiwgdiwgbykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlvID0gbyB8fCB7fTsNCgkJCW8gPSB0aW55bWNlLmV4dGVuZChvLCB7DQoJCQkJdGl0bGUgOiBuLA0KCQkJCXZhbHVlIDogdg0KCQkJfSk7DQoNCgkJCXQuaXRlbXMucHVzaChvKTsNCgkJCXQub25BZGQuZGlzcGF0Y2godCwgbyk7DQoJCX0sDQoNCgkJZ2V0TGVuZ3RoIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGg7DQoJCX0sDQoNCgkJcmVuZGVySFRNTCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGggPSAnJywgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBjcCA9IHQuY2xhc3NQcmVmaXg7DQoNCgkJCWggPSAnPHRhYmxlIGlkPSInICsgdC5pZCArICciIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9IicgKyBjcCArICcgJyArIGNwICsgJ0VuYWJsZWQnICsgKHNbJ2NsYXNzJ10gPyAoJyAnICsgc1snY2xhc3MnXSkgOiAnJykgKyAnIj48dGJvZHk+PHRyPic7DQoJCQloICs9ICc8dGQ+JyArIERPTS5jcmVhdGVIVE1MKCdhJywge2lkIDogdC5pZCArICdfdGV4dCcsIGhyZWYgOiAnamF2YXNjcmlwdDo7JywgJ2NsYXNzJyA6ICdtY2VUZXh0Jywgb25jbGljayA6ICJyZXR1cm4gZmFsc2U7Iiwgb25tb3VzZWRvd24gOiAncmV0dXJuIGZhbHNlOyd9LCBET00uZW5jb2RlKHQuc2V0dGluZ3MudGl0bGUpKSArICc8L3RkPic7DQoJCQloICs9ICc8dGQ+JyArIERPTS5jcmVhdGVIVE1MKCdhJywge2lkIDogdC5pZCArICdfb3BlbicsIHRhYmluZGV4IDogLTEsIGhyZWYgOiAnamF2YXNjcmlwdDo7JywgJ2NsYXNzJyA6ICdtY2VPcGVuJywgb25jbGljayA6ICJyZXR1cm4gZmFsc2U7Iiwgb25tb3VzZWRvd24gOiAncmV0dXJuIGZhbHNlOyd9LCAnPHNwYW4+PC9zcGFuPicpICsgJzwvdGQ+JzsNCgkJCWggKz0gJzwvdHI+PC90Ym9keT48L3RhYmxlPic7DQoNCgkJCXJldHVybiBoOw0KCQl9LA0KDQoJCXNob3dNZW51IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHAxLCBwMiwgZSA9IERPTS5nZXQodGhpcy5pZCksIG07DQoNCgkJCWlmICh0LmlzRGlzYWJsZWQoKSB8fCB0Lml0ZW1zLmxlbmd0aCA9PSAwKQ0KCQkJCXJldHVybjsNCg0KCQkJaWYgKHQubWVudSAmJiB0Lm1lbnUuaXNNZW51VmlzaWJsZSkNCgkJCQlyZXR1cm4gdC5oaWRlTWVudSgpOw0KDQoJCQlpZiAoIXQuaXNNZW51UmVuZGVyZWQpIHsNCgkJCQl0LnJlbmRlck1lbnUoKTsNCgkJCQl0LmlzTWVudVJlbmRlcmVkID0gdHJ1ZTsNCgkJCX0NCg0KCQkJcDEgPSBET00uZ2V0UG9zKHRoaXMuc2V0dGluZ3MubWVudV9jb250YWluZXIpOw0KCQkJcDIgPSBET00uZ2V0UG9zKGUpOw0KDQoJCQltID0gdC5tZW51Ow0KCQkJbS5zZXR0aW5ncy5vZmZzZXRfeCA9IHAyLng7DQoJCQltLnNldHRpbmdzLm9mZnNldF95ID0gcDIueTsNCgkJCW0uc2V0dGluZ3Mua2V5Ym9hcmRfZm9jdXMgPSAhdGlueW1jZS5pc09wZXJhOyAvLyBPcGVyYSBpcyBidWdneSB3aGVuIGl0IGNvbWVzIHRvIGF1dG8gZm9jdXMNCg0KCQkJLy8gU2VsZWN0IGluIG1lbnUNCgkJCWlmICh0Lm9sZElEKQ0KCQkJCW0uaXRlbXNbdC5vbGRJRF0uc2V0U2VsZWN0ZWQoMCk7DQoNCgkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24obykgew0KCQkJCWlmIChvLnZhbHVlID09PSB0LnNlbGVjdGVkVmFsdWUpIHsNCgkJCQkJbS5pdGVtc1tvLmlkXS5zZXRTZWxlY3RlZCgxKTsNCgkJCQkJdC5vbGRJRCA9IG8uaWQ7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCW0uc2hvd01lbnUoMCwgZS5jbGllbnRIZWlnaHQpOw0KDQoJCQlFdmVudC5hZGQoRE9NLmRvYywgJ21vdXNlZG93bicsIHQuaGlkZU1lbnUsIHQpOw0KCQkJRE9NLmFkZENsYXNzKHQuaWQsIHQuY2xhc3NQcmVmaXggKyAnU2VsZWN0ZWQnKTsNCg0KCQkJLy9ET00uZ2V0KHQuaWQgKyAnX3RleHQnKS5mb2N1cygpOw0KCQl9LA0KDQoJCWhpZGVNZW51IDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAodC5tZW51ICYmIHQubWVudS5pc01lbnVWaXNpYmxlKSB7DQoJCQkJLy8gUHJldmVudCBkb3VibGUgdG9vZ2xlcyBieSBjYW5jZWxpbmcgdGhlIG1vdXNlIGNsaWNrIGV2ZW50IHRvIHRoZSBidXR0b24NCgkJCQlpZiAoZSAmJiBlLnR5cGUgPT0gIm1vdXNlZG93biIgJiYgKGUudGFyZ2V0LmlkID09IHQuaWQgKyAnX3RleHQnIHx8IGUudGFyZ2V0LmlkID09IHQuaWQgKyAnX29wZW4nKSkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJaWYgKCFlIHx8ICFET00uZ2V0UGFyZW50KGUudGFyZ2V0LCAnLm1jZU1lbnUnKSkgew0KCQkJCQlET00ucmVtb3ZlQ2xhc3ModC5pZCwgdC5jbGFzc1ByZWZpeCArICdTZWxlY3RlZCcpOw0KCQkJCQlFdmVudC5yZW1vdmUoRE9NLmRvYywgJ21vdXNlZG93bicsIHQuaGlkZU1lbnUsIHQpOw0KCQkJCQl0Lm1lbnUuaGlkZU1lbnUoKTsNCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkJcmVuZGVyTWVudSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBtOw0KDQoJCQltID0gdC5zZXR0aW5ncy5jb250cm9sX21hbmFnZXIuY3JlYXRlRHJvcE1lbnUodC5pZCArICdfbWVudScsIHsNCgkJCQltZW51X2xpbmUgOiAxLA0KCQkJCSdjbGFzcycgOiB0LmNsYXNzUHJlZml4ICsgJ01lbnUgbWNlTm9JY29ucycsDQoJCQkJbWF4X3dpZHRoIDogMTUwLA0KCQkJCW1heF9oZWlnaHQgOiAxNTANCgkJCX0pOw0KDQoJCQltLm9uSGlkZU1lbnUuYWRkKHQuaGlkZU1lbnUsIHQpOw0KDQoJCQltLmFkZCh7DQoJCQkJdGl0bGUgOiB0LnNldHRpbmdzLnRpdGxlLA0KCQkJCSdjbGFzcycgOiAnbWNlTWVudUl0ZW1UaXRsZScsDQoJCQkJb25jbGljayA6IGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAodC5zZXR0aW5ncy5vbnNlbGVjdCgnJykgIT09IGZhbHNlKQ0KCQkJCQkJdC5zZWxlY3QoJycpOyAvLyBNdXN0IGJlIHJ1bm5lZCBhZnRlcg0KCQkJCX0NCgkJCX0pOw0KDQoJCQllYWNoKHQuaXRlbXMsIGZ1bmN0aW9uKG8pIHsNCgkJCQkvLyBObyB2YWx1ZSB0aGVuIHRyZWF0IGl0IGFzIGEgdGl0bGUNCgkJCQlpZiAoby52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7DQoJCQkJCW0uYWRkKHsNCgkJCQkJCXRpdGxlIDogby50aXRsZSwNCgkJCQkJCSdjbGFzcycgOiAnbWNlTWVudUl0ZW1UaXRsZScsDQoJCQkJCQlvbmNsaWNrIDogZnVuY3Rpb24oKSB7DQoJCQkJCQkJaWYgKHQuc2V0dGluZ3Mub25zZWxlY3QoJycpICE9PSBmYWxzZSkNCgkJCQkJCQkJdC5zZWxlY3QoJycpOyAvLyBNdXN0IGJlIHJ1bm5lZCBhZnRlcg0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlvLmlkID0gRE9NLnVuaXF1ZUlkKCk7DQoJCQkJCW8ub25jbGljayA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJaWYgKHQuc2V0dGluZ3Mub25zZWxlY3Qoby52YWx1ZSkgIT09IGZhbHNlKQ0KCQkJCQkJCXQuc2VsZWN0KG8udmFsdWUpOyAvLyBNdXN0IGJlIHJ1bm5lZCBhZnRlcg0KCQkJCQl9Ow0KDQoJCQkJCW0uYWRkKG8pOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQl0Lm9uUmVuZGVyTWVudS5kaXNwYXRjaCh0LCBtKTsNCgkJCXQubWVudSA9IG07DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBjcCA9IHQuY2xhc3NQcmVmaXg7DQoNCgkJCUV2ZW50LmFkZCh0LmlkLCAnY2xpY2snLCB0LnNob3dNZW51LCB0KTsNCgkJCUV2ZW50LmFkZCh0LmlkICsgJ190ZXh0JywgJ2ZvY3VzJywgZnVuY3Rpb24oKSB7DQoJCQkJaWYgKCF0Ll9mb2N1c2VkKSB7DQoJCQkJCXQua2V5RG93bkhhbmRsZXIgPSBFdmVudC5hZGQodC5pZCArICdfdGV4dCcsICdrZXlkb3duJywgZnVuY3Rpb24oZSkgew0KCQkJCQkJdmFyIGlkeCA9IC0xLCB2LCBrYyA9IGUua2V5Q29kZTsNCg0KCQkJCQkJLy8gRmluZCBjdXJyZW50IGluZGV4DQoJCQkJCQllYWNoKHQuaXRlbXMsIGZ1bmN0aW9uKHYsIGkpIHsNCgkJCQkJCQlpZiAodC5zZWxlY3RlZFZhbHVlID09IHYudmFsdWUpDQoJCQkJCQkJCWlkeCA9IGk7DQoJCQkJCQl9KTsNCg0KCQkJCQkJLy8gTW92ZSB1cC9kb3duDQoJCQkJCQlpZiAoa2MgPT0gMzgpDQoJCQkJCQkJdiA9IHQuaXRlbXNbaWR4IC0gMV07DQoJCQkJCQllbHNlIGlmIChrYyA9PSA0MCkNCgkJCQkJCQl2ID0gdC5pdGVtc1tpZHggKyAxXTsNCgkJCQkJCWVsc2UgaWYgKGtjID09IDEzKSB7DQoJCQkJCQkJLy8gRmFrZSBzZWxlY3Qgb24gZW50ZXINCgkJCQkJCQl2ID0gdC5zZWxlY3RlZFZhbHVlOw0KCQkJCQkJCXQuc2VsZWN0ZWRWYWx1ZSA9IG51bGw7IC8vIE5lZWRzIHRvIGJlIG51bGwgdG8gZmFrZSBjaGFuZ2UNCgkJCQkJCQl0LnNldHRpbmdzLm9uc2VsZWN0KHYpOw0KCQkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJCQl9DQoNCgkJCQkJCWlmICh2KSB7DQoJCQkJCQkJdC5oaWRlTWVudSgpOw0KCQkJCQkJCXQuc2VsZWN0KHYudmFsdWUpOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQl0Ll9mb2N1c2VkID0gMTsNCgkJCX0pOw0KCQkJRXZlbnQuYWRkKHQuaWQgKyAnX3RleHQnLCAnYmx1cicsIGZ1bmN0aW9uKCkge0V2ZW50LnJlbW92ZSh0LmlkICsgJ190ZXh0JywgJ2tleWRvd24nLCB0LmtleURvd25IYW5kbGVyKTsgdC5fZm9jdXNlZCA9IDA7fSk7DQoNCgkJCS8vIE9sZCBJRSBkb2Vzbid0IGhhdmUgaG92ZXIgb24gYWxsIGVsZW1lbnRzDQoJCQlpZiAodGlueW1jZS5pc0lFNiB8fCAhRE9NLmJveE1vZGVsKSB7DQoJCQkJRXZlbnQuYWRkKHQuaWQsICdtb3VzZW92ZXInLCBmdW5jdGlvbigpIHsNCgkJCQkJaWYgKCFET00uaGFzQ2xhc3ModC5pZCwgY3AgKyAnRGlzYWJsZWQnKSkNCgkJCQkJCURPTS5hZGRDbGFzcyh0LmlkLCBjcCArICdIb3ZlcicpOw0KCQkJCX0pOw0KDQoJCQkJRXZlbnQuYWRkKHQuaWQsICdtb3VzZW91dCcsIGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoIURPTS5oYXNDbGFzcyh0LmlkLCBjcCArICdEaXNhYmxlZCcpKQ0KCQkJCQkJRE9NLnJlbW92ZUNsYXNzKHQuaWQsIGNwICsgJ0hvdmVyJyk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXQub25Qb3N0UmVuZGVyLmRpc3BhdGNoKHQsIERPTS5nZXQodC5pZCkpOw0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbigpIHsNCgkJCXRoaXMucGFyZW50KCk7DQoNCgkJCUV2ZW50LmNsZWFyKHRoaXMuaWQgKyAnX3RleHQnKTsNCgkJCUV2ZW50LmNsZWFyKHRoaXMuaWQgKyAnX29wZW4nKTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBET00gPSB0aW55bWNlLkRPTSwgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwgZWFjaCA9IHRpbnltY2UuZWFjaCwgRGlzcGF0Y2hlciA9IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuTmF0aXZlTGlzdEJveDp0aW55bWNlLnVpLkxpc3RCb3gnLCB7DQoJCU5hdGl2ZUxpc3RCb3ggOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQkJdGhpcy5jbGFzc1ByZWZpeCA9ICdtY2VOYXRpdmVMaXN0Qm94JzsNCgkJfSwNCg0KCQlzZXREaXNhYmxlZCA6IGZ1bmN0aW9uKHMpIHsNCgkJCURPTS5nZXQodGhpcy5pZCkuZGlzYWJsZWQgPSBzOw0KCQl9LA0KDQoJCWlzRGlzYWJsZWQgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiBET00uZ2V0KHRoaXMuaWQpLmRpc2FibGVkOw0KCQl9LA0KDQoJCXNlbGVjdCA6IGZ1bmN0aW9uKHZhKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGZ2LCBmOw0KDQoJCQlpZiAodmEgPT0gdW5kZWZpbmVkKQ0KCQkJCXJldHVybiB0LnNlbGVjdEJ5SW5kZXgoLTEpOw0KDQoJCQkvLyBJcyBzdHJpbmcgb3IgbnVtYmVyIG1ha2UgZnVuY3Rpb24gc2VsZWN0b3INCgkJCWlmICh2YSAmJiB2YS5jYWxsKQ0KCQkJCWYgPSB2YTsNCgkJCWVsc2Ugew0KCQkJCWYgPSBmdW5jdGlvbih2KSB7DQoJCQkJCXJldHVybiB2ID09IHZhOw0KCQkJCX07DQoJCQl9DQoNCgkJCS8vIERvIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nPw0KCQkJaWYgKHZhICE9IHQuc2VsZWN0ZWRWYWx1ZSkgew0KCQkJCS8vIEZpbmQgaXRlbQ0KCQkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24obywgaSkgew0KCQkJCQlpZiAoZihvLnZhbHVlKSkgew0KCQkJCQkJZnYgPSAxOw0KCQkJCQkJdC5zZWxlY3RCeUluZGV4KGkpOw0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQlpZiAoIWZ2KQ0KCQkJCQl0LnNlbGVjdEJ5SW5kZXgoLTEpOw0KCQkJfQ0KCQl9LA0KDQoJCXNlbGVjdEJ5SW5kZXggOiBmdW5jdGlvbihpZHgpIHsNCgkJCURPTS5nZXQodGhpcy5pZCkuc2VsZWN0ZWRJbmRleCA9IGlkeCArIDE7DQoJCQl0aGlzLnNlbGVjdGVkVmFsdWUgPSB0aGlzLml0ZW1zW2lkeF0gPyB0aGlzLml0ZW1zW2lkeF0udmFsdWUgOiBudWxsOw0KCQl9LA0KDQoJCWFkZCA6IGZ1bmN0aW9uKG4sIHYsIGEpIHsNCgkJCXZhciBvLCB0ID0gdGhpczsNCg0KCQkJYSA9IGEgfHwge307DQoJCQlhLnZhbHVlID0gdjsNCg0KCQkJaWYgKHQuaXNSZW5kZXJlZCgpKQ0KCQkJCURPTS5hZGQoRE9NLmdldCh0aGlzLmlkKSwgJ29wdGlvbicsIGEsIG4pOw0KDQoJCQlvID0gew0KCQkJCXRpdGxlIDogbiwNCgkJCQl2YWx1ZSA6IHYsDQoJCQkJYXR0cmlicyA6IGENCgkJCX07DQoNCgkJCXQuaXRlbXMucHVzaChvKTsNCgkJCXQub25BZGQuZGlzcGF0Y2godCwgbyk7DQoJCX0sDQoNCgkJZ2V0TGVuZ3RoIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGg7DQoJCX0sDQoNCgkJcmVuZGVySFRNTCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGgsIHQgPSB0aGlzOw0KDQoJCQloID0gRE9NLmNyZWF0ZUhUTUwoJ29wdGlvbicsIHt2YWx1ZSA6ICcnfSwgJy0tICcgKyB0LnNldHRpbmdzLnRpdGxlICsgJyAtLScpOw0KDQoJCQllYWNoKHQuaXRlbXMsIGZ1bmN0aW9uKGl0KSB7DQoJCQkJaCArPSBET00uY3JlYXRlSFRNTCgnb3B0aW9uJywge3ZhbHVlIDogaXQudmFsdWV9LCBpdC50aXRsZSk7DQoJCQl9KTsNCg0KCQkJaCA9IERPTS5jcmVhdGVIVE1MKCdzZWxlY3QnLCB7aWQgOiB0LmlkLCAnY2xhc3MnIDogJ21jZU5hdGl2ZUxpc3RCb3gnfSwgaCk7DQoNCgkJCXJldHVybiBoOw0KCQl9LA0KDQoJCXBvc3RSZW5kZXIgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgY2g7DQoNCgkJCXQucmVuZGVyZWQgPSB0cnVlOw0KDQoJCQlmdW5jdGlvbiBvbkNoYW5nZShlKSB7DQoJCQkJdmFyIHYgPSB0Lml0ZW1zW2UudGFyZ2V0LnNlbGVjdGVkSW5kZXggLSAxXTsNCg0KCQkJCWlmICh2ICYmICh2ID0gdi52YWx1ZSkpIHsNCgkJCQkJdC5vbkNoYW5nZS5kaXNwYXRjaCh0LCB2KTsNCg0KCQkJCQlpZiAodC5zZXR0aW5ncy5vbnNlbGVjdCkNCgkJCQkJCXQuc2V0dGluZ3Mub25zZWxlY3Qodik7DQoJCQkJfQ0KCQkJfTsNCg0KCQkJRXZlbnQuYWRkKHQuaWQsICdjaGFuZ2UnLCBvbkNoYW5nZSk7DQoNCgkJCS8vIEFjY2Vzc2liaWxpdHkga2V5aGFuZGxlcg0KCQkJRXZlbnQuYWRkKHQuaWQsICdrZXlkb3duJywgZnVuY3Rpb24oZSkgew0KCQkJCXZhciBiZjsNCg0KCQkJCUV2ZW50LnJlbW92ZSh0LmlkLCAnY2hhbmdlJywgY2gpOw0KDQoJCQkJYmYgPSBFdmVudC5hZGQodC5pZCwgJ2JsdXInLCBmdW5jdGlvbigpIHsNCgkJCQkJRXZlbnQuYWRkKHQuaWQsICdjaGFuZ2UnLCBvbkNoYW5nZSk7DQoJCQkJCUV2ZW50LnJlbW92ZSh0LmlkLCAnYmx1cicsIGJmKTsNCgkJCQl9KTsNCg0KCQkJCWlmIChlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDMyKSB7DQoJCQkJCW9uQ2hhbmdlKGUpOw0KCQkJCQlyZXR1cm4gRXZlbnQuY2FuY2VsKGUpOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQl0Lm9uUG9zdFJlbmRlci5kaXNwYXRjaCh0LCBET00uZ2V0KHQuaWQpKTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBET00gPSB0aW55bWNlLkRPTSwgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwgZWFjaCA9IHRpbnltY2UuZWFjaDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLk1lbnVCdXR0b246dGlueW1jZS51aS5CdXR0b24nLCB7DQoJCU1lbnVCdXR0b24gOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KDQoJCQl0aGlzLm9uUmVuZGVyTWVudSA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTsNCg0KCQkJcy5tZW51X2NvbnRhaW5lciA9IHMubWVudV9jb250YWluZXIgfHwgRE9NLmRvYy5ib2R5Ow0KCQl9LA0KDQoJCXNob3dNZW51IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHAxLCBwMiwgZSA9IERPTS5nZXQodC5pZCksIG07DQoNCgkJCWlmICh0LmlzRGlzYWJsZWQoKSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICghdC5pc01lbnVSZW5kZXJlZCkgew0KCQkJCXQucmVuZGVyTWVudSgpOw0KCQkJCXQuaXNNZW51UmVuZGVyZWQgPSB0cnVlOw0KCQkJfQ0KDQoJCQlpZiAodC5pc01lbnVWaXNpYmxlKQ0KCQkJCXJldHVybiB0LmhpZGVNZW51KCk7DQoNCgkJCXAxID0gRE9NLmdldFBvcyh0LnNldHRpbmdzLm1lbnVfY29udGFpbmVyKTsNCgkJCXAyID0gRE9NLmdldFBvcyhlKTsNCg0KCQkJbSA9IHQubWVudTsNCgkJCW0uc2V0dGluZ3Mub2Zmc2V0X3ggPSBwMi54Ow0KCQkJbS5zZXR0aW5ncy5vZmZzZXRfeSA9IHAyLnk7DQoJCQltLnNldHRpbmdzLnZwX29mZnNldF94ID0gcDIueDsNCgkJCW0uc2V0dGluZ3MudnBfb2Zmc2V0X3kgPSBwMi55Ow0KCQkJbS5zZXR0aW5ncy5rZXlib2FyZF9mb2N1cyA9IHQuX2ZvY3VzZWQ7DQoJCQltLnNob3dNZW51KDAsIGUuY2xpZW50SGVpZ2h0KTsNCg0KCQkJRXZlbnQuYWRkKERPTS5kb2MsICdtb3VzZWRvd24nLCB0LmhpZGVNZW51LCB0KTsNCgkJCXQuc2V0U3RhdGUoJ1NlbGVjdGVkJywgMSk7DQoNCgkJCXQuaXNNZW51VmlzaWJsZSA9IDE7DQoJCX0sDQoNCgkJcmVuZGVyTWVudSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBtOw0KDQoJCQltID0gdC5zZXR0aW5ncy5jb250cm9sX21hbmFnZXIuY3JlYXRlRHJvcE1lbnUodC5pZCArICdfbWVudScsIHsNCgkJCQltZW51X2xpbmUgOiAxLA0KCQkJCSdjbGFzcycgOiB0aGlzLmNsYXNzUHJlZml4ICsgJ01lbnUnLA0KCQkJCWljb25zIDogdC5zZXR0aW5ncy5pY29ucw0KCQkJfSk7DQoNCgkJCW0ub25IaWRlTWVudS5hZGQodC5oaWRlTWVudSwgdCk7DQoNCgkJCXQub25SZW5kZXJNZW51LmRpc3BhdGNoKHQsIG0pOw0KCQkJdC5tZW51ID0gbTsNCgkJfSwNCg0KCQloaWRlTWVudSA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJLy8gUHJldmVudCBkb3VibGUgdG9vZ2xlcyBieSBjYW5jZWxpbmcgdGhlIG1vdXNlIGNsaWNrIGV2ZW50IHRvIHRoZSBidXR0b24NCgkJCWlmIChlICYmIGUudHlwZSA9PSAibW91c2Vkb3duIiAmJiBET00uZ2V0UGFyZW50KGUudGFyZ2V0LCBmdW5jdGlvbihlKSB7cmV0dXJuIGUuaWQgPT09IHQuaWQgfHwgZS5pZCA9PT0gdC5pZCArICdfb3Blbic7fSkpDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiAoIWUgfHwgIURPTS5nZXRQYXJlbnQoZS50YXJnZXQsICcubWNlTWVudScpKSB7DQoJCQkJdC5zZXRTdGF0ZSgnU2VsZWN0ZWQnLCAwKTsNCgkJCQlFdmVudC5yZW1vdmUoRE9NLmRvYywgJ21vdXNlZG93bicsIHQuaGlkZU1lbnUsIHQpOw0KCQkJCWlmICh0Lm1lbnUpDQoJCQkJCXQubWVudS5oaWRlTWVudSgpOw0KCQkJfQ0KDQoJCQl0LmlzTWVudVZpc2libGUgPSAwOw0KCQl9LA0KDQoJCXBvc3RSZW5kZXIgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3M7DQoNCgkJCUV2ZW50LmFkZCh0LmlkLCAnY2xpY2snLCBmdW5jdGlvbigpIHsNCgkJCQlpZiAoIXQuaXNEaXNhYmxlZCgpKSB7DQoJCQkJCWlmIChzLm9uY2xpY2spDQoJCQkJCQlzLm9uY2xpY2sodC52YWx1ZSk7DQoNCgkJCQkJdC5zaG93TWVudSgpOw0KCQkJCX0NCgkJCX0pOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5TcGxpdEJ1dHRvbjp0aW55bWNlLnVpLk1lbnVCdXR0b24nLCB7DQoJCVNwbGl0QnV0dG9uIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXRoaXMucGFyZW50KGlkLCBzKTsNCgkJCXRoaXMuY2xhc3NQcmVmaXggPSAnbWNlU3BsaXRCdXR0b24nOw0KCQl9LA0KDQoJCXJlbmRlckhUTUwgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBoLCB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGgxOw0KDQoJCQloID0gJzx0Ym9keT48dHI+JzsNCg0KCQkJaWYgKHMuaW1hZ2UpDQoJCQkJaDEgPSBET00uY3JlYXRlSFRNTCgnaW1nICcsIHtzcmMgOiBzLmltYWdlLCAnY2xhc3MnIDogJ21jZUFjdGlvbiAnICsgc1snY2xhc3MnXX0pOw0KCQkJZWxzZQ0KCQkJCWgxID0gRE9NLmNyZWF0ZUhUTUwoJ3NwYW4nLCB7J2NsYXNzJyA6ICdtY2VBY3Rpb24gJyArIHNbJ2NsYXNzJ119LCAnJyk7DQoNCgkJCWggKz0gJzx0ZD4nICsgRE9NLmNyZWF0ZUhUTUwoJ2EnLCB7aWQgOiB0LmlkICsgJ19hY3Rpb24nLCBocmVmIDogJ2phdmFzY3JpcHQ6OycsICdjbGFzcycgOiAnbWNlQWN0aW9uICcgKyBzWydjbGFzcyddLCBvbmNsaWNrIDogInJldHVybiBmYWxzZTsiLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7JywgdGl0bGUgOiBzLnRpdGxlfSwgaDEpICsgJzwvdGQ+JzsNCgkNCgkJCWgxID0gRE9NLmNyZWF0ZUhUTUwoJ3NwYW4nLCB7J2NsYXNzJyA6ICdtY2VPcGVuICcgKyBzWydjbGFzcyddfSk7DQoJCQloICs9ICc8dGQ+JyArIERPTS5jcmVhdGVIVE1MKCdhJywge2lkIDogdC5pZCArICdfb3BlbicsIGhyZWYgOiAnamF2YXNjcmlwdDo7JywgJ2NsYXNzJyA6ICdtY2VPcGVuICcgKyBzWydjbGFzcyddLCBvbmNsaWNrIDogInJldHVybiBmYWxzZTsiLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7JywgdGl0bGUgOiBzLnRpdGxlfSwgaDEpICsgJzwvdGQ+JzsNCg0KCQkJaCArPSAnPC90cj48L3Rib2R5Pic7DQoNCgkJCXJldHVybiBET00uY3JlYXRlSFRNTCgndGFibGUnLCB7aWQgOiB0LmlkLCAnY2xhc3MnIDogJ21jZVNwbGl0QnV0dG9uIG1jZVNwbGl0QnV0dG9uRW5hYmxlZCAnICsgc1snY2xhc3MnXSwgY2VsbHBhZGRpbmcgOiAnMCcsIGNlbGxzcGFjaW5nIDogJzAnLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7JywgdGl0bGUgOiBzLnRpdGxlfSwgaCk7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJaWYgKHMub25jbGljaykgew0KCQkJCUV2ZW50LmFkZCh0LmlkICsgJ19hY3Rpb24nLCAnY2xpY2snLCBmdW5jdGlvbigpIHsNCgkJCQkJaWYgKCF0LmlzRGlzYWJsZWQoKSkNCgkJCQkJCXMub25jbGljayh0LnZhbHVlKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJRXZlbnQuYWRkKHQuaWQgKyAnX29wZW4nLCAnY2xpY2snLCB0LnNob3dNZW51LCB0KTsNCgkJCUV2ZW50LmFkZCh0LmlkICsgJ19vcGVuJywgJ2ZvY3VzJywgZnVuY3Rpb24oKSB7dC5fZm9jdXNlZCA9IDE7fSk7DQoJCQlFdmVudC5hZGQodC5pZCArICdfb3BlbicsICdibHVyJywgZnVuY3Rpb24oKSB7dC5fZm9jdXNlZCA9IDA7fSk7DQoNCgkJCS8vIE9sZCBJRSBkb2Vzbid0IGhhdmUgaG92ZXIgb24gYWxsIGVsZW1lbnRzDQoJCQlpZiAodGlueW1jZS5pc0lFNiB8fCAhRE9NLmJveE1vZGVsKSB7DQoJCQkJRXZlbnQuYWRkKHQuaWQsICdtb3VzZW92ZXInLCBmdW5jdGlvbigpIHsNCgkJCQkJaWYgKCFET00uaGFzQ2xhc3ModC5pZCwgJ21jZVNwbGl0QnV0dG9uRGlzYWJsZWQnKSkNCgkJCQkJCURPTS5hZGRDbGFzcyh0LmlkLCAnbWNlU3BsaXRCdXR0b25Ib3ZlcicpOw0KCQkJCX0pOw0KDQoJCQkJRXZlbnQuYWRkKHQuaWQsICdtb3VzZW91dCcsIGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoIURPTS5oYXNDbGFzcyh0LmlkLCAnbWNlU3BsaXRCdXR0b25EaXNhYmxlZCcpKQ0KCQkJCQkJRE9NLnJlbW92ZUNsYXNzKHQuaWQsICdtY2VTcGxpdEJ1dHRvbkhvdmVyJyk7DQoJCQkJfSk7DQoJCQl9DQoJCX0sDQoNCgkJZGVzdHJveSA6IGZ1bmN0aW9uKCkgew0KCQkJdGhpcy5wYXJlbnQoKTsNCg0KCQkJRXZlbnQuY2xlYXIodGhpcy5pZCArICdfYWN0aW9uJyk7DQoJCQlFdmVudC5jbGVhcih0aGlzLmlkICsgJ19vcGVuJyk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBET00gPSB0aW55bWNlLkRPTSwgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwgaXMgPSB0aW55bWNlLmlzLCBlYWNoID0gdGlueW1jZS5lYWNoOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuQ29sb3JTcGxpdEJ1dHRvbjp0aW55bWNlLnVpLlNwbGl0QnV0dG9uJywgew0KCQlDb2xvclNwbGl0QnV0dG9uIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5wYXJlbnQoaWQsIHMpOw0KDQoJCQl0LnNldHRpbmdzID0gcyA9IHRpbnltY2UuZXh0ZW5kKHsNCgkJCQljb2xvcnMgOiAnMDAwMDAwLDk5MzMwMCwzMzMzMDAsMDAzMzAwLDAwMzM2NiwwMDAwODAsMzMzMzk5LDMzMzMzMyw4MDAwMDAsRkY2NjAwLDgwODAwMCwwMDgwMDAsMDA4MDgwLDAwMDBGRiw2NjY2OTksODA4MDgwLEZGMDAwMCxGRjk5MDAsOTlDQzAwLDMzOTk2NiwzM0NDQ0MsMzM2NkZGLDgwMDA4MCw5OTk5OTksRkYwMEZGLEZGQ0MwMCxGRkZGMDAsMDBGRjAwLDAwRkZGRiwwMENDRkYsOTkzMzY2LEMwQzBDMCxGRjk5Q0MsRkZDQzk5LEZGRkY5OSxDQ0ZGQ0MsQ0NGRkZGLDk5Q0NGRixDQzk5RkYsRkZGRkZGJywNCgkJCQlncmlkX3dpZHRoIDogOCwNCgkJCQlkZWZhdWx0X2NvbG9yIDogJyM4ODg4ODgnDQoJCQl9LCB0LnNldHRpbmdzKTsNCg0KCQkJdC5vblNob3dNZW51ID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHQpOw0KDQoJCQl0Lm9uSGlkZU1lbnUgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodCk7DQoNCgkJCXQudmFsdWUgPSBzLmRlZmF1bHRfY29sb3I7DQoJCX0sDQoNCgkJc2hvd01lbnUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgciwgcCwgZSwgcDI7DQoNCgkJCWlmICh0LmlzRGlzYWJsZWQoKSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICghdC5pc01lbnVSZW5kZXJlZCkgew0KCQkJCXQucmVuZGVyTWVudSgpOw0KCQkJCXQuaXNNZW51UmVuZGVyZWQgPSB0cnVlOw0KCQkJfQ0KDQoJCQlpZiAodC5pc01lbnVWaXNpYmxlKQ0KCQkJCXJldHVybiB0LmhpZGVNZW51KCk7DQoNCgkJCWUgPSBET00uZ2V0KHQuaWQpOw0KCQkJRE9NLnNob3codC5pZCArICdfbWVudScpOw0KCQkJRE9NLmFkZENsYXNzKGUsICdtY2VTcGxpdEJ1dHRvblNlbGVjdGVkJyk7DQoJCQlwMiA9IERPTS5nZXRQb3MoZSk7DQoJCQlET00uc2V0U3R5bGVzKHQuaWQgKyAnX21lbnUnLCB7DQoJCQkJbGVmdCA6IHAyLngsDQoJCQkJdG9wIDogcDIueSArIGUuY2xpZW50SGVpZ2h0LA0KCQkJCXpJbmRleCA6IDIwMDAwMA0KCQkJfSk7DQoJCQllID0gMDsNCg0KCQkJRXZlbnQuYWRkKERPTS5kb2MsICdtb3VzZWRvd24nLCB0LmhpZGVNZW51LCB0KTsNCgkJCXQub25TaG93TWVudS5kaXNwYXRjaCh0KTsNCg0KCQkJaWYgKHQuX2ZvY3VzZWQpIHsNCgkJCQl0Ll9rZXlIYW5kbGVyID0gRXZlbnQuYWRkKHQuaWQgKyAnX21lbnUnLCAna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJaWYgKGUua2V5Q29kZSA9PSAyNykNCgkJCQkJCXQuaGlkZU1lbnUoKTsNCgkJCQl9KTsNCg0KCQkJCURPTS5zZWxlY3QoJ2EnLCB0LmlkICsgJ19tZW51JylbMF0uZm9jdXMoKTsgLy8gU2VsZWN0IGZpcnN0IGxpbmsNCgkJCX0NCg0KCQkJdC5pc01lbnVWaXNpYmxlID0gMTsNCgkJfSwNCg0KCQloaWRlTWVudSA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJLy8gUHJldmVudCBkb3VibGUgdG9vZ2xlcyBieSBjYW5jZWxpbmcgdGhlIG1vdXNlIGNsaWNrIGV2ZW50IHRvIHRoZSBidXR0b24NCgkJCWlmIChlICYmIGUudHlwZSA9PSAibW91c2Vkb3duIiAmJiBET00uZ2V0UGFyZW50KGUudGFyZ2V0LCBmdW5jdGlvbihlKSB7cmV0dXJuIGUuaWQgPT09IHQuaWQgKyAnX29wZW4nO30pKQ0KCQkJCXJldHVybjsNCg0KCQkJaWYgKCFlIHx8ICFET00uZ2V0UGFyZW50KGUudGFyZ2V0LCAnLm1jZVNwbGl0QnV0dG9uTWVudScpKSB7DQoJCQkJRE9NLnJlbW92ZUNsYXNzKHQuaWQsICdtY2VTcGxpdEJ1dHRvblNlbGVjdGVkJyk7DQoJCQkJRXZlbnQucmVtb3ZlKERPTS5kb2MsICdtb3VzZWRvd24nLCB0LmhpZGVNZW51LCB0KTsNCgkJCQlFdmVudC5yZW1vdmUodC5pZCArICdfbWVudScsICdrZXlkb3duJywgdC5fa2V5SGFuZGxlcik7DQoJCQkJRE9NLmhpZGUodC5pZCArICdfbWVudScpOw0KCQkJfQ0KDQoJCQl0Lm9uSGlkZU1lbnUuZGlzcGF0Y2godCk7DQoNCgkJCXQuaXNNZW51VmlzaWJsZSA9IDA7DQoJCX0sDQoNCgkJcmVuZGVyTWVudSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBtLCBpID0gMCwgcyA9IHQuc2V0dGluZ3MsIG4sIHRiLCB0ciwgdzsNCg0KCQkJdyA9IERPTS5hZGQocy5tZW51X2NvbnRhaW5lciwgJ2RpdicsIHtpZCA6IHQuaWQgKyAnX21lbnUnLCAnY2xhc3MnIDogc1snbWVudV9jbGFzcyddICsgJyAnICsgc1snY2xhc3MnXSwgc3R5bGUgOiAncG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDotMTAwMHB4Oyd9KTsNCgkJCW0gPSBET00uYWRkKHcsICdkaXYnLCB7J2NsYXNzJyA6IHNbJ2NsYXNzJ10gKyAnIG1jZVNwbGl0QnV0dG9uTWVudSd9KTsNCgkJCURPTS5hZGQobSwgJ3NwYW4nLCB7J2NsYXNzJyA6ICdtY2VNZW51TGluZSd9KTsNCg0KCQkJbiA9IERPTS5hZGQobSwgJ3RhYmxlJywgeydjbGFzcycgOiAnbWNlQ29sb3JTcGxpdE1lbnUnfSk7DQoJCQl0YiA9IERPTS5hZGQobiwgJ3Rib2R5Jyk7DQoNCgkJCS8vIEdlbmVyYXRlIGNvbG9yIGdyaWQNCgkJCWkgPSAwOw0KCQkJZWFjaChpcyhzLmNvbG9ycywgJ2FycmF5JykgPyBzLmNvbG9ycyA6IHMuY29sb3JzLnNwbGl0KCcsJyksIGZ1bmN0aW9uKGMpIHsNCgkJCQljID0gYy5yZXBsYWNlKC9eIy8sICcnKTsNCg0KCQkJCWlmICghaS0tKSB7DQoJCQkJCXRyID0gRE9NLmFkZCh0YiwgJ3RyJyk7DQoJCQkJCWkgPSBzLmdyaWRfd2lkdGggLSAxOw0KCQkJCX0NCg0KCQkJCW4gPSBET00uYWRkKHRyLCAndGQnKTsNCg0KCQkJCW4gPSBET00uYWRkKG4sICdhJywgew0KCQkJCQlocmVmIDogJ2phdmFzY3JpcHQ6OycsDQoJCQkJCXN0eWxlIDogew0KCQkJCQkJYmFja2dyb3VuZENvbG9yIDogJyMnICsgYw0KCQkJCQl9LA0KCQkJCQlfbWNlX2NvbG9yIDogJyMnICsgYw0KCQkJCX0pOw0KCQkJfSk7DQoNCgkJCWlmIChzLm1vcmVfY29sb3JzX2Z1bmMpIHsNCgkJCQluID0gRE9NLmFkZCh0YiwgJ3RyJyk7DQoJCQkJbiA9IERPTS5hZGQobiwgJ3RkJywge2NvbHNwYW4gOiBzLmdyaWRfd2lkdGgsICdjbGFzcycgOiAnbWNlTW9yZUNvbG9ycyd9KTsNCgkJCQluID0gRE9NLmFkZChuLCAnYScsIHtpZCA6IHQuaWQgKyAnX21vcmUnLCBocmVmIDogJ2phdmFzY3JpcHQ6OycsIG9uY2xpY2sgOiAncmV0dXJuIGZhbHNlOycsICdjbGFzcycgOiAnbWNlTW9yZUNvbG9ycyd9LCBzLm1vcmVfY29sb3JzX3RpdGxlKTsNCg0KCQkJCUV2ZW50LmFkZChuLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7DQoJCQkJCXMubW9yZV9jb2xvcnNfZnVuYy5jYWxsKHMubW9yZV9jb2xvcnNfc2NvcGUgfHwgdGhpcyk7DQoJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7IC8vIENhbmNlbCB0byBmaXggb25iZWZvcmV1bmxvYWQgcHJvYmxlbQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlET00uYWRkQ2xhc3MobSwgJ21jZUNvbG9yU3BsaXRNZW51Jyk7DQoNCgkJCUV2ZW50LmFkZCh0LmlkICsgJ19tZW51JywgJ2NsaWNrJywgZnVuY3Rpb24oZSkgew0KCQkJCXZhciBjOw0KDQoJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJaWYgKGUubm9kZU5hbWUgPT0gJ0EnICYmIChjID0gZS5nZXRBdHRyaWJ1dGUoJ19tY2VfY29sb3InKSkpDQoJCQkJCXQuc2V0Q29sb3IoYyk7DQoNCgkJCQlyZXR1cm4gRXZlbnQuY2FuY2VsKGUpOyAvLyBQcmV2ZW50IElFIGF1dG8gc2F2ZSB3YXJuaW5nDQoJCQl9KTsNCg0KCQkJcmV0dXJuIHc7DQoJCX0sDQoNCgkJc2V0Q29sb3IgOiBmdW5jdGlvbihjKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCURPTS5zZXRTdHlsZSh0LmlkICsgJ19wcmV2aWV3JywgJ2JhY2tncm91bmRDb2xvcicsIGMpOw0KDQoJCQl0LnZhbHVlID0gYzsNCgkJCXQuaGlkZU1lbnUoKTsNCgkJCXQuc2V0dGluZ3Mub25zZWxlY3QoYyk7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBpZCA9IHQuaWQ7DQoNCgkJCXQucGFyZW50KCk7DQoJCQlET00uYWRkKGlkICsgJ19hY3Rpb24nLCAnZGl2Jywge2lkIDogaWQgKyAnX3ByZXZpZXcnLCAnY2xhc3MnIDogJ21jZUNvbG9yUHJldmlldyd9KTsNCgkJCURPTS5zZXRTdHlsZSh0LmlkICsgJ19wcmV2aWV3JywgJ2JhY2tncm91bmRDb2xvcicsIHQudmFsdWUpOw0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbigpIHsNCgkJCXRoaXMucGFyZW50KCk7DQoNCgkJCUV2ZW50LmNsZWFyKHRoaXMuaWQgKyAnX21lbnUnKTsNCgkJCUV2ZW50LmNsZWFyKHRoaXMuaWQgKyAnX21vcmUnKTsNCgkJCURPTS5yZW1vdmUodGhpcy5pZCArICdfbWVudScpOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuVG9vbGJhcjp0aW55bWNlLnVpLkNvbnRhaW5lcicsIHsNCglyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCXZhciB0ID0gdGhpcywgaCA9ICcnLCBjLCBjbywgZG9tID0gdGlueW1jZS5ET00sIHMgPSB0LnNldHRpbmdzLCBpLCBwciwgbngsIGNsOw0KDQoJCWNsID0gdC5jb250cm9sczsNCgkJZm9yIChpPTA7IGk8Y2wubGVuZ3RoOyBpKyspIHsNCgkJCS8vIEdldCBjdXJyZW50IGNvbnRyb2wsIHByZXYgY29udHJvbCwgbmV4dCBjb250cm9sIGFuZCBpZiB0aGUgY29udHJvbCBpcyBhIGxpc3QgYm94IG9yIG5vdA0KCQkJY28gPSBjbFtpXTsNCgkJCXByID0gY2xbaSAtIDFdOw0KCQkJbnggPSBjbFtpICsgMV07DQoNCgkJCS8vIEFkZCB0b29sYmFyIHN0YXJ0DQoJCQlpZiAoaSA9PT0gMCkgew0KCQkJCWMgPSAnbWNlVG9vbGJhclN0YXJ0JzsNCg0KCQkJCWlmIChjby5CdXR0b24pDQoJCQkJCWMgKz0gJyBtY2VUb29sYmFyU3RhcnRCdXR0b24nOw0KCQkJCWVsc2UgaWYgKGNvLlNwbGl0QnV0dG9uKQ0KCQkJCQljICs9ICcgbWNlVG9vbGJhclN0YXJ0U3BsaXRCdXR0b24nOw0KCQkJCWVsc2UgaWYgKGNvLkxpc3RCb3gpDQoJCQkJCWMgKz0gJyBtY2VUb29sYmFyU3RhcnRMaXN0Qm94JzsNCg0KCQkJCWggKz0gZG9tLmNyZWF0ZUhUTUwoJ3RkJywgeydjbGFzcycgOiBjfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoJCQl9DQoNCgkJCS8vIEFkZCB0b29sYmFyIGVuZCBiZWZvcmUgbGlzdCBib3ggYW5kIGFmdGVyIHRoZSBwcmV2aW91cyBidXR0b24NCgkJCS8vIFRoaXMgaXMgdG8gZml4IHRoZSBvMms3IGVkaXRvciBza2lucw0KCQkJaWYgKHByICYmIGNvLkxpc3RCb3gpIHsNCgkJCQlpZiAocHIuQnV0dG9uIHx8IHByLlNwbGl0QnV0dG9uKQ0KCQkJCQloICs9IGRvbS5jcmVhdGVIVE1MKCd0ZCcsIHsnY2xhc3MnIDogJ21jZVRvb2xiYXJFbmQnfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoJCQl9DQoNCgkJCS8vIFJlbmRlciBjb250cm9sIEhUTUwNCg0KCQkJLy8gSUUgOCBxdWljayBmaXgsIG5lZWRlZCB0byBwcm9wZXJ0bHkgZ2VuZXJhdGUgYSBoaXQgYXJlYSBmb3IgYW5jaG9ycw0KCQkJaWYgKGRvbS5zdGRNb2RlKQ0KCQkJCWggKz0gJzx0ZCBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlIj4nICsgY28ucmVuZGVySFRNTCgpICsgJzwvdGQ+JzsNCgkJCWVsc2UNCgkJCQloICs9ICc8dGQ+JyArIGNvLnJlbmRlckhUTUwoKSArICc8L3RkPic7DQoNCgkJCS8vIEFkZCB0b29sYmFyIHN0YXJ0IGFmdGVyIGxpc3QgYm94IGFuZCBiZWZvcmUgdGhlIG5leHQgYnV0dG9uDQoJCQkvLyBUaGlzIGlzIHRvIGZpeCB0aGUgbzJrNyBlZGl0b3Igc2tpbnMNCgkJCWlmIChueCAmJiBjby5MaXN0Qm94KSB7DQoJCQkJaWYgKG54LkJ1dHRvbiB8fCBueC5TcGxpdEJ1dHRvbikNCgkJCQkJaCArPSBkb20uY3JlYXRlSFRNTCgndGQnLCB7J2NsYXNzJyA6ICdtY2VUb29sYmFyU3RhcnQnfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoJCQl9DQoJCX0NCg0KCQljID0gJ21jZVRvb2xiYXJFbmQnOw0KDQoJCWlmIChjby5CdXR0b24pDQoJCQljICs9ICcgbWNlVG9vbGJhckVuZEJ1dHRvbic7DQoJCWVsc2UgaWYgKGNvLlNwbGl0QnV0dG9uKQ0KCQkJYyArPSAnIG1jZVRvb2xiYXJFbmRTcGxpdEJ1dHRvbic7DQoJCWVsc2UgaWYgKGNvLkxpc3RCb3gpDQoJCQljICs9ICcgbWNlVG9vbGJhckVuZExpc3RCb3gnOw0KDQoJCWggKz0gZG9tLmNyZWF0ZUhUTUwoJ3RkJywgeydjbGFzcycgOiBjfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoNCgkJcmV0dXJuIGRvbS5jcmVhdGVIVE1MKCd0YWJsZScsIHtpZCA6IHQuaWQsICdjbGFzcycgOiAnbWNlVG9vbGJhcicgKyAoc1snY2xhc3MnXSA/ICcgJyArIHNbJ2NsYXNzJ10gOiAnJyksIGNlbGxwYWRkaW5nIDogJzAnLCBjZWxsc3BhY2luZyA6ICcwJywgYWxpZ24gOiB0LnNldHRpbmdzLmFsaWduIHx8ICcnfSwgJzx0Ym9keT48dHI+JyArIGggKyAnPC90cj48L3Rib2R5PicpOw0KCX0NCn0pOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXIsIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5BZGRPbk1hbmFnZXInLCB7DQoJCUFkZE9uTWFuYWdlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHNlbGYgPSB0aGlzOw0KDQoJCQlzZWxmLml0ZW1zID0gW107DQoJCQlzZWxmLnVybHMgPSB7fTsNCgkJCXNlbGYubG9va3VwID0ge307DQoJCQlzZWxmLm9uQWRkID0gbmV3IERpc3BhdGNoZXIoc2VsZik7DQoJCX0sDQoNCgkJZ2V0IDogZnVuY3Rpb24obikgew0KCQkJcmV0dXJuIHRoaXMubG9va3VwW25dOw0KCQl9LA0KDQoJCXJlcXVpcmVMYW5nUGFjayA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciBzID0gdGlueW1jZS5zZXR0aW5nczsNCg0KCQkJaWYgKHMgJiYgcy5sYW5ndWFnZSkNCgkJCQl0aW55bWNlLlNjcmlwdExvYWRlci5hZGQodGhpcy51cmxzW25dICsgJy9sYW5ncy8nICsgcy5sYW5ndWFnZSArICcuanMnKTsNCgkJfSwNCg0KCQlhZGQgOiBmdW5jdGlvbihpZCwgbykgew0KCQkJdGhpcy5pdGVtcy5wdXNoKG8pOw0KCQkJdGhpcy5sb29rdXBbaWRdID0gbzsNCgkJCXRoaXMub25BZGQuZGlzcGF0Y2godGhpcywgaWQsIG8pOw0KDQoJCQlyZXR1cm4gbzsNCgkJfSwNCg0KCQlsb2FkIDogZnVuY3Rpb24obiwgdSwgY2IsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKHQudXJsc1tuXSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICh1LmluZGV4T2YoJy8nKSAhPSAwICYmIHUuaW5kZXhPZignOi8vJykgPT0gLTEpDQoJCQkJdSA9IHRpbnltY2UuYmFzZVVSTCArICcvJyArICB1Ow0KDQoJCQl0LnVybHNbbl0gPSB1LnN1YnN0cmluZygwLCB1Lmxhc3RJbmRleE9mKCcvJykpOw0KDQoJCQlpZiAoIXQubG9va3VwW25dKQ0KCQkJCXRpbnltY2UuU2NyaXB0TG9hZGVyLmFkZCh1LCBjYiwgcyk7DQoJCX0NCgl9KTsNCg0KCS8vIENyZWF0ZSBwbHVnaW4gYW5kIHRoZW1lIG1hbmFnZXJzDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyID0gbmV3IHRpbnltY2UuQWRkT25NYW5hZ2VyKCk7DQoJdGlueW1jZS5UaGVtZU1hbmFnZXIgPSBuZXcgdGlueW1jZS5BZGRPbk1hbmFnZXIoKTsNCn0odGlueW1jZSkpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIFNob3J0ZW4gbmFtZXMNCgl2YXIgZWFjaCA9IHRpbnltY2UuZWFjaCwgZXh0ZW5kID0gdGlueW1jZS5leHRlbmQsDQoJCURPTSA9IHRpbnltY2UuRE9NLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LA0KCQlUaGVtZU1hbmFnZXIgPSB0aW55bWNlLlRoZW1lTWFuYWdlciwgUGx1Z2luTWFuYWdlciA9IHRpbnltY2UuUGx1Z2luTWFuYWdlciwNCgkJZXhwbG9kZSA9IHRpbnltY2UuZXhwbG9kZSwNCgkJRGlzcGF0Y2hlciA9IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyLCB1bmRlZmluZWQsIGluc3RhbmNlQ291bnRlciA9IDA7DQoNCgkvLyBTZXR1cCBzb21lIFVSTHMgd2hlcmUgdGhlIGVkaXRvciBBUEkgaXMgbG9jYXRlZCBhbmQgd2hlcmUgdGhlIGRvY3VtZW50IGlzDQoJdGlueW1jZS5kb2N1bWVudEJhc2VVUkwgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKC9bXD8jXS4qJC8sICcnKS5yZXBsYWNlKC9bXC9cXF1bXlwvXSskLywgJycpOw0KCWlmICghL1tcL1xcXSQvLnRlc3QodGlueW1jZS5kb2N1bWVudEJhc2VVUkwpKQ0KCQl0aW55bWNlLmRvY3VtZW50QmFzZVVSTCArPSAnLyc7DQoNCgl0aW55bWNlLmJhc2VVUkwgPSBuZXcgdGlueW1jZS51dGlsLlVSSSh0aW55bWNlLmRvY3VtZW50QmFzZVVSTCkudG9BYnNvbHV0ZSh0aW55bWNlLmJhc2VVUkwpOw0KDQoJdGlueW1jZS5iYXNlVVJJID0gbmV3IHRpbnltY2UudXRpbC5VUkkodGlueW1jZS5iYXNlVVJMKTsNCg0KCS8vIEFkZCBiZWZvcmUgdW5sb2FkIGxpc3RlbmVyDQoJLy8gVGhpcyB3YXMgcmVxdWlyZWQgc2luY2UgSUUgd2FzIGxlYWtpbmcgbWVtb3J5IGlmIHlvdSBhZGRlZCBhbmQgcmVtb3ZlZCBiZWZvcmV1bmxvYWQgbGlzdGVuZXJzDQoJLy8gd2l0aCBhdHRhY2hFdmVudC9kZXRhdGNoRXZlbnQgc28gdGhpcyBvbmx5IGFkZHMgb25lIGxpc3RlbmVyIGFuZCBpbnN0YW5jZXMgY2FuIHRoZSBhdHRhY2ggdG8gdGhlIG9uQmVmb3JlVW5sb2FkIGV2ZW50DQoJdGlueW1jZS5vbkJlZm9yZVVubG9hZCA9IG5ldyBEaXNwYXRjaGVyKHRpbnltY2UpOw0KDQoJLy8gTXVzdCBiZSBvbiB3aW5kb3cgb3IgSUUgd2lsbCBsZWFrIGlmIHRoZSBlZGl0b3IgaXMgcGxhY2VkIGluIGZyYW1lIG9yIGlmcmFtZQ0KCUV2ZW50LmFkZCh3aW5kb3csICdiZWZvcmV1bmxvYWQnLCBmdW5jdGlvbihlKSB7DQoJCXRpbnltY2Uub25CZWZvcmVVbmxvYWQuZGlzcGF0Y2godGlueW1jZSwgZSk7DQoJfSk7DQoNCgl0aW55bWNlLm9uQWRkRWRpdG9yID0gbmV3IERpc3BhdGNoZXIodGlueW1jZSk7DQoNCgl0aW55bWNlLm9uUmVtb3ZlRWRpdG9yID0gbmV3IERpc3BhdGNoZXIodGlueW1jZSk7DQoNCgl0aW55bWNlLkVkaXRvck1hbmFnZXIgPSBleHRlbmQodGlueW1jZSwgew0KCQllZGl0b3JzIDogW10sDQoNCgkJaTE4biA6IHt9LA0KDQoJCWFjdGl2ZUVkaXRvciA6IG51bGwsDQoNCgkJaW5pdCA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgcGwsIHNsID0gdGlueW1jZS5TY3JpcHRMb2FkZXIsIGUsIGVsID0gW10sIGVkOw0KDQoJCQlmdW5jdGlvbiBleGVjQ2FsbGJhY2soc2UsIG4sIHMpIHsNCgkJCQl2YXIgZiA9IHNlW25dOw0KDQoJCQkJaWYgKCFmKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlpZiAodGlueW1jZS5pcyhmLCAnc3RyaW5nJykpIHsNCgkJCQkJcyA9IGYucmVwbGFjZSgvXC5cdyskLywgJycpOw0KCQkJCQlzID0gcyA/IHRpbnltY2UucmVzb2x2ZShzKSA6IDA7DQoJCQkJCWYgPSB0aW55bWNlLnJlc29sdmUoZik7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGYuYXBwbHkocyB8fCB0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpKTsNCgkJCX07DQoNCgkJCXMgPSBleHRlbmQoew0KCQkJCXRoZW1lIDogInNpbXBsZSIsDQoJCQkJbGFuZ3VhZ2UgOiAiZW4iDQoJCQl9LCBzKTsNCg0KCQkJdC5zZXR0aW5ncyA9IHM7DQoNCgkJCS8vIExlZ2FjeSBjYWxsDQoJCQlFdmVudC5hZGQoZG9jdW1lbnQsICdpbml0JywgZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGwsIGNvOw0KDQoJCQkJZXhlY0NhbGxiYWNrKHMsICdvbnBhZ2Vsb2FkJyk7DQoNCgkJCQlzd2l0Y2ggKHMubW9kZSkgew0KCQkJCQljYXNlICJleGFjdCI6DQoJCQkJCQlsID0gcy5lbGVtZW50cyB8fCAnJzsNCg0KCQkJCQkJaWYobC5sZW5ndGggPiAwKSB7DQoJCQkJCQkJZWFjaChleHBsb2RlKGwpLCBmdW5jdGlvbih2KSB7DQoJCQkJCQkJCWlmIChET00uZ2V0KHYpKSB7DQoJCQkJCQkJCQllZCA9IG5ldyB0aW55bWNlLkVkaXRvcih2LCBzKTsNCgkJCQkJCQkJCWVsLnB1c2goZWQpOw0KCQkJCQkJCQkJZWQucmVuZGVyKDEpOw0KCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJZWFjaChkb2N1bWVudC5mb3JtcywgZnVuY3Rpb24oZikgew0KCQkJCQkJCQkJCWVhY2goZi5lbGVtZW50cywgZnVuY3Rpb24oZSkgew0KCQkJCQkJCQkJCQlpZiAoZS5uYW1lID09PSB2KSB7DQoJCQkJCQkJCQkJCQl2ID0gJ21jZV9lZGl0b3JfJyArIGluc3RhbmNlQ291bnRlcisrOw0KCQkJCQkJCQkJCQkJRE9NLnNldEF0dHJpYihlLCAnaWQnLCB2KTsNCg0KCQkJCQkJCQkJCQkJZWQgPSBuZXcgdGlueW1jZS5FZGl0b3Iodiwgcyk7DQoJCQkJCQkJCQkJCQllbC5wdXNoKGVkKTsNCgkJCQkJCQkJCQkJCWVkLnJlbmRlcigxKTsNCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCX0pOw0KCQkJCQkJCQkJfSk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9KTsNCgkJCQkJCX0NCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgInRleHRhcmVhcyI6DQoJCQkJCWNhc2UgInNwZWNpZmljX3RleHRhcmVhcyI6DQoJCQkJCQlmdW5jdGlvbiBoYXNDbGFzcyhuLCBjKSB7DQoJCQkJCQkJcmV0dXJuIGMuY29uc3RydWN0b3IgPT09IFJlZ0V4cCA/IGMudGVzdChuLmNsYXNzTmFtZSkgOiBET00uaGFzQ2xhc3MobiwgYyk7DQoJCQkJCQl9Ow0KDQoJCQkJCQllYWNoKERPTS5zZWxlY3QoJ3RleHRhcmVhJyksIGZ1bmN0aW9uKHYpIHsNCgkJCQkJCQlpZiAocy5lZGl0b3JfZGVzZWxlY3RvciAmJiBoYXNDbGFzcyh2LCBzLmVkaXRvcl9kZXNlbGVjdG9yKSkNCgkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJaWYgKCFzLmVkaXRvcl9zZWxlY3RvciB8fCBoYXNDbGFzcyh2LCBzLmVkaXRvcl9zZWxlY3RvcikpIHsNCgkJCQkJCQkJLy8gQ2FuIHdlIHVzZSB0aGUgbmFtZQ0KCQkJCQkJCQllID0gRE9NLmdldCh2Lm5hbWUpOw0KCQkJCQkJCQlpZiAoIXYuaWQgJiYgIWUpDQoJCQkJCQkJCQl2LmlkID0gdi5uYW1lOw0KDQoJCQkJCQkJCS8vIEdlbmVyYXRlIHVuaXF1ZSBuYW1lIGlmIG1pc3Npbmcgb3IgYWxyZWFkeSBleGlzdHMNCgkJCQkJCQkJaWYgKCF2LmlkIHx8IHQuZ2V0KHYuaWQpKQ0KCQkJCQkJCQkJdi5pZCA9IERPTS51bmlxdWVJZCgpOw0KDQoJCQkJCQkJCWVkID0gbmV3IHRpbnltY2UuRWRpdG9yKHYuaWQsIHMpOw0KCQkJCQkJCQllbC5wdXNoKGVkKTsNCgkJCQkJCQkJZWQucmVuZGVyKDEpOw0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJLy8gQ2FsbCBvbkluaXQgd2hlbiBhbGwgZWRpdG9ycyBhcmUgaW5pdGlhbGl6ZWQNCgkJCQlpZiAocy5vbmluaXQpIHsNCgkJCQkJbCA9IGNvID0gMDsNCg0KCQkJCQllYWNoKGVsLCBmdW5jdGlvbihlZCkgew0KCQkJCQkJY28rKzsNCg0KCQkJCQkJaWYgKCFlZC5pbml0aWFsaXplZCkgew0KCQkJCQkJCS8vIFdhaXQgZm9yIGl0DQoJCQkJCQkJZWQub25Jbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCQkJCQkJbCsrOw0KDQoJCQkJCQkJCS8vIEFsbCBkb25lDQoJCQkJCQkJCWlmIChsID09IGNvKQ0KCQkJCQkJCQkJZXhlY0NhbGxiYWNrKHMsICdvbmluaXQnKTsNCgkJCQkJCQl9KTsNCgkJCQkJCX0gZWxzZQ0KCQkJCQkJCWwrKzsNCg0KCQkJCQkJLy8gQWxsIGRvbmUNCgkJCQkJCWlmIChsID09IGNvKQ0KCQkJCQkJCWV4ZWNDYWxsYmFjayhzLCAnb25pbml0Jyk7CQkJCQkNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0IDogZnVuY3Rpb24oaWQpIHsNCgkJCWlmIChpZCA9PT0gdW5kZWZpbmVkKQ0KCQkJCXJldHVybiB0aGlzLmVkaXRvcnM7DQoNCgkJCXJldHVybiB0aGlzLmVkaXRvcnNbaWRdOw0KCQl9LA0KDQoJCWdldEluc3RhbmNlQnlJZCA6IGZ1bmN0aW9uKGlkKSB7DQoJCQlyZXR1cm4gdGhpcy5nZXQoaWQpOw0KCQl9LA0KDQoJCWFkZCA6IGZ1bmN0aW9uKGVkaXRvcikgew0KCQkJdmFyIHNlbGYgPSB0aGlzLCBlZGl0b3JzID0gc2VsZi5lZGl0b3JzOw0KDQoJCQkvLyBBZGQgbmFtZWQgYW5kIGluZGV4IGVkaXRvciBpbnN0YW5jZQ0KCQkJZWRpdG9yc1tlZGl0b3IuaWRdID0gZWRpdG9yOw0KCQkJZWRpdG9ycy5wdXNoKGVkaXRvcik7DQoNCgkJCXNlbGYuX3NldEFjdGl2ZShlZGl0b3IpOw0KCQkJc2VsZi5vbkFkZEVkaXRvci5kaXNwYXRjaChzZWxmLCBlZGl0b3IpOw0KDQoNCgkJCXJldHVybiBlZGl0b3I7DQoJCX0sDQoNCgkJcmVtb3ZlIDogZnVuY3Rpb24oZWRpdG9yKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGksIGVkaXRvcnMgPSB0LmVkaXRvcnM7DQoNCgkJCS8vIE5vdCBpbiB0aGUgY29sbGVjdGlvbg0KCQkJaWYgKCFlZGl0b3JzW2VkaXRvci5pZF0pDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCWRlbGV0ZSBlZGl0b3JzW2VkaXRvci5pZF07DQoNCgkJCWZvciAoaSA9IDA7IGkgPCBlZGl0b3JzLmxlbmd0aDsgaSsrKSB7DQoJCQkJaWYgKGVkaXRvcnNbaV0gPT0gZWRpdG9yKSB7DQoJCQkJCWVkaXRvcnMuc3BsaWNlKGksIDEpOw0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFNlbGVjdCBhbm90aGVyIGVkaXRvciBzaW5jZSB0aGUgYWN0aXZlIG9uZSB3YXMgcmVtb3ZlZA0KCQkJaWYgKHQuYWN0aXZlRWRpdG9yID09IGVkaXRvcikNCgkJCQl0Ll9zZXRBY3RpdmUoZWRpdG9yc1swXSk7DQoNCgkJCWVkaXRvci5kZXN0cm95KCk7DQoJCQl0Lm9uUmVtb3ZlRWRpdG9yLmRpc3BhdGNoKHQsIGVkaXRvcik7DQoNCgkJCXJldHVybiBlZGl0b3I7DQoJCX0sDQoNCgkJZXhlY0NvbW1hbmQgOiBmdW5jdGlvbihjLCB1LCB2KSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5nZXQodiksIHc7DQoNCgkJCS8vIE1hbmFnZXIgY29tbWFuZHMNCgkJCXN3aXRjaCAoYykgew0KCQkJCWNhc2UgIm1jZUZvY3VzIjoNCgkJCQkJZWQuZm9jdXMoKTsNCgkJCQkJcmV0dXJuIHRydWU7DQoNCgkJCQljYXNlICJtY2VBZGRFZGl0b3IiOg0KCQkJCWNhc2UgIm1jZUFkZENvbnRyb2wiOg0KCQkJCQlpZiAoIXQuZ2V0KHYpKQ0KCQkJCQkJbmV3IHRpbnltY2UuRWRpdG9yKHYsIHQuc2V0dGluZ3MpLnJlbmRlcigpOw0KDQoJCQkJCXJldHVybiB0cnVlOw0KDQoJCQkJY2FzZSAibWNlQWRkRnJhbWVDb250cm9sIjoNCgkJCQkJdyA9IHYud2luZG93Ow0KDQoJCQkJCS8vIEFkZCB0aW55TUNFIGdsb2JhbCBpbnN0YW5jZSBhbmQgdGlueW1jZSBuYW1lc3BhY2UgdG8gc3BlY2lmaWVkIHdpbmRvdw0KCQkJCQl3LnRpbnlNQ0UgPSB0aW55TUNFOw0KCQkJCQl3LnRpbnltY2UgPSB0aW55bWNlOw0KDQoJCQkJCXRpbnltY2UuRE9NLmRvYyA9IHcuZG9jdW1lbnQ7DQoJCQkJCXRpbnltY2UuRE9NLndpbiA9IHc7DQoNCgkJCQkJZWQgPSBuZXcgdGlueW1jZS5FZGl0b3Iodi5lbGVtZW50X2lkLCB2KTsNCgkJCQkJZWQucmVuZGVyKCk7DQoNCgkJCQkJLy8gRml4IElFIG1lbW9yeSBsZWFrcw0KCQkJCQlpZiAodGlueW1jZS5pc0lFKSB7DQoJCQkJCQlmdW5jdGlvbiBjbHIoKSB7DQoJCQkJCQkJZWQuZGVzdHJveSgpOw0KCQkJCQkJCXcuZGV0YWNoRXZlbnQoJ29udW5sb2FkJywgY2xyKTsNCgkJCQkJCQl3ID0gdy50aW55TUNFID0gdy50aW55bWNlID0gbnVsbDsgLy8gSUUgbGVhaw0KCQkJCQkJfTsNCg0KCQkJCQkJdy5hdHRhY2hFdmVudCgnb251bmxvYWQnLCBjbHIpOw0KCQkJCQl9DQoNCgkJCQkJdi5wYWdlX3dpbmRvdyA9IG51bGw7DQoNCgkJCQkJcmV0dXJuIHRydWU7DQoNCgkJCQljYXNlICJtY2VSZW1vdmVFZGl0b3IiOg0KCQkJCWNhc2UgIm1jZVJlbW92ZUNvbnRyb2wiOg0KCQkJCQlpZiAoZWQpDQoJCQkJCQllZC5yZW1vdmUoKTsNCg0KCQkJCQlyZXR1cm4gdHJ1ZTsNCg0KCQkJCWNhc2UgJ21jZVRvZ2dsZUVkaXRvcic6DQoJCQkJCWlmICghZWQpIHsNCgkJCQkJCXQuZXhlY0NvbW1hbmQoJ21jZUFkZENvbnRyb2wnLCAwLCB2KTsNCgkJCQkJCXJldHVybiB0cnVlOw0KCQkJCQl9DQoNCgkJCQkJaWYgKGVkLmlzSGlkZGVuKCkpDQoJCQkJCQllZC5zaG93KCk7DQoJCQkJCWVsc2UNCgkJCQkJCWVkLmhpZGUoKTsNCg0KCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCg0KCQkJLy8gUnVuIGNvbW1hbmQgb24gYWN0aXZlIGVkaXRvcg0KCQkJaWYgKHQuYWN0aXZlRWRpdG9yKQ0KCQkJCXJldHVybiB0LmFjdGl2ZUVkaXRvci5leGVjQ29tbWFuZChjLCB1LCB2KTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9LA0KDQoJCWV4ZWNJbnN0YW5jZUNvbW1hbmQgOiBmdW5jdGlvbihpZCwgYywgdSwgdikgew0KCQkJdmFyIGVkID0gdGhpcy5nZXQoaWQpOw0KDQoJCQlpZiAoZWQpDQoJCQkJcmV0dXJuIGVkLmV4ZWNDb21tYW5kKGMsIHUsIHYpOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0sDQoNCgkJdHJpZ2dlclNhdmUgOiBmdW5jdGlvbigpIHsNCgkJCWVhY2godGhpcy5lZGl0b3JzLCBmdW5jdGlvbihlKSB7DQoJCQkJZS5zYXZlKCk7DQoJCQl9KTsNCgkJfSwNCg0KCQlhZGRJMThuIDogZnVuY3Rpb24ocCwgbykgew0KCQkJdmFyIGxvLCBpMThuID0gdGhpcy5pMThuOw0KDQoJCQlpZiAoIXRpbnltY2UuaXMocCwgJ3N0cmluZycpKSB7DQoJCQkJZWFjaChwLCBmdW5jdGlvbihvLCBsYykgew0KCQkJCQllYWNoKG8sIGZ1bmN0aW9uKG8sIGcpIHsNCgkJCQkJCWVhY2gobywgZnVuY3Rpb24obywgaykgew0KCQkJCQkJCWlmIChnID09PSAnY29tbW9uJykNCgkJCQkJCQkJaTE4bltsYyArICcuJyArIGtdID0gbzsNCgkJCQkJCQllbHNlDQoJCQkJCQkJCWkxOG5bbGMgKyAnLicgKyBnICsgJy4nICsga10gPSBvOw0KCQkJCQkJfSk7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfSBlbHNlIHsNCgkJCQllYWNoKG8sIGZ1bmN0aW9uKG8sIGspIHsNCgkJCQkJaTE4bltwICsgJy4nICsga10gPSBvOw0KCQkJCX0pOw0KCQkJfQ0KCQl9LA0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KDQoJCV9zZXRBY3RpdmUgOiBmdW5jdGlvbihlZGl0b3IpIHsNCgkJCXRoaXMuc2VsZWN0ZWRJbnN0YW5jZSA9IHRoaXMuYWN0aXZlRWRpdG9yID0gZWRpdG9yOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgkvLyBTaG9ydGVuIHRoZXNlIG5hbWVzDQoJdmFyIERPTSA9IHRpbnltY2UuRE9NLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBleHRlbmQgPSB0aW55bWNlLmV4dGVuZCwNCgkJRGlzcGF0Y2hlciA9IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyLCBlYWNoID0gdGlueW1jZS5lYWNoLCBpc0dlY2tvID0gdGlueW1jZS5pc0dlY2tvLA0KCQlpc0lFID0gdGlueW1jZS5pc0lFLCBpc1dlYktpdCA9IHRpbnltY2UuaXNXZWJLaXQsIGlzID0gdGlueW1jZS5pcywNCgkJVGhlbWVNYW5hZ2VyID0gdGlueW1jZS5UaGVtZU1hbmFnZXIsIFBsdWdpbk1hbmFnZXIgPSB0aW55bWNlLlBsdWdpbk1hbmFnZXIsDQoJCWluQXJyYXkgPSB0aW55bWNlLmluQXJyYXksIGdyZXAgPSB0aW55bWNlLmdyZXAsIGV4cGxvZGUgPSB0aW55bWNlLmV4cGxvZGU7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5FZGl0b3InLCB7DQoJCUVkaXRvciA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQuaWQgPSB0LmVkaXRvcklkID0gaWQ7DQoNCgkJCXQuZXhlY0NvbW1hbmRzID0ge307DQoJCQl0LnF1ZXJ5U3RhdGVDb21tYW5kcyA9IHt9Ow0KCQkJdC5xdWVyeVZhbHVlQ29tbWFuZHMgPSB7fTsNCg0KCQkJdC5pc05vdERpcnR5ID0gZmFsc2U7DQoNCgkJCXQucGx1Z2lucyA9IHt9Ow0KDQoJCQkvLyBBZGQgZXZlbnRzIHRvIHRoZSBlZGl0b3INCgkJCWVhY2goWw0KCQkJCSdvblByZUluaXQnLA0KDQoJCQkJJ29uQmVmb3JlUmVuZGVyVUknLA0KDQoJCQkJJ29uUG9zdFJlbmRlcicsDQoNCgkJCQknb25Jbml0JywNCg0KCQkJCSdvblJlbW92ZScsDQoNCgkJCQknb25BY3RpdmF0ZScsDQoNCgkJCQknb25EZWFjdGl2YXRlJywNCg0KCQkJCSdvbkNsaWNrJywNCg0KCQkJCSdvbkV2ZW50JywNCg0KCQkJCSdvbk1vdXNlVXAnLA0KDQoJCQkJJ29uTW91c2VEb3duJywNCg0KCQkJCSdvbkRibENsaWNrJywNCg0KCQkJCSdvbktleURvd24nLA0KDQoJCQkJJ29uS2V5VXAnLA0KDQoJCQkJJ29uS2V5UHJlc3MnLA0KDQoJCQkJJ29uQ29udGV4dE1lbnUnLA0KDQoJCQkJJ29uU3VibWl0JywNCg0KCQkJCSdvblJlc2V0JywNCg0KCQkJCSdvblBhc3RlJywNCg0KCQkJCSdvblByZVByb2Nlc3MnLA0KDQoJCQkJJ29uUG9zdFByb2Nlc3MnLA0KDQoJCQkJJ29uQmVmb3JlU2V0Q29udGVudCcsDQoNCgkJCQknb25CZWZvcmVHZXRDb250ZW50JywNCg0KCQkJCSdvblNldENvbnRlbnQnLA0KDQoJCQkJJ29uR2V0Q29udGVudCcsDQoNCgkJCQknb25Mb2FkQ29udGVudCcsDQoNCgkJCQknb25TYXZlQ29udGVudCcsDQoNCgkJCQknb25Ob2RlQ2hhbmdlJywNCg0KCQkJCSdvbkNoYW5nZScsDQoNCgkJCQknb25CZWZvcmVFeGVjQ29tbWFuZCcsDQoNCgkJCQknb25FeGVjQ29tbWFuZCcsDQoNCgkJCQknb25VbmRvJywNCg0KCQkJCSdvblJlZG8nLA0KDQoJCQkJJ29uVmlzdWFsQWlkJywNCg0KCQkJCSdvblNldFByb2dyZXNzU3RhdGUnDQoJCQldLCBmdW5jdGlvbihlKSB7DQoJCQkJdFtlXSA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KCQkJfSk7DQoNCgkJCXQuc2V0dGluZ3MgPSBzID0gZXh0ZW5kKHsNCgkJCQlpZCA6IGlkLA0KCQkJCWxhbmd1YWdlIDogJ2VuJywNCgkJCQlkb2NzX2xhbmd1YWdlIDogJ2VuJywNCgkJCQl0aGVtZSA6ICdzaW1wbGUnLA0KCQkJCXNraW4gOiAnZGVmYXVsdCcsDQoJCQkJZGVsdGFfd2lkdGggOiAwLA0KCQkJCWRlbHRhX2hlaWdodCA6IDAsDQoJCQkJcG9wdXBfY3NzIDogJycsDQoJCQkJcGx1Z2lucyA6ICcnLA0KCQkJCWRvY3VtZW50X2Jhc2VfdXJsIDogdGlueW1jZS5kb2N1bWVudEJhc2VVUkwsDQoJCQkJYWRkX2Zvcm1fc3VibWl0X3RyaWdnZXIgOiAxLA0KCQkJCXN1Ym1pdF9wYXRjaCA6IDEsDQoJCQkJYWRkX3VubG9hZF90cmlnZ2VyIDogMSwNCgkJCQljb252ZXJ0X3VybHMgOiAxLA0KCQkJCXJlbGF0aXZlX3VybHMgOiAxLA0KCQkJCXJlbW92ZV9zY3JpcHRfaG9zdCA6IDEsDQoJCQkJdGFibGVfaW5saW5lX2VkaXRpbmcgOiAwLA0KCQkJCW9iamVjdF9yZXNpemluZyA6IDEsDQoJCQkJY2xlYW51cCA6IDEsDQoJCQkJYWNjZXNzaWJpbGl0eV9mb2N1cyA6IDEsDQoJCQkJY3VzdG9tX3Nob3J0Y3V0cyA6IDEsDQoJCQkJY3VzdG9tX3VuZG9fcmVkb19rZXlib2FyZF9zaG9ydGN1dHMgOiAxLA0KCQkJCWN1c3RvbV91bmRvX3JlZG9fcmVzdG9yZV9zZWxlY3Rpb24gOiAxLA0KCQkJCWN1c3RvbV91bmRvX3JlZG8gOiAxLA0KCQkJCWRvY3R5cGUgOiB0aW55bWNlLmlzSUU2ID8gJzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPicgOiAnPCFET0NUWVBFPicsIC8vIFVzZSBvbGQgZG9jdHlwZSBvbiBJRSA2IHRvIGF2b2lkIGhvcml6b250YWwgc2Nyb2xsDQoJCQkJdmlzdWFsX3RhYmxlX2NsYXNzIDogJ21jZUl0ZW1UYWJsZScsDQoJCQkJdmlzdWFsIDogMSwNCgkJCQlmb250X3NpemVfc3R5bGVfdmFsdWVzIDogJ3h4LXNtYWxsLHgtc21hbGwsc21hbGwsbWVkaXVtLGxhcmdlLHgtbGFyZ2UseHgtbGFyZ2UnLA0KCQkJCWFwcGx5X3NvdXJjZV9mb3JtYXR0aW5nIDogMSwNCgkJCQlkaXJlY3Rpb25hbGl0eSA6ICdsdHInLA0KCQkJCWZvcmNlZF9yb290X2Jsb2NrIDogJ3AnLA0KCQkJCXZhbGlkX2VsZW1lbnRzIDogJ0BbaWR8Y2xhc3N8c3R5bGV8dGl0bGV8ZGlyPGx0cj9ydGx8bGFuZ3x4bWw6Omxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ubW91c2Vkb3dufG9ubW91c2V1cHxvbm1vdXNlb3Zlcnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ua2V5cHJlc3N8b25rZXlkb3dufG9ua2V5dXBdLGFbcmVsfHJldnxjaGFyc2V0fGhyZWZsYW5nfHRhYmluZGV4fGFjY2Vzc2tleXx0eXBlfG5hbWV8aHJlZnx0YXJnZXR8dGl0bGV8Y2xhc3N8b25mb2N1c3xvbmJsdXJdLHN0cm9uZy9iLGVtL2ksc3RyaWtlLHUsI3AsLW9sW3R5cGV8Y29tcGFjdF0sLXVsW3R5cGV8Y29tcGFjdF0sLWxpLGJyLGltZ1tsb25nZGVzY3x1c2VtYXB8c3JjfGJvcmRlcnxhbHQ9fHRpdGxlfGhzcGFjZXx2c3BhY2V8d2lkdGh8aGVpZ2h0fGFsaWduXSwtc3ViLC1zdXAsLWJsb2NrcXVvdGVbY2l0ZV0sLXRhYmxlW2JvcmRlcnxjZWxsc3BhY2luZ3xjZWxscGFkZGluZ3x3aWR0aHxmcmFtZXxydWxlc3xoZWlnaHR8YWxpZ258c3VtbWFyeXxiZ2NvbG9yfGJhY2tncm91bmR8Ym9yZGVyY29sb3JdLC10cltyb3dzcGFufHdpZHRofGhlaWdodHxhbGlnbnx2YWxpZ258Ymdjb2xvcnxiYWNrZ3JvdW5kfGJvcmRlcmNvbG9yXSx0Ym9keSx0aGVhZCx0Zm9vdCwjdGRbY29sc3Bhbnxyb3dzcGFufHdpZHRofGhlaWdodHxhbGlnbnx2YWxpZ258Ymdjb2xvcnxiYWNrZ3JvdW5kfGJvcmRlcmNvbG9yfHNjb3BlXSwjdGhbY29sc3Bhbnxyb3dzcGFufHdpZHRofGhlaWdodHxhbGlnbnx2YWxpZ258c2NvcGVdLGNhcHRpb24sLWRpdiwtc3BhbiwtY29kZSwtcHJlLGFkZHJlc3MsLWgxLC1oMiwtaDMsLWg0LC1oNSwtaDYsaHJbc2l6ZXxub3NoYWRlXSwtZm9udFtmYWNlfHNpemV8Y29sb3JdLGRkLGRsLGR0LGNpdGUsYWJicixhY3JvbnltLGRlbFtkYXRldGltZXxjaXRlXSxpbnNbZGF0ZXRpbWV8Y2l0ZV0sb2JqZWN0W2NsYXNzaWR8d2lkdGh8aGVpZ2h0fGNvZGViYXNlfCpdLHBhcmFtW25hbWV8dmFsdWVdLGVtYmVkW3R5cGV8d2lkdGh8aGVpZ2h0fHNyY3wqXSxzY3JpcHRbc3JjfHR5cGVdLG1hcFtuYW1lXSxhcmVhW3NoYXBlfGNvb3Jkc3xocmVmfGFsdHx0YXJnZXRdLGJkbyxidXR0b24sY29sW2FsaWdufGNoYXJ8Y2hhcm9mZnxzcGFufHZhbGlnbnx3aWR0aF0sY29sZ3JvdXBbYWxpZ258Y2hhcnxjaGFyb2ZmfHNwYW58dmFsaWdufHdpZHRoXSxkZm4sZmllbGRzZXQsZm9ybVthY3Rpb258YWNjZXB0fGFjY2VwdC1jaGFyc2V0fGVuY3R5cGV8bWV0aG9kXSxpbnB1dFthY2NlcHR8YWx0fGNoZWNrZWR8ZGlzYWJsZWR8bWF4bGVuZ3RofG5hbWV8cmVhZG9ubHl8c2l6ZXxzcmN8dHlwZXx2YWx1ZXx0YWJpbmRleHxhY2Nlc3NrZXldLGtiZCxsYWJlbFtmb3JdLGxlZ2VuZCxub3NjcmlwdCxvcHRncm91cFtsYWJlbHxkaXNhYmxlZF0sb3B0aW9uW2Rpc2FibGVkfGxhYmVsfHNlbGVjdGVkfHZhbHVlXSxxW2NpdGVdLHNhbXAsc2VsZWN0W2Rpc2FibGVkfG11bHRpcGxlfG5hbWV8c2l6ZV0sc21hbGwsdGV4dGFyZWFbY29sc3xyb3dzfGRpc2FibGVkfG5hbWV8cmVhZG9ubHldLHR0LHZhcixiaWcnLA0KCQkJCWhpZGRlbl9pbnB1dCA6IDEsDQoJCQkJcGFkZF9lbXB0eV9lZGl0b3IgOiAxLA0KCQkJCXJlbmRlcl91aSA6IDEsDQoJCQkJaW5pdF90aGVtZSA6IDEsDQoJCQkJZm9yY2VfcF9uZXdsaW5lcyA6IDEsDQoJCQkJaW5kZW50YXRpb24gOiAnMzBweCcsDQoJCQkJa2VlcF9zdHlsZXMgOiAxLA0KCQkJCWZpeF90YWJsZV9lbGVtZW50cyA6IDEsDQoJCQkJaW5saW5lX3N0eWxlcyA6IDEsDQoJCQkJY29udmVydF9mb250c190b19zcGFucyA6IHRydWUNCgkJCX0sIHMpOw0KDQoJCQl0LmRvY3VtZW50QmFzZVVSSSA9IG5ldyB0aW55bWNlLnV0aWwuVVJJKHMuZG9jdW1lbnRfYmFzZV91cmwgfHwgdGlueW1jZS5kb2N1bWVudEJhc2VVUkwsIHsNCgkJCQliYXNlX3VyaSA6IHRpbnlNQ0UuYmFzZVVSSQ0KCQkJfSk7DQoNCgkJCXQuYmFzZVVSSSA9IHRpbnltY2UuYmFzZVVSSTsNCg0KCQkJLy8gQ2FsbCBzZXR1cA0KCQkJdC5leGVjQ2FsbGJhY2soJ3NldHVwJywgdCk7DQoJCX0sDQoNCgkJcmVuZGVyIDogZnVuY3Rpb24obnN0KSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBpZCA9IHQuaWQsIHNsID0gdGlueW1jZS5TY3JpcHRMb2FkZXI7DQoNCgkJCS8vIFBhZ2UgaXMgbm90IGxvYWRlZCB5ZXQsIHdhaXQgZm9yIGl0DQoJCQlpZiAoIUV2ZW50LmRvbUxvYWRlZCkgew0KCQkJCUV2ZW50LmFkZChkb2N1bWVudCwgJ2luaXQnLCBmdW5jdGlvbigpIHsNCgkJCQkJdC5yZW5kZXIoKTsNCgkJCQl9KTsNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCXRpbnlNQ0Uuc2V0dGluZ3MgPSBzOw0KDQoJCQkvLyBFbGVtZW50IG5vdCBmb3VuZCwgdGhlbiBza2lwIGluaXRpYWxpemF0aW9uDQoJCQlpZiAoIXQuZ2V0RWxlbWVudCgpKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gSXMgYSBpUGFkL2lQaG9uZSwgdGhlbiBza2lwIGluaXRpYWxpemF0aW9uLiBXZSBuZWVkIHRvIHNuaWZmIGhlcmUgc2luY2UgdGhlDQoJCQkvLyBicm93c2VyIHNheXMgaXQgaGFzIGNvbnRlbnRFZGl0YWJsZSBzdXBwb3J0IGJ1dCB0aGVyZSBpcyBubyB2aXNpYmxlIGNhcmV0DQoJCQkvLyBXZSB3aWxsIHJlbW92ZSB0aGlzIGNoZWNrIG9uZXMgQXBwbGUgaW1wbGVtZW50cyBmdWxsIGNvbnRlbnRFZGl0YWJsZSBzdXBwb3J0DQoJCQlpZiAodGlueW1jZS5pc0lEZXZpY2UpDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBBZGQgaGlkZGVuIGlucHV0IGZvciBub24gaW5wdXQgZWxlbWVudHMgaW5zaWRlIGZvcm0gZWxlbWVudHMNCgkJCWlmICghL1RFWFRBUkVBfElOUFVUL2kudGVzdCh0LmdldEVsZW1lbnQoKS5ub2RlTmFtZSkgJiYgcy5oaWRkZW5faW5wdXQgJiYgRE9NLmdldFBhcmVudChpZCwgJ2Zvcm0nKSkNCgkJCQlET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZSgnaW5wdXQnLCB7dHlwZSA6ICdoaWRkZW4nLCBuYW1lIDogaWR9KSwgaWQpOw0KDQoJCQlpZiAodGlueW1jZS5XaW5kb3dNYW5hZ2VyKQ0KCQkJCXQud2luZG93TWFuYWdlciA9IG5ldyB0aW55bWNlLldpbmRvd01hbmFnZXIodCk7DQoNCgkJCWlmIChzLmVuY29kaW5nID09ICd4bWwnKSB7DQoJCQkJdC5vbkdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCWlmIChvLnNhdmUpDQoJCQkJCQlvLmNvbnRlbnQgPSBET00uZW5jb2RlKG8uY29udGVudCk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmFkZF9mb3JtX3N1Ym1pdF90cmlnZ2VyKSB7DQoJCQkJdC5vblN1Ym1pdC5hZGRUb1RvcChmdW5jdGlvbigpIHsNCgkJCQkJaWYgKHQuaW5pdGlhbGl6ZWQpIHsNCgkJCQkJCXQuc2F2ZSgpOw0KCQkJCQkJdC5pc05vdERpcnR5ID0gMTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5hZGRfdW5sb2FkX3RyaWdnZXIpIHsNCgkJCQl0Ll9iZWZvcmVVbmxvYWQgPSB0aW55TUNFLm9uQmVmb3JlVW5sb2FkLmFkZChmdW5jdGlvbigpIHsNCgkJCQkJaWYgKHQuaW5pdGlhbGl6ZWQgJiYgIXQuZGVzdHJveWVkICYmICF0LmlzSGlkZGVuKCkpDQoJCQkJCQl0LnNhdmUoe2Zvcm1hdCA6ICdyYXcnLCBub19ldmVudHMgOiB0cnVlfSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXRpbnltY2UuYWRkVW5sb2FkKHQuZGVzdHJveSwgdCk7DQoNCgkJCWlmIChzLnN1Ym1pdF9wYXRjaCkgew0KCQkJCXQub25CZWZvcmVSZW5kZXJVSS5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCXZhciBuID0gdC5nZXRFbGVtZW50KCkuZm9ybTsNCg0KCQkJCQlpZiAoIW4pDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJLy8gQWxyZWFkeSBwYXRjaGVkDQoJCQkJCWlmIChuLl9tY2VPbGRTdWJtaXQpDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJLy8gQ2hlY2sgcGFnZSB1c2VzIGlkPSJzdWJtaXQiIG9yIG5hbWU9InN1Ym1pdCIgZm9yIGl0J3Mgc3VibWl0IGJ1dHRvbg0KCQkJCQlpZiAoIW4uc3VibWl0Lm5vZGVUeXBlICYmICFuLnN1Ym1pdC5sZW5ndGgpIHsNCgkJCQkJCXQuZm9ybUVsZW1lbnQgPSBuOw0KCQkJCQkJbi5fbWNlT2xkU3VibWl0ID0gbi5zdWJtaXQ7DQoJCQkJCQluLnN1Ym1pdCA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJCS8vIFNhdmUgYWxsIGluc3RhbmNlcw0KCQkJCQkJCXRpbnltY2UudHJpZ2dlclNhdmUoKTsNCgkJCQkJCQl0LmlzTm90RGlydHkgPSAxOw0KDQoJCQkJCQkJcmV0dXJuIHQuZm9ybUVsZW1lbnQuX21jZU9sZFN1Ym1pdCh0LmZvcm1FbGVtZW50KTsNCgkJCQkJCX07DQoJCQkJCX0NCg0KCQkJCQluID0gbnVsbDsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gTG9hZCBzY3JpcHRzDQoJCQlmdW5jdGlvbiBsb2FkU2NyaXB0cygpIHsNCgkJCQlpZiAocy5sYW5ndWFnZSkNCgkJCQkJc2wuYWRkKHRpbnltY2UuYmFzZVVSTCArICcvbGFuZ3MvJyArIHMubGFuZ3VhZ2UgKyAnLmpzJyk7DQoNCgkJCQlpZiAocy50aGVtZSAmJiBzLnRoZW1lLmNoYXJBdCgwKSAhPSAnLScgJiYgIVRoZW1lTWFuYWdlci51cmxzW3MudGhlbWVdKQ0KCQkJCQlUaGVtZU1hbmFnZXIubG9hZChzLnRoZW1lLCAndGhlbWVzLycgKyBzLnRoZW1lICsgJy9lZGl0b3JfdGVtcGxhdGUnICsgdGlueW1jZS5zdWZmaXggKyAnLmpzJyk7DQoNCgkJCQllYWNoKGV4cGxvZGUocy5wbHVnaW5zKSwgZnVuY3Rpb24ocCkgew0KCQkJCQlpZiAocCAmJiBwLmNoYXJBdCgwKSAhPSAnLScgJiYgIVBsdWdpbk1hbmFnZXIudXJsc1twXSkgew0KCQkJCQkJLy8gU2tpcCBzYWZhcmkgcGx1Z2luLCBzaW5jZSBpdCBpcyByZW1vdmVkIGFzIG9mIDMuM2IxDQoJCQkJCQlpZiAocCA9PSAnc2FmYXJpJykNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCVBsdWdpbk1hbmFnZXIubG9hZChwLCAncGx1Z2lucy8nICsgcCArICcvZWRpdG9yX3BsdWdpbicgKyB0aW55bWNlLnN1ZmZpeCArICcuanMnKTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJLy8gSW5pdCB3aGVuIHF1ZSBpcyBsb2FkZWQNCgkJCQlzbC5sb2FkUXVldWUoZnVuY3Rpb24oKSB7DQoJCQkJCWlmICghdC5yZW1vdmVkKQ0KCQkJCQkJdC5pbml0KCk7DQoJCQkJfSk7DQoJCQl9Ow0KDQoJCQlsb2FkU2NyaXB0cygpOw0KCQl9LA0KDQoJCWluaXQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBuLCB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIHcsIGgsIGUgPSB0LmdldEVsZW1lbnQoKSwgbywgdGksIHUsIGJpLCBiYywgcmU7DQoNCgkJCXRpbnltY2UuYWRkKHQpOw0KDQoJCQlpZiAocy50aGVtZSkgew0KCQkJCXMudGhlbWUgPSBzLnRoZW1lLnJlcGxhY2UoLy0vLCAnJyk7DQoJCQkJbyA9IFRoZW1lTWFuYWdlci5nZXQocy50aGVtZSk7DQoJCQkJdC50aGVtZSA9IG5ldyBvKCk7DQoNCgkJCQlpZiAodC50aGVtZS5pbml0ICYmIHMuaW5pdF90aGVtZSkNCgkJCQkJdC50aGVtZS5pbml0KHQsIFRoZW1lTWFuYWdlci51cmxzW3MudGhlbWVdIHx8IHRpbnltY2UuZG9jdW1lbnRCYXNlVVJMLnJlcGxhY2UoL1wvJC8sICcnKSk7DQoJCQl9DQoNCgkJCS8vIENyZWF0ZSBhbGwgcGx1Z2lucw0KCQkJZWFjaChleHBsb2RlKHMucGx1Z2lucy5yZXBsYWNlKC9cLS9nLCAnJykpLCBmdW5jdGlvbihwKSB7DQoJCQkJdmFyIGMgPSBQbHVnaW5NYW5hZ2VyLmdldChwKSwgdSA9IFBsdWdpbk1hbmFnZXIudXJsc1twXSB8fCB0aW55bWNlLmRvY3VtZW50QmFzZVVSTC5yZXBsYWNlKC9cLyQvLCAnJyksIHBvOw0KDQoJCQkJaWYgKGMpIHsNCgkJCQkJcG8gPSBuZXcgYyh0LCB1KTsNCg0KCQkJCQl0LnBsdWdpbnNbcF0gPSBwbzsNCg0KCQkJCQlpZiAocG8uaW5pdCkNCgkJCQkJCXBvLmluaXQodCwgdSk7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCS8vIFNldHVwIHBvcHVwIENTUyBwYXRoKHMpDQoJCQlpZiAocy5wb3B1cF9jc3MgIT09IGZhbHNlKSB7DQoJCQkJaWYgKHMucG9wdXBfY3NzKQ0KCQkJCQlzLnBvcHVwX2NzcyA9IHQuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUocy5wb3B1cF9jc3MpOw0KCQkJCWVsc2UNCgkJCQkJcy5wb3B1cF9jc3MgPSB0LmJhc2VVUkkudG9BYnNvbHV0ZSgidGhlbWVzLyIgKyBzLnRoZW1lICsgIi9za2lucy8iICsgcy5za2luICsgIi9kaWFsb2cuY3NzIik7DQoJCQl9DQoNCgkJCWlmIChzLnBvcHVwX2Nzc19hZGQpDQoJCQkJcy5wb3B1cF9jc3MgKz0gJywnICsgdC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShzLnBvcHVwX2Nzc19hZGQpOw0KDQoJCQl0LmNvbnRyb2xNYW5hZ2VyID0gbmV3IHRpbnltY2UuQ29udHJvbE1hbmFnZXIodCk7DQoNCgkJCWlmIChzLmN1c3RvbV91bmRvX3JlZG8pIHsNCgkJCQkvLyBBZGQgaW5pdGlhbCB1bmRvIGxldmVsDQoJCQkJdC5vbkJlZm9yZUV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihlZCwgY21kLCB1aSwgdmFsLCBhKSB7DQoJCQkJCWlmIChjbWQgIT0gJ1VuZG8nICYmIGNtZCAhPSAnUmVkbycgJiYgY21kICE9ICdtY2VSZXBhaW50JyAmJiAoIWEgfHwgIWEuc2tpcF91bmRvKSkgew0KCQkJCQkJaWYgKCF0LnVuZG9NYW5hZ2VyLmhhc1VuZG8oKSkNCgkJCQkJCQl0LnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQl0Lm9uRXhlY0NvbW1hbmQuYWRkKGZ1bmN0aW9uKGVkLCBjbWQsIHVpLCB2YWwsIGEpIHsNCgkJCQkJaWYgKGNtZCAhPSAnVW5kbycgJiYgY21kICE9ICdSZWRvJyAmJiBjbWQgIT0gJ21jZVJlcGFpbnQnICYmICghYSB8fCAhYS5za2lwX3VuZG8pKQ0KCQkJCQkJdC51bmRvTWFuYWdlci5hZGQoKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJdC5vbkV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihlZCwgYykgew0KCQkJCS8vIERvbid0IHJlZnJlc2ggdGhlIHNlbGVjdCBsaXN0cyB1bnRpbCBjYXJldCBtb3ZlDQoJCQkJaWYgKCEvXihGb250TmFtZXxGb250U2l6ZSkkLy50ZXN0KGMpKQ0KCQkJCQl0Lm5vZGVDaGFuZ2VkKCk7DQoJCQl9KTsNCg0KCQkJLy8gUmVtb3ZlIGdob3N0IHNlbGVjdGlvbnMgb24gaW1hZ2VzIGFuZCB0YWJsZXMgaW4gR2Vja28NCgkJCWlmIChpc0dlY2tvKSB7DQoJCQkJZnVuY3Rpb24gcmVwYWludChhLCBvKSB7DQoJCQkJCWlmICghbyB8fCAhby5pbml0aWFsKQ0KCQkJCQkJdC5leGVjQ29tbWFuZCgnbWNlUmVwYWludCcpOw0KCQkJCX07DQoNCgkJCQl0Lm9uVW5kby5hZGQocmVwYWludCk7DQoJCQkJdC5vblJlZG8uYWRkKHJlcGFpbnQpOw0KCQkJCXQub25TZXRDb250ZW50LmFkZChyZXBhaW50KTsNCgkJCX0NCg0KCQkJLy8gRW5hYmxlcyB1c2VycyB0byBvdmVycmlkZSB0aGUgY29udHJvbCBmYWN0b3J5DQoJCQl0Lm9uQmVmb3JlUmVuZGVyVUkuZGlzcGF0Y2godCwgdC5jb250cm9sTWFuYWdlcik7DQoNCgkJCS8vIE1lYXN1cmUgYm94DQoJCQlpZiAocy5yZW5kZXJfdWkpIHsNCgkJCQl3ID0gcy53aWR0aCB8fCBlLnN0eWxlLndpZHRoIHx8IGUub2Zmc2V0V2lkdGg7DQoJCQkJaCA9IHMuaGVpZ2h0IHx8IGUuc3R5bGUuaGVpZ2h0IHx8IGUub2Zmc2V0SGVpZ2h0Ow0KCQkJCXQub3JnRGlzcGxheSA9IGUuc3R5bGUuZGlzcGxheTsNCgkJCQlyZSA9IC9eWzAtOVwuXSsofHB4KSQvaTsNCg0KCQkJCWlmIChyZS50ZXN0KCcnICsgdykpDQoJCQkJCXcgPSBNYXRoLm1heChwYXJzZUludCh3KSArIChvLmRlbHRhV2lkdGggfHwgMCksIDEwMCk7DQoNCgkJCQlpZiAocmUudGVzdCgnJyArIGgpKQ0KCQkJCQloID0gTWF0aC5tYXgocGFyc2VJbnQoaCkgKyAoby5kZWx0YUhlaWdodCB8fCAwKSwgMTAwKTsNCg0KCQkJCS8vIFJlbmRlciBVSQ0KCQkJCW8gPSB0LnRoZW1lLnJlbmRlclVJKHsNCgkJCQkJdGFyZ2V0Tm9kZSA6IGUsDQoJCQkJCXdpZHRoIDogdywNCgkJCQkJaGVpZ2h0IDogaCwNCgkJCQkJZGVsdGFXaWR0aCA6IHMuZGVsdGFfd2lkdGgsDQoJCQkJCWRlbHRhSGVpZ2h0IDogcy5kZWx0YV9oZWlnaHQNCgkJCQl9KTsNCg0KCQkJCXQuZWRpdG9yQ29udGFpbmVyID0gby5lZGl0b3JDb250YWluZXI7DQoJCQl9DQoNCg0KCQkJLy8gVXNlciBzcGVjaWZpZWQgYSBkb2N1bWVudC5kb21haW4gdmFsdWUNCgkJCWlmIChkb2N1bWVudC5kb21haW4gJiYgbG9jYXRpb24uaG9zdG5hbWUgIT0gZG9jdW1lbnQuZG9tYWluKQ0KCQkJCXRpbnltY2UucmVsYXhlZERvbWFpbiA9IGRvY3VtZW50LmRvbWFpbjsNCg0KCQkJLy8gUmVzaXplIGVkaXRvcg0KCQkJRE9NLnNldFN0eWxlcyhvLnNpemVDb250YWluZXIgfHwgby5lZGl0b3JDb250YWluZXIsIHsNCgkJCQl3aWR0aCA6IHcsDQoJCQkJaGVpZ2h0IDogaA0KCQkJfSk7DQoNCgkJCWggPSAoby5pZnJhbWVIZWlnaHQgfHwgaCkgKyAodHlwZW9mKGgpID09ICdudW1iZXInID8gKG8uZGVsdGFIZWlnaHQgfHwgMCkgOiAnJyk7DQoJCQlpZiAoaCA8IDEwMCkNCgkJCQloID0gMTAwOw0KDQoJCQl0LmlmcmFtZUhUTUwgPSBzLmRvY3R5cGUgKyAnPGh0bWw+PGhlYWQgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPic7DQoNCgkJCS8vIFdlIG9ubHkgbmVlZCB0byBvdmVycmlkZSBwYXRocyBpZiB3ZSBoYXZlIHRvDQoJCQkvLyBJRSBoYXMgYSBidWcgd2hlcmUgaXQgcmVtb3ZlIHNpdGUgYWJzb2x1dGUgdXJscyB0byByZWxhdGl2ZSBvbmVzIGlmIHRoaXMgaXMgc3BlY2lmaWVkDQoJCQlpZiAocy5kb2N1bWVudF9iYXNlX3VybCAhPSB0aW55bWNlLmRvY3VtZW50QmFzZVVSTCkNCgkJCQl0LmlmcmFtZUhUTUwgKz0gJzxiYXNlIGhyZWY9IicgKyB0LmRvY3VtZW50QmFzZVVSSS5nZXRVUkkoKSArICciIC8+JzsNCg0KCQkJdC5pZnJhbWVIVE1MICs9ICc8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPTciIC8+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+JzsNCg0KCQkJaWYgKHRpbnltY2UucmVsYXhlZERvbWFpbikNCgkJCQl0LmlmcmFtZUhUTUwgKz0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kb2N1bWVudC5kb21haW4gPSAiJyArIHRpbnltY2UucmVsYXhlZERvbWFpbiArICciOzwvc2NyaXB0Pic7DQoNCgkJCWJpID0gcy5ib2R5X2lkIHx8ICd0aW55bWNlJzsNCgkJCWlmIChiaS5pbmRleE9mKCc9JykgIT0gLTEpIHsNCgkJCQliaSA9IHQuZ2V0UGFyYW0oJ2JvZHlfaWQnLCAnJywgJ2hhc2gnKTsNCgkJCQliaSA9IGJpW3QuaWRdIHx8IGJpOw0KCQkJfQ0KDQoJCQliYyA9IHMuYm9keV9jbGFzcyB8fCAnJzsNCgkJCWlmIChiYy5pbmRleE9mKCc9JykgIT0gLTEpIHsNCgkJCQliYyA9IHQuZ2V0UGFyYW0oJ2JvZHlfY2xhc3MnLCAnJywgJ2hhc2gnKTsNCgkJCQliYyA9IGJjW3QuaWRdIHx8ICcnOw0KCQkJfQ0KDQoJCQl0LmlmcmFtZUhUTUwgKz0gJzwvaGVhZD48Ym9keSBpZD0iJyArIGJpICsgJyIgY2xhc3M9Im1jZUNvbnRlbnRCb2R5ICcgKyBiYyArICciPjwvYm9keT48L2h0bWw+JzsNCg0KCQkJLy8gRG9tYWluIHJlbGF4aW5nIGVuYWJsZWQsIHRoZW4gc2V0IGRvY3VtZW50IGRvbWFpbg0KCQkJaWYgKHRpbnltY2UucmVsYXhlZERvbWFpbikgew0KCQkJCS8vIFdlIG5lZWQgdG8gd3JpdGUgdGhlIGNvbnRlbnRzIGhlcmUgaW4gSUUgc2luY2UgbXVsdGlwbGUgd3JpdGVzIG1lc3NlcyB1cCByZWZyZXNoIGJ1dHRvbiBhbmQgYmFjayBidXR0b24NCgkJCQlpZiAoaXNJRSB8fCAodGlueW1jZS5pc09wZXJhICYmIHBhcnNlRmxvYXQob3BlcmEudmVyc2lvbigpKSA+PSA5LjUpKQ0KCQkJCQl1ID0gJ2phdmFzY3JpcHQ6KGZ1bmN0aW9uKCl7ZG9jdW1lbnQub3BlbigpO2RvY3VtZW50LmRvbWFpbj0iJyArIGRvY3VtZW50LmRvbWFpbiArICciO3ZhciBlZCA9IHdpbmRvdy5wYXJlbnQudGlueU1DRS5nZXQoIicgKyB0LmlkICsgJyIpO2RvY3VtZW50LndyaXRlKGVkLmlmcmFtZUhUTUwpO2RvY3VtZW50LmNsb3NlKCk7ZWQuc2V0dXBJZnJhbWUoKTt9KSgpJzsNCgkJCQllbHNlIGlmICh0aW55bWNlLmlzT3BlcmEpDQoJCQkJCXUgPSAnamF2YXNjcmlwdDooZnVuY3Rpb24oKXtkb2N1bWVudC5vcGVuKCk7ZG9jdW1lbnQuZG9tYWluPSInICsgZG9jdW1lbnQuZG9tYWluICsgJyI7ZG9jdW1lbnQuY2xvc2UoKTtlZC5zZXR1cElmcmFtZSgpO30pKCknOwkJCQkJDQoJCQl9DQoNCgkJCS8vIENyZWF0ZSBpZnJhbWUNCgkJCW4gPSBET00uYWRkKG8uaWZyYW1lQ29udGFpbmVyLCAnaWZyYW1lJywgew0KCQkJCWlkIDogdC5pZCArICJfaWZyIiwNCgkJCQlzcmMgOiB1IHx8ICdqYXZhc2NyaXB0OiIiJywgLy8gV29ya2Fyb3VuZCBmb3IgSFRUUFMgd2FybmluZyBpbiBJRTYvNw0KCQkJCWZyYW1lQm9yZGVyIDogJzAnLA0KCQkJCXN0eWxlIDogew0KCQkJCQl3aWR0aCA6ICcxMDAlJywNCgkJCQkJaGVpZ2h0IDogaA0KCQkJCX0NCgkJCX0pOw0KDQoJCQl0LmNvbnRlbnRBcmVhQ29udGFpbmVyID0gby5pZnJhbWVDb250YWluZXI7DQoJCQlET00uZ2V0KG8uZWRpdG9yQ29udGFpbmVyKS5zdHlsZS5kaXNwbGF5ID0gdC5vcmdEaXNwbGF5Ow0KCQkJRE9NLmdldCh0LmlkKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KDQoJCQlpZiAoIWlzSUUgfHwgIXRpbnltY2UucmVsYXhlZERvbWFpbikNCgkJCQl0LnNldHVwSWZyYW1lKCk7DQoNCgkJCWUgPSBuID0gbyA9IG51bGw7IC8vIENsZWFudXANCgkJfSwNCg0KCQlzZXR1cElmcmFtZSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgZSA9IERPTS5nZXQodC5pZCksIGQgPSB0LmdldERvYygpLCBoLCBiOw0KDQoJCQkvLyBTZXR1cCBpZnJhbWUgYm9keQ0KCQkJaWYgKCFpc0lFIHx8ICF0aW55bWNlLnJlbGF4ZWREb21haW4pIHsNCgkJCQlkLm9wZW4oKTsNCgkJCQlkLndyaXRlKHQuaWZyYW1lSFRNTCk7DQoJCQkJZC5jbG9zZSgpOw0KCQkJfQ0KDQoJCQkvLyBEZXNpZ24gbW9kZSBuZWVkcyB0byBiZSBhZGRlZCBoZXJlIEN0cmwrQSB3aWxsIGZhaWwgb3RoZXJ3aXNlDQoJCQlpZiAoIWlzSUUpIHsNCgkJCQl0cnkgew0KCQkJCQlpZiAoIXMucmVhZG9ubHkpDQoJCQkJCQlkLmRlc2lnbk1vZGUgPSAnT24nOw0KCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCS8vIFdpbGwgZmFpbCBvbiBHZWNrbyBpZiB0aGUgZWRpdG9yIGlzIHBsYWNlZCBpbiBhbiBoaWRkZW4gY29udGFpbmVyIGVsZW1lbnQNCgkJCQkJLy8gVGhlIGRlc2lnbiBtb2RlIHdpbGwgYmUgc2V0IG9uZXMgdGhlIGVkaXRvciBpcyBmb2N1c2VkDQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBJRSBuZWVkcyB0byB1c2UgY29udGVudEVkaXRhYmxlIG9yIGl0IHdpbGwgZGlzcGxheSBub24gc2VjdXJlIGl0ZW1zIGZvciBIVFRQUw0KCQkJaWYgKGlzSUUpIHsNCgkJCQkvLyBJdCB3aWxsIG5vdCBzdGVhbCBmb2N1cyBpZiB3ZSBoaWRlIGl0IHdoaWxlIHNldHRpbmcgY29udGVudEVkaXRhYmxlDQoJCQkJYiA9IHQuZ2V0Qm9keSgpOw0KCQkJCURPTS5oaWRlKGIpOw0KDQoJCQkJaWYgKCFzLnJlYWRvbmx5KQ0KCQkJCQliLmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7DQoNCgkJCQlET00uc2hvdyhiKTsNCgkJCX0NCg0KCQkJdC5kb20gPSBuZXcgdGlueW1jZS5kb20uRE9NVXRpbHModC5nZXREb2MoKSwgew0KCQkJCWtlZXBfdmFsdWVzIDogdHJ1ZSwNCgkJCQl1cmxfY29udmVydGVyIDogdC5jb252ZXJ0VVJMLA0KCQkJCXVybF9jb252ZXJ0ZXJfc2NvcGUgOiB0LA0KCQkJCWhleF9jb2xvcnMgOiBzLmZvcmNlX2hleF9zdHlsZV9jb2xvcnMsDQoJCQkJY2xhc3NfZmlsdGVyIDogcy5jbGFzc19maWx0ZXIsDQoJCQkJdXBkYXRlX3N0eWxlcyA6IDEsDQoJCQkJZml4X2llX3BhcmFncmFwaHMgOiAxLA0KCQkJCXZhbGlkX3N0eWxlcyA6IHMudmFsaWRfc3R5bGVzDQoJCQl9KTsNCg0KCQkJdC5zY2hlbWEgPSBuZXcgdGlueW1jZS5kb20uU2NoZW1hKCk7DQoNCgkJCXQuc2VyaWFsaXplciA9IG5ldyB0aW55bWNlLmRvbS5TZXJpYWxpemVyKGV4dGVuZChzLCB7DQoJCQkJdmFsaWRfZWxlbWVudHMgOiBzLnZlcmlmeV9odG1sID09PSBmYWxzZSA/ICcqWypdJyA6IHMudmFsaWRfZWxlbWVudHMsDQoJCQkJZG9tIDogdC5kb20sDQoJCQkJc2NoZW1hIDogdC5zY2hlbWENCgkJCX0pKTsNCg0KCQkJdC5zZWxlY3Rpb24gPSBuZXcgdGlueW1jZS5kb20uU2VsZWN0aW9uKHQuZG9tLCB0LmdldFdpbigpLCB0LnNlcmlhbGl6ZXIpOw0KDQoJCQl0LmZvcm1hdHRlciA9IG5ldyB0aW55bWNlLkZvcm1hdHRlcih0aGlzKTsNCg0KCQkJLy8gUmVnaXN0ZXIgZGVmYXVsdCBmb3JtYXRzDQoJCQl0LmZvcm1hdHRlci5yZWdpc3Rlcih7DQoJCQkJYWxpZ25sZWZ0IDogWw0KCQkJCQl7c2VsZWN0b3IgOiAncCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGknLCBzdHlsZXMgOiB7dGV4dEFsaWduIDogJ2xlZnQnfX0sDQoJCQkJCXtzZWxlY3RvciA6ICdpbWcsdGFibGUnLCBzdHlsZXMgOiB7J2Zsb2F0JyA6ICdsZWZ0J319DQoJCQkJXSwNCg0KCQkJCWFsaWduY2VudGVyIDogWw0KCQkJCQl7c2VsZWN0b3IgOiAncCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGknLCBzdHlsZXMgOiB7dGV4dEFsaWduIDogJ2NlbnRlcid9fSwNCgkJCQkJe3NlbGVjdG9yIDogJ2ltZycsIHN0eWxlcyA6IHtkaXNwbGF5IDogJ2Jsb2NrJywgbWFyZ2luTGVmdCA6ICdhdXRvJywgbWFyZ2luUmlnaHQgOiAnYXV0byd9fSwNCgkJCQkJe3NlbGVjdG9yIDogJ3RhYmxlJywgc3R5bGVzIDoge21hcmdpbkxlZnQgOiAnYXV0bycsIG1hcmdpblJpZ2h0IDogJ2F1dG8nfX0NCgkJCQldLA0KDQoJCQkJYWxpZ25yaWdodCA6IFsNCgkJCQkJe3NlbGVjdG9yIDogJ3AsaDEsaDIsaDMsaDQsaDUsaDYsdGQsdGgsZGl2LHVsLG9sLGxpJywgc3R5bGVzIDoge3RleHRBbGlnbiA6ICdyaWdodCd9fSwNCgkJCQkJe3NlbGVjdG9yIDogJ2ltZyx0YWJsZScsIHN0eWxlcyA6IHsnZmxvYXQnIDogJ3JpZ2h0J319DQoJCQkJXSwNCg0KCQkJCWFsaWduZnVsbCA6IFsNCgkJCQkJe3NlbGVjdG9yIDogJ3AsaDEsaDIsaDMsaDQsaDUsaDYsdGQsdGgsZGl2LHVsLG9sLGxpJywgc3R5bGVzIDoge3RleHRBbGlnbiA6ICdqdXN0aWZ5J319DQoJCQkJXSwNCg0KCQkJCWJvbGQgOiBbDQoJCQkJCXtpbmxpbmUgOiAnc3Ryb25nJ30sDQoJCQkJCXtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHtmb250V2VpZ2h0IDogJ2JvbGQnfX0sDQoJCQkJCXtpbmxpbmUgOiAnYid9DQoJCQkJXSwNCg0KCQkJCWl0YWxpYyA6IFsNCgkJCQkJe2lubGluZSA6ICdlbSd9LA0KCQkJCQl7aW5saW5lIDogJ3NwYW4nLCBzdHlsZXMgOiB7Zm9udFN0eWxlIDogJ2l0YWxpYyd9fSwNCgkJCQkJe2lubGluZSA6ICdpJ30NCgkJCQldLA0KDQoJCQkJdW5kZXJsaW5lIDogWw0KCQkJCQl7aW5saW5lIDogJ3NwYW4nLCBzdHlsZXMgOiB7dGV4dERlY29yYXRpb24gOiAndW5kZXJsaW5lJ30sIGV4YWN0IDogdHJ1ZX0sDQoJCQkJCXtpbmxpbmUgOiAndSd9DQoJCQkJXSwNCg0KCQkJCXN0cmlrZXRocm91Z2ggOiBbDQoJCQkJCXtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHt0ZXh0RGVjb3JhdGlvbiA6ICdsaW5lLXRocm91Z2gnfSwgZXhhY3QgOiB0cnVlfSwNCgkJCQkJe2lubGluZSA6ICd1J30NCgkJCQldLA0KDQoJCQkJZm9yZWNvbG9yIDoge2lubGluZSA6ICdzcGFuJywgc3R5bGVzIDoge2NvbG9yIDogJyV2YWx1ZSd9LCB3cmFwX2xpbmtzIDogZmFsc2V9LA0KCQkJCWhpbGl0ZWNvbG9yIDoge2lubGluZSA6ICdzcGFuJywgc3R5bGVzIDoge2JhY2tncm91bmRDb2xvciA6ICcldmFsdWUnfSwgd3JhcF9saW5rcyA6IGZhbHNlfSwNCgkJCQlmb250bmFtZSA6IHtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHtmb250RmFtaWx5IDogJyV2YWx1ZSd9fSwNCgkJCQlmb250c2l6ZSA6IHtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHtmb250U2l6ZSA6ICcldmFsdWUnfX0sDQoJCQkJZm9udHNpemVfY2xhc3MgOiB7aW5saW5lIDogJ3NwYW4nLCBhdHRyaWJ1dGVzIDogeydjbGFzcycgOiAnJXZhbHVlJ319LA0KCQkJCWJsb2NrcXVvdGUgOiB7YmxvY2sgOiAnYmxvY2txdW90ZScsIHdyYXBwZXIgOiAxLCByZW1vdmUgOiAnYWxsJ30sDQoNCgkJCQlyZW1vdmVmb3JtYXQgOiBbDQoJCQkJCXtzZWxlY3RvciA6ICdiLHN0cm9uZyxlbSxpLGZvbnQsdSxzdHJpa2UnLCByZW1vdmUgOiAnYWxsJywgc3BsaXQgOiB0cnVlLCBleHBhbmQgOiBmYWxzZSwgYmxvY2tfZXhwYW5kIDogdHJ1ZSwgZGVlcCA6IHRydWV9LA0KCQkJCQl7c2VsZWN0b3IgOiAnc3BhbicsIGF0dHJpYnV0ZXMgOiBbJ3N0eWxlJywgJ2NsYXNzJ10sIHJlbW92ZSA6ICdlbXB0eScsIHNwbGl0IDogdHJ1ZSwgZXhwYW5kIDogZmFsc2UsIGRlZXAgOiB0cnVlfSwNCgkJCQkJe3NlbGVjdG9yIDogJyonLCBhdHRyaWJ1dGVzIDogWydzdHlsZScsICdjbGFzcyddLCBzcGxpdCA6IGZhbHNlLCBleHBhbmQgOiBmYWxzZSwgZGVlcCA6IHRydWV9DQoJCQkJXQ0KCQkJfSk7DQoNCgkJCS8vIFJlZ2lzdGVyIGRlZmF1bHQgYmxvY2sgZm9ybWF0cw0KCQkJZWFjaCgncCBoMSBoMiBoMyBoNCBoNSBoNiBkaXYgYWRkcmVzcyBwcmUgZGl2IGNvZGUgZHQgZGQgc2FtcCcuc3BsaXQoL1xzLyksIGZ1bmN0aW9uKG5hbWUpIHsNCgkJCQl0LmZvcm1hdHRlci5yZWdpc3RlcihuYW1lLCB7YmxvY2sgOiBuYW1lLCByZW1vdmUgOiAnYWxsJ30pOw0KCQkJfSk7DQoNCgkJCS8vIFJlZ2lzdGVyIHVzZXIgZGVmaW5lZCBmb3JtYXRzDQoJCQl0LmZvcm1hdHRlci5yZWdpc3Rlcih0LnNldHRpbmdzLmZvcm1hdHMpOw0KDQoJCQl0LnVuZG9NYW5hZ2VyID0gbmV3IHRpbnltY2UuVW5kb01hbmFnZXIodCk7DQoNCgkJCS8vIFBhc3MgdGhyb3VnaA0KCQkJdC51bmRvTWFuYWdlci5vbkFkZC5hZGQoZnVuY3Rpb24odW0sIGwpIHsNCgkJCQlpZiAoIWwuaW5pdGlhbCkNCgkJCQkJcmV0dXJuIHQub25DaGFuZ2UuZGlzcGF0Y2godCwgbCwgdW0pOw0KCQkJfSk7DQoNCgkJCXQudW5kb01hbmFnZXIub25VbmRvLmFkZChmdW5jdGlvbih1bSwgbCkgew0KCQkJCXJldHVybiB0Lm9uVW5kby5kaXNwYXRjaCh0LCBsLCB1bSk7DQoJCQl9KTsNCg0KCQkJdC51bmRvTWFuYWdlci5vblJlZG8uYWRkKGZ1bmN0aW9uKHVtLCBsKSB7DQoJCQkJcmV0dXJuIHQub25SZWRvLmRpc3BhdGNoKHQsIGwsIHVtKTsNCgkJCX0pOw0KDQoJCQl0LmZvcmNlQmxvY2tzID0gbmV3IHRpbnltY2UuRm9yY2VCbG9ja3ModCwgew0KCQkJCWZvcmNlZF9yb290X2Jsb2NrIDogcy5mb3JjZWRfcm9vdF9ibG9jaw0KCQkJfSk7DQoNCgkJCXQuZWRpdG9yQ29tbWFuZHMgPSBuZXcgdGlueW1jZS5FZGl0b3JDb21tYW5kcyh0KTsNCg0KCQkJLy8gUGFzcyB0aHJvdWdoDQoJCQl0LnNlcmlhbGl6ZXIub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihzZSwgbykgew0KCQkJCXJldHVybiB0Lm9uUHJlUHJvY2Vzcy5kaXNwYXRjaCh0LCBvLCBzZSk7DQoJCQl9KTsNCg0KCQkJdC5zZXJpYWxpemVyLm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJcmV0dXJuIHQub25Qb3N0UHJvY2Vzcy5kaXNwYXRjaCh0LCBvLCBzZSk7DQoJCQl9KTsNCg0KCQkJdC5vblByZUluaXQuZGlzcGF0Y2godCk7DQoNCgkJCWlmICghcy5nZWNrb19zcGVsbGNoZWNrKQ0KCQkJCXQuZ2V0Qm9keSgpLnNwZWxsY2hlY2sgPSAwOw0KDQoJCQlpZiAoIXMucmVhZG9ubHkpDQoJCQkJdC5fYWRkRXZlbnRzKCk7DQoNCgkJCXQuY29udHJvbE1hbmFnZXIub25Qb3N0UmVuZGVyLmRpc3BhdGNoKHQsIHQuY29udHJvbE1hbmFnZXIpOw0KCQkJdC5vblBvc3RSZW5kZXIuZGlzcGF0Y2godCk7DQoNCgkJCWlmIChzLmRpcmVjdGlvbmFsaXR5KQ0KCQkJCXQuZ2V0Qm9keSgpLmRpciA9IHMuZGlyZWN0aW9uYWxpdHk7DQoNCgkJCWlmIChzLm5vd3JhcCkNCgkJCQl0LmdldEJvZHkoKS5zdHlsZS53aGl0ZVNwYWNlID0gIm5vd3JhcCI7DQoNCgkJCWlmIChzLmN1c3RvbV9lbGVtZW50cykgew0KCQkJCWZ1bmN0aW9uIGhhbmRsZUN1c3RvbShlZCwgbykgew0KCQkJCQllYWNoKGV4cGxvZGUocy5jdXN0b21fZWxlbWVudHMpLCBmdW5jdGlvbih2KSB7DQoJCQkJCQl2YXIgbjsNCg0KCQkJCQkJaWYgKHYuaW5kZXhPZignficpID09PSAwKSB7DQoJCQkJCQkJdiA9IHYuc3Vic3RyaW5nKDEpOw0KCQkJCQkJCW4gPSAnc3Bhbic7DQoJCQkJCQl9IGVsc2UNCgkJCQkJCQluID0gJ2Rpdic7DQoNCgkJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAoJzwoJyArIHYgKyAnKShbXj5dKik+JywgJ2cnKSwgJzwnICsgbiArICcgX21jZV9uYW1lPSIkMSIkMj4nKTsNCgkJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAoJzwvKCcgKyB2ICsgJyk+JywgJ2cnKSwgJzwvJyArIG4gKyAnPicpOw0KCQkJCQl9KTsNCgkJCQl9Ow0KDQoJCQkJdC5vbkJlZm9yZVNldENvbnRlbnQuYWRkKGhhbmRsZUN1c3RvbSk7DQoJCQkJdC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlpZiAoby5zZXQpDQoJCQkJCQloYW5kbGVDdXN0b20oZWQsIG8pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5oYW5kbGVfbm9kZV9jaGFuZ2VfY2FsbGJhY2spIHsNCgkJCQl0Lm9uTm9kZUNoYW5nZS5hZGQoZnVuY3Rpb24oZWQsIGNtLCBuKSB7DQoJCQkJCXQuZXhlY0NhbGxiYWNrKCdoYW5kbGVfbm9kZV9jaGFuZ2VfY2FsbGJhY2snLCB0LmlkLCBuLCAtMSwgLTEsIHRydWUsIHQuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5zYXZlX2NhbGxiYWNrKSB7DQoJCQkJdC5vblNhdmVDb250ZW50LmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQl2YXIgaCA9IHQuZXhlY0NhbGxiYWNrKCdzYXZlX2NhbGxiYWNrJywgdC5pZCwgby5jb250ZW50LCB0LmdldEJvZHkoKSk7DQoNCgkJCQkJaWYgKGgpDQoJCQkJCQlvLmNvbnRlbnQgPSBoOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5vbmNoYW5nZV9jYWxsYmFjaykgew0KCQkJCXQub25DaGFuZ2UuYWRkKGZ1bmN0aW9uKGVkLCBsKSB7DQoJCQkJCXQuZXhlY0NhbGxiYWNrKCdvbmNoYW5nZV9jYWxsYmFjaycsIHQsIGwpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5jb252ZXJ0X25ld2xpbmVzX3RvX2Jycykgew0KCQkJCXQub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlpZiAoby5pbml0aWFsKQ0KCQkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UoL1xyP1xuL2csICc8YnIgLz4nKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuZml4X25lc3RpbmcgJiYgaXNJRSkgew0KCQkJCXQub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlvLmNvbnRlbnQgPSB0Ll9maXhOZXN0aW5nKG8uY29udGVudCk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLnByZWZvcm1hdHRlZCkgew0KCQkJCXQub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UoL15ccyo8cHJlLio/Pi8sICcnKTsNCgkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UoLzxcL3ByZT5ccyokLywgJycpOw0KDQoJCQkJCWlmIChvLnNldCkNCgkJCQkJCW8uY29udGVudCA9ICc8cHJlIGNsYXNzPSJtY2VJdGVtSGlkZGVuIj4nICsgby5jb250ZW50ICsgJzwvcHJlPic7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLnZlcmlmeV9jc3NfY2xhc3Nlcykgew0KCQkJCXQuc2VyaWFsaXplci5hdHRyaWJWYWx1ZUZpbHRlciA9IGZ1bmN0aW9uKG4sIHYpIHsNCgkJCQkJdmFyIHMsIGNsOw0KDQoJCQkJCWlmIChuID09ICdjbGFzcycpIHsNCgkJCQkJCS8vIEJ1aWxkIHJlZ2V4cCBmb3IgY2xhc3Nlcw0KCQkJCQkJaWYgKCF0LmNsYXNzZXNSRSkgew0KCQkJCQkJCWNsID0gdC5kb20uZ2V0Q2xhc3NlcygpOw0KDQoJCQkJCQkJaWYgKGNsLmxlbmd0aCA+IDApIHsNCgkJCQkJCQkJcyA9ICcnOw0KDQoJCQkJCQkJCWVhY2ggKGNsLCBmdW5jdGlvbihvKSB7DQoJCQkJCQkJCQlzICs9IChzID8gJ3wnIDogJycpICsgb1snY2xhc3MnXTsNCgkJCQkJCQkJfSk7DQoNCgkJCQkJCQkJdC5jbGFzc2VzUkUgPSBuZXcgUmVnRXhwKCcoJyArIHMgKyAnKScsICdnaScpOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuICF0LmNsYXNzZXNSRSB8fCAvKFxibWNlSXRlbVx3K1xifFxibWNlVGVtcFx3K1xiKS9nLnRlc3QodikgfHwgdC5jbGFzc2VzUkUudGVzdCh2KSA/IHYgOiAnJzsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiB2Ow0KCQkJCX07DQoJCQl9DQoNCgkJCWlmIChzLmNsZWFudXBfY2FsbGJhY2spIHsNCgkJCQl0Lm9uQmVmb3JlU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJby5jb250ZW50ID0gdC5leGVjQ2FsbGJhY2soJ2NsZWFudXBfY2FsbGJhY2snLCAnaW5zZXJ0X3RvX2VkaXRvcicsIG8uY29udGVudCwgbyk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uUHJlUHJvY2Vzcy5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJaWYgKG8uc2V0KQ0KCQkJCQkJdC5leGVjQ2FsbGJhY2soJ2NsZWFudXBfY2FsbGJhY2snLCAnaW5zZXJ0X3RvX2VkaXRvcl9kb20nLCBvLm5vZGUsIG8pOw0KDQoJCQkJCWlmIChvLmdldCkNCgkJCQkJCXQuZXhlY0NhbGxiYWNrKCdjbGVhbnVwX2NhbGxiYWNrJywgJ2dldF9mcm9tX2VkaXRvcl9kb20nLCBvLm5vZGUsIG8pOw0KCQkJCX0pOw0KDQoJCQkJdC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlpZiAoby5zZXQpDQoJCQkJCQlvLmNvbnRlbnQgPSB0LmV4ZWNDYWxsYmFjaygnY2xlYW51cF9jYWxsYmFjaycsICdpbnNlcnRfdG9fZWRpdG9yJywgby5jb250ZW50LCBvKTsNCg0KCQkJCQlpZiAoby5nZXQpCQkJCQkJDQoJCQkJCQlvLmNvbnRlbnQgPSB0LmV4ZWNDYWxsYmFjaygnY2xlYW51cF9jYWxsYmFjaycsICdnZXRfZnJvbV9lZGl0b3InLCBvLmNvbnRlbnQsIG8pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5zYXZlX2NhbGxiYWNrKSB7DQoJCQkJdC5vbkdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCWlmIChvLnNhdmUpDQoJCQkJCQlvLmNvbnRlbnQgPSB0LmV4ZWNDYWxsYmFjaygnc2F2ZV9jYWxsYmFjaycsIHQuaWQsIG8uY29udGVudCwgdC5nZXRCb2R5KCkpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5oYW5kbGVfZXZlbnRfY2FsbGJhY2spIHsNCgkJCQl0Lm9uRXZlbnQuYWRkKGZ1bmN0aW9uKGVkLCBlLCBvKSB7DQoJCQkJCWlmICh0LmV4ZWNDYWxsYmFjaygnaGFuZGxlX2V2ZW50X2NhbGxiYWNrJywgZSwgZWQsIG8pID09PSBmYWxzZSkNCgkJCQkJCUV2ZW50LmNhbmNlbChlKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gQWRkIHZpc3VhbCBhaWRzIHdoZW4gbmV3IGNvbnRlbnRzIGlzIGFkZGVkDQoJCQl0Lm9uU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJdC5hZGRWaXN1YWwodC5nZXRCb2R5KCkpOw0KCQkJfSk7DQoNCgkJCS8vIFJlbW92ZSBlbXB0eSBjb250ZW50cw0KCQkJaWYgKHMucGFkZF9lbXB0eV9lZGl0b3IpIHsNCgkJCQl0Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKC9eKDxwW14+XSo+KCZuYnNwO3wmIzE2MDt8XHN8XHUwMGEwfCk8XC9wPltcclxuXSp8PGJyIFwvPltcclxuXSopJC8sICcnKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKGlzR2Vja28pIHsNCgkJCQkvLyBGaXggZ2Vja28gbGluayBidWcsIHdoZW4gYSBsaW5rIGlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIGJsb2NrIGVsZW1lbnRzIHRoZXJlIGlzDQoJCQkJLy8gbm8gd2F5IHRvIG1vdmUgdGhlIGNhcmV0IGJlaGluZCB0aGUgbGluay4gVGhpcyBmaXggYWRkcyBhIGJvZ3VzIGJyIGVsZW1lbnQgYWZ0ZXIgdGhlIGxpbmsNCgkJCQlmdW5jdGlvbiBmaXhMaW5rcyhlZCwgbykgew0KCQkJCQllYWNoKGVkLmRvbS5zZWxlY3QoJ2EnKSwgZnVuY3Rpb24obikgew0KCQkJCQkJdmFyIHBuID0gbi5wYXJlbnROb2RlOw0KDQoJCQkJCQlpZiAoZWQuZG9tLmlzQmxvY2socG4pICYmIHBuLmxhc3RDaGlsZCA9PT0gbikNCgkJCQkJCQllZC5kb20uYWRkKHBuLCAnYnInLCB7J19tY2VfYm9ndXMnIDogMX0pOw0KCQkJCQl9KTsNCgkJCQl9Ow0KDQoJCQkJdC5vbkV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihlZCwgY21kKSB7DQoJCQkJCWlmIChjbWQgPT09ICdDcmVhdGVMaW5rJykNCgkJCQkJCWZpeExpbmtzKGVkKTsNCgkJCQl9KTsNCg0KCQkJCXQub25TZXRDb250ZW50LmFkZCh0LnNlbGVjdGlvbi5vblNldENvbnRlbnQuYWRkKGZpeExpbmtzKSk7DQoNCgkJCQlpZiAoIXMucmVhZG9ubHkpIHsNCgkJCQkJdHJ5IHsNCgkJCQkJCS8vIERlc2lnbiBtb2RlIG11c3QgYmUgc2V0IGhlcmUgb25jZSBhZ2FpbiB0byBmaXggYSBidWcgd2hlcmUNCgkJCQkJCS8vIEN0cmwrQS9EZWxldGUvQmFja3NwYWNlIGRpZG4ndCB3b3JrIGlmIHRoZSBlZGl0b3Igd2FzIGFkZGVkIHVzaW5nIG1jZUFkZENvbnRyb2wgdGhlbiByZW1vdmVkIHRoZW4gYWRkZWQgYWdhaW4NCgkJCQkJCWQuZGVzaWduTW9kZSA9ICdPZmYnOw0KCQkJCQkJZC5kZXNpZ25Nb2RlID0gJ09uJzsNCgkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCS8vIFdpbGwgZmFpbCBvbiBHZWNrbyBpZiB0aGUgZWRpdG9yIGlzIHBsYWNlZCBpbiBhbiBoaWRkZW4gY29udGFpbmVyIGVsZW1lbnQNCgkJCQkJCS8vIFRoZSBkZXNpZ24gbW9kZSB3aWxsIGJlIHNldCBvbmVzIHRoZSBlZGl0b3IgaXMgZm9jdXNlZA0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBBIHNtYWxsIHRpbWVvdXQgd2FzIG5lZWRlZCBzaW5jZSBmaXJlZm94IHdpbGwgcmVtb3ZlLiBCdWc6ICMxODM4MzA0DQoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCgkJCQlpZiAodC5yZW1vdmVkKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQl0LmxvYWQoe2luaXRpYWwgOiB0cnVlLCBmb3JtYXQgOiAocy5jbGVhbnVwX29uX3N0YXJ0dXAgPyAnaHRtbCcgOiAncmF3Jyl9KTsNCgkJCQl0LnN0YXJ0Q29udGVudCA9IHQuZ2V0Q29udGVudCh7Zm9ybWF0IDogJ3Jhdyd9KTsNCgkJCQl0LmluaXRpYWxpemVkID0gdHJ1ZTsNCg0KCQkJCXQub25Jbml0LmRpc3BhdGNoKHQpOw0KCQkJCXQuZXhlY0NhbGxiYWNrKCdzZXR1cGNvbnRlbnRfY2FsbGJhY2snLCB0LmlkLCB0LmdldEJvZHkoKSwgdC5nZXREb2MoKSk7DQoJCQkJdC5leGVjQ2FsbGJhY2soJ2luaXRfaW5zdGFuY2VfY2FsbGJhY2snLCB0KTsNCgkJCQl0LmZvY3VzKHRydWUpOw0KCQkJCXQubm9kZUNoYW5nZWQoe2luaXRpYWwgOiAxfSk7DQoNCgkJCQkvLyBMb2FkIHNwZWNpZmllZCBjb250ZW50IENTUyBsYXN0DQoJCQkJaWYgKHMuY29udGVudF9jc3MpIHsNCgkJCQkJdGlueW1jZS5lYWNoKGV4cGxvZGUocy5jb250ZW50X2NzcyksIGZ1bmN0aW9uKHUpIHsNCgkJCQkJCXQuZG9tLmxvYWRDU1ModC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZSh1KSk7DQoJCQkJCX0pOw0KCQkJCX0NCg0KCQkJCS8vIEhhbmRsZSBhdXRvIGZvY3VzDQoJCQkJaWYgKHMuYXV0b19mb2N1cykgew0KCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCgkJCQkJCXZhciBlZCA9IHRpbnltY2UuZ2V0KHMuYXV0b19mb2N1cyk7DQoNCgkJCQkJCWVkLnNlbGVjdGlvbi5zZWxlY3QoZWQuZ2V0Qm9keSgpLCAxKTsNCgkJCQkJCWVkLnNlbGVjdGlvbi5jb2xsYXBzZSgxKTsNCgkJCQkJCWVkLmdldFdpbigpLmZvY3VzKCk7DQoJCQkJCX0sIDEwMCk7DQoJCQkJfQ0KCQkJfSwgMSk7DQoJDQoJCQllID0gbnVsbDsNCgkJfSwNCg0KDQoJCWZvY3VzIDogZnVuY3Rpb24oc2YpIHsNCgkJCXZhciBvZWQsIHQgPSB0aGlzLCBjZSA9IHQuc2V0dGluZ3MuY29udGVudF9lZGl0YWJsZSwgaWVSbmcsIGNvbnRyb2xFbG0sIGRvYyA9IHQuZ2V0RG9jKCk7DQoNCgkJCWlmICghc2YpIHsNCgkJCQkvLyBHZXQgc2VsZWN0ZWQgY29udHJvbCBlbGVtZW50DQoJCQkJaWVSbmcgPSB0LnNlbGVjdGlvbi5nZXRSbmcoKTsNCgkJCQlpZiAoaWVSbmcuaXRlbSkgew0KCQkJCQljb250cm9sRWxtID0gaWVSbmcuaXRlbSgwKTsNCgkJCQl9DQoNCgkJCQkvLyBJcyBub3QgY29udGVudCBlZGl0YWJsZQ0KCQkJCWlmICghY2UpDQoJCQkJCXQuZ2V0V2luKCkuZm9jdXMoKTsNCg0KCQkJCS8vIFJlc3RvcmUgc2VsZWN0ZWQgY29udHJvbCBlbGVtZW50DQoJCQkJLy8gVGhpcyBpcyBuZWVkZWQgd2hlbiBmb3IgZXhhbXBsZSBhbiBpbWFnZSBpcyBzZWxlY3RlZCB3aXRoaW4gYQ0KCQkJCS8vIGxheWVyIGEgY2FsbCB0byBmb2N1cyB3aWxsIHRoZW4gcmVtb3ZlIHRoZSBjb250cm9sIHNlbGVjdGlvbg0KCQkJCWlmIChjb250cm9sRWxtICYmIGNvbnRyb2xFbG0ub3duZXJEb2N1bWVudCA9PSBkb2MpIHsNCgkJCQkJaWVSbmcgPSBkb2MuYm9keS5jcmVhdGVDb250cm9sUmFuZ2UoKTsNCgkJCQkJaWVSbmcuYWRkRWxlbWVudChjb250cm9sRWxtKTsNCgkJCQkJaWVSbmcuc2VsZWN0KCk7DQoJCQkJfQ0KDQoJCQl9DQoNCgkJCWlmICh0aW55bWNlLmFjdGl2ZUVkaXRvciAhPSB0KSB7DQoJCQkJaWYgKChvZWQgPSB0aW55bWNlLmFjdGl2ZUVkaXRvcikgIT0gbnVsbCkNCgkJCQkJb2VkLm9uRGVhY3RpdmF0ZS5kaXNwYXRjaChvZWQsIHQpOw0KDQoJCQkJdC5vbkFjdGl2YXRlLmRpc3BhdGNoKHQsIG9lZCk7DQoJCQl9DQoNCgkJCXRpbnltY2UuX3NldEFjdGl2ZSh0KTsNCgkJfSwNCg0KCQlleGVjQ2FsbGJhY2sgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGYgPSB0LnNldHRpbmdzW25dLCBzOw0KDQoJCQlpZiAoIWYpDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBMb29rIHRocm91Z2ggbG9va3VwDQoJCQlpZiAodC5jYWxsYmFja0xvb2t1cCAmJiAocyA9IHQuY2FsbGJhY2tMb29rdXBbbl0pKSB7DQoJCQkJZiA9IHMuZnVuYzsNCgkJCQlzID0gcy5zY29wZTsNCgkJCX0NCg0KCQkJaWYgKGlzKGYsICdzdHJpbmcnKSkgew0KCQkJCXMgPSBmLnJlcGxhY2UoL1wuXHcrJC8sICcnKTsNCgkJCQlzID0gcyA/IHRpbnltY2UucmVzb2x2ZShzKSA6IDA7DQoJCQkJZiA9IHRpbnltY2UucmVzb2x2ZShmKTsNCgkJCQl0LmNhbGxiYWNrTG9va3VwID0gdC5jYWxsYmFja0xvb2t1cCB8fCB7fTsNCgkJCQl0LmNhbGxiYWNrTG9va3VwW25dID0ge2Z1bmMgOiBmLCBzY29wZSA6IHN9Ow0KCQkJfQ0KDQoJCQlyZXR1cm4gZi5hcHBseShzIHx8IHQsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOw0KCQl9LA0KDQoJCXRyYW5zbGF0ZSA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciBjID0gdGhpcy5zZXR0aW5ncy5sYW5ndWFnZSB8fCAnZW4nLCBpMThuID0gdGlueW1jZS5pMThuOw0KDQoJCQlpZiAoIXMpDQoJCQkJcmV0dXJuICcnOw0KDQoJCQlyZXR1cm4gaTE4bltjICsgJy4nICsgc10gfHwgcy5yZXBsYWNlKC97XCMoW159XSspXH0vZywgZnVuY3Rpb24oYSwgYikgew0KCQkJCXJldHVybiBpMThuW2MgKyAnLicgKyBiXSB8fCAneyMnICsgYiArICd9JzsNCgkJCX0pOw0KCQl9LA0KDQoJCWdldExhbmcgOiBmdW5jdGlvbihuLCBkdikgew0KCQkJcmV0dXJuIHRpbnltY2UuaTE4blsodGhpcy5zZXR0aW5ncy5sYW5ndWFnZSB8fCAnZW4nKSArICcuJyArIG5dIHx8IChpcyhkdikgPyBkdiA6ICd7IycgKyBuICsgJ30nKTsNCgkJfSwNCg0KCQlnZXRQYXJhbSA6IGZ1bmN0aW9uKG4sIGR2LCB0eSkgew0KCQkJdmFyIHRyID0gdGlueW1jZS50cmltLCB2ID0gaXModGhpcy5zZXR0aW5nc1tuXSkgPyB0aGlzLnNldHRpbmdzW25dIDogZHYsIG87DQoNCgkJCWlmICh0eSA9PT0gJ2hhc2gnKSB7DQoJCQkJbyA9IHt9Ow0KDQoJCQkJaWYgKGlzKHYsICdzdHJpbmcnKSkgew0KCQkJCQllYWNoKHYuaW5kZXhPZignPScpID4gMCA/IHYuc3BsaXQoL1s7LF0oPyFbXj07LF0qKD86WzssXXwkKSkvKSA6IHYuc3BsaXQoJywnKSwgZnVuY3Rpb24odikgew0KCQkJCQkJdiA9IHYuc3BsaXQoJz0nKTsNCg0KCQkJCQkJaWYgKHYubGVuZ3RoID4gMSkNCgkJCQkJCQlvW3RyKHZbMF0pXSA9IHRyKHZbMV0pOw0KCQkJCQkJZWxzZQ0KCQkJCQkJCW9bdHIodlswXSldID0gdHIodik7DQoJCQkJCX0pOw0KCQkJCX0gZWxzZQ0KCQkJCQlvID0gdjsNCg0KCQkJCXJldHVybiBvOw0KCQkJfQ0KDQoJCQlyZXR1cm4gdjsNCgkJfSwNCg0KCQlub2RlQ2hhbmdlZCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2VsZWN0aW9uLCBuID0gKGlzSUUgPyBzLmdldE5vZGUoKSA6IHMuZ2V0U3RhcnQoKSkgfHwgdC5nZXRCb2R5KCk7DQoNCgkJCS8vIEZpeCBmb3IgYnVnICMxODk2NTc3IGl0IHNlZW1zIHRoYXQgdGhpcyBjYW4gbm90IGJlIGZpcmVkIHdoaWxlIHRoZSBlZGl0b3IgaXMgbG9hZGluZw0KCQkJaWYgKHQuaW5pdGlhbGl6ZWQpIHsNCgkJCQlvID0gbyB8fCB7fTsNCgkJCQluID0gaXNJRSAmJiBuLm93bmVyRG9jdW1lbnQgIT0gdC5nZXREb2MoKSA/IHQuZ2V0Qm9keSgpIDogbjsgLy8gRml4IGZvciBJRSBpbml0aWFsIHN0YXRlDQoNCgkJCQkvLyBHZXQgcGFyZW50cyBhbmQgYWRkIHRoZW0gdG8gb2JqZWN0DQoJCQkJby5wYXJlbnRzID0gW107DQoJCQkJdC5kb20uZ2V0UGFyZW50KG4sIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJaWYgKG5vZGUubm9kZU5hbWUgPT0gJ0JPRFknKQ0KCQkJCQkJcmV0dXJuIHRydWU7DQoNCgkJCQkJby5wYXJlbnRzLnB1c2gobm9kZSk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uTm9kZUNoYW5nZS5kaXNwYXRjaCgNCgkJCQkJdCwNCgkJCQkJbyA/IG8uY29udHJvbE1hbmFnZXIgfHwgdC5jb250cm9sTWFuYWdlciA6IHQuY29udHJvbE1hbmFnZXIsDQoJCQkJCW4sDQoJCQkJCXMuaXNDb2xsYXBzZWQoKSwNCgkJCQkJbw0KCQkJCSk7DQoJCQl9DQoJCX0sDQoNCgkJYWRkQnV0dG9uIDogZnVuY3Rpb24obiwgcykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmJ1dHRvbnMgPSB0LmJ1dHRvbnMgfHwge307DQoJCQl0LmJ1dHRvbnNbbl0gPSBzOw0KCQl9LA0KDQoJCWFkZENvbW1hbmQgOiBmdW5jdGlvbihuLCBmLCBzKSB7DQoJCQl0aGlzLmV4ZWNDb21tYW5kc1tuXSA9IHtmdW5jIDogZiwgc2NvcGUgOiBzIHx8IHRoaXN9Ow0KCQl9LA0KDQoJCWFkZFF1ZXJ5U3RhdGVIYW5kbGVyIDogZnVuY3Rpb24obiwgZiwgcykgew0KCQkJdGhpcy5xdWVyeVN0YXRlQ29tbWFuZHNbbl0gPSB7ZnVuYyA6IGYsIHNjb3BlIDogcyB8fCB0aGlzfTsNCgkJfSwNCg0KCQlhZGRRdWVyeVZhbHVlSGFuZGxlciA6IGZ1bmN0aW9uKG4sIGYsIHMpIHsNCgkJCXRoaXMucXVlcnlWYWx1ZUNvbW1hbmRzW25dID0ge2Z1bmMgOiBmLCBzY29wZSA6IHMgfHwgdGhpc307DQoJCX0sDQoNCgkJYWRkU2hvcnRjdXQgOiBmdW5jdGlvbihwYSwgZGVzYywgY21kX2Z1bmMsIHNjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGM7DQoNCgkJCWlmICghdC5zZXR0aW5ncy5jdXN0b21fc2hvcnRjdXRzKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJdC5zaG9ydGN1dHMgPSB0LnNob3J0Y3V0cyB8fCB7fTsNCg0KCQkJaWYgKGlzKGNtZF9mdW5jLCAnc3RyaW5nJykpIHsNCgkJCQljID0gY21kX2Z1bmM7DQoNCgkJCQljbWRfZnVuYyA9IGZ1bmN0aW9uKCkgew0KCQkJCQl0LmV4ZWNDb21tYW5kKGMsIGZhbHNlLCBudWxsKTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQlpZiAoaXMoY21kX2Z1bmMsICdvYmplY3QnKSkgew0KCQkJCWMgPSBjbWRfZnVuYzsNCg0KCQkJCWNtZF9mdW5jID0gZnVuY3Rpb24oKSB7DQoJCQkJCXQuZXhlY0NvbW1hbmQoY1swXSwgY1sxXSwgY1syXSk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJZWFjaChleHBsb2RlKHBhKSwgZnVuY3Rpb24ocGEpIHsNCgkJCQl2YXIgbyA9IHsNCgkJCQkJZnVuYyA6IGNtZF9mdW5jLA0KCQkJCQlzY29wZSA6IHNjIHx8IHRoaXMsDQoJCQkJCWRlc2MgOiBkZXNjLA0KCQkJCQlhbHQgOiBmYWxzZSwNCgkJCQkJY3RybCA6IGZhbHNlLA0KCQkJCQlzaGlmdCA6IGZhbHNlDQoJCQkJfTsNCg0KCQkJCWVhY2goZXhwbG9kZShwYSwgJysnKSwgZnVuY3Rpb24odikgew0KCQkJCQlzd2l0Y2ggKHYpIHsNCgkJCQkJCWNhc2UgJ2FsdCc6DQoJCQkJCQljYXNlICdjdHJsJzoNCgkJCQkJCWNhc2UgJ3NoaWZ0JzoNCgkJCQkJCQlvW3ZdID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJZGVmYXVsdDoNCgkJCQkJCQlvLmNoYXJDb2RlID0gdi5jaGFyQ29kZUF0KDApOw0KCQkJCQkJCW8ua2V5Q29kZSA9IHYudG9VcHBlckNhc2UoKS5jaGFyQ29kZUF0KDApOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQl0LnNob3J0Y3V0c1soby5jdHJsID8gJ2N0cmwnIDogJycpICsgJywnICsgKG8uYWx0ID8gJ2FsdCcgOiAnJykgKyAnLCcgKyAoby5zaGlmdCA/ICdzaGlmdCcgOiAnJykgKyAnLCcgKyBvLmtleUNvZGVdID0gbzsNCgkJCX0pOw0KDQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfSwNCg0KCQlleGVjQ29tbWFuZCA6IGZ1bmN0aW9uKGNtZCwgdWksIHZhbCwgYSkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gMCwgbywgc3Q7DQoNCgkJCWlmICghL14obWNlQWRkVW5kb0xldmVsfG1jZUVuZFVuZG9MZXZlbHxtY2VCZWdpblVuZG9MZXZlbHxtY2VSZXBhaW50fFNlbGVjdEFsbCkkLy50ZXN0KGNtZCkgJiYgKCFhIHx8ICFhLnNraXBfZm9jdXMpKQ0KCQkJCXQuZm9jdXMoKTsNCg0KCQkJbyA9IHt9Ow0KCQkJdC5vbkJlZm9yZUV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgbyk7DQoJCQlpZiAoby50ZXJtaW5hdGUpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQkvLyBDb21tYW5kIGNhbGxiYWNrDQoJCQlpZiAodC5leGVjQ2FsbGJhY2soJ2V4ZWNjb21tYW5kX2NhbGxiYWNrJywgdC5pZCwgdC5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCBjbWQsIHVpLCB2YWwpKSB7DQoJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoNCgkJCS8vIFJlZ2lzdHJlZCBjb21tYW5kcw0KCQkJaWYgKG8gPSB0LmV4ZWNDb21tYW5kc1tjbWRdKSB7DQoJCQkJc3QgPSBvLmZ1bmMuY2FsbChvLnNjb3BlLCB1aSwgdmFsKTsNCg0KCQkJCS8vIEZhbGwgdGhyb3VnaCBvbiB0cnVlDQoJCQkJaWYgKHN0ICE9PSB0cnVlKSB7DQoJCQkJCXQub25FeGVjQ29tbWFuZC5kaXNwYXRjaCh0LCBjbWQsIHVpLCB2YWwsIGEpOw0KCQkJCQlyZXR1cm4gc3Q7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBQbHVnaW4gY29tbWFuZHMNCgkJCWVhY2godC5wbHVnaW5zLCBmdW5jdGlvbihwKSB7DQoJCQkJaWYgKHAuZXhlY0NvbW1hbmQgJiYgcC5leGVjQ29tbWFuZChjbWQsIHVpLCB2YWwpKSB7DQoJCQkJCXQub25FeGVjQ29tbWFuZC5kaXNwYXRjaCh0LCBjbWQsIHVpLCB2YWwsIGEpOw0KCQkJCQlzID0gMTsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQlpZiAocykNCgkJCQlyZXR1cm4gdHJ1ZTsNCg0KCQkJLy8gVGhlbWUgY29tbWFuZHMNCgkJCWlmICh0LnRoZW1lICYmIHQudGhlbWUuZXhlY0NvbW1hbmQgJiYgdC50aGVtZS5leGVjQ29tbWFuZChjbWQsIHVpLCB2YWwpKSB7DQoJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoNCgkJCS8vIEV4ZWN1dGUgZ2xvYmFsIGNvbW1hbmRzDQoJCQlpZiAodGlueW1jZS5HbG9iYWxDb21tYW5kcy5leGVjQ29tbWFuZCh0LCBjbWQsIHVpLCB2YWwpKSB7DQoJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoNCgkJCS8vIEVkaXRvciBjb21tYW5kcw0KCQkJaWYgKHQuZWRpdG9yQ29tbWFuZHMuZXhlY0NvbW1hbmQoY21kLCB1aSwgdmFsKSkgew0KCQkJCXQub25FeGVjQ29tbWFuZC5kaXNwYXRjaCh0LCBjbWQsIHVpLCB2YWwsIGEpOw0KCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KDQoJCQkvLyBCcm93c2VyIGNvbW1hbmRzDQoJCQl0LmdldERvYygpLmV4ZWNDb21tYW5kKGNtZCwgdWksIHZhbCk7DQoJCQl0Lm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2godCwgY21kLCB1aSwgdmFsLCBhKTsNCgkJfSwNCg0KCQlxdWVyeUNvbW1hbmRTdGF0ZSA6IGZ1bmN0aW9uKGNtZCkgew0KCQkJdmFyIHQgPSB0aGlzLCBvLCBzOw0KDQoJCQkvLyBJcyBoaWRkZW4gdGhlbiByZXR1cm4gdW5kZWZpbmVkDQoJCQlpZiAodC5faXNIaWRkZW4oKSkNCgkJCQlyZXR1cm47DQoNCgkJCS8vIFJlZ2lzdHJlZCBjb21tYW5kcw0KCQkJaWYgKG8gPSB0LnF1ZXJ5U3RhdGVDb21tYW5kc1tjbWRdKSB7DQoJCQkJcyA9IG8uZnVuYy5jYWxsKG8uc2NvcGUpOw0KDQoJCQkJLy8gRmFsbCB0aG91Z2ggb24gdHJ1ZQ0KCQkJCWlmIChzICE9PSB0cnVlKQ0KCQkJCQlyZXR1cm4gczsNCgkJCX0NCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlvID0gdC5lZGl0b3JDb21tYW5kcy5xdWVyeUNvbW1hbmRTdGF0ZShjbWQpOw0KCQkJaWYgKG8gIT09IC0xKQ0KCQkJCXJldHVybiBvOw0KDQoJCQkvLyBCcm93c2VyIGNvbW1hbmRzDQoJCQl0cnkgew0KCQkJCXJldHVybiB0aGlzLmdldERvYygpLnF1ZXJ5Q29tbWFuZFN0YXRlKGNtZCk7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJCS8vIEZhaWxzIHNvbWV0aW1lcyBzZWUgYnVnOiAxODk2NTc3DQoJCQl9DQoJCX0sDQoNCgkJcXVlcnlDb21tYW5kVmFsdWUgOiBmdW5jdGlvbihjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG8sIHM7DQoNCgkJCS8vIElzIGhpZGRlbiB0aGVuIHJldHVybiB1bmRlZmluZWQNCgkJCWlmICh0Ll9pc0hpZGRlbigpKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlpZiAobyA9IHQucXVlcnlWYWx1ZUNvbW1hbmRzW2NdKSB7DQoJCQkJcyA9IG8uZnVuYy5jYWxsKG8uc2NvcGUpOw0KDQoJCQkJLy8gRmFsbCB0aG91Z2ggb24gdHJ1ZQ0KCQkJCWlmIChzICE9PSB0cnVlKQ0KCQkJCQlyZXR1cm4gczsNCgkJCX0NCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlvID0gdC5lZGl0b3JDb21tYW5kcy5xdWVyeUNvbW1hbmRWYWx1ZShjKTsNCgkJCWlmIChpcyhvKSkNCgkJCQlyZXR1cm4gbzsNCg0KCQkJLy8gQnJvd3NlciBjb21tYW5kcw0KCQkJdHJ5IHsNCgkJCQlyZXR1cm4gdGhpcy5nZXREb2MoKS5xdWVyeUNvbW1hbmRWYWx1ZShjKTsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJLy8gRmFpbHMgc29tZXRpbWVzIHNlZSBidWc6IDE4OTY1NzcNCgkJCX0NCgkJfSwNCg0KCQlzaG93IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCURPTS5zaG93KHQuZ2V0Q29udGFpbmVyKCkpOw0KCQkJRE9NLmhpZGUodC5pZCk7DQoJCQl0LmxvYWQoKTsNCgkJfSwNCg0KCQloaWRlIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGQgPSB0LmdldERvYygpOw0KDQoJCQkvLyBGaXhlZCBidWcgd2hlcmUgSUUgaGFzIGEgYmxpbmtpbmcgY3Vyc29yIGxlZnQgZnJvbSB0aGUgZWRpdG9yDQoJCQlpZiAoaXNJRSAmJiBkKQ0KCQkJCWQuZXhlY0NvbW1hbmQoJ1NlbGVjdEFsbCcpOw0KDQoJCQkvLyBXZSBtdXN0IHNhdmUgYmVmb3JlIHdlIGhpZGUgc28gU2FmYXJpIGRvZXNuJ3QgY3Jhc2gNCgkJCXQuc2F2ZSgpOw0KCQkJRE9NLmhpZGUodC5nZXRDb250YWluZXIoKSk7DQoJCQlET00uc2V0U3R5bGUodC5pZCwgJ2Rpc3BsYXknLCB0Lm9yZ0Rpc3BsYXkpOw0KCQl9LA0KDQoJCWlzSGlkZGVuIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gIURPTS5pc0hpZGRlbih0aGlzLmlkKTsNCgkJfSwNCg0KCQlzZXRQcm9ncmVzc1N0YXRlIDogZnVuY3Rpb24oYiwgdGksIG8pIHsNCgkJCXRoaXMub25TZXRQcm9ncmVzc1N0YXRlLmRpc3BhdGNoKHRoaXMsIGIsIHRpLCBvKTsNCg0KCQkJcmV0dXJuIGI7DQoJCX0sDQoNCgkJbG9hZCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciB0ID0gdGhpcywgZSA9IHQuZ2V0RWxlbWVudCgpLCBoOw0KDQoJCQlpZiAoZSkgew0KCQkJCW8gPSBvIHx8IHt9Ow0KCQkJCW8ubG9hZCA9IHRydWU7DQoNCgkJCQkvLyBEb3VibGUgZW5jb2RlIGV4aXN0aW5nIGVudGl0aWVzIGluIHRoZSB2YWx1ZQ0KCQkJCWggPSB0LnNldENvbnRlbnQoaXMoZS52YWx1ZSkgPyBlLnZhbHVlIDogZS5pbm5lckhUTUwsIG8pOw0KCQkJCW8uZWxlbWVudCA9IGU7DQoNCgkJCQlpZiAoIW8ubm9fZXZlbnRzKQ0KCQkJCQl0Lm9uTG9hZENvbnRlbnQuZGlzcGF0Y2godCwgbyk7DQoNCgkJCQlvLmVsZW1lbnQgPSBlID0gbnVsbDsNCg0KCQkJCXJldHVybiBoOw0KCQkJfQ0KCQl9LA0KDQoJCXNhdmUgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGUgPSB0LmdldEVsZW1lbnQoKSwgaCwgZjsNCg0KCQkJaWYgKCFlIHx8ICF0LmluaXRpYWxpemVkKQ0KCQkJCXJldHVybjsNCg0KCQkJbyA9IG8gfHwge307DQoJCQlvLnNhdmUgPSB0cnVlOw0KDQoJCQkvLyBBZGQgdW5kbyBsZXZlbCB3aWxsIHRyaWdnZXIgb25jaGFuZ2UgZXZlbnQNCgkJCWlmICghby5ub19ldmVudHMpIHsNCgkJCQl0LnVuZG9NYW5hZ2VyLnR5cGluZyA9IDA7DQoJCQkJdC51bmRvTWFuYWdlci5hZGQoKTsNCgkJCX0NCg0KCQkJby5lbGVtZW50ID0gZTsNCgkJCWggPSBvLmNvbnRlbnQgPSB0LmdldENvbnRlbnQobyk7DQoNCgkJCWlmICghby5ub19ldmVudHMpDQoJCQkJdC5vblNhdmVDb250ZW50LmRpc3BhdGNoKHQsIG8pOw0KDQoJCQloID0gby5jb250ZW50Ow0KDQoJCQlpZiAoIS9URVhUQVJFQXxJTlBVVC9pLnRlc3QoZS5ub2RlTmFtZSkpIHsNCgkJCQllLmlubmVySFRNTCA9IGg7DQoNCgkJCQkvLyBVcGRhdGUgaGlkZGVuIGZvcm0gZWxlbWVudA0KCQkJCWlmIChmID0gRE9NLmdldFBhcmVudCh0LmlkLCAnZm9ybScpKSB7DQoJCQkJCWVhY2goZi5lbGVtZW50cywgZnVuY3Rpb24oZSkgew0KCQkJCQkJaWYgKGUubmFtZSA9PSB0LmlkKSB7DQoJCQkJCQkJZS52YWx1ZSA9IGg7DQoJCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9IGVsc2UNCgkJCQllLnZhbHVlID0gaDsNCg0KCQkJby5lbGVtZW50ID0gZSA9IG51bGw7DQoNCgkJCXJldHVybiBoOw0KCQl9LA0KDQoJCXNldENvbnRlbnQgOiBmdW5jdGlvbihoLCBvKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCW8gPSBvIHx8IHt9Ow0KCQkJby5mb3JtYXQgPSBvLmZvcm1hdCB8fCAnaHRtbCc7DQoJCQlvLnNldCA9IHRydWU7DQoJCQlvLmNvbnRlbnQgPSBoOw0KDQoJCQlpZiAoIW8ubm9fZXZlbnRzKQ0KCQkJCXQub25CZWZvcmVTZXRDb250ZW50LmRpc3BhdGNoKHQsIG8pOw0KDQoJCQkvLyBQYWRkIGVtcHR5IGNvbnRlbnQgaW4gR2Vja28gYW5kIFNhZmFyaS4gQ29tbWFuZHMgd2lsbCBvdGhlcndpc2UgZmFpbCBvbiB0aGUgY29udGVudA0KCQkJLy8gSXQgd2lsbCBhbHNvIGJlIGltcG9zc2libGUgdG8gcGxhY2UgdGhlIGNhcmV0IGluIHRoZSBlZGl0b3IgdW5sZXNzIHRoZXJlIGlzIGEgQlIgZWxlbWVudCBwcmVzZW50DQoJCQlpZiAoIXRpbnltY2UuaXNJRSAmJiAoaC5sZW5ndGggPT09IDAgfHwgL15ccyskLy50ZXN0KGgpKSkgew0KCQkJCW8uY29udGVudCA9IHQuZG9tLnNldEhUTUwodC5nZXRCb2R5KCksICc8YnIgX21jZV9ib2d1cz0iMSIgLz4nKTsNCgkJCQlvLmZvcm1hdCA9ICdyYXcnOw0KCQkJfQ0KDQoJCQlvLmNvbnRlbnQgPSB0LmRvbS5zZXRIVE1MKHQuZ2V0Qm9keSgpLCB0aW55bWNlLnRyaW0oby5jb250ZW50KSk7DQoNCgkJCWlmIChvLmZvcm1hdCAhPSAncmF3JyAmJiB0LnNldHRpbmdzLmNsZWFudXApIHsNCgkJCQlvLmdldElubmVyID0gdHJ1ZTsNCgkJCQlvLmNvbnRlbnQgPSB0LmRvbS5zZXRIVE1MKHQuZ2V0Qm9keSgpLCB0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHQuZ2V0Qm9keSgpLCBvKSk7DQoJCQl9DQoNCgkJCWlmICghby5ub19ldmVudHMpDQoJCQkJdC5vblNldENvbnRlbnQuZGlzcGF0Y2godCwgbyk7DQoNCgkJCXJldHVybiBvLmNvbnRlbnQ7DQoJCX0sDQoNCgkJZ2V0Q29udGVudCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciB0ID0gdGhpcywgaDsNCg0KCQkJbyA9IG8gfHwge307DQoJCQlvLmZvcm1hdCA9IG8uZm9ybWF0IHx8ICdodG1sJzsNCgkJCW8uZ2V0ID0gdHJ1ZTsNCg0KCQkJaWYgKCFvLm5vX2V2ZW50cykNCgkJCQl0Lm9uQmVmb3JlR2V0Q29udGVudC5kaXNwYXRjaCh0LCBvKTsNCg0KCQkJaWYgKG8uZm9ybWF0ICE9ICdyYXcnICYmIHQuc2V0dGluZ3MuY2xlYW51cCkgew0KCQkJCW8uZ2V0SW5uZXIgPSB0cnVlOw0KCQkJCWggPSB0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHQuZ2V0Qm9keSgpLCBvKTsNCgkJCX0gZWxzZQ0KCQkJCWggPSB0LmdldEJvZHkoKS5pbm5lckhUTUw7DQoNCgkJCWggPSBoLnJlcGxhY2UoL15ccyp8XHMqJC9nLCAnJyk7DQoJCQlvLmNvbnRlbnQgPSBoOw0KDQoJCQlpZiAoIW8ubm9fZXZlbnRzKQ0KCQkJCXQub25HZXRDb250ZW50LmRpc3BhdGNoKHQsIG8pOw0KDQoJCQlyZXR1cm4gby5jb250ZW50Ow0KCQl9LA0KDQoJCWlzRGlydHkgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJcmV0dXJuIHRpbnltY2UudHJpbSh0LnN0YXJ0Q29udGVudCkgIT0gdGlueW1jZS50cmltKHQuZ2V0Q29udGVudCh7Zm9ybWF0IDogJ3JhdycsIG5vX2V2ZW50cyA6IDF9KSkgJiYgIXQuaXNOb3REaXJ0eTsNCgkJfSwNCg0KCQlnZXRDb250YWluZXIgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKCF0LmNvbnRhaW5lcikNCgkJCQl0LmNvbnRhaW5lciA9IERPTS5nZXQodC5lZGl0b3JDb250YWluZXIgfHwgdC5pZCArICdfcGFyZW50Jyk7DQoNCgkJCXJldHVybiB0LmNvbnRhaW5lcjsNCgkJfSwNCg0KCQlnZXRDb250ZW50QXJlYUNvbnRhaW5lciA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuY29udGVudEFyZWFDb250YWluZXI7DQoJCX0sDQoNCgkJZ2V0RWxlbWVudCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIERPTS5nZXQodGhpcy5zZXR0aW5ncy5jb250ZW50X2VsZW1lbnQgfHwgdGhpcy5pZCk7DQoJCX0sDQoNCgkJZ2V0V2luIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGU7DQoNCgkJCWlmICghdC5jb250ZW50V2luZG93KSB7DQoJCQkJZSA9IERPTS5nZXQodC5pZCArICJfaWZyIik7DQoNCgkJCQlpZiAoZSkNCgkJCQkJdC5jb250ZW50V2luZG93ID0gZS5jb250ZW50V2luZG93Ow0KCQkJfQ0KDQoJCQlyZXR1cm4gdC5jb250ZW50V2luZG93Ow0KCQl9LA0KDQoJCWdldERvYyA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCB3Ow0KDQoJCQlpZiAoIXQuY29udGVudERvY3VtZW50KSB7DQoJCQkJdyA9IHQuZ2V0V2luKCk7DQoNCgkJCQlpZiAodykNCgkJCQkJdC5jb250ZW50RG9jdW1lbnQgPSB3LmRvY3VtZW50Ow0KCQkJfQ0KDQoJCQlyZXR1cm4gdC5jb250ZW50RG9jdW1lbnQ7DQoJCX0sDQoNCgkJZ2V0Qm9keSA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuYm9keUVsZW1lbnQgfHwgdGhpcy5nZXREb2MoKS5ib2R5Ow0KCQl9LA0KDQoJCWNvbnZlcnRVUkwgOiBmdW5jdGlvbih1LCBuLCBlKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzOw0KDQoJCQkvLyBVc2UgY2FsbGJhY2sgaW5zdGVhZA0KCQkJaWYgKHMudXJsY29udmVydGVyX2NhbGxiYWNrKQ0KCQkJCXJldHVybiB0LmV4ZWNDYWxsYmFjaygndXJsY29udmVydGVyX2NhbGxiYWNrJywgdSwgZSwgdHJ1ZSwgbik7DQoNCgkJCS8vIERvbid0IGNvbnZlcnQgbGluayBocmVmIHNpbmNlIHRoYXRzIHRoZSBDU1MgZmlsZXMgdGhhdCBnZXRzIGxvYWRlZCBpbnRvIHRoZSBlZGl0b3IgYWxzbyBza2lwIGxvY2FsIGZpbGUgVVJMcw0KCQkJaWYgKCFzLmNvbnZlcnRfdXJscyB8fCAoZSAmJiBlLm5vZGVOYW1lID09ICdMSU5LJykgfHwgdS5pbmRleE9mKCdmaWxlOicpID09PSAwKQ0KCQkJCXJldHVybiB1Ow0KDQoJCQkvLyBDb252ZXJ0IHRvIHJlbGF0aXZlDQoJCQlpZiAocy5yZWxhdGl2ZV91cmxzKQ0KCQkJCXJldHVybiB0LmRvY3VtZW50QmFzZVVSSS50b1JlbGF0aXZlKHUpOw0KDQoJCQkvLyBDb252ZXJ0IHRvIGFic29sdXRlDQoJCQl1ID0gdC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZSh1LCBzLnJlbW92ZV9zY3JpcHRfaG9zdCk7DQoNCgkJCXJldHVybiB1Ow0KCQl9LA0KDQoJCWFkZFZpc3VhbCA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3M7DQoNCgkJCWUgPSBlIHx8IHQuZ2V0Qm9keSgpOw0KDQoJCQlpZiAoIWlzKHQuaGFzVmlzdWFsKSkNCgkJCQl0Lmhhc1Zpc3VhbCA9IHMudmlzdWFsOw0KDQoJCQllYWNoKHQuZG9tLnNlbGVjdCgndGFibGUsYScsIGUpLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIHY7DQoNCgkJCQlzd2l0Y2ggKGUubm9kZU5hbWUpIHsNCgkJCQkJY2FzZSAnVEFCTEUnOg0KCQkJCQkJdiA9IHQuZG9tLmdldEF0dHJpYihlLCAnYm9yZGVyJyk7DQoNCgkJCQkJCWlmICghdiB8fCB2ID09ICcwJykgew0KCQkJCQkJCWlmICh0Lmhhc1Zpc3VhbCkNCgkJCQkJCQkJdC5kb20uYWRkQ2xhc3MoZSwgcy52aXN1YWxfdGFibGVfY2xhc3MpOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJdC5kb20ucmVtb3ZlQ2xhc3MoZSwgcy52aXN1YWxfdGFibGVfY2xhc3MpOw0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJY2FzZSAnQSc6DQoJCQkJCQl2ID0gdC5kb20uZ2V0QXR0cmliKGUsICduYW1lJyk7DQoNCgkJCQkJCWlmICh2KSB7DQoJCQkJCQkJaWYgKHQuaGFzVmlzdWFsKQ0KCQkJCQkJCQl0LmRvbS5hZGRDbGFzcyhlLCAnbWNlSXRlbUFuY2hvcicpOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJdC5kb20ucmVtb3ZlQ2xhc3MoZSwgJ21jZUl0ZW1BbmNob3InKTsNCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQl0Lm9uVmlzdWFsQWlkLmRpc3BhdGNoKHQsIGUsIHQuaGFzVmlzdWFsKTsNCgkJfSwNCg0KCQlyZW1vdmUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZSA9IHQuZ2V0Q29udGFpbmVyKCk7DQoNCgkJCXQucmVtb3ZlZCA9IDE7IC8vIENhbmNlbHMgcG9zdCByZW1vdmUgZXZlbnQgZXhlY3V0aW9uDQoJCQl0LmhpZGUoKTsNCg0KCQkJdC5leGVjQ2FsbGJhY2soJ3JlbW92ZV9pbnN0YW5jZV9jYWxsYmFjaycsIHQpOw0KCQkJdC5vblJlbW92ZS5kaXNwYXRjaCh0KTsNCg0KCQkJLy8gQ2xlYXIgYWxsIGV4ZWNDb21tYW5kIGxpc3RlbmVycyB0aGlzIGlzIHJlcXVpcmVkIHRvIGF2b2lkIGVycm9ycyBpZiB0aGUgZWRpdG9yIHdhcyByZW1vdmVkIGluc2lkZSBhbm90aGVyIGNvbW1hbmQNCgkJCXQub25FeGVjQ29tbWFuZC5saXN0ZW5lcnMgPSBbXTsNCg0KCQkJdGlueW1jZS5yZW1vdmUodCk7DQoJCQlET00ucmVtb3ZlKGUpOw0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCS8vIE9uZSB0aW1lIGlzIGVub3VnaA0KCQkJaWYgKHQuZGVzdHJveWVkKQ0KCQkJCXJldHVybjsNCg0KCQkJaWYgKCFzKSB7DQoJCQkJdGlueW1jZS5yZW1vdmVVbmxvYWQodC5kZXN0cm95KTsNCgkJCQl0aW55TUNFLm9uQmVmb3JlVW5sb2FkLnJlbW92ZSh0Ll9iZWZvcmVVbmxvYWQpOw0KDQoJCQkJLy8gTWFudWFsIGRlc3Ryb3kNCgkJCQlpZiAodC50aGVtZSAmJiB0LnRoZW1lLmRlc3Ryb3kpDQoJCQkJCXQudGhlbWUuZGVzdHJveSgpOw0KDQoJCQkJLy8gRGVzdHJveSBjb250cm9scywgc2VsZWN0aW9uIGFuZCBkb20NCgkJCQl0LmNvbnRyb2xNYW5hZ2VyLmRlc3Ryb3koKTsNCgkJCQl0LnNlbGVjdGlvbi5kZXN0cm95KCk7DQoJCQkJdC5kb20uZGVzdHJveSgpOw0KDQoJCQkJLy8gUmVtb3ZlIGFsbCBldmVudHMNCg0KCQkJCS8vIERvbid0IGNsZWFyIHRoZSB3aW5kb3cgb3IgZG9jdW1lbnQgaWYgY29udGVudCBlZGl0YWJsZQ0KCQkJCS8vIGlzIGVuYWJsZWQgc2luY2Ugb3RoZXIgaW5zdGFuY2VzIG1pZ2h0IHN0aWxsIGJlIHByZXNlbnQNCgkJCQlpZiAoIXQuc2V0dGluZ3MuY29udGVudF9lZGl0YWJsZSkgew0KCQkJCQlFdmVudC5jbGVhcih0LmdldFdpbigpKTsNCgkJCQkJRXZlbnQuY2xlYXIodC5nZXREb2MoKSk7DQoJCQkJfQ0KDQoJCQkJRXZlbnQuY2xlYXIodC5nZXRCb2R5KCkpOw0KCQkJCUV2ZW50LmNsZWFyKHQuZm9ybUVsZW1lbnQpOw0KCQkJfQ0KDQoJCQlpZiAodC5mb3JtRWxlbWVudCkgew0KCQkJCXQuZm9ybUVsZW1lbnQuc3VibWl0ID0gdC5mb3JtRWxlbWVudC5fbWNlT2xkU3VibWl0Ow0KCQkJCXQuZm9ybUVsZW1lbnQuX21jZU9sZFN1Ym1pdCA9IG51bGw7DQoJCQl9DQoNCgkJCXQuY29udGVudEFyZWFDb250YWluZXIgPSB0LmZvcm1FbGVtZW50ID0gdC5jb250YWluZXIgPSB0LnNldHRpbmdzLmNvbnRlbnRfZWxlbWVudCA9IHQuYm9keUVsZW1lbnQgPSB0LmNvbnRlbnREb2N1bWVudCA9IHQuY29udGVudFdpbmRvdyA9IG51bGw7DQoNCgkJCWlmICh0LnNlbGVjdGlvbikNCgkJCQl0LnNlbGVjdGlvbiA9IHQuc2VsZWN0aW9uLndpbiA9IHQuc2VsZWN0aW9uLmRvbSA9IHQuc2VsZWN0aW9uLmRvbS5kb2MgPSBudWxsOw0KDQoJCQl0LmRlc3Ryb3llZCA9IDE7DQoJCX0sDQoNCgkJLy8gSW50ZXJuYWwgZnVuY3Rpb25zDQoNCgkJX2FkZEV2ZW50cyA6IGZ1bmN0aW9uKCkgew0KCQkJLy8gJ2ZvY3VzJywgJ2JsdXInLCAnZGJsY2xpY2snLCAnYmVmb3JlZGVhY3RpdmF0ZScsIHN1Ym1pdCwgcmVzZXQNCgkJCXZhciB0ID0gdGhpcywgaSwgcyA9IHQuc2V0dGluZ3MsIGRvbSA9IHQuZG9tLCBsbyA9IHsNCgkJCQltb3VzZXVwIDogJ29uTW91c2VVcCcsDQoJCQkJbW91c2Vkb3duIDogJ29uTW91c2VEb3duJywNCgkJCQljbGljayA6ICdvbkNsaWNrJywNCgkJCQlrZXl1cCA6ICdvbktleVVwJywNCgkJCQlrZXlkb3duIDogJ29uS2V5RG93bicsDQoJCQkJa2V5cHJlc3MgOiAnb25LZXlQcmVzcycsDQoJCQkJc3VibWl0IDogJ29uU3VibWl0JywNCgkJCQlyZXNldCA6ICdvblJlc2V0JywNCgkJCQljb250ZXh0bWVudSA6ICdvbkNvbnRleHRNZW51JywNCgkJCQlkYmxjbGljayA6ICdvbkRibENsaWNrJywNCgkJCQlwYXN0ZSA6ICdvblBhc3RlJyAvLyBEb2Vzbid0IHdvcmsgaW4gYWxsIGJyb3dzZXJzIHlldA0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gZXZlbnRIYW5kbGVyKGUsIG8pIHsNCgkJCQl2YXIgdHkgPSBlLnR5cGU7DQoNCgkJCQkvLyBEb24ndCBmaXJlIGV2ZW50cyB3aGVuIGl0J3MgcmVtb3ZlZA0KCQkJCWlmICh0LnJlbW92ZWQpDQoJCQkJCXJldHVybjsNCg0KCQkJCS8vIEdlbmVyaWMgZXZlbnQgaGFuZGxlcg0KCQkJCWlmICh0Lm9uRXZlbnQuZGlzcGF0Y2godCwgZSwgbykgIT09IGZhbHNlKSB7DQoJCQkJCS8vIFNwZWNpZmljIGV2ZW50IGhhbmRsZXINCgkJCQkJdFtsb1tlLmZha2VUeXBlIHx8IGUudHlwZV1dLmRpc3BhdGNoKHQsIGUsIG8pOw0KCQkJCX0NCgkJCX07DQoNCgkJCS8vIEFkZCBET00gZXZlbnRzDQoJCQllYWNoKGxvLCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJc3dpdGNoIChrKSB7DQoJCQkJCWNhc2UgJ2NvbnRleHRtZW51JzoNCgkJCQkJCWlmICh0aW55bWNlLmlzT3BlcmEpIHsNCgkJCQkJCQkvLyBGYWtlIGNvbnRleHRtZW51IG9uIE9wZXJhDQoJCQkJCQkJZG9tLmJpbmQodC5nZXRCb2R5KCksICdtb3VzZWRvd24nLCBmdW5jdGlvbihlKSB7DQoJCQkJCQkJCWlmIChlLmN0cmxLZXkpIHsNCgkJCQkJCQkJCWUuZmFrZVR5cGUgPSAnY29udGV4dG1lbnUnOw0KCQkJCQkJCQkJZXZlbnRIYW5kbGVyKGUpOw0KCQkJCQkJCQl9DQoJCQkJCQkJfSk7DQoJCQkJCQl9IGVsc2UNCgkJCQkJCQlkb20uYmluZCh0LmdldEJvZHkoKSwgaywgZXZlbnRIYW5kbGVyKTsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ3Bhc3RlJzoNCgkJCQkJCWRvbS5iaW5kKHQuZ2V0Qm9keSgpLCBrLCBmdW5jdGlvbihlKSB7DQoJCQkJCQkJZXZlbnRIYW5kbGVyKGUpOw0KCQkJCQkJfSk7DQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICdzdWJtaXQnOg0KCQkJCQljYXNlICdyZXNldCc6DQoJCQkJCQlkb20uYmluZCh0LmdldEVsZW1lbnQoKS5mb3JtIHx8IERPTS5nZXRQYXJlbnQodC5pZCwgJ2Zvcm0nKSwgaywgZXZlbnRIYW5kbGVyKTsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWRlZmF1bHQ6DQoJCQkJCQlkb20uYmluZChzLmNvbnRlbnRfZWRpdGFibGUgPyB0LmdldEJvZHkoKSA6IHQuZ2V0RG9jKCksIGssIGV2ZW50SGFuZGxlcik7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWRvbS5iaW5kKHMuY29udGVudF9lZGl0YWJsZSA/IHQuZ2V0Qm9keSgpIDogKGlzR2Vja28gPyB0LmdldERvYygpIDogdC5nZXRXaW4oKSksICdmb2N1cycsIGZ1bmN0aW9uKGUpIHsNCgkJCQl0LmZvY3VzKHRydWUpOw0KCQkJfSk7DQoNCg0KCQkJLy8gRml4ZXMgYnVnIHdoZXJlIGEgc3BlY2lmaWVkIGRvY3VtZW50X2Jhc2VfdXJpIGNvdWxkIHJlc3VsdCBpbiBicm9rZW4gaW1hZ2VzDQoJCQkvLyBUaGlzIHdpbGwgYWxzbyBmaXggZHJhZyBkcm9wIG9mIGltYWdlcyBpbiBHZWNrbw0KCQkJaWYgKHRpbnltY2UuaXNHZWNrbykgew0KCQkJCWRvbS5iaW5kKHQuZ2V0RG9jKCksICdET01Ob2RlSW5zZXJ0ZWQnLCBmdW5jdGlvbihlKSB7DQoJCQkJCXZhciB2Ow0KDQoJCQkJCWUgPSBlLnRhcmdldDsNCg0KCQkJCQlpZiAoZS5ub2RlVHlwZSA9PT0gMSAmJiBlLm5vZGVOYW1lID09PSAnSU1HJyAmJiAodiA9IGUuZ2V0QXR0cmlidXRlKCdfbWNlX3NyYycpKSkNCgkJCQkJCWUuc3JjID0gdC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZSh2KTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gU2V0IHZhcmlvdXMgbWlkYXMgb3B0aW9ucyBpbiBHZWNrbw0KCQkJaWYgKGlzR2Vja28pIHsNCgkJCQlmdW5jdGlvbiBzZXRPcHRzKCkgew0KCQkJCQl2YXIgdCA9IHRoaXMsIGQgPSB0LmdldERvYygpLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJCQlpZiAoaXNHZWNrbyAmJiAhcy5yZWFkb25seSkgew0KCQkJCQkJaWYgKHQuX2lzSGlkZGVuKCkpIHsNCgkJCQkJCQl0cnkgew0KCQkJCQkJCQlpZiAoIXMuY29udGVudF9lZGl0YWJsZSkNCgkJCQkJCQkJCWQuZGVzaWduTW9kZSA9ICdPbic7DQoJCQkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCQkJLy8gRmFpbHMgaWYgaXQncyBoaWRkZW4NCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCXRyeSB7DQoJCQkJCQkJLy8gVHJ5IG5ldyBHZWNrbyBtZXRob2QNCgkJCQkJCQlkLmV4ZWNDb21tYW5kKCJzdHlsZVdpdGhDU1MiLCAwLCBmYWxzZSk7DQoJCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJCS8vIFVzZSBvbGQgbWV0aG9kDQoJCQkJCQkJaWYgKCF0Ll9pc0hpZGRlbigpKQ0KCQkJCQkJCQl0cnkge2QuZXhlY0NvbW1hbmQoInVzZUNTUyIsIDAsIHRydWUpO30gY2F0Y2ggKGV4KSB7fQ0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoIXMudGFibGVfaW5saW5lX2VkaXRpbmcpDQoJCQkJCQkJdHJ5IHtkLmV4ZWNDb21tYW5kKCdlbmFibGVJbmxpbmVUYWJsZUVkaXRpbmcnLCBmYWxzZSwgZmFsc2UpO30gY2F0Y2ggKGV4KSB7fQ0KDQoJCQkJCQlpZiAoIXMub2JqZWN0X3Jlc2l6aW5nKQ0KCQkJCQkJCXRyeSB7ZC5leGVjQ29tbWFuZCgnZW5hYmxlT2JqZWN0UmVzaXppbmcnLCBmYWxzZSwgZmFsc2UpO30gY2F0Y2ggKGV4KSB7fQ0KCQkJCQl9DQoJCQkJfTsNCg0KCQkJCXQub25CZWZvcmVFeGVjQ29tbWFuZC5hZGQoc2V0T3B0cyk7DQoJCQkJdC5vbk1vdXNlRG93bi5hZGQoc2V0T3B0cyk7DQoJCQl9DQoNCgkJCS8vIFdvcmthcm91bmQgZm9yIGJ1ZywgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIyNTANCgkJCS8vIFdlYktpdCBjYW4ndCBldmVuIGRvIHNpbXBsZSB0aGluZ3MgbGlrZSBzZWxlY3RpbmcgYW4gaW1hZ2UNCgkJCS8vIFRoaXMgYWxzbyBmaXhlcyBzbyBpdCdzIHBvc3NpYmxlIHRvIHNlbGVjdCBtY2VJdGVtQW5jaG9ycw0KCQkJaWYgKHRpbnltY2UuaXNXZWJLaXQpIHsNCgkJCQl0Lm9uQ2xpY2suYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCWUgPSBlLnRhcmdldDsNCg0KCQkJCQkvLyBOZWVkcyB0b2JlIHRoZSBzZXRCYXNlQW5kRXh0ZW5kIG9yIGl0IHdpbGwgZmFpbCB0byBzZWxlY3QgZmxvYXRlZCBpbWFnZXMNCgkJCQkJaWYgKGUubm9kZU5hbWUgPT0gJ0lNRycgfHwgKGUubm9kZU5hbWUgPT0gJ0EnICYmIGRvbS5oYXNDbGFzcyhlLCAnbWNlSXRlbUFuY2hvcicpKSkgew0KCQkJCQkJdC5zZWxlY3Rpb24uZ2V0U2VsKCkuc2V0QmFzZUFuZEV4dGVudChlLCAwLCBlLCAxKTsNCgkJCQkJCXQubm9kZUNoYW5nZWQoKTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBBZGQgbm9kZSBjaGFuZ2UgaGFuZGxlcnMNCgkJCXQub25Nb3VzZVVwLmFkZCh0Lm5vZGVDaGFuZ2VkKTsNCgkJCS8vdC5vbkNsaWNrLmFkZCh0Lm5vZGVDaGFuZ2VkKTsNCgkJCXQub25LZXlVcC5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQl2YXIgYyA9IGUua2V5Q29kZTsNCg0KCQkJCWlmICgoYyA+PSAzMyAmJiBjIDw9IDM2KSB8fCAoYyA+PSAzNyAmJiBjIDw9IDQwKSB8fCBjID09IDEzIHx8IGMgPT0gNDUgfHwgYyA9PSA0NiB8fCBjID09IDggfHwgKHRpbnltY2UuaXNNYWMgJiYgKGMgPT0gOTEgfHwgYyA9PSA5MykpIHx8IGUuY3RybEtleSkNCgkJCQkJdC5ub2RlQ2hhbmdlZCgpOw0KCQkJfSk7DQoNCgkJCS8vIEFkZCByZXNldCBoYW5kbGVyDQoJCQl0Lm9uUmVzZXQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCXQuc2V0Q29udGVudCh0LnN0YXJ0Q29udGVudCwge2Zvcm1hdCA6ICdyYXcnfSk7DQoJCQl9KTsNCg0KCQkJLy8gQWRkIHNob3J0Y3V0cw0KCQkJaWYgKHMuY3VzdG9tX3Nob3J0Y3V0cykgew0KCQkJCWlmIChzLmN1c3RvbV91bmRvX3JlZG9fa2V5Ym9hcmRfc2hvcnRjdXRzKSB7DQoJCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwreicsIHQuZ2V0TGFuZygndW5kb19kZXNjJyksICdVbmRvJyk7DQoJCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwreScsIHQuZ2V0TGFuZygncmVkb19kZXNjJyksICdSZWRvJyk7DQoJCQkJfQ0KDQoJCQkJLy8gQWRkIGRlZmF1bHQgc2hvcnRjdXRzIGZvciBnZWNrbw0KCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwrYicsIHQuZ2V0TGFuZygnYm9sZF9kZXNjJyksICdCb2xkJyk7DQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCtpJywgdC5nZXRMYW5nKCdpdGFsaWNfZGVzYycpLCAnSXRhbGljJyk7DQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCt1JywgdC5nZXRMYW5nKCd1bmRlcmxpbmVfZGVzYycpLCAnVW5kZXJsaW5lJyk7DQoNCgkJCQkvLyBCbG9ja0Zvcm1hdCBzaG9ydGN1dHMga2V5cw0KCQkJCWZvciAoaT0xOyBpPD02OyBpKyspDQoJCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwrJyArIGksICcnLCBbJ0Zvcm1hdEJsb2NrJywgZmFsc2UsICdoJyArIGldKTsNCg0KCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwrNycsICcnLCBbJ0Zvcm1hdEJsb2NrJywgZmFsc2UsICc8cD4nXSk7DQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCs4JywgJycsIFsnRm9ybWF0QmxvY2snLCBmYWxzZSwgJzxkaXY+J10pOw0KCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwrOScsICcnLCBbJ0Zvcm1hdEJsb2NrJywgZmFsc2UsICc8YWRkcmVzcz4nXSk7DQoNCgkJCQlmdW5jdGlvbiBmaW5kKGUpIHsNCgkJCQkJdmFyIHYgPSBudWxsOw0KDQoJCQkJCWlmICghZS5hbHRLZXkgJiYgIWUuY3RybEtleSAmJiAhZS5tZXRhS2V5KQ0KCQkJCQkJcmV0dXJuIHY7DQoNCgkJCQkJZWFjaCh0LnNob3J0Y3V0cywgZnVuY3Rpb24obykgew0KCQkJCQkJaWYgKHRpbnltY2UuaXNNYWMgJiYgby5jdHJsICE9IGUubWV0YUtleSkNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQllbHNlIGlmICghdGlueW1jZS5pc01hYyAmJiBvLmN0cmwgIT0gZS5jdHJsS2V5KQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJaWYgKG8uYWx0ICE9IGUuYWx0S2V5KQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJaWYgKG8uc2hpZnQgIT0gZS5zaGlmdEtleSkNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCWlmIChlLmtleUNvZGUgPT0gby5rZXlDb2RlIHx8IChlLmNoYXJDb2RlICYmIGUuY2hhckNvZGUgPT0gby5jaGFyQ29kZSkpIHsNCgkJCQkJCQl2ID0gbzsNCgkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQl9DQoJCQkJCX0pOw0KDQoJCQkJCXJldHVybiB2Ow0KCQkJCX07DQoNCgkJCQl0Lm9uS2V5VXAuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCXZhciBvID0gZmluZChlKTsNCg0KCQkJCQlpZiAobykNCgkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uS2V5UHJlc3MuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCXZhciBvID0gZmluZChlKTsNCg0KCQkJCQlpZiAobykNCgkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uS2V5RG93bi5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJdmFyIG8gPSBmaW5kKGUpOw0KDQoJCQkJCWlmIChvKSB7DQoJCQkJCQlvLmZ1bmMuY2FsbChvLnNjb3BlKTsNCgkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHRpbnltY2UuaXNJRSkgew0KCQkJCS8vIEZpeCBzbyByZXNpemUgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBhdHRyaWJ1dGVzIG5vdCB0aGUgc3R5bGVzIG9mIGFuIGltYWdlDQoJCQkJLy8gSXQgd2lsbCBhbHNvIGJsb2NrIG1jZUl0ZW1Ob1Jlc2l6ZSBpdGVtcw0KCQkJCWRvbS5iaW5kKHQuZ2V0RG9jKCksICdjb250cm9sc2VsZWN0JywgZnVuY3Rpb24oZSkgew0KCQkJCQl2YXIgcmUgPSB0LnJlc2l6ZUluZm8sIGNiOw0KDQoJCQkJCWUgPSBlLnRhcmdldDsNCg0KCQkJCQkvLyBEb24ndCBkbyB0aGlzIGFjdGlvbiBmb3Igbm9uIGltYWdlIGVsZW1lbnRzDQoJCQkJCWlmIChlLm5vZGVOYW1lICE9PSAnSU1HJykNCgkJCQkJCXJldHVybjsNCg0KCQkJCQlpZiAocmUpDQoJCQkJCQlkb20udW5iaW5kKHJlLm5vZGUsIHJlLmV2LCByZS5jYik7DQoNCgkJCQkJaWYgKCFkb20uaGFzQ2xhc3MoZSwgJ21jZUl0ZW1Ob1Jlc2l6ZScpKSB7DQoJCQkJCQlldiA9ICdyZXNpemVlbmQnOw0KCQkJCQkJY2IgPSBkb20uYmluZChlLCBldiwgZnVuY3Rpb24oZSkgew0KCQkJCQkJCXZhciB2Ow0KDQoJCQkJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJCQkJaWYgKHYgPSBkb20uZ2V0U3R5bGUoZSwgJ3dpZHRoJykpIHsNCgkJCQkJCQkJZG9tLnNldEF0dHJpYihlLCAnd2lkdGgnLCB2LnJlcGxhY2UoL1teMC05JV0rL2csICcnKSk7DQoJCQkJCQkJCWRvbS5zZXRTdHlsZShlLCAnd2lkdGgnLCAnJyk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJaWYgKHYgPSBkb20uZ2V0U3R5bGUoZSwgJ2hlaWdodCcpKSB7DQoJCQkJCQkJCWRvbS5zZXRBdHRyaWIoZSwgJ2hlaWdodCcsIHYucmVwbGFjZSgvW14wLTklXSsvZywgJycpKTsNCgkJCQkJCQkJZG9tLnNldFN0eWxlKGUsICdoZWlnaHQnLCAnJyk7DQoJCQkJCQkJfQ0KCQkJCQkJfSk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlldiA9ICdyZXNpemVzdGFydCc7DQoJCQkJCQljYiA9IGRvbS5iaW5kKGUsICdyZXNpemVzdGFydCcsIEV2ZW50LmNhbmNlbCwgRXZlbnQpOw0KCQkJCQl9DQoNCgkJCQkJcmUgPSB0LnJlc2l6ZUluZm8gPSB7DQoJCQkJCQlub2RlIDogZSwNCgkJCQkJCWV2IDogZXYsDQoJCQkJCQljYiA6IGNiDQoJCQkJCX07DQoJCQkJfSk7DQoNCgkJCQl0Lm9uS2V5RG93bi5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJc3dpdGNoIChlLmtleUNvZGUpIHsNCgkJCQkJCWNhc2UgODoNCgkJCQkJCQkvLyBGaXggSUUgY29udHJvbCArIGJhY2tzcGFjZSBicm93c2VyIGJ1Zw0KCQkJCQkJCWlmICh0LnNlbGVjdGlvbi5nZXRSbmcoKS5pdGVtKSB7DQoJCQkJCQkJCWVkLmRvbS5yZW1vdmUodC5zZWxlY3Rpb24uZ2V0Um5nKCkuaXRlbSgwKSk7DQoJCQkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQkvKmlmICh0LmRvbS5ib3hNb2RlbCkgew0KCQkJCQl0LmdldEJvZHkoKS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7DQoNCgkJCQkJRXZlbnQuYWRkKHQuZ2V0V2luKCksICdyZXNpemUnLCBmdW5jdGlvbihlKSB7DQoJCQkJCQl2YXIgZG9jRWxtID0gdC5nZXREb2MoKS5kb2N1bWVudEVsZW1lbnQ7DQoNCgkJCQkJCWRvY0VsbS5zdHlsZS5oZWlnaHQgPSAoZG9jRWxtLm9mZnNldEhlaWdodCAtIDEwKSArICdweCc7DQoJCQkJCX0pOw0KCQkJCX0qLw0KCQkJfQ0KDQoJCQlpZiAodGlueW1jZS5pc09wZXJhKSB7DQoJCQkJdC5vbkNsaWNrLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQlFdmVudC5wcmV2ZW50KGUpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBBZGQgY3VzdG9tIHVuZG8vcmVkbyBoYW5kbGVycw0KCQkJaWYgKHMuY3VzdG9tX3VuZG9fcmVkbykgew0KCQkJCWZ1bmN0aW9uIGFkZFVuZG8oKSB7DQoJCQkJCXQudW5kb01hbmFnZXIudHlwaW5nID0gMDsNCgkJCQkJdC51bmRvTWFuYWdlci5hZGQoKTsNCgkJCQl9Ow0KDQoJCQkJZG9tLmJpbmQodC5nZXREb2MoKSwgJ2ZvY3Vzb3V0JywgZnVuY3Rpb24oZSkgew0KCQkJCQlpZiAoIXQucmVtb3ZlZCAmJiB0LnVuZG9NYW5hZ2VyLnR5cGluZykNCgkJCQkJCWFkZFVuZG8oKTsNCgkJCQl9KTsNCg0KCQkJCXQub25LZXlVcC5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJaWYgKChlLmtleUNvZGUgPj0gMzMgJiYgZS5rZXlDb2RlIDw9IDM2KSB8fCAoZS5rZXlDb2RlID49IDM3ICYmIGUua2V5Q29kZSA8PSA0MCkgfHwgZS5rZXlDb2RlID09IDEzIHx8IGUua2V5Q29kZSA9PSA0NSB8fCBlLmN0cmxLZXkpDQoJCQkJCQlhZGRVbmRvKCk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uS2V5RG93bi5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJdmFyIHJuZywgcGFyZW50LCBib29rbWFyazsNCg0KCQkJCQkvLyBJRSBoYXMgYSByZWFsbHkgb2RkIGJ1ZyB3aGVyZSB0aGUgRE9NIG1pZ2h0IGluY2x1ZGUgYW4gbm9kZSB0aGF0IGRvZXNuJ3QgaGF2ZQ0KCQkJCQkvLyBhIHByb3BlciBzdHJ1Y3R1cmUuIElmIHlvdSB0cnkgdG8gYWNjZXNzIG5vZGVWYWx1ZSBpdCB3b3VsZCB0aHJvdyBhbiBpbGxlZ2FsIHZhbHVlIGV4Y2VwdGlvbi4NCgkJCQkJLy8gVGhpcyBzZWVtcyB0byBvbmx5IGhhcHBlbiB3aGVuIHlvdSBkZWxldGUgY29udGVudHMgYW5kIGl0IHNlZW1zIHRvIGJlIGF2b2lkYWJsZSBpZiB5b3UgcmVmcmVzaCB0aGUgZWxlbWVudA0KCQkJCQkvLyBhZnRlciB5b3UgZGVsZXRlIGNvbnRlbnRzIGZyb20gaXQuIFNlZTogIzMwMDg5MjMNCgkJCQkJaWYgKGlzSUUgJiYgZS5rZXlDb2RlID09IDQ2KSB7DQoJCQkJCQlybmcgPSB0LnNlbGVjdGlvbi5nZXRSbmcoKTsNCg0KCQkJCQkJaWYgKHJuZy5wYXJlbnRFbGVtZW50KSB7DQoJCQkJCQkJcGFyZW50ID0gcm5nLnBhcmVudEVsZW1lbnQoKTsNCg0KCQkJCQkJCS8vIFNlbGVjdCBuZXh0IHdvcmQgd2hlbiBjdHJsIGtleSBpcyB1c2VkIGluIGNvbWJvIHdpdGggZGVsZXRlDQoJCQkJCQkJaWYgKGUuY3RybEtleSkgew0KCQkJCQkJCQlybmcubW92ZUVuZCgnd29yZCcsIDEpOw0KCQkJCQkJCQlybmcuc2VsZWN0KCk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gRGVsZXRlIGNvbnRlbnRzDQoJCQkJCQkJdC5zZWxlY3Rpb24uZ2V0U2VsKCkuY2xlYXIoKTsNCg0KCQkJCQkJCS8vIENoZWNrIGlmIHdlIGFyZSB3aXRoaW4gdGhlIHNhbWUgcGFyZW50DQoJCQkJCQkJaWYgKHJuZy5wYXJlbnRFbGVtZW50KCkgPT0gcGFyZW50KSB7DQoJCQkJCQkJCWJvb2ttYXJrID0gdC5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKTsNCg0KCQkJCQkJCQl0cnkgew0KCQkJCQkJCQkJLy8gVXBkYXRlIHRoZSBIVE1MIGFuZCBob3BlZnVsbHkgaXQgd2lsbCByZW1vdmUgdGhlIGFydGlmYWN0cw0KCQkJCQkJCQkJcGFyZW50LmlubmVySFRNTCA9IHBhcmVudC5pbm5lckhUTUw7DQoJCQkJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkJCQkvLyBBbmQgc2luY2UgaXQncyBJRSBpdCBjYW4gc29tZXRpbWVzIHByb2R1Y2UgYW4gdW5rbm93biBydW50aW1lIGVycm9yDQoJCQkJCQkJCX0NCg0KCQkJCQkJCQkvLyBSZXN0b3JlIHRoZSBjYXJldCBwb3NpdGlvbg0KCQkJCQkJCQl0LnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhib29rbWFyayk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gQmxvY2sgdGhlIGRlZmF1bHQgZGVsZXRlIGJlaGF2aW9yIHNpbmNlIGl0IG1pZ2h0IGJlIGJyb2tlbg0KCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkvLyBJcyBjYXJhY3RlciBwb3NpdG9uIGtleXMNCgkJCQkJaWYgKChlLmtleUNvZGUgPj0gMzMgJiYgZS5rZXlDb2RlIDw9IDM2KSB8fCAoZS5rZXlDb2RlID49IDM3ICYmIGUua2V5Q29kZSA8PSA0MCkgfHwgZS5rZXlDb2RlID09IDEzIHx8IGUua2V5Q29kZSA9PSA0NSkgew0KCQkJCQkJaWYgKHQudW5kb01hbmFnZXIudHlwaW5nKQ0KCQkJCQkJCWFkZFVuZG8oKTsNCg0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoNCgkJCQkJaWYgKCF0LnVuZG9NYW5hZ2VyLnR5cGluZykgew0KCQkJCQkJdC51bmRvTWFuYWdlci5hZGQoKTsNCgkJCQkJCXQudW5kb01hbmFnZXIudHlwaW5nID0gMTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJdC5vbk1vdXNlRG93bi5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCWlmICh0LnVuZG9NYW5hZ2VyLnR5cGluZykNCgkJCQkJCWFkZFVuZG8oKTsNCgkJCQl9KTsNCgkJCX0NCgkJfSwNCg0KCQlfaXNIaWRkZW4gOiBmdW5jdGlvbigpIHsNCgkJCXZhciBzOw0KDQoJCQlpZiAoIWlzR2Vja28pDQoJCQkJcmV0dXJuIDA7DQoNCgkJCS8vIFdlaXJkLCB3aGVyZXMgdGhhdCBjdXJzb3Igc2VsZWN0aW9uPw0KCQkJcyA9IHRoaXMuc2VsZWN0aW9uLmdldFNlbCgpOw0KCQkJcmV0dXJuICghcyB8fCAhcy5yYW5nZUNvdW50IHx8IHMucmFuZ2VDb3VudCA9PSAwKTsNCgkJfSwNCg0KCQkvLyBGaXggZm9yIGJ1ZyAjMTg2NzI5Mg0KCQlfZml4TmVzdGluZyA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciBkID0gW10sIGk7DQoNCgkJCXMgPSBzLnJlcGxhY2UoLzwoXC8pPyhbXlxzPl0rKVtePl0qPz4vZywgZnVuY3Rpb24oYSwgYiwgYykgew0KCQkJCXZhciBlOw0KDQoJCQkJLy8gSGFuZGxlIGVuZCBlbGVtZW50DQoJCQkJaWYgKGIgPT09ICcvJykgew0KCQkJCQlpZiAoIWQubGVuZ3RoKQ0KCQkJCQkJcmV0dXJuICcnOw0KDQoJCQkJCWlmIChjICE9PSBkW2QubGVuZ3RoIC0gMV0udGFnKSB7DQoJCQkJCQlmb3IgKGk9ZC5sZW5ndGggLSAxOyBpPj0wOyBpLS0pIHsNCgkJCQkJCQlpZiAoZFtpXS50YWcgPT09IGMpIHsNCgkJCQkJCQkJZFtpXS5jbG9zZSA9IDE7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuICcnOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJZC5wb3AoKTsNCg0KCQkJCQkJaWYgKGQubGVuZ3RoICYmIGRbZC5sZW5ndGggLSAxXS5jbG9zZSkgew0KCQkJCQkJCWEgPSBhICsgJzwvJyArIGRbZC5sZW5ndGggLSAxXS50YWcgKyAnPic7DQoJCQkJCQkJZC5wb3AoKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIElnbm9yZSB0aGVzZQ0KCQkJCQlpZiAoL14oYnJ8aHJ8aW5wdXR8bWV0YXxpbWd8bGlua3xwYXJhbSkkL2kudGVzdChjKSkNCgkJCQkJCXJldHVybiBhOw0KDQoJCQkJCS8vIElnbm9yZSBjbG9zZWQgb25lcw0KCQkJCQlpZiAoL1wvPiQvLnRlc3QoYSkpDQoJCQkJCQlyZXR1cm4gYTsNCg0KCQkJCQlkLnB1c2goe3RhZyA6IGN9KTsgLy8gUHVzaCBzdGFydCBlbGVtZW50DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGE7DQoJCQl9KTsNCg0KCQkJLy8gRW5kIGFsbCBvcGVuIHRhZ3MNCgkJCWZvciAoaT1kLmxlbmd0aCAtIDE7IGk+PTA7IGktLSkNCgkJCQlzICs9ICc8LycgKyBkW2ldLnRhZyArICc+JzsNCg0KCQkJcmV0dXJuIHM7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIEFkZGVkIGZvciBjb21wcmVzc2lvbiBwdXJwb3Nlcw0KCXZhciBlYWNoID0gdGlueW1jZS5lYWNoLCB1bmRlZmluZWQsIFRSVUUgPSB0cnVlLCBGQUxTRSA9IGZhbHNlOw0KDQoJdGlueW1jZS5FZGl0b3JDb21tYW5kcyA9IGZ1bmN0aW9uKGVkaXRvcikgew0KCQl2YXIgZG9tID0gZWRpdG9yLmRvbSwNCgkJCXNlbGVjdGlvbiA9IGVkaXRvci5zZWxlY3Rpb24sDQoJCQljb21tYW5kcyA9IHtzdGF0ZToge30sIGV4ZWMgOiB7fSwgdmFsdWUgOiB7fX0sDQoJCQlzZXR0aW5ncyA9IGVkaXRvci5zZXR0aW5ncywNCgkJCWJvb2ttYXJrOw0KDQoJCWZ1bmN0aW9uIGV4ZWNDb21tYW5kKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJdmFyIGZ1bmM7DQoNCgkJCWNvbW1hbmQgPSBjb21tYW5kLnRvTG93ZXJDYXNlKCk7DQoJCQlpZiAoZnVuYyA9IGNvbW1hbmRzLmV4ZWNbY29tbWFuZF0pIHsNCgkJCQlmdW5jKGNvbW1hbmQsIHVpLCB2YWx1ZSk7DQoJCQkJcmV0dXJuIFRSVUU7DQoJCQl9DQoNCgkJCXJldHVybiBGQUxTRTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBxdWVyeUNvbW1hbmRTdGF0ZShjb21tYW5kKSB7DQoJCQl2YXIgZnVuYzsNCg0KCQkJY29tbWFuZCA9IGNvbW1hbmQudG9Mb3dlckNhc2UoKTsNCgkJCWlmIChmdW5jID0gY29tbWFuZHMuc3RhdGVbY29tbWFuZF0pDQoJCQkJcmV0dXJuIGZ1bmMoY29tbWFuZCk7DQoNCgkJCXJldHVybiAtMTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBxdWVyeUNvbW1hbmRWYWx1ZShjb21tYW5kKSB7DQoJCQl2YXIgZnVuYzsNCg0KCQkJY29tbWFuZCA9IGNvbW1hbmQudG9Mb3dlckNhc2UoKTsNCgkJCWlmIChmdW5jID0gY29tbWFuZHMudmFsdWVbY29tbWFuZF0pDQoJCQkJcmV0dXJuIGZ1bmMoY29tbWFuZCk7DQoNCgkJCXJldHVybiBGQUxTRTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBhZGRDb21tYW5kcyhjb21tYW5kX2xpc3QsIHR5cGUpIHsNCgkJCXR5cGUgPSB0eXBlIHx8ICdleGVjJzsNCg0KCQkJZWFjaChjb21tYW5kX2xpc3QsIGZ1bmN0aW9uKGNhbGxiYWNrLCBjb21tYW5kKSB7DQoJCQkJZWFjaChjb21tYW5kLnRvTG93ZXJDYXNlKCkuc3BsaXQoJywnKSwgZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCQljb21tYW5kc1t0eXBlXVtjb21tYW5kXSA9IGNhbGxiYWNrOw0KCQkJCX0pOw0KCQkJfSk7DQoJCX07DQoNCgkJLy8gRXhwb3NlIHB1YmxpYyBtZXRob2RzDQoJCXRpbnltY2UuZXh0ZW5kKHRoaXMsIHsNCgkJCWV4ZWNDb21tYW5kIDogZXhlY0NvbW1hbmQsDQoJCQlxdWVyeUNvbW1hbmRTdGF0ZSA6IHF1ZXJ5Q29tbWFuZFN0YXRlLA0KCQkJcXVlcnlDb21tYW5kVmFsdWUgOiBxdWVyeUNvbW1hbmRWYWx1ZSwNCgkJCWFkZENvbW1hbmRzIDogYWRkQ29tbWFuZHMNCgkJfSk7DQoNCgkJLy8gUHJpdmF0ZSBtZXRob2RzDQoNCgkJZnVuY3Rpb24gZXhlY05hdGl2ZUNvbW1hbmQoY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQlpZiAodWkgPT09IHVuZGVmaW5lZCkNCgkJCQl1aSA9IEZBTFNFOw0KDQoJCQlpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkNCgkJCQl2YWx1ZSA9IG51bGw7DQoNCgkJCXJldHVybiBlZGl0b3IuZ2V0RG9jKCkuZXhlY0NvbW1hbmQoY29tbWFuZCwgdWksIHZhbHVlKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBpc0Zvcm1hdE1hdGNoKG5hbWUpIHsNCgkJCXJldHVybiBlZGl0b3IuZm9ybWF0dGVyLm1hdGNoKG5hbWUpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHRvZ2dsZUZvcm1hdChuYW1lLCB2YWx1ZSkgew0KCQkJZWRpdG9yLmZvcm1hdHRlci50b2dnbGUobmFtZSwgdmFsdWUgPyB7dmFsdWUgOiB2YWx1ZX0gOiB1bmRlZmluZWQpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHN0b3JlU2VsZWN0aW9uKHR5cGUpIHsNCgkJCWJvb2ttYXJrID0gc2VsZWN0aW9uLmdldEJvb2ttYXJrKHR5cGUpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHJlc3RvcmVTZWxlY3Rpb24oKSB7DQoJCQlzZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoYm9va21hcmspOw0KCQl9Ow0KDQoJCS8vIEFkZCBleGVjQ29tbWFuZCBvdmVycmlkZXMNCgkJYWRkQ29tbWFuZHMoew0KCQkJLy8gSWdub3JlIHRoZXNlLCBhZGRlZCBmb3IgY29tcGF0aWJpbGl0eQ0KCQkJJ21jZVJlc2V0RGVzaWduTW9kZSxtY2VCZWdpblVuZG9MZXZlbCcgOiBmdW5jdGlvbigpIHt9LA0KDQoJCQkvLyBBZGQgdW5kbyBtYW5hZ2VyIGxvZ2ljDQoJCQknbWNlRW5kVW5kb0xldmVsLG1jZUFkZFVuZG9MZXZlbCcgOiBmdW5jdGlvbigpIHsNCgkJCQllZGl0b3IudW5kb01hbmFnZXIuYWRkKCk7DQoJCQl9LA0KDQoJCQknQ3V0LENvcHksUGFzdGUnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXZhciBkb2MgPSBlZGl0b3IuZ2V0RG9jKCksIGZhaWxlZDsNCg0KCQkJCS8vIFRyeSBleGVjdXRpbmcgdGhlIG5hdGl2ZSBjb21tYW5kDQoJCQkJdHJ5IHsNCgkJCQkJZXhlY05hdGl2ZUNvbW1hbmQoY29tbWFuZCk7DQoJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJLy8gQ29tbWFuZCBmYWlsZWQNCgkJCQkJZmFpbGVkID0gVFJVRTsNCgkJCQl9DQoNCgkJCQkvLyBQcmVzZW50IGFsZXJ0IG1lc3NhZ2UgYWJvdXQgY2xpcGJvYXJkIGFjY2VzcyBub3QgYmVpbmcgYXZhaWxhYmxlDQoJCQkJaWYgKGZhaWxlZCB8fCAhZG9jLnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChjb21tYW5kKSkgew0KCQkJCQlpZiAodGlueW1jZS5pc0dlY2tvKSB7DQoJCQkJCQllZGl0b3Iud2luZG93TWFuYWdlci5jb25maXJtKGVkaXRvci5nZXRMYW5nKCdjbGlwYm9hcmRfbXNnJyksIGZ1bmN0aW9uKHN0YXRlKSB7DQoJCQkJCQkJaWYgKHN0YXRlKQ0KCQkJCQkJCQlvcGVuKCdodHRwOi8vd3d3Lm1vemlsbGEub3JnL2VkaXRvci9taWRhc2RlbW8vc2VjdXJpdHlwcmVmcy5odG1sJywgJ19ibGFuaycpOw0KCQkJCQkJfSk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJZWRpdG9yLndpbmRvd01hbmFnZXIuYWxlcnQoZWRpdG9yLmdldExhbmcoJ2NsaXBib2FyZF9ub19zdXBwb3J0JykpOw0KCQkJCX0NCgkJCX0sDQoNCgkJCS8vIE92ZXJyaWRlIHVubGluayBjb21tYW5kDQoJCQl1bmxpbmsgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJaWYgKHNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpKQ0KCQkJCQlzZWxlY3Rpb24uc2VsZWN0KHNlbGVjdGlvbi5nZXROb2RlKCkpOw0KDQoJCQkJZXhlY05hdGl2ZUNvbW1hbmQoY29tbWFuZCk7DQoJCQkJc2VsZWN0aW9uLmNvbGxhcHNlKEZBTFNFKTsNCgkJCX0sDQoNCgkJCS8vIE92ZXJyaWRlIGp1c3RpZnkgY29tbWFuZHMgdG8gdXNlIHRoZSB0ZXh0IGZvcm1hdHRlciBlbmdpbmUNCgkJCSdKdXN0aWZ5TGVmdCxKdXN0aWZ5Q2VudGVyLEp1c3RpZnlSaWdodCxKdXN0aWZ5RnVsbCcgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJdmFyIGFsaWduID0gY29tbWFuZC5zdWJzdHJpbmcoNyk7DQoNCgkJCQkvLyBSZW1vdmUgYWxsIG90aGVyIGFsaWdubWVudHMgZmlyc3QNCgkJCQllYWNoKCdsZWZ0LGNlbnRlcixyaWdodCxmdWxsJy5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7DQoJCQkJCWlmIChhbGlnbiAhPSBuYW1lKQ0KCQkJCQkJZWRpdG9yLmZvcm1hdHRlci5yZW1vdmUoJ2FsaWduJyArIG5hbWUpOw0KCQkJCX0pOw0KDQoJCQkJdG9nZ2xlRm9ybWF0KCdhbGlnbicgKyBhbGlnbik7DQoJCQl9LA0KDQoJCQkvLyBPdmVycmlkZSBsaXN0IGNvbW1hbmRzIHRvIGZpeCBXZWJLaXQgYnVnDQoJCQknSW5zZXJ0VW5vcmRlcmVkTGlzdCxJbnNlcnRPcmRlcmVkTGlzdCcgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJdmFyIGxpc3RFbG0sIGxpc3RQYXJlbnQ7DQoNCgkJCQlleGVjTmF0aXZlQ29tbWFuZChjb21tYW5kKTsNCg0KCQkJCS8vIFdlYktpdCBwcm9kdWNlcyBsaXN0cyB3aXRoaW4gYmxvY2sgZWxlbWVudHMgc28gd2UgbmVlZCB0byBzcGxpdCB0aGVtDQoJCQkJLy8gd2Ugd2lsbCByZXBsYWNlIHRoZSBuYXRpdmUgbGlzdCBjcmVhdGlvbiBsb2dpYyB0byBjdXN0b20gbG9naWMgbGF0ZXIgb24NCgkJCQkvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIHRoZSBsaXN0IGNyZWF0aW9uIGxvZ2ljIGlzIHJlbW92ZWQNCgkJCQlsaXN0RWxtID0gZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCAnb2wsdWwnKTsNCgkJCQlpZiAobGlzdEVsbSkgew0KCQkJCQlsaXN0UGFyZW50ID0gbGlzdEVsbS5wYXJlbnROb2RlOw0KDQoJCQkJCS8vIElmIGxpc3QgaXMgd2l0aGluIGEgdGV4dCBibG9jayB0aGVuIHNwbGl0IHRoYXQgYmxvY2sNCgkJCQkJaWYgKC9eKEhbMS02XXxQfEFERFJFU1N8UFJFKSQvLnRlc3QobGlzdFBhcmVudC5ub2RlTmFtZSkpIHsNCgkJCQkJCXN0b3JlU2VsZWN0aW9uKCk7DQoJCQkJCQlkb20uc3BsaXQobGlzdFBhcmVudCwgbGlzdEVsbSk7DQoJCQkJCQlyZXN0b3JlU2VsZWN0aW9uKCk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9LA0KDQoJCQkvLyBPdmVycmlkZSBjb21tYW5kcyB0byB1c2UgdGhlIHRleHQgZm9ybWF0dGVyIGVuZ2luZQ0KCQkJJ0JvbGQsSXRhbGljLFVuZGVybGluZSxTdHJpa2V0aHJvdWdoJyA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQl0b2dnbGVGb3JtYXQoY29tbWFuZCk7DQoJCQl9LA0KDQoJCQkvLyBPdmVycmlkZSBjb21tYW5kcyB0byB1c2UgdGhlIHRleHQgZm9ybWF0dGVyIGVuZ2luZQ0KCQkJJ0ZvcmVDb2xvcixIaWxpdGVDb2xvcixGb250TmFtZScgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQl0b2dnbGVGb3JtYXQoY29tbWFuZCwgdmFsdWUpOw0KCQkJfSwNCg0KCQkJRm9udFNpemUgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQl2YXIgZm9udENsYXNzZXMsIGZvbnRTaXplczsNCg0KCQkJCS8vIENvbnZlcnQgZm9udCBzaXplIDEtNyB0byBzdHlsZXMNCgkJCQlpZiAodmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSA3KSB7DQoJCQkJCWZvbnRTaXplcyA9IHRpbnltY2UuZXhwbG9kZShzZXR0aW5ncy5mb250X3NpemVfc3R5bGVfdmFsdWVzKTsNCgkJCQkJZm9udENsYXNzZXMgPSB0aW55bWNlLmV4cGxvZGUoc2V0dGluZ3MuZm9udF9zaXplX2NsYXNzZXMpOw0KDQoJCQkJCWlmIChmb250Q2xhc3NlcykNCgkJCQkJCXZhbHVlID0gZm9udENsYXNzZXNbdmFsdWUgLSAxXSB8fCB2YWx1ZTsNCgkJCQkJZWxzZQ0KCQkJCQkJdmFsdWUgPSBmb250U2l6ZXNbdmFsdWUgLSAxXSB8fCB2YWx1ZTsNCgkJCQl9DQoNCgkJCQl0b2dnbGVGb3JtYXQoY29tbWFuZCwgdmFsdWUpOw0KCQkJfSwNCg0KCQkJUmVtb3ZlRm9ybWF0IDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCWVkaXRvci5mb3JtYXR0ZXIucmVtb3ZlKGNvbW1hbmQpOw0KCQkJfSwNCg0KCQkJbWNlQmxvY2tRdW90ZSA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQl0b2dnbGVGb3JtYXQoJ2Jsb2NrcXVvdGUnKTsNCgkJCX0sDQoNCgkJCUZvcm1hdEJsb2NrIDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJcmV0dXJuIHRvZ2dsZUZvcm1hdCh2YWx1ZSB8fCAncCcpOw0KCQkJfSwNCg0KCQkJbWNlQ2xlYW51cCA6IGZ1bmN0aW9uKCkgew0KCQkJCXZhciBib29rbWFyayA9IHNlbGVjdGlvbi5nZXRCb29rbWFyaygpOw0KDQoJCQkJZWRpdG9yLnNldENvbnRlbnQoZWRpdG9yLmdldENvbnRlbnQoe2NsZWFudXAgOiBUUlVFfSksIHtjbGVhbnVwIDogVFJVRX0pOw0KDQoJCQkJc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsNCgkJCX0sDQoNCgkJCW1jZVJlbW92ZU5vZGUgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQl2YXIgbm9kZSA9IHZhbHVlIHx8IHNlbGVjdGlvbi5nZXROb2RlKCk7DQoNCgkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgYm9keSBub2RlIGlzbid0IHJlbW92ZWQNCgkJCQlpZiAobm9kZSAhPSBlZGl0b3IuZ2V0Qm9keSgpKSB7DQoJCQkJCXN0b3JlU2VsZWN0aW9uKCk7DQoJCQkJCWVkaXRvci5kb20ucmVtb3ZlKG5vZGUsIFRSVUUpOw0KCQkJCQlyZXN0b3JlU2VsZWN0aW9uKCk7DQoJCQkJfQ0KCQkJfSwNCg0KCQkJbWNlU2VsZWN0Tm9kZURlcHRoIDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJdmFyIGNvdW50ZXIgPSAwOw0KDQoJCQkJZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgY291bnRlcisrID09IHZhbHVlKSB7DQoJCQkJCQlzZWxlY3Rpb24uc2VsZWN0KG5vZGUpOw0KCQkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCQl9DQoJCQkJfSwgZWRpdG9yLmdldEJvZHkoKSk7DQoJCQl9LA0KDQoJCQltY2VTZWxlY3ROb2RlIDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJc2VsZWN0aW9uLnNlbGVjdCh2YWx1ZSk7DQoJCQl9LA0KDQoJCQltY2VJbnNlcnRDb250ZW50IDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJc2VsZWN0aW9uLnNldENvbnRlbnQodmFsdWUpOw0KCQkJfSwNCg0KCQkJbWNlSW5zZXJ0UmF3SFRNTCA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXNlbGVjdGlvbi5zZXRDb250ZW50KCd0aW55X21jZV9tYXJrZXInKTsNCgkJCQllZGl0b3Iuc2V0Q29udGVudChlZGl0b3IuZ2V0Q29udGVudCgpLnJlcGxhY2UoL3RpbnlfbWNlX21hcmtlci9nLCBmdW5jdGlvbigpIHsgcmV0dXJuIHZhbHVlIH0pKTsNCgkJCX0sDQoNCgkJCW1jZVNldENvbnRlbnQgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQllZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7DQoJCQl9LA0KDQoJCQknSW5kZW50LE91dGRlbnQnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXZhciBpbnRlbnRWYWx1ZSwgaW5kZW50VW5pdCwgdmFsdWU7DQoNCgkJCQkvLyBTZXR1cCBpbmRlbnQgbGV2ZWwNCgkJCQlpbnRlbnRWYWx1ZSA9IHNldHRpbmdzLmluZGVudGF0aW9uOw0KCQkJCWluZGVudFVuaXQgPSAvW2EteiVdKyQvaS5leGVjKGludGVudFZhbHVlKTsNCgkJCQlpbnRlbnRWYWx1ZSA9IHBhcnNlSW50KGludGVudFZhbHVlKTsNCg0KCQkJCWlmICghcXVlcnlDb21tYW5kU3RhdGUoJ0luc2VydFVub3JkZXJlZExpc3QnKSAmJiAhcXVlcnlDb21tYW5kU3RhdGUoJ0luc2VydE9yZGVyZWRMaXN0JykpIHsNCgkJCQkJZWFjaChzZWxlY3Rpb24uZ2V0U2VsZWN0ZWRCbG9ja3MoKSwgZnVuY3Rpb24oZWxlbWVudCkgew0KCQkJCQkJaWYgKGNvbW1hbmQgPT0gJ291dGRlbnQnKSB7DQoJCQkJCQkJdmFsdWUgPSBNYXRoLm1heCgwLCBwYXJzZUludChlbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0IHx8IDApIC0gaW50ZW50VmFsdWUpOw0KCQkJCQkJCWRvbS5zZXRTdHlsZShlbGVtZW50LCAncGFkZGluZ0xlZnQnLCB2YWx1ZSA/IHZhbHVlICsgaW5kZW50VW5pdCA6ICcnKTsNCgkJCQkJCX0gZWxzZQ0KCQkJCQkJCWRvbS5zZXRTdHlsZShlbGVtZW50LCAncGFkZGluZ0xlZnQnLCAocGFyc2VJbnQoZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCB8fCAwKSArIGludGVudFZhbHVlKSArIGluZGVudFVuaXQpOw0KCQkJCQl9KTsNCgkJCQl9IGVsc2UNCgkJCQkJZXhlY05hdGl2ZUNvbW1hbmQoY29tbWFuZCk7DQoJCQl9LA0KDQoJCQltY2VSZXBhaW50IDogZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGJvb2ttYXJrOw0KDQoJCQkJaWYgKHRpbnltY2UuaXNHZWNrbykgew0KCQkJCQl0cnkgew0KCQkJCQkJc3RvcmVTZWxlY3Rpb24oVFJVRSk7DQoNCgkJCQkJCWlmIChzZWxlY3Rpb24uZ2V0U2VsKCkpDQoJCQkJCQkJc2VsZWN0aW9uLmdldFNlbCgpLnNlbGVjdEFsbENoaWxkcmVuKGVkaXRvci5nZXRCb2R5KCkpOw0KDQoJCQkJCQlzZWxlY3Rpb24uY29sbGFwc2UoVFJVRSk7DQoJCQkJCQlyZXN0b3JlU2VsZWN0aW9uKCk7DQoJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkvLyBJZ25vcmUNCgkJCQkJfQ0KCQkJCX0NCgkJCX0sDQoNCgkJCW1jZVRvZ2dsZUZvcm1hdCA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCWVkaXRvci5mb3JtYXR0ZXIudG9nZ2xlKHZhbHVlKTsNCgkJCX0sDQoNCgkJCUluc2VydEhvcml6b250YWxSdWxlIDogZnVuY3Rpb24oKSB7DQoJCQkJc2VsZWN0aW9uLnNldENvbnRlbnQoJzxociAvPicpOw0KCQkJfSwNCg0KCQkJbWNlVG9nZ2xlVmlzdWFsQWlkIDogZnVuY3Rpb24oKSB7DQoJCQkJZWRpdG9yLmhhc1Zpc3VhbCA9ICFlZGl0b3IuaGFzVmlzdWFsOw0KCQkJCWVkaXRvci5hZGRWaXN1YWwoKTsNCgkJCX0sDQoNCgkJCW1jZVJlcGxhY2VDb250ZW50IDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJc2VsZWN0aW9uLnNldENvbnRlbnQodmFsdWUucmVwbGFjZSgvXHtcJHNlbGVjdGlvblx9L2csIHNlbGVjdGlvbi5nZXRDb250ZW50KHtmb3JtYXQgOiAndGV4dCd9KSkpOw0KCQkJfSwNCg0KCQkJbWNlSW5zZXJ0TGluayA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXZhciBsaW5rID0gZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCAnYScpOw0KDQoJCQkJaWYgKHRpbnltY2UuaXModmFsdWUsICdzdHJpbmcnKSkNCgkJCQkJdmFsdWUgPSB7aHJlZiA6IHZhbHVlfTsNCg0KCQkJCWlmICghbGluaykgew0KCQkJCQlleGVjTmF0aXZlQ29tbWFuZCgnQ3JlYXRlTGluaycsIEZBTFNFLCAnamF2YXNjcmlwdDptY3RtcCgwKTsnKTsNCgkJCQkJZWFjaChkb20uc2VsZWN0KCdhW2hyZWY9amF2YXNjcmlwdDptY3RtcCgwKTtdJyksIGZ1bmN0aW9uKGxpbmspIHsNCgkJCQkJCWRvbS5zZXRBdHRyaWJzKGxpbmssIHZhbHVlKTsNCgkJCQkJfSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJaWYgKHZhbHVlLmhyZWYpDQoJCQkJCQlkb20uc2V0QXR0cmlicyhsaW5rLCB2YWx1ZSk7DQoJCQkJCWVsc2UNCgkJCQkJCWVkaXRvci5kb20ucmVtb3ZlKGxpbmssIFRSVUUpOw0KCQkJCX0NCgkJCX0sDQoJCQkNCgkJCXNlbGVjdEFsbCA6IGZ1bmN0aW9uKCkgew0KCQkJCXZhciByb290ID0gZG9tLmdldFJvb3QoKSwgcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KDQoJCQkJcm5nLnNldFN0YXJ0KHJvb3QsIDApOw0KCQkJCXJuZy5zZXRFbmQocm9vdCwgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCk7DQoNCgkJCQllZGl0b3Iuc2VsZWN0aW9uLnNldFJuZyhybmcpOw0KCQkJfQ0KCQl9KTsNCg0KCQkvLyBBZGQgcXVlcnlDb21tYW5kU3RhdGUgb3ZlcnJpZGVzDQoJCWFkZENvbW1hbmRzKHsNCgkJCS8vIE92ZXJyaWRlIGp1c3RpZnkgY29tbWFuZHMNCgkJCSdKdXN0aWZ5TGVmdCxKdXN0aWZ5Q2VudGVyLEp1c3RpZnlSaWdodCxKdXN0aWZ5RnVsbCcgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJcmV0dXJuIGlzRm9ybWF0TWF0Y2goJ2FsaWduJyArIGNvbW1hbmQuc3Vic3RyaW5nKDcpKTsNCgkJCX0sDQoNCgkJCSdCb2xkLEl0YWxpYyxVbmRlcmxpbmUsU3RyaWtldGhyb3VnaCcgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJcmV0dXJuIGlzRm9ybWF0TWF0Y2goY29tbWFuZCk7DQoJCQl9LA0KDQoJCQltY2VCbG9ja1F1b3RlIDogZnVuY3Rpb24oKSB7DQoJCQkJcmV0dXJuIGlzRm9ybWF0TWF0Y2goJ2Jsb2NrcXVvdGUnKTsNCgkJCX0sDQoNCgkJCU91dGRlbnQgOiBmdW5jdGlvbigpIHsNCgkJCQl2YXIgbm9kZTsNCg0KCQkJCWlmIChzZXR0aW5ncy5pbmxpbmVfc3R5bGVzKSB7DQoJCQkJCWlmICgobm9kZSA9IGRvbS5nZXRQYXJlbnQoc2VsZWN0aW9uLmdldFN0YXJ0KCksIGRvbS5pc0Jsb2NrKSkgJiYgcGFyc2VJbnQobm9kZS5zdHlsZS5wYWRkaW5nTGVmdCkgPiAwKQ0KCQkJCQkJcmV0dXJuIFRSVUU7DQoNCgkJCQkJaWYgKChub2RlID0gZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0RW5kKCksIGRvbS5pc0Jsb2NrKSkgJiYgcGFyc2VJbnQobm9kZS5zdHlsZS5wYWRkaW5nTGVmdCkgPiAwKQ0KCQkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIHF1ZXJ5Q29tbWFuZFN0YXRlKCdJbnNlcnRVbm9yZGVyZWRMaXN0JykgfHwgcXVlcnlDb21tYW5kU3RhdGUoJ0luc2VydE9yZGVyZWRMaXN0JykgfHwgKCFzZXR0aW5ncy5pbmxpbmVfc3R5bGVzICYmICEhZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCAnQkxPQ0tRVU9URScpKTsNCgkJCX0sDQoNCgkJCSdJbnNlcnRVbm9yZGVyZWRMaXN0LEluc2VydE9yZGVyZWRMaXN0JyA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQlyZXR1cm4gZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCBjb21tYW5kID09ICdpbnNlcnR1bm9yZGVyZWRsaXN0JyA/ICdVTCcgOiAnT0wnKTsNCgkJCX0NCgkJfSwgJ3N0YXRlJyk7DQoNCgkJLy8gQWRkIHF1ZXJ5Q29tbWFuZFZhbHVlIG92ZXJyaWRlcw0KCQlhZGRDb21tYW5kcyh7DQoJCQknRm9udFNpemUsRm9udE5hbWUnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXZhciB2YWx1ZSA9IDAsIHBhcmVudDsNCg0KCQkJCWlmIChwYXJlbnQgPSBkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXROb2RlKCksICdzcGFuJykpIHsNCgkJCQkJaWYgKGNvbW1hbmQgPT0gJ2ZvbnRzaXplJykNCgkJCQkJCXZhbHVlID0gcGFyZW50LnN0eWxlLmZvbnRTaXplOw0KCQkJCQllbHNlDQoJCQkJCQl2YWx1ZSA9IHBhcmVudC5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2UoLywgL2csICcsJykucmVwbGFjZSgvW1wnXCJdL2csICcnKS50b0xvd2VyQ2FzZSgpOw0KCQkJCX0NCg0KCQkJCXJldHVybiB2YWx1ZTsNCgkJCX0NCgkJfSwgJ3ZhbHVlJyk7DQoNCgkJLy8gQWRkIHVuZG8gbWFuYWdlciBsb2dpYw0KCQlpZiAoc2V0dGluZ3MuY3VzdG9tX3VuZG9fcmVkbykgew0KCQkJYWRkQ29tbWFuZHMoew0KCQkJCVVuZG8gOiBmdW5jdGlvbigpIHsNCgkJCQkJZWRpdG9yLnVuZG9NYW5hZ2VyLnVuZG8oKTsNCgkJCQl9LA0KDQoJCQkJUmVkbyA6IGZ1bmN0aW9uKCkgew0KCQkJCQllZGl0b3IudW5kb01hbmFnZXIucmVkbygpOw0KCQkJCX0NCgkJCX0pOw0KCQl9DQoJfTsNCn0pKHRpbnltY2UpOw0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRGlzcGF0Y2hlciA9IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyOw0KDQoJdGlueW1jZS5VbmRvTWFuYWdlciA9IGZ1bmN0aW9uKGVkaXRvcikgew0KCQl2YXIgc2VsZiwgaW5kZXggPSAwLCBkYXRhID0gW107DQoNCgkJZnVuY3Rpb24gZ2V0Q29udGVudCgpIHsNCgkJCXJldHVybiB0aW55bWNlLnRyaW0oZWRpdG9yLmdldENvbnRlbnQoe2Zvcm1hdCA6ICdyYXcnLCBub19ldmVudHMgOiAxfSkpOw0KCQl9Ow0KDQoJCXJldHVybiBzZWxmID0gew0KCQkJdHlwaW5nIDogMCwNCg0KCQkJb25BZGQgOiBuZXcgRGlzcGF0Y2hlcihzZWxmKSwNCgkJCW9uVW5kbyA6IG5ldyBEaXNwYXRjaGVyKHNlbGYpLA0KCQkJb25SZWRvIDogbmV3IERpc3BhdGNoZXIoc2VsZiksDQoNCgkJCWFkZCA6IGZ1bmN0aW9uKGxldmVsKSB7DQoJCQkJdmFyIGksIHNldHRpbmdzID0gZWRpdG9yLnNldHRpbmdzLCBsYXN0TGV2ZWw7DQoNCgkJCQlsZXZlbCA9IGxldmVsIHx8IHt9Ow0KCQkJCWxldmVsLmNvbnRlbnQgPSBnZXRDb250ZW50KCk7DQoNCgkJCQkvLyBBZGQgdW5kbyBsZXZlbCBpZiBuZWVkZWQNCgkJCQlsYXN0TGV2ZWwgPSBkYXRhW2luZGV4XTsNCgkJCQlpZiAobGFzdExldmVsICYmIGxhc3RMZXZlbC5jb250ZW50ID09IGxldmVsLmNvbnRlbnQpIHsNCgkJCQkJaWYgKGluZGV4ID4gMCB8fCBkYXRhLmxlbmd0aCA9PSAxKQ0KCQkJCQkJcmV0dXJuIG51bGw7DQoJCQkJfQ0KDQoJCQkJLy8gVGltZSB0byBjb21wcmVzcw0KCQkJCWlmIChzZXR0aW5ncy5jdXN0b21fdW5kb19yZWRvX2xldmVscykgew0KCQkJCQlpZiAoZGF0YS5sZW5ndGggPiBzZXR0aW5ncy5jdXN0b21fdW5kb19yZWRvX2xldmVscykgew0KCQkJCQkJZm9yIChpID0gMDsgaSA8IGRhdGEubGVuZ3RoIC0gMTsgaSsrKQ0KCQkJCQkJCWRhdGFbaV0gPSBkYXRhW2kgKyAxXTsNCg0KCQkJCQkJZGF0YS5sZW5ndGgtLTsNCgkJCQkJCWluZGV4ID0gZGF0YS5sZW5ndGg7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBHZXQgYSBub24gaW50cnVzaXZlIG5vcm1hbGl6ZWQgYm9va21hcmsNCgkJCQlsZXZlbC5ib29rbWFyayA9IGVkaXRvci5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMiwgdHJ1ZSk7DQoNCgkJCQkvLyBDcm9wIGFycmF5IGlmIG5lZWRlZA0KCQkJCWlmIChpbmRleCA8IGRhdGEubGVuZ3RoIC0gMSkgew0KCQkJCQkvLyBUcmVhdCBmaXJzdCBsZXZlbCBhcyBpbml0aWFsDQoJCQkJCWlmIChpbmRleCA9PSAwKQ0KCQkJCQkJZGF0YSA9IFtdOw0KCQkJCQllbHNlDQoJCQkJCQlkYXRhLmxlbmd0aCA9IGluZGV4ICsgMTsNCgkJCQl9DQoNCgkJCQlkYXRhLnB1c2gobGV2ZWwpOw0KCQkJCWluZGV4ID0gZGF0YS5sZW5ndGggLSAxOw0KDQoJCQkJc2VsZi5vbkFkZC5kaXNwYXRjaChzZWxmLCBsZXZlbCk7DQoJCQkJZWRpdG9yLmlzTm90RGlydHkgPSAwOw0KDQoJCQkJcmV0dXJuIGxldmVsOw0KCQkJfSwNCg0KCQkJdW5kbyA6IGZ1bmN0aW9uKCkgew0KCQkJCXZhciBsZXZlbCwgaTsNCg0KCQkJCWlmIChzZWxmLnR5cGluZykgew0KCQkJCQlzZWxmLmFkZCgpOw0KCQkJCQlzZWxmLnR5cGluZyA9IDA7DQoJCQkJfQ0KDQoJCQkJaWYgKGluZGV4ID4gMCkgew0KCQkJCQlsZXZlbCA9IGRhdGFbLS1pbmRleF07DQoNCgkJCQkJZWRpdG9yLnNldENvbnRlbnQobGV2ZWwuY29udGVudCwge2Zvcm1hdCA6ICdyYXcnfSk7DQoJCQkJCWVkaXRvci5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsobGV2ZWwuYm9va21hcmspOw0KDQoJCQkJCXNlbGYub25VbmRvLmRpc3BhdGNoKHNlbGYsIGxldmVsKTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gbGV2ZWw7DQoJCQl9LA0KDQoJCQlyZWRvIDogZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGxldmVsOw0KDQoJCQkJaWYgKGluZGV4IDwgZGF0YS5sZW5ndGggLSAxKSB7DQoJCQkJCWxldmVsID0gZGF0YVsrK2luZGV4XTsNCg0KCQkJCQllZGl0b3Iuc2V0Q29udGVudChsZXZlbC5jb250ZW50LCB7Zm9ybWF0IDogJ3Jhdyd9KTsNCgkJCQkJZWRpdG9yLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhsZXZlbC5ib29rbWFyayk7DQoNCgkJCQkJc2VsZi5vblJlZG8uZGlzcGF0Y2goc2VsZiwgbGV2ZWwpOw0KCQkJCX0NCg0KCQkJCXJldHVybiBsZXZlbDsNCgkJCX0sDQoNCgkJCWNsZWFyIDogZnVuY3Rpb24oKSB7DQoJCQkJZGF0YSA9IFtdOw0KCQkJCWluZGV4ID0gc2VsZi50eXBpbmcgPSAwOw0KCQkJfSwNCg0KCQkJaGFzVW5kbyA6IGZ1bmN0aW9uKCkgew0KCQkJCXJldHVybiBpbmRleCA+IDAgfHwgc2VsZi50eXBpbmc7DQoJCQl9LA0KDQoJCQloYXNSZWRvIDogZnVuY3Rpb24oKSB7DQoJCQkJcmV0dXJuIGluZGV4IDwgZGF0YS5sZW5ndGggLSAxOw0KCQkJfQ0KCQl9Ow0KCX07DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgkvLyBTaG9ydGVuIG5hbWVzDQoJdmFyIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsDQoJCWlzSUUgPSB0aW55bWNlLmlzSUUsDQoJCWlzR2Vja28gPSB0aW55bWNlLmlzR2Vja28sDQoJCWlzT3BlcmEgPSB0aW55bWNlLmlzT3BlcmEsDQoJCWVhY2ggPSB0aW55bWNlLmVhY2gsDQoJCWV4dGVuZCA9IHRpbnltY2UuZXh0ZW5kLA0KCQlUUlVFID0gdHJ1ZSwNCgkJRkFMU0UgPSBmYWxzZTsNCg0KCWZ1bmN0aW9uIGNsb25lRm9ybWF0cyhub2RlKSB7DQoJCXZhciBjbG9uZSwgdGVtcCwgaW5uZXI7DQoNCgkJZG8gew0KCQkJaWYgKC9eKFNQQU58U1RST05HfEJ8RU18SXxGT05UfFNUUklLRXxVKSQvLnRlc3Qobm9kZS5ub2RlTmFtZSkpIHsNCgkJCQlpZiAoY2xvbmUpIHsNCgkJCQkJdGVtcCA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTsNCgkJCQkJdGVtcC5hcHBlbmRDaGlsZChjbG9uZSk7DQoJCQkJCWNsb25lID0gdGVtcDsNCgkJCQl9IGVsc2Ugew0KCQkJCQljbG9uZSA9IGlubmVyID0gbm9kZS5jbG9uZU5vZGUoZmFsc2UpOw0KCQkJCX0NCg0KCQkJCWNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsNCgkJCX0NCgkJfSB3aGlsZSAobm9kZSA9IG5vZGUucGFyZW50Tm9kZSk7DQoNCgkJaWYgKGNsb25lKQ0KCQkJcmV0dXJuIHt3cmFwcGVyIDogY2xvbmUsIGlubmVyIDogaW5uZXJ9Ow0KCX07DQoNCgkvLyBDaGVja3MgaWYgdGhlIHNlbGVjdGlvbi9jYXJldCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2sgZWxlbWVudA0KCWZ1bmN0aW9uIGlzQXRFbmQocm5nLCBwYXIpIHsNCgkJdmFyIHJuZzIgPSBwYXIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOw0KDQoJCXJuZzIuc2V0U3RhcnQocm5nLmVuZENvbnRhaW5lciwgcm5nLmVuZE9mZnNldCk7DQoJCXJuZzIuc2V0RW5kQWZ0ZXIocGFyKTsNCg0KCQkvLyBHZXQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3IgaWYgaXQncyB6ZXJvIHRoZW4gd2UgYXJlIGF0IHRoZSBlbmQgYW5kIG5lZWQgdG8gbWVyZ2UgdGhlIG5leHQgYmxvY2sgZWxlbWVudA0KCQlyZXR1cm4gcm5nMi5jbG9uZUNvbnRlbnRzKCkudGV4dENvbnRlbnQubGVuZ3RoID09IDA7DQoJfTsNCg0KCWZ1bmN0aW9uIGlzRW1wdHkobikgew0KCQluID0gbi5pbm5lckhUTUw7DQoNCgkJbiA9IG4ucmVwbGFjZSgvPChpbWd8aHJ8dGFibGV8aW5wdXR8c2VsZWN0fHRleHRhcmVhKVsgXD5dL2dpLCAnLScpOyAvLyBLZWVwIHRoZXNlIGNvbnZlcnQgdGhlbSB0byAtIGNoYXJzDQoJCW4gPSBuLnJlcGxhY2UoLzxbXj5dKz4vZywgJycpOyAvLyBSZW1vdmUgYWxsIHRhZ3MNCg0KCQlyZXR1cm4gbi5yZXBsYWNlKC9bIFx1MDBhMFx0XHJcbl0rL2csICcnKSA9PSAnJzsNCgl9Ow0KDQoJZnVuY3Rpb24gc3BsaXRMaXN0KHNlbGVjdGlvbiwgZG9tLCBsaSkgew0KCQl2YXIgbGlzdEJsb2NrLCBibG9jazsNCg0KCQlpZiAoaXNFbXB0eShsaSkpIHsNCgkJCWxpc3RCbG9jayA9IGRvbS5nZXRQYXJlbnQobGksICd1bCxvbCcpOw0KDQoJCQlpZiAoIWRvbS5nZXRQYXJlbnQobGlzdEJsb2NrLnBhcmVudE5vZGUsICd1bCxvbCcpKSB7DQoJCQkJZG9tLnNwbGl0KGxpc3RCbG9jaywgbGkpOw0KCQkJCWJsb2NrID0gZG9tLmNyZWF0ZSgncCcsIDAsICc8YnIgX21jZV9ib2d1cz0iMSIgLz4nKTsNCgkJCQlkb20ucmVwbGFjZShibG9jaywgbGkpOw0KCQkJCXNlbGVjdGlvbi5zZWxlY3QoYmxvY2ssIDEpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCg0KCQlyZXR1cm4gVFJVRTsNCgl9Ow0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UuRm9yY2VCbG9ja3MnLCB7DQoJCUZvcmNlQmxvY2tzIDogZnVuY3Rpb24oZWQpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IGVkLnNldHRpbmdzLCBlbG07DQoNCgkJCXQuZWRpdG9yID0gZWQ7DQoJCQl0LmRvbSA9IGVkLmRvbTsNCgkJCWVsbSA9IChzLmZvcmNlZF9yb290X2Jsb2NrIHx8ICdwJykudG9Mb3dlckNhc2UoKTsNCgkJCXMuZWxlbWVudCA9IGVsbS50b1VwcGVyQ2FzZSgpOw0KDQoJCQllZC5vblByZUluaXQuYWRkKHQuc2V0dXAsIHQpOw0KDQoJCQl0LnJlT3BlcmEgPSBuZXcgUmVnRXhwKCcoXFx1MDBhMHwmIzE2MDt8Jm5ic3A7KTxcLycgKyBlbG0gKyAnPicsICdnaScpOw0KCQkJdC5yZVBhZGQgPSBuZXcgUmVnRXhwKCc8cCggKShbXj5dKyk+PFxcXC9wPnw8cCggKShbXj5dKylcXFwvPnw8cCggKShbXj5dKyk+XFxzKzxcXFwvcD58PHA+PFxcXC9wPnw8cFxcXC8+fDxwPlxccys8XFxcL3A+Jy5yZXBsYWNlKC9wL2csIGVsbSksICdnaScpOw0KCQkJdC5yZU5ic3AyQlIxID0gbmV3IFJlZ0V4cCgnPHAoICkoW14+XSspPltcXHNcXHUwMGEwXSs8XFxcL3A+fDxwPltcXHNcXHUwMGEwXSs8XFxcL3A+Jy5yZXBsYWNlKC9wL2csIGVsbSksICdnaScpOw0KCQkJdC5yZU5ic3AyQlIyID0gbmV3IFJlZ0V4cCgnPCVwKCkoW14+XSspPigmbmJzcDt8JiMxNjA7KTxcXFwvJXA+fDwlcD4oJm5ic3A7fCYjMTYwOyk8XFxcLyVwPicucmVwbGFjZSgvJXAvZywgZWxtKSwgJ2dpJyk7DQoJCQl0LnJlQlIyTmJzcCA9IG5ldyBSZWdFeHAoJzxwKCApKFtePl0rKT5cXHMqPGJyIFxcXC8+XFxzKjxcXFwvcD58PHA+XFxzKjxiciBcXFwvPlxccyo8XFxcL3A+Jy5yZXBsYWNlKC9wL2csIGVsbSksICdnaScpOw0KDQoJCQlmdW5jdGlvbiBwYWRkKGVkLCBvKSB7DQoJCQkJaWYgKGlzT3BlcmEpDQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKHQucmVPcGVyYSwgJzwvJyArIGVsbSArICc+Jyk7DQoNCgkJCQlvLmNvbnRlbnQgPSB0aW55bWNlLl9yZXBsYWNlKHQucmVQYWRkLCAnPCcgKyBlbG0gKyAnJDEkMiQzJDQkNSQ2Plx1MDBhMDwvJyArIGVsbSArICc+Jywgby5jb250ZW50KTsNCg0KCQkJCWlmICghaXNJRSAmJiAhaXNPcGVyYSAmJiBvLnNldCkgew0KCQkJCQkvLyBVc2UgJm5ic3A7IGluc3RlYWQgb2YgQlIgaW4gcGFkZGVkIHBhcmFncmFwaHMNCgkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UodC5yZU5ic3AyQlIxLCAnPCcgKyBlbG0gKyAnJDEkMj48YnIgLz48LycgKyBlbG0gKyAnPicpOw0KCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSh0LnJlTmJzcDJCUjIsICc8JyArIGVsbSArICckMSQyPjxiciAvPjwvJyArIGVsbSArICc+Jyk7DQoJCQkJfSBlbHNlDQoJCQkJCW8uY29udGVudCA9IHRpbnltY2UuX3JlcGxhY2UodC5yZUJSMk5ic3AsICc8JyArIGVsbSArICckMSQyPlx1MDBhMDwvJyArIGVsbSArICc+Jywgby5jb250ZW50KTsNCgkJCX07DQoNCgkJCWVkLm9uQmVmb3JlU2V0Q29udGVudC5hZGQocGFkZCk7DQoJCQllZC5vblBvc3RQcm9jZXNzLmFkZChwYWRkKTsNCg0KCQkJaWYgKHMuZm9yY2VkX3Jvb3RfYmxvY2spIHsNCgkJCQllZC5vbkluaXQuYWRkKHQuZm9yY2VSb290cywgdCk7DQoJCQkJZWQub25TZXRDb250ZW50LmFkZCh0LmZvcmNlUm9vdHMsIHQpOw0KCQkJCWVkLm9uQmVmb3JlR2V0Q29udGVudC5hZGQodC5mb3JjZVJvb3RzLCB0KTsNCgkJCX0NCgkJfSwNCg0KCQlzZXR1cCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBzID0gZWQuc2V0dGluZ3MsIGRvbSA9IGVkLmRvbSwgc2VsZWN0aW9uID0gZWQuc2VsZWN0aW9uOw0KDQoJCQkvLyBGb3JjZSByb290IGJsb2NrcyB3aGVuIHR5cGluZyBhbmQgd2hlbiBnZXR0aW5nIG91dHB1dA0KCQkJaWYgKHMuZm9yY2VkX3Jvb3RfYmxvY2spIHsNCgkJCQllZC5vbkJlZm9yZUV4ZWNDb21tYW5kLmFkZCh0LmZvcmNlUm9vdHMsIHQpOw0KCQkJCWVkLm9uS2V5VXAuYWRkKHQuZm9yY2VSb290cywgdCk7DQoJCQkJZWQub25QcmVQcm9jZXNzLmFkZCh0LmZvcmNlUm9vdHMsIHQpOw0KCQkJfQ0KDQoJCQlpZiAocy5mb3JjZV9icl9uZXdsaW5lcykgew0KCQkJCS8vIEZvcmNlIElFIHRvIHByb2R1Y2UgQlJzIG9uIGVudGVyDQoJCQkJaWYgKGlzSUUpIHsNCgkJCQkJZWQub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJCXZhciBuOw0KDQoJCQkJCQlpZiAoZS5rZXlDb2RlID09IDEzICYmIHNlbGVjdGlvbi5nZXROb2RlKCkubm9kZU5hbWUgIT0gJ0xJJykgew0KCQkJCQkJCXNlbGVjdGlvbi5zZXRDb250ZW50KCc8YnIgaWQ9Il9fIiAvPiAnLCB7Zm9ybWF0IDogJ3Jhdyd9KTsNCgkJCQkJCQluID0gZG9tLmdldCgnX18nKTsNCgkJCQkJCQluLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsNCgkJCQkJCQlzZWxlY3Rpb24uc2VsZWN0KG4pOw0KCQkJCQkJCXNlbGVjdGlvbi5jb2xsYXBzZSgpOw0KCQkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKHMuZm9yY2VfcF9uZXdsaW5lcykgew0KCQkJCWlmICghaXNJRSkgew0KCQkJCQllZC5vbktleVByZXNzLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJaWYgKGUua2V5Q29kZSA9PSAxMyAmJiAhZS5zaGlmdEtleSAmJiAhdC5pbnNlcnRQYXJhKGUpKQ0KCQkJCQkJCUV2ZW50LmNhbmNlbChlKTsNCgkJCQkJfSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gVW5nbHkgaGFjayB0byBmb3IgSUUgdG8gcHJlc2VydmUgdGhlIGZvcm1hdHRpbmcgd2hlbiB5b3UgcHJlc3MNCgkJCQkJLy8gZW50ZXIgYXQgdGhlIGVuZCBvZiBhIGJsb2NrIGVsZW1lbnQgd2l0aCBmb3JtYXR0ZWQgY29udGVudHMNCgkJCQkJLy8gVGhpcyBsb2dpYyBvdmVycmlkZXMgdGhlIGJyb3dzZXJzIGRlZmF1bHQgbG9naWMgd2l0aA0KCQkJCQkvLyBjdXN0b20gbG9naWMgdGhhdCBlbmFibGVzIHVzIHRvIGNvbnRyb2wgdGhlIG91dHB1dA0KCQkJCQl0aW55bWNlLmFkZFVubG9hZChmdW5jdGlvbigpIHsNCgkJCQkJCXQuX3ByZXZpb3VzRm9ybWF0cyA9IDA7IC8vIEZpeCBJRSBsZWFrDQoJCQkJCX0pOw0KDQoJCQkJCWVkLm9uS2V5UHJlc3MuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCQl0Ll9wcmV2aW91c0Zvcm1hdHMgPSAwOw0KDQoJCQkJCQkvLyBDbG9uZSB0aGUgY3VycmVudCBmb3JtYXRzLCB0aGlzIHdpbGwgbGF0ZXIgYmUgYXBwbGllZCB0byB0aGUgbmV3IGJsb2NrIGNvbnRlbnRzDQoJCQkJCQlpZiAoZS5rZXlDb2RlID09IDEzICYmICFlLnNoaWZ0S2V5ICYmIGVkLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpICYmIHMua2VlcF9zdHlsZXMpDQoJCQkJCQkJdC5fcHJldmlvdXNGb3JtYXRzID0gY2xvbmVGb3JtYXRzKGVkLnNlbGVjdGlvbi5nZXRTdGFydCgpKTsNCgkJCQkJfSk7DQoNCgkJCQkJZWQub25LZXlVcC5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJCS8vIExldCBJRSBicmVhayB0aGUgZWxlbWVudCBhbmQgdGhlIHdyYXAgdGhlIG5ldyBjYXJldCBsb2NhdGlvbiBpbiB0aGUgcHJldmlvdXMgZm9ybWF0cw0KCQkJCQkJaWYgKGUua2V5Q29kZSA9PSAxMyAmJiAhZS5zaGlmdEtleSkgew0KCQkJCQkJCXZhciBwYXJlbnQgPSBlZC5zZWxlY3Rpb24uZ2V0U3RhcnQoKSwgZm10ID0gdC5fcHJldmlvdXNGb3JtYXRzOw0KDQoJCQkJCQkJLy8gUGFyZW50IGlzIGFuIGVtcHR5IGJsb2NrDQoJCQkJCQkJaWYgKCFwYXJlbnQuaGFzQ2hpbGROb2RlcygpICYmIGZtdCkgew0KCQkJCQkJCQlwYXJlbnQgPSBkb20uZ2V0UGFyZW50KHBhcmVudCwgZG9tLmlzQmxvY2spOw0KDQoJCQkJCQkJCWlmIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVOYW1lICE9ICdMSScpIHsNCgkJCQkJCQkJCXBhcmVudC5pbm5lckhUTUwgPSAnJzsNCg0KCQkJCQkJCQkJaWYgKHQuX3ByZXZpb3VzRm9ybWF0cykgew0KCQkJCQkJCQkJCXBhcmVudC5hcHBlbmRDaGlsZChmbXQud3JhcHBlcik7DQoJCQkJCQkJCQkJZm10LmlubmVyLmlubmVySFRNTCA9ICdcdUZFRkYnOw0KCQkJCQkJCQkJfSBlbHNlDQoJCQkJCQkJCQkJcGFyZW50LmlubmVySFRNTCA9ICdcdUZFRkYnOw0KDQoJCQkJCQkJCQlzZWxlY3Rpb24uc2VsZWN0KHBhcmVudCwgMSk7DQoJCQkJCQkJCQllZC5nZXREb2MoKS5leGVjQ29tbWFuZCgnRGVsZXRlJywgZmFsc2UsIG51bGwpOw0KCQkJCQkJCQkJdC5fcHJldmlvdXNGb3JtYXRzID0gMDsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfQ0KDQoJCQkJaWYgKGlzR2Vja28pIHsNCgkJCQkJZWQub25LZXlEb3duLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJaWYgKChlLmtleUNvZGUgPT0gOCB8fCBlLmtleUNvZGUgPT0gNDYpICYmICFlLnNoaWZ0S2V5KQ0KCQkJCQkJCXQuYmFja3NwYWNlRGVsZXRlKGUsIGUua2V5Q29kZSA9PSA4KTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBXb3JrYXJvdW5kIGZvciBtaXNzaW5nIHNoaWZ0K2VudGVyIHN1cHBvcnQsIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2OTczDQoJCQlpZiAodGlueW1jZS5pc1dlYktpdCkgew0KCQkJCWZ1bmN0aW9uIGluc2VydEJyKGVkKSB7DQoJCQkJCXZhciBybmcgPSBzZWxlY3Rpb24uZ2V0Um5nKCksIGJyLCBkaXYgPSBkb20uY3JlYXRlKCdkaXYnLCBudWxsLCAnICcpLCBkaXZZUG9zLCB2cEhlaWdodCA9IGRvbS5nZXRWaWV3UG9ydChlZC5nZXRXaW4oKSkuaDsNCg0KCQkJCQkvLyBJbnNlcnQgQlIgZWxlbWVudA0KCQkJCQlybmcuaW5zZXJ0Tm9kZShiciA9IGRvbS5jcmVhdGUoJ2JyJykpOw0KDQoJCQkJCS8vIFBsYWNlIGNhcmV0IGFmdGVyIEJSDQoJCQkJCXJuZy5zZXRTdGFydEFmdGVyKGJyKTsNCgkJCQkJcm5nLnNldEVuZEFmdGVyKGJyKTsNCgkJCQkJc2VsZWN0aW9uLnNldFJuZyhybmcpOw0KDQoJCQkJCS8vIENvdWxkIG5vdCBwbGFjZSBjYXJldCBhZnRlciBCUiB0aGVuIGluc2VydCBhbiBuYnNwIGVudGl0eSBhbmQgbW92ZSB0aGUgY2FyZXQNCgkJCQkJaWYgKHNlbGVjdGlvbi5nZXRTZWwoKS5mb2N1c05vZGUgPT0gYnIucHJldmlvdXNTaWJsaW5nKSB7DQoJCQkJCQlzZWxlY3Rpb24uc2VsZWN0KGRvbS5pbnNlcnRBZnRlcihkb20uZG9jLmNyZWF0ZVRleHROb2RlKCdcdTAwYTAnKSwgYnIpKTsNCgkJCQkJCXNlbGVjdGlvbi5jb2xsYXBzZShUUlVFKTsNCgkJCQkJfQ0KDQoJCQkJCS8vIENyZWF0ZSBhIHRlbXBvcmFyeSBESVYgYWZ0ZXIgdGhlIEJSIGFuZCBnZXQgdGhlIHBvc2l0aW9uIGFzIGl0DQoJCQkJCS8vIHNlZW1zIGxpa2UgZ2V0UG9zKCkgcmV0dXJucyAwIGZvciB0ZXh0IG5vZGVzIGFuZCBCUiBlbGVtZW50cy4NCgkJCQkJZG9tLmluc2VydEFmdGVyKGRpdiwgYnIpOw0KCQkJCQlkaXZZUG9zID0gZG9tLmdldFBvcyhkaXYpLnk7DQoJCQkJCWRvbS5yZW1vdmUoZGl2KTsNCg0KCQkJCQkvLyBTY3JvbGwgdG8gbmV3IHBvc2l0aW9uLCBzY3JvbGxJbnRvVmlldyBjYW4ndCBiZSB1c2VkIGR1ZSB0byBidWc6IGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2MTE3DQoJCQkJCWlmIChkaXZZUG9zID4gdnBIZWlnaHQpIC8vIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gc2Nyb2xsIGlmIHRoZSBESVYgaXMgaW5zaWRlIHRoZSB2aWV3IHBvcnQuDQoJCQkJCQllZC5nZXRXaW4oKS5zY3JvbGxUbygwLCBkaXZZUG9zKTsNCgkJCQl9Ow0KDQoJCQkJZWQub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJaWYgKGUua2V5Q29kZSA9PSAxMyAmJiAoZS5zaGlmdEtleSB8fCAocy5mb3JjZV9icl9uZXdsaW5lcyAmJiAhZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCAnaDEsaDIsaDMsaDQsaDUsaDYsb2wsdWwnKSkpKSB7DQoJCQkJCQlpbnNlcnRCcihlZCk7DQoJCQkJCQlFdmVudC5jYW5jZWwoZSk7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gUGFkZCBlbXB0eSBpbmxpbmUgZWxlbWVudHMgd2l0aGluIGJsb2NrIGVsZW1lbnRzDQoJCQkvLyBGb3IgZXhhbXBsZTogPHA+PHN0cm9uZz48ZW0+PC9lbT48L3N0cm9uZz48L3A+IGJlY29tZXMgPHA+PHN0cm9uZz48ZW0+Jm5ic3A7PC9lbT48L3N0cm9uZz48L3A+DQoJCQllZC5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJZWFjaChkb20uc2VsZWN0KCdwLGgxLGgyLGgzLGg0LGg1LGg2LGRpdicsIG8ubm9kZSksIGZ1bmN0aW9uKHApIHsNCgkJCQkJaWYgKGlzRW1wdHkocCkpIHsNCgkJCQkJCWVhY2goZG9tLnNlbGVjdCgnc3BhbixlbSxzdHJvbmcsYixpJywgby5ub2RlKSwgZnVuY3Rpb24obikgew0KCQkJCQkJCWlmICghbi5oYXNDaGlsZE5vZGVzKCkpIHsNCgkJCQkJCQkJbi5hcHBlbmRDaGlsZChlZC5nZXREb2MoKS5jcmVhdGVUZXh0Tm9kZSgnXHUwMGEwJykpOw0KCQkJCQkJCQlyZXR1cm4gRkFMU0U7IC8vIEJyZWFrIHRoZSBsb29wIG9uZSBwYWRkaW5nIGlzIGVub3VnaA0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9KTsNCg0KCQkJLy8gSUUgc3BlY2lmaWMgZml4ZXMNCgkJCWlmIChpc0lFKSB7DQoJCQkJLy8gUmVwbGFjZXMgSUU6cyBhdXRvIGdlbmVyYXRlZCBwYXJhZ3JhcGhzIHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IG5hbWUNCgkJCQlpZiAocy5lbGVtZW50ICE9ICdQJykgew0KCQkJCQllZC5vbktleVByZXNzLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJdC5sYXN0RWxtID0gc2VsZWN0aW9uLmdldE5vZGUoKS5ub2RlTmFtZTsNCgkJCQkJfSk7DQoNCgkJCQkJZWQub25LZXlVcC5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJCXZhciBibCwgbiA9IHNlbGVjdGlvbi5nZXROb2RlKCksIGIgPSBlZC5nZXRCb2R5KCk7DQoNCgkJCQkJCWlmIChiLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIG4ubm9kZU5hbWUgPT0gJ1AnKSB7DQoJCQkJCQkJbiA9IGRvbS5yZW5hbWUobiwgcy5lbGVtZW50KTsNCgkJCQkJCQlzZWxlY3Rpb24uc2VsZWN0KG4pOw0KCQkJCQkJCXNlbGVjdGlvbi5jb2xsYXBzZSgpOw0KCQkJCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCQkJCQl9IGVsc2UgaWYgKGUua2V5Q29kZSA9PSAxMyAmJiAhZS5zaGlmdEtleSAmJiB0Lmxhc3RFbG0gIT0gJ1AnKSB7DQoJCQkJCQkJYmwgPSBkb20uZ2V0UGFyZW50KG4sICdwJyk7DQoNCgkJCQkJCQlpZiAoYmwpIHsNCgkJCQkJCQkJZG9tLnJlbmFtZShibCwgcy5lbGVtZW50KTsNCgkJCQkJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0NCgkJfSwNCg0KCQlmaW5kIDogZnVuY3Rpb24obiwgdCwgcykgew0KCQkJdmFyIGVkID0gdGhpcy5lZGl0b3IsIHcgPSBlZC5nZXREb2MoKS5jcmVhdGVUcmVlV2Fsa2VyKG4sIDQsIG51bGwsIEZBTFNFKSwgYyA9IC0xOw0KDQoJCQl3aGlsZSAobiA9IHcubmV4dE5vZGUoKSkgew0KCQkJCWMrKzsNCg0KCQkJCS8vIEluZGV4IGJ5IG5vZGUNCgkJCQlpZiAodCA9PSAwICYmIG4gPT0gcykNCgkJCQkJcmV0dXJuIGM7DQoNCgkJCQkvLyBOb2RlIGJ5IGluZGV4DQoJCQkJaWYgKHQgPT0gMSAmJiBjID09IHMpDQoJCQkJCXJldHVybiBuOw0KCQkJfQ0KDQoJCQlyZXR1cm4gLTE7DQoJCX0sDQoNCgkJZm9yY2VSb290cyA6IGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIGIgPSBlZC5nZXRCb2R5KCksIGQgPSBlZC5nZXREb2MoKSwgc2UgPSBlZC5zZWxlY3Rpb24sIHMgPSBzZS5nZXRTZWwoKSwgciA9IHNlLmdldFJuZygpLCBzaSA9IC0yLCBlaSwgc28sIGVvLCB0ciwgYyA9IC0weEZGRkZGRjsNCgkJCXZhciBueCwgYmwsIGJwLCBzcCwgbGUsIG5sID0gYi5jaGlsZE5vZGVzLCBpLCBuLCBlaWQ7DQoNCgkJCS8vIEZpeCBmb3IgYnVnICMxODYzODQ3DQoJCQkvL2lmIChlICYmIGUua2V5Q29kZSA9PSAxMykNCgkJCS8vCXJldHVybiBUUlVFOw0KDQoJCQkvLyBXcmFwIG5vbiBibG9ja3MgaW50byBibG9ja3MNCgkJCWZvciAoaSA9IG5sLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJbnggPSBubFtpXTsNCg0KCQkJCS8vIElnbm9yZSBpbnRlcm5hbCBlbGVtZW50cw0KCQkJCWlmIChueC5ub2RlVHlwZSA9PT0gMSAmJiBueC5nZXRBdHRyaWJ1dGUoJ19tY2VfdHlwZScpKSB7DQoJCQkJCWJsID0gbnVsbDsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KDQoJCQkJLy8gSXMgdGV4dCBvciBub24gYmxvY2sgZWxlbWVudA0KCQkJCWlmIChueC5ub2RlVHlwZSA9PT0gMyB8fCAoIXQuZG9tLmlzQmxvY2sobngpICYmIG54Lm5vZGVUeXBlICE9PSA4ICYmICEvXihzY3JpcHR8bWNlOnNjcmlwdHxzdHlsZXxtY2U6c3R5bGUpJC9pLnRlc3Qobngubm9kZU5hbWUpKSkgew0KCQkJCQlpZiAoIWJsKSB7DQoJCQkJCQkvLyBDcmVhdGUgbmV3IGJsb2NrIGJ1dCBpZ25vcmUgd2hpdGVzcGFjZQ0KCQkJCQkJaWYgKG54Lm5vZGVUeXBlICE9IDMgfHwgL1teXHNdL2cudGVzdChueC5ub2RlVmFsdWUpKSB7DQoJCQkJCQkJLy8gU3RvcmUgc2VsZWN0aW9uDQoJCQkJCQkJaWYgKHNpID09IC0yICYmIHIpIHsNCgkJCQkJCQkJaWYgKCFpc0lFIHx8IHIuc2V0U3RhcnQpIHsNCgkJCQkJCQkJCS8vIElmIHNlbGVjdGlvbiBpcyBlbGVtZW50IHRoZW4gbWFyayBpdA0KCQkJCQkJCQkJaWYgKHIuc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMSAmJiAobiA9IHIuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tyLnN0YXJ0T2Zmc2V0XSkgJiYgbi5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJCQkJCQkJLy8gU2F2ZSB0aGUgaWQgb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnQNCgkJCQkJCQkJCQllaWQgPSBuLmdldEF0dHJpYnV0ZSgiaWQiKTsNCgkJCQkJCQkJCQluLnNldEF0dHJpYnV0ZSgiaWQiLCAiX19tY2UiKTsNCgkJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQkJLy8gSWYgZWxlbWVudCBpcyBpbnNpZGUgYm9keSwgbWlnaHQgbm90IGJlIHRoZSBjYXNlIGluIGNvbnRlbnRFZGlhYmxlIG1vZGUNCgkJCQkJCQkJCQlpZiAoZWQuZG9tLmdldFBhcmVudChyLnN0YXJ0Q29udGFpbmVyLCBmdW5jdGlvbihlKSB7cmV0dXJuIGUgPT09IGI7fSkpIHsNCgkJCQkJCQkJCQkJc28gPSByLnN0YXJ0T2Zmc2V0Ow0KCQkJCQkJCQkJCQllbyA9IHIuZW5kT2Zmc2V0Ow0KCQkJCQkJCQkJCQlzaSA9IHQuZmluZChiLCAwLCByLnN0YXJ0Q29udGFpbmVyKTsNCgkJCQkJCQkJCQkJZWkgPSB0LmZpbmQoYiwgMCwgci5lbmRDb250YWluZXIpOw0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCX0NCgkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCS8vIEZvcmNlIGNvbnRyb2wgcmFuZ2UgaW50byB0ZXh0IHJhbmdlDQoJCQkJCQkJCQlpZiAoci5pdGVtKSB7DQoJCQkJCQkJCQkJdHIgPSBkLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7DQoJCQkJCQkJCQkJdHIubW92ZVRvRWxlbWVudFRleHQoci5pdGVtKDApKTsNCgkJCQkJCQkJCQlyID0gdHI7DQoJCQkJCQkJCQl9DQoNCgkJCQkJCQkJCXRyID0gZC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOw0KCQkJCQkJCQkJdHIubW92ZVRvRWxlbWVudFRleHQoYik7DQoJCQkJCQkJCQl0ci5jb2xsYXBzZSgxKTsNCgkJCQkJCQkJCWJwID0gdHIubW92ZSgnY2hhcmFjdGVyJywgYykgKiAtMTsNCg0KCQkJCQkJCQkJdHIgPSByLmR1cGxpY2F0ZSgpOw0KCQkJCQkJCQkJdHIuY29sbGFwc2UoMSk7DQoJCQkJCQkJCQlzcCA9IHRyLm1vdmUoJ2NoYXJhY3RlcicsIGMpICogLTE7DQoNCgkJCQkJCQkJCXRyID0gci5kdXBsaWNhdGUoKTsNCgkJCQkJCQkJCXRyLmNvbGxhcHNlKDApOw0KCQkJCQkJCQkJbGUgPSAodHIubW92ZSgnY2hhcmFjdGVyJywgYykgKiAtMSkgLSBzcDsNCg0KCQkJCQkJCQkJc2kgPSBzcCAtIGJwOw0KCQkJCQkJCQkJZWkgPSBsZTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCg0KCQkJCQkJCS8vIFVzZXMgcmVwbGFjZUNoaWxkIGluc3RlYWQgb2YgY2xvbmVOb2RlIHNpbmNlIGl0IHJlbW92ZXMgc2VsZWN0ZWQgYXR0cmlidXRlIGZyb20gb3B0aW9uIGVsZW1lbnRzIG9uIElFDQoJCQkJCQkJLy8gU2VlOiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzgyOTkwNw0KCQkJCQkJCWJsID0gZWQuZG9tLmNyZWF0ZShlZC5zZXR0aW5ncy5mb3JjZWRfcm9vdF9ibG9jayk7DQoJCQkJCQkJbngucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYmwsIG54KTsNCgkJCQkJCQlibC5hcHBlbmRDaGlsZChueCk7DQoJCQkJCQl9DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlpZiAoYmwuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCQkJCWJsLmluc2VydEJlZm9yZShueCwgYmwuZmlyc3RDaGlsZCk7DQoJCQkJCQllbHNlDQoJCQkJCQkJYmwuYXBwZW5kQ2hpbGQobngpOw0KCQkJCQl9DQoJCQkJfSBlbHNlDQoJCQkJCWJsID0gbnVsbDsgLy8gVGltZSB0byBjcmVhdGUgbmV3IGJsb2NrDQoJCQl9DQoNCgkJCS8vIFJlc3RvcmUgc2VsZWN0aW9uDQoJCQlpZiAoc2kgIT0gLTIpIHsNCgkJCQlpZiAoIWlzSUUgfHwgci5zZXRTdGFydCkgew0KCQkJCQlibCA9IGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZWQuc2V0dGluZ3MuZWxlbWVudClbMF07DQoJCQkJCXIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoNCgkJCQkJLy8gU2VsZWN0IGxhc3QgbG9jYXRpb24gb3IgZ2VuZXJhdGVkIGJsb2NrDQoJCQkJCWlmIChzaSAhPSAtMSkNCgkJCQkJCXIuc2V0U3RhcnQodC5maW5kKGIsIDEsIHNpKSwgc28pOw0KCQkJCQllbHNlDQoJCQkJCQlyLnNldFN0YXJ0KGJsLCAwKTsNCg0KCQkJCQkvLyBTZWxlY3QgbGFzdCBsb2NhdGlvbiBvciBnZW5lcmF0ZWQgYmxvY2sNCgkJCQkJaWYgKGVpICE9IC0xKQ0KCQkJCQkJci5zZXRFbmQodC5maW5kKGIsIDEsIGVpKSwgZW8pOw0KCQkJCQllbHNlDQoJCQkJCQlyLnNldEVuZChibCwgMCk7DQoNCgkJCQkJaWYgKHMpIHsNCgkJCQkJCXMucmVtb3ZlQWxsUmFuZ2VzKCk7DQoJCQkJCQlzLmFkZFJhbmdlKHIpOw0KCQkJCQl9DQoJCQkJfSBlbHNlIHsNCgkJCQkJdHJ5IHsNCgkJCQkJCXIgPSBzLmNyZWF0ZVJhbmdlKCk7DQoJCQkJCQlyLm1vdmVUb0VsZW1lbnRUZXh0KGIpOw0KCQkJCQkJci5jb2xsYXBzZSgxKTsNCgkJCQkJCXIubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBzaSk7DQoJCQkJCQlyLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGVpKTsNCgkJCQkJCXIuc2VsZWN0KCk7DQoJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkvLyBJZ25vcmUNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSBpZiAoKCFpc0lFIHx8IHIuc2V0U3RhcnQpICYmIChuID0gZWQuZG9tLmdldCgnX19tY2UnKSkpIHsNCgkJCQkvLyBSZXN0b3JlIHRoZSBpZCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudA0KCQkJCWlmIChlaWQpDQoJCQkJCW4uc2V0QXR0cmlidXRlKCdpZCcsIGVpZCk7DQoJCQkJZWxzZQ0KCQkJCQluLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsNCg0KCQkJCS8vIE1vdmUgY2FyZXQgYmVmb3JlIHNlbGVjdGVkIGVsZW1lbnQNCgkJCQlyID0gZC5jcmVhdGVSYW5nZSgpOw0KCQkJCXIuc2V0U3RhcnRCZWZvcmUobik7DQoJCQkJci5zZXRFbmRCZWZvcmUobik7DQoJCQkJc2Uuc2V0Um5nKHIpOw0KCQkJfQ0KCQl9LA0KDQoJCWdldFBhcmVudEJsb2NrIDogZnVuY3Rpb24obikgew0KCQkJdmFyIGQgPSB0aGlzLmRvbTsNCg0KCQkJcmV0dXJuIGQuZ2V0UGFyZW50KG4sIGQuaXNCbG9jayk7DQoJCX0sDQoNCgkJaW5zZXJ0UGFyYSA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgZG9tID0gZWQuZG9tLCBkID0gZWQuZ2V0RG9jKCksIHNlID0gZWQuc2V0dGluZ3MsIHMgPSBlZC5zZWxlY3Rpb24uZ2V0U2VsKCksIHIgPSBzLmdldFJhbmdlQXQoMCksIGIgPSBkLmJvZHk7DQoJCQl2YXIgcmIsIHJhLCBkaXIsIHNuLCBzbywgZW4sIGVvLCBzYiwgZWIsIGJuLCBiZWYsIGFmdCwgc2MsIGVjLCBuLCB2cCA9IGRvbS5nZXRWaWV3UG9ydChlZC5nZXRXaW4oKSksIHksIGNoLCBjYXI7DQoNCgkJCS8vIElmIHJvb3QgYmxvY2tzIGFyZSBmb3JjZWQgdGhlbiB1c2UgT3BlcmFzIGRlZmF1bHQgYmVoYXZpb3Igc2luY2UgaXQncyByZWFsbHkgZ29vZA0KLy8gUmVtb3ZlZCBkdWUgdG8gYnVnOiAjMTg1MzgxNg0KLy8JCQlpZiAoc2UuZm9yY2VkX3Jvb3RfYmxvY2sgJiYgaXNPcGVyYSkNCi8vCQkJCXJldHVybiBUUlVFOw0KDQoJCQkvLyBTZXR1cCBiZWZvcmUgcmFuZ2UNCgkJCXJiID0gZC5jcmVhdGVSYW5nZSgpOw0KDQoJCQkvLyBJZiBpcyBiZWZvcmUgdGhlIGZpcnN0IGJsb2NrIGVsZW1lbnQgYW5kIGluIGJvZHksIHRoZW4gbW92ZSBpdCBpbnRvIGZpcnN0IGJsb2NrIGVsZW1lbnQNCgkJCXJiLnNldFN0YXJ0KHMuYW5jaG9yTm9kZSwgcy5hbmNob3JPZmZzZXQpOw0KCQkJcmIuY29sbGFwc2UoVFJVRSk7DQoNCgkJCS8vIFNldHVwIGFmdGVyIHJhbmdlDQoJCQlyYSA9IGQuY3JlYXRlUmFuZ2UoKTsNCg0KCQkJLy8gSWYgaXMgYmVmb3JlIHRoZSBmaXJzdCBibG9jayBlbGVtZW50IGFuZCBpbiBib2R5LCB0aGVuIG1vdmUgaXQgaW50byBmaXJzdCBibG9jayBlbGVtZW50DQoJCQlyYS5zZXRTdGFydChzLmZvY3VzTm9kZSwgcy5mb2N1c09mZnNldCk7DQoJCQlyYS5jb2xsYXBzZShUUlVFKTsNCg0KCQkJLy8gU2V0dXAgc3RhcnQvZW5kIHBvaW50cw0KCQkJZGlyID0gcmIuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHJiLlNUQVJUX1RPX0VORCwgcmEpIDwgMDsNCgkJCXNuID0gZGlyID8gcy5hbmNob3JOb2RlIDogcy5mb2N1c05vZGU7DQoJCQlzbyA9IGRpciA/IHMuYW5jaG9yT2Zmc2V0IDogcy5mb2N1c09mZnNldDsNCgkJCWVuID0gZGlyID8gcy5mb2N1c05vZGUgOiBzLmFuY2hvck5vZGU7DQoJCQllbyA9IGRpciA/IHMuZm9jdXNPZmZzZXQgOiBzLmFuY2hvck9mZnNldDsNCg0KCQkJLy8gSWYgc2VsZWN0aW9uIGlzIGluIGVtcHR5IHRhYmxlIGNlbGwNCgkJCWlmIChzbiA9PT0gZW4gJiYgL14oVER8VEgpJC8udGVzdChzbi5ub2RlTmFtZSkpIHsNCgkJCQlpZiAoc24uZmlyc3RDaGlsZC5ub2RlTmFtZSA9PSAnQlInKQ0KCQkJCQlkb20ucmVtb3ZlKHNuLmZpcnN0Q2hpbGQpOyAvLyBSZW1vdmUgQlINCg0KCQkJCS8vIENyZWF0ZSB0d28gbmV3IGJsb2NrIGVsZW1lbnRzDQoJCQkJaWYgKHNuLmNoaWxkTm9kZXMubGVuZ3RoID09IDApIHsNCgkJCQkJZWQuZG9tLmFkZChzbiwgc2UuZWxlbWVudCwgbnVsbCwgJzxiciAvPicpOw0KCQkJCQlhZnQgPSBlZC5kb20uYWRkKHNuLCBzZS5lbGVtZW50LCBudWxsLCAnPGJyIC8+Jyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJbiA9IHNuLmlubmVySFRNTDsNCgkJCQkJc24uaW5uZXJIVE1MID0gJyc7DQoJCQkJCWVkLmRvbS5hZGQoc24sIHNlLmVsZW1lbnQsIG51bGwsIG4pOw0KCQkJCQlhZnQgPSBlZC5kb20uYWRkKHNuLCBzZS5lbGVtZW50LCBudWxsLCAnPGJyIC8+Jyk7DQoJCQkJfQ0KDQoJCQkJLy8gTW92ZSBjYXJldCBpbnRvIHRoZSBsYXN0IG9uZQ0KCQkJCXIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoJCQkJci5zZWxlY3ROb2RlQ29udGVudHMoYWZ0KTsNCgkJCQlyLmNvbGxhcHNlKDEpOw0KCQkJCWVkLnNlbGVjdGlvbi5zZXRSbmcocik7DQoNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoNCgkJCS8vIElmIHRoZSBjYXJldCBpcyBpbiBhbiBpbnZhbGlkIGxvY2F0aW9uIGluIEZGIHdlIG5lZWQgdG8gbW92ZSBpdCBpbnRvIHRoZSBmaXJzdCBibG9jaw0KCQkJaWYgKHNuID09IGIgJiYgZW4gPT0gYiAmJiBiLmZpcnN0Q2hpbGQgJiYgZWQuZG9tLmlzQmxvY2soYi5maXJzdENoaWxkKSkgew0KCQkJCXNuID0gZW4gPSBzbi5maXJzdENoaWxkOw0KCQkJCXNvID0gZW8gPSAwOw0KCQkJCXJiID0gZC5jcmVhdGVSYW5nZSgpOw0KCQkJCXJiLnNldFN0YXJ0KHNuLCAwKTsNCgkJCQlyYSA9IGQuY3JlYXRlUmFuZ2UoKTsNCgkJCQlyYS5zZXRTdGFydChlbiwgMCk7DQoJCQl9DQoNCgkJCS8vIE5ldmVyIHVzZSBib2R5IGFzIHN0YXJ0IG9yIGVuZCBub2RlDQoJCQlzbiA9IHNuLm5vZGVOYW1lID09ICJIVE1MIiA/IGQuYm9keSA6IHNuOyAvLyBGaXggZm9yIE9wZXJhIGJ1ZzogaHR0cHM6Ly9idWdzLm9wZXJhLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MjczMjI0JmNvbW1lbnRzPXllcw0KCQkJc24gPSBzbi5ub2RlTmFtZSA9PSAiQk9EWSIgPyBzbi5maXJzdENoaWxkIDogc247DQoJCQllbiA9IGVuLm5vZGVOYW1lID09ICJIVE1MIiA/IGQuYm9keSA6IGVuOyAvLyBGaXggZm9yIE9wZXJhIGJ1ZzogaHR0cHM6Ly9idWdzLm9wZXJhLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MjczMjI0JmNvbW1lbnRzPXllcw0KCQkJZW4gPSBlbi5ub2RlTmFtZSA9PSAiQk9EWSIgPyBlbi5maXJzdENoaWxkIDogZW47DQoNCgkJCS8vIEdldCBzdGFydCBhbmQgZW5kIGJsb2Nrcw0KCQkJc2IgPSB0LmdldFBhcmVudEJsb2NrKHNuKTsNCgkJCWViID0gdC5nZXRQYXJlbnRCbG9jayhlbik7DQoJCQlibiA9IHNiID8gc2Iubm9kZU5hbWUgOiBzZS5lbGVtZW50OyAvLyBHZXQgYmxvY2sgbmFtZSB0byBjcmVhdGUNCg0KCQkJLy8gUmV0dXJuIGluc2lkZSBsaXN0IHVzZSBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3INCgkJCWlmIChuID0gdC5kb20uZ2V0UGFyZW50KHNiLCAnbGkscHJlJykpIHsNCgkJCQlpZiAobi5ub2RlTmFtZSA9PSAnTEknKQ0KCQkJCQlyZXR1cm4gc3BsaXRMaXN0KGVkLnNlbGVjdGlvbiwgdC5kb20sIG4pOw0KDQoJCQkJcmV0dXJuIFRSVUU7DQoJCQl9DQoNCgkJCS8vIElmIGNhcHRpb24gb3IgYWJzb2x1dGUgbGF5ZXJzIHRoZW4gYWx3YXlzIGdlbmVyYXRlIG5ldyBibG9ja3Mgd2l0aGluDQoJCQlpZiAoc2IgJiYgKHNiLm5vZGVOYW1lID09ICdDQVBUSU9OJyB8fCAvYWJzb2x1dGV8cmVsYXRpdmV8Zml4ZWQvZ2kudGVzdChkb20uZ2V0U3R5bGUoc2IsICdwb3NpdGlvbicsIDEpKSkpIHsNCgkJCQlibiA9IHNlLmVsZW1lbnQ7DQoJCQkJc2IgPSBudWxsOw0KCQkJfQ0KDQoJCQkvLyBJZiBjYXB0aW9uIG9yIGFic29sdXRlIGxheWVycyB0aGVuIGFsd2F5cyBnZW5lcmF0ZSBuZXcgYmxvY2tzIHdpdGhpbg0KCQkJaWYgKGViICYmIChlYi5ub2RlTmFtZSA9PSAnQ0FQVElPTicgfHwgL2Fic29sdXRlfHJlbGF0aXZlfGZpeGVkL2dpLnRlc3QoZG9tLmdldFN0eWxlKHNiLCAncG9zaXRpb24nLCAxKSkpKSB7DQoJCQkJYm4gPSBzZS5lbGVtZW50Ow0KCQkJCWViID0gbnVsbDsNCgkJCX0NCg0KCQkJLy8gVXNlIFAgaW5zdGVhZA0KCQkJaWYgKC8oVER8VEFCTEV8VEh8Q0FQVElPTikvLnRlc3QoYm4pIHx8IChzYiAmJiBibiA9PSAiRElWIiAmJiAvbGVmdHxyaWdodC9naS50ZXN0KGRvbS5nZXRTdHlsZShzYiwgJ2Zsb2F0JywgMSkpKSkgew0KCQkJCWJuID0gc2UuZWxlbWVudDsNCgkJCQlzYiA9IGViID0gbnVsbDsNCgkJCX0NCg0KCQkJLy8gU2V0dXAgbmV3IGJlZm9yZSBhbmQgYWZ0ZXIgYmxvY2tzDQoJCQliZWYgPSAoc2IgJiYgc2Iubm9kZU5hbWUgPT0gYm4pID8gc2IuY2xvbmVOb2RlKDApIDogZWQuZG9tLmNyZWF0ZShibik7DQoJCQlhZnQgPSAoZWIgJiYgZWIubm9kZU5hbWUgPT0gYm4pID8gZWIuY2xvbmVOb2RlKDApIDogZWQuZG9tLmNyZWF0ZShibik7DQoNCgkJCS8vIFJlbW92ZSBpZCBmcm9tIGFmdGVyIGNsb25lDQoJCQlhZnQucmVtb3ZlQXR0cmlidXRlKCdpZCcpOw0KDQoJCQkvLyBJcyBoZWFkZXIgYW5kIGN1cnNvciBpcyBhdCB0aGUgZW5kLCB0aGVuIGZvcmNlIHBhcmFncmFwaCB1bmRlcg0KCQkJaWYgKC9eKEhbMS02XSkkLy50ZXN0KGJuKSAmJiBpc0F0RW5kKHIsIHNiKSkNCgkJCQlhZnQgPSBlZC5kb20uY3JlYXRlKHNlLmVsZW1lbnQpOw0KDQoJCQkvLyBGaW5kIHN0YXJ0IGNob3Agbm9kZQ0KCQkJbiA9IHNjID0gc247DQoJCQlkbyB7DQoJCQkJaWYgKG4gPT0gYiB8fCBuLm5vZGVUeXBlID09IDkgfHwgdC5kb20uaXNCbG9jayhuKSB8fCAvKFREfFRBQkxFfFRIfENBUFRJT04pLy50ZXN0KG4ubm9kZU5hbWUpKQ0KCQkJCQlicmVhazsNCg0KCQkJCXNjID0gbjsNCgkJCX0gd2hpbGUgKChuID0gbi5wcmV2aW91c1NpYmxpbmcgPyBuLnByZXZpb3VzU2libGluZyA6IG4ucGFyZW50Tm9kZSkpOw0KDQoJCQkvLyBGaW5kIGVuZCBjaG9wIG5vZGUNCgkJCW4gPSBlYyA9IGVuOw0KCQkJZG8gew0KCQkJCWlmIChuID09IGIgfHwgbi5ub2RlVHlwZSA9PSA5IHx8IHQuZG9tLmlzQmxvY2sobikgfHwgLyhURHxUQUJMRXxUSHxDQVBUSU9OKS8udGVzdChuLm5vZGVOYW1lKSkNCgkJCQkJYnJlYWs7DQoNCgkJCQllYyA9IG47DQoJCQl9IHdoaWxlICgobiA9IG4ubmV4dFNpYmxpbmcgPyBuLm5leHRTaWJsaW5nIDogbi5wYXJlbnROb2RlKSk7DQoNCgkJCS8vIFBsYWNlIGZpcnN0IGNob3AgcGFydCBpbnRvIGJlZm9yZSBibG9jayBlbGVtZW50DQoJCQlpZiAoc2Mubm9kZU5hbWUgPT0gYm4pDQoJCQkJcmIuc2V0U3RhcnQoc2MsIDApOw0KCQkJZWxzZQ0KCQkJCXJiLnNldFN0YXJ0QmVmb3JlKHNjKTsNCg0KCQkJcmIuc2V0RW5kKHNuLCBzbyk7DQoJCQliZWYuYXBwZW5kQ2hpbGQocmIuY2xvbmVDb250ZW50cygpIHx8IGQuY3JlYXRlVGV4dE5vZGUoJycpKTsgLy8gRW1wdHkgdGV4dCBub2RlIG5lZWRlZCBmb3IgU2FmYXJpDQoNCgkJCS8vIFBsYWNlIHNlY25kIGNob3AgcGFydCB3aXRoaW4gbmV3IGJsb2NrIGVsZW1lbnQNCgkJCXRyeSB7DQoJCQkJcmEuc2V0RW5kQWZ0ZXIoZWMpOw0KCQkJfSBjYXRjaChleCkgew0KCQkJCS8vY29uc29sZS5kZWJ1ZyhzLmZvY3VzTm9kZSwgcy5mb2N1c09mZnNldCk7DQoJCQl9DQoNCgkJCXJhLnNldFN0YXJ0KGVuLCBlbyk7DQoJCQlhZnQuYXBwZW5kQ2hpbGQocmEuY2xvbmVDb250ZW50cygpIHx8IGQuY3JlYXRlVGV4dE5vZGUoJycpKTsgLy8gRW1wdHkgdGV4dCBub2RlIG5lZWRlZCBmb3IgU2FmYXJpDQoNCgkJCS8vIENyZWF0ZSByYW5nZSBhcm91bmQgZXZlcnl0aGluZw0KCQkJciA9IGQuY3JlYXRlUmFuZ2UoKTsNCgkJCWlmICghc2MucHJldmlvdXNTaWJsaW5nICYmIHNjLnBhcmVudE5vZGUubm9kZU5hbWUgPT0gYm4pIHsNCgkJCQlyLnNldFN0YXJ0QmVmb3JlKHNjLnBhcmVudE5vZGUpOw0KCQkJfSBlbHNlIHsNCgkJCQlpZiAocmIuc3RhcnRDb250YWluZXIubm9kZU5hbWUgPT0gYm4gJiYgcmIuc3RhcnRPZmZzZXQgPT0gMCkNCgkJCQkJci5zZXRTdGFydEJlZm9yZShyYi5zdGFydENvbnRhaW5lcik7DQoJCQkJZWxzZQ0KCQkJCQlyLnNldFN0YXJ0KHJiLnN0YXJ0Q29udGFpbmVyLCByYi5zdGFydE9mZnNldCk7DQoJCQl9DQoNCgkJCWlmICghZWMubmV4dFNpYmxpbmcgJiYgZWMucGFyZW50Tm9kZS5ub2RlTmFtZSA9PSBibikNCgkJCQlyLnNldEVuZEFmdGVyKGVjLnBhcmVudE5vZGUpOw0KCQkJZWxzZQ0KCQkJCXIuc2V0RW5kKHJhLmVuZENvbnRhaW5lciwgcmEuZW5kT2Zmc2V0KTsNCg0KCQkJLy8gRGVsZXRlIGFuZCByZXBsYWNlIGl0IHdpdGggbmV3IGJsb2NrIGVsZW1lbnRzDQoJCQlyLmRlbGV0ZUNvbnRlbnRzKCk7DQoNCgkJCWlmIChpc09wZXJhKQ0KCQkJCWVkLmdldFdpbigpLnNjcm9sbFRvKDAsIHZwLnkpOw0KDQoJCQkvLyBOZXZlciB3cmFwIGJsb2NrcyBpbiBibG9ja3MNCgkJCWlmIChiZWYuZmlyc3RDaGlsZCAmJiBiZWYuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PSBibikNCgkJCQliZWYuaW5uZXJIVE1MID0gYmVmLmZpcnN0Q2hpbGQuaW5uZXJIVE1MOw0KDQoJCQlpZiAoYWZ0LmZpcnN0Q2hpbGQgJiYgYWZ0LmZpcnN0Q2hpbGQubm9kZU5hbWUgPT0gYm4pDQoJCQkJYWZ0LmlubmVySFRNTCA9IGFmdC5maXJzdENoaWxkLmlubmVySFRNTDsNCg0KCQkJLy8gUGFkZCBlbXB0eSBibG9ja3MNCgkJCWlmIChpc0VtcHR5KGJlZikpDQoJCQkJYmVmLmlubmVySFRNTCA9ICc8YnIgLz4nOw0KDQoJCQlmdW5jdGlvbiBhcHBlbmRTdHlsZXMoZSwgZW4pIHsNCgkJCQl2YXIgbmwgPSBbXSwgbm4sIG4sIGk7DQoNCgkJCQllLmlubmVySFRNTCA9ICcnOw0KDQoJCQkJLy8gTWFrZSBjbG9uZXMgb2Ygc3R5bGUgZWxlbWVudHMNCgkJCQlpZiAoc2Uua2VlcF9zdHlsZXMpIHsNCgkJCQkJbiA9IGVuOw0KCQkJCQlkbyB7DQoJCQkJCQkvLyBXZSBvbmx5IHdhbnQgc3R5bGUgc3BlY2lmaWMgZWxlbWVudHMNCgkJCQkJCWlmICgvXihTUEFOfFNUUk9OR3xCfEVNfEl8Rk9OVHxTVFJJS0V8VSkkLy50ZXN0KG4ubm9kZU5hbWUpKSB7DQoJCQkJCQkJbm4gPSBuLmNsb25lTm9kZShGQUxTRSk7DQoJCQkJCQkJZG9tLnNldEF0dHJpYihubiwgJ2lkJywgJycpOyAvLyBSZW1vdmUgSUQgc2luY2UgaXQgbmVlZHMgdG8gYmUgdW5pcXVlDQoJCQkJCQkJbmwucHVzaChubik7DQoJCQkJCQl9DQoJCQkJCX0gd2hpbGUgKG4gPSBuLnBhcmVudE5vZGUpOw0KCQkJCX0NCg0KCQkJCS8vIEFwcGVuZCBzdHlsZSBlbGVtZW50cyB0byBhZnQNCgkJCQlpZiAobmwubGVuZ3RoID4gMCkgew0KCQkJCQlmb3IgKGkgPSBubC5sZW5ndGggLSAxLCBubiA9IGU7IGkgPj0gMDsgaS0tKQ0KCQkJCQkJbm4gPSBubi5hcHBlbmRDaGlsZChubFtpXSk7DQoNCgkJCQkJLy8gUGFkZCBtb3N0IGlubmVyIHN0eWxlIGVsZW1lbnQNCgkJCQkJbmxbMF0uaW5uZXJIVE1MID0gaXNPcGVyYSA/ICcmbmJzcDsnIDogJzxiciAvPic7IC8vIEV4dHJhIHNwYWNlIGZvciBPcGVyYSBzbyB0aGF0IHRoZSBjYXJldCBjYW4gbW92ZSB0aGVyZQ0KCQkJCQlyZXR1cm4gbmxbMF07IC8vIE1vdmUgY2FyZXQgdG8gbW9zdCBpbm5lciBlbGVtZW50DQoJCQkJfSBlbHNlDQoJCQkJCWUuaW5uZXJIVE1MID0gaXNPcGVyYSA/ICcmbmJzcDsnIDogJzxiciAvPic7IC8vIEV4dHJhIHNwYWNlIGZvciBPcGVyYSBzbyB0aGF0IHRoZSBjYXJldCBjYW4gbW92ZSB0aGVyZQ0KCQkJfTsNCg0KCQkJLy8gRmlsbCBlbXB0eSBhZnRlcmJsb29rIHdpdGggY3VycmVudCBzdHlsZQ0KCQkJaWYgKGlzRW1wdHkoYWZ0KSkNCgkJCQljYXIgPSBhcHBlbmRTdHlsZXMoYWZ0LCBlbik7DQoNCgkJCS8vIE9wZXJhIG5lZWRzIHRoaXMgb25lIGJhY2t3YXJkcyBmb3Igb2xkZXIgdmVyc2lvbnMNCgkJCWlmIChpc09wZXJhICYmIHBhcnNlRmxvYXQob3BlcmEudmVyc2lvbigpKSA8IDkuNSkgew0KCQkJCXIuaW5zZXJ0Tm9kZShiZWYpOw0KCQkJCXIuaW5zZXJ0Tm9kZShhZnQpOw0KCQkJfSBlbHNlIHsNCgkJCQlyLmluc2VydE5vZGUoYWZ0KTsNCgkJCQlyLmluc2VydE5vZGUoYmVmKTsNCgkJCX0NCg0KCQkJLy8gTm9ybWFsaXplDQoJCQlhZnQubm9ybWFsaXplKCk7DQoJCQliZWYubm9ybWFsaXplKCk7DQoNCgkJCWZ1bmN0aW9uIGZpcnN0KG4pIHsNCgkJCQlyZXR1cm4gZC5jcmVhdGVUcmVlV2Fsa2VyKG4sIE5vZGVGaWx0ZXIuU0hPV19URVhULCBudWxsLCBGQUxTRSkubmV4dE5vZGUoKSB8fCBuOw0KCQkJfTsNCg0KCQkJLy8gTW92ZSBjdXJzb3IgYW5kIHNjcm9sbCBpbnRvIHZpZXcNCgkJCXIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoJCQlyLnNlbGVjdE5vZGVDb250ZW50cyhpc0dlY2tvID8gZmlyc3QoY2FyIHx8IGFmdCkgOiBjYXIgfHwgYWZ0KTsNCgkJCXIuY29sbGFwc2UoMSk7DQoJCQlzLnJlbW92ZUFsbFJhbmdlcygpOw0KCQkJcy5hZGRSYW5nZShyKTsNCg0KCQkJLy8gc2Nyb2xsSW50b1ZpZXcgc2VlbXMgdG8gc2Nyb2xsIHRoZSBwYXJlbnQgd2luZG93IGluIG1vc3QgYnJvd3NlcnMgbm93IGluY2x1ZGluZyBGRiAzLjBiNCBzbyBpdCdzIHRpbWUgdG8gc3RvcCB1c2luZyBpdCBhbmQgZG8gaXQgb3VyIHNlbGZzDQoJCQl5ID0gZWQuZG9tLmdldFBvcyhhZnQpLnk7DQoJCQljaCA9IGFmdC5jbGllbnRIZWlnaHQ7DQoNCgkJCS8vIElzIGVsZW1lbnQgd2l0aGluIHZpZXdwb3J0DQoJCQlpZiAoeSA8IHZwLnkgfHwgeSArIGNoID4gdnAueSArIHZwLmgpIHsNCgkJCQllZC5nZXRXaW4oKS5zY3JvbGxUbygwLCB5IDwgdnAueSA/IHkgOiB5IC0gdnAuaCArIDI1KTsgLy8gTmVlZHMgdG8gYmUgaGFyZGNvZGVkIHRvIHJvdWdobHkgb25lIGxpbmUgb2YgdGV4dCBpZiBhIGh1Z2UgdGV4dCBibG9jayBpcyBicm9rZW4gaW50byB0d28gYmxvY2tzDQoJCQkJLy9jb25zb2xlLmRlYnVnKCdTQ1JPTEwhJywgJ3ZwLnk6ICcgKyB2cC55LCAneScgKyB5LCAndnAuaCcgKyB2cC5oLCAnY2xpZW50SGVpZ2h0JyArIGFmdC5jbGllbnRIZWlnaHQsICd5eXk6ICcgKyAoeSA8IHZwLnkgPyB5IDogeSAtIHZwLmggKyBhZnQuY2xpZW50SGVpZ2h0KSk7DQoJCQl9DQoNCgkJCXJldHVybiBGQUxTRTsNCgkJfSwNCg0KCQliYWNrc3BhY2VEZWxldGUgOiBmdW5jdGlvbihlLCBicykgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBiID0gZWQuZ2V0Qm9keSgpLCBkb20gPSBlZC5kb20sIG4sIHNlID0gZWQuc2VsZWN0aW9uLCByID0gc2UuZ2V0Um5nKCksIHNjID0gci5zdGFydENvbnRhaW5lciwgbiwgdywgdG4sIHdhbGtlcjsNCg0KCQkJLy8gRGVsZXRlIHdoZW4gY2FyZXQgaXMgYmVoaW5kIGEgZWxlbWVudCBkb2Vzbid0IHdvcmsgY29ycmVjdGx5IG9uIEdlY2tvIHNlZSAjMzAxMTY1MQ0KCQkJaWYgKCFicyAmJiByLmNvbGxhcHNlZCAmJiBzYy5ub2RlVHlwZSA9PSAxICYmIHIuc3RhcnRPZmZzZXQgPT0gc2MuY2hpbGROb2Rlcy5sZW5ndGgpIHsNCgkJCQl3YWxrZXIgPSBuZXcgdGlueW1jZS5kb20uVHJlZVdhbGtlcihzYy5sYXN0Q2hpbGQsIHNjKTsNCg0KCQkJCS8vIFdhbGsgdGhlIGRvbSBiYWNrd2FyZHMgdW50aWwgd2UgZmluZCBhIHRleHQgbm9kZQ0KCQkJCWZvciAobiA9IHNjLmxhc3RDaGlsZDsgbjsgbiA9IHdhbGtlci5wcmV2KCkpIHsNCgkJCQkJaWYgKG4ubm9kZVR5cGUgPT0gMykgew0KCQkJCQkJci5zZXRTdGFydChuLCBuLm5vZGVWYWx1ZS5sZW5ndGgpOw0KCQkJCQkJci5jb2xsYXBzZSh0cnVlKTsNCgkJCQkJCXNlLnNldFJuZyhyKTsNCgkJCQkJCXJldHVybjsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gVGhlIGNhcmV0IHNvbWV0aW1lcyBnZXRzIHN0dWNrIGluIEdlY2tvIGlmIHlvdSBkZWxldGUgZW1wdHkgcGFyYWdyYXBocw0KCQkJLy8gVGhpcyB3b3JrYXJvdW5kIHJlbW92ZXMgdGhlIGVsZW1lbnQgYnkgaGFuZCBhbmQgbW92ZXMgdGhlIGNhcmV0IHRvIHRoZSBwcmV2aW91cyBlbGVtZW50DQoJCQlpZiAoc2MgJiYgZWQuZG9tLmlzQmxvY2soc2MpICYmICEvXihURHxUSCkkLy50ZXN0KHNjLm5vZGVOYW1lKSAmJiBicykgew0KCQkJCWlmIChzYy5jaGlsZE5vZGVzLmxlbmd0aCA9PSAwIHx8IChzYy5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxICYmIHNjLmZpcnN0Q2hpbGQubm9kZU5hbWUgPT0gJ0JSJykpIHsNCgkJCQkJLy8gRmluZCBwcmV2aW91cyBibG9jayBlbGVtZW50DQoJCQkJCW4gPSBzYzsNCgkJCQkJd2hpbGUgKChuID0gbi5wcmV2aW91c1NpYmxpbmcpICYmICFlZC5kb20uaXNCbG9jayhuKSkgOw0KDQoJCQkJCWlmIChuKSB7DQoJCQkJCQlpZiAoc2MgIT0gYi5maXJzdENoaWxkKSB7DQoJCQkJCQkJLy8gRmluZCBsYXN0IHRleHQgbm9kZQ0KCQkJCQkJCXcgPSBlZC5kb20uZG9jLmNyZWF0ZVRyZWVXYWxrZXIobiwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwsIEZBTFNFKTsNCgkJCQkJCQl3aGlsZSAodG4gPSB3Lm5leHROb2RlKCkpDQoJCQkJCQkJCW4gPSB0bjsNCg0KCQkJCQkJCS8vIFBsYWNlIGNhcmV0IGF0IHRoZSBlbmQgb2YgbGFzdCB0ZXh0IG5vZGUNCgkJCQkJCQlyID0gZWQuZ2V0RG9jKCkuY3JlYXRlUmFuZ2UoKTsNCgkJCQkJCQlyLnNldFN0YXJ0KG4sIG4ubm9kZVZhbHVlID8gbi5ub2RlVmFsdWUubGVuZ3RoIDogMCk7DQoJCQkJCQkJci5zZXRFbmQobiwgbi5ub2RlVmFsdWUgPyBuLm5vZGVWYWx1ZS5sZW5ndGggOiAwKTsNCgkJCQkJCQlzZS5zZXRSbmcocik7DQoNCgkJCQkJCQkvLyBSZW1vdmUgdGhlIHRhcmdldCBjb250YWluZXINCgkJCQkJCQllZC5kb20ucmVtb3ZlKHNjKTsNCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBET00gPSB0aW55bWNlLkRPTSwgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwgZWFjaCA9IHRpbnltY2UuZWFjaCwgZXh0ZW5kID0gdGlueW1jZS5leHRlbmQ7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5Db250cm9sTWFuYWdlcicsIHsNCgkJQ29udHJvbE1hbmFnZXIgOiBmdW5jdGlvbihlZCwgcykgew0KCQkJdmFyIHQgPSB0aGlzLCBpOw0KDQoJCQlzID0gcyB8fCB7fTsNCgkJCXQuZWRpdG9yID0gZWQ7DQoJCQl0LmNvbnRyb2xzID0ge307DQoJCQl0Lm9uQWRkID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHQpOw0KCQkJdC5vblBvc3RSZW5kZXIgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodCk7DQoJCQl0LnByZWZpeCA9IHMucHJlZml4IHx8IGVkLmlkICsgJ18nOw0KCQkJdC5fY2xzID0ge307DQoNCgkJCXQub25Qb3N0UmVuZGVyLmFkZChmdW5jdGlvbigpIHsNCgkJCQllYWNoKHQuY29udHJvbHMsIGZ1bmN0aW9uKGMpIHsNCgkJCQkJYy5wb3N0UmVuZGVyKCk7DQoJCQkJfSk7DQoJCQl9KTsNCgkJfSwNCg0KCQlnZXQgOiBmdW5jdGlvbihpZCkgew0KCQkJcmV0dXJuIHRoaXMuY29udHJvbHNbdGhpcy5wcmVmaXggKyBpZF0gfHwgdGhpcy5jb250cm9sc1tpZF07DQoJCX0sDQoNCgkJc2V0QWN0aXZlIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciBjID0gbnVsbDsNCg0KCQkJaWYgKGMgPSB0aGlzLmdldChpZCkpDQoJCQkJYy5zZXRBY3RpdmUocyk7DQoNCgkJCXJldHVybiBjOw0KCQl9LA0KDQoJCXNldERpc2FibGVkIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciBjID0gbnVsbDsNCg0KCQkJaWYgKGMgPSB0aGlzLmdldChpZCkpDQoJCQkJYy5zZXREaXNhYmxlZChzKTsNCg0KCQkJcmV0dXJuIGM7DQoJCX0sDQoNCgkJYWRkIDogZnVuY3Rpb24oYykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoYykgew0KCQkJCXQuY29udHJvbHNbYy5pZF0gPSBjOw0KCQkJCXQub25BZGQuZGlzcGF0Y2goYywgdCk7DQoJCQl9DQoNCgkJCXJldHVybiBjOw0KCQl9LA0KDQoJCWNyZWF0ZUNvbnRyb2wgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgYywgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3I7DQoNCgkJCWVhY2goZWQucGx1Z2lucywgZnVuY3Rpb24ocCkgew0KCQkJCWlmIChwLmNyZWF0ZUNvbnRyb2wpIHsNCgkJCQkJYyA9IHAuY3JlYXRlQ29udHJvbChuLCB0KTsNCg0KCQkJCQlpZiAoYykNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJc3dpdGNoIChuKSB7DQoJCQkJY2FzZSAifCI6DQoJCQkJY2FzZSAic2VwYXJhdG9yIjoNCgkJCQkJcmV0dXJuIHQuY3JlYXRlU2VwYXJhdG9yKCk7DQoJCQl9DQoNCgkJCWlmICghYyAmJiBlZC5idXR0b25zICYmIChjID0gZWQuYnV0dG9uc1tuXSkpDQoJCQkJcmV0dXJuIHQuY3JlYXRlQnV0dG9uKG4sIGMpOw0KDQoJCQlyZXR1cm4gdC5hZGQoYyk7DQoJCX0sDQoNCgkJY3JlYXRlRHJvcE1lbnUgOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgYywgYm0sIHYsIGNsczsNCg0KCQkJcyA9IGV4dGVuZCh7DQoJCQkJJ2NsYXNzJyA6ICdtY2VEcm9wRG93bicsDQoJCQkJY29uc3RyYWluIDogZWQuc2V0dGluZ3MuY29uc3RyYWluX21lbnVzDQoJCQl9LCBzKTsNCg0KCQkJc1snY2xhc3MnXSA9IHNbJ2NsYXNzJ10gKyAnICcgKyBlZC5nZXRQYXJhbSgnc2tpbicpICsgJ1NraW4nOw0KCQkJaWYgKHYgPSBlZC5nZXRQYXJhbSgnc2tpbl92YXJpYW50JykpDQoJCQkJc1snY2xhc3MnXSArPSAnICcgKyBlZC5nZXRQYXJhbSgnc2tpbicpICsgJ1NraW4nICsgdi5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHYuc3Vic3RyaW5nKDEpOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoJCQljbHMgPSBjYyB8fCB0Ll9jbHMuZHJvcG1lbnUgfHwgdGlueW1jZS51aS5Ecm9wTWVudTsNCgkJCWMgPSB0LmNvbnRyb2xzW2lkXSA9IG5ldyBjbHMoaWQsIHMpOw0KCQkJYy5vbkFkZEl0ZW0uYWRkKGZ1bmN0aW9uKGMsIG8pIHsNCgkJCQl2YXIgcyA9IG8uc2V0dGluZ3M7DQoNCgkJCQlzLnRpdGxlID0gZWQuZ2V0TGFuZyhzLnRpdGxlLCBzLnRpdGxlKTsNCg0KCQkJCWlmICghcy5vbmNsaWNrKSB7DQoJCQkJCXMub25jbGljayA9IGZ1bmN0aW9uKHYpIHsNCgkJCQkJCWlmIChzLmNtZCkNCgkJCQkJCQllZC5leGVjQ29tbWFuZChzLmNtZCwgcy51aSB8fCBmYWxzZSwgcy52YWx1ZSk7DQoJCQkJCX07DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWVkLm9uUmVtb3ZlLmFkZChmdW5jdGlvbigpIHsNCgkJCQljLmRlc3Ryb3koKTsNCgkJCX0pOw0KDQoJCQkvLyBGaXggZm9yIGJ1ZyAjMTg5Nzc4NSwgIzE4OTgwMDcNCgkJCWlmICh0aW55bWNlLmlzSUUpIHsNCgkJCQljLm9uU2hvd01lbnUuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQkvLyBJRSA4IG5lZWRzIGZvY3VzIGluIG9yZGVyIHRvIHN0b3JlIGF3YXkgYSByYW5nZSB3aXRoIHRoZSBjdXJyZW50IGNvbGxhcHNlZCBjYXJldCBsb2NhdGlvbg0KCQkJCQllZC5mb2N1cygpOw0KDQoJCQkJCWJtID0gZWQuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpOw0KCQkJCX0pOw0KDQoJCQkJYy5vbkhpZGVNZW51LmFkZChmdW5jdGlvbigpIHsNCgkJCQkJaWYgKGJtKSB7DQoJCQkJCQllZC5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoYm0pOw0KCQkJCQkJYm0gPSAwOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiB0LmFkZChjKTsNCgkJfSwNCg0KCQljcmVhdGVMaXN0Qm94IDogZnVuY3Rpb24oaWQsIHMsIGNjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIGNtZCwgYywgY2xzOw0KDQoJCQlpZiAodC5nZXQoaWQpKQ0KCQkJCXJldHVybiBudWxsOw0KDQoJCQlzLnRpdGxlID0gZWQudHJhbnNsYXRlKHMudGl0bGUpOw0KCQkJcy5zY29wZSA9IHMuc2NvcGUgfHwgZWQ7DQoNCgkJCWlmICghcy5vbnNlbGVjdCkgew0KCQkJCXMub25zZWxlY3QgPSBmdW5jdGlvbih2KSB7DQoJCQkJCWVkLmV4ZWNDb21tYW5kKHMuY21kLCBzLnVpIHx8IGZhbHNlLCB2IHx8IHMudmFsdWUpOw0KCQkJCX07DQoJCQl9DQoNCgkJCXMgPSBleHRlbmQoew0KCQkJCXRpdGxlIDogcy50aXRsZSwNCgkJCQknY2xhc3MnIDogJ21jZV8nICsgaWQsDQoJCQkJc2NvcGUgOiBzLnNjb3BlLA0KCQkJCWNvbnRyb2xfbWFuYWdlciA6IHQNCgkJCX0sIHMpOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoNCgkJCWlmIChlZC5zZXR0aW5ncy51c2VfbmF0aXZlX3NlbGVjdHMpDQoJCQkJYyA9IG5ldyB0aW55bWNlLnVpLk5hdGl2ZUxpc3RCb3goaWQsIHMpOw0KCQkJZWxzZSB7DQoJCQkJY2xzID0gY2MgfHwgdC5fY2xzLmxpc3Rib3ggfHwgdGlueW1jZS51aS5MaXN0Qm94Ow0KCQkJCWMgPSBuZXcgY2xzKGlkLCBzKTsNCgkJCX0NCg0KCQkJdC5jb250cm9sc1tpZF0gPSBjOw0KDQoJCQkvLyBGaXggZm9jdXMgcHJvYmxlbSBpbiBTYWZhcmkNCgkJCWlmICh0aW55bWNlLmlzV2ViS2l0KSB7DQoJCQkJYy5vblBvc3RSZW5kZXIuYWRkKGZ1bmN0aW9uKGMsIG4pIHsNCgkJCQkJLy8gU3RvcmUgYm9va21hcmsgb24gbW91c2Vkb3duDQoJCQkJCUV2ZW50LmFkZChuLCAnbW91c2Vkb3duJywgZnVuY3Rpb24oKSB7DQoJCQkJCQllZC5ib29rbWFyayA9IGVkLnNlbGVjdGlvbi5nZXRCb29rbWFyaygxKTsNCgkJCQkJfSk7DQoNCgkJCQkJLy8gUmVzdG9yZSBvbiBmb2N1cywgc2luY2UgaXQgbWlnaHQgYmUgbG9zdA0KCQkJCQlFdmVudC5hZGQobiwgJ2ZvY3VzJywgZnVuY3Rpb24oKSB7DQoJCQkJCQllZC5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoZWQuYm9va21hcmspOw0KCQkJCQkJZWQuYm9va21hcmsgPSBudWxsOw0KCQkJCQl9KTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKGMuaGlkZU1lbnUpDQoJCQkJZWQub25Nb3VzZURvd24uYWRkKGMuaGlkZU1lbnUsIGMpOw0KDQoJCQlyZXR1cm4gdC5hZGQoYyk7DQoJCX0sDQoNCgkJY3JlYXRlQnV0dG9uIDogZnVuY3Rpb24oaWQsIHMsIGNjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIG8sIGMsIGNsczsNCg0KCQkJaWYgKHQuZ2V0KGlkKSkNCgkJCQlyZXR1cm4gbnVsbDsNCg0KCQkJcy50aXRsZSA9IGVkLnRyYW5zbGF0ZShzLnRpdGxlKTsNCgkJCXMubGFiZWwgPSBlZC50cmFuc2xhdGUocy5sYWJlbCk7DQoJCQlzLnNjb3BlID0gcy5zY29wZSB8fCBlZDsNCg0KCQkJaWYgKCFzLm9uY2xpY2sgJiYgIXMubWVudV9idXR0b24pIHsNCgkJCQlzLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsNCgkJCQkJZWQuZXhlY0NvbW1hbmQocy5jbWQsIHMudWkgfHwgZmFsc2UsIHMudmFsdWUpOw0KCQkJCX07DQoJCQl9DQoNCgkJCXMgPSBleHRlbmQoew0KCQkJCXRpdGxlIDogcy50aXRsZSwNCgkJCQknY2xhc3MnIDogJ21jZV8nICsgaWQsDQoJCQkJdW5hdmFpbGFibGVfcHJlZml4IDogZWQuZ2V0TGFuZygndW5hdmFpbGFibGUnLCAnJyksDQoJCQkJc2NvcGUgOiBzLnNjb3BlLA0KCQkJCWNvbnRyb2xfbWFuYWdlciA6IHQNCgkJCX0sIHMpOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoNCgkJCWlmIChzLm1lbnVfYnV0dG9uKSB7DQoJCQkJY2xzID0gY2MgfHwgdC5fY2xzLm1lbnVidXR0b24gfHwgdGlueW1jZS51aS5NZW51QnV0dG9uOw0KCQkJCWMgPSBuZXcgY2xzKGlkLCBzKTsNCgkJCQllZC5vbk1vdXNlRG93bi5hZGQoYy5oaWRlTWVudSwgYyk7DQoJCQl9IGVsc2Ugew0KCQkJCWNscyA9IHQuX2Nscy5idXR0b24gfHwgdGlueW1jZS51aS5CdXR0b247DQoJCQkJYyA9IG5ldyBjbHMoaWQsIHMpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gdC5hZGQoYyk7DQoJCX0sDQoNCgkJY3JlYXRlTWVudUJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzLCBjYykgew0KCQkJcyA9IHMgfHwge307DQoJCQlzLm1lbnVfYnV0dG9uID0gMTsNCg0KCQkJcmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKGlkLCBzLCBjYyk7DQoJCX0sDQoNCgkJY3JlYXRlU3BsaXRCdXR0b24gOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgY21kLCBjLCBjbHM7DQoNCgkJCWlmICh0LmdldChpZCkpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCXMudGl0bGUgPSBlZC50cmFuc2xhdGUocy50aXRsZSk7DQoJCQlzLnNjb3BlID0gcy5zY29wZSB8fCBlZDsNCg0KCQkJaWYgKCFzLm9uY2xpY2spIHsNCgkJCQlzLm9uY2xpY2sgPSBmdW5jdGlvbih2KSB7DQoJCQkJCWVkLmV4ZWNDb21tYW5kKHMuY21kLCBzLnVpIHx8IGZhbHNlLCB2IHx8IHMudmFsdWUpOw0KCQkJCX07DQoJCQl9DQoNCgkJCWlmICghcy5vbnNlbGVjdCkgew0KCQkJCXMub25zZWxlY3QgPSBmdW5jdGlvbih2KSB7DQoJCQkJCWVkLmV4ZWNDb21tYW5kKHMuY21kLCBzLnVpIHx8IGZhbHNlLCB2IHx8IHMudmFsdWUpOw0KCQkJCX07DQoJCQl9DQoNCgkJCXMgPSBleHRlbmQoew0KCQkJCXRpdGxlIDogcy50aXRsZSwNCgkJCQknY2xhc3MnIDogJ21jZV8nICsgaWQsDQoJCQkJc2NvcGUgOiBzLnNjb3BlLA0KCQkJCWNvbnRyb2xfbWFuYWdlciA6IHQNCgkJCX0sIHMpOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoJCQljbHMgPSBjYyB8fCB0Ll9jbHMuc3BsaXRidXR0b24gfHwgdGlueW1jZS51aS5TcGxpdEJ1dHRvbjsNCgkJCWMgPSB0LmFkZChuZXcgY2xzKGlkLCBzKSk7DQoJCQllZC5vbk1vdXNlRG93bi5hZGQoYy5oaWRlTWVudSwgYyk7DQoNCgkJCXJldHVybiBjOw0KCQl9LA0KDQoJCWNyZWF0ZUNvbG9yU3BsaXRCdXR0b24gOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgY21kLCBjLCBjbHMsIGJtOw0KDQoJCQlpZiAodC5nZXQoaWQpKQ0KCQkJCXJldHVybiBudWxsOw0KDQoJCQlzLnRpdGxlID0gZWQudHJhbnNsYXRlKHMudGl0bGUpOw0KCQkJcy5zY29wZSA9IHMuc2NvcGUgfHwgZWQ7DQoNCgkJCWlmICghcy5vbmNsaWNrKSB7DQoJCQkJcy5vbmNsaWNrID0gZnVuY3Rpb24odikgew0KCQkJCQlpZiAodGlueW1jZS5pc0lFKQ0KCQkJCQkJYm0gPSBlZC5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMSk7DQoNCgkJCQkJZWQuZXhlY0NvbW1hbmQocy5jbWQsIHMudWkgfHwgZmFsc2UsIHYgfHwgcy52YWx1ZSk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJaWYgKCFzLm9uc2VsZWN0KSB7DQoJCQkJcy5vbnNlbGVjdCA9IGZ1bmN0aW9uKHYpIHsNCgkJCQkJZWQuZXhlY0NvbW1hbmQocy5jbWQsIHMudWkgfHwgZmFsc2UsIHYgfHwgcy52YWx1ZSk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJcyA9IGV4dGVuZCh7DQoJCQkJdGl0bGUgOiBzLnRpdGxlLA0KCQkJCSdjbGFzcycgOiAnbWNlXycgKyBpZCwNCgkJCQknbWVudV9jbGFzcycgOiBlZC5nZXRQYXJhbSgnc2tpbicpICsgJ1NraW4nLA0KCQkJCXNjb3BlIDogcy5zY29wZSwNCgkJCQltb3JlX2NvbG9yc190aXRsZSA6IGVkLmdldExhbmcoJ21vcmVfY29sb3JzJykNCgkJCX0sIHMpOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoJCQljbHMgPSBjYyB8fCB0Ll9jbHMuY29sb3JzcGxpdGJ1dHRvbiB8fCB0aW55bWNlLnVpLkNvbG9yU3BsaXRCdXR0b247DQoJCQljID0gbmV3IGNscyhpZCwgcyk7DQoJCQllZC5vbk1vdXNlRG93bi5hZGQoYy5oaWRlTWVudSwgYyk7DQoNCgkJCS8vIFJlbW92ZSB0aGUgbWVudSBlbGVtZW50IHdoZW4gdGhlIGVkaXRvciBpcyByZW1vdmVkDQoJCQllZC5vblJlbW92ZS5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJYy5kZXN0cm95KCk7DQoJCQl9KTsNCg0KCQkJLy8gRml4IGZvciBidWcgIzE4OTc3ODUsICMxODk4MDA3DQoJCQlpZiAodGlueW1jZS5pc0lFKSB7DQoJCQkJYy5vblNob3dNZW51LmFkZChmdW5jdGlvbigpIHsNCgkJCQkJLy8gSUUgOCBuZWVkcyBmb2N1cyBpbiBvcmRlciB0byBzdG9yZSBhd2F5IGEgcmFuZ2Ugd2l0aCB0aGUgY3VycmVudCBjb2xsYXBzZWQgY2FyZXQgbG9jYXRpb24NCgkJCQkJZWQuZm9jdXMoKTsNCgkJCQkJYm0gPSBlZC5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMSk7DQoJCQkJfSk7DQoNCgkJCQljLm9uSGlkZU1lbnUuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoYm0pIHsNCgkJCQkJCWVkLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhibSk7DQoJCQkJCQlibSA9IDA7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJcmV0dXJuIHQuYWRkKGMpOw0KCQl9LA0KDQoJCWNyZWF0ZVRvb2xiYXIgOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciBjLCB0ID0gdGhpcywgY2xzOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoJCQljbHMgPSBjYyB8fCB0Ll9jbHMudG9vbGJhciB8fCB0aW55bWNlLnVpLlRvb2xiYXI7DQoJCQljID0gbmV3IGNscyhpZCwgcyk7DQoNCgkJCWlmICh0LmdldChpZCkpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCXJldHVybiB0LmFkZChjKTsNCgkJfSwNCg0KCQljcmVhdGVTZXBhcmF0b3IgOiBmdW5jdGlvbihjYykgew0KCQkJdmFyIGNscyA9IGNjIHx8IHRoaXMuX2Nscy5zZXBhcmF0b3IgfHwgdGlueW1jZS51aS5TZXBhcmF0b3I7DQoNCgkJCXJldHVybiBuZXcgY2xzKCk7DQoJCX0sDQoNCgkJc2V0Q29udHJvbFR5cGUgOiBmdW5jdGlvbihuLCBjKSB7DQoJCQlyZXR1cm4gdGhpcy5fY2xzW24udG9Mb3dlckNhc2UoKV0gPSBjOw0KCQl9LA0KCQ0KCQlkZXN0cm95IDogZnVuY3Rpb24oKSB7DQoJCQllYWNoKHRoaXMuY29udHJvbHMsIGZ1bmN0aW9uKGMpIHsNCgkJCQljLmRlc3Ryb3koKTsNCgkJCX0pOw0KDQoJCQl0aGlzLmNvbnRyb2xzID0gbnVsbDsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIERpc3BhdGNoZXIgPSB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlciwgZWFjaCA9IHRpbnltY2UuZWFjaCwgaXNJRSA9IHRpbnltY2UuaXNJRSwgaXNPcGVyYSA9IHRpbnltY2UuaXNPcGVyYTsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLldpbmRvd01hbmFnZXInLCB7DQoJCVdpbmRvd01hbmFnZXIgOiBmdW5jdGlvbihlZCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmVkaXRvciA9IGVkOw0KCQkJdC5vbk9wZW4gPSBuZXcgRGlzcGF0Y2hlcih0KTsNCgkJCXQub25DbG9zZSA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KCQkJdC5wYXJhbXMgPSB7fTsNCgkJCXQuZmVhdHVyZXMgPSB7fTsNCgkJfSwNCg0KCQlvcGVuIDogZnVuY3Rpb24ocywgcCkgew0KCQkJdmFyIHQgPSB0aGlzLCBmID0gJycsIHgsIHksIG1vID0gdC5lZGl0b3Iuc2V0dGluZ3MuZGlhbG9nX3R5cGUgPT0gJ21vZGFsJywgdywgc3csIHNoLCB2cCA9IHRpbnltY2UuRE9NLmdldFZpZXdQb3J0KCksIHU7DQoNCgkJCS8vIERlZmF1bHQgc29tZSBvcHRpb25zDQoJCQlzID0gcyB8fCB7fTsNCgkJCXAgPSBwIHx8IHt9Ow0KCQkJc3cgPSBpc09wZXJhID8gdnAudyA6IHNjcmVlbi53aWR0aDsgLy8gT3BlcmEgdXNlcyB3aW5kb3dzIGluc2lkZSB0aGUgT3BlcmEgd2luZG93DQoJCQlzaCA9IGlzT3BlcmEgPyB2cC5oIDogc2NyZWVuLmhlaWdodDsNCgkJCXMubmFtZSA9IHMubmFtZSB8fCAnbWNfJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KCQkJcy53aWR0aCA9IHBhcnNlSW50KHMud2lkdGggfHwgMzIwKTsNCgkJCXMuaGVpZ2h0ID0gcGFyc2VJbnQocy5oZWlnaHQgfHwgMjQwKTsNCgkJCXMucmVzaXphYmxlID0gdHJ1ZTsNCgkJCXMubGVmdCA9IHMubGVmdCB8fCBwYXJzZUludChzdyAvIDIuMCkgLSAocy53aWR0aCAvIDIuMCk7DQoJCQlzLnRvcCA9IHMudG9wIHx8IHBhcnNlSW50KHNoIC8gMi4wKSAtIChzLmhlaWdodCAvIDIuMCk7DQoJCQlwLmlubGluZSA9IGZhbHNlOw0KCQkJcC5tY2Vfd2lkdGggPSBzLndpZHRoOw0KCQkJcC5tY2VfaGVpZ2h0ID0gcy5oZWlnaHQ7DQoJCQlwLm1jZV9hdXRvX2ZvY3VzID0gcy5hdXRvX2ZvY3VzOw0KDQoJCQlpZiAobW8pIHsNCgkJCQlpZiAoaXNJRSkgew0KCQkJCQlzLmNlbnRlciA9IHRydWU7DQoJCQkJCXMuaGVscCA9IGZhbHNlOw0KCQkJCQlzLmRpYWxvZ1dpZHRoID0gcy53aWR0aCArICdweCc7DQoJCQkJCXMuZGlhbG9nSGVpZ2h0ID0gcy5oZWlnaHQgKyAncHgnOw0KCQkJCQlzLnNjcm9sbCA9IHMuc2Nyb2xsYmFycyB8fCBmYWxzZTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIEJ1aWxkIGZlYXR1cmVzIHN0cmluZw0KCQkJZWFjaChzLCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJaWYgKHRpbnltY2UuaXModiwgJ2Jvb2xlYW4nKSkNCgkJCQkJdiA9IHYgPyAneWVzJyA6ICdubyc7DQoNCgkJCQlpZiAoIS9eKG5hbWV8dXJsKSQvLnRlc3QoaykpIHsNCgkJCQkJaWYgKGlzSUUgJiYgbW8pDQoJCQkJCQlmICs9IChmID8gJzsnIDogJycpICsgayArICc6JyArIHY7DQoJCQkJCWVsc2UNCgkJCQkJCWYgKz0gKGYgPyAnLCcgOiAnJykgKyBrICsgJz0nICsgdjsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJdC5mZWF0dXJlcyA9IHM7DQoJCQl0LnBhcmFtcyA9IHA7DQoJCQl0Lm9uT3Blbi5kaXNwYXRjaCh0LCBzLCBwKTsNCg0KCQkJdSA9IHMudXJsIHx8IHMuZmlsZTsNCgkJCXUgPSB0aW55bWNlLl9hZGRWZXIodSk7DQoNCgkJCXRyeSB7DQoJCQkJaWYgKGlzSUUgJiYgbW8pIHsNCgkJCQkJdyA9IDE7DQoJCQkJCXdpbmRvdy5zaG93TW9kYWxEaWFsb2codSwgd2luZG93LCBmKTsNCgkJCQl9IGVsc2UNCgkJCQkJdyA9IHdpbmRvdy5vcGVuKHUsIHMubmFtZSwgZik7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJCS8vIElnbm9yZQ0KCQkJfQ0KDQoJCQlpZiAoIXcpDQoJCQkJYWxlcnQodC5lZGl0b3IuZ2V0TGFuZygncG9wdXBfYmxvY2tlZCcpKTsNCgkJfSwNCg0KCQljbG9zZSA6IGZ1bmN0aW9uKHcpIHsNCgkJCXcuY2xvc2UoKTsNCgkJCXRoaXMub25DbG9zZS5kaXNwYXRjaCh0aGlzKTsNCgkJfSwNCg0KCQljcmVhdGVJbnN0YW5jZSA6IGZ1bmN0aW9uKGNsLCBhLCBiLCBjLCBkLCBlKSB7DQoJCQl2YXIgZiA9IHRpbnltY2UucmVzb2x2ZShjbCk7DQoNCgkJCXJldHVybiBuZXcgZihhLCBiLCBjLCBkLCBlKTsNCgkJfSwNCg0KCQljb25maXJtIDogZnVuY3Rpb24odCwgY2IsIHMsIHcpIHsNCgkJCXcgPSB3IHx8IHdpbmRvdzsNCg0KCQkJY2IuY2FsbChzIHx8IHRoaXMsIHcuY29uZmlybSh0aGlzLl9kZWNvZGUodGhpcy5lZGl0b3IuZ2V0TGFuZyh0LCB0KSkpKTsNCgkJfSwNCg0KCQlhbGVydCA6IGZ1bmN0aW9uKHR4LCBjYiwgcywgdykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl3ID0gdyB8fCB3aW5kb3c7DQoJCQl3LmFsZXJ0KHQuX2RlY29kZSh0LmVkaXRvci5nZXRMYW5nKHR4LCB0eCkpKTsNCg0KCQkJaWYgKGNiKQ0KCQkJCWNiLmNhbGwocyB8fCB0KTsNCgkJfSwNCg0KCQlyZXNpemVCeSA6IGZ1bmN0aW9uKGR3LCBkaCwgd2luKSB7DQoJCQl3aW4ucmVzaXplQnkoZHcsIGRoKTsNCgkJfSwNCg0KCQkvLyBJbnRlcm5hbCBmdW5jdGlvbnMNCg0KCQlfZGVjb2RlIDogZnVuY3Rpb24ocykgew0KCQkJcmV0dXJuIHRpbnltY2UuRE9NLmRlY29kZShzKS5yZXBsYWNlKC9cXG4vZywgJ1xuJyk7DQoJCX0NCgl9KTsNCn0odGlueW1jZSkpOw0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCglmdW5jdGlvbiBDb21tYW5kTWFuYWdlcigpIHsNCgkJdmFyIGV4ZWNDb21tYW5kcyA9IHt9LCBxdWVyeVN0YXRlQ29tbWFuZHMgPSB7fSwgcXVlcnlWYWx1ZUNvbW1hbmRzID0ge307DQoNCgkJZnVuY3Rpb24gYWRkKGNvbGxlY3Rpb24sIGNtZCwgZnVuYywgc2NvcGUpIHsNCgkJCWlmICh0eXBlb2YoY21kKSA9PSAnc3RyaW5nJykNCgkJCQljbWQgPSBbY21kXTsNCg0KCQkJdGlueW1jZS5lYWNoKGNtZCwgZnVuY3Rpb24oY21kKSB7DQoJCQkJY29sbGVjdGlvbltjbWQudG9Mb3dlckNhc2UoKV0gPSB7ZnVuYyA6IGZ1bmMsIHNjb3BlIDogc2NvcGV9Ow0KCQkJfSk7DQoJCX07DQoNCgkJdGlueW1jZS5leHRlbmQodGhpcywgew0KCQkJYWRkIDogZnVuY3Rpb24oY21kLCBmdW5jLCBzY29wZSkgew0KCQkJCWFkZChleGVjQ29tbWFuZHMsIGNtZCwgZnVuYywgc2NvcGUpOw0KCQkJfSwNCg0KCQkJYWRkUXVlcnlTdGF0ZUhhbmRsZXIgOiBmdW5jdGlvbihjbWQsIGZ1bmMsIHNjb3BlKSB7DQoJCQkJYWRkKHF1ZXJ5U3RhdGVDb21tYW5kcywgY21kLCBmdW5jLCBzY29wZSk7DQoJCQl9LA0KDQoJCQlhZGRRdWVyeVZhbHVlSGFuZGxlciA6IGZ1bmN0aW9uKGNtZCwgZnVuYywgc2NvcGUpIHsNCgkJCQlhZGQocXVlcnlWYWx1ZUNvbW1hbmRzLCBjbWQsIGZ1bmMsIHNjb3BlKTsNCgkJCX0sDQoNCgkJCWV4ZWNDb21tYW5kIDogZnVuY3Rpb24oc2NvcGUsIGNtZCwgdWksIHZhbHVlLCBhcmdzKSB7DQoJCQkJaWYgKGNtZCA9IGV4ZWNDb21tYW5kc1tjbWQudG9Mb3dlckNhc2UoKV0pIHsNCgkJCQkJaWYgKGNtZC5mdW5jLmNhbGwoc2NvcGUgfHwgY21kLnNjb3BlLCB1aSwgdmFsdWUsIGFyZ3MpICE9PSBmYWxzZSkNCgkJCQkJCXJldHVybiB0cnVlOw0KCQkJCX0NCgkJCX0sDQoNCgkJCXF1ZXJ5Q29tbWFuZFZhbHVlIDogZnVuY3Rpb24oKSB7DQoJCQkJaWYgKGNtZCA9IHF1ZXJ5VmFsdWVDb21tYW5kc1tjbWQudG9Mb3dlckNhc2UoKV0pDQoJCQkJCXJldHVybiBjbWQuZnVuYy5jYWxsKHNjb3BlIHx8IGNtZC5zY29wZSwgdWksIHZhbHVlLCBhcmdzKTsNCgkJCX0sDQoNCgkJCXF1ZXJ5Q29tbWFuZFN0YXRlIDogZnVuY3Rpb24oKSB7DQoJCQkJaWYgKGNtZCA9IHF1ZXJ5U3RhdGVDb21tYW5kc1tjbWQudG9Mb3dlckNhc2UoKV0pDQoJCQkJCXJldHVybiBjbWQuZnVuYy5jYWxsKHNjb3BlIHx8IGNtZC5zY29wZSwgdWksIHZhbHVlLCBhcmdzKTsNCgkJCX0NCgkJfSk7DQoJfTsNCg0KCXRpbnltY2UuR2xvYmFsQ29tbWFuZHMgPSBuZXcgQ29tbWFuZE1hbmFnZXIoKTsNCn0pKHRpbnltY2UpOw0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl0aW55bWNlLkZvcm1hdHRlciA9IGZ1bmN0aW9uKGVkKSB7DQoJCXZhciBmb3JtYXRzID0ge30sDQoJCQllYWNoID0gdGlueW1jZS5lYWNoLA0KCQkJZG9tID0gZWQuZG9tLA0KCQkJc2VsZWN0aW9uID0gZWQuc2VsZWN0aW9uLA0KCQkJVHJlZVdhbGtlciA9IHRpbnltY2UuZG9tLlRyZWVXYWxrZXIsDQoJCQlyYW5nZVV0aWxzID0gbmV3IHRpbnltY2UuZG9tLlJhbmdlVXRpbHMoZG9tKSwNCgkJCWlzVmFsaWQgPSBlZC5zY2hlbWEuaXNWYWxpZCwNCgkJCWlzQmxvY2sgPSBkb20uaXNCbG9jaywNCgkJCWZvcmNlZFJvb3RCbG9jayA9IGVkLnNldHRpbmdzLmZvcmNlZF9yb290X2Jsb2NrLA0KCQkJbm9kZUluZGV4ID0gZG9tLm5vZGVJbmRleCwNCgkJCUlOVklTSUJMRV9DSEFSID0gJ1x1RkVGRicsDQoJCQlNQ0VfQVRUUl9SRSA9IC9eKHNyY3xocmVmfHN0eWxlKSQvLA0KCQkJRkFMU0UgPSBmYWxzZSwNCgkJCVRSVUUgPSB0cnVlLA0KCQkJdW5kZWZpbmVkLA0KCQkJcGVuZGluZ0Zvcm1hdHMgPSB7YXBwbHkgOiBbXSwgcmVtb3ZlIDogW119Ow0KDQoJCWZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7DQoJCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQXJyYXk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZ2V0UGFyZW50cyhub2RlLCBzZWxlY3Rvcikgew0KCQkJcmV0dXJuIGRvbS5nZXRQYXJlbnRzKG5vZGUsIHNlbGVjdG9yLCBkb20uZ2V0Um9vdCgpKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBpc0NhcmV0Tm9kZShub2RlKSB7DQoJCQlyZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAobm9kZS5mYWNlID09PSAnbWNlaW5saW5lJyB8fCBub2RlLnN0eWxlLmZvbnRGYW1pbHkgPT09ICdtY2VpbmxpbmUnKTsNCgkJfTsNCg0KCQkvLyBQdWJsaWMgZnVuY3Rpb25zDQoNCgkJZnVuY3Rpb24gZ2V0KG5hbWUpIHsNCgkJCXJldHVybiBuYW1lID8gZm9ybWF0c1tuYW1lXSA6IGZvcm1hdHM7DQoJCX07DQoNCgkJZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgZm9ybWF0KSB7DQoJCQlpZiAobmFtZSkgew0KCQkJCWlmICh0eXBlb2YobmFtZSkgIT09ICdzdHJpbmcnKSB7DQoJCQkJCWVhY2gobmFtZSwgZnVuY3Rpb24oZm9ybWF0LCBuYW1lKSB7DQoJCQkJCQlyZWdpc3RlcihuYW1lLCBmb3JtYXQpOw0KCQkJCQl9KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBGb3JjZSBmb3JtYXQgaW50byBhcnJheSBhbmQgYWRkIGl0IHRvIGludGVybmFsIGNvbGxlY3Rpb24NCgkJCQkJZm9ybWF0ID0gZm9ybWF0Lmxlbmd0aCA/IGZvcm1hdCA6IFtmb3JtYXRdOw0KDQoJCQkJCWVhY2goZm9ybWF0LCBmdW5jdGlvbihmb3JtYXQpIHsNCgkJCQkJCS8vIFNldCBkZWVwIHRvIGZhbHNlIGJ5IGRlZmF1bHQgb24gc2VsZWN0b3IgZm9ybWF0cyB0aGlzIHRvIGF2b2lkIHJlbW92aW5nDQoJCQkJCQkvLyBhbGlnbm1lbnQgb24gaW1hZ2VzIGluc2lkZSBwYXJhZ3JhcGhzIHdoZW4gYWxpZ25tZW50IGlzIGNoYW5nZWQgb24gcGFyYWdyYXBocw0KCQkJCQkJaWYgKGZvcm1hdC5kZWVwID09PSB1bmRlZmluZWQpDQoJCQkJCQkJZm9ybWF0LmRlZXAgPSAhZm9ybWF0LnNlbGVjdG9yOw0KDQoJCQkJCQkvLyBEZWZhdWx0IHRvIHRydWUNCgkJCQkJCWlmIChmb3JtYXQuc3BsaXQgPT09IHVuZGVmaW5lZCkNCgkJCQkJCQlmb3JtYXQuc3BsaXQgPSAhZm9ybWF0LnNlbGVjdG9yIHx8IGZvcm1hdC5pbmxpbmU7DQoNCgkJCQkJCS8vIERlZmF1bHQgdG8gdHJ1ZQ0KCQkJCQkJaWYgKGZvcm1hdC5yZW1vdmUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQuc2VsZWN0b3IgJiYgIWZvcm1hdC5pbmxpbmUpDQoJCQkJCQkJZm9ybWF0LnJlbW92ZSA9ICdub25lJzsNCg0KCQkJCQkJLy8gTWFyayBmb3JtYXQgYXMgYSBtaXhlZCBmb3JtYXQgaW5saW5lICsgYmxvY2sgbGV2ZWwNCgkJCQkJCWlmIChmb3JtYXQuc2VsZWN0b3IgJiYgZm9ybWF0LmlubGluZSkgew0KCQkJCQkJCWZvcm1hdC5taXhlZCA9IHRydWU7DQoJCQkJCQkJZm9ybWF0LmJsb2NrX2V4cGFuZCA9IHRydWU7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIFNwbGl0IGNsYXNzZXMgaWYgbmVlZGVkDQoJCQkJCQlpZiAodHlwZW9mKGZvcm1hdC5jbGFzc2VzKSA9PT0gJ3N0cmluZycpDQoJCQkJCQkJZm9ybWF0LmNsYXNzZXMgPSBmb3JtYXQuY2xhc3Nlcy5zcGxpdCgvXHMrLyk7DQoJCQkJCX0pOw0KDQoJCQkJCWZvcm1hdHNbbmFtZV0gPSBmb3JtYXQ7DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGFwcGx5KG5hbWUsIHZhcnMsIG5vZGUpIHsNCgkJCXZhciBmb3JtYXRMaXN0ID0gZ2V0KG5hbWUpLCBmb3JtYXQgPSBmb3JtYXRMaXN0WzBdLCBib29rbWFyaywgcm5nLCBpOw0KDQoJCQlmdW5jdGlvbiBtb3ZlU3RhcnQocm5nKSB7DQoJCQkJdmFyIGNvbnRhaW5lciA9IHJuZy5zdGFydENvbnRhaW5lciwNCgkJCQkJb2Zmc2V0ID0gcm5nLnN0YXJ0T2Zmc2V0LA0KCQkJCQl3YWxrZXIsIG5vZGU7DQoNCgkJCQkvLyBNb3ZlIHN0YXJ0Q29udGFpbmVyL3N0YXJ0T2Zmc2V0IGluIHRvIGEgc3VpdGFibGUgbm9kZQ0KCQkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMSB8fCBjb250YWluZXIubm9kZVZhbHVlID09PSAiIikgew0KCQkJCQljb250YWluZXIgPSBjb250YWluZXIubm9kZVR5cGUgPT0gMSA/IGNvbnRhaW5lci5jaGlsZE5vZGVzW29mZnNldF0gOiBjb250YWluZXI7DQoNCgkJCQkJLy8gTWlnaHQgZmFpbCBpZiB0aGUgb2Zmc2V0IGlzIGJlaGluZCB0aGUgbGFzdCBlbGVtZW50IGluIGl0J3MgY29udGFpbmVyDQoJCQkJCWlmIChjb250YWluZXIpIHsNCgkJCQkJCXdhbGtlciA9IG5ldyBUcmVlV2Fsa2VyKGNvbnRhaW5lciwgY29udGFpbmVyLnBhcmVudE5vZGUpOw0KCQkJCQkJZm9yIChub2RlID0gd2Fsa2VyLmN1cnJlbnQoKTsgbm9kZTsgbm9kZSA9IHdhbGtlci5uZXh0KCkpIHsNCgkJCQkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmICFpc1doaXRlU3BhY2VOb2RlKG5vZGUpKSB7DQoJCQkJCQkJCXJuZy5zZXRTdGFydChub2RlLCAwKTsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIHJuZzsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHNldEVsZW1lbnRGb3JtYXQoZWxtLCBmbXQpIHsNCgkJCQlmbXQgPSBmbXQgfHwgZm9ybWF0Ow0KDQoJCQkJaWYgKGVsbSkgew0KCQkJCQllYWNoKGZtdC5zdHlsZXMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7DQoJCQkJCQlkb20uc2V0U3R5bGUoZWxtLCBuYW1lLCByZXBsYWNlVmFycyh2YWx1ZSwgdmFycykpOw0KCQkJCQl9KTsNCg0KCQkJCQllYWNoKGZtdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkgew0KCQkJCQkJZG9tLnNldEF0dHJpYihlbG0sIG5hbWUsIHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKSk7DQoJCQkJCX0pOw0KDQoJCQkJCWVhY2goZm10LmNsYXNzZXMsIGZ1bmN0aW9uKHZhbHVlKSB7DQoJCQkJCQl2YWx1ZSA9IHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKTsNCg0KCQkJCQkJaWYgKCFkb20uaGFzQ2xhc3MoZWxtLCB2YWx1ZSkpDQoJCQkJCQkJZG9tLmFkZENsYXNzKGVsbSwgdmFsdWUpOw0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBhcHBseVJuZ1N0eWxlKHJuZykgew0KCQkJCXZhciBuZXdXcmFwcGVycyA9IFtdLCB3cmFwTmFtZSwgd3JhcEVsbTsNCg0KCQkJCS8vIFNldHVwIHdyYXBwZXIgZWxlbWVudA0KCQkJCXdyYXBOYW1lID0gZm9ybWF0LmlubGluZSB8fCBmb3JtYXQuYmxvY2s7DQoJCQkJd3JhcEVsbSA9IGRvbS5jcmVhdGUod3JhcE5hbWUpOw0KCQkJCXNldEVsZW1lbnRGb3JtYXQod3JhcEVsbSk7DQoNCgkJCQlyYW5nZVV0aWxzLndhbGsocm5nLCBmdW5jdGlvbihub2Rlcykgew0KCQkJCQl2YXIgY3VycmVudFdyYXBFbG07DQoNCgkJCQkJZnVuY3Rpb24gcHJvY2Vzcyhub2RlKSB7DQoJCQkJCQl2YXIgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudE5hbWUgPSBub2RlLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgZm91bmQ7DQoNCgkJCQkJCS8vIFN0b3Agd3JhcHBpbmcgb24gYnIgZWxlbWVudHMNCgkJCQkJCWlmIChpc0VxKG5vZGVOYW1lLCAnYnInKSkgew0KCQkJCQkJCWN1cnJlbnRXcmFwRWxtID0gMDsNCg0KCQkJCQkJCS8vIFJlbW92ZSBhbnkgYnIgZWxlbWVudHMgd2hlbiB3ZSB3cmFwIHRoaW5ncw0KCQkJCQkJCWlmIChmb3JtYXQuYmxvY2spDQoJCQkJCQkJCWRvbS5yZW1vdmUobm9kZSk7DQoNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCS8vIElmIG5vZGUgaXMgd3JhcHBlciB0eXBlDQoJCQkJCQlpZiAoZm9ybWF0LndyYXBwZXIgJiYgbWF0Y2hOb2RlKG5vZGUsIG5hbWUsIHZhcnMpKSB7DQoJCQkJCQkJY3VycmVudFdyYXBFbG0gPSAwOw0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gQ2FuIHdlIHJlbmFtZSB0aGUgYmxvY2sNCgkJCQkJCWlmIChmb3JtYXQuYmxvY2sgJiYgIWZvcm1hdC53cmFwcGVyICYmIGlzVGV4dEJsb2NrKG5vZGVOYW1lKSkgew0KCQkJCQkJCW5vZGUgPSBkb20ucmVuYW1lKG5vZGUsIHdyYXBOYW1lKTsNCgkJCQkJCQlzZXRFbGVtZW50Rm9ybWF0KG5vZGUpOw0KCQkJCQkJCW5ld1dyYXBwZXJzLnB1c2gobm9kZSk7DQoJCQkJCQkJY3VycmVudFdyYXBFbG0gPSAwOw0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gSGFuZGxlIHNlbGVjdG9yIHBhdHRlcm5zDQoJCQkJCQlpZiAoZm9ybWF0LnNlbGVjdG9yKSB7DQoJCQkJCQkJLy8gTG9vayBmb3IgbWF0Y2hpbmcgZm9ybWF0cw0KCQkJCQkJCWVhY2goZm9ybWF0TGlzdCwgZnVuY3Rpb24oZm9ybWF0KSB7DQoJCQkJCQkJCWlmIChkb20uaXMobm9kZSwgZm9ybWF0LnNlbGVjdG9yKSAmJiAhaXNDYXJldE5vZGUobm9kZSkpIHsNCgkJCQkJCQkJCXNldEVsZW1lbnRGb3JtYXQobm9kZSwgZm9ybWF0KTsNCgkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0pOw0KDQoJCQkJCQkJLy8gQ29udGludWUgcHJvY2Vzc2luZyBpZiBhIHNlbGVjdG9yIG1hdGNoIHdhc24ndCBmb3VuZCBhbmQgYSBpbmxpbmUgZWxlbWVudCBpcyBkZWZpbmVkDQoJCQkJCQkJaWYgKCFmb3JtYXQuaW5saW5lIHx8IGZvdW5kKSB7DQoJCQkJCQkJCWN1cnJlbnRXcmFwRWxtID0gMDsNCgkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJLy8gSXMgaXQgdmFsaWQgdG8gd3JhcCB0aGlzIGl0ZW0NCgkJCQkJCWlmICgoZm9ybWF0LndyYXBfbGlua3MgIT09IGZhbHNlIHx8IG5vZGVOYW1lICE9ICdhJykgJiYgaXNWYWxpZCh3cmFwTmFtZSwgbm9kZU5hbWUpICYmIGlzVmFsaWQocGFyZW50TmFtZSwgd3JhcE5hbWUpKSB7DQoJCQkJCQkJLy8gU3RhcnQgd3JhcHBpbmcNCgkJCQkJCQlpZiAoIWN1cnJlbnRXcmFwRWxtKSB7DQoJCQkJCQkJCS8vIFdyYXAgdGhlIG5vZGUNCgkJCQkJCQkJY3VycmVudFdyYXBFbG0gPSB3cmFwRWxtLmNsb25lTm9kZShGQUxTRSk7DQoJCQkJCQkJCW5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY3VycmVudFdyYXBFbG0sIG5vZGUpOw0KCQkJCQkJCQluZXdXcmFwcGVycy5wdXNoKGN1cnJlbnRXcmFwRWxtKTsNCgkJCQkJCQl9DQoNCgkJCQkJCQljdXJyZW50V3JhcEVsbS5hcHBlbmRDaGlsZChub2RlKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJLy8gU3RhcnQgYSBuZXcgd3JhcHBlciBmb3IgcG9zc2libGUgY2hpbGRyZW4NCgkJCQkJCQljdXJyZW50V3JhcEVsbSA9IDA7DQoNCgkJCQkJCQllYWNoKHRpbnltY2UuZ3JlcChub2RlLmNoaWxkTm9kZXMpLCBwcm9jZXNzKTsNCg0KCQkJCQkJCS8vIEVuZCB0aGUgbGFzdCB3cmFwcGVyDQoJCQkJCQkJY3VycmVudFdyYXBFbG0gPSAwOw0KCQkJCQkJfQ0KCQkJCQl9Ow0KDQoJCQkJCS8vIFByb2Nlc3Mgc2libGluZ3MgZnJvbSByYW5nZQ0KCQkJCQllYWNoKG5vZGVzLCBwcm9jZXNzKTsNCgkJCQl9KTsNCg0KCQkJCS8vIENsZWFudXANCgkJCQllYWNoKG5ld1dyYXBwZXJzLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCXZhciBjaGlsZENvdW50Ow0KDQoJCQkJCWZ1bmN0aW9uIGdldENoaWxkQ291bnQobm9kZSkgew0KCQkJCQkJdmFyIGNvdW50ID0gMDsNCg0KCQkJCQkJZWFjaChub2RlLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCQlpZiAoIWlzV2hpdGVTcGFjZU5vZGUobm9kZSkgJiYgIWlzQm9va21hcmtOb2RlKG5vZGUpKQ0KCQkJCQkJCQljb3VudCsrOw0KCQkJCQkJfSk7DQoNCgkJCQkJCXJldHVybiBjb3VudDsNCgkJCQkJfTsNCg0KCQkJCQlmdW5jdGlvbiBtZXJnZVN0eWxlcyhub2RlKSB7DQoJCQkJCQl2YXIgY2hpbGQsIGNsb25lOw0KDQoJCQkJCQllYWNoKG5vZGUuY2hpbGROb2RlcywgZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgIWlzQm9va21hcmtOb2RlKG5vZGUpICYmICFpc0NhcmV0Tm9kZShub2RlKSkgew0KCQkJCQkJCQljaGlsZCA9IG5vZGU7DQoJCQkJCQkJCXJldHVybiBGQUxTRTsgLy8gYnJlYWsgbG9vcA0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBJZiBjaGlsZCB3YXMgZm91bmQgYW5kIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGN1cnJlbnQgbm9kZQ0KCQkJCQkJaWYgKGNoaWxkICYmIG1hdGNoTmFtZShjaGlsZCwgZm9ybWF0KSkgew0KCQkJCQkJCWNsb25lID0gY2hpbGQuY2xvbmVOb2RlKEZBTFNFKTsNCgkJCQkJCQlzZXRFbGVtZW50Rm9ybWF0KGNsb25lKTsNCg0KCQkJCQkJCWRvbS5yZXBsYWNlKGNsb25lLCBub2RlLCBUUlVFKTsNCgkJCQkJCQlkb20ucmVtb3ZlKGNoaWxkLCAxKTsNCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuIGNsb25lIHx8IG5vZGU7DQoJCQkJCX07DQoNCgkJCQkJY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQobm9kZSk7DQoNCgkJCQkJLy8gUmVtb3ZlIGVtcHR5IG5vZGVzDQoJCQkJCWlmIChjaGlsZENvdW50ID09PSAwKSB7DQoJCQkJCQlkb20ucmVtb3ZlKG5vZGUsIDEpOw0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoNCgkJCQkJaWYgKGZvcm1hdC5pbmxpbmUgfHwgZm9ybWF0LndyYXBwZXIpIHsNCgkJCQkJCS8vIE1lcmdlcyB0aGUgY3VycmVudCBub2RlIHdpdGggaXQncyBjaGlsZHJlbiBvZiBzaW1pbGFyIHR5cGUgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCgkJCQkJCWlmICghZm9ybWF0LmV4YWN0ICYmIGNoaWxkQ291bnQgPT09IDEpDQoJCQkJCQkJbm9kZSA9IG1lcmdlU3R5bGVzKG5vZGUpOw0KDQoJCQkJCQkvLyBSZW1vdmUvbWVyZ2UgY2hpbGRyZW4NCgkJCQkJCWVhY2goZm9ybWF0TGlzdCwgZnVuY3Rpb24oZm9ybWF0KSB7DQoJCQkJCQkJLy8gTWVyZ2UgYWxsIGNoaWxkcmVuIG9mIHNpbWlsYXIgdHlwZSB3aWxsIG1vdmUgc3R5bGVzIGZyb20gY2hpbGQgdG8gcGFyZW50DQoJCQkJCQkJLy8gdGhpczogPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+PGI+PHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsgZm9udC1zaXplOjEwcHgiPnRleHQ8L3NwYW4+PC9iPjwvc3Bhbj4NCgkJCQkJCQkvLyB3aWxsIGJlY29tZTogPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMHB4Ij50ZXh0PC9zcGFuPjwvYj48L3NwYW4+DQoJCQkJCQkJZWFjaChkb20uc2VsZWN0KGZvcm1hdC5pbmxpbmUsIG5vZGUpLCBmdW5jdGlvbihjaGlsZCkgew0KCQkJCQkJCQlyZW1vdmVGb3JtYXQoZm9ybWF0LCB2YXJzLCBjaGlsZCwgZm9ybWF0LmV4YWN0ID8gY2hpbGQgOiBudWxsKTsNCgkJCQkJCQl9KTsNCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBSZW1vdmUgY2hpbGQgaWYgZGlyZWN0IHBhcmVudCBpcyBvZiBzYW1lIHR5cGUNCgkJCQkJCWlmIChtYXRjaE5vZGUobm9kZS5wYXJlbnROb2RlLCBuYW1lLCB2YXJzKSkgew0KCQkJCQkJCWRvbS5yZW1vdmUobm9kZSwgMSk7DQoJCQkJCQkJbm9kZSA9IDA7DQoJCQkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIExvb2sgZm9yIHBhcmVudCB3aXRoIHNpbWlsYXIgc3R5bGUgZm9ybWF0DQoJCQkJCQlpZiAoZm9ybWF0Lm1lcmdlX3dpdGhfcGFyZW50cykgew0KCQkJCQkJCWRvbS5nZXRQYXJlbnQobm9kZS5wYXJlbnROb2RlLCBmdW5jdGlvbihwYXJlbnQpIHsNCgkJCQkJCQkJaWYgKG1hdGNoTm9kZShwYXJlbnQsIG5hbWUsIHZhcnMpKSB7DQoJCQkJCQkJCQlkb20ucmVtb3ZlKG5vZGUsIDEpOw0KCQkJCQkJCQkJbm9kZSA9IDA7DQoJCQkJCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0pOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBNZXJnZSBuZXh0IGFuZCBwcmV2aW91cyBzaWJsaW5ncyBpZiB0aGV5IGFyZSBzaW1pbGFyIDxiPnRleHQ8L2I+PGI+dGV4dDwvYj4gYmVjb21lcyA8Yj50ZXh0dGV4dDwvYj4NCgkJCQkJCWlmIChub2RlKSB7DQoJCQkJCQkJbm9kZSA9IG1lcmdlU2libGluZ3MoZ2V0Tm9uV2hpdGVTcGFjZVNpYmxpbmcobm9kZSksIG5vZGUpOw0KCQkJCQkJCW5vZGUgPSBtZXJnZVNpYmxpbmdzKG5vZGUsIGdldE5vbldoaXRlU3BhY2VTaWJsaW5nKG5vZGUsIFRSVUUpKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfTsNCg0KCQkJaWYgKGZvcm1hdCkgew0KCQkJCWlmIChub2RlKSB7DQoJCQkJCXJuZyA9IGRvbS5jcmVhdGVSbmcoKTsNCg0KCQkJCQlybmcuc2V0U3RhcnRCZWZvcmUobm9kZSk7DQoJCQkJCXJuZy5zZXRFbmRBZnRlcihub2RlKTsNCg0KCQkJCQlhcHBseVJuZ1N0eWxlKGV4cGFuZFJuZyhybmcsIGZvcm1hdExpc3QpKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlpZiAoIXNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpIHx8ICFmb3JtYXQuaW5saW5lKSB7DQoJCQkJCQkvLyBBcHBseSBmb3JtYXR0aW5nIHRvIHNlbGVjdGlvbg0KCQkJCQkJYm9va21hcmsgPSBzZWxlY3Rpb24uZ2V0Qm9va21hcmsoKTsNCgkJCQkJCWFwcGx5Um5nU3R5bGUoZXhwYW5kUm5nKHNlbGVjdGlvbi5nZXRSbmcoVFJVRSksIGZvcm1hdExpc3QpKTsNCg0KCQkJCQkJc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsNCgkJCQkJCXNlbGVjdGlvbi5zZXRSbmcobW92ZVN0YXJ0KHNlbGVjdGlvbi5nZXRSbmcoVFJVRSkpKTsNCgkJCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJcGVyZm9ybUNhcmV0QWN0aW9uKCdhcHBseScsIG5hbWUsIHZhcnMpOw0KCQkJCX0NCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiByZW1vdmUobmFtZSwgdmFycywgbm9kZSkgew0KCQkJdmFyIGZvcm1hdExpc3QgPSBnZXQobmFtZSksIGZvcm1hdCA9IGZvcm1hdExpc3RbMF0sIGJvb2ttYXJrLCBpLCBybmc7DQoNCgkJCWZ1bmN0aW9uIG1vdmVTdGFydChybmcpIHsNCgkJCQl2YXIgY29udGFpbmVyID0gcm5nLnN0YXJ0Q29udGFpbmVyLA0KCQkJCQlvZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQsDQoJCQkJCXdhbGtlciwgbm9kZSwgbm9kZXMsIHRtcE5vZGU7DQoNCgkJCQkvLyBDb252ZXJ0IHRleHQgbm9kZSBpbnRvIGluZGV4IGlmIHBvc3NpYmxlDQoJCQkJaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PSAzICYmIG9mZnNldCA+PSBjb250YWluZXIubm9kZVZhbHVlLmxlbmd0aCAtIDEpIHsNCgkJCQkJY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7DQoJCQkJCW9mZnNldCA9IG5vZGVJbmRleChjb250YWluZXIpICsgMTsNCgkJCQl9DQoNCgkJCQkvLyBNb3ZlIHN0YXJ0Q29udGFpbmVyL3N0YXJ0T2Zmc2V0IGluIHRvIGEgc3VpdGFibGUgbm9kZQ0KCQkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMSkgew0KCQkJCQlub2RlcyA9IGNvbnRhaW5lci5jaGlsZE5vZGVzOw0KCQkJCQljb250YWluZXIgPSBub2Rlc1tNYXRoLm1pbihvZmZzZXQsIG5vZGVzLmxlbmd0aCAtIDEpXTsNCgkJCQkJd2Fsa2VyID0gbmV3IFRyZWVXYWxrZXIoY29udGFpbmVyKTsNCg0KCQkJCQkvLyBJZiBvZmZzZXQgaXMgYXQgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZSB3YWxrIHRvIHRoZSBuZXh0IG9uZQ0KCQkJCQlpZiAob2Zmc2V0ID4gbm9kZXMubGVuZ3RoIC0gMSkNCgkJCQkJCXdhbGtlci5uZXh0KCk7DQoNCgkJCQkJZm9yIChub2RlID0gd2Fsa2VyLmN1cnJlbnQoKTsgbm9kZTsgbm9kZSA9IHdhbGtlci5uZXh0KCkpIHsNCgkJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgIWlzV2hpdGVTcGFjZU5vZGUobm9kZSkpIHsNCgkJCQkJCQkvLyBJRSBoYXMgYSAibmVhdCIgZmVhdHVyZSB3aGVyZSBpdCBtb3ZlcyB0aGUgc3RhcnQgbm9kZSBpbnRvIHRoZSBjbG9zZXN0IGVsZW1lbnQNCgkJCQkJCQkvLyB3ZSBjYW4gYXZvaWQgdGhpcyBieSBpbnNlcnRpbmcgYW4gZWxlbWVudCBiZWZvcmUgaXQgYW5kIHRoZW4gcmVtb3ZlIGl0IGFmdGVyIHdlIHNldCB0aGUgc2VsZWN0aW9uDQoJCQkJCQkJdG1wTm9kZSA9IGRvbS5jcmVhdGUoJ2EnLCBudWxsLCBJTlZJU0lCTEVfQ0hBUik7DQoJCQkJCQkJbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0bXBOb2RlLCBub2RlKTsNCg0KCQkJCQkJCS8vIFNldCBzZWxlY3Rpb24gYW5kIHJlbW92ZSB0bXBOb2RlDQoJCQkJCQkJcm5nLnNldFN0YXJ0KG5vZGUsIDApOw0KCQkJCQkJCXNlbGVjdGlvbi5zZXRSbmcocm5nKTsNCgkJCQkJCQlkb20ucmVtb3ZlKHRtcE5vZGUpOw0KDQoJCQkJCQkJcmV0dXJuOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfTsNCg0KCQkJLy8gTWVyZ2VzIHRoZSBzdHlsZXMgZm9yIGVhY2ggbm9kZQ0KCQkJZnVuY3Rpb24gcHJvY2Vzcyhub2RlKSB7DQoJCQkJdmFyIGNoaWxkcmVuLCBpLCBsOw0KDQoJCQkJLy8gR3JhYiB0aGUgY2hpbGRyZW4gZmlyc3Qgc2luY2UgdGhlIG5vZGVsaXN0IG1pZ2h0IGJlIGNoYW5nZWQNCgkJCQljaGlsZHJlbiA9IHRpbnltY2UuZ3JlcChub2RlLmNoaWxkTm9kZXMpOw0KDQoJCQkJLy8gUHJvY2VzcyBjdXJyZW50IG5vZGUNCgkJCQlmb3IgKGkgPSAwLCBsID0gZm9ybWF0TGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCgkJCQkJaWYgKHJlbW92ZUZvcm1hdChmb3JtYXRMaXN0W2ldLCB2YXJzLCBub2RlLCBub2RlKSkNCgkJCQkJCWJyZWFrOw0KCQkJCX0NCg0KCQkJCS8vIFByb2Nlc3MgdGhlIGNoaWxkcmVuDQoJCQkJaWYgKGZvcm1hdC5kZWVwKSB7DQoJCQkJCWZvciAoaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspDQoJCQkJCQlwcm9jZXNzKGNoaWxkcmVuW2ldKTsNCgkJCQl9DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBmaW5kRm9ybWF0Um9vdChjb250YWluZXIpIHsNCgkJCQl2YXIgZm9ybWF0Um9vdDsNCg0KCQkJCS8vIEZpbmQgZm9ybWF0IHJvb3QNCgkJCQllYWNoKGdldFBhcmVudHMoY29udGFpbmVyLnBhcmVudE5vZGUpLnJldmVyc2UoKSwgZnVuY3Rpb24ocGFyZW50KSB7DQoJCQkJCXZhciBmb3JtYXQ7DQoNCgkJCQkJLy8gRmluZCBmb3JtYXQgcm9vdCBlbGVtZW50DQoJCQkJCWlmICghZm9ybWF0Um9vdCAmJiBwYXJlbnQuaWQgIT0gJ19zdGFydCcgJiYgcGFyZW50LmlkICE9ICdfZW5kJykgew0KCQkJCQkJLy8gSXMgdGhlIG5vZGUgbWF0Y2hpbmcgdGhlIGZvcm1hdCB3ZSBhcmUgbG9va2luZyBmb3INCgkJCQkJCWZvcm1hdCA9IG1hdGNoTm9kZShwYXJlbnQsIG5hbWUsIHZhcnMpOw0KCQkJCQkJaWYgKGZvcm1hdCAmJiBmb3JtYXQuc3BsaXQgIT09IGZhbHNlKQ0KCQkJCQkJCWZvcm1hdFJvb3QgPSBwYXJlbnQ7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCXJldHVybiBmb3JtYXRSb290Ow0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gd3JhcEFuZFNwbGl0KGZvcm1hdF9yb290LCBjb250YWluZXIsIHRhcmdldCwgc3BsaXQpIHsNCgkJCQl2YXIgcGFyZW50LCBjbG9uZSwgbGFzdENsb25lLCBmaXJzdENsb25lLCBpLCBmb3JtYXRSb290UGFyZW50Ow0KDQoJCQkJLy8gRm9ybWF0IHJvb3QgZm91bmQgdGhlbiBjbG9uZSBmb3JtYXRzIGFuZCBzcGxpdCBpdA0KCQkJCWlmIChmb3JtYXRfcm9vdCkgew0KCQkJCQlmb3JtYXRSb290UGFyZW50ID0gZm9ybWF0X3Jvb3QucGFyZW50Tm9kZTsNCg0KCQkJCQlmb3IgKHBhcmVudCA9IGNvbnRhaW5lci5wYXJlbnROb2RlOyBwYXJlbnQgJiYgcGFyZW50ICE9IGZvcm1hdFJvb3RQYXJlbnQ7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7DQoJCQkJCQljbG9uZSA9IHBhcmVudC5jbG9uZU5vZGUoRkFMU0UpOw0KDQoJCQkJCQlmb3IgKGkgPSAwOyBpIDwgZm9ybWF0TGlzdC5sZW5ndGg7IGkrKykgew0KCQkJCQkJCWlmIChyZW1vdmVGb3JtYXQoZm9ybWF0TGlzdFtpXSwgdmFycywgY2xvbmUsIGNsb25lKSkgew0KCQkJCQkJCQljbG9uZSA9IDA7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJLy8gQnVpbGQgd3JhcHBlciBub2RlDQoJCQkJCQlpZiAoY2xvbmUpIHsNCgkJCQkJCQlpZiAobGFzdENsb25lKQ0KCQkJCQkJCQljbG9uZS5hcHBlbmRDaGlsZChsYXN0Q2xvbmUpOw0KDQoJCQkJCQkJaWYgKCFmaXJzdENsb25lKQ0KCQkJCQkJCQlmaXJzdENsb25lID0gY2xvbmU7DQoNCgkJCQkJCQlsYXN0Q2xvbmUgPSBjbG9uZTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIE5ldmVyIHNwbGl0IGJsb2NrIGVsZW1lbnRzIGlmIHRoZSBmb3JtYXQgaXMgbWl4ZWQNCgkJCQkJaWYgKHNwbGl0ICYmICghZm9ybWF0Lm1peGVkIHx8ICFpc0Jsb2NrKGZvcm1hdF9yb290KSkpDQoJCQkJCQljb250YWluZXIgPSBkb20uc3BsaXQoZm9ybWF0X3Jvb3QsIGNvbnRhaW5lcik7DQoNCgkJCQkJLy8gV3JhcCBjb250YWluZXIgaW4gY2xvbmVkIGZvcm1hdHMNCgkJCQkJaWYgKGxhc3RDbG9uZSkgew0KCQkJCQkJdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGxhc3RDbG9uZSwgdGFyZ2V0KTsNCgkJCQkJCWZpcnN0Q2xvbmUuYXBwZW5kQ2hpbGQodGFyZ2V0KTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCXJldHVybiBjb250YWluZXI7DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBzcGxpdFRvRm9ybWF0Um9vdChjb250YWluZXIpIHsNCgkJCQlyZXR1cm4gd3JhcEFuZFNwbGl0KGZpbmRGb3JtYXRSb290KGNvbnRhaW5lciksIGNvbnRhaW5lciwgY29udGFpbmVyLCB0cnVlKTsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHVud3JhcChzdGFydCkgew0KCQkJCXZhciBub2RlID0gZG9tLmdldChzdGFydCA/ICdfc3RhcnQnIDogJ19lbmQnKSwNCgkJCQkJb3V0ID0gbm9kZVtzdGFydCA/ICdmaXJzdENoaWxkJyA6ICdsYXN0Q2hpbGQnXTsNCg0KCQkJCS8vIElmIHRoZSBlbmQgaXMgcGxhY2VkIHdpdGhpbiB0aGUgc3RhcnQgdGhlIHJlc3VsdCB3aWxsIGJlIHJlbW92ZWQNCgkJCQkvLyBTbyB0aGlzIGNoZWNrcyBpZiB0aGUgb3V0IG5vZGUgaXMgYSBib29rbWFyayBub2RlIGlmIGl0IGlzIGl0DQoJCQkJLy8gY2hlY2tzIGZvciBhbm90aGVyIG1vcmUgc3VpdGFibGUgbm9kZQ0KCQkJCWlmIChpc0Jvb2ttYXJrTm9kZShvdXQpKQ0KCQkJCQlvdXQgPSBvdXRbc3RhcnQgPyAnZmlyc3RDaGlsZCcgOiAnbGFzdENoaWxkJ107DQoNCgkJCQlkb20ucmVtb3ZlKG5vZGUsIHRydWUpOw0KDQoJCQkJcmV0dXJuIG91dDsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHJlbW92ZVJuZ1N0eWxlKHJuZykgew0KCQkJCXZhciBzdGFydENvbnRhaW5lciwgZW5kQ29udGFpbmVyOw0KDQoJCQkJcm5nID0gZXhwYW5kUm5nKHJuZywgZm9ybWF0TGlzdCwgVFJVRSk7DQoNCgkJCQlpZiAoZm9ybWF0LnNwbGl0KSB7DQoJCQkJCXN0YXJ0Q29udGFpbmVyID0gZ2V0Q29udGFpbmVyKHJuZywgVFJVRSk7DQoJCQkJCWVuZENvbnRhaW5lciA9IGdldENvbnRhaW5lcihybmcpOw0KDQoJCQkJCWlmIChzdGFydENvbnRhaW5lciAhPSBlbmRDb250YWluZXIpIHsNCgkJCQkJCS8vIFdyYXAgc3RhcnQvZW5kIG5vZGVzIGluIHNwYW4gZWxlbWVudCBzaW5jZSB0aGVzZSBtaWdodCBiZSBjbG9uZWQvbW92ZWQNCgkJCQkJCXN0YXJ0Q29udGFpbmVyID0gd3JhcChzdGFydENvbnRhaW5lciwgJ3NwYW4nLCB7aWQgOiAnX3N0YXJ0JywgX21jZV90eXBlIDogJ2Jvb2ttYXJrJ30pOw0KCQkJCQkJZW5kQ29udGFpbmVyID0gd3JhcChlbmRDb250YWluZXIsICdzcGFuJywge2lkIDogJ19lbmQnLCBfbWNlX3R5cGUgOiAnYm9va21hcmsnfSk7DQoNCgkJCQkJCS8vIFNwbGl0IHN0YXJ0L2VuZA0KCQkJCQkJc3BsaXRUb0Zvcm1hdFJvb3Qoc3RhcnRDb250YWluZXIpOw0KCQkJCQkJc3BsaXRUb0Zvcm1hdFJvb3QoZW5kQ29udGFpbmVyKTsNCg0KCQkJCQkJLy8gVW53cmFwIHN0YXJ0L2VuZCB0byBnZXQgcmVhbCBlbGVtZW50cyBhZ2Fpbg0KCQkJCQkJc3RhcnRDb250YWluZXIgPSB1bndyYXAoVFJVRSk7DQoJCQkJCQllbmRDb250YWluZXIgPSB1bndyYXAoKTsNCgkJCQkJfSBlbHNlDQoJCQkJCQlzdGFydENvbnRhaW5lciA9IGVuZENvbnRhaW5lciA9IHNwbGl0VG9Gb3JtYXRSb290KHN0YXJ0Q29udGFpbmVyKTsNCg0KCQkJCQkvLyBVcGRhdGUgcmFuZ2UgcG9zaXRpb25zIHNpbmNlIHRoZXkgbWlnaHQgaGF2ZSBjaGFuZ2VkIGFmdGVyIHRoZSBzcGxpdCBvcGVyYXRpb25zDQoJCQkJCXJuZy5zdGFydENvbnRhaW5lciA9IHN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGU7DQoJCQkJCXJuZy5zdGFydE9mZnNldCA9IG5vZGVJbmRleChzdGFydENvbnRhaW5lcik7DQoJCQkJCXJuZy5lbmRDb250YWluZXIgPSBlbmRDb250YWluZXIucGFyZW50Tm9kZTsNCgkJCQkJcm5nLmVuZE9mZnNldCA9IG5vZGVJbmRleChlbmRDb250YWluZXIpICsgMTsNCgkJCQl9DQoNCgkJCQkvLyBSZW1vdmUgaXRlbXMgYmV0d2VlbiBzdGFydC9lbmQNCgkJCQlyYW5nZVV0aWxzLndhbGsocm5nLCBmdW5jdGlvbihub2Rlcykgew0KCQkJCQllYWNoKG5vZGVzLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCQlwcm9jZXNzKG5vZGUpOw0KCQkJCQl9KTsNCgkJCQl9KTsNCgkJCX07DQoNCgkJCS8vIEhhbmRsZSBub2RlDQoJCQlpZiAobm9kZSkgew0KCQkJCXJuZyA9IGRvbS5jcmVhdGVSbmcoKTsNCgkJCQlybmcuc2V0U3RhcnRCZWZvcmUobm9kZSk7DQoJCQkJcm5nLnNldEVuZEFmdGVyKG5vZGUpOw0KCQkJCXJlbW92ZVJuZ1N0eWxlKHJuZyk7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQlpZiAoIXNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpIHx8ICFmb3JtYXQuaW5saW5lKSB7DQoJCQkJYm9va21hcmsgPSBzZWxlY3Rpb24uZ2V0Qm9va21hcmsoKTsNCgkJCQlyZW1vdmVSbmdTdHlsZShzZWxlY3Rpb24uZ2V0Um5nKFRSVUUpKTsNCgkJCQlzZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoYm9va21hcmspOw0KDQoJCQkJLy8gQ2hlY2sgaWYgc3RhcnQgZWxlbWVudCBzdGlsbCBoYXMgZm9ybWF0dGluZyB0aGVuIHdlIGFyZSBhdDogIjxiPnRleHR8PC9iPnRleHQiIGFuZCBuZWVkIHRvIG1vdmUgdGhlIHN0YXJ0IGludG8gdGhlIG5leHQgdGV4dCBub2RlDQoJCQkJaWYgKG1hdGNoKG5hbWUsIHZhcnMsIHNlbGVjdGlvbi5nZXRTdGFydCgpKSkgew0KCQkJCQltb3ZlU3RhcnQoc2VsZWN0aW9uLmdldFJuZyh0cnVlKSk7DQoJCQkJfQ0KDQoJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCX0gZWxzZQ0KCQkJCXBlcmZvcm1DYXJldEFjdGlvbigncmVtb3ZlJywgbmFtZSwgdmFycyk7DQoJCX07DQoNCgkJZnVuY3Rpb24gdG9nZ2xlKG5hbWUsIHZhcnMsIG5vZGUpIHsNCgkJCWlmIChtYXRjaChuYW1lLCB2YXJzLCBub2RlKSkNCgkJCQlyZW1vdmUobmFtZSwgdmFycywgbm9kZSk7DQoJCQllbHNlDQoJCQkJYXBwbHkobmFtZSwgdmFycywgbm9kZSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gbWF0Y2hOb2RlKG5vZGUsIG5hbWUsIHZhcnMsIHNpbWlsYXIpIHsNCgkJCXZhciBmb3JtYXRMaXN0ID0gZ2V0KG5hbWUpLCBmb3JtYXQsIGksIGNsYXNzZXM7DQoNCgkJCWZ1bmN0aW9uIG1hdGNoSXRlbXMobm9kZSwgZm9ybWF0LCBpdGVtX25hbWUpIHsNCgkJCQl2YXIga2V5LCB2YWx1ZSwgaXRlbXMgPSBmb3JtYXRbaXRlbV9uYW1lXSwgaTsNCg0KCQkJCS8vIENoZWNrIGFsbCBpdGVtcw0KCQkJCWlmIChpdGVtcykgew0KCQkJCQkvLyBOb24gaW5kZXhlZCBvYmplY3QNCgkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7DQoJCQkJCQlmb3IgKGtleSBpbiBpdGVtcykgew0KCQkJCQkJCWlmIChpdGVtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7DQoJCQkJCQkJCWlmIChpdGVtX25hbWUgPT09ICdhdHRyaWJ1dGVzJykNCgkJCQkJCQkJCXZhbHVlID0gZG9tLmdldEF0dHJpYihub2RlLCBrZXkpOw0KCQkJCQkJCQllbHNlDQoJCQkJCQkJCQl2YWx1ZSA9IGdldFN0eWxlKG5vZGUsIGtleSk7DQoNCgkJCQkJCQkJaWYgKHNpbWlsYXIgJiYgIXZhbHVlICYmICFmb3JtYXQuZXhhY3QpDQoJCQkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCQkJaWYgKCghc2ltaWxhciB8fCBmb3JtYXQuZXhhY3QpICYmICFpc0VxKHZhbHVlLCByZXBsYWNlVmFycyhpdGVtc1trZXldLCB2YXJzKSkpDQoJCQkJCQkJCQlyZXR1cm47DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJLy8gT25seSBvbmUgbWF0Y2ggbmVlZGVkIGZvciBpbmRleGVkIGFycmF5cw0KCQkJCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJaWYgKGl0ZW1fbmFtZSA9PT0gJ2F0dHJpYnV0ZXMnID8gZG9tLmdldEF0dHJpYihub2RlLCBpdGVtc1tpXSkgOiBnZXRTdHlsZShub2RlLCBpdGVtc1tpXSkpDQoJCQkJCQkJCXJldHVybiBmb3JtYXQ7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlyZXR1cm4gZm9ybWF0Ow0KCQkJfTsNCg0KCQkJaWYgKGZvcm1hdExpc3QgJiYgbm9kZSkgew0KCQkJCS8vIENoZWNrIGVhY2ggZm9ybWF0IGluIGxpc3QNCgkJCQlmb3IgKGkgPSAwOyBpIDwgZm9ybWF0TGlzdC5sZW5ndGg7IGkrKykgew0KCQkJCQlmb3JtYXQgPSBmb3JtYXRMaXN0W2ldOw0KDQoJCQkJCS8vIE5hbWUgbmFtZSwgYXR0cmlidXRlcywgc3R5bGVzIGFuZCBjbGFzc2VzDQoJCQkJCWlmIChtYXRjaE5hbWUobm9kZSwgZm9ybWF0KSAmJiBtYXRjaEl0ZW1zKG5vZGUsIGZvcm1hdCwgJ2F0dHJpYnV0ZXMnKSAmJiBtYXRjaEl0ZW1zKG5vZGUsIGZvcm1hdCwgJ3N0eWxlcycpKSB7DQoJCQkJCQkvLyBNYXRjaCBjbGFzc2VzDQoJCQkJCQlpZiAoY2xhc3NlcyA9IGZvcm1hdC5jbGFzc2VzKSB7DQoJCQkJCQkJZm9yIChpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQkJaWYgKCFkb20uaGFzQ2xhc3Mobm9kZSwgY2xhc3Nlc1tpXSkpDQoJCQkJCQkJCQlyZXR1cm47DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm4gZm9ybWF0Ow0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIG1hdGNoKG5hbWUsIHZhcnMsIG5vZGUpIHsNCgkJCXZhciBzdGFydE5vZGUsIGk7DQoNCgkJCWZ1bmN0aW9uIG1hdGNoUGFyZW50cyhub2RlKSB7DQoJCQkJLy8gRmluZCBmaXJzdCBub2RlIHdpdGggc2ltaWxhciBmb3JtYXQgc2V0dGluZ3MNCgkJCQlub2RlID0gZG9tLmdldFBhcmVudChub2RlLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCXJldHVybiAhIW1hdGNoTm9kZShub2RlLCBuYW1lLCB2YXJzLCB0cnVlKTsNCgkJCQl9KTsNCg0KCQkJCS8vIERvIGFuIGV4YWN0IGNoZWNrIG9uIHRoZSBzaW1pbGFyIGZvcm1hdCBlbGVtZW50DQoJCQkJcmV0dXJuIG1hdGNoTm9kZShub2RlLCBuYW1lLCB2YXJzKTsNCgkJCX07DQoNCgkJCS8vIENoZWNrIHNwZWNpZmllZCBub2RlDQoJCQlpZiAobm9kZSkNCgkJCQlyZXR1cm4gbWF0Y2hQYXJlbnRzKG5vZGUpOw0KDQoJCQkvLyBDaGVjayBwZW5kaW5nIGZvcm1hdHMNCgkJCWlmIChzZWxlY3Rpb24uaXNDb2xsYXBzZWQoKSkgew0KCQkJCWZvciAoaSA9IHBlbmRpbmdGb3JtYXRzLmFwcGx5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCWlmIChwZW5kaW5nRm9ybWF0cy5hcHBseVtpXS5uYW1lID09IG5hbWUpDQoJCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCQl9DQoNCgkJCQlmb3IgKGkgPSBwZW5kaW5nRm9ybWF0cy5yZW1vdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJaWYgKHBlbmRpbmdGb3JtYXRzLnJlbW92ZVtpXS5uYW1lID09IG5hbWUpDQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIG1hdGNoUGFyZW50cyhzZWxlY3Rpb24uZ2V0Tm9kZSgpKTsNCgkJCX0NCg0KCQkJLy8gQ2hlY2sgc2VsZWN0ZWQgbm9kZQ0KCQkJbm9kZSA9IHNlbGVjdGlvbi5nZXROb2RlKCk7DQoJCQlpZiAobWF0Y2hQYXJlbnRzKG5vZGUpKQ0KCQkJCXJldHVybiBUUlVFOw0KDQoJCQkvLyBDaGVjayBzdGFydCBub2RlIGlmIGl0J3MgZGlmZmVyZW50DQoJCQlzdGFydE5vZGUgPSBzZWxlY3Rpb24uZ2V0U3RhcnQoKTsNCgkJCWlmIChzdGFydE5vZGUgIT0gbm9kZSkgew0KCQkJCWlmIChtYXRjaFBhcmVudHMoc3RhcnROb2RlKSkNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQl9DQoNCgkJCXJldHVybiBGQUxTRTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBtYXRjaEFsbChuYW1lcywgdmFycykgew0KCQkJdmFyIHN0YXJ0RWxlbWVudCwgbWF0Y2hlZEZvcm1hdE5hbWVzID0gW10sIGNoZWNrZWRNYXAgPSB7fSwgaSwgbmksIG5hbWU7DQoNCgkJCS8vIElmIHRoZSBzZWxlY3Rpb24gaXMgY29sbGFwc2VkIHRoZW4gY2hlY2sgcGVuZGluZyBmb3JtYXRzDQoJCQlpZiAoc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkpIHsNCgkJCQlmb3IgKG5pID0gMDsgbmkgPCBuYW1lcy5sZW5ndGg7IG5pKyspIHsNCgkJCQkJLy8gSWYgdGhlIG5hbWUgaXMgdG8gYmUgcmVtb3ZlZCwgdGhlbiBzdG9wIGl0IGZyb20gYmVpbmcgYWRkZWQNCgkJCQkJZm9yIChpID0gcGVuZGluZ0Zvcm1hdHMucmVtb3ZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQluYW1lID0gbmFtZXNbbmldOw0KDQoJCQkJCQlpZiAocGVuZGluZ0Zvcm1hdHMucmVtb3ZlW2ldLm5hbWUgPT0gbmFtZSkgew0KCQkJCQkJCWNoZWNrZWRNYXBbbmFtZV0gPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gSWYgdGhlIGZvcm1hdCBpcyB0byBiZSBhcHBsaWVkDQoJCQkJZm9yIChpID0gcGVuZGluZ0Zvcm1hdHMuYXBwbHkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJZm9yIChuaSA9IDA7IG5pIDwgbmFtZXMubGVuZ3RoOyBuaSsrKSB7DQoJCQkJCQluYW1lID0gbmFtZXNbbmldOw0KDQoJCQkJCQlpZiAoIWNoZWNrZWRNYXBbbmFtZV0gJiYgcGVuZGluZ0Zvcm1hdHMuYXBwbHlbaV0ubmFtZSA9PSBuYW1lKSB7DQoJCQkJCQkJY2hlY2tlZE1hcFtuYW1lXSA9IHRydWU7DQoJCQkJCQkJbWF0Y2hlZEZvcm1hdE5hbWVzLnB1c2gobmFtZSk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCS8vIENoZWNrIHN0YXJ0IG9mIHNlbGVjdGlvbiBmb3IgZm9ybWF0cw0KCQkJc3RhcnRFbGVtZW50ID0gc2VsZWN0aW9uLmdldFN0YXJ0KCk7DQoJCQlkb20uZ2V0UGFyZW50KHN0YXJ0RWxlbWVudCwgZnVuY3Rpb24obm9kZSkgew0KCQkJCXZhciBpLCBuYW1lOw0KDQoJCQkJZm9yIChpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7DQoJCQkJCW5hbWUgPSBuYW1lc1tpXTsNCg0KCQkJCQlpZiAoIWNoZWNrZWRNYXBbbmFtZV0gJiYgbWF0Y2hOb2RlKG5vZGUsIG5hbWUsIHZhcnMpKSB7DQoJCQkJCQljaGVja2VkTWFwW25hbWVdID0gdHJ1ZTsNCgkJCQkJCW1hdGNoZWRGb3JtYXROYW1lcy5wdXNoKG5hbWUpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXJldHVybiBtYXRjaGVkRm9ybWF0TmFtZXM7DQoJCX07DQoNCgkJZnVuY3Rpb24gY2FuQXBwbHkobmFtZSkgew0KCQkJdmFyIGZvcm1hdExpc3QgPSBnZXQobmFtZSksIHN0YXJ0Tm9kZSwgcGFyZW50cywgaSwgeCwgc2VsZWN0b3I7DQoNCgkJCWlmIChmb3JtYXRMaXN0KSB7DQoJCQkJc3RhcnROb2RlID0gc2VsZWN0aW9uLmdldFN0YXJ0KCk7DQoJCQkJcGFyZW50cyA9IGdldFBhcmVudHMoc3RhcnROb2RlKTsNCg0KCQkJCWZvciAoeCA9IGZvcm1hdExpc3QubGVuZ3RoIC0gMTsgeCA+PSAwOyB4LS0pIHsNCgkJCQkJc2VsZWN0b3IgPSBmb3JtYXRMaXN0W3hdLnNlbGVjdG9yOw0KDQoJCQkJCS8vIEZvcm1hdCBpcyBub3Qgc2VsZWN0b3IgYmFzZWQsIHRoZW4gYWx3YXlzIHJldHVybiBUUlVFDQoJCQkJCWlmICghc2VsZWN0b3IpDQoJCQkJCQlyZXR1cm4gVFJVRTsNCg0KCQkJCQlmb3IgKGkgPSBwYXJlbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQlpZiAoZG9tLmlzKHBhcmVudHNbaV0sIHNlbGVjdG9yKSkNCgkJCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9Ow0KDQoJCS8vIEV4cG9zZSB0byBwdWJsaWMNCgkJdGlueW1jZS5leHRlbmQodGhpcywgew0KCQkJZ2V0IDogZ2V0LA0KCQkJcmVnaXN0ZXIgOiByZWdpc3RlciwNCgkJCWFwcGx5IDogYXBwbHksDQoJCQlyZW1vdmUgOiByZW1vdmUsDQoJCQl0b2dnbGUgOiB0b2dnbGUsDQoJCQltYXRjaCA6IG1hdGNoLA0KCQkJbWF0Y2hBbGwgOiBtYXRjaEFsbCwNCgkJCW1hdGNoTm9kZSA6IG1hdGNoTm9kZSwNCgkJCWNhbkFwcGx5IDogY2FuQXBwbHkNCgkJfSk7DQoNCgkJLy8gUHJpdmF0ZSBmdW5jdGlvbnMNCg0KCQlmdW5jdGlvbiBtYXRjaE5hbWUobm9kZSwgZm9ybWF0KSB7DQoJCQkvLyBDaGVjayBmb3IgaW5saW5lIG1hdGNoDQoJCQlpZiAoaXNFcShub2RlLCBmb3JtYXQuaW5saW5lKSkNCgkJCQlyZXR1cm4gVFJVRTsNCg0KCQkJLy8gQ2hlY2sgZm9yIGJsb2NrIG1hdGNoDQoJCQlpZiAoaXNFcShub2RlLCBmb3JtYXQuYmxvY2spKQ0KCQkJCXJldHVybiBUUlVFOw0KDQoJCQkvLyBDaGVjayBmb3Igc2VsZWN0b3IgbWF0Y2gNCgkJCWlmIChmb3JtYXQuc2VsZWN0b3IpDQoJCQkJcmV0dXJuIGRvbS5pcyhub2RlLCBmb3JtYXQuc2VsZWN0b3IpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGlzRXEoc3RyMSwgc3RyMikgew0KCQkJc3RyMSA9IHN0cjEgfHwgJyc7DQoJCQlzdHIyID0gc3RyMiB8fCAnJzsNCg0KCQkJc3RyMSA9ICcnICsgKHN0cjEubm9kZU5hbWUgfHwgc3RyMSk7DQoJCQlzdHIyID0gJycgKyAoc3RyMi5ub2RlTmFtZSB8fCBzdHIyKTsNCg0KCQkJcmV0dXJuIHN0cjEudG9Mb3dlckNhc2UoKSA9PSBzdHIyLnRvTG93ZXJDYXNlKCk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZ2V0U3R5bGUobm9kZSwgbmFtZSkgew0KCQkJdmFyIHN0eWxlVmFsID0gZG9tLmdldFN0eWxlKG5vZGUsIG5hbWUpOw0KDQoJCQkvLyBGb3JjZSB0aGUgZm9ybWF0IHRvIGhleA0KCQkJaWYgKG5hbWUgPT0gJ2NvbG9yJyB8fCBuYW1lID09ICdiYWNrZ3JvdW5kQ29sb3InKQ0KCQkJCXN0eWxlVmFsID0gZG9tLnRvSGV4KHN0eWxlVmFsKTsNCg0KCQkJLy8gT3BlcmEgd2lsbCByZXR1cm4gYm9sZCBhcyA3MDANCgkJCWlmIChuYW1lID09ICdmb250V2VpZ2h0JyAmJiBzdHlsZVZhbCA9PSA3MDApDQoJCQkJc3R5bGVWYWwgPSAnYm9sZCc7DQoNCgkJCXJldHVybiAnJyArIHN0eWxlVmFsOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKSB7DQoJCQlpZiAodHlwZW9mKHZhbHVlKSAhPSAic3RyaW5nIikNCgkJCQl2YWx1ZSA9IHZhbHVlKHZhcnMpOw0KCQkJZWxzZSBpZiAodmFycykgew0KCQkJCXZhbHVlID0gdmFsdWUucmVwbGFjZSgvJShcdyspL2csIGZ1bmN0aW9uKHN0ciwgbmFtZSkgew0KCQkJCQlyZXR1cm4gdmFyc1tuYW1lXSB8fCBzdHI7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiB2YWx1ZTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBpc1doaXRlU3BhY2VOb2RlKG5vZGUpIHsNCgkJCXJldHVybiBub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IDMgJiYgL14oW1xzXHJcbl0rfCkkLy50ZXN0KG5vZGUubm9kZVZhbHVlKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiB3cmFwKG5vZGUsIG5hbWUsIGF0dHJzKSB7DQoJCQl2YXIgd3JhcHBlciA9IGRvbS5jcmVhdGUobmFtZSwgYXR0cnMpOw0KDQoJCQlub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIG5vZGUpOw0KCQkJd3JhcHBlci5hcHBlbmRDaGlsZChub2RlKTsNCg0KCQkJcmV0dXJuIHdyYXBwZXI7DQoJCX07DQoNCgkJZnVuY3Rpb24gZXhwYW5kUm5nKHJuZywgZm9ybWF0LCByZW1vdmUpIHsNCgkJCXZhciBzdGFydENvbnRhaW5lciA9IHJuZy5zdGFydENvbnRhaW5lciwNCgkJCQlzdGFydE9mZnNldCA9IHJuZy5zdGFydE9mZnNldCwNCgkJCQllbmRDb250YWluZXIgPSBybmcuZW5kQ29udGFpbmVyLA0KCQkJCWVuZE9mZnNldCA9IHJuZy5lbmRPZmZzZXQsIHNpYmxpbmcsIGxhc3RJZHg7DQoNCgkJCS8vIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdXAgdGhlIHRyZWUgaWYgdGhlcmUgaXMgbm8gc2libGluZ3MgYmVmb3JlL2FmdGVyIHRoZSBub2RlDQoJCQlmdW5jdGlvbiBmaW5kUGFyZW50Q29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGRfbmFtZSwgc2libGluZ19uYW1lLCByb290KSB7DQoJCQkJdmFyIHBhcmVudCwgY2hpbGQ7DQoNCgkJCQlyb290ID0gcm9vdCB8fCBkb20uZ2V0Um9vdCgpOw0KDQoJCQkJZm9yICg7Oykgew0KCQkJCQkvLyBDaGVjayBpZiB3ZSBjYW4gbW92ZSB1cCBhcmUgd2UgYXQgcm9vdCBsZXZlbCBvciBib2R5IGxldmVsDQoJCQkJCXBhcmVudCA9IGNvbnRhaW5lci5wYXJlbnROb2RlOw0KDQoJCQkJCS8vIFN0b3AgZXhwYW5kaW5nIG9uIGJsb2NrIGVsZW1lbnRzIG9yIHJvb3QgZGVwZW5kaW5nIG9uIGZvcm1hdA0KCQkJCQlpZiAocGFyZW50ID09IHJvb3QgfHwgKCFmb3JtYXRbMF0uYmxvY2tfZXhwYW5kICYmIGlzQmxvY2socGFyZW50KSkpDQoJCQkJCQlyZXR1cm4gY29udGFpbmVyOw0KDQoJCQkJCWZvciAoc2libGluZyA9IHBhcmVudFtjaGlsZF9uYW1lXTsgc2libGluZyAmJiBzaWJsaW5nICE9IGNvbnRhaW5lcjsgc2libGluZyA9IHNpYmxpbmdbc2libGluZ19uYW1lXSkgew0KCQkJCQkJaWYgKHNpYmxpbmcubm9kZVR5cGUgPT0gMSAmJiAhaXNCb29rbWFya05vZGUoc2libGluZykpDQoJCQkJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCg0KCQkJCQkJaWYgKHNpYmxpbmcubm9kZVR5cGUgPT0gMyAmJiAhaXNXaGl0ZVNwYWNlTm9kZShzaWJsaW5nKSkNCgkJCQkJCQlyZXR1cm4gY29udGFpbmVyOw0KCQkJCQl9DQoNCgkJCQkJY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCgkJCX07DQoNCgkJCS8vIElmIGluZGV4IGJhc2VkIHN0YXJ0IHBvc2l0aW9uIHRoZW4gcmVzb2x2ZSBpdA0KCQkJaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDEgJiYgc3RhcnRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKSB7DQoJCQkJbGFzdElkeCA9IHN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsNCgkJCQlzdGFydENvbnRhaW5lciA9IHN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbc3RhcnRPZmZzZXQgPiBsYXN0SWR4ID8gbGFzdElkeCA6IHN0YXJ0T2Zmc2V0XTsNCg0KCQkJCWlmIChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PSAzKQ0KCQkJCQlzdGFydE9mZnNldCA9IDA7DQoJCQl9DQoNCgkJCS8vIElmIGluZGV4IGJhc2VkIGVuZCBwb3NpdGlvbiB0aGVuIHJlc29sdmUgaXQNCgkJCWlmIChlbmRDb250YWluZXIubm9kZVR5cGUgPT0gMSAmJiBlbmRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKSB7DQoJCQkJbGFzdElkeCA9IGVuZENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCAtIDE7DQoJCQkJZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyLmNoaWxkTm9kZXNbZW5kT2Zmc2V0ID4gbGFzdElkeCA/IGxhc3RJZHggOiBlbmRPZmZzZXQgLSAxXTsNCg0KCQkJCWlmIChlbmRDb250YWluZXIubm9kZVR5cGUgPT0gMykNCgkJCQkJZW5kT2Zmc2V0ID0gZW5kQ29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGg7DQoJCQl9DQoNCgkJCS8vIEV4Y2x1ZGUgYm9va21hcmsgbm9kZXMgaWYgcG9zc2libGUNCgkJCWlmIChpc0Jvb2ttYXJrTm9kZShzdGFydENvbnRhaW5lci5wYXJlbnROb2RlKSkNCgkJCQlzdGFydENvbnRhaW5lciA9IHN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGU7DQoNCgkJCWlmIChpc0Jvb2ttYXJrTm9kZShzdGFydENvbnRhaW5lcikpDQoJCQkJc3RhcnRDb250YWluZXIgPSBzdGFydENvbnRhaW5lci5uZXh0U2libGluZyB8fCBzdGFydENvbnRhaW5lcjsNCg0KCQkJaWYgKGlzQm9va21hcmtOb2RlKGVuZENvbnRhaW5lci5wYXJlbnROb2RlKSkNCgkJCQllbmRDb250YWluZXIgPSBlbmRDb250YWluZXIucGFyZW50Tm9kZTsNCg0KCQkJaWYgKGlzQm9va21hcmtOb2RlKGVuZENvbnRhaW5lcikpDQoJCQkJZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyLnByZXZpb3VzU2libGluZyB8fCBlbmRDb250YWluZXI7DQoNCgkJCS8vIE1vdmUgc3RhcnQvZW5kIHBvaW50IHVwIHRoZSB0cmVlIGlmIHRoZSBsZWF2ZXMgYXJlIHNoYXJwIGFuZCBpZiB3ZSBhcmUgaW4gZGlmZmVyZW50IGNvbnRhaW5lcnMNCgkJCS8vIEV4YW1wbGUgKiBiZWNvbWVzICE6ICE8cD48Yj48aT4qdGV4dDwvaT48aT50ZXh0KjwvaT48L2I+PC9wPiENCgkJCS8vIFRoaXMgd2lsbCByZWR1Y2UgdGhlIG51bWJlciBvZiB3cmFwcGVyIGVsZW1lbnRzIHRoYXQgbmVlZHMgdG8gYmUgY3JlYXRlZA0KCQkJLy8gTW92ZSBzdGFydCBwb2ludCB1cCB0aGUgdHJlZQ0KCQkJaWYgKGZvcm1hdFswXS5pbmxpbmUgfHwgZm9ybWF0WzBdLmJsb2NrX2V4cGFuZCkgew0KCQkJCXN0YXJ0Q29udGFpbmVyID0gZmluZFBhcmVudENvbnRhaW5lcihzdGFydENvbnRhaW5lciwgJ2ZpcnN0Q2hpbGQnLCAnbmV4dFNpYmxpbmcnKTsNCgkJCQllbmRDb250YWluZXIgPSBmaW5kUGFyZW50Q29udGFpbmVyKGVuZENvbnRhaW5lciwgJ2xhc3RDaGlsZCcsICdwcmV2aW91c1NpYmxpbmcnKTsNCgkJCX0NCg0KCQkJLy8gRXhwYW5kIHN0YXJ0L2VuZCBjb250YWluZXIgdG8gbWF0Y2hpbmcgc2VsZWN0b3INCgkJCWlmIChmb3JtYXRbMF0uc2VsZWN0b3IgJiYgZm9ybWF0WzBdLmV4cGFuZCAhPT0gRkFMU0UgJiYgIWZvcm1hdFswXS5pbmxpbmUpIHsNCgkJCQlmdW5jdGlvbiBmaW5kU2VsZWN0b3JFbmRQb2ludChjb250YWluZXIsIHNpYmxpbmdfbmFtZSkgew0KCQkJCQl2YXIgcGFyZW50cywgaSwgeTsNCg0KCQkJCQlpZiAoY29udGFpbmVyLm5vZGVUeXBlID09IDMgJiYgY29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGggPT0gMCAmJiBjb250YWluZXJbc2libGluZ19uYW1lXSkNCgkJCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lcltzaWJsaW5nX25hbWVdOw0KDQoJCQkJCXBhcmVudHMgPSBnZXRQYXJlbnRzKGNvbnRhaW5lcik7DQoJCQkJCWZvciAoaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7DQoJCQkJCQlmb3IgKHkgPSAwOyB5IDwgZm9ybWF0Lmxlbmd0aDsgeSsrKSB7DQoJCQkJCQkJaWYgKGRvbS5pcyhwYXJlbnRzW2ldLCBmb3JtYXRbeV0uc2VsZWN0b3IpKQ0KCQkJCQkJCQlyZXR1cm4gcGFyZW50c1tpXTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCXJldHVybiBjb250YWluZXI7DQoJCQkJfTsNCg0KCQkJCS8vIEZpbmQgbmV3IHN0YXJ0Q29udGFpbmVyL2VuZENvbnRhaW5lciBpZiB0aGVyZSBpcyBiZXR0ZXIgb25lDQoJCQkJc3RhcnRDb250YWluZXIgPSBmaW5kU2VsZWN0b3JFbmRQb2ludChzdGFydENvbnRhaW5lciwgJ3ByZXZpb3VzU2libGluZycpOw0KCQkJCWVuZENvbnRhaW5lciA9IGZpbmRTZWxlY3RvckVuZFBvaW50KGVuZENvbnRhaW5lciwgJ25leHRTaWJsaW5nJyk7DQoJCQl9DQoNCgkJCS8vIEV4cGFuZCBzdGFydC9lbmQgY29udGFpbmVyIHRvIG1hdGNoaW5nIGJsb2NrIGVsZW1lbnQgb3IgdGV4dCBub2RlDQoJCQlpZiAoZm9ybWF0WzBdLmJsb2NrIHx8IGZvcm1hdFswXS5zZWxlY3Rvcikgew0KCQkJCWZ1bmN0aW9uIGZpbmRCbG9ja0VuZFBvaW50KGNvbnRhaW5lciwgc2libGluZ19uYW1lLCBzaWJsaW5nX25hbWUyKSB7DQoJCQkJCXZhciBub2RlOw0KDQoJCQkJCS8vIEV4cGFuZCB0byBibG9jayBvZiBzaW1pbGFyIHR5cGUNCgkJCQkJaWYgKCFmb3JtYXRbMF0ud3JhcHBlcikNCgkJCQkJCW5vZGUgPSBkb20uZ2V0UGFyZW50KGNvbnRhaW5lciwgZm9ybWF0WzBdLmJsb2NrKTsNCg0KCQkJCQkvLyBFeHBhbmQgdG8gZmlyc3Qgd3JhcHBhYmxlIGJsb2NrIGVsZW1lbnQgb3IgYW55IGJsb2NrIGVsZW1lbnQNCgkJCQkJaWYgKCFub2RlKQ0KCQkJCQkJbm9kZSA9IGRvbS5nZXRQYXJlbnQoY29udGFpbmVyLm5vZGVUeXBlID09IDMgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lciwgaXNCbG9jayk7DQoNCgkJCQkJLy8gRXhjbHVkZSBpbm5lciBsaXN0cyBmcm9tIHdyYXBwaW5nDQoJCQkJCWlmIChub2RlICYmIGZvcm1hdFswXS53cmFwcGVyKQ0KCQkJCQkJbm9kZSA9IGdldFBhcmVudHMobm9kZSwgJ3VsLG9sJykucmV2ZXJzZSgpWzBdIHx8IG5vZGU7DQoNCgkJCQkJLy8gRGlkbid0IGZpbmQgYSBibG9jayBlbGVtZW50IGxvb2sgZm9yIGZpcnN0L2xhc3Qgd3JhcHBhYmxlIGVsZW1lbnQNCgkJCQkJaWYgKCFub2RlKSB7DQoJCQkJCQlub2RlID0gY29udGFpbmVyOw0KDQoJCQkJCQl3aGlsZSAobm9kZVtzaWJsaW5nX25hbWVdICYmICFpc0Jsb2NrKG5vZGVbc2libGluZ19uYW1lXSkpIHsNCgkJCQkJCQlub2RlID0gbm9kZVtzaWJsaW5nX25hbWVdOw0KDQoJCQkJCQkJLy8gQnJlYWsgb24gQlIgYnV0IGluY2x1ZGUgaXQgd2lsbCBiZSByZW1vdmVkIGxhdGVyIG9uDQoJCQkJCQkJLy8gd2UgY2FuJ3QgcmVtb3ZlIGl0IG5vdyBzaW5jZSB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0IGNhbiBiZSB3cmFwcGVkDQoJCQkJCQkJaWYgKGlzRXEobm9kZSwgJ2JyJykpDQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJcmV0dXJuIG5vZGUgfHwgY29udGFpbmVyOw0KCQkJCX07DQoNCgkJCQkvLyBGaW5kIG5ldyBzdGFydENvbnRhaW5lci9lbmRDb250YWluZXIgaWYgdGhlcmUgaXMgYmV0dGVyIG9uZQ0KCQkJCXN0YXJ0Q29udGFpbmVyID0gZmluZEJsb2NrRW5kUG9pbnQoc3RhcnRDb250YWluZXIsICdwcmV2aW91c1NpYmxpbmcnKTsNCgkJCQllbmRDb250YWluZXIgPSBmaW5kQmxvY2tFbmRQb2ludChlbmRDb250YWluZXIsICduZXh0U2libGluZycpOw0KDQoJCQkJLy8gTm9uIGJsb2NrIGVsZW1lbnQgdGhlbiB0cnkgdG8gZXhwYW5kIHVwIHRoZSBsZWFmDQoJCQkJaWYgKGZvcm1hdFswXS5ibG9jaykgew0KCQkJCQlpZiAoIWlzQmxvY2soc3RhcnRDb250YWluZXIpKQ0KCQkJCQkJc3RhcnRDb250YWluZXIgPSBmaW5kUGFyZW50Q29udGFpbmVyKHN0YXJ0Q29udGFpbmVyLCAnZmlyc3RDaGlsZCcsICduZXh0U2libGluZycpOw0KDQoJCQkJCWlmICghaXNCbG9jayhlbmRDb250YWluZXIpKQ0KCQkJCQkJZW5kQ29udGFpbmVyID0gZmluZFBhcmVudENvbnRhaW5lcihlbmRDb250YWluZXIsICdsYXN0Q2hpbGQnLCAncHJldmlvdXNTaWJsaW5nJyk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBTZXR1cCBpbmRleCBmb3Igc3RhcnRDb250YWluZXINCgkJCWlmIChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJc3RhcnRPZmZzZXQgPSBub2RlSW5kZXgoc3RhcnRDb250YWluZXIpOw0KCQkJCXN0YXJ0Q29udGFpbmVyID0gc3RhcnRDb250YWluZXIucGFyZW50Tm9kZTsNCgkJCX0NCg0KCQkJLy8gU2V0dXAgaW5kZXggZm9yIGVuZENvbnRhaW5lcg0KCQkJaWYgKGVuZENvbnRhaW5lci5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJZW5kT2Zmc2V0ID0gbm9kZUluZGV4KGVuZENvbnRhaW5lcikgKyAxOw0KCQkJCWVuZENvbnRhaW5lciA9IGVuZENvbnRhaW5lci5wYXJlbnROb2RlOw0KCQkJfQ0KDQoJCQkvLyBSZXR1cm4gbmV3IHJhbmdlIGxpa2Ugb2JqZWN0DQoJCQlyZXR1cm4gew0KCQkJCXN0YXJ0Q29udGFpbmVyIDogc3RhcnRDb250YWluZXIsDQoJCQkJc3RhcnRPZmZzZXQgOiBzdGFydE9mZnNldCwNCgkJCQllbmRDb250YWluZXIgOiBlbmRDb250YWluZXIsDQoJCQkJZW5kT2Zmc2V0IDogZW5kT2Zmc2V0DQoJCQl9Ow0KCQl9DQoNCgkJZnVuY3Rpb24gcmVtb3ZlRm9ybWF0KGZvcm1hdCwgdmFycywgbm9kZSwgY29tcGFyZV9ub2RlKSB7DQoJCQl2YXIgaSwgYXR0cnMsIHN0eWxlc01vZGlmaWVkOw0KDQoJCQkvLyBDaGVjayBpZiBub2RlIG1hdGNoZXMgZm9ybWF0DQoJCQlpZiAoIW1hdGNoTmFtZShub2RlLCBmb3JtYXQpKQ0KCQkJCXJldHVybiBGQUxTRTsNCg0KCQkJLy8gU2hvdWxkIHdlIGNvbXBhcmUgd2l0aCBmb3JtYXQgYXR0cmlicyBhbmQgc3R5bGVzDQoJCQlpZiAoZm9ybWF0LnJlbW92ZSAhPSAnYWxsJykgew0KCQkJCS8vIFJlbW92ZSBzdHlsZXMNCgkJCQllYWNoKGZvcm1hdC5zdHlsZXMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7DQoJCQkJCXZhbHVlID0gcmVwbGFjZVZhcnModmFsdWUsIHZhcnMpOw0KDQoJCQkJCS8vIEluZGV4ZWQgYXJyYXkNCgkJCQkJaWYgKHR5cGVvZihuYW1lKSA9PT0gJ251bWJlcicpIHsNCgkJCQkJCW5hbWUgPSB2YWx1ZTsNCgkJCQkJCWNvbXBhcmVfbm9kZSA9IDA7DQoJCQkJCX0NCg0KCQkJCQlpZiAoIWNvbXBhcmVfbm9kZSB8fCBpc0VxKGdldFN0eWxlKGNvbXBhcmVfbm9kZSwgbmFtZSksIHZhbHVlKSkNCgkJCQkJCWRvbS5zZXRTdHlsZShub2RlLCBuYW1lLCAnJyk7DQoNCgkJCQkJc3R5bGVzTW9kaWZpZWQgPSAxOw0KCQkJCX0pOw0KDQoJCQkJLy8gUmVtb3ZlIHN0eWxlIGF0dHJpYnV0ZSBpZiBpdCdzIGVtcHR5DQoJCQkJaWYgKHN0eWxlc01vZGlmaWVkICYmIGRvbS5nZXRBdHRyaWIobm9kZSwgJ3N0eWxlJykgPT0gJycpIHsNCgkJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7DQoJCQkJCW5vZGUucmVtb3ZlQXR0cmlidXRlKCdfbWNlX3N0eWxlJyk7DQoJCQkJfQ0KDQoJCQkJLy8gUmVtb3ZlIGF0dHJpYnV0ZXMNCgkJCQllYWNoKGZvcm1hdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkgew0KCQkJCQl2YXIgdmFsdWVPdXQ7DQoNCgkJCQkJdmFsdWUgPSByZXBsYWNlVmFycyh2YWx1ZSwgdmFycyk7DQoNCgkJCQkJLy8gSW5kZXhlZCBhcnJheQ0KCQkJCQlpZiAodHlwZW9mKG5hbWUpID09PSAnbnVtYmVyJykgew0KCQkJCQkJbmFtZSA9IHZhbHVlOw0KCQkJCQkJY29tcGFyZV9ub2RlID0gMDsNCgkJCQkJfQ0KDQoJCQkJCWlmICghY29tcGFyZV9ub2RlIHx8IGlzRXEoZG9tLmdldEF0dHJpYihjb21wYXJlX25vZGUsIG5hbWUpLCB2YWx1ZSkpIHsNCgkJCQkJCS8vIEtlZXAgaW50ZXJuYWwgY2xhc3Nlcw0KCQkJCQkJaWYgKG5hbWUgPT0gJ2NsYXNzJykgew0KCQkJCQkJCXZhbHVlID0gZG9tLmdldEF0dHJpYihub2RlLCBuYW1lKTsNCgkJCQkJCQlpZiAodmFsdWUpIHsNCgkJCQkJCQkJLy8gQnVpbGQgbmV3IGNsYXNzIHZhbHVlIHdoZXJlIGV2ZXJ5dGhpbmcgaXMgcmVtb3ZlZCBleGNlcHQgdGhlIGludGVybmFsIHByZWZpeGVkIGNsYXNzZXMNCgkJCQkJCQkJdmFsdWVPdXQgPSAnJzsNCgkJCQkJCQkJZWFjaCh2YWx1ZS5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGNscykgew0KCQkJCQkJCQkJaWYgKC9tY2VcdysvLnRlc3QoY2xzKSkNCgkJCQkJCQkJCQl2YWx1ZU91dCArPSAodmFsdWVPdXQgPyAnICcgOiAnJykgKyBjbHM7DQoJCQkJCQkJCX0pOw0KDQoJCQkJCQkJCS8vIFdlIGdvdCBzb21lIGludGVybmFsIGNsYXNzZXMgbGVmdA0KCQkJCQkJCQlpZiAodmFsdWVPdXQpIHsNCgkJCQkJCQkJCWRvbS5zZXRBdHRyaWIobm9kZSwgbmFtZSwgdmFsdWVPdXQpOw0KCQkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBJRTYgaGFzIGEgYnVnIHdoZXJlIHRoZSBhdHRyaWJ1dGUgZG9lc24ndCBnZXQgcmVtb3ZlZCBjb3JyZWN0bHkNCgkJCQkJCWlmIChuYW1lID09ICJjbGFzcyIpDQoJCQkJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzTmFtZScpOw0KDQoJCQkJCQkvLyBSZW1vdmUgbWNlIHByZWZpeGVkIGF0dHJpYnV0ZXMNCgkJCQkJCWlmIChNQ0VfQVRUUl9SRS50ZXN0KG5hbWUpKQ0KCQkJCQkJCW5vZGUucmVtb3ZlQXR0cmlidXRlKCdfbWNlXycgKyBuYW1lKTsNCg0KCQkJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCS8vIFJlbW92ZSBjbGFzc2VzDQoJCQkJZWFjaChmb3JtYXQuY2xhc3NlcywgZnVuY3Rpb24odmFsdWUpIHsNCgkJCQkJdmFsdWUgPSByZXBsYWNlVmFycyh2YWx1ZSwgdmFycyk7DQoNCgkJCQkJaWYgKCFjb21wYXJlX25vZGUgfHwgZG9tLmhhc0NsYXNzKGNvbXBhcmVfbm9kZSwgdmFsdWUpKQ0KCQkJCQkJZG9tLnJlbW92ZUNsYXNzKG5vZGUsIHZhbHVlKTsNCgkJCQl9KTsNCg0KCQkJCS8vIENoZWNrIGZvciBub24gaW50ZXJuYWwgYXR0cmlidXRlcw0KCQkJCWF0dHJzID0gZG9tLmdldEF0dHJpYnMobm9kZSk7DQoJCQkJZm9yIChpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7DQoJCQkJCWlmIChhdHRyc1tpXS5ub2RlTmFtZS5pbmRleE9mKCdfJykgIT09IDApDQoJCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBSZW1vdmUgdGhlIGlubGluZSBjaGlsZCBpZiBpdCdzIGVtcHR5IGZvciBleGFtcGxlIDxiPiBvciA8c3Bhbj4NCgkJCWlmIChmb3JtYXQucmVtb3ZlICE9ICdub25lJykgew0KCQkJCXJlbW92ZU5vZGUobm9kZSwgZm9ybWF0KTsNCgkJCQlyZXR1cm4gVFJVRTsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUsIGZvcm1hdCkgew0KCQkJdmFyIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGUsIHJvb3RCbG9ja0VsbTsNCg0KCQkJaWYgKGZvcm1hdC5ibG9jaykgew0KCQkJCWlmICghZm9yY2VkUm9vdEJsb2NrKSB7DQoJCQkJCWZ1bmN0aW9uIGZpbmQobm9kZSwgbmV4dCwgaW5jKSB7DQoJCQkJCQlub2RlID0gZ2V0Tm9uV2hpdGVTcGFjZVNpYmxpbmcobm9kZSwgbmV4dCwgaW5jKTsNCg0KCQkJCQkJcmV0dXJuICFub2RlIHx8IChub2RlLm5vZGVOYW1lID09ICdCUicgfHwgaXNCbG9jayhub2RlKSk7DQoJCQkJCX07DQoNCgkJCQkJLy8gQXBwZW5kIEJSIGVsZW1lbnRzIGlmIG5lZWRlZCBiZWZvcmUgd2UgcmVtb3ZlIHRoZSBibG9jaw0KCQkJCQlpZiAoaXNCbG9jayhub2RlKSAmJiAhaXNCbG9jayhwYXJlbnROb2RlKSkgew0KCQkJCQkJaWYgKCFmaW5kKG5vZGUsIEZBTFNFKSAmJiAhZmluZChub2RlLmZpcnN0Q2hpbGQsIFRSVUUsIDEpKQ0KCQkJCQkJCW5vZGUuaW5zZXJ0QmVmb3JlKGRvbS5jcmVhdGUoJ2JyJyksIG5vZGUuZmlyc3RDaGlsZCk7DQoNCgkJCQkJCWlmICghZmluZChub2RlLCBUUlVFKSAmJiAhZmluZChub2RlLmxhc3RDaGlsZCwgRkFMU0UsIDEpKQ0KCQkJCQkJCW5vZGUuYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZSgnYnInKSk7DQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBXcmFwIHRoZSBibG9jayBpbiBhIGZvcmNlZFJvb3RCbG9jayBpZiB3ZSBhcmUgYXQgdGhlIHJvb3Qgb2YgZG9jdW1lbnQNCgkJCQkJaWYgKHBhcmVudE5vZGUgPT0gZG9tLmdldFJvb3QoKSkgew0KCQkJCQkJaWYgKCFmb3JtYXQubGlzdF9ibG9jayB8fCAhaXNFcShub2RlLCBmb3JtYXQubGlzdF9ibG9jaykpIHsNCgkJCQkJCQllYWNoKHRpbnltY2UuZ3JlcChub2RlLmNoaWxkTm9kZXMpLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCQkJCWlmIChpc1ZhbGlkKGZvcmNlZFJvb3RCbG9jaywgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkgew0KCQkJCQkJCQkJaWYgKCFyb290QmxvY2tFbG0pDQoJCQkJCQkJCQkJcm9vdEJsb2NrRWxtID0gd3JhcChub2RlLCBmb3JjZWRSb290QmxvY2spOw0KCQkJCQkJCQkJZWxzZQ0KCQkJCQkJCQkJCXJvb3RCbG9ja0VsbS5hcHBlbmRDaGlsZChub2RlKTsNCgkJCQkJCQkJfSBlbHNlDQoJCQkJCQkJCQlyb290QmxvY2tFbG0gPSAwOw0KCQkJCQkJCX0pOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBOZXZlciByZW1vdmUgbm9kZXMgdGhhdCBpc24ndCB0aGUgc3BlY2lmaWVkIGlubGluZSBlbGVtZW50IGlmIGEgc2VsZWN0b3IgaXMgc3BlY2lmaWVkIHRvbw0KCQkJaWYgKGZvcm1hdC5zZWxlY3RvciAmJiBmb3JtYXQuaW5saW5lICYmICFpc0VxKGZvcm1hdC5pbmxpbmUsIG5vZGUpKQ0KCQkJCXJldHVybjsNCg0KCQkJZG9tLnJlbW92ZShub2RlLCAxKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBnZXROb25XaGl0ZVNwYWNlU2libGluZyhub2RlLCBuZXh0LCBpbmMpIHsNCgkJCWlmIChub2RlKSB7DQoJCQkJbmV4dCA9IG5leHQgPyAnbmV4dFNpYmxpbmcnIDogJ3ByZXZpb3VzU2libGluZyc7DQoNCgkJCQlmb3IgKG5vZGUgPSBpbmMgPyBub2RlIDogbm9kZVtuZXh0XTsgbm9kZTsgbm9kZSA9IG5vZGVbbmV4dF0pIHsNCgkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMSB8fCAhaXNXaGl0ZVNwYWNlTm9kZShub2RlKSkNCgkJCQkJCXJldHVybiBub2RlOw0KCQkJCX0NCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBpc0Jvb2ttYXJrTm9kZShub2RlKSB7DQoJCQlyZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoJ19tY2VfdHlwZScpID09ICdib29rbWFyayc7DQoJCX07DQoNCgkJZnVuY3Rpb24gbWVyZ2VTaWJsaW5ncyhwcmV2LCBuZXh0KSB7DQoJCQl2YXIgbWFya2VyLCBzaWJsaW5nLCB0bXBTaWJsaW5nOw0KDQoJCQlmdW5jdGlvbiBjb21wYXJlRWxlbWVudHMobm9kZTEsIG5vZGUyKSB7DQoJCQkJLy8gTm90IHRoZSBzYW1lIG5hbWUNCgkJCQlpZiAobm9kZTEubm9kZU5hbWUgIT0gbm9kZTIubm9kZU5hbWUpDQoJCQkJCXJldHVybiBGQUxTRTsNCg0KCQkJCWZ1bmN0aW9uIGdldEF0dHJpYnMobm9kZSkgew0KCQkJCQl2YXIgYXR0cmlicyA9IHt9Ow0KDQoJCQkJCWVhY2goZG9tLmdldEF0dHJpYnMobm9kZSksIGZ1bmN0aW9uKGF0dHIpIHsNCgkJCQkJCXZhciBuYW1lID0gYXR0ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KDQoJCQkJCQkvLyBEb24ndCBjb21wYXJlIGludGVybmFsIGF0dHJpYnV0ZXMgb3Igc3R5bGUNCgkJCQkJCWlmIChuYW1lLmluZGV4T2YoJ18nKSAhPT0gMCAmJiBuYW1lICE9PSAnc3R5bGUnKQ0KCQkJCQkJCWF0dHJpYnNbbmFtZV0gPSBkb20uZ2V0QXR0cmliKG5vZGUsIG5hbWUpOw0KCQkJCQl9KTsNCg0KCQkJCQlyZXR1cm4gYXR0cmliczsNCgkJCQl9Ow0KDQoJCQkJZnVuY3Rpb24gY29tcGFyZU9iamVjdHMob2JqMSwgb2JqMikgew0KCQkJCQl2YXIgdmFsdWUsIG5hbWU7DQoNCgkJCQkJZm9yIChuYW1lIGluIG9iajEpIHsNCgkJCQkJCS8vIE9iajEgaGFzIGl0ZW0gb2JqMiBkb2Vzbid0IGhhdmUNCgkJCQkJCWlmIChvYmoxLmhhc093blByb3BlcnR5KG5hbWUpKSB7DQoJCQkJCQkJdmFsdWUgPSBvYmoyW25hbWVdOw0KDQoJCQkJCQkJLy8gT2JqMiBkb2Vzbid0IGhhdmUgb2JqMSBpdGVtDQoJCQkJCQkJaWYgKHZhbHVlID09PSB1bmRlZmluZWQpDQoJCQkJCQkJCXJldHVybiBGQUxTRTsNCg0KCQkJCQkJCS8vIE9iajIgaXRlbSBoYXMgYSBkaWZmZXJlbnQgdmFsdWUNCgkJCQkJCQlpZiAob2JqMVtuYW1lXSAhPSB2YWx1ZSkNCgkJCQkJCQkJcmV0dXJuIEZBTFNFOw0KDQoJCQkJCQkJLy8gRGVsZXRlIHNpbWlsYXIgdmFsdWUNCgkJCQkJCQlkZWxldGUgb2JqMltuYW1lXTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIENoZWNrIGlmIG9iaiAyIGhhcyBzb21ldGhpbmcgb2JqIDEgZG9lc24ndCBoYXZlDQoJCQkJCWZvciAobmFtZSBpbiBvYmoyKSB7DQoJCQkJCQkvLyBPYmoyIGhhcyBpdGVtIG9iajEgZG9lc24ndCBoYXZlDQoJCQkJCQlpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkNCgkJCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJCX0NCg0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9Ow0KDQoJCQkJLy8gQXR0cmlicyBhcmUgbm90IHRoZSBzYW1lDQoJCQkJaWYgKCFjb21wYXJlT2JqZWN0cyhnZXRBdHRyaWJzKG5vZGUxKSwgZ2V0QXR0cmlicyhub2RlMikpKQ0KCQkJCQlyZXR1cm4gRkFMU0U7DQoNCgkJCQkvLyBTdHlsZXMgYXJlIG5vdCB0aGUgc2FtZQ0KCQkJCWlmICghY29tcGFyZU9iamVjdHMoZG9tLnBhcnNlU3R5bGUoZG9tLmdldEF0dHJpYihub2RlMSwgJ3N0eWxlJykpLCBkb20ucGFyc2VTdHlsZShkb20uZ2V0QXR0cmliKG5vZGUyLCAnc3R5bGUnKSkpKQ0KCQkJCQlyZXR1cm4gRkFMU0U7DQoNCgkJCQlyZXR1cm4gVFJVRTsNCgkJCX07DQoNCgkJCS8vIENoZWNrIGlmIG5leHQvcHJldiBleGlzdHMgYW5kIHRoYXQgdGhleSBhcmUgZWxlbWVudHMNCgkJCWlmIChwcmV2ICYmIG5leHQpIHsNCgkJCQlmdW5jdGlvbiBmaW5kRWxlbWVudFNpYmxpbmcobm9kZSwgc2libGluZ19uYW1lKSB7DQoJCQkJCWZvciAoc2libGluZyA9IG5vZGU7IHNpYmxpbmc7IHNpYmxpbmcgPSBzaWJsaW5nW3NpYmxpbmdfbmFtZV0pIHsNCgkJCQkJCWlmIChzaWJsaW5nLm5vZGVUeXBlID09IDMgJiYgIWlzV2hpdGVTcGFjZU5vZGUoc2libGluZykpDQoJCQkJCQkJcmV0dXJuIG5vZGU7DQoNCgkJCQkJCWlmIChzaWJsaW5nLm5vZGVUeXBlID09IDEgJiYgIWlzQm9va21hcmtOb2RlKHNpYmxpbmcpKQ0KCQkJCQkJCXJldHVybiBzaWJsaW5nOw0KCQkJCQl9DQoNCgkJCQkJcmV0dXJuIG5vZGU7DQoJCQkJfTsNCg0KCQkJCS8vIElmIHByZXZpb3VzIHNpYmxpbmcgaXMgZW1wdHkgdGhlbiBqdW1wIG92ZXIgaXQNCgkJCQlwcmV2ID0gZmluZEVsZW1lbnRTaWJsaW5nKHByZXYsICdwcmV2aW91c1NpYmxpbmcnKTsNCgkJCQluZXh0ID0gZmluZEVsZW1lbnRTaWJsaW5nKG5leHQsICduZXh0U2libGluZycpOw0KDQoJCQkJLy8gQ29tcGFyZSBuZXh0IGFuZCBwcmV2aW91cyBub2Rlcw0KCQkJCWlmIChjb21wYXJlRWxlbWVudHMocHJldiwgbmV4dCkpIHsNCgkJCQkJLy8gQXBwZW5kIG5vZGVzIGJldHdlZW4NCgkJCQkJZm9yIChzaWJsaW5nID0gcHJldi5uZXh0U2libGluZzsgc2libGluZyAmJiBzaWJsaW5nICE9IG5leHQ7KSB7DQoJCQkJCQl0bXBTaWJsaW5nID0gc2libGluZzsNCgkJCQkJCXNpYmxpbmcgPSBzaWJsaW5nLm5leHRTaWJsaW5nOw0KCQkJCQkJcHJldi5hcHBlbmRDaGlsZCh0bXBTaWJsaW5nKTsNCgkJCQkJfQ0KDQoJCQkJCS8vIFJlbW92ZSBuZXh0IG5vZGUNCgkJCQkJZG9tLnJlbW92ZShuZXh0KTsNCg0KCQkJCQkvLyBNb3ZlIGNoaWxkcmVuIGludG8gcHJldiBub2RlDQoJCQkJCWVhY2godGlueW1jZS5ncmVwKG5leHQuY2hpbGROb2RlcyksIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCXByZXYuYXBwZW5kQ2hpbGQobm9kZSk7DQoJCQkJCX0pOw0KDQoJCQkJCXJldHVybiBwcmV2Ow0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIG5leHQ7DQoJCX07DQoNCgkJZnVuY3Rpb24gaXNUZXh0QmxvY2sobmFtZSkgew0KCQkJcmV0dXJuIC9eKGhbMS02XXxwfGRpdnxwcmV8YWRkcmVzc3xkbHxkdHxkZCkkLy50ZXN0KG5hbWUpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGdldENvbnRhaW5lcihybmcsIHN0YXJ0KSB7DQoJCQl2YXIgY29udGFpbmVyLCBvZmZzZXQsIGxhc3RJZHg7DQoNCgkJCWNvbnRhaW5lciA9IHJuZ1tzdGFydCA/ICdzdGFydENvbnRhaW5lcicgOiAnZW5kQ29udGFpbmVyJ107DQoJCQlvZmZzZXQgPSBybmdbc3RhcnQgPyAnc3RhcnRPZmZzZXQnIDogJ2VuZE9mZnNldCddOw0KDQoJCQlpZiAoY29udGFpbmVyLm5vZGVUeXBlID09IDEpIHsNCgkJCQlsYXN0SWR4ID0gY29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsNCg0KCQkJCWlmICghc3RhcnQgJiYgb2Zmc2V0KQ0KCQkJCQlvZmZzZXQtLTsNCg0KCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5jaGlsZE5vZGVzW29mZnNldCA+IGxhc3RJZHggPyBsYXN0SWR4IDogb2Zmc2V0XTsNCgkJCX0NCg0KCQkJcmV0dXJuIGNvbnRhaW5lcjsNCgkJfTsNCg0KCQlmdW5jdGlvbiBwZXJmb3JtQ2FyZXRBY3Rpb24odHlwZSwgbmFtZSwgdmFycykgew0KCQkJdmFyIGksIGN1cnJlbnRQZW5kaW5nRm9ybWF0cyA9IHBlbmRpbmdGb3JtYXRzW3R5cGVdLA0KCQkJCW90aGVyUGVuZGluZ0Zvcm1hdHMgPSBwZW5kaW5nRm9ybWF0c1t0eXBlID09ICdhcHBseScgPyAncmVtb3ZlJyA6ICdhcHBseSddOw0KDQoJCQlmdW5jdGlvbiBoYXNQZW5kaW5nKCkgew0KCQkJCXJldHVybiBwZW5kaW5nRm9ybWF0cy5hcHBseS5sZW5ndGggfHwgcGVuZGluZ0Zvcm1hdHMucmVtb3ZlLmxlbmd0aDsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHJlc2V0UGVuZGluZygpIHsNCgkJCQlwZW5kaW5nRm9ybWF0cy5hcHBseSA9IFtdOw0KCQkJCXBlbmRpbmdGb3JtYXRzLnJlbW92ZSA9IFtdOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gcGVyZm9ybShjYXJldF9ub2RlKSB7DQoJCQkJLy8gQXBwbHkgcGVuZGluZyBmb3JtYXRzDQoJCQkJZWFjaChwZW5kaW5nRm9ybWF0cy5hcHBseS5yZXZlcnNlKCksIGZ1bmN0aW9uKGl0ZW0pIHsNCgkJCQkJYXBwbHkoaXRlbS5uYW1lLCBpdGVtLnZhcnMsIGNhcmV0X25vZGUpOw0KCQkJCX0pOw0KDQoJCQkJLy8gUmVtb3ZlIHBlbmRpbmcgZm9ybWF0cw0KCQkJCWVhY2gocGVuZGluZ0Zvcm1hdHMucmVtb3ZlLnJldmVyc2UoKSwgZnVuY3Rpb24oaXRlbSkgew0KCQkJCQlyZW1vdmUoaXRlbS5uYW1lLCBpdGVtLnZhcnMsIGNhcmV0X25vZGUpOw0KCQkJCX0pOw0KDQoJCQkJZG9tLnJlbW92ZShjYXJldF9ub2RlLCAxKTsNCgkJCQlyZXNldFBlbmRpbmcoKTsNCgkJCX07DQoNCgkJCS8vIENoZWNrIGlmIGl0IGFscmVhZHkgZXhpc3RzIHRoZW4gaWdub3JlIGl0DQoJCQlmb3IgKGkgPSBjdXJyZW50UGVuZGluZ0Zvcm1hdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQlpZiAoY3VycmVudFBlbmRpbmdGb3JtYXRzW2ldLm5hbWUgPT0gbmFtZSkNCgkJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQljdXJyZW50UGVuZGluZ0Zvcm1hdHMucHVzaCh7bmFtZSA6IG5hbWUsIHZhcnMgOiB2YXJzfSk7DQoNCgkJCS8vIENoZWNrIGlmIGl0J3MgaW4gdGhlIG90aGVyIHR5cGUsIHRoZW4gcmVtb3ZlIGl0DQoJCQlmb3IgKGkgPSBvdGhlclBlbmRpbmdGb3JtYXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJaWYgKG90aGVyUGVuZGluZ0Zvcm1hdHNbaV0ubmFtZSA9PSBuYW1lKQ0KCQkJCQlvdGhlclBlbmRpbmdGb3JtYXRzLnNwbGljZShpLCAxKTsNCgkJCX0NCg0KCQkJLy8gUGVuZGluZyBhcHBseSBvciByZW1vdmUgZm9ybWF0cw0KCQkJaWYgKGhhc1BlbmRpbmcoKSkgew0KCQkJCWVkLmdldERvYygpLmV4ZWNDb21tYW5kKCdGb250TmFtZScsIGZhbHNlLCAnbWNlaW5saW5lJyk7DQoJCQkJcGVuZGluZ0Zvcm1hdHMubGFzdFJuZyA9IHNlbGVjdGlvbi5nZXRSbmcoKTsNCg0KCQkJCS8vIElFIHdpbGwgY29udmVydCB0aGUgY3VycmVudCB3b3JkDQoJCQkJZWFjaChkb20uc2VsZWN0KCdmb250LHNwYW4nKSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQl2YXIgYm9va21hcms7DQoNCgkJCQkJaWYgKGlzQ2FyZXROb2RlKG5vZGUpKSB7DQoJCQkJCQlib29rbWFyayA9IHNlbGVjdGlvbi5nZXRCb29rbWFyaygpOw0KCQkJCQkJcGVyZm9ybShub2RlKTsNCgkJCQkJCXNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhib29rbWFyayk7DQoJCQkJCQllZC5ub2RlQ2hhbmdlZCgpOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQkvLyBPbmx5IHJlZ2lzdGVyIGxpc3RlbmVycyBvbmNlIGlmIHdlIG5lZWQgdG8NCgkJCQlpZiAoIXBlbmRpbmdGb3JtYXRzLmlzTGlzdGVuaW5nICYmIGhhc1BlbmRpbmcoKSkgew0KCQkJCQlwZW5kaW5nRm9ybWF0cy5pc0xpc3RlbmluZyA9IHRydWU7DQoNCgkJCQkJZWFjaCgnb25LZXlEb3duLG9uS2V5VXAsb25LZXlQcmVzcyxvbk1vdXNlVXAnLnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV2ZW50KSB7DQoJCQkJCQllZFtldmVudF0uYWRkVG9Ub3AoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJCQkvLyBEbyB3ZSBoYXZlIHBlbmRpbmcgZm9ybWF0cyBhbmQgaXMgdGhlIHNlbGVjdGlvbiBtb3ZlZCBoYXMgbW92ZWQNCgkJCQkJCQlpZiAoaGFzUGVuZGluZygpICYmICF0aW55bWNlLmRvbS5SYW5nZVV0aWxzLmNvbXBhcmVSYW5nZXMocGVuZGluZ0Zvcm1hdHMubGFzdFJuZywgc2VsZWN0aW9uLmdldFJuZygpKSkgew0KCQkJCQkJCQllYWNoKGRvbS5zZWxlY3QoJ2ZvbnQsc3BhbicpLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCQkJCQl2YXIgdGV4dE5vZGUsIHJuZzsNCg0KCQkJCQkJCQkJLy8gTG9vayBmb3IgbWFya2VyDQoJCQkJCQkJCQlpZiAoaXNDYXJldE5vZGUobm9kZSkpIHsNCgkJCQkJCQkJCQl0ZXh0Tm9kZSA9IG5vZGUuZmlyc3RDaGlsZDsNCg0KCQkJCQkJCQkJCWlmICh0ZXh0Tm9kZSkgew0KCQkJCQkJCQkJCQlwZXJmb3JtKG5vZGUpOw0KDQoJCQkJCQkJCQkJCXJuZyA9IGRvbS5jcmVhdGVSbmcoKTsNCgkJCQkJCQkJCQkJcm5nLnNldFN0YXJ0KHRleHROb2RlLCB0ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoKTsNCgkJCQkJCQkJCQkJcm5nLnNldEVuZCh0ZXh0Tm9kZSwgdGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aCk7DQoJCQkJCQkJCQkJCXNlbGVjdGlvbi5zZXRSbmcocm5nKTsNCgkJCQkJCQkJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCQkJCQkJCQl9IGVsc2UNCgkJCQkJCQkJCQkJZG9tLnJlbW92ZShub2RlKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfSk7DQoNCgkJCQkJCQkJLy8gQWx3YXlzIHVuYmluZCBhbmQgY2xlYXIgcGVuZGluZyBzdHlsZXMgb24ga2V5dXANCgkJCQkJCQkJaWYgKGUudHlwZSA9PSAna2V5dXAnIHx8IGUudHlwZSA9PSAnbW91c2V1cCcpDQoJCQkJCQkJCQlyZXNldFBlbmRpbmcoKTsNCgkJCQkJCQl9DQoJCQkJCQl9KTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KCX07DQp9KSh0aW55bWNlKTsNCg0KdGlueW1jZS5vbkFkZEVkaXRvci5hZGQoZnVuY3Rpb24odGlueW1jZSwgZWQpIHsNCgl2YXIgZmlsdGVycywgZm9udFNpemVzLCBkb20sIHNldHRpbmdzID0gZWQuc2V0dGluZ3M7DQoNCglpZiAoc2V0dGluZ3MuaW5saW5lX3N0eWxlcykgew0KCQlmb250U2l6ZXMgPSB0aW55bWNlLmV4cGxvZGUoc2V0dGluZ3MuZm9udF9zaXplX3N0eWxlX3ZhbHVlcyk7DQoNCgkJZnVuY3Rpb24gcmVwbGFjZVdpdGhTcGFuKG5vZGUsIHN0eWxlcykgew0KCQkJdGlueW1jZS5lYWNoKHN0eWxlcywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsNCgkJCQlpZiAodmFsdWUpDQoJCQkJCWRvbS5zZXRTdHlsZShub2RlLCBuYW1lLCB2YWx1ZSk7DQoJCQl9KTsNCg0KCQkJZG9tLnJlbmFtZShub2RlLCAnc3BhbicpOw0KCQl9Ow0KDQoJCWZpbHRlcnMgPSB7DQoJCQlmb250IDogZnVuY3Rpb24oZG9tLCBub2RlKSB7DQoJCQkJcmVwbGFjZVdpdGhTcGFuKG5vZGUsIHsNCgkJCQkJYmFja2dyb3VuZENvbG9yIDogbm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IsDQoJCQkJCWNvbG9yIDogbm9kZS5jb2xvciwNCgkJCQkJZm9udEZhbWlseSA6IG5vZGUuZmFjZSwNCgkJCQkJZm9udFNpemUgOiBmb250U2l6ZXNbcGFyc2VJbnQobm9kZS5zaXplKSAtIDFdDQoJCQkJfSk7DQoJCQl9LA0KDQoJCQl1IDogZnVuY3Rpb24oZG9tLCBub2RlKSB7DQoJCQkJcmVwbGFjZVdpdGhTcGFuKG5vZGUsIHsNCgkJCQkJdGV4dERlY29yYXRpb24gOiAndW5kZXJsaW5lJw0KCQkJCX0pOw0KCQkJfSwNCg0KCQkJc3RyaWtlIDogZnVuY3Rpb24oZG9tLCBub2RlKSB7DQoJCQkJcmVwbGFjZVdpdGhTcGFuKG5vZGUsIHsNCgkJCQkJdGV4dERlY29yYXRpb24gOiAnbGluZS10aHJvdWdoJw0KCQkJCX0pOw0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGNvbnZlcnQoZWRpdG9yLCBwYXJhbXMpIHsNCgkJCWRvbSA9IGVkaXRvci5kb207DQoNCgkJCWlmIChzZXR0aW5ncy5jb252ZXJ0X2ZvbnRzX3RvX3NwYW5zKSB7DQoJCQkJdGlueW1jZS5lYWNoKGRvbS5zZWxlY3QoJ2ZvbnQsdSxzdHJpa2UnLCBwYXJhbXMubm9kZSksIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJZmlsdGVyc1tub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKGVkLmRvbSwgbm9kZSk7DQoJCQkJfSk7DQoJCQl9DQoJCX07DQoNCgkJZWQub25QcmVQcm9jZXNzLmFkZChjb252ZXJ0KTsNCg0KCQllZC5vbkluaXQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJZWQuc2VsZWN0aW9uLm9uU2V0Q29udGVudC5hZGQoY29udmVydCk7DQoJCX0pOw0KCX0NCn0pOw0KDQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/tiny_mce_src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKHdpbikgew0KCXZhciB3aGl0ZVNwYWNlUmUgPSAvXlxzKnxccyokL2csDQoJCXVuZGVmaW5lZCwgaXNSZWdFeHBCcm9rZW4gPSAnQicucmVwbGFjZSgvQSguKXxCLywgJyQxJykgPT09ICckMSc7DQoNCgl2YXIgdGlueW1jZSA9IHsNCgkJbWFqb3JWZXJzaW9uIDogJzMnLA0KDQoJCW1pbm9yVmVyc2lvbiA6ICczLjkuMycsDQoNCgkJcmVsZWFzZURhdGUgOiAnMjAxMC0xMi0yMCcsDQoNCgkJX2luaXQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZCA9IGRvY3VtZW50LCBuYSA9IG5hdmlnYXRvciwgdWEgPSBuYS51c2VyQWdlbnQsIGksIG5sLCBuLCBiYXNlLCBwLCB2Ow0KDQoJCQl0LmlzT3BlcmEgPSB3aW4ub3BlcmEgJiYgb3BlcmEuYnVpbGROdW1iZXI7DQoNCgkJCXQuaXNXZWJLaXQgPSAvV2ViS2l0Ly50ZXN0KHVhKTsNCg0KCQkJdC5pc0lFID0gIXQuaXNXZWJLaXQgJiYgIXQuaXNPcGVyYSAmJiAoL01TSUUvZ2kpLnRlc3QodWEpICYmICgvRXhwbG9yZXIvZ2kpLnRlc3QobmEuYXBwTmFtZSk7DQoNCgkJCXQuaXNJRTYgPSB0LmlzSUUgJiYgL01TSUUgWzU2XS8udGVzdCh1YSk7DQoNCgkJCXQuaXNHZWNrbyA9ICF0LmlzV2ViS2l0ICYmIC9HZWNrby8udGVzdCh1YSk7DQoNCgkJCXQuaXNNYWMgPSB1YS5pbmRleE9mKCdNYWMnKSAhPSAtMTsNCg0KCQkJdC5pc0FpciA9IC9hZG9iZWFpci9pLnRlc3QodWEpOw0KDQoJCQl0LmlzSURldmljZSA9IC8oaVBhZHxpUGhvbmUpLy50ZXN0KHVhKTsNCg0KCQkJLy8gVGlueU1DRSAuTkVUIHdlYmNvbnRyb2wgbWlnaHQgYmUgc2V0dGluZyB0aGUgdmFsdWVzIGZvciBUaW55TUNFDQoJCQlpZiAod2luLnRpbnlNQ0VQcmVJbml0KSB7DQoJCQkJdC5zdWZmaXggPSB0aW55TUNFUHJlSW5pdC5zdWZmaXg7DQoJCQkJdC5iYXNlVVJMID0gdGlueU1DRVByZUluaXQuYmFzZTsNCgkJCQl0LnF1ZXJ5ID0gdGlueU1DRVByZUluaXQucXVlcnk7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQkvLyBHZXQgc3VmZml4IGFuZCBiYXNlDQoJCQl0LnN1ZmZpeCA9ICcnOw0KDQoJCQkvLyBJZiBiYXNlIGVsZW1lbnQgZm91bmQsIGFkZCB0aGF0IGluZnJvbnQgb2YgYmFzZVVSTA0KCQkJbmwgPSBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJyk7DQoJCQlmb3IgKGk9MDsgaTxubC5sZW5ndGg7IGkrKykgew0KCQkJCWlmICh2ID0gbmxbaV0uaHJlZikgew0KCQkJCQkvLyBIb3N0IG9ubHkgdmFsdWUgbGlrZSBodHRwOi8vc2l0ZS5jb20gb3IgaHR0cDovL3NpdGUuY29tOjgwMDgNCgkJCQkJaWYgKC9eaHR0cHM/OlwvXC9bXlwvXSskLy50ZXN0KHYpKQ0KCQkJCQkJdiArPSAnLyc7DQoNCgkJCQkJYmFzZSA9IHYgPyB2Lm1hdGNoKC8uKlwvLylbMF0gOiAnJzsgLy8gR2V0IG9ubHkgZGlyZWN0b3J5DQoJCQkJfQ0KCQkJfQ0KDQoJCQlmdW5jdGlvbiBnZXRCYXNlKG4pIHsNCgkJCQlpZiAobi5zcmMgJiYgL3RpbnlfbWNlKHxfZ3ppcHxfanF1ZXJ5fF9wcm90b3R5cGV8X2Z1bGwpKF9kZXZ8X3NyYyk/LmpzLy50ZXN0KG4uc3JjKSkgew0KCQkJCQlpZiAoL18oc3JjfGRldilcLmpzL2cudGVzdChuLnNyYykpDQoJCQkJCQl0LnN1ZmZpeCA9ICdfc3JjJzsNCg0KCQkJCQlpZiAoKHAgPSBuLnNyYy5pbmRleE9mKCc/JykpICE9IC0xKQ0KCQkJCQkJdC5xdWVyeSA9IG4uc3JjLnN1YnN0cmluZyhwICsgMSk7DQoNCgkJCQkJdC5iYXNlVVJMID0gbi5zcmMuc3Vic3RyaW5nKDAsIG4uc3JjLmxhc3RJbmRleE9mKCcvJykpOw0KDQoJCQkJCS8vIElmIHBhdGggdG8gc2NyaXB0IGlzIHJlbGF0aXZlIGFuZCBhIGJhc2UgaHJlZiB3YXMgZm91bmQgYWRkIHRoYXQgb25lIGluZnJvbnQNCgkJCQkJLy8gdGhlIHNyYyBwcm9wZXJ0eSB3aWxsIGFsd2F5cyBiZSBhbiBhYnNvbHV0ZSBvbmUgb24gbm9uIElFIGJyb3dzZXJzIGFuZCBJRSA4DQoJCQkJCS8vIHNvIHRoaXMgbG9naWMgd2lsbCBiYXNpY2FsbHkgb25seSBiZSBleGVjdXRlZCBvbiBvbGRlciBJRSB2ZXJzaW9ucw0KCQkJCQlpZiAoYmFzZSAmJiB0LmJhc2VVUkwuaW5kZXhPZignOi8vJykgPT0gLTEgJiYgdC5iYXNlVVJMLmluZGV4T2YoJy8nKSAhPT0gMCkNCgkJCQkJCXQuYmFzZVVSTCA9IGJhc2UgKyB0LmJhc2VVUkw7DQoNCgkJCQkJcmV0dXJuIHQuYmFzZVVSTDsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gbnVsbDsNCgkJCX07DQoNCgkJCS8vIENoZWNrIGRvY3VtZW50DQoJCQlubCA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOw0KCQkJZm9yIChpPTA7IGk8bmwubGVuZ3RoOyBpKyspIHsNCgkJCQlpZiAoZ2V0QmFzZShubFtpXSkpDQoJCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJLy8gQ2hlY2sgaGVhZA0KCQkJbiA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsNCgkJCWlmIChuKSB7DQoJCQkJbmwgPSBuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTsNCgkJCQlmb3IgKGk9MDsgaTxubC5sZW5ndGg7IGkrKykgew0KCQkJCQlpZiAoZ2V0QmFzZShubFtpXSkpDQoJCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm47DQoJCX0sDQoNCgkJaXMgOiBmdW5jdGlvbihvLCB0KSB7DQoJCQlpZiAoIXQpDQoJCQkJcmV0dXJuIG8gIT09IHVuZGVmaW5lZDsNCg0KCQkJaWYgKHQgPT0gJ2FycmF5JyAmJiAoby5oYXNPd25Qcm9wZXJ0eSAmJiBvIGluc3RhbmNlb2YgQXJyYXkpKQ0KCQkJCXJldHVybiB0cnVlOw0KDQoJCQlyZXR1cm4gdHlwZW9mKG8pID09IHQ7DQoJCX0sDQoNCgkJZWFjaCA6IGZ1bmN0aW9uKG8sIGNiLCBzKSB7DQoJCQl2YXIgbiwgbDsNCg0KCQkJaWYgKCFvKQ0KCQkJCXJldHVybiAwOw0KDQoJCQlzID0gcyB8fCBvOw0KDQoJCQlpZiAoby5sZW5ndGggIT09IHVuZGVmaW5lZCkgew0KCQkJCS8vIEluZGV4ZWQgYXJyYXlzLCBuZWVkZWQgZm9yIFNhZmFyaQ0KCQkJCWZvciAobj0wLCBsID0gby5sZW5ndGg7IG4gPCBsOyBuKyspIHsNCgkJCQkJaWYgKGNiLmNhbGwocywgb1tuXSwgbiwgbykgPT09IGZhbHNlKQ0KCQkJCQkJcmV0dXJuIDA7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkvLyBIYXNodGFibGVzDQoJCQkJZm9yIChuIGluIG8pIHsNCgkJCQkJaWYgKG8uaGFzT3duUHJvcGVydHkobikpIHsNCgkJCQkJCWlmIChjYi5jYWxsKHMsIG9bbl0sIG4sIG8pID09PSBmYWxzZSkNCgkJCQkJCQlyZXR1cm4gMDsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIDE7DQoJCX0sDQoNCg0KCQltYXAgOiBmdW5jdGlvbihhLCBmKSB7DQoJCQl2YXIgbyA9IFtdOw0KDQoJCQl0aW55bWNlLmVhY2goYSwgZnVuY3Rpb24odikgew0KCQkJCW8ucHVzaChmKHYpKTsNCgkJCX0pOw0KDQoJCQlyZXR1cm4gbzsNCgkJfSwNCg0KCQlncmVwIDogZnVuY3Rpb24oYSwgZikgew0KCQkJdmFyIG8gPSBbXTsNCg0KCQkJdGlueW1jZS5lYWNoKGEsIGZ1bmN0aW9uKHYpIHsNCgkJCQlpZiAoIWYgfHwgZih2KSkNCgkJCQkJby5wdXNoKHYpOw0KCQkJfSk7DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCWluQXJyYXkgOiBmdW5jdGlvbihhLCB2KSB7DQoJCQl2YXIgaSwgbDsNCg0KCQkJaWYgKGEpIHsNCgkJCQlmb3IgKGkgPSAwLCBsID0gYS5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCgkJCQkJaWYgKGFbaV0gPT09IHYpDQoJCQkJCQlyZXR1cm4gaTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiAtMTsNCgkJfSwNCg0KCQlleHRlbmQgOiBmdW5jdGlvbihvLCBlKSB7DQoJCQl2YXIgaSwgbCwgYSA9IGFyZ3VtZW50czsNCg0KCQkJZm9yIChpID0gMSwgbCA9IGEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQoJCQkJZSA9IGFbaV07DQoNCgkJCQl0aW55bWNlLmVhY2goZSwgZnVuY3Rpb24odiwgbikgew0KCQkJCQlpZiAodiAhPT0gdW5kZWZpbmVkKQ0KCQkJCQkJb1tuXSA9IHY7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoNCgkJdHJpbSA6IGZ1bmN0aW9uKHMpIHsNCgkJCXJldHVybiAocyA/ICcnICsgcyA6ICcnKS5yZXBsYWNlKHdoaXRlU3BhY2VSZSwgJycpOw0KCQl9LA0KDQoJCWNyZWF0ZSA6IGZ1bmN0aW9uKHMsIHApIHsNCgkJCXZhciB0ID0gdGhpcywgc3AsIG5zLCBjbiwgc2NuLCBjLCBkZSA9IDA7DQoNCgkJCS8vIFBhcnNlIDogPHByZWZpeD4gPGNsYXNzPjo8c3VwZXIgY2xhc3M+DQoJCQlzID0gL14oKHN0YXRpYykgKT8oW1x3Ll0rKSg6KFtcdy5dKykpPy8uZXhlYyhzKTsNCgkJCWNuID0gc1szXS5tYXRjaCgvKF58XC4pKFx3KykkL2kpWzJdOyAvLyBDbGFzcyBuYW1lDQoNCgkJCS8vIENyZWF0ZSBuYW1lc3BhY2UgZm9yIG5ldyBjbGFzcw0KCQkJbnMgPSB0LmNyZWF0ZU5TKHNbM10ucmVwbGFjZSgvXC5cdyskLywgJycpKTsNCg0KCQkJLy8gQ2xhc3MgYWxyZWFkeSBleGlzdHMNCgkJCWlmIChuc1tjbl0pDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBNYWtlIHB1cmUgc3RhdGljIGNsYXNzDQoJCQlpZiAoc1syXSA9PSAnc3RhdGljJykgew0KCQkJCW5zW2NuXSA9IHA7DQoNCgkJCQlpZiAodGhpcy5vbkNyZWF0ZSkNCgkJCQkJdGhpcy5vbkNyZWF0ZShzWzJdLCBzWzNdLCBuc1tjbl0pOw0KDQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQkvLyBDcmVhdGUgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KCQkJaWYgKCFwW2NuXSkgew0KCQkJCXBbY25dID0gZnVuY3Rpb24oKSB7fTsNCgkJCQlkZSA9IDE7DQoJCQl9DQoNCgkJCS8vIEFkZCBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kcw0KCQkJbnNbY25dID0gcFtjbl07DQoJCQl0LmV4dGVuZChuc1tjbl0ucHJvdG90eXBlLCBwKTsNCg0KCQkJLy8gRXh0ZW5kDQoJCQlpZiAoc1s1XSkgew0KCQkJCXNwID0gdC5yZXNvbHZlKHNbNV0pLnByb3RvdHlwZTsNCgkJCQlzY24gPSBzWzVdLm1hdGNoKC9cLihcdyspJC9pKVsxXTsgLy8gQ2xhc3MgbmFtZQ0KDQoJCQkJLy8gRXh0ZW5kIGNvbnN0cnVjdG9yDQoJCQkJYyA9IG5zW2NuXTsNCgkJCQlpZiAoZGUpIHsNCgkJCQkJLy8gQWRkIHBhc3N0aHJvdWdoIGNvbnN0cnVjdG9yDQoJCQkJCW5zW2NuXSA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJcmV0dXJuIHNwW3Njbl0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCgkJCQkJfTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBBZGQgaW5oZXJpdCBjb25zdHJ1Y3Rvcg0KCQkJCQluc1tjbl0gPSBmdW5jdGlvbigpIHsNCgkJCQkJCXRoaXMucGFyZW50ID0gc3Bbc2NuXTsNCgkJCQkJCXJldHVybiBjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQoJCQkJCX07DQoJCQkJfQ0KCQkJCW5zW2NuXS5wcm90b3R5cGVbY25dID0gbnNbY25dOw0KDQoJCQkJLy8gQWRkIHN1cGVyIG1ldGhvZHMNCgkJCQl0LmVhY2goc3AsIGZ1bmN0aW9uKGYsIG4pIHsNCgkJCQkJbnNbY25dLnByb3RvdHlwZVtuXSA9IHNwW25dOw0KCQkJCX0pOw0KDQoJCQkJLy8gQWRkIG92ZXJyaWRkZW4gbWV0aG9kcw0KCQkJCXQuZWFjaChwLCBmdW5jdGlvbihmLCBuKSB7DQoJCQkJCS8vIEV4dGVuZCBtZXRob2RzIGlmIG5lZWRlZA0KCQkJCQlpZiAoc3Bbbl0pIHsNCgkJCQkJCW5zW2NuXS5wcm90b3R5cGVbbl0gPSBmdW5jdGlvbigpIHsNCgkJCQkJCQl0aGlzLnBhcmVudCA9IHNwW25dOw0KCQkJCQkJCXJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQoJCQkJCQl9Ow0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJaWYgKG4gIT0gY24pDQoJCQkJCQkJbnNbY25dLnByb3RvdHlwZVtuXSA9IGY7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gQWRkIHN0YXRpYyBtZXRob2RzDQoJCQl0LmVhY2gocFsnc3RhdGljJ10sIGZ1bmN0aW9uKGYsIG4pIHsNCgkJCQluc1tjbl1bbl0gPSBmOw0KCQkJfSk7DQoNCgkJCWlmICh0aGlzLm9uQ3JlYXRlKQ0KCQkJCXRoaXMub25DcmVhdGUoc1syXSwgc1szXSwgbnNbY25dLnByb3RvdHlwZSk7DQoJCX0sDQoNCgkJd2FsayA6IGZ1bmN0aW9uKG8sIGYsIG4sIHMpIHsNCgkJCXMgPSBzIHx8IHRoaXM7DQoNCgkJCWlmIChvKSB7DQoJCQkJaWYgKG4pDQoJCQkJCW8gPSBvW25dOw0KDQoJCQkJdGlueW1jZS5lYWNoKG8sIGZ1bmN0aW9uKG8sIGkpIHsNCgkJCQkJaWYgKGYuY2FsbChzLCBvLCBpLCBuKSA9PT0gZmFsc2UpDQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCQkJdGlueW1jZS53YWxrKG8sIGYsIG4sIHMpOw0KCQkJCX0pOw0KCQkJfQ0KCQl9LA0KDQoJCWNyZWF0ZU5TIDogZnVuY3Rpb24obiwgbykgew0KCQkJdmFyIGksIHY7DQoNCgkJCW8gPSBvIHx8IHdpbjsNCg0KCQkJbiA9IG4uc3BsaXQoJy4nKTsNCgkJCWZvciAoaT0wOyBpPG4ubGVuZ3RoOyBpKyspIHsNCgkJCQl2ID0gbltpXTsNCg0KCQkJCWlmICghb1t2XSkNCgkJCQkJb1t2XSA9IHt9Ow0KDQoJCQkJbyA9IG9bdl07DQoJCQl9DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCXJlc29sdmUgOiBmdW5jdGlvbihuLCBvKSB7DQoJCQl2YXIgaSwgbDsNCg0KCQkJbyA9IG8gfHwgd2luOw0KDQoJCQluID0gbi5zcGxpdCgnLicpOw0KCQkJZm9yIChpID0gMCwgbCA9IG4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQoJCQkJbyA9IG9bbltpXV07DQoNCgkJCQlpZiAoIW8pDQoJCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQlyZXR1cm4gbzsNCgkJfSwNCg0KCQlhZGRVbmxvYWQgOiBmdW5jdGlvbihmLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWYgPSB7ZnVuYyA6IGYsIHNjb3BlIDogcyB8fCB0aGlzfTsNCg0KCQkJaWYgKCF0LnVubG9hZHMpIHsNCgkJCQlmdW5jdGlvbiB1bmxvYWQoKSB7DQoJCQkJCXZhciBsaSA9IHQudW5sb2FkcywgbywgbjsNCg0KCQkJCQlpZiAobGkpIHsNCgkJCQkJCS8vIENhbGwgdW5sb2FkIGhhbmRsZXJzDQoJCQkJCQlmb3IgKG4gaW4gbGkpIHsNCgkJCQkJCQlvID0gbGlbbl07DQoNCgkJCQkJCQlpZiAobyAmJiBvLmZ1bmMpDQoJCQkJCQkJCW8uZnVuYy5jYWxsKG8uc2NvcGUsIDEpOyAvLyBTZW5kIGluIG9uZSBhcmcgdG8gZGlzdGluY3QgdW5sb2FkIGFuZCB1c2VyIGRlc3Ryb3kNCgkJCQkJCX0NCg0KCQkJCQkJLy8gRGV0YWNoIHVubG9hZCBmdW5jdGlvbg0KCQkJCQkJaWYgKHdpbi5kZXRhY2hFdmVudCkgew0KCQkJCQkJCXdpbi5kZXRhY2hFdmVudCgnb25iZWZvcmV1bmxvYWQnLCBmYWtlVW5sb2FkKTsNCgkJCQkJCQl3aW4uZGV0YWNoRXZlbnQoJ29udW5sb2FkJywgdW5sb2FkKTsNCgkJCQkJCX0gZWxzZSBpZiAod2luLnJlbW92ZUV2ZW50TGlzdGVuZXIpDQoJCQkJCQkJd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3VubG9hZCcsIHVubG9hZCwgZmFsc2UpOw0KDQoJCQkJCQkvLyBEZXN0cm95IHJlZmVyZW5jZXMNCgkJCQkJCXQudW5sb2FkcyA9IG8gPSBsaSA9IHcgPSB1bmxvYWQgPSAwOw0KDQoJCQkJCQkvLyBSdW4gZ2FyYmFyZ2UgY29sbGVjdG9yIG9uIElFDQoJCQkJCQlpZiAod2luLkNvbGxlY3RHYXJiYWdlKQ0KCQkJCQkJCUNvbGxlY3RHYXJiYWdlKCk7DQoJCQkJCX0NCgkJCQl9Ow0KDQoJCQkJZnVuY3Rpb24gZmFrZVVubG9hZCgpIHsNCgkJCQkJdmFyIGQgPSBkb2N1bWVudDsNCg0KCQkJCQkvLyBJcyB0aGVyZSB0aGluZ3Mgc3RpbGwgbG9hZGluZywgdGhlbiBkbyBzb21lIG1hZ2ljDQoJCQkJCWlmIChkLnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgew0KCQkJCQkJZnVuY3Rpb24gc3RvcCgpIHsNCgkJCQkJCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrDQoJCQkJCQkJZC5kZXRhY2hFdmVudCgnb25zdG9wJywgc3RvcCk7DQoNCgkJCQkJCQkvLyBDYWxsIHVubG9hZCBoYW5kbGVyDQoJCQkJCQkJaWYgKHVubG9hZCkNCgkJCQkJCQkJdW5sb2FkKCk7DQoNCgkJCQkJCQlkID0gMDsNCgkJCQkJCX07DQoNCgkJCQkJCS8vIEZpcmUgdW5sb2FkIHdoZW4gdGhlIGN1cnJlbnRseSBsb2FkaW5nIHBhZ2UgaXMgc3RvcHBlZA0KCQkJCQkJaWYgKGQpDQoJCQkJCQkJZC5hdHRhY2hFdmVudCgnb25zdG9wJywgc3RvcCk7DQoNCgkJCQkJCS8vIFJlbW92ZSBvbnN0b3AgbGlzdGVuZXIgYWZ0ZXIgYSB3aGlsZSB0byBwcmV2ZW50IHRoZSB1bmxvYWQgZnVuY3Rpb24NCgkJCQkJCS8vIHRvIGV4ZWN1dGUgaWYgdGhlIHVzZXIgcHJlc3NlcyBjYW5jZWwgaW4gYW4gb25iZWZvcmV1bmxvYWQNCgkJCQkJCS8vIGNvbmZpcm0gZGlhbG9nIGFuZCB0aGVuIHByZXNzZXMgdGhlIGJyb3dzZXIgc3RvcCBidXR0b24NCgkJCQkJCXdpbi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KCQkJCQkJCWlmIChkKQ0KCQkJCQkJCQlkLmRldGFjaEV2ZW50KCdvbnN0b3AnLCBzdG9wKTsNCgkJCQkJCX0sIDApOw0KCQkJCQl9DQoJCQkJfTsNCg0KCQkJCS8vIEF0dGFjaCB1bmxvYWQgaGFuZGxlcg0KCQkJCWlmICh3aW4uYXR0YWNoRXZlbnQpIHsNCgkJCQkJd2luLmF0dGFjaEV2ZW50KCdvbnVubG9hZCcsIHVubG9hZCk7DQoJCQkJCXdpbi5hdHRhY2hFdmVudCgnb25iZWZvcmV1bmxvYWQnLCBmYWtlVW5sb2FkKTsNCgkJCQl9IGVsc2UgaWYgKHdpbi5hZGRFdmVudExpc3RlbmVyKQ0KCQkJCQl3aW4uYWRkRXZlbnRMaXN0ZW5lcigndW5sb2FkJywgdW5sb2FkLCBmYWxzZSk7DQoNCgkJCQkvLyBTZXR1cCBpbml0aWFsIHVubG9hZCBoYW5kbGVyIGFycmF5DQoJCQkJdC51bmxvYWRzID0gW2ZdOw0KCQkJfSBlbHNlDQoJCQkJdC51bmxvYWRzLnB1c2goZik7DQoNCgkJCXJldHVybiBmOw0KCQl9LA0KDQoJCXJlbW92ZVVubG9hZCA6IGZ1bmN0aW9uKGYpIHsNCgkJCXZhciB1ID0gdGhpcy51bmxvYWRzLCByID0gbnVsbDsNCg0KCQkJdGlueW1jZS5lYWNoKHUsIGZ1bmN0aW9uKG8sIGkpIHsNCgkJCQlpZiAobyAmJiBvLmZ1bmMgPT0gZikgew0KCQkJCQl1LnNwbGljZShpLCAxKTsNCgkJCQkJciA9IGY7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJcmV0dXJuIHI7DQoJCX0sDQoNCgkJZXhwbG9kZSA6IGZ1bmN0aW9uKHMsIGQpIHsNCgkJCXJldHVybiBzID8gdGlueW1jZS5tYXAocy5zcGxpdChkIHx8ICcsJyksIHRpbnltY2UudHJpbSkgOiBzOw0KCQl9LA0KDQoJCV9hZGRWZXIgOiBmdW5jdGlvbih1KSB7DQoJCQl2YXIgdjsNCg0KCQkJaWYgKCF0aGlzLnF1ZXJ5KQ0KCQkJCXJldHVybiB1Ow0KDQoJCQl2ID0gKHUuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnKSArIHRoaXMucXVlcnk7DQoNCgkJCWlmICh1LmluZGV4T2YoJyMnKSA9PSAtMSkNCgkJCQlyZXR1cm4gdSArIHY7DQoNCgkJCXJldHVybiB1LnJlcGxhY2UoJyMnLCB2ICsgJyMnKTsNCgkJfSwNCg0KCQkvLyBGaXggZnVuY3Rpb24gZm9yIElFIDkgd2hlcmUgcmVnZXhwcyBpc24ndCB3b3JraW5nIGNvcnJlY3RseQ0KCQkvLyBUb2RvOiByZW1vdmUgbWUgb25jZSBNUyBmaXhlcyB0aGUgYnVnDQoJCV9yZXBsYWNlIDogZnVuY3Rpb24oZmluZCwgcmVwbGFjZSwgc3RyKSB7DQoJCQkvLyBPbiBJRTkgd2UgaGF2ZSB0byBmYWtlICR4IHJlcGxhY2VtZW50DQoJCQlpZiAoaXNSZWdFeHBCcm9rZW4pIHsNCgkJCQlyZXR1cm4gc3RyLnJlcGxhY2UoZmluZCwgZnVuY3Rpb24oKSB7DQoJCQkJCXZhciB2YWwgPSByZXBsYWNlLCBhcmdzID0gYXJndW1lbnRzLCBpOw0KDQoJCQkJCWZvciAoaSA9IDA7IGkgPCBhcmdzLmxlbmd0aCAtIDI7IGkrKykgew0KCQkJCQkJaWYgKGFyZ3NbaV0gPT09IHVuZGVmaW5lZCkgew0KCQkJCQkJCXZhbCA9IHZhbC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcJCcgKyBpLCAnZycpLCAnJyk7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCXZhbCA9IHZhbC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcJCcgKyBpLCAnZycpLCBhcmdzW2ldKTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCXJldHVybiB2YWw7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiBzdHIucmVwbGFjZShmaW5kLCByZXBsYWNlKTsNCgkJfQ0KDQoJCX07DQoNCgkvLyBJbml0aWFsaXplIHRoZSBBUEkNCgl0aW55bWNlLl9pbml0KCk7DQoNCgkvLyBFeHBvc2UgdGlueW1jZSBuYW1lc3BhY2UgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UgKHdpbmRvdykNCgl3aW4udGlueW1jZSA9IHdpbi50aW55TUNFID0gdGlueW1jZTsNCn0pKHdpbmRvdyk7DQoNCg0KdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudXRpbC5EaXNwYXRjaGVyJywgew0KCXNjb3BlIDogbnVsbCwNCglsaXN0ZW5lcnMgOiBudWxsLA0KDQoJRGlzcGF0Y2hlciA6IGZ1bmN0aW9uKHMpIHsNCgkJdGhpcy5zY29wZSA9IHMgfHwgdGhpczsNCgkJdGhpcy5saXN0ZW5lcnMgPSBbXTsNCgl9LA0KDQoJYWRkIDogZnVuY3Rpb24oY2IsIHMpIHsNCgkJdGhpcy5saXN0ZW5lcnMucHVzaCh7Y2IgOiBjYiwgc2NvcGUgOiBzIHx8IHRoaXMuc2NvcGV9KTsNCg0KCQlyZXR1cm4gY2I7DQoJfSwNCg0KCWFkZFRvVG9wIDogZnVuY3Rpb24oY2IsIHMpIHsNCgkJdGhpcy5saXN0ZW5lcnMudW5zaGlmdCh7Y2IgOiBjYiwgc2NvcGUgOiBzIHx8IHRoaXMuc2NvcGV9KTsNCg0KCQlyZXR1cm4gY2I7DQoJfSwNCg0KCXJlbW92ZSA6IGZ1bmN0aW9uKGNiKSB7DQoJCXZhciBsID0gdGhpcy5saXN0ZW5lcnMsIG8gPSBudWxsOw0KDQoJCXRpbnltY2UuZWFjaChsLCBmdW5jdGlvbihjLCBpKSB7DQoJCQlpZiAoY2IgPT0gYy5jYikgew0KCQkJCW8gPSBjYjsNCgkJCQlsLnNwbGljZShpLCAxKTsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCX0pOw0KDQoJCXJldHVybiBvOw0KCX0sDQoNCglkaXNwYXRjaCA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgcywgYSA9IGFyZ3VtZW50cywgaSwgbGkgPSB0aGlzLmxpc3RlbmVycywgYzsNCg0KCQkvLyBOZWVkcyB0byBiZSBhIHJlYWwgbG9vcCBzaW5jZSB0aGUgbGlzdGVuZXIgY291bnQgbWlnaHQgY2hhbmdlIHdoaWxlIGxvb3BpbmcNCgkJLy8gQW5kIHRoaXMgaXMgYWxzbyBtb3JlIGVmZmljaWVudA0KCQlmb3IgKGkgPSAwOyBpPGxpLmxlbmd0aDsgaSsrKSB7DQoJCQljID0gbGlbaV07DQoJCQlzID0gYy5jYi5hcHBseShjLnNjb3BlLCBhKTsNCg0KCQkJaWYgKHMgPT09IGZhbHNlKQ0KCQkJCWJyZWFrOw0KCQl9DQoNCgkJcmV0dXJuIHM7DQoJfQ0KDQoJfSk7DQoNCihmdW5jdGlvbigpIHsNCgl2YXIgZWFjaCA9IHRpbnltY2UuZWFjaDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnV0aWwuVVJJJywgew0KCQlVUkkgOiBmdW5jdGlvbih1LCBzKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG8sIGEsIGI7DQoNCgkJCS8vIFRyaW0gd2hpdGVzcGFjZQ0KCQkJdSA9IHRpbnltY2UudHJpbSh1KTsNCg0KCQkJLy8gRGVmYXVsdCBzZXR0aW5ncw0KCQkJcyA9IHQuc2V0dGluZ3MgPSBzIHx8IHt9Ow0KDQoJCQkvLyBTdHJhbmdlIGFwcCBwcm90b2NvbCBvciBsb2NhbCBhbmNob3INCgkJCWlmICgvXihtYWlsdG98dGVsfG5ld3N8amF2YXNjcmlwdHxhYm91dHxkYXRhKTovaS50ZXN0KHUpIHx8IC9eXHMqIy8udGVzdCh1KSkgew0KCQkJCXQuc291cmNlID0gdTsNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCS8vIEFic29sdXRlIHBhdGggd2l0aCBubyBob3N0LCBmYWtlIGhvc3QgYW5kIHByb3RvY29sDQoJCQlpZiAodS5pbmRleE9mKCcvJykgPT09IDAgJiYgdS5pbmRleE9mKCcvLycpICE9PSAwKQ0KCQkJCXUgPSAocy5iYXNlX3VyaSA/IHMuYmFzZV91cmkucHJvdG9jb2wgfHwgJ2h0dHAnIDogJ2h0dHAnKSArICc6Ly9tY2VfaG9zdCcgKyB1Ow0KDQoJCQkvLyBSZWxhdGl2ZSBwYXRoIGh0dHA6Ly8gb3IgcHJvdG9jb2wgcmVsYXRpdmUgLy9wYXRoDQoJCQlpZiAoIS9eXHcqOj9cL1wvLy50ZXN0KHUpKQ0KCQkJCXUgPSAocy5iYXNlX3VyaS5wcm90b2NvbCB8fCAnaHR0cCcpICsgJzovL21jZV9ob3N0JyArIHQudG9BYnNQYXRoKHMuYmFzZV91cmkucGF0aCwgdSk7DQoNCgkJCS8vIFBhcnNlIFVSTCAoQ3JlZGl0cyBnb2VzIHRvIFN0ZWF2ZSwgaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL3BhcnNldXJpKQ0KCQkJdSA9IHUucmVwbGFjZSgvQEAvZywgJyhtY2VfYXQpJyk7IC8vIFpvcGUgMyB3b3JrYXJvdW5kLCB0aGV5IHVzZSBAQHNvbWV0aGluZw0KCQkJdSA9IC9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopOj8oW146QF0qKSk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyh1KTsNCgkJCWVhY2goWyJzb3VyY2UiLCJwcm90b2NvbCIsImF1dGhvcml0eSIsInVzZXJJbmZvIiwidXNlciIsInBhc3N3b3JkIiwiaG9zdCIsInBvcnQiLCJyZWxhdGl2ZSIsInBhdGgiLCJkaXJlY3RvcnkiLCJmaWxlIiwicXVlcnkiLCJhbmNob3IiXSwgZnVuY3Rpb24odiwgaSkgew0KCQkJCXZhciBzID0gdVtpXTsNCg0KCQkJCS8vIFpvcGUgMyB3b3JrYXJvdW5kLCB0aGV5IHVzZSBAQHNvbWV0aGluZw0KCQkJCWlmIChzKQ0KCQkJCQlzID0gcy5yZXBsYWNlKC9cKG1jZV9hdFwpL2csICdAQCcpOw0KDQoJCQkJdFt2XSA9IHM7DQoJCQl9KTsNCg0KCQkJaWYgKGIgPSBzLmJhc2VfdXJpKSB7DQoJCQkJaWYgKCF0LnByb3RvY29sKQ0KCQkJCQl0LnByb3RvY29sID0gYi5wcm90b2NvbDsNCg0KCQkJCWlmICghdC51c2VySW5mbykNCgkJCQkJdC51c2VySW5mbyA9IGIudXNlckluZm87DQoNCgkJCQlpZiAoIXQucG9ydCAmJiB0Lmhvc3QgPT0gJ21jZV9ob3N0JykNCgkJCQkJdC5wb3J0ID0gYi5wb3J0Ow0KDQoJCQkJaWYgKCF0Lmhvc3QgfHwgdC5ob3N0ID09ICdtY2VfaG9zdCcpDQoJCQkJCXQuaG9zdCA9IGIuaG9zdDsNCg0KCQkJCXQuc291cmNlID0gJyc7DQoJCQl9DQoNCgkJCS8vdC5wYXRoID0gdC5wYXRoIHx8ICcvJzsNCgkJfSwNCg0KCQlzZXRQYXRoIDogZnVuY3Rpb24ocCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlwID0gL14oLio/KVwvPyhcdyspPyQvLmV4ZWMocCk7DQoNCgkJCS8vIFVwZGF0ZSBwYXRoIHBhcnRzDQoJCQl0LnBhdGggPSBwWzBdOw0KCQkJdC5kaXJlY3RvcnkgPSBwWzFdOw0KCQkJdC5maWxlID0gcFsyXTsNCg0KCQkJLy8gUmVidWlsZCBzb3VyY2UNCgkJCXQuc291cmNlID0gJyc7DQoJCQl0LmdldFVSSSgpOw0KCQl9LA0KDQoJCXRvUmVsYXRpdmUgOiBmdW5jdGlvbih1KSB7DQoJCQl2YXIgdCA9IHRoaXMsIG87DQoNCgkJCWlmICh1ID09PSAiLi8iKQ0KCQkJCXJldHVybiB1Ow0KDQoJCQl1ID0gbmV3IHRpbnltY2UudXRpbC5VUkkodSwge2Jhc2VfdXJpIDogdH0pOw0KDQoJCQkvLyBOb3Qgb24gc2FtZSBkb21haW4vcG9ydCBvciBwcm90b2NvbA0KCQkJaWYgKCh1Lmhvc3QgIT0gJ21jZV9ob3N0JyAmJiB0Lmhvc3QgIT0gdS5ob3N0ICYmIHUuaG9zdCkgfHwgdC5wb3J0ICE9IHUucG9ydCB8fCB0LnByb3RvY29sICE9IHUucHJvdG9jb2wpDQoJCQkJcmV0dXJuIHUuZ2V0VVJJKCk7DQoNCgkJCW8gPSB0LnRvUmVsUGF0aCh0LnBhdGgsIHUucGF0aCk7DQoNCgkJCS8vIEFkZCBxdWVyeQ0KCQkJaWYgKHUucXVlcnkpDQoJCQkJbyArPSAnPycgKyB1LnF1ZXJ5Ow0KDQoJCQkvLyBBZGQgYW5jaG9yDQoJCQlpZiAodS5hbmNob3IpDQoJCQkJbyArPSAnIycgKyB1LmFuY2hvcjsNCg0KCQkJcmV0dXJuIG87DQoJCX0sDQoJDQoJCXRvQWJzb2x1dGUgOiBmdW5jdGlvbih1LCBuaCkgew0KCQkJdmFyIHUgPSBuZXcgdGlueW1jZS51dGlsLlVSSSh1LCB7YmFzZV91cmkgOiB0aGlzfSk7DQoNCgkJCXJldHVybiB1LmdldFVSSSh0aGlzLmhvc3QgPT0gdS5ob3N0ICYmIHRoaXMucHJvdG9jb2wgPT0gdS5wcm90b2NvbCA/IG5oIDogMCk7DQoJCX0sDQoNCgkJdG9SZWxQYXRoIDogZnVuY3Rpb24oYmFzZSwgcGF0aCkgew0KCQkJdmFyIGl0ZW1zLCBicCA9IDAsIG91dCA9ICcnLCBpLCBsOw0KDQoJCQkvLyBTcGxpdCB0aGUgcGF0aHMNCgkJCWJhc2UgPSBiYXNlLnN1YnN0cmluZygwLCBiYXNlLmxhc3RJbmRleE9mKCcvJykpOw0KCQkJYmFzZSA9IGJhc2Uuc3BsaXQoJy8nKTsNCgkJCWl0ZW1zID0gcGF0aC5zcGxpdCgnLycpOw0KDQoJCQlpZiAoYmFzZS5sZW5ndGggPj0gaXRlbXMubGVuZ3RoKSB7DQoJCQkJZm9yIChpID0gMCwgbCA9IGJhc2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQoJCQkJCWlmIChpID49IGl0ZW1zLmxlbmd0aCB8fCBiYXNlW2ldICE9IGl0ZW1zW2ldKSB7DQoJCQkJCQlicCA9IGkgKyAxOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCWlmIChiYXNlLmxlbmd0aCA8IGl0ZW1zLmxlbmd0aCkgew0KCQkJCWZvciAoaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCgkJCQkJaWYgKGkgPj0gYmFzZS5sZW5ndGggfHwgYmFzZVtpXSAhPSBpdGVtc1tpXSkgew0KCQkJCQkJYnAgPSBpICsgMTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoYnAgPT0gMSkNCgkJCQlyZXR1cm4gcGF0aDsNCg0KCQkJZm9yIChpID0gMCwgbCA9IGJhc2UubGVuZ3RoIC0gKGJwIC0gMSk7IGkgPCBsOyBpKyspDQoJCQkJb3V0ICs9ICIuLi8iOw0KDQoJCQlmb3IgKGkgPSBicCAtIDEsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCgkJCQlpZiAoaSAhPSBicCAtIDEpDQoJCQkJCW91dCArPSAiLyIgKyBpdGVtc1tpXTsNCgkJCQllbHNlDQoJCQkJCW91dCArPSBpdGVtc1tpXTsNCgkJCX0NCg0KCQkJcmV0dXJuIG91dDsNCgkJfSwNCg0KCQl0b0Fic1BhdGggOiBmdW5jdGlvbihiYXNlLCBwYXRoKSB7DQoJCQl2YXIgaSwgbmIgPSAwLCBvID0gW10sIHRyLCBvdXRQYXRoOw0KDQoJCQkvLyBTcGxpdCBwYXRocw0KCQkJdHIgPSAvXC8kLy50ZXN0KHBhdGgpID8gJy8nIDogJyc7DQoJCQliYXNlID0gYmFzZS5zcGxpdCgnLycpOw0KCQkJcGF0aCA9IHBhdGguc3BsaXQoJy8nKTsNCg0KCQkJLy8gUmVtb3ZlIGVtcHR5IGNodW5rcw0KCQkJZWFjaChiYXNlLCBmdW5jdGlvbihrKSB7DQoJCQkJaWYgKGspDQoJCQkJCW8ucHVzaChrKTsNCgkJCX0pOw0KDQoJCQliYXNlID0gbzsNCg0KCQkJLy8gTWVyZ2UgcmVsVVJMUGFydHMgY2h1bmtzDQoJCQlmb3IgKGkgPSBwYXRoLmxlbmd0aCAtIDEsIG8gPSBbXTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkvLyBJZ25vcmUgZW1wdHkgb3IgLg0KCQkJCWlmIChwYXRoW2ldLmxlbmd0aCA9PSAwIHx8IHBhdGhbaV0gPT0gIi4iKQ0KCQkJCQljb250aW51ZTsNCg0KCQkJCS8vIElzIHBhcmVudA0KCQkJCWlmIChwYXRoW2ldID09ICcuLicpIHsNCgkJCQkJbmIrKzsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KDQoJCQkJLy8gTW92ZSB1cA0KCQkJCWlmIChuYiA+IDApIHsNCgkJCQkJbmItLTsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KDQoJCQkJby5wdXNoKHBhdGhbaV0pOw0KCQkJfQ0KDQoJCQlpID0gYmFzZS5sZW5ndGggLSBuYjsNCg0KCQkJLy8gSWYgL2EvYi9jIG9yIC8NCgkJCWlmIChpIDw9IDApDQoJCQkJb3V0UGF0aCA9IG8ucmV2ZXJzZSgpLmpvaW4oJy8nKTsNCgkJCWVsc2UNCgkJCQlvdXRQYXRoID0gYmFzZS5zbGljZSgwLCBpKS5qb2luKCcvJykgKyAnLycgKyBvLnJldmVyc2UoKS5qb2luKCcvJyk7DQoNCgkJCS8vIEFkZCBmcm9udCAvIGlmIGl0J3MgbmVlZGVkDQoJCQlpZiAob3V0UGF0aC5pbmRleE9mKCcvJykgIT09IDApDQoJCQkJb3V0UGF0aCA9ICcvJyArIG91dFBhdGg7DQoNCgkJCS8vIEFkZCB0cmFsaW5nIC8gaWYgaXQncyBuZWVkZWQNCgkJCWlmICh0ciAmJiBvdXRQYXRoLmxhc3RJbmRleE9mKCcvJykgIT09IG91dFBhdGgubGVuZ3RoIC0gMSkNCgkJCQlvdXRQYXRoICs9IHRyOw0KDQoJCQlyZXR1cm4gb3V0UGF0aDsNCgkJfSwNCg0KCQlnZXRVUkkgOiBmdW5jdGlvbihuaCkgew0KCQkJdmFyIHMsIHQgPSB0aGlzOw0KDQoJCQkvLyBSZWJ1aWxkIHNvdXJjZQ0KCQkJaWYgKCF0LnNvdXJjZSB8fCBuaCkgew0KCQkJCXMgPSAnJzsNCg0KCQkJCWlmICghbmgpIHsNCgkJCQkJaWYgKHQucHJvdG9jb2wpDQoJCQkJCQlzICs9IHQucHJvdG9jb2wgKyAnOi8vJzsNCg0KCQkJCQlpZiAodC51c2VySW5mbykNCgkJCQkJCXMgKz0gdC51c2VySW5mbyArICdAJzsNCg0KCQkJCQlpZiAodC5ob3N0KQ0KCQkJCQkJcyArPSB0Lmhvc3Q7DQoNCgkJCQkJaWYgKHQucG9ydCkNCgkJCQkJCXMgKz0gJzonICsgdC5wb3J0Ow0KCQkJCX0NCg0KCQkJCWlmICh0LnBhdGgpDQoJCQkJCXMgKz0gdC5wYXRoOw0KDQoJCQkJaWYgKHQucXVlcnkpDQoJCQkJCXMgKz0gJz8nICsgdC5xdWVyeTsNCg0KCQkJCWlmICh0LmFuY2hvcikNCgkJCQkJcyArPSAnIycgKyB0LmFuY2hvcjsNCg0KCQkJCXQuc291cmNlID0gczsNCgkJCX0NCg0KCQkJcmV0dXJuIHQuc291cmNlOw0KCQl9DQoJfSk7DQp9KSgpOw0KDQooZnVuY3Rpb24oKSB7DQoJdmFyIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgl0aW55bWNlLmNyZWF0ZSgnc3RhdGljIHRpbnltY2UudXRpbC5Db29raWUnLCB7DQoJCWdldEhhc2ggOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgdiA9IHRoaXMuZ2V0KG4pLCBoOw0KDQoJCQlpZiAodikgew0KCQkJCWVhY2godi5zcGxpdCgnJicpLCBmdW5jdGlvbih2KSB7DQoJCQkJCXYgPSB2LnNwbGl0KCc9Jyk7DQoJCQkJCWggPSBoIHx8IHt9Ow0KCQkJCQloW3VuZXNjYXBlKHZbMF0pXSA9IHVuZXNjYXBlKHZbMV0pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlyZXR1cm4gaDsNCgkJfSwNCg0KCQlzZXRIYXNoIDogZnVuY3Rpb24obiwgdiwgZSwgcCwgZCwgcykgew0KCQkJdmFyIG8gPSAnJzsNCg0KCQkJZWFjaCh2LCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJbyArPSAoIW8gPyAnJyA6ICcmJykgKyBlc2NhcGUoaykgKyAnPScgKyBlc2NhcGUodik7DQoJCQl9KTsNCg0KCQkJdGhpcy5zZXQobiwgbywgZSwgcCwgZCwgcyk7DQoJCX0sDQoNCgkJZ2V0IDogZnVuY3Rpb24obikgew0KCQkJdmFyIGMgPSBkb2N1bWVudC5jb29raWUsIGUsIHAgPSBuICsgIj0iLCBiOw0KDQoJCQkvLyBTdHJpY3QgbW9kZQ0KCQkJaWYgKCFjKQ0KCQkJCXJldHVybjsNCg0KCQkJYiA9IGMuaW5kZXhPZigiOyAiICsgcCk7DQoNCgkJCWlmIChiID09IC0xKSB7DQoJCQkJYiA9IGMuaW5kZXhPZihwKTsNCg0KCQkJCWlmIChiICE9IDApDQoJCQkJCXJldHVybiBudWxsOw0KCQkJfSBlbHNlDQoJCQkJYiArPSAyOw0KDQoJCQllID0gYy5pbmRleE9mKCI7IiwgYik7DQoNCgkJCWlmIChlID09IC0xKQ0KCQkJCWUgPSBjLmxlbmd0aDsNCg0KCQkJcmV0dXJuIHVuZXNjYXBlKGMuc3Vic3RyaW5nKGIgKyBwLmxlbmd0aCwgZSkpOw0KCQl9LA0KDQoJCXNldCA6IGZ1bmN0aW9uKG4sIHYsIGUsIHAsIGQsIHMpIHsNCgkJCWRvY3VtZW50LmNvb2tpZSA9IG4gKyAiPSIgKyBlc2NhcGUodikgKw0KCQkJCSgoZSkgPyAiOyBleHBpcmVzPSIgKyBlLnRvR01UU3RyaW5nKCkgOiAiIikgKw0KCQkJCSgocCkgPyAiOyBwYXRoPSIgKyBlc2NhcGUocCkgOiAiIikgKw0KCQkJCSgoZCkgPyAiOyBkb21haW49IiArIGQgOiAiIikgKw0KCQkJCSgocykgPyAiOyBzZWN1cmUiIDogIiIpOw0KCQl9LA0KDQoJCXJlbW92ZSA6IGZ1bmN0aW9uKG4sIHApIHsNCgkJCXZhciBkID0gbmV3IERhdGUoKTsNCg0KCQkJZC5zZXRUaW1lKGQuZ2V0VGltZSgpIC0gMTAwMCk7DQoNCgkJCXRoaXMuc2V0KG4sICcnLCBkLCBwLCBkKTsNCgkJfQ0KCX0pOw0KfSkoKTsNCg0KdGlueW1jZS5jcmVhdGUoJ3N0YXRpYyB0aW55bWNlLnV0aWwuSlNPTicsIHsNCglzZXJpYWxpemUgOiBmdW5jdGlvbihvKSB7DQoJCXZhciBpLCB2LCBzID0gdGlueW1jZS51dGlsLkpTT04uc2VyaWFsaXplLCB0Ow0KDQoJCWlmIChvID09IG51bGwpDQoJCQlyZXR1cm4gJ251bGwnOw0KDQoJCXQgPSB0eXBlb2YgbzsNCg0KCQlpZiAodCA9PSAnc3RyaW5nJykgew0KCQkJdiA9ICdcYmJcdHRcbm5cZmZccnJcIiJcJ1wnXFxcXCc7DQoNCgkJCXJldHVybiAnIicgKyBvLnJlcGxhY2UoLyhbXHUwMDgwLVx1RkZGRlx4MDAtXHgxZlwiXSkvZywgZnVuY3Rpb24oYSwgYikgew0KCQkJCWkgPSB2LmluZGV4T2YoYik7DQoNCgkJCQlpZiAoaSArIDEpDQoJCQkJCXJldHVybiAnXFwnICsgdi5jaGFyQXQoaSArIDEpOw0KDQoJCQkJYSA9IGIuY2hhckNvZGVBdCgpLnRvU3RyaW5nKDE2KTsNCg0KCQkJCXJldHVybiAnXFx1JyArICcwMDAwJy5zdWJzdHJpbmcoYS5sZW5ndGgpICsgYTsNCgkJCX0pICsgJyInOw0KCQl9DQoNCgkJaWYgKHQgPT0gJ29iamVjdCcpIHsNCgkJCWlmIChvLmhhc093blByb3BlcnR5ICYmIG8gaW5zdGFuY2VvZiBBcnJheSkgew0KCQkJCQlmb3IgKGk9MCwgdiA9ICdbJzsgaTxvLmxlbmd0aDsgaSsrKQ0KCQkJCQkJdiArPSAoaSA+IDAgPyAnLCcgOiAnJykgKyBzKG9baV0pOw0KDQoJCQkJCXJldHVybiB2ICsgJ10nOw0KCQkJCX0NCg0KCQkJCXYgPSAneyc7DQoNCgkJCQlmb3IgKGkgaW4gbykNCgkJCQkJdiArPSB0eXBlb2Ygb1tpXSAhPSAnZnVuY3Rpb24nID8gKHYubGVuZ3RoID4gMSA/ICcsIicgOiAnIicpICsgaSArICciOicgKyBzKG9baV0pIDogJyc7DQoNCgkJCQlyZXR1cm4gdiArICd9JzsNCgkJfQ0KDQoJCXJldHVybiAnJyArIG87DQoJfSwNCg0KCXBhcnNlIDogZnVuY3Rpb24ocykgew0KCQl0cnkgew0KCQkJcmV0dXJuIGV2YWwoJygnICsgcyArICcpJyk7DQoJCX0gY2F0Y2ggKGV4KSB7DQoJCQkvLyBJZ25vcmUNCgkJfQ0KCX0NCg0KCX0pOw0KDQp0aW55bWNlLmNyZWF0ZSgnc3RhdGljIHRpbnltY2UudXRpbC5YSFInLCB7DQoJc2VuZCA6IGZ1bmN0aW9uKG8pIHsNCgkJdmFyIHgsIHQsIHcgPSB3aW5kb3csIGMgPSAwOw0KDQoJCS8vIERlZmF1bHQgc2V0dGluZ3MNCgkJby5zY29wZSA9IG8uc2NvcGUgfHwgdGhpczsNCgkJby5zdWNjZXNzX3Njb3BlID0gby5zdWNjZXNzX3Njb3BlIHx8IG8uc2NvcGU7DQoJCW8uZXJyb3Jfc2NvcGUgPSBvLmVycm9yX3Njb3BlIHx8IG8uc2NvcGU7DQoJCW8uYXN5bmMgPSBvLmFzeW5jID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZTsNCgkJby5kYXRhID0gby5kYXRhIHx8ICcnOw0KDQoJCWZ1bmN0aW9uIGdldChzKSB7DQoJCQl4ID0gMDsNCg0KCQkJdHJ5IHsNCgkJCQl4ID0gbmV3IEFjdGl2ZVhPYmplY3Qocyk7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJfQ0KDQoJCQlyZXR1cm4geDsNCgkJfTsNCg0KCQl4ID0gdy5YTUxIdHRwUmVxdWVzdCA/IG5ldyBYTUxIdHRwUmVxdWVzdCgpIDogZ2V0KCdNaWNyb3NvZnQuWE1MSFRUUCcpIHx8IGdldCgnTXN4bWwyLlhNTEhUVFAnKTsNCg0KCQlpZiAoeCkgew0KCQkJaWYgKHgub3ZlcnJpZGVNaW1lVHlwZSkNCgkJCQl4Lm92ZXJyaWRlTWltZVR5cGUoby5jb250ZW50X3R5cGUpOw0KDQoJCQl4Lm9wZW4oby50eXBlIHx8IChvLmRhdGEgPyAnUE9TVCcgOiAnR0VUJyksIG8udXJsLCBvLmFzeW5jKTsNCg0KCQkJaWYgKG8uY29udGVudF90eXBlKQ0KCQkJCXguc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgby5jb250ZW50X3R5cGUpOw0KDQoJCQl4LnNldFJlcXVlc3RIZWFkZXIoJ1gtUmVxdWVzdGVkLVdpdGgnLCAnWE1MSHR0cFJlcXVlc3QnKTsNCg0KCQkJeC5zZW5kKG8uZGF0YSk7DQoNCgkJCWZ1bmN0aW9uIHJlYWR5KCkgew0KCQkJCWlmICghby5hc3luYyB8fCB4LnJlYWR5U3RhdGUgPT0gNCB8fCBjKysgPiAxMDAwMCkgew0KCQkJCQlpZiAoby5zdWNjZXNzICYmIGMgPCAxMDAwMCAmJiB4LnN0YXR1cyA9PSAyMDApDQoJCQkJCQlvLnN1Y2Nlc3MuY2FsbChvLnN1Y2Nlc3Nfc2NvcGUsICcnICsgeC5yZXNwb25zZVRleHQsIHgsIG8pOw0KCQkJCQllbHNlIGlmIChvLmVycm9yKQ0KCQkJCQkJby5lcnJvci5jYWxsKG8uZXJyb3Jfc2NvcGUsIGMgPiAxMDAwMCA/ICdUSU1FRF9PVVQnIDogJ0dFTkVSQUwnLCB4LCBvKTsNCg0KCQkJCQl4ID0gbnVsbDsNCgkJCQl9IGVsc2UNCgkJCQkJdy5zZXRUaW1lb3V0KHJlYWR5LCAxMCk7DQoJCQl9Ow0KDQoJCQkvLyBTeW5jcm9ub3VzIHJlcXVlc3QNCgkJCWlmICghby5hc3luYykNCgkJCQlyZXR1cm4gcmVhZHkoKTsNCg0KCQkJLy8gV2FpdCBmb3IgcmVzcG9uc2UsIG9uUmVhZHlTdGF0ZUNoYW5nZSBjYW4gbm90IGJlIHVzZWQgc2luY2UgaXQgbGVha3MgbWVtb3J5IGluIElFDQoJCQl0ID0gdy5zZXRUaW1lb3V0KHJlYWR5LCAxMCk7DQoJCX0NCgl9DQp9KTsNCg0KKGZ1bmN0aW9uKCkgew0KCXZhciBleHRlbmQgPSB0aW55bWNlLmV4dGVuZCwgSlNPTiA9IHRpbnltY2UudXRpbC5KU09OLCBYSFIgPSB0aW55bWNlLnV0aWwuWEhSOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudXRpbC5KU09OUmVxdWVzdCcsIHsNCgkJSlNPTlJlcXVlc3QgOiBmdW5jdGlvbihzKSB7DQoJCQl0aGlzLnNldHRpbmdzID0gZXh0ZW5kKHsNCgkJCX0sIHMpOw0KCQkJdGhpcy5jb3VudCA9IDA7DQoJCX0sDQoNCgkJc2VuZCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciBlY2IgPSBvLmVycm9yLCBzY2IgPSBvLnN1Y2Nlc3M7DQoNCgkJCW8gPSBleHRlbmQodGhpcy5zZXR0aW5ncywgbyk7DQoNCgkJCW8uc3VjY2VzcyA9IGZ1bmN0aW9uKGMsIHgpIHsNCgkJCQljID0gSlNPTi5wYXJzZShjKTsNCg0KCQkJCWlmICh0eXBlb2YoYykgPT0gJ3VuZGVmaW5lZCcpIHsNCgkJCQkJYyA9IHsNCgkJCQkJCWVycm9yIDogJ0pTT04gUGFyc2UgZXJyb3IuJw0KCQkJCQl9Ow0KCQkJCX0NCg0KCQkJCWlmIChjLmVycm9yKQ0KCQkJCQllY2IuY2FsbChvLmVycm9yX3Njb3BlIHx8IG8uc2NvcGUsIGMuZXJyb3IsIHgpOw0KCQkJCWVsc2UNCgkJCQkJc2NiLmNhbGwoby5zdWNjZXNzX3Njb3BlIHx8IG8uc2NvcGUsIGMucmVzdWx0KTsNCgkJCX07DQoNCgkJCW8uZXJyb3IgPSBmdW5jdGlvbih0eSwgeCkgew0KCQkJCWVjYi5jYWxsKG8uZXJyb3Jfc2NvcGUgfHwgby5zY29wZSwgdHksIHgpOw0KCQkJfTsNCg0KCQkJby5kYXRhID0gSlNPTi5zZXJpYWxpemUoew0KCQkJCWlkIDogby5pZCB8fCAnYycgKyAodGhpcy5jb3VudCsrKSwNCgkJCQltZXRob2QgOiBvLm1ldGhvZCwNCgkJCQlwYXJhbXMgOiBvLnBhcmFtcw0KCQkJfSk7DQoNCgkJCS8vIEpTT04gY29udGVudCB0eXBlIGZvciBSdWJ5IG9uIHJhaWxzLiBCdWc6ICMxODgzMjg3DQoJCQlvLmNvbnRlbnRfdHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJzsNCg0KCQkJWEhSLnNlbmQobyk7DQoJCX0sDQoNCgkJJ3N0YXRpYycgOiB7DQoJCQlzZW5kUlBDIDogZnVuY3Rpb24obykgew0KCQkJCXJldHVybiBuZXcgdGlueW1jZS51dGlsLkpTT05SZXF1ZXN0KCkuc2VuZChvKTsNCgkJCX0NCgkJfQ0KCX0pOw0KfSgpKTsNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBlYWNoID0gdGlueW1jZS5lYWNoLA0KCQlpcyA9IHRpbnltY2UuaXMsDQoJCWlzV2ViS2l0ID0gdGlueW1jZS5pc1dlYktpdCwNCgkJaXNJRSA9IHRpbnltY2UuaXNJRSwNCgkJYmxvY2tSZSA9IC9eKEhbMS02Ul18UHxESVZ8QUREUkVTU3xQUkV8Rk9STXxUKEFCTEV8Qk9EWXxIRUFEfEZPT1R8SHxSfEQpfExJfE9MfFVMfENBUFRJT058QkxPQ0tRVU9URXxDRU5URVJ8REx8RFR8RER8RElSfEZJRUxEU0VUfE5PU0NSSVBUfE1FTlV8SVNJTkRFWHxTQU1QKSQvLA0KCQlib29sQXR0cnMgPSBtYWtlTWFwKCdjaGVja2VkLGNvbXBhY3QsZGVjbGFyZSxkZWZlcixkaXNhYmxlZCxpc21hcCxtdWx0aXBsZSxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3dyYXAscmVhZG9ubHksc2VsZWN0ZWQnKSwNCgkJbWNlQXR0cmlicyA9IG1ha2VNYXAoJ3NyYyxocmVmLHN0eWxlLGNvb3JkcyxzaGFwZScpLA0KCQllbmNvZGVkQ2hhcnMgPSB7JyYnIDogJyZhbXA7JywgJyInIDogJyZxdW90OycsICc8JyA6ICcmbHQ7JywgJz4nIDogJyZndDsnfSwNCgkJZW5jb2RlQ2hhcnNSZSA9IC9bPD4mXCJdL2csDQoJCXNpbXBsZVNlbGVjdG9yUmUgPSAvXihbYS16MC05XSw/KSskL2ksDQoJCXRhZ1JlZ0V4cCA9IC88KFx3KykoKD86XHMrXHcrKD86XHMqPVxzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKikoXHMqXC8/KT4vZywNCgkJYXR0clJlZ0V4cCA9IC8oXHcrKSg/OlxzKj1ccyooPzooPzoiKCg/OlxcLnxbXiJdKSopIil8KD86JygoPzpcXC58W14nXSkqKScpfChbXj5cc10rKSkpPy9nOw0KDQoJZnVuY3Rpb24gbWFrZU1hcChzdHIpIHsNCgkJdmFyIG1hcCA9IHt9LCBpOw0KDQoJCXN0ciA9IHN0ci5zcGxpdCgnLCcpOw0KCQlmb3IgKGkgPSBzdHIubGVuZ3RoOyBpID49IDA7IGktLSkNCgkJCW1hcFtzdHJbaV1dID0gMTsNCg0KCQlyZXR1cm4gbWFwOw0KCX07DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5kb20uRE9NVXRpbHMnLCB7DQoJCWRvYyA6IG51bGwsDQoJCXJvb3QgOiBudWxsLA0KCQlmaWxlcyA6IG51bGwsDQoJCXBpeGVsU3R5bGVzIDogL14odG9wfGxlZnR8Ym90dG9tfHJpZ2h0fHdpZHRofGhlaWdodHxib3JkZXJXaWR0aCkkLywNCgkJcHJvcHMgOiB7DQoJCQkiZm9yIiA6ICJodG1sRm9yIiwNCgkJCSJjbGFzcyIgOiAiY2xhc3NOYW1lIiwNCgkJCWNsYXNzTmFtZSA6ICJjbGFzc05hbWUiLA0KCQkJY2hlY2tlZCA6ICJjaGVja2VkIiwNCgkJCWRpc2FibGVkIDogImRpc2FibGVkIiwNCgkJCW1heGxlbmd0aCA6ICJtYXhMZW5ndGgiLA0KCQkJcmVhZG9ubHkgOiAicmVhZE9ubHkiLA0KCQkJc2VsZWN0ZWQgOiAic2VsZWN0ZWQiLA0KCQkJdmFsdWUgOiAidmFsdWUiLA0KCQkJaWQgOiAiaWQiLA0KCQkJbmFtZSA6ICJuYW1lIiwNCgkJCXR5cGUgOiAidHlwZSINCgkJfSwNCg0KCQlET01VdGlscyA6IGZ1bmN0aW9uKGQsIHMpIHsNCgkJCXZhciB0ID0gdGhpcywgZ2xvYmFsU3R5bGU7DQoNCgkJCXQuZG9jID0gZDsNCgkJCXQud2luID0gd2luZG93Ow0KCQkJdC5maWxlcyA9IHt9Ow0KCQkJdC5jc3NGbGlja2VyID0gZmFsc2U7DQoJCQl0LmNvdW50ZXIgPSAwOw0KCQkJdC5zdGRNb2RlID0gZC5kb2N1bWVudE1vZGUgPj0gODsNCgkJCXQuYm94TW9kZWwgPSAhdGlueW1jZS5pc0lFIHx8IGQuY29tcGF0TW9kZSA9PSAiQ1NTMUNvbXBhdCIgfHwgdC5zdGRNb2RlOw0KDQoJCQl0LnNldHRpbmdzID0gcyA9IHRpbnltY2UuZXh0ZW5kKHsNCgkJCQlrZWVwX3ZhbHVlcyA6IGZhbHNlLA0KCQkJCWhleF9jb2xvcnMgOiAxLA0KCQkJCXByb2Nlc3NfaHRtbCA6IDENCgkJCX0sIHMpOw0KDQoJCQkvLyBGaXggSUU2U1AyIGZsaWNrZXIgYW5kIGNoZWNrIGl0IGZhaWxlZCBmb3IgcHJlIFNQMg0KCQkJaWYgKHRpbnltY2UuaXNJRTYpIHsNCgkJCQl0cnkgew0KCQkJCQlkLmV4ZWNDb21tYW5kKCdCYWNrZ3JvdW5kSW1hZ2VDYWNoZScsIGZhbHNlLCB0cnVlKTsNCgkJCQl9IGNhdGNoIChlKSB7DQoJCQkJCXQuY3NzRmxpY2tlciA9IHRydWU7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBCdWlsZCBzdHlsZXMgbGlzdA0KCQkJaWYgKHMudmFsaWRfc3R5bGVzKSB7DQoJCQkJdC5fc3R5bGVzID0ge307DQoNCgkJCQkvLyBDb252ZXJ0IHN0eWxlcyBpbnRvIGEgcnVsZSBsaXN0DQoJCQkJZWFjaChzLnZhbGlkX3N0eWxlcywgZnVuY3Rpb24odmFsdWUsIGtleSkgew0KCQkJCQl0Ll9zdHlsZXNba2V5XSA9IHRpbnltY2UuZXhwbG9kZSh2YWx1ZSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXRpbnltY2UuYWRkVW5sb2FkKHQuZGVzdHJveSwgdCk7DQoJCX0sDQoNCgkJZ2V0Um9vdCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJcmV0dXJuIChzICYmIHQuZ2V0KHMucm9vdF9lbGVtZW50KSkgfHwgdC5kb2MuYm9keTsNCgkJfSwNCg0KCQlnZXRWaWV3UG9ydCA6IGZ1bmN0aW9uKHcpIHsNCgkJCXZhciBkLCBiOw0KDQoJCQl3ID0gIXcgPyB0aGlzLndpbiA6IHc7DQoJCQlkID0gdy5kb2N1bWVudDsNCgkJCWIgPSB0aGlzLmJveE1vZGVsID8gZC5kb2N1bWVudEVsZW1lbnQgOiBkLmJvZHk7DQoNCgkJCS8vIFJldHVybnMgdmlld3BvcnQgc2l6ZSBleGNsdWRpbmcgc2Nyb2xsYmFycw0KCQkJcmV0dXJuIHsNCgkJCQl4IDogdy5wYWdlWE9mZnNldCB8fCBiLnNjcm9sbExlZnQsDQoJCQkJeSA6IHcucGFnZVlPZmZzZXQgfHwgYi5zY3JvbGxUb3AsDQoJCQkJdyA6IHcuaW5uZXJXaWR0aCB8fCBiLmNsaWVudFdpZHRoLA0KCQkJCWggOiB3LmlubmVySGVpZ2h0IHx8IGIuY2xpZW50SGVpZ2h0DQoJCQl9Ow0KCQl9LA0KDQoJCWdldFJlY3QgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgcCwgdCA9IHRoaXMsIHNyOw0KDQoJCQllID0gdC5nZXQoZSk7DQoJCQlwID0gdC5nZXRQb3MoZSk7DQoJCQlzciA9IHQuZ2V0U2l6ZShlKTsNCg0KCQkJcmV0dXJuIHsNCgkJCQl4IDogcC54LA0KCQkJCXkgOiBwLnksDQoJCQkJdyA6IHNyLncsDQoJCQkJaCA6IHNyLmgNCgkJCX07DQoJCX0sDQoNCgkJZ2V0U2l6ZSA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpcywgdywgaDsNCg0KCQkJZSA9IHQuZ2V0KGUpOw0KCQkJdyA9IHQuZ2V0U3R5bGUoZSwgJ3dpZHRoJyk7DQoJCQloID0gdC5nZXRTdHlsZShlLCAnaGVpZ2h0Jyk7DQoNCgkJCS8vIE5vbiBwaXhlbCB2YWx1ZSwgdGhlbiBmb3JjZSBvZmZzZXQvY2xpZW50V2lkdGgNCgkJCWlmICh3LmluZGV4T2YoJ3B4JykgPT09IC0xKQ0KCQkJCXcgPSAwOw0KDQoJCQkvLyBOb24gcGl4ZWwgdmFsdWUsIHRoZW4gZm9yY2Ugb2Zmc2V0L2NsaWVudFdpZHRoDQoJCQlpZiAoaC5pbmRleE9mKCdweCcpID09PSAtMSkNCgkJCQloID0gMDsNCg0KCQkJcmV0dXJuIHsNCgkJCQl3IDogcGFyc2VJbnQodykgfHwgZS5vZmZzZXRXaWR0aCB8fCBlLmNsaWVudFdpZHRoLA0KCQkJCWggOiBwYXJzZUludChoKSB8fCBlLm9mZnNldEhlaWdodCB8fCBlLmNsaWVudEhlaWdodA0KCQkJfTsNCgkJfSwNCg0KCQlnZXRQYXJlbnQgOiBmdW5jdGlvbihuLCBmLCByKSB7DQoJCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnRzKG4sIGYsIHIsIGZhbHNlKTsNCgkJfSwNCg0KCQlnZXRQYXJlbnRzIDogZnVuY3Rpb24obiwgZiwgciwgYykgew0KCQkJdmFyIHQgPSB0aGlzLCBuYSwgc2UgPSB0LnNldHRpbmdzLCBvID0gW107DQoNCgkJCW4gPSB0LmdldChuKTsNCgkJCWMgPSBjID09PSB1bmRlZmluZWQ7DQoNCgkJCWlmIChzZS5zdHJpY3Rfcm9vdCkNCgkJCQlyID0gciB8fCB0LmdldFJvb3QoKTsNCg0KCQkJLy8gV3JhcCBub2RlIG5hbWUgYXMgZnVuYw0KCQkJaWYgKGlzKGYsICdzdHJpbmcnKSkgew0KCQkJCW5hID0gZjsNCg0KCQkJCWlmIChmID09PSAnKicpIHsNCgkJCQkJZiA9IGZ1bmN0aW9uKG4pIHtyZXR1cm4gbi5ub2RlVHlwZSA9PSAxO307DQoJCQkJfSBlbHNlIHsNCgkJCQkJZiA9IGZ1bmN0aW9uKG4pIHsNCgkJCQkJCXJldHVybiB0LmlzKG4sIG5hKTsNCgkJCQkJfTsNCgkJCQl9DQoJCQl9DQoNCgkJCXdoaWxlIChuKSB7DQoJCQkJaWYgKG4gPT0gciB8fCAhbi5ub2RlVHlwZSB8fCBuLm5vZGVUeXBlID09PSA5KQ0KCQkJCQlicmVhazsNCg0KCQkJCWlmICghZiB8fCBmKG4pKSB7DQoJCQkJCWlmIChjKQ0KCQkJCQkJby5wdXNoKG4pOw0KCQkJCQllbHNlDQoJCQkJCQlyZXR1cm4gbjsNCgkJCQl9DQoNCgkJCQluID0gbi5wYXJlbnROb2RlOw0KCQkJfQ0KDQoJCQlyZXR1cm4gYyA/IG8gOiBudWxsOw0KCQl9LA0KDQoJCWdldCA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciBuOw0KDQoJCQlpZiAoZSAmJiB0aGlzLmRvYyAmJiB0eXBlb2YoZSkgPT0gJ3N0cmluZycpIHsNCgkJCQluID0gZTsNCgkJCQllID0gdGhpcy5kb2MuZ2V0RWxlbWVudEJ5SWQoZSk7DQoNCgkJCQkvLyBJRSBhbmQgT3BlcmEgcmV0dXJucyBtZXRhIGVsZW1lbnRzIHdoZW4gdGhleSBtYXRjaCB0aGUgc3BlY2lmaWVkIGlucHV0IElELCBidXQgZ2V0RWxlbWVudHNCeU5hbWUgc2VlbXMgdG8gZG8gdGhlIHRyaWNrDQoJCQkJaWYgKGUgJiYgZS5pZCAhPT0gbikNCgkJCQkJcmV0dXJuIHRoaXMuZG9jLmdldEVsZW1lbnRzQnlOYW1lKG4pWzFdOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZTsNCgkJfSwNCg0KCQlnZXROZXh0IDogZnVuY3Rpb24obm9kZSwgc2VsZWN0b3IpIHsNCgkJCXJldHVybiB0aGlzLl9maW5kU2liKG5vZGUsIHNlbGVjdG9yLCAnbmV4dFNpYmxpbmcnKTsNCgkJfSwNCg0KCQlnZXRQcmV2IDogZnVuY3Rpb24obm9kZSwgc2VsZWN0b3IpIHsNCgkJCXJldHVybiB0aGlzLl9maW5kU2liKG5vZGUsIHNlbGVjdG9yLCAncHJldmlvdXNTaWJsaW5nJyk7DQoJCX0sDQoNCg0KCQlzZWxlY3QgOiBmdW5jdGlvbihwYSwgcykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlyZXR1cm4gdGlueW1jZS5kb20uU2l6emxlKHBhLCB0LmdldChzKSB8fCB0LmdldCh0LnNldHRpbmdzLnJvb3RfZWxlbWVudCkgfHwgdC5kb2MsIFtdKTsNCgkJfSwNCg0KCQlpcyA6IGZ1bmN0aW9uKG4sIHNlbGVjdG9yKSB7DQoJCQl2YXIgaTsNCg0KCQkJLy8gSWYgaXQgaXNuJ3QgYW4gYXJyYXkgdGhlbiB0cnkgdG8gZG8gc29tZSBzaW1wbGUgc2VsZWN0b3JzIGluc3RlYWQgb2YgU2l6emxlIGZvciB0byBib29zdCBwZXJmb3JtYW5jZQ0KCQkJaWYgKG4ubGVuZ3RoID09PSB1bmRlZmluZWQpIHsNCgkJCQkvLyBTaW1wbGUgYWxsIHNlbGVjdG9yDQoJCQkJaWYgKHNlbGVjdG9yID09PSAnKicpDQoJCQkJCXJldHVybiBuLm5vZGVUeXBlID09IDE7DQoNCgkJCQkvLyBTaW1wbGUgc2VsZWN0b3IganVzdCBlbGVtZW50cw0KCQkJCWlmIChzaW1wbGVTZWxlY3RvclJlLnRlc3Qoc2VsZWN0b3IpKSB7DQoJCQkJCXNlbGVjdG9yID0gc2VsZWN0b3IudG9Mb3dlckNhc2UoKS5zcGxpdCgvLC8pOw0KCQkJCQluID0gbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KDQoJCQkJCWZvciAoaSA9IHNlbGVjdG9yLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQlpZiAoc2VsZWN0b3JbaV0gPT0gbikNCgkJCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiB0aW55bWNlLmRvbS5TaXp6bGUubWF0Y2hlcyhzZWxlY3Rvciwgbi5ub2RlVHlwZSA/IFtuXSA6IG4pLmxlbmd0aCA+IDA7DQoJCX0sDQoNCg0KCQlhZGQgOiBmdW5jdGlvbihwLCBuLCBhLCBoLCBjKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXJldHVybiB0aGlzLnJ1bihwLCBmdW5jdGlvbihwKSB7DQoJCQkJdmFyIGUsIGs7DQoNCgkJCQllID0gaXMobiwgJ3N0cmluZycpID8gdC5kb2MuY3JlYXRlRWxlbWVudChuKSA6IG47DQoJCQkJdC5zZXRBdHRyaWJzKGUsIGEpOw0KDQoJCQkJaWYgKGgpIHsNCgkJCQkJaWYgKGgubm9kZVR5cGUpDQoJCQkJCQllLmFwcGVuZENoaWxkKGgpOw0KCQkJCQllbHNlDQoJCQkJCQl0LnNldEhUTUwoZSwgaCk7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuICFjID8gcC5hcHBlbmRDaGlsZChlKSA6IGU7DQoJCQl9KTsNCgkJfSwNCg0KCQljcmVhdGUgOiBmdW5jdGlvbihuLCBhLCBoKSB7DQoJCQlyZXR1cm4gdGhpcy5hZGQodGhpcy5kb2MuY3JlYXRlRWxlbWVudChuKSwgbiwgYSwgaCwgMSk7DQoJCX0sDQoNCgkJY3JlYXRlSFRNTCA6IGZ1bmN0aW9uKG4sIGEsIGgpIHsNCgkJCXZhciBvID0gJycsIHQgPSB0aGlzLCBrOw0KDQoJCQlvICs9ICc8JyArIG47DQoNCgkJCWZvciAoayBpbiBhKSB7DQoJCQkJaWYgKGEuaGFzT3duUHJvcGVydHkoaykpDQoJCQkJCW8gKz0gJyAnICsgayArICc9IicgKyB0LmVuY29kZShhW2tdKSArICciJzsNCgkJCX0NCg0KCQkJLy8gQSBjYWxsIHRvIHRpbnltY2UuaXMgZG9lc24ndCB3b3JrIGZvciBzb21lIG9kZCByZWFzb24gb24gSUU5IHBvc3NpYmxlIGJ1ZyBpbnNpZGUgdGhlaXIgSlMgcnVudGltZQ0KCQkJaWYgKHR5cGVvZihoKSAhPSAidW5kZWZpbmVkIikNCgkJCQlyZXR1cm4gbyArICc+JyArIGggKyAnPC8nICsgbiArICc+JzsNCg0KCQkJcmV0dXJuIG8gKyAnIC8+JzsNCgkJfSwNCg0KCQlyZW1vdmUgOiBmdW5jdGlvbihub2RlLCBrZWVwX2NoaWxkcmVuKSB7DQoJCQlyZXR1cm4gdGhpcy5ydW4obm9kZSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCXZhciBwYXJlbnQsIGNoaWxkOw0KDQoJCQkJcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOw0KDQoJCQkJaWYgKCFwYXJlbnQpDQoJCQkJCXJldHVybiBudWxsOw0KDQoJCQkJaWYgKGtlZXBfY2hpbGRyZW4pIHsNCgkJCQkJd2hpbGUgKGNoaWxkID0gbm9kZS5maXJzdENoaWxkKSB7DQoJCQkJCQkvLyBJRSA4IHdpbGwgY3Jhc2ggaWYgeW91IGRvbid0IHJlbW92ZSBjb21wbGV0ZWx5IGVtcHR5IHRleHQgbm9kZXMNCgkJCQkJCWlmICghdGlueW1jZS5pc0lFIHx8IGNoaWxkLm5vZGVUeXBlICE9PSAzIHx8IGNoaWxkLm5vZGVWYWx1ZSkNCgkJCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBub2RlKTsNCgkJCQkJCWVsc2UNCgkJCQkJCQlub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCXJldHVybiBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7DQoJCQl9KTsNCgkJfSwNCg0KCQlzZXRTdHlsZSA6IGZ1bmN0aW9uKG4sIG5hLCB2KSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXJldHVybiB0LnJ1bihuLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIHMsIGk7DQoNCgkJCQlzID0gZS5zdHlsZTsNCg0KCQkJCS8vIENhbWVsY2FzZSBpdCwgaWYgbmVlZGVkDQoJCQkJbmEgPSBuYS5yZXBsYWNlKC8tKFxEKS9nLCBmdW5jdGlvbihhLCBiKXsNCgkJCQkJcmV0dXJuIGIudG9VcHBlckNhc2UoKTsNCgkJCQl9KTsNCg0KCQkJCS8vIERlZmF1bHQgcHggc3VmZml4IG9uIHRoZXNlDQoJCQkJaWYgKHQucGl4ZWxTdHlsZXMudGVzdChuYSkgJiYgKHRpbnltY2UuaXModiwgJ251bWJlcicpIHx8IC9eW1wtMC05XC5dKyQvLnRlc3QodikpKQ0KCQkJCQl2ICs9ICdweCc7DQoNCgkJCQlzd2l0Y2ggKG5hKSB7DQoJCQkJCWNhc2UgJ29wYWNpdHknOg0KCQkJCQkJLy8gSUUgc3BlY2lmaWMgb3BhY2l0eQ0KCQkJCQkJaWYgKGlzSUUpIHsNCgkJCQkJCQlzLmZpbHRlciA9IHYgPT09ICcnID8gJycgOiAiYWxwaGEob3BhY2l0eT0iICsgKHYgKiAxMDApICsgIikiOw0KDQoJCQkJCQkJaWYgKCFuLmN1cnJlbnRTdHlsZSB8fCAhbi5jdXJyZW50U3R5bGUuaGFzTGF5b3V0KQ0KCQkJCQkJCQlzLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gRml4IGZvciBvbGRlciBicm93c2Vycw0KCQkJCQkJc1tuYV0gPSBzWyctbW96LW9wYWNpdHknXSA9IHNbJy1raHRtbC1vcGFjaXR5J10gPSB2IHx8ICcnOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnZmxvYXQnOg0KCQkJCQkJaXNJRSA/IHMuc3R5bGVGbG9hdCA9IHYgOiBzLmNzc0Zsb2F0ID0gdjsNCgkJCQkJCWJyZWFrOw0KCQkJCQkNCgkJCQkJZGVmYXVsdDoNCgkJCQkJCXNbbmFdID0gdiB8fCAnJzsNCgkJCQl9DQoNCgkJCQkvLyBGb3JjZSB1cGRhdGUgb2YgdGhlIHN0eWxlIGRhdGENCgkJCQlpZiAodC5zZXR0aW5ncy51cGRhdGVfc3R5bGVzKQ0KCQkJCQl0LnNldEF0dHJpYihlLCAnX21jZV9zdHlsZScpOw0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0U3R5bGUgOiBmdW5jdGlvbihuLCBuYSwgYykgew0KCQkJbiA9IHRoaXMuZ2V0KG4pOw0KDQoJCQlpZiAoIW4pDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQkvLyBHZWNrbw0KCQkJaWYgKHRoaXMuZG9jLmRlZmF1bHRWaWV3ICYmIGMpIHsNCgkJCQkvLyBSZW1vdmUgY2FtZWxjYXNlDQoJCQkJbmEgPSBuYS5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihhKXsNCgkJCQkJcmV0dXJuICctJyArIGE7DQoJCQkJfSk7DQoNCgkJCQl0cnkgew0KCQkJCQlyZXR1cm4gdGhpcy5kb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShuLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hKTsNCgkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkvLyBPbGQgc2FmYXJpIG1pZ2h0IGZhaWwNCgkJCQkJcmV0dXJuIG51bGw7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBDYW1lbGNhc2UgaXQsIGlmIG5lZWRlZA0KCQkJbmEgPSBuYS5yZXBsYWNlKC8tKFxEKS9nLCBmdW5jdGlvbihhLCBiKXsNCgkJCQlyZXR1cm4gYi50b1VwcGVyQ2FzZSgpOw0KCQkJfSk7DQoNCgkJCWlmIChuYSA9PSAnZmxvYXQnKQ0KCQkJCW5hID0gaXNJRSA/ICdzdHlsZUZsb2F0JyA6ICdjc3NGbG9hdCc7DQoNCgkJCS8vIElFICYgT3BlcmENCgkJCWlmIChuLmN1cnJlbnRTdHlsZSAmJiBjKQ0KCQkJCXJldHVybiBuLmN1cnJlbnRTdHlsZVtuYV07DQoNCgkJCXJldHVybiBuLnN0eWxlW25hXTsNCgkJfSwNCg0KCQlzZXRTdHlsZXMgOiBmdW5jdGlvbihlLCBvKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBvbDsNCg0KCQkJb2wgPSBzLnVwZGF0ZV9zdHlsZXM7DQoJCQlzLnVwZGF0ZV9zdHlsZXMgPSAwOw0KDQoJCQllYWNoKG8sIGZ1bmN0aW9uKHYsIG4pIHsNCgkJCQl0LnNldFN0eWxlKGUsIG4sIHYpOw0KCQkJfSk7DQoNCgkJCS8vIFVwZGF0ZSBzdHlsZSBpbmZvDQoJCQlzLnVwZGF0ZV9zdHlsZXMgPSBvbDsNCgkJCWlmIChzLnVwZGF0ZV9zdHlsZXMpDQoJCQkJdC5zZXRBdHRyaWIoZSwgcy5jc3NUZXh0KTsNCgkJfSwNCg0KCQlzZXRBdHRyaWIgOiBmdW5jdGlvbihlLCBuLCB2KSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCS8vIFdoYXRzIHRoZSBwb2ludA0KCQkJaWYgKCFlIHx8ICFuKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gU3RyaWN0IFhNTCBtb2RlDQoJCQlpZiAodC5zZXR0aW5ncy5zdHJpY3QpDQoJCQkJbiA9IG4udG9Mb3dlckNhc2UoKTsNCg0KCQkJcmV0dXJuIHRoaXMucnVuKGUsIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgcyA9IHQuc2V0dGluZ3M7DQoNCgkJCQlzd2l0Y2ggKG4pIHsNCgkJCQkJY2FzZSAic3R5bGUiOg0KCQkJCQkJaWYgKCFpcyh2LCAnc3RyaW5nJykpIHsNCgkJCQkJCQllYWNoKHYsIGZ1bmN0aW9uKHYsIG4pIHsNCgkJCQkJCQkJdC5zZXRTdHlsZShlLCBuLCB2KTsNCgkJCQkJCQl9KTsNCg0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gTm8gbWNlX3N0eWxlIGZvciBlbGVtZW50cyB3aXRoIHRoZXNlIHNpbmNlIHRoZXkgbWlnaHQgZ2V0IHJlc2l6ZWQgYnkgdGhlIHVzZXINCgkJCQkJCWlmIChzLmtlZXBfdmFsdWVzKSB7DQoJCQkJCQkJaWYgKHYgJiYgIXQuX2lzUmVzKHYpKQ0KCQkJCQkJCQllLnNldEF0dHJpYnV0ZSgnX21jZV9zdHlsZScsIHYsIDIpOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJZS5yZW1vdmVBdHRyaWJ1dGUoJ19tY2Vfc3R5bGUnLCAyKTsNCgkJCQkJCX0NCg0KCQkJCQkJZS5zdHlsZS5jc3NUZXh0ID0gdjsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgImNsYXNzIjoNCgkJCQkJCWUuY2xhc3NOYW1lID0gdiB8fCAnJzsgLy8gRml4IElFIG51bGwgYnVnDQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICJzcmMiOg0KCQkJCQljYXNlICJocmVmIjoNCgkJCQkJCWlmIChzLmtlZXBfdmFsdWVzKSB7DQoJCQkJCQkJaWYgKHMudXJsX2NvbnZlcnRlcikNCgkJCQkJCQkJdiA9IHMudXJsX2NvbnZlcnRlci5jYWxsKHMudXJsX2NvbnZlcnRlcl9zY29wZSB8fCB0LCB2LCBuLCBlKTsNCg0KCQkJCQkJCXQuc2V0QXR0cmliKGUsICdfbWNlXycgKyBuLCB2LCAyKTsNCgkJCQkJCX0NCg0KCQkJCQkJYnJlYWs7DQoJCQkJCQ0KCQkJCQljYXNlICJzaGFwZSI6DQoJCQkJCQllLnNldEF0dHJpYnV0ZSgnX21jZV9zdHlsZScsIHYpOw0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJaWYgKGlzKHYpICYmIHYgIT09IG51bGwgJiYgdi5sZW5ndGggIT09IDApDQoJCQkJCWUuc2V0QXR0cmlidXRlKG4sICcnICsgdiwgMik7DQoJCQkJZWxzZQ0KCQkJCQllLnJlbW92ZUF0dHJpYnV0ZShuLCAyKTsNCgkJCX0pOw0KCQl9LA0KDQoJCXNldEF0dHJpYnMgOiBmdW5jdGlvbihlLCBvKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXJldHVybiB0aGlzLnJ1bihlLCBmdW5jdGlvbihlKSB7DQoJCQkJZWFjaChvLCBmdW5jdGlvbih2LCBuKSB7DQoJCQkJCXQuc2V0QXR0cmliKGUsIG4sIHYpOw0KCQkJCX0pOw0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0QXR0cmliIDogZnVuY3Rpb24oZSwgbiwgZHYpIHsNCgkJCXZhciB2LCB0ID0gdGhpczsNCg0KCQkJZSA9IHQuZ2V0KGUpOw0KDQoJCQlpZiAoIWUgfHwgZS5ub2RlVHlwZSAhPT0gMSkNCgkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCWlmICghaXMoZHYpKQ0KCQkJCWR2ID0gJyc7DQoNCgkJCS8vIFRyeSB0aGUgbWNlIHZhcmlhbnQgZm9yIHRoZXNlDQoJCQlpZiAoL14oc3JjfGhyZWZ8c3R5bGV8Y29vcmRzfHNoYXBlKSQvLnRlc3QobikpIHsNCgkJCQl2ID0gZS5nZXRBdHRyaWJ1dGUoIl9tY2VfIiArIG4pOw0KDQoJCQkJaWYgKHYpDQoJCQkJCXJldHVybiB2Ow0KCQkJfQ0KDQoJCQlpZiAoaXNJRSAmJiB0LnByb3BzW25dKSB7DQoJCQkJdiA9IGVbdC5wcm9wc1tuXV07DQoJCQkJdiA9IHYgJiYgdi5ub2RlVmFsdWUgPyB2Lm5vZGVWYWx1ZSA6IHY7DQoJCQl9DQoNCgkJCWlmICghdikNCgkJCQl2ID0gZS5nZXRBdHRyaWJ1dGUobiwgMik7DQoNCgkJCS8vIENoZWNrIGJvb2xlYW4gYXR0cmlicw0KCQkJaWYgKC9eKGNoZWNrZWR8Y29tcGFjdHxkZWNsYXJlfGRlZmVyfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfG5vaHJlZnxub3NoYWRlfG5vd3JhcHxyZWFkb25seXxzZWxlY3RlZCkkLy50ZXN0KG4pKSB7DQoJCQkJaWYgKGVbdC5wcm9wc1tuXV0gPT09IHRydWUgJiYgdiA9PT0gJycpDQoJCQkJCXJldHVybiBuOw0KDQoJCQkJcmV0dXJuIHYgPyBuIDogJyc7DQoJCQl9DQoNCgkJCS8vIElubmVyIGlucHV0IGVsZW1lbnRzIHdpbGwgb3ZlcnJpZGUgYXR0cmlidXRlcyBvbiBmb3JtIGVsZW1lbnRzDQoJCQlpZiAoZS5ub2RlTmFtZSA9PT0gIkZPUk0iICYmIGUuZ2V0QXR0cmlidXRlTm9kZShuKSkNCgkJCQlyZXR1cm4gZS5nZXRBdHRyaWJ1dGVOb2RlKG4pLm5vZGVWYWx1ZTsNCg0KCQkJaWYgKG4gPT09ICdzdHlsZScpIHsNCgkJCQl2ID0gdiB8fCBlLnN0eWxlLmNzc1RleHQ7DQoNCgkJCQlpZiAodikgew0KCQkJCQl2ID0gdC5zZXJpYWxpemVTdHlsZSh0LnBhcnNlU3R5bGUodiksIGUubm9kZU5hbWUpOw0KDQoJCQkJCWlmICh0LnNldHRpbmdzLmtlZXBfdmFsdWVzICYmICF0Ll9pc1Jlcyh2KSkNCgkJCQkJCWUuc2V0QXR0cmlidXRlKCdfbWNlX3N0eWxlJywgdik7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBSZW1vdmUgQXBwbGUgYW5kIFdlYktpdCBzdHVmZg0KCQkJaWYgKGlzV2ViS2l0ICYmIG4gPT09ICJjbGFzcyIgJiYgdikNCgkJCQl2ID0gdi5yZXBsYWNlKC8oYXBwbGV8d2Via2l0KVwtW2EtelwtXSsvZ2ksICcnKTsNCg0KCQkJLy8gSGFuZGxlIElFIGlzc3Vlcw0KCQkJaWYgKGlzSUUpIHsNCgkJCQlzd2l0Y2ggKG4pIHsNCgkJCQkJY2FzZSAncm93c3Bhbic6DQoJCQkJCWNhc2UgJ2NvbHNwYW4nOg0KCQkJCQkJLy8gSUUgcmV0dXJucyAxIGFzIGRlZmF1bHQgdmFsdWUNCgkJCQkJCWlmICh2ID09PSAxKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnc2l6ZSc6DQoJCQkJCQkvLyBJRSByZXR1cm5zICswIGFzIGRlZmF1bHQgdmFsdWUgZm9yIHNpemUNCgkJCQkJCWlmICh2ID09PSAnKzAnIHx8IHYgPT09IDIwIHx8IHYgPT09IDApDQoJCQkJCQkJdiA9ICcnOw0KDQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICd3aWR0aCc6DQoJCQkJCWNhc2UgJ2hlaWdodCc6DQoJCQkJCWNhc2UgJ3ZzcGFjZSc6DQoJCQkJCWNhc2UgJ2NoZWNrZWQnOg0KCQkJCQljYXNlICdkaXNhYmxlZCc6DQoJCQkJCWNhc2UgJ3JlYWRvbmx5JzoNCgkJCQkJCWlmICh2ID09PSAwKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnaHNwYWNlJzoNCgkJCQkJCS8vIElFIHJldHVybnMgLTEgYXMgZGVmYXVsdCB2YWx1ZQ0KCQkJCQkJaWYgKHYgPT09IC0xKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnbWF4bGVuZ3RoJzoNCgkJCQkJY2FzZSAndGFiaW5kZXgnOg0KCQkJCQkJLy8gSUUgcmV0dXJucyBkZWZhdWx0IHZhbHVlDQoJCQkJCQlpZiAodiA9PT0gMzI3NjggfHwgdiA9PT0gMjE0NzQ4MzY0NyB8fCB2ID09PSAnMzI3NjgnKQ0KCQkJCQkJCXYgPSAnJzsNCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnbXVsdGlwbGUnOg0KCQkJCQljYXNlICdjb21wYWN0JzoNCgkJCQkJY2FzZSAnbm9zaGFkZSc6DQoJCQkJCWNhc2UgJ25vd3JhcCc6DQoJCQkJCQlpZiAodiA9PT0gNjU1MzUpDQoJCQkJCQkJcmV0dXJuIG47DQoNCgkJCQkJCXJldHVybiBkdjsNCg0KCQkJCQljYXNlICdzaGFwZSc6DQoJCQkJCQl2ID0gdi50b0xvd2VyQ2FzZSgpOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJZGVmYXVsdDoNCgkJCQkJCS8vIElFIGhhcyBvZGQgYW5vbnltb3VzIGZ1bmN0aW9uIGZvciBldmVudCBhdHRyaWJ1dGVzDQoJCQkJCQlpZiAobi5pbmRleE9mKCdvbicpID09PSAwICYmIHYpDQoJCQkJCQkJdiA9IHRpbnltY2UuX3JlcGxhY2UoL15mdW5jdGlvblxzK1x3K1woXClccytce1xzKyguKilccytcfSQvLCAnJDEnLCAnJyArIHYpOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuICh2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCAmJiB2ICE9PSAnJykgPyAnJyArIHYgOiBkdjsNCgkJfSwNCg0KCQlnZXRQb3MgOiBmdW5jdGlvbihuLCBybykgew0KCQkJdmFyIHQgPSB0aGlzLCB4ID0gMCwgeSA9IDAsIGUsIGQgPSB0LmRvYywgcjsNCg0KCQkJbiA9IHQuZ2V0KG4pOw0KCQkJcm8gPSBybyB8fCBkLmJvZHk7DQoNCgkJCWlmIChuKSB7DQoJCQkJLy8gVXNlIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBJRSwgT3BlcmEgaGFzIGl0IGJ1dCBpdCdzIG5vdCBwZXJmZWN0DQoJCQkJaWYgKGlzSUUgJiYgIXQuc3RkTW9kZSkgew0KCQkJCQluID0gbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCgkJCQkJZSA9IHQuYm94TW9kZWwgPyBkLmRvY3VtZW50RWxlbWVudCA6IGQuYm9keTsNCgkJCQkJeCA9IHQuZ2V0U3R5bGUodC5zZWxlY3QoJ2h0bWwnKVswXSwgJ2JvcmRlcldpZHRoJyk7IC8vIFJlbW92ZSBib3JkZXINCgkJCQkJeCA9ICh4ID09ICdtZWRpdW0nIHx8IHQuYm94TW9kZWwgJiYgIXQuaXNJRTYpICYmIDIgfHwgeDsNCg0KCQkJCQlyZXR1cm4ge3ggOiBuLmxlZnQgKyBlLnNjcm9sbExlZnQgLSB4LCB5IDogbi50b3AgKyBlLnNjcm9sbFRvcCAtIHh9Ow0KCQkJCX0NCg0KCQkJCXIgPSBuOw0KCQkJCXdoaWxlIChyICYmIHIgIT0gcm8gJiYgci5ub2RlVHlwZSkgew0KCQkJCQl4ICs9IHIub2Zmc2V0TGVmdCB8fCAwOw0KCQkJCQl5ICs9IHIub2Zmc2V0VG9wIHx8IDA7DQoJCQkJCXIgPSByLm9mZnNldFBhcmVudDsNCgkJCQl9DQoNCgkJCQlyID0gbi5wYXJlbnROb2RlOw0KCQkJCXdoaWxlIChyICYmIHIgIT0gcm8gJiYgci5ub2RlVHlwZSkgew0KCQkJCQl4IC09IHIuc2Nyb2xsTGVmdCB8fCAwOw0KCQkJCQl5IC09IHIuc2Nyb2xsVG9wIHx8IDA7DQoJCQkJCXIgPSByLnBhcmVudE5vZGU7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4ge3ggOiB4LCB5IDogeX07DQoJCX0sDQoNCgkJcGFyc2VTdHlsZSA6IGZ1bmN0aW9uKHN0KSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBvID0ge307DQoNCgkJCWlmICghc3QpDQoJCQkJcmV0dXJuIG87DQoNCgkJCWZ1bmN0aW9uIGNvbXByZXNzKHAsIHMsIG90KSB7DQoJCQkJdmFyIHQsIHIsIGIsIGw7DQoNCgkJCQkvLyBHZXQgdmFsdWVzIGFuZCBjaGVjayBpdCBpdCBuZWVkcyBjb21wcmVzc2luZw0KCQkJCXQgPSBvW3AgKyAnLXRvcCcgKyBzXTsNCgkJCQlpZiAoIXQpDQoJCQkJCXJldHVybjsNCg0KCQkJCXIgPSBvW3AgKyAnLXJpZ2h0JyArIHNdOw0KCQkJCWlmICh0ICE9IHIpDQoJCQkJCXJldHVybjsNCg0KCQkJCWIgPSBvW3AgKyAnLWJvdHRvbScgKyBzXTsNCgkJCQlpZiAociAhPSBiKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlsID0gb1twICsgJy1sZWZ0JyArIHNdOw0KCQkJCWlmIChiICE9IGwpDQoJCQkJCXJldHVybjsNCg0KCQkJCS8vIENvbXByZXNzDQoJCQkJb1tvdF0gPSBsOw0KCQkJCWRlbGV0ZSBvW3AgKyAnLXRvcCcgKyBzXTsNCgkJCQlkZWxldGUgb1twICsgJy1yaWdodCcgKyBzXTsNCgkJCQlkZWxldGUgb1twICsgJy1ib3R0b20nICsgc107DQoJCQkJZGVsZXRlIG9bcCArICctbGVmdCcgKyBzXTsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIGNvbXByZXNzMih0YSwgYSwgYiwgYykgew0KCQkJCXZhciB0Ow0KDQoJCQkJdCA9IG9bYV07DQoJCQkJaWYgKCF0KQ0KCQkJCQlyZXR1cm47DQoNCgkJCQl0ID0gb1tiXTsNCgkJCQlpZiAoIXQpDQoJCQkJCXJldHVybjsNCg0KCQkJCXQgPSBvW2NdOw0KCQkJCWlmICghdCkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJLy8gQ29tcHJlc3MNCgkJCQlvW3RhXSA9IG9bYV0gKyAnICcgKyBvW2JdICsgJyAnICsgb1tjXTsNCgkJCQlkZWxldGUgb1thXTsNCgkJCQlkZWxldGUgb1tiXTsNCgkJCQlkZWxldGUgb1tjXTsNCgkJCX07DQoNCgkJCXN0ID0gc3QucmVwbGFjZSgvJigjP1thLXowLTldKyk7L2csICcmJDFfTUNFX1NFTUlfJyk7IC8vIFByb3RlY3QgZW50aXRpZXMNCg0KCQkJZWFjaChzdC5zcGxpdCgnOycpLCBmdW5jdGlvbih2KSB7DQoJCQkJdmFyIHN2LCB1ciA9IFtdOw0KDQoJCQkJaWYgKHYpIHsNCgkJCQkJdiA9IHYucmVwbGFjZSgvX01DRV9TRU1JXy9nLCAnOycpOyAvLyBSZXN0b3JlIGVudGl0aWVzDQoJCQkJCXYgPSB2LnJlcGxhY2UoL3VybFwoW15cKV0rXCkvZywgZnVuY3Rpb24odikge3VyLnB1c2godik7cmV0dXJuICd1cmwoJyArIHVyLmxlbmd0aCArICcpJzt9KTsNCgkJCQkJdiA9IHYuc3BsaXQoJzonKTsNCgkJCQkJc3YgPSB0aW55bWNlLnRyaW0odlsxXSk7DQoJCQkJCXN2ID0gc3YucmVwbGFjZSgvdXJsXCgoW15cKV0rKVwpL2csIGZ1bmN0aW9uKGEsIGIpIHtyZXR1cm4gdXJbcGFyc2VJbnQoYikgLSAxXTt9KTsNCg0KCQkJCQlzdiA9IHN2LnJlcGxhY2UoL3JnYlwoW15cKV0rXCkvZywgZnVuY3Rpb24odikgew0KCQkJCQkJcmV0dXJuIHQudG9IZXgodik7DQoJCQkJCX0pOw0KDQoJCQkJCWlmIChzLnVybF9jb252ZXJ0ZXIpIHsNCgkJCQkJCXN2ID0gc3YucmVwbGFjZSgvdXJsXChbXCdcIl0/KFteXClcJ1wiXSspW1wnXCJdP1wpL2csIGZ1bmN0aW9uKHgsIGMpIHsNCgkJCQkJCQlyZXR1cm4gJ3VybCgnICsgcy51cmxfY29udmVydGVyLmNhbGwocy51cmxfY29udmVydGVyX3Njb3BlIHx8IHQsIHQuZGVjb2RlKGMpLCAnc3R5bGUnLCBudWxsKSArICcpJzsNCgkJCQkJCX0pOw0KCQkJCQl9DQoNCgkJCQkJb1t0aW55bWNlLnRyaW0odlswXSkudG9Mb3dlckNhc2UoKV0gPSBzdjsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJY29tcHJlc3MoImJvcmRlciIsICIiLCAiYm9yZGVyIik7DQoJCQljb21wcmVzcygiYm9yZGVyIiwgIi13aWR0aCIsICJib3JkZXItd2lkdGgiKTsNCgkJCWNvbXByZXNzKCJib3JkZXIiLCAiLWNvbG9yIiwgImJvcmRlci1jb2xvciIpOw0KCQkJY29tcHJlc3MoImJvcmRlciIsICItc3R5bGUiLCAiYm9yZGVyLXN0eWxlIik7DQoJCQljb21wcmVzcygicGFkZGluZyIsICIiLCAicGFkZGluZyIpOw0KCQkJY29tcHJlc3MoIm1hcmdpbiIsICIiLCAibWFyZ2luIik7DQoJCQljb21wcmVzczIoJ2JvcmRlcicsICdib3JkZXItd2lkdGgnLCAnYm9yZGVyLXN0eWxlJywgJ2JvcmRlci1jb2xvcicpOw0KDQoJCQlpZiAoaXNJRSkgew0KCQkJCS8vIFJlbW92ZSBwb2ludGxlc3MgYm9yZGVyDQoJCQkJaWYgKG8uYm9yZGVyID09ICdtZWRpdW0gbm9uZScpDQoJCQkJCW8uYm9yZGVyID0gJyc7DQoJCQl9DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCXNlcmlhbGl6ZVN0eWxlIDogZnVuY3Rpb24obywgbmFtZSkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gJyc7DQoNCgkJCWZ1bmN0aW9uIGFkZCh2LCBrKSB7DQoJCQkJaWYgKGsgJiYgdikgew0KCQkJCQkvLyBSZW1vdmUgYnJvd3NlciBzcGVjaWZpYyBzdHlsZXMgbGlrZSAtbW96LSBvciAtd2Via2l0LQ0KCQkJCQlpZiAoay5pbmRleE9mKCctJykgPT09IDApDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJc3dpdGNoIChrKSB7DQoJCQkJCQljYXNlICdmb250LXdlaWdodCc6DQoJCQkJCQkJLy8gT3BlcmEgd2lsbCBvdXRwdXQgYm9sZCBhcyA3MDANCgkJCQkJCQlpZiAodiA9PSA3MDApDQoJCQkJCQkJCXYgPSAnYm9sZCc7DQoNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJY2FzZSAnY29sb3InOg0KCQkJCQkJY2FzZSAnYmFja2dyb3VuZC1jb2xvcic6DQoJCQkJCQkJdiA9IHYudG9Mb3dlckNhc2UoKTsNCgkJCQkJCQlicmVhazsNCgkJCQkJfQ0KDQoJCQkJCXMgKz0gKHMgPyAnICcgOiAnJykgKyBrICsgJzogJyArIHYgKyAnOyc7DQoJCQkJfQ0KCQkJfTsNCg0KCQkJLy8gVmFsaWRhdGUgc3R5bGUgb3V0cHV0DQoJCQlpZiAobmFtZSAmJiB0Ll9zdHlsZXMpIHsNCgkJCQllYWNoKHQuX3N0eWxlc1snKiddLCBmdW5jdGlvbihuYW1lKSB7DQoJCQkJCWFkZChvW25hbWVdLCBuYW1lKTsNCgkJCQl9KTsNCg0KCQkJCWVhY2godC5fc3R5bGVzW25hbWUudG9Mb3dlckNhc2UoKV0sIGZ1bmN0aW9uKG5hbWUpIHsNCgkJCQkJYWRkKG9bbmFtZV0sIG5hbWUpOw0KCQkJCX0pOw0KCQkJfSBlbHNlDQoJCQkJZWFjaChvLCBhZGQpOw0KDQoJCQlyZXR1cm4gczsNCgkJfSwNCg0KCQlsb2FkQ1NTIDogZnVuY3Rpb24odSkgew0KCQkJdmFyIHQgPSB0aGlzLCBkID0gdC5kb2MsIGhlYWQ7DQoNCgkJCWlmICghdSkNCgkJCQl1ID0gJyc7DQoNCgkJCWhlYWQgPSB0LnNlbGVjdCgnaGVhZCcpWzBdOw0KDQoJCQllYWNoKHUuc3BsaXQoJywnKSwgZnVuY3Rpb24odSkgew0KCQkJCXZhciBsaW5rOw0KDQoJCQkJaWYgKHQuZmlsZXNbdV0pDQoJCQkJCXJldHVybjsNCg0KCQkJCXQuZmlsZXNbdV0gPSB0cnVlOw0KCQkJCWxpbmsgPSB0LmNyZWF0ZSgnbGluaycsIHtyZWwgOiAnc3R5bGVzaGVldCcsIGhyZWYgOiB0aW55bWNlLl9hZGRWZXIodSl9KTsNCg0KCQkJCS8vIElFIDggaGFzIGEgYnVnIHdoZXJlIGR5bmFtaWNhbGx5IGxvYWRpbmcgc3R5bGVzaGVldHMgd291bGQgcHJvZHVjZSBhIDEgaXRlbSByZW1haW5pbmcgYnVnDQoJCQkJLy8gVGhpcyBmaXggc2VlbXMgdG8gcmVzb2x2ZSB0aGF0IGlzc3VlIGJ5IHJlYWxjaW5nIHRoZSBkb2N1bWVudCBvbmVzIGEgc3R5bGVzaGVldCBmaW5pc2hlcyBsb2FkaW5nDQoJCQkJLy8gSXQncyB1Z2x5IGJ1dCBpdCBzZWVtcyB0byB3b3JrIGZpbmUuDQoJCQkJaWYgKGlzSUUgJiYgZC5kb2N1bWVudE1vZGUgJiYgZC5yZWNhbGMpIHsNCgkJCQkJbGluay5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQkJCWQucmVjYWxjKCk7DQoJCQkJCQlsaW5rLm9ubG9hZCA9IG51bGw7DQoJCQkJCX07DQoJCQkJfQ0KDQoJCQkJaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsNCgkJCX0pOw0KCQl9LA0KDQoJCWFkZENsYXNzIDogZnVuY3Rpb24oZSwgYykgew0KCQkJcmV0dXJuIHRoaXMucnVuKGUsIGZ1bmN0aW9uKGUpIHsNCgkJCQl2YXIgbzsNCg0KCQkJCWlmICghYykNCgkJCQkJcmV0dXJuIDA7DQoNCgkJCQlpZiAodGhpcy5oYXNDbGFzcyhlLCBjKSkNCgkJCQkJcmV0dXJuIGUuY2xhc3NOYW1lOw0KDQoJCQkJbyA9IHRoaXMucmVtb3ZlQ2xhc3MoZSwgYyk7DQoNCgkJCQlyZXR1cm4gZS5jbGFzc05hbWUgPSAobyAhPSAnJyA/IChvICsgJyAnKSA6ICcnKSArIGM7DQoJCQl9KTsNCgkJfSwNCg0KCQlyZW1vdmVDbGFzcyA6IGZ1bmN0aW9uKGUsIGMpIHsNCgkJCXZhciB0ID0gdGhpcywgcmU7DQoNCgkJCXJldHVybiB0LnJ1bihlLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIHY7DQoNCgkJCQlpZiAodC5oYXNDbGFzcyhlLCBjKSkgew0KCQkJCQlpZiAoIXJlKQ0KCQkJCQkJcmUgPSBuZXcgUmVnRXhwKCIoXnxcXHMrKSIgKyBjICsgIihcXHMrfCQpIiwgImciKTsNCg0KCQkJCQl2ID0gZS5jbGFzc05hbWUucmVwbGFjZShyZSwgJyAnKTsNCgkJCQkJdiA9IHRpbnltY2UudHJpbSh2ICE9ICcgJyA/IHYgOiAnJyk7DQoNCgkJCQkJZS5jbGFzc05hbWUgPSB2Ow0KDQoJCQkJCS8vIEVtcHR5IGNsYXNzIGF0dHINCgkJCQkJaWYgKCF2KSB7DQoJCQkJCQllLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsNCgkJCQkJCWUucmVtb3ZlQXR0cmlidXRlKCdjbGFzc05hbWUnKTsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiB2Ow0KCQkJCX0NCg0KCQkJCXJldHVybiBlLmNsYXNzTmFtZTsNCgkJCX0pOw0KCQl9LA0KDQoJCWhhc0NsYXNzIDogZnVuY3Rpb24obiwgYykgew0KCQkJbiA9IHRoaXMuZ2V0KG4pOw0KDQoJCQlpZiAoIW4gfHwgIWMpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQlyZXR1cm4gKCcgJyArIG4uY2xhc3NOYW1lICsgJyAnKS5pbmRleE9mKCcgJyArIGMgKyAnICcpICE9PSAtMTsNCgkJfSwNCg0KCQlzaG93IDogZnVuY3Rpb24oZSkgew0KCQkJcmV0dXJuIHRoaXMuc2V0U3R5bGUoZSwgJ2Rpc3BsYXknLCAnYmxvY2snKTsNCgkJfSwNCg0KCQloaWRlIDogZnVuY3Rpb24oZSkgew0KCQkJcmV0dXJuIHRoaXMuc2V0U3R5bGUoZSwgJ2Rpc3BsYXknLCAnbm9uZScpOw0KCQl9LA0KDQoJCWlzSGlkZGVuIDogZnVuY3Rpb24oZSkgew0KCQkJZSA9IHRoaXMuZ2V0KGUpOw0KDQoJCQlyZXR1cm4gIWUgfHwgZS5zdHlsZS5kaXNwbGF5ID09ICdub25lJyB8fCB0aGlzLmdldFN0eWxlKGUsICdkaXNwbGF5JykgPT0gJ25vbmUnOw0KCQl9LA0KDQoJCXVuaXF1ZUlkIDogZnVuY3Rpb24ocCkgew0KCQkJcmV0dXJuICghcCA/ICdtY2VfJyA6IHApICsgKHRoaXMuY291bnRlcisrKTsNCgkJfSwNCg0KCQlzZXRIVE1MIDogZnVuY3Rpb24oZSwgaCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlyZXR1cm4gdGhpcy5ydW4oZSwgZnVuY3Rpb24oZSkgew0KCQkJCXZhciB4LCBpLCBubCwgbiwgcCwgeDsNCg0KCQkJCWggPSB0LnByb2Nlc3NIVE1MKGgpOw0KDQoJCQkJaWYgKGlzSUUpIHsNCgkJCQkJZnVuY3Rpb24gc2V0KCkgew0KCQkJCQkJLy8gUmVtb3ZlIGFsbCBjaGlsZCBub2Rlcw0KCQkJCQkJd2hpbGUgKGUuZmlyc3RDaGlsZCkNCgkJCQkJCQllLmZpcnN0Q2hpbGQucmVtb3ZlTm9kZSgpOw0KDQoJCQkJCQl0cnkgew0KCQkJCQkJCS8vIElFIHdpbGwgcmVtb3ZlIGNvbW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZw0KCQkJCQkJCS8vIHVubGVzcyB5b3UgcGFkZCB0aGUgY29udGVudHMgd2l0aCBzb21ldGhpbmcNCgkJCQkJCQllLmlubmVySFRNTCA9ICc8YnIgLz4nICsgaDsNCgkJCQkJCQllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7DQoJCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJCS8vIElFIHNvbWV0aW1lcyBwcm9kdWNlcyBhbiB1bmtub3duIHJ1bnRpbWUgZXJyb3Igb24gaW5uZXJIVE1MIGlmIGl0J3MgYW4gYmxvY2sgZWxlbWVudCB3aXRoaW4gYSBibG9jayBlbGVtZW50IGZvciBleGFtcGxlIGEgZGl2IGluc2lkZSBhIHANCgkJCQkJCQkvLyBUaGlzIHNlZW1zIHRvIGZpeCB0aGlzIHByb2JsZW0NCg0KCQkJCQkJCS8vIENyZWF0ZSBuZXcgZGl2IHdpdGggSFRNTCBjb250ZW50cyBhbmQgYSBCUiBpbmZyb250IHRvIGtlZXAgY29tbWVudHMNCgkJCQkJCQl4ID0gdC5jcmVhdGUoJ2RpdicpOw0KCQkJCQkJCXguaW5uZXJIVE1MID0gJzxiciAvPicgKyBoOw0KDQoJCQkJCQkJLy8gQWRkIGFsbCBjaGlsZHJlbiBmcm9tIGRpdiB0byB0YXJnZXQNCgkJCQkJCQllYWNoICh4LmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG4sIGkpIHsNCgkJCQkJCQkJLy8gU2tpcCBiciBlbGVtZW50DQoJCQkJCQkJCWlmIChpKQ0KCQkJCQkJCQkJZS5hcHBlbmRDaGlsZChuKTsNCgkJCQkJCQl9KTsNCgkJCQkJCX0NCgkJCQkJfTsNCg0KCQkJCQkvLyBJRSBoYXMgYSBzZXJpb3VzIGJ1ZyB3aGVuIGl0IGNvbWVzIHRvIHBhcmFncmFwaHMgaXQgY2FuIHByb2R1Y2UgYW4gaW52YWxpZA0KCQkJCQkvLyBET00gdHJlZSBpZiBjb250ZW50cyBsaWtlIHRoaXMgPHA+PHVsPjxsaT5JdGVtIDE8L2xpPjwvdWw+PC9wPiBpcyBpbnNlcnRlZA0KCQkJCQkvLyBJdCBzZWVtcyB0byBiZSB0aGF0IElFIGRvZXNuJ3QgbGlrZSBhIHJvb3QgYmxvY2sgZWxlbWVudCBwbGFjZWQgaW5zaWRlIGFub3RoZXIgcm9vdCBibG9jayBlbGVtZW50DQoJCQkJCWlmICh0LnNldHRpbmdzLmZpeF9pZV9wYXJhZ3JhcGhzKQ0KCQkJCQkJaCA9IGgucmVwbGFjZSgvPHA+PFwvcD58PHAoW14+XSspPjxcL3A+fDxwW15cLytdXC8+L2dpLCAnPHAkMSBfbWNlX2tlZXA9InRydWUiPiZuYnNwOzwvcD4nKTsNCg0KCQkJCQlzZXQoKTsNCg0KCQkJCQlpZiAodC5zZXR0aW5ncy5maXhfaWVfcGFyYWdyYXBocykgew0KCQkJCQkJLy8gQ2hlY2sgZm9yIG9kZCBwYXJhZ3JhcGhzIHRoaXMgaXMgYSBzaWduIG9mIGEgYnJva2VuIERPTQ0KCQkJCQkJbmwgPSBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwIik7DQoJCQkJCQlmb3IgKGkgPSBubC5sZW5ndGggLSAxLCB4ID0gMDsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJCQluID0gbmxbaV07DQoNCgkJCQkJCQlpZiAoIW4uaGFzQ2hpbGROb2RlcygpKSB7DQoJCQkJCQkJCWlmICghbi5fbWNlX2tlZXApIHsNCgkJCQkJCQkJCXggPSAxOyAvLyBJcyBicm9rZW4NCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJbi5yZW1vdmVBdHRyaWJ1dGUoJ19tY2Vfa2VlcCcpOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIFRpbWUgdG8gZml4IHRoZSBtYWRuZXNzIElFIGxlZnQgdXMNCgkJCQkJaWYgKHgpIHsNCgkJCQkJCS8vIFNvIGlmIHdlIHJlcGxhY2UgdGhlIHAgZWxlbWVudHMgd2l0aCBkaXZzIGFuZCBtYXJrIHRoZW0gYW5kIHRoZW4gcmVwbGFjZSB0aGVtIGJhY2sgdG8gcGFyYWdyYXBocw0KCQkJCQkJLy8gYWZ0ZXIgd2UgdXNlIGlubmVySFRNTCB3ZSBjYW4gZml4IHRoZSBET00gdHJlZQ0KCQkJCQkJaCA9IGgucmVwbGFjZSgvPHAgKFtePl0rKT58PHA+L2lnLCAnPGRpdiAkMSBfbWNlX3RtcD0iMSI+Jyk7DQoJCQkJCQloID0gaC5yZXBsYWNlKC88XC9wPi9naSwgJzwvZGl2PicpOw0KDQoJCQkJCQkvLyBTZXQgdGhlIG5ldyBIVE1MIHdpdGggRElWcw0KCQkJCQkJc2V0KCk7DQoNCgkJCQkJCS8vIFJlcGxhY2UgYWxsIERJViBlbGVtZW50cyB3aXRoIHRoZSBfbWNlX3RtcCBhdHRpYnV0ZSBiYWNrIHRvIHBhcmFncmFwaHMNCgkJCQkJCS8vIFRoaXMgaXMgbmVlZGVkIHNpbmNlIElFIGhhcyBhIGFubm95aW5nIGJ1ZyBzZWUgYWJvdmUgZm9yIGRldGFpbHMNCgkJCQkJCS8vIFRoaXMgaXMgYSBzbG93IHByb2Nlc3MgYnV0IGl0IGhhcyB0byBiZSBkb25lLiA6KA0KCQkJCQkJaWYgKHQuc2V0dGluZ3MuZml4X2llX3BhcmFncmFwaHMpIHsNCgkJCQkJCQlubCA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkRJViIpOw0KCQkJCQkJCWZvciAoaSA9IG5sLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQkJCW4gPSBubFtpXTsNCg0KCQkJCQkJCQkvLyBJcyBpdCBhIHRlbXAgZGl2DQoJCQkJCQkJCWlmIChuLl9tY2VfdG1wKSB7DQoJCQkJCQkJCQkvLyBDcmVhdGUgbmV3IHBhcmFncmFwaA0KCQkJCQkJCQkJcCA9IHQuZG9jLmNyZWF0ZUVsZW1lbnQoJ3AnKTsNCg0KCQkJCQkJCQkJLy8gQ29weSBhbGwgYXR0cmlidXRlcw0KCQkJCQkJCQkJbi5jbG9uZU5vZGUoZmFsc2UpLm91dGVySFRNTC5yZXBsYWNlKC8oW2EtejAtOVwtX10rKT0vZ2ksIGZ1bmN0aW9uKGEsIGIpIHsNCgkJCQkJCQkJCQl2YXIgdjsNCg0KCQkJCQkJCQkJCWlmIChiICE9PSAnX21jZV90bXAnKSB7DQoJCQkJCQkJCQkJCXYgPSBuLmdldEF0dHJpYnV0ZShiKTsNCg0KCQkJCQkJCQkJCQlpZiAoIXYgJiYgYiA9PT0gJ2NsYXNzJykNCgkJCQkJCQkJCQkJCXYgPSBuLmNsYXNzTmFtZTsNCg0KCQkJCQkJCQkJCQlwLnNldEF0dHJpYnV0ZShiLCB2KTsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQl9KTsNCg0KCQkJCQkJCQkJLy8gQXBwZW5kIGFsbCBjaGlsZHJlbiB0byBuZXcgcGFyYWdyYXBoDQoJCQkJCQkJCQlmb3IgKHggPSAwOyB4PG4uY2hpbGROb2Rlcy5sZW5ndGg7IHgrKykNCgkJCQkJCQkJCQlwLmFwcGVuZENoaWxkKG4uY2hpbGROb2Rlc1t4XS5jbG9uZU5vZGUodHJ1ZSkpOw0KDQoJCQkJCQkJCQkvLyBSZXBsYWNlIGRpdiB3aXRoIG5ldyBwYXJhZ3JhcGgNCgkJCQkJCQkJCW4uc3dhcE5vZGUocCk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9IGVsc2UNCgkJCQkJZS5pbm5lckhUTUwgPSBoOw0KDQoJCQkJcmV0dXJuIGg7DQoJCQl9KTsNCgkJfSwNCg0KCQlwcm9jZXNzSFRNTCA6IGZ1bmN0aW9uKGgpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGNvZGVCbG9ja3MgPSBbXTsNCg0KCQkJaWYgKCFzLnByb2Nlc3NfaHRtbCkNCgkJCQlyZXR1cm4gaDsNCg0KCQkJaWYgKGlzSUUpIHsNCgkJCQloID0gaC5yZXBsYWNlKC8mYXBvczsvZywgJyYjMzk7Jyk7IC8vIElFIGNhbid0IGhhbmRsZSBhcG9zDQoJCQkJaCA9IGgucmVwbGFjZSgvXHMrKGRpc2FibGVkfGNoZWNrZWR8cmVhZG9ubHl8c2VsZWN0ZWQpXHMqPVxzKltcIlwnXT8oZmFsc2V8MClbXCJcJ10/L2dpLCAnJyk7IC8vIElFIGRvZXNuJ3QgaGFuZGxlIGRlZmF1bHQgdmFsdWVzIGNvcnJlY3QNCgkJCX0NCg0KCQkJLy8gRm9yY2UgdGFncyBvcGVuLCBhbmQgb24gSUU5IHJlcGxhY2UgJDEkMiB0aGF0IGdvdCBsZWZ0IGJlaGluZCBkdWUgdG8gYnVncyBpbiB0aGVpciBSZWdFeHAgZW5naW5lDQoJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPGEoICkoW14+XSspXC8+fDxhXC8+L2dpLCAnPGEkMSQyPjwvYT4nLCBoKTsgLy8gRm9yY2Ugb3Blbg0KDQoJCQkvLyBTdG9yZSBhd2F5IHNyYyBhbmQgaHJlZiBpbiBfbWNlX3NyYyBhbmQgbWNlX2hyZWYgc2luY2UgYnJvd3NlcnMgbWVzcyB0aGVtIHVwDQoJCQlpZiAocy5rZWVwX3ZhbHVlcykgew0KCQkJCS8vIFdyYXAgc2NyaXB0cyBhbmQgc3R5bGVzIGluIGNvbW1lbnRzIGZvciBzZXJpYWxpemF0aW9uIHB1cnBvc2VzDQoJCQkJaWYgKC88c2NyaXB0fG5vc2NyaXB0fHN0eWxlL2kudGVzdChoKSkgew0KCQkJCQlmdW5jdGlvbiB0cmltKHMpIHsNCgkJCQkJCS8vIFJlbW92ZSBwcmVmaXggYW5kIHN1ZmZpeCBjb2RlIGZvciBlbGVtZW50DQoJCQkJCQlzID0gcy5yZXBsYWNlKC8oPCEtLVxbQ0RBVEFcW3xcXVxdLS0+KS9nLCAnXG4nKTsNCgkJCQkJCXMgPSBzLnJlcGxhY2UoL15bXHJcbl0qfFtcclxuXSokL2csICcnKTsNCgkJCQkJCXMgPSBzLnJlcGxhY2UoL15ccyooXC9cL1xzKjwhLS18XC9cL1xzKjwhXFtDREFUQVxbfDwhLS18PCFcW0NEQVRBXFspW1xyXG5dKi9nLCAnJyk7DQoJCQkJCQlzID0gcy5yZXBsYWNlKC9ccyooXC9cL1xzKlxdXF0+fFwvXC9ccyotLT58XF1cXT58LS0+fFxdXF0tLT4pXHMqJC9nLCAnJyk7DQoNCgkJCQkJCXJldHVybiBzOw0KCQkJCQl9Ow0KDQoJCQkJCS8vIFdyYXAgdGhlIHNjcmlwdCBjb250ZW50cyBpbiBDREFUQSBhbmQga2VlcCB0aGVtIGZyb20gZXhlY3V0aW5nDQoJCQkJCWggPSBoLnJlcGxhY2UoLzxzY3JpcHQoW14+XSt8KT4oW1xzXFNdKj8pPFwvc2NyaXB0Pi9naSwgZnVuY3Rpb24odiwgYXR0cmlicywgdGV4dCkgew0KCQkJCQkJLy8gRm9yY2UgdHlwZSBhdHRyaWJ1dGUNCgkJCQkJCWlmICghYXR0cmlicykNCgkJCQkJCQlhdHRyaWJzID0gJyB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiJzsNCg0KCQkJCQkJLy8gQ29udmVydCB0aGUgc3JjIGF0dHJpYnV0ZSBvZiB0aGUgc2NyaXB0cw0KCQkJCQkJYXR0cmlicyA9IGF0dHJpYnMucmVwbGFjZSgvc3JjPVwiKFteXCJdKylcIj8vaSwgZnVuY3Rpb24oYSwgdXJsKSB7DQoJCQkJCQkJaWYgKHMudXJsX2NvbnZlcnRlcikNCgkJCQkJCQkJdXJsID0gdC5lbmNvZGUocy51cmxfY29udmVydGVyLmNhbGwocy51cmxfY29udmVydGVyX3Njb3BlIHx8IHQsIHQuZGVjb2RlKHVybCksICdzcmMnLCAnc2NyaXB0JykpOw0KDQoJCQkJCQkJcmV0dXJuICdfbWNlX3NyYz0iJyArIHVybCArICciJzsNCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBXcmFwIHRleHQgY29udGVudHMNCgkJCQkJCWlmICh0aW55bWNlLnRyaW0odGV4dCkpIHsNCgkJCQkJCQljb2RlQmxvY2tzLnB1c2godHJpbSh0ZXh0KSk7DQoJCQkJCQkJdGV4dCA9ICc8IS0tXG5NQ0VfU0NSSVBUOicgKyAoY29kZUJsb2Nrcy5sZW5ndGggLSAxKSArICdcbi8vIC0tPic7DQoJCQkJCQl9DQoNCgkJCQkJCXJldHVybiAnPG1jZTpzY3JpcHQnICsgYXR0cmlicyArICc+JyArIHRleHQgKyAnPC9tY2U6c2NyaXB0Pic7DQoJCQkJCX0pOw0KDQoJCQkJCS8vIFdyYXAgc3R5bGUgZWxlbWVudHMNCgkJCQkJaCA9IGgucmVwbGFjZSgvPHN0eWxlKFtePl0rfCk+KFtcc1xTXSo/KTxcL3N0eWxlPi9naSwgZnVuY3Rpb24odiwgYXR0cmlicywgdGV4dCkgew0KCQkJCQkJLy8gV3JhcCB0ZXh0IGNvbnRlbnRzDQoJCQkJCQlpZiAodGV4dCkgew0KCQkJCQkJCWNvZGVCbG9ja3MucHVzaCh0cmltKHRleHQpKTsNCgkJCQkJCQl0ZXh0ID0gJzwhLS1cbk1DRV9TQ1JJUFQ6JyArIChjb2RlQmxvY2tzLmxlbmd0aCAtIDEpICsgJ1xuLS0+JzsNCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuICc8bWNlOnN0eWxlJyArIGF0dHJpYnMgKyAnPicgKyB0ZXh0ICsgJzwvbWNlOnN0eWxlPjxzdHlsZSAnICsgYXR0cmlicyArICcgX21jZV9ib2d1cz0iMSI+JyArIHRleHQgKyAnPC9zdHlsZT4nOw0KCQkJCQl9KTsNCg0KCQkJCQkvLyBXcmFwIG5vc2NyaXB0IGVsZW1lbnRzDQoJCQkJCWggPSBoLnJlcGxhY2UoLzxub3NjcmlwdChbXj5dK3wpPihbXHNcU10qPyk8XC9ub3NjcmlwdD4vZywgZnVuY3Rpb24odiwgYXR0cmlicywgdGV4dCkgew0KCQkJCQkJcmV0dXJuICc8bWNlOm5vc2NyaXB0JyArIGF0dHJpYnMgKyAnPjwhLS0nICsgdC5lbmNvZGUodGV4dCkucmVwbGFjZSgvLS0vZywgJyYjNDU7JiM0NTsnKSArICctLT48L21jZTpub3NjcmlwdD4nOw0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKylcXVxdPi9nLCAnPCEtLVtDREFUQVskMV1dLS0+JywgaCk7DQoNCgkJCQkvLyBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgYXR0cmlidXRlcyBpbiB0aGUgSFRNTCBzdHJpbmcgdG8gZm9yY2UgYm9vbGVhbg0KCQkJCS8vIGF0dHJpYnV0ZXMgdG8gdGhlIGF0dHI9ImF0dHIiIGZvcm1hdCBhbmQgY29udmVydCBzdHlsZSwgc3JjIGFuZCBocmVmIHRvIF9tY2VfIHZlcnNpb25zDQoJCQkJZnVuY3Rpb24gcHJvY2Vzc1RhZ3MoaHRtbCkgew0KCQkJCQlyZXR1cm4gaHRtbC5yZXBsYWNlKHRhZ1JlZ0V4cCwgZnVuY3Rpb24obWF0Y2gsIGVsbV9uYW1lLCBhdHRycywgZW5kKSB7DQoJCQkJCQlyZXR1cm4gJzwnICsgZWxtX25hbWUgKyBhdHRycy5yZXBsYWNlKGF0dHJSZWdFeHAsIGZ1bmN0aW9uKG1hdGNoLCBuYW1lLCB2YWx1ZSwgdmFsMiwgdmFsMykgew0KCQkJCQkJCXZhciBtY2VWYWx1ZTsNCg0KCQkJCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7DQoJCQkJCQkJdmFsdWUgPSB2YWx1ZSB8fCB2YWwyIHx8IHZhbDMgfHwgIiI7DQoNCgkJCQkJCQkvLyBUcmVhdCBib29sZWFuIGF0dHJpYnV0ZXMNCgkJCQkJCQlpZiAoYm9vbEF0dHJzW25hbWVdKSB7DQoJCQkJCQkJCS8vIGZhbHNlIG9yIDAgaXMgdHJlYXRlZCBhcyBhIG1pc3NpbmcgYXR0cmlidXRlDQoJCQkJCQkJCWlmICh2YWx1ZSA9PT0gJ2ZhbHNlJyB8fCB2YWx1ZSA9PT0gJzAnKQ0KCQkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJCXJldHVybiBuYW1lICsgJz0iJyArIG5hbWUgKyAnIic7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gSXMgYXR0cmlidXRlIG9uZSB0aGF0IG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50DQoJCQkJCQkJaWYgKG1jZUF0dHJpYnNbbmFtZV0gJiYgYXR0cnMuaW5kZXhPZignX21jZV8nICsgbmFtZSkgPT0gLTEpIHsNCgkJCQkJCQkJbWNlVmFsdWUgPSB0LmRlY29kZSh2YWx1ZSk7DQoNCgkJCQkJCQkJLy8gQ29udmVydCBVUkxzIHRvIHJlbGF0aXZlL2Fic29sdXRlIG9uZXMNCgkJCQkJCQkJaWYgKHMudXJsX2NvbnZlcnRlciAmJiAobmFtZSA9PSAic3JjIiB8fCBuYW1lID09ICJocmVmIikpDQoJCQkJCQkJCQltY2VWYWx1ZSA9IHMudXJsX2NvbnZlcnRlci5jYWxsKHMudXJsX2NvbnZlcnRlcl9zY29wZSB8fCB0LCBtY2VWYWx1ZSwgbmFtZSwgZWxtX25hbWUpOw0KDQoJCQkJCQkJCS8vIFByb2Nlc3Mgc3R5bGVzIGxvd2VyY2FzZXMgdGhlbSBhbmQgY29tcHJlc3NlcyB0aGVtDQoJCQkJCQkJCWlmIChuYW1lID09ICdzdHlsZScpDQoJCQkJCQkJCQltY2VWYWx1ZSA9IHQuc2VyaWFsaXplU3R5bGUodC5wYXJzZVN0eWxlKG1jZVZhbHVlKSwgbmFtZSk7DQoNCgkJCQkJCQkJcmV0dXJuIG5hbWUgKyAnPSInICsgdmFsdWUgKyAnIicgKyAnIF9tY2VfJyArIG5hbWUgKyAnPSInICsgdC5lbmNvZGUobWNlVmFsdWUpICsgJyInOw0KCQkJCQkJCX0NCg0KCQkJCQkJCXJldHVybiBtYXRjaDsNCgkJCQkJCX0pICsgZW5kICsgJz4nOw0KCQkJCQl9KTsNCgkJCQl9Ow0KDQoJCQkJaCA9IHByb2Nlc3NUYWdzKGgpOw0KDQoJCQkJLy8gUmVzdG9yZSBzY3JpcHQgYmxvY2tzDQoJCQkJaCA9IGgucmVwbGFjZSgvTUNFX1NDUklQVDooWzAtOV0rKS9nLCBmdW5jdGlvbih2YWwsIGlkeCkgew0KCQkJCQlyZXR1cm4gY29kZUJsb2Nrc1tpZHhdOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlyZXR1cm4gaDsNCgkJfSwNCg0KCQlnZXRPdXRlckhUTUwgOiBmdW5jdGlvbihlKSB7DQoJCQl2YXIgZDsNCg0KCQkJZSA9IHRoaXMuZ2V0KGUpOw0KDQoJCQlpZiAoIWUpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCWlmIChlLm91dGVySFRNTCAhPT0gdW5kZWZpbmVkKQ0KCQkJCXJldHVybiBlLm91dGVySFRNTDsNCg0KCQkJZCA9IChlLm93bmVyRG9jdW1lbnQgfHwgdGhpcy5kb2MpLmNyZWF0ZUVsZW1lbnQoImJvZHkiKTsNCgkJCWQuYXBwZW5kQ2hpbGQoZS5jbG9uZU5vZGUodHJ1ZSkpOw0KDQoJCQlyZXR1cm4gZC5pbm5lckhUTUw7DQoJCX0sDQoNCgkJc2V0T3V0ZXJIVE1MIDogZnVuY3Rpb24oZSwgaCwgZCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlmdW5jdGlvbiBzZXRIVE1MKGUsIGgsIGQpIHsNCgkJCQl2YXIgbiwgdHA7DQoNCgkJCQl0cCA9IGQuY3JlYXRlRWxlbWVudCgiYm9keSIpOw0KCQkJCXRwLmlubmVySFRNTCA9IGg7DQoNCgkJCQluID0gdHAubGFzdENoaWxkOw0KCQkJCXdoaWxlIChuKSB7DQoJCQkJCXQuaW5zZXJ0QWZ0ZXIobi5jbG9uZU5vZGUodHJ1ZSksIGUpOw0KCQkJCQluID0gbi5wcmV2aW91c1NpYmxpbmc7DQoJCQkJfQ0KDQoJCQkJdC5yZW1vdmUoZSk7DQoJCQl9Ow0KDQoJCQlyZXR1cm4gdGhpcy5ydW4oZSwgZnVuY3Rpb24oZSkgew0KCQkJCWUgPSB0LmdldChlKTsNCg0KCQkJCS8vIE9ubHkgc2V0IEhUTUwgb24gZWxlbWVudHMNCgkJCQlpZiAoZS5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJCWQgPSBkIHx8IGUub3duZXJEb2N1bWVudCB8fCB0LmRvYzsNCg0KCQkJCQlpZiAoaXNJRSkgew0KCQkJCQkJdHJ5IHsNCgkJCQkJCQkvLyBUcnkgb3V0ZXJIVE1MIGZvciBJRSBpdCBzb21ldGltZXMgcHJvZHVjZXMgYW4gdW5rbm93biBydW50aW1lIGVycm9yDQoJCQkJCQkJaWYgKGlzSUUgJiYgZS5ub2RlVHlwZSA9PSAxKQ0KCQkJCQkJCQllLm91dGVySFRNTCA9IGg7DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCQlzZXRIVE1MKGUsIGgsIGQpOw0KCQkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCQkvLyBGaXggZm9yIHVua25vd24gcnVudGltZSBlcnJvcg0KCQkJCQkJCXNldEhUTUwoZSwgaCwgZCk7DQoJCQkJCQl9DQoJCQkJCX0gZWxzZQ0KCQkJCQkJc2V0SFRNTChlLCBoLCBkKTsNCgkJCQl9DQoJCQl9KTsNCgkJfSwNCg0KCQlkZWNvZGUgOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgZSwgbiwgdjsNCg0KCQkJLy8gTG9vayBmb3IgZW50aXRpZXMgdG8gZGVjb2RlDQoJCQlpZiAoLyZbXHcjXSs7Ly50ZXN0KHMpKSB7DQoJCQkJLy8gRGVjb2RlIHRoZSBlbnRpdGllcyB1c2luZyBhIGRpdiBlbGVtZW50IG5vdCBzdXBlciBlZmZpY2llbnQgYnV0IGxlc3MgY29kZQ0KCQkJCWUgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCgkJCQllLmlubmVySFRNTCA9IHM7DQoJCQkJbiA9IGUuZmlyc3RDaGlsZDsNCgkJCQl2ID0gJyc7DQoNCgkJCQlpZiAobikgew0KCQkJCQlkbyB7DQoJCQkJCQl2ICs9IG4ubm9kZVZhbHVlOw0KCQkJCQl9IHdoaWxlIChuID0gbi5uZXh0U2libGluZyk7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIHYgfHwgczsNCgkJCX0NCg0KCQkJcmV0dXJuIHM7DQoJCX0sDQoNCgkJZW5jb2RlIDogZnVuY3Rpb24oc3RyKSB7DQoJCQlyZXR1cm4gKCcnICsgc3RyKS5yZXBsYWNlKGVuY29kZUNoYXJzUmUsIGZ1bmN0aW9uKGNocikgew0KCQkJCXJldHVybiBlbmNvZGVkQ2hhcnNbY2hyXTsNCgkJCX0pOw0KCQl9LA0KDQoJCWluc2VydEFmdGVyIDogZnVuY3Rpb24obm9kZSwgcmVmZXJlbmNlX25vZGUpIHsNCgkJCXJlZmVyZW5jZV9ub2RlID0gdGhpcy5nZXQocmVmZXJlbmNlX25vZGUpOw0KDQoJCQlyZXR1cm4gdGhpcy5ydW4obm9kZSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCXZhciBwYXJlbnQsIG5leHRTaWJsaW5nOw0KDQoJCQkJcGFyZW50ID0gcmVmZXJlbmNlX25vZGUucGFyZW50Tm9kZTsNCgkJCQluZXh0U2libGluZyA9IHJlZmVyZW5jZV9ub2RlLm5leHRTaWJsaW5nOw0KDQoJCQkJaWYgKG5leHRTaWJsaW5nKQ0KCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHRTaWJsaW5nKTsNCgkJCQllbHNlDQoJCQkJCXBhcmVudC5hcHBlbmRDaGlsZChub2RlKTsNCg0KCQkJCXJldHVybiBub2RlOw0KCQkJfSk7DQoJCX0sDQoNCgkJaXNCbG9jayA6IGZ1bmN0aW9uKG4pIHsNCgkJCWlmIChuLm5vZGVUeXBlICYmIG4ubm9kZVR5cGUgIT09IDEpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQluID0gbi5ub2RlTmFtZSB8fCBuOw0KDQoJCQlyZXR1cm4gYmxvY2tSZS50ZXN0KG4pOw0KCQl9LA0KDQoJCXJlcGxhY2UgOiBmdW5jdGlvbihuLCBvLCBrKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWlmIChpcyhvLCAnYXJyYXknKSkNCgkJCQluID0gbi5jbG9uZU5vZGUodHJ1ZSk7DQoNCgkJCXJldHVybiB0LnJ1bihvLCBmdW5jdGlvbihvKSB7DQoJCQkJaWYgKGspIHsNCgkJCQkJZWFjaCh0aW55bWNlLmdyZXAoby5jaGlsZE5vZGVzKSwgZnVuY3Rpb24oYykgew0KCQkJCQkJbi5hcHBlbmRDaGlsZChjKTsNCgkJCQkJfSk7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIG8ucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobiwgbyk7DQoJCQl9KTsNCgkJfSwNCg0KCQlyZW5hbWUgOiBmdW5jdGlvbihlbG0sIG5hbWUpIHsNCgkJCXZhciB0ID0gdGhpcywgbmV3RWxtOw0KDQoJCQlpZiAoZWxtLm5vZGVOYW1lICE9IG5hbWUudG9VcHBlckNhc2UoKSkgew0KCQkJCS8vIFJlbmFtZSBibG9jayBlbGVtZW50DQoJCQkJbmV3RWxtID0gdC5jcmVhdGUobmFtZSk7DQoNCgkJCQkvLyBDb3B5IGF0dHJpYnMgdG8gbmV3IGJsb2NrDQoJCQkJZWFjaCh0LmdldEF0dHJpYnMoZWxtKSwgZnVuY3Rpb24oYXR0cl9ub2RlKSB7DQoJCQkJCXQuc2V0QXR0cmliKG5ld0VsbSwgYXR0cl9ub2RlLm5vZGVOYW1lLCB0LmdldEF0dHJpYihlbG0sIGF0dHJfbm9kZS5ub2RlTmFtZSkpOw0KCQkJCX0pOw0KDQoJCQkJLy8gUmVwbGFjZSBibG9jaw0KCQkJCXQucmVwbGFjZShuZXdFbG0sIGVsbSwgMSk7DQoJCQl9DQoNCgkJCXJldHVybiBuZXdFbG0gfHwgZWxtOw0KCQl9LA0KDQoJCWZpbmRDb21tb25BbmNlc3RvciA6IGZ1bmN0aW9uKGEsIGIpIHsNCgkJCXZhciBwcyA9IGEsIHBlOw0KDQoJCQl3aGlsZSAocHMpIHsNCgkJCQlwZSA9IGI7DQoNCgkJCQl3aGlsZSAocGUgJiYgcHMgIT0gcGUpDQoJCQkJCXBlID0gcGUucGFyZW50Tm9kZTsNCg0KCQkJCWlmIChwcyA9PSBwZSkNCgkJCQkJYnJlYWs7DQoNCgkJCQlwcyA9IHBzLnBhcmVudE5vZGU7DQoJCQl9DQoNCgkJCWlmICghcHMgJiYgYS5vd25lckRvY3VtZW50KQ0KCQkJCXJldHVybiBhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KDQoJCQlyZXR1cm4gcHM7DQoJCX0sDQoNCgkJdG9IZXggOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgYyA9IC9eXHMqcmdiXHMqP1woXHMqPyhbMC05XSspXHMqPyxccyo/KFswLTldKylccyo/LFxzKj8oWzAtOV0rKVxzKj9cKVxzKiQvaS5leGVjKHMpOw0KDQoJCQlmdW5jdGlvbiBoZXgocykgew0KCQkJCXMgPSBwYXJzZUludChzKS50b1N0cmluZygxNik7DQoNCgkJCQlyZXR1cm4gcy5sZW5ndGggPiAxID8gcyA6ICcwJyArIHM7IC8vIDAgLT4gMDANCgkJCX07DQoNCgkJCWlmIChjKSB7DQoJCQkJcyA9ICcjJyArIGhleChjWzFdKSArIGhleChjWzJdKSArIGhleChjWzNdKTsNCg0KCQkJCXJldHVybiBzOw0KCQkJfQ0KDQoJCQlyZXR1cm4gczsNCgkJfSwNCg0KCQlnZXRDbGFzc2VzIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNsID0gW10sIGksIGxvID0ge30sIGYgPSB0LnNldHRpbmdzLmNsYXNzX2ZpbHRlciwgb3Y7DQoNCgkJCWlmICh0LmNsYXNzZXMpDQoJCQkJcmV0dXJuIHQuY2xhc3NlczsNCg0KCQkJZnVuY3Rpb24gYWRkQ2xhc3NlcyhzKSB7DQoJCQkJLy8gSUUgc3R5bGUgaW1wb3J0cw0KCQkJCWVhY2gocy5pbXBvcnRzLCBmdW5jdGlvbihyKSB7DQoJCQkJCWFkZENsYXNzZXMocik7DQoJCQkJfSk7DQoNCgkJCQllYWNoKHMuY3NzUnVsZXMgfHwgcy5ydWxlcywgZnVuY3Rpb24ocikgew0KCQkJCQkvLyBSZWFsIHR5cGUgb3IgZmFrZSBpdCBvbiBJRQ0KCQkJCQlzd2l0Y2ggKHIudHlwZSB8fCAxKSB7DQoJCQkJCQkvLyBSdWxlDQoJCQkJCQljYXNlIDE6DQoJCQkJCQkJaWYgKHIuc2VsZWN0b3JUZXh0KSB7DQoJCQkJCQkJCWVhY2goci5zZWxlY3RvclRleHQuc3BsaXQoJywnKSwgZnVuY3Rpb24odikgew0KCQkJCQkJCQkJdiA9IHYucmVwbGFjZSgvXlxzKnxccyokfF5cc1wuL2csICIiKTsNCg0KCQkJCQkJCQkJLy8gSXMgaW50ZXJuYWwgb3IgaXQgZG9lc24ndCBjb250YWluIGEgY2xhc3MNCgkJCQkJCQkJCWlmICgvXC5tY2UvLnRlc3QodikgfHwgIS9cLltcd1wtXSskLy50ZXN0KHYpKQ0KCQkJCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJCQkJLy8gUmVtb3ZlIGV2ZXJ5dGhpbmcgYnV0IGNsYXNzIG5hbWUNCgkJCQkJCQkJCW92ID0gdjsNCgkJCQkJCQkJCXYgPSB0aW55bWNlLl9yZXBsYWNlKC8uKlwuKFthLXowLTlfXC1dKykuKi9pLCAnJDEnLCB2KTsNCg0KCQkJCQkJCQkJLy8gRmlsdGVyIGNsYXNzZXMNCgkJCQkJCQkJCWlmIChmICYmICEodiA9IGYodiwgb3YpKSkNCgkJCQkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCQkJCWlmICghbG9bdl0pIHsNCgkJCQkJCQkJCQljbC5wdXNoKHsnY2xhc3MnIDogdn0pOw0KCQkJCQkJCQkJCWxvW3ZdID0gMTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfSk7DQoJCQkJCQkJfQ0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQkvLyBJbXBvcnQNCgkJCQkJCWNhc2UgMzoNCgkJCQkJCQlhZGRDbGFzc2VzKHIuc3R5bGVTaGVldCk7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX07DQoNCgkJCXRyeSB7DQoJCQkJZWFjaCh0LmRvYy5zdHlsZVNoZWV0cywgYWRkQ2xhc3Nlcyk7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJCS8vIElnbm9yZQ0KCQkJfQ0KDQoJCQlpZiAoY2wubGVuZ3RoID4gMCkNCgkJCQl0LmNsYXNzZXMgPSBjbDsNCg0KCQkJcmV0dXJuIGNsOw0KCQl9LA0KDQoJCXJ1biA6IGZ1bmN0aW9uKGUsIGYsIHMpIHsNCgkJCXZhciB0ID0gdGhpcywgbzsNCg0KCQkJaWYgKHQuZG9jICYmIHR5cGVvZihlKSA9PT0gJ3N0cmluZycpDQoJCQkJZSA9IHQuZ2V0KGUpOw0KDQoJCQlpZiAoIWUpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQlzID0gcyB8fCB0aGlzOw0KCQkJaWYgKCFlLm5vZGVUeXBlICYmIChlLmxlbmd0aCB8fCBlLmxlbmd0aCA9PT0gMCkpIHsNCgkJCQlvID0gW107DQoNCgkJCQllYWNoKGUsIGZ1bmN0aW9uKGUsIGkpIHsNCgkJCQkJaWYgKGUpIHsNCgkJCQkJCWlmICh0eXBlb2YoZSkgPT0gJ3N0cmluZycpDQoJCQkJCQkJZSA9IHQuZG9jLmdldEVsZW1lbnRCeUlkKGUpOw0KDQoJCQkJCQlvLnB1c2goZi5jYWxsKHMsIGUsIGkpKTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIG87DQoJCQl9DQoNCgkJCXJldHVybiBmLmNhbGwocywgZSk7DQoJCX0sDQoNCgkJZ2V0QXR0cmlicyA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciBvOw0KDQoJCQluID0gdGhpcy5nZXQobik7DQoNCgkJCWlmICghbikNCgkJCQlyZXR1cm4gW107DQoNCgkJCWlmIChpc0lFKSB7DQoJCQkJbyA9IFtdOw0KDQoJCQkJLy8gT2JqZWN0IHdpbGwgdGhyb3cgZXhjZXB0aW9uIGluIElFDQoJCQkJaWYgKG4ubm9kZU5hbWUgPT0gJ09CSkVDVCcpDQoJCQkJCXJldHVybiBuLmF0dHJpYnV0ZXM7DQoNCgkJCQkvLyBJRSBkb2Vzbid0IGtlZXAgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZSBpZiB5b3UgY2xvbmUgb3B0aW9uIGVsZW1lbnRzDQoJCQkJaWYgKG4ubm9kZU5hbWUgPT09ICdPUFRJT04nICYmIHRoaXMuZ2V0QXR0cmliKG4sICdzZWxlY3RlZCcpKQ0KCQkJCQlvLnB1c2goe3NwZWNpZmllZCA6IDEsIG5vZGVOYW1lIDogJ3NlbGVjdGVkJ30pOw0KDQoJCQkJLy8gSXQncyBjcmF6eSB0aGF0IHRoaXMgaXMgZmFzdGVyIGluIElFIGJ1dCBpdCdzIGJlY2F1c2UgaXQgcmV0dXJucyBhbGwgYXR0cmlidXRlcyBhbGwgdGhlIHRpbWUNCgkJCQluLmNsb25lTm9kZShmYWxzZSkub3V0ZXJIVE1MLnJlcGxhY2UoLzxcLz9bXHc6XC1dKyA/fD1bXCJdW15cIl0rXCJ8PVwnW15cJ10rXCd8PVtcd1wtXSt8Pi9naSwgJycpLnJlcGxhY2UoL1tcdzpcLV0rL2dpLCBmdW5jdGlvbihhKSB7DQoJCQkJCW8ucHVzaCh7c3BlY2lmaWVkIDogMSwgbm9kZU5hbWUgOiBhfSk7DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm4gbzsNCgkJCX0NCg0KCQkJcmV0dXJuIG4uYXR0cmlidXRlczsNCgkJfSwNCg0KCQlkZXN0cm95IDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAodC5ldmVudHMpDQoJCQkJdC5ldmVudHMuZGVzdHJveSgpOw0KDQoJCQl0LndpbiA9IHQuZG9jID0gdC5yb290ID0gdC5ldmVudHMgPSBudWxsOw0KDQoJCQkvLyBNYW51YWwgZGVzdHJveSB0aGVuIHJlbW92ZSB1bmxvYWQgaGFuZGxlcg0KCQkJaWYgKCFzKQ0KCQkJCXRpbnltY2UucmVtb3ZlVW5sb2FkKHQuZGVzdHJveSk7DQoJCX0sDQoNCgkJY3JlYXRlUm5nIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgZCA9IHRoaXMuZG9jOw0KDQoJCQlyZXR1cm4gZC5jcmVhdGVSYW5nZSA/IGQuY3JlYXRlUmFuZ2UoKSA6IG5ldyB0aW55bWNlLmRvbS5SYW5nZSh0aGlzKTsNCgkJfSwNCg0KCQlub2RlSW5kZXggOiBmdW5jdGlvbihub2RlLCBub3JtYWxpemVkKSB7DQoJCQl2YXIgaWR4ID0gMCwgbGFzdE5vZGVUeXBlLCBsYXN0Tm9kZSwgbm9kZVR5cGU7DQoNCgkJCWlmIChub2RlKSB7DQoJCQkJZm9yIChsYXN0Tm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlLCBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcsIGxhc3ROb2RlID0gbm9kZTsgbm9kZTsgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSB7DQoJCQkJCW5vZGVUeXBlID0gbm9kZS5ub2RlVHlwZTsNCg0KCQkJCQkvLyBOb3JtYWxpemUgdGV4dCBub2Rlcw0KCQkJCQlpZiAobm9ybWFsaXplZCAmJiBub2RlVHlwZSA9PSAzKSB7DQoJCQkJCQlpZiAobm9kZVR5cGUgPT0gbGFzdE5vZGVUeXBlIHx8ICFub2RlLm5vZGVWYWx1ZS5sZW5ndGgpDQoJCQkJCQkJY29udGludWU7DQoJCQkJCX0NCg0KCQkJCQlpZHgrKzsNCgkJCQkJbGFzdE5vZGVUeXBlID0gbm9kZVR5cGU7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gaWR4Ow0KCQl9LA0KDQoJCXNwbGl0IDogZnVuY3Rpb24ocGUsIGUsIHJlKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHIgPSB0LmNyZWF0ZVJuZygpLCBiZWYsIGFmdCwgcGE7DQoNCgkJCS8vIFczQyB2YWxpZCBicm93c2VycyB0ZW5kIHRvIGxlYXZlIGVtcHR5IG5vZGVzIHRvIHRoZSBsZWZ0L3JpZ2h0IHNpZGUgb2YgdGhlIGNvbnRlbnRzLCB0aGlzIG1ha2VzIHNlbnNlDQoJCQkvLyBidXQgd2UgZG9uJ3Qgd2FudCB0aGF0IGluIG91ciBjb2RlIHNpbmNlIGl0IHNlcnZlcyBubyBwdXJwb3NlIGZvciB0aGUgZW5kIHVzZXINCgkJCS8vIEZvciBleGFtcGxlIGlmIHRoaXMgaXMgY2hvcHBlZDoNCgkJCS8vICAgPHA+dGV4dCAxPHNwYW4+PGI+Q0hPUDwvYj48L3NwYW4+dGV4dCAyPC9wPg0KCQkJLy8gd291bGQgcHJvZHVjZToNCgkJCS8vICAgPHA+dGV4dCAxPHNwYW4+PC9zcGFuPjwvcD48Yj5DSE9QPC9iPjxwPjxzcGFuPjwvc3Bhbj50ZXh0IDI8L3A+DQoJCQkvLyB0aGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiB0cmltIG9mIGVtcHR5IGVkZ2VzIGFuZCBwcm9kdWNlOg0KCQkJLy8gICA8cD50ZXh0IDE8L3A+PGI+Q0hPUDwvYj48cD50ZXh0IDI8L3A+DQoJCQlmdW5jdGlvbiB0cmltKG5vZGUpIHsNCgkJCQl2YXIgaSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7DQoNCgkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuZ2V0QXR0cmlidXRlKCdfbWNlX3R5cGUnKSA9PSAnYm9va21hcmsnKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlmb3IgKGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkNCgkJCQkJdHJpbShjaGlsZHJlbltpXSk7DQoNCgkJCQlpZiAobm9kZS5ub2RlVHlwZSAhPSA5KSB7DQoJCQkJCS8vIEtlZXAgbm9uIHdoaXRlc3BhY2UgdGV4dCBub2Rlcw0KCQkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmIG5vZGUubm9kZVZhbHVlLmxlbmd0aCA+IDApIHsNCgkJCQkJCS8vIElmIHBhcmVudCBlbGVtZW50IGlzbid0IGEgYmxvY2sgb3IgdGhlcmUgaXNuJ3QgYW55IHVzZWZ1bCBjb250ZW50cyBmb3IgZXhhbXBsZSAiPHA+ICAgPC9wPiINCgkJCQkJCWlmICghdC5pc0Jsb2NrKG5vZGUucGFyZW50Tm9kZSkgfHwgdGlueW1jZS50cmltKG5vZGUubm9kZVZhbHVlKS5sZW5ndGggPiAwKQ0KCQkJCQkJCXJldHVybjsNCgkJCQkJfQ0KDQoJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDEpIHsNCgkJCQkJCS8vIElmIHRoZSBvbmx5IGNoaWxkIGlzIGEgYm9va21hcmsgdGhlbiBtb3ZlIGl0IHVwDQoJCQkJCQljaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlczsNCgkJCQkJCWlmIChjaGlsZHJlbi5sZW5ndGggPT0gMSAmJiBjaGlsZHJlblswXSAmJiBjaGlsZHJlblswXS5ub2RlVHlwZSA9PSAxICYmIGNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZSgnX21jZV90eXBlJykgPT0gJ2Jvb2ttYXJrJykNCgkJCQkJCQlub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkcmVuWzBdLCBub2RlKTsNCg0KCQkJCQkJLy8gS2VlcCBub24gZW1wdHkgZWxlbWVudHMgb3IgaW1nLCBociBldGMNCgkJCQkJCWlmIChjaGlsZHJlbi5sZW5ndGggfHwgL14oYnJ8aHJ8aW5wdXR8aW1nKSQvaS50ZXN0KG5vZGUubm9kZU5hbWUpKQ0KCQkJCQkJCXJldHVybjsNCgkJCQkJfQ0KDQoJCQkJCXQucmVtb3ZlKG5vZGUpOw0KCQkJCX0NCg0KCQkJCXJldHVybiBub2RlOw0KCQkJfTsNCg0KCQkJaWYgKHBlICYmIGUpIHsNCgkJCQkvLyBHZXQgYmVmb3JlIGNodW5rDQoJCQkJci5zZXRTdGFydChwZS5wYXJlbnROb2RlLCB0Lm5vZGVJbmRleChwZSkpOw0KCQkJCXIuc2V0RW5kKGUucGFyZW50Tm9kZSwgdC5ub2RlSW5kZXgoZSkpOw0KCQkJCWJlZiA9IHIuZXh0cmFjdENvbnRlbnRzKCk7DQoNCgkJCQkvLyBHZXQgYWZ0ZXIgY2h1bmsNCgkJCQlyID0gdC5jcmVhdGVSbmcoKTsNCgkJCQlyLnNldFN0YXJ0KGUucGFyZW50Tm9kZSwgdC5ub2RlSW5kZXgoZSkgKyAxKTsNCgkJCQlyLnNldEVuZChwZS5wYXJlbnROb2RlLCB0Lm5vZGVJbmRleChwZSkgKyAxKTsNCgkJCQlhZnQgPSByLmV4dHJhY3RDb250ZW50cygpOw0KDQoJCQkJLy8gSW5zZXJ0IGJlZm9yZSBjaHVuaw0KCQkJCXBhID0gcGUucGFyZW50Tm9kZTsNCgkJCQlwYS5pbnNlcnRCZWZvcmUodHJpbShiZWYpLCBwZSk7DQoNCgkJCQkvLyBJbnNlcnQgbWlkZGxlIGNodW5rDQoJCQkJaWYgKHJlKQ0KCQkJCQlwYS5yZXBsYWNlQ2hpbGQocmUsIGUpOw0KCQkJCWVsc2UNCgkJCQkJcGEuaW5zZXJ0QmVmb3JlKGUsIHBlKTsNCg0KCQkJCS8vIEluc2VydCBhZnRlciBjaHVuaw0KCQkJCXBhLmluc2VydEJlZm9yZSh0cmltKGFmdCksIHBlKTsNCgkJCQl0LnJlbW92ZShwZSk7DQoNCgkJCQlyZXR1cm4gcmUgfHwgZTsNCgkJCX0NCgkJfSwNCg0KCQliaW5kIDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCBmdW5jLCBzY29wZSkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoIXQuZXZlbnRzKQ0KCQkJCXQuZXZlbnRzID0gbmV3IHRpbnltY2UuZG9tLkV2ZW50VXRpbHMoKTsNCg0KCQkJcmV0dXJuIHQuZXZlbnRzLmFkZCh0YXJnZXQsIG5hbWUsIGZ1bmMsIHNjb3BlIHx8IHRoaXMpOw0KCQl9LA0KDQoJCXVuYmluZCA6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgZnVuYykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoIXQuZXZlbnRzKQ0KCQkJCXQuZXZlbnRzID0gbmV3IHRpbnltY2UuZG9tLkV2ZW50VXRpbHMoKTsNCg0KCQkJcmV0dXJuIHQuZXZlbnRzLnJlbW92ZSh0YXJnZXQsIG5hbWUsIGZ1bmMpOw0KCQl9LA0KDQoNCgkJX2ZpbmRTaWIgOiBmdW5jdGlvbihub2RlLCBzZWxlY3RvciwgbmFtZSkgew0KCQkJdmFyIHQgPSB0aGlzLCBmID0gc2VsZWN0b3I7DQoNCgkJCWlmIChub2RlKSB7DQoJCQkJLy8gSWYgZXhwcmVzc2lvbiBtYWtlIGEgZnVuY3Rpb24gb2YgaXQgdXNpbmcgaXMNCgkJCQlpZiAoaXMoZiwgJ3N0cmluZycpKSB7DQoJCQkJCWYgPSBmdW5jdGlvbihub2RlKSB7DQoJCQkJCQlyZXR1cm4gdC5pcyhub2RlLCBzZWxlY3Rvcik7DQoJCQkJCX07DQoJCQkJfQ0KDQoJCQkJLy8gTG9vcCBhbGwgc2libGluZ3MNCgkJCQlmb3IgKG5vZGUgPSBub2RlW25hbWVdOyBub2RlOyBub2RlID0gbm9kZVtuYW1lXSkgew0KCQkJCQlpZiAoZihub2RlKSkNCgkJCQkJCXJldHVybiBub2RlOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIG51bGw7DQoJCX0sDQoNCgkJX2lzUmVzIDogZnVuY3Rpb24oYykgew0KCQkJLy8gSXMgbGl2ZSByZXNpemJsZSBlbGVtZW50DQoJCQlyZXR1cm4gL14odG9wfGxlZnR8Ym90dG9tfHJpZ2h0fHdpZHRofGhlaWdodCkvaS50ZXN0KGMpIHx8IC87XHMqKHRvcHxsZWZ0fGJvdHRvbXxyaWdodHx3aWR0aHxoZWlnaHQpL2kudGVzdChjKTsNCgkJfQ0KDQoJCS8qDQoJCXdhbGsgOiBmdW5jdGlvbihuLCBmLCBzKSB7DQoJCQl2YXIgZCA9IHRoaXMuZG9jLCB3Ow0KDQoJCQlpZiAoZC5jcmVhdGVUcmVlV2Fsa2VyKSB7DQoJCQkJdyA9IGQuY3JlYXRlVHJlZVdhbGtlcihuLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCwgbnVsbCwgZmFsc2UpOw0KDQoJCQkJd2hpbGUgKChuID0gdy5uZXh0Tm9kZSgpKSAhPSBudWxsKQ0KCQkJCQlmLmNhbGwocyB8fCB0aGlzLCBuKTsNCgkJCX0gZWxzZQ0KCQkJCXRpbnltY2Uud2FsayhuLCBmLCAnY2hpbGROb2RlcycsIHMpOw0KCQl9DQoJCSovDQoNCgkJLyoNCgkJdG9SR0IgOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgYyA9IC9eXHMqPyMoWzAtOUEtRl17Mn0pKFswLTlBLUZdezEsMn0pKFswLTlBLUZdezJ9KT9ccyo/JC8uZXhlYyhzKTsNCg0KCQkJaWYgKGMpIHsNCgkJCQkvLyAjRkZGIC0+ICNGRkZGRkYNCgkJCQlpZiAoIWlzKGNbM10pKQ0KCQkJCQljWzNdID0gY1syXSA9IGNbMV07DQoNCgkJCQlyZXR1cm4gInJnYigiICsgcGFyc2VJbnQoY1sxXSwgMTYpICsgIiwiICsgcGFyc2VJbnQoY1syXSwgMTYpICsgIiwiICsgcGFyc2VJbnQoY1szXSwgMTYpICsgIikiOw0KCQkJfQ0KDQoJCQlyZXR1cm4gczsNCgkJfQ0KCQkqLw0KCX0pOw0KDQoJdGlueW1jZS5ET00gPSBuZXcgdGlueW1jZS5kb20uRE9NVXRpbHMoZG9jdW1lbnQsIHtwcm9jZXNzX2h0bWwgOiAwfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKG5zKSB7DQoJLy8gUmFuZ2UgY29uc3RydWN0b3INCglmdW5jdGlvbiBSYW5nZShkb20pIHsNCgkJdmFyIHQgPSB0aGlzLA0KCQkJZG9jID0gZG9tLmRvYywNCgkJCUVYVFJBQ1QgPSAwLA0KCQkJQ0xPTkUgPSAxLA0KCQkJREVMRVRFID0gMiwNCgkJCVRSVUUgPSB0cnVlLA0KCQkJRkFMU0UgPSBmYWxzZSwNCgkJCVNUQVJUX09GRlNFVCA9ICdzdGFydE9mZnNldCcsDQoJCQlTVEFSVF9DT05UQUlORVIgPSAnc3RhcnRDb250YWluZXInLA0KCQkJRU5EX0NPTlRBSU5FUiA9ICdlbmRDb250YWluZXInLA0KCQkJRU5EX09GRlNFVCA9ICdlbmRPZmZzZXQnLA0KCQkJZXh0ZW5kID0gdGlueW1jZS5leHRlbmQsDQoJCQlub2RlSW5kZXggPSBkb20ubm9kZUluZGV4Ow0KDQoJCWV4dGVuZCh0LCB7DQoJCQkvLyBJbml0YWwgc3RhdGVzDQoJCQlzdGFydENvbnRhaW5lciA6IGRvYywNCgkJCXN0YXJ0T2Zmc2V0IDogMCwNCgkJCWVuZENvbnRhaW5lciA6IGRvYywNCgkJCWVuZE9mZnNldCA6IDAsDQoJCQljb2xsYXBzZWQgOiBUUlVFLA0KCQkJY29tbW9uQW5jZXN0b3JDb250YWluZXIgOiBkb2MsDQoNCgkJCS8vIFJhbmdlIGNvbnN0YW50cw0KCQkJU1RBUlRfVE9fU1RBUlQgOiAwLA0KCQkJU1RBUlRfVE9fRU5EIDogMSwNCgkJCUVORF9UT19FTkQgOiAyLA0KCQkJRU5EX1RPX1NUQVJUIDogMywNCg0KCQkJLy8gUHVibGljIG1ldGhvZHMNCgkJCXNldFN0YXJ0IDogc2V0U3RhcnQsDQoJCQlzZXRFbmQgOiBzZXRFbmQsDQoJCQlzZXRTdGFydEJlZm9yZSA6IHNldFN0YXJ0QmVmb3JlLA0KCQkJc2V0U3RhcnRBZnRlciA6IHNldFN0YXJ0QWZ0ZXIsDQoJCQlzZXRFbmRCZWZvcmUgOiBzZXRFbmRCZWZvcmUsDQoJCQlzZXRFbmRBZnRlciA6IHNldEVuZEFmdGVyLA0KCQkJY29sbGFwc2UgOiBjb2xsYXBzZSwNCgkJCXNlbGVjdE5vZGUgOiBzZWxlY3ROb2RlLA0KCQkJc2VsZWN0Tm9kZUNvbnRlbnRzIDogc2VsZWN0Tm9kZUNvbnRlbnRzLA0KCQkJY29tcGFyZUJvdW5kYXJ5UG9pbnRzIDogY29tcGFyZUJvdW5kYXJ5UG9pbnRzLA0KCQkJZGVsZXRlQ29udGVudHMgOiBkZWxldGVDb250ZW50cywNCgkJCWV4dHJhY3RDb250ZW50cyA6IGV4dHJhY3RDb250ZW50cywNCgkJCWNsb25lQ29udGVudHMgOiBjbG9uZUNvbnRlbnRzLA0KCQkJaW5zZXJ0Tm9kZSA6IGluc2VydE5vZGUsDQoJCQlzdXJyb3VuZENvbnRlbnRzIDogc3Vycm91bmRDb250ZW50cywNCgkJCWNsb25lUmFuZ2UgOiBjbG9uZVJhbmdlDQoJCX0pOw0KDQoJCWZ1bmN0aW9uIHNldFN0YXJ0KG4sIG8pIHsNCgkJCV9zZXRFbmRQb2ludChUUlVFLCBuLCBvKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZXRFbmQobiwgbykgew0KCQkJX3NldEVuZFBvaW50KEZBTFNFLCBuLCBvKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZXRTdGFydEJlZm9yZShuKSB7DQoJCQlzZXRTdGFydChuLnBhcmVudE5vZGUsIG5vZGVJbmRleChuKSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gc2V0U3RhcnRBZnRlcihuKSB7DQoJCQlzZXRTdGFydChuLnBhcmVudE5vZGUsIG5vZGVJbmRleChuKSArIDEpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHNldEVuZEJlZm9yZShuKSB7DQoJCQlzZXRFbmQobi5wYXJlbnROb2RlLCBub2RlSW5kZXgobikpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHNldEVuZEFmdGVyKG4pIHsNCgkJCXNldEVuZChuLnBhcmVudE5vZGUsIG5vZGVJbmRleChuKSArIDEpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGNvbGxhcHNlKHRzKSB7DQoJCQlpZiAodHMpIHsNCgkJCQl0W0VORF9DT05UQUlORVJdID0gdFtTVEFSVF9DT05UQUlORVJdOw0KCQkJCXRbRU5EX09GRlNFVF0gPSB0W1NUQVJUX09GRlNFVF07DQoJCQl9IGVsc2Ugew0KCQkJCXRbU1RBUlRfQ09OVEFJTkVSXSA9IHRbRU5EX0NPTlRBSU5FUl07DQoJCQkJdFtTVEFSVF9PRkZTRVRdID0gdFtFTkRfT0ZGU0VUXTsNCgkJCX0NCg0KCQkJdC5jb2xsYXBzZWQgPSBUUlVFOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHNlbGVjdE5vZGUobikgew0KCQkJc2V0U3RhcnRCZWZvcmUobik7DQoJCQlzZXRFbmRBZnRlcihuKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBzZWxlY3ROb2RlQ29udGVudHMobikgew0KCQkJc2V0U3RhcnQobiwgMCk7DQoJCQlzZXRFbmQobiwgbi5ub2RlVHlwZSA9PT0gMSA/IG4uY2hpbGROb2Rlcy5sZW5ndGggOiBuLm5vZGVWYWx1ZS5sZW5ndGgpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGNvbXBhcmVCb3VuZGFyeVBvaW50cyhoLCByKSB7DQoJCQl2YXIgc2MgPSB0W1NUQVJUX0NPTlRBSU5FUl0sIHNvID0gdFtTVEFSVF9PRkZTRVRdLCBlYyA9IHRbRU5EX0NPTlRBSU5FUl0sIGVvID0gdFtFTkRfT0ZGU0VUXTsNCg0KCQkJLy8gQ2hlY2sgU1RBUlRfVE9fU1RBUlQNCgkJCWlmIChoID09PSAwKQ0KCQkJCXJldHVybiBfY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHNjLCBzbywgc2MsIHNvKTsNCg0KCQkJLy8gQ2hlY2sgU1RBUlRfVE9fRU5EDQoJCQlpZiAoaCA9PT0gMSkNCgkJCQlyZXR1cm4gX2NvbXBhcmVCb3VuZGFyeVBvaW50cyhzYywgc28sIGVjLCBlbyk7DQoNCgkJCS8vIENoZWNrIEVORF9UT19FTkQNCgkJCWlmIChoID09PSAyKQ0KCQkJCXJldHVybiBfY29tcGFyZUJvdW5kYXJ5UG9pbnRzKGVjLCBlbywgZWMsIGVvKTsNCg0KCQkJLy8gQ2hlY2sgRU5EX1RPX1NUQVJUDQoJCQlpZiAoaCA9PT0gMykNCgkJCQlyZXR1cm4gX2NvbXBhcmVCb3VuZGFyeVBvaW50cyhlYywgZW8sIHNjLCBzbyk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZGVsZXRlQ29udGVudHMoKSB7DQoJCQlfdHJhdmVyc2UoREVMRVRFKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBleHRyYWN0Q29udGVudHMoKSB7DQoJCQlyZXR1cm4gX3RyYXZlcnNlKEVYVFJBQ1QpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGNsb25lQ29udGVudHMoKSB7DQoJCQlyZXR1cm4gX3RyYXZlcnNlKENMT05FKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBpbnNlcnROb2RlKG4pIHsNCgkJCXZhciBzdGFydENvbnRhaW5lciA9IHRoaXNbU1RBUlRfQ09OVEFJTkVSXSwNCgkJCQlzdGFydE9mZnNldCA9IHRoaXNbU1RBUlRfT0ZGU0VUXSwgbm4sIG87DQoNCgkJCS8vIE5vZGUgaXMgVEVYVF9OT0RFIG9yIENEQVRBDQoJCQlpZiAoKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSAzIHx8IHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSA0KSAmJiBzdGFydENvbnRhaW5lci5ub2RlVmFsdWUpIHsNCgkJCQlpZiAoIXN0YXJ0T2Zmc2V0KSB7DQoJCQkJCS8vIEF0IHRoZSBzdGFydCBvZiB0ZXh0DQoJCQkJCXN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG4sIHN0YXJ0Q29udGFpbmVyKTsNCgkJCQl9IGVsc2UgaWYgKHN0YXJ0T2Zmc2V0ID49IHN0YXJ0Q29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGgpIHsNCgkJCQkJLy8gQXQgdGhlIGVuZCBvZiB0ZXh0DQoJCQkJCWRvbS5pbnNlcnRBZnRlcihuLCBzdGFydENvbnRhaW5lcik7DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gTWlkZGxlLCBuZWVkIHRvIHNwbGl0DQoJCQkJCW5uID0gc3RhcnRDb250YWluZXIuc3BsaXRUZXh0KHN0YXJ0T2Zmc2V0KTsNCgkJCQkJc3RhcnRDb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobiwgbm4pOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJLy8gSW5zZXJ0IGVsZW1lbnQgbm9kZQ0KCQkJCWlmIChzdGFydENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCA+IDApDQoJCQkJCW8gPSBzdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3N0YXJ0T2Zmc2V0XTsNCg0KCQkJCWlmIChvKQ0KCQkJCQlzdGFydENvbnRhaW5lci5pbnNlcnRCZWZvcmUobiwgbyk7DQoJCQkJZWxzZQ0KCQkJCQlzdGFydENvbnRhaW5lci5hcHBlbmRDaGlsZChuKTsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBzdXJyb3VuZENvbnRlbnRzKG4pIHsNCgkJCXZhciBmID0gdC5leHRyYWN0Q29udGVudHMoKTsNCg0KCQkJdC5pbnNlcnROb2RlKG4pOw0KCQkJbi5hcHBlbmRDaGlsZChmKTsNCgkJCXQuc2VsZWN0Tm9kZShuKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBjbG9uZVJhbmdlKCkgew0KCQkJcmV0dXJuIGV4dGVuZChuZXcgUmFuZ2UoZG9tKSwgew0KCQkJCXN0YXJ0Q29udGFpbmVyIDogdFtTVEFSVF9DT05UQUlORVJdLA0KCQkJCXN0YXJ0T2Zmc2V0IDogdFtTVEFSVF9PRkZTRVRdLA0KCQkJCWVuZENvbnRhaW5lciA6IHRbRU5EX0NPTlRBSU5FUl0sDQoJCQkJZW5kT2Zmc2V0IDogdFtFTkRfT0ZGU0VUXSwNCgkJCQljb2xsYXBzZWQgOiB0LmNvbGxhcHNlZCwNCgkJCQljb21tb25BbmNlc3RvckNvbnRhaW5lciA6IHQuY29tbW9uQW5jZXN0b3JDb250YWluZXINCgkJCX0pOw0KCQl9Ow0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KDQoJCWZ1bmN0aW9uIF9nZXRTZWxlY3RlZE5vZGUoY29udGFpbmVyLCBvZmZzZXQpIHsNCgkJCXZhciBjaGlsZDsNCg0KCQkJaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PSAzIC8qIFRFWFRfTk9ERSAqLykNCgkJCQlyZXR1cm4gY29udGFpbmVyOw0KDQoJCQlpZiAob2Zmc2V0IDwgMCkNCgkJCQlyZXR1cm4gY29udGFpbmVyOw0KDQoJCQljaGlsZCA9IGNvbnRhaW5lci5maXJzdENoaWxkOw0KCQkJd2hpbGUgKGNoaWxkICYmIG9mZnNldCA+IDApIHsNCgkJCQktLW9mZnNldDsNCgkJCQljaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nOw0KCQkJfQ0KDQoJCQlpZiAoY2hpbGQpDQoJCQkJcmV0dXJuIGNoaWxkOw0KDQoJCQlyZXR1cm4gY29udGFpbmVyOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF9pc0NvbGxhcHNlZCgpIHsNCgkJCXJldHVybiAodFtTVEFSVF9DT05UQUlORVJdID09IHRbRU5EX0NPTlRBSU5FUl0gJiYgdFtTVEFSVF9PRkZTRVRdID09IHRbRU5EX09GRlNFVF0pOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF9jb21wYXJlQm91bmRhcnlQb2ludHMoY29udGFpbmVyQSwgb2Zmc2V0QSwgY29udGFpbmVyQiwgb2Zmc2V0Qikgew0KCQkJdmFyIGMsIG9mZnNldEMsIG4sIGNtblJvb3QsIGNoaWxkQSwgY2hpbGRCOw0KDQoJCQkvLyBJbiB0aGUgZmlyc3QgY2FzZSB0aGUgYm91bmRhcnktcG9pbnRzIGhhdmUgdGhlIHNhbWUgY29udGFpbmVyLiBBIGlzIGJlZm9yZSBCDQoJCQkvLyBpZiBpdHMgb2Zmc2V0IGlzIGxlc3MgdGhhbiB0aGUgb2Zmc2V0IG9mIEIsIEEgaXMgZXF1YWwgdG8gQiBpZiBpdHMgb2Zmc2V0IGlzDQoJCQkvLyBlcXVhbCB0byB0aGUgb2Zmc2V0IG9mIEIsIGFuZCBBIGlzIGFmdGVyIEIgaWYgaXRzIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gdGhlDQoJCQkvLyBvZmZzZXQgb2YgQi4NCgkJCWlmIChjb250YWluZXJBID09IGNvbnRhaW5lckIpIHsNCgkJCQlpZiAob2Zmc2V0QSA9PSBvZmZzZXRCKQ0KCQkJCQlyZXR1cm4gMDsgLy8gZXF1YWwNCg0KCQkJCWlmIChvZmZzZXRBIDwgb2Zmc2V0QikNCgkJCQkJcmV0dXJuIC0xOyAvLyBiZWZvcmUNCg0KCQkJCXJldHVybiAxOyAvLyBhZnRlcg0KCQkJfQ0KDQoJCQkvLyBJbiB0aGUgc2Vjb25kIGNhc2UgYSBjaGlsZCBub2RlIEMgb2YgdGhlIGNvbnRhaW5lciBvZiBBIGlzIGFuIGFuY2VzdG9yDQoJCQkvLyBjb250YWluZXIgb2YgQi4gSW4gdGhpcyBjYXNlLCBBIGlzIGJlZm9yZSBCIGlmIHRoZSBvZmZzZXQgb2YgQSBpcyBsZXNzIHRoYW4gb3INCgkJCS8vIGVxdWFsIHRvIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgbm9kZSBDIGFuZCBBIGlzIGFmdGVyIEIgb3RoZXJ3aXNlLg0KCQkJYyA9IGNvbnRhaW5lckI7DQoJCQl3aGlsZSAoYyAmJiBjLnBhcmVudE5vZGUgIT0gY29udGFpbmVyQSkNCgkJCQljID0gYy5wYXJlbnROb2RlOw0KDQoJCQlpZiAoYykgew0KCQkJCW9mZnNldEMgPSAwOw0KCQkJCW4gPSBjb250YWluZXJBLmZpcnN0Q2hpbGQ7DQoNCgkJCQl3aGlsZSAobiAhPSBjICYmIG9mZnNldEMgPCBvZmZzZXRBKSB7DQoJCQkJCW9mZnNldEMrKzsNCgkJCQkJbiA9IG4ubmV4dFNpYmxpbmc7DQoJCQkJfQ0KDQoJCQkJaWYgKG9mZnNldEEgPD0gb2Zmc2V0QykNCgkJCQkJcmV0dXJuIC0xOyAvLyBiZWZvcmUNCg0KCQkJCXJldHVybiAxOyAvLyBhZnRlcg0KCQkJfQ0KDQoJCQkvLyBJbiB0aGUgdGhpcmQgY2FzZSBhIGNoaWxkIG5vZGUgQyBvZiB0aGUgY29udGFpbmVyIG9mIEIgaXMgYW4gYW5jZXN0b3IgY29udGFpbmVyDQoJCQkvLyBvZiBBLiBJbiB0aGlzIGNhc2UsIEEgaXMgYmVmb3JlIEIgaWYgdGhlIGluZGV4IG9mIHRoZSBjaGlsZCBub2RlIEMgaXMgbGVzcyB0aGFuDQoJCQkvLyB0aGUgb2Zmc2V0IG9mIEIgYW5kIEEgaXMgYWZ0ZXIgQiBvdGhlcndpc2UuDQoJCQljID0gY29udGFpbmVyQTsNCgkJCXdoaWxlIChjICYmIGMucGFyZW50Tm9kZSAhPSBjb250YWluZXJCKSB7DQoJCQkJYyA9IGMucGFyZW50Tm9kZTsNCgkJCX0NCg0KCQkJaWYgKGMpIHsNCgkJCQlvZmZzZXRDID0gMDsNCgkJCQluID0gY29udGFpbmVyQi5maXJzdENoaWxkOw0KDQoJCQkJd2hpbGUgKG4gIT0gYyAmJiBvZmZzZXRDIDwgb2Zmc2V0Qikgew0KCQkJCQlvZmZzZXRDKys7DQoJCQkJCW4gPSBuLm5leHRTaWJsaW5nOw0KCQkJCX0NCg0KCQkJCWlmIChvZmZzZXRDIDwgb2Zmc2V0QikNCgkJCQkJcmV0dXJuIC0xOyAvLyBiZWZvcmUNCg0KCQkJCXJldHVybiAxOyAvLyBhZnRlcg0KCQkJfQ0KDQoJCQkvLyBJbiB0aGUgZm91cnRoIGNhc2UsIG5vbmUgb2YgdGhyZWUgb3RoZXIgY2FzZXMgaG9sZDogdGhlIGNvbnRhaW5lcnMgb2YgQSBhbmQgQg0KCQkJLy8gYXJlIHNpYmxpbmdzIG9yIGRlc2NlbmRhbnRzIG9mIHNpYmxpbmcgbm9kZXMuIEluIHRoaXMgY2FzZSwgQSBpcyBiZWZvcmUgQiBpZg0KCQkJLy8gdGhlIGNvbnRhaW5lciBvZiBBIGlzIGJlZm9yZSB0aGUgY29udGFpbmVyIG9mIEIgaW4gYSBwcmUtb3JkZXIgdHJhdmVyc2FsIG9mIHRoZQ0KCQkJLy8gUmFuZ2VzJyBjb250ZXh0IHRyZWUgYW5kIEEgaXMgYWZ0ZXIgQiBvdGhlcndpc2UuDQoJCQljbW5Sb290ID0gZG9tLmZpbmRDb21tb25BbmNlc3Rvcihjb250YWluZXJBLCBjb250YWluZXJCKTsNCgkJCWNoaWxkQSA9IGNvbnRhaW5lckE7DQoNCgkJCXdoaWxlIChjaGlsZEEgJiYgY2hpbGRBLnBhcmVudE5vZGUgIT0gY21uUm9vdCkNCgkJCQljaGlsZEEgPSBjaGlsZEEucGFyZW50Tm9kZTsNCg0KCQkJaWYgKCFjaGlsZEEpDQoJCQkJY2hpbGRBID0gY21uUm9vdDsNCg0KCQkJY2hpbGRCID0gY29udGFpbmVyQjsNCgkJCXdoaWxlIChjaGlsZEIgJiYgY2hpbGRCLnBhcmVudE5vZGUgIT0gY21uUm9vdCkNCgkJCQljaGlsZEIgPSBjaGlsZEIucGFyZW50Tm9kZTsNCg0KCQkJaWYgKCFjaGlsZEIpDQoJCQkJY2hpbGRCID0gY21uUm9vdDsNCg0KCQkJaWYgKGNoaWxkQSA9PSBjaGlsZEIpDQoJCQkJcmV0dXJuIDA7IC8vIGVxdWFsDQoNCgkJCW4gPSBjbW5Sb290LmZpcnN0Q2hpbGQ7DQoJCQl3aGlsZSAobikgew0KCQkJCWlmIChuID09IGNoaWxkQSkNCgkJCQkJcmV0dXJuIC0xOyAvLyBiZWZvcmUNCg0KCQkJCWlmIChuID09IGNoaWxkQikNCgkJCQkJcmV0dXJuIDE7IC8vIGFmdGVyDQoNCgkJCQluID0gbi5uZXh0U2libGluZzsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBfc2V0RW5kUG9pbnQoc3QsIG4sIG8pIHsNCgkJCXZhciBlYywgc2M7DQoNCgkJCWlmIChzdCkgew0KCQkJCXRbU1RBUlRfQ09OVEFJTkVSXSA9IG47DQoJCQkJdFtTVEFSVF9PRkZTRVRdID0gbzsNCgkJCX0gZWxzZSB7DQoJCQkJdFtFTkRfQ09OVEFJTkVSXSA9IG47DQoJCQkJdFtFTkRfT0ZGU0VUXSA9IG87DQoJCQl9DQoNCgkJCS8vIElmIG9uZSBib3VuZGFyeS1wb2ludCBvZiBhIFJhbmdlIGlzIHNldCB0byBoYXZlIGEgcm9vdCBjb250YWluZXINCgkJCS8vIG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgb25lIGZvciB0aGUgUmFuZ2UsIHRoZSBSYW5nZSBpcyBjb2xsYXBzZWQgdG8NCgkJCS8vIHRoZSBuZXcgcG9zaXRpb24uIFRoaXMgZW5mb3JjZXMgdGhlIHJlc3RyaWN0aW9uIHRoYXQgYm90aCBib3VuZGFyeS0NCgkJCS8vIHBvaW50cyBvZiBhIFJhbmdlIG11c3QgaGF2ZSB0aGUgc2FtZSByb290IGNvbnRhaW5lci4NCgkJCWVjID0gdFtFTkRfQ09OVEFJTkVSXTsNCgkJCXdoaWxlIChlYy5wYXJlbnROb2RlKQ0KCQkJCWVjID0gZWMucGFyZW50Tm9kZTsNCg0KCQkJc2MgPSB0W1NUQVJUX0NPTlRBSU5FUl07DQoJCQl3aGlsZSAoc2MucGFyZW50Tm9kZSkNCgkJCQlzYyA9IHNjLnBhcmVudE5vZGU7DQoNCgkJCWlmIChzYyA9PSBlYykgew0KCQkJCS8vIFRoZSBzdGFydCBwb3NpdGlvbiBvZiBhIFJhbmdlIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgYWZ0ZXIgdGhlDQoJCQkJLy8gZW5kIHBvc2l0aW9uLiBUbyBlbmZvcmNlIHRoaXMgcmVzdHJpY3Rpb24sIGlmIHRoZSBzdGFydCBpcyBzZXQgdG8NCgkJCQkvLyBiZSBhdCBhIHBvc2l0aW9uIGFmdGVyIHRoZSBlbmQsIHRoZSBSYW5nZSBpcyBjb2xsYXBzZWQgdG8gdGhhdA0KCQkJCS8vIHBvc2l0aW9uLg0KCQkJCWlmIChfY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHRbU1RBUlRfQ09OVEFJTkVSXSwgdFtTVEFSVF9PRkZTRVRdLCB0W0VORF9DT05UQUlORVJdLCB0W0VORF9PRkZTRVRdKSA+IDApDQoJCQkJCXQuY29sbGFwc2Uoc3QpOw0KCQkJfSBlbHNlDQoJCQkJdC5jb2xsYXBzZShzdCk7DQoNCgkJCXQuY29sbGFwc2VkID0gX2lzQ29sbGFwc2VkKCk7DQoJCQl0LmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyID0gZG9tLmZpbmRDb21tb25BbmNlc3Rvcih0W1NUQVJUX0NPTlRBSU5FUl0sIHRbRU5EX0NPTlRBSU5FUl0pOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZShob3cpIHsNCgkJCXZhciBjLCBlbmRDb250YWluZXJEZXB0aCA9IDAsIHN0YXJ0Q29udGFpbmVyRGVwdGggPSAwLCBwLCBkZXB0aERpZmYsIHN0YXJ0Tm9kZSwgZW5kTm9kZSwgc3AsIGVwOw0KDQoJCQlpZiAodFtTVEFSVF9DT05UQUlORVJdID09IHRbRU5EX0NPTlRBSU5FUl0pDQoJCQkJcmV0dXJuIF90cmF2ZXJzZVNhbWVDb250YWluZXIoaG93KTsNCg0KCQkJZm9yIChjID0gdFtFTkRfQ09OVEFJTkVSXSwgcCA9IGMucGFyZW50Tm9kZTsgcDsgYyA9IHAsIHAgPSBwLnBhcmVudE5vZGUpIHsNCgkJCQlpZiAocCA9PSB0W1NUQVJUX0NPTlRBSU5FUl0pDQoJCQkJCXJldHVybiBfdHJhdmVyc2VDb21tb25TdGFydENvbnRhaW5lcihjLCBob3cpOw0KDQoJCQkJKytlbmRDb250YWluZXJEZXB0aDsNCgkJCX0NCg0KCQkJZm9yIChjID0gdFtTVEFSVF9DT05UQUlORVJdLCBwID0gYy5wYXJlbnROb2RlOyBwOyBjID0gcCwgcCA9IHAucGFyZW50Tm9kZSkgew0KCQkJCWlmIChwID09IHRbRU5EX0NPTlRBSU5FUl0pDQoJCQkJCXJldHVybiBfdHJhdmVyc2VDb21tb25FbmRDb250YWluZXIoYywgaG93KTsNCg0KCQkJCSsrc3RhcnRDb250YWluZXJEZXB0aDsNCgkJCX0NCg0KCQkJZGVwdGhEaWZmID0gc3RhcnRDb250YWluZXJEZXB0aCAtIGVuZENvbnRhaW5lckRlcHRoOw0KDQoJCQlzdGFydE5vZGUgPSB0W1NUQVJUX0NPTlRBSU5FUl07DQoJCQl3aGlsZSAoZGVwdGhEaWZmID4gMCkgew0KCQkJCXN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlOw0KCQkJCWRlcHRoRGlmZi0tOw0KCQkJfQ0KDQoJCQllbmROb2RlID0gdFtFTkRfQ09OVEFJTkVSXTsNCgkJCXdoaWxlIChkZXB0aERpZmYgPCAwKSB7DQoJCQkJZW5kTm9kZSA9IGVuZE5vZGUucGFyZW50Tm9kZTsNCgkJCQlkZXB0aERpZmYrKzsNCgkJCX0NCg0KCQkJLy8gYXNjZW5kIHRoZSBhbmNlc3RvciBoaWVyYXJjaHkgdW50aWwgd2UgaGF2ZSBhIGNvbW1vbiBwYXJlbnQuDQoJCQlmb3IgKHNwID0gc3RhcnROb2RlLnBhcmVudE5vZGUsIGVwID0gZW5kTm9kZS5wYXJlbnROb2RlOyBzcCAhPSBlcDsgc3AgPSBzcC5wYXJlbnROb2RlLCBlcCA9IGVwLnBhcmVudE5vZGUpIHsNCgkJCQlzdGFydE5vZGUgPSBzcDsNCgkJCQllbmROb2RlID0gZXA7DQoJCQl9DQoNCgkJCXJldHVybiBfdHJhdmVyc2VDb21tb25BbmNlc3RvcnMoc3RhcnROb2RlLCBlbmROb2RlLCBob3cpOw0KCQl9Ow0KDQoJCSBmdW5jdGlvbiBfdHJhdmVyc2VTYW1lQ29udGFpbmVyKGhvdykgew0KCQkJdmFyIGZyYWcsIHMsIHN1YiwgbiwgY250LCBzaWJsaW5nLCB4ZmVyTm9kZTsNCg0KCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJZnJhZyA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQoNCgkJCS8vIElmIHNlbGVjdGlvbiBpcyBlbXB0eSwganVzdCByZXR1cm4gdGhlIGZyYWdtZW50DQoJCQlpZiAodFtTVEFSVF9PRkZTRVRdID09IHRbRU5EX09GRlNFVF0pDQoJCQkJcmV0dXJuIGZyYWc7DQoNCgkJCS8vIFRleHQgbm9kZSBuZWVkcyBzcGVjaWFsIGNhc2UgaGFuZGxpbmcNCgkJCWlmICh0W1NUQVJUX0NPTlRBSU5FUl0ubm9kZVR5cGUgPT0gMyAvKiBURVhUX05PREUgKi8pIHsNCgkJCQkvLyBnZXQgdGhlIHN1YnN0cmluZw0KCQkJCXMgPSB0W1NUQVJUX0NPTlRBSU5FUl0ubm9kZVZhbHVlOw0KCQkJCXN1YiA9IHMuc3Vic3RyaW5nKHRbU1RBUlRfT0ZGU0VUXSwgdFtFTkRfT0ZGU0VUXSk7DQoNCgkJCQkvLyBzZXQgdGhlIG9yaWdpbmFsIHRleHQgbm9kZSB0byBpdHMgbmV3IHZhbHVlDQoJCQkJaWYgKGhvdyAhPSBDTE9ORSkgew0KCQkJCQl0W1NUQVJUX0NPTlRBSU5FUl0uZGVsZXRlRGF0YSh0W1NUQVJUX09GRlNFVF0sIHRbRU5EX09GRlNFVF0gLSB0W1NUQVJUX09GRlNFVF0pOw0KDQoJCQkJCS8vIE5vdGhpbmcgaXMgcGFydGlhbGx5IHNlbGVjdGVkLCBzbyBjb2xsYXBzZSB0byBzdGFydCBwb2ludA0KCQkJCQl0LmNvbGxhcHNlKFRSVUUpOw0KCQkJCX0NCg0KCQkJCWlmIChob3cgPT0gREVMRVRFKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlmcmFnLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZShzdWIpKTsNCgkJCQlyZXR1cm4gZnJhZzsNCgkJCX0NCg0KCQkJLy8gQ29weSBub2RlcyBiZXR3ZWVuIHRoZSBzdGFydC9lbmQgb2Zmc2V0cy4NCgkJCW4gPSBfZ2V0U2VsZWN0ZWROb2RlKHRbU1RBUlRfQ09OVEFJTkVSXSwgdFtTVEFSVF9PRkZTRVRdKTsNCgkJCWNudCA9IHRbRU5EX09GRlNFVF0gLSB0W1NUQVJUX09GRlNFVF07DQoNCgkJCXdoaWxlIChjbnQgPiAwKSB7DQoJCQkJc2libGluZyA9IG4ubmV4dFNpYmxpbmc7DQoJCQkJeGZlck5vZGUgPSBfdHJhdmVyc2VGdWxseVNlbGVjdGVkKG4sIGhvdyk7DQoNCgkJCQlpZiAoZnJhZykNCgkJCQkJZnJhZy5hcHBlbmRDaGlsZCggeGZlck5vZGUgKTsNCg0KCQkJCS0tY250Ow0KCQkJCW4gPSBzaWJsaW5nOw0KCQkJfQ0KDQoJCQkvLyBOb3RoaW5nIGlzIHBhcnRpYWxseSBzZWxlY3RlZCwgc28gY29sbGFwc2UgdG8gc3RhcnQgcG9pbnQNCgkJCWlmIChob3cgIT0gQ0xPTkUpDQoJCQkJdC5jb2xsYXBzZShUUlVFKTsNCg0KCQkJcmV0dXJuIGZyYWc7DQoJCX07DQoNCgkJZnVuY3Rpb24gX3RyYXZlcnNlQ29tbW9uU3RhcnRDb250YWluZXIoZW5kQW5jZXN0b3IsIGhvdykgew0KCQkJdmFyIGZyYWcsIG4sIGVuZElkeCwgY250LCBzaWJsaW5nLCB4ZmVyTm9kZTsNCg0KCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJZnJhZyA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQoNCgkJCW4gPSBfdHJhdmVyc2VSaWdodEJvdW5kYXJ5KGVuZEFuY2VzdG9yLCBob3cpOw0KDQoJCQlpZiAoZnJhZykNCgkJCQlmcmFnLmFwcGVuZENoaWxkKG4pOw0KDQoJCQllbmRJZHggPSBub2RlSW5kZXgoZW5kQW5jZXN0b3IpOw0KCQkJY250ID0gZW5kSWR4IC0gdFtTVEFSVF9PRkZTRVRdOw0KDQoJCQlpZiAoY250IDw9IDApIHsNCgkJCQkvLyBDb2xsYXBzZSB0byBqdXN0IGJlZm9yZSB0aGUgZW5kQW5jZXN0b3IsIHdoaWNoDQoJCQkJLy8gaXMgcGFydGlhbGx5IHNlbGVjdGVkLg0KCQkJCWlmIChob3cgIT0gQ0xPTkUpIHsNCgkJCQkJdC5zZXRFbmRCZWZvcmUoZW5kQW5jZXN0b3IpOw0KCQkJCQl0LmNvbGxhcHNlKEZBTFNFKTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gZnJhZzsNCgkJCX0NCg0KCQkJbiA9IGVuZEFuY2VzdG9yLnByZXZpb3VzU2libGluZzsNCgkJCXdoaWxlIChjbnQgPiAwKSB7DQoJCQkJc2libGluZyA9IG4ucHJldmlvdXNTaWJsaW5nOw0KCQkJCXhmZXJOb2RlID0gX3RyYXZlcnNlRnVsbHlTZWxlY3RlZChuLCBob3cpOw0KDQoJCQkJaWYgKGZyYWcpDQoJCQkJCWZyYWcuaW5zZXJ0QmVmb3JlKHhmZXJOb2RlLCBmcmFnLmZpcnN0Q2hpbGQpOw0KDQoJCQkJLS1jbnQ7DQoJCQkJbiA9IHNpYmxpbmc7DQoJCQl9DQoNCgkJCS8vIENvbGxhcHNlIHRvIGp1c3QgYmVmb3JlIHRoZSBlbmRBbmNlc3Rvciwgd2hpY2gNCgkJCS8vIGlzIHBhcnRpYWxseSBzZWxlY3RlZC4NCgkJCWlmIChob3cgIT0gQ0xPTkUpIHsNCgkJCQl0LnNldEVuZEJlZm9yZShlbmRBbmNlc3Rvcik7DQoJCQkJdC5jb2xsYXBzZShGQUxTRSk7DQoJCQl9DQoNCgkJCXJldHVybiBmcmFnOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZUNvbW1vbkVuZENvbnRhaW5lcihzdGFydEFuY2VzdG9yLCBob3cpIHsNCgkJCXZhciBmcmFnLCBzdGFydElkeCwgbiwgY250LCBzaWJsaW5nLCB4ZmVyTm9kZTsNCg0KCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJZnJhZyA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQoNCgkJCW4gPSBfdHJhdmVyc2VMZWZ0Qm91bmRhcnkoc3RhcnRBbmNlc3RvciwgaG93KTsNCgkJCWlmIChmcmFnKQ0KCQkJCWZyYWcuYXBwZW5kQ2hpbGQobik7DQoNCgkJCXN0YXJ0SWR4ID0gbm9kZUluZGV4KHN0YXJ0QW5jZXN0b3IpOw0KCQkJKytzdGFydElkeDsgIC8vIEJlY2F1c2Ugd2UgYWxyZWFkeSB0cmF2ZXJzZWQgaXQuLi4uDQoNCgkJCWNudCA9IHRbRU5EX09GRlNFVF0gLSBzdGFydElkeDsNCgkJCW4gPSBzdGFydEFuY2VzdG9yLm5leHRTaWJsaW5nOw0KCQkJd2hpbGUgKGNudCA+IDApIHsNCgkJCQlzaWJsaW5nID0gbi5uZXh0U2libGluZzsNCgkJCQl4ZmVyTm9kZSA9IF90cmF2ZXJzZUZ1bGx5U2VsZWN0ZWQobiwgaG93KTsNCg0KCQkJCWlmIChmcmFnKQ0KCQkJCQlmcmFnLmFwcGVuZENoaWxkKHhmZXJOb2RlKTsNCg0KCQkJCS0tY250Ow0KCQkJCW4gPSBzaWJsaW5nOw0KCQkJfQ0KDQoJCQlpZiAoaG93ICE9IENMT05FKSB7DQoJCQkJdC5zZXRTdGFydEFmdGVyKHN0YXJ0QW5jZXN0b3IpOw0KCQkJCXQuY29sbGFwc2UoVFJVRSk7DQoJCQl9DQoNCgkJCXJldHVybiBmcmFnOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZUNvbW1vbkFuY2VzdG9ycyhzdGFydEFuY2VzdG9yLCBlbmRBbmNlc3RvciwgaG93KSB7DQoJCQl2YXIgbiwgZnJhZywgY29tbW9uUGFyZW50LCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0LCBjbnQsIHNpYmxpbmcsIG5leHRTaWJsaW5nOw0KDQoJCQlpZiAoaG93ICE9IERFTEVURSkNCgkJCQlmcmFnID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsNCg0KCQkJbiA9IF90cmF2ZXJzZUxlZnRCb3VuZGFyeShzdGFydEFuY2VzdG9yLCBob3cpOw0KCQkJaWYgKGZyYWcpDQoJCQkJZnJhZy5hcHBlbmRDaGlsZChuKTsNCg0KCQkJY29tbW9uUGFyZW50ID0gc3RhcnRBbmNlc3Rvci5wYXJlbnROb2RlOw0KCQkJc3RhcnRPZmZzZXQgPSBub2RlSW5kZXgoc3RhcnRBbmNlc3Rvcik7DQoJCQllbmRPZmZzZXQgPSBub2RlSW5kZXgoZW5kQW5jZXN0b3IpOw0KCQkJKytzdGFydE9mZnNldDsNCg0KCQkJY250ID0gZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQ7DQoJCQlzaWJsaW5nID0gc3RhcnRBbmNlc3Rvci5uZXh0U2libGluZzsNCg0KCQkJd2hpbGUgKGNudCA+IDApIHsNCgkJCQluZXh0U2libGluZyA9IHNpYmxpbmcubmV4dFNpYmxpbmc7DQoJCQkJbiA9IF90cmF2ZXJzZUZ1bGx5U2VsZWN0ZWQoc2libGluZywgaG93KTsNCg0KCQkJCWlmIChmcmFnKQ0KCQkJCQlmcmFnLmFwcGVuZENoaWxkKG4pOw0KDQoJCQkJc2libGluZyA9IG5leHRTaWJsaW5nOw0KCQkJCS0tY250Ow0KCQkJfQ0KDQoJCQluID0gX3RyYXZlcnNlUmlnaHRCb3VuZGFyeShlbmRBbmNlc3RvciwgaG93KTsNCg0KCQkJaWYgKGZyYWcpDQoJCQkJZnJhZy5hcHBlbmRDaGlsZChuKTsNCg0KCQkJaWYgKGhvdyAhPSBDTE9ORSkgew0KCQkJCXQuc2V0U3RhcnRBZnRlcihzdGFydEFuY2VzdG9yKTsNCgkJCQl0LmNvbGxhcHNlKFRSVUUpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZnJhZzsNCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VSaWdodEJvdW5kYXJ5KHJvb3QsIGhvdykgew0KCQkJdmFyIG5leHQgPSBfZ2V0U2VsZWN0ZWROb2RlKHRbRU5EX0NPTlRBSU5FUl0sIHRbRU5EX09GRlNFVF0gLSAxKSwgcGFyZW50LCBjbG9uZWRQYXJlbnQsIHByZXZTaWJsaW5nLCBjbG9uZWRDaGlsZCwgY2xvbmVkR3JhbmRQYXJlbnQsIGlzRnVsbHlTZWxlY3RlZCA9IG5leHQgIT0gdFtFTkRfQ09OVEFJTkVSXTsNCg0KCQkJaWYgKG5leHQgPT0gcm9vdCkNCgkJCQlyZXR1cm4gX3RyYXZlcnNlTm9kZShuZXh0LCBpc0Z1bGx5U2VsZWN0ZWQsIEZBTFNFLCBob3cpOw0KDQoJCQlwYXJlbnQgPSBuZXh0LnBhcmVudE5vZGU7DQoJCQljbG9uZWRQYXJlbnQgPSBfdHJhdmVyc2VOb2RlKHBhcmVudCwgRkFMU0UsIEZBTFNFLCBob3cpOw0KDQoJCQl3aGlsZSAocGFyZW50KSB7DQoJCQkJd2hpbGUgKG5leHQpIHsNCgkJCQkJcHJldlNpYmxpbmcgPSBuZXh0LnByZXZpb3VzU2libGluZzsNCgkJCQkJY2xvbmVkQ2hpbGQgPSBfdHJhdmVyc2VOb2RlKG5leHQsIGlzRnVsbHlTZWxlY3RlZCwgRkFMU0UsIGhvdyk7DQoNCgkJCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJCQljbG9uZWRQYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lZENoaWxkLCBjbG9uZWRQYXJlbnQuZmlyc3RDaGlsZCk7DQoNCgkJCQkJaXNGdWxseVNlbGVjdGVkID0gVFJVRTsNCgkJCQkJbmV4dCA9IHByZXZTaWJsaW5nOw0KCQkJCX0NCg0KCQkJCWlmIChwYXJlbnQgPT0gcm9vdCkNCgkJCQkJcmV0dXJuIGNsb25lZFBhcmVudDsNCg0KCQkJCW5leHQgPSBwYXJlbnQucHJldmlvdXNTaWJsaW5nOw0KCQkJCXBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOw0KDQoJCQkJY2xvbmVkR3JhbmRQYXJlbnQgPSBfdHJhdmVyc2VOb2RlKHBhcmVudCwgRkFMU0UsIEZBTFNFLCBob3cpOw0KDQoJCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJCWNsb25lZEdyYW5kUGFyZW50LmFwcGVuZENoaWxkKGNsb25lZFBhcmVudCk7DQoNCgkJCQljbG9uZWRQYXJlbnQgPSBjbG9uZWRHcmFuZFBhcmVudDsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBfdHJhdmVyc2VMZWZ0Qm91bmRhcnkocm9vdCwgaG93KSB7DQoJCQl2YXIgbmV4dCA9IF9nZXRTZWxlY3RlZE5vZGUodFtTVEFSVF9DT05UQUlORVJdLCB0W1NUQVJUX09GRlNFVF0pLCBpc0Z1bGx5U2VsZWN0ZWQgPSBuZXh0ICE9IHRbU1RBUlRfQ09OVEFJTkVSXSwgcGFyZW50LCBjbG9uZWRQYXJlbnQsIG5leHRTaWJsaW5nLCBjbG9uZWRDaGlsZCwgY2xvbmVkR3JhbmRQYXJlbnQ7DQoNCgkJCWlmIChuZXh0ID09IHJvb3QpDQoJCQkJcmV0dXJuIF90cmF2ZXJzZU5vZGUobmV4dCwgaXNGdWxseVNlbGVjdGVkLCBUUlVFLCBob3cpOw0KDQoJCQlwYXJlbnQgPSBuZXh0LnBhcmVudE5vZGU7DQoJCQljbG9uZWRQYXJlbnQgPSBfdHJhdmVyc2VOb2RlKHBhcmVudCwgRkFMU0UsIFRSVUUsIGhvdyk7DQoNCgkJCXdoaWxlIChwYXJlbnQpIHsNCgkJCQl3aGlsZSAobmV4dCkgew0KCQkJCQluZXh0U2libGluZyA9IG5leHQubmV4dFNpYmxpbmc7DQoJCQkJCWNsb25lZENoaWxkID0gX3RyYXZlcnNlTm9kZShuZXh0LCBpc0Z1bGx5U2VsZWN0ZWQsIFRSVUUsIGhvdyk7DQoNCgkJCQkJaWYgKGhvdyAhPSBERUxFVEUpDQoJCQkJCQljbG9uZWRQYXJlbnQuYXBwZW5kQ2hpbGQoY2xvbmVkQ2hpbGQpOw0KDQoJCQkJCWlzRnVsbHlTZWxlY3RlZCA9IFRSVUU7DQoJCQkJCW5leHQgPSBuZXh0U2libGluZzsNCgkJCQl9DQoNCgkJCQlpZiAocGFyZW50ID09IHJvb3QpDQoJCQkJCXJldHVybiBjbG9uZWRQYXJlbnQ7DQoNCgkJCQluZXh0ID0gcGFyZW50Lm5leHRTaWJsaW5nOw0KCQkJCXBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOw0KDQoJCQkJY2xvbmVkR3JhbmRQYXJlbnQgPSBfdHJhdmVyc2VOb2RlKHBhcmVudCwgRkFMU0UsIFRSVUUsIGhvdyk7DQoNCgkJCQlpZiAoaG93ICE9IERFTEVURSkNCgkJCQkJY2xvbmVkR3JhbmRQYXJlbnQuYXBwZW5kQ2hpbGQoY2xvbmVkUGFyZW50KTsNCg0KCQkJCWNsb25lZFBhcmVudCA9IGNsb25lZEdyYW5kUGFyZW50Ow0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZU5vZGUobiwgaXNGdWxseVNlbGVjdGVkLCBpc0xlZnQsIGhvdykgew0KCQkJdmFyIHR4dFZhbHVlLCBuZXdOb2RlVmFsdWUsIG9sZE5vZGVWYWx1ZSwgb2Zmc2V0LCBuZXdOb2RlOw0KDQoJCQlpZiAoaXNGdWxseVNlbGVjdGVkKQ0KCQkJCXJldHVybiBfdHJhdmVyc2VGdWxseVNlbGVjdGVkKG4sIGhvdyk7DQoNCgkJCWlmIChuLm5vZGVUeXBlID09IDMgLyogVEVYVF9OT0RFICovKSB7DQoJCQkJdHh0VmFsdWUgPSBuLm5vZGVWYWx1ZTsNCg0KCQkJCWlmIChpc0xlZnQpIHsNCgkJCQkJb2Zmc2V0ID0gdFtTVEFSVF9PRkZTRVRdOw0KCQkJCQluZXdOb2RlVmFsdWUgPSB0eHRWYWx1ZS5zdWJzdHJpbmcob2Zmc2V0KTsNCgkJCQkJb2xkTm9kZVZhbHVlID0gdHh0VmFsdWUuc3Vic3RyaW5nKDAsIG9mZnNldCk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJb2Zmc2V0ID0gdFtFTkRfT0ZGU0VUXTsNCgkJCQkJbmV3Tm9kZVZhbHVlID0gdHh0VmFsdWUuc3Vic3RyaW5nKDAsIG9mZnNldCk7DQoJCQkJCW9sZE5vZGVWYWx1ZSA9IHR4dFZhbHVlLnN1YnN0cmluZyhvZmZzZXQpOw0KCQkJCX0NCg0KCQkJCWlmIChob3cgIT0gQ0xPTkUpDQoJCQkJCW4ubm9kZVZhbHVlID0gb2xkTm9kZVZhbHVlOw0KDQoJCQkJaWYgKGhvdyA9PSBERUxFVEUpDQoJCQkJCXJldHVybjsNCg0KCQkJCW5ld05vZGUgPSBuLmNsb25lTm9kZShGQUxTRSk7DQoJCQkJbmV3Tm9kZS5ub2RlVmFsdWUgPSBuZXdOb2RlVmFsdWU7DQoNCgkJCQlyZXR1cm4gbmV3Tm9kZTsNCgkJCX0NCg0KCQkJaWYgKGhvdyA9PSBERUxFVEUpDQoJCQkJcmV0dXJuOw0KDQoJCQlyZXR1cm4gbi5jbG9uZU5vZGUoRkFMU0UpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIF90cmF2ZXJzZUZ1bGx5U2VsZWN0ZWQobiwgaG93KSB7DQoJCQlpZiAoaG93ICE9IERFTEVURSkNCgkJCQlyZXR1cm4gaG93ID09IENMT05FID8gbi5jbG9uZU5vZGUoVFJVRSkgOiBuOw0KDQoJCQluLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik7DQoJCX07DQoJfTsNCg0KCW5zLlJhbmdlID0gUmFuZ2U7DQp9KSh0aW55bWNlLmRvbSk7DQoNCihmdW5jdGlvbigpIHsNCglmdW5jdGlvbiBTZWxlY3Rpb24oc2VsZWN0aW9uKSB7DQoJCXZhciB0ID0gdGhpcywgaW52aXNpYmxlQ2hhciA9ICdcdUZFRkYnLCByYW5nZSwgbGFzdElFUm5nLCBkb20gPSBzZWxlY3Rpb24uZG9tLCBUUlVFID0gdHJ1ZSwgRkFMU0UgPSBmYWxzZTsNCg0KCQkvLyBSZXR1cm5zIGEgVzNDIERPTSBjb21wYXRpYmxlIHJhbmdlIG9iamVjdCBieSB1c2luZyB0aGUgSUUgUmFuZ2UgQVBJDQoJCWZ1bmN0aW9uIGdldFJhbmdlKCkgew0KCQkJdmFyIGllUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0Um5nKCksIGRvbVJhbmdlID0gZG9tLmNyZWF0ZVJuZygpLCBlbGVtZW50LCBjb2xsYXBzZWQ7DQoNCgkJCS8vIElmIHNlbGVjdGlvbiBpcyBvdXRzaWRlIHRoZSBjdXJyZW50IGRvY3VtZW50IGp1c3QgcmV0dXJuIGFuIGVtcHR5IHJhbmdlDQoJCQllbGVtZW50ID0gaWVSYW5nZS5pdGVtID8gaWVSYW5nZS5pdGVtKDApIDogaWVSYW5nZS5wYXJlbnRFbGVtZW50KCk7DQoJCQlpZiAoZWxlbWVudC5vd25lckRvY3VtZW50ICE9IGRvbS5kb2MpDQoJCQkJcmV0dXJuIGRvbVJhbmdlOw0KDQoJCQkvLyBIYW5kbGUgY29udHJvbCBzZWxlY3Rpb24gb3IgdGV4dCBzZWxlY3Rpb24gb2YgYSBpbWFnZQ0KCQkJaWYgKGllUmFuZ2UuaXRlbSB8fCAhZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsNCgkJCQlkb21SYW5nZS5zZXRTdGFydChlbGVtZW50LnBhcmVudE5vZGUsIGRvbS5ub2RlSW5kZXgoZWxlbWVudCkpOw0KCQkJCWRvbVJhbmdlLnNldEVuZChkb21SYW5nZS5zdGFydENvbnRhaW5lciwgZG9tUmFuZ2Uuc3RhcnRPZmZzZXQgKyAxKTsNCg0KCQkJCXJldHVybiBkb21SYW5nZTsNCgkJCX0NCg0KCQkJY29sbGFwc2VkID0gc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCk7DQoNCgkJCWZ1bmN0aW9uIGZpbmRFbmRQb2ludChzdGFydCkgew0KCQkJCXZhciBtYXJrZXIsIGNvbnRhaW5lciwgb2Zmc2V0LCBub2Rlcywgc3RhcnRJbmRleCA9IDAsIGVuZEluZGV4LCBpbmRleCwgcGFyZW50LCBjaGVja1JuZywgcG9zaXRpb247DQoNCgkJCQkvLyBTZXR1cCB0ZW1wIHJhbmdlIGFuZCBjb2xsYXBzZSBpdA0KCQkJCWNoZWNrUm5nID0gaWVSYW5nZS5kdXBsaWNhdGUoKTsNCgkJCQljaGVja1JuZy5jb2xsYXBzZShzdGFydCk7DQoNCgkJCQkvLyBDcmVhdGUgbWFya2VyIGFuZCBpbnNlcnQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgZW5kcG9pbnRzIHBhcmVudA0KCQkJCW1hcmtlciA9IGRvbS5jcmVhdGUoJ2EnKTsNCgkJCQlwYXJlbnQgPSBjaGVja1JuZy5wYXJlbnRFbGVtZW50KCk7DQoNCgkJCQkvLyBJZiBwYXJlbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiB0aGVuIHNldCB0aGUgY29udGFpbmVyIHRvIHRoYXQgcGFyZW50IGFuZCB0aGUgaW5kZXggdG8gMA0KCQkJCWlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkgew0KCQkJCQlkb21SYW5nZVtzdGFydCA/ICdzZXRTdGFydCcgOiAnc2V0RW5kJ10ocGFyZW50LCAwKTsNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCg0KCQkJCXBhcmVudC5hcHBlbmRDaGlsZChtYXJrZXIpOw0KCQkJCWNoZWNrUm5nLm1vdmVUb0VsZW1lbnRUZXh0KG1hcmtlcik7DQoJCQkJcG9zaXRpb24gPSBpZVJhbmdlLmNvbXBhcmVFbmRQb2ludHMoc3RhcnQgPyAnU3RhcnRUb1N0YXJ0JyA6ICdFbmRUb0VuZCcsIGNoZWNrUm5nKTsNCgkJCQlpZiAocG9zaXRpb24gPiAwKSB7DQoJCQkJCS8vIFRoZSBwb3NpdGlvbiBpcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgZWxlbWVudC4NCgkJCQkJLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBJRSBwdXRzIHRoZSBjYXJldCB0byB0aGUgbGVmdCBlZGdlIG9mIGEgdGFibGUuDQoJCQkJCWRvbVJhbmdlW3N0YXJ0ID8gJ3NldFN0YXJ0QWZ0ZXInIDogJ3NldEVuZEFmdGVyJ10ocGFyZW50KTsNCgkJCQkJZG9tLnJlbW92ZShtYXJrZXIpOw0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KDQoJCQkJLy8gU2V0dXAgbm9kZSBsaXN0IGFuZCBlbmRJbmRleA0KCQkJCW5vZGVzID0gdGlueW1jZS5ncmVwKHBhcmVudC5jaGlsZE5vZGVzKTsNCgkJCQllbmRJbmRleCA9IG5vZGVzLmxlbmd0aCAtIDE7DQoJCQkJLy8gUGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBwb3NpdGlvbg0KCQkJCXdoaWxlIChzdGFydEluZGV4IDw9IGVuZEluZGV4KSB7DQoJCQkJCWluZGV4ID0gTWF0aC5mbG9vcigoc3RhcnRJbmRleCArIGVuZEluZGV4KSAvIDIpOw0KDQoJCQkJCS8vIEluc2VydCBtYXJrZXIgYW5kIGNoZWNrIGl0J3MgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHNlbGVjdGlvbg0KCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG1hcmtlciwgbm9kZXNbaW5kZXhdKTsNCgkJCQkJY2hlY2tSbmcubW92ZVRvRWxlbWVudFRleHQobWFya2VyKTsNCgkJCQkJcG9zaXRpb24gPSBpZVJhbmdlLmNvbXBhcmVFbmRQb2ludHMoc3RhcnQgPyAnU3RhcnRUb1N0YXJ0JyA6ICdFbmRUb0VuZCcsIGNoZWNrUm5nKTsNCgkJCQkJaWYgKHBvc2l0aW9uID4gMCkgew0KCQkJCQkJLy8gTWFya2VyIGlzIHRvIHRoZSByaWdodA0KCQkJCQkJc3RhcnRJbmRleCA9IGluZGV4ICsgMTsNCgkJCQkJfSBlbHNlIGlmIChwb3NpdGlvbiA8IDApIHsNCgkJCQkJCS8vIE1hcmtlciBpcyB0byB0aGUgbGVmdA0KCQkJCQkJZW5kSW5kZXggPSBpbmRleCAtIDE7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkvLyBNYWtlciBpcyB3aGVyZSB3ZSBhcmUNCgkJCQkJCWZvdW5kID0gdHJ1ZTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gU2V0dXAgY29udGFpbmVyDQoJCQkJY29udGFpbmVyID0gcG9zaXRpb24gPiAwIHx8IGluZGV4ID09IDAgPyBtYXJrZXIubmV4dFNpYmxpbmcgOiBtYXJrZXIucHJldmlvdXNTaWJsaW5nOw0KDQoJCQkJLy8gSGFuZGxlIGVsZW1lbnQgc2VsZWN0aW9uDQoJCQkJaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJCWRvbS5yZW1vdmUobWFya2VyKTsNCg0KCQkJCQkvLyBGaW5kIG9mZnNldCBhbmQgY29udGFpbmVyDQoJCQkJCW9mZnNldCA9IGRvbS5ub2RlSW5kZXgoY29udGFpbmVyKTsNCgkJCQkJY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7DQoNCgkJCQkJLy8gTW92ZSB0aGUgb2Zmc2V0IGlmIHdlIGFyZSBzZXR0aW5nIHRoZSBlbmQgb3IgdGhlIHBvc2l0aW9uIGlzIGFmdGVyIGFuIGVsZW1lbnQNCgkJCQkJaWYgKCFzdGFydCB8fCBpbmRleCA+IDApDQoJCQkJCQlvZmZzZXQrKzsNCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBDYWxjdWxhdGUgb2Zmc2V0IHdpdGhpbiB0ZXh0IG5vZGUNCgkJCQkJaWYgKHBvc2l0aW9uID4gMCB8fCBpbmRleCA9PSAwKSB7DQoJCQkJCQljaGVja1JuZy5zZXRFbmRQb2ludChzdGFydCA/ICdTdGFydFRvU3RhcnQnIDogJ0VuZFRvRW5kJywgaWVSYW5nZSk7DQoJCQkJCQlvZmZzZXQgPSBjaGVja1JuZy50ZXh0Lmxlbmd0aDsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWNoZWNrUm5nLnNldEVuZFBvaW50KHN0YXJ0ID8gJ1N0YXJ0VG9TdGFydCcgOiAnRW5kVG9FbmQnLCBpZVJhbmdlKTsNCgkJCQkJCW9mZnNldCA9IGNvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoIC0gY2hlY2tSbmcudGV4dC5sZW5ndGg7DQoJCQkJCX0NCg0KCQkJCQlkb20ucmVtb3ZlKG1hcmtlcik7DQoJCQkJfQ0KDQoJCQkJZG9tUmFuZ2Vbc3RhcnQgPyAnc2V0U3RhcnQnIDogJ3NldEVuZCddKGNvbnRhaW5lciwgb2Zmc2V0KTsNCgkJCX07DQoNCgkJCS8vIEZpbmQgc3RhcnQgcG9pbnQNCgkJCWZpbmRFbmRQb2ludCh0cnVlKTsNCg0KCQkJLy8gRmluZCBlbmQgcG9pbnQgaWYgbmVlZGVkDQoJCQlpZiAoIWNvbGxhcHNlZCkNCgkJCQlmaW5kRW5kUG9pbnQoKTsNCg0KCQkJcmV0dXJuIGRvbVJhbmdlOw0KCQl9Ow0KDQoJCXRoaXMuYWRkUmFuZ2UgPSBmdW5jdGlvbihybmcpIHsNCgkJCXZhciBpZVJuZywgY3RybFJuZywgc3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0LCBlbmRDb250YWluZXIsIGVuZE9mZnNldCwgZG9jID0gc2VsZWN0aW9uLmRvbS5kb2MsIGJvZHkgPSBkb2MuYm9keTsNCg0KCQkJZnVuY3Rpb24gc2V0RW5kUG9pbnQoc3RhcnQpIHsNCgkJCQl2YXIgY29udGFpbmVyLCBvZmZzZXQsIG1hcmtlciwgdG1wUm5nLCBub2RlczsNCg0KCQkJCW1hcmtlciA9IGRvbS5jcmVhdGUoJ2EnKTsNCgkJCQljb250YWluZXIgPSBzdGFydCA/IHN0YXJ0Q29udGFpbmVyIDogZW5kQ29udGFpbmVyOw0KCQkJCW9mZnNldCA9IHN0YXJ0ID8gc3RhcnRPZmZzZXQgOiBlbmRPZmZzZXQ7DQoJCQkJdG1wUm5nID0gaWVSbmcuZHVwbGljYXRlKCk7DQoNCgkJCQlpZiAoY29udGFpbmVyID09IGRvYykgew0KCQkJCQljb250YWluZXIgPSBib2R5Ow0KCQkJCQlvZmZzZXQgPSAwOw0KCQkJCX0NCg0KCQkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMykgew0KCQkJCQljb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobWFya2VyLCBjb250YWluZXIpOw0KCQkJCQl0bXBSbmcubW92ZVRvRWxlbWVudFRleHQobWFya2VyKTsNCgkJCQkJdG1wUm5nLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgb2Zmc2V0KTsNCgkJCQkJZG9tLnJlbW92ZShtYXJrZXIpOw0KCQkJCQlpZVJuZy5zZXRFbmRQb2ludChzdGFydCA/ICdTdGFydFRvU3RhcnQnIDogJ0VuZFRvRW5kJywgdG1wUm5nKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlub2RlcyA9IGNvbnRhaW5lci5jaGlsZE5vZGVzOw0KDQoJCQkJCWlmIChub2Rlcy5sZW5ndGgpIHsNCgkJCQkJCWlmIChvZmZzZXQgPj0gbm9kZXMubGVuZ3RoKSB7DQoJCQkJCQkJZG9tLmluc2VydEFmdGVyKG1hcmtlciwgbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV0pOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQljb250YWluZXIuaW5zZXJ0QmVmb3JlKG1hcmtlciwgbm9kZXNbb2Zmc2V0XSk7DQoJCQkJCQl9DQoNCgkJCQkJCXRtcFJuZy5tb3ZlVG9FbGVtZW50VGV4dChtYXJrZXIpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJLy8gRW1wdHkgbm9kZSBzZWxlY3Rpb24gZm9yIGV4YW1wbGUgPGRpdj58PC9kaXY+DQoJCQkJCQltYXJrZXIgPSBkb2MuY3JlYXRlVGV4dE5vZGUoaW52aXNpYmxlQ2hhcik7DQoJCQkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQobWFya2VyKTsNCgkJCQkJCXRtcFJuZy5tb3ZlVG9FbGVtZW50VGV4dChtYXJrZXIucGFyZW50Tm9kZSk7DQoJCQkJCQl0bXBSbmcuY29sbGFwc2UoVFJVRSk7DQoJCQkJCX0NCg0KCQkJCQlpZVJuZy5zZXRFbmRQb2ludChzdGFydCA/ICdTdGFydFRvU3RhcnQnIDogJ0VuZFRvRW5kJywgdG1wUm5nKTsNCgkJCQkJZG9tLnJlbW92ZShtYXJrZXIpOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gRGVzdHJveSBjYWNoZWQgcmFuZ2UNCgkJCXRoaXMuZGVzdHJveSgpOw0KDQoJCQkvLyBTZXR1cCBzb21lIHNob3J0ZXIgdmVyc2lvbnMNCgkJCXN0YXJ0Q29udGFpbmVyID0gcm5nLnN0YXJ0Q29udGFpbmVyOw0KCQkJc3RhcnRPZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQ7DQoJCQllbmRDb250YWluZXIgPSBybmcuZW5kQ29udGFpbmVyOw0KCQkJZW5kT2Zmc2V0ID0gcm5nLmVuZE9mZnNldDsNCgkJCWllUm5nID0gYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsNCg0KCQkJLy8gSWYgc2luZ2xlIGVsZW1lbnQgc2VsZWN0aW9uIHRoZW4gdHJ5IG1ha2luZyBhIGNvbnRyb2wgc2VsZWN0aW9uIG91dCBvZiBpdA0KCQkJaWYgKHN0YXJ0Q29udGFpbmVyID09IGVuZENvbnRhaW5lciAmJiBzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PSAxICYmIHN0YXJ0T2Zmc2V0ID09IGVuZE9mZnNldCAtIDEpIHsNCgkJCQlpZiAoc3RhcnRPZmZzZXQgPT0gZW5kT2Zmc2V0IC0gMSkgew0KCQkJCQl0cnkgew0KCQkJCQkJY3RybFJuZyA9IGJvZHkuY3JlYXRlQ29udHJvbFJhbmdlKCk7DQoJCQkJCQljdHJsUm5nLmFkZEVsZW1lbnQoc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tzdGFydE9mZnNldF0pOw0KCQkJCQkJY3RybFJuZy5zZWxlY3QoKTsNCgkJCQkJCWN0cmxSbmcuc2Nyb2xsSW50b1ZpZXcoKTsNCgkJCQkJCXJldHVybjsNCgkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCS8vIElnbm9yZQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBTZXQgc3RhcnQvZW5kIHBvaW50IG9mIHNlbGVjdGlvbg0KCQkJc2V0RW5kUG9pbnQodHJ1ZSk7DQoJCQlzZXRFbmRQb2ludCgpOw0KDQoJCQkvLyBTZWxlY3QgdGhlIG5ldyByYW5nZSBhbmQgc2Nyb2xsIGl0IGludG8gdmlldw0KCQkJaWVSbmcuc2VsZWN0KCk7DQoJCQlpZVJuZy5zY3JvbGxJbnRvVmlldygpOw0KCQl9Ow0KDQoJCXRoaXMuZ2V0UmFuZ2VBdCA9IGZ1bmN0aW9uKCkgew0KCQkJLy8gU2V0dXAgbmV3IHJhbmdlIGlmIHRoZSBjYWNoZSBpcyBlbXB0eQ0KCQkJaWYgKCFyYW5nZSB8fCAhdGlueW1jZS5kb20uUmFuZ2VVdGlscy5jb21wYXJlUmFuZ2VzKGxhc3RJRVJuZywgc2VsZWN0aW9uLmdldFJuZygpKSkgew0KCQkJCXJhbmdlID0gZ2V0UmFuZ2UoKTsNCg0KCQkJCS8vIFN0b3JlIGF3YXkgdGV4dCByYW5nZSBmb3IgbmV4dCBjYWxsDQoJCQkJbGFzdElFUm5nID0gc2VsZWN0aW9uLmdldFJuZygpOw0KCQkJfQ0KDQoJCQkvLyBJRSB3aWxsIHNheSB0aGF0IHRoZSByYW5nZSBpcyBlcXVhbCB0aGVuIHByb2R1Y2UgYW4gaW52YWxpZCBhcmd1bWVudCBleGNlcHRpb24NCgkJCS8vIGlmIHlvdSBwZXJmb3JtIHNwZWNpZmljIG9wZXJhdGlvbnMgaW4gYSBrZXl1cCBldmVudC4gRm9yIGV4YW1wbGUgQ3RybCtEZWwuDQoJCQkvLyBUaGlzIGhhY2sgd2lsbCBpbnZhbGlkYXRlIHRoZSByYW5nZSBjYWNoZSBpZiB0aGUgZXhjZXB0aW9uIG9jY3Vycw0KCQkJdHJ5IHsNCgkJCQlyYW5nZS5zdGFydENvbnRhaW5lci5uZXh0U2libGluZzsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJcmFuZ2UgPSBnZXRSYW5nZSgpOw0KCQkJCWxhc3RJRVJuZyA9IG51bGw7DQoJCQl9DQoNCgkJCS8vIFJldHVybiBjYWNoZWQgcmFuZ2UNCgkJCXJldHVybiByYW5nZTsNCgkJfTsNCg0KCQl0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHsNCgkJCS8vIERlc3Ryb3kgY2FjaGVkIHJhbmdlIGFuZCBsYXN0IElFIHJhbmdlIHRvIGF2b2lkIG1lbW9yeSBsZWFrcw0KCQkJbGFzdElFUm5nID0gcmFuZ2UgPSBudWxsOw0KCQl9Ow0KCX07DQoNCgkvLyBFeHBvc2UgdGhlIHNlbGVjdGlvbiBvYmplY3QNCgl0aW55bWNlLmRvbS5UcmlkZW50U2VsZWN0aW9uID0gU2VsZWN0aW9uOw0KfSkoKTsNCg0KDQovKg0KICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgLSB2MS4wDQogKiAgQ29weXJpZ2h0IDIwMDksIFRoZSBEb2pvIEZvdW5kYXRpb24NCiAqICBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuDQogKiAgTW9yZSBpbmZvcm1hdGlvbjogaHR0cDovL3NpenpsZWpzLmNvbS8NCiAqLw0KKGZ1bmN0aW9uKCl7DQoNCnZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywNCglkb25lID0gMCwNCgl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsDQoJaGFzRHVwbGljYXRlID0gZmFsc2UsDQoJYmFzZUhhc0R1cGxpY2F0ZSA9IHRydWU7DQoNCi8vIEhlcmUgd2UgY2hlY2sgaWYgdGhlIEphdmFTY3JpcHQgZW5naW5lIGlzIHVzaW5nIHNvbWUgc29ydCBvZg0KLy8gb3B0aW1pemF0aW9uIHdoZXJlIGl0IGRvZXMgbm90IGFsd2F5cyBjYWxsIG91ciBjb21wYXJpc2lvbg0KLy8gZnVuY3Rpb24uIElmIHRoYXQgaXMgdGhlIGNhc2UsIGRpc2NhcmQgdGhlIGhhc0R1cGxpY2F0ZSB2YWx1ZS4NCi8vICAgVGh1cyBmYXIgdGhhdCBpbmNsdWRlcyBHb29nbGUgQ2hyb21lLg0KWzAsIDBdLnNvcnQoZnVuY3Rpb24oKXsNCgliYXNlSGFzRHVwbGljYXRlID0gZmFsc2U7DQoJcmV0dXJuIDA7DQp9KTsNCg0KdmFyIFNpenpsZSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkKSB7DQoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107DQoJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7DQoNCgl2YXIgb3JpZ0NvbnRleHQgPSBjb250ZXh0Ow0KDQoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7DQoJCXJldHVybiBbXTsNCgl9DQoJDQoJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsNCgkJcmV0dXJuIHJlc3VsdHM7DQoJfQ0KDQoJdmFyIHBhcnRzID0gW10sIG0sIHNldCwgY2hlY2tTZXQsIGV4dHJhLCBwcnVuZSA9IHRydWUsIGNvbnRleHRYTUwgPSBTaXp6bGUuaXNYTUwoY29udGV4dCksDQoJCXNvRmFyID0gc2VsZWN0b3IsIHJldCwgY3VyLCBwb3AsIGk7DQoJDQoJLy8gUmVzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaHVua2VyIHJlZ2V4cCAoc3RhcnQgZnJvbSBoZWFkKQ0KCWRvIHsNCgkJY2h1bmtlci5leGVjKCIiKTsNCgkJbSA9IGNodW5rZXIuZXhlYyhzb0Zhcik7DQoNCgkJaWYgKCBtICkgew0KCQkJc29GYXIgPSBtWzNdOw0KCQkNCgkJCXBhcnRzLnB1c2goIG1bMV0gKTsNCgkJDQoJCQlpZiAoIG1bMl0gKSB7DQoJCQkJZXh0cmEgPSBtWzNdOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJfSB3aGlsZSAoIG0gKTsNCg0KCWlmICggcGFydHMubGVuZ3RoID4gMSAmJiBvcmlnUE9TLmV4ZWMoIHNlbGVjdG9yICkgKSB7DQoJCWlmICggcGFydHMubGVuZ3RoID09PSAyICYmIEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gKSB7DQoJCQlzZXQgPSBwb3NQcm9jZXNzKCBwYXJ0c1swXSArIHBhcnRzWzFdLCBjb250ZXh0ICk7DQoJCX0gZWxzZSB7DQoJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8NCgkJCQlbIGNvbnRleHQgXSA6DQoJCQkJU2l6emxlKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0ICk7DQoNCgkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgew0KCQkJCXNlbGVjdG9yID0gcGFydHMuc2hpZnQoKTsNCg0KCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgc2VsZWN0b3IgXSApIHsNCgkJCQkJc2VsZWN0b3IgKz0gcGFydHMuc2hpZnQoKTsNCgkJCQl9DQoJCQkJDQoJCQkJc2V0ID0gcG9zUHJvY2Vzcyggc2VsZWN0b3IsIHNldCApOw0KCQkJfQ0KCQl9DQoJfSBlbHNlIHsNCgkJLy8gVGFrZSBhIHNob3J0Y3V0IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJvb3Qgc2VsZWN0b3IgaXMgYW4gSUQNCgkJLy8gKGJ1dCBub3QgaWYgaXQnbGwgYmUgZmFzdGVyIGlmIHRoZSBpbm5lciBzZWxlY3RvciBpcyBhbiBJRCkNCgkJaWYgKCAhc2VlZCAmJiBwYXJ0cy5sZW5ndGggPiAxICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWNvbnRleHRYTUwgJiYNCgkJCQlFeHByLm1hdGNoLklELnRlc3QocGFydHNbMF0pICYmICFFeHByLm1hdGNoLklELnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMV0pICkgew0KCQkJcmV0ID0gU2l6emxlLmZpbmQoIHBhcnRzLnNoaWZ0KCksIGNvbnRleHQsIGNvbnRleHRYTUwgKTsNCgkJCWNvbnRleHQgPSByZXQuZXhwciA/IFNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0IClbMF0gOiByZXQuc2V0WzBdOw0KCQl9DQoNCgkJaWYgKCBjb250ZXh0ICkgew0KCQkJcmV0ID0gc2VlZCA/DQoJCQkJeyBleHByOiBwYXJ0cy5wb3AoKSwgc2V0OiBtYWtlQXJyYXkoc2VlZCkgfSA6DQoJCQkJU2l6emxlLmZpbmQoIHBhcnRzLnBvcCgpLCBwYXJ0cy5sZW5ndGggPT09IDEgJiYgKHBhcnRzWzBdID09PSAifiIgfHwgcGFydHNbMF0gPT09ICIrIikgJiYgY29udGV4dC5wYXJlbnROb2RlID8gY29udGV4dC5wYXJlbnROb2RlIDogY29udGV4dCwgY29udGV4dFhNTCApOw0KCQkJc2V0ID0gcmV0LmV4cHIgPyBTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApIDogcmV0LnNldDsNCg0KCQkJaWYgKCBwYXJ0cy5sZW5ndGggPiAwICkgew0KCQkJCWNoZWNrU2V0ID0gbWFrZUFycmF5KHNldCk7DQoJCQl9IGVsc2Ugew0KCQkJCXBydW5lID0gZmFsc2U7DQoJCQl9DQoNCgkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgew0KCQkJCWN1ciA9IHBhcnRzLnBvcCgpOw0KCQkJCXBvcCA9IGN1cjsNCg0KCQkJCWlmICggIUV4cHIucmVsYXRpdmVbIGN1ciBdICkgew0KCQkJCQljdXIgPSAiIjsNCgkJCQl9IGVsc2Ugew0KCQkJCQlwb3AgPSBwYXJ0cy5wb3AoKTsNCgkJCQl9DQoNCgkJCQlpZiAoIHBvcCA9PSBudWxsICkgew0KCQkJCQlwb3AgPSBjb250ZXh0Ow0KCQkJCX0NCg0KCQkJCUV4cHIucmVsYXRpdmVbIGN1ciBdKCBjaGVja1NldCwgcG9wLCBjb250ZXh0WE1MICk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQljaGVja1NldCA9IHBhcnRzID0gW107DQoJCX0NCgl9DQoNCglpZiAoICFjaGVja1NldCApIHsNCgkJY2hlY2tTZXQgPSBzZXQ7DQoJfQ0KDQoJaWYgKCAhY2hlY2tTZXQgKSB7DQoJCVNpenpsZS5lcnJvciggY3VyIHx8IHNlbGVjdG9yICk7DQoJfQ0KDQoJaWYgKCB0b1N0cmluZy5jYWxsKGNoZWNrU2V0KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsNCgkJaWYgKCAhcHJ1bmUgKSB7DQoJCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGNoZWNrU2V0ICk7DQoJCX0gZWxzZSBpZiAoIGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gMSApIHsNCgkJCWZvciAoIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7DQoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgU2l6emxlLmNvbnRhaW5zKGNvbnRleHQsIGNoZWNrU2V0W2ldKSkgKSB7DQoJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7DQoJCQkJfQ0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJZm9yICggaSA9IDA7IGNoZWNrU2V0W2ldICE9IG51bGw7IGkrKyApIHsNCgkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0gZWxzZSB7DQoJCW1ha2VBcnJheSggY2hlY2tTZXQsIHJlc3VsdHMgKTsNCgl9DQoNCglpZiAoIGV4dHJhICkgew0KCQlTaXp6bGUoIGV4dHJhLCBvcmlnQ29udGV4dCwgcmVzdWx0cywgc2VlZCApOw0KCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOw0KCX0NCg0KCXJldHVybiByZXN1bHRzOw0KfTsNCg0KU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbihyZXN1bHRzKXsNCglpZiAoIHNvcnRPcmRlciApIHsNCgkJaGFzRHVwbGljYXRlID0gYmFzZUhhc0R1cGxpY2F0ZTsNCgkJcmVzdWx0cy5zb3J0KHNvcnRPcmRlcik7DQoNCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7DQoJCQlmb3IgKCB2YXIgaSA9IDE7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrICkgew0KCQkJCWlmICggcmVzdWx0c1tpXSA9PT0gcmVzdWx0c1tpLTFdICkgew0KCQkJCQlyZXN1bHRzLnNwbGljZShpLS0sIDEpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCg0KCXJldHVybiByZXN1bHRzOw0KfTsNCg0KU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbihleHByLCBzZXQpew0KCXJldHVybiBTaXp6bGUoZXhwciwgbnVsbCwgbnVsbCwgc2V0KTsNCn07DQoNClNpenpsZS5maW5kID0gZnVuY3Rpb24oZXhwciwgY29udGV4dCwgaXNYTUwpew0KCXZhciBzZXQ7DQoNCglpZiAoICFleHByICkgew0KCQlyZXR1cm4gW107DQoJfQ0KDQoJZm9yICggdmFyIGkgPSAwLCBsID0gRXhwci5vcmRlci5sZW5ndGg7IGkgPCBsOyBpKysgKSB7DQoJCXZhciB0eXBlID0gRXhwci5vcmRlcltpXSwgbWF0Y2g7DQoJCQ0KCQlpZiAoIChtYXRjaCA9IEV4cHIubGVmdE1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSApIHsNCgkJCXZhciBsZWZ0ID0gbWF0Y2hbMV07DQoJCQltYXRjaC5zcGxpY2UoMSwxKTsNCg0KCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7DQoJCQkJbWF0Y2hbMV0gPSAobWF0Y2hbMV0gfHwgIiIpLnJlcGxhY2UoL1xcL2csICIiKTsNCgkJCQlzZXQgPSBFeHByLmZpbmRbIHR5cGUgXSggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICk7DQoJCQkJaWYgKCBzZXQgIT0gbnVsbCApIHsNCgkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOw0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoNCglpZiAoICFzZXQgKSB7DQoJCXNldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsNCgl9DQoNCglyZXR1cm4ge3NldDogc2V0LCBleHByOiBleHByfTsNCn07DQoNClNpenpsZS5maWx0ZXIgPSBmdW5jdGlvbihleHByLCBzZXQsIGlucGxhY2UsIG5vdCl7DQoJdmFyIG9sZCA9IGV4cHIsIHJlc3VsdCA9IFtdLCBjdXJMb29wID0gc2V0LCBtYXRjaCwgYW55Rm91bmQsDQoJCWlzWE1MRmlsdGVyID0gc2V0ICYmIHNldFswXSAmJiBTaXp6bGUuaXNYTUwoc2V0WzBdKTsNCg0KCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgew0KCQlmb3IgKCB2YXIgdHlwZSBpbiBFeHByLmZpbHRlciApIHsNCgkJCWlmICggKG1hdGNoID0gRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICE9IG51bGwgJiYgbWF0Y2hbMl0gKSB7DQoJCQkJdmFyIGZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sIGZvdW5kLCBpdGVtLCBsZWZ0ID0gbWF0Y2hbMV07DQoJCQkJYW55Rm91bmQgPSBmYWxzZTsNCg0KCQkJCW1hdGNoLnNwbGljZSgxLDEpOw0KDQoJCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgPT09ICJcXCIgKSB7DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0NCg0KCQkJCWlmICggY3VyTG9vcCA9PT0gcmVzdWx0ICkgew0KCQkJCQlyZXN1bHQgPSBbXTsNCgkJCQl9DQoNCgkJCQlpZiAoIEV4cHIucHJlRmlsdGVyWyB0eXBlIF0gKSB7DQoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOw0KDQoJCQkJCWlmICggIW1hdGNoICkgew0KCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7DQoJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgew0KCQkJCQkJY29udGludWU7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlpZiAoIG1hdGNoICkgew0KCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgew0KCQkJCQkJaWYgKCBpdGVtICkgew0KCQkJCQkJCWZvdW5kID0gZmlsdGVyKCBpdGVtLCBtYXRjaCwgaSwgY3VyTG9vcCApOw0KCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsNCg0KCQkJCQkJCWlmICggaW5wbGFjZSAmJiBmb3VuZCAhPSBudWxsICkgew0KCQkJCQkJCQlpZiAoIHBhc3MgKSB7DQoJCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7DQoJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7DQoJCQkJCQkJCX0NCgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgew0KCQkJCQkJCQlyZXN1bHQucHVzaCggaXRlbSApOw0KCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJaWYgKCBmb3VuZCAhPT0gdW5kZWZpbmVkICkgew0KCQkJCQlpZiAoICFpbnBsYWNlICkgew0KCQkJCQkJY3VyTG9vcCA9IHJlc3VsdDsNCgkJCQkJfQ0KDQoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsNCg0KCQkJCQlpZiAoICFhbnlGb3VuZCApIHsNCgkJCQkJCXJldHVybiBbXTsNCgkJCQkJfQ0KDQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24NCgkJaWYgKCBleHByID09PSBvbGQgKSB7DQoJCQlpZiAoIGFueUZvdW5kID09IG51bGwgKSB7DQoJCQkJU2l6emxlLmVycm9yKCBleHByICk7DQoJCQl9IGVsc2Ugew0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoNCgkJb2xkID0gZXhwcjsNCgl9DQoNCglyZXR1cm4gY3VyTG9vcDsNCn07DQoNClNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7DQoJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2c7DQp9Ow0KDQp2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7DQoJb3JkZXI6IFsgIklEIiwgIk5BTUUiLCAiVEFHIiBdLA0KCW1hdGNoOiB7DQoJCUlEOiAvIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sDQoJCUNMQVNTOiAvXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLA0KCQlOQU1FOiAvXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sDQoJCUFUVFI6IC9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sDQoJCVRBRzogL14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sDQoJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoKGV2ZW58b2RkfFtcZG4rXC1dKilcKSk/LywNCgkJUE9TOiAvOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteXC1dfCQpLywNCgkJUFNFVURPOiAvOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/Lw0KCX0sDQoJbGVmdE1hdGNoOiB7fSwNCglhdHRyTWFwOiB7DQoJCSJjbGFzcyI6ICJjbGFzc05hbWUiLA0KCQkiZm9yIjogImh0bWxGb3IiDQoJfSwNCglhdHRySGFuZGxlOiB7DQoJCWhyZWY6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIik7DQoJCX0NCgl9LA0KCXJlbGF0aXZlOiB7DQoJCSIrIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQpew0KCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwNCgkJCQlpc1RhZyA9IGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KHBhcnQpLA0KCQkJCWlzUGFydFN0ck5vdFRhZyA9IGlzUGFydFN0ciAmJiAhaXNUYWc7DQoNCgkJCWlmICggaXNUYWcgKSB7DQoJCQkJcGFydCA9IHBhcnQudG9Mb3dlckNhc2UoKTsNCgkJCX0NCg0KCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoLCBlbGVtOyBpIDwgbDsgaSsrICkgew0KCQkJCWlmICggKGVsZW0gPSBjaGVja1NldFtpXSkgKSB7DQoJCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtLnByZXZpb3VzU2libGluZykgJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSApIHt9DQoNCgkJCQkJY2hlY2tTZXRbaV0gPSBpc1BhcnRTdHJOb3RUYWcgfHwgZWxlbSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcnQgPw0KCQkJCQkJZWxlbSB8fCBmYWxzZSA6DQoJCQkJCQllbGVtID09PSBwYXJ0Ow0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKCBpc1BhcnRTdHJOb3RUYWcgKSB7DQoJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsNCgkJCX0NCgkJfSwNCgkJIj4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCl7DQoJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciLA0KCQkJCWVsZW0sIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOw0KDQoJCQlpZiAoIGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KHBhcnQpICkgew0KCQkJCXBhcnQgPSBwYXJ0LnRvTG93ZXJDYXNlKCk7DQoNCgkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7DQoJCQkJCWVsZW0gPSBjaGVja1NldFtpXTsNCgkJCQkJaWYgKCBlbGVtICkgew0KCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsNCgkJCQkJCWNoZWNrU2V0W2ldID0gcGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcnQgPyBwYXJlbnQgOiBmYWxzZTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZm9yICggOyBpIDwgbDsgaSsrICkgew0KCQkJCQllbGVtID0gY2hlY2tTZXRbaV07DQoJCQkJCWlmICggZWxlbSApIHsNCgkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8NCgkJCQkJCQllbGVtLnBhcmVudE5vZGUgOg0KCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA9PT0gcGFydDsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCWlmICggaXNQYXJ0U3RyICkgew0KCQkJCQlTaXp6bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwgdHJ1ZSApOw0KCQkJCX0NCgkJCX0NCgkJfSwNCgkJIiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7DQoJCQl2YXIgZG9uZU5hbWUgPSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVjaywgbm9kZUNoZWNrOw0KDQoJCQlpZiAoIHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiAmJiAhL1xXLy50ZXN0KHBhcnQpICkgew0KCQkJCXBhcnQgPSBwYXJ0LnRvTG93ZXJDYXNlKCk7DQoJCQkJbm9kZUNoZWNrID0gcGFydDsNCgkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOw0KCQkJfQ0KDQoJCQljaGVja0ZuKCJwYXJlbnROb2RlIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MKTsNCgkJfSwNCgkJIn4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpew0KCQkJdmFyIGRvbmVOYW1lID0gZG9uZSsrLCBjaGVja0ZuID0gZGlyQ2hlY2ssIG5vZGVDaGVjazsNCg0KCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIS9cVy8udGVzdChwYXJ0KSApIHsNCgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOw0KCQkJCW5vZGVDaGVjayA9IHBhcnQ7DQoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsNCgkJCX0NCg0KCQkJY2hlY2tGbigicHJldmlvdXNTaWJsaW5nIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MKTsNCgkJfQ0KCX0sDQoJZmluZDogew0KCQlJRDogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsNCgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsNCgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOw0KCQkJCXJldHVybiBtID8gW21dIDogW107DQoJCQl9DQoJCX0sDQoJCU5BTUU6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0KXsNCgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUgIT09ICJ1bmRlZmluZWQiICkgew0KCQkJCXZhciByZXQgPSBbXSwgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUobWF0Y2hbMV0pOw0KDQoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7DQoJCQkJCWlmICggcmVzdWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PT0gbWF0Y2hbMV0gKSB7DQoJCQkJCQlyZXQucHVzaCggcmVzdWx0c1tpXSApOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0Ow0KCQkJfQ0KCQl9LA0KCQlUQUc6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0KXsNCgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFdKTsNCgkJfQ0KCX0sDQoJcHJlRmlsdGVyOiB7DQoJCUNMQVNTOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsNCgkJCW1hdGNoID0gIiAiICsgbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpICsgIiAiOw0KDQoJCQlpZiAoIGlzWE1MICkgew0KCQkJCXJldHVybiBtYXRjaDsNCgkJCX0NCg0KCQkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGN1ckxvb3BbaV0pICE9IG51bGw7IGkrKyApIHsNCgkJCQlpZiAoIGVsZW0gKSB7DQoJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIikucmVwbGFjZSgvW1x0XG5dL2csICIgIikuaW5kZXhPZihtYXRjaCkgPj0gMCkgKSB7DQoJCQkJCQlpZiAoICFpbnBsYWNlICkgew0KCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7DQoJCQkJCQl9DQoJCQkJCX0gZWxzZSBpZiAoIGlucGxhY2UgKSB7DQoJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfSwNCgkJSUQ6IGZ1bmN0aW9uKG1hdGNoKXsNCgkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7DQoJCX0sDQoJCVRBRzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3Apew0KCQkJcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7DQoJCX0sDQoJCUNISUxEOiBmdW5jdGlvbihtYXRjaCl7DQoJCQlpZiAoIG1hdGNoWzFdID09PSAibnRoIiApIHsNCgkJCQkvLyBwYXJzZSBlcXVhdGlvbnMgbGlrZSAnZXZlbicsICdvZGQnLCAnNScsICcybicsICczbisyJywgJzRuLTEnLCAnLW4rNicNCgkJCQl2YXIgdGVzdCA9IC8oLT8pKFxkKiluKCg/OlwrfC0pP1xkKikvLmV4ZWMoDQoJCQkJCW1hdGNoWzJdID09PSAiZXZlbiIgJiYgIjJuIiB8fCBtYXRjaFsyXSA9PT0gIm9kZCIgJiYgIjJuKzEiIHx8DQoJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7DQoNCgkJCQkvLyBjYWxjdWxhdGUgdGhlIG51bWJlcnMgKGZpcnN0KW4rKGxhc3QpIGluY2x1ZGluZyBpZiB0aGV5IGFyZSBuZWdhdGl2ZQ0KCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOw0KCQkJCW1hdGNoWzNdID0gdGVzdFszXSAtIDA7DQoJCQl9DQoNCgkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtDQoJCQltYXRjaFswXSA9IGRvbmUrKzsNCg0KCQkJcmV0dXJuIG1hdGNoOw0KCQl9LA0KCQlBVFRSOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsNCgkJCXZhciBuYW1lID0gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOw0KCQkJDQoJCQlpZiAoICFpc1hNTCAmJiBFeHByLmF0dHJNYXBbbmFtZV0gKSB7DQoJCQkJbWF0Y2hbMV0gPSBFeHByLmF0dHJNYXBbbmFtZV07DQoJCQl9DQoNCgkJCWlmICggbWF0Y2hbMl0gPT09ICJ+PSIgKSB7DQoJCQkJbWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSArICIgIjsNCgkJCX0NCg0KCQkJcmV0dXJuIG1hdGNoOw0KCQl9LA0KCQlQU0VVRE86IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCl7DQoJCQlpZiAoIG1hdGNoWzFdID09PSAibm90IiApIHsNCgkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQ0KCQkJCWlmICggKCBjaHVua2VyLmV4ZWMobWF0Y2hbM10pIHx8ICIiICkubGVuZ3RoID4gMSB8fCAvXlx3Ly50ZXN0KG1hdGNoWzNdKSApIHsNCgkJCQkJbWF0Y2hbM10gPSBTaXp6bGUobWF0Y2hbM10sIG51bGwsIG51bGwsIGN1ckxvb3ApOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsNCgkJCQkJaWYgKCAhaW5wbGFjZSApIHsNCgkJCQkJCXJlc3VsdC5wdXNoLmFwcGx5KCByZXN1bHQsIHJldCApOw0KCQkJCQl9DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJCQ0KCQkJcmV0dXJuIG1hdGNoOw0KCQl9LA0KCQlQT1M6IGZ1bmN0aW9uKG1hdGNoKXsNCgkJCW1hdGNoLnVuc2hpZnQoIHRydWUgKTsNCgkJCXJldHVybiBtYXRjaDsNCgkJfQ0KCX0sDQoJZmlsdGVyczogew0KCQllbmFibGVkOiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJoaWRkZW4iOw0KCQl9LA0KCQlkaXNhYmxlZDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsNCgkJfSwNCgkJY2hlY2tlZDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gZWxlbS5jaGVja2VkID09PSB0cnVlOw0KCQl9LA0KCQlzZWxlY3RlZDogZnVuY3Rpb24oZWxlbSl7DQoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0DQoJCQkvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5DQoJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsNCgkJCXJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlOw0KCQl9LA0KCQlwYXJlbnQ6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICEhZWxlbS5maXJzdENoaWxkOw0KCQl9LA0KCQllbXB0eTogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gIWVsZW0uZmlyc3RDaGlsZDsNCgkJfSwNCgkJaGFzOiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7DQoJCQlyZXR1cm4gISFTaXp6bGUoIG1hdGNoWzNdLCBlbGVtICkubGVuZ3RoOw0KCQl9LA0KCQloZWFkZXI6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICgvaFxkL2kpLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsNCgkJfSwNCgkJdGV4dDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gInRleHQiID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCXJhZGlvOiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiAicmFkaW8iID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCWNoZWNrYm94OiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiAiY2hlY2tib3giID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCWZpbGU6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICJmaWxlIiA9PT0gZWxlbS50eXBlOw0KCQl9LA0KCQlwYXNzd29yZDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gInBhc3N3b3JkIiA9PT0gZWxlbS50eXBlOw0KCQl9LA0KCQlzdWJtaXQ6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICJzdWJtaXQiID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCWltYWdlOiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiAiaW1hZ2UiID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCXJlc2V0OiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiAicmVzZXQiID09PSBlbGVtLnR5cGU7DQoJCX0sDQoJCWJ1dHRvbjogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gImJ1dHRvbiIgPT09IGVsZW0udHlwZSB8fCBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJidXR0b24iOw0KCQl9LA0KCQlpbnB1dDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gKC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kpLnRlc3QoZWxlbS5ub2RlTmFtZSk7DQoJCX0NCgl9LA0KCXNldEZpbHRlcnM6IHsNCgkJZmlyc3Q6IGZ1bmN0aW9uKGVsZW0sIGkpew0KCQkJcmV0dXJuIGkgPT09IDA7DQoJCX0sDQoJCWxhc3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoLCBhcnJheSl7DQoJCQlyZXR1cm4gaSA9PT0gYXJyYXkubGVuZ3RoIC0gMTsNCgkJfSwNCgkJZXZlbjogZnVuY3Rpb24oZWxlbSwgaSl7DQoJCQlyZXR1cm4gaSAlIDIgPT09IDA7DQoJCX0sDQoJCW9kZDogZnVuY3Rpb24oZWxlbSwgaSl7DQoJCQlyZXR1cm4gaSAlIDIgPT09IDE7DQoJCX0sDQoJCWx0OiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7DQoJCQlyZXR1cm4gaSA8IG1hdGNoWzNdIC0gMDsNCgkJfSwNCgkJZ3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsNCgkJCXJldHVybiBpID4gbWF0Y2hbM10gLSAwOw0KCQl9LA0KCQludGg6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsNCgkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7DQoJCX0sDQoJCWVxOiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7DQoJCQlyZXR1cm4gbWF0Y2hbM10gLSAwID09PSBpOw0KCQl9DQoJfSwNCglmaWx0ZXI6IHsNCgkJUFNFVURPOiBmdW5jdGlvbihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpew0KCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwgZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07DQoNCgkJCWlmICggZmlsdGVyICkgew0KCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOw0KCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsNCgkJCQlyZXR1cm4gKGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgU2l6emxlLmdldFRleHQoWyBlbGVtIF0pIHx8ICIiKS5pbmRleE9mKG1hdGNoWzNdKSA+PSAwOw0KCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gIm5vdCIgKSB7DQoJCQkJdmFyIG5vdCA9IG1hdGNoWzNdOw0KDQoJCQkJZm9yICggdmFyIGogPSAwLCBsID0gbm90Lmxlbmd0aDsgaiA8IGw7IGorKyApIHsNCgkJCQkJaWYgKCBub3Rbal0gPT09IGVsZW0gKSB7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0gZWxzZSB7DQoJCQkJU2l6emxlLmVycm9yKCAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIG5hbWUgKTsNCgkJCX0NCgkJfSwNCgkJQ0hJTEQ6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsNCgkJCXZhciB0eXBlID0gbWF0Y2hbMV0sIG5vZGUgPSBlbGVtOw0KCQkJc3dpdGNoICh0eXBlKSB7DQoJCQkJY2FzZSAnb25seSc6DQoJCQkJY2FzZSAnZmlyc3QnOg0KCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICkJIHsNCgkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsgDQoJCQkJCQkJcmV0dXJuIGZhbHNlOyANCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQlpZiAoIHR5cGUgPT09ICJmaXJzdCIgKSB7IA0KCQkJCQkJcmV0dXJuIHRydWU7IA0KCQkJCQl9DQoJCQkJCW5vZGUgPSBlbGVtOw0KCQkJCWNhc2UgJ2xhc3QnOg0KCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5uZXh0U2libGluZykgKQkgew0KCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgeyANCgkJCQkJCQlyZXR1cm4gZmFsc2U7IA0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCXJldHVybiB0cnVlOw0KCQkJCWNhc2UgJ250aCc6DQoJCQkJCXZhciBmaXJzdCA9IG1hdGNoWzJdLCBsYXN0ID0gbWF0Y2hbM107DQoNCgkJCQkJaWYgKCBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwICkgew0KCQkJCQkJcmV0dXJuIHRydWU7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXZhciBkb25lTmFtZSA9IG1hdGNoWzBdLA0KCQkJCQkJcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOw0KCQ0KCQkJCQlpZiAoIHBhcmVudCAmJiAocGFyZW50LnNpemNhY2hlICE9PSBkb25lTmFtZSB8fCAhZWxlbS5ub2RlSW5kZXgpICkgew0KCQkJCQkJdmFyIGNvdW50ID0gMDsNCgkJCQkJCWZvciAoIG5vZGUgPSBwYXJlbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcgKSB7DQoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQkJCQlub2RlLm5vZGVJbmRleCA9ICsrY291bnQ7DQoJCQkJCQkJfQ0KCQkJCQkJfSANCgkJCQkJCXBhcmVudC5zaXpjYWNoZSA9IGRvbmVOYW1lOw0KCQkJCQl9DQoJCQkJCQ0KCQkJCQl2YXIgZGlmZiA9IGVsZW0ubm9kZUluZGV4IC0gbGFzdDsNCgkJCQkJaWYgKCBmaXJzdCA9PT0gMCApIHsNCgkJCQkJCXJldHVybiBkaWZmID09PSAwOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJcmV0dXJuICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7DQoJCQkJCX0NCgkJCX0NCgkJfSwNCgkJSUQ6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsNCgkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpID09PSBtYXRjaDsNCgkJfSwNCgkJVEFHOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7DQoJCQlyZXR1cm4gKG1hdGNoID09PSAiKiIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSkgfHwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBtYXRjaDsNCgkJfSwNCgkJQ0xBU1M6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsNCgkJCXJldHVybiAoIiAiICsgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSArICIgIikNCgkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOw0KCQl9LA0KCQlBVFRSOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7DQoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLA0KCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8NCgkJCQkJRXhwci5hdHRySGFuZGxlWyBuYW1lIF0oIGVsZW0gKSA6DQoJCQkJCWVsZW1bIG5hbWUgXSAhPSBudWxsID8NCgkJCQkJCWVsZW1bIG5hbWUgXSA6DQoJCQkJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLA0KCQkJCXZhbHVlID0gcmVzdWx0ICsgIiIsDQoJCQkJdHlwZSA9IG1hdGNoWzJdLA0KCQkJCWNoZWNrID0gbWF0Y2hbNF07DQoNCgkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/DQoJCQkJdHlwZSA9PT0gIiE9IiA6DQoJCQkJdHlwZSA9PT0gIj0iID8NCgkJCQl2YWx1ZSA9PT0gY2hlY2sgOg0KCQkJCXR5cGUgPT09ICIqPSIgPw0KCQkJCXZhbHVlLmluZGV4T2YoY2hlY2spID49IDAgOg0KCQkJCXR5cGUgPT09ICJ+PSIgPw0KCQkJCSgiICIgKyB2YWx1ZSArICIgIikuaW5kZXhPZihjaGVjaykgPj0gMCA6DQoJCQkJIWNoZWNrID8NCgkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoNCgkJCQl0eXBlID09PSAiIT0iID8NCgkJCQl2YWx1ZSAhPT0gY2hlY2sgOg0KCQkJCXR5cGUgPT09ICJePSIgPw0KCQkJCXZhbHVlLmluZGV4T2YoY2hlY2spID09PSAwIDoNCgkJCQl0eXBlID09PSAiJD0iID8NCgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOg0KCQkJCXR5cGUgPT09ICJ8PSIgPw0KCQkJCXZhbHVlID09PSBjaGVjayB8fCB2YWx1ZS5zdWJzdHIoMCwgY2hlY2subGVuZ3RoICsgMSkgPT09IGNoZWNrICsgIi0iIDoNCgkJCQlmYWxzZTsNCgkJfSwNCgkJUE9TOiBmdW5jdGlvbihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpew0KCQkJdmFyIG5hbWUgPSBtYXRjaFsyXSwgZmlsdGVyID0gRXhwci5zZXRGaWx0ZXJzWyBuYW1lIF07DQoNCgkJCWlmICggZmlsdGVyICkgew0KCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOw0KCQkJfQ0KCQl9DQoJfQ0KfTsNCg0KdmFyIG9yaWdQT1MgPSBFeHByLm1hdGNoLlBPUywNCglmZXNjYXBlID0gZnVuY3Rpb24oYWxsLCBudW0pew0KCQlyZXR1cm4gIlxcIiArIChudW0gLSAwICsgMSk7DQoJfTsNCg0KZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsNCglFeHByLm1hdGNoWyB0eXBlIF0gPSBuZXcgUmVnRXhwKCBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlICsgKC8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSkgKTsNCglFeHByLmxlZnRNYXRjaFsgdHlwZSBdID0gbmV3IFJlZ0V4cCggLyheKD86LnxccnxcbikqPykvLnNvdXJjZSArIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLCBmZXNjYXBlKSApOw0KfQ0KDQp2YXIgbWFrZUFycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3VsdHMpIHsNCglhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSwgMCApOw0KDQoJaWYgKCByZXN1bHRzICkgew0KCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7DQoJCXJldHVybiByZXN1bHRzOw0KCX0NCgkNCglyZXR1cm4gYXJyYXk7DQp9Ow0KDQovLyBQZXJmb3JtIGEgc2ltcGxlIGNoZWNrIHRvIGRldGVybWluZSBpZiB0aGUgYnJvd3NlciBpcyBjYXBhYmxlIG9mDQovLyBjb252ZXJ0aW5nIGEgTm9kZUxpc3QgdG8gYW4gYXJyYXkgdXNpbmcgYnVpbHRpbiBtZXRob2RzLg0KLy8gQWxzbyB2ZXJpZmllcyB0aGF0IHRoZSByZXR1cm5lZCBhcnJheSBob2xkcyBET00gbm9kZXMNCi8vICh3aGljaCBpcyBub3QgdGhlIGNhc2UgaW4gdGhlIEJsYWNrYmVycnkgYnJvd3NlcikNCnRyeSB7DQoJQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLCAwIClbMF0ubm9kZVR5cGU7DQoNCi8vIFByb3ZpZGUgYSBmYWxsYmFjayBtZXRob2QgaWYgaXQgZG9lcyBub3Qgd29yaw0KfSBjYXRjaChlKXsNCgltYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgew0KCQl2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXSwgaSA9IDA7DQoNCgkJaWYgKCB0b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsNCgkJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCByZXQsIGFycmF5ICk7DQoJCX0gZWxzZSB7DQoJCQlpZiAoIHR5cGVvZiBhcnJheS5sZW5ndGggPT09ICJudW1iZXIiICkgew0KCQkJCWZvciAoIHZhciBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrICkgew0KCQkJCQlyZXQucHVzaCggYXJyYXlbaV0gKTsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCWZvciAoIDsgYXJyYXlbaV07IGkrKyApIHsNCgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIHJldDsNCgl9Ow0KfQ0KDQp2YXIgc29ydE9yZGVyOw0KDQppZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApIHsNCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsNCgkJaWYgKCAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiB8fCAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApIHsNCgkJCWlmICggYSA9PSBiICkgew0KCQkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7DQoJCQl9DQoJCQlyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/IC0xIDogMTsNCgkJfQ0KDQoJCXZhciByZXQgPSBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgNCA/IC0xIDogYSA9PT0gYiA/IDAgOiAxOw0KCQlpZiAoIHJldCA9PT0gMCApIHsNCgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7DQoJCX0NCgkJcmV0dXJuIHJldDsNCgl9Ow0KfSBlbHNlIGlmICggInNvdXJjZUluZGV4IiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgKSB7DQoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7DQoJCWlmICggIWEuc291cmNlSW5kZXggfHwgIWIuc291cmNlSW5kZXggKSB7DQoJCQlpZiAoIGEgPT0gYiApIHsNCgkJCQloYXNEdXBsaWNhdGUgPSB0cnVlOw0KCQkJfQ0KCQkJcmV0dXJuIGEuc291cmNlSW5kZXggPyAtMSA6IDE7DQoJCX0NCg0KCQl2YXIgcmV0ID0gYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7DQoJCWlmICggcmV0ID09PSAwICkgew0KCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsNCgkJfQ0KCQlyZXR1cm4gcmV0Ow0KCX07DQp9IGVsc2UgaWYgKCBkb2N1bWVudC5jcmVhdGVSYW5nZSApIHsNCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsNCgkJaWYgKCAhYS5vd25lckRvY3VtZW50IHx8ICFiLm93bmVyRG9jdW1lbnQgKSB7DQoJCQlpZiAoIGEgPT0gYiApIHsNCgkJCQloYXNEdXBsaWNhdGUgPSB0cnVlOw0KCQkJfQ0KCQkJcmV0dXJuIGEub3duZXJEb2N1bWVudCA/IC0xIDogMTsNCgkJfQ0KDQoJCXZhciBhUmFuZ2UgPSBhLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSwgYlJhbmdlID0gYi5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7DQoJCWFSYW5nZS5zZXRTdGFydChhLCAwKTsNCgkJYVJhbmdlLnNldEVuZChhLCAwKTsNCgkJYlJhbmdlLnNldFN0YXJ0KGIsIDApOw0KCQliUmFuZ2Uuc2V0RW5kKGIsIDApOw0KCQl2YXIgcmV0ID0gYVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsIGJSYW5nZSk7DQoJCWlmICggcmV0ID09PSAwICkgew0KCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsNCgkJfQ0KCQlyZXR1cm4gcmV0Ow0KCX07DQp9DQoNCi8vIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJlaXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzDQpTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtcyApIHsNCgl2YXIgcmV0ID0gIiIsIGVsZW07DQoNCglmb3IgKCB2YXIgaSA9IDA7IGVsZW1zW2ldOyBpKysgKSB7DQoJCWVsZW0gPSBlbGVtc1tpXTsNCg0KCQkvLyBHZXQgdGhlIHRleHQgZnJvbSB0ZXh0IG5vZGVzIGFuZCBDREFUQSBub2Rlcw0KCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gNCApIHsNCgkJCXJldCArPSBlbGVtLm5vZGVWYWx1ZTsNCg0KCQkvLyBUcmF2ZXJzZSBldmVyeXRoaW5nIGVsc2UsIGV4Y2VwdCBjb21tZW50IG5vZGVzDQoJCX0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgIT09IDggKSB7DQoJCQlyZXQgKz0gU2l6emxlLmdldFRleHQoIGVsZW0uY2hpbGROb2RlcyApOw0KCQl9DQoJfQ0KDQoJcmV0dXJuIHJldDsNCn07DQoNCi8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbg0KLy8gcXVlcnlpbmcgYnkgZ2V0RWxlbWVudEJ5SWQgKGFuZCBwcm92aWRlIGEgd29ya2Fyb3VuZCkNCihmdW5jdGlvbigpew0KCS8vIFdlJ3JlIGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUNCgl2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLA0KCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsNCglmb3JtLmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgaWQgKyAiJy8+IjsNCg0KCS8vIEluamVjdCBpdCBpbnRvIHRoZSByb290IGVsZW1lbnQsIGNoZWNrIGl0cyBzdGF0dXMsIGFuZCByZW1vdmUgaXQgcXVpY2tseQ0KCXZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KCXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290LmZpcnN0Q2hpbGQgKTsNCg0KCS8vIFRoZSB3b3JrYXJvdW5kIGhhcyB0byBkbyBhZGRpdGlvbmFsIGNoZWNrcyBhZnRlciBhIGdldEVsZW1lbnRCeUlkDQoJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0aGUgYnJhbmNoaW5nKQ0KCWlmICggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkICkgKSB7DQoJCUV4cHIuZmluZC5JRCA9IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7DQoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7DQoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsNCgkJCQlyZXR1cm4gbSA/IG0uaWQgPT09IG1hdGNoWzFdIHx8IHR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIG0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWUgPT09IG1hdGNoWzFdID8gW21dIDogdW5kZWZpbmVkIDogW107DQoJCQl9DQoJCX07DQoNCgkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbihlbGVtLCBtYXRjaCl7DQoJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsNCgkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIG5vZGUgJiYgbm9kZS5ub2RlVmFsdWUgPT09IG1hdGNoOw0KCQl9Ow0KCX0NCg0KCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsNCglyb290ID0gZm9ybSA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFDQp9KSgpOw0KDQooZnVuY3Rpb24oKXsNCgkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBvbmx5IGVsZW1lbnRzDQoJLy8gd2hlbiBkb2luZyBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpDQoNCgkvLyBDcmVhdGUgYSBmYWtlIGVsZW1lbnQNCgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOw0KDQoJLy8gTWFrZSBzdXJlIG5vIGNvbW1lbnRzIGFyZSBmb3VuZA0KCWlmICggZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoID4gMCApIHsNCgkJRXhwci5maW5kLlRBRyA9IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0KXsNCgkJCXZhciByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShtYXRjaFsxXSk7DQoNCgkJCS8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHMNCgkJCWlmICggbWF0Y2hbMV0gPT09ICIqIiApIHsNCgkJCQl2YXIgdG1wID0gW107DQoNCgkJCQlmb3IgKCB2YXIgaSA9IDA7IHJlc3VsdHNbaV07IGkrKyApIHsNCgkJCQkJaWYgKCByZXN1bHRzW2ldLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQkJdG1wLnB1c2goIHJlc3VsdHNbaV0gKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCXJlc3VsdHMgPSB0bXA7DQoJCQl9DQoNCgkJCXJldHVybiByZXN1bHRzOw0KCQl9Ow0KCX0NCg0KCS8vIENoZWNrIHRvIHNlZSBpZiBhbiBhdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcw0KCWRpdi5pbm5lckhUTUwgPSAiPGEgaHJlZj0nIyc+PC9hPiI7DQoJaWYgKCBkaXYuZmlyc3RDaGlsZCAmJiB0eXBlb2YgZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlICE9PSAidW5kZWZpbmVkIiAmJg0KCQkJZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgIT09ICIjIiApIHsNCgkJRXhwci5hdHRySGFuZGxlLmhyZWYgPSBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIsIDIpOw0KCQl9Ow0KCX0NCg0KCWRpdiA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFDQp9KSgpOw0KDQppZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSB7DQoJKGZ1bmN0aW9uKCl7DQoJCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KCQlkaXYuaW5uZXJIVE1MID0gIjxwIGNsYXNzPSdURVNUJz48L3A+IjsNCg0KCQkvLyBTYWZhcmkgY2FuJ3QgaGFuZGxlIHVwcGVyY2FzZSBvciB1bmljb2RlIGNoYXJhY3RlcnMgd2hlbg0KCQkvLyBpbiBxdWlya3MgbW9kZS4NCgkJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7DQoJCQlyZXR1cm47DQoJCX0NCgkNCgkJU2l6emxlID0gZnVuY3Rpb24ocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKXsNCgkJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50Ow0KDQoJCQkvLyBPbmx5IHVzZSBxdWVyeVNlbGVjdG9yQWxsIG9uIG5vbi1YTUwgZG9jdW1lbnRzDQoJCQkvLyAoSUQgc2VsZWN0b3JzIGRvbid0IHdvcmsgaW4gbm9uLUhUTUwgZG9jdW1lbnRzKQ0KCQkJaWYgKCAhc2VlZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmICFTaXp6bGUuaXNYTUwoY29udGV4dCkgKSB7DQoJCQkJdHJ5IHsNCgkJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsNCgkJCQl9IGNhdGNoKGUpe30NCgkJCX0NCgkJDQoJCQlyZXR1cm4gb2xkU2l6emxlKHF1ZXJ5LCBjb250ZXh0LCBleHRyYSwgc2VlZCk7DQoJCX07DQoNCgkJZm9yICggdmFyIHByb3AgaW4gb2xkU2l6emxlICkgew0KCQkJU2l6emxlWyBwcm9wIF0gPSBvbGRTaXp6bGVbIHByb3AgXTsNCgkJfQ0KDQoJCWRpdiA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFDQoJfSkoKTsNCn0NCg0KKGZ1bmN0aW9uKCl7DQoJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KDQoJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7DQoNCgkvLyBPcGVyYSBjYW4ndCBmaW5kIGEgc2Vjb25kIGNsYXNzbmFtZSAoaW4gOS42KQ0KCS8vIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGdldEVsZW1lbnRzQnlDbGFzc05hbWUgYWN0dWFsbHkgZXhpc3RzDQoJaWYgKCAhZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgfHwgZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDAgKSB7DQoJCXJldHVybjsNCgl9DQoNCgkvLyBTYWZhcmkgY2FjaGVzIGNsYXNzIGF0dHJpYnV0ZXMsIGRvZXNuJ3QgY2F0Y2ggY2hhbmdlcyAoaW4gMy4yKQ0KCWRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0gImUiOw0KDQoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMSApIHsNCgkJcmV0dXJuOw0KCX0NCgkNCglFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1MiKTsNCglFeHByLmZpbmQuQ0xBU1MgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpIHsNCgkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7DQoJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG1hdGNoWzFdKTsNCgkJfQ0KCX07DQoNCglkaXYgPSBudWxsOyAvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQ0KfSkoKTsNCg0KZnVuY3Rpb24gZGlyTm9kZUNoZWNrKCBkaXIsIGN1ciwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICkgew0KCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsNCgkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsNCgkJaWYgKCBlbGVtICkgew0KCQkJZWxlbSA9IGVsZW1bZGlyXTsNCgkJCXZhciBtYXRjaCA9IGZhbHNlOw0KDQoJCQl3aGlsZSAoIGVsZW0gKSB7DQoJCQkJaWYgKCBlbGVtLnNpemNhY2hlID09PSBkb25lTmFtZSApIHsNCgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07DQoJCQkJCWJyZWFrOw0KCQkJCX0NCg0KCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsNCgkJCQkJZWxlbS5zaXpjYWNoZSA9IGRvbmVOYW1lOw0KCQkJCQllbGVtLnNpenNldCA9IGk7DQoJCQkJfQ0KDQoJCQkJaWYgKCBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGN1ciApIHsNCgkJCQkJbWF0Y2ggPSBlbGVtOw0KCQkJCQlicmVhazsNCgkJCQl9DQoNCgkJCQllbGVtID0gZWxlbVtkaXJdOw0KCQkJfQ0KDQoJCQljaGVja1NldFtpXSA9IG1hdGNoOw0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsNCglmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7DQoJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07DQoJCWlmICggZWxlbSApIHsNCgkJCWVsZW0gPSBlbGVtW2Rpcl07DQoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsNCg0KCQkJd2hpbGUgKCBlbGVtICkgew0KCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7DQoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOw0KCQkJCQlicmVhazsNCgkJCQl9DQoNCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7DQoJCQkJCWlmICggIWlzWE1MICkgew0KCQkJCQkJZWxlbS5zaXpjYWNoZSA9IGRvbmVOYW1lOw0KCQkJCQkJZWxlbS5zaXpzZXQgPSBpOw0KCQkJCQl9DQoJCQkJCWlmICggdHlwZW9mIGN1ciAhPT0gInN0cmluZyIgKSB7DQoJCQkJCQlpZiAoIGVsZW0gPT09IGN1ciApIHsNCgkJCQkJCQltYXRjaCA9IHRydWU7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQl9DQoNCgkJCQkJfSBlbHNlIGlmICggU2l6emxlLmZpbHRlciggY3VyLCBbZWxlbV0gKS5sZW5ndGggPiAwICkgew0KCQkJCQkJbWF0Y2ggPSBlbGVtOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQllbGVtID0gZWxlbVtkaXJdOw0KCQkJfQ0KDQoJCQljaGVja1NldFtpXSA9IG1hdGNoOw0KCQl9DQoJfQ0KfQ0KDQpTaXp6bGUuY29udGFpbnMgPSBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/IGZ1bmN0aW9uKGEsIGIpew0KCXJldHVybiAhIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTYpOw0KfSA6IGZ1bmN0aW9uKGEsIGIpew0KCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5jb250YWlucyhiKSA6IHRydWUpOw0KfTsNCg0KU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oZWxlbSl7DQoJLy8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdA0KCS8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKSANCgl2YXIgZG9jdW1lbnRFbGVtZW50ID0gKGVsZW0gPyBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSA6IDApLmRvY3VtZW50RWxlbWVudDsNCglyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgOiBmYWxzZTsNCn07DQoNCnZhciBwb3NQcm9jZXNzID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQpew0KCXZhciB0bXBTZXQgPSBbXSwgbGF0ZXIgPSAiIiwgbWF0Y2gsDQoJCXJvb3QgPSBjb250ZXh0Lm5vZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4dDsNCg0KCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcg0KCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0byB0aGUgZW5kDQoJd2hpbGUgKCAobWF0Y2ggPSBFeHByLm1hdGNoLlBTRVVETy5leGVjKCBzZWxlY3RvciApKSApIHsNCgkJbGF0ZXIgKz0gbWF0Y2hbMF07DQoJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7DQoJfQ0KDQoJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7DQoNCglmb3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsNCgkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7DQoJfQ0KDQoJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsNCn07DQoNCi8vIEVYUE9TRQ0KDQp3aW5kb3cudGlueW1jZS5kb20uU2l6emxlID0gU2l6emxlOw0KDQp9KSgpOw0KDQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBlYWNoID0gdGlueW1jZS5lYWNoLCBET00gPSB0aW55bWNlLkRPTSwgaXNJRSA9IHRpbnltY2UuaXNJRSwgaXNXZWJLaXQgPSB0aW55bWNlLmlzV2ViS2l0LCBFdmVudDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLmRvbS5FdmVudFV0aWxzJywgew0KCQlFdmVudFV0aWxzIDogZnVuY3Rpb24oKSB7DQoJCQl0aGlzLmluaXRzID0gW107DQoJCQl0aGlzLmV2ZW50cyA9IFtdOw0KCQl9LA0KDQoJCWFkZCA6IGZ1bmN0aW9uKG8sIG4sIGYsIHMpIHsNCgkJCXZhciBjYiwgdCA9IHRoaXMsIGVsID0gdC5ldmVudHMsIHI7DQoNCgkJCWlmIChuIGluc3RhbmNlb2YgQXJyYXkpIHsNCgkJCQlyID0gW107DQoNCgkJCQllYWNoKG4sIGZ1bmN0aW9uKG4pIHsNCgkJCQkJci5wdXNoKHQuYWRkKG8sIG4sIGYsIHMpKTsNCgkJCQl9KTsNCg0KCQkJCXJldHVybiByOw0KCQkJfQ0KDQoJCQkvLyBIYW5kbGUgYXJyYXkNCgkJCWlmIChvICYmIG8uaGFzT3duUHJvcGVydHkgJiYgbyBpbnN0YW5jZW9mIEFycmF5KSB7DQoJCQkJciA9IFtdOw0KDQoJCQkJZWFjaChvLCBmdW5jdGlvbihvKSB7DQoJCQkJCW8gPSBET00uZ2V0KG8pOw0KCQkJCQlyLnB1c2godC5hZGQobywgbiwgZiwgcykpOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIHI7DQoJCQl9DQoNCgkJCW8gPSBET00uZ2V0KG8pOw0KDQoJCQlpZiAoIW8pDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBTZXR1cCBldmVudCBjYWxsYmFjaw0KCQkJY2IgPSBmdW5jdGlvbihlKSB7DQoJCQkJLy8gSXMgYWxsIGV2ZW50cyBkaXNhYmxlZA0KCQkJCWlmICh0LmRpc2FibGVkKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQllID0gZSB8fCB3aW5kb3cuZXZlbnQ7DQoNCgkJCQkvLyBQYXRjaCBpbiB0YXJnZXQsIHByZXZlbnREZWZhdWx0IGFuZCBzdG9wUHJvcGFnYXRpb24gaW4gSUUgaXQncyBXM0MgdmFsaWQNCgkJCQlpZiAoZSAmJiBpc0lFKSB7DQoJCQkJCWlmICghZS50YXJnZXQpDQoJCQkJCQllLnRhcmdldCA9IGUuc3JjRWxlbWVudDsNCg0KCQkJCQkvLyBQYXRjaCBpbiBwcmV2ZW50RGVmYXVsdCwgc3RvcFByb3BhZ2F0aW9uIG1ldGhvZHMgZm9yIFczQyBjb21wYXRpYmlsaXR5DQoJCQkJCXRpbnltY2UuZXh0ZW5kKGUsIHQuX3N0b3BwZXJzKTsNCgkJCQl9DQoNCgkJCQlpZiAoIXMpDQoJCQkJCXJldHVybiBmKGUpOw0KDQoJCQkJcmV0dXJuIGYuY2FsbChzLCBlKTsNCgkJCX07DQoNCgkJCWlmIChuID09ICd1bmxvYWQnKSB7DQoJCQkJdGlueW1jZS51bmxvYWRzLnVuc2hpZnQoe2Z1bmMgOiBjYn0pOw0KCQkJCXJldHVybiBjYjsNCgkJCX0NCg0KCQkJaWYgKG4gPT0gJ2luaXQnKSB7DQoJCQkJaWYgKHQuZG9tTG9hZGVkKQ0KCQkJCQljYigpOw0KCQkJCWVsc2UNCgkJCQkJdC5pbml0cy5wdXNoKGNiKTsNCg0KCQkJCXJldHVybiBjYjsNCgkJCX0NCg0KCQkJLy8gU3RvcmUgYXdheSBsaXN0ZW5lciByZWZlcmVuY2UNCgkJCWVsLnB1c2goew0KCQkJCW9iaiA6IG8sDQoJCQkJbmFtZSA6IG4sDQoJCQkJZnVuYyA6IGYsDQoJCQkJY2Z1bmMgOiBjYiwNCgkJCQlzY29wZSA6IHMNCgkJCX0pOw0KDQoJCQl0Ll9hZGQobywgbiwgY2IpOw0KDQoJCQlyZXR1cm4gZjsNCgkJfSwNCg0KCQlyZW1vdmUgOiBmdW5jdGlvbihvLCBuLCBmKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGEgPSB0LmV2ZW50cywgcyA9IGZhbHNlLCByOw0KDQoJCQkvLyBIYW5kbGUgYXJyYXkNCgkJCWlmIChvICYmIG8uaGFzT3duUHJvcGVydHkgJiYgbyBpbnN0YW5jZW9mIEFycmF5KSB7DQoJCQkJciA9IFtdOw0KDQoJCQkJZWFjaChvLCBmdW5jdGlvbihvKSB7DQoJCQkJCW8gPSBET00uZ2V0KG8pOw0KCQkJCQlyLnB1c2godC5yZW1vdmUobywgbiwgZikpOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuIHI7DQoJCQl9DQoNCgkJCW8gPSBET00uZ2V0KG8pOw0KDQoJCQllYWNoKGEsIGZ1bmN0aW9uKGUsIGkpIHsNCgkJCQlpZiAoZS5vYmogPT0gbyAmJiBlLm5hbWUgPT0gbiAmJiAoIWYgfHwgKGUuZnVuYyA9PSBmIHx8IGUuY2Z1bmMgPT0gZikpKSB7DQoJCQkJCWEuc3BsaWNlKGksIDEpOw0KCQkJCQl0Ll9yZW1vdmUobywgbiwgZS5jZnVuYyk7DQoJCQkJCXMgPSB0cnVlOw0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXJldHVybiBzOw0KCQl9LA0KDQoJCWNsZWFyIDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzLCBhID0gdC5ldmVudHMsIGksIGU7DQoNCgkJCWlmIChvKSB7DQoJCQkJbyA9IERPTS5nZXQobyk7DQoNCgkJCQlmb3IgKGkgPSBhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCWUgPSBhW2ldOw0KDQoJCQkJCWlmIChlLm9iaiA9PT0gbykgew0KCQkJCQkJdC5fcmVtb3ZlKGUub2JqLCBlLm5hbWUsIGUuY2Z1bmMpOw0KCQkJCQkJZS5vYmogPSBlLmNmdW5jID0gbnVsbDsNCgkJCQkJCWEuc3BsaWNlKGksIDEpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KDQoJCWNhbmNlbCA6IGZ1bmN0aW9uKGUpIHsNCgkJCWlmICghZSkNCgkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCXRoaXMuc3RvcChlKTsNCg0KCQkJcmV0dXJuIHRoaXMucHJldmVudChlKTsNCgkJfSwNCg0KCQlzdG9wIDogZnVuY3Rpb24oZSkgew0KCQkJaWYgKGUuc3RvcFByb3BhZ2F0aW9uKQ0KCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7DQoJCQllbHNlDQoJCQkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0sDQoNCgkJcHJldmVudCA6IGZ1bmN0aW9uKGUpIHsNCgkJCWlmIChlLnByZXZlbnREZWZhdWx0KQ0KCQkJCWUucHJldmVudERlZmF1bHQoKTsNCgkJCWVsc2UNCgkJCQllLnJldHVyblZhbHVlID0gZmFsc2U7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfSwNCg0KCQlkZXN0cm95IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCWVhY2godC5ldmVudHMsIGZ1bmN0aW9uKGUsIGkpIHsNCgkJCQl0Ll9yZW1vdmUoZS5vYmosIGUubmFtZSwgZS5jZnVuYyk7DQoJCQkJZS5vYmogPSBlLmNmdW5jID0gbnVsbDsNCgkJCX0pOw0KDQoJCQl0LmV2ZW50cyA9IFtdOw0KCQkJdCA9IG51bGw7DQoJCX0sDQoNCgkJX2FkZCA6IGZ1bmN0aW9uKG8sIG4sIGYpIHsNCgkJCWlmIChvLmF0dGFjaEV2ZW50KQ0KCQkJCW8uYXR0YWNoRXZlbnQoJ29uJyArIG4sIGYpOw0KCQkJZWxzZSBpZiAoby5hZGRFdmVudExpc3RlbmVyKQ0KCQkJCW8uYWRkRXZlbnRMaXN0ZW5lcihuLCBmLCBmYWxzZSk7DQoJCQllbHNlDQoJCQkJb1snb24nICsgbl0gPSBmOw0KCQl9LA0KDQoJCV9yZW1vdmUgOiBmdW5jdGlvbihvLCBuLCBmKSB7DQoJCQlpZiAobykgew0KCQkJCXRyeSB7DQoJCQkJCWlmIChvLmRldGFjaEV2ZW50KQ0KCQkJCQkJby5kZXRhY2hFdmVudCgnb24nICsgbiwgZik7DQoJCQkJCWVsc2UgaWYgKG8ucmVtb3ZlRXZlbnRMaXN0ZW5lcikNCgkJCQkJCW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLCBmLCBmYWxzZSk7DQoJCQkJCWVsc2UNCgkJCQkJCW9bJ29uJyArIG5dID0gbnVsbDsNCgkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkvLyBNaWdodCBmYWlsIHdpdGggcGVybWlzc2lvbiBkZW5pbmVkIG9uIElFIHNvIHdlIGp1c3QgaWdub3JlIHRoYXQNCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkJX3BhZ2VJbml0IDogZnVuY3Rpb24od2luKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCS8vIEtlZXAgaXQgZnJvbSBydW5uaW5nIG1vcmUgdGhhbiBvbmNlDQoJCQlpZiAodC5kb21Mb2FkZWQpDQoJCQkJcmV0dXJuOw0KDQoJCQl0LmRvbUxvYWRlZCA9IHRydWU7DQoNCgkJCWVhY2godC5pbml0cywgZnVuY3Rpb24oYykgew0KCQkJCWMoKTsNCgkJCX0pOw0KDQoJCQl0LmluaXRzID0gW107DQoJCX0sDQoNCgkJX3dhaXQgOiBmdW5jdGlvbih3aW4pIHsNCgkJCXZhciB0ID0gdGhpcywgZG9jID0gd2luLmRvY3VtZW50Ow0KDQoJCQkvLyBObyBuZWVkIHNpbmNlIHRoZSBkb2N1bWVudCBpcyBhbHJlYWR5IGxvYWRlZA0KCQkJaWYgKHdpbi50aW55TUNFX0daICYmIHRpbnlNQ0VfR1oubG9hZGVkKSB7DQoJCQkJdC5kb21Mb2FkZWQgPSAxOw0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJLy8gVXNlIElFIG1ldGhvZA0KCQkJaWYgKGRvYy5hdHRhY2hFdmVudCkgew0KCQkJCWRvYy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7DQoJCQkJCWlmIChkb2MucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KCQkJCQkJZG9jLmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsNCgkJCQkJCXQuX3BhZ2VJbml0KHdpbik7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCWlmIChkb2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICYmIHdpbiA9PSB3aW4udG9wKSB7DQoJCQkJCShmdW5jdGlvbigpIHsNCgkJCQkJCWlmICh0LmRvbUxvYWRlZCkNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCXRyeSB7DQoJCQkJCQkJLy8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkNCgkJCQkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLw0KCQkJCQkJCWRvYy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKTsNCgkJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkJc2V0VGltZW91dChhcmd1bWVudHMuY2FsbGVlLCAwKTsNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCXQuX3BhZ2VJbml0KHdpbik7DQoJCQkJCX0pKCk7DQoJCQkJfQ0KCQkJfSBlbHNlIGlmIChkb2MuYWRkRXZlbnRMaXN0ZW5lcikgew0KCQkJCXQuX2FkZCh3aW4sICdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7DQoJCQkJCXQuX3BhZ2VJbml0KHdpbik7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXQuX2FkZCh3aW4sICdsb2FkJywgZnVuY3Rpb24oKSB7DQoJCQkJdC5fcGFnZUluaXQod2luKTsNCgkJCX0pOw0KCQl9LA0KDQoJCV9zdG9wcGVycyA6IHsNCgkJCXByZXZlbnREZWZhdWx0IDogIGZ1bmN0aW9uKCkgew0KCQkJCXRoaXMucmV0dXJuVmFsdWUgPSBmYWxzZTsNCgkJCX0sDQoNCgkJCXN0b3BQcm9wYWdhdGlvbiA6IGZ1bmN0aW9uKCkgew0KCQkJCXRoaXMuY2FuY2VsQnViYmxlID0gdHJ1ZTsNCgkJCX0NCgkJfQ0KCX0pOw0KDQoJRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCA9IG5ldyB0aW55bWNlLmRvbS5FdmVudFV0aWxzKCk7DQoNCgkvLyBEaXNwYXRjaCBET00gY29udGVudCBsb2FkZWQgZXZlbnQgZm9yIElFIGFuZCBTYWZhcmkNCglFdmVudC5fd2FpdCh3aW5kb3cpOw0KDQoJdGlueW1jZS5hZGRVbmxvYWQoZnVuY3Rpb24oKSB7DQoJCUV2ZW50LmRlc3Ryb3koKTsNCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXRpbnltY2UuZG9tLkVsZW1lbnQgPSBmdW5jdGlvbihpZCwgc2V0dGluZ3MpIHsNCgkJdmFyIHQgPSB0aGlzLCBkb20sIGVsOw0KDQoJCXQuc2V0dGluZ3MgPSBzZXR0aW5ncyA9IHNldHRpbmdzIHx8IHt9Ow0KCQl0LmlkID0gaWQ7DQoJCXQuZG9tID0gZG9tID0gc2V0dGluZ3MuZG9tIHx8IHRpbnltY2UuRE9NOw0KDQoJCS8vIE9ubHkgSUUgbGVha3MgRE9NIHJlZmVyZW5jZXMsIHRoaXMgaXMgYSBsb3QgZmFzdGVyDQoJCWlmICghdGlueW1jZS5pc0lFKQ0KCQkJZWwgPSBkb20uZ2V0KHQuaWQpOw0KDQoJCXRpbnltY2UuZWFjaCgNCgkJCQkoJ2dldFBvcyxnZXRSZWN0LGdldFBhcmVudCxhZGQsc2V0U3R5bGUsZ2V0U3R5bGUsc2V0U3R5bGVzLCcgKyANCgkJCQknc2V0QXR0cmliLHNldEF0dHJpYnMsZ2V0QXR0cmliLGFkZENsYXNzLHJlbW92ZUNsYXNzLCcgKyANCgkJCQknaGFzQ2xhc3MsZ2V0T3V0ZXJIVE1MLHNldE91dGVySFRNTCxyZW1vdmUsc2hvdyxoaWRlLCcgKyANCgkJCQknaXNIaWRkZW4sc2V0SFRNTCxnZXQnKS5zcGxpdCgvLC8pDQoJCQksIGZ1bmN0aW9uKGspIHsNCgkJCQl0W2tdID0gZnVuY3Rpb24oKSB7DQoJCQkJCXZhciBhID0gW2lkXSwgaTsNCg0KCQkJCQlmb3IgKGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQ0KCQkJCQkJYS5wdXNoKGFyZ3VtZW50c1tpXSk7DQoNCgkJCQkJYSA9IGRvbVtrXS5hcHBseShkb20sIGEpOw0KCQkJCQl0LnVwZGF0ZShrKTsNCg0KCQkJCQlyZXR1cm4gYTsNCgkJCQl9Ow0KCQl9KTsNCg0KCQl0aW55bWNlLmV4dGVuZCh0LCB7DQoJCQlvbiA6IGZ1bmN0aW9uKG4sIGYsIHMpIHsNCgkJCQlyZXR1cm4gdGlueW1jZS5kb20uRXZlbnQuYWRkKHQuaWQsIG4sIGYsIHMpOw0KCQkJfSwNCg0KCQkJZ2V0WFkgOiBmdW5jdGlvbigpIHsNCgkJCQlyZXR1cm4gew0KCQkJCQl4IDogcGFyc2VJbnQodC5nZXRTdHlsZSgnbGVmdCcpKSwNCgkJCQkJeSA6IHBhcnNlSW50KHQuZ2V0U3R5bGUoJ3RvcCcpKQ0KCQkJCX07DQoJCQl9LA0KDQoJCQlnZXRTaXplIDogZnVuY3Rpb24oKSB7DQoJCQkJdmFyIG4gPSBkb20uZ2V0KHQuaWQpOw0KDQoJCQkJcmV0dXJuIHsNCgkJCQkJdyA6IHBhcnNlSW50KHQuZ2V0U3R5bGUoJ3dpZHRoJykgfHwgbi5jbGllbnRXaWR0aCksDQoJCQkJCWggOiBwYXJzZUludCh0LmdldFN0eWxlKCdoZWlnaHQnKSB8fCBuLmNsaWVudEhlaWdodCkNCgkJCQl9Ow0KCQkJfSwNCg0KCQkJbW92ZVRvIDogZnVuY3Rpb24oeCwgeSkgew0KCQkJCXQuc2V0U3R5bGVzKHtsZWZ0IDogeCwgdG9wIDogeX0pOw0KCQkJfSwNCg0KCQkJbW92ZUJ5IDogZnVuY3Rpb24oeCwgeSkgew0KCQkJCXZhciBwID0gdC5nZXRYWSgpOw0KDQoJCQkJdC5tb3ZlVG8ocC54ICsgeCwgcC55ICsgeSk7DQoJCQl9LA0KDQoJCQlyZXNpemVUbyA6IGZ1bmN0aW9uKHcsIGgpIHsNCgkJCQl0LnNldFN0eWxlcyh7d2lkdGggOiB3LCBoZWlnaHQgOiBofSk7DQoJCQl9LA0KDQoJCQlyZXNpemVCeSA6IGZ1bmN0aW9uKHcsIGgpIHsNCgkJCQl2YXIgcyA9IHQuZ2V0U2l6ZSgpOw0KDQoJCQkJdC5yZXNpemVUbyhzLncgKyB3LCBzLmggKyBoKTsNCgkJCX0sDQoNCgkJCXVwZGF0ZSA6IGZ1bmN0aW9uKGspIHsNCgkJCQl2YXIgYjsNCg0KCQkJCWlmICh0aW55bWNlLmlzSUU2ICYmIHNldHRpbmdzLmJsb2NrZXIpIHsNCgkJCQkJayA9IGsgfHwgJyc7DQoNCgkJCQkJLy8gSWdub3JlIGdldHRlcnMNCgkJCQkJaWYgKGsuaW5kZXhPZignZ2V0JykgPT09IDAgfHwgay5pbmRleE9mKCdoYXMnKSA9PT0gMCB8fCBrLmluZGV4T2YoJ2lzJykgPT09IDApDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJLy8gUmVtb3ZlIGJsb2NrZXIgb24gcmVtb3ZlDQoJCQkJCWlmIChrID09ICdyZW1vdmUnKSB7DQoJCQkJCQlkb20ucmVtb3ZlKHQuYmxvY2tlcik7DQoJCQkJCQlyZXR1cm47DQoJCQkJCX0NCg0KCQkJCQlpZiAoIXQuYmxvY2tlcikgew0KCQkJCQkJdC5ibG9ja2VyID0gZG9tLnVuaXF1ZUlkKCk7DQoJCQkJCQliID0gZG9tLmFkZChzZXR0aW5ncy5jb250YWluZXIgfHwgZG9tLmdldFJvb3QoKSwgJ2lmcmFtZScsIHtpZCA6IHQuYmxvY2tlciwgc3R5bGUgOiAncG9zaXRpb246YWJzb2x1dGU7JywgZnJhbWVCb3JkZXIgOiAwLCBzcmMgOiAnamF2YXNjcmlwdDoiIid9KTsNCgkJCQkJCWRvbS5zZXRTdHlsZShiLCAnb3BhY2l0eScsIDApOw0KCQkJCQl9IGVsc2UNCgkJCQkJCWIgPSBkb20uZ2V0KHQuYmxvY2tlcik7DQoNCgkJCQkJZG9tLnNldFN0eWxlcyhiLCB7DQoJCQkJCQlsZWZ0IDogdC5nZXRTdHlsZSgnbGVmdCcsIDEpLA0KCQkJCQkJdG9wIDogdC5nZXRTdHlsZSgndG9wJywgMSksDQoJCQkJCQl3aWR0aCA6IHQuZ2V0U3R5bGUoJ3dpZHRoJywgMSksDQoJCQkJCQloZWlnaHQgOiB0LmdldFN0eWxlKCdoZWlnaHQnLCAxKSwNCgkJCQkJCWRpc3BsYXkgOiB0LmdldFN0eWxlKCdkaXNwbGF5JywgMSksDQoJCQkJCQl6SW5kZXggOiBwYXJzZUludCh0LmdldFN0eWxlKCd6SW5kZXgnLCAxKSB8fCAwKSAtIDENCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KCQl9KTsNCgl9Ow0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJZnVuY3Rpb24gdHJpbU5sKHMpIHsNCgkJcmV0dXJuIHMucmVwbGFjZSgvW1xuXHJdKy9nLCAnJyk7DQoJfTsNCg0KCS8vIFNob3J0ZW4gbmFtZXMNCgl2YXIgaXMgPSB0aW55bWNlLmlzLCBpc0lFID0gdGlueW1jZS5pc0lFLCBlYWNoID0gdGlueW1jZS5lYWNoOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UuZG9tLlNlbGVjdGlvbicsIHsNCgkJU2VsZWN0aW9uIDogZnVuY3Rpb24oZG9tLCB3aW4sIHNlcmlhbGl6ZXIpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5kb20gPSBkb207DQoJCQl0LndpbiA9IHdpbjsNCgkJCXQuc2VyaWFsaXplciA9IHNlcmlhbGl6ZXI7DQoNCgkJCS8vIEFkZCBldmVudHMNCgkJCWVhY2goWw0KCQkJCSdvbkJlZm9yZVNldENvbnRlbnQnLA0KCQkJCSdvbkJlZm9yZUdldENvbnRlbnQnLA0KCQkJCSdvblNldENvbnRlbnQnLA0KCQkJCSdvbkdldENvbnRlbnQnDQoJCQldLCBmdW5jdGlvbihlKSB7DQoJCQkJdFtlXSA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0KTsNCgkJCX0pOw0KDQoJCQkvLyBObyBXM0MgUmFuZ2Ugc3VwcG9ydA0KCQkJaWYgKCF0Lndpbi5nZXRTZWxlY3Rpb24pDQoJCQkJdC50cmlkZW50U2VsID0gbmV3IHRpbnltY2UuZG9tLlRyaWRlbnRTZWxlY3Rpb24odCk7DQoNCgkJCWlmICh0aW55bWNlLmlzSUUgJiYgZG9tLmJveE1vZGVsKQ0KCQkJCXRoaXMuX2ZpeElFU2VsZWN0aW9uKCk7DQoNCgkJCS8vIFByZXZlbnQgbGVha3MNCgkJCXRpbnltY2UuYWRkVW5sb2FkKHQuZGVzdHJveSwgdCk7DQoJCX0sDQoNCgkJZ2V0Q29udGVudCA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgciA9IHQuZ2V0Um5nKCksIGUgPSB0LmRvbS5jcmVhdGUoImJvZHkiKSwgc2UgPSB0LmdldFNlbCgpLCB3Yiwgd2EsIG47DQoNCgkJCXMgPSBzIHx8IHt9Ow0KCQkJd2IgPSB3YSA9ICcnOw0KCQkJcy5nZXQgPSB0cnVlOw0KCQkJcy5mb3JtYXQgPSBzLmZvcm1hdCB8fCAnaHRtbCc7DQoJCQl0Lm9uQmVmb3JlR2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCg0KCQkJaWYgKHMuZm9ybWF0ID09ICd0ZXh0JykNCgkJCQlyZXR1cm4gdC5pc0NvbGxhcHNlZCgpID8gJycgOiAoci50ZXh0IHx8IChzZS50b1N0cmluZyA/IHNlLnRvU3RyaW5nKCkgOiAnJykpOw0KDQoJCQlpZiAoci5jbG9uZUNvbnRlbnRzKSB7DQoJCQkJbiA9IHIuY2xvbmVDb250ZW50cygpOw0KDQoJCQkJaWYgKG4pDQoJCQkJCWUuYXBwZW5kQ2hpbGQobik7DQoJCQl9IGVsc2UgaWYgKGlzKHIuaXRlbSkgfHwgaXMoci5odG1sVGV4dCkpDQoJCQkJZS5pbm5lckhUTUwgPSByLml0ZW0gPyByLml0ZW0oMCkub3V0ZXJIVE1MIDogci5odG1sVGV4dDsNCgkJCWVsc2UNCgkJCQllLmlubmVySFRNTCA9IHIudG9TdHJpbmcoKTsNCg0KCQkJLy8gS2VlcCB3aGl0ZXNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXINCgkJCWlmICgvXlxzLy50ZXN0KGUuaW5uZXJIVE1MKSkNCgkJCQl3YiA9ICcgJzsNCg0KCQkJaWYgKC9ccyskLy50ZXN0KGUuaW5uZXJIVE1MKSkNCgkJCQl3YSA9ICcgJzsNCg0KCQkJcy5nZXRJbm5lciA9IHRydWU7DQoNCgkJCXMuY29udGVudCA9IHQuaXNDb2xsYXBzZWQoKSA/ICcnIDogd2IgKyB0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKGUsIHMpICsgd2E7DQoJCQl0Lm9uR2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCg0KCQkJcmV0dXJuIHMuY29udGVudDsNCgkJfSwNCg0KCQlzZXRDb250ZW50IDogZnVuY3Rpb24oaCwgcykgew0KCQkJdmFyIHQgPSB0aGlzLCByID0gdC5nZXRSbmcoKSwgYywgZCA9IHQud2luLmRvY3VtZW50Ow0KDQoJCQlzID0gcyB8fCB7Zm9ybWF0IDogJ2h0bWwnfTsNCgkJCXMuc2V0ID0gdHJ1ZTsNCgkJCWggPSBzLmNvbnRlbnQgPSB0LmRvbS5wcm9jZXNzSFRNTChoKTsNCg0KCQkJLy8gRGlzcGF0Y2ggYmVmb3JlIHNldCBjb250ZW50IGV2ZW50DQoJCQl0Lm9uQmVmb3JlU2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCgkJCWggPSBzLmNvbnRlbnQ7DQoNCgkJCWlmIChyLmluc2VydE5vZGUpIHsNCgkJCQkvLyBNYWtlIGNhcmV0IG1hcmtlciBzaW5jZSBpbnNlcnROb2RlIHBsYWNlcyB0aGUgY2FyZXQgaW4gdGhlIGJlZ2lubmluZyBvZiB0ZXh0IGFmdGVyIGluc2VydA0KCQkJCWggKz0gJzxzcGFuIGlkPSJfX2NhcmV0Ij5fPC9zcGFuPic7DQoNCgkJCQkvLyBEZWxldGUgYW5kIGluc2VydCBuZXcgbm9kZQ0KCQkJCQ0KCQkJCWlmIChyLnN0YXJ0Q29udGFpbmVyID09IGQgJiYgci5lbmRDb250YWluZXIgPT0gIGQpIHsNCgkJCQkJLy8gV2ViS2l0IHdpbGwgZmFpbCBpZiB0aGUgYm9keSBpcyBlbXB0eSBzaW5jZSB0aGUgcmFuZ2UgaXMgdGhlbiBpbnZhbGlkIGFuZCBpdCBjYW4ndCBpbnNlcnQgY29udGVudHMNCgkJCQkJZC5ib2R5LmlubmVySFRNTCA9IGg7DQoJCQkJfSBlbHNlIHsNCgkJCQkJci5kZWxldGVDb250ZW50cygpOw0KCQkJCQlpZiAoZC5ib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09IDApIHsNCgkJCQkJCWQuYm9keS5pbm5lckhUTUwgPSBoOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJLy8gY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IGRvZXNuJ3QgZXhpc3RzIGluIElFIDkgRE9NUmFuZ2VzDQoJCQkJCQlpZiAoci5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQpIHsNCgkJCQkJCQlyLmluc2VydE5vZGUoci5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaCkpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkvLyBGYWtlIGNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCBjYWxsIGluIElFIDkNCgkJCQkJCQl2YXIgZnJhZyA9IGQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLCB0ZW1wID0gZC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KCQkJCQkJCWZyYWcuYXBwZW5kQ2hpbGQodGVtcCk7DQoJCQkJCQkJdGVtcC5vdXRlckhUTUwgPSBoOw0KDQoJCQkJCQkJci5pbnNlcnROb2RlKGZyYWcpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gTW92ZSB0byBjYXJldCBtYXJrZXINCgkJCQljID0gdC5kb20uZ2V0KCdfX2NhcmV0Jyk7DQoJCQkJLy8gTWFrZSBzdXJlIHdlIHdyYXAgaXQgY29tcGxlYXRseSwgT3BlcmEgZmFpbHMgd2l0aCBhIHNpbXBsZSBzZWxlY3QgY2FsbA0KCQkJCXIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoJCQkJci5zZXRTdGFydEJlZm9yZShjKTsNCgkJCQlyLnNldEVuZEJlZm9yZShjKTsNCgkJCQl0LnNldFJuZyhyKTsNCg0KCQkJCS8vIFJlbW92ZSB0aGUgY2FyZXQgcG9zaXRpb24NCgkJCQl0LmRvbS5yZW1vdmUoJ19fY2FyZXQnKTsNCgkJCX0gZWxzZSB7DQoJCQkJaWYgKHIuaXRlbSkgew0KCQkJCQkvLyBEZWxldGUgY29udGVudCBhbmQgZ2V0IGNhcmV0IHRleHQgc2VsZWN0aW9uDQoJCQkJCWQuZXhlY0NvbW1hbmQoJ0RlbGV0ZScsIGZhbHNlLCBudWxsKTsNCgkJCQkJciA9IHQuZ2V0Um5nKCk7DQoJCQkJfQ0KDQoJCQkJci5wYXN0ZUhUTUwoaCk7DQoJCQl9DQoNCgkJCS8vIERpc3BhdGNoIHNldCBjb250ZW50IGV2ZW50DQoJCQl0Lm9uU2V0Q29udGVudC5kaXNwYXRjaCh0LCBzKTsNCgkJfSwNCg0KCQlnZXRTdGFydCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHJuZyA9IHRoaXMuZ2V0Um5nKCksIHN0YXJ0RWxlbWVudCwgcGFyZW50RWxlbWVudCwgY2hlY2tSbmcsIG5vZGU7DQoNCgkJCWlmIChybmcuZHVwbGljYXRlIHx8IHJuZy5pdGVtKSB7DQoJCQkJLy8gQ29udHJvbCBzZWxlY3Rpb24sIHJldHVybiBmaXJzdCBpdGVtDQoJCQkJaWYgKHJuZy5pdGVtKQ0KCQkJCQlyZXR1cm4gcm5nLml0ZW0oMCk7DQoNCgkJCQkvLyBHZXQgc3RhcnQgZWxlbWVudA0KCQkJCWNoZWNrUm5nID0gcm5nLmR1cGxpY2F0ZSgpOw0KCQkJCWNoZWNrUm5nLmNvbGxhcHNlKDEpOw0KCQkJCXN0YXJ0RWxlbWVudCA9IGNoZWNrUm5nLnBhcmVudEVsZW1lbnQoKTsNCg0KCQkJCS8vIENoZWNrIGlmIHJhbmdlIHBhcmVudCBpcyBpbnNpZGUgdGhlIHN0YXJ0IGVsZW1lbnQsIHRoZW4gcmV0dXJuIHRoZSBpbm5lciBwYXJlbnQgZWxlbWVudA0KCQkJCS8vIFRoaXMgd2lsbCBmaXggaXNzdWVzIHdoZW4gYSBzaW5nbGUgZWxlbWVudCBpcyBzZWxlY3RlZCwgSUUgd291bGQgb3RoZXJ3aXNlIHJldHVybiB0aGUgd3Jvbmcgc3RhcnQgZWxlbWVudA0KCQkJCXBhcmVudEVsZW1lbnQgPSBub2RlID0gcm5nLnBhcmVudEVsZW1lbnQoKTsNCgkJCQl3aGlsZSAobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkgew0KCQkJCQlpZiAobm9kZSA9PSBzdGFydEVsZW1lbnQpIHsNCgkJCQkJCXN0YXJ0RWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIElmIHN0YXJ0IGVsZW1lbnQgaXMgYm9keSBlbGVtZW50IHRyeSB0byBtb3ZlIHRvIHRoZSBmaXJzdCBjaGlsZCBpZiBpdCBleGlzdHMNCgkJCQlpZiAoc3RhcnRFbGVtZW50ICYmIHN0YXJ0RWxlbWVudC5ub2RlTmFtZSA9PSAnQk9EWScpDQoJCQkJCXJldHVybiBzdGFydEVsZW1lbnQuZmlyc3RDaGlsZCB8fCBzdGFydEVsZW1lbnQ7DQoNCgkJCQlyZXR1cm4gc3RhcnRFbGVtZW50Ow0KCQkJfSBlbHNlIHsNCgkJCQlzdGFydEVsZW1lbnQgPSBybmcuc3RhcnRDb250YWluZXI7DQoNCgkJCQlpZiAoc3RhcnRFbGVtZW50Lm5vZGVUeXBlID09IDEgJiYgc3RhcnRFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkNCgkJCQkJc3RhcnRFbGVtZW50ID0gc3RhcnRFbGVtZW50LmNoaWxkTm9kZXNbTWF0aC5taW4oc3RhcnRFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoIC0gMSwgcm5nLnN0YXJ0T2Zmc2V0KV07DQoNCgkJCQlpZiAoc3RhcnRFbGVtZW50ICYmIHN0YXJ0RWxlbWVudC5ub2RlVHlwZSA9PSAzKQ0KCQkJCQlyZXR1cm4gc3RhcnRFbGVtZW50LnBhcmVudE5vZGU7DQoNCgkJCQlyZXR1cm4gc3RhcnRFbGVtZW50Ow0KCQkJfQ0KCQl9LA0KDQoJCWdldEVuZCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCByID0gdC5nZXRSbmcoKSwgZSwgZW87DQoNCgkJCWlmIChyLmR1cGxpY2F0ZSB8fCByLml0ZW0pIHsNCgkJCQlpZiAoci5pdGVtKQ0KCQkJCQlyZXR1cm4gci5pdGVtKDApOw0KDQoJCQkJciA9IHIuZHVwbGljYXRlKCk7DQoJCQkJci5jb2xsYXBzZSgwKTsNCgkJCQllID0gci5wYXJlbnRFbGVtZW50KCk7DQoNCgkJCQlpZiAoZSAmJiBlLm5vZGVOYW1lID09ICdCT0RZJykNCgkJCQkJcmV0dXJuIGUubGFzdENoaWxkIHx8IGU7DQoNCgkJCQlyZXR1cm4gZTsNCgkJCX0gZWxzZSB7DQoJCQkJZSA9IHIuZW5kQ29udGFpbmVyOw0KCQkJCWVvID0gci5lbmRPZmZzZXQ7DQoNCgkJCQlpZiAoZS5ub2RlVHlwZSA9PSAxICYmIGUuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCQllID0gZS5jaGlsZE5vZGVzW2VvID4gMCA/IGVvIC0gMSA6IGVvXTsNCg0KCQkJCWlmIChlICYmIGUubm9kZVR5cGUgPT0gMykNCgkJCQkJcmV0dXJuIGUucGFyZW50Tm9kZTsNCg0KCQkJCXJldHVybiBlOw0KCQkJfQ0KCQl9LA0KDQoJCWdldEJvb2ttYXJrIDogZnVuY3Rpb24odHlwZSwgbm9ybWFsaXplZCkgew0KCQkJdmFyIHQgPSB0aGlzLCBkb20gPSB0LmRvbSwgcm5nLCBybmcyLCBpZCwgY29sbGFwc2VkLCBuYW1lLCBlbGVtZW50LCBpbmRleCwgY2hyID0gJ1x1RkVGRicsIHN0eWxlczsNCg0KCQkJZnVuY3Rpb24gZmluZEluZGV4KG5hbWUsIGVsZW1lbnQpIHsNCgkJCQl2YXIgaW5kZXggPSAwOw0KDQoJCQkJZWFjaChkb20uc2VsZWN0KG5hbWUpLCBmdW5jdGlvbihub2RlLCBpKSB7DQoJCQkJCWlmIChub2RlID09IGVsZW1lbnQpDQoJCQkJCQlpbmRleCA9IGk7DQoJCQkJfSk7DQoNCgkJCQlyZXR1cm4gaW5kZXg7DQoJCQl9Ow0KDQoJCQlpZiAodHlwZSA9PSAyKSB7DQoJCQkJZnVuY3Rpb24gZ2V0TG9jYXRpb24oKSB7DQoJCQkJCXZhciBybmcgPSB0LmdldFJuZyh0cnVlKSwgcm9vdCA9IGRvbS5nZXRSb290KCksIGJvb2ttYXJrID0ge307DQoNCgkJCQkJZnVuY3Rpb24gZ2V0UG9pbnQocm5nLCBzdGFydCkgew0KCQkJCQkJdmFyIGNvbnRhaW5lciA9IHJuZ1tzdGFydCA/ICdzdGFydENvbnRhaW5lcicgOiAnZW5kQ29udGFpbmVyJ10sDQoJCQkJCQkJb2Zmc2V0ID0gcm5nW3N0YXJ0ID8gJ3N0YXJ0T2Zmc2V0JyA6ICdlbmRPZmZzZXQnXSwgcG9pbnQgPSBbXSwgbm9kZSwgY2hpbGROb2RlcywgYWZ0ZXIgPSAwOw0KDQoJCQkJCQlpZiAoY29udGFpbmVyLm5vZGVUeXBlID09IDMpIHsNCgkJCQkJCQlpZiAobm9ybWFsaXplZCkgew0KCQkJCQkJCQlmb3IgKG5vZGUgPSBjb250YWluZXIucHJldmlvdXNTaWJsaW5nOyBub2RlICYmIG5vZGUubm9kZVR5cGUgPT0gMzsgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKQ0KCQkJCQkJCQkJb2Zmc2V0ICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDsNCgkJCQkJCQl9DQoNCgkJCQkJCQlwb2ludC5wdXNoKG9mZnNldCk7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCWNoaWxkTm9kZXMgPSBjb250YWluZXIuY2hpbGROb2RlczsNCg0KCQkJCQkJCWlmIChvZmZzZXQgPj0gY2hpbGROb2Rlcy5sZW5ndGggJiYgY2hpbGROb2Rlcy5sZW5ndGgpIHsNCgkJCQkJCQkJYWZ0ZXIgPSAxOw0KCQkJCQkJCQlvZmZzZXQgPSBNYXRoLm1heCgwLCBjaGlsZE5vZGVzLmxlbmd0aCAtIDEpOw0KCQkJCQkJCX0NCg0KCQkJCQkJCXBvaW50LnB1c2godC5kb20ubm9kZUluZGV4KGNoaWxkTm9kZXNbb2Zmc2V0XSwgbm9ybWFsaXplZCkgKyBhZnRlcik7DQoJCQkJCQl9DQoNCgkJCQkJCWZvciAoOyBjb250YWluZXIgJiYgY29udGFpbmVyICE9IHJvb3Q7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlKQ0KCQkJCQkJCXBvaW50LnB1c2godC5kb20ubm9kZUluZGV4KGNvbnRhaW5lciwgbm9ybWFsaXplZCkpOw0KDQoJCQkJCQlyZXR1cm4gcG9pbnQ7DQoJCQkJCX07DQoNCgkJCQkJYm9va21hcmsuc3RhcnQgPSBnZXRQb2ludChybmcsIHRydWUpOw0KDQoJCQkJCWlmICghdC5pc0NvbGxhcHNlZCgpKQ0KCQkJCQkJYm9va21hcmsuZW5kID0gZ2V0UG9pbnQocm5nKTsNCg0KCQkJCQlyZXR1cm4gYm9va21hcms7DQoJCQkJfTsNCg0KCQkJCXJldHVybiBnZXRMb2NhdGlvbigpOw0KCQkJfQ0KDQoJCQkvLyBIYW5kbGUgc2ltcGxlIHJhbmdlDQoJCQlpZiAodHlwZSkNCgkJCQlyZXR1cm4ge3JuZyA6IHQuZ2V0Um5nKCl9Ow0KDQoJCQlybmcgPSB0LmdldFJuZygpOw0KCQkJaWQgPSBkb20udW5pcXVlSWQoKTsNCgkJCWNvbGxhcHNlZCA9IHRpbnlNQ0UuYWN0aXZlRWRpdG9yLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpOw0KCQkJc3R5bGVzID0gJ292ZXJmbG93OmhpZGRlbjtsaW5lLWhlaWdodDowcHgnOw0KDQoJCQkvLyBFeHBsb3JlciBtZXRob2QNCgkJCWlmIChybmcuZHVwbGljYXRlIHx8IHJuZy5pdGVtKSB7DQoJCQkJLy8gVGV4dCBzZWxlY3Rpb24NCgkJCQlpZiAoIXJuZy5pdGVtKSB7DQoJCQkJCXJuZzIgPSBybmcuZHVwbGljYXRlKCk7DQoNCgkJCQkJLy8gSW5zZXJ0IHN0YXJ0IG1hcmtlcg0KCQkJCQlybmcuY29sbGFwc2UoKTsNCgkJCQkJcm5nLnBhc3RlSFRNTCgnPHNwYW4gX21jZV90eXBlPSJib29rbWFyayIgaWQ9IicgKyBpZCArICdfc3RhcnQiIHN0eWxlPSInICsgc3R5bGVzICsgJyI+JyArIGNociArICc8L3NwYW4+Jyk7DQoNCgkJCQkJLy8gSW5zZXJ0IGVuZCBtYXJrZXINCgkJCQkJaWYgKCFjb2xsYXBzZWQpIHsNCgkJCQkJCXJuZzIuY29sbGFwc2UoZmFsc2UpOw0KCQkJCQkJcm5nMi5wYXN0ZUhUTUwoJzxzcGFuIF9tY2VfdHlwZT0iYm9va21hcmsiIGlkPSInICsgaWQgKyAnX2VuZCIgc3R5bGU9IicgKyBzdHlsZXMgKyAnIj4nICsgY2hyICsgJzwvc3Bhbj4nKTsNCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIENvbnRyb2wgc2VsZWN0aW9uDQoJCQkJCWVsZW1lbnQgPSBybmcuaXRlbSgwKTsNCgkJCQkJbmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7DQoNCgkJCQkJcmV0dXJuIHtuYW1lIDogbmFtZSwgaW5kZXggOiBmaW5kSW5kZXgobmFtZSwgZWxlbWVudCl9Ow0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZWxlbWVudCA9IHQuZ2V0Tm9kZSgpOw0KCQkJCW5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lOw0KCQkJCWlmIChuYW1lID09ICdJTUcnKQ0KCQkJCQlyZXR1cm4ge25hbWUgOiBuYW1lLCBpbmRleCA6IGZpbmRJbmRleChuYW1lLCBlbGVtZW50KX07DQoNCgkJCQkvLyBXM0MgbWV0aG9kDQoJCQkJcm5nMiA9IHJuZy5jbG9uZVJhbmdlKCk7DQoNCgkJCQkvLyBJbnNlcnQgZW5kIG1hcmtlcg0KCQkJCWlmICghY29sbGFwc2VkKSB7DQoJCQkJCXJuZzIuY29sbGFwc2UoZmFsc2UpOw0KCQkJCQlybmcyLmluc2VydE5vZGUoZG9tLmNyZWF0ZSgnc3BhbicsIHtfbWNlX3R5cGUgOiAiYm9va21hcmsiLCBpZCA6IGlkICsgJ19lbmQnLCBzdHlsZSA6IHN0eWxlc30sIGNocikpOw0KCQkJCX0NCg0KCQkJCXJuZy5jb2xsYXBzZSh0cnVlKTsNCgkJCQlybmcuaW5zZXJ0Tm9kZShkb20uY3JlYXRlKCdzcGFuJywge19tY2VfdHlwZSA6ICJib29rbWFyayIsIGlkIDogaWQgKyAnX3N0YXJ0Jywgc3R5bGUgOiBzdHlsZXN9LCBjaHIpKTsNCgkJCX0NCg0KCQkJdC5tb3ZlVG9Cb29rbWFyayh7aWQgOiBpZCwga2VlcCA6IDF9KTsNCg0KCQkJcmV0dXJuIHtpZCA6IGlkfTsNCgkJfSwNCg0KCQltb3ZlVG9Cb29rbWFyayA6IGZ1bmN0aW9uKGJvb2ttYXJrKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGRvbSA9IHQuZG9tLCBtYXJrZXIxLCBtYXJrZXIyLCBybmcsIHJvb3QsIHN0YXJ0Q29udGFpbmVyLCBlbmRDb250YWluZXIsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7DQoNCgkJCS8vIENsZWFyIHNlbGVjdGlvbiBjYWNoZQ0KCQkJaWYgKHQudHJpZGVudFNlbCkNCgkJCQl0LnRyaWRlbnRTZWwuZGVzdHJveSgpOw0KDQoJCQlpZiAoYm9va21hcmspIHsNCgkJCQlpZiAoYm9va21hcmsuc3RhcnQpIHsNCgkJCQkJcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KCQkJCQlyb290ID0gZG9tLmdldFJvb3QoKTsNCg0KCQkJCQlmdW5jdGlvbiBzZXRFbmRQb2ludChzdGFydCkgew0KCQkJCQkJdmFyIHBvaW50ID0gYm9va21hcmtbc3RhcnQgPyAnc3RhcnQnIDogJ2VuZCddLCBpLCBub2RlLCBvZmZzZXQsIGNoaWxkcmVuOw0KDQoJCQkJCQlpZiAocG9pbnQpIHsNCgkJCQkJCQkvLyBGaW5kIGNvbnRhaW5lciBub2RlDQoJCQkJCQkJZm9yIChub2RlID0gcm9vdCwgaSA9IHBvaW50Lmxlbmd0aCAtIDE7IGkgPj0gMTsgaS0tKSB7DQoJCQkJCQkJCWNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzOw0KDQoJCQkJCQkJCWlmIChjaGlsZHJlbi5sZW5ndGgpDQoJCQkJCQkJCQlub2RlID0gY2hpbGRyZW5bcG9pbnRbaV1dOw0KCQkJCQkJCX0NCg0KCQkJCQkJCS8vIFNldCBvZmZzZXQgd2l0aGluIGNvbnRhaW5lciBub2RlDQoJCQkJCQkJaWYgKHN0YXJ0KQ0KCQkJCQkJCQlybmcuc2V0U3RhcnQobm9kZSwgcG9pbnRbMF0pOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJcm5nLnNldEVuZChub2RlLCBwb2ludFswXSk7DQoJCQkJCQl9DQoJCQkJCX07DQoNCgkJCQkJc2V0RW5kUG9pbnQodHJ1ZSk7DQoJCQkJCXNldEVuZFBvaW50KCk7DQoNCgkJCQkJdC5zZXRSbmcocm5nKTsNCgkJCQl9IGVsc2UgaWYgKGJvb2ttYXJrLmlkKSB7DQoJCQkJCWZ1bmN0aW9uIHJlc3RvcmVFbmRQb2ludChzdWZmaXgpIHsNCgkJCQkJCXZhciBtYXJrZXIgPSBkb20uZ2V0KGJvb2ttYXJrLmlkICsgJ18nICsgc3VmZml4KSwgbm9kZSwgaWR4LCBuZXh0LCBwcmV2LCBrZWVwID0gYm9va21hcmsua2VlcDsNCg0KCQkJCQkJaWYgKG1hcmtlcikgew0KCQkJCQkJCW5vZGUgPSBtYXJrZXIucGFyZW50Tm9kZTsNCg0KCQkJCQkJCWlmIChzdWZmaXggPT0gJ3N0YXJ0Jykgew0KCQkJCQkJCQlpZiAoIWtlZXApIHsNCgkJCQkJCQkJCWlkeCA9IGRvbS5ub2RlSW5kZXgobWFya2VyKTsNCgkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCW5vZGUgPSBtYXJrZXIuZmlyc3RDaGlsZDsNCgkJCQkJCQkJCWlkeCA9IDE7DQoJCQkJCQkJCX0NCg0KCQkJCQkJCQlzdGFydENvbnRhaW5lciA9IGVuZENvbnRhaW5lciA9IG5vZGU7DQoJCQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0ID0gaWR4Ow0KCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCWlmICgha2VlcCkgew0KCQkJCQkJCQkJaWR4ID0gZG9tLm5vZGVJbmRleChtYXJrZXIpOw0KCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJbm9kZSA9IG1hcmtlci5maXJzdENoaWxkOw0KCQkJCQkJCQkJaWR4ID0gMTsNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCWVuZENvbnRhaW5lciA9IG5vZGU7DQoJCQkJCQkJCWVuZE9mZnNldCA9IGlkeDsNCgkJCQkJCQl9DQoNCgkJCQkJCQlpZiAoIWtlZXApIHsNCgkJCQkJCQkJcHJldiA9IG1hcmtlci5wcmV2aW91c1NpYmxpbmc7DQoJCQkJCQkJCW5leHQgPSBtYXJrZXIubmV4dFNpYmxpbmc7DQoNCgkJCQkJCQkJLy8gUmVtb3ZlIGFsbCBtYXJrZXIgdGV4dCBub2Rlcw0KCQkJCQkJCQllYWNoKHRpbnltY2UuZ3JlcChtYXJrZXIuY2hpbGROb2RlcyksIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDMpDQoJCQkJCQkJCQkJbm9kZS5ub2RlVmFsdWUgPSBub2RlLm5vZGVWYWx1ZS5yZXBsYWNlKC9cdUZFRkYvZywgJycpOw0KCQkJCQkJCQl9KTsNCg0KCQkJCQkJCQkvLyBSZW1vdmUgbWFya2VyIGJ1dCBrZWVwIGNoaWxkcmVuIGlmIGZvciBleGFtcGxlIGNvbnRlbnRzIHdoZXJlIGluc2VydGVkIGludG8gdGhlIG1hcmtlcg0KCQkJCQkJCQkvLyBBbHNvIHJlbW92ZSBkdXBsaWNhdGVkIGluc3RhbmNlcyBvZiB0aGUgbWFya2VyIGZvciBleGFtcGxlIGJ5IGEgc3BsaXQgb3BlcmF0aW9uIG9yIGJ5IFdlYktpdCBhdXRvIHNwbGl0IG9uIHBhc3RlIGZlYXR1cmUNCgkJCQkJCQkJd2hpbGUgKG1hcmtlciA9IGRvbS5nZXQoYm9va21hcmsuaWQgKyAnXycgKyBzdWZmaXgpKQ0KCQkJCQkJCQkJZG9tLnJlbW92ZShtYXJrZXIsIDEpOw0KDQoJCQkJCQkJCS8vIElmIHNpYmxpbmdzIGFyZSB0ZXh0IG5vZGVzIHRoZW4gbWVyZ2UgdGhlbSB1bmxlc3MgaXQncyBPcGVyYSBzaW5jZSBpdCBzb21lIGhvdyByZW1vdmVzIHRoZSBub2RlDQoJCQkJCQkJCS8vIGFuZCB3ZSBhcmUgc25pZmZpbmcgc2luY2UgYWRkaW5nIGEgbG90IG9mIGRldGVjdGlvbiBjb2RlIGZvciBhIGJyb3dzZXIgd2l0aCAzJSBvZiB0aGUgbWFya2V0IGlzbid0IHdvcnRoIHRoZSBlZmZvcnQuIFNvcnJ5LCBPcGVyYSBidXQgaXQncyBqdXN0IGEgZmFjdA0KCQkJCQkJCQlpZiAocHJldiAmJiBuZXh0ICYmIHByZXYubm9kZVR5cGUgPT0gbmV4dC5ub2RlVHlwZSAmJiBwcmV2Lm5vZGVUeXBlID09IDMgJiYgIXRpbnltY2UuaXNPcGVyYSkgew0KCQkJCQkJCQkJaWR4ID0gcHJldi5ub2RlVmFsdWUubGVuZ3RoOw0KCQkJCQkJCQkJcHJldi5hcHBlbmREYXRhKG5leHQubm9kZVZhbHVlKTsNCgkJCQkJCQkJCWRvbS5yZW1vdmUobmV4dCk7DQoNCgkJCQkJCQkJCWlmIChzdWZmaXggPT0gJ3N0YXJ0Jykgew0KCQkJCQkJCQkJCXN0YXJ0Q29udGFpbmVyID0gZW5kQ29udGFpbmVyID0gcHJldjsNCgkJCQkJCQkJCQlzdGFydE9mZnNldCA9IGVuZE9mZnNldCA9IGlkeDsNCgkJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQkJZW5kQ29udGFpbmVyID0gcHJldjsNCgkJCQkJCQkJCQllbmRPZmZzZXQgPSBpZHg7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX07DQoNCgkJCQkJZnVuY3Rpb24gYWRkQm9ndXMobm9kZSkgew0KCQkJCQkJLy8gQWRkcyBhIGJvZ3VzIEJSIGVsZW1lbnQgZm9yIGVtcHR5IGJsb2NrIGVsZW1lbnRzDQoJCQkJCQkvLyBvbiBub24gSUUgYnJvd3NlcnMganVzdCB0byBoYXZlIGEgcGxhY2UgdG8gcHV0IHRoZSBjYXJldA0KCQkJCQkJaWYgKCFpc0lFICYmIGRvbS5pc0Jsb2NrKG5vZGUpICYmICFub2RlLmlubmVySFRNTCkNCgkJCQkJCQlub2RlLmlubmVySFRNTCA9ICc8YnIgX21jZV9ib2d1cz0iMSIgLz4nOw0KDQoJCQkJCQlyZXR1cm4gbm9kZTsNCgkJCQkJfTsNCg0KCQkJCQkvLyBSZXN0b3JlIHN0YXJ0L2VuZCBwb2ludHMNCgkJCQkJcmVzdG9yZUVuZFBvaW50KCdzdGFydCcpOw0KCQkJCQlyZXN0b3JlRW5kUG9pbnQoJ2VuZCcpOw0KDQoJCQkJCWlmIChzdGFydENvbnRhaW5lcikgew0KCQkJCQkJcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KCQkJCQkJcm5nLnNldFN0YXJ0KGFkZEJvZ3VzKHN0YXJ0Q29udGFpbmVyKSwgc3RhcnRPZmZzZXQpOw0KCQkJCQkJcm5nLnNldEVuZChhZGRCb2d1cyhlbmRDb250YWluZXIpLCBlbmRPZmZzZXQpOw0KCQkJCQkJdC5zZXRSbmcocm5nKTsNCgkJCQkJfQ0KCQkJCX0gZWxzZSBpZiAoYm9va21hcmsubmFtZSkgew0KCQkJCQl0LnNlbGVjdChkb20uc2VsZWN0KGJvb2ttYXJrLm5hbWUpW2Jvb2ttYXJrLmluZGV4XSk7DQoJCQkJfSBlbHNlIGlmIChib29rbWFyay5ybmcpDQoJCQkJCXQuc2V0Um5nKGJvb2ttYXJrLnJuZyk7DQoJCQl9DQoJCX0sDQoNCgkJc2VsZWN0IDogZnVuY3Rpb24obm9kZSwgY29udGVudCkgew0KCQkJdmFyIHQgPSB0aGlzLCBkb20gPSB0LmRvbSwgcm5nID0gZG9tLmNyZWF0ZVJuZygpLCBpZHg7DQoNCgkJCWlkeCA9IGRvbS5ub2RlSW5kZXgobm9kZSk7DQoJCQlybmcuc2V0U3RhcnQobm9kZS5wYXJlbnROb2RlLCBpZHgpOw0KCQkJcm5nLnNldEVuZChub2RlLnBhcmVudE5vZGUsIGlkeCArIDEpOw0KDQoJCQkvLyBGaW5kIGZpcnN0L2xhc3QgdGV4dCBub2RlIG9yIEJSIGVsZW1lbnQNCgkJCWlmIChjb250ZW50KSB7DQoJCQkJZnVuY3Rpb24gc2V0UG9pbnQobm9kZSwgc3RhcnQpIHsNCgkJCQkJdmFyIHdhbGtlciA9IG5ldyB0aW55bWNlLmRvbS5UcmVlV2Fsa2VyKG5vZGUsIG5vZGUpOw0KDQoJCQkJCWRvIHsNCgkJCQkJCS8vIFRleHQgbm9kZQ0KCQkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiB0aW55bWNlLnRyaW0obm9kZS5ub2RlVmFsdWUpLmxlbmd0aCAhPSAwKSB7DQoJCQkJCQkJaWYgKHN0YXJ0KQ0KCQkJCQkJCQlybmcuc2V0U3RhcnQobm9kZSwgMCk7DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCQlybmcuc2V0RW5kKG5vZGUsIG5vZGUubm9kZVZhbHVlLmxlbmd0aCk7DQoNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEJSIGVsZW1lbnQNCgkJCQkJCWlmIChub2RlLm5vZGVOYW1lID09ICdCUicpIHsNCgkJCQkJCQlpZiAoc3RhcnQpDQoJCQkJCQkJCXJuZy5zZXRTdGFydEJlZm9yZShub2RlKTsNCgkJCQkJCQllbHNlDQoJCQkJCQkJCXJuZy5zZXRFbmRCZWZvcmUobm9kZSk7DQoNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoJCQkJCX0gd2hpbGUgKG5vZGUgPSAoc3RhcnQgPyB3YWxrZXIubmV4dCgpIDogd2Fsa2VyLnByZXYoKSkpOw0KCQkJCX07DQoNCgkJCQlzZXRQb2ludChub2RlLCAxKTsNCgkJCQlzZXRQb2ludChub2RlKTsNCgkJCX0NCg0KCQkJdC5zZXRSbmcocm5nKTsNCg0KCQkJcmV0dXJuIG5vZGU7DQoJCX0sDQoNCgkJaXNDb2xsYXBzZWQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgciA9IHQuZ2V0Um5nKCksIHMgPSB0LmdldFNlbCgpOw0KDQoJCQlpZiAoIXIgfHwgci5pdGVtKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJaWYgKHIuY29tcGFyZUVuZFBvaW50cykNCgkJCQlyZXR1cm4gci5jb21wYXJlRW5kUG9pbnRzKCdTdGFydFRvRW5kJywgcikgPT09IDA7DQoNCgkJCXJldHVybiAhcyB8fCByLmNvbGxhcHNlZDsNCgkJfSwNCg0KCQljb2xsYXBzZSA6IGZ1bmN0aW9uKGIpIHsNCgkJCXZhciB0ID0gdGhpcywgciA9IHQuZ2V0Um5nKCksIG47DQoNCgkJCS8vIENvbnRyb2wgcmFuZ2Ugb24gSUUNCgkJCWlmIChyLml0ZW0pIHsNCgkJCQluID0gci5pdGVtKDApOw0KCQkJCXIgPSB0aGlzLndpbi5kb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOw0KCQkJCXIubW92ZVRvRWxlbWVudFRleHQobik7DQoJCQl9DQoNCgkJCXIuY29sbGFwc2UoISFiKTsNCgkJCXQuc2V0Um5nKHIpOw0KCQl9LA0KDQoJCWdldFNlbCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCB3ID0gdGhpcy53aW47DQoNCgkJCXJldHVybiB3LmdldFNlbGVjdGlvbiA/IHcuZ2V0U2VsZWN0aW9uKCkgOiB3LmRvY3VtZW50LnNlbGVjdGlvbjsNCgkJfSwNCg0KCQlnZXRSbmcgOiBmdW5jdGlvbih3M2MpIHsNCgkJCXZhciB0ID0gdGhpcywgcywgciwgZWxtLCBkb2MgPSB0Lndpbi5kb2N1bWVudDsNCg0KCQkJLy8gRm91bmQgdHJpZGVudFNlbCBvYmplY3QgdGhlbiB3ZSBuZWVkIHRvIHVzZSB0aGF0IG9uZQ0KCQkJaWYgKHczYyAmJiB0LnRyaWRlbnRTZWwpDQoJCQkJcmV0dXJuIHQudHJpZGVudFNlbC5nZXRSYW5nZUF0KDApOw0KDQoJCQl0cnkgew0KCQkJCWlmIChzID0gdC5nZXRTZWwoKSkNCgkJCQkJciA9IHMucmFuZ2VDb3VudCA+IDAgPyBzLmdldFJhbmdlQXQoMCkgOiAocy5jcmVhdGVSYW5nZSA/IHMuY3JlYXRlUmFuZ2UoKSA6IGRvYy5jcmVhdGVSYW5nZSgpKTsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJLy8gSUUgdGhyb3dzIHVuc3BlY2lmaWVkIGVycm9yIGhlcmUgaWYgVGlueU1DRSBpcyBwbGFjZWQgaW4gYSBmcmFtZS9pZnJhbWUNCgkJCX0NCg0KCQkJLy8gV2UgaGF2ZSBXM0MgcmFuZ2VzIGFuZCBpdCdzIElFIHRoZW4gZmFrZSBjb250cm9sIHNlbGVjdGlvbiBzaW5jZSBJRTkgZG9lc24ndCBoYW5kbGUgdGhhdCBjb3JyZWN0bHkgeWV0DQoJCQlpZiAodGlueW1jZS5pc0lFICYmIHIuc2V0U3RhcnQgJiYgZG9jLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLml0ZW0pIHsNCgkJCQllbG0gPSBkb2Muc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaXRlbSgwKTsNCgkJCQlyID0gZG9jLmNyZWF0ZVJhbmdlKCk7DQoJCQkJci5zZXRTdGFydEJlZm9yZShlbG0pOw0KCQkJCXIuc2V0RW5kQWZ0ZXIoZWxtKTsNCgkJCX0NCg0KCQkJLy8gTm8gcmFuZ2UgZm91bmQgdGhlbiBjcmVhdGUgYW4gZW1wdHkgb25lDQoJCQkvLyBUaGlzIGNhbiBvY2N1ciB3aGVuIHRoZSBlZGl0b3IgaXMgcGxhY2VkIGluIGEgaGlkZGVuIGNvbnRhaW5lciBlbGVtZW50IG9uIEdlY2tvDQoJCQkvLyBPciBvbiBJRSB3aGVuIHRoZXJlIHdhcyBhbiBleGNlcHRpb24NCgkJCWlmICghcikNCgkJCQlyID0gZG9jLmNyZWF0ZVJhbmdlID8gZG9jLmNyZWF0ZVJhbmdlKCkgOiBkb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsNCg0KCQkJaWYgKHQuc2VsZWN0ZWRSYW5nZSAmJiB0LmV4cGxpY2l0UmFuZ2UpIHsNCgkJCQlpZiAoci5jb21wYXJlQm91bmRhcnlQb2ludHMoci5TVEFSVF9UT19TVEFSVCwgdC5zZWxlY3RlZFJhbmdlKSA9PT0gMCAmJiByLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhyLkVORF9UT19FTkQsIHQuc2VsZWN0ZWRSYW5nZSkgPT09IDApIHsNCgkJCQkJLy8gU2FmYXJpLCBPcGVyYSBhbmQgQ2hyb21lIG9ubHkgZXZlciBzZWxlY3QgdGV4dCB3aGljaCBjYXVzZXMgdGhlIHJhbmdlIHRvIGNoYW5nZS4NCgkJCQkJLy8gVGhpcyBsZXRzIHVzIHVzZSB0aGUgb3JpZ2luYWxseSBzZXQgcmFuZ2UgaWYgdGhlIHNlbGVjdGlvbiBoYXNuJ3QgYmVlbiBjaGFuZ2VkIGJ5IHRoZSB1c2VyLg0KCQkJCQlyID0gdC5leHBsaWNpdFJhbmdlOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXQuc2VsZWN0ZWRSYW5nZSA9IG51bGw7DQoJCQkJCXQuZXhwbGljaXRSYW5nZSA9IG51bGw7DQoJCQkJfQ0KCQkJfQ0KCQkJcmV0dXJuIHI7DQoJCX0sDQoNCgkJc2V0Um5nIDogZnVuY3Rpb24ocikgew0KCQkJdmFyIHMsIHQgPSB0aGlzOw0KCQkJDQoJCQlpZiAoIXQudHJpZGVudFNlbCkgew0KCQkJCXMgPSB0LmdldFNlbCgpOw0KDQoJCQkJaWYgKHMpIHsNCgkJCQkJdC5leHBsaWNpdFJhbmdlID0gcjsNCgkJCQkJcy5yZW1vdmVBbGxSYW5nZXMoKTsNCgkJCQkJcy5hZGRSYW5nZShyKTsNCgkJCQkJdC5zZWxlY3RlZFJhbmdlID0gcy5nZXRSYW5nZUF0KDApOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJLy8gSXMgVzNDIFJhbmdlDQoJCQkJaWYgKHIuY2xvbmVSYW5nZSkgew0KCQkJCQl0LnRyaWRlbnRTZWwuYWRkUmFuZ2Uocik7DQoJCQkJCXJldHVybjsNCgkJCQl9DQoNCgkJCQkvLyBJcyBJRSBzcGVjaWZpYyByYW5nZQ0KCQkJCXRyeSB7DQoJCQkJCXIuc2VsZWN0KCk7DQoJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJLy8gTmVlZGVkIGZvciBzb21lIG9kZCBJRSBidWcgIzE4NDMzMDYNCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkJc2V0Tm9kZSA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5zZXRDb250ZW50KHQuZG9tLmdldE91dGVySFRNTChuKSk7DQoNCgkJCXJldHVybiBuOw0KCQl9LA0KDQoJCWdldE5vZGUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcm5nID0gdC5nZXRSbmcoKSwgc2VsID0gdC5nZXRTZWwoKSwgZWxtOw0KDQoJCQlpZiAocm5nLnNldFN0YXJ0KSB7DQoJCQkJLy8gUmFuZ2UgbWF5YmUgbG9zdCBhZnRlciB0aGUgZWRpdG9yIGlzIG1hZGUgdmlzaWJsZSBhZ2Fpbg0KCQkJCWlmICghcm5nKQ0KCQkJCQlyZXR1cm4gdC5kb20uZ2V0Um9vdCgpOw0KDQoJCQkJZWxtID0gcm5nLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyOw0KDQoJCQkJLy8gSGFuZGxlIHNlbGVjdGlvbiBhIGltYWdlIG9yIG90aGVyIGNvbnRyb2wgbGlrZSBlbGVtZW50IHN1Y2ggYXMgYW5jaG9ycw0KCQkJCWlmICghcm5nLmNvbGxhcHNlZCkgew0KCQkJCQlpZiAocm5nLnN0YXJ0Q29udGFpbmVyID09IHJuZy5lbmRDb250YWluZXIpIHsNCgkJCQkJCWlmIChybmcuc3RhcnRPZmZzZXQgLSBybmcuZW5kT2Zmc2V0IDwgMikgew0KCQkJCQkJCWlmIChybmcuc3RhcnRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCQkJCQllbG0gPSBybmcuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tybmcuc3RhcnRPZmZzZXRdOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJLy8gSWYgdGhlIGFuY2hvciBub2RlIGlzIGEgZWxlbWVudCBpbnN0ZWFkIG9mIGEgdGV4dCBub2RlIHRoZW4gcmV0dXJuIHRoaXMgZWxlbWVudA0KCQkJCQlpZiAodGlueW1jZS5pc1dlYktpdCAmJiBzZWwuYW5jaG9yTm9kZSAmJiBzZWwuYW5jaG9yTm9kZS5ub2RlVHlwZSA9PSAxKSANCgkJCQkJCXJldHVybiBzZWwuYW5jaG9yTm9kZS5jaGlsZE5vZGVzW3NlbC5hbmNob3JPZmZzZXRdOyANCgkJCQl9DQoNCgkJCQlpZiAoZWxtICYmIGVsbS5ub2RlVHlwZSA9PSAzKQ0KCQkJCQlyZXR1cm4gZWxtLnBhcmVudE5vZGU7DQoNCgkJCQlyZXR1cm4gZWxtOw0KCQkJfQ0KDQoJCQlyZXR1cm4gcm5nLml0ZW0gPyBybmcuaXRlbSgwKSA6IHJuZy5wYXJlbnRFbGVtZW50KCk7DQoJCX0sDQoNCgkJZ2V0U2VsZWN0ZWRCbG9ja3MgOiBmdW5jdGlvbihzdCwgZW4pIHsNCgkJCXZhciB0ID0gdGhpcywgZG9tID0gdC5kb20sIHNiLCBlYiwgbiwgYmwgPSBbXTsNCg0KCQkJc2IgPSBkb20uZ2V0UGFyZW50KHN0IHx8IHQuZ2V0U3RhcnQoKSwgZG9tLmlzQmxvY2spOw0KCQkJZWIgPSBkb20uZ2V0UGFyZW50KGVuIHx8IHQuZ2V0RW5kKCksIGRvbS5pc0Jsb2NrKTsNCg0KCQkJaWYgKHNiKQ0KCQkJCWJsLnB1c2goc2IpOw0KDQoJCQlpZiAoc2IgJiYgZWIgJiYgc2IgIT0gZWIpIHsNCgkJCQluID0gc2I7DQoNCgkJCQl3aGlsZSAoKG4gPSBuLm5leHRTaWJsaW5nKSAmJiBuICE9IGViKSB7DQoJCQkJCWlmIChkb20uaXNCbG9jayhuKSkNCgkJCQkJCWJsLnB1c2gobik7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoZWIgJiYgc2IgIT0gZWIpDQoJCQkJYmwucHVzaChlYik7DQoNCgkJCXJldHVybiBibDsNCgkJfSwNCg0KCQlkZXN0cm95IDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LndpbiA9IG51bGw7DQoNCgkJCWlmICh0LnRyaWRlbnRTZWwpDQoJCQkJdC50cmlkZW50U2VsLmRlc3Ryb3koKTsNCg0KCQkJLy8gTWFudWFsIGRlc3Ryb3kgdGhlbiByZW1vdmUgdW5sb2FkIGhhbmRsZXINCgkJCWlmICghcykNCgkJCQl0aW55bWNlLnJlbW92ZVVubG9hZCh0LmRlc3Ryb3kpOw0KCQl9LA0KDQoJCS8vIElFIGhhcyBhbiBpc3N1ZSB3aGVyZSB5b3UgY2FuJ3Qgc2VsZWN0L21vdmUgdGhlIGNhcmV0IGJ5IGNsaWNraW5nIG91dHNpZGUgdGhlIGJvZHkgaWYgdGhlIGRvY3VtZW50IGlzIGluIHN0YW5kYXJkcyBtb2RlDQoJCV9maXhJRVNlbGVjdGlvbiA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGRvbSA9IHRoaXMuZG9tLCBkb2MgPSBkb20uZG9jLCBib2R5ID0gZG9jLmJvZHksIHN0YXJ0ZWQsIHN0YXJ0Um5nOw0KDQoJCQkvLyBNYWtlIEhUTUwgZWxlbWVudCB1bnNlbGVjdGFibGUgc2luY2Ugd2UgYXJlIGdvaW5nIHRvIGhhbmRsZSBzZWxlY3Rpb24gYnkgaGFuZA0KCQkJZG9jLmRvY3VtZW50RWxlbWVudC51bnNlbGVjdGFibGUgPSB0cnVlOw0KDQoJCQkvLyBSZXR1cm4gcmFuZ2UgZnJvbSBwb2ludCBvciBudWxsIGlmIGl0IGZhaWxlZA0KCQkJZnVuY3Rpb24gcm5nRnJvbVBvaW50KHgsIHkpIHsNCgkJCQl2YXIgcm5nID0gYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsNCg0KCQkJCXRyeSB7DQoJCQkJCXJuZy5tb3ZlVG9Qb2ludCh4LCB5KTsNCgkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkvLyBJRSBzb21ldGltZXMgdGhyb3dzIGFuZCBleGNlcHRpb24sIHNvIGxldHMganVzdCBpZ25vcmUgaXQNCgkJCQkJcm5nID0gbnVsbDsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gcm5nOw0KCQkJfTsNCg0KCQkJLy8gRmlyZXMgd2hpbGUgdGhlIHNlbGVjdGlvbiBpcyBjaGFuZ2luZw0KCQkJZnVuY3Rpb24gc2VsZWN0aW9uQ2hhbmdlKGUpIHsNCgkJCQl2YXIgcG9pbnRSbmc7DQoNCgkJCQkvLyBDaGVjayBpZiB0aGUgYnV0dG9uIGlzIGRvd24gb3Igbm90DQoJCQkJaWYgKGUuYnV0dG9uKSB7DQoJCQkJCS8vIENyZWF0ZSByYW5nZSBmcm9tIG1vdXNlIHBvc2l0aW9uDQoJCQkJCXBvaW50Um5nID0gcm5nRnJvbVBvaW50KGUueCwgZS55KTsNCg0KCQkJCQlpZiAocG9pbnRSbmcpIHsNCgkJCQkJCS8vIENoZWNrIGlmIHBvaW50UmFuZ2UgaXMgYmVmb3JlL2FmdGVyIHNlbGVjdGlvbiB0aGVuIGNoYW5nZSB0aGUgZW5kUG9pbnQNCgkJCQkJCWlmIChwb2ludFJuZy5jb21wYXJlRW5kUG9pbnRzKCdTdGFydFRvU3RhcnQnLCBzdGFydFJuZykgPiAwKQ0KCQkJCQkJCXBvaW50Um5nLnNldEVuZFBvaW50KCdTdGFydFRvU3RhcnQnLCBzdGFydFJuZyk7DQoJCQkJCQllbHNlDQoJCQkJCQkJcG9pbnRSbmcuc2V0RW5kUG9pbnQoJ0VuZFRvRW5kJywgc3RhcnRSbmcpOw0KDQoJCQkJCQlwb2ludFJuZy5zZWxlY3QoKTsNCgkJCQkJfQ0KCQkJCX0gZWxzZQ0KCQkJCQllbmRTZWxlY3Rpb24oKTsNCgkJCX0NCg0KCQkJLy8gUmVtb3ZlcyBsaXN0ZW5lcnMNCgkJCWZ1bmN0aW9uIGVuZFNlbGVjdGlvbigpIHsNCgkJCQlkb20udW5iaW5kKGRvYywgJ21vdXNldXAnLCBlbmRTZWxlY3Rpb24pOw0KCQkJCWRvbS51bmJpbmQoZG9jLCAnbW91c2Vtb3ZlJywgc2VsZWN0aW9uQ2hhbmdlKTsNCgkJCQlzdGFydGVkID0gMDsNCgkJCX07DQoNCgkJCS8vIERldGVjdCB3aGVuIHVzZXIgc2VsZWN0cyBvdXRzaWRlIEJPRFkNCgkJCWRvbS5iaW5kKGRvYywgJ21vdXNlZG93bicsIGZ1bmN0aW9uKGUpIHsNCgkJCQlpZiAoZS50YXJnZXQubm9kZU5hbWUgPT09ICdIVE1MJykgew0KCQkJCQlpZiAoc3RhcnRlZCkNCgkJCQkJCWVuZFNlbGVjdGlvbigpOw0KDQoJCQkJCXN0YXJ0ZWQgPSAxOw0KDQoJCQkJCS8vIFNldHVwIHN0YXJ0IHBvc2l0aW9uDQoJCQkJCXN0YXJ0Um5nID0gcm5nRnJvbVBvaW50KGUueCwgZS55KTsNCgkJCQkJaWYgKHN0YXJ0Um5nKSB7DQoJCQkJCQkvLyBMaXN0ZW4gZm9yIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRzDQoJCQkJCQlkb20uYmluZChkb2MsICdtb3VzZXVwJywgZW5kU2VsZWN0aW9uKTsNCgkJCQkJCWRvbS5iaW5kKGRvYywgJ21vdXNlbW92ZScsIHNlbGVjdGlvbkNoYW5nZSk7DQoNCgkJCQkJCWRvbS53aW4uZm9jdXMoKTsNCgkJCQkJCXN0YXJ0Um5nLnNlbGVjdCgpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLmRvbS5YTUxXcml0ZXInLCB7DQoJCW5vZGUgOiBudWxsLA0KDQoJCVhNTFdyaXRlciA6IGZ1bmN0aW9uKHMpIHsNCgkJCS8vIEdldCBYTUwgZG9jdW1lbnQNCgkJCWZ1bmN0aW9uIGdldFhNTCgpIHsNCgkJCQl2YXIgaSA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uOw0KDQoJCQkJaWYgKCFpIHx8ICFpLmNyZWF0ZURvY3VtZW50KSB7DQoJCQkJCS8vIFRyeSBJRSBvYmplY3RzDQoJCQkJCXRyeSB7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNU1hNTDIuRE9NRG9jdW1lbnQnKTt9IGNhdGNoIChleCkge30NCgkJCQkJdHJ5IHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YbWxEb20nKTt9IGNhdGNoIChleCkge30NCgkJCQl9IGVsc2UNCgkJCQkJcmV0dXJuIGkuY3JlYXRlRG9jdW1lbnQoJycsICcnLCBudWxsKTsNCgkJCX07DQoNCgkJCXRoaXMuZG9jID0gZ2V0WE1MKCk7DQoJCQkNCgkJCS8vIFNpbmNlIE9wZXJhIGFuZCBXZWJLaXQgZG9lc24ndCBlc2NhcGUgPiBpbnRvICZndDsgd2UgbmVlZCB0byBkbyBpdCBvdXIgc2VsZiB0byBub3JtYWxpemUgdGhlIG91dHB1dCBmb3IgYWxsIGJyb3dzZXJzDQoJCQl0aGlzLnZhbGlkID0gdGlueW1jZS5pc09wZXJhIHx8IHRpbnltY2UuaXNXZWJLaXQ7DQoNCgkJCXRoaXMucmVzZXQoKTsNCgkJfSwNCg0KCQlyZXNldCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBkID0gdC5kb2M7DQoNCgkJCWlmIChkLmZpcnN0Q2hpbGQpDQoJCQkJZC5yZW1vdmVDaGlsZChkLmZpcnN0Q2hpbGQpOw0KDQoJCQl0Lm5vZGUgPSBkLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiaHRtbCIpKTsNCgkJfSwNCg0KCQl3cml0ZVN0YXJ0RWxlbWVudCA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5ub2RlID0gdC5ub2RlLmFwcGVuZENoaWxkKHQuZG9jLmNyZWF0ZUVsZW1lbnQobikpOw0KCQl9LA0KDQoJCXdyaXRlQXR0cmlidXRlIDogZnVuY3Rpb24obiwgdikgew0KCQkJaWYgKHRoaXMudmFsaWQpDQoJCQkJdiA9IHYucmVwbGFjZSgvPi9nLCAnJU1DR1QlJyk7DQoNCgkJCXRoaXMubm9kZS5zZXRBdHRyaWJ1dGUobiwgdik7DQoJCX0sDQoNCgkJd3JpdGVFbmRFbGVtZW50IDogZnVuY3Rpb24oKSB7DQoJCQl0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTsNCgkJfSwNCg0KCQl3cml0ZUZ1bGxFbmRFbGVtZW50IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG4gPSB0Lm5vZGU7DQoNCgkJCW4uYXBwZW5kQ2hpbGQodC5kb2MuY3JlYXRlVGV4dE5vZGUoIiIpKTsNCgkJCXQubm9kZSA9IG4ucGFyZW50Tm9kZTsNCgkJfSwNCg0KCQl3cml0ZVRleHQgOiBmdW5jdGlvbih2KSB7DQoJCQlpZiAodGhpcy52YWxpZCkNCgkJCQl2ID0gdi5yZXBsYWNlKC8+L2csICclTUNHVCUnKTsNCg0KCQkJdGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZVRleHROb2RlKHYpKTsNCgkJfSwNCg0KCQl3cml0ZUNEQVRBIDogZnVuY3Rpb24odikgew0KCQkJdGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbih2KSk7DQoJCX0sDQoNCgkJd3JpdGVDb21tZW50IDogZnVuY3Rpb24odikgew0KCQkJLy8gRml4IGZvciBidWcgIzIwMzU2OTQNCgkJCWlmICh0aW55bWNlLmlzSUUpDQoJCQkJdiA9IHYucmVwbGFjZSgvXlwtfFwtJC9nLCAnICcpOw0KDQoJCQl0aGlzLm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kb2MuY3JlYXRlQ29tbWVudCh2LnJlcGxhY2UoL1wtXC0vZywgJyAnKSkpOw0KCQl9LA0KDQoJCWdldENvbnRlbnQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBoOw0KDQoJCQloID0gdGhpcy5kb2MueG1sIHx8IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodGhpcy5kb2MpOw0KCQkJaCA9IGgucmVwbGFjZSgvPFw/W14/XStcPz58PGh0bWxbXj5dKj58PFwvaHRtbD58PGh0bWxcLz58PCFET0NUWVBFW14+XSs+L2csICcnKTsNCgkJCWggPSBoLnJlcGxhY2UoLyA/XC8+L2csICcgLz4nKTsNCg0KCQkJaWYgKHRoaXMudmFsaWQpDQoJCQkJaCA9IGgucmVwbGFjZSgvXCVNQ0dUJS9nLCAnJmd0OycpOw0KDQoJCQlyZXR1cm4gaDsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIGF0dHJzQ2hhcnNSZWdFeHAgPSAvWyZcIjw+XS9nLCB0ZXh0Q2hhcnNSZWdFeHAgPSAvWzw+Jl0vZywgZW5jb2RlZENoYXJzID0geycmJyA6ICcmYW1wOycsICciJyA6ICcmcXVvdDsnLCAnPCcgOiAnJmx0OycsICc+JyA6ICcmZ3Q7J307DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5kb20uU3RyaW5nV3JpdGVyJywgew0KCQlzdHIgOiBudWxsLA0KCQl0YWdzIDogbnVsbCwNCgkJY291bnQgOiAwLA0KCQlzZXR0aW5ncyA6IG51bGwsDQoJCWluZGVudCA6IG51bGwsDQoNCgkJU3RyaW5nV3JpdGVyIDogZnVuY3Rpb24ocykgew0KCQkJdGhpcy5zZXR0aW5ncyA9IHRpbnltY2UuZXh0ZW5kKHsNCgkJCQlpbmRlbnRfY2hhciA6ICcgJywNCgkJCQlpbmRlbnRhdGlvbiA6IDANCgkJCX0sIHMpOw0KDQoJCQl0aGlzLnJlc2V0KCk7DQoJCX0sDQoNCgkJcmVzZXQgOiBmdW5jdGlvbigpIHsNCgkJCXRoaXMuaW5kZW50ID0gJyc7DQoJCQl0aGlzLnN0ciA9ICIiOw0KCQkJdGhpcy50YWdzID0gW107DQoJCQl0aGlzLmNvdW50ID0gMDsNCgkJfSwNCg0KCQl3cml0ZVN0YXJ0RWxlbWVudCA6IGZ1bmN0aW9uKG4pIHsNCgkJCXRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgpOw0KCQkJdGhpcy53cml0ZVJhdygnPCcgKyBuKTsNCgkJCXRoaXMudGFncy5wdXNoKG4pOw0KCQkJdGhpcy5pbkF0dHIgPSB0cnVlOw0KCQkJdGhpcy5jb3VudCsrOw0KCQkJdGhpcy5lbGVtZW50Q291bnQgPSB0aGlzLmNvdW50Ow0KCQkJdGhpcy5hdHRycyA9IHt9Ow0KCQl9LA0KDQoJCXdyaXRlQXR0cmlidXRlIDogZnVuY3Rpb24obiwgdikgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoIXQuYXR0cnNbbl0pIHsNCgkJCQl0LndyaXRlUmF3KCIgIiArIHQuZW5jb2RlKG4sIHRydWUpICsgJz0iJyArIHQuZW5jb2RlKHYsIHRydWUpICsgJyInKTsNCgkJCQl0LmF0dHJzW25dID0gdjsNCgkJCX0NCgkJfSwNCg0KCQl3cml0ZUVuZEVsZW1lbnQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBuOw0KDQoJCQlpZiAodGhpcy50YWdzLmxlbmd0aCA+IDApIHsNCgkJCQluID0gdGhpcy50YWdzLnBvcCgpOw0KDQoJCQkJaWYgKHRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgxKSkNCgkJCQkJdGhpcy53cml0ZVJhdygnPC8nICsgbiArICc+Jyk7DQoNCgkJCQlpZiAodGhpcy5zZXR0aW5ncy5pbmRlbnRhdGlvbiA+IDApDQoJCQkJCXRoaXMud3JpdGVSYXcoJ1xuJyk7DQoJCQl9DQoJCX0sDQoNCgkJd3JpdGVGdWxsRW5kRWxlbWVudCA6IGZ1bmN0aW9uKCkgew0KCQkJaWYgKHRoaXMudGFncy5sZW5ndGggPiAwKSB7DQoJCQkJdGhpcy5fd3JpdGVBdHRyaWJ1dGVzRW5kKCk7DQoJCQkJdGhpcy53cml0ZVJhdygnPC8nICsgdGhpcy50YWdzLnBvcCgpICsgJz4nKTsNCg0KCQkJCWlmICh0aGlzLnNldHRpbmdzLmluZGVudGF0aW9uID4gMCkNCgkJCQkJdGhpcy53cml0ZVJhdygnXG4nKTsNCgkJCX0NCgkJfSwNCg0KCQl3cml0ZVRleHQgOiBmdW5jdGlvbih2KSB7DQoJCQl0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTsNCgkJCXRoaXMud3JpdGVSYXcodGhpcy5lbmNvZGUodikpOw0KCQkJdGhpcy5jb3VudCsrOw0KCQl9LA0KDQoJCXdyaXRlQ0RBVEEgOiBmdW5jdGlvbih2KSB7DQoJCQl0aGlzLl93cml0ZUF0dHJpYnV0ZXNFbmQoKTsNCgkJCXRoaXMud3JpdGVSYXcoJzwhW0NEQVRBWycgKyB2ICsgJ11dPicpOw0KCQkJdGhpcy5jb3VudCsrOw0KCQl9LA0KDQoJCXdyaXRlQ29tbWVudCA6IGZ1bmN0aW9uKHYpIHsNCgkJCXRoaXMuX3dyaXRlQXR0cmlidXRlc0VuZCgpOw0KCQkJdGhpcy53cml0ZVJhdygnPCEtLScgKyB2ICsgJy0tPicpOw0KCQkJdGhpcy5jb3VudCsrOw0KCQl9LA0KDQoJCXdyaXRlUmF3IDogZnVuY3Rpb24odikgew0KCQkJdGhpcy5zdHIgKz0gdjsNCgkJfSwNCg0KCQllbmNvZGUgOiBmdW5jdGlvbihzLCBhdHRyKSB7DQoJCQlyZXR1cm4gcy5yZXBsYWNlKGF0dHIgPyBhdHRyc0NoYXJzUmVnRXhwIDogdGV4dENoYXJzUmVnRXhwLCBmdW5jdGlvbih2KSB7DQoJCQkJcmV0dXJuIGVuY29kZWRDaGFyc1t2XTsNCgkJCX0pOw0KCQl9LA0KDQoJCWdldENvbnRlbnQgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLnN0cjsNCgkJfSwNCg0KCQlfd3JpdGVBdHRyaWJ1dGVzRW5kIDogZnVuY3Rpb24ocykgew0KCQkJaWYgKCF0aGlzLmluQXR0cikNCgkJCQlyZXR1cm47DQoNCgkJCXRoaXMuaW5BdHRyID0gZmFsc2U7DQoNCgkJCWlmIChzICYmIHRoaXMuZWxlbWVudENvdW50ID09IHRoaXMuY291bnQpIHsNCgkJCQl0aGlzLndyaXRlUmF3KCcgLz4nKTsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoNCgkJCXRoaXMud3JpdGVSYXcoJz4nKTsNCg0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIFNob3J0ZW4gbmFtZXMNCgl2YXIgZXh0ZW5kID0gdGlueW1jZS5leHRlbmQsIGVhY2ggPSB0aW55bWNlLmVhY2gsIERpc3BhdGNoZXIgPSB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlciwgaXNJRSA9IHRpbnltY2UuaXNJRSwgaXNHZWNrbyA9IHRpbnltY2UuaXNHZWNrbzsNCg0KCWZ1bmN0aW9uIHdpbGRjYXJkVG9SRShzKSB7DQoJCXJldHVybiBzLnJlcGxhY2UoLyhbPysqXSkvZywgJy4kMScpOw0KCX07DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5kb20uU2VyaWFsaXplcicsIHsNCgkJU2VyaWFsaXplciA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5rZXkgPSAwOw0KCQkJdC5vblByZVByb2Nlc3MgPSBuZXcgRGlzcGF0Y2hlcih0KTsNCgkJCXQub25Qb3N0UHJvY2VzcyA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KDQoJCQl0cnkgew0KCQkJCXQud3JpdGVyID0gbmV3IHRpbnltY2UuZG9tLlhNTFdyaXRlcigpOw0KCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkvLyBJRSBtaWdodCB0aHJvdyBleGNlcHRpb24gaWYgQWN0aXZlWCBpcyBkaXNhYmxlZCBzbyB3ZSB0aGVuIHN3aXRjaCB0byB0aGUgc2xpZ2h0bHkgc2xvd2VyIFN0cmluZ1dyaXRlcg0KCQkJCXQud3JpdGVyID0gbmV3IHRpbnltY2UuZG9tLlN0cmluZ1dyaXRlcigpOw0KCQkJfQ0KDQoJCQkvLyBJRTkgYnJva2UgdGhlIFhNTCBhdHRyaWJ1dGVzIG9yZGVyIHNvIGl0IGNhbid0IGJlIHVzZWQgYW55bW9yZQ0KCQkJaWYgKHRpbnltY2UuaXNJRSAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA4KSB7DQoJCQkJdC53cml0ZXIgPSBuZXcgdGlueW1jZS5kb20uU3RyaW5nV3JpdGVyKCk7DQoJCQl9DQoNCgkJCS8vIERlZmF1bHQgc2V0dGluZ3MNCgkJCXQuc2V0dGluZ3MgPSBzID0gZXh0ZW5kKHsNCgkJCQlkb20gOiB0aW55bWNlLkRPTSwNCgkJCQl2YWxpZF9ub2RlcyA6IDAsDQoJCQkJbm9kZV9maWx0ZXIgOiAwLA0KCQkJCWF0dHJfZmlsdGVyIDogMCwNCgkJCQlpbnZhbGlkX2F0dHJzIDogL14oX21jZV98X21vel98c2l6c2V0fHNpemNhY2hlKS8sDQoJCQkJY2xvc2VkIDogL14oYnJ8aHJ8aW5wdXR8bWV0YXxpbWd8bGlua3xwYXJhbXxhcmVhKSQvLA0KCQkJCWVudGl0eV9lbmNvZGluZyA6ICduYW1lZCcsDQoJCQkJZW50aXRpZXMgOiAnMTYwLG5ic3AsMTYxLGlleGNsLDE2MixjZW50LDE2Myxwb3VuZCwxNjQsY3VycmVuLDE2NSx5ZW4sMTY2LGJydmJhciwxNjcsc2VjdCwxNjgsdW1sLDE2OSxjb3B5LDE3MCxvcmRmLDE3MSxsYXF1bywxNzIsbm90LDE3MyxzaHksMTc0LHJlZywxNzUsbWFjciwxNzYsZGVnLDE3NyxwbHVzbW4sMTc4LHN1cDIsMTc5LHN1cDMsMTgwLGFjdXRlLDE4MSxtaWNybywxODIscGFyYSwxODMsbWlkZG90LDE4NCxjZWRpbCwxODUsc3VwMSwxODYsb3JkbSwxODcscmFxdW8sMTg4LGZyYWMxNCwxODksZnJhYzEyLDE5MCxmcmFjMzQsMTkxLGlxdWVzdCwxOTIsQWdyYXZlLDE5MyxBYWN1dGUsMTk0LEFjaXJjLDE5NSxBdGlsZGUsMTk2LEF1bWwsMTk3LEFyaW5nLDE5OCxBRWxpZywxOTksQ2NlZGlsLDIwMCxFZ3JhdmUsMjAxLEVhY3V0ZSwyMDIsRWNpcmMsMjAzLEV1bWwsMjA0LElncmF2ZSwyMDUsSWFjdXRlLDIwNixJY2lyYywyMDcsSXVtbCwyMDgsRVRILDIwOSxOdGlsZGUsMjEwLE9ncmF2ZSwyMTEsT2FjdXRlLDIxMixPY2lyYywyMTMsT3RpbGRlLDIxNCxPdW1sLDIxNSx0aW1lcywyMTYsT3NsYXNoLDIxNyxVZ3JhdmUsMjE4LFVhY3V0ZSwyMTksVWNpcmMsMjIwLFV1bWwsMjIxLFlhY3V0ZSwyMjIsVEhPUk4sMjIzLHN6bGlnLDIyNCxhZ3JhdmUsMjI1LGFhY3V0ZSwyMjYsYWNpcmMsMjI3LGF0aWxkZSwyMjgsYXVtbCwyMjksYXJpbmcsMjMwLGFlbGlnLDIzMSxjY2VkaWwsMjMyLGVncmF2ZSwyMzMsZWFjdXRlLDIzNCxlY2lyYywyMzUsZXVtbCwyMzYsaWdyYXZlLDIzNyxpYWN1dGUsMjM4LGljaXJjLDIzOSxpdW1sLDI0MCxldGgsMjQxLG50aWxkZSwyNDIsb2dyYXZlLDI0MyxvYWN1dGUsMjQ0LG9jaXJjLDI0NSxvdGlsZGUsMjQ2LG91bWwsMjQ3LGRpdmlkZSwyNDgsb3NsYXNoLDI0OSx1Z3JhdmUsMjUwLHVhY3V0ZSwyNTEsdWNpcmMsMjUyLHV1bWwsMjUzLHlhY3V0ZSwyNTQsdGhvcm4sMjU1LHl1bWwsNDAyLGZub2YsOTEzLEFscGhhLDkxNCxCZXRhLDkxNSxHYW1tYSw5MTYsRGVsdGEsOTE3LEVwc2lsb24sOTE4LFpldGEsOTE5LEV0YSw5MjAsVGhldGEsOTIxLElvdGEsOTIyLEthcHBhLDkyMyxMYW1iZGEsOTI0LE11LDkyNSxOdSw5MjYsWGksOTI3LE9taWNyb24sOTI4LFBpLDkyOSxSaG8sOTMxLFNpZ21hLDkzMixUYXUsOTMzLFVwc2lsb24sOTM0LFBoaSw5MzUsQ2hpLDkzNixQc2ksOTM3LE9tZWdhLDk0NSxhbHBoYSw5NDYsYmV0YSw5NDcsZ2FtbWEsOTQ4LGRlbHRhLDk0OSxlcHNpbG9uLDk1MCx6ZXRhLDk1MSxldGEsOTUyLHRoZXRhLDk1Myxpb3RhLDk1NCxrYXBwYSw5NTUsbGFtYmRhLDk1NixtdSw5NTcsbnUsOTU4LHhpLDk1OSxvbWljcm9uLDk2MCxwaSw5NjEscmhvLDk2MixzaWdtYWYsOTYzLHNpZ21hLDk2NCx0YXUsOTY1LHVwc2lsb24sOTY2LHBoaSw5NjcsY2hpLDk2OCxwc2ksOTY5LG9tZWdhLDk3Nyx0aGV0YXN5bSw5NzgsdXBzaWgsOTgyLHBpdiw4MjI2LGJ1bGwsODIzMCxoZWxsaXAsODI0MixwcmltZSw4MjQzLFByaW1lLDgyNTQsb2xpbmUsODI2MCxmcmFzbCw4NDcyLHdlaWVycCw4NDY1LGltYWdlLDg0NzYscmVhbCw4NDgyLHRyYWRlLDg1MDEsYWxlZnN5bSw4NTkyLGxhcnIsODU5Myx1YXJyLDg1OTQscmFyciw4NTk1LGRhcnIsODU5NixoYXJyLDg2MjksY3JhcnIsODY1NixsQXJyLDg2NTcsdUFyciw4NjU4LHJBcnIsODY1OSxkQXJyLDg2NjAsaEFyciw4NzA0LGZvcmFsbCw4NzA2LHBhcnQsODcwNyxleGlzdCw4NzA5LGVtcHR5LDg3MTEsbmFibGEsODcxMixpc2luLDg3MTMsbm90aW4sODcxNSxuaSw4NzE5LHByb2QsODcyMSxzdW0sODcyMixtaW51cyw4NzI3LGxvd2FzdCw4NzMwLHJhZGljLDg3MzMscHJvcCw4NzM0LGluZmluLDg3MzYsYW5nLDg3NDMsYW5kLDg3NDQsb3IsODc0NSxjYXAsODc0NixjdXAsODc0NyxpbnQsODc1Nix0aGVyZTQsODc2NCxzaW0sODc3Myxjb25nLDg3NzYsYXN5bXAsODgwMCxuZSw4ODAxLGVxdWl2LDg4MDQsbGUsODgwNSxnZSw4ODM0LHN1Yiw4ODM1LHN1cCw4ODM2LG5zdWIsODgzOCxzdWJlLDg4Mzksc3VwZSw4ODUzLG9wbHVzLDg4NTUsb3RpbWVzLDg4NjkscGVycCw4OTAxLHNkb3QsODk2OCxsY2VpbCw4OTY5LHJjZWlsLDg5NzAsbGZsb29yLDg5NzEscmZsb29yLDkwMDEsbGFuZyw5MDAyLHJhbmcsOTY3NCxsb3osOTgyNCxzcGFkZXMsOTgyNyxjbHVicyw5ODI5LGhlYXJ0cyw5ODMwLGRpYW1zLDMzOCxPRWxpZywzMzksb2VsaWcsMzUyLFNjYXJvbiwzNTMsc2Nhcm9uLDM3NixZdW1sLDcxMCxjaXJjLDczMix0aWxkZSw4MTk0LGVuc3AsODE5NSxlbXNwLDgyMDEsdGhpbnNwLDgyMDQsenduaiw4MjA1LHp3aiw4MjA2LGxybSw4MjA3LHJsbSw4MjExLG5kYXNoLDgyMTIsbWRhc2gsODIxNixsc3F1byw4MjE3LHJzcXVvLDgyMTgsc2JxdW8sODIyMCxsZHF1byw4MjIxLHJkcXVvLDgyMjIsYmRxdW8sODIyNCxkYWdnZXIsODIyNSxEYWdnZXIsODI0MCxwZXJtaWwsODI0OSxsc2FxdW8sODI1MCxyc2FxdW8sODM2NCxldXJvJywNCgkJCQl2YWxpZF9lbGVtZW50cyA6ICcqWypdJywNCgkJCQlleHRlbmRlZF92YWxpZF9lbGVtZW50cyA6IDAsDQoJCQkJaW52YWxpZF9lbGVtZW50cyA6IDAsDQoJCQkJZml4X3RhYmxlX2VsZW1lbnRzIDogMSwNCgkJCQlmaXhfbGlzdF9lbGVtZW50cyA6IHRydWUsDQoJCQkJZml4X2NvbnRlbnRfZHVwbGljYXRpb24gOiB0cnVlLA0KCQkJCWNvbnZlcnRfZm9udHNfdG9fc3BhbnMgOiBmYWxzZSwNCgkJCQlmb250X3NpemVfY2xhc3NlcyA6IDAsDQoJCQkJYXBwbHlfc291cmNlX2Zvcm1hdHRpbmcgOiAwLA0KCQkJCWluZGVudF9tb2RlIDogJ3NpbXBsZScsDQoJCQkJaW5kZW50X2NoYXIgOiAnXHQnLA0KCQkJCWluZGVudF9sZXZlbHMgOiAxLA0KCQkJCXJlbW92ZV9saW5lYnJlYWtzIDogMSwNCgkJCQlyZW1vdmVfcmVkdW5kYW50X2JycyA6IDEsDQoJCQkJZWxlbWVudF9mb3JtYXQgOiAneGh0bWwnDQoJCQl9LCBzKTsNCg0KCQkJdC5kb20gPSBzLmRvbTsNCgkJCXQuc2NoZW1hID0gcy5zY2hlbWE7DQoNCgkJCS8vIFVzZSByYXcgZW50aXRpZXMgaWYgbm8gZW50aXRpZXMgYXJlIGRlZmluZWQNCgkJCWlmIChzLmVudGl0eV9lbmNvZGluZyA9PSAnbmFtZWQnICYmICFzLmVudGl0aWVzKQ0KCQkJCXMuZW50aXR5X2VuY29kaW5nID0gJ3Jhdyc7DQoNCgkJCWlmIChzLnJlbW92ZV9yZWR1bmRhbnRfYnJzKSB7DQoJCQkJdC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihzZSwgbykgew0KCQkJCQkvLyBSZW1vdmUgc2luZ2xlIEJSIGF0IGVuZCBvZiBibG9jayBlbGVtZW50cyBzaW5jZSB0aGV5IGdldCByZW5kZXJlZA0KCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSgvKDxiciBcLz5ccyopKzxcLyhwfGhbMS02XXxkaXZ8bGkpPi9naSwgZnVuY3Rpb24oYSwgYiwgYykgew0KCQkJCQkJLy8gQ2hlY2sgaWYgaXQncyBhIHNpbmdsZSBlbGVtZW50DQoJCQkJCQlpZiAoL148YnIgXC8+XHMqPFwvLy50ZXN0KGEpKQ0KCQkJCQkJCXJldHVybiAnPC8nICsgYyArICc+JzsNCg0KCQkJCQkJcmV0dXJuIGE7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBSZW1vdmUgWEhUTUwgZWxlbWVudCBlbmRpbmdzIGkuZS4gcHJvZHVjZSBjcmFwIDopIFhIVE1MIGlzIGJldHRlcg0KCQkJaWYgKHMuZWxlbWVudF9mb3JtYXQgPT0gJ2h0bWwnKSB7DQoJCQkJdC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihzZSwgbykgew0KCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSgvPChbXj5dKykgXC8+L2csICc8JDE+Jyk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmZpeF9saXN0X2VsZW1lbnRzKSB7DQoJCQkJdC5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJCXZhciBubCwgeCwgYSA9IFsnb2wnLCAndWwnXSwgaSwgbiwgcCwgciA9IC9eKE9MfFVMKSQvLCBucDsNCg0KCQkJCQlmdW5jdGlvbiBwcmV2Tm9kZShlLCBuKSB7DQoJCQkJCQl2YXIgYSA9IG4uc3BsaXQoJywnKSwgaTsNCg0KCQkJCQkJd2hpbGUgKChlID0gZS5wcmV2aW91c1NpYmxpbmcpICE9IG51bGwpIHsNCgkJCQkJCQlmb3IgKGk9MDsgaTxhLmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJCWlmIChlLm5vZGVOYW1lID09IGFbaV0pDQoJCQkJCQkJCQlyZXR1cm4gZTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCXJldHVybiBudWxsOw0KCQkJCQl9Ow0KDQoJCQkJCWZvciAoeD0wOyB4PGEubGVuZ3RoOyB4KyspIHsNCgkJCQkJCW5sID0gdC5kb20uc2VsZWN0KGFbeF0sIG8ubm9kZSk7DQoNCgkJCQkJCWZvciAoaT0wOyBpPG5sLmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJbiA9IG5sW2ldOw0KCQkJCQkJCXAgPSBuLnBhcmVudE5vZGU7DQoNCgkJCQkJCQlpZiAoci50ZXN0KHAubm9kZU5hbWUpKSB7DQoJCQkJCQkJCW5wID0gcHJldk5vZGUobiwgJ0xJJyk7DQoNCgkJCQkJCQkJaWYgKCFucCkgew0KCQkJCQkJCQkJbnAgPSB0LmRvbS5jcmVhdGUoJ2xpJyk7DQoJCQkJCQkJCQlucC5pbm5lckhUTUwgPSAnJm5ic3A7JzsNCgkJCQkJCQkJCW5wLmFwcGVuZENoaWxkKG4pOw0KCQkJCQkJCQkJcC5pbnNlcnRCZWZvcmUobnAsIHAuZmlyc3RDaGlsZCk7DQoJCQkJCQkJCX0gZWxzZQ0KCQkJCQkJCQkJbnAuYXBwZW5kQ2hpbGQobik7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmZpeF90YWJsZV9lbGVtZW50cykgew0KCQkJCXQub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihzZSwgbykgew0KCQkJCQllYWNoKHQuZG9tLnNlbGVjdCgncCB0YWJsZScsIG8ubm9kZSkucmV2ZXJzZSgpLCBmdW5jdGlvbihuKSB7DQoJCQkJCQl2YXIgcGFyZW50ID0gdC5kb20uZ2V0UGFyZW50KG4ucGFyZW50Tm9kZSwgJ3RhYmxlLHAnKTsNCg0KCQkJCQkJaWYgKHBhcmVudC5ub2RlTmFtZSAhPSAnVEFCTEUnKSB7DQoJCQkJCQkJdHJ5IHsNCgkJCQkJCQkJdC5kb20uc3BsaXQocGFyZW50LCBuKTsNCgkJCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJCQkvLyBJRSBjYW4gc29tZXRpbWVzIGZpcmUgYW4gdW5rbm93biBydW50aW1lIGVycm9yIHNvIHdlIGp1c3QgaWdub3JlIGl0DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9KTsNCgkJCX0NCgkJfSwNCg0KCQlzZXRFbnRpdGllcyA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgYSwgaSwgbCA9IHt9LCB2Ow0KDQoJCQkvLyBObyBuZWVkIHRvIHNldHVwIG1vcmUgdGhhbiBvbmNlDQoJCQlpZiAodC5lbnRpdHlMb29rdXApDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBCdWlsZCByZWdleCBhbmQgbG9va3VwIGFycmF5DQoJCQlhID0gcy5zcGxpdCgnLCcpOw0KCQkJZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDIpIHsNCgkJCQl2ID0gYVtpXTsNCg0KCQkJCS8vIERvbid0IGFkZCBkZWZhdWx0ICZhbXA7ICZxdW90OyBldGMuDQoJCQkJaWYgKHYgPT0gMzQgfHwgdiA9PSAzOCB8fCB2ID09IDYwIHx8IHYgPT0gNjIpDQoJCQkJCWNvbnRpbnVlOw0KDQoJCQkJbFtTdHJpbmcuZnJvbUNoYXJDb2RlKGFbaV0pXSA9IGFbaSArIDFdOw0KDQoJCQkJdiA9IHBhcnNlSW50KGFbaV0pLnRvU3RyaW5nKDE2KTsNCgkJCX0NCg0KCQkJdC5lbnRpdHlMb29rdXAgPSBsOw0KCQl9LA0KDQoJCXNldFJ1bGVzIDogZnVuY3Rpb24ocykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0Ll9zZXR1cCgpOw0KCQkJdC5ydWxlcyA9IHt9Ow0KCQkJdC53aWxkUnVsZXMgPSBbXTsNCgkJCXQudmFsaWRFbGVtZW50cyA9IHt9Ow0KDQoJCQlyZXR1cm4gdC5hZGRSdWxlcyhzKTsNCgkJfSwNCg0KCQlhZGRSdWxlcyA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgZHI7DQoNCgkJCWlmICghcykNCgkJCQlyZXR1cm47DQoNCgkJCXQuX3NldHVwKCk7DQoNCgkJCWVhY2gocy5zcGxpdCgnLCcpLCBmdW5jdGlvbihzKSB7DQoJCQkJdmFyIHAgPSBzLnNwbGl0KC9cW3xcXS8pLCB0biA9IHBbMF0uc3BsaXQoJy8nKSwgcmEsIGF0LCB3YXQsIHZhID0gW107DQoNCgkJCQkvLyBFeHRlbmQgd2l0aCBkZWZhdWx0IHJ1bGVzDQoJCQkJaWYgKGRyKQ0KCQkJCQlhdCA9IHRpbnltY2UuZXh0ZW5kKFtdLCBkci5hdHRyaWJzKTsNCg0KCQkJCS8vIFBhcnNlIGF0dHJpYnV0ZXMNCgkJCQlpZiAocC5sZW5ndGggPiAxKSB7DQoJCQkJCWVhY2gocFsxXS5zcGxpdCgnfCcpLCBmdW5jdGlvbihzKSB7DQoJCQkJCQl2YXIgYXIgPSB7fSwgaTsNCg0KCQkJCQkJYXQgPSBhdCB8fCBbXTsNCg0KCQkJCQkJLy8gUGFyc2UgYXR0cmlidXRlIHJ1bGUNCgkJCQkJCXMgPSBzLnJlcGxhY2UoLzo6L2csICd+Jyk7DQoJCQkJCQlzID0gL14oWyFcLV0pPyhbXHcqLj9+X1wtXSt8KShbPTo8XSk/KC4rKT8kLy5leGVjKHMpOw0KCQkJCQkJc1syXSA9IHNbMl0ucmVwbGFjZSgvfi9nLCAnOicpOw0KDQoJCQkJCQkvLyBBZGQgcmVxdWlyZWQgYXR0cmlidXRlcw0KCQkJCQkJaWYgKHNbMV0gPT0gJyEnKSB7DQoJCQkJCQkJcmEgPSByYSB8fCBbXTsNCgkJCQkJCQlyYS5wdXNoKHNbMl0pOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBSZW1vdmUgaW5oZXJpdGVkIGF0dHJpYnV0ZXMNCgkJCQkJCWlmIChzWzFdID09ICctJykgew0KCQkJCQkJCWZvciAoaSA9IDA7IGkgPGF0Lmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJCWlmIChhdFtpXS5uYW1lID09IHNbMl0pIHsNCgkJCQkJCQkJCWF0LnNwbGljZShpLCAxKTsNCgkJCQkJCQkJCXJldHVybjsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJc3dpdGNoIChzWzNdKSB7DQoJCQkJCQkJLy8gQWRkIGRlZmF1bHQgYXR0cmliIHZhbHVlcw0KCQkJCQkJCWNhc2UgJz0nOg0KCQkJCQkJCQlhci5kZWZhdWx0VmFsID0gc1s0XSB8fCAnJzsNCgkJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCQkvLyBBZGQgZm9yY2VkIGF0dHJpYiB2YWx1ZXMNCgkJCQkJCQljYXNlICc6JzoNCgkJCQkJCQkJYXIuZm9yY2VkVmFsID0gc1s0XTsNCgkJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCQkvLyBBZGQgdmFsaWRhdGlvbiB2YWx1ZXMNCgkJCQkJCQljYXNlICc8JzoNCgkJCQkJCQkJYXIudmFsaWRWYWxzID0gc1s0XS5zcGxpdCgnPycpOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCX0NCg0KCQkJCQkJaWYgKC9bKi4/XS8udGVzdChzWzJdKSkgew0KCQkJCQkJCXdhdCA9IHdhdCB8fCBbXTsNCgkJCQkJCQlhci5uYW1lUkUgPSBuZXcgUmVnRXhwKCdeJyArIHdpbGRjYXJkVG9SRShzWzJdKSArICckJyk7DQoJCQkJCQkJd2F0LnB1c2goYXIpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQlhci5uYW1lID0gc1syXTsNCgkJCQkJCQlhdC5wdXNoKGFyKTsNCgkJCQkJCX0NCg0KCQkJCQkJdmEucHVzaChzWzJdKTsNCgkJCQkJfSk7DQoJCQkJfQ0KDQoJCQkJLy8gSGFuZGxlIGVsZW1lbnQgbmFtZXMNCgkJCQllYWNoKHRuLCBmdW5jdGlvbihzLCBpKSB7DQoJCQkJCXZhciBwciA9IHMuY2hhckF0KDApLCB4ID0gMSwgcnUgPSB7fTsNCg0KCQkJCQkvLyBFeHRlbmQgd2l0aCBkZWZhdWx0IHJ1bGUgZGF0YQ0KCQkJCQlpZiAoZHIpIHsNCgkJCQkJCWlmIChkci5ub0VtcHR5KQ0KCQkJCQkJCXJ1Lm5vRW1wdHkgPSBkci5ub0VtcHR5Ow0KDQoJCQkJCQlpZiAoZHIuZnVsbEVuZCkNCgkJCQkJCQlydS5mdWxsRW5kID0gZHIuZnVsbEVuZDsNCg0KCQkJCQkJaWYgKGRyLnBhZGQpDQoJCQkJCQkJcnUucGFkZCA9IGRyLnBhZGQ7DQoJCQkJCX0NCg0KCQkJCQkvLyBIYW5kbGUgcHJlZml4ZXMNCgkJCQkJc3dpdGNoIChwcikgew0KCQkJCQkJY2FzZSAnLSc6DQoJCQkJCQkJcnUubm9FbXB0eSA9IHRydWU7DQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWNhc2UgJysnOg0KCQkJCQkJCXJ1LmZ1bGxFbmQgPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KDQoJCQkJCQljYXNlICcjJzoNCgkJCQkJCQlydS5wYWRkID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJZGVmYXVsdDoNCgkJCQkJCQl4ID0gMDsNCgkJCQkJfQ0KDQoJCQkJCXRuW2ldID0gcyA9IHMuc3Vic3RyaW5nKHgpOw0KCQkJCQl0LnZhbGlkRWxlbWVudHNbc10gPSAxOw0KDQoJCQkJCS8vIEFkZCBlbGVtZW50IG5hbWUgb3IgZWxlbWVudCByZWdleA0KCQkJCQlpZiAoL1sqLj9dLy50ZXN0KHRuWzBdKSkgew0KCQkJCQkJcnUubmFtZVJFID0gbmV3IFJlZ0V4cCgnXicgKyB3aWxkY2FyZFRvUkUodG5bMF0pICsgJyQnKTsNCgkJCQkJCXQud2lsZFJ1bGVzID0gdC53aWxkUnVsZXMgfHwge307DQoJCQkJCQl0LndpbGRSdWxlcy5wdXNoKHJ1KTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCXJ1Lm5hbWUgPSB0blswXTsNCg0KCQkJCQkJLy8gU3RvcmUgYXdheSBkZWZhdWx0IHJ1bGUNCgkJCQkJCWlmICh0blswXSA9PSAnQCcpDQoJCQkJCQkJZHIgPSBydTsNCg0KCQkJCQkJdC5ydWxlc1tzXSA9IHJ1Ow0KCQkJCQl9DQoNCgkJCQkJcnUuYXR0cmlicyA9IGF0Ow0KDQoJCQkJCWlmIChyYSkNCgkJCQkJCXJ1LnJlcXVpcmVkQXR0cmlicyA9IHJhOw0KDQoJCQkJCWlmICh3YXQpIHsNCgkJCQkJCS8vIEJ1aWxkIHZhbGlkIGF0dHJpYnV0ZXMgcmVnZXhwDQoJCQkJCQlzID0gJyc7DQoJCQkJCQllYWNoKHZhLCBmdW5jdGlvbih2KSB7DQoJCQkJCQkJaWYgKHMpDQoJCQkJCQkJCXMgKz0gJ3wnOw0KDQoJCQkJCQkJcyArPSAnKCcgKyB3aWxkY2FyZFRvUkUodikgKyAnKSc7DQoJCQkJCQl9KTsNCgkJCQkJCXJ1LnZhbGlkQXR0cmlic1JFID0gbmV3IFJlZ0V4cCgnXicgKyBzLnRvTG93ZXJDYXNlKCkgKyAnJCcpOw0KCQkJCQkJcnUud2lsZEF0dHJpYnMgPSB3YXQ7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0pOw0KDQoJCQkvLyBCdWlsZCB2YWxpZCBlbGVtZW50cyByZWdleHANCgkJCXMgPSAnJzsNCgkJCWVhY2godC52YWxpZEVsZW1lbnRzLCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJaWYgKHMpDQoJCQkJCXMgKz0gJ3wnOw0KDQoJCQkJaWYgKGsgIT0gJ0AnKQ0KCQkJCQlzICs9IGs7DQoJCQl9KTsNCgkJCXQudmFsaWRFbGVtZW50c1JFID0gbmV3IFJlZ0V4cCgnXignICsgd2lsZGNhcmRUb1JFKHMudG9Mb3dlckNhc2UoKSkgKyAnKSQnKTsNCg0KCQkJLy9jb25zb2xlLmRlYnVnKHQudmFsaWRFbGVtZW50c1JFLnRvU3RyaW5nKCkpOw0KCQkJLy9jb25zb2xlLmRpcih0LnJ1bGVzKTsNCgkJCS8vY29uc29sZS5kaXIodC53aWxkUnVsZXMpOw0KCQl9LA0KDQoJCWZpbmRSdWxlIDogZnVuY3Rpb24obikgew0KCQkJdmFyIHQgPSB0aGlzLCBybCA9IHQucnVsZXMsIGksIHI7DQoNCgkJCXQuX3NldHVwKCk7DQoNCgkJCS8vIEV4YWN0IG1hdGNoDQoJCQlyID0gcmxbbl07DQoJCQlpZiAocikNCgkJCQlyZXR1cm4gcjsNCg0KCQkJLy8gVHJ5IHdpbGRjYXJkcw0KCQkJcmwgPSB0LndpbGRSdWxlczsNCgkJCWZvciAoaSA9IDA7IGkgPCBybC5sZW5ndGg7IGkrKykgew0KCQkJCWlmIChybFtpXS5uYW1lUkUudGVzdChuKSkNCgkJCQkJcmV0dXJuIHJsW2ldOw0KCQkJfQ0KDQoJCQlyZXR1cm4gbnVsbDsNCgkJfSwNCg0KCQlmaW5kQXR0cmliUnVsZSA6IGZ1bmN0aW9uKHJ1LCBuKSB7DQoJCQl2YXIgaSwgd2EgPSBydS53aWxkQXR0cmliczsNCg0KCQkJZm9yIChpID0gMDsgaSA8IHdhLmxlbmd0aDsgaSsrKSB7DQoJCQkJaWYgKHdhW2ldLm5hbWVSRS50ZXN0KG4pKQ0KCQkJCQlyZXR1cm4gd2FbaV07DQoJCQl9DQoNCgkJCXJldHVybiBudWxsOw0KCQl9LA0KDQoJCXNlcmlhbGl6ZSA6IGZ1bmN0aW9uKG4sIG8pIHsNCgkJCXZhciBoLCB0ID0gdGhpcywgZG9jLCBvbGREb2MsIGltcGwsIHNlbGVjdGVkOw0KDQoJCQl0Ll9zZXR1cCgpOw0KCQkJbyA9IG8gfHwge307DQoJCQlvLmZvcm1hdCA9IG8uZm9ybWF0IHx8ICdodG1sJzsNCgkJCXQucHJvY2Vzc09iaiA9IG87DQoNCgkJCS8vIElFIGxvb3NlcyB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlIG9uIG9wdGlvbiBlbGVtZW50cyBzbyB3ZSBuZWVkIHRvIHN0b3JlIGl0DQoJCQkvLyBTZWU6IGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvODI5OTA3DQoJCQlpZiAoaXNJRSkgew0KCQkJCXNlbGVjdGVkID0gW107DQoJCQkJZWFjaChuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdvcHRpb24nKSwgZnVuY3Rpb24obikgew0KCQkJCQl2YXIgdiA9IHQuZG9tLmdldEF0dHJpYihuLCAnc2VsZWN0ZWQnKTsNCg0KCQkJCQlzZWxlY3RlZC5wdXNoKHYgPyB2IDogbnVsbCk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCW4gPSBuLmNsb25lTm9kZSh0cnVlKTsNCg0KCQkJLy8gSUUgbG9vc2VzIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgb24gb3B0aW9uIGVsZW1lbnRzIHNvIHdlIG5lZWQgdG8gcmVzdG9yZSBpdA0KCQkJaWYgKGlzSUUpIHsNCgkJCQllYWNoKG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ29wdGlvbicpLCBmdW5jdGlvbihuLCBpKSB7DQoJCQkJCXQuZG9tLnNldEF0dHJpYihuLCAnc2VsZWN0ZWQnLCBzZWxlY3RlZFtpXSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCS8vIE5vZGVzIG5lZWRzIHRvIGJlIGF0dGFjaGVkIHRvIHNvbWV0aGluZyBpbiBXZWJLaXQvT3BlcmENCgkJCS8vIE9sZGVyIGJ1aWxkcyBvZiBPcGVyYSBjcmFzaGVzIGlmIHlvdSBhdHRhY2ggdGhlIG5vZGUgdG8gYW4gZG9jdW1lbnQgY3JlYXRlZCBkeW5hbWljYWxseQ0KCQkJLy8gYW5kIHNpbmNlIHdlIGNhbid0IGZlYXR1cmUgZGV0ZWN0IGEgY3Jhc2ggd2UgbmVlZCB0byBzbmlmZiB0aGUgYWN1dGFsIGJ1aWxkIG51bWJlcg0KCQkJLy8gVGhpcyBmaXggd2lsbCBtYWtlIERPTSByYW5nZXMgYW5kIG1ha2UgU2l6emxlIGhhcHB5IQ0KCQkJaW1wbCA9IG4ub3duZXJEb2N1bWVudC5pbXBsZW1lbnRhdGlvbjsNCgkJCWlmIChpbXBsLmNyZWF0ZUhUTUxEb2N1bWVudCkgew0KCQkJCS8vIENyZWF0ZSBhbiBlbXB0eSBIVE1MIGRvY3VtZW50DQoJCQkJZG9jID0gaW1wbC5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpOw0KDQoJCQkJLy8gQWRkIHRoZSBlbGVtZW50IG9yIGl0J3MgY2hpbGRyZW4gaWYgaXQncyBhIGJvZHkgZWxlbWVudCB0byB0aGUgbmV3IGRvY3VtZW50DQoJCQkJZWFjaChuLm5vZGVOYW1lID09ICdCT0RZJyA/IG4uY2hpbGROb2RlcyA6IFtuXSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQlkb2MuYm9keS5hcHBlbmRDaGlsZChkb2MuaW1wb3J0Tm9kZShub2RlLCB0cnVlKSk7DQoJCQkJfSk7DQoNCgkJCQkvLyBHcmFiIGZpcnN0IGNoaWxkIG9yIGJvZHkgZWxlbWVudCBmb3Igc2VyaWFsaXphdGlvbg0KCQkJCWlmIChuLm5vZGVOYW1lICE9ICdCT0RZJykNCgkJCQkJbiA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7DQoJCQkJZWxzZQ0KCQkJCQluID0gZG9jLmJvZHk7DQoNCgkJCQkvLyBzZXQgdGhlIG5ldyBkb2N1bWVudCBpbiBET01VdGlscyBzbyBjcmVhdGVFbGVtZW50IGV0YyB3b3Jrcw0KCQkJCW9sZERvYyA9IHQuZG9tLmRvYzsNCgkJCQl0LmRvbS5kb2MgPSBkb2M7DQoJCQl9DQoNCgkJCXQua2V5ID0gJycgKyAocGFyc2VJbnQodC5rZXkpICsgMSk7DQoNCgkJCS8vIFByZSBwcm9jZXNzDQoJCQlpZiAoIW8ubm9fZXZlbnRzKSB7DQoJCQkJby5ub2RlID0gbjsNCgkJCQl0Lm9uUHJlUHJvY2Vzcy5kaXNwYXRjaCh0LCBvKTsNCgkJCX0NCg0KCQkJLy8gU2VyaWFsaXplIEhUTUwgRE9NIGludG8gYSBzdHJpbmcNCgkJCXQud3JpdGVyLnJlc2V0KCk7DQoJCQl0Ll9pbmZvID0gbzsNCgkJCXQuX3NlcmlhbGl6ZU5vZGUobiwgby5nZXRJbm5lcik7DQoNCgkJCS8vIFBvc3QgcHJvY2Vzcw0KCQkJby5jb250ZW50ID0gdC53cml0ZXIuZ2V0Q29udGVudCgpOw0KDQoJCQkvLyBSZXN0b3JlIHRoZSBvbGQgZG9jdW1lbnQgaWYgaXQgd2FzIGNoYW5nZWQNCgkJCWlmIChvbGREb2MpDQoJCQkJdC5kb20uZG9jID0gb2xkRG9jOw0KDQoJCQlpZiAoIW8ubm9fZXZlbnRzKQ0KCQkJCXQub25Qb3N0UHJvY2Vzcy5kaXNwYXRjaCh0LCBvKTsNCg0KCQkJdC5fcG9zdFByb2Nlc3Mobyk7DQoJCQlvLm5vZGUgPSBudWxsOw0KDQoJCQlyZXR1cm4gdGlueW1jZS50cmltKG8uY29udGVudCk7DQoJCX0sDQoNCgkJLy8gSW50ZXJuYWwgZnVuY3Rpb25zDQoNCgkJX3Bvc3RQcm9jZXNzIDogZnVuY3Rpb24obykgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgaCA9IG8uY29udGVudCwgc2MgPSBbXSwgcDsNCg0KCQkJaWYgKG8uZm9ybWF0ID09ICdodG1sJykgew0KCQkJCS8vIFByb3RlY3Qgc29tZSBlbGVtZW50cw0KCQkJCXAgPSB0Ll9wcm90ZWN0KHsNCgkJCQkJY29udGVudCA6IGgsDQoJCQkJCXBhdHRlcm5zIDogWw0KCQkJCQkJe3BhdHRlcm4gOiAvKDxzY3JpcHRbXj5dKj4pKC4qPykoPFwvc2NyaXB0PikvZ30sDQoJCQkJCQl7cGF0dGVybiA6IC8oPG5vc2NyaXB0W14+XSo+KSguKj8pKDxcL25vc2NyaXB0PikvZ30sDQoJCQkJCQl7cGF0dGVybiA6IC8oPHN0eWxlW14+XSo+KSguKj8pKDxcL3N0eWxlPikvZ30sDQoJCQkJCQl7cGF0dGVybiA6IC8oPHByZVtePl0qPikoLio/KSg8XC9wcmU+KS9nLCBlbmNvZGUgOiAxfSwNCgkJCQkJCXtwYXR0ZXJuIDogLyg8IS0tXFtDREFUQVxbKSguKj8pKFxdXF0tLT4pL2d9DQoJCQkJCV0NCgkJCQl9KTsNCg0KCQkJCWggPSBwLmNvbnRlbnQ7DQoNCgkJCQkvLyBFbnRpdHkgZW5jb2RlDQoJCQkJaWYgKHMuZW50aXR5X2VuY29kaW5nICE9PSAncmF3JykNCgkJCQkJaCA9IHQuX2VuY29kZShoKTsNCg0KCQkJCS8vIFVzZSBCUiBpbnN0ZWFkIG9mICZuYnNwOyBwYWRkZWQgUCBlbGVtZW50cyBpbnNpZGUgZWRpdG9yIGFuZCB1c2UgPHA+Jm5ic3A7PC9wPiBvdXRzaWRlIGVkaXRvcg0KLyoJCQkJaWYgKG8uc2V0KQ0KCQkJCQloID0gaC5yZXBsYWNlKC88cD5ccysoJm5ic3A7fCYjMTYwO3xcdTAwYTB8PGJyIFwvPilccys8XC9wPi9nLCAnPHA+PGJyIC8+PC9wPicpOw0KCQkJCWVsc2UNCgkJCQkJaCA9IGgucmVwbGFjZSgvPHA+XHMrKCZuYnNwO3wmIzE2MDt8XHUwMGEwfDxiciBcLz4pXHMrPFwvcD4vZywgJzxwPiQxPC9wPicpOyovDQoNCgkJCQkvLyBTaW5jZSBHZWNrbyBhbmQgU2FmYXJpIGtlZXBzIHdoaXRlc3BhY2UgaW4gdGhlIERPTSB3ZSBuZWVkIHRvDQoJCQkJLy8gcmVtb3ZlIGl0IGlub3JkZXIgdG8gbWF0Y2ggb3RoZXIgYnJvd3NlcnMuIEJ1dCBJIHRoaW5rIEdlY2tvIGFuZCBTYWZhcmkgaXMgcmlnaHQuDQoJCQkJLy8gVGhpcyBwcm9jZXNzIGlzIG9ubHkgZG9uZSB3aGVuIGdldHRpbmcgY29udGVudHMgb3V0IGZyb20gdGhlIGVkaXRvci4NCgkJCQlpZiAoIW8uc2V0KSB7DQoJCQkJCS8vIFdlIG5lZWQgdG8gcmVwbGFjZSBwYXJhZ3JhcGggd2hpdGVzcGFjZSB3aXRoIGFuIG5ic3AgYmVmb3JlIGluZGVudGF0aW9uIHRvIGtlZXAgdGhlIFx1MDBhMCBjaGFyDQoJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88cD5ccys8XC9wPnw8cChbXj5dKyk+XHMrPFwvcD4vZywgcy5lbnRpdHlfZW5jb2RpbmcgPT0gJ251bWVyaWMnID8gJzxwJDE+JiMxNjA7PC9wPicgOiAnPHAkMT4mbmJzcDs8L3A+JywgaCk7DQoNCgkJCQkJaWYgKHMucmVtb3ZlX2xpbmVicmVha3MpIHsNCgkJCQkJCWggPSBoLnJlcGxhY2UoL1xyP1xufFxyL2csICcgJyk7DQoJCQkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvKDxbXj5dKz4pXHMrL2csICckMSAnLCBoKTsNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC9ccysoPFwvW14+XSs+KS9nLCAnICQxJywgaCk7DQoJCQkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPChwfGhbMS02XXxibG9ja3F1b3RlfGhyfGRpdnx0YWJsZXx0Ym9keXx0cnx0ZHxib2R5fGhlYWR8aHRtbHx0aXRsZXxtZXRhfHN0eWxlfHByZXxzY3JpcHR8bGlua3xvYmplY3QpIChbXj5dKyk+XHMrL2csICc8JDEgJDI+JywgaCk7IC8vIFRyaW0gYmxvY2sgc3RhcnQNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88KHB8aFsxLTZdfGJsb2NrcXVvdGV8aHJ8ZGl2fHRhYmxlfHRib2R5fHRyfHRkfGJvZHl8aGVhZHxodG1sfHRpdGxlfG1ldGF8c3R5bGV8cHJlfHNjcmlwdHxsaW5rfG9iamVjdCk+XHMrL2csICc8JDE+JywgaCk7IC8vIFRyaW0gYmxvY2sgc3RhcnQNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC9ccys8XC8ocHxoWzEtNl18YmxvY2txdW90ZXxocnxkaXZ8dGFibGV8dGJvZHl8dHJ8dGR8Ym9keXxoZWFkfGh0bWx8dGl0bGV8bWV0YXxzdHlsZXxwcmV8c2NyaXB0fGxpbmt8b2JqZWN0KT4vZywgJzwvJDE+JywgaCk7IC8vIFRyaW0gYmxvY2sgZW5kDQoJCQkJCX0NCg0KCQkJCQkvLyBTaW1wbGUgaW5kZW50YXRpb24NCgkJCQkJaWYgKHMuYXBwbHlfc291cmNlX2Zvcm1hdHRpbmcgJiYgcy5pbmRlbnRfbW9kZSA9PSAnc2ltcGxlJykgew0KCQkJCQkJLy8gQWRkIGxpbmUgYnJlYWtzIGJlZm9yZSBhbmQgYWZ0ZXIgYmxvY2sgZWxlbWVudHMNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC88KFwvPykodWx8aHJ8dGFibGV8bWV0YXxsaW5rfHRib2R5fHRyfG9iamVjdHxib2R5fGhlYWR8aHRtbHxtYXApKHxbXj5dKyk+XHMqL2csICdcbjwkMSQyJDM+XG4nLCBoKTsNCgkJCQkJCWggPSB0aW55bWNlLl9yZXBsYWNlKC9ccyo8KHB8aFsxLTZdfGJsb2NrcXVvdGV8ZGl2fHRpdGxlfHN0eWxlfHByZXxzY3JpcHR8dGR8bGl8YXJlYSkofFtePl0rKT4vZywgJ1xuPCQxJDI+JywgaCk7DQoJCQkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPFwvKHB8aFsxLTZdfGJsb2NrcXVvdGV8ZGl2fHRpdGxlfHN0eWxlfHByZXxzY3JpcHR8dGR8bGkpPlxzKi9nLCAnPC8kMT5cbicsIGgpOw0KCQkJCQkJaCA9IGgucmVwbGFjZSgvXG5cbi9nLCAnXG4nKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCWggPSB0Ll91bnByb3RlY3QoaCwgcCk7DQoNCgkJCQkvLyBSZXN0b3JlIENEQVRBIHNlY3Rpb25zDQoJCQkJaCA9IHRpbnltY2UuX3JlcGxhY2UoLzwhLS1cW0NEQVRBXFsoW1xzXFNdKylcXVxdLS0+L2csICc8IVtDREFUQVskMV1dPicsIGgpOw0KDQoJCQkJLy8gUmVzdG9yZSB0aGUgXHUwMGEwIGNoYXJhY3RlciBpZiByYXcgbW9kZSBpcyBlbmFibGVkDQoJCQkJaWYgKHMuZW50aXR5X2VuY29kaW5nID09ICdyYXcnKQ0KCQkJCQloID0gdGlueW1jZS5fcmVwbGFjZSgvPHA+Jm5ic3A7PFwvcD58PHAoW14+XSspPiZuYnNwOzxcL3A+L2csICc8cCQxPlx1MDBhMDwvcD4nLCBoKTsNCg0KCQkJCS8vIFJlc3RvcmUgbm9zY3JpcHQgZWxlbWVudHMNCgkJCQloID0gaC5yZXBsYWNlKC88bm9zY3JpcHQoW14+XSt8KT4oW1xzXFNdKj8pPFwvbm9zY3JpcHQ+L2csIGZ1bmN0aW9uKHYsIGF0dHJpYnMsIHRleHQpIHsNCgkJCQkJcmV0dXJuICc8bm9zY3JpcHQnICsgYXR0cmlicyArICc+JyArIHQuZG9tLmRlY29kZSh0ZXh0LnJlcGxhY2UoLzwhLS18LS0+L2csICcnKSkgKyAnPC9ub3NjcmlwdD4nOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlvLmNvbnRlbnQgPSBoOw0KCQl9LA0KDQoJCV9zZXJpYWxpemVOb2RlIDogZnVuY3Rpb24obiwgaW5uZXIpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIHcgPSB0LndyaXRlciwgaGMsIGVsLCBjbiwgaSwgbCwgYSwgYXQsIG5vLCB2LCBubiwgcnUsIGFyLCBpdiwgY2xvc2VkLCBrZWVwLCB0eXBlLCBzY29wZU5hbWU7DQoNCgkJCWlmICghcy5ub2RlX2ZpbHRlciB8fCBzLm5vZGVfZmlsdGVyKG4pKSB7DQoJCQkJc3dpdGNoIChuLm5vZGVUeXBlKSB7DQoJCQkJCWNhc2UgMTogLy8gRWxlbWVudA0KCQkJCQkJaWYgKG4uaGFzQXR0cmlidXRlID8gbi5oYXNBdHRyaWJ1dGUoJ19tY2VfYm9ndXMnKSA6IG4uZ2V0QXR0cmlidXRlKCdfbWNlX2JvZ3VzJykpDQoJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQlpdiA9IGtlZXAgPSBmYWxzZTsNCgkJCQkJCWhjID0gbi5oYXNDaGlsZE5vZGVzKCk7DQoJCQkJCQlubiA9IG4uZ2V0QXR0cmlidXRlKCdfbWNlX25hbWUnKSB8fCBuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7DQoNCgkJCQkJCS8vIEdldCBpbnRlcm5hbCB0eXBlDQoJCQkJCQl0eXBlID0gbi5nZXRBdHRyaWJ1dGUoJ19tY2VfdHlwZScpOw0KCQkJCQkJaWYgKHR5cGUpIHsNCgkJCQkJCQlpZiAoIXQuX2luZm8uY2xlYW51cCkgew0KCQkJCQkJCQlpdiA9IHRydWU7DQoJCQkJCQkJCXJldHVybjsNCgkJCQkJCQl9IGVsc2UNCgkJCQkJCQkJa2VlcCA9IDE7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEFkZCBjb3JyZWN0IHByZWZpeCBvbiBJRQ0KCQkJCQkJaWYgKGlzSUUpIHsNCgkJCQkJCQlzY29wZU5hbWUgPSBuLnNjb3BlTmFtZTsNCgkJCQkJCQlpZiAoc2NvcGVOYW1lICYmIHNjb3BlTmFtZSAhPT0gJ0hUTUwnICYmIHNjb3BlTmFtZSAhPT0gJ2h0bWwnKQ0KCQkJCQkJCQlubiA9IHNjb3BlTmFtZSArICc6JyArIG5uOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBSZW1vdmUgbWNlIHByZWZpeCBvbiBJRSBuZWVkZWQgZm9yIHRoZSBhYmJyIGVsZW1lbnQNCgkJCQkJCWlmIChubi5pbmRleE9mKCdtY2U6JykgPT09IDApDQoJCQkJCQkJbm4gPSBubi5zdWJzdHJpbmcoNCk7DQoNCgkJCQkJCS8vIENoZWNrIGlmIHZhbGlkDQoJCQkJCQlpZiAoIWtlZXApIHsNCgkJCQkJCQlpZiAoIXQudmFsaWRFbGVtZW50c1JFIHx8ICF0LnZhbGlkRWxlbWVudHNSRS50ZXN0KG5uKSB8fCAodC5pbnZhbGlkRWxlbWVudHNSRSAmJiB0LmludmFsaWRFbGVtZW50c1JFLnRlc3Qobm4pKSB8fCBpbm5lcikgew0KCQkJCQkJCQlpdiA9IHRydWU7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJaWYgKGlzSUUpIHsNCgkJCQkJCQkvLyBGaXggSUUgY29udGVudCBkdXBsaWNhdGlvbiAoRE9NIGNhbiBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSBub2RlKQ0KCQkJCQkJCWlmIChzLmZpeF9jb250ZW50X2R1cGxpY2F0aW9uKSB7DQoJCQkJCQkJCWlmIChuLl9tY2Vfc2VyaWFsaXplZCA9PSB0LmtleSkNCgkJCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJCQluLl9tY2Vfc2VyaWFsaXplZCA9IHQua2V5Ow0KCQkJCQkJCX0NCg0KCQkJCQkJCS8vIElFIHNvbWV0aW1lcyBhZGRzIGEgLyBpbmZyb250IG9mIHRoZSBub2RlIG5hbWUNCgkJCQkJCQlpZiAobm4uY2hhckF0KDApID09ICcvJykNCgkJCQkJCQkJbm4gPSBubi5zdWJzdHJpbmcoMSk7DQoJCQkJCQl9IGVsc2UgaWYgKGlzR2Vja28pIHsNCgkJCQkJCQkvLyBJZ25vcmUgYnIgZWxlbWVudHMNCgkJCQkJCQlpZiAobi5ub2RlTmFtZSA9PT0gJ0JSJyAmJiBuLmdldEF0dHJpYnV0ZSgndHlwZScpID09ICdfbW96JykNCgkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBDaGVjayBpZiB2YWxpZCBjaGlsZA0KCQkJCQkJaWYgKHMudmFsaWRhdGVfY2hpbGRyZW4pIHsNCgkJCQkJCQlpZiAodC5lbGVtZW50TmFtZSAmJiAhdC5zY2hlbWEuaXNWYWxpZCh0LmVsZW1lbnROYW1lLCBubikpIHsNCgkJCQkJCQkJaXYgPSB0cnVlOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoNCgkJCQkJCQl0LmVsZW1lbnROYW1lID0gbm47DQoJCQkJCQl9DQoNCgkJCQkJCXJ1ID0gdC5maW5kUnVsZShubik7DQoJCQkJCQkNCgkJCQkJCS8vIE5vIHZhbGlkIHJ1bGUgZm9yIHRoaXMgZWxlbWVudCBjb3VsZCBiZSBmb3VuZCB0aGVuIHNraXAgaXQNCgkJCQkJCWlmICghcnUpIHsNCgkJCQkJCQlpdiA9IHRydWU7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQl9DQoNCgkJCQkJCW5uID0gcnUubmFtZSB8fCBubjsNCgkJCQkJCWNsb3NlZCA9IHMuY2xvc2VkLnRlc3Qobm4pOw0KDQoJCQkJCQkvLyBTa2lwIGVtcHR5IG5vZGVzIG9yIGVtcHR5IG5vZGUgbmFtZSBpbiBJRQ0KCQkJCQkJaWYgKCghaGMgJiYgcnUubm9FbXB0eSkgfHwgKGlzSUUgJiYgIW5uKSkgew0KCQkJCQkJCWl2ID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gQ2hlY2sgcmVxdWlyZWQNCgkJCQkJCWlmIChydS5yZXF1aXJlZEF0dHJpYnMpIHsNCgkJCQkJCQlhID0gcnUucmVxdWlyZWRBdHRyaWJzOw0KDQoJCQkJCQkJZm9yIChpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCQkJCQlpZiAodGhpcy5kb20uZ2V0QXR0cmliKG4sIGFbaV0pICE9PSAnJykNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCg0KCQkJCQkJCS8vIE5vbmUgb2YgdGhlIHJlcXVpcmVkIHdhcyB0aGVyZQ0KCQkJCQkJCWlmIChpID09IC0xKSB7DQoJCQkJCQkJCWl2ID0gdHJ1ZTsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQl3LndyaXRlU3RhcnRFbGVtZW50KG5uKTsNCg0KCQkJCQkJLy8gQWRkIG9yZGVyZWQgYXR0cmlidXRlcw0KCQkJCQkJaWYgKHJ1LmF0dHJpYnMpIHsNCgkJCQkJCQlmb3IgKGk9MCwgYXQgPSBydS5hdHRyaWJzLCBsID0gYXQubGVuZ3RoOyBpPGw7IGkrKykgew0KCQkJCQkJCQlhID0gYXRbaV07DQoJCQkJCQkJCXYgPSB0Ll9nZXRBdHRyaWIobiwgYSk7DQoNCgkJCQkJCQkJaWYgKHYgIT09IG51bGwpDQoJCQkJCQkJCQl3LndyaXRlQXR0cmlidXRlKGEubmFtZSwgdik7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBBZGQgd2lsZCBhdHRyaWJ1dGVzDQoJCQkJCQlpZiAocnUudmFsaWRBdHRyaWJzUkUpIHsNCgkJCQkJCQlhdCA9IHQuZG9tLmdldEF0dHJpYnMobik7DQoJCQkJCQkJZm9yIChpPWF0Lmxlbmd0aC0xOyBpPi0xOyBpLS0pIHsNCgkJCQkJCQkJbm8gPSBhdFtpXTsNCg0KCQkJCQkJCQlpZiAobm8uc3BlY2lmaWVkKSB7DQoJCQkJCQkJCQlhID0gbm8ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsNCg0KCQkJCQkJCQkJaWYgKHMuaW52YWxpZF9hdHRycy50ZXN0KGEpIHx8ICFydS52YWxpZEF0dHJpYnNSRS50ZXN0KGEpKQ0KCQkJCQkJCQkJCWNvbnRpbnVlOw0KDQoJCQkJCQkJCQlhciA9IHQuZmluZEF0dHJpYlJ1bGUocnUsIGEpOw0KCQkJCQkJCQkJdiA9IHQuX2dldEF0dHJpYihuLCBhciwgYSk7DQoNCgkJCQkJCQkJCWlmICh2ICE9PSBudWxsKQ0KCQkJCQkJCQkJCXcud3JpdGVBdHRyaWJ1dGUoYSwgdik7DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEtlZXAgdHlwZSBhdHRyaWJ1dGUNCgkJCQkJCWlmICh0eXBlICYmIGtlZXApDQoJCQkJCQkJdy53cml0ZUF0dHJpYnV0ZSgnX21jZV90eXBlJywgdHlwZSk7DQoNCgkJCQkJCS8vIFdyaXRlIHRleHQgZnJvbSBzY3JpcHQNCgkJCQkJCWlmIChubiA9PT0gJ3NjcmlwdCcgJiYgdGlueW1jZS50cmltKG4uaW5uZXJIVE1MKSkgew0KCQkJCQkJCXcud3JpdGVUZXh0KCcvLyAnKTsgLy8gUGFkZCBpdCB3aXRoIGEgY29tbWVudCBzbyBpdCB3aWxsIHBhcnNlIG9uIG9sZGVyIGJyb3dzZXJzDQoJCQkJCQkJdy53cml0ZUNEQVRBKG4uaW5uZXJIVE1MLnJlcGxhY2UoLzwhLS18LS0+fDxcW0NEQVRBXFt8XF1cXT4vZywgJycpKTsgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBjZGF0YSBzdHVjdHVyZXMNCgkJCQkJCQloYyA9IGZhbHNlOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBQYWRkIGVtcHR5IG5vZGVzIHdpdGggYSAmbmJzcDsNCgkJCQkJCWlmIChydS5wYWRkKSB7DQoJCQkJCQkJLy8gSWYgaXQgaGFzIG9ubHkgb25lIGJvZ3VzIGNoaWxkLCBwYWRkIGl0IGFueXdheSB3b3JrYXJvdW5kIGZvciA8dGQ+PGJyIC8+PC90ZD4gYnVnDQoJCQkJCQkJaWYgKGhjICYmIChjbiA9IG4uZmlyc3RDaGlsZCkgJiYgY24ubm9kZVR5cGUgPT09IDEgJiYgbi5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkgew0KCQkJCQkJCQlpZiAoY24uaGFzQXR0cmlidXRlID8gY24uaGFzQXR0cmlidXRlKCdfbWNlX2JvZ3VzJykgOiBjbi5nZXRBdHRyaWJ1dGUoJ19tY2VfYm9ndXMnKSkNCgkJCQkJCQkJCXcud3JpdGVUZXh0KCdcdTAwYTAnKTsNCgkJCQkJCQl9IGVsc2UgaWYgKCFoYykNCgkJCQkJCQkJdy53cml0ZVRleHQoJ1x1MDBhMCcpOyAvLyBObyBjaGlsZHJlbiB0aGVuIHBhZGQgaXQNCgkJCQkJCX0NCg0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAzOiAvLyBUZXh0DQoJCQkJCQkvLyBDaGVjayBpZiB2YWxpZCBjaGlsZA0KCQkJCQkJaWYgKHMudmFsaWRhdGVfY2hpbGRyZW4gJiYgdC5lbGVtZW50TmFtZSAmJiAhdC5zY2hlbWEuaXNWYWxpZCh0LmVsZW1lbnROYW1lLCAnI3RleHQnKSkNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCXJldHVybiB3LndyaXRlVGV4dChuLm5vZGVWYWx1ZSk7DQoNCgkJCQkJY2FzZSA0OiAvLyBDREFUQQ0KCQkJCQkJcmV0dXJuIHcud3JpdGVDREFUQShuLm5vZGVWYWx1ZSk7DQoNCgkJCQkJY2FzZSA4OiAvLyBDb21tZW50DQoJCQkJCQlyZXR1cm4gdy53cml0ZUNvbW1lbnQobi5ub2RlVmFsdWUpOw0KCQkJCX0NCgkJCX0gZWxzZSBpZiAobi5ub2RlVHlwZSA9PSAxKQ0KCQkJCWhjID0gbi5oYXNDaGlsZE5vZGVzKCk7DQoNCgkJCWlmIChoYyAmJiAhY2xvc2VkKSB7DQoJCQkJY24gPSBuLmZpcnN0Q2hpbGQ7DQoNCgkJCQl3aGlsZSAoY24pIHsNCgkJCQkJdC5fc2VyaWFsaXplTm9kZShjbik7DQoJCQkJCXQuZWxlbWVudE5hbWUgPSBubjsNCgkJCQkJY24gPSBjbi5uZXh0U2libGluZzsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFdyaXRlIGVsZW1lbnQgZW5kDQoJCQlpZiAoIWl2KSB7DQoJCQkJaWYgKCFjbG9zZWQpDQoJCQkJCXcud3JpdGVGdWxsRW5kRWxlbWVudCgpOw0KCQkJCWVsc2UNCgkJCQkJdy53cml0ZUVuZEVsZW1lbnQoKTsNCgkJCX0NCgkJfSwNCg0KCQlfcHJvdGVjdCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJby5pdGVtcyA9IG8uaXRlbXMgfHwgW107DQoNCgkJCWZ1bmN0aW9uIGVuYyhzKSB7DQoJCQkJcmV0dXJuIHMucmVwbGFjZSgvW1xyXG5cXF0vZywgZnVuY3Rpb24oYykgew0KCQkJCQlpZiAoYyA9PT0gJ1xuJykNCgkJCQkJCXJldHVybiAnXFxuJzsNCgkJCQkJZWxzZSBpZiAoYyA9PT0gJ1xcJykNCgkJCQkJCXJldHVybiAnXFxcXCc7DQoNCgkJCQkJcmV0dXJuICdcXHInOw0KCQkJCX0pOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gZGVjKHMpIHsNCgkJCQlyZXR1cm4gcy5yZXBsYWNlKC9cXFtcXHJuXS9nLCBmdW5jdGlvbihjKSB7DQoJCQkJCWlmIChjID09PSAnXFxuJykNCgkJCQkJCXJldHVybiAnXG4nOw0KCQkJCQllbHNlIGlmIChjID09PSAnXFxcXCcpDQoJCQkJCQlyZXR1cm4gJ1xcJzsNCg0KCQkJCQlyZXR1cm4gJ1xyJzsNCgkJCQl9KTsNCgkJCX07DQoNCgkJCWVhY2goby5wYXR0ZXJucywgZnVuY3Rpb24ocCkgew0KCQkJCW8uY29udGVudCA9IGRlYyhlbmMoby5jb250ZW50KS5yZXBsYWNlKHAucGF0dGVybiwgZnVuY3Rpb24oeCwgYSwgYiwgYykgew0KCQkJCQliID0gZGVjKGIpOw0KDQoJCQkJCWlmIChwLmVuY29kZSkNCgkJCQkJCWIgPSB0Ll9lbmNvZGUoYik7DQoNCgkJCQkJby5pdGVtcy5wdXNoKGIpOw0KCQkJCQlyZXR1cm4gYSArICc8IS0tbWNlOicgKyAoby5pdGVtcy5sZW5ndGggLSAxKSArICctLT4nICsgYzsNCgkJCQl9KSk7DQoJCQl9KTsNCg0KCQkJcmV0dXJuIG87DQoJCX0sDQoNCgkJX3VucHJvdGVjdCA6IGZ1bmN0aW9uKGgsIG8pIHsNCgkJCWggPSBoLnJlcGxhY2UoL1w8IS0tbWNlOihbMC05XSspLS1cPi9nLCBmdW5jdGlvbihhLCBiKSB7DQoJCQkJcmV0dXJuIG8uaXRlbXNbcGFyc2VJbnQoYildOw0KCQkJfSk7DQoNCgkJCW8uaXRlbXMgPSBbXTsNCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJX2VuY29kZSA6IGZ1bmN0aW9uKGgpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGw7DQoNCgkJCS8vIEVudGl0eSBlbmNvZGUNCgkJCWlmIChzLmVudGl0eV9lbmNvZGluZyAhPT0gJ3JhdycpIHsNCgkJCQlpZiAocy5lbnRpdHlfZW5jb2RpbmcuaW5kZXhPZignbmFtZWQnKSAhPSAtMSkgew0KCQkJCQl0LnNldEVudGl0aWVzKHMuZW50aXRpZXMpOw0KCQkJCQlsID0gdC5lbnRpdHlMb29rdXA7DQoNCgkJCQkJaCA9IGgucmVwbGFjZSgvW1x1MDA3RS1cdUZGRkZdL2csIGZ1bmN0aW9uKGEpIHsNCgkJCQkJCXZhciB2Ow0KDQoJCQkJCQlpZiAodiA9IGxbYV0pDQoJCQkJCQkJYSA9ICcmJyArIHYgKyAnOyc7DQoNCgkJCQkJCXJldHVybiBhOw0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQlpZiAocy5lbnRpdHlfZW5jb2RpbmcuaW5kZXhPZignbnVtZXJpYycpICE9IC0xKSB7DQoJCQkJCWggPSBoLnJlcGxhY2UoL1tcdTAwN0UtXHVGRkZGXS9nLCBmdW5jdGlvbihhKSB7DQoJCQkJCQlyZXR1cm4gJyYjJyArIGEuY2hhckNvZGVBdCgwKSArICc7JzsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gaDsNCgkJfSwNCg0KCQlfc2V0dXAgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHRoaXMuc2V0dGluZ3M7DQoNCgkJCWlmICh0LmRvbmUpDQoJCQkJcmV0dXJuOw0KDQoJCQl0LmRvbmUgPSAxOw0KDQoJCQl0LnNldFJ1bGVzKHMudmFsaWRfZWxlbWVudHMpOw0KCQkJdC5hZGRSdWxlcyhzLmV4dGVuZGVkX3ZhbGlkX2VsZW1lbnRzKTsNCg0KCQkJaWYgKHMuaW52YWxpZF9lbGVtZW50cykNCgkJCQl0LmludmFsaWRFbGVtZW50c1JFID0gbmV3IFJlZ0V4cCgnXignICsgd2lsZGNhcmRUb1JFKHMuaW52YWxpZF9lbGVtZW50cy5yZXBsYWNlKC8sL2csICd8JykudG9Mb3dlckNhc2UoKSkgKyAnKSQnKTsNCg0KCQkJaWYgKHMuYXR0cmliX3ZhbHVlX2ZpbHRlcikNCgkJCQl0LmF0dHJpYlZhbHVlRmlsdGVyID0gcy5hdHRyaWJWYWx1ZUZpbHRlcjsNCgkJfSwNCg0KCQlfZ2V0QXR0cmliIDogZnVuY3Rpb24obiwgYSwgbmEpIHsNCgkJCXZhciBpLCB2Ow0KDQoJCQluYSA9IG5hIHx8IGEubmFtZTsNCg0KCQkJaWYgKGEuZm9yY2VkVmFsICYmICh2ID0gYS5mb3JjZWRWYWwpKSB7DQoJCQkJaWYgKHYgPT09ICd7JHVpZH0nKQ0KCQkJCQlyZXR1cm4gdGhpcy5kb20udW5pcXVlSWQoKTsNCg0KCQkJCXJldHVybiB2Ow0KCQkJfQ0KDQoJCQl2ID0gdGhpcy5kb20uZ2V0QXR0cmliKG4sIG5hKTsNCg0KCQkJc3dpdGNoIChuYSkgew0KCQkJCWNhc2UgJ3Jvd3NwYW4nOg0KCQkJCWNhc2UgJ2NvbHNwYW4nOg0KCQkJCQkvLyBXaGF0cyB0aGUgcG9pbnQ/IFJlbW92ZSB1c2xlc3MgYXR0cmlidXRlIHZhbHVlDQoJCQkJCWlmICh2ID09ICcxJykNCgkJCQkJCXYgPSAnJzsNCg0KCQkJCQlicmVhazsNCgkJCX0NCg0KCQkJaWYgKHRoaXMuYXR0cmliVmFsdWVGaWx0ZXIpDQoJCQkJdiA9IHRoaXMuYXR0cmliVmFsdWVGaWx0ZXIobmEsIHYsIG4pOw0KDQoJCQlpZiAoYS52YWxpZFZhbHMpIHsNCgkJCQlmb3IgKGkgPSBhLnZhbGlkVmFscy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCQlpZiAodiA9PSBhLnZhbGlkVmFsc1tpXSkNCgkJCQkJCWJyZWFrOw0KCQkJCX0NCg0KCQkJCWlmIChpID09IC0xKQ0KCQkJCQlyZXR1cm4gbnVsbDsNCgkJCX0NCg0KCQkJaWYgKHYgPT09ICcnICYmIHR5cGVvZihhLmRlZmF1bHRWYWwpICE9ICd1bmRlZmluZWQnKSB7DQoJCQkJdiA9IGEuZGVmYXVsdFZhbDsNCg0KCQkJCWlmICh2ID09PSAneyR1aWR9JykNCgkJCQkJcmV0dXJuIHRoaXMuZG9tLnVuaXF1ZUlkKCk7DQoNCgkJCQlyZXR1cm4gdjsNCgkJCX0gZWxzZSB7DQoJCQkJLy8gUmVtb3ZlIGludGVybmFsIG1jZUl0ZW1YWCBjbGFzc2VzIHdoZW4gY29udGVudCBpcyBleHRyYWN0ZWQgZnJvbSBlZGl0b3INCgkJCQlpZiAobmEgPT0gJ2NsYXNzJyAmJiB0aGlzLnByb2Nlc3NPYmouZ2V0KQ0KCQkJCQl2ID0gdi5yZXBsYWNlKC9ccz9tY2VJdGVtXHcrXHM/L2csICcnKTsNCgkJCX0NCg0KCQkJaWYgKHYgPT09ICcnKQ0KCQkJCXJldHVybiBudWxsOw0KDQoNCgkJCXJldHVybiB2Ow0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl0aW55bWNlLmRvbS5TY3JpcHRMb2FkZXIgPSBmdW5jdGlvbihzZXR0aW5ncykgew0KCQl2YXIgUVVFVUVEID0gMCwNCgkJCUxPQURJTkcgPSAxLA0KCQkJTE9BREVEID0gMiwNCgkJCXN0YXRlcyA9IHt9LA0KCQkJcXVldWUgPSBbXSwNCgkJCXNjcmlwdExvYWRlZENhbGxiYWNrcyA9IHt9LA0KCQkJcXVldWVMb2FkZWRDYWxsYmFja3MgPSBbXSwNCgkJCWxvYWRpbmcgPSAwLA0KCQkJdW5kZWZpbmVkOw0KDQoJCWZ1bmN0aW9uIGxvYWRTY3JpcHQodXJsLCBjYWxsYmFjaykgew0KCQkJdmFyIHQgPSB0aGlzLCBkb20gPSB0aW55bWNlLkRPTSwgZWxtLCB1cmksIGxvYywgaWQ7DQoNCgkJCS8vIEV4ZWN1dGUgY2FsbGJhY2sgd2hlbiBzY3JpcHQgaXMgbG9hZGVkDQoJCQlmdW5jdGlvbiBkb25lKCkgew0KCQkJCWRvbS5yZW1vdmUoaWQpOw0KDQoJCQkJaWYgKGVsbSkNCgkJCQkJZWxtLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGVsbS5vbmxvYWQgPSBlbG0gPSBudWxsOw0KDQoJCQkJY2FsbGJhY2soKTsNCgkJCX07DQoNCgkJCWlkID0gZG9tLnVuaXF1ZUlkKCk7DQoNCgkJCWlmICh0aW55bWNlLmlzSUU2KSB7DQoJCQkJdXJpID0gbmV3IHRpbnltY2UudXRpbC5VUkkodXJsKTsNCgkJCQlsb2MgPSBsb2NhdGlvbjsNCg0KCQkJCS8vIElmIHNjcmlwdCBpcyBmcm9tIHNhbWUgZG9tYWluIGFuZCB3ZQ0KCQkJCS8vIHVzZSBJRSA2IHRoZW4gdXNlIFhIUiBzaW5jZSBpdCdzIG1vcmUgcmVsaWFibGUNCgkJCQlpZiAodXJpLmhvc3QgPT0gbG9jLmhvc3RuYW1lICYmIHVyaS5wb3J0ID09IGxvYy5wb3J0ICYmICh1cmkucHJvdG9jb2wgKyAnOicpID09IGxvYy5wcm90b2NvbCkgew0KCQkJCQl0aW55bWNlLnV0aWwuWEhSLnNlbmQoew0KCQkJCQkJdXJsIDogdGlueW1jZS5fYWRkVmVyKHVyaS5nZXRVUkkoKSksDQoJCQkJCQlzdWNjZXNzIDogZnVuY3Rpb24oY29udGVudCkgew0KCQkJCQkJCS8vIENyZWF0ZSBuZXcgdGVtcCBzY3JpcHQgZWxlbWVudA0KCQkJCQkJCXZhciBzY3JpcHQgPSBkb20uY3JlYXRlKCdzY3JpcHQnLCB7DQoJCQkJCQkJCXR5cGUgOiAndGV4dC9qYXZhc2NyaXB0Jw0KCQkJCQkJCX0pOw0KDQoJCQkJCQkJLy8gRXZhbHVhdGUgc2NyaXB0IGluIGdsb2JhbCBzY29wZQ0KCQkJCQkJCXNjcmlwdC50ZXh0ID0gY29udGVudDsNCgkJCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHNjcmlwdCk7DQoJCQkJCQkJZG9tLnJlbW92ZShzY3JpcHQpOw0KDQoJCQkJCQkJZG9uZSgpOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCg0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBDcmVhdGUgbmV3IHNjcmlwdCBlbGVtZW50DQoJCQllbG0gPSBkb20uY3JlYXRlKCdzY3JpcHQnLCB7DQoJCQkJaWQgOiBpZCwNCgkJCQl0eXBlIDogJ3RleHQvamF2YXNjcmlwdCcsDQoJCQkJc3JjIDogdGlueW1jZS5fYWRkVmVyKHVybCkNCgkJCX0pOw0KDQoJCQkvLyBBZGQgb25sb2FkIGxpc3RlbmVyIGZvciBub24gSUUgYnJvd3NlcnMgc2luY2UgSUU5DQoJCQkvLyBmaXJlcyBvbmxvYWQgZXZlbnQgYmVmb3JlIHRoZSBzY3JpcHQgaXMgcGFyc2VkIGFuZCBleGVjdXRlZA0KCQkJaWYgKCF0aW55bWNlLmlzSUUpDQoJCQkJZWxtLm9ubG9hZCA9IGRvbmU7DQoNCgkJCWVsbS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsNCgkJCQl2YXIgc3RhdGUgPSBlbG0ucmVhZHlTdGF0ZTsNCg0KCQkJCS8vIExvYWRlZCBzdGF0ZSBpcyBwYXNzZWQgb24gSUUgNiBob3dldmVyIHRoZXJlDQoJCQkJLy8gYXJlIGtub3duIGlzc3VlcyB3aXRoIHRoaXMgbWV0aG9kIGJ1dCB3ZSBjYW4ndCB1c2UNCgkJCQkvLyBYSFIgaW4gYSBjcm9zcyBkb21haW4gbG9hZGluZw0KCQkJCWlmIChzdGF0ZSA9PSAnY29tcGxldGUnIHx8IHN0YXRlID09ICdsb2FkZWQnKQ0KCQkJCQlkb25lKCk7DQoJCQl9Ow0KDQoJCQkvLyBNb3N0IGJyb3dzZXJzIHN1cHBvcnQgdGhpcyBmZWF0dXJlIHNvIHdlIHJlcG9ydCBlcnJvcnMNCgkJCS8vIGZvciB0aG9zZSBhdCBsZWFzdCB0byBoZWxwIHVzZXJzIHRyYWNrIHRoZWlyIG1pc3NpbmcgcGx1Z2lucyBldGMNCgkJCS8vIHRvZG86IFJlbW92ZWQgc2luY2UgaXQgcHJvZHVjZWQgZXJyb3IgaWYgdGhlIGRvY3VtZW50IGlzIHVubG9hZGVkIGJ5IG5hdmlnYXRpbmcgYXdheSwgcmUtYWRkIGl0IGFzIGFuIG9wdGlvbg0KCQkJLyplbG0ub25lcnJvciA9IGZ1bmN0aW9uKCkgew0KCQkJCWFsZXJ0KCdGYWlsZWQgdG8gbG9hZDogJyArIHVybCk7DQoJCQl9OyovDQoNCgkJCS8vIEFkZCBzY3JpcHQgdG8gZG9jdW1lbnQNCgkJCShkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdIHx8IGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKGVsbSk7DQoJCX07DQoNCgkJdGhpcy5pc0RvbmUgPSBmdW5jdGlvbih1cmwpIHsNCgkJCXJldHVybiBzdGF0ZXNbdXJsXSA9PSBMT0FERUQ7DQoJCX07DQoNCgkJdGhpcy5tYXJrRG9uZSA9IGZ1bmN0aW9uKHVybCkgew0KCQkJc3RhdGVzW3VybF0gPSBMT0FERUQ7DQoJCX07DQoNCgkJdGhpcy5hZGQgPSB0aGlzLmxvYWQgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrLCBzY29wZSkgew0KCQkJdmFyIGl0ZW0sIHN0YXRlID0gc3RhdGVzW3VybF07DQoNCgkJCS8vIEFkZCB1cmwgdG8gbG9hZCBxdWV1ZQ0KCQkJaWYgKHN0YXRlID09IHVuZGVmaW5lZCkgew0KCQkJCXF1ZXVlLnB1c2godXJsKTsNCgkJCQlzdGF0ZXNbdXJsXSA9IFFVRVVFRDsNCgkJCX0NCg0KCQkJaWYgKGNhbGxiYWNrKSB7DQoJCQkJLy8gU3RvcmUgYXdheSBjYWxsYmFjayBmb3IgbGF0ZXIgZXhlY3V0aW9uDQoJCQkJaWYgKCFzY3JpcHRMb2FkZWRDYWxsYmFja3NbdXJsXSkNCgkJCQkJc2NyaXB0TG9hZGVkQ2FsbGJhY2tzW3VybF0gPSBbXTsNCg0KCQkJCXNjcmlwdExvYWRlZENhbGxiYWNrc1t1cmxdLnB1c2goew0KCQkJCQlmdW5jIDogY2FsbGJhY2ssDQoJCQkJCXNjb3BlIDogc2NvcGUgfHwgdGhpcw0KCQkJCX0pOw0KCQkJfQ0KCQl9Ow0KDQoJCXRoaXMubG9hZFF1ZXVlID0gZnVuY3Rpb24oY2FsbGJhY2ssIHNjb3BlKSB7DQoJCQl0aGlzLmxvYWRTY3JpcHRzKHF1ZXVlLCBjYWxsYmFjaywgc2NvcGUpOw0KCQl9Ow0KDQoJCXRoaXMubG9hZFNjcmlwdHMgPSBmdW5jdGlvbihzY3JpcHRzLCBjYWxsYmFjaywgc2NvcGUpIHsNCgkJCXZhciBsb2FkU2NyaXB0czsNCg0KCQkJZnVuY3Rpb24gZXhlY1NjcmlwdExvYWRlZENhbGxiYWNrcyh1cmwpIHsNCgkJCQkvLyBFeGVjdXRlIFVSTCBjYWxsYmFjayBmdW5jdGlvbnMNCgkJCQl0aW55bWNlLmVhY2goc2NyaXB0TG9hZGVkQ2FsbGJhY2tzW3VybF0sIGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQoJCQkJCWNhbGxiYWNrLmZ1bmMuY2FsbChjYWxsYmFjay5zY29wZSk7DQoJCQkJfSk7DQoNCgkJCQlzY3JpcHRMb2FkZWRDYWxsYmFja3NbdXJsXSA9IHVuZGVmaW5lZDsNCgkJCX07DQoNCgkJCXF1ZXVlTG9hZGVkQ2FsbGJhY2tzLnB1c2goew0KCQkJCWZ1bmMgOiBjYWxsYmFjaywNCgkJCQlzY29wZSA6IHNjb3BlIHx8IHRoaXMNCgkJCX0pOw0KDQoJCQlsb2FkU2NyaXB0cyA9IGZ1bmN0aW9uKCkgew0KCQkJCXZhciBsb2FkaW5nU2NyaXB0cyA9IHRpbnltY2UuZ3JlcChzY3JpcHRzKTsNCg0KCQkJCS8vIEN1cnJlbnQgc2NyaXB0cyBoYXMgYmVlbiBoYW5kbGVkDQoJCQkJc2NyaXB0cy5sZW5ndGggPSAwOw0KDQoJCQkJLy8gTG9hZCBzY3JpcHRzIHRoYXQgbmVlZHMgdG8gYmUgbG9hZGVkDQoJCQkJdGlueW1jZS5lYWNoKGxvYWRpbmdTY3JpcHRzLCBmdW5jdGlvbih1cmwpIHsNCgkJCQkJLy8gU2NyaXB0IGlzIGFscmVhZHkgbG9hZGVkIHRoZW4gZXhlY3V0ZSBzY3JpcHQgY2FsbGJhY2tzIGRpcmVjdGx5DQoJCQkJCWlmIChzdGF0ZXNbdXJsXSA9PSBMT0FERUQpIHsNCgkJCQkJCWV4ZWNTY3JpcHRMb2FkZWRDYWxsYmFja3ModXJsKTsNCgkJCQkJCXJldHVybjsNCgkJCQkJfQ0KDQoJCQkJCS8vIElzIHNjcmlwdCBub3QgbG9hZGluZyB0aGVuIHN0YXJ0IGxvYWRpbmcgaXQNCgkJCQkJaWYgKHN0YXRlc1t1cmxdICE9IExPQURJTkcpIHsNCgkJCQkJCXN0YXRlc1t1cmxdID0gTE9BRElORzsNCgkJCQkJCWxvYWRpbmcrKzsNCg0KCQkJCQkJbG9hZFNjcmlwdCh1cmwsIGZ1bmN0aW9uKCkgew0KCQkJCQkJCXN0YXRlc1t1cmxdID0gTE9BREVEOw0KCQkJCQkJCWxvYWRpbmctLTsNCg0KCQkJCQkJCWV4ZWNTY3JpcHRMb2FkZWRDYWxsYmFja3ModXJsKTsNCg0KCQkJCQkJCS8vIExvYWQgbW9yZSBzY3JpcHRzIGlmIHRoZXkgd2hlcmUgYWRkZWQgYnkgdGhlIHJlY2VudGx5IGxvYWRlZCBzY3JpcHQNCgkJCQkJCQlsb2FkU2NyaXB0cygpOw0KCQkJCQkJfSk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCS8vIE5vIHNjcmlwdHMgYXJlIGN1cnJlbnRseSBsb2FkaW5nIHRoZW4gZXhlY3V0ZSBhbGwgcGVuZGluZyBxdWV1ZSBsb2FkZWQgY2FsbGJhY2tzDQoJCQkJaWYgKCFsb2FkaW5nKSB7DQoJCQkJCXRpbnltY2UuZWFjaChxdWV1ZUxvYWRlZENhbGxiYWNrcywgZnVuY3Rpb24oY2FsbGJhY2spIHsNCgkJCQkJCWNhbGxiYWNrLmZ1bmMuY2FsbChjYWxsYmFjay5zY29wZSk7DQoJCQkJCX0pOw0KDQoJCQkJCXF1ZXVlTG9hZGVkQ2FsbGJhY2tzLmxlbmd0aCA9IDA7DQoJCQkJfQ0KCQkJfTsNCg0KCQkJbG9hZFNjcmlwdHMoKTsNCgkJfTsNCgl9Ow0KDQoJLy8gR2xvYmFsIHNjcmlwdCBsb2FkZXINCgl0aW55bWNlLlNjcmlwdExvYWRlciA9IG5ldyB0aW55bWNlLmRvbS5TY3JpcHRMb2FkZXIoKTsNCn0pKHRpbnltY2UpOw0KDQp0aW55bWNlLmRvbS5UcmVlV2Fsa2VyID0gZnVuY3Rpb24oc3RhcnRfbm9kZSwgcm9vdF9ub2RlKSB7DQoJdmFyIG5vZGUgPSBzdGFydF9ub2RlOw0KDQoJZnVuY3Rpb24gZmluZFNpYmxpbmcobm9kZSwgc3RhcnRfbmFtZSwgc2libGluZ19uYW1lLCBzaGFsbG93KSB7DQoJCXZhciBzaWJsaW5nLCBwYXJlbnQ7DQoNCgkJaWYgKG5vZGUpIHsNCgkJCS8vIFdhbGsgaW50byBub2RlcyBpZiBpdCBoYXMgYSBzdGFydA0KCQkJaWYgKCFzaGFsbG93ICYmIG5vZGVbc3RhcnRfbmFtZV0pDQoJCQkJcmV0dXJuIG5vZGVbc3RhcnRfbmFtZV07DQoNCgkJCS8vIFJldHVybiB0aGUgc2libGluZyBpZiBpdCBoYXMgb25lDQoJCQlpZiAobm9kZSAhPSByb290X25vZGUpIHsNCgkJCQlzaWJsaW5nID0gbm9kZVtzaWJsaW5nX25hbWVdOw0KCQkJCWlmIChzaWJsaW5nKQ0KCQkJCQlyZXR1cm4gc2libGluZzsNCg0KCQkJCS8vIFdhbGsgdXAgdGhlIHBhcmVudHMgdG8gbG9vayBmb3Igc2libGluZ3MNCgkJCQlmb3IgKHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsgcGFyZW50ICYmIHBhcmVudCAhPSByb290X25vZGU7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7DQoJCQkJCXNpYmxpbmcgPSBwYXJlbnRbc2libGluZ19uYW1lXTsNCgkJCQkJaWYgKHNpYmxpbmcpDQoJCQkJCQlyZXR1cm4gc2libGluZzsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9Ow0KDQoJdGhpcy5jdXJyZW50ID0gZnVuY3Rpb24oKSB7DQoJCXJldHVybiBub2RlOw0KCX07DQoNCgl0aGlzLm5leHQgPSBmdW5jdGlvbihzaGFsbG93KSB7DQoJCXJldHVybiAobm9kZSA9IGZpbmRTaWJsaW5nKG5vZGUsICdmaXJzdENoaWxkJywgJ25leHRTaWJsaW5nJywgc2hhbGxvdykpOw0KCX07DQoNCgl0aGlzLnByZXYgPSBmdW5jdGlvbihzaGFsbG93KSB7DQoJCXJldHVybiAobm9kZSA9IGZpbmRTaWJsaW5nKG5vZGUsICdsYXN0Q2hpbGQnLCAnbGFzdFNpYmxpbmcnLCBzaGFsbG93KSk7DQoJfTsNCn07DQoNCihmdW5jdGlvbigpIHsNCgl2YXIgdHJhbnNpdGlvbmFsID0ge307DQoNCglmdW5jdGlvbiB1bnBhY2sobG9va3VwLCBkYXRhKSB7DQoJCXZhciBrZXk7DQoNCgkJZnVuY3Rpb24gcmVwbGFjZSh2YWx1ZSkgew0KCQkJcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tBLVpdKy9nLCBmdW5jdGlvbihrZXkpIHsNCgkJCQlyZXR1cm4gcmVwbGFjZShsb29rdXBba2V5XSk7DQoJCQl9KTsNCgkJfTsNCg0KCQkvLyBVbnBhY2sgbG9va3VwDQoJCWZvciAoa2V5IGluIGxvb2t1cCkgew0KCQkJaWYgKGxvb2t1cC5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KCQkJCWxvb2t1cFtrZXldID0gcmVwbGFjZShsb29rdXBba2V5XSk7DQoJCX0NCg0KCQkvLyBVbnBhY2sgYW5kIHBhcnNlIGRhdGEgaW50byBvYmplY3QgbWFwDQoJCXJlcGxhY2UoZGF0YSkucmVwbGFjZSgvIy9nLCAnI3RleHQnKS5yZXBsYWNlKC8oXHcrKVxbKFteXF1dKylcXS9nLCBmdW5jdGlvbihzdHIsIG5hbWUsIGNoaWxkcmVuKSB7DQoJCQl2YXIgaSwgbWFwID0ge307DQoNCgkJCWNoaWxkcmVuID0gY2hpbGRyZW4uc3BsaXQoL1x8Lyk7DQoNCgkJCWZvciAoaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQ0KCQkJCW1hcFtjaGlsZHJlbltpXV0gPSAxOw0KDQoJCQl0cmFuc2l0aW9uYWxbbmFtZV0gPSBtYXA7DQoJCX0pOw0KCX07DQoNCgkvLyBUaGlzIGlzIHRoZSBYSFRNTCAxLjAgdHJhbnNpdGlvbmFsIGVsZW1lbnRzIHdpdGggaXQncyBjaGlsZHJlbiBwYWNrZWQgdG8gcmVkdWNlIGl0J3Mgc2l6ZQ0KCS8vIHdlIHdpbGwgbGF0ZXIgaW5jbHVkZSB0aGUgYXR0cmlidXRlcyBoZXJlIGFuZCB1c2UgaXQgYXMgYSBkZWZhdWx0IGZvciB2YWxpZCBlbGVtZW50cyBidXQgaXQNCgkvLyByZXF1aXJlcyB1cyB0byByZXdyaXRlIHRoZSBzZXJpYWxpemVyIGVuZ2luZQ0KCXVucGFjayh7DQoJCVogOiAnI3xIfEt8TnxPfFAnLA0KCQlZIDogJyN8WHxmb3JtfFJ8UScsDQoJCVggOiAncHxUfGRpdnxVfFd8aXNpbmRleHxmaWVsZHNldHx0YWJsZScsDQoJCVcgOiAncHJlfGhyfGJsb2NrcXVvdGV8YWRkcmVzc3xjZW50ZXJ8bm9mcmFtZXMnLA0KCQlVIDogJ3VsfG9sfGRsfG1lbnV8ZGlyJywNCgkJWkMgOiAnI3xwfFl8ZGl2fFV8V3x0YWJsZXxicnxzcGFufGJkb3xvYmplY3R8YXBwbGV0fGltZ3xtYXB8S3xOfFEnLA0KCQlUIDogJ2gxfGgyfGgzfGg0fGg1fGg2JywNCgkJWkIgOiAnI3xYfFN8UScsDQoJCVMgOiAnUnxQJywNCgkJWkEgOiAnI3xhfEd8SnxNfE98UCcsDQoJCVIgOiAnI3xhfEh8S3xOfE8nLA0KCQlRIDogJ25vc2NyaXB0fFAnLA0KCQlQIDogJ2luc3xkZWx8c2NyaXB0JywNCgkJTyA6ICdpbnB1dHxzZWxlY3R8dGV4dGFyZWF8bGFiZWx8YnV0dG9uJywNCgkJTiA6ICdNfEwnLA0KCQlNIDogJ2VtfHN0cm9uZ3xkZm58Y29kZXxxfHNhbXB8a2JkfHZhcnxjaXRlfGFiYnJ8YWNyb255bScsDQoJCUwgOiAnc3VifHN1cCcsDQoJCUsgOiAnSnxJJywNCgkJSiA6ICd0dHxpfGJ8dXxzfHN0cmlrZScsDQoJCUkgOiAnYmlnfHNtYWxsfGZvbnR8YmFzZWZvbnQnLA0KCQlIIDogJ0d8RicsDQoJCUcgOiAnYnJ8c3BhbnxiZG8nLA0KCQlGIDogJ29iamVjdHxhcHBsZXR8aW1nfG1hcHxpZnJhbWUnDQoJfSwgJ3NjcmlwdFtdJyArIA0KCQknc3R5bGVbXScgKyANCgkJJ29iamVjdFsjfHBhcmFtfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdwYXJhbVtdJyArIA0KCQkncFtTXScgKyANCgkJJ2FbWl0nICsgDQoJCSdicltdJyArIA0KCQknc3BhbltTXScgKyANCgkJJ2Jkb1tTXScgKyANCgkJJ2FwcGxldFsjfHBhcmFtfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdoMVtTXScgKyANCgkJJ2ltZ1tdJyArIA0KCQknbWFwW1h8Zm9ybXxRfGFyZWFdJyArIA0KCQknaDJbU10nICsgDQoJCSdpZnJhbWVbI3xYfGZvcm18YXxIfEt8TnxPfFFdJyArIA0KCQknaDNbU10nICsgDQoJCSd0dFtTXScgKyANCgkJJ2lbU10nICsgDQoJCSdiW1NdJyArIA0KCQkndVtTXScgKyANCgkJJ3NbU10nICsgDQoJCSdzdHJpa2VbU10nICsgDQoJCSdiaWdbU10nICsgDQoJCSdzbWFsbFtTXScgKyANCgkJJ2ZvbnRbU10nICsgDQoJCSdiYXNlZm9udFtdJyArIA0KCQknZW1bU10nICsgDQoJCSdzdHJvbmdbU10nICsgDQoJCSdkZm5bU10nICsgDQoJCSdjb2RlW1NdJyArIA0KCQkncVtTXScgKyANCgkJJ3NhbXBbU10nICsgDQoJCSdrYmRbU10nICsgDQoJCSd2YXJbU10nICsgDQoJCSdjaXRlW1NdJyArIA0KCQknYWJicltTXScgKyANCgkJJ2Fjcm9ueW1bU10nICsgDQoJCSdzdWJbU10nICsgDQoJCSdzdXBbU10nICsgDQoJCSdpbnB1dFtdJyArIA0KCQknc2VsZWN0W29wdGdyb3VwfG9wdGlvbl0nICsgDQoJCSdvcHRncm91cFtvcHRpb25dJyArIA0KCQknb3B0aW9uW10nICsgDQoJCSd0ZXh0YXJlYVtdJyArIA0KCQknbGFiZWxbU10nICsgDQoJCSdidXR0b25bI3xwfFR8ZGl2fFV8V3x0YWJsZXxHfG9iamVjdHxhcHBsZXR8aW1nfG1hcHxLfE58UV0nICsgDQoJCSdoNFtTXScgKyANCgkJJ2luc1sjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdoNVtTXScgKyANCgkJJ2RlbFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdoNltTXScgKyANCgkJJ2RpdlsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSd1bFtsaV0nICsgDQoJCSdsaVsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdvbFtsaV0nICsgDQoJCSdkbFtkdHxkZF0nICsgDQoJCSdkdFtTXScgKyANCgkJJ2RkWyN8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ21lbnVbbGldJyArIA0KCQknZGlyW2xpXScgKyANCgkJJ3ByZVtaQV0nICsgDQoJCSdocltdJyArIA0KCQknYmxvY2txdW90ZVsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdhZGRyZXNzW1N8cF0nICsgDQoJCSdjZW50ZXJbI3xYfGZvcm18YXxIfEt8TnxPfFFdJyArIA0KCQknbm9mcmFtZXNbI3xYfGZvcm18YXxIfEt8TnxPfFFdJyArIA0KCQknaXNpbmRleFtdJyArIA0KCQknZmllbGRzZXRbI3xsZWdlbmR8WHxmb3JtfGF8SHxLfE58T3xRXScgKyANCgkJJ2xlZ2VuZFtTXScgKyANCgkJJ3RhYmxlW2NhcHRpb258Y29sfGNvbGdyb3VwfHRoZWFkfHRmb290fHRib2R5fHRyXScgKyANCgkJJ2NhcHRpb25bU10nICsgDQoJCSdjb2xbXScgKyANCgkJJ2NvbGdyb3VwW2NvbF0nICsgDQoJCSd0aGVhZFt0cl0nICsgDQoJCSd0clt0aHx0ZF0nICsgDQoJCSd0aFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSdmb3JtWyN8WHxhfEh8S3xOfE98UV0nICsgDQoJCSdub3NjcmlwdFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSd0ZFsjfFh8Zm9ybXxhfEh8S3xOfE98UV0nICsgDQoJCSd0Zm9vdFt0cl0nICsgDQoJCSd0Ym9keVt0cl0nICsgDQoJCSdhcmVhW10nICsgDQoJCSdiYXNlW10nICsgDQoJCSdib2R5WyN8WHxmb3JtfGF8SHxLfE58T3xRXScNCgkpOw0KDQoJdGlueW1jZS5kb20uU2NoZW1hID0gZnVuY3Rpb24oKSB7DQoJCXZhciB0ID0gdGhpcywgZWxlbWVudHMgPSB0cmFuc2l0aW9uYWw7DQoNCgkJdC5pc1ZhbGlkID0gZnVuY3Rpb24obmFtZSwgY2hpbGRfbmFtZSkgew0KCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tuYW1lXTsNCg0KCQkJcmV0dXJuICEhKGVsZW1lbnQgJiYgKCFjaGlsZF9uYW1lIHx8IGVsZW1lbnRbY2hpbGRfbmFtZV0pKTsNCgkJfTsNCgl9Ow0KfSkoKTsNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdGlueW1jZS5kb20uUmFuZ2VVdGlscyA9IGZ1bmN0aW9uKGRvbSkgew0KCQl2YXIgSU5WSVNJQkxFX0NIQVIgPSAnXHVGRUZGJzsNCg0KCQl0aGlzLndhbGsgPSBmdW5jdGlvbihybmcsIGNhbGxiYWNrKSB7DQoJCQl2YXIgc3RhcnRDb250YWluZXIgPSBybmcuc3RhcnRDb250YWluZXIsDQoJCQkJc3RhcnRPZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQsDQoJCQkJZW5kQ29udGFpbmVyID0gcm5nLmVuZENvbnRhaW5lciwNCgkJCQllbmRPZmZzZXQgPSBybmcuZW5kT2Zmc2V0LA0KCQkJCWFuY2VzdG9yLCBzdGFydFBvaW50LA0KCQkJCWVuZFBvaW50LCBub2RlLCBwYXJlbnQsIHNpYmxpbmdzLCBub2RlczsNCg0KCQkJLy8gSGFuZGxlIHRhYmxlIGNlbGwgc2VsZWN0aW9uIHRoZSB0YWJsZSBwbHVnaW4gZW5hYmxlcw0KCQkJLy8geW91IHRvIGZha2Ugc2VsZWN0IHRhYmxlIGNlbGxzIGFuZCBwZXJmb3JtIGZvcm1hdHRpbmcgYWN0aW9ucyBvbiB0aGVtDQoJCQlub2RlcyA9IGRvbS5zZWxlY3QoJ3RkLm1jZVNlbGVjdGVkLHRoLm1jZVNlbGVjdGVkJyk7DQoJCQlpZiAobm9kZXMubGVuZ3RoID4gMCkgew0KCQkJCXRpbnltY2UuZWFjaChub2RlcywgZnVuY3Rpb24obm9kZSkgew0KCQkJCQljYWxsYmFjayhbbm9kZV0pOw0KCQkJCX0pOw0KDQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQlmdW5jdGlvbiBjb2xsZWN0U2libGluZ3Mobm9kZSwgbmFtZSwgZW5kX25vZGUpIHsNCgkJCQl2YXIgc2libGluZ3MgPSBbXTsNCg0KCQkJCWZvciAoOyBub2RlICYmIG5vZGUgIT0gZW5kX25vZGU7IG5vZGUgPSBub2RlW25hbWVdKQ0KCQkJCQlzaWJsaW5ncy5wdXNoKG5vZGUpOw0KDQoJCQkJcmV0dXJuIHNpYmxpbmdzOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gZmluZEVuZFBvaW50KG5vZGUsIHJvb3QpIHsNCgkJCQlkbyB7DQoJCQkJCWlmIChub2RlLnBhcmVudE5vZGUgPT0gcm9vdCkNCgkJCQkJCXJldHVybiBub2RlOw0KDQoJCQkJCW5vZGUgPSBub2RlLnBhcmVudE5vZGU7DQoJCQkJfSB3aGlsZShub2RlKTsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHdhbGtCb3VuZGFyeShzdGFydF9ub2RlLCBlbmRfbm9kZSwgbmV4dCkgew0KCQkJCXZhciBzaWJsaW5nTmFtZSA9IG5leHQgPyAnbmV4dFNpYmxpbmcnIDogJ3ByZXZpb3VzU2libGluZyc7DQoNCgkJCQlmb3IgKG5vZGUgPSBzdGFydF9ub2RlLCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7IG5vZGUgJiYgbm9kZSAhPSBlbmRfbm9kZTsgbm9kZSA9IHBhcmVudCkgew0KCQkJCQlwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7DQoJCQkJCXNpYmxpbmdzID0gY29sbGVjdFNpYmxpbmdzKG5vZGUgPT0gc3RhcnRfbm9kZSA/IG5vZGUgOiBub2RlW3NpYmxpbmdOYW1lXSwgc2libGluZ05hbWUpOw0KDQoJCQkJCWlmIChzaWJsaW5ncy5sZW5ndGgpIHsNCgkJCQkJCWlmICghbmV4dCkNCgkJCQkJCQlzaWJsaW5ncy5yZXZlcnNlKCk7DQoNCgkJCQkJCWNhbGxiYWNrKHNpYmxpbmdzKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX07DQoNCgkJCS8vIElmIGluZGV4IGJhc2VkIHN0YXJ0IHBvc2l0aW9uIHRoZW4gcmVzb2x2ZSBpdA0KCQkJaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDEgJiYgc3RhcnRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCXN0YXJ0Q29udGFpbmVyID0gc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tzdGFydE9mZnNldF07DQoNCgkJCS8vIElmIGluZGV4IGJhc2VkIGVuZCBwb3NpdGlvbiB0aGVuIHJlc29sdmUgaXQNCgkJCWlmIChlbmRDb250YWluZXIubm9kZVR5cGUgPT0gMSAmJiBlbmRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCWVuZENvbnRhaW5lciA9IGVuZENvbnRhaW5lci5jaGlsZE5vZGVzW01hdGgubWluKHN0YXJ0T2Zmc2V0ID09IGVuZE9mZnNldCA/IGVuZE9mZnNldCA6IGVuZE9mZnNldCAtIDEsIGVuZENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCAtIDEpXTsNCg0KCQkJLy8gRmluZCBjb21tb24gYW5jZXN0b3IgYW5kIGVuZCBwb2ludHMNCgkJCWFuY2VzdG9yID0gZG9tLmZpbmRDb21tb25BbmNlc3RvcihzdGFydENvbnRhaW5lciwgZW5kQ29udGFpbmVyKTsNCg0KCQkJLy8gU2FtZSBjb250YWluZXINCgkJCWlmIChzdGFydENvbnRhaW5lciA9PSBlbmRDb250YWluZXIpDQoJCQkJcmV0dXJuIGNhbGxiYWNrKFtzdGFydENvbnRhaW5lcl0pOw0KDQoJCQkvLyBQcm9jZXNzIGxlZnQgc2lkZQ0KCQkJZm9yIChub2RlID0gc3RhcnRDb250YWluZXI7IG5vZGU7IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpIHsNCgkJCQlpZiAobm9kZSA9PSBlbmRDb250YWluZXIpDQoJCQkJCXJldHVybiB3YWxrQm91bmRhcnkoc3RhcnRDb250YWluZXIsIGFuY2VzdG9yLCB0cnVlKTsNCg0KCQkJCWlmIChub2RlID09IGFuY2VzdG9yKQ0KCQkJCQlicmVhazsNCgkJCX0NCg0KCQkJLy8gUHJvY2VzcyByaWdodCBzaWRlDQoJCQlmb3IgKG5vZGUgPSBlbmRDb250YWluZXI7IG5vZGU7IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpIHsNCgkJCQlpZiAobm9kZSA9PSBzdGFydENvbnRhaW5lcikNCgkJCQkJcmV0dXJuIHdhbGtCb3VuZGFyeShlbmRDb250YWluZXIsIGFuY2VzdG9yKTsNCg0KCQkJCWlmIChub2RlID09IGFuY2VzdG9yKQ0KCQkJCQlicmVhazsNCgkJCX0NCg0KCQkJLy8gRmluZCBzdGFydC9lbmQgcG9pbnQNCgkJCXN0YXJ0UG9pbnQgPSBmaW5kRW5kUG9pbnQoc3RhcnRDb250YWluZXIsIGFuY2VzdG9yKSB8fCBzdGFydENvbnRhaW5lcjsNCgkJCWVuZFBvaW50ID0gZmluZEVuZFBvaW50KGVuZENvbnRhaW5lciwgYW5jZXN0b3IpIHx8IGVuZENvbnRhaW5lcjsNCg0KCQkJLy8gV2FsayBsZWZ0IGxlYWYNCgkJCXdhbGtCb3VuZGFyeShzdGFydENvbnRhaW5lciwgc3RhcnRQb2ludCwgdHJ1ZSk7DQoNCgkJCS8vIFdhbGsgdGhlIG1pZGRsZSBmcm9tIHN0YXJ0IHRvIGVuZCBwb2ludA0KCQkJc2libGluZ3MgPSBjb2xsZWN0U2libGluZ3MoDQoJCQkJc3RhcnRQb2ludCA9PSBzdGFydENvbnRhaW5lciA/IHN0YXJ0UG9pbnQgOiBzdGFydFBvaW50Lm5leHRTaWJsaW5nLA0KCQkJCSduZXh0U2libGluZycsDQoJCQkJZW5kUG9pbnQgPT0gZW5kQ29udGFpbmVyID8gZW5kUG9pbnQubmV4dFNpYmxpbmcgOiBlbmRQb2ludA0KCQkJKTsNCg0KCQkJaWYgKHNpYmxpbmdzLmxlbmd0aCkNCgkJCQljYWxsYmFjayhzaWJsaW5ncyk7DQoNCgkJCS8vIFdhbGsgcmlnaHQgbGVhZg0KCQkJd2Fsa0JvdW5kYXJ5KGVuZENvbnRhaW5lciwgZW5kUG9pbnQpOw0KCQl9Ow0KDQoJCS8qCQl0aGlzLnNwbGl0ID0gZnVuY3Rpb24ocm5nKSB7DQoJCQl2YXIgc3RhcnRDb250YWluZXIgPSBybmcuc3RhcnRDb250YWluZXIsDQoJCQkJc3RhcnRPZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQsDQoJCQkJZW5kQ29udGFpbmVyID0gcm5nLmVuZENvbnRhaW5lciwNCgkJCQllbmRPZmZzZXQgPSBybmcuZW5kT2Zmc2V0Ow0KDQoJCQlmdW5jdGlvbiBzcGxpdFRleHQobm9kZSwgb2Zmc2V0KSB7DQoJCQkJaWYgKG9mZnNldCA9PSBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpDQoJCQkJCW5vZGUuYXBwZW5kRGF0YShJTlZJU0lCTEVfQ0hBUik7DQoNCgkJCQlub2RlID0gbm9kZS5zcGxpdFRleHQob2Zmc2V0KTsNCg0KCQkJCWlmIChub2RlLm5vZGVWYWx1ZSA9PT0gSU5WSVNJQkxFX0NIQVIpDQoJCQkJCW5vZGUubm9kZVZhbHVlID0gJyc7DQoNCgkJCQlyZXR1cm4gbm9kZTsNCgkJCX07DQoNCgkJCS8vIEhhbmRsZSBzaW5nbGUgdGV4dCBub2RlDQoJCQlpZiAoc3RhcnRDb250YWluZXIgPT0gZW5kQ29udGFpbmVyKSB7DQoJCQkJaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDMpIHsNCgkJCQkJaWYgKHN0YXJ0T2Zmc2V0ICE9IDApDQoJCQkJCQlzdGFydENvbnRhaW5lciA9IGVuZENvbnRhaW5lciA9IHNwbGl0VGV4dChzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQpOw0KDQoJCQkJCWlmIChlbmRPZmZzZXQgLSBzdGFydE9mZnNldCAhPSBzdGFydENvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoKQ0KCQkJCQkJc3BsaXRUZXh0KHN0YXJ0Q29udGFpbmVyLCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkvLyBTcGxpdCBzdGFydENvbnRhaW5lciB0ZXh0IG5vZGUgaWYgbmVlZGVkDQoJCQkJaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDMgJiYgc3RhcnRPZmZzZXQgIT0gMCkgew0KCQkJCQlzdGFydENvbnRhaW5lciA9IHNwbGl0VGV4dChzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQpOw0KCQkJCQlzdGFydE9mZnNldCA9IDA7DQoJCQkJfQ0KDQoJCQkJLy8gU3BsaXQgZW5kQ29udGFpbmVyIHRleHQgbm9kZSBpZiBuZWVkZWQNCgkJCQlpZiAoZW5kQ29udGFpbmVyLm5vZGVUeXBlID09IDMgJiYgZW5kT2Zmc2V0ICE9IGVuZENvbnRhaW5lci5ub2RlVmFsdWUubGVuZ3RoKSB7DQoJCQkJCWVuZENvbnRhaW5lciA9IHNwbGl0VGV4dChlbmRDb250YWluZXIsIGVuZE9mZnNldCkucHJldmlvdXNTaWJsaW5nOw0KCQkJCQllbmRPZmZzZXQgPSBlbmRDb250YWluZXIubm9kZVZhbHVlLmxlbmd0aDsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiB7DQoJCQkJc3RhcnRDb250YWluZXIgOiBzdGFydENvbnRhaW5lciwNCgkJCQlzdGFydE9mZnNldCA6IHN0YXJ0T2Zmc2V0LA0KCQkJCWVuZENvbnRhaW5lciA6IGVuZENvbnRhaW5lciwNCgkJCQllbmRPZmZzZXQgOiBlbmRPZmZzZXQNCgkJCX07DQoJCX07DQoqLw0KCX07DQoNCgl0aW55bWNlLmRvbS5SYW5nZVV0aWxzLmNvbXBhcmVSYW5nZXMgPSBmdW5jdGlvbihybmcxLCBybmcyKSB7DQoJCWlmIChybmcxICYmIHJuZzIpIHsNCgkJCS8vIENvbXBhcmUgbmF0aXZlIElFIHJhbmdlcw0KCQkJaWYgKHJuZzEuaXRlbSB8fCBybmcxLmR1cGxpY2F0ZSkgew0KCQkJCS8vIEJvdGggYXJlIGNvbnRyb2wgcmFuZ2VzIGFuZCB0aGUgc2VsZWN0ZWQgZWxlbWVudCBtYXRjaGVzDQoJCQkJaWYgKHJuZzEuaXRlbSAmJiBybmcyLml0ZW0gJiYgcm5nMS5pdGVtKDApID09PSBybmcyLml0ZW0oMCkpDQoJCQkJCXJldHVybiB0cnVlOw0KDQoJCQkJLy8gQm90aCBhcmUgdGV4dCByYW5nZXMgYW5kIHRoZSByYW5nZSBtYXRjaGVzDQoJCQkJaWYgKHJuZzEuaXNFcXVhbCAmJiBybmcyLmlzRXF1YWwgJiYgcm5nMi5pc0VxdWFsKHJuZzEpKQ0KCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0gZWxzZSB7DQoJCQkJLy8gQ29tcGFyZSB3M2MgcmFuZ2VzDQoJCQkJcmV0dXJuIHJuZzEuc3RhcnRDb250YWluZXIgPT0gcm5nMi5zdGFydENvbnRhaW5lciAmJiBybmcxLnN0YXJ0T2Zmc2V0ID09IHJuZzIuc3RhcnRPZmZzZXQ7DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gZmFsc2U7DQoJfTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIFNob3J0ZW4gY2xhc3MgbmFtZXMNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIGlzID0gdGlueW1jZS5pczsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLkNvbnRyb2wnLCB7DQoJCUNvbnRyb2wgOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5pZCA9IGlkOw0KCQkJdGhpcy5zZXR0aW5ncyA9IHMgPSBzIHx8IHt9Ow0KCQkJdGhpcy5yZW5kZXJlZCA9IGZhbHNlOw0KCQkJdGhpcy5vblJlbmRlciA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTsNCgkJCXRoaXMuY2xhc3NQcmVmaXggPSAnJzsNCgkJCXRoaXMuc2NvcGUgPSBzLnNjb3BlIHx8IHRoaXM7DQoJCQl0aGlzLmRpc2FibGVkID0gMDsNCgkJCXRoaXMuYWN0aXZlID0gMDsNCgkJfSwNCg0KCQlzZXREaXNhYmxlZCA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciBlOw0KDQoJCQlpZiAocyAhPSB0aGlzLmRpc2FibGVkKSB7DQoJCQkJZSA9IERPTS5nZXQodGhpcy5pZCk7DQoNCgkJCQkvLyBBZGQgYWNjZXNzaWJpbGl0eSB0aXRsZSBmb3IgdW5hdmFpbGFibGUgYWN0aW9ucw0KCQkJCWlmIChlICYmIHRoaXMuc2V0dGluZ3MudW5hdmFpbGFibGVfcHJlZml4KSB7DQoJCQkJCWlmIChzKSB7DQoJCQkJCQl0aGlzLnByZXZUaXRsZSA9IGUudGl0bGU7DQoJCQkJCQllLnRpdGxlID0gdGhpcy5zZXR0aW5ncy51bmF2YWlsYWJsZV9wcmVmaXggKyAiOiAiICsgZS50aXRsZTsNCgkJCQkJfSBlbHNlDQoJCQkJCQllLnRpdGxlID0gdGhpcy5wcmV2VGl0bGU7DQoJCQkJfQ0KDQoJCQkJdGhpcy5zZXRTdGF0ZSgnRGlzYWJsZWQnLCBzKTsNCgkJCQl0aGlzLnNldFN0YXRlKCdFbmFibGVkJywgIXMpOw0KCQkJCXRoaXMuZGlzYWJsZWQgPSBzOw0KCQkJfQ0KCQl9LA0KDQoJCWlzRGlzYWJsZWQgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiB0aGlzLmRpc2FibGVkOw0KCQl9LA0KDQoJCXNldEFjdGl2ZSA6IGZ1bmN0aW9uKHMpIHsNCgkJCWlmIChzICE9IHRoaXMuYWN0aXZlKSB7DQoJCQkJdGhpcy5zZXRTdGF0ZSgnQWN0aXZlJywgcyk7DQoJCQkJdGhpcy5hY3RpdmUgPSBzOw0KCQkJfQ0KCQl9LA0KDQoJCWlzQWN0aXZlIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5hY3RpdmU7DQoJCX0sDQoNCgkJc2V0U3RhdGUgOiBmdW5jdGlvbihjLCBzKSB7DQoJCQl2YXIgbiA9IERPTS5nZXQodGhpcy5pZCk7DQoNCgkJCWMgPSB0aGlzLmNsYXNzUHJlZml4ICsgYzsNCg0KCQkJaWYgKHMpDQoJCQkJRE9NLmFkZENsYXNzKG4sIGMpOw0KCQkJZWxzZQ0KCQkJCURPTS5yZW1vdmVDbGFzcyhuLCBjKTsNCgkJfSwNCg0KCQlpc1JlbmRlcmVkIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5yZW5kZXJlZDsNCgkJfSwNCg0KCQlyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCX0sDQoNCgkJcmVuZGVyVG8gOiBmdW5jdGlvbihuKSB7DQoJCQlET00uc2V0SFRNTChuLCB0aGlzLnJlbmRlckhUTUwoKSk7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBiOw0KDQoJCQkvLyBTZXQgcGVuZGluZyBzdGF0ZXMNCgkJCWlmIChpcyh0LmRpc2FibGVkKSkgew0KCQkJCWIgPSB0LmRpc2FibGVkOw0KCQkJCXQuZGlzYWJsZWQgPSAtMTsNCgkJCQl0LnNldERpc2FibGVkKGIpOw0KCQkJfQ0KDQoJCQlpZiAoaXModC5hY3RpdmUpKSB7DQoJCQkJYiA9IHQuYWN0aXZlOw0KCQkJCXQuYWN0aXZlID0gLTE7DQoJCQkJdC5zZXRBY3RpdmUoYik7DQoJCQl9DQoJCX0sDQoNCgkJcmVtb3ZlIDogZnVuY3Rpb24oKSB7DQoJCQlET00ucmVtb3ZlKHRoaXMuaWQpOw0KCQkJdGhpcy5kZXN0cm95KCk7DQoJCX0sDQoNCgkJZGVzdHJveSA6IGZ1bmN0aW9uKCkgew0KCQkJdGlueW1jZS5kb20uRXZlbnQuY2xlYXIodGhpcy5pZCk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuQ29udGFpbmVyOnRpbnltY2UudWkuQ29udHJvbCcsIHsNCglDb250YWluZXIgOiBmdW5jdGlvbihpZCwgcykgew0KCQl0aGlzLnBhcmVudChpZCwgcyk7DQoNCgkJdGhpcy5jb250cm9scyA9IFtdOw0KDQoJCXRoaXMubG9va3VwID0ge307DQoJfSwNCg0KCWFkZCA6IGZ1bmN0aW9uKGMpIHsNCgkJdGhpcy5sb29rdXBbYy5pZF0gPSBjOw0KCQl0aGlzLmNvbnRyb2xzLnB1c2goYyk7DQoNCgkJcmV0dXJuIGM7DQoJfSwNCg0KCWdldCA6IGZ1bmN0aW9uKG4pIHsNCgkJcmV0dXJuIHRoaXMubG9va3VwW25dOw0KCX0NCn0pOw0KDQoNCnRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLlNlcGFyYXRvcjp0aW55bWNlLnVpLkNvbnRyb2wnLCB7DQoJU2VwYXJhdG9yIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQl0aGlzLmNsYXNzUHJlZml4ID0gJ21jZVNlcGFyYXRvcic7DQoJfSwNCg0KCXJlbmRlckhUTUwgOiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIHRpbnltY2UuRE9NLmNyZWF0ZUhUTUwoJ3NwYW4nLCB7J2NsYXNzJyA6IHRoaXMuY2xhc3NQcmVmaXh9KTsNCgl9DQp9KTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgaXMgPSB0aW55bWNlLmlzLCBET00gPSB0aW55bWNlLkRPTSwgZWFjaCA9IHRpbnltY2UuZWFjaCwgd2FsayA9IHRpbnltY2Uud2FsazsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLk1lbnVJdGVtOnRpbnltY2UudWkuQ29udHJvbCcsIHsNCgkJTWVudUl0ZW0gOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQkJdGhpcy5jbGFzc1ByZWZpeCA9ICdtY2VNZW51SXRlbSc7DQoJCX0sDQoNCgkJc2V0U2VsZWN0ZWQgOiBmdW5jdGlvbihzKSB7DQoJCQl0aGlzLnNldFN0YXRlKCdTZWxlY3RlZCcsIHMpOw0KCQkJdGhpcy5zZWxlY3RlZCA9IHM7DQoJCX0sDQoNCgkJaXNTZWxlY3RlZCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KCQkJDQoJCQl0LnBhcmVudCgpOw0KDQoJCQkvLyBTZXQgcGVuZGluZyBzdGF0ZQ0KCQkJaWYgKGlzKHQuc2VsZWN0ZWQpKQ0KCQkJCXQuc2V0U2VsZWN0ZWQodC5zZWxlY3RlZCk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBpcyA9IHRpbnltY2UuaXMsIERPTSA9IHRpbnltY2UuRE9NLCBlYWNoID0gdGlueW1jZS5lYWNoLCB3YWxrID0gdGlueW1jZS53YWxrOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuTWVudTp0aW55bWNlLnVpLk1lbnVJdGVtJywgew0KCQlNZW51IDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5wYXJlbnQoaWQsIHMpOw0KCQkJdC5pdGVtcyA9IHt9Ow0KCQkJdC5jb2xsYXBzZWQgPSBmYWxzZTsNCgkJCXQubWVudUNvdW50ID0gMDsNCgkJCXQub25BZGRJdGVtID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHRoaXMpOw0KCQl9LA0KDQoJCWV4cGFuZCA6IGZ1bmN0aW9uKGQpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKGQpIHsNCgkJCQl3YWxrKHQsIGZ1bmN0aW9uKG8pIHsNCgkJCQkJaWYgKG8uZXhwYW5kKQ0KCQkJCQkJby5leHBhbmQoKTsNCgkJCQl9LCAnaXRlbXMnLCB0KTsNCgkJCX0NCg0KCQkJdC5jb2xsYXBzZWQgPSBmYWxzZTsNCgkJfSwNCg0KCQljb2xsYXBzZSA6IGZ1bmN0aW9uKGQpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKGQpIHsNCgkJCQl3YWxrKHQsIGZ1bmN0aW9uKG8pIHsNCgkJCQkJaWYgKG8uY29sbGFwc2UpDQoJCQkJCQlvLmNvbGxhcHNlKCk7DQoJCQkJfSwgJ2l0ZW1zJywgdCk7DQoJCQl9DQoNCgkJCXQuY29sbGFwc2VkID0gdHJ1ZTsNCgkJfSwNCg0KCQlpc0NvbGxhcHNlZCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuY29sbGFwc2VkOw0KCQl9LA0KDQoJCWFkZCA6IGZ1bmN0aW9uKG8pIHsNCgkJCWlmICghby5zZXR0aW5ncykNCgkJCQlvID0gbmV3IHRpbnltY2UudWkuTWVudUl0ZW0oby5pZCB8fCBET00udW5pcXVlSWQoKSwgbyk7DQoNCgkJCXRoaXMub25BZGRJdGVtLmRpc3BhdGNoKHRoaXMsIG8pOw0KDQoJCQlyZXR1cm4gdGhpcy5pdGVtc1tvLmlkXSA9IG87DQoJCX0sDQoNCgkJYWRkU2VwYXJhdG9yIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5hZGQoe3NlcGFyYXRvciA6IHRydWV9KTsNCgkJfSwNCg0KCQlhZGRNZW51IDogZnVuY3Rpb24obykgew0KCQkJaWYgKCFvLmNvbGxhcHNlKQ0KCQkJCW8gPSB0aGlzLmNyZWF0ZU1lbnUobyk7DQoNCgkJCXRoaXMubWVudUNvdW50Kys7DQoNCgkJCXJldHVybiB0aGlzLmFkZChvKTsNCgkJfSwNCg0KCQloYXNNZW51cyA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMubWVudUNvdW50ICE9PSAwOw0KCQl9LA0KDQoJCXJlbW92ZSA6IGZ1bmN0aW9uKG8pIHsNCgkJCWRlbGV0ZSB0aGlzLml0ZW1zW28uaWRdOw0KCQl9LA0KDQoJCXJlbW92ZUFsbCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl3YWxrKHQsIGZ1bmN0aW9uKG8pIHsNCgkJCQlpZiAoby5yZW1vdmVBbGwpDQoJCQkJCW8ucmVtb3ZlQWxsKCk7DQoJCQkJZWxzZQ0KCQkJCQlvLnJlbW92ZSgpOw0KDQoJCQkJby5kZXN0cm95KCk7DQoJCQl9LCAnaXRlbXMnLCB0KTsNCg0KCQkJdC5pdGVtcyA9IHt9Ow0KCQl9LA0KDQoJCWNyZWF0ZU1lbnUgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgbSA9IG5ldyB0aW55bWNlLnVpLk1lbnUoby5pZCB8fCBET00udW5pcXVlSWQoKSwgbyk7DQoNCgkJCW0ub25BZGRJdGVtLmFkZCh0aGlzLm9uQWRkSXRlbS5kaXNwYXRjaCwgdGhpcy5vbkFkZEl0ZW0pOw0KDQoJCQlyZXR1cm4gbTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBpcyA9IHRpbnltY2UuaXMsIERPTSA9IHRpbnltY2UuRE9NLCBlYWNoID0gdGlueW1jZS5lYWNoLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBFbGVtZW50ID0gdGlueW1jZS5kb20uRWxlbWVudDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLkRyb3BNZW51OnRpbnltY2UudWkuTWVudScsIHsNCgkJRHJvcE1lbnUgOiBmdW5jdGlvbihpZCwgcykgew0KCQkJcyA9IHMgfHwge307DQoJCQlzLmNvbnRhaW5lciA9IHMuY29udGFpbmVyIHx8IERPTS5kb2MuYm9keTsNCgkJCXMub2Zmc2V0X3ggPSBzLm9mZnNldF94IHx8IDA7DQoJCQlzLm9mZnNldF95ID0gcy5vZmZzZXRfeSB8fCAwOw0KCQkJcy52cF9vZmZzZXRfeCA9IHMudnBfb2Zmc2V0X3ggfHwgMDsNCgkJCXMudnBfb2Zmc2V0X3kgPSBzLnZwX29mZnNldF95IHx8IDA7DQoNCgkJCWlmIChpcyhzLmljb25zKSAmJiAhcy5pY29ucykNCgkJCQlzWydjbGFzcyddICs9ICcgbWNlTm9JY29ucyc7DQoNCgkJCXRoaXMucGFyZW50KGlkLCBzKTsNCgkJCXRoaXMub25TaG93TWVudSA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTsNCgkJCXRoaXMub25IaWRlTWVudSA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTsNCgkJCXRoaXMuY2xhc3NQcmVmaXggPSAnbWNlTWVudSc7DQoJCX0sDQoNCgkJY3JlYXRlTWVudSA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgY3MgPSB0LnNldHRpbmdzLCBtOw0KDQoJCQlzLmNvbnRhaW5lciA9IHMuY29udGFpbmVyIHx8IGNzLmNvbnRhaW5lcjsNCgkJCXMucGFyZW50ID0gdDsNCgkJCXMuY29uc3RyYWluID0gcy5jb25zdHJhaW4gfHwgY3MuY29uc3RyYWluOw0KCQkJc1snY2xhc3MnXSA9IHNbJ2NsYXNzJ10gfHwgY3NbJ2NsYXNzJ107DQoJCQlzLnZwX29mZnNldF94ID0gcy52cF9vZmZzZXRfeCB8fCBjcy52cF9vZmZzZXRfeDsNCgkJCXMudnBfb2Zmc2V0X3kgPSBzLnZwX29mZnNldF95IHx8IGNzLnZwX29mZnNldF95Ow0KCQkJbSA9IG5ldyB0aW55bWNlLnVpLkRyb3BNZW51KHMuaWQgfHwgRE9NLnVuaXF1ZUlkKCksIHMpOw0KDQoJCQltLm9uQWRkSXRlbS5hZGQodC5vbkFkZEl0ZW0uZGlzcGF0Y2gsIHQub25BZGRJdGVtKTsNCg0KCQkJcmV0dXJuIG07DQoJCX0sDQoNCgkJdXBkYXRlIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCB0YiA9IERPTS5nZXQoJ21lbnVfJyArIHQuaWQgKyAnX3RibCcpLCBjbyA9IERPTS5nZXQoJ21lbnVfJyArIHQuaWQgKyAnX2NvJyksIHR3LCB0aDsNCg0KCQkJdHcgPSBzLm1heF93aWR0aCA/IE1hdGgubWluKHRiLmNsaWVudFdpZHRoLCBzLm1heF93aWR0aCkgOiB0Yi5jbGllbnRXaWR0aDsNCgkJCXRoID0gcy5tYXhfaGVpZ2h0ID8gTWF0aC5taW4odGIuY2xpZW50SGVpZ2h0LCBzLm1heF9oZWlnaHQpIDogdGIuY2xpZW50SGVpZ2h0Ow0KDQoJCQlpZiAoIURPTS5ib3hNb2RlbCkNCgkJCQl0LmVsZW1lbnQuc2V0U3R5bGVzKHt3aWR0aCA6IHR3ICsgMiwgaGVpZ2h0IDogdGggKyAyfSk7DQoJCQllbHNlDQoJCQkJdC5lbGVtZW50LnNldFN0eWxlcyh7d2lkdGggOiB0dywgaGVpZ2h0IDogdGh9KTsNCg0KCQkJaWYgKHMubWF4X3dpZHRoKQ0KCQkJCURPTS5zZXRTdHlsZShjbywgJ3dpZHRoJywgdHcpOw0KDQoJCQlpZiAocy5tYXhfaGVpZ2h0KSB7DQoJCQkJRE9NLnNldFN0eWxlKGNvLCAnaGVpZ2h0JywgdGgpOw0KDQoJCQkJaWYgKHRiLmNsaWVudEhlaWdodCA8IHMubWF4X2hlaWdodCkNCgkJCQkJRE9NLnNldFN0eWxlKGNvLCAnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7DQoJCQl9DQoJCX0sDQoNCgkJc2hvd01lbnUgOiBmdW5jdGlvbih4LCB5LCBweCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgY28sIHZwID0gRE9NLmdldFZpZXdQb3J0KCksIHcsIGgsIG14LCBteSwgb3QgPSAyLCBkbSwgdGIsIGNwID0gdC5jbGFzc1ByZWZpeDsNCg0KCQkJdC5jb2xsYXBzZSgxKTsNCg0KCQkJaWYgKHQuaXNNZW51VmlzaWJsZSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICghdC5yZW5kZXJlZCkgew0KCQkJCWNvID0gRE9NLmFkZCh0LnNldHRpbmdzLmNvbnRhaW5lciwgdC5yZW5kZXJOb2RlKCkpOw0KDQoJCQkJZWFjaCh0Lml0ZW1zLCBmdW5jdGlvbihvKSB7DQoJCQkJCW8ucG9zdFJlbmRlcigpOw0KCQkJCX0pOw0KDQoJCQkJdC5lbGVtZW50ID0gbmV3IEVsZW1lbnQoJ21lbnVfJyArIHQuaWQsIHtibG9ja2VyIDogMSwgY29udGFpbmVyIDogcy5jb250YWluZXJ9KTsNCgkJCX0gZWxzZQ0KCQkJCWNvID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCk7DQoNCgkJCS8vIE1vdmUgbGF5ZXIgb3V0IG9mIHNpZ2h0IHVubGVzcyBpdCdzIE9wZXJhIHNpbmNlIGl0IHNjcm9sbHMgdG8gdG9wIG9mIHBhZ2UgZHVlIHRvIGFuIGJ1Zw0KCQkJaWYgKCF0aW55bWNlLmlzT3BlcmEpDQoJCQkJRE9NLnNldFN0eWxlcyhjbywge2xlZnQgOiAtMHhGRkZGICwgdG9wIDogLTB4RkZGRn0pOw0KDQoJCQlET00uc2hvdyhjbyk7DQoJCQl0LnVwZGF0ZSgpOw0KDQoJCQl4ICs9IHMub2Zmc2V0X3ggfHwgMDsNCgkJCXkgKz0gcy5vZmZzZXRfeSB8fCAwOw0KCQkJdnAudyAtPSA0Ow0KCQkJdnAuaCAtPSA0Ow0KDQoJCQkvLyBNb3ZlIGluc2lkZSB2aWV3cG9ydCBpZiBub3Qgc3VibWVudQ0KCQkJaWYgKHMuY29uc3RyYWluKSB7DQoJCQkJdyA9IGNvLmNsaWVudFdpZHRoIC0gb3Q7DQoJCQkJaCA9IGNvLmNsaWVudEhlaWdodCAtIG90Ow0KCQkJCW14ID0gdnAueCArIHZwLnc7DQoJCQkJbXkgPSB2cC55ICsgdnAuaDsNCg0KCQkJCWlmICgoeCArIHMudnBfb2Zmc2V0X3ggKyB3KSA+IG14KQ0KCQkJCQl4ID0gcHggPyBweCAtIHcgOiBNYXRoLm1heCgwLCAobXggLSBzLnZwX29mZnNldF94KSAtIHcpOw0KDQoJCQkJaWYgKCh5ICsgcy52cF9vZmZzZXRfeSArIGgpID4gbXkpDQoJCQkJCXkgPSBNYXRoLm1heCgwLCAobXkgLSBzLnZwX29mZnNldF95KSAtIGgpOw0KCQkJfQ0KDQoJCQlET00uc2V0U3R5bGVzKGNvLCB7bGVmdCA6IHggLCB0b3AgOiB5fSk7DQoJCQl0LmVsZW1lbnQudXBkYXRlKCk7DQoNCgkJCXQuaXNNZW51VmlzaWJsZSA9IDE7DQoJCQl0Lm1vdXNlQ2xpY2tGdW5jID0gRXZlbnQuYWRkKGNvLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIG07DQoNCgkJCQllID0gZS50YXJnZXQ7DQoNCgkJCQlpZiAoZSAmJiAoZSA9IERPTS5nZXRQYXJlbnQoZSwgJ3RyJykpICYmICFET00uaGFzQ2xhc3MoZSwgY3AgKyAnSXRlbVN1YicpKSB7DQoJCQkJCW0gPSB0Lml0ZW1zW2UuaWRdOw0KDQoJCQkJCWlmIChtLmlzRGlzYWJsZWQoKSkNCgkJCQkJCXJldHVybjsNCg0KCQkJCQlkbSA9IHQ7DQoNCgkJCQkJd2hpbGUgKGRtKSB7DQoJCQkJCQlpZiAoZG0uaGlkZU1lbnUpDQoJCQkJCQkJZG0uaGlkZU1lbnUoKTsNCg0KCQkJCQkJZG0gPSBkbS5zZXR0aW5ncy5wYXJlbnQ7DQoJCQkJCX0NCg0KCQkJCQlpZiAobS5zZXR0aW5ncy5vbmNsaWNrKQ0KCQkJCQkJbS5zZXR0aW5ncy5vbmNsaWNrKGUpOw0KDQoJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7IC8vIENhbmNlbCB0byBmaXggb25iZWZvcmV1bmxvYWQgcHJvYmxlbQ0KCQkJCX0NCgkJCX0pOw0KDQoJCQlpZiAodC5oYXNNZW51cygpKSB7DQoJCQkJdC5tb3VzZU92ZXJGdW5jID0gRXZlbnQuYWRkKGNvLCAnbW91c2VvdmVyJywgZnVuY3Rpb24oZSkgew0KCQkJCQl2YXIgbSwgciwgbWk7DQoNCgkJCQkJZSA9IGUudGFyZ2V0Ow0KCQkJCQlpZiAoZSAmJiAoZSA9IERPTS5nZXRQYXJlbnQoZSwgJ3RyJykpKSB7DQoJCQkJCQltID0gdC5pdGVtc1tlLmlkXTsNCg0KCQkJCQkJaWYgKHQubGFzdE1lbnUpDQoJCQkJCQkJdC5sYXN0TWVudS5jb2xsYXBzZSgxKTsNCg0KCQkJCQkJaWYgKG0uaXNEaXNhYmxlZCgpKQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJaWYgKGUgJiYgRE9NLmhhc0NsYXNzKGUsIGNwICsgJ0l0ZW1TdWInKSkgew0KCQkJCQkJCS8vcCA9IERPTS5nZXRQb3Mocy5jb250YWluZXIpOw0KCQkJCQkJCXIgPSBET00uZ2V0UmVjdChlKTsNCgkJCQkJCQltLnNob3dNZW51KChyLnggKyByLncgLSBvdCksIHIueSAtIG90LCByLngpOw0KCQkJCQkJCXQubGFzdE1lbnUgPSBtOw0KCQkJCQkJCURPTS5hZGRDbGFzcyhET00uZ2V0KG0uaWQpLmZpcnN0Q2hpbGQsIGNwICsgJ0l0ZW1BY3RpdmUnKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQl0Lm9uU2hvd01lbnUuZGlzcGF0Y2godCk7DQoNCgkJCWlmIChzLmtleWJvYXJkX2ZvY3VzKSB7DQoJCQkJRXZlbnQuYWRkKGNvLCAna2V5ZG93bicsIHQuX2tleUhhbmRsZXIsIHQpOw0KCQkJCURPTS5zZWxlY3QoJ2EnLCAnbWVudV8nICsgdC5pZClbMF0uZm9jdXMoKTsgLy8gU2VsZWN0IGZpcnN0IGxpbmsNCgkJCQl0Ll9mb2N1c0lkeCA9IDA7DQoJCQl9DQoJCX0sDQoNCgkJaGlkZU1lbnUgOiBmdW5jdGlvbihjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNvID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCksIGU7DQoNCgkJCWlmICghdC5pc01lbnVWaXNpYmxlKQ0KCQkJCXJldHVybjsNCg0KCQkJRXZlbnQucmVtb3ZlKGNvLCAnbW91c2VvdmVyJywgdC5tb3VzZU92ZXJGdW5jKTsNCgkJCUV2ZW50LnJlbW92ZShjbywgJ2NsaWNrJywgdC5tb3VzZUNsaWNrRnVuYyk7DQoJCQlFdmVudC5yZW1vdmUoY28sICdrZXlkb3duJywgdC5fa2V5SGFuZGxlcik7DQoJCQlET00uaGlkZShjbyk7DQoJCQl0LmlzTWVudVZpc2libGUgPSAwOw0KDQoJCQlpZiAoIWMpDQoJCQkJdC5jb2xsYXBzZSgxKTsNCg0KCQkJaWYgKHQuZWxlbWVudCkNCgkJCQl0LmVsZW1lbnQuaGlkZSgpOw0KDQoJCQlpZiAoZSA9IERPTS5nZXQodC5pZCkpDQoJCQkJRE9NLnJlbW92ZUNsYXNzKGUuZmlyc3RDaGlsZCwgdC5jbGFzc1ByZWZpeCArICdJdGVtQWN0aXZlJyk7DQoNCgkJCXQub25IaWRlTWVudS5kaXNwYXRjaCh0KTsNCgkJfSwNCg0KCQlhZGQgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGNvOw0KDQoJCQlvID0gdC5wYXJlbnQobyk7DQoNCgkJCWlmICh0LmlzUmVuZGVyZWQgJiYgKGNvID0gRE9NLmdldCgnbWVudV8nICsgdC5pZCkpKQ0KCQkJCXQuX2FkZChET00uc2VsZWN0KCd0Ym9keScsIGNvKVswXSwgbyk7DQoNCgkJCXJldHVybiBvOw0KCQl9LA0KDQoJCWNvbGxhcHNlIDogZnVuY3Rpb24oZCkgew0KCQkJdGhpcy5wYXJlbnQoZCk7DQoJCQl0aGlzLmhpZGVNZW51KDEpOw0KCQl9LA0KDQoJCXJlbW92ZSA6IGZ1bmN0aW9uKG8pIHsNCgkJCURPTS5yZW1vdmUoby5pZCk7DQoJCQl0aGlzLmRlc3Ryb3koKTsNCg0KCQkJcmV0dXJuIHRoaXMucGFyZW50KG8pOw0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgY28gPSBET00uZ2V0KCdtZW51XycgKyB0LmlkKTsNCg0KCQkJRXZlbnQucmVtb3ZlKGNvLCAnbW91c2VvdmVyJywgdC5tb3VzZU92ZXJGdW5jKTsNCgkJCUV2ZW50LnJlbW92ZShjbywgJ2NsaWNrJywgdC5tb3VzZUNsaWNrRnVuYyk7DQoNCgkJCWlmICh0LmVsZW1lbnQpDQoJCQkJdC5lbGVtZW50LnJlbW92ZSgpOw0KDQoJCQlET00ucmVtb3ZlKGNvKTsNCgkJfSwNCg0KCQlyZW5kZXJOb2RlIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBuLCB0YiwgY28sIHc7DQoNCgkJCXcgPSBET00uY3JlYXRlKCdkaXYnLCB7aWQgOiAnbWVudV8nICsgdC5pZCwgJ2NsYXNzJyA6IHNbJ2NsYXNzJ10sICdzdHlsZScgOiAncG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO3otaW5kZXg6MjAwMDAwJ30pOw0KCQkJY28gPSBET00uYWRkKHcsICdkaXYnLCB7aWQgOiAnbWVudV8nICsgdC5pZCArICdfY28nLCAnY2xhc3MnIDogdC5jbGFzc1ByZWZpeCArIChzWydjbGFzcyddID8gJyAnICsgc1snY2xhc3MnXSA6ICcnKX0pOw0KCQkJdC5lbGVtZW50ID0gbmV3IEVsZW1lbnQoJ21lbnVfJyArIHQuaWQsIHtibG9ja2VyIDogMSwgY29udGFpbmVyIDogcy5jb250YWluZXJ9KTsNCg0KCQkJaWYgKHMubWVudV9saW5lKQ0KCQkJCURPTS5hZGQoY28sICdzcGFuJywgeydjbGFzcycgOiB0LmNsYXNzUHJlZml4ICsgJ0xpbmUnfSk7DQoNCi8vCQkJbiA9IERPTS5hZGQoY28sICdkaXYnLCB7aWQgOiAnbWVudV8nICsgdC5pZCArICdfY28nLCAnY2xhc3MnIDogJ21jZU1lbnVDb250YWluZXInfSk7DQoJCQluID0gRE9NLmFkZChjbywgJ3RhYmxlJywge2lkIDogJ21lbnVfJyArIHQuaWQgKyAnX3RibCcsIGJvcmRlciA6IDAsIGNlbGxQYWRkaW5nIDogMCwgY2VsbFNwYWNpbmcgOiAwfSk7DQoJCQl0YiA9IERPTS5hZGQobiwgJ3Rib2R5Jyk7DQoNCgkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24obykgew0KCQkJCXQuX2FkZCh0Yiwgbyk7DQoJCQl9KTsNCg0KCQkJdC5yZW5kZXJlZCA9IHRydWU7DQoNCgkJCXJldHVybiB3Ow0KCQl9LA0KDQoJCS8vIEludGVybmFsIGZ1bmN0aW9ucw0KDQoJCV9rZXlIYW5kbGVyIDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHQgPSB0aGlzLCBrYyA9IGUua2V5Q29kZTsNCg0KCQkJZnVuY3Rpb24gZm9jdXMoZCkgew0KCQkJCXZhciBpID0gdC5fZm9jdXNJZHggKyBkLCBlID0gRE9NLnNlbGVjdCgnYScsICdtZW51XycgKyB0LmlkKVtpXTsNCg0KCQkJCWlmIChlKSB7DQoJCQkJCXQuX2ZvY3VzSWR4ID0gaTsNCgkJCQkJZS5mb2N1cygpOw0KCQkJCX0NCgkJCX07DQoNCgkJCXN3aXRjaCAoa2MpIHsNCgkJCQljYXNlIDM4Og0KCQkJCQlmb2N1cygtMSk7IC8vIFNlbGVjdCBmaXJzdCBsaW5rDQoJCQkJCXJldHVybjsNCg0KCQkJCWNhc2UgNDA6DQoJCQkJCWZvY3VzKDEpOw0KCQkJCQlyZXR1cm47DQoNCgkJCQljYXNlIDEzOg0KCQkJCQlyZXR1cm47DQoNCgkJCQljYXNlIDI3Og0KCQkJCQlyZXR1cm4gdGhpcy5oaWRlTWVudSgpOw0KCQkJfQ0KCQl9LA0KDQoJCV9hZGQgOiBmdW5jdGlvbih0Yiwgbykgew0KCQkJdmFyIG4sIHMgPSBvLnNldHRpbmdzLCBhLCBybywgaXQsIGNwID0gdGhpcy5jbGFzc1ByZWZpeCwgaWM7DQoNCgkJCWlmIChzLnNlcGFyYXRvcikgew0KCQkJCXJvID0gRE9NLmFkZCh0YiwgJ3RyJywge2lkIDogby5pZCwgJ2NsYXNzJyA6IGNwICsgJ0l0ZW1TZXBhcmF0b3InfSk7DQoJCQkJRE9NLmFkZChybywgJ3RkJywgeydjbGFzcycgOiBjcCArICdJdGVtU2VwYXJhdG9yJ30pOw0KDQoJCQkJaWYgKG4gPSByby5wcmV2aW91c1NpYmxpbmcpDQoJCQkJCURPTS5hZGRDbGFzcyhuLCAnbWNlTGFzdCcpOw0KDQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQluID0gcm8gPSBET00uYWRkKHRiLCAndHInLCB7aWQgOiBvLmlkLCAnY2xhc3MnIDogY3AgKyAnSXRlbSAnICsgY3AgKyAnSXRlbUVuYWJsZWQnfSk7DQoJCQluID0gaXQgPSBET00uYWRkKG4sICd0ZCcpOw0KCQkJbiA9IGEgPSBET00uYWRkKG4sICdhJywge2hyZWYgOiAnamF2YXNjcmlwdDo7Jywgb25jbGljayA6ICJyZXR1cm4gZmFsc2U7Iiwgb25tb3VzZWRvd24gOiAncmV0dXJuIGZhbHNlOyd9KTsNCg0KCQkJRE9NLmFkZENsYXNzKGl0LCBzWydjbGFzcyddKTsNCi8vCQkJbiA9IERPTS5hZGQobiwgJ3NwYW4nLCB7J2NsYXNzJyA6ICdpdGVtJ30pOw0KDQoJCQlpYyA9IERPTS5hZGQobiwgJ3NwYW4nLCB7J2NsYXNzJyA6ICdtY2VJY29uJyArIChzLmljb24gPyAnIG1jZV8nICsgcy5pY29uIDogJycpfSk7DQoNCgkJCWlmIChzLmljb25fc3JjKQ0KCQkJCURPTS5hZGQoaWMsICdpbWcnLCB7c3JjIDogcy5pY29uX3NyY30pOw0KDQoJCQluID0gRE9NLmFkZChuLCBzLmVsZW1lbnQgfHwgJ3NwYW4nLCB7J2NsYXNzJyA6ICdtY2VUZXh0JywgdGl0bGUgOiBvLnNldHRpbmdzLnRpdGxlfSwgby5zZXR0aW5ncy50aXRsZSk7DQoNCgkJCWlmIChvLnNldHRpbmdzLnN0eWxlKQ0KCQkJCURPTS5zZXRBdHRyaWIobiwgJ3N0eWxlJywgby5zZXR0aW5ncy5zdHlsZSk7DQoNCgkJCWlmICh0Yi5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxKQ0KCQkJCURPTS5hZGRDbGFzcyhybywgJ21jZUZpcnN0Jyk7DQoNCgkJCWlmICgobiA9IHJvLnByZXZpb3VzU2libGluZykgJiYgRE9NLmhhc0NsYXNzKG4sIGNwICsgJ0l0ZW1TZXBhcmF0b3InKSkNCgkJCQlET00uYWRkQ2xhc3Mocm8sICdtY2VGaXJzdCcpOw0KDQoJCQlpZiAoby5jb2xsYXBzZSkNCgkJCQlET00uYWRkQ2xhc3Mocm8sIGNwICsgJ0l0ZW1TdWInKTsNCg0KCQkJaWYgKG4gPSByby5wcmV2aW91c1NpYmxpbmcpDQoJCQkJRE9NLnJlbW92ZUNsYXNzKG4sICdtY2VMYXN0Jyk7DQoNCgkJCURPTS5hZGRDbGFzcyhybywgJ21jZUxhc3QnKTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBET00gPSB0aW55bWNlLkRPTTsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLkJ1dHRvbjp0aW55bWNlLnVpLkNvbnRyb2wnLCB7DQoJCUJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl0aGlzLnBhcmVudChpZCwgcyk7DQoJCQl0aGlzLmNsYXNzUHJlZml4ID0gJ21jZUJ1dHRvbic7DQoJCX0sDQoNCgkJcmVuZGVySFRNTCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGNwID0gdGhpcy5jbGFzc1ByZWZpeCwgcyA9IHRoaXMuc2V0dGluZ3MsIGgsIGw7DQoNCgkJCWwgPSBET00uZW5jb2RlKHMubGFiZWwgfHwgJycpOw0KCQkJaCA9ICc8YSBpZD0iJyArIHRoaXMuaWQgKyAnIiBocmVmPSJqYXZhc2NyaXB0OjsiIGNsYXNzPSInICsgY3AgKyAnICcgKyBjcCArICdFbmFibGVkICcgKyBzWydjbGFzcyddICsgKGwgPyAnICcgKyBjcCArICdMYWJlbGVkJyA6ICcnKSArJyIgb25tb3VzZWRvd249InJldHVybiBmYWxzZTsiIG9uY2xpY2s9InJldHVybiBmYWxzZTsiIHRpdGxlPSInICsgRE9NLmVuY29kZShzLnRpdGxlKSArICciPic7DQoNCgkJCWlmIChzLmltYWdlKQ0KCQkJCWggKz0gJzxpbWcgY2xhc3M9Im1jZUljb24iIHNyYz0iJyArIHMuaW1hZ2UgKyAnIiAvPicgKyBsICsgJzwvYT4nOw0KCQkJZWxzZQ0KCQkJCWggKz0gJzxzcGFuIGNsYXNzPSJtY2VJY29uICcgKyBzWydjbGFzcyddICsgJyI+PC9zcGFuPicgKyAobCA/ICc8c3BhbiBjbGFzcz0iJyArIGNwICsgJ0xhYmVsIj4nICsgbCArICc8L3NwYW4+JyA6ICcnKSArICc8L2E+JzsNCg0KCQkJcmV0dXJuIGg7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJdGlueW1jZS5kb20uRXZlbnQuYWRkKHQuaWQsICdjbGljaycsIGZ1bmN0aW9uKGUpIHsNCgkJCQlpZiAoIXQuaXNEaXNhYmxlZCgpKQ0KCQkJCQlyZXR1cm4gcy5vbmNsaWNrLmNhbGwocy5zY29wZSwgZSk7DQoJCQl9KTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIERPTSA9IHRpbnltY2UuRE9NLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBlYWNoID0gdGlueW1jZS5lYWNoLCBEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXI7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5MaXN0Qm94OnRpbnltY2UudWkuQ29udHJvbCcsIHsNCgkJTGlzdEJveCA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQucGFyZW50KGlkLCBzKTsNCg0KCQkJdC5pdGVtcyA9IFtdOw0KDQoJCQl0Lm9uQ2hhbmdlID0gbmV3IERpc3BhdGNoZXIodCk7DQoNCgkJCXQub25Qb3N0UmVuZGVyID0gbmV3IERpc3BhdGNoZXIodCk7DQoNCgkJCXQub25BZGQgPSBuZXcgRGlzcGF0Y2hlcih0KTsNCg0KCQkJdC5vblJlbmRlck1lbnUgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodGhpcyk7DQoNCgkJCXQuY2xhc3NQcmVmaXggPSAnbWNlTGlzdEJveCc7DQoJCX0sDQoNCgkJc2VsZWN0IDogZnVuY3Rpb24odmEpIHsNCgkJCXZhciB0ID0gdGhpcywgZnYsIGY7DQoNCgkJCWlmICh2YSA9PSB1bmRlZmluZWQpDQoJCQkJcmV0dXJuIHQuc2VsZWN0QnlJbmRleCgtMSk7DQoNCgkJCS8vIElzIHN0cmluZyBvciBudW1iZXIgbWFrZSBmdW5jdGlvbiBzZWxlY3Rvcg0KCQkJaWYgKHZhICYmIHZhLmNhbGwpDQoJCQkJZiA9IHZhOw0KCQkJZWxzZSB7DQoJCQkJZiA9IGZ1bmN0aW9uKHYpIHsNCgkJCQkJcmV0dXJuIHYgPT0gdmE7DQoJCQkJfTsNCgkJCX0NCg0KCQkJLy8gRG8gd2UgbmVlZCB0byBkbyBzb21ldGhpbmc/DQoJCQlpZiAodmEgIT0gdC5zZWxlY3RlZFZhbHVlKSB7DQoJCQkJLy8gRmluZCBpdGVtDQoJCQkJZWFjaCh0Lml0ZW1zLCBmdW5jdGlvbihvLCBpKSB7DQoJCQkJCWlmIChmKG8udmFsdWUpKSB7DQoJCQkJCQlmdiA9IDE7DQoJCQkJCQl0LnNlbGVjdEJ5SW5kZXgoaSk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCWlmICghZnYpDQoJCQkJCXQuc2VsZWN0QnlJbmRleCgtMSk7DQoJCQl9DQoJCX0sDQoNCgkJc2VsZWN0QnlJbmRleCA6IGZ1bmN0aW9uKGlkeCkgew0KCQkJdmFyIHQgPSB0aGlzLCBlLCBvOw0KDQoJCQlpZiAoaWR4ICE9IHQuc2VsZWN0ZWRJbmRleCkgew0KCQkJCWUgPSBET00uZ2V0KHQuaWQgKyAnX3RleHQnKTsNCgkJCQlvID0gdC5pdGVtc1tpZHhdOw0KDQoJCQkJaWYgKG8pIHsNCgkJCQkJdC5zZWxlY3RlZFZhbHVlID0gby52YWx1ZTsNCgkJCQkJdC5zZWxlY3RlZEluZGV4ID0gaWR4Ow0KCQkJCQlET00uc2V0SFRNTChlLCBET00uZW5jb2RlKG8udGl0bGUpKTsNCgkJCQkJRE9NLnJlbW92ZUNsYXNzKGUsICdtY2VUaXRsZScpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCURPTS5zZXRIVE1MKGUsIERPTS5lbmNvZGUodC5zZXR0aW5ncy50aXRsZSkpOw0KCQkJCQlET00uYWRkQ2xhc3MoZSwgJ21jZVRpdGxlJyk7DQoJCQkJCXQuc2VsZWN0ZWRWYWx1ZSA9IHQuc2VsZWN0ZWRJbmRleCA9IG51bGw7DQoJCQkJfQ0KDQoJCQkJZSA9IDA7DQoJCQl9DQoJCX0sDQoNCgkJYWRkIDogZnVuY3Rpb24obiwgdiwgbykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlvID0gbyB8fCB7fTsNCgkJCW8gPSB0aW55bWNlLmV4dGVuZChvLCB7DQoJCQkJdGl0bGUgOiBuLA0KCQkJCXZhbHVlIDogdg0KCQkJfSk7DQoNCgkJCXQuaXRlbXMucHVzaChvKTsNCgkJCXQub25BZGQuZGlzcGF0Y2godCwgbyk7DQoJCX0sDQoNCgkJZ2V0TGVuZ3RoIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGg7DQoJCX0sDQoNCgkJcmVuZGVySFRNTCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGggPSAnJywgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBjcCA9IHQuY2xhc3NQcmVmaXg7DQoNCgkJCWggPSAnPHRhYmxlIGlkPSInICsgdC5pZCArICciIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9IicgKyBjcCArICcgJyArIGNwICsgJ0VuYWJsZWQnICsgKHNbJ2NsYXNzJ10gPyAoJyAnICsgc1snY2xhc3MnXSkgOiAnJykgKyAnIj48dGJvZHk+PHRyPic7DQoJCQloICs9ICc8dGQ+JyArIERPTS5jcmVhdGVIVE1MKCdhJywge2lkIDogdC5pZCArICdfdGV4dCcsIGhyZWYgOiAnamF2YXNjcmlwdDo7JywgJ2NsYXNzJyA6ICdtY2VUZXh0Jywgb25jbGljayA6ICJyZXR1cm4gZmFsc2U7Iiwgb25tb3VzZWRvd24gOiAncmV0dXJuIGZhbHNlOyd9LCBET00uZW5jb2RlKHQuc2V0dGluZ3MudGl0bGUpKSArICc8L3RkPic7DQoJCQloICs9ICc8dGQ+JyArIERPTS5jcmVhdGVIVE1MKCdhJywge2lkIDogdC5pZCArICdfb3BlbicsIHRhYmluZGV4IDogLTEsIGhyZWYgOiAnamF2YXNjcmlwdDo7JywgJ2NsYXNzJyA6ICdtY2VPcGVuJywgb25jbGljayA6ICJyZXR1cm4gZmFsc2U7Iiwgb25tb3VzZWRvd24gOiAncmV0dXJuIGZhbHNlOyd9LCAnPHNwYW4+PC9zcGFuPicpICsgJzwvdGQ+JzsNCgkJCWggKz0gJzwvdHI+PC90Ym9keT48L3RhYmxlPic7DQoNCgkJCXJldHVybiBoOw0KCQl9LA0KDQoJCXNob3dNZW51IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHAxLCBwMiwgZSA9IERPTS5nZXQodGhpcy5pZCksIG07DQoNCgkJCWlmICh0LmlzRGlzYWJsZWQoKSB8fCB0Lml0ZW1zLmxlbmd0aCA9PSAwKQ0KCQkJCXJldHVybjsNCg0KCQkJaWYgKHQubWVudSAmJiB0Lm1lbnUuaXNNZW51VmlzaWJsZSkNCgkJCQlyZXR1cm4gdC5oaWRlTWVudSgpOw0KDQoJCQlpZiAoIXQuaXNNZW51UmVuZGVyZWQpIHsNCgkJCQl0LnJlbmRlck1lbnUoKTsNCgkJCQl0LmlzTWVudVJlbmRlcmVkID0gdHJ1ZTsNCgkJCX0NCg0KCQkJcDEgPSBET00uZ2V0UG9zKHRoaXMuc2V0dGluZ3MubWVudV9jb250YWluZXIpOw0KCQkJcDIgPSBET00uZ2V0UG9zKGUpOw0KDQoJCQltID0gdC5tZW51Ow0KCQkJbS5zZXR0aW5ncy5vZmZzZXRfeCA9IHAyLng7DQoJCQltLnNldHRpbmdzLm9mZnNldF95ID0gcDIueTsNCgkJCW0uc2V0dGluZ3Mua2V5Ym9hcmRfZm9jdXMgPSAhdGlueW1jZS5pc09wZXJhOyAvLyBPcGVyYSBpcyBidWdneSB3aGVuIGl0IGNvbWVzIHRvIGF1dG8gZm9jdXMNCg0KCQkJLy8gU2VsZWN0IGluIG1lbnUNCgkJCWlmICh0Lm9sZElEKQ0KCQkJCW0uaXRlbXNbdC5vbGRJRF0uc2V0U2VsZWN0ZWQoMCk7DQoNCgkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24obykgew0KCQkJCWlmIChvLnZhbHVlID09PSB0LnNlbGVjdGVkVmFsdWUpIHsNCgkJCQkJbS5pdGVtc1tvLmlkXS5zZXRTZWxlY3RlZCgxKTsNCgkJCQkJdC5vbGRJRCA9IG8uaWQ7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCW0uc2hvd01lbnUoMCwgZS5jbGllbnRIZWlnaHQpOw0KDQoJCQlFdmVudC5hZGQoRE9NLmRvYywgJ21vdXNlZG93bicsIHQuaGlkZU1lbnUsIHQpOw0KCQkJRE9NLmFkZENsYXNzKHQuaWQsIHQuY2xhc3NQcmVmaXggKyAnU2VsZWN0ZWQnKTsNCg0KCQkJLy9ET00uZ2V0KHQuaWQgKyAnX3RleHQnKS5mb2N1cygpOw0KCQl9LA0KDQoJCWhpZGVNZW51IDogZnVuY3Rpb24oZSkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAodC5tZW51ICYmIHQubWVudS5pc01lbnVWaXNpYmxlKSB7DQoJCQkJLy8gUHJldmVudCBkb3VibGUgdG9vZ2xlcyBieSBjYW5jZWxpbmcgdGhlIG1vdXNlIGNsaWNrIGV2ZW50IHRvIHRoZSBidXR0b24NCgkJCQlpZiAoZSAmJiBlLnR5cGUgPT0gIm1vdXNlZG93biIgJiYgKGUudGFyZ2V0LmlkID09IHQuaWQgKyAnX3RleHQnIHx8IGUudGFyZ2V0LmlkID09IHQuaWQgKyAnX29wZW4nKSkNCgkJCQkJcmV0dXJuOw0KDQoJCQkJaWYgKCFlIHx8ICFET00uZ2V0UGFyZW50KGUudGFyZ2V0LCAnLm1jZU1lbnUnKSkgew0KCQkJCQlET00ucmVtb3ZlQ2xhc3ModC5pZCwgdC5jbGFzc1ByZWZpeCArICdTZWxlY3RlZCcpOw0KCQkJCQlFdmVudC5yZW1vdmUoRE9NLmRvYywgJ21vdXNlZG93bicsIHQuaGlkZU1lbnUsIHQpOw0KCQkJCQl0Lm1lbnUuaGlkZU1lbnUoKTsNCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkJcmVuZGVyTWVudSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBtOw0KDQoJCQltID0gdC5zZXR0aW5ncy5jb250cm9sX21hbmFnZXIuY3JlYXRlRHJvcE1lbnUodC5pZCArICdfbWVudScsIHsNCgkJCQltZW51X2xpbmUgOiAxLA0KCQkJCSdjbGFzcycgOiB0LmNsYXNzUHJlZml4ICsgJ01lbnUgbWNlTm9JY29ucycsDQoJCQkJbWF4X3dpZHRoIDogMTUwLA0KCQkJCW1heF9oZWlnaHQgOiAxNTANCgkJCX0pOw0KDQoJCQltLm9uSGlkZU1lbnUuYWRkKHQuaGlkZU1lbnUsIHQpOw0KDQoJCQltLmFkZCh7DQoJCQkJdGl0bGUgOiB0LnNldHRpbmdzLnRpdGxlLA0KCQkJCSdjbGFzcycgOiAnbWNlTWVudUl0ZW1UaXRsZScsDQoJCQkJb25jbGljayA6IGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAodC5zZXR0aW5ncy5vbnNlbGVjdCgnJykgIT09IGZhbHNlKQ0KCQkJCQkJdC5zZWxlY3QoJycpOyAvLyBNdXN0IGJlIHJ1bm5lZCBhZnRlcg0KCQkJCX0NCgkJCX0pOw0KDQoJCQllYWNoKHQuaXRlbXMsIGZ1bmN0aW9uKG8pIHsNCgkJCQkvLyBObyB2YWx1ZSB0aGVuIHRyZWF0IGl0IGFzIGEgdGl0bGUNCgkJCQlpZiAoby52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7DQoJCQkJCW0uYWRkKHsNCgkJCQkJCXRpdGxlIDogby50aXRsZSwNCgkJCQkJCSdjbGFzcycgOiAnbWNlTWVudUl0ZW1UaXRsZScsDQoJCQkJCQlvbmNsaWNrIDogZnVuY3Rpb24oKSB7DQoJCQkJCQkJaWYgKHQuc2V0dGluZ3Mub25zZWxlY3QoJycpICE9PSBmYWxzZSkNCgkJCQkJCQkJdC5zZWxlY3QoJycpOyAvLyBNdXN0IGJlIHJ1bm5lZCBhZnRlcg0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlvLmlkID0gRE9NLnVuaXF1ZUlkKCk7DQoJCQkJCW8ub25jbGljayA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJaWYgKHQuc2V0dGluZ3Mub25zZWxlY3Qoby52YWx1ZSkgIT09IGZhbHNlKQ0KCQkJCQkJCXQuc2VsZWN0KG8udmFsdWUpOyAvLyBNdXN0IGJlIHJ1bm5lZCBhZnRlcg0KCQkJCQl9Ow0KDQoJCQkJCW0uYWRkKG8pOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQl0Lm9uUmVuZGVyTWVudS5kaXNwYXRjaCh0LCBtKTsNCgkJCXQubWVudSA9IG07DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBjcCA9IHQuY2xhc3NQcmVmaXg7DQoNCgkJCUV2ZW50LmFkZCh0LmlkLCAnY2xpY2snLCB0LnNob3dNZW51LCB0KTsNCgkJCUV2ZW50LmFkZCh0LmlkICsgJ190ZXh0JywgJ2ZvY3VzJywgZnVuY3Rpb24oKSB7DQoJCQkJaWYgKCF0Ll9mb2N1c2VkKSB7DQoJCQkJCXQua2V5RG93bkhhbmRsZXIgPSBFdmVudC5hZGQodC5pZCArICdfdGV4dCcsICdrZXlkb3duJywgZnVuY3Rpb24oZSkgew0KCQkJCQkJdmFyIGlkeCA9IC0xLCB2LCBrYyA9IGUua2V5Q29kZTsNCg0KCQkJCQkJLy8gRmluZCBjdXJyZW50IGluZGV4DQoJCQkJCQllYWNoKHQuaXRlbXMsIGZ1bmN0aW9uKHYsIGkpIHsNCgkJCQkJCQlpZiAodC5zZWxlY3RlZFZhbHVlID09IHYudmFsdWUpDQoJCQkJCQkJCWlkeCA9IGk7DQoJCQkJCQl9KTsNCg0KCQkJCQkJLy8gTW92ZSB1cC9kb3duDQoJCQkJCQlpZiAoa2MgPT0gMzgpDQoJCQkJCQkJdiA9IHQuaXRlbXNbaWR4IC0gMV07DQoJCQkJCQllbHNlIGlmIChrYyA9PSA0MCkNCgkJCQkJCQl2ID0gdC5pdGVtc1tpZHggKyAxXTsNCgkJCQkJCWVsc2UgaWYgKGtjID09IDEzKSB7DQoJCQkJCQkJLy8gRmFrZSBzZWxlY3Qgb24gZW50ZXINCgkJCQkJCQl2ID0gdC5zZWxlY3RlZFZhbHVlOw0KCQkJCQkJCXQuc2VsZWN0ZWRWYWx1ZSA9IG51bGw7IC8vIE5lZWRzIHRvIGJlIG51bGwgdG8gZmFrZSBjaGFuZ2UNCgkJCQkJCQl0LnNldHRpbmdzLm9uc2VsZWN0KHYpOw0KCQkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJCQl9DQoNCgkJCQkJCWlmICh2KSB7DQoJCQkJCQkJdC5oaWRlTWVudSgpOw0KCQkJCQkJCXQuc2VsZWN0KHYudmFsdWUpOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQl0Ll9mb2N1c2VkID0gMTsNCgkJCX0pOw0KCQkJRXZlbnQuYWRkKHQuaWQgKyAnX3RleHQnLCAnYmx1cicsIGZ1bmN0aW9uKCkge0V2ZW50LnJlbW92ZSh0LmlkICsgJ190ZXh0JywgJ2tleWRvd24nLCB0LmtleURvd25IYW5kbGVyKTsgdC5fZm9jdXNlZCA9IDA7fSk7DQoNCgkJCS8vIE9sZCBJRSBkb2Vzbid0IGhhdmUgaG92ZXIgb24gYWxsIGVsZW1lbnRzDQoJCQlpZiAodGlueW1jZS5pc0lFNiB8fCAhRE9NLmJveE1vZGVsKSB7DQoJCQkJRXZlbnQuYWRkKHQuaWQsICdtb3VzZW92ZXInLCBmdW5jdGlvbigpIHsNCgkJCQkJaWYgKCFET00uaGFzQ2xhc3ModC5pZCwgY3AgKyAnRGlzYWJsZWQnKSkNCgkJCQkJCURPTS5hZGRDbGFzcyh0LmlkLCBjcCArICdIb3ZlcicpOw0KCQkJCX0pOw0KDQoJCQkJRXZlbnQuYWRkKHQuaWQsICdtb3VzZW91dCcsIGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoIURPTS5oYXNDbGFzcyh0LmlkLCBjcCArICdEaXNhYmxlZCcpKQ0KCQkJCQkJRE9NLnJlbW92ZUNsYXNzKHQuaWQsIGNwICsgJ0hvdmVyJyk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXQub25Qb3N0UmVuZGVyLmRpc3BhdGNoKHQsIERPTS5nZXQodC5pZCkpOw0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbigpIHsNCgkJCXRoaXMucGFyZW50KCk7DQoNCgkJCUV2ZW50LmNsZWFyKHRoaXMuaWQgKyAnX3RleHQnKTsNCgkJCUV2ZW50LmNsZWFyKHRoaXMuaWQgKyAnX29wZW4nKTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBET00gPSB0aW55bWNlLkRPTSwgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwgZWFjaCA9IHRpbnltY2UuZWFjaCwgRGlzcGF0Y2hlciA9IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuTmF0aXZlTGlzdEJveDp0aW55bWNlLnVpLkxpc3RCb3gnLCB7DQoJCU5hdGl2ZUxpc3RCb3ggOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KCQkJdGhpcy5jbGFzc1ByZWZpeCA9ICdtY2VOYXRpdmVMaXN0Qm94JzsNCgkJfSwNCg0KCQlzZXREaXNhYmxlZCA6IGZ1bmN0aW9uKHMpIHsNCgkJCURPTS5nZXQodGhpcy5pZCkuZGlzYWJsZWQgPSBzOw0KCQl9LA0KDQoJCWlzRGlzYWJsZWQgOiBmdW5jdGlvbigpIHsNCgkJCXJldHVybiBET00uZ2V0KHRoaXMuaWQpLmRpc2FibGVkOw0KCQl9LA0KDQoJCXNlbGVjdCA6IGZ1bmN0aW9uKHZhKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGZ2LCBmOw0KDQoJCQlpZiAodmEgPT0gdW5kZWZpbmVkKQ0KCQkJCXJldHVybiB0LnNlbGVjdEJ5SW5kZXgoLTEpOw0KDQoJCQkvLyBJcyBzdHJpbmcgb3IgbnVtYmVyIG1ha2UgZnVuY3Rpb24gc2VsZWN0b3INCgkJCWlmICh2YSAmJiB2YS5jYWxsKQ0KCQkJCWYgPSB2YTsNCgkJCWVsc2Ugew0KCQkJCWYgPSBmdW5jdGlvbih2KSB7DQoJCQkJCXJldHVybiB2ID09IHZhOw0KCQkJCX07DQoJCQl9DQoNCgkJCS8vIERvIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nPw0KCQkJaWYgKHZhICE9IHQuc2VsZWN0ZWRWYWx1ZSkgew0KCQkJCS8vIEZpbmQgaXRlbQ0KCQkJCWVhY2godC5pdGVtcywgZnVuY3Rpb24obywgaSkgew0KCQkJCQlpZiAoZihvLnZhbHVlKSkgew0KCQkJCQkJZnYgPSAxOw0KCQkJCQkJdC5zZWxlY3RCeUluZGV4KGkpOw0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQlpZiAoIWZ2KQ0KCQkJCQl0LnNlbGVjdEJ5SW5kZXgoLTEpOw0KCQkJfQ0KCQl9LA0KDQoJCXNlbGVjdEJ5SW5kZXggOiBmdW5jdGlvbihpZHgpIHsNCgkJCURPTS5nZXQodGhpcy5pZCkuc2VsZWN0ZWRJbmRleCA9IGlkeCArIDE7DQoJCQl0aGlzLnNlbGVjdGVkVmFsdWUgPSB0aGlzLml0ZW1zW2lkeF0gPyB0aGlzLml0ZW1zW2lkeF0udmFsdWUgOiBudWxsOw0KCQl9LA0KDQoJCWFkZCA6IGZ1bmN0aW9uKG4sIHYsIGEpIHsNCgkJCXZhciBvLCB0ID0gdGhpczsNCg0KCQkJYSA9IGEgfHwge307DQoJCQlhLnZhbHVlID0gdjsNCg0KCQkJaWYgKHQuaXNSZW5kZXJlZCgpKQ0KCQkJCURPTS5hZGQoRE9NLmdldCh0aGlzLmlkKSwgJ29wdGlvbicsIGEsIG4pOw0KDQoJCQlvID0gew0KCQkJCXRpdGxlIDogbiwNCgkJCQl2YWx1ZSA6IHYsDQoJCQkJYXR0cmlicyA6IGENCgkJCX07DQoNCgkJCXQuaXRlbXMucHVzaChvKTsNCgkJCXQub25BZGQuZGlzcGF0Y2godCwgbyk7DQoJCX0sDQoNCgkJZ2V0TGVuZ3RoIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGg7DQoJCX0sDQoNCgkJcmVuZGVySFRNTCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGgsIHQgPSB0aGlzOw0KDQoJCQloID0gRE9NLmNyZWF0ZUhUTUwoJ29wdGlvbicsIHt2YWx1ZSA6ICcnfSwgJy0tICcgKyB0LnNldHRpbmdzLnRpdGxlICsgJyAtLScpOw0KDQoJCQllYWNoKHQuaXRlbXMsIGZ1bmN0aW9uKGl0KSB7DQoJCQkJaCArPSBET00uY3JlYXRlSFRNTCgnb3B0aW9uJywge3ZhbHVlIDogaXQudmFsdWV9LCBpdC50aXRsZSk7DQoJCQl9KTsNCg0KCQkJaCA9IERPTS5jcmVhdGVIVE1MKCdzZWxlY3QnLCB7aWQgOiB0LmlkLCAnY2xhc3MnIDogJ21jZU5hdGl2ZUxpc3RCb3gnfSwgaCk7DQoNCgkJCXJldHVybiBoOw0KCQl9LA0KDQoJCXBvc3RSZW5kZXIgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgY2g7DQoNCgkJCXQucmVuZGVyZWQgPSB0cnVlOw0KDQoJCQlmdW5jdGlvbiBvbkNoYW5nZShlKSB7DQoJCQkJdmFyIHYgPSB0Lml0ZW1zW2UudGFyZ2V0LnNlbGVjdGVkSW5kZXggLSAxXTsNCg0KCQkJCWlmICh2ICYmICh2ID0gdi52YWx1ZSkpIHsNCgkJCQkJdC5vbkNoYW5nZS5kaXNwYXRjaCh0LCB2KTsNCg0KCQkJCQlpZiAodC5zZXR0aW5ncy5vbnNlbGVjdCkNCgkJCQkJCXQuc2V0dGluZ3Mub25zZWxlY3Qodik7DQoJCQkJfQ0KCQkJfTsNCg0KCQkJRXZlbnQuYWRkKHQuaWQsICdjaGFuZ2UnLCBvbkNoYW5nZSk7DQoNCgkJCS8vIEFjY2Vzc2liaWxpdHkga2V5aGFuZGxlcg0KCQkJRXZlbnQuYWRkKHQuaWQsICdrZXlkb3duJywgZnVuY3Rpb24oZSkgew0KCQkJCXZhciBiZjsNCg0KCQkJCUV2ZW50LnJlbW92ZSh0LmlkLCAnY2hhbmdlJywgY2gpOw0KDQoJCQkJYmYgPSBFdmVudC5hZGQodC5pZCwgJ2JsdXInLCBmdW5jdGlvbigpIHsNCgkJCQkJRXZlbnQuYWRkKHQuaWQsICdjaGFuZ2UnLCBvbkNoYW5nZSk7DQoJCQkJCUV2ZW50LnJlbW92ZSh0LmlkLCAnYmx1cicsIGJmKTsNCgkJCQl9KTsNCg0KCQkJCWlmIChlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDMyKSB7DQoJCQkJCW9uQ2hhbmdlKGUpOw0KCQkJCQlyZXR1cm4gRXZlbnQuY2FuY2VsKGUpOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQl0Lm9uUG9zdFJlbmRlci5kaXNwYXRjaCh0LCBET00uZ2V0KHQuaWQpKTsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBET00gPSB0aW55bWNlLkRPTSwgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwgZWFjaCA9IHRpbnltY2UuZWFjaDsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLnVpLk1lbnVCdXR0b246dGlueW1jZS51aS5CdXR0b24nLCB7DQoJCU1lbnVCdXR0b24gOiBmdW5jdGlvbihpZCwgcykgew0KCQkJdGhpcy5wYXJlbnQoaWQsIHMpOw0KDQoJCQl0aGlzLm9uUmVuZGVyTWVudSA9IG5ldyB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlcih0aGlzKTsNCg0KCQkJcy5tZW51X2NvbnRhaW5lciA9IHMubWVudV9jb250YWluZXIgfHwgRE9NLmRvYy5ib2R5Ow0KCQl9LA0KDQoJCXNob3dNZW51IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHAxLCBwMiwgZSA9IERPTS5nZXQodC5pZCksIG07DQoNCgkJCWlmICh0LmlzRGlzYWJsZWQoKSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICghdC5pc01lbnVSZW5kZXJlZCkgew0KCQkJCXQucmVuZGVyTWVudSgpOw0KCQkJCXQuaXNNZW51UmVuZGVyZWQgPSB0cnVlOw0KCQkJfQ0KDQoJCQlpZiAodC5pc01lbnVWaXNpYmxlKQ0KCQkJCXJldHVybiB0LmhpZGVNZW51KCk7DQoNCgkJCXAxID0gRE9NLmdldFBvcyh0LnNldHRpbmdzLm1lbnVfY29udGFpbmVyKTsNCgkJCXAyID0gRE9NLmdldFBvcyhlKTsNCg0KCQkJbSA9IHQubWVudTsNCgkJCW0uc2V0dGluZ3Mub2Zmc2V0X3ggPSBwMi54Ow0KCQkJbS5zZXR0aW5ncy5vZmZzZXRfeSA9IHAyLnk7DQoJCQltLnNldHRpbmdzLnZwX29mZnNldF94ID0gcDIueDsNCgkJCW0uc2V0dGluZ3MudnBfb2Zmc2V0X3kgPSBwMi55Ow0KCQkJbS5zZXR0aW5ncy5rZXlib2FyZF9mb2N1cyA9IHQuX2ZvY3VzZWQ7DQoJCQltLnNob3dNZW51KDAsIGUuY2xpZW50SGVpZ2h0KTsNCg0KCQkJRXZlbnQuYWRkKERPTS5kb2MsICdtb3VzZWRvd24nLCB0LmhpZGVNZW51LCB0KTsNCgkJCXQuc2V0U3RhdGUoJ1NlbGVjdGVkJywgMSk7DQoNCgkJCXQuaXNNZW51VmlzaWJsZSA9IDE7DQoJCX0sDQoNCgkJcmVuZGVyTWVudSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBtOw0KDQoJCQltID0gdC5zZXR0aW5ncy5jb250cm9sX21hbmFnZXIuY3JlYXRlRHJvcE1lbnUodC5pZCArICdfbWVudScsIHsNCgkJCQltZW51X2xpbmUgOiAxLA0KCQkJCSdjbGFzcycgOiB0aGlzLmNsYXNzUHJlZml4ICsgJ01lbnUnLA0KCQkJCWljb25zIDogdC5zZXR0aW5ncy5pY29ucw0KCQkJfSk7DQoNCgkJCW0ub25IaWRlTWVudS5hZGQodC5oaWRlTWVudSwgdCk7DQoNCgkJCXQub25SZW5kZXJNZW51LmRpc3BhdGNoKHQsIG0pOw0KCQkJdC5tZW51ID0gbTsNCgkJfSwNCg0KCQloaWRlTWVudSA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJLy8gUHJldmVudCBkb3VibGUgdG9vZ2xlcyBieSBjYW5jZWxpbmcgdGhlIG1vdXNlIGNsaWNrIGV2ZW50IHRvIHRoZSBidXR0b24NCgkJCWlmIChlICYmIGUudHlwZSA9PSAibW91c2Vkb3duIiAmJiBET00uZ2V0UGFyZW50KGUudGFyZ2V0LCBmdW5jdGlvbihlKSB7cmV0dXJuIGUuaWQgPT09IHQuaWQgfHwgZS5pZCA9PT0gdC5pZCArICdfb3Blbic7fSkpDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiAoIWUgfHwgIURPTS5nZXRQYXJlbnQoZS50YXJnZXQsICcubWNlTWVudScpKSB7DQoJCQkJdC5zZXRTdGF0ZSgnU2VsZWN0ZWQnLCAwKTsNCgkJCQlFdmVudC5yZW1vdmUoRE9NLmRvYywgJ21vdXNlZG93bicsIHQuaGlkZU1lbnUsIHQpOw0KCQkJCWlmICh0Lm1lbnUpDQoJCQkJCXQubWVudS5oaWRlTWVudSgpOw0KCQkJfQ0KDQoJCQl0LmlzTWVudVZpc2libGUgPSAwOw0KCQl9LA0KDQoJCXBvc3RSZW5kZXIgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3M7DQoNCgkJCUV2ZW50LmFkZCh0LmlkLCAnY2xpY2snLCBmdW5jdGlvbigpIHsNCgkJCQlpZiAoIXQuaXNEaXNhYmxlZCgpKSB7DQoJCQkJCWlmIChzLm9uY2xpY2spDQoJCQkJCQlzLm9uY2xpY2sodC52YWx1ZSk7DQoNCgkJCQkJdC5zaG93TWVudSgpOw0KCQkJCX0NCgkJCX0pOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRE9NID0gdGlueW1jZS5ET00sIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS51aS5TcGxpdEJ1dHRvbjp0aW55bWNlLnVpLk1lbnVCdXR0b24nLCB7DQoJCVNwbGl0QnV0dG9uIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXRoaXMucGFyZW50KGlkLCBzKTsNCgkJCXRoaXMuY2xhc3NQcmVmaXggPSAnbWNlU3BsaXRCdXR0b24nOw0KCQl9LA0KDQoJCXJlbmRlckhUTUwgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBoLCB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIGgxOw0KDQoJCQloID0gJzx0Ym9keT48dHI+JzsNCg0KCQkJaWYgKHMuaW1hZ2UpDQoJCQkJaDEgPSBET00uY3JlYXRlSFRNTCgnaW1nICcsIHtzcmMgOiBzLmltYWdlLCAnY2xhc3MnIDogJ21jZUFjdGlvbiAnICsgc1snY2xhc3MnXX0pOw0KCQkJZWxzZQ0KCQkJCWgxID0gRE9NLmNyZWF0ZUhUTUwoJ3NwYW4nLCB7J2NsYXNzJyA6ICdtY2VBY3Rpb24gJyArIHNbJ2NsYXNzJ119LCAnJyk7DQoNCgkJCWggKz0gJzx0ZD4nICsgRE9NLmNyZWF0ZUhUTUwoJ2EnLCB7aWQgOiB0LmlkICsgJ19hY3Rpb24nLCBocmVmIDogJ2phdmFzY3JpcHQ6OycsICdjbGFzcycgOiAnbWNlQWN0aW9uICcgKyBzWydjbGFzcyddLCBvbmNsaWNrIDogInJldHVybiBmYWxzZTsiLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7JywgdGl0bGUgOiBzLnRpdGxlfSwgaDEpICsgJzwvdGQ+JzsNCgkNCgkJCWgxID0gRE9NLmNyZWF0ZUhUTUwoJ3NwYW4nLCB7J2NsYXNzJyA6ICdtY2VPcGVuICcgKyBzWydjbGFzcyddfSk7DQoJCQloICs9ICc8dGQ+JyArIERPTS5jcmVhdGVIVE1MKCdhJywge2lkIDogdC5pZCArICdfb3BlbicsIGhyZWYgOiAnamF2YXNjcmlwdDo7JywgJ2NsYXNzJyA6ICdtY2VPcGVuICcgKyBzWydjbGFzcyddLCBvbmNsaWNrIDogInJldHVybiBmYWxzZTsiLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7JywgdGl0bGUgOiBzLnRpdGxlfSwgaDEpICsgJzwvdGQ+JzsNCg0KCQkJaCArPSAnPC90cj48L3Rib2R5Pic7DQoNCgkJCXJldHVybiBET00uY3JlYXRlSFRNTCgndGFibGUnLCB7aWQgOiB0LmlkLCAnY2xhc3MnIDogJ21jZVNwbGl0QnV0dG9uIG1jZVNwbGl0QnV0dG9uRW5hYmxlZCAnICsgc1snY2xhc3MnXSwgY2VsbHBhZGRpbmcgOiAnMCcsIGNlbGxzcGFjaW5nIDogJzAnLCBvbm1vdXNlZG93biA6ICdyZXR1cm4gZmFsc2U7JywgdGl0bGUgOiBzLnRpdGxlfSwgaCk7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJaWYgKHMub25jbGljaykgew0KCQkJCUV2ZW50LmFkZCh0LmlkICsgJ19hY3Rpb24nLCAnY2xpY2snLCBmdW5jdGlvbigpIHsNCgkJCQkJaWYgKCF0LmlzRGlzYWJsZWQoKSkNCgkJCQkJCXMub25jbGljayh0LnZhbHVlKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJRXZlbnQuYWRkKHQuaWQgKyAnX29wZW4nLCAnY2xpY2snLCB0LnNob3dNZW51LCB0KTsNCgkJCUV2ZW50LmFkZCh0LmlkICsgJ19vcGVuJywgJ2ZvY3VzJywgZnVuY3Rpb24oKSB7dC5fZm9jdXNlZCA9IDE7fSk7DQoJCQlFdmVudC5hZGQodC5pZCArICdfb3BlbicsICdibHVyJywgZnVuY3Rpb24oKSB7dC5fZm9jdXNlZCA9IDA7fSk7DQoNCgkJCS8vIE9sZCBJRSBkb2Vzbid0IGhhdmUgaG92ZXIgb24gYWxsIGVsZW1lbnRzDQoJCQlpZiAodGlueW1jZS5pc0lFNiB8fCAhRE9NLmJveE1vZGVsKSB7DQoJCQkJRXZlbnQuYWRkKHQuaWQsICdtb3VzZW92ZXInLCBmdW5jdGlvbigpIHsNCgkJCQkJaWYgKCFET00uaGFzQ2xhc3ModC5pZCwgJ21jZVNwbGl0QnV0dG9uRGlzYWJsZWQnKSkNCgkJCQkJCURPTS5hZGRDbGFzcyh0LmlkLCAnbWNlU3BsaXRCdXR0b25Ib3ZlcicpOw0KCQkJCX0pOw0KDQoJCQkJRXZlbnQuYWRkKHQuaWQsICdtb3VzZW91dCcsIGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoIURPTS5oYXNDbGFzcyh0LmlkLCAnbWNlU3BsaXRCdXR0b25EaXNhYmxlZCcpKQ0KCQkJCQkJRE9NLnJlbW92ZUNsYXNzKHQuaWQsICdtY2VTcGxpdEJ1dHRvbkhvdmVyJyk7DQoJCQkJfSk7DQoJCQl9DQoJCX0sDQoNCgkJZGVzdHJveSA6IGZ1bmN0aW9uKCkgew0KCQkJdGhpcy5wYXJlbnQoKTsNCg0KCQkJRXZlbnQuY2xlYXIodGhpcy5pZCArICdfYWN0aW9uJyk7DQoJCQlFdmVudC5jbGVhcih0aGlzLmlkICsgJ19vcGVuJyk7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBET00gPSB0aW55bWNlLkRPTSwgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwgaXMgPSB0aW55bWNlLmlzLCBlYWNoID0gdGlueW1jZS5lYWNoOw0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuQ29sb3JTcGxpdEJ1dHRvbjp0aW55bWNlLnVpLlNwbGl0QnV0dG9uJywgew0KCQlDb2xvclNwbGl0QnV0dG9uIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJdC5wYXJlbnQoaWQsIHMpOw0KDQoJCQl0LnNldHRpbmdzID0gcyA9IHRpbnltY2UuZXh0ZW5kKHsNCgkJCQljb2xvcnMgOiAnMDAwMDAwLDk5MzMwMCwzMzMzMDAsMDAzMzAwLDAwMzM2NiwwMDAwODAsMzMzMzk5LDMzMzMzMyw4MDAwMDAsRkY2NjAwLDgwODAwMCwwMDgwMDAsMDA4MDgwLDAwMDBGRiw2NjY2OTksODA4MDgwLEZGMDAwMCxGRjk5MDAsOTlDQzAwLDMzOTk2NiwzM0NDQ0MsMzM2NkZGLDgwMDA4MCw5OTk5OTksRkYwMEZGLEZGQ0MwMCxGRkZGMDAsMDBGRjAwLDAwRkZGRiwwMENDRkYsOTkzMzY2LEMwQzBDMCxGRjk5Q0MsRkZDQzk5LEZGRkY5OSxDQ0ZGQ0MsQ0NGRkZGLDk5Q0NGRixDQzk5RkYsRkZGRkZGJywNCgkJCQlncmlkX3dpZHRoIDogOCwNCgkJCQlkZWZhdWx0X2NvbG9yIDogJyM4ODg4ODgnDQoJCQl9LCB0LnNldHRpbmdzKTsNCg0KCQkJdC5vblNob3dNZW51ID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHQpOw0KDQoJCQl0Lm9uSGlkZU1lbnUgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodCk7DQoNCgkJCXQudmFsdWUgPSBzLmRlZmF1bHRfY29sb3I7DQoJCX0sDQoNCgkJc2hvd01lbnUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgciwgcCwgZSwgcDI7DQoNCgkJCWlmICh0LmlzRGlzYWJsZWQoKSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICghdC5pc01lbnVSZW5kZXJlZCkgew0KCQkJCXQucmVuZGVyTWVudSgpOw0KCQkJCXQuaXNNZW51UmVuZGVyZWQgPSB0cnVlOw0KCQkJfQ0KDQoJCQlpZiAodC5pc01lbnVWaXNpYmxlKQ0KCQkJCXJldHVybiB0LmhpZGVNZW51KCk7DQoNCgkJCWUgPSBET00uZ2V0KHQuaWQpOw0KCQkJRE9NLnNob3codC5pZCArICdfbWVudScpOw0KCQkJRE9NLmFkZENsYXNzKGUsICdtY2VTcGxpdEJ1dHRvblNlbGVjdGVkJyk7DQoJCQlwMiA9IERPTS5nZXRQb3MoZSk7DQoJCQlET00uc2V0U3R5bGVzKHQuaWQgKyAnX21lbnUnLCB7DQoJCQkJbGVmdCA6IHAyLngsDQoJCQkJdG9wIDogcDIueSArIGUuY2xpZW50SGVpZ2h0LA0KCQkJCXpJbmRleCA6IDIwMDAwMA0KCQkJfSk7DQoJCQllID0gMDsNCg0KCQkJRXZlbnQuYWRkKERPTS5kb2MsICdtb3VzZWRvd24nLCB0LmhpZGVNZW51LCB0KTsNCgkJCXQub25TaG93TWVudS5kaXNwYXRjaCh0KTsNCg0KCQkJaWYgKHQuX2ZvY3VzZWQpIHsNCgkJCQl0Ll9rZXlIYW5kbGVyID0gRXZlbnQuYWRkKHQuaWQgKyAnX21lbnUnLCAna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJaWYgKGUua2V5Q29kZSA9PSAyNykNCgkJCQkJCXQuaGlkZU1lbnUoKTsNCgkJCQl9KTsNCg0KCQkJCURPTS5zZWxlY3QoJ2EnLCB0LmlkICsgJ19tZW51JylbMF0uZm9jdXMoKTsgLy8gU2VsZWN0IGZpcnN0IGxpbmsNCgkJCX0NCg0KCQkJdC5pc01lbnVWaXNpYmxlID0gMTsNCgkJfSwNCg0KCQloaWRlTWVudSA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJLy8gUHJldmVudCBkb3VibGUgdG9vZ2xlcyBieSBjYW5jZWxpbmcgdGhlIG1vdXNlIGNsaWNrIGV2ZW50IHRvIHRoZSBidXR0b24NCgkJCWlmIChlICYmIGUudHlwZSA9PSAibW91c2Vkb3duIiAmJiBET00uZ2V0UGFyZW50KGUudGFyZ2V0LCBmdW5jdGlvbihlKSB7cmV0dXJuIGUuaWQgPT09IHQuaWQgKyAnX29wZW4nO30pKQ0KCQkJCXJldHVybjsNCg0KCQkJaWYgKCFlIHx8ICFET00uZ2V0UGFyZW50KGUudGFyZ2V0LCAnLm1jZVNwbGl0QnV0dG9uTWVudScpKSB7DQoJCQkJRE9NLnJlbW92ZUNsYXNzKHQuaWQsICdtY2VTcGxpdEJ1dHRvblNlbGVjdGVkJyk7DQoJCQkJRXZlbnQucmVtb3ZlKERPTS5kb2MsICdtb3VzZWRvd24nLCB0LmhpZGVNZW51LCB0KTsNCgkJCQlFdmVudC5yZW1vdmUodC5pZCArICdfbWVudScsICdrZXlkb3duJywgdC5fa2V5SGFuZGxlcik7DQoJCQkJRE9NLmhpZGUodC5pZCArICdfbWVudScpOw0KCQkJfQ0KDQoJCQl0Lm9uSGlkZU1lbnUuZGlzcGF0Y2godCk7DQoNCgkJCXQuaXNNZW51VmlzaWJsZSA9IDA7DQoJCX0sDQoNCgkJcmVuZGVyTWVudSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBtLCBpID0gMCwgcyA9IHQuc2V0dGluZ3MsIG4sIHRiLCB0ciwgdzsNCg0KCQkJdyA9IERPTS5hZGQocy5tZW51X2NvbnRhaW5lciwgJ2RpdicsIHtpZCA6IHQuaWQgKyAnX21lbnUnLCAnY2xhc3MnIDogc1snbWVudV9jbGFzcyddICsgJyAnICsgc1snY2xhc3MnXSwgc3R5bGUgOiAncG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDotMTAwMHB4Oyd9KTsNCgkJCW0gPSBET00uYWRkKHcsICdkaXYnLCB7J2NsYXNzJyA6IHNbJ2NsYXNzJ10gKyAnIG1jZVNwbGl0QnV0dG9uTWVudSd9KTsNCgkJCURPTS5hZGQobSwgJ3NwYW4nLCB7J2NsYXNzJyA6ICdtY2VNZW51TGluZSd9KTsNCg0KCQkJbiA9IERPTS5hZGQobSwgJ3RhYmxlJywgeydjbGFzcycgOiAnbWNlQ29sb3JTcGxpdE1lbnUnfSk7DQoJCQl0YiA9IERPTS5hZGQobiwgJ3Rib2R5Jyk7DQoNCgkJCS8vIEdlbmVyYXRlIGNvbG9yIGdyaWQNCgkJCWkgPSAwOw0KCQkJZWFjaChpcyhzLmNvbG9ycywgJ2FycmF5JykgPyBzLmNvbG9ycyA6IHMuY29sb3JzLnNwbGl0KCcsJyksIGZ1bmN0aW9uKGMpIHsNCgkJCQljID0gYy5yZXBsYWNlKC9eIy8sICcnKTsNCg0KCQkJCWlmICghaS0tKSB7DQoJCQkJCXRyID0gRE9NLmFkZCh0YiwgJ3RyJyk7DQoJCQkJCWkgPSBzLmdyaWRfd2lkdGggLSAxOw0KCQkJCX0NCg0KCQkJCW4gPSBET00uYWRkKHRyLCAndGQnKTsNCg0KCQkJCW4gPSBET00uYWRkKG4sICdhJywgew0KCQkJCQlocmVmIDogJ2phdmFzY3JpcHQ6OycsDQoJCQkJCXN0eWxlIDogew0KCQkJCQkJYmFja2dyb3VuZENvbG9yIDogJyMnICsgYw0KCQkJCQl9LA0KCQkJCQlfbWNlX2NvbG9yIDogJyMnICsgYw0KCQkJCX0pOw0KCQkJfSk7DQoNCgkJCWlmIChzLm1vcmVfY29sb3JzX2Z1bmMpIHsNCgkJCQluID0gRE9NLmFkZCh0YiwgJ3RyJyk7DQoJCQkJbiA9IERPTS5hZGQobiwgJ3RkJywge2NvbHNwYW4gOiBzLmdyaWRfd2lkdGgsICdjbGFzcycgOiAnbWNlTW9yZUNvbG9ycyd9KTsNCgkJCQluID0gRE9NLmFkZChuLCAnYScsIHtpZCA6IHQuaWQgKyAnX21vcmUnLCBocmVmIDogJ2phdmFzY3JpcHQ6OycsIG9uY2xpY2sgOiAncmV0dXJuIGZhbHNlOycsICdjbGFzcycgOiAnbWNlTW9yZUNvbG9ycyd9LCBzLm1vcmVfY29sb3JzX3RpdGxlKTsNCg0KCQkJCUV2ZW50LmFkZChuLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7DQoJCQkJCXMubW9yZV9jb2xvcnNfZnVuYy5jYWxsKHMubW9yZV9jb2xvcnNfc2NvcGUgfHwgdGhpcyk7DQoJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7IC8vIENhbmNlbCB0byBmaXggb25iZWZvcmV1bmxvYWQgcHJvYmxlbQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlET00uYWRkQ2xhc3MobSwgJ21jZUNvbG9yU3BsaXRNZW51Jyk7DQoNCgkJCUV2ZW50LmFkZCh0LmlkICsgJ19tZW51JywgJ2NsaWNrJywgZnVuY3Rpb24oZSkgew0KCQkJCXZhciBjOw0KDQoJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJaWYgKGUubm9kZU5hbWUgPT0gJ0EnICYmIChjID0gZS5nZXRBdHRyaWJ1dGUoJ19tY2VfY29sb3InKSkpDQoJCQkJCXQuc2V0Q29sb3IoYyk7DQoNCgkJCQlyZXR1cm4gRXZlbnQuY2FuY2VsKGUpOyAvLyBQcmV2ZW50IElFIGF1dG8gc2F2ZSB3YXJuaW5nDQoJCQl9KTsNCg0KCQkJcmV0dXJuIHc7DQoJCX0sDQoNCgkJc2V0Q29sb3IgOiBmdW5jdGlvbihjKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCURPTS5zZXRTdHlsZSh0LmlkICsgJ19wcmV2aWV3JywgJ2JhY2tncm91bmRDb2xvcicsIGMpOw0KDQoJCQl0LnZhbHVlID0gYzsNCgkJCXQuaGlkZU1lbnUoKTsNCgkJCXQuc2V0dGluZ3Mub25zZWxlY3QoYyk7DQoJCX0sDQoNCgkJcG9zdFJlbmRlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBpZCA9IHQuaWQ7DQoNCgkJCXQucGFyZW50KCk7DQoJCQlET00uYWRkKGlkICsgJ19hY3Rpb24nLCAnZGl2Jywge2lkIDogaWQgKyAnX3ByZXZpZXcnLCAnY2xhc3MnIDogJ21jZUNvbG9yUHJldmlldyd9KTsNCgkJCURPTS5zZXRTdHlsZSh0LmlkICsgJ19wcmV2aWV3JywgJ2JhY2tncm91bmRDb2xvcicsIHQudmFsdWUpOw0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbigpIHsNCgkJCXRoaXMucGFyZW50KCk7DQoNCgkJCUV2ZW50LmNsZWFyKHRoaXMuaWQgKyAnX21lbnUnKTsNCgkJCUV2ZW50LmNsZWFyKHRoaXMuaWQgKyAnX21vcmUnKTsNCgkJCURPTS5yZW1vdmUodGhpcy5pZCArICdfbWVudScpOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UudWkuVG9vbGJhcjp0aW55bWNlLnVpLkNvbnRhaW5lcicsIHsNCglyZW5kZXJIVE1MIDogZnVuY3Rpb24oKSB7DQoJCXZhciB0ID0gdGhpcywgaCA9ICcnLCBjLCBjbywgZG9tID0gdGlueW1jZS5ET00sIHMgPSB0LnNldHRpbmdzLCBpLCBwciwgbngsIGNsOw0KDQoJCWNsID0gdC5jb250cm9sczsNCgkJZm9yIChpPTA7IGk8Y2wubGVuZ3RoOyBpKyspIHsNCgkJCS8vIEdldCBjdXJyZW50IGNvbnRyb2wsIHByZXYgY29udHJvbCwgbmV4dCBjb250cm9sIGFuZCBpZiB0aGUgY29udHJvbCBpcyBhIGxpc3QgYm94IG9yIG5vdA0KCQkJY28gPSBjbFtpXTsNCgkJCXByID0gY2xbaSAtIDFdOw0KCQkJbnggPSBjbFtpICsgMV07DQoNCgkJCS8vIEFkZCB0b29sYmFyIHN0YXJ0DQoJCQlpZiAoaSA9PT0gMCkgew0KCQkJCWMgPSAnbWNlVG9vbGJhclN0YXJ0JzsNCg0KCQkJCWlmIChjby5CdXR0b24pDQoJCQkJCWMgKz0gJyBtY2VUb29sYmFyU3RhcnRCdXR0b24nOw0KCQkJCWVsc2UgaWYgKGNvLlNwbGl0QnV0dG9uKQ0KCQkJCQljICs9ICcgbWNlVG9vbGJhclN0YXJ0U3BsaXRCdXR0b24nOw0KCQkJCWVsc2UgaWYgKGNvLkxpc3RCb3gpDQoJCQkJCWMgKz0gJyBtY2VUb29sYmFyU3RhcnRMaXN0Qm94JzsNCg0KCQkJCWggKz0gZG9tLmNyZWF0ZUhUTUwoJ3RkJywgeydjbGFzcycgOiBjfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoJCQl9DQoNCgkJCS8vIEFkZCB0b29sYmFyIGVuZCBiZWZvcmUgbGlzdCBib3ggYW5kIGFmdGVyIHRoZSBwcmV2aW91cyBidXR0b24NCgkJCS8vIFRoaXMgaXMgdG8gZml4IHRoZSBvMms3IGVkaXRvciBza2lucw0KCQkJaWYgKHByICYmIGNvLkxpc3RCb3gpIHsNCgkJCQlpZiAocHIuQnV0dG9uIHx8IHByLlNwbGl0QnV0dG9uKQ0KCQkJCQloICs9IGRvbS5jcmVhdGVIVE1MKCd0ZCcsIHsnY2xhc3MnIDogJ21jZVRvb2xiYXJFbmQnfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoJCQl9DQoNCgkJCS8vIFJlbmRlciBjb250cm9sIEhUTUwNCg0KCQkJLy8gSUUgOCBxdWljayBmaXgsIG5lZWRlZCB0byBwcm9wZXJ0bHkgZ2VuZXJhdGUgYSBoaXQgYXJlYSBmb3IgYW5jaG9ycw0KCQkJaWYgKGRvbS5zdGRNb2RlKQ0KCQkJCWggKz0gJzx0ZCBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlIj4nICsgY28ucmVuZGVySFRNTCgpICsgJzwvdGQ+JzsNCgkJCWVsc2UNCgkJCQloICs9ICc8dGQ+JyArIGNvLnJlbmRlckhUTUwoKSArICc8L3RkPic7DQoNCgkJCS8vIEFkZCB0b29sYmFyIHN0YXJ0IGFmdGVyIGxpc3QgYm94IGFuZCBiZWZvcmUgdGhlIG5leHQgYnV0dG9uDQoJCQkvLyBUaGlzIGlzIHRvIGZpeCB0aGUgbzJrNyBlZGl0b3Igc2tpbnMNCgkJCWlmIChueCAmJiBjby5MaXN0Qm94KSB7DQoJCQkJaWYgKG54LkJ1dHRvbiB8fCBueC5TcGxpdEJ1dHRvbikNCgkJCQkJaCArPSBkb20uY3JlYXRlSFRNTCgndGQnLCB7J2NsYXNzJyA6ICdtY2VUb29sYmFyU3RhcnQnfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoJCQl9DQoJCX0NCg0KCQljID0gJ21jZVRvb2xiYXJFbmQnOw0KDQoJCWlmIChjby5CdXR0b24pDQoJCQljICs9ICcgbWNlVG9vbGJhckVuZEJ1dHRvbic7DQoJCWVsc2UgaWYgKGNvLlNwbGl0QnV0dG9uKQ0KCQkJYyArPSAnIG1jZVRvb2xiYXJFbmRTcGxpdEJ1dHRvbic7DQoJCWVsc2UgaWYgKGNvLkxpc3RCb3gpDQoJCQljICs9ICcgbWNlVG9vbGJhckVuZExpc3RCb3gnOw0KDQoJCWggKz0gZG9tLmNyZWF0ZUhUTUwoJ3RkJywgeydjbGFzcycgOiBjfSwgZG9tLmNyZWF0ZUhUTUwoJ3NwYW4nLCBudWxsLCAnPCEtLSBJRSAtLT4nKSk7DQoNCgkJcmV0dXJuIGRvbS5jcmVhdGVIVE1MKCd0YWJsZScsIHtpZCA6IHQuaWQsICdjbGFzcycgOiAnbWNlVG9vbGJhcicgKyAoc1snY2xhc3MnXSA/ICcgJyArIHNbJ2NsYXNzJ10gOiAnJyksIGNlbGxwYWRkaW5nIDogJzAnLCBjZWxsc3BhY2luZyA6ICcwJywgYWxpZ24gOiB0LnNldHRpbmdzLmFsaWduIHx8ICcnfSwgJzx0Ym9keT48dHI+JyArIGggKyAnPC90cj48L3Rib2R5PicpOw0KCX0NCn0pOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCXZhciBEaXNwYXRjaGVyID0gdGlueW1jZS51dGlsLkRpc3BhdGNoZXIsIGVhY2ggPSB0aW55bWNlLmVhY2g7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5BZGRPbk1hbmFnZXInLCB7DQoJCUFkZE9uTWFuYWdlciA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHNlbGYgPSB0aGlzOw0KDQoJCQlzZWxmLml0ZW1zID0gW107DQoJCQlzZWxmLnVybHMgPSB7fTsNCgkJCXNlbGYubG9va3VwID0ge307DQoJCQlzZWxmLm9uQWRkID0gbmV3IERpc3BhdGNoZXIoc2VsZik7DQoJCX0sDQoNCgkJZ2V0IDogZnVuY3Rpb24obikgew0KCQkJcmV0dXJuIHRoaXMubG9va3VwW25dOw0KCQl9LA0KDQoJCXJlcXVpcmVMYW5nUGFjayA6IGZ1bmN0aW9uKG4pIHsNCgkJCXZhciBzID0gdGlueW1jZS5zZXR0aW5nczsNCg0KCQkJaWYgKHMgJiYgcy5sYW5ndWFnZSkNCgkJCQl0aW55bWNlLlNjcmlwdExvYWRlci5hZGQodGhpcy51cmxzW25dICsgJy9sYW5ncy8nICsgcy5sYW5ndWFnZSArICcuanMnKTsNCgkJfSwNCg0KCQlhZGQgOiBmdW5jdGlvbihpZCwgbykgew0KCQkJdGhpcy5pdGVtcy5wdXNoKG8pOw0KCQkJdGhpcy5sb29rdXBbaWRdID0gbzsNCgkJCXRoaXMub25BZGQuZGlzcGF0Y2godGhpcywgaWQsIG8pOw0KDQoJCQlyZXR1cm4gbzsNCgkJfSwNCg0KCQlsb2FkIDogZnVuY3Rpb24obiwgdSwgY2IsIHMpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKHQudXJsc1tuXSkNCgkJCQlyZXR1cm47DQoNCgkJCWlmICh1LmluZGV4T2YoJy8nKSAhPSAwICYmIHUuaW5kZXhPZignOi8vJykgPT0gLTEpDQoJCQkJdSA9IHRpbnltY2UuYmFzZVVSTCArICcvJyArICB1Ow0KDQoJCQl0LnVybHNbbl0gPSB1LnN1YnN0cmluZygwLCB1Lmxhc3RJbmRleE9mKCcvJykpOw0KDQoJCQlpZiAoIXQubG9va3VwW25dKQ0KCQkJCXRpbnltY2UuU2NyaXB0TG9hZGVyLmFkZCh1LCBjYiwgcyk7DQoJCX0NCgl9KTsNCg0KCS8vIENyZWF0ZSBwbHVnaW4gYW5kIHRoZW1lIG1hbmFnZXJzDQoJdGlueW1jZS5QbHVnaW5NYW5hZ2VyID0gbmV3IHRpbnltY2UuQWRkT25NYW5hZ2VyKCk7DQoJdGlueW1jZS5UaGVtZU1hbmFnZXIgPSBuZXcgdGlueW1jZS5BZGRPbk1hbmFnZXIoKTsNCn0odGlueW1jZSkpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIFNob3J0ZW4gbmFtZXMNCgl2YXIgZWFjaCA9IHRpbnltY2UuZWFjaCwgZXh0ZW5kID0gdGlueW1jZS5leHRlbmQsDQoJCURPTSA9IHRpbnltY2UuRE9NLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LA0KCQlUaGVtZU1hbmFnZXIgPSB0aW55bWNlLlRoZW1lTWFuYWdlciwgUGx1Z2luTWFuYWdlciA9IHRpbnltY2UuUGx1Z2luTWFuYWdlciwNCgkJZXhwbG9kZSA9IHRpbnltY2UuZXhwbG9kZSwNCgkJRGlzcGF0Y2hlciA9IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyLCB1bmRlZmluZWQsIGluc3RhbmNlQ291bnRlciA9IDA7DQoNCgkvLyBTZXR1cCBzb21lIFVSTHMgd2hlcmUgdGhlIGVkaXRvciBBUEkgaXMgbG9jYXRlZCBhbmQgd2hlcmUgdGhlIGRvY3VtZW50IGlzDQoJdGlueW1jZS5kb2N1bWVudEJhc2VVUkwgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKC9bXD8jXS4qJC8sICcnKS5yZXBsYWNlKC9bXC9cXF1bXlwvXSskLywgJycpOw0KCWlmICghL1tcL1xcXSQvLnRlc3QodGlueW1jZS5kb2N1bWVudEJhc2VVUkwpKQ0KCQl0aW55bWNlLmRvY3VtZW50QmFzZVVSTCArPSAnLyc7DQoNCgl0aW55bWNlLmJhc2VVUkwgPSBuZXcgdGlueW1jZS51dGlsLlVSSSh0aW55bWNlLmRvY3VtZW50QmFzZVVSTCkudG9BYnNvbHV0ZSh0aW55bWNlLmJhc2VVUkwpOw0KDQoJdGlueW1jZS5iYXNlVVJJID0gbmV3IHRpbnltY2UudXRpbC5VUkkodGlueW1jZS5iYXNlVVJMKTsNCg0KCS8vIEFkZCBiZWZvcmUgdW5sb2FkIGxpc3RlbmVyDQoJLy8gVGhpcyB3YXMgcmVxdWlyZWQgc2luY2UgSUUgd2FzIGxlYWtpbmcgbWVtb3J5IGlmIHlvdSBhZGRlZCBhbmQgcmVtb3ZlZCBiZWZvcmV1bmxvYWQgbGlzdGVuZXJzDQoJLy8gd2l0aCBhdHRhY2hFdmVudC9kZXRhdGNoRXZlbnQgc28gdGhpcyBvbmx5IGFkZHMgb25lIGxpc3RlbmVyIGFuZCBpbnN0YW5jZXMgY2FuIHRoZSBhdHRhY2ggdG8gdGhlIG9uQmVmb3JlVW5sb2FkIGV2ZW50DQoJdGlueW1jZS5vbkJlZm9yZVVubG9hZCA9IG5ldyBEaXNwYXRjaGVyKHRpbnltY2UpOw0KDQoJLy8gTXVzdCBiZSBvbiB3aW5kb3cgb3IgSUUgd2lsbCBsZWFrIGlmIHRoZSBlZGl0b3IgaXMgcGxhY2VkIGluIGZyYW1lIG9yIGlmcmFtZQ0KCUV2ZW50LmFkZCh3aW5kb3csICdiZWZvcmV1bmxvYWQnLCBmdW5jdGlvbihlKSB7DQoJCXRpbnltY2Uub25CZWZvcmVVbmxvYWQuZGlzcGF0Y2godGlueW1jZSwgZSk7DQoJfSk7DQoNCgl0aW55bWNlLm9uQWRkRWRpdG9yID0gbmV3IERpc3BhdGNoZXIodGlueW1jZSk7DQoNCgl0aW55bWNlLm9uUmVtb3ZlRWRpdG9yID0gbmV3IERpc3BhdGNoZXIodGlueW1jZSk7DQoNCgl0aW55bWNlLkVkaXRvck1hbmFnZXIgPSBleHRlbmQodGlueW1jZSwgew0KCQllZGl0b3JzIDogW10sDQoNCgkJaTE4biA6IHt9LA0KDQoJCWFjdGl2ZUVkaXRvciA6IG51bGwsDQoNCgkJaW5pdCA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciB0ID0gdGhpcywgcGwsIHNsID0gdGlueW1jZS5TY3JpcHRMb2FkZXIsIGUsIGVsID0gW10sIGVkOw0KDQoJCQlmdW5jdGlvbiBleGVjQ2FsbGJhY2soc2UsIG4sIHMpIHsNCgkJCQl2YXIgZiA9IHNlW25dOw0KDQoJCQkJaWYgKCFmKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlpZiAodGlueW1jZS5pcyhmLCAnc3RyaW5nJykpIHsNCgkJCQkJcyA9IGYucmVwbGFjZSgvXC5cdyskLywgJycpOw0KCQkJCQlzID0gcyA/IHRpbnltY2UucmVzb2x2ZShzKSA6IDA7DQoJCQkJCWYgPSB0aW55bWNlLnJlc29sdmUoZik7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGYuYXBwbHkocyB8fCB0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpKTsNCgkJCX07DQoNCgkJCXMgPSBleHRlbmQoew0KCQkJCXRoZW1lIDogInNpbXBsZSIsDQoJCQkJbGFuZ3VhZ2UgOiAiZW4iDQoJCQl9LCBzKTsNCg0KCQkJdC5zZXR0aW5ncyA9IHM7DQoNCgkJCS8vIExlZ2FjeSBjYWxsDQoJCQlFdmVudC5hZGQoZG9jdW1lbnQsICdpbml0JywgZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGwsIGNvOw0KDQoJCQkJZXhlY0NhbGxiYWNrKHMsICdvbnBhZ2Vsb2FkJyk7DQoNCgkJCQlzd2l0Y2ggKHMubW9kZSkgew0KCQkJCQljYXNlICJleGFjdCI6DQoJCQkJCQlsID0gcy5lbGVtZW50cyB8fCAnJzsNCg0KCQkJCQkJaWYobC5sZW5ndGggPiAwKSB7DQoJCQkJCQkJZWFjaChleHBsb2RlKGwpLCBmdW5jdGlvbih2KSB7DQoJCQkJCQkJCWlmIChET00uZ2V0KHYpKSB7DQoJCQkJCQkJCQllZCA9IG5ldyB0aW55bWNlLkVkaXRvcih2LCBzKTsNCgkJCQkJCQkJCWVsLnB1c2goZWQpOw0KCQkJCQkJCQkJZWQucmVuZGVyKDEpOw0KCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJZWFjaChkb2N1bWVudC5mb3JtcywgZnVuY3Rpb24oZikgew0KCQkJCQkJCQkJCWVhY2goZi5lbGVtZW50cywgZnVuY3Rpb24oZSkgew0KCQkJCQkJCQkJCQlpZiAoZS5uYW1lID09PSB2KSB7DQoJCQkJCQkJCQkJCQl2ID0gJ21jZV9lZGl0b3JfJyArIGluc3RhbmNlQ291bnRlcisrOw0KCQkJCQkJCQkJCQkJRE9NLnNldEF0dHJpYihlLCAnaWQnLCB2KTsNCg0KCQkJCQkJCQkJCQkJZWQgPSBuZXcgdGlueW1jZS5FZGl0b3Iodiwgcyk7DQoJCQkJCQkJCQkJCQllbC5wdXNoKGVkKTsNCgkJCQkJCQkJCQkJCWVkLnJlbmRlcigxKTsNCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCX0pOw0KCQkJCQkJCQkJfSk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9KTsNCgkJCQkJCX0NCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgInRleHRhcmVhcyI6DQoJCQkJCWNhc2UgInNwZWNpZmljX3RleHRhcmVhcyI6DQoJCQkJCQlmdW5jdGlvbiBoYXNDbGFzcyhuLCBjKSB7DQoJCQkJCQkJcmV0dXJuIGMuY29uc3RydWN0b3IgPT09IFJlZ0V4cCA/IGMudGVzdChuLmNsYXNzTmFtZSkgOiBET00uaGFzQ2xhc3MobiwgYyk7DQoJCQkJCQl9Ow0KDQoJCQkJCQllYWNoKERPTS5zZWxlY3QoJ3RleHRhcmVhJyksIGZ1bmN0aW9uKHYpIHsNCgkJCQkJCQlpZiAocy5lZGl0b3JfZGVzZWxlY3RvciAmJiBoYXNDbGFzcyh2LCBzLmVkaXRvcl9kZXNlbGVjdG9yKSkNCgkJCQkJCQkJcmV0dXJuOw0KDQoJCQkJCQkJaWYgKCFzLmVkaXRvcl9zZWxlY3RvciB8fCBoYXNDbGFzcyh2LCBzLmVkaXRvcl9zZWxlY3RvcikpIHsNCgkJCQkJCQkJLy8gQ2FuIHdlIHVzZSB0aGUgbmFtZQ0KCQkJCQkJCQllID0gRE9NLmdldCh2Lm5hbWUpOw0KCQkJCQkJCQlpZiAoIXYuaWQgJiYgIWUpDQoJCQkJCQkJCQl2LmlkID0gdi5uYW1lOw0KDQoJCQkJCQkJCS8vIEdlbmVyYXRlIHVuaXF1ZSBuYW1lIGlmIG1pc3Npbmcgb3IgYWxyZWFkeSBleGlzdHMNCgkJCQkJCQkJaWYgKCF2LmlkIHx8IHQuZ2V0KHYuaWQpKQ0KCQkJCQkJCQkJdi5pZCA9IERPTS51bmlxdWVJZCgpOw0KDQoJCQkJCQkJCWVkID0gbmV3IHRpbnltY2UuRWRpdG9yKHYuaWQsIHMpOw0KCQkJCQkJCQllbC5wdXNoKGVkKTsNCgkJCQkJCQkJZWQucmVuZGVyKDEpOw0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJLy8gQ2FsbCBvbkluaXQgd2hlbiBhbGwgZWRpdG9ycyBhcmUgaW5pdGlhbGl6ZWQNCgkJCQlpZiAocy5vbmluaXQpIHsNCgkJCQkJbCA9IGNvID0gMDsNCg0KCQkJCQllYWNoKGVsLCBmdW5jdGlvbihlZCkgew0KCQkJCQkJY28rKzsNCg0KCQkJCQkJaWYgKCFlZC5pbml0aWFsaXplZCkgew0KCQkJCQkJCS8vIFdhaXQgZm9yIGl0DQoJCQkJCQkJZWQub25Jbml0LmFkZChmdW5jdGlvbigpIHsNCgkJCQkJCQkJbCsrOw0KDQoJCQkJCQkJCS8vIEFsbCBkb25lDQoJCQkJCQkJCWlmIChsID09IGNvKQ0KCQkJCQkJCQkJZXhlY0NhbGxiYWNrKHMsICdvbmluaXQnKTsNCgkJCQkJCQl9KTsNCgkJCQkJCX0gZWxzZQ0KCQkJCQkJCWwrKzsNCg0KCQkJCQkJLy8gQWxsIGRvbmUNCgkJCQkJCWlmIChsID09IGNvKQ0KCQkJCQkJCWV4ZWNDYWxsYmFjayhzLCAnb25pbml0Jyk7CQkJCQkNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0sDQoNCgkJZ2V0IDogZnVuY3Rpb24oaWQpIHsNCgkJCWlmIChpZCA9PT0gdW5kZWZpbmVkKQ0KCQkJCXJldHVybiB0aGlzLmVkaXRvcnM7DQoNCgkJCXJldHVybiB0aGlzLmVkaXRvcnNbaWRdOw0KCQl9LA0KDQoJCWdldEluc3RhbmNlQnlJZCA6IGZ1bmN0aW9uKGlkKSB7DQoJCQlyZXR1cm4gdGhpcy5nZXQoaWQpOw0KCQl9LA0KDQoJCWFkZCA6IGZ1bmN0aW9uKGVkaXRvcikgew0KCQkJdmFyIHNlbGYgPSB0aGlzLCBlZGl0b3JzID0gc2VsZi5lZGl0b3JzOw0KDQoJCQkvLyBBZGQgbmFtZWQgYW5kIGluZGV4IGVkaXRvciBpbnN0YW5jZQ0KCQkJZWRpdG9yc1tlZGl0b3IuaWRdID0gZWRpdG9yOw0KCQkJZWRpdG9ycy5wdXNoKGVkaXRvcik7DQoNCgkJCXNlbGYuX3NldEFjdGl2ZShlZGl0b3IpOw0KCQkJc2VsZi5vbkFkZEVkaXRvci5kaXNwYXRjaChzZWxmLCBlZGl0b3IpOw0KDQoNCgkJCXJldHVybiBlZGl0b3I7DQoJCX0sDQoNCgkJcmVtb3ZlIDogZnVuY3Rpb24oZWRpdG9yKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGksIGVkaXRvcnMgPSB0LmVkaXRvcnM7DQoNCgkJCS8vIE5vdCBpbiB0aGUgY29sbGVjdGlvbg0KCQkJaWYgKCFlZGl0b3JzW2VkaXRvci5pZF0pDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCWRlbGV0ZSBlZGl0b3JzW2VkaXRvci5pZF07DQoNCgkJCWZvciAoaSA9IDA7IGkgPCBlZGl0b3JzLmxlbmd0aDsgaSsrKSB7DQoJCQkJaWYgKGVkaXRvcnNbaV0gPT0gZWRpdG9yKSB7DQoJCQkJCWVkaXRvcnMuc3BsaWNlKGksIDEpOw0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFNlbGVjdCBhbm90aGVyIGVkaXRvciBzaW5jZSB0aGUgYWN0aXZlIG9uZSB3YXMgcmVtb3ZlZA0KCQkJaWYgKHQuYWN0aXZlRWRpdG9yID09IGVkaXRvcikNCgkJCQl0Ll9zZXRBY3RpdmUoZWRpdG9yc1swXSk7DQoNCgkJCWVkaXRvci5kZXN0cm95KCk7DQoJCQl0Lm9uUmVtb3ZlRWRpdG9yLmRpc3BhdGNoKHQsIGVkaXRvcik7DQoNCgkJCXJldHVybiBlZGl0b3I7DQoJCX0sDQoNCgkJZXhlY0NvbW1hbmQgOiBmdW5jdGlvbihjLCB1LCB2KSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5nZXQodiksIHc7DQoNCgkJCS8vIE1hbmFnZXIgY29tbWFuZHMNCgkJCXN3aXRjaCAoYykgew0KCQkJCWNhc2UgIm1jZUZvY3VzIjoNCgkJCQkJZWQuZm9jdXMoKTsNCgkJCQkJcmV0dXJuIHRydWU7DQoNCgkJCQljYXNlICJtY2VBZGRFZGl0b3IiOg0KCQkJCWNhc2UgIm1jZUFkZENvbnRyb2wiOg0KCQkJCQlpZiAoIXQuZ2V0KHYpKQ0KCQkJCQkJbmV3IHRpbnltY2UuRWRpdG9yKHYsIHQuc2V0dGluZ3MpLnJlbmRlcigpOw0KDQoJCQkJCXJldHVybiB0cnVlOw0KDQoJCQkJY2FzZSAibWNlQWRkRnJhbWVDb250cm9sIjoNCgkJCQkJdyA9IHYud2luZG93Ow0KDQoJCQkJCS8vIEFkZCB0aW55TUNFIGdsb2JhbCBpbnN0YW5jZSBhbmQgdGlueW1jZSBuYW1lc3BhY2UgdG8gc3BlY2lmaWVkIHdpbmRvdw0KCQkJCQl3LnRpbnlNQ0UgPSB0aW55TUNFOw0KCQkJCQl3LnRpbnltY2UgPSB0aW55bWNlOw0KDQoJCQkJCXRpbnltY2UuRE9NLmRvYyA9IHcuZG9jdW1lbnQ7DQoJCQkJCXRpbnltY2UuRE9NLndpbiA9IHc7DQoNCgkJCQkJZWQgPSBuZXcgdGlueW1jZS5FZGl0b3Iodi5lbGVtZW50X2lkLCB2KTsNCgkJCQkJZWQucmVuZGVyKCk7DQoNCgkJCQkJLy8gRml4IElFIG1lbW9yeSBsZWFrcw0KCQkJCQlpZiAodGlueW1jZS5pc0lFKSB7DQoJCQkJCQlmdW5jdGlvbiBjbHIoKSB7DQoJCQkJCQkJZWQuZGVzdHJveSgpOw0KCQkJCQkJCXcuZGV0YWNoRXZlbnQoJ29udW5sb2FkJywgY2xyKTsNCgkJCQkJCQl3ID0gdy50aW55TUNFID0gdy50aW55bWNlID0gbnVsbDsgLy8gSUUgbGVhaw0KCQkJCQkJfTsNCg0KCQkJCQkJdy5hdHRhY2hFdmVudCgnb251bmxvYWQnLCBjbHIpOw0KCQkJCQl9DQoNCgkJCQkJdi5wYWdlX3dpbmRvdyA9IG51bGw7DQoNCgkJCQkJcmV0dXJuIHRydWU7DQoNCgkJCQljYXNlICJtY2VSZW1vdmVFZGl0b3IiOg0KCQkJCWNhc2UgIm1jZVJlbW92ZUNvbnRyb2wiOg0KCQkJCQlpZiAoZWQpDQoJCQkJCQllZC5yZW1vdmUoKTsNCg0KCQkJCQlyZXR1cm4gdHJ1ZTsNCg0KCQkJCWNhc2UgJ21jZVRvZ2dsZUVkaXRvcic6DQoJCQkJCWlmICghZWQpIHsNCgkJCQkJCXQuZXhlY0NvbW1hbmQoJ21jZUFkZENvbnRyb2wnLCAwLCB2KTsNCgkJCQkJCXJldHVybiB0cnVlOw0KCQkJCQl9DQoNCgkJCQkJaWYgKGVkLmlzSGlkZGVuKCkpDQoJCQkJCQllZC5zaG93KCk7DQoJCQkJCWVsc2UNCgkJCQkJCWVkLmhpZGUoKTsNCg0KCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCg0KCQkJLy8gUnVuIGNvbW1hbmQgb24gYWN0aXZlIGVkaXRvcg0KCQkJaWYgKHQuYWN0aXZlRWRpdG9yKQ0KCQkJCXJldHVybiB0LmFjdGl2ZUVkaXRvci5leGVjQ29tbWFuZChjLCB1LCB2KTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9LA0KDQoJCWV4ZWNJbnN0YW5jZUNvbW1hbmQgOiBmdW5jdGlvbihpZCwgYywgdSwgdikgew0KCQkJdmFyIGVkID0gdGhpcy5nZXQoaWQpOw0KDQoJCQlpZiAoZWQpDQoJCQkJcmV0dXJuIGVkLmV4ZWNDb21tYW5kKGMsIHUsIHYpOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0sDQoNCgkJdHJpZ2dlclNhdmUgOiBmdW5jdGlvbigpIHsNCgkJCWVhY2godGhpcy5lZGl0b3JzLCBmdW5jdGlvbihlKSB7DQoJCQkJZS5zYXZlKCk7DQoJCQl9KTsNCgkJfSwNCg0KCQlhZGRJMThuIDogZnVuY3Rpb24ocCwgbykgew0KCQkJdmFyIGxvLCBpMThuID0gdGhpcy5pMThuOw0KDQoJCQlpZiAoIXRpbnltY2UuaXMocCwgJ3N0cmluZycpKSB7DQoJCQkJZWFjaChwLCBmdW5jdGlvbihvLCBsYykgew0KCQkJCQllYWNoKG8sIGZ1bmN0aW9uKG8sIGcpIHsNCgkJCQkJCWVhY2gobywgZnVuY3Rpb24obywgaykgew0KCQkJCQkJCWlmIChnID09PSAnY29tbW9uJykNCgkJCQkJCQkJaTE4bltsYyArICcuJyArIGtdID0gbzsNCgkJCQkJCQllbHNlDQoJCQkJCQkJCWkxOG5bbGMgKyAnLicgKyBnICsgJy4nICsga10gPSBvOw0KCQkJCQkJfSk7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfSBlbHNlIHsNCgkJCQllYWNoKG8sIGZ1bmN0aW9uKG8sIGspIHsNCgkJCQkJaTE4bltwICsgJy4nICsga10gPSBvOw0KCQkJCX0pOw0KCQkJfQ0KCQl9LA0KDQoJCS8vIFByaXZhdGUgbWV0aG9kcw0KDQoJCV9zZXRBY3RpdmUgOiBmdW5jdGlvbihlZGl0b3IpIHsNCgkJCXRoaXMuc2VsZWN0ZWRJbnN0YW5jZSA9IHRoaXMuYWN0aXZlRWRpdG9yID0gZWRpdG9yOw0KCQl9DQoJfSk7DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgkvLyBTaG9ydGVuIHRoZXNlIG5hbWVzDQoJdmFyIERPTSA9IHRpbnltY2UuRE9NLCBFdmVudCA9IHRpbnltY2UuZG9tLkV2ZW50LCBleHRlbmQgPSB0aW55bWNlLmV4dGVuZCwNCgkJRGlzcGF0Y2hlciA9IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyLCBlYWNoID0gdGlueW1jZS5lYWNoLCBpc0dlY2tvID0gdGlueW1jZS5pc0dlY2tvLA0KCQlpc0lFID0gdGlueW1jZS5pc0lFLCBpc1dlYktpdCA9IHRpbnltY2UuaXNXZWJLaXQsIGlzID0gdGlueW1jZS5pcywNCgkJVGhlbWVNYW5hZ2VyID0gdGlueW1jZS5UaGVtZU1hbmFnZXIsIFBsdWdpbk1hbmFnZXIgPSB0aW55bWNlLlBsdWdpbk1hbmFnZXIsDQoJCWluQXJyYXkgPSB0aW55bWNlLmluQXJyYXksIGdyZXAgPSB0aW55bWNlLmdyZXAsIGV4cGxvZGUgPSB0aW55bWNlLmV4cGxvZGU7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5FZGl0b3InLCB7DQoJCUVkaXRvciA6IGZ1bmN0aW9uKGlkLCBzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCXQuaWQgPSB0LmVkaXRvcklkID0gaWQ7DQoNCgkJCXQuZXhlY0NvbW1hbmRzID0ge307DQoJCQl0LnF1ZXJ5U3RhdGVDb21tYW5kcyA9IHt9Ow0KCQkJdC5xdWVyeVZhbHVlQ29tbWFuZHMgPSB7fTsNCg0KCQkJdC5pc05vdERpcnR5ID0gZmFsc2U7DQoNCgkJCXQucGx1Z2lucyA9IHt9Ow0KDQoJCQkvLyBBZGQgZXZlbnRzIHRvIHRoZSBlZGl0b3INCgkJCWVhY2goWw0KCQkJCSdvblByZUluaXQnLA0KDQoJCQkJJ29uQmVmb3JlUmVuZGVyVUknLA0KDQoJCQkJJ29uUG9zdFJlbmRlcicsDQoNCgkJCQknb25Jbml0JywNCg0KCQkJCSdvblJlbW92ZScsDQoNCgkJCQknb25BY3RpdmF0ZScsDQoNCgkJCQknb25EZWFjdGl2YXRlJywNCg0KCQkJCSdvbkNsaWNrJywNCg0KCQkJCSdvbkV2ZW50JywNCg0KCQkJCSdvbk1vdXNlVXAnLA0KDQoJCQkJJ29uTW91c2VEb3duJywNCg0KCQkJCSdvbkRibENsaWNrJywNCg0KCQkJCSdvbktleURvd24nLA0KDQoJCQkJJ29uS2V5VXAnLA0KDQoJCQkJJ29uS2V5UHJlc3MnLA0KDQoJCQkJJ29uQ29udGV4dE1lbnUnLA0KDQoJCQkJJ29uU3VibWl0JywNCg0KCQkJCSdvblJlc2V0JywNCg0KCQkJCSdvblBhc3RlJywNCg0KCQkJCSdvblByZVByb2Nlc3MnLA0KDQoJCQkJJ29uUG9zdFByb2Nlc3MnLA0KDQoJCQkJJ29uQmVmb3JlU2V0Q29udGVudCcsDQoNCgkJCQknb25CZWZvcmVHZXRDb250ZW50JywNCg0KCQkJCSdvblNldENvbnRlbnQnLA0KDQoJCQkJJ29uR2V0Q29udGVudCcsDQoNCgkJCQknb25Mb2FkQ29udGVudCcsDQoNCgkJCQknb25TYXZlQ29udGVudCcsDQoNCgkJCQknb25Ob2RlQ2hhbmdlJywNCg0KCQkJCSdvbkNoYW5nZScsDQoNCgkJCQknb25CZWZvcmVFeGVjQ29tbWFuZCcsDQoNCgkJCQknb25FeGVjQ29tbWFuZCcsDQoNCgkJCQknb25VbmRvJywNCg0KCQkJCSdvblJlZG8nLA0KDQoJCQkJJ29uVmlzdWFsQWlkJywNCg0KCQkJCSdvblNldFByb2dyZXNzU3RhdGUnDQoJCQldLCBmdW5jdGlvbihlKSB7DQoJCQkJdFtlXSA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KCQkJfSk7DQoNCgkJCXQuc2V0dGluZ3MgPSBzID0gZXh0ZW5kKHsNCgkJCQlpZCA6IGlkLA0KCQkJCWxhbmd1YWdlIDogJ2VuJywNCgkJCQlkb2NzX2xhbmd1YWdlIDogJ2VuJywNCgkJCQl0aGVtZSA6ICdzaW1wbGUnLA0KCQkJCXNraW4gOiAnZGVmYXVsdCcsDQoJCQkJZGVsdGFfd2lkdGggOiAwLA0KCQkJCWRlbHRhX2hlaWdodCA6IDAsDQoJCQkJcG9wdXBfY3NzIDogJycsDQoJCQkJcGx1Z2lucyA6ICcnLA0KCQkJCWRvY3VtZW50X2Jhc2VfdXJsIDogdGlueW1jZS5kb2N1bWVudEJhc2VVUkwsDQoJCQkJYWRkX2Zvcm1fc3VibWl0X3RyaWdnZXIgOiAxLA0KCQkJCXN1Ym1pdF9wYXRjaCA6IDEsDQoJCQkJYWRkX3VubG9hZF90cmlnZ2VyIDogMSwNCgkJCQljb252ZXJ0X3VybHMgOiAxLA0KCQkJCXJlbGF0aXZlX3VybHMgOiAxLA0KCQkJCXJlbW92ZV9zY3JpcHRfaG9zdCA6IDEsDQoJCQkJdGFibGVfaW5saW5lX2VkaXRpbmcgOiAwLA0KCQkJCW9iamVjdF9yZXNpemluZyA6IDEsDQoJCQkJY2xlYW51cCA6IDEsDQoJCQkJYWNjZXNzaWJpbGl0eV9mb2N1cyA6IDEsDQoJCQkJY3VzdG9tX3Nob3J0Y3V0cyA6IDEsDQoJCQkJY3VzdG9tX3VuZG9fcmVkb19rZXlib2FyZF9zaG9ydGN1dHMgOiAxLA0KCQkJCWN1c3RvbV91bmRvX3JlZG9fcmVzdG9yZV9zZWxlY3Rpb24gOiAxLA0KCQkJCWN1c3RvbV91bmRvX3JlZG8gOiAxLA0KCQkJCWRvY3R5cGUgOiB0aW55bWNlLmlzSUU2ID8gJzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPicgOiAnPCFET0NUWVBFPicsIC8vIFVzZSBvbGQgZG9jdHlwZSBvbiBJRSA2IHRvIGF2b2lkIGhvcml6b250YWwgc2Nyb2xsDQoJCQkJdmlzdWFsX3RhYmxlX2NsYXNzIDogJ21jZUl0ZW1UYWJsZScsDQoJCQkJdmlzdWFsIDogMSwNCgkJCQlmb250X3NpemVfc3R5bGVfdmFsdWVzIDogJ3h4LXNtYWxsLHgtc21hbGwsc21hbGwsbWVkaXVtLGxhcmdlLHgtbGFyZ2UseHgtbGFyZ2UnLA0KCQkJCWFwcGx5X3NvdXJjZV9mb3JtYXR0aW5nIDogMSwNCgkJCQlkaXJlY3Rpb25hbGl0eSA6ICdsdHInLA0KCQkJCWZvcmNlZF9yb290X2Jsb2NrIDogJ3AnLA0KCQkJCXZhbGlkX2VsZW1lbnRzIDogJ0BbaWR8Y2xhc3N8c3R5bGV8dGl0bGV8ZGlyPGx0cj9ydGx8bGFuZ3x4bWw6Omxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ubW91c2Vkb3dufG9ubW91c2V1cHxvbm1vdXNlb3Zlcnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ua2V5cHJlc3N8b25rZXlkb3dufG9ua2V5dXBdLGFbcmVsfHJldnxjaGFyc2V0fGhyZWZsYW5nfHRhYmluZGV4fGFjY2Vzc2tleXx0eXBlfG5hbWV8aHJlZnx0YXJnZXR8dGl0bGV8Y2xhc3N8b25mb2N1c3xvbmJsdXJdLHN0cm9uZy9iLGVtL2ksc3RyaWtlLHUsI3AsLW9sW3R5cGV8Y29tcGFjdF0sLXVsW3R5cGV8Y29tcGFjdF0sLWxpLGJyLGltZ1tsb25nZGVzY3x1c2VtYXB8c3JjfGJvcmRlcnxhbHQ9fHRpdGxlfGhzcGFjZXx2c3BhY2V8d2lkdGh8aGVpZ2h0fGFsaWduXSwtc3ViLC1zdXAsLWJsb2NrcXVvdGVbY2l0ZV0sLXRhYmxlW2JvcmRlcnxjZWxsc3BhY2luZ3xjZWxscGFkZGluZ3x3aWR0aHxmcmFtZXxydWxlc3xoZWlnaHR8YWxpZ258c3VtbWFyeXxiZ2NvbG9yfGJhY2tncm91bmR8Ym9yZGVyY29sb3JdLC10cltyb3dzcGFufHdpZHRofGhlaWdodHxhbGlnbnx2YWxpZ258Ymdjb2xvcnxiYWNrZ3JvdW5kfGJvcmRlcmNvbG9yXSx0Ym9keSx0aGVhZCx0Zm9vdCwjdGRbY29sc3Bhbnxyb3dzcGFufHdpZHRofGhlaWdodHxhbGlnbnx2YWxpZ258Ymdjb2xvcnxiYWNrZ3JvdW5kfGJvcmRlcmNvbG9yfHNjb3BlXSwjdGhbY29sc3Bhbnxyb3dzcGFufHdpZHRofGhlaWdodHxhbGlnbnx2YWxpZ258c2NvcGVdLGNhcHRpb24sLWRpdiwtc3BhbiwtY29kZSwtcHJlLGFkZHJlc3MsLWgxLC1oMiwtaDMsLWg0LC1oNSwtaDYsaHJbc2l6ZXxub3NoYWRlXSwtZm9udFtmYWNlfHNpemV8Y29sb3JdLGRkLGRsLGR0LGNpdGUsYWJicixhY3JvbnltLGRlbFtkYXRldGltZXxjaXRlXSxpbnNbZGF0ZXRpbWV8Y2l0ZV0sb2JqZWN0W2NsYXNzaWR8d2lkdGh8aGVpZ2h0fGNvZGViYXNlfCpdLHBhcmFtW25hbWV8dmFsdWVdLGVtYmVkW3R5cGV8d2lkdGh8aGVpZ2h0fHNyY3wqXSxzY3JpcHRbc3JjfHR5cGVdLG1hcFtuYW1lXSxhcmVhW3NoYXBlfGNvb3Jkc3xocmVmfGFsdHx0YXJnZXRdLGJkbyxidXR0b24sY29sW2FsaWdufGNoYXJ8Y2hhcm9mZnxzcGFufHZhbGlnbnx3aWR0aF0sY29sZ3JvdXBbYWxpZ258Y2hhcnxjaGFyb2ZmfHNwYW58dmFsaWdufHdpZHRoXSxkZm4sZmllbGRzZXQsZm9ybVthY3Rpb258YWNjZXB0fGFjY2VwdC1jaGFyc2V0fGVuY3R5cGV8bWV0aG9kXSxpbnB1dFthY2NlcHR8YWx0fGNoZWNrZWR8ZGlzYWJsZWR8bWF4bGVuZ3RofG5hbWV8cmVhZG9ubHl8c2l6ZXxzcmN8dHlwZXx2YWx1ZXx0YWJpbmRleHxhY2Nlc3NrZXldLGtiZCxsYWJlbFtmb3JdLGxlZ2VuZCxub3NjcmlwdCxvcHRncm91cFtsYWJlbHxkaXNhYmxlZF0sb3B0aW9uW2Rpc2FibGVkfGxhYmVsfHNlbGVjdGVkfHZhbHVlXSxxW2NpdGVdLHNhbXAsc2VsZWN0W2Rpc2FibGVkfG11bHRpcGxlfG5hbWV8c2l6ZV0sc21hbGwsdGV4dGFyZWFbY29sc3xyb3dzfGRpc2FibGVkfG5hbWV8cmVhZG9ubHldLHR0LHZhcixiaWcnLA0KCQkJCWhpZGRlbl9pbnB1dCA6IDEsDQoJCQkJcGFkZF9lbXB0eV9lZGl0b3IgOiAxLA0KCQkJCXJlbmRlcl91aSA6IDEsDQoJCQkJaW5pdF90aGVtZSA6IDEsDQoJCQkJZm9yY2VfcF9uZXdsaW5lcyA6IDEsDQoJCQkJaW5kZW50YXRpb24gOiAnMzBweCcsDQoJCQkJa2VlcF9zdHlsZXMgOiAxLA0KCQkJCWZpeF90YWJsZV9lbGVtZW50cyA6IDEsDQoJCQkJaW5saW5lX3N0eWxlcyA6IDEsDQoJCQkJY29udmVydF9mb250c190b19zcGFucyA6IHRydWUNCgkJCX0sIHMpOw0KDQoJCQl0LmRvY3VtZW50QmFzZVVSSSA9IG5ldyB0aW55bWNlLnV0aWwuVVJJKHMuZG9jdW1lbnRfYmFzZV91cmwgfHwgdGlueW1jZS5kb2N1bWVudEJhc2VVUkwsIHsNCgkJCQliYXNlX3VyaSA6IHRpbnlNQ0UuYmFzZVVSSQ0KCQkJfSk7DQoNCgkJCXQuYmFzZVVSSSA9IHRpbnltY2UuYmFzZVVSSTsNCg0KCQkJLy8gQ2FsbCBzZXR1cA0KCQkJdC5leGVjQ2FsbGJhY2soJ3NldHVwJywgdCk7DQoJCX0sDQoNCgkJcmVuZGVyIDogZnVuY3Rpb24obnN0KSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzLCBpZCA9IHQuaWQsIHNsID0gdGlueW1jZS5TY3JpcHRMb2FkZXI7DQoNCgkJCS8vIFBhZ2UgaXMgbm90IGxvYWRlZCB5ZXQsIHdhaXQgZm9yIGl0DQoJCQlpZiAoIUV2ZW50LmRvbUxvYWRlZCkgew0KCQkJCUV2ZW50LmFkZChkb2N1bWVudCwgJ2luaXQnLCBmdW5jdGlvbigpIHsNCgkJCQkJdC5yZW5kZXIoKTsNCgkJCQl9KTsNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCXRpbnlNQ0Uuc2V0dGluZ3MgPSBzOw0KDQoJCQkvLyBFbGVtZW50IG5vdCBmb3VuZCwgdGhlbiBza2lwIGluaXRpYWxpemF0aW9uDQoJCQlpZiAoIXQuZ2V0RWxlbWVudCgpKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gSXMgYSBpUGFkL2lQaG9uZSwgdGhlbiBza2lwIGluaXRpYWxpemF0aW9uLiBXZSBuZWVkIHRvIHNuaWZmIGhlcmUgc2luY2UgdGhlDQoJCQkvLyBicm93c2VyIHNheXMgaXQgaGFzIGNvbnRlbnRFZGl0YWJsZSBzdXBwb3J0IGJ1dCB0aGVyZSBpcyBubyB2aXNpYmxlIGNhcmV0DQoJCQkvLyBXZSB3aWxsIHJlbW92ZSB0aGlzIGNoZWNrIG9uZXMgQXBwbGUgaW1wbGVtZW50cyBmdWxsIGNvbnRlbnRFZGl0YWJsZSBzdXBwb3J0DQoJCQlpZiAodGlueW1jZS5pc0lEZXZpY2UpDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBBZGQgaGlkZGVuIGlucHV0IGZvciBub24gaW5wdXQgZWxlbWVudHMgaW5zaWRlIGZvcm0gZWxlbWVudHMNCgkJCWlmICghL1RFWFRBUkVBfElOUFVUL2kudGVzdCh0LmdldEVsZW1lbnQoKS5ub2RlTmFtZSkgJiYgcy5oaWRkZW5faW5wdXQgJiYgRE9NLmdldFBhcmVudChpZCwgJ2Zvcm0nKSkNCgkJCQlET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZSgnaW5wdXQnLCB7dHlwZSA6ICdoaWRkZW4nLCBuYW1lIDogaWR9KSwgaWQpOw0KDQoJCQlpZiAodGlueW1jZS5XaW5kb3dNYW5hZ2VyKQ0KCQkJCXQud2luZG93TWFuYWdlciA9IG5ldyB0aW55bWNlLldpbmRvd01hbmFnZXIodCk7DQoNCgkJCWlmIChzLmVuY29kaW5nID09ICd4bWwnKSB7DQoJCQkJdC5vbkdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCWlmIChvLnNhdmUpDQoJCQkJCQlvLmNvbnRlbnQgPSBET00uZW5jb2RlKG8uY29udGVudCk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLmFkZF9mb3JtX3N1Ym1pdF90cmlnZ2VyKSB7DQoJCQkJdC5vblN1Ym1pdC5hZGRUb1RvcChmdW5jdGlvbigpIHsNCgkJCQkJaWYgKHQuaW5pdGlhbGl6ZWQpIHsNCgkJCQkJCXQuc2F2ZSgpOw0KCQkJCQkJdC5pc05vdERpcnR5ID0gMTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5hZGRfdW5sb2FkX3RyaWdnZXIpIHsNCgkJCQl0Ll9iZWZvcmVVbmxvYWQgPSB0aW55TUNFLm9uQmVmb3JlVW5sb2FkLmFkZChmdW5jdGlvbigpIHsNCgkJCQkJaWYgKHQuaW5pdGlhbGl6ZWQgJiYgIXQuZGVzdHJveWVkICYmICF0LmlzSGlkZGVuKCkpDQoJCQkJCQl0LnNhdmUoe2Zvcm1hdCA6ICdyYXcnLCBub19ldmVudHMgOiB0cnVlfSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXRpbnltY2UuYWRkVW5sb2FkKHQuZGVzdHJveSwgdCk7DQoNCgkJCWlmIChzLnN1Ym1pdF9wYXRjaCkgew0KCQkJCXQub25CZWZvcmVSZW5kZXJVSS5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCXZhciBuID0gdC5nZXRFbGVtZW50KCkuZm9ybTsNCg0KCQkJCQlpZiAoIW4pDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJLy8gQWxyZWFkeSBwYXRjaGVkDQoJCQkJCWlmIChuLl9tY2VPbGRTdWJtaXQpDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJLy8gQ2hlY2sgcGFnZSB1c2VzIGlkPSJzdWJtaXQiIG9yIG5hbWU9InN1Ym1pdCIgZm9yIGl0J3Mgc3VibWl0IGJ1dHRvbg0KCQkJCQlpZiAoIW4uc3VibWl0Lm5vZGVUeXBlICYmICFuLnN1Ym1pdC5sZW5ndGgpIHsNCgkJCQkJCXQuZm9ybUVsZW1lbnQgPSBuOw0KCQkJCQkJbi5fbWNlT2xkU3VibWl0ID0gbi5zdWJtaXQ7DQoJCQkJCQluLnN1Ym1pdCA9IGZ1bmN0aW9uKCkgew0KCQkJCQkJCS8vIFNhdmUgYWxsIGluc3RhbmNlcw0KCQkJCQkJCXRpbnltY2UudHJpZ2dlclNhdmUoKTsNCgkJCQkJCQl0LmlzTm90RGlydHkgPSAxOw0KDQoJCQkJCQkJcmV0dXJuIHQuZm9ybUVsZW1lbnQuX21jZU9sZFN1Ym1pdCh0LmZvcm1FbGVtZW50KTsNCgkJCQkJCX07DQoJCQkJCX0NCg0KCQkJCQluID0gbnVsbDsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gTG9hZCBzY3JpcHRzDQoJCQlmdW5jdGlvbiBsb2FkU2NyaXB0cygpIHsNCgkJCQlpZiAocy5sYW5ndWFnZSkNCgkJCQkJc2wuYWRkKHRpbnltY2UuYmFzZVVSTCArICcvbGFuZ3MvJyArIHMubGFuZ3VhZ2UgKyAnLmpzJyk7DQoNCgkJCQlpZiAocy50aGVtZSAmJiBzLnRoZW1lLmNoYXJBdCgwKSAhPSAnLScgJiYgIVRoZW1lTWFuYWdlci51cmxzW3MudGhlbWVdKQ0KCQkJCQlUaGVtZU1hbmFnZXIubG9hZChzLnRoZW1lLCAndGhlbWVzLycgKyBzLnRoZW1lICsgJy9lZGl0b3JfdGVtcGxhdGUnICsgdGlueW1jZS5zdWZmaXggKyAnLmpzJyk7DQoNCgkJCQllYWNoKGV4cGxvZGUocy5wbHVnaW5zKSwgZnVuY3Rpb24ocCkgew0KCQkJCQlpZiAocCAmJiBwLmNoYXJBdCgwKSAhPSAnLScgJiYgIVBsdWdpbk1hbmFnZXIudXJsc1twXSkgew0KCQkJCQkJLy8gU2tpcCBzYWZhcmkgcGx1Z2luLCBzaW5jZSBpdCBpcyByZW1vdmVkIGFzIG9mIDMuM2IxDQoJCQkJCQlpZiAocCA9PSAnc2FmYXJpJykNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCVBsdWdpbk1hbmFnZXIubG9hZChwLCAncGx1Z2lucy8nICsgcCArICcvZWRpdG9yX3BsdWdpbicgKyB0aW55bWNlLnN1ZmZpeCArICcuanMnKTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJLy8gSW5pdCB3aGVuIHF1ZSBpcyBsb2FkZWQNCgkJCQlzbC5sb2FkUXVldWUoZnVuY3Rpb24oKSB7DQoJCQkJCWlmICghdC5yZW1vdmVkKQ0KCQkJCQkJdC5pbml0KCk7DQoJCQkJfSk7DQoJCQl9Ow0KDQoJCQlsb2FkU2NyaXB0cygpOw0KCQl9LA0KDQoJCWluaXQgOiBmdW5jdGlvbigpIHsNCgkJCXZhciBuLCB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3MsIHcsIGgsIGUgPSB0LmdldEVsZW1lbnQoKSwgbywgdGksIHUsIGJpLCBiYywgcmU7DQoNCgkJCXRpbnltY2UuYWRkKHQpOw0KDQoJCQlpZiAocy50aGVtZSkgew0KCQkJCXMudGhlbWUgPSBzLnRoZW1lLnJlcGxhY2UoLy0vLCAnJyk7DQoJCQkJbyA9IFRoZW1lTWFuYWdlci5nZXQocy50aGVtZSk7DQoJCQkJdC50aGVtZSA9IG5ldyBvKCk7DQoNCgkJCQlpZiAodC50aGVtZS5pbml0ICYmIHMuaW5pdF90aGVtZSkNCgkJCQkJdC50aGVtZS5pbml0KHQsIFRoZW1lTWFuYWdlci51cmxzW3MudGhlbWVdIHx8IHRpbnltY2UuZG9jdW1lbnRCYXNlVVJMLnJlcGxhY2UoL1wvJC8sICcnKSk7DQoJCQl9DQoNCgkJCS8vIENyZWF0ZSBhbGwgcGx1Z2lucw0KCQkJZWFjaChleHBsb2RlKHMucGx1Z2lucy5yZXBsYWNlKC9cLS9nLCAnJykpLCBmdW5jdGlvbihwKSB7DQoJCQkJdmFyIGMgPSBQbHVnaW5NYW5hZ2VyLmdldChwKSwgdSA9IFBsdWdpbk1hbmFnZXIudXJsc1twXSB8fCB0aW55bWNlLmRvY3VtZW50QmFzZVVSTC5yZXBsYWNlKC9cLyQvLCAnJyksIHBvOw0KDQoJCQkJaWYgKGMpIHsNCgkJCQkJcG8gPSBuZXcgYyh0LCB1KTsNCg0KCQkJCQl0LnBsdWdpbnNbcF0gPSBwbzsNCg0KCQkJCQlpZiAocG8uaW5pdCkNCgkJCQkJCXBvLmluaXQodCwgdSk7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCS8vIFNldHVwIHBvcHVwIENTUyBwYXRoKHMpDQoJCQlpZiAocy5wb3B1cF9jc3MgIT09IGZhbHNlKSB7DQoJCQkJaWYgKHMucG9wdXBfY3NzKQ0KCQkJCQlzLnBvcHVwX2NzcyA9IHQuZG9jdW1lbnRCYXNlVVJJLnRvQWJzb2x1dGUocy5wb3B1cF9jc3MpOw0KCQkJCWVsc2UNCgkJCQkJcy5wb3B1cF9jc3MgPSB0LmJhc2VVUkkudG9BYnNvbHV0ZSgidGhlbWVzLyIgKyBzLnRoZW1lICsgIi9za2lucy8iICsgcy5za2luICsgIi9kaWFsb2cuY3NzIik7DQoJCQl9DQoNCgkJCWlmIChzLnBvcHVwX2Nzc19hZGQpDQoJCQkJcy5wb3B1cF9jc3MgKz0gJywnICsgdC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZShzLnBvcHVwX2Nzc19hZGQpOw0KDQoJCQl0LmNvbnRyb2xNYW5hZ2VyID0gbmV3IHRpbnltY2UuQ29udHJvbE1hbmFnZXIodCk7DQoNCgkJCWlmIChzLmN1c3RvbV91bmRvX3JlZG8pIHsNCgkJCQkvLyBBZGQgaW5pdGlhbCB1bmRvIGxldmVsDQoJCQkJdC5vbkJlZm9yZUV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihlZCwgY21kLCB1aSwgdmFsLCBhKSB7DQoJCQkJCWlmIChjbWQgIT0gJ1VuZG8nICYmIGNtZCAhPSAnUmVkbycgJiYgY21kICE9ICdtY2VSZXBhaW50JyAmJiAoIWEgfHwgIWEuc2tpcF91bmRvKSkgew0KCQkJCQkJaWYgKCF0LnVuZG9NYW5hZ2VyLmhhc1VuZG8oKSkNCgkJCQkJCQl0LnVuZG9NYW5hZ2VyLmFkZCgpOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQl0Lm9uRXhlY0NvbW1hbmQuYWRkKGZ1bmN0aW9uKGVkLCBjbWQsIHVpLCB2YWwsIGEpIHsNCgkJCQkJaWYgKGNtZCAhPSAnVW5kbycgJiYgY21kICE9ICdSZWRvJyAmJiBjbWQgIT0gJ21jZVJlcGFpbnQnICYmICghYSB8fCAhYS5za2lwX3VuZG8pKQ0KCQkJCQkJdC51bmRvTWFuYWdlci5hZGQoKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJdC5vbkV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihlZCwgYykgew0KCQkJCS8vIERvbid0IHJlZnJlc2ggdGhlIHNlbGVjdCBsaXN0cyB1bnRpbCBjYXJldCBtb3ZlDQoJCQkJaWYgKCEvXihGb250TmFtZXxGb250U2l6ZSkkLy50ZXN0KGMpKQ0KCQkJCQl0Lm5vZGVDaGFuZ2VkKCk7DQoJCQl9KTsNCg0KCQkJLy8gUmVtb3ZlIGdob3N0IHNlbGVjdGlvbnMgb24gaW1hZ2VzIGFuZCB0YWJsZXMgaW4gR2Vja28NCgkJCWlmIChpc0dlY2tvKSB7DQoJCQkJZnVuY3Rpb24gcmVwYWludChhLCBvKSB7DQoJCQkJCWlmICghbyB8fCAhby5pbml0aWFsKQ0KCQkJCQkJdC5leGVjQ29tbWFuZCgnbWNlUmVwYWludCcpOw0KCQkJCX07DQoNCgkJCQl0Lm9uVW5kby5hZGQocmVwYWludCk7DQoJCQkJdC5vblJlZG8uYWRkKHJlcGFpbnQpOw0KCQkJCXQub25TZXRDb250ZW50LmFkZChyZXBhaW50KTsNCgkJCX0NCg0KCQkJLy8gRW5hYmxlcyB1c2VycyB0byBvdmVycmlkZSB0aGUgY29udHJvbCBmYWN0b3J5DQoJCQl0Lm9uQmVmb3JlUmVuZGVyVUkuZGlzcGF0Y2godCwgdC5jb250cm9sTWFuYWdlcik7DQoNCgkJCS8vIE1lYXN1cmUgYm94DQoJCQlpZiAocy5yZW5kZXJfdWkpIHsNCgkJCQl3ID0gcy53aWR0aCB8fCBlLnN0eWxlLndpZHRoIHx8IGUub2Zmc2V0V2lkdGg7DQoJCQkJaCA9IHMuaGVpZ2h0IHx8IGUuc3R5bGUuaGVpZ2h0IHx8IGUub2Zmc2V0SGVpZ2h0Ow0KCQkJCXQub3JnRGlzcGxheSA9IGUuc3R5bGUuZGlzcGxheTsNCgkJCQlyZSA9IC9eWzAtOVwuXSsofHB4KSQvaTsNCg0KCQkJCWlmIChyZS50ZXN0KCcnICsgdykpDQoJCQkJCXcgPSBNYXRoLm1heChwYXJzZUludCh3KSArIChvLmRlbHRhV2lkdGggfHwgMCksIDEwMCk7DQoNCgkJCQlpZiAocmUudGVzdCgnJyArIGgpKQ0KCQkJCQloID0gTWF0aC5tYXgocGFyc2VJbnQoaCkgKyAoby5kZWx0YUhlaWdodCB8fCAwKSwgMTAwKTsNCg0KCQkJCS8vIFJlbmRlciBVSQ0KCQkJCW8gPSB0LnRoZW1lLnJlbmRlclVJKHsNCgkJCQkJdGFyZ2V0Tm9kZSA6IGUsDQoJCQkJCXdpZHRoIDogdywNCgkJCQkJaGVpZ2h0IDogaCwNCgkJCQkJZGVsdGFXaWR0aCA6IHMuZGVsdGFfd2lkdGgsDQoJCQkJCWRlbHRhSGVpZ2h0IDogcy5kZWx0YV9oZWlnaHQNCgkJCQl9KTsNCg0KCQkJCXQuZWRpdG9yQ29udGFpbmVyID0gby5lZGl0b3JDb250YWluZXI7DQoJCQl9DQoNCg0KCQkJLy8gVXNlciBzcGVjaWZpZWQgYSBkb2N1bWVudC5kb21haW4gdmFsdWUNCgkJCWlmIChkb2N1bWVudC5kb21haW4gJiYgbG9jYXRpb24uaG9zdG5hbWUgIT0gZG9jdW1lbnQuZG9tYWluKQ0KCQkJCXRpbnltY2UucmVsYXhlZERvbWFpbiA9IGRvY3VtZW50LmRvbWFpbjsNCg0KCQkJLy8gUmVzaXplIGVkaXRvcg0KCQkJRE9NLnNldFN0eWxlcyhvLnNpemVDb250YWluZXIgfHwgby5lZGl0b3JDb250YWluZXIsIHsNCgkJCQl3aWR0aCA6IHcsDQoJCQkJaGVpZ2h0IDogaA0KCQkJfSk7DQoNCgkJCWggPSAoby5pZnJhbWVIZWlnaHQgfHwgaCkgKyAodHlwZW9mKGgpID09ICdudW1iZXInID8gKG8uZGVsdGFIZWlnaHQgfHwgMCkgOiAnJyk7DQoJCQlpZiAoaCA8IDEwMCkNCgkJCQloID0gMTAwOw0KDQoJCQl0LmlmcmFtZUhUTUwgPSBzLmRvY3R5cGUgKyAnPGh0bWw+PGhlYWQgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPic7DQoNCgkJCS8vIFdlIG9ubHkgbmVlZCB0byBvdmVycmlkZSBwYXRocyBpZiB3ZSBoYXZlIHRvDQoJCQkvLyBJRSBoYXMgYSBidWcgd2hlcmUgaXQgcmVtb3ZlIHNpdGUgYWJzb2x1dGUgdXJscyB0byByZWxhdGl2ZSBvbmVzIGlmIHRoaXMgaXMgc3BlY2lmaWVkDQoJCQlpZiAocy5kb2N1bWVudF9iYXNlX3VybCAhPSB0aW55bWNlLmRvY3VtZW50QmFzZVVSTCkNCgkJCQl0LmlmcmFtZUhUTUwgKz0gJzxiYXNlIGhyZWY9IicgKyB0LmRvY3VtZW50QmFzZVVSSS5nZXRVUkkoKSArICciIC8+JzsNCg0KCQkJdC5pZnJhbWVIVE1MICs9ICc8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPTciIC8+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+JzsNCg0KCQkJaWYgKHRpbnltY2UucmVsYXhlZERvbWFpbikNCgkJCQl0LmlmcmFtZUhUTUwgKz0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kb2N1bWVudC5kb21haW4gPSAiJyArIHRpbnltY2UucmVsYXhlZERvbWFpbiArICciOzwvc2NyaXB0Pic7DQoNCgkJCWJpID0gcy5ib2R5X2lkIHx8ICd0aW55bWNlJzsNCgkJCWlmIChiaS5pbmRleE9mKCc9JykgIT0gLTEpIHsNCgkJCQliaSA9IHQuZ2V0UGFyYW0oJ2JvZHlfaWQnLCAnJywgJ2hhc2gnKTsNCgkJCQliaSA9IGJpW3QuaWRdIHx8IGJpOw0KCQkJfQ0KDQoJCQliYyA9IHMuYm9keV9jbGFzcyB8fCAnJzsNCgkJCWlmIChiYy5pbmRleE9mKCc9JykgIT0gLTEpIHsNCgkJCQliYyA9IHQuZ2V0UGFyYW0oJ2JvZHlfY2xhc3MnLCAnJywgJ2hhc2gnKTsNCgkJCQliYyA9IGJjW3QuaWRdIHx8ICcnOw0KCQkJfQ0KDQoJCQl0LmlmcmFtZUhUTUwgKz0gJzwvaGVhZD48Ym9keSBpZD0iJyArIGJpICsgJyIgY2xhc3M9Im1jZUNvbnRlbnRCb2R5ICcgKyBiYyArICciPjwvYm9keT48L2h0bWw+JzsNCg0KCQkJLy8gRG9tYWluIHJlbGF4aW5nIGVuYWJsZWQsIHRoZW4gc2V0IGRvY3VtZW50IGRvbWFpbg0KCQkJaWYgKHRpbnltY2UucmVsYXhlZERvbWFpbikgew0KCQkJCS8vIFdlIG5lZWQgdG8gd3JpdGUgdGhlIGNvbnRlbnRzIGhlcmUgaW4gSUUgc2luY2UgbXVsdGlwbGUgd3JpdGVzIG1lc3NlcyB1cCByZWZyZXNoIGJ1dHRvbiBhbmQgYmFjayBidXR0b24NCgkJCQlpZiAoaXNJRSB8fCAodGlueW1jZS5pc09wZXJhICYmIHBhcnNlRmxvYXQob3BlcmEudmVyc2lvbigpKSA+PSA5LjUpKQ0KCQkJCQl1ID0gJ2phdmFzY3JpcHQ6KGZ1bmN0aW9uKCl7ZG9jdW1lbnQub3BlbigpO2RvY3VtZW50LmRvbWFpbj0iJyArIGRvY3VtZW50LmRvbWFpbiArICciO3ZhciBlZCA9IHdpbmRvdy5wYXJlbnQudGlueU1DRS5nZXQoIicgKyB0LmlkICsgJyIpO2RvY3VtZW50LndyaXRlKGVkLmlmcmFtZUhUTUwpO2RvY3VtZW50LmNsb3NlKCk7ZWQuc2V0dXBJZnJhbWUoKTt9KSgpJzsNCgkJCQllbHNlIGlmICh0aW55bWNlLmlzT3BlcmEpDQoJCQkJCXUgPSAnamF2YXNjcmlwdDooZnVuY3Rpb24oKXtkb2N1bWVudC5vcGVuKCk7ZG9jdW1lbnQuZG9tYWluPSInICsgZG9jdW1lbnQuZG9tYWluICsgJyI7ZG9jdW1lbnQuY2xvc2UoKTtlZC5zZXR1cElmcmFtZSgpO30pKCknOwkJCQkJDQoJCQl9DQoNCgkJCS8vIENyZWF0ZSBpZnJhbWUNCgkJCW4gPSBET00uYWRkKG8uaWZyYW1lQ29udGFpbmVyLCAnaWZyYW1lJywgew0KCQkJCWlkIDogdC5pZCArICJfaWZyIiwNCgkJCQlzcmMgOiB1IHx8ICdqYXZhc2NyaXB0OiIiJywgLy8gV29ya2Fyb3VuZCBmb3IgSFRUUFMgd2FybmluZyBpbiBJRTYvNw0KCQkJCWZyYW1lQm9yZGVyIDogJzAnLA0KCQkJCXN0eWxlIDogew0KCQkJCQl3aWR0aCA6ICcxMDAlJywNCgkJCQkJaGVpZ2h0IDogaA0KCQkJCX0NCgkJCX0pOw0KDQoJCQl0LmNvbnRlbnRBcmVhQ29udGFpbmVyID0gby5pZnJhbWVDb250YWluZXI7DQoJCQlET00uZ2V0KG8uZWRpdG9yQ29udGFpbmVyKS5zdHlsZS5kaXNwbGF5ID0gdC5vcmdEaXNwbGF5Ow0KCQkJRE9NLmdldCh0LmlkKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KDQoJCQlpZiAoIWlzSUUgfHwgIXRpbnltY2UucmVsYXhlZERvbWFpbikNCgkJCQl0LnNldHVwSWZyYW1lKCk7DQoNCgkJCWUgPSBuID0gbyA9IG51bGw7IC8vIENsZWFudXANCgkJfSwNCg0KCQlzZXR1cElmcmFtZSA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gdC5zZXR0aW5ncywgZSA9IERPTS5nZXQodC5pZCksIGQgPSB0LmdldERvYygpLCBoLCBiOw0KDQoJCQkvLyBTZXR1cCBpZnJhbWUgYm9keQ0KCQkJaWYgKCFpc0lFIHx8ICF0aW55bWNlLnJlbGF4ZWREb21haW4pIHsNCgkJCQlkLm9wZW4oKTsNCgkJCQlkLndyaXRlKHQuaWZyYW1lSFRNTCk7DQoJCQkJZC5jbG9zZSgpOw0KCQkJfQ0KDQoJCQkvLyBEZXNpZ24gbW9kZSBuZWVkcyB0byBiZSBhZGRlZCBoZXJlIEN0cmwrQSB3aWxsIGZhaWwgb3RoZXJ3aXNlDQoJCQlpZiAoIWlzSUUpIHsNCgkJCQl0cnkgew0KCQkJCQlpZiAoIXMucmVhZG9ubHkpDQoJCQkJCQlkLmRlc2lnbk1vZGUgPSAnT24nOw0KCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCS8vIFdpbGwgZmFpbCBvbiBHZWNrbyBpZiB0aGUgZWRpdG9yIGlzIHBsYWNlZCBpbiBhbiBoaWRkZW4gY29udGFpbmVyIGVsZW1lbnQNCgkJCQkJLy8gVGhlIGRlc2lnbiBtb2RlIHdpbGwgYmUgc2V0IG9uZXMgdGhlIGVkaXRvciBpcyBmb2N1c2VkDQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBJRSBuZWVkcyB0byB1c2UgY29udGVudEVkaXRhYmxlIG9yIGl0IHdpbGwgZGlzcGxheSBub24gc2VjdXJlIGl0ZW1zIGZvciBIVFRQUw0KCQkJaWYgKGlzSUUpIHsNCgkJCQkvLyBJdCB3aWxsIG5vdCBzdGVhbCBmb2N1cyBpZiB3ZSBoaWRlIGl0IHdoaWxlIHNldHRpbmcgY29udGVudEVkaXRhYmxlDQoJCQkJYiA9IHQuZ2V0Qm9keSgpOw0KCQkJCURPTS5oaWRlKGIpOw0KDQoJCQkJaWYgKCFzLnJlYWRvbmx5KQ0KCQkJCQliLmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7DQoNCgkJCQlET00uc2hvdyhiKTsNCgkJCX0NCg0KCQkJdC5kb20gPSBuZXcgdGlueW1jZS5kb20uRE9NVXRpbHModC5nZXREb2MoKSwgew0KCQkJCWtlZXBfdmFsdWVzIDogdHJ1ZSwNCgkJCQl1cmxfY29udmVydGVyIDogdC5jb252ZXJ0VVJMLA0KCQkJCXVybF9jb252ZXJ0ZXJfc2NvcGUgOiB0LA0KCQkJCWhleF9jb2xvcnMgOiBzLmZvcmNlX2hleF9zdHlsZV9jb2xvcnMsDQoJCQkJY2xhc3NfZmlsdGVyIDogcy5jbGFzc19maWx0ZXIsDQoJCQkJdXBkYXRlX3N0eWxlcyA6IDEsDQoJCQkJZml4X2llX3BhcmFncmFwaHMgOiAxLA0KCQkJCXZhbGlkX3N0eWxlcyA6IHMudmFsaWRfc3R5bGVzDQoJCQl9KTsNCg0KCQkJdC5zY2hlbWEgPSBuZXcgdGlueW1jZS5kb20uU2NoZW1hKCk7DQoNCgkJCXQuc2VyaWFsaXplciA9IG5ldyB0aW55bWNlLmRvbS5TZXJpYWxpemVyKGV4dGVuZChzLCB7DQoJCQkJdmFsaWRfZWxlbWVudHMgOiBzLnZlcmlmeV9odG1sID09PSBmYWxzZSA/ICcqWypdJyA6IHMudmFsaWRfZWxlbWVudHMsDQoJCQkJZG9tIDogdC5kb20sDQoJCQkJc2NoZW1hIDogdC5zY2hlbWENCgkJCX0pKTsNCg0KCQkJdC5zZWxlY3Rpb24gPSBuZXcgdGlueW1jZS5kb20uU2VsZWN0aW9uKHQuZG9tLCB0LmdldFdpbigpLCB0LnNlcmlhbGl6ZXIpOw0KDQoJCQl0LmZvcm1hdHRlciA9IG5ldyB0aW55bWNlLkZvcm1hdHRlcih0aGlzKTsNCg0KCQkJLy8gUmVnaXN0ZXIgZGVmYXVsdCBmb3JtYXRzDQoJCQl0LmZvcm1hdHRlci5yZWdpc3Rlcih7DQoJCQkJYWxpZ25sZWZ0IDogWw0KCQkJCQl7c2VsZWN0b3IgOiAncCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGknLCBzdHlsZXMgOiB7dGV4dEFsaWduIDogJ2xlZnQnfX0sDQoJCQkJCXtzZWxlY3RvciA6ICdpbWcsdGFibGUnLCBzdHlsZXMgOiB7J2Zsb2F0JyA6ICdsZWZ0J319DQoJCQkJXSwNCg0KCQkJCWFsaWduY2VudGVyIDogWw0KCQkJCQl7c2VsZWN0b3IgOiAncCxoMSxoMixoMyxoNCxoNSxoNix0ZCx0aCxkaXYsdWwsb2wsbGknLCBzdHlsZXMgOiB7dGV4dEFsaWduIDogJ2NlbnRlcid9fSwNCgkJCQkJe3NlbGVjdG9yIDogJ2ltZycsIHN0eWxlcyA6IHtkaXNwbGF5IDogJ2Jsb2NrJywgbWFyZ2luTGVmdCA6ICdhdXRvJywgbWFyZ2luUmlnaHQgOiAnYXV0byd9fSwNCgkJCQkJe3NlbGVjdG9yIDogJ3RhYmxlJywgc3R5bGVzIDoge21hcmdpbkxlZnQgOiAnYXV0bycsIG1hcmdpblJpZ2h0IDogJ2F1dG8nfX0NCgkJCQldLA0KDQoJCQkJYWxpZ25yaWdodCA6IFsNCgkJCQkJe3NlbGVjdG9yIDogJ3AsaDEsaDIsaDMsaDQsaDUsaDYsdGQsdGgsZGl2LHVsLG9sLGxpJywgc3R5bGVzIDoge3RleHRBbGlnbiA6ICdyaWdodCd9fSwNCgkJCQkJe3NlbGVjdG9yIDogJ2ltZyx0YWJsZScsIHN0eWxlcyA6IHsnZmxvYXQnIDogJ3JpZ2h0J319DQoJCQkJXSwNCg0KCQkJCWFsaWduZnVsbCA6IFsNCgkJCQkJe3NlbGVjdG9yIDogJ3AsaDEsaDIsaDMsaDQsaDUsaDYsdGQsdGgsZGl2LHVsLG9sLGxpJywgc3R5bGVzIDoge3RleHRBbGlnbiA6ICdqdXN0aWZ5J319DQoJCQkJXSwNCg0KCQkJCWJvbGQgOiBbDQoJCQkJCXtpbmxpbmUgOiAnc3Ryb25nJ30sDQoJCQkJCXtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHtmb250V2VpZ2h0IDogJ2JvbGQnfX0sDQoJCQkJCXtpbmxpbmUgOiAnYid9DQoJCQkJXSwNCg0KCQkJCWl0YWxpYyA6IFsNCgkJCQkJe2lubGluZSA6ICdlbSd9LA0KCQkJCQl7aW5saW5lIDogJ3NwYW4nLCBzdHlsZXMgOiB7Zm9udFN0eWxlIDogJ2l0YWxpYyd9fSwNCgkJCQkJe2lubGluZSA6ICdpJ30NCgkJCQldLA0KDQoJCQkJdW5kZXJsaW5lIDogWw0KCQkJCQl7aW5saW5lIDogJ3NwYW4nLCBzdHlsZXMgOiB7dGV4dERlY29yYXRpb24gOiAndW5kZXJsaW5lJ30sIGV4YWN0IDogdHJ1ZX0sDQoJCQkJCXtpbmxpbmUgOiAndSd9DQoJCQkJXSwNCg0KCQkJCXN0cmlrZXRocm91Z2ggOiBbDQoJCQkJCXtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHt0ZXh0RGVjb3JhdGlvbiA6ICdsaW5lLXRocm91Z2gnfSwgZXhhY3QgOiB0cnVlfSwNCgkJCQkJe2lubGluZSA6ICd1J30NCgkJCQldLA0KDQoJCQkJZm9yZWNvbG9yIDoge2lubGluZSA6ICdzcGFuJywgc3R5bGVzIDoge2NvbG9yIDogJyV2YWx1ZSd9LCB3cmFwX2xpbmtzIDogZmFsc2V9LA0KCQkJCWhpbGl0ZWNvbG9yIDoge2lubGluZSA6ICdzcGFuJywgc3R5bGVzIDoge2JhY2tncm91bmRDb2xvciA6ICcldmFsdWUnfSwgd3JhcF9saW5rcyA6IGZhbHNlfSwNCgkJCQlmb250bmFtZSA6IHtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHtmb250RmFtaWx5IDogJyV2YWx1ZSd9fSwNCgkJCQlmb250c2l6ZSA6IHtpbmxpbmUgOiAnc3BhbicsIHN0eWxlcyA6IHtmb250U2l6ZSA6ICcldmFsdWUnfX0sDQoJCQkJZm9udHNpemVfY2xhc3MgOiB7aW5saW5lIDogJ3NwYW4nLCBhdHRyaWJ1dGVzIDogeydjbGFzcycgOiAnJXZhbHVlJ319LA0KCQkJCWJsb2NrcXVvdGUgOiB7YmxvY2sgOiAnYmxvY2txdW90ZScsIHdyYXBwZXIgOiAxLCByZW1vdmUgOiAnYWxsJ30sDQoNCgkJCQlyZW1vdmVmb3JtYXQgOiBbDQoJCQkJCXtzZWxlY3RvciA6ICdiLHN0cm9uZyxlbSxpLGZvbnQsdSxzdHJpa2UnLCByZW1vdmUgOiAnYWxsJywgc3BsaXQgOiB0cnVlLCBleHBhbmQgOiBmYWxzZSwgYmxvY2tfZXhwYW5kIDogdHJ1ZSwgZGVlcCA6IHRydWV9LA0KCQkJCQl7c2VsZWN0b3IgOiAnc3BhbicsIGF0dHJpYnV0ZXMgOiBbJ3N0eWxlJywgJ2NsYXNzJ10sIHJlbW92ZSA6ICdlbXB0eScsIHNwbGl0IDogdHJ1ZSwgZXhwYW5kIDogZmFsc2UsIGRlZXAgOiB0cnVlfSwNCgkJCQkJe3NlbGVjdG9yIDogJyonLCBhdHRyaWJ1dGVzIDogWydzdHlsZScsICdjbGFzcyddLCBzcGxpdCA6IGZhbHNlLCBleHBhbmQgOiBmYWxzZSwgZGVlcCA6IHRydWV9DQoJCQkJXQ0KCQkJfSk7DQoNCgkJCS8vIFJlZ2lzdGVyIGRlZmF1bHQgYmxvY2sgZm9ybWF0cw0KCQkJZWFjaCgncCBoMSBoMiBoMyBoNCBoNSBoNiBkaXYgYWRkcmVzcyBwcmUgZGl2IGNvZGUgZHQgZGQgc2FtcCcuc3BsaXQoL1xzLyksIGZ1bmN0aW9uKG5hbWUpIHsNCgkJCQl0LmZvcm1hdHRlci5yZWdpc3RlcihuYW1lLCB7YmxvY2sgOiBuYW1lLCByZW1vdmUgOiAnYWxsJ30pOw0KCQkJfSk7DQoNCgkJCS8vIFJlZ2lzdGVyIHVzZXIgZGVmaW5lZCBmb3JtYXRzDQoJCQl0LmZvcm1hdHRlci5yZWdpc3Rlcih0LnNldHRpbmdzLmZvcm1hdHMpOw0KDQoJCQl0LnVuZG9NYW5hZ2VyID0gbmV3IHRpbnltY2UuVW5kb01hbmFnZXIodCk7DQoNCgkJCS8vIFBhc3MgdGhyb3VnaA0KCQkJdC51bmRvTWFuYWdlci5vbkFkZC5hZGQoZnVuY3Rpb24odW0sIGwpIHsNCgkJCQlpZiAoIWwuaW5pdGlhbCkNCgkJCQkJcmV0dXJuIHQub25DaGFuZ2UuZGlzcGF0Y2godCwgbCwgdW0pOw0KCQkJfSk7DQoNCgkJCXQudW5kb01hbmFnZXIub25VbmRvLmFkZChmdW5jdGlvbih1bSwgbCkgew0KCQkJCXJldHVybiB0Lm9uVW5kby5kaXNwYXRjaCh0LCBsLCB1bSk7DQoJCQl9KTsNCg0KCQkJdC51bmRvTWFuYWdlci5vblJlZG8uYWRkKGZ1bmN0aW9uKHVtLCBsKSB7DQoJCQkJcmV0dXJuIHQub25SZWRvLmRpc3BhdGNoKHQsIGwsIHVtKTsNCgkJCX0pOw0KDQoJCQl0LmZvcmNlQmxvY2tzID0gbmV3IHRpbnltY2UuRm9yY2VCbG9ja3ModCwgew0KCQkJCWZvcmNlZF9yb290X2Jsb2NrIDogcy5mb3JjZWRfcm9vdF9ibG9jaw0KCQkJfSk7DQoNCgkJCXQuZWRpdG9yQ29tbWFuZHMgPSBuZXcgdGlueW1jZS5FZGl0b3JDb21tYW5kcyh0KTsNCg0KCQkJLy8gUGFzcyB0aHJvdWdoDQoJCQl0LnNlcmlhbGl6ZXIub25QcmVQcm9jZXNzLmFkZChmdW5jdGlvbihzZSwgbykgew0KCQkJCXJldHVybiB0Lm9uUHJlUHJvY2Vzcy5kaXNwYXRjaCh0LCBvLCBzZSk7DQoJCQl9KTsNCg0KCQkJdC5zZXJpYWxpemVyLm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKHNlLCBvKSB7DQoJCQkJcmV0dXJuIHQub25Qb3N0UHJvY2Vzcy5kaXNwYXRjaCh0LCBvLCBzZSk7DQoJCQl9KTsNCg0KCQkJdC5vblByZUluaXQuZGlzcGF0Y2godCk7DQoNCgkJCWlmICghcy5nZWNrb19zcGVsbGNoZWNrKQ0KCQkJCXQuZ2V0Qm9keSgpLnNwZWxsY2hlY2sgPSAwOw0KDQoJCQlpZiAoIXMucmVhZG9ubHkpDQoJCQkJdC5fYWRkRXZlbnRzKCk7DQoNCgkJCXQuY29udHJvbE1hbmFnZXIub25Qb3N0UmVuZGVyLmRpc3BhdGNoKHQsIHQuY29udHJvbE1hbmFnZXIpOw0KCQkJdC5vblBvc3RSZW5kZXIuZGlzcGF0Y2godCk7DQoNCgkJCWlmIChzLmRpcmVjdGlvbmFsaXR5KQ0KCQkJCXQuZ2V0Qm9keSgpLmRpciA9IHMuZGlyZWN0aW9uYWxpdHk7DQoNCgkJCWlmIChzLm5vd3JhcCkNCgkJCQl0LmdldEJvZHkoKS5zdHlsZS53aGl0ZVNwYWNlID0gIm5vd3JhcCI7DQoNCgkJCWlmIChzLmN1c3RvbV9lbGVtZW50cykgew0KCQkJCWZ1bmN0aW9uIGhhbmRsZUN1c3RvbShlZCwgbykgew0KCQkJCQllYWNoKGV4cGxvZGUocy5jdXN0b21fZWxlbWVudHMpLCBmdW5jdGlvbih2KSB7DQoJCQkJCQl2YXIgbjsNCg0KCQkJCQkJaWYgKHYuaW5kZXhPZignficpID09PSAwKSB7DQoJCQkJCQkJdiA9IHYuc3Vic3RyaW5nKDEpOw0KCQkJCQkJCW4gPSAnc3Bhbic7DQoJCQkJCQl9IGVsc2UNCgkJCQkJCQluID0gJ2Rpdic7DQoNCgkJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAoJzwoJyArIHYgKyAnKShbXj5dKik+JywgJ2cnKSwgJzwnICsgbiArICcgX21jZV9uYW1lPSIkMSIkMj4nKTsNCgkJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAoJzwvKCcgKyB2ICsgJyk+JywgJ2cnKSwgJzwvJyArIG4gKyAnPicpOw0KCQkJCQl9KTsNCgkJCQl9Ow0KDQoJCQkJdC5vbkJlZm9yZVNldENvbnRlbnQuYWRkKGhhbmRsZUN1c3RvbSk7DQoJCQkJdC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlpZiAoby5zZXQpDQoJCQkJCQloYW5kbGVDdXN0b20oZWQsIG8pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5oYW5kbGVfbm9kZV9jaGFuZ2VfY2FsbGJhY2spIHsNCgkJCQl0Lm9uTm9kZUNoYW5nZS5hZGQoZnVuY3Rpb24oZWQsIGNtLCBuKSB7DQoJCQkJCXQuZXhlY0NhbGxiYWNrKCdoYW5kbGVfbm9kZV9jaGFuZ2VfY2FsbGJhY2snLCB0LmlkLCBuLCAtMSwgLTEsIHRydWUsIHQuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5zYXZlX2NhbGxiYWNrKSB7DQoJCQkJdC5vblNhdmVDb250ZW50LmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQl2YXIgaCA9IHQuZXhlY0NhbGxiYWNrKCdzYXZlX2NhbGxiYWNrJywgdC5pZCwgby5jb250ZW50LCB0LmdldEJvZHkoKSk7DQoNCgkJCQkJaWYgKGgpDQoJCQkJCQlvLmNvbnRlbnQgPSBoOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5vbmNoYW5nZV9jYWxsYmFjaykgew0KCQkJCXQub25DaGFuZ2UuYWRkKGZ1bmN0aW9uKGVkLCBsKSB7DQoJCQkJCXQuZXhlY0NhbGxiYWNrKCdvbmNoYW5nZV9jYWxsYmFjaycsIHQsIGwpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5jb252ZXJ0X25ld2xpbmVzX3RvX2Jycykgew0KCQkJCXQub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlpZiAoby5pbml0aWFsKQ0KCQkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UoL1xyP1xuL2csICc8YnIgLz4nKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHMuZml4X25lc3RpbmcgJiYgaXNJRSkgew0KCQkJCXQub25CZWZvcmVTZXRDb250ZW50LmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlvLmNvbnRlbnQgPSB0Ll9maXhOZXN0aW5nKG8uY29udGVudCk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLnByZWZvcm1hdHRlZCkgew0KCQkJCXQub25Qb3N0UHJvY2Vzcy5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UoL15ccyo8cHJlLio/Pi8sICcnKTsNCgkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UoLzxcL3ByZT5ccyokLywgJycpOw0KDQoJCQkJCWlmIChvLnNldCkNCgkJCQkJCW8uY29udGVudCA9ICc8cHJlIGNsYXNzPSJtY2VJdGVtSGlkZGVuIj4nICsgby5jb250ZW50ICsgJzwvcHJlPic7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCWlmIChzLnZlcmlmeV9jc3NfY2xhc3Nlcykgew0KCQkJCXQuc2VyaWFsaXplci5hdHRyaWJWYWx1ZUZpbHRlciA9IGZ1bmN0aW9uKG4sIHYpIHsNCgkJCQkJdmFyIHMsIGNsOw0KDQoJCQkJCWlmIChuID09ICdjbGFzcycpIHsNCgkJCQkJCS8vIEJ1aWxkIHJlZ2V4cCBmb3IgY2xhc3Nlcw0KCQkJCQkJaWYgKCF0LmNsYXNzZXNSRSkgew0KCQkJCQkJCWNsID0gdC5kb20uZ2V0Q2xhc3NlcygpOw0KDQoJCQkJCQkJaWYgKGNsLmxlbmd0aCA+IDApIHsNCgkJCQkJCQkJcyA9ICcnOw0KDQoJCQkJCQkJCWVhY2ggKGNsLCBmdW5jdGlvbihvKSB7DQoJCQkJCQkJCQlzICs9IChzID8gJ3wnIDogJycpICsgb1snY2xhc3MnXTsNCgkJCQkJCQkJfSk7DQoNCgkJCQkJCQkJdC5jbGFzc2VzUkUgPSBuZXcgUmVnRXhwKCcoJyArIHMgKyAnKScsICdnaScpOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuICF0LmNsYXNzZXNSRSB8fCAvKFxibWNlSXRlbVx3K1xifFxibWNlVGVtcFx3K1xiKS9nLnRlc3QodikgfHwgdC5jbGFzc2VzUkUudGVzdCh2KSA/IHYgOiAnJzsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiB2Ow0KCQkJCX07DQoJCQl9DQoNCgkJCWlmIChzLmNsZWFudXBfY2FsbGJhY2spIHsNCgkJCQl0Lm9uQmVmb3JlU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJby5jb250ZW50ID0gdC5leGVjQ2FsbGJhY2soJ2NsZWFudXBfY2FsbGJhY2snLCAnaW5zZXJ0X3RvX2VkaXRvcicsIG8uY29udGVudCwgbyk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uUHJlUHJvY2Vzcy5hZGQoZnVuY3Rpb24oZWQsIG8pIHsNCgkJCQkJaWYgKG8uc2V0KQ0KCQkJCQkJdC5leGVjQ2FsbGJhY2soJ2NsZWFudXBfY2FsbGJhY2snLCAnaW5zZXJ0X3RvX2VkaXRvcl9kb20nLCBvLm5vZGUsIG8pOw0KDQoJCQkJCWlmIChvLmdldCkNCgkJCQkJCXQuZXhlY0NhbGxiYWNrKCdjbGVhbnVwX2NhbGxiYWNrJywgJ2dldF9mcm9tX2VkaXRvcl9kb20nLCBvLm5vZGUsIG8pOw0KCQkJCX0pOw0KDQoJCQkJdC5vblBvc3RQcm9jZXNzLmFkZChmdW5jdGlvbihlZCwgbykgew0KCQkJCQlpZiAoby5zZXQpDQoJCQkJCQlvLmNvbnRlbnQgPSB0LmV4ZWNDYWxsYmFjaygnY2xlYW51cF9jYWxsYmFjaycsICdpbnNlcnRfdG9fZWRpdG9yJywgby5jb250ZW50LCBvKTsNCg0KCQkJCQlpZiAoby5nZXQpCQkJCQkJDQoJCQkJCQlvLmNvbnRlbnQgPSB0LmV4ZWNDYWxsYmFjaygnY2xlYW51cF9jYWxsYmFjaycsICdnZXRfZnJvbV9lZGl0b3InLCBvLmNvbnRlbnQsIG8pOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5zYXZlX2NhbGxiYWNrKSB7DQoJCQkJdC5vbkdldENvbnRlbnQuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCWlmIChvLnNhdmUpDQoJCQkJCQlvLmNvbnRlbnQgPSB0LmV4ZWNDYWxsYmFjaygnc2F2ZV9jYWxsYmFjaycsIHQuaWQsIG8uY29udGVudCwgdC5nZXRCb2R5KCkpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAocy5oYW5kbGVfZXZlbnRfY2FsbGJhY2spIHsNCgkJCQl0Lm9uRXZlbnQuYWRkKGZ1bmN0aW9uKGVkLCBlLCBvKSB7DQoJCQkJCWlmICh0LmV4ZWNDYWxsYmFjaygnaGFuZGxlX2V2ZW50X2NhbGxiYWNrJywgZSwgZWQsIG8pID09PSBmYWxzZSkNCgkJCQkJCUV2ZW50LmNhbmNlbChlKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gQWRkIHZpc3VhbCBhaWRzIHdoZW4gbmV3IGNvbnRlbnRzIGlzIGFkZGVkDQoJCQl0Lm9uU2V0Q29udGVudC5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJdC5hZGRWaXN1YWwodC5nZXRCb2R5KCkpOw0KCQkJfSk7DQoNCgkJCS8vIFJlbW92ZSBlbXB0eSBjb250ZW50cw0KCQkJaWYgKHMucGFkZF9lbXB0eV9lZGl0b3IpIHsNCgkJCQl0Lm9uUG9zdFByb2Nlc3MuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKC9eKDxwW14+XSo+KCZuYnNwO3wmIzE2MDt8XHN8XHUwMGEwfCk8XC9wPltcclxuXSp8PGJyIFwvPltcclxuXSopJC8sICcnKTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKGlzR2Vja28pIHsNCgkJCQkvLyBGaXggZ2Vja28gbGluayBidWcsIHdoZW4gYSBsaW5rIGlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIGJsb2NrIGVsZW1lbnRzIHRoZXJlIGlzDQoJCQkJLy8gbm8gd2F5IHRvIG1vdmUgdGhlIGNhcmV0IGJlaGluZCB0aGUgbGluay4gVGhpcyBmaXggYWRkcyBhIGJvZ3VzIGJyIGVsZW1lbnQgYWZ0ZXIgdGhlIGxpbmsNCgkJCQlmdW5jdGlvbiBmaXhMaW5rcyhlZCwgbykgew0KCQkJCQllYWNoKGVkLmRvbS5zZWxlY3QoJ2EnKSwgZnVuY3Rpb24obikgew0KCQkJCQkJdmFyIHBuID0gbi5wYXJlbnROb2RlOw0KDQoJCQkJCQlpZiAoZWQuZG9tLmlzQmxvY2socG4pICYmIHBuLmxhc3RDaGlsZCA9PT0gbikNCgkJCQkJCQllZC5kb20uYWRkKHBuLCAnYnInLCB7J19tY2VfYm9ndXMnIDogMX0pOw0KCQkJCQl9KTsNCgkJCQl9Ow0KDQoJCQkJdC5vbkV4ZWNDb21tYW5kLmFkZChmdW5jdGlvbihlZCwgY21kKSB7DQoJCQkJCWlmIChjbWQgPT09ICdDcmVhdGVMaW5rJykNCgkJCQkJCWZpeExpbmtzKGVkKTsNCgkJCQl9KTsNCg0KCQkJCXQub25TZXRDb250ZW50LmFkZCh0LnNlbGVjdGlvbi5vblNldENvbnRlbnQuYWRkKGZpeExpbmtzKSk7DQoNCgkJCQlpZiAoIXMucmVhZG9ubHkpIHsNCgkJCQkJdHJ5IHsNCgkJCQkJCS8vIERlc2lnbiBtb2RlIG11c3QgYmUgc2V0IGhlcmUgb25jZSBhZ2FpbiB0byBmaXggYSBidWcgd2hlcmUNCgkJCQkJCS8vIEN0cmwrQS9EZWxldGUvQmFja3NwYWNlIGRpZG4ndCB3b3JrIGlmIHRoZSBlZGl0b3Igd2FzIGFkZGVkIHVzaW5nIG1jZUFkZENvbnRyb2wgdGhlbiByZW1vdmVkIHRoZW4gYWRkZWQgYWdhaW4NCgkJCQkJCWQuZGVzaWduTW9kZSA9ICdPZmYnOw0KCQkJCQkJZC5kZXNpZ25Nb2RlID0gJ09uJzsNCgkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCS8vIFdpbGwgZmFpbCBvbiBHZWNrbyBpZiB0aGUgZWRpdG9yIGlzIHBsYWNlZCBpbiBhbiBoaWRkZW4gY29udGFpbmVyIGVsZW1lbnQNCgkJCQkJCS8vIFRoZSBkZXNpZ24gbW9kZSB3aWxsIGJlIHNldCBvbmVzIHRoZSBlZGl0b3IgaXMgZm9jdXNlZA0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBBIHNtYWxsIHRpbWVvdXQgd2FzIG5lZWRlZCBzaW5jZSBmaXJlZm94IHdpbGwgcmVtb3ZlLiBCdWc6ICMxODM4MzA0DQoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCgkJCQlpZiAodC5yZW1vdmVkKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQl0LmxvYWQoe2luaXRpYWwgOiB0cnVlLCBmb3JtYXQgOiAocy5jbGVhbnVwX29uX3N0YXJ0dXAgPyAnaHRtbCcgOiAncmF3Jyl9KTsNCgkJCQl0LnN0YXJ0Q29udGVudCA9IHQuZ2V0Q29udGVudCh7Zm9ybWF0IDogJ3Jhdyd9KTsNCgkJCQl0LmluaXRpYWxpemVkID0gdHJ1ZTsNCg0KCQkJCXQub25Jbml0LmRpc3BhdGNoKHQpOw0KCQkJCXQuZXhlY0NhbGxiYWNrKCdzZXR1cGNvbnRlbnRfY2FsbGJhY2snLCB0LmlkLCB0LmdldEJvZHkoKSwgdC5nZXREb2MoKSk7DQoJCQkJdC5leGVjQ2FsbGJhY2soJ2luaXRfaW5zdGFuY2VfY2FsbGJhY2snLCB0KTsNCgkJCQl0LmZvY3VzKHRydWUpOw0KCQkJCXQubm9kZUNoYW5nZWQoe2luaXRpYWwgOiAxfSk7DQoNCgkJCQkvLyBMb2FkIHNwZWNpZmllZCBjb250ZW50IENTUyBsYXN0DQoJCQkJaWYgKHMuY29udGVudF9jc3MpIHsNCgkJCQkJdGlueW1jZS5lYWNoKGV4cGxvZGUocy5jb250ZW50X2NzcyksIGZ1bmN0aW9uKHUpIHsNCgkJCQkJCXQuZG9tLmxvYWRDU1ModC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZSh1KSk7DQoJCQkJCX0pOw0KCQkJCX0NCg0KCQkJCS8vIEhhbmRsZSBhdXRvIGZvY3VzDQoJCQkJaWYgKHMuYXV0b19mb2N1cykgew0KCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCgkJCQkJCXZhciBlZCA9IHRpbnltY2UuZ2V0KHMuYXV0b19mb2N1cyk7DQoNCgkJCQkJCWVkLnNlbGVjdGlvbi5zZWxlY3QoZWQuZ2V0Qm9keSgpLCAxKTsNCgkJCQkJCWVkLnNlbGVjdGlvbi5jb2xsYXBzZSgxKTsNCgkJCQkJCWVkLmdldFdpbigpLmZvY3VzKCk7DQoJCQkJCX0sIDEwMCk7DQoJCQkJfQ0KCQkJfSwgMSk7DQoJDQoJCQllID0gbnVsbDsNCgkJfSwNCg0KDQoJCWZvY3VzIDogZnVuY3Rpb24oc2YpIHsNCgkJCXZhciBvZWQsIHQgPSB0aGlzLCBjZSA9IHQuc2V0dGluZ3MuY29udGVudF9lZGl0YWJsZSwgaWVSbmcsIGNvbnRyb2xFbG0sIGRvYyA9IHQuZ2V0RG9jKCk7DQoNCgkJCWlmICghc2YpIHsNCgkJCQkvLyBHZXQgc2VsZWN0ZWQgY29udHJvbCBlbGVtZW50DQoJCQkJaWVSbmcgPSB0LnNlbGVjdGlvbi5nZXRSbmcoKTsNCgkJCQlpZiAoaWVSbmcuaXRlbSkgew0KCQkJCQljb250cm9sRWxtID0gaWVSbmcuaXRlbSgwKTsNCgkJCQl9DQoNCgkJCQkvLyBJcyBub3QgY29udGVudCBlZGl0YWJsZQ0KCQkJCWlmICghY2UpDQoJCQkJCXQuZ2V0V2luKCkuZm9jdXMoKTsNCg0KCQkJCS8vIFJlc3RvcmUgc2VsZWN0ZWQgY29udHJvbCBlbGVtZW50DQoJCQkJLy8gVGhpcyBpcyBuZWVkZWQgd2hlbiBmb3IgZXhhbXBsZSBhbiBpbWFnZSBpcyBzZWxlY3RlZCB3aXRoaW4gYQ0KCQkJCS8vIGxheWVyIGEgY2FsbCB0byBmb2N1cyB3aWxsIHRoZW4gcmVtb3ZlIHRoZSBjb250cm9sIHNlbGVjdGlvbg0KCQkJCWlmIChjb250cm9sRWxtICYmIGNvbnRyb2xFbG0ub3duZXJEb2N1bWVudCA9PSBkb2MpIHsNCgkJCQkJaWVSbmcgPSBkb2MuYm9keS5jcmVhdGVDb250cm9sUmFuZ2UoKTsNCgkJCQkJaWVSbmcuYWRkRWxlbWVudChjb250cm9sRWxtKTsNCgkJCQkJaWVSbmcuc2VsZWN0KCk7DQoJCQkJfQ0KDQoJCQl9DQoNCgkJCWlmICh0aW55bWNlLmFjdGl2ZUVkaXRvciAhPSB0KSB7DQoJCQkJaWYgKChvZWQgPSB0aW55bWNlLmFjdGl2ZUVkaXRvcikgIT0gbnVsbCkNCgkJCQkJb2VkLm9uRGVhY3RpdmF0ZS5kaXNwYXRjaChvZWQsIHQpOw0KDQoJCQkJdC5vbkFjdGl2YXRlLmRpc3BhdGNoKHQsIG9lZCk7DQoJCQl9DQoNCgkJCXRpbnltY2UuX3NldEFjdGl2ZSh0KTsNCgkJfSwNCg0KCQlleGVjQ2FsbGJhY2sgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGYgPSB0LnNldHRpbmdzW25dLCBzOw0KDQoJCQlpZiAoIWYpDQoJCQkJcmV0dXJuOw0KDQoJCQkvLyBMb29rIHRocm91Z2ggbG9va3VwDQoJCQlpZiAodC5jYWxsYmFja0xvb2t1cCAmJiAocyA9IHQuY2FsbGJhY2tMb29rdXBbbl0pKSB7DQoJCQkJZiA9IHMuZnVuYzsNCgkJCQlzID0gcy5zY29wZTsNCgkJCX0NCg0KCQkJaWYgKGlzKGYsICdzdHJpbmcnKSkgew0KCQkJCXMgPSBmLnJlcGxhY2UoL1wuXHcrJC8sICcnKTsNCgkJCQlzID0gcyA/IHRpbnltY2UucmVzb2x2ZShzKSA6IDA7DQoJCQkJZiA9IHRpbnltY2UucmVzb2x2ZShmKTsNCgkJCQl0LmNhbGxiYWNrTG9va3VwID0gdC5jYWxsYmFja0xvb2t1cCB8fCB7fTsNCgkJCQl0LmNhbGxiYWNrTG9va3VwW25dID0ge2Z1bmMgOiBmLCBzY29wZSA6IHN9Ow0KCQkJfQ0KDQoJCQlyZXR1cm4gZi5hcHBseShzIHx8IHQsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOw0KCQl9LA0KDQoJCXRyYW5zbGF0ZSA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciBjID0gdGhpcy5zZXR0aW5ncy5sYW5ndWFnZSB8fCAnZW4nLCBpMThuID0gdGlueW1jZS5pMThuOw0KDQoJCQlpZiAoIXMpDQoJCQkJcmV0dXJuICcnOw0KDQoJCQlyZXR1cm4gaTE4bltjICsgJy4nICsgc10gfHwgcy5yZXBsYWNlKC97XCMoW159XSspXH0vZywgZnVuY3Rpb24oYSwgYikgew0KCQkJCXJldHVybiBpMThuW2MgKyAnLicgKyBiXSB8fCAneyMnICsgYiArICd9JzsNCgkJCX0pOw0KCQl9LA0KDQoJCWdldExhbmcgOiBmdW5jdGlvbihuLCBkdikgew0KCQkJcmV0dXJuIHRpbnltY2UuaTE4blsodGhpcy5zZXR0aW5ncy5sYW5ndWFnZSB8fCAnZW4nKSArICcuJyArIG5dIHx8IChpcyhkdikgPyBkdiA6ICd7IycgKyBuICsgJ30nKTsNCgkJfSwNCg0KCQlnZXRQYXJhbSA6IGZ1bmN0aW9uKG4sIGR2LCB0eSkgew0KCQkJdmFyIHRyID0gdGlueW1jZS50cmltLCB2ID0gaXModGhpcy5zZXR0aW5nc1tuXSkgPyB0aGlzLnNldHRpbmdzW25dIDogZHYsIG87DQoNCgkJCWlmICh0eSA9PT0gJ2hhc2gnKSB7DQoJCQkJbyA9IHt9Ow0KDQoJCQkJaWYgKGlzKHYsICdzdHJpbmcnKSkgew0KCQkJCQllYWNoKHYuaW5kZXhPZignPScpID4gMCA/IHYuc3BsaXQoL1s7LF0oPyFbXj07LF0qKD86WzssXXwkKSkvKSA6IHYuc3BsaXQoJywnKSwgZnVuY3Rpb24odikgew0KCQkJCQkJdiA9IHYuc3BsaXQoJz0nKTsNCg0KCQkJCQkJaWYgKHYubGVuZ3RoID4gMSkNCgkJCQkJCQlvW3RyKHZbMF0pXSA9IHRyKHZbMV0pOw0KCQkJCQkJZWxzZQ0KCQkJCQkJCW9bdHIodlswXSldID0gdHIodik7DQoJCQkJCX0pOw0KCQkJCX0gZWxzZQ0KCQkJCQlvID0gdjsNCg0KCQkJCXJldHVybiBvOw0KCQkJfQ0KDQoJCQlyZXR1cm4gdjsNCgkJfSwNCg0KCQlub2RlQ2hhbmdlZCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2VsZWN0aW9uLCBuID0gKGlzSUUgPyBzLmdldE5vZGUoKSA6IHMuZ2V0U3RhcnQoKSkgfHwgdC5nZXRCb2R5KCk7DQoNCgkJCS8vIEZpeCBmb3IgYnVnICMxODk2NTc3IGl0IHNlZW1zIHRoYXQgdGhpcyBjYW4gbm90IGJlIGZpcmVkIHdoaWxlIHRoZSBlZGl0b3IgaXMgbG9hZGluZw0KCQkJaWYgKHQuaW5pdGlhbGl6ZWQpIHsNCgkJCQlvID0gbyB8fCB7fTsNCgkJCQluID0gaXNJRSAmJiBuLm93bmVyRG9jdW1lbnQgIT0gdC5nZXREb2MoKSA/IHQuZ2V0Qm9keSgpIDogbjsgLy8gRml4IGZvciBJRSBpbml0aWFsIHN0YXRlDQoNCgkJCQkvLyBHZXQgcGFyZW50cyBhbmQgYWRkIHRoZW0gdG8gb2JqZWN0DQoJCQkJby5wYXJlbnRzID0gW107DQoJCQkJdC5kb20uZ2V0UGFyZW50KG4sIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJaWYgKG5vZGUubm9kZU5hbWUgPT0gJ0JPRFknKQ0KCQkJCQkJcmV0dXJuIHRydWU7DQoNCgkJCQkJby5wYXJlbnRzLnB1c2gobm9kZSk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uTm9kZUNoYW5nZS5kaXNwYXRjaCgNCgkJCQkJdCwNCgkJCQkJbyA/IG8uY29udHJvbE1hbmFnZXIgfHwgdC5jb250cm9sTWFuYWdlciA6IHQuY29udHJvbE1hbmFnZXIsDQoJCQkJCW4sDQoJCQkJCXMuaXNDb2xsYXBzZWQoKSwNCgkJCQkJbw0KCQkJCSk7DQoJCQl9DQoJCX0sDQoNCgkJYWRkQnV0dG9uIDogZnVuY3Rpb24obiwgcykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmJ1dHRvbnMgPSB0LmJ1dHRvbnMgfHwge307DQoJCQl0LmJ1dHRvbnNbbl0gPSBzOw0KCQl9LA0KDQoJCWFkZENvbW1hbmQgOiBmdW5jdGlvbihuLCBmLCBzKSB7DQoJCQl0aGlzLmV4ZWNDb21tYW5kc1tuXSA9IHtmdW5jIDogZiwgc2NvcGUgOiBzIHx8IHRoaXN9Ow0KCQl9LA0KDQoJCWFkZFF1ZXJ5U3RhdGVIYW5kbGVyIDogZnVuY3Rpb24obiwgZiwgcykgew0KCQkJdGhpcy5xdWVyeVN0YXRlQ29tbWFuZHNbbl0gPSB7ZnVuYyA6IGYsIHNjb3BlIDogcyB8fCB0aGlzfTsNCgkJfSwNCg0KCQlhZGRRdWVyeVZhbHVlSGFuZGxlciA6IGZ1bmN0aW9uKG4sIGYsIHMpIHsNCgkJCXRoaXMucXVlcnlWYWx1ZUNvbW1hbmRzW25dID0ge2Z1bmMgOiBmLCBzY29wZSA6IHMgfHwgdGhpc307DQoJCX0sDQoNCgkJYWRkU2hvcnRjdXQgOiBmdW5jdGlvbihwYSwgZGVzYywgY21kX2Z1bmMsIHNjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGM7DQoNCgkJCWlmICghdC5zZXR0aW5ncy5jdXN0b21fc2hvcnRjdXRzKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJdC5zaG9ydGN1dHMgPSB0LnNob3J0Y3V0cyB8fCB7fTsNCg0KCQkJaWYgKGlzKGNtZF9mdW5jLCAnc3RyaW5nJykpIHsNCgkJCQljID0gY21kX2Z1bmM7DQoNCgkJCQljbWRfZnVuYyA9IGZ1bmN0aW9uKCkgew0KCQkJCQl0LmV4ZWNDb21tYW5kKGMsIGZhbHNlLCBudWxsKTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQlpZiAoaXMoY21kX2Z1bmMsICdvYmplY3QnKSkgew0KCQkJCWMgPSBjbWRfZnVuYzsNCg0KCQkJCWNtZF9mdW5jID0gZnVuY3Rpb24oKSB7DQoJCQkJCXQuZXhlY0NvbW1hbmQoY1swXSwgY1sxXSwgY1syXSk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJZWFjaChleHBsb2RlKHBhKSwgZnVuY3Rpb24ocGEpIHsNCgkJCQl2YXIgbyA9IHsNCgkJCQkJZnVuYyA6IGNtZF9mdW5jLA0KCQkJCQlzY29wZSA6IHNjIHx8IHRoaXMsDQoJCQkJCWRlc2MgOiBkZXNjLA0KCQkJCQlhbHQgOiBmYWxzZSwNCgkJCQkJY3RybCA6IGZhbHNlLA0KCQkJCQlzaGlmdCA6IGZhbHNlDQoJCQkJfTsNCg0KCQkJCWVhY2goZXhwbG9kZShwYSwgJysnKSwgZnVuY3Rpb24odikgew0KCQkJCQlzd2l0Y2ggKHYpIHsNCgkJCQkJCWNhc2UgJ2FsdCc6DQoJCQkJCQljYXNlICdjdHJsJzoNCgkJCQkJCWNhc2UgJ3NoaWZ0JzoNCgkJCQkJCQlvW3ZdID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJZGVmYXVsdDoNCgkJCQkJCQlvLmNoYXJDb2RlID0gdi5jaGFyQ29kZUF0KDApOw0KCQkJCQkJCW8ua2V5Q29kZSA9IHYudG9VcHBlckNhc2UoKS5jaGFyQ29kZUF0KDApOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQl0LnNob3J0Y3V0c1soby5jdHJsID8gJ2N0cmwnIDogJycpICsgJywnICsgKG8uYWx0ID8gJ2FsdCcgOiAnJykgKyAnLCcgKyAoby5zaGlmdCA/ICdzaGlmdCcgOiAnJykgKyAnLCcgKyBvLmtleUNvZGVdID0gbzsNCgkJCX0pOw0KDQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfSwNCg0KCQlleGVjQ29tbWFuZCA6IGZ1bmN0aW9uKGNtZCwgdWksIHZhbCwgYSkgew0KCQkJdmFyIHQgPSB0aGlzLCBzID0gMCwgbywgc3Q7DQoNCgkJCWlmICghL14obWNlQWRkVW5kb0xldmVsfG1jZUVuZFVuZG9MZXZlbHxtY2VCZWdpblVuZG9MZXZlbHxtY2VSZXBhaW50fFNlbGVjdEFsbCkkLy50ZXN0KGNtZCkgJiYgKCFhIHx8ICFhLnNraXBfZm9jdXMpKQ0KCQkJCXQuZm9jdXMoKTsNCg0KCQkJbyA9IHt9Ow0KCQkJdC5vbkJlZm9yZUV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgbyk7DQoJCQlpZiAoby50ZXJtaW5hdGUpDQoJCQkJcmV0dXJuIGZhbHNlOw0KDQoJCQkvLyBDb21tYW5kIGNhbGxiYWNrDQoJCQlpZiAodC5leGVjQ2FsbGJhY2soJ2V4ZWNjb21tYW5kX2NhbGxiYWNrJywgdC5pZCwgdC5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCBjbWQsIHVpLCB2YWwpKSB7DQoJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoNCgkJCS8vIFJlZ2lzdHJlZCBjb21tYW5kcw0KCQkJaWYgKG8gPSB0LmV4ZWNDb21tYW5kc1tjbWRdKSB7DQoJCQkJc3QgPSBvLmZ1bmMuY2FsbChvLnNjb3BlLCB1aSwgdmFsKTsNCg0KCQkJCS8vIEZhbGwgdGhyb3VnaCBvbiB0cnVlDQoJCQkJaWYgKHN0ICE9PSB0cnVlKSB7DQoJCQkJCXQub25FeGVjQ29tbWFuZC5kaXNwYXRjaCh0LCBjbWQsIHVpLCB2YWwsIGEpOw0KCQkJCQlyZXR1cm4gc3Q7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBQbHVnaW4gY29tbWFuZHMNCgkJCWVhY2godC5wbHVnaW5zLCBmdW5jdGlvbihwKSB7DQoJCQkJaWYgKHAuZXhlY0NvbW1hbmQgJiYgcC5leGVjQ29tbWFuZChjbWQsIHVpLCB2YWwpKSB7DQoJCQkJCXQub25FeGVjQ29tbWFuZC5kaXNwYXRjaCh0LCBjbWQsIHVpLCB2YWwsIGEpOw0KCQkJCQlzID0gMTsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQlpZiAocykNCgkJCQlyZXR1cm4gdHJ1ZTsNCg0KCQkJLy8gVGhlbWUgY29tbWFuZHMNCgkJCWlmICh0LnRoZW1lICYmIHQudGhlbWUuZXhlY0NvbW1hbmQgJiYgdC50aGVtZS5leGVjQ29tbWFuZChjbWQsIHVpLCB2YWwpKSB7DQoJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoNCgkJCS8vIEV4ZWN1dGUgZ2xvYmFsIGNvbW1hbmRzDQoJCQlpZiAodGlueW1jZS5HbG9iYWxDb21tYW5kcy5leGVjQ29tbWFuZCh0LCBjbWQsIHVpLCB2YWwpKSB7DQoJCQkJdC5vbkV4ZWNDb21tYW5kLmRpc3BhdGNoKHQsIGNtZCwgdWksIHZhbCwgYSk7DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoNCgkJCS8vIEVkaXRvciBjb21tYW5kcw0KCQkJaWYgKHQuZWRpdG9yQ29tbWFuZHMuZXhlY0NvbW1hbmQoY21kLCB1aSwgdmFsKSkgew0KCQkJCXQub25FeGVjQ29tbWFuZC5kaXNwYXRjaCh0LCBjbWQsIHVpLCB2YWwsIGEpOw0KCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KDQoJCQkvLyBCcm93c2VyIGNvbW1hbmRzDQoJCQl0LmdldERvYygpLmV4ZWNDb21tYW5kKGNtZCwgdWksIHZhbCk7DQoJCQl0Lm9uRXhlY0NvbW1hbmQuZGlzcGF0Y2godCwgY21kLCB1aSwgdmFsLCBhKTsNCgkJfSwNCg0KCQlxdWVyeUNvbW1hbmRTdGF0ZSA6IGZ1bmN0aW9uKGNtZCkgew0KCQkJdmFyIHQgPSB0aGlzLCBvLCBzOw0KDQoJCQkvLyBJcyBoaWRkZW4gdGhlbiByZXR1cm4gdW5kZWZpbmVkDQoJCQlpZiAodC5faXNIaWRkZW4oKSkNCgkJCQlyZXR1cm47DQoNCgkJCS8vIFJlZ2lzdHJlZCBjb21tYW5kcw0KCQkJaWYgKG8gPSB0LnF1ZXJ5U3RhdGVDb21tYW5kc1tjbWRdKSB7DQoJCQkJcyA9IG8uZnVuYy5jYWxsKG8uc2NvcGUpOw0KDQoJCQkJLy8gRmFsbCB0aG91Z2ggb24gdHJ1ZQ0KCQkJCWlmIChzICE9PSB0cnVlKQ0KCQkJCQlyZXR1cm4gczsNCgkJCX0NCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlvID0gdC5lZGl0b3JDb21tYW5kcy5xdWVyeUNvbW1hbmRTdGF0ZShjbWQpOw0KCQkJaWYgKG8gIT09IC0xKQ0KCQkJCXJldHVybiBvOw0KDQoJCQkvLyBCcm93c2VyIGNvbW1hbmRzDQoJCQl0cnkgew0KCQkJCXJldHVybiB0aGlzLmdldERvYygpLnF1ZXJ5Q29tbWFuZFN0YXRlKGNtZCk7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJCS8vIEZhaWxzIHNvbWV0aW1lcyBzZWUgYnVnOiAxODk2NTc3DQoJCQl9DQoJCX0sDQoNCgkJcXVlcnlDb21tYW5kVmFsdWUgOiBmdW5jdGlvbihjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIG8sIHM7DQoNCgkJCS8vIElzIGhpZGRlbiB0aGVuIHJldHVybiB1bmRlZmluZWQNCgkJCWlmICh0Ll9pc0hpZGRlbigpKQ0KCQkJCXJldHVybjsNCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlpZiAobyA9IHQucXVlcnlWYWx1ZUNvbW1hbmRzW2NdKSB7DQoJCQkJcyA9IG8uZnVuYy5jYWxsKG8uc2NvcGUpOw0KDQoJCQkJLy8gRmFsbCB0aG91Z2ggb24gdHJ1ZQ0KCQkJCWlmIChzICE9PSB0cnVlKQ0KCQkJCQlyZXR1cm4gczsNCgkJCX0NCg0KCQkJLy8gUmVnaXN0cmVkIGNvbW1hbmRzDQoJCQlvID0gdC5lZGl0b3JDb21tYW5kcy5xdWVyeUNvbW1hbmRWYWx1ZShjKTsNCgkJCWlmIChpcyhvKSkNCgkJCQlyZXR1cm4gbzsNCg0KCQkJLy8gQnJvd3NlciBjb21tYW5kcw0KCQkJdHJ5IHsNCgkJCQlyZXR1cm4gdGhpcy5nZXREb2MoKS5xdWVyeUNvbW1hbmRWYWx1ZShjKTsNCgkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJLy8gRmFpbHMgc29tZXRpbWVzIHNlZSBidWc6IDE4OTY1NzcNCgkJCX0NCgkJfSwNCg0KCQlzaG93IDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCURPTS5zaG93KHQuZ2V0Q29udGFpbmVyKCkpOw0KCQkJRE9NLmhpZGUodC5pZCk7DQoJCQl0LmxvYWQoKTsNCgkJfSwNCg0KCQloaWRlIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGQgPSB0LmdldERvYygpOw0KDQoJCQkvLyBGaXhlZCBidWcgd2hlcmUgSUUgaGFzIGEgYmxpbmtpbmcgY3Vyc29yIGxlZnQgZnJvbSB0aGUgZWRpdG9yDQoJCQlpZiAoaXNJRSAmJiBkKQ0KCQkJCWQuZXhlY0NvbW1hbmQoJ1NlbGVjdEFsbCcpOw0KDQoJCQkvLyBXZSBtdXN0IHNhdmUgYmVmb3JlIHdlIGhpZGUgc28gU2FmYXJpIGRvZXNuJ3QgY3Jhc2gNCgkJCXQuc2F2ZSgpOw0KCQkJRE9NLmhpZGUodC5nZXRDb250YWluZXIoKSk7DQoJCQlET00uc2V0U3R5bGUodC5pZCwgJ2Rpc3BsYXknLCB0Lm9yZ0Rpc3BsYXkpOw0KCQl9LA0KDQoJCWlzSGlkZGVuIDogZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gIURPTS5pc0hpZGRlbih0aGlzLmlkKTsNCgkJfSwNCg0KCQlzZXRQcm9ncmVzc1N0YXRlIDogZnVuY3Rpb24oYiwgdGksIG8pIHsNCgkJCXRoaXMub25TZXRQcm9ncmVzc1N0YXRlLmRpc3BhdGNoKHRoaXMsIGIsIHRpLCBvKTsNCg0KCQkJcmV0dXJuIGI7DQoJCX0sDQoNCgkJbG9hZCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciB0ID0gdGhpcywgZSA9IHQuZ2V0RWxlbWVudCgpLCBoOw0KDQoJCQlpZiAoZSkgew0KCQkJCW8gPSBvIHx8IHt9Ow0KCQkJCW8ubG9hZCA9IHRydWU7DQoNCgkJCQkvLyBEb3VibGUgZW5jb2RlIGV4aXN0aW5nIGVudGl0aWVzIGluIHRoZSB2YWx1ZQ0KCQkJCWggPSB0LnNldENvbnRlbnQoaXMoZS52YWx1ZSkgPyBlLnZhbHVlIDogZS5pbm5lckhUTUwsIG8pOw0KCQkJCW8uZWxlbWVudCA9IGU7DQoNCgkJCQlpZiAoIW8ubm9fZXZlbnRzKQ0KCQkJCQl0Lm9uTG9hZENvbnRlbnQuZGlzcGF0Y2godCwgbyk7DQoNCgkJCQlvLmVsZW1lbnQgPSBlID0gbnVsbDsNCg0KCQkJCXJldHVybiBoOw0KCQkJfQ0KCQl9LA0KDQoJCXNhdmUgOiBmdW5jdGlvbihvKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGUgPSB0LmdldEVsZW1lbnQoKSwgaCwgZjsNCg0KCQkJaWYgKCFlIHx8ICF0LmluaXRpYWxpemVkKQ0KCQkJCXJldHVybjsNCg0KCQkJbyA9IG8gfHwge307DQoJCQlvLnNhdmUgPSB0cnVlOw0KDQoJCQkvLyBBZGQgdW5kbyBsZXZlbCB3aWxsIHRyaWdnZXIgb25jaGFuZ2UgZXZlbnQNCgkJCWlmICghby5ub19ldmVudHMpIHsNCgkJCQl0LnVuZG9NYW5hZ2VyLnR5cGluZyA9IDA7DQoJCQkJdC51bmRvTWFuYWdlci5hZGQoKTsNCgkJCX0NCg0KCQkJby5lbGVtZW50ID0gZTsNCgkJCWggPSBvLmNvbnRlbnQgPSB0LmdldENvbnRlbnQobyk7DQoNCgkJCWlmICghby5ub19ldmVudHMpDQoJCQkJdC5vblNhdmVDb250ZW50LmRpc3BhdGNoKHQsIG8pOw0KDQoJCQloID0gby5jb250ZW50Ow0KDQoJCQlpZiAoIS9URVhUQVJFQXxJTlBVVC9pLnRlc3QoZS5ub2RlTmFtZSkpIHsNCgkJCQllLmlubmVySFRNTCA9IGg7DQoNCgkJCQkvLyBVcGRhdGUgaGlkZGVuIGZvcm0gZWxlbWVudA0KCQkJCWlmIChmID0gRE9NLmdldFBhcmVudCh0LmlkLCAnZm9ybScpKSB7DQoJCQkJCWVhY2goZi5lbGVtZW50cywgZnVuY3Rpb24oZSkgew0KCQkJCQkJaWYgKGUubmFtZSA9PSB0LmlkKSB7DQoJCQkJCQkJZS52YWx1ZSA9IGg7DQoJCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9IGVsc2UNCgkJCQllLnZhbHVlID0gaDsNCg0KCQkJby5lbGVtZW50ID0gZSA9IG51bGw7DQoNCgkJCXJldHVybiBoOw0KCQl9LA0KDQoJCXNldENvbnRlbnQgOiBmdW5jdGlvbihoLCBvKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCW8gPSBvIHx8IHt9Ow0KCQkJby5mb3JtYXQgPSBvLmZvcm1hdCB8fCAnaHRtbCc7DQoJCQlvLnNldCA9IHRydWU7DQoJCQlvLmNvbnRlbnQgPSBoOw0KDQoJCQlpZiAoIW8ubm9fZXZlbnRzKQ0KCQkJCXQub25CZWZvcmVTZXRDb250ZW50LmRpc3BhdGNoKHQsIG8pOw0KDQoJCQkvLyBQYWRkIGVtcHR5IGNvbnRlbnQgaW4gR2Vja28gYW5kIFNhZmFyaS4gQ29tbWFuZHMgd2lsbCBvdGhlcndpc2UgZmFpbCBvbiB0aGUgY29udGVudA0KCQkJLy8gSXQgd2lsbCBhbHNvIGJlIGltcG9zc2libGUgdG8gcGxhY2UgdGhlIGNhcmV0IGluIHRoZSBlZGl0b3IgdW5sZXNzIHRoZXJlIGlzIGEgQlIgZWxlbWVudCBwcmVzZW50DQoJCQlpZiAoIXRpbnltY2UuaXNJRSAmJiAoaC5sZW5ndGggPT09IDAgfHwgL15ccyskLy50ZXN0KGgpKSkgew0KCQkJCW8uY29udGVudCA9IHQuZG9tLnNldEhUTUwodC5nZXRCb2R5KCksICc8YnIgX21jZV9ib2d1cz0iMSIgLz4nKTsNCgkJCQlvLmZvcm1hdCA9ICdyYXcnOw0KCQkJfQ0KDQoJCQlvLmNvbnRlbnQgPSB0LmRvbS5zZXRIVE1MKHQuZ2V0Qm9keSgpLCB0aW55bWNlLnRyaW0oby5jb250ZW50KSk7DQoNCgkJCWlmIChvLmZvcm1hdCAhPSAncmF3JyAmJiB0LnNldHRpbmdzLmNsZWFudXApIHsNCgkJCQlvLmdldElubmVyID0gdHJ1ZTsNCgkJCQlvLmNvbnRlbnQgPSB0LmRvbS5zZXRIVE1MKHQuZ2V0Qm9keSgpLCB0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHQuZ2V0Qm9keSgpLCBvKSk7DQoJCQl9DQoNCgkJCWlmICghby5ub19ldmVudHMpDQoJCQkJdC5vblNldENvbnRlbnQuZGlzcGF0Y2godCwgbyk7DQoNCgkJCXJldHVybiBvLmNvbnRlbnQ7DQoJCX0sDQoNCgkJZ2V0Q29udGVudCA6IGZ1bmN0aW9uKG8pIHsNCgkJCXZhciB0ID0gdGhpcywgaDsNCg0KCQkJbyA9IG8gfHwge307DQoJCQlvLmZvcm1hdCA9IG8uZm9ybWF0IHx8ICdodG1sJzsNCgkJCW8uZ2V0ID0gdHJ1ZTsNCg0KCQkJaWYgKCFvLm5vX2V2ZW50cykNCgkJCQl0Lm9uQmVmb3JlR2V0Q29udGVudC5kaXNwYXRjaCh0LCBvKTsNCg0KCQkJaWYgKG8uZm9ybWF0ICE9ICdyYXcnICYmIHQuc2V0dGluZ3MuY2xlYW51cCkgew0KCQkJCW8uZ2V0SW5uZXIgPSB0cnVlOw0KCQkJCWggPSB0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHQuZ2V0Qm9keSgpLCBvKTsNCgkJCX0gZWxzZQ0KCQkJCWggPSB0LmdldEJvZHkoKS5pbm5lckhUTUw7DQoNCgkJCWggPSBoLnJlcGxhY2UoL15ccyp8XHMqJC9nLCAnJyk7DQoJCQlvLmNvbnRlbnQgPSBoOw0KDQoJCQlpZiAoIW8ubm9fZXZlbnRzKQ0KCQkJCXQub25HZXRDb250ZW50LmRpc3BhdGNoKHQsIG8pOw0KDQoJCQlyZXR1cm4gby5jb250ZW50Ow0KCQl9LA0KDQoJCWlzRGlydHkgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJcmV0dXJuIHRpbnltY2UudHJpbSh0LnN0YXJ0Q29udGVudCkgIT0gdGlueW1jZS50cmltKHQuZ2V0Q29udGVudCh7Zm9ybWF0IDogJ3JhdycsIG5vX2V2ZW50cyA6IDF9KSkgJiYgIXQuaXNOb3REaXJ0eTsNCgkJfSwNCg0KCQlnZXRDb250YWluZXIgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpczsNCg0KCQkJaWYgKCF0LmNvbnRhaW5lcikNCgkJCQl0LmNvbnRhaW5lciA9IERPTS5nZXQodC5lZGl0b3JDb250YWluZXIgfHwgdC5pZCArICdfcGFyZW50Jyk7DQoNCgkJCXJldHVybiB0LmNvbnRhaW5lcjsNCgkJfSwNCg0KCQlnZXRDb250ZW50QXJlYUNvbnRhaW5lciA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuY29udGVudEFyZWFDb250YWluZXI7DQoJCX0sDQoNCgkJZ2V0RWxlbWVudCA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIERPTS5nZXQodGhpcy5zZXR0aW5ncy5jb250ZW50X2VsZW1lbnQgfHwgdGhpcy5pZCk7DQoJCX0sDQoNCgkJZ2V0V2luIDogZnVuY3Rpb24oKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGU7DQoNCgkJCWlmICghdC5jb250ZW50V2luZG93KSB7DQoJCQkJZSA9IERPTS5nZXQodC5pZCArICJfaWZyIik7DQoNCgkJCQlpZiAoZSkNCgkJCQkJdC5jb250ZW50V2luZG93ID0gZS5jb250ZW50V2luZG93Ow0KCQkJfQ0KDQoJCQlyZXR1cm4gdC5jb250ZW50V2luZG93Ow0KCQl9LA0KDQoJCWdldERvYyA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCB3Ow0KDQoJCQlpZiAoIXQuY29udGVudERvY3VtZW50KSB7DQoJCQkJdyA9IHQuZ2V0V2luKCk7DQoNCgkJCQlpZiAodykNCgkJCQkJdC5jb250ZW50RG9jdW1lbnQgPSB3LmRvY3VtZW50Ow0KCQkJfQ0KDQoJCQlyZXR1cm4gdC5jb250ZW50RG9jdW1lbnQ7DQoJCX0sDQoNCgkJZ2V0Qm9keSA6IGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIHRoaXMuYm9keUVsZW1lbnQgfHwgdGhpcy5nZXREb2MoKS5ib2R5Ow0KCQl9LA0KDQoJCWNvbnZlcnRVUkwgOiBmdW5jdGlvbih1LCBuLCBlKSB7DQoJCQl2YXIgdCA9IHRoaXMsIHMgPSB0LnNldHRpbmdzOw0KDQoJCQkvLyBVc2UgY2FsbGJhY2sgaW5zdGVhZA0KCQkJaWYgKHMudXJsY29udmVydGVyX2NhbGxiYWNrKQ0KCQkJCXJldHVybiB0LmV4ZWNDYWxsYmFjaygndXJsY29udmVydGVyX2NhbGxiYWNrJywgdSwgZSwgdHJ1ZSwgbik7DQoNCgkJCS8vIERvbid0IGNvbnZlcnQgbGluayBocmVmIHNpbmNlIHRoYXRzIHRoZSBDU1MgZmlsZXMgdGhhdCBnZXRzIGxvYWRlZCBpbnRvIHRoZSBlZGl0b3IgYWxzbyBza2lwIGxvY2FsIGZpbGUgVVJMcw0KCQkJaWYgKCFzLmNvbnZlcnRfdXJscyB8fCAoZSAmJiBlLm5vZGVOYW1lID09ICdMSU5LJykgfHwgdS5pbmRleE9mKCdmaWxlOicpID09PSAwKQ0KCQkJCXJldHVybiB1Ow0KDQoJCQkvLyBDb252ZXJ0IHRvIHJlbGF0aXZlDQoJCQlpZiAocy5yZWxhdGl2ZV91cmxzKQ0KCQkJCXJldHVybiB0LmRvY3VtZW50QmFzZVVSSS50b1JlbGF0aXZlKHUpOw0KDQoJCQkvLyBDb252ZXJ0IHRvIGFic29sdXRlDQoJCQl1ID0gdC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZSh1LCBzLnJlbW92ZV9zY3JpcHRfaG9zdCk7DQoNCgkJCXJldHVybiB1Ow0KCQl9LA0KDQoJCWFkZFZpc3VhbCA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IHQuc2V0dGluZ3M7DQoNCgkJCWUgPSBlIHx8IHQuZ2V0Qm9keSgpOw0KDQoJCQlpZiAoIWlzKHQuaGFzVmlzdWFsKSkNCgkJCQl0Lmhhc1Zpc3VhbCA9IHMudmlzdWFsOw0KDQoJCQllYWNoKHQuZG9tLnNlbGVjdCgndGFibGUsYScsIGUpLCBmdW5jdGlvbihlKSB7DQoJCQkJdmFyIHY7DQoNCgkJCQlzd2l0Y2ggKGUubm9kZU5hbWUpIHsNCgkJCQkJY2FzZSAnVEFCTEUnOg0KCQkJCQkJdiA9IHQuZG9tLmdldEF0dHJpYihlLCAnYm9yZGVyJyk7DQoNCgkJCQkJCWlmICghdiB8fCB2ID09ICcwJykgew0KCQkJCQkJCWlmICh0Lmhhc1Zpc3VhbCkNCgkJCQkJCQkJdC5kb20uYWRkQ2xhc3MoZSwgcy52aXN1YWxfdGFibGVfY2xhc3MpOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJdC5kb20ucmVtb3ZlQ2xhc3MoZSwgcy52aXN1YWxfdGFibGVfY2xhc3MpOw0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm47DQoNCgkJCQkJY2FzZSAnQSc6DQoJCQkJCQl2ID0gdC5kb20uZ2V0QXR0cmliKGUsICduYW1lJyk7DQoNCgkJCQkJCWlmICh2KSB7DQoJCQkJCQkJaWYgKHQuaGFzVmlzdWFsKQ0KCQkJCQkJCQl0LmRvbS5hZGRDbGFzcyhlLCAnbWNlSXRlbUFuY2hvcicpOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJdC5kb20ucmVtb3ZlQ2xhc3MoZSwgJ21jZUl0ZW1BbmNob3InKTsNCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuOw0KCQkJCX0NCgkJCX0pOw0KDQoJCQl0Lm9uVmlzdWFsQWlkLmRpc3BhdGNoKHQsIGUsIHQuaGFzVmlzdWFsKTsNCgkJfSwNCg0KCQlyZW1vdmUgOiBmdW5jdGlvbigpIHsNCgkJCXZhciB0ID0gdGhpcywgZSA9IHQuZ2V0Q29udGFpbmVyKCk7DQoNCgkJCXQucmVtb3ZlZCA9IDE7IC8vIENhbmNlbHMgcG9zdCByZW1vdmUgZXZlbnQgZXhlY3V0aW9uDQoJCQl0LmhpZGUoKTsNCg0KCQkJdC5leGVjQ2FsbGJhY2soJ3JlbW92ZV9pbnN0YW5jZV9jYWxsYmFjaycsIHQpOw0KCQkJdC5vblJlbW92ZS5kaXNwYXRjaCh0KTsNCg0KCQkJLy8gQ2xlYXIgYWxsIGV4ZWNDb21tYW5kIGxpc3RlbmVycyB0aGlzIGlzIHJlcXVpcmVkIHRvIGF2b2lkIGVycm9ycyBpZiB0aGUgZWRpdG9yIHdhcyByZW1vdmVkIGluc2lkZSBhbm90aGVyIGNvbW1hbmQNCgkJCXQub25FeGVjQ29tbWFuZC5saXN0ZW5lcnMgPSBbXTsNCg0KCQkJdGlueW1jZS5yZW1vdmUodCk7DQoJCQlET00ucmVtb3ZlKGUpOw0KCQl9LA0KDQoJCWRlc3Ryb3kgOiBmdW5jdGlvbihzKSB7DQoJCQl2YXIgdCA9IHRoaXM7DQoNCgkJCS8vIE9uZSB0aW1lIGlzIGVub3VnaA0KCQkJaWYgKHQuZGVzdHJveWVkKQ0KCQkJCXJldHVybjsNCg0KCQkJaWYgKCFzKSB7DQoJCQkJdGlueW1jZS5yZW1vdmVVbmxvYWQodC5kZXN0cm95KTsNCgkJCQl0aW55TUNFLm9uQmVmb3JlVW5sb2FkLnJlbW92ZSh0Ll9iZWZvcmVVbmxvYWQpOw0KDQoJCQkJLy8gTWFudWFsIGRlc3Ryb3kNCgkJCQlpZiAodC50aGVtZSAmJiB0LnRoZW1lLmRlc3Ryb3kpDQoJCQkJCXQudGhlbWUuZGVzdHJveSgpOw0KDQoJCQkJLy8gRGVzdHJveSBjb250cm9scywgc2VsZWN0aW9uIGFuZCBkb20NCgkJCQl0LmNvbnRyb2xNYW5hZ2VyLmRlc3Ryb3koKTsNCgkJCQl0LnNlbGVjdGlvbi5kZXN0cm95KCk7DQoJCQkJdC5kb20uZGVzdHJveSgpOw0KDQoJCQkJLy8gUmVtb3ZlIGFsbCBldmVudHMNCg0KCQkJCS8vIERvbid0IGNsZWFyIHRoZSB3aW5kb3cgb3IgZG9jdW1lbnQgaWYgY29udGVudCBlZGl0YWJsZQ0KCQkJCS8vIGlzIGVuYWJsZWQgc2luY2Ugb3RoZXIgaW5zdGFuY2VzIG1pZ2h0IHN0aWxsIGJlIHByZXNlbnQNCgkJCQlpZiAoIXQuc2V0dGluZ3MuY29udGVudF9lZGl0YWJsZSkgew0KCQkJCQlFdmVudC5jbGVhcih0LmdldFdpbigpKTsNCgkJCQkJRXZlbnQuY2xlYXIodC5nZXREb2MoKSk7DQoJCQkJfQ0KDQoJCQkJRXZlbnQuY2xlYXIodC5nZXRCb2R5KCkpOw0KCQkJCUV2ZW50LmNsZWFyKHQuZm9ybUVsZW1lbnQpOw0KCQkJfQ0KDQoJCQlpZiAodC5mb3JtRWxlbWVudCkgew0KCQkJCXQuZm9ybUVsZW1lbnQuc3VibWl0ID0gdC5mb3JtRWxlbWVudC5fbWNlT2xkU3VibWl0Ow0KCQkJCXQuZm9ybUVsZW1lbnQuX21jZU9sZFN1Ym1pdCA9IG51bGw7DQoJCQl9DQoNCgkJCXQuY29udGVudEFyZWFDb250YWluZXIgPSB0LmZvcm1FbGVtZW50ID0gdC5jb250YWluZXIgPSB0LnNldHRpbmdzLmNvbnRlbnRfZWxlbWVudCA9IHQuYm9keUVsZW1lbnQgPSB0LmNvbnRlbnREb2N1bWVudCA9IHQuY29udGVudFdpbmRvdyA9IG51bGw7DQoNCgkJCWlmICh0LnNlbGVjdGlvbikNCgkJCQl0LnNlbGVjdGlvbiA9IHQuc2VsZWN0aW9uLndpbiA9IHQuc2VsZWN0aW9uLmRvbSA9IHQuc2VsZWN0aW9uLmRvbS5kb2MgPSBudWxsOw0KDQoJCQl0LmRlc3Ryb3llZCA9IDE7DQoJCX0sDQoNCgkJLy8gSW50ZXJuYWwgZnVuY3Rpb25zDQoNCgkJX2FkZEV2ZW50cyA6IGZ1bmN0aW9uKCkgew0KCQkJLy8gJ2ZvY3VzJywgJ2JsdXInLCAnZGJsY2xpY2snLCAnYmVmb3JlZGVhY3RpdmF0ZScsIHN1Ym1pdCwgcmVzZXQNCgkJCXZhciB0ID0gdGhpcywgaSwgcyA9IHQuc2V0dGluZ3MsIGRvbSA9IHQuZG9tLCBsbyA9IHsNCgkJCQltb3VzZXVwIDogJ29uTW91c2VVcCcsDQoJCQkJbW91c2Vkb3duIDogJ29uTW91c2VEb3duJywNCgkJCQljbGljayA6ICdvbkNsaWNrJywNCgkJCQlrZXl1cCA6ICdvbktleVVwJywNCgkJCQlrZXlkb3duIDogJ29uS2V5RG93bicsDQoJCQkJa2V5cHJlc3MgOiAnb25LZXlQcmVzcycsDQoJCQkJc3VibWl0IDogJ29uU3VibWl0JywNCgkJCQlyZXNldCA6ICdvblJlc2V0JywNCgkJCQljb250ZXh0bWVudSA6ICdvbkNvbnRleHRNZW51JywNCgkJCQlkYmxjbGljayA6ICdvbkRibENsaWNrJywNCgkJCQlwYXN0ZSA6ICdvblBhc3RlJyAvLyBEb2Vzbid0IHdvcmsgaW4gYWxsIGJyb3dzZXJzIHlldA0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gZXZlbnRIYW5kbGVyKGUsIG8pIHsNCgkJCQl2YXIgdHkgPSBlLnR5cGU7DQoNCgkJCQkvLyBEb24ndCBmaXJlIGV2ZW50cyB3aGVuIGl0J3MgcmVtb3ZlZA0KCQkJCWlmICh0LnJlbW92ZWQpDQoJCQkJCXJldHVybjsNCg0KCQkJCS8vIEdlbmVyaWMgZXZlbnQgaGFuZGxlcg0KCQkJCWlmICh0Lm9uRXZlbnQuZGlzcGF0Y2godCwgZSwgbykgIT09IGZhbHNlKSB7DQoJCQkJCS8vIFNwZWNpZmljIGV2ZW50IGhhbmRsZXINCgkJCQkJdFtsb1tlLmZha2VUeXBlIHx8IGUudHlwZV1dLmRpc3BhdGNoKHQsIGUsIG8pOw0KCQkJCX0NCgkJCX07DQoNCgkJCS8vIEFkZCBET00gZXZlbnRzDQoJCQllYWNoKGxvLCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJc3dpdGNoIChrKSB7DQoJCQkJCWNhc2UgJ2NvbnRleHRtZW51JzoNCgkJCQkJCWlmICh0aW55bWNlLmlzT3BlcmEpIHsNCgkJCQkJCQkvLyBGYWtlIGNvbnRleHRtZW51IG9uIE9wZXJhDQoJCQkJCQkJZG9tLmJpbmQodC5nZXRCb2R5KCksICdtb3VzZWRvd24nLCBmdW5jdGlvbihlKSB7DQoJCQkJCQkJCWlmIChlLmN0cmxLZXkpIHsNCgkJCQkJCQkJCWUuZmFrZVR5cGUgPSAnY29udGV4dG1lbnUnOw0KCQkJCQkJCQkJZXZlbnRIYW5kbGVyKGUpOw0KCQkJCQkJCQl9DQoJCQkJCQkJfSk7DQoJCQkJCQl9IGVsc2UNCgkJCQkJCQlkb20uYmluZCh0LmdldEJvZHkoKSwgaywgZXZlbnRIYW5kbGVyKTsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ3Bhc3RlJzoNCgkJCQkJCWRvbS5iaW5kKHQuZ2V0Qm9keSgpLCBrLCBmdW5jdGlvbihlKSB7DQoJCQkJCQkJZXZlbnRIYW5kbGVyKGUpOw0KCQkJCQkJfSk7DQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICdzdWJtaXQnOg0KCQkJCQljYXNlICdyZXNldCc6DQoJCQkJCQlkb20uYmluZCh0LmdldEVsZW1lbnQoKS5mb3JtIHx8IERPTS5nZXRQYXJlbnQodC5pZCwgJ2Zvcm0nKSwgaywgZXZlbnRIYW5kbGVyKTsNCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWRlZmF1bHQ6DQoJCQkJCQlkb20uYmluZChzLmNvbnRlbnRfZWRpdGFibGUgPyB0LmdldEJvZHkoKSA6IHQuZ2V0RG9jKCksIGssIGV2ZW50SGFuZGxlcik7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWRvbS5iaW5kKHMuY29udGVudF9lZGl0YWJsZSA/IHQuZ2V0Qm9keSgpIDogKGlzR2Vja28gPyB0LmdldERvYygpIDogdC5nZXRXaW4oKSksICdmb2N1cycsIGZ1bmN0aW9uKGUpIHsNCgkJCQl0LmZvY3VzKHRydWUpOw0KCQkJfSk7DQoNCg0KCQkJLy8gRml4ZXMgYnVnIHdoZXJlIGEgc3BlY2lmaWVkIGRvY3VtZW50X2Jhc2VfdXJpIGNvdWxkIHJlc3VsdCBpbiBicm9rZW4gaW1hZ2VzDQoJCQkvLyBUaGlzIHdpbGwgYWxzbyBmaXggZHJhZyBkcm9wIG9mIGltYWdlcyBpbiBHZWNrbw0KCQkJaWYgKHRpbnltY2UuaXNHZWNrbykgew0KCQkJCWRvbS5iaW5kKHQuZ2V0RG9jKCksICdET01Ob2RlSW5zZXJ0ZWQnLCBmdW5jdGlvbihlKSB7DQoJCQkJCXZhciB2Ow0KDQoJCQkJCWUgPSBlLnRhcmdldDsNCg0KCQkJCQlpZiAoZS5ub2RlVHlwZSA9PT0gMSAmJiBlLm5vZGVOYW1lID09PSAnSU1HJyAmJiAodiA9IGUuZ2V0QXR0cmlidXRlKCdfbWNlX3NyYycpKSkNCgkJCQkJCWUuc3JjID0gdC5kb2N1bWVudEJhc2VVUkkudG9BYnNvbHV0ZSh2KTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gU2V0IHZhcmlvdXMgbWlkYXMgb3B0aW9ucyBpbiBHZWNrbw0KCQkJaWYgKGlzR2Vja28pIHsNCgkJCQlmdW5jdGlvbiBzZXRPcHRzKCkgew0KCQkJCQl2YXIgdCA9IHRoaXMsIGQgPSB0LmdldERvYygpLCBzID0gdC5zZXR0aW5nczsNCg0KCQkJCQlpZiAoaXNHZWNrbyAmJiAhcy5yZWFkb25seSkgew0KCQkJCQkJaWYgKHQuX2lzSGlkZGVuKCkpIHsNCgkJCQkJCQl0cnkgew0KCQkJCQkJCQlpZiAoIXMuY29udGVudF9lZGl0YWJsZSkNCgkJCQkJCQkJCWQuZGVzaWduTW9kZSA9ICdPbic7DQoJCQkJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJCQkJLy8gRmFpbHMgaWYgaXQncyBoaWRkZW4NCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCXRyeSB7DQoJCQkJCQkJLy8gVHJ5IG5ldyBHZWNrbyBtZXRob2QNCgkJCQkJCQlkLmV4ZWNDb21tYW5kKCJzdHlsZVdpdGhDU1MiLCAwLCBmYWxzZSk7DQoJCQkJCQl9IGNhdGNoIChleCkgew0KCQkJCQkJCS8vIFVzZSBvbGQgbWV0aG9kDQoJCQkJCQkJaWYgKCF0Ll9pc0hpZGRlbigpKQ0KCQkJCQkJCQl0cnkge2QuZXhlY0NvbW1hbmQoInVzZUNTUyIsIDAsIHRydWUpO30gY2F0Y2ggKGV4KSB7fQ0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoIXMudGFibGVfaW5saW5lX2VkaXRpbmcpDQoJCQkJCQkJdHJ5IHtkLmV4ZWNDb21tYW5kKCdlbmFibGVJbmxpbmVUYWJsZUVkaXRpbmcnLCBmYWxzZSwgZmFsc2UpO30gY2F0Y2ggKGV4KSB7fQ0KDQoJCQkJCQlpZiAoIXMub2JqZWN0X3Jlc2l6aW5nKQ0KCQkJCQkJCXRyeSB7ZC5leGVjQ29tbWFuZCgnZW5hYmxlT2JqZWN0UmVzaXppbmcnLCBmYWxzZSwgZmFsc2UpO30gY2F0Y2ggKGV4KSB7fQ0KCQkJCQl9DQoJCQkJfTsNCg0KCQkJCXQub25CZWZvcmVFeGVjQ29tbWFuZC5hZGQoc2V0T3B0cyk7DQoJCQkJdC5vbk1vdXNlRG93bi5hZGQoc2V0T3B0cyk7DQoJCQl9DQoNCgkJCS8vIFdvcmthcm91bmQgZm9yIGJ1ZywgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIyNTANCgkJCS8vIFdlYktpdCBjYW4ndCBldmVuIGRvIHNpbXBsZSB0aGluZ3MgbGlrZSBzZWxlY3RpbmcgYW4gaW1hZ2UNCgkJCS8vIFRoaXMgYWxzbyBmaXhlcyBzbyBpdCdzIHBvc3NpYmxlIHRvIHNlbGVjdCBtY2VJdGVtQW5jaG9ycw0KCQkJaWYgKHRpbnltY2UuaXNXZWJLaXQpIHsNCgkJCQl0Lm9uQ2xpY2suYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCWUgPSBlLnRhcmdldDsNCg0KCQkJCQkvLyBOZWVkcyB0b2JlIHRoZSBzZXRCYXNlQW5kRXh0ZW5kIG9yIGl0IHdpbGwgZmFpbCB0byBzZWxlY3QgZmxvYXRlZCBpbWFnZXMNCgkJCQkJaWYgKGUubm9kZU5hbWUgPT0gJ0lNRycgfHwgKGUubm9kZU5hbWUgPT0gJ0EnICYmIGRvbS5oYXNDbGFzcyhlLCAnbWNlSXRlbUFuY2hvcicpKSkgew0KCQkJCQkJdC5zZWxlY3Rpb24uZ2V0U2VsKCkuc2V0QmFzZUFuZEV4dGVudChlLCAwLCBlLCAxKTsNCgkJCQkJCXQubm9kZUNoYW5nZWQoKTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBBZGQgbm9kZSBjaGFuZ2UgaGFuZGxlcnMNCgkJCXQub25Nb3VzZVVwLmFkZCh0Lm5vZGVDaGFuZ2VkKTsNCgkJCS8vdC5vbkNsaWNrLmFkZCh0Lm5vZGVDaGFuZ2VkKTsNCgkJCXQub25LZXlVcC5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQl2YXIgYyA9IGUua2V5Q29kZTsNCg0KCQkJCWlmICgoYyA+PSAzMyAmJiBjIDw9IDM2KSB8fCAoYyA+PSAzNyAmJiBjIDw9IDQwKSB8fCBjID09IDEzIHx8IGMgPT0gNDUgfHwgYyA9PSA0NiB8fCBjID09IDggfHwgKHRpbnltY2UuaXNNYWMgJiYgKGMgPT0gOTEgfHwgYyA9PSA5MykpIHx8IGUuY3RybEtleSkNCgkJCQkJdC5ub2RlQ2hhbmdlZCgpOw0KCQkJfSk7DQoNCgkJCS8vIEFkZCByZXNldCBoYW5kbGVyDQoJCQl0Lm9uUmVzZXQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCXQuc2V0Q29udGVudCh0LnN0YXJ0Q29udGVudCwge2Zvcm1hdCA6ICdyYXcnfSk7DQoJCQl9KTsNCg0KCQkJLy8gQWRkIHNob3J0Y3V0cw0KCQkJaWYgKHMuY3VzdG9tX3Nob3J0Y3V0cykgew0KCQkJCWlmIChzLmN1c3RvbV91bmRvX3JlZG9fa2V5Ym9hcmRfc2hvcnRjdXRzKSB7DQoJCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwreicsIHQuZ2V0TGFuZygndW5kb19kZXNjJyksICdVbmRvJyk7DQoJCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwreScsIHQuZ2V0TGFuZygncmVkb19kZXNjJyksICdSZWRvJyk7DQoJCQkJfQ0KDQoJCQkJLy8gQWRkIGRlZmF1bHQgc2hvcnRjdXRzIGZvciBnZWNrbw0KCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwrYicsIHQuZ2V0TGFuZygnYm9sZF9kZXNjJyksICdCb2xkJyk7DQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCtpJywgdC5nZXRMYW5nKCdpdGFsaWNfZGVzYycpLCAnSXRhbGljJyk7DQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCt1JywgdC5nZXRMYW5nKCd1bmRlcmxpbmVfZGVzYycpLCAnVW5kZXJsaW5lJyk7DQoNCgkJCQkvLyBCbG9ja0Zvcm1hdCBzaG9ydGN1dHMga2V5cw0KCQkJCWZvciAoaT0xOyBpPD02OyBpKyspDQoJCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwrJyArIGksICcnLCBbJ0Zvcm1hdEJsb2NrJywgZmFsc2UsICdoJyArIGldKTsNCg0KCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwrNycsICcnLCBbJ0Zvcm1hdEJsb2NrJywgZmFsc2UsICc8cD4nXSk7DQoJCQkJdC5hZGRTaG9ydGN1dCgnY3RybCs4JywgJycsIFsnRm9ybWF0QmxvY2snLCBmYWxzZSwgJzxkaXY+J10pOw0KCQkJCXQuYWRkU2hvcnRjdXQoJ2N0cmwrOScsICcnLCBbJ0Zvcm1hdEJsb2NrJywgZmFsc2UsICc8YWRkcmVzcz4nXSk7DQoNCgkJCQlmdW5jdGlvbiBmaW5kKGUpIHsNCgkJCQkJdmFyIHYgPSBudWxsOw0KDQoJCQkJCWlmICghZS5hbHRLZXkgJiYgIWUuY3RybEtleSAmJiAhZS5tZXRhS2V5KQ0KCQkJCQkJcmV0dXJuIHY7DQoNCgkJCQkJZWFjaCh0LnNob3J0Y3V0cywgZnVuY3Rpb24obykgew0KCQkJCQkJaWYgKHRpbnltY2UuaXNNYWMgJiYgby5jdHJsICE9IGUubWV0YUtleSkNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQllbHNlIGlmICghdGlueW1jZS5pc01hYyAmJiBvLmN0cmwgIT0gZS5jdHJsS2V5KQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJaWYgKG8uYWx0ICE9IGUuYWx0S2V5KQ0KCQkJCQkJCXJldHVybjsNCg0KCQkJCQkJaWYgKG8uc2hpZnQgIT0gZS5zaGlmdEtleSkNCgkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCWlmIChlLmtleUNvZGUgPT0gby5rZXlDb2RlIHx8IChlLmNoYXJDb2RlICYmIGUuY2hhckNvZGUgPT0gby5jaGFyQ29kZSkpIHsNCgkJCQkJCQl2ID0gbzsNCgkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQl9DQoJCQkJCX0pOw0KDQoJCQkJCXJldHVybiB2Ow0KCQkJCX07DQoNCgkJCQl0Lm9uS2V5VXAuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCXZhciBvID0gZmluZChlKTsNCg0KCQkJCQlpZiAobykNCgkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uS2V5UHJlc3MuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCXZhciBvID0gZmluZChlKTsNCg0KCQkJCQlpZiAobykNCgkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uS2V5RG93bi5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJdmFyIG8gPSBmaW5kKGUpOw0KDQoJCQkJCWlmIChvKSB7DQoJCQkJCQlvLmZ1bmMuY2FsbChvLnNjb3BlKTsNCgkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKHRpbnltY2UuaXNJRSkgew0KCQkJCS8vIEZpeCBzbyByZXNpemUgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBhdHRyaWJ1dGVzIG5vdCB0aGUgc3R5bGVzIG9mIGFuIGltYWdlDQoJCQkJLy8gSXQgd2lsbCBhbHNvIGJsb2NrIG1jZUl0ZW1Ob1Jlc2l6ZSBpdGVtcw0KCQkJCWRvbS5iaW5kKHQuZ2V0RG9jKCksICdjb250cm9sc2VsZWN0JywgZnVuY3Rpb24oZSkgew0KCQkJCQl2YXIgcmUgPSB0LnJlc2l6ZUluZm8sIGNiOw0KDQoJCQkJCWUgPSBlLnRhcmdldDsNCg0KCQkJCQkvLyBEb24ndCBkbyB0aGlzIGFjdGlvbiBmb3Igbm9uIGltYWdlIGVsZW1lbnRzDQoJCQkJCWlmIChlLm5vZGVOYW1lICE9PSAnSU1HJykNCgkJCQkJCXJldHVybjsNCg0KCQkJCQlpZiAocmUpDQoJCQkJCQlkb20udW5iaW5kKHJlLm5vZGUsIHJlLmV2LCByZS5jYik7DQoNCgkJCQkJaWYgKCFkb20uaGFzQ2xhc3MoZSwgJ21jZUl0ZW1Ob1Jlc2l6ZScpKSB7DQoJCQkJCQlldiA9ICdyZXNpemVlbmQnOw0KCQkJCQkJY2IgPSBkb20uYmluZChlLCBldiwgZnVuY3Rpb24oZSkgew0KCQkJCQkJCXZhciB2Ow0KDQoJCQkJCQkJZSA9IGUudGFyZ2V0Ow0KDQoJCQkJCQkJaWYgKHYgPSBkb20uZ2V0U3R5bGUoZSwgJ3dpZHRoJykpIHsNCgkJCQkJCQkJZG9tLnNldEF0dHJpYihlLCAnd2lkdGgnLCB2LnJlcGxhY2UoL1teMC05JV0rL2csICcnKSk7DQoJCQkJCQkJCWRvbS5zZXRTdHlsZShlLCAnd2lkdGgnLCAnJyk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJaWYgKHYgPSBkb20uZ2V0U3R5bGUoZSwgJ2hlaWdodCcpKSB7DQoJCQkJCQkJCWRvbS5zZXRBdHRyaWIoZSwgJ2hlaWdodCcsIHYucmVwbGFjZSgvW14wLTklXSsvZywgJycpKTsNCgkJCQkJCQkJZG9tLnNldFN0eWxlKGUsICdoZWlnaHQnLCAnJyk7DQoJCQkJCQkJfQ0KCQkJCQkJfSk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlldiA9ICdyZXNpemVzdGFydCc7DQoJCQkJCQljYiA9IGRvbS5iaW5kKGUsICdyZXNpemVzdGFydCcsIEV2ZW50LmNhbmNlbCwgRXZlbnQpOw0KCQkJCQl9DQoNCgkJCQkJcmUgPSB0LnJlc2l6ZUluZm8gPSB7DQoJCQkJCQlub2RlIDogZSwNCgkJCQkJCWV2IDogZXYsDQoJCQkJCQljYiA6IGNiDQoJCQkJCX07DQoJCQkJfSk7DQoNCgkJCQl0Lm9uS2V5RG93bi5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJc3dpdGNoIChlLmtleUNvZGUpIHsNCgkJCQkJCWNhc2UgODoNCgkJCQkJCQkvLyBGaXggSUUgY29udHJvbCArIGJhY2tzcGFjZSBicm93c2VyIGJ1Zw0KCQkJCQkJCWlmICh0LnNlbGVjdGlvbi5nZXRSbmcoKS5pdGVtKSB7DQoJCQkJCQkJCWVkLmRvbS5yZW1vdmUodC5zZWxlY3Rpb24uZ2V0Um5nKCkuaXRlbSgwKSk7DQoJCQkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQkvKmlmICh0LmRvbS5ib3hNb2RlbCkgew0KCQkJCQl0LmdldEJvZHkoKS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7DQoNCgkJCQkJRXZlbnQuYWRkKHQuZ2V0V2luKCksICdyZXNpemUnLCBmdW5jdGlvbihlKSB7DQoJCQkJCQl2YXIgZG9jRWxtID0gdC5nZXREb2MoKS5kb2N1bWVudEVsZW1lbnQ7DQoNCgkJCQkJCWRvY0VsbS5zdHlsZS5oZWlnaHQgPSAoZG9jRWxtLm9mZnNldEhlaWdodCAtIDEwKSArICdweCc7DQoJCQkJCX0pOw0KCQkJCX0qLw0KCQkJfQ0KDQoJCQlpZiAodGlueW1jZS5pc09wZXJhKSB7DQoJCQkJdC5vbkNsaWNrLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQlFdmVudC5wcmV2ZW50KGUpOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQkvLyBBZGQgY3VzdG9tIHVuZG8vcmVkbyBoYW5kbGVycw0KCQkJaWYgKHMuY3VzdG9tX3VuZG9fcmVkbykgew0KCQkJCWZ1bmN0aW9uIGFkZFVuZG8oKSB7DQoJCQkJCXQudW5kb01hbmFnZXIudHlwaW5nID0gMDsNCgkJCQkJdC51bmRvTWFuYWdlci5hZGQoKTsNCgkJCQl9Ow0KDQoJCQkJZG9tLmJpbmQodC5nZXREb2MoKSwgJ2ZvY3Vzb3V0JywgZnVuY3Rpb24oZSkgew0KCQkJCQlpZiAoIXQucmVtb3ZlZCAmJiB0LnVuZG9NYW5hZ2VyLnR5cGluZykNCgkJCQkJCWFkZFVuZG8oKTsNCgkJCQl9KTsNCg0KCQkJCXQub25LZXlVcC5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJaWYgKChlLmtleUNvZGUgPj0gMzMgJiYgZS5rZXlDb2RlIDw9IDM2KSB8fCAoZS5rZXlDb2RlID49IDM3ICYmIGUua2V5Q29kZSA8PSA0MCkgfHwgZS5rZXlDb2RlID09IDEzIHx8IGUua2V5Q29kZSA9PSA0NSB8fCBlLmN0cmxLZXkpDQoJCQkJCQlhZGRVbmRvKCk7DQoJCQkJfSk7DQoNCgkJCQl0Lm9uS2V5RG93bi5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJdmFyIHJuZywgcGFyZW50LCBib29rbWFyazsNCg0KCQkJCQkvLyBJRSBoYXMgYSByZWFsbHkgb2RkIGJ1ZyB3aGVyZSB0aGUgRE9NIG1pZ2h0IGluY2x1ZGUgYW4gbm9kZSB0aGF0IGRvZXNuJ3QgaGF2ZQ0KCQkJCQkvLyBhIHByb3BlciBzdHJ1Y3R1cmUuIElmIHlvdSB0cnkgdG8gYWNjZXNzIG5vZGVWYWx1ZSBpdCB3b3VsZCB0aHJvdyBhbiBpbGxlZ2FsIHZhbHVlIGV4Y2VwdGlvbi4NCgkJCQkJLy8gVGhpcyBzZWVtcyB0byBvbmx5IGhhcHBlbiB3aGVuIHlvdSBkZWxldGUgY29udGVudHMgYW5kIGl0IHNlZW1zIHRvIGJlIGF2b2lkYWJsZSBpZiB5b3UgcmVmcmVzaCB0aGUgZWxlbWVudA0KCQkJCQkvLyBhZnRlciB5b3UgZGVsZXRlIGNvbnRlbnRzIGZyb20gaXQuIFNlZTogIzMwMDg5MjMNCgkJCQkJaWYgKGlzSUUgJiYgZS5rZXlDb2RlID09IDQ2KSB7DQoJCQkJCQlybmcgPSB0LnNlbGVjdGlvbi5nZXRSbmcoKTsNCg0KCQkJCQkJaWYgKHJuZy5wYXJlbnRFbGVtZW50KSB7DQoJCQkJCQkJcGFyZW50ID0gcm5nLnBhcmVudEVsZW1lbnQoKTsNCg0KCQkJCQkJCS8vIFNlbGVjdCBuZXh0IHdvcmQgd2hlbiBjdHJsIGtleSBpcyB1c2VkIGluIGNvbWJvIHdpdGggZGVsZXRlDQoJCQkJCQkJaWYgKGUuY3RybEtleSkgew0KCQkJCQkJCQlybmcubW92ZUVuZCgnd29yZCcsIDEpOw0KCQkJCQkJCQlybmcuc2VsZWN0KCk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gRGVsZXRlIGNvbnRlbnRzDQoJCQkJCQkJdC5zZWxlY3Rpb24uZ2V0U2VsKCkuY2xlYXIoKTsNCg0KCQkJCQkJCS8vIENoZWNrIGlmIHdlIGFyZSB3aXRoaW4gdGhlIHNhbWUgcGFyZW50DQoJCQkJCQkJaWYgKHJuZy5wYXJlbnRFbGVtZW50KCkgPT0gcGFyZW50KSB7DQoJCQkJCQkJCWJvb2ttYXJrID0gdC5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKTsNCg0KCQkJCQkJCQl0cnkgew0KCQkJCQkJCQkJLy8gVXBkYXRlIHRoZSBIVE1MIGFuZCBob3BlZnVsbHkgaXQgd2lsbCByZW1vdmUgdGhlIGFydGlmYWN0cw0KCQkJCQkJCQkJcGFyZW50LmlubmVySFRNTCA9IHBhcmVudC5pbm5lckhUTUw7DQoJCQkJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkJCQkvLyBBbmQgc2luY2UgaXQncyBJRSBpdCBjYW4gc29tZXRpbWVzIHByb2R1Y2UgYW4gdW5rbm93biBydW50aW1lIGVycm9yDQoJCQkJCQkJCX0NCg0KCQkJCQkJCQkvLyBSZXN0b3JlIHRoZSBjYXJldCBwb3NpdGlvbg0KCQkJCQkJCQl0LnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhib29rbWFyayk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gQmxvY2sgdGhlIGRlZmF1bHQgZGVsZXRlIGJlaGF2aW9yIHNpbmNlIGl0IG1pZ2h0IGJlIGJyb2tlbg0KCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkvLyBJcyBjYXJhY3RlciBwb3NpdG9uIGtleXMNCgkJCQkJaWYgKChlLmtleUNvZGUgPj0gMzMgJiYgZS5rZXlDb2RlIDw9IDM2KSB8fCAoZS5rZXlDb2RlID49IDM3ICYmIGUua2V5Q29kZSA8PSA0MCkgfHwgZS5rZXlDb2RlID09IDEzIHx8IGUua2V5Q29kZSA9PSA0NSkgew0KCQkJCQkJaWYgKHQudW5kb01hbmFnZXIudHlwaW5nKQ0KCQkJCQkJCWFkZFVuZG8oKTsNCg0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoNCgkJCQkJaWYgKCF0LnVuZG9NYW5hZ2VyLnR5cGluZykgew0KCQkJCQkJdC51bmRvTWFuYWdlci5hZGQoKTsNCgkJCQkJCXQudW5kb01hbmFnZXIudHlwaW5nID0gMTsNCgkJCQkJfQ0KCQkJCX0pOw0KDQoJCQkJdC5vbk1vdXNlRG93bi5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJCWlmICh0LnVuZG9NYW5hZ2VyLnR5cGluZykNCgkJCQkJCWFkZFVuZG8oKTsNCgkJCQl9KTsNCgkJCX0NCgkJfSwNCg0KCQlfaXNIaWRkZW4gOiBmdW5jdGlvbigpIHsNCgkJCXZhciBzOw0KDQoJCQlpZiAoIWlzR2Vja28pDQoJCQkJcmV0dXJuIDA7DQoNCgkJCS8vIFdlaXJkLCB3aGVyZXMgdGhhdCBjdXJzb3Igc2VsZWN0aW9uPw0KCQkJcyA9IHRoaXMuc2VsZWN0aW9uLmdldFNlbCgpOw0KCQkJcmV0dXJuICghcyB8fCAhcy5yYW5nZUNvdW50IHx8IHMucmFuZ2VDb3VudCA9PSAwKTsNCgkJfSwNCg0KCQkvLyBGaXggZm9yIGJ1ZyAjMTg2NzI5Mg0KCQlfZml4TmVzdGluZyA6IGZ1bmN0aW9uKHMpIHsNCgkJCXZhciBkID0gW10sIGk7DQoNCgkJCXMgPSBzLnJlcGxhY2UoLzwoXC8pPyhbXlxzPl0rKVtePl0qPz4vZywgZnVuY3Rpb24oYSwgYiwgYykgew0KCQkJCXZhciBlOw0KDQoJCQkJLy8gSGFuZGxlIGVuZCBlbGVtZW50DQoJCQkJaWYgKGIgPT09ICcvJykgew0KCQkJCQlpZiAoIWQubGVuZ3RoKQ0KCQkJCQkJcmV0dXJuICcnOw0KDQoJCQkJCWlmIChjICE9PSBkW2QubGVuZ3RoIC0gMV0udGFnKSB7DQoJCQkJCQlmb3IgKGk9ZC5sZW5ndGggLSAxOyBpPj0wOyBpLS0pIHsNCgkJCQkJCQlpZiAoZFtpXS50YWcgPT09IGMpIHsNCgkJCQkJCQkJZFtpXS5jbG9zZSA9IDE7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuICcnOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJZC5wb3AoKTsNCg0KCQkJCQkJaWYgKGQubGVuZ3RoICYmIGRbZC5sZW5ndGggLSAxXS5jbG9zZSkgew0KCQkJCQkJCWEgPSBhICsgJzwvJyArIGRbZC5sZW5ndGggLSAxXS50YWcgKyAnPic7DQoJCQkJCQkJZC5wb3AoKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIElnbm9yZSB0aGVzZQ0KCQkJCQlpZiAoL14oYnJ8aHJ8aW5wdXR8bWV0YXxpbWd8bGlua3xwYXJhbSkkL2kudGVzdChjKSkNCgkJCQkJCXJldHVybiBhOw0KDQoJCQkJCS8vIElnbm9yZSBjbG9zZWQgb25lcw0KCQkJCQlpZiAoL1wvPiQvLnRlc3QoYSkpDQoJCQkJCQlyZXR1cm4gYTsNCg0KCQkJCQlkLnB1c2goe3RhZyA6IGN9KTsgLy8gUHVzaCBzdGFydCBlbGVtZW50DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGE7DQoJCQl9KTsNCg0KCQkJLy8gRW5kIGFsbCBvcGVuIHRhZ3MNCgkJCWZvciAoaT1kLmxlbmd0aCAtIDE7IGk+PTA7IGktLSkNCgkJCQlzICs9ICc8LycgKyBkW2ldLnRhZyArICc+JzsNCg0KCQkJcmV0dXJuIHM7DQoJCX0NCgl9KTsNCn0pKHRpbnltY2UpOw0KDQooZnVuY3Rpb24odGlueW1jZSkgew0KCS8vIEFkZGVkIGZvciBjb21wcmVzc2lvbiBwdXJwb3Nlcw0KCXZhciBlYWNoID0gdGlueW1jZS5lYWNoLCB1bmRlZmluZWQsIFRSVUUgPSB0cnVlLCBGQUxTRSA9IGZhbHNlOw0KDQoJdGlueW1jZS5FZGl0b3JDb21tYW5kcyA9IGZ1bmN0aW9uKGVkaXRvcikgew0KCQl2YXIgZG9tID0gZWRpdG9yLmRvbSwNCgkJCXNlbGVjdGlvbiA9IGVkaXRvci5zZWxlY3Rpb24sDQoJCQljb21tYW5kcyA9IHtzdGF0ZToge30sIGV4ZWMgOiB7fSwgdmFsdWUgOiB7fX0sDQoJCQlzZXR0aW5ncyA9IGVkaXRvci5zZXR0aW5ncywNCgkJCWJvb2ttYXJrOw0KDQoJCWZ1bmN0aW9uIGV4ZWNDb21tYW5kKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJdmFyIGZ1bmM7DQoNCgkJCWNvbW1hbmQgPSBjb21tYW5kLnRvTG93ZXJDYXNlKCk7DQoJCQlpZiAoZnVuYyA9IGNvbW1hbmRzLmV4ZWNbY29tbWFuZF0pIHsNCgkJCQlmdW5jKGNvbW1hbmQsIHVpLCB2YWx1ZSk7DQoJCQkJcmV0dXJuIFRSVUU7DQoJCQl9DQoNCgkJCXJldHVybiBGQUxTRTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBxdWVyeUNvbW1hbmRTdGF0ZShjb21tYW5kKSB7DQoJCQl2YXIgZnVuYzsNCg0KCQkJY29tbWFuZCA9IGNvbW1hbmQudG9Mb3dlckNhc2UoKTsNCgkJCWlmIChmdW5jID0gY29tbWFuZHMuc3RhdGVbY29tbWFuZF0pDQoJCQkJcmV0dXJuIGZ1bmMoY29tbWFuZCk7DQoNCgkJCXJldHVybiAtMTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBxdWVyeUNvbW1hbmRWYWx1ZShjb21tYW5kKSB7DQoJCQl2YXIgZnVuYzsNCg0KCQkJY29tbWFuZCA9IGNvbW1hbmQudG9Mb3dlckNhc2UoKTsNCgkJCWlmIChmdW5jID0gY29tbWFuZHMudmFsdWVbY29tbWFuZF0pDQoJCQkJcmV0dXJuIGZ1bmMoY29tbWFuZCk7DQoNCgkJCXJldHVybiBGQUxTRTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBhZGRDb21tYW5kcyhjb21tYW5kX2xpc3QsIHR5cGUpIHsNCgkJCXR5cGUgPSB0eXBlIHx8ICdleGVjJzsNCg0KCQkJZWFjaChjb21tYW5kX2xpc3QsIGZ1bmN0aW9uKGNhbGxiYWNrLCBjb21tYW5kKSB7DQoJCQkJZWFjaChjb21tYW5kLnRvTG93ZXJDYXNlKCkuc3BsaXQoJywnKSwgZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCQljb21tYW5kc1t0eXBlXVtjb21tYW5kXSA9IGNhbGxiYWNrOw0KCQkJCX0pOw0KCQkJfSk7DQoJCX07DQoNCgkJLy8gRXhwb3NlIHB1YmxpYyBtZXRob2RzDQoJCXRpbnltY2UuZXh0ZW5kKHRoaXMsIHsNCgkJCWV4ZWNDb21tYW5kIDogZXhlY0NvbW1hbmQsDQoJCQlxdWVyeUNvbW1hbmRTdGF0ZSA6IHF1ZXJ5Q29tbWFuZFN0YXRlLA0KCQkJcXVlcnlDb21tYW5kVmFsdWUgOiBxdWVyeUNvbW1hbmRWYWx1ZSwNCgkJCWFkZENvbW1hbmRzIDogYWRkQ29tbWFuZHMNCgkJfSk7DQoNCgkJLy8gUHJpdmF0ZSBtZXRob2RzDQoNCgkJZnVuY3Rpb24gZXhlY05hdGl2ZUNvbW1hbmQoY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQlpZiAodWkgPT09IHVuZGVmaW5lZCkNCgkJCQl1aSA9IEZBTFNFOw0KDQoJCQlpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkNCgkJCQl2YWx1ZSA9IG51bGw7DQoNCgkJCXJldHVybiBlZGl0b3IuZ2V0RG9jKCkuZXhlY0NvbW1hbmQoY29tbWFuZCwgdWksIHZhbHVlKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBpc0Zvcm1hdE1hdGNoKG5hbWUpIHsNCgkJCXJldHVybiBlZGl0b3IuZm9ybWF0dGVyLm1hdGNoKG5hbWUpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHRvZ2dsZUZvcm1hdChuYW1lLCB2YWx1ZSkgew0KCQkJZWRpdG9yLmZvcm1hdHRlci50b2dnbGUobmFtZSwgdmFsdWUgPyB7dmFsdWUgOiB2YWx1ZX0gOiB1bmRlZmluZWQpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHN0b3JlU2VsZWN0aW9uKHR5cGUpIHsNCgkJCWJvb2ttYXJrID0gc2VsZWN0aW9uLmdldEJvb2ttYXJrKHR5cGUpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHJlc3RvcmVTZWxlY3Rpb24oKSB7DQoJCQlzZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoYm9va21hcmspOw0KCQl9Ow0KDQoJCS8vIEFkZCBleGVjQ29tbWFuZCBvdmVycmlkZXMNCgkJYWRkQ29tbWFuZHMoew0KCQkJLy8gSWdub3JlIHRoZXNlLCBhZGRlZCBmb3IgY29tcGF0aWJpbGl0eQ0KCQkJJ21jZVJlc2V0RGVzaWduTW9kZSxtY2VCZWdpblVuZG9MZXZlbCcgOiBmdW5jdGlvbigpIHt9LA0KDQoJCQkvLyBBZGQgdW5kbyBtYW5hZ2VyIGxvZ2ljDQoJCQknbWNlRW5kVW5kb0xldmVsLG1jZUFkZFVuZG9MZXZlbCcgOiBmdW5jdGlvbigpIHsNCgkJCQllZGl0b3IudW5kb01hbmFnZXIuYWRkKCk7DQoJCQl9LA0KDQoJCQknQ3V0LENvcHksUGFzdGUnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXZhciBkb2MgPSBlZGl0b3IuZ2V0RG9jKCksIGZhaWxlZDsNCg0KCQkJCS8vIFRyeSBleGVjdXRpbmcgdGhlIG5hdGl2ZSBjb21tYW5kDQoJCQkJdHJ5IHsNCgkJCQkJZXhlY05hdGl2ZUNvbW1hbmQoY29tbWFuZCk7DQoJCQkJfSBjYXRjaCAoZXgpIHsNCgkJCQkJLy8gQ29tbWFuZCBmYWlsZWQNCgkJCQkJZmFpbGVkID0gVFJVRTsNCgkJCQl9DQoNCgkJCQkvLyBQcmVzZW50IGFsZXJ0IG1lc3NhZ2UgYWJvdXQgY2xpcGJvYXJkIGFjY2VzcyBub3QgYmVpbmcgYXZhaWxhYmxlDQoJCQkJaWYgKGZhaWxlZCB8fCAhZG9jLnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChjb21tYW5kKSkgew0KCQkJCQlpZiAodGlueW1jZS5pc0dlY2tvKSB7DQoJCQkJCQllZGl0b3Iud2luZG93TWFuYWdlci5jb25maXJtKGVkaXRvci5nZXRMYW5nKCdjbGlwYm9hcmRfbXNnJyksIGZ1bmN0aW9uKHN0YXRlKSB7DQoJCQkJCQkJaWYgKHN0YXRlKQ0KCQkJCQkJCQlvcGVuKCdodHRwOi8vd3d3Lm1vemlsbGEub3JnL2VkaXRvci9taWRhc2RlbW8vc2VjdXJpdHlwcmVmcy5odG1sJywgJ19ibGFuaycpOw0KCQkJCQkJfSk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJZWRpdG9yLndpbmRvd01hbmFnZXIuYWxlcnQoZWRpdG9yLmdldExhbmcoJ2NsaXBib2FyZF9ub19zdXBwb3J0JykpOw0KCQkJCX0NCgkJCX0sDQoNCgkJCS8vIE92ZXJyaWRlIHVubGluayBjb21tYW5kDQoJCQl1bmxpbmsgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJaWYgKHNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpKQ0KCQkJCQlzZWxlY3Rpb24uc2VsZWN0KHNlbGVjdGlvbi5nZXROb2RlKCkpOw0KDQoJCQkJZXhlY05hdGl2ZUNvbW1hbmQoY29tbWFuZCk7DQoJCQkJc2VsZWN0aW9uLmNvbGxhcHNlKEZBTFNFKTsNCgkJCX0sDQoNCgkJCS8vIE92ZXJyaWRlIGp1c3RpZnkgY29tbWFuZHMgdG8gdXNlIHRoZSB0ZXh0IGZvcm1hdHRlciBlbmdpbmUNCgkJCSdKdXN0aWZ5TGVmdCxKdXN0aWZ5Q2VudGVyLEp1c3RpZnlSaWdodCxKdXN0aWZ5RnVsbCcgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJdmFyIGFsaWduID0gY29tbWFuZC5zdWJzdHJpbmcoNyk7DQoNCgkJCQkvLyBSZW1vdmUgYWxsIG90aGVyIGFsaWdubWVudHMgZmlyc3QNCgkJCQllYWNoKCdsZWZ0LGNlbnRlcixyaWdodCxmdWxsJy5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7DQoJCQkJCWlmIChhbGlnbiAhPSBuYW1lKQ0KCQkJCQkJZWRpdG9yLmZvcm1hdHRlci5yZW1vdmUoJ2FsaWduJyArIG5hbWUpOw0KCQkJCX0pOw0KDQoJCQkJdG9nZ2xlRm9ybWF0KCdhbGlnbicgKyBhbGlnbik7DQoJCQl9LA0KDQoJCQkvLyBPdmVycmlkZSBsaXN0IGNvbW1hbmRzIHRvIGZpeCBXZWJLaXQgYnVnDQoJCQknSW5zZXJ0VW5vcmRlcmVkTGlzdCxJbnNlcnRPcmRlcmVkTGlzdCcgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJdmFyIGxpc3RFbG0sIGxpc3RQYXJlbnQ7DQoNCgkJCQlleGVjTmF0aXZlQ29tbWFuZChjb21tYW5kKTsNCg0KCQkJCS8vIFdlYktpdCBwcm9kdWNlcyBsaXN0cyB3aXRoaW4gYmxvY2sgZWxlbWVudHMgc28gd2UgbmVlZCB0byBzcGxpdCB0aGVtDQoJCQkJLy8gd2Ugd2lsbCByZXBsYWNlIHRoZSBuYXRpdmUgbGlzdCBjcmVhdGlvbiBsb2dpYyB0byBjdXN0b20gbG9naWMgbGF0ZXIgb24NCgkJCQkvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIHRoZSBsaXN0IGNyZWF0aW9uIGxvZ2ljIGlzIHJlbW92ZWQNCgkJCQlsaXN0RWxtID0gZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCAnb2wsdWwnKTsNCgkJCQlpZiAobGlzdEVsbSkgew0KCQkJCQlsaXN0UGFyZW50ID0gbGlzdEVsbS5wYXJlbnROb2RlOw0KDQoJCQkJCS8vIElmIGxpc3QgaXMgd2l0aGluIGEgdGV4dCBibG9jayB0aGVuIHNwbGl0IHRoYXQgYmxvY2sNCgkJCQkJaWYgKC9eKEhbMS02XXxQfEFERFJFU1N8UFJFKSQvLnRlc3QobGlzdFBhcmVudC5ub2RlTmFtZSkpIHsNCgkJCQkJCXN0b3JlU2VsZWN0aW9uKCk7DQoJCQkJCQlkb20uc3BsaXQobGlzdFBhcmVudCwgbGlzdEVsbSk7DQoJCQkJCQlyZXN0b3JlU2VsZWN0aW9uKCk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9LA0KDQoJCQkvLyBPdmVycmlkZSBjb21tYW5kcyB0byB1c2UgdGhlIHRleHQgZm9ybWF0dGVyIGVuZ2luZQ0KCQkJJ0JvbGQsSXRhbGljLFVuZGVybGluZSxTdHJpa2V0aHJvdWdoJyA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQl0b2dnbGVGb3JtYXQoY29tbWFuZCk7DQoJCQl9LA0KDQoJCQkvLyBPdmVycmlkZSBjb21tYW5kcyB0byB1c2UgdGhlIHRleHQgZm9ybWF0dGVyIGVuZ2luZQ0KCQkJJ0ZvcmVDb2xvcixIaWxpdGVDb2xvcixGb250TmFtZScgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQl0b2dnbGVGb3JtYXQoY29tbWFuZCwgdmFsdWUpOw0KCQkJfSwNCg0KCQkJRm9udFNpemUgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQl2YXIgZm9udENsYXNzZXMsIGZvbnRTaXplczsNCg0KCQkJCS8vIENvbnZlcnQgZm9udCBzaXplIDEtNyB0byBzdHlsZXMNCgkJCQlpZiAodmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSA3KSB7DQoJCQkJCWZvbnRTaXplcyA9IHRpbnltY2UuZXhwbG9kZShzZXR0aW5ncy5mb250X3NpemVfc3R5bGVfdmFsdWVzKTsNCgkJCQkJZm9udENsYXNzZXMgPSB0aW55bWNlLmV4cGxvZGUoc2V0dGluZ3MuZm9udF9zaXplX2NsYXNzZXMpOw0KDQoJCQkJCWlmIChmb250Q2xhc3NlcykNCgkJCQkJCXZhbHVlID0gZm9udENsYXNzZXNbdmFsdWUgLSAxXSB8fCB2YWx1ZTsNCgkJCQkJZWxzZQ0KCQkJCQkJdmFsdWUgPSBmb250U2l6ZXNbdmFsdWUgLSAxXSB8fCB2YWx1ZTsNCgkJCQl9DQoNCgkJCQl0b2dnbGVGb3JtYXQoY29tbWFuZCwgdmFsdWUpOw0KCQkJfSwNCg0KCQkJUmVtb3ZlRm9ybWF0IDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCWVkaXRvci5mb3JtYXR0ZXIucmVtb3ZlKGNvbW1hbmQpOw0KCQkJfSwNCg0KCQkJbWNlQmxvY2tRdW90ZSA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQl0b2dnbGVGb3JtYXQoJ2Jsb2NrcXVvdGUnKTsNCgkJCX0sDQoNCgkJCUZvcm1hdEJsb2NrIDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJcmV0dXJuIHRvZ2dsZUZvcm1hdCh2YWx1ZSB8fCAncCcpOw0KCQkJfSwNCg0KCQkJbWNlQ2xlYW51cCA6IGZ1bmN0aW9uKCkgew0KCQkJCXZhciBib29rbWFyayA9IHNlbGVjdGlvbi5nZXRCb29rbWFyaygpOw0KDQoJCQkJZWRpdG9yLnNldENvbnRlbnQoZWRpdG9yLmdldENvbnRlbnQoe2NsZWFudXAgOiBUUlVFfSksIHtjbGVhbnVwIDogVFJVRX0pOw0KDQoJCQkJc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsNCgkJCX0sDQoNCgkJCW1jZVJlbW92ZU5vZGUgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQl2YXIgbm9kZSA9IHZhbHVlIHx8IHNlbGVjdGlvbi5nZXROb2RlKCk7DQoNCgkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgYm9keSBub2RlIGlzbid0IHJlbW92ZWQNCgkJCQlpZiAobm9kZSAhPSBlZGl0b3IuZ2V0Qm9keSgpKSB7DQoJCQkJCXN0b3JlU2VsZWN0aW9uKCk7DQoJCQkJCWVkaXRvci5kb20ucmVtb3ZlKG5vZGUsIFRSVUUpOw0KCQkJCQlyZXN0b3JlU2VsZWN0aW9uKCk7DQoJCQkJfQ0KCQkJfSwNCg0KCQkJbWNlU2VsZWN0Tm9kZURlcHRoIDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJdmFyIGNvdW50ZXIgPSAwOw0KDQoJCQkJZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgY291bnRlcisrID09IHZhbHVlKSB7DQoJCQkJCQlzZWxlY3Rpb24uc2VsZWN0KG5vZGUpOw0KCQkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCQl9DQoJCQkJfSwgZWRpdG9yLmdldEJvZHkoKSk7DQoJCQl9LA0KDQoJCQltY2VTZWxlY3ROb2RlIDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJc2VsZWN0aW9uLnNlbGVjdCh2YWx1ZSk7DQoJCQl9LA0KDQoJCQltY2VJbnNlcnRDb250ZW50IDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJc2VsZWN0aW9uLnNldENvbnRlbnQodmFsdWUpOw0KCQkJfSwNCg0KCQkJbWNlSW5zZXJ0UmF3SFRNTCA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXNlbGVjdGlvbi5zZXRDb250ZW50KCd0aW55X21jZV9tYXJrZXInKTsNCgkJCQllZGl0b3Iuc2V0Q29udGVudChlZGl0b3IuZ2V0Q29udGVudCgpLnJlcGxhY2UoL3RpbnlfbWNlX21hcmtlci9nLCBmdW5jdGlvbigpIHsgcmV0dXJuIHZhbHVlIH0pKTsNCgkJCX0sDQoNCgkJCW1jZVNldENvbnRlbnQgOiBmdW5jdGlvbihjb21tYW5kLCB1aSwgdmFsdWUpIHsNCgkJCQllZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7DQoJCQl9LA0KDQoJCQknSW5kZW50LE91dGRlbnQnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXZhciBpbnRlbnRWYWx1ZSwgaW5kZW50VW5pdCwgdmFsdWU7DQoNCgkJCQkvLyBTZXR1cCBpbmRlbnQgbGV2ZWwNCgkJCQlpbnRlbnRWYWx1ZSA9IHNldHRpbmdzLmluZGVudGF0aW9uOw0KCQkJCWluZGVudFVuaXQgPSAvW2EteiVdKyQvaS5leGVjKGludGVudFZhbHVlKTsNCgkJCQlpbnRlbnRWYWx1ZSA9IHBhcnNlSW50KGludGVudFZhbHVlKTsNCg0KCQkJCWlmICghcXVlcnlDb21tYW5kU3RhdGUoJ0luc2VydFVub3JkZXJlZExpc3QnKSAmJiAhcXVlcnlDb21tYW5kU3RhdGUoJ0luc2VydE9yZGVyZWRMaXN0JykpIHsNCgkJCQkJZWFjaChzZWxlY3Rpb24uZ2V0U2VsZWN0ZWRCbG9ja3MoKSwgZnVuY3Rpb24oZWxlbWVudCkgew0KCQkJCQkJaWYgKGNvbW1hbmQgPT0gJ291dGRlbnQnKSB7DQoJCQkJCQkJdmFsdWUgPSBNYXRoLm1heCgwLCBwYXJzZUludChlbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0IHx8IDApIC0gaW50ZW50VmFsdWUpOw0KCQkJCQkJCWRvbS5zZXRTdHlsZShlbGVtZW50LCAncGFkZGluZ0xlZnQnLCB2YWx1ZSA/IHZhbHVlICsgaW5kZW50VW5pdCA6ICcnKTsNCgkJCQkJCX0gZWxzZQ0KCQkJCQkJCWRvbS5zZXRTdHlsZShlbGVtZW50LCAncGFkZGluZ0xlZnQnLCAocGFyc2VJbnQoZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCB8fCAwKSArIGludGVudFZhbHVlKSArIGluZGVudFVuaXQpOw0KCQkJCQl9KTsNCgkJCQl9IGVsc2UNCgkJCQkJZXhlY05hdGl2ZUNvbW1hbmQoY29tbWFuZCk7DQoJCQl9LA0KDQoJCQltY2VSZXBhaW50IDogZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGJvb2ttYXJrOw0KDQoJCQkJaWYgKHRpbnltY2UuaXNHZWNrbykgew0KCQkJCQl0cnkgew0KCQkJCQkJc3RvcmVTZWxlY3Rpb24oVFJVRSk7DQoNCgkJCQkJCWlmIChzZWxlY3Rpb24uZ2V0U2VsKCkpDQoJCQkJCQkJc2VsZWN0aW9uLmdldFNlbCgpLnNlbGVjdEFsbENoaWxkcmVuKGVkaXRvci5nZXRCb2R5KCkpOw0KDQoJCQkJCQlzZWxlY3Rpb24uY29sbGFwc2UoVFJVRSk7DQoJCQkJCQlyZXN0b3JlU2VsZWN0aW9uKCk7DQoJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkvLyBJZ25vcmUNCgkJCQkJfQ0KCQkJCX0NCgkJCX0sDQoNCgkJCW1jZVRvZ2dsZUZvcm1hdCA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCWVkaXRvci5mb3JtYXR0ZXIudG9nZ2xlKHZhbHVlKTsNCgkJCX0sDQoNCgkJCUluc2VydEhvcml6b250YWxSdWxlIDogZnVuY3Rpb24oKSB7DQoJCQkJc2VsZWN0aW9uLnNldENvbnRlbnQoJzxociAvPicpOw0KCQkJfSwNCg0KCQkJbWNlVG9nZ2xlVmlzdWFsQWlkIDogZnVuY3Rpb24oKSB7DQoJCQkJZWRpdG9yLmhhc1Zpc3VhbCA9ICFlZGl0b3IuaGFzVmlzdWFsOw0KCQkJCWVkaXRvci5hZGRWaXN1YWwoKTsNCgkJCX0sDQoNCgkJCW1jZVJlcGxhY2VDb250ZW50IDogZnVuY3Rpb24oY29tbWFuZCwgdWksIHZhbHVlKSB7DQoJCQkJc2VsZWN0aW9uLnNldENvbnRlbnQodmFsdWUucmVwbGFjZSgvXHtcJHNlbGVjdGlvblx9L2csIHNlbGVjdGlvbi5nZXRDb250ZW50KHtmb3JtYXQgOiAndGV4dCd9KSkpOw0KCQkJfSwNCg0KCQkJbWNlSW5zZXJ0TGluayA6IGZ1bmN0aW9uKGNvbW1hbmQsIHVpLCB2YWx1ZSkgew0KCQkJCXZhciBsaW5rID0gZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCAnYScpOw0KDQoJCQkJaWYgKHRpbnltY2UuaXModmFsdWUsICdzdHJpbmcnKSkNCgkJCQkJdmFsdWUgPSB7aHJlZiA6IHZhbHVlfTsNCg0KCQkJCWlmICghbGluaykgew0KCQkJCQlleGVjTmF0aXZlQ29tbWFuZCgnQ3JlYXRlTGluaycsIEZBTFNFLCAnamF2YXNjcmlwdDptY3RtcCgwKTsnKTsNCgkJCQkJZWFjaChkb20uc2VsZWN0KCdhW2hyZWY9amF2YXNjcmlwdDptY3RtcCgwKTtdJyksIGZ1bmN0aW9uKGxpbmspIHsNCgkJCQkJCWRvbS5zZXRBdHRyaWJzKGxpbmssIHZhbHVlKTsNCgkJCQkJfSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJaWYgKHZhbHVlLmhyZWYpDQoJCQkJCQlkb20uc2V0QXR0cmlicyhsaW5rLCB2YWx1ZSk7DQoJCQkJCWVsc2UNCgkJCQkJCWVkaXRvci5kb20ucmVtb3ZlKGxpbmssIFRSVUUpOw0KCQkJCX0NCgkJCX0sDQoJCQkNCgkJCXNlbGVjdEFsbCA6IGZ1bmN0aW9uKCkgew0KCQkJCXZhciByb290ID0gZG9tLmdldFJvb3QoKSwgcm5nID0gZG9tLmNyZWF0ZVJuZygpOw0KDQoJCQkJcm5nLnNldFN0YXJ0KHJvb3QsIDApOw0KCQkJCXJuZy5zZXRFbmQocm9vdCwgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCk7DQoNCgkJCQllZGl0b3Iuc2VsZWN0aW9uLnNldFJuZyhybmcpOw0KCQkJfQ0KCQl9KTsNCg0KCQkvLyBBZGQgcXVlcnlDb21tYW5kU3RhdGUgb3ZlcnJpZGVzDQoJCWFkZENvbW1hbmRzKHsNCgkJCS8vIE92ZXJyaWRlIGp1c3RpZnkgY29tbWFuZHMNCgkJCSdKdXN0aWZ5TGVmdCxKdXN0aWZ5Q2VudGVyLEp1c3RpZnlSaWdodCxKdXN0aWZ5RnVsbCcgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJcmV0dXJuIGlzRm9ybWF0TWF0Y2goJ2FsaWduJyArIGNvbW1hbmQuc3Vic3RyaW5nKDcpKTsNCgkJCX0sDQoNCgkJCSdCb2xkLEl0YWxpYyxVbmRlcmxpbmUsU3RyaWtldGhyb3VnaCcgOiBmdW5jdGlvbihjb21tYW5kKSB7DQoJCQkJcmV0dXJuIGlzRm9ybWF0TWF0Y2goY29tbWFuZCk7DQoJCQl9LA0KDQoJCQltY2VCbG9ja1F1b3RlIDogZnVuY3Rpb24oKSB7DQoJCQkJcmV0dXJuIGlzRm9ybWF0TWF0Y2goJ2Jsb2NrcXVvdGUnKTsNCgkJCX0sDQoNCgkJCU91dGRlbnQgOiBmdW5jdGlvbigpIHsNCgkJCQl2YXIgbm9kZTsNCg0KCQkJCWlmIChzZXR0aW5ncy5pbmxpbmVfc3R5bGVzKSB7DQoJCQkJCWlmICgobm9kZSA9IGRvbS5nZXRQYXJlbnQoc2VsZWN0aW9uLmdldFN0YXJ0KCksIGRvbS5pc0Jsb2NrKSkgJiYgcGFyc2VJbnQobm9kZS5zdHlsZS5wYWRkaW5nTGVmdCkgPiAwKQ0KCQkJCQkJcmV0dXJuIFRSVUU7DQoNCgkJCQkJaWYgKChub2RlID0gZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0RW5kKCksIGRvbS5pc0Jsb2NrKSkgJiYgcGFyc2VJbnQobm9kZS5zdHlsZS5wYWRkaW5nTGVmdCkgPiAwKQ0KCQkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIHF1ZXJ5Q29tbWFuZFN0YXRlKCdJbnNlcnRVbm9yZGVyZWRMaXN0JykgfHwgcXVlcnlDb21tYW5kU3RhdGUoJ0luc2VydE9yZGVyZWRMaXN0JykgfHwgKCFzZXR0aW5ncy5pbmxpbmVfc3R5bGVzICYmICEhZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCAnQkxPQ0tRVU9URScpKTsNCgkJCX0sDQoNCgkJCSdJbnNlcnRVbm9yZGVyZWRMaXN0LEluc2VydE9yZGVyZWRMaXN0JyA6IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCgkJCQlyZXR1cm4gZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCBjb21tYW5kID09ICdpbnNlcnR1bm9yZGVyZWRsaXN0JyA/ICdVTCcgOiAnT0wnKTsNCgkJCX0NCgkJfSwgJ3N0YXRlJyk7DQoNCgkJLy8gQWRkIHF1ZXJ5Q29tbWFuZFZhbHVlIG92ZXJyaWRlcw0KCQlhZGRDb21tYW5kcyh7DQoJCQknRm9udFNpemUsRm9udE5hbWUnIDogZnVuY3Rpb24oY29tbWFuZCkgew0KCQkJCXZhciB2YWx1ZSA9IDAsIHBhcmVudDsNCg0KCQkJCWlmIChwYXJlbnQgPSBkb20uZ2V0UGFyZW50KHNlbGVjdGlvbi5nZXROb2RlKCksICdzcGFuJykpIHsNCgkJCQkJaWYgKGNvbW1hbmQgPT0gJ2ZvbnRzaXplJykNCgkJCQkJCXZhbHVlID0gcGFyZW50LnN0eWxlLmZvbnRTaXplOw0KCQkJCQllbHNlDQoJCQkJCQl2YWx1ZSA9IHBhcmVudC5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2UoLywgL2csICcsJykucmVwbGFjZSgvW1wnXCJdL2csICcnKS50b0xvd2VyQ2FzZSgpOw0KCQkJCX0NCg0KCQkJCXJldHVybiB2YWx1ZTsNCgkJCX0NCgkJfSwgJ3ZhbHVlJyk7DQoNCgkJLy8gQWRkIHVuZG8gbWFuYWdlciBsb2dpYw0KCQlpZiAoc2V0dGluZ3MuY3VzdG9tX3VuZG9fcmVkbykgew0KCQkJYWRkQ29tbWFuZHMoew0KCQkJCVVuZG8gOiBmdW5jdGlvbigpIHsNCgkJCQkJZWRpdG9yLnVuZG9NYW5hZ2VyLnVuZG8oKTsNCgkJCQl9LA0KDQoJCQkJUmVkbyA6IGZ1bmN0aW9uKCkgew0KCQkJCQllZGl0b3IudW5kb01hbmFnZXIucmVkbygpOw0KCQkJCX0NCgkJCX0pOw0KCQl9DQoJfTsNCn0pKHRpbnltY2UpOw0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl2YXIgRGlzcGF0Y2hlciA9IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyOw0KDQoJdGlueW1jZS5VbmRvTWFuYWdlciA9IGZ1bmN0aW9uKGVkaXRvcikgew0KCQl2YXIgc2VsZiwgaW5kZXggPSAwLCBkYXRhID0gW107DQoNCgkJZnVuY3Rpb24gZ2V0Q29udGVudCgpIHsNCgkJCXJldHVybiB0aW55bWNlLnRyaW0oZWRpdG9yLmdldENvbnRlbnQoe2Zvcm1hdCA6ICdyYXcnLCBub19ldmVudHMgOiAxfSkpOw0KCQl9Ow0KDQoJCXJldHVybiBzZWxmID0gew0KCQkJdHlwaW5nIDogMCwNCg0KCQkJb25BZGQgOiBuZXcgRGlzcGF0Y2hlcihzZWxmKSwNCgkJCW9uVW5kbyA6IG5ldyBEaXNwYXRjaGVyKHNlbGYpLA0KCQkJb25SZWRvIDogbmV3IERpc3BhdGNoZXIoc2VsZiksDQoNCgkJCWFkZCA6IGZ1bmN0aW9uKGxldmVsKSB7DQoJCQkJdmFyIGksIHNldHRpbmdzID0gZWRpdG9yLnNldHRpbmdzLCBsYXN0TGV2ZWw7DQoNCgkJCQlsZXZlbCA9IGxldmVsIHx8IHt9Ow0KCQkJCWxldmVsLmNvbnRlbnQgPSBnZXRDb250ZW50KCk7DQoNCgkJCQkvLyBBZGQgdW5kbyBsZXZlbCBpZiBuZWVkZWQNCgkJCQlsYXN0TGV2ZWwgPSBkYXRhW2luZGV4XTsNCgkJCQlpZiAobGFzdExldmVsICYmIGxhc3RMZXZlbC5jb250ZW50ID09IGxldmVsLmNvbnRlbnQpIHsNCgkJCQkJaWYgKGluZGV4ID4gMCB8fCBkYXRhLmxlbmd0aCA9PSAxKQ0KCQkJCQkJcmV0dXJuIG51bGw7DQoJCQkJfQ0KDQoJCQkJLy8gVGltZSB0byBjb21wcmVzcw0KCQkJCWlmIChzZXR0aW5ncy5jdXN0b21fdW5kb19yZWRvX2xldmVscykgew0KCQkJCQlpZiAoZGF0YS5sZW5ndGggPiBzZXR0aW5ncy5jdXN0b21fdW5kb19yZWRvX2xldmVscykgew0KCQkJCQkJZm9yIChpID0gMDsgaSA8IGRhdGEubGVuZ3RoIC0gMTsgaSsrKQ0KCQkJCQkJCWRhdGFbaV0gPSBkYXRhW2kgKyAxXTsNCg0KCQkJCQkJZGF0YS5sZW5ndGgtLTsNCgkJCQkJCWluZGV4ID0gZGF0YS5sZW5ndGg7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBHZXQgYSBub24gaW50cnVzaXZlIG5vcm1hbGl6ZWQgYm9va21hcmsNCgkJCQlsZXZlbC5ib29rbWFyayA9IGVkaXRvci5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMiwgdHJ1ZSk7DQoNCgkJCQkvLyBDcm9wIGFycmF5IGlmIG5lZWRlZA0KCQkJCWlmIChpbmRleCA8IGRhdGEubGVuZ3RoIC0gMSkgew0KCQkJCQkvLyBUcmVhdCBmaXJzdCBsZXZlbCBhcyBpbml0aWFsDQoJCQkJCWlmIChpbmRleCA9PSAwKQ0KCQkJCQkJZGF0YSA9IFtdOw0KCQkJCQllbHNlDQoJCQkJCQlkYXRhLmxlbmd0aCA9IGluZGV4ICsgMTsNCgkJCQl9DQoNCgkJCQlkYXRhLnB1c2gobGV2ZWwpOw0KCQkJCWluZGV4ID0gZGF0YS5sZW5ndGggLSAxOw0KDQoJCQkJc2VsZi5vbkFkZC5kaXNwYXRjaChzZWxmLCBsZXZlbCk7DQoJCQkJZWRpdG9yLmlzTm90RGlydHkgPSAwOw0KDQoJCQkJcmV0dXJuIGxldmVsOw0KCQkJfSwNCg0KCQkJdW5kbyA6IGZ1bmN0aW9uKCkgew0KCQkJCXZhciBsZXZlbCwgaTsNCg0KCQkJCWlmIChzZWxmLnR5cGluZykgew0KCQkJCQlzZWxmLmFkZCgpOw0KCQkJCQlzZWxmLnR5cGluZyA9IDA7DQoJCQkJfQ0KDQoJCQkJaWYgKGluZGV4ID4gMCkgew0KCQkJCQlsZXZlbCA9IGRhdGFbLS1pbmRleF07DQoNCgkJCQkJZWRpdG9yLnNldENvbnRlbnQobGV2ZWwuY29udGVudCwge2Zvcm1hdCA6ICdyYXcnfSk7DQoJCQkJCWVkaXRvci5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsobGV2ZWwuYm9va21hcmspOw0KDQoJCQkJCXNlbGYub25VbmRvLmRpc3BhdGNoKHNlbGYsIGxldmVsKTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gbGV2ZWw7DQoJCQl9LA0KDQoJCQlyZWRvIDogZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGxldmVsOw0KDQoJCQkJaWYgKGluZGV4IDwgZGF0YS5sZW5ndGggLSAxKSB7DQoJCQkJCWxldmVsID0gZGF0YVsrK2luZGV4XTsNCg0KCQkJCQllZGl0b3Iuc2V0Q29udGVudChsZXZlbC5jb250ZW50LCB7Zm9ybWF0IDogJ3Jhdyd9KTsNCgkJCQkJZWRpdG9yLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhsZXZlbC5ib29rbWFyayk7DQoNCgkJCQkJc2VsZi5vblJlZG8uZGlzcGF0Y2goc2VsZiwgbGV2ZWwpOw0KCQkJCX0NCg0KCQkJCXJldHVybiBsZXZlbDsNCgkJCX0sDQoNCgkJCWNsZWFyIDogZnVuY3Rpb24oKSB7DQoJCQkJZGF0YSA9IFtdOw0KCQkJCWluZGV4ID0gc2VsZi50eXBpbmcgPSAwOw0KCQkJfSwNCg0KCQkJaGFzVW5kbyA6IGZ1bmN0aW9uKCkgew0KCQkJCXJldHVybiBpbmRleCA+IDAgfHwgc2VsZi50eXBpbmc7DQoJCQl9LA0KDQoJCQloYXNSZWRvIDogZnVuY3Rpb24oKSB7DQoJCQkJcmV0dXJuIGluZGV4IDwgZGF0YS5sZW5ndGggLSAxOw0KCQkJfQ0KCQl9Ow0KCX07DQp9KSh0aW55bWNlKTsNCg0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgkvLyBTaG9ydGVuIG5hbWVzDQoJdmFyIEV2ZW50ID0gdGlueW1jZS5kb20uRXZlbnQsDQoJCWlzSUUgPSB0aW55bWNlLmlzSUUsDQoJCWlzR2Vja28gPSB0aW55bWNlLmlzR2Vja28sDQoJCWlzT3BlcmEgPSB0aW55bWNlLmlzT3BlcmEsDQoJCWVhY2ggPSB0aW55bWNlLmVhY2gsDQoJCWV4dGVuZCA9IHRpbnltY2UuZXh0ZW5kLA0KCQlUUlVFID0gdHJ1ZSwNCgkJRkFMU0UgPSBmYWxzZTsNCg0KCWZ1bmN0aW9uIGNsb25lRm9ybWF0cyhub2RlKSB7DQoJCXZhciBjbG9uZSwgdGVtcCwgaW5uZXI7DQoNCgkJZG8gew0KCQkJaWYgKC9eKFNQQU58U1RST05HfEJ8RU18SXxGT05UfFNUUklLRXxVKSQvLnRlc3Qobm9kZS5ub2RlTmFtZSkpIHsNCgkJCQlpZiAoY2xvbmUpIHsNCgkJCQkJdGVtcCA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTsNCgkJCQkJdGVtcC5hcHBlbmRDaGlsZChjbG9uZSk7DQoJCQkJCWNsb25lID0gdGVtcDsNCgkJCQl9IGVsc2Ugew0KCQkJCQljbG9uZSA9IGlubmVyID0gbm9kZS5jbG9uZU5vZGUoZmFsc2UpOw0KCQkJCX0NCg0KCQkJCWNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsNCgkJCX0NCgkJfSB3aGlsZSAobm9kZSA9IG5vZGUucGFyZW50Tm9kZSk7DQoNCgkJaWYgKGNsb25lKQ0KCQkJcmV0dXJuIHt3cmFwcGVyIDogY2xvbmUsIGlubmVyIDogaW5uZXJ9Ow0KCX07DQoNCgkvLyBDaGVja3MgaWYgdGhlIHNlbGVjdGlvbi9jYXJldCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2sgZWxlbWVudA0KCWZ1bmN0aW9uIGlzQXRFbmQocm5nLCBwYXIpIHsNCgkJdmFyIHJuZzIgPSBwYXIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOw0KDQoJCXJuZzIuc2V0U3RhcnQocm5nLmVuZENvbnRhaW5lciwgcm5nLmVuZE9mZnNldCk7DQoJCXJuZzIuc2V0RW5kQWZ0ZXIocGFyKTsNCg0KCQkvLyBHZXQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3IgaWYgaXQncyB6ZXJvIHRoZW4gd2UgYXJlIGF0IHRoZSBlbmQgYW5kIG5lZWQgdG8gbWVyZ2UgdGhlIG5leHQgYmxvY2sgZWxlbWVudA0KCQlyZXR1cm4gcm5nMi5jbG9uZUNvbnRlbnRzKCkudGV4dENvbnRlbnQubGVuZ3RoID09IDA7DQoJfTsNCg0KCWZ1bmN0aW9uIGlzRW1wdHkobikgew0KCQluID0gbi5pbm5lckhUTUw7DQoNCgkJbiA9IG4ucmVwbGFjZSgvPChpbWd8aHJ8dGFibGV8aW5wdXR8c2VsZWN0fHRleHRhcmVhKVsgXD5dL2dpLCAnLScpOyAvLyBLZWVwIHRoZXNlIGNvbnZlcnQgdGhlbSB0byAtIGNoYXJzDQoJCW4gPSBuLnJlcGxhY2UoLzxbXj5dKz4vZywgJycpOyAvLyBSZW1vdmUgYWxsIHRhZ3MNCg0KCQlyZXR1cm4gbi5yZXBsYWNlKC9bIFx1MDBhMFx0XHJcbl0rL2csICcnKSA9PSAnJzsNCgl9Ow0KDQoJZnVuY3Rpb24gc3BsaXRMaXN0KHNlbGVjdGlvbiwgZG9tLCBsaSkgew0KCQl2YXIgbGlzdEJsb2NrLCBibG9jazsNCg0KCQlpZiAoaXNFbXB0eShsaSkpIHsNCgkJCWxpc3RCbG9jayA9IGRvbS5nZXRQYXJlbnQobGksICd1bCxvbCcpOw0KDQoJCQlpZiAoIWRvbS5nZXRQYXJlbnQobGlzdEJsb2NrLnBhcmVudE5vZGUsICd1bCxvbCcpKSB7DQoJCQkJZG9tLnNwbGl0KGxpc3RCbG9jaywgbGkpOw0KCQkJCWJsb2NrID0gZG9tLmNyZWF0ZSgncCcsIDAsICc8YnIgX21jZV9ib2d1cz0iMSIgLz4nKTsNCgkJCQlkb20ucmVwbGFjZShibG9jaywgbGkpOw0KCQkJCXNlbGVjdGlvbi5zZWxlY3QoYmxvY2ssIDEpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCg0KCQlyZXR1cm4gVFJVRTsNCgl9Ow0KDQoJdGlueW1jZS5jcmVhdGUoJ3RpbnltY2UuRm9yY2VCbG9ja3MnLCB7DQoJCUZvcmNlQmxvY2tzIDogZnVuY3Rpb24oZWQpIHsNCgkJCXZhciB0ID0gdGhpcywgcyA9IGVkLnNldHRpbmdzLCBlbG07DQoNCgkJCXQuZWRpdG9yID0gZWQ7DQoJCQl0LmRvbSA9IGVkLmRvbTsNCgkJCWVsbSA9IChzLmZvcmNlZF9yb290X2Jsb2NrIHx8ICdwJykudG9Mb3dlckNhc2UoKTsNCgkJCXMuZWxlbWVudCA9IGVsbS50b1VwcGVyQ2FzZSgpOw0KDQoJCQllZC5vblByZUluaXQuYWRkKHQuc2V0dXAsIHQpOw0KDQoJCQl0LnJlT3BlcmEgPSBuZXcgUmVnRXhwKCcoXFx1MDBhMHwmIzE2MDt8Jm5ic3A7KTxcLycgKyBlbG0gKyAnPicsICdnaScpOw0KCQkJdC5yZVBhZGQgPSBuZXcgUmVnRXhwKCc8cCggKShbXj5dKyk+PFxcXC9wPnw8cCggKShbXj5dKylcXFwvPnw8cCggKShbXj5dKyk+XFxzKzxcXFwvcD58PHA+PFxcXC9wPnw8cFxcXC8+fDxwPlxccys8XFxcL3A+Jy5yZXBsYWNlKC9wL2csIGVsbSksICdnaScpOw0KCQkJdC5yZU5ic3AyQlIxID0gbmV3IFJlZ0V4cCgnPHAoICkoW14+XSspPltcXHNcXHUwMGEwXSs8XFxcL3A+fDxwPltcXHNcXHUwMGEwXSs8XFxcL3A+Jy5yZXBsYWNlKC9wL2csIGVsbSksICdnaScpOw0KCQkJdC5yZU5ic3AyQlIyID0gbmV3IFJlZ0V4cCgnPCVwKCkoW14+XSspPigmbmJzcDt8JiMxNjA7KTxcXFwvJXA+fDwlcD4oJm5ic3A7fCYjMTYwOyk8XFxcLyVwPicucmVwbGFjZSgvJXAvZywgZWxtKSwgJ2dpJyk7DQoJCQl0LnJlQlIyTmJzcCA9IG5ldyBSZWdFeHAoJzxwKCApKFtePl0rKT5cXHMqPGJyIFxcXC8+XFxzKjxcXFwvcD58PHA+XFxzKjxiciBcXFwvPlxccyo8XFxcL3A+Jy5yZXBsYWNlKC9wL2csIGVsbSksICdnaScpOw0KDQoJCQlmdW5jdGlvbiBwYWRkKGVkLCBvKSB7DQoJCQkJaWYgKGlzT3BlcmEpDQoJCQkJCW8uY29udGVudCA9IG8uY29udGVudC5yZXBsYWNlKHQucmVPcGVyYSwgJzwvJyArIGVsbSArICc+Jyk7DQoNCgkJCQlvLmNvbnRlbnQgPSB0aW55bWNlLl9yZXBsYWNlKHQucmVQYWRkLCAnPCcgKyBlbG0gKyAnJDEkMiQzJDQkNSQ2Plx1MDBhMDwvJyArIGVsbSArICc+Jywgby5jb250ZW50KTsNCg0KCQkJCWlmICghaXNJRSAmJiAhaXNPcGVyYSAmJiBvLnNldCkgew0KCQkJCQkvLyBVc2UgJm5ic3A7IGluc3RlYWQgb2YgQlIgaW4gcGFkZGVkIHBhcmFncmFwaHMNCgkJCQkJby5jb250ZW50ID0gby5jb250ZW50LnJlcGxhY2UodC5yZU5ic3AyQlIxLCAnPCcgKyBlbG0gKyAnJDEkMj48YnIgLz48LycgKyBlbG0gKyAnPicpOw0KCQkJCQlvLmNvbnRlbnQgPSBvLmNvbnRlbnQucmVwbGFjZSh0LnJlTmJzcDJCUjIsICc8JyArIGVsbSArICckMSQyPjxiciAvPjwvJyArIGVsbSArICc+Jyk7DQoJCQkJfSBlbHNlDQoJCQkJCW8uY29udGVudCA9IHRpbnltY2UuX3JlcGxhY2UodC5yZUJSMk5ic3AsICc8JyArIGVsbSArICckMSQyPlx1MDBhMDwvJyArIGVsbSArICc+Jywgby5jb250ZW50KTsNCgkJCX07DQoNCgkJCWVkLm9uQmVmb3JlU2V0Q29udGVudC5hZGQocGFkZCk7DQoJCQllZC5vblBvc3RQcm9jZXNzLmFkZChwYWRkKTsNCg0KCQkJaWYgKHMuZm9yY2VkX3Jvb3RfYmxvY2spIHsNCgkJCQllZC5vbkluaXQuYWRkKHQuZm9yY2VSb290cywgdCk7DQoJCQkJZWQub25TZXRDb250ZW50LmFkZCh0LmZvcmNlUm9vdHMsIHQpOw0KCQkJCWVkLm9uQmVmb3JlR2V0Q29udGVudC5hZGQodC5mb3JjZVJvb3RzLCB0KTsNCgkJCX0NCgkJfSwNCg0KCQlzZXR1cCA6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBzID0gZWQuc2V0dGluZ3MsIGRvbSA9IGVkLmRvbSwgc2VsZWN0aW9uID0gZWQuc2VsZWN0aW9uOw0KDQoJCQkvLyBGb3JjZSByb290IGJsb2NrcyB3aGVuIHR5cGluZyBhbmQgd2hlbiBnZXR0aW5nIG91dHB1dA0KCQkJaWYgKHMuZm9yY2VkX3Jvb3RfYmxvY2spIHsNCgkJCQllZC5vbkJlZm9yZUV4ZWNDb21tYW5kLmFkZCh0LmZvcmNlUm9vdHMsIHQpOw0KCQkJCWVkLm9uS2V5VXAuYWRkKHQuZm9yY2VSb290cywgdCk7DQoJCQkJZWQub25QcmVQcm9jZXNzLmFkZCh0LmZvcmNlUm9vdHMsIHQpOw0KCQkJfQ0KDQoJCQlpZiAocy5mb3JjZV9icl9uZXdsaW5lcykgew0KCQkJCS8vIEZvcmNlIElFIHRvIHByb2R1Y2UgQlJzIG9uIGVudGVyDQoJCQkJaWYgKGlzSUUpIHsNCgkJCQkJZWQub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJCXZhciBuOw0KDQoJCQkJCQlpZiAoZS5rZXlDb2RlID09IDEzICYmIHNlbGVjdGlvbi5nZXROb2RlKCkubm9kZU5hbWUgIT0gJ0xJJykgew0KCQkJCQkJCXNlbGVjdGlvbi5zZXRDb250ZW50KCc8YnIgaWQ9Il9fIiAvPiAnLCB7Zm9ybWF0IDogJ3Jhdyd9KTsNCgkJCQkJCQluID0gZG9tLmdldCgnX18nKTsNCgkJCQkJCQluLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsNCgkJCQkJCQlzZWxlY3Rpb24uc2VsZWN0KG4pOw0KCQkJCQkJCXNlbGVjdGlvbi5jb2xsYXBzZSgpOw0KCQkJCQkJCXJldHVybiBFdmVudC5jYW5jZWwoZSk7DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKHMuZm9yY2VfcF9uZXdsaW5lcykgew0KCQkJCWlmICghaXNJRSkgew0KCQkJCQllZC5vbktleVByZXNzLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJaWYgKGUua2V5Q29kZSA9PSAxMyAmJiAhZS5zaGlmdEtleSAmJiAhdC5pbnNlcnRQYXJhKGUpKQ0KCQkJCQkJCUV2ZW50LmNhbmNlbChlKTsNCgkJCQkJfSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gVW5nbHkgaGFjayB0byBmb3IgSUUgdG8gcHJlc2VydmUgdGhlIGZvcm1hdHRpbmcgd2hlbiB5b3UgcHJlc3MNCgkJCQkJLy8gZW50ZXIgYXQgdGhlIGVuZCBvZiBhIGJsb2NrIGVsZW1lbnQgd2l0aCBmb3JtYXR0ZWQgY29udGVudHMNCgkJCQkJLy8gVGhpcyBsb2dpYyBvdmVycmlkZXMgdGhlIGJyb3dzZXJzIGRlZmF1bHQgbG9naWMgd2l0aA0KCQkJCQkvLyBjdXN0b20gbG9naWMgdGhhdCBlbmFibGVzIHVzIHRvIGNvbnRyb2wgdGhlIG91dHB1dA0KCQkJCQl0aW55bWNlLmFkZFVubG9hZChmdW5jdGlvbigpIHsNCgkJCQkJCXQuX3ByZXZpb3VzRm9ybWF0cyA9IDA7IC8vIEZpeCBJRSBsZWFrDQoJCQkJCX0pOw0KDQoJCQkJCWVkLm9uS2V5UHJlc3MuYWRkKGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQkJCQl0Ll9wcmV2aW91c0Zvcm1hdHMgPSAwOw0KDQoJCQkJCQkvLyBDbG9uZSB0aGUgY3VycmVudCBmb3JtYXRzLCB0aGlzIHdpbGwgbGF0ZXIgYmUgYXBwbGllZCB0byB0aGUgbmV3IGJsb2NrIGNvbnRlbnRzDQoJCQkJCQlpZiAoZS5rZXlDb2RlID09IDEzICYmICFlLnNoaWZ0S2V5ICYmIGVkLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpICYmIHMua2VlcF9zdHlsZXMpDQoJCQkJCQkJdC5fcHJldmlvdXNGb3JtYXRzID0gY2xvbmVGb3JtYXRzKGVkLnNlbGVjdGlvbi5nZXRTdGFydCgpKTsNCgkJCQkJfSk7DQoNCgkJCQkJZWQub25LZXlVcC5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJCS8vIExldCBJRSBicmVhayB0aGUgZWxlbWVudCBhbmQgdGhlIHdyYXAgdGhlIG5ldyBjYXJldCBsb2NhdGlvbiBpbiB0aGUgcHJldmlvdXMgZm9ybWF0cw0KCQkJCQkJaWYgKGUua2V5Q29kZSA9PSAxMyAmJiAhZS5zaGlmdEtleSkgew0KCQkJCQkJCXZhciBwYXJlbnQgPSBlZC5zZWxlY3Rpb24uZ2V0U3RhcnQoKSwgZm10ID0gdC5fcHJldmlvdXNGb3JtYXRzOw0KDQoJCQkJCQkJLy8gUGFyZW50IGlzIGFuIGVtcHR5IGJsb2NrDQoJCQkJCQkJaWYgKCFwYXJlbnQuaGFzQ2hpbGROb2RlcygpICYmIGZtdCkgew0KCQkJCQkJCQlwYXJlbnQgPSBkb20uZ2V0UGFyZW50KHBhcmVudCwgZG9tLmlzQmxvY2spOw0KDQoJCQkJCQkJCWlmIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVOYW1lICE9ICdMSScpIHsNCgkJCQkJCQkJCXBhcmVudC5pbm5lckhUTUwgPSAnJzsNCg0KCQkJCQkJCQkJaWYgKHQuX3ByZXZpb3VzRm9ybWF0cykgew0KCQkJCQkJCQkJCXBhcmVudC5hcHBlbmRDaGlsZChmbXQud3JhcHBlcik7DQoJCQkJCQkJCQkJZm10LmlubmVyLmlubmVySFRNTCA9ICdcdUZFRkYnOw0KCQkJCQkJCQkJfSBlbHNlDQoJCQkJCQkJCQkJcGFyZW50LmlubmVySFRNTCA9ICdcdUZFRkYnOw0KDQoJCQkJCQkJCQlzZWxlY3Rpb24uc2VsZWN0KHBhcmVudCwgMSk7DQoJCQkJCQkJCQllZC5nZXREb2MoKS5leGVjQ29tbWFuZCgnRGVsZXRlJywgZmFsc2UsIG51bGwpOw0KCQkJCQkJCQkJdC5fcHJldmlvdXNGb3JtYXRzID0gMDsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfQ0KDQoJCQkJaWYgKGlzR2Vja28pIHsNCgkJCQkJZWQub25LZXlEb3duLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJaWYgKChlLmtleUNvZGUgPT0gOCB8fCBlLmtleUNvZGUgPT0gNDYpICYmICFlLnNoaWZ0S2V5KQ0KCQkJCQkJCXQuYmFja3NwYWNlRGVsZXRlKGUsIGUua2V5Q29kZSA9PSA4KTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBXb3JrYXJvdW5kIGZvciBtaXNzaW5nIHNoaWZ0K2VudGVyIHN1cHBvcnQsIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2OTczDQoJCQlpZiAodGlueW1jZS5pc1dlYktpdCkgew0KCQkJCWZ1bmN0aW9uIGluc2VydEJyKGVkKSB7DQoJCQkJCXZhciBybmcgPSBzZWxlY3Rpb24uZ2V0Um5nKCksIGJyLCBkaXYgPSBkb20uY3JlYXRlKCdkaXYnLCBudWxsLCAnICcpLCBkaXZZUG9zLCB2cEhlaWdodCA9IGRvbS5nZXRWaWV3UG9ydChlZC5nZXRXaW4oKSkuaDsNCg0KCQkJCQkvLyBJbnNlcnQgQlIgZWxlbWVudA0KCQkJCQlybmcuaW5zZXJ0Tm9kZShiciA9IGRvbS5jcmVhdGUoJ2JyJykpOw0KDQoJCQkJCS8vIFBsYWNlIGNhcmV0IGFmdGVyIEJSDQoJCQkJCXJuZy5zZXRTdGFydEFmdGVyKGJyKTsNCgkJCQkJcm5nLnNldEVuZEFmdGVyKGJyKTsNCgkJCQkJc2VsZWN0aW9uLnNldFJuZyhybmcpOw0KDQoJCQkJCS8vIENvdWxkIG5vdCBwbGFjZSBjYXJldCBhZnRlciBCUiB0aGVuIGluc2VydCBhbiBuYnNwIGVudGl0eSBhbmQgbW92ZSB0aGUgY2FyZXQNCgkJCQkJaWYgKHNlbGVjdGlvbi5nZXRTZWwoKS5mb2N1c05vZGUgPT0gYnIucHJldmlvdXNTaWJsaW5nKSB7DQoJCQkJCQlzZWxlY3Rpb24uc2VsZWN0KGRvbS5pbnNlcnRBZnRlcihkb20uZG9jLmNyZWF0ZVRleHROb2RlKCdcdTAwYTAnKSwgYnIpKTsNCgkJCQkJCXNlbGVjdGlvbi5jb2xsYXBzZShUUlVFKTsNCgkJCQkJfQ0KDQoJCQkJCS8vIENyZWF0ZSBhIHRlbXBvcmFyeSBESVYgYWZ0ZXIgdGhlIEJSIGFuZCBnZXQgdGhlIHBvc2l0aW9uIGFzIGl0DQoJCQkJCS8vIHNlZW1zIGxpa2UgZ2V0UG9zKCkgcmV0dXJucyAwIGZvciB0ZXh0IG5vZGVzIGFuZCBCUiBlbGVtZW50cy4NCgkJCQkJZG9tLmluc2VydEFmdGVyKGRpdiwgYnIpOw0KCQkJCQlkaXZZUG9zID0gZG9tLmdldFBvcyhkaXYpLnk7DQoJCQkJCWRvbS5yZW1vdmUoZGl2KTsNCg0KCQkJCQkvLyBTY3JvbGwgdG8gbmV3IHBvc2l0aW9uLCBzY3JvbGxJbnRvVmlldyBjYW4ndCBiZSB1c2VkIGR1ZSB0byBidWc6IGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2MTE3DQoJCQkJCWlmIChkaXZZUG9zID4gdnBIZWlnaHQpIC8vIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gc2Nyb2xsIGlmIHRoZSBESVYgaXMgaW5zaWRlIHRoZSB2aWV3IHBvcnQuDQoJCQkJCQllZC5nZXRXaW4oKS5zY3JvbGxUbygwLCBkaXZZUG9zKTsNCgkJCQl9Ow0KDQoJCQkJZWQub25LZXlQcmVzcy5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJaWYgKGUua2V5Q29kZSA9PSAxMyAmJiAoZS5zaGlmdEtleSB8fCAocy5mb3JjZV9icl9uZXdsaW5lcyAmJiAhZG9tLmdldFBhcmVudChzZWxlY3Rpb24uZ2V0Tm9kZSgpLCAnaDEsaDIsaDMsaDQsaDUsaDYsb2wsdWwnKSkpKSB7DQoJCQkJCQlpbnNlcnRCcihlZCk7DQoJCQkJCQlFdmVudC5jYW5jZWwoZSk7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJLy8gUGFkZCBlbXB0eSBpbmxpbmUgZWxlbWVudHMgd2l0aGluIGJsb2NrIGVsZW1lbnRzDQoJCQkvLyBGb3IgZXhhbXBsZTogPHA+PHN0cm9uZz48ZW0+PC9lbT48L3N0cm9uZz48L3A+IGJlY29tZXMgPHA+PHN0cm9uZz48ZW0+Jm5ic3A7PC9lbT48L3N0cm9uZz48L3A+DQoJCQllZC5vblByZVByb2Nlc3MuYWRkKGZ1bmN0aW9uKGVkLCBvKSB7DQoJCQkJZWFjaChkb20uc2VsZWN0KCdwLGgxLGgyLGgzLGg0LGg1LGg2LGRpdicsIG8ubm9kZSksIGZ1bmN0aW9uKHApIHsNCgkJCQkJaWYgKGlzRW1wdHkocCkpIHsNCgkJCQkJCWVhY2goZG9tLnNlbGVjdCgnc3BhbixlbSxzdHJvbmcsYixpJywgby5ub2RlKSwgZnVuY3Rpb24obikgew0KCQkJCQkJCWlmICghbi5oYXNDaGlsZE5vZGVzKCkpIHsNCgkJCQkJCQkJbi5hcHBlbmRDaGlsZChlZC5nZXREb2MoKS5jcmVhdGVUZXh0Tm9kZSgnXHUwMGEwJykpOw0KCQkJCQkJCQlyZXR1cm4gRkFMU0U7IC8vIEJyZWFrIHRoZSBsb29wIG9uZSBwYWRkaW5nIGlzIGVub3VnaA0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9KTsNCg0KCQkJLy8gSUUgc3BlY2lmaWMgZml4ZXMNCgkJCWlmIChpc0lFKSB7DQoJCQkJLy8gUmVwbGFjZXMgSUU6cyBhdXRvIGdlbmVyYXRlZCBwYXJhZ3JhcGhzIHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IG5hbWUNCgkJCQlpZiAocy5lbGVtZW50ICE9ICdQJykgew0KCQkJCQllZC5vbktleVByZXNzLmFkZChmdW5jdGlvbihlZCwgZSkgew0KCQkJCQkJdC5sYXN0RWxtID0gc2VsZWN0aW9uLmdldE5vZGUoKS5ub2RlTmFtZTsNCgkJCQkJfSk7DQoNCgkJCQkJZWQub25LZXlVcC5hZGQoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJCXZhciBibCwgbiA9IHNlbGVjdGlvbi5nZXROb2RlKCksIGIgPSBlZC5nZXRCb2R5KCk7DQoNCgkJCQkJCWlmIChiLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIG4ubm9kZU5hbWUgPT0gJ1AnKSB7DQoJCQkJCQkJbiA9IGRvbS5yZW5hbWUobiwgcy5lbGVtZW50KTsNCgkJCQkJCQlzZWxlY3Rpb24uc2VsZWN0KG4pOw0KCQkJCQkJCXNlbGVjdGlvbi5jb2xsYXBzZSgpOw0KCQkJCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCQkJCQl9IGVsc2UgaWYgKGUua2V5Q29kZSA9PSAxMyAmJiAhZS5zaGlmdEtleSAmJiB0Lmxhc3RFbG0gIT0gJ1AnKSB7DQoJCQkJCQkJYmwgPSBkb20uZ2V0UGFyZW50KG4sICdwJyk7DQoNCgkJCQkJCQlpZiAoYmwpIHsNCgkJCQkJCQkJZG9tLnJlbmFtZShibCwgcy5lbGVtZW50KTsNCgkJCQkJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0NCgkJfSwNCg0KCQlmaW5kIDogZnVuY3Rpb24obiwgdCwgcykgew0KCQkJdmFyIGVkID0gdGhpcy5lZGl0b3IsIHcgPSBlZC5nZXREb2MoKS5jcmVhdGVUcmVlV2Fsa2VyKG4sIDQsIG51bGwsIEZBTFNFKSwgYyA9IC0xOw0KDQoJCQl3aGlsZSAobiA9IHcubmV4dE5vZGUoKSkgew0KCQkJCWMrKzsNCg0KCQkJCS8vIEluZGV4IGJ5IG5vZGUNCgkJCQlpZiAodCA9PSAwICYmIG4gPT0gcykNCgkJCQkJcmV0dXJuIGM7DQoNCgkJCQkvLyBOb2RlIGJ5IGluZGV4DQoJCQkJaWYgKHQgPT0gMSAmJiBjID09IHMpDQoJCQkJCXJldHVybiBuOw0KCQkJfQ0KDQoJCQlyZXR1cm4gLTE7DQoJCX0sDQoNCgkJZm9yY2VSb290cyA6IGZ1bmN0aW9uKGVkLCBlKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIGIgPSBlZC5nZXRCb2R5KCksIGQgPSBlZC5nZXREb2MoKSwgc2UgPSBlZC5zZWxlY3Rpb24sIHMgPSBzZS5nZXRTZWwoKSwgciA9IHNlLmdldFJuZygpLCBzaSA9IC0yLCBlaSwgc28sIGVvLCB0ciwgYyA9IC0weEZGRkZGRjsNCgkJCXZhciBueCwgYmwsIGJwLCBzcCwgbGUsIG5sID0gYi5jaGlsZE5vZGVzLCBpLCBuLCBlaWQ7DQoNCgkJCS8vIEZpeCBmb3IgYnVnICMxODYzODQ3DQoJCQkvL2lmIChlICYmIGUua2V5Q29kZSA9PSAxMykNCgkJCS8vCXJldHVybiBUUlVFOw0KDQoJCQkvLyBXcmFwIG5vbiBibG9ja3MgaW50byBibG9ja3MNCgkJCWZvciAoaSA9IG5sLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJbnggPSBubFtpXTsNCg0KCQkJCS8vIElnbm9yZSBpbnRlcm5hbCBlbGVtZW50cw0KCQkJCWlmIChueC5ub2RlVHlwZSA9PT0gMSAmJiBueC5nZXRBdHRyaWJ1dGUoJ19tY2VfdHlwZScpKSB7DQoJCQkJCWJsID0gbnVsbDsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KDQoJCQkJLy8gSXMgdGV4dCBvciBub24gYmxvY2sgZWxlbWVudA0KCQkJCWlmIChueC5ub2RlVHlwZSA9PT0gMyB8fCAoIXQuZG9tLmlzQmxvY2sobngpICYmIG54Lm5vZGVUeXBlICE9PSA4ICYmICEvXihzY3JpcHR8bWNlOnNjcmlwdHxzdHlsZXxtY2U6c3R5bGUpJC9pLnRlc3Qobngubm9kZU5hbWUpKSkgew0KCQkJCQlpZiAoIWJsKSB7DQoJCQkJCQkvLyBDcmVhdGUgbmV3IGJsb2NrIGJ1dCBpZ25vcmUgd2hpdGVzcGFjZQ0KCQkJCQkJaWYgKG54Lm5vZGVUeXBlICE9IDMgfHwgL1teXHNdL2cudGVzdChueC5ub2RlVmFsdWUpKSB7DQoJCQkJCQkJLy8gU3RvcmUgc2VsZWN0aW9uDQoJCQkJCQkJaWYgKHNpID09IC0yICYmIHIpIHsNCgkJCQkJCQkJaWYgKCFpc0lFIHx8IHIuc2V0U3RhcnQpIHsNCgkJCQkJCQkJCS8vIElmIHNlbGVjdGlvbiBpcyBlbGVtZW50IHRoZW4gbWFyayBpdA0KCQkJCQkJCQkJaWYgKHIuc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMSAmJiAobiA9IHIuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tyLnN0YXJ0T2Zmc2V0XSkgJiYgbi5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJCQkJCQkJLy8gU2F2ZSB0aGUgaWQgb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnQNCgkJCQkJCQkJCQllaWQgPSBuLmdldEF0dHJpYnV0ZSgiaWQiKTsNCgkJCQkJCQkJCQluLnNldEF0dHJpYnV0ZSgiaWQiLCAiX19tY2UiKTsNCgkJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQkJLy8gSWYgZWxlbWVudCBpcyBpbnNpZGUgYm9keSwgbWlnaHQgbm90IGJlIHRoZSBjYXNlIGluIGNvbnRlbnRFZGlhYmxlIG1vZGUNCgkJCQkJCQkJCQlpZiAoZWQuZG9tLmdldFBhcmVudChyLnN0YXJ0Q29udGFpbmVyLCBmdW5jdGlvbihlKSB7cmV0dXJuIGUgPT09IGI7fSkpIHsNCgkJCQkJCQkJCQkJc28gPSByLnN0YXJ0T2Zmc2V0Ow0KCQkJCQkJCQkJCQllbyA9IHIuZW5kT2Zmc2V0Ow0KCQkJCQkJCQkJCQlzaSA9IHQuZmluZChiLCAwLCByLnN0YXJ0Q29udGFpbmVyKTsNCgkJCQkJCQkJCQkJZWkgPSB0LmZpbmQoYiwgMCwgci5lbmRDb250YWluZXIpOw0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCX0NCgkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCS8vIEZvcmNlIGNvbnRyb2wgcmFuZ2UgaW50byB0ZXh0IHJhbmdlDQoJCQkJCQkJCQlpZiAoci5pdGVtKSB7DQoJCQkJCQkJCQkJdHIgPSBkLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7DQoJCQkJCQkJCQkJdHIubW92ZVRvRWxlbWVudFRleHQoci5pdGVtKDApKTsNCgkJCQkJCQkJCQlyID0gdHI7DQoJCQkJCQkJCQl9DQoNCgkJCQkJCQkJCXRyID0gZC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOw0KCQkJCQkJCQkJdHIubW92ZVRvRWxlbWVudFRleHQoYik7DQoJCQkJCQkJCQl0ci5jb2xsYXBzZSgxKTsNCgkJCQkJCQkJCWJwID0gdHIubW92ZSgnY2hhcmFjdGVyJywgYykgKiAtMTsNCg0KCQkJCQkJCQkJdHIgPSByLmR1cGxpY2F0ZSgpOw0KCQkJCQkJCQkJdHIuY29sbGFwc2UoMSk7DQoJCQkJCQkJCQlzcCA9IHRyLm1vdmUoJ2NoYXJhY3RlcicsIGMpICogLTE7DQoNCgkJCQkJCQkJCXRyID0gci5kdXBsaWNhdGUoKTsNCgkJCQkJCQkJCXRyLmNvbGxhcHNlKDApOw0KCQkJCQkJCQkJbGUgPSAodHIubW92ZSgnY2hhcmFjdGVyJywgYykgKiAtMSkgLSBzcDsNCg0KCQkJCQkJCQkJc2kgPSBzcCAtIGJwOw0KCQkJCQkJCQkJZWkgPSBsZTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCg0KCQkJCQkJCS8vIFVzZXMgcmVwbGFjZUNoaWxkIGluc3RlYWQgb2YgY2xvbmVOb2RlIHNpbmNlIGl0IHJlbW92ZXMgc2VsZWN0ZWQgYXR0cmlidXRlIGZyb20gb3B0aW9uIGVsZW1lbnRzIG9uIElFDQoJCQkJCQkJLy8gU2VlOiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzgyOTkwNw0KCQkJCQkJCWJsID0gZWQuZG9tLmNyZWF0ZShlZC5zZXR0aW5ncy5mb3JjZWRfcm9vdF9ibG9jayk7DQoJCQkJCQkJbngucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYmwsIG54KTsNCgkJCQkJCQlibC5hcHBlbmRDaGlsZChueCk7DQoJCQkJCQl9DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlpZiAoYmwuaGFzQ2hpbGROb2RlcygpKQ0KCQkJCQkJCWJsLmluc2VydEJlZm9yZShueCwgYmwuZmlyc3RDaGlsZCk7DQoJCQkJCQllbHNlDQoJCQkJCQkJYmwuYXBwZW5kQ2hpbGQobngpOw0KCQkJCQl9DQoJCQkJfSBlbHNlDQoJCQkJCWJsID0gbnVsbDsgLy8gVGltZSB0byBjcmVhdGUgbmV3IGJsb2NrDQoJCQl9DQoNCgkJCS8vIFJlc3RvcmUgc2VsZWN0aW9uDQoJCQlpZiAoc2kgIT0gLTIpIHsNCgkJCQlpZiAoIWlzSUUgfHwgci5zZXRTdGFydCkgew0KCQkJCQlibCA9IGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZWQuc2V0dGluZ3MuZWxlbWVudClbMF07DQoJCQkJCXIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoNCgkJCQkJLy8gU2VsZWN0IGxhc3QgbG9jYXRpb24gb3IgZ2VuZXJhdGVkIGJsb2NrDQoJCQkJCWlmIChzaSAhPSAtMSkNCgkJCQkJCXIuc2V0U3RhcnQodC5maW5kKGIsIDEsIHNpKSwgc28pOw0KCQkJCQllbHNlDQoJCQkJCQlyLnNldFN0YXJ0KGJsLCAwKTsNCg0KCQkJCQkvLyBTZWxlY3QgbGFzdCBsb2NhdGlvbiBvciBnZW5lcmF0ZWQgYmxvY2sNCgkJCQkJaWYgKGVpICE9IC0xKQ0KCQkJCQkJci5zZXRFbmQodC5maW5kKGIsIDEsIGVpKSwgZW8pOw0KCQkJCQllbHNlDQoJCQkJCQlyLnNldEVuZChibCwgMCk7DQoNCgkJCQkJaWYgKHMpIHsNCgkJCQkJCXMucmVtb3ZlQWxsUmFuZ2VzKCk7DQoJCQkJCQlzLmFkZFJhbmdlKHIpOw0KCQkJCQl9DQoJCQkJfSBlbHNlIHsNCgkJCQkJdHJ5IHsNCgkJCQkJCXIgPSBzLmNyZWF0ZVJhbmdlKCk7DQoJCQkJCQlyLm1vdmVUb0VsZW1lbnRUZXh0KGIpOw0KCQkJCQkJci5jb2xsYXBzZSgxKTsNCgkJCQkJCXIubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBzaSk7DQoJCQkJCQlyLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGVpKTsNCgkJCQkJCXIuc2VsZWN0KCk7DQoJCQkJCX0gY2F0Y2ggKGV4KSB7DQoJCQkJCQkvLyBJZ25vcmUNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSBpZiAoKCFpc0lFIHx8IHIuc2V0U3RhcnQpICYmIChuID0gZWQuZG9tLmdldCgnX19tY2UnKSkpIHsNCgkJCQkvLyBSZXN0b3JlIHRoZSBpZCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudA0KCQkJCWlmIChlaWQpDQoJCQkJCW4uc2V0QXR0cmlidXRlKCdpZCcsIGVpZCk7DQoJCQkJZWxzZQ0KCQkJCQluLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsNCg0KCQkJCS8vIE1vdmUgY2FyZXQgYmVmb3JlIHNlbGVjdGVkIGVsZW1lbnQNCgkJCQlyID0gZC5jcmVhdGVSYW5nZSgpOw0KCQkJCXIuc2V0U3RhcnRCZWZvcmUobik7DQoJCQkJci5zZXRFbmRCZWZvcmUobik7DQoJCQkJc2Uuc2V0Um5nKHIpOw0KCQkJfQ0KCQl9LA0KDQoJCWdldFBhcmVudEJsb2NrIDogZnVuY3Rpb24obikgew0KCQkJdmFyIGQgPSB0aGlzLmRvbTsNCg0KCQkJcmV0dXJuIGQuZ2V0UGFyZW50KG4sIGQuaXNCbG9jayk7DQoJCX0sDQoNCgkJaW5zZXJ0UGFyYSA6IGZ1bmN0aW9uKGUpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgZG9tID0gZWQuZG9tLCBkID0gZWQuZ2V0RG9jKCksIHNlID0gZWQuc2V0dGluZ3MsIHMgPSBlZC5zZWxlY3Rpb24uZ2V0U2VsKCksIHIgPSBzLmdldFJhbmdlQXQoMCksIGIgPSBkLmJvZHk7DQoJCQl2YXIgcmIsIHJhLCBkaXIsIHNuLCBzbywgZW4sIGVvLCBzYiwgZWIsIGJuLCBiZWYsIGFmdCwgc2MsIGVjLCBuLCB2cCA9IGRvbS5nZXRWaWV3UG9ydChlZC5nZXRXaW4oKSksIHksIGNoLCBjYXI7DQoNCgkJCS8vIElmIHJvb3QgYmxvY2tzIGFyZSBmb3JjZWQgdGhlbiB1c2UgT3BlcmFzIGRlZmF1bHQgYmVoYXZpb3Igc2luY2UgaXQncyByZWFsbHkgZ29vZA0KLy8gUmVtb3ZlZCBkdWUgdG8gYnVnOiAjMTg1MzgxNg0KLy8JCQlpZiAoc2UuZm9yY2VkX3Jvb3RfYmxvY2sgJiYgaXNPcGVyYSkNCi8vCQkJCXJldHVybiBUUlVFOw0KDQoJCQkvLyBTZXR1cCBiZWZvcmUgcmFuZ2UNCgkJCXJiID0gZC5jcmVhdGVSYW5nZSgpOw0KDQoJCQkvLyBJZiBpcyBiZWZvcmUgdGhlIGZpcnN0IGJsb2NrIGVsZW1lbnQgYW5kIGluIGJvZHksIHRoZW4gbW92ZSBpdCBpbnRvIGZpcnN0IGJsb2NrIGVsZW1lbnQNCgkJCXJiLnNldFN0YXJ0KHMuYW5jaG9yTm9kZSwgcy5hbmNob3JPZmZzZXQpOw0KCQkJcmIuY29sbGFwc2UoVFJVRSk7DQoNCgkJCS8vIFNldHVwIGFmdGVyIHJhbmdlDQoJCQlyYSA9IGQuY3JlYXRlUmFuZ2UoKTsNCg0KCQkJLy8gSWYgaXMgYmVmb3JlIHRoZSBmaXJzdCBibG9jayBlbGVtZW50IGFuZCBpbiBib2R5LCB0aGVuIG1vdmUgaXQgaW50byBmaXJzdCBibG9jayBlbGVtZW50DQoJCQlyYS5zZXRTdGFydChzLmZvY3VzTm9kZSwgcy5mb2N1c09mZnNldCk7DQoJCQlyYS5jb2xsYXBzZShUUlVFKTsNCg0KCQkJLy8gU2V0dXAgc3RhcnQvZW5kIHBvaW50cw0KCQkJZGlyID0gcmIuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHJiLlNUQVJUX1RPX0VORCwgcmEpIDwgMDsNCgkJCXNuID0gZGlyID8gcy5hbmNob3JOb2RlIDogcy5mb2N1c05vZGU7DQoJCQlzbyA9IGRpciA/IHMuYW5jaG9yT2Zmc2V0IDogcy5mb2N1c09mZnNldDsNCgkJCWVuID0gZGlyID8gcy5mb2N1c05vZGUgOiBzLmFuY2hvck5vZGU7DQoJCQllbyA9IGRpciA/IHMuZm9jdXNPZmZzZXQgOiBzLmFuY2hvck9mZnNldDsNCg0KCQkJLy8gSWYgc2VsZWN0aW9uIGlzIGluIGVtcHR5IHRhYmxlIGNlbGwNCgkJCWlmIChzbiA9PT0gZW4gJiYgL14oVER8VEgpJC8udGVzdChzbi5ub2RlTmFtZSkpIHsNCgkJCQlpZiAoc24uZmlyc3RDaGlsZC5ub2RlTmFtZSA9PSAnQlInKQ0KCQkJCQlkb20ucmVtb3ZlKHNuLmZpcnN0Q2hpbGQpOyAvLyBSZW1vdmUgQlINCg0KCQkJCS8vIENyZWF0ZSB0d28gbmV3IGJsb2NrIGVsZW1lbnRzDQoJCQkJaWYgKHNuLmNoaWxkTm9kZXMubGVuZ3RoID09IDApIHsNCgkJCQkJZWQuZG9tLmFkZChzbiwgc2UuZWxlbWVudCwgbnVsbCwgJzxiciAvPicpOw0KCQkJCQlhZnQgPSBlZC5kb20uYWRkKHNuLCBzZS5lbGVtZW50LCBudWxsLCAnPGJyIC8+Jyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJbiA9IHNuLmlubmVySFRNTDsNCgkJCQkJc24uaW5uZXJIVE1MID0gJyc7DQoJCQkJCWVkLmRvbS5hZGQoc24sIHNlLmVsZW1lbnQsIG51bGwsIG4pOw0KCQkJCQlhZnQgPSBlZC5kb20uYWRkKHNuLCBzZS5lbGVtZW50LCBudWxsLCAnPGJyIC8+Jyk7DQoJCQkJfQ0KDQoJCQkJLy8gTW92ZSBjYXJldCBpbnRvIHRoZSBsYXN0IG9uZQ0KCQkJCXIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoJCQkJci5zZWxlY3ROb2RlQ29udGVudHMoYWZ0KTsNCgkJCQlyLmNvbGxhcHNlKDEpOw0KCQkJCWVkLnNlbGVjdGlvbi5zZXRSbmcocik7DQoNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoNCgkJCS8vIElmIHRoZSBjYXJldCBpcyBpbiBhbiBpbnZhbGlkIGxvY2F0aW9uIGluIEZGIHdlIG5lZWQgdG8gbW92ZSBpdCBpbnRvIHRoZSBmaXJzdCBibG9jaw0KCQkJaWYgKHNuID09IGIgJiYgZW4gPT0gYiAmJiBiLmZpcnN0Q2hpbGQgJiYgZWQuZG9tLmlzQmxvY2soYi5maXJzdENoaWxkKSkgew0KCQkJCXNuID0gZW4gPSBzbi5maXJzdENoaWxkOw0KCQkJCXNvID0gZW8gPSAwOw0KCQkJCXJiID0gZC5jcmVhdGVSYW5nZSgpOw0KCQkJCXJiLnNldFN0YXJ0KHNuLCAwKTsNCgkJCQlyYSA9IGQuY3JlYXRlUmFuZ2UoKTsNCgkJCQlyYS5zZXRTdGFydChlbiwgMCk7DQoJCQl9DQoNCgkJCS8vIE5ldmVyIHVzZSBib2R5IGFzIHN0YXJ0IG9yIGVuZCBub2RlDQoJCQlzbiA9IHNuLm5vZGVOYW1lID09ICJIVE1MIiA/IGQuYm9keSA6IHNuOyAvLyBGaXggZm9yIE9wZXJhIGJ1ZzogaHR0cHM6Ly9idWdzLm9wZXJhLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MjczMjI0JmNvbW1lbnRzPXllcw0KCQkJc24gPSBzbi5ub2RlTmFtZSA9PSAiQk9EWSIgPyBzbi5maXJzdENoaWxkIDogc247DQoJCQllbiA9IGVuLm5vZGVOYW1lID09ICJIVE1MIiA/IGQuYm9keSA6IGVuOyAvLyBGaXggZm9yIE9wZXJhIGJ1ZzogaHR0cHM6Ly9idWdzLm9wZXJhLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MjczMjI0JmNvbW1lbnRzPXllcw0KCQkJZW4gPSBlbi5ub2RlTmFtZSA9PSAiQk9EWSIgPyBlbi5maXJzdENoaWxkIDogZW47DQoNCgkJCS8vIEdldCBzdGFydCBhbmQgZW5kIGJsb2Nrcw0KCQkJc2IgPSB0LmdldFBhcmVudEJsb2NrKHNuKTsNCgkJCWViID0gdC5nZXRQYXJlbnRCbG9jayhlbik7DQoJCQlibiA9IHNiID8gc2Iubm9kZU5hbWUgOiBzZS5lbGVtZW50OyAvLyBHZXQgYmxvY2sgbmFtZSB0byBjcmVhdGUNCg0KCQkJLy8gUmV0dXJuIGluc2lkZSBsaXN0IHVzZSBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3INCgkJCWlmIChuID0gdC5kb20uZ2V0UGFyZW50KHNiLCAnbGkscHJlJykpIHsNCgkJCQlpZiAobi5ub2RlTmFtZSA9PSAnTEknKQ0KCQkJCQlyZXR1cm4gc3BsaXRMaXN0KGVkLnNlbGVjdGlvbiwgdC5kb20sIG4pOw0KDQoJCQkJcmV0dXJuIFRSVUU7DQoJCQl9DQoNCgkJCS8vIElmIGNhcHRpb24gb3IgYWJzb2x1dGUgbGF5ZXJzIHRoZW4gYWx3YXlzIGdlbmVyYXRlIG5ldyBibG9ja3Mgd2l0aGluDQoJCQlpZiAoc2IgJiYgKHNiLm5vZGVOYW1lID09ICdDQVBUSU9OJyB8fCAvYWJzb2x1dGV8cmVsYXRpdmV8Zml4ZWQvZ2kudGVzdChkb20uZ2V0U3R5bGUoc2IsICdwb3NpdGlvbicsIDEpKSkpIHsNCgkJCQlibiA9IHNlLmVsZW1lbnQ7DQoJCQkJc2IgPSBudWxsOw0KCQkJfQ0KDQoJCQkvLyBJZiBjYXB0aW9uIG9yIGFic29sdXRlIGxheWVycyB0aGVuIGFsd2F5cyBnZW5lcmF0ZSBuZXcgYmxvY2tzIHdpdGhpbg0KCQkJaWYgKGViICYmIChlYi5ub2RlTmFtZSA9PSAnQ0FQVElPTicgfHwgL2Fic29sdXRlfHJlbGF0aXZlfGZpeGVkL2dpLnRlc3QoZG9tLmdldFN0eWxlKHNiLCAncG9zaXRpb24nLCAxKSkpKSB7DQoJCQkJYm4gPSBzZS5lbGVtZW50Ow0KCQkJCWViID0gbnVsbDsNCgkJCX0NCg0KCQkJLy8gVXNlIFAgaW5zdGVhZA0KCQkJaWYgKC8oVER8VEFCTEV8VEh8Q0FQVElPTikvLnRlc3QoYm4pIHx8IChzYiAmJiBibiA9PSAiRElWIiAmJiAvbGVmdHxyaWdodC9naS50ZXN0KGRvbS5nZXRTdHlsZShzYiwgJ2Zsb2F0JywgMSkpKSkgew0KCQkJCWJuID0gc2UuZWxlbWVudDsNCgkJCQlzYiA9IGViID0gbnVsbDsNCgkJCX0NCg0KCQkJLy8gU2V0dXAgbmV3IGJlZm9yZSBhbmQgYWZ0ZXIgYmxvY2tzDQoJCQliZWYgPSAoc2IgJiYgc2Iubm9kZU5hbWUgPT0gYm4pID8gc2IuY2xvbmVOb2RlKDApIDogZWQuZG9tLmNyZWF0ZShibik7DQoJCQlhZnQgPSAoZWIgJiYgZWIubm9kZU5hbWUgPT0gYm4pID8gZWIuY2xvbmVOb2RlKDApIDogZWQuZG9tLmNyZWF0ZShibik7DQoNCgkJCS8vIFJlbW92ZSBpZCBmcm9tIGFmdGVyIGNsb25lDQoJCQlhZnQucmVtb3ZlQXR0cmlidXRlKCdpZCcpOw0KDQoJCQkvLyBJcyBoZWFkZXIgYW5kIGN1cnNvciBpcyBhdCB0aGUgZW5kLCB0aGVuIGZvcmNlIHBhcmFncmFwaCB1bmRlcg0KCQkJaWYgKC9eKEhbMS02XSkkLy50ZXN0KGJuKSAmJiBpc0F0RW5kKHIsIHNiKSkNCgkJCQlhZnQgPSBlZC5kb20uY3JlYXRlKHNlLmVsZW1lbnQpOw0KDQoJCQkvLyBGaW5kIHN0YXJ0IGNob3Agbm9kZQ0KCQkJbiA9IHNjID0gc247DQoJCQlkbyB7DQoJCQkJaWYgKG4gPT0gYiB8fCBuLm5vZGVUeXBlID09IDkgfHwgdC5kb20uaXNCbG9jayhuKSB8fCAvKFREfFRBQkxFfFRIfENBUFRJT04pLy50ZXN0KG4ubm9kZU5hbWUpKQ0KCQkJCQlicmVhazsNCg0KCQkJCXNjID0gbjsNCgkJCX0gd2hpbGUgKChuID0gbi5wcmV2aW91c1NpYmxpbmcgPyBuLnByZXZpb3VzU2libGluZyA6IG4ucGFyZW50Tm9kZSkpOw0KDQoJCQkvLyBGaW5kIGVuZCBjaG9wIG5vZGUNCgkJCW4gPSBlYyA9IGVuOw0KCQkJZG8gew0KCQkJCWlmIChuID09IGIgfHwgbi5ub2RlVHlwZSA9PSA5IHx8IHQuZG9tLmlzQmxvY2sobikgfHwgLyhURHxUQUJMRXxUSHxDQVBUSU9OKS8udGVzdChuLm5vZGVOYW1lKSkNCgkJCQkJYnJlYWs7DQoNCgkJCQllYyA9IG47DQoJCQl9IHdoaWxlICgobiA9IG4ubmV4dFNpYmxpbmcgPyBuLm5leHRTaWJsaW5nIDogbi5wYXJlbnROb2RlKSk7DQoNCgkJCS8vIFBsYWNlIGZpcnN0IGNob3AgcGFydCBpbnRvIGJlZm9yZSBibG9jayBlbGVtZW50DQoJCQlpZiAoc2Mubm9kZU5hbWUgPT0gYm4pDQoJCQkJcmIuc2V0U3RhcnQoc2MsIDApOw0KCQkJZWxzZQ0KCQkJCXJiLnNldFN0YXJ0QmVmb3JlKHNjKTsNCg0KCQkJcmIuc2V0RW5kKHNuLCBzbyk7DQoJCQliZWYuYXBwZW5kQ2hpbGQocmIuY2xvbmVDb250ZW50cygpIHx8IGQuY3JlYXRlVGV4dE5vZGUoJycpKTsgLy8gRW1wdHkgdGV4dCBub2RlIG5lZWRlZCBmb3IgU2FmYXJpDQoNCgkJCS8vIFBsYWNlIHNlY25kIGNob3AgcGFydCB3aXRoaW4gbmV3IGJsb2NrIGVsZW1lbnQNCgkJCXRyeSB7DQoJCQkJcmEuc2V0RW5kQWZ0ZXIoZWMpOw0KCQkJfSBjYXRjaChleCkgew0KCQkJCS8vY29uc29sZS5kZWJ1ZyhzLmZvY3VzTm9kZSwgcy5mb2N1c09mZnNldCk7DQoJCQl9DQoNCgkJCXJhLnNldFN0YXJ0KGVuLCBlbyk7DQoJCQlhZnQuYXBwZW5kQ2hpbGQocmEuY2xvbmVDb250ZW50cygpIHx8IGQuY3JlYXRlVGV4dE5vZGUoJycpKTsgLy8gRW1wdHkgdGV4dCBub2RlIG5lZWRlZCBmb3IgU2FmYXJpDQoNCgkJCS8vIENyZWF0ZSByYW5nZSBhcm91bmQgZXZlcnl0aGluZw0KCQkJciA9IGQuY3JlYXRlUmFuZ2UoKTsNCgkJCWlmICghc2MucHJldmlvdXNTaWJsaW5nICYmIHNjLnBhcmVudE5vZGUubm9kZU5hbWUgPT0gYm4pIHsNCgkJCQlyLnNldFN0YXJ0QmVmb3JlKHNjLnBhcmVudE5vZGUpOw0KCQkJfSBlbHNlIHsNCgkJCQlpZiAocmIuc3RhcnRDb250YWluZXIubm9kZU5hbWUgPT0gYm4gJiYgcmIuc3RhcnRPZmZzZXQgPT0gMCkNCgkJCQkJci5zZXRTdGFydEJlZm9yZShyYi5zdGFydENvbnRhaW5lcik7DQoJCQkJZWxzZQ0KCQkJCQlyLnNldFN0YXJ0KHJiLnN0YXJ0Q29udGFpbmVyLCByYi5zdGFydE9mZnNldCk7DQoJCQl9DQoNCgkJCWlmICghZWMubmV4dFNpYmxpbmcgJiYgZWMucGFyZW50Tm9kZS5ub2RlTmFtZSA9PSBibikNCgkJCQlyLnNldEVuZEFmdGVyKGVjLnBhcmVudE5vZGUpOw0KCQkJZWxzZQ0KCQkJCXIuc2V0RW5kKHJhLmVuZENvbnRhaW5lciwgcmEuZW5kT2Zmc2V0KTsNCg0KCQkJLy8gRGVsZXRlIGFuZCByZXBsYWNlIGl0IHdpdGggbmV3IGJsb2NrIGVsZW1lbnRzDQoJCQlyLmRlbGV0ZUNvbnRlbnRzKCk7DQoNCgkJCWlmIChpc09wZXJhKQ0KCQkJCWVkLmdldFdpbigpLnNjcm9sbFRvKDAsIHZwLnkpOw0KDQoJCQkvLyBOZXZlciB3cmFwIGJsb2NrcyBpbiBibG9ja3MNCgkJCWlmIChiZWYuZmlyc3RDaGlsZCAmJiBiZWYuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PSBibikNCgkJCQliZWYuaW5uZXJIVE1MID0gYmVmLmZpcnN0Q2hpbGQuaW5uZXJIVE1MOw0KDQoJCQlpZiAoYWZ0LmZpcnN0Q2hpbGQgJiYgYWZ0LmZpcnN0Q2hpbGQubm9kZU5hbWUgPT0gYm4pDQoJCQkJYWZ0LmlubmVySFRNTCA9IGFmdC5maXJzdENoaWxkLmlubmVySFRNTDsNCg0KCQkJLy8gUGFkZCBlbXB0eSBibG9ja3MNCgkJCWlmIChpc0VtcHR5KGJlZikpDQoJCQkJYmVmLmlubmVySFRNTCA9ICc8YnIgLz4nOw0KDQoJCQlmdW5jdGlvbiBhcHBlbmRTdHlsZXMoZSwgZW4pIHsNCgkJCQl2YXIgbmwgPSBbXSwgbm4sIG4sIGk7DQoNCgkJCQllLmlubmVySFRNTCA9ICcnOw0KDQoJCQkJLy8gTWFrZSBjbG9uZXMgb2Ygc3R5bGUgZWxlbWVudHMNCgkJCQlpZiAoc2Uua2VlcF9zdHlsZXMpIHsNCgkJCQkJbiA9IGVuOw0KCQkJCQlkbyB7DQoJCQkJCQkvLyBXZSBvbmx5IHdhbnQgc3R5bGUgc3BlY2lmaWMgZWxlbWVudHMNCgkJCQkJCWlmICgvXihTUEFOfFNUUk9OR3xCfEVNfEl8Rk9OVHxTVFJJS0V8VSkkLy50ZXN0KG4ubm9kZU5hbWUpKSB7DQoJCQkJCQkJbm4gPSBuLmNsb25lTm9kZShGQUxTRSk7DQoJCQkJCQkJZG9tLnNldEF0dHJpYihubiwgJ2lkJywgJycpOyAvLyBSZW1vdmUgSUQgc2luY2UgaXQgbmVlZHMgdG8gYmUgdW5pcXVlDQoJCQkJCQkJbmwucHVzaChubik7DQoJCQkJCQl9DQoJCQkJCX0gd2hpbGUgKG4gPSBuLnBhcmVudE5vZGUpOw0KCQkJCX0NCg0KCQkJCS8vIEFwcGVuZCBzdHlsZSBlbGVtZW50cyB0byBhZnQNCgkJCQlpZiAobmwubGVuZ3RoID4gMCkgew0KCQkJCQlmb3IgKGkgPSBubC5sZW5ndGggLSAxLCBubiA9IGU7IGkgPj0gMDsgaS0tKQ0KCQkJCQkJbm4gPSBubi5hcHBlbmRDaGlsZChubFtpXSk7DQoNCgkJCQkJLy8gUGFkZCBtb3N0IGlubmVyIHN0eWxlIGVsZW1lbnQNCgkJCQkJbmxbMF0uaW5uZXJIVE1MID0gaXNPcGVyYSA/ICcmbmJzcDsnIDogJzxiciAvPic7IC8vIEV4dHJhIHNwYWNlIGZvciBPcGVyYSBzbyB0aGF0IHRoZSBjYXJldCBjYW4gbW92ZSB0aGVyZQ0KCQkJCQlyZXR1cm4gbmxbMF07IC8vIE1vdmUgY2FyZXQgdG8gbW9zdCBpbm5lciBlbGVtZW50DQoJCQkJfSBlbHNlDQoJCQkJCWUuaW5uZXJIVE1MID0gaXNPcGVyYSA/ICcmbmJzcDsnIDogJzxiciAvPic7IC8vIEV4dHJhIHNwYWNlIGZvciBPcGVyYSBzbyB0aGF0IHRoZSBjYXJldCBjYW4gbW92ZSB0aGVyZQ0KCQkJfTsNCg0KCQkJLy8gRmlsbCBlbXB0eSBhZnRlcmJsb29rIHdpdGggY3VycmVudCBzdHlsZQ0KCQkJaWYgKGlzRW1wdHkoYWZ0KSkNCgkJCQljYXIgPSBhcHBlbmRTdHlsZXMoYWZ0LCBlbik7DQoNCgkJCS8vIE9wZXJhIG5lZWRzIHRoaXMgb25lIGJhY2t3YXJkcyBmb3Igb2xkZXIgdmVyc2lvbnMNCgkJCWlmIChpc09wZXJhICYmIHBhcnNlRmxvYXQob3BlcmEudmVyc2lvbigpKSA8IDkuNSkgew0KCQkJCXIuaW5zZXJ0Tm9kZShiZWYpOw0KCQkJCXIuaW5zZXJ0Tm9kZShhZnQpOw0KCQkJfSBlbHNlIHsNCgkJCQlyLmluc2VydE5vZGUoYWZ0KTsNCgkJCQlyLmluc2VydE5vZGUoYmVmKTsNCgkJCX0NCg0KCQkJLy8gTm9ybWFsaXplDQoJCQlhZnQubm9ybWFsaXplKCk7DQoJCQliZWYubm9ybWFsaXplKCk7DQoNCgkJCWZ1bmN0aW9uIGZpcnN0KG4pIHsNCgkJCQlyZXR1cm4gZC5jcmVhdGVUcmVlV2Fsa2VyKG4sIE5vZGVGaWx0ZXIuU0hPV19URVhULCBudWxsLCBGQUxTRSkubmV4dE5vZGUoKSB8fCBuOw0KCQkJfTsNCg0KCQkJLy8gTW92ZSBjdXJzb3IgYW5kIHNjcm9sbCBpbnRvIHZpZXcNCgkJCXIgPSBkLmNyZWF0ZVJhbmdlKCk7DQoJCQlyLnNlbGVjdE5vZGVDb250ZW50cyhpc0dlY2tvID8gZmlyc3QoY2FyIHx8IGFmdCkgOiBjYXIgfHwgYWZ0KTsNCgkJCXIuY29sbGFwc2UoMSk7DQoJCQlzLnJlbW92ZUFsbFJhbmdlcygpOw0KCQkJcy5hZGRSYW5nZShyKTsNCg0KCQkJLy8gc2Nyb2xsSW50b1ZpZXcgc2VlbXMgdG8gc2Nyb2xsIHRoZSBwYXJlbnQgd2luZG93IGluIG1vc3QgYnJvd3NlcnMgbm93IGluY2x1ZGluZyBGRiAzLjBiNCBzbyBpdCdzIHRpbWUgdG8gc3RvcCB1c2luZyBpdCBhbmQgZG8gaXQgb3VyIHNlbGZzDQoJCQl5ID0gZWQuZG9tLmdldFBvcyhhZnQpLnk7DQoJCQljaCA9IGFmdC5jbGllbnRIZWlnaHQ7DQoNCgkJCS8vIElzIGVsZW1lbnQgd2l0aGluIHZpZXdwb3J0DQoJCQlpZiAoeSA8IHZwLnkgfHwgeSArIGNoID4gdnAueSArIHZwLmgpIHsNCgkJCQllZC5nZXRXaW4oKS5zY3JvbGxUbygwLCB5IDwgdnAueSA/IHkgOiB5IC0gdnAuaCArIDI1KTsgLy8gTmVlZHMgdG8gYmUgaGFyZGNvZGVkIHRvIHJvdWdobHkgb25lIGxpbmUgb2YgdGV4dCBpZiBhIGh1Z2UgdGV4dCBibG9jayBpcyBicm9rZW4gaW50byB0d28gYmxvY2tzDQoJCQkJLy9jb25zb2xlLmRlYnVnKCdTQ1JPTEwhJywgJ3ZwLnk6ICcgKyB2cC55LCAneScgKyB5LCAndnAuaCcgKyB2cC5oLCAnY2xpZW50SGVpZ2h0JyArIGFmdC5jbGllbnRIZWlnaHQsICd5eXk6ICcgKyAoeSA8IHZwLnkgPyB5IDogeSAtIHZwLmggKyBhZnQuY2xpZW50SGVpZ2h0KSk7DQoJCQl9DQoNCgkJCXJldHVybiBGQUxTRTsNCgkJfSwNCg0KCQliYWNrc3BhY2VEZWxldGUgOiBmdW5jdGlvbihlLCBicykgew0KCQkJdmFyIHQgPSB0aGlzLCBlZCA9IHQuZWRpdG9yLCBiID0gZWQuZ2V0Qm9keSgpLCBkb20gPSBlZC5kb20sIG4sIHNlID0gZWQuc2VsZWN0aW9uLCByID0gc2UuZ2V0Um5nKCksIHNjID0gci5zdGFydENvbnRhaW5lciwgbiwgdywgdG4sIHdhbGtlcjsNCg0KCQkJLy8gRGVsZXRlIHdoZW4gY2FyZXQgaXMgYmVoaW5kIGEgZWxlbWVudCBkb2Vzbid0IHdvcmsgY29ycmVjdGx5IG9uIEdlY2tvIHNlZSAjMzAxMTY1MQ0KCQkJaWYgKCFicyAmJiByLmNvbGxhcHNlZCAmJiBzYy5ub2RlVHlwZSA9PSAxICYmIHIuc3RhcnRPZmZzZXQgPT0gc2MuY2hpbGROb2Rlcy5sZW5ndGgpIHsNCgkJCQl3YWxrZXIgPSBuZXcgdGlueW1jZS5kb20uVHJlZVdhbGtlcihzYy5sYXN0Q2hpbGQsIHNjKTsNCg0KCQkJCS8vIFdhbGsgdGhlIGRvbSBiYWNrd2FyZHMgdW50aWwgd2UgZmluZCBhIHRleHQgbm9kZQ0KCQkJCWZvciAobiA9IHNjLmxhc3RDaGlsZDsgbjsgbiA9IHdhbGtlci5wcmV2KCkpIHsNCgkJCQkJaWYgKG4ubm9kZVR5cGUgPT0gMykgew0KCQkJCQkJci5zZXRTdGFydChuLCBuLm5vZGVWYWx1ZS5sZW5ndGgpOw0KCQkJCQkJci5jb2xsYXBzZSh0cnVlKTsNCgkJCQkJCXNlLnNldFJuZyhyKTsNCgkJCQkJCXJldHVybjsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gVGhlIGNhcmV0IHNvbWV0aW1lcyBnZXRzIHN0dWNrIGluIEdlY2tvIGlmIHlvdSBkZWxldGUgZW1wdHkgcGFyYWdyYXBocw0KCQkJLy8gVGhpcyB3b3JrYXJvdW5kIHJlbW92ZXMgdGhlIGVsZW1lbnQgYnkgaGFuZCBhbmQgbW92ZXMgdGhlIGNhcmV0IHRvIHRoZSBwcmV2aW91cyBlbGVtZW50DQoJCQlpZiAoc2MgJiYgZWQuZG9tLmlzQmxvY2soc2MpICYmICEvXihURHxUSCkkLy50ZXN0KHNjLm5vZGVOYW1lKSAmJiBicykgew0KCQkJCWlmIChzYy5jaGlsZE5vZGVzLmxlbmd0aCA9PSAwIHx8IChzYy5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxICYmIHNjLmZpcnN0Q2hpbGQubm9kZU5hbWUgPT0gJ0JSJykpIHsNCgkJCQkJLy8gRmluZCBwcmV2aW91cyBibG9jayBlbGVtZW50DQoJCQkJCW4gPSBzYzsNCgkJCQkJd2hpbGUgKChuID0gbi5wcmV2aW91c1NpYmxpbmcpICYmICFlZC5kb20uaXNCbG9jayhuKSkgOw0KDQoJCQkJCWlmIChuKSB7DQoJCQkJCQlpZiAoc2MgIT0gYi5maXJzdENoaWxkKSB7DQoJCQkJCQkJLy8gRmluZCBsYXN0IHRleHQgbm9kZQ0KCQkJCQkJCXcgPSBlZC5kb20uZG9jLmNyZWF0ZVRyZWVXYWxrZXIobiwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwsIEZBTFNFKTsNCgkJCQkJCQl3aGlsZSAodG4gPSB3Lm5leHROb2RlKCkpDQoJCQkJCQkJCW4gPSB0bjsNCg0KCQkJCQkJCS8vIFBsYWNlIGNhcmV0IGF0IHRoZSBlbmQgb2YgbGFzdCB0ZXh0IG5vZGUNCgkJCQkJCQlyID0gZWQuZ2V0RG9jKCkuY3JlYXRlUmFuZ2UoKTsNCgkJCQkJCQlyLnNldFN0YXJ0KG4sIG4ubm9kZVZhbHVlID8gbi5ub2RlVmFsdWUubGVuZ3RoIDogMCk7DQoJCQkJCQkJci5zZXRFbmQobiwgbi5ub2RlVmFsdWUgPyBuLm5vZGVWYWx1ZS5sZW5ndGggOiAwKTsNCgkJCQkJCQlzZS5zZXRSbmcocik7DQoNCgkJCQkJCQkvLyBSZW1vdmUgdGhlIHRhcmdldCBjb250YWluZXINCgkJCQkJCQllZC5kb20ucmVtb3ZlKHNjKTsNCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuIEV2ZW50LmNhbmNlbChlKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJLy8gU2hvcnRlbiBuYW1lcw0KCXZhciBET00gPSB0aW55bWNlLkRPTSwgRXZlbnQgPSB0aW55bWNlLmRvbS5FdmVudCwgZWFjaCA9IHRpbnltY2UuZWFjaCwgZXh0ZW5kID0gdGlueW1jZS5leHRlbmQ7DQoNCgl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5Db250cm9sTWFuYWdlcicsIHsNCgkJQ29udHJvbE1hbmFnZXIgOiBmdW5jdGlvbihlZCwgcykgew0KCQkJdmFyIHQgPSB0aGlzLCBpOw0KDQoJCQlzID0gcyB8fCB7fTsNCgkJCXQuZWRpdG9yID0gZWQ7DQoJCQl0LmNvbnRyb2xzID0ge307DQoJCQl0Lm9uQWRkID0gbmV3IHRpbnltY2UudXRpbC5EaXNwYXRjaGVyKHQpOw0KCQkJdC5vblBvc3RSZW5kZXIgPSBuZXcgdGlueW1jZS51dGlsLkRpc3BhdGNoZXIodCk7DQoJCQl0LnByZWZpeCA9IHMucHJlZml4IHx8IGVkLmlkICsgJ18nOw0KCQkJdC5fY2xzID0ge307DQoNCgkJCXQub25Qb3N0UmVuZGVyLmFkZChmdW5jdGlvbigpIHsNCgkJCQllYWNoKHQuY29udHJvbHMsIGZ1bmN0aW9uKGMpIHsNCgkJCQkJYy5wb3N0UmVuZGVyKCk7DQoJCQkJfSk7DQoJCQl9KTsNCgkJfSwNCg0KCQlnZXQgOiBmdW5jdGlvbihpZCkgew0KCQkJcmV0dXJuIHRoaXMuY29udHJvbHNbdGhpcy5wcmVmaXggKyBpZF0gfHwgdGhpcy5jb250cm9sc1tpZF07DQoJCX0sDQoNCgkJc2V0QWN0aXZlIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciBjID0gbnVsbDsNCg0KCQkJaWYgKGMgPSB0aGlzLmdldChpZCkpDQoJCQkJYy5zZXRBY3RpdmUocyk7DQoNCgkJCXJldHVybiBjOw0KCQl9LA0KDQoJCXNldERpc2FibGVkIDogZnVuY3Rpb24oaWQsIHMpIHsNCgkJCXZhciBjID0gbnVsbDsNCg0KCQkJaWYgKGMgPSB0aGlzLmdldChpZCkpDQoJCQkJYy5zZXREaXNhYmxlZChzKTsNCg0KCQkJcmV0dXJuIGM7DQoJCX0sDQoNCgkJYWRkIDogZnVuY3Rpb24oYykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQlpZiAoYykgew0KCQkJCXQuY29udHJvbHNbYy5pZF0gPSBjOw0KCQkJCXQub25BZGQuZGlzcGF0Y2goYywgdCk7DQoJCQl9DQoNCgkJCXJldHVybiBjOw0KCQl9LA0KDQoJCWNyZWF0ZUNvbnRyb2wgOiBmdW5jdGlvbihuKSB7DQoJCQl2YXIgYywgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3I7DQoNCgkJCWVhY2goZWQucGx1Z2lucywgZnVuY3Rpb24ocCkgew0KCQkJCWlmIChwLmNyZWF0ZUNvbnRyb2wpIHsNCgkJCQkJYyA9IHAuY3JlYXRlQ29udHJvbChuLCB0KTsNCg0KCQkJCQlpZiAoYykNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJc3dpdGNoIChuKSB7DQoJCQkJY2FzZSAifCI6DQoJCQkJY2FzZSAic2VwYXJhdG9yIjoNCgkJCQkJcmV0dXJuIHQuY3JlYXRlU2VwYXJhdG9yKCk7DQoJCQl9DQoNCgkJCWlmICghYyAmJiBlZC5idXR0b25zICYmIChjID0gZWQuYnV0dG9uc1tuXSkpDQoJCQkJcmV0dXJuIHQuY3JlYXRlQnV0dG9uKG4sIGMpOw0KDQoJCQlyZXR1cm4gdC5hZGQoYyk7DQoJCX0sDQoNCgkJY3JlYXRlRHJvcE1lbnUgOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgYywgYm0sIHYsIGNsczsNCg0KCQkJcyA9IGV4dGVuZCh7DQoJCQkJJ2NsYXNzJyA6ICdtY2VEcm9wRG93bicsDQoJCQkJY29uc3RyYWluIDogZWQuc2V0dGluZ3MuY29uc3RyYWluX21lbnVzDQoJCQl9LCBzKTsNCg0KCQkJc1snY2xhc3MnXSA9IHNbJ2NsYXNzJ10gKyAnICcgKyBlZC5nZXRQYXJhbSgnc2tpbicpICsgJ1NraW4nOw0KCQkJaWYgKHYgPSBlZC5nZXRQYXJhbSgnc2tpbl92YXJpYW50JykpDQoJCQkJc1snY2xhc3MnXSArPSAnICcgKyBlZC5nZXRQYXJhbSgnc2tpbicpICsgJ1NraW4nICsgdi5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHYuc3Vic3RyaW5nKDEpOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoJCQljbHMgPSBjYyB8fCB0Ll9jbHMuZHJvcG1lbnUgfHwgdGlueW1jZS51aS5Ecm9wTWVudTsNCgkJCWMgPSB0LmNvbnRyb2xzW2lkXSA9IG5ldyBjbHMoaWQsIHMpOw0KCQkJYy5vbkFkZEl0ZW0uYWRkKGZ1bmN0aW9uKGMsIG8pIHsNCgkJCQl2YXIgcyA9IG8uc2V0dGluZ3M7DQoNCgkJCQlzLnRpdGxlID0gZWQuZ2V0TGFuZyhzLnRpdGxlLCBzLnRpdGxlKTsNCg0KCQkJCWlmICghcy5vbmNsaWNrKSB7DQoJCQkJCXMub25jbGljayA9IGZ1bmN0aW9uKHYpIHsNCgkJCQkJCWlmIChzLmNtZCkNCgkJCQkJCQllZC5leGVjQ29tbWFuZChzLmNtZCwgcy51aSB8fCBmYWxzZSwgcy52YWx1ZSk7DQoJCQkJCX07DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWVkLm9uUmVtb3ZlLmFkZChmdW5jdGlvbigpIHsNCgkJCQljLmRlc3Ryb3koKTsNCgkJCX0pOw0KDQoJCQkvLyBGaXggZm9yIGJ1ZyAjMTg5Nzc4NSwgIzE4OTgwMDcNCgkJCWlmICh0aW55bWNlLmlzSUUpIHsNCgkJCQljLm9uU2hvd01lbnUuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQkvLyBJRSA4IG5lZWRzIGZvY3VzIGluIG9yZGVyIHRvIHN0b3JlIGF3YXkgYSByYW5nZSB3aXRoIHRoZSBjdXJyZW50IGNvbGxhcHNlZCBjYXJldCBsb2NhdGlvbg0KCQkJCQllZC5mb2N1cygpOw0KDQoJCQkJCWJtID0gZWQuc2VsZWN0aW9uLmdldEJvb2ttYXJrKDEpOw0KCQkJCX0pOw0KDQoJCQkJYy5vbkhpZGVNZW51LmFkZChmdW5jdGlvbigpIHsNCgkJCQkJaWYgKGJtKSB7DQoJCQkJCQllZC5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoYm0pOw0KCQkJCQkJYm0gPSAwOw0KCQkJCQl9DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiB0LmFkZChjKTsNCgkJfSwNCg0KCQljcmVhdGVMaXN0Qm94IDogZnVuY3Rpb24oaWQsIHMsIGNjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIGNtZCwgYywgY2xzOw0KDQoJCQlpZiAodC5nZXQoaWQpKQ0KCQkJCXJldHVybiBudWxsOw0KDQoJCQlzLnRpdGxlID0gZWQudHJhbnNsYXRlKHMudGl0bGUpOw0KCQkJcy5zY29wZSA9IHMuc2NvcGUgfHwgZWQ7DQoNCgkJCWlmICghcy5vbnNlbGVjdCkgew0KCQkJCXMub25zZWxlY3QgPSBmdW5jdGlvbih2KSB7DQoJCQkJCWVkLmV4ZWNDb21tYW5kKHMuY21kLCBzLnVpIHx8IGZhbHNlLCB2IHx8IHMudmFsdWUpOw0KCQkJCX07DQoJCQl9DQoNCgkJCXMgPSBleHRlbmQoew0KCQkJCXRpdGxlIDogcy50aXRsZSwNCgkJCQknY2xhc3MnIDogJ21jZV8nICsgaWQsDQoJCQkJc2NvcGUgOiBzLnNjb3BlLA0KCQkJCWNvbnRyb2xfbWFuYWdlciA6IHQNCgkJCX0sIHMpOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoNCgkJCWlmIChlZC5zZXR0aW5ncy51c2VfbmF0aXZlX3NlbGVjdHMpDQoJCQkJYyA9IG5ldyB0aW55bWNlLnVpLk5hdGl2ZUxpc3RCb3goaWQsIHMpOw0KCQkJZWxzZSB7DQoJCQkJY2xzID0gY2MgfHwgdC5fY2xzLmxpc3Rib3ggfHwgdGlueW1jZS51aS5MaXN0Qm94Ow0KCQkJCWMgPSBuZXcgY2xzKGlkLCBzKTsNCgkJCX0NCg0KCQkJdC5jb250cm9sc1tpZF0gPSBjOw0KDQoJCQkvLyBGaXggZm9jdXMgcHJvYmxlbSBpbiBTYWZhcmkNCgkJCWlmICh0aW55bWNlLmlzV2ViS2l0KSB7DQoJCQkJYy5vblBvc3RSZW5kZXIuYWRkKGZ1bmN0aW9uKGMsIG4pIHsNCgkJCQkJLy8gU3RvcmUgYm9va21hcmsgb24gbW91c2Vkb3duDQoJCQkJCUV2ZW50LmFkZChuLCAnbW91c2Vkb3duJywgZnVuY3Rpb24oKSB7DQoJCQkJCQllZC5ib29rbWFyayA9IGVkLnNlbGVjdGlvbi5nZXRCb29rbWFyaygxKTsNCgkJCQkJfSk7DQoNCgkJCQkJLy8gUmVzdG9yZSBvbiBmb2N1cywgc2luY2UgaXQgbWlnaHQgYmUgbG9zdA0KCQkJCQlFdmVudC5hZGQobiwgJ2ZvY3VzJywgZnVuY3Rpb24oKSB7DQoJCQkJCQllZC5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoZWQuYm9va21hcmspOw0KCQkJCQkJZWQuYm9va21hcmsgPSBudWxsOw0KCQkJCQl9KTsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaWYgKGMuaGlkZU1lbnUpDQoJCQkJZWQub25Nb3VzZURvd24uYWRkKGMuaGlkZU1lbnUsIGMpOw0KDQoJCQlyZXR1cm4gdC5hZGQoYyk7DQoJCX0sDQoNCgkJY3JlYXRlQnV0dG9uIDogZnVuY3Rpb24oaWQsIHMsIGNjKSB7DQoJCQl2YXIgdCA9IHRoaXMsIGVkID0gdC5lZGl0b3IsIG8sIGMsIGNsczsNCg0KCQkJaWYgKHQuZ2V0KGlkKSkNCgkJCQlyZXR1cm4gbnVsbDsNCg0KCQkJcy50aXRsZSA9IGVkLnRyYW5zbGF0ZShzLnRpdGxlKTsNCgkJCXMubGFiZWwgPSBlZC50cmFuc2xhdGUocy5sYWJlbCk7DQoJCQlzLnNjb3BlID0gcy5zY29wZSB8fCBlZDsNCg0KCQkJaWYgKCFzLm9uY2xpY2sgJiYgIXMubWVudV9idXR0b24pIHsNCgkJCQlzLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsNCgkJCQkJZWQuZXhlY0NvbW1hbmQocy5jbWQsIHMudWkgfHwgZmFsc2UsIHMudmFsdWUpOw0KCQkJCX07DQoJCQl9DQoNCgkJCXMgPSBleHRlbmQoew0KCQkJCXRpdGxlIDogcy50aXRsZSwNCgkJCQknY2xhc3MnIDogJ21jZV8nICsgaWQsDQoJCQkJdW5hdmFpbGFibGVfcHJlZml4IDogZWQuZ2V0TGFuZygndW5hdmFpbGFibGUnLCAnJyksDQoJCQkJc2NvcGUgOiBzLnNjb3BlLA0KCQkJCWNvbnRyb2xfbWFuYWdlciA6IHQNCgkJCX0sIHMpOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoNCgkJCWlmIChzLm1lbnVfYnV0dG9uKSB7DQoJCQkJY2xzID0gY2MgfHwgdC5fY2xzLm1lbnVidXR0b24gfHwgdGlueW1jZS51aS5NZW51QnV0dG9uOw0KCQkJCWMgPSBuZXcgY2xzKGlkLCBzKTsNCgkJCQllZC5vbk1vdXNlRG93bi5hZGQoYy5oaWRlTWVudSwgYyk7DQoJCQl9IGVsc2Ugew0KCQkJCWNscyA9IHQuX2Nscy5idXR0b24gfHwgdGlueW1jZS51aS5CdXR0b247DQoJCQkJYyA9IG5ldyBjbHMoaWQsIHMpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gdC5hZGQoYyk7DQoJCX0sDQoNCgkJY3JlYXRlTWVudUJ1dHRvbiA6IGZ1bmN0aW9uKGlkLCBzLCBjYykgew0KCQkJcyA9IHMgfHwge307DQoJCQlzLm1lbnVfYnV0dG9uID0gMTsNCg0KCQkJcmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKGlkLCBzLCBjYyk7DQoJCX0sDQoNCgkJY3JlYXRlU3BsaXRCdXR0b24gOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgY21kLCBjLCBjbHM7DQoNCgkJCWlmICh0LmdldChpZCkpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCXMudGl0bGUgPSBlZC50cmFuc2xhdGUocy50aXRsZSk7DQoJCQlzLnNjb3BlID0gcy5zY29wZSB8fCBlZDsNCg0KCQkJaWYgKCFzLm9uY2xpY2spIHsNCgkJCQlzLm9uY2xpY2sgPSBmdW5jdGlvbih2KSB7DQoJCQkJCWVkLmV4ZWNDb21tYW5kKHMuY21kLCBzLnVpIHx8IGZhbHNlLCB2IHx8IHMudmFsdWUpOw0KCQkJCX07DQoJCQl9DQoNCgkJCWlmICghcy5vbnNlbGVjdCkgew0KCQkJCXMub25zZWxlY3QgPSBmdW5jdGlvbih2KSB7DQoJCQkJCWVkLmV4ZWNDb21tYW5kKHMuY21kLCBzLnVpIHx8IGZhbHNlLCB2IHx8IHMudmFsdWUpOw0KCQkJCX07DQoJCQl9DQoNCgkJCXMgPSBleHRlbmQoew0KCQkJCXRpdGxlIDogcy50aXRsZSwNCgkJCQknY2xhc3MnIDogJ21jZV8nICsgaWQsDQoJCQkJc2NvcGUgOiBzLnNjb3BlLA0KCQkJCWNvbnRyb2xfbWFuYWdlciA6IHQNCgkJCX0sIHMpOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoJCQljbHMgPSBjYyB8fCB0Ll9jbHMuc3BsaXRidXR0b24gfHwgdGlueW1jZS51aS5TcGxpdEJ1dHRvbjsNCgkJCWMgPSB0LmFkZChuZXcgY2xzKGlkLCBzKSk7DQoJCQllZC5vbk1vdXNlRG93bi5hZGQoYy5oaWRlTWVudSwgYyk7DQoNCgkJCXJldHVybiBjOw0KCQl9LA0KDQoJCWNyZWF0ZUNvbG9yU3BsaXRCdXR0b24gOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciB0ID0gdGhpcywgZWQgPSB0LmVkaXRvciwgY21kLCBjLCBjbHMsIGJtOw0KDQoJCQlpZiAodC5nZXQoaWQpKQ0KCQkJCXJldHVybiBudWxsOw0KDQoJCQlzLnRpdGxlID0gZWQudHJhbnNsYXRlKHMudGl0bGUpOw0KCQkJcy5zY29wZSA9IHMuc2NvcGUgfHwgZWQ7DQoNCgkJCWlmICghcy5vbmNsaWNrKSB7DQoJCQkJcy5vbmNsaWNrID0gZnVuY3Rpb24odikgew0KCQkJCQlpZiAodGlueW1jZS5pc0lFKQ0KCQkJCQkJYm0gPSBlZC5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMSk7DQoNCgkJCQkJZWQuZXhlY0NvbW1hbmQocy5jbWQsIHMudWkgfHwgZmFsc2UsIHYgfHwgcy52YWx1ZSk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJaWYgKCFzLm9uc2VsZWN0KSB7DQoJCQkJcy5vbnNlbGVjdCA9IGZ1bmN0aW9uKHYpIHsNCgkJCQkJZWQuZXhlY0NvbW1hbmQocy5jbWQsIHMudWkgfHwgZmFsc2UsIHYgfHwgcy52YWx1ZSk7DQoJCQkJfTsNCgkJCX0NCg0KCQkJcyA9IGV4dGVuZCh7DQoJCQkJdGl0bGUgOiBzLnRpdGxlLA0KCQkJCSdjbGFzcycgOiAnbWNlXycgKyBpZCwNCgkJCQknbWVudV9jbGFzcycgOiBlZC5nZXRQYXJhbSgnc2tpbicpICsgJ1NraW4nLA0KCQkJCXNjb3BlIDogcy5zY29wZSwNCgkJCQltb3JlX2NvbG9yc190aXRsZSA6IGVkLmdldExhbmcoJ21vcmVfY29sb3JzJykNCgkJCX0sIHMpOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoJCQljbHMgPSBjYyB8fCB0Ll9jbHMuY29sb3JzcGxpdGJ1dHRvbiB8fCB0aW55bWNlLnVpLkNvbG9yU3BsaXRCdXR0b247DQoJCQljID0gbmV3IGNscyhpZCwgcyk7DQoJCQllZC5vbk1vdXNlRG93bi5hZGQoYy5oaWRlTWVudSwgYyk7DQoNCgkJCS8vIFJlbW92ZSB0aGUgbWVudSBlbGVtZW50IHdoZW4gdGhlIGVkaXRvciBpcyByZW1vdmVkDQoJCQllZC5vblJlbW92ZS5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJYy5kZXN0cm95KCk7DQoJCQl9KTsNCg0KCQkJLy8gRml4IGZvciBidWcgIzE4OTc3ODUsICMxODk4MDA3DQoJCQlpZiAodGlueW1jZS5pc0lFKSB7DQoJCQkJYy5vblNob3dNZW51LmFkZChmdW5jdGlvbigpIHsNCgkJCQkJLy8gSUUgOCBuZWVkcyBmb2N1cyBpbiBvcmRlciB0byBzdG9yZSBhd2F5IGEgcmFuZ2Ugd2l0aCB0aGUgY3VycmVudCBjb2xsYXBzZWQgY2FyZXQgbG9jYXRpb24NCgkJCQkJZWQuZm9jdXMoKTsNCgkJCQkJYm0gPSBlZC5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoMSk7DQoJCQkJfSk7DQoNCgkJCQljLm9uSGlkZU1lbnUuYWRkKGZ1bmN0aW9uKCkgew0KCQkJCQlpZiAoYm0pIHsNCgkJCQkJCWVkLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhibSk7DQoJCQkJCQlibSA9IDA7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCg0KCQkJcmV0dXJuIHQuYWRkKGMpOw0KCQl9LA0KDQoJCWNyZWF0ZVRvb2xiYXIgOiBmdW5jdGlvbihpZCwgcywgY2MpIHsNCgkJCXZhciBjLCB0ID0gdGhpcywgY2xzOw0KDQoJCQlpZCA9IHQucHJlZml4ICsgaWQ7DQoJCQljbHMgPSBjYyB8fCB0Ll9jbHMudG9vbGJhciB8fCB0aW55bWNlLnVpLlRvb2xiYXI7DQoJCQljID0gbmV3IGNscyhpZCwgcyk7DQoNCgkJCWlmICh0LmdldChpZCkpDQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJCXJldHVybiB0LmFkZChjKTsNCgkJfSwNCg0KCQljcmVhdGVTZXBhcmF0b3IgOiBmdW5jdGlvbihjYykgew0KCQkJdmFyIGNscyA9IGNjIHx8IHRoaXMuX2Nscy5zZXBhcmF0b3IgfHwgdGlueW1jZS51aS5TZXBhcmF0b3I7DQoNCgkJCXJldHVybiBuZXcgY2xzKCk7DQoJCX0sDQoNCgkJc2V0Q29udHJvbFR5cGUgOiBmdW5jdGlvbihuLCBjKSB7DQoJCQlyZXR1cm4gdGhpcy5fY2xzW24udG9Mb3dlckNhc2UoKV0gPSBjOw0KCQl9LA0KCQ0KCQlkZXN0cm95IDogZnVuY3Rpb24oKSB7DQoJCQllYWNoKHRoaXMuY29udHJvbHMsIGZ1bmN0aW9uKGMpIHsNCgkJCQljLmRlc3Ryb3koKTsNCgkJCX0pOw0KDQoJCQl0aGlzLmNvbnRyb2xzID0gbnVsbDsNCgkJfQ0KCX0pOw0KfSkodGlueW1jZSk7DQoNCihmdW5jdGlvbih0aW55bWNlKSB7DQoJdmFyIERpc3BhdGNoZXIgPSB0aW55bWNlLnV0aWwuRGlzcGF0Y2hlciwgZWFjaCA9IHRpbnltY2UuZWFjaCwgaXNJRSA9IHRpbnltY2UuaXNJRSwgaXNPcGVyYSA9IHRpbnltY2UuaXNPcGVyYTsNCg0KCXRpbnltY2UuY3JlYXRlKCd0aW55bWNlLldpbmRvd01hbmFnZXInLCB7DQoJCVdpbmRvd01hbmFnZXIgOiBmdW5jdGlvbihlZCkgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl0LmVkaXRvciA9IGVkOw0KCQkJdC5vbk9wZW4gPSBuZXcgRGlzcGF0Y2hlcih0KTsNCgkJCXQub25DbG9zZSA9IG5ldyBEaXNwYXRjaGVyKHQpOw0KCQkJdC5wYXJhbXMgPSB7fTsNCgkJCXQuZmVhdHVyZXMgPSB7fTsNCgkJfSwNCg0KCQlvcGVuIDogZnVuY3Rpb24ocywgcCkgew0KCQkJdmFyIHQgPSB0aGlzLCBmID0gJycsIHgsIHksIG1vID0gdC5lZGl0b3Iuc2V0dGluZ3MuZGlhbG9nX3R5cGUgPT0gJ21vZGFsJywgdywgc3csIHNoLCB2cCA9IHRpbnltY2UuRE9NLmdldFZpZXdQb3J0KCksIHU7DQoNCgkJCS8vIERlZmF1bHQgc29tZSBvcHRpb25zDQoJCQlzID0gcyB8fCB7fTsNCgkJCXAgPSBwIHx8IHt9Ow0KCQkJc3cgPSBpc09wZXJhID8gdnAudyA6IHNjcmVlbi53aWR0aDsgLy8gT3BlcmEgdXNlcyB3aW5kb3dzIGluc2lkZSB0aGUgT3BlcmEgd2luZG93DQoJCQlzaCA9IGlzT3BlcmEgPyB2cC5oIDogc2NyZWVuLmhlaWdodDsNCgkJCXMubmFtZSA9IHMubmFtZSB8fCAnbWNfJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KCQkJcy53aWR0aCA9IHBhcnNlSW50KHMud2lkdGggfHwgMzIwKTsNCgkJCXMuaGVpZ2h0ID0gcGFyc2VJbnQocy5oZWlnaHQgfHwgMjQwKTsNCgkJCXMucmVzaXphYmxlID0gdHJ1ZTsNCgkJCXMubGVmdCA9IHMubGVmdCB8fCBwYXJzZUludChzdyAvIDIuMCkgLSAocy53aWR0aCAvIDIuMCk7DQoJCQlzLnRvcCA9IHMudG9wIHx8IHBhcnNlSW50KHNoIC8gMi4wKSAtIChzLmhlaWdodCAvIDIuMCk7DQoJCQlwLmlubGluZSA9IGZhbHNlOw0KCQkJcC5tY2Vfd2lkdGggPSBzLndpZHRoOw0KCQkJcC5tY2VfaGVpZ2h0ID0gcy5oZWlnaHQ7DQoJCQlwLm1jZV9hdXRvX2ZvY3VzID0gcy5hdXRvX2ZvY3VzOw0KDQoJCQlpZiAobW8pIHsNCgkJCQlpZiAoaXNJRSkgew0KCQkJCQlzLmNlbnRlciA9IHRydWU7DQoJCQkJCXMuaGVscCA9IGZhbHNlOw0KCQkJCQlzLmRpYWxvZ1dpZHRoID0gcy53aWR0aCArICdweCc7DQoJCQkJCXMuZGlhbG9nSGVpZ2h0ID0gcy5oZWlnaHQgKyAncHgnOw0KCQkJCQlzLnNjcm9sbCA9IHMuc2Nyb2xsYmFycyB8fCBmYWxzZTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIEJ1aWxkIGZlYXR1cmVzIHN0cmluZw0KCQkJZWFjaChzLCBmdW5jdGlvbih2LCBrKSB7DQoJCQkJaWYgKHRpbnltY2UuaXModiwgJ2Jvb2xlYW4nKSkNCgkJCQkJdiA9IHYgPyAneWVzJyA6ICdubyc7DQoNCgkJCQlpZiAoIS9eKG5hbWV8dXJsKSQvLnRlc3QoaykpIHsNCgkJCQkJaWYgKGlzSUUgJiYgbW8pDQoJCQkJCQlmICs9IChmID8gJzsnIDogJycpICsgayArICc6JyArIHY7DQoJCQkJCWVsc2UNCgkJCQkJCWYgKz0gKGYgPyAnLCcgOiAnJykgKyBrICsgJz0nICsgdjsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJdC5mZWF0dXJlcyA9IHM7DQoJCQl0LnBhcmFtcyA9IHA7DQoJCQl0Lm9uT3Blbi5kaXNwYXRjaCh0LCBzLCBwKTsNCg0KCQkJdSA9IHMudXJsIHx8IHMuZmlsZTsNCgkJCXUgPSB0aW55bWNlLl9hZGRWZXIodSk7DQoNCgkJCXRyeSB7DQoJCQkJaWYgKGlzSUUgJiYgbW8pIHsNCgkJCQkJdyA9IDE7DQoJCQkJCXdpbmRvdy5zaG93TW9kYWxEaWFsb2codSwgd2luZG93LCBmKTsNCgkJCQl9IGVsc2UNCgkJCQkJdyA9IHdpbmRvdy5vcGVuKHUsIHMubmFtZSwgZik7DQoJCQl9IGNhdGNoIChleCkgew0KCQkJCS8vIElnbm9yZQ0KCQkJfQ0KDQoJCQlpZiAoIXcpDQoJCQkJYWxlcnQodC5lZGl0b3IuZ2V0TGFuZygncG9wdXBfYmxvY2tlZCcpKTsNCgkJfSwNCg0KCQljbG9zZSA6IGZ1bmN0aW9uKHcpIHsNCgkJCXcuY2xvc2UoKTsNCgkJCXRoaXMub25DbG9zZS5kaXNwYXRjaCh0aGlzKTsNCgkJfSwNCg0KCQljcmVhdGVJbnN0YW5jZSA6IGZ1bmN0aW9uKGNsLCBhLCBiLCBjLCBkLCBlKSB7DQoJCQl2YXIgZiA9IHRpbnltY2UucmVzb2x2ZShjbCk7DQoNCgkJCXJldHVybiBuZXcgZihhLCBiLCBjLCBkLCBlKTsNCgkJfSwNCg0KCQljb25maXJtIDogZnVuY3Rpb24odCwgY2IsIHMsIHcpIHsNCgkJCXcgPSB3IHx8IHdpbmRvdzsNCg0KCQkJY2IuY2FsbChzIHx8IHRoaXMsIHcuY29uZmlybSh0aGlzLl9kZWNvZGUodGhpcy5lZGl0b3IuZ2V0TGFuZyh0LCB0KSkpKTsNCgkJfSwNCg0KCQlhbGVydCA6IGZ1bmN0aW9uKHR4LCBjYiwgcywgdykgew0KCQkJdmFyIHQgPSB0aGlzOw0KDQoJCQl3ID0gdyB8fCB3aW5kb3c7DQoJCQl3LmFsZXJ0KHQuX2RlY29kZSh0LmVkaXRvci5nZXRMYW5nKHR4LCB0eCkpKTsNCg0KCQkJaWYgKGNiKQ0KCQkJCWNiLmNhbGwocyB8fCB0KTsNCgkJfSwNCg0KCQlyZXNpemVCeSA6IGZ1bmN0aW9uKGR3LCBkaCwgd2luKSB7DQoJCQl3aW4ucmVzaXplQnkoZHcsIGRoKTsNCgkJfSwNCg0KCQkvLyBJbnRlcm5hbCBmdW5jdGlvbnMNCg0KCQlfZGVjb2RlIDogZnVuY3Rpb24ocykgew0KCQkJcmV0dXJuIHRpbnltY2UuRE9NLmRlY29kZShzKS5yZXBsYWNlKC9cXG4vZywgJ1xuJyk7DQoJCX0NCgl9KTsNCn0odGlueW1jZSkpOw0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCglmdW5jdGlvbiBDb21tYW5kTWFuYWdlcigpIHsNCgkJdmFyIGV4ZWNDb21tYW5kcyA9IHt9LCBxdWVyeVN0YXRlQ29tbWFuZHMgPSB7fSwgcXVlcnlWYWx1ZUNvbW1hbmRzID0ge307DQoNCgkJZnVuY3Rpb24gYWRkKGNvbGxlY3Rpb24sIGNtZCwgZnVuYywgc2NvcGUpIHsNCgkJCWlmICh0eXBlb2YoY21kKSA9PSAnc3RyaW5nJykNCgkJCQljbWQgPSBbY21kXTsNCg0KCQkJdGlueW1jZS5lYWNoKGNtZCwgZnVuY3Rpb24oY21kKSB7DQoJCQkJY29sbGVjdGlvbltjbWQudG9Mb3dlckNhc2UoKV0gPSB7ZnVuYyA6IGZ1bmMsIHNjb3BlIDogc2NvcGV9Ow0KCQkJfSk7DQoJCX07DQoNCgkJdGlueW1jZS5leHRlbmQodGhpcywgew0KCQkJYWRkIDogZnVuY3Rpb24oY21kLCBmdW5jLCBzY29wZSkgew0KCQkJCWFkZChleGVjQ29tbWFuZHMsIGNtZCwgZnVuYywgc2NvcGUpOw0KCQkJfSwNCg0KCQkJYWRkUXVlcnlTdGF0ZUhhbmRsZXIgOiBmdW5jdGlvbihjbWQsIGZ1bmMsIHNjb3BlKSB7DQoJCQkJYWRkKHF1ZXJ5U3RhdGVDb21tYW5kcywgY21kLCBmdW5jLCBzY29wZSk7DQoJCQl9LA0KDQoJCQlhZGRRdWVyeVZhbHVlSGFuZGxlciA6IGZ1bmN0aW9uKGNtZCwgZnVuYywgc2NvcGUpIHsNCgkJCQlhZGQocXVlcnlWYWx1ZUNvbW1hbmRzLCBjbWQsIGZ1bmMsIHNjb3BlKTsNCgkJCX0sDQoNCgkJCWV4ZWNDb21tYW5kIDogZnVuY3Rpb24oc2NvcGUsIGNtZCwgdWksIHZhbHVlLCBhcmdzKSB7DQoJCQkJaWYgKGNtZCA9IGV4ZWNDb21tYW5kc1tjbWQudG9Mb3dlckNhc2UoKV0pIHsNCgkJCQkJaWYgKGNtZC5mdW5jLmNhbGwoc2NvcGUgfHwgY21kLnNjb3BlLCB1aSwgdmFsdWUsIGFyZ3MpICE9PSBmYWxzZSkNCgkJCQkJCXJldHVybiB0cnVlOw0KCQkJCX0NCgkJCX0sDQoNCgkJCXF1ZXJ5Q29tbWFuZFZhbHVlIDogZnVuY3Rpb24oKSB7DQoJCQkJaWYgKGNtZCA9IHF1ZXJ5VmFsdWVDb21tYW5kc1tjbWQudG9Mb3dlckNhc2UoKV0pDQoJCQkJCXJldHVybiBjbWQuZnVuYy5jYWxsKHNjb3BlIHx8IGNtZC5zY29wZSwgdWksIHZhbHVlLCBhcmdzKTsNCgkJCX0sDQoNCgkJCXF1ZXJ5Q29tbWFuZFN0YXRlIDogZnVuY3Rpb24oKSB7DQoJCQkJaWYgKGNtZCA9IHF1ZXJ5U3RhdGVDb21tYW5kc1tjbWQudG9Mb3dlckNhc2UoKV0pDQoJCQkJCXJldHVybiBjbWQuZnVuYy5jYWxsKHNjb3BlIHx8IGNtZC5zY29wZSwgdWksIHZhbHVlLCBhcmdzKTsNCgkJCX0NCgkJfSk7DQoJfTsNCg0KCXRpbnltY2UuR2xvYmFsQ29tbWFuZHMgPSBuZXcgQ29tbWFuZE1hbmFnZXIoKTsNCn0pKHRpbnltY2UpOw0KKGZ1bmN0aW9uKHRpbnltY2UpIHsNCgl0aW55bWNlLkZvcm1hdHRlciA9IGZ1bmN0aW9uKGVkKSB7DQoJCXZhciBmb3JtYXRzID0ge30sDQoJCQllYWNoID0gdGlueW1jZS5lYWNoLA0KCQkJZG9tID0gZWQuZG9tLA0KCQkJc2VsZWN0aW9uID0gZWQuc2VsZWN0aW9uLA0KCQkJVHJlZVdhbGtlciA9IHRpbnltY2UuZG9tLlRyZWVXYWxrZXIsDQoJCQlyYW5nZVV0aWxzID0gbmV3IHRpbnltY2UuZG9tLlJhbmdlVXRpbHMoZG9tKSwNCgkJCWlzVmFsaWQgPSBlZC5zY2hlbWEuaXNWYWxpZCwNCgkJCWlzQmxvY2sgPSBkb20uaXNCbG9jaywNCgkJCWZvcmNlZFJvb3RCbG9jayA9IGVkLnNldHRpbmdzLmZvcmNlZF9yb290X2Jsb2NrLA0KCQkJbm9kZUluZGV4ID0gZG9tLm5vZGVJbmRleCwNCgkJCUlOVklTSUJMRV9DSEFSID0gJ1x1RkVGRicsDQoJCQlNQ0VfQVRUUl9SRSA9IC9eKHNyY3xocmVmfHN0eWxlKSQvLA0KCQkJRkFMU0UgPSBmYWxzZSwNCgkJCVRSVUUgPSB0cnVlLA0KCQkJdW5kZWZpbmVkLA0KCQkJcGVuZGluZ0Zvcm1hdHMgPSB7YXBwbHkgOiBbXSwgcmVtb3ZlIDogW119Ow0KDQoJCWZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7DQoJCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQXJyYXk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZ2V0UGFyZW50cyhub2RlLCBzZWxlY3Rvcikgew0KCQkJcmV0dXJuIGRvbS5nZXRQYXJlbnRzKG5vZGUsIHNlbGVjdG9yLCBkb20uZ2V0Um9vdCgpKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBpc0NhcmV0Tm9kZShub2RlKSB7DQoJCQlyZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAobm9kZS5mYWNlID09PSAnbWNlaW5saW5lJyB8fCBub2RlLnN0eWxlLmZvbnRGYW1pbHkgPT09ICdtY2VpbmxpbmUnKTsNCgkJfTsNCg0KCQkvLyBQdWJsaWMgZnVuY3Rpb25zDQoNCgkJZnVuY3Rpb24gZ2V0KG5hbWUpIHsNCgkJCXJldHVybiBuYW1lID8gZm9ybWF0c1tuYW1lXSA6IGZvcm1hdHM7DQoJCX07DQoNCgkJZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgZm9ybWF0KSB7DQoJCQlpZiAobmFtZSkgew0KCQkJCWlmICh0eXBlb2YobmFtZSkgIT09ICdzdHJpbmcnKSB7DQoJCQkJCWVhY2gobmFtZSwgZnVuY3Rpb24oZm9ybWF0LCBuYW1lKSB7DQoJCQkJCQlyZWdpc3RlcihuYW1lLCBmb3JtYXQpOw0KCQkJCQl9KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBGb3JjZSBmb3JtYXQgaW50byBhcnJheSBhbmQgYWRkIGl0IHRvIGludGVybmFsIGNvbGxlY3Rpb24NCgkJCQkJZm9ybWF0ID0gZm9ybWF0Lmxlbmd0aCA/IGZvcm1hdCA6IFtmb3JtYXRdOw0KDQoJCQkJCWVhY2goZm9ybWF0LCBmdW5jdGlvbihmb3JtYXQpIHsNCgkJCQkJCS8vIFNldCBkZWVwIHRvIGZhbHNlIGJ5IGRlZmF1bHQgb24gc2VsZWN0b3IgZm9ybWF0cyB0aGlzIHRvIGF2b2lkIHJlbW92aW5nDQoJCQkJCQkvLyBhbGlnbm1lbnQgb24gaW1hZ2VzIGluc2lkZSBwYXJhZ3JhcGhzIHdoZW4gYWxpZ25tZW50IGlzIGNoYW5nZWQgb24gcGFyYWdyYXBocw0KCQkJCQkJaWYgKGZvcm1hdC5kZWVwID09PSB1bmRlZmluZWQpDQoJCQkJCQkJZm9ybWF0LmRlZXAgPSAhZm9ybWF0LnNlbGVjdG9yOw0KDQoJCQkJCQkvLyBEZWZhdWx0IHRvIHRydWUNCgkJCQkJCWlmIChmb3JtYXQuc3BsaXQgPT09IHVuZGVmaW5lZCkNCgkJCQkJCQlmb3JtYXQuc3BsaXQgPSAhZm9ybWF0LnNlbGVjdG9yIHx8IGZvcm1hdC5pbmxpbmU7DQoNCgkJCQkJCS8vIERlZmF1bHQgdG8gdHJ1ZQ0KCQkJCQkJaWYgKGZvcm1hdC5yZW1vdmUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQuc2VsZWN0b3IgJiYgIWZvcm1hdC5pbmxpbmUpDQoJCQkJCQkJZm9ybWF0LnJlbW92ZSA9ICdub25lJzsNCg0KCQkJCQkJLy8gTWFyayBmb3JtYXQgYXMgYSBtaXhlZCBmb3JtYXQgaW5saW5lICsgYmxvY2sgbGV2ZWwNCgkJCQkJCWlmIChmb3JtYXQuc2VsZWN0b3IgJiYgZm9ybWF0LmlubGluZSkgew0KCQkJCQkJCWZvcm1hdC5taXhlZCA9IHRydWU7DQoJCQkJCQkJZm9ybWF0LmJsb2NrX2V4cGFuZCA9IHRydWU7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIFNwbGl0IGNsYXNzZXMgaWYgbmVlZGVkDQoJCQkJCQlpZiAodHlwZW9mKGZvcm1hdC5jbGFzc2VzKSA9PT0gJ3N0cmluZycpDQoJCQkJCQkJZm9ybWF0LmNsYXNzZXMgPSBmb3JtYXQuY2xhc3Nlcy5zcGxpdCgvXHMrLyk7DQoJCQkJCX0pOw0KDQoJCQkJCWZvcm1hdHNbbmFtZV0gPSBmb3JtYXQ7DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGFwcGx5KG5hbWUsIHZhcnMsIG5vZGUpIHsNCgkJCXZhciBmb3JtYXRMaXN0ID0gZ2V0KG5hbWUpLCBmb3JtYXQgPSBmb3JtYXRMaXN0WzBdLCBib29rbWFyaywgcm5nLCBpOw0KDQoJCQlmdW5jdGlvbiBtb3ZlU3RhcnQocm5nKSB7DQoJCQkJdmFyIGNvbnRhaW5lciA9IHJuZy5zdGFydENvbnRhaW5lciwNCgkJCQkJb2Zmc2V0ID0gcm5nLnN0YXJ0T2Zmc2V0LA0KCQkJCQl3YWxrZXIsIG5vZGU7DQoNCgkJCQkvLyBNb3ZlIHN0YXJ0Q29udGFpbmVyL3N0YXJ0T2Zmc2V0IGluIHRvIGEgc3VpdGFibGUgbm9kZQ0KCQkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMSB8fCBjb250YWluZXIubm9kZVZhbHVlID09PSAiIikgew0KCQkJCQljb250YWluZXIgPSBjb250YWluZXIubm9kZVR5cGUgPT0gMSA/IGNvbnRhaW5lci5jaGlsZE5vZGVzW29mZnNldF0gOiBjb250YWluZXI7DQoNCgkJCQkJLy8gTWlnaHQgZmFpbCBpZiB0aGUgb2Zmc2V0IGlzIGJlaGluZCB0aGUgbGFzdCBlbGVtZW50IGluIGl0J3MgY29udGFpbmVyDQoJCQkJCWlmIChjb250YWluZXIpIHsNCgkJCQkJCXdhbGtlciA9IG5ldyBUcmVlV2Fsa2VyKGNvbnRhaW5lciwgY29udGFpbmVyLnBhcmVudE5vZGUpOw0KCQkJCQkJZm9yIChub2RlID0gd2Fsa2VyLmN1cnJlbnQoKTsgbm9kZTsgbm9kZSA9IHdhbGtlci5uZXh0KCkpIHsNCgkJCQkJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmICFpc1doaXRlU3BhY2VOb2RlKG5vZGUpKSB7DQoJCQkJCQkJCXJuZy5zZXRTdGFydChub2RlLCAwKTsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIHJuZzsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHNldEVsZW1lbnRGb3JtYXQoZWxtLCBmbXQpIHsNCgkJCQlmbXQgPSBmbXQgfHwgZm9ybWF0Ow0KDQoJCQkJaWYgKGVsbSkgew0KCQkJCQllYWNoKGZtdC5zdHlsZXMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7DQoJCQkJCQlkb20uc2V0U3R5bGUoZWxtLCBuYW1lLCByZXBsYWNlVmFycyh2YWx1ZSwgdmFycykpOw0KCQkJCQl9KTsNCg0KCQkJCQllYWNoKGZtdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkgew0KCQkJCQkJZG9tLnNldEF0dHJpYihlbG0sIG5hbWUsIHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKSk7DQoJCQkJCX0pOw0KDQoJCQkJCWVhY2goZm10LmNsYXNzZXMsIGZ1bmN0aW9uKHZhbHVlKSB7DQoJCQkJCQl2YWx1ZSA9IHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKTsNCg0KCQkJCQkJaWYgKCFkb20uaGFzQ2xhc3MoZWxtLCB2YWx1ZSkpDQoJCQkJCQkJZG9tLmFkZENsYXNzKGVsbSwgdmFsdWUpOw0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBhcHBseVJuZ1N0eWxlKHJuZykgew0KCQkJCXZhciBuZXdXcmFwcGVycyA9IFtdLCB3cmFwTmFtZSwgd3JhcEVsbTsNCg0KCQkJCS8vIFNldHVwIHdyYXBwZXIgZWxlbWVudA0KCQkJCXdyYXBOYW1lID0gZm9ybWF0LmlubGluZSB8fCBmb3JtYXQuYmxvY2s7DQoJCQkJd3JhcEVsbSA9IGRvbS5jcmVhdGUod3JhcE5hbWUpOw0KCQkJCXNldEVsZW1lbnRGb3JtYXQod3JhcEVsbSk7DQoNCgkJCQlyYW5nZVV0aWxzLndhbGsocm5nLCBmdW5jdGlvbihub2Rlcykgew0KCQkJCQl2YXIgY3VycmVudFdyYXBFbG07DQoNCgkJCQkJZnVuY3Rpb24gcHJvY2Vzcyhub2RlKSB7DQoJCQkJCQl2YXIgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudE5hbWUgPSBub2RlLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgZm91bmQ7DQoNCgkJCQkJCS8vIFN0b3Agd3JhcHBpbmcgb24gYnIgZWxlbWVudHMNCgkJCQkJCWlmIChpc0VxKG5vZGVOYW1lLCAnYnInKSkgew0KCQkJCQkJCWN1cnJlbnRXcmFwRWxtID0gMDsNCg0KCQkJCQkJCS8vIFJlbW92ZSBhbnkgYnIgZWxlbWVudHMgd2hlbiB3ZSB3cmFwIHRoaW5ncw0KCQkJCQkJCWlmIChmb3JtYXQuYmxvY2spDQoJCQkJCQkJCWRvbS5yZW1vdmUobm9kZSk7DQoNCgkJCQkJCQlyZXR1cm47DQoJCQkJCQl9DQoNCgkJCQkJCS8vIElmIG5vZGUgaXMgd3JhcHBlciB0eXBlDQoJCQkJCQlpZiAoZm9ybWF0LndyYXBwZXIgJiYgbWF0Y2hOb2RlKG5vZGUsIG5hbWUsIHZhcnMpKSB7DQoJCQkJCQkJY3VycmVudFdyYXBFbG0gPSAwOw0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gQ2FuIHdlIHJlbmFtZSB0aGUgYmxvY2sNCgkJCQkJCWlmIChmb3JtYXQuYmxvY2sgJiYgIWZvcm1hdC53cmFwcGVyICYmIGlzVGV4dEJsb2NrKG5vZGVOYW1lKSkgew0KCQkJCQkJCW5vZGUgPSBkb20ucmVuYW1lKG5vZGUsIHdyYXBOYW1lKTsNCgkJCQkJCQlzZXRFbGVtZW50Rm9ybWF0KG5vZGUpOw0KCQkJCQkJCW5ld1dyYXBwZXJzLnB1c2gobm9kZSk7DQoJCQkJCQkJY3VycmVudFdyYXBFbG0gPSAwOw0KCQkJCQkJCXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gSGFuZGxlIHNlbGVjdG9yIHBhdHRlcm5zDQoJCQkJCQlpZiAoZm9ybWF0LnNlbGVjdG9yKSB7DQoJCQkJCQkJLy8gTG9vayBmb3IgbWF0Y2hpbmcgZm9ybWF0cw0KCQkJCQkJCWVhY2goZm9ybWF0TGlzdCwgZnVuY3Rpb24oZm9ybWF0KSB7DQoJCQkJCQkJCWlmIChkb20uaXMobm9kZSwgZm9ybWF0LnNlbGVjdG9yKSAmJiAhaXNDYXJldE5vZGUobm9kZSkpIHsNCgkJCQkJCQkJCXNldEVsZW1lbnRGb3JtYXQobm9kZSwgZm9ybWF0KTsNCgkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0pOw0KDQoJCQkJCQkJLy8gQ29udGludWUgcHJvY2Vzc2luZyBpZiBhIHNlbGVjdG9yIG1hdGNoIHdhc24ndCBmb3VuZCBhbmQgYSBpbmxpbmUgZWxlbWVudCBpcyBkZWZpbmVkDQoJCQkJCQkJaWYgKCFmb3JtYXQuaW5saW5lIHx8IGZvdW5kKSB7DQoJCQkJCQkJCWN1cnJlbnRXcmFwRWxtID0gMDsNCgkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJLy8gSXMgaXQgdmFsaWQgdG8gd3JhcCB0aGlzIGl0ZW0NCgkJCQkJCWlmICgoZm9ybWF0LndyYXBfbGlua3MgIT09IGZhbHNlIHx8IG5vZGVOYW1lICE9ICdhJykgJiYgaXNWYWxpZCh3cmFwTmFtZSwgbm9kZU5hbWUpICYmIGlzVmFsaWQocGFyZW50TmFtZSwgd3JhcE5hbWUpKSB7DQoJCQkJCQkJLy8gU3RhcnQgd3JhcHBpbmcNCgkJCQkJCQlpZiAoIWN1cnJlbnRXcmFwRWxtKSB7DQoJCQkJCQkJCS8vIFdyYXAgdGhlIG5vZGUNCgkJCQkJCQkJY3VycmVudFdyYXBFbG0gPSB3cmFwRWxtLmNsb25lTm9kZShGQUxTRSk7DQoJCQkJCQkJCW5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY3VycmVudFdyYXBFbG0sIG5vZGUpOw0KCQkJCQkJCQluZXdXcmFwcGVycy5wdXNoKGN1cnJlbnRXcmFwRWxtKTsNCgkJCQkJCQl9DQoNCgkJCQkJCQljdXJyZW50V3JhcEVsbS5hcHBlbmRDaGlsZChub2RlKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJLy8gU3RhcnQgYSBuZXcgd3JhcHBlciBmb3IgcG9zc2libGUgY2hpbGRyZW4NCgkJCQkJCQljdXJyZW50V3JhcEVsbSA9IDA7DQoNCgkJCQkJCQllYWNoKHRpbnltY2UuZ3JlcChub2RlLmNoaWxkTm9kZXMpLCBwcm9jZXNzKTsNCg0KCQkJCQkJCS8vIEVuZCB0aGUgbGFzdCB3cmFwcGVyDQoJCQkJCQkJY3VycmVudFdyYXBFbG0gPSAwOw0KCQkJCQkJfQ0KCQkJCQl9Ow0KDQoJCQkJCS8vIFByb2Nlc3Mgc2libGluZ3MgZnJvbSByYW5nZQ0KCQkJCQllYWNoKG5vZGVzLCBwcm9jZXNzKTsNCgkJCQl9KTsNCg0KCQkJCS8vIENsZWFudXANCgkJCQllYWNoKG5ld1dyYXBwZXJzLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCXZhciBjaGlsZENvdW50Ow0KDQoJCQkJCWZ1bmN0aW9uIGdldENoaWxkQ291bnQobm9kZSkgew0KCQkJCQkJdmFyIGNvdW50ID0gMDsNCg0KCQkJCQkJZWFjaChub2RlLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCQlpZiAoIWlzV2hpdGVTcGFjZU5vZGUobm9kZSkgJiYgIWlzQm9va21hcmtOb2RlKG5vZGUpKQ0KCQkJCQkJCQljb3VudCsrOw0KCQkJCQkJfSk7DQoNCgkJCQkJCXJldHVybiBjb3VudDsNCgkJCQkJfTsNCg0KCQkJCQlmdW5jdGlvbiBtZXJnZVN0eWxlcyhub2RlKSB7DQoJCQkJCQl2YXIgY2hpbGQsIGNsb25lOw0KDQoJCQkJCQllYWNoKG5vZGUuY2hpbGROb2RlcywgZnVuY3Rpb24obm9kZSkgew0KCQkJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgIWlzQm9va21hcmtOb2RlKG5vZGUpICYmICFpc0NhcmV0Tm9kZShub2RlKSkgew0KCQkJCQkJCQljaGlsZCA9IG5vZGU7DQoJCQkJCQkJCXJldHVybiBGQUxTRTsgLy8gYnJlYWsgbG9vcA0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBJZiBjaGlsZCB3YXMgZm91bmQgYW5kIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGN1cnJlbnQgbm9kZQ0KCQkJCQkJaWYgKGNoaWxkICYmIG1hdGNoTmFtZShjaGlsZCwgZm9ybWF0KSkgew0KCQkJCQkJCWNsb25lID0gY2hpbGQuY2xvbmVOb2RlKEZBTFNFKTsNCgkJCQkJCQlzZXRFbGVtZW50Rm9ybWF0KGNsb25lKTsNCg0KCQkJCQkJCWRvbS5yZXBsYWNlKGNsb25lLCBub2RlLCBUUlVFKTsNCgkJCQkJCQlkb20ucmVtb3ZlKGNoaWxkLCAxKTsNCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuIGNsb25lIHx8IG5vZGU7DQoJCQkJCX07DQoNCgkJCQkJY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQobm9kZSk7DQoNCgkJCQkJLy8gUmVtb3ZlIGVtcHR5IG5vZGVzDQoJCQkJCWlmIChjaGlsZENvdW50ID09PSAwKSB7DQoJCQkJCQlkb20ucmVtb3ZlKG5vZGUsIDEpOw0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoNCgkJCQkJaWYgKGZvcm1hdC5pbmxpbmUgfHwgZm9ybWF0LndyYXBwZXIpIHsNCgkJCQkJCS8vIE1lcmdlcyB0aGUgY3VycmVudCBub2RlIHdpdGggaXQncyBjaGlsZHJlbiBvZiBzaW1pbGFyIHR5cGUgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCgkJCQkJCWlmICghZm9ybWF0LmV4YWN0ICYmIGNoaWxkQ291bnQgPT09IDEpDQoJCQkJCQkJbm9kZSA9IG1lcmdlU3R5bGVzKG5vZGUpOw0KDQoJCQkJCQkvLyBSZW1vdmUvbWVyZ2UgY2hpbGRyZW4NCgkJCQkJCWVhY2goZm9ybWF0TGlzdCwgZnVuY3Rpb24oZm9ybWF0KSB7DQoJCQkJCQkJLy8gTWVyZ2UgYWxsIGNoaWxkcmVuIG9mIHNpbWlsYXIgdHlwZSB3aWxsIG1vdmUgc3R5bGVzIGZyb20gY2hpbGQgdG8gcGFyZW50DQoJCQkJCQkJLy8gdGhpczogPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+PGI+PHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsgZm9udC1zaXplOjEwcHgiPnRleHQ8L3NwYW4+PC9iPjwvc3Bhbj4NCgkJCQkJCQkvLyB3aWxsIGJlY29tZTogPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMHB4Ij50ZXh0PC9zcGFuPjwvYj48L3NwYW4+DQoJCQkJCQkJZWFjaChkb20uc2VsZWN0KGZvcm1hdC5pbmxpbmUsIG5vZGUpLCBmdW5jdGlvbihjaGlsZCkgew0KCQkJCQkJCQlyZW1vdmVGb3JtYXQoZm9ybWF0LCB2YXJzLCBjaGlsZCwgZm9ybWF0LmV4YWN0ID8gY2hpbGQgOiBudWxsKTsNCgkJCQkJCQl9KTsNCgkJCQkJCX0pOw0KDQoJCQkJCQkvLyBSZW1vdmUgY2hpbGQgaWYgZGlyZWN0IHBhcmVudCBpcyBvZiBzYW1lIHR5cGUNCgkJCQkJCWlmIChtYXRjaE5vZGUobm9kZS5wYXJlbnROb2RlLCBuYW1lLCB2YXJzKSkgew0KCQkJCQkJCWRvbS5yZW1vdmUobm9kZSwgMSk7DQoJCQkJCQkJbm9kZSA9IDA7DQoJCQkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIExvb2sgZm9yIHBhcmVudCB3aXRoIHNpbWlsYXIgc3R5bGUgZm9ybWF0DQoJCQkJCQlpZiAoZm9ybWF0Lm1lcmdlX3dpdGhfcGFyZW50cykgew0KCQkJCQkJCWRvbS5nZXRQYXJlbnQobm9kZS5wYXJlbnROb2RlLCBmdW5jdGlvbihwYXJlbnQpIHsNCgkJCQkJCQkJaWYgKG1hdGNoTm9kZShwYXJlbnQsIG5hbWUsIHZhcnMpKSB7DQoJCQkJCQkJCQlkb20ucmVtb3ZlKG5vZGUsIDEpOw0KCQkJCQkJCQkJbm9kZSA9IDA7DQoJCQkJCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0pOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBNZXJnZSBuZXh0IGFuZCBwcmV2aW91cyBzaWJsaW5ncyBpZiB0aGV5IGFyZSBzaW1pbGFyIDxiPnRleHQ8L2I+PGI+dGV4dDwvYj4gYmVjb21lcyA8Yj50ZXh0dGV4dDwvYj4NCgkJCQkJCWlmIChub2RlKSB7DQoJCQkJCQkJbm9kZSA9IG1lcmdlU2libGluZ3MoZ2V0Tm9uV2hpdGVTcGFjZVNpYmxpbmcobm9kZSksIG5vZGUpOw0KCQkJCQkJCW5vZGUgPSBtZXJnZVNpYmxpbmdzKG5vZGUsIGdldE5vbldoaXRlU3BhY2VTaWJsaW5nKG5vZGUsIFRSVUUpKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfTsNCg0KCQkJaWYgKGZvcm1hdCkgew0KCQkJCWlmIChub2RlKSB7DQoJCQkJCXJuZyA9IGRvbS5jcmVhdGVSbmcoKTsNCg0KCQkJCQlybmcuc2V0U3RhcnRCZWZvcmUobm9kZSk7DQoJCQkJCXJuZy5zZXRFbmRBZnRlcihub2RlKTsNCg0KCQkJCQlhcHBseVJuZ1N0eWxlKGV4cGFuZFJuZyhybmcsIGZvcm1hdExpc3QpKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlpZiAoIXNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpIHx8ICFmb3JtYXQuaW5saW5lKSB7DQoJCQkJCQkvLyBBcHBseSBmb3JtYXR0aW5nIHRvIHNlbGVjdGlvbg0KCQkJCQkJYm9va21hcmsgPSBzZWxlY3Rpb24uZ2V0Qm9va21hcmsoKTsNCgkJCQkJCWFwcGx5Um5nU3R5bGUoZXhwYW5kUm5nKHNlbGVjdGlvbi5nZXRSbmcoVFJVRSksIGZvcm1hdExpc3QpKTsNCg0KCQkJCQkJc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsNCgkJCQkJCXNlbGVjdGlvbi5zZXRSbmcobW92ZVN0YXJ0KHNlbGVjdGlvbi5nZXRSbmcoVFJVRSkpKTsNCgkJCQkJCWVkLm5vZGVDaGFuZ2VkKCk7DQoJCQkJCX0gZWxzZQ0KCQkJCQkJcGVyZm9ybUNhcmV0QWN0aW9uKCdhcHBseScsIG5hbWUsIHZhcnMpOw0KCQkJCX0NCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiByZW1vdmUobmFtZSwgdmFycywgbm9kZSkgew0KCQkJdmFyIGZvcm1hdExpc3QgPSBnZXQobmFtZSksIGZvcm1hdCA9IGZvcm1hdExpc3RbMF0sIGJvb2ttYXJrLCBpLCBybmc7DQoNCgkJCWZ1bmN0aW9uIG1vdmVTdGFydChybmcpIHsNCgkJCQl2YXIgY29udGFpbmVyID0gcm5nLnN0YXJ0Q29udGFpbmVyLA0KCQkJCQlvZmZzZXQgPSBybmcuc3RhcnRPZmZzZXQsDQoJCQkJCXdhbGtlciwgbm9kZSwgbm9kZXMsIHRtcE5vZGU7DQoNCgkJCQkvLyBDb252ZXJ0IHRleHQgbm9kZSBpbnRvIGluZGV4IGlmIHBvc3NpYmxlDQoJCQkJaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PSAzICYmIG9mZnNldCA+PSBjb250YWluZXIubm9kZVZhbHVlLmxlbmd0aCAtIDEpIHsNCgkJCQkJY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7DQoJCQkJCW9mZnNldCA9IG5vZGVJbmRleChjb250YWluZXIpICsgMTsNCgkJCQl9DQoNCgkJCQkvLyBNb3ZlIHN0YXJ0Q29udGFpbmVyL3N0YXJ0T2Zmc2V0IGluIHRvIGEgc3VpdGFibGUgbm9kZQ0KCQkJCWlmIChjb250YWluZXIubm9kZVR5cGUgPT0gMSkgew0KCQkJCQlub2RlcyA9IGNvbnRhaW5lci5jaGlsZE5vZGVzOw0KCQkJCQljb250YWluZXIgPSBub2Rlc1tNYXRoLm1pbihvZmZzZXQsIG5vZGVzLmxlbmd0aCAtIDEpXTsNCgkJCQkJd2Fsa2VyID0gbmV3IFRyZWVXYWxrZXIoY29udGFpbmVyKTsNCg0KCQkJCQkvLyBJZiBvZmZzZXQgaXMgYXQgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZSB3YWxrIHRvIHRoZSBuZXh0IG9uZQ0KCQkJCQlpZiAob2Zmc2V0ID4gbm9kZXMubGVuZ3RoIC0gMSkNCgkJCQkJCXdhbGtlci5uZXh0KCk7DQoNCgkJCQkJZm9yIChub2RlID0gd2Fsa2VyLmN1cnJlbnQoKTsgbm9kZTsgbm9kZSA9IHdhbGtlci5uZXh0KCkpIHsNCgkJCQkJCWlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgIWlzV2hpdGVTcGFjZU5vZGUobm9kZSkpIHsNCgkJCQkJCQkvLyBJRSBoYXMgYSAibmVhdCIgZmVhdHVyZSB3aGVyZSBpdCBtb3ZlcyB0aGUgc3RhcnQgbm9kZSBpbnRvIHRoZSBjbG9zZXN0IGVsZW1lbnQNCgkJCQkJCQkvLyB3ZSBjYW4gYXZvaWQgdGhpcyBieSBpbnNlcnRpbmcgYW4gZWxlbWVudCBiZWZvcmUgaXQgYW5kIHRoZW4gcmVtb3ZlIGl0IGFmdGVyIHdlIHNldCB0aGUgc2VsZWN0aW9uDQoJCQkJCQkJdG1wTm9kZSA9IGRvbS5jcmVhdGUoJ2EnLCBudWxsLCBJTlZJU0lCTEVfQ0hBUik7DQoJCQkJCQkJbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0bXBOb2RlLCBub2RlKTsNCg0KCQkJCQkJCS8vIFNldCBzZWxlY3Rpb24gYW5kIHJlbW92ZSB0bXBOb2RlDQoJCQkJCQkJcm5nLnNldFN0YXJ0KG5vZGUsIDApOw0KCQkJCQkJCXNlbGVjdGlvbi5zZXRSbmcocm5nKTsNCgkJCQkJCQlkb20ucmVtb3ZlKHRtcE5vZGUpOw0KDQoJCQkJCQkJcmV0dXJuOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfTsNCg0KCQkJLy8gTWVyZ2VzIHRoZSBzdHlsZXMgZm9yIGVhY2ggbm9kZQ0KCQkJZnVuY3Rpb24gcHJvY2Vzcyhub2RlKSB7DQoJCQkJdmFyIGNoaWxkcmVuLCBpLCBsOw0KDQoJCQkJLy8gR3JhYiB0aGUgY2hpbGRyZW4gZmlyc3Qgc2luY2UgdGhlIG5vZGVsaXN0IG1pZ2h0IGJlIGNoYW5nZWQNCgkJCQljaGlsZHJlbiA9IHRpbnltY2UuZ3JlcChub2RlLmNoaWxkTm9kZXMpOw0KDQoJCQkJLy8gUHJvY2VzcyBjdXJyZW50IG5vZGUNCgkJCQlmb3IgKGkgPSAwLCBsID0gZm9ybWF0TGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCgkJCQkJaWYgKHJlbW92ZUZvcm1hdChmb3JtYXRMaXN0W2ldLCB2YXJzLCBub2RlLCBub2RlKSkNCgkJCQkJCWJyZWFrOw0KCQkJCX0NCg0KCQkJCS8vIFByb2Nlc3MgdGhlIGNoaWxkcmVuDQoJCQkJaWYgKGZvcm1hdC5kZWVwKSB7DQoJCQkJCWZvciAoaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspDQoJCQkJCQlwcm9jZXNzKGNoaWxkcmVuW2ldKTsNCgkJCQl9DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBmaW5kRm9ybWF0Um9vdChjb250YWluZXIpIHsNCgkJCQl2YXIgZm9ybWF0Um9vdDsNCg0KCQkJCS8vIEZpbmQgZm9ybWF0IHJvb3QNCgkJCQllYWNoKGdldFBhcmVudHMoY29udGFpbmVyLnBhcmVudE5vZGUpLnJldmVyc2UoKSwgZnVuY3Rpb24ocGFyZW50KSB7DQoJCQkJCXZhciBmb3JtYXQ7DQoNCgkJCQkJLy8gRmluZCBmb3JtYXQgcm9vdCBlbGVtZW50DQoJCQkJCWlmICghZm9ybWF0Um9vdCAmJiBwYXJlbnQuaWQgIT0gJ19zdGFydCcgJiYgcGFyZW50LmlkICE9ICdfZW5kJykgew0KCQkJCQkJLy8gSXMgdGhlIG5vZGUgbWF0Y2hpbmcgdGhlIGZvcm1hdCB3ZSBhcmUgbG9va2luZyBmb3INCgkJCQkJCWZvcm1hdCA9IG1hdGNoTm9kZShwYXJlbnQsIG5hbWUsIHZhcnMpOw0KCQkJCQkJaWYgKGZvcm1hdCAmJiBmb3JtYXQuc3BsaXQgIT09IGZhbHNlKQ0KCQkJCQkJCWZvcm1hdFJvb3QgPSBwYXJlbnQ7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCXJldHVybiBmb3JtYXRSb290Ow0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gd3JhcEFuZFNwbGl0KGZvcm1hdF9yb290LCBjb250YWluZXIsIHRhcmdldCwgc3BsaXQpIHsNCgkJCQl2YXIgcGFyZW50LCBjbG9uZSwgbGFzdENsb25lLCBmaXJzdENsb25lLCBpLCBmb3JtYXRSb290UGFyZW50Ow0KDQoJCQkJLy8gRm9ybWF0IHJvb3QgZm91bmQgdGhlbiBjbG9uZSBmb3JtYXRzIGFuZCBzcGxpdCBpdA0KCQkJCWlmIChmb3JtYXRfcm9vdCkgew0KCQkJCQlmb3JtYXRSb290UGFyZW50ID0gZm9ybWF0X3Jvb3QucGFyZW50Tm9kZTsNCg0KCQkJCQlmb3IgKHBhcmVudCA9IGNvbnRhaW5lci5wYXJlbnROb2RlOyBwYXJlbnQgJiYgcGFyZW50ICE9IGZvcm1hdFJvb3RQYXJlbnQ7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7DQoJCQkJCQljbG9uZSA9IHBhcmVudC5jbG9uZU5vZGUoRkFMU0UpOw0KDQoJCQkJCQlmb3IgKGkgPSAwOyBpIDwgZm9ybWF0TGlzdC5sZW5ndGg7IGkrKykgew0KCQkJCQkJCWlmIChyZW1vdmVGb3JtYXQoZm9ybWF0TGlzdFtpXSwgdmFycywgY2xvbmUsIGNsb25lKSkgew0KCQkJCQkJCQljbG9uZSA9IDA7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJLy8gQnVpbGQgd3JhcHBlciBub2RlDQoJCQkJCQlpZiAoY2xvbmUpIHsNCgkJCQkJCQlpZiAobGFzdENsb25lKQ0KCQkJCQkJCQljbG9uZS5hcHBlbmRDaGlsZChsYXN0Q2xvbmUpOw0KDQoJCQkJCQkJaWYgKCFmaXJzdENsb25lKQ0KCQkJCQkJCQlmaXJzdENsb25lID0gY2xvbmU7DQoNCgkJCQkJCQlsYXN0Q2xvbmUgPSBjbG9uZTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIE5ldmVyIHNwbGl0IGJsb2NrIGVsZW1lbnRzIGlmIHRoZSBmb3JtYXQgaXMgbWl4ZWQNCgkJCQkJaWYgKHNwbGl0ICYmICghZm9ybWF0Lm1peGVkIHx8ICFpc0Jsb2NrKGZvcm1hdF9yb290KSkpDQoJCQkJCQljb250YWluZXIgPSBkb20uc3BsaXQoZm9ybWF0X3Jvb3QsIGNvbnRhaW5lcik7DQoNCgkJCQkJLy8gV3JhcCBjb250YWluZXIgaW4gY2xvbmVkIGZvcm1hdHMNCgkJCQkJaWYgKGxhc3RDbG9uZSkgew0KCQkJCQkJdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGxhc3RDbG9uZSwgdGFyZ2V0KTsNCgkJCQkJCWZpcnN0Q2xvbmUuYXBwZW5kQ2hpbGQodGFyZ2V0KTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCXJldHVybiBjb250YWluZXI7DQoJCQl9Ow0KDQoJCQlmdW5jdGlvbiBzcGxpdFRvRm9ybWF0Um9vdChjb250YWluZXIpIHsNCgkJCQlyZXR1cm4gd3JhcEFuZFNwbGl0KGZpbmRGb3JtYXRSb290KGNvbnRhaW5lciksIGNvbnRhaW5lciwgY29udGFpbmVyLCB0cnVlKTsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHVud3JhcChzdGFydCkgew0KCQkJCXZhciBub2RlID0gZG9tLmdldChzdGFydCA/ICdfc3RhcnQnIDogJ19lbmQnKSwNCgkJCQkJb3V0ID0gbm9kZVtzdGFydCA/ICdmaXJzdENoaWxkJyA6ICdsYXN0Q2hpbGQnXTsNCg0KCQkJCS8vIElmIHRoZSBlbmQgaXMgcGxhY2VkIHdpdGhpbiB0aGUgc3RhcnQgdGhlIHJlc3VsdCB3aWxsIGJlIHJlbW92ZWQNCgkJCQkvLyBTbyB0aGlzIGNoZWNrcyBpZiB0aGUgb3V0IG5vZGUgaXMgYSBib29rbWFyayBub2RlIGlmIGl0IGlzIGl0DQoJCQkJLy8gY2hlY2tzIGZvciBhbm90aGVyIG1vcmUgc3VpdGFibGUgbm9kZQ0KCQkJCWlmIChpc0Jvb2ttYXJrTm9kZShvdXQpKQ0KCQkJCQlvdXQgPSBvdXRbc3RhcnQgPyAnZmlyc3RDaGlsZCcgOiAnbGFzdENoaWxkJ107DQoNCgkJCQlkb20ucmVtb3ZlKG5vZGUsIHRydWUpOw0KDQoJCQkJcmV0dXJuIG91dDsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHJlbW92ZVJuZ1N0eWxlKHJuZykgew0KCQkJCXZhciBzdGFydENvbnRhaW5lciwgZW5kQ29udGFpbmVyOw0KDQoJCQkJcm5nID0gZXhwYW5kUm5nKHJuZywgZm9ybWF0TGlzdCwgVFJVRSk7DQoNCgkJCQlpZiAoZm9ybWF0LnNwbGl0KSB7DQoJCQkJCXN0YXJ0Q29udGFpbmVyID0gZ2V0Q29udGFpbmVyKHJuZywgVFJVRSk7DQoJCQkJCWVuZENvbnRhaW5lciA9IGdldENvbnRhaW5lcihybmcpOw0KDQoJCQkJCWlmIChzdGFydENvbnRhaW5lciAhPSBlbmRDb250YWluZXIpIHsNCgkJCQkJCS8vIFdyYXAgc3RhcnQvZW5kIG5vZGVzIGluIHNwYW4gZWxlbWVudCBzaW5jZSB0aGVzZSBtaWdodCBiZSBjbG9uZWQvbW92ZWQNCgkJCQkJCXN0YXJ0Q29udGFpbmVyID0gd3JhcChzdGFydENvbnRhaW5lciwgJ3NwYW4nLCB7aWQgOiAnX3N0YXJ0JywgX21jZV90eXBlIDogJ2Jvb2ttYXJrJ30pOw0KCQkJCQkJZW5kQ29udGFpbmVyID0gd3JhcChlbmRDb250YWluZXIsICdzcGFuJywge2lkIDogJ19lbmQnLCBfbWNlX3R5cGUgOiAnYm9va21hcmsnfSk7DQoNCgkJCQkJCS8vIFNwbGl0IHN0YXJ0L2VuZA0KCQkJCQkJc3BsaXRUb0Zvcm1hdFJvb3Qoc3RhcnRDb250YWluZXIpOw0KCQkJCQkJc3BsaXRUb0Zvcm1hdFJvb3QoZW5kQ29udGFpbmVyKTsNCg0KCQkJCQkJLy8gVW53cmFwIHN0YXJ0L2VuZCB0byBnZXQgcmVhbCBlbGVtZW50cyBhZ2Fpbg0KCQkJCQkJc3RhcnRDb250YWluZXIgPSB1bndyYXAoVFJVRSk7DQoJCQkJCQllbmRDb250YWluZXIgPSB1bndyYXAoKTsNCgkJCQkJfSBlbHNlDQoJCQkJCQlzdGFydENvbnRhaW5lciA9IGVuZENvbnRhaW5lciA9IHNwbGl0VG9Gb3JtYXRSb290KHN0YXJ0Q29udGFpbmVyKTsNCg0KCQkJCQkvLyBVcGRhdGUgcmFuZ2UgcG9zaXRpb25zIHNpbmNlIHRoZXkgbWlnaHQgaGF2ZSBjaGFuZ2VkIGFmdGVyIHRoZSBzcGxpdCBvcGVyYXRpb25zDQoJCQkJCXJuZy5zdGFydENvbnRhaW5lciA9IHN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGU7DQoJCQkJCXJuZy5zdGFydE9mZnNldCA9IG5vZGVJbmRleChzdGFydENvbnRhaW5lcik7DQoJCQkJCXJuZy5lbmRDb250YWluZXIgPSBlbmRDb250YWluZXIucGFyZW50Tm9kZTsNCgkJCQkJcm5nLmVuZE9mZnNldCA9IG5vZGVJbmRleChlbmRDb250YWluZXIpICsgMTsNCgkJCQl9DQoNCgkJCQkvLyBSZW1vdmUgaXRlbXMgYmV0d2VlbiBzdGFydC9lbmQNCgkJCQlyYW5nZVV0aWxzLndhbGsocm5nLCBmdW5jdGlvbihub2Rlcykgew0KCQkJCQllYWNoKG5vZGVzLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCQlwcm9jZXNzKG5vZGUpOw0KCQkJCQl9KTsNCgkJCQl9KTsNCgkJCX07DQoNCgkJCS8vIEhhbmRsZSBub2RlDQoJCQlpZiAobm9kZSkgew0KCQkJCXJuZyA9IGRvbS5jcmVhdGVSbmcoKTsNCgkJCQlybmcuc2V0U3RhcnRCZWZvcmUobm9kZSk7DQoJCQkJcm5nLnNldEVuZEFmdGVyKG5vZGUpOw0KCQkJCXJlbW92ZVJuZ1N0eWxlKHJuZyk7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQlpZiAoIXNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpIHx8ICFmb3JtYXQuaW5saW5lKSB7DQoJCQkJYm9va21hcmsgPSBzZWxlY3Rpb24uZ2V0Qm9va21hcmsoKTsNCgkJCQlyZW1vdmVSbmdTdHlsZShzZWxlY3Rpb24uZ2V0Um5nKFRSVUUpKTsNCgkJCQlzZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoYm9va21hcmspOw0KDQoJCQkJLy8gQ2hlY2sgaWYgc3RhcnQgZWxlbWVudCBzdGlsbCBoYXMgZm9ybWF0dGluZyB0aGVuIHdlIGFyZSBhdDogIjxiPnRleHR8PC9iPnRleHQiIGFuZCBuZWVkIHRvIG1vdmUgdGhlIHN0YXJ0IGludG8gdGhlIG5leHQgdGV4dCBub2RlDQoJCQkJaWYgKG1hdGNoKG5hbWUsIHZhcnMsIHNlbGVjdGlvbi5nZXRTdGFydCgpKSkgew0KCQkJCQltb3ZlU3RhcnQoc2VsZWN0aW9uLmdldFJuZyh0cnVlKSk7DQoJCQkJfQ0KDQoJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCX0gZWxzZQ0KCQkJCXBlcmZvcm1DYXJldEFjdGlvbigncmVtb3ZlJywgbmFtZSwgdmFycyk7DQoJCX07DQoNCgkJZnVuY3Rpb24gdG9nZ2xlKG5hbWUsIHZhcnMsIG5vZGUpIHsNCgkJCWlmIChtYXRjaChuYW1lLCB2YXJzLCBub2RlKSkNCgkJCQlyZW1vdmUobmFtZSwgdmFycywgbm9kZSk7DQoJCQllbHNlDQoJCQkJYXBwbHkobmFtZSwgdmFycywgbm9kZSk7DQoJCX07DQoNCgkJZnVuY3Rpb24gbWF0Y2hOb2RlKG5vZGUsIG5hbWUsIHZhcnMsIHNpbWlsYXIpIHsNCgkJCXZhciBmb3JtYXRMaXN0ID0gZ2V0KG5hbWUpLCBmb3JtYXQsIGksIGNsYXNzZXM7DQoNCgkJCWZ1bmN0aW9uIG1hdGNoSXRlbXMobm9kZSwgZm9ybWF0LCBpdGVtX25hbWUpIHsNCgkJCQl2YXIga2V5LCB2YWx1ZSwgaXRlbXMgPSBmb3JtYXRbaXRlbV9uYW1lXSwgaTsNCg0KCQkJCS8vIENoZWNrIGFsbCBpdGVtcw0KCQkJCWlmIChpdGVtcykgew0KCQkJCQkvLyBOb24gaW5kZXhlZCBvYmplY3QNCgkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7DQoJCQkJCQlmb3IgKGtleSBpbiBpdGVtcykgew0KCQkJCQkJCWlmIChpdGVtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7DQoJCQkJCQkJCWlmIChpdGVtX25hbWUgPT09ICdhdHRyaWJ1dGVzJykNCgkJCQkJCQkJCXZhbHVlID0gZG9tLmdldEF0dHJpYihub2RlLCBrZXkpOw0KCQkJCQkJCQllbHNlDQoJCQkJCQkJCQl2YWx1ZSA9IGdldFN0eWxlKG5vZGUsIGtleSk7DQoNCgkJCQkJCQkJaWYgKHNpbWlsYXIgJiYgIXZhbHVlICYmICFmb3JtYXQuZXhhY3QpDQoJCQkJCQkJCQlyZXR1cm47DQoNCgkJCQkJCQkJaWYgKCghc2ltaWxhciB8fCBmb3JtYXQuZXhhY3QpICYmICFpc0VxKHZhbHVlLCByZXBsYWNlVmFycyhpdGVtc1trZXldLCB2YXJzKSkpDQoJCQkJCQkJCQlyZXR1cm47DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJLy8gT25seSBvbmUgbWF0Y2ggbmVlZGVkIGZvciBpbmRleGVkIGFycmF5cw0KCQkJCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7DQoJCQkJCQkJaWYgKGl0ZW1fbmFtZSA9PT0gJ2F0dHJpYnV0ZXMnID8gZG9tLmdldEF0dHJpYihub2RlLCBpdGVtc1tpXSkgOiBnZXRTdHlsZShub2RlLCBpdGVtc1tpXSkpDQoJCQkJCQkJCXJldHVybiBmb3JtYXQ7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlyZXR1cm4gZm9ybWF0Ow0KCQkJfTsNCg0KCQkJaWYgKGZvcm1hdExpc3QgJiYgbm9kZSkgew0KCQkJCS8vIENoZWNrIGVhY2ggZm9ybWF0IGluIGxpc3QNCgkJCQlmb3IgKGkgPSAwOyBpIDwgZm9ybWF0TGlzdC5sZW5ndGg7IGkrKykgew0KCQkJCQlmb3JtYXQgPSBmb3JtYXRMaXN0W2ldOw0KDQoJCQkJCS8vIE5hbWUgbmFtZSwgYXR0cmlidXRlcywgc3R5bGVzIGFuZCBjbGFzc2VzDQoJCQkJCWlmIChtYXRjaE5hbWUobm9kZSwgZm9ybWF0KSAmJiBtYXRjaEl0ZW1zKG5vZGUsIGZvcm1hdCwgJ2F0dHJpYnV0ZXMnKSAmJiBtYXRjaEl0ZW1zKG5vZGUsIGZvcm1hdCwgJ3N0eWxlcycpKSB7DQoJCQkJCQkvLyBNYXRjaCBjbGFzc2VzDQoJCQkJCQlpZiAoY2xhc3NlcyA9IGZvcm1hdC5jbGFzc2VzKSB7DQoJCQkJCQkJZm9yIChpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQkJaWYgKCFkb20uaGFzQ2xhc3Mobm9kZSwgY2xhc3Nlc1tpXSkpDQoJCQkJCQkJCQlyZXR1cm47DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm4gZm9ybWF0Ow0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIG1hdGNoKG5hbWUsIHZhcnMsIG5vZGUpIHsNCgkJCXZhciBzdGFydE5vZGUsIGk7DQoNCgkJCWZ1bmN0aW9uIG1hdGNoUGFyZW50cyhub2RlKSB7DQoJCQkJLy8gRmluZCBmaXJzdCBub2RlIHdpdGggc2ltaWxhciBmb3JtYXQgc2V0dGluZ3MNCgkJCQlub2RlID0gZG9tLmdldFBhcmVudChub2RlLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCXJldHVybiAhIW1hdGNoTm9kZShub2RlLCBuYW1lLCB2YXJzLCB0cnVlKTsNCgkJCQl9KTsNCg0KCQkJCS8vIERvIGFuIGV4YWN0IGNoZWNrIG9uIHRoZSBzaW1pbGFyIGZvcm1hdCBlbGVtZW50DQoJCQkJcmV0dXJuIG1hdGNoTm9kZShub2RlLCBuYW1lLCB2YXJzKTsNCgkJCX07DQoNCgkJCS8vIENoZWNrIHNwZWNpZmllZCBub2RlDQoJCQlpZiAobm9kZSkNCgkJCQlyZXR1cm4gbWF0Y2hQYXJlbnRzKG5vZGUpOw0KDQoJCQkvLyBDaGVjayBwZW5kaW5nIGZvcm1hdHMNCgkJCWlmIChzZWxlY3Rpb24uaXNDb2xsYXBzZWQoKSkgew0KCQkJCWZvciAoaSA9IHBlbmRpbmdGb3JtYXRzLmFwcGx5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCWlmIChwZW5kaW5nRm9ybWF0cy5hcHBseVtpXS5uYW1lID09IG5hbWUpDQoJCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCQl9DQoNCgkJCQlmb3IgKGkgPSBwZW5kaW5nRm9ybWF0cy5yZW1vdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJaWYgKHBlbmRpbmdGb3JtYXRzLnJlbW92ZVtpXS5uYW1lID09IG5hbWUpDQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIG1hdGNoUGFyZW50cyhzZWxlY3Rpb24uZ2V0Tm9kZSgpKTsNCgkJCX0NCg0KCQkJLy8gQ2hlY2sgc2VsZWN0ZWQgbm9kZQ0KCQkJbm9kZSA9IHNlbGVjdGlvbi5nZXROb2RlKCk7DQoJCQlpZiAobWF0Y2hQYXJlbnRzKG5vZGUpKQ0KCQkJCXJldHVybiBUUlVFOw0KDQoJCQkvLyBDaGVjayBzdGFydCBub2RlIGlmIGl0J3MgZGlmZmVyZW50DQoJCQlzdGFydE5vZGUgPSBzZWxlY3Rpb24uZ2V0U3RhcnQoKTsNCgkJCWlmIChzdGFydE5vZGUgIT0gbm9kZSkgew0KCQkJCWlmIChtYXRjaFBhcmVudHMoc3RhcnROb2RlKSkNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQl9DQoNCgkJCXJldHVybiBGQUxTRTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBtYXRjaEFsbChuYW1lcywgdmFycykgew0KCQkJdmFyIHN0YXJ0RWxlbWVudCwgbWF0Y2hlZEZvcm1hdE5hbWVzID0gW10sIGNoZWNrZWRNYXAgPSB7fSwgaSwgbmksIG5hbWU7DQoNCgkJCS8vIElmIHRoZSBzZWxlY3Rpb24gaXMgY29sbGFwc2VkIHRoZW4gY2hlY2sgcGVuZGluZyBmb3JtYXRzDQoJCQlpZiAoc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkpIHsNCgkJCQlmb3IgKG5pID0gMDsgbmkgPCBuYW1lcy5sZW5ndGg7IG5pKyspIHsNCgkJCQkJLy8gSWYgdGhlIG5hbWUgaXMgdG8gYmUgcmVtb3ZlZCwgdGhlbiBzdG9wIGl0IGZyb20gYmVpbmcgYWRkZWQNCgkJCQkJZm9yIChpID0gcGVuZGluZ0Zvcm1hdHMucmVtb3ZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQluYW1lID0gbmFtZXNbbmldOw0KDQoJCQkJCQlpZiAocGVuZGluZ0Zvcm1hdHMucmVtb3ZlW2ldLm5hbWUgPT0gbmFtZSkgew0KCQkJCQkJCWNoZWNrZWRNYXBbbmFtZV0gPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gSWYgdGhlIGZvcm1hdCBpcyB0byBiZSBhcHBsaWVkDQoJCQkJZm9yIChpID0gcGVuZGluZ0Zvcm1hdHMuYXBwbHkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJZm9yIChuaSA9IDA7IG5pIDwgbmFtZXMubGVuZ3RoOyBuaSsrKSB7DQoJCQkJCQluYW1lID0gbmFtZXNbbmldOw0KDQoJCQkJCQlpZiAoIWNoZWNrZWRNYXBbbmFtZV0gJiYgcGVuZGluZ0Zvcm1hdHMuYXBwbHlbaV0ubmFtZSA9PSBuYW1lKSB7DQoJCQkJCQkJY2hlY2tlZE1hcFtuYW1lXSA9IHRydWU7DQoJCQkJCQkJbWF0Y2hlZEZvcm1hdE5hbWVzLnB1c2gobmFtZSk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCS8vIENoZWNrIHN0YXJ0IG9mIHNlbGVjdGlvbiBmb3IgZm9ybWF0cw0KCQkJc3RhcnRFbGVtZW50ID0gc2VsZWN0aW9uLmdldFN0YXJ0KCk7DQoJCQlkb20uZ2V0UGFyZW50KHN0YXJ0RWxlbWVudCwgZnVuY3Rpb24obm9kZSkgew0KCQkJCXZhciBpLCBuYW1lOw0KDQoJCQkJZm9yIChpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7DQoJCQkJCW5hbWUgPSBuYW1lc1tpXTsNCg0KCQkJCQlpZiAoIWNoZWNrZWRNYXBbbmFtZV0gJiYgbWF0Y2hOb2RlKG5vZGUsIG5hbWUsIHZhcnMpKSB7DQoJCQkJCQljaGVja2VkTWFwW25hbWVdID0gdHJ1ZTsNCgkJCQkJCW1hdGNoZWRGb3JtYXROYW1lcy5wdXNoKG5hbWUpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCXJldHVybiBtYXRjaGVkRm9ybWF0TmFtZXM7DQoJCX07DQoNCgkJZnVuY3Rpb24gY2FuQXBwbHkobmFtZSkgew0KCQkJdmFyIGZvcm1hdExpc3QgPSBnZXQobmFtZSksIHN0YXJ0Tm9kZSwgcGFyZW50cywgaSwgeCwgc2VsZWN0b3I7DQoNCgkJCWlmIChmb3JtYXRMaXN0KSB7DQoJCQkJc3RhcnROb2RlID0gc2VsZWN0aW9uLmdldFN0YXJ0KCk7DQoJCQkJcGFyZW50cyA9IGdldFBhcmVudHMoc3RhcnROb2RlKTsNCg0KCQkJCWZvciAoeCA9IGZvcm1hdExpc3QubGVuZ3RoIC0gMTsgeCA+PSAwOyB4LS0pIHsNCgkJCQkJc2VsZWN0b3IgPSBmb3JtYXRMaXN0W3hdLnNlbGVjdG9yOw0KDQoJCQkJCS8vIEZvcm1hdCBpcyBub3Qgc2VsZWN0b3IgYmFzZWQsIHRoZW4gYWx3YXlzIHJldHVybiBUUlVFDQoJCQkJCWlmICghc2VsZWN0b3IpDQoJCQkJCQlyZXR1cm4gVFJVRTsNCg0KCQkJCQlmb3IgKGkgPSBwYXJlbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCQlpZiAoZG9tLmlzKHBhcmVudHNbaV0sIHNlbGVjdG9yKSkNCgkJCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9Ow0KDQoJCS8vIEV4cG9zZSB0byBwdWJsaWMNCgkJdGlueW1jZS5leHRlbmQodGhpcywgew0KCQkJZ2V0IDogZ2V0LA0KCQkJcmVnaXN0ZXIgOiByZWdpc3RlciwNCgkJCWFwcGx5IDogYXBwbHksDQoJCQlyZW1vdmUgOiByZW1vdmUsDQoJCQl0b2dnbGUgOiB0b2dnbGUsDQoJCQltYXRjaCA6IG1hdGNoLA0KCQkJbWF0Y2hBbGwgOiBtYXRjaEFsbCwNCgkJCW1hdGNoTm9kZSA6IG1hdGNoTm9kZSwNCgkJCWNhbkFwcGx5IDogY2FuQXBwbHkNCgkJfSk7DQoNCgkJLy8gUHJpdmF0ZSBmdW5jdGlvbnMNCg0KCQlmdW5jdGlvbiBtYXRjaE5hbWUobm9kZSwgZm9ybWF0KSB7DQoJCQkvLyBDaGVjayBmb3IgaW5saW5lIG1hdGNoDQoJCQlpZiAoaXNFcShub2RlLCBmb3JtYXQuaW5saW5lKSkNCgkJCQlyZXR1cm4gVFJVRTsNCg0KCQkJLy8gQ2hlY2sgZm9yIGJsb2NrIG1hdGNoDQoJCQlpZiAoaXNFcShub2RlLCBmb3JtYXQuYmxvY2spKQ0KCQkJCXJldHVybiBUUlVFOw0KDQoJCQkvLyBDaGVjayBmb3Igc2VsZWN0b3IgbWF0Y2gNCgkJCWlmIChmb3JtYXQuc2VsZWN0b3IpDQoJCQkJcmV0dXJuIGRvbS5pcyhub2RlLCBmb3JtYXQuc2VsZWN0b3IpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGlzRXEoc3RyMSwgc3RyMikgew0KCQkJc3RyMSA9IHN0cjEgfHwgJyc7DQoJCQlzdHIyID0gc3RyMiB8fCAnJzsNCg0KCQkJc3RyMSA9ICcnICsgKHN0cjEubm9kZU5hbWUgfHwgc3RyMSk7DQoJCQlzdHIyID0gJycgKyAoc3RyMi5ub2RlTmFtZSB8fCBzdHIyKTsNCg0KCQkJcmV0dXJuIHN0cjEudG9Mb3dlckNhc2UoKSA9PSBzdHIyLnRvTG93ZXJDYXNlKCk7DQoJCX07DQoNCgkJZnVuY3Rpb24gZ2V0U3R5bGUobm9kZSwgbmFtZSkgew0KCQkJdmFyIHN0eWxlVmFsID0gZG9tLmdldFN0eWxlKG5vZGUsIG5hbWUpOw0KDQoJCQkvLyBGb3JjZSB0aGUgZm9ybWF0IHRvIGhleA0KCQkJaWYgKG5hbWUgPT0gJ2NvbG9yJyB8fCBuYW1lID09ICdiYWNrZ3JvdW5kQ29sb3InKQ0KCQkJCXN0eWxlVmFsID0gZG9tLnRvSGV4KHN0eWxlVmFsKTsNCg0KCQkJLy8gT3BlcmEgd2lsbCByZXR1cm4gYm9sZCBhcyA3MDANCgkJCWlmIChuYW1lID09ICdmb250V2VpZ2h0JyAmJiBzdHlsZVZhbCA9PSA3MDApDQoJCQkJc3R5bGVWYWwgPSAnYm9sZCc7DQoNCgkJCXJldHVybiAnJyArIHN0eWxlVmFsOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHJlcGxhY2VWYXJzKHZhbHVlLCB2YXJzKSB7DQoJCQlpZiAodHlwZW9mKHZhbHVlKSAhPSAic3RyaW5nIikNCgkJCQl2YWx1ZSA9IHZhbHVlKHZhcnMpOw0KCQkJZWxzZSBpZiAodmFycykgew0KCQkJCXZhbHVlID0gdmFsdWUucmVwbGFjZSgvJShcdyspL2csIGZ1bmN0aW9uKHN0ciwgbmFtZSkgew0KCQkJCQlyZXR1cm4gdmFyc1tuYW1lXSB8fCBzdHI7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCXJldHVybiB2YWx1ZTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBpc1doaXRlU3BhY2VOb2RlKG5vZGUpIHsNCgkJCXJldHVybiBub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IDMgJiYgL14oW1xzXHJcbl0rfCkkLy50ZXN0KG5vZGUubm9kZVZhbHVlKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiB3cmFwKG5vZGUsIG5hbWUsIGF0dHJzKSB7DQoJCQl2YXIgd3JhcHBlciA9IGRvbS5jcmVhdGUobmFtZSwgYXR0cnMpOw0KDQoJCQlub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIG5vZGUpOw0KCQkJd3JhcHBlci5hcHBlbmRDaGlsZChub2RlKTsNCg0KCQkJcmV0dXJuIHdyYXBwZXI7DQoJCX07DQoNCgkJZnVuY3Rpb24gZXhwYW5kUm5nKHJuZywgZm9ybWF0LCByZW1vdmUpIHsNCgkJCXZhciBzdGFydENvbnRhaW5lciA9IHJuZy5zdGFydENvbnRhaW5lciwNCgkJCQlzdGFydE9mZnNldCA9IHJuZy5zdGFydE9mZnNldCwNCgkJCQllbmRDb250YWluZXIgPSBybmcuZW5kQ29udGFpbmVyLA0KCQkJCWVuZE9mZnNldCA9IHJuZy5lbmRPZmZzZXQsIHNpYmxpbmcsIGxhc3RJZHg7DQoNCgkJCS8vIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdXAgdGhlIHRyZWUgaWYgdGhlcmUgaXMgbm8gc2libGluZ3MgYmVmb3JlL2FmdGVyIHRoZSBub2RlDQoJCQlmdW5jdGlvbiBmaW5kUGFyZW50Q29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGRfbmFtZSwgc2libGluZ19uYW1lLCByb290KSB7DQoJCQkJdmFyIHBhcmVudCwgY2hpbGQ7DQoNCgkJCQlyb290ID0gcm9vdCB8fCBkb20uZ2V0Um9vdCgpOw0KDQoJCQkJZm9yICg7Oykgew0KCQkJCQkvLyBDaGVjayBpZiB3ZSBjYW4gbW92ZSB1cCBhcmUgd2UgYXQgcm9vdCBsZXZlbCBvciBib2R5IGxldmVsDQoJCQkJCXBhcmVudCA9IGNvbnRhaW5lci5wYXJlbnROb2RlOw0KDQoJCQkJCS8vIFN0b3AgZXhwYW5kaW5nIG9uIGJsb2NrIGVsZW1lbnRzIG9yIHJvb3QgZGVwZW5kaW5nIG9uIGZvcm1hdA0KCQkJCQlpZiAocGFyZW50ID09IHJvb3QgfHwgKCFmb3JtYXRbMF0uYmxvY2tfZXhwYW5kICYmIGlzQmxvY2socGFyZW50KSkpDQoJCQkJCQlyZXR1cm4gY29udGFpbmVyOw0KDQoJCQkJCWZvciAoc2libGluZyA9IHBhcmVudFtjaGlsZF9uYW1lXTsgc2libGluZyAmJiBzaWJsaW5nICE9IGNvbnRhaW5lcjsgc2libGluZyA9IHNpYmxpbmdbc2libGluZ19uYW1lXSkgew0KCQkJCQkJaWYgKHNpYmxpbmcubm9kZVR5cGUgPT0gMSAmJiAhaXNCb29rbWFya05vZGUoc2libGluZykpDQoJCQkJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCg0KCQkJCQkJaWYgKHNpYmxpbmcubm9kZVR5cGUgPT0gMyAmJiAhaXNXaGl0ZVNwYWNlTm9kZShzaWJsaW5nKSkNCgkJCQkJCQlyZXR1cm4gY29udGFpbmVyOw0KCQkJCQl9DQoNCgkJCQkJY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIGNvbnRhaW5lcjsNCgkJCX07DQoNCgkJCS8vIElmIGluZGV4IGJhc2VkIHN0YXJ0IHBvc2l0aW9uIHRoZW4gcmVzb2x2ZSBpdA0KCQkJaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDEgJiYgc3RhcnRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKSB7DQoJCQkJbGFzdElkeCA9IHN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsNCgkJCQlzdGFydENvbnRhaW5lciA9IHN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbc3RhcnRPZmZzZXQgPiBsYXN0SWR4ID8gbGFzdElkeCA6IHN0YXJ0T2Zmc2V0XTsNCg0KCQkJCWlmIChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PSAzKQ0KCQkJCQlzdGFydE9mZnNldCA9IDA7DQoJCQl9DQoNCgkJCS8vIElmIGluZGV4IGJhc2VkIGVuZCBwb3NpdGlvbiB0aGVuIHJlc29sdmUgaXQNCgkJCWlmIChlbmRDb250YWluZXIubm9kZVR5cGUgPT0gMSAmJiBlbmRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKSB7DQoJCQkJbGFzdElkeCA9IGVuZENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCAtIDE7DQoJCQkJZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyLmNoaWxkTm9kZXNbZW5kT2Zmc2V0ID4gbGFzdElkeCA/IGxhc3RJZHggOiBlbmRPZmZzZXQgLSAxXTsNCg0KCQkJCWlmIChlbmRDb250YWluZXIubm9kZVR5cGUgPT0gMykNCgkJCQkJZW5kT2Zmc2V0ID0gZW5kQ29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGg7DQoJCQl9DQoNCgkJCS8vIEV4Y2x1ZGUgYm9va21hcmsgbm9kZXMgaWYgcG9zc2libGUNCgkJCWlmIChpc0Jvb2ttYXJrTm9kZShzdGFydENvbnRhaW5lci5wYXJlbnROb2RlKSkNCgkJCQlzdGFydENvbnRhaW5lciA9IHN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGU7DQoNCgkJCWlmIChpc0Jvb2ttYXJrTm9kZShzdGFydENvbnRhaW5lcikpDQoJCQkJc3RhcnRDb250YWluZXIgPSBzdGFydENvbnRhaW5lci5uZXh0U2libGluZyB8fCBzdGFydENvbnRhaW5lcjsNCg0KCQkJaWYgKGlzQm9va21hcmtOb2RlKGVuZENvbnRhaW5lci5wYXJlbnROb2RlKSkNCgkJCQllbmRDb250YWluZXIgPSBlbmRDb250YWluZXIucGFyZW50Tm9kZTsNCg0KCQkJaWYgKGlzQm9va21hcmtOb2RlKGVuZENvbnRhaW5lcikpDQoJCQkJZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyLnByZXZpb3VzU2libGluZyB8fCBlbmRDb250YWluZXI7DQoNCgkJCS8vIE1vdmUgc3RhcnQvZW5kIHBvaW50IHVwIHRoZSB0cmVlIGlmIHRoZSBsZWF2ZXMgYXJlIHNoYXJwIGFuZCBpZiB3ZSBhcmUgaW4gZGlmZmVyZW50IGNvbnRhaW5lcnMNCgkJCS8vIEV4YW1wbGUgKiBiZWNvbWVzICE6ICE8cD48Yj48aT4qdGV4dDwvaT48aT50ZXh0KjwvaT48L2I+PC9wPiENCgkJCS8vIFRoaXMgd2lsbCByZWR1Y2UgdGhlIG51bWJlciBvZiB3cmFwcGVyIGVsZW1lbnRzIHRoYXQgbmVlZHMgdG8gYmUgY3JlYXRlZA0KCQkJLy8gTW92ZSBzdGFydCBwb2ludCB1cCB0aGUgdHJlZQ0KCQkJaWYgKGZvcm1hdFswXS5pbmxpbmUgfHwgZm9ybWF0WzBdLmJsb2NrX2V4cGFuZCkgew0KCQkJCXN0YXJ0Q29udGFpbmVyID0gZmluZFBhcmVudENvbnRhaW5lcihzdGFydENvbnRhaW5lciwgJ2ZpcnN0Q2hpbGQnLCAnbmV4dFNpYmxpbmcnKTsNCgkJCQllbmRDb250YWluZXIgPSBmaW5kUGFyZW50Q29udGFpbmVyKGVuZENvbnRhaW5lciwgJ2xhc3RDaGlsZCcsICdwcmV2aW91c1NpYmxpbmcnKTsNCgkJCX0NCg0KCQkJLy8gRXhwYW5kIHN0YXJ0L2VuZCBjb250YWluZXIgdG8gbWF0Y2hpbmcgc2VsZWN0b3INCgkJCWlmIChmb3JtYXRbMF0uc2VsZWN0b3IgJiYgZm9ybWF0WzBdLmV4cGFuZCAhPT0gRkFMU0UgJiYgIWZvcm1hdFswXS5pbmxpbmUpIHsNCgkJCQlmdW5jdGlvbiBmaW5kU2VsZWN0b3JFbmRQb2ludChjb250YWluZXIsIHNpYmxpbmdfbmFtZSkgew0KCQkJCQl2YXIgcGFyZW50cywgaSwgeTsNCg0KCQkJCQlpZiAoY29udGFpbmVyLm5vZGVUeXBlID09IDMgJiYgY29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGggPT0gMCAmJiBjb250YWluZXJbc2libGluZ19uYW1lXSkNCgkJCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lcltzaWJsaW5nX25hbWVdOw0KDQoJCQkJCXBhcmVudHMgPSBnZXRQYXJlbnRzKGNvbnRhaW5lcik7DQoJCQkJCWZvciAoaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7DQoJCQkJCQlmb3IgKHkgPSAwOyB5IDwgZm9ybWF0Lmxlbmd0aDsgeSsrKSB7DQoJCQkJCQkJaWYgKGRvbS5pcyhwYXJlbnRzW2ldLCBmb3JtYXRbeV0uc2VsZWN0b3IpKQ0KCQkJCQkJCQlyZXR1cm4gcGFyZW50c1tpXTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCXJldHVybiBjb250YWluZXI7DQoJCQkJfTsNCg0KCQkJCS8vIEZpbmQgbmV3IHN0YXJ0Q29udGFpbmVyL2VuZENvbnRhaW5lciBpZiB0aGVyZSBpcyBiZXR0ZXIgb25lDQoJCQkJc3RhcnRDb250YWluZXIgPSBmaW5kU2VsZWN0b3JFbmRQb2ludChzdGFydENvbnRhaW5lciwgJ3ByZXZpb3VzU2libGluZycpOw0KCQkJCWVuZENvbnRhaW5lciA9IGZpbmRTZWxlY3RvckVuZFBvaW50KGVuZENvbnRhaW5lciwgJ25leHRTaWJsaW5nJyk7DQoJCQl9DQoNCgkJCS8vIEV4cGFuZCBzdGFydC9lbmQgY29udGFpbmVyIHRvIG1hdGNoaW5nIGJsb2NrIGVsZW1lbnQgb3IgdGV4dCBub2RlDQoJCQlpZiAoZm9ybWF0WzBdLmJsb2NrIHx8IGZvcm1hdFswXS5zZWxlY3Rvcikgew0KCQkJCWZ1bmN0aW9uIGZpbmRCbG9ja0VuZFBvaW50KGNvbnRhaW5lciwgc2libGluZ19uYW1lLCBzaWJsaW5nX25hbWUyKSB7DQoJCQkJCXZhciBub2RlOw0KDQoJCQkJCS8vIEV4cGFuZCB0byBibG9jayBvZiBzaW1pbGFyIHR5cGUNCgkJCQkJaWYgKCFmb3JtYXRbMF0ud3JhcHBlcikNCgkJCQkJCW5vZGUgPSBkb20uZ2V0UGFyZW50KGNvbnRhaW5lciwgZm9ybWF0WzBdLmJsb2NrKTsNCg0KCQkJCQkvLyBFeHBhbmQgdG8gZmlyc3Qgd3JhcHBhYmxlIGJsb2NrIGVsZW1lbnQgb3IgYW55IGJsb2NrIGVsZW1lbnQNCgkJCQkJaWYgKCFub2RlKQ0KCQkJCQkJbm9kZSA9IGRvbS5nZXRQYXJlbnQoY29udGFpbmVyLm5vZGVUeXBlID09IDMgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lciwgaXNCbG9jayk7DQoNCgkJCQkJLy8gRXhjbHVkZSBpbm5lciBsaXN0cyBmcm9tIHdyYXBwaW5nDQoJCQkJCWlmIChub2RlICYmIGZvcm1hdFswXS53cmFwcGVyKQ0KCQkJCQkJbm9kZSA9IGdldFBhcmVudHMobm9kZSwgJ3VsLG9sJykucmV2ZXJzZSgpWzBdIHx8IG5vZGU7DQoNCgkJCQkJLy8gRGlkbid0IGZpbmQgYSBibG9jayBlbGVtZW50IGxvb2sgZm9yIGZpcnN0L2xhc3Qgd3JhcHBhYmxlIGVsZW1lbnQNCgkJCQkJaWYgKCFub2RlKSB7DQoJCQkJCQlub2RlID0gY29udGFpbmVyOw0KDQoJCQkJCQl3aGlsZSAobm9kZVtzaWJsaW5nX25hbWVdICYmICFpc0Jsb2NrKG5vZGVbc2libGluZ19uYW1lXSkpIHsNCgkJCQkJCQlub2RlID0gbm9kZVtzaWJsaW5nX25hbWVdOw0KDQoJCQkJCQkJLy8gQnJlYWsgb24gQlIgYnV0IGluY2x1ZGUgaXQgd2lsbCBiZSByZW1vdmVkIGxhdGVyIG9uDQoJCQkJCQkJLy8gd2UgY2FuJ3QgcmVtb3ZlIGl0IG5vdyBzaW5jZSB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0IGNhbiBiZSB3cmFwcGVkDQoJCQkJCQkJaWYgKGlzRXEobm9kZSwgJ2JyJykpDQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJcmV0dXJuIG5vZGUgfHwgY29udGFpbmVyOw0KCQkJCX07DQoNCgkJCQkvLyBGaW5kIG5ldyBzdGFydENvbnRhaW5lci9lbmRDb250YWluZXIgaWYgdGhlcmUgaXMgYmV0dGVyIG9uZQ0KCQkJCXN0YXJ0Q29udGFpbmVyID0gZmluZEJsb2NrRW5kUG9pbnQoc3RhcnRDb250YWluZXIsICdwcmV2aW91c1NpYmxpbmcnKTsNCgkJCQllbmRDb250YWluZXIgPSBmaW5kQmxvY2tFbmRQb2ludChlbmRDb250YWluZXIsICduZXh0U2libGluZycpOw0KDQoJCQkJLy8gTm9uIGJsb2NrIGVsZW1lbnQgdGhlbiB0cnkgdG8gZXhwYW5kIHVwIHRoZSBsZWFmDQoJCQkJaWYgKGZvcm1hdFswXS5ibG9jaykgew0KCQkJCQlpZiAoIWlzQmxvY2soc3RhcnRDb250YWluZXIpKQ0KCQkJCQkJc3RhcnRDb250YWluZXIgPSBmaW5kUGFyZW50Q29udGFpbmVyKHN0YXJ0Q29udGFpbmVyLCAnZmlyc3RDaGlsZCcsICduZXh0U2libGluZycpOw0KDQoJCQkJCWlmICghaXNCbG9jayhlbmRDb250YWluZXIpKQ0KCQkJCQkJZW5kQ29udGFpbmVyID0gZmluZFBhcmVudENvbnRhaW5lcihlbmRDb250YWluZXIsICdsYXN0Q2hpbGQnLCAncHJldmlvdXNTaWJsaW5nJyk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBTZXR1cCBpbmRleCBmb3Igc3RhcnRDb250YWluZXINCgkJCWlmIChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJc3RhcnRPZmZzZXQgPSBub2RlSW5kZXgoc3RhcnRDb250YWluZXIpOw0KCQkJCXN0YXJ0Q29udGFpbmVyID0gc3RhcnRDb250YWluZXIucGFyZW50Tm9kZTsNCgkJCX0NCg0KCQkJLy8gU2V0dXAgaW5kZXggZm9yIGVuZENvbnRhaW5lcg0KCQkJaWYgKGVuZENvbnRhaW5lci5ub2RlVHlwZSA9PSAxKSB7DQoJCQkJZW5kT2Zmc2V0ID0gbm9kZUluZGV4KGVuZENvbnRhaW5lcikgKyAxOw0KCQkJCWVuZENvbnRhaW5lciA9IGVuZENvbnRhaW5lci5wYXJlbnROb2RlOw0KCQkJfQ0KDQoJCQkvLyBSZXR1cm4gbmV3IHJhbmdlIGxpa2Ugb2JqZWN0DQoJCQlyZXR1cm4gew0KCQkJCXN0YXJ0Q29udGFpbmVyIDogc3RhcnRDb250YWluZXIsDQoJCQkJc3RhcnRPZmZzZXQgOiBzdGFydE9mZnNldCwNCgkJCQllbmRDb250YWluZXIgOiBlbmRDb250YWluZXIsDQoJCQkJZW5kT2Zmc2V0IDogZW5kT2Zmc2V0DQoJCQl9Ow0KCQl9DQoNCgkJZnVuY3Rpb24gcmVtb3ZlRm9ybWF0KGZvcm1hdCwgdmFycywgbm9kZSwgY29tcGFyZV9ub2RlKSB7DQoJCQl2YXIgaSwgYXR0cnMsIHN0eWxlc01vZGlmaWVkOw0KDQoJCQkvLyBDaGVjayBpZiBub2RlIG1hdGNoZXMgZm9ybWF0DQoJCQlpZiAoIW1hdGNoTmFtZShub2RlLCBmb3JtYXQpKQ0KCQkJCXJldHVybiBGQUxTRTsNCg0KCQkJLy8gU2hvdWxkIHdlIGNvbXBhcmUgd2l0aCBmb3JtYXQgYXR0cmlicyBhbmQgc3R5bGVzDQoJCQlpZiAoZm9ybWF0LnJlbW92ZSAhPSAnYWxsJykgew0KCQkJCS8vIFJlbW92ZSBzdHlsZXMNCgkJCQllYWNoKGZvcm1hdC5zdHlsZXMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7DQoJCQkJCXZhbHVlID0gcmVwbGFjZVZhcnModmFsdWUsIHZhcnMpOw0KDQoJCQkJCS8vIEluZGV4ZWQgYXJyYXkNCgkJCQkJaWYgKHR5cGVvZihuYW1lKSA9PT0gJ251bWJlcicpIHsNCgkJCQkJCW5hbWUgPSB2YWx1ZTsNCgkJCQkJCWNvbXBhcmVfbm9kZSA9IDA7DQoJCQkJCX0NCg0KCQkJCQlpZiAoIWNvbXBhcmVfbm9kZSB8fCBpc0VxKGdldFN0eWxlKGNvbXBhcmVfbm9kZSwgbmFtZSksIHZhbHVlKSkNCgkJCQkJCWRvbS5zZXRTdHlsZShub2RlLCBuYW1lLCAnJyk7DQoNCgkJCQkJc3R5bGVzTW9kaWZpZWQgPSAxOw0KCQkJCX0pOw0KDQoJCQkJLy8gUmVtb3ZlIHN0eWxlIGF0dHJpYnV0ZSBpZiBpdCdzIGVtcHR5DQoJCQkJaWYgKHN0eWxlc01vZGlmaWVkICYmIGRvbS5nZXRBdHRyaWIobm9kZSwgJ3N0eWxlJykgPT0gJycpIHsNCgkJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7DQoJCQkJCW5vZGUucmVtb3ZlQXR0cmlidXRlKCdfbWNlX3N0eWxlJyk7DQoJCQkJfQ0KDQoJCQkJLy8gUmVtb3ZlIGF0dHJpYnV0ZXMNCgkJCQllYWNoKGZvcm1hdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkgew0KCQkJCQl2YXIgdmFsdWVPdXQ7DQoNCgkJCQkJdmFsdWUgPSByZXBsYWNlVmFycyh2YWx1ZSwgdmFycyk7DQoNCgkJCQkJLy8gSW5kZXhlZCBhcnJheQ0KCQkJCQlpZiAodHlwZW9mKG5hbWUpID09PSAnbnVtYmVyJykgew0KCQkJCQkJbmFtZSA9IHZhbHVlOw0KCQkJCQkJY29tcGFyZV9ub2RlID0gMDsNCgkJCQkJfQ0KDQoJCQkJCWlmICghY29tcGFyZV9ub2RlIHx8IGlzRXEoZG9tLmdldEF0dHJpYihjb21wYXJlX25vZGUsIG5hbWUpLCB2YWx1ZSkpIHsNCgkJCQkJCS8vIEtlZXAgaW50ZXJuYWwgY2xhc3Nlcw0KCQkJCQkJaWYgKG5hbWUgPT0gJ2NsYXNzJykgew0KCQkJCQkJCXZhbHVlID0gZG9tLmdldEF0dHJpYihub2RlLCBuYW1lKTsNCgkJCQkJCQlpZiAodmFsdWUpIHsNCgkJCQkJCQkJLy8gQnVpbGQgbmV3IGNsYXNzIHZhbHVlIHdoZXJlIGV2ZXJ5dGhpbmcgaXMgcmVtb3ZlZCBleGNlcHQgdGhlIGludGVybmFsIHByZWZpeGVkIGNsYXNzZXMNCgkJCQkJCQkJdmFsdWVPdXQgPSAnJzsNCgkJCQkJCQkJZWFjaCh2YWx1ZS5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGNscykgew0KCQkJCQkJCQkJaWYgKC9tY2VcdysvLnRlc3QoY2xzKSkNCgkJCQkJCQkJCQl2YWx1ZU91dCArPSAodmFsdWVPdXQgPyAnICcgOiAnJykgKyBjbHM7DQoJCQkJCQkJCX0pOw0KDQoJCQkJCQkJCS8vIFdlIGdvdCBzb21lIGludGVybmFsIGNsYXNzZXMgbGVmdA0KCQkJCQkJCQlpZiAodmFsdWVPdXQpIHsNCgkJCQkJCQkJCWRvbS5zZXRBdHRyaWIobm9kZSwgbmFtZSwgdmFsdWVPdXQpOw0KCQkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBJRTYgaGFzIGEgYnVnIHdoZXJlIHRoZSBhdHRyaWJ1dGUgZG9lc24ndCBnZXQgcmVtb3ZlZCBjb3JyZWN0bHkNCgkJCQkJCWlmIChuYW1lID09ICJjbGFzcyIpDQoJCQkJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzTmFtZScpOw0KDQoJCQkJCQkvLyBSZW1vdmUgbWNlIHByZWZpeGVkIGF0dHJpYnV0ZXMNCgkJCQkJCWlmIChNQ0VfQVRUUl9SRS50ZXN0KG5hbWUpKQ0KCQkJCQkJCW5vZGUucmVtb3ZlQXR0cmlidXRlKCdfbWNlXycgKyBuYW1lKTsNCg0KCQkJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7DQoJCQkJCX0NCgkJCQl9KTsNCg0KCQkJCS8vIFJlbW92ZSBjbGFzc2VzDQoJCQkJZWFjaChmb3JtYXQuY2xhc3NlcywgZnVuY3Rpb24odmFsdWUpIHsNCgkJCQkJdmFsdWUgPSByZXBsYWNlVmFycyh2YWx1ZSwgdmFycyk7DQoNCgkJCQkJaWYgKCFjb21wYXJlX25vZGUgfHwgZG9tLmhhc0NsYXNzKGNvbXBhcmVfbm9kZSwgdmFsdWUpKQ0KCQkJCQkJZG9tLnJlbW92ZUNsYXNzKG5vZGUsIHZhbHVlKTsNCgkJCQl9KTsNCg0KCQkJCS8vIENoZWNrIGZvciBub24gaW50ZXJuYWwgYXR0cmlidXRlcw0KCQkJCWF0dHJzID0gZG9tLmdldEF0dHJpYnMobm9kZSk7DQoJCQkJZm9yIChpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7DQoJCQkJCWlmIChhdHRyc1tpXS5ub2RlTmFtZS5pbmRleE9mKCdfJykgIT09IDApDQoJCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBSZW1vdmUgdGhlIGlubGluZSBjaGlsZCBpZiBpdCdzIGVtcHR5IGZvciBleGFtcGxlIDxiPiBvciA8c3Bhbj4NCgkJCWlmIChmb3JtYXQucmVtb3ZlICE9ICdub25lJykgew0KCQkJCXJlbW92ZU5vZGUobm9kZSwgZm9ybWF0KTsNCgkJCQlyZXR1cm4gVFJVRTsNCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUsIGZvcm1hdCkgew0KCQkJdmFyIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGUsIHJvb3RCbG9ja0VsbTsNCg0KCQkJaWYgKGZvcm1hdC5ibG9jaykgew0KCQkJCWlmICghZm9yY2VkUm9vdEJsb2NrKSB7DQoJCQkJCWZ1bmN0aW9uIGZpbmQobm9kZSwgbmV4dCwgaW5jKSB7DQoJCQkJCQlub2RlID0gZ2V0Tm9uV2hpdGVTcGFjZVNpYmxpbmcobm9kZSwgbmV4dCwgaW5jKTsNCg0KCQkJCQkJcmV0dXJuICFub2RlIHx8IChub2RlLm5vZGVOYW1lID09ICdCUicgfHwgaXNCbG9jayhub2RlKSk7DQoJCQkJCX07DQoNCgkJCQkJLy8gQXBwZW5kIEJSIGVsZW1lbnRzIGlmIG5lZWRlZCBiZWZvcmUgd2UgcmVtb3ZlIHRoZSBibG9jaw0KCQkJCQlpZiAoaXNCbG9jayhub2RlKSAmJiAhaXNCbG9jayhwYXJlbnROb2RlKSkgew0KCQkJCQkJaWYgKCFmaW5kKG5vZGUsIEZBTFNFKSAmJiAhZmluZChub2RlLmZpcnN0Q2hpbGQsIFRSVUUsIDEpKQ0KCQkJCQkJCW5vZGUuaW5zZXJ0QmVmb3JlKGRvbS5jcmVhdGUoJ2JyJyksIG5vZGUuZmlyc3RDaGlsZCk7DQoNCgkJCQkJCWlmICghZmluZChub2RlLCBUUlVFKSAmJiAhZmluZChub2RlLmxhc3RDaGlsZCwgRkFMU0UsIDEpKQ0KCQkJCQkJCW5vZGUuYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZSgnYnInKSk7DQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBXcmFwIHRoZSBibG9jayBpbiBhIGZvcmNlZFJvb3RCbG9jayBpZiB3ZSBhcmUgYXQgdGhlIHJvb3Qgb2YgZG9jdW1lbnQNCgkJCQkJaWYgKHBhcmVudE5vZGUgPT0gZG9tLmdldFJvb3QoKSkgew0KCQkJCQkJaWYgKCFmb3JtYXQubGlzdF9ibG9jayB8fCAhaXNFcShub2RlLCBmb3JtYXQubGlzdF9ibG9jaykpIHsNCgkJCQkJCQllYWNoKHRpbnltY2UuZ3JlcChub2RlLmNoaWxkTm9kZXMpLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCQkJCWlmIChpc1ZhbGlkKGZvcmNlZFJvb3RCbG9jaywgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkgew0KCQkJCQkJCQkJaWYgKCFyb290QmxvY2tFbG0pDQoJCQkJCQkJCQkJcm9vdEJsb2NrRWxtID0gd3JhcChub2RlLCBmb3JjZWRSb290QmxvY2spOw0KCQkJCQkJCQkJZWxzZQ0KCQkJCQkJCQkJCXJvb3RCbG9ja0VsbS5hcHBlbmRDaGlsZChub2RlKTsNCgkJCQkJCQkJfSBlbHNlDQoJCQkJCQkJCQlyb290QmxvY2tFbG0gPSAwOw0KCQkJCQkJCX0pOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBOZXZlciByZW1vdmUgbm9kZXMgdGhhdCBpc24ndCB0aGUgc3BlY2lmaWVkIGlubGluZSBlbGVtZW50IGlmIGEgc2VsZWN0b3IgaXMgc3BlY2lmaWVkIHRvbw0KCQkJaWYgKGZvcm1hdC5zZWxlY3RvciAmJiBmb3JtYXQuaW5saW5lICYmICFpc0VxKGZvcm1hdC5pbmxpbmUsIG5vZGUpKQ0KCQkJCXJldHVybjsNCg0KCQkJZG9tLnJlbW92ZShub2RlLCAxKTsNCgkJfTsNCg0KCQlmdW5jdGlvbiBnZXROb25XaGl0ZVNwYWNlU2libGluZyhub2RlLCBuZXh0LCBpbmMpIHsNCgkJCWlmIChub2RlKSB7DQoJCQkJbmV4dCA9IG5leHQgPyAnbmV4dFNpYmxpbmcnIDogJ3ByZXZpb3VzU2libGluZyc7DQoNCgkJCQlmb3IgKG5vZGUgPSBpbmMgPyBub2RlIDogbm9kZVtuZXh0XTsgbm9kZTsgbm9kZSA9IG5vZGVbbmV4dF0pIHsNCgkJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gMSB8fCAhaXNXaGl0ZVNwYWNlTm9kZShub2RlKSkNCgkJCQkJCXJldHVybiBub2RlOw0KCQkJCX0NCgkJCX0NCgkJfTsNCg0KCQlmdW5jdGlvbiBpc0Jvb2ttYXJrTm9kZShub2RlKSB7DQoJCQlyZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoJ19tY2VfdHlwZScpID09ICdib29rbWFyayc7DQoJCX07DQoNCgkJZnVuY3Rpb24gbWVyZ2VTaWJsaW5ncyhwcmV2LCBuZXh0KSB7DQoJCQl2YXIgbWFya2VyLCBzaWJsaW5nLCB0bXBTaWJsaW5nOw0KDQoJCQlmdW5jdGlvbiBjb21wYXJlRWxlbWVudHMobm9kZTEsIG5vZGUyKSB7DQoJCQkJLy8gTm90IHRoZSBzYW1lIG5hbWUNCgkJCQlpZiAobm9kZTEubm9kZU5hbWUgIT0gbm9kZTIubm9kZU5hbWUpDQoJCQkJCXJldHVybiBGQUxTRTsNCg0KCQkJCWZ1bmN0aW9uIGdldEF0dHJpYnMobm9kZSkgew0KCQkJCQl2YXIgYXR0cmlicyA9IHt9Ow0KDQoJCQkJCWVhY2goZG9tLmdldEF0dHJpYnMobm9kZSksIGZ1bmN0aW9uKGF0dHIpIHsNCgkJCQkJCXZhciBuYW1lID0gYXR0ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KDQoJCQkJCQkvLyBEb24ndCBjb21wYXJlIGludGVybmFsIGF0dHJpYnV0ZXMgb3Igc3R5bGUNCgkJCQkJCWlmIChuYW1lLmluZGV4T2YoJ18nKSAhPT0gMCAmJiBuYW1lICE9PSAnc3R5bGUnKQ0KCQkJCQkJCWF0dHJpYnNbbmFtZV0gPSBkb20uZ2V0QXR0cmliKG5vZGUsIG5hbWUpOw0KCQkJCQl9KTsNCg0KCQkJCQlyZXR1cm4gYXR0cmliczsNCgkJCQl9Ow0KDQoJCQkJZnVuY3Rpb24gY29tcGFyZU9iamVjdHMob2JqMSwgb2JqMikgew0KCQkJCQl2YXIgdmFsdWUsIG5hbWU7DQoNCgkJCQkJZm9yIChuYW1lIGluIG9iajEpIHsNCgkJCQkJCS8vIE9iajEgaGFzIGl0ZW0gb2JqMiBkb2Vzbid0IGhhdmUNCgkJCQkJCWlmIChvYmoxLmhhc093blByb3BlcnR5KG5hbWUpKSB7DQoJCQkJCQkJdmFsdWUgPSBvYmoyW25hbWVdOw0KDQoJCQkJCQkJLy8gT2JqMiBkb2Vzbid0IGhhdmUgb2JqMSBpdGVtDQoJCQkJCQkJaWYgKHZhbHVlID09PSB1bmRlZmluZWQpDQoJCQkJCQkJCXJldHVybiBGQUxTRTsNCg0KCQkJCQkJCS8vIE9iajIgaXRlbSBoYXMgYSBkaWZmZXJlbnQgdmFsdWUNCgkJCQkJCQlpZiAob2JqMVtuYW1lXSAhPSB2YWx1ZSkNCgkJCQkJCQkJcmV0dXJuIEZBTFNFOw0KDQoJCQkJCQkJLy8gRGVsZXRlIHNpbWlsYXIgdmFsdWUNCgkJCQkJCQlkZWxldGUgb2JqMltuYW1lXTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIENoZWNrIGlmIG9iaiAyIGhhcyBzb21ldGhpbmcgb2JqIDEgZG9lc24ndCBoYXZlDQoJCQkJCWZvciAobmFtZSBpbiBvYmoyKSB7DQoJCQkJCQkvLyBPYmoyIGhhcyBpdGVtIG9iajEgZG9lc24ndCBoYXZlDQoJCQkJCQlpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkNCgkJCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJCX0NCg0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9Ow0KDQoJCQkJLy8gQXR0cmlicyBhcmUgbm90IHRoZSBzYW1lDQoJCQkJaWYgKCFjb21wYXJlT2JqZWN0cyhnZXRBdHRyaWJzKG5vZGUxKSwgZ2V0QXR0cmlicyhub2RlMikpKQ0KCQkJCQlyZXR1cm4gRkFMU0U7DQoNCgkJCQkvLyBTdHlsZXMgYXJlIG5vdCB0aGUgc2FtZQ0KCQkJCWlmICghY29tcGFyZU9iamVjdHMoZG9tLnBhcnNlU3R5bGUoZG9tLmdldEF0dHJpYihub2RlMSwgJ3N0eWxlJykpLCBkb20ucGFyc2VTdHlsZShkb20uZ2V0QXR0cmliKG5vZGUyLCAnc3R5bGUnKSkpKQ0KCQkJCQlyZXR1cm4gRkFMU0U7DQoNCgkJCQlyZXR1cm4gVFJVRTsNCgkJCX07DQoNCgkJCS8vIENoZWNrIGlmIG5leHQvcHJldiBleGlzdHMgYW5kIHRoYXQgdGhleSBhcmUgZWxlbWVudHMNCgkJCWlmIChwcmV2ICYmIG5leHQpIHsNCgkJCQlmdW5jdGlvbiBmaW5kRWxlbWVudFNpYmxpbmcobm9kZSwgc2libGluZ19uYW1lKSB7DQoJCQkJCWZvciAoc2libGluZyA9IG5vZGU7IHNpYmxpbmc7IHNpYmxpbmcgPSBzaWJsaW5nW3NpYmxpbmdfbmFtZV0pIHsNCgkJCQkJCWlmIChzaWJsaW5nLm5vZGVUeXBlID09IDMgJiYgIWlzV2hpdGVTcGFjZU5vZGUoc2libGluZykpDQoJCQkJCQkJcmV0dXJuIG5vZGU7DQoNCgkJCQkJCWlmIChzaWJsaW5nLm5vZGVUeXBlID09IDEgJiYgIWlzQm9va21hcmtOb2RlKHNpYmxpbmcpKQ0KCQkJCQkJCXJldHVybiBzaWJsaW5nOw0KCQkJCQl9DQoNCgkJCQkJcmV0dXJuIG5vZGU7DQoJCQkJfTsNCg0KCQkJCS8vIElmIHByZXZpb3VzIHNpYmxpbmcgaXMgZW1wdHkgdGhlbiBqdW1wIG92ZXIgaXQNCgkJCQlwcmV2ID0gZmluZEVsZW1lbnRTaWJsaW5nKHByZXYsICdwcmV2aW91c1NpYmxpbmcnKTsNCgkJCQluZXh0ID0gZmluZEVsZW1lbnRTaWJsaW5nKG5leHQsICduZXh0U2libGluZycpOw0KDQoJCQkJLy8gQ29tcGFyZSBuZXh0IGFuZCBwcmV2aW91cyBub2Rlcw0KCQkJCWlmIChjb21wYXJlRWxlbWVudHMocHJldiwgbmV4dCkpIHsNCgkJCQkJLy8gQXBwZW5kIG5vZGVzIGJldHdlZW4NCgkJCQkJZm9yIChzaWJsaW5nID0gcHJldi5uZXh0U2libGluZzsgc2libGluZyAmJiBzaWJsaW5nICE9IG5leHQ7KSB7DQoJCQkJCQl0bXBTaWJsaW5nID0gc2libGluZzsNCgkJCQkJCXNpYmxpbmcgPSBzaWJsaW5nLm5leHRTaWJsaW5nOw0KCQkJCQkJcHJldi5hcHBlbmRDaGlsZCh0bXBTaWJsaW5nKTsNCgkJCQkJfQ0KDQoJCQkJCS8vIFJlbW92ZSBuZXh0IG5vZGUNCgkJCQkJZG9tLnJlbW92ZShuZXh0KTsNCg0KCQkJCQkvLyBNb3ZlIGNoaWxkcmVuIGludG8gcHJldiBub2RlDQoJCQkJCWVhY2godGlueW1jZS5ncmVwKG5leHQuY2hpbGROb2RlcyksIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJCXByZXYuYXBwZW5kQ2hpbGQobm9kZSk7DQoJCQkJCX0pOw0KDQoJCQkJCXJldHVybiBwcmV2Ow0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIG5leHQ7DQoJCX07DQoNCgkJZnVuY3Rpb24gaXNUZXh0QmxvY2sobmFtZSkgew0KCQkJcmV0dXJuIC9eKGhbMS02XXxwfGRpdnxwcmV8YWRkcmVzc3xkbHxkdHxkZCkkLy50ZXN0KG5hbWUpOw0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGdldENvbnRhaW5lcihybmcsIHN0YXJ0KSB7DQoJCQl2YXIgY29udGFpbmVyLCBvZmZzZXQsIGxhc3RJZHg7DQoNCgkJCWNvbnRhaW5lciA9IHJuZ1tzdGFydCA/ICdzdGFydENvbnRhaW5lcicgOiAnZW5kQ29udGFpbmVyJ107DQoJCQlvZmZzZXQgPSBybmdbc3RhcnQgPyAnc3RhcnRPZmZzZXQnIDogJ2VuZE9mZnNldCddOw0KDQoJCQlpZiAoY29udGFpbmVyLm5vZGVUeXBlID09IDEpIHsNCgkJCQlsYXN0SWR4ID0gY29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsNCg0KCQkJCWlmICghc3RhcnQgJiYgb2Zmc2V0KQ0KCQkJCQlvZmZzZXQtLTsNCg0KCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5jaGlsZE5vZGVzW29mZnNldCA+IGxhc3RJZHggPyBsYXN0SWR4IDogb2Zmc2V0XTsNCgkJCX0NCg0KCQkJcmV0dXJuIGNvbnRhaW5lcjsNCgkJfTsNCg0KCQlmdW5jdGlvbiBwZXJmb3JtQ2FyZXRBY3Rpb24odHlwZSwgbmFtZSwgdmFycykgew0KCQkJdmFyIGksIGN1cnJlbnRQZW5kaW5nRm9ybWF0cyA9IHBlbmRpbmdGb3JtYXRzW3R5cGVdLA0KCQkJCW90aGVyUGVuZGluZ0Zvcm1hdHMgPSBwZW5kaW5nRm9ybWF0c1t0eXBlID09ICdhcHBseScgPyAncmVtb3ZlJyA6ICdhcHBseSddOw0KDQoJCQlmdW5jdGlvbiBoYXNQZW5kaW5nKCkgew0KCQkJCXJldHVybiBwZW5kaW5nRm9ybWF0cy5hcHBseS5sZW5ndGggfHwgcGVuZGluZ0Zvcm1hdHMucmVtb3ZlLmxlbmd0aDsNCgkJCX07DQoNCgkJCWZ1bmN0aW9uIHJlc2V0UGVuZGluZygpIHsNCgkJCQlwZW5kaW5nRm9ybWF0cy5hcHBseSA9IFtdOw0KCQkJCXBlbmRpbmdGb3JtYXRzLnJlbW92ZSA9IFtdOw0KCQkJfTsNCg0KCQkJZnVuY3Rpb24gcGVyZm9ybShjYXJldF9ub2RlKSB7DQoJCQkJLy8gQXBwbHkgcGVuZGluZyBmb3JtYXRzDQoJCQkJZWFjaChwZW5kaW5nRm9ybWF0cy5hcHBseS5yZXZlcnNlKCksIGZ1bmN0aW9uKGl0ZW0pIHsNCgkJCQkJYXBwbHkoaXRlbS5uYW1lLCBpdGVtLnZhcnMsIGNhcmV0X25vZGUpOw0KCQkJCX0pOw0KDQoJCQkJLy8gUmVtb3ZlIHBlbmRpbmcgZm9ybWF0cw0KCQkJCWVhY2gocGVuZGluZ0Zvcm1hdHMucmVtb3ZlLnJldmVyc2UoKSwgZnVuY3Rpb24oaXRlbSkgew0KCQkJCQlyZW1vdmUoaXRlbS5uYW1lLCBpdGVtLnZhcnMsIGNhcmV0X25vZGUpOw0KCQkJCX0pOw0KDQoJCQkJZG9tLnJlbW92ZShjYXJldF9ub2RlLCAxKTsNCgkJCQlyZXNldFBlbmRpbmcoKTsNCgkJCX07DQoNCgkJCS8vIENoZWNrIGlmIGl0IGFscmVhZHkgZXhpc3RzIHRoZW4gaWdub3JlIGl0DQoJCQlmb3IgKGkgPSBjdXJyZW50UGVuZGluZ0Zvcm1hdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQlpZiAoY3VycmVudFBlbmRpbmdGb3JtYXRzW2ldLm5hbWUgPT0gbmFtZSkNCgkJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQljdXJyZW50UGVuZGluZ0Zvcm1hdHMucHVzaCh7bmFtZSA6IG5hbWUsIHZhcnMgOiB2YXJzfSk7DQoNCgkJCS8vIENoZWNrIGlmIGl0J3MgaW4gdGhlIG90aGVyIHR5cGUsIHRoZW4gcmVtb3ZlIGl0DQoJCQlmb3IgKGkgPSBvdGhlclBlbmRpbmdGb3JtYXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJaWYgKG90aGVyUGVuZGluZ0Zvcm1hdHNbaV0ubmFtZSA9PSBuYW1lKQ0KCQkJCQlvdGhlclBlbmRpbmdGb3JtYXRzLnNwbGljZShpLCAxKTsNCgkJCX0NCg0KCQkJLy8gUGVuZGluZyBhcHBseSBvciByZW1vdmUgZm9ybWF0cw0KCQkJaWYgKGhhc1BlbmRpbmcoKSkgew0KCQkJCWVkLmdldERvYygpLmV4ZWNDb21tYW5kKCdGb250TmFtZScsIGZhbHNlLCAnbWNlaW5saW5lJyk7DQoJCQkJcGVuZGluZ0Zvcm1hdHMubGFzdFJuZyA9IHNlbGVjdGlvbi5nZXRSbmcoKTsNCg0KCQkJCS8vIElFIHdpbGwgY29udmVydCB0aGUgY3VycmVudCB3b3JkDQoJCQkJZWFjaChkb20uc2VsZWN0KCdmb250LHNwYW4nKSwgZnVuY3Rpb24obm9kZSkgew0KCQkJCQl2YXIgYm9va21hcms7DQoNCgkJCQkJaWYgKGlzQ2FyZXROb2RlKG5vZGUpKSB7DQoJCQkJCQlib29rbWFyayA9IHNlbGVjdGlvbi5nZXRCb29rbWFyaygpOw0KCQkJCQkJcGVyZm9ybShub2RlKTsNCgkJCQkJCXNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhib29rbWFyayk7DQoJCQkJCQllZC5ub2RlQ2hhbmdlZCgpOw0KCQkJCQl9DQoJCQkJfSk7DQoNCgkJCQkvLyBPbmx5IHJlZ2lzdGVyIGxpc3RlbmVycyBvbmNlIGlmIHdlIG5lZWQgdG8NCgkJCQlpZiAoIXBlbmRpbmdGb3JtYXRzLmlzTGlzdGVuaW5nICYmIGhhc1BlbmRpbmcoKSkgew0KCQkJCQlwZW5kaW5nRm9ybWF0cy5pc0xpc3RlbmluZyA9IHRydWU7DQoNCgkJCQkJZWFjaCgnb25LZXlEb3duLG9uS2V5VXAsb25LZXlQcmVzcyxvbk1vdXNlVXAnLnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV2ZW50KSB7DQoJCQkJCQllZFtldmVudF0uYWRkVG9Ub3AoZnVuY3Rpb24oZWQsIGUpIHsNCgkJCQkJCQkvLyBEbyB3ZSBoYXZlIHBlbmRpbmcgZm9ybWF0cyBhbmQgaXMgdGhlIHNlbGVjdGlvbiBtb3ZlZCBoYXMgbW92ZWQNCgkJCQkJCQlpZiAoaGFzUGVuZGluZygpICYmICF0aW55bWNlLmRvbS5SYW5nZVV0aWxzLmNvbXBhcmVSYW5nZXMocGVuZGluZ0Zvcm1hdHMubGFzdFJuZywgc2VsZWN0aW9uLmdldFJuZygpKSkgew0KCQkJCQkJCQllYWNoKGRvbS5zZWxlY3QoJ2ZvbnQsc3BhbicpLCBmdW5jdGlvbihub2RlKSB7DQoJCQkJCQkJCQl2YXIgdGV4dE5vZGUsIHJuZzsNCg0KCQkJCQkJCQkJLy8gTG9vayBmb3IgbWFya2VyDQoJCQkJCQkJCQlpZiAoaXNDYXJldE5vZGUobm9kZSkpIHsNCgkJCQkJCQkJCQl0ZXh0Tm9kZSA9IG5vZGUuZmlyc3RDaGlsZDsNCg0KCQkJCQkJCQkJCWlmICh0ZXh0Tm9kZSkgew0KCQkJCQkJCQkJCQlwZXJmb3JtKG5vZGUpOw0KDQoJCQkJCQkJCQkJCXJuZyA9IGRvbS5jcmVhdGVSbmcoKTsNCgkJCQkJCQkJCQkJcm5nLnNldFN0YXJ0KHRleHROb2RlLCB0ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoKTsNCgkJCQkJCQkJCQkJcm5nLnNldEVuZCh0ZXh0Tm9kZSwgdGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aCk7DQoJCQkJCQkJCQkJCXNlbGVjdGlvbi5zZXRSbmcocm5nKTsNCgkJCQkJCQkJCQkJZWQubm9kZUNoYW5nZWQoKTsNCgkJCQkJCQkJCQl9IGVsc2UNCgkJCQkJCQkJCQkJZG9tLnJlbW92ZShub2RlKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfSk7DQoNCgkJCQkJCQkJLy8gQWx3YXlzIHVuYmluZCBhbmQgY2xlYXIgcGVuZGluZyBzdHlsZXMgb24ga2V5dXANCgkJCQkJCQkJaWYgKGUudHlwZSA9PSAna2V5dXAnIHx8IGUudHlwZSA9PSAnbW91c2V1cCcpDQoJCQkJCQkJCQlyZXNldFBlbmRpbmcoKTsNCgkJCQkJCQl9DQoJCQkJCQl9KTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KCX07DQp9KSh0aW55bWNlKTsNCg0KdGlueW1jZS5vbkFkZEVkaXRvci5hZGQoZnVuY3Rpb24odGlueW1jZSwgZWQpIHsNCgl2YXIgZmlsdGVycywgZm9udFNpemVzLCBkb20sIHNldHRpbmdzID0gZWQuc2V0dGluZ3M7DQoNCglpZiAoc2V0dGluZ3MuaW5saW5lX3N0eWxlcykgew0KCQlmb250U2l6ZXMgPSB0aW55bWNlLmV4cGxvZGUoc2V0dGluZ3MuZm9udF9zaXplX3N0eWxlX3ZhbHVlcyk7DQoNCgkJZnVuY3Rpb24gcmVwbGFjZVdpdGhTcGFuKG5vZGUsIHN0eWxlcykgew0KCQkJdGlueW1jZS5lYWNoKHN0eWxlcywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsNCgkJCQlpZiAodmFsdWUpDQoJCQkJCWRvbS5zZXRTdHlsZShub2RlLCBuYW1lLCB2YWx1ZSk7DQoJCQl9KTsNCg0KCQkJZG9tLnJlbmFtZShub2RlLCAnc3BhbicpOw0KCQl9Ow0KDQoJCWZpbHRlcnMgPSB7DQoJCQlmb250IDogZnVuY3Rpb24oZG9tLCBub2RlKSB7DQoJCQkJcmVwbGFjZVdpdGhTcGFuKG5vZGUsIHsNCgkJCQkJYmFja2dyb3VuZENvbG9yIDogbm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IsDQoJCQkJCWNvbG9yIDogbm9kZS5jb2xvciwNCgkJCQkJZm9udEZhbWlseSA6IG5vZGUuZmFjZSwNCgkJCQkJZm9udFNpemUgOiBmb250U2l6ZXNbcGFyc2VJbnQobm9kZS5zaXplKSAtIDFdDQoJCQkJfSk7DQoJCQl9LA0KDQoJCQl1IDogZnVuY3Rpb24oZG9tLCBub2RlKSB7DQoJCQkJcmVwbGFjZVdpdGhTcGFuKG5vZGUsIHsNCgkJCQkJdGV4dERlY29yYXRpb24gOiAndW5kZXJsaW5lJw0KCQkJCX0pOw0KCQkJfSwNCg0KCQkJc3RyaWtlIDogZnVuY3Rpb24oZG9tLCBub2RlKSB7DQoJCQkJcmVwbGFjZVdpdGhTcGFuKG5vZGUsIHsNCgkJCQkJdGV4dERlY29yYXRpb24gOiAnbGluZS10aHJvdWdoJw0KCQkJCX0pOw0KCQkJfQ0KCQl9Ow0KDQoJCWZ1bmN0aW9uIGNvbnZlcnQoZWRpdG9yLCBwYXJhbXMpIHsNCgkJCWRvbSA9IGVkaXRvci5kb207DQoNCgkJCWlmIChzZXR0aW5ncy5jb252ZXJ0X2ZvbnRzX3RvX3NwYW5zKSB7DQoJCQkJdGlueW1jZS5lYWNoKGRvbS5zZWxlY3QoJ2ZvbnQsdSxzdHJpa2UnLCBwYXJhbXMubm9kZSksIGZ1bmN0aW9uKG5vZGUpIHsNCgkJCQkJZmlsdGVyc1tub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKGVkLmRvbSwgbm9kZSk7DQoJCQkJfSk7DQoJCQl9DQoJCX07DQoNCgkJZWQub25QcmVQcm9jZXNzLmFkZChjb252ZXJ0KTsNCg0KCQllZC5vbkluaXQuYWRkKGZ1bmN0aW9uKCkgew0KCQkJZWQuc2VsZWN0aW9uLm9uU2V0Q29udGVudC5hZGQoY29udmVydCk7DQoJCX0pOw0KCX0NCn0pOw0KDQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/utils/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/utils/editable_selects.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBlZGl0YWJsZV9zZWxlY3RzLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KdmFyIFRpbnlNQ0VfRWRpdGFibGVTZWxlY3RzID0gew0KCWVkaXRTZWxlY3RFbG0gOiBudWxsLA0KDQoJaW5pdCA6IGZ1bmN0aW9uKCkgew0KCQl2YXIgbmwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2VsZWN0IiksIGksIGQgPSBkb2N1bWVudCwgbzsNCg0KCQlmb3IgKGk9MDsgaTxubC5sZW5ndGg7IGkrKykgew0KCQkJaWYgKG5sW2ldLmNsYXNzTmFtZS5pbmRleE9mKCdtY2VFZGl0YWJsZVNlbGVjdCcpICE9IC0xKSB7DQoJCQkJbyA9IG5ldyBPcHRpb24oJyh2YWx1ZSknLCAnX19tY2VfYWRkX2N1c3RvbV9fJyk7DQoNCgkJCQlvLmNsYXNzTmFtZSA9ICdtY2VBZGRTZWxlY3RWYWx1ZSc7DQoNCgkJCQlubFtpXS5vcHRpb25zW25sW2ldLm9wdGlvbnMubGVuZ3RoXSA9IG87DQoJCQkJbmxbaV0ub25jaGFuZ2UgPSBUaW55TUNFX0VkaXRhYmxlU2VsZWN0cy5vbkNoYW5nZUVkaXRhYmxlU2VsZWN0Ow0KCQkJfQ0KCQl9DQoJfSwNCg0KCW9uQ2hhbmdlRWRpdGFibGVTZWxlY3QgOiBmdW5jdGlvbihlKSB7DQoJCXZhciBkID0gZG9jdW1lbnQsIG5lLCBzZSA9IHdpbmRvdy5ldmVudCA/IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50IDogZS50YXJnZXQ7DQoNCgkJaWYgKHNlLm9wdGlvbnNbc2Uuc2VsZWN0ZWRJbmRleF0udmFsdWUgPT0gJ19fbWNlX2FkZF9jdXN0b21fXycpIHsNCgkJCW5lID0gZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOw0KCQkJbmUuaWQgPSBzZS5pZCArICJfY3VzdG9tIjsNCgkJCW5lLm5hbWUgPSBzZS5uYW1lICsgIl9jdXN0b20iOw0KCQkJbmUudHlwZSA9ICJ0ZXh0IjsNCg0KCQkJbmUuc3R5bGUud2lkdGggPSBzZS5vZmZzZXRXaWR0aCArICdweCc7DQoJCQlzZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZSwgc2UpOw0KCQkJc2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCgkJCW5lLmZvY3VzKCk7DQoJCQluZS5vbmJsdXIgPSBUaW55TUNFX0VkaXRhYmxlU2VsZWN0cy5vbkJsdXJFZGl0YWJsZVNlbGVjdElucHV0Ow0KCQkJbmUub25rZXlkb3duID0gVGlueU1DRV9FZGl0YWJsZVNlbGVjdHMub25LZXlEb3duOw0KCQkJVGlueU1DRV9FZGl0YWJsZVNlbGVjdHMuZWRpdFNlbGVjdEVsbSA9IHNlOw0KCQl9DQoJfSwNCg0KCW9uQmx1ckVkaXRhYmxlU2VsZWN0SW5wdXQgOiBmdW5jdGlvbigpIHsNCgkJdmFyIHNlID0gVGlueU1DRV9FZGl0YWJsZVNlbGVjdHMuZWRpdFNlbGVjdEVsbTsNCg0KCQlpZiAoc2UpIHsNCgkJCWlmIChzZS5wcmV2aW91c1NpYmxpbmcudmFsdWUgIT0gJycpIHsNCgkJCQlhZGRTZWxlY3RWYWx1ZShkb2N1bWVudC5mb3Jtc1swXSwgc2UuaWQsIHNlLnByZXZpb3VzU2libGluZy52YWx1ZSwgc2UucHJldmlvdXNTaWJsaW5nLnZhbHVlKTsNCgkJCQlzZWxlY3RCeVZhbHVlKGRvY3VtZW50LmZvcm1zWzBdLCBzZS5pZCwgc2UucHJldmlvdXNTaWJsaW5nLnZhbHVlKTsNCgkJCX0gZWxzZQ0KCQkJCXNlbGVjdEJ5VmFsdWUoZG9jdW1lbnQuZm9ybXNbMF0sIHNlLmlkLCAnJyk7DQoNCgkJCXNlLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsNCgkJCXNlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2UucHJldmlvdXNTaWJsaW5nKTsNCgkJCVRpbnlNQ0VfRWRpdGFibGVTZWxlY3RzLmVkaXRTZWxlY3RFbG0gPSBudWxsOw0KCQl9DQoJfSwNCg0KCW9uS2V5RG93biA6IGZ1bmN0aW9uKGUpIHsNCgkJZSA9IGUgfHwgd2luZG93LmV2ZW50Ow0KDQoJCWlmIChlLmtleUNvZGUgPT0gMTMpDQoJCQlUaW55TUNFX0VkaXRhYmxlU2VsZWN0cy5vbkJsdXJFZGl0YWJsZVNlbGVjdElucHV0KCk7DQoJfQ0KfTsNCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/utils/form_utils.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBmb3JtX3V0aWxzLmpzDQogKg0KICogQ29weXJpZ2h0IDIwMDksIE1veGllY29kZSBTeXN0ZW1zIEFCDQogKiBSZWxlYXNlZCB1bmRlciBMR1BMIExpY2Vuc2UuDQogKg0KICogTGljZW5zZTogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9saWNlbnNlDQogKiBDb250cmlidXRpbmc6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vY29udHJpYnV0aW5nDQogKi8NCg0KdmFyIHRoZW1lQmFzZVVSTCA9IHRpbnlNQ0VQb3B1cC5lZGl0b3IuYmFzZVVSSS50b0Fic29sdXRlKCd0aGVtZXMvJyArIHRpbnlNQ0VQb3B1cC5nZXRQYXJhbSgidGhlbWUiKSk7DQoNCmZ1bmN0aW9uIGdldENvbG9yUGlja2VySFRNTChpZCwgdGFyZ2V0X2Zvcm1fZWxlbWVudCkgew0KCXZhciBoID0gIiI7DQoNCgloICs9ICc8YSBpZD0iJyArIGlkICsgJ19saW5rIiBocmVmPSJqYXZhc2NyaXB0OjsiIG9uY2xpY2s9InRpbnlNQ0VQb3B1cC5waWNrQ29sb3IoZXZlbnQsXCcnICsgdGFyZ2V0X2Zvcm1fZWxlbWVudCArJ1wnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7IiBjbGFzcz0icGlja2NvbG9yIj4nOw0KCWggKz0gJzxzcGFuIGlkPSInICsgaWQgKyAnIiB0aXRsZT0iJyArIHRpbnlNQ0VQb3B1cC5nZXRMYW5nKCdicm93c2UnKSArICciPiZuYnNwOzwvc3Bhbj48L2E+JzsNCg0KCXJldHVybiBoOw0KfQ0KDQpmdW5jdGlvbiB1cGRhdGVDb2xvcihpbWdfaWQsIGZvcm1fZWxlbWVudF9pZCkgew0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGltZ19pZCkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gZG9jdW1lbnQuZm9ybXNbMF0uZWxlbWVudHNbZm9ybV9lbGVtZW50X2lkXS52YWx1ZTsNCn0NCg0KZnVuY3Rpb24gc2V0QnJvd3NlckRpc2FibGVkKGlkLCBzdGF0ZSkgew0KCXZhciBpbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7DQoJdmFyIGxuayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgIl9saW5rIik7DQoNCglpZiAobG5rKSB7DQoJCWlmIChzdGF0ZSkgew0KCQkJbG5rLnNldEF0dHJpYnV0ZSgicmVhbGhyZWYiLCBsbmsuZ2V0QXR0cmlidXRlKCJocmVmIikpOw0KCQkJbG5rLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpOw0KCQkJdGlueU1DRVBvcHVwLmRvbS5hZGRDbGFzcyhpbWcsICdkaXNhYmxlZCcpOw0KCQl9IGVsc2Ugew0KCQkJaWYgKGxuay5nZXRBdHRyaWJ1dGUoInJlYWxocmVmIikpDQoJCQkJbG5rLnNldEF0dHJpYnV0ZSgiaHJlZiIsIGxuay5nZXRBdHRyaWJ1dGUoInJlYWxocmVmIikpOw0KDQoJCQl0aW55TUNFUG9wdXAuZG9tLnJlbW92ZUNsYXNzKGltZywgJ2Rpc2FibGVkJyk7DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIGdldEJyb3dzZXJIVE1MKGlkLCB0YXJnZXRfZm9ybV9lbGVtZW50LCB0eXBlLCBwcmVmaXgpIHsNCgl2YXIgb3B0aW9uID0gcHJlZml4ICsgIl8iICsgdHlwZSArICJfYnJvd3Nlcl9jYWxsYmFjayIsIGNiLCBodG1sOw0KDQoJY2IgPSB0aW55TUNFUG9wdXAuZ2V0UGFyYW0ob3B0aW9uLCB0aW55TUNFUG9wdXAuZ2V0UGFyYW0oImZpbGVfYnJvd3Nlcl9jYWxsYmFjayIpKTsNCg0KCWlmICghY2IpDQoJCXJldHVybiAiIjsNCg0KCWh0bWwgPSAiIjsNCglodG1sICs9ICc8YSBpZD0iJyArIGlkICsgJ19saW5rIiBocmVmPSJqYXZhc2NyaXB0Om9wZW5Ccm93c2VyKFwnJyArIGlkICsgJ1wnLFwnJyArIHRhcmdldF9mb3JtX2VsZW1lbnQgKyAnXCcsIFwnJyArIHR5cGUgKyAnXCcsXCcnICsgb3B0aW9uICsgJ1wnKTsiIG9ubW91c2Vkb3duPSJyZXR1cm4gZmFsc2U7IiBjbGFzcz0iYnJvd3NlIj4nOw0KCWh0bWwgKz0gJzxzcGFuIGlkPSInICsgaWQgKyAnIiB0aXRsZT0iJyArIHRpbnlNQ0VQb3B1cC5nZXRMYW5nKCdicm93c2UnKSArICciPiZuYnNwOzwvc3Bhbj48L2E+JzsNCg0KCXJldHVybiBodG1sOw0KfQ0KDQpmdW5jdGlvbiBvcGVuQnJvd3NlcihpbWdfaWQsIHRhcmdldF9mb3JtX2VsZW1lbnQsIHR5cGUsIG9wdGlvbikgew0KCXZhciBpbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbWdfaWQpOw0KDQoJaWYgKGltZy5jbGFzc05hbWUgIT0gIm1jZUJ1dHRvbkRpc2FibGVkIikNCgkJdGlueU1DRVBvcHVwLm9wZW5Ccm93c2VyKHRhcmdldF9mb3JtX2VsZW1lbnQsIHR5cGUsIG9wdGlvbik7DQp9DQoNCmZ1bmN0aW9uIHNlbGVjdEJ5VmFsdWUoZm9ybV9vYmosIGZpZWxkX25hbWUsIHZhbHVlLCBhZGRfY3VzdG9tLCBpZ25vcmVfY2FzZSkgew0KCWlmICghZm9ybV9vYmogfHwgIWZvcm1fb2JqLmVsZW1lbnRzW2ZpZWxkX25hbWVdKQ0KCQlyZXR1cm47DQoNCgl2YXIgc2VsID0gZm9ybV9vYmouZWxlbWVudHNbZmllbGRfbmFtZV07DQoNCgl2YXIgZm91bmQgPSBmYWxzZTsNCglmb3IgKHZhciBpPTA7IGk8c2VsLm9wdGlvbnMubGVuZ3RoOyBpKyspIHsNCgkJdmFyIG9wdGlvbiA9IHNlbC5vcHRpb25zW2ldOw0KDQoJCWlmIChvcHRpb24udmFsdWUgPT0gdmFsdWUgfHwgKGlnbm9yZV9jYXNlICYmIG9wdGlvbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09IHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQoJCQlvcHRpb24uc2VsZWN0ZWQgPSB0cnVlOw0KCQkJZm91bmQgPSB0cnVlOw0KCQl9IGVsc2UNCgkJCW9wdGlvbi5zZWxlY3RlZCA9IGZhbHNlOw0KCX0NCg0KCWlmICghZm91bmQgJiYgYWRkX2N1c3RvbSAmJiB2YWx1ZSAhPSAnJykgew0KCQl2YXIgb3B0aW9uID0gbmV3IE9wdGlvbih2YWx1ZSwgdmFsdWUpOw0KCQlvcHRpb24uc2VsZWN0ZWQgPSB0cnVlOw0KCQlzZWwub3B0aW9uc1tzZWwub3B0aW9ucy5sZW5ndGhdID0gb3B0aW9uOw0KCQlzZWwuc2VsZWN0ZWRJbmRleCA9IHNlbC5vcHRpb25zLmxlbmd0aCAtIDE7DQoJfQ0KDQoJcmV0dXJuIGZvdW5kOw0KfQ0KDQpmdW5jdGlvbiBnZXRTZWxlY3RWYWx1ZShmb3JtX29iaiwgZmllbGRfbmFtZSkgew0KCXZhciBlbG0gPSBmb3JtX29iai5lbGVtZW50c1tmaWVsZF9uYW1lXTsNCg0KCWlmIChlbG0gPT0gbnVsbCB8fCBlbG0ub3B0aW9ucyA9PSBudWxsIHx8IGVsbS5zZWxlY3RlZEluZGV4ID09PSAtMSkNCgkJcmV0dXJuICIiOw0KDQoJcmV0dXJuIGVsbS5vcHRpb25zW2VsbS5zZWxlY3RlZEluZGV4XS52YWx1ZTsNCn0NCg0KZnVuY3Rpb24gYWRkU2VsZWN0VmFsdWUoZm9ybV9vYmosIGZpZWxkX25hbWUsIG5hbWUsIHZhbHVlKSB7DQoJdmFyIHMgPSBmb3JtX29iai5lbGVtZW50c1tmaWVsZF9uYW1lXTsNCgl2YXIgbyA9IG5ldyBPcHRpb24obmFtZSwgdmFsdWUpOw0KCXMub3B0aW9uc1tzLm9wdGlvbnMubGVuZ3RoXSA9IG87DQp9DQoNCmZ1bmN0aW9uIGFkZENsYXNzZXNUb0xpc3QobGlzdF9pZCwgc3BlY2lmaWNfb3B0aW9uKSB7DQoJLy8gU2V0dXAgY2xhc3MgZHJvcGxpc3QNCgl2YXIgc3R5bGVTZWxlY3RFbG0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsaXN0X2lkKTsNCgl2YXIgc3R5bGVzID0gdGlueU1DRVBvcHVwLmdldFBhcmFtKCd0aGVtZV9hZHZhbmNlZF9zdHlsZXMnLCBmYWxzZSk7DQoJc3R5bGVzID0gdGlueU1DRVBvcHVwLmdldFBhcmFtKHNwZWNpZmljX29wdGlvbiwgc3R5bGVzKTsNCg0KCWlmIChzdHlsZXMpIHsNCgkJdmFyIHN0eWxlc0FyID0gc3R5bGVzLnNwbGl0KCc7Jyk7DQoNCgkJZm9yICh2YXIgaT0wOyBpPHN0eWxlc0FyLmxlbmd0aDsgaSsrKSB7DQoJCQlpZiAoc3R5bGVzQXIgIT0gIiIpIHsNCgkJCQl2YXIga2V5LCB2YWx1ZTsNCg0KCQkJCWtleSA9IHN0eWxlc0FyW2ldLnNwbGl0KCc9JylbMF07DQoJCQkJdmFsdWUgPSBzdHlsZXNBcltpXS5zcGxpdCgnPScpWzFdOw0KDQoJCQkJc3R5bGVTZWxlY3RFbG0ub3B0aW9uc1tzdHlsZVNlbGVjdEVsbS5sZW5ndGhdID0gbmV3IE9wdGlvbihrZXksIHZhbHVlKTsNCgkJCX0NCgkJfQ0KCX0gZWxzZSB7DQoJCXRpbnltY2UuZWFjaCh0aW55TUNFUG9wdXAuZWRpdG9yLmRvbS5nZXRDbGFzc2VzKCksIGZ1bmN0aW9uKG8pIHsNCgkJCXN0eWxlU2VsZWN0RWxtLm9wdGlvbnNbc3R5bGVTZWxlY3RFbG0ubGVuZ3RoXSA9IG5ldyBPcHRpb24oby50aXRsZSB8fCBvWydjbGFzcyddLCBvWydjbGFzcyddKTsNCgkJfSk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBpc1Zpc2libGUoZWxlbWVudF9pZCkgew0KCXZhciBlbG0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50X2lkKTsNCg0KCXJldHVybiBlbG0gJiYgZWxtLnN0eWxlLmRpc3BsYXkgIT0gIm5vbmUiOw0KfQ0KDQpmdW5jdGlvbiBjb252ZXJ0UkdCVG9IZXgoY29sKSB7DQoJdmFyIHJlID0gbmV3IFJlZ0V4cCgicmdiXFxzKlxcKFxccyooWzAtOV0rKS4qLFxccyooWzAtOV0rKS4qLFxccyooWzAtOV0rKS4qXFwpIiwgImdpIik7DQoNCgl2YXIgcmdiID0gY29sLnJlcGxhY2UocmUsICIkMSwkMiwkMyIpLnNwbGl0KCcsJyk7DQoJaWYgKHJnYi5sZW5ndGggPT0gMykgew0KCQlyID0gcGFyc2VJbnQocmdiWzBdKS50b1N0cmluZygxNik7DQoJCWcgPSBwYXJzZUludChyZ2JbMV0pLnRvU3RyaW5nKDE2KTsNCgkJYiA9IHBhcnNlSW50KHJnYlsyXSkudG9TdHJpbmcoMTYpOw0KDQoJCXIgPSByLmxlbmd0aCA9PSAxID8gJzAnICsgciA6IHI7DQoJCWcgPSBnLmxlbmd0aCA9PSAxID8gJzAnICsgZyA6IGc7DQoJCWIgPSBiLmxlbmd0aCA9PSAxID8gJzAnICsgYiA6IGI7DQoNCgkJcmV0dXJuICIjIiArIHIgKyBnICsgYjsNCgl9DQoNCglyZXR1cm4gY29sOw0KfQ0KDQpmdW5jdGlvbiBjb252ZXJ0SGV4VG9SR0IoY29sKSB7DQoJaWYgKGNvbC5pbmRleE9mKCcjJykgIT0gLTEpIHsNCgkJY29sID0gY29sLnJlcGxhY2UobmV3IFJlZ0V4cCgnW14wLTlBLUZdJywgJ2dpJyksICcnKTsNCg0KCQlyID0gcGFyc2VJbnQoY29sLnN1YnN0cmluZygwLCAyKSwgMTYpOw0KCQlnID0gcGFyc2VJbnQoY29sLnN1YnN0cmluZygyLCA0KSwgMTYpOw0KCQliID0gcGFyc2VJbnQoY29sLnN1YnN0cmluZyg0LCA2KSwgMTYpOw0KDQoJCXJldHVybiAicmdiKCIgKyByICsgIiwiICsgZyArICIsIiArIGIgKyAiKSI7DQoJfQ0KDQoJcmV0dXJuIGNvbDsNCn0NCg0KZnVuY3Rpb24gdHJpbVNpemUoc2l6ZSkgew0KCXJldHVybiBzaXplLnJlcGxhY2UoLyhbMC05XC5dKylweHwoJXxpbnxjbXxtbXxlbXxleHxwdHxwYykvLCAnJDEkMicpOw0KfQ0KDQpmdW5jdGlvbiBnZXRDU1NTaXplKHNpemUpIHsNCglzaXplID0gdHJpbVNpemUoc2l6ZSk7DQoNCglpZiAoc2l6ZSA9PSAiIikNCgkJcmV0dXJuICIiOw0KDQoJLy8gQWRkIHB4DQoJaWYgKC9eWzAtOV0rJC8udGVzdChzaXplKSkNCgkJc2l6ZSArPSAncHgnOw0KDQoJcmV0dXJuIHNpemU7DQp9DQoNCmZ1bmN0aW9uIGdldFN0eWxlKGVsbSwgYXR0cmliLCBzdHlsZSkgew0KCXZhciB2YWwgPSB0aW55TUNFUG9wdXAuZG9tLmdldEF0dHJpYihlbG0sIGF0dHJpYik7DQoNCglpZiAodmFsICE9ICcnKQ0KCQlyZXR1cm4gJycgKyB2YWw7DQoNCglpZiAodHlwZW9mKHN0eWxlKSA9PSAndW5kZWZpbmVkJykNCgkJc3R5bGUgPSBhdHRyaWI7DQoNCglyZXR1cm4gdGlueU1DRVBvcHVwLmRvbS5nZXRTdHlsZShlbG0sIHN0eWxlKTsNCn0NCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/utils/mctabs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBtY3RhYnMuanMNCiAqDQogKiBDb3B5cmlnaHQgMjAwOSwgTW94aWVjb2RlIFN5c3RlbXMgQUINCiAqIFJlbGVhc2VkIHVuZGVyIExHUEwgTGljZW5zZS4NCiAqDQogKiBMaWNlbnNlOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xpY2Vuc2UNCiAqIENvbnRyaWJ1dGluZzogaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9jb250cmlidXRpbmcNCiAqLw0KDQpmdW5jdGlvbiBNQ1RhYnMoKSB7DQoJdGhpcy5zZXR0aW5ncyA9IFtdOw0KfTsNCg0KTUNUYWJzLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oc2V0dGluZ3MpIHsNCgl0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7DQp9Ow0KDQpNQ1RhYnMucHJvdG90eXBlLmdldFBhcmFtID0gZnVuY3Rpb24obmFtZSwgZGVmYXVsdF92YWx1ZSkgew0KCXZhciB2YWx1ZSA9IG51bGw7DQoNCgl2YWx1ZSA9ICh0eXBlb2YodGhpcy5zZXR0aW5nc1tuYW1lXSkgPT0gInVuZGVmaW5lZCIpID8gZGVmYXVsdF92YWx1ZSA6IHRoaXMuc2V0dGluZ3NbbmFtZV07DQoNCgkvLyBGaXggYm9vbCB2YWx1ZXMNCglpZiAodmFsdWUgPT0gInRydWUiIHx8IHZhbHVlID09ICJmYWxzZSIpDQoJCXJldHVybiAodmFsdWUgPT0gInRydWUiKTsNCg0KCXJldHVybiB2YWx1ZTsNCn07DQoNCk1DVGFicy5wcm90b3R5cGUuZGlzcGxheVRhYiA9IGZ1bmN0aW9uKHRhYl9pZCwgcGFuZWxfaWQpIHsNCgl2YXIgcGFuZWxFbG0sIHBhbmVsQ29udGFpbmVyRWxtLCB0YWJFbG0sIHRhYkNvbnRhaW5lckVsbSwgc2VsZWN0aW9uQ2xhc3MsIG5vZGVzLCBpOw0KDQoJcGFuZWxFbG09IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhbmVsX2lkKTsNCglwYW5lbENvbnRhaW5lckVsbSA9IHBhbmVsRWxtID8gcGFuZWxFbG0ucGFyZW50Tm9kZSA6IG51bGw7DQoJdGFiRWxtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFiX2lkKTsNCgl0YWJDb250YWluZXJFbG0gPSB0YWJFbG0gPyB0YWJFbG0ucGFyZW50Tm9kZSA6IG51bGw7DQoJc2VsZWN0aW9uQ2xhc3MgPSB0aGlzLmdldFBhcmFtKCdzZWxlY3Rpb25fY2xhc3MnLCAnY3VycmVudCcpOw0KDQoJaWYgKHRhYkVsbSAmJiB0YWJDb250YWluZXJFbG0pIHsNCgkJbm9kZXMgPSB0YWJDb250YWluZXJFbG0uY2hpbGROb2RlczsNCg0KCQkvLyBIaWRlIGFsbCBvdGhlciB0YWJzDQoJCWZvciAoaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgew0KCQkJaWYgKG5vZGVzW2ldLm5vZGVOYW1lID09ICJMSSIpDQoJCQkJbm9kZXNbaV0uY2xhc3NOYW1lID0gJyc7DQoJCX0NCg0KCQkvLyBTaG93IHNlbGVjdGVkIHRhYg0KCQl0YWJFbG0uY2xhc3NOYW1lID0gJ2N1cnJlbnQnOw0KCX0NCg0KCWlmIChwYW5lbEVsbSAmJiBwYW5lbENvbnRhaW5lckVsbSkgew0KCQlub2RlcyA9IHBhbmVsQ29udGFpbmVyRWxtLmNoaWxkTm9kZXM7DQoNCgkJLy8gSGlkZSBhbGwgb3RoZXIgcGFuZWxzDQoJCWZvciAoaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgew0KCQkJaWYgKG5vZGVzW2ldLm5vZGVOYW1lID09ICJESVYiKQ0KCQkJCW5vZGVzW2ldLmNsYXNzTmFtZSA9ICdwYW5lbCc7DQoJCX0NCg0KCQkvLyBTaG93IHNlbGVjdGVkIHBhbmVsDQoJCXBhbmVsRWxtLmNsYXNzTmFtZSA9ICdjdXJyZW50JzsNCgl9DQp9Ow0KDQpNQ1RhYnMucHJvdG90eXBlLmdldEFuY2hvciA9IGZ1bmN0aW9uKCkgew0KCXZhciBwb3MsIHVybCA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQoNCglpZiAoKHBvcyA9IHVybC5sYXN0SW5kZXhPZignIycpKSAhPSAtMSkNCgkJcmV0dXJuIHVybC5zdWJzdHJpbmcocG9zICsgMSk7DQoNCglyZXR1cm4gIiI7DQp9Ow0KDQovLyBHbG9iYWwgaW5zdGFuY2UNCnZhciBtY1RhYnMgPSBuZXcgTUNUYWJzKCk7DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/tiny_mce/utils/validate.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiB2YWxpZGF0ZS5qcw0KICoNCiAqIENvcHlyaWdodCAyMDA5LCBNb3hpZWNvZGUgU3lzdGVtcyBBQg0KICogUmVsZWFzZWQgdW5kZXIgTEdQTCBMaWNlbnNlLg0KICoNCiAqIExpY2Vuc2U6IGh0dHA6Ly90aW55bWNlLm1veGllY29kZS5jb20vbGljZW5zZQ0KICogQ29udHJpYnV0aW5nOiBodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2NvbnRyaWJ1dGluZw0KICovDQoNCi8qKg0KCS8vIFN0cmluZyB2YWxpZGF0aW9uOg0KDQoJaWYgKCFWYWxpZGF0b3IuaXNFbWFpbCgnbXllbWFpbCcpKQ0KCQlhbGVydCgnSW52YWxpZCBlbWFpbC4nKTsNCg0KCS8vIEZvcm0gdmFsaWRhdGlvbjoNCg0KCXZhciBmID0gZG9jdW1lbnQuZm9ybXNbJ215Zm9ybSddOw0KDQoJaWYgKCFWYWxpZGF0b3IuaXNFbWFpbChmLm15ZW1haWwpKQ0KCQlhbGVydCgnSW52YWxpZCBlbWFpbC4nKTsNCiovDQoNCnZhciBWYWxpZGF0b3IgPSB7DQoJaXNFbWFpbCA6IGZ1bmN0aW9uKHMpIHsNCgkJcmV0dXJuIHRoaXMudGVzdChzLCAnXlstISMkJSZcJyorXFwuLzAtOT0/QS1aXl9gYS16e3x9fl0rQFstISMkJSZcJyorXFwvMC05PT9BLVpeX2BhLXp7fH1+XStcLlstISMkJSZcJyorXFwuLzAtOT0/QS1aXl9gYS16e3x9fl0rJCcpOw0KCX0sDQoNCglpc0Fic1VybCA6IGZ1bmN0aW9uKHMpIHsNCgkJcmV0dXJuIHRoaXMudGVzdChzLCAnXihuZXdzfHRlbG5ldHxudHRwfGZpbGV8aHR0cHxmdHB8aHR0cHMpOi8vWy1BLVphLXowLTlcXC5dK1xcLz8uKiQnKTsNCgl9LA0KDQoJaXNTaXplIDogZnVuY3Rpb24ocykgew0KCQlyZXR1cm4gdGhpcy50ZXN0KHMsICdeWzAtOV0rKCV8aW58Y218bW18ZW18ZXh8cHR8cGN8cHgpPyQnKTsNCgl9LA0KDQoJaXNJZCA6IGZ1bmN0aW9uKHMpIHsNCgkJcmV0dXJuIHRoaXMudGVzdChzLCAnXltBLVphLXpfXShbQS1aYS16MC05X10pKiQnKTsNCgl9LA0KDQoJaXNFbXB0eSA6IGZ1bmN0aW9uKHMpIHsNCgkJdmFyIG5sLCBpOw0KDQoJCWlmIChzLm5vZGVOYW1lID09ICdTRUxFQ1QnICYmIHMuc2VsZWN0ZWRJbmRleCA8IDEpDQoJCQlyZXR1cm4gdHJ1ZTsNCg0KCQlpZiAocy50eXBlID09ICdjaGVja2JveCcgJiYgIXMuY2hlY2tlZCkNCgkJCXJldHVybiB0cnVlOw0KDQoJCWlmIChzLnR5cGUgPT0gJ3JhZGlvJykgew0KCQkJZm9yIChpPTAsIG5sID0gcy5mb3JtLmVsZW1lbnRzOyBpPG5sLmxlbmd0aDsgaSsrKSB7DQoJCQkJaWYgKG5sW2ldLnR5cGUgPT0gInJhZGlvIiAmJiBubFtpXS5uYW1lID09IHMubmFtZSAmJiBubFtpXS5jaGVja2VkKQ0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoNCgkJCXJldHVybiB0cnVlOw0KCQl9DQoNCgkJcmV0dXJuIG5ldyBSZWdFeHAoJ15cXHMqJCcpLnRlc3Qocy5ub2RlVHlwZSA9PSAxID8gcy52YWx1ZSA6IHMpOw0KCX0sDQoNCglpc051bWJlciA6IGZ1bmN0aW9uKHMsIGQpIHsNCgkJcmV0dXJuICFpc05hTihzLm5vZGVUeXBlID09IDEgPyBzLnZhbHVlIDogcykgJiYgKCFkIHx8ICF0aGlzLnRlc3QocywgJ14tP1swLTldKlxcLlswLTldKiQnKSk7DQoJfSwNCg0KCXRlc3QgOiBmdW5jdGlvbihzLCBwKSB7DQoJCXMgPSBzLm5vZGVUeXBlID09IDEgPyBzLnZhbHVlIDogczsNCg0KCQlyZXR1cm4gcyA9PSAnJyB8fCBuZXcgUmVnRXhwKHApLnRlc3Qocyk7DQoJfQ0KfTsNCg0KdmFyIEF1dG9WYWxpZGF0b3IgPSB7DQoJc2V0dGluZ3MgOiB7DQoJCWlkX2NscyA6ICdpZCcsDQoJCWludF9jbHMgOiAnaW50JywNCgkJdXJsX2NscyA6ICd1cmwnLA0KCQludW1iZXJfY2xzIDogJ251bWJlcicsDQoJCWVtYWlsX2NscyA6ICdlbWFpbCcsDQoJCXNpemVfY2xzIDogJ3NpemUnLA0KCQlyZXF1aXJlZF9jbHMgOiAncmVxdWlyZWQnLA0KCQlpbnZhbGlkX2NscyA6ICdpbnZhbGlkJywNCgkJbWluX2NscyA6ICdtaW4nLA0KCQltYXhfY2xzIDogJ21heCcNCgl9LA0KDQoJaW5pdCA6IGZ1bmN0aW9uKHMpIHsNCgkJdmFyIG47DQoNCgkJZm9yIChuIGluIHMpDQoJCQl0aGlzLnNldHRpbmdzW25dID0gc1tuXTsNCgl9LA0KDQoJdmFsaWRhdGUgOiBmdW5jdGlvbihmKSB7DQoJCXZhciBpLCBubCwgcyA9IHRoaXMuc2V0dGluZ3MsIGMgPSAwOw0KDQoJCW5sID0gdGhpcy50YWdzKGYsICdsYWJlbCcpOw0KCQlmb3IgKGk9MDsgaTxubC5sZW5ndGg7IGkrKykNCgkJCXRoaXMucmVtb3ZlQ2xhc3MobmxbaV0sIHMuaW52YWxpZF9jbHMpOw0KDQoJCWMgKz0gdGhpcy52YWxpZGF0ZUVsbXMoZiwgJ2lucHV0Jyk7DQoJCWMgKz0gdGhpcy52YWxpZGF0ZUVsbXMoZiwgJ3NlbGVjdCcpOw0KCQljICs9IHRoaXMudmFsaWRhdGVFbG1zKGYsICd0ZXh0YXJlYScpOw0KDQoJCXJldHVybiBjID09IDM7DQoJfSwNCg0KCWludmFsaWRhdGUgOiBmdW5jdGlvbihuKSB7DQoJCXRoaXMubWFyayhuLmZvcm0sIG4pOw0KCX0sDQoNCglyZXNldCA6IGZ1bmN0aW9uKGUpIHsNCgkJdmFyIHQgPSBbJ2xhYmVsJywgJ2lucHV0JywgJ3NlbGVjdCcsICd0ZXh0YXJlYSddOw0KCQl2YXIgaSwgaiwgbmwsIHMgPSB0aGlzLnNldHRpbmdzOw0KDQoJCWlmIChlID09IG51bGwpDQoJCQlyZXR1cm47DQoNCgkJZm9yIChpPTA7IGk8dC5sZW5ndGg7IGkrKykgew0KCQkJbmwgPSB0aGlzLnRhZ3MoZS5mb3JtID8gZS5mb3JtIDogZSwgdFtpXSk7DQoJCQlmb3IgKGo9MDsgajxubC5sZW5ndGg7IGorKykNCgkJCQl0aGlzLnJlbW92ZUNsYXNzKG5sW2pdLCBzLmludmFsaWRfY2xzKTsNCgkJfQ0KCX0sDQoNCgl2YWxpZGF0ZUVsbXMgOiBmdW5jdGlvbihmLCBlKSB7DQoJCXZhciBubCwgaSwgbiwgcyA9IHRoaXMuc2V0dGluZ3MsIHN0ID0gdHJ1ZSwgdmEgPSBWYWxpZGF0b3IsIHY7DQoNCgkJbmwgPSB0aGlzLnRhZ3MoZiwgZSk7DQoJCWZvciAoaT0wOyBpPG5sLmxlbmd0aDsgaSsrKSB7DQoJCQluID0gbmxbaV07DQoNCgkJCXRoaXMucmVtb3ZlQ2xhc3Mobiwgcy5pbnZhbGlkX2Nscyk7DQoNCgkJCWlmICh0aGlzLmhhc0NsYXNzKG4sIHMucmVxdWlyZWRfY2xzKSAmJiB2YS5pc0VtcHR5KG4pKQ0KCQkJCXN0ID0gdGhpcy5tYXJrKGYsIG4pOw0KDQoJCQlpZiAodGhpcy5oYXNDbGFzcyhuLCBzLm51bWJlcl9jbHMpICYmICF2YS5pc051bWJlcihuKSkNCgkJCQlzdCA9IHRoaXMubWFyayhmLCBuKTsNCg0KCQkJaWYgKHRoaXMuaGFzQ2xhc3Mobiwgcy5pbnRfY2xzKSAmJiAhdmEuaXNOdW1iZXIobiwgdHJ1ZSkpDQoJCQkJc3QgPSB0aGlzLm1hcmsoZiwgbik7DQoNCgkJCWlmICh0aGlzLmhhc0NsYXNzKG4sIHMudXJsX2NscykgJiYgIXZhLmlzQWJzVXJsKG4pKQ0KCQkJCXN0ID0gdGhpcy5tYXJrKGYsIG4pOw0KDQoJCQlpZiAodGhpcy5oYXNDbGFzcyhuLCBzLmVtYWlsX2NscykgJiYgIXZhLmlzRW1haWwobikpDQoJCQkJc3QgPSB0aGlzLm1hcmsoZiwgbik7DQoNCgkJCWlmICh0aGlzLmhhc0NsYXNzKG4sIHMuc2l6ZV9jbHMpICYmICF2YS5pc1NpemUobikpDQoJCQkJc3QgPSB0aGlzLm1hcmsoZiwgbik7DQoNCgkJCWlmICh0aGlzLmhhc0NsYXNzKG4sIHMuaWRfY2xzKSAmJiAhdmEuaXNJZChuKSkNCgkJCQlzdCA9IHRoaXMubWFyayhmLCBuKTsNCg0KCQkJaWYgKHRoaXMuaGFzQ2xhc3Mobiwgcy5taW5fY2xzLCB0cnVlKSkgew0KCQkJCXYgPSB0aGlzLmdldE51bShuLCBzLm1pbl9jbHMpOw0KDQoJCQkJaWYgKGlzTmFOKHYpIHx8IHBhcnNlSW50KG4udmFsdWUpIDwgcGFyc2VJbnQodikpDQoJCQkJCXN0ID0gdGhpcy5tYXJrKGYsIG4pOw0KCQkJfQ0KDQoJCQlpZiAodGhpcy5oYXNDbGFzcyhuLCBzLm1heF9jbHMsIHRydWUpKSB7DQoJCQkJdiA9IHRoaXMuZ2V0TnVtKG4sIHMubWF4X2Nscyk7DQoNCgkJCQlpZiAoaXNOYU4odikgfHwgcGFyc2VJbnQobi52YWx1ZSkgPiBwYXJzZUludCh2KSkNCgkJCQkJc3QgPSB0aGlzLm1hcmsoZiwgbik7DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gc3Q7DQoJfSwNCg0KCWhhc0NsYXNzIDogZnVuY3Rpb24obiwgYywgZCkgew0KCQlyZXR1cm4gbmV3IFJlZ0V4cCgnXFxiJyArIGMgKyAoZCA/ICdbMC05XSsnIDogJycpICsgJ1xcYicsICdnJykudGVzdChuLmNsYXNzTmFtZSk7DQoJfSwNCg0KCWdldE51bSA6IGZ1bmN0aW9uKG4sIGMpIHsNCgkJYyA9IG4uY2xhc3NOYW1lLm1hdGNoKG5ldyBSZWdFeHAoJ1xcYicgKyBjICsgJyhbMC05XSspXFxiJywgJ2cnKSlbMF07DQoJCWMgPSBjLnJlcGxhY2UoL1teMC05XS9nLCAnJyk7DQoNCgkJcmV0dXJuIGM7DQoJfSwNCg0KCWFkZENsYXNzIDogZnVuY3Rpb24obiwgYywgYikgew0KCQl2YXIgbyA9IHRoaXMucmVtb3ZlQ2xhc3MobiwgYyk7DQoJCW4uY2xhc3NOYW1lID0gYiA/IGMgKyAobyAhPSAnJyA/ICgnICcgKyBvKSA6ICcnKSA6IChvICE9ICcnID8gKG8gKyAnICcpIDogJycpICsgYzsNCgl9LA0KDQoJcmVtb3ZlQ2xhc3MgOiBmdW5jdGlvbihuLCBjKSB7DQoJCWMgPSBuLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoIihefFxccyspIiArIGMgKyAiKFxccyt8JCkiKSwgJyAnKTsNCgkJcmV0dXJuIG4uY2xhc3NOYW1lID0gYyAhPSAnICcgPyBjIDogJyc7DQoJfSwNCg0KCXRhZ3MgOiBmdW5jdGlvbihmLCBzKSB7DQoJCXJldHVybiBmLmdldEVsZW1lbnRzQnlUYWdOYW1lKHMpOw0KCX0sDQoNCgltYXJrIDogZnVuY3Rpb24oZiwgbikgew0KCQl2YXIgcyA9IHRoaXMuc2V0dGluZ3M7DQoNCgkJdGhpcy5hZGRDbGFzcyhuLCBzLmludmFsaWRfY2xzKTsNCgkJdGhpcy5tYXJrTGFiZWxzKGYsIG4sIHMuaW52YWxpZF9jbHMpOw0KDQoJCXJldHVybiBmYWxzZTsNCgl9LA0KDQoJbWFya0xhYmVscyA6IGZ1bmN0aW9uKGYsIG4sIGljKSB7DQoJCXZhciBubCwgaTsNCg0KCQlubCA9IHRoaXMudGFncyhmLCAibGFiZWwiKTsNCgkJZm9yIChpPTA7IGk8bmwubGVuZ3RoOyBpKyspIHsNCgkJCWlmIChubFtpXS5nZXRBdHRyaWJ1dGUoImZvciIpID09IG4uaWQgfHwgbmxbaV0uaHRtbEZvciA9PSBuLmlkKQ0KCQkJCXRoaXMuYWRkQ2xhc3MobmxbaV0sIGljKTsNCgkJfQ0KDQoJCXJldHVybiBudWxsOw0KCX0NCn07DQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/js/touchInlineEditInstance.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqICRJZDogdG91Y2hJbmxpbmVFZGl0LmpzIDE0MSAyMDExLTAxLTA5IDE5OjE4OjU3WiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBNb2R1bGUKICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjguMAogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqCiAqIAogKiAtLQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogKiBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiAqCiAqLwoKZnVuY3Rpb24gdG91Y2hJbmxpbmVFZGl0SW5zdGFuY2UoaWQsYmxvY2ssc2VsZWN0b3IpewogIAogIC8qKgogICAqIFNlbGYgaW5zdGFuY2UuCiAgICogQHZhciBvYmplY3QKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLyAKICB2YXIgc2VsZiA9IHRoaXM7CgogIC8qKgogICAqIFBhZ2UgaWQuCiAgICogQHZhciBpbnRlZ2VyCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gCiAgdGhpcy5pZCA9IGlkOwogIAogIC8qKgogICAqIFBhZ2UgYmxvY2suCiAgICogQHZhciBuYW1lCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gCiAgdGhpcy5ibG9jayA9IGJsb2NrOwogIAogIC8qKgogICAqIFNlbGVjdG9yIGh0bWwgaWQuCiAgICogQHZhciBpbnRlZ2VyCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gCiAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOwogIAogIC8qKgogICAqIEVkaXRvciBpbnN0YW5jZS4KICAgKiBAdmFyIG9iamVjdAogICAqIEBhY2Nlc3MgcHVibGljCiAgICovIAogIHRoaXMuZWRpdG9yOwoKICAvKioKICAgKiBDb25zdHJ1Y3QgZWRpdG9yIGluc3RhbmNlLgogICAqLwogIHRoaXMuX19jb25zdHJ1Y3QgPSBmdW5jdGlvbigpCiAgewogICAgLy9jb25zb2xlLmRlYnVnKCdDb25zdHJ1Y3QgJyArIHNlbGYuYmxvY2spOwogICAgdGlueU1DRS5pbml0KHsKICAgICAgbW9kZTogJ25vbmUnLAogICAgICBhdXRvX2ZvY3VzOiBzZWxmLnNlbGVjdG9yLAogICAgICAvLyBUaGVtZQogICAgICB0aGVtZTogdG91Y2hJbmxpbmVFZGl0LmdldFBhcmFtKCd0aGVtZScpLAogICAgICAvLyBTa2luCiAgICAgIHNraW46IHRvdWNoSW5saW5lRWRpdC5nZXRQYXJhbSgnc2tpbicpLAogICAgICBza2luX3ZhcmlhbnQ6IHRvdWNoSW5saW5lRWRpdC5nZXRQYXJhbSgnc2tpbl92YXJpYW50JyksCiAgICAgIC8vIFNpemUKICAgICAgd2lkdGg6IHRvdWNoSW5saW5lRWRpdC5nZXRQYXJhbSgnd2lkdGgnKSwKICAgICAgaGVpZ2h0OiB0b3VjaElubGluZUVkaXQuZ2V0UGFyYW0oJ2hlaWdodCcpLAogICAgICAvLyBQbHVnaW5zCiAgICAgIHBsdWdpbnM6ICdzYXZlLC1jbXNsaW5rZXIsJyArIHRvdWNoSW5saW5lRWRpdC5nZXRQYXJhbSgncGx1Z2lucycpLAogICAgICAvLyBFeHRyYXMKICAgICAgdmlzdWFsOiB0cnVlLCAgCiAgICAgIGFjY2Vzc2liaWxpdHlfd2FybmluZ3M6IGZhbHNlLAogICAgICBmaXhfbGlzdF9lbGVtZW50czogdHJ1ZSwKICAgICAgdmVyaWZ5X2h0bWw6IHRydWUsCiAgICAgIHZlcmlmeV9jc3NfY2xhc3NlczogZmFsc2UsCiAgICAgIHJlbGF0aXZlX3VybHM6IHRydWUsCiAgICAgIHJlbW92ZV9zY3JpcHRfaG9zdDogdHJ1ZSwKICAgICAgLy8gU2F2ZQogICAgICBzYXZlX2VuYWJsZXdoZW5kaXJ0eTogZmFsc2UsCiAgICAgIHNhdmVfb25zYXZlY2FsbGJhY2s6ICd0b3VjaElubGluZUVkaXRTYXZlTUNFJywKICAgICAgLy8gQmFzaWMgYnV0dG9ucwogICAgICB0aGVtZV9hZHZhbmNlZF9idXR0b25zMV9hZGRfYmVmb3JlOiAnc2F2ZSxjbXNsaW5rZXInLAogICAgICB0aGVtZV9hZHZhbmNlZF90b29sYmFyX2xvY2F0aW9uOiAndG9wJywKICAgICAgdGhlbWVfYWR2YW5jZWRfdG9vbGJhcl9hbGlnbjogJ2xlZnQnLAogICAgICB0aGVtZV9hZHZhbmNlZF9zdGF0dXNiYXJfbG9jYXRpb246ICdib3R0b20nLAogICAgICAvLyBFeHRyYSBidXR0b25zCiAgICAgIHRoZW1lX2FkdmFuY2VkX2J1dHRvbnMxOiB0b3VjaElubGluZUVkaXQuZ2V0UGFyYW0oJ2J1dHRvbnMxJyksCiAgICAgIHRoZW1lX2FkdmFuY2VkX2J1dHRvbnMyOiB0b3VjaElubGluZUVkaXQuZ2V0UGFyYW0oJ2J1dHRvbnMyJyksCiAgICAgIHRoZW1lX2FkdmFuY2VkX2J1dHRvbnMzOiB0b3VjaElubGluZUVkaXQuZ2V0UGFyYW0oJ2J1dHRvbnMzJyksCiAgICAgIC8vIE9wdGlvbnMKICAgICAgdGhlbWVfYWR2YW5jZWRfcmVzaXppbmc6IHRvdWNoSW5saW5lRWRpdC5nZXRQYXJhbSgndGhlbWVfYWR2YW5jZWRfcmVzaXppbmcnKSwKICAgICAgLy8gTmV3bGluZXMKICAgICAgZm9yY2VfYnJfbmV3bGluZXM6IHRvdWNoSW5saW5lRWRpdC5nZXRQYXJhbSgnZm9yY2VfYnJfbmV3bGluZXMnKSwKICAgICAgZm9yY2VfcF9uZXdsaW5lczogdG91Y2hJbmxpbmVFZGl0LmdldFBhcmFtKCdmb3JjZV9wX25ld2xpbmVzJyksCiAgICAgIGZvcmNlZF9yb290X2Jsb2NrOiB0b3VjaElubGluZUVkaXQuZ2V0UGFyYW0oJ2ZvcmNlZF9yb290X2Jsb2NrJyksCiAgICAgIC8vIEVuY29kaW5nCiAgICAgIGVudGl0eV9lbmNvZGluZzogdG91Y2hJbmxpbmVFZGl0LmdldFBhcmFtKCdlbnRpdHlfZW5jb2RpbmcnKSwgCiAgICAgIGJ1dHRvbl90aWxlX21hcDogdHJ1ZQogICAgfSk7CiAgICBzZWxmLmVkaXRvciA9IHRpbnlNQ0UuZXhlY0NvbW1hbmQoJ21jZUFkZENvbnRyb2wnLCB0cnVlLCBzZWxmLnNlbGVjdG9yKTsKICB9CgogIC8qKgogICAqIFNhdmUgY29udGVudHMuCiAgICovCiAgdGhpcy5zYXZlID0gZnVuY3Rpb24oY29udGVudCkKICB7CiAgICAvL2NvbnNvbGUuZGVidWcoJ1NhdmUgJyArIHNlbGYuYmxvY2spOwogICAgdG91Y2hJbmxpbmVFZGl0LnNhdmUoc2VsZi5pZCxzZWxmLmJsb2NrLHNlbGYuc2VsZWN0b3IsY29udGVudCk7CiAgfQoKICAvKioKICAgKiBEZXN0cnVjdCBlZGl0b3IgaW5zdGFuY2UuCiAgICovCiAgdGhpcy5fX2Rlc3RydWN0ID0gZnVuY3Rpb24oKQogIHsKICAgIC8vY29uc29sZS5kZWJ1ZygnRGVzdHJ1Y3QgJyArIHNlbGYuYmxvY2spOwogICAgdGlueU1DRS5leGVjQ29tbWFuZCgnbWNlRm9jdXMnLCBmYWxzZSwgc2VsZi5zZWxlY3Rvcik7ICAKICAgIHRpbnlNQ0UuZXhlY0NvbW1hbmQoJ21jZVJlbW92ZUNvbnRyb2wnLCB0cnVlLCBzZWxmLnNlbGVjdG9yKTsKICB9Cgp9CgovLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHcuLi4KZnVuY3Rpb24gdG91Y2hJbmxpbmVFZGl0U2F2ZU1DRShlZGl0b3IpewogIHZhciBjID0gdG91Y2hJbmxpbmVFZGl0LmZpbmRJbnN0YW5jZShlZGl0b3IuaWQpOwogIGMuc2F2ZSh0aW55TUNFLmdldChjLnNlbGVjdG9yKS5nZXRDb250ZW50KCkpOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/templates/admineditor.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBpZD0idG91Y2hGb3JtIj4KeyRmb3Jtc3RhcnR9CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aW55X21jZV9qcXVlcnlfbG9hZF9sYWJlbH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JHRpbnlfbWNlX2pxdWVyeV9sb2FkX2lucHV0fTxici8+eyR0aW55X21jZV9qcXVlcnlfbG9hZF9oZWxwfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpbnlfbWNlX3RoZW1lX2xhYmVsfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGlueV9tY2VfdGhlbWVfaW5wdXR9PGJyLz57JHRpbnlfbWNlX3RoZW1lX2hlbHB9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskdGlueV9tY2Vfc2tpbl9sYWJlbH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JHRpbnlfbWNlX3NraW5faW5wdXR9PGJyLz57JHRpbnlfbWNlX3NraW5faGVscH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aW55X21jZV9za2luX3ZhcmlhbnRfbGFiZWx9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyR0aW55X21jZV9za2luX3ZhcmlhbnRfaW5wdXR9PGJyLz57JHRpbnlfbWNlX3NraW5fdmFyaWFudF9oZWxwfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpbnlfbWNlX3dpZHRoX2xhYmVsfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGlueV9tY2Vfd2lkdGhfaW5wdXR9PGJyLz57JHRpbnlfbWNlX3dpZHRoX2hlbHB9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskdGlueV9tY2VfaGVpZ2h0X2xhYmVsfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGlueV9tY2VfaGVpZ2h0X2lucHV0fTxici8+eyR0aW55X21jZV9oZWlnaHRfaGVscH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aW55X21jZV9wbHVnaW5zX2xhYmVsfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGlueV9tY2VfcGx1Z2luc19pbnB1dH08YnIvPnskdGlueV9tY2VfcGx1Z2luc19oZWxwfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpbnlfbWNlX2J1dHRvbnMxX2xhYmVsfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGlueV9tY2VfYnV0dG9uczFfaW5wdXR9PGJyLz57JHRpbnlfbWNlX2J1dHRvbnMxX2hlbHB9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskdGlueV9tY2VfYnV0dG9uczJfbGFiZWx9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyR0aW55X21jZV9idXR0b25zMl9pbnB1dH08YnIvPnskdGlueV9tY2VfYnV0dG9uczJfaGVscH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aW55X21jZV9idXR0b25zM19sYWJlbH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JHRpbnlfbWNlX2J1dHRvbnMzX2lucHV0fTxici8+eyR0aW55X21jZV9idXR0b25zM19oZWxwfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpbnlfbWNlX2ZvcmNlX3BfbmV3bGluZXNfbGFiZWx9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyR0aW55X21jZV9mb3JjZV9wX25ld2xpbmVzX2lucHV0fTxici8+eyR0aW55X21jZV9mb3JjZV9wX25ld2xpbmVzX2hlbHB9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskdGlueV9tY2VfZm9yY2VfYnJfbmV3bGluZXNfbGFiZWx9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyR0aW55X21jZV9mb3JjZV9icl9uZXdsaW5lc19pbnB1dH08YnIvPnskdGlueV9tY2VfZm9yY2VfYnJfbmV3bGluZXNfaGVscH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aW55X21jZV9lbnRpdHlfZW5jb2RpbmdfbGFiZWx9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyR0aW55X21jZV9lbnRpdHlfZW5jb2RpbmdfaW5wdXR9PGJyLz57JHRpbnlfbWNlX2VudGl0eV9lbmNvZGluZ19oZWxwfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpbnlfbWNlX3RoZW1lX2FkdmFuY2VkX3Jlc2l6aW5nX2xhYmVsfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGlueV9tY2VfdGhlbWVfYWR2YW5jZWRfcmVzaXppbmdfaW5wdXR9PGJyLz57JHRpbnlfbWNlX3RoZW1lX2FkdmFuY2VkX3Jlc2l6aW5nX2hlbHB9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc3VibWl0fXskY2FuY2VsfTwvcD4KICA8L2Rpdj4KeyRmb3JtZW5kfQo8L2Rpdj4=]]></data>
	</file>
	<file>
	  <filename>/plugins/tiny_mce/tiny_mce.plugin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogdGlueV9tY2UucGx1Z2luLnBocCAxNTQgMjAxMS0wMS0xNCAxMzowNjowNFogdG91Y2hkZXNpZ24gJAogKgogKiB0b3VjaElubGluZUVkaXQgTW9kdWxlIHRpbnlNQ0UgcGx1Z2luCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMCB0b3VjaERlc2lnbiwgPHd3dy50b3VjaGRlc2lnbi5kZT4KICoKICogQGNhdGVnb3J5IE1vZHVsZQogKiBAYXV0aG9yIENocmlzdG9waCBHcnViZXIgPHd3dy50b3VjaGRlc2lnbi5kZT4KICogQHZlcnNpb24gMS44LjAKICogQGNvcHlyaWdodCAwNC4wOC4yMDEwIHRvdWNoRGVzaWduCiAqIEBsaW5rIGh0dHA6Ly93d3cudG91Y2hkZXNpZ24uZGUvCiAqIEBsaW5rIGh0dHA6Ly93d3cuaG9tZXBhZ2UtY29tbXVuaXR5LmRlL2luZGV4LnBocD90b3BpYz0xNjgwLjAKICogQGxpbmsgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy90b3VjaElubGluZUVkaXQKICogQGxpY2Vuc2UgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwgMi4wKQogKgogKiAKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmNsYXNzIHRpbnlfbWNlIGV4dGVuZHMgdG91Y2hJbmxpbmVFZGl0UGx1Z2luIHsKCiAgLyoqCiAgICogUGx1Z2luIHNwZWNpZmljIHRlbXBsYXRlcy4KICAgKiBAdmFyIGFycmF5CiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8gIAogIHB1YmxpYyAkdGVtcGxhdGVzID0gYXJyYXkoCiAgICAnaGVhZGVyJyA9PiAKJzwhLS0geyR0aWUtPmdldE5hbWUoKX0gOjogeyR0aWUtPnBsdWdpbi0+ZGlzcGxheU5hbWV9IG1vZHVsZSAtLT4KPHNjcmlwdCBzcmM9InskdGllLT5wbHVnaW4tPnBhdGh9L2pzL3skdGllLT5wbHVnaW4tPm5hbWV9L3skdGllLT5wbHVnaW4tPm5hbWV9LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0Pgp7aWYgJHRpZS0+cGx1Z2luLT5nZXQoXCdqcXVlcnlfbG9hZFwnKX0KPHNjcmlwdCBzcmM9InskdGllLT5wbHVnaW4tPnBhdGh9L2pzL2pxdWVyeS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4Key9pZn0KPHNjcmlwdCBzcmM9InskdGllLT50b3VjaC0+cGF0aH0vanMvdG91Y2hJbmxpbmVFZGl0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ieyR0aWUtPnBsdWdpbi0+cGF0aH0vanMvdG91Y2hJbmxpbmVFZGl0SW5zdGFuY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CiAgeyR0aWVFeHRyYVNjcmlwdH0KICB2YXIgdG91Y2hJbmxpbmVFZGl0ID0gbmV3IHRvdWNoSW5saW5lRWRpdCgKICAgIHskdGllLT5nZXRDb250ZW50SWQoKX0sCiAgICAieyR0aWUtPnRvdWNoLT5nZXRSZXF1ZXN0VXJpKCl9IiwKICAgICJ7JHRpZS0+dG91Y2gtPmdldChcJ2ZlVXBkYXRlQWxlcnRNZXNzYWdlXCcpfSIsCiAgICB7JHRpZS0+dG91Y2gtPmdldChcJ2ZlRWRpdE9uRGJsQ2xpY2tcJyl9CiAgKTsKe2ZvcmVhY2ggZnJvbT0kdGllLT5wbHVnaW4tPmdldFNldHRpbmdzKCkga2V5PW5hbWUgaXRlbT12YWx1ZX0KICB0b3VjaElubGluZUVkaXQuc2V0UGFyYW0oInskbmFtZX0iLCJ7JHZhbHVlfSIpOwp7L2ZvcmVhY2h9Cjwvc2NyaXB0Pgo8IS0tIHskdGllLT5nZXROYW1lKCl9IDo6IHskdGllLT5wbHVnaW4tPmRpc3BsYXlOYW1lfSBtb2R1bGUgLS0+Jyk7CgogIC8qKgogICAqIENvbnN0cnVjdCBhIG5ldyBwbHVnaW4gYW5kIGNhbGwgcGFyZW50LgogICAqLwogIGZ1bmN0aW9uIF9fY29uc3RydWN0KCYkbW9kdWxlKQogIHsKICAgICR0aGlzLT5uYW1lID0gJ3RpbnlfbWNlJzsKICAgICR0aGlzLT5kaXNwbGF5TmFtZSA9ICd0aW55TUNFJzsKICAgICR0aGlzLT5zdXBwb3J0c011bHRpcGxlID0gdHJ1ZTsKICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1vZHVsZSk7CiAgICAkdGhpcy0+c2V0dGluZ3MgPSBhcnJheSgKICAgICAgJ2pxdWVyeV9sb2FkJyA9PiAxLAogICAgICAndGhlbWUnID0+ICdhZHZhbmNlZCcsCiAgICAgICdza2luJyA9PiAnbzJrNycsCiAgICAgICdza2luX3ZhcmlhbnQnID0+ICdzaWx2ZXInLAogICAgICAnYnV0dG9uczEnID0+ICdwcmludCxjdXQscGFzdGUscGFzdGV0ZXh0LHBhc3Rld29yZCxjb3B5LHNlcGFyYXRvcixqdXN0aWZ5bGVmdCxqdXN0aWZ5Y2VudGVyLGp1c3RpZnlyaWdodCxqdXN0aWZ5ZnVsbCxzZXBhcmF0b3Isc3R5bGVzZWxlY3QsZm9ybWF0c2VsZWN0LGZvbnRzZWxlY3QsZm9udHNpemVzZWxlY3QnLAogICAgICAnYnV0dG9uczInID0+ICdib2xkLGl0YWxpYyx1bmRlcmxpbmUsc3RyaWtldGhyb3VnaCxhZHZocixzZXBhcmF0b3IsYnVsbGlzdCxudW1saXN0LHNlcGFyYXRvcixvdXRkZW50LGluZGVudCxzZXBhcmF0b3IsdW5kbyxyZWRvLHNlcGFyYXRvcixsaW5rLHVubGluayxhbmNob3IsaW1hZ2UsbWVkaWEsY2hhcm1hcCxzZXBhcmF0b3IsZm9yZWNvbG9yLGJhY2tjb2xvcicsCiAgICAgICdidXR0b25zMycgPT4gJ2Ntc2xpbmtlcixzZWFyY2gscmVwbGFjZSxzZXBhcmF0b3Isc2VwYXJhdG9yLGZ1bGxzY3JlZW4scHJldmlldyxjb2RlLHN0eWxlcHJvcHMsdmlzdWFsY2hhcnMsY2xlYW51cCxzZXBhcmF0b3IsdGFibGVjb250cm9scyxzZXBhcmF0b3IsaGVscCcsCiAgICAgICdmb3JjZV9icl9uZXdsaW5lcycgPT4gMCwKICAgICAgJ2ZvcmNlX3BfbmV3bGluZXMnID0+IDEsCiAgICAgICdmb3JjZWRfcm9vdF9ibG9jaycgPT4gJ3AnLAogICAgICAnZW50aXR5X2VuY29kaW5nJyA9PiAncmF3JywKICAgICAgJ3RoZW1lX2FkdmFuY2VkX3Jlc2l6aW5nJyA9PiAxLAogICAgICAncGx1Z2lucycgPT4gJ3NlYXJjaHJlcGxhY2UsZnVsbHNjcmVlbixpbmxpbmVwb3B1cHMsbWVkaWEscHJldmlldyxwcmludCxzdHlsZSx0YWJsZSx2aXN1YWxjaGFycycsCiAgICAgICd3aWR0aCcgPT4gJ2F1dG8nLAogICAgICAnaGVpZ2h0JyA9PiAnYXV0bycKICAgICk7CiAgfQoKICAvKioKICAgKiBHZXQgYWRtaW4gY29uZmlnIHRhYiBjb2RlLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRBZG1pbkNvbmZpZygkaWQsJHJldHVybmlkKQogIHsKICAgICR5biA9IGFycmF5KAogICAgICAkdGhpcy0+bW9kdWxlLT5sYW5nKCJubyIpID0+IDAsCiAgICAgICR0aGlzLT5tb2R1bGUtPmxhbmcoInllcyIpID0+IDEKICAgICk7CiAgICAKICAgIC8vIEZvcm0gc3RhcnQKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCdmb3Jtc3RhcnQnLCR0aGlzLT5tb2R1bGUtPmNyZWF0ZUZvcm1TdGFydCgkaWQsInNhdmVlZGl0b3IiLCRyZXR1cm5pZCkpOwoKICAgIC8vIGpxdWVyeQogICAgJG5hbWUgPSAnanF1ZXJ5X2xvYWQnOwogICAgJG9wdGlvbnMgPSAkeW47CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2lucHV0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwkbmFtZSwKICAgICAgJG9wdGlvbnMsJHRoaXMtPmdldCgkbmFtZSwkdGhpcy0+c2V0dGluZ3NbJG5hbWVdKSwkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pKSk7CiAgICAgIAogICAgLy8gdGhlbWUKICAgICRuYW1lID0gJ3RoZW1lJzsKICAgICRvcHRpb25zID0gYXJyYXkoJ2FkdmFuY2VkJyA9PiAnYWR2YW5jZWQnLCdzaW1wbGUnID0+ICdzaW1wbGUnKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2xhYmVsJywkdGhpcy0+bW9kdWxlLT5sYW5nKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2xhYmVsJykpOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19oZWxwJykpOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaW5wdXQnLCR0aGlzLT5tb2R1bGUtPmNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCRuYW1lLAogICAgICAkb3B0aW9ucywkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pLCR0aGlzLT5nZXQoJG5hbWUsJHRoaXMtPnNldHRpbmdzWyRuYW1lXSkpKTsKICAgIAogICAgLy8gU2tpbgogICAgJG5hbWUgPSAnc2tpbic7CiAgICAkb3B0aW9ucyA9IGFycmF5KCdkZWZhdWx0JyA9PiAnZGVmYXVsdCcsJ28yazcnID0+ICdvMms3Jyk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2lucHV0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwkbmFtZSwKICAgICAgJG9wdGlvbnMsJHRoaXMtPmdldCgkbmFtZSwkdGhpcy0+c2V0dGluZ3NbJG5hbWVdKSwkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pKSk7CiAgICAKICAgIC8vIFNraW4gdmFyaWFudAogICAgJG5hbWUgPSAnc2tpbl92YXJpYW50JzsKICAgICRvcHRpb25zID0gYXJyYXkoJ2RlZmF1bHQnID0+ICcnLCAnc2lsdmVyJyA9PiAnc2lsdmVyJywnYmxhY2snID0+ICdibGFjaycpOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfbGFiZWwnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfbGFiZWwnKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19oZWxwJywkdGhpcy0+bW9kdWxlLT5sYW5nKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19pbnB1dCcsJHRoaXMtPm1vZHVsZS0+Y3JlYXRlSW5wdXREcm9wZG93bigkaWQsJG5hbWUsCiAgICAgICRvcHRpb25zLCR0aGlzLT5nZXQoJG5hbWUsJHRoaXMtPnNldHRpbmdzWyRuYW1lXSksJHRoaXMtPmdldCgkbmFtZSwkdGhpcy0+c2V0dGluZ3NbJG5hbWVdKSkpOwoKICAgIC8vIFdpZHRoCiAgICAkbmFtZSA9ICd3aWR0aCc7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2lucHV0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dFRleHQoJGlkLCRuYW1lLAogICAgICAkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pLDEwLDMpKTsKICAgIAogICAgLy8gSGVpZ2h0CiAgICAkbmFtZSA9ICdoZWlnaHQnOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfbGFiZWwnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfbGFiZWwnKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19oZWxwJywkdGhpcy0+bW9kdWxlLT5sYW5nKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19pbnB1dCcsJHRoaXMtPm1vZHVsZS0+Y3JlYXRlSW5wdXRUZXh0KCRpZCwkbmFtZSwKICAgICAgJHRoaXMtPmdldCgkbmFtZSwkdGhpcy0+c2V0dGluZ3NbJG5hbWVdKSwxMCwzKSk7CiAgICAgIAogICAgLy8gUGx1Z2lucwogICAgJG5hbWUgPSAncGx1Z2lucyc7CiAgICAkb3B0aW9ucyA9ICR0aGlzLT5nZXRQbHVnaW5zKCk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2lucHV0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dFNlbGVjdExpc3QoJGlkLCRuYW1lLidbXScsCiAgICAgICRvcHRpb25zLGV4cGxvZGUoJywnLCR0aGlzLT5nZXQoJG5hbWUsJHRoaXMtPnNldHRpbmdzWyRuYW1lXSkpLDEwLCdzdHlsZT0id2lkdGg6MjAwcHgiJykpOwogICAgICAKICAgIC8vIEJ1dHRvbnMxCiAgICAkbmFtZSA9ICdidXR0b25zMSc7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2lucHV0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dFRleHQoJGlkLCRuYW1lLAogICAgICAkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pLDgwLDI1NSkpOwogICAgCiAgICAvLyBCdXR0b25zMgogICAgJG5hbWUgPSAnYnV0dG9uczInOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfbGFiZWwnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfbGFiZWwnKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19oZWxwJywkdGhpcy0+bW9kdWxlLT5sYW5nKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19pbnB1dCcsJHRoaXMtPm1vZHVsZS0+Y3JlYXRlSW5wdXRUZXh0KCRpZCwkbmFtZSwKICAgICAgJHRoaXMtPmdldCgkbmFtZSwkdGhpcy0+c2V0dGluZ3NbJG5hbWVdKSw4MCwyNTUpKTsKICAgIAogICAgLy8gQnV0dG9uczMKICAgICRuYW1lID0gJ2J1dHRvbnMzJzsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2xhYmVsJywkdGhpcy0+bW9kdWxlLT5sYW5nKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2xhYmVsJykpOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19oZWxwJykpOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaW5wdXQnLCR0aGlzLT5tb2R1bGUtPmNyZWF0ZUlucHV0VGV4dCgkaWQsJG5hbWUsCiAgICAgICR0aGlzLT5nZXQoJG5hbWUsJHRoaXMtPnNldHRpbmdzWyRuYW1lXSksODAsMjU1KSk7CiAgICAKICAgIC8vIE5ld2xpbmVzIHAKICAgICRuYW1lID0gJ2ZvcmNlX3BfbmV3bGluZXMnOwogICAgJG9wdGlvbnMgPSAkeW47CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2lucHV0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwkbmFtZSwKICAgICAgJG9wdGlvbnMsJHRoaXMtPmdldCgkbmFtZSwkdGhpcy0+c2V0dGluZ3NbJG5hbWVdKSwkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pKSk7CiAgICAKICAgIC8vIE5ld2xpbmVzIGJyCiAgICAkbmFtZSA9ICdmb3JjZV9icl9uZXdsaW5lcyc7CiAgICAkb3B0aW9ucyA9ICR5bjsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2xhYmVsJywkdGhpcy0+bW9kdWxlLT5sYW5nKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2xhYmVsJykpOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19oZWxwJykpOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaW5wdXQnLCR0aGlzLT5tb2R1bGUtPmNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCRuYW1lLAogICAgICAkb3B0aW9ucywkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pLCR0aGlzLT5nZXQoJG5hbWUsJHRoaXMtPnNldHRpbmdzWyRuYW1lXSkpKTsKICAgICAgCiAgICAvLyBOZXdsaW5lcyBicgogICAgJG5hbWUgPSAnZW50aXR5X2VuY29kaW5nJzsKICAgICRvcHRpb25zID0gYXJyYXkoJ3JhdycgPT4gJ3JhdycsICduYW1lZCcgPT4gJ25hbWVkJywgJ251bWVyaWMnID0+ICdudW1lcmljJyk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19sYWJlbCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2hlbHAnLCR0aGlzLT5tb2R1bGUtPmxhbmcoJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcpKTsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2lucHV0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwkbmFtZSwKICAgICAgJG9wdGlvbnMsJHRoaXMtPmdldCgkbmFtZSwkdGhpcy0+c2V0dGluZ3NbJG5hbWVdKSwkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pKSk7CiAgICAKICAgIC8vIFJlc2l6aW5nCiAgICAkbmFtZSA9ICd0aGVtZV9hZHZhbmNlZF9yZXNpemluZyc7CiAgICAkb3B0aW9ucyA9ICR5bjsKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2xhYmVsJywkdGhpcy0+bW9kdWxlLT5sYW5nKCR0aGlzLT5uYW1lLidfJy4kbmFtZS4nX2xhYmVsJykpOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaGVscCcsJHRoaXMtPm1vZHVsZS0+bGFuZygkdGhpcy0+bmFtZS4nXycuJG5hbWUuJ19oZWxwJykpOwogICAgJHRoaXMtPm1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ18nLiRuYW1lLidfaW5wdXQnLCR0aGlzLT5tb2R1bGUtPmNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCRuYW1lLAogICAgICAkb3B0aW9ucywkdGhpcy0+Z2V0KCRuYW1lLCR0aGlzLT5zZXR0aW5nc1skbmFtZV0pLCR0aGlzLT5nZXQoJG5hbWUsJHRoaXMtPnNldHRpbmdzWyRuYW1lXSkpKTsKICAgIAogICAgLy8gU3VibWl0IC8gY2FuY2VsCiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dFN1Ym1pdCgkaWQsInN1Ym1pdCIsJHRoaXMtPm1vZHVsZS0+bGFuZygic2F2ZSIpKSk7CiAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywkdGhpcy0+bW9kdWxlLT5jcmVhdGVJbnB1dFN1Ym1pdCgkaWQsImNhbmNlbCIsJHRoaXMtPm1vZHVsZS0+bGFuZygiY2FuY2VsIikpKTsKICAgIAogICAgLy8gRm9ybSBlbmQKICAgICR0aGlzLT5tb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCdmb3JtZW5kJywkdGhpcy0+bW9kdWxlLT5jcmVhdGVGb3JtRW5kKCkpOwogICAgCiAgICByZXR1cm4gJHRoaXMtPmZldGNoKCJhZG1pbmVkaXRvci50cGwiKTsKICB9CgogIC8qKgogICAqIEdldCBwbHVnaW4gaGVhZGVyIGh0bWwuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlcigpCiAgewovKiAgICAgJGNUaW55ID0gJHRoaXMtPm1vZHVsZS0+dG91Y2gtPmdldENNU01vZHVsZUluc3RhbmNlKCdUaW55TUNFJyk7CiAgICBpZigkY1RpbnkpewogICAgICAkdGhpcy0+bW9kdWxlLT5zbWFydHktPmFzc2lnbigndGllRXh0cmFTY3JpcHQnLCRjVGlueS0+R2V0Q01TTGlua2VyKCkpOwogICAgfSAqLwogICAgCiAgICByZXR1cm4gJHRoaXMtPmZldGNoKCdoZWFkZXInLHRydWUpOwogIH0KICAKICAvKioKICAgKiBHZXQgYXZhaWxhYmxlIG1vZHVsZSBhcyBhcnJheS4KICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGx1Z2lucygpCiAgewogICAgJGNvbmZpZyA9ICR0aGlzLT5tb2R1bGUtPnRvdWNoLT5jbXNtcygnY29uZmlnJyk7CgogICAgJGF2YWlsYWJsZVBsdWdpbnMgPSBhcnJheV9kaWZmKHNjYW5kaXIoJGNvbmZpZ1sncm9vdF9wYXRoJ10uICcvJyAuICR0aGlzLT5wYXRoIAogICAgICAuICcvanMvdGlueV9tY2UvcGx1Z2lucycpLGFycmF5KCcuJywnLi4nLCcuc3ZuJywnLmh0YWNjZXNzJykpOyAKCiAgICAkcGx1Z2lucyA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCRhdmFpbGFibGVQbHVnaW5zIGFzICRwbHVnaW4pewogICAgICAkcGx1Z2luc1skcGx1Z2luXSA9ICRwbHVnaW47CiAgICB9CgogICAgcmV0dXJuIGFycmF5X2ZsaXAoJHBsdWdpbnMpOwogIH0KICAKfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/README</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[UkVBRE1FCj09PT09PQoKV2hhdCBpcyBUb3VjaElubGluZUVkaXQ/Ci0tLS0tLS0tLS0tLS0tLS0tCgpUb3VjaElubGluZUVkaXQgaXMgYSBmcm9udGVuZCBpbmxpbmUgZWRpdG9yIG1vZHVsZSBmb3IgdGhlIHBvcHVsYXIgQ29udGVudCBtYW5hZ2VtZW50IApzeXN0ZW0gQ01TbWFkZXNpbXBsZS4gSXQgYWxsb3dzIGFkbWlucyBhbmQgZnJvbnRlbmQgdXNlcnMgdG8gZWRpdCBjb250ZW50IGRpcmVjdGx5IAp3aXRob3V0IHZpc2l0IChvciBsb2dpbiBpbnRvKSB0aGUgYWRtaW4gYmFja2VuZC4KCkZlYXR1cmVzCi0tLS0tLS0tLS0tLS0tLS0KCiogRmxleGlibGUgaW5saW5lIGVkaXRvcnMgbmljRWRpdCwgZWxSVEUKKiBPcHRpb25hbCBGcm9udGVuZFVzZXJzIHN1cHBvcnQKKiBHcm91cCBhbmQgcGVybWlzc2lvbiBtYW5hZ2VtZW50CiogUXVpY2svZmFzdCBlZGl0IG9mIGNvbnRlbnRzCiogUGx1Z2luIHN5c3RlbQoqIGFuZCBtdWNoIG1vcmUuLi4KClRyYW5zbGF0aW9ucwotLS0tLS0tLS0tLS0KCkVuZ2xpc2g6IE1vZHVsZSBkZWZhdWx0Ckdlcm1hbjogQ01TbXMgY29tbXVuaXR5IFRDCkR1dGNoOiBDTVNtcyBjb21tdW5pdHkgVEMKUnVzc2lhbjogQ01TbXMgY29tbXVuaXR5IFRDCgpSZXF1aXJlbWVudHMKLS0tLS0tLS0tLS0tCgpBIG1vZGVybiB3ZWJicm93c2VyIGFuZCBtaW5pbXVtIENNU21zIDEuNi40IG9yIGJldHRlciAxLjkueC4KCkF1dGhvciAmIENvcHlyaWdodAotLS0tLS0tLS0tLS0tLS0tLS0KCkNvcHlyaWdodCBieTogdG91Y2hEZXNpZ24KQ2hpZWYgZGV2ZWxvcGVyOiBDaHJpc3RvcGggR3J1YmVyCgpMaWNlbnNlcwotLS0tLS0tLQoKVG91Y2hJbmxpbmVFZGl0IGlzIHJlbGVhc2VkIHVuZGVyIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIEdQTCAyLjAuCkNNU21hZGVzaW1wbGUgaXMgcmVsZWFzZWQgdW5kZXIgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgR1BMIDIuMC4KVG91Y2hJbmxpbmVFZGl0IHVzZXMgYW5kIGNvbWVzIHdpdGggalF1ZXJ5IGFuZCBqUXVlcnktVUkgd2l0Y2ggYXJlIGlzc3VlZCB1bmRlciBNSVQgYW5kIEdQTCBsaWNlbnNlcy4KVG91Y2hJbmxpbmVFZGl0IHVzZXMgZWxSVEUgaXMgaXNzdWVkIHVuZGVyIGEgMy1jbGF1c2VzIEJTRCBsaWNlbnNlLgpUb3VjaElubGluZUVkaXQgdXNlcyBOaWNFZGl0IGl0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUIGxpY2Vuc2UuClRvdWNoSW5saW5lRWRpdCB1c2VzIHRpbnlNQ0UgaXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBMR1BMLgoKRG9jdW1lbnRhdGlvbgotLS0tLS0tLS0tLS0tCgpQdXQgdGhlIGxvYWQgbW9kdWxlIHRhZyB7Y21zX21vZHVsZSBtb2R1bGU9InRvdWNoSW5saW5lRWRpdCJ9IGludG8gdGhlIGhlYWQgb2YgZWFjaCB0ZW1wbGF0ZSB5b3Ugd2FudCB0byAKdXNlIHRoZSBtb2R1bGUgZGlyZWN0bHkgYWZ0ZXIgdGhlIHtwcm9jZXNzX3BhZ2VkYXRhfSB0YWcuIENvbmZpZ3VyZSB0aGUgZ3JvdXAgcGVybWlzc2lvbnMgZm9yIGFkbWluIAp1c2VycyAoc2V0IHBlcm1pc3Npb246IFVzZSB0b3VjaElubGluZUVkaXQpIG9yIG9wdGlvbmFsIHNldHVwIHRoZSBmcm9udCBlbmQgdXNlciBzdXBwb3J0IChGRVUpIGFuZCB0YWtlIGEgbG9vayAKYXQgdGhlIGNtc21zIGZyb250IGVuZC4KClsxXTogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy90b3VjaGlubGluZWVkaXQKWzJdOiBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wClszXTogaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS9sb2VzdW5nZW4vY21zLW1hZGUtc2ltcGxlL21vZHVsZS5odG0=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/adminedittemplate.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBpZD0idG91Y2hGb3JtIj4KeyRmb3Jtc3RhcnR9CiAgeyR0ZW1wbGF0ZX0KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRlbXBsYXRlX25hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyR0ZW1wbGF0ZV9jb250ZW50fTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JHN1Ym1pdH17JHJlc2V0fTwvcD4KICA8L2Rpdj4KeyRmb3JtZW5kfQo8L2Rpdj4=]]></data>
	</file>
	<file>
	  <filename>/templates/adminpermissions.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBpZD0idG91Y2hGb3JtIj4KeyRmb3Jtc3RhcnR9CiAge2lmICRmZUZFVWFsbG93X2lucHV0ICYmICRmZUZFVWdyb3Vwc19pbnB1dH0KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGZlRkVVYWxsb3dfbGFiZWx9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRmZUZFVWFsbG93X2lucHV0fTxici8+eyRmZUZFVWFsbG93X2hlbHB9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskZmVGRVVncm91cHNfbGFiZWx9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRmZUZFVWdyb3Vwc19pbnB1dH08YnIvPnskZmVGRVVncm91cHNfaGVscH08L3A+CiAgPC9kaXY+CiAge2Vsc2V9CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRmZUZFVWRpc2FibGVkX2xhYmVsfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmVGRVVkaXNhYmxlZF9oZWxwfTwvcD4KICA8L2Rpdj4KICB7L2lmfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskZmVBZG1pbkFsbG93X2xhYmVsfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmVBZG1pbkFsbG93X2lucHV0fTxici8+eyRmZUFkbWluQWxsb3dfaGVscH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgogIDwvZGl2Pgp7JGZvcm1lbmR9CjwvZGl2Pg==]]></data>
	</file>
	<file>
	  <filename>/templates/adminsettings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBpZD0idG91Y2hGb3JtIj4KeyRmb3Jtc3RhcnR9CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRmZVBsdWdpbl9sYWJlbH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGZlUGx1Z2luX2lucHV0fTxici8+eyRmZVBsdWdpbl9oZWxwfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGZlRWRpdEJ1dHRvbl9sYWJlbH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGZlRWRpdEJ1dHRvbl9pbnB1dH08YnIvPnskZmVFZGl0QnV0dG9uX2hlbHB9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskZmVFZGl0QnV0dG9uVGV4dF9sYWJlbH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGZlRWRpdEJ1dHRvblRleHRfaW5wdXR9PGJyLz57JGZlRWRpdEJ1dHRvblRleHRfaGVscH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRmZUVkaXRPbkRibENsaWNrX2xhYmVsfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmVFZGl0T25EYmxDbGlja19pbnB1dH08YnIvPnskZmVFZGl0T25EYmxDbGlja19oZWxwfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGZlVXBkYXRlQWxlcnRNZXNzYWdlX2xhYmVsfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmVVcGRhdGVBbGVydE1lc3NhZ2VfaW5wdXR9PGJyLz57JGZlVXBkYXRlQWxlcnRNZXNzYWdlX2hlbHB9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc3VibWl0fXskY2FuY2VsfTwvcD4KICA8L2Rpdj4KeyRmb3JtZW5kfQo8L2Rpdj4K]]></data>
	</file>
	<file>
	  <filename>/templates/admintemplates.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwYWdldGFibGUiPgogIDx0aGVhZD4KICA8dHI+CiAgICA8dGggY2xhc3M9InBhZ2V3MjAiPnskdGFibGVfY29sX3RlbXBsYXRlfTwvdGg+CiAgICA8dGggY2xhc3M9InBhZ2V3MTAiPiZuYnNwOzwvdGg+CiAgPC90cj4KICA8L3RoZWFkPgogIHtmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09Y29sfQogIDx0Ym9keT4KICA8dHIgY2xhc3M9InskY29sLT5yb3djbGFzc30iPgogICAgPHRkPnskY29sLT5uYW1lfTwvdGQ+CiAgICA8dGQ+eyRjb2wtPmVkaXRsaW5rfTwvdGQ+CiAgPC90cj4KICA8L3Rib2R5PgogIHsvZm9yZWFjaH0KICA8L3RhYmxlPgo8L2Rpdj4=]]></data>
	</file>
	<file>
	  <filename>/templates/ressources.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2xpdGVyYWx9CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiN0b3VjaEZvcm0gewpmbG9hdDpsZWZ0Owp9CgojdG91Y2hSZXNzb3VyY2VzIHsKY29sb3I6IzM4NDY1NDsKZmxvYXQ6bGVmdDsKYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsKcGFkZGluZzoxNXB4OwpiYWNrZ3JvdW5kOnVybCguLi9tb2R1bGVzL3RvdWNoSW5saW5lRWRpdC9pbWcvdG91Y2hCYWNrZ3JvdW5kLnBuZykgI0YxRjVGQSBuby1yZXBlYXQ7CmJhY2tncm91bmQtcG9zaXRpb246cmlnaHQgYm90dG9tOwptYXJnaW46MjBweCAwcHggMHB4IDEwMHB4Owp9CgojdG91Y2hSZXNzb3VyY2VzIGgxIHsKY29sb3I6I2ZmZjsKcGFkZGluZzo1cHg7CmJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmZmZmZmOwp9CgojdG91Y2hSZXNzb3VyY2VzIHVsIHsKbWFyZ2luOjBweDsKcGFkZGluZzowcHggMHB4IDBweCAxNXB4Owp9CgojdG91Y2hSZXNzb3VyY2VzIHVsIGxpIHsKbGlzdC1zdHlsZS10eXBlOnNxdWFyZTsKfQo8L3N0eWxlPgp7L2xpdGVyYWx9Cgo8ZGl2IGlkPSJ0b3VjaFJlc3NvdXJjZXMiPgogIDxoMj5GZWVkYmFjayBpcyB3ZWxjb21lPC9oMj4KICA8dWw+CiAgICA8bGk+Q01TbXMgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hpbmxpbmVlZGl0Ij5wcm9qZWN0PC9hPiBwYWdlLjwvbGk+CiAgICA8bGk+U3VwcG9ydCB2aWEgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cuaG9tZXBhZ2UtY29tbXVuaXR5LmRlL2luZGV4LnBocD90b3BpYz0xNjgwLjAiPkhQQzwvYT48L2xpPgogICAgPGxpPkludGVybmF0aW9uYWwgRm9ydW1zIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmcvdmlld3RvcGljLnBocD9mPTcmdD00NzM5MCI+IChFbmdsaXNoKTwvYT48L2xpPgogICAgPGxpPlZpc2l0IHVzIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLyI+d3d3LnRvdWNoRGVzaWduLmRlPC9hPjwvbGk+CiAgPC91bD4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+]]></data>
	</file>
	<file>
	  <filename>/touchInlineEdit.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogdG91Y2hJbmxpbmVFZGl0Lm1vZHVsZS5waHAgMTU0IDIwMTEtMDEtMTQgMTM6MDY6MDRaIHRvdWNoZGVzaWduICQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuOC4wCiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICoKICoKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmRlZmluZSgnVElFX1BMVUdJTl9ESVInLCdwbHVnaW5zLycpOwpkZWZpbmUoJ1RJRV9QTFVHSU5fREVGQVVMVCcsJ3RpbnlfbWNlJyk7CgpnbG9iYWwgJGdDbXM7CnJlcXVpcmVfb25jZSBjbXNfam9pbl9wYXRoKCRnQ21zLT5jb25maWdbJ3Jvb3RfcGF0aCddLCdtb2R1bGVzJywKICAndG91Y2hJbmxpbmVFZGl0JywnbGliJywnY2xhc3MudG91Y2hNb2R1bGUucGhwJyk7CgpjbGFzcyB0b3VjaElubGluZUVkaXQgZXh0ZW5kcyBDTVNNb2R1bGUgewoKICAvKioKICAgKiBQbHVnaW4gaW5zdGFuY2Ugb25seSBmb3IgdGVtcGxhdGUgY2FsbHMgKHNtYXJ0eSkuCiAgICogQHZhciBvYmplY3QKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLwogIHB1YmxpYyAkcGx1Z2luOwogIAogIC8qKgogICAqIFNtYXJ0eSByZWZlcmVuY2UuCiAgICogQHZhciBvYmplY3QKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLwogIHB1YmxpYyAkc21hcnR5OwogIAogIC8qKgogICAqIFRvdWNoTW9kdWxlIG9iamVjdC4KICAgKiBAdmFyIG9iamVjdAogICAqIEBhY2Nlc3MgcHVibGljCiAgICovCiAgcHVibGljICR0b3VjaDsKICAKICAvKioKICAgKiBUZW1wbGF0ZXMgZm9yIHRoaXMgbW9kdWxlLgogICAqIEB2YXIgYXJyYXkKICAgKiBAYWNjZXNzIHB1YmxpYwogICAqLwogIHB1YmxpYyAkdGVtcGxhdGVzID0gYXJyYXkoCiAgICAnYnV0dG9uJyA9PiAnPGJ1dHRvbiBjbGFzcz0iUHskY29udGVudF9pZH0gQnskdGllQ3VycmVudEJsb2NrfSB0b3VjaElubGluZUVkaXRCdXR0b24iPnskdGllLT50b3VjaC0+Z2V0KFwnZmVFZGl0QnV0dG9uVGV4dFwnKX08L2J1dHRvbj4nCiAgKTsKICAKICAvKioKICAgKiBDb25zdGFudCBoYXMgaW5saW5lIGVkaXQgcmlnaHRzLgogICAqIEB2YXIgdHJ1ZSxmYWxzZSxudWxsCiAgICogQGFjY2VzcyBwdWJsaWMKICAgKi8KICBjb25zdCBFTkFCTEVEID0gbnVsbDsKCiAgLyoqCiAgICogQ29uc3RydWN0IGEgbmV3IG1vZHVsZS4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogIHsKICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoKTsKICAgIAogICAgJHRoaXMtPnRvdWNoID0gbmV3IHRvdWNoTW9kdWxlKCR0aGlzKTsKICAgICR0aGlzLT5zbWFydHkgPSAkdGhpcy0+dG91Y2gtPmNtc21zKCdzbWFydHknKTsKICAgICR0aGlzLT5zbWFydHktPmZvcmNlX2NvbXBpbGUgPSB0cnVlOwogICAgCiAgICAvLyBUT0RPOiBDaGVjayBpZiB0aGlzIHRoZSByaWdodCBwbGFjZT8KICAgICR0aGlzLT5pbml0KCk7CiAgfQoKICAvKioKICAgKiBJbml0IHRvdWNoSW5saW5lRWRpdCBhbmQgZG8gc21hcnR5IGFzc2lnbnMuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGluaXQoKQogIHsKICAgIGlmKCR0aGlzLT5pc0VuYWJsZWQoKSl7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGllJywmJHRoaXMpOwogICAgICAkdGhpcy0+c21hcnR5LT5yZWdpc3Rlcl9wcmVmaWx0ZXIoYXJyYXkoJHRoaXMsJ3NtYXJ0eVByZUNvbXBpbGUnKSk7CiAgICB9CiAgfQoKICAvKioKICAgKiBHZXQgbW9kdWxlIG5hbWUuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEdldE5hbWUoKQogIHsKICAgIHJldHVybiAndG91Y2hJbmxpbmVFZGl0JzsgCiAgfQoKICAvKioKICAgKiBHZXQgbW9kdWxlIGZyaWVuZGx5IG5hbWUuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpCiAgewogICAgcmV0dXJuICdUb3VjaElubGluZUVkaXQnOyAKICB9CiAgCiAgLyoqCiAgICogR2V0IG1vZHVsZSB2ZXJzaW9uLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRWZXJzaW9uKCkKICB7CiAgICByZXR1cm4gJzEuOC4wJzsKICB9CiAgCiAgLyoqCiAgICogR2V0IG1vZHVsZSBhdXRob3IuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvcigpCiAgewogICAgcmV0dXJuICdDaHJpc3RvcGggR3J1YmVyIDx0b3VjaERlc2lnbi5kZT4nOwogIH0KCiAgLyoqCiAgICogR2V0IG1vZHVsZSBhdXRob3IgZW1haWxhZGRyZXNzLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpCiAgewogICAgcmV0dXJuICdjLmdydWJlckB0b3VjaGRlc2lnbi5kZSc7CiAgfQogIAogIC8qKgogICAqIEdldCBtb2R1bGUgaGVscCBhbmQgYXBwcGVuZCBzdGF0aWMgUkVBRE1FLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRIZWxwKCkKICB7CiAgICAkY29uZmlnID0gJHRoaXMtPnRvdWNoLT5jbXNtcygnY29uZmlnJyk7CiAgICAKICAgIC8vIEdldCBoZWxwIHN0cmluZwogICAgJGh0bWwgPSAkdGhpcy0+TGFuZygnaGVscCcpOwogICAgCiAgICAvLyBBcHBlbmQgaW5jbHVkZWQgUkVBRE1FCiAgICAkaHRtbC49ICc8aDM+UkVBRE1FPC9oMz4nOwogICAgJGh0bWwuPSAnPHByZT4nOwogICAgJGh0bWwuPSBmaWxlX2dldF9jb250ZW50cygkY29uZmlnWydyb290X3BhdGgnXSAKICAgICAgLiAnL21vZHVsZXMvJyAuICR0aGlzLT5nZXROYW1lKCkgLiAnL1JFQURNRScpOwogICAgJGh0bWwuPSAnPC9wcmU+JzsKCiAgICByZXR1cm4gJGh0bWw7CiAgfQogIAogIC8qKgogICAqIEdldCBtb2R1bGUgZGVzY3JpcHRpb24uCiAgICovCiAgZnVuY3Rpb24gR2V0RGVzY3JpcHRpb24oKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnZGVzY3JpcHRpb24nKTsKICB9CiAgCiAgLyoqCiAgICogR2V0IG1vZHVsZSBhZG1pbiBkZXNjcmlwdGlvbi4KICAgKi8KICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2FkbWRlc2NyaXB0aW9uJyk7CiAgfQoKICAvKioKICAgKiBHZXQgbW9kdWxlIGNoYW5nZWxvZyBhbmQgYXBwZW5kIHN0YXRpYyBDSEFOR0VMT0cuCiAgICovCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkKICB7CiAgICAkY29uZmlnID0gJHRoaXMtPmdldENvbmZpZygpOwogICAgCiAgICAkaHRtbCA9ICc8cHJlPic7CiAgICAkaHRtbC49IGZpbGVfZ2V0X2NvbnRlbnRzKCRjb25maWdbJ3Jvb3RfcGF0aCddIAogICAgICAuICcvbW9kdWxlcy8nIC4gJHRoaXMtPmdldE5hbWUoKSAuICcvQ0hBTkdFTE9HJyk7CiAgICAkaHRtbC49ICc8L3ByZT4nOwogICAgCiAgICByZXR1cm4gJGh0bWw7CiAgfQoKICAvKioKICAgKiBJcyBwbHVnaW4gbW9kdWxlLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpCiAgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvKioKICAgKiBIYXMgYWRtaW4uCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEhhc0FkbWluKCkKICB7CiAgICByZXR1cm4gdHJ1ZTsgCiAgfQoKICAvKioKICAgKiBHZXQgYWRtaW4gc2VjdGlvbiBmb3IgbW9kdWxlLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKQogIHsKICAgIHJldHVybiAnZXh0ZW5zaW9ucyc7CiAgfQoKICAvKioKICAgKiBTZXQgbW9kdWxlIHBhcmFtYXRlcnMuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFNldFBhcmFtZXRlcnMoKQogIHsKICAgIC8qIE5vdGhpbmcgeWV0ICovCiAgfQoKICAvKioKICAgKiBHZXQgcG9zdCBpbnN0YWxsIG1lc3NhZ2UuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOwogIH0KCiAgLyoqCiAgICogR2V0IHBvc3QgdW5pbnN0YWxsIG1lc3NhZ2UuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTsKICB9CgogIC8qKgogICAqIEdldCBwcmUgaW5zdGFsbCBtZXNzYWdlLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3ByZXVuaW5zdGFsbCcpOwogIH0KCiAgLyoqCiAgICogR2V0IGNtc21zIG1pbmltdW0gdmVyc2lvbiBmb3IgdG91Y2hJbmxpbmVFZGl0LgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpCiAgewogICAgcmV0dXJuICIxLjYuNCI7CiAgfQoKICAvKioKICAgKiBHZXQgY21zbXMgbWluaW11bSB2ZXJzaW9uIGZvciB0b3VjaElubGluZUVkaXQuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIE1heGltdW1DTVNWZXJzaW9uKCkKICB7CiAgICByZXR1cm4gIjEuOS4yIjsKICB9CgogIC8qKgogICAqIEhhbmRsZSBldmVudHMuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEhhbmRsZXNFdmVudHMoKQogIHsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLyoqCiAgICogU21hcnR5IHByZSBjb21waWxlIGV2ZW50LCB0b3VjaCBpbiA6KSB0b3VjaElubGluZUVkaXQuCiAgICovCiAgZnVuY3Rpb24gc21hcnR5UHJlQ29tcGlsZSgkdGVtcGxhdGVTb3VyY2UsICYkc21hcnR5PW51bGwpCiAgewogICAgaWYoJHNtYXJ0eSA9PT0gbnVsbCl7CiAgICAgIHJldHVybiAkdGVtcGxhdGVTb3VyY2U7CiAgICB9CiAgICAKICAgICRyZXN1bHQgPSBleHBsb2RlKCc6JywgJHNtYXJ0eS0+X2N1cnJlbnRfZmlsZSk7CgogICAgaWYoJHJlc3VsdFswXSA9PSAnY29udGVudCcgJiYgKCR0aGlzLT5nZXRQbHVnaW4oKS0+c3VwcG9ydHNNdWx0aXBsZSAKICAgICAgfHwgJHJlc3VsdFsxXSA9PSAnY29udGVudF9lbicpKXsKCiAgICAgIGlmKCR0aGlzLT50b3VjaC0+aXNBamF4UmVxdWVzdCgpKXsKICAgICAgICByZXR1cm4gJHRlbXBsYXRlU291cmNlOwogICAgICB9CiAgICAgIAogICAgICAkc21hcnR5LT5hc3NpZ24oJ3RpZUN1cnJlbnRCbG9jaycsJHJlc3VsdFsxXSk7CiAgICAgIAogICAgICAvLyBCZWZvcmUgY29udGVudAogICAgICAkY29udGVudEJlZm9yZSA9ICd7aWYgJHRpZS0+aXNFbmFibGVkKCl9JzsKICAgICAgJGNvbnRlbnRCZWZvcmUuPSAnICB7aWYgJHRpZS0+dG91Y2gtPmdldChcJ2ZlRWRpdEJ1dHRvblwnKX0nOwogICAgICAkY29udGVudEJlZm9yZS49ICcgICAgeyR0aWUtPnRvdWNoLT5mZXRjaChcJ2J1dHRvblwnLHRydWUpfSc7CiAgICAgICRjb250ZW50QmVmb3JlLj0gJyAgey9pZn0nOwogICAgICAkY29udGVudEJlZm9yZS49ICcgIDxkaXYgaWQ9InRvdWNoSW5saW5lRWRpdElkLXskY29udGVudF9pZH0teyR0aWVDdXJyZW50QmxvY2t9IiBjbGFzcz0iUHskY29udGVudF9pZH0gQnskdGllQ3VycmVudEJsb2NrfSB0b3VjaElubGluZUVkaXQiPic7CiAgICAgICRjb250ZW50QmVmb3JlLj0gJ3svaWZ9JzsKCiAgICAgIC8vIEFmdGVyIGNvbnRlbnQKICAgICAgJGNvbnRlbnRBZnRlciA9ICd7aWYgJHRpZS0+aXNFbmFibGVkKCl9JzsKICAgICAgJGNvbnRlbnRBZnRlci49ICcgIDwvZGl2Pic7CiAgICAgICRjb250ZW50QWZ0ZXIuPSAney9pZn0nOwoKICAgICAgcmV0dXJuICRjb250ZW50QmVmb3JlIC4gJHRlbXBsYXRlU291cmNlIC4gJGNvbnRlbnRBZnRlcjsKCiAgICB9CgogICAgcmV0dXJuICR0ZW1wbGF0ZVNvdXJjZTsKICB9CgogIC8qKgogICAqIE1vZHVsZSBzcGVjaWZpYyBldmVudCBoYW5kbGluZy4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gRG9FdmVudCgkb3JpZ2luYXRvciwgJGV2ZW50bmFtZSwgJiRwYXJhbXMpCiAgewogICAgcGFyZW50OjpEb0V2ZW50KCRvcmlnaW5hdG9yLCAkZXZlbnRuYW1lLCAmJHBhcmFtcyk7CiAgfQoKICAvKioKICAgKiBDaGVjayBpZiB0aGUgdXNlciBpcyBncmFudGVkIHRvIHVzZSBUb3VjaElubGluZUVkaXQuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGlzRW5hYmxlZCgpCiAgewogICAgaWYoaXNzZXQoJHRoaXMtPkVOQUJMRUQpKXsKICAgICAgcmV0dXJuICR0aGlzLT5FTkFCTEVEOwogICAgfQoKICAgICR0aGlzLT5FTkFCTEVEID0gZmFsc2U7CiAgICAKICAgIC8vIFN1cHBvcnQgZm9yIGZyb250ZW5kIHVzZXJzCiAgICBpZigkdGhpcy0+dG91Y2gtPmdldCgnZmVGRVVhbGxvdycpKXsKICAgICAgJGZldSA9ICR0aGlzLT50b3VjaC0+Z2V0TW9kdWxlSW5zdGFuY2UoJ0Zyb250RW5kVXNlcnMnKTsKICAgICAgaWYoJGZldSAmJiAkZmV1LT5sb2dnZWRJbklkKCkpewogICAgICAgIGlmKCR0aGlzLT50b3VjaC0+Z2V0KCdmZUZFVWdyb3VwcycpKXsKICAgICAgICAgICRhbGxvd2VkR3JvdXBzID0gZXhwbG9kZSgnLCcsJHRoaXMtPnRvdWNoLT5nZXQoJ2ZlRkVVZ3JvdXBzJykpOwogICAgICAgICAgJG1lbWJlckdyb3VwcyA9ICRmZXUtPmdldE1lbWJlckdyb3Vwc0FycmF5KCRmZXUtPmxvZ2dlZEluSWQoKSk7CiAgICAgICAgICBmb3JlYWNoKCRtZW1iZXJHcm91cHMgYXMgJG1lbWJlckdyb3VwKXsKICAgICAgICAgICAgaWYoaW5fYXJyYXkoJG1lbWJlckdyb3VwWydncm91cGlkJ10sJGFsbG93ZWRHcm91cHMpKXsKICAgICAgICAgICAgICAkdGhpcy0+RU5BQkxFRCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9ZWxzZXsKICAgICAgICAgICR0aGlzLT5FTkFCTEVEID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBHcmFudCBhZG1pbiB1c2VycwogICAgaWYoJHRoaXMtPnRvdWNoLT5nZXQoJ2ZlQWRtaW5BbGxvdycpICYmIGNoZWNrX2xvZ2luKHRydWUpIAogICAgICAmJiAkdGhpcy0+Y2hlY2tQZXJtaXNzaW9uKCdVc2UgdG91Y2hJbmxpbmVFZGl0JykpewogICAgICAkdGhpcy0+RU5BQkxFRCA9IHRydWU7CiAgICB9CgogICAgcmV0dXJuICR0aGlzLT5FTkFCTEVEOwogIH0KCiAgLyoqCiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICogQ29udGVudCBvcGVyYXRpb25zIGZvciB0b3VjaElubGluZUVkaXQgQWpheCByZXF1ZXN0cwogICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAqLwoKICAvKioKICAgKiBHZXQgY3VycmVudCBjb250ZW50IElkLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZW50SWQoKQogIHsKICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnY21zbXMnKSAmJiBtZXRob2RfZXhpc3RzKGNtc21zKCksJ2dldF92YXJpYWJsZScpKXsKICAgICAgcmV0dXJuIGNtc21zKCktPmdldF92YXJpYWJsZSgnY29udGVudF9pZCcpOwogICAgfWVsc2V7CiAgICAgIGdsb2JhbCAkZ0NtczsKICAgICAgcmV0dXJuICRnQ21zLT52YXJpYWJsZXNbJ2NvbnRlbnRfaWQnXTsKICAgIH0KICB9CgogIC8qKgogICAqIEdldCBjb250ZW50IG9iamVjdCBmb3IgY3VycmVudCBjb250ZW50IGlkLgogICAqLwogIHByaXZhdGUgZnVuY3Rpb24gZ2V0Q29udGVudE9iaigkY29udGVudElkPW51bGwpCiAgewogICAgaWYoJGNvbnRlbnRJZCA9PT0gbnVsbCl7CiAgICAgICRjb250ZW50SWQgPSAkdGhpcy0+Z2V0Q29udGVudElkKCk7CiAgICB9CgogICAgJG1hbmFnZXIgPSAmJHRoaXMtPnRvdWNoLT5jbXNtcygpLT5HZXRIaWVyYXJjaHlNYW5hZ2VyKCk7CiAgICAkbm9kZSA9ICYkbWFuYWdlci0+c3VyZUdldE5vZGVCeUlkKCRjb250ZW50SWQpOwoKICAgIGlmKCFpc19vYmplY3QoJG5vZGUpKXsKICAgICAgcmV0dXJuICJJbnZhbGlkIENvbnRlbnRJZDogIiAuICRjb250ZW50SWQ7CiAgICB9CgogICAgcmV0dXJuICRub2RlLT5HZXRDb250ZW50KHRydWUsdHJ1ZSk7CiAgfQoKICAvKioKICAgKiBGZXRjaCBjb250ZW50IGZvciBjdXJyZW50IGNvbnRlbnQgb2JqZWN0LgogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb250ZW50KCRibG9jaz0iY29udGVudF9lbiIsJGZldGNoPWZhbHNlKQogIHsKICAgICRjb250ZW50T2JqID0gJiR0aGlzLT5nZXRDb250ZW50T2JqKCk7CiAgICAKICAgIGlmKGlzc2V0KCRfUE9TVFsnYmxvY2snXSkpewogICAgICAkYmxvY2sgPSAkX1BPU1RbJ2Jsb2NrJ107CiAgICB9CiAgICBpZihpc3NldCgkX1BPU1RbJ2ZldGNoJ10pICYmICFlbXB0eSgkX1BPU1RbJ2ZldGNoJ10pKXsKICAgICAgJGZldGNoID0gJF9QT1NUWydmZXRjaCddOwogICAgfQogICAgCiAgICAkY29udGVudCA9ICJFbXB0eS4uLiI7CiAgICBpZigkY29udGVudE9iai0+SGFzUHJvcGVydHkoJGJsb2NrKSl7CiAgICAgICRjb250ZW50ID0gJGNvbnRlbnRPYmotPkdldFByb3BlcnR5VmFsdWUoJGJsb2NrKTsKICAgICAgaWYoJGZldGNoKXsKICAgICAgICAvLyBUT0RPOiBjbGVhciBtb2RpZmllZCB0ZW1wbGF0ZSBjbGVhcl9jb21waWxlZF90cGwoJ2NvbnRlbnQ6IC4uLicpCiAgICAgICAgJHRoaXMtPnNtYXJ0eS0+Y2xlYXJfY29tcGlsZWRfdHBsKCk7CiAgICAgICAgLy8gRmV0Y2ggY29udGVudC4uLgogICAgICAgICRjb250ZW50ID0gJHRoaXMtPnNtYXJ0eS0+ZmV0Y2goJ2NvbnRlbnQ6JyAuICRibG9jaywgJycsICRjb250ZW50SWQpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuICRjb250ZW50OwogIH0KCiAgLyoqCiAgICogVXBkYXRlIGN1cnJlbnQgY29udGVudCBmcm9tIFBPU1QuCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIHVwZGF0ZUNvbnRlbnQoJGJsb2NrPSJjb250ZW50X2VuIikKICB7CiAgICAkY29udGVudE9iaiA9ICYkdGhpcy0+Z2V0Q29udGVudE9iaigpOwoKICAgICRibG9jayA9ICRfUE9TVFsnYmxvY2snXTsKICAgICRwYXJhbXNbJGJsb2NrXSA9ICRfUE9TVFsnY29udGVudCddOwoKICAgIC8vIEZpeDogQXR0ZW1wdCB0byBsb2FkIGFkbWluIHJlYWxtIGZyb20gbm9uIGFkbWluIGFjdGlvbiBub3RpY2UgaWYgYWxpYXMgYWxyZWFkeSB1c2VkCiAgICAvLyBSZWY6IGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvYnVnL3ZpZXcvNTgwNQogICAgQCRjb250ZW50T2JqLT5GaWxsUGFyYW1zKCRwYXJhbXMpOwoKICAgICRlcnJvcnMgPSAkY29udGVudE9iai0+VmFsaWRhdGVEYXRhKCk7CiAgICBpZigkZXJyb3JzICE9PSBmYWxzZSl7CiAgICAgIC8vIFRPRE86IHRocm93IGVycm9ycwogICAgICByZXR1cm4gIkludmFsaWQgY29udGVudCI7CiAgICB9CgogICAgLy8gRml4OiBBbGlhcyByZW5hbWUKICAgIC8vIFJlZjogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9idWcvdmlldy81ODA1CiAgICAkY29udGVudE9iai0+bUFsaWFzID0gJGNvbnRlbnRPYmotPm1PbGRBbGlhczsKCiAgICAkY29udGVudE9iai0+VXBkYXRlKCk7CgogICAgLy8gTG9nIHVwZGF0ZSBpbmZvCiAgICAkdGhpcy0+QXVkaXQoMCwgJHRoaXMtPkdldEZyaWVuZGx5TmFtZSgpLCAKICAgICAgJHRoaXMtPkxhbmcoJ3Bvc3Rjb250ZW50dXBkYXRlJywgCiAgICAgICR0aGlzLT5nZXRDb250ZW50SWQoKS4ieyIuJGJsb2NrLiJ9IikpOwoKICAgIHJldHVybiAkdGhpcy0+Z2V0Q29udGVudCgkYmxvY2ssdHJ1ZSk7CiAgfQogIAogIC8qKgogICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAqIEhlbHBlciBGdW5jdGlvbnMKICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgKi8KCiAgLyoqCiAgICogR2V0IGF2YWlsYWJsZSBtb2R1bGUgYXMgYXJyYXkuCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBsdWdpbnMoKQogIHsKICAgICRjb25maWcgPSAkdGhpcy0+dG91Y2gtPmNtc21zKCdjb25maWcnKTsKCiAgICAkYXZhaWxhYmxlUGx1Z2lucyA9IGFycmF5X2RpZmYoc2NhbmRpcigkdGhpcy0+Z2V0TW9kdWxlUGF0aCgpLicvJwogICAgICAuVElFX1BMVUdJTl9ESVIpLGFycmF5KCcuJywnLi4nLCcuc3ZuJywnLmh0YWNjZXNzJykpOyAKCiAgICAkcGx1Z2lucyA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCRhdmFpbGFibGVQbHVnaW5zIGFzICRwbHVnaW4pewogICAgICAkcGx1Z2luID0gJHRoaXMtPmdldFBsdWdpbigkcGx1Z2luKTsKICAgICAgJHBsdWdpbnNbJHBsdWdpbi0+bmFtZV0gPSAkcGx1Z2luLT5kaXNwbGF5TmFtZTsKICAgIH0KCiAgICByZXR1cm4gYXJyYXlfZmxpcCgkcGx1Z2lucyk7CiAgfQoKICAvKioKICAgKiBHZXQgcGx1Z2luIGluc3RhbmNlIGZvciBnaXZlbiBuYW1lLCBjdXJyZW50IG9yIGRlZmF1bHQuCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBsdWdpbigkbmFtZT1udWxsKQogIHsKICAgICRjb25maWcgPSAkdGhpcy0+dG91Y2gtPmNtc21zKCdjb25maWcnKTsKICAgIAogICAgaWYoISRuYW1lKXsKICAgICAgJG5hbWUgPSAkdGhpcy0+dG91Y2gtPmdldCgnZmVQbHVnaW4nKTsKICAgIH0KICAgIAogICAgaWYoIWlzX3N0cmluZygkbmFtZSkgfHwgIXN0cmxlbigkbmFtZSkpewogICAgICAkbmFtZSA9IFRJRV9QTFVHSU5fREVGQVVMVDsKICAgIH0KCiAgICBpZihmaWxlX2V4aXN0cygkdGhpcy0+Z2V0TW9kdWxlUGF0aCgpLicvJy5USUVfUExVR0lOX0RJUi4kbmFtZS4nLycuJG5hbWUuJy5wbHVnaW4ucGhwJykpewogICAgICByZXF1aXJlX29uY2UgJHRoaXMtPmdldE1vZHVsZVBhdGgoKS4nLycuVElFX1BMVUdJTl9ESVIuJG5hbWUuJy8nLiRuYW1lLicucGx1Z2luLnBocCc7CiAgICB9CiAgICAKICAgICR0aGlzLT5wbHVnaW4gPSBuZXcgJG5hbWUoJHRoaXMpOwogICAgCiAgICByZXR1cm4gJHRoaXMtPnBsdWdpbjsKICB9Cgp9Cgo/Pg==]]></data>
	</file>
</module>
